ZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9wb20ueG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYzViOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9wb20ueG1sCkBAIC0wLDAgKzEsMjQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnN0cnV0czItcGx1Z2luczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zdHJ1dHM8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5zdHJ1dHMyLWRvam8tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPlN0cnV0cyAyIERvam8gUGx1Z2luPC9uYW1lPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+cmVsZWFzZTwvbmFtZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRMaWNlbnNlTWF0Y2hlcnM+ZmFsc2U8L2FkZERlZmF1bHRMaWNlbnNlTWF0Y2hlcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGljZW5zZU1hdGNoZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc05hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NOYW1lPnJhdC5hbmFseXNpcy5saWNlbnNlLkFwYWNoZVNvZnR3YXJlTGljZW5zZTIwPC9jbGFzc05hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGFzc05hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWNlbnNlTWF0Y2hlcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+cG9tLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5zcmMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8dGxpYi52ZXJzaW9uPjIuMjwvdGxpYi52ZXJzaW9uPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9iYWdvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFwdC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE1PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8QT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaT0vc3RydXRzLWRvam8tdGFncyx0bGliVmVyc2lvbj0ke3RsaWIudmVyc2lvbn0sanNwVmVyc2lvbj0yLjAsc2hvcnROYW1lPXN4LAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU9IlN0cnV0cyBEb2pvIFRhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmlsZT0ke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL01FVEEtSU5GL3N0cnV0cy1kb2pvLXRhZ3MudGxkLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0cnV0cyBBSkFYIHRhZ3MgYmFzZWQgb24gRG9qby4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0VGVtcGxhdGVzRGlyPSR7YmFzZWRpcn0vLi4vLi4vY29yZS9zcmMvc2l0ZS9yZXNvdXJjZXMvdGFncy9hamF4CisgICAgICAgICAgICAgICAgICAgIDwvQT4KKyAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlVGFyZ2V0UGF0aD50YXJnZXQ8L3Jlc291cmNlVGFyZ2V0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPGZvcms+ZmFsc2U8L2Zvcms+CisgICAgICAgICAgICAgICAgICAgIDxmb3JjZT50cnVlPC9mb3JjZT4KKyAgICAgICAgICAgICAgICAgICAgPG5vY29tcGlsZT50cnVlPC9ub2NvbXBpbGU+CisgICAgICAgICAgICAgICAgICAgIDxzaG93V2FybmluZ3M+dHJ1ZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8ZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuc3RydXRzLmFubm90YXRpb25zLnRhZ2xpYi5hcHQuVExEQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgPC9mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmV4ZWN1dGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDwhLS0gSlNQIEFQSSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIFZlbG9jaXR5IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudmVsb2NpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD52ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gVGVzdCBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RydXRzMi1qdW5pdC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qbW9jazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptb2NrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2s8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmptb2NrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1vY2stY2dsaWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm1vY2tvYmplY3RzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja29iamVjdHMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+bW9ja29iamVjdHM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2Nrb2JqZWN0cy1qZGsxLjM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm1vY2tvYmplY3RzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja29iamVjdHMtYWx0LWpkazEuMzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+bW9ja29iamVjdHM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2Nrb2JqZWN0cy1hbHQtamRrMS4zLWoyZWUxLjM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm1vY2tvYmplY3RzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja29iamVjdHMtamRrMS4zLWoyZWUxLjM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworCisgICAgICAgIDwhLS0gTW9ja3MgZm9yIHVuaXQgdGVzdGluZyAoYnkgU3ByaW5nKSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXRlc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICA8IS0tIHN0cnV0cy1hbm5vdGF0aW9ucyBtdXN0IGJlIGluIGNvbXBpbGUgc2NvcGUgZm9yIG1hdmVuLWFwdC1wbHVnaW4gdG8KKyAgICAgICAgZnVuY3Rpb24gY29ycmVjdGx5LiBNYXJraW5nIGl0IG9wdGlvbmFsIHRvIGV4Y2x1ZGUgaXQgZnJvbSB0cmFuc2l0aXZlCisgICAgICAgIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0cnV0czwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0cnV0cy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHJlcG9ydGluZz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5zcmMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9yZXBvcnRpbmc+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0Fic3RyYWN0UmVtb3RlQmVhbi5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9BYnN0cmFjdFJlbW90ZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U1OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9BYnN0cmFjdFJlbW90ZUJlYW4uamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5DbG9zaW5nVUlCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZTsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBBYnN0cmFjdFJlbW90ZUNhbGxVSUJlYW4gaXMgc3VwZXJjbGFzcyBmb3IgYWxsIGNvbXBvbmVudHMgZGVhbGluZyB3aXRoIHJlbW90ZQorICogY2FsbHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbW90ZUJlYW4gZXh0ZW5kcyBDbG9zaW5nVUlCZWFuIGltcGxlbWVudHMgUmVtb3RlQmVhbiB7CisKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyB0cmFuc2llbnQgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsgICAgCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhyZWY7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvclRleHQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleGVjdXRlU2NyaXB0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRpbmdUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlzdGVuVG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1JZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1GaWx0ZXI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBub3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG93RXJyb3JUcmFuc3BvcnRUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5kaWNhdG9yOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0xvYWRpbmdUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgYmVmb3JlTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgYWZ0ZXJOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvck5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhpZ2hsaWdodENvbG9yOworICAgIHByb3RlY3RlZCBTdHJpbmcgaGlnaGxpZ2h0RHVyYXRpb247CisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXBhcmF0ZVNjcmlwdHM7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0cmFuc3BvcnQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZUNvbnRlbnQ7CisgICAgCisgICAgcHVibGljIEFic3RyYWN0UmVtb3RlQmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgaWYgKGhyZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaHJlZiIsIGZpbmRTdHJpbmcoaHJlZikpOworICAgICAgICBpZiAoZXJyb3JUZXh0ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImVycm9yVGV4dCIsIGZpbmRTdHJpbmcoZXJyb3JUZXh0KSk7CisgICAgICAgIGlmIChsb2FkaW5nVGV4dCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJsb2FkaW5nVGV4dCIsIGZpbmRTdHJpbmcobG9hZGluZ1RleHQpKTsKKyAgICAgICAgaWYgKGV4ZWN1dGVTY3JpcHRzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImV4ZWN1dGVTY3JpcHRzIiwgZmluZFZhbHVlKGV4ZWN1dGVTY3JpcHRzLCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmIChsaXN0ZW5Ub3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibGlzdGVuVG9waWNzIiwgZmluZFZhbHVlKGxpc3RlblRvcGljcywgU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGlmIChub3RpZnlUb3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibm90aWZ5VG9waWNzIiwgZmluZFZhbHVlKG5vdGlmeVRvcGljcywgU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImhhbmRsZXIiLCBmaW5kU3RyaW5nKGhhbmRsZXIpKTsKKyAgICAgICAgaWYgKGZvcm1JZCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJmb3JtSWQiLCBmaW5kU3RyaW5nKGZvcm1JZCkpOworICAgICAgICBpZiAoZm9ybUZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJmb3JtRmlsdGVyIiwgZmluZFN0cmluZyhmb3JtRmlsdGVyKSk7CisgICAgICAgIGlmIChpbmRpY2F0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaW5kaWNhdG9yIiwgZmluZFN0cmluZyhpbmRpY2F0b3IpKTsKKyAgICAgICAgaWYgKHNob3dFcnJvclRyYW5zcG9ydFRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic2hvd0Vycm9yVHJhbnNwb3J0VGV4dCIsIGZpbmRWYWx1ZShzaG93RXJyb3JUcmFuc3BvcnRUZXh0LCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic2hvd0Vycm9yVHJhbnNwb3J0VGV4dCIsIHRydWUpOworICAgICAgICBpZiAoc2hvd0xvYWRpbmdUZXh0ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInNob3dMb2FkaW5nVGV4dCIsIGZpbmRTdHJpbmcoc2hvd0xvYWRpbmdUZXh0KSk7CisgICAgICAgIGlmIChiZWZvcmVOb3RpZnlUb3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiYmVmb3JlTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyhiZWZvcmVOb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgaWYgKGFmdGVyTm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImFmdGVyTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyhhZnRlck5vdGlmeVRvcGljcykpOworICAgICAgICBpZiAoZXJyb3JOb3RpZnlUb3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZXJyb3JOb3RpZnlUb3BpY3MiLCBmaW5kU3RyaW5nKGVycm9yTm90aWZ5VG9waWNzKSk7CisgICAgICAgIGlmIChoaWdobGlnaHRDb2xvciAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJoaWdobGlnaHRDb2xvciIsIGZpbmRTdHJpbmcoaGlnaGxpZ2h0Q29sb3IpKTsKKyAgICAgICAgaWYgKGhpZ2hsaWdodER1cmF0aW9uICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImhpZ2hsaWdodER1cmF0aW9uIiwgZmluZFN0cmluZyhoaWdobGlnaHREdXJhdGlvbikpOworICAgICAgICBpZiAoc2VwYXJhdGVTY3JpcHRzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInNlcGFyYXRlU2NyaXB0cyIsIGZpbmRWYWx1ZShzZXBhcmF0ZVNjcmlwdHMsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0cmFuc3BvcnQiLCBmaW5kU3RyaW5nKHRyYW5zcG9ydCkpOworICAgICAgICBpZiAocGFyc2VDb250ZW50ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInBhcnNlQ29udGVudCIsIGZpbmRWYWx1ZShwYXJzZUNvbnRlbnQsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJwYXJzZUNvbnRlbnQiLCB0cnVlKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSBhIHJhbmRvbSBJRCBpZiBub3QgZXhwbGljaXRseSBzZXQgYW5kIG5vdCBwYXJzaW5nIHRoZSBjb250ZW50CisgICAgICAgIEJvb2xlYW4gcGFyc2VDb250ZW50ID0gKEJvb2xlYW4pc3RhY2suZ2V0Q29udGV4dCgpLmdldChIZWFkLlBBUlNFX0NPTlRFTlQpOworICAgICAgICBib29sZWFuIGdlbmVyYXRlSWQgPSAocGFyc2VDb250ZW50ICE9IG51bGwgPyAhcGFyc2VDb250ZW50IDogdHJ1ZSk7CisgICAgICAgIAorICAgICAgICBhZGRQYXJhbWV0ZXIoInB1c2hJZCIsIGdlbmVyYXRlSWQpOworICAgICAgICBpZiAoKHRoaXMuaWQgPT0gbnVsbCB8fCB0aGlzLmlkLmxlbmd0aCgpID09IDApICYmIGdlbmVyYXRlSWQpIHsKKyAgICAgICAgICAgIC8vIHJlc29sdmVzIE1hdGguYWJzKEludGVnZXIuTUlOX1ZBTFVFKSBpc3N1ZSByZXBvcnRlZCBieSBGaW5kQnVncyAKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9maW5kYnVncy5zb3VyY2Vmb3JnZS5uZXQvYnVnRGVzY3JpcHRpb25zLmh0bWwjUlZfQUJTT0xVVEVfVkFMVUVfT0ZfUkFORE9NX0lOVAorICAgICAgICAgICAgaW50IG5leHRJbnQgPSBSQU5ET00ubmV4dEludCgpOworICAgICAgICAgICAgbmV4dEludCA9IG5leHRJbnQgPT0gSW50ZWdlci5NSU5fVkFMVUUgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IE1hdGguYWJzKG5leHRJbnQpOyAgCisgICAgICAgICAgICB0aGlzLmlkID0gIndpZGdldF8iICsgU3RyaW5nLnZhbHVlT2YobmV4dEludCk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImlkIiwgdGhpcy5pZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoU3RyaW5nIHRoZW1lKSB7CisgICAgICAgIHN1cGVyLnNldFRoZW1lKHRoZW1lKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuICJhamF4IjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUb3BpYyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgcmVtb3RlIGNhbGwiKQorICAgIHB1YmxpYyB2b2lkIHNldExpc3RlblRvcGljcyhTdHJpbmcgbGlzdGVuVG9waWNzKSB7CisgICAgICAgIHRoaXMubGlzdGVuVG9waWNzID0gbGlzdGVuVG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRoZSBVUkwgdG8gY2FsbCB0byBvYnRhaW4gdGhlIGNvbnRlbnQuIE5vdGU6IElmIHVzZWQgd2l0aCBhamF4IGNvbnRleHQsIHRoZSB2YWx1ZSBtdXN0IGJlIHNldCBhcyBhbiB1cmwgdGFnIHZhbHVlLiIpCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgeworICAgICAgICB0aGlzLmhyZWYgPSBocmVmOworICAgIH0KKworCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIHRleHQgdG8gZGlzcGxheSB0byB0aGUgdXNlciBpZiB0aGUgaXMgYW4gZXJyb3IgZmV0Y2hpbmcgdGhlIGNvbnRlbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yVGV4dChTdHJpbmcgZXJyb3JUZXh0KSB7CisgICAgICAgIHRoaXMuZXJyb3JUZXh0ID0gZXJyb3JUZXh0OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkphdmFzY3JpcHQgY29kZSBpbiB0aGUgZmV0Y2hlZCBjb250ZW50IHdpbGwgYmUgZXhlY3V0ZWQiLCB0eXBlPSJCb29sZWFuIiwgZGVmYXVsdFZhbHVlPSJmYWxzZSIpCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0ZVNjcmlwdHMoU3RyaW5nIGV4ZWN1dGVTY3JpcHRzKSB7CisgICAgICAgIHRoaXMuZXhlY3V0ZVNjcmlwdHMgPSBleGVjdXRlU2NyaXB0czsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUZXh0IHRvIGJlIHNob3duIHdoaWxlIGNvbnRlbnQgaXMgYmVpbmcgZmV0Y2hlZCIsIGRlZmF1bHRWYWx1ZT0iTG9hZGluZy4uLiIpCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1RleHQoU3RyaW5nIGxvYWRpbmdUZXh0KSB7CisgICAgICAgIHRoaXMubG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDsKKyAgICB9CisKKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkphdmFzY3JpcHQgZnVuY3Rpb24gbmFtZSB0aGF0IHdpbGwgbWFrZSB0aGUgcmVxdWVzdCIpCisgICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihTdHJpbmcgaGFuZGxlcikgeworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRnVuY3Rpb24gbmFtZSB1c2VkIHRvIGZpbHRlciB0aGUgZmllbGRzIG9mIHRoZSBmb3JtLiIpCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybUZpbHRlcihTdHJpbmcgZm9ybUZpbHRlcikgeworICAgICAgICB0aGlzLmZvcm1GaWx0ZXIgPSBmb3JtRmlsdGVyOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkZvcm0gaWQgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgcGFzc2VkIGFzIHBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyB2b2lkIHNldEZvcm1JZChTdHJpbmcgZm9ybUlkKSB7CisgICAgICAgIHRoaXMuZm9ybUlkID0gZm9ybUlkOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSByZXF1ZXN0LCBhbmQgb24gZXJyb3JzIikKKyAgICBwdWJsaWMgdm9pZCBzZXROb3RpZnlUb3BpY3MoU3RyaW5nIG5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLm5vdGlmeVRvcGljcyA9IG5vdGlmeVRvcGljczsKKyAgICB9CisKKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlNldCB3aGV0aGVyIGVycm9ycyB3aWxsIGJlIHNob3duIG9yIG5vdCIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9InRydWUiKQorICAgIHB1YmxpYyB2b2lkIHNldFNob3dFcnJvclRyYW5zcG9ydFRleHQoU3RyaW5nIHNob3dFcnJvcikgeworICAgICAgICB0aGlzLnNob3dFcnJvclRyYW5zcG9ydFRleHQgPSBzaG93RXJyb3I7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSWQgb2YgZWxlbWVudCB0aGF0IHdpbGwgYmUgc2hvd24gd2hpbGUgbWFraW5nIHJlcXVlc3QiKQorICAgIHB1YmxpYyB2b2lkIHNldEluZGljYXRvcihTdHJpbmcgaW5kaWNhdG9yKSB7CisgICAgICAgIHRoaXMuaW5kaWNhdG9yID0gaW5kaWNhdG9yOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlNob3cgbG9hZGluZyB0ZXh0IG9uIHRhcmdldHMiLCB0eXBlPSJCb29sZWFuIiwgZGVmYXVsdFZhbHVlPSJmYWxzZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0xvYWRpbmdUZXh0KFN0cmluZyBzaG93TG9hZGluZ1RleHQpIHsKKyAgICAgICAgdGhpcy5zaG93TG9hZGluZ1RleHQgPSBzaG93TG9hZGluZ1RleHQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBjbGFzcyB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc0NsYXNzKFN0cmluZyBjc3NDbGFzcykgeworICAgICAgICBzdXBlci5zZXRDc3NDbGFzcyhjc3NDbGFzcyk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBzdHlsZSB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc1N0eWxlKFN0cmluZyBjc3NTdHlsZSkgeworICAgICAgICBzdXBlci5zZXRDc3NTdHlsZShjc3NTdHlsZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGlkIHRvIHVzZSBmb3IgdGhlIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBzdXBlci5zZXRJZChpZCk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIG5hbWUgdG8gc2V0IGZvciBlbGVtZW50IikKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyLnNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGFmdGVyIHRoZSByZXF1ZXN0KGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzKSIpCisgICAgcHVibGljIHZvaWQgc2V0QWZ0ZXJOb3RpZnlUb3BpY3MoU3RyaW5nIGFmdGVyTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3MgPSBhZnRlck5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbW1pdGVkIGxpc3Qgb2YgdG9waWNzIHRoYXQgd2lsbCBwdWJsaXNoZWQgYmVmb3JlIHRoZSByZXF1ZXN0IikKKyAgICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVOb3RpZnlUb3BpY3MoU3RyaW5nIGJlZm9yZU5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmJlZm9yZU5vdGlmeVRvcGljcyA9IGJlZm9yZU5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbW1pdGVkIGxpc3Qgb2YgdG9waWNzIHRoYXQgd2lsbCBwdWJsaXNoZWQgYWZ0ZXIgdGhlIHJlcXVlc3QoaWYgdGhlIHJlcXVlc3QgZmFpbHMpIikKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck5vdGlmeVRvcGljcyhTdHJpbmcgZXJyb3JOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5lcnJvck5vdGlmeVRvcGljcyA9IGVycm9yTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiQ29sb3IgdXNlZCB0byBwZXJmb3JtIGEgaGlnaGxpZ2h0IGVmZmVjdCBvbiB0aGUgZWxlbWVudHMgc3BlY2lmaWVkIGluIHRoZSAndGFyZ2V0cycgYXR0cmlidXRlIiwgCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICJub25lIikKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWdobGlnaHRDb2xvcihTdHJpbmcgaGlnaGxpZ2h0Q29sb3IpIHsKKyAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvciA9IGhpZ2hsaWdodENvbG9yOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiRHVyYXRpb24gb2YgaGlnaGxpZ2h0IGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuIE9ubHkgdmFsaWQgaWYgJ2hpZ2hsaWdodENvbG9yJyBhdHRyaWJ1dGUgaXMgc2V0IiwgCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICIyMDAwIiwgdHlwZT0iSW50ZWdlciIpCisgICAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0RHVyYXRpb24oU3RyaW5nIGhpZ2hsaWdodER1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuaGlnaGxpZ2h0RHVyYXRpb24gPSBoaWdobGlnaHREdXJhdGlvbjsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iUnVuIHNjcmlwdHMgaW4gYSBzZXBhcmF0ZSBzY29wZSwgdW5pcXVlIGZvciBlYWNoIHRhZyIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdGVTY3JpcHRzKFN0cmluZyBzZXBhcmF0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5zZXBhcmF0ZVNjcmlwdHMgPSBzZXBhcmF0ZVNjcmlwdHM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVHJhbnNwb3J0IHVzZWQgYnkgRG9qbyB0byBtYWtlIHRoZSByZXF1ZXN0IiwgZGVmYXVsdFZhbHVlPSJYTUxIVFRQVHJhbnNwb3J0IikKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnQoU3RyaW5nIHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJQYXJzZSByZXR1cm5lZCBIVE1MIGZvciBEb2pvIHdpZGdldHMiLCBkZWZhdWx0VmFsdWU9InRydWUiLCB0eXBlPSJCb29sZWFuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRlbnQoU3RyaW5nIHBhcnNlQ29udGVudCkgeworICAgICAgICB0aGlzLnBhcnNlQ29udGVudCA9IHBhcnNlQ29udGVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0Fic3RyYWN0VmFsaWRhdGVCZWFuLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0Fic3RyYWN0VmFsaWRhdGVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmOTcwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvQWJzdHJhY3RWYWxpZGF0ZUJlYW4uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRhZ3MgdGhhdCBwZXJmb3JtIEFKQVggdmFsaWRhdGlvbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0ZUJlYW4gZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZUJlYW4geworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhamF4QWZ0ZXJWYWxpZGF0aW9uOworICAgIAorICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRlQmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgaWYgKHZhbGlkYXRlICE9IG51bGwpIAorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ2YWxpZGF0ZSIsIGZpbmRWYWx1ZSh2YWxpZGF0ZSwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZiAoYWpheEFmdGVyVmFsaWRhdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJhamF4QWZ0ZXJWYWxpZGF0aW9uIiwgZmluZFZhbHVlKGFqYXhBZnRlclZhbGlkYXRpb24sIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgCisgICAgICAgIEZvcm0gZm9ybSA9IChGb3JtKSBmaW5kQW5jZXN0b3IoRm9ybS5jbGFzcyk7CisgICAgICAgIGlmIChmb3JtICE9IG51bGwpIAorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJwYXJlbnRUaGVtZSIsIGZvcm0uZ2V0VGhlbWUoKSk7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiUGVyZm9ybSBBamF4IHZhbGlkYXRpb24uICdhamF4VmFsaWRhdGlvbicgaW50ZXJjZXB0b3IgbXVzdCBiZSBhcHBsaWVkIHRvIGFjdGlvbiIsIHR5cGU9IkJvb2xlYW4iLCAKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShTdHJpbmcgdmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uID0gIk1ha2UgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QgaWYgdmFsaWRhdGlvbiBzdWNjZWVkcy4gT25seSB2YWxpZCBpZiAndmFsaWRhdGUnIGlzICd0cnVlJyIsIHR5cGU9IkJvb2xlYW4iLCAKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRBamF4QWZ0ZXJWYWxpZGF0aW9uKFN0cmluZyBhamF4QWZ0ZXJWYWxpZGF0aW9uKSB7CisgICAgICAgIHRoaXMuYWpheEFmdGVyVmFsaWRhdGlvbiA9IGFqYXhBZnRlclZhbGlkYXRpb247CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvQW5jaG9yLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0FuY2hvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0FuY2hvci5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2U7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICogPHA+CisgKiBBIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCAmbHQ7YS8mZ3Q7IGVsZW1lbnQsIHRoYXQgd2hlbiBjbGlja2VkIG1ha2VzIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0KFhNTEh0dHBSZXF1ZXN0KS4gVGhlIHVybAorICogYXR0cmlidXRlIG11c3QgYmUgYnVpbGQgdXNpbmcgdGhlICZsdDtzOnVybC8mZ3Q7IHRhZy4gCisgKiA8L3A+CisgKiA8IS0tIEVORCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICogPHA+RXhhbXBsZXM8L3A+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAmbHQ7ZGl2IGlkPSJkaXYxIiZndDtEaXYgMSZsdDsvZGl2Jmd0OworICogJmx0O3M6dXJsIGlkPSJhamF4VGVzdCIgdmFsdWU9Ii9BamF4VGVzdC5hY3Rpb24iLyZndDsKKyAqIAorICogJmx0O3N4OmEgaWQ9ImxpbmsxIiBocmVmPSIle2FqYXhUZXN0fSIgdGFyZ2V0PSJkaXYxIiZndDsKKyAqICAgICAgVXBkYXRlIENvbnRlbnQKKyAqICZsdDsvc3g6YSZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUyIC0tPgorICogJmx0O3M6Zm9ybSBpZD0iZm9ybSIgYWN0aW9uPSJBamF4VGVzdCImZ3Q7CisgKiAgICAgICZsdDtpbnB1dCB0eXBlPSJ0ZXh0Ym94IiBuYW1lPSJkYXRhIiZndDsKKyAqICAgICAgJmx0O3N4OmEmZ3Q7U3VibWl0IGZvcm0mbHQ7L3N4OmEmZ3Q7ICAgICAgICAgICAKKyAqICZsdDsvczpmb3JtJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTMgLS0+CisgKiAmbHQ7czpmb3JtIGlkPSJmb3JtIiBhY3Rpb249IkFqYXhUZXN0IiZndDsKKyAqICAgICAgJmx0O2lucHV0IHR5cGU9InRleHRib3giIG5hbWU9ImRhdGEiJmd0OyAgIAorICogJmx0Oy9zOmZvcm0mZ3Q7CisgKiAKKyAqICZsdDtzeDphIGZvcm1JZD0iZm9ybSImZ3Q7U3VibWl0IGZvcm0mbHQ7L3N4OmEmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNCAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYmVmb3JlIiwgZnVuY3Rpb24oZXZlbnQsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBiZWZvcmUgcmVxdWVzdCcpOworICogICAgIC8vZXZlbnQ6IHNldCBldmVudC5jYW5jZWwgPSB0cnVlLCB0byBjYW5jZWwgcmVxdWVzdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OyAgICAgICAgIAorICogCisgKiAmbHQ7c3g6YSBiZWZvcmVOb3RpZnlUb3BpY3M9Ii9iZWZvcmUiJmd0O1B1Ymxpc2ggdG9waWNzJmx0Oy9zeDphJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTQgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTUgLS0+CisgKiAmbHQ7c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCImZ3Q7CisgKiBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiL2FmdGVyIiwgZnVuY3Rpb24oZGF0YSwgcmVxdWVzdCwgd2lkZ2V0KXsKKyAqICAgICBhbGVydCgnaW5zaWRlIGEgdG9waWMgZXZlbnQuIGFmdGVyIHJlcXVlc3QnKTsKKyAqICAgICAvL2RhdGEgOiB0ZXh0IHJldHVybmVkIGZyb20gcmVxdWVzdCh0aGUgaHRtbCkKKyAqICAgICAvL3JlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OyAgICAgICAgCisgKiAKKyAqICZsdDtzeDphIGFmdGVyTm90aWZ5VG9waWNzPSIvYWZ0ZXIiIGhpZ2hsaWdodENvbG9yPSJyZWQiIGhyZWY9IiV7I2FqYXhUZXN0fSImZ3Q7UHVibGlzaCB0b3BpY3MmbHQ7L3N4OmEmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNSAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNiAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvZXJyb3IiLCBmdW5jdGlvbihlcnJvciwgcmVxdWVzdCwgd2lkZ2V0KXsKKyAqICAgICBhbGVydCgnaW5zaWRlIGEgdG9waWMgZXZlbnQuIG9uIGVycm9yJyk7CisgKiAgICAgLy9lcnJvciA6IGVycm9yIG9iamVjdCAoZXJyb3IubWVzc2FnZSBoYXMgdGhlIGVycm9yIG1lc3NhZ2UpCisgKiAgICAgLy9yZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCBvYmplY3QKKyAqICAgICAvL3dpZGdldDogd2lkZ2V0IHRoYXQgcHVibGlzaGVkIHRoZSB0b3BpYworICogfSk7CisgKiAmbHQ7L3NjcmlwdCZndDsgICAgICAgICAKKyAqIAorICogJmx0O2ltZyBpZD0iaW5kMSIgc3JjPSIke3BhZ2VDb250ZXh0LnJlcXVlc3QuY29udGV4dFBhdGh9L2ltYWdlcy9pbmRpY2F0b3IuZ2lmIiBzdHlsZT0iZGlzcGxheTpub25lIi8mZ3Q7CisgKiAmbHQ7c3g6YSBlcnJvck5vdGlmeVRvcGljcz0iL2Vycm9yIiBpbmRpY2F0b3I9ImluZDEiIGhyZWY9IiV7I2FqYXhUZXN0fSImZ3Q7UHVibGlzaCB0b3BpY3MmbHQ7L3N4OmEmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNiAtLT4KKyAqLworQFN0cnV0c1RhZyhuYW1lPSJhIiwgdGxkVGFnQ2xhc3M9Im9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aS5BbmNob3JUYWciLCBkZXNjcmlwdGlvbj0iUmVuZGVycyBhbiBIVE1MIGFuY2hvciBlbGVtZW50IHRoYXQgd2hlbiBjbGlja2VkIGNhbGxzIGEgVVJMIHZpYSByZW1vdGUgWE1MSHR0cFJlcXVlc3QgYW5kIHVwZGF0ZXMgIiArCisgICAgICAgICAgICAgICAgIml0cyB0YXJnZXRzIGNvbnRlbnQiKQorcHVibGljIGNsYXNzIEFuY2hvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGVCZWFuIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1RFTVBMQVRFID0gImEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gImEtY2xvc2UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9OQU1FID0gQW5jaG9yLmNsYXNzLmdldE5hbWUoKTsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0czsKKworICAgIHB1YmxpYyBBbmNob3IoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPcGVuVGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiBPUEVOX1RFTVBMQVRFOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gVEVNUExBVEU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZhbHVhdGVFeHRyYVBhcmFtcygpIHsKKyAgICAgICAgc3VwZXIuZXZhbHVhdGVFeHRyYVBhcmFtcygpOworCisgICAgICAgIGlmICh0YXJnZXRzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRhcmdldHMiLCBmaW5kU3RyaW5nKHRhcmdldHMpKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgQFN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZQorICAgIHB1YmxpYyB2b2lkIHNldFRoZW1lKFN0cmluZyB0aGVtZSkgeworICAgICAgICBzdXBlci5zZXRUaGVtZSh0aGVtZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaWRzIG9mIHRoZSBlbGVtZW50cyB3aG9zZSBjb250ZW50IHdpbGwgYmUgdXBkYXRlZCIpCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0cyhTdHJpbmcgdGFyZ2V0cykgeworICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvQXV0b2NvbXBsZXRlci5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9BdXRvY29tcGxldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2YzFmNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvQXV0b2NvbXBsZXRlci5qYXZhCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbWJvQm94OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZ0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIDxwPlRoZSBhdXRvY29tcGxldGUgdGFnIGlzIGEgY29tYm9ib3ggdGhhdCBjYW4gYXV0b2NvbXBsZXRlIHRleHQgZW50ZXJlZCBvbiB0aGUgaW5wdXQgYm94LiBJZiBhbiBhY3Rpb24KKyAqIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGF1dG9jb21wbGV0ZXIsIHRoZSBvdXRwdXQgb2YgdGhlIGFjdGlvbiBtdXN0IGJlIGEgd2VsbCBmb3JtZWQgSlNPTiBzdHJpbmcuIDwvcD4KKyAqIDxwPlRoZSBhdXRvY29tcGxldGVyIGZvbGxvd3MgdGhpcyBydWxlIHRvIGZpbmQgaXRzIGRhdGFzb3VyY2U6PHA+CisgKiA8cD4xLiBJZiB0aGUgcmVzcG9uc2UgaXMgYW4gYXJyYXksIGFzc3VtZSB0aGF0IGl0IGNvbnRhaW5zIDItZGltZW5zaW9uIGFycmF5IGVsZW1lbnRzLCBsaWtlOgorICogPHByZT4KKyAqIFsKKyAqICAgICAgWyJBbGFiYW1hIiwgIkFMIl0sCisgKiAgICAgIFsiQWxhc2thIiwgIkFLIl0KKyAqIF0KKyAqIDwvcHJlPgorICogPHA+Mi4gSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgaW4gdGhlICJkYXRhRmllbGROYW1lIiBhdHRyaWJ1dGUsIGFuZCB0aGUgcmVzcG9uc2UgaGFzIGEgZmllbGQgd2l0aCB0aGF0CisgKiBuYW1lLCBhc3N1bWUgdGhhdCdzIHRoZSBkYXRhc291cmNlLCB3aGljaCBjYW4gYmUgYW4gYXJyYXkgb2YgMi1kaW1lbnNpb24gYXJyYXkgZWxlbWVudHMsIG9yIGEgbWFwLCAKKyAqIGxpa2UgKGFzc3VtaW5nIGRhdGFGaWVsZE5hbWU9InN0YXRlIik6PC9wPgorICogPHByZT4KKyAqIHsKKyAqICAgICAgInN0YXRlIiA6IFsKKyAqICAgICAgICAgICBbIkFsYWJhbWEiLCJBTCJdLAorICogICAgICAgICAgIFsiQWxhc2thIiwiQUsiXQorICogICAgICBdCisgKiB9ICAgICAKKyAqIG9yCisgKiB7CisgKiAgICAgICJzdGF0ZSIgOiB7CisgKiAgICAgICAgICAgICJBbGFiYW1hIiA6ICJBTCIsCisgKiAgICAgICAgICAgICJBbGFza2EiIDogIkFLIgorICogICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqIDwvcHJlPgorICogPHA+My4gSWYgdGhlcmUgaXMgYSBmaWVsZCB0aGF0IHN0YXJ0cyB3aXRoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgb24gdGhlICJuYW1lIiBhdHRyaWJ1dGUsIGFzc3VtZSAKKyAqIHRoYXQncyB0aGUgZGF0YXNvdXJjZSwgbGlrZSAoYXNzdW1pbmcgbmFtZT0ic3RhdGUiKTo8L3A+CisgKiA8cHJlPgorICogeworICogICAgICAic3RhdGVzIiA6IFsKKyAqICAgICAgICAgICBbIkFsYWJhbWEiLCJBTCJdLAorICogICAgICAgICAgIFsiQWxhc2thIiwiQUsiXQorICogICAgICBdCisgKiB9CisgKiA8L3ByZT4KKyAqIDxwPjQuIFVzZSBmaXJzdCBhcnJheSB0aGF0IGlzIGZvdW5kLCBsaWtlOjxwPgorICogPHByZT4KKyAqIHsKKyAqICAgICAgImFueXRoaW5nIiA6IFsKKyAqICAgICAgICAgICAgWyJBbGFiYW1hIiwgIkFMIl0sCisgKiAgICAgICAgICAgIFsiQWxhc2thIiwgIkFLIl0KKyAqICAgICBdICAgICAgIAorICogfQorICogPHA+NS4gSWYgdGhlIHJlc3BvbnNlIGlzIGEgbWFwLCB1c2UgaXQgKHJlY29tbWVuZGVkIGFzIGl0IGlzIHRoZSBlYXNpZXN0IG9uZSB0byBnZW5lcmF0ZSk6CisgKiA8cHJlPgorICogeworICogICAgICAiQWxhYmFtYSIgOiAiQUwiLAorICogICAgICAiQWxhc2thIiA6ICJBSyIKKyAqIH0KKyAqIDwvcHJlPgorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIDxwPkV4YW1wbGVzPC9wPgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMSAtLT4KKyAqICZsdDtzeDphdXRvY29tcGxldGVyIG5hbWU9ImF1dG9jb21wbGV0ZXIxIiBocmVmPSIle2pzb25MaXN0fSIvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAmbHQ7czphdXRvY29tcGxldGVyIG5hbWU9InRlc3QiICBsaXN0PSJ7J2FwcGxlJywnYmFuYW5hJywnZ3JhcGUnLCdwZWFyJ30iIGF1dG9Db21wbGV0ZT0iZmFsc2UiLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUyIC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUzIC0tPgorICogJmx0O3N4OmF1dG9jb21wbGV0ZXIgbmFtZT0ibXZjIiBocmVmPSIle2pzb25MaXN0fSIgbG9hZE9uVGV4dENoYW5nZT0idHJ1ZSIgbG9hZE1pbmltdW1Db3VudD0iMyIvJmd0OworICogCisgKiBUaGUgdGV4dCBlbnRlcmVkIG9uIHRoZSBhdXRvY29tcGxldGVyIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgdXJsIHNwZWNpZmllZCBpbiAiaHJlZiIsIGxpa2UgKHRleHQgaXMgInN0cnV0cyIpOgorICogIAorICogaHR0cDovL2hvc3QvZXhhbXBsZS9teWFjdGlvbi5kbz9tdmM9c3RydXRzCisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNCAtLT4KKyAqICZsdDtmb3JtIGlkPSJzZWxlY3RGb3JtIiZndDsKKyAqICAgICAgJmx0O3N4OmF1dG9jb21wbGV0ZXIgIG5hbWU9InNlbGVjdCIgbGlzdD0ieydmcnVpdHMnLCdjb2xvcnMnfSIgIHZhbHVlTm90aWZ5VG9waWNzPSIvY2hhbmdlZCIgLyZndDsKKyAqICZsdDsvZm9ybSZndDsgIAorICogJmx0O3N4OmF1dG9jb21wbGV0ZXIgIGhyZWY9IiV7anNvbkxpc3R9IiBmb3JtSWQ9InNlbGVjdEZvcm0iIGxpc3RlblRvcGljcz0iL2NoYW5nZWQiLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGU0IC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU1IC0tPgorICogJmx0O3N4OmF1dG9jb21wbGV0ZXIgIGhyZWY9IiV7anNvbkxpc3R9IiBpZD0iYXV0byIvJmd0OworICogJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJmd0OworICogICBmdW5jdGlvbiBnZXRWYWx1ZXMoKSB7CisgKiAgICAgIHZhciBhdXRvQ29tcGxldGVyID0gZG9qby53aWRnZXQuYnlJZCgiYXV0byIpOworICogICAgICAKKyAqICAgICAgLy9rZXkgKGluIHRoZSBzdGF0ZXMgZXhhbXBsZSBhYm92ZSwgIkFMIikKKyAqICAgICAgdmFyIGtleSA9IGF1dG9Db21wbGV0ZXIuZ2V0U2VsZWN0ZWRLZXkoKTsKKyAqICAgICAgYWxlcnQoa2V5KTsKKyAqICAgICAgCisgKiAgICAgIC8vdmFsdWUgKGluIHRoZSBzdGF0ZXMgZXhhbXBsZSBhYm92ZSwgIkFsYWJhbWEiKQorICogICAgICB2YXIgdmFsdWUgPSBhdXRvQ29tcGxldGVyLmdldFNlbGVjdGVkVmFsdWUoKTsKKyAqICAgICAgYWxlcnQodmFsdWUpOworICogICAgICAKKyAqICAgICAgLy90ZXh0IGN1cnJlbnRseSBvbiB0aGUgdGV4dGJveCAoYW55dGhpbmcgdGhlIHVzZXIgdHlwZWQpCisgKiAgICAgIHZhciB0ZXh0ID0gYXV0b0NvbXBsZXRlci5nZXRUZXh0KCk7CisgKiAgICAgIGFsZXJ0KHRleHQpOworICogICB9CisgKiAKKyAqICAgZnVuY3Rpb24gc2V0VmFsdWVzKCkgeworICogICAgICB2YXIgYXV0b0NvbXBsZXRlciA9IGRvam8ud2lkZ2V0LmJ5SWQoImF1dG8iKTsKKyAqICAgICAgCisgKiAgICAgIC8va2V5IChrZXkgd2lsbCBiZSBzZXQgdG8gIkFMIiBhbmQgdmFsdWUgdG8gIkFsYWJhbWEiKQorICogICAgICBhdXRvQ29tcGxldGVyLnNldFNlbGVjdGVkS2V5KCJBTCIpOworICogICAgICAKKyAqICAgICAgLy92YWx1ZSAoa2V5IHdpbGwgYmUgc2V0IHRvICJBTCIgYW5kIHZhbHVlIHRvICJBbGFiYW1hIikKKyAqICAgICAgYXV0b0NvbXBsZXRlci5zZXRBbGxWYWx1ZXMoIkFMIiwgIkFsYWJhbWEiKTsKKyAqICAgfQorICogJmx0Oy9zY3JpcHQmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNSAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNiAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYmVmb3JlIiwgZnVuY3Rpb24oZXZlbnQsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBiZWZvcmUgcmVxdWVzdCcpOworICogICAgIC8vZXZlbnQ6IHNldCBldmVudC5jYW5jZWwgPSB0cnVlLCB0byBjYW5jZWwgcmVxdWVzdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OyAgICAgICAgIAorICogCisgKiAmbHQ7c3g6YXV0b2NvbXBsZXRlciBiZWZvcmVOb3RpZnlUb3BpY3M9Ii9iZWZvcmUiIGhyZWY9IiV7I2FqYXhUZXN0fSAvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTYgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTcgLS0+CisgKiAmbHQ7c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCImZ3Q7CisgKiBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiL2FmdGVyIiwgZnVuY3Rpb24oZGF0YSwgcmVxdWVzdCwgd2lkZ2V0KXsKKyAqICAgICBhbGVydCgnaW5zaWRlIGEgdG9waWMgZXZlbnQuIGFmdGVyIHJlcXVlc3QnKTsKKyAqICAgICAvL2RhdGEgOiBKYXZhU2NyaXB0IG9iamVjdCBmcm9tIHBhcnNpbmcgcmVzcG9uc2UKKyAqICAgICAvL3JlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OyAgICAgICAgCisgKiAKKyAqICZsdDtzeDphdXRvY29tcGxldGVyIGFmdGVyTm90aWZ5VG9waWNzPSIvYWZ0ZXIiIGhyZWY9IiV7I2FqYXhUZXN0fSIgLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGU3IC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU4LS0+CisgKiAmbHQ7c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCImZ3Q7CisgKiBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiL2Vycm9yIiwgZnVuY3Rpb24oZXJyb3IsIHJlcXVlc3QsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBvbiBlcnJvcicpOworICogICAgIC8vZXJyb3IgOiBlcnJvciBvYmplY3QgKGVycm9yLm1lc3NhZ2UgaGFzIHRoZSBlcnJvciBtZXNzYWdlKQorICogICAgIC8vcmVxdWVzdDogWE1MSHR0cFJlcXVlc3Qgb2JqZWN0CisgKiAgICAgLy93aWRnZXQ6IHdpZGdldCB0aGF0IHB1Ymxpc2hlZCB0aGUgdG9waWMKKyAqIH0pOworICogJmx0Oy9zY3JpcHQmZ3Q7CisgKiAKKyAqICZsdDtzeDphdXRvY29tcGxldGVyIGVycm9yTm90aWZ5VG9waWNzPSIvZXJyb3IiIGhyZWY9IiV7I2FqYXhUZXN0fSIgLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGU4IC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU5IC0tPgorICogJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJmd0OworICogZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoIi92YWx1ZSIsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIHRleHQsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBhZnRlciB2YWx1ZSBjaGFuZ2VkJyk7CisgKiAgICAgLy92YWx1ZSA6IHNlbGVjdGVkIHZhbHVlIChsaWtlICJGbG9yaWRhIiBpbiBleGFtcGxlIGFib3ZlKQorICogICAgIC8va2V5OiBzZWxlY3RlZCBrZXkgKGxpa2UgIkZMIiBpbiBleGFtcGxlIGFib3ZlKQorICogICAgIC8vdGV4dDogdGV4dCB0eXBlZCBpbnRvIHRleHRib3gKKyAqICAgICAvL3dpZGdldDogd2lkZ2V0IHRoYXQgcHVibGlzaGVkIHRoZSB0b3BpYworICogfSk7CisgKiAmbHQ7L3NjcmlwdCZndDsgICAKKyAqIAorICogJmx0O3N4OmF1dG9jb21wbGV0ZXIgdmFsdWVOb3RpZnlUb3BpY3M9Ii92YWx1ZSIgaHJlZj0iJXsjYWpheFRlc3R9IiAvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTkgLS0+CisgKi8KK0BTdHJ1dHNUYWcobmFtZT0iYXV0b2NvbXBsZXRlciIsIHRsZFRhZ0NsYXNzPSJvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWkuQXV0b2NvbXBsZXRlclRhZyIsIGRlc2NyaXB0aW9uPSJSZW5kZXJzIGEgY29tYm9ib3ggd2l0aCBhdXRvY29tcGxldGUgYW5kIEFKQVggY2FwYWJpbGl0aWVzIikKK3B1YmxpYyBjbGFzcyBBdXRvY29tcGxldGVyIGV4dGVuZHMgQ29tYm9Cb3ggeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gImF1dG9jb21wbGV0ZXIiOworICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBDT01QT05FTlRfTkFNRSA9IEF1dG9jb21wbGV0ZXIuY2xhc3MuZ2V0TmFtZSgpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHRyYW5zaWVudCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JjZVZhbGlkT3B0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VhcmNoVHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF1dG9Db21wbGV0ZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlbGF5OworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlzYWJsZWQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIHByb3RlY3RlZCBTdHJpbmcgZHJvcGRvd25XaWR0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyb3Bkb3duSGVpZ2h0OworICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybUlkOworICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybUZpbHRlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RlblRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZGljYXRvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRPblRleHRDaGFuZ2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkTWluaW11bUNvdW50OworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0Rvd25BcnJvdzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGljb25QYXRoOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5TmFtZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFGaWVsZE5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhZnRlck5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWVOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZXN1bHRzTGltaXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0cmFuc3BvcnQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVsb2FkOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5VmFsdWU7CisgICAgICAgIAorICAgIHB1YmxpYyBBdXRvY29tcGxldGVyKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gVEVNUExBVEU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gQ09NUE9ORU5UX05BTUU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgaWYgKGZvcmNlVmFsaWRPcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZm9yY2VWYWxpZE9wdGlvbiIsIGZpbmRWYWx1ZShmb3JjZVZhbGlkT3B0aW9uLAorICAgICAgICAgICAgICAgICAgICBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmIChzZWFyY2hUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gIGZpbmRTdHJpbmcoc2VhcmNoVHlwZSk7CisgICAgICAgICAgICBpZih0eXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzZWFyY2hUeXBlIiwgdHlwZS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXV0b0NvbXBsZXRlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImF1dG9Db21wbGV0ZSIsIGZpbmRWYWx1ZShhdXRvQ29tcGxldGUsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgaWYgKGRlbGF5ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImRlbGF5IiwgZmluZFZhbHVlKGRlbGF5LCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGlmIChkaXNhYmxlZCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJkaXNhYmxlZCIsIGZpbmRWYWx1ZShkaXNhYmxlZCwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZiAoaHJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImhyZWYiLCBmaW5kU3RyaW5nKGhyZWYpKTsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibW9kZSIsICJyZW1vdGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHJvcGRvd25IZWlnaHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZHJvcGRvd25IZWlnaHQiLCBmaW5kVmFsdWUoZHJvcGRvd25IZWlnaHQsIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgaWYgKGRyb3Bkb3duV2lkdGggIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZHJvcGRvd25XaWR0aCIsIGZpbmRWYWx1ZShkcm9wZG93bldpZHRoLCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGlmIChmb3JtRmlsdGVyICE9IG51bGwpCisgICAgICAgICAgYWRkUGFyYW1ldGVyKCJmb3JtRmlsdGVyIiwgZmluZFN0cmluZyhmb3JtRmlsdGVyKSk7CisgICAgICAgIGlmIChmb3JtSWQgIT0gbnVsbCkKKyAgICAgICAgICBhZGRQYXJhbWV0ZXIoImZvcm1JZCIsIGZpbmRTdHJpbmcoZm9ybUlkKSk7CisgICAgICAgIGlmIChsaXN0ZW5Ub3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICBhZGRQYXJhbWV0ZXIoImxpc3RlblRvcGljcyIsIGZpbmRTdHJpbmcobGlzdGVuVG9waWNzKSk7CisgICAgICAgIGlmIChub3RpZnlUb3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcobm90aWZ5VG9waWNzKSk7CisgICAgICAgIGlmIChpbmRpY2F0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaW5kaWNhdG9yIiwgZmluZFN0cmluZyhpbmRpY2F0b3IpKTsKKyAgICAgICAgaWYgKGxvYWRPblRleHRDaGFuZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibG9hZE9uVGV4dENoYW5nZSIsIGZpbmRWYWx1ZShsb2FkT25UZXh0Q2hhbmdlLCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmIChsb2FkTWluaW11bUNvdW50ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImxvYWRNaW5pbXVtQ291bnQiLCBmaW5kVmFsdWUobG9hZE1pbmltdW1Db3VudCwgSW50ZWdlci5jbGFzcykpOworICAgICAgICBpZiAoc2hvd0Rvd25BcnJvdyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzaG93RG93bkFycm93IiwgZmluZFZhbHVlKHNob3dEb3duQXJyb3csIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzaG93RG93bkFycm93IiwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgaWYgKHRlbXBsYXRlQ3NzUGF0aCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0ZW1wbGF0ZUNzc1BhdGgiLCBmaW5kU3RyaW5nKHRlbXBsYXRlQ3NzUGF0aCkpOworICAgICAgICBpZiAoaWNvblBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaWNvblBhdGgiLCBmaW5kU3RyaW5nKGljb25QYXRoKSk7CisgICAgICAgIGlmIChkYXRhRmllbGROYW1lICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImRhdGFGaWVsZE5hbWUiLCBmaW5kU3RyaW5nKGRhdGFGaWVsZE5hbWUpKTsKKyAgICAgICAgaWYgKGtleU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigia2V5TmFtZSIsIGZpbmRTdHJpbmcoa2V5TmFtZSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGtleU5hbWUgPSBuYW1lICsgIktleSI7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImtleU5hbWUiLCBmaW5kU3RyaW5nKGtleU5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRyYW5zcG9ydCIsIGZpbmRTdHJpbmcodHJhbnNwb3J0KSk7CisgICAgICAgIGlmIChwcmVsb2FkICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInByZWxvYWQiLCBmaW5kVmFsdWUocHJlbG9hZCwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICAKKyAgICAgICAgaWYgKGtleVZhbHVlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5hbWVLZXlWYWx1ZSIsIGZpbmRTdHJpbmcoa2V5VmFsdWUpKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcga2V5TmFtZUV4cHIgPSAiJXsiICsga2V5TmFtZSArICJ9IjsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibmFtZUtleVZhbHVlIiwgZmluZFN0cmluZyhrZXlOYW1lRXhwcikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKGJlZm9yZU5vdGlmeVRvcGljcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJiZWZvcmVOb3RpZnlUb3BpY3MiLCBmaW5kU3RyaW5nKGJlZm9yZU5vdGlmeVRvcGljcykpOworICAgICAgICBpZiAoYWZ0ZXJOb3RpZnlUb3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiYWZ0ZXJOb3RpZnlUb3BpY3MiLCBmaW5kU3RyaW5nKGFmdGVyTm90aWZ5VG9waWNzKSk7CisgICAgICAgIGlmIChlcnJvck5vdGlmeVRvcGljcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJlcnJvck5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoZXJyb3JOb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgaWYgKHZhbHVlTm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInZhbHVlTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyh2YWx1ZU5vdGlmeVRvcGljcykpOworICAgICAgICBpZiAocmVzdWx0c0xpbWl0ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInNlYXJjaExpbWl0IiwgZmluZFN0cmluZyhyZXN1bHRzTGltaXQpKTsKKyAgICAgICAgCisgICAgICAgIC8vIGdlbmVyYXRlIGEgcmFuZG9tIElEIGlmIG5vdCBleHBsaWNpdGx5IHNldCBhbmQgbm90IHBhcnNpbmcgdGhlIGNvbnRlbnQKKyAgICAgICAgQm9vbGVhbiBwYXJzZUNvbnRlbnQgPSAoQm9vbGVhbilzdGFjay5nZXRDb250ZXh0KCkuZ2V0KEhlYWQuUEFSU0VfQ09OVEVOVCk7CisgICAgICAgIGJvb2xlYW4gZ2VuZXJhdGVJZCA9IChwYXJzZUNvbnRlbnQgIT0gbnVsbCA/ICFwYXJzZUNvbnRlbnQgOiB0cnVlKTsKKyAgICAgICAgCisgICAgICAgIGFkZFBhcmFtZXRlcigicHVzaElkIiwgZ2VuZXJhdGVJZCk7CisgICAgICAgIGlmICgodGhpcy5pZCA9PSBudWxsIHx8IHRoaXMuaWQubGVuZ3RoKCkgPT0gMCkgJiYgZ2VuZXJhdGVJZCkgeworICAgICAgICAgICAgLy8gcmVzb2x2ZXMgTWF0aC5hYnMoSW50ZWdlci5NSU5fVkFMVUUpIGlzc3VlIHJlcG9ydGVkIGJ5IEZpbmRCdWdzIAorICAgICAgICAgICAgLy8gaHR0cDovL2ZpbmRidWdzLnNvdXJjZWZvcmdlLm5ldC9idWdEZXNjcmlwdGlvbnMuaHRtbCNSVl9BQlNPTFVURV9WQUxVRV9PRl9SQU5ET01fSU5UCisgICAgICAgICAgICBpbnQgbmV4dEludCA9IFJBTkRPTS5uZXh0SW50KCk7CisgICAgICAgICAgICBuZXh0SW50ID0gbmV4dEludCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUFYX1ZBTFVFIDogTWF0aC5hYnMobmV4dEludCk7ICAKKyAgICAgICAgICAgIHRoaXMuaWQgPSAid2lkZ2V0XyIgKyBTdHJpbmcudmFsdWVPZihuZXh0SW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2UKKyAgICBwdWJsaWMgdm9pZCBzZXRUaGVtZShTdHJpbmcgdGhlbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0VGhlbWUodGhlbWUpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gImFqYXgiOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGZpbmRMaXN0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGZpbmRWYWx1ZShsaXN0LCBPYmplY3QuY2xhc3MpIDogbnVsbDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJXaGV0aGVyIGF1dG9jb21wbGV0ZXIgc2hvdWxkIG1ha2Ugc3VnZ2VzdGlvbiBvbiB0aGUgdGV4dGJveCIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQ29tcGxldGUoU3RyaW5nIGF1dG9Db21wbGV0ZSkgeworICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZSA9IGF1dG9Db21wbGV0ZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJFbmFibGUgb3IgZGlzYWJsZSBhdXRvY29tcGxldGVyIiwgdHlwZT0iQm9vbGVhbiIsIGRlZmF1bHRWYWx1ZT0iZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkKFN0cmluZyBkaXNhYmxlZCkgeworICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRm9yY2Ugc2VsZWN0aW9uIHRvIGJlIG9uZSBvZiB0aGUgb3B0aW9ucyIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZVZhbGlkT3B0aW9uKFN0cmluZyBmb3JjZVZhbGlkT3B0aW9uKSB7CisgICAgICAgIHRoaXMuZm9yY2VWYWxpZE9wdGlvbiA9IGZvcmNlVmFsaWRPcHRpb247CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIFVSTCB1c2VkIHRvIGxvYWQgdGhlIG9wdGlvbnMiKQorICAgIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJEZWxheSBiZWZvcmUgbWFraW5nIHRoZSBzZWFyY2giLCB0eXBlPSJJbnRlZ2VyIiwgZGVmYXVsdFZhbHVlPSIxMDAiKQorICAgIHB1YmxpYyB2b2lkIHNldERlbGF5KFN0cmluZyBzZWFyY2hEZWxheSkgeworICAgICAgICB0aGlzLmRlbGF5ID0gc2VhcmNoRGVsYXk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iaG93IHRoZSBzZWFyY2ggbXVzdCBiZSBwZXJmb3JtZWQsIG9wdGlvbnMgYXJlOiAnc3RhcnRzdHJpbmcnLCAnc3RhcnR3b3JkJyAiICsKKyAgICAgICAgICAgICAgICAiYW5kICdzdWJzdHJpbmcnIiwgZGVmYXVsdFZhbHVlPSJzdHJpbmdzdGFydCIpCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoVHlwZShTdHJpbmcgc2VhcmNoVHlwZSkgeworICAgICAgICB0aGlzLnNlYXJjaFR5cGUgPSBzZWFyY2hUeXBlOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkRyb3Bkb3duJ3MgaGVpZ2h0IGluIHBpeGVscyIsIHR5cGU9IkludGVnZXIiLCBkZWZhdWx0VmFsdWU9IjEyMCIpCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25IZWlnaHQoU3RyaW5nIGhlaWdodCkgeworICAgICAgICB0aGlzLmRyb3Bkb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkRyb3Bkb3duJ3Mgd2lkdGgiLCB0eXBlPSJJbnRlZ2VyIiwgZGVmYXVsdFZhbHVlPSJzYW1lIGFzIHRleHRib3giKQorICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duV2lkdGgoU3RyaW5nIHdpZHRoKSB7CisgICAgICAgIHRoaXMuZHJvcGRvd25XaWR0aCA9IHdpZHRoOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkZ1bmN0aW9uIG5hbWUgdXNlZCB0byBmaWx0ZXIgdGhlIGZpZWxkcyBvZiB0aGUgZm9ybSIpCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybUZpbHRlcihTdHJpbmcgZm9ybUZpbHRlcikgeworICAgICAgdGhpcy5mb3JtRmlsdGVyID0gZm9ybUZpbHRlcjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJGb3JtIGlkIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNlcmlhbGl6ZWQgYW5kIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtSWQoU3RyaW5nIGZvcm1JZCkgeworICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSWQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVG9waWMgdGhhdCB3aWxsIHRyaWdnZXIgYSByZWxvYWQiKQorICAgIHB1YmxpYyB2b2lkIHNldExpc3RlblRvcGljcyhTdHJpbmcgbGlzdGVuVG9waWNzKSB7CisgICAgICB0aGlzLmxpc3RlblRvcGljcyA9IGxpc3RlblRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUb3BpY3MgdGhhdCB3aWxsIGJlIHB1Ymxpc2hlZCB3aGVuIGNvbnRlbnQgaXMgcmVsb2FkZWQiKQorICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeVRvcGljcyhTdHJpbmcgb25WYWx1ZUNoYW5nZWRQdWJsaXNoVG9waWMpIHsKKyAgICAgIHRoaXMubm90aWZ5VG9waWNzID0gb25WYWx1ZUNoYW5nZWRQdWJsaXNoVG9waWM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSWQgb2YgZWxlbWVudCB0aGF0IHdpbGwgYmUgc2hvd24gd2hpbGUgcmVxdWVzdCBpcyBtYWRlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRpY2F0b3IoU3RyaW5nIGluZGljYXRvcikgeworICAgICAgICB0aGlzLmluZGljYXRvciA9IGluZGljYXRvcjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJNaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBmb3JjZSB0aGUgY29udGVudCB0byBiZSBsb2FkZWQiLCB0eXBlPSJJbnRlZ2VyIiwgZGVmYXVsdFZhbHVlPSIzIikKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkTWluaW11bUNvdW50KFN0cmluZyBsb2FkTWluaW11bUNvdW50KSB7CisgICAgICAgIHRoaXMubG9hZE1pbmltdW1Db3VudCA9IGxvYWRNaW5pbXVtQ291bnQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iT3B0aW9ucyB3aWxsIGJlIHJlbG9hZGVkIGV2ZXJ5dGltZSBhIGNoYXJhY3RlciBpcyB0eXBlZCBvbiB0aGUgdGV4dGJveCIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9InRydWUiKQorICAgIHB1YmxpYyB2b2lkIHNldExvYWRPblRleHRDaGFuZ2UoU3RyaW5nIGxvYWRPblR5cGUpIHsKKyAgICAgICAgdGhpcy5sb2FkT25UZXh0Q2hhbmdlID0gbG9hZE9uVHlwZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJTaG93IG9yIGhpZGUgdGhlIGRvd24gYXJyb3cgYnV0dG9uIiwgdHlwZT0iQm9vbGVhbiIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0Rvd25BcnJvdyhTdHJpbmcgc2hvd0Rvd25BcnJvdykgeworICAgICAgICB0aGlzLnNob3dEb3duQXJyb3cgPSBzaG93RG93bkFycm93OworICAgIH0KKworICAgIC8vIE92ZXJyaWRlIGFzIG5vdCByZXF1aXJlZAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249Ikl0ZXJhdGFibGUgc291cmNlIHRvIHBvcHVsYXRlIGZyb20uIikKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0KFN0cmluZyBsaXN0KSB7CisgICAgICAgIHN1cGVyLnNldExpc3QobGlzdCk7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRlbXBsYXRlIGNzcyBwYXRoIikKKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wbGF0ZUNzc1BhdGgoU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aCkgeworICAgICAgICB0aGlzLnRlbXBsYXRlQ3NzUGF0aCA9IHRlbXBsYXRlQ3NzUGF0aDsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iUGF0aCB0byBpY29uIHVzZWQgZm9yIHRoZSBkcm9wZG93biIpCisgICAgcHVibGljIHZvaWQgc2V0SWNvblBhdGgoU3RyaW5nIGljb25QYXRoKSB7CisgICAgICAgIHRoaXMuaWNvblBhdGggPSBpY29uUGF0aDsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iTmFtZSBvZiB0aGUgZmllbGQgdG8gd2hpY2ggdGhlIHNlbGVjdGVkIGtleSB3aWxsIGJlIGFzc2lnbmVkIikKKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlOYW1lKFN0cmluZyBrZXlOYW1lKSB7CisgICAgICAgdGhpcy5rZXlOYW1lID0ga2V5TmFtZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJOYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgcmV0dXJuZWQgSlNPTiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgZGF0YSBhcnJheSIsIGRlZmF1bHRWYWx1ZT0iVmFsdWUgc3BlY2lmaWVkIGluICduYW1lJyIpCisgICAgcHVibGljIHZvaWQgc2V0RGF0YUZpZWxkTmFtZShTdHJpbmcgZGF0YUZpZWxkTmFtZSkgeworICAgICAgICB0aGlzLmRhdGFGaWVsZE5hbWUgPSBkYXRhRmllbGROYW1lOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgY3NzIGNsYXNzIHRvIHVzZSBmb3IgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0Q3NzQ2xhc3MoU3RyaW5nIGNzc0NsYXNzKSB7CisgICAgICAgIHN1cGVyLnNldENzc0NsYXNzKGNzc0NsYXNzKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgY3NzIHN0eWxlIHRvIHVzZSBmb3IgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0Q3NzU3R5bGUoU3RyaW5nIGNzc1N0eWxlKSB7CisgICAgICAgIHN1cGVyLnNldENzc1N0eWxlKGNzc1N0eWxlKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgaWQgdG8gdXNlIGZvciB0aGUgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgIHN1cGVyLnNldElkKGlkKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgbmFtZSB0byBzZXQgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJQcmVzZXQgdGhlIHZhbHVlIG9mIGlucHV0IGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyLnNldFZhbHVlKGFyZzApOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbW1pdGVkIGxpc3Qgb2YgdG9waWNzIHRoYXQgd2lsbCBwdWJsaXNoZWQgYWZ0ZXIgdGhlIHJlcXVlc3QoaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMpIikKKyAgICBwdWJsaWMgdm9pZCBzZXRBZnRlck5vdGlmeVRvcGljcyhTdHJpbmcgYWZ0ZXJOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5hZnRlck5vdGlmeVRvcGljcyA9IGFmdGVyTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBiZWZvcmUgdGhlIHJlcXVlc3QiKQorICAgIHB1YmxpYyB2b2lkIHNldEJlZm9yZU5vdGlmeVRvcGljcyhTdHJpbmcgYmVmb3JlTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzID0gYmVmb3JlTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBhZnRlciB0aGUgcmVxdWVzdChpZiB0aGUgcmVxdWVzdCBmYWlscykiKQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTm90aWZ5VG9waWNzKFN0cmluZyBlcnJvck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzID0gZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIHdoZW4gYSB2YWx1ZSBpcyBzZWxlY3RlZCIpCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVOb3RpZnlUb3BpY3MoU3RyaW5nIHZhbHVlTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMudmFsdWVOb3RpZnlUb3BpY3MgPSB2YWx1ZU5vdGlmeVRvcGljczsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iTGltaXQgaG93IG1hbnkgcmVzdWx0cyBhcmUgc2hvd24gYXMgYXV0b2NvbXBsZXRpb24gb3B0aW9ucywgc2V0IHRvIC0xIGZvciB1bmxpbWl0ZWQgcmVzdWx0cyIsIGRlZmF1bHRWYWx1ZT0iMzAiLCB0eXBlID0gIkludGVnZXIiKQorICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdHNMaW1pdChTdHJpbmcgcmVzdWx0c0xpbWl0KSB7CisgICAgICAgIHRoaXMucmVzdWx0c0xpbWl0ID0gcmVzdWx0c0xpbWl0OworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUcmFuc3BvcnQgdXNlZCBieSBEb2pvIHRvIG1ha2UgdGhlIHJlcXVlc3QiLCBkZWZhdWx0VmFsdWU9IlhNTEhUVFBUcmFuc3BvcnQiKQorICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydChTdHJpbmcgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJMb2FkIG9wdGlvbnMgd2hlbiBwYWdlIGlzIGxvYWRlZCIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9InRydWUiKQorICAgIHB1YmxpYyB2b2lkIHNldFByZWxvYWQoU3RyaW5nIHByZWxvYWQpIHsKKyAgICAgICAgdGhpcy5wcmVsb2FkID0gcHJlbG9hZDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJJbml0aWFsIGtleSB2YWx1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0S2V5VmFsdWUoU3RyaW5nIGtleVZhbHVlKSB7CisgICAgICAgIHRoaXMua2V5VmFsdWUgPSBrZXlWYWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0JpbmQuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvQmluZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTk2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0JpbmQuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZ0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIDxwPgorICogVGhpcyB0YWcgd2lsbCBnZW5lcmF0ZSBldmVudCBsaXN0ZW5lcnMgZm9yIG11bHRpcGxlIGV2ZW50cyBvbiBtdWx0aXBsZSBzb3VyY2VzLAorICogbWFraW5nIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgaHJlZiwgYW5kIHVwZGF0aW5nIG11bHRpcGxlIHRhcmdldHMuCisgKiA8L3A+CisgKiA8IS0tIEVORCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICogCisgKiA8cD5FeGFtcGxlczwvcD4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMCAtLT4KKyAqICZsdDtzeDpiaW5kIGhyZWY9IiV7I2FqYXhUZXN0fSIgbGlzdGVuVG9waWNzPSIvbWFrZWNhbGwiLyZndDsKKyAqICZsdDtzOnN1Ym1pdCBvbmNsaWNrPSJkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goJy9tYWtlY2FsbCcpIi8mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMCAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMSAtLT4KKyAqICZsdDtpbWcgaWQ9ImluZGljYXRvciIgc3JjPSIke3BhZ2VDb250ZXh0LnJlcXVlc3QuY29udGV4dFBhdGh9L2ltYWdlcy9pbmRpY2F0b3IuZ2lmIiBhbHQ9IkxvYWRpbmcuLi4iIHN0eWxlPSJkaXNwbGF5Om5vbmUiLyZndDsKKyAqICZsdDtzeDpiaW5kIGlkPSJleDEiIGhyZWY9IiV7I2FqYXhUZXN0fSIgc291cmNlcz0iYnV0dG9uIiB0YXJnZXRzPSJkaXYxIiBldmVudHM9Im9uY2xpY2siIGluZGljYXRvcj0iaW5kaWNhdG9yIiAvJmd0OworICogJmx0O3M6c3VibWl0IHRoZW1lPSJzaW1wbGUiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InN1Ym1pdCIgaWQ9ImJ1dHRvbiIvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAmbHQ7c3g6YmluZCBpZD0iZXgzIiBocmVmPSIleyNhamF4VGVzdH0iIHNvdXJjZXM9ImNoazEiIHRhcmdldHM9ImRpdjEiIGV2ZW50cz0ib25jaGFuZ2UiIGZvcm1JZD0iZm9ybTEiIC8mZ3Q7CisgKiAmbHQ7Zm9ybSBpZD0iZm9ybTEiJmd0OworICogICAgICZsdDtzOmNoZWNrYm94IG5hbWU9ImRhdGEiIGxhYmVsPSJIaXQgbWUiIGlkPSJjaGsxIi8mZ3Q7CisgKiAmbHQ7L2Zvcm0+CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMiAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNCAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYmVmb3JlIiwgZnVuY3Rpb24oZXZlbnQsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBiZWZvcmUgcmVxdWVzdCcpOworICogICAgIC8vZXZlbnQ6IHNldCBldmVudC5jYW5jZWwgPSB0cnVlLCB0byBjYW5jZWwgcmVxdWVzdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OyAgICAgICAgIAorICogCisgKiAmbHQ7aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iYnV0dG9uIiZndDsgCisgKiAmbHQ7c3g6YmluZCBpZD0iZXgxIiBocmVmPSIleyNhamF4VGVzdH0iIGJlZm9yZU5vdGlmeVRvcGljcz0iL2JlZm9yZSIgc291cmNlcz0iYnV0dG9uIiBldmVudHM9Im9uY2xpY2siLyZndDsgCisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNCAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNSAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYWZ0ZXIiLCBmdW5jdGlvbihkYXRhLCByZXF1ZXN0LCB3aWRnZXQpeworICogICAgIGFsZXJ0KCdpbnNpZGUgYSB0b3BpYyBldmVudC4gYWZ0ZXIgcmVxdWVzdCcpOworICogICAgIC8vZGF0YSA6IHRleHQgcmV0dXJuZWQgZnJvbSByZXF1ZXN0KHRoZSBodG1sKQorICogICAgIC8vcmVxdWVzdDogWE1MSHR0cFJlcXVlc3Qgb2JqZWN0CisgKiAgICAgLy93aWRnZXQ6IHdpZGdldCB0aGF0IHB1Ymxpc2hlZCB0aGUgdG9waWMKKyAqIH0pOworICogJmx0Oy9zY3JpcHQmZ3Q7ICAgICAgICAKKyAqIAorICogJmx0O2lucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImJ1dHRvbiImZ3Q7CisgKiAmbHQ7c3g6YmluZCBpZD0iZXgxIiBocmVmPSIleyNhamF4VGVzdH0iIGhpZ2hsaWdodENvbG9yPSJyZWQiIGFmdGVyTm90aWZ5VG9waWNzPSIvYWZ0ZXIiIHNvdXJjZXM9ImJ1dHRvbiIgZXZlbnRzPSJvbmNsaWNrIi8mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNSAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNiAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvZXJyb3IiLCBmdW5jdGlvbihlcnJvciwgcmVxdWVzdCwgd2lkZ2V0KXsKKyAqICAgICBhbGVydCgnaW5zaWRlIGEgdG9waWMgZXZlbnQuIG9uIGVycm9yJyk7CisgKiAgICAgLy9lcnJvciA6IGVycm9yIG9iamVjdCAoZXJyb3IubWVzc2FnZSBoYXMgdGhlIGVycm9yIG1lc3NhZ2UpCisgKiAgICAgLy9yZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCBvYmplY3QKKyAqICAgICAvL3dpZGdldDogd2lkZ2V0IHRoYXQgcHVibGlzaGVkIHRoZSB0b3BpYworICogfSk7CisgKiAmbHQ7L3NjcmlwdCZndDsgICAgICAgICAKKyAqIAorICogJmx0O2lucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImJ1dHRvbiImZ3Q7CisgKiAmbHQ7aW1nIGlkPSJpbmQxIiBzcmM9IiR7cGFnZUNvbnRleHQucmVxdWVzdC5jb250ZXh0UGF0aH0vaW1hZ2VzL2luZGljYXRvci5naWYiIHN0eWxlPSJkaXNwbGF5Om5vbmUiLyZndDsKKyAqICZsdDtzeDpiaW5kIGhyZWY9IiV7I2FqYXhUZXN0fSIgaW5kaWNhdG9yPSJpbmQxIiBlcnJvck5vdGlmeVRvcGljcz0iL2Vycm9yIiBzb3VyY2VzPSJidXR0b24iIGV2ZW50cz0ib25jbGljayIvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTYgLS0+CisgKi8KK0BTdHJ1dHNUYWcobmFtZT0iYmluZCIsIHRsZFRhZ0NsYXNzPSJvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWkuQmluZFRhZyIsIGRlc2NyaXB0aW9uPSJBdHRhY2ggZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRzIHRvIG1ha2UgQUpBWCBjYWxscyIpCitAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCitwdWJsaWMgY2xhc3MgQmluZCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGVCZWFuIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9ICJiaW5kLWNsb3NlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1RFTVBMQVRFID0gImJpbmQiOworCisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgc291cmNlczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV2ZW50czsKKworICAgIHB1YmxpYyBCaW5kKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0T3BlblRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gT1BFTl9URU1QTEFURTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIFRFTVBMQVRFOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlRXh0cmFQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLmV2YWx1YXRlRXh0cmFQYXJhbXMoKTsKKworICAgICAgICBpZiAodGFyZ2V0cyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0YXJnZXRzIiwgZmluZFN0cmluZyh0YXJnZXRzKSk7CisgICAgICAgIGlmIChzb3VyY2VzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInNvdXJjZXMiLCBmaW5kU3RyaW5nKHNvdXJjZXMpKTsKKyAgICAgICAgaWYgKGV2ZW50cyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJldmVudHMiLCBmaW5kU3RyaW5nKGV2ZW50cykpOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhdHRhY2ggdG8iKQorICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50cyhTdHJpbmcgZXZlbnRzKSB7CisgICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGlkcyBvZiB0aGUgZWxlbWVudHMgdG8gYXR0YWNoIHRvIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VzKFN0cmluZyBzb3VyY2VzKSB7CisgICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaWRzIG9mIHRoZSBlbGVtZW50cyB3aG9zZSBjb250ZW50IHdpbGwgYmUgdXBkYXRlZCIpCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0cyhTdHJpbmcgdGFyZ2V0cykgeworICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoU3RyaW5nIHRoZW1lKSB7CisgICAgICAgIHN1cGVyLnNldFRoZW1lKHRoZW1lKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuICJhamF4IjsKKyAgICB9CisKKyAgICAvL3RoZXNlIGF0dHJpYnV0ZXMgYXJlIG92ZXJ3cml0dGVuIGhlcmUganVzdCBmb3IgdGhlIFRMRCBnZW5lcmF0aW9uCisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVG9waWMgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHJlbW90ZSBjYWxsIikKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5Ub3BpY3MoU3RyaW5nIGxpc3RlblRvcGljcykgeworICAgICAgICB0aGlzLmxpc3RlblRvcGljcyA9IGxpc3RlblRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgVVJMIHRvIGNhbGwgdG8gb2J0YWluIHRoZSBjb250ZW50LiBOb3RlOiBJZiB1c2VkIHdpdGggYWpheCBjb250ZXh0LCB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYXMgYW4gdXJsIHRhZyB2YWx1ZS4iKQorICAgIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsKKyAgICB9CisKKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRoZSB0ZXh0IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIgaWYgdGhlIGlzIGFuIGVycm9yIGZldGNoaW5nIHRoZSBjb250ZW50IikKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclRleHQoU3RyaW5nIGVycm9yVGV4dCkgeworICAgICAgICB0aGlzLmVycm9yVGV4dCA9IGVycm9yVGV4dDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJKYXZhc2NyaXB0IGNvZGUgaW4gdGhlIGZldGNoZWQgY29udGVudCB3aWxsIGJlIGV4ZWN1dGVkIiwgdHlwZT0iQm9vbGVhbiIsIGRlZmF1bHRWYWx1ZT0iZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGVTY3JpcHRzKFN0cmluZyBleGVjdXRlU2NyaXB0cykgeworICAgICAgICB0aGlzLmV4ZWN1dGVTY3JpcHRzID0gZXhlY3V0ZVNjcmlwdHM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGV4dCB0byBiZSBzaG93biB3aGlsZSBjb250ZW50IGlzIGJlaW5nIGZldGNoZWQiLCBkZWZhdWx0VmFsdWU9IkxvYWRpbmcuLi4iKQorICAgIHB1YmxpYyB2b2lkIHNldExvYWRpbmdUZXh0KFN0cmluZyBsb2FkaW5nVGV4dCkgeworICAgICAgICB0aGlzLmxvYWRpbmdUZXh0ID0gbG9hZGluZ1RleHQ7CisgICAgfQorCisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJKYXZhc2NyaXB0IGZ1bmN0aW9uIG5hbWUgdGhhdCB3aWxsIG1ha2UgdGhlIHJlcXVlc3QiKQorICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoU3RyaW5nIGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkZ1bmN0aW9uIG5hbWUgdXNlZCB0byBmaWx0ZXIgdGhlIGZpZWxkcyBvZiB0aGUgZm9ybS4iKQorICAgIHB1YmxpYyB2b2lkIHNldEZvcm1GaWx0ZXIoU3RyaW5nIGZvcm1GaWx0ZXIpIHsKKyAgICAgICAgdGhpcy5mb3JtRmlsdGVyID0gZm9ybUZpbHRlcjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJGb3JtIGlkIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNlcmlhbGl6ZWQgYW5kIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtSWQoU3RyaW5nIGZvcm1JZCkgeworICAgICAgICB0aGlzLmZvcm1JZCA9IGZvcm1JZDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbW1pdGVkIGxpc3Qgb2YgdG9waWNzIHRoYXQgd2lsbCBwdWJsaXNoZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVxdWVzdCwgYW5kIG9uIGVycm9ycyIpCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5VG9waWNzKFN0cmluZyBub3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5ub3RpZnlUb3BpY3MgPSBub3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2V0IHdoZXRoZXIgZXJyb3JzIHdpbGwgYmUgc2hvd24gb3Igbm90IiwgdHlwZT0iQm9vbGVhbiIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0Vycm9yVHJhbnNwb3J0VGV4dChTdHJpbmcgc2hvd0Vycm9yKSB7CisgICAgICAgIHRoaXMuc2hvd0Vycm9yVHJhbnNwb3J0VGV4dCA9IHNob3dFcnJvcjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJJZCBvZiBlbGVtZW50IHRoYXQgd2lsbCBiZSBzaG93biB3aGlsZSBtYWtpbmcgcmVxdWVzdCIpCisgICAgcHVibGljIHZvaWQgc2V0SW5kaWNhdG9yKFN0cmluZyBpbmRpY2F0b3IpIHsKKyAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBpbmRpY2F0b3I7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2hvdyBsb2FkaW5nIHRleHQgb24gdGFyZ2V0cyIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93TG9hZGluZ1RleHQoU3RyaW5nIHNob3dMb2FkaW5nVGV4dCkgeworICAgICAgICB0aGlzLnNob3dMb2FkaW5nVGV4dCA9IHNob3dMb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0Q3NzQ2xhc3MoU3RyaW5nIGNzc0NsYXNzKSB7CisgICAgICAgIHN1cGVyLnNldENzc0NsYXNzKGNzc0NsYXNzKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0Q3NzU3R5bGUoU3RyaW5nIGNzc1N0eWxlKSB7CisgICAgICAgIHN1cGVyLnNldENzc1N0eWxlKGNzc1N0eWxlKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlci5zZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBhZnRlciB0aGUgcmVxdWVzdChpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcykiKQorICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyTm90aWZ5VG9waWNzKFN0cmluZyBhZnRlck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzID0gYWZ0ZXJOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGJlZm9yZSB0aGUgcmVxdWVzdCIpCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlTm90aWZ5VG9waWNzKFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MgPSBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGFmdGVyIHRoZSByZXF1ZXN0KGlmIHRoZSByZXF1ZXN0IGZhaWxzKSIpCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JOb3RpZnlUb3BpY3MoU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MgPSBlcnJvck5vdGlmeVRvcGljczsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGlkIHRvIHVzZSBmb3IgdGhlIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBzdXBlci5zZXRJZChpZCk7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiQ29sb3IgdXNlZCB0byBwZXJmb3JtIGEgaGlnaGxpZ2h0IGVmZmVjdCBvbiB0aGUgZWxlbWVudHMgc3BlY2lmaWVkIGluIHRoZSAndGFyZ2V0cycgYXR0cmlidXRlIiwgCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICJub25lIikKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWdobGlnaHRDb2xvcihTdHJpbmcgaGlnaGxpZ2h0Q29sb3IpIHsKKyAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvciA9IGhpZ2hsaWdodENvbG9yOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiRHVyYXRpb24gb2YgaGlnaGxpZ2h0IGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuIE9ubHkgdmFsaWQgaWYgJ2hpZ2hsaWdodENvbG9yJyBhdHRyaWJ1dGUgaXMgc2V0IiwgCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICIyMDAwIiwgdHlwZT0iSW50ZWdlciIpCisgICAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0RHVyYXRpb24oU3RyaW5nIGhpZ2hsaWdodER1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuaGlnaGxpZ2h0RHVyYXRpb24gPSBoaWdobGlnaHREdXJhdGlvbjsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbiA9ICJQZXJmb3JtIEFqYXggdmFsaWRhdGlvbi4gJ2FqYXhWYWxpZGF0aW9uJyBpbnRlcmNlcHRvciBtdXN0IGJlIGFwcGxpZWQgdG8gYWN0aW9uIiwgdHlwZT0iQm9vbGVhbiIsIAorICAgICAgICBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKFN0cmluZyB2YWxpZGF0ZSkgeworICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiTWFrZSBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCBpZiB2YWxpZGF0aW9uIHN1Y2NlZWRzLiBPbmx5IHZhbGlkIGlzICd2YWxpZGF0ZScgaXMgJ3RydWUnIiwgdHlwZT0iQm9vbGVhbiIsIAorICAgICAgICBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldEFqYXhBZnRlclZhbGlkYXRpb24oU3RyaW5nIGFqYXhBZnRlclZhbGlkYXRpb24pIHsKKyAgICAgICAgdGhpcy5hamF4QWZ0ZXJWYWxpZGF0aW9uID0gYWpheEFmdGVyVmFsaWRhdGlvbjsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iUnVuIHNjcmlwdHMgaW4gYSBzZXBhcmF0ZSBzY29wZSwgdW5pcXVlIGZvciBlYWNoIHRhZyIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdGVTY3JpcHRzKFN0cmluZyBzZXBhcmF0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5zZXBhcmF0ZVNjcmlwdHMgPSBzZXBhcmF0ZVNjcmlwdHM7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRyYW5zcG9ydCB1c2VkIGJ5IERvam8gdG8gbWFrZSB0aGUgcmVxdWVzdCIsIGRlZmF1bHRWYWx1ZT0iWE1MSFRUUFRyYW5zcG9ydCIpCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0KFN0cmluZyB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTk1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0RhdGVUaW1lUGlja2VyLmphdmEKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50czsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5Gb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5VSUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2U7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGphdmFkb2MgLS0+CisgKiA8cD4KKyAqIFJlbmRlcnMgYSBkYXRlL3RpbWUgcGlja2VyIGluIGEgZHJvcGRvd24gY29udGFpbmVyLgorICogPC9wPgorICogPHA+CisgKiBBIHN0YW5kLWFsb25lIERhdGVUaW1lUGlja2VyIHdpZGdldCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gc2VsZWN0IGEgZGF0ZS90aW1lLCBvciBpbmNyZW1lbnQgYnkgd2VlaywgbW9udGgsCisgKiBhbmQvb3IgeWVhci4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGN1c3RvbWl6ZSB0aGUgdXNlci12aXNpYmxlIGZvcm1hdHRpbmcgd2l0aCBlaXRoZXIgdGhlCisgKiAnZm9ybWF0TGVuZ3RoJyAobG9uZywgc2hvcnQsIG1lZGl1bSBvciBmdWxsKSBvciAnZGlzcGxheUZvcm1hdCcgYXR0cmlidXRlcy4gQnkgZGVmYXVsdHkgY3VycmVudAorICogbG9jYWxlIHdpbGwgYmUgdXNlZC48L3A+CisgKiA8L3A+CisgKiAKKyAqIFN5bnRheCBzdXBwb3J0ZWQgYnkgJ2Rpc3BsYXlGb3JtYXQnIGlzIChodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTQuaHRtbCNEYXRlX0Zvcm1hdF9QYXR0ZXJucyk6LQorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPkZvcm1hdDwvdGQ+CisgKiAgICAgIDx0ZD5EZXNjcmlwdGlvbjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmQ8L3RkPgorICogICAgICA8dGQ+RGF5IG9mIHRoZSBtb250aDwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPkQ8L3RkPgorICogICAgICA8dGQ+RGF5IG9mIHllYXI8L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5NPC90ZD4KKyAqICAgICAgPHRkPk1vbnRoIC0gVXNlIG9uZSBvciB0d28gZm9yIHRoZSBudW1lcmljYWwgbW9udGgsIHRocmVlIGZvciB0aGUgYWJicmV2aWF0aW9uLCBvciBmb3VyIGZvciB0aGUgZnVsbCBuYW1lLCBvciA1IGZvciB0aGUgbmFycm93IG5hbWUuPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+eTwvdGQ+CisgKiAgICAgIDx0ZD5ZZWFyPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+aDwvdGQ+CisgKiAgICAgIDx0ZD5Ib3VyIFsxLTEyXS48L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5IPC90ZD4KKyAqICAgICAgPHRkPkhvdXIgWzAtMjNdLjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm08L3RkPgorICogICAgICA8dGQ+TWludXRlLiBVc2Ugb25lIG9yIHR3byBmb3IgemVybyBwYWRkaW5nLjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnM8L3RkPgorICogICAgICA8dGQ+U2Vjb25kLiBVc2Ugb25lIG9yIHR3byBmb3IgemVybyBwYWRkaW5nLjwvdGQ+CisgKiAgIDwvdHI+CisgKiA8L3RhYmxlPgorICogCisgKiA8cD4KKyAqIFRoZSB2YWx1ZSBzZW50IHRvIHRoZSBzZXJ2ZXIgaXMgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsdWUsIGluIGEgaGlkZGVuIGZpZWxkIGFzIGRlZmluZWQgCisgKiBieSB0aGUgbmFtZSBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBjb25mb3JtaW5nIHRvIFJGQzMgMzM5IAorICogKHl5eXktTU0tZGQnVCdISDptbTpzcykKKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmb3JtYXRzKGluIG9yZGVyKSB3aWxsIGJlIHVzZWQgdG8gcGFyc2UgdGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlcyAndmFsdWUnLCAKKyAqICdzdGFydERhdGUnIGFuZCAnZW5kRGF0ZSc6CisgKiA8L3A+CisgKiA8dWw+CisgKiAgIDxsaT5TaW1wbGVEYXRlRm9ybWF0IGJ1aWx0IHVzaW5nIFJGQyAzMzM5ICh5eXl5LU1NLWRkJ1QnSEg6bW06c3MpCisgKiAgIDxsaT5TaW1wbGVEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JUKQorICogICA8bGk+U2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCkKKyAqICAgPGxpPlNpbXBsZURhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuTUVESVVNKQorICogICA8bGk+U2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKQorICogICA8bGk+U2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5MT05HKQorICogICA8bGk+U2ltcGxlRGF0ZUZvcm1hdCBidWlsdCB1c2luZyB0aGUgdmFsdWUgb2YgdGhlICdkaXNwbGF5Rm9ybWF0JyBhdHRyaWJ1dGUoaWYgYW55KQorICogPC91bD4KKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGphdmFkb2MgLS0+CisgKgorICogPGI+RXhhbXBsZXM8L2I+CisgKgorICogPHByZT4KKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAgICZsdDtzeDpkYXRldGltZXBpY2tlciBuYW1lPSJvcmRlci5kYXRlIiBsYWJlbD0iT3JkZXIgRGF0ZSIgLyZndDsKKyAqICAgJmx0O3N4OmRhdGV0aW1lcGlja2VyIG5hbWU9ImRlbGl2ZXJ5LmRhdGUiIGxhYmVsPSJEZWxpdmVyeSBEYXRlIiBkaXNwbGF5Rm9ybWF0PSJ5eXl5LU1NLWRkIiAgLyZndDsKKyAqICAgJmx0O3N4OmRhdGV0aW1lcGlja2VyIG5hbWU9ImRlbGl2ZXJ5LmRhdGUiIGxhYmVsPSJEZWxpdmVyeSBEYXRlIiB2YWx1ZT0iJXtkYXRlfSIgIC8mZ3Q7CisgKiAgICZsdDtzeDpkYXRldGltZXBpY2tlciBuYW1lPSJkZWxpdmVyeS5kYXRlIiBsYWJlbD0iRGVsaXZlcnkgRGF0ZSIgdmFsdWU9IiV7JzIwMDctMDEtMDEnfSIgIC8mZ3Q7CisgKiAgICZsdDtzeDpkYXRldGltZXBpY2tlciBuYW1lPSJvcmRlci5kYXRlIiBsYWJlbD0iT3JkZXIgRGF0ZSIgdmFsdWU9IiV7J3RvZGF5J30iLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogPC9wcmU+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAmbHQ7c3g6ZGF0ZXRpbWVwaWNrZXIgaWQ9InBpY2tlciIgbGFiZWw9Ik9yZGVyIERhdGUiIC8mZ3Q7CisgKiAmbHQ7c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCImZ3Q7CisgKiAgIGZ1bmN0aW9uIHNldFZhbHVlKCkgeworICogICAgICB2YXIgcGlja2VyID0gZG9qby53aWRnZXQuYnlJZCgicGlja2VyIik7CisgKiAgICAgIAorICogICAgICAvL3N0cmluZyB2YWx1ZQorICogICAgICBwaWNrZXIuc2V0VmFsdWUoJzIwMDctMDEtMDEnKTsKKyAqICAgICAgCisgKiAgICAgIC8vRGF0ZSB2YWx1ZQorICogICAgICBwaWNrZXIuc2V0VmFsdWUobmV3IERhdGUoKSk7CisgKiAgIH0KKyAqICAgCisgKiAgIGZ1bmN0aW9uIHNob3dWYWx1ZSgpIHsKKyAqICAgICAgdmFyIHBpY2tlciA9IGRvam8ud2lkZ2V0LmJ5SWQoInBpY2tlciIpOworICogICAgICAKKyAqICAgICAgLy9zdHJpbmcgdmFsdWUKKyAqICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gcGlja2VyLmdldFZhbHVlKCk7CisgKiAgICAgIGFsZXJ0KHN0cmluZ1ZhbHVlKTsKKyAqICAgICAgCisgKiAgICAgIC8vZGF0ZSB2YWx1ZQorICogICAgICB2YXIgZGF0ZVZhbHVlID0gcGlja2VyLmdldERhdGUoKTsKKyAqICAgICAgYWxlcnQoZGF0ZVZhbHVlKTsKKyAqICAgfQorICogJmx0Oy9zY3JpcHQmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMiAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqICZsdDtzeDpkYXRldGltZXBpY2tlciBpZD0icGlja2VyIiBsYWJlbD0iT3JkZXIgRGF0ZSIgdmFsdWVOb3RpZnlUb3BpY3M9Ii92YWx1ZSIvJmd0OworICogCisgKiAmbHQ7c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCImZ3Q7CisgKiBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiL3ZhbHVlIiwgZnVuY3Rpb24odGV4dEVudGVyZWQsIGRhdGUsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ3ZhbHVlIGNoYW5nZWQnKTsKKyAqICAgICAvL3RleHRFbnRlcmVkOiBTdHJpbmcgZW5ldGVyZWQgaW4gdGhlIHRleHRib3gKKyAqICAgICAvL2RhdGU6IEphdmFTY3JpcHQgRGF0ZSBvYmplY3Qgd2l0aCB0aGUgdmFsdWUgc2VsZWN0ZWQKKyAqICAgICAvL3dpZGV0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljIAorICogfSk7CisgKiAmbHQ7L3NjcmlwdCZndDsgIAorICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTMgLS0+CisgKi8KK0BTdHJ1dHNUYWcobmFtZT0iZGF0ZXRpbWVwaWNrZXIiLCB0bGRUYWdDbGFzcz0ib3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpLkRhdGVUaW1lUGlja2VyVGFnIiwgZGVzY3JpcHRpb249IlJlbmRlciBkYXRldGltZXBpY2tlciIpCitwdWJsaWMgY2xhc3MgRGF0ZVRpbWVQaWNrZXIgZXh0ZW5kcyBVSUJlYW4geworCisgICAgZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVNUExBVEUgPSAiZGF0ZXRpbWVwaWNrZXIiOworICAgIC8vIFNpbXBsZURhdGVGb3JtYXQgaXMgbm90IHRocmVhZC1zYWZlIHNlZToKKyAgICAvLyAgIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTYyMzE1NzkKKyAgICAvLyAgIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTYxNzg5OTcKKyAgICAvLyBzb2x1dGlvbiBpcyB0byB1c2Ugc3RhdGVsZXNzIE1lc3NhZ2VGb3JtYXQgaW5zdGVhZDoKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkZDMzMzOV9GT1JNQVQgPSAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIjsKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkZDMzMzOV9QQVRURVJOID0gInswLGRhdGUsIiArIFJGQzMzMzlfRk9STUFUICsgIn0iOworICAgIGZpbmFsIHByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERhdGVUaW1lUGlja2VyLmNsYXNzKTsKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyB0cmFuc2llbnQgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsgICAgCisgICAgCisgICAgcHJvdGVjdGVkIFN0cmluZyBpY29uUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdExlbmd0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlGb3JtYXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2dnbGVUeXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgdG9nZ2xlRHVyYXRpb247CisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5V2Vla3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhZGp1c3RXZWVrczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0RGF0ZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuZERhdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyB3ZWVrU3RhcnRzT247CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdGF0aWNEaXNwbGF5OworICAgIHByb3RlY3RlZCBTdHJpbmcgZGF5V2lkdGg7CisgICAgcHJvdGVjdGVkIFN0cmluZyBsYW5ndWFnZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlTm90aWZ5VG9waWNzOworICAgIAorICAgIHB1YmxpYyBEYXRlVGltZVBpY2tlcihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gVEVNUExBVEU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXZhbHVhdGVQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLmV2YWx1YXRlUGFyYW1zKCk7CisKKyAgICAgICAgaWYoZGlzcGxheUZvcm1hdCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJkaXNwbGF5Rm9ybWF0IiwgZmluZFN0cmluZyhkaXNwbGF5Rm9ybWF0KSk7CisgICAgICAgIGlmKGRpc3BsYXlXZWVrcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJkaXNwbGF5V2Vla3MiLCBmaW5kU3RyaW5nKGRpc3BsYXlXZWVrcykpOworICAgICAgICBpZihhZGp1c3RXZWVrcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJhZGp1c3RXZWVrcyIsIGZpbmRWYWx1ZShhZGp1c3RXZWVrcywgQm9vbGVhbi5jbGFzcykpOworCisgICAgICAgIGlmKGRpc2FibGVkICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImRpc2FibGVkIiwgZmluZFZhbHVlKGRpc2FibGVkLCBCb29sZWFuLmNsYXNzKSk7CisKKyAgICAgICAgaWYoc3RhcnREYXRlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInN0YXJ0RGF0ZSIsIGZvcm1hdChmaW5kVmFsdWUoc3RhcnREYXRlKSkpOworICAgICAgICBpZihlbmREYXRlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImVuZERhdGUiLCBmb3JtYXQoZmluZFZhbHVlKGVuZERhdGUpKSk7CisgICAgICAgIGlmKHdlZWtTdGFydHNPbiAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ3ZWVrU3RhcnRzT24iLCBmaW5kU3RyaW5nKHdlZWtTdGFydHNPbikpOworICAgICAgICBpZihzdGF0aWNEaXNwbGF5ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInN0YXRpY0Rpc3BsYXkiLCBmaW5kVmFsdWUoc3RhdGljRGlzcGxheSwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZihkYXlXaWR0aCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJkYXlXaWR0aCIsIGZpbmRWYWx1ZShkYXlXaWR0aCwgSW50ZWdlci5jbGFzcykpOworICAgICAgICBpZihsYW5ndWFnZSAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJsYW5ndWFnZSIsIGZpbmRTdHJpbmcobGFuZ3VhZ2UpKTsKKyAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInZhbHVlIiwgZm9ybWF0KGZpbmRWYWx1ZSh2YWx1ZSkpKTsKKyAgIAorICAgICAgICBpZihpY29uUGF0aCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpY29uUGF0aCIsIGZpbmRTdHJpbmcoaWNvblBhdGgpKTsKKyAgICAgICAgaWYoZm9ybWF0TGVuZ3RoICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImZvcm1hdExlbmd0aCIsIGZpbmRTdHJpbmcoZm9ybWF0TGVuZ3RoKSk7CisgICAgICAgIGlmKHRvZ2dsZVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigidG9nZ2xlVHlwZSIsIGZpbmRTdHJpbmcodG9nZ2xlVHlwZSkpOworICAgICAgICBpZih0b2dnbGVEdXJhdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0b2dnbGVEdXJhdGlvbiIsIGZpbmRWYWx1ZSh0b2dnbGVEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5jbGFzcykpOworICAgICAgICBpZih0eXBlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInR5cGUiLCBmaW5kU3RyaW5nKHR5cGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0eXBlIiwgImRhdGUiKTsKKyAgICAgICAgaWYodGVtcGxhdGVDc3NQYXRoICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRlbXBsYXRlQ3NzUGF0aCIsIGZpbmRTdHJpbmcodGVtcGxhdGVDc3NQYXRoKSk7CisgICAgICAgIGlmKHZhbHVlTm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInZhbHVlTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyh2YWx1ZU5vdGlmeVRvcGljcykpOworICAgICAgICAKKyAgICAgICAgLy8gZm9ybWF0IHRoZSB2YWx1ZSB0byBSRkMgMzM5OQorICAgICAgICBpZihwYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KCJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5hbWVWYWx1ZSIsIHBhcmFtZXRlcnMuZ2V0KCJ2YWx1ZSIpKTsgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihwYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5hbWVWYWx1ZSIsIGZvcm1hdChmaW5kVmFsdWUoKFN0cmluZylwYXJhbWV0ZXJzLmdldCgibmFtZSIpKSkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gZ2VuZXJhdGUgYSByYW5kb20gSUQgaWYgbm90IGV4cGxpY2l0bHkgc2V0IGFuZCBub3QgcGFyc2luZyB0aGUgY29udGVudAorICAgICAgICBCb29sZWFuIHBhcnNlQ29udGVudCA9IChCb29sZWFuKXN0YWNrLmdldENvbnRleHQoKS5nZXQoSGVhZC5QQVJTRV9DT05URU5UKTsKKyAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZUlkID0gKHBhcnNlQ29udGVudCAhPSBudWxsID8gIXBhcnNlQ29udGVudCA6IHRydWUpOworICAgICAgICAKKyAgICAgICAgYWRkUGFyYW1ldGVyKCJwdXNoSWQiLCBnZW5lcmF0ZUlkKTsKKyAgICAgICAgaWYgKCh0aGlzLmlkID09IG51bGwgfHwgdGhpcy5pZC5sZW5ndGgoKSA9PSAwKSAmJiBnZW5lcmF0ZUlkKSB7CisgICAgICAgICAgICAvLyByZXNvbHZlcyBNYXRoLmFicyhJbnRlZ2VyLk1JTl9WQUxVRSkgaXNzdWUgcmVwb3J0ZWQgYnkgRmluZEJ1Z3MgCisgICAgICAgICAgICAvLyBodHRwOi8vZmluZGJ1Z3Muc291cmNlZm9yZ2UubmV0L2J1Z0Rlc2NyaXB0aW9ucy5odG1sI1JWX0FCU09MVVRFX1ZBTFVFX09GX1JBTkRPTV9JTlQKKyAgICAgICAgICAgIGludCBuZXh0SW50ID0gUkFORE9NLm5leHRJbnQoKTsKKyAgICAgICAgICAgIG5leHRJbnQgPSBuZXh0SW50ID09IEludGVnZXIuTUlOX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUgOiBNYXRoLmFicyhuZXh0SW50KTsgIAorICAgICAgICAgICAgdGhpcy5pZCA9ICJ3aWRnZXRfIiArIFN0cmluZy52YWx1ZU9mKG5leHRJbnQpOworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpZCIsIHRoaXMuaWQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIEBTdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2UKKyAgICBwdWJsaWMgdm9pZCBzZXRUaGVtZShTdHJpbmcgdGhlbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0VGhlbWUodGhlbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhlbWUoKSB7CisgICAgICAgIHJldHVybiAiYWpheCI7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IklmIHRydWUsIHdlZWtseSBzaXplIG9mIGNhbGVuZGFyIGNoYW5nZXMgdG8gYWNvbW9kYXRlIHRoZSBtb250aCBpZiBmYWxzZSwiICsKKyAgICAgICAgICAgICAgICAiIDQyIGRheSBmb3JtYXQgaXMgdXNlZCIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGp1c3RXZWVrcyhTdHJpbmcgYWRqdXN0V2Vla3MpIHsKKyAgICAgICAgdGhpcy5hZGp1c3RXZWVrcyA9IGFkanVzdFdlZWtzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkhvdyB0byByZW5kZXIgdGhlIG5hbWVzIG9mIHRoZSBkYXlzIGluIHRoZSBoZWFkZXIobmFycm93LCBhYmJyIG9yIHdpZGUpIiwgZGVmYXVsdFZhbHVlPSJuYXJyb3ciKQorICAgIHB1YmxpYyB2b2lkIHNldERheVdpZHRoKFN0cmluZyBkYXlXaWR0aCkgeworICAgICAgICB0aGlzLmRheVdpZHRoID0gZGF5V2lkdGg7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVG90YWwgd2Vla3MgdG8gZGlzcGxheSIsIHR5cGU9IkludGVnZXIiLCBkZWZhdWx0VmFsdWU9IjYiKQorICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlXZWVrcyhTdHJpbmcgZGlzcGxheVdlZWtzKSB7CisgICAgICAgIHRoaXMuZGlzcGxheVdlZWtzID0gZGlzcGxheVdlZWtzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249Ikxhc3QgYXZhaWxhYmxlIGRhdGUgaW4gdGhlIGNhbGVuZGFyIHNldCIsIHR5cGU9IkRhdGUiLCBkZWZhdWx0VmFsdWU9IjI5NDEtMTAtMTIiKQorICAgIHB1YmxpYyB2b2lkIHNldEVuZERhdGUoU3RyaW5nIGVuZERhdGUpIHsKKyAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJGaXJzdCBhdmFpbGFibGUgZGF0ZSBpbiB0aGUgY2FsZW5kYXIgc2V0IiwgdHlwZT0iRGF0ZSIsIGRlZmF1bHRWYWx1ZT0iMTQ5Mi0xMC0xMiIpCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKFN0cmluZyBzdGFydERhdGUpIHsKKyAgICAgICAgdGhpcy5zdGFydERhdGUgPSBzdGFydERhdGU7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRGlzYWJsZSBhbGwgaW5jcmVtZW50YWwgY29udHJvbHMsIG11c3QgcGljayBhIGRhdGUgaW4gdGhlIGN1cnJlbnQgZGlzcGxheSIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0aWNEaXNwbGF5KFN0cmluZyBzdGF0aWNEaXNwbGF5KSB7CisgICAgICAgIHRoaXMuc3RhdGljRGlzcGxheSA9IHN0YXRpY0Rpc3BsYXk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQWRqdXN0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIDA9PVN1bmRheS4uNj09U2F0dXJkYXkiLCB0eXBlPSJJbnRlZ2VyIiwgZGVmYXVsdFZhbHVlPSIwIikKKyAgICBwdWJsaWMgdm9pZCBzZXRXZWVrU3RhcnRzT24oU3RyaW5nIHdlZWtTdGFydHNPbikgeworICAgICAgICB0aGlzLndlZWtTdGFydHNPbiA9IHdlZWtTdGFydHNPbjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJMYW5ndWFnZSB0byBkaXNwbGF5IHRoaXMgd2lkZ2V0IGluIiwgZGVmYXVsdFZhbHVlPSJicm93ZXIncyBzcGVjaWZpZWQgcHJlZmVycmVkIGxhbmd1YWdlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJBIHBhdHRlcm4gdXNlZCBmb3IgdGhlIHZpc3VhbCBkaXNwbGF5IG9mIHRoZSBmb3JtYXR0ZWQgZGF0ZSwgZS5nLiBkZC9NTS95eXl5IikKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5Rm9ybWF0KFN0cmluZyBkaXNwbGF5Rm9ybWF0KSB7CisgICAgICAgIHRoaXMuZGlzcGxheUZvcm1hdCA9IGRpc3BsYXlGb3JtYXQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVHlwZSBvZiBmb3JtYXR0aW5nIHVzZWQgZm9yIHZpc3VhbCBkaXNwbGF5LiBQb3NzaWJsZSB2YWx1ZXMgYXJlICIgKworICAgICAgICAgICAgICAgICJsb25nLCBzaG9ydCwgbWVkaXVtIG9yIGZ1bGwiLCBkZWZhdWx0VmFsdWU9InNob3J0IikKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXRMZW5ndGgoU3RyaW5nIGZvcm1hdExlbmd0aCkgeworICAgICAgICB0aGlzLmZvcm1hdExlbmd0aCA9IGZvcm1hdExlbmd0aDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJQYXRoIHRvIGljb24gdXNlZCBmb3IgdGhlIGRyb3Bkb3duIikKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uUGF0aChTdHJpbmcgaWNvblBhdGgpIHsKKyAgICAgICAgdGhpcy5pY29uUGF0aCA9IGljb25QYXRoOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkR1cmF0aW9uIG9mIHRvZ2dsZSBpbiBtaWxsaXNlY29uZHMiLCB0eXBlPSJJbnRlZ2VyIiwgZGVmYXVsdFZhbHVlPSIxMDAiKQorICAgIHB1YmxpYyB2b2lkIHNldFRvZ2dsZUR1cmF0aW9uKFN0cmluZyB0b2dnbGVEdXJhdGlvbikgeworICAgICAgICB0aGlzLnRvZ2dsZUR1cmF0aW9uID0gdG9nZ2xlRHVyYXRpb247CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcGlja2VyIG9uIHRoZSBkcm9wZG93bi4gUG9zc2libGUgdmFsdWVzIGFyZSAnZGF0ZSciICsKKyAgICAgICAgICAgICAgICAiIGZvciBhIERhdGVUaW1lUGlja2VyLCBhbmQgJ3RpbWUnIGZvciBhIHRpbWVQaWNrZXIiLCBkZWZhdWx0VmFsdWU9ImRhdGUiKQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJvZ2dsZSB0eXBlIG9mIHRoZSBkcm9wZG93bi4gUG9zc2libGUgdmFsdWVzIGFyZSBwbGFpbix3aXBlLGV4cGxvZGUsZmFkZSIsIGRlZmF1bHRWYWx1ZT0icGxhaW4iKQorICAgIHB1YmxpYyB2b2lkIHNldFRvZ2dsZVR5cGUoU3RyaW5nIHRvZ2dsZVR5cGUpIHsKKyAgICAgICAgdGhpcy50b2dnbGVUeXBlID0gdG9nZ2xlVHlwZTsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGVtcGxhdGUgY3NzIHBhdGgiKQorICAgIHB1YmxpYyB2b2lkIHNldFRlbXBsYXRlQ3NzUGF0aChTdHJpbmcgdGVtcGxhdGVDc3NQYXRoKSB7CisgICAgICAgIHRoaXMudGVtcGxhdGVDc3NQYXRoID0gdGVtcGxhdGVDc3NQYXRoOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJQcmVzZXQgdGhlIHZhbHVlIG9mIGlucHV0IGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyLnNldFZhbHVlKGFyZzApOworICAgIH0KKyAgICAKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBkZWxpbW1pdGVkIGxpc3Qgb2YgdG9waWNzIHRoYXQgd2lsbCBwdWJsaXNoZWQgd2hlbiBhIHZhbHVlIGlzIHNlbGVjdGVkIikKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZU5vdGlmeVRvcGljcyhTdHJpbmcgdmFsdWVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy52YWx1ZU5vdGlmeVRvcGljcyA9IHZhbHVlTm90aWZ5VG9waWNzOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBmb3JtYXQoT2JqZWN0IG9iaikgeworICAgICAgICBpZihvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRkMzMzM5X1BBVFRFUk4sIChEYXRlKSBvYmopOworICAgICAgICB9IGVsc2UgaWYob2JqIGluc3RhbmNlb2YgQ2FsZW5kYXIpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRkMzMzM5X1BBVFRFUk4sICgoQ2FsZW5kYXIpIG9iaikuZ2V0VGltZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRyeSB0byBwYXJzZSBhIGRhdGUKKyAgICAgICAgICAgIFN0cmluZyBkYXRlU3RyID0gb2JqLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZihkYXRlU3RyLmVxdWFsc0lnbm9yZUNhc2UoInRvZGF5IikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJGQzMzMzlfUEFUVEVSTiwgbmV3IERhdGUoKSk7CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgRGF0ZSBkYXRlID0gbnVsbDsKKyAgICAgICAgICAgIC8vZm9ybWF0cyB1c2VkIHRvIHBhcnNlIHRoZSBkYXRlCisgICAgICAgICAgICBMaXN0PERhdGVGb3JtYXQ+IGZvcm1hdHMgPSBuZXcgQXJyYXlMaXN0PERhdGVGb3JtYXQ+KCk7CisgICAgICAgICAgICBmb3JtYXRzLmFkZChuZXcgU2ltcGxlRGF0ZUZvcm1hdChSRkMzMzM5X0ZPUk1BVCkpOworICAgICAgICAgICAgZm9ybWF0cy5hZGQoU2ltcGxlRGF0ZUZvcm1hdC5nZXRUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCkpOworICAgICAgICAgICAgZm9ybWF0cy5hZGQoU2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCkpOworICAgICAgICAgICAgZm9ybWF0cy5hZGQoU2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5NRURJVU0pKTsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKFNpbXBsZURhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkpOworICAgICAgICAgICAgZm9ybWF0cy5hZGQoU2ltcGxlRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5MT05HKSk7CisgICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5Rm9ybWF0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRpc3BsYXlGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGdldFBhcmFtZXRlcnMoKS5nZXQoImRpc3BsYXlGb3JtYXQiKSk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKGRpc3BsYXlGb3JtYXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSBpdCB0aGVuICh0aGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGJ5IERvam8sIG5vdCBqYXZhIGNvZGUpCisgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiQ2Fubm90IHVzZSBhdHRyaWJ1dGUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoRGF0ZUZvcm1hdCBmb3JtYXQgOiBmb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGZvcm1hdC5wYXJzZShkYXRlU3RyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRkMzMzM5X1BBVFRFUk4sIGRhdGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8va2VlcCBnb2luZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAvLyBsYXN0IHJlc291cmNlLCBhc3N1bWUgYWxyZWFkeSBpbiBjb3JyZWN0L2RlZmF1bHQgZm9ybWF0CisgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVW5hYmxlIHRvIHBhcnNlIGRhdGUgIiArIGRhdGVTdHIpOworICAgICAgICAgICByZXR1cm4gZGF0ZVN0cjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9EaXYuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvRGl2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NTc4OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvRGl2LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdBdHRyaWJ1dGU7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICogPHA+CisgKiBUaGlzIHRhZyBnZW5lcmF0ZXMgYW4gSFRNTCBkaXYgdGhhdCBsb2FkcyBpdHMgY29udGVudCB1c2luZyBhbiBYTUxIdHRwUmVxdWVzdCBjYWxsLCB2aWEKKyAqIHRoZSBkb2pvIGZyYW1ld29yay4gV2hlbiB0aGUgInVwZGF0ZUZyZXEiIGlzIHNldCB0aGUgYnVpbHQgaW4gdGltZXIgd2lsbCBzdGFydCBhdXRvbWF0aWNhbGx5IGFuZCAKKyAqIHJlbG9hZCB0aGUgZGl2IGNvbnRlbnQgd2l0aCB0aGUgdmFsdWUgb2YgInVwZGF0ZUZyZXEiIGFzIHRoZSByZWZyZXNoIHBlcmlvZChpbiBtaWxsaXNlY29uZHMpLgorICogVG9waWNzIGNhbiBiZSB1c2VkIHRvIHN0b3Aoc3RvcFRpbWVyTGlzdGVuVG9waWNzKSBhbmQgc3RhcnQoc3RhcnRUaW1lckxpc3RlblRvcGljcykgdGhpcyB0aW1lci4gIAorICogPC9wPgorICogPHA+CisgKiBXaGVuIHVzZWQgaW5zaWRlIGEgInRhYmJlZHBhbmVsIiB0YWcsIGVhY2ggZGl2IGJlY29tZXMgYSB0YWIuIFNvbWUgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWMKKyAqIHRvIHRoaXMgdXNlIGNhc2UsIGxpa2U6CisgKiA8dWw+CisgKiAgIDxsaT5yZWZyZXNoT25TaG93OiBkaXYgY29udGVudCBpcyByZWFsb2RlZCB3aGVuIHRhYiBpcyBzZWxlY3RlZDwvbGk+CisgKiAgIDxsaT5jbG9zYWJsZTogVGFiIHdpbGwgaGF2ZSBjbG9zZSBidXR0b248L2xpPgorICogICA8bGk+cHJlbG9hZDogbG9hZCBkaXYgY29udGVudCBhZnRlciBwYWdlIGlzIGxvYWRlZDwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIAorICogPHA+RXhhbXBsZXM8L3A+CisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogJmx0O3N4OmRpdiBocmVmPSIleyN1cmx9IiZndDtJbml0aWFsIENvbnRlbnQmbHQ7L3N4OmRpdiZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUyIC0tPgorICogJmx0O2ltZyBpZD0iaW5kaWNhdG9yIiBzcmM9IiR7cGFnZUNvbnRleHQucmVxdWVzdC5jb250ZXh0UGF0aH0vaW1hZ2VzL2luZGljYXRvci5naWYiIHN0eWxlPSJkaXNwbGF5Om5vbmUiLyZndDsKKyAqICZsdDtzeDpkaXYgaHJlZj0iJXsjdXJsfSIgdXBkYXRlRnJlcT0iMjAwMCIgaW5kaWNhdG9yPSJpbmRpY2F0b3IiJmd0OworICogICBJbml0aWFsIENvbnRlbnQKKyAqICZsdDsvc3g6ZGl2Jmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTMgLS0+CisgKiAmbHQ7Zm9ybSBpZD0iZm9ybSImZ3Q7CisgKiAgICZsdDtsYWJlbCBmb3I9InRleHRJbnB1dCImZ3Q7VGV4dCB0byBiZSBzdWJtaXRlZCB3aGVuIGRpdiByZWxvYWRzJmx0Oy9sYWJlbCZndDsKKyAqICAgJmx0O2lucHV0IHR5cGU9dGV4dGJveCBpZD0idGV4dElucHV0IiBuYW1lPSJkYXRhIiZndDsKKyAqICZsdDsvZm9ybSZndDsKKyAqICZsdDtzeDpkaXYgCisgKiAgICAgIGhyZWY9IiV7I3VybH0iIAorICogICAgICB1cGRhdGVGcmVxPSIzMDAwIgorICogICAgICBsaXN0ZW5Ub3BpY3M9Ii9yZWZyZXNoIgorICogICAgICBzdGFydFRpbWVyTGlzdGVuVG9waWNzPSIvc3RhcnRUaW1lciIKKyAqICAgICAgc3RvcFRpbWVyTGlzdGVuVG9waWNzPSIvc3RvcFRpbWVyIgorICogICAgICBoaWdobGlnaHRDb2xvcj0icmVkIgorICogICAgICBmb3JtSWQ9ImZvcm0iJmd0OworICogIEluaXRpYWwgQ29udGVudAorICogJmx0Oy9zeDpkaXYmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqLworQFN0cnV0c1RhZyhuYW1lPSJkaXYiLCB0bGRUYWdDbGFzcz0ib3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpLkRpdlRhZyIsIGRlc2NyaXB0aW9uPSJSZW5kZXIgSFRNTCBkaXYgcHJvdmlkaW5nIGNvbnRlbnQgZnJvbSByZW1vdGUgY2FsbCB2aWEgQUpBWCIpCitwdWJsaWMgY2xhc3MgRGl2IGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVCZWFuIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gImRpdiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfQ0xPU0UgPSAiZGl2LWNsb3NlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfTkFNRSA9IERpdi5jbGFzcy5nZXROYW1lKCk7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZUZyZXE7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhdXRvU3RhcnQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkZWxheTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdG9wVGltZXJMaXN0ZW5Ub3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZWZyZXNoT25TaG93OworICAgIHByb3RlY3RlZCBTdHJpbmcgY2xvc2FibGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVsb2FkOworICAgIAorICAgIHB1YmxpYyBEaXYoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPcGVuVGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiBURU1QTEFURTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIFRFTVBMQVRFX0NMT1NFOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlRXh0cmFQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLmV2YWx1YXRlRXh0cmFQYXJhbXMoKTsKKworICAgICAgICBpZiAodXBkYXRlRnJlcSAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ1cGRhdGVGcmVxIiwgZmluZFZhbHVlKHVwZGF0ZUZyZXEsIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgaWYgKGF1dG9TdGFydCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJhdXRvU3RhcnQiLCBmaW5kVmFsdWUoYXV0b1N0YXJ0LCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmIChyZWZyZXNoT25TaG93ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInJlZnJlc2hPblNob3ciLCBmaW5kVmFsdWUocmVmcmVzaE9uU2hvdywgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZiAoZGVsYXkgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZGVsYXkiLCBmaW5kVmFsdWUoZGVsYXksIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgaWYgKHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic3RhcnRUaW1lckxpc3RlblRvcGljcyIsIGZpbmRTdHJpbmcoc3RhcnRUaW1lckxpc3RlblRvcGljcykpOworICAgICAgICBpZiAoc3RvcFRpbWVyTGlzdGVuVG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInN0b3BUaW1lckxpc3RlblRvcGljcyIsIGZpbmRTdHJpbmcoc3RvcFRpbWVyTGlzdGVuVG9waWNzKSk7CisgICAgICAgIGlmIChzZXBhcmF0ZVNjcmlwdHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic2VwYXJhdGVTY3JpcHRzIiwgZmluZFZhbHVlKHNlcGFyYXRlU2NyaXB0cywgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZiAoY2xvc2FibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiY2xvc2FibGUiLCBmaW5kVmFsdWUoY2xvc2FibGUsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgaWYgKHByZWxvYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigicHJlbG9hZCIsIGZpbmRWYWx1ZShwcmVsb2FkLCBCb29sZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU3RhcnQgdGltZXIgYXV0b21hdGljYWxseSIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9InRydWUiKQorICAgIHB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChTdHJpbmcgYXV0b1N0YXJ0KSB7CisgICAgICAgIHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGZldGNoaW5nIHRoZSBjb250ZW50IChpbiBtaWxsaXNlY29uZHMpIiwgIHR5cGU9IkludGVnZXIiKQorICAgIHB1YmxpYyB2b2lkIHNldERlbGF5KFN0cmluZyBkZWxheSkgeworICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSG93IG9mdGVuIHRvIHJlbG9hZCB0aGUgY29udGVudCAoaW4gbWlsbGlzZWNvbmRzKSIsIHR5cGU9IkludGVnZXIiKQorICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZUZyZXEoU3RyaW5nIHVwZGF0ZUludGVydmFsKSB7CisgICAgICAgIHRoaXMudXBkYXRlRnJlcSA9IHVwZGF0ZUludGVydmFsOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRvcGljcyB0aGF0IHdpbGwgc3RhcnQgdGhlIHRpbWVyIChmb3IgYXV0b3VwZGF0ZSkiKQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MoU3RyaW5nIHN0YXJ0VGltZXJMaXN0ZW5Ub3BpYykgeworICAgICAgICB0aGlzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MgPSBzdGFydFRpbWVyTGlzdGVuVG9waWM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVG9waWNzIHRoYXQgd2lsbCBzdG9wIHRoZSB0aW1lciAoZm9yIGF1dG91cGRhdGUpIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9wVGltZXJMaXN0ZW5Ub3BpY3MoU3RyaW5nIHN0b3BUaW1lckxpc3RlblRvcGljKSB7CisgICAgICAgIHRoaXMuc3RvcFRpbWVyTGlzdGVuVG9waWNzID0gc3RvcFRpbWVyTGlzdGVuVG9waWM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29udGVudCB3aWxsIGJlIGxvYWRlZCB3aGVuIGRpdiBiZWNvbWVzIHZpc2libGUsIHVzZWQgb25seSBpbnNpZGUgdGhlIHRhYmJlZHBhbmVsIHRhZyIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25TaG93KFN0cmluZyByZWZyZXNoT25TaG93KSB7CisgICAgICAgIHRoaXMucmVmcmVzaE9uU2hvdyA9IHJlZnJlc2hPblNob3c7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2hvdyBhIGNsb3NlIGJ1dHRvbiB3aGVuIHRoZSBkaXYgaXMgaW5zaWRlIGEgJ3RhYmJlZHBhbmVsJyIsIGRlZmF1bHRWYWx1ZT0iZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldENsb3NhYmxlKFN0cmluZyBjbG9zYWJsZSkgeworICAgICAgICB0aGlzLmNsb3NhYmxlID0gY2xvc2FibGU7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iTG9hZCBjb250ZW50IHdoZW4gcGFnZSBpcyBsb2FkZWQiLCB0eXBlPSJCb29sZWFuIiwgZGVmYXVsdFZhbHVlPSJ0cnVlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVsb2FkKFN0cmluZyBwcmVsb2FkKSB7CisgICAgICAgIHRoaXMucHJlbG9hZCA9IHByZWxvYWQ7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiQ29sb3IgdXNlZCB0byBwZXJmb3JtIGEgaGlnaGxpZ2h0IGVmZmVjdCBvbiB0aGlzIGVsZW1lbnQiLCAKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gIm5vbmUiKQorICAgIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodENvbG9yKFN0cmluZyBoaWdobGlnaHRDb2xvcikgeworICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9yID0gaGlnaGxpZ2h0Q29sb3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9IZWFkLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL0hlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRhNTEwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9IZWFkLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZTsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IG5vdGljZSAtLT4KKyAqIFRoZSAiaGVhZCIgdGFnIHJlbmRlcnMgcmVxdWlyZWQgSmF2YVNjcmlwdCBjb2RlIHRvIGNvbmZpZ3VyZSBEb2pvIGFuZCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byB1c2UKKyAqIGFueSBvZiB0aGUgdGFncyBpbmNsdWRlZCBpbiB0aGUgRG9qbyBwbHVnaW4uPC9wPgorICogPCEtLSBFTkQgU05JUFBFVDogbm90aWNlIC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGphdmFkb2MgLS0+CisgKiA8cD48L3A+CisgKiAKKyAqIDxwPlRvIGRlYnVnIGphdmFzY3JpcHQgZXJyb3JzIHNldCB0aGUgImRlYnVnIiBhdHRyaWJ1dGUgdG8gdHJ1ZSwgd2hpY2ggd2lsbCBkaXNwbGF5IERvam8gCisgKiAoYW5kIFN0cnV0cykgd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS4gQ29yZSBEb2pvIGZpbGVzIGFyZSBieSBkZWZhdWx0CisgKiBjb21wcmVzc2VkLCB0byBpbXByb3ZlIGxvYWRpbmcgdGltZSwgd2hpY2ggbWFrZXMgdGhlbSB2ZXJ5IGhhcmQgdG8gcmVhZC4gVG8gZGVidWcgRG9qbyBhbmQgU3RydXRzCisgKiB3aWRnZXRzLCBzZXQgdGhlICJjb21wcmVzc2VkIiBhdHRyaWJ1dGUgdG8gdHJ1ZS4gTWFrZSBzdXJlIHRvIHR1cm4gdGhpcyBvcHRpb24gb2ZmIGJlZm9yZQorICogbW92aW5nIHlvdXIgcHJvamVjdCBpbnRvIHByb2R1Y3Rpb24sIGFzIHVuY29tcHJlc3NlZCBmaWxlcyB3aWxsIHRha2UgbG9uZ2VyIHRvIGRvd25sb2FkLgorICogPC9wPgorICogPHA+Rm9yIHRyb3VibGVzaG9vdGluZyBqYXZhc2NyaXB0IHByb2JsZW1zIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBpcyByZWNvbW1lbmRlZDo8L3A+CisgKiA8cHJlPgorICogICAmbHQ7c3g6aGVhZCBkZWJ1Zz0idHJ1ZSIgY2FjaGU9ImZhbHNlIiBjb21wcmVzc2VkPSJmYWxzZSIgLyZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPkRvam8gZmlsZXMgYXJlIGxvYWRlZCBhcyByZXF1aXJlZCBieSB0aGUgRG9qbyBsb2FkaW5nIG1lY2hhbmlzbS4gVGhlIHByb2JsZW0gd2l0aCB0aGlzCisgKiBhcHByb2FjaCBpcyB0aGF0IHRoZSBmaWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgYnJvd3Nlciwgc28gcmVsb2FkaW5nIGEgcGFnZSBvciBuYXZpZ2F0aW5nCisgKiB0byBhIGRpZmZlcmVudCBwYWdlIHRoYXQgdXNlcyB0aGUgc2FtZSB3aWRnZXRzIHdpbGwgY2F1c2UgdGhlIGZpbGVzIHRvIGJlIHJlbG9hZGVkLiBUbyBzb2x2ZSAKKyAqIHRoaXMgcHJvYmxlbSBhIGN1c3RvbSBEb2pvIHByb2ZpbGUgaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgRG9qbyBwbHVnaW4uIFRoaXMgcHJvZmlsZSBjb250YWlucworICogdGhlIGZpbGVzIHJlcXVpcmVkIGJ5IHRoZSB0YWdzIGluIHRoZSBEb2pvIHBsdWdpbiwgYWxsIGluIG9uZSBmaWxlICg1MjRLYiksIHdoaWNoIGlzIGNhY2hlZCAKKyAqIGJ5IHRoZSBicm93c2VyLiBUaGlzIGZpbGUgd2lsbCB0YWtlIGxvbmdlciB0byBsb2FkIGJ5IHRoZSBicm93c2VyIGJ1dCBpdCB3aWxsIGJlIGRvd25sb2FkZWQgCisgKiBvbmx5IG9uY2UuIEJ5IGRlZmF1bHQgdGhlICJjYWNoZSIgYXR0cmlidXRlIGlzIHNldCB0byBmYWxzZS48L3A+CisgKiAKKyAqIDxwPlNvbWUgdGFncyBsaWtlIHRoZSAiZGF0ZXRpbWVwaWNrZXIiIGNhbiB1c2UgZGlmZmVyZW50IGxvY2FsZXMsIHRvIHVzZSBhIGxvY2FsZQorICogdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVxdWVzdCBsb2NhbGUsIGl0IG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSAiZXh0cmFMb2NhbGVzIiAKKyAqIGF0dHJpYnV0ZS4gVGhpcyBhdHRyaWJ1dGUgY2FuIGNvbnRhaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGUgbmFtZXMuIEZyb20KKyAqIERvam8ncyBkb2N1bWVudGF0aW9uOjwvcD4KKyAqIAorICogPHA+CisgKiBUaGUgbG9jYWxlIGlzIGEgc2hvcnQgc3RyaW5nLCBkZWZpbmVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCB3aGljaCBjb25mb3JtcyB0byBSRkMgMzA2NiAKKyAqIChodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCkgdXNlZCBpbiB0aGUgSFRNTCBzcGVjaWZpY2F0aW9uLiAKKyAqIEl0IGNvbnNpc3RzIG9mIHNob3J0IGlkZW50aWZpZXJzLCB0eXBpY2FsbHkgdHdvIGNoYXJhY3RlcnMgCisgKiBsb25nIHdoaWNoIGFyZSBjYXNlLWluc2Vuc2l0aXZlLiBOb3RlIHRoYXQgRG9qbyB1c2VzIGRhc2ggc2VwYXJhdG9ycywgbm90IHVuZGVyc2NvcmVzIGxpa2UgCisgKiBKYXZhIChlLmcuICJlbi11cyIsIG5vdCAiZW5fVVMiKS4gVHlwaWNhbGx5IGNvdW50cnkgY29kZXMgYXJlIHVzZWQgaW4gdGhlIG9wdGlvbmFsIHNlY29uZCAKKyAqIGlkZW50aWZpZXIsIGFuZCBhZGRpdGlvbmFsIHZhcmlhbnRzIG1heSBiZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBpcyAiamEiOyAKKyAqIEphcGFuZXNlIGluIEphcGFuIGlzICJqYS1qcCIuIE5vdGljZSB0aGF0IHRoZSBsb3dlciBjYXNlIGlzIGludGVudGlvbmFsIC0tIHdoaWxlIERvam8gCisgKiB3aWxsIG9mdGVuIGNvbnZlcnQgYWxsIGxvY2FsZXMgdG8gbG93ZXJjYXNlIHRvIG5vcm1hbGl6ZSB0aGVtLCBpdCBpcyB0aGUgbG93ZXJjYXNlIHRoYXQgCisgKiBtdXN0IGJlIHVzZWQgd2hlbiBkZWZpbmluZyB5b3VyIHJlc291cmNlcy4KKyAqIDwvcD4KKyAqIAorICogPHA+VGhlICJsb2NhbGUiIGF0dHJpYnV0ZSBjb25maWd1cmVzIERvam8ncyBsb2NhbGU6PC9wPgorICogCisgKiA8cD4iVGhlIGxvY2FsZSBEb2pvIHVzZXMgb24gYSBwYWdlIG1heSBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgZGpDb25maWcubG9jYWxlLiBUaGlzIG1heSBiZSAKKyAqIGRvbmUgdG8gYWNjb21vZGF0ZSBhcHBsaWNhdGlvbnMgd2l0aCBhIGtub3duIHVzZXIgcHJvZmlsZSBvciBzZXJ2ZXIgcGFnZXMgd2hpY2ggZG8gbWFudWFsCisgKiBhc3NlbWJseSBhbmQgYXNzdW1lIGEgY2VydGFpbiBsb2NhbGUuIFlvdSBtYXkgYWxzbyBzZXQgZGpDb25maWcuZXh0cmFMb2NhbGUgdG8gbG9hZCAKKyAqIGxvY2FsaXphdGlvbnMgaW4gYWRkaXRpb24gdG8geW91ciBvd24sIGluIGNhc2UgeW91IHdhbnQgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgCisgKiB0cmFuc2xhdGlvbiBvciBoYXZlIG11bHRpcGxlIGxhbmd1YWdlcyBhcHBlYXIgb24geW91ciBwYWdlLiI8L3A+CisgKiAKKyAqIDxwPlRvIGltcHJvdmUgbG9hZGluZyB0aW1lLCB0aGUgcHJvcGVydHkgInBhcnNlQ29udGVudCIgaXMgc2V0IHRvIGZhbHNlIGJ5IGRlZmF1bHQuIFRoaXMgcHJvcGVydHkgd2lsbAorICogaW5zdHJ1Y3QgRG9qbyB0byBvbmx5IGJ1aWxkIHdpZGdldHMgdXNpbmcgc3BlY2lmaWMgZWxlbWVudCBpZHMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZQorICogRG9qbyB3aWxsIHNjYW4gdGhlIHdob2xlIGRvY3VtZW50IGxvb2tpbmcgZm9yIHdpZGdldHMuPC9wPgorICogCisgKiA8cD5Eb2pvIDAuNC4zIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIERvam8gcGx1Z2luLCB0byB1c2UgYSBkaWZmZXJlbnQgRG9qbyB2ZXJzaW9uLCB0aGUgCisgKiAiYmFzZVJlbGF0aXZlUGF0aCIgYXR0cmlidXRlIGNhbiBiZSBzZXQgdG8gdGhlIFVSTCBvZiB0aGUgRG9qbyByb290IGZvbGRlciBvbiB5b3VyIGFwcGxpY2F0aW9uLgorICogPC9wPgorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqCisgKiA8cC8+IDxiPkV4YW1wbGVzPC9iPgorICoKKyAqIDxwcmU+CisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogJmx0OyVAIHRhZ2xpYiBwcmVmaXg9InN4IiB1cmk9Ii9zdHJ1dHMtZG9qby10YWdzIiAlJmd0OworICogJmx0O2hlYWQmZ3Q7CisgKiAgICZsdDt0aXRsZSZndDtNeSBwYWdlJmx0Oy90aXRsZSZndDsKKyAqICAgJmx0O3N4OmhlYWQvJmd0OworICogJmx0Oy9oZWFkJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiA8L3ByZT4KKyAqCisgKiA8cHJlPgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqICZsdDslQCB0YWdsaWIgcHJlZml4PSJzeCIgdXJpPSIvc3RydXRzLWRvam8tdGFncyIgJSZndDsKKyAqICZsdDtoZWFkJmd0OworICogICAmbHQ7dGl0bGUmZ3Q7TXkgcGFnZSZsdDsvdGl0bGUmZ3Q7CisgKiAgICZsdDtzeDpoZWFkIGRlYnVnPSJ0cnVlIiBleHRyYUxvY2FsZXM9ImVuLXVzLG5sLW5sLGRlLWRlIi8mZ3Q7CisgKiAmbHQ7L2hlYWQmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqIDwvcHJlPgorICoKKyAqLworQFN0cnV0c1RhZyhuYW1lPSJoZWFkIiwgdGxkQm9keUNvbnRlbnQ9ImVtcHR5IiwgdGxkVGFnQ2xhc3M9Im9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aS5IZWFkVGFnIiwKKyAgICBkZXNjcmlwdGlvbj0iUmVuZGVyIGEgY2h1bmsgb2YgSEVBRCBmb3IgeW91ciBIVE1MIGZpbGUiKQorQFN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZQorcHVibGljIGNsYXNzIEhlYWQgZXh0ZW5kcyBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5IZWFkIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9ICJoZWFkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRV9DT05URU5UID0gInN0cnV0cy5kb2pvLmhlYWQucGFyc2VDb250ZW50IjsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBkZWJ1ZzsKKyAgICBwcml2YXRlIFN0cmluZyBjb21wcmVzc2VkOworICAgIHByaXZhdGUgU3RyaW5nIGJhc2VSZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFMb2NhbGVzOworICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsZTsKKyAgICBwcml2YXRlIFN0cmluZyBjYWNoZTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZUNvbnRlbnQ7CisgICAgCisgICAgcHVibGljIEhlYWQoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIFRFTVBMQVRFOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZVBhcmFtcygpOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaXMuZGVidWcgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZGVidWciLCBmaW5kVmFsdWUodGhpcy5kZWJ1ZywgQm9vbGVhbi5jbGFzcykpOworICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImNvbXByZXNzZWQiLCBmaW5kVmFsdWUodGhpcy5jb21wcmVzc2VkLCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmICh0aGlzLmJhc2VSZWxhdGl2ZVBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiYmFzZVJlbGF0aXZlUGF0aCIsIGZpbmRTdHJpbmcodGhpcy5iYXNlUmVsYXRpdmVQYXRoKSk7CisgICAgICAgIGlmICh0aGlzLmV4dHJhTG9jYWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxlcyA9IGZpbmRTdHJpbmcodGhpcy5leHRyYUxvY2FsZXMpOworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJleHRyYUxvY2FsZXMiLCBsb2NhbGVzLnNwbGl0KCIsIikpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxvY2FsZSAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJsb2NhbGUiLCBmaW5kU3RyaW5nKHRoaXMubG9jYWxlKSk7CisgICAgICAgIGlmICh0aGlzLmNhY2hlICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImNhY2hlIiwgZmluZFZhbHVlKHRoaXMuY2FjaGUsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgaWYgKHRoaXMucGFyc2VDb250ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJvb2xlYW4gc2hvdWxkUGFyc2VDb250ZW50ID0gKEJvb2xlYW4pIGZpbmRWYWx1ZSh0aGlzLnBhcnNlQ29udGVudCwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInBhcnNlQ29udGVudCIsIHNob3VsZFBhcnNlQ29udGVudCk7CisgICAgICAgICAgICBzdGFjay5nZXRDb250ZXh0KCkucHV0KFBBUlNFX0NPTlRFTlQsIHNob3VsZFBhcnNlQ29udGVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInBhcnNlQ29udGVudCIsIGZhbHNlKTsKKyAgICAgICAgICAgIHN0YWNrLmdldENvbnRleHQoKS5wdXQoUEFSU0VfQ09OVEVOVCwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZQorICAgIHB1YmxpYyB2b2lkIHNldFRoZW1lKFN0cmluZyB0aGVtZSkgeworICAgICAgICBzdXBlci5zZXRUaGVtZSh0aGVtZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhlbWUoKSB7CisgICAgICAgIHJldHVybiAiYWpheCI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7CisgICAgICAgIHJldHVybiBkZWJ1ZyAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKGRlYnVnKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJFbmFibGUgRG9qbyBkZWJ1ZyBtZXNzYWdlcyIsIGRlZmF1bHRWYWx1ZT0iZmFsc2UiLCB0eXBlPSJCb29sZWFuIikKKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlVzZSBjb21wcmVzc2VkIHZlcnNpb24gb2YgZG9qby5qcyIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIsIHR5cGU9IkJvb2xlYW4iKQorICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzZWQoU3RyaW5nIGNvbXByZXNzZWQpIHsKKyAgICAgICAgdGhpcy5jb21wcmVzc2VkID0gY29tcHJlc3NlZDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb250ZXh0IHJlbGF0aXZlIHBhdGggb2YgRG9qbyBkaXN0cmlidXRpb24gZm9sZGVyIiwgZGVmYXVsdFZhbHVlPSIvc3RydXRzL2Rvam8iKQorICAgIHB1YmxpYyB2b2lkIHNldEJhc2VSZWxhdGl2ZVBhdGgoU3RyaW5nIGJhc2VSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgdGhpcy5iYXNlUmVsYXRpdmVQYXRoID0gYmFzZVJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGUgbmFtZXMgdG8gYmUgbG9hZGVkIGJ5IERvam8sIGxvY2FsZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyBpbiBSRkMzMDY2IikKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYUxvY2FsZXMoU3RyaW5nIGV4dHJhTG9jYWxlcykgeworICAgICAgICB0aGlzLmV4dHJhTG9jYWxlcyA9IGV4dHJhTG9jYWxlczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJEZWZhdWx0IGxvY2FsZSB0byBiZSB1c2VkIGJ5IERvam8sIGxvY2FsZSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGFzIGluIFJGQzMwNjYiKQorICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlVzZSBTdHJ1dHMgRG9qbyBwcm9maWxlLCB3aGljaCBjb250YWlucyBhbGwgU3RydXRzIHdpZGdldHMgaW4gb25lIGZpbGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBiZSBjaGFjaGVkIGJ5ICIgKworICAgICAgICAgICAgICAgICJ0aGUgYnJvd3NlciIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIsIHR5cGU9IkJvb2xlYW4iKQorICAgIHB1YmxpYyB2b2lkIHNldENhY2hlKFN0cmluZyBjYWNoZSkgeworICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgfQorICAgIAorICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlBhcnNlIHRoZSB3aG9sZSBkb2N1bWVudCBmb3Igd2lkZ2V0cyIsIGRlZmF1bHRWYWx1ZT0iZmFsc2UiLCB0eXBlPSJCb29sZWFuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRlbnQoU3RyaW5nIHBhcnNlQ29udGVudCkgeworICAgICAgICB0aGlzLnBhcnNlQ29udGVudCA9IHBhcnNlQ29udGVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1JlbW90ZUJlYW4uamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvUmVtb3RlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWFmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1JlbW90ZUJlYW4uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKKworcHVibGljIGludGVyZmFjZSBSZW1vdGVCZWFuIHsKKworICAgIHZvaWQgc2V0TGlzdGVuVG9waWNzKFN0cmluZyB0b3BpY3MpOworCisgICAgdm9pZCBzZXROb3RpZnlUb3BpY3MoU3RyaW5nIHRvcGljcyk7CisKKyAgICB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpOworCisgICAgdm9pZCBzZXRFcnJvclRleHQoU3RyaW5nIGVycm9yVGV4dCk7CisKKyAgICB2b2lkIHNldEFmdGVyTm90aWZ5VG9waWNzKFN0cmluZyBhZnRlck5vdGlmeVRvcGljcyk7CisKKyAgICB2b2lkIHNldEJlZm9yZU5vdGlmeVRvcGljcyhTdHJpbmcgYmVmb3JlTm90aWZ5VG9waWNzKTsKKyAgICAKKyAgICB2b2lkIHNldEVycm9yTm90aWZ5VG9waWNzKFN0cmluZyBlcnJvck5vdGlmeVRvcGljcyk7CisKKyAgICB2b2lkIHNldEV4ZWN1dGVTY3JpcHRzKFN0cmluZyBleGVjdXRlU2NyaXB0cyk7CisKKyAgICB2b2lkIHNldExvYWRpbmdUZXh0KFN0cmluZyBsb2FkaW5nVGV4dCk7CisKKyAgICB2b2lkIHNldEhhbmRsZXIoU3RyaW5nIGhhbmRsZXIpOworCisgICAgdm9pZCBzZXRGb3JtRmlsdGVyKFN0cmluZyBmb3JtRmlsdGVyKTsKKworICAgIHZvaWQgc2V0Rm9ybUlkKFN0cmluZyBmb3JtSWQpOworCisgICAgdm9pZCBzZXRTaG93RXJyb3JUcmFuc3BvcnRUZXh0KFN0cmluZyBzaG93RXJyb3IpOworCisgICAgdm9pZCBzZXRTaG93TG9hZGluZ1RleHQoU3RyaW5nIHNob3dMb2FkaW5nVGV4dCk7CisKKyAgICB2b2lkIHNldEluZGljYXRvcihTdHJpbmcgaW5kaWNhdG9yKTsKKyAgICAKKyAgICB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOworICAgIAorICAgIHZvaWQgc2V0Q3NzU3R5bGUoU3RyaW5nIHN0eWxlKTsKKyAgICAKKyAgICB2b2lkIHNldENzc0NsYXNzKFN0cmluZyBjc3NDbGFzcyk7CisgICAgCisgICAgdm9pZCBzZXRIaWdobGlnaHRDb2xvcihTdHJpbmcgY29sb3IpOworICAgIAorICAgIHZvaWQgc2V0SGlnaGxpZ2h0RHVyYXRpb24oU3RyaW5nIGNvbG9yKTsKKyAgICAKKyAgICB2b2lkIHNldFNlcGFyYXRlU2NyaXB0cyhTdHJpbmcgc2VwYXJhdGVTY3JpcHRzKTsKKyAgICAKKyAgICB2b2lkIHNldFRyYW5zcG9ydChTdHJpbmcgdHJhbnNwb3J0KTsKKyAgICAKKyAgICB2b2lkIHNldFBhcnNlQ29udGVudChTdHJpbmcgcGFyc2VDb250ZW50KTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvU3VibWl0LmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1N1Ym1pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNWIwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1N1Ym1pdC5qYXZhCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuRm9ybUJ1dHRvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZTsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIFJlbmRlcnMgYSBzdWJtaXQgYnV0dG9uIHRoYXQgY2FuIHN1Ym1pdCBhIGZvcm0gYXN5bmNocm9ub3VzbHkuCisgKiBUaGUgc3VibWl0IGNhbiBoYXZlIHRocmVlIGRpZmZlcmVudCB0eXBlcyBvZiByZW5kZXJpbmc6CisgKiA8dWw+CisgKiA8bGk+aW5wdXQ6IHJlbmRlcnMgYXMgaHRtbCAmbHQ7aW5wdXQgdHlwZT0ic3VibWl0Ii4uLiZndDs8L2xpPgorICogPGxpPmltYWdlOiByZW5kZXJzIGFzIGh0bWwgJmx0O2lucHV0IHR5cGU9ImltYWdlIi4uLiZndDs8L2xpPgorICogPGxpPmJ1dHRvbjogcmVuZGVycyBhcyBodG1sICZsdDtidXR0b24gdHlwZT0ic3VibWl0Ii4uLiZndDs8L2xpPgorICogPC91bD4KKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIGJ1dHRvbiB0eXBlIGhhcyBhZHZhbnRhZ2VzIGJ5IGFkZGluZyB0aGUgcG9zc2liaWxpdHkgdG8gc2VwZXJhdGUgdGhlIHN1Ym1pdHRlZCB2YWx1ZSBmcm9tIHRoZQorICogdGV4dCBzaG93biBvbiB0aGUgYnV0dG9uIGZhY2UsIGJ1dCBoYXMgaXNzdWVzIHdpdGggTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIGF0IGxlYXN0IHVwIHRvIDYuMAorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqCisgKiA8cD5FeGFtcGxlczwvcD4KKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAmbHQ7c3g6c3VibWl0IHZhbHVlPSIleydTdWJtaXQnfSIgLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICoKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAmbHQ7c3g6c3VibWl0IHR5cGU9ImltYWdlIiB2YWx1ZT0iJXsnU3VibWl0J30iIGxhYmVsPSJTdWJtaXQgdGhlIGZvcm0iIHNyYz0ic3VibWl0LmdpZiIvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTMgLS0+CisgKiAmbHQ7c3g6c3VibWl0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IiV7J1N1Ym1pdCd9IiBsYWJlbD0iU3VibWl0IHRoZSBmb3JtIi8mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU0IC0tPgorICogJmx0O2RpdiBpZD0iZGl2MSImZ3Q7RGl2IDEmbHQ7L2RpdiZndDsKKyAqICZsdDtzOnVybCBpZD0iYWpheFRlc3QiIHZhbHVlPSIvQWpheFRlc3QuYWN0aW9uIi8mZ3Q7CisgKgorICogJmx0O3N4OnN1Ym1pdCBpZD0ibGluazEiIGhyZWY9IiV7YWpheFRlc3R9IiB0YXJnZXQ9ImRpdjEiIC8mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNCAtLT4KKyAqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU1IC0tPgorICogJmx0O3M6Zm9ybSBpZD0iZm9ybSIgYWN0aW9uPSJBamF4VGVzdCImZ3Q7CisgKiAgICAgICZsdDtpbnB1dCB0eXBlPSJ0ZXh0Ym94IiBuYW1lPSJkYXRhIiZndDsKKyAqICAgICAgJmx0O3N4OnN1Ym1pdCAvJmd0OworICogJmx0Oy9zOmZvcm0mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlNSAtLT4KKyAqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU2IC0tPgorICogJmx0O3M6Zm9ybSBpZD0iZm9ybSIgYWN0aW9uPSJBamF4VGVzdCImZ3Q7CisgKiAgICAgICZsdDtpbnB1dCB0eXBlPSJ0ZXh0Ym94IiBuYW1lPSJkYXRhIiZndDsKKyAqICZsdDsvczpmb3JtJmd0OworICoKKyAqICZsdDtzeDpzdWJtaXQgZm9ybUlkPSJmb3JtIiAvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTYgLS0+CisgKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlNyAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYmVmb3JlIiwgZnVuY3Rpb24oZXZlbnQsIHdpZGdldCl7CisgKiAgICAgYWxlcnQoJ2luc2lkZSBhIHRvcGljIGV2ZW50LiBiZWZvcmUgcmVxdWVzdCcpOworICogICAgIC8vZXZlbnQ6IHNldCBldmVudC5jYW5jZWwgPSB0cnVlLCB0byBjYW5jZWwgcmVxdWVzdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OworICoKKyAqICZsdDtzeDpzdWJtaXQgYmVmb3JlTm90aWZ5VG9waWNzPSIvYmVmb3JlIiAvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTcgLS0+CisgKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlOCAtLT4KKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYWZ0ZXIiLCBmdW5jdGlvbihkYXRhLCByZXF1ZXN0LCB3aWRnZXQpeworICogICAgIGFsZXJ0KCdpbnNpZGUgYSB0b3BpYyBldmVudC4gYWZ0ZXIgcmVxdWVzdCcpOworICogICAgIC8vZGF0YSA6IHRleHQgcmV0dXJuZWQgZnJvbSByZXF1ZXN0KHRoZSBodG1sKQorICogICAgIC8vcmVxdWVzdDogWE1MSHR0cFJlcXVlc3Qgb2JqZWN0CisgKiAgICAgLy93aWRnZXQ6IHdpZGdldCB0aGF0IHB1Ymxpc2hlZCB0aGUgdG9waWMKKyAqIH0pOworICogJmx0Oy9zY3JpcHQmZ3Q7CisgKgorICogJmx0O3N4OnN1Ym1pdCBhZnRlck5vdGlmeVRvcGljcz0iL2FmdGVyIiBoaWdobGlnaHRDb2xvcj0icmVkIiBocmVmPSIleyNhamF4VGVzdH0iIC8mZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlOCAtLT4KKyAqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGU5IC0tPgorICogJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiJmd0OworICogZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoIi9lcnJvciIsIGZ1bmN0aW9uKGVycm9yLCByZXF1ZXN0LCB3aWRnZXQpeworICogICAgIGFsZXJ0KCdpbnNpZGUgYSB0b3BpYyBldmVudC4gb24gZXJyb3InKTsKKyAqICAgICAvL2Vycm9yIDogZXJyb3Igb2JqZWN0IChlcnJvci5tZXNzYWdlIGhhcyB0aGUgZXJyb3IgbWVzc2FnZSkKKyAqICAgICAvL3JlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IG9iamVjdAorICogICAgIC8vd2lkZ2V0OiB3aWRnZXQgdGhhdCBwdWJsaXNoZWQgdGhlIHRvcGljCisgKiB9KTsKKyAqICZsdDsvc2NyaXB0Jmd0OworICoKKyAqICZsdDtpbWcgaWQ9ImluZDEiIHNyYz0iJHtwYWdlQ29udGV4dC5yZXF1ZXN0LmNvbnRleHRQYXRofS9pbWFnZXMvaW5kaWNhdG9yLmdpZiIgc3R5bGU9ImRpc3BsYXk6bm9uZSIvJmd0OworICogJmx0O3N4OnN1Ym1pdCBlcnJvck5vdGlmeVRvcGljcz0iL2Vycm9yIiBpbmRpY2F0b3I9ImluZDEiIGhyZWY9IiV7I2FqYXhUZXN0fSIgLyZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGU5IC0tPgorICovCitAU3RydXRzVGFnKG5hbWU9InN1Ym1pdCIsIHRsZFRhZ0NsYXNzPSJvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWkuU3VibWl0VGFnIiwgZGVzY3JpcHRpb249IlJlbmRlciBhIHN1Ym1pdCBidXR0b24iKQorcHVibGljIGNsYXNzIFN1Ym1pdCBleHRlbmRzIEZvcm1CdXR0b24gaW1wbGVtZW50cyBSZW1vdGVCZWFuIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdWJtaXQuY2xhc3MpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHRyYW5zaWVudCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOworCisgICAgZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BFTl9URU1QTEFURSA9ICJzdWJtaXQiOworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFTVBMQVRFID0gInN1Ym1pdC1jbG9zZSI7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhyZWY7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvclRleHQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleGVjdXRlU2NyaXB0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRpbmdUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlzdGVuVG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1JZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1GaWx0ZXI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzcmM7CisgICAgcHJvdGVjdGVkIFN0cmluZyBub3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG93RXJyb3JUcmFuc3BvcnRUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5kaWNhdG9yOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0xvYWRpbmdUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGJlZm9yZU5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFmdGVyTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBoaWdobGlnaHRDb2xvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhpZ2hsaWdodER1cmF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhamF4QWZ0ZXJWYWxpZGF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdGVTY3JpcHRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJhbnNwb3J0OworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyc2VDb250ZW50OworCisgICAgcHVibGljIFN1Ym1pdChWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gVEVNUExBVEU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0T3BlblRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gT1BFTl9URU1QTEFURTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZVBhcmFtcygpIHsKKyAgICAgICAgaWYgKChrZXkgPT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICJTdWJtaXQiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgoa2V5ICE9IG51bGwpKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSAiJXtnZXRUZXh0KCciK2tleSArIicpfSI7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5ldmFsdWF0ZVBhcmFtcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV2YWx1YXRlRXh0cmFQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLmV2YWx1YXRlRXh0cmFQYXJhbXMoKTsKKworICAgICAgICBpZiAoaHJlZiAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJocmVmIiwgZmluZFN0cmluZyhocmVmKSk7CisgICAgICAgIGlmIChlcnJvclRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZXJyb3JUZXh0IiwgZmluZFN0cmluZyhlcnJvclRleHQpKTsKKyAgICAgICAgaWYgKGxvYWRpbmdUZXh0ICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImxvYWRpbmdUZXh0IiwgZmluZFN0cmluZyhsb2FkaW5nVGV4dCkpOworICAgICAgICBpZiAoZXhlY3V0ZVNjcmlwdHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZXhlY3V0ZVNjcmlwdHMiLCBmaW5kVmFsdWUoZXhlY3V0ZVNjcmlwdHMsIEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgaWYgKGxpc3RlblRvcGljcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJsaXN0ZW5Ub3BpY3MiLCBmaW5kU3RyaW5nKGxpc3RlblRvcGljcykpOworICAgICAgICBpZiAobm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcobm90aWZ5VG9waWNzKSk7CisgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImhhbmRsZXIiLCBmaW5kU3RyaW5nKGhhbmRsZXIpKTsKKyAgICAgICAgaWYgKGZvcm1JZCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJmb3JtSWQiLCBmaW5kU3RyaW5nKGZvcm1JZCkpOworICAgICAgICBpZiAoZm9ybUZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJmb3JtRmlsdGVyIiwgZmluZFN0cmluZyhmb3JtRmlsdGVyKSk7CisgICAgICAgIGlmIChzcmMgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic3JjIiwgZmluZFN0cmluZyhzcmMpKTsKKyAgICAgICAgaWYgKGluZGljYXRvciAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpbmRpY2F0b3IiLCBmaW5kU3RyaW5nKGluZGljYXRvcikpOworICAgICAgICBpZiAodGFyZ2V0cyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0YXJnZXRzIiwgZmluZFN0cmluZyh0YXJnZXRzKSk7CisgICAgICAgIGlmIChzaG93TG9hZGluZ1RleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic2hvd0xvYWRpbmdUZXh0IiwgZmluZFN0cmluZyhzaG93TG9hZGluZ1RleHQpKTsKKyAgICAgICAgaWYgKHNob3dMb2FkaW5nVGV4dCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzaG93TG9hZGluZ1RleHQiLCBmaW5kU3RyaW5nKHNob3dMb2FkaW5nVGV4dCkpOworICAgICAgICBpZiAoYmVmb3JlTm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImJlZm9yZU5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoYmVmb3JlTm90aWZ5VG9waWNzKSk7CisgICAgICAgIGlmIChhZnRlck5vdGlmeVRvcGljcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJhZnRlck5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoYWZ0ZXJOb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgaWYgKGVycm9yTm90aWZ5VG9waWNzICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImVycm9yTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyhlcnJvck5vdGlmeVRvcGljcykpOworICAgICAgICBpZiAoaGlnaGxpZ2h0Q29sb3IgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaGlnaGxpZ2h0Q29sb3IiLCBmaW5kU3RyaW5nKGhpZ2hsaWdodENvbG9yKSk7CisgICAgICAgIGlmIChoaWdobGlnaHREdXJhdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJoaWdobGlnaHREdXJhdGlvbiIsIGZpbmRTdHJpbmcoaGlnaGxpZ2h0RHVyYXRpb24pKTsKKyAgICAgICAgaWYgKHNlcGFyYXRlU2NyaXB0cyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzZXBhcmF0ZVNjcmlwdHMiLCBmaW5kVmFsdWUoc2VwYXJhdGVTY3JpcHRzLCBCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigidHJhbnNwb3J0IiwgZmluZFN0cmluZyh0cmFuc3BvcnQpKTsKKyAgICAgICAgaWYgKHBhcnNlQ29udGVudCAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJwYXJzZUNvbnRlbnQiLCBmaW5kVmFsdWUocGFyc2VDb250ZW50LCBCb29sZWFuLmNsYXNzKSk7CisKKyAgICAgICAgQm9vbGVhbiB2YWxpZGF0ZVZhbHVlID0gZmFsc2U7CisgICAgICAgIGlmICh2YWxpZGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlID0gKEJvb2xlYW4pIGZpbmRWYWx1ZSh2YWxpZGF0ZSwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInZhbGlkYXRlIiwgdmFsaWRhdGVWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBGb3JtIGZvcm0gPSAoRm9ybSkgZmluZEFuY2VzdG9yKEZvcm0uY2xhc3MpOworICAgICAgICBpZiAoZm9ybSAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJwYXJlbnRUaGVtZSIsIGZvcm0uZ2V0VGhlbWUoKSk7CisKKyAgICAgICAgaWYgKGFqYXhBZnRlclZhbGlkYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiYWpheEFmdGVyVmFsaWRhdGlvbiIsIGZpbmRWYWx1ZShhamF4QWZ0ZXJWYWxpZGF0aW9uLCBCb29sZWFuLmNsYXNzKSk7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgYSByYW5kb20gSUQgaWYgbm90IGV4cGxpY2l0bHkgc2V0IGFuZCBub3QgcGFyc2luZyB0aGUgY29udGVudAorICAgICAgICBCb29sZWFuIHBhcnNlQ29udGVudCA9IChCb29sZWFuKXN0YWNrLmdldENvbnRleHQoKS5nZXQoSGVhZC5QQVJTRV9DT05URU5UKTsKKyAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZUlkID0gKHBhcnNlQ29udGVudCAhPSBudWxsID8gIXBhcnNlQ29udGVudCA6IHRydWUpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigicHVzaElkIiwgZ2VuZXJhdGVJZCk7CisgICAgICAgIGlmICgodGhpcy5pZCA9PSBudWxsIHx8IHRoaXMuaWQubGVuZ3RoKCkgPT0gMCkgJiYgZ2VuZXJhdGVJZCkgeworICAgICAgICAgICAgLy8gcmVzb2x2ZXMgTWF0aC5hYnMoSW50ZWdlci5NSU5fVkFMVUUpIGlzc3VlIHJlcG9ydGVkIGJ5IEZpbmRCdWdzCisgICAgICAgICAgICAvLyBodHRwOi8vZmluZGJ1Z3Muc291cmNlZm9yZ2UubmV0L2J1Z0Rlc2NyaXB0aW9ucy5odG1sI1JWX0FCU09MVVRFX1ZBTFVFX09GX1JBTkRPTV9JTlQKKyAgICAgICAgICAgIGludCBuZXh0SW50ID0gUkFORE9NLm5leHRJbnQoKTsKKyAgICAgICAgICAgIG5leHRJbnQgPSBuZXh0SW50ID09IEludGVnZXIuTUlOX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUgOiBNYXRoLmFicyhuZXh0SW50KTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSAid2lkZ2V0XyIgKyBTdHJpbmcudmFsdWVPZihuZXh0SW50KTsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaWQiLCB0aGlzLmlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2UKKyAgICBwdWJsaWMgdm9pZCBzZXRUaGVtZShTdHJpbmcgdGhlbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0VGhlbWUodGhlbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhlbWUoKSB7CisgICAgICAgIHJldHVybiAiYWpheCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgY29uY3JldGUgYnV0dG9uIHN1cHBvcnRzIHRoZSB0eXBlICJpbWFnZSIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gdG8gaW5kaWNhdGUgdHlwZSBpbWFnZSBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNJbWFnZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0byBiZSBhYmxlIHRvIHJlbmRlciBib2R5IGluIGEgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYWx3YXlzIGJlZm9yZSB0aGUgdGVtcGxhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmQoV3JpdGVyIHdyaXRlciwgU3RyaW5nIGJvZHkpIHsKKyAgICAgICAgZXZhbHVhdGVQYXJhbXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiYm9keSIsIGJvZHkpOworCisgICAgICAgICAgICBtZXJnZVRlbXBsYXRlKHdyaXRlciwgYnVpbGRUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGdldERlZmF1bHRUZW1wbGF0ZSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoImVycm9yIHdoZW4gcmVuZGVyaW5nIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBwb3BDb21wb25lbnRTdGFjaygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRvcGljIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSByZW1vdGUgY2FsbCIpCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGVuVG9waWNzKFN0cmluZyBsaXN0ZW5Ub3BpY3MpIHsKKyAgICAgICAgdGhpcy5saXN0ZW5Ub3BpY3MgPSBsaXN0ZW5Ub3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIFVSTCB0byBjYWxsIHRvIG9idGFpbiB0aGUgY29udGVudC4gTm90ZTogSWYgdXNlZCB3aXRoIGFqYXggY29udGV4dCwgdGhlIHZhbHVlIG11c3QgYmUgc2V0IGFzIGFuIHVybCB0YWcgdmFsdWUuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7CisgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIHRleHQgdG8gZGlzcGxheSB0byB0aGUgdXNlciBpZiB0aGUgaXMgYW4gZXJyb3IgZmV0Y2hpbmcgdGhlIGNvbnRlbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yVGV4dChTdHJpbmcgZXJyb3JUZXh0KSB7CisgICAgICAgIHRoaXMuZXJyb3JUZXh0ID0gZXJyb3JUZXh0OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkphdmFzY3JpcHQgY29kZSBpbiB0aGUgZmV0Y2hlZCBjb250ZW50IHdpbGwgYmUgZXhlY3V0ZWQiLCB0eXBlPSJCb29sZWFuIiwgZGVmYXVsdFZhbHVlPSJmYWxzZSIpCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0ZVNjcmlwdHMoU3RyaW5nIGV4ZWN1dGVTY3JpcHRzKSB7CisgICAgICAgIHRoaXMuZXhlY3V0ZVNjcmlwdHMgPSBleGVjdXRlU2NyaXB0czsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUZXh0IHRvIGJlIHNob3duIHdoaWxlIGNvbnRlbnQgaXMgYmVpbmcgZmV0Y2hlZCIsIGRlZmF1bHRWYWx1ZT0iTG9hZGluZy4uLiIpCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1RleHQoU3RyaW5nIGxvYWRpbmdUZXh0KSB7CisgICAgICAgIHRoaXMubG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJKYXZhc2NyaXB0IGZ1bmN0aW9uIG5hbWUgdGhhdCB3aWxsIG1ha2UgdGhlIHJlcXVlc3QiKQorICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoU3RyaW5nIGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJGdW5jdGlvbiBuYW1lIHVzZWQgdG8gZmlsdGVyIHRoZSBmaWVsZHMgb2YgdGhlIGZvcm0uIikKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtRmlsdGVyKFN0cmluZyBmb3JtRmlsdGVyKSB7CisgICAgICAgIHRoaXMuZm9ybUZpbHRlciA9IGZvcm1GaWx0ZXI7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRm9ybSBpZCB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXJpYWxpemVkIGFuZCBwYXNzZWQgYXMgcGFyYW1ldGVycyIpCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybUlkKFN0cmluZyBmb3JtSWQpIHsKKyAgICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSWQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU3VwcGx5IGFuIGltYWdlIHNyYyBmb3IgPGk+aW1hZ2U8L2k+IHR5cGUgc3VibWl0IGJ1dHRvbi4gV2lsbCBoYXZlIG5vIGVmZmVjdCBmb3IgdHlwZXMgPGk+aW5wdXQ8L2k+IGFuZCA8aT5idXR0b248L2k+LiIpCisgICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKKyAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaWRzIG9mIHRoZSBlbGVtZW50cyB3aG9zZSBjb250ZW50IHdpbGwgYmUgdXBkYXRlZCIpCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0cyhTdHJpbmcgdGFyZ2V0cykgeworICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSByZXF1ZXN0LCBhbmQgb24gZXJyb3JzIikKKyAgICBwdWJsaWMgdm9pZCBzZXROb3RpZnlUb3BpY3MoU3RyaW5nIG5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLm5vdGlmeVRvcGljcyA9IG5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJTZXQgd2hldGhlciBlcnJvcnMgd2lsbCBiZSBzaG93biBvciBub3QiLCB0eXBlPSJCb29sZWFuIiwgZGVmYXVsdFZhbHVlPSJ0cnVlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93RXJyb3JUcmFuc3BvcnRUZXh0KFN0cmluZyBzaG93RXJyb3JUcmFuc3BvcnRUZXh0KSB7CisgICAgICAgIHRoaXMuc2hvd0Vycm9yVHJhbnNwb3J0VGV4dCA9IHNob3dFcnJvclRyYW5zcG9ydFRleHQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2V0IGluZGljYXRvciIpCisgICAgcHVibGljIHZvaWQgc2V0SW5kaWNhdG9yKFN0cmluZyBpbmRpY2F0b3IpIHsKKyAgICAgICAgdGhpcy5pbmRpY2F0b3IgPSBpbmRpY2F0b3I7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2hvdyBsb2FkaW5nIHRleHQgb24gdGFyZ2V0cyIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93TG9hZGluZ1RleHQoU3RyaW5nIHNob3dMb2FkaW5nVGV4dCkgeworICAgICAgICB0aGlzLnNob3dMb2FkaW5nVGV4dCA9IHNob3dMb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgY3NzIGNsYXNzIHRvIHVzZSBmb3IgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0Q3NzQ2xhc3MoU3RyaW5nIGNzc0NsYXNzKSB7CisgICAgICAgIHN1cGVyLnNldENzc0NsYXNzKGNzc0NsYXNzKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgY3NzIHN0eWxlIHRvIHVzZSBmb3IgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0Q3NzU3R5bGUoU3RyaW5nIGNzc1N0eWxlKSB7CisgICAgICAgIHN1cGVyLnNldENzc1N0eWxlKGNzc1N0eWxlKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgaWQgdG8gdXNlIGZvciB0aGUgZWxlbWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgIHN1cGVyLnNldElkKGlkKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgbmFtZSB0byBzZXQgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgdHlwZSBvZiBzdWJtaXQgdG8gdXNlLiBWYWxpZCB2YWx1ZXMgYXJlIDxpPmlucHV0PC9pPiwgIiArCisgICAgICAgICI8aT5idXR0b248L2k+IGFuZCA8aT5pbWFnZTwvaT4uIiwgZGVmYXVsdFZhbHVlPSJpbnB1dCIpCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICBzdXBlci5zZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlByZXNldCB0aGUgdmFsdWUgb2YgaW5wdXQgZWxlbWVudC4iKQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iTGFiZWwgZXhwcmVzc2lvbiB1c2VkIGZvciByZW5kZXJpbmcgYSBlbGVtZW50IHNwZWNpZmljIGxhYmVsIikKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIuc2V0TGFiZWwobGFiZWwpOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIGRlbGltbWl0ZWQgbGlzdCBvZiB0b3BpY3MgdGhhdCB3aWxsIHB1Ymxpc2hlZCBhZnRlciB0aGUgcmVxdWVzdChpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcykiKQorICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyTm90aWZ5VG9waWNzKFN0cmluZyBhZnRlck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzID0gYWZ0ZXJOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGJlZm9yZSB0aGUgcmVxdWVzdCIpCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlTm90aWZ5VG9waWNzKFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MgPSBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGFmdGVyIHRoZSByZXF1ZXN0KGlmIHRoZSByZXF1ZXN0IGZhaWxzKSIpCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JOb3RpZnlUb3BpY3MoU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MgPSBlcnJvck5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uID0gIkNvbG9yIHVzZWQgdG8gcGVyZm9ybSBhIGhpZ2hsaWdodCBlZmZlY3Qgb24gdGhlIGVsZW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgJ3RhcmdldHMnIGF0dHJpYnV0ZSIsCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICJub25lIikKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWdobGlnaHRDb2xvcihTdHJpbmcgaGlnaGxpZ2h0Q29sb3IpIHsKKyAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvciA9IGhpZ2hsaWdodENvbG9yOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb24gPSAiRHVyYXRpb24gb2YgaGlnaGxpZ2h0IGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuIE9ubHkgdmFsaWQgaWYgJ2hpZ2hsaWdodENvbG9yJyBhdHRyaWJ1dGUgaXMgc2V0IiwKKyAgICAgICAgZGVmYXVsdFZhbHVlID0gIjEwMDAiKQorICAgIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodER1cmF0aW9uKFN0cmluZyBoaWdobGlnaHREdXJhdGlvbikgeworICAgICAgICB0aGlzLmhpZ2hsaWdodER1cmF0aW9uID0gaGlnaGxpZ2h0RHVyYXRpb247CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbiA9ICJQZXJmb3JtIEFqYXggdmFsaWRhdGlvbi4gJ2FqYXhWYWxpZGF0aW9uJyBpbnRlcmNlcHRvciBtdXN0IGJlIGFwcGxpZWQgdG8gYWN0aW9uIiwgdHlwZT0iQm9vbGVhbiIsCisgICAgICAgIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIpCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoU3RyaW5nIHZhbGlkYXRlKSB7CisgICAgICAgIHRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uID0gIk1ha2UgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QgaWYgdmFsaWRhdGlvbiBzdWNjZWVkcy4gT25seSB2YWxpZCBpZiAndmFsaWRhdGUnIGlzICd0cnVlJyIsIHR5cGU9IkJvb2xlYW4iLAorICAgICAgICBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiKQorICAgIHB1YmxpYyB2b2lkIHNldEFqYXhBZnRlclZhbGlkYXRpb24oU3RyaW5nIGFqYXhBZnRlclZhbGlkYXRpb24pIHsKKyAgICAgICAgdGhpcy5hamF4QWZ0ZXJWYWxpZGF0aW9uID0gYWpheEFmdGVyVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuc2V0QWN0aW9uKGFjdGlvbik7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iUnVuIHNjcmlwdHMgaW4gYSBzZXBhcmF0ZSBzY29wZSwgdW5pcXVlIGZvciBlYWNoIHRhZyIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdGVTY3JpcHRzKFN0cmluZyBzZXBhcmF0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5zZXBhcmF0ZVNjcmlwdHMgPSBzZXBhcmF0ZVNjcmlwdHM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVHJhbnNwb3J0IHVzZWQgYnkgRG9qbyB0byBtYWtlIHRoZSByZXF1ZXN0IiwgZGVmYXVsdFZhbHVlPSJYTUxIVFRQVHJhbnNwb3J0IikKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnQoU3RyaW5nIHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJQYXJzZSByZXR1cm5lZCBIVE1MIGZvciBEb2pvIHdpZGdldHMiLCBkZWZhdWx0VmFsdWU9InRydWUiLCB0eXBlPSJCb29sZWFuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRlbnQoU3RyaW5nIHBhcnNlQ29udGVudCkgeworICAgICAgICB0aGlzLnBhcnNlQ29udGVudCA9IHBhcnNlQ29udGVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1RhYmJlZFBhbmVsLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1RhYmJlZFBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2Y2I2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvVGFiYmVkUGFuZWwuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNsb3NpbmdVSUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICogVGhlIHRhYmJlZHBhbmVsIHdpZGdldCBpcyBwcmltYXJpbHkgYW4gQUpBWCBjb21wb25lbnQsIHdoZXJlIGVhY2ggdGFiIGNhbiBlaXRoZXIgYmUgbG9jYWwgY29udGVudCBvciByZW1vdGUKKyAqIGNvbnRlbnQgKHJlZnJlc2hlZCBlYWNoIHRpbWUgdGhlIHVzZXIgc2VsZWN0cyB0aGF0IHRhYikuPC9wPgorICogSWYgdGhlIHVzZVNlbGVjdGVkVGFiQ29va2llIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCB0YWIgaXMgc2F2ZWQgaW4gYSBjb29raWUgb24gYWN0aXZhdGlvbi4KKyAqIFdoZW4gY29taW5nIGJhY2sgdG8gdGhpcyB2aWV3LCB0aGUgY29va2llIGlzIHJlYWQgYW5kIHRoZSB0YWIgd2lsbCBiZSBhY3RpdmF0ZWQgYWdhaW4sIHVubGVzcyBhbiBhY3R1YWwgdmFsdWUgZm9yIHRoZQorICogc2VsZWN0ZWRUYWIgYXR0cmlidXRlIGlzIHNwZWNpZmllZC48L3A+CisgKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNvb2tpZSBmZWF0dXJlLCBwbGVhc2UgYmUgc3VyZSB0aGF0IHlvdSBwcm92aWRlIGEgdW5pcXVlIGlkIGZvciB5b3VyIHRhYmJlZHBhbmVsIGNvbXBvbmVudCwKKyAqIHNpbmNlIHRoaXMgd2lsbCBhbHNvIGJlIHRoZSBpZGVudGlmeWluZyBuYW1lIGNvbXBvbmVudCBvZiB0aGUgc3RvcmVkIGNvb2tpZS48L3A+CisgKiA8IS0tIEVORCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICoKKyAqIDxwLz4gPGI+RXhhbXBsZXM8L2I+CisgKiA8cC8+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTEgLS0+CisgKiAmbHQ7c3g6aGVhZCAvJmd0OworICogJmx0O3N4OnRhYmJlZHBhbmVsIGlkPSJ0ZXN0IiAmZ3Q7CisgKiAgICAmbHQ7c3g6ZGl2IGlkPSJvbmUiIGxhYmVsPSJvbmUiIHRoZW1lPSJhamF4IiBsYWJlbHBvc2l0aW9uPSJ0b3AiICZndDsKKyAqICAgICAgICBUaGlzIGlzIHRoZSBmaXJzdCBwYW5lJmx0O2JyLyZndDsKKyAqICAgICAgICAmbHQ7czpmb3JtJmd0OworICogICAgICAgICAgICAmbHQ7czp0ZXh0ZmllbGQgbmFtZT0idHQiIGxhYmVsPSJUZXN0IFRleHQiLyZndDsgICZsdDtici8mZ3Q7CisgKiAgICAgICAgICAgICZsdDtzOnRleHRmaWVsZCBuYW1lPSJ0dDIiIGxhYmVsPSJUZXN0IFRleHQyIi8mZ3Q7CisgKiAgICAgICAgJmx0Oy9zOmZvcm0mZ3Q7CisgKiAgICAmbHQ7L3N4OmRpdiZndDsKKyAqICAgICZsdDtzeDpkaXYgaWQ9InRocmVlIiBsYWJlbD0icmVtb3RlIiB0aGVtZT0iYWpheCIgaHJlZj0iL0FqYXhUZXN0LmFjdGlvbiIgJmd0OworICogICAgICAgIFRoaXMgaXMgdGhlIHJlbW90ZSB0YWIKKyAqICAgICZsdDsvc3g6ZGl2Jmd0OworICogJmx0Oy9zeDp0YWJiZWRwYW5lbCZndDsKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUyIC0tPgorICogJmx0O3N4OmhlYWQgLyZndDsKKyAqICZsdDtzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiZndDsKKyAqIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvYmVmb3JlU2VsZWN0IiwgZnVuY3Rpb24oZXZlbnQsIHRhYiwgdGFiQ29udGFpbmVyKXsKKyAqICAgICBldmVudC5jYW5jZWwgPSB0cnVlOworICogfSk7CisgKiAmbHQ7L3NjcmlwdCZndDsKKyAqIAorICogJmx0O3N4OnRhYmJlZHBhbmVsIGlkPSJ0ZXN0IiBiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3M9Ii9iZWZvcmVTZWxlY3QiJmd0OworICogICAgJmx0O3N4OmRpdiBpZD0idGhyZWUiIGxhYmVsPSJyZW1vdGUiIHRoZW1lPSJhamF4IiBocmVmPSIvQWpheFRlc3QuYWN0aW9uIiAmZ3Q7CisgKiAgICAgICAgT25lIFRhYgorICogICAgJmx0Oy9zeDpkaXYmZ3Q7CisgKiAgICAmbHQ7c3g6ZGl2IGlkPSJ0aHJlZSIgbGFiZWw9InJlbW90ZSIgdGhlbWU9ImFqYXgiIGhyZWY9Ii9BamF4VGVzdC5hY3Rpb24iICZndDsKKyAqICAgICAgICBBbm90aGVyIHRhYgorICogICAgJmx0Oy9zeDpkaXYmZ3Q7CisgKiAmbHQ7L3N4OnRhYmJlZHBhbmVsJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKi8KK0BTdHJ1dHNUYWcobmFtZT0idGFiYmVkcGFuZWwiLCB0bGRUYWdDbGFzcz0ib3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpLlRhYmJlZFBhbmVsVGFnIiwgZGVzY3JpcHRpb249IlJlbmRlciBhIHRhYmJlZFBhbmVsIHdpZGdldC4iKQorcHVibGljIGNsYXNzIFRhYmJlZFBhbmVsIGV4dGVuZHMgQ2xvc2luZ1VJQmVhbiB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEUgPSAidGFiYmVkcGFuZWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0NMT1NFID0gInRhYmJlZHBhbmVsLWNsb3NlIjsKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ09NUE9ORU5UX05BTUUgPSBUYWJiZWRQYW5lbC5jbGFzcy5nZXROYW1lKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdHJhbnNpZW50IFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7ICAgIAorCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZFRhYjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsb3NlQnV0dG9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9MYXlvdXQgOworICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcGxhdGVDc3NQYXRoOworICAgIHByb3RlY3RlZCBTdHJpbmcgYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkaXNhYmxlZFRhYkNzc0NsYXNzOyAKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZVNlbGVjdGVkVGFiQ29va2llOworCisgICAgcHVibGljIFRhYmJlZFBhbmVsKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgaWYgKHNlbGVjdGVkVGFiICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInNlbGVjdGVkVGFiIiwgZmluZFN0cmluZyhzZWxlY3RlZFRhYikpOworICAgICAgICBpZiAoY2xvc2VCdXR0b24gIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiY2xvc2VCdXR0b24iLCBmaW5kU3RyaW5nKGNsb3NlQnV0dG9uKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigiZG9MYXlvdXQiLCBkb0xheW91dCAhPSBudWxsID8gZmluZFZhbHVlKGRvTGF5b3V0LCBCb29sZWFuLmNsYXNzKSA6IEJvb2xlYW4uRkFMU0UpOworICAgICAgICBpZiAobGFiZWxQb3NpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvL2Rvam8gaGFzIHNvbWUgd2VpcmQgbmFtZSBmb3IgbGFiZWwgcG9zaXRpb25zCisgICAgICAgICAgICBpZihsYWJlbFBvc2l0aW9uLmVxdWFsc0lnbm9yZUNhc2UoImxlZnQiKSkKKyAgICAgICAgICAgICAgIGxhYmVsUG9zaXRpb24gPSAibGVmdC1oIjsKKyAgICAgICAgICAgIGlmKGxhYmVsUG9zaXRpb24uZXF1YWxzSWdub3JlQ2FzZSgicmlnaHQiKSkKKyAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uID0gInJpZ2h0LWgiOworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJsYWJlbFBvc2l0aW9uIiwgbnVsbCk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImxhYmVsUG9zaXRpb24iLCBsYWJlbFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcGxhdGVDc3NQYXRoICE9IG51bGwpCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRlbXBsYXRlQ3NzUGF0aCIsIGZpbmRTdHJpbmcodGVtcGxhdGVDc3NQYXRoKSk7CisgICAgICAgIGlmIChiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MiLCBmaW5kU3RyaW5nKGJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljcykpOworICAgICAgICBpZiAoYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgaWYgKGRpc2FibGVkVGFiQ3NzQ2xhc3MhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJkaXNhYmxlZFRhYkNzc0NsYXNzIiwgZmluZFN0cmluZyhkaXNhYmxlZFRhYkNzc0NsYXNzKSk7CisgICAgICAgIGlmKHVzZVNlbGVjdGVkVGFiQ29va2llICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigidXNlU2VsZWN0ZWRUYWJDb29raWUiLCBmaW5kU3RyaW5nKHVzZVNlbGVjdGVkVGFiQ29va2llKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZW5lcmF0ZSBhIHJhbmRvbSBJRCBpZiBub3QgZXhwbGljaXRseSBzZXQgYW5kIG5vdCBwYXJzaW5nIHRoZSBjb250ZW50CisgICAgICAgIEJvb2xlYW4gcGFyc2VDb250ZW50ID0gKEJvb2xlYW4pc3RhY2suZ2V0Q29udGV4dCgpLmdldChIZWFkLlBBUlNFX0NPTlRFTlQpOworICAgICAgICBib29sZWFuIGdlbmVyYXRlSWQgPSAocGFyc2VDb250ZW50ICE9IG51bGwgPyAhcGFyc2VDb250ZW50IDogdHJ1ZSk7CisgICAgICAgIAorICAgICAgICBhZGRQYXJhbWV0ZXIoInB1c2hJZCIsIGdlbmVyYXRlSWQpOworICAgICAgICBpZiAoKHRoaXMuaWQgPT0gbnVsbCB8fCB0aGlzLmlkLmxlbmd0aCgpID09IDApICYmIGdlbmVyYXRlSWQpIHsKKyAgICAgICAgICAgIC8vIHJlc29sdmVzIE1hdGguYWJzKEludGVnZXIuTUlOX1ZBTFVFKSBpc3N1ZSByZXBvcnRlZCBieSBGaW5kQnVncyAKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9maW5kYnVncy5zb3VyY2Vmb3JnZS5uZXQvYnVnRGVzY3JpcHRpb25zLmh0bWwjUlZfQUJTT0xVVEVfVkFMVUVfT0ZfUkFORE9NX0lOVAorICAgICAgICAgICAgaW50IG5leHRJbnQgPSBSQU5ET00ubmV4dEludCgpOworICAgICAgICAgICAgbmV4dEludCA9IG5leHRJbnQgPT0gSW50ZWdlci5NSU5fVkFMVUUgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IE1hdGguYWJzKG5leHRJbnQpOyAgCisgICAgICAgICAgICB0aGlzLmlkID0gIndpZGdldF8iICsgU3RyaW5nLnZhbHVlT2YobmV4dEludCk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImlkIiwgdGhpcy5pZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3RydXRzVGFnU2tpcEluaGVyaXRhbmNlCisgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoU3RyaW5nIHRoZW1lKSB7CisgICAgICAgIHN1cGVyLnNldFRoZW1lKHRoZW1lKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuICJhamF4IjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0T3BlblRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gVEVNUExBVEU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiBURU1QTEFURV9DTE9TRTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKSB7CisgICAgICAgIHJldHVybiBDT01QT05FTlRfTkFNRTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgaWQgdG8gYXNzaWduIHRvIHRoZSBjb21wb25lbnQuIiwgcmVxdWlyZWQ9dHJ1ZSkKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCB0byBvdmVycmlkZSB0bGQgZ2VuZXJhdGlvbiBhdHRyaWJ1dGVzIHRvIHJlcXVpcmVkPXRydWUKKyAgICAgICAgc3VwZXIuc2V0SWQoaWQpOworICAgIH0KKworCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iIFRoZSBpZCBvZiB0aGUgdGFiIHRoYXQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IikKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFRhYihTdHJpbmcgc2VsZWN0ZWRUYWIpIHsKKyAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSBzZWxlY3RlZFRhYjsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJEZXByZWNhdGVkLiBVc2UgJ2Nsb3NhYmxlJyBvbiBlYWNoIGRpdih0YWIpIikKKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9zZUJ1dHRvbihTdHJpbmcgY2xvc2VCdXR0b24pIHsKKyAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IGNsb3NlQnV0dG9uOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IklmIGRvTGF5b3V0IGlzIGZhbHNlLCB0aGUgdGFiIGNvbnRhaW5lcidzIGhlaWdodCBlcXVhbHMgdGhlIGhlaWdodCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiIsIHR5cGU9IkJvb2xlYW4iLCBkZWZhdWx0VmFsdWU9ImZhbHNlIikKKyAgICBwdWJsaWMgdm9pZCBzZXREb0xheW91dChTdHJpbmcgZG9MYXlvdXQpIHsKKyAgICAgICAgdGhpcy5kb0xheW91dCA9IGRvTGF5b3V0OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRlbXBsYXRlIGNzcyBwYXRoIikKKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wbGF0ZUNzc1BhdGgoU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aCkgeworICAgICAgICB0aGlzLnRlbXBsYXRlQ3NzUGF0aCA9IHRlbXBsYXRlQ3NzUGF0aDsKKyAgICB9CisKKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRvcGljcyB0byBiZSBwdWJsaXNoZWQgd2hlbiBhIHRhYiBpcyBjbGlja2VkIG9uIChiZWZvcmUgaXQgaXMgc2VsZWN0ZWQpIiArCisgICAgCQkiVGhlIHRhYiBjb250YWluZXIgd2lkZ2V0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgdG9waWMuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZSB0YWIgd2lkZ2V0LiIgKworICAgIAkJIlRoZSBldmVudCBjYW4gYmUgY2FuY2VsbGVkIHNldHRpbmcgdG8gJ3RydWUnIHRoZSAnY2FuY2VsJyBwcm9wZXJ0eSAiICsKKyAgICAJCSJvZiB0aGUgdGhpcmQgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgdG9waWNzLiIpCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzKFN0cmluZyBzZWxlY3RlZFRhYk5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljcyA9IHNlbGVjdGVkVGFiTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRvcGljcyB0byBiZSBwdWJsaXNoZWQgd2hlbiBhIHRhYiBpcyBjbGlja2VkIG9uIChhZnRlciBpdCBpcyBzZWxlY3RlZCkuIiArCisgICAgICAgICJUaGUgdGFiIGNvbnRhaW5lciB3aWRnZXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSB0b3BpYy4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHRhYiB3aWRnZXQuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRBZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcyhTdHJpbmcgYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcyA9IGFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkNzcyBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB0YWIgYnV0dG9uIG9mIGRpc2FibGVkIHRhYnMiLCBkZWZhdWx0VmFsdWU9InN0cnV0c0Rpc2FibGVkVGFiIikKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlZFRhYkNzc0NsYXNzKFN0cmluZyBkaXNhYmxlZFRhYkNzc0NsYXNzKSB7CisgICAgICAgIHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcyA9IGRpc2FibGVkVGFiQ3NzQ2xhc3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShyZXF1aXJlZCA9IGZhbHNlLCBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiLCBkZXNjcmlwdGlvbiA9ICJJZiBzZXQgdG8gdHJ1ZSwgdGhlIGlkIG9mIHRoZSBsYXN0IHNlbGVjdGVkICIgKworICAgICAgICAgICAgInRhYiB3aWxsIGJlIHN0b3JlZCBpbiBjb29raWUuIElmIHRoZSB2aWV3IGlzIHJlbmRlcmVkLCBpdCB3aWxsIGJlIHRyaWVkIHRvIHJlYWQgdGhpcyBjb29raWUgYW5kIGFjdGl2YXRlICIgKworICAgICAgICAgICAgInRoZSBjb3JyZXNwb25kaW5nIHRhYiBvbiBzdWNjZXNzLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgc2VsZWN0ZWRUYWIgYXR0cmlidXRlLiBUaGUgY29va2llIG5hbWUgaXMgXCJTdHJ1dHMyVGFiYmVkUGFuZWxfc2VsZWN0ZWRUYWJfXCIraWQuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VTZWxlY3RlZFRhYkNvb2tpZSggU3RyaW5nIHVzZVNlbGVjdGVkVGFiQ29va2llICkgeworICAgICAgICB0aGlzLnVzZVNlbGVjdGVkVGFiQ29va2llID0gdXNlU2VsZWN0ZWRUYWJDb29raWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9UZXh0QXJlYS5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9UZXh0QXJlYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWRkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1RleHRBcmVhLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqIFJlbmRlciBEb2pvIEVkaXRvcjIgd2lkZ2V0CisgKiA8IS0tIEVORCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICoKKyAqLworQFN0cnV0c1RhZyhuYW1lPSJ0ZXh0YXJlYSIsIHRsZFRhZ0NsYXNzPSJvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWkuVGV4dGFyZWFUYWciLCBkZXNjcmlwdGlvbj0iUmVuZGVycyBEb2pvIEVkaXRvcjIgd2lkZ2V0IikKK3B1YmxpYyBjbGFzcyBUZXh0QXJlYSBleHRlbmRzIG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLlRleHRBcmVhIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB0cmFuc2llbnQgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKKworICAgIHB1YmxpYyBUZXh0QXJlYShWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgYSByYW5kb20gSUQgaWYgbm90IGV4cGxpY2l0bHkgc2V0IGFuZCBub3QgcGFyc2luZyB0aGUgY29udGVudAorICAgICAgICBCb29sZWFuIHBhcnNlQ29udGVudCA9IChCb29sZWFuKXN0YWNrLmdldENvbnRleHQoKS5nZXQoSGVhZC5QQVJTRV9DT05URU5UKTsKKyAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZUlkID0gKHBhcnNlQ29udGVudCAhPSBudWxsID8gIXBhcnNlQ29udGVudCA6IHRydWUpOworICAgICAgICAKKyAgICAgICAgYWRkUGFyYW1ldGVyKCJwdXNoSWQiLCBnZW5lcmF0ZUlkKTsKKyAgICAgICAgaWYgKCh0aGlzLmlkID09IG51bGwgfHwgdGhpcy5pZC5sZW5ndGgoKSA9PSAwKSAmJiBnZW5lcmF0ZUlkKSB7CisgICAgICAgICAgICAvLyByZXNvbHZlcyBNYXRoLmFicyhJbnRlZ2VyLk1JTl9WQUxVRSkgaXNzdWUgcmVwb3J0ZWQgYnkgRmluZEJ1Z3MgCisgICAgICAgICAgICAvLyBodHRwOi8vZmluZGJ1Z3Muc291cmNlZm9yZ2UubmV0L2J1Z0Rlc2NyaXB0aW9ucy5odG1sI1JWX0FCU09MVVRFX1ZBTFVFX09GX1JBTkRPTV9JTlQKKyAgICAgICAgICAgIGludCBuZXh0SW50ID0gUkFORE9NLm5leHRJbnQoKTsKKyAgICAgICAgICAgIG5leHRJbnQgPSBuZXh0SW50ID09IEludGVnZXIuTUlOX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUgOiBNYXRoLmFicyhuZXh0SW50KTsgIAorICAgICAgICAgICAgdGhpcy5pZCA9ICJ3aWRnZXRfIiArIFN0cmluZy52YWx1ZU9mKG5leHRJbnQpOworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpZCIsIHRoaXMuaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuICJhamF4IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1RyZWUuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvVHJlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2E1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9jb21wb25lbnRzL1RyZWUuamF2YQpAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNsb3NpbmdVSUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2U7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICoKKyAqIFJlbmRlcnMgYSB0cmVlIHdpZGdldCB3aXRoIEFKQVggc3VwcG9ydC48cC8+CisgKgorICogVGhlICJpZCAiYXR0cmlidXRlIGlzIG5vcm1hbGx5IHNwZWNpZmllZChyZWNvbW1lbmRlZCksIHN1Y2ggdGhhdCBpdCBjb3VsZCBiZSBsb29rZWQgdXAgdXNpbmcKKyAqIGphdmFzY3JpcHQgaWYgbmVjZXNzYXJ5LiBUaGUgImlkIiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaWYgdGhlICJzZWxlY3RlZE5vdGlmeVRvcGljIiBvciB0aGUgCisgKiAiaHJlZiIgYXR0cmlidXRlcyBhcmUgZ29pbmcgdG8gYmUgdXNlZC48cC8+CisgKgorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqCisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUxIC0tPgorICogJmx0O3M6dHJlZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiZndDsKKyAqICAgICZsdDtzOnRyZWVub2RlIGlkPSIuLi4iIGxhYmVsPSIuLi4iIC8mZ3Q7CisgKiAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiZndDsKKyAqICAgICAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiAvJmd0OworICogICAgICAgICZsdDtzOnRyZWVub2RlIGlkPSIuLi4iIGxhYmVsPSIuLi4iIC8mZ3Q7CisgKiAgICAmbHQ7L3M6dHJlZW5vZGUmZ3Q7CisgKiAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiAvJmd0OworICogJmx0Oy9zOnRyZWUmZ3Q7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMSAtLT4KKyAqIAorICogPCEtLSBTVEFSVCBTTklQUEVUOiBleGFtcGxlMiAtLT4KKyAqICZsdDtzOnRyZWUKKyAqICAgICAgICAgIGlkPSIuLi4iCisgKiAgICAgICAgICByb290Tm9kZT0iLi4uIgorICogICAgICAgICAgbm9kZUlkUHJvcGVydHk9Ii4uLiIKKyAqICAgICAgICAgIG5vZGVUaXRsZVByb3BlcnR5PSIuLi4iCisgKiAgICAgICAgICBjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eT0iLi4uIiAvJmd0OworICogPCEtLSBFTkQgU05JUFBFVDogZXhhbXBsZTIgLS0+CisgKiAKKyAqIDwhLS0gU1RBUlQgU05JUFBFVDogZXhhbXBsZTMgLS0+CisgKiAmbHQ7czp1cmwgaWQ9Im5vZGVzVXJsIiBuYW1lc3BhY2U9Ii9ub2RlY29yYXRlIiBhY3Rpb249ImdldE5vZGVzIiAvJmd0OworICogJmx0O2RpdiBzdHlsZT0iZmxvYXQ6bGVmdDsgbWFyZ2luLXJpZ2h0OiA1MHB4OyImZ3Q7CisgKiAgICAgJmx0O3N4OnRyZWUgaWQ9InRyZWUiIGhyZWY9IiV7I25vZGVzVXJsfSIgLyZndDsKKyAqICZsdDsvZGl2Jmd0OworICogCisgKiBPbiB0aGlzIGV4YW1wbGUgdGhlIHVybCBzcGVjaWZpZWQgb24gdGhlICJocmVmIiBhdHRpYnV0ZSB3aWxsIGJlIGNhbGxlZCB0byBsb2FkCisgKiB0aGUgZWxlbWVudHMgb24gdGhlIHJvb3QuIFRoZSByZXNwb25zZSBpcyBleHBlY3RlZCB0byBiZSBhIEpTT04gYXJyYXkgb2Ygb2JqZWN0cyBsaWtlOgorICogWworICogICAgICB7CisgKiAgICAgICAgICAgbGFiZWw6ICJOb2RlIDEiLAorICogICAgICAgICAgIGhhc0NoaWxkcmVuOiBmYWxzZSwKKyAqICAgICAgICAgICBpZDogIk5vZGUxIgorICogICAgICB9LAorICogICAgICB7CisgKiAgICAgICAgICAgbGFiZWw6ICJOb2RlIDIiLAorICogICAgICAgICAgIGhhc0NoaWxkcmVuOiB0cnVlLAorICogICAgICAgICAgIGlkOiAiTm9kZTIiCisgKiAgICAgIH0sCisgKiBdCisgKiAKKyAqICJsYWJlbCIgaXMgdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBmb3IgdGhlIG5vZGUuICJoYXNDaGlsZHJlbiIgbWFya3MgdGhlIG5vZGUgaGFzCisgKiBoYXZpbmcgY2hpbGRyZW4gb3Igbm90IChpZiB0cnVlLCBhIHBsdXMgaWNvbiB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBub2RlIHNvIGl0IGNhbiBiZQorICogZXhwYW5kZWQpLiBUaGUgImlkIiBhdHRyaWJ1dGUgd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCB3aGVuIHRoZSBub2RlCisgKiBpcyBleHBhbmRlZC4gV2hlbiBhIG5vZGUgaXMgZXhwYW5kZWQgYSByZXF1ZXN0IHdpbGwgYmUgbWFkZSB0byB0aGUgdXJsIGluIHRoZSAiaHJlZiIgYXR0cmlidXRlCisgKiBhbmQgdGhlIG5vZGUncyAiaWQiIHdpbGwgYmUgcGFzc2VkIGluIHRoZSBwYXJhbWV0ZXIgIm5vZGVJZCIuCisgKiAKKyAqIFRoZSBjaGlsZHJlbiBjb2xsZWN0aW9uIGZvciBhIG5vZGUgd2lsbCBiZSBsb2FkZWQgb25seSBvbmNlLCB0byByZWxvYWQgdGhlIGNoaWxkcmVuIG9mIGEgCisgKiBub2RlLCB1c2UgdGhlICJyZWxvYWQoKSIgZnVuY3Rpb24gb2YgdGhlIHRyZWVub2RlIHdpZGdldC4gVG8gcmVsb2FkIHRoZSBjaGlsZHJlbiBub2RlcyBvZiAiTm9kZTEiCisgKiBmcm9tIHRoZSBleGFtcGxlIGFib3ZlIHVzZSB0aGUgZm9sbG93aW5nIGphdmFzY3JpcHQ6CisgKiAKKyAqIGRvam8ud2lkZ2V0LmJ5SWQoIk5vZGUxIikucmVsb2FkKCk7CisgKiA8IS0tIEVORCBTTklQUEVUOiBleGFtcGxlMyAtLT4KKyAqLworQFN0cnV0c1RhZyhuYW1lPSJ0cmVlIiwgdGxkVGFnQ2xhc3M9Im9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aS5UcmVlVGFnIiwgZGVzY3JpcHRpb249IlJlbmRlciBhIHRyZWUgd2lkZ2V0LiIpCitwdWJsaWMgY2xhc3MgVHJlZSBleHRlbmRzIENsb3NpbmdVSUJlYW4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gInRyZWUtY2xvc2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1RFTVBMQVRFID0gInRyZWUiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHRyYW5zaWVudCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOyAgICAKKworICAgIHByb3RlY3RlZCBTdHJpbmcgdG9nZ2xlOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWROb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleHBhbmRlZE5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbGxhcHNlZE5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJvb3ROb2RlQXR0cjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoaWxkQ29sbGVjdGlvblByb3BlcnR5OworICAgIHByb3RlY3RlZCBTdHJpbmcgbm9kZVRpdGxlUHJvcGVydHk7CisgICAgcHJvdGVjdGVkIFN0cmluZyBub2RlSWRQcm9wZXJ0eTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNob3dSb290R3JpZDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0dyaWQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBibGFua0ljb25TcmM7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY0w7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY1Y7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY1A7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY0M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY1g7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmlkSWNvblNyY1k7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleHBhbmRJY29uU3JjUGx1czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4cGFuZEljb25TcmNNaW51czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGljb25XaWR0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGljb25IZWlnaHQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2dnbGVEdXJhdGlvbjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhyZWY7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvck5vdGlmeVRvcGljczsKKyAgICAKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjaGlsZHJlbklkczsKKyAgICAKKyAgICBwdWJsaWMgVHJlZShWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5zdGFydCh3cml0ZXIpOworCisgICAgICAgIGlmICh0aGlzLmxhYmVsID09IG51bGwgJiYgKGhyZWYgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICgocm9vdE5vZGVBdHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IChjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCAobm9kZVRpdGxlUHJvcGVydHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG5vZGVJZFByb3BlcnR5ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgZmllbGRFcnJvcigibGFiZWwiLCJUaGUgVHJlZVRhZyByZXF1aXJlcyBlaXRoZXIgYSB2YWx1ZSBmb3IgJ2xhYmVsJyBvciAnaHJlZicgb3IgQUxMIG9mICdyb290Tm9kZScsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIidjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eScsICdub2RlVGl0bGVQcm9wZXJ0eScsIGFuZCAnbm9kZUlkUHJvcGVydHknIiwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUV4dHJhUGFyYW1zKCkgeworICAgICAgICBzdXBlci5ldmFsdWF0ZUV4dHJhUGFyYW1zKCk7CisKKyAgICAgICAgaWYgKHRvZ2dsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRvZ2dsZSIsIGZpbmRTdHJpbmcodG9nZ2xlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoInRvZ2dsZSIsICJmYWRlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZWN0ZWROb3RpZnlUb3BpY3MgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzZWxlY3RlZE5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoc2VsZWN0ZWROb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHBhbmRlZE5vdGlmeVRvcGljcyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImV4cGFuZGVkTm90aWZ5VG9waWNzIiwgZmluZFN0cmluZyhleHBhbmRlZE5vdGlmeVRvcGljcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbGxhcHNlZE5vdGlmeVRvcGljcyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImNvbGxhcHNlZE5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoY29sbGFwc2VkTm90aWZ5VG9waWNzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocm9vdE5vZGVBdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigicm9vdE5vZGUiLCBmaW5kVmFsdWUocm9vdE5vZGVBdHRyKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSIsIGZpbmRTdHJpbmcoY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub2RlVGl0bGVQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoIm5vZGVUaXRsZVByb3BlcnR5IiwgZmluZFN0cmluZyhub2RlVGl0bGVQcm9wZXJ0eSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vZGVJZFByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigibm9kZUlkUHJvcGVydHkiLCBmaW5kU3RyaW5nKG5vZGVJZFByb3BlcnR5KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvd1Jvb3RHcmlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigic2hvd1Jvb3RHcmlkIiwgZmluZFZhbHVlKHNob3dSb290R3JpZCwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICB9CisKKworICAgICAgICBpZiAoc2hvd0dyaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJzaG93R3JpZCIsIGZpbmRWYWx1ZShzaG93R3JpZCwgQm9vbGVhbi5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJsYW5rSWNvblNyYyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImJsYW5rSWNvblNyYyIsIGZpbmRTdHJpbmcoYmxhbmtJY29uU3JjKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3JpZEljb25TcmNMICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZ3JpZEljb25TcmNMIiwgZmluZFN0cmluZyhncmlkSWNvblNyY0wpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChncmlkSWNvblNyY1YgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJncmlkSWNvblNyY1YiLCBmaW5kU3RyaW5nKGdyaWRJY29uU3JjVikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdyaWRJY29uU3JjUCAhPSBudWxsKSAgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJncmlkSWNvblNyY1AiLCBmaW5kU3RyaW5nKGdyaWRJY29uU3JjUCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdyaWRJY29uU3JjQyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImdyaWRJY29uU3JjQyIsIGZpbmRTdHJpbmcoZ3JpZEljb25TcmNDKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3JpZEljb25TcmNYICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZ3JpZEljb25TcmNYIiwgZmluZFN0cmluZyhncmlkSWNvblNyY1gpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChncmlkSWNvblNyY1kgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJncmlkSWNvblNyY1kiLCBmaW5kU3RyaW5nKGdyaWRJY29uU3JjWSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4cGFuZEljb25TcmNQbHVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZXhwYW5kSWNvblNyY1BsdXMiLCBmaW5kU3RyaW5nKGV4cGFuZEljb25TcmNQbHVzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhwYW5kSWNvblNyY01pbnVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiZXhwYW5kSWNvblNyY01pbnVzIiwgZmluZFN0cmluZyhleHBhbmRJY29uU3JjTWludXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpY29uV2lkdGggIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpY29uV2lkdGgiLCBmaW5kVmFsdWUoaWNvbldpZHRoLCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGljb25IZWlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJpY29uSGVpZ2h0IiwgZmluZFZhbHVlKGljb25IZWlnaHQsIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9nZ2xlRHVyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0b2dnbGVEdXJhdGlvbiIsIGZpbmRWYWx1ZSh0b2dnbGVEdXJhdGlvbiwgSW50ZWdlci5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZW1wbGF0ZUNzc1BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJ0ZW1wbGF0ZUNzc1BhdGgiLCBmaW5kU3RyaW5nKHRlbXBsYXRlQ3NzUGF0aCkpOworICAgICAgICB9CisgICAgICAgIGlmIChocmVmICE9IG51bGwpIAorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJocmVmIiwgZmluZFN0cmluZyhocmVmKSk7CisgICAgICAgIGlmIChlcnJvck5vdGlmeVRvcGljcyAhPSBudWxsKQorICAgICAgICAgICAgYWRkUGFyYW1ldGVyKCJlcnJvck5vdGlmeVRvcGljcyIsIGZpbmRTdHJpbmcoZXJyb3JOb3RpZnlUb3BpY3MpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gZ2VuZXJhdGUgYSByYW5kb20gSUQgaWYgbm90IGV4cGxpY2l0bHkgc2V0IGFuZCBub3QgcGFyc2luZyB0aGUgY29udGVudAorICAgICAgICBCb29sZWFuIHBhcnNlQ29udGVudCA9IChCb29sZWFuKXN0YWNrLmdldENvbnRleHQoKS5nZXQoSGVhZC5QQVJTRV9DT05URU5UKTsKKyAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZUlkID0gKHBhcnNlQ29udGVudCAhPSBudWxsID8gIXBhcnNlQ29udGVudCA6IHRydWUpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigicHVzaElkIiwgZ2VuZXJhdGVJZCk7CisgICAgICAgIGlmICgodGhpcy5pZCA9PSBudWxsIHx8IHRoaXMuaWQubGVuZ3RoKCkgPT0gMCkgJiYgZ2VuZXJhdGVJZCkgeworICAgICAgICAgICAgLy8gcmVzb2x2ZXMgTWF0aC5hYnMoSW50ZWdlci5NSU5fVkFMVUUpIGlzc3VlIHJlcG9ydGVkIGJ5IEZpbmRCdWdzIAorICAgICAgICAgICAgLy8gaHR0cDovL2ZpbmRidWdzLnNvdXJjZWZvcmdlLm5ldC9idWdEZXNjcmlwdGlvbnMuaHRtbCNSVl9BQlNPTFVURV9WQUxVRV9PRl9SQU5ET01fSU5UCisgICAgICAgICAgICBpbnQgbmV4dEludCA9IFJBTkRPTS5uZXh0SW50KCk7CisgICAgICAgICAgICBuZXh0SW50ID0gbmV4dEludCA9PSBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUFYX1ZBTFVFIDogTWF0aC5hYnMobmV4dEludCk7ICAKKyAgICAgICAgICAgIHRoaXMuaWQgPSAid2lkZ2V0XyIgKyBTdHJpbmcudmFsdWVPZihuZXh0SW50KTsKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiaWQiLCB0aGlzLmlkKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5JZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigiY2hpbGRyZW5JZHMiLCB0aGlzLmNoaWxkcmVuSWRzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGRyZW5JZChTdHJpbmcgaWQpIHsKKyAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5JZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5JZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdGhpcy5jaGlsZHJlbklkcy5hZGQoaWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2UKKyAgICBwdWJsaWMgdm9pZCBzZXRUaGVtZShTdHJpbmcgdGhlbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0VGhlbWUodGhlbWUpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gImFqYXgiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9wZW5UZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIE9QRU5fVEVNUExBVEU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiBURU1QTEFURTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRvZ2dsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRvZ2dsZTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgdG9nZ2xlIHByb3BlcnR5IChlaXRoZXIgJ2V4cGxvZGUnIG9yICdmYWRlJykiLCBkZWZhdWx0VmFsdWU9ImZhZGUiKQorICAgIHB1YmxpYyB2b2lkIHNldFRvZ2dsZShTdHJpbmcgdG9nZ2xlKSB7CisgICAgICAgIHRoaXMudG9nZ2xlID0gdG9nZ2xlOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkRlcHJlY2F0ZWQuIFVzZSAnc2VsZWN0ZWROb3RpZnlUb3BpY3MnIGluc3RlYWQuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmVlU2VsZWN0ZWRUb3BpYyhTdHJpbmcgc2VsZWN0ZWROb3RpZnlUb3BpYykgeworICAgICAgICB0aGlzLnNlbGVjdGVkTm90aWZ5VG9waWNzID0gc2VsZWN0ZWROb3RpZnlUb3BpYzsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJEZXByZWNhdGVkLiBVc2UgJ2V4cGFuZGVkTm90aWZ5VG9waWNzJyBpbnN0ZWFkLiIpCisgICAgcHVibGljIHZvaWQgc2V0VHJlZUV4cGFuZGVkVG9waWNzKFN0cmluZyBleHBhbmRlZE5vdGlmeVRvcGljKSB7CisgICAgICAgIHRoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3MgPSBleHBhbmRlZE5vdGlmeVRvcGljOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkRlcHJlY2F0ZWQuIFVzZSAnY29sbGFwc2VkTm90aWZ5VG9waWNzJyBpbnN0ZWFkLiIpCisgICAgcHVibGljIHZvaWQgc2V0VHJlZUNvbGxhcHNlZFRvcGljcyhTdHJpbmcgY29sbGFwc2VkTm90aWZ5VG9waWMpIHsKKyAgICAgICAgdGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3MgPSBjb2xsYXBzZWROb3RpZnlUb3BpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3ROb2RlKCkgeworICAgICAgICByZXR1cm4gcm9vdE5vZGVBdHRyOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRoZSByb290Tm9kZSBwcm9wZXJ0eS4iKQorICAgIHB1YmxpYyB2b2lkIHNldFJvb3ROb2RlKFN0cmluZyByb290Tm9kZSkgeworICAgICAgICB0aGlzLnJvb3ROb2RlQXR0ciA9IHJvb3ROb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRDb2xsZWN0aW9uUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkgcHJvcGVydHkuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eShTdHJpbmcgY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5jaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSA9IGNoaWxkQ29sbGVjdGlvblByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVRpdGxlUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBub2RlVGl0bGVQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgbm9kZVRpdGxlUHJvcGVydHkgcHJvcGVydHkuIikKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlVGl0bGVQcm9wZXJ0eShTdHJpbmcgbm9kZVRpdGxlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5ub2RlVGl0bGVQcm9wZXJ0eSA9IG5vZGVUaXRsZVByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUlkUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBub2RlSWRQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJUaGUgbm9kZUlkUHJvcGVydHkgcHJvcGVydHkuIikKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlSWRQcm9wZXJ0eShTdHJpbmcgbm9kZUlkUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5ub2RlSWRQcm9wZXJ0eSA9IG5vZGVJZFByb3BlcnR5OworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRoZSBzaG93Um9vdEdyaWQgcHJvcGVydHkgKGRlZmF1bHQgdHJ1ZSkuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93Um9vdEdyaWQoU3RyaW5nIHNob3dSb290R3JpZCkgeworICAgICAgICB0aGlzLnNob3dSb290R3JpZCA9IHNob3dSb290R3JpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNob3dSb290R3JpZCgpIHsKKyAgICAgICAgcmV0dXJuIHNob3dSb290R3JpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJsYW5rSWNvblNyYygpIHsKKyAgICAgICAgcmV0dXJuIGJsYW5rSWNvblNyYzsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJCbGFuayBpY29uIGltYWdlIHNvdXJjZS4iKQorICAgIHB1YmxpYyB2b2lkIHNldEJsYW5rSWNvblNyYyhTdHJpbmcgYmxhbmtJY29uU3JjKSB7CisgICAgICAgIHRoaXMuYmxhbmtJY29uU3JjID0gYmxhbmtJY29uU3JjOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kSWNvblNyY01pbnVzKCkgeworICAgICAgICByZXR1cm4gZXhwYW5kSWNvblNyY01pbnVzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkV4cGFuZCBpY29uICgtKSBpbWFnZSBzb3VyY2UuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRJY29uU3JjTWludXMoU3RyaW5nIGV4cGFuZEljb25TcmNNaW51cykgeworICAgICAgICB0aGlzLmV4cGFuZEljb25TcmNNaW51cyA9IGV4cGFuZEljb25TcmNNaW51czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGFuZEljb25TcmNQbHVzKCkgeworICAgICAgICByZXR1cm4gZXhwYW5kSWNvblNyY1BsdXM7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iRXhwYW5kIEljb24gKCspIGltYWdlIHNvdXJjZS4iKQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZEljb25TcmNQbHVzKFN0cmluZyBleHBhbmRJY29uU3JjUGx1cykgeworICAgICAgICB0aGlzLmV4cGFuZEljb25TcmNQbHVzID0gZXhwYW5kSWNvblNyY1BsdXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmlkSWNvblNyY0MoKSB7CisgICAgICAgIHJldHVybiBncmlkSWNvblNyY0M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSW1hZ2Ugc291cmNlIGZvciB1bmRlciBjaGlsZCBpdGVtIGNoaWxkIGljb25zLiIpCisgICAgcHVibGljIHZvaWQgc2V0R3JpZEljb25TcmNDKFN0cmluZyBncmlkSWNvblNyY0MpIHsKKyAgICAgICAgdGhpcy5ncmlkSWNvblNyY0MgPSBncmlkSWNvblNyY0M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmlkSWNvblNyY0woKSB7CisgICAgICAgIHJldHVybiBncmlkSWNvblNyY0w7CisgICAgfQorCisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSIgSW1hZ2Ugc291cmNlIGZvciBsYXN0IGNoaWxkIGdyaWQuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRHcmlkSWNvblNyY0woU3RyaW5nIGdyaWRJY29uU3JjTCkgeworICAgICAgICB0aGlzLmdyaWRJY29uU3JjTCA9IGdyaWRJY29uU3JjTDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyaWRJY29uU3JjUCgpIHsKKyAgICAgICAgcmV0dXJuIGdyaWRJY29uU3JjUDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJJbWFnZSBzb3VyY2UgZm9yIHVuZGVyIHBhcmVudCBpdGVtIGNoaWxkIGljb25zLiIpCisgICAgcHVibGljIHZvaWQgc2V0R3JpZEljb25TcmNQKFN0cmluZyBncmlkSWNvblNyY1ApIHsKKyAgICAgICAgdGhpcy5ncmlkSWNvblNyY1AgPSBncmlkSWNvblNyY1A7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmlkSWNvblNyY1YoKSB7CisgICAgICAgIHJldHVybiBncmlkSWNvblNyY1Y7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSW1hZ2Ugc291cmNlIGZvciB2ZXJ0aWNhbCBsaW5lLiIpCisgICAgcHVibGljIHZvaWQgc2V0R3JpZEljb25TcmNWKFN0cmluZyBncmlkSWNvblNyY1YpIHsKKyAgICAgICAgdGhpcy5ncmlkSWNvblNyY1YgPSBncmlkSWNvblNyY1Y7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmlkSWNvblNyY1goKSB7CisgICAgICAgIHJldHVybiBncmlkSWNvblNyY1g7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSW1hZ2Ugc291cmNlIGZvciBncmlkIGZvciBzb2xlIHJvb3QgaXRlbS4iKQorICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjWChTdHJpbmcgZ3JpZEljb25TcmNYKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNYID0gZ3JpZEljb25TcmNYOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNZKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNZOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IkltYWdlIHNvdXJjZSBmb3IgZ3JpZCBmb3IgbGFzdCByb290IGl0ZW0uIikKKyAgICBwdWJsaWMgdm9pZCBzZXRHcmlkSWNvblNyY1koU3RyaW5nIGdyaWRJY29uU3JjWSkgeworICAgICAgICB0aGlzLmdyaWRJY29uU3JjWSA9IGdyaWRJY29uU3JjWTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEljb25IZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBpY29uSGVpZ2h0OworICAgIH0KKworCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iSWNvbiBoZWlnaHQiLCBkZWZhdWx0VmFsdWU9IjE4cHgiKQorICAgIHB1YmxpYyB2b2lkIHNldEljb25IZWlnaHQoU3RyaW5nIGljb25IZWlnaHQpIHsKKyAgICAgICAgdGhpcy5pY29uSGVpZ2h0ID0gaWNvbkhlaWdodDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEljb25XaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIGljb25XaWR0aDsKKyAgICB9CisKKyAgICBAU3RydXRzVGFnQXR0cmlidXRlKGRlc2NyaXB0aW9uPSJJY29uIHdpZHRoIiwgZGVmYXVsdFZhbHVlPSIxOXB4IikKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uV2lkdGgoU3RyaW5nIGljb25XaWR0aCkgeworICAgICAgICB0aGlzLmljb25XaWR0aCA9IGljb25XaWR0aDsKKyAgICB9CisKKworCisgICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZUNzc1BhdGgoKSB7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZUNzc1BhdGg7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGVtcGxhdGUgY3NzIHBhdGgiLCBkZWZhdWx0VmFsdWU9Intjb250ZXh0UGF0aH0vc3RydXRzL3RyZWUuY3NzLiIpCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGVDc3NQYXRoKFN0cmluZyB0ZW1wbGF0ZUNzc1BhdGgpIHsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZUNzc1BhdGggPSB0ZW1wbGF0ZUNzc1BhdGg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb2dnbGVEdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRvZ2dsZUR1cmF0aW9uOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlRvZ2dsZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMiLCBkZWZhdWx0VmFsdWU9IjE1MCIpCisgICAgcHVibGljIHZvaWQgc2V0VG9nZ2xlRHVyYXRpb24oU3RyaW5nIHRvZ2dsZUR1cmF0aW9uKSB7CisgICAgICAgIHRoaXMudG9nZ2xlRHVyYXRpb24gPSB0b2dnbGVEdXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNob3dHcmlkKCkgeworICAgICAgICByZXR1cm4gc2hvd0dyaWQ7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iU2hvdyBncmlkIiwgdHlwZT0iQm9vbGVhbiIsIGRlZmF1bHRWYWx1ZT0idHJ1ZSIpCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0dyaWQoU3RyaW5nIHNob3dHcmlkKSB7CisgICAgICAgIHRoaXMuc2hvd0dyaWQgPSBzaG93R3JpZDsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBjbGFzcyB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc0NsYXNzKFN0cmluZyBjc3NDbGFzcykgeworICAgICAgICBzdXBlci5zZXRDc3NDbGFzcyhjc3NDbGFzcyk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBzdHlsZSB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc1N0eWxlKFN0cmluZyBjc3NTdHlsZSkgeworICAgICAgICBzdXBlci5zZXRDc3NTdHlsZShjc3NTdHlsZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGlkIHRvIHVzZSBmb3IgdGhlIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBzdXBlci5zZXRJZChpZCk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIG5hbWUgdG8gc2V0IGZvciBlbGVtZW50IikKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyLnNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgc2VwYXJhdGVkIGxpcyBvZiB0b3BpY3MgdG8gYmUgcHVibGlzaGVkIHdoZW4gYSBub2RlIiArCisgICAgICAgICAgICAgICAgIiBpcyBjb2xsYXBzZWQuIEFuIG9iamVjdCB3aXRoIGEgJ25vZGUnIHByb3BlcnR5IHdpbGwgYmUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUgdG9waWNzLiIpCisgICAgcHVibGljIHZvaWQgc2V0Q29sbGFwc2VkTm90aWZ5VG9waWNzKFN0cmluZyBjb2xsYXBzZWROb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3MgPSBjb2xsYXBzZWROb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgc2VwYXJhdGVkIGxpcyBvZiB0b3BpY3MgdG8gYmUgcHVibGlzaGVkIHdoZW4gYSBub2RlIiArCisgICAgICAgICAgICAgICAgIiBpcyBleHBhbmRlZC4gQW4gb2JqZWN0IHdpdGggYSAnbm9kZScgcHJvcGVydHkgd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSB0b3BpY3MuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZE5vdGlmeVRvcGljcyhTdHJpbmcgZXhwYW5kZWROb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5leHBhbmRlZE5vdGlmeVRvcGljcz0gZXhwYW5kZWROb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgc2VwYXJhdGVkIGxpcyBvZiB0b3BpY3MgdG8gYmUgcHVibGlzaGVkIHdoZW4gYSBub2RlIiArCisgICAgICAgICAgICAgICAgIiBpcyBzZWxlY3RlZC4gQW4gb2JqZWN0IHdpdGggYSAnbm9kZScgcHJvcGVydHkgd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSB0b3BpY3MuIikKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE5vdGlmeVRvcGljcyhTdHJpbmcgc2VsZWN0ZWROb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcyA9IHNlbGVjdGVkTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIEBTdHJ1dHNUYWdBdHRyaWJ1dGUoZGVzY3JpcHRpb249IlVybCB1c2VkIHRvIGxvYWQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gbm9kZXMgZm9yIGFuIHNwZWNpZmljIG5vZGUsIHdob3NlIGlkIHdpbGwgYmUgIiArCisgICAgCQkicGFzc2VkIGFzIGEgcGFyYW1ldGVyIG5hbWVkICdub2RlSWQnIChlbXB0eSBmb3Igcm9vdCkiKQorICAgIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iQ29tbWEgZGVsaW1taXRlZCBsaXN0IG9mIHRvcGljcyB0aGF0IHdpbGwgcHVibGlzaGVkIGFmdGVyIHRoZSByZXF1ZXN0KGlmIHRoZSByZXF1ZXN0IGZhaWxzKS4iICsKKyAgICAJCSJPbmx5IHZhbGlkIGlmICdocmVmJyBpcyBzZXQiKQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTm90aWZ5VG9waWNzKFN0cmluZyBlcnJvck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzID0gZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvVHJlZU5vZGUuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL2NvbXBvbmVudHMvVHJlZU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjUyNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vY29tcG9uZW50cy9UcmVlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNsb3NpbmdVSUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmFubm90YXRpb25zLlN0cnV0c1RhZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuYW5ub3RhdGlvbnMuU3RydXRzVGFnQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5hbm5vdGF0aW9ucy5TdHJ1dHNUYWdTa2lwSW5oZXJpdGFuY2U7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPCEtLSBTVEFSVCBTTklQUEVUOiBqYXZhZG9jIC0tPgorICoKKyAqIFJlbmRlcnMgYSB0cmVlIG5vZGUgd2l0aGluIGEgdHJlZSB3aWRnZXQgd2l0aCBBSkFYIHN1cHBvcnQuPHAvPgorICoKKyAqIEVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBzaG91bGQgYmUgdXNlZCBkZXBlbmRpbmcgb24gaWYgdGhlIHRyZWUKKyAqIGlzIHRvIGJlIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHkuIDxwLz4KKyAqCisgKiA8Yj5EeW5hbWljYWxseTo8L2I+CisgKiA8dWw+CisgKiAgICAgIDxsaT5pZCAtIGlkIG9mIHRoaXMgdHJlZSBub2RlPC9saT4KKyAqICAgICAgPGxpPnRpdGxlIC0gbGFiZWwgdG8gYmUgZGlzcGxheWVkIGZvciB0aGlzIHRyZWUgbm9kZTwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxiPlN0YXRpY2FsbHk6PC9iPgorICogPHVsPgorICogICAgICA8bGk+cm9vdE5vZGUgLSB0aGUgcGFyZW50IG5vZGUgb2Ygd2hpY2ggdGhpcyB0cmVlIGlzIGRlcml2ZWQgZnJvbTwvbGk+CisgKiAgICAgIDxsaT5ub2RlSWRQcm9wZXJ0eSAtIHByb3BlcnR5IHRvIG9idGFpbmVkIHRoaXMgY3VycmVudCB0cmVlIG5vZGUncyBpZDwvbGk+CisgKiAgICAgIDxsaT5ub2RlVGl0bGVQcm9wZXJ0eSAtIHByb3BlcnR5IHRvIG9idGFpbmVkIHRoaXMgY3VycmVudCB0cmVlIG5vZGUncyB0aXRsZTwvbGk+CisgKiAgICAgIDxsaT5jaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSAtIHByb3BlcnR5IHRoYXQgcmV0dXJuZHMgdGhpcyBjdXJyZW50IHRyZWUgbm9kZSdzIGNoaWxkcmVuPC9saT4KKyAqIDwvdWw+CisgKgorICogPCEtLSBFTkQgU05JUFBFVDogamF2YWRvYyAtLT4KKyAqCisgKiA8cC8+IDxiPkV4YW1wbGVzPC9iPgorICoKKyAqIDxwcmU+CisgKiA8IS0tIFNUQVJUIFNOSVBQRVQ6IGV4YW1wbGUgLS0+CisgKgorICogJmx0Oy0tIENyZWF0aW5nIHRyZWUgc3RhdGljYWxseSB1c2luZyBoYXJkLWNvZGVkIGRhdGEuIC0tJmd0OworICogJmx0O3M6dHJlZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiZndDsKKyAqICAgICZsdDtzOnRyZWVub2RlIGlkPSIuLi4iIGxhYmVsPSIuLi4iIC8mZ3Q7CisgKiAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiZndDsKKyAqICAgICAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiAvJmd0OworICogICAgICAgICZsdDtzOnRyZWVub2RlIGlkPSIuLi4iIGxhYmVsPSIuLi4iIC8mZ3Q7CisgKiAgICAmbHQ7L3M6dHJlZW5vZGUmZ3Q7CisgKiAgICAmbHQ7czp0cmVlbm9kZSBpZD0iLi4uIiBsYWJlbD0iLi4uIiAvJmd0OworICogJmx0Oy9zOnRyZWUmZ3Q7CisgKgorICogJmx0Oy0tIENyZWF0aW5nIHRyZWUgZHluYW1pY2FsbHkgdXNpbmcgZGF0YSBmcm9tIGJhY2tpbmcgYWN0aW9uLiAtLSZndDsKKyAqICZsdDtzOnRyZWUKKyAqICAgICAgICAgIGlkPSIuLi4iCisgKiAgICAgICAgICByb290Tm9kZT0iLi4uIgorICogICAgICAgICAgbm9kZUlkUHJvcGVydHk9Ii4uLiIKKyAqICAgICAgICAgIG5vZGVUaXRsZVByb3BlcnR5PSIuLi4iCisgKiAgICAgICAgICBjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eT0iLi4uIiAvJmd0OworICoKKyAqIDwhLS0gRU5EIFNOSVBQRVQ6IGV4YW1wbGUgLS0+CisgKiA8L3ByZT4KKyAqCisgKi8KK0BTdHJ1dHNUYWcobmFtZT0idHJlZW5vZGUiLCB0bGRUYWdDbGFzcz0ib3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpLlRyZWVOb2RlVGFnIiwgZGVzY3JpcHRpb249IlJlbmRlciBhIHRyZWUgbm9kZSB3aXRoaW4gYSB0cmVlIHdpZGdldC4iKQorcHVibGljIGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQ2xvc2luZ1VJQmVhbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gInRyZWVub2RlLWNsb3NlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9URU1QTEFURSA9ICJ0cmVlbm9kZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdHJhbnNpZW50IFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7ICAgIAorCisgICAgcHVibGljIFRyZWVOb2RlKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN0cnV0c1RhZ1NraXBJbmhlcml0YW5jZQorICAgIHB1YmxpYyB2b2lkIHNldFRoZW1lKFN0cmluZyB0aGVtZSkgeworICAgICAgICBzdXBlci5zZXRUaGVtZSh0aGVtZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhlbWUoKSB7CisgICAgICAgIHJldHVybiAiYWpheCI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0T3BlblRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gT1BFTl9URU1QTEFURTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIFRFTVBMQVRFOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlRXh0cmFQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLmV2YWx1YXRlRXh0cmFQYXJhbXMoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGdlbmVyYXRlIGEgcmFuZG9tIElEIGlmIG5vdCBleHBsaWNpdGx5IHNldCBhbmQgbm90IHBhcnNpbmcgdGhlIGNvbnRlbnQKKyAgICAgICAgQm9vbGVhbiBwYXJzZUNvbnRlbnQgPSAoQm9vbGVhbilzdGFjay5nZXRDb250ZXh0KCkuZ2V0KEhlYWQuUEFSU0VfQ09OVEVOVCk7CisgICAgICAgIGJvb2xlYW4gZ2VuZXJhdGVJZCA9IChwYXJzZUNvbnRlbnQgIT0gbnVsbCA/ICFwYXJzZUNvbnRlbnQgOiB0cnVlKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoInB1c2hJZCIsIGdlbmVyYXRlSWQpOworICAgICAgICBpZiAoKHRoaXMuaWQgPT0gbnVsbCB8fCB0aGlzLmlkLmxlbmd0aCgpID09IDApICYmIGdlbmVyYXRlSWQpIHsKKyAgICAgICAgICAgIC8vIHJlc29sdmVzIE1hdGguYWJzKEludGVnZXIuTUlOX1ZBTFVFKSBpc3N1ZSByZXBvcnRlZCBieSBGaW5kQnVncyAKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9maW5kYnVncy5zb3VyY2Vmb3JnZS5uZXQvYnVnRGVzY3JpcHRpb25zLmh0bWwjUlZfQUJTT0xVVEVfVkFMVUVfT0ZfUkFORE9NX0lOVAorICAgICAgICAgICAgaW50IG5leHRJbnQgPSBSQU5ET00ubmV4dEludCgpOworICAgICAgICAgICAgbmV4dEludCA9IG5leHRJbnQgPT0gSW50ZWdlci5NSU5fVkFMVUUgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IE1hdGguYWJzKG5leHRJbnQpOyAgCisgICAgICAgICAgICB0aGlzLmlkID0gIndpZGdldF8iICsgU3RyaW5nLnZhbHVlT2YobmV4dEludCk7CisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoImlkIiwgdGhpcy5pZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFRyZWUgcGFyZW50VHJlZSA9IChUcmVlKSBmaW5kQW5jZXN0b3IoVHJlZS5jbGFzcyk7CisgICAgICAgIHBhcmVudFRyZWUuYWRkQ2hpbGRyZW5JZCh0aGlzLmlkKTsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iTGFiZWwgZXhwcmVzc2lvbiB1c2VkIGZvciByZW5kZXJpbmcgdHJlZSBub2RlIGxhYmVsLiIsIHJlcXVpcmVkPXRydWUpCisgICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7CisgICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsKKyAgICB9CisgICAgCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBjbGFzcyB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc0NsYXNzKFN0cmluZyBjc3NDbGFzcykgeworICAgICAgICBzdXBlci5zZXRDc3NDbGFzcyhjc3NDbGFzcyk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGNzcyBzdHlsZSB0byB1c2UgZm9yIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldENzc1N0eWxlKFN0cmluZyBjc3NTdHlsZSkgeworICAgICAgICBzdXBlci5zZXRDc3NTdHlsZShjc3NTdHlsZSk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIGlkIHRvIHVzZSBmb3IgdGhlIGVsZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBzdXBlci5zZXRJZChpZCk7CisgICAgfQorCisgICAgQFN0cnV0c1RhZ0F0dHJpYnV0ZShkZXNjcmlwdGlvbj0iVGhlIG5hbWUgdG8gc2V0IGZvciBlbGVtZW50IikKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyLnNldE5hbWUobmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvRG9qb1RhZ0xpYnJhcnkuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL0Rvam9UYWdMaWJyYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0MzliZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL0Rvam9UYWdMaWJyYXJ5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3czsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuZnJlZW1hcmtlci50YWdzLkRvam9Nb2RlbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50cy5BbmNob3JEaXJlY3RpdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50cy5BdXRvY29tcGxldGVyRGlyZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHMuQmluZERpcmVjdGl2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzLkRhdGVUaW1lUGlja2VyRGlyZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHMuRGl2RGlyZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHMuSGVhZERpcmVjdGl2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzLlN1Ym1pdERpcmVjdGl2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzLlRhYmJlZFBhbmVsRGlyZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHMuVGV4dEFyZWFEaXJlY3RpdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50cy5UcmVlRGlyZWN0aXZlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHMuVHJlZU5vZGVEaXJlY3RpdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLlRhZ0xpYnJhcnlEaXJlY3RpdmVQcm92aWRlcjsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuVGFnTGlicmFyeU1vZGVsUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBEb2pvVGFnTGlicmFyeSBpbXBsZW1lbnRzIFRhZ0xpYnJhcnlEaXJlY3RpdmVQcm92aWRlciwgVGFnTGlicmFyeU1vZGVsUHJvdmlkZXIgeworCisgICAgcHVibGljIE9iamVjdCBnZXRNb2RlbHMoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgRG9qb01vZGVscyhzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PENsYXNzPiBnZXREaXJlY3RpdmVDbGFzc2VzKCkgeworICAgICAgICBDbGFzc1tdIGRpcmVjdGl2ZXMgPSBuZXcgQ2xhc3NbXSB7CisgICAgICAgICAgICBEYXRlVGltZVBpY2tlckRpcmVjdGl2ZS5jbGFzcywKKyAgICAgICAgICAgIERpdkRpcmVjdGl2ZS5jbGFzcywKKyAgICAgICAgICAgIEF1dG9jb21wbGV0ZXJEaXJlY3RpdmUuY2xhc3MsCisgICAgICAgICAgICBBbmNob3JEaXJlY3RpdmUuY2xhc3MsCisgICAgICAgICAgICBTdWJtaXREaXJlY3RpdmUuY2xhc3MsCisgICAgICAgICAgICBUYWJiZWRQYW5lbERpcmVjdGl2ZS5jbGFzcywKKyAgICAgICAgICAgIFRyZWVEaXJlY3RpdmUuY2xhc3MsCisgICAgICAgICAgICBUcmVlTm9kZURpcmVjdGl2ZS5jbGFzcywKKyAgICAgICAgICAgIEhlYWREaXJlY3RpdmUuY2xhc3MsCisgICAgICAgICAgICBCaW5kRGlyZWN0aXZlLmNsYXNzLAorICAgICAgICAgICAgVGV4dEFyZWFEaXJlY3RpdmUuY2xhc3MKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZGlyZWN0aXZlcyk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0FuY2hvck1vZGVsLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvQW5jaG9yTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRkNWZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0FuY2hvck1vZGVsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuQW5jaG9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5mcmVlbWFya2VyLnRhZ3MuVGFnTW9kZWw7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBBbmNob3IKKyAqLworcHVibGljIGNsYXNzIEFuY2hvck1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworCisgICAgcHVibGljIEFuY2hvck1vZGVsKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IEFuY2hvcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0F1dG9jb21wbGV0ZXJNb2RlbC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0F1dG9jb21wbGV0ZXJNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzgzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvQXV0b2NvbXBsZXRlck1vZGVsLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuQXV0b2NvbXBsZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuZnJlZW1hcmtlci50YWdzLlRhZ01vZGVsOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgQXV0b2NvbXBsZXRlcgorICovCitwdWJsaWMgY2xhc3MgQXV0b2NvbXBsZXRlck1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworCisgICAgcHVibGljIEF1dG9jb21wbGV0ZXJNb2RlbChWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBdXRvY29tcGxldGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0JpbmRNb2RlbC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0JpbmRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDViNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvQmluZE1vZGVsLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuQmluZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuZnJlZW1hcmtlci50YWdzLlRhZ01vZGVsOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgQmluZAorICovCitwdWJsaWMgY2xhc3MgQmluZE1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworICAgIHB1YmxpYyBCaW5kTW9kZWwoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgQmluZChzdGFjaywgcmVxLCByZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9EYXRlVGltZVBpY2tlck1vZGVsLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvRGF0ZVRpbWVQaWNrZXJNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvRGF0ZVRpbWVQaWNrZXJNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuZnJlZW1hcmtlci50YWdzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkRhdGVUaW1lUGlja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5mcmVlbWFya2VyLnRhZ3MuVGV4dEZpZWxkTW9kZWw7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBEcm9wZG93bkRhdGVUaW1lUGlja2VyCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlVGltZVBpY2tlck1vZGVsIGV4dGVuZHMgVGV4dEZpZWxkTW9kZWwgeworCisgICAgcHVibGljIERhdGVUaW1lUGlja2VyTW9kZWwoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWVQaWNrZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvRGl2TW9kZWwuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9EaXZNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2Q4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvRGl2TW9kZWwuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmZyZWVtYXJrZXIudGFnczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5EaXY7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmZyZWVtYXJrZXIudGFncy5UYWdNb2RlbDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworCisvKioKKyAqIEBzZWUgRGl2CisgKi8KK3B1YmxpYyBjbGFzcyBEaXZNb2RlbCBleHRlbmRzIFRhZ01vZGVsIHsKKworICAgIHB1YmxpYyBEaXZNb2RlbChWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICBzdXBlcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXYoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvRG9qb01vZGVscy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0Rvam9Nb2RlbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk0NjYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0Rvam9Nb2RlbHMuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCitwdWJsaWMgY2xhc3MgRG9qb01vZGVscyB7CisgICAgcHJvdGVjdGVkIERhdGVUaW1lUGlja2VyTW9kZWwgZGF0ZVRpbWVQaWNrZXI7CisgICAgcHJvdGVjdGVkIFRhYmJlZFBhbmVsTW9kZWwgdGFiYmVkUGFuZWw7CisgICAgcHJvdGVjdGVkIFRyZWVNb2RlbCB0cmVlTW9kZWw7CisgICAgcHJvdGVjdGVkIFRyZWVOb2RlTW9kZWwgdHJlZW5vZGVNb2RlbDsKKyAgICBwcm90ZWN0ZWQgQXV0b2NvbXBsZXRlck1vZGVsIGF1dG9jb21wbGV0ZXI7CisgICAgcHJvdGVjdGVkIERpdk1vZGVsIGRpdjsKKyAgICBwcm90ZWN0ZWQgQW5jaG9yTW9kZWwgYTsKKyAgICBwcm90ZWN0ZWQgU3VibWl0TW9kZWwgc3VibWl0OworICAgIHByb3RlY3RlZCBCaW5kTW9kZWwgYmluZDsKKyAgICBwcm90ZWN0ZWQgSGVhZE1vZGVsIGhlYWQ7CisgICAgcHJvdGVjdGVkIFRleHRBcmVhTW9kZWwgdGV4dGFyZWE7CisgICAgCisgICAgcHJpdmF0ZSBWYWx1ZVN0YWNrIHN0YWNrOworICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzOworICAgIAorICAgIHB1YmxpYyBEb2pvTW9kZWxzKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjazsKKyAgICAgICAgdGhpcy5yZXEgPSByZXE7CisgICAgICAgIHRoaXMucmVzID0gcmVzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmluZE1vZGVsIGdldEJpbmQoKSB7CisgICAgICAgIGlmIChiaW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIGJpbmQgPSBuZXcgQmluZE1vZGVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmluZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFRleHRBcmVhTW9kZWwgZ2V0VGV4dGFyZWEoKSB7CisgICAgICAgIGlmICh0ZXh0YXJlYSA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXh0YXJlYSA9IG5ldyBUZXh0QXJlYU1vZGVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dGFyZWE7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBIZWFkTW9kZWwgZ2V0SGVhZCgpIHsKKyAgICAgICAgaWYgKGhlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaGVhZCA9IG5ldyBIZWFkTW9kZWwoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZWFkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRGF0ZVRpbWVQaWNrZXJNb2RlbCBnZXREYXRldGltZXBpY2tlcigpIHsKKyAgICAgICAgaWYgKGRhdGVUaW1lUGlja2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGVUaW1lUGlja2VyID0gbmV3IERhdGVUaW1lUGlja2VyTW9kZWwoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkYXRlVGltZVBpY2tlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIEF1dG9jb21wbGV0ZXJNb2RlbCBnZXRBdXRvY29tcGxldGVyKCkgeworICAgICAgICBpZiAoYXV0b2NvbXBsZXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBhdXRvY29tcGxldGVyID0gbmV3IEF1dG9jb21wbGV0ZXJNb2RlbChzdGFjaywgcmVxLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGF1dG9jb21wbGV0ZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUYWJiZWRQYW5lbE1vZGVsIGdldFRhYmJlZHBhbmVsKCkgeworICAgICAgICBpZiAodGFiYmVkUGFuZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGFiYmVkUGFuZWwgPSBuZXcgVGFiYmVkUGFuZWxNb2RlbChzdGFjaywgcmVxLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhYmJlZFBhbmVsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVHJlZU1vZGVsIGdldFRyZWUoKSB7CisgICAgICAgIGlmICh0cmVlTW9kZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJlZU1vZGVsID0gbmV3IFRyZWVNb2RlbChzdGFjayxyZXEsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyZWVNb2RlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJlZU5vZGVNb2RlbCBnZXRUcmVlbm9kZSgpIHsKKyAgICAgICAgaWYgKHRyZWVub2RlTW9kZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJlZW5vZGVNb2RlbCA9IG5ldyBUcmVlTm9kZU1vZGVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyZWVub2RlTW9kZWw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEaXZNb2RlbCBnZXREaXYoKSB7CisgICAgICAgIGlmIChkaXYgPT0gbnVsbCkgeworICAgICAgICAgICAgZGl2ID0gbmV3IERpdk1vZGVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGl2OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQW5jaG9yTW9kZWwgZ2V0QSgpIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgeworICAgICAgICAgICAgYSA9IG5ldyBBbmNob3JNb2RlbChzdGFjaywgcmVxLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdWJtaXRNb2RlbCBnZXRTdWJtaXQoKSB7CisgICAgICAgIGlmIChzdWJtaXQgPT0gbnVsbCkgeworICAgICAgICAgICAgc3VibWl0ID0gbmV3IFN1Ym1pdE1vZGVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VibWl0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9IZWFkTW9kZWwuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9IZWFkTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL0hlYWRNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuZnJlZW1hcmtlci50YWdzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkhlYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmZyZWVtYXJrZXIudGFncy5UYWdNb2RlbDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIEhlYWQKKyAqLworcHVibGljIGNsYXNzIEhlYWRNb2RlbCBleHRlbmRzIFRhZ01vZGVsIHsKKyAgICBwdWJsaWMgSGVhZE1vZGVsKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IEhlYWQoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvU3VibWl0TW9kZWwuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9TdWJtaXRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTVlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvU3VibWl0TW9kZWwuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmZyZWVtYXJrZXIudGFnczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5TdWJtaXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmZyZWVtYXJrZXIudGFncy5UYWdNb2RlbDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIFN1Ym1pdAorICovCitwdWJsaWMgY2xhc3MgU3VibWl0TW9kZWwgZXh0ZW5kcyBUYWdNb2RlbCB7CisKKyAgICBwdWJsaWMgU3VibWl0TW9kZWwoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgU3VibWl0KHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RhYmJlZFBhbmVsTW9kZWwuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9UYWJiZWRQYW5lbE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5N2VlOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9UYWJiZWRQYW5lbE1vZGVsLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuVGFiYmVkUGFuZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmZyZWVtYXJrZXIudGFncy5UYWdNb2RlbDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIFRhYmJlZFBhbmVsCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJiZWRQYW5lbE1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworICAgIHB1YmxpYyBUYWJiZWRQYW5lbE1vZGVsKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IFRhYmJlZFBhbmVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RleHRBcmVhTW9kZWwuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9UZXh0QXJlYU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZDMwNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2ZyZWVtYXJrZXIvdGFncy9UZXh0QXJlYU1vZGVsLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuVGV4dEFyZWE7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmZyZWVtYXJrZXIudGFncy5UYWdNb2RlbDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIFRleHRBcmVhCisgKi8KK3B1YmxpYyBjbGFzcyBUZXh0QXJlYU1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworICAgIHB1YmxpYyBUZXh0QXJlYU1vZGVsKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHN1cGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IFRleHRBcmVhKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RyZWVNb2RlbC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RyZWVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjY5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvVHJlZU1vZGVsLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5mcmVlbWFya2VyLnRhZ3M7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuVHJlZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuZnJlZW1hcmtlci50YWdzLlRhZ01vZGVsOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIFRyZWVNb2RlbAorICogQHNlZSBUcmVlCisgKgorICovCitwdWJsaWMgY2xhc3MgVHJlZU1vZGVsIGV4dGVuZHMgVGFnTW9kZWwgeworICAgIHB1YmxpYyBUcmVlTW9kZWwoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgVHJlZShzdGFjayxyZXEscmVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9mcmVlbWFya2VyL3RhZ3MvVHJlZU5vZGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RyZWVOb2RlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNkNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvZnJlZW1hcmtlci90YWdzL1RyZWVOb2RlTW9kZWwuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmZyZWVtYXJrZXIudGFnczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5UcmVlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuZnJlZW1hcmtlci50YWdzLlRhZ01vZGVsOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIFRyZWVOb2RlTW9kZWwKKyAqIEBzZWUgVHJlZU5vZGUKKyAqLworcHVibGljIGNsYXNzIFRyZWVOb2RlTW9kZWwgZXh0ZW5kcyBUYWdNb2RlbCB7CisgICAgcHVibGljIFRyZWVOb2RlTW9kZWwoVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgc3VwZXIoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUoc3RhY2sscmVxLHJlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0UmVtb3RlVGFnLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQWJzdHJhY3RSZW1vdGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjExZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0UmVtb3RlVGFnLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5SZW1vdGVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RDbG9zaW5nVGFnOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW1vdGVUYWcgZXh0ZW5kcyBBYnN0cmFjdENsb3NpbmdUYWcgeworCisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlzdGVuVG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgbm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9hZGluZ1RleHQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvclRleHQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleGVjdXRlU2NyaXB0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtSWQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtRmlsdGVyOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0Vycm9yVHJhbnNwb3J0VGV4dDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZGljYXRvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNob3dMb2FkaW5nVGV4dDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGJlZm9yZU5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFmdGVyTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBoaWdobGlnaHRDb2xvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhpZ2hsaWdodER1cmF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdGVTY3JpcHRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJhbnNwb3J0OworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyc2VDb250ZW50OworICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIFJlbW90ZUJlYW4gcmVtb3RlID0gKFJlbW90ZUJlYW4pIGNvbXBvbmVudDsKKyAgICAgICAgcmVtb3RlLnNldEhyZWYoaHJlZik7CisgICAgICAgIHJlbW90ZS5zZXRMaXN0ZW5Ub3BpY3MobGlzdGVuVG9waWNzKTsKKyAgICAgICAgcmVtb3RlLnNldExvYWRpbmdUZXh0KGxvYWRpbmdUZXh0KTsKKyAgICAgICAgcmVtb3RlLnNldEVycm9yVGV4dChlcnJvclRleHQpOworICAgICAgICByZW1vdGUuc2V0RXhlY3V0ZVNjcmlwdHMoZXhlY3V0ZVNjcmlwdHMpOworICAgICAgICByZW1vdGUuc2V0SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgcmVtb3RlLnNldEZvcm1GaWx0ZXIoZm9ybUZpbHRlcik7CisgICAgICAgIHJlbW90ZS5zZXRGb3JtSWQoZm9ybUlkKTsKKyAgICAgICAgcmVtb3RlLnNldE5vdGlmeVRvcGljcyhub3RpZnlUb3BpY3MpOworICAgICAgICByZW1vdGUuc2V0U2hvd0Vycm9yVHJhbnNwb3J0VGV4dChzaG93RXJyb3JUcmFuc3BvcnRUZXh0KTsKKyAgICAgICAgcmVtb3RlLnNldEluZGljYXRvcihpbmRpY2F0b3IpOworICAgICAgICByZW1vdGUuc2V0U2hvd0xvYWRpbmdUZXh0KHNob3dMb2FkaW5nVGV4dCk7CisgICAgICAgIHJlbW90ZS5zZXRBZnRlck5vdGlmeVRvcGljcyhhZnRlck5vdGlmeVRvcGljcyk7CisgICAgICAgIHJlbW90ZS5zZXRCZWZvcmVOb3RpZnlUb3BpY3MoYmVmb3JlTm90aWZ5VG9waWNzKTsKKyAgICAgICAgcmVtb3RlLnNldEVycm9yTm90aWZ5VG9waWNzKGVycm9yTm90aWZ5VG9waWNzKTsKKyAgICAgICAgcmVtb3RlLnNldEhpZ2hsaWdodENvbG9yKGhpZ2hsaWdodENvbG9yKTsKKyAgICAgICAgcmVtb3RlLnNldEhpZ2hsaWdodER1cmF0aW9uKGhpZ2hsaWdodER1cmF0aW9uKTsKKyAgICAgICAgcmVtb3RlLnNldFNlcGFyYXRlU2NyaXB0cyhzZXBhcmF0ZVNjcmlwdHMpOworICAgICAgICByZW1vdGUuc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIHJlbW90ZS5zZXRQYXJzZUNvbnRlbnQocGFyc2VDb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7CisgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JUZXh0KFN0cmluZyBlcnJvclRleHQpIHsKKyAgICAgICAgdGhpcy5lcnJvclRleHQgPSBlcnJvclRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1RleHQoU3RyaW5nIGxvYWRpbmdUZXh0KSB7CisgICAgICAgIHRoaXMubG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5Ub3BpY3MoU3RyaW5nIGxpc3RlblRvcGljcykgeworICAgICAgICB0aGlzLmxpc3RlblRvcGljcyA9IGxpc3RlblRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRlU2NyaXB0cyhTdHJpbmcgZXhlY3V0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5leGVjdXRlU2NyaXB0cyA9IGV4ZWN1dGVTY3JpcHRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoU3RyaW5nIGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtRmlsdGVyKFN0cmluZyBmb3JtRmlsdGVyKSB7CisgICAgICAgIHRoaXMuZm9ybUZpbHRlciA9IGZvcm1GaWx0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybUlkKFN0cmluZyBmb3JtSWQpIHsKKyAgICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5VG9waWNzKFN0cmluZyBub3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5ub3RpZnlUb3BpY3MgPSBub3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0Vycm9yVHJhbnNwb3J0VGV4dChTdHJpbmcgc2hvd0Vycm9yVHJhbnNwb3J0VGV4dCkgeworICAgICAgICB0aGlzLnNob3dFcnJvclRyYW5zcG9ydFRleHQgPSBzaG93RXJyb3JUcmFuc3BvcnRUZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluZGljYXRvcihTdHJpbmcgaW5kaWNhdG9yKSB7CisgICAgICAgIHRoaXMuaW5kaWNhdG9yID0gaW5kaWNhdG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3dMb2FkaW5nVGV4dChTdHJpbmcgc2hvd0xvYWRpbmdUZXh0KSB7CisgICAgICAgIHRoaXMuc2hvd0xvYWRpbmdUZXh0ID0gc2hvd0xvYWRpbmdUZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyTm90aWZ5VG9waWNzKFN0cmluZyBhZnRlck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzID0gYWZ0ZXJOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlTm90aWZ5VG9waWNzKFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MgPSBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JOb3RpZnlUb3BpY3MoU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MgPSBlcnJvck5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWdobGlnaHRDb2xvcihTdHJpbmcgaGlnaGxpZ2h0Q29sb3IpIHsKKyAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvciA9IGhpZ2hsaWdodENvbG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodER1cmF0aW9uKFN0cmluZyBoaWdobGlnaHREdXJhdGlvbikgeworICAgICAgICB0aGlzLmhpZ2hsaWdodER1cmF0aW9uID0gaGlnaGxpZ2h0RHVyYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VwYXJhdGVTY3JpcHRzKFN0cmluZyBzZXBhcmF0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5zZXBhcmF0ZVNjcmlwdHMgPSBzZXBhcmF0ZVNjcmlwdHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0KFN0cmluZyB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZW50KFN0cmluZyBwYXJzZUNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJzZUNvbnRlbnQgPSBwYXJzZUNvbnRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0VmFsaWRhdGVUYWcuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BYnN0cmFjdFZhbGlkYXRlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzZmZmOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BYnN0cmFjdFZhbGlkYXRlVGFnLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkFic3RyYWN0VmFsaWRhdGVCZWFuOworCisvKioKKyAqIEBzZWUgQWJzdHJhY3RWYWxpZGF0ZVRhZworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0ZVRhZyBleHRlbmRzIEFic3RyYWN0UmVtb3RlVGFnIHsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlOworICAgIHByb3RlY3RlZCBTdHJpbmcgYWpheEFmdGVyVmFsaWRhdGlvbjsKKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIEFic3RyYWN0VmFsaWRhdGVCZWFuIHZhbGlkYXRlQmVhbiA9IChBYnN0cmFjdFZhbGlkYXRlQmVhbikgY29tcG9uZW50OworICAgICAgICB2YWxpZGF0ZUJlYW4uc2V0VmFsaWRhdGUodmFsaWRhdGUpOworICAgICAgICB2YWxpZGF0ZUJlYW4uc2V0QWpheEFmdGVyVmFsaWRhdGlvbihhamF4QWZ0ZXJWYWxpZGF0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QWpheEFmdGVyVmFsaWRhdGlvbihTdHJpbmcgYWpheEFmdGVyVmFsaWRhdGlvbikgeworICAgICAgICB0aGlzLmFqYXhBZnRlclZhbGlkYXRpb24gPSBhamF4QWZ0ZXJWYWxpZGF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKFN0cmluZyB2YWxpZGF0ZSkgeworICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQW5jaG9yVGFnLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQW5jaG9yVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5NWM0MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BbmNob3JUYWcuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5BbmNob3I7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBBbmNob3IKKyAqLworcHVibGljIGNsYXNzIEFuY2hvclRhZyBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGVUYWcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEwMzQ2MTY1Nzg0OTI0MzExMTNMOworCisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRzOworICAgIAorICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IEFuY2hvcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIEFuY2hvciBsaW5rID0gKEFuY2hvcikgY29tcG9uZW50OworICAgICAgICBsaW5rLnNldFRhcmdldHModGFyZ2V0cyk7CisgICAgICAgIGxpbmsuc2V0VmFsaWRhdGUodmFsaWRhdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldHMoU3RyaW5nIHRhcmdldHMpIHsKKyAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0F1dG9jb21wbGV0ZXJUYWcuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BdXRvY29tcGxldGVyVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BdXRvY29tcGxldGVyVGFnLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkF1dG9jb21wbGV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmpzcC51aS5Db21ib0JveFRhZzsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIEF1dG9jb21wbGV0ZXIKKyAqLworcHVibGljIGNsYXNzIEF1dG9jb21wbGV0ZXJUYWcgZXh0ZW5kcyBDb21ib0JveFRhZyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTExMTI0NzA0NDc1NzMxNzI1ODFMOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JjZVZhbGlkT3B0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VhcmNoVHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF1dG9Db21wbGV0ZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlbGF5OworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlzYWJsZWQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIHByb3RlY3RlZCBTdHJpbmcgZHJvcGRvd25XaWR0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyb3Bkb3duSGVpZ2h0OworICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybUlkOworICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybUZpbHRlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RlblRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGluZGljYXRvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRPblRleHRDaGFuZ2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkTWluaW11bUNvdW50OworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0Rvd25BcnJvdzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGljb25QYXRoOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5TmFtZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFGaWVsZE5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhZnRlck5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWVOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZXN1bHRzTGltaXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0cmFuc3BvcnQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVsb2FkOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5VmFsdWU7CisgICAgCisgICAgcHVibGljIENvbXBvbmVudCBnZXRCZWFuKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXV0b2NvbXBsZXRlcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIEF1dG9jb21wbGV0ZXIgYXV0b2NvbXBsZXRlciA9IChBdXRvY29tcGxldGVyKSBjb21wb25lbnQ7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0QXV0b0NvbXBsZXRlKGF1dG9Db21wbGV0ZSk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0RGlzYWJsZWQoZGlzYWJsZWQpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEZvcmNlVmFsaWRPcHRpb24oZm9yY2VWYWxpZE9wdGlvbik7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0SHJlZihocmVmKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXREZWxheShkZWxheSk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0U2VhcmNoVHlwZShzZWFyY2hUeXBlKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXREcm9wZG93bkhlaWdodChkcm9wZG93bkhlaWdodCk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0RHJvcGRvd25XaWR0aChkcm9wZG93bldpZHRoKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXRGb3JtRmlsdGVyKGZvcm1GaWx0ZXIpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEZvcm1JZChmb3JtSWQpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldExpc3RlblRvcGljcyhsaXN0ZW5Ub3BpY3MpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldE5vdGlmeVRvcGljcyhub3RpZnlUb3BpY3MpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEluZGljYXRvcihpbmRpY2F0b3IpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldExvYWRNaW5pbXVtQ291bnQobG9hZE1pbmltdW1Db3VudCk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0TG9hZE9uVGV4dENoYW5nZShsb2FkT25UZXh0Q2hhbmdlKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXRTaG93RG93bkFycm93KHNob3dEb3duQXJyb3cpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldFRlbXBsYXRlQ3NzUGF0aCh0ZW1wbGF0ZUNzc1BhdGgpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEljb25QYXRoKGljb25QYXRoKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXRLZXlOYW1lKGtleU5hbWUpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldERhdGFGaWVsZE5hbWUoZGF0YUZpZWxkTmFtZSk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0QWZ0ZXJOb3RpZnlUb3BpY3MoYWZ0ZXJOb3RpZnlUb3BpY3MpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEJlZm9yZU5vdGlmeVRvcGljcyhiZWZvcmVOb3RpZnlUb3BpY3MpOworICAgICAgICBhdXRvY29tcGxldGVyLnNldEVycm9yTm90aWZ5VG9waWNzKGVycm9yTm90aWZ5VG9waWNzKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXRWYWx1ZU5vdGlmeVRvcGljcyh2YWx1ZU5vdGlmeVRvcGljcyk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0UmVzdWx0c0xpbWl0KHJlc3VsdHNMaW1pdCk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIGF1dG9jb21wbGV0ZXIuc2V0UHJlbG9hZChwcmVsb2FkKTsKKyAgICAgICAgYXV0b2NvbXBsZXRlci5zZXRLZXlWYWx1ZShrZXlWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0NvbXBsZXRlKFN0cmluZyBhdXRvQ29tcGxldGUpIHsKKyAgICAgICAgdGhpcy5hdXRvQ29tcGxldGUgPSBhdXRvQ29tcGxldGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoU3RyaW5nIGRpc2FibGVkKSB7CisgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZVZhbGlkT3B0aW9uKFN0cmluZyBmb3JjZVZhbGlkT3B0aW9uKSB7CisgICAgICAgIHRoaXMuZm9yY2VWYWxpZE9wdGlvbiA9IGZvcmNlVmFsaWRPcHRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgeworICAgICAgICB0aGlzLmhyZWYgPSBocmVmOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlbGF5KFN0cmluZyBzZWFyY2hEZWxheSkgeworICAgICAgICB0aGlzLmRlbGF5ID0gc2VhcmNoRGVsYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoVHlwZShTdHJpbmcgc2VhcmNoVHlwZSkgeworICAgICAgICB0aGlzLnNlYXJjaFR5cGUgPSBzZWFyY2hUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duSGVpZ2h0KFN0cmluZyBoZWlnaHQpIHsKKyAgICAgICAgdGhpcy5kcm9wZG93bkhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bldpZHRoKFN0cmluZyB3aWR0aCkgeworICAgICAgICB0aGlzLmRyb3Bkb3duV2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtRmlsdGVyKFN0cmluZyBmb3JtRmlsdGVyKSB7CisgICAgICB0aGlzLmZvcm1GaWx0ZXIgPSBmb3JtRmlsdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcm1JZChTdHJpbmcgZm9ybUlkKSB7CisgICAgICB0aGlzLmZvcm1JZCA9IGZvcm1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5Ub3BpY3MoU3RyaW5nIGxpc3RlblRvcGljcykgeworICAgICAgdGhpcy5saXN0ZW5Ub3BpY3MgPSBsaXN0ZW5Ub3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5VG9waWNzKFN0cmluZyBvblZhbHVlQ2hhbmdlZFB1Ymxpc2hUb3BpYykgeworICAgICAgdGhpcy5ub3RpZnlUb3BpY3MgPSBvblZhbHVlQ2hhbmdlZFB1Ymxpc2hUb3BpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRpY2F0b3IoU3RyaW5nIGluZGljYXRvcikgeworICAgICAgICB0aGlzLmluZGljYXRvciA9IGluZGljYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkTWluaW11bUNvdW50KFN0cmluZyBsb2FkTWluaW11bUNvdW50KSB7CisgICAgICAgIHRoaXMubG9hZE1pbmltdW1Db3VudCA9IGxvYWRNaW5pbXVtQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2FkTWluaW11bUNvdW50KCkgeworICAgICAgICByZXR1cm4gbG9hZE1pbmltdW1Db3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkT25UZXh0Q2hhbmdlKFN0cmluZyBsb2FkT25UZXh0Q2hhbmdlKSB7CisgICAgICAgIHRoaXMubG9hZE9uVGV4dENoYW5nZSA9IGxvYWRPblRleHRDaGFuZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0Rvd25BcnJvdyhTdHJpbmcgc2hvd0Rvd25BcnJvdykgeworICAgICAgICB0aGlzLnNob3dEb3duQXJyb3cgPSBzaG93RG93bkFycm93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlbXBsYXRlQ3NzUGF0aChTdHJpbmcgdGVtcGxhdGVDc3NQYXRoKSB7CisgICAgICAgIHRoaXMudGVtcGxhdGVDc3NQYXRoID0gdGVtcGxhdGVDc3NQYXRoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uUGF0aChTdHJpbmcgaWNvblBhdGgpIHsKKyAgICAgICAgdGhpcy5pY29uUGF0aCA9IGljb25QYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtleU5hbWUoU3RyaW5nIGtleU5hbWUpIHsKKyAgICAgICAgdGhpcy5rZXlOYW1lID0ga2V5TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhRmllbGROYW1lKFN0cmluZyBkYXRhRmllbGROYW1lKSB7CisgICAgICAgIHRoaXMuZGF0YUZpZWxkTmFtZSA9IGRhdGFGaWVsZE5hbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyTm90aWZ5VG9waWNzKFN0cmluZyBhZnRlck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzID0gYWZ0ZXJOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlTm90aWZ5VG9waWNzKFN0cmluZyBiZWZvcmVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MgPSBiZWZvcmVOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JOb3RpZnlUb3BpY3MoU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MgPSBlcnJvck5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZU5vdGlmeVRvcGljcyhTdHJpbmcgdmFsdWVOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy52YWx1ZU5vdGlmeVRvcGljcyA9IHZhbHVlTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdHNMaW1pdChTdHJpbmcgcmVzdWx0c0xpbWl0KSB7CisgICAgICAgIHRoaXMucmVzdWx0c0xpbWl0ID0gcmVzdWx0c0xpbWl0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydChTdHJpbmcgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZWxvYWQoU3RyaW5nIHByZWxvYWQpIHsKKyAgICAgICAgdGhpcy5wcmVsb2FkID0gcHJlbG9hZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlWYWx1ZShTdHJpbmcga2V5VmFsdWUpIHsKKyAgICAgICAgdGhpcy5rZXlWYWx1ZSA9IGtleVZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9CaW5kVGFnLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZFRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYmM5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZFRhZy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkJpbmQ7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKK3B1YmxpYyBjbGFzcyBCaW5kVGFnIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0ZVRhZyB7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgc291cmNlczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV2ZW50czsKKyAgICAKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5kKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLnBvcHVsYXRlUGFyYW1zKCk7CisKKyAgICAgICAgQmluZCBiaW5kID0gKEJpbmQpIGNvbXBvbmVudDsKKyAgICAgICAgYmluZC5zZXRUYXJnZXRzKHRhcmdldHMpOworICAgICAgICBiaW5kLnNldFNvdXJjZXMoc291cmNlcyk7CisgICAgICAgIGJpbmQuc2V0RXZlbnRzKGV2ZW50cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXZlbnRzKFN0cmluZyBldmVudHMpIHsKKyAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlcyhTdHJpbmcgc291cmNlcykgeworICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldHMoU3RyaW5nIHRhcmdldHMpIHsKKyAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGF0ZVRpbWVQaWNrZXJUYWcuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkM2MxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGF0ZVRpbWVQaWNrZXJUYWcuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuRGF0ZVRpbWVQaWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmpzcC51aS5BYnN0cmFjdFVJVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgRGF0ZVRpbWVQaWNrZXIKKyAqLworcHVibGljIGNsYXNzIERhdGVUaW1lUGlja2VyVGFnIGV4dGVuZHMgQWJzdHJhY3RVSVRhZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDU0MTE0NTA3MTQzNDQ3MjMyTDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVdlZWtzOworICAgIHByb3RlY3RlZCBTdHJpbmcgYWRqdXN0V2Vla3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdGFydERhdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlbmREYXRlOworICAgIHByb3RlY3RlZCBTdHJpbmcgd2Vla1N0YXJ0c09uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhdGljRGlzcGxheTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRheVdpZHRoOworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgCisgICAgcHJvdGVjdGVkIFN0cmluZyBpY29uUGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdExlbmd0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlGb3JtYXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2dnbGVUeXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgdG9nZ2xlRHVyYXRpb247CisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcGxhdGVDc3NQYXRoOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWVOb3RpZnlUb3BpY3M7CisKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZVBpY2tlcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIGZpbmFsIERhdGVUaW1lUGlja2VyIGRhdGVUaW1lUGlja2VyID0gKERhdGVUaW1lUGlja2VyKSBjb21wb25lbnQ7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldEFkanVzdFdlZWtzKGFkanVzdFdlZWtzKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0RGF5V2lkdGgoZGF5V2lkdGgpOworICAgICAgICBkYXRlVGltZVBpY2tlci5zZXREaXNwbGF5V2Vla3MoZGlzcGxheVdlZWtzKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0RW5kRGF0ZShlbmREYXRlKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZSk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldFN0YXRpY0Rpc3BsYXkoc3RhdGljRGlzcGxheSk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldFdlZWtTdGFydHNPbih3ZWVrU3RhcnRzT24pOworICAgICAgICBkYXRlVGltZVBpY2tlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldEljb25QYXRoKGljb25QYXRoKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0Rm9ybWF0TGVuZ3RoKGZvcm1hdExlbmd0aCk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldERpc3BsYXlGb3JtYXQoZGlzcGxheUZvcm1hdCk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldFRvZ2dsZVR5cGUodG9nZ2xlVHlwZSk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldFRvZ2dsZUR1cmF0aW9uKHRvZ2dsZUR1cmF0aW9uKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0VGVtcGxhdGVDc3NQYXRoKHRlbXBsYXRlQ3NzUGF0aCk7CisgICAgICAgIGRhdGVUaW1lUGlja2VyLnNldFZhbHVlTm90aWZ5VG9waWNzKHZhbHVlTm90aWZ5VG9waWNzKTsKKyAgICAgICAgZGF0ZVRpbWVQaWNrZXIuc2V0RGlzYWJsZWQoZGlzYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkanVzdFdlZWtzKFN0cmluZyBhZGp1c3RXZWVrcykgeworICAgICAgICB0aGlzLmFkanVzdFdlZWtzID0gYWRqdXN0V2Vla3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF5V2lkdGgoU3RyaW5nIGRheVdpZHRoKSB7CisgICAgICAgIHRoaXMuZGF5V2lkdGggPSBkYXlXaWR0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5V2Vla3MoU3RyaW5nIGRpc3BsYXlXZWVrcykgeworICAgICAgICB0aGlzLmRpc3BsYXlXZWVrcyA9IGRpc3BsYXlXZWVrczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmREYXRlKFN0cmluZyBlbmREYXRlKSB7CisgICAgICAgIHRoaXMuZW5kRGF0ZSA9IGVuZERhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKFN0cmluZyBzdGFydERhdGUpIHsKKyAgICAgICAgdGhpcy5zdGFydERhdGUgPSBzdGFydERhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGljRGlzcGxheShTdHJpbmcgc3RhdGljRGlzcGxheSkgeworICAgICAgICB0aGlzLnN0YXRpY0Rpc3BsYXkgPSBzdGF0aWNEaXNwbGF5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdlZWtTdGFydHNPbihTdHJpbmcgd2Vla1N0YXJ0c09uKSB7CisgICAgICAgIHRoaXMud2Vla1N0YXJ0c09uID0gd2Vla1N0YXJ0c09uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlGb3JtYXQoU3RyaW5nIGRpc3BsYXlGb3JtYXQpIHsKKyAgICAgICAgdGhpcy5kaXNwbGF5Rm9ybWF0ID0gZGlzcGxheUZvcm1hdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXRMZW5ndGgoU3RyaW5nIGZvcm1hdExlbmd0aCkgeworICAgICAgICB0aGlzLmZvcm1hdExlbmd0aCA9IGZvcm1hdExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uUGF0aChTdHJpbmcgaWNvblBhdGgpIHsKKyAgICAgICAgdGhpcy5pY29uUGF0aCA9IGljb25QYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvZ2dsZUR1cmF0aW9uKFN0cmluZyB0b2dnbGVEdXJhdGlvbikgeworICAgICAgICB0aGlzLnRvZ2dsZUR1cmF0aW9uID0gdG9nZ2xlRHVyYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG9nZ2xlVHlwZShTdHJpbmcgdG9nZ2xlVHlwZSkgeworICAgICAgICB0aGlzLnRvZ2dsZVR5cGUgPSB0b2dnbGVUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGVDc3NQYXRoKFN0cmluZyB0ZW1wbGF0ZUNzc1BhdGgpIHsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZUNzc1BhdGggPSB0ZW1wbGF0ZUNzc1BhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVOb3RpZnlUb3BpY3MoU3RyaW5nIHZhbHVlTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMudmFsdWVOb3RpZnlUb3BpY3MgPSB2YWx1ZU5vdGlmeVRvcGljczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGl2VGFnLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGl2VGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNDRmYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EaXZUYWcuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuRGl2OworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCitwdWJsaWMgY2xhc3MgRGl2VGFnIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVUYWcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTMwOTIzMTAzNTkxNjQ2MTc1OEw7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZUZyZXE7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhdXRvU3RhcnQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBkZWxheTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdG9wVGltZXJMaXN0ZW5Ub3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZWZyZXNoT25TaG93OworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdGVTY3JpcHRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgY2xvc2FibGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVsb2FkOworICAgIAorICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IERpdihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIERpdiBkaXYgPSAoRGl2KSBjb21wb25lbnQ7CisgICAgICAgIGRpdi5zZXRVcGRhdGVGcmVxKHVwZGF0ZUZyZXEpOworICAgICAgICBkaXYuc2V0QXV0b1N0YXJ0KGF1dG9TdGFydCk7CisgICAgICAgIGRpdi5zZXREZWxheShkZWxheSk7CisgICAgICAgIGRpdi5zZXRTdGFydFRpbWVyTGlzdGVuVG9waWNzKHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MpOworICAgICAgICBkaXYuc2V0U3RvcFRpbWVyTGlzdGVuVG9waWNzKHN0b3BUaW1lckxpc3RlblRvcGljcyk7CisgICAgICAgIGRpdi5zZXRSZWZyZXNoT25TaG93KHJlZnJlc2hPblNob3cpOworICAgICAgICBkaXYuc2V0U2VwYXJhdGVTY3JpcHRzKHNlcGFyYXRlU2NyaXB0cyk7CisgICAgICAgIGRpdi5zZXRDbG9zYWJsZShjbG9zYWJsZSk7CisgICAgICAgIGRpdi5zZXRQcmVsb2FkKHByZWxvYWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChTdHJpbmcgYXV0b1N0YXJ0KSB7CisgICAgICAgIHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlbGF5KFN0cmluZyBkZWxheSkgeworICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlRnJlcShTdHJpbmcgdXBkYXRlSW50ZXJ2YWwpIHsKKyAgICAgICAgdGhpcy51cGRhdGVGcmVxID0gdXBkYXRlSW50ZXJ2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lckxpc3RlblRvcGljcyhTdHJpbmcgc3RhcnRUaW1lckxpc3RlblRvcGljKSB7CisgICAgICAgIHRoaXMuc3RhcnRUaW1lckxpc3RlblRvcGljcyA9IHN0YXJ0VGltZXJMaXN0ZW5Ub3BpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9wVGltZXJMaXN0ZW5Ub3BpY3MoU3RyaW5nIHN0b3BUaW1lckxpc3RlblRvcGljKSB7CisgICAgICAgIHRoaXMuc3RvcFRpbWVyTGlzdGVuVG9waWNzID0gc3RvcFRpbWVyTGlzdGVuVG9waWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVmcmVzaE9uU2hvdyhTdHJpbmcgcmVmcmVzaE9uU2hvdykgeworICAgICAgICB0aGlzLnJlZnJlc2hPblNob3cgPSByZWZyZXNoT25TaG93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcGFyYXRlU2NyaXB0cyhTdHJpbmcgc2VwYXJhdGVTY3JpcHRzKSB7CisgICAgICAgIHRoaXMuc2VwYXJhdGVTY3JpcHRzID0gc2VwYXJhdGVTY3JpcHRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsb3NhYmxlKFN0cmluZyBjbG9zYWJsZSkgeworICAgICAgICB0aGlzLmNsb3NhYmxlID0gY2xvc2FibGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByZWxvYWQoU3RyaW5nIHByZWxvYWQpIHsKKyAgICAgICAgdGhpcy5wcmVsb2FkID0gcHJlbG9hZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvSGVhZFRhZy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0hlYWRUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE3YTgxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0hlYWRUYWcuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5IZWFkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RVSVRhZzsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIEhlYWQKKyAqLworcHVibGljIGNsYXNzIEhlYWRUYWcgZXh0ZW5kcyBBYnN0cmFjdFVJVGFnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NzY3NjU3NjkxNzUyNDYwMzBMOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVidWc7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcHJlc3NlZDsKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlUmVsYXRpdmVQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhTG9jYWxlczsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2FjaGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VDb250ZW50OworICAgIAorICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IEhlYWQoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVBhcmFtcygpIHsKKyAgICAgICAgc3VwZXIucG9wdWxhdGVQYXJhbXMoKTsKKyAgICAgICAgCisgICAgICAgIEhlYWQgaGVhZCA9IChIZWFkKSBjb21wb25lbnQ7CisgICAgICAgIGhlYWQuc2V0RGVidWcoZGVidWcpOworICAgICAgICBoZWFkLnNldENvbXByZXNzZWQoY29tcHJlc3NlZCk7CisgICAgICAgIGhlYWQuc2V0QmFzZVJlbGF0aXZlUGF0aChiYXNlUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgaGVhZC5zZXRFeHRyYUxvY2FsZXMoZXh0cmFMb2NhbGVzKTsKKyAgICAgICAgaGVhZC5zZXRMb2NhbGUobG9jYWxlKTsKKyAgICAgICAgaGVhZC5zZXRDYWNoZShjYWNoZSk7CisgICAgICAgIGhlYWQuc2V0UGFyc2VDb250ZW50KHBhcnNlQ29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlUmVsYXRpdmVQYXRoKFN0cmluZyBiYXNlUmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHRoaXMuYmFzZVJlbGF0aXZlUGF0aCA9IGJhc2VSZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3NlZChTdHJpbmcgY29tcHJlc3NlZCkgeworICAgICAgICB0aGlzLmNvbXByZXNzZWQgPSBjb21wcmVzc2VkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhTG9jYWxlcyhTdHJpbmcgZXh0cmFMb2NhbGVzKSB7CisgICAgICAgIHRoaXMuZXh0cmFMb2NhbGVzID0gZXh0cmFMb2NhbGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlKFN0cmluZyBjYWNoZSkgeworICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZW50KFN0cmluZyBwYXJzZUNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJzZUNvbnRlbnQgPSBwYXJzZUNvbnRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N1Ym1pdFRhZy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N1Ym1pdFRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWI4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3VibWl0VGFnLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlN1Ym1pdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuanNwLnVpLkFic3RyYWN0VUlUYWc7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBTdWJtaXQKKyAqLworcHVibGljIGNsYXNzIFN1Ym1pdFRhZyBleHRlbmRzIEFic3RyYWN0VUlUYWcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE3OTI4MTEwOTk1ODMwMTM0M0w7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWduOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhyZWY7CisgICAgcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5Ub3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBub3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkaW5nVGV4dDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yVGV4dDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4ZWN1dGVTY3JpcHRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1JZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1GaWx0ZXI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzcmM7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG93RXJyb3JUcmFuc3BvcnRUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5kaWNhdG9yOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd0xvYWRpbmdUZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGJlZm9yZU5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFmdGVyTm90aWZ5VG9waWNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBoaWdobGlnaHRDb2xvcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhpZ2hsaWdodER1cmF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhamF4QWZ0ZXJWYWxpZGF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdGVTY3JpcHRzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJhbnNwb3J0OworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyc2VDb250ZW50OworICAgIAorICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFN1Ym1pdChzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUGFyYW1zKCkgeworICAgICAgICBzdXBlci5wb3B1bGF0ZVBhcmFtcygpOworCisgICAgICAgIFN1Ym1pdCBzdWJtaXQgPSAoKFN1Ym1pdCkgY29tcG9uZW50KTsKKyAgICAgICAgc3VibWl0LnNldE1ldGhvZChtZXRob2QpOworICAgICAgICBzdWJtaXQuc2V0QWxpZ24oYWxpZ24pOworICAgICAgICBzdWJtaXQuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc3VibWl0LnNldEhyZWYoaHJlZik7CisgICAgICAgIHN1Ym1pdC5zZXRMaXN0ZW5Ub3BpY3MobGlzdGVuVG9waWNzKTsKKyAgICAgICAgc3VibWl0LnNldExvYWRpbmdUZXh0KGxvYWRpbmdUZXh0KTsKKyAgICAgICAgc3VibWl0LnNldEVycm9yVGV4dChlcnJvclRleHQpOworICAgICAgICBzdWJtaXQuc2V0RXhlY3V0ZVNjcmlwdHMoZXhlY3V0ZVNjcmlwdHMpOworICAgICAgICBzdWJtaXQuc2V0SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgc3VibWl0LnNldEZvcm1GaWx0ZXIoZm9ybUZpbHRlcik7CisgICAgICAgIHN1Ym1pdC5zZXRGb3JtSWQoZm9ybUlkKTsKKyAgICAgICAgc3VibWl0LnNldFNyYyhzcmMpOworICAgICAgICBzdWJtaXQuc2V0VGFyZ2V0cyh0YXJnZXRzKTsKKyAgICAgICAgc3VibWl0LnNldE5vdGlmeVRvcGljcyhub3RpZnlUb3BpY3MpOworICAgICAgICBzdWJtaXQuc2V0U2hvd0Vycm9yVHJhbnNwb3J0VGV4dChzaG93RXJyb3JUcmFuc3BvcnRUZXh0KTsKKyAgICAgICAgc3VibWl0LnNldEluZGljYXRvcihpbmRpY2F0b3IpOworICAgICAgICBzdWJtaXQuc2V0U2hvd0xvYWRpbmdUZXh0KHNob3dMb2FkaW5nVGV4dCk7CisgICAgICAgIHN1Ym1pdC5zZXRBZnRlck5vdGlmeVRvcGljcyhhZnRlck5vdGlmeVRvcGljcyk7CisgICAgICAgIHN1Ym1pdC5zZXRCZWZvcmVOb3RpZnlUb3BpY3MoYmVmb3JlTm90aWZ5VG9waWNzKTsKKyAgICAgICAgc3VibWl0LnNldEVycm9yTm90aWZ5VG9waWNzKGVycm9yTm90aWZ5VG9waWNzKTsKKyAgICAgICAgc3VibWl0LnNldEhpZ2hsaWdodENvbG9yKGhpZ2hsaWdodENvbG9yKTsKKyAgICAgICAgc3VibWl0LnNldEhpZ2hsaWdodER1cmF0aW9uKGhpZ2hsaWdodER1cmF0aW9uKTsKKyAgICAgICAgc3VibWl0LnNldFZhbGlkYXRlKHZhbGlkYXRlKTsKKyAgICAgICAgc3VibWl0LnNldEFqYXhBZnRlclZhbGlkYXRpb24oYWpheEFmdGVyVmFsaWRhdGlvbik7CisgICAgICAgIHN1Ym1pdC5zZXRTZXBhcmF0ZVNjcmlwdHMoc2VwYXJhdGVTY3JpcHRzKTsKKyAgICAgICAgc3VibWl0LnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICBzdWJtaXQuc2V0UGFyc2VDb250ZW50KHBhcnNlQ29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7CisgICAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7CisgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JUZXh0KFN0cmluZyBlcnJvclRleHQpIHsKKyAgICAgICAgdGhpcy5lcnJvclRleHQgPSBlcnJvclRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1RleHQoU3RyaW5nIGxvYWRpbmdUZXh0KSB7CisgICAgICAgIHRoaXMubG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5Ub3BpY3MoU3RyaW5nIGxpc3RlblRvcGljcykgeworICAgICAgICB0aGlzLmxpc3RlblRvcGljcyA9IGxpc3RlblRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRlU2NyaXB0cyhTdHJpbmcgZXhlY3V0ZVNjcmlwdHMpIHsKKyAgICAgICAgdGhpcy5leGVjdXRlU2NyaXB0cyA9IGV4ZWN1dGVTY3JpcHRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoU3RyaW5nIGhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtRmlsdGVyKFN0cmluZyBmb3JtRmlsdGVyKSB7CisgICAgICAgIHRoaXMuZm9ybUZpbHRlciA9IGZvcm1GaWx0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybUlkKFN0cmluZyBmb3JtSWQpIHsKKyAgICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKKyAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0cyhTdHJpbmcgdGFyZ2V0cykgeworICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeVRvcGljcyhTdHJpbmcgbm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMubm90aWZ5VG9waWNzID0gbm90aWZ5VG9waWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3dFcnJvclRyYW5zcG9ydFRleHQoU3RyaW5nIHNob3dFcnJvclRyYW5zcG9ydFRleHQpIHsKKyAgICAgICAgdGhpcy5zaG93RXJyb3JUcmFuc3BvcnRUZXh0ID0gc2hvd0Vycm9yVHJhbnNwb3J0VGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRpY2F0b3IoU3RyaW5nIGluZGljYXRvcikgeworICAgICAgICB0aGlzLmluZGljYXRvciA9IGluZGljYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93TG9hZGluZ1RleHQoU3RyaW5nIHNob3dMb2FkaW5nVGV4dCkgeworICAgICAgICB0aGlzLnNob3dMb2FkaW5nVGV4dCA9IHNob3dMb2FkaW5nVGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZnRlck5vdGlmeVRvcGljcyhTdHJpbmcgYWZ0ZXJOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5hZnRlck5vdGlmeVRvcGljcyA9IGFmdGVyTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJlZm9yZU5vdGlmeVRvcGljcyhTdHJpbmcgYmVmb3JlTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzID0gYmVmb3JlTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTm90aWZ5VG9waWNzKFN0cmluZyBlcnJvck5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzID0gZXJyb3JOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0Q29sb3IoU3RyaW5nIGhpZ2hsaWdodENvbG9yKSB7CisgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3IgPSBoaWdobGlnaHRDb2xvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWdobGlnaHREdXJhdGlvbihTdHJpbmcgaGlnaGxpZ2h0RHVyYXRpb24pIHsKKyAgICAgICAgdGhpcy5oaWdobGlnaHREdXJhdGlvbiA9IGhpZ2hsaWdodER1cmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKFN0cmluZyB2YWxpZGF0ZSkgeworICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWpheEFmdGVyVmFsaWRhdGlvbihTdHJpbmcgYWpheEFmdGVyVmFsaWRhdGlvbikgeworICAgICAgICB0aGlzLmFqYXhBZnRlclZhbGlkYXRpb24gPSBhamF4QWZ0ZXJWYWxpZGF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcGFyYXRlU2NyaXB0cyhTdHJpbmcgc2VwYXJhdGVTY3JpcHRzKSB7CisgICAgICAgIHRoaXMuc2VwYXJhdGVTY3JpcHRzID0gc2VwYXJhdGVTY3JpcHRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydChTdHJpbmcgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGVudChTdHJpbmcgcGFyc2VDb250ZW50KSB7CisgICAgICAgIHRoaXMucGFyc2VDb250ZW50ID0gcGFyc2VDb250ZW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbFRhZy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4YjQwZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbFRhZy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlRhYmJlZFBhbmVsOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RDbG9zaW5nVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgVGFiYmVkUGFuZWwKKyAqLworcHVibGljIGNsYXNzIFRhYmJlZFBhbmVsVGFnIGV4dGVuZHMgQWJzdHJhY3RDbG9zaW5nVGFnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NzE5OTMwMjA1NTE1Mzg2MjUyTDsKKworICAgIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgU3RyaW5nIGNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgU3RyaW5nIGRvTGF5b3V0OworICAgIHByaXZhdGUgU3RyaW5nIHRlbXBsYXRlQ3NzUGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3M7CisgICAgcHJpdmF0ZSBTdHJpbmcgYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3M7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzYWJsZWRUYWJDc3NDbGFzczsKKyAgICBwcml2YXRlIFN0cmluZyB1c2VTZWxlY3RlZFRhYkNvb2tpZTsKKworICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFRhYmJlZFBhbmVsKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLnBvcHVsYXRlUGFyYW1zKCk7CisgICAgICAgIFRhYmJlZFBhbmVsIHRhYmJlZFBhbmVsID0gKFRhYmJlZFBhbmVsKSBjb21wb25lbnQ7CisgICAgICAgIHRhYmJlZFBhbmVsLnNldFNlbGVjdGVkVGFiKHNlbGVjdGVkVGFiKTsKKyAgICAgICAgdGFiYmVkUGFuZWwuc2V0Q2xvc2VCdXR0b24oY2xvc2VCdXR0b24pOworICAgICAgICB0YWJiZWRQYW5lbC5zZXREb0xheW91dChkb0xheW91dCk7CisgICAgICAgIHRhYmJlZFBhbmVsLnNldExhYmVscG9zaXRpb24obGFiZWxwb3NpdGlvbik7CisgICAgICAgIHRhYmJlZFBhbmVsLnNldFRlbXBsYXRlQ3NzUGF0aCh0ZW1wbGF0ZUNzc1BhdGgpOworICAgICAgICB0YWJiZWRQYW5lbC5zZXRCZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MoYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzKTsKKyAgICAgICAgdGFiYmVkUGFuZWwuc2V0QWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MoYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MpOworICAgICAgICB0YWJiZWRQYW5lbC5zZXREaXNhYmxlZFRhYkNzc0NsYXNzKGRpc2FibGVkVGFiQ3NzQ2xhc3MpOworICAgICAgICB0YWJiZWRQYW5lbC5zZXRVc2VTZWxlY3RlZFRhYkNvb2tpZSh1c2VTZWxlY3RlZFRhYkNvb2tpZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRUYWIoU3RyaW5nIHNlbGVjdGVkVGFiKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSBzZWxlY3RlZFRhYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9zZUJ1dHRvbihTdHJpbmcgY2xvc2VCdXR0b24pIHsKKyAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IGNsb3NlQnV0dG9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvTGF5b3V0KFN0cmluZyBkb0xheW91dCkgeworICAgICAgICB0aGlzLmRvTGF5b3V0ID0gZG9MYXlvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGxhdGVDc3NQYXRoKFN0cmluZyB0ZW1wbGF0ZUNzc1BhdGgpIHsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZUNzc1BhdGggPSB0ZW1wbGF0ZUNzc1BhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzKFN0cmluZyBiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MgPSBiZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MoU3RyaW5nIGFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3MgPSBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlZFRhYkNzc0NsYXNzKFN0cmluZyBkaXNhYmxlZFRhYkNzc0NsYXNzKSB7CisgICAgICAgIHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcyA9IGRpc2FibGVkVGFiQ3NzQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlU2VsZWN0ZWRUYWJDb29raWUoIFN0cmluZyB1c2VTZWxlY3RlZFRhYkNvb2tpZSApIHsKKyAgICAgICAgdGhpcy51c2VTZWxlY3RlZFRhYkNvb2tpZSA9IHVzZVNlbGVjdGVkVGFiQ29va2llOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UZXh0YXJlYVRhZy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RleHRhcmVhVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3ZWJkMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UZXh0YXJlYVRhZy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlRleHRBcmVhOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisKKy8qKgorICogQHNlZSBUZXh0QXJlYQorICoKKyAqLworcHVibGljIGNsYXNzIFRleHRhcmVhVGFnIGV4dGVuZHMgIG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuVGV4dGFyZWFUYWd7CisgICAgcHVibGljIENvbXBvbmVudCBnZXRCZWFuKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGV4dEFyZWEoc3RhY2ssIHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVBhcmFtcygpIHsKKyAgICAgICAgc3VwZXIucG9wdWxhdGVQYXJhbXMoKTsKKworICAgICAgICBUZXh0QXJlYSB0ZXh0QXJlYSA9ICgoVGV4dEFyZWEpIGNvbXBvbmVudCk7CisgICAgICAgIHRleHRBcmVhLnNldENvbHMoY29scyk7CisgICAgICAgIHRleHRBcmVhLnNldFJlYWRvbmx5KHJlYWRvbmx5KTsKKyAgICAgICAgdGV4dEFyZWEuc2V0Um93cyhyb3dzKTsKKyAgICAgICAgdGV4dEFyZWEuc2V0V3JhcCh3cmFwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UcmVlTm9kZVRhZy5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RyZWVOb2RlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxYTJkNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UcmVlTm9kZVRhZy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlRyZWVOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RDbG9zaW5nVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgVHJlZU5vZGUKKyAqLworcHVibGljIGNsYXNzIFRyZWVOb2RlVGFnIGV4dGVuZHMgQWJzdHJhY3RDbG9zaW5nVGFnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDczNDA3NDY5NDMwMTc5MDA4MDNMOworCisKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZShzdGFjayxyZXEscmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKworICAgIC8vIE5PVEU6IG5vdCBuZWNlc3NhcnksIGxhYmVsIHByb3BlcnR5IGlzIGluaGVyaXRlZCwgd2lsbCBiZSBwb3B1bGF0ZWQKKyAgICAvLyBieSBzdXBlci1jbGFzcworICAgIC8qcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQYXJhbXMoKSB7CisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBUcmVlTm9kZSB0cmVlTm9kZSA9IChUcmVlTm9kZSljb21wb25lbnQ7CisgICAgICAgICAgICB0cmVlTm9kZS5zZXRMYWJlbChsYWJlbCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIucG9wdWxhdGVQYXJhbXMoKTsKKyAgICB9Ki8KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UcmVlVGFnLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVHJlZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmVmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVHJlZVRhZy5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5UcmVlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RDbG9zaW5nVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgVHJlZQorICovCitwdWJsaWMgY2xhc3MgVHJlZVRhZyBleHRlbmRzIEFic3RyYWN0Q2xvc2luZ1RhZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzM1MjE4NTAxMDU4NTQ4MDEzTDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgdG9nZ2xlOworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWROb3RpZnlUb3BpY3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleHBhbmRlZE5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbGxhcHNlZE5vdGlmeVRvcGljczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJvb3ROb2RlOworICAgIHByb3RlY3RlZCBTdHJpbmcgY2hpbGRDb2xsZWN0aW9uUHJvcGVydHk7CisgICAgcHJvdGVjdGVkIFN0cmluZyBub2RlVGl0bGVQcm9wZXJ0eTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vZGVJZFByb3BlcnR5OworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hvd1Jvb3RHcmlkOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG93R3JpZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGJsYW5rSWNvblNyYzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjTDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjVjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjUDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjQzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjWDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyaWRJY29uU3JjWTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4cGFuZEljb25TcmNQbHVzOworICAgIHByb3RlY3RlZCBTdHJpbmcgZXhwYW5kSWNvblNyY01pbnVzOworICAgIHByb3RlY3RlZCBTdHJpbmcgaWNvbldpZHRoOworICAgIHByb3RlY3RlZCBTdHJpbmcgaWNvbkhlaWdodDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvZ2dsZUR1cmF0aW9uOworICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcGxhdGVDc3NQYXRoOworICAgIHByb3RlY3RlZCBTdHJpbmcgaHJlZjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzOworICAgIAorICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFRyZWUoc3RhY2sscmVxLHJlcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQYXJhbXMoKSB7CisgICAgICAgIHN1cGVyLnBvcHVsYXRlUGFyYW1zKCk7CisKKyAgICAgICAgVHJlZSB0cmVlID0gKFRyZWUpIGNvbXBvbmVudDsKKyAgICAgICAgdHJlZS5zZXRDaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eShjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSk7CisgICAgICAgIHRyZWUuc2V0Tm9kZUlkUHJvcGVydHkobm9kZUlkUHJvcGVydHkpOworICAgICAgICB0cmVlLnNldE5vZGVUaXRsZVByb3BlcnR5KG5vZGVUaXRsZVByb3BlcnR5KTsKKyAgICAgICAgdHJlZS5zZXRSb290Tm9kZShyb290Tm9kZSk7CisgICAgICAgIHRyZWUuc2V0VG9nZ2xlKHRvZ2dsZSk7CisgICAgICAgIHRyZWUuc2V0U2VsZWN0ZWROb3RpZnlUb3BpY3Moc2VsZWN0ZWROb3RpZnlUb3BpY3MpOworICAgICAgICB0cmVlLnNldEV4cGFuZGVkTm90aWZ5VG9waWNzKGV4cGFuZGVkTm90aWZ5VG9waWNzKTsKKyAgICAgICAgdHJlZS5zZXRDb2xsYXBzZWROb3RpZnlUb3BpY3MoY29sbGFwc2VkTm90aWZ5VG9waWNzKTsKKyAgICAgICAgdHJlZS5zZXRTaG93Um9vdEdyaWQoc2hvd1Jvb3RHcmlkKTsKKworICAgICAgICB0cmVlLnNldFNob3dHcmlkKHNob3dHcmlkKTsKKyAgICAgICAgdHJlZS5zZXRCbGFua0ljb25TcmMoYmxhbmtJY29uU3JjKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY0woZ3JpZEljb25TcmNDKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY1YoZ3JpZEljb25TcmNWKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY1AoZ3JpZEljb25TcmNQKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY0MoZ3JpZEljb25TcmNDKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY1goZ3JpZEljb25TcmNYKTsKKyAgICAgICAgdHJlZS5zZXRHcmlkSWNvblNyY1koZ3JpZEljb25TcmNZKTsKKyAgICAgICAgdHJlZS5zZXRFeHBhbmRJY29uU3JjUGx1cyhleHBhbmRJY29uU3JjUGx1cyk7CisgICAgICAgIHRyZWUuc2V0RXhwYW5kSWNvblNyY01pbnVzKGV4cGFuZEljb25TcmNNaW51cyk7CisgICAgICAgIHRyZWUuc2V0SWNvbldpZHRoKGljb25XaWR0aCk7CisgICAgICAgIHRyZWUuc2V0SWNvbkhlaWdodChpY29uSGVpZ2h0KTsKKyAgICAgICAgdHJlZS5zZXRUb2dnbGVEdXJhdGlvbih0b2dnbGVEdXJhdGlvbik7CisgICAgICAgIHRyZWUuc2V0VGVtcGxhdGVDc3NQYXRoKHRlbXBsYXRlQ3NzUGF0aCk7CisgICAgICAgIHRyZWUuc2V0SHJlZihocmVmKTsKKyAgICAgICAgdHJlZS5zZXRFcnJvck5vdGlmeVRvcGljcyhlcnJvck5vdGlmeVRvcGljcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb2dnbGUoKSB7CisgICAgICAgIHJldHVybiB0b2dnbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG9nZ2xlKFN0cmluZyB0b2dnbGUpIHsKKyAgICAgICAgdGhpcy50b2dnbGUgPSB0b2dnbGU7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmVlU2VsZWN0ZWRUb3BpYyhTdHJpbmcgdHJlZVNlbGVjdGVkVG9waWMpIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcyA9IHRyZWVTZWxlY3RlZFRvcGljOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgc2V0VHJlZUV4cGFuZGVkVG9waWMoU3RyaW5nIHRyZWVFeHBhbmRlZFRvcGljKSB7CisgICAgICAgIHRoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3MgPSB0cmVlRXhwYW5kZWRUb3BpYzsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHNldFRyZWVDb2xsYXBzZWRUb3BpYyhTdHJpbmcgdHJlZUNvbGxhcHNlZFRvcGljKSB7CisgICAgICAgIHRoaXMuY29sbGFwc2VkTm90aWZ5VG9waWNzID0gdHJlZUNvbGxhcHNlZFRvcGljOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5vZGUoKSB7CisgICAgICAgIHJldHVybiByb290Tm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb290Tm9kZShTdHJpbmcgcm9vdE5vZGUpIHsKKyAgICAgICAgdGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRDb2xsZWN0aW9uUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBjaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eShTdHJpbmcgY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5jaGlsZENvbGxlY3Rpb25Qcm9wZXJ0eSA9IGNoaWxkQ29sbGVjdGlvblByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVRpdGxlUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBub2RlVGl0bGVQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlVGl0bGVQcm9wZXJ0eShTdHJpbmcgbm9kZVRpdGxlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5ub2RlVGl0bGVQcm9wZXJ0eSA9IG5vZGVUaXRsZVByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUlkUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBub2RlSWRQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlSWRQcm9wZXJ0eShTdHJpbmcgbm9kZUlkUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5ub2RlSWRQcm9wZXJ0eSA9IG5vZGVJZFByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvd1Jvb3RHcmlkKCkgeworICAgICAgICByZXR1cm4gc2hvd1Jvb3RHcmlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3dSb290R3JpZChTdHJpbmcgc2hvd1Jvb3RHcmlkKSB7CisgICAgICAgIHRoaXMuc2hvd1Jvb3RHcmlkID0gc2hvd1Jvb3RHcmlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmxhbmtJY29uU3JjKCkgeworICAgICAgICByZXR1cm4gYmxhbmtJY29uU3JjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsYW5rSWNvblNyYyhTdHJpbmcgYmxhbmtJY29uU3JjKSB7CisgICAgICAgIHRoaXMuYmxhbmtJY29uU3JjID0gYmxhbmtJY29uU3JjOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kSWNvblNyY01pbnVzKCkgeworICAgICAgICByZXR1cm4gZXhwYW5kSWNvblNyY01pbnVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZEljb25TcmNNaW51cyhTdHJpbmcgZXhwYW5kSWNvblNyY01pbnVzKSB7CisgICAgICAgIHRoaXMuZXhwYW5kSWNvblNyY01pbnVzID0gZXhwYW5kSWNvblNyY01pbnVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwYW5kSWNvblNyY1BsdXMoKSB7CisgICAgICAgIHJldHVybiBleHBhbmRJY29uU3JjUGx1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRJY29uU3JjUGx1cyhTdHJpbmcgZXhwYW5kSWNvblNyY1BsdXMpIHsKKyAgICAgICAgdGhpcy5leHBhbmRJY29uU3JjUGx1cyA9IGV4cGFuZEljb25TcmNQbHVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNDKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNDOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjQyhTdHJpbmcgZ3JpZEljb25TcmNDKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNDID0gZ3JpZEljb25TcmNDOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNMKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNMOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjTChTdHJpbmcgZ3JpZEljb25TcmNMKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNMID0gZ3JpZEljb25TcmNMOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNQKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNQOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjUChTdHJpbmcgZ3JpZEljb25TcmNQKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNQID0gZ3JpZEljb25TcmNQOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNWKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNWOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjVihTdHJpbmcgZ3JpZEljb25TcmNWKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNWID0gZ3JpZEljb25TcmNWOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNYKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNYOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjWChTdHJpbmcgZ3JpZEljb25TcmNYKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNYID0gZ3JpZEljb25TcmNYOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JpZEljb25TcmNZKCkgeworICAgICAgICByZXR1cm4gZ3JpZEljb25TcmNZOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyaWRJY29uU3JjWShTdHJpbmcgZ3JpZEljb25TcmNZKSB7CisgICAgICAgIHRoaXMuZ3JpZEljb25TcmNZID0gZ3JpZEljb25TcmNZOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWNvbkhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIGljb25IZWlnaHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbkhlaWdodChTdHJpbmcgaWNvbkhlaWdodCkgeworICAgICAgICB0aGlzLmljb25IZWlnaHQgPSBpY29uSGVpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWNvbldpZHRoKCkgeworICAgICAgICByZXR1cm4gaWNvbldpZHRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEljb25XaWR0aChTdHJpbmcgaWNvbldpZHRoKSB7CisgICAgICAgIHRoaXMuaWNvbldpZHRoID0gaWNvbldpZHRoOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcGxhdGVDc3NQYXRoKCkgeworICAgICAgICByZXR1cm4gdGVtcGxhdGVDc3NQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlbXBsYXRlQ3NzUGF0aChTdHJpbmcgdGVtcGxhdGVDc3NQYXRoKSB7CisgICAgICAgIHRoaXMudGVtcGxhdGVDc3NQYXRoID0gdGVtcGxhdGVDc3NQYXRoOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9nZ2xlRHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0b2dnbGVEdXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb2dnbGVEdXJhdGlvbihTdHJpbmcgdG9nZ2xlRHVyYXRpb24pIHsKKyAgICAgICAgdGhpcy50b2dnbGVEdXJhdGlvbiA9IHRvZ2dsZUR1cmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvd0dyaWQoKSB7CisgICAgICAgIHJldHVybiBzaG93R3JpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93R3JpZChTdHJpbmcgc2hvd0dyaWQpIHsKKyAgICAgICAgdGhpcy5zaG93R3JpZCA9IHNob3dHcmlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbGxhcHNlZE5vdGlmeVRvcGljcyhTdHJpbmcgY29sbGFwc2VkTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuY29sbGFwc2VkTm90aWZ5VG9waWNzID0gY29sbGFwc2VkTm90aWZ5VG9waWNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkTm90aWZ5VG9waWNzKFN0cmluZyBleHBhbmRlZE5vdGlmeVRvcGljcykgeworICAgICAgICB0aGlzLmV4cGFuZGVkTm90aWZ5VG9waWNzID0gZXhwYW5kZWROb3RpZnlUb3BpY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROb3RpZnlUb3BpY3MoU3RyaW5nIHNlbGVjdGVkTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3MgPSBzZWxlY3RlZE5vdGlmeVRvcGljczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7CisgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JOb3RpZnlUb3BpY3MoU3RyaW5nIGVycm9yTm90aWZ5VG9waWNzKSB7CisgICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MgPSBlcnJvck5vdGlmeVRvcGljczsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvQW5jaG9yRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0FuY2hvckRpcmVjdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWYwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0FuY2hvckRpcmVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5BbmNob3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgQW5jaG9yCisgKi8KK3B1YmxpYyBjbGFzcyBBbmNob3JEaXJlY3RpdmUgZXh0ZW5kcyBEb2pvQWJzdHJhY3REaXJlY3RpdmUgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAiYSI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9BdXRvY29tcGxldGVyRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0F1dG9jb21wbGV0ZXJEaXJlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9BdXRvY29tcGxldGVyRGlyZWN0aXZlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkF1dG9jb21wbGV0ZXI7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBBdXRvY29tcGxldGVyCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRvY29tcGxldGVyRGlyZWN0aXZlIGV4dGVuZHMgRG9qb0Fic3RyYWN0RGlyZWN0aXZlIHsKKworICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBdXRvY29tcGxldGVyKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJhdXRvY29tcGxldGVyIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvQmluZERpcmVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9CaW5kRGlyZWN0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NzRjMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvQmluZERpcmVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5CaW5kOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgQmluZAorICovCitwdWJsaWMgY2xhc3MgQmluZERpcmVjdGl2ZSBleHRlbmRzIERvam9BYnN0cmFjdERpcmVjdGl2ZSB7CisgICAgcHVibGljIFN0cmluZyBnZXRCZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJiaW5kIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5kKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvRGF0ZVRpbWVQaWNrZXJEaXJlY3RpdmUuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvRGF0ZVRpbWVQaWNrZXJEaXJlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmE1YmFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlckRpcmVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5EYXRlVGltZVBpY2tlcjsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIERhdGVUaW1lUGlja2VyCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlVGltZVBpY2tlckRpcmVjdGl2ZSBleHRlbmRzIERvam9BYnN0cmFjdERpcmVjdGl2ZSB7CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZVBpY2tlcihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAiZGF0ZXRpbWVwaWNrZXIiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvRGl2RGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0RpdkRpcmVjdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4N2UyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0RpdkRpcmVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuY29tcG9uZW50cy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5EaXY7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBEaXYKKyAqLworcHVibGljIGNsYXNzIERpdkRpcmVjdGl2ZSBleHRlbmRzIERvam9BYnN0cmFjdERpcmVjdGl2ZSB7CisgICAgcHVibGljIFN0cmluZyBnZXRCZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJkaXYiOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IERpdihzdGFjaywgcmVxLCByZXMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEJMT0NLOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvRG9qb0Fic3RyYWN0RGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0Rvam9BYnN0cmFjdERpcmVjdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDY4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0Rvam9BYnN0cmFjdERpcmVjdGl2ZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MudmVsb2NpdHkuY29tcG9uZW50czsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzLkFic3RyYWN0RGlyZWN0aXZlOworCisvKioKKyAqIE92ZXJ3cml0ZSBuYW1lIHByZWZpeCAKKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb2pvQWJzdHJhY3REaXJlY3RpdmUgZXh0ZW5kcyBBYnN0cmFjdERpcmVjdGl2ZSB7CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gInN4IiArIGdldEJlYW5OYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9IZWFkRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL0hlYWREaXJlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWNkN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9IZWFkRGlyZWN0aXZlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLkhlYWQ7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBIZWFkCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkRGlyZWN0aXZlIGV4dGVuZHMgRG9qb0Fic3RyYWN0RGlyZWN0aXZlIHsKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIZWFkKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJoZWFkIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1N1Ym1pdERpcmVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9TdWJtaXREaXJlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzU2MzlmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9TdWJtaXREaXJlY3RpdmUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLlN1Ym1pdDsKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworLyoqCisgKiBAc2VlIFN1Ym1pdAorICovCitwdWJsaWMgY2xhc3MgU3VibWl0RGlyZWN0aXZlIGV4dGVuZHMgRG9qb0Fic3RyYWN0RGlyZWN0aXZlIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgeworICAgICAgICByZXR1cm4gInN1Ym1pdCI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgU3VibWl0KHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9UYWJiZWRQYW5lbERpcmVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9UYWJiZWRQYW5lbERpcmVjdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjFjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RhYmJlZFBhbmVsRGlyZWN0aXZlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlRhYmJlZFBhbmVsOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIudXRpbC5WYWx1ZVN0YWNrOworCisvKioKKyAqIEBzZWUgVGFiYmVkUGFuZWwKKyAqLworcHVibGljIGNsYXNzIFRhYmJlZFBhbmVsRGlyZWN0aXZlIGV4dGVuZHMgRG9qb0Fic3RyYWN0RGlyZWN0aXZlIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgeworICAgICAgICByZXR1cm4gInRhYmJlZHBhbmVsIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50IGdldEJlYW4oVmFsdWVTdGFjayBzdGFjaywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUYWJiZWRQYW5lbChzdGFjaywgcmVxLCByZXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RleHRBcmVhRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RleHRBcmVhRGlyZWN0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMjk5YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvVGV4dEFyZWFEaXJlY3RpdmUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuVGV4dEFyZWE7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogQHNlZSBUZXh0QXJlYQorICovCitwdWJsaWMgY2xhc3MgVGV4dEFyZWFEaXJlY3RpdmUgZXh0ZW5kcyBEb2pvQWJzdHJhY3REaXJlY3RpdmUgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAidGV4dGFyZWEiOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFRleHRBcmVhKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9UcmVlRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RyZWVEaXJlY3RpdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRkNTMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvdmVsb2NpdHkvY29tcG9uZW50cy9UcmVlRGlyZWN0aXZlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy52ZWxvY2l0eS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5jb21wb25lbnRzLlRyZWU7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPGNvZGU+VHJlZURpcmVjdGl2ZTwvY29kZT4KKyAqIEBzZWUgVHJlZQorICovCitwdWJsaWMgY2xhc3MgVHJlZURpcmVjdGl2ZSAgZXh0ZW5kcyBEb2pvQWJzdHJhY3REaXJlY3RpdmUgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAidHJlZSI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbXBvbmVudCBnZXRCZWFuKFZhbHVlU3RhY2sgc3RhY2ssIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgVHJlZShzdGFjaywgcmVxLCByZXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RyZWVOb2RlRGlyZWN0aXZlLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy92ZWxvY2l0eS9jb21wb25lbnRzL1RyZWVOb2RlRGlyZWN0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1MmJkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL3ZlbG9jaXR5L2NvbXBvbmVudHMvVHJlZU5vZGVEaXJlY3RpdmUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLnZlbG9jaXR5LmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmNvbXBvbmVudHMuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuVHJlZU5vZGU7CisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLlZhbHVlU3RhY2s7CisKKy8qKgorICogPGNvZGU+VHJlZU5vZGVEaXJlY3RpdmU8L2NvZGU+CisgKiBAc2VlIFRyZWVOb2RlCisgKi8KK3B1YmxpYyBjbGFzcyBUcmVlTm9kZURpcmVjdGl2ZSAgZXh0ZW5kcyBEb2pvQWJzdHJhY3REaXJlY3RpdmUgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAidHJlZW5vZGUiOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21wb25lbnQgZ2V0QmVhbihWYWx1ZVN0YWNrIHN0YWNrLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgeworICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKHN0YWNrLCByZXEsIHJlcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEJMT0NLOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9SRUFETUUudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2IxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL1JFQURNRS50eHQKQEAgLTAsMCArMSwzIEBACitUTEQgZmlsZSBpcyBnZW5lcmF0ZWQgaW5zaWRlIE1FVEEtSU5GIGFmdGVyIGNvbXBpbGF0aW9uLgorSWYgTUVUQS1JTkYgaXMgZW1wdHksIE1hdmVuIHdpbGwgbm90IGNvcHkgaXQgdG8gdGhlICJ0YXJnZXQvY2xhc3NlcyIgZm9sZGVyLgorUGxlYXNlIGRvIG5vdCByZW1vdmUgTUVUQS1JTkYsIG9yIHRoaXMgZmlsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApAQCAtMCwwICsxLDYgQEAKK0FwYWNoZSBTdHJ1dHMKK0NvcHlyaWdodCAyMDAwLTIwMTEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCitEb2pvIChodHRwOi8vZG9qb3Rvb2xraXQub3JnLykuCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvVGFiYmVkUGFuZWwuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL1RhYmJlZFBhbmVsLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNhOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL1RhYmJlZFBhbmVsLmNzcwpAQCAtMCwwICsxLDI1IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisuc3RydXRzRGlzYWJsZWRUYWIgZGl2IHNwYW4geworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBjb2xvcjogIzc5ODZBMQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL0xJQ0VOU0UgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWQyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9MSUNFTlNFCkBAIC0wLDAgKzEsMTk1IEBACitEb2pvIGlzIGF2YWlsYmxlIHVuZGVyICplaXRoZXIqIHRoZSB0ZXJtcyBvZiB0aGUgbW9kaWZpZWQgQlNEIGxpY2Vuc2UgKm9yKiB0aGUKK0FjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMS4gQXMgYSByZWNpcGllbnQgb2YgRG9qbywgeW91IG1heSBjaG9vc2Ugd2hpY2gKK2xpY2Vuc2UgdG8gcmVjZWl2ZSB0aGlzIGNvZGUgdW5kZXIgKGV4Y2VwdCBhcyBub3RlZCBpbiBwZXItbW9kdWxlIExJQ0VOU0UKK2ZpbGVzKS4gU29tZSBtb2R1bGVzIG1heSBub3QgYmUgdGhlIGNvcHlyaWdodCBvZiB0aGUgRG9qbyBGb3VuZGF0aW9uLiBUaGVzZQorbW9kdWxlcyBjb250YWluIGV4cGxpY2l0IGRlY2xhcmF0aW9ucyBvZiBjb3B5cmlnaHQgaW4gYm90aCB0aGUgTElDRU5TRSBmaWxlcyBpbgordGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRoZXkgcmVzaWRlIGFuZCBpbiB0aGUgY29kZSBpdHNlbGYuIE5vIGV4dGVybmFsCitjb250cmlidXRpb25zIGFyZSBhbGxvd2VkIHVuZGVyIGxpY2Vuc2VzIHdoaWNoIGFyZSBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZQord2l0aCB0aGUgQUZMIG9yIEJTRCBsaWNlbnNlcyB0aGF0IERvam8gaXMgZGlzdHJpYnV0ZWQgdW5kZXIuCisKK1RoZSB0ZXh0IG9mIHRoZSBBRkwgYW5kIEJTRCBsaWNlbnNlcyBpcyByZXByb2R1Y2VkIGJlbG93LiAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlICJOZXciIEJTRCBMaWNlbnNlOgorKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRG9qbyBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCitTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKK09SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlLCB2LiAyLjE6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RoaXMgQWNhZGVtaWMgRnJlZSBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKSBhcHBsaWVzIHRvIGFueSBvcmlnaW5hbCB3b3JrIG9mCithdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlCitmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIE9yaWdpbmFsCitXb3JrOgorCitMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKzEpIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSB0byBkbyB0aGUKK2ZvbGxvd2luZzoKKworYSkgdG8gcmVwcm9kdWNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGNvcGllczsKKworYikgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzICgiRGVyaXZhdGl2ZSBXb3JrcyIpIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsCitXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUKK3B1YmxpYzsKKworZCkgdG8gcGVyZm9ybSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseTsgYW5kCisKK2UpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisKKzIpIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSwgdW5kZXIgcGF0ZW50CitjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUgZW1ib2RpZWQgaW4gdGhlIE9yaWdpbmFsCitXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IsIHRvIG1ha2UsIHVzZSwgc2VsbCBhbmQgb2ZmZXIgZm9yIHNhbGUgdGhlCitPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzLgorCiszKSBHcmFudCBvZiBTb3VyY2UgQ29kZSBMaWNlbnNlLiBUaGUgdGVybSAiU291cmNlIENvZGUiIG1lYW5zIHRoZSBwcmVmZXJyZWQKK2Zvcm0gb2YgdGhlIE9yaWdpbmFsIFdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0IGFuZCBhbGwgYXZhaWxhYmxlCitkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgaG93IHRvIG1vZGlmeSB0aGUgT3JpZ2luYWwgV29yay4gTGljZW5zb3IgaGVyZWJ5CithZ3JlZXMgdG8gcHJvdmlkZSBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsCitXb3JrIGFsb25nIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBPcmlnaW5hbCBXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuCitMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gc2F0aXNmeSB0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhCittYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGluIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkKK3JlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBwZXJtaXQgaW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMKK2xvbmcgYXMgTGljZW5zb3IgY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nCit0aGUgYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nCit0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yIHRoZSBuYW1lcworb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpciB0cmFkZW1hcmtzIG9yCitzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKK09yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgTGljZW5zb3IuIE5vdGhpbmcKK2luIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8gZ3JhbnQgYW55IHJpZ2h0cyB0byB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLAorcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvciBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIExpY2Vuc29yIGV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBoZXJlaW4uIE5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgdG8gbWFrZSwgdXNlLCBzZWxsIG9yCitvZmZlciB0byBzZWxsIGVtYm9kaW1lbnRzIG9mIGFueSBwYXRlbnQgY2xhaW1zIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2VkIGNsYWltcworZGVmaW5lZCBpbiBTZWN0aW9uIDIuIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdGhlIHRyYWRlbWFya3Mgb2YgTGljZW5zb3IgZXZlbiBpZgorc3VjaCBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIE9yaWdpbmFsIFdvcmsuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCitpbnRlcnByZXRlZCB0byBwcm9oaWJpdCBMaWNlbnNvciBmcm9tIGxpY2Vuc2luZyB1bmRlciBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aGlzCitMaWNlbnNlIGFueSBPcmlnaW5hbCBXb3JrIHRoYXQgTGljZW5zb3Igb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYSByaWdodCB0bworbGljZW5zZS4KKworNSkgVGhpcyBzZWN0aW9uIGludGVudGlvbmFsbHkgb21pdHRlZC4KKworNikgQXR0cmlidXRpb24gUmlnaHRzLiBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgQ29kZSBvZiBhbnkgRGVyaXZhdGl2ZQorV29ya3MgdGhhdCBZb3UgY3JlYXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgZnJvbSB0aGUKK1NvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrLCBhcyB3ZWxsIGFzIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBhbmQgYW55CitkZXNjcmlwdGl2ZSB0ZXh0IGlkZW50aWZpZWQgdGhlcmVpbiBhcyBhbiAiQXR0cmlidXRpb24gTm90aWNlLiIgWW91IG11c3QgY2F1c2UKK3RoZSBTb3VyY2UgQ29kZSBmb3IgYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlIHRvIGNhcnJ5IGEgcHJvbWluZW50CitBdHRyaWJ1dGlvbiBOb3RpY2UgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSByZWNpcGllbnRzIHRoYXQgWW91IGhhdmUKK21vZGlmaWVkIHRoZSBPcmlnaW5hbCBXb3JrLgorCis3KSBXYXJyYW50eSBvZiBQcm92ZW5hbmNlIGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMaWNlbnNvciB3YXJyYW50cyB0aGF0Cit0aGUgY29weXJpZ2h0IGluIGFuZCB0byB0aGUgT3JpZ2luYWwgV29yayBhbmQgdGhlIHBhdGVudCByaWdodHMgZ3JhbnRlZCBoZXJlaW4KK2J5IExpY2Vuc29yIGFyZSBvd25lZCBieSB0aGUgTGljZW5zb3Igb3IgYXJlIHN1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMKK29mIHRoaXMgTGljZW5zZSB3aXRoIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzCithbmQgcGF0ZW50IHJpZ2h0cy4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcKK3NlbnRlbmNlLCB0aGUgT3JpZ2luYWwgV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUworYW5kIFdJVEhPVVQgV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTCBXT1JLIElTIFdJVEggWU9VLgorVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbCBwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8KK2xpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlciBleGNlcHQgdW5kZXIgdGhpcyBkaXNjbGFpbWVyLgorCis4KSBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAord2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsIHNoYWxsIHRoZQorTGljZW5zb3IgYmUgbGlhYmxlIHRvIGFueSBwZXJzb24gZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsLAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2UKK29yIHRoZSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGRhbWFnZXMgZm9yIGxvc3MKK29mIGdvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3Nlcy4gVGhpcyBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBzaGFsbCBub3QKK2FwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZyBmcm9tIExpY2Vuc29yJ3MKK25lZ2xpZ2VuY2UgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaCBsaW1pdGF0aW9uLiBTb21lCitqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvcgorY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzbyB0aGlzIGV4Y2x1c2lvbiBhbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBvcgorYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydCB1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcyB0bworb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIE5vdGhpbmcKK2Vsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuIGFncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpCitncmFudHMgWW91IHBlcm1pc3Npb24gdG8gY3JlYXRlIERlcml2YXRpdmUgV29ya3MgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yaworb3IgdG8gZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCBpbiBTZWN0aW9uIDEgaGVyZWluLCBhbmQgYW55IGF0dGVtcHQKK3RvIGRvIHNvIGV4Y2VwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyIHdyaXR0ZW4gYWdyZWVtZW50CitiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5IFUuUy4gY29weXJpZ2h0IGxhdywgdGhlCitlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgYnkgaW50ZXJuYXRpb25hbCB0cmVhdHkuIFRoZXJlZm9yZSwgYnkKK2V4ZXJjaXNpbmcgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCB0byBZb3UgaW4gU2VjdGlvbiAxIGhlcmVpbiwgWW91IGluZGljYXRlCitZb3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIGFuZCBhbGwgb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisxMCkgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseQorYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgdG8gWW91IGJ5IHRoaXMgTGljZW5zZQorYXMgb2YgdGhlIGRhdGUgWW91IGNvbW1lbmNlIGFuIGFjdGlvbiwgaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLAorYWdhaW5zdCBMaWNlbnNvciBvciBhbnkgbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYQorcGF0ZW50LiBUaGlzIHRlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZworcGF0ZW50IGluZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZSBvcgoraGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcgdG8gdGhpcworTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24gd2hlcmVpbiB0aGUKK0xpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkgYnVzaW5lc3MsIGFuZCB1bmRlcgordGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gVGhlCithcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsCitTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IHVzZSBvZiB0aGUgT3JpZ2luYWwgV29yayBvdXRzaWRlIHRoZQorc2NvcGUgb2YgdGhpcyBMaWNlbnNlIG9yIGFmdGVyIGl0cyB0ZXJtaW5hdGlvbiBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorcmVxdWlyZW1lbnRzIGFuZCBwZW5hbHRpZXMgb2YgdGhlIFUuUy4gQ29weXJpZ2h0IEFjdCwgMTcgVS5TLkMuIMOCwqcgMTAxIGV0CitzZXEuLCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGludGVybmF0aW9uYWwgdHJlYXR5LiBUaGlzCitzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTIpIEF0dG9ybmV5cyBGZWVzLiBJbiBhbnkgYWN0aW9uIHRvIGVuZm9yY2UgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvcgorc2Vla2luZyBkYW1hZ2VzIHJlbGF0aW5nIHRoZXJldG8sIHRoZSBwcmV2YWlsaW5nIHBhcnR5IHNoYWxsIGJlIGVudGl0bGVkIHRvCityZWNvdmVyIGl0cyBjb3N0cyBhbmQgZXhwZW5zZXMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCByZWFzb25hYmxlCithdHRvcm5leXMnIGZlZXMgYW5kIGNvc3RzIGluY3VycmVkIGluIGNvbm5lY3Rpb24gd2l0aCBzdWNoIGFjdGlvbiwgaW5jbHVkaW5nCithbnkgYXBwZWFsIG9mIHN1Y2ggYWN0aW9uLiBUaGlzIHNlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcworTGljZW5zZS4KKworMTMpIE1pc2NlbGxhbmVvdXMuIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZwordGhlIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQordW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0bworbWFrZSBpdCBlbmZvcmNlYWJsZS4KKworMTQpIERlZmluaXRpb24gb2YgIllvdSIgaW4gVGhpcyBMaWNlbnNlLiAiWW91IiB0aHJvdWdob3V0IHRoaXMgTGljZW5zZSwgd2hldGhlcgoraW4gdXBwZXIgb3IgbG93ZXIgY2FzZSwgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cwordW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbAorZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkgdGhhdCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMKK3VuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggeW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMKKyhpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKK2VudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQKKyg1MCUpIG9yIG1vcmUgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaAorZW50aXR5LgorCisxNSkgUmlnaHQgdG8gVXNlLiBZb3UgbWF5IHVzZSB0aGUgT3JpZ2luYWwgV29yayBpbiBhbGwgd2F5cyBub3Qgb3RoZXJ3aXNlCityZXN0cmljdGVkIG9yIGNvbmRpdGlvbmVkIGJ5IHRoaXMgTGljZW5zZSBvciBieSBsYXcsIGFuZCBMaWNlbnNvciBwcm9taXNlcyBub3QKK3RvIGludGVyZmVyZSB3aXRoIG9yIGJlIHJlc3BvbnNpYmxlIGZvciBzdWNoIHVzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBsaWNlbnNlIHdpdGhvdXQKK21vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuCitwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9SRUFETUUgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiODRlYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL1JFQURNRQpAQCAtMCwwICsxLDE3NiBAQAorVGhlIERvam8gVG9vbGtpdAorLS0tLS0tLS0tLS0tLS0tLQorCitEb2pvIGlzIGEgcG9ydGFibGUgSmF2YVNjcmlwdCB0b29sa2l0IGZvciB3ZWIgYXBwbGljYXRpb24gZGV2ZWxvcGVycyBhbmQKK0phdmFTY3JpcHQgcHJvZmVzc2lvbmFscy4gRG9qbyBzb2x2ZXMgcmVhbC13b3JsZCBwcm9ibGVtcyBieSBwcm92aWRpbmcgcG93ZXJmdWwKK2Fic3RyYWN0aW9ucyBhbmQgc29saWQsIHRlc3RlZCBpbXBsZW1lbnRhdGlvbnMuCisKK0dldHRpbmcgU3RhcnRlZAorLS0tLS0tLS0tLS0tLS0tCisKK1RvIHVzZSBEb2pvIGluIHlvdXIgYXBwbGljYXRpb24sIGRvd25sb2FkIG9uZSBvZiB0aGUgcHJlLWJ1aWx0IGVkaXRpb25zIGZyb20gdGhlCitEb2pvIHdlYnNpdGUsIGh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcuIE9uY2UgeW91IGhhdmUgZG93bmxvYWRlZCB0aGUgZmlsZSB5b3Ugd2lsbAorbmVlZCB0byB1bnppcCB0aGUgYXJjaGl2ZSBpbiB5b3VyIHdlYnNpdGUgcm9vdC4gQXQgYSBtaW5pbXVtLCB5b3Ugd2lsbCBuZWVkIHRvCitleHRyYWN0OgorCisgICAgc3JjLyAoZm9sZGVyKQorICAgIGRvam8uanMKKyAgICBpZnJhbWVfaGlzdG9yeS5odG1sCisKK1RvIGJlZ2luIHVzaW5nIGRvam8sIGluY2x1ZGUgZG9qbyBpbiB5b3VyIHBhZ2VzIGJ5IHVzaW5nOgorCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3BhdGgvdG8vZG9qby5qcyI+PC9zY3JpcHQ+CisKK0RlcGVuZGluZyBvbiB0aGUgZWRpdGlvbiB0aGF0IHlvdSBoYXZlIGRvd25sb2FkZWQsIHRoaXMgYmFzZSBkb2pvLmpzIGZpbGUgbWF5IG9yCittYXkgbm90IGluY2x1ZGUgdGhlIG1vZHVsZXMgeW91IHdpc2ggdG8gdXNlIGluIHlvdXIgYXBwbGljYXRpb24uIFRoZSBmaWxlcyB3aGljaAoraGF2ZSBiZWVuICJiYWtlZCBpbiIgdG8gdGhlIGRvam8uanMgdGhhdCBpcyBwYXJ0IG9mIHlvdXIgZGlzdHJpYnV0aW9uIGFyZSBsaXN0ZWQKK2luIHRoZSBmaWxlIGJ1aWxkLnR4dCB0aGF0IGlzIHBhcnQgb2YgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgdGhhdCBpcyBjcmVhdGVkCit3aGVuIHlvdSB1bnBhY2sgdGhlIGFyY2hpdmUuIFRvIGVuc3VyZSBtb2R1bGVzIHlvdSB3aXNoIHRvIHVzZSBhcmUgYXZhaWxhYmxlLAordXNlIGRvam8ucmVxdWlyZSgpIHRvIHJlcXVlc3QgdGhlbS4gQSB2ZXJ5IHJpY2ggYXBwbGljYXRpb24gbWlnaHQgaW5jbHVkZToKKworICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2Rvam8uanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsgICAgICAgLy8gc29waGlzdGljYXRlZCBBT1AgZXZlbnQgaGFuZGxpbmcKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsgICAgICAgICAgLy8gZm9yIEFqYXggcmVxdWVzdHMKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLnN0b3JhZ2UuKiIpOyAgICAgLy8gYSBwZXJzaXN0ZW50IGxvY2FsIGRhdGEgY2FjaGUKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmpzb24iKTsgICAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB0byBKU09OCisgICAgICAgIGRvam8ucmVxdWlyZSgiZG9qby5kbmQuKiIpOyAgICAgICAgIC8vIGRyYWctYW5kLWRyb3AKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7ICAgICAgICAgLy8gYW5pbWF0aW9ucyBhbmQgZXllIGNhbmR5CisgICAgICAgIGRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRWRpdG9yMiIpOy8vIHN0YWJsZSwgcG9ydGFibGUgSFRNTCBXWVNJV1lHCisgICAgPC9zY3JpcHQ+CisKK05vdGUgdGhhdCBvbmx5IHRob3NlIG1vZHVsZXMgd2hpY2ggYXJlICpub3QqIGFscmVhZHkgImJha2VkIGluIiB0byBkb2pvLmpzIGJ5Cit0aGUgZWRpdGlvbidzIGJ1aWxkIHByb2Nlc3MgYXJlIHJlcXVlc3RlZCBieSBkb2pvLnJlcXVpcmUoKS4gVGhpcyBoZWxwcyBtYWtlCit5b3VyIGFwcGxpY2F0aW9uIGZhc3RlciB3aXRob3V0IGZvcmNpbmcgeW91IHRvIHVzZSBhIGJ1aWxkIHRvb2wgd2hpbGUgaW4KK2RldmVsb3BtZW50LiBTZWUgIkJ1aWxkaW5nIERvam8iIGFuZCAiV29ya2luZyBGcm9tIFNvdXJjZSIgZm9yIG1vcmUgZGV0YWlscy4KKworCitDb21wYXRpYmlsaXR5CistLS0tLS0tLS0tLS0tCisKK0luIGFkZGl0aW9uIHRvIGl0J3Mgc3VpdGUgb2YgdW5pdC10ZXN0cyBmb3IgY29yZSBzeXN0ZW0gY29tcG9uZW50cywgRG9qbyBoYXMKK2JlZW4gdGVzdGVkIG9uIGFsbW9zdCBldmVyeSBtb2Rlcm4gYnJvd3NlciwgaW5jbHVkaW5nOgorCisgICAgLSBJRSA1LjUrCisgICAgLSBNb3ppbGxhIDEuNSssIEZpcmVmb3ggMS4wKworICAgIC0gU2FmYXJpIDEuMy45KworICAgIC0gS29ucXVlcm9yIDMuNCsKKyAgICAtIE9wZXJhIDguNSsKKworTm90ZSB0aGF0IHNvbWUgd2lkZ2V0cyBhbmQgZmVhdHVyZXMgbWF5IG5vdCBwZXJmb3JtIGV4YWN0bHkgdGhlIHNhbWUgb24gZXZlcnkKK2Jyb3dzZXIgZHVlIHRvIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuCisKK0ZvciB0aG9zZSBsb29raW5nIHRvIHVzZSBEb2pvIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cywgcGxlYXNlIHNlZSAiV29ya2luZworRnJvbSBTb3VyY2UiLgorCisKK0RvY3VtZW50YXRpb24gYW5kIEdldHRpbmcgSGVscAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FydGljbGVzIG91dGxpbmluZyBtYWpvciBEb2pvIHN5c3RlbXMgYXJlIGxpbmtlZCBmcm9tOgorCisgICAgaHR0cDovL2Rvam90b29sa2l0Lm9yZy9kb2NzLworCitUb29sa2l0IEFQSXMgYXJlIGxpc3RlZCBpbiBvdXRsaW5lIGZvcm0gYXQ6CisKKyAgICBodHRwOi8vZG9qb3Rvb2xraXQub3JnL2RvY3MvYXBpcy8KKworQW5kIGRvY3VtZW50ZWQgaW4gZnVsbCBhdDoKKworICAgIGh0dHA6Ly9tYW51YWwuZG9qb3Rvb2xraXQub3JnLworCitUaGUgcHJvamVjdCBhbHNvIG1haW50YWlucyBhIEpvdFNwb3QgV2lraSBhdDoKKworICAgIGh0dHA6Ly9kb2pvLmpvdC5jb20vCisKK0EgRkFRIGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIG1haWxpbmcgbGlzdCB0cmFmZmljOgorCisgICAgaHR0cDovL2Rvam8uam90LmNvbS9GQVEKKworQW5kIHRoZSBtYWluIERvam8gdXNlciBtYWlsaW5nIGxpc3QgaXMgYXJjaGl2ZWQgYW5kIG1hZGUgc2VhcmNoYWJsZSBhdDoKKworICAgIGh0dHA6Ly9uZXdzLmdtYW5lLm9yZy9nbWFuZS5jb21wLndlYi5kb2pvLnVzZXIvCisKK1lvdSBjYW4gc2lnbiB1cCBmb3IgdGhpcyBsaXN0LCB3aGljaCBpcyBhIGdyZWF0IHBsYWNlIHRvIGFzayBxdWVzdGlvbnMsIGF0OgorCisgICAgaHR0cDovL2Rvam90b29sa2l0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Rvam8taW50ZXJlc3QKKworVGhlIERvam8gZGV2ZWxvcGVycyBhbHNvIHRlbmQgdG8gaGFuZyBvdXQgaW4gSVJDIGFuZCBoZWxwIHBlb3BsZSB3aXRoIERvam8KK3Byb2JsZW1zLiBZb3UncmUgbW9zdCBsaWtlbHkgdG8gZmluZCB0aGVtIGF0OgorCisgICAgaXJjLmZyZWVub2RlLm5ldCAjZG9qbworCitOb3RlIHRoYXQgM1BNIFdlZCBQU1QgaW4gI2Rvam8tbWVldGluZyBpcyByZXNlcnZlZCBmb3IgYSB3ZWVrbHkgbWVldGluZyBiZXR3ZWVuCitwcm9qZWN0IGRldmVsb3BlcnMsIGFsdGhvdWdoIGFueW9uZSBpcyB3ZWxjb21lIHRvIHBhcnRpY2lwYXRlLgorCisKK1dvcmtpbmcgRnJvbSBTb3VyY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvcmUgb2YgRG9qbyBpcyBhIHBvd2VyZnVsIHBhY2thZ2Ugc3lzdGVtIHRoYXQgYWxsb3dzIGRldmVsb3BlcnMgdG8gb3B0aW1pemUKK0Rvam8gZm9yIGRlcGxveW1lbnQgd2hpbGUgdXNpbmcgKmV4YWN0bHkgdGhlIHNhbWUqIGFwcGxpY2F0aW9uIGNvZGUgaW4KK2RldmVsb3BtZW50LiBUaGVyZWZvcmUsIHdvcmtpbmcgZnJvbSBzb3VyY2UgaXMgYWxtb3N0IGV4YWN0bHkgbGlrZSB3b3JraW5nIGZyb20KK2EgcHJlLWJ1aWx0IGVkaXRpb24uIFByZS1idWlsdCBlZGl0aW9ucyBhcmUgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdG8gbG9hZCB0aGFuCit3b3JraW5nIGZyb20gc291cmNlLCBidXQgYXJlIG5vdCBhcyBmbGV4aWJsZSB3aGVuIGluIGRldmVsb3BtZW50LgorCitUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBnZXQgdGhlIHNvdXJjZS4gTmlnaHRseSBzbmFwc2hvdHMgb2YgdGhlIERvam8gc291cmNlCityZXBvc2l0b3J5IGFyZSBhdmFpbGFibGUgYXQ6CisKKyAgICBodHRwOi8vYXJjaGl2ZS5kb2pvdG9vbGtpdC5vcmcvbmlnaHRseS50Z3oKKworQW5vbnltb3VzIFN1YnZlcnNpb24gYWNjZXNzIGlzIGFsc28gYXZhaWxhYmxlOgorCisgICAgJT4gc3ZuIGNvIGh0dHA6Ly9zdm4uZG9qb3Rvb2xraXQub3JnL2Rvam8vdHJ1bmsvIGRvam8KKworRWFjaCBvZiB0aGVzZSBzb3VyY2VzIHdpbGwgaW5jbHVkZSBzb21lIGV4dHJhIGRpcmVjdG9yaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUKK3ByZS1wYWNrYWdlZCBlZGl0aW9ucywgaW5jbHVkaW5nIGNvbW1hbmQtbGluZSB0ZXN0cyBhbmQgYnVpbGQgdG9vbHMgZm9yCitjb25zdHJ1Y3RpbmcgeW91ciBvd24gcGFja2FnZXMuCisKK1J1bm5pbmcgdGhlIGNvbW1hbmQtbGluZSB1bml0IHRlc3Qgc3VpdGUgcmVxdWlyZXMgQW50IDEuNi4gSWYgaXQgaXMgaW5zdGFsbGVkCithbmQgaW4geW91ciBwYXRoLCB5b3UgY2FuIHJ1biB0aGUgdGVzdHMgdXNpbmc6CisKKyAgICAlPiBjZCBidWlsZHNjcmlwdHMKKyAgICAlPiBhbnQgdGVzdAorCitUaGUgY29tbWFuZC1saW5lIHRlc3QgaGFybmVzcyBtYWtlcyB1c2Ugb2YgUmhpbm8sIGEgSmF2YVNjcmlwdCBpbnRlcnByZXRlcgord3JpdHRlbiBpbiBKYXZhLiBPbmNlIHlvdSBoYXZlIGEgY29weSBvZiBEb2pvJ3Mgc291cmNlIHRyZWUsIHlvdSBoYXZlIGEgY29weSBvZgorUmhpbm8uIEZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCB5b3UgY2FuIHVzZSBSaGlubyBpbnRlcmFjdGl2ZWx5IHRvIGxvYWQgRG9qbzoKKworICAgICU+IGphdmEgLWphciBidWlsZHNjcmlwdHMvbGliL2pzLmphcgorICAgIFJoaW5vIDEuNSByZWxlYXNlIDMgMjAwMiAwMSAyNworICAgIGpzPiBsb2FkKCJkb2pvLmpzIik7CisgICAganM+IHByaW50KGRvam8pOworICAgIFtvYmplY3QgT2JqZWN0XQorICAgIGpzPiBxdWl0KCk7CisKK1RoaXMgZW52aXJvbm1lbnQgaXMgd29uZGVyZnVsIGZvciB0ZXN0aW5nIHJhdyBKYXZhU2NyaXB0IGZ1bmN0aW9uYWxpdHkgaW4sIG9yCitldmVuIGZvciBzY3JpcHRpbmcgeW91ciBzeXN0ZW0uIFNpbmNlIFJoaW5vIGhhcyBmdWxsIGFjY2VzcyB0byBhbnl0aGluZyBpbgorSmF2YSdzIGNsYXNzcGF0aCwgdGhlIHNreSBpcyB0aGUgbGltaXQhCisKK0J1aWxkaW5nIERvam8KKy0tLS0tLS0tLS0tLS0KKworRG9qbyByZXF1aXJlcyBBbnQgMS42LnggaW4gb3JkZXIgdG8gYnVpbGQgY29ycmVjdGx5LiBXaGlsZSB1c2luZyBEb2pvIGZyb20KK3NvdXJjZSBkb2VzICpOT1QqIHJlcXVpcmUgdGhhdCB5b3UgbWFrZSBhIGJ1aWxkLCBzcGVlZGluZyB1cCB5b3VyIGFwcGxpY2F0aW9uIGJ5Citjb25zdHJ1Y3RpbmcgYSBjdXN0b20gcHJvZmlsZSBidWlsZCBkb2VzLgorCitPbmNlIHlvdSBoYXZlIEFudCBhbmQgYSBzb3VyY2Ugc25hcHNob3Qgb2YgRG9qbywgeW91IGNhbiBtYWtlIHlvdXIgb3duIHByb2ZpbGUKK2J1aWxkICgiZWRpdGlvbiIpIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhvc2UgbW9kdWxlcyB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgYnkKK2N1c3RvbWl6aW5nIG9uZSBvZiB0aGUgZmlsZXMgaW46CisKKyAgICBbZG9qb10vYnVpbGRzY3JpcHRzL3Byb2ZpbGVzLworCitUaGVzZSBmaWxlcyBhcmUgbmFtZWQgKi5wcm9maWxlLmpzIGFuZCBlYWNoIG9uZSBjb250YWlucyBhIGxpc3Qgb2YgbW9kdWxlcyB0bworaW5jbHVkZSBpbiBhIGJ1aWxkLiBJZiB3ZSBjcmVhdGVkIGEgbmV3IHByb2ZpbGUgY2FsbGVkICJ0ZXN0LnByb2ZpbGUuanMiLCB3ZQorY291bGQgdGhlbiBtYWtlIGEgcHJvZmlsZSBidWlsZCB1c2luZyBpdCBieSBkb2luZzoKKworICAgICU+IGNkIGJ1aWxkc2NyaXB0cworICAgICU+IGFudCAtRHByb2ZpbGU9dGVzdCAtRGRvY2xlc3M9dHJ1ZSByZWxlYXNlIGludGVybi1zdHJpbmdzCisKK0lmIHRoZSBidWlsZCBpcyBzdWNjZXNzZnVsLCB5b3VyIG5ld2x5IG1pbnRlZCBhbmQgY29tcHJlc3NlZCAgcHJvZmlsZSBidWlsZCB3aWxsCitiZSBwbGFjZWQgaW4gW2Rvam9dL3JlbGVhc2UvZG9qby8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKwordmltOnRzPTQ6ZXQ6dHc9ODA6c2hpZnR3aWR0aD00OgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vU3RvcmFnZV92ZXJzaW9uNi5zd2YgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9TdG9yYWdlX3ZlcnNpb242LnN3ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdiMTRjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vU3RvcmFnZV92ZXJzaW9uNi5zd2YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vU3RvcmFnZV92ZXJzaW9uOC5zd2YgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9TdG9yYWdlX3ZlcnNpb244LnN3ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlkYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vU3RvcmFnZV92ZXJzaW9uOC5zd2YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vYnVpbGQudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vYnVpbGQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZmNkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9idWlsZC50eHQKQEAgLTAsMCArMSwzNSBAQAorRmlsZXMgYmFrZWQgaW50byB0aGlzIGJ1aWxkOgorCitkb2pvLmpzOgorZG9qb0d1YXJkU3RhcnQuanMKKy4uL3NyYy9ib290c3RyYXAxLmpzCisuLi9zcmMvbG9hZGVyLmpzCitkb2pvR3VhcmRFbmQuanMKKy4uL3NyYy9ob3N0ZW52X2Jyb3dzZXIuanMKKy4uL3NyYy9zdHJpbmcvY29tbW9uLmpzCisuLi9zcmMvc3RyaW5nLmpzCisuLi9zcmMvbGFuZy9jb21tb24uanMKKy4uL3NyYy9sYW5nL2V4dHJhcy5qcworLi4vc3JjL2lvL2NvbW1vbi5qcworLi4vc3JjL2xhbmcvYXJyYXkuanMKKy4uL3NyYy9sYW5nL2Z1bmMuanMKKy4uL3NyYy9zdHJpbmcvZXh0cmFzLmpzCisuLi9zcmMvZG9tLmpzCisuLi9zcmMvdW5kby9icm93c2VyLmpzCisuLi9zcmMvaW8vQnJvd3NlcklPLmpzCisuLi9zcmMvaW8vY29va2llLmpzCisuLi9zcmMvaW8vX19wYWNrYWdlX18uanMKKy4uL3NyYy9ldmVudC9jb21tb24uanMKKy4uL3NyYy9ldmVudC90b3BpYy5qcworLi4vc3JjL2V2ZW50L2Jyb3dzZXIuanMKKy4uL3NyYy9ldmVudC9fX3BhY2thZ2VfXy5qcworLi4vc3JjL2dmeC9jb2xvci5qcworLi4vc3JjL2xmeC9BbmltYXRpb24uanMKKy4uL3NyYy9odG1sL2NvbW1vbi5qcworLi4vc3JjL3VyaS9VcmkuanMKKy4uL3NyYy9odG1sL3N0eWxlLmpzCisuLi9zcmMvaHRtbC9kaXNwbGF5LmpzCisuLi9zcmMvaHRtbC9jb2xvci5qcworLi4vc3JjL2h0bWwvbGF5b3V0LmpzCisuLi9zcmMvbGZ4L2h0bWwuanMKKy4uL3NyYy9sZngvX19wYWNrYWdlX18uanMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL2Rvam8uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9kb2pvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjM3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9kb2pvLmpzCkBAIC0wLDAgKzEsNjQ0MSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworLyoKKwlUaGlzIGlzIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBEb2pvLCBidWlsdCBmb3IgZGVwbG95bWVudCBhbmQgbm90IGZvcgorCWRldmVsb3BtZW50LiBUbyBnZXQgYW4gZWRpdGFibGUgdmVyc2lvbiwgcGxlYXNlIHZpc2l0OgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcKKworCWZvciBkb2N1bWVudGF0aW9uIGFuZCBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHRoZSBzb3VyY2UuCisqLworCitpZih0eXBlb2YgZG9qbz09InVuZGVmaW5lZCIpewordmFyIGRqX2dsb2JhbD10aGlzOwordmFyIGRqX2N1cnJlbnRDb250ZXh0PXRoaXM7CitmdW5jdGlvbiBkal91bmRlZihfMSxfMil7CityZXR1cm4gKHR5cGVvZiAoXzJ8fGRqX2N1cnJlbnRDb250ZXh0KVtfMV09PSJ1bmRlZmluZWQiKTsKK30KK2lmKGRqX3VuZGVmKCJkakNvbmZpZyIsdGhpcykpewordmFyIGRqQ29uZmlnPXt9OworfQoraWYoZGpfdW5kZWYoImRvam8iLHRoaXMpKXsKK3ZhciBkb2pvPXt9OworfQorZG9qby5nbG9iYWw9ZnVuY3Rpb24oKXsKK3JldHVybiBkal9jdXJyZW50Q29udGV4dDsKK307Citkb2pvLmxvY2FsZT1kakNvbmZpZy5sb2NhbGU7Citkb2pvLnZlcnNpb249e21ham9yOjAsbWlub3I6NCxwYXRjaDozLGZsYWc6IiIscmV2aXNpb246TnVtYmVyKCIkUmV2JCIubWF0Y2goL1swLTldKy8pWzBdKSx0b1N0cmluZzpmdW5jdGlvbigpeword2l0aChkb2pvLnZlcnNpb24peworcmV0dXJuIG1ham9yKyIuIittaW5vcisiLiIrcGF0Y2grZmxhZysiICgiK3JldmlzaW9uKyIpIjsKK30KK319OworZG9qby5ldmFsUHJvcD1mdW5jdGlvbihfMyxfNCxfNSl7CitpZigoIV80KXx8KCFfMykpeworcmV0dXJuIHVuZGVmaW5lZDsKK30KK2lmKCFkal91bmRlZihfMyxfNCkpeworcmV0dXJuIF80W18zXTsKK30KK3JldHVybiAoXzU/KF80W18zXT17fSk6dW5kZWZpbmVkKTsKK307Citkb2pvLnBhcnNlT2JqUGF0aD1mdW5jdGlvbihfNixfNyxfOCl7Cit2YXIgXzk9KF83fHxkb2pvLmdsb2JhbCgpKTsKK3ZhciBfYT1fNi5zcGxpdCgiLiIpOwordmFyIF9iPV9hLnBvcCgpOworZm9yKHZhciBpPTAsbD1fYS5sZW5ndGg7aTxsJiZfOTtpKyspeworXzk9ZG9qby5ldmFsUHJvcChfYVtpXSxfOSxfOCk7Cit9CityZXR1cm4ge29iajpfOSxwcm9wOl9ifTsKK307Citkb2pvLmV2YWxPYmpQYXRoPWZ1bmN0aW9uKF9lLF9mKXsKK2lmKHR5cGVvZiBfZSE9InN0cmluZyIpeworcmV0dXJuIGRvam8uZ2xvYmFsKCk7Cit9CitpZihfZS5pbmRleE9mKCIuIik9PS0xKXsKK3JldHVybiBkb2pvLmV2YWxQcm9wKF9lLGRvam8uZ2xvYmFsKCksX2YpOworfQordmFyIHJlZj1kb2pvLnBhcnNlT2JqUGF0aChfZSxkb2pvLmdsb2JhbCgpLF9mKTsKK2lmKHJlZil7CityZXR1cm4gZG9qby5ldmFsUHJvcChyZWYucHJvcCxyZWYub2JqLF9mKTsKK30KK3JldHVybiBudWxsOworfTsKK2Rvam8uZXJyb3JUb1N0cmluZz1mdW5jdGlvbihfMTEpeworaWYoIWRqX3VuZGVmKCJtZXNzYWdlIixfMTEpKXsKK3JldHVybiBfMTEubWVzc2FnZTsKK31lbHNleworaWYoIWRqX3VuZGVmKCJkZXNjcmlwdGlvbiIsXzExKSl7CityZXR1cm4gXzExLmRlc2NyaXB0aW9uOworfWVsc2V7CityZXR1cm4gXzExOworfQorfQorfTsKK2Rvam8ucmFpc2U9ZnVuY3Rpb24oXzEyLF8xMyl7CitpZihfMTMpeworXzEyPV8xMisiOiAiK2Rvam8uZXJyb3JUb1N0cmluZyhfMTMpOworfWVsc2V7CitfMTI9ZG9qby5lcnJvclRvU3RyaW5nKF8xMik7Cit9Cit0cnl7CitpZihkakNvbmZpZy5pc0RlYnVnKXsKK2Rvam8uaG9zdGVudi5wcmludGxuKCJGQVRBTCBleGNlcHRpb24gcmFpc2VkOiAiK18xMik7Cit9Cit9CitjYXRjaChlKXsKK30KK3Rocm93IF8xM3x8RXJyb3IoXzEyKTsKK307Citkb2pvLmRlYnVnPWZ1bmN0aW9uKCl7Cit9OworZG9qby5kZWJ1Z1NoYWxsb3c9ZnVuY3Rpb24ob2JqKXsKK307Citkb2pvLnByb2ZpbGU9e3N0YXJ0OmZ1bmN0aW9uKCl7Cit9LGVuZDpmdW5jdGlvbigpeworfSxzdG9wOmZ1bmN0aW9uKCl7Cit9LGR1bXA6ZnVuY3Rpb24oKXsKK319OworZnVuY3Rpb24gZGpfZXZhbChfMTUpeworcmV0dXJuIGRqX2dsb2JhbC5ldmFsP2RqX2dsb2JhbC5ldmFsKF8xNSk6ZXZhbChfMTUpOworfQorZG9qby51bmltcGxlbWVudGVkPWZ1bmN0aW9uKF8xNixfMTcpewordmFyIF8xOD0iJyIrXzE2KyInIG5vdCBpbXBsZW1lbnRlZCI7CitpZihfMTchPW51bGwpeworXzE4Kz0iICIrXzE3OworfQorZG9qby5yYWlzZShfMTgpOworfTsKK2Rvam8uZGVwcmVjYXRlZD1mdW5jdGlvbihfMTksXzFhLF8xYil7Cit2YXIgXzFjPSJERVBSRUNBVEVEOiAiK18xOTsKK2lmKF8xYSl7CitfMWMrPSIgIitfMWE7Cit9CitpZihfMWIpeworXzFjKz0iIC0tIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uOiAiK18xYjsKK30KK2Rvam8uZGVidWcoXzFjKTsKK307Citkb2pvLnJlbmRlcj0oZnVuY3Rpb24oKXsKK2Z1bmN0aW9uIHZzY2FmZm9sZChfMWQsXzFlKXsKK3ZhciB0bXA9e2NhcGFibGU6ZmFsc2Usc3VwcG9ydDp7YnVpbHRpbjpmYWxzZSxwbHVnaW46ZmFsc2V9LHByZWZpeGVzOl8xZH07Citmb3IodmFyIGk9MDtpPF8xZS5sZW5ndGg7aSsrKXsKK3RtcFtfMWVbaV1dPWZhbHNlOworfQorcmV0dXJuIHRtcDsKK30KK3JldHVybiB7bmFtZToiIix2ZXI6ZG9qby52ZXJzaW9uLG9zOnt3aW46ZmFsc2UsbGludXg6ZmFsc2Usb3N4OmZhbHNlfSxodG1sOnZzY2FmZm9sZChbImh0bWwiXSxbImllIiwib3BlcmEiLCJraHRtbCIsInNhZmFyaSIsIm1veiJdKSxzdmc6dnNjYWZmb2xkKFsic3ZnIl0sWyJjb3JlbCIsImFkb2JlIiwiYmF0aWsiXSksdm1sOnZzY2FmZm9sZChbInZtbCJdLFsiaWUiXSksc3dmOnZzY2FmZm9sZChbIlN3ZiIsIkZsYXNoIiwiTW0iXSxbIm1tIl0pLHN3dDp2c2NhZmZvbGQoWyJTd3QiXSxbImlibSJdKX07Cit9KSgpOworZG9qby5ob3N0ZW52PShmdW5jdGlvbigpewordmFyIF8yMT17aXNEZWJ1ZzpmYWxzZSxhbGxvd1F1ZXJ5Q29uZmlnOmZhbHNlLGJhc2VTY3JpcHRVcmk6IiIsYmFzZVJlbGF0aXZlUGF0aDoiIixsaWJyYXJ5U2NyaXB0VXJpOiIiLGllUHJldmVudENsb2JiZXI6ZmFsc2UsaWVDbG9iYmVyTWluaW1hbDp0cnVlLHByZXZlbnRCYWNrQnV0dG9uRml4OnRydWUsZGVsYXlNb3pMb2FkaW5nRml4OmZhbHNlLHNlYXJjaElkczpbXSxwYXJzZVdpZGdldHM6dHJ1ZX07CitpZih0eXBlb2YgZGpDb25maWc9PSJ1bmRlZmluZWQiKXsKK2RqQ29uZmlnPV8yMTsKK31lbHNleworZm9yKHZhciBfMjIgaW4gXzIxKXsKK2lmKHR5cGVvZiBkakNvbmZpZ1tfMjJdPT0idW5kZWZpbmVkIil7CitkakNvbmZpZ1tfMjJdPV8yMVtfMjJdOworfQorfQorfQorcmV0dXJuIHtuYW1lXzoiKHVuc2V0KSIsdmVyc2lvbl86Iih1bnNldCkiLGdldE5hbWU6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLm5hbWVfOworfSxnZXRWZXJzaW9uOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy52ZXJzaW9uXzsKK30sZ2V0VGV4dDpmdW5jdGlvbih1cmkpeworZG9qby51bmltcGxlbWVudGVkKCJnZXRUZXh0IiwidXJpPSIrdXJpKTsKK319OworfSkoKTsKK2Rvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpPWZ1bmN0aW9uKCl7CitpZihkakNvbmZpZy5iYXNlU2NyaXB0VXJpLmxlbmd0aCl7CityZXR1cm4gZGpDb25maWcuYmFzZVNjcmlwdFVyaTsKK30KK3ZhciB1cmk9bmV3IFN0cmluZyhkakNvbmZpZy5saWJyYXJ5U2NyaXB0VXJpfHxkakNvbmZpZy5iYXNlUmVsYXRpdmVQYXRoKTsKK2lmKCF1cmkpeworZG9qby5yYWlzZSgiTm90aGluZyByZXR1cm5lZCBieSBnZXRMaWJyYXJ5U2NyaXB0VXJpKCk6ICIrdXJpKTsKK30KK3ZhciBfMjU9dXJpLmxhc3RJbmRleE9mKCIvIik7CitkakNvbmZpZy5iYXNlU2NyaXB0VXJpPWRqQ29uZmlnLmJhc2VSZWxhdGl2ZVBhdGg7CityZXR1cm4gZGpDb25maWcuYmFzZVNjcmlwdFVyaTsKK307CisoZnVuY3Rpb24oKXsKK3ZhciBfMjY9e3BrZ0ZpbGVOYW1lOiJfX3BhY2thZ2VfXyIsbG9hZGluZ19tb2R1bGVzXzp7fSxsb2FkZWRfbW9kdWxlc186e30sYWRkZWRUb0xvYWRpbmdDb3VudDpbXSxyZW1vdmVkRnJvbUxvYWRpbmdDb3VudDpbXSxpbkZsaWdodENvdW50OjAsbW9kdWxlUHJlZml4ZXNfOntkb2pvOntuYW1lOiJkb2pvIix2YWx1ZToic3JjIn19LHNldE1vZHVsZVByZWZpeDpmdW5jdGlvbihfMjcsXzI4KXsKK3RoaXMubW9kdWxlUHJlZml4ZXNfW18yN109e25hbWU6XzI3LHZhbHVlOl8yOH07Cit9LG1vZHVsZUhhc1ByZWZpeDpmdW5jdGlvbihfMjkpewordmFyIG1wPXRoaXMubW9kdWxlUHJlZml4ZXNfOworcmV0dXJuIEJvb2xlYW4obXBbXzI5XSYmbXBbXzI5XS52YWx1ZSk7Cit9LGdldE1vZHVsZVByZWZpeDpmdW5jdGlvbihfMmIpeworaWYodGhpcy5tb2R1bGVIYXNQcmVmaXgoXzJiKSl7CityZXR1cm4gdGhpcy5tb2R1bGVQcmVmaXhlc19bXzJiXS52YWx1ZTsKK30KK3JldHVybiBfMmI7Cit9LGdldFRleHRTdGFjazpbXSxsb2FkVXJpU3RhY2s6W10sbG9hZGVkVXJpczpbXSxwb3N0X2xvYWRfOmZhbHNlLG1vZHVsZXNMb2FkZWRMaXN0ZW5lcnM6W10sdW5sb2FkTGlzdGVuZXJzOltdLGxvYWROb3RpZnlpbmc6ZmFsc2V9OworZm9yKHZhciBfMmMgaW4gXzI2KXsKK2Rvam8uaG9zdGVudltfMmNdPV8yNltfMmNdOworfQorfSkoKTsKK2Rvam8uaG9zdGVudi5sb2FkUGF0aD1mdW5jdGlvbihfMmQsXzJlLGNiKXsKK3ZhciB1cmk7CitpZihfMmQuY2hhckF0KDApPT0iLyJ8fF8yZC5tYXRjaCgvXlx3KzovKSl7Cit1cmk9XzJkOworfWVsc2V7Cit1cmk9dGhpcy5nZXRCYXNlU2NyaXB0VXJpKCkrXzJkOworfQoraWYoZGpDb25maWcuY2FjaGVCdXN0JiZkb2pvLnJlbmRlci5odG1sLmNhcGFibGUpewordXJpKz0iPyIrU3RyaW5nKGRqQ29uZmlnLmNhY2hlQnVzdCkucmVwbGFjZSgvXFcrL2csIiIpOworfQordHJ5eworcmV0dXJuICFfMmU/dGhpcy5sb2FkVXJpKHVyaSxjYik6dGhpcy5sb2FkVXJpQW5kQ2hlY2sodXJpLF8yZSxjYik7Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoZSk7CityZXR1cm4gZmFsc2U7Cit9Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmk9ZnVuY3Rpb24odXJpLGNiKXsKK2lmKHRoaXMubG9hZGVkVXJpc1t1cmldKXsKK3JldHVybiB0cnVlOworfQordmFyIF8zMz10aGlzLmdldFRleHQodXJpLG51bGwsdHJ1ZSk7CitpZighXzMzKXsKK3JldHVybiBmYWxzZTsKK30KK3RoaXMubG9hZGVkVXJpc1t1cmldPXRydWU7CitpZihjYil7CitfMzM9IigiK18zMysiKSI7Cit9Cit2YXIgXzM0PWRqX2V2YWwoXzMzKTsKK2lmKGNiKXsKK2NiKF8zNCk7Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmhvc3RlbnYubG9hZFVyaUFuZENoZWNrPWZ1bmN0aW9uKHVyaSxfMzYsY2IpewordmFyIG9rPXRydWU7Cit0cnl7Citvaz10aGlzLmxvYWRVcmkodXJpLGNiKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZygiZmFpbGVkIGxvYWRpbmcgIix1cmksIiB3aXRoIGVycm9yOiAiLGUpOworfQorcmV0dXJuIEJvb2xlYW4ob2smJnRoaXMuZmluZE1vZHVsZShfMzYsZmFsc2UpKTsKK307Citkb2pvLmxvYWRlZD1mdW5jdGlvbigpeworfTsKK2Rvam8udW5sb2FkZWQ9ZnVuY3Rpb24oKXsKK307Citkb2pvLmhvc3RlbnYubG9hZGVkPWZ1bmN0aW9uKCl7Cit0aGlzLmxvYWROb3RpZnlpbmc9dHJ1ZTsKK3RoaXMucG9zdF9sb2FkXz10cnVlOwordmFyIG1sbD10aGlzLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnM7Citmb3IodmFyIHg9MDt4PG1sbC5sZW5ndGg7eCsrKXsKK21sbFt4XSgpOworfQordGhpcy5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzPVtdOwordGhpcy5sb2FkTm90aWZ5aW5nPWZhbHNlOworZG9qby5sb2FkZWQoKTsKK307Citkb2pvLmhvc3RlbnYudW5sb2FkZWQ9ZnVuY3Rpb24oKXsKK3ZhciBtbGw9dGhpcy51bmxvYWRMaXN0ZW5lcnM7Cit3aGlsZShtbGwubGVuZ3RoKXsKKyhtbGwucG9wKCkpKCk7Cit9Citkb2pvLnVubG9hZGVkKCk7Cit9OworZG9qby5hZGRPbkxvYWQ9ZnVuY3Rpb24ob2JqLF8zZCl7Cit2YXIgZGg9ZG9qby5ob3N0ZW52OworaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7CitkaC5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnB1c2gob2JqKTsKK31lbHNleworaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsKK2RoLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMucHVzaChmdW5jdGlvbigpeworb2JqW18zZF0oKTsKK30pOworfQorfQoraWYoZGgucG9zdF9sb2FkXyYmZGguaW5GbGlnaHRDb3VudD09MCYmIWRoLmxvYWROb3RpZnlpbmcpeworZGguY2FsbExvYWRlZCgpOworfQorfTsKK2Rvam8uYWRkT25VbmxvYWQ9ZnVuY3Rpb24ob2JqLF80MCl7Cit2YXIgZGg9ZG9qby5ob3N0ZW52OworaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7CitkaC51bmxvYWRMaXN0ZW5lcnMucHVzaChvYmopOworfWVsc2V7CitpZihhcmd1bWVudHMubGVuZ3RoPjEpeworZGgudW5sb2FkTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXsKK29ialtfNDBdKCk7Cit9KTsKK30KK30KK307Citkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZD1mdW5jdGlvbigpeworaWYodGhpcy5wb3N0X2xvYWRfKXsKK3JldHVybjsKK30KK2lmKHRoaXMubG9hZFVyaVN0YWNrLmxlbmd0aD09MCYmdGhpcy5nZXRUZXh0U3RhY2subGVuZ3RoPT0wKXsKK2lmKHRoaXMuaW5GbGlnaHRDb3VudD4wKXsKK2Rvam8uZGVidWcoImZpbGVzIHN0aWxsIGluIGZsaWdodCEiKTsKK3JldHVybjsKK30KK2Rvam8uaG9zdGVudi5jYWxsTG9hZGVkKCk7Cit9Cit9OworZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQ9ZnVuY3Rpb24oKXsKK2lmKHR5cGVvZiBzZXRUaW1lb3V0PT0ib2JqZWN0Inx8KGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0mJmRvam8ucmVuZGVyLmh0bWwub3BlcmEpKXsKK3NldFRpbWVvdXQoImRvam8uaG9zdGVudi5sb2FkZWQoKTsiLDApOworfWVsc2V7Citkb2pvLmhvc3RlbnYubG9hZGVkKCk7Cit9Cit9OworZG9qby5ob3N0ZW52LmdldE1vZHVsZVN5bWJvbHM9ZnVuY3Rpb24oXzQyKXsKK3ZhciBfNDM9XzQyLnNwbGl0KCIuIik7Citmb3IodmFyIGk9XzQzLmxlbmd0aDtpPjA7aS0tKXsKK3ZhciBfNDU9XzQzLnNsaWNlKDAsaSkuam9pbigiLiIpOworaWYoKGk9PTEpJiYhdGhpcy5tb2R1bGVIYXNQcmVmaXgoXzQ1KSl7CitfNDNbMF09Ii4uLyIrXzQzWzBdOworfWVsc2V7Cit2YXIgXzQ2PXRoaXMuZ2V0TW9kdWxlUHJlZml4KF80NSk7CitpZihfNDYhPV80NSl7CitfNDMuc3BsaWNlKDAsaSxfNDYpOworYnJlYWs7Cit9Cit9Cit9CityZXR1cm4gXzQzOworfTsKK2Rvam8uaG9zdGVudi5fZ2xvYmFsX29taXRfbW9kdWxlX2NoZWNrPWZhbHNlOworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGU9ZnVuY3Rpb24oXzQ3LF80OCxfNDkpeworaWYoIV80Nyl7CityZXR1cm47Cit9CitfNDk9dGhpcy5fZ2xvYmFsX29taXRfbW9kdWxlX2NoZWNrfHxfNDk7Cit2YXIgXzRhPXRoaXMuZmluZE1vZHVsZShfNDcsZmFsc2UpOworaWYoXzRhKXsKK3JldHVybiBfNGE7Cit9CitpZihkal91bmRlZihfNDcsdGhpcy5sb2FkaW5nX21vZHVsZXNfKSl7Cit0aGlzLmFkZGVkVG9Mb2FkaW5nQ291bnQucHVzaChfNDcpOworfQordGhpcy5sb2FkaW5nX21vZHVsZXNfW180N109MTsKK3ZhciBfNGI9XzQ3LnJlcGxhY2UoL1wuL2csIi8iKSsiLmpzIjsKK3ZhciBfNGM9XzQ3LnNwbGl0KCIuIik7Cit2YXIgXzRkPXRoaXMuZ2V0TW9kdWxlU3ltYm9scyhfNDcpOwordmFyIF80ZT0oKF80ZFswXS5jaGFyQXQoMCkhPSIvIikmJiFfNGRbMF0ubWF0Y2goL15cdys6LykpOwordmFyIF80Zj1fNGRbXzRkLmxlbmd0aC0xXTsKK3ZhciBvazsKK2lmKF80Zj09IioiKXsKK180Nz1fNGMuc2xpY2UoMCwtMSkuam9pbigiLiIpOword2hpbGUoXzRkLmxlbmd0aCl7CitfNGQucG9wKCk7CitfNGQucHVzaCh0aGlzLnBrZ0ZpbGVOYW1lKTsKK180Yj1fNGQuam9pbigiLyIpKyIuanMiOworaWYoXzRlJiZfNGIuY2hhckF0KDApPT0iLyIpeworXzRiPV80Yi5zbGljZSgxKTsKK30KK29rPXRoaXMubG9hZFBhdGgoXzRiLCFfNDk/XzQ3Om51bGwpOworaWYob2speworYnJlYWs7Cit9CitfNGQucG9wKCk7Cit9Cit9ZWxzZXsKK180Yj1fNGQuam9pbigiLyIpKyIuanMiOworXzQ3PV80Yy5qb2luKCIuIik7Cit2YXIgXzUxPSFfNDk/XzQ3Om51bGw7Citvaz10aGlzLmxvYWRQYXRoKF80YixfNTEpOworaWYoIW9rJiYhXzQ4KXsKK180ZC5wb3AoKTsKK3doaWxlKF80ZC5sZW5ndGgpeworXzRiPV80ZC5qb2luKCIvIikrIi5qcyI7Citvaz10aGlzLmxvYWRQYXRoKF80YixfNTEpOworaWYob2speworYnJlYWs7Cit9CitfNGQucG9wKCk7CitfNGI9XzRkLmpvaW4oIi8iKSsiLyIrdGhpcy5wa2dGaWxlTmFtZSsiLmpzIjsKK2lmKF80ZSYmXzRiLmNoYXJBdCgwKT09Ii8iKXsKK180Yj1fNGIuc2xpY2UoMSk7Cit9Citvaz10aGlzLmxvYWRQYXRoKF80YixfNTEpOworaWYob2speworYnJlYWs7Cit9Cit9Cit9CitpZighb2smJiFfNDkpeworZG9qby5yYWlzZSgiQ291bGQgbm90IGxvYWQgJyIrXzQ3KyInOyBsYXN0IHRyaWVkICciK180YisiJyIpOworfQorfQoraWYoIV80OSYmIXRoaXNbImlzWERvbWFpbiJdKXsKK180YT10aGlzLmZpbmRNb2R1bGUoXzQ3LGZhbHNlKTsKK2lmKCFfNGEpeworZG9qby5yYWlzZSgic3ltYm9sICciK180NysiJyBpcyBub3QgZGVmaW5lZCBhZnRlciBsb2FkaW5nICciK180YisiJyIpOworfQorfQorcmV0dXJuIF80YTsKK307Citkb2pvLmhvc3RlbnYuc3RhcnRQYWNrYWdlPWZ1bmN0aW9uKF81Mil7Cit2YXIgXzUzPVN0cmluZyhfNTIpOwordmFyIF81ND1fNTM7Cit2YXIgXzU1PV81Mi5zcGxpdCgvXC4vKTsKK2lmKF81NVtfNTUubGVuZ3RoLTFdPT0iKiIpeworXzU1LnBvcCgpOworXzU0PV81NS5qb2luKCIuIik7Cit9Cit2YXIgXzU2PWRvam8uZXZhbE9ialBhdGgoXzU0LHRydWUpOwordGhpcy5sb2FkZWRfbW9kdWxlc19bXzUzXT1fNTY7Cit0aGlzLmxvYWRlZF9tb2R1bGVzX1tfNTRdPV81NjsKK3JldHVybiBfNTY7Cit9OworZG9qby5ob3N0ZW52LmZpbmRNb2R1bGU9ZnVuY3Rpb24oXzU3LF81OCl7Cit2YXIgbG1uPVN0cmluZyhfNTcpOworaWYodGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXSl7CityZXR1cm4gdGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXTsKK30KK2lmKF81OCl7Citkb2pvLnJhaXNlKCJubyBsb2FkZWQgbW9kdWxlIG5hbWVkICciK181NysiJyIpOworfQorcmV0dXJuIG51bGw7Cit9OworZG9qby5rd0NvbXBvdW5kUmVxdWlyZT1mdW5jdGlvbihfNWEpewordmFyIF81Yj1fNWFbImNvbW1vbiJdfHxbXTsKK3ZhciBfNWM9XzVhW2Rvam8uaG9zdGVudi5uYW1lX10/XzViLmNvbmNhdChfNWFbZG9qby5ob3N0ZW52Lm5hbWVfXXx8W10pOl81Yi5jb25jYXQoXzVhWyJkZWZhdWx0Il18fFtdKTsKK2Zvcih2YXIgeD0wO3g8XzVjLmxlbmd0aDt4KyspewordmFyIF81ZT1fNWNbeF07CitpZihfNWUuY29uc3RydWN0b3I9PUFycmF5KXsKK2Rvam8uaG9zdGVudi5sb2FkTW9kdWxlLmFwcGx5KGRvam8uaG9zdGVudixfNWUpOworfWVsc2V7Citkb2pvLmhvc3RlbnYubG9hZE1vZHVsZShfNWUpOworfQorfQorfTsKK2Rvam8ucmVxdWlyZT1mdW5jdGlvbihfNWYpeworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUuYXBwbHkoZG9qby5ob3N0ZW52LGFyZ3VtZW50cyk7Cit9OworZG9qby5yZXF1aXJlSWY9ZnVuY3Rpb24oXzYwLF82MSl7Cit2YXIgXzYyPWFyZ3VtZW50c1swXTsKK2lmKChfNjI9PT10cnVlKXx8KF82Mj09ImNvbW1vbiIpfHwoXzYyJiZkb2pvLnJlbmRlcltfNjJdLmNhcGFibGUpKXsKK3ZhciBfNjM9W107Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK182My5wdXNoKGFyZ3VtZW50c1tpXSk7Cit9Citkb2pvLnJlcXVpcmUuYXBwbHkoZG9qbyxfNjMpOworfQorfTsKK2Rvam8ucmVxdWlyZUFmdGVySWY9ZG9qby5yZXF1aXJlSWY7Citkb2pvLnByb3ZpZGU9ZnVuY3Rpb24oXzY1KXsKK3JldHVybiBkb2pvLmhvc3RlbnYuc3RhcnRQYWNrYWdlLmFwcGx5KGRvam8uaG9zdGVudixhcmd1bWVudHMpOworfTsKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoPWZ1bmN0aW9uKF82NixfNjcpeworcmV0dXJuIGRvam8uaG9zdGVudi5zZXRNb2R1bGVQcmVmaXgoXzY2LF82Nyk7Cit9OworaWYoZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworZm9yKHZhciBwYXJhbSBpbiBkakNvbmZpZ1sibW9kdWxlUGF0aHMiXSl7Citkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChwYXJhbSxkakNvbmZpZ1sibW9kdWxlUGF0aHMiXVtwYXJhbV0pOworfQorfQorZG9qby5zZXRNb2R1bGVQcmVmaXg9ZnVuY3Rpb24oXzY4LF82OSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uc2V0TW9kdWxlUHJlZml4KFwiIitfNjgrIlwiLCBcIiIrXzY5KyJcIikiLCJyZXBsYWNlZCBieSBkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aCIsIjAuNSIpOworcmV0dXJuIGRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKF82OCxfNjkpOworfTsKK2Rvam8uZXhpc3RzPWZ1bmN0aW9uKG9iaixfNmIpewordmFyIHA9XzZiLnNwbGl0KCIuIik7Citmb3IodmFyIGk9MDtpPHAubGVuZ3RoO2krKyl7CitpZighb2JqW3BbaV1dKXsKK3JldHVybiBmYWxzZTsKK30KK29iaj1vYmpbcFtpXV07Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlPWZ1bmN0aW9uKF82ZSl7Cit2YXIgXzZmPV82ZT9fNmUudG9Mb3dlckNhc2UoKTpkb2pvLmxvY2FsZTsKK2lmKF82Zj09InJvb3QiKXsKK182Zj0iUk9PVCI7Cit9CityZXR1cm4gXzZmOworfTsKK2Rvam8uaG9zdGVudi5zZWFyY2hMb2NhbGVQYXRoPWZ1bmN0aW9uKF83MCxfNzEsXzcyKXsKK183MD1kb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKF83MCk7Cit2YXIgXzczPV83MC5zcGxpdCgiLSIpOwordmFyIF83ND1bXTsKK2Zvcih2YXIgaT1fNzMubGVuZ3RoO2k+MDtpLS0peworXzc0LnB1c2goXzczLnNsaWNlKDAsaSkuam9pbigiLSIpKTsKK30KK183NC5wdXNoKGZhbHNlKTsKK2lmKF83MSl7CitfNzQucmV2ZXJzZSgpOworfQorZm9yKHZhciBqPV83NC5sZW5ndGgtMTtqPj0wO2otLSl7Cit2YXIgbG9jPV83NFtqXXx8IlJPT1QiOwordmFyIF83OD1fNzIobG9jKTsKK2lmKF83OCl7CiticmVhazsKK30KK30KK307Citkb2pvLmhvc3RlbnYubG9jYWxlc0dlbmVyYXRlZDsKK2Rvam8uaG9zdGVudi5yZWdpc3Rlck5sc1ByZWZpeD1mdW5jdGlvbigpeworZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgoIm5scyIsIm5scyIpOworfTsKK2Rvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucz1mdW5jdGlvbigpeworaWYoZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQpeworZG9qby5ob3N0ZW52LnJlZ2lzdGVyTmxzUHJlZml4KCk7CitmdW5jdGlvbiBwcmVsb2FkKF83OSl7CitfNzk9ZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShfNzkpOworZG9qby5ob3N0ZW52LnNlYXJjaExvY2FsZVBhdGgoXzc5LHRydWUsZnVuY3Rpb24obG9jKXsKK2Zvcih2YXIgaT0wO2k8ZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQubGVuZ3RoO2krKyl7CitpZihkb2pvLmhvc3RlbnYubG9jYWxlc0dlbmVyYXRlZFtpXT09bG9jKXsKK2Rvam9bInJlcXVpcmUiXSgibmxzLmRvam9fIitsb2MpOworcmV0dXJuIHRydWU7Cit9Cit9CityZXR1cm4gZmFsc2U7Cit9KTsKK30KK3ByZWxvYWQoKTsKK3ZhciBfN2M9ZGpDb25maWcuZXh0cmFMb2NhbGV8fFtdOworZm9yKHZhciBpPTA7aTxfN2MubGVuZ3RoO2krKyl7CitwcmVsb2FkKF83Y1tpXSk7Cit9Cit9Citkb2pvLmhvc3RlbnYucHJlbG9hZExvY2FsaXphdGlvbnM9ZnVuY3Rpb24oKXsKK307Cit9OworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uPWZ1bmN0aW9uKF83ZSxfN2YsXzgwLF84MSl7Citkb2pvLmhvc3RlbnYucHJlbG9hZExvY2FsaXphdGlvbnMoKTsKK3ZhciBfODI9ZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShfODApOwordmFyIF84Mz1bXzdlLCJubHMiLF83Zl0uam9pbigiLiIpOwordmFyIF84ND0iIjsKK2lmKF84MSl7Cit2YXIgXzg1PV84MS5zcGxpdCgiLCIpOworZm9yKHZhciBpPTA7aTxfODUubGVuZ3RoO2krKyl7CitpZihfODIuaW5kZXhPZihfODVbaV0pPT0wKXsKK2lmKF84NVtpXS5sZW5ndGg+Xzg0Lmxlbmd0aCl7CitfODQ9Xzg1W2ldOworfQorfQorfQoraWYoIV84NCl7CitfODQ9IlJPT1QiOworfQorfQordmFyIF84Nz1fODE/Xzg0Ol84MjsKK3ZhciBfODg9ZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUoXzgzKTsKK3ZhciBfODk9bnVsbDsKK2lmKF84OCl7CitpZihkakNvbmZpZy5sb2NhbGl6YXRpb25Db21wbGV0ZSYmXzg4Ll9idWlsdCl7CityZXR1cm47Cit9Cit2YXIgXzhhPV84Ny5yZXBsYWNlKCItIiwiXyIpOwordmFyIF84Yj1fODMrIi4iK184YTsKK184OT1kb2pvLmhvc3RlbnYuZmluZE1vZHVsZShfOGIpOworfQoraWYoIV84OSl7CitfODg9ZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShfODMpOwordmFyIF84Yz1kb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhfN2UpOwordmFyIF84ZD1fOGMuY29uY2F0KCJubHMiKS5qb2luKCIvIik7Cit2YXIgXzhlOworZG9qby5ob3N0ZW52LnNlYXJjaExvY2FsZVBhdGgoXzg3LF84MSxmdW5jdGlvbihsb2MpewordmFyIF85MD1sb2MucmVwbGFjZSgiLSIsIl8iKTsKK3ZhciBfOTE9XzgzKyIuIitfOTA7Cit2YXIgXzkyPWZhbHNlOworaWYoIWRvam8uaG9zdGVudi5maW5kTW9kdWxlKF85MSkpeworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShfOTEpOwordmFyIF85Mz1bXzhkXTsKK2lmKGxvYyE9IlJPT1QiKXsKK185My5wdXNoKGxvYyk7Cit9CitfOTMucHVzaChfN2YpOwordmFyIF85ND1fOTMuam9pbigiLyIpKyIuanMiOworXzkyPWRvam8uaG9zdGVudi5sb2FkUGF0aChfOTQsbnVsbCxmdW5jdGlvbihfOTUpewordmFyIF85Nj1mdW5jdGlvbigpeworfTsKK185Ni5wcm90b3R5cGU9XzhlOworXzg4W185MF09bmV3IF85NigpOworZm9yKHZhciBqIGluIF85NSl7CitfODhbXzkwXVtqXT1fOTVbal07Cit9Cit9KTsKK31lbHNleworXzkyPXRydWU7Cit9CitpZihfOTImJl84OFtfOTBdKXsKK184ZT1fODhbXzkwXTsKK31lbHNleworXzg4W185MF09XzhlOworfQoraWYoXzgxKXsKK3JldHVybiB0cnVlOworfQorfSk7Cit9CitpZihfODEmJl84MiE9Xzg0KXsKK184OFtfODIucmVwbGFjZSgiLSIsIl8iKV09Xzg4W184NC5yZXBsYWNlKCItIiwiXyIpXTsKK30KK307CisoZnVuY3Rpb24oKXsKK3ZhciBfOTg9ZGpDb25maWcuZXh0cmFMb2NhbGU7CitpZihfOTgpeworaWYoIV85OCBpbnN0YW5jZW9mIEFycmF5KXsKK185OD1bXzk4XTsKK30KK3ZhciByZXE9ZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uOworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uPWZ1bmN0aW9uKG0sYixfOWMsXzlkKXsKK3JlcShtLGIsXzljLF85ZCk7CitpZihfOWMpeworcmV0dXJuOworfQorZm9yKHZhciBpPTA7aTxfOTgubGVuZ3RoO2krKyl7CityZXEobSxiLF85OFtpXSxfOWQpOworfQorfTsKK30KK30pKCk7Cit9CitpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIil7CisoZnVuY3Rpb24oKXsKK2lmKGRqQ29uZmlnLmFsbG93UXVlcnlDb25maWcpewordmFyIF85Zj1kb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpOwordmFyIF9hMD1fOWYuc3BsaXQoIj8iLDIpOworaWYoX2EwLmxlbmd0aD4xKXsKK3ZhciBfYTE9X2EwWzFdOwordmFyIF9hMj1fYTEuc3BsaXQoIiYiKTsKK2Zvcih2YXIgeCBpbiBfYTIpewordmFyIHNwPV9hMlt4XS5zcGxpdCgiPSIpOworaWYoKHNwWzBdLmxlbmd0aD45KSYmKHNwWzBdLnN1YnN0cigwLDkpPT0iZGpDb25maWcuIikpewordmFyIG9wdD1zcFswXS5zdWJzdHIoOSk7Cit0cnl7CitkakNvbmZpZ1tvcHRdPWV2YWwoc3BbMV0pOworfQorY2F0Y2goZSl7CitkakNvbmZpZ1tvcHRdPXNwWzFdOworfQorfQorfQorfQorfQoraWYoKChkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdPT0iIil8fChkakNvbmZpZ1siYmFzZVJlbGF0aXZlUGF0aCJdPT0iIikpJiYoZG9jdW1lbnQmJmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSl7Cit2YXIgX2E2PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsKK3ZhciBfYTc9LyhfX3BhY2thZ2VfX3xkb2pvfGJvb3RzdHJhcDEpXC5qcyhbXD9cLl18JCkvaTsKK2Zvcih2YXIgaT0wO2k8X2E2Lmxlbmd0aDtpKyspewordmFyIHNyYz1fYTZbaV0uZ2V0QXR0cmlidXRlKCJzcmMiKTsKK2lmKCFzcmMpeworY29udGludWU7Cit9Cit2YXIgbT1zcmMubWF0Y2goX2E3KTsKK2lmKG0pewordmFyIF9hYj1zcmMuc3Vic3RyaW5nKDAsbS5pbmRleCk7CitpZihzcmMuaW5kZXhPZigiYm9vdHN0cmFwMSIpPi0xKXsKK19hYis9Ii4uLyI7Cit9CitpZighdGhpc1siZGpDb25maWciXSl7CitkakNvbmZpZz17fTsKK30KK2lmKGRqQ29uZmlnWyJiYXNlU2NyaXB0VXJpIl09PSIiKXsKK2RqQ29uZmlnWyJiYXNlU2NyaXB0VXJpIl09X2FiOworfQoraWYoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXT09IiIpeworZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXT1fYWI7Cit9CiticmVhazsKK30KK30KK30KK3ZhciBkcj1kb2pvLnJlbmRlcjsKK3ZhciBkcmg9ZG9qby5yZW5kZXIuaHRtbDsKK3ZhciBkcnM9ZG9qby5yZW5kZXIuc3ZnOwordmFyIGR1YT0oZHJoLlVBPW5hdmlnYXRvci51c2VyQWdlbnQpOwordmFyIGRhdj0oZHJoLkFWPW5hdmlnYXRvci5hcHBWZXJzaW9uKTsKK3ZhciB0PXRydWU7Cit2YXIgZj1mYWxzZTsKK2RyaC5jYXBhYmxlPXQ7Citkcmguc3VwcG9ydC5idWlsdGluPXQ7Citkci52ZXI9cGFyc2VGbG9hdChkcmguQVYpOworZHIub3MubWFjPWRhdi5pbmRleE9mKCJNYWNpbnRvc2giKT49MDsKK2RyLm9zLndpbj1kYXYuaW5kZXhPZigiV2luZG93cyIpPj0wOworZHIub3MubGludXg9ZGF2LmluZGV4T2YoIlgxMSIpPj0wOworZHJoLm9wZXJhPWR1YS5pbmRleE9mKCJPcGVyYSIpPj0wOworZHJoLmtodG1sPShkYXYuaW5kZXhPZigiS29ucXVlcm9yIik+PTApfHwoZGF2LmluZGV4T2YoIlNhZmFyaSIpPj0wKTsKK2RyaC5zYWZhcmk9ZGF2LmluZGV4T2YoIlNhZmFyaSIpPj0wOwordmFyIF9iMz1kdWEuaW5kZXhPZigiR2Vja28iKTsKK2RyaC5tb3ppbGxhPWRyaC5tb3o9KF9iMz49MCkmJighZHJoLmtodG1sKTsKK2lmKGRyaC5tb3ppbGxhKXsKK2RyaC5nZWNrb1ZlcnNpb249ZHVhLnN1YnN0cmluZyhfYjMrNixfYjMrMTQpOworfQorZHJoLmllPShkb2N1bWVudC5hbGwpJiYoIWRyaC5vcGVyYSk7CitkcmguaWU1MD1kcmguaWUmJmRhdi5pbmRleE9mKCJNU0lFIDUuMCIpPj0wOworZHJoLmllNTU9ZHJoLmllJiZkYXYuaW5kZXhPZigiTVNJRSA1LjUiKT49MDsKK2RyaC5pZTYwPWRyaC5pZSYmZGF2LmluZGV4T2YoIk1TSUUgNi4wIik+PTA7CitkcmguaWU3MD1kcmguaWUmJmRhdi5pbmRleE9mKCJNU0lFIDcuMCIpPj0wOwordmFyIGNtPWRvY3VtZW50WyJjb21wYXRNb2RlIl07CitkcmgucXVpcmtzPShjbT09IkJhY2tDb21wYXQiKXx8KGNtPT0iUXVpcmtzTW9kZSIpfHxkcmguaWU1NXx8ZHJoLmllNTA7Citkb2pvLmxvY2FsZT1kb2pvLmxvY2FsZXx8KGRyaC5pZT9uYXZpZ2F0b3IudXNlckxhbmd1YWdlOm5hdmlnYXRvci5sYW5ndWFnZSkudG9Mb3dlckNhc2UoKTsKK2RyLnZtbC5jYXBhYmxlPWRyaC5pZTsKK2Rycy5jYXBhYmxlPWY7CitkcnMuc3VwcG9ydC5wbHVnaW49ZjsKK2Rycy5zdXBwb3J0LmJ1aWx0aW49ZjsKK3ZhciBfYjU9d2luZG93WyJkb2N1bWVudCJdOwordmFyIHRkaT1fYjVbImltcGxlbWVudGF0aW9uIl07CitpZigodGRpKSYmKHRkaVsiaGFzRmVhdHVyZSJdKSYmKHRkaS5oYXNGZWF0dXJlKCJvcmcudzNjLmRvbS5zdmciLCIxLjAiKSkpeworZHJzLmNhcGFibGU9dDsKK2Rycy5zdXBwb3J0LmJ1aWx0aW49dDsKK2Rycy5zdXBwb3J0LnBsdWdpbj1mOworfQoraWYoZHJoLnNhZmFyaSl7Cit2YXIgdG1wPWR1YS5zcGxpdCgiQXBwbGVXZWJLaXQvIilbMV07Cit2YXIgdmVyPXBhcnNlRmxvYXQodG1wLnNwbGl0KCIgIilbMF0pOworaWYodmVyPj00MjApeworZHJzLmNhcGFibGU9dDsKK2Rycy5zdXBwb3J0LmJ1aWx0aW49dDsKK2Rycy5zdXBwb3J0LnBsdWdpbj1mOworfQorfWVsc2V7Cit9Cit9KSgpOworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSgiZG9qby5ob3N0ZW52Iik7Citkb2pvLnJlbmRlci5uYW1lPWRvam8uaG9zdGVudi5uYW1lXz0iYnJvd3NlciI7Citkb2pvLmhvc3RlbnYuc2VhcmNoSWRzPVtdOworZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFM9WyJNc3htbDIuWE1MSFRUUCIsIk1pY3Jvc29mdC5YTUxIVFRQIiwiTXN4bWwyLlhNTEhUVFAuNC4wIl07Citkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdD1mdW5jdGlvbigpewordmFyIF9iOT1udWxsOwordmFyIF9iYT1udWxsOwordHJ5eworX2I5PW5ldyBYTUxIdHRwUmVxdWVzdCgpOworfQorY2F0Y2goZSl7Cit9CitpZighX2I5KXsKK2Zvcih2YXIgaT0wO2k8MzsrK2kpewordmFyIF9iYz1kb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEU1tpXTsKK3RyeXsKK19iOT1uZXcgQWN0aXZlWE9iamVjdChfYmMpOworfQorY2F0Y2goZSl7CitfYmE9ZTsKK30KK2lmKF9iOSl7Citkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEUz1bX2JjXTsKK2JyZWFrOworfQorfQorfQoraWYoIV9iOSl7CityZXR1cm4gZG9qby5yYWlzZSgiWE1MSFRUUCBub3QgYXZhaWxhYmxlIixfYmEpOworfQorcmV0dXJuIF9iOTsKK307Citkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmM9ZmFsc2U7Citkb2pvLmhvc3RlbnYuZ2V0VGV4dD1mdW5jdGlvbih1cmksX2JlLF9iZil7CitpZighX2JlKXsKK3RoaXMuX2Jsb2NrQXN5bmM9dHJ1ZTsKK30KK3ZhciBfYzA9dGhpcy5nZXRYbWxodHRwT2JqZWN0KCk7CitmdW5jdGlvbiBpc0RvY3VtZW50T2soX2MxKXsKK3ZhciBfYzI9X2MxWyJzdGF0dXMiXTsKK3JldHVybiBCb29sZWFuKCghX2MyKXx8KCgyMDA8PV9jMikmJigzMDA+X2MyKSl8fChfYzI9PTMwNCkpOworfQoraWYoX2JlKXsKK3ZhciBfYzM9dGhpcyxfYzQ9bnVsbCxnYmw9ZG9qby5nbG9iYWwoKTsKK3ZhciB4aHI9ZG9qby5ldmFsT2JqUGF0aCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0Iik7CitfYzAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7CitpZihfYzQpeworZ2JsLmNsZWFyVGltZW91dChfYzQpOworX2M0PW51bGw7Cit9CitpZihfYzMuX2Jsb2NrQXN5bmN8fCh4aHImJnhoci5fYmxvY2tBc3luYykpeworX2M0PWdibC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CitfYzAub25yZWFkeXN0YXRlY2hhbmdlLmFwcGx5KHRoaXMpOworfSwxMCk7Cit9ZWxzZXsKK2lmKDQ9PV9jMC5yZWFkeVN0YXRlKXsKK2lmKGlzRG9jdW1lbnRPayhfYzApKXsKK19iZShfYzAucmVzcG9uc2VUZXh0KTsKK30KK30KK30KK307Cit9CitfYzAub3BlbigiR0VUIix1cmksX2JlP3RydWU6ZmFsc2UpOwordHJ5eworX2MwLnNlbmQobnVsbCk7CitpZihfYmUpeworcmV0dXJuIG51bGw7Cit9CitpZighaXNEb2N1bWVudE9rKF9jMCkpewordmFyIGVycj1FcnJvcigiVW5hYmxlIHRvIGxvYWQgIit1cmkrIiBzdGF0dXM6IitfYzAuc3RhdHVzKTsKK2Vyci5zdGF0dXM9X2MwLnN0YXR1czsKK2Vyci5yZXNwb25zZVRleHQ9X2MwLnJlc3BvbnNlVGV4dDsKK3Rocm93IGVycjsKK30KK30KK2NhdGNoKGUpewordGhpcy5fYmxvY2tBc3luYz1mYWxzZTsKK2lmKChfYmYpJiYoIV9iZSkpeworcmV0dXJuIG51bGw7Cit9ZWxzZXsKK3Rocm93IGU7Cit9Cit9Cit0aGlzLl9ibG9ja0FzeW5jPWZhbHNlOworcmV0dXJuIF9jMC5yZXNwb25zZVRleHQ7Cit9OworZG9qby5ob3N0ZW52LmRlZmF1bHREZWJ1Z0NvbnRhaW5lcklkPSJkb2pvRGVidWciOworZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlcj1bXTsKK2Rvam8uaG9zdGVudi5fcHJpbnRsbl9zYWZlPWZhbHNlOworZG9qby5ob3N0ZW52LnByaW50bG49ZnVuY3Rpb24oX2M4KXsKK2lmKCFkb2pvLmhvc3RlbnYuX3ByaW50bG5fc2FmZSl7Citkb2pvLmhvc3RlbnYuX3ByaW50bG5fYnVmZmVyLnB1c2goX2M4KTsKK31lbHNlewordHJ5ewordmFyIF9jOT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkakNvbmZpZy5kZWJ1Z0NvbnRhaW5lcklkP2RqQ29uZmlnLmRlYnVnQ29udGFpbmVySWQ6ZG9qby5ob3N0ZW52LmRlZmF1bHREZWJ1Z0NvbnRhaW5lcklkKTsKK2lmKCFfYzkpeworX2M5PWRvam8uYm9keSgpOworfQordmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK2Rpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShfYzgpKTsKK19jOS5hcHBlbmRDaGlsZChkaXYpOworfQorY2F0Y2goZSl7Cit0cnl7Citkb2N1bWVudC53cml0ZSgiPGRpdj4iK19jOCsiPC9kaXY+Iik7Cit9CitjYXRjaChlMil7Cit3aW5kb3cuc3RhdHVzPV9jODsKK30KK30KK30KK307Citkb2pvLmFkZE9uTG9hZChmdW5jdGlvbigpeworZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmU9dHJ1ZTsKK3doaWxlKGRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIubGVuZ3RoPjApeworZG9qby5ob3N0ZW52LnByaW50bG4oZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5zaGlmdCgpKTsKK30KK30pOworZnVuY3Rpb24gZGpfYWRkTm9kZUV2dEhkbHIoX2NiLF9jYyxmcCl7Cit2YXIgX2NlPV9jYlsib24iK19jY118fGZ1bmN0aW9uKCl7Cit9OworX2NiWyJvbiIrX2NjXT1mdW5jdGlvbigpeworZnAuYXBwbHkoX2NiLGFyZ3VtZW50cyk7CitfY2UuYXBwbHkoX2NiLGFyZ3VtZW50cyk7Cit9OworcmV0dXJuIHRydWU7Cit9Citkb2pvLmhvc3RlbnYuX2RqSW5pdEZpcmVkPWZhbHNlOworZnVuY3Rpb24gZGpfbG9hZF9pbml0KGUpeworZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZD10cnVlOwordmFyIF9kMD0oZSYmZS50eXBlKT9lLnR5cGUudG9Mb3dlckNhc2UoKToibG9hZCI7CitpZihhcmd1bWVudHMuY2FsbGVlLmluaXRpYWxpemVkfHwoX2QwIT0iZG9tY29udGVudGxvYWRlZCImJl9kMCE9ImxvYWQiKSl7CityZXR1cm47Cit9Cithcmd1bWVudHMuY2FsbGVlLmluaXRpYWxpemVkPXRydWU7CitpZih0eXBlb2YgKF90aW1lcikhPSJ1bmRlZmluZWQiKXsKK2NsZWFySW50ZXJ2YWwoX3RpbWVyKTsKK2RlbGV0ZSBfdGltZXI7Cit9Cit2YXIgX2QxPWZ1bmN0aW9uKCl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uaG9zdGVudi5tYWtlV2lkZ2V0cygpOworfQorfTsKK2lmKGRvam8uaG9zdGVudi5pbkZsaWdodENvdW50PT0wKXsKK19kMSgpOworZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWQoKTsKK31lbHNleworZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMudW5zaGlmdChfZDEpOworfQorfQoraWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7CitpZihkb2pvLnJlbmRlci5odG1sLm9wZXJhfHwoZG9qby5yZW5kZXIuaHRtbC5tb3omJihkakNvbmZpZ1siZW5hYmxlTW96RG9tQ29udGVudExvYWRlZCJdPT09dHJ1ZSkpKXsKK2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGRqX2xvYWRfaW5pdCxudWxsKTsKK30KK3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixkal9sb2FkX2luaXQsbnVsbCk7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllJiZkb2pvLnJlbmRlci5vcy53aW4peworZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oZSl7CitpZihkb2N1bWVudC5yZWFkeVN0YXRlPT0iY29tcGxldGUiKXsKK2RqX2xvYWRfaW5pdCgpOworfQorfSk7Cit9CitpZigvKFdlYktpdHxraHRtbCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXsKK3ZhciBfdGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKK2lmKC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpeworZGpfbG9hZF9pbml0KCk7Cit9Cit9LDEwKTsKK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZGpfYWRkTm9kZUV2dEhkbHIod2luZG93LCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7Citkb2pvLmhvc3RlbnYuX3VubG9hZGluZz10cnVlOword2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKK2Rvam8uaG9zdGVudi5fdW5sb2FkaW5nPWZhbHNlOworfSwwKTsKK30pOworfQorZGpfYWRkTm9kZUV2dEhkbHIod2luZG93LCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Citkb2pvLmhvc3RlbnYudW5sb2FkZWQoKTsKK2lmKCghZG9qby5yZW5kZXIuaHRtbC5pZSl8fChkb2pvLnJlbmRlci5odG1sLmllJiZkb2pvLmhvc3RlbnYuX3VubG9hZGluZykpeworZG9qby5ob3N0ZW52LnVubG9hZGVkKCk7Cit9Cit9KTsKK2Rvam8uaG9zdGVudi5tYWtlV2lkZ2V0cz1mdW5jdGlvbigpewordmFyIF9kMz1bXTsKK2lmKGRqQ29uZmlnLnNlYXJjaElkcyYmZGpDb25maWcuc2VhcmNoSWRzLmxlbmd0aD4wKXsKK19kMz1fZDMuY29uY2F0KGRqQ29uZmlnLnNlYXJjaElkcyk7Cit9CitpZihkb2pvLmhvc3RlbnYuc2VhcmNoSWRzJiZkb2pvLmhvc3RlbnYuc2VhcmNoSWRzLmxlbmd0aD4wKXsKK19kMz1fZDMuY29uY2F0KGRvam8uaG9zdGVudi5zZWFyY2hJZHMpOworfQoraWYoKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cyl8fChfZDMubGVuZ3RoPjApKXsKK2lmKGRvam8uZXZhbE9ialBhdGgoImRvam8ud2lkZ2V0LlBhcnNlIikpewordmFyIF9kND1uZXcgZG9qby54bWwuUGFyc2UoKTsKK2lmKF9kMy5sZW5ndGg+MCl7Citmb3IodmFyIHg9MDt4PF9kMy5sZW5ndGg7eCsrKXsKK3ZhciBfZDY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoX2QzW3hdKTsKK2lmKCFfZDYpeworY29udGludWU7Cit9Cit2YXIgX2Q3PV9kNC5wYXJzZUVsZW1lbnQoX2Q2LG51bGwsdHJ1ZSk7Citkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVDb21wb25lbnRzKF9kNyk7Cit9Cit9ZWxzZXsKK2lmKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cyl7Cit2YXIgX2Q3PV9kNC5wYXJzZUVsZW1lbnQoZG9qby5ib2R5KCksbnVsbCx0cnVlKTsKK2Rvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoX2Q3KTsKK30KK30KK30KK30KK307Citkb2pvLmFkZE9uTG9hZChmdW5jdGlvbigpeworaWYoIWRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9qby5ob3N0ZW52Lm1ha2VXaWRnZXRzKCk7Cit9Cit9KTsKK3RyeXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQoInYiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpOworZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCgpLmFkZFJ1bGUoInZcXDoqIiwiYmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCkiKTsKK30KK30KK2NhdGNoKGUpeworfQorZG9qby5ob3N0ZW52LndyaXRlSW5jbHVkZXM9ZnVuY3Rpb24oKXsKK307CitpZighZGpfdW5kZWYoImRvY3VtZW50Iix0aGlzKSl7Citkal9jdXJyZW50RG9jdW1lbnQ9dGhpcy5kb2N1bWVudDsKK30KK2Rvam8uZG9jPWZ1bmN0aW9uKCl7CityZXR1cm4gZGpfY3VycmVudERvY3VtZW50OworfTsKK2Rvam8uYm9keT1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uZG9jKCkuYm9keXx8ZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOworfTsKK2Rvam8uYnlJZD1mdW5jdGlvbihpZCxkb2MpeworaWYoKGlkKSYmKCh0eXBlb2YgaWQ9PSJzdHJpbmciKXx8KGlkIGluc3RhbmNlb2YgU3RyaW5nKSkpeworaWYoIWRvYyl7Citkb2M9ZGpfY3VycmVudERvY3VtZW50OworfQordmFyIGVsZT1kb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOworaWYoZWxlJiYoZWxlLmlkIT1pZCkmJmRvYy5hbGwpeworZWxlPW51bGw7CitlbGVzPWRvYy5hbGxbaWRdOworaWYoZWxlcyl7CitpZihlbGVzLmxlbmd0aCl7Citmb3IodmFyIGk9MDtpPGVsZXMubGVuZ3RoO2krKyl7CitpZihlbGVzW2ldLmlkPT1pZCl7CitlbGU9ZWxlc1tpXTsKK2JyZWFrOworfQorfQorfWVsc2V7CitlbGU9ZWxlczsKK30KK30KK30KK3JldHVybiBlbGU7Cit9CityZXR1cm4gaWQ7Cit9OworZG9qby5zZXRDb250ZXh0PWZ1bmN0aW9uKF9kYyxfZGQpeworZGpfY3VycmVudENvbnRleHQ9X2RjOworZGpfY3VycmVudERvY3VtZW50PV9kZDsKK307Citkb2pvLl9maXJlQ2FsbGJhY2s9ZnVuY3Rpb24oX2RlLF9kZixfZTApeworaWYoKF9kZikmJigodHlwZW9mIF9kZT09InN0cmluZyIpfHwoX2RlIGluc3RhbmNlb2YgU3RyaW5nKSkpeworX2RlPV9kZltfZGVdOworfQorcmV0dXJuIChfZGY/X2RlLmFwcGx5KF9kZixfZTB8fFtdKTpfZGUoKSk7Cit9OworZG9qby53aXRoR2xvYmFsPWZ1bmN0aW9uKF9lMSxfZTIsX2UzLF9lNCl7Cit2YXIgX2U1OwordmFyIF9lNj1kal9jdXJyZW50Q29udGV4dDsKK3ZhciBfZTc9ZGpfY3VycmVudERvY3VtZW50OwordHJ5eworZG9qby5zZXRDb250ZXh0KF9lMSxfZTEuZG9jdW1lbnQpOworX2U1PWRvam8uX2ZpcmVDYWxsYmFjayhfZTIsX2UzLF9lNCk7Cit9CitmaW5hbGx5eworZG9qby5zZXRDb250ZXh0KF9lNixfZTcpOworfQorcmV0dXJuIF9lNTsKK307Citkb2pvLndpdGhEb2M9ZnVuY3Rpb24oX2U4LF9lOSxfZWEsX2ViKXsKK3ZhciBfZWM7Cit2YXIgX2VkPWRqX2N1cnJlbnREb2N1bWVudDsKK3RyeXsKK2RqX2N1cnJlbnREb2N1bWVudD1fZTg7CitfZWM9ZG9qby5fZmlyZUNhbGxiYWNrKF9lOSxfZWEsX2ViKTsKK30KK2ZpbmFsbHl7Citkal9jdXJyZW50RG9jdW1lbnQ9X2VkOworfQorcmV0dXJuIF9lYzsKK307Cit9Citkb2pvLnJlcXVpcmVJZigoZGpDb25maWdbImlzRGVidWciXXx8ZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdKSwiZG9qby5kZWJ1ZyIpOworZG9qby5yZXF1aXJlSWYoZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdJiYhd2luZG93LndpZGdldCYmIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0sImRvam8uYnJvd3Nlcl9kZWJ1ZyIpOworZG9qby5yZXF1aXJlSWYoZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdJiYhd2luZG93LndpZGdldCYmZGpDb25maWdbInVzZVhEb21haW4iXSwiZG9qby5icm93c2VyX2RlYnVnX3hkIik7Citkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nLmNvbW1vbiIpOworZG9qby5zdHJpbmcudHJpbT1mdW5jdGlvbihzdHIsd2gpeworaWYoIXN0ci5yZXBsYWNlKXsKK3JldHVybiBzdHI7Cit9CitpZighc3RyLmxlbmd0aCl7CityZXR1cm4gc3RyOworfQordmFyIHJlPSh3aD4wKT8oL15ccysvKTood2g8MCk/KC9ccyskLyk6KC9eXHMrfFxzKyQvZyk7CityZXR1cm4gc3RyLnJlcGxhY2UocmUsIiIpOworfTsKK2Rvam8uc3RyaW5nLnRyaW1TdGFydD1mdW5jdGlvbihzdHIpeworcmV0dXJuIGRvam8uc3RyaW5nLnRyaW0oc3RyLDEpOworfTsKK2Rvam8uc3RyaW5nLnRyaW1FbmQ9ZnVuY3Rpb24oc3RyKXsKK3JldHVybiBkb2pvLnN0cmluZy50cmltKHN0ciwtMSk7Cit9OworZG9qby5zdHJpbmcucmVwZWF0PWZ1bmN0aW9uKHN0cixfZjQsX2Y1KXsKK3ZhciBvdXQ9IiI7Citmb3IodmFyIGk9MDtpPF9mNDtpKyspeworb3V0Kz1zdHI7CitpZihfZjUmJmk8X2Y0LTEpeworb3V0Kz1fZjU7Cit9Cit9CityZXR1cm4gb3V0OworfTsKK2Rvam8uc3RyaW5nLnBhZD1mdW5jdGlvbihzdHIsbGVuLGMsZGlyKXsKK3ZhciBvdXQ9U3RyaW5nKHN0cik7CitpZighYyl7CitjPSIwIjsKK30KK2lmKCFkaXIpeworZGlyPTE7Cit9Cit3aGlsZShvdXQubGVuZ3RoPGxlbil7CitpZihkaXI+MCl7CitvdXQ9YytvdXQ7Cit9ZWxzZXsKK291dCs9YzsKK30KK30KK3JldHVybiBvdXQ7Cit9OworZG9qby5zdHJpbmcucGFkTGVmdD1mdW5jdGlvbihzdHIsbGVuLGMpeworcmV0dXJuIGRvam8uc3RyaW5nLnBhZChzdHIsbGVuLGMsMSk7Cit9OworZG9qby5zdHJpbmcucGFkUmlnaHQ9ZnVuY3Rpb24oc3RyLGxlbixjKXsKK3JldHVybiBkb2pvLnN0cmluZy5wYWQoc3RyLGxlbixjLC0xKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nIik7Citkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ubGFuZy5pbmhlcml0cz1mdW5jdGlvbihfMTAzLF8xMDQpeworaWYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKF8xMDQpKXsKK2Rvam8ucmFpc2UoImRvam8uaW5oZXJpdHM6IHN1cGVyY2xhc3MgYXJndW1lbnQgWyIrXzEwNCsiXSBtdXN0IGJlIGEgZnVuY3Rpb24gKHN1YmNsYXNzOiBbIitfMTAzKyInXSIpOworfQorXzEwMy5wcm90b3R5cGU9bmV3IF8xMDQoKTsKK18xMDMucHJvdG90eXBlLmNvbnN0cnVjdG9yPV8xMDM7CitfMTAzLnN1cGVyY2xhc3M9XzEwNC5wcm90b3R5cGU7CitfMTAzWyJzdXBlciJdPV8xMDQucHJvdG90eXBlOworfTsKK2Rvam8ubGFuZy5fbWl4aW49ZnVuY3Rpb24ob2JqLF8xMDYpewordmFyIHRvYmo9e307Citmb3IodmFyIHggaW4gXzEwNil7CitpZigodHlwZW9mIHRvYmpbeF09PSJ1bmRlZmluZWQiKXx8KHRvYmpbeF0hPV8xMDZbeF0pKXsKK29ialt4XT1fMTA2W3hdOworfQorfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSYmKHR5cGVvZiAoXzEwNlsidG9TdHJpbmciXSk9PSJmdW5jdGlvbiIpJiYoXzEwNlsidG9TdHJpbmciXSE9b2JqWyJ0b1N0cmluZyJdKSYmKF8xMDZbInRvU3RyaW5nIl0hPXRvYmpbInRvU3RyaW5nIl0pKXsKK29iai50b1N0cmluZz1fMTA2LnRvU3RyaW5nOworfQorcmV0dXJuIG9iajsKK307Citkb2pvLmxhbmcubWl4aW49ZnVuY3Rpb24ob2JqLF8xMGEpeworZm9yKHZhciBpPTEsbD1hcmd1bWVudHMubGVuZ3RoO2k8bDtpKyspeworZG9qby5sYW5nLl9taXhpbihvYmosYXJndW1lbnRzW2ldKTsKK30KK3JldHVybiBvYmo7Cit9OworZG9qby5sYW5nLmV4dGVuZD1mdW5jdGlvbihfMTBkLF8xMGUpeworZm9yKHZhciBpPTEsbD1hcmd1bWVudHMubGVuZ3RoO2k8bDtpKyspeworZG9qby5sYW5nLl9taXhpbihfMTBkLnByb3RvdHlwZSxhcmd1bWVudHNbaV0pOworfQorcmV0dXJuIF8xMGQ7Cit9OworZG9qby5pbmhlcml0cz1kb2pvLmxhbmcuaW5oZXJpdHM7Citkb2pvLm1peGluPWRvam8ubGFuZy5taXhpbjsKK2Rvam8uZXh0ZW5kPWRvam8ubGFuZy5leHRlbmQ7Citkb2pvLmxhbmcuZmluZD1mdW5jdGlvbihfMTExLF8xMTIsXzExMyxfMTE0KXsKK2lmKCFkb2pvLmxhbmcuaXNBcnJheUxpa2UoXzExMSkmJmRvam8ubGFuZy5pc0FycmF5TGlrZShfMTEyKSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ubGFuZy5maW5kKHZhbHVlLCBhcnJheSkiLCJ1c2UgZG9qby5sYW5nLmZpbmQoYXJyYXksIHZhbHVlKSBpbnN0ZWFkIiwiMC41Iik7Cit2YXIgdGVtcD1fMTExOworXzExMT1fMTEyOworXzExMj10ZW1wOworfQordmFyIF8xMTY9ZG9qby5sYW5nLmlzU3RyaW5nKF8xMTEpOworaWYoXzExNil7CitfMTExPV8xMTEuc3BsaXQoIiIpOworfQoraWYoXzExNCl7Cit2YXIgc3RlcD0tMTsKK3ZhciBpPV8xMTEubGVuZ3RoLTE7Cit2YXIgZW5kPS0xOworfWVsc2V7Cit2YXIgc3RlcD0xOwordmFyIGk9MDsKK3ZhciBlbmQ9XzExMS5sZW5ndGg7Cit9CitpZihfMTEzKXsKK3doaWxlKGkhPWVuZCl7CitpZihfMTExW2ldPT09XzExMil7CityZXR1cm4gaTsKK30KK2krPXN0ZXA7Cit9Cit9ZWxzZXsKK3doaWxlKGkhPWVuZCl7CitpZihfMTExW2ldPT1fMTEyKXsKK3JldHVybiBpOworfQoraSs9c3RlcDsKK30KK30KK3JldHVybiAtMTsKK307Citkb2pvLmxhbmcuaW5kZXhPZj1kb2pvLmxhbmcuZmluZDsKK2Rvam8ubGFuZy5maW5kTGFzdD1mdW5jdGlvbihfMTFhLF8xMWIsXzExYyl7CityZXR1cm4gZG9qby5sYW5nLmZpbmQoXzExYSxfMTFiLF8xMWMsdHJ1ZSk7Cit9OworZG9qby5sYW5nLmxhc3RJbmRleE9mPWRvam8ubGFuZy5maW5kTGFzdDsKK2Rvam8ubGFuZy5pbkFycmF5PWZ1bmN0aW9uKF8xMWQsXzExZSl7CityZXR1cm4gZG9qby5sYW5nLmZpbmQoXzExZCxfMTFlKT4tMTsKK307Citkb2pvLmxhbmcuaXNPYmplY3Q9ZnVuY3Rpb24oaXQpeworaWYodHlwZW9mIGl0PT0idW5kZWZpbmVkIil7CityZXR1cm4gZmFsc2U7Cit9CityZXR1cm4gKHR5cGVvZiBpdD09Im9iamVjdCJ8fGl0PT09bnVsbHx8ZG9qby5sYW5nLmlzQXJyYXkoaXQpfHxkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkpOworfTsKK2Rvam8ubGFuZy5pc0FycmF5PWZ1bmN0aW9uKGl0KXsKK3JldHVybiAoaXQmJml0IGluc3RhbmNlb2YgQXJyYXl8fHR5cGVvZiBpdD09ImFycmF5Iik7Cit9OworZG9qby5sYW5nLmlzQXJyYXlMaWtlPWZ1bmN0aW9uKGl0KXsKK2lmKCghaXQpfHwoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGl0KSkpeworcmV0dXJuIGZhbHNlOworfQoraWYoZG9qby5sYW5nLmlzU3RyaW5nKGl0KSl7CityZXR1cm4gZmFsc2U7Cit9CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkpeworcmV0dXJuIGZhbHNlOworfQoraWYoZG9qby5sYW5nLmlzQXJyYXkoaXQpKXsKK3JldHVybiB0cnVlOworfQoraWYoKGl0LnRhZ05hbWUpJiYoaXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iZm9ybSIpKXsKK3JldHVybiBmYWxzZTsKK30KK2lmKGRvam8ubGFuZy5pc051bWJlcihpdC5sZW5ndGgpJiZpc0Zpbml0ZShpdC5sZW5ndGgpKXsKK3JldHVybiB0cnVlOworfQorcmV0dXJuIGZhbHNlOworfTsKK2Rvam8ubGFuZy5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGl0KXsKK3JldHVybiAoaXQgaW5zdGFuY2VvZiBGdW5jdGlvbnx8dHlwZW9mIGl0PT0iZnVuY3Rpb24iKTsKK307CisoZnVuY3Rpb24oKXsKK2lmKChkb2pvLnJlbmRlci5odG1sLmNhcGFibGUpJiYoZG9qby5yZW5kZXIuaHRtbFsic2FmYXJpIl0pKXsKK2Rvam8ubGFuZy5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGl0KXsKK2lmKCh0eXBlb2YgKGl0KT09ImZ1bmN0aW9uIikmJihpdD09IltvYmplY3QgTm9kZUxpc3RdIikpeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuIChpdCBpbnN0YW5jZW9mIEZ1bmN0aW9ufHx0eXBlb2YgaXQ9PSJmdW5jdGlvbiIpOworfTsKK30KK30pKCk7Citkb2pvLmxhbmcuaXNTdHJpbmc9ZnVuY3Rpb24oaXQpeworcmV0dXJuICh0eXBlb2YgaXQ9PSJzdHJpbmcifHxpdCBpbnN0YW5jZW9mIFN0cmluZyk7Cit9OworZG9qby5sYW5nLmlzQWxpZW49ZnVuY3Rpb24oaXQpeworaWYoIWl0KXsKK3JldHVybiBmYWxzZTsKK30KK3JldHVybiAhZG9qby5sYW5nLmlzRnVuY3Rpb24oaXQpJiYvXHtccypcW25hdGl2ZSBjb2RlXF1ccypcfS8udGVzdChTdHJpbmcoaXQpKTsKK307Citkb2pvLmxhbmcuaXNCb29sZWFuPWZ1bmN0aW9uKGl0KXsKK3JldHVybiAoaXQgaW5zdGFuY2VvZiBCb29sZWFufHx0eXBlb2YgaXQ9PSJib29sZWFuIik7Cit9OworZG9qby5sYW5nLmlzTnVtYmVyPWZ1bmN0aW9uKGl0KXsKK3JldHVybiAoaXQgaW5zdGFuY2VvZiBOdW1iZXJ8fHR5cGVvZiBpdD09Im51bWJlciIpOworfTsKK2Rvam8ubGFuZy5pc1VuZGVmaW5lZD1mdW5jdGlvbihpdCl7CityZXR1cm4gKCh0eXBlb2YgKGl0KT09InVuZGVmaW5lZCIpJiYoaXQ9PXVuZGVmaW5lZCkpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5sYW5nLnNldFRpbWVvdXQ9ZnVuY3Rpb24oZnVuYyxfMTJhKXsKK3ZhciBfMTJiPXdpbmRvdyxfMTJjPTI7CitpZighZG9qby5sYW5nLmlzRnVuY3Rpb24oZnVuYykpeworXzEyYj1mdW5jOworZnVuYz1fMTJhOworXzEyYT1hcmd1bWVudHNbMl07CitfMTJjKys7Cit9CitpZihkb2pvLmxhbmcuaXNTdHJpbmcoZnVuYykpeworZnVuYz1fMTJiW2Z1bmNdOworfQordmFyIGFyZ3M9W107Citmb3IodmFyIGk9XzEyYztpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2FyZ3MucHVzaChhcmd1bWVudHNbaV0pOworfQorcmV0dXJuIGRvam8uZ2xvYmFsKCkuc2V0VGltZW91dChmdW5jdGlvbigpeworZnVuYy5hcHBseShfMTJiLGFyZ3MpOworfSxfMTJhKTsKK307Citkb2pvLmxhbmcuY2xlYXJUaW1lb3V0PWZ1bmN0aW9uKF8xMmYpeworZG9qby5nbG9iYWwoKS5jbGVhclRpbWVvdXQoXzEyZik7Cit9OworZG9qby5sYW5nLmdldE5hbWVJbk9iaj1mdW5jdGlvbihucyxpdGVtKXsKK2lmKCFucyl7Citucz1kal9nbG9iYWw7Cit9Citmb3IodmFyIHggaW4gbnMpeworaWYobnNbeF09PT1pdGVtKXsKK3JldHVybiBuZXcgU3RyaW5nKHgpOworfQorfQorcmV0dXJuIG51bGw7Cit9OworZG9qby5sYW5nLnNoYWxsb3dDb3B5PWZ1bmN0aW9uKG9iaixkZWVwKXsKK3ZhciBpLHJldDsKK2lmKG9iaj09PW51bGwpeworcmV0dXJuIG51bGw7Cit9CitpZihkb2pvLmxhbmcuaXNPYmplY3Qob2JqKSl7CityZXQ9bmV3IG9iai5jb25zdHJ1Y3RvcigpOworZm9yKGkgaW4gb2JqKXsKK2lmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXRbaV0pKXsKK3JldFtpXT1kZWVwP2Rvam8ubGFuZy5zaGFsbG93Q29weShvYmpbaV0sZGVlcCk6b2JqW2ldOworfQorfQorfWVsc2V7CitpZihkb2pvLmxhbmcuaXNBcnJheShvYmopKXsKK3JldD1bXTsKK2ZvcihpPTA7aTxvYmoubGVuZ3RoO2krKyl7CityZXRbaV09ZGVlcD9kb2pvLmxhbmcuc2hhbGxvd0NvcHkob2JqW2ldLGRlZXApOm9ialtpXTsKK30KK31lbHNleworcmV0PW9iajsKK30KK30KK3JldHVybiByZXQ7Cit9OworZG9qby5sYW5nLmZpcnN0VmFsdWVkPWZ1bmN0aW9uKCl7Citmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2lmKHR5cGVvZiBhcmd1bWVudHNbaV0hPSJ1bmRlZmluZWQiKXsKK3JldHVybiBhcmd1bWVudHNbaV07Cit9Cit9CityZXR1cm4gdW5kZWZpbmVkOworfTsKK2Rvam8ubGFuZy5nZXRPYmpQYXRoVmFsdWU9ZnVuY3Rpb24oXzEzOCxfMTM5LF8xM2Epeword2l0aChkb2pvLnBhcnNlT2JqUGF0aChfMTM4LF8xMzksXzEzYSkpeworcmV0dXJuIGRvam8uZXZhbFByb3AocHJvcCxvYmosXzEzYSk7Cit9Cit9OworZG9qby5sYW5nLnNldE9ialBhdGhWYWx1ZT1mdW5jdGlvbihfMTNiLF8xM2MsXzEzZCxfMTNlKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLnNldE9ialBhdGhWYWx1ZSIsInVzZSBkb2pvLnBhcnNlT2JqUGF0aCBhbmQgdGhlICc9JyBvcGVyYXRvciIsIjAuNiIpOworaWYoYXJndW1lbnRzLmxlbmd0aDw0KXsKK18xM2U9dHJ1ZTsKK30KK3dpdGgoZG9qby5wYXJzZU9ialBhdGgoXzEzYixfMTNkLF8xM2UpKXsKK2lmKG9iaiYmKF8xM2V8fChwcm9wIGluIG9iaikpKXsKK29ialtwcm9wXT1fMTNjOworfQorfQorfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5pby5jb21tb24iKTsKK2Rvam8uaW8udHJhbnNwb3J0cz1bXTsKK2Rvam8uaW8uaGRsckZ1bmNOYW1lcz1bImxvYWQiLCJlcnJvciIsInRpbWVvdXQiXTsKK2Rvam8uaW8uUmVxdWVzdD1mdW5jdGlvbih1cmwsXzE0MCxfMTQxLF8xNDIpeworaWYoKGFyZ3VtZW50cy5sZW5ndGg9PTEpJiYoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yPT1PYmplY3QpKXsKK3RoaXMuZnJvbUt3QXJncyhhcmd1bWVudHNbMF0pOworfWVsc2V7Cit0aGlzLnVybD11cmw7CitpZihfMTQwKXsKK3RoaXMubWltZXR5cGU9XzE0MDsKK30KK2lmKF8xNDEpewordGhpcy50cmFuc3BvcnQ9XzE0MTsKK30KK2lmKGFyZ3VtZW50cy5sZW5ndGg+PTQpewordGhpcy5jaGFuZ2VVcmw9XzE0MjsKK30KK30KK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uaW8uUmVxdWVzdCx7dXJsOiIiLG1pbWV0eXBlOiJ0ZXh0L3BsYWluIixtZXRob2Q6IkdFVCIsY29udGVudDp1bmRlZmluZWQsdHJhbnNwb3J0OnVuZGVmaW5lZCxjaGFuZ2VVcmw6dW5kZWZpbmVkLGZvcm1Ob2RlOnVuZGVmaW5lZCxzeW5jOmZhbHNlLGJpbmRTdWNjZXNzOmZhbHNlLHVzZUNhY2hlOmZhbHNlLHByZXZlbnRDYWNoZTpmYWxzZSxqc29uRmlsdGVyOmZ1bmN0aW9uKF8xNDMpeworaWYoKHRoaXMubWltZXR5cGU9PSJ0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCIpfHwodGhpcy5taW1ldHlwZT09ImFwcGxpY2F0aW9uL2pzb24tY29tbWVudC1maWx0ZXJlZCIpKXsKK3ZhciBfMTQ0PV8xNDMuaW5kZXhPZigiLyoiKTsKK3ZhciBfMTQ1PV8xNDMubGFzdEluZGV4T2YoIiovIik7CitpZigoXzE0ND09LTEpfHwoXzE0NT09LTEpKXsKK2Rvam8uZGVidWcoInlvdXIgSlNPTiB3YXNuJ3QgY29tbWVudCBmaWx0ZXJlZCEiKTsKK3JldHVybiAiIjsKK30KK3JldHVybiBfMTQzLnN1YnN0cmluZyhfMTQ0KzIsXzE0NSk7Cit9Citkb2pvLmRlYnVnKCJwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBtaW1ldHlwZSBvZiB0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCB0byBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzIHdpdGggSlNPTiBlbmRwb2ludHMiKTsKK3JldHVybiBfMTQzOworfSxsb2FkOmZ1bmN0aW9uKHR5cGUsZGF0YSxfMTQ4LF8xNDkpeworfSxlcnJvcjpmdW5jdGlvbih0eXBlLF8xNGIsXzE0YyxfMTRkKXsKK30sdGltZW91dDpmdW5jdGlvbih0eXBlLF8xNGYsXzE1MCxfMTUxKXsKK30saGFuZGxlOmZ1bmN0aW9uKHR5cGUsZGF0YSxfMTU0LF8xNTUpeworfSx0aW1lb3V0U2Vjb25kczowLGFib3J0OmZ1bmN0aW9uKCl7Cit9LGZyb21Ld0FyZ3M6ZnVuY3Rpb24oXzE1Nil7CitpZihfMTU2WyJ1cmwiXSl7CitfMTU2LnVybD1fMTU2LnVybC50b1N0cmluZygpOworfQoraWYoXzE1NlsiZm9ybU5vZGUiXSl7CitfMTU2LmZvcm1Ob2RlPWRvam8uYnlJZChfMTU2LmZvcm1Ob2RlKTsKK30KK2lmKCFfMTU2WyJtZXRob2QiXSYmXzE1NlsiZm9ybU5vZGUiXSYmXzE1NlsiZm9ybU5vZGUiXS5tZXRob2QpeworXzE1Ni5tZXRob2Q9XzE1NlsiZm9ybU5vZGUiXS5tZXRob2Q7Cit9CitpZighXzE1NlsiaGFuZGxlIl0mJl8xNTZbImhhbmRsZXIiXSl7CitfMTU2LmhhbmRsZT1fMTU2LmhhbmRsZXI7Cit9CitpZighXzE1NlsibG9hZCJdJiZfMTU2WyJsb2FkZWQiXSl7CitfMTU2LmxvYWQ9XzE1Ni5sb2FkZWQ7Cit9CitpZighXzE1NlsiY2hhbmdlVXJsIl0mJl8xNTZbImNoYW5nZVVSTCJdKXsKK18xNTYuY2hhbmdlVXJsPV8xNTYuY2hhbmdlVVJMOworfQorXzE1Ni5lbmNvZGluZz1kb2pvLmxhbmcuZmlyc3RWYWx1ZWQoXzE1NlsiZW5jb2RpbmciXSxkakNvbmZpZ1siYmluZEVuY29kaW5nIl0sIiIpOworXzE1Ni5zZW5kVHJhbnNwb3J0PWRvam8ubGFuZy5maXJzdFZhbHVlZChfMTU2WyJzZW5kVHJhbnNwb3J0Il0sZGpDb25maWdbImlvU2VuZFRyYW5zcG9ydCJdLGZhbHNlKTsKK3ZhciBfMTU3PWRvam8ubGFuZy5pc0Z1bmN0aW9uOworZm9yKHZhciB4PTA7eDxkb2pvLmlvLmhkbHJGdW5jTmFtZXMubGVuZ3RoO3grKyl7Cit2YXIgZm49ZG9qby5pby5oZGxyRnVuY05hbWVzW3hdOworaWYoXzE1Nltmbl0mJl8xNTcoXzE1Nltmbl0pKXsKK2NvbnRpbnVlOworfQoraWYoXzE1NlsiaGFuZGxlIl0mJl8xNTcoXzE1NlsiaGFuZGxlIl0pKXsKK18xNTZbZm5dPV8xNTYuaGFuZGxlOworfQorfQorZG9qby5sYW5nLm1peGluKHRoaXMsXzE1Nik7Cit9fSk7Citkb2pvLmlvLkVycm9yPWZ1bmN0aW9uKG1zZyx0eXBlLG51bSl7Cit0aGlzLm1lc3NhZ2U9bXNnOwordGhpcy50eXBlPXR5cGV8fCJ1bmtub3duIjsKK3RoaXMubnVtYmVyPW51bXx8MDsKK307Citkb2pvLmlvLnRyYW5zcG9ydHMuYWRkVHJhbnNwb3J0PWZ1bmN0aW9uKG5hbWUpewordGhpcy5wdXNoKG5hbWUpOwordGhpc1tuYW1lXT1kb2pvLmlvW25hbWVdOworfTsKK2Rvam8uaW8uYmluZD1mdW5jdGlvbihfMTVlKXsKK2lmKCEoXzE1ZSBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpewordHJ5eworXzE1ZT1uZXcgZG9qby5pby5SZXF1ZXN0KF8xNWUpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfQordmFyIF8xNWY9IiI7CitpZihfMTVlWyJ0cmFuc3BvcnQiXSl7CitfMTVmPV8xNWVbInRyYW5zcG9ydCJdOworaWYoIXRoaXNbXzE1Zl0peworZG9qby5pby5zZW5kQmluZEVycm9yKF8xNWUsIk5vIGRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIrXzE1ZVsidHJhbnNwb3J0Il0rIicuIik7CityZXR1cm4gXzE1ZTsKK30KK2lmKCF0aGlzW18xNWZdLmNhbkhhbmRsZShfMTVlKSl7Citkb2pvLmlvLnNlbmRCaW5kRXJyb3IoXzE1ZSwiZG9qby5pby5iaW5kKCkgdHJhbnNwb3J0IHdpdGggbmFtZSAnIitfMTVlWyJ0cmFuc3BvcnQiXSsiJyBjYW5ub3QgaGFuZGxlIHRoaXMgdHlwZSBvZiByZXF1ZXN0LiIpOworcmV0dXJuIF8xNWU7Cit9Cit9ZWxzZXsKK2Zvcih2YXIgeD0wO3g8ZG9qby5pby50cmFuc3BvcnRzLmxlbmd0aDt4KyspewordmFyIHRtcD1kb2pvLmlvLnRyYW5zcG9ydHNbeF07CitpZigodGhpc1t0bXBdKSYmKHRoaXNbdG1wXS5jYW5IYW5kbGUoXzE1ZSkpKXsKK18xNWY9dG1wOworYnJlYWs7Cit9Cit9CitpZihfMTVmPT0iIil7Citkb2pvLmlvLnNlbmRCaW5kRXJyb3IoXzE1ZSwiTm9uZSBvZiB0aGUgbG9hZGVkIHRyYW5zcG9ydHMgZm9yIGRvam8uaW8uYmluZCgpIisiIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuIik7CityZXR1cm4gXzE1ZTsKK30KK30KK3RoaXNbXzE1Zl0uYmluZChfMTVlKTsKK18xNWUuYmluZFN1Y2Nlc3M9dHJ1ZTsKK3JldHVybiBfMTVlOworfTsKK2Rvam8uaW8uc2VuZEJpbmRFcnJvcj1mdW5jdGlvbihfMTYyLF8xNjMpeworaWYoKHR5cGVvZiBfMTYyLmVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2YgXzE2Mi5oYW5kbGU9PSJmdW5jdGlvbiIpJiYodHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiJ8fHR5cGVvZiBzZXRUaW1lb3V0PT0ib2JqZWN0IikpewordmFyIF8xNjQ9bmV3IGRvam8uaW8uRXJyb3IoXzE2Myk7CitzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CitfMTYyWyh0eXBlb2YgXzE2Mi5lcnJvcj09ImZ1bmN0aW9uIik/ImVycm9yIjoiaGFuZGxlIl0oImVycm9yIixfMTY0LG51bGwsXzE2Mik7Cit9LDUwKTsKK31lbHNleworZG9qby5yYWlzZShfMTYzKTsKK30KK307Citkb2pvLmlvLnF1ZXVlQmluZD1mdW5jdGlvbihfMTY1KXsKK2lmKCEoXzE2NSBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpewordHJ5eworXzE2NT1uZXcgZG9qby5pby5SZXF1ZXN0KF8xNjUpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfQordmFyIF8xNjY9XzE2NS5sb2FkOworXzE2NS5sb2FkPWZ1bmN0aW9uKCl7Citkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodD1mYWxzZTsKK3ZhciByZXQ9XzE2Ni5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Citkb2pvLmlvLl9kaXNwYXRjaE5leHRRdWV1ZUJpbmQoKTsKK3JldHVybiByZXQ7Cit9OwordmFyIF8xNjg9XzE2NS5lcnJvcjsKK18xNjUuZXJyb3I9ZnVuY3Rpb24oKXsKK2Rvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0PWZhbHNlOwordmFyIHJldD1fMTY4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2Rvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZCgpOworcmV0dXJuIHJldDsKK307Citkb2pvLmlvLl9iaW5kUXVldWUucHVzaChfMTY1KTsKK2Rvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZCgpOworcmV0dXJuIF8xNjU7Cit9OworZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kPWZ1bmN0aW9uKCl7CitpZighZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQpeworZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQ9dHJ1ZTsKK2lmKGRvam8uaW8uX2JpbmRRdWV1ZS5sZW5ndGg+MCl7Citkb2pvLmlvLmJpbmQoZG9qby5pby5fYmluZFF1ZXVlLnNoaWZ0KCkpOworfWVsc2V7Citkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodD1mYWxzZTsKK30KK30KK307Citkb2pvLmlvLl9iaW5kUXVldWU9W107Citkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodD1mYWxzZTsKK2Rvam8uaW8uYXJnc0Zyb21NYXA9ZnVuY3Rpb24obWFwLF8xNmIsbGFzdCl7Cit2YXIgZW5jPS91dGYvaS50ZXN0KF8xNmJ8fCIiKT9lbmNvZGVVUklDb21wb25lbnQ6ZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk7Cit2YXIgXzE2ZT1bXTsKK3ZhciBfMTZmPW5ldyBPYmplY3QoKTsKK2Zvcih2YXIgbmFtZSBpbiBtYXApewordmFyIF8xNzE9ZnVuY3Rpb24oZWx0KXsKK3ZhciB2YWw9ZW5jKG5hbWUpKyI9IitlbmMoZWx0KTsKK18xNmVbKGxhc3Q9PW5hbWUpPyJwdXNoIjoidW5zaGlmdCJdKHZhbCk7Cit9OworaWYoIV8xNmZbbmFtZV0pewordmFyIF8xNzQ9bWFwW25hbWVdOworaWYoZG9qby5sYW5nLmlzQXJyYXkoXzE3NCkpeworZG9qby5sYW5nLmZvckVhY2goXzE3NCxfMTcxKTsKK31lbHNleworXzE3MShfMTc0KTsKK30KK30KK30KK3JldHVybiBfMTZlLmpvaW4oIiYiKTsKK307Citkb2pvLmlvLnNldElGcmFtZVNyYz1mdW5jdGlvbihfMTc1LHNyYyxfMTc3KXsKK3RyeXsKK3ZhciByPWRvam8ucmVuZGVyLmh0bWw7CitpZighXzE3Nyl7CitpZihyLnNhZmFyaSl7CitfMTc1LmxvY2F0aW9uPXNyYzsKK31lbHNleworZnJhbWVzW18xNzUubmFtZV0ubG9jYXRpb249c3JjOworfQorfWVsc2V7Cit2YXIgaWRvYzsKK2lmKHIuaWUpeworaWRvYz1fMTc1LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Cit9ZWxzZXsKK2lmKHIuc2FmYXJpKXsKK2lkb2M9XzE3NS5kb2N1bWVudDsKK31lbHNleworaWRvYz1fMTc1LmNvbnRlbnRXaW5kb3c7Cit9Cit9CitpZighaWRvYyl7CitfMTc1LmxvY2F0aW9uPXNyYzsKK3JldHVybjsKK31lbHNleworaWRvYy5sb2NhdGlvbi5yZXBsYWNlKHNyYyk7Cit9Cit9Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoZSk7Citkb2pvLmRlYnVnKCJzZXRJRnJhbWVTcmM6ICIrZSk7Cit9Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmxhbmcse2hhczpmdW5jdGlvbihvYmosbmFtZSl7Cit0cnl7CityZXR1cm4gdHlwZW9mIG9ialtuYW1lXSE9InVuZGVmaW5lZCI7Cit9CitjYXRjaChlKXsKK3JldHVybiBmYWxzZTsKK30KK30saXNFbXB0eTpmdW5jdGlvbihvYmopeworaWYoZG9qby5sYW5nLmlzT2JqZWN0KG9iaikpewordmFyIHRtcD17fTsKK3ZhciBfMTdlPTA7Citmb3IodmFyIHggaW4gb2JqKXsKK2lmKG9ialt4XSYmKCF0bXBbeF0pKXsKK18xN2UrKzsKK2JyZWFrOworfQorfQorcmV0dXJuIF8xN2U9PTA7Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pc0FycmF5TGlrZShvYmopfHxkb2pvLmxhbmcuaXNTdHJpbmcob2JqKSl7CityZXR1cm4gb2JqLmxlbmd0aD09MDsKK30KK30KK30sbWFwOmZ1bmN0aW9uKGFycixvYmosXzE4Mil7Cit2YXIgXzE4Mz1kb2pvLmxhbmcuaXNTdHJpbmcoYXJyKTsKK2lmKF8xODMpeworYXJyPWFyci5zcGxpdCgiIik7Cit9CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopJiYoIV8xODIpKXsKK18xODI9b2JqOworb2JqPWRqX2dsb2JhbDsKK31lbHNleworaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSYmXzE4Mil7Cit2YXIgXzE4ND1vYmo7CitvYmo9XzE4MjsKK18xODI9XzE4NDsKK30KK30KK2lmKEFycmF5Lm1hcCl7Cit2YXIgXzE4NT1BcnJheS5tYXAoYXJyLF8xODIsb2JqKTsKK31lbHNlewordmFyIF8xODU9W107Citmb3IodmFyIGk9MDtpPGFyci5sZW5ndGg7KytpKXsKK18xODUucHVzaChfMTgyLmNhbGwob2JqLGFycltpXSkpOworfQorfQoraWYoXzE4Myl7CityZXR1cm4gXzE4NS5qb2luKCIiKTsKK31lbHNleworcmV0dXJuIF8xODU7Cit9Cit9LHJlZHVjZTpmdW5jdGlvbihhcnIsXzE4OCxvYmosXzE4YSl7Cit2YXIgXzE4Yj1fMTg4OworaWYoYXJndW1lbnRzLmxlbmd0aD09Mil7CitfMThhPV8xODg7CitfMThiPWFyclswXTsKK2Fycj1hcnIuc2xpY2UoMSk7Cit9ZWxzZXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTMpeworaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSl7CitfMThhPW9iajsKK29iaj1udWxsOworfQorfWVsc2V7CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopKXsKK3ZhciB0bXA9XzE4YTsKK18xOGE9b2JqOworb2JqPXRtcDsKK30KK30KK30KK3ZhciBvYj1vYmp8fGRqX2dsb2JhbDsKK2Rvam8ubGFuZy5tYXAoYXJyLGZ1bmN0aW9uKHZhbCl7CitfMThiPV8xOGEuY2FsbChvYixfMThiLHZhbCk7Cit9KTsKK3JldHVybiBfMThiOworfSxmb3JFYWNoOmZ1bmN0aW9uKF8xOGYsXzE5MCxfMTkxKXsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhfMThmKSl7CitfMThmPV8xOGYuc3BsaXQoIiIpOworfQoraWYoQXJyYXkuZm9yRWFjaCl7CitBcnJheS5mb3JFYWNoKF8xOGYsXzE5MCxfMTkxKTsKK31lbHNleworaWYoIV8xOTEpeworXzE5MT1kal9nbG9iYWw7Cit9Citmb3IodmFyIGk9MCxsPV8xOGYubGVuZ3RoO2k8bDtpKyspeworXzE5MC5jYWxsKF8xOTEsXzE4ZltpXSxpLF8xOGYpOworfQorfQorfSxfZXZlcnlPclNvbWU6ZnVuY3Rpb24oXzE5NCxhcnIsXzE5NixfMTk3KXsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhhcnIpKXsKK2Fycj1hcnIuc3BsaXQoIiIpOworfQoraWYoQXJyYXkuZXZlcnkpeworcmV0dXJuIEFycmF5W18xOTQ/ImV2ZXJ5Ijoic29tZSJdKGFycixfMTk2LF8xOTcpOworfWVsc2V7CitpZighXzE5Nyl7CitfMTk3PWRqX2dsb2JhbDsKK30KK2Zvcih2YXIgaT0wLGw9YXJyLmxlbmd0aDtpPGw7aSsrKXsKK3ZhciBfMTlhPV8xOTYuY2FsbChfMTk3LGFycltpXSxpLGFycik7CitpZihfMTk0JiYhXzE5YSl7CityZXR1cm4gZmFsc2U7Cit9ZWxzZXsKK2lmKCghXzE5NCkmJihfMTlhKSl7CityZXR1cm4gdHJ1ZTsKK30KK30KK30KK3JldHVybiBCb29sZWFuKF8xOTQpOworfQorfSxldmVyeTpmdW5jdGlvbihhcnIsXzE5YyxfMTlkKXsKK3JldHVybiB0aGlzLl9ldmVyeU9yU29tZSh0cnVlLGFycixfMTljLF8xOWQpOworfSxzb21lOmZ1bmN0aW9uKGFycixfMTlmLF8xYTApeworcmV0dXJuIHRoaXMuX2V2ZXJ5T3JTb21lKGZhbHNlLGFycixfMTlmLF8xYTApOworfSxmaWx0ZXI6ZnVuY3Rpb24oYXJyLF8xYTIsXzFhMyl7Cit2YXIgXzFhND1kb2pvLmxhbmcuaXNTdHJpbmcoYXJyKTsKK2lmKF8xYTQpeworYXJyPWFyci5zcGxpdCgiIik7Cit9Cit2YXIgXzFhNTsKK2lmKEFycmF5LmZpbHRlcil7CitfMWE1PUFycmF5LmZpbHRlcihhcnIsXzFhMixfMWEzKTsKK31lbHNleworaWYoIV8xYTMpeworaWYoYXJndW1lbnRzLmxlbmd0aD49Myl7Citkb2pvLnJhaXNlKCJ0aGlzT2JqZWN0IGRvZXNuJ3QgZXhpc3QhIik7Cit9CitfMWEzPWRqX2dsb2JhbDsKK30KK18xYTU9W107Citmb3IodmFyIGk9MDtpPGFyci5sZW5ndGg7aSsrKXsKK2lmKF8xYTIuY2FsbChfMWEzLGFycltpXSxpLGFycikpeworXzFhNS5wdXNoKGFycltpXSk7Cit9Cit9Cit9CitpZihfMWE0KXsKK3JldHVybiBfMWE1LmpvaW4oIiIpOworfWVsc2V7CityZXR1cm4gXzFhNTsKK30KK30sdW5uZXN0OmZ1bmN0aW9uKCl7Cit2YXIgb3V0PVtdOworZm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZihkb2pvLmxhbmcuaXNBcnJheUxpa2UoYXJndW1lbnRzW2ldKSl7Cit2YXIgYWRkPWRvam8ubGFuZy51bm5lc3QuYXBwbHkodGhpcyxhcmd1bWVudHNbaV0pOworb3V0PW91dC5jb25jYXQoYWRkKTsKK31lbHNleworb3V0LnB1c2goYXJndW1lbnRzW2ldKTsKK30KK30KK3JldHVybiBvdXQ7Cit9LHRvQXJyYXk6ZnVuY3Rpb24oXzFhYSxfMWFiKXsKK3ZhciBfMWFjPVtdOworZm9yKHZhciBpPV8xYWJ8fDA7aTxfMWFhLmxlbmd0aDtpKyspeworXzFhYy5wdXNoKF8xYWFbaV0pOworfQorcmV0dXJuIF8xYWM7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLmxhbmcuaGl0Y2g9ZnVuY3Rpb24oXzFhZSxfMWFmKXsKK3ZhciBhcmdzPVtdOworZm9yKHZhciB4PTI7eDxhcmd1bWVudHMubGVuZ3RoO3grKyl7CithcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKK30KK3ZhciBmY249KGRvam8ubGFuZy5pc1N0cmluZyhfMWFmKT9fMWFlW18xYWZdOl8xYWYpfHxmdW5jdGlvbigpeworfTsKK3JldHVybiBmdW5jdGlvbigpewordmFyIHRhPWFyZ3MuY29uY2F0KFtdKTsKK2Zvcih2YXIgeD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspewordGEucHVzaChhcmd1bWVudHNbeF0pOworfQorcmV0dXJuIGZjbi5hcHBseShfMWFlLHRhKTsKK307Cit9OworZG9qby5sYW5nLmFub25DdHI9MDsKK2Rvam8ubGFuZy5hbm9uPXt9OworZG9qby5sYW5nLm5hbWVBbm9uRnVuYz1mdW5jdGlvbihfMWI1LF8xYjYsXzFiNyl7Cit2YXIgbnNvPShfMWI2fHxkb2pvLmxhbmcuYW5vbik7CitpZigoXzFiNyl8fCgoZGpfZ2xvYmFsWyJkakNvbmZpZyJdKSYmKGRqQ29uZmlnWyJzbG93QW5vbkZ1bmNMb29rdXBzIl09PXRydWUpKSl7Citmb3IodmFyIHggaW4gbnNvKXsKK3RyeXsKK2lmKG5zb1t4XT09PV8xYjUpeworcmV0dXJuIHg7Cit9Cit9CitjYXRjaChlKXsKK30KK30KK30KK3ZhciByZXQ9Il9fIitkb2pvLmxhbmcuYW5vbkN0cisrOword2hpbGUodHlwZW9mIG5zb1tyZXRdIT0idW5kZWZpbmVkIil7CityZXQ9Il9fIitkb2pvLmxhbmcuYW5vbkN0cisrOworfQorbnNvW3JldF09XzFiNTsKK3JldHVybiByZXQ7Cit9OworZG9qby5sYW5nLmZvcndhcmQ9ZnVuY3Rpb24oXzFiYil7CityZXR1cm4gZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzW18xYmJdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK307Cit9OworZG9qby5sYW5nLmN1cnJ5PWZ1bmN0aW9uKF8xYmMsZnVuYyl7Cit2YXIgXzFiZT1bXTsKK18xYmM9XzFiY3x8ZGpfZ2xvYmFsOworaWYoZG9qby5sYW5nLmlzU3RyaW5nKGZ1bmMpKXsKK2Z1bmM9XzFiY1tmdW5jXTsKK30KK2Zvcih2YXIgeD0yO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspeworXzFiZS5wdXNoKGFyZ3VtZW50c1t4XSk7Cit9Cit2YXIgXzFjMD0oZnVuY1siX19wcmVKb2luQXJpdHkiXXx8ZnVuYy5sZW5ndGgpLV8xYmUubGVuZ3RoOworZnVuY3Rpb24gZ2F0aGVyKF8xYzEsXzFjMixfMWMzKXsKK3ZhciBfMWM0PV8xYzM7Cit2YXIgXzFjNT1fMWMyLnNsaWNlKDApOworZm9yKHZhciB4PTA7eDxfMWMxLmxlbmd0aDt4KyspeworXzFjNS5wdXNoKF8xYzFbeF0pOworfQorXzFjMz1fMWMzLV8xYzEubGVuZ3RoOworaWYoXzFjMzw9MCl7Cit2YXIgcmVzPWZ1bmMuYXBwbHkoXzFiYyxfMWM1KTsKK18xYzM9XzFjNDsKK3JldHVybiByZXM7Cit9ZWxzZXsKK3JldHVybiBmdW5jdGlvbigpeworcmV0dXJuIGdhdGhlcihhcmd1bWVudHMsXzFjNSxfMWMzKTsKK307Cit9Cit9CityZXR1cm4gZ2F0aGVyKFtdLF8xYmUsXzFjMCk7Cit9OworZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzPWZ1bmN0aW9uKF8xYzgsZnVuYyxhcmdzLF8xY2IpewordmFyIF8xY2M9W107Cit2YXIgeD1fMWNifHwwOworZm9yKHg9XzFjYjt4PGFyZ3MubGVuZ3RoO3grKyl7CitfMWNjLnB1c2goYXJnc1t4XSk7Cit9CityZXR1cm4gZG9qby5sYW5nLmN1cnJ5LmFwcGx5KGRvam8ubGFuZyxbXzFjOCxmdW5jXS5jb25jYXQoXzFjYykpOworfTsKK2Rvam8ubGFuZy50cnlUaGVzZT1mdW5jdGlvbigpeworZm9yKHZhciB4PTA7eDxhcmd1bWVudHMubGVuZ3RoO3grKyl7Cit0cnl7CitpZih0eXBlb2YgYXJndW1lbnRzW3hdPT0iZnVuY3Rpb24iKXsKK3ZhciByZXQ9KGFyZ3VtZW50c1t4XSgpKTsKK2lmKHJldCl7CityZXR1cm4gcmV0OworfQorfQorfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfQorfTsKK2Rvam8ubGFuZy5kZWxheVRoZXNlPWZ1bmN0aW9uKGZhcnIsY2IsXzFkMixfMWQzKXsKK2lmKCFmYXJyLmxlbmd0aCl7CitpZih0eXBlb2YgXzFkMz09ImZ1bmN0aW9uIil7CitfMWQzKCk7Cit9CityZXR1cm47Cit9CitpZigodHlwZW9mIF8xZDI9PSJ1bmRlZmluZWQiKSYmKHR5cGVvZiBjYj09Im51bWJlciIpKXsKK18xZDI9Y2I7CitjYj1mdW5jdGlvbigpeworfTsKK31lbHNleworaWYoIWNiKXsKK2NiPWZ1bmN0aW9uKCl7Cit9OworaWYoIV8xZDIpeworXzFkMj0wOworfQorfQorfQorc2V0VGltZW91dChmdW5jdGlvbigpeworKGZhcnIuc2hpZnQoKSkoKTsKK2NiKCk7Citkb2pvLmxhbmcuZGVsYXlUaGVzZShmYXJyLGNiLF8xZDIsXzFkMyk7Cit9LF8xZDIpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5zdHJpbmcuZXh0cmFzIik7Citkb2pvLnN0cmluZy5zdWJzdGl0dXRlUGFyYW1zPWZ1bmN0aW9uKF8xZDQsaGFzaCl7Cit2YXIgbWFwPSh0eXBlb2YgaGFzaD09Im9iamVjdCIpP2hhc2g6ZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzLDEpOworcmV0dXJuIF8xZDQucmVwbGFjZSgvXCVceyhcdyspXH0vZyxmdW5jdGlvbihfMWQ3LGtleSl7CitpZih0eXBlb2YgKG1hcFtrZXldKSE9InVuZGVmaW5lZCImJm1hcFtrZXldIT1udWxsKXsKK3JldHVybiBtYXBba2V5XTsKK30KK2Rvam8ucmFpc2UoIlN1YnN0aXR1dGlvbiBub3QgZm91bmQ6ICIra2V5KTsKK30pOworfTsKK2Rvam8uc3RyaW5nLmNhcGl0YWxpemU9ZnVuY3Rpb24oc3RyKXsKK2lmKCFkb2pvLmxhbmcuaXNTdHJpbmcoc3RyKSl7CityZXR1cm4gIiI7Cit9CitpZihhcmd1bWVudHMubGVuZ3RoPT0wKXsKK3N0cj10aGlzOworfQordmFyIF8xZGE9c3RyLnNwbGl0KCIgIik7Citmb3IodmFyIGk9MDtpPF8xZGEubGVuZ3RoO2krKyl7CitfMWRhW2ldPV8xZGFbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrXzFkYVtpXS5zdWJzdHJpbmcoMSk7Cit9CityZXR1cm4gXzFkYS5qb2luKCIgIik7Cit9OworZG9qby5zdHJpbmcuaXNCbGFuaz1mdW5jdGlvbihzdHIpeworaWYoIWRvam8ubGFuZy5pc1N0cmluZyhzdHIpKXsKK3JldHVybiB0cnVlOworfQorcmV0dXJuIChkb2pvLnN0cmluZy50cmltKHN0cikubGVuZ3RoPT0wKTsKK307Citkb2pvLnN0cmluZy5lbmNvZGVBc2NpaT1mdW5jdGlvbihzdHIpeworaWYoIWRvam8ubGFuZy5pc1N0cmluZyhzdHIpKXsKK3JldHVybiBzdHI7Cit9Cit2YXIgcmV0PSIiOwordmFyIF8xZGY9ZXNjYXBlKHN0cik7Cit2YXIgXzFlMCxyZT0vJXUoWzAtOUEtRl17NH0pL2k7Cit3aGlsZSgoXzFlMD1fMWRmLm1hdGNoKHJlKSkpewordmFyIG51bT1OdW1iZXIoIjB4IitfMWUwWzFdKTsKK3ZhciBfMWUzPWVzY2FwZSgiJiMiK251bSsiOyIpOworcmV0Kz1fMWRmLnN1YnN0cmluZygwLF8xZTAuaW5kZXgpK18xZTM7CitfMWRmPV8xZGYuc3Vic3RyaW5nKF8xZTAuaW5kZXgrXzFlMFswXS5sZW5ndGgpOworfQorcmV0Kz1fMWRmLnJlcGxhY2UoL1wrL2csIiUyQiIpOworcmV0dXJuIHJldDsKK307Citkb2pvLnN0cmluZy5lc2NhcGU9ZnVuY3Rpb24odHlwZSxzdHIpewordmFyIGFyZ3M9ZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzLDEpOworc3dpdGNoKHR5cGUudG9Mb3dlckNhc2UoKSl7CitjYXNlICJ4bWwiOgorY2FzZSAiaHRtbCI6CitjYXNlICJ4aHRtbCI6CityZXR1cm4gZG9qby5zdHJpbmcuZXNjYXBlWG1sLmFwcGx5KHRoaXMsYXJncyk7CitjYXNlICJzcWwiOgorcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVNxbC5hcHBseSh0aGlzLGFyZ3MpOworY2FzZSAicmVnZXhwIjoKK2Nhc2UgInJlZ2V4IjoKK3JldHVybiBkb2pvLnN0cmluZy5lc2NhcGVSZWdFeHAuYXBwbHkodGhpcyxhcmdzKTsKK2Nhc2UgImphdmFzY3JpcHQiOgorY2FzZSAianNjcmlwdCI6CitjYXNlICJqcyI6CityZXR1cm4gZG9qby5zdHJpbmcuZXNjYXBlSmF2YVNjcmlwdC5hcHBseSh0aGlzLGFyZ3MpOworY2FzZSAiYXNjaWkiOgorcmV0dXJuIGRvam8uc3RyaW5nLmVuY29kZUFzY2lpLmFwcGx5KHRoaXMsYXJncyk7CitkZWZhdWx0OgorcmV0dXJuIHN0cjsKK30KK307Citkb2pvLnN0cmluZy5lc2NhcGVYbWw9ZnVuY3Rpb24oc3RyLF8xZTgpeworc3RyPXN0ci5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKS5yZXBsYWNlKC8+L2dtLCImZ3Q7IikucmVwbGFjZSgvIi9nbSwiJnF1b3Q7Iik7CitpZighXzFlOCl7CitzdHI9c3RyLnJlcGxhY2UoLycvZ20sIiYjMzk7Iik7Cit9CityZXR1cm4gc3RyOworfTsKK2Rvam8uc3RyaW5nLmVzY2FwZVNxbD1mdW5jdGlvbihzdHIpeworcmV0dXJuIHN0ci5yZXBsYWNlKC8nL2dtLCInJyIpOworfTsKK2Rvam8uc3RyaW5nLmVzY2FwZVJlZ0V4cD1mdW5jdGlvbihzdHIpeworcmV0dXJuIHN0ci5yZXBsYWNlKC9cXC9nbSwiXFxcXCIpLnJlcGxhY2UoLyhbXGZcYlxuXHRccltcXiR8PyorKCl7fV0pL2dtLCJcXCQxIik7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlSmF2YVNjcmlwdD1mdW5jdGlvbihzdHIpeworcmV0dXJuIHN0ci5yZXBsYWNlKC8oWyInXGZcYlxuXHRccl0pL2dtLCJcXCQxIik7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlU3RyaW5nPWZ1bmN0aW9uKHN0cil7CityZXR1cm4gKCJcIiIrc3RyLnJlcGxhY2UoLyhbIlxcXSkvZywiXFwkMSIpKyJcIiIpLnJlcGxhY2UoL1tcZl0vZywiXFxmIikucmVwbGFjZSgvW1xiXS9nLCJcXGIiKS5yZXBsYWNlKC9bXG5dL2csIlxcbiIpLnJlcGxhY2UoL1tcdF0vZywiXFx0IikucmVwbGFjZSgvW1xyXS9nLCJcXHIiKTsKK307Citkb2pvLnN0cmluZy5zdW1tYXJ5PWZ1bmN0aW9uKHN0cixsZW4peworaWYoIWxlbnx8c3RyLmxlbmd0aDw9bGVuKXsKK3JldHVybiBzdHI7Cit9CityZXR1cm4gc3RyLnN1YnN0cmluZygwLGxlbikucmVwbGFjZSgvXC4rJC8sIiIpKyIuLi4iOworfTsKK2Rvam8uc3RyaW5nLmVuZHNXaXRoPWZ1bmN0aW9uKHN0cixlbmQsXzFmMSl7CitpZihfMWYxKXsKK3N0cj1zdHIudG9Mb3dlckNhc2UoKTsKK2VuZD1lbmQudG9Mb3dlckNhc2UoKTsKK30KK2lmKChzdHIubGVuZ3RoLWVuZC5sZW5ndGgpPDApeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuIHN0ci5sYXN0SW5kZXhPZihlbmQpPT1zdHIubGVuZ3RoLWVuZC5sZW5ndGg7Cit9OworZG9qby5zdHJpbmcuZW5kc1dpdGhBbnk9ZnVuY3Rpb24oc3RyKXsKK2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworaWYoZG9qby5zdHJpbmcuZW5kc1dpdGgoc3RyLGFyZ3VtZW50c1tpXSkpeworcmV0dXJuIHRydWU7Cit9Cit9CityZXR1cm4gZmFsc2U7Cit9OworZG9qby5zdHJpbmcuc3RhcnRzV2l0aD1mdW5jdGlvbihzdHIsXzFmNSxfMWY2KXsKK2lmKF8xZjYpeworc3RyPXN0ci50b0xvd2VyQ2FzZSgpOworXzFmNT1fMWY1LnRvTG93ZXJDYXNlKCk7Cit9CityZXR1cm4gc3RyLmluZGV4T2YoXzFmNSk9PTA7Cit9OworZG9qby5zdHJpbmcuc3RhcnRzV2l0aEFueT1mdW5jdGlvbihzdHIpeworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZihkb2pvLnN0cmluZy5zdGFydHNXaXRoKHN0cixhcmd1bWVudHNbaV0pKXsKK3JldHVybiB0cnVlOworfQorfQorcmV0dXJuIGZhbHNlOworfTsKK2Rvam8uc3RyaW5nLmhhcz1mdW5jdGlvbihzdHIpeworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZihzdHIuaW5kZXhPZihhcmd1bWVudHNbaV0pPi0xKXsKK3JldHVybiB0cnVlOworfQorfQorcmV0dXJuIGZhbHNlOworfTsKK2Rvam8uc3RyaW5nLm5vcm1hbGl6ZU5ld2xpbmVzPWZ1bmN0aW9uKHRleHQsXzFmYyl7CitpZihfMWZjPT0iXG4iKXsKK3RleHQ9dGV4dC5yZXBsYWNlKC9cclxuL2csIlxuIik7Cit0ZXh0PXRleHQucmVwbGFjZSgvXHIvZywiXG4iKTsKK31lbHNleworaWYoXzFmYz09IlxyIil7Cit0ZXh0PXRleHQucmVwbGFjZSgvXHJcbi9nLCJcciIpOwordGV4dD10ZXh0LnJlcGxhY2UoL1xuL2csIlxyIik7Cit9ZWxzZXsKK3RleHQ9dGV4dC5yZXBsYWNlKC8oW15ccl0pXG4vZywiJDFcclxuIikucmVwbGFjZSgvXHIoW15cbl0pL2csIlxyXG4kMSIpOworfQorfQorcmV0dXJuIHRleHQ7Cit9OworZG9qby5zdHJpbmcuc3BsaXRFc2NhcGVkPWZ1bmN0aW9uKHN0cixfMWZlKXsKK3ZhciBfMWZmPVtdOworZm9yKHZhciBpPTAsXzIwMT0wO2k8c3RyLmxlbmd0aDtpKyspeworaWYoc3RyLmNoYXJBdChpKT09IlxcIil7CitpKys7Citjb250aW51ZTsKK30KK2lmKHN0ci5jaGFyQXQoaSk9PV8xZmUpeworXzFmZi5wdXNoKHN0ci5zdWJzdHJpbmcoXzIwMSxpKSk7CitfMjAxPWkrMTsKK30KK30KK18xZmYucHVzaChzdHIuc3Vic3RyKF8yMDEpKTsKK3JldHVybiBfMWZmOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5kb20iKTsKK2Rvam8uZG9tLkVMRU1FTlRfTk9ERT0xOworZG9qby5kb20uQVRUUklCVVRFX05PREU9MjsKK2Rvam8uZG9tLlRFWFRfTk9ERT0zOworZG9qby5kb20uQ0RBVEFfU0VDVElPTl9OT0RFPTQ7Citkb2pvLmRvbS5FTlRJVFlfUkVGRVJFTkNFX05PREU9NTsKK2Rvam8uZG9tLkVOVElUWV9OT0RFPTY7Citkb2pvLmRvbS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU9NzsKK2Rvam8uZG9tLkNPTU1FTlRfTk9ERT04OworZG9qby5kb20uRE9DVU1FTlRfTk9ERT05OworZG9qby5kb20uRE9DVU1FTlRfVFlQRV9OT0RFPTEwOworZG9qby5kb20uRE9DVU1FTlRfRlJBR01FTlRfTk9ERT0xMTsKK2Rvam8uZG9tLk5PVEFUSU9OX05PREU9MTI7Citkb2pvLmRvbS5kb2pvbWw9Imh0dHA6Ly93d3cuZG9qb3Rvb2xraXQub3JnLzIwMDQvZG9qb21sIjsKK2Rvam8uZG9tLnhtbG5zPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixzbWlsOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1NNSUwyMC8iLG1tbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsY21sOiJodHRwOi8vd3d3LnhtbC1jbWwub3JnIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseGh0bWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHh1bDoiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCIseGJsOiJodHRwOi8vd3d3Lm1vemlsbGEub3JnL3hibCIsZm86Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIseHNsOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLHhzbHQ6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIseGk6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLHhmb3JtczoiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wMS94Zm9ybXMiLHNheG9uOiJodHRwOi8vaWNsLmNvbS9zYXhvbiIseGFsYW46Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Iix4c2Q6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIixkdDoiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtZGF0YXR5cGVzIix4c2k6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIixyZGY6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiLHJkZnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSMiLGRjOiJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIsZGNxOiJodHRwOi8vcHVybC5vcmcvZGMvcXVhbGlmaWVycy8xLjAiLCJzb2FwLWVudiI6Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIix3c2RsOiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsQWRvYmVFeHRlbnNpb25zOiJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlU1ZHVmlld2VyRXh0ZW5zaW9ucy8zLjAvIn07Citkb2pvLmRvbS5pc05vZGU9ZnVuY3Rpb24od2gpeworaWYodHlwZW9mIEVsZW1lbnQ9PSJmdW5jdGlvbiIpewordHJ5eworcmV0dXJuIHdoIGluc3RhbmNlb2YgRWxlbWVudDsKK30KK2NhdGNoKGUpeworfQorfWVsc2V7CityZXR1cm4gd2gmJiFpc05hTih3aC5ub2RlVHlwZSk7Cit9Cit9OworZG9qby5kb20uZ2V0VW5pcXVlSWQ9ZnVuY3Rpb24oKXsKK3ZhciBfMjAzPWRvam8uZG9jKCk7Citkb3sKK3ZhciBpZD0iZGpfdW5pcXVlXyIrKCsrYXJndW1lbnRzLmNhbGxlZS5faWRJbmNyZW1lbnQpOworfXdoaWxlKF8yMDMuZ2V0RWxlbWVudEJ5SWQoaWQpKTsKK3JldHVybiBpZDsKK307Citkb2pvLmRvbS5nZXRVbmlxdWVJZC5faWRJbmNyZW1lbnQ9MDsKK2Rvam8uZG9tLmZpcnN0RWxlbWVudD1kb2pvLmRvbS5nZXRGaXJzdENoaWxkRWxlbWVudD1mdW5jdGlvbihfMjA1LF8yMDYpewordmFyIG5vZGU9XzIwNS5maXJzdENoaWxkOword2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9ZG9qby5kb20uRUxFTUVOVF9OT0RFKXsKK25vZGU9bm9kZS5uZXh0U2libGluZzsKK30KK2lmKF8yMDYmJm5vZGUmJm5vZGUudGFnTmFtZSYmbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPV8yMDYudG9Mb3dlckNhc2UoKSl7Citub2RlPWRvam8uZG9tLm5leHRFbGVtZW50KG5vZGUsXzIwNik7Cit9CityZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5sYXN0RWxlbWVudD1kb2pvLmRvbS5nZXRMYXN0Q2hpbGRFbGVtZW50PWZ1bmN0aW9uKF8yMDgsXzIwOSl7Cit2YXIgbm9kZT1fMjA4Lmxhc3RDaGlsZDsKK3doaWxlKG5vZGUmJm5vZGUubm9kZVR5cGUhPWRvam8uZG9tLkVMRU1FTlRfTk9ERSl7Citub2RlPW5vZGUucHJldmlvdXNTaWJsaW5nOworfQoraWYoXzIwOSYmbm9kZSYmbm9kZS50YWdOYW1lJiZub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSE9XzIwOS50b0xvd2VyQ2FzZSgpKXsKK25vZGU9ZG9qby5kb20ucHJldkVsZW1lbnQobm9kZSxfMjA5KTsKK30KK3JldHVybiBub2RlOworfTsKK2Rvam8uZG9tLm5leHRFbGVtZW50PWRvam8uZG9tLmdldE5leHRTaWJsaW5nRWxlbWVudD1mdW5jdGlvbihub2RlLF8yMGMpeworaWYoIW5vZGUpeworcmV0dXJuIG51bGw7Cit9Citkb3sKK25vZGU9bm9kZS5uZXh0U2libGluZzsKK313aGlsZShub2RlJiZub2RlLm5vZGVUeXBlIT1kb2pvLmRvbS5FTEVNRU5UX05PREUpOworaWYobm9kZSYmXzIwYyYmXzIwYy50b0xvd2VyQ2FzZSgpIT1ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7CityZXR1cm4gZG9qby5kb20ubmV4dEVsZW1lbnQobm9kZSxfMjBjKTsKK30KK3JldHVybiBub2RlOworfTsKK2Rvam8uZG9tLnByZXZFbGVtZW50PWRvam8uZG9tLmdldFByZXZpb3VzU2libGluZ0VsZW1lbnQ9ZnVuY3Rpb24obm9kZSxfMjBlKXsKK2lmKCFub2RlKXsKK3JldHVybiBudWxsOworfQoraWYoXzIwZSl7CitfMjBlPV8yMGUudG9Mb3dlckNhc2UoKTsKK30KK2Rveworbm9kZT1ub2RlLnByZXZpb3VzU2libGluZzsKK313aGlsZShub2RlJiZub2RlLm5vZGVUeXBlIT1kb2pvLmRvbS5FTEVNRU5UX05PREUpOworaWYobm9kZSYmXzIwZSYmXzIwZS50b0xvd2VyQ2FzZSgpIT1ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7CityZXR1cm4gZG9qby5kb20ucHJldkVsZW1lbnQobm9kZSxfMjBlKTsKK30KK3JldHVybiBub2RlOworfTsKK2Rvam8uZG9tLm1vdmVDaGlsZHJlbj1mdW5jdGlvbihfMjBmLF8yMTAsdHJpbSl7Cit2YXIgXzIxMj0wOworaWYodHJpbSl7Cit3aGlsZShfMjBmLmhhc0NoaWxkTm9kZXMoKSYmXzIwZi5maXJzdENoaWxkLm5vZGVUeXBlPT1kb2pvLmRvbS5URVhUX05PREUpeworXzIwZi5yZW1vdmVDaGlsZChfMjBmLmZpcnN0Q2hpbGQpOworfQord2hpbGUoXzIwZi5oYXNDaGlsZE5vZGVzKCkmJl8yMGYubGFzdENoaWxkLm5vZGVUeXBlPT1kb2pvLmRvbS5URVhUX05PREUpeworXzIwZi5yZW1vdmVDaGlsZChfMjBmLmxhc3RDaGlsZCk7Cit9Cit9Cit3aGlsZShfMjBmLmhhc0NoaWxkTm9kZXMoKSl7CitfMjEwLmFwcGVuZENoaWxkKF8yMGYuZmlyc3RDaGlsZCk7CitfMjEyKys7Cit9CityZXR1cm4gXzIxMjsKK307Citkb2pvLmRvbS5jb3B5Q2hpbGRyZW49ZnVuY3Rpb24oXzIxMyxfMjE0LHRyaW0pewordmFyIF8yMTY9XzIxMy5jbG9uZU5vZGUodHJ1ZSk7CityZXR1cm4gdGhpcy5tb3ZlQ2hpbGRyZW4oXzIxNixfMjE0LHRyaW0pOworfTsKK2Rvam8uZG9tLnJlcGxhY2VDaGlsZHJlbj1mdW5jdGlvbihub2RlLF8yMTgpewordmFyIF8yMTk9W107CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Zvcih2YXIgaT0wO2k8bm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtpKyspeworXzIxOS5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7Cit9Cit9Citkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbihub2RlKTsKK25vZGUuYXBwZW5kQ2hpbGQoXzIxOCk7Citmb3IodmFyIGk9MDtpPF8yMTkubGVuZ3RoO2krKyl7Citkb2pvLmRvbS5kZXN0cm95Tm9kZShfMjE5W2ldKTsKK30KK307Citkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbj1mdW5jdGlvbihub2RlKXsKK3ZhciBfMjFjPW5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7Cit3aGlsZShub2RlLmhhc0NoaWxkTm9kZXMoKSl7Citkb2pvLmRvbS5yZW1vdmVOb2RlKG5vZGUuZmlyc3RDaGlsZCk7Cit9CityZXR1cm4gXzIxYzsKK307Citkb2pvLmRvbS5yZXBsYWNlTm9kZT1mdW5jdGlvbihub2RlLF8yMWUpeworcmV0dXJuIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoXzIxZSxub2RlKTsKK307Citkb2pvLmRvbS5kZXN0cm95Tm9kZT1mdW5jdGlvbihub2RlKXsKK2lmKG5vZGUucGFyZW50Tm9kZSl7Citub2RlPWRvam8uZG9tLnJlbW92ZU5vZGUobm9kZSk7Cit9CitpZihub2RlLm5vZGVUeXBlIT0zKXsKK2lmKGRvam8uZXZhbE9ialBhdGgoImRvam8uZXZlbnQuYnJvd3Nlci5jbGVhbiIsZmFsc2UpKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5jbGVhbihub2RlKTsKK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworbm9kZS5vdXRlckhUTUw9IiI7Cit9Cit9Cit9OworZG9qby5kb20ucmVtb3ZlTm9kZT1mdW5jdGlvbihub2RlKXsKK2lmKG5vZGUmJm5vZGUucGFyZW50Tm9kZSl7CityZXR1cm4gbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOworfQorfTsKK2Rvam8uZG9tLmdldEFuY2VzdG9ycz1mdW5jdGlvbihub2RlLF8yMjIsXzIyMyl7Cit2YXIgXzIyND1bXTsKK3ZhciBfMjI1PShfMjIyJiYoXzIyMiBpbnN0YW5jZW9mIEZ1bmN0aW9ufHx0eXBlb2YgXzIyMj09ImZ1bmN0aW9uIikpOword2hpbGUobm9kZSl7CitpZighXzIyNXx8XzIyMihub2RlKSl7CitfMjI0LnB1c2gobm9kZSk7Cit9CitpZihfMjIzJiZfMjI0Lmxlbmd0aD4wKXsKK3JldHVybiBfMjI0WzBdOworfQorbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9CitpZihfMjIzKXsKK3JldHVybiBudWxsOworfQorcmV0dXJuIF8yMjQ7Cit9OworZG9qby5kb20uZ2V0QW5jZXN0b3JzQnlUYWc9ZnVuY3Rpb24obm9kZSx0YWcsXzIyOCl7Cit0YWc9dGFnLnRvTG93ZXJDYXNlKCk7CityZXR1cm4gZG9qby5kb20uZ2V0QW5jZXN0b3JzKG5vZGUsZnVuY3Rpb24oZWwpeworcmV0dXJuICgoZWwudGFnTmFtZSkmJihlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PXRhZykpOworfSxfMjI4KTsKK307Citkb2pvLmRvbS5nZXRGaXJzdEFuY2VzdG9yQnlUYWc9ZnVuY3Rpb24obm9kZSx0YWcpeworcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnKG5vZGUsdGFnLHRydWUpOworfTsKK2Rvam8uZG9tLmlzRGVzY2VuZGFudE9mPWZ1bmN0aW9uKG5vZGUsXzIyZCxfMjJlKXsKK2lmKF8yMmUmJm5vZGUpeworbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9Cit3aGlsZShub2RlKXsKK2lmKG5vZGU9PV8yMmQpeworcmV0dXJuIHRydWU7Cit9Citub2RlPW5vZGUucGFyZW50Tm9kZTsKK30KK3JldHVybiBmYWxzZTsKK307Citkb2pvLmRvbS5pbm5lclhNTD1mdW5jdGlvbihub2RlKXsKK2lmKG5vZGUuaW5uZXJYTUwpeworcmV0dXJuIG5vZGUuaW5uZXJYTUw7Cit9ZWxzZXsKK2lmKG5vZGUueG1sKXsKK3JldHVybiBub2RlLnhtbDsKK31lbHNleworaWYodHlwZW9mIFhNTFNlcmlhbGl6ZXIhPSJ1bmRlZmluZWQiKXsKK3JldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcobm9kZSk7Cit9Cit9Cit9Cit9OworZG9qby5kb20uY3JlYXRlRG9jdW1lbnQ9ZnVuY3Rpb24oKXsKK3ZhciBkb2M9bnVsbDsKK3ZhciBfMjMxPWRvam8uZG9jKCk7CitpZighZGpfdW5kZWYoIkFjdGl2ZVhPYmplY3QiKSl7Cit2YXIgXzIzMj1bIk1TWE1MMiIsIk1pY3Jvc29mdCIsIk1TWE1MIiwiTVNYTUwzIl07Citmb3IodmFyIGk9MDtpPF8yMzIubGVuZ3RoO2krKyl7Cit0cnl7Citkb2M9bmV3IEFjdGl2ZVhPYmplY3QoXzIzMltpXSsiLlhNTERPTSIpOworfQorY2F0Y2goZSl7Cit9CitpZihkb2MpeworYnJlYWs7Cit9Cit9Cit9ZWxzZXsKK2lmKChfMjMxLmltcGxlbWVudGF0aW9uKSYmKF8yMzEuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpKXsKK2RvYz1fMjMxLmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCIiLG51bGwpOworfQorfQorcmV0dXJuIGRvYzsKK307Citkb2pvLmRvbS5jcmVhdGVEb2N1bWVudEZyb21UZXh0PWZ1bmN0aW9uKHN0cixfMjM1KXsKK2lmKCFfMjM1KXsKK18yMzU9InRleHQveG1sIjsKK30KK2lmKCFkal91bmRlZigiRE9NUGFyc2VyIikpewordmFyIF8yMzY9bmV3IERPTVBhcnNlcigpOworcmV0dXJuIF8yMzYucGFyc2VGcm9tU3RyaW5nKHN0cixfMjM1KTsKK31lbHNleworaWYoIWRqX3VuZGVmKCJBY3RpdmVYT2JqZWN0IikpewordmFyIF8yMzc9ZG9qby5kb20uY3JlYXRlRG9jdW1lbnQoKTsKK2lmKF8yMzcpeworXzIzNy5hc3luYz1mYWxzZTsKK18yMzcubG9hZFhNTChzdHIpOworcmV0dXJuIF8yMzc7Cit9ZWxzZXsKK2Rvam8uZGVidWcoInRvWG1sIGRpZG4ndCB3b3JrPyIpOworfQorfWVsc2V7Cit2YXIgXzIzOD1kb2pvLmRvYygpOworaWYoXzIzOC5jcmVhdGVFbGVtZW50KXsKK3ZhciB0bXA9XzIzOC5jcmVhdGVFbGVtZW50KCJ4bWwiKTsKK3RtcC5pbm5lckhUTUw9c3RyOworaWYoXzIzOC5pbXBsZW1lbnRhdGlvbiYmXzIzOC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCl7Cit2YXIgXzIzYT1fMjM4LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCJmb28iLCIiLG51bGwpOworZm9yKHZhciBpPTA7aTx0bXAuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXsKK18yM2EuaW1wb3J0Tm9kZSh0bXAuY2hpbGROb2Rlcy5pdGVtKGkpLHRydWUpOworfQorcmV0dXJuIF8yM2E7Cit9CityZXR1cm4gKCh0bXAuZG9jdW1lbnQpJiYodG1wLmRvY3VtZW50LmZpcnN0Q2hpbGQ/dG1wLmRvY3VtZW50LmZpcnN0Q2hpbGQ6dG1wKSk7Cit9Cit9Cit9CityZXR1cm4gbnVsbDsKK307Citkb2pvLmRvbS5wcmVwZW5kQ2hpbGQ9ZnVuY3Rpb24obm9kZSxfMjNkKXsKK2lmKF8yM2QuZmlyc3RDaGlsZCl7CitfMjNkLmluc2VydEJlZm9yZShub2RlLF8yM2QuZmlyc3RDaGlsZCk7Cit9ZWxzZXsKK18yM2QuYXBwZW5kQ2hpbGQobm9kZSk7Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmRvbS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24obm9kZSxyZWYsXzI0MCl7CitpZigoXzI0MCE9dHJ1ZSkmJihub2RlPT09cmVmfHxub2RlLm5leHRTaWJsaW5nPT09cmVmKSl7CityZXR1cm4gZmFsc2U7Cit9Cit2YXIgXzI0MT1yZWYucGFyZW50Tm9kZTsKK18yNDEuaW5zZXJ0QmVmb3JlKG5vZGUscmVmKTsKK3JldHVybiB0cnVlOworfTsKK2Rvam8uZG9tLmluc2VydEFmdGVyPWZ1bmN0aW9uKG5vZGUscmVmLF8yNDQpewordmFyIHBuPXJlZi5wYXJlbnROb2RlOworaWYocmVmPT1wbi5sYXN0Q2hpbGQpeworaWYoKF8yNDQhPXRydWUpJiYobm9kZT09PXJlZikpeworcmV0dXJuIGZhbHNlOworfQorcG4uYXBwZW5kQ2hpbGQobm9kZSk7Cit9ZWxzZXsKK3JldHVybiB0aGlzLmluc2VydEJlZm9yZShub2RlLHJlZi5uZXh0U2libGluZyxfMjQ0KTsKK30KK3JldHVybiB0cnVlOworfTsKK2Rvam8uZG9tLmluc2VydEF0UG9zaXRpb249ZnVuY3Rpb24obm9kZSxyZWYsXzI0OCl7CitpZigoIW5vZGUpfHwoIXJlZil8fCghXzI0OCkpeworcmV0dXJuIGZhbHNlOworfQorc3dpdGNoKF8yNDgudG9Mb3dlckNhc2UoKSl7CitjYXNlICJiZWZvcmUiOgorcmV0dXJuIGRvam8uZG9tLmluc2VydEJlZm9yZShub2RlLHJlZik7CitjYXNlICJhZnRlciI6CityZXR1cm4gZG9qby5kb20uaW5zZXJ0QWZ0ZXIobm9kZSxyZWYpOworY2FzZSAiZmlyc3QiOgoraWYocmVmLmZpcnN0Q2hpbGQpeworcmV0dXJuIGRvam8uZG9tLmluc2VydEJlZm9yZShub2RlLHJlZi5maXJzdENoaWxkKTsKK31lbHNleworcmVmLmFwcGVuZENoaWxkKG5vZGUpOworcmV0dXJuIHRydWU7Cit9CiticmVhazsKK2RlZmF1bHQ6CityZWYuYXBwZW5kQ2hpbGQobm9kZSk7CityZXR1cm4gdHJ1ZTsKK30KK307Citkb2pvLmRvbS5pbnNlcnRBdEluZGV4PWZ1bmN0aW9uKG5vZGUsXzI0YSxfMjRiKXsKK3ZhciBfMjRjPV8yNGEuY2hpbGROb2RlczsKK2lmKCFfMjRjLmxlbmd0aHx8XzI0Yy5sZW5ndGg9PV8yNGIpeworXzI0YS5hcHBlbmRDaGlsZChub2RlKTsKK3JldHVybiB0cnVlOworfQoraWYoXzI0Yj09MCl7CityZXR1cm4gZG9qby5kb20ucHJlcGVuZENoaWxkKG5vZGUsXzI0YSk7Cit9CityZXR1cm4gZG9qby5kb20uaW5zZXJ0QWZ0ZXIobm9kZSxfMjRjW18yNGItMV0pOworfTsKK2Rvam8uZG9tLnRleHRDb250ZW50PWZ1bmN0aW9uKG5vZGUsdGV4dCl7CitpZihhcmd1bWVudHMubGVuZ3RoPjEpewordmFyIF8yNGY9ZG9qby5kb2MoKTsKK2Rvam8uZG9tLnJlcGxhY2VDaGlsZHJlbihub2RlLF8yNGYuY3JlYXRlVGV4dE5vZGUodGV4dCkpOworcmV0dXJuIHRleHQ7Cit9ZWxzZXsKK2lmKG5vZGUudGV4dENvbnRlbnQhPXVuZGVmaW5lZCl7CityZXR1cm4gbm9kZS50ZXh0Q29udGVudDsKK30KK3ZhciBfMjUwPSIiOworaWYobm9kZT09bnVsbCl7CityZXR1cm4gXzI1MDsKK30KK2Zvcih2YXIgaT0wO2k8bm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtpKyspeworc3dpdGNoKG5vZGUuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSl7CitjYXNlIDE6CitjYXNlIDU6CitfMjUwKz1kb2pvLmRvbS50ZXh0Q29udGVudChub2RlLmNoaWxkTm9kZXNbaV0pOworYnJlYWs7CitjYXNlIDM6CitjYXNlIDI6CitjYXNlIDQ6CitfMjUwKz1ub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVZhbHVlOworYnJlYWs7CitkZWZhdWx0OgorYnJlYWs7Cit9Cit9CityZXR1cm4gXzI1MDsKK30KK307Citkb2pvLmRvbS5oYXNQYXJlbnQ9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gQm9vbGVhbihub2RlJiZub2RlLnBhcmVudE5vZGUmJmRvam8uZG9tLmlzTm9kZShub2RlLnBhcmVudE5vZGUpKTsKK307Citkb2pvLmRvbS5pc1RhZz1mdW5jdGlvbihub2RlKXsKK2lmKG5vZGUmJm5vZGUudGFnTmFtZSl7Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2lmKG5vZGUudGFnTmFtZT09U3RyaW5nKGFyZ3VtZW50c1tpXSkpeworcmV0dXJuIFN0cmluZyhhcmd1bWVudHNbaV0pOworfQorfQorfQorcmV0dXJuICIiOworfTsKK2Rvam8uZG9tLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKGVsZW0sXzI1NixfMjU3LF8yNTgpeworaWYoZWxlbT09bnVsbHx8KChlbGVtPT11bmRlZmluZWQpJiYodHlwZW9mIGVsZW09PSJ1bmRlZmluZWQiKSkpeworZG9qby5yYWlzZSgiTm8gZWxlbWVudCBnaXZlbiB0byBkb2pvLmRvbS5zZXRBdHRyaWJ1dGVOUyIpOworfQoraWYoISgoZWxlbS5zZXRBdHRyaWJ1dGVOUz09dW5kZWZpbmVkKSYmKHR5cGVvZiBlbGVtLnNldEF0dHJpYnV0ZU5TPT0idW5kZWZpbmVkIikpKXsKK2VsZW0uc2V0QXR0cmlidXRlTlMoXzI1NixfMjU3LF8yNTgpOworfWVsc2V7Cit2YXIgXzI1OT1lbGVtLm93bmVyRG9jdW1lbnQ7Cit2YXIgXzI1YT1fMjU5LmNyZWF0ZU5vZGUoMixfMjU3LF8yNTYpOworXzI1YS5ub2RlVmFsdWU9XzI1ODsKK2VsZW0uc2V0QXR0cmlidXRlTm9kZShfMjVhKTsKK30KK307Citkb2pvLnByb3ZpZGUoImRvam8udW5kby5icm93c2VyIik7Cit0cnl7CitpZigoIWRqQ29uZmlnWyJwcmV2ZW50QmFja0J1dHRvbkZpeCJdKSYmKCFkb2pvLmhvc3RlbnYucG9zdF9sb2FkXykpeworZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgc3R5bGU9J2JvcmRlcjogMHB4OyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDBweDsgcmlnaHQ6IDBweDsgdmlzaWJpbGl0eTogdmlzaWJsZTsnIG5hbWU9J2RqaGlzdG9yeScgaWQ9J2RqaGlzdG9yeScgc3JjPSciKyhkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXXx8ZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKSsiaWZyYW1lX2hpc3RvcnkuaHRtbCIpKyInPjwvaWZyYW1lPiIpOworfQorfQorY2F0Y2goZSl7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLm9wZXJhKXsKK2Rvam8uZGVidWcoIk9wZXJhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb2pvLnVuZG8uYnJvd3Nlciwgc28gYmFjay9mb3J3YXJkIGRldGVjdGlvbiB3aWxsIG5vdCB3b3JrLiIpOworfQorZG9qby51bmRvLmJyb3dzZXI9e2luaXRpYWxIcmVmOighZGpfdW5kZWYoIndpbmRvdyIpKT93aW5kb3cubG9jYXRpb24uaHJlZjoiIixpbml0aWFsSGFzaDooIWRqX3VuZGVmKCJ3aW5kb3ciKSk/d2luZG93LmxvY2F0aW9uLmhhc2g6IiIsbW92ZUZvcndhcmQ6ZmFsc2UsaGlzdG9yeVN0YWNrOltdLGZvcndhcmRTdGFjazpbXSxoaXN0b3J5SWZyYW1lOm51bGwsYm9va21hcmtBbmNob3I6bnVsbCxsb2NhdGlvblRpbWVyOm51bGwsc2V0SW5pdGlhbFN0YXRlOmZ1bmN0aW9uKGFyZ3MpewordGhpcy5pbml0aWFsU3RhdGU9dGhpcy5fY3JlYXRlU3RhdGUodGhpcy5pbml0aWFsSHJlZixhcmdzLHRoaXMuaW5pdGlhbEhhc2gpOworfSxhZGRUb0hpc3Rvcnk6ZnVuY3Rpb24oYXJncyl7Cit0aGlzLmZvcndhcmRTdGFjaz1bXTsKK3ZhciBoYXNoPW51bGw7Cit2YXIgdXJsPW51bGw7CitpZighdGhpcy5oaXN0b3J5SWZyYW1lKXsKK2lmKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0mJiFkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSl7Citkb2pvLmRlYnVnKCJkb2pvLnVuZG8uYnJvd3NlcjogV2hlbiB1c2luZyBjcm9zcy1kb21haW4gRG9qbyBidWlsZHMsIisiIHBsZWFzZSBzYXZlIGlmcmFtZV9oaXN0b3J5Lmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvSWZyYW1lSGlzdG9yeVVybCIrIiB0byB0aGUgcGF0aCBvbiB5b3VyIGRvbWFpbiB0byBpZnJhbWVfaGlzdG9yeS5odG1sIik7Cit9Cit0aGlzLmhpc3RvcnlJZnJhbWU9d2luZG93LmZyYW1lc1siZGpoaXN0b3J5Il07Cit9CitpZighdGhpcy5ib29rbWFya0FuY2hvcil7Cit0aGlzLmJvb2ttYXJrQW5jaG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuYm9va21hcmtBbmNob3IpOwordGhpcy5ib29rbWFya0FuY2hvci5zdHlsZS5kaXNwbGF5PSJub25lIjsKK30KK2lmKGFyZ3NbImNoYW5nZVVybCJdKXsKK2hhc2g9IiMiKygoYXJnc1siY2hhbmdlVXJsIl0hPT10cnVlKT9hcmdzWyJjaGFuZ2VVcmwiXToobmV3IERhdGUoKSkuZ2V0VGltZSgpKTsKK2lmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aD09MCYmdGhpcy5pbml0aWFsU3RhdGUudXJsSGFzaD09aGFzaCl7Cit0aGlzLmluaXRpYWxTdGF0ZT10aGlzLl9jcmVhdGVTdGF0ZSh1cmwsYXJncyxoYXNoKTsKK3JldHVybjsKK31lbHNleworaWYodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoPjAmJnRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aC0xXS51cmxIYXNoPT1oYXNoKXsKK3RoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aC0xXT10aGlzLl9jcmVhdGVTdGF0ZSh1cmwsYXJncyxoYXNoKTsKK3JldHVybjsKK30KK30KK3RoaXMuY2hhbmdpbmdVcmw9dHJ1ZTsKK3NldFRpbWVvdXQoIndpbmRvdy5sb2NhdGlvbi5ocmVmID0gJyIraGFzaCsiJzsgZG9qby51bmRvLmJyb3dzZXIuY2hhbmdpbmdVcmwgPSBmYWxzZTsiLDEpOwordGhpcy5ib29rbWFya0FuY2hvci5ocmVmPWhhc2g7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK3VybD10aGlzLl9sb2FkSWZyYW1lSGlzdG9yeSgpOwordmFyIF8yNWY9YXJnc1siYmFjayJdfHxhcmdzWyJiYWNrQnV0dG9uIl18fGFyZ3NbImhhbmRsZSJdOwordmFyIHRjYj1mdW5jdGlvbihfMjYxKXsKK2lmKHdpbmRvdy5sb2NhdGlvbi5oYXNoIT0iIil7CitzZXRUaW1lb3V0KCJ3aW5kb3cubG9jYXRpb24uaHJlZiA9ICciK2hhc2grIic7IiwxKTsKK30KK18yNWYuYXBwbHkodGhpcyxbXzI2MV0pOworfTsKK2lmKGFyZ3NbImJhY2siXSl7CithcmdzLmJhY2s9dGNiOworfWVsc2V7CitpZihhcmdzWyJiYWNrQnV0dG9uIl0peworYXJncy5iYWNrQnV0dG9uPXRjYjsKK31lbHNleworaWYoYXJnc1siaGFuZGxlIl0peworYXJncy5oYW5kbGU9dGNiOworfQorfQorfQordmFyIF8yNjI9YXJnc1siZm9yd2FyZCJdfHxhcmdzWyJmb3J3YXJkQnV0dG9uIl18fGFyZ3NbImhhbmRsZSJdOwordmFyIHRmdz1mdW5jdGlvbihfMjY0KXsKK2lmKHdpbmRvdy5sb2NhdGlvbi5oYXNoIT0iIil7Cit3aW5kb3cubG9jYXRpb24uaHJlZj1oYXNoOworfQoraWYoXzI2Mil7CitfMjYyLmFwcGx5KHRoaXMsW18yNjRdKTsKK30KK307CitpZihhcmdzWyJmb3J3YXJkIl0peworYXJncy5mb3J3YXJkPXRmdzsKK31lbHNleworaWYoYXJnc1siZm9yd2FyZEJ1dHRvbiJdKXsKK2FyZ3MuZm9yd2FyZEJ1dHRvbj10Znc7Cit9ZWxzZXsKK2lmKGFyZ3NbImhhbmRsZSJdKXsKK2FyZ3MuaGFuZGxlPXRmdzsKK30KK30KK30KK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5tb3opeworaWYoIXRoaXMubG9jYXRpb25UaW1lcil7Cit0aGlzLmxvY2F0aW9uVGltZXI9c2V0SW50ZXJ2YWwoImRvam8udW5kby5icm93c2VyLmNoZWNrTG9jYXRpb24oKTsiLDIwMCk7Cit9Cit9Cit9Cit9ZWxzZXsKK3VybD10aGlzLl9sb2FkSWZyYW1lSGlzdG9yeSgpOworfQordGhpcy5oaXN0b3J5U3RhY2sucHVzaCh0aGlzLl9jcmVhdGVTdGF0ZSh1cmwsYXJncyxoYXNoKSk7Cit9LGNoZWNrTG9jYXRpb246ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmNoYW5naW5nVXJsKXsKK3ZhciBoc2w9dGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoOworaWYoKHdpbmRvdy5sb2NhdGlvbi5oYXNoPT10aGlzLmluaXRpYWxIYXNofHx3aW5kb3cubG9jYXRpb24uaHJlZj09dGhpcy5pbml0aWFsSHJlZikmJihoc2w9PTEpKXsKK3RoaXMuaGFuZGxlQmFja0J1dHRvbigpOworcmV0dXJuOworfQoraWYodGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoPjApeworaWYodGhpcy5mb3J3YXJkU3RhY2tbdGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoLTFdLnVybEhhc2g9PXdpbmRvdy5sb2NhdGlvbi5oYXNoKXsKK3RoaXMuaGFuZGxlRm9yd2FyZEJ1dHRvbigpOworcmV0dXJuOworfQorfQoraWYoKGhzbD49MikmJih0aGlzLmhpc3RvcnlTdGFja1toc2wtMl0pKXsKK2lmKHRoaXMuaGlzdG9yeVN0YWNrW2hzbC0yXS51cmxIYXNoPT13aW5kb3cubG9jYXRpb24uaGFzaCl7Cit0aGlzLmhhbmRsZUJhY2tCdXR0b24oKTsKK3JldHVybjsKK30KK30KK30KK30saWZyYW1lTG9hZGVkOmZ1bmN0aW9uKGV2dCxfMjY3KXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhKXsKK3ZhciBfMjY4PXRoaXMuX2dldFVybFF1ZXJ5KF8yNjcuaHJlZik7CitpZihfMjY4PT1udWxsKXsKK2lmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aD09MSl7Cit0aGlzLmhhbmRsZUJhY2tCdXR0b24oKTsKK30KK3JldHVybjsKK30KK2lmKHRoaXMubW92ZUZvcndhcmQpewordGhpcy5tb3ZlRm9yd2FyZD1mYWxzZTsKK3JldHVybjsKK30KK2lmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aD49MiYmXzI2OD09dGhpcy5fZ2V0VXJsUXVlcnkodGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoLTJdLnVybCkpewordGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7Cit9ZWxzZXsKK2lmKHRoaXMuZm9yd2FyZFN0YWNrLmxlbmd0aD4wJiZfMjY4PT10aGlzLl9nZXRVcmxRdWVyeSh0aGlzLmZvcndhcmRTdGFja1t0aGlzLmZvcndhcmRTdGFjay5sZW5ndGgtMV0udXJsKSl7Cit0aGlzLmhhbmRsZUZvcndhcmRCdXR0b24oKTsKK30KK30KK30KK30saGFuZGxlQmFja0J1dHRvbjpmdW5jdGlvbigpewordmFyIF8yNjk9dGhpcy5oaXN0b3J5U3RhY2sucG9wKCk7CitpZighXzI2OSl7CityZXR1cm47Cit9Cit2YXIgbGFzdD10aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGgtMV07CitpZighbGFzdCYmdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoPT0wKXsKK2xhc3Q9dGhpcy5pbml0aWFsU3RhdGU7Cit9CitpZihsYXN0KXsKK2lmKGxhc3Qua3dBcmdzWyJiYWNrIl0peworbGFzdC5rd0FyZ3NbImJhY2siXSgpOworfWVsc2V7CitpZihsYXN0Lmt3QXJnc1siYmFja0J1dHRvbiJdKXsKK2xhc3Qua3dBcmdzWyJiYWNrQnV0dG9uIl0oKTsKK31lbHNleworaWYobGFzdC5rd0FyZ3NbImhhbmRsZSJdKXsKK2xhc3Qua3dBcmdzLmhhbmRsZSgiYmFjayIpOworfQorfQorfQorfQordGhpcy5mb3J3YXJkU3RhY2sucHVzaChfMjY5KTsKK30saGFuZGxlRm9yd2FyZEJ1dHRvbjpmdW5jdGlvbigpewordmFyIGxhc3Q9dGhpcy5mb3J3YXJkU3RhY2sucG9wKCk7CitpZighbGFzdCl7CityZXR1cm47Cit9CitpZihsYXN0Lmt3QXJnc1siZm9yd2FyZCJdKXsKK2xhc3Qua3dBcmdzLmZvcndhcmQoKTsKK31lbHNleworaWYobGFzdC5rd0FyZ3NbImZvcndhcmRCdXR0b24iXSl7CitsYXN0Lmt3QXJncy5mb3J3YXJkQnV0dG9uKCk7Cit9ZWxzZXsKK2lmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CitsYXN0Lmt3QXJncy5oYW5kbGUoImZvcndhcmQiKTsKK30KK30KK30KK3RoaXMuaGlzdG9yeVN0YWNrLnB1c2gobGFzdCk7Cit9LF9jcmVhdGVTdGF0ZTpmdW5jdGlvbih1cmwsYXJncyxoYXNoKXsKK3JldHVybiB7InVybCI6dXJsLCJrd0FyZ3MiOmFyZ3MsInVybEhhc2giOmhhc2h9OworfSxfZ2V0VXJsUXVlcnk6ZnVuY3Rpb24odXJsKXsKK3ZhciBfMjcwPXVybC5zcGxpdCgiPyIpOworaWYoXzI3MC5sZW5ndGg8Mil7CityZXR1cm4gbnVsbDsKK31lbHNleworcmV0dXJuIF8yNzBbMV07Cit9Cit9LF9sb2FkSWZyYW1lSGlzdG9yeTpmdW5jdGlvbigpewordmFyIHVybD0oZGpDb25maWdbImRvam9JZnJhbWVIaXN0b3J5VXJsIl18fGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCkrImlmcmFtZV9oaXN0b3J5Lmh0bWwiKSsiPyIrKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKK3RoaXMubW92ZUZvcndhcmQ9dHJ1ZTsKK2Rvam8uaW8uc2V0SUZyYW1lU3JjKHRoaXMuaGlzdG9yeUlmcmFtZSx1cmwsZmFsc2UpOworcmV0dXJuIHVybDsKK319OworZG9qby5wcm92aWRlKCJkb2pvLmlvLkJyb3dzZXJJTyIpOworaWYoIWRqX3VuZGVmKCJ3aW5kb3ciKSl7Citkb2pvLmlvLmNoZWNrQ2hpbGRyZW5Gb3JGaWxlPWZ1bmN0aW9uKG5vZGUpewordmFyIF8yNzM9ZmFsc2U7Cit2YXIgXzI3ND1ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOworZG9qby5sYW5nLmZvckVhY2goXzI3NCxmdW5jdGlvbihfMjc1KXsKK2lmKF8yNzMpeworcmV0dXJuOworfQoraWYoXzI3NS5nZXRBdHRyaWJ1dGUoInR5cGUiKT09ImZpbGUiKXsKK18yNzM9dHJ1ZTsKK30KK30pOworcmV0dXJuIF8yNzM7Cit9OworZG9qby5pby5mb3JtSGFzRmlsZT1mdW5jdGlvbihfMjc2KXsKK3JldHVybiBkb2pvLmlvLmNoZWNrQ2hpbGRyZW5Gb3JGaWxlKF8yNzYpOworfTsKK2Rvam8uaW8udXBkYXRlTm9kZT1mdW5jdGlvbihub2RlLF8yNzgpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgYXJncz1fMjc4OworaWYoZG9qby5sYW5nLmlzU3RyaW5nKF8yNzgpKXsKK2FyZ3M9e3VybDpfMjc4fTsKK30KK2FyZ3MubWltZXR5cGU9InRleHQvaHRtbCI7CithcmdzLmxvYWQ9ZnVuY3Rpb24odCxkLGUpeword2hpbGUobm9kZS5maXJzdENoaWxkKXsKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlKG5vZGUuZmlyc3RDaGlsZCk7Cit9Citub2RlLmlubmVySFRNTD1kOworfTsKK2Rvam8uaW8uYmluZChhcmdzKTsKK307Citkb2pvLmlvLmZvcm1GaWx0ZXI9ZnVuY3Rpb24obm9kZSl7Cit2YXIgdHlwZT0obm9kZS50eXBlfHwiIikudG9Mb3dlckNhc2UoKTsKK3JldHVybiAhbm9kZS5kaXNhYmxlZCYmbm9kZS5uYW1lJiYhZG9qby5sYW5nLmluQXJyYXkoWyJmaWxlIiwic3VibWl0IiwiaW1hZ2UiLCJyZXNldCIsImJ1dHRvbiJdLHR5cGUpOworfTsKK2Rvam8uaW8uZW5jb2RlRm9ybT1mdW5jdGlvbihfMjdmLF8yODAsXzI4MSl7CitpZigoIV8yN2YpfHwoIV8yN2YudGFnTmFtZSl8fCghXzI3Zi50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJmb3JtIikpeworZG9qby5yYWlzZSgiQXR0ZW1wdGVkIHRvIGVuY29kZSBhIG5vbi1mb3JtIGVsZW1lbnQuIik7Cit9CitpZighXzI4MSl7CitfMjgxPWRvam8uaW8uZm9ybUZpbHRlcjsKK30KK3ZhciBlbmM9L3V0Zi9pLnRlc3QoXzI4MHx8IiIpP2VuY29kZVVSSUNvbXBvbmVudDpkb2pvLnN0cmluZy5lbmNvZGVBc2NpaTsKK3ZhciBfMjgzPVtdOworZm9yKHZhciBpPTA7aTxfMjdmLmVsZW1lbnRzLmxlbmd0aDtpKyspewordmFyIGVsbT1fMjdmLmVsZW1lbnRzW2ldOworaWYoIWVsbXx8ZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ImZpZWxkc2V0Inx8IV8yODEoZWxtKSl7Citjb250aW51ZTsKK30KK3ZhciBuYW1lPWVuYyhlbG0ubmFtZSk7Cit2YXIgdHlwZT1lbG0udHlwZS50b0xvd2VyQ2FzZSgpOworaWYodHlwZT09InNlbGVjdC1tdWx0aXBsZSIpeworZm9yKHZhciBqPTA7ajxlbG0ub3B0aW9ucy5sZW5ndGg7aisrKXsKK2lmKGVsbS5vcHRpb25zW2pdLnNlbGVjdGVkKXsKK18yODMucHVzaChuYW1lKyI9IitlbmMoZWxtLm9wdGlvbnNbal0udmFsdWUpKTsKK30KK30KK31lbHNleworaWYoZG9qby5sYW5nLmluQXJyYXkoWyJyYWRpbyIsImNoZWNrYm94Il0sdHlwZSkpeworaWYoZWxtLmNoZWNrZWQpeworXzI4My5wdXNoKG5hbWUrIj0iK2VuYyhlbG0udmFsdWUpKTsKK30KK31lbHNleworXzI4My5wdXNoKG5hbWUrIj0iK2VuYyhlbG0udmFsdWUpKTsKK30KK30KK30KK3ZhciBfMjg5PV8yN2YuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Citmb3IodmFyIGk9MDtpPF8yODkubGVuZ3RoO2krKyl7Cit2YXIgXzI4YT1fMjg5W2ldOworaWYoXzI4YS50eXBlLnRvTG93ZXJDYXNlKCk9PSJpbWFnZSImJl8yOGEuZm9ybT09XzI3ZiYmXzI4MShfMjhhKSl7Cit2YXIgbmFtZT1lbmMoXzI4YS5uYW1lKTsKK18yODMucHVzaChuYW1lKyI9IitlbmMoXzI4YS52YWx1ZSkpOworXzI4My5wdXNoKG5hbWUrIi54PTAiKTsKK18yODMucHVzaChuYW1lKyIueT0wIik7Cit9Cit9CityZXR1cm4gXzI4My5qb2luKCImIikrIiYiOworfTsKK2Rvam8uaW8uRm9ybUJpbmQ9ZnVuY3Rpb24oYXJncyl7Cit0aGlzLmJpbmRBcmdzPXt9OworaWYoYXJncyYmYXJncy5mb3JtTm9kZSl7Cit0aGlzLmluaXQoYXJncyk7Cit9ZWxzZXsKK2lmKGFyZ3MpewordGhpcy5pbml0KHtmb3JtTm9kZTphcmdzfSk7Cit9Cit9Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmlvLkZvcm1CaW5kLHtmb3JtOm51bGwsYmluZEFyZ3M6bnVsbCxjbGlja2VkQnV0dG9uOm51bGwsaW5pdDpmdW5jdGlvbihhcmdzKXsKK3ZhciBmb3JtPWRvam8uYnlJZChhcmdzLmZvcm1Ob2RlKTsKK2lmKCFmb3JtfHwhZm9ybS50YWdOYW1lfHxmb3JtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSE9ImZvcm0iKXsKK3Rocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IENvdWxkbid0IGFwcGx5LCBpbnZhbGlkIGZvcm0iKTsKK31lbHNleworaWYodGhpcy5mb3JtPT1mb3JtKXsKK3JldHVybjsKK31lbHNleworaWYodGhpcy5mb3JtKXsKK3Rocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IEFscmVhZHkgYXBwbGllZCB0byBhIGZvcm0iKTsKK30KK30KK30KK2Rvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLGFyZ3MpOwordGhpcy5mb3JtPWZvcm07Cit0aGlzLmNvbm5lY3QoZm9ybSwib25zdWJtaXQiLCJzdWJtaXQiKTsKK2Zvcih2YXIgaT0wO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKXsKK3ZhciBub2RlPWZvcm0uZWxlbWVudHNbaV07CitpZihub2RlJiZub2RlLnR5cGUmJmRvam8ubGFuZy5pbkFycmF5KFsic3VibWl0IiwiYnV0dG9uIl0sbm9kZS50eXBlLnRvTG93ZXJDYXNlKCkpKXsKK3RoaXMuY29ubmVjdChub2RlLCJvbmNsaWNrIiwiY2xpY2siKTsKK30KK30KK3ZhciBfMjkwPWZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Citmb3IodmFyIGk9MDtpPF8yOTAubGVuZ3RoO2krKyl7Cit2YXIgXzI5MT1fMjkwW2ldOworaWYoXzI5MS50eXBlLnRvTG93ZXJDYXNlKCk9PSJpbWFnZSImJl8yOTEuZm9ybT09Zm9ybSl7Cit0aGlzLmNvbm5lY3QoXzI5MSwib25jbGljayIsImNsaWNrIik7Cit9Cit9Cit9LG9uU3VibWl0OmZ1bmN0aW9uKGZvcm0peworcmV0dXJuIHRydWU7Cit9LHN1Ym1pdDpmdW5jdGlvbihlKXsKK2UucHJldmVudERlZmF1bHQoKTsKK2lmKHRoaXMub25TdWJtaXQodGhpcy5mb3JtKSl7Citkb2pvLmlvLmJpbmQoZG9qby5sYW5nLm1peGluKHRoaXMuYmluZEFyZ3Mse2Zvcm1GaWx0ZXI6ZG9qby5sYW5nLmhpdGNoKHRoaXMsImZvcm1GaWx0ZXIiKX0pKTsKK30KK30sY2xpY2s6ZnVuY3Rpb24oZSl7Cit2YXIgbm9kZT1lLmN1cnJlbnRUYXJnZXQ7CitpZihub2RlLmRpc2FibGVkKXsKK3JldHVybjsKK30KK3RoaXMuY2xpY2tlZEJ1dHRvbj1ub2RlOworfSxmb3JtRmlsdGVyOmZ1bmN0aW9uKG5vZGUpewordmFyIHR5cGU9KG5vZGUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7Cit2YXIgXzI5OD1mYWxzZTsKK2lmKG5vZGUuZGlzYWJsZWR8fCFub2RlLm5hbWUpeworXzI5OD1mYWxzZTsKK31lbHNleworaWYoZG9qby5sYW5nLmluQXJyYXkoWyJzdWJtaXQiLCJidXR0b24iLCJpbWFnZSJdLHR5cGUpKXsKK2lmKCF0aGlzLmNsaWNrZWRCdXR0b24pewordGhpcy5jbGlja2VkQnV0dG9uPW5vZGU7Cit9CitfMjk4PW5vZGU9PXRoaXMuY2xpY2tlZEJ1dHRvbjsKK31lbHNleworXzI5OD0hZG9qby5sYW5nLmluQXJyYXkoWyJmaWxlIiwic3VibWl0IiwicmVzZXQiLCJidXR0b24iXSx0eXBlKTsKK30KK30KK3JldHVybiBfMjk4OworfSxjb25uZWN0OmZ1bmN0aW9uKF8yOTksXzI5YSxfMjliKXsKK2lmKGRvam8uZXZhbE9ialBhdGgoImRvam8uZXZlbnQuY29ubmVjdCIpKXsKK2Rvam8uZXZlbnQuY29ubmVjdChfMjk5LF8yOWEsdGhpcyxfMjliKTsKK31lbHNlewordmFyIGZjbj1kb2pvLmxhbmcuaGl0Y2godGhpcyxfMjliKTsKK18yOTlbXzI5YV09ZnVuY3Rpb24oZSl7CitpZighZSl7CitlPXdpbmRvdy5ldmVudDsKK30KK2lmKCFlLmN1cnJlbnRUYXJnZXQpeworZS5jdXJyZW50VGFyZ2V0PWUuc3JjRWxlbWVudDsKK30KK2lmKCFlLnByZXZlbnREZWZhdWx0KXsKK2UucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXsKK3dpbmRvdy5ldmVudC5yZXR1cm5WYWx1ZT1mYWxzZTsKK307Cit9CitmY24oZSk7Cit9OworfQorfX0pOworZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0PW5ldyBmdW5jdGlvbigpewordmFyIF8yOWU9dGhpczsKK3ZhciBfMjlmPXt9OwordGhpcy51c2VDYWNoZT1mYWxzZTsKK3RoaXMucHJldmVudENhY2hlPWZhbHNlOworZnVuY3Rpb24gZ2V0Q2FjaGVLZXkodXJsLF8yYTEsXzJhMil7CityZXR1cm4gdXJsKyJ8IitfMmExKyJ8IitfMmEyLnRvTG93ZXJDYXNlKCk7Cit9CitmdW5jdGlvbiBhZGRUb0NhY2hlKHVybCxfMmE0LF8yYTUsaHR0cCl7CitfMjlmW2dldENhY2hlS2V5KHVybCxfMmE0LF8yYTUpXT1odHRwOworfQorZnVuY3Rpb24gZ2V0RnJvbUNhY2hlKHVybCxfMmE4LF8yYTkpeworcmV0dXJuIF8yOWZbZ2V0Q2FjaGVLZXkodXJsLF8yYTgsXzJhOSldOworfQordGhpcy5jbGVhckNhY2hlPWZ1bmN0aW9uKCl7CitfMjlmPXt9OworfTsKK2Z1bmN0aW9uIGRvTG9hZChfMmFhLGh0dHAsdXJsLF8yYWQsXzJhZSl7CitpZigoKGh0dHAuc3RhdHVzPj0yMDApJiYoaHR0cC5zdGF0dXM8MzAwKSl8fChodHRwLnN0YXR1cz09MzA0KXx8KGh0dHAuc3RhdHVzPT0xMjIzKXx8KGxvY2F0aW9uLnByb3RvY29sPT0iZmlsZToiJiYoaHR0cC5zdGF0dXM9PTB8fGh0dHAuc3RhdHVzPT11bmRlZmluZWQpKXx8KGxvY2F0aW9uLnByb3RvY29sPT0iY2hyb21lOiImJihodHRwLnN0YXR1cz09MHx8aHR0cC5zdGF0dXM9PXVuZGVmaW5lZCkpKXsKK3ZhciByZXQ7CitpZihfMmFhLm1ldGhvZC50b0xvd2VyQ2FzZSgpPT0iaGVhZCIpewordmFyIF8yYjA9aHR0cC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKK3JldD17fTsKK3JldC50b1N0cmluZz1mdW5jdGlvbigpeworcmV0dXJuIF8yYjA7Cit9OwordmFyIF8yYjE9XzJiMC5zcGxpdCgvW1xyXG5dKy9nKTsKK2Zvcih2YXIgaT0wO2k8XzJiMS5sZW5ndGg7aSsrKXsKK3ZhciBwYWlyPV8yYjFbaV0ubWF0Y2goL14oW146XSspXHMqOlxzKiguKykkL2kpOworaWYocGFpcil7CityZXRbcGFpclsxXV09cGFpclsyXTsKK30KK30KK31lbHNleworaWYoXzJhYS5taW1ldHlwZT09InRleHQvamF2YXNjcmlwdCIpewordHJ5eworcmV0PWRqX2V2YWwoaHR0cC5yZXNwb25zZVRleHQpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworZG9qby5kZWJ1ZyhodHRwLnJlc3BvbnNlVGV4dCk7CityZXQ9bnVsbDsKK30KK31lbHNleworaWYoXzJhYS5taW1ldHlwZS5zdWJzdHIoMCw5KT09InRleHQvanNvbiJ8fF8yYWEubWltZXR5cGUuc3Vic3RyKDAsMTYpPT0iYXBwbGljYXRpb24vanNvbiIpewordHJ5eworcmV0PWRqX2V2YWwoIigiK18yYWEuanNvbkZpbHRlcihodHRwLnJlc3BvbnNlVGV4dCkrIikiKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK2Rvam8uZGVidWcoaHR0cC5yZXNwb25zZVRleHQpOworcmV0PWZhbHNlOworfQorfWVsc2V7CitpZigoXzJhYS5taW1ldHlwZT09ImFwcGxpY2F0aW9uL3htbCIpfHwoXzJhYS5taW1ldHlwZT09InRleHQveG1sIikpeworcmV0PWh0dHAucmVzcG9uc2VYTUw7CitpZighcmV0fHx0eXBlb2YgcmV0PT0ic3RyaW5nInx8IWh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXsKK3JldD1kb2pvLmRvbS5jcmVhdGVEb2N1bWVudEZyb21UZXh0KGh0dHAucmVzcG9uc2VUZXh0KTsKK30KK31lbHNleworcmV0PWh0dHAucmVzcG9uc2VUZXh0OworfQorfQorfQorfQoraWYoXzJhZSl7CithZGRUb0NhY2hlKHVybCxfMmFkLF8yYWEubWV0aG9kLGh0dHApOworfQorXzJhYVsodHlwZW9mIF8yYWEubG9hZD09ImZ1bmN0aW9uIik/ImxvYWQiOiJoYW5kbGUiXSgibG9hZCIscmV0LGh0dHAsXzJhYSk7Cit9ZWxzZXsKK3ZhciBfMmI0PW5ldyBkb2pvLmlvLkVycm9yKCJYTUxIdHRwVHJhbnNwb3J0IEVycm9yOiAiK2h0dHAuc3RhdHVzKyIgIitodHRwLnN0YXR1c1RleHQpOworXzJhYVsodHlwZW9mIF8yYWEuZXJyb3I9PSJmdW5jdGlvbiIpPyJlcnJvciI6ImhhbmRsZSJdKCJlcnJvciIsXzJiNCxodHRwLF8yYWEpOworfQorfQorZnVuY3Rpb24gc2V0SGVhZGVycyhodHRwLF8yYjYpeworaWYoXzJiNlsiaGVhZGVycyJdKXsKK2Zvcih2YXIgXzJiNyBpbiBfMmI2WyJoZWFkZXJzIl0peworaWYoXzJiNy50b0xvd2VyQ2FzZSgpPT0iY29udGVudC10eXBlIiYmIV8yYjZbImNvbnRlbnRUeXBlIl0peworXzJiNlsiY29udGVudFR5cGUiXT1fMmI2WyJoZWFkZXJzIl1bXzJiN107Cit9ZWxzZXsKK2h0dHAuc2V0UmVxdWVzdEhlYWRlcihfMmI3LF8yYjZbImhlYWRlcnMiXVtfMmI3XSk7Cit9Cit9Cit9Cit9Cit0aGlzLmluRmxpZ2h0PVtdOwordGhpcy5pbkZsaWdodFRpbWVyPW51bGw7Cit0aGlzLnN0YXJ0V2F0Y2hpbmdJbkZsaWdodD1mdW5jdGlvbigpeworaWYoIXRoaXMuaW5GbGlnaHRUaW1lcil7Cit0aGlzLmluRmxpZ2h0VGltZXI9c2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLDEwKTsKK30KK307Cit0aGlzLndhdGNoSW5GbGlnaHQ9ZnVuY3Rpb24oKXsKK3ZhciBub3c9bnVsbDsKK2lmKCFkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMmJiFfMjllLl9ibG9ja0FzeW5jKXsKK2Zvcih2YXIgeD10aGlzLmluRmxpZ2h0Lmxlbmd0aC0xO3g+PTA7eC0tKXsKK3RyeXsKK3ZhciB0aWY9dGhpcy5pbkZsaWdodFt4XTsKK2lmKCF0aWZ8fHRpZi5odHRwLl9hYm9ydGVkfHwhdGlmLmh0dHAucmVhZHlTdGF0ZSl7Cit0aGlzLmluRmxpZ2h0LnNwbGljZSh4LDEpOworY29udGludWU7Cit9CitpZig0PT10aWYuaHR0cC5yZWFkeVN0YXRlKXsKK3RoaXMuaW5GbGlnaHQuc3BsaWNlKHgsMSk7Citkb0xvYWQodGlmLnJlcSx0aWYuaHR0cCx0aWYudXJsLHRpZi5xdWVyeSx0aWYudXNlQ2FjaGUpOworfWVsc2V7CitpZih0aWYuc3RhcnRUaW1lKXsKK2lmKCFub3cpeworbm93PShuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Cit9CitpZih0aWYuc3RhcnRUaW1lKyh0aWYucmVxLnRpbWVvdXRTZWNvbmRzKjEwMDApPG5vdyl7CitpZih0eXBlb2YgdGlmLmh0dHAuYWJvcnQ9PSJmdW5jdGlvbiIpewordGlmLmh0dHAuYWJvcnQoKTsKK30KK3RoaXMuaW5GbGlnaHQuc3BsaWNlKHgsMSk7Cit0aWYucmVxWyh0eXBlb2YgdGlmLnJlcS50aW1lb3V0PT0iZnVuY3Rpb24iKT8idGltZW91dCI6ImhhbmRsZSJdKCJ0aW1lb3V0IixudWxsLHRpZi5odHRwLHRpZi5yZXEpOworfQorfQorfQorfQorY2F0Y2goZSl7Cit0cnl7Cit2YXIgXzJiYj1uZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0IEVycm9yOiAiK2UpOwordGlmLnJlcVsodHlwZW9mIHRpZi5yZXEuZXJyb3I9PSJmdW5jdGlvbiIpPyJlcnJvciI6ImhhbmRsZSJdKCJlcnJvciIsXzJiYix0aWYuaHR0cCx0aWYucmVxKTsKK30KK2NhdGNoKGUyKXsKK2Rvam8uZGVidWcoIlhNTEh0dHBUcmFuc3BvcnQgZXJyb3IgY2FsbGJhY2sgZmFpbGVkOiAiK2UyKTsKK30KK30KK30KK30KK2NsZWFyVGltZW91dCh0aGlzLmluRmxpZ2h0VGltZXIpOworaWYodGhpcy5pbkZsaWdodC5sZW5ndGg9PTApewordGhpcy5pbkZsaWdodFRpbWVyPW51bGw7CityZXR1cm47Cit9Cit0aGlzLmluRmxpZ2h0VGltZXI9c2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLDEwKTsKK307Cit2YXIgXzJiYz1kb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCgpP3RydWU6ZmFsc2U7Cit0aGlzLmNhbkhhbmRsZT1mdW5jdGlvbihfMmJkKXsKK3ZhciBtbGM9XzJiZFsibWltZXR5cGUiXS50b0xvd2VyQ2FzZSgpfHwiIjsKK3JldHVybiBfMmJjJiYoKGRvam8ubGFuZy5pbkFycmF5KFsidGV4dC9wbGFpbiIsInRleHQvaHRtbCIsImFwcGxpY2F0aW9uL3htbCIsInRleHQveG1sIiwidGV4dC9qYXZhc2NyaXB0Il0sbWxjKSl8fChtbGMuc3Vic3RyKDAsOSk9PSJ0ZXh0L2pzb24ifHxtbGMuc3Vic3RyKDAsMTYpPT0iYXBwbGljYXRpb24vanNvbiIpKSYmIShfMmJkWyJmb3JtTm9kZSJdJiZkb2pvLmlvLmZvcm1IYXNGaWxlKF8yYmRbImZvcm1Ob2RlIl0pKTsKK307Cit0aGlzLm11bHRpcGFydEJvdW5kYXJ5PSI0NTMwOUZGRi1CRDY1LTRkNTAtOTlDOS0zNjk4Njg5NkE5NkYiOwordGhpcy5iaW5kPWZ1bmN0aW9uKF8yYmYpeworaWYoIV8yYmZbInVybCJdKXsKK2lmKCFfMmJmWyJmb3JtTm9kZSJdJiYoXzJiZlsiYmFja0J1dHRvbiJdfHxfMmJmWyJiYWNrIl18fF8yYmZbImNoYW5nZVVybCJdfHxfMmJmWyJ3YXRjaEZvclVSTCJdKSYmKCFkakNvbmZpZy5wcmV2ZW50QmFja0J1dHRvbkZpeCkpeworZG9qby5kZXByZWNhdGVkKCJVc2luZyBkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQuYmluZCgpIHRvIGFkZCB0byBicm93c2VyIGhpc3Rvcnkgd2l0aG91dCBkb2luZyBhbiBJTyByZXF1ZXN0IiwiVXNlIGRvam8udW5kby5icm93c2VyLmFkZFRvSGlzdG9yeSgpIGluc3RlYWQuIiwiMC40Iik7Citkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3RvcnkoXzJiZik7CityZXR1cm4gdHJ1ZTsKK30KK30KK3ZhciB1cmw9XzJiZi51cmw7Cit2YXIgXzJjMT0iIjsKK2lmKF8yYmZbImZvcm1Ob2RlIl0pewordmFyIHRhPV8yYmYuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTsKK2lmKCh0YSkmJighXzJiZlsidXJsIl0pKXsKK3VybD10YTsKK30KK3ZhciB0cD1fMmJmLmZvcm1Ob2RlLmdldEF0dHJpYnV0ZSgibWV0aG9kIik7CitpZigodHApJiYoIV8yYmZbIm1ldGhvZCJdKSl7CitfMmJmLm1ldGhvZD10cDsKK30KK18yYzErPWRvam8uaW8uZW5jb2RlRm9ybShfMmJmLmZvcm1Ob2RlLF8yYmYuZW5jb2RpbmcsXzJiZlsiZm9ybUZpbHRlciJdKTsKK30KK2lmKHVybC5pbmRleE9mKCIjIik+LTEpeworZG9qby5kZWJ1ZygiV2FybmluZzogZG9qby5pby5iaW5kOiBzdHJpcHBpbmcgaGFzaCB2YWx1ZXMgZnJvbSB1cmw6Iix1cmwpOwordXJsPXVybC5zcGxpdCgiIyIpWzBdOworfQoraWYoXzJiZlsiZmlsZSJdKXsKK18yYmYubWV0aG9kPSJwb3N0IjsKK30KK2lmKCFfMmJmWyJtZXRob2QiXSl7CitfMmJmLm1ldGhvZD0iZ2V0IjsKK30KK2lmKF8yYmYubWV0aG9kLnRvTG93ZXJDYXNlKCk9PSJnZXQiKXsKK18yYmYubXVsdGlwYXJ0PWZhbHNlOworfWVsc2V7CitpZihfMmJmWyJmaWxlIl0peworXzJiZi5tdWx0aXBhcnQ9dHJ1ZTsKK31lbHNleworaWYoIV8yYmZbIm11bHRpcGFydCJdKXsKK18yYmYubXVsdGlwYXJ0PWZhbHNlOworfQorfQorfQoraWYoXzJiZlsiYmFja0J1dHRvbiJdfHxfMmJmWyJiYWNrIl18fF8yYmZbImNoYW5nZVVybCJdKXsKK2Rvam8udW5kby5icm93c2VyLmFkZFRvSGlzdG9yeShfMmJmKTsKK30KK3ZhciBfMmM0PV8yYmZbImNvbnRlbnQiXXx8e307CitpZihfMmJmLnNlbmRUcmFuc3BvcnQpeworXzJjNFsiZG9qby50cmFuc3BvcnQiXT0ieG1saHR0cCI7Cit9Citkb3sKK2lmKF8yYmYucG9zdENvbnRlbnQpeworXzJjMT1fMmJmLnBvc3RDb250ZW50OworYnJlYWs7Cit9CitpZihfMmM0KXsKK18yYzErPWRvam8uaW8uYXJnc0Zyb21NYXAoXzJjNCxfMmJmLmVuY29kaW5nKTsKK30KK2lmKF8yYmYubWV0aG9kLnRvTG93ZXJDYXNlKCk9PSJnZXQifHwhXzJiZi5tdWx0aXBhcnQpeworYnJlYWs7Cit9Cit2YXIgdD1bXTsKK2lmKF8yYzEubGVuZ3RoKXsKK3ZhciBxPV8yYzEuc3BsaXQoIiYiKTsKK2Zvcih2YXIgaT0wO2k8cS5sZW5ndGg7KytpKXsKK2lmKHFbaV0ubGVuZ3RoKXsKK3ZhciBwPXFbaV0uc3BsaXQoIj0iKTsKK3QucHVzaCgiLS0iK3RoaXMubXVsdGlwYXJ0Qm91bmRhcnksIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiIrcFswXSsiXCIiLCIiLHBbMV0pOworfQorfQorfQoraWYoXzJiZi5maWxlKXsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF8yYmYuZmlsZSkpeworZm9yKHZhciBpPTA7aTxfMmJmLmZpbGUubGVuZ3RoOysraSl7Cit2YXIgbz1fMmJmLmZpbGVbaV07Cit0LnB1c2goIi0tIit0aGlzLm11bHRpcGFydEJvdW5kYXJ5LCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiK28ubmFtZSsiXCI7IGZpbGVuYW1lPVwiIisoImZpbGVOYW1lIiBpbiBvP28uZmlsZU5hbWU6by5uYW1lKSsiXCIiLCJDb250ZW50LVR5cGU6ICIrKCJjb250ZW50VHlwZSIgaW4gbz9vLmNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSwiIixvLmNvbnRlbnQpOworfQorfWVsc2V7Cit2YXIgbz1fMmJmLmZpbGU7Cit0LnB1c2goIi0tIit0aGlzLm11bHRpcGFydEJvdW5kYXJ5LCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiK28ubmFtZSsiXCI7IGZpbGVuYW1lPVwiIisoImZpbGVOYW1lIiBpbiBvP28uZmlsZU5hbWU6by5uYW1lKSsiXCIiLCJDb250ZW50LVR5cGU6ICIrKCJjb250ZW50VHlwZSIgaW4gbz9vLmNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSwiIixvLmNvbnRlbnQpOworfQorfQoraWYodC5sZW5ndGgpewordC5wdXNoKCItLSIrdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSsiLS0iLCIiKTsKK18yYzE9dC5qb2luKCJcclxuIik7Cit9Cit9d2hpbGUoZmFsc2UpOwordmFyIF8yY2E9XzJiZlsic3luYyJdP2ZhbHNlOnRydWU7Cit2YXIgXzJjYj1fMmJmWyJwcmV2ZW50Q2FjaGUiXXx8KHRoaXMucHJldmVudENhY2hlPT10cnVlJiZfMmJmWyJwcmV2ZW50Q2FjaGUiXSE9ZmFsc2UpOwordmFyIF8yY2M9XzJiZlsidXNlQ2FjaGUiXT09dHJ1ZXx8KHRoaXMudXNlQ2FjaGU9PXRydWUmJl8yYmZbInVzZUNhY2hlIl0hPWZhbHNlKTsKK2lmKCFfMmNiJiZfMmNjKXsKK3ZhciBfMmNkPWdldEZyb21DYWNoZSh1cmwsXzJjMSxfMmJmLm1ldGhvZCk7CitpZihfMmNkKXsKK2RvTG9hZChfMmJmLF8yY2QsdXJsLF8yYzEsZmFsc2UpOworcmV0dXJuOworfQorfQordmFyIGh0dHA9ZG9qby5ob3N0ZW52LmdldFhtbGh0dHBPYmplY3QoXzJiZik7Cit2YXIgXzJjZj1mYWxzZTsKK2lmKF8yY2EpewordmFyIF8yZDA9dGhpcy5pbkZsaWdodC5wdXNoKHsicmVxIjpfMmJmLCJodHRwIjpodHRwLCJ1cmwiOnVybCwicXVlcnkiOl8yYzEsInVzZUNhY2hlIjpfMmNjLCJzdGFydFRpbWUiOl8yYmYudGltZW91dFNlY29uZHM/KG5ldyBEYXRlKCkpLmdldFRpbWUoKTowfSk7Cit0aGlzLnN0YXJ0V2F0Y2hpbmdJbkZsaWdodCgpOworfWVsc2V7CitfMjllLl9ibG9ja0FzeW5jPXRydWU7Cit9CitpZihfMmJmLm1ldGhvZC50b0xvd2VyQ2FzZSgpPT0icG9zdCIpeworaWYoIV8yYmYudXNlcil7CitodHRwLm9wZW4oIlBPU1QiLHVybCxfMmNhKTsKK31lbHNleworaHR0cC5vcGVuKCJQT1NUIix1cmwsXzJjYSxfMmJmLnVzZXIsXzJiZi5wYXNzd29yZCk7Cit9CitzZXRIZWFkZXJzKGh0dHAsXzJiZik7CitodHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsXzJiZi5tdWx0aXBhcnQ/KCJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iK3RoaXMubXVsdGlwYXJ0Qm91bmRhcnkpOihfMmJmLmNvbnRlbnRUeXBlfHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikpOwordHJ5eworaHR0cC5zZW5kKF8yYzEpOworfQorY2F0Y2goZSl7CitpZih0eXBlb2YgaHR0cC5hYm9ydD09ImZ1bmN0aW9uIil7CitodHRwLmFib3J0KCk7Cit9Citkb0xvYWQoXzJiZix7c3RhdHVzOjQwNH0sdXJsLF8yYzEsXzJjYyk7Cit9Cit9ZWxzZXsKK3ZhciBfMmQxPXVybDsKK2lmKF8yYzEhPSIiKXsKK18yZDErPShfMmQxLmluZGV4T2YoIj8iKT4tMT8iJiI6Ij8iKStfMmMxOworfQoraWYoXzJjYil7CitfMmQxKz0oZG9qby5zdHJpbmcuZW5kc1dpdGhBbnkoXzJkMSwiPyIsIiYiKT8iIjooXzJkMS5pbmRleE9mKCI/Iik+LTE/IiYiOiI/IikpKyJkb2pvLnByZXZlbnRDYWNoZT0iK25ldyBEYXRlKCkudmFsdWVPZigpOworfQoraWYoIV8yYmYudXNlcil7CitodHRwLm9wZW4oXzJiZi5tZXRob2QudG9VcHBlckNhc2UoKSxfMmQxLF8yY2EpOworfWVsc2V7CitodHRwLm9wZW4oXzJiZi5tZXRob2QudG9VcHBlckNhc2UoKSxfMmQxLF8yY2EsXzJiZi51c2VyLF8yYmYucGFzc3dvcmQpOworfQorc2V0SGVhZGVycyhodHRwLF8yYmYpOwordHJ5eworaHR0cC5zZW5kKG51bGwpOworfQorY2F0Y2goZSl7CitpZih0eXBlb2YgaHR0cC5hYm9ydD09ImZ1bmN0aW9uIil7CitodHRwLmFib3J0KCk7Cit9Citkb0xvYWQoXzJiZix7c3RhdHVzOjQwNH0sdXJsLF8yYzEsXzJjYyk7Cit9Cit9CitpZighXzJjYSl7Citkb0xvYWQoXzJiZixodHRwLHVybCxfMmMxLF8yY2MpOworXzI5ZS5fYmxvY2tBc3luYz1mYWxzZTsKK30KK18yYmYuYWJvcnQ9ZnVuY3Rpb24oKXsKK3RyeXsKK2h0dHAuX2Fib3J0ZWQ9dHJ1ZTsKK30KK2NhdGNoKGUpeworfQorcmV0dXJuIGh0dHAuYWJvcnQoKTsKK307CityZXR1cm47Cit9OworZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCgiWE1MSFRUUFRyYW5zcG9ydCIpOworfTsKK30KK2Rvam8ucHJvdmlkZSgiZG9qby5pby5jb29raWUiKTsKK2Rvam8uaW8uY29va2llLnNldENvb2tpZT1mdW5jdGlvbihuYW1lLF8yZDMsZGF5cyxwYXRoLF8yZDYsXzJkNyl7Cit2YXIgXzJkOD0tMTsKK2lmKCh0eXBlb2YgZGF5cz09Im51bWJlciIpJiYoZGF5cz49MCkpewordmFyIGQ9bmV3IERhdGUoKTsKK2Quc2V0VGltZShkLmdldFRpbWUoKSsoZGF5cyoyNCo2MCo2MCoxMDAwKSk7CitfMmQ4PWQudG9HTVRTdHJpbmcoKTsKK30KK18yZDM9ZXNjYXBlKF8yZDMpOworZG9jdW1lbnQuY29va2llPW5hbWUrIj0iK18yZDMrIjsiKyhfMmQ4IT0tMT8iIGV4cGlyZXM9IitfMmQ4KyI7IjoiIikrKHBhdGg/InBhdGg9IitwYXRoOiIiKSsoXzJkNj8iOyBkb21haW49IitfMmQ2OiIiKSsoXzJkNz8iOyBzZWN1cmUiOiIiKTsKK307Citkb2pvLmlvLmNvb2tpZS5zZXQ9ZG9qby5pby5jb29raWUuc2V0Q29va2llOworZG9qby5pby5jb29raWUuZ2V0Q29va2llPWZ1bmN0aW9uKG5hbWUpewordmFyIGlkeD1kb2N1bWVudC5jb29raWUubGFzdEluZGV4T2YobmFtZSsiPSIpOworaWYoaWR4PT0tMSl7CityZXR1cm4gbnVsbDsKK30KK3ZhciBfMmRjPWRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoaWR4K25hbWUubGVuZ3RoKzEpOwordmFyIGVuZD1fMmRjLmluZGV4T2YoIjsiKTsKK2lmKGVuZD09LTEpeworZW5kPV8yZGMubGVuZ3RoOworfQorXzJkYz1fMmRjLnN1YnN0cmluZygwLGVuZCk7CitfMmRjPXVuZXNjYXBlKF8yZGMpOworcmV0dXJuIF8yZGM7Cit9OworZG9qby5pby5jb29raWUuZ2V0PWRvam8uaW8uY29va2llLmdldENvb2tpZTsKK2Rvam8uaW8uY29va2llLmRlbGV0ZUNvb2tpZT1mdW5jdGlvbihuYW1lKXsKK2Rvam8uaW8uY29va2llLnNldENvb2tpZShuYW1lLCItIiwwKTsKK307Citkb2pvLmlvLmNvb2tpZS5zZXRPYmplY3RDb29raWU9ZnVuY3Rpb24obmFtZSxvYmosZGF5cyxwYXRoLF8yZTMsXzJlNCxfMmU1KXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTUpeworXzJlNT1fMmUzOworXzJlMz1udWxsOworXzJlND1udWxsOworfQordmFyIF8yZTY9W10sXzJlNyxfMmU4PSIiOworaWYoIV8yZTUpeworXzJlNz1kb2pvLmlvLmNvb2tpZS5nZXRPYmplY3RDb29raWUobmFtZSk7Cit9CitpZihkYXlzPj0wKXsKK2lmKCFfMmU3KXsKK18yZTc9e307Cit9Citmb3IodmFyIHByb3AgaW4gb2JqKXsKK2lmKG9ialtwcm9wXT09bnVsbCl7CitkZWxldGUgXzJlN1twcm9wXTsKK31lbHNleworaWYoKHR5cGVvZiBvYmpbcHJvcF09PSJzdHJpbmciKXx8KHR5cGVvZiBvYmpbcHJvcF09PSJudW1iZXIiKSl7CitfMmU3W3Byb3BdPW9ialtwcm9wXTsKK30KK30KK30KK3Byb3A9bnVsbDsKK2Zvcih2YXIgcHJvcCBpbiBfMmU3KXsKK18yZTYucHVzaChlc2NhcGUocHJvcCkrIj0iK2VzY2FwZShfMmU3W3Byb3BdKSk7Cit9CitfMmU4PV8yZTYuam9pbigiJiIpOworfQorZG9qby5pby5jb29raWUuc2V0Q29va2llKG5hbWUsXzJlOCxkYXlzLHBhdGgsXzJlMyxfMmU0KTsKK307Citkb2pvLmlvLmNvb2tpZS5nZXRPYmplY3RDb29raWU9ZnVuY3Rpb24obmFtZSl7Cit2YXIgXzJlYj1udWxsLF8yZWM9ZG9qby5pby5jb29raWUuZ2V0Q29va2llKG5hbWUpOworaWYoXzJlYyl7CitfMmViPXt9OwordmFyIF8yZWQ9XzJlYy5zcGxpdCgiJiIpOworZm9yKHZhciBpPTA7aTxfMmVkLmxlbmd0aDtpKyspewordmFyIHBhaXI9XzJlZFtpXS5zcGxpdCgiPSIpOwordmFyIF8yZjA9cGFpclsxXTsKK2lmKGlzTmFOKF8yZjApKXsKK18yZjA9dW5lc2NhcGUocGFpclsxXSk7Cit9CitfMmViW3VuZXNjYXBlKHBhaXJbMF0pXT1fMmYwOworfQorfQorcmV0dXJuIF8yZWI7Cit9OworZG9qby5pby5jb29raWUuaXNTdXBwb3J0ZWQ9ZnVuY3Rpb24oKXsKK2lmKHR5cGVvZiBuYXZpZ2F0b3IuY29va2llRW5hYmxlZCE9ImJvb2xlYW4iKXsKK2Rvam8uaW8uY29va2llLnNldENvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iLCJDb29raWVzQWxsb3dlZCIsOTAsbnVsbCk7Cit2YXIgXzJmMT1kb2pvLmlvLmNvb2tpZS5nZXRDb29raWUoIl9fVGVzdGluZ1lvdXJCcm93c2VyRm9yQ29va2llU3VwcG9ydF9fIik7CituYXZpZ2F0b3IuY29va2llRW5hYmxlZD0oXzJmMT09IkNvb2tpZXNBbGxvd2VkIik7CitpZihuYXZpZ2F0b3IuY29va2llRW5hYmxlZCl7Cit0aGlzLmRlbGV0ZUNvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iKTsKK30KK30KK3JldHVybiBuYXZpZ2F0b3IuY29va2llRW5hYmxlZDsKK307CitpZighZG9qby5pby5jb29raWVzKXsKK2Rvam8uaW8uY29va2llcz1kb2pvLmlvLmNvb2tpZTsKK30KK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8uaW8uY29tbW9uIl0scmhpbm86WyJkb2pvLmlvLlJoaW5vSU8iXSxicm93c2VyOlsiZG9qby5pby5Ccm93c2VySU8iLCJkb2pvLmlvLmNvb2tpZSJdLGRhc2hib2FyZDpbImRvam8uaW8uQnJvd3NlcklPIiwiZG9qby5pby5jb29raWUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmlvLioiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC5jb21tb24iKTsKK2Rvam8uZXZlbnQ9bmV3IGZ1bmN0aW9uKCl7Cit0aGlzLl9jYW5UaW1lb3V0PWRvam8ubGFuZy5pc0Z1bmN0aW9uKGRqX2dsb2JhbFsic2V0VGltZW91dCJdKXx8ZG9qby5sYW5nLmlzQWxpZW4oZGpfZ2xvYmFsWyJzZXRUaW1lb3V0Il0pOworZnVuY3Rpb24gaW50ZXJwb2xhdGVBcmdzKGFyZ3MsXzJmMyl7Cit2YXIgZGw9ZG9qby5sYW5nOwordmFyIGFvPXtzcmNPYmo6ZGpfZ2xvYmFsLHNyY0Z1bmM6bnVsbCxhZHZpY2VPYmo6ZGpfZ2xvYmFsLGFkdmljZUZ1bmM6bnVsbCxhcm91bmRPYmo6bnVsbCxhcm91bmRGdW5jOm51bGwsYWR2aWNlVHlwZTooYXJncy5sZW5ndGg+Mik/YXJnc1swXToiYWZ0ZXIiLHByZWNlZGVuY2U6Imxhc3QiLG9uY2U6ZmFsc2UsZGVsYXk6bnVsbCxyYXRlOjAsYWR2aWNlTXNnOmZhbHNlLG1heENhbGxzOi0xfTsKK3N3aXRjaChhcmdzLmxlbmd0aCl7CitjYXNlIDA6CityZXR1cm47CitjYXNlIDE6CityZXR1cm47CitjYXNlIDI6Cithby5zcmNGdW5jPWFyZ3NbMF07Cithby5hZHZpY2VGdW5jPWFyZ3NbMV07CiticmVhazsKK2Nhc2UgMzoKK2lmKChkbC5pc09iamVjdChhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT0iYWZ0ZXIiOworYW8uc3JjT2JqPWFyZ3NbMF07Cithby5zcmNGdW5jPWFyZ3NbMV07Cithby5hZHZpY2VGdW5jPWFyZ3NbMl07Cit9ZWxzZXsKK2lmKChkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworYW8uc3JjRnVuYz1hcmdzWzFdOworYW8uYWR2aWNlRnVuYz1hcmdzWzJdOworfWVsc2V7CitpZigoZGwuaXNPYmplY3QoYXJnc1swXSkpJiYoZGwuaXNTdHJpbmcoYXJnc1sxXSkpJiYoZGwuaXNGdW5jdGlvbihhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT0iYWZ0ZXIiOworYW8uc3JjT2JqPWFyZ3NbMF07Cithby5zcmNGdW5jPWFyZ3NbMV07Cit2YXIgXzJmNj1kbC5uYW1lQW5vbkZ1bmMoYXJnc1syXSxhby5hZHZpY2VPYmosXzJmMyk7Cithby5hZHZpY2VGdW5jPV8yZjY7Cit9ZWxzZXsKK2lmKChkbC5pc0Z1bmN0aW9uKGFyZ3NbMF0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSl7Cithby5hZHZpY2VUeXBlPSJhZnRlciI7Cithby5zcmNPYmo9ZGpfZ2xvYmFsOwordmFyIF8yZjY9ZGwubmFtZUFub25GdW5jKGFyZ3NbMF0sYW8uc3JjT2JqLF8yZjMpOworYW8uc3JjRnVuYz1fMmY2OworYW8uYWR2aWNlT2JqPWFyZ3NbMV07Cithby5hZHZpY2VGdW5jPWFyZ3NbMl07Cit9Cit9Cit9Cit9CiticmVhazsKK2Nhc2UgNDoKK2lmKChkbC5pc09iamVjdChhcmdzWzBdKSkmJihkbC5pc09iamVjdChhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT0iYWZ0ZXIiOworYW8uc3JjT2JqPWFyZ3NbMF07Cithby5zcmNGdW5jPWFyZ3NbMV07Cithby5hZHZpY2VPYmo9YXJnc1syXTsKK2FvLmFkdmljZUZ1bmM9YXJnc1szXTsKK31lbHNleworaWYoKGRsLmlzU3RyaW5nKGFyZ3NbMF0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMV0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKSl7Cithby5hZHZpY2VUeXBlPWFyZ3NbMF07Cithby5zcmNPYmo9ZGpfZ2xvYmFsOworYW8uc3JjRnVuYz1hcmdzWzFdOworYW8uYWR2aWNlT2JqPWFyZ3NbMl07Cithby5hZHZpY2VGdW5jPWFyZ3NbM107Cit9ZWxzZXsKK2lmKChkbC5pc1N0cmluZyhhcmdzWzBdKSkmJihkbC5pc0Z1bmN0aW9uKGFyZ3NbMV0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKSl7Cithby5hZHZpY2VUeXBlPWFyZ3NbMF07Cithby5zcmNPYmo9ZGpfZ2xvYmFsOwordmFyIF8yZjY9ZGwubmFtZUFub25GdW5jKGFyZ3NbMV0sZGpfZ2xvYmFsLF8yZjMpOworYW8uc3JjRnVuYz1fMmY2OworYW8uYWR2aWNlT2JqPWFyZ3NbMl07Cithby5hZHZpY2VGdW5jPWFyZ3NbM107Cit9ZWxzZXsKK2lmKChkbC5pc1N0cmluZyhhcmdzWzBdKSkmJihkbC5pc09iamVjdChhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkmJihkbC5pc0Z1bmN0aW9uKGFyZ3NbM10pKSl7Cithby5zcmNPYmo9YXJnc1sxXTsKK2FvLnNyY0Z1bmM9YXJnc1syXTsKK3ZhciBfMmY2PWRsLm5hbWVBbm9uRnVuYyhhcmdzWzNdLGRqX2dsb2JhbCxfMmYzKTsKK2FvLmFkdmljZU9iaj1kal9nbG9iYWw7Cithby5hZHZpY2VGdW5jPV8yZjY7Cit9ZWxzZXsKK2lmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKXsKK2FvLnNyY09iaj1hcmdzWzFdOworYW8uc3JjRnVuYz1hcmdzWzJdOworYW8uYWR2aWNlT2JqPWRqX2dsb2JhbDsKK2FvLmFkdmljZUZ1bmM9YXJnc1szXTsKK31lbHNleworaWYoZGwuaXNPYmplY3QoYXJnc1syXSkpeworYW8uc3JjT2JqPWRqX2dsb2JhbDsKK2FvLnNyY0Z1bmM9YXJnc1sxXTsKK2FvLmFkdmljZU9iaj1hcmdzWzJdOworYW8uYWR2aWNlRnVuYz1hcmdzWzNdOworfWVsc2V7Cithby5zcmNPYmo9YW8uYWR2aWNlT2JqPWFvLmFyb3VuZE9iaj1kal9nbG9iYWw7Cithby5zcmNGdW5jPWFyZ3NbMV07Cithby5hZHZpY2VGdW5jPWFyZ3NbMl07Cithby5hcm91bmRGdW5jPWFyZ3NbM107Cit9Cit9Cit9Cit9Cit9Cit9CiticmVhazsKK2Nhc2UgNjoKK2FvLnNyY09iaj1hcmdzWzFdOworYW8uc3JjRnVuYz1hcmdzWzJdOworYW8uYWR2aWNlT2JqPWFyZ3NbM107Cithby5hZHZpY2VGdW5jPWFyZ3NbNF07Cithby5hcm91bmRGdW5jPWFyZ3NbNV07Cithby5hcm91bmRPYmo9ZGpfZ2xvYmFsOworYnJlYWs7CitkZWZhdWx0OgorYW8uc3JjT2JqPWFyZ3NbMV07Cithby5zcmNGdW5jPWFyZ3NbMl07Cithby5hZHZpY2VPYmo9YXJnc1szXTsKK2FvLmFkdmljZUZ1bmM9YXJnc1s0XTsKK2FvLmFyb3VuZE9iaj1hcmdzWzVdOworYW8uYXJvdW5kRnVuYz1hcmdzWzZdOworYW8ub25jZT1hcmdzWzddOworYW8uZGVsYXk9YXJnc1s4XTsKK2FvLnJhdGU9YXJnc1s5XTsKK2FvLmFkdmljZU1zZz1hcmdzWzEwXTsKK2FvLm1heENhbGxzPSghaXNOYU4ocGFyc2VJbnQoYXJnc1sxMV0pKSk/YXJnc1sxMV06LTE7CiticmVhazsKK30KK2lmKGRsLmlzRnVuY3Rpb24oYW8uYXJvdW5kRnVuYykpewordmFyIF8yZjY9ZGwubmFtZUFub25GdW5jKGFvLmFyb3VuZEZ1bmMsYW8uYXJvdW5kT2JqLF8yZjMpOworYW8uYXJvdW5kRnVuYz1fMmY2OworfQoraWYoZGwuaXNGdW5jdGlvbihhby5zcmNGdW5jKSl7Cithby5zcmNGdW5jPWRsLmdldE5hbWVJbk9iaihhby5zcmNPYmosYW8uc3JjRnVuYyk7Cit9CitpZihkbC5pc0Z1bmN0aW9uKGFvLmFkdmljZUZ1bmMpKXsKK2FvLmFkdmljZUZ1bmM9ZGwuZ2V0TmFtZUluT2JqKGFvLmFkdmljZU9iaixhby5hZHZpY2VGdW5jKTsKK30KK2lmKChhby5hcm91bmRPYmopJiYoZGwuaXNGdW5jdGlvbihhby5hcm91bmRGdW5jKSkpeworYW8uYXJvdW5kRnVuYz1kbC5nZXROYW1lSW5PYmooYW8uYXJvdW5kT2JqLGFvLmFyb3VuZEZ1bmMpOworfQoraWYoIWFvLnNyY09iail7Citkb2pvLnJhaXNlKCJiYWQgc3JjT2JqIGZvciBzcmNGdW5jOiAiK2FvLnNyY0Z1bmMpOworfQoraWYoIWFvLmFkdmljZU9iail7Citkb2pvLnJhaXNlKCJiYWQgYWR2aWNlT2JqIGZvciBhZHZpY2VGdW5jOiAiK2FvLmFkdmljZUZ1bmMpOworfQoraWYoIWFvLmFkdmljZUZ1bmMpeworZG9qby5kZWJ1ZygiYmFkIGFkdmljZUZ1bmMgZm9yIHNyY0Z1bmM6ICIrYW8uc3JjRnVuYyk7Citkb2pvLmRlYnVnU2hhbGxvdyhhbyk7Cit9CityZXR1cm4gYW87Cit9Cit0aGlzLmNvbm5lY3Q9ZnVuY3Rpb24oKXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpewordmFyIGFvPWFyZ3VtZW50c1swXTsKK31lbHNlewordmFyIGFvPWludGVycG9sYXRlQXJncyhhcmd1bWVudHMsdHJ1ZSk7Cit9CitpZihkb2pvLmxhbmcuaXNTdHJpbmcoYW8uc3JjRnVuYykmJihhby5zcmNGdW5jLnRvTG93ZXJDYXNlKCk9PSJvbmtleSIpKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworYW8uc3JjRnVuYz0ib25rZXlkb3duIjsKK3RoaXMuY29ubmVjdChhbyk7Cit9Cithby5zcmNGdW5jPSJvbmtleXByZXNzIjsKK30KK2lmKGRvam8ubGFuZy5pc0FycmF5KGFvLnNyY09iaikmJmFvLnNyY09iaiE9IiIpewordmFyIF8yZjg9e307Citmb3IodmFyIHggaW4gYW8peworXzJmOFt4XT1hb1t4XTsKK30KK3ZhciBtanBzPVtdOworZG9qby5sYW5nLmZvckVhY2goYW8uc3JjT2JqLGZ1bmN0aW9uKHNyYyl7CitpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ubGFuZy5pc1N0cmluZyhzcmMpKSl7CitzcmM9ZG9qby5ieUlkKHNyYyk7Cit9CitfMmY4LnNyY09iaj1zcmM7CittanBzLnB1c2goZG9qby5ldmVudC5jb25uZWN0LmNhbGwoZG9qby5ldmVudCxfMmY4KSk7Cit9KTsKK3JldHVybiBtanBzOworfQordmFyIG1qcD1kb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QoYW8uc3JjT2JqLGFvLnNyY0Z1bmMpOworaWYoYW8uYWR2aWNlRnVuYyl7Cit2YXIgbWpwMj1kb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QoYW8uYWR2aWNlT2JqLGFvLmFkdmljZUZ1bmMpOworfQorbWpwLmt3QWRkQWR2aWNlKGFvKTsKK3JldHVybiBtanA7Cit9OwordGhpcy5sb2c9ZnVuY3Rpb24oYTEsYTIpewordmFyIF8zMDA7CitpZigoYXJndW1lbnRzLmxlbmd0aD09MSkmJih0eXBlb2YgYTE9PSJvYmplY3QiKSl7CitfMzAwPWExOworfWVsc2V7CitfMzAwPXtzcmNPYmo6YTEsc3JjRnVuYzphMn07Cit9CitfMzAwLmFkdmljZUZ1bmM9ZnVuY3Rpb24oKXsKK3ZhciBfMzAxPVtdOworZm9yKHZhciB4PTA7eDxhcmd1bWVudHMubGVuZ3RoO3grKyl7CitfMzAxLnB1c2goYXJndW1lbnRzW3hdKTsKK30KK2Rvam8uZGVidWcoIigiK18zMDAuc3JjT2JqKyIpLiIrXzMwMC5zcmNGdW5jLCI6IixfMzAxLmpvaW4oIiwgIikpOworfTsKK3RoaXMua3dDb25uZWN0KF8zMDApOworfTsKK3RoaXMuY29ubmVjdEJlZm9yZT1mdW5jdGlvbigpewordmFyIGFyZ3M9WyJiZWZvcmUiXTsKK2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7Cit9CityZXR1cm4gdGhpcy5jb25uZWN0LmFwcGx5KHRoaXMsYXJncyk7Cit9OwordGhpcy5jb25uZWN0QXJvdW5kPWZ1bmN0aW9uKCl7Cit2YXIgYXJncz1bImFyb3VuZCJdOworZm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CithcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKK30KK3JldHVybiB0aGlzLmNvbm5lY3QuYXBwbHkodGhpcyxhcmdzKTsKK307Cit0aGlzLmNvbm5lY3RPbmNlPWZ1bmN0aW9uKCl7Cit2YXIgYW89aW50ZXJwb2xhdGVBcmdzKGFyZ3VtZW50cyx0cnVlKTsKK2FvLm9uY2U9dHJ1ZTsKK3JldHVybiB0aGlzLmNvbm5lY3QoYW8pOworfTsKK3RoaXMuY29ubmVjdFJ1bk9uY2U9ZnVuY3Rpb24oKXsKK3ZhciBhbz1pbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLHRydWUpOworYW8ubWF4Q2FsbHM9MTsKK3JldHVybiB0aGlzLmNvbm5lY3QoYW8pOworfTsKK3RoaXMuX2t3Q29ubmVjdEltcGw9ZnVuY3Rpb24oXzMwOSxfMzBhKXsKK3ZhciBmbj0oXzMwYSk/ImRpc2Nvbm5lY3QiOiJjb25uZWN0IjsKK2lmKHR5cGVvZiBfMzA5WyJzcmNGdW5jIl09PSJmdW5jdGlvbiIpeworXzMwOS5zcmNPYmo9XzMwOVsic3JjT2JqIl18fGRqX2dsb2JhbDsKK3ZhciBfMzBjPWRvam8ubGFuZy5uYW1lQW5vbkZ1bmMoXzMwOS5zcmNGdW5jLF8zMDkuc3JjT2JqLHRydWUpOworXzMwOS5zcmNGdW5jPV8zMGM7Cit9CitpZih0eXBlb2YgXzMwOVsiYWR2aWNlRnVuYyJdPT0iZnVuY3Rpb24iKXsKK18zMDkuYWR2aWNlT2JqPV8zMDlbImFkdmljZU9iaiJdfHxkal9nbG9iYWw7Cit2YXIgXzMwYz1kb2pvLmxhbmcubmFtZUFub25GdW5jKF8zMDkuYWR2aWNlRnVuYyxfMzA5LmFkdmljZU9iaix0cnVlKTsKK18zMDkuYWR2aWNlRnVuYz1fMzBjOworfQorXzMwOS5zcmNPYmo9XzMwOVsic3JjT2JqIl18fGRqX2dsb2JhbDsKK18zMDkuYWR2aWNlT2JqPV8zMDlbImFkdmljZU9iaiJdfHxfMzA5WyJ0YXJnZXRPYmoiXXx8ZGpfZ2xvYmFsOworXzMwOS5hZHZpY2VGdW5jPV8zMDlbImFkdmljZUZ1bmMiXXx8XzMwOVsidGFyZ2V0RnVuYyJdOworcmV0dXJuIGRvam8uZXZlbnRbZm5dKF8zMDkpOworfTsKK3RoaXMua3dDb25uZWN0PWZ1bmN0aW9uKF8zMGQpeworcmV0dXJuIHRoaXMuX2t3Q29ubmVjdEltcGwoXzMwZCxmYWxzZSk7Cit9OwordGhpcy5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7CitpZihhcmd1bWVudHMubGVuZ3RoPT0xKXsKK3ZhciBhbz1hcmd1bWVudHNbMF07Cit9ZWxzZXsKK3ZhciBhbz1pbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLHRydWUpOworfQoraWYoIWFvLmFkdmljZUZ1bmMpeworcmV0dXJuOworfQoraWYoZG9qby5sYW5nLmlzU3RyaW5nKGFvLnNyY0Z1bmMpJiYoYW8uc3JjRnVuYy50b0xvd2VyQ2FzZSgpPT0ib25rZXkiKSl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2FvLnNyY0Z1bmM9Im9ua2V5ZG93biI7Cit0aGlzLmRpc2Nvbm5lY3QoYW8pOworfQorYW8uc3JjRnVuYz0ib25rZXlwcmVzcyI7Cit9CitpZighYW8uc3JjT2JqW2FvLnNyY0Z1bmNdKXsKK3JldHVybiBudWxsOworfQordmFyIG1qcD1kb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QoYW8uc3JjT2JqLGFvLnNyY0Z1bmMsdHJ1ZSk7CittanAucmVtb3ZlQWR2aWNlKGFvLmFkdmljZU9iaixhby5hZHZpY2VGdW5jLGFvLmFkdmljZVR5cGUsYW8ub25jZSk7CityZXR1cm4gbWpwOworfTsKK3RoaXMua3dEaXNjb25uZWN0PWZ1bmN0aW9uKF8zMTApeworcmV0dXJuIHRoaXMuX2t3Q29ubmVjdEltcGwoXzMxMCx0cnVlKTsKK307Cit9OworZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uPWZ1bmN0aW9uKF8zMTEsb2JqLGFyZ3MpewordGhpcy5qcF89XzMxMTsKK3RoaXMub2JqZWN0PW9iajsKK3RoaXMuYXJncz1bXTsKK2Zvcih2YXIgeD0wO3g8YXJncy5sZW5ndGg7eCsrKXsKK3RoaXMuYXJnc1t4XT1hcmdzW3hdOworfQordGhpcy5hcm91bmRfaW5kZXg9LTE7Cit9OworZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uLnByb3RvdHlwZS5wcm9jZWVkPWZ1bmN0aW9uKCl7Cit0aGlzLmFyb3VuZF9pbmRleCsrOworaWYodGhpcy5hcm91bmRfaW5kZXg+PXRoaXMuanBfLmFyb3VuZC5sZW5ndGgpeworcmV0dXJuIHRoaXMuanBfLm9iamVjdFt0aGlzLmpwXy5tZXRob2RuYW1lXS5hcHBseSh0aGlzLmpwXy5vYmplY3QsdGhpcy5hcmdzKTsKK31lbHNlewordmFyIHRpPXRoaXMuanBfLmFyb3VuZFt0aGlzLmFyb3VuZF9pbmRleF07Cit2YXIgbW9iaj10aVswXXx8ZGpfZ2xvYmFsOwordmFyIG1ldGg9dGlbMV07CityZXR1cm4gbW9ialttZXRoXS5jYWxsKG1vYmosdGhpcyk7Cit9Cit9OworZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQ9ZnVuY3Rpb24ob2JqLF8zMTkpewordGhpcy5vYmplY3Q9b2JqfHxkal9nbG9iYWw7Cit0aGlzLm1ldGhvZG5hbWU9XzMxOTsKK3RoaXMubWV0aG9kZnVuYz10aGlzLm9iamVjdFtfMzE5XTsKK3RoaXMuc3F1ZWxjaD1mYWxzZTsKK307Citkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2Q9ZnVuY3Rpb24ob2JqLF8zMWIpeworaWYoIW9iail7CitvYmo9ZGpfZ2xvYmFsOworfQordmFyIG9mbj1vYmpbXzMxYl07CitpZighb2ZuKXsKK29mbj1vYmpbXzMxYl09ZnVuY3Rpb24oKXsKK307CitpZighb2JqW18zMWJdKXsKK2Rvam8ucmFpc2UoIkNhbm5vdCBzZXQgZG8tbm90aGluZyBtZXRob2Qgb24gdGhhdCBvYmplY3QgIitfMzFiKTsKK30KK31lbHNleworaWYoKHR5cGVvZiBvZm4hPSJmdW5jdGlvbiIpJiYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKG9mbikpJiYoIWRvam8ubGFuZy5pc0FsaWVuKG9mbikpKXsKK3JldHVybiBudWxsOworfQorfQordmFyIF8zMWQ9XzMxYisiJGpvaW5wb2ludCI7Cit2YXIgXzMxZT1fMzFiKyIkam9pbnBvaW50JG1ldGhvZCI7Cit2YXIgXzMxZj1vYmpbXzMxZF07CitpZighXzMxZil7Cit2YXIgXzMyMD1mYWxzZTsKK2lmKGRvam8uZXZlbnRbImJyb3dzZXIiXSl7CitpZigob2JqWyJhdHRhY2hFdmVudCJdKXx8KG9ialsibm9kZVR5cGUiXSl8fChvYmpbImFkZEV2ZW50TGlzdGVuZXIiXSkpeworXzMyMD10cnVlOworZG9qby5ldmVudC5icm93c2VyLmFkZENsb2JiZXJOb2RlQXR0cnMob2JqLFtfMzFkLF8zMWUsXzMxYl0pOworfQorfQordmFyIF8zMjE9b2ZuLmxlbmd0aDsKK29ialtfMzFlXT1vZm47CitfMzFmPW9ialtfMzFkXT1uZXcgZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQob2JqLF8zMWUpOworaWYoIV8zMjApeworb2JqW18zMWJdPWZ1bmN0aW9uKCl7CityZXR1cm4gXzMxZi5ydW4uYXBwbHkoXzMxZixhcmd1bWVudHMpOworfTsKK31lbHNleworb2JqW18zMWJdPWZ1bmN0aW9uKCl7Cit2YXIgYXJncz1bXTsKK2lmKCFhcmd1bWVudHMubGVuZ3RoKXsKK3ZhciBldnQ9bnVsbDsKK3RyeXsKK2lmKG9iai5vd25lckRvY3VtZW50KXsKK2V2dD1vYmoub3duZXJEb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7Cit9ZWxzZXsKK2lmKG9iai5kb2N1bWVudEVsZW1lbnQpeworZXZ0PW9iai5kb2N1bWVudEVsZW1lbnQub3duZXJEb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7Cit9ZWxzZXsKK2lmKG9iai5ldmVudCl7CitldnQ9b2JqLmV2ZW50OworfWVsc2V7CitldnQ9d2luZG93LmV2ZW50OworfQorfQorfQorfQorY2F0Y2goZSl7CitldnQ9d2luZG93LmV2ZW50OworfQoraWYoZXZ0KXsKK2FyZ3MucHVzaChkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LHRoaXMpKTsKK30KK31lbHNleworZm9yKHZhciB4PTA7eDxhcmd1bWVudHMubGVuZ3RoO3grKyl7CitpZigoeD09MCkmJihkb2pvLmV2ZW50LmJyb3dzZXIuaXNFdmVudChhcmd1bWVudHNbeF0pKSl7CithcmdzLnB1c2goZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGFyZ3VtZW50c1t4XSx0aGlzKSk7Cit9ZWxzZXsKK2FyZ3MucHVzaChhcmd1bWVudHNbeF0pOworfQorfQorfQorcmV0dXJuIF8zMWYucnVuLmFwcGx5KF8zMWYsYXJncyk7Cit9OworfQorb2JqW18zMWJdLl9fcHJlSm9pbkFyaXR5PV8zMjE7Cit9CityZXR1cm4gXzMxZjsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LHtzcXVlbGNoOmZhbHNlLHVuaW50ZXJjZXB0OmZ1bmN0aW9uKCl7Cit0aGlzLm9iamVjdFt0aGlzLm1ldGhvZG5hbWVdPXRoaXMubWV0aG9kZnVuYzsKK3RoaXMuYmVmb3JlPVtdOwordGhpcy5hZnRlcj1bXTsKK3RoaXMuYXJvdW5kPVtdOworfSxkaXNjb25uZWN0OmRvam8ubGFuZy5mb3J3YXJkKCJ1bmludGVyY2VwdCIpLHJ1bjpmdW5jdGlvbigpewordmFyIG9iaj10aGlzLm9iamVjdHx8ZGpfZ2xvYmFsOwordmFyIGFyZ3M9YXJndW1lbnRzOwordmFyIF8zMjc9W107Citmb3IodmFyIHg9MDt4PGFyZ3MubGVuZ3RoO3grKyl7CitfMzI3W3hdPWFyZ3NbeF07Cit9Cit2YXIgXzMyOT1mdW5jdGlvbihtYXJyKXsKK2lmKCFtYXJyKXsKK2Rvam8uZGVidWcoIk51bGwgYXJndW1lbnQgdG8gdW5yb2xsQWR2aWNlKCkiKTsKK3JldHVybjsKK30KK3ZhciBfMzJiPW1hcnJbMF18fGRqX2dsb2JhbDsKK3ZhciBfMzJjPW1hcnJbMV07CitpZighXzMyYltfMzJjXSl7Citkb2pvLnJhaXNlKCJmdW5jdGlvbiBcIiIrXzMyYysiXCIgZG9lcyBub3QgZXhpc3Qgb24gXCIiK18zMmIrIlwiIik7Cit9Cit2YXIgXzMyZD1tYXJyWzJdfHxkal9nbG9iYWw7Cit2YXIgXzMyZT1tYXJyWzNdOwordmFyIG1zZz1tYXJyWzZdOwordmFyIF8zMzA9bWFycls3XTsKK2lmKF8zMzA+LTEpeworaWYoXzMzMD09MCl7CityZXR1cm47Cit9CittYXJyWzddLS07Cit9Cit2YXIgXzMzMTsKK3ZhciB0bz17YXJnczpbXSxqcF86dGhpcyxvYmplY3Q6b2JqLHByb2NlZWQ6ZnVuY3Rpb24oKXsKK3JldHVybiBfMzJiW18zMmNdLmFwcGx5KF8zMmIsdG8uYXJncyk7Cit9fTsKK3RvLmFyZ3M9XzMyNzsKK3ZhciBfMzMzPXBhcnNlSW50KG1hcnJbNF0pOwordmFyIF8zMzQ9KCghaXNOYU4oXzMzMykpJiYobWFycls0XSE9PW51bGwpJiYodHlwZW9mIG1hcnJbNF0hPSJ1bmRlZmluZWQiKSk7CitpZihtYXJyWzVdKXsKK3ZhciByYXRlPXBhcnNlSW50KG1hcnJbNV0pOwordmFyIGN1cj1uZXcgRGF0ZSgpOwordmFyIF8zMzc9ZmFsc2U7CitpZigobWFyclsibGFzdCJdKSYmKChjdXItbWFyci5sYXN0KTw9cmF0ZSkpeworaWYoZG9qby5ldmVudC5fY2FuVGltZW91dCl7CitpZihtYXJyWyJkZWxheVRpbWVyIl0peworY2xlYXJUaW1lb3V0KG1hcnIuZGVsYXlUaW1lcik7Cit9Cit2YXIgdG9kPXBhcnNlSW50KHJhdGUqMik7Cit2YXIgbWNweT1kb2pvLmxhbmcuc2hhbGxvd0NvcHkobWFycik7CittYXJyLmRlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpeworbWNweVs1XT0wOworXzMyOShtY3B5KTsKK30sdG9kKTsKK30KK3JldHVybjsKK31lbHNleworbWFyci5sYXN0PWN1cjsKK30KK30KK2lmKF8zMmUpeworXzMyZFtfMzJlXS5jYWxsKF8zMmQsdG8pOworfWVsc2V7CitpZigoXzMzNCkmJigoZG9qby5yZW5kZXIuaHRtbCl8fChkb2pvLnJlbmRlci5zdmcpKSl7Citkal9nbG9iYWxbInNldFRpbWVvdXQiXShmdW5jdGlvbigpeworaWYobXNnKXsKK18zMmJbXzMyY10uY2FsbChfMzJiLHRvKTsKK31lbHNleworXzMyYltfMzJjXS5hcHBseShfMzJiLGFyZ3MpOworfQorfSxfMzMzKTsKK31lbHNleworaWYobXNnKXsKK18zMmJbXzMyY10uY2FsbChfMzJiLHRvKTsKK31lbHNleworXzMyYltfMzJjXS5hcHBseShfMzJiLGFyZ3MpOworfQorfQorfQorfTsKK3ZhciBfMzNhPWZ1bmN0aW9uKCl7CitpZih0aGlzLnNxdWVsY2gpewordHJ5eworcmV0dXJuIF8zMjkuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfWVsc2V7CityZXR1cm4gXzMyOS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9Cit9OworaWYoKHRoaXNbImJlZm9yZSJdKSYmKHRoaXMuYmVmb3JlLmxlbmd0aD4wKSl7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmJlZm9yZS5jb25jYXQobmV3IEFycmF5KCkpLF8zM2EpOworfQordmFyIF8zM2I7Cit0cnl7CitpZigodGhpc1siYXJvdW5kIl0pJiYodGhpcy5hcm91bmQubGVuZ3RoPjApKXsKK3ZhciBtaT1uZXcgZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uKHRoaXMsb2JqLGFyZ3MpOworXzMzYj1taS5wcm9jZWVkKCk7Cit9ZWxzZXsKK2lmKHRoaXMubWV0aG9kZnVuYyl7CitfMzNiPXRoaXMub2JqZWN0W3RoaXMubWV0aG9kbmFtZV0uYXBwbHkodGhpcy5vYmplY3QsYXJncyk7Cit9Cit9Cit9CitjYXRjaChlKXsKK2lmKCF0aGlzLnNxdWVsY2gpeworZG9qby5kZWJ1ZyhlLCJ3aGVuIGNhbGxpbmciLHRoaXMubWV0aG9kbmFtZSwib24iLHRoaXMub2JqZWN0LCJ3aXRoIGFyZ3VtZW50cyIsYXJncyk7Citkb2pvLnJhaXNlKGUpOworfQorfQoraWYoKHRoaXNbImFmdGVyIl0pJiYodGhpcy5hZnRlci5sZW5ndGg+MCkpeworZG9qby5sYW5nLmZvckVhY2godGhpcy5hZnRlci5jb25jYXQobmV3IEFycmF5KCkpLF8zM2EpOworfQorcmV0dXJuICh0aGlzLm1ldGhvZGZ1bmMpP18zM2I6bnVsbDsKK30sZ2V0QXJyOmZ1bmN0aW9uKGtpbmQpewordmFyIHR5cGU9ImFmdGVyIjsKK2lmKCh0eXBlb2Yga2luZD09InN0cmluZyIpJiYoa2luZC5pbmRleE9mKCJiZWZvcmUiKSE9LTEpKXsKK3R5cGU9ImJlZm9yZSI7Cit9ZWxzZXsKK2lmKGtpbmQ9PSJhcm91bmQiKXsKK3R5cGU9ImFyb3VuZCI7Cit9Cit9CitpZighdGhpc1t0eXBlXSl7Cit0aGlzW3R5cGVdPVtdOworfQorcmV0dXJuIHRoaXNbdHlwZV07Cit9LGt3QWRkQWR2aWNlOmZ1bmN0aW9uKGFyZ3MpewordGhpcy5hZGRBZHZpY2UoYXJnc1siYWR2aWNlT2JqIl0sYXJnc1siYWR2aWNlRnVuYyJdLGFyZ3NbImFyb3VuZE9iaiJdLGFyZ3NbImFyb3VuZEZ1bmMiXSxhcmdzWyJhZHZpY2VUeXBlIl0sYXJnc1sicHJlY2VkZW5jZSJdLGFyZ3NbIm9uY2UiXSxhcmdzWyJkZWxheSJdLGFyZ3NbInJhdGUiXSxhcmdzWyJhZHZpY2VNc2ciXSxhcmdzWyJtYXhDYWxscyJdKTsKK30sYWRkQWR2aWNlOmZ1bmN0aW9uKF8zNDAsXzM0MSxfMzQyLF8zNDMsXzM0NCxfMzQ1LG9uY2UsXzM0NyxyYXRlLF8zNDksXzM0YSl7Cit2YXIgYXJyPXRoaXMuZ2V0QXJyKF8zNDQpOworaWYoIWFycil7Citkb2pvLnJhaXNlKCJiYWQgdGhpczogIit0aGlzKTsKK30KK3ZhciBhbz1bXzM0MCxfMzQxLF8zNDIsXzM0MyxfMzQ3LHJhdGUsXzM0OSxfMzRhXTsKK2lmKG9uY2UpeworaWYodGhpcy5oYXNBZHZpY2UoXzM0MCxfMzQxLF8zNDQsYXJyKT49MCl7CityZXR1cm47Cit9Cit9CitpZihfMzQ1PT0iZmlyc3QiKXsKK2Fyci51bnNoaWZ0KGFvKTsKK31lbHNleworYXJyLnB1c2goYW8pOworfQorfSxoYXNBZHZpY2U6ZnVuY3Rpb24oXzM0ZCxfMzRlLF8zNGYsYXJyKXsKK2lmKCFhcnIpeworYXJyPXRoaXMuZ2V0QXJyKF8zNGYpOworfQordmFyIGluZD0tMTsKK2Zvcih2YXIgeD0wO3g8YXJyLmxlbmd0aDt4KyspewordmFyIGFhbz0odHlwZW9mIF8zNGU9PSJvYmplY3QiKT8obmV3IFN0cmluZyhfMzRlKSkudG9TdHJpbmcoKTpfMzRlOwordmFyIGExbz0odHlwZW9mIGFyclt4XVsxXT09Im9iamVjdCIpPyhuZXcgU3RyaW5nKGFyclt4XVsxXSkpLnRvU3RyaW5nKCk6YXJyW3hdWzFdOworaWYoKGFyclt4XVswXT09XzM0ZCkmJihhMW89PWFhbykpeworaW5kPXg7Cit9Cit9CityZXR1cm4gaW5kOworfSxyZW1vdmVBZHZpY2U6ZnVuY3Rpb24oXzM1NSxfMzU2LF8zNTcsb25jZSl7Cit2YXIgYXJyPXRoaXMuZ2V0QXJyKF8zNTcpOwordmFyIGluZD10aGlzLmhhc0FkdmljZShfMzU1LF8zNTYsXzM1NyxhcnIpOworaWYoaW5kPT0tMSl7CityZXR1cm4gZmFsc2U7Cit9Cit3aGlsZShpbmQhPS0xKXsKK2Fyci5zcGxpY2UoaW5kLDEpOworaWYob25jZSl7CiticmVhazsKK30KK2luZD10aGlzLmhhc0FkdmljZShfMzU1LF8zNTYsXzM1NyxhcnIpOworfQorcmV0dXJuIHRydWU7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQudG9waWMiKTsKK2Rvam8uZXZlbnQudG9waWM9bmV3IGZ1bmN0aW9uKCl7Cit0aGlzLnRvcGljcz17fTsKK3RoaXMuZ2V0VG9waWM9ZnVuY3Rpb24oXzM1Yil7CitpZighdGhpcy50b3BpY3NbXzM1Yl0pewordGhpcy50b3BpY3NbXzM1Yl09bmV3IHRoaXMuVG9waWNJbXBsKF8zNWIpOworfQorcmV0dXJuIHRoaXMudG9waWNzW18zNWJdOworfTsKK3RoaXMucmVnaXN0ZXJQdWJsaXNoZXI9ZnVuY3Rpb24oXzM1YyxvYmosXzM1ZSl7Cit2YXIgXzM1Yz10aGlzLmdldFRvcGljKF8zNWMpOworXzM1Yy5yZWdpc3RlclB1Ymxpc2hlcihvYmosXzM1ZSk7Cit9OwordGhpcy5zdWJzY3JpYmU9ZnVuY3Rpb24oXzM1ZixvYmosXzM2MSl7Cit2YXIgXzM1Zj10aGlzLmdldFRvcGljKF8zNWYpOworXzM1Zi5zdWJzY3JpYmUob2JqLF8zNjEpOworfTsKK3RoaXMudW5zdWJzY3JpYmU9ZnVuY3Rpb24oXzM2MixvYmosXzM2NCl7Cit2YXIgXzM2Mj10aGlzLmdldFRvcGljKF8zNjIpOworXzM2Mi51bnN1YnNjcmliZShvYmosXzM2NCk7Cit9OwordGhpcy5kZXN0cm95PWZ1bmN0aW9uKF8zNjUpewordGhpcy5nZXRUb3BpYyhfMzY1KS5kZXN0cm95KCk7CitkZWxldGUgdGhpcy50b3BpY3NbXzM2NV07Cit9OwordGhpcy5wdWJsaXNoQXBwbHk9ZnVuY3Rpb24oXzM2NixhcmdzKXsKK3ZhciBfMzY2PXRoaXMuZ2V0VG9waWMoXzM2Nik7CitfMzY2LnNlbmRNZXNzYWdlLmFwcGx5KF8zNjYsYXJncyk7Cit9OwordGhpcy5wdWJsaXNoPWZ1bmN0aW9uKF8zNjgsXzM2OSl7Cit2YXIgXzM2OD10aGlzLmdldFRvcGljKF8zNjgpOwordmFyIGFyZ3M9W107Citmb3IodmFyIHg9MTt4PGFyZ3VtZW50cy5sZW5ndGg7eCsrKXsKK2FyZ3MucHVzaChhcmd1bWVudHNbeF0pOworfQorXzM2OC5zZW5kTWVzc2FnZS5hcHBseShfMzY4LGFyZ3MpOworfTsKK307Citkb2pvLmV2ZW50LnRvcGljLlRvcGljSW1wbD1mdW5jdGlvbihfMzZjKXsKK3RoaXMudG9waWNOYW1lPV8zNmM7Cit0aGlzLnN1YnNjcmliZT1mdW5jdGlvbihfMzZkLF8zNmUpewordmFyIHRmPV8zNmV8fF8zNmQ7Cit2YXIgdG89KCFfMzZlKT9kal9nbG9iYWw6XzM2ZDsKK3JldHVybiBkb2pvLmV2ZW50Lmt3Q29ubmVjdCh7c3JjT2JqOnRoaXMsc3JjRnVuYzoic2VuZE1lc3NhZ2UiLGFkdmljZU9iajp0byxhZHZpY2VGdW5jOnRmfSk7Cit9OwordGhpcy51bnN1YnNjcmliZT1mdW5jdGlvbihfMzcxLF8zNzIpewordmFyIHRmPSghXzM3Mik/XzM3MTpfMzcyOwordmFyIHRvPSghXzM3Mik/bnVsbDpfMzcxOworcmV0dXJuIGRvam8uZXZlbnQua3dEaXNjb25uZWN0KHtzcmNPYmo6dGhpcyxzcmNGdW5jOiJzZW5kTWVzc2FnZSIsYWR2aWNlT2JqOnRvLGFkdmljZUZ1bmM6dGZ9KTsKK307Cit0aGlzLl9nZXRKb2luUG9pbnQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QodGhpcywic2VuZE1lc3NhZ2UiKTsKK307Cit0aGlzLnNldFNxdWVsY2g9ZnVuY3Rpb24oXzM3NSl7Cit0aGlzLl9nZXRKb2luUG9pbnQoKS5zcXVlbGNoPV8zNzU7Cit9OwordGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Cit0aGlzLl9nZXRKb2luUG9pbnQoKS5kaXNjb25uZWN0KCk7Cit9OwordGhpcy5yZWdpc3RlclB1Ymxpc2hlcj1mdW5jdGlvbihfMzc2LF8zNzcpeworZG9qby5ldmVudC5jb25uZWN0KF8zNzYsXzM3Nyx0aGlzLCJzZW5kTWVzc2FnZSIpOworfTsKK3RoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oXzM3OCl7Cit9OworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC5icm93c2VyIik7Citkb2pvLl9pZV9jbG9iYmVyPW5ldyBmdW5jdGlvbigpewordGhpcy5jbG9iYmVyTm9kZXM9W107CitmdW5jdGlvbiBudWtlUHJvcChub2RlLHByb3ApewordHJ5eworbm9kZVtwcm9wXT1udWxsOworfQorY2F0Y2goZSl7Cit9Cit0cnl7CitkZWxldGUgbm9kZVtwcm9wXTsKK30KK2NhdGNoKGUpeworfQordHJ5eworbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7Cit9CitjYXRjaChlKXsKK30KK30KK3RoaXMuY2xvYmJlcj1mdW5jdGlvbihfMzdiKXsKK3ZhciBuYTsKK3ZhciB0bmE7CitpZihfMzdiKXsKK3RuYT1fMzdiLmFsbHx8XzM3Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworbmE9W18zN2JdOworZm9yKHZhciB4PTA7eDx0bmEubGVuZ3RoO3grKyl7CitpZih0bmFbeF1bIl9fZG9DbG9iYmVyX18iXSl7CituYS5wdXNoKHRuYVt4XSk7Cit9Cit9Cit9ZWxzZXsKK3RyeXsKK3dpbmRvdy5vbmxvYWQ9bnVsbDsKK30KK2NhdGNoKGUpeworfQorbmE9KHRoaXMuY2xvYmJlck5vZGVzLmxlbmd0aCk/dGhpcy5jbG9iYmVyTm9kZXM6ZG9jdW1lbnQuYWxsOworfQordG5hPW51bGw7Cit2YXIgXzM3Zj17fTsKK2Zvcih2YXIgaT1uYS5sZW5ndGgtMTtpPj0wO2k9aS0xKXsKK3ZhciBlbD1uYVtpXTsKK3RyeXsKK2lmKGVsJiZlbFsiX19jbG9iYmVyQXR0cnNfXyJdKXsKK2Zvcih2YXIgaj0wO2o8ZWwuX19jbG9iYmVyQXR0cnNfXy5sZW5ndGg7aisrKXsKK251a2VQcm9wKGVsLGVsLl9fY2xvYmJlckF0dHJzX19bal0pOworfQorbnVrZVByb3AoZWwsIl9fY2xvYmJlckF0dHJzX18iKTsKK251a2VQcm9wKGVsLCJfX2RvQ2xvYmJlcl9fIik7Cit9Cit9CitjYXRjaChlKXsKK30KK30KK25hPW51bGw7Cit9OworfTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9qby5hZGRPblVubG9hZChmdW5jdGlvbigpeworZG9qby5faWVfY2xvYmJlci5jbG9iYmVyKCk7Cit0cnl7CitpZigoZG9qb1sid2lkZ2V0Il0pJiYoZG9qby53aWRnZXRbIm1hbmFnZXIiXSkpeworZG9qby53aWRnZXQubWFuYWdlci5kZXN0cm95QWxsKCk7Cit9Cit9CitjYXRjaChlKXsKK30KK2lmKGRvam8ud2lkZ2V0KXsKK2Zvcih2YXIgbmFtZSBpbiBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZSl7CitpZihkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVtuYW1lXS5ub2RlKXsKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlKGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGUpOworZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZT1udWxsOworZGVsZXRlIGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGU7Cit9Cit9Cit9Cit0cnl7Cit3aW5kb3cub25sb2FkPW51bGw7Cit9CitjYXRjaChlKXsKK30KK3RyeXsKK3dpbmRvdy5vbnVubG9hZD1udWxsOworfQorY2F0Y2goZSl7Cit9Citkb2pvLl9pZV9jbG9iYmVyLmNsb2JiZXJOb2Rlcz1bXTsKK30pOworfQorZG9qby5ldmVudC5icm93c2VyPW5ldyBmdW5jdGlvbigpewordmFyIF8zODQ9MDsKK3RoaXMubm9ybWFsaXplZEV2ZW50TmFtZT1mdW5jdGlvbihfMzg1KXsKK3N3aXRjaChfMzg1KXsKK2Nhc2UgIkNoZWNrYm94U3RhdGVDaGFuZ2UiOgorY2FzZSAiRE9NQXR0ck1vZGlmaWVkIjoKK2Nhc2UgIkRPTU1lbnVJdGVtQWN0aXZlIjoKK2Nhc2UgIkRPTU1lbnVJdGVtSW5hY3RpdmUiOgorY2FzZSAiRE9NTW91c2VTY3JvbGwiOgorY2FzZSAiRE9NTm9kZUluc2VydGVkIjoKK2Nhc2UgIkRPTU5vZGVSZW1vdmVkIjoKK2Nhc2UgIlJhZGlvU3RhdGVDaGFuZ2UiOgorcmV0dXJuIF8zODU7CiticmVhazsKK2RlZmF1bHQ6Cit2YXIgbGNuPV8zODUudG9Mb3dlckNhc2UoKTsKK3JldHVybiAobGNuLmluZGV4T2YoIm9uIik9PTApP2xjbi5zdWJzdHIoMik6bGNuOworYnJlYWs7Cit9Cit9OwordGhpcy5jbGVhbj1mdW5jdGlvbihub2RlKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9qby5faWVfY2xvYmJlci5jbG9iYmVyKG5vZGUpOworfQorfTsKK3RoaXMuYWRkQ2xvYmJlck5vZGU9ZnVuY3Rpb24obm9kZSl7CitpZighZG9qby5yZW5kZXIuaHRtbC5pZSl7CityZXR1cm47Cit9CitpZighbm9kZVsiX19kb0Nsb2JiZXJfXyJdKXsKK25vZGUuX19kb0Nsb2JiZXJfXz10cnVlOworZG9qby5faWVfY2xvYmJlci5jbG9iYmVyTm9kZXMucHVzaChub2RlKTsKK25vZGUuX19jbG9iYmVyQXR0cnNfXz1bXTsKK30KK307Cit0aGlzLmFkZENsb2JiZXJOb2RlQXR0cnM9ZnVuY3Rpb24obm9kZSxfMzhhKXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLmllKXsKK3JldHVybjsKK30KK3RoaXMuYWRkQ2xvYmJlck5vZGUobm9kZSk7Citmb3IodmFyIHg9MDt4PF8zOGEubGVuZ3RoO3grKyl7Citub2RlLl9fY2xvYmJlckF0dHJzX18ucHVzaChfMzhhW3hdKTsKK30KK307Cit0aGlzLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKG5vZGUsXzM4ZCxmcCxfMzhmKXsKK2lmKCFfMzhmKXsKK3ZhciBfMzhmPWZhbHNlOworfQorXzM4ZD1kb2pvLmV2ZW50LmJyb3dzZXIubm9ybWFsaXplZEV2ZW50TmFtZShfMzhkKTsKK2lmKF8zOGQ9PSJrZXkiKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpewordGhpcy5yZW1vdmVMaXN0ZW5lcihub2RlLCJvbmtleWRvd24iLGZwLF8zOGYpOworfQorXzM4ZD0ia2V5cHJlc3MiOworfQoraWYobm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKXsKK25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihfMzhkLGZwLF8zOGYpOworfQorfTsKK3RoaXMuYWRkTGlzdGVuZXI9ZnVuY3Rpb24obm9kZSxfMzkxLGZwLF8zOTMsXzM5NCl7CitpZighbm9kZSl7CityZXR1cm47Cit9CitpZighXzM5Myl7Cit2YXIgXzM5Mz1mYWxzZTsKK30KK18zOTE9ZG9qby5ldmVudC5icm93c2VyLm5vcm1hbGl6ZWRFdmVudE5hbWUoXzM5MSk7CitpZihfMzkxPT0ia2V5Iil7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK3RoaXMuYWRkTGlzdGVuZXIobm9kZSwib25rZXlkb3duIixmcCxfMzkzLF8zOTQpOworfQorXzM5MT0ia2V5cHJlc3MiOworfQoraWYoIV8zOTQpewordmFyIF8zOTU9ZnVuY3Rpb24oZXZ0KXsKK2lmKCFldnQpeworZXZ0PXdpbmRvdy5ldmVudDsKK30KK3ZhciByZXQ9ZnAoZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCx0aGlzKSk7CitpZihfMzkzKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK30KK3JldHVybiByZXQ7Cit9OworfWVsc2V7CitfMzk1PWZwOworfQoraWYobm9kZS5hZGRFdmVudExpc3RlbmVyKXsKK25vZGUuYWRkRXZlbnRMaXN0ZW5lcihfMzkxLF8zOTUsXzM5Myk7CityZXR1cm4gXzM5NTsKK31lbHNleworXzM5MT0ib24iK18zOTE7CitpZih0eXBlb2Ygbm9kZVtfMzkxXT09ImZ1bmN0aW9uIil7Cit2YXIgXzM5OD1ub2RlW18zOTFdOworbm9kZVtfMzkxXT1mdW5jdGlvbihlKXsKK18zOTgoZSk7CityZXR1cm4gXzM5NShlKTsKK307Cit9ZWxzZXsKK25vZGVbXzM5MV09XzM5NTsKK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpewordGhpcy5hZGRDbG9iYmVyTm9kZUF0dHJzKG5vZGUsW18zOTFdKTsKK30KK3JldHVybiBfMzk1OworfQorfTsKK3RoaXMuaXNFdmVudD1mdW5jdGlvbihvYmopeworcmV0dXJuICh0eXBlb2Ygb2JqIT0idW5kZWZpbmVkIikmJihvYmopJiYodHlwZW9mIEV2ZW50IT0idW5kZWZpbmVkIikmJihvYmouZXZlbnRQaGFzZSk7Cit9OwordGhpcy5jdXJyZW50RXZlbnQ9bnVsbDsKK3RoaXMuY2FsbExpc3RlbmVyPWZ1bmN0aW9uKF8zOWIsXzM5Yyl7CitpZih0eXBlb2YgXzM5YiE9ImZ1bmN0aW9uIil7Citkb2pvLnJhaXNlKCJsaXN0ZW5lciBub3QgYSBmdW5jdGlvbjogIitfMzliKTsKK30KK2Rvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQuY3VycmVudFRhcmdldD1fMzljOworcmV0dXJuIF8zOWIuY2FsbChfMzljLGRvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQpOworfTsKK3RoaXMuX3N0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpeworZG9qby5ldmVudC5icm93c2VyLmN1cnJlbnRFdmVudC5jYW5jZWxCdWJibGU9dHJ1ZTsKK307Cit0aGlzLl9wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpeworZG9qby5ldmVudC5icm93c2VyLmN1cnJlbnRFdmVudC5yZXR1cm5WYWx1ZT1mYWxzZTsKK307Cit0aGlzLmtleXM9e0tFWV9CQUNLU1BBQ0U6OCxLRVlfVEFCOjksS0VZX0NMRUFSOjEyLEtFWV9FTlRFUjoxMyxLRVlfU0hJRlQ6MTYsS0VZX0NUUkw6MTcsS0VZX0FMVDoxOCxLRVlfUEFVU0U6MTksS0VZX0NBUFNfTE9DSzoyMCxLRVlfRVNDQVBFOjI3LEtFWV9TUEFDRTozMixLRVlfUEFHRV9VUDozMyxLRVlfUEFHRV9ET1dOOjM0LEtFWV9FTkQ6MzUsS0VZX0hPTUU6MzYsS0VZX0xFRlRfQVJST1c6MzcsS0VZX1VQX0FSUk9XOjM4LEtFWV9SSUdIVF9BUlJPVzozOSxLRVlfRE9XTl9BUlJPVzo0MCxLRVlfSU5TRVJUOjQ1LEtFWV9ERUxFVEU6NDYsS0VZX0hFTFA6NDcsS0VZX0xFRlRfV0lORE9XOjkxLEtFWV9SSUdIVF9XSU5ET1c6OTIsS0VZX1NFTEVDVDo5MyxLRVlfTlVNUEFEXzA6OTYsS0VZX05VTVBBRF8xOjk3LEtFWV9OVU1QQURfMjo5OCxLRVlfTlVNUEFEXzM6OTksS0VZX05VTVBBRF80OjEwMCxLRVlfTlVNUEFEXzU6MTAxLEtFWV9OVU1QQURfNjoxMDIsS0VZX05VTVBBRF83OjEwMyxLRVlfTlVNUEFEXzg6MTA0LEtFWV9OVU1QQURfOToxMDUsS0VZX05VTVBBRF9NVUxUSVBMWToxMDYsS0VZX05VTVBBRF9QTFVTOjEwNyxLRVlfTlVNUEFEX0VOVEVSOjEwOCxLRVlfTlVNUEFEX01JTlVTOjEwOSxLRVlfTlVNUEFEX1BFUklPRDoxMTAsS0VZX05VTVBBRF9ESVZJREU6MTExLEtFWV9GMToxMTIsS0VZX0YyOjExMyxLRVlfRjM6MTE0LEtFWV9GNDoxMTUsS0VZX0Y1OjExNixLRVlfRjY6MTE3LEtFWV9GNzoxMTgsS0VZX0Y4OjExOSxLRVlfRjk6MTIwLEtFWV9GMTA6MTIxLEtFWV9GMTE6MTIyLEtFWV9GMTI6MTIzLEtFWV9GMTM6MTI0LEtFWV9GMTQ6MTI1LEtFWV9GMTU6MTI2LEtFWV9OVU1fTE9DSzoxNDQsS0VZX1NDUk9MTF9MT0NLOjE0NX07Cit0aGlzLnJldktleXM9W107Citmb3IodmFyIGtleSBpbiB0aGlzLmtleXMpewordGhpcy5yZXZLZXlzW3RoaXMua2V5c1trZXldXT1rZXk7Cit9Cit0aGlzLmZpeEV2ZW50PWZ1bmN0aW9uKGV2dCxfMzlmKXsKK2lmKCFldnQpeworaWYod2luZG93WyJldmVudCJdKXsKK2V2dD13aW5kb3cuZXZlbnQ7Cit9Cit9CitpZigoZXZ0WyJ0eXBlIl0pJiYoZXZ0WyJ0eXBlIl0uaW5kZXhPZigia2V5Iik9PTApKXsKK2V2dC5rZXlzPXRoaXMucmV2S2V5czsKK2Zvcih2YXIga2V5IGluIHRoaXMua2V5cyl7CitldnRba2V5XT10aGlzLmtleXNba2V5XTsKK30KK2lmKGV2dFsidHlwZSJdPT0ia2V5ZG93biImJmRvam8ucmVuZGVyLmh0bWwuaWUpeworc3dpdGNoKGV2dC5rZXlDb2RlKXsKK2Nhc2UgZXZ0LktFWV9TSElGVDoKK2Nhc2UgZXZ0LktFWV9DVFJMOgorY2FzZSBldnQuS0VZX0FMVDoKK2Nhc2UgZXZ0LktFWV9DQVBTX0xPQ0s6CitjYXNlIGV2dC5LRVlfTEVGVF9XSU5ET1c6CitjYXNlIGV2dC5LRVlfUklHSFRfV0lORE9XOgorY2FzZSBldnQuS0VZX1NFTEVDVDoKK2Nhc2UgZXZ0LktFWV9OVU1fTE9DSzoKK2Nhc2UgZXZ0LktFWV9TQ1JPTExfTE9DSzoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfMDoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfMToKK2Nhc2UgZXZ0LktFWV9OVU1QQURfMjoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfMzoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfNDoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfNToKK2Nhc2UgZXZ0LktFWV9OVU1QQURfNjoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfNzoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfODoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfOToKK2Nhc2UgZXZ0LktFWV9OVU1QQURfUEVSSU9EOgorYnJlYWs7CitjYXNlIGV2dC5LRVlfTlVNUEFEX01VTFRJUExZOgorY2FzZSBldnQuS0VZX05VTVBBRF9QTFVTOgorY2FzZSBldnQuS0VZX05VTVBBRF9FTlRFUjoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfTUlOVVM6CitjYXNlIGV2dC5LRVlfTlVNUEFEX0RJVklERToKK2JyZWFrOworY2FzZSBldnQuS0VZX1BBVVNFOgorY2FzZSBldnQuS0VZX1RBQjoKK2Nhc2UgZXZ0LktFWV9CQUNLU1BBQ0U6CitjYXNlIGV2dC5LRVlfRU5URVI6CitjYXNlIGV2dC5LRVlfRVNDQVBFOgorY2FzZSBldnQuS0VZX1BBR0VfVVA6CitjYXNlIGV2dC5LRVlfUEFHRV9ET1dOOgorY2FzZSBldnQuS0VZX0VORDoKK2Nhc2UgZXZ0LktFWV9IT01FOgorY2FzZSBldnQuS0VZX0xFRlRfQVJST1c6CitjYXNlIGV2dC5LRVlfVVBfQVJST1c6CitjYXNlIGV2dC5LRVlfUklHSFRfQVJST1c6CitjYXNlIGV2dC5LRVlfRE9XTl9BUlJPVzoKK2Nhc2UgZXZ0LktFWV9JTlNFUlQ6CitjYXNlIGV2dC5LRVlfREVMRVRFOgorY2FzZSBldnQuS0VZX0YxOgorY2FzZSBldnQuS0VZX0YyOgorY2FzZSBldnQuS0VZX0YzOgorY2FzZSBldnQuS0VZX0Y0OgorY2FzZSBldnQuS0VZX0Y1OgorY2FzZSBldnQuS0VZX0Y2OgorY2FzZSBldnQuS0VZX0Y3OgorY2FzZSBldnQuS0VZX0Y4OgorY2FzZSBldnQuS0VZX0Y5OgorY2FzZSBldnQuS0VZX0YxMDoKK2Nhc2UgZXZ0LktFWV9GMTE6CitjYXNlIGV2dC5LRVlfRjEyOgorY2FzZSBldnQuS0VZX0YxMjoKK2Nhc2UgZXZ0LktFWV9GMTM6CitjYXNlIGV2dC5LRVlfRjE0OgorY2FzZSBldnQuS0VZX0YxNToKK2Nhc2UgZXZ0LktFWV9DTEVBUjoKK2Nhc2UgZXZ0LktFWV9IRUxQOgorZXZ0LmtleT1ldnQua2V5Q29kZTsKK2JyZWFrOworZGVmYXVsdDoKK2lmKGV2dC5jdHJsS2V5fHxldnQuYWx0S2V5KXsKK3ZhciBfM2ExPWV2dC5rZXlDb2RlOworaWYoXzNhMT49NjUmJl8zYTE8PTkwJiZldnQuc2hpZnRLZXk9PWZhbHNlKXsKK18zYTErPTMyOworfQoraWYoXzNhMT49MSYmXzNhMTw9MjYmJmV2dC5jdHJsS2V5KXsKK18zYTErPTk2OworfQorZXZ0LmtleT1TdHJpbmcuZnJvbUNoYXJDb2RlKF8zYTEpOworfQorfQorfWVsc2V7CitpZihldnRbInR5cGUiXT09ImtleXByZXNzIil7CitpZihkb2pvLnJlbmRlci5odG1sLm9wZXJhKXsKK2lmKGV2dC53aGljaD09MCl7CitldnQua2V5PWV2dC5rZXlDb2RlOworfWVsc2V7CitpZihldnQud2hpY2g+MCl7Citzd2l0Y2goZXZ0LndoaWNoKXsKK2Nhc2UgZXZ0LktFWV9TSElGVDoKK2Nhc2UgZXZ0LktFWV9DVFJMOgorY2FzZSBldnQuS0VZX0FMVDoKK2Nhc2UgZXZ0LktFWV9DQVBTX0xPQ0s6CitjYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CitjYXNlIGV2dC5LRVlfU0NST0xMX0xPQ0s6CiticmVhazsKK2Nhc2UgZXZ0LktFWV9QQVVTRToKK2Nhc2UgZXZ0LktFWV9UQUI6CitjYXNlIGV2dC5LRVlfQkFDS1NQQUNFOgorY2FzZSBldnQuS0VZX0VOVEVSOgorY2FzZSBldnQuS0VZX0VTQ0FQRToKK2V2dC5rZXk9ZXZ0LndoaWNoOworYnJlYWs7CitkZWZhdWx0OgordmFyIF8zYTE9ZXZ0LndoaWNoOworaWYoKGV2dC5jdHJsS2V5fHxldnQuYWx0S2V5fHxldnQubWV0YUtleSkmJihldnQud2hpY2g+PTY1JiZldnQud2hpY2g8PTkwJiZldnQuc2hpZnRLZXk9PWZhbHNlKSl7CitfM2ExKz0zMjsKK30KK2V2dC5rZXk9U3RyaW5nLmZyb21DaGFyQ29kZShfM2ExKTsKK30KK30KK30KK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CitpZighZXZ0LmN0cmxLZXkmJiFldnQuYWx0S2V5JiZldnQua2V5Q29kZT49ZXZ0LktFWV9TUEFDRSl7CitldnQua2V5PVN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmtleUNvZGUpOworfQorfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLnNhZmFyaSl7Citzd2l0Y2goZXZ0LmtleUNvZGUpeworY2FzZSAyNToKK2V2dC5rZXk9ZXZ0LktFWV9UQUI7CitldnQuc2hpZnQ9dHJ1ZTsKK2JyZWFrOworY2FzZSA2MzIzMjoKK2V2dC5rZXk9ZXZ0LktFWV9VUF9BUlJPVzsKK2JyZWFrOworY2FzZSA2MzIzMzoKK2V2dC5rZXk9ZXZ0LktFWV9ET1dOX0FSUk9XOworYnJlYWs7CitjYXNlIDYzMjM0OgorZXZ0LmtleT1ldnQuS0VZX0xFRlRfQVJST1c7CiticmVhazsKK2Nhc2UgNjMyMzU6CitldnQua2V5PWV2dC5LRVlfUklHSFRfQVJST1c7CiticmVhazsKK2Nhc2UgNjMyMzY6CitldnQua2V5PWV2dC5LRVlfRjE7CiticmVhazsKK2Nhc2UgNjMyMzc6CitldnQua2V5PWV2dC5LRVlfRjI7CiticmVhazsKK2Nhc2UgNjMyMzg6CitldnQua2V5PWV2dC5LRVlfRjM7CiticmVhazsKK2Nhc2UgNjMyMzk6CitldnQua2V5PWV2dC5LRVlfRjQ7CiticmVhazsKK2Nhc2UgNjMyNDA6CitldnQua2V5PWV2dC5LRVlfRjU7CiticmVhazsKK2Nhc2UgNjMyNDE6CitldnQua2V5PWV2dC5LRVlfRjY7CiticmVhazsKK2Nhc2UgNjMyNDI6CitldnQua2V5PWV2dC5LRVlfRjc7CiticmVhazsKK2Nhc2UgNjMyNDM6CitldnQua2V5PWV2dC5LRVlfRjg7CiticmVhazsKK2Nhc2UgNjMyNDQ6CitldnQua2V5PWV2dC5LRVlfRjk7CiticmVhazsKK2Nhc2UgNjMyNDU6CitldnQua2V5PWV2dC5LRVlfRjEwOworYnJlYWs7CitjYXNlIDYzMjQ2OgorZXZ0LmtleT1ldnQuS0VZX0YxMTsKK2JyZWFrOworY2FzZSA2MzI0NzoKK2V2dC5rZXk9ZXZ0LktFWV9GMTI7CiticmVhazsKK2Nhc2UgNjMyNTA6CitldnQua2V5PWV2dC5LRVlfUEFVU0U7CiticmVhazsKK2Nhc2UgNjMyNzI6CitldnQua2V5PWV2dC5LRVlfREVMRVRFOworYnJlYWs7CitjYXNlIDYzMjczOgorZXZ0LmtleT1ldnQuS0VZX0hPTUU7CiticmVhazsKK2Nhc2UgNjMyNzU6CitldnQua2V5PWV2dC5LRVlfRU5EOworYnJlYWs7CitjYXNlIDYzMjc2OgorZXZ0LmtleT1ldnQuS0VZX1BBR0VfVVA7CiticmVhazsKK2Nhc2UgNjMyNzc6CitldnQua2V5PWV2dC5LRVlfUEFHRV9ET1dOOworYnJlYWs7CitjYXNlIDYzMzAyOgorZXZ0LmtleT1ldnQuS0VZX0lOU0VSVDsKK2JyZWFrOworY2FzZSA2MzI0ODoKK2Nhc2UgNjMyNDk6CitjYXNlIDYzMjg5OgorYnJlYWs7CitkZWZhdWx0OgorZXZ0LmtleT1ldnQuY2hhckNvZGU+PWV2dC5LRVlfU1BBQ0U/U3RyaW5nLmZyb21DaGFyQ29kZShldnQuY2hhckNvZGUpOmV2dC5rZXlDb2RlOworfQorfWVsc2V7CitldnQua2V5PWV2dC5jaGFyQ29kZT4wP1N0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmNoYXJDb2RlKTpldnQua2V5Q29kZTsKK30KK30KK30KK30KK30KK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworaWYoIWV2dC50YXJnZXQpeworZXZ0LnRhcmdldD1ldnQuc3JjRWxlbWVudDsKK30KK2lmKCFldnQuY3VycmVudFRhcmdldCl7CitldnQuY3VycmVudFRhcmdldD0oXzM5Zj9fMzlmOmV2dC5zcmNFbGVtZW50KTsKK30KK2lmKCFldnQubGF5ZXJYKXsKK2V2dC5sYXllclg9ZXZ0Lm9mZnNldFg7Cit9CitpZighZXZ0LmxheWVyWSl7CitldnQubGF5ZXJZPWV2dC5vZmZzZXRZOworfQordmFyIGRvYz0oZXZ0LnNyY0VsZW1lbnQmJmV2dC5zcmNFbGVtZW50Lm93bmVyRG9jdW1lbnQpP2V2dC5zcmNFbGVtZW50Lm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ7Cit2YXIgXzNhMz0oKGRvam8ucmVuZGVyLmh0bWwuaWU1NSl8fChkb2NbImNvbXBhdE1vZGUiXT09IkJhY2tDb21wYXQiKSk/ZG9jLmJvZHk6ZG9jLmRvY3VtZW50RWxlbWVudDsKK2lmKCFldnQucGFnZVgpeworZXZ0LnBhZ2VYPWV2dC5jbGllbnRYKyhfM2EzLnNjcm9sbExlZnR8fDApOworfQoraWYoIWV2dC5wYWdlWSl7CitldnQucGFnZVk9ZXZ0LmNsaWVudFkrKF8zYTMuc2Nyb2xsVG9wfHwwKTsKK30KK2lmKGV2dC50eXBlPT0ibW91c2VvdmVyIil7CitldnQucmVsYXRlZFRhcmdldD1ldnQuZnJvbUVsZW1lbnQ7Cit9CitpZihldnQudHlwZT09Im1vdXNlb3V0Iil7CitldnQucmVsYXRlZFRhcmdldD1ldnQudG9FbGVtZW50OworfQordGhpcy5jdXJyZW50RXZlbnQ9ZXZ0OworZXZ0LmNhbGxMaXN0ZW5lcj10aGlzLmNhbGxMaXN0ZW5lcjsKK2V2dC5zdG9wUHJvcGFnYXRpb249dGhpcy5fc3RvcFByb3BhZ2F0aW9uOworZXZ0LnByZXZlbnREZWZhdWx0PXRoaXMuX3ByZXZlbnREZWZhdWx0OworfQorcmV0dXJuIGV2dDsKK307Cit0aGlzLnN0b3BFdmVudD1mdW5jdGlvbihldnQpeworaWYod2luZG93LmV2ZW50KXsKK2V2dC5jYW5jZWxCdWJibGU9dHJ1ZTsKK2V2dC5yZXR1cm5WYWx1ZT1mYWxzZTsKK31lbHNleworZXZ0LnByZXZlbnREZWZhdWx0KCk7CitldnQuc3RvcFByb3BhZ2F0aW9uKCk7Cit9Cit9OworfTsKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8uZXZlbnQuY29tbW9uIiwiZG9qby5ldmVudC50b3BpYyJdLGJyb3dzZXI6WyJkb2pvLmV2ZW50LmJyb3dzZXIiXSxkYXNoYm9hcmQ6WyJkb2pvLmV2ZW50LmJyb3dzZXIiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8uZ2Z4LmNvbG9yLkNvbG9yPWZ1bmN0aW9uKHIsZyxiLGEpeworaWYoZG9qby5sYW5nLmlzQXJyYXkocikpewordGhpcy5yPXJbMF07Cit0aGlzLmc9clsxXTsKK3RoaXMuYj1yWzJdOwordGhpcy5hPXJbM118fDE7Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhyKSl7Cit2YXIgcmdiPWRvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0Iocik7Cit0aGlzLnI9cmdiWzBdOwordGhpcy5nPXJnYlsxXTsKK3RoaXMuYj1yZ2JbMl07Cit0aGlzLmE9Z3x8MTsKK31lbHNleworaWYociBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKK3RoaXMucj1yLnI7Cit0aGlzLmI9ci5iOwordGhpcy5nPXIuZzsKK3RoaXMuYT1yLmE7Cit9ZWxzZXsKK3RoaXMucj1yOwordGhpcy5nPWc7Cit0aGlzLmI9YjsKK3RoaXMuYT1hOworfQorfQorfQorfTsKK2Rvam8uZ2Z4LmNvbG9yLkNvbG9yLmZyb21BcnJheT1mdW5jdGlvbihhcnIpeworcmV0dXJuIG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihhcnJbMF0sYXJyWzFdLGFyclsyXSxhcnJbM10pOworfTsKK2Rvam8uZXh0ZW5kKGRvam8uZ2Z4LmNvbG9yLkNvbG9yLHt0b1JnYjpmdW5jdGlvbihfM2FiKXsKK2lmKF8zYWIpeworcmV0dXJuIHRoaXMudG9SZ2JhKCk7Cit9ZWxzZXsKK3JldHVybiBbdGhpcy5yLHRoaXMuZyx0aGlzLmJdOworfQorfSx0b1JnYmE6ZnVuY3Rpb24oKXsKK3JldHVybiBbdGhpcy5yLHRoaXMuZyx0aGlzLmIsdGhpcy5hXTsKK30sdG9IZXg6ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4KHRoaXMudG9SZ2IoKSk7Cit9LHRvQ3NzOmZ1bmN0aW9uKCl7CityZXR1cm4gInJnYigiK3RoaXMudG9SZ2IoKS5qb2luKCkrIikiOworfSx0b1N0cmluZzpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudG9IZXgoKTsKK30sYmxlbmQ6ZnVuY3Rpb24oXzNhYyxfM2FkKXsKK3ZhciByZ2I9bnVsbDsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF8zYWMpKXsKK3JnYj1fM2FjOworfWVsc2V7CitpZihfM2FjIGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpeworcmdiPV8zYWMudG9SZ2IoKTsKK31lbHNleworcmdiPW5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihfM2FjKS50b1JnYigpOworfQorfQorcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmJsZW5kKHRoaXMudG9SZ2IoKSxyZ2IsXzNhZCk7Cit9fSk7Citkb2pvLmdmeC5jb2xvci5uYW1lZD17d2hpdGU6WzI1NSwyNTUsMjU1XSxibGFjazpbMCwwLDBdLHJlZDpbMjU1LDAsMF0sZ3JlZW46WzAsMjU1LDBdLGxpbWU6WzAsMjU1LDBdLGJsdWU6WzAsMCwyNTVdLG5hdnk6WzAsMCwxMjhdLGdyYXk6WzEyOCwxMjgsMTI4XSxzaWx2ZXI6WzE5MiwxOTIsMTkyXX07Citkb2pvLmdmeC5jb2xvci5ibGVuZD1mdW5jdGlvbihhLGIsXzNiMSl7CitpZih0eXBlb2YgYT09InN0cmluZyIpeworcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmJsZW5kSGV4KGEsYixfM2IxKTsKK30KK2lmKCFfM2IxKXsKK18zYjE9MDsKK30KK18zYjE9TWF0aC5taW4oTWF0aC5tYXgoLTEsXzNiMSksMSk7CitfM2IxPSgoXzNiMSsxKS8yKTsKK3ZhciBjPVtdOworZm9yKHZhciB4PTA7eDwzO3grKyl7CitjW3hdPXBhcnNlSW50KGJbeF0rKChhW3hdLWJbeF0pKl8zYjEpKTsKK30KK3JldHVybiBjOworfTsKK2Rvam8uZ2Z4LmNvbG9yLmJsZW5kSGV4PWZ1bmN0aW9uKGEsYixfM2I2KXsKK3JldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4KGRvam8uZ2Z4LmNvbG9yLmJsZW5kKGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoYSksZG9qby5nZnguY29sb3IuaGV4MnJnYihiKSxfM2I2KSk7Cit9OworZG9qby5nZnguY29sb3IuZXh0cmFjdFJHQj1mdW5jdGlvbihfM2I3KXsKK3ZhciBoZXg9IjAxMjM0NTY3ODlhYmNkZWYiOworXzNiNz1fM2I3LnRvTG93ZXJDYXNlKCk7CitpZihfM2I3LmluZGV4T2YoInJnYiIpPT0wKXsKK3ZhciBfM2I5PV8zYjcubWF0Y2goL3JnYmEqXCgoXGQrKSwgKihcZCspLCAqKFxkKykvaSk7Cit2YXIgcmV0PV8zYjkuc3BsaWNlKDEsMyk7CityZXR1cm4gcmV0OworfWVsc2V7Cit2YXIgXzNiYj1kb2pvLmdmeC5jb2xvci5oZXgycmdiKF8zYjcpOworaWYoXzNiYil7CityZXR1cm4gXzNiYjsKK31lbHNleworcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLm5hbWVkW18zYjddfHxbMjU1LDI1NSwyNTVdOworfQorfQorfTsKK2Rvam8uZ2Z4LmNvbG9yLmhleDJyZ2I9ZnVuY3Rpb24oaGV4KXsKK3ZhciBfM2JkPSIwMTIzNDU2Nzg5QUJDREVGIjsKK3ZhciByZ2I9bmV3IEFycmF5KDMpOworaWYoaGV4LmluZGV4T2YoIiMiKT09MCl7CitoZXg9aGV4LnN1YnN0cmluZygxKTsKK30KK2hleD1oZXgudG9VcHBlckNhc2UoKTsKK2lmKGhleC5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiK18zYmQrIl0iLCJnIiksIiIpIT0iIil7CityZXR1cm4gbnVsbDsKK30KK2lmKGhleC5sZW5ndGg9PTMpeworcmdiWzBdPWhleC5jaGFyQXQoMCkraGV4LmNoYXJBdCgwKTsKK3JnYlsxXT1oZXguY2hhckF0KDEpK2hleC5jaGFyQXQoMSk7CityZ2JbMl09aGV4LmNoYXJBdCgyKStoZXguY2hhckF0KDIpOworfWVsc2V7CityZ2JbMF09aGV4LnN1YnN0cmluZygwLDIpOworcmdiWzFdPWhleC5zdWJzdHJpbmcoMiw0KTsKK3JnYlsyXT1oZXguc3Vic3RyaW5nKDQpOworfQorZm9yKHZhciBpPTA7aTxyZ2IubGVuZ3RoO2krKyl7CityZ2JbaV09XzNiZC5pbmRleE9mKHJnYltpXS5jaGFyQXQoMCkpKjE2K18zYmQuaW5kZXhPZihyZ2JbaV0uY2hhckF0KDEpKTsKK30KK3JldHVybiByZ2I7Cit9OworZG9qby5nZnguY29sb3IucmdiMmhleD1mdW5jdGlvbihyLGcsYil7CitpZihkb2pvLmxhbmcuaXNBcnJheShyKSl7CitnPXJbMV18fDA7CitiPXJbMl18fDA7CityPXJbMF18fDA7Cit9Cit2YXIgcmV0PWRvam8ubGFuZy5tYXAoW3IsZyxiXSxmdW5jdGlvbih4KXsKK3g9bmV3IE51bWJlcih4KTsKK3ZhciBzPXgudG9TdHJpbmcoMTYpOword2hpbGUocy5sZW5ndGg8Mil7CitzPSIwIitzOworfQorcmV0dXJuIHM7Cit9KTsKK3JldC51bnNoaWZ0KCIjIik7CityZXR1cm4gcmV0LmpvaW4oIiIpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguQW5pbWF0aW9uIik7Citkb2pvLmxmeC5MaW5lPWZ1bmN0aW9uKF8zYzYsZW5kKXsKK3RoaXMuc3RhcnQ9XzNjNjsKK3RoaXMuZW5kPWVuZDsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF8zYzYpKXsKK3ZhciBkaWZmPVtdOworZG9qby5sYW5nLmZvckVhY2godGhpcy5zdGFydCxmdW5jdGlvbihzLGkpeworZGlmZltpXT10aGlzLmVuZFtpXS1zOworfSx0aGlzKTsKK3RoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24obil7Cit2YXIgcmVzPVtdOworZG9qby5sYW5nLmZvckVhY2godGhpcy5zdGFydCxmdW5jdGlvbihzLGkpeworcmVzW2ldPShkaWZmW2ldKm4pK3M7Cit9LHRoaXMpOworcmV0dXJuIHJlczsKK307Cit9ZWxzZXsKK3ZhciBkaWZmPWVuZC1fM2M2OwordGhpcy5nZXRWYWx1ZT1mdW5jdGlvbihuKXsKK3JldHVybiAoZGlmZipuKSt0aGlzLnN0YXJ0OworfTsKK30KK307CitpZigoZG9qby5yZW5kZXIuaHRtbC5raHRtbCkmJighZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpKXsKK2Rvam8ubGZ4LmVhc2VEZWZhdWx0PWZ1bmN0aW9uKG4peworcmV0dXJuIChwYXJzZUZsb2F0KCIwLjUiKSsoKE1hdGguc2luKChuK3BhcnNlRmxvYXQoIjEuNSIpKSpNYXRoLlBJKSkvMikpOworfTsKK31lbHNleworZG9qby5sZnguZWFzZURlZmF1bHQ9ZnVuY3Rpb24obil7CityZXR1cm4gKDAuNSsoKE1hdGguc2luKChuKzEuNSkqTWF0aC5QSSkpLzIpKTsKK307Cit9Citkb2pvLmxmeC5lYXNlSW49ZnVuY3Rpb24obil7CityZXR1cm4gTWF0aC5wb3cobiwzKTsKK307Citkb2pvLmxmeC5lYXNlT3V0PWZ1bmN0aW9uKG4peworcmV0dXJuICgxLU1hdGgucG93KDEtbiwzKSk7Cit9OworZG9qby5sZnguZWFzZUluT3V0PWZ1bmN0aW9uKG4peworcmV0dXJuICgoMypNYXRoLnBvdyhuLDIpKS0oMipNYXRoLnBvdyhuLDMpKSk7Cit9OworZG9qby5sZnguSUFuaW1hdGlvbj1mdW5jdGlvbigpeworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguSUFuaW1hdGlvbix7Y3VydmU6bnVsbCxkdXJhdGlvbjoxMDAwLGVhc2luZzpudWxsLHJlcGVhdENvdW50OjAscmF0ZToxMCxoYW5kbGVyOm51bGwsYmVmb3JlQmVnaW46bnVsbCxvbkJlZ2luOm51bGwsb25BbmltYXRlOm51bGwsb25FbmQ6bnVsbCxvblBsYXk6bnVsbCxvblBhdXNlOm51bGwsb25TdG9wOm51bGwscGxheTpudWxsLHBhdXNlOm51bGwsc3RvcDpudWxsLGNvbm5lY3Q6ZnVuY3Rpb24oZXZ0LF8zZDYsXzNkNyl7CitpZighXzNkNyl7CitfM2Q3PV8zZDY7CitfM2Q2PXRoaXM7Cit9CitfM2Q3PWRvam8ubGFuZy5oaXRjaChfM2Q2LF8zZDcpOwordmFyIF8zZDg9dGhpc1tldnRdfHxmdW5jdGlvbigpeworfTsKK3RoaXNbZXZ0XT1mdW5jdGlvbigpewordmFyIHJldD1fM2Q4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK18zZDcuYXBwbHkodGhpcyxhcmd1bWVudHMpOworcmV0dXJuIHJldDsKK307CityZXR1cm4gdGhpczsKK30sZmlyZTpmdW5jdGlvbihldnQsYXJncyl7CitpZih0aGlzW2V2dF0pewordGhpc1tldnRdLmFwcGx5KHRoaXMsKGFyZ3N8fFtdKSk7Cit9CityZXR1cm4gdGhpczsKK30scmVwZWF0OmZ1bmN0aW9uKF8zZGMpewordGhpcy5yZXBlYXRDb3VudD1fM2RjOworcmV0dXJuIHRoaXM7Cit9LF9hY3RpdmU6ZmFsc2UsX3BhdXNlZDpmYWxzZX0pOworZG9qby5sZnguQW5pbWF0aW9uPWZ1bmN0aW9uKF8zZGQsXzNkZSxfM2RmLF8zZTAsXzNlMSxyYXRlKXsKK2Rvam8ubGZ4LklBbmltYXRpb24uY2FsbCh0aGlzKTsKK2lmKGRvam8ubGFuZy5pc051bWJlcihfM2RkKXx8KCFfM2RkJiZfM2RlLmdldFZhbHVlKSl7CityYXRlPV8zZTE7CitfM2UxPV8zZTA7CitfM2UwPV8zZGY7CitfM2RmPV8zZGU7CitfM2RlPV8zZGQ7CitfM2RkPW51bGw7Cit9ZWxzZXsKK2lmKF8zZGQuZ2V0VmFsdWV8fGRvam8ubGFuZy5pc0FycmF5KF8zZGQpKXsKK3JhdGU9XzNlMDsKK18zZTE9XzNkZjsKK18zZTA9XzNkZTsKK18zZGY9XzNkZDsKK18zZGU9bnVsbDsKK18zZGQ9bnVsbDsKK30KK30KK2lmKGRvam8ubGFuZy5pc0FycmF5KF8zZGYpKXsKK3RoaXMuY3VydmU9bmV3IGRvam8ubGZ4LkxpbmUoXzNkZlswXSxfM2RmWzFdKTsKK31lbHNlewordGhpcy5jdXJ2ZT1fM2RmOworfQoraWYoXzNkZSE9bnVsbCYmXzNkZT4wKXsKK3RoaXMuZHVyYXRpb249XzNkZTsKK30KK2lmKF8zZTEpewordGhpcy5yZXBlYXRDb3VudD1fM2UxOworfQoraWYocmF0ZSl7Cit0aGlzLnJhdGU9cmF0ZTsKK30KK2lmKF8zZGQpeworZG9qby5sYW5nLmZvckVhY2goWyJoYW5kbGVyIiwiYmVmb3JlQmVnaW4iLCJvbkJlZ2luIiwib25FbmQiLCJvblBsYXkiLCJvblN0b3AiLCJvbkFuaW1hdGUiXSxmdW5jdGlvbihpdGVtKXsKK2lmKF8zZGRbaXRlbV0pewordGhpcy5jb25uZWN0KGl0ZW0sXzNkZFtpdGVtXSk7Cit9Cit9LHRoaXMpOworfQoraWYoXzNlMCYmZG9qby5sYW5nLmlzRnVuY3Rpb24oXzNlMCkpewordGhpcy5lYXNpbmc9XzNlMDsKK30KK307Citkb2pvLmluaGVyaXRzKGRvam8ubGZ4LkFuaW1hdGlvbixkb2pvLmxmeC5JQW5pbWF0aW9uKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguQW5pbWF0aW9uLHtfc3RhcnRUaW1lOm51bGwsX2VuZFRpbWU6bnVsbCxfdGltZXI6bnVsbCxfcGVyY2VudDowLF9zdGFydFJlcGVhdENvdW50OjAscGxheTpmdW5jdGlvbihfM2U0LF8zZTUpeworaWYoXzNlNSl7CitjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOwordGhpcy5fYWN0aXZlPWZhbHNlOwordGhpcy5fcGF1c2VkPWZhbHNlOwordGhpcy5fcGVyY2VudD0wOworfWVsc2V7CitpZih0aGlzLl9hY3RpdmUmJiF0aGlzLl9wYXVzZWQpeworcmV0dXJuIHRoaXM7Cit9Cit9Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsiYmVmb3JlQmVnaW4iXSk7Cit0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CitpZihfM2U0PjApeworc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpewordGhpcy5wbGF5KG51bGwsXzNlNSk7Cit9KSxfM2U0KTsKK3JldHVybiB0aGlzOworfQordGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkudmFsdWVPZigpOworaWYodGhpcy5fcGF1c2VkKXsKK3RoaXMuX3N0YXJ0VGltZS09KHRoaXMuZHVyYXRpb24qdGhpcy5fcGVyY2VudC8xMDApOworfQordGhpcy5fZW5kVGltZT10aGlzLl9zdGFydFRpbWUrdGhpcy5kdXJhdGlvbjsKK3RoaXMuX2FjdGl2ZT10cnVlOwordGhpcy5fcGF1c2VkPWZhbHNlOwordmFyIHN0ZXA9dGhpcy5fcGVyY2VudC8xMDA7Cit2YXIgXzNlNz10aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOworaWYodGhpcy5fcGVyY2VudD09MCl7CitpZighdGhpcy5fc3RhcnRSZXBlYXRDb3VudCl7Cit0aGlzLl9zdGFydFJlcGVhdENvdW50PXRoaXMucmVwZWF0Q291bnQ7Cit9Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsiYmVnaW4iLF8zZTddKTsKK3RoaXMuZmlyZSgib25CZWdpbiIsW18zZTddKTsKK30KK3RoaXMuZmlyZSgiaGFuZGxlciIsWyJwbGF5IixfM2U3XSk7Cit0aGlzLmZpcmUoIm9uUGxheSIsW18zZTddKTsKK3RoaXMuX2N5Y2xlKCk7CityZXR1cm4gdGhpczsKK30scGF1c2U6ZnVuY3Rpb24oKXsKK2NsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CitpZighdGhpcy5fYWN0aXZlKXsKK3JldHVybiB0aGlzOworfQordGhpcy5fcGF1c2VkPXRydWU7Cit2YXIgXzNlOD10aGlzLmN1cnZlLmdldFZhbHVlKHRoaXMuX3BlcmNlbnQvMTAwKTsKK3RoaXMuZmlyZSgiaGFuZGxlciIsWyJwYXVzZSIsXzNlOF0pOwordGhpcy5maXJlKCJvblBhdXNlIixbXzNlOF0pOworcmV0dXJuIHRoaXM7Cit9LGdvdG9QZXJjZW50OmZ1bmN0aW9uKHBjdCxfM2VhKXsKK2NsZWFyVGltZW91dCh0aGlzLl90aW1lcik7Cit0aGlzLl9hY3RpdmU9dHJ1ZTsKK3RoaXMuX3BhdXNlZD10cnVlOwordGhpcy5fcGVyY2VudD1wY3Q7CitpZihfM2VhKXsKK3RoaXMucGxheSgpOworfQorcmV0dXJuIHRoaXM7Cit9LHN0b3A6ZnVuY3Rpb24oXzNlYil7CitjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOwordmFyIHN0ZXA9dGhpcy5fcGVyY2VudC8xMDA7CitpZihfM2ViKXsKK3N0ZXA9MTsKK30KK3ZhciBfM2VkPXRoaXMuY3VydmUuZ2V0VmFsdWUoc3RlcCk7Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsic3RvcCIsXzNlZF0pOwordGhpcy5maXJlKCJvblN0b3AiLFtfM2VkXSk7Cit0aGlzLl9hY3RpdmU9ZmFsc2U7Cit0aGlzLl9wYXVzZWQ9ZmFsc2U7CityZXR1cm4gdGhpczsKK30sc3RhdHVzOmZ1bmN0aW9uKCl7CitpZih0aGlzLl9hY3RpdmUpeworcmV0dXJuIHRoaXMuX3BhdXNlZD8icGF1c2VkIjoicGxheWluZyI7Cit9ZWxzZXsKK3JldHVybiAic3RvcHBlZCI7Cit9CityZXR1cm4gdGhpczsKK30sX2N5Y2xlOmZ1bmN0aW9uKCl7CitjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworaWYodGhpcy5fYWN0aXZlKXsKK3ZhciBjdXJyPW5ldyBEYXRlKCkudmFsdWVPZigpOwordmFyIHN0ZXA9KGN1cnItdGhpcy5fc3RhcnRUaW1lKS8odGhpcy5fZW5kVGltZS10aGlzLl9zdGFydFRpbWUpOworaWYoc3RlcD49MSl7CitzdGVwPTE7Cit0aGlzLl9wZXJjZW50PTEwMDsKK31lbHNlewordGhpcy5fcGVyY2VudD1zdGVwKjEwMDsKK30KK2lmKCh0aGlzLmVhc2luZykmJihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmVhc2luZykpKXsKK3N0ZXA9dGhpcy5lYXNpbmcoc3RlcCk7Cit9Cit2YXIgXzNmMD10aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOwordGhpcy5maXJlKCJoYW5kbGVyIixbImFuaW1hdGUiLF8zZjBdKTsKK3RoaXMuZmlyZSgib25BbmltYXRlIixbXzNmMF0pOworaWYoc3RlcDwxKXsKK3RoaXMuX3RpbWVyPXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIl9jeWNsZSIpLHRoaXMucmF0ZSk7Cit9ZWxzZXsKK3RoaXMuX2FjdGl2ZT1mYWxzZTsKK3RoaXMuZmlyZSgiaGFuZGxlciIsWyJlbmQiXSk7Cit0aGlzLmZpcmUoIm9uRW5kIik7CitpZih0aGlzLnJlcGVhdENvdW50PjApewordGhpcy5yZXBlYXRDb3VudC0tOwordGhpcy5wbGF5KG51bGwsdHJ1ZSk7Cit9ZWxzZXsKK2lmKHRoaXMucmVwZWF0Q291bnQ9PS0xKXsKK3RoaXMucGxheShudWxsLHRydWUpOworfWVsc2V7CitpZih0aGlzLl9zdGFydFJlcGVhdENvdW50KXsKK3RoaXMucmVwZWF0Q291bnQ9dGhpcy5fc3RhcnRSZXBlYXRDb3VudDsKK3RoaXMuX3N0YXJ0UmVwZWF0Q291bnQ9MDsKK30KK30KK30KK30KK30KK3JldHVybiB0aGlzOworfX0pOworZG9qby5sZnguQ29tYmluZT1mdW5jdGlvbihfM2YxKXsKK2Rvam8ubGZ4LklBbmltYXRpb24uY2FsbCh0aGlzKTsKK3RoaXMuX2FuaW1zPVtdOwordGhpcy5fYW5pbXNFbmRlZD0wOwordmFyIF8zZjI9YXJndW1lbnRzOworaWYoXzNmMi5sZW5ndGg9PTEmJihkb2pvLmxhbmcuaXNBcnJheShfM2YyWzBdKXx8ZG9qby5sYW5nLmlzQXJyYXlMaWtlKF8zZjJbMF0pKSl7CitfM2YyPV8zZjJbMF07Cit9Citkb2pvLmxhbmcuZm9yRWFjaChfM2YyLGZ1bmN0aW9uKGFuaW0pewordGhpcy5fYW5pbXMucHVzaChhbmltKTsKK2FuaW0uY29ubmVjdCgib25FbmQiLGRvam8ubGFuZy5oaXRjaCh0aGlzLCJfb25Bbmltc0VuZGVkIikpOworfSx0aGlzKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8ubGZ4LkNvbWJpbmUsZG9qby5sZnguSUFuaW1hdGlvbik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LkNvbWJpbmUse19hbmltc0VuZGVkOjAscGxheTpmdW5jdGlvbihfM2Y0LF8zZjUpeworaWYoIXRoaXMuX2FuaW1zLmxlbmd0aCl7CityZXR1cm4gdGhpczsKK30KK3RoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKK2lmKF8zZjQ+MCl7CitzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKCl7Cit0aGlzLnBsYXkobnVsbCxfM2Y1KTsKK30pLF8zZjQpOworcmV0dXJuIHRoaXM7Cit9CitpZihfM2Y1fHx0aGlzLl9hbmltc1swXS5wZXJjZW50PT0wKXsKK3RoaXMuZmlyZSgib25CZWdpbiIpOworfQordGhpcy5maXJlKCJvblBsYXkiKTsKK3RoaXMuX2FuaW1zQ2FsbCgicGxheSIsbnVsbCxfM2Y1KTsKK3JldHVybiB0aGlzOworfSxwYXVzZTpmdW5jdGlvbigpewordGhpcy5maXJlKCJvblBhdXNlIik7Cit0aGlzLl9hbmltc0NhbGwoInBhdXNlIik7CityZXR1cm4gdGhpczsKK30sc3RvcDpmdW5jdGlvbihfM2Y2KXsKK3RoaXMuZmlyZSgib25TdG9wIik7Cit0aGlzLl9hbmltc0NhbGwoInN0b3AiLF8zZjYpOworcmV0dXJuIHRoaXM7Cit9LF9vbkFuaW1zRW5kZWQ6ZnVuY3Rpb24oKXsKK3RoaXMuX2FuaW1zRW5kZWQrKzsKK2lmKHRoaXMuX2FuaW1zRW5kZWQ+PXRoaXMuX2FuaW1zLmxlbmd0aCl7Cit0aGlzLmZpcmUoIm9uRW5kIik7Cit9CityZXR1cm4gdGhpczsKK30sX2FuaW1zQ2FsbDpmdW5jdGlvbihfM2Y3KXsKK3ZhciBhcmdzPVtdOworaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsKK2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7Cit9Cit9Cit2YXIgXzNmYT10aGlzOworZG9qby5sYW5nLmZvckVhY2godGhpcy5fYW5pbXMsZnVuY3Rpb24oYW5pbSl7CithbmltW18zZjddKGFyZ3MpOworfSxfM2ZhKTsKK3JldHVybiB0aGlzOworfX0pOworZG9qby5sZnguQ2hhaW49ZnVuY3Rpb24oXzNmYyl7Citkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7Cit0aGlzLl9hbmltcz1bXTsKK3RoaXMuX2N1cnJBbmltPS0xOwordmFyIF8zZmQ9YXJndW1lbnRzOworaWYoXzNmZC5sZW5ndGg9PTEmJihkb2pvLmxhbmcuaXNBcnJheShfM2ZkWzBdKXx8ZG9qby5sYW5nLmlzQXJyYXlMaWtlKF8zZmRbMF0pKSl7CitfM2ZkPV8zZmRbMF07Cit9Cit2YXIgXzNmZT10aGlzOworZG9qby5sYW5nLmZvckVhY2goXzNmZCxmdW5jdGlvbihhbmltLGksXzQwMSl7Cit0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworaWYoaTxfNDAxLmxlbmd0aC0xKXsKK2FuaW0uY29ubmVjdCgib25FbmQiLGRvam8ubGFuZy5oaXRjaCh0aGlzLCJfcGxheU5leHQiKSk7Cit9ZWxzZXsKK2FuaW0uY29ubmVjdCgib25FbmQiLGRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKCl7Cit0aGlzLmZpcmUoIm9uRW5kIik7Cit9KSk7Cit9Cit9LHRoaXMpOworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5sZnguQ2hhaW4sZG9qby5sZnguSUFuaW1hdGlvbik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LkNoYWluLHtfY3VyckFuaW06LTEscGxheTpmdW5jdGlvbihfNDAyLF80MDMpeworaWYoIXRoaXMuX2FuaW1zLmxlbmd0aCl7CityZXR1cm4gdGhpczsKK30KK2lmKF80MDN8fCF0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0pewordGhpcy5fY3VyckFuaW09MDsKK30KK3ZhciBfNDA0PXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKK3RoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKK2lmKF80MDI+MCl7CitzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKCl7Cit0aGlzLnBsYXkobnVsbCxfNDAzKTsKK30pLF80MDIpOworcmV0dXJuIHRoaXM7Cit9CitpZihfNDA0KXsKK2lmKHRoaXMuX2N1cnJBbmltPT0wKXsKK3RoaXMuZmlyZSgiaGFuZGxlciIsWyJiZWdpbiIsdGhpcy5fY3VyckFuaW1dKTsKK3RoaXMuZmlyZSgib25CZWdpbiIsW3RoaXMuX2N1cnJBbmltXSk7Cit9Cit0aGlzLmZpcmUoIm9uUGxheSIsW3RoaXMuX2N1cnJBbmltXSk7CitfNDA0LnBsYXkobnVsbCxfNDAzKTsKK30KK3JldHVybiB0aGlzOworfSxwYXVzZTpmdW5jdGlvbigpeworaWYodGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKXsKK3RoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXS5wYXVzZSgpOwordGhpcy5maXJlKCJvblBhdXNlIixbdGhpcy5fY3VyckFuaW1dKTsKK30KK3JldHVybiB0aGlzOworfSxwbGF5UGF1c2U6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuX2FuaW1zLmxlbmd0aD09MCl7CityZXR1cm4gdGhpczsKK30KK2lmKHRoaXMuX2N1cnJBbmltPT0tMSl7Cit0aGlzLl9jdXJyQW5pbT0wOworfQordmFyIF80MDU9dGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dOworaWYoXzQwNSl7CitpZighXzQwNS5fYWN0aXZlfHxfNDA1Ll9wYXVzZWQpewordGhpcy5wbGF5KCk7Cit9ZWxzZXsKK3RoaXMucGF1c2UoKTsKK30KK30KK3JldHVybiB0aGlzOworfSxzdG9wOmZ1bmN0aW9uKCl7Cit2YXIgXzQwNj10aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV07CitpZihfNDA2KXsKK180MDYuc3RvcCgpOwordGhpcy5maXJlKCJvblN0b3AiLFt0aGlzLl9jdXJyQW5pbV0pOworfQorcmV0dXJuIF80MDY7Cit9LF9wbGF5TmV4dDpmdW5jdGlvbigpeworaWYodGhpcy5fY3VyckFuaW09PS0xfHx0aGlzLl9hbmltcy5sZW5ndGg9PTApeworcmV0dXJuIHRoaXM7Cit9Cit0aGlzLl9jdXJyQW5pbSsrOworaWYodGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKXsKK3RoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXS5wbGF5KG51bGwsdHJ1ZSk7Cit9CityZXR1cm4gdGhpczsKK319KTsKK2Rvam8ubGZ4LmNvbWJpbmU9ZnVuY3Rpb24oXzQwNyl7Cit2YXIgXzQwOD1hcmd1bWVudHM7CitpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKK180MDg9YXJndW1lbnRzWzBdOworfQoraWYoXzQwOC5sZW5ndGg9PTEpeworcmV0dXJuIF80MDhbMF07Cit9CityZXR1cm4gbmV3IGRvam8ubGZ4LkNvbWJpbmUoXzQwOCk7Cit9OworZG9qby5sZnguY2hhaW49ZnVuY3Rpb24oXzQwOSl7Cit2YXIgXzQwYT1hcmd1bWVudHM7CitpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKK180MGE9YXJndW1lbnRzWzBdOworfQoraWYoXzQwYS5sZW5ndGg9PTEpeworcmV0dXJuIF80MGFbMF07Cit9CityZXR1cm4gbmV3IGRvam8ubGZ4LkNoYWluKF80MGEpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmNvbW1vbiIpOworZG9qby5sYW5nLm1peGluKGRvam8uaHRtbCxkb2pvLmRvbSk7Citkb2pvLmh0bWwuYm9keT1mdW5jdGlvbigpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwuYm9keSgpIG1vdmVkIHRvIGRvam8uYm9keSgpIiwiMC41Iik7CityZXR1cm4gZG9qby5ib2R5KCk7Cit9OworZG9qby5odG1sLmdldEV2ZW50VGFyZ2V0PWZ1bmN0aW9uKGV2dCl7CitpZighZXZ0KXsKK2V2dD1kb2pvLmdsb2JhbCgpLmV2ZW50fHx7fTsKK30KK3ZhciB0PShldnQuc3JjRWxlbWVudD9ldnQuc3JjRWxlbWVudDooZXZ0LnRhcmdldD9ldnQudGFyZ2V0Om51bGwpKTsKK3doaWxlKCh0KSYmKHQubm9kZVR5cGUhPTEpKXsKK3Q9dC5wYXJlbnROb2RlOworfQorcmV0dXJuIHQ7Cit9OworZG9qby5odG1sLmdldFZpZXdwb3J0PWZ1bmN0aW9uKCl7Cit2YXIgXzQwZD1kb2pvLmdsb2JhbCgpOwordmFyIF80MGU9ZG9qby5kb2MoKTsKK3ZhciB3PTA7Cit2YXIgaD0wOworaWYoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKXsKK3c9XzQwZS5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CitoPV80MGQuaW5uZXJIZWlnaHQ7Cit9ZWxzZXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhJiZfNDBkLmlubmVyV2lkdGgpewordz1fNDBkLmlubmVyV2lkdGg7CitoPV80MGQuaW5uZXJIZWlnaHQ7Cit9ZWxzZXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhJiZkb2pvLmV4aXN0cyhfNDBlLCJkb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgiKSl7Cit2YXIgdzI9XzQwZS5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CitpZighd3x8dzImJncyPHcpewordz13MjsKK30KK2g9XzQwZS5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OworfWVsc2V7CitpZihkb2pvLmJvZHkoKS5jbGllbnRXaWR0aCl7Cit3PWRvam8uYm9keSgpLmNsaWVudFdpZHRoOworaD1kb2pvLmJvZHkoKS5jbGllbnRIZWlnaHQ7Cit9Cit9Cit9Cit9CityZXR1cm4ge3dpZHRoOncsaGVpZ2h0Omh9OworfTsKK2Rvam8uaHRtbC5nZXRTY3JvbGw9ZnVuY3Rpb24oKXsKK3ZhciBfNDEyPWRvam8uZ2xvYmFsKCk7Cit2YXIgXzQxMz1kb2pvLmRvYygpOwordmFyIHRvcD1fNDEyLnBhZ2VZT2Zmc2V0fHxfNDEzLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvam8uYm9keSgpLnNjcm9sbFRvcHx8MDsKK3ZhciBsZWZ0PV80MTIucGFnZVhPZmZzZXR8fF80MTMuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvam8uYm9keSgpLnNjcm9sbExlZnR8fDA7CityZXR1cm4ge3RvcDp0b3AsbGVmdDpsZWZ0LG9mZnNldDp7eDpsZWZ0LHk6dG9wfX07Cit9OworZG9qby5odG1sLmdldFBhcmVudEJ5VHlwZT1mdW5jdGlvbihub2RlLHR5cGUpewordmFyIF80MTg9ZG9qby5kb2MoKTsKK3ZhciBfNDE5PWRvam8uYnlJZChub2RlKTsKK3R5cGU9dHlwZS50b0xvd2VyQ2FzZSgpOword2hpbGUoKF80MTkpJiYoXzQxOS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT10eXBlKSl7CitpZihfNDE5PT0oXzQxOFsiYm9keSJdfHxfNDE4WyJkb2N1bWVudEVsZW1lbnQiXSkpeworcmV0dXJuIG51bGw7Cit9CitfNDE5PV80MTkucGFyZW50Tm9kZTsKK30KK3JldHVybiBfNDE5OworfTsKK2Rvam8uaHRtbC5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obm9kZSxhdHRyKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYoKCFub2RlKXx8KCFub2RlLmdldEF0dHJpYnV0ZSkpeworcmV0dXJuIG51bGw7Cit9Cit2YXIgdGE9dHlwZW9mIGF0dHI9PSJzdHJpbmciP2F0dHI6bmV3IFN0cmluZyhhdHRyKTsKK3ZhciB2PW5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvVXBwZXJDYXNlKCkpOworaWYoKHYpJiYodHlwZW9mIHY9PSJzdHJpbmciKSYmKHYhPSIiKSl7CityZXR1cm4gdjsKK30KK2lmKHYmJnYudmFsdWUpeworcmV0dXJuIHYudmFsdWU7Cit9CitpZigobm9kZS5nZXRBdHRyaWJ1dGVOb2RlKSYmKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSh0YSkpKXsKK3JldHVybiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlKHRhKSkudmFsdWU7Cit9ZWxzZXsKK2lmKG5vZGUuZ2V0QXR0cmlidXRlKHRhKSl7CityZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUodGEpOworfWVsc2V7CitpZihub2RlLmdldEF0dHJpYnV0ZSh0YS50b0xvd2VyQ2FzZSgpKSl7CityZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUodGEudG9Mb3dlckNhc2UoKSk7Cit9Cit9Cit9CityZXR1cm4gbnVsbDsKK307Citkb2pvLmh0bWwuaGFzQXR0cmlidXRlPWZ1bmN0aW9uKG5vZGUsYXR0cil7CityZXR1cm4gZG9qby5odG1sLmdldEF0dHJpYnV0ZShkb2pvLmJ5SWQobm9kZSksYXR0cik/dHJ1ZTpmYWxzZTsKK307Citkb2pvLmh0bWwuZ2V0Q3Vyc29yUG9zaXRpb249ZnVuY3Rpb24oZSl7CitlPWV8fGRvam8uZ2xvYmFsKCkuZXZlbnQ7Cit2YXIgXzQyMT17eDowLHk6MH07CitpZihlLnBhZ2VYfHxlLnBhZ2VZKXsKK180MjEueD1lLnBhZ2VYOworXzQyMS55PWUucGFnZVk7Cit9ZWxzZXsKK3ZhciBkZT1kb2pvLmRvYygpLmRvY3VtZW50RWxlbWVudDsKK3ZhciBkYj1kb2pvLmJvZHkoKTsKK180MjEueD1lLmNsaWVudFgrKChkZXx8ZGIpWyJzY3JvbGxMZWZ0Il0pLSgoZGV8fGRiKVsiY2xpZW50TGVmdCJdKTsKK180MjEueT1lLmNsaWVudFkrKChkZXx8ZGIpWyJzY3JvbGxUb3AiXSktKChkZXx8ZGIpWyJjbGllbnRUb3AiXSk7Cit9CityZXR1cm4gXzQyMTsKK307Citkb2pvLmh0bWwuaXNUYWc9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKG5vZGUmJm5vZGUudGFnTmFtZSl7Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2lmKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT1TdHJpbmcoYXJndW1lbnRzW2ldKS50b0xvd2VyQ2FzZSgpKXsKK3JldHVybiBTdHJpbmcoYXJndW1lbnRzW2ldKS50b0xvd2VyQ2FzZSgpOworfQorfQorfQorcmV0dXJuICIiOworfTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUmJiFkb2pvLnJlbmRlci5odG1sLmllNzApeworaWYod2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsNikudG9Mb3dlckNhc2UoKSE9Imh0dHBzOiIpeworKGZ1bmN0aW9uKCl7Cit2YXIgXzQyNj1kb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworXzQyNi5zcmM9ImphdmFzY3JpcHQ6J2Rvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQ9ZnVuY3Rpb24oZG9jLCB0YWcpeyByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsgfSciOworZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKF80MjYpOworfSkoKTsKK30KK31lbHNleworZG9qby5odG1sLmNyZWF0ZUV4dGVybmFsRWxlbWVudD1mdW5jdGlvbihkb2MsdGFnKXsKK3JldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWcpOworfTsKK30KK2Rvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQ9ZnVuY3Rpb24oXzQyOSxfNDJhLGFyZ3MsXzQyYyxfNDJkKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLiIrXzQyOSwicmVwbGFjZWQgYnkgZG9qby5odG1sLiIrXzQyYSsiKCIrKF80MmM/Im5vZGUsIHsiK180MmMrIjogIitfNDJjKyJ9IjoiIikrIikiKyhfNDJkPyIuIitfNDJkOiIiKSwiMC41Iik7Cit2YXIgXzQyZT1bXTsKK2lmKF80MmMpewordmFyIF80MmY9e307CitfNDJmW180MmNdPWFyZ3NbMV07CitfNDJlLnB1c2goYXJnc1swXSk7CitfNDJlLnB1c2goXzQyZik7Cit9ZWxzZXsKK180MmU9YXJnczsKK30KK3ZhciByZXQ9ZG9qby5odG1sW180MmFdLmFwcGx5KGRvam8uaHRtbCxhcmdzKTsKK2lmKF80MmQpeworcmV0dXJuIHJldFtfNDJkXTsKK31lbHNleworcmV0dXJuIHJldDsKK30KK307Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnRXaWR0aD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFZpZXdwb3J0V2lkdGgiLCJnZXRWaWV3cG9ydCIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldFZpZXdwb3J0SGVpZ2h0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Vmlld3BvcnRIZWlnaHQiLCJnZXRWaWV3cG9ydCIsYXJndW1lbnRzLG51bGwsImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydFNpemU9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRWaWV3cG9ydFNpemUiLCJnZXRWaWV3cG9ydCIsYXJndW1lbnRzKTsKK307Citkb2pvLmh0bWwuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsIixhcmd1bWVudHMsbnVsbCwidG9wIik7Cit9OworZG9qby5odG1sLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxMZWZ0IiwiZ2V0U2Nyb2xsIixhcmd1bWVudHMsbnVsbCwibGVmdCIpOworfTsKK2Rvam8uaHRtbC5nZXRTY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxPZmZzZXQiLCJnZXRTY3JvbGwiLGFyZ3VtZW50cyxudWxsLCJvZmZzZXQiKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8udXJpLlVyaSIpOworZG9qby51cmk9bmV3IGZ1bmN0aW9uKCl7Cit0aGlzLmRvam9Vcmk9ZnVuY3Rpb24odXJpKXsKK3JldHVybiBuZXcgZG9qby51cmkuVXJpKGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCksdXJpKTsKK307Cit0aGlzLm1vZHVsZVVyaT1mdW5jdGlvbihfNDMyLHVyaSl7Cit2YXIgbG9jPWRvam8uaG9zdGVudi5nZXRNb2R1bGVTeW1ib2xzKF80MzIpLmpvaW4oIi8iKTsKK2lmKCFsb2MpeworcmV0dXJuIG51bGw7Cit9CitpZihsb2MubGFzdEluZGV4T2YoIi8iKSE9bG9jLmxlbmd0aC0xKXsKK2xvYys9Ii8iOworfQordmFyIF80MzU9bG9jLmluZGV4T2YoIjoiKTsKK3ZhciBfNDM2PWxvYy5pbmRleE9mKCIvIik7CitpZihsb2MuY2hhckF0KDApIT0iLyImJihfNDM1PT0tMXx8XzQzNT5fNDM2KSl7Citsb2M9ZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKStsb2M7Cit9CityZXR1cm4gbmV3IGRvam8udXJpLlVyaShsb2MsdXJpKTsKK307Cit0aGlzLlVyaT1mdW5jdGlvbigpewordmFyIHVyaT1hcmd1bWVudHNbMF07Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2lmKCFhcmd1bWVudHNbaV0peworY29udGludWU7Cit9Cit2YXIgXzQzOT1uZXcgZG9qby51cmkuVXJpKGFyZ3VtZW50c1tpXS50b1N0cmluZygpKTsKK3ZhciBfNDNhPW5ldyBkb2pvLnVyaS5VcmkodXJpLnRvU3RyaW5nKCkpOworaWYoKF80MzkucGF0aD09IiIpJiYoXzQzOS5zY2hlbWU9PW51bGwpJiYoXzQzOS5hdXRob3JpdHk9PW51bGwpJiYoXzQzOS5xdWVyeT09bnVsbCkpeworaWYoXzQzOS5mcmFnbWVudCE9bnVsbCl7CitfNDNhLmZyYWdtZW50PV80MzkuZnJhZ21lbnQ7Cit9CitfNDM5PV80M2E7Cit9ZWxzZXsKK2lmKF80Mzkuc2NoZW1lPT1udWxsKXsKK180Mzkuc2NoZW1lPV80M2Euc2NoZW1lOworaWYoXzQzOS5hdXRob3JpdHk9PW51bGwpeworXzQzOS5hdXRob3JpdHk9XzQzYS5hdXRob3JpdHk7CitpZihfNDM5LnBhdGguY2hhckF0KDApIT0iLyIpewordmFyIHBhdGg9XzQzYS5wYXRoLnN1YnN0cmluZygwLF80M2EucGF0aC5sYXN0SW5kZXhPZigiLyIpKzEpK180MzkucGF0aDsKK3ZhciBzZWdzPXBhdGguc3BsaXQoIi8iKTsKK2Zvcih2YXIgaj0wO2o8c2Vncy5sZW5ndGg7aisrKXsKK2lmKHNlZ3Nbal09PSIuIil7CitpZihqPT1zZWdzLmxlbmd0aC0xKXsKK3NlZ3Nbal09IiI7Cit9ZWxzZXsKK3NlZ3Muc3BsaWNlKGosMSk7CitqLS07Cit9Cit9ZWxzZXsKK2lmKGo+MCYmIShqPT0xJiZzZWdzWzBdPT0iIikmJnNlZ3Nbal09PSIuLiImJnNlZ3Nbai0xXSE9Ii4uIil7CitpZihqPT1zZWdzLmxlbmd0aC0xKXsKK3NlZ3Muc3BsaWNlKGosMSk7CitzZWdzW2otMV09IiI7Cit9ZWxzZXsKK3NlZ3Muc3BsaWNlKGotMSwyKTsKK2otPTI7Cit9Cit9Cit9Cit9CitfNDM5LnBhdGg9c2Vncy5qb2luKCIvIik7Cit9Cit9Cit9Cit9Cit1cmk9IiI7CitpZihfNDM5LnNjaGVtZSE9bnVsbCl7Cit1cmkrPV80Mzkuc2NoZW1lKyI6IjsKK30KK2lmKF80MzkuYXV0aG9yaXR5IT1udWxsKXsKK3VyaSs9Ii8vIitfNDM5LmF1dGhvcml0eTsKK30KK3VyaSs9XzQzOS5wYXRoOworaWYoXzQzOS5xdWVyeSE9bnVsbCl7Cit1cmkrPSI/IitfNDM5LnF1ZXJ5OworfQoraWYoXzQzOS5mcmFnbWVudCE9bnVsbCl7Cit1cmkrPSIjIitfNDM5LmZyYWdtZW50OworfQorfQordGhpcy51cmk9dXJpLnRvU3RyaW5nKCk7Cit2YXIgXzQzZT0iXigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpPyQiOwordmFyIHI9dGhpcy51cmkubWF0Y2gobmV3IFJlZ0V4cChfNDNlKSk7Cit0aGlzLnNjaGVtZT1yWzJdfHwoclsxXT8iIjpudWxsKTsKK3RoaXMuYXV0aG9yaXR5PXJbNF18fChyWzNdPyIiOm51bGwpOwordGhpcy5wYXRoPXJbNV07Cit0aGlzLnF1ZXJ5PXJbN118fChyWzZdPyIiOm51bGwpOwordGhpcy5mcmFnbWVudD1yWzldfHwocls4XT8iIjpudWxsKTsKK2lmKHRoaXMuYXV0aG9yaXR5IT1udWxsKXsKK180M2U9Il4oKChbXjpdKzopPyhbXkBdKykpQCk/KFteOl0qKSg6KFswLTldKykpPyQiOworcj10aGlzLmF1dGhvcml0eS5tYXRjaChuZXcgUmVnRXhwKF80M2UpKTsKK3RoaXMudXNlcj1yWzNdfHxudWxsOwordGhpcy5wYXNzd29yZD1yWzRdfHxudWxsOwordGhpcy5ob3N0PXJbNV07Cit0aGlzLnBvcnQ9cls3XXx8bnVsbDsKK30KK3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnVyaTsKK307Cit9OworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLmh0bWwuZ2V0Q2xhc3M9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKCFub2RlKXsKK3JldHVybiAiIjsKK30KK3ZhciBjcz0iIjsKK2lmKG5vZGUuY2xhc3NOYW1lKXsKK2NzPW5vZGUuY2xhc3NOYW1lOworfWVsc2V7CitpZihkb2pvLmh0bWwuaGFzQXR0cmlidXRlKG5vZGUsImNsYXNzIikpeworY3M9ZG9qby5odG1sLmdldEF0dHJpYnV0ZShub2RlLCJjbGFzcyIpOworfQorfQorcmV0dXJuIGNzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTsKK307Citkb2pvLmh0bWwuZ2V0Q2xhc3Nlcz1mdW5jdGlvbihub2RlKXsKK3ZhciBjPWRvam8uaHRtbC5nZXRDbGFzcyhub2RlKTsKK3JldHVybiAoYz09IiIpP1tdOmMuc3BsaXQoL1xzKy9nKTsKK307Citkb2pvLmh0bWwuaGFzQ2xhc3M9ZnVuY3Rpb24obm9kZSxfNDQ1KXsKK3JldHVybiAobmV3IFJlZ0V4cCgiKF58XFxzKykiK180NDUrIihcXHMrfCQpIikpLnRlc3QoZG9qby5odG1sLmdldENsYXNzKG5vZGUpKTsKK307Citkb2pvLmh0bWwucHJlcGVuZENsYXNzPWZ1bmN0aW9uKG5vZGUsXzQ0Nyl7CitfNDQ3Kz0iICIrZG9qby5odG1sLmdldENsYXNzKG5vZGUpOworcmV0dXJuIGRvam8uaHRtbC5zZXRDbGFzcyhub2RlLF80NDcpOworfTsKK2Rvam8uaHRtbC5hZGRDbGFzcz1mdW5jdGlvbihub2RlLF80NDkpeworaWYoZG9qby5odG1sLmhhc0NsYXNzKG5vZGUsXzQ0OSkpeworcmV0dXJuIGZhbHNlOworfQorXzQ0OT0oZG9qby5odG1sLmdldENsYXNzKG5vZGUpKyIgIitfNDQ5KS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7CityZXR1cm4gZG9qby5odG1sLnNldENsYXNzKG5vZGUsXzQ0OSk7Cit9OworZG9qby5odG1sLnNldENsYXNzPWZ1bmN0aW9uKG5vZGUsXzQ0Yil7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBjcz1uZXcgU3RyaW5nKF80NGIpOwordHJ5eworaWYodHlwZW9mIG5vZGUuY2xhc3NOYW1lPT0ic3RyaW5nIil7Citub2RlLmNsYXNzTmFtZT1jczsKK31lbHNleworaWYobm9kZS5zZXRBdHRyaWJ1dGUpeworbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixfNDRiKTsKK25vZGUuY2xhc3NOYW1lPWNzOworfWVsc2V7CityZXR1cm4gZmFsc2U7Cit9Cit9Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoImRvam8uaHRtbC5zZXRDbGFzcygpIGZhaWxlZCIsZSk7Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24obm9kZSxfNDRlLF80NGYpewordHJ5eworaWYoIV80NGYpewordmFyIF80NTA9ZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UobmV3IFJlZ0V4cCgiKF58XFxzKykiK180NGUrIihcXHMrfCQpIiksIiQxJDIiKTsKK31lbHNlewordmFyIF80NTA9ZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UoXzQ0ZSwiIik7Cit9Citkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZSxfNDUwKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZygiZG9qby5odG1sLnJlbW92ZUNsYXNzKCkgZmFpbGVkIixlKTsKK30KK3JldHVybiB0cnVlOworfTsKK2Rvam8uaHRtbC5yZXBsYWNlQ2xhc3M9ZnVuY3Rpb24obm9kZSxfNDUyLF80NTMpeworZG9qby5odG1sLnJlbW92ZUNsYXNzKG5vZGUsXzQ1Myk7Citkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSxfNDUyKTsKK307Citkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGU9e0NvbnRhaW5zQWxsOjAsQ29udGFpbnNBbnk6MSxJc09ubHk6Mn07Citkb2pvLmh0bWwuZ2V0RWxlbWVudHNCeUNsYXNzPWZ1bmN0aW9uKF80NTQsXzQ1NSxfNDU2LF80NTcsXzQ1OCl7CitfNDU4PWZhbHNlOwordmFyIF80NTk9ZG9qby5kb2MoKTsKK180NTU9ZG9qby5ieUlkKF80NTUpfHxfNDU5OwordmFyIF80NWE9XzQ1NC5zcGxpdCgvXHMrL2cpOwordmFyIF80NWI9W107CitpZihfNDU3IT0xJiZfNDU3IT0yKXsKK180NTc9MDsKK30KK3ZhciBfNDVjPW5ldyBSZWdFeHAoIihcXHN8XikoKCIrXzQ1YS5qb2luKCIpfCgiKSsiKSkoXFxzfCQpIik7Cit2YXIgXzQ1ZD1fNDVhLmpvaW4oIiAiKS5sZW5ndGg7Cit2YXIgXzQ1ZT1bXTsKK2lmKCFfNDU4JiZfNDU5LmV2YWx1YXRlKXsKK3ZhciBfNDVmPSIuLy8iKyhfNDU2fHwiKiIpKyJbY29udGFpbnMoIjsKK2lmKF80NTchPWRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FueSl7CitfNDVmKz0iY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiK180NWEuam9pbigiICcpIGFuZCBjb250YWlucyhjb25jYXQoJyAnLEBjbGFzcywnICcpLCAnICIpKyIgJykiOworaWYoXzQ1Nz09Mil7CitfNDVmKz0iIGFuZCBzdHJpbmctbGVuZ3RoKEBjbGFzcyk9IitfNDVkKyJdIjsKK31lbHNleworXzQ1Zis9Il0iOworfQorfWVsc2V7CitfNDVmKz0iY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiK180NWEuam9pbigiICcpIG9yIGNvbnRhaW5zKGNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIikrIiAnKV0iOworfQordmFyIF80NjA9XzQ1OS5ldmFsdWF0ZShfNDVmLF80NTUsbnVsbCxYUGF0aFJlc3VsdC5BTllfVFlQRSxudWxsKTsKK3ZhciBfNDYxPV80NjAuaXRlcmF0ZU5leHQoKTsKK3doaWxlKF80NjEpewordHJ5eworXzQ1ZS5wdXNoKF80NjEpOworXzQ2MT1fNDYwLml0ZXJhdGVOZXh0KCk7Cit9CitjYXRjaChlKXsKK2JyZWFrOworfQorfQorcmV0dXJuIF80NWU7Cit9ZWxzZXsKK2lmKCFfNDU2KXsKK180NTY9IioiOworfQorXzQ1ZT1fNDU1LmdldEVsZW1lbnRzQnlUYWdOYW1lKF80NTYpOwordmFyIG5vZGUsaT0wOworb3V0ZXI6Cit3aGlsZShub2RlPV80NWVbaSsrXSl7Cit2YXIgXzQ2ND1kb2pvLmh0bWwuZ2V0Q2xhc3Nlcyhub2RlKTsKK2lmKF80NjQubGVuZ3RoPT0wKXsKK2NvbnRpbnVlIG91dGVyOworfQordmFyIF80NjU9MDsKK2Zvcih2YXIgaj0wO2o8XzQ2NC5sZW5ndGg7aisrKXsKK2lmKF80NWMudGVzdChfNDY0W2pdKSl7CitpZihfNDU3PT1kb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpeworXzQ1Yi5wdXNoKG5vZGUpOworY29udGludWUgb3V0ZXI7Cit9ZWxzZXsKK180NjUrKzsKK30KK31lbHNleworaWYoXzQ1Nz09ZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlLklzT25seSl7Citjb250aW51ZSBvdXRlcjsKK30KK30KK30KK2lmKF80NjU9PV80NWEubGVuZ3RoKXsKK2lmKChfNDU3PT1kb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuSXNPbmx5KSYmKF80NjU9PV80NjQubGVuZ3RoKSl7CitfNDViLnB1c2gobm9kZSk7Cit9ZWxzZXsKK2lmKF80NTc9PWRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FsbCl7CitfNDViLnB1c2gobm9kZSk7Cit9Cit9Cit9Cit9CityZXR1cm4gXzQ1YjsKK30KK307Citkb2pvLmh0bWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1kb2pvLmh0bWwuZ2V0RWxlbWVudHNCeUNsYXNzOworZG9qby5odG1sLnRvQ2FtZWxDYXNlPWZ1bmN0aW9uKF80NjcpewordmFyIGFycj1fNDY3LnNwbGl0KCItIiksY2M9YXJyWzBdOworZm9yKHZhciBpPTE7aTxhcnIubGVuZ3RoO2krKyl7CitjYys9YXJyW2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2FycltpXS5zdWJzdHJpbmcoMSk7Cit9CityZXR1cm4gY2M7Cit9OworZG9qby5odG1sLnRvU2VsZWN0b3JDYXNlPWZ1bmN0aW9uKF80NmIpeworcmV0dXJuIF80NmIucmVwbGFjZSgvKFtBLVpdKS9nLCItJDEiKS50b0xvd2VyQ2FzZSgpOworfTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24obm9kZSxfNDZkLF80NmUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZighbm9kZXx8IW5vZGUuY3VycmVudFN0eWxlKXsKK3JldHVybiBfNDZlOworfQorcmV0dXJuIG5vZGUuY3VycmVudFN0eWxlW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShfNDZkKV07Cit9OworZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGVzPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIG5vZGUuY3VycmVudFN0eWxlOworfTsKK31lbHNleworZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24obm9kZSxfNDcxLF80NzIpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZighbm9kZXx8IW5vZGUuc3R5bGUpeworcmV0dXJuIF80NzI7Cit9Cit2YXIgcz1kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsbnVsbCk7CityZXR1cm4gKHMmJnNbZG9qby5odG1sLnRvQ2FtZWxDYXNlKF80NzEpXSl8fCIiOworfTsKK2Rvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlcz1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsbnVsbCk7Cit9OworfQorZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHk9ZnVuY3Rpb24obm9kZSxfNDc2KXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworcmV0dXJuIChub2RlJiZub2RlLnN0eWxlP25vZGUuc3R5bGVbZG9qby5odG1sLnRvQ2FtZWxDYXNlKF80NzYpXTp1bmRlZmluZWQpOworfTsKK2Rvam8uaHRtbC5nZXRTdHlsZT1mdW5jdGlvbihub2RlLF80NzgpewordmFyIF80Nzk9ZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSxfNDc4KTsKK3JldHVybiAoXzQ3OT9fNDc5OmRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsXzQ3OCkpOworfTsKK2Rvam8uaHRtbC5zZXRTdHlsZT1mdW5jdGlvbihub2RlLF80N2IsXzQ3Yyl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKG5vZGUmJm5vZGUuc3R5bGUpewordmFyIF80N2Q9ZG9qby5odG1sLnRvQ2FtZWxDYXNlKF80N2IpOworbm9kZS5zdHlsZVtfNDdkXT1fNDdjOworfQorfTsKK2Rvam8uaHRtbC5zZXRTdHlsZVRleHQ9ZnVuY3Rpb24oXzQ3ZSx0ZXh0KXsKK3RyeXsKK180N2Uuc3R5bGUuY3NzVGV4dD10ZXh0OworfQorY2F0Y2goZSl7CitfNDdlLnNldEF0dHJpYnV0ZSgic3R5bGUiLHRleHQpOworfQorfTsKK2Rvam8uaHRtbC5jb3B5U3R5bGU9ZnVuY3Rpb24oXzQ4MCxfNDgxKXsKK2lmKCFfNDgxLnN0eWxlLmNzc1RleHQpeworXzQ4MC5zZXRBdHRyaWJ1dGUoInN0eWxlIixfNDgxLmdldEF0dHJpYnV0ZSgic3R5bGUiKSk7Cit9ZWxzZXsKK180ODAuc3R5bGUuY3NzVGV4dD1fNDgxLnN0eWxlLmNzc1RleHQ7Cit9Citkb2pvLmh0bWwuYWRkQ2xhc3MoXzQ4MCxkb2pvLmh0bWwuZ2V0Q2xhc3MoXzQ4MSkpOworfTsKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWU9ZnVuY3Rpb24obm9kZSxfNDgzLF80ODQpewordmFyIHM9ZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSxfNDgzKTsKK2lmKCghcyl8fCgocz09ImF1dG8iKSYmKF80ODQpKSl7CityZXR1cm4ge3ZhbHVlOjAsdW5pdHM6InB4In07Cit9Cit2YXIgXzQ4Nj1zLm1hdGNoKC8oXC0/W1xkLl0rKShbYS16JV0qKS9pKTsKK2lmKCFfNDg2KXsKK3JldHVybiBkb2pvLmh0bWwuZ2V0VW5pdFZhbHVlLmJhZDsKK30KK3JldHVybiB7dmFsdWU6TnVtYmVyKF80ODZbMV0pLHVuaXRzOl80ODZbMl0udG9Mb3dlckNhc2UoKX07Cit9OworZG9qby5odG1sLmdldFVuaXRWYWx1ZS5iYWQ9e3ZhbHVlOk5hTix1bml0czoiIn07CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uaHRtbC50b1BpeGVsVmFsdWU9ZnVuY3Rpb24oXzQ4NyxfNDg4KXsKK2lmKCFfNDg4KXsKK3JldHVybiAwOworfQoraWYoXzQ4OC5zbGljZSgtMik9PSJweCIpeworcmV0dXJuIHBhcnNlRmxvYXQoXzQ4OCk7Cit9Cit2YXIgXzQ4OT0wOword2l0aChfNDg3KXsKK3ZhciBfNDhhPXN0eWxlLmxlZnQ7Cit2YXIgXzQ4Yj1ydW50aW1lU3R5bGUubGVmdDsKK3J1bnRpbWVTdHlsZS5sZWZ0PWN1cnJlbnRTdHlsZS5sZWZ0OwordHJ5eworc3R5bGUubGVmdD1fNDg4fHwwOworXzQ4OT1zdHlsZS5waXhlbExlZnQ7CitzdHlsZS5sZWZ0PV80OGE7CitydW50aW1lU3R5bGUubGVmdD1fNDhiOworfQorY2F0Y2goZSl7Cit9Cit9CityZXR1cm4gXzQ4OTsKK307Cit9ZWxzZXsKK2Rvam8uaHRtbC50b1BpeGVsVmFsdWU9ZnVuY3Rpb24oXzQ4YyxfNDhkKXsKK3JldHVybiAoXzQ4ZCYmKF80OGQuc2xpY2UoLTIpPT0icHgiKT9wYXJzZUZsb2F0KF80OGQpOjApOworfTsKK30KK2Rvam8uaHRtbC5nZXRQaXhlbFZhbHVlPWZ1bmN0aW9uKG5vZGUsXzQ4ZixfNDkwKXsKK3JldHVybiBkb2pvLmh0bWwudG9QaXhlbFZhbHVlKG5vZGUsZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSxfNDhmKSk7Cit9OworZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZT1mdW5jdGlvbihub2RlLF80OTIsXzQ5Myl7CitpZihpc05hTihfNDkzKSl7CityZXR1cm4gZmFsc2U7Cit9Citub2RlLnN0eWxlW180OTJdPU1hdGgubWF4KDAsXzQ5MykrInB4IjsKK3JldHVybiB0cnVlOworfTsKK2Rvam8uaHRtbC5zdHlsZVNoZWV0PW51bGw7Citkb2pvLmh0bWwuaW5zZXJ0Q3NzUnVsZT1mdW5jdGlvbihfNDk0LF80OTUsXzQ5Nil7CitpZighZG9qby5odG1sLnN0eWxlU2hlZXQpeworaWYoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCl7Citkb2pvLmh0bWwuc3R5bGVTaGVldD1kb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KCk7Cit9ZWxzZXsKK2lmKGRvY3VtZW50LnN0eWxlU2hlZXRzWzBdKXsKK2Rvam8uaHRtbC5zdHlsZVNoZWV0PWRvY3VtZW50LnN0eWxlU2hlZXRzWzBdOworfWVsc2V7CityZXR1cm4gbnVsbDsKK30KK30KK30KK2lmKGFyZ3VtZW50cy5sZW5ndGg8Myl7CitpZihkb2pvLmh0bWwuc3R5bGVTaGVldC5jc3NSdWxlcyl7CitfNDk2PWRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aDsKK31lbHNleworaWYoZG9qby5odG1sLnN0eWxlU2hlZXQucnVsZXMpeworXzQ5Nj1kb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcy5sZW5ndGg7Cit9ZWxzZXsKK3JldHVybiBudWxsOworfQorfQorfQoraWYoZG9qby5odG1sLnN0eWxlU2hlZXQuaW5zZXJ0UnVsZSl7Cit2YXIgcnVsZT1fNDk0KyIgeyAiK180OTUrIiB9IjsKK3JldHVybiBkb2pvLmh0bWwuc3R5bGVTaGVldC5pbnNlcnRSdWxlKHJ1bGUsXzQ5Nik7Cit9ZWxzZXsKK2lmKGRvam8uaHRtbC5zdHlsZVNoZWV0LmFkZFJ1bGUpeworcmV0dXJuIGRvam8uaHRtbC5zdHlsZVNoZWV0LmFkZFJ1bGUoXzQ5NCxfNDk1LF80OTYpOworfWVsc2V7CityZXR1cm4gbnVsbDsKK30KK30KK307Citkb2pvLmh0bWwucmVtb3ZlQ3NzUnVsZT1mdW5jdGlvbihfNDk4KXsKK2lmKCFkb2pvLmh0bWwuc3R5bGVTaGVldCl7Citkb2pvLmRlYnVnKCJubyBzdHlsZXNoZWV0IGRlZmluZWQgZm9yIHJlbW92aW5nIHJ1bGVzIik7CityZXR1cm4gZmFsc2U7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2lmKCFfNDk4KXsKK180OTg9ZG9qby5odG1sLnN0eWxlU2hlZXQucnVsZXMubGVuZ3RoOworZG9qby5odG1sLnN0eWxlU2hlZXQucmVtb3ZlUnVsZShfNDk4KTsKK30KK31lbHNleworaWYoZG9jdW1lbnQuc3R5bGVTaGVldHNbMF0peworaWYoIV80OTgpeworXzQ5OD1kb2pvLmh0bWwuc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGg7Cit9Citkb2pvLmh0bWwuc3R5bGVTaGVldC5kZWxldGVSdWxlKF80OTgpOworfQorfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzPVtdOworZG9qby5odG1sLmluc2VydENzc0ZpbGU9ZnVuY3Rpb24oVVJJLGRvYyxfNDliLF80OWMpeworaWYoIVVSSSl7CityZXR1cm47Cit9CitpZighZG9jKXsKK2RvYz1kb2N1bWVudDsKK30KK3ZhciBfNDlkPWRvam8uaG9zdGVudi5nZXRUZXh0KFVSSSxmYWxzZSxfNDljKTsKK2lmKF80OWQ9PT1udWxsKXsKK3JldHVybjsKK30KK180OWQ9ZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KF80OWQsVVJJKTsKK2lmKF80OWIpewordmFyIGlkeD0tMSxub2RlLGVudD1kb2pvLmh0bWwuX2luc2VydGVkQ3NzRmlsZXM7Citmb3IodmFyIGk9MDtpPGVudC5sZW5ndGg7aSsrKXsKK2lmKChlbnRbaV0uZG9jPT1kb2MpJiYoZW50W2ldLmNzc1RleHQ9PV80OWQpKXsKK2lkeD1pOworbm9kZT1lbnRbaV0ubm9kZVJlZjsKK2JyZWFrOworfQorfQoraWYobm9kZSl7Cit2YXIgXzRhMj1kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIik7Citmb3IodmFyIGk9MDtpPF80YTIubGVuZ3RoO2krKyl7CitpZihfNGEyW2ldPT1ub2RlKXsKK3JldHVybjsKK30KK30KK2Rvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5zaGlmdChpZHgsMSk7Cit9Cit9Cit2YXIgXzRhMz1kb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dChfNDlkLGRvYyk7Citkb2pvLmh0bWwuX2luc2VydGVkQ3NzRmlsZXMucHVzaCh7ImRvYyI6ZG9jLCJjc3NUZXh0IjpfNDlkLCJub2RlUmVmIjpfNGEzfSk7CitpZihfNGEzJiZkakNvbmZpZy5pc0RlYnVnKXsKK180YTMuc2V0QXR0cmlidXRlKCJkYmdIcmVmIixVUkkpOworfQorcmV0dXJuIF80YTM7Cit9OworZG9qby5odG1sLmluc2VydENzc1RleHQ9ZnVuY3Rpb24oXzRhNCxkb2MsVVJJKXsKK2lmKCFfNGE0KXsKK3JldHVybjsKK30KK2lmKCFkb2MpeworZG9jPWRvY3VtZW50OworfQoraWYoVVJJKXsKK180YTQ9ZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KF80YTQsVVJJKTsKK30KK3ZhciBfNGE3PWRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOworXzRhNy5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpOwordmFyIGhlYWQ9ZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CitpZighaGVhZCl7Citkb2pvLmRlYnVnKCJObyBoZWFkIHRhZyBpbiBkb2N1bWVudCwgYWJvcnRpbmcgc3R5bGVzIik7CityZXR1cm47Cit9ZWxzZXsKK2hlYWQuYXBwZW5kQ2hpbGQoXzRhNyk7Cit9CitpZihfNGE3LnN0eWxlU2hlZXQpewordmFyIF80YTk9ZnVuY3Rpb24oKXsKK3RyeXsKK180YTcuc3R5bGVTaGVldC5jc3NUZXh0PV80YTQ7Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoZSk7Cit9Cit9OworaWYoXzRhNy5zdHlsZVNoZWV0LmRpc2FibGVkKXsKK3NldFRpbWVvdXQoXzRhOSwxMCk7Cit9ZWxzZXsKK180YTkoKTsKK30KK31lbHNlewordmFyIF80YWE9ZG9jLmNyZWF0ZVRleHROb2RlKF80YTQpOworXzRhNy5hcHBlbmRDaGlsZChfNGFhKTsKK30KK3JldHVybiBfNGE3OworfTsKK2Rvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dD1mdW5jdGlvbihfNGFiLFVSSSl7CitpZighXzRhYnx8IVVSSSl7CityZXR1cm47Cit9Cit2YXIgXzRhZCxzdHI9IiIsdXJsPSIiLF80YjA9IltcXHRcXHNcXHdcXChcXClcXC9cXC5cXFxcJ1wiLTojPSY/fl0rIjsKK3ZhciBfNGIxPW5ldyBSZWdFeHAoInVybFxcKFxccyooIitfNGIwKyIpXFxzKlxcKSIpOwordmFyIF80YjI9LyhmaWxlfGh0dHBzP3xmdHBzPyk6XC9cLy87CityZWdleFRyaW09bmV3IFJlZ0V4cCgiXltcXHNdKihbJ1wiXT8pKCIrXzRiMCsiKVxcMVtcXHNdKj8kIik7CitpZihkb2pvLnJlbmRlci5odG1sLmllNTV8fGRvam8ucmVuZGVyLmh0bWwuaWU2MCl7Cit2YXIgXzRiMz1uZXcgUmVnRXhwKCJBbHBoYUltYWdlTG9hZGVyXFwoKC4qKXNyYz1bJ1wiXSgiK180YjArIilbJ1wiXSIpOword2hpbGUoXzRhZD1fNGIzLmV4ZWMoXzRhYikpewordXJsPV80YWRbMl0ucmVwbGFjZShyZWdleFRyaW0sIiQyIik7CitpZighXzRiMi5leGVjKHVybCkpewordXJsPShuZXcgZG9qby51cmkuVXJpKFVSSSx1cmwpLnRvU3RyaW5nKCkpOworfQorc3RyKz1fNGFiLnN1YnN0cmluZygwLF80YWQuaW5kZXgpKyJBbHBoYUltYWdlTG9hZGVyKCIrXzRhZFsxXSsic3JjPSciK3VybCsiJyI7CitfNGFiPV80YWIuc3Vic3RyKF80YWQuaW5kZXgrXzRhZFswXS5sZW5ndGgpOworfQorXzRhYj1zdHIrXzRhYjsKK3N0cj0iIjsKK30KK3doaWxlKF80YWQ9XzRiMS5leGVjKF80YWIpKXsKK3VybD1fNGFkWzFdLnJlcGxhY2UocmVnZXhUcmltLCIkMiIpOworaWYoIV80YjIuZXhlYyh1cmwpKXsKK3VybD0obmV3IGRvam8udXJpLlVyaShVUkksdXJsKS50b1N0cmluZygpKTsKK30KK3N0cis9XzRhYi5zdWJzdHJpbmcoMCxfNGFkLmluZGV4KSsidXJsKCIrdXJsKyIpIjsKK180YWI9XzRhYi5zdWJzdHIoXzRhZC5pbmRleCtfNGFkWzBdLmxlbmd0aCk7Cit9CityZXR1cm4gc3RyK180YWI7Cit9OworZG9qby5odG1sLnNldEFjdGl2ZVN0eWxlU2hlZXQ9ZnVuY3Rpb24oXzRiNCl7Cit2YXIgaT0wLGEsZWxzPWRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKK3doaWxlKGE9ZWxzW2krK10peworaWYoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikhPS0xJiZhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSl7CithLmRpc2FibGVkPXRydWU7CitpZihhLmdldEF0dHJpYnV0ZSgidGl0bGUiKT09XzRiNCl7CithLmRpc2FibGVkPWZhbHNlOworfQorfQorfQorfTsKK2Rvam8uaHRtbC5nZXRBY3RpdmVTdHlsZVNoZWV0PWZ1bmN0aW9uKCl7Cit2YXIgaT0wLGEsZWxzPWRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKK3doaWxlKGE9ZWxzW2krK10peworaWYoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikhPS0xJiZhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSYmIWEuZGlzYWJsZWQpeworcmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOworfQorfQorcmV0dXJuIG51bGw7Cit9OworZG9qby5odG1sLmdldFByZWZlcnJlZFN0eWxlU2hlZXQ9ZnVuY3Rpb24oKXsKK3ZhciBpPTAsYSxlbHM9ZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOword2hpbGUoYT1lbHNbaSsrXSl7CitpZihhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigic3R5bGUiKSE9LTEmJmEuZ2V0QXR0cmlidXRlKCJyZWwiKS5pbmRleE9mKCJhbHQiKT09LTEmJmEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXsKK3JldHVybiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKTsKK30KK30KK3JldHVybiBudWxsOworfTsKK2Rvam8uaHRtbC5hcHBseUJyb3dzZXJDbGFzcz1mdW5jdGlvbihub2RlKXsKK3ZhciBkcmg9ZG9qby5yZW5kZXIuaHRtbDsKK3ZhciBfNGMwPXtkal9pZTpkcmguaWUsZGpfaWU1NTpkcmguaWU1NSxkal9pZTY6ZHJoLmllNjAsZGpfaWU3OmRyaC5pZTcwLGRqX2llcXVpcmtzOmRyaC5pZSYmZHJoLnF1aXJrcyxkal9vcGVyYTpkcmgub3BlcmEsZGpfb3BlcmE4OmRyaC5vcGVyYSYmKE1hdGguZmxvb3IoZG9qby5yZW5kZXIudmVyc2lvbik9PTgpLGRqX29wZXJhOTpkcmgub3BlcmEmJihNYXRoLmZsb29yKGRvam8ucmVuZGVyLnZlcnNpb24pPT05KSxkal9raHRtbDpkcmgua2h0bWwsZGpfc2FmYXJpOmRyaC5zYWZhcmksZGpfZ2Vja286ZHJoLm1vemlsbGF9OworZm9yKHZhciBwIGluIF80YzApeworaWYoXzRjMFtwXSl7Citkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSxwKTsKK30KK30KK307Citkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5kaXNwbGF5Iik7Citkb2pvLmh0bWwuX3RvZ2dsZT1mdW5jdGlvbihub2RlLF80YzMsXzRjNCl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK180YzQobm9kZSwhXzRjMyhub2RlKSk7CityZXR1cm4gXzRjMyhub2RlKTsKK307Citkb2pvLmh0bWwuc2hvdz1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYoZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwiZGlzcGxheSIpPT0ibm9uZSIpeworZG9qby5odG1sLnNldFN0eWxlKG5vZGUsImRpc3BsYXkiLChub2RlLmRvam9EaXNwbGF5Q2FjaGV8fCIiKSk7Citub2RlLmRvam9EaXNwbGF5Q2FjaGU9dW5kZWZpbmVkOworfQorfTsKK2Rvam8uaHRtbC5oaWRlPWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZih0eXBlb2Ygbm9kZVsiZG9qb0Rpc3BsYXlDYWNoZSJdPT0idW5kZWZpbmVkIil7Cit2YXIgZD1kb2pvLmh0bWwuZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCJkaXNwbGF5Iik7CitpZihkIT0ibm9uZSIpeworbm9kZS5kb2pvRGlzcGxheUNhY2hlPWQ7Cit9Cit9Citkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwiZGlzcGxheSIsIm5vbmUiKTsKK307Citkb2pvLmh0bWwuc2V0U2hvd2luZz1mdW5jdGlvbihub2RlLF80YzkpeworZG9qby5odG1sWyhfNGM5PyJzaG93IjoiaGlkZSIpXShub2RlKTsKK307Citkb2pvLmh0bWwuaXNTaG93aW5nPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIChkb2pvLmh0bWwuZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCJkaXNwbGF5IikhPSJub25lIik7Cit9OworZG9qby5odG1sLnRvZ2dsZVNob3dpbmc9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9qby5odG1sLl90b2dnbGUobm9kZSxkb2pvLmh0bWwuaXNTaG93aW5nLGRvam8uaHRtbC5zZXRTaG93aW5nKTsKK307Citkb2pvLmh0bWwuZGlzcGxheU1hcD17dHI6IiIsdGQ6IiIsdGg6IiIsaW1nOiJpbmxpbmUiLHNwYW46ImlubGluZSIsaW5wdXQ6ImlubGluZSIsYnV0dG9uOiJpbmxpbmUifTsKK2Rvam8uaHRtbC5zdWdnZXN0RGlzcGxheUJ5VGFnTmFtZT1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYobm9kZSYmbm9kZS50YWdOYW1lKXsKK3ZhciB0YWc9bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CityZXR1cm4gKHRhZyBpbiBkb2pvLmh0bWwuZGlzcGxheU1hcD9kb2pvLmh0bWwuZGlzcGxheU1hcFt0YWddOiJibG9jayIpOworfQorfTsKK2Rvam8uaHRtbC5zZXREaXNwbGF5PWZ1bmN0aW9uKG5vZGUsXzRjZil7Citkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwiZGlzcGxheSIsKChfNGNmIGluc3RhbmNlb2YgU3RyaW5nfHx0eXBlb2YgXzRjZj09InN0cmluZyIpP180Y2Y6KF80Y2Y/ZG9qby5odG1sLnN1Z2dlc3REaXNwbGF5QnlUYWdOYW1lKG5vZGUpOiJub25lIikpKTsKK307Citkb2pvLmh0bWwuaXNEaXNwbGF5ZWQ9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsImRpc3BsYXkiKSE9Im5vbmUiKTsKK307Citkb2pvLmh0bWwudG9nZ2xlRGlzcGxheT1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX3RvZ2dsZShub2RlLGRvam8uaHRtbC5pc0Rpc3BsYXllZCxkb2pvLmh0bWwuc2V0RGlzcGxheSk7Cit9OworZG9qby5odG1sLnNldFZpc2liaWxpdHk9ZnVuY3Rpb24obm9kZSxfNGQzKXsKK2Rvam8uaHRtbC5zZXRTdHlsZShub2RlLCJ2aXNpYmlsaXR5IiwoKF80ZDMgaW5zdGFuY2VvZiBTdHJpbmd8fHR5cGVvZiBfNGQzPT0ic3RyaW5nIik/XzRkMzooXzRkMz8idmlzaWJsZSI6ImhpZGRlbiIpKSk7Cit9OworZG9qby5odG1sLmlzVmlzaWJsZT1mdW5jdGlvbihub2RlKXsKK3JldHVybiAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwidmlzaWJpbGl0eSIpIT0iaGlkZGVuIik7Cit9OworZG9qby5odG1sLnRvZ2dsZVZpc2liaWxpdHk9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9qby5odG1sLl90b2dnbGUobm9kZSxkb2pvLmh0bWwuaXNWaXNpYmxlLGRvam8uaHRtbC5zZXRWaXNpYmlsaXR5KTsKK307Citkb2pvLmh0bWwuc2V0T3BhY2l0eT1mdW5jdGlvbihub2RlLF80ZDcsXzRkOCl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7CitpZighXzRkOCl7CitpZihfNGQ3Pj0xKXsKK2lmKGguaWUpeworZG9qby5odG1sLmNsZWFyT3BhY2l0eShub2RlKTsKK3JldHVybjsKK31lbHNleworXzRkNz0wLjk5OTk5OTsKK30KK31lbHNleworaWYoXzRkNzwwKXsKK180ZDc9MDsKK30KK30KK30KK2lmKGguaWUpeworaWYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT0idHIiKXsKK3ZhciB0ZHM9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKK2Zvcih2YXIgeD0wO3g8dGRzLmxlbmd0aDt4KyspewordGRzW3hdLnN0eWxlLmZpbHRlcj0iQWxwaGEoT3BhY2l0eT0iK180ZDcqMTAwKyIpIjsKK30KK30KK25vZGUuc3R5bGUuZmlsdGVyPSJBbHBoYShPcGFjaXR5PSIrXzRkNyoxMDArIikiOworfWVsc2V7CitpZihoLm1veil7Citub2RlLnN0eWxlLm9wYWNpdHk9XzRkNzsKK25vZGUuc3R5bGUuTW96T3BhY2l0eT1fNGQ3OworfWVsc2V7CitpZihoLnNhZmFyaSl7Citub2RlLnN0eWxlLm9wYWNpdHk9XzRkNzsKK25vZGUuc3R5bGUuS2h0bWxPcGFjaXR5PV80ZDc7Cit9ZWxzZXsKK25vZGUuc3R5bGUub3BhY2l0eT1fNGQ3OworfQorfQorfQorfTsKK2Rvam8uaHRtbC5jbGVhck9wYWNpdHk9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBucz1ub2RlLnN0eWxlOwordmFyIGg9ZG9qby5yZW5kZXIuaHRtbDsKK2lmKGguaWUpewordHJ5eworaWYobm9kZS5maWx0ZXJzJiZub2RlLmZpbHRlcnMuYWxwaGEpeworbnMuZmlsdGVyPSIiOworfQorfQorY2F0Y2goZSl7Cit9Cit9ZWxzZXsKK2lmKGgubW96KXsKK25zLm9wYWNpdHk9MTsKK25zLk1vek9wYWNpdHk9MTsKK31lbHNleworaWYoaC5zYWZhcmkpeworbnMub3BhY2l0eT0xOworbnMuS2h0bWxPcGFjaXR5PTE7Cit9ZWxzZXsKK25zLm9wYWNpdHk9MTsKK30KK30KK30KK307Citkb2pvLmh0bWwuZ2V0T3BhY2l0eT1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIGg9ZG9qby5yZW5kZXIuaHRtbDsKK2lmKGguaWUpewordmFyIG9wYWM9KG5vZGUuZmlsdGVycyYmbm9kZS5maWx0ZXJzLmFscGhhJiZ0eXBlb2Ygbm9kZS5maWx0ZXJzLmFscGhhLm9wYWNpdHk9PSJudW1iZXIiP25vZGUuZmlsdGVycy5hbHBoYS5vcGFjaXR5OjEwMCkvMTAwOworfWVsc2V7Cit2YXIgb3BhYz1ub2RlLnN0eWxlLm9wYWNpdHl8fG5vZGUuc3R5bGUuTW96T3BhY2l0eXx8bm9kZS5zdHlsZS5LaHRtbE9wYWNpdHl8fDE7Cit9CityZXR1cm4gb3BhYz49MC45OTk5OTk/MTpOdW1iZXIob3BhYyk7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuY29sb3IiKTsKK2Rvam8uaHRtbC5nZXRCYWNrZ3JvdW5kQ29sb3I9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBfNGUzOworZG97CitfNGUzPWRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJiYWNrZ3JvdW5kLWNvbG9yIik7CitpZihfNGUzLnRvTG93ZXJDYXNlKCk9PSJyZ2JhKDAsIDAsIDAsIDApIil7CitfNGUzPSJ0cmFuc3BhcmVudCI7Cit9CitpZihub2RlPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKXsKK25vZGU9bnVsbDsKK2JyZWFrOworfQorbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9d2hpbGUobm9kZSYmZG9qby5sYW5nLmluQXJyYXkoWyJ0cmFuc3BhcmVudCIsIiJdLF80ZTMpKTsKK2lmKF80ZTM9PSJ0cmFuc3BhcmVudCIpeworXzRlMz1bMjU1LDI1NSwyNTUsMF07Cit9ZWxzZXsKK180ZTM9ZG9qby5nZnguY29sb3IuZXh0cmFjdFJHQihfNGUzKTsKK30KK3JldHVybiBfNGUzOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcz1mdW5jdGlvbihub2RlLHByb3Apeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZighbm9kZSl7CityZXR1cm4gMDsKK30KK3ZhciBfNGU2PTA7Cit3aGlsZShub2RlKXsKK2lmKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsInBvc2l0aW9uIik9PSJmaXhlZCIpeworcmV0dXJuIDA7Cit9Cit2YXIgdmFsPW5vZGVbcHJvcF07CitpZih2YWwpeworXzRlNis9dmFsLTA7CitpZihub2RlPT1kb2pvLmJvZHkoKSl7CiticmVhazsKK30KK30KK25vZGU9bm9kZS5wYXJlbnROb2RlOworfQorcmV0dXJuIF80ZTY7Cit9OworZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcz1mdW5jdGlvbihub2RlLF80ZTkpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgXzRlYT1fNGU5LnJlcGxhY2UoLyg7KT9ccyokLywiIikuc3BsaXQoIjsiKTsKK2Zvcih2YXIgaT0wO2k8XzRlYS5sZW5ndGg7aSsrKXsKK3ZhciBfNGVjPV80ZWFbaV0uc3BsaXQoIjoiKTsKK3ZhciBuYW1lPV80ZWNbMF0ucmVwbGFjZSgvXHMqJC8sIiIpLnJlcGxhY2UoL15ccyovLCIiKS50b0xvd2VyQ2FzZSgpOwordmFyIF80ZWU9XzRlY1sxXS5yZXBsYWNlKC9ccyokLywiIikucmVwbGFjZSgvXlxzKi8sIiIpOworc3dpdGNoKG5hbWUpeworY2FzZSAib3BhY2l0eSI6Citkb2pvLmh0bWwuc2V0T3BhY2l0eShub2RlLF80ZWUpOworYnJlYWs7CitjYXNlICJjb250ZW50LWhlaWdodCI6Citkb2pvLmh0bWwuc2V0Q29udGVudEJveChub2RlLHtoZWlnaHQ6XzRlZX0pOworYnJlYWs7CitjYXNlICJjb250ZW50LXdpZHRoIjoKK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94KG5vZGUse3dpZHRoOl80ZWV9KTsKK2JyZWFrOworY2FzZSAib3V0ZXItaGVpZ2h0IjoKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSx7aGVpZ2h0Ol80ZWV9KTsKK2JyZWFrOworY2FzZSAib3V0ZXItd2lkdGgiOgorZG9qby5odG1sLnNldE1hcmdpbkJveChub2RlLHt3aWR0aDpfNGVlfSk7CiticmVhazsKK2RlZmF1bHQ6Citub2RlLnN0eWxlW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShuYW1lKV09XzRlZTsKK30KK30KK307Citkb2pvLmh0bWwuYm94U2l6aW5nPXtNQVJHSU5fQk9YOiJtYXJnaW4tYm94IixCT1JERVJfQk9YOiJib3JkZXItYm94IixQQURESU5HX0JPWDoicGFkZGluZy1ib3giLENPTlRFTlRfQk9YOiJjb250ZW50LWJveCJ9OworZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb249ZG9qby5odG1sLmFicz1mdW5jdGlvbihub2RlLF80ZjAsXzRmMSl7Citub2RlPWRvam8uYnlJZChub2RlLG5vZGUub3duZXJEb2N1bWVudCk7Cit2YXIgcmV0PXt4OjAseTowfTsKK3ZhciBicz1kb2pvLmh0bWwuYm94U2l6aW5nOworaWYoIV80ZjEpeworXzRmMT1icy5DT05URU5UX0JPWDsKK30KK3ZhciBfNGY0PTI7Cit2YXIgXzRmNTsKK3N3aXRjaChfNGYxKXsKK2Nhc2UgYnMuTUFSR0lOX0JPWDoKK180ZjU9MzsKK2JyZWFrOworY2FzZSBicy5CT1JERVJfQk9YOgorXzRmNT0yOworYnJlYWs7CitjYXNlIGJzLlBBRERJTkdfQk9YOgorZGVmYXVsdDoKK180ZjU9MTsKK2JyZWFrOworY2FzZSBicy5DT05URU5UX0JPWDoKK180ZjU9MDsKK2JyZWFrOworfQordmFyIGg9ZG9qby5yZW5kZXIuaHRtbDsKK3ZhciBkYj1kb2N1bWVudFsiYm9keSJdfHxkb2N1bWVudFsiZG9jdW1lbnRFbGVtZW50Il07CitpZihoLmllKXsKK3dpdGgobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl7CityZXQueD1sZWZ0LTI7CityZXQueT10b3AtMjsKK30KK31lbHNleworaWYoZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yKXsKK180ZjQ9MTsKK3RyeXsKK3ZhciBibz1kb2N1bWVudC5nZXRCb3hPYmplY3RGb3Iobm9kZSk7CityZXQueD1iby54LWRvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXMobm9kZSwic2Nyb2xsTGVmdCIpOworcmV0Lnk9Ym8ueS1kb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsInNjcm9sbFRvcCIpOworfQorY2F0Y2goZSl7Cit9Cit9ZWxzZXsKK2lmKG5vZGVbIm9mZnNldFBhcmVudCJdKXsKK3ZhciBfNGY5OworaWYoKGguc2FmYXJpKSYmKG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKT09ImFic29sdXRlIikmJihub2RlLnBhcmVudE5vZGU9PWRiKSl7CitfNGY5PWRiOworfWVsc2V7CitfNGY5PWRiLnBhcmVudE5vZGU7Cit9CitpZihub2RlLnBhcmVudE5vZGUhPWRiKXsKK3ZhciBuZD1ub2RlOworaWYoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7CituZD1kYjsKK30KK3JldC54LT1kb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5kLCJzY3JvbGxMZWZ0Iik7CityZXQueS09ZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyhuZCwic2Nyb2xsVG9wIik7Cit9Cit2YXIgXzRmYj1ub2RlOworZG97Cit2YXIgbj1fNGZiWyJvZmZzZXRMZWZ0Il07CitpZighaC5vcGVyYXx8bj4wKXsKK3JldC54Kz1pc05hTihuKT8wOm47Cit9Cit2YXIgbT1fNGZiWyJvZmZzZXRUb3AiXTsKK3JldC55Kz1pc05hTihtKT8wOm07CitfNGZiPV80ZmIub2Zmc2V0UGFyZW50OworfXdoaWxlKChfNGZiIT1fNGY5KSYmKF80ZmIhPW51bGwpKTsKK31lbHNleworaWYobm9kZVsieCJdJiZub2RlWyJ5Il0peworcmV0LngrPWlzTmFOKG5vZGUueCk/MDpub2RlLng7CityZXQueSs9aXNOYU4obm9kZS55KT8wOm5vZGUueTsKK30KK30KK30KK30KK2lmKF80ZjApewordmFyIF80ZmU9ZG9qby5odG1sLmdldFNjcm9sbCgpOworcmV0LnkrPV80ZmUudG9wOworcmV0LngrPV80ZmUubGVmdDsKK30KK3ZhciBfNGZmPVtkb2pvLmh0bWwuZ2V0UGFkZGluZ0V4dGVudCxkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50LGRvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnRdOworaWYoXzRmND5fNGY1KXsKK2Zvcih2YXIgaT1fNGY1O2k8XzRmNDsrK2kpeworcmV0LnkrPV80ZmZbaV0obm9kZSwidG9wIik7CityZXQueCs9XzRmZltpXShub2RlLCJsZWZ0Iik7Cit9Cit9ZWxzZXsKK2lmKF80ZjQ8XzRmNSl7Citmb3IodmFyIGk9XzRmNTtpPl80ZjQ7LS1pKXsKK3JldC55LT1fNGZmW2ktMV0obm9kZSwidG9wIik7CityZXQueC09XzRmZltpLTFdKG5vZGUsImxlZnQiKTsKK30KK30KK30KK3JldC50b3A9cmV0Lnk7CityZXQubGVmdD1yZXQueDsKK3JldHVybiByZXQ7Cit9OworZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZT1mdW5jdGlvbihub2RlKXsKK3JldHVybiAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwicG9zaXRpb24iKT09ImFic29sdXRlIik7Cit9OworZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcz1mdW5jdGlvbihub2RlLF81MDMsXzUwNCl7Cit2YXIgXzUwNT0wOworZm9yKHZhciB4PTA7eDxfNTAzLmxlbmd0aDt4KyspeworXzUwNSs9ZG9qby5odG1sLmdldFBpeGVsVmFsdWUobm9kZSxfNTAzW3hdLF81MDQpOworfQorcmV0dXJuIF81MDU7Cit9OworZG9qby5odG1sLmdldE1hcmdpbj1mdW5jdGlvbihub2RlKXsKK3JldHVybiB7d2lkdGg6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLFsibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiXSwoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwicG9zaXRpb24iKT09ImFic29sdXRlIikpLGhlaWdodDpkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsWyJtYXJnaW4tdG9wIiwibWFyZ2luLWJvdHRvbSJdLChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCJwb3NpdGlvbiIpPT0iYWJzb2x1dGUiKSl9OworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXI9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4ge3dpZHRoOmRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwibGVmdCIpK2Rvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwicmlnaHQiKSxoZWlnaHQ6ZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCJ0b3AiKStkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsImJvdHRvbSIpfTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50PWZ1bmN0aW9uKG5vZGUsc2lkZSl7CityZXR1cm4gKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJib3JkZXItIitzaWRlKyItc3R5bGUiKT09Im5vbmUiPzA6ZG9qby5odG1sLmdldFBpeGVsVmFsdWUobm9kZSwiYm9yZGVyLSIrc2lkZSsiLXdpZHRoIikpOworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnQ9ZnVuY3Rpb24obm9kZSxzaWRlKXsKK3JldHVybiBkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsWyJtYXJnaW4tIitzaWRlXSxkb2pvLmh0bWwuaXNQb3NpdGlvbkFic29sdXRlKG5vZGUpKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZ0V4dGVudD1mdW5jdGlvbihub2RlLHNpZGUpeworcmV0dXJuIGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSxbInBhZGRpbmctIitzaWRlXSx0cnVlKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZz1mdW5jdGlvbihub2RlKXsKK3JldHVybiB7d2lkdGg6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLFsicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCJdLHRydWUpLGhlaWdodDpkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsWyJwYWRkaW5nLXRvcCIsInBhZGRpbmctYm90dG9tIl0sdHJ1ZSl9OworfTsKK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXI9ZnVuY3Rpb24obm9kZSl7Cit2YXIgcGFkPWRvam8uaHRtbC5nZXRQYWRkaW5nKG5vZGUpOwordmFyIF81MTI9ZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKK3JldHVybiB7d2lkdGg6cGFkLndpZHRoK181MTIud2lkdGgsaGVpZ2h0OnBhZC5oZWlnaHQrXzUxMi5oZWlnaHR9OworfTsKK2Rvam8uaHRtbC5nZXRCb3hTaXppbmc9ZnVuY3Rpb24obm9kZSl7Cit2YXIgaD1kb2pvLnJlbmRlci5odG1sOwordmFyIGJzPWRvam8uaHRtbC5ib3hTaXppbmc7CitpZigoKGguaWUpfHwoaC5vcGVyYSkpJiZub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPSJpbWciKXsKK3ZhciBjbT1kb2N1bWVudFsiY29tcGF0TW9kZSJdOworaWYoKGNtPT0iQmFja0NvbXBhdCIpfHwoY209PSJRdWlya3NNb2RlIikpeworcmV0dXJuIGJzLkJPUkRFUl9CT1g7Cit9ZWxzZXsKK3JldHVybiBicy5DT05URU5UX0JPWDsKK30KK31lbHNleworaWYoYXJndW1lbnRzLmxlbmd0aD09MCl7Citub2RlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKK30KK3ZhciBfNTE3OworaWYoIWguaWUpeworXzUxNz1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiLW1vei1ib3gtc2l6aW5nIik7CitpZighXzUxNyl7CitfNTE3PWRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJib3gtc2l6aW5nIik7Cit9Cit9CityZXR1cm4gKF81MTc/XzUxNzpicy5DT05URU5UX0JPWCk7Cit9Cit9OworZG9qby5odG1sLmlzQm9yZGVyQm94PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIChkb2pvLmh0bWwuZ2V0Qm94U2l6aW5nKG5vZGUpPT1kb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJCb3g9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3JldHVybiB7d2lkdGg6bm9kZS5vZmZzZXRXaWR0aCxoZWlnaHQ6bm9kZS5vZmZzZXRIZWlnaHR9OworfTsKK2Rvam8uaHRtbC5nZXRQYWRkaW5nQm94PWZ1bmN0aW9uKG5vZGUpewordmFyIGJveD1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOwordmFyIF81MWM9ZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKK3JldHVybiB7d2lkdGg6Ym94LndpZHRoLV81MWMud2lkdGgsaGVpZ2h0OmJveC5oZWlnaHQtXzUxYy5oZWlnaHR9OworfTsKK2Rvam8uaHRtbC5nZXRDb250ZW50Qm94PWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgXzUxZT1kb2pvLmh0bWwuZ2V0UGFkQm9yZGVyKG5vZGUpOworcmV0dXJuIHt3aWR0aDpub2RlLm9mZnNldFdpZHRoLV81MWUud2lkdGgsaGVpZ2h0Om5vZGUub2Zmc2V0SGVpZ2h0LV81MWUuaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuc2V0Q29udGVudEJveD1mdW5jdGlvbihub2RlLGFyZ3Mpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgXzUyMT0wOwordmFyIF81MjI9MDsKK3ZhciBpc2JiPWRvam8uaHRtbC5pc0JvcmRlckJveChub2RlKTsKK3ZhciBfNTI0PShpc2JiP2Rvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSk6e3dpZHRoOjAsaGVpZ2h0OjB9KTsKK3ZhciByZXQ9e307CitpZih0eXBlb2YgYXJncy53aWR0aCE9InVuZGVmaW5lZCIpeworXzUyMT1hcmdzLndpZHRoK181MjQud2lkdGg7CityZXQud2lkdGg9ZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCJ3aWR0aCIsXzUyMSk7Cit9CitpZih0eXBlb2YgYXJncy5oZWlnaHQhPSJ1bmRlZmluZWQiKXsKK181MjI9YXJncy5oZWlnaHQrXzUyNC5oZWlnaHQ7CityZXQuaGVpZ2h0PWRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwiaGVpZ2h0IixfNTIyKTsKK30KK3JldHVybiByZXQ7Cit9OworZG9qby5odG1sLmdldE1hcmdpbkJveD1mdW5jdGlvbihub2RlKXsKK3ZhciBfNTI3PWRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7Cit2YXIgXzUyOD1kb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOworcmV0dXJuIHt3aWR0aDpfNTI3LndpZHRoK181Mjgud2lkdGgsaGVpZ2h0Ol81MjcuaGVpZ2h0K181MjguaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94PWZ1bmN0aW9uKG5vZGUsYXJncyl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBfNTJiPTA7Cit2YXIgXzUyYz0wOwordmFyIGlzYmI9ZG9qby5odG1sLmlzQm9yZGVyQm94KG5vZGUpOwordmFyIF81MmU9KCFpc2JiP2Rvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSk6e3dpZHRoOjAsaGVpZ2h0OjB9KTsKK3ZhciBfNTJmPWRvam8uaHRtbC5nZXRNYXJnaW4obm9kZSk7Cit2YXIgcmV0PXt9OworaWYodHlwZW9mIGFyZ3Mud2lkdGghPSJ1bmRlZmluZWQiKXsKK181MmI9YXJncy53aWR0aC1fNTJlLndpZHRoOworXzUyYi09XzUyZi53aWR0aDsKK3JldC53aWR0aD1kb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsIndpZHRoIixfNTJiKTsKK30KK2lmKHR5cGVvZiBhcmdzLmhlaWdodCE9InVuZGVmaW5lZCIpeworXzUyYz1hcmdzLmhlaWdodC1fNTJlLmhlaWdodDsKK181MmMtPV81MmYuaGVpZ2h0OworcmV0LmhlaWdodD1kb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsImhlaWdodCIsXzUyYyk7Cit9CityZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5nZXRFbGVtZW50Qm94PWZ1bmN0aW9uKG5vZGUsdHlwZSl7Cit2YXIgYnM9ZG9qby5odG1sLmJveFNpemluZzsKK3N3aXRjaCh0eXBlKXsKK2Nhc2UgYnMuTUFSR0lOX0JPWDoKK3JldHVybiBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KG5vZGUpOworY2FzZSBicy5CT1JERVJfQk9YOgorcmV0dXJuIGRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7CitjYXNlIGJzLlBBRERJTkdfQk9YOgorcmV0dXJuIGRvam8uaHRtbC5nZXRQYWRkaW5nQm94KG5vZGUpOworY2FzZSBicy5DT05URU5UX0JPWDoKK2RlZmF1bHQ6CityZXR1cm4gZG9qby5odG1sLmdldENvbnRlbnRCb3gobm9kZSk7Cit9Cit9OworZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdD1kb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oXzUzNCxfNTM1LF81MzYpeworaWYoXzUzNCBpbnN0YW5jZW9mIEFycmF5fHx0eXBlb2YgXzUzND09ImFycmF5Iil7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC50b0Nvb3JkaW5hdGVBcnJheSIsInVzZSBkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KHtsZWZ0OiAsIHRvcDogLCB3aWR0aDogLCBoZWlnaHQ6IH0pIGluc3RlYWQiLCIwLjUiKTsKK3doaWxlKF81MzQubGVuZ3RoPDQpeworXzUzNC5wdXNoKDApOworfQord2hpbGUoXzUzNC5sZW5ndGg+NCl7CitfNTM0LnBvcCgpOworfQordmFyIHJldD17bGVmdDpfNTM0WzBdLHRvcDpfNTM0WzFdLHdpZHRoOl81MzRbMl0saGVpZ2h0Ol81MzRbM119OworfWVsc2V7CitpZighXzUzNC5ub2RlVHlwZSYmIShfNTM0IGluc3RhbmNlb2YgU3RyaW5nfHx0eXBlb2YgXzUzND09InN0cmluZyIpJiYoIndpZHRoIiBpbiBfNTM0fHwiaGVpZ2h0IiBpbiBfNTM0fHwibGVmdCIgaW4gXzUzNHx8IngiIGluIF81MzR8fCJ0b3AiIGluIF81MzR8fCJ5IiBpbiBfNTM0KSl7Cit2YXIgcmV0PXtsZWZ0Ol81MzQubGVmdHx8XzUzNC54fHwwLHRvcDpfNTM0LnRvcHx8XzUzNC55fHwwLHdpZHRoOl81MzQud2lkdGh8fDAsaGVpZ2h0Ol81MzQuaGVpZ2h0fHwwfTsKK31lbHNlewordmFyIG5vZGU9ZG9qby5ieUlkKF81MzQpOwordmFyIHBvcz1kb2pvLmh0bWwuYWJzKG5vZGUsXzUzNSxfNTM2KTsKK3ZhciBfNTNhPWRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSk7Cit2YXIgcmV0PXtsZWZ0OnBvcy5sZWZ0LHRvcDpwb3MudG9wLHdpZHRoOl81M2Eud2lkdGgsaGVpZ2h0Ol81M2EuaGVpZ2h0fTsKK30KK30KK3JldC54PXJldC5sZWZ0OworcmV0Lnk9cmV0LnRvcDsKK3JldHVybiByZXQ7Cit9OworZG9qby5odG1sLnNldE1hcmdpbkJveFdpZHRoPWRvam8uaHRtbC5zZXRPdXRlcldpZHRoPWZ1bmN0aW9uKG5vZGUsXzUzYyl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0TWFyZ2luQm94V2lkdGgiLCJzZXRNYXJnaW5Cb3giLGFyZ3VtZW50cywid2lkdGgiKTsKK307Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94SGVpZ2h0PWRvam8uaHRtbC5zZXRPdXRlckhlaWdodD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldE1hcmdpbkJveEhlaWdodCIsInNldE1hcmdpbkJveCIsYXJndW1lbnRzLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luQm94V2lkdGg9ZG9qby5odG1sLmdldE91dGVyV2lkdGg9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5Cb3hXaWR0aCIsImdldE1hcmdpbkJveCIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldE1hcmdpbkJveEhlaWdodD1kb2pvLmh0bWwuZ2V0T3V0ZXJIZWlnaHQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5Cb3hIZWlnaHQiLCJnZXRNYXJnaW5Cb3giLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0VG90YWxPZmZzZXQ9ZnVuY3Rpb24obm9kZSx0eXBlLF81M2YpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFRvdGFsT2Zmc2V0IiwiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsYXJndW1lbnRzLG51bGwsdHlwZSk7Cit9OworZG9qby5odG1sLmdldEFic29sdXRlWD1mdW5jdGlvbihub2RlLF81NDEpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEFic29sdXRlWCIsImdldEFic29sdXRlUG9zaXRpb24iLGFyZ3VtZW50cyxudWxsLCJ4Iik7Cit9OworZG9qby5odG1sLmdldEFic29sdXRlWT1mdW5jdGlvbihub2RlLF81NDMpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEFic29sdXRlWSIsImdldEFic29sdXRlUG9zaXRpb24iLGFyZ3VtZW50cyxudWxsLCJ5Iik7Cit9OworZG9qby5odG1sLnRvdGFsT2Zmc2V0TGVmdD1mdW5jdGlvbihub2RlLF81NDUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInRvdGFsT2Zmc2V0TGVmdCIsImdldEFic29sdXRlUG9zaXRpb24iLGFyZ3VtZW50cyxudWxsLCJsZWZ0Iik7Cit9OworZG9qby5odG1sLnRvdGFsT2Zmc2V0VG9wPWZ1bmN0aW9uKG5vZGUsXzU0Nyl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgidG90YWxPZmZzZXRUb3AiLCJnZXRBYnNvbHV0ZVBvc2l0aW9uIixhcmd1bWVudHMsbnVsbCwidG9wIik7Cit9OworZG9qby5odG1sLmdldE1hcmdpbldpZHRoPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbldpZHRoIiwiZ2V0TWFyZ2luIixhcmd1bWVudHMsbnVsbCwid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luSGVpZ2h0PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbkhlaWdodCIsImdldE1hcmdpbiIsYXJndW1lbnRzLG51bGwsImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJXaWR0aD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJXaWR0aCIsImdldEJvcmRlciIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldEJvcmRlckhlaWdodD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJIZWlnaHQiLCJnZXRCb3JkZXIiLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZ1dpZHRoPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZGRpbmdXaWR0aCIsImdldFBhZGRpbmciLGFyZ3VtZW50cyxudWxsLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRQYWRkaW5nSGVpZ2h0PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZGRpbmdIZWlnaHQiLCJnZXRQYWRkaW5nIixhcmd1bWVudHMsbnVsbCwiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldFBhZEJvcmRlcldpZHRoPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZEJvcmRlcldpZHRoIiwiZ2V0UGFkQm9yZGVyIixhcmd1bWVudHMsbnVsbCwid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkQm9yZGVySGVpZ2h0PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZEJvcmRlckhlaWdodCIsImdldFBhZEJvcmRlciIsYXJndW1lbnRzLG51bGwsImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJCb3hXaWR0aD1kb2pvLmh0bWwuZ2V0SW5uZXJXaWR0aD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckJveFdpZHRoIiwiZ2V0Qm9yZGVyQm94Iixhcmd1bWVudHMsbnVsbCwid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94SGVpZ2h0PWRvam8uaHRtbC5nZXRJbm5lckhlaWdodD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckJveEhlaWdodCIsImdldEJvcmRlckJveCIsYXJndW1lbnRzLG51bGwsImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRDb250ZW50Qm94V2lkdGg9ZG9qby5odG1sLmdldENvbnRlbnRXaWR0aD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldENvbnRlbnRCb3hXaWR0aCIsImdldENvbnRlbnRCb3giLGFyZ3VtZW50cyxudWxsLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRDb250ZW50Qm94SGVpZ2h0PWRvam8uaHRtbC5nZXRDb250ZW50SGVpZ2h0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Q29udGVudEJveEhlaWdodCIsImdldENvbnRlbnRCb3giLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuc2V0Q29udGVudEJveFdpZHRoPWRvam8uaHRtbC5zZXRDb250ZW50V2lkdGg9ZnVuY3Rpb24obm9kZSxfNTUxKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRDb250ZW50Qm94V2lkdGgiLCJzZXRDb250ZW50Qm94Iixhcmd1bWVudHMsIndpZHRoIik7Cit9OworZG9qby5odG1sLnNldENvbnRlbnRCb3hIZWlnaHQ9ZG9qby5odG1sLnNldENvbnRlbnRIZWlnaHQ9ZnVuY3Rpb24obm9kZSxfNTUzKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRDb250ZW50Qm94SGVpZ2h0Iiwic2V0Q29udGVudEJveCIsYXJndW1lbnRzLCJoZWlnaHQiKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8ubGZ4Lmh0bWwiKTsKK2Rvam8ubGZ4Lmh0bWwuX2J5SWQ9ZnVuY3Rpb24oXzU1NCl7CitpZighXzU1NCl7CityZXR1cm4gW107Cit9CitpZihkb2pvLmxhbmcuaXNBcnJheUxpa2UoXzU1NCkpeworaWYoIV81NTQuYWxyZWFkeUNoZWNrZWQpewordmFyIG49W107Citkb2pvLmxhbmcuZm9yRWFjaChfNTU0LGZ1bmN0aW9uKG5vZGUpeworbi5wdXNoKGRvam8uYnlJZChub2RlKSk7Cit9KTsKK24uYWxyZWFkeUNoZWNrZWQ9dHJ1ZTsKK3JldHVybiBuOworfWVsc2V7CityZXR1cm4gXzU1NDsKK30KK31lbHNlewordmFyIG49W107CituLnB1c2goZG9qby5ieUlkKF81NTQpKTsKK24uYWxyZWFkeUNoZWNrZWQ9dHJ1ZTsKK3JldHVybiBuOworfQorfTsKK2Rvam8ubGZ4Lmh0bWwucHJvcGVydHlBbmltYXRpb249ZnVuY3Rpb24oXzU1NyxfNTU4LF81NTksXzU1YSxfNTViKXsKK181NTc9ZG9qby5sZnguaHRtbC5fYnlJZChfNTU3KTsKK3ZhciBfNTVjPXsicHJvcGVydHlNYXAiOl81NTgsIm5vZGVzIjpfNTU3LCJkdXJhdGlvbiI6XzU1OSwiZWFzaW5nIjpfNTVhfHxkb2pvLmxmeC5lYXNlRGVmYXVsdH07Cit2YXIgXzU1ZD1mdW5jdGlvbihhcmdzKXsKK2lmKGFyZ3Mubm9kZXMubGVuZ3RoPT0xKXsKK3ZhciBwbT1hcmdzLnByb3BlcnR5TWFwOworaWYoIWRvam8ubGFuZy5pc0FycmF5KGFyZ3MucHJvcGVydHlNYXApKXsKK3ZhciBwYXJyPVtdOworZm9yKHZhciBfNTYxIGluIHBtKXsKK3BtW181NjFdLnByb3BlcnR5PV81NjE7CitwYXJyLnB1c2gocG1bXzU2MV0pOworfQorcG09YXJncy5wcm9wZXJ0eU1hcD1wYXJyOworfQorZG9qby5sYW5nLmZvckVhY2gocG0sZnVuY3Rpb24ocHJvcCl7CitpZihkal91bmRlZigic3RhcnQiLHByb3ApKXsKK2lmKHByb3AucHJvcGVydHkhPSJvcGFjaXR5Iil7Citwcm9wLnN0YXJ0PXBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKGFyZ3Mubm9kZXNbMF0scHJvcC5wcm9wZXJ0eSkpOworfWVsc2V7Citwcm9wLnN0YXJ0PWRvam8uaHRtbC5nZXRPcGFjaXR5KGFyZ3Mubm9kZXNbMF0pOworfQorfQorfSk7Cit9Cit9OwordmFyIF81NjM9ZnVuY3Rpb24oXzU2NCl7Cit2YXIgXzU2NT1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKF81NjQsZnVuY3Rpb24oYyl7CitfNTY1LnB1c2goTWF0aC5yb3VuZChjKSk7Cit9KTsKK3JldHVybiBfNTY1OworfTsKK3ZhciBfNTY3PWZ1bmN0aW9uKG4sXzU2OSl7CituPWRvam8uYnlJZChuKTsKK2lmKCFufHwhbi5zdHlsZSl7CityZXR1cm47Cit9Citmb3IodmFyIHMgaW4gXzU2OSl7Cit0cnl7CitpZihzPT0ib3BhY2l0eSIpeworZG9qby5odG1sLnNldE9wYWNpdHkobixfNTY5W3NdKTsKK31lbHNleworbi5zdHlsZVtzXT1fNTY5W3NdOworfQorfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfQorfTsKK3ZhciBfNTZiPWZ1bmN0aW9uKF81NmMpewordGhpcy5fcHJvcGVydGllcz1fNTZjOwordGhpcy5kaWZmcz1uZXcgQXJyYXkoXzU2Yy5sZW5ndGgpOworZG9qby5sYW5nLmZvckVhY2goXzU2YyxmdW5jdGlvbihwcm9wLGkpeworaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5zdGFydCkpeworcHJvcC5zdGFydD1wcm9wLnN0YXJ0KHByb3AsaSk7Cit9CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihwcm9wLmVuZCkpeworcHJvcC5lbmQ9cHJvcC5lbmQocHJvcCxpKTsKK30KK2lmKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKXsKK3RoaXMuZGlmZnNbaV09bnVsbDsKK31lbHNleworaWYocHJvcC5zdGFydCBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKK3Byb3Auc3RhcnRSZ2I9cHJvcC5zdGFydC50b1JnYigpOworcHJvcC5lbmRSZ2I9cHJvcC5lbmQudG9SZ2IoKTsKK31lbHNlewordGhpcy5kaWZmc1tpXT1wcm9wLmVuZC1wcm9wLnN0YXJ0OworfQorfQorfSx0aGlzKTsKK3RoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24obil7Cit2YXIgcmV0PXt9OworZG9qby5sYW5nLmZvckVhY2godGhpcy5fcHJvcGVydGllcyxmdW5jdGlvbihwcm9wLGkpewordmFyIF81NzM9bnVsbDsKK2lmKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKXsKK31lbHNleworaWYocHJvcC5zdGFydCBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKK181NzM9KHByb3AudW5pdHN8fCJyZ2IiKSsiKCI7Citmb3IodmFyIGo9MDtqPHByb3Auc3RhcnRSZ2IubGVuZ3RoO2orKyl7CitfNTczKz1NYXRoLnJvdW5kKCgocHJvcC5lbmRSZ2Jbal0tcHJvcC5zdGFydFJnYltqXSkqbikrcHJvcC5zdGFydFJnYltqXSkrKGo8cHJvcC5zdGFydFJnYi5sZW5ndGgtMT8iLCI6IiIpOworfQorXzU3Mys9IikiOworfWVsc2V7CitfNTczPSgodGhpcy5kaWZmc1tpXSkqbikrcHJvcC5zdGFydCsocHJvcC5wcm9wZXJ0eSE9Im9wYWNpdHkiP3Byb3AudW5pdHN8fCJweCI6IiIpOworfQorfQorcmV0W2Rvam8uaHRtbC50b0NhbWVsQ2FzZShwcm9wLnByb3BlcnR5KV09XzU3MzsKK30sdGhpcyk7CityZXR1cm4gcmV0OworfTsKK307Cit2YXIgYW5pbT1uZXcgZG9qby5sZnguQW5pbWF0aW9uKHtiZWZvcmVCZWdpbjpmdW5jdGlvbigpeworXzU1ZChfNTVjKTsKK2FuaW0uY3VydmU9bmV3IF81NmIoXzU1Yy5wcm9wZXJ0eU1hcCk7Cit9LG9uQW5pbWF0ZTpmdW5jdGlvbihfNTc2KXsKK2Rvam8ubGFuZy5mb3JFYWNoKF81NWMubm9kZXMsZnVuY3Rpb24obm9kZSl7CitfNTY3KG5vZGUsXzU3Nik7Cit9KTsKK319LF81NWMuZHVyYXRpb24sbnVsbCxfNTVjLmVhc2luZyk7CitpZihfNTViKXsKK2Zvcih2YXIgeCBpbiBfNTViKXsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKF81NWJbeF0pKXsKK2FuaW0uY29ubmVjdCh4LGFuaW0sXzU1Ylt4XSk7Cit9Cit9Cit9CityZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLl9tYWtlRmFkZWFibGU9ZnVuY3Rpb24oXzU3OSl7Cit2YXIgXzU3YT1mdW5jdGlvbihub2RlKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworaWYoKG5vZGUuc3R5bGUuem9vbS5sZW5ndGg9PTApJiYoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsInpvb20iKT09Im5vcm1hbCIpKXsKK25vZGUuc3R5bGUuem9vbT0iMSI7Cit9CitpZigobm9kZS5zdHlsZS53aWR0aC5sZW5ndGg9PTApJiYoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsIndpZHRoIik9PSJhdXRvIikpeworbm9kZS5zdHlsZS53aWR0aD0iYXV0byI7Cit9Cit9Cit9OworaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKF81NzkpKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF81NzksXzU3YSk7Cit9ZWxzZXsKK181N2EoXzU3OSk7Cit9Cit9OworZG9qby5sZnguaHRtbC5mYWRlPWZ1bmN0aW9uKF81N2MsXzU3ZCxfNTdlLF81N2YsXzU4MCl7CitfNTdjPWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzU3Yyk7Cit2YXIgXzU4MT17cHJvcGVydHk6Im9wYWNpdHkifTsKK2lmKCFkal91bmRlZigic3RhcnQiLF81N2QpKXsKK181ODEuc3RhcnQ9XzU3ZC5zdGFydDsKK31lbHNleworXzU4MS5zdGFydD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5nZXRPcGFjaXR5KF81N2NbMF0pOworfTsKK30KK2lmKCFkal91bmRlZigiZW5kIixfNTdkKSl7CitfNTgxLmVuZD1fNTdkLmVuZDsKK31lbHNleworZG9qby5yYWlzZSgiZG9qby5sZnguaHRtbC5mYWRlIG5lZWRzIGFuIGVuZCB2YWx1ZSIpOworfQordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24oXzU3YyxbXzU4MV0sXzU3ZSxfNTdmKTsKK2FuaW0uY29ubmVjdCgiYmVmb3JlQmVnaW4iLGZ1bmN0aW9uKCl7Citkb2pvLmxmeC5odG1sLl9tYWtlRmFkZWFibGUoXzU3Yyk7Cit9KTsKK2lmKF81ODApeworYW5pbS5jb25uZWN0KCJvbkVuZCIsZnVuY3Rpb24oKXsKK181ODAoXzU3YyxhbmltKTsKK30pOworfQorcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5mYWRlSW49ZnVuY3Rpb24oXzU4MyxfNTg0LF81ODUsXzU4Nil7CityZXR1cm4gZG9qby5sZnguaHRtbC5mYWRlKF81ODMse2VuZDoxfSxfNTg0LF81ODUsXzU4Nik7Cit9OworZG9qby5sZnguaHRtbC5mYWRlT3V0PWZ1bmN0aW9uKF81ODcsXzU4OCxfNTg5LF81OGEpeworcmV0dXJuIGRvam8ubGZ4Lmh0bWwuZmFkZShfNTg3LHtlbmQ6MH0sXzU4OCxfNTg5LF81OGEpOworfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZVNob3c9ZnVuY3Rpb24oXzU4YixfNThjLF81OGQsXzU4ZSl7CitfNThiPWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzU4Yik7Citkb2pvLmxhbmcuZm9yRWFjaChfNThiLGZ1bmN0aW9uKG5vZGUpeworZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSwwKTsKK30pOwordmFyIGFuaW09ZG9qby5sZnguaHRtbC5mYWRlSW4oXzU4YixfNThjLF81OGQsXzU4ZSk7CithbmltLmNvbm5lY3QoImJlZm9yZUJlZ2luIixmdW5jdGlvbigpeworaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKF81OGIpKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF81OGIsZG9qby5odG1sLnNob3cpOworfWVsc2V7Citkb2pvLmh0bWwuc2hvdyhfNThiKTsKK30KK30pOworcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5mYWRlSGlkZT1mdW5jdGlvbihfNTkxLF81OTIsXzU5MyxfNTk0KXsKK3ZhciBhbmltPWRvam8ubGZ4Lmh0bWwuZmFkZU91dChfNTkxLF81OTIsXzU5MyxmdW5jdGlvbigpeworaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKF81OTEpKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF81OTEsZG9qby5odG1sLmhpZGUpOworfWVsc2V7Citkb2pvLmh0bWwuaGlkZShfNTkxKTsKK30KK2lmKF81OTQpeworXzU5NChfNTkxLGFuaW0pOworfQorfSk7CityZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLndpcGVJbj1mdW5jdGlvbihfNTk2LF81OTcsXzU5OCxfNTk5KXsKK181OTY9ZG9qby5sZnguaHRtbC5fYnlJZChfNTk2KTsKK3ZhciBfNTlhPVtdOworZG9qby5sYW5nLmZvckVhY2goXzU5NixmdW5jdGlvbihub2RlKXsKK3ZhciBfNTljPXt9OwordmFyIF81OWQsXzU5ZSxfNTlmOword2l0aChub2RlLnN0eWxlKXsKK181OWQ9dG9wOworXzU5ZT1sZWZ0OworXzU5Zj1wb3NpdGlvbjsKK3RvcD0iLTk5OTlweCI7CitsZWZ0PSItOTk5OXB4IjsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7CitkaXNwbGF5PSIiOworfQordmFyIF81YTA9ZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKS5oZWlnaHQ7Cit3aXRoKG5vZGUuc3R5bGUpewordG9wPV81OWQ7CitsZWZ0PV81OWU7Citwb3NpdGlvbj1fNTlmOworZGlzcGxheT0ibm9uZSI7Cit9Cit2YXIgYW5pbT1kb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihub2RlLHsiaGVpZ2h0Ijp7c3RhcnQ6MSxlbmQ6ZnVuY3Rpb24oKXsKK3JldHVybiBfNWEwOworfX19LF81OTcsXzU5OCk7CithbmltLmNvbm5lY3QoImJlZm9yZUJlZ2luIixmdW5jdGlvbigpeworXzU5Yy5vdmVyZmxvdz1ub2RlLnN0eWxlLm92ZXJmbG93OworXzU5Yy5oZWlnaHQ9bm9kZS5zdHlsZS5oZWlnaHQ7Cit3aXRoKG5vZGUuc3R5bGUpeworb3ZlcmZsb3c9ImhpZGRlbiI7CitoZWlnaHQ9IjFweCI7Cit9Citkb2pvLmh0bWwuc2hvdyhub2RlKTsKK30pOworYW5pbS5jb25uZWN0KCJvbkVuZCIsZnVuY3Rpb24oKXsKK3dpdGgobm9kZS5zdHlsZSl7CitvdmVyZmxvdz1fNTljLm92ZXJmbG93OworaGVpZ2h0PV81OWMuaGVpZ2h0OworfQoraWYoXzU5OSl7CitfNTk5KG5vZGUsYW5pbSk7Cit9Cit9KTsKK181OWEucHVzaChhbmltKTsKK30pOworcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoXzU5YSk7Cit9OworZG9qby5sZnguaHRtbC53aXBlT3V0PWZ1bmN0aW9uKF81YTIsXzVhMyxfNWE0LF81YTUpeworXzVhMj1kb2pvLmxmeC5odG1sLl9ieUlkKF81YTIpOwordmFyIF81YTY9W107Citkb2pvLmxhbmcuZm9yRWFjaChfNWEyLGZ1bmN0aW9uKG5vZGUpewordmFyIF81YTg9e307Cit2YXIgYW5pbT1kb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihub2RlLHsiaGVpZ2h0Ijp7c3RhcnQ6ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuZ2V0Q29udGVudEJveChub2RlKS5oZWlnaHQ7Cit9LGVuZDoxfX0sXzVhMyxfNWE0LHsiYmVmb3JlQmVnaW4iOmZ1bmN0aW9uKCl7CitfNWE4Lm92ZXJmbG93PW5vZGUuc3R5bGUub3ZlcmZsb3c7CitfNWE4LmhlaWdodD1ub2RlLnN0eWxlLmhlaWdodDsKK3dpdGgobm9kZS5zdHlsZSl7CitvdmVyZmxvdz0iaGlkZGVuIjsKK30KK2Rvam8uaHRtbC5zaG93KG5vZGUpOworfSwib25FbmQiOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuaGlkZShub2RlKTsKK3dpdGgobm9kZS5zdHlsZSl7CitvdmVyZmxvdz1fNWE4Lm92ZXJmbG93OworaGVpZ2h0PV81YTguaGVpZ2h0OworfQoraWYoXzVhNSl7CitfNWE1KG5vZGUsYW5pbSk7Cit9Cit9fSk7CitfNWE2LnB1c2goYW5pbSk7Cit9KTsKK3JldHVybiBkb2pvLmxmeC5jb21iaW5lKF81YTYpOworfTsKK2Rvam8ubGZ4Lmh0bWwuc2xpZGVUbz1mdW5jdGlvbihfNWFhLF81YWIsXzVhYyxfNWFkLF81YWUpeworXzVhYT1kb2pvLmxmeC5odG1sLl9ieUlkKF81YWEpOwordmFyIF81YWY9W107Cit2YXIgXzViMD1kb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZTsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF81YWIpKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5sZnguaHRtbC5zbGlkZVRvKG5vZGUsIGFycmF5KSIsInVzZSBkb2pvLmxmeC5odG1sLnNsaWRlVG8obm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7IiwiMC41Iik7CitfNWFiPXt0b3A6XzVhYlswXSxsZWZ0Ol81YWJbMV19OworfQorZG9qby5sYW5nLmZvckVhY2goXzVhYSxmdW5jdGlvbihub2RlKXsKK3ZhciB0b3A9bnVsbDsKK3ZhciBsZWZ0PW51bGw7Cit2YXIgaW5pdD0oZnVuY3Rpb24oKXsKK3ZhciBfNWI1PW5vZGU7CityZXR1cm4gZnVuY3Rpb24oKXsKK3ZhciBwb3M9XzViMChfNWI1LCJwb3NpdGlvbiIpOwordG9wPShwb3M9PSJhYnNvbHV0ZSI/bm9kZS5vZmZzZXRUb3A6cGFyc2VJbnQoXzViMChub2RlLCJ0b3AiKSl8fDApOworbGVmdD0ocG9zPT0iYWJzb2x1dGUiP25vZGUub2Zmc2V0TGVmdDpwYXJzZUludChfNWIwKG5vZGUsImxlZnQiKSl8fDApOworaWYoIWRvam8ubGFuZy5pbkFycmF5KFsiYWJzb2x1dGUiLCJyZWxhdGl2ZSJdLHBvcykpewordmFyIHJldD1kb2pvLmh0bWwuYWJzKF81YjUsdHJ1ZSk7Citkb2pvLmh0bWwuc2V0U3R5bGVBdHRyaWJ1dGVzKF81YjUsInBvc2l0aW9uOmFic29sdXRlO3RvcDoiK3JldC55KyJweDtsZWZ0OiIrcmV0LngrInB4OyIpOwordG9wPXJldC55OworbGVmdD1yZXQueDsKK30KK307Cit9KSgpOworaW5pdCgpOwordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7InRvcCI6e3N0YXJ0OnRvcCxlbmQ6KF81YWIudG9wfHwwKX0sImxlZnQiOntzdGFydDpsZWZ0LGVuZDooXzVhYi5sZWZ0fHwwKX19LF81YWMsXzVhZCx7ImJlZm9yZUJlZ2luIjppbml0fSk7CitpZihfNWFlKXsKK2FuaW0uY29ubmVjdCgib25FbmQiLGZ1bmN0aW9uKCl7CitfNWFlKF81YWEsYW5pbSk7Cit9KTsKK30KK181YWYucHVzaChhbmltKTsKK30pOworcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoXzVhZik7Cit9OworZG9qby5sZnguaHRtbC5zbGlkZUJ5PWZ1bmN0aW9uKF81YjksXzViYSxfNWJiLF81YmMsXzViZCl7CitfNWI5PWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzViOSk7Cit2YXIgXzViZT1bXTsKK3ZhciBfNWJmPWRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlOworaWYoZG9qby5sYW5nLmlzQXJyYXkoXzViYSkpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwgYXJyYXkpIiwidXNlIGRvam8ubGZ4Lmh0bWwuc2xpZGVCeShub2RlLCB7dG9wOiB2YWx1ZSwgbGVmdDogdmFsdWV9KTsiLCIwLjUiKTsKK181YmE9e3RvcDpfNWJhWzBdLGxlZnQ6XzViYVsxXX07Cit9Citkb2pvLmxhbmcuZm9yRWFjaChfNWI5LGZ1bmN0aW9uKG5vZGUpewordmFyIHRvcD1udWxsOwordmFyIGxlZnQ9bnVsbDsKK3ZhciBpbml0PShmdW5jdGlvbigpewordmFyIF81YzQ9bm9kZTsKK3JldHVybiBmdW5jdGlvbigpewordmFyIHBvcz1fNWJmKF81YzQsInBvc2l0aW9uIik7Cit0b3A9KHBvcz09ImFic29sdXRlIj9ub2RlLm9mZnNldFRvcDpwYXJzZUludChfNWJmKG5vZGUsInRvcCIpKXx8MCk7CitsZWZ0PShwb3M9PSJhYnNvbHV0ZSI/bm9kZS5vZmZzZXRMZWZ0OnBhcnNlSW50KF81YmYobm9kZSwibGVmdCIpKXx8MCk7CitpZighZG9qby5sYW5nLmluQXJyYXkoWyJhYnNvbHV0ZSIsInJlbGF0aXZlIl0scG9zKSl7Cit2YXIgcmV0PWRvam8uaHRtbC5hYnMoXzVjNCx0cnVlKTsKK2Rvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMoXzVjNCwicG9zaXRpb246YWJzb2x1dGU7dG9wOiIrcmV0LnkrInB4O2xlZnQ6IityZXQueCsicHg7Iik7Cit0b3A9cmV0Lnk7CitsZWZ0PXJldC54OworfQorfTsKK30pKCk7Citpbml0KCk7Cit2YXIgYW5pbT1kb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihub2RlLHsidG9wIjp7c3RhcnQ6dG9wLGVuZDp0b3ArKF81YmEudG9wfHwwKX0sImxlZnQiOntzdGFydDpsZWZ0LGVuZDpsZWZ0KyhfNWJhLmxlZnR8fDApfX0sXzViYixfNWJjKS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsaW5pdCk7CitpZihfNWJkKXsKK2FuaW0uY29ubmVjdCgib25FbmQiLGZ1bmN0aW9uKCl7CitfNWJkKF81YjksYW5pbSk7Cit9KTsKK30KK181YmUucHVzaChhbmltKTsKK30pOworcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoXzViZSk7Cit9OworZG9qby5sZnguaHRtbC5leHBsb2RlPWZ1bmN0aW9uKF81YzgsXzVjOSxfNWNhLF81Y2IsXzVjYyl7Cit2YXIgaD1kb2pvLmh0bWw7CitfNWM4PWRvam8uYnlJZChfNWM4KTsKK181Yzk9ZG9qby5ieUlkKF81YzkpOwordmFyIF81Y2U9aC50b0Nvb3JkaW5hdGVPYmplY3QoXzVjOCx0cnVlKTsKK3ZhciBfNWNmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworaC5jb3B5U3R5bGUoXzVjZixfNWM5KTsKK2lmKF81YzkuZXhwbG9kZUNsYXNzTmFtZSl7CitfNWNmLmNsYXNzTmFtZT1fNWM5LmV4cGxvZGVDbGFzc05hbWU7Cit9Cit3aXRoKF81Y2Yuc3R5bGUpeworcG9zaXRpb249ImFic29sdXRlIjsKK2Rpc3BsYXk9Im5vbmUiOwordmFyIF81ZDA9aC5nZXRTdHlsZShfNWM4LCJiYWNrZ3JvdW5kLWNvbG9yIik7CitiYWNrZ3JvdW5kQ29sb3I9XzVkMD9fNWQwLnRvTG93ZXJDYXNlKCk6InRyYW5zcGFyZW50IjsKK2JhY2tncm91bmRDb2xvcj0oYmFja2dyb3VuZENvbG9yPT0idHJhbnNwYXJlbnQiKT8icmdiKDIyMSwgMjIxLCAyMjEpIjpiYWNrZ3JvdW5kQ29sb3I7Cit9Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChfNWNmKTsKK3dpdGgoXzVjOS5zdHlsZSl7Cit2aXNpYmlsaXR5PSJoaWRkZW4iOworZGlzcGxheT0iYmxvY2siOworfQordmFyIF81ZDE9aC50b0Nvb3JkaW5hdGVPYmplY3QoXzVjOSx0cnVlKTsKK3dpdGgoXzVjOS5zdHlsZSl7CitkaXNwbGF5PSJub25lIjsKK3Zpc2liaWxpdHk9InZpc2libGUiOworfQordmFyIF81ZDI9e29wYWNpdHk6e3N0YXJ0OjAuNSxlbmQ6MX19OworZG9qby5sYW5nLmZvckVhY2goWyJoZWlnaHQiLCJ3aWR0aCIsInRvcCIsImxlZnQiXSxmdW5jdGlvbih0eXBlKXsKK181ZDJbdHlwZV09e3N0YXJ0Ol81Y2VbdHlwZV0sZW5kOl81ZDFbdHlwZV19OworfSk7Cit2YXIgYW5pbT1uZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24oXzVjZixfNWQyLF81Y2EsXzVjYix7ImJlZm9yZUJlZ2luIjpmdW5jdGlvbigpeworaC5zZXREaXNwbGF5KF81Y2YsImJsb2NrIik7Cit9LCJvbkVuZCI6ZnVuY3Rpb24oKXsKK2guc2V0RGlzcGxheShfNWM5LCJibG9jayIpOworXzVjZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF81Y2YpOworfX0pOworaWYoXzVjYyl7CithbmltLmNvbm5lY3QoIm9uRW5kIixmdW5jdGlvbigpeworXzVjYyhfNWM5LGFuaW0pOworfSk7Cit9CityZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLmltcGxvZGU9ZnVuY3Rpb24oXzVkNSxlbmQsXzVkNyxfNWQ4LF81ZDkpewordmFyIGg9ZG9qby5odG1sOworXzVkNT1kb2pvLmJ5SWQoXzVkNSk7CitlbmQ9ZG9qby5ieUlkKGVuZCk7Cit2YXIgXzVkYj1kb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KF81ZDUsdHJ1ZSk7Cit2YXIgXzVkYz1kb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KGVuZCx0cnVlKTsKK3ZhciBfNWRkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworZG9qby5odG1sLmNvcHlTdHlsZShfNWRkLF81ZDUpOworaWYoXzVkNS5leHBsb2RlQ2xhc3NOYW1lKXsKK181ZGQuY2xhc3NOYW1lPV81ZDUuZXhwbG9kZUNsYXNzTmFtZTsKK30KK2Rvam8uaHRtbC5zZXRPcGFjaXR5KF81ZGQsMC4zKTsKK3dpdGgoXzVkZC5zdHlsZSl7Citwb3NpdGlvbj0iYWJzb2x1dGUiOworZGlzcGxheT0ibm9uZSI7CitiYWNrZ3JvdW5kQ29sb3I9aC5nZXRTdHlsZShfNWQ1LCJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKK30KK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKF81ZGQpOwordmFyIF81ZGU9e29wYWNpdHk6e3N0YXJ0OjEsZW5kOjAuNX19OworZG9qby5sYW5nLmZvckVhY2goWyJoZWlnaHQiLCJ3aWR0aCIsInRvcCIsImxlZnQiXSxmdW5jdGlvbih0eXBlKXsKK181ZGVbdHlwZV09e3N0YXJ0Ol81ZGJbdHlwZV0sZW5kOl81ZGNbdHlwZV19OworfSk7Cit2YXIgYW5pbT1uZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24oXzVkZCxfNWRlLF81ZDcsXzVkOCx7ImJlZm9yZUJlZ2luIjpmdW5jdGlvbigpeworZG9qby5odG1sLmhpZGUoXzVkNSk7Citkb2pvLmh0bWwuc2hvdyhfNWRkKTsKK30sIm9uRW5kIjpmdW5jdGlvbigpeworXzVkZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF81ZGQpOworfX0pOworaWYoXzVkOSl7CithbmltLmNvbm5lY3QoIm9uRW5kIixmdW5jdGlvbigpeworXzVkOShfNWQ1LGFuaW0pOworfSk7Cit9CityZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLmhpZ2hsaWdodD1mdW5jdGlvbihfNWUxLF81ZTIsXzVlMyxfNWU0LF81ZTUpeworXzVlMT1kb2pvLmxmeC5odG1sLl9ieUlkKF81ZTEpOwordmFyIF81ZTY9W107Citkb2pvLmxhbmcuZm9yRWFjaChfNWUxLGZ1bmN0aW9uKG5vZGUpewordmFyIF81ZTg9ZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKTsKK3ZhciBiZz1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYmFja2dyb3VuZC1jb2xvciIpLnRvTG93ZXJDYXNlKCk7Cit2YXIgXzVlYT1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYmFja2dyb3VuZC1pbWFnZSIpOwordmFyIF81ZWI9KGJnPT0idHJhbnNwYXJlbnQifHxiZz09InJnYmEoMCwgMCwgMCwgMCkiKTsKK3doaWxlKF81ZTgubGVuZ3RoPjMpeworXzVlOC5wb3AoKTsKK30KK3ZhciByZ2I9bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKF81ZTIpOwordmFyIF81ZWQ9bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKF81ZTgpOwordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7ImJhY2tncm91bmQtY29sb3IiOntzdGFydDpyZ2IsZW5kOl81ZWR9fSxfNWUzLF81ZTQseyJiZWZvcmVCZWdpbiI6ZnVuY3Rpb24oKXsKK2lmKF81ZWEpeworbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9Im5vbmUiOworfQorbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYigiK3JnYi50b1JnYigpLmpvaW4oIiwiKSsiKSI7Cit9LCJvbkVuZCI6ZnVuY3Rpb24oKXsKK2lmKF81ZWEpeworbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9XzVlYTsKK30KK2lmKF81ZWIpeworbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InRyYW5zcGFyZW50IjsKK30KK2lmKF81ZTUpeworXzVlNShub2RlLGFuaW0pOworfQorfX0pOworXzVlNi5wdXNoKGFuaW0pOworfSk7CityZXR1cm4gZG9qby5sZnguY29tYmluZShfNWU2KTsKK307Citkb2pvLmxmeC5odG1sLnVuaGlnaGxpZ2h0PWZ1bmN0aW9uKF81ZWYsXzVmMCxfNWYxLF81ZjIsXzVmMyl7CitfNWVmPWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzVlZik7Cit2YXIgXzVmND1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKF81ZWYsZnVuY3Rpb24obm9kZSl7Cit2YXIgXzVmNj1uZXcgZG9qby5nZnguY29sb3IuQ29sb3IoZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKSk7Cit2YXIgcmdiPW5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihfNWYwKTsKK3ZhciBfNWY4PWRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJiYWNrZ3JvdW5kLWltYWdlIik7Cit2YXIgYW5pbT1kb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihub2RlLHsiYmFja2dyb3VuZC1jb2xvciI6e3N0YXJ0Ol81ZjYsZW5kOnJnYn19LF81ZjEsXzVmMix7ImJlZm9yZUJlZ2luIjpmdW5jdGlvbigpeworaWYoXzVmOCl7Citub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZT0ibm9uZSI7Cit9Citub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiKCIrXzVmNi50b1JnYigpLmpvaW4oIiwiKSsiKSI7Cit9LCJvbkVuZCI6ZnVuY3Rpb24oKXsKK2lmKF81ZjMpeworXzVmMyhub2RlLGFuaW0pOworfQorfX0pOworXzVmNC5wdXNoKGFuaW0pOworfSk7CityZXR1cm4gZG9qby5sZnguY29tYmluZShfNWY0KTsKK307Citkb2pvLmxhbmcubWl4aW4oZG9qby5sZngsZG9qby5sZnguaHRtbCk7Citkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHticm93c2VyOlsiZG9qby5sZnguaHRtbCJdLGRhc2hib2FyZDpbImRvam8ubGZ4Lmh0bWwiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxmeC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL2Rvam8uanMudW5jb21wcmVzc2VkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vZG9qby5qcy51bmNvbXByZXNzZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NTFiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL2Rvam8uanMudW5jb21wcmVzc2VkLmpzCkBAIC0wLDAgKzEsOTg2NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworaWYodHlwZW9mIGRvam8gPT0gInVuZGVmaW5lZCIpeworCisvLyBUT0RPQzogSE9XIFRPIERPQyBUSEUgQkVMT1c/CisvLyBAZ2xvYmFsOiBkakNvbmZpZworLy8gc3VtbWFyeToKKy8vCQlBcHBsaWNhdGlvbiBjb2RlIGNhbiBzZXQgdGhlIGdsb2JhbCAnZGpDb25maWcnIHByaW9yIHRvIGxvYWRpbmcKKy8vCQl0aGUgbGlicmFyeSB0byBvdmVycmlkZSBjZXJ0YWluIGdsb2JhbCBzZXR0aW5ncyBmb3IgaG93IGRvam8gd29ya3MuCisvLyBkZXNjcmlwdGlvbjogIFRoZSB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgc2V0IGFyZSBhcyBmb2xsb3dzOgorLy8JCQktIGlzRGVidWc6IGZhbHNlCisvLwkJCS0gYWxsb3dRdWVyeUNvbmZpZzogZmFsc2UKKy8vCQkJLSBiYXNlU2NyaXB0VXJpOiAiIgorLy8JCQktIGJhc2VSZWxhdGl2ZVBhdGg6ICIiCisvLwkJCS0gbGlicmFyeVNjcmlwdFVyaTogIiIKKy8vCQkJLSBpZVByZXZlbnRDbG9iYmVyOiBmYWxzZQorLy8JCQktIGllQ2xvYmJlck1pbmltYWw6IHRydWUKKy8vCQkJLSBsb2NhbGU6IHVuZGVmaW5lZAorLy8JCQktIGV4dHJhTG9jYWxlOiB1bmRlZmluZWQKKy8vCQkJLSBwcmV2ZW50QmFja0J1dHRvbkZpeDogdHJ1ZQorLy8JCQktIHNlYXJjaElkczogW10KKy8vCQkJLSBwYXJzZVdpZGdldHM6IHRydWUKKy8vIFRPRE9DOiBIT1cgVE8gRE9DIFRIRVNFIFZBUklBQkxFUz8KKy8vIFRPRE9DOiBJUyBUSElTIEEgQ09NUExFVEUgTElTVD8KKy8vIG5vdGU6CisvLwkJJ2RqQ29uZmlnJyBkb2VzIG5vdCBleGlzdCB1bmRlciAnZG9qby4qJyBzbyB0aGF0IGl0IGNhbiBiZSBzZXQgYmVmb3JlIHRoZQorLy8JCSdkb2pvJyB2YXJpYWJsZSBleGlzdHMuCisvLyBub3RlOgorLy8JCVNldHRpbmcgYW55IG9mIHRoZXNlIHZhcmlhYmxlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5IGhhcyBsb2FkZWQgZG9lcyBub3RoaW5nIGF0IGFsbC4KKy8vIFRPRE9DOiBpcyB0aGlzIHN0aWxsIHRydWU/ICBSZWxlYXNlIG5vdGVzIGZvciAwLjMgaW5kaWNhdGVkIHRoZXkgY291bGQgYmUgc2V0IGFmdGVyIGxvYWQuCisvLworCisKKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRISVM/CisvLyBAZ2xvYmFsOiBkal9nbG9iYWwKKy8vIHN1bW1hcnk6CisvLwkJYW4gYWxpYXMgZm9yIHRoZSB0b3AtbGV2ZWwgZ2xvYmFsIG9iamVjdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudAorLy8JCShlLmcuLCB0aGUgd2luZG93IG9iamVjdCBpbiBhIGJyb3dzZXIpLgorLy8gZGVzY3JpcHRpb246CisvLwkJUmVmZXIgdG8gJ2RqX2dsb2JhbCcgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvIHdpbmRvdyB0byBlbnN1cmUgeW91cgorLy8JCWNvZGUgcnVucyBjb3JyZWN0bHkgaW4gY29udGV4dHMgb3RoZXIgdGhhbiB3ZWIgYnJvd3NlcnMgKGVnOiBSaGlubyBvbiBhIHNlcnZlcikuCit2YXIgZGpfZ2xvYmFsID0gdGhpczsKKworLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KKy8vIEBnbG9iYWw6IGRqX2N1cnJlbnRDb250ZXh0CisvLyBzdW1tYXJ5OgorLy8JCVByaXZhdGUgZ2xvYmFsIGNvbnRleHQgb2JqZWN0LiBXaGVyZSAnZGpfZ2xvYmFsJyBhbHdheXMgcmVmZXJzIHRvIHRoZSBib290LXRpbWUKKy8vICAgIGdsb2JhbCBjb250ZXh0LCAnZGpfY3VycmVudENvbnRleHQnIGNhbiBiZSBtb2RpZmllZCBmb3IgdGVtcG9yYXJ5IGNvbnRleHQgc2hpZnRpbmcuCisvLyAgICBkb2pvLmdsb2JhbCgpIHJldHVybnMgZGpfY3VycmVudENvbnRleHQuCisvLyBkZXNjcmlwdGlvbjoKKy8vCQlSZWZlciB0byBkb2pvLmdsb2JhbCgpIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byBkal9nbG9iYWwgdG8gZW5zdXJlIHlvdXIKKy8vCQljb2RlIHJ1bnMgY29ycmVjdGx5IGluIG1hbmFnZWQgY29udGV4dHMuCit2YXIgZGpfY3VycmVudENvbnRleHQgPSB0aGlzOworCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGdsb2JhbCBwdWJsaWMgdXRpbHMKKy8vIFRPRE9DOiBETyBXRSBXQU5UIFRPIE5PVEUgVEhBVCBUSEVTRSBBUkUgR0xPQkFMIFBVQkxJQyBVVElMUz8KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworZnVuY3Rpb24gZGpfdW5kZWYoLypTdHJpbmcqLyBuYW1lLCAvKk9iamVjdD8qLyBvYmplY3QpeworCS8vc3VtbWFyeTogUmV0dXJucyB0cnVlIGlmICduYW1lJyBpcyBkZWZpbmVkIG9uICdvYmplY3QnIChvciBnbG9iYWxseSBpZiAnb2JqZWN0JyBpcyBudWxsKS4KKwkvL2Rlc2NyaXB0aW9uOiBOb3RlIHRoYXQgJ2RlZmluZWQnIGFuZCAnZXhpc3RzJyBhcmUgbm90IHRoZSBzYW1lIGNvbmNlcHQuCisJcmV0dXJuICh0eXBlb2YgKG9iamVjdCB8fCBkal9jdXJyZW50Q29udGV4dClbbmFtZV0gPT0gInVuZGVmaW5lZCIpOwkvLyBCb29sZWFuCit9CisKKy8vIG1ha2Ugc3VyZSBkakNvbmZpZyBpcyBkZWZpbmVkCitpZihkal91bmRlZigiZGpDb25maWciLCB0aGlzKSl7CisJdmFyIGRqQ29uZmlnID0ge307Cit9CisKKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRISVM/CisvLyBkb2pvIGlzIHRoZSByb290IHZhcmlhYmxlIG9mIChhbG1vc3QgYWxsKSBvdXIgcHVibGljIHN5bWJvbHMgLS0gbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuCitpZihkal91bmRlZigiZG9qbyIsIHRoaXMpKXsKKwl2YXIgZG9qbyA9IHt9OworfQorCitkb2pvLmdsb2JhbCA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwkJcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbCBjb250ZXh0IG9iamVjdAorCS8vCQkoZS5nLiwgdGhlIHdpbmRvdyBvYmplY3QgaW4gYSBicm93c2VyKS4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLwkJUmVmZXIgdG8gJ2Rvam8uZ2xvYmFsKCknIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byB3aW5kb3cgdG8gZW5zdXJlIHlvdXIKKwkvLwkJY29kZSBydW5zIGNvcnJlY3RseSBpbiBjb250ZXh0cyBvdGhlciB0aGFuIHdlYiBicm93c2VycyAoZWc6IFJoaW5vIG9uIGEgc2VydmVyKS4KKwlyZXR1cm4gZGpfY3VycmVudENvbnRleHQ7Cit9CisKKy8vIE92ZXJyaWRlIGxvY2FsZSBzZXR0aW5nLCBpZiBzcGVjaWZpZWQKK2Rvam8ubG9jYWxlICA9IGRqQ29uZmlnLmxvY2FsZTsKKworLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KK2Rvam8udmVyc2lvbiA9IHsKKwkvLyBzdW1tYXJ5OiB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGluc3RhbmNlIG9mIGRvam8uCisJbWFqb3I6IDAsIG1pbm9yOiA0LCBwYXRjaDogMywgZmxhZzogIiIsCisJcmV2aXNpb246IE51bWJlcigiJFJldiQiLm1hdGNoKC9bMC05XSsvKVswXSksCisJdG9TdHJpbmc6IGZ1bmN0aW9uKCl7CisJCXdpdGgoZG9qby52ZXJzaW9uKXsKKwkJCXJldHVybiBtYWpvciArICIuIiArIG1pbm9yICsgIi4iICsgcGF0Y2ggKyBmbGFnICsgIiAoIiArIHJldmlzaW9uICsgIikiOwkvLyBTdHJpbmcKKwkJfQorCX0KK30KKworZG9qby5ldmFsUHJvcCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gbmFtZSwgLypPYmplY3QqLyBvYmplY3QsIC8qQm9vbGVhbj8qLyBjcmVhdGUpeworCS8vIHN1bW1hcnk6IFJldHVybnMgJ29iamVjdFtuYW1lXScuICBJZiBub3QgZGVmaW5lZCBhbmQgJ2NyZWF0ZScgaXMgdHJ1ZSwgd2lsbCByZXR1cm4gYSBuZXcgT2JqZWN0LgorCS8vIGRlc2NyaXB0aW9uOgorCS8vCQlSZXR1cm5zIG51bGwgaWYgJ29iamVjdFtuYW1lXScgaXMgbm90IGRlZmluZWQgYW5kICdjcmVhdGUnIGlzIG5vdCB0cnVlLgorCS8vIAkJTm90ZTogJ2RlZmluZWQnIGFuZCAnZXhpc3RzJyBhcmUgbm90IHRoZSBzYW1lIGNvbmNlcHQuCisJaWYoKCFvYmplY3QpfHwoIW5hbWUpKSByZXR1cm4gdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQKKwlpZighZGpfdW5kZWYobmFtZSwgb2JqZWN0KSkgcmV0dXJuIG9iamVjdFtuYW1lXTsgLy8gbWl4ZWQKKwlyZXR1cm4gKGNyZWF0ZSA/IChvYmplY3RbbmFtZV09e30pIDogdW5kZWZpbmVkKTsJLy8gbWl4ZWQKK30KKworZG9qby5wYXJzZU9ialBhdGggPSBmdW5jdGlvbigvKlN0cmluZyovIHBhdGgsIC8qT2JqZWN0PyovIGNvbnRleHQsIC8qQm9vbGVhbj8qLyBjcmVhdGUpeworCS8vIHN1bW1hcnk6IFBhcnNlIHN0cmluZyBwYXRoIHRvIGFuIG9iamVjdCwgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIG9iamVjdCByZWZlcmVuY2UgYW5kIHByb3BlcnR5IG5hbWUuCisJLy8gZGVzY3JpcHRpb246CisJLy8JCVJldHVybnMgYW4gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXMsICdvYmonIGFuZCAncHJvcCcuCisJLy8JCSdvYmpbcHJvcF0nIGlzIHRoZSByZWZlcmVuY2UgaW5kaWNhdGVkIGJ5ICdwYXRoJy4KKwkvLyBwYXRoOiBQYXRoIHRvIGFuIG9iamVjdCwgaW4gdGhlIGZvcm0gIkEuQi5DIi4KKwkvLyBjb250ZXh0OiBPYmplY3QgdG8gdXNlIGFzIHJvb3Qgb2YgcGF0aC4gIERlZmF1bHRzIHRvICdkb2pvLmdsb2JhbCgpJy4KKwkvLyBjcmVhdGU6IElmIHRydWUsIE9iamVjdHMgd2lsbCBiZSBjcmVhdGVkIGF0IGFueSBwb2ludCBhbG9uZyB0aGUgJ3BhdGgnIHRoYXQgaXMgdW5kZWZpbmVkLgorCXZhciBvYmplY3QgPSAoY29udGV4dCB8fCBkb2pvLmdsb2JhbCgpKTsKKwl2YXIgbmFtZXMgPSBwYXRoLnNwbGl0KCcuJyk7CisJdmFyIHByb3AgPSBuYW1lcy5wb3AoKTsKKwlmb3IgKHZhciBpPTAsbD1uYW1lcy5sZW5ndGg7aTxsICYmIG9iamVjdDtpKyspeworCQlvYmplY3QgPSBkb2pvLmV2YWxQcm9wKG5hbWVzW2ldLCBvYmplY3QsIGNyZWF0ZSk7CisJfQorCXJldHVybiB7b2JqOiBvYmplY3QsIHByb3A6IHByb3B9OwkvLyBPYmplY3Q6IHtvYmo6IE9iamVjdCwgcHJvcDogU3RyaW5nfQorfQorCitkb2pvLmV2YWxPYmpQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqLyBwYXRoLCAvKkJvb2xlYW4/Ki8gY3JlYXRlKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdGhlIHZhbHVlIG9mIG9iamVjdCBhdCAncGF0aCcgaW4gdGhlIGdsb2JhbCBzY29wZSwgd2l0aG91dCB1c2luZyAnZXZhbCgpJy4KKwkvLyBwYXRoOiBQYXRoIHRvIGFuIG9iamVjdCwgaW4gdGhlIGZvcm0gIkEuQi5DIi4KKwkvLyBjcmVhdGU6IElmIHRydWUsIE9iamVjdHMgd2lsbCBiZSBjcmVhdGVkIGF0IGFueSBwb2ludCBhbG9uZyB0aGUgJ3BhdGgnIHRoYXQgaXMgdW5kZWZpbmVkLgorCWlmKHR5cGVvZiBwYXRoICE9ICJzdHJpbmciKXsKKwkJcmV0dXJuIGRvam8uZ2xvYmFsKCk7CisJfQorCS8vIGZhc3QgcGF0aCBmb3Igbm8gcGVyaW9kcworCWlmKHBhdGguaW5kZXhPZignLicpID09IC0xKXsKKwkJcmV0dXJuIGRvam8uZXZhbFByb3AocGF0aCwgZG9qby5nbG9iYWwoKSwgY3JlYXRlKTsJCS8vIG1peGVkCisJfQorCisJLy9NT1c6IG9sZCAnd2l0aCcgc3ludGF4IHdhcyBjb25mdXNpbmcgYW5kIHdvdWxkIHRocm93IGFuIGVycm9yIGlmIHBhcnNlT2JqUGF0aCByZXR1cm5lZCBudWxsLgorCXZhciByZWYgPSBkb2pvLnBhcnNlT2JqUGF0aChwYXRoLCBkb2pvLmdsb2JhbCgpLCBjcmVhdGUpOworCWlmKHJlZil7CisJCXJldHVybiBkb2pvLmV2YWxQcm9wKHJlZi5wcm9wLCByZWYub2JqLCBjcmVhdGUpOwkvLyBtaXhlZAorCX0KKwlyZXR1cm4gbnVsbDsKK30KKworZG9qby5lcnJvclRvU3RyaW5nID0gZnVuY3Rpb24oLypFcnJvciovIGV4Y2VwdGlvbil7CisJLy8gc3VtbWFyeTogUmV0dXJuIGFuIGV4Y2VwdGlvbidzICdtZXNzYWdlJywgJ2Rlc2NyaXB0aW9uJyBvciB0ZXh0LgorCisJLy8gVE9ETzogb3ZlcnJpZGluZyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgd29uJ3QgYWNjb21wbGlzaCB0aGlzPworIAkvLyAJCS4uLiBzaW5jZSBuYXRpdmVseSBnZW5lcmF0ZWQgRXJyb3Igb2JqZWN0cyBkbyBub3QgYWx3YXlzIHJlZmxlY3Qgc3VjaCB0aGluZ3M/CisJaWYoIWRqX3VuZGVmKCJtZXNzYWdlIiwgZXhjZXB0aW9uKSl7CisJCXJldHVybiBleGNlcHRpb24ubWVzc2FnZTsJCS8vIFN0cmluZworCX1lbHNlIGlmKCFkal91bmRlZigiZGVzY3JpcHRpb24iLCBleGNlcHRpb24pKXsKKwkJcmV0dXJuIGV4Y2VwdGlvbi5kZXNjcmlwdGlvbjsJLy8gU3RyaW5nCisJfWVsc2V7CisJCXJldHVybiBleGNlcHRpb247CQkJCS8vIEVycm9yCisJfQorfQorCitkb2pvLnJhaXNlID0gZnVuY3Rpb24oLypTdHJpbmcqLyBtZXNzYWdlLCAvKkVycm9yPyovIGV4Y2VwdGlvbil7CisJLy8gc3VtbWFyeTogQ29tbW9uIHBvaW50IGZvciByYWlzaW5nIGV4Y2VwdGlvbnMgaW4gRG9qbyB0byBlbmFibGUgbG9nZ2luZy4KKwkvLwlUaHJvd3MgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRleHQgb2YgJ2V4Y2VwdGlvbicgaWYgcHJvdmlkZWQsIG9yCisJLy8JcmV0aHJvd3MgZXhjZXB0aW9uIG9iamVjdC4KKworCWlmKGV4Y2VwdGlvbil7CisJCW1lc3NhZ2UgPSBtZXNzYWdlICsgIjogIitkb2pvLmVycm9yVG9TdHJpbmcoZXhjZXB0aW9uKTsKKwl9ZWxzZXsKKwkJbWVzc2FnZSA9IGRvam8uZXJyb3JUb1N0cmluZyhtZXNzYWdlKTsKKwl9CisKKwkvLyBwcmludCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBpZiBob3N0ZW52LnByaW50bG4gaXMgZGVmaW5lZAorCXRyeSB7IGlmKGRqQ29uZmlnLmlzRGVidWcpeyBkb2pvLmhvc3RlbnYucHJpbnRsbigiRkFUQUwgZXhjZXB0aW9uIHJhaXNlZDogIittZXNzYWdlKTsgfSB9IGNhdGNoIChlKSB7fQorCisJdGhyb3cgZXhjZXB0aW9uIHx8IEVycm9yKG1lc3NhZ2UpOworfQorCisvL1N0dWIgZnVuY3Rpb25zIHNvIHRoaW5ncyBkb24ndCBicmVhay4KKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRIRVNFPworZG9qby5kZWJ1ZyA9IGZ1bmN0aW9uKCl7fTsKK2Rvam8uZGVidWdTaGFsbG93ID0gZnVuY3Rpb24ob2JqKXt9OworZG9qby5wcm9maWxlID0geyBzdGFydDogZnVuY3Rpb24oKXt9LCBlbmQ6IGZ1bmN0aW9uKCl7fSwgc3RvcDogZnVuY3Rpb24oKXt9LCBkdW1wOiBmdW5jdGlvbigpe30gfTsKKworZnVuY3Rpb24gZGpfZXZhbCgvKlN0cmluZyovIHNjcmlwdEZyYWdtZW50KXsKKwkvLyBzdW1tYXJ5OiBQZXJmb3JtIGFuIGV2YWx1YXRpb24gaW4gdGhlIGdsb2JhbCBzY29wZS4gIFVzZSB0aGlzIHJhdGhlciB0aGFuIGNhbGxpbmcgJ2V2YWwoKScgZGlyZWN0bHkuCisJLy8gZGVzY3JpcHRpb246IFBsYWNlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIG1pbmltaXplIHNpemUgb2YgdHJhcHBlZCBldmFsdWF0aW9uIGNvbnRleHQuCisJLy8gbm90ZToKKwkvLwkgLSBKU0MgZXZhbCgpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aGljaCBjYW4gYmUgJ3Vuc2FmZScuCisJLy8JIC0gTW96aWxsYS9TcGlkZXJNb25rZXkgZXZhbCgpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aGljaCBpcyB0aGUKKwkvLyAgCSBzY29wZSBvYmplY3QgZm9yIG5ldyBzeW1ib2xzLgorCXJldHVybiBkal9nbG9iYWwuZXZhbCA/IGRqX2dsb2JhbC5ldmFsKHNjcmlwdEZyYWdtZW50KSA6IGV2YWwoc2NyaXB0RnJhZ21lbnQpOyAJLy8gbWl4ZWQKK30KKworZG9qby51bmltcGxlbWVudGVkID0gZnVuY3Rpb24oLypTdHJpbmcqLyBmdW5jbmFtZSwgLypTdHJpbmc/Ki8gZXh0cmEpeworCS8vIHN1bW1hcnk6IFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHNvbWUgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkLgorCS8vIGV4dHJhOiBUZXh0IHRvIGFwcGVuZCB0byB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisJdmFyIG1lc3NhZ2UgPSAiJyIgKyBmdW5jbmFtZSArICInIG5vdCBpbXBsZW1lbnRlZCI7CisJaWYgKGV4dHJhICE9IG51bGwpIHsgbWVzc2FnZSArPSAiICIgKyBleHRyYTsgfQorCWRvam8ucmFpc2UobWVzc2FnZSk7Cit9CisKK2Rvam8uZGVwcmVjYXRlZCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gYmVoYXZpb3VyLCAvKlN0cmluZz8qLyBleHRyYSwgLypTdHJpbmc/Ki8gcmVtb3ZhbCl7CisJLy8gc3VtbWFyeTogTG9nIGEgZGVidWcgbWVzc2FnZSB0byBpbmRpY2F0ZSB0aGF0IGEgYmVoYXZpb3IgaGFzIGJlZW4gZGVwcmVjYXRlZC4KKwkvLyBleHRyYTogVGV4dCB0byBhcHBlbmQgdG8gdGhlIG1lc3NhZ2UuCisJLy8gcmVtb3ZhbDogVGV4dCB0byBpbmRpY2F0ZSB3aGVuIGluIHRoZSBmdXR1cmUgdGhlIGJlaGF2aW9yIHdpbGwgYmUgcmVtb3ZlZC4KKwl2YXIgbWVzc2FnZSA9ICJERVBSRUNBVEVEOiAiICsgYmVoYXZpb3VyOworCWlmKGV4dHJhKXsgbWVzc2FnZSArPSAiICIgKyBleHRyYTsgfQorCWlmKHJlbW92YWwpeyBtZXNzYWdlICs9ICIgLS0gd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb246ICIgKyByZW1vdmFsOyB9CisJZG9qby5kZWJ1ZyhtZXNzYWdlKTsKK30KKworZG9qby5yZW5kZXIgPSAoZnVuY3Rpb24oKXsKKwkvL1RPRE9DOiBIT1cgVE8gRE9DIFRISVM/CisJLy8gc3VtbWFyeTogRGV0YWlscyByZW5kZXJpbmcgc3VwcG9ydCwgT1MgYW5kIGJyb3dzZXIgb2YgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCisJLy8gVE9ET0M6IGlzIHRoaXMgc29tZXRoaW5nIG1hbnkgZm9sa3Mgd2lsbCBpbnRlcmFjdCB3aXRoPyAgSWYgc28sIHdlIHNob3VsZCBkb2MgdGhlIHN0cnVjdHVyZSBjcmVhdGVkLi4uCisJZnVuY3Rpb24gdnNjYWZmb2xkKHByZWZzLCBuYW1lcyl7CisJCXZhciB0bXAgPSB7CisJCQljYXBhYmxlOiBmYWxzZSwKKwkJCXN1cHBvcnQ6IHsKKwkJCQlidWlsdGluOiBmYWxzZSwKKwkJCQlwbHVnaW46IGZhbHNlCisJCQl9LAorCQkJcHJlZml4ZXM6IHByZWZzCisJCX07CisJCWZvcih2YXIgaT0wOyBpPG5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCXRtcFtuYW1lc1tpXV0gPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdG1wOworCX0KKworCXJldHVybiB7CisJCW5hbWU6ICIiLAorCQl2ZXI6IGRvam8udmVyc2lvbiwKKwkJb3M6IHsgd2luOiBmYWxzZSwgbGludXg6IGZhbHNlLCBvc3g6IGZhbHNlIH0sCisJCWh0bWw6IHZzY2FmZm9sZChbImh0bWwiXSwgWyJpZSIsICJvcGVyYSIsICJraHRtbCIsICJzYWZhcmkiLCAibW96Il0pLAorCQlzdmc6IHZzY2FmZm9sZChbInN2ZyJdLCBbImNvcmVsIiwgImFkb2JlIiwgImJhdGlrIl0pLAorCQl2bWw6IHZzY2FmZm9sZChbInZtbCJdLCBbImllIl0pLAorCQlzd2Y6IHZzY2FmZm9sZChbIlN3ZiIsICJGbGFzaCIsICJNbSJdLCBbIm1tIl0pLAorCQlzd3Q6IHZzY2FmZm9sZChbIlN3dCJdLCBbImlibSJdKQorCX07Cit9KSgpOworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkb2pvLmhvc3RlbnYgbWV0aG9kcyB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiBob3N0ZW52XyouanMKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIGRlZmluaW5pbmcgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIEVjbWFTY3JpcHQgaG9zdCBlbnZpcm9ubWVudC4KKyovCisKKy8qCisgKiBOb25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGxpYnJhcnkgdXNlcnMuCisgKiBJbnN0ZWFkIHB1YmxpYyBtZXRob2RzIHN1Y2ggYXMgbG9hZE1vZHVsZSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQuCisgKi8KK2Rvam8uaG9zdGVudiA9IChmdW5jdGlvbigpeworCS8vIFRPRE9DOiAgSE9XIFRPIERPQyBUSElTPworCS8vIHN1bW1hcnk6IFByb3ZpZGVzIGVuY2Fwc3VsYXRpb24gb2YgYmVoYXZpb3IgdGhhdCBjaGFuZ2VzIGFjcm9zcyBkaWZmZXJlbnQgJ2hvc3QgZW52aXJvbm1lbnRzJworCS8vCQkJKGRpZmZlcmVudCBicm93c2Vycywgc2VydmVyIHZpYSBSaGlubywgZXRjKS4KKwkvLyBkZXNjcmlwdGlvbjogTm9uZSBvZiB0aGVzZSBtZXRob2RzIHNob3VsZCBldmVyIGJlIGNhbGxlZCBkaXJlY3RseSBieSBsaWJyYXJ5IHVzZXJzLgorCS8vCQkJCVVzZSBwdWJsaWMgbWV0aG9kcyBzdWNoIGFzICdsb2FkTW9kdWxlJyBpbnN0ZWFkLgorCisJLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKwl2YXIgY29uZmlnID0geworCQlpc0RlYnVnOiBmYWxzZSwKKwkJYWxsb3dRdWVyeUNvbmZpZzogZmFsc2UsCisJCWJhc2VTY3JpcHRVcmk6ICIiLAorCQliYXNlUmVsYXRpdmVQYXRoOiAiIiwKKwkJbGlicmFyeVNjcmlwdFVyaTogIiIsCisJCWllUHJldmVudENsb2JiZXI6IGZhbHNlLAorCQlpZUNsb2JiZXJNaW5pbWFsOiB0cnVlLAorCQlwcmV2ZW50QmFja0J1dHRvbkZpeDogdHJ1ZSwKKwkJZGVsYXlNb3pMb2FkaW5nRml4OiBmYWxzZSwKKwkJc2VhcmNoSWRzOiBbXSwKKwkJcGFyc2VXaWRnZXRzOiB0cnVlCisJfTsKKworCWlmICh0eXBlb2YgZGpDb25maWcgPT0gInVuZGVmaW5lZCIpIHsgZGpDb25maWcgPSBjb25maWc7IH0KKwllbHNlIHsKKwkJZm9yICh2YXIgb3B0aW9uIGluIGNvbmZpZykgeworCQkJaWYgKHR5cGVvZiBkakNvbmZpZ1tvcHRpb25dID09ICJ1bmRlZmluZWQiKSB7CisJCQkJZGpDb25maWdbb3B0aW9uXSA9IGNvbmZpZ1tvcHRpb25dOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHsKKwkJbmFtZV86ICcodW5zZXQpJywKKwkJdmVyc2lvbl86ICcodW5zZXQpJywKKworCisJCWdldE5hbWU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1hcnk6IFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaG9zdCBlbnZpcm9ubWVudC4KKwkJCXJldHVybiB0aGlzLm5hbWVfOyAJLy8gU3RyaW5nCisJCX0sCisKKworCQlnZXRWZXJzaW9uOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBob3N0ZW52LgorCQkJcmV0dXJuIHRoaXMudmVyc2lvbl87IC8vIFN0cmluZworCQl9LAorCisJCWdldFRleHQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdXJpKXsKKwkJCS8vIHN1bW1hcnk6CVJlYWQgdGhlIHBsYWluL3RleHQgY29udGVudHMgYXQgdGhlIHNwZWNpZmllZCAndXJpJy4KKwkJCS8vIGRlc2NyaXB0aW9uOgorCQkJLy8JCQlJZiAnZ2V0VGV4dCgpJyBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIG92ZXJyaWRlCisJCQkvLwkJCSdsb2FkVXJpKCknIHdpdGggYW4gaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IHJlbHkgb24gaXQuCisKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZ2V0VGV4dCcsICJ1cmk9IiArIHVyaSk7CisJCX0KKwl9OworfSkoKTsKKworCitkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeTogUmV0dXJuIHRoZSBiYXNlIHNjcmlwdCB1cmkgdGhhdCBvdGhlciBzY3JpcHRzIGFyZSBmb3VuZCByZWxhdGl2ZSB0by4KKwkvLyBUT0RPQzogSFVIPyAgVGhpcyBjb21tZW50IG1lYW5zIG5vdGhpbmcgdG8gbWUuICBXaGF0IG90aGVyIHNjcmlwdHM/IElzIHRoaXMgdGhlIHBhdGggdG8gb3RoZXIgZG9qbyBsaWJyYXJpZXM/CisJLy8JCU1BWUJFOiAgUmV0dXJuIHRoZSBiYXNlIHVyaSB0byBzY3JpcHRzIGluIHRoZSBkb2pvIGxpYnJhcnkuCSA/Pz8KKwkvLyByZXR1cm46IEVtcHR5IHN0cmluZyBvciBhIHBhdGggZW5kaW5nIGluICcvJy4KKwlpZihkakNvbmZpZy5iYXNlU2NyaXB0VXJpLmxlbmd0aCl7CisJCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOworCX0KKworCS8vIE1PVzogV2h5IG5vdDoKKwkvLwkJCXVyaSA9IGRqQ29uZmlnLmxpYnJhcnlTY3JpcHRVcmkgfHwgZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aAorCS8vCQk/Pz8gV2h5ICduZXcgU3RyaW5nKC4uLiknCisJdmFyIHVyaSA9IG5ldyBTdHJpbmcoZGpDb25maWcubGlicmFyeVNjcmlwdFVyaXx8ZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aCk7CisJaWYgKCF1cmkpIHsgZG9qby5yYWlzZSgiTm90aGluZyByZXR1cm5lZCBieSBnZXRMaWJyYXJ5U2NyaXB0VXJpKCk6ICIgKyB1cmkpOyB9CisKKwkvLyBNT1c6IHVyaSBzZWVtcyB0byBub3QgYmUgYWN0dWFsbHkgdXNlZC4gIFNlZW1zIHRvIGJlIGhhcmQtY29kaW5nIHRvIGRqQ29uZmlnLmJhc2VSZWxhdGl2ZVBhdGguLi4gPz8/CisJdmFyIGxhc3RzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwkJLy8gTU9XID8/PworCWRqQ29uZmlnLmJhc2VTY3JpcHRVcmkgPSBkakNvbmZpZy5iYXNlUmVsYXRpdmVQYXRoOworCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOwkvLyBTdHJpbmcKK30KKworLyoKKyAqIGxvYWRlci5qcyAtIEEgYm9vdHN0cmFwIG1vZHVsZS4gIFJ1bnMgYmVmb3JlIHRoZSBob3N0ZW52XyouanMgZmlsZS4gQ29udGFpbnMgYWxsIG9mIHRoZSBwYWNrYWdlIGxvYWRpbmcgbWV0aG9kcy4KKyAqLworCisvL0Egc2VtaS1jb2xvbiBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYmVjYXVzZSBhZnRlciBkb2luZyBhIGJ1aWxkLCB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24KKy8vZ2V0IGNvbXByZXNzZWQgb250byB0aGUgc2FtZSBsaW5lIGFzIHRoZSBsYXN0IGxpbmUgaW4gYm9vdHN0cmFwMS5qcy4gVGhhdCBsaXN0IGxpbmUgaXMganVzdCBhCisvL2N1cmx5IGJyYWNrZXQsIGFuZCB0aGUgYnJvd3NlciBjb21wbGFpbnMgYWJvdXQgdGhhdCBzeW50YXguIFRoZSBzZW1pY29sb24gZml4ZXMgaXQuIFB1dHRpbmcgaXQKKy8vaGVyZSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgb2YgYm9vdHN0cmFwMS5qcywgc2luY2UgaXQgaXMgbW9yZSBvZiBhbiBpc3N1ZSBmb3IgdGhpcyBmaWxlLCAodXNpbmcKKy8vdGhlIGNsb3N1cmUpLCBhbmQgYm9vdHN0cmFwMS5qcyBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKzsoZnVuY3Rpb24oKXsKKwkvL0FkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgZG9qby5ob3N0ZW52CisJdmFyIF9hZGRIb3N0RW52ID0geworCQlwa2dGaWxlTmFtZTogIl9fcGFja2FnZV9fIiwKKwkKKwkJLy8gZm9yIHJlY3Vyc2lvbiBwcm90ZWN0aW9uCisJCWxvYWRpbmdfbW9kdWxlc186IHt9LAorCQlsb2FkZWRfbW9kdWxlc186IHt9LAorCQlhZGRlZFRvTG9hZGluZ0NvdW50OiBbXSwKKwkJcmVtb3ZlZEZyb21Mb2FkaW5nQ291bnQ6IFtdLAorCQorCQlpbkZsaWdodENvdW50OiAwLAorCQorCQkvLyBGSVhNRTogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHB1bGwgbW9kdWxlIHByZWZpeGVzIGluIGZyb20gZGpDb25maWcKKwkJbW9kdWxlUHJlZml4ZXNfOiB7CisJCQlkb2pvOiB7bmFtZTogImRvam8iLCB2YWx1ZTogInNyYyJ9CisJCX0sCisKKwkJc2V0TW9kdWxlUHJlZml4OiBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlLCAvKlN0cmluZyovcHJlZml4KXsKKwkJCS8vIHN1bW1hcnk6IGVzdGFibGlzaGVzIG1vZHVsZS9wcmVmaXggcGFpcgorCQkJdGhpcy5tb2R1bGVQcmVmaXhlc19bbW9kdWxlXSA9IHtuYW1lOiBtb2R1bGUsIHZhbHVlOiBwcmVmaXh9OworCQl9LAorCisJCW1vZHVsZUhhc1ByZWZpeDogZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSl7CisJCQkvLyBzdW1tYXJ5OiBjaGVja3MgdG8gc2VlIGlmIG1vZHVsZSBoYXMgYmVlbiBlc3RhYmxpc2hlZAorCQkJdmFyIG1wID0gdGhpcy5tb2R1bGVQcmVmaXhlc187CisJCQlyZXR1cm4gQm9vbGVhbihtcFttb2R1bGVdICYmIG1wW21vZHVsZV0udmFsdWUpOyAvLyBCb29sZWFuCisJCX0sCisKKwkJZ2V0TW9kdWxlUHJlZml4OiBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlKXsKKwkJCS8vIHN1bW1hcnk6IGdldHMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggbW9kdWxlCisJCQlpZih0aGlzLm1vZHVsZUhhc1ByZWZpeChtb2R1bGUpKXsKKwkJCQlyZXR1cm4gdGhpcy5tb2R1bGVQcmVmaXhlc19bbW9kdWxlXS52YWx1ZTsgLy8gU3RyaW5nCisJCQl9CisJCQlyZXR1cm4gbW9kdWxlOyAvLyBTdHJpbmcKKwkJfSwKKworCQlnZXRUZXh0U3RhY2s6IFtdLAorCQlsb2FkVXJpU3RhY2s6IFtdLAorCQlsb2FkZWRVcmlzOiBbXSwKKwkKKwkJLy9XQVJOSU5HOiBUaGlzIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgYnkgcGFja2FnZXMgb3V0c2lkZSBvZiBib290c3RyYXA6IEZsb2F0aW5nUGFuZS5qcyBhbmQgdW5kby9icm93c2VyLmpzCisJCXBvc3RfbG9hZF86IGZhbHNlLAorCQkKKwkJLy9FZ2FkISBMb3RzIG9mIHRlc3QgZmlsZXMgcHVzaCBvbiB0aGlzIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgZG9qby5hZGRPbkxvYWQuCisJCW1vZHVsZXNMb2FkZWRMaXN0ZW5lcnM6IFtdLAorCQl1bmxvYWRMaXN0ZW5lcnM6IFtdLAorCQlsb2FkTm90aWZ5aW5nOiBmYWxzZQorCX07CisJCisJLy9BZGQgYWxsIG9mIHRoZXNlIHByb3BlcnRpZXMgdG8gZG9qby5ob3N0ZW52CisJZm9yKHZhciBwYXJhbSBpbiBfYWRkSG9zdEVudil7CisJCWRvam8uaG9zdGVudltwYXJhbV0gPSBfYWRkSG9zdEVudltwYXJhbV07CisJfQorfSkoKTsKKworZG9qby5ob3N0ZW52LmxvYWRQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqL3JlbHBhdGgsIC8qU3RyaW5nPyovbW9kdWxlLCAvKkZ1bmN0aW9uPyovY2IpeworLy8gc3VtbWFyeToKKy8vCUxvYWQgYSBKYXZhc2NyaXB0IG1vZHVsZSBnaXZlbiBhIHJlbGF0aXZlIHBhdGgKKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCUxvYWRzIGFuZCBpbnRlcnByZXRzIHRoZSBzY3JpcHQgbG9jYXRlZCBhdCByZWxwYXRoLCB3aGljaCBpcyByZWxhdGl2ZSB0byB0aGUKKy8vCXNjcmlwdCByb290IGRpcmVjdG9yeS4gIElmIHRoZSBzY3JpcHQgaXMgZm91bmQgYnV0IGl0cyBpbnRlcnByZXRhdGlvbiBjYXVzZXMKKy8vCWEgcnVudGltZSBleGNlcHRpb24sIHRoYXQgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgdXMsIHNvIHRoZSBjYWxsZXIgd2lsbAorLy8Jc2VlIGl0LiAgV2UgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBhbmQgb25seSBpZiB0aGUgc2NyaXB0IGlzIGZvdW5kLgorLy8KKy8vCUZvciBub3csIHdlIGRvIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgdHJ1ZSBzZWFyY2ggcGF0aC4gIFdlCisvLwljb25zaWRlciBvbmx5IHRoZSBzaW5nbGUgYmFzZSBzY3JpcHQgdXJpLCBhcyByZXR1cm5lZCBieSBnZXRCYXNlU2NyaXB0VXJpKCkuCisvLworLy8gcmVscGF0aDogQSByZWxhdGl2ZSBwYXRoIHRvIGEgc2NyaXB0IChubyBsZWFkaW5nICcvJywgYW5kIHR5cGljYWxseQorLy8gCWVuZGluZyBpbiAnLmpzJykuCisvLyBtb2R1bGU6IEEgbW9kdWxlIHdob3NlIGV4aXN0YW5jZSB0byBjaGVjayBmb3IgYWZ0ZXIgbG9hZGluZyBhIHBhdGguCisvLwlDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBsb2FkLgorLy8gY2I6IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcGFzcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNjcmlwdAorCisJdmFyIHVyaTsKKwlpZihyZWxwYXRoLmNoYXJBdCgwKSA9PSAnLycgfHwgcmVscGF0aC5tYXRjaCgvXlx3KzovKSl7CisJCS8vIGRvam8ucmFpc2UoInJlbHBhdGggJyIgKyByZWxwYXRoICsgIic7IG11c3QgYmUgcmVsYXRpdmUiKTsKKwkJdXJpID0gcmVscGF0aDsKKwl9ZWxzZXsKKwkJdXJpID0gdGhpcy5nZXRCYXNlU2NyaXB0VXJpKCkgKyByZWxwYXRoOworCX0KKwlpZihkakNvbmZpZy5jYWNoZUJ1c3QgJiYgZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKXsKKwkJdXJpICs9ICI/IiArIFN0cmluZyhkakNvbmZpZy5jYWNoZUJ1c3QpLnJlcGxhY2UoL1xXKy9nLCIiKTsKKwl9CisJdHJ5eworCQlyZXR1cm4gIW1vZHVsZSA/IHRoaXMubG9hZFVyaSh1cmksIGNiKSA6IHRoaXMubG9hZFVyaUFuZENoZWNrKHVyaSwgbW9kdWxlLCBjYik7IC8vIEJvb2xlYW4KKwl9Y2F0Y2goZSl7CisJCWRvam8uZGVidWcoZSk7CisJCXJldHVybiBmYWxzZTsgLy8gQm9vbGVhbgorCX0KK30KKworZG9qby5ob3N0ZW52LmxvYWRVcmkgPSBmdW5jdGlvbigvKlN0cmluZyAoVVJMKSovdXJpLCAvKkZ1bmN0aW9uPyovY2IpeworLy8gc3VtbWFyeToKKy8vCUxvYWRzIEphdmFTY3JpcHQgZnJvbSBhIFVSSQorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8JUmVhZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkksIGFuZCBldmFsdWF0ZXMgdGhlIGNvbnRlbnRzLiAgVGhpcyBpcyB1c2VkIHRvIGxvYWQgbW9kdWxlcyBhcyB3ZWxsCisvLwlhcyByZXNvdXJjZSBidW5kbGVzLiAgUmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgVVJJIHJlYWRpbmcgZmFpbGVkLgorLy8JVGhyb3dzIGlmIHRoZSBldmFsdWF0aW9uIHRocm93cy4KKy8vCisvLyB1cmk6IGEgdXJpIHdoaWNoIHBvaW50cyBhdCB0aGUgc2NyaXB0IHRvIGJlIGxvYWRlZAorLy8gY2I6IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNjcmlwdCBhcyBhbiBleHByZXNzaW9uLCB0eXBpY2FsbHkKKy8vCXVzZWQgYnkgdGhlIHJlc291cmNlIGJ1bmRsZSBsb2FkZXIgdG8gbG9hZCBKU09OLXN0eWxlIHJlc291cmNlcworCisJaWYodGhpcy5sb2FkZWRVcmlzW3VyaV0peworCQlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorCX0KKwl2YXIgY29udGVudHMgPSB0aGlzLmdldFRleHQodXJpLCBudWxsLCB0cnVlKTsKKwlpZighY29udGVudHMpeyByZXR1cm4gZmFsc2U7IH0gLy8gQm9vbGVhbgorCXRoaXMubG9hZGVkVXJpc1t1cmldID0gdHJ1ZTsKKwlpZihjYil7IGNvbnRlbnRzID0gJygnK2NvbnRlbnRzKycpJzsgfQorCXZhciB2YWx1ZSA9IGRqX2V2YWwoY29udGVudHMpOworCWlmKGNiKXsgY2IodmFsdWUpOyB9CisJcmV0dXJuIHRydWU7IC8vIEJvb2xlYW4KK30KKworLy8gRklYTUU6IHByb2JhYmx5IG5lZWQgdG8gYWRkIGxvZ2dpbmcgdG8gdGhpcyBtZXRob2QKK2Rvam8uaG9zdGVudi5sb2FkVXJpQW5kQ2hlY2sgPSBmdW5jdGlvbigvKlN0cmluZyAoVVJMKSovdXJpLCAvKlN0cmluZyovbW9kdWxlTmFtZSwgLypGdW5jdGlvbj8qL2NiKXsKKwkvLyBzdW1tYXJ5OiBjYWxscyBsb2FkVXJpIHRoZW4gZmluZE1vZHVsZSBhbmQgcmV0dXJucyB0cnVlIGlmIGJvdGggc3VjY2VlZAorCXZhciBvayA9IHRydWU7CisJdHJ5eworCQlvayA9IHRoaXMubG9hZFVyaSh1cmksIGNiKTsKKwl9Y2F0Y2goZSl7CisJCWRvam8uZGVidWcoImZhaWxlZCBsb2FkaW5nICIsIHVyaSwgIiB3aXRoIGVycm9yOiAiLCBlKTsKKwl9CisJcmV0dXJuIEJvb2xlYW4ob2sgJiYgdGhpcy5maW5kTW9kdWxlKG1vZHVsZU5hbWUsIGZhbHNlKSk7IC8vIEJvb2xlYW4KK30KKworZG9qby5sb2FkZWQgPSBmdW5jdGlvbigpeyB9Citkb2pvLnVubG9hZGVkID0gZnVuY3Rpb24oKXsgfQorCitkb2pvLmhvc3RlbnYubG9hZGVkID0gZnVuY3Rpb24oKXsKKwl0aGlzLmxvYWROb3RpZnlpbmcgPSB0cnVlOworCXRoaXMucG9zdF9sb2FkXyA9IHRydWU7CisJdmFyIG1sbCA9IHRoaXMubW9kdWxlc0xvYWRlZExpc3RlbmVyczsKKwlmb3IodmFyIHg9MDsgeDxtbGwubGVuZ3RoOyB4KyspeworCQltbGxbeF0oKTsKKwl9CisKKwkvL0NsZWFyIGxpc3RlbmVycyBzbyBuZXcgb25lcyBjYW4gYmUgYWRkZWQKKwkvL0ZvciBvdGhlciB4ZG9tYWluIHBhY2thZ2UgbG9hZHMgYWZ0ZXIgdGhlIGluaXRpYWwgbG9hZC4KKwl0aGlzLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMgPSBbXTsKKwl0aGlzLmxvYWROb3RpZnlpbmcgPSBmYWxzZTsKKworCWRvam8ubG9hZGVkKCk7Cit9CisKK2Rvam8uaG9zdGVudi51bmxvYWRlZCA9IGZ1bmN0aW9uKCl7CisJdmFyIG1sbCA9IHRoaXMudW5sb2FkTGlzdGVuZXJzOworCXdoaWxlKG1sbC5sZW5ndGgpeworCQkobWxsLnBvcCgpKSgpOworCX0KKwlkb2pvLnVubG9hZGVkKCk7Cit9CisKK2Rvam8uYWRkT25Mb2FkID0gZnVuY3Rpb24oLypPYmplY3Q/Ki9vYmosIC8qU3RyaW5nfEZ1bmN0aW9uKi9mdW5jdGlvbk5hbWUpIHsKKy8vIHN1bW1hcnk6CisvLwlSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIERPTSBoYXMgZmluaXNoZWQgbG9hZGluZyAKKy8vCWFuZCB3aWRnZXRzIGRlY2xhcmVkIGluIG1hcmt1cCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLiAgSW1hZ2VzIGFuZCBDU1MgZmlsZXMKKy8vCW1heSBvciBtYXkgbm90IGhhdmUgZmluaXNoZWQgZG93bmxvYWRpbmcgd2hlbiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKy8vCShOb3RlIHRoYXQgd2lkZ2V0cycgQ1NTIGFuZCBIVE1MIGNvZGUgaXMgZ3VhcmFudGVlZCB0byBiZSBkb3dubG9hZGVkIGJlZm9yZSBzYWlkCisvLwl3aWRnZXRzIGFyZSBpbnN0YW50aWF0ZWQuKQorLy8KKy8vIHVzYWdlOgorLy8JZG9qby5hZGRPbkxvYWQoZnVuY3Rpb25Qb2ludGVyKQorLy8JZG9qby5hZGRPbkxvYWQob2JqZWN0LCAiZnVuY3Rpb25OYW1lIikKKworCXZhciBkaCA9IGRvam8uaG9zdGVudjsKKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKwkJZGgubW9kdWxlc0xvYWRlZExpc3RlbmVycy5wdXNoKG9iaik7CisJfSBlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCWRoLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMucHVzaChmdW5jdGlvbigpIHsKKwkJCW9ialtmdW5jdGlvbk5hbWVdKCk7CisJCX0pOworCX0KKworCS8vQWRkZWQgZm9yIHhkb21haW4gbG9hZGluZy4gZG9qby5hZGRPbkxvYWQgaXMgdXNlZCB0bworCS8vaW5kaWNhdGUgY2FsbGJhY2tzIGFmdGVyIGRvaW5nIHNvbWUgZG9qby5yZXF1aXJlKCkgc3RhdGVtZW50cy4KKwkvL0luIHRoZSB4ZG9tYWluIGNhc2UsIGlmIGFsbCB0aGUgcmVxdWlyZXMgYXJlIGxvYWRlZCAoYWZ0ZXIgaW5pdGlhbAorCS8vcGFnZSBsb2FkKSwgdGhlbiBpbW1lZGlhdGVseSBjYWxsIGFueSBsaXN0ZW5lcnMuCisJaWYoZGgucG9zdF9sb2FkXyAmJiBkaC5pbkZsaWdodENvdW50ID09IDAgJiYgIWRoLmxvYWROb3RpZnlpbmcpeworCQlkaC5jYWxsTG9hZGVkKCk7CisJfQorfQorCitkb2pvLmFkZE9uVW5sb2FkID0gZnVuY3Rpb24oLypPYmplY3Q/Ki9vYmosIC8qU3RyaW5nfEZ1bmN0aW9uPyovZnVuY3Rpb25OYW1lKXsKKy8vIHN1bW1hcnk6IHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBwYWdlIHVubG9hZHMKKy8vCisvLyB1c2FnZToKKy8vCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uUG9pbnRlcikKKy8vCWRvam8uYWRkT25Mb2FkKG9iamVjdCwgImZ1bmN0aW9uTmFtZSIpCisJdmFyIGRoID0gZG9qby5ob3N0ZW52OworCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSl7CisJCWRoLnVubG9hZExpc3RlbmVycy5wdXNoKG9iaik7CisJfSBlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCWRoLnVubG9hZExpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCkgeworCQkJb2JqW2Z1bmN0aW9uTmFtZV0oKTsKKwkJfSk7CisJfQorfQorCitkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCA9IGZ1bmN0aW9uKCl7CisJaWYodGhpcy5wb3N0X2xvYWRfKXsgcmV0dXJuOyB9CisJaWYodGhpcy5sb2FkVXJpU3RhY2subGVuZ3RoPT0wICYmIHRoaXMuZ2V0VGV4dFN0YWNrLmxlbmd0aD09MCl7CisJCWlmKHRoaXMuaW5GbGlnaHRDb3VudCA+IDApeyAKKwkJCWRvam8uZGVidWcoImZpbGVzIHN0aWxsIGluIGZsaWdodCEiKTsKKwkJCXJldHVybjsKKwkJfQorCQlkb2pvLmhvc3RlbnYuY2FsbExvYWRlZCgpOworCX0KK30KKworZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQgPSBmdW5jdGlvbigpeworCS8vVGhlICJvYmplY3QiIGNoZWNrIGlzIGZvciBJRSwgYW5kIHRoZSBvdGhlciBvcGVyYSBjaGVjayBmaXhlcyBhbiBpc3N1ZQorCS8vaW4gT3BlcmEgd2hlcmUgaXQgY291bGQgbm90IGZpbmQgdGhlIGJvZHkgZWxlbWVudCBpbiBzb21lIHdpZGdldCB0ZXN0IGNhc2VzLgorCS8vRm9yIDAuOSwgbWF5YmUgcm91dGUgYWxsIGJyb3dzZXJzIHRocm91Z2ggdGhlIHNldFRpbWVvdXQgKG5lZWQgcHJvdGVjdGlvbgorCS8vc3RpbGwgZm9yIG5vbi1icm93c2VyIGVudmlyb25tZW50cyB0aG91Z2gpLiBUaGlzIG1pZ2h0IGFsc28gaGVscCB0aGUgaXNzdWUgd2l0aAorCS8vRkYgMi4wIGFuZCBmcmVlemluZyBpc3N1ZXMgd2hlcmUgd2UgdHJ5IHRvIGRvIHN5bmMgeGhyIHdoaWxlIGJhY2tncm91bmQgY3NzIGltYWdlcworCS8vYXJlIGJlaW5nIGxvYWRlZCAodHJhYyAjMjU3Mik/IENvbnNpZGVyIGZvciAwLjkuCisJaWYodHlwZW9mIHNldFRpbWVvdXQgPT0gIm9iamVjdCIgfHwgKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gJiYgZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkpeworCQlzZXRUaW1lb3V0KCJkb2pvLmhvc3RlbnYubG9hZGVkKCk7IiwgMCk7CisJfWVsc2V7CisJCWRvam8uaG9zdGVudi5sb2FkZWQoKTsKKwl9Cit9CisKK2Rvam8uaG9zdGVudi5nZXRNb2R1bGVTeW1ib2xzID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZW5hbWUpeworLy8gc3VtbWFyeToKKy8vCUNvbnZlcnRzIGEgbW9kdWxlIG5hbWUgaW4gZG90dGVkIEpTIG5vdGF0aW9uIHRvIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGF0aCBpbiB0aGUgc291cmNlIHRyZWUKKwl2YXIgc3ltcyA9IG1vZHVsZW5hbWUuc3BsaXQoIi4iKTsKKwlmb3IodmFyIGkgPSBzeW1zLmxlbmd0aDsgaT4wOyBpLS0peworCQl2YXIgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCIuIik7CisJCWlmKChpPT0xKSAmJiAhdGhpcy5tb2R1bGVIYXNQcmVmaXgocGFyZW50TW9kdWxlKSl7CQkKKwkJCS8vIFN1cHBvcnQgZGVmYXVsdCBtb2R1bGUgZGlyZWN0b3J5IChzaWJsaW5nIG9mIGRvam8pIGZvciB0b3AtbGV2ZWwgbW9kdWxlcyAKKwkJCXN5bXNbMF0gPSAiLi4vIiArIHN5bXNbMF07CisJCX1lbHNleworCQkJdmFyIHBhcmVudE1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVByZWZpeChwYXJlbnRNb2R1bGUpOworCQkJaWYocGFyZW50TW9kdWxlUGF0aCAhPSBwYXJlbnRNb2R1bGUpeworCQkJCXN5bXMuc3BsaWNlKDAsIGksIHBhcmVudE1vZHVsZVBhdGgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBzeW1zOyAvLyBBcnJheQorfQorCitkb2pvLmhvc3RlbnYuX2dsb2JhbF9vbWl0X21vZHVsZV9jaGVjayA9IGZhbHNlOworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUgPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypCb29sZWFuPyovZXhhY3RPbmx5LCAvKkJvb2xlYW4/Ki9vbWl0TW9kdWxlQ2hlY2speworLy8gc3VtbWFyeToKKy8vCWxvYWRzIGEgSmF2YXNjcmlwdCBtb2R1bGUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgVVJJCisvLworLy8gZGVzY3JpcHRpb246CisvLwlsb2FkTW9kdWxlKCJBLkIiKSBmaXJzdCBjaGVja3MgdG8gc2VlIGlmIHN5bWJvbCBBLkIgaXMgZGVmaW5lZC4gCisvLwlJZiBpdCBpcywgaXQgaXMgc2ltcGx5IHJldHVybmVkIChub3RoaW5nIHRvIGRvKS4KKy8vCQorLy8JSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IHdpbGwgbG9vayBmb3IgIkEvQi5qcyIgaW4gdGhlIHNjcmlwdCByb290IGRpcmVjdG9yeSwKKy8vCWZvbGxvd2VkIGJ5ICJBLmpzIi4KKy8vCQorLy8JSXQgdGhyb3dzIGlmIGl0IGNhbm5vdCBmaW5kIGEgZmlsZSB0byBsb2FkLCBvciBpZiB0aGUgc3ltYm9sIEEuQiBpcyBub3QKKy8vCWRlZmluZWQgYWZ0ZXIgbG9hZGluZy4KKy8vCQorLy8JSXQgcmV0dXJucyB0aGUgb2JqZWN0IEEuQi4KKy8vCQorLy8JVGhpcyBkb2VzIG5vdGhpbmcgYWJvdXQgaW1wb3J0aW5nIHN5bWJvbHMgaW50byB0aGUgY3VycmVudCBwYWNrYWdlLgorLy8JSXQgaXMgcHJlc3VtZWQgdGhhdCB0aGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoYXQuIEZvciBleGFtcGxlLCB0byBpbXBvcnQKKy8vCWFsbCBzeW1ib2xzOgorLy8JCisvLwkgICB3aXRoIChkb2pvLmhvc3RlbnYubG9hZE1vZHVsZSgiQS5CIikpIHsKKy8vCSAgICAgIC4uLgorLy8JICAgfQorLy8JCisvLwlBbmQgdG8gaW1wb3J0IGp1c3QgdGhlIGxlYWYgc3ltYm9sOgorLy8JCisvLwkgICB2YXIgQiA9IGRvam8uaG9zdGVudi5sb2FkTW9kdWxlKCJBLkIiKTsKKy8vCSAgIC4uLgorLy8JCisvLwlkal9sb2FkIGlzIGFuIGFsaWFzIGZvciBkb2pvLmhvc3RlbnYubG9hZE1vZHVsZQorCisJaWYoIW1vZHVsZU5hbWUpeyByZXR1cm47IH0KKwlvbWl0TW9kdWxlQ2hlY2sgPSB0aGlzLl9nbG9iYWxfb21pdF9tb2R1bGVfY2hlY2sgfHwgb21pdE1vZHVsZUNoZWNrOworCXZhciBtb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCWlmKG1vZHVsZSl7CisJCXJldHVybiBtb2R1bGU7CisJfQorCisJLy8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbiBmcm9tIG11dHVhbCBkZXBlbmRlbmNpZXMKKwlpZihkal91bmRlZihtb2R1bGVOYW1lLCB0aGlzLmxvYWRpbmdfbW9kdWxlc18pKXsKKwkJdGhpcy5hZGRlZFRvTG9hZGluZ0NvdW50LnB1c2gobW9kdWxlTmFtZSk7CisJfQorCXRoaXMubG9hZGluZ19tb2R1bGVzX1ttb2R1bGVOYW1lXSA9IDE7CisKKwkvLyBjb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcworCXZhciByZWxwYXRoID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cLi9nLCAnLycpICsgJy5qcyc7CisKKwl2YXIgbnN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCIuIik7CisJCisJLy8gdGhpcyBsaW5lIGFsbG93ZWQgbG9hZGluZyBvZiBhIG1vZHVsZSBtYW5pZmVzdCBhcyBpZiBpdCB3ZXJlIGEgbmFtZXNwYWNlCisJLy8gaXQncyBhbiBpbnRlcmVzdGluZyBpZGVhLCBidXQgc2hvdWxkbid0IGJlIGNvbWJpbmVkIHdpdGggJ25hbWVzcGFjZXMnIHByb3BlcgorCS8vIGFuZCBsZWFkcyB0byB1bndhbnRlZCBkZXBlbmRlbmNpZXMKKwkvLyB0aGUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBpbiBvdGhlciAoYWxiZWl0IGxlc3MtZmxleGlibGUpIHdheXMgbm93LCBzbyBJIGFtCisJLy8gcmVtb3ZpbmcgdGhpcyBwZW5kaW5nIGZ1cnRoZXIgZGVzaWduIHdvcmsKKwkvLyBwZXJoYXBzIHdlIGNhbiBleHBsaWNpdGx5IGRlZmluZSB0aGlzIGlkZWEgb2YgYSAnbW9kdWxlIG1hbmlmZXN0JywgYW5kIHN1YmNsYXNzCisJLy8gJ25hbWVzcGFjZSBtYW5pZmVzdCcgZnJvbSB0aGF0CisJLy9kb2pvLmdldE5hbWVzcGFjZShuc3ltc1swXSk7CisKKwl2YXIgc3ltcyA9IHRoaXMuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGVOYW1lKTsKKwl2YXIgc3RhcnRlZFJlbGF0aXZlID0gKChzeW1zWzBdLmNoYXJBdCgwKSAhPSAnLycpICYmICFzeW1zWzBdLm1hdGNoKC9eXHcrOi8pKTsKKwl2YXIgbGFzdCA9IHN5bXNbc3ltcy5sZW5ndGggLSAxXTsKKwl2YXIgb2s7CisJLy8gZmlndXJlIG91dCBpZiB3ZSdyZSBsb29raW5nIGZvciBhIGZ1bGwgcGFja2FnZSwgaWYgc28sIHdlIHdhbnQgdG8gZG8KKwkvLyB0aGluZ3Mgc2xpZ2h0bHkgZGlmZnJlbnRseQorCWlmKGxhc3Q9PSIqIil7CisJCW1vZHVsZU5hbWUgPSBuc3ltcy5zbGljZSgwLCAtMSkuam9pbignLicpOworCQl3aGlsZShzeW1zLmxlbmd0aCl7CisJCQlzeW1zLnBvcCgpOworCQkJc3ltcy5wdXNoKHRoaXMucGtnRmlsZU5hbWUpOworCQkJcmVscGF0aCA9IHN5bXMuam9pbigiLyIpICsgJy5qcyc7CisJCQlpZihzdGFydGVkUmVsYXRpdmUgJiYgcmVscGF0aC5jaGFyQXQoMCk9PSIvIil7CisJCQkJcmVscGF0aCA9IHJlbHBhdGguc2xpY2UoMSk7CisJCQl9CisJCQlvayA9IHRoaXMubG9hZFBhdGgocmVscGF0aCwgIW9taXRNb2R1bGVDaGVjayA/IG1vZHVsZU5hbWUgOiBudWxsKTsKKwkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCXN5bXMucG9wKCk7CisJCX0KKwl9ZWxzZXsKKwkJcmVscGF0aCA9IHN5bXMuam9pbigiLyIpICsgJy5qcyc7CisJCW1vZHVsZU5hbWUgPSBuc3ltcy5qb2luKCcuJyk7CisJCXZhciBtb2RBcmcgPSAhb21pdE1vZHVsZUNoZWNrID8gbW9kdWxlTmFtZSA6IG51bGw7CisJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQlpZighb2sgJiYgIWV4YWN0T25seSl7CisJCQlzeW1zLnBvcCgpOworCQkJd2hpbGUoc3ltcy5sZW5ndGgpeworCQkJCXJlbHBhdGggPSBzeW1zLmpvaW4oJy8nKSArICcuanMnOworCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCQlzeW1zLnBvcCgpOworCQkJCXJlbHBhdGggPSBzeW1zLmpvaW4oJy8nKSArICcvJyt0aGlzLnBrZ0ZpbGVOYW1lKycuanMnOworCQkJCWlmKHN0YXJ0ZWRSZWxhdGl2ZSAmJiByZWxwYXRoLmNoYXJBdCgwKT09Ii8iKXsKKwkJCQkJcmVscGF0aCA9IHJlbHBhdGguc2xpY2UoMSk7CisJCQkJfQorCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCX0KKwkJfQorCisJCWlmKCFvayAmJiAhb21pdE1vZHVsZUNoZWNrKXsKKwkJCWRvam8ucmFpc2UoIkNvdWxkIG5vdCBsb2FkICciICsgbW9kdWxlTmFtZSArICInOyBsYXN0IHRyaWVkICciICsgcmVscGF0aCArICInIik7CisJCX0KKwl9CisKKwkvLyBjaGVjayB0aGF0IHRoZSBzeW1ib2wgd2FzIGRlZmluZWQKKwkvL0Rvbid0IGJvdGhlciBpZiB3ZSdyZSBkb2luZyB4ZG9tYWluIChhc3luY2hyb25vdXMpIGxvYWRpbmcuCisJaWYoIW9taXRNb2R1bGVDaGVjayAmJiAhdGhpc1siaXNYRG9tYWluIl0peworCQkvLyBwYXNzIGluIGZhbHNlIHNvIHdlIGNhbiBnaXZlIGJldHRlciBlcnJvcgorCQltb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCQlpZighbW9kdWxlKXsKKwkJCWRvam8ucmFpc2UoInN5bWJvbCAnIiArIG1vZHVsZU5hbWUgKyAiJyBpcyBub3QgZGVmaW5lZCBhZnRlciBsb2FkaW5nICciICsgcmVscGF0aCArICInIik7IAorCQl9CisJfQorCisJcmV0dXJuIG1vZHVsZTsKK30KKworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9wYWNrYWdlTmFtZSl7CisvLyBzdW1tYXJ5OgorLy8JQ3JlYXRlcyBhIEphdmFTY3JpcHQgcGFja2FnZQorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8Jc3RhcnRQYWNrYWdlKCJBLkIiKSBmb2xsb3dzIHRoZSBwYXRoLCBhbmQgYXQgZWFjaCBsZXZlbCBjcmVhdGVzIGEgbmV3IGVtcHR5CisvLwlvYmplY3Qgb3IgdXNlcyB3aGF0IGFscmVhZHkgZXhpc3RzLiBJdCByZXR1cm5zIHRoZSByZXN1bHQuCisvLworLy8gcGFja2FnZU5hbWU6IHRoZSBwYWNrYWdlIHRvIGJlIGNyZWF0ZWQgYXMgYSBTdHJpbmcgaW4gZG90IG5vdGF0aW9uCisKKwkvL01ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyaW5nLgorCXZhciBmdWxsUGtnTmFtZSA9IFN0cmluZyhwYWNrYWdlTmFtZSk7CisJdmFyIHN0cmlwcGVkUGtnTmFtZSA9IGZ1bGxQa2dOYW1lOworCisJdmFyIHN5bXMgPSBwYWNrYWdlTmFtZS5zcGxpdCgvXC4vKTsKKwlpZihzeW1zW3N5bXMubGVuZ3RoLTFdPT0iKiIpeworCQlzeW1zLnBvcCgpOworCQlzdHJpcHBlZFBrZ05hbWUgPSBzeW1zLmpvaW4oIi4iKTsKKwl9CisJdmFyIGV2YWxlZFBrZyA9IGRvam8uZXZhbE9ialBhdGgoc3RyaXBwZWRQa2dOYW1lLCB0cnVlKTsKKwl0aGlzLmxvYWRlZF9tb2R1bGVzX1tmdWxsUGtnTmFtZV0gPSBldmFsZWRQa2c7CisJdGhpcy5sb2FkZWRfbW9kdWxlc19bc3RyaXBwZWRQa2dOYW1lXSA9IGV2YWxlZFBrZzsKKwkKKwlyZXR1cm4gZXZhbGVkUGtnOyAvLyBPYmplY3QKK30KKworZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUgPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypCb29sZWFuPyovbXVzdEV4aXN0KXsKKy8vIHN1bW1hcnk6CisvLwlSZXR1cm5zIHRoZSBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtb2R1bGUsIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGwuCisvLworLy8gbW9kdWxlTmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBtb2R1bGUgaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSwgbGlrZSAnQS5CJy4KKy8vIG11c3RFeGlzdCBPcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4gdGhyb3cgaW5zdGVhZCBvZiByZXR1cm5pbmcgbnVsbAorLy8JaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuCisKKwl2YXIgbG1uID0gU3RyaW5nKG1vZHVsZU5hbWUpOworCisJaWYodGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXSl7CisJCXJldHVybiB0aGlzLmxvYWRlZF9tb2R1bGVzX1tsbW5dOyAvLyBPYmplY3QKKwl9CisKKwlpZihtdXN0RXhpc3QpeworCQlkb2pvLnJhaXNlKCJubyBsb2FkZWQgbW9kdWxlIG5hbWVkICciICsgbW9kdWxlTmFtZSArICInIik7CisJfQorCXJldHVybiBudWxsOyAvLyBudWxsCit9CisKKy8vU3RhcnQgb2Ygb2xkIGJvb3RzdHJhcDI6CisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUgPSBmdW5jdGlvbigvKk9iamVjdCBjb250YWluaW5nIEFycmF5cyovbW9kTWFwKXsKKy8vIGRlc2NyaXB0aW9uOgorLy8JVGhpcyBtZXRob2QgdGFrcyBhICJtYXAiIG9mIGFycmF5cyB3aGljaCBvbmUgY2FuIHVzZSB0byBvcHRpb25hbGx5IGxvYWQgZG9qbworLy8JbW9kdWxlcy4gVGhlIG1hcCBpcyBpbmRleGVkIGJ5IHRoZSBwb3NzaWJsZSBkb2pvLmhvc3RlbnYubmFtZV8gdmFsdWVzLCB3aXRoCisvLwl0d28gYWRkaXRpb25hbCB2YWx1ZXM6ICJkZWZhdWx0IiBhbmQgImNvbW1vbiIuIFRoZSBpdGVtcyBpbiB0aGUgImRlZmF1bHQiCisvLwlhcnJheSB3aWxsIGJlIGxvYWRlZCBpZiBub25lIG9mIHRoZSBvdGhlciBpdGVtcyBoYXZlIGJlZW4gY2hvb3NlbiBiYXNlZCBvbgorLy8JdGhlIGhvc3RlbnYubmFtZV8gaXRlbS4gVGhlIGl0ZW1zIGluIHRoZSAiY29tbW9uIiBhcnJheSB3aWxsIF9hbHdheXNfIGJlCisvLwlsb2FkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGlzdCBpcyBjaG9zZW4uICBIZXJlJ3MgaG93IGl0J3Mgbm9ybWFsbHkKKy8vCWNhbGxlZDoKKy8vCQorLy8JZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisvLwkJYnJvd3NlcjogWworLy8JCQlbImZvby5iYXIuYmF6IiwgdHJ1ZSwgdHJ1ZV0sIC8vIGFuIGV4YW1wbGUgdGhhdCBwYXNzZXMgbXVsdGlwbGUgYXJncyB0byBsb2FkTW9kdWxlKCkKKy8vCQkJImZvby5zYW1wbGUuKiIsCisvLwkJCSJmb28udGVzdCwKKy8vCQldLAorLy8JCWRlZmF1bHQ6IFsgImZvby5zYW1wbGUuKiIgXSwKKy8vCQljb21tb246IFsgInJlYWxseS5pbXBvcnRhbnQubW9kdWxlLioiIF0KKy8vCX0pOworCisJdmFyIGNvbW1vbiA9IG1vZE1hcFsiY29tbW9uIl18fFtdOworCXZhciByZXN1bHQgPSBtb2RNYXBbZG9qby5ob3N0ZW52Lm5hbWVfXSA/IGNvbW1vbi5jb25jYXQobW9kTWFwW2Rvam8uaG9zdGVudi5uYW1lX118fFtdKSA6IGNvbW1vbi5jb25jYXQobW9kTWFwWyJkZWZhdWx0Il18fFtdKTsKKworCWZvcih2YXIgeD0wOyB4PHJlc3VsdC5sZW5ndGg7IHgrKyl7CisJCXZhciBjdXJyID0gcmVzdWx0W3hdOworCQlpZihjdXJyLmNvbnN0cnVjdG9yID09IEFycmF5KXsKKwkJCWRvam8uaG9zdGVudi5sb2FkTW9kdWxlLmFwcGx5KGRvam8uaG9zdGVudiwgY3Vycik7CisJCX1lbHNleworCQkJZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUoY3Vycik7CisJCX0KKwl9Cit9CisKK2Rvam8ucmVxdWlyZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gcmVzb3VyY2VOYW1lKXsKKwkvLyBzdW1tYXJ5CisJLy8JRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHJlc291cmNlIChpZSwgamF2YXNjcmlwdAorCS8vCXNvdXJjZSBmaWxlKSBoYXMgYmVlbiBsb2FkZWQuCisJLy8gZGVzY3JpcHRpb24KKwkvLwlkb2pvLnJlcXVpcmUoKSBpcyBzaW1pbGFyIHRvIEMncyAjaW5jbHVkZSBjb21tYW5kIG9yIGphdmEncyAiaW1wb3J0IiBjb21tYW5kLgorCS8vCVlvdSBjYWxsIGRvam8ucmVxdWlyZSgpIHRvIHB1bGwgaW4gdGhlIHJlc291cmNlcyAoaWUsIGphdmFzY3JpcHQgc291cmNlIGZpbGVzKQorCS8vCXRoYXQgZGVmaW5lIHRoZSBmdW5jdGlvbnMgeW91IGFyZSB1c2luZy4gCisJLy8KKwkvLwlOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYSBidWlsZCwgbWFueSByZXNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQKKwkvLwlpbnRvIGRvam8uanMgKGllLCBtYW55IG9mIHRoZSBqYXZhc2NyaXB0IHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gY29tcHJlc3NlZCBhbmQKKwkvLwljb25jYXRlbmVkIGludG8gZG9qby5qcyksIHNvIG1hbnkgZG9qby5yZXF1aXJlKCkgY2FsbHMgd2lsbCBzaW1wbHkgcmV0dXJuCisJLy8Jd2l0aG91dCBkb3dubG9hZGluZyBhbnl0aGluZy4KKwlkb2pvLmhvc3RlbnYubG9hZE1vZHVsZS5hcHBseShkb2pvLmhvc3RlbnYsIGFyZ3VtZW50cyk7Cit9CisKK2Rvam8ucmVxdWlyZUlmID0gZnVuY3Rpb24oLypCb29sZWFuKi8gY29uZGl0aW9uLCAvKlN0cmluZyovIHJlc291cmNlTmFtZSl7CisJLy8gc3VtbWFyeQorCS8vCUlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSB0aGVuIGNhbGwgZG9qby5yZXF1aXJlKCkgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKKwl2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTsKKwlpZigoYXJnMCA9PT0gdHJ1ZSl8fChhcmcwPT0iY29tbW9uIil8fChhcmcwICYmIGRvam8ucmVuZGVyW2FyZzBdLmNhcGFibGUpKXsKKwkJdmFyIGFyZ3MgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KKwkJZG9qby5yZXF1aXJlLmFwcGx5KGRvam8sIGFyZ3MpOworCX0KK30KKworZG9qby5yZXF1aXJlQWZ0ZXJJZiA9IGRvam8ucmVxdWlyZUlmOworCitkb2pvLnByb3ZpZGUgPSBmdW5jdGlvbigvKlN0cmluZyovIHJlc291cmNlTmFtZSl7CisJLy8gc3VtbWFyeQorCS8vCUVhY2ggamF2YXNjcmlwdCBzb3VyY2UgZmlsZSBtdXN0IGhhdmUgKGV4YWN0bHkpIG9uZSBkb2pvLnByb3ZpZGUoKQorCS8vCWNhbGwgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZSBuYW1lLgorCS8vCUZvciBleGFtcGxlLCBkb2pvL3NyYy9mb28uanMgbXVzdCBoYXZlIGRvam8ucHJvdmlkZSgiZG9qby5mb28iKTsgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KKwkvLworCS8vIGRlc2NyaXB0aW9uCisJLy8JRWFjaCBqYXZhc2NyaXB0IHNvdXJjZSBmaWxlIGlzIGNhbGxlZCBhIHJlc291cmNlLiAgV2hlbiBhIHJlc291cmNlCisJLy8JaXMgbG9hZGVkIGJ5IHRoZSBicm93c2VyLCBkb2pvLnByb3ZpZGUoKSByZWdpc3RlcnMgdGhhdCBpdCBoYXMKKwkvLwliZWVuIGxvYWRlZC4KKwkvLwkKKwkvLwlGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucywgaW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJpbmcgdGhlIHJlc291cmNlLAorCS8vCWRvam8ucHJvdmlkZSgpIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBqYXZhc2NyaXB0IG9iamVjdCBmb3IgdGhlIG1vZHVsZSBleGlzdHMuICBGb3IKKwkvLwlleGFtcGxlLCBkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5jb21tb24iKSwgaW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJpbmcgdGhhdCBjb21tb24uanMKKwkvLwlpcyBhIHJlc291cmNlIGZvciB0aGUgZG9qby5odG1sIG1vZHVsZSwgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZG9qby5odG1sIGphdmFzY3JpcHQgb2JqZWN0CisJLy8JZXhpc3RzLCBzbyB0aGF0IGNhbGxzIGxpa2UgZG9qby5odG1sLmZvbyA9IGZ1bmN0aW9uKCl7IC4uLiB9IGRvbid0IGZhaWwuCisJLy8KKwkvLwlJbiB0aGUgY2FzZSBvZiBhIGJ1aWxkIChvciBpbiB0aGUgZnV0dXJlLCBhIHJvbGx1cCksIHdoZXJlIG11bHRpcGxlIGphdmFzY3JpcHQgc291cmNlCisJLy8JZmlsZXMgYXJlIGNvbWJpbmVkIGludG8gb25lIGJpZ2dlciBmaWxlIChzaW1pbGFyIHRvIGEgLmxpYiBvciAuamFyIGZpbGUpLCB0aGF0IGZpbGUKKwkvLwl3aWxsIGNvbnRhaW4gbXVsdGlwbGUgZG9qby5wcm92aWRlKCkgY2FsbHMsIHRvIG5vdGUgdGhhdCBpdCBpbmNsdWRlcworCS8vCW11bHRpcGxlIHJlc291cmNlcy4KKwlyZXR1cm4gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZS5hcHBseShkb2pvLmhvc3RlbnYsIGFyZ3VtZW50cyk7Cit9CisKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypTdHJpbmcqL3ByZWZpeCl7CisJLy8gc3VtbWFyeTogbWFwcyBhIG1vZHVsZSBuYW1lIHRvIGEgcGF0aAorCS8vIGRlc2NyaXB0aW9uOiBBbiB1bnJlZ2lzdGVyZWQgbW9kdWxlIGlzIGdpdmVuIHRoZSBkZWZhdWx0IHBhdGggb2YgLi4vPG1vZHVsZT4sCisJLy8JcmVsYXRpdmUgdG8gRG9qbyByb290LiBGb3IgZXhhbXBsZSwgbW9kdWxlIGFjbWUgaXMgbWFwcGVkIHRvIC4uL2FjbWUuCisJLy8JSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1vZHVsZSBuYW1lLCB1c2UgZG9qby5yZWdpc3Rlck1vZHVsZVBhdGguIAorCXJldHVybiBkb2pvLmhvc3RlbnYuc2V0TW9kdWxlUHJlZml4KG1vZHVsZSwgcHJlZml4KTsKK30KKworaWYoZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworCWZvcih2YXIgcGFyYW0gaW4gZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworCQlkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChwYXJhbSwgZGpDb25maWdbIm1vZHVsZVBhdGhzIl1bcGFyYW1dKTsKKwl9Cit9CisKK2Rvam8uc2V0TW9kdWxlUHJlZml4ID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypTdHJpbmcqL3ByZWZpeCl7CisJLy8gc3VtbWFyeTogbWFwcyBhIG1vZHVsZSBuYW1lIHRvIGEgcGF0aAorCWRvam8uZGVwcmVjYXRlZCgnZG9qby5zZXRNb2R1bGVQcmVmaXgoIicgKyBtb2R1bGUgKyAnIiwgIicgKyBwcmVmaXggKyAnIiknLCAicmVwbGFjZWQgYnkgZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgiLCAiMC41Iik7CisJcmV0dXJuIGRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG1vZHVsZSwgcHJlZml4KTsKK30KKworZG9qby5leGlzdHMgPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKlN0cmluZyovbmFtZSl7CisJLy8gc3VtbWFyeTogZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBzdXBwb3J0cyBhIGdpdmVuIG1ldGhvZAorCS8vIGRlc2NyaXB0aW9uOiB1c2VmdWwgZm9yIGxvbmdlciBhcGkgY2hhaW5zIHdoZXJlIHlvdSBoYXZlIHRvIHRlc3QgZWFjaCBvYmplY3QgaW4gdGhlIGNoYWluCisJdmFyIHAgPSBuYW1lLnNwbGl0KCIuIik7CisJZm9yKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspeworCQlpZighb2JqW3BbaV1dKXsgcmV0dXJuIGZhbHNlOyB9IC8vIEJvb2xlYW4KKwkJb2JqID0gb2JqW3BbaV1dOworCX0KKwlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorfQorCisvLyBMb2NhbGl6YXRpb24gcm91dGluZXMKKworZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZSA9IGZ1bmN0aW9uKC8qU3RyaW5nPyovbG9jYWxlKXsKKy8vCXN1bW1hcnk6CisvLwkJUmV0dXJucyBjYW5vbmljYWwgZm9ybSBvZiBsb2NhbGUsIGFzIHVzZWQgYnkgRG9qby4gIEFsbCB2YXJpYW50cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJlIHNlcGFyYXRlZCBieSAnLScKKy8vCQlhcyBzcGVjaWZpZWQgaW4gUkZDIDMwNjYuIElmIG5vIGxvY2FsZSBpcyBzcGVjaWZpZWQsIHRoZSB1c2VyIGFnZW50J3MgZGVmYXVsdCBpcyByZXR1cm5lZC4KKworCXZhciByZXN1bHQgPSBsb2NhbGUgPyBsb2NhbGUudG9Mb3dlckNhc2UoKSA6IGRvam8ubG9jYWxlOworCWlmKHJlc3VsdCA9PSAicm9vdCIpeworCQlyZXN1bHQgPSAiUk9PVCI7CisJfQorCXJldHVybiByZXN1bHQ7Ly8gU3RyaW5nCit9OworCitkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9sb2NhbGUsIC8qQm9vbGVhbiovZG93biwgLypGdW5jdGlvbiovc2VhcmNoRnVuYyl7CisvLwlzdW1tYXJ5OgorLy8JCUEgaGVscGVyIG1ldGhvZCB0byBhc3Npc3QgaW4gc2VhcmNoaW5nIGZvciBsb2NhbGUtYmFzZWQgcmVzb3VyY2VzLiAgV2lsbCBpdGVyYXRlIHRocm91Z2gKKy8vCQl0aGUgdmFyaWFudHMgb2YgYSBwYXJ0aWN1bGFyIGxvY2FsZSwgZWl0aGVyIHVwIG9yIGRvd24sIGV4ZWN1dGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8JCUZvciBleGFtcGxlLCAiZW4tdXMiIGFuZCB0cnVlIHdpbGwgdHJ5ICJlbi11cyIgZm9sbG93ZWQgYnkgImVuIiBhbmQgZmluYWxseSAiUk9PVCIuCisKKwlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisKKwl2YXIgZWxlbWVudHMgPSBsb2NhbGUuc3BsaXQoJy0nKTsKKwl2YXIgc2VhcmNobGlzdCA9IFtdOworCWZvcih2YXIgaSA9IGVsZW1lbnRzLmxlbmd0aDsgaSA+IDA7IGktLSl7CisJCXNlYXJjaGxpc3QucHVzaChlbGVtZW50cy5zbGljZSgwLCBpKS5qb2luKCctJykpOworCX0KKwlzZWFyY2hsaXN0LnB1c2goZmFsc2UpOworCWlmKGRvd24pe3NlYXJjaGxpc3QucmV2ZXJzZSgpO30KKworCWZvcih2YXIgaiA9IHNlYXJjaGxpc3QubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0peworCQl2YXIgbG9jID0gc2VhcmNobGlzdFtqXSB8fCAiUk9PVCI7CisJCXZhciBzdG9wID0gc2VhcmNoRnVuYyhsb2MpOworCQlpZihzdG9wKXsgYnJlYWs7IH0KKwl9Cit9CisKKy8vVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgcGxhY2VkIG91dHNpZGUgb2YgcHJlbG9hZExvY2FsaXphdGlvbnMKKy8vU28gdGhhdCB0aGUgeGQgbG9hZGluZyBjYW4gdXNlL292ZXJyaWRlIHRoZW0uCitkb2pvLmhvc3RlbnYubG9jYWxlc0dlbmVyYXRlZCAvKioqQlVJTEQ6bG9jYWxlc0dlbmVyYXRlZCoqKi87IC8vIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZSBhdCBidWlsZCB0aW1lLCBpZiBuZWNlc3NhcnkKKworZG9qby5ob3N0ZW52LnJlZ2lzdGVyTmxzUHJlZml4ID0gZnVuY3Rpb24oKXsKKy8vIHN1bW1hcnk6CisvLwlSZWdpc3RlciBtb2R1bGUgIm5scyIgdG8gcG9pbnQgd2hlcmUgRG9qbyBjYW4gZmluZCBwcmUtYnVpbHQgbG9jYWxpemF0aW9uIGZpbGVzCisJZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgoIm5scyIsIm5scyIpOwkKK30KKworZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zID0gZnVuY3Rpb24oKXsKKy8vIHN1bW1hcnk6CisvLwlMb2FkIGJ1aWx0LCBmbGF0dGVuZWQgcmVzb3VyY2UgYnVuZGxlcywgaWYgYXZhaWxhYmxlIGZvciBhbGwgbG9jYWxlcyB1c2VkIGluIHRoZSBwYWdlLgorLy8JRXhlY3V0ZSBvbmx5IG9uY2UuICBOb3RlIHRoYXQgdGhpcyBpcyBhIG5vLW9wIHVubGVzcyB0aGVyZSBpcyBhIGJ1aWxkLgorCisJaWYoZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQpeworCQlkb2pvLmhvc3RlbnYucmVnaXN0ZXJObHNQcmVmaXgoKTsKKworCQlmdW5jdGlvbiBwcmVsb2FkKGxvY2FsZSl7CisJCQlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJCQlkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aChsb2NhbGUsIHRydWUsIGZ1bmN0aW9uKGxvYyl7CisJCQkJZm9yKHZhciBpPTA7IGk8ZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQubGVuZ3RoO2krKyl7CisJCQkJCWlmKGRvam8uaG9zdGVudi5sb2NhbGVzR2VuZXJhdGVkW2ldID09IGxvYyl7CisJCQkJCQlkb2pvWyJyZXF1aXJlIl0oIm5scy5kb2pvXyIrbG9jKTsKKwkJCQkJCXJldHVybiB0cnVlOyAvLyBCb29sZWFuCisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOyAvLyBCb29sZWFuCisJCQl9KTsKKwkJfQorCQlwcmVsb2FkKCk7CisJCXZhciBleHRyYSA9IGRqQ29uZmlnLmV4dHJhTG9jYWxlfHxbXTsKKwkJZm9yKHZhciBpPTA7IGk8ZXh0cmEubGVuZ3RoOyBpKyspeworCQkJcHJlbG9hZChleHRyYVtpXSk7CisJCX0KKwl9CisJZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zID0gZnVuY3Rpb24oKXt9OworfQorCitkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb24gPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypTdHJpbmcqL2J1bmRsZU5hbWUsIC8qU3RyaW5nPyovbG9jYWxlLCAvKlN0cmluZz8qL2F2YWlsYWJsZUZsYXRMb2NhbGVzKXsKKy8vIHN1bW1hcnk6CisvLwlEZWNsYXJlcyB0cmFuc2xhdGVkIHJlc291cmNlcyBhbmQgbG9hZHMgdGhlbSBpZiBuZWNlc3NhcnksIGluIHRoZSBzYW1lIHN0eWxlIGFzIGRvam8ucmVxdWlyZS4KKy8vCUNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgYXJlIHR5cGljYWxseSBzdHJpbmdzLCBidXQgbWF5IGJlIGFueSBuYW1lL3ZhbHVlIHBhaXIsCisvLwlyZXByZXNlbnRlZCBpbiBKU09OIGZvcm1hdC4gIFNlZSBhbHNvIGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24uCisvLworLy8gbW9kdWxlTmFtZTogbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSAibmxzIiBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGJ1bmRsZSBpcyBmb3VuZAorLy8gYnVuZGxlTmFtZTogYnVuZGxlIG5hbWUsIGkuZS4gdGhlIGZpbGVuYW1lIHdpdGhvdXQgdGhlICcuanMnIHN1ZmZpeAorLy8gbG9jYWxlOiB0aGUgbG9jYWxlIHRvIGxvYWQgKG9wdGlvbmFsKSAgQnkgZGVmYXVsdCwgdGhlIGJyb3dzZXIncyB1c2VyIGxvY2FsZSBhcyBkZWZpbmVkIGJ5IGRvam8ubG9jYWxlCisvLyBhdmFpbGFibGVGbGF0TG9jYWxlczogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgYXZhaWxhYmxlLCBmbGF0dGVuZWQgbG9jYWxlcyBmb3IgdGhpcyBidW5kbGUuCisvLyBUaGlzIGFyZ3VtZW50IHNob3VsZCBvbmx5IGJlIHNldCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCUxvYWQgdHJhbnNsYXRlZCByZXNvdXJjZSBidW5kbGVzIHByb3ZpZGVkIHVuZGVybmVhdGggdGhlICJubHMiIGRpcmVjdG9yeSB3aXRoaW4gYSBwYWNrYWdlLgorLy8JVHJhbnNsYXRlZCByZXNvdXJjZXMgbWF5IGJlIGxvY2F0ZWQgaW4gZGlmZmVyZW50IHBhY2thZ2VzIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgRm9yIGV4YW1wbGUsCisvLwlhIHBhcnRpY3VsYXIgd2lkZ2V0IG1heSBkZWZpbmUgb25lIG9yIG1vcmUgcmVzb3VyY2UgYnVuZGxlcywgc3RydWN0dXJlZCBpbiBhIHByb2dyYW0gYXMgZm9sbG93cywKKy8vCXdoZXJlIG1vZHVsZU5hbWUgaXMgbXljb2RlLm15d2lkZ2V0IGFuZCBidW5kbGVOYW1lcyBhdmFpbGFibGUgaW5jbHVkZSBidW5kbGVvbmUgYW5kIGJ1bmRsZXR3bzoKKy8vCS4uLgorLy8JbXljb2RlLworLy8JIG15d2lkZ2V0LworLy8JICBubHMvCisvLwkgICBidW5kbGVvbmUuanMgKHRoZSBmYWxsYmFjayB0cmFuc2xhdGlvbiwgRW5nbGlzaCBpbiB0aGlzIGV4YW1wbGUpCisvLwkgICBidW5kbGV0d28uanMgKGFsc28gYSBmYWxsYmFjayB0cmFuc2xhdGlvbikKKy8vCSAgIGRlLworLy8JICAgIGJ1bmRsZW9uZS5qcworLy8JICAgIGJ1bmRsZXR3by5qcworLy8JICAgZGUtYXQvCisvLwkgICAgYnVuZGxlb25lLmpzCisvLwkgICBlbi8KKy8vCSAgICAoZW1wdHk7IHVzZSB0aGUgZmFsbGJhY2sgdHJhbnNsYXRpb24pCisvLwkgICBlbi11cy8KKy8vCSAgICBidW5kbGVvbmUuanMKKy8vCSAgIGVuLWdiLworLy8JICAgIGJ1bmRsZW9uZS5qcworLy8JICAgZXMvCisvLwkgICAgYnVuZGxlb25lLmpzCisvLwkgICAgYnVuZGxldHdvLmpzCisvLwkgIC4uLmV0YworLy8JLi4uCisvLwlFYWNoIGRpcmVjdG9yeSBpcyBuYW1lZCBmb3IgYSBsb2NhbGUgYXMgc3BlY2lmaWVkIGJ5IFJGQyAzMDY2LCAoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzA2Ni50eHQpLAorLy8Jbm9ybWFsaXplZCBpbiBsb3dlcmNhc2UuICBOb3RlIHRoYXQgdGhlIHR3byBidW5kbGVzIGluIHRoZSBleGFtcGxlIGRvIG5vdCBkZWZpbmUgYWxsIHRoZSBzYW1lIHZhcmlhbnRzLgorLy8JRm9yIGEgZ2l2ZW4gbG9jYWxlLCBidW5kbGVzIHdpbGwgYmUgbG9hZGVkIGZvciB0aGF0IGxvY2FsZSBhbmQgYWxsIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGFib3ZlIGl0LCBpbmNsdWRpbmcKKy8vCWEgZmFsbGJhY2sgYXQgdGhlIHJvb3QgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIGEgZGVjbGFyYXRpb24gZm9yIHRoZSAiZGUtYXQiIGxvY2FsZSB3aWxsIGZpcnN0CisvLwlsb2FkIG5scy9kZS1hdC9idW5kbGVvbmUuanMsIHRoZW4gbmxzL2RlL2J1bmRsZW9uZS5qcyBhbmQgZmluYWxseSBubHMvYnVuZGxlb25lLmpzLiAgVGhlIGRhdGEgd2lsbAorLy8JYmUgZmxhdHRlbmVkIGludG8gYSBzaW5nbGUgT2JqZWN0IHNvIHRoYXQgbG9va3VwcyB3aWxsIGZvbGxvdyB0aGlzIGNhc2NhZGluZyBwYXR0ZXJuLiAgQW4gb3B0aW9uYWwgYnVpbGQKKy8vCXN0ZXAgY2FuIHByZWxvYWQgdGhlIGJ1bmRsZXMgdG8gYXZvaWQgZGF0YSByZWR1bmRhbmN5IGFuZCB0aGUgbXVsdGlwbGUgbmV0d29yayBoaXRzIG5vcm1hbGx5IHJlcXVpcmVkIHRvCisvLwlsb2FkIHRoZXNlIHJlc291cmNlcy4KKworCWRvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworCXZhciB0YXJnZXRMb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisgCXZhciBidW5kbGVQYWNrYWdlID0gW21vZHVsZU5hbWUsICJubHMiLCBidW5kbGVOYW1lXS5qb2luKCIuIik7CisvL05PVEU6IFdoZW4gbG9hZGluZyB0aGVzZSByZXNvdXJjZXMsIHRoZSBwYWNrYWdpbmcgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBvbiBkaXNrLiAgVGhpcyBpcyBhbgorLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBhcyB0aGlzIGlzIGp1c3QgYSBwcml2YXRlIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGxvYWRlZCByZXNvdXJjZXMuCisvLyBlLmcuIHRlc3RzL2hlbGxvL25scy9lbi11cy9zYWx1dGF0aW9ucy5qcyBpcyBsb2FkZWQgYXMgdGhlIG9iamVjdCB0ZXN0cy5oZWxsby5ubHMuc2FsdXRhdGlvbnMuZW5fdXM9ey4uLn0KKy8vIFRoZSBzdHJ1Y3R1cmUgb24gZGlzayBpcyBpbnRlbmRlZCB0byBiZSBtb3N0IGNvbnZlbmllbnQgZm9yIGRldmVsb3BlcnMgYW5kIHRyYW5zbGF0b3JzLCBidXQgaW4gbWVtb3J5CisvLyBpdCBpcyBtb3JlIGxvZ2ljYWwgYW5kIGVmZmljaWVudCB0byBzdG9yZSBpbiBhIGRpZmZlcmVudCBvcmRlci4gIExvY2FsZXMgY2Fubm90IHVzZSBkYXNoZXMsIHNpbmNlIHRoZQorLy8gcmVzdWx0aW5nIHBhdGggd2lsbCBub3QgZXZhbHVhdGUgYXMgdmFsaWQgSlMsIHNvIHdlIHRyYW5zbGF0ZSB0aGVtIHRvIHVuZGVyc2NvcmVzLgorCQorCS8vRmluZCB0aGUgYmVzdC1tYXRjaCBsb2NhbGUgdG8gbG9hZCBpZiB3ZSBoYXZlIGF2YWlsYWJsZSBmbGF0IGxvY2FsZXMuCisJdmFyIGJlc3RMb2NhbGUgPSAiIjsKKwlpZihhdmFpbGFibGVGbGF0TG9jYWxlcyl7CisJCXZhciBmbGF0TG9jYWxlcyA9IGF2YWlsYWJsZUZsYXRMb2NhbGVzLnNwbGl0KCIsIik7CisJCWZvcih2YXIgaSA9IDA7IGkgPCBmbGF0TG9jYWxlcy5sZW5ndGg7IGkrKyl7CisJCQkvL0xvY2FsZSBtdXN0IG1hdGNoIGZyb20gc3RhcnQgb2Ygc3RyaW5nLgorCQkJaWYodGFyZ2V0TG9jYWxlLmluZGV4T2YoZmxhdExvY2FsZXNbaV0pID09IDApeworCQkJCWlmKGZsYXRMb2NhbGVzW2ldLmxlbmd0aCA+IGJlc3RMb2NhbGUubGVuZ3RoKXsKKwkJCQkJYmVzdExvY2FsZSA9IGZsYXRMb2NhbGVzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZighYmVzdExvY2FsZSl7CisJCQliZXN0TG9jYWxlID0gIlJPT1QiOworCQl9CQkKKwl9CisKKwkvL1NlZSBpZiB0aGUgZGVzaXJlZCBsb2NhbGUgaXMgYWxyZWFkeSBsb2FkZWQuCisJdmFyIHRlbXBMb2NhbGUgPSBhdmFpbGFibGVGbGF0TG9jYWxlcyA/IGJlc3RMb2NhbGUgOiB0YXJnZXRMb2NhbGU7CisJdmFyIGJ1bmRsZSA9IGRvam8uaG9zdGVudi5maW5kTW9kdWxlKGJ1bmRsZVBhY2thZ2UpOworCXZhciBsb2NhbGl6ZWRCdW5kbGUgPSBudWxsOworCWlmKGJ1bmRsZSl7CisJCWlmKGRqQ29uZmlnLmxvY2FsaXphdGlvbkNvbXBsZXRlICYmIGJ1bmRsZS5fYnVpbHQpe3JldHVybjt9CisJCXZhciBqc0xvYyA9IHRlbXBMb2NhbGUucmVwbGFjZSgnLScsICdfJyk7CisJCXZhciB0cmFuc2xhdGlvblBhY2thZ2UgPSBidW5kbGVQYWNrYWdlKyIuIitqc0xvYzsKKwkJbG9jYWxpemVkQnVuZGxlID0gZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUodHJhbnNsYXRpb25QYWNrYWdlKTsKKwl9CisKKwlpZighbG9jYWxpemVkQnVuZGxlKXsKKwkJYnVuZGxlID0gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShidW5kbGVQYWNrYWdlKTsKKwkJdmFyIHN5bXMgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGVOYW1lKTsKKwkJdmFyIG1vZHBhdGggPSBzeW1zLmNvbmNhdCgibmxzIikuam9pbigiLyIpOworCQl2YXIgcGFyZW50OworCisJCWRvam8uaG9zdGVudi5zZWFyY2hMb2NhbGVQYXRoKHRlbXBMb2NhbGUsIGF2YWlsYWJsZUZsYXRMb2NhbGVzLCBmdW5jdGlvbihsb2MpeworCQkJdmFyIGpzTG9jID0gbG9jLnJlcGxhY2UoJy0nLCAnXycpOworCQkJdmFyIHRyYW5zbGF0aW9uUGFja2FnZSA9IGJ1bmRsZVBhY2thZ2UgKyAiLiIgKyBqc0xvYzsKKwkJCXZhciBsb2FkZWQgPSBmYWxzZTsKKwkJCWlmKCFkb2pvLmhvc3RlbnYuZmluZE1vZHVsZSh0cmFuc2xhdGlvblBhY2thZ2UpKXsKKwkJCQkvLyBNYXJrIGxvYWRlZCB3aGV0aGVyIGl0J3MgZm91bmQgb3Igbm90LCBzbyB0aGF0IGZ1cnRoZXIgbG9hZCBhdHRlbXB0cyB3aWxsIG5vdCBiZSBtYWRlCisJCQkJZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSh0cmFuc2xhdGlvblBhY2thZ2UpOworCQkJCXZhciBtb2R1bGUgPSBbbW9kcGF0aF07CisJCQkJaWYobG9jICE9ICJST09UIil7bW9kdWxlLnB1c2gobG9jKTt9CisJCQkJbW9kdWxlLnB1c2goYnVuZGxlTmFtZSk7CisJCQkJdmFyIGZpbGVzcGVjID0gbW9kdWxlLmpvaW4oIi8iKSArICcuanMnOworCQkJCWxvYWRlZCA9IGRvam8uaG9zdGVudi5sb2FkUGF0aChmaWxlc3BlYywgbnVsbCwgZnVuY3Rpb24oaGFzaCl7CisJCQkJCS8vIFVzZSBzaW5nbGV0b24gd2l0aCBwcm90b3R5cGUgdG8gcG9pbnQgdG8gcGFyZW50IGJ1bmRsZSwgdGhlbiBtaXgtaW4gcmVzdWx0IGZyb20gbG9hZFBhdGgKKwkJCQkJdmFyIGNsYXp6ID0gZnVuY3Rpb24oKXt9OworCQkJCQljbGF6ei5wcm90b3R5cGUgPSBwYXJlbnQ7CisJCQkJCWJ1bmRsZVtqc0xvY10gPSBuZXcgY2xhenooKTsKKwkJCQkJZm9yKHZhciBqIGluIGhhc2gpeyBidW5kbGVbanNMb2NdW2pdID0gaGFzaFtqXTsgfQorCQkJCX0pOworCQkJfWVsc2V7CisJCQkJbG9hZGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWlmKGxvYWRlZCAmJiBidW5kbGVbanNMb2NdKXsKKwkJCQlwYXJlbnQgPSBidW5kbGVbanNMb2NdOworCQkJfWVsc2V7CisJCQkJYnVuZGxlW2pzTG9jXSA9IHBhcmVudDsKKwkJCX0KKwkJCQorCQkJaWYoYXZhaWxhYmxlRmxhdExvY2FsZXMpeworCQkJCS8vU3RvcCB0aGUgbG9jYWxlIHBhdGggc2VhcmNoaW5nIGlmIHdlIGtub3cgdGhlIGF2YWlsYWJsZUZsYXRMb2NhbGVzLCBzaW5jZQorCQkJCS8vdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgdGhlIG9ubHkgYnVuZGxlIHRoYXQgaXMgbmVlZGVkLgorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9KTsKKwl9CisKKwkvL1NhdmUgdGhlIGJlc3QgbG9jYWxlIGJ1bmRsZSBhcyB0aGUgdGFyZ2V0IGxvY2FsZSBidW5kbGUgd2hlbiB3ZSBrbm93IHRoZQorCS8vdGhlIGF2YWlsYWJsZSBidW5kbGVzLgorCWlmKGF2YWlsYWJsZUZsYXRMb2NhbGVzICYmIHRhcmdldExvY2FsZSAhPSBiZXN0TG9jYWxlKXsKKwkJYnVuZGxlW3RhcmdldExvY2FsZS5yZXBsYWNlKCctJywgJ18nKV0gPSBidW5kbGVbYmVzdExvY2FsZS5yZXBsYWNlKCctJywgJ18nKV07CisJfQorfTsKKworKGZ1bmN0aW9uKCl7CisJLy8gSWYgb3RoZXIgbG9jYWxlcyBhcmUgdXNlZCwgZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uIHNob3VsZCBsb2FkIHRoZW0gYXMgd2VsbCwgYnkgZGVmYXVsdC4KKwkvLyBPdmVycmlkZSBkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb24gdG8gZG8gbG9hZCB0aGUgZGVmYXVsdCBidW5kbGUsIHRoZW4gaXRlcmF0ZSB0aHJvdWdoIHRoZQorCS8vIGV4dHJhTG9jYWxlIGxpc3QgYW5kIGxvYWQgdGhvc2UgdHJhbnNsYXRpb25zIGFzIHdlbGwsIHVubGVzcyBhIHBhcnRpY3VsYXIgbG9jYWxlIHdhcyByZXF1ZXN0ZWQuCisKKwl2YXIgZXh0cmEgPSBkakNvbmZpZy5leHRyYUxvY2FsZTsKKwlpZihleHRyYSl7CisJCWlmKCFleHRyYSBpbnN0YW5jZW9mIEFycmF5KXsKKwkJCWV4dHJhID0gW2V4dHJhXTsKKwkJfQorCisJCXZhciByZXEgPSBkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb247CisJCWRvam8ucmVxdWlyZUxvY2FsaXphdGlvbiA9IGZ1bmN0aW9uKG0sIGIsIGxvY2FsZSwgYXZhaWxhYmxlRmxhdExvY2FsZXMpeworCQkJcmVxKG0sYixsb2NhbGUsIGF2YWlsYWJsZUZsYXRMb2NhbGVzKTsKKwkJCWlmKGxvY2FsZSl7cmV0dXJuO30KKwkJCWZvcih2YXIgaT0wOyBpPGV4dHJhLmxlbmd0aDsgaSsrKXsKKwkJCQlyZXEobSxiLGV4dHJhW2ldLCBhdmFpbGFibGVGbGF0TG9jYWxlcyk7CisJCQl9CisJCX07CisJfQorfSkoKTsKKworfTsKKworaWYodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyl7CisKKwkvLyBhdHRlbXB0IHRvIGZpZ3VyZSBvdXQgdGhlIHBhdGggdG8gZG9qbyBpZiBpdCBpc24ndCBzZXQgaW4gdGhlIGNvbmZpZworCShmdW5jdGlvbigpeworCQkvLyBiZWZvcmUgd2UgZ2V0IGFueSBmdXJ0aGVyIHdpdGggdGhlIGNvbmZpZyBvcHRpb25zLCB0cnkgdG8gcGljayB0aGVtIG91dAorCQkvLyBvZiB0aGUgVVJMLiBNb3N0IG9mIHRoaXMgY29kZSBpcyBmcm9tIE5XCisJCWlmKGRqQ29uZmlnLmFsbG93UXVlcnlDb25maWcpeworCQkJdmFyIGJhc2VVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpOyAvLyBGSVhNRTogdXNlIGxvY2F0aW9uLnF1ZXJ5IGluc3RlYWQ/CisJCQl2YXIgcGFyYW1zID0gYmFzZVVybC5zcGxpdCgiPyIsIDIpOworCQkJaWYocGFyYW1zLmxlbmd0aCA+IDEpeworCQkJCXZhciBwYXJhbVN0ciA9IHBhcmFtc1sxXTsKKwkJCQl2YXIgcGFpcnMgPSBwYXJhbVN0ci5zcGxpdCgiJiIpOworCQkJCWZvcih2YXIgeCBpbiBwYWlycyl7CisJCQkJCXZhciBzcCA9IHBhaXJzW3hdLnNwbGl0KCI9Iik7CisJCQkJCS8vIEZJWE1FOiBpcyB0aGlzIGV2YWwgZGFuZ2Vyb3VzPworCQkJCQlpZigoc3BbMF0ubGVuZ3RoID4gOSkmJihzcFswXS5zdWJzdHIoMCwgOSkgPT0gImRqQ29uZmlnLiIpKXsKKwkJCQkJCXZhciBvcHQgPSBzcFswXS5zdWJzdHIoOSk7CisJCQkJCQl0cnl7CisJCQkJCQkJZGpDb25maWdbb3B0XT1ldmFsKHNwWzFdKTsKKwkJCQkJCX1jYXRjaChlKXsKKwkJCQkJCQlkakNvbmZpZ1tvcHRdPXNwWzFdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoCisJCQkoKGRqQ29uZmlnWyJiYXNlU2NyaXB0VXJpIl0gPT0gIiIpfHwoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXSA9PSAiIikpICYmIAorCQkJKGRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKQorCQkpeworCQkJdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CisJCQl2YXIgcmVQa2cgPSAvKF9fcGFja2FnZV9ffGRvam98Ym9vdHN0cmFwMSlcLmpzKFtcP1wuXXwkKS9pOworCQkJZm9yKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YXIgc3JjID0gc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoInNyYyIpOworCQkJCWlmKCFzcmMpIHsgY29udGludWU7IH0KKwkJCQl2YXIgbSA9IHNyYy5tYXRjaChyZVBrZyk7CisJCQkJaWYobSkgeworCQkJCQl2YXIgcm9vdCA9IHNyYy5zdWJzdHJpbmcoMCwgbS5pbmRleCk7CisJCQkJCWlmKHNyYy5pbmRleE9mKCJib290c3RyYXAxIikgPiAtMSkgeyByb290ICs9ICIuLi8iOyB9CisJCQkJCWlmKCF0aGlzWyJkakNvbmZpZyJdKSB7IGRqQ29uZmlnID0ge307IH0KKwkJCQkJaWYoZGpDb25maWdbImJhc2VTY3JpcHRVcmkiXSA9PSAiIikgeyBkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdID0gcm9vdDsgfQorCQkJCQlpZihkakNvbmZpZ1siYmFzZVJlbGF0aXZlUGF0aCJdID09ICIiKSB7IGRqQ29uZmlnWyJiYXNlUmVsYXRpdmVQYXRoIl0gPSByb290OyB9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIGZpbGwgaW4gdGhlIHJlbmRlcmluZyBzdXBwb3J0IGluZm9ybWF0aW9uIGluIGRvam8ucmVuZGVyLioKKwkJdmFyIGRyID0gZG9qby5yZW5kZXI7CisJCXZhciBkcmggPSBkb2pvLnJlbmRlci5odG1sOworCQl2YXIgZHJzID0gZG9qby5yZW5kZXIuc3ZnOworCQl2YXIgZHVhID0gKGRyaC5VQSA9IG5hdmlnYXRvci51c2VyQWdlbnQpOworCQl2YXIgZGF2ID0gKGRyaC5BViA9IG5hdmlnYXRvci5hcHBWZXJzaW9uKTsKKwkJdmFyIHQgPSB0cnVlOworCQl2YXIgZiA9IGZhbHNlOworCQlkcmguY2FwYWJsZSA9IHQ7CisJCWRyaC5zdXBwb3J0LmJ1aWx0aW4gPSB0OworCisJCWRyLnZlciA9IHBhcnNlRmxvYXQoZHJoLkFWKTsKKwkJZHIub3MubWFjID0gZGF2LmluZGV4T2YoIk1hY2ludG9zaCIpID49IDA7CisJCWRyLm9zLndpbiA9IGRhdi5pbmRleE9mKCJXaW5kb3dzIikgPj0gMDsKKwkJLy8gY291bGQgYWxzbyBiZSBTb2xhcmlzIG9yIHNvbWV0aGluZywgYnV0IGl0J3MgdGhlIHNhbWUgYnJvd3NlcgorCQlkci5vcy5saW51eCA9IGRhdi5pbmRleE9mKCJYMTEiKSA+PSAwOworCisJCWRyaC5vcGVyYSA9IGR1YS5pbmRleE9mKCJPcGVyYSIpID49IDA7CisJCWRyaC5raHRtbCA9IChkYXYuaW5kZXhPZigiS29ucXVlcm9yIikgPj0gMCl8fChkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMCk7CisJCWRyaC5zYWZhcmkgPSBkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMDsKKwkJdmFyIGdlY2tvUG9zID0gZHVhLmluZGV4T2YoIkdlY2tvIik7CisJCWRyaC5tb3ppbGxhID0gZHJoLm1veiA9IChnZWNrb1BvcyA+PSAwKSYmKCFkcmgua2h0bWwpOworCQlpZiAoZHJoLm1vemlsbGEpIHsKKwkJCS8vIGdlY2tvIHZlcnNpb24gaXMgWVlZWU1NREQKKwkJCWRyaC5nZWNrb1ZlcnNpb24gPSBkdWEuc3Vic3RyaW5nKGdlY2tvUG9zICsgNiwgZ2Vja29Qb3MgKyAxNCk7CisJCX0KKwkJZHJoLmllID0gKGRvY3VtZW50LmFsbCkmJighZHJoLm9wZXJhKTsKKwkJZHJoLmllNTAgPSBkcmguaWUgJiYgZGF2LmluZGV4T2YoIk1TSUUgNS4wIik+PTA7CisJCWRyaC5pZTU1ID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDUuNSIpPj0wOworCQlkcmguaWU2MCA9IGRyaC5pZSAmJiBkYXYuaW5kZXhPZigiTVNJRSA2LjAiKT49MDsKKwkJZHJoLmllNzAgPSBkcmguaWUgJiYgZGF2LmluZGV4T2YoIk1TSUUgNy4wIik+PTA7CisKKwkJdmFyIGNtID0gZG9jdW1lbnRbImNvbXBhdE1vZGUiXTsKKwkJZHJoLnF1aXJrcyA9IChjbSA9PSAiQmFja0NvbXBhdCIpfHwoY20gPT0gIlF1aXJrc01vZGUiKXx8ZHJoLmllNTV8fGRyaC5pZTUwOworCisJCS8vIFRPRE86IGlzIHRoZSBIVE1MIExBTkcgYXR0cmlidXRlIHJlbGV2YW50PworCQlkb2pvLmxvY2FsZSA9IGRvam8ubG9jYWxlIHx8IChkcmguaWUgPyBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIDogbmF2aWdhdG9yLmxhbmd1YWdlKS50b0xvd2VyQ2FzZSgpOworCisJCWRyLnZtbC5jYXBhYmxlPWRyaC5pZTsKKwkJZHJzLmNhcGFibGUgPSBmOworCQlkcnMuc3VwcG9ydC5wbHVnaW4gPSBmOworCQlkcnMuc3VwcG9ydC5idWlsdGluID0gZjsKKwkJdmFyIHRkb2MgPSB3aW5kb3dbImRvY3VtZW50Il07CisJCXZhciB0ZGkgPSB0ZG9jWyJpbXBsZW1lbnRhdGlvbiJdOworCisJCWlmKCh0ZGkpJiYodGRpWyJoYXNGZWF0dXJlIl0pJiYodGRpLmhhc0ZlYXR1cmUoIm9yZy53M2MuZG9tLnN2ZyIsICIxLjAiKSkpeworCQkJZHJzLmNhcGFibGUgPSB0OworCQkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IHQ7CisJCQlkcnMuc3VwcG9ydC5wbHVnaW4gPSBmOworCQl9CisJCS8vIHdlYmtpdHMgYWZ0ZXIgNDIwIHN1cHBvcnQgU1ZHIG5hdGl2ZWx5LiBUaGUgdGVzdCBzdHJpbmcgaXMgIkFwcGxlV2ViS2l0LzQyMCsiCisJCWlmKGRyaC5zYWZhcmkpeworCQkJdmFyIHRtcCA9IGR1YS5zcGxpdCgiQXBwbGVXZWJLaXQvIilbMV07CisJCQl2YXIgdmVyID0gcGFyc2VGbG9hdCh0bXAuc3BsaXQoIiAiKVswXSk7CisJCQlpZih2ZXIgPj0gNDIwKXsKKwkJCQlkcnMuY2FwYWJsZSA9IHQ7CisJCQkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IHQ7CisJCQkJZHJzLnN1cHBvcnQucGx1Z2luID0gZjsKKwkJCX0KKwkJfWVsc2V7CisJCX0KKwl9KSgpOworCisJZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSgiZG9qby5ob3N0ZW52Iik7CisKKwlkb2pvLnJlbmRlci5uYW1lID0gZG9qby5ob3N0ZW52Lm5hbWVfID0gJ2Jyb3dzZXInOworCWRvam8uaG9zdGVudi5zZWFyY2hJZHMgPSBbXTsKKworCS8vIFRoZXNlIGFyZSBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIGxpa2VsaWhvb2Q7IHRoaXMgd2lsbCBjaGFuZ2UgaW4gdGltZS4KKwlkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEUyA9IFsnTXN4bWwyLlhNTEhUVFAnLCAnTWljcm9zb2Z0LlhNTEhUVFAnLCAnTXN4bWwyLlhNTEhUVFAuNC4wJ107CisKKwlkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGRvZXMgdGhlIHdvcmsgb2YgcG9ydGFibHkgZ2VuZXJhdGluZyBhIG5ldyBYTUxIVFRQUmVxdWVzdCBvYmplY3QuCisJCXZhciBodHRwID0gbnVsbDsKKwkJdmFyIGxhc3RfZSA9IG51bGw7CisJCXRyeXsgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9Y2F0Y2goZSl7fQorCQlpZighaHR0cCl7CisJCQlmb3IodmFyIGk9MDsgaTwzOyArK2kpeworCQkJCXZhciBwcm9naWQgPSBkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEU1tpXTsKKwkJCQl0cnl7CisJCQkJCWh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChwcm9naWQpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJbGFzdF9lID0gZTsKKwkJCQl9CisKKwkJCQlpZihodHRwKXsKKwkJCQkJZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFMgPSBbcHJvZ2lkXTsgIC8vIHNvIGZhc3RlciBuZXh0IHRpbWUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKmlmKGh0dHAgJiYgIWh0dHAudG9TdHJpbmcpIHsKKwkJCQlodHRwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7ICJbb2JqZWN0IFhNTEh0dHBSZXF1ZXN0XSI7IH0KKwkJCX0qLworCQl9CisKKwkJaWYoIWh0dHApeworCQkJcmV0dXJuIGRvam8ucmFpc2UoIlhNTEhUVFAgbm90IGF2YWlsYWJsZSIsIGxhc3RfZSk7CisJCX0KKworCQlyZXR1cm4gaHR0cDsgLy8gWE1MSFRUUFJlcXVlc3QgaW5zdGFuY2UKKwl9CisKKwlkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgPSBmYWxzZTsKKwlkb2pvLmhvc3RlbnYuZ2V0VGV4dCA9IGZ1bmN0aW9uKHVyaSwgYXN5bmNfY2IsIGZhaWxfb2speworCQkvLyBzdW1tYXJ5OiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHVyaSBhbmQgcmV0dXJuIHRob3NlIGNvbnRlbnRzLgorCQkvLyB1cmk6CisJCS8vCQlBIHJlbGF0aXZlIG9yIGFic29sdXRlIHVyaS4gSWYgYWJzb2x1dGUsIGl0IHN0aWxsIG11c3QgYmUgaW4KKwkJLy8JCXRoZSBzYW1lICJkb21haW4iIGFzIHdlIGFyZS4KKwkJLy8gYXN5bmNfY2I6CisJCS8vCQlJZiBub3Qgc3BlY2lmaWVkLCBsb2FkIHN5bmNocm9ub3VzbHkuIElmIHNwZWNpZmllZCwgbG9hZAorCQkvLwkJYXN5bmNocm9ub3VzbHksIGFuZCB1c2UgYXN5bmNfY2IgYXMgdGhlIHByb2dyZXNzIGhhbmRsZXIgd2hpY2gKKwkJLy8JCXRha2VzIHRoZSB4bWxodHRwIG9iamVjdCBhcyBpdHMgYXJndW1lbnQuIElmIGFzeW5jX2NiLCB0aGlzCisJCS8vCQlmdW5jdGlvbiByZXR1cm5zIG51bGwuCisJCS8vIGZhaWxfb2s6CisJCS8vCQlEZWZhdWx0IGZhbHNlLiBJZiBmYWlsX29rIGFuZCAhYXN5bmNfY2IgYW5kIGxvYWRpbmcgZmFpbHMsCisJCS8vCQlyZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nLgorCisJCS8vIG5lZWQgdG8gYmxvY2sgYXN5bmMgY2FsbGJhY2tzIGZyb20gc25hdGNoaW5nIHRoaXMgdGhyZWFkIGFzIHRoZSByZXN1bHQKKwkJLy8gb2YgYW4gYXN5bmMgY2FsbGJhY2sgbWlnaHQgY2FsbCBhbm90aGVyIHN5bmMgWEhSLCB0aGlzIGhhbmdzIGtodG1sIGZvcmV2ZXIKKwkJLy8gaG9zdGVudi5fYmxvY2tBc3luYyBtdXN0IGFsc28gYmUgY2hlY2tlZCBpbiBCcm93c2VySU8ncyB3YXRjaEluRmxpZ2h0KCkKKwkJLy8gTk9URTogbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUgc2NvcGUgc3dpdGNoZXMgaWUuIHRoaXMuZ2V0WG1saHR0cE9iamVjdCgpCisJCWlmKCFhc3luY19jYil7IHRoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOyB9CisKKwkJdmFyIGh0dHAgPSB0aGlzLmdldFhtbGh0dHBPYmplY3QoKTsKKworCQlmdW5jdGlvbiBpc0RvY3VtZW50T2soaHR0cCl7CisJCQl2YXIgc3RhdCA9IGh0dHBbInN0YXR1cyJdOworCQkJLy8gYWxsb3cgYSAzMDQgdXNlIGNhY2hlLCBuZWVkZWQgaW4ga29ucSAoaXMgdGhpcyBjb21wbGlhbnQgd2l0aCB0aGUgaHR0cCBzcGVjPykKKwkJCXJldHVybiBCb29sZWFuKCghc3RhdCl8fCgoMjAwIDw9IHN0YXQpJiYoMzAwID4gc3RhdCkpfHwoc3RhdD09MzA0KSk7CisJCX0KKworCQlpZihhc3luY19jYil7CisJCQl2YXIgX3RoaXMgPSB0aGlzLCB0aW1lciA9IG51bGwsIGdibCA9IGRvam8uZ2xvYmFsKCk7CisJCQl2YXIgeGhyID0gZG9qby5ldmFsT2JqUGF0aCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0Iik7CisJCQlodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CisJCQkJaWYodGltZXIpeyBnYmwuY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOyB9CisJCQkJaWYoX3RoaXMuX2Jsb2NrQXN5bmMgfHwgKHhociAmJiB4aHIuX2Jsb2NrQXN5bmMpKXsKKwkJCQkJdGltZXIgPSBnYmwuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGh0dHAub25yZWFkeXN0YXRlY2hhbmdlLmFwcGx5KHRoaXMpOyB9LCAxMCk7CisJCQkJfWVsc2V7CisJCQkJCWlmKDQ9PWh0dHAucmVhZHlTdGF0ZSl7CisJCQkJCQlpZihpc0RvY3VtZW50T2soaHR0cCkpeworCQkJCQkJCS8vIGRvam8uZGVidWcoIkxPQURFRCBVUkk6ICIrdXJpKTsKKwkJCQkJCQlhc3luY19jYihodHRwLnJlc3BvbnNlVGV4dCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlodHRwLm9wZW4oJ0dFVCcsIHVyaSwgYXN5bmNfY2IgPyB0cnVlIDogZmFsc2UpOworCQl0cnl7CisJCQlodHRwLnNlbmQobnVsbCk7CisJCQlpZihhc3luY19jYil7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZighaXNEb2N1bWVudE9rKGh0dHApKXsKKwkJCQl2YXIgZXJyID0gRXJyb3IoIlVuYWJsZSB0byBsb2FkICIrdXJpKyIgc3RhdHVzOiIrIGh0dHAuc3RhdHVzKTsKKwkJCQllcnIuc3RhdHVzID0gaHR0cC5zdGF0dXM7CisJCQkJZXJyLnJlc3BvbnNlVGV4dCA9IGh0dHAucmVzcG9uc2VUZXh0OworCQkJCXRocm93IGVycjsKKwkJCX0KKwkJfWNhdGNoKGUpeworCQkJdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQkJaWYoKGZhaWxfb2spJiYoIWFzeW5jX2NiKSl7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9ZWxzZXsKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9CisKKwkJdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQlyZXR1cm4gaHR0cC5yZXNwb25zZVRleHQ7IC8vIFN0cmluZworCX0KKworCWRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCA9ICdkb2pvRGVidWcnOworCWRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIgPSBbXTsKKwlkb2pvLmhvc3RlbnYuX3ByaW50bG5fc2FmZSA9IGZhbHNlOworCWRvam8uaG9zdGVudi5wcmludGxuID0gZnVuY3Rpb24oLypTdHJpbmcqL2xpbmUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcHJpbnRzIHRoZSBwcm92aWRlZCBsaW5lIHRvIHdoYXRldmVyIGxvZ2dpbmcgY29udGFpbmVyIGlzCisJCS8vCQlhdmFpbGFibGUuIElmIHRoZSBwYWdlIGlzbid0IGxvYWRlZCB5ZXQsIHRoZSBsaW5lIG1heSBiZSBhZGRlZAorCQkvLwkJdG8gYSBidWZmZXIgZm9yIHByaW50aW5nIGxhdGVyLgorCQlpZighZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmUpeworCQkJZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5wdXNoKGxpbmUpOworCQl9ZWxzZXsKKwkJCXRyeSB7CisJCQkJdmFyIGNvbnNvbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkakNvbmZpZy5kZWJ1Z0NvbnRhaW5lcklkID8KKwkJCQkJZGpDb25maWcuZGVidWdDb250YWluZXJJZCA6IGRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCk7CisJCQkJaWYoIWNvbnNvbGUpIHsgY29uc29sZSA9IGRvam8uYm9keSgpOyB9CisKKwkJCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTsKKwkJCQljb25zb2xlLmFwcGVuZENoaWxkKGRpdik7CisJCQl9IGNhdGNoIChlKSB7CisJCQkJdHJ5eworCQkJCQkvLyBzYWZhcmkgbmVlZHMgdGhlIG91dHB1dCB3cmFwcGVkIGluIGFuIGVsZW1lbnQgZm9yIHNvbWUgcmVhc29uCisJCQkJCWRvY3VtZW50LndyaXRlKCI8ZGl2PiIgKyBsaW5lICsgIjwvZGl2PiIpOworCQkJCX1jYXRjaChlMil7CisJCQkJCXdpbmRvdy5zdGF0dXMgPSBsaW5lOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCl7CisJCWRvam8uaG9zdGVudi5fcHJpbnRsbl9zYWZlID0gdHJ1ZTsKKwkJd2hpbGUoZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5sZW5ndGggPiAwKXsKKwkJCWRvam8uaG9zdGVudi5wcmludGxuKGRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIuc2hpZnQoKSk7CisJCX0KKwl9KTsKKworCWZ1bmN0aW9uIGRqX2FkZE5vZGVFdnRIZGxyKC8qRG9tTm9kZSovbm9kZSwgLypTdHJpbmcqL2V2dE5hbWUsIC8qRnVuY3Rpb24qL2ZwKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCW5vbi1kZXN0cnVjdGl2ZWx5IGFkZHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byB0aGUgbm9kZSdzCisJCS8vCQlldnROYW1lIGhhbmRsZXIuCisJCS8vIG5vZGU6IHRoZSBEb21Ob2RlIHRvIGFkZCB0aGUgaGFuZGxlciB0bworCQkvLyBldnROYW1lOiBzaG91bGQgYmUgaW4gdGhlIGZvcm0gImNsaWNrIiBmb3IgIm9uY2xpY2siIGhhbmRsZXJzCisJCXZhciBvbGRIYW5kbGVyID0gbm9kZVsib24iK2V2dE5hbWVdIHx8IGZ1bmN0aW9uKCl7fTsKKwkJbm9kZVsib24iK2V2dE5hbWVdID0gZnVuY3Rpb24oKXsKKwkJCWZwLmFwcGx5KG5vZGUsIGFyZ3VtZW50cyk7CisJCQlvbGRIYW5kbGVyLmFwcGx5KG5vZGUsIGFyZ3VtZW50cyk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZCA9IGZhbHNlOworCS8vCUJFR0lOIERPTUNvbnRlbnRMb2FkZWQsIGZyb20gRGVhbiBFZHdhcmRzIChodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIwMDYvMDYvYWdhaW4vKQorCWZ1bmN0aW9uIGRqX2xvYWRfaW5pdChlKXsKKwkJZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZCA9IHRydWU7CisJCS8vIGFsbG93IG11bHRpcGxlIGNhbGxzLCBvbmx5IGZpcnN0IG9uZSB3aWxsIHRha2UgZWZmZWN0CisJCS8vIEEgYnVnIGluIGtodG1sIGNhbGxzIGV2ZW50cyBjYWxsYmFja3MgZm9yIGRvY3VtZW50IGZvciBldmVudCB3aGljaCBpc250IHN1cHBvcnRlZAorCQkvLyBmb3IgZXhhbXBsZSBhIGNyZWF0ZWQgY29udGV4dG1lbnUgZXZlbnQgY2FsbHMgRE9NQ29udGVudExvYWRlZCwgd29ya2Fyb3VuZAorCQl2YXIgdHlwZSA9IChlICYmIGUudHlwZSkgPyBlLnR5cGUudG9Mb3dlckNhc2UoKSA6ICJsb2FkIjsKKwkJaWYoYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZCB8fCAodHlwZSE9ImRvbWNvbnRlbnRsb2FkZWQiICYmIHR5cGUhPSJsb2FkIikpeyByZXR1cm47IH0KKwkJYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZCA9IHRydWU7CisJCWlmKHR5cGVvZihfdGltZXIpICE9ICd1bmRlZmluZWQnKXsKKwkJCWNsZWFySW50ZXJ2YWwoX3RpbWVyKTsKKwkJCWRlbGV0ZSBfdGltZXI7CisJCX0KKworCQl2YXIgaW5pdEZ1bmMgPSBmdW5jdGlvbigpeworCQkJLy9wZXJmb3JtIGluaXRpYWxpemF0aW9uCisJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKKwkJCX0KKwkJfTsKKworCQlpZihkb2pvLmhvc3RlbnYuaW5GbGlnaHRDb3VudCA9PSAwKXsKKwkJCWluaXRGdW5jKCk7CisJCQlkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCgpOworCQl9ZWxzZXsKKwkJCS8vVGhpcyBlbHNlIGNhc2Ugc2hvdWxkIGJlIHhkb21haW4gbG9hZGluZy4KKwkJCS8vTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBsb2FkIGxpc3RlbmVyIGFycmF5LgorCQkJLy9QYXJ0IG9mIHRoZSBkb2pvLmFkZE9uTG9hZCBndWFyYW50ZWUgaXMgdGhhdCB3aGVuIHRoZSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkLAorCQkJLy9JdCBtZWFucyB0aGUgRE9NIChvciBwYWdlKSBoYXMgbG9hZGVkIGFuZCB0aGF0IHdpZGdldHMgaGF2ZSBiZWVuIHBhcnNlZC4KKwkJCWRvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnVuc2hpZnQoaW5pdEZ1bmMpOworCQl9CisJfQorCisJLy8JU1RBUlQgRE9NQ29udGVudExvYWRlZAorCS8vIE1vemlsbGEgYW5kIE9wZXJhIDkgZXhwb3NlIHRoZSBldmVudCB3ZSBjb3VsZCB1c2UKKwlpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXsKKwkJLy8gTk9URTogCisJCS8vCQlkdWUgdG8gYSB0aHJlYWRpbmcgaXNzdWUgaW4gRmlyZWZveCAyLjAsIHdlIGNhbid0IGVuYWJsZQorCQkvLwkJRE9NQ29udGVudExvYWRlZCBvbiB0aGF0IHBsYXRmb3JtLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgorCQkvLwkJaHR0cDovL3RyYWMuZG9qb3Rvb2xraXQub3JnL3RpY2tldC8xNzA0CisJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEgfHwgKGRvam8ucmVuZGVyLmh0bWwubW96ICYmIChkakNvbmZpZ1siZW5hYmxlTW96RG9tQ29udGVudExvYWRlZCJdID09PSB0cnVlKSkpeworCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGRqX2xvYWRfaW5pdCwgbnVsbCk7CisJCX0KKworCQkvLwltYWlubHkgZm9yIE9wZXJhIDguNSwgd29uJ3QgYmUgZmlyZWQgaWYgRE9NQ29udGVudExvYWRlZCBmaXJlZCBhbHJlYWR5LgorCQkvLyAgYWxzbyB1c2VkIGZvciBNb3ppbGxhIGJlY2F1c2Ugb2YgdHJhYyAjMTY0MAorCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRqX2xvYWRfaW5pdCwgbnVsbCk7CisJfQorCisJLy8gCWZvciBJbnRlcm5ldCBFeHBsb3Jlci4gcmVhZHlTdGF0ZSB3aWxsIG5vdCBiZSBhY2hpZXZlZCBvbiBpbml0IGNhbGwsIGJ1dCBkb2pvIGRvZXNuJ3QgbmVlZCBpdAorCS8vCWhvd2V2ZXIsIHdlJ2xsIGluY2x1ZGUgaXQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZSBvdGhlciBmdW5jdGlvbnMgYWRkZWQgdGhhdCBtaWdodC4KKwkvLwlOb3RlIHRoYXQgdGhpcyBoYXMgY2hhbmdlZCBiZWNhdXNlIHRoZSBidWlsZCBwcm9jZXNzIHN0cmlwcyBhbGwgY29tbWVudHMtLWluY2x1ZGluZyBjb25kaXRpb25hbAorCS8vCQlvbmVzLgorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgZG9qby5yZW5kZXIub3Mud2luKXsKKwkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKGUpeworCQkJaWYoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKXsKKwkJCQlkal9sb2FkX2luaXQoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJaWYgKC8oV2ViS2l0fGtodG1sKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsgLy8gc25pZmYKKwkJdmFyIF90aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworCQkJaWYgKC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpIHsKKwkJCQlkal9sb2FkX2luaXQoKTsgLy8gY2FsbCB0aGUgb25sb2FkIGhhbmRsZXIKKwkJCX0KKwkJfSwgMTApOworCX0KKwkvLwlFTkQgRE9NQ29udGVudExvYWRlZAorCisJLy8gSUUgV2ViQ29udHJvbCBob3N0ZWQgaW4gYW4gYXBwbGljYXRpb24gY2FuIGZpcmUgImJlZm9yZXVubG9hZCIgYW5kICJ1bmxvYWQiCisJLy8gZXZlbnRzIHdoZW4gY29udHJvbCB2aXNpYmlsaXR5IGNoYW5nZXMsIGNhdXNpbmcgRG9qbyB0byB1bmxvYWQgdG9vIHNvb24uIFRoZQorCS8vIGZvbGxvd2luZyBjb2RlIGZpeGVzIHRoZSBwcm9ibGVtCisJLy8gUmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzE5OTE1NQorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQlkal9hZGROb2RlRXZ0SGRscih3aW5kb3csICJiZWZvcmV1bmxvYWQiLCBmdW5jdGlvbigpeworCQkJZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcgPSB0cnVlOworCQkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQkJZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcgPSBmYWxzZTsKKwkJCX0sIDApOworCQl9KTsKKwl9CisKKwlkal9hZGROb2RlRXZ0SGRscih3aW5kb3csICJ1bmxvYWQiLCBmdW5jdGlvbigpeworCQlkb2pvLmhvc3RlbnYudW5sb2FkZWQoKTsKKwkJaWYoKCFkb2pvLnJlbmRlci5odG1sLmllKXx8KGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcpKXsKKwkJCWRvam8uaG9zdGVudi51bmxvYWRlZCgpOworCQl9CisJfSk7CisKKwlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMgPSBmdW5jdGlvbigpeworCQkvLyB5b3UgY2FuIHB1dCBzZWFyY2hJZHMgaW4gZGpDb25maWcgYW5kIGRvam8uaG9zdGVudiBhdCB0aGUgbW9tZW50CisJCS8vIHdlIHNob3VsZCBwcm9iYWJseSBldmVudHVhbGx5IG1vdmUgdG8gb25lIG9yIHRoZSBvdGhlcgorCQl2YXIgc2lkcyA9IFtdOworCQlpZihkakNvbmZpZy5zZWFyY2hJZHMgJiYgZGpDb25maWcuc2VhcmNoSWRzLmxlbmd0aCA+IDApIHsKKwkJCXNpZHMgPSBzaWRzLmNvbmNhdChkakNvbmZpZy5zZWFyY2hJZHMpOworCQl9CisJCWlmKGRvam8uaG9zdGVudi5zZWFyY2hJZHMgJiYgZG9qby5ob3N0ZW52LnNlYXJjaElkcy5sZW5ndGggPiAwKSB7CisJCQlzaWRzID0gc2lkcy5jb25jYXQoZG9qby5ob3N0ZW52LnNlYXJjaElkcyk7CisJCX0KKworCQlpZigoZGpDb25maWcucGFyc2VXaWRnZXRzKXx8KHNpZHMubGVuZ3RoID4gMCkpeworCQkJaWYoZG9qby5ldmFsT2JqUGF0aCgiZG9qby53aWRnZXQuUGFyc2UiKSl7CisJCQkJLy8gd2UgbXVzdCBkbyB0aGlzIG9uIGEgZGVsYXkgdG8gYXZvaWQ6CisJCQkJLy8JaHR0cDovL3d3dy5zaGFmdGVrLm9yZy9ibG9nL2FyY2hpdmVzLzAwMDIxMi5odG1sCisJCQkJLy8gKElFIGJ1ZykKKwkJCQkJdmFyIHBhcnNlciA9IG5ldyBkb2pvLnhtbC5QYXJzZSgpOworCQkJCQlpZihzaWRzLmxlbmd0aCA+IDApeworCQkJCQkJZm9yKHZhciB4PTA7IHg8c2lkcy5sZW5ndGg7IHgrKyl7CisJCQkJCQkJdmFyIHRtcE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzaWRzW3hdKTsKKwkJCQkJCQlpZighdG1wTm9kZSl7IGNvbnRpbnVlOyB9CisJCQkJCQkJdmFyIGZyYWcgPSBwYXJzZXIucGFyc2VFbGVtZW50KHRtcE5vZGUsIG51bGwsIHRydWUpOworCQkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoZnJhZyk7CisJCQkJCQl9CisJCQkJCX1lbHNlIGlmKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cyl7CisJCQkJCQl2YXIgZnJhZyAgPSBwYXJzZXIucGFyc2VFbGVtZW50KGRvam8uYm9keSgpLCBudWxsLCB0cnVlKTsKKwkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoZnJhZyk7CisJCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCl7CisJCWlmKCFkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKKwkJfQorCX0pOworCisJdHJ5eworCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCWRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJ2IiwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiKTsKKwkJCWRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKCJ2XFw6KiIsICJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKSIpOworCQl9CisJfWNhdGNoKGUpeyB9CisKKwkvLyBzdHViLCBvdmVyLXJpZGRlbiBieSBkZWJ1Z2dpbmcgY29kZS4gVGhpcyB3aWxsIGF0IGxlYXN0IGtlZXAgdXMgZnJvbQorCS8vIGJyZWFraW5nIHdoZW4gaXQncyBub3QgaW5jbHVkZWQKKwlkb2pvLmhvc3RlbnYud3JpdGVJbmNsdWRlcyA9IGZ1bmN0aW9uKCl7fQorCisJLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KKwkvLyBAZ2xvYmFsOiBkal9jdXJyZW50RG9jdW1lbnQKKwkvLyBzdW1tYXJ5OgorCS8vCQlDdXJyZW50IGRvY3VtZW50IG9iamVjdC4gJ2RqX2N1cnJlbnREb2N1bWVudCcgY2FuIGJlIG1vZGlmaWVkIGZvciB0ZW1wb3JhcnkgY29udGV4dCBzaGlmdGluZy4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLyAgICBkb2pvLmRvYygpIHJldHVybnMgZG9qby5jdXJyZW50RG9jdW1lbnQuCisJLy8JCVJlZmVyIHRvIGRvam8uZG9jKCkgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvICd3aW5kb3cuZG9jdW1lbnQnIHRvIGVuc3VyZSB5b3VyCisJLy8JCWNvZGUgcnVucyBjb3JyZWN0bHkgaW4gbWFuYWdlZCBjb250ZXh0cy4KKwlpZighZGpfdW5kZWYoImRvY3VtZW50IiwgdGhpcykpeworCQlkal9jdXJyZW50RG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50OworCX0KKworCWRvam8uZG9jID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybiB0aGUgZG9jdW1lbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZG9qby5nbG9iYWwoKQorCQlyZXR1cm4gZGpfY3VycmVudERvY3VtZW50OworCX0KKworCWRvam8uYm9keSA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm4gdGhlIGJvZHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBkb2pvLmRvYygpCisJCS8vIE5vdGU6IGRvY3VtZW50LmJvZHkgaXMgbm90IGRlZmluZWQgZm9yIGEgc3RyaWN0IHhodG1sIGRvY3VtZW50CisJCXJldHVybiBkb2pvLmRvYygpLmJvZHkgfHwgZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOworCX0KKworCWRvam8uYnlJZCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9pZCwgLypEb2N1bWVudEVsZW1lbnQqL2RvYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vIAkJc2ltaWxhciB0byBvdGhlciBsaWJyYXJ5J3MgIiQiIGZ1bmN0aW9uLCB0YWtlcyBhIHN0cmluZworCQkvLyAJCXJlcHJlc2VudGluZyBhIERPTSBpZCBvciBhIERvbU5vZGUgYW5kIHJldHVybnMgdGhlCisJCS8vIAkJY29ycmVzcG9uZGluZyBEb21Ob2RlLiBJZiBhIE5vZGUgaXMgcGFzc2VkLCB0aGlzIGZ1bmN0aW9uIGlzIGEKKwkJLy8gCQluby1vcC4gUmV0dXJucyBhIHNpbmdsZSBET00gbm9kZSBvciBudWxsLCB3b3JraW5nIGFyb3VuZAorCQkvLyAJCXNldmVyYWwgYnJvd3Nlci1zcGVjaWZpYyBidWdzIHRvIGRvIHNvLgorCQkvLyBpZDogRE9NIGlkIG9yIERPTSBOb2RlCisJCS8vIGRvYzoKKwkJLy8JCW9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiBkal9jdXJyZW50RG9jdW1lbnQuCisJCS8vCQlDYW4gYmUgdXNlZCB0byByZXRyZWl2ZSBub2RlIHJlZmVyZW5jZXMgZnJvbSBvdGhlciBkb2N1bWVudHMuCisJCWlmKChpZCkmJigodHlwZW9mIGlkID09ICJzdHJpbmciKXx8KGlkIGluc3RhbmNlb2YgU3RyaW5nKSkpeworCQkJaWYoIWRvYyl7IGRvYyA9IGRqX2N1cnJlbnREb2N1bWVudDsgfQorCQkJdmFyIGVsZSA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7CisJCQkvLyB3b3JrYXJvdW5kIGJ1ZyBpbiBJRSBhbmQgT3BlcmEgOC4yIHdoZXJlIGdldEVsZW1lbnRCeUlkIHJldHVybnMgd3JvbmcgZWxlbWVudAorCQkJaWYoZWxlICYmIChlbGUuaWQgIT0gaWQpICYmIGRvYy5hbGwpeworCQkJCWVsZSA9IG51bGw7CisJCQkJLy8gZ2V0IGFsbCBtYXRjaGluZyBlbGVtZW50cyB3aXRoIHRoaXMgaWQKKwkJCQllbGVzID0gZG9jLmFsbFtpZF07CisJCQkJaWYoZWxlcyl7CisJCQkJCS8vIGlmIG1vcmUgdGhhbiAxLCBjaG9vc2UgZmlyc3Qgd2l0aCB0aGUgY29ycmVjdCBpZAorCQkJCQlpZihlbGVzLmxlbmd0aCl7CisJCQkJCQlmb3IodmFyIGk9MDsgaTxlbGVzLmxlbmd0aDsgaSsrKXsKKwkJCQkJCQlpZihlbGVzW2ldLmlkID09IGlkKXsKKwkJCQkJCQkJZWxlID0gZWxlc1tpXTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkvLyByZXR1cm4gMSBhbmQgb25seSBlbGVtZW50CisJCQkJCX1lbHNleworCQkJCQkJZWxlID0gZWxlczsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbGU7IC8vIERvbU5vZGUKKwkJfQorCQlyZXR1cm4gaWQ7IC8vIERvbU5vZGUKKwl9CisKKwlkb2pvLnNldENvbnRleHQgPSBmdW5jdGlvbigvKk9iamVjdCovZ2xvYmFsT2JqZWN0LCAvKkRvY3VtZW50RWxlbWVudCovZ2xvYmFsRG9jdW1lbnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgbWFueSBjb3JlIERvam8gZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoCisJCS8vCQluYW1lc3BhY2UgYW5kIERPTSBsb29rdXAsIGNoYW5naW5nIHRoZW0gdG8gd29yayBpbiBhIG5ldyBnbG9iYWwKKwkJLy8JCWNvbnRleHQuIFRoZSB2YXJpYmxlcyBkal9jdXJyZW50Q29udGV4dCBhbmQgZGpfY3VycmVudERvY3VtZW50CisJCS8vCQlhcmUgbW9kaWZpZWQgYXMgYSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorCQlkal9jdXJyZW50Q29udGV4dCA9IGdsb2JhbE9iamVjdDsKKwkJZGpfY3VycmVudERvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7CisJfTsKKworCWRvam8uX2ZpcmVDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBjb250ZXh0LCBjYkFyZ3VtZW50cyl7CisJCWlmKChjb250ZXh0KSYmKCh0eXBlb2YgY2FsbGJhY2sgPT0gInN0cmluZyIpfHwoY2FsbGJhY2sgaW5zdGFuY2VvZiBTdHJpbmcpKSl7CisJCQljYWxsYmFjaz1jb250ZXh0W2NhbGxiYWNrXTsKKwkJfQorCQlyZXR1cm4gKGNvbnRleHQgPyBjYWxsYmFjay5hcHBseShjb250ZXh0LCBjYkFyZ3VtZW50cyB8fCBbIF0pIDogY2FsbGJhY2soKSk7CisJfQorCisJZG9qby53aXRoR2xvYmFsID0gZnVuY3Rpb24oLypPYmplY3QqL2dsb2JhbE9iamVjdCwgLypGdW5jdGlvbiovY2FsbGJhY2ssIC8qT2JqZWN0PyovdGhpc09iamVjdCwgLypBcnJheT8qL2NiQXJndW1lbnRzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNhbGwgY2FsbGJhY2sgd2l0aCBnbG9iYWxPYmplY3QgYXMgZG9qby5nbG9iYWwoKSBhbmQgZ2xvYmFsT2JqZWN0LmRvY3VtZW50CisJCS8vCQlhcyBkb2pvLmRvYygpLiBJZiBwcm92aWRlZCwgZ2xvYmFsT2JqZWN0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YKKwkJLy8JCW9iamVjdCB0aGlzT2JqZWN0CisJCS8vIGRlc2NyaXB0aW9uOgorCQkvLwkJV2hlbiBjYWxsYmFjaygpIHJldHVybnMgb3IgdGhyb3dzIGFuIGVycm9yLCB0aGUgZG9qby5nbG9iYWwoKSBhbmQgZG9qby5kb2MoKSB3aWxsCisJCS8vCQliZSByZXN0b3JlZCB0byBpdHMgcHJldmlvdXMgc3RhdGUuCisJCXZhciBydmFsOworCQl2YXIgb2xkR2xvYiA9IGRqX2N1cnJlbnRDb250ZXh0OworCQl2YXIgb2xkRG9jID0gZGpfY3VycmVudERvY3VtZW50OworCQl0cnl7CisJCQlkb2pvLnNldENvbnRleHQoZ2xvYmFsT2JqZWN0LCBnbG9iYWxPYmplY3QuZG9jdW1lbnQpOworCQkJcnZhbCA9IGRvam8uX2ZpcmVDYWxsYmFjayhjYWxsYmFjaywgdGhpc09iamVjdCwgY2JBcmd1bWVudHMpOworCQl9ZmluYWxseXsKKwkJCWRvam8uc2V0Q29udGV4dChvbGRHbG9iLCBvbGREb2MpOworCQl9CisJCXJldHVybiBydmFsOworCX0KKworCWRvam8ud2l0aERvYyA9IGZ1bmN0aW9uICgvKk9iamVjdCovZG9jdW1lbnRPYmplY3QsIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QsIC8qQXJyYXk/Ki9jYkFyZ3VtZW50cykgeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbCBjYWxsYmFjayB3aXRoIGRvY3VtZW50T2JqZWN0IGFzIGRvam8uZG9jKCkuIElmIHByb3ZpZGVkLCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkCisJCS8vCQlpbiB0aGUgY29udGV4dCBvZiBvYmplY3QgdGhpc09iamVjdAorCQkvLyBkZXNjcmlwdGlvbjoKKwkJLy8JCVdoZW4gY2FsbGJhY2soKSByZXR1cm5zIG9yIHRocm93cyBhbiBlcnJvciwgdGhlIGRvam8uZG9jKCkgd2lsbAorCQkvLwkJYmUgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHN0YXRlLgorCQl2YXIgcnZhbDsKKwkJdmFyIG9sZERvYyA9IGRqX2N1cnJlbnREb2N1bWVudDsKKwkJdHJ5eworCQkJZGpfY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnRPYmplY3Q7CisJCQlydmFsID0gZG9qby5fZmlyZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzT2JqZWN0LCBjYkFyZ3VtZW50cyk7CisJCX1maW5hbGx5eworCQkJZGpfY3VycmVudERvY3VtZW50ID0gb2xkRG9jOworCQl9CisJCXJldHVybiBydmFsOworCX0KKworfSAvL2lmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKQorCisvL0xvYWQgZGVidWcgY29kZSBpZiBuZWNlc3NhcnkuCitkb2pvLnJlcXVpcmVJZigoZGpDb25maWdbImlzRGVidWciXSB8fCBkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0pLCAiZG9qby5kZWJ1ZyIpOworCisvL3dpbmRvdy53aWRnZXQgaXMgZm9yIERhc2hib2FyZCBkZXRlY3Rpb24KKy8vVGhlIGZ1bGwgY29uZGl0aW9uYWxzIGFyZSBzcGVsbGVkIG91dCB0byBhdm9pZCBpc3N1ZXMgZHVyaW5nIGJ1aWxkcy4KKy8vQnVpbGRzIG1heSBiZSBsb29raW5nIGZvciByZXF1aXJlL3JlcXVpcmVJZiBzdGF0ZW1lbnRzIGFuZCBwcm9jZXNzaW5nIHRoZW0uCitkb2pvLnJlcXVpcmVJZihkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0gJiYgIXdpbmRvdy53aWRnZXQgJiYgIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0sICJkb2pvLmJyb3dzZXJfZGVidWciKTsKK2Rvam8ucmVxdWlyZUlmKGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSAmJiAhd2luZG93LndpZGdldCAmJiBkakNvbmZpZ1sidXNlWERvbWFpbiJdLCAiZG9qby5icm93c2VyX2RlYnVnX3hkIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5zdHJpbmcuY29tbW9uIik7CisKK2Rvam8uc3RyaW5nLnRyaW0gPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zdHIsIC8qIGludGVnZXI/ICovd2gpeworCS8vCXN1bW1hcnkKKwkvLwlUcmltIHdoaXRlc3BhY2UgZnJvbSBzdHIuICBJZiB3aCA+IDAsIHRyaW0gZnJvbSBzdGFydCwgaWYgd2ggPCAwLCB0cmltIGZyb20gZW5kLCBlbHNlIGJvdGgKKwlpZighc3RyLnJlcGxhY2UpeyByZXR1cm4gc3RyOyB9CisJaWYoIXN0ci5sZW5ndGgpeyByZXR1cm4gc3RyOyB9CisJdmFyIHJlID0gKHdoID4gMCkgPyAoL15ccysvKSA6ICh3aCA8IDApID8gKC9ccyskLykgOiAoL15ccyt8XHMrJC9nKTsKKwlyZXR1cm4gc3RyLnJlcGxhY2UocmUsICIiKTsJLy8Jc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnRyaW1TdGFydCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0cikgeworCS8vCXN1bW1hcnkKKwkvLwlUcmltIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiAnc3RyJworCXJldHVybiBkb2pvLnN0cmluZy50cmltKHN0ciwgMSk7CS8vCXN0cmluZworfQorCitkb2pvLnN0cmluZy50cmltRW5kID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyKSB7CisJLy8Jc3VtbWFyeQorCS8vCVRyaW0gd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mICdzdHInCisJcmV0dXJuIGRvam8uc3RyaW5nLnRyaW0oc3RyLCAtMSk7Cit9CisKK2Rvam8uc3RyaW5nLnJlcGVhdCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0ciwgLyogaW50ZWdlciAqL2NvdW50LCAvKiBzdHJpbmc/ICovc2VwYXJhdG9yKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybiAnc3RyJyByZXBlYXRlZCAnY291bnQnIHRpbWVzLCBvcHRpb25hbGx5IHBsYWNpbmcgJ3NlcGFyYXRvcicgYmV0d2VlbiBlYWNoIHJlcAorCXZhciBvdXQgPSAiIjsKKwlmb3IodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlvdXQgKz0gc3RyOworCQlpZihzZXBhcmF0b3IgJiYgaSA8IGNvdW50IC0gMSkgeworCQkJb3V0ICs9IHNlcGFyYXRvcjsKKwkJfQorCX0KKwlyZXR1cm4gb3V0OwkvLwlzdHJpbmcKK30KKworZG9qby5zdHJpbmcucGFkID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyLCAvKiBpbnRlZ2VyICovbGVuLyo9MiovLCAvKiBzdHJpbmcgKi8gYy8qPScwJyovLCAvKiBpbnRlZ2VyICovZGlyLyo9MSovKSB7CisJLy8Jc3VtbWFyeQorCS8vCVBhZCAnc3RyJyB0byBndWFyYW50ZWUgdGhhdCBpdCBpcyBhdCBsZWFzdCAnbGVuJyBsZW5ndGggd2l0aCB0aGUgY2hhcmFjdGVyICdjJyBhdCBlaXRoZXIgdGhlIAorCS8vCXN0YXJ0IChkaXI9MSkgb3IgZW5kIChkaXI9LTEpIG9mIHRoZSBzdHJpbmcKKwl2YXIgb3V0ID0gU3RyaW5nKHN0cik7CisJaWYoIWMpIHsKKwkJYyA9ICcwJzsKKwl9CisJaWYoIWRpcikgeworCQlkaXIgPSAxOworCX0KKwl3aGlsZShvdXQubGVuZ3RoIDwgbGVuKSB7CisJCWlmKGRpciA+IDApIHsKKwkJCW91dCA9IGMgKyBvdXQ7CisJCX0gZWxzZSB7CisJCQlvdXQgKz0gYzsKKwkJfQorCX0KKwlyZXR1cm4gb3V0OwkvLwlzdHJpbmcKK30KKworZG9qby5zdHJpbmcucGFkTGVmdCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0ciwgLyogaW50ZWdlciAqL2xlbiwgLyogc3RyaW5nICovYykgeworCS8vCXN1bW1hcnkKKwkvLwlzYW1lIGFzIGRvam8uc3RyaW5nLnBhZChzdHIsIGxlbiwgYywgMSkKKwlyZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAxKTsJLy8Jc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnBhZFJpZ2h0ID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyLCAvKiBpbnRlZ2VyICovbGVuLCAvKiBzdHJpbmcgKi9jKSB7CisJLy8Jc3VtbWFyeQorCS8vCXNhbWUgYXMgZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAtMSkKKwlyZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAtMSk7CS8vCXN0cmluZworfQorCitkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nIik7CisKKworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuY29tbW9uIik7CisKK2Rvam8ubGFuZy5pbmhlcml0cyA9IGZ1bmN0aW9uKC8qRnVuY3Rpb24qL3N1YmNsYXNzLCAvKkZ1bmN0aW9uKi9zdXBlcmNsYXNzKXsKKwkvLyBzdW1tYXJ5OiBTZXQgdXAgaW5oZXJpdGFuY2UgYmV0d2VlbiB0d28gY2xhc3Nlcy4KKwlpZighZG9qby5sYW5nLmlzRnVuY3Rpb24oc3VwZXJjbGFzcykpeyAKKwkJZG9qby5yYWlzZSgiZG9qby5pbmhlcml0czogc3VwZXJjbGFzcyBhcmd1bWVudCBbIitzdXBlcmNsYXNzKyJdIG11c3QgYmUgYSBmdW5jdGlvbiAoc3ViY2xhc3M6IFsiK3N1YmNsYXNzKyInXSIpOworCX0KKwlzdWJjbGFzcy5wcm90b3R5cGUgPSBuZXcgc3VwZXJjbGFzcygpOworCXN1YmNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YmNsYXNzOworCXN1YmNsYXNzLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLnByb3RvdHlwZTsKKwkvLyBERVBSRUNBVEVEOiBzdXBlciBpcyBhIHJlc2VydmVkIHdvcmQsIHVzZSAnc3VwZXJjbGFzcycKKwlzdWJjbGFzc1snc3VwZXInXSA9IHN1cGVyY2xhc3MucHJvdG90eXBlOworfQorCitkb2pvLmxhbmcuX21peGluID0gZnVuY3Rpb24oLypPYmplY3QqLyBvYmosIC8qT2JqZWN0Ki8gcHJvcHMpeworCS8vIHN1bW1hcnk6CisJLy8JCUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gb2JqLiBUaGlzIGFkZGl0aW9uIGlzCisJLy8JCSJwcm90b3R5cGUgZXh0ZW5zaW9uIHNhZmUiLCBzbyB0aGF0IGluc3RhbmNlcyBvZiBvYmplY3RzIHdpbGwgbm90CisJLy8JCXBhc3MgYWxvbmcgcHJvdG90eXBlIGRlZmF1bHRzLgorCXZhciB0b2JqID0ge307CisJZm9yKHZhciB4IGluIHByb3BzKXsKKwkJLy8gdGhlICJ0b2JqIiBjb25kaXRpb24gYXZvaWQgY29weWluZyBwcm9wZXJ0aWVzIGluICJwcm9wcyIKKwkJLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4gIEZvciBleGFtcGxlLCBpZiBvYmogaGFzIGEgY3VzdG9tCisJCS8vIHRvU3RyaW5nKCkgbWV0aG9kLCBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QKKwkJLy8gdGhhdCBwcm9wcyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG95cGUKKwkJaWYoKHR5cGVvZiB0b2JqW3hdID09ICJ1bmRlZmluZWQiKSB8fCAodG9ialt4XSAhPSBwcm9wc1t4XSkpeworCQkJb2JqW3hdID0gcHJvcHNbeF07CisJCX0KKwl9CisJLy8gSUUgZG9lc24ndCByZWNvZ25pemUgY3VzdG9tIHRvU3RyaW5ncyBpbiBmb3IuLmluCisJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSAKKwkJJiYgKHR5cGVvZihwcm9wc1sidG9TdHJpbmciXSkgPT0gImZ1bmN0aW9uIikKKwkJJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IG9ialsidG9TdHJpbmciXSkKKwkJJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IHRvYmpbInRvU3RyaW5nIl0pKQorCXsKKwkJb2JqLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7CisJfQorCXJldHVybiBvYmo7IC8vIE9iamVjdAorfQorCitkb2pvLmxhbmcubWl4aW4gPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKk9iamVjdC4uLiovcHJvcHMpeworCS8vIHN1bW1hcnk6CUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gb2JqLiAKKwlmb3IodmFyIGk9MSwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKyl7CisJCWRvam8ubGFuZy5fbWl4aW4ob2JqLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gb2JqOyAvLyBPYmplY3QKK30KKworZG9qby5sYW5nLmV4dGVuZCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gY29uc3RydWN0b3IsIC8qT2JqZWN0Li4uKi8gcHJvcHMpeworCS8vIHN1bW1hcnk6CisJLy8JCUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gY29uc3RydWN0b3IncworCS8vCQlwcm90b3R5cGUsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgaW5zdGFuY2VzIGNyZWF0ZWQgd2l0aAorCS8vCQljb25zdHJ1Y3Rvci4KKwlmb3IodmFyIGk9MSwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKyl7CisJCWRvam8ubGFuZy5fbWl4aW4oY29uc3RydWN0b3IucHJvdG90eXBlLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gY29uc3RydWN0b3I7IC8vIE9iamVjdAorfQorCisvLyBQcm9tb3RlIHRvIGRvam8gbW9kdWxlCitkb2pvLmluaGVyaXRzID0gZG9qby5sYW5nLmluaGVyaXRzOworLy9kb2pvLmxhbmcuX21peGluID0gZG9qby5sYW5nLl9taXhpbjsKK2Rvam8ubWl4aW4gPSBkb2pvLmxhbmcubWl4aW47Citkb2pvLmV4dGVuZCA9IGRvam8ubGFuZy5leHRlbmQ7CisKK2Rvam8ubGFuZy5maW5kID0gZnVuY3Rpb24oCS8qQXJyYXkqLwkJYXJyYXksIAorCQkJCQkJCS8qT2JqZWN0Ki8JCXZhbHVlLAorCQkJCQkJCS8qQm9vbGVhbj8qLwlpZGVudGl0eSwKKwkJCQkJCQkvKkJvb2xlYW4/Ki8JZmluZExhc3QpeworCS8vIHN1bW1hcnk6CQorCS8vCQlSZXR1cm4gdGhlIGluZGV4IG9mIHZhbHVlIGluIGFycmF5LCByZXR1cm5pbmcgLTEgaWYgbm90IGZvdW5kLgorCS8vIGFycmF5OiBqdXN0IHdoYXQgeW91IHRoaW5rCisJLy8gdmFsdWU6IHRoZSB2YWx1ZSB0byBsb2NhdGUKKwkvLyBpZGVudGl0eTogCisJLy8JCUlmIHRydWUsIG1hdGNoZXMgd2l0aCBpZGVudGl0eSBjb21wYXJpc29uICg9PT0pLiBJZiBmYWxzZSwgdXNlcworCS8vCQlub3JtYWwgY29tcGFyaXNvbiAoPT0pLgorCS8vIGZpbmRMYXN0OiAKKwkvLwkJSWYgdHJ1ZSwgcmV0dXJucyBpbmRleCBvZiBsYXN0IGluc3RhbmNlIG9mIHZhbHVlLgorCS8vIGV4YW1wbGVzOgorCS8vCQlmaW5kKGFycmF5LCB2YWx1ZVssIGlkZW50aXR5IFtmaW5kTGFzdF1dKSAvLyByZWNvbW1lbmRlZAorIAkvLwkJZmluZCh2YWx1ZSwgYXJyYXlbLCBpZGVudGl0eSBbZmluZExhc3RdXSkgLy8gZGVwcmVjYXRlZAorCQkJCQkJCQorCS8vIHN1cHBvcnQgYm90aCAoYXJyYXksIHZhbHVlKSBhbmQgKHZhbHVlLCBhcnJheSkKKwlpZighZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFycmF5KSAmJiBkb2pvLmxhbmcuaXNBcnJheUxpa2UodmFsdWUpKSB7CisJCWRvam8uZGVwcmVjYXRlZCgnZG9qby5sYW5nLmZpbmQodmFsdWUsIGFycmF5KScsICd1c2UgZG9qby5sYW5nLmZpbmQoYXJyYXksIHZhbHVlKSBpbnN0ZWFkJywgIjAuNSIpOworCQl2YXIgdGVtcCA9IGFycmF5OworCQlhcnJheSA9IHZhbHVlOworCQl2YWx1ZSA9IHRlbXA7CisJfQorCXZhciBpc1N0cmluZyA9IGRvam8ubGFuZy5pc1N0cmluZyhhcnJheSk7CisJaWYoaXNTdHJpbmcpIHsgYXJyYXkgPSBhcnJheS5zcGxpdCgiIik7IH0KKworCWlmKGZpbmRMYXN0KSB7CisJCXZhciBzdGVwID0gLTE7CisJCXZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJdmFyIGVuZCA9IC0xOworCX0gZWxzZSB7CisJCXZhciBzdGVwID0gMTsKKwkJdmFyIGkgPSAwOworCQl2YXIgZW5kID0gYXJyYXkubGVuZ3RoOworCX0KKwlpZihpZGVudGl0eSl7CisJCXdoaWxlKGkgIT0gZW5kKSB7CisJCQlpZihhcnJheVtpXSA9PT0gdmFsdWUpeyByZXR1cm4gaTsgfQorCQkJaSArPSBzdGVwOworCQl9CisJfWVsc2V7CisJCXdoaWxlKGkgIT0gZW5kKSB7CisJCQlpZihhcnJheVtpXSA9PSB2YWx1ZSl7IHJldHVybiBpOyB9CisJCQlpICs9IHN0ZXA7CisJCX0KKwl9CisJcmV0dXJuIC0xOwkvLyBudW1iZXIKK30KKworZG9qby5sYW5nLmluZGV4T2YgPSBkb2pvLmxhbmcuZmluZDsKKworZG9qby5sYW5nLmZpbmRMYXN0ID0gZnVuY3Rpb24oLypBcnJheSovYXJyYXksIC8qT2JqZWN0Ki92YWx1ZSwgLypib29sZWFuPyovaWRlbnRpdHkpeworCS8vIHN1bW1hcnk6CisJLy8JCVJldHVybiBpbmRleCBvZiBsYXN0IG9jY3VyYW5jZSBvZiB2YWx1ZSBpbiBhcnJheSwgcmV0dXJuaW5nIC0xIGlmCisJLy8JCW5vdCBmb3VuZC4gVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBkb2pvLmxhbmcuZmluZCgpIHdpdGggYSB0cnVlCisJLy8JCXZhbHVlIGZvciBpdHMgImZpbmRMYXN0IiBwYXJhbWV0ZXIuCisJLy8gaWRlbnRpdHk6CisJLy8JCUlmIHRydWUsIG1hdGNoZXMgd2l0aCBpZGVudGl0eSBjb21wYXJpc29uICg9PT0pLiBJZiBmYWxzZSwgdXNlcworCS8vCQlub3JtYWwgY29tcGFyaXNvbiAoPT0pLgorCXJldHVybiBkb2pvLmxhbmcuZmluZChhcnJheSwgdmFsdWUsIGlkZW50aXR5LCB0cnVlKTsgLy8gbnVtYmVyCit9CisKK2Rvam8ubGFuZy5sYXN0SW5kZXhPZiA9IGRvam8ubGFuZy5maW5kTGFzdDsKKworZG9qby5sYW5nLmluQXJyYXkgPSBmdW5jdGlvbihhcnJheSAvKkFycmF5Ki8sIHZhbHVlIC8qT2JqZWN0Ki8peworCS8vIHN1bW1hcnk6CVJldHVybiB0cnVlIGlmIHZhbHVlIGlzIHByZXNlbnQgaW4gYXJyYXkuCisJcmV0dXJuIGRvam8ubGFuZy5maW5kKGFycmF5LCB2YWx1ZSkgPiAtMTsgLy8gYm9vbGVhbgorfQorCisvKioKKyAqIFBhcnRpYWwgaW1wbG1lbnRhdGlvbiBvZiBpcyogZnVuY3Rpb25zIGZyb20KKyAqIGh0dHA6Ly93d3cuY3JvY2tmb3JkLmNvbS9qYXZhc2NyaXB0L3JlY29tbWVuZC5odG1sCisgKiBOT1RFOiBzb21lIG9mIHRoZXNlIG1heSBub3QgYmUgdGhlIGJlc3QgdGhpbmcgdG8gdXNlIGluIGFsbCBzaXR1YXRpb25zCisgKiBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIGNvcmUgSlMgYW5kIHRoZXJlZm9yZSBjYW4ndCB3b3JrIGluIGV2ZXJ5IGNhc2UuCisgKiBTZWUgV0FSTklORyBtZXNzYWdlcyBpbmxpbmUgZm9yIHRpcHMuCisgKgorICogVGhlIGZvbGxvd2luZyBpcyogZnVuY3Rpb25zIGFyZSBmYWlybHkgInNhZmUiCisgKi8KKworZG9qby5sYW5nLmlzT2JqZWN0ID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBPYmplY3QsIEFycmF5IG9yIEZ1bmN0aW9uLgorCWlmKHR5cGVvZiBpdCA9PSAidW5kZWZpbmVkIil7IHJldHVybiBmYWxzZTsgfQorCXJldHVybiAodHlwZW9mIGl0ID09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsIHx8IGRvam8ubGFuZy5pc0FycmF5KGl0KSB8fCBkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkpOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0FycmF5ID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBBcnJheS4KKwlyZXR1cm4gKGl0ICYmIGl0IGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGl0ID09ICJhcnJheSIpOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0FycmF5TGlrZSA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJLy8gc3VtbWFyeToJCisJLy8JCVJldHVybiB0cnVlIGlmIGl0IGNhbiBiZSB1c2VkIGFzIGFuIGFycmF5IChpLmUuIGlzIGFuIG9iamVjdCB3aXRoCisJLy8JCWFuIGludGVnZXIgbGVuZ3RoIHByb3BlcnR5KS4KKwlpZigoIWl0KXx8KGRvam8ubGFuZy5pc1VuZGVmaW5lZChpdCkpKXsgcmV0dXJuIGZhbHNlOyB9CisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGl0KSl7IHJldHVybiBmYWxzZTsgfQorCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGl0KSl7IHJldHVybiBmYWxzZTsgfSAvLyBrZWVwcyBvdXQgYnVpbHQtaW4gY29uc3RydWN0b3JzIChOdW1iZXIsIFN0cmluZywgLi4uKSB3aGljaCBoYXZlIGxlbmd0aCBwcm9wZXJ0aWVzCisJaWYoZG9qby5sYW5nLmlzQXJyYXkoaXQpKXsgcmV0dXJuIHRydWU7IH0KKwkvLyBmb3JtIG5vZGUgaXRzZWxmIGlzIEFycmF5TGlrZSwgYnV0IG5vdCBhbHdheXMgaXRlcmFibGUuIFVzZSBmb3JtLmVsZW1lbnRzIGluc3RlYWQuCisJaWYoKGl0LnRhZ05hbWUpJiYoaXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0nZm9ybScpKXsgcmV0dXJuIGZhbHNlOyB9CisJaWYoZG9qby5sYW5nLmlzTnVtYmVyKGl0Lmxlbmd0aCkgJiYgaXNGaW5pdGUoaXQubGVuZ3RoKSl7IHJldHVybiB0cnVlOyB9CisJcmV0dXJuIGZhbHNlOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIEZ1bmN0aW9uLgorCXJldHVybiAoaXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgaXQgPT0gImZ1bmN0aW9uIik7IC8vIEJvb2xlYW4KK307CisKKyhmdW5jdGlvbigpeworCS8vIHdlYmtpdCB0cmVhdHMgTm9kZUxpc3QgYXMgYSBmdW5jdGlvbiwgd2hpY2ggaXMgYmFkCisJaWYoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkmJihkb2pvLnJlbmRlci5odG1sWyJzYWZhcmkiXSkpeworCQlkb2pvLmxhbmcuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJCQlpZigodHlwZW9mKGl0KSA9PSAiZnVuY3Rpb24iKSAmJiAoaXQgPT0gIltvYmplY3QgTm9kZUxpc3RdIikpIHsgcmV0dXJuIGZhbHNlOyB9CisJCQlyZXR1cm4gKGl0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHlwZW9mIGl0ID09ICJmdW5jdGlvbiIpOyAvLyBCb29sZWFuCisJCX0KKwl9Cit9KSgpOworCitkb2pvLmxhbmcuaXNTdHJpbmcgPSBmdW5jdGlvbigvKmFueXRoaW5nKi8gaXQpeworCS8vIHN1bW1hcnk6CVJldHVybiB0cnVlIGlmIGl0IGlzIGEgU3RyaW5nLgorCXJldHVybiAodHlwZW9mIGl0ID09ICJzdHJpbmciIHx8IGl0IGluc3RhbmNlb2YgU3RyaW5nKTsKK30KKworZG9qby5sYW5nLmlzQWxpZW4gPSBmdW5jdGlvbigvKmFueXRoaW5nKi8gaXQpeworCS8vIHN1bW1hcnk6IFJldHVybiB0cnVlIGlmIGl0IGlzIG5vdCBhIGJ1aWx0LWluIGZ1bmN0aW9uLiBGYWxzZSBpZiBub3QuCisJaWYoIWl0KXsgcmV0dXJuIGZhbHNlOyB9CisJcmV0dXJuICFkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkgJiYgL1x7XHMqXFtuYXRpdmUgY29kZVxdXHMqXH0vLnRlc3QoU3RyaW5nKGl0KSk7IC8vIEJvb2xlYW4KK30KKworZG9qby5sYW5nLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJLy8gc3VtbWFyeToJUmV0dXJuIHRydWUgaWYgaXQgaXMgYSBCb29sZWFuLgorCXJldHVybiAoaXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHR5cGVvZiBpdCA9PSAiYm9vbGVhbiIpOyAvLyBCb29sZWFuCit9CisKKy8qKgorICogVGhlIGZvbGxvd2luZyBpcyoqKigpIGZ1bmN0aW9ucyBhcmUgc29tZXdoYXQgInVuc2FmZSIuIEZvcnR1bmF0ZWx5LAorICogdGhlcmUgYXJlIHdvcmthcm91bmRzIHRoZSB0aGUgbGFuZ3VhZ2UgcHJvdmlkZXMgYW5kIGFyZSBtZW50aW9uZWQKKyAqIGluIHRoZSBXQVJOSU5HIG1lc3NhZ2VzLgorICoKKyAqLworZG9qby5sYW5nLmlzTnVtYmVyID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIG51bWJlci4KKwkvLyBkZXNjcmlwdGlvbjogCisJLy8JCVdBUk5JTkcgLSBJbiBtb3N0IGNhc2VzLCBpc05hTihpdCkgaXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QKKwkvLyAJCXNvbWV0aGluZyBpcyBhIG51bWJlciBvciBjYW4gYmUgdXNlZCBhcyBzdWNoLiBGb3IgZXhhbXBsZSwgYSBudW1iZXIgb3Igc3RyaW5nCisJLy8gCQljYW4gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aGVuIGFjY2Vzc2luZyBhcnJheSBpdGVtcyAoYXJyYXlbIjEiXSBpcyB0aGUgc2FtZSBhcworCS8vIAkJYXJyYXlbMV0pIGFuZCBpc05hTiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYm90aCB2YWx1ZXMgKCIxIiBhbmQgMSkuIEhvd2V2ZXIsCisJLy8gCQlpc051bWJlcigiMSIpICB3aWxsIHJldHVybiBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IG5vdCB0b28gdXNlZnVsLgorCS8vIAkJQWxzbywgaXNOdW1iZXIoTmFOKSByZXR1cm5zIHRydWUsIGFnYWluLCB0aGlzIGlzbid0IGdlbmVyYWxseSB1c2VmdWwsIGJ1dCB0aGVyZQorCS8vIAkJYXJlIGNvcm5lciBjYXNlcyAobGlrZSB3aGVuIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHR3byB0aGluZ3MgYXJlIHJlYWxseQorCS8vIAkJdGhlIHNhbWUgdHlwZSBvZiB0aGluZykuIFRoYXQgaXMgcmVhbGx5IHdoZXJlIGlzTnVtYmVyICJzaGluZXMiLgorCS8vCisJLy8gUmVjb21tZW5kYXRpb24gLSBVc2UgaXNOYU4oaXQpIHdoZW4gcG9zc2libGUKKwkKKwlyZXR1cm4gKGl0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHR5cGVvZiBpdCA9PSAibnVtYmVyIik7IC8vIEJvb2xlYW4KK30KKworLyoKKyAqIEZJWE1FOiBTaG91bGQgaXNVbmRlZmluZWQgZ28gYXdheSBzaW5jZSBpdCBpcyBlcnJvciBwcm9uZT8KKyAqLworZG9qby5sYW5nLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBub3QgZGVmaW5lZC4KKwkvLyBkZXNjcmlwdGlvbjogCisJLy8JCVdBUk5JTkcgLSBJbiBzb21lIGNhc2VzLCBpc1VuZGVmaW5lZCB3aWxsIG5vdCBiZWhhdmUgYXMgeW91CisJLy8gCQltaWdodCBleHBlY3QuIElmIHlvdSBkbyBpc1VuZGVmaW5lZChmb28pIGFuZCB0aGVyZSBpcyBubyBlYXJsaWVyCisJLy8gCQlyZWZlcmVuY2UgdG8gZm9vLCBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWZvcmUgaXNVbmRlZmluZWQgaXMKKwkvLyAJCWNhbGxlZC4gSXQgYmVoYXZlcyBjb3JyZWN0bHkgaWYgeW91IHNjb3BlIHlvciBvYmplY3QgZmlyc3QsIGkuZS4KKwkvLyAJCWlzVW5kZWZpbmVkKGZvby5iYXIpIHdoZXJlIGZvbyBpcyBhbiBvYmplY3QgYW5kIGJhciBpc24ndCBhCisJLy8gCQlwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LgorCS8vCisJLy8gUmVjb21tZW5kYXRpb24gLSBVc2UgdHlwZW9mIGZvbyA9PSAidW5kZWZpbmVkIiB3aGVuIHBvc3NpYmxlCisKKwlyZXR1cm4gKCh0eXBlb2YoaXQpID09ICJ1bmRlZmluZWQiKSYmKGl0ID09IHVuZGVmaW5lZCkpOyAvLyBCb29sZWFuCit9CisKKy8vIGVuZCBDcm9ja2ZvcmQgZnVuY3Rpb25zCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmV4dHJhcyIpOworCisKKworZG9qby5sYW5nLnNldFRpbWVvdXQgPSBmdW5jdGlvbigvKkZ1bmN0aW9uKi9mdW5jLCAvKmludCovZGVsYXkgLyosIC4uLiovKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlTZXRzIGEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGluIGEgZ2l2ZW4KKwkvLwkJY29udGV4dCB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50cy4KKwkvLyB1c2FnZToKKwkvLwkJZG9qby5sYW5nLnNldFRpbWVvdXQoT2JqZWN0IGNvbnRleHQsIGZ1bmN0aW9uIGZ1bmMsIG51bWJlciBkZWxheVssIGFyZzFbLCAuLi5dXSk7CisJLy8JCWRvam8ubGFuZy5zZXRUaW1lb3V0KGZ1bmN0aW9uIGZ1bmMsIG51bWJlciBkZWxheVssIGFyZzFbLCAuLi5dXSk7CisKKwl2YXIgY29udGV4dCA9IHdpbmRvdywgYXJnc1N0YXJ0ID0gMjsKKwlpZighZG9qby5sYW5nLmlzRnVuY3Rpb24oZnVuYykpeworCQljb250ZXh0ID0gZnVuYzsKKwkJZnVuYyA9IGRlbGF5OworCQlkZWxheSA9IGFyZ3VtZW50c1syXTsKKwkJYXJnc1N0YXJ0Kys7CisJfQorCisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGZ1bmMpKXsKKwkJZnVuYyA9IGNvbnRleHRbZnVuY107CisJfQorCQorCXZhciBhcmdzID0gW107CisJZm9yICh2YXIgaSA9IGFyZ3NTdGFydDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7CisJCWFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gZG9qby5nbG9iYWwoKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7IH0sIGRlbGF5KTsgLy8gaW50Cit9CisKK2Rvam8ubGFuZy5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbigvKmludCovdGltZXIpeworCS8vIHN1bW1hcnk6IGNsZWFycyB0aW1lciBieSBudW1iZXIgZnJvbSB0aGUgZXhlY3V0aW9uIHF1ZXVlCisKKwkvLyBGSVhNRToKKwkvLwkJd2h5IGRvIHdlIGhhdmUgdGhpcyBmdW5jdGlvbj8gSXQncyBub3QgcG9ydGFibGUgb3V0c2lkZSBvZiBicm93c2VyCisJLy8JCWVudmlyb25tZW50cyBhbmQgaXQncyBhIHN0dXBpZCB3cmFwcGVyIG9uIHNvbWV0aGluZyB0aGF0IGJyb3dzZXJzCisJLy8JCXByb3ZpZGUgYW55d2F5LgorCWRvam8uZ2xvYmFsKCkuY2xlYXJUaW1lb3V0KHRpbWVyKTsKK30KKworZG9qby5sYW5nLmdldE5hbWVJbk9iaiA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9ucywgLyp1bmtub3duKi9pdGVtKXsKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJbG9va3MgZm9yIGEgdmFsdWUgaW4gdGhlIG9iamVjdCBucyB3aXRoIGEgdmFsdWUgbWF0Y2hpbmcgaXRlbSBhbmQKKwkvLwkJcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZQorCS8vIG5zOiBpZiBudWxsLCBkal9nbG9iYWwgaXMgdXNlZAorCS8vIGl0ZW06IHZhbHVlIHRvIHJldHVybiBhIG5hbWUgZm9yCisJaWYoIW5zKXsgbnMgPSBkal9nbG9iYWw7IH0KKworCWZvcih2YXIgeCBpbiBucyl7CisJCWlmKG5zW3hdID09PSBpdGVtKXsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHgpOyAvLyBTdHJpbmcKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsgLy8gbnVsbAorfQorCitkb2pvLmxhbmcuc2hhbGxvd0NvcHkgPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKkJvb2xlYW4/Ki9kZWVwKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQljb3BpZXMgb2JqZWN0IG9iaiBvbmUgbGV2ZWwgZGVlcCwgb3IgZnVsbCBkZXB0aCBpZiBkZWVwIGlzIHRydWUKKwl2YXIgaSwgcmV0OwkKKworCWlmKG9iaiA9PT0gbnVsbCl7IC8qb2JqOiBudWxsKi8gcmV0dXJuIG51bGw7IH0gLy8gbnVsbAorCQorCWlmKGRvam8ubGFuZy5pc09iamVjdChvYmopKXsKKwkJLy8gb2JqOiBPYmplY3QJCisJCXJldCA9IG5ldyBvYmouY29uc3RydWN0b3IoKTsKKwkJZm9yKGkgaW4gb2JqKXsKKwkJCWlmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXRbaV0pKXsKKwkJCQlyZXRbaV0gPSBkZWVwID8gZG9qby5sYW5nLnNoYWxsb3dDb3B5KG9ialtpXSwgZGVlcCkgOiBvYmpbaV07CisJCQl9CisJCX0KKwl9ZWxzZSBpZihkb2pvLmxhbmcuaXNBcnJheShvYmopKXsKKwkJLy8gb2JqOiBBcnJheQorCQlyZXQgPSBbXTsKKwkJZm9yKGk9MDsgaTxvYmoubGVuZ3RoOyBpKyspeworCQkJcmV0W2ldID0gZGVlcCA/IGRvam8ubGFuZy5zaGFsbG93Q29weShvYmpbaV0sIGRlZXApIDogb2JqW2ldOworCQl9CisJfWVsc2V7CisJCS8vIG9iajogT2JqZWN0CisJCXJldCA9IG9iajsKKwl9CisKKwlyZXR1cm4gcmV0OyAvLyBPYmplY3QKK30KKworZG9qby5sYW5nLmZpcnN0VmFsdWVkID0gZnVuY3Rpb24oLyogLi4uICovKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXNuJ3QgdW5kZWZpbmVkCisKKwlmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJaWYodHlwZW9mIGFyZ3VtZW50c1tpXSAhPSAidW5kZWZpbmVkIil7CisJCQlyZXR1cm4gYXJndW1lbnRzW2ldOyAvLyBPYmplY3QKKwkJfQorCX0KKwlyZXR1cm4gdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQKK30KKworZG9qby5sYW5nLmdldE9ialBhdGhWYWx1ZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9vYmpwYXRoLCAvKk9iamVjdD8qL2NvbnRleHQsIC8qQm9vbGVhbj8qL2NyZWF0ZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJR2V0cyBhIHZhbHVlIGZyb20gYSByZWZlcmVuY2Ugc3BlY2lmaWVkIGFzIGEgc3RyaW5nIGRlc2NyaXB0b3IsCisJLy8JCShlLmcuICJBLkIiKSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KKwkvLyBjb250ZXh0OiBpZiBub3Qgc3BlY2lmaWVkLCBkal9nbG9iYWwgaXMgdXNlZAorCS8vIGNyZWF0ZTogaWYgdHJ1ZSwgdW5kZWZpbmVkIG9iamVjdHMgaW4gdGhlIHBhdGggYXJlIGNyZWF0ZWQuCisJd2l0aChkb2pvLnBhcnNlT2JqUGF0aChvYmpwYXRoLCBjb250ZXh0LCBjcmVhdGUpKXsKKwkJcmV0dXJuIGRvam8uZXZhbFByb3AocHJvcCwgb2JqLCBjcmVhdGUpOyAvLyBPYmplY3QKKwl9Cit9CisKK2Rvam8ubGFuZy5zZXRPYmpQYXRoVmFsdWUgPSBmdW5jdGlvbigvKlN0cmluZyovb2JqcGF0aCwgLyphbnl0aGluZyovdmFsdWUsIC8qT2JqZWN0PyovY29udGV4dCwgLypCb29sZWFuPyovY3JlYXRlKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlTZXRzIGEgdmFsdWUgb24gYSByZWZlcmVuY2Ugc3BlY2lmaWVkIGFzIGEgc3RyaW5nIGRlc2NyaXB0b3IuCisJLy8JCShlLmcuICJBLkIiKSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4gVGhpcyBpcyBzaW1pbGFyIHRvIHN0cmFpZ2h0CisJLy8JCWFzc2lnbm1lbnQsIGV4Y2VwdCB0aGF0IHRoZSBvYmplY3Qgc3RydWN0dXJlIGluIHF1ZXN0aW9uIGNhbgorCS8vCQlvcHRpb25hbGx5IGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisJLy8JY29udGV4dDogaWYgbm90IHNwZWNpZmllZCwgZGpfZ2xvYmFsIGlzIHVzZWQKKwkvLwljcmVhdGU6IGlmIHRydWUsIHVuZGVmaW5lZCBvYmplY3RzIGluIHRoZSBwYXRoIGFyZSBjcmVhdGVkLgorCisJLy8gRklYTUU6IHdoeSBpcyB0aGlzIGZ1bmN0aW9uIHZhbHVhYmxlPyBJdCBzaG91bGQgYmUgc2NoZWR1bGVkIGZvcgorCS8vIHJlbW92YWwgb24gdGhlIGdyb3VuZHMgdGhhdCBkb2pvLnBhcnNlT2JqUGF0aCBkb2VzIG1vc3Qgb2YgaXQncyB3b3JrIGFuZAorCS8vIGlzIG1vcmUgc3RyYWlnaHRmb3J3YXJkIGFuZCBoYXMgZmV3ZXIgZGVwZW5kZW5jaWVzLiBBbHNvLCB0aGUgb3JkZXIgb2YKKwkvLyBhcmd1bWVudHMgaXMgYm9uZS1oZWFkZWQuICJjb250ZXh0IiBzaG91bGQgY2xlYXJseSBjb21lIGFmdGVyICJjcmVhdGUiLgorCS8vICpzaWdoKgorCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLnNldE9ialBhdGhWYWx1ZSIsICJ1c2UgZG9qby5wYXJzZU9ialBhdGggYW5kIHRoZSAnPScgb3BlcmF0b3IiLCAiMC42Iik7CisKKwlpZihhcmd1bWVudHMubGVuZ3RoIDwgNCl7CisJCWNyZWF0ZSA9IHRydWU7CisJfQorCXdpdGgoZG9qby5wYXJzZU9ialBhdGgob2JqcGF0aCwgY29udGV4dCwgY3JlYXRlKSl7CisJCWlmKG9iaiAmJiAoY3JlYXRlIHx8IChwcm9wIGluIG9iaikpKXsKKwkJCW9ialtwcm9wXSA9IHZhbHVlOworCQl9CisJfQorfQorCitkb2pvLnByb3ZpZGUoImRvam8uaW8uY29tbW9uIik7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOb3RlcyBhYm91dCBkb2pvLmlvIGRlc2lnbjoKKyAqCQorICoJVGhlIGRvam8uaW8uKiBwYWNrYWdlIGhhcyB0aGUgdW5lbnZpYWJsZSB0YXNrIG9mIG1ha2luZyBhIGxvdCBvZiBkaWZmZXJlbnQKKyAqCXR5cGVzIG9mIEkvTyBmZWVsIG5hdHVyYWwsIGRlc3BpdGUgYSB1bml2ZXJzYWwgbGFjayBvZiBnb29kIChvciBldmVuCisgKglyZWFzb25hYmxlISkgSS9PIGNhcGFiaWxpdHkgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuIFNvIGxldHMgcGluIHRoaXMgZG93bgorICoJYSBsaXR0bGUgYml0IGZ1cnRoZXIuCisgKgorICoJUmhpbm86CisgKgkJcGVyaGFwcyB0aGUgYmVzdCBzaXR1YXRpb24gYW55d2hlcmUuIEFjY2VzcyB0byBKYXZhIGNsYXNzZXMgYWxsb3dzIHlvdQorICoJCXRvIGRvIGFueXRoaW5nIG9uZSBtaWdodCB3YW50IGluIHRlcm1zIG9mIEkvTywgYm90aCBzeW5jaHJvbm91c2x5IGFuZAorICoJCWFzeW5jLiBDYW4gb3BlbiBUQ1Agc29ja2V0cyBhbmQgcGVyZm9ybSBsb3ctbGF0ZW5jeSBjbGllbnQvc2VydmVyCisgKgkJaW50ZXJhY3Rpb25zLiBIVFRQIHRyYW5zcG9ydCBpcyBhdmFpbGFibGUgdGhyb3VnaCBKYXZhIEhUVFAgY2xpZW50IGFuZAorICoJCXNlcnZlciBjbGFzc2VzLiBXaXNoIGl0IHdlcmUgYWx3YXlzIHRoaXMgZWFzeS4KKyAqCisgKgl4cGNzaGVsbDoKKyAqCQlYUENPTSBmb3IgSS9PLgorICoKKyAqCXNwaWRlcm1vbmtleToKKyAqCQlTLk8uTC4KKyAqCisgKglCcm93c2VyczoKKyAqCQlCcm93c2VycyBnZW5lcmFsbHkgZG8gbm90IHByb3ZpZGUgYW55IHVzZWFibGUgZmlsZXN5c3RlbSBhY2Nlc3MuIFdlIGFyZQorICoJCXRoZXJlZm9yZSBsaW1pdGVkIHRvIEhUVFAgZm9yIG1vdmluZyBpbmZvcm1hdGlvbiB0byBhbmQgZnJvbSBEb2pvCisgKgkJaW5zdGFuY2VzIGxpdmluZyBpbiBhIGJyb3dzZXIuCisgKgorICoJCVhNTEhUVFA6CisgKgkJCVN5bmMgb3IgYXN5bmMsIGFsbG93cyByZWFkaW5nIG9mIGFyYml0cmFyeSB0ZXh0IGZpbGVzIChpbmNsdWRpbmcKKyAqCQkJSlMsIHdoaWNoIGNhbiB0aGVuIGJlIGV2YWwoKSdkKSwgd3JpdGluZyByZXF1aXJlcyBzZXJ2ZXIKKyAqCQkJY29vcGVyYXRpb24gYW5kIGlzIGxpbWl0ZWQgdG8gSFRUUCBtZWNoYW5pc21zIChQT1NUIGFuZCBHRVQpLgorICoKKyAqCQk8aWZyYW1lPiBoYWNrczoKKyAqCQkJaWZyYW1lIGRvY3VtZW50IGhhY2tzIGFsbG93IGJyb3dzZXJzIHRvIGNvbW11bmljYXRlIGFzeW5jaHJvbm91c2x5CisgKgkJCXdpdGggYSBzZXJ2ZXIgdmlhIEhUVFAgUE9TVCBhbmQgR0VUIG9wZXJhdGlvbnMuIFdpdGggc2lnbmlmaWNhbnQKKyAqCQkJZWZmb3J0IGFuZCBzZXJ2ZXIgY29vcGVyYXRpb24sIGxvdy1sYXRlbmN5IGRhdGEgdHJhbnNpdCBiZXR3ZWVuCisgKgkJCWNsaWVudCBhbmQgc2VydmVyIGNhbiBiZSBhY2hlaXZlZCB2aWEgaWZyYW1lIG1lY2hhbmlzbXMgKHJlcHVic3ViKS4KKyAqCisgKgkJU1ZHOgorICoJCQlBZG9iZSdzIFNWRyB2aWV3ZXIgaW1wbGVtZW50cyBoZWxwZnVsIHByaW1pdGl2ZXMgZm9yIFhNTC1iYXNlZAorICoJCQlyZXF1ZXN0cywgYnV0IHJlY2VpcHQgb2YgYXJiaXRyYXJ5IHRleHQgZGF0YSBzZWVtcyB1bmxpa2VseSB3L28KKyAqCQkJPCFbQ0RBVEFbXV0+IHNlY3Rpb25zLgorICoKKyAqCisgKglBIGRpc2N1c3Npb24gYmV0d2VlbiBEeWxhbiwgTWFyaywgVG9tLCBhbmQgQWxleCBoZWxwZWQgdG8gbGF5IGRvd24gYSBsb3QKKyAqCXRoZSBJTyBBUEkgaW50ZXJmYWNlLiBBIHRyYW5zY3JpcHQgb2YgaXQgY2FuIGJlIGZvdW5kIGF0OgorICoJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvdmlld2N2cy92aWV3Y3ZzLnB5L2RvY3VtZW50cy9pcmMvaXJjX2lvX2FwaV9sb2cudHh0P3Jldj0zMDcmdmlldz1hdXRvCisgKgkKKyAqCUFsc28gcmVmZXJlbmNlZCBpbiB0aGUgZGVzaWduIG9mIHRoZSBBUEkgd2FzIHRoZSBET00gMyBMJlMgc3BlYzoKKyAqCQlodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1MUy0yMDA0MDQwNy9sb2FkLXNhdmUuaHRtbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gYSBtYXAgb2YgdGhlIGF2YWlsYWJsZSB0cmFuc3BvcnQgb3B0aW9ucy4gVHJhbnNwb3J0cyBzaG91bGQgYWRkIHRoZW1zZWx2ZXMKKy8vIGJ5IGNhbGxpbmcgYWRkKG5hbWUpCitkb2pvLmlvLnRyYW5zcG9ydHMgPSBbXTsKK2Rvam8uaW8uaGRsckZ1bmNOYW1lcyA9IFsgImxvYWQiLCAiZXJyb3IiLCAidGltZW91dCIgXTsgLy8gd2UncmUgb21pdHRpbmcgYSBwcm9ncmVzcygpIGV2ZW50IGZvciBub3cKKworZG9qby5pby5SZXF1ZXN0ID0gZnVuY3Rpb24oLypTdHJpbmcqLyB1cmwsIC8qU3RyaW5nKi8gbWltZXR5cGUsIC8qU3RyaW5nKi8gdHJhbnNwb3J0LCAvKlN0cmluZyBvciBCb29sZWFuKi8gY2hhbmdlVXJsKXsKKy8vIHN1bW1hcnk6CisvLwkJQ29uc3RydWN0cyBhIFJlcXVlc3Qgb2JqZWN0IHRoYXQgaXMgdXNlZCBieSBkb2pvLmlvLmJpbmQoKS4KKy8vIGRlc2NyaXB0aW9uOgorLy8JCWRvam8uaW8uYmluZCgpIHdpbGwgY3JlYXRlIG9uZSBvZiB0aGVzZSBmb3IgeW91IGlmCisvLwkJeW91IGNhbGwgZG9qby5pby5iaW5kKCkgd2l0aCBhbiBwbGFpbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmluZCBwYXJhbWV0ZXJzLgorLy8JCVRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgdGFrZSB0aGUgYXJndW1lbnRzIHNwZWNpZmllZCwgb3IgYW4gT2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgeW91CisvLwkJd2FudCB0byB1c2UgdG8gY3JlYXRlIHRoZSBkb2pvLmlvLlJlcXVlc3QgKHNpbWlsYXIgdG8gaG93IGRvam8uaW8uYmluZCgpIGlzIGNhbGxlZC4KKy8vCQlUaGUgbmFtZWQgcGFyYW1ldGVycyB0byB0aGlzIGNvbnN0cnVjdG9yIHJlcHJlc2VudCB0aGUgbWluaW11bSBzZXQgb2YgcGFyYW1ldGVycyBuZWVkCisJaWYoKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkmJihhcmd1bWVudHNbMF0uY29uc3RydWN0b3IgPT0gT2JqZWN0KSl7CisJCXRoaXMuZnJvbUt3QXJncyhhcmd1bWVudHNbMF0pOworCX1lbHNleworCQl0aGlzLnVybCA9IHVybDsKKwkJaWYobWltZXR5cGUpeyB0aGlzLm1pbWV0eXBlID0gbWltZXR5cGU7IH0KKwkJaWYodHJhbnNwb3J0KXsgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7IH0KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA+PSA0KXsgdGhpcy5jaGFuZ2VVcmwgPSBjaGFuZ2VVcmw7IH0KKwl9Cit9CisKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5pby5SZXF1ZXN0LCB7CisKKwkvKiogVGhlIFVSTCB0byBoaXQgKi8KKwl1cmw6ICIiLAorCQorCS8qKiBUaGUgbWltZSB0eXBlIHVzZWQgdG8gaW50ZXJycHJldCB0aGUgcmVzcG9uc2UgYm9keSAqLworCW1pbWV0eXBlOiAidGV4dC9wbGFpbiIsCisJCisJLyoqIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKi8KKwltZXRob2Q6ICJHRVQiLAorCQorCS8qKiBBbiBPYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgdG8gYmUgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCAqLworCWNvbnRlbnQ6IHVuZGVmaW5lZCwgLy8gT2JqZWN0CisJCisJLyoqIFRoZSB0cmFuc3BvcnQgbWVkaXVtIHRvIHVzZSAqLworCXRyYW5zcG9ydDogdW5kZWZpbmVkLCAvLyBTdHJpbmcKKwkKKwkvKiogSWYgZGVmaW5lZCB0aGUgVVJMIG9mIHRoZSBwYWdlIGlzIHBoeXNpY2FsbHkgY2hhbmdlZCAqLworCWNoYW5nZVVybDogdW5kZWZpbmVkLCAvLyBTdHJpbmcKKwkKKwkvKiogQSBmb3JtIG5vZGUgdG8gdXNlIGluIHRoZSByZXF1ZXN0ICovCisJZm9ybU5vZGU6IHVuZGVmaW5lZCwgLy8gSFRNTEZvcm1FbGVtZW50CisJCisJLyoqIFdoZXRoZXIgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIG1hZGUgc3luY2hyb25vdXNseSAqLworCXN5bmM6IGZhbHNlLAorCQorCWJpbmRTdWNjZXNzOiBmYWxzZSwKKworCS8qKiBDYWNoZS9sb29rIGZvciB0aGUgcmVxdWVzdCBpbiB0aGUgY2FjaGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVxdWVzdD8KKwkgKiAgTk9URTogdGhpcyBpc24ndCBhIGJyb3dzZXIgY2FjaGUsIHRoaXMgaXMgaW50ZXJuYWwgYW5kIHdvdWxkIG9ubHkgY2FjaGUgaW4tcGFnZQorCSAqLworCXVzZUNhY2hlOiBmYWxzZSwKKworCS8qKiBQcmV2ZW50IHRoZSBicm93c2VyIGZyb20gY2FjaGluZyB0aGlzIGJ5IGFkZGluZyBhIHF1ZXJ5IHN0cmluZyBhcmd1bWVudCB0byB0aGUgVVJMICovCisJcHJldmVudENhY2hlOiBmYWxzZSwKKworCWpzb25GaWx0ZXI6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJaWYoCSh0aGlzLm1pbWV0eXBlID09ICJ0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCIpfHwKKwkJCSh0aGlzLm1pbWV0eXBlID09ICJhcHBsaWNhdGlvbi9qc29uLWNvbW1lbnQtZmlsdGVyZWQiKQorCQkpeworCQkJdmFyIGNTdGFydElkeCA9IHZhbHVlLmluZGV4T2YoIlwvKiIpOworCQkJdmFyIGNFbmRJZHggPSB2YWx1ZS5sYXN0SW5kZXhPZigiKlwvIik7CisJCQlpZigoY1N0YXJ0SWR4ID09IC0xKXx8KGNFbmRJZHggPT0gLTEpKXsKKwkJCQlkb2pvLmRlYnVnKCJ5b3VyIEpTT04gd2Fzbid0IGNvbW1lbnQgZmlsdGVyZWQhIik7IC8vIEZJWE1FOiB0aHJvdyBleGNlcHRpb24gaW5zdGVhZD8KKwkJCQlyZXR1cm4gIiI7CisJCQl9CisJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGNTdGFydElkeCsyLCBjRW5kSWR4KTsKKwkJfQorCQlkb2pvLmRlYnVnKCJwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBtaW1ldHlwZSBvZiB0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCB0byBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzIHdpdGggSlNPTiBlbmRwb2ludHMiKTsKKwkJcmV0dXJuIHZhbHVlOworCX0sCisJCisJLy8gZXZlbnRzIHN0dWZmCisJbG9hZDogZnVuY3Rpb24oLypTdHJpbmcqL3R5cGUsIC8qT2JqZWN0Ki9kYXRhLCAvKk9iamVjdCovdHJhbnNwb3J0SW1wbGVtZW50YXRpb24sIC8qT2JqZWN0Ki9rd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbGVkIG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhIGJpbmQuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAibG9hZCIKKwkJLy8JCWRhdGE6IE9iamVjdAorCQkvLwkJCQlUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBiaW5kLiBUaGUgYWN0dWFsIHN0cnVjdHVyZQorCQkvLwkJCQlvZiB0aGUgZGF0YSBvYmplY3Qgd2lsbCBkZXBlbmQgb24gdGhlIG1pbWV0eXBlIHRoYXQgd2FzIGdpdmVuIHRvIGJpbmQKKwkJLy8JCQkJaW4gdGhlIGJpbmQgYXJndW1lbnRzLgorCQkvLwkJdHJhbnNwb3J0SW1wbGVtZW50YXRpb246IE9iamVjdAorCQkvLwkJCQlUaGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LiBTdHJ1Y3R1cmUgaXMgZGVwZWRlbnQKKwkJLy8JCQkJb24gdGhlIHRyYW5zcG9ydC4gRm9yIFhNTEhUVFBUcmFuc3BvcnQgKGRvam8uaW8uQnJvd3NlcklPKSwgaXQgd2lsbCBiZSB0aGUKKwkJLy8JCQkJWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZyb20gdGhlIGJyb3dzZXIuCisJCS8vCQlrd0FyZ3M6IE9iamVjdAorCQkvLwkJCQlPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBnaXZlbiB0byB0aGUKKwkJLy8JCQkJYmluZCBjYWxsLiBVc2VmdWwgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgc3RhdGUgZnJvbSB3aGVuIGJpbmQKKwkJLy8JCQkJd2FzIGNhbGxlZC4KKwl9LAorCWVycm9yOiBmdW5jdGlvbigvKlN0cmluZyovdHlwZSwgLypPYmplY3QqL2Vycm9yLCAvKk9iamVjdCovdHJhbnNwb3J0SW1wbGVtZW50YXRpb24sIC8qT2JqZWN0Ki9rd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCBhIGJpbmQuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAiZXJyb3IiCisJCS8vCQllcnJvcjogT2JqZWN0CisJCS8vCQkJCVRoZSBlcnJvciBvYmplY3QuIFNob3VsZCBiZSBhIGRvam8uaW8uRXJyb3Igb2JqZWN0LCBidXQgbm90IGd1YXJhbnRlZWQuCisJCS8vCQl0cmFuc3BvcnRJbXBsZW1lbnRhdGlvbjogT2JqZWN0CisJCS8vCQkJCVRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhciB0cmFuc3BvcnQuIFN0cnVjdHVyZSBpcyBkZXBlZGVudAorCQkvLwkJCQlvbiB0aGUgdHJhbnNwb3J0LiBGb3IgWE1MSFRUUFRyYW5zcG9ydCAoZG9qby5pby5Ccm93c2VySU8pLCBpdCB3aWxsIGJlIHRoZQorCQkvLwkJCQlYTUxIdHRwUmVxdWVzdCBvYmplY3QgZnJvbSB0aGUgYnJvd3Nlci4KKwkJLy8JCWt3QXJnczogT2JqZWN0CisJCS8vCQkJCU9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGdpdmVuIHRvIHRoZQorCQkvLwkJCQliaW5kIGNhbGwuIFVzZWZ1bCBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBzdGF0ZSBmcm9tIHdoZW4gYmluZAorCQkvLwkJCQl3YXMgY2FsbGVkLgorCX0sCisJdGltZW91dDogZnVuY3Rpb24oLypTdHJpbmcqL3R5cGUsIC8qT2JqZWN0Ki9lbXB0eSwgLypPYmplY3QqL3RyYW5zcG9ydEltcGxlbWVudGF0aW9uLCAvKk9iamVjdCova3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggYSBiaW5kLiBPbmx5IGltcGxlbWVudGVkIGluIGNlcnRhaW4gdHJhbnNwb3J0cyBhdCB0aGlzIHRpbWUuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAidGltZW91dCIKKwkJLy8JCWVtcHR5OiBPYmplY3QKKwkJLy8JCQkJU2hvdWxkIGJlIG51bGwuIEp1c3QgYSBzcGFjZXIgYXJndW1lbnQgc28gdGhhdCBsb2FkLCBlcnJvciwgdGltZW91dCBhbmQgaGFuZGxlIGhhdmUgdGhlCisJCS8vCQkJCXNhbWUgc2lnbmF0dXJlcy4KKwkJLy8JCXRyYW5zcG9ydEltcGxlbWVudGF0aW9uOiBPYmplY3QKKwkJLy8JCQkJVGhlIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydC4gU3RydWN0dXJlIGlzIGRlcGVkZW50CisJCS8vCQkJCW9uIHRoZSB0cmFuc3BvcnQuIEZvciBYTUxIVFRQVHJhbnNwb3J0IChkb2pvLmlvLkJyb3dzZXJJTyksIGl0IHdpbGwgYmUgdGhlCisJCS8vCQkJCVhNTEh0dHBSZXF1ZXN0IG9iamVjdCBmcm9tIHRoZSBicm93c2VyLiBNYXkgYmUgbnVsbCBmb3IgdGhlIHRpbWVvdXQgY2FzZSBmb3IKKwkJLy8JCQkJc29tZSB0cmFuc3BvcnRzLgorCQkvLwkJa3dBcmdzOiBPYmplY3QKKwkJLy8JCQkJT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdGhlCisJCS8vCQkJCWJpbmQgY2FsbC4gVXNlZnVsIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHN0YXRlIGZyb20gd2hlbiBiaW5kCisJCS8vCQkJCXdhcyBjYWxsZWQuCisJfSwKKwloYW5kbGU6IGZ1bmN0aW9uKC8qU3RyaW5nKi90eXBlLCAvKk9iamVjdCovZGF0YSwgLypPYmplY3QqL3RyYW5zcG9ydEltcGxlbWVudGF0aW9uLCAvKk9iamVjdCova3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVRoZSBoYW5kbGUgbWV0aG9kIGNhbiBiZSBkZWZpbmVkIGluc3RlYWQgb2YgZGVmaW5pbmcgc2VwYXJhdGUgbG9hZCwgZXJyb3IgYW5kIHRpbWVvdXQKKwkJLy8JCWNhbGxiYWNrcy4KKwkJLy8JCXR5cGU6IFN0cmluZworCQkvLwkJCQlBIHN0cmluZyB3aXRoIHRoZSB0eXBlIG9mIGNhbGxiYWNrOiAibG9hZCIsICJlcnJvciIsIG9yICJ0aW1lb3V0Ii4KKwkJLy8JCWRhdGE6IE9iamVjdAorCQkvLwkJCQlTZWUgdGhlIGFib3ZlIGNhbGxiYWNrcyBmb3Igd2hhdCB0aGlzIHBhcmFtZXRlciBjb3VsZCBiZS4KKwkJLy8JCXRyYW5zcG9ydEltcGxlbWVudGF0aW9uOiBPYmplY3QKKwkJLy8JCQkJVGhlIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydC4gU3RydWN0dXJlIGlzIGRlcGVkZW50CisJCS8vCQkJCW9uIHRoZSB0cmFuc3BvcnQuIEZvciBYTUxIVFRQVHJhbnNwb3J0IChkb2pvLmlvLkJyb3dzZXJJTyksIGl0IHdpbGwgYmUgdGhlCisJCS8vCQkJCVhNTEh0dHBSZXF1ZXN0IG9iamVjdCBmcm9tIHRoZSBicm93c2VyLgorCQkvLwkJa3dBcmdzOiBPYmplY3QKKwkJLy8JCQkJT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdGhlCisJCS8vCQkJCWJpbmQgY2FsbC4gVXNlZnVsIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHN0YXRlIGZyb20gd2hlbiBiaW5kCisJCS8vCQkJCXdhcyBjYWxsZWQuCQorCX0sCisKKwkvL0ZJWE1FOiBjaGFuZ2UgSWZyYW1lSU8uanMgdG8gdXNlIHRpbWVvdXRzPworCS8vIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IHVudGlsIGZpcmluZyBhIHRpbWVvdXQgY2FsbGJhY2suCisJLy8gSWYgaXQgaXMgemVybywgdGhhdCBtZWFucywgZG9uJ3QgZG8gYSB0aW1lb3V0IGNoZWNrLgorCXRpbWVvdXRTZWNvbmRzOiAwLAorCQorCS8vIHRoZSBhYm9ydCBtZXRob2QgbmVlZHMgdG8gYmUgZmlsbGVkIGluIGJ5IHRoZSB0cmFuc3BvcnQgdGhhdCBhY2NlcHRzIHRoZQorCS8vIGJpbmQoKSByZXF1ZXN0CisJYWJvcnQ6IGZ1bmN0aW9uKCl7IH0sCisJCisJLy8gYmFja0J1dHRvbjogZnVuY3Rpb24oKXsgfSwKKwkvLyBmb3J3YXJkQnV0dG9uOiBmdW5jdGlvbigpeyB9LAorCisJZnJvbUt3QXJnczogZnVuY3Rpb24oLypPYmplY3QqLyBrd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ3JlYXRlcyBhIGRvam8uaW8uUmVxdWVzdCBmcm9tIGEgc2ltcGxlIG9iamVjdCAoa3dBcmdzIG9iamVjdCkuCisKKwkJLy8gbm9ybWFsaXplIGFyZ3MKKwkJaWYoa3dBcmdzWyJ1cmwiXSl7IGt3QXJncy51cmwgPSBrd0FyZ3MudXJsLnRvU3RyaW5nKCk7IH0KKwkJaWYoa3dBcmdzWyJmb3JtTm9kZSJdKSB7IGt3QXJncy5mb3JtTm9kZSA9IGRvam8uYnlJZChrd0FyZ3MuZm9ybU5vZGUpOyB9CisJCWlmKCFrd0FyZ3NbIm1ldGhvZCJdICYmIGt3QXJnc1siZm9ybU5vZGUiXSAmJiBrd0FyZ3NbImZvcm1Ob2RlIl0ubWV0aG9kKSB7CisJCQlrd0FyZ3MubWV0aG9kID0ga3dBcmdzWyJmb3JtTm9kZSJdLm1ldGhvZDsKKwkJfQorCQkKKwkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJaWYoIWt3QXJnc1siaGFuZGxlIl0gJiYga3dBcmdzWyJoYW5kbGVyIl0peyBrd0FyZ3MuaGFuZGxlID0ga3dBcmdzLmhhbmRsZXI7IH0KKwkJaWYoIWt3QXJnc1sibG9hZCJdICYmIGt3QXJnc1sibG9hZGVkIl0peyBrd0FyZ3MubG9hZCA9IGt3QXJncy5sb2FkZWQ7IH0KKwkJaWYoIWt3QXJnc1siY2hhbmdlVXJsIl0gJiYga3dBcmdzWyJjaGFuZ2VVUkwiXSkgeyBrd0FyZ3MuY2hhbmdlVXJsID0ga3dBcmdzLmNoYW5nZVVSTDsgfQorCisJCS8vIGVuY29kaW5nIGZ1biEKKwkJa3dBcmdzLmVuY29kaW5nID0gZG9qby5sYW5nLmZpcnN0VmFsdWVkKGt3QXJnc1siZW5jb2RpbmciXSwgZGpDb25maWdbImJpbmRFbmNvZGluZyJdLCAiIik7CisKKwkJa3dBcmdzLnNlbmRUcmFuc3BvcnQgPSBkb2pvLmxhbmcuZmlyc3RWYWx1ZWQoa3dBcmdzWyJzZW5kVHJhbnNwb3J0Il0sIGRqQ29uZmlnWyJpb1NlbmRUcmFuc3BvcnQiXSwgZmFsc2UpOworCisJCXZhciBpc0Z1bmN0aW9uID0gZG9qby5sYW5nLmlzRnVuY3Rpb247CisJCWZvcih2YXIgeD0wOyB4PGRvam8uaW8uaGRsckZ1bmNOYW1lcy5sZW5ndGg7IHgrKyl7CisJCQl2YXIgZm4gPSBkb2pvLmlvLmhkbHJGdW5jTmFtZXNbeF07CisJCQlpZihrd0FyZ3NbZm5dICYmIGlzRnVuY3Rpb24oa3dBcmdzW2ZuXSkpeyBjb250aW51ZTsgfQorCQkJaWYoa3dBcmdzWyJoYW5kbGUiXSAmJiBpc0Z1bmN0aW9uKGt3QXJnc1siaGFuZGxlIl0pKXsKKwkJCQlrd0FyZ3NbZm5dID0ga3dBcmdzLmhhbmRsZTsKKwkJCX0KKwkJCS8vIGhhbmRsZXIgaXMgYWxpYXNlZCBhYm92ZSwgc2hvdWxkbid0IG5lZWQgdGhpcyBjaGVjaworCQkJLyogZWxzZSBpZihkb2pvLmxhbmcuaXNPYmplY3Qoa3dBcmdzLmhhbmRsZXIpKXsKKwkJCQlpZihpc0Z1bmN0aW9uKGt3QXJncy5oYW5kbGVyW2ZuXSkpeworCQkJCQlrd0FyZ3NbZm5dID0ga3dBcmdzLmhhbmRsZXJbZm5dfHxrd0FyZ3MuaGFuZGxlclsiaGFuZGxlIl18fGZ1bmN0aW9uKCl7fTsKKwkJCQl9CisJCQl9Ki8KKwkJfQorCQlkb2pvLmxhbmcubWl4aW4odGhpcywga3dBcmdzKTsKKwl9CisKK30pOworCitkb2pvLmlvLkVycm9yID0gZnVuY3Rpb24oLypTdHJpbmcqLyBtc2csIC8qU3RyaW5nKi8gdHlwZSwgLypOdW1iZXIqL251bSl7CisJLy8gc3VtbWFyeToKKwkvLwkJQ29uc3RydWN0cyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYmluZCBlcnJvci4KKwl0aGlzLm1lc3NhZ2UgPSBtc2c7CisJdGhpcy50eXBlID0gIHR5cGUgfHwgInVua25vd24iOyAvLyBtdXN0IGJlIG9uZSBvZiAiaW8iLCAicGFyc2UiLCAidW5rbm93biIKKwl0aGlzLm51bWJlciA9IG51bSB8fCAwOyAvLyBwZXItc3Vic3RyYXRlIGVycm9yIG51bWJlciwgbm90IG5vcm1hbGl6ZWQKK30KKworZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlVc2VkIHRvIHJlZ2lzdGVyIHRyYW5zcG9ydHMgdGhhdCBjYW4gc3VwcG9ydCBiaW5kIGNhbGxzLgorCXRoaXMucHVzaChuYW1lKTsKKwkvLyBGSVhNRTogZG8gd2UgbmVlZCB0byBoYW5kbGUgdGhpbmdzIHRoYXQgYXJlbid0IGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUKKwkvLyBkb2pvLmlvIG1vZHVsZT8gKHNheSwgZG9qby5pby5mb28uZm9vVHJhbnNwb3J0PykKKwl0aGlzW25hbWVdID0gZG9qby5pb1tuYW1lXTsKK30KKworLy8gYmluZGluZyBpbnRlcmZhY2UsIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyByZWdpc3RlciB0aGVpciBjYXBhYmlsaXRpZXMKKy8vIGFuZCB0aGUgYmluZCgpIG1ldGhvZCBkaXNwYXRjaGVzCitkb2pvLmlvLmJpbmQgPSBmdW5jdGlvbigvKmRvam8uaW8uUmVxdWVzdCBvciBPYmplY3QqL3JlcXVlc3QpeworCS8vIHN1bW1hcnk6CisJLy8JCUJpbmRpbmcgaW50ZXJmYWNlIGZvciBJTy4gTG9hZGluZyBkaWZmZXJlbnQgSU8gdHJhbnNwb3J0cywgbGlrZQorCS8vCQlkb2pvLmlvLkJyb3dzZXJJTyBvciBkb2pvLmlvLklmcmFtZUlPLCB3aWxsIHJlZ2lzdGVyIHdpdGggYmluZAorCS8vCQl0byBoYW5kbGUgcGFydGljdWxhciB0eXBlcyBvZiBiaW5kIGNhbGxzLgorCS8vCQlyZXF1ZXN0OiBPYmplY3QKKwkvLwkJCQlPYmplY3QgY29udGFpbmluZyBiaW5kIGFyZ3VtZW50cy4gVGhpcyBvYmplY3QgaXMgY29udmVydGVkIHRvCisJLy8JCQkJYSBkb2pvLmlvLlJlcXVlc3Qgb2JqZWN0LCBhbmQgdGhhdCByZXF1ZXN0IG9iamVjdCBpcyB0aGUgcmV0dXJuCisJLy8JCQkJdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorCWlmKCEocmVxdWVzdCBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpeworCQl0cnl7CisJCQlyZXF1ZXN0ID0gbmV3IGRvam8uaW8uUmVxdWVzdChyZXF1ZXN0KTsKKwkJfWNhdGNoKGUpeyBkb2pvLmRlYnVnKGUpOyB9CisJfQorCisJLy8gaWYgdGhlIHJlcXVlc3QgYXNrcyBmb3IgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLCB1c2UgaXQKKwl2YXIgdHNOYW1lID0gIiI7CisJaWYocmVxdWVzdFsidHJhbnNwb3J0Il0peworCQl0c05hbWUgPSByZXF1ZXN0WyJ0cmFuc3BvcnQiXTsKKwkJaWYoIXRoaXNbdHNOYW1lXSl7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgIk5vIGRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIKKwkJCQkrIHJlcXVlc3RbInRyYW5zcG9ydCJdICsgIicuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKKwkJfQorCQlpZighdGhpc1t0c05hbWVdLmNhbkhhbmRsZShyZXF1ZXN0KSl7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgImRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIKKwkJCQkrIHJlcXVlc3RbInRyYW5zcG9ydCJdICsgIicgY2Fubm90IGhhbmRsZSB0aGlzIHR5cGUgb2YgcmVxdWVzdC4iKTsKKwkJCXJldHVybiByZXF1ZXN0OwkvL2Rvam8uaW8uUmVxdWVzdAorCQl9CisJfWVsc2V7CisJCS8vIG90aGVyd2lzZSB3ZSBkbyBvdXIgYmVzdCB0byBhdXRvLWRldGVjdCB3aGF0IGF2YWlsYWJsZSB0cmFuc3BvcnRzCisJCS8vIHdpbGwgaGFuZGxlIAorCQlmb3IodmFyIHg9MDsgeDxkb2pvLmlvLnRyYW5zcG9ydHMubGVuZ3RoOyB4KyspeworCQkJdmFyIHRtcCA9IGRvam8uaW8udHJhbnNwb3J0c1t4XTsKKwkJCWlmKCh0aGlzW3RtcF0pJiYodGhpc1t0bXBdLmNhbkhhbmRsZShyZXF1ZXN0KSkpeworCQkJCXRzTmFtZSA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZih0c05hbWUgPT0gIiIpeworCQkJZG9qby5pby5zZW5kQmluZEVycm9yKHJlcXVlc3QsICJOb25lIG9mIHRoZSBsb2FkZWQgdHJhbnNwb3J0cyBmb3IgZG9qby5pby5iaW5kKCkiCisJCQkJKyAiIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKKwkJfQorCX0KKwl0aGlzW3RzTmFtZV0uYmluZChyZXF1ZXN0KTsKKwlyZXF1ZXN0LmJpbmRTdWNjZXNzID0gdHJ1ZTsKKwlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKK30KKworZG9qby5pby5zZW5kQmluZEVycm9yID0gZnVuY3Rpb24oLyogT2JqZWN0ICovcmVxdWVzdCwgLyogU3RyaW5nICovbWVzc2FnZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJVXNlZCBpbnRlcm5hbGx5IGJ5IGRvam8uaW8uYmluZCgpIHRvIHJldHVybi9yYWlzZSBhIGJpbmQgZXJyb3IuCisKKwkvL05lZWQgdG8gYmUgY2FyZWZ1bCBzaW5jZSBub3QgYWxsIGhvc3RlbnZzIHN1cHBvcnQgc2V0VGltZW91dC4KKwlpZigodHlwZW9mIHJlcXVlc3QuZXJyb3IgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgcmVxdWVzdC5oYW5kbGUgPT0gImZ1bmN0aW9uIikKKwkJJiYgKHR5cGVvZiBzZXRUaW1lb3V0ID09ICJmdW5jdGlvbiIgfHwgdHlwZW9mIHNldFRpbWVvdXQgPT0gIm9iamVjdCIpKXsKKwkJdmFyIGVycm9yT2JqZWN0ID0gbmV3IGRvam8uaW8uRXJyb3IobWVzc2FnZSk7CisJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCXJlcXVlc3RbKHR5cGVvZiByZXF1ZXN0LmVycm9yID09ICJmdW5jdGlvbiIpID8gImVycm9yIiA6ICJoYW5kbGUiXSgiZXJyb3IiLCBlcnJvck9iamVjdCwgbnVsbCwgcmVxdWVzdCk7CisJCX0sIDUwKTsKKwl9ZWxzZXsKKwkJZG9qby5yYWlzZShtZXNzYWdlKTsKKwl9Cit9CisKK2Rvam8uaW8ucXVldWVCaW5kID0gZnVuY3Rpb24oLypkb2pvLmlvLlJlcXVlc3Qgb3IgT2JqZWN0Ki9yZXF1ZXN0KXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlxdWV1ZUJpbmQgd2lsbCB1c2UgZG9qby5pby5iaW5kKCkgYnV0IGd1YXJhbnRlZSB0aGF0IG9ubHkgb25lIGJpbmQKKwkvLwkJY2FsbCBpcyBoYW5kbGVkIGF0IGEgdGltZS4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLwkJSWYgcXVldWVCaW5kIGlzIGNhbGxlZCB3aGlsZSBhIGJpbmQgY2FsbAorCS8vCQlpcyBpbiBwcm9jZXNzLCBpdCB3aWxsIHF1ZXVlIHVwIHRoZSBvdGhlciBjYWxscyB0byBiaW5kIGFuZCBjYWxsIHRoZW0KKwkvLwkJaW4gb3JkZXIgYXMgYmluZCBjYWxscyBjb21wbGV0ZS4KKwkvLwkJcmVxdWVzdDogT2JqZWN0CisJLy8JCQlTYW1lIHNvcnQgb2YgcmVxdWVzdCBvYmplY3QgYXMgdXNlZCBmb3IgZG9qby5pby5iaW5kKCkuCisJaWYoIShyZXF1ZXN0IGluc3RhbmNlb2YgZG9qby5pby5SZXF1ZXN0KSl7CisJCXRyeXsKKwkJCXJlcXVlc3QgPSBuZXcgZG9qby5pby5SZXF1ZXN0KHJlcXVlc3QpOworCQl9Y2F0Y2goZSl7IGRvam8uZGVidWcoZSk7IH0KKwl9CisKKwkvLyBtYWtlIHN1cmUgd2UgZ2V0IGNhbGxlZCBpZi93aGVuIHdlIGdldCBhIHJlc3BvbnNlCisJdmFyIG9sZExvYWQgPSByZXF1ZXN0LmxvYWQ7CisJcmVxdWVzdC5sb2FkID0gZnVuY3Rpb24oKXsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSBmYWxzZTsKKwkJdmFyIHJldCA9IG9sZExvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdmFyIG9sZEVyciA9IHJlcXVlc3QuZXJyb3I7CisJcmVxdWVzdC5lcnJvciA9IGZ1bmN0aW9uKCl7CisJCWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisJCXZhciByZXQgPSBvbGRFcnIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZG9qby5pby5fYmluZFF1ZXVlLnB1c2gocmVxdWVzdCk7CisJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJcmV0dXJuIHJlcXVlc3Q7IC8vZG9qby5pby5SZXF1ZXN0Cit9CisKK2Rvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZCA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwlQcml2YXRlIG1ldGhvZCB1c2VkIGJ5IGRvam8uaW8ucXVldWVCaW5kKCkuCisJaWYoIWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0KXsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSB0cnVlOworCQlpZihkb2pvLmlvLl9iaW5kUXVldWUubGVuZ3RoID4gMCl7CisJCQlkb2pvLmlvLmJpbmQoZG9qby5pby5fYmluZFF1ZXVlLnNoaWZ0KCkpOworCQl9ZWxzZXsKKwkJCWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisJCX0KKwl9Cit9Citkb2pvLmlvLl9iaW5kUXVldWUgPSBbXTsKK2Rvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisKK2Rvam8uaW8uYXJnc0Zyb21NYXAgPSBmdW5jdGlvbigvKk9iamVjdCovbWFwLCAvKlN0cmluZz8qL2VuY29kaW5nLCAvKlN0cmluZz8qL2xhc3QpeworCS8vIHN1bW1hcnk6CisJLy8JCUNvbnZlcnRzIG5hbWUvdmFsdWVzIHBhaXJzIGluIHRoZSBtYXAgb2JqZWN0IHRvIGFuIFVSTC1lbmNvZGVkIHN0cmluZworCS8vCQl3aXRoIGZvcm1hdCBvZiBuYW1lMT12YWx1ZTEmbmFtZTI9dmFsdWUyLi4uCisJLy8JCW1hcDogT2JqZWN0CisJLy8JCQlPYmplY3QgdGhhdCBoYXMgdGhlIGNvbnRhaW5zIHRoZSBuYW1lcyBhbmQgdmFsdWVzLgorCS8vCQllbmNvZGluZzogU3RyaW5nPworCS8vCQkJU3RyaW5nIHRvIHNwZWNpZnkgaG93IHRvIGVuY29kZSB0aGUgbmFtZSBhbmQgdmFsdWUuIElmIHRoZSBlbmNvZGluZyBzdHJpbmcKKwkvLwkJCWNvbnRhaW5zICJ1dGYiIChjYXNlLWluc2Vuc2l0aXZlKSwgdGhlbiBlbmNvZGVVUklDb21wb25lbnQgaXMgdXNlZC4gT3RoZXJ3aXNlCisJLy8JCQlkb2pvLnN0cmluZy5lbmNvZGVBc2NpaSBpcyB1c2VkLgorCS8vCQlsYXN0OiBTdHJpbmc/CisJLy8JCQlUaGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGxpc3QuIEhlbHBzIHdpdGggZmluYWwgc3RyaW5nIGZvcm1hdHRpbmc/CisJdmFyIGVuYyA9IC91dGYvaS50ZXN0KGVuY29kaW5nfHwiIikgPyBlbmNvZGVVUklDb21wb25lbnQgOiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaTsKKwl2YXIgbWFwcGVkID0gW107CisJdmFyIGNvbnRyb2wgPSBuZXcgT2JqZWN0KCk7CisJZm9yKHZhciBuYW1lIGluIG1hcCl7CisJCXZhciBkb21hcCA9IGZ1bmN0aW9uKGVsdCl7CisJCQl2YXIgdmFsID0gZW5jKG5hbWUpKyI9IitlbmMoZWx0KTsKKwkJCW1hcHBlZFsobGFzdCA9PSBuYW1lKSA/ICJwdXNoIiA6ICJ1bnNoaWZ0Il0odmFsKTsKKwkJfQorCQlpZighY29udHJvbFtuYW1lXSl7CisJCQl2YXIgdmFsdWUgPSBtYXBbbmFtZV07CisJCQkvLyBGSVhNRTogc2hvdWxkIGJlIGlzQXJyYXlMaWtlPworCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHZhbHVlKSl7CisJCQkJZG9qby5sYW5nLmZvckVhY2godmFsdWUsIGRvbWFwKTsKKwkJCX1lbHNleworCQkJCWRvbWFwKHZhbHVlKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbWFwcGVkLmpvaW4oIiYiKTsgLy9TdHJpbmcKK30KKworZG9qby5pby5zZXRJRnJhbWVTcmMgPSBmdW5jdGlvbigvKkRPTU5vZGUqLyBpZnJhbWUsIC8qU3RyaW5nKi8gc3JjLCAvKkJvb2xlYW4qLyByZXBsYWNlKXsKKwkvL3N1bW1hcnk6CisJLy8JCVNldHMgdGhlIFVSTCB0aGF0IGlzIGxvYWRlZCBpbiBhbiBJRnJhbWUuIFRoZSByZXBsYWNlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgorCS8vCQlsb2NhdGlvbi5yZXBsYWNlKCkgc2hvdWxkIGJlIHVzZWQgd2hlbiBjaGFuZ2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIGlmcmFtZS4KKwl0cnl7CisJCXZhciByID0gZG9qby5yZW5kZXIuaHRtbDsKKwkJLy8gZG9qby5kZWJ1ZyhpZnJhbWUpOworCQlpZighcmVwbGFjZSl7CisJCQlpZihyLnNhZmFyaSl7CisJCQkJaWZyYW1lLmxvY2F0aW9uID0gc3JjOworCQkJfWVsc2V7CisJCQkJZnJhbWVzW2lmcmFtZS5uYW1lXS5sb2NhdGlvbiA9IHNyYzsKKwkJCX0KKwkJfWVsc2V7CisJCQkvLyBGdW4gd2l0aCBET00gMCBpbmNvbXBhdGliaWxpdGllcyEKKwkJCXZhciBpZG9jOworCQkJaWYoci5pZSl7CisJCQkJaWRvYyA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OworCQkJfWVsc2UgaWYoci5zYWZhcmkpeworCQkJCWlkb2MgPSBpZnJhbWUuZG9jdW1lbnQ7CisJCQl9ZWxzZXsgLy8gIGlmKHIubW96KXsKKwkJCQlpZG9jID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7CisJCQl9CisKKwkJCS8vRm9yIFNhZmFyaSAoYXQgbGVhc3QgMi4wLjMpIGFuZCBPcGVyYSwgaWYgdGhlIGlmcmFtZQorCQkJLy9oYXMganVzdCBiZWVuIGNyZWF0ZWQgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBjb250ZW50CisJCQkvL3lldCwgdGhlbiBpZnJhbWUuZG9jdW1lbnQgbWF5IGJlIG51bGwuIEluIHRoYXQgY2FzZSwKKwkJCS8vdXNlIGlmcmFtZS5sb2NhdGlvbiBhbmQgcmV0dXJuLgorCQkJaWYoIWlkb2MpeworCQkJCWlmcmFtZS5sb2NhdGlvbiA9IHNyYzsKKwkJCQlyZXR1cm47CisJCQl9ZWxzZXsKKwkJCQlpZG9jLmxvY2F0aW9uLnJlcGxhY2Uoc3JjKTsKKwkJCX0KKwkJfQorCX1jYXRjaChlKXsgCisJCWRvam8uZGVidWcoZSk7IAorCQlkb2pvLmRlYnVnKCJzZXRJRnJhbWVTcmM6ICIrZSk7IAorCX0KK30KKworLyoKK2Rvam8uaW8uc2FtcGxlVHJhbnBvcnQgPSBuZXcgZnVuY3Rpb24oKXsKKwl0aGlzLmNhbkhhbmRsZSA9IGZ1bmN0aW9uKGt3QXJncyl7CisJCS8vIGNhbkhhbmRsZSBqdXN0IHRlbGxzIGRvam8uaW8uYmluZCgpIGlmIHRoaXMgaXMgYSBnb29kIHRyYW5zcG9ydCB0bworCQkvLyB1c2UgZm9yIHRoZSBwYXJ0aWN1bGFyIHR5cGUgb2YgcmVxdWVzdC4KKwkJaWYoCQorCQkJKAorCQkJCShrd0FyZ3NbIm1pbWV0eXBlIl0gPT0gInRleHQvcGxhaW4iKSB8fAorCQkJCShrd0FyZ3NbIm1pbWV0eXBlIl0gPT0gInRleHQvaHRtbCIpIHx8CisJCQkJKGt3QXJnc1sibWltZXR5cGUiXSA9PSAidGV4dC9qYXZhc2NyaXB0IikKKwkJCSkmJigKKwkJCQkoa3dBcmdzWyJtZXRob2QiXSA9PSAiZ2V0IikgfHwKKwkJCQkoIChrd0FyZ3NbIm1ldGhvZCJdID09ICJwb3N0IikgJiYgKCFrd0FyZ3NbImZvcm1Ob2RlIl0pICkKKwkJCSkKKwkJKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXRoaXMuYmluZCA9IGZ1bmN0aW9uKGt3QXJncyl7CisJCXZhciBoZGxyT2JqID0ge307CisKKwkJLy8gc2V0IHVwIGEgaGFuZGxlciBvYmplY3QKKwkJZm9yKHZhciB4PTA7IHg8ZG9qby5pby5oZGxyRnVuY05hbWVzLmxlbmd0aDsgeCsrKXsKKwkJCXZhciBmbiA9IGRvam8uaW8uaGRsckZ1bmNOYW1lc1t4XTsKKwkJCWlmKHR5cGVvZiBrd0FyZ3MuaGFuZGxlciA9PSAib2JqZWN0Iil7CisJCQkJaWYodHlwZW9mIGt3QXJncy5oYW5kbGVyW2ZuXSA9PSAiZnVuY3Rpb24iKXsKKwkJCQkJaGRsck9ialtmbl0gPSBrd0FyZ3MuaGFuZGxlcltmbl18fGt3QXJncy5oYW5kbGVyWyJoYW5kbGUiXTsKKwkJCQl9CisJCQl9ZWxzZSBpZih0eXBlb2Yga3dBcmdzW2ZuXSA9PSAiZnVuY3Rpb24iKXsKKwkJCQloZGxyT2JqW2ZuXSA9IGt3QXJnc1tmbl07CisJCQl9ZWxzZXsKKwkJCQloZGxyT2JqW2ZuXSA9IGt3QXJnc1siaGFuZGxlIl18fGZ1bmN0aW9uKCl7fTsKKwkJCX0KKwkJfQorCisJCS8vIGJ1aWxkIGEgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGhhbmRsZXIgb2JqCisJCXZhciBoZGxyRnVuYyA9IGZ1bmN0aW9uKGV2dCl7CisJCQlpZihldnQudHlwZSA9PSAib25sb2FkIil7CisJCQkJaGRsck9iai5sb2FkKCJsb2FkIiwgZXZ0LmRhdGEsIGV2dCk7CisJCQl9ZWxzZSBpZihldnQudHlwZSA9PSAib25lcnIiKXsKKwkJCQl2YXIgZXJyT2JqID0gbmV3IGRvam8uaW8uRXJyb3IoInNhbXBsZVRyYW5zcG9ydCBFcnJvcjogIitldnQubXNnKTsKKwkJCQloZGxyT2JqLmVycm9yKCJlcnJvciIsIGVyck9iaik7CisJCQl9CisJCX0KKworCQkvLyB0aGUgc2FtcGxlIHRyYW5zcG9ydCB3b3VsZCBhdHRhY2ggdGhlIGhkbHJGdW5jKCkgd2hlbiBzZW5kaW5nIHRoZQorCQkvLyByZXF1ZXN0IGRvd24gdGhlIHBpcGUgYXQgdGhpcyBwb2ludAorCQl2YXIgdGd0VVJMID0ga3dBcmdzLnVybCsiPyIrZG9qby5pby5hcmdzRnJvbU1hcChrd0FyZ3MuY29udGVudCk7CisJCS8vIHNhbXBsZVRyYW5zcG9ydC5zZW5kUmVxdWVzdCh0Z3RVUkwsIGhkbHJGdW5jKTsKKwl9CisKKwlkb2pvLmlvLnRyYW5zcG9ydHMuYWRkVHJhbnNwb3J0KCJzYW1wbGVUcmFucG9ydCIpOworfQorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuYXJyYXkiKTsKKworCisKKy8vIEZJWE1FOiBJcyB0aGlzIHdvcnRobGVzcyBzaW5jZSB5b3UgY2FuIGRvOiBpZihuYW1lIGluIG9iaikKKy8vIGlzIHRoaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzPworCitkb2pvLmxhbmcubWl4aW4oZG9qby5sYW5nLCB7CisJaGFzOiBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKlN0cmluZyovbmFtZSl7CisJCS8vIHN1bW1hcnk6IGlzIHRoZXJlIGEgcHJvcGVydHkgd2l0aCB0aGUgcGFzc2VkIG5hbWUgaW4gb2JqPworCQl0cnl7CisJCQlyZXR1cm4gdHlwZW9mIG9ialtuYW1lXSAhPSAidW5kZWZpbmVkIjsgLy8gQm9vbGVhbgorCQl9Y2F0Y2goZSl7IHJldHVybiBmYWxzZTsgfSAvLyBCb29sZWFuCisJfSwKKworCWlzRW1wdHk6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9vYmopeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgb2JqZWN0IGlzICJlbXB0eSIuIEluCisJCS8vCQl0aGUgY2FzZSBvZiBhcnJheS1saWtlIG9iamVjdHMsIHRoZSBsZW5ndGgsIHByb3BlcnR5IGlzCisJCS8vCQlleGFtaW5lZCwgYnV0IGZvciBvdGhlciB0eXBlcyBvZiBvYmplY3RzIGl0ZXJhdGlvbiBpcyB1c2VkIHRvCisJCS8vCQlleGFtaW5lIHRoZSBpdGVyYWJsZSAic3VyZmFjZSBhcmVhIiB0byBkZXRlcm1pbmUgaWYgYW55CisJCS8vCQlub24tcHJvdG90eXBhbCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBhc3NpZ25lZC4gVGhpcyBpdGVyYXRpb24gaXMKKwkJLy8JCXByb3RvdHlwZS1leHRlbnNpb24gc2FmZS4KKwkJaWYoZG9qby5sYW5nLmlzT2JqZWN0KG9iaikpeworCQkJdmFyIHRtcCA9IHt9OworCQkJdmFyIGNvdW50ID0gMDsKKwkJCWZvcih2YXIgeCBpbiBvYmopeworCQkJCWlmKG9ialt4XSAmJiAoIXRtcFt4XSkpeworCQkJCQljb3VudCsrOworCQkJCQlicmVhazsKKwkJCQl9IAorCQkJfQorCQkJcmV0dXJuIGNvdW50ID09IDA7IC8vIGJvb2xlYW4KKwkJfWVsc2UgaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKG9iaikgfHwgZG9qby5sYW5nLmlzU3RyaW5nKG9iaikpeworCQkJcmV0dXJuIG9iai5sZW5ndGggPT0gMDsgLy8gYm9vbGVhbgorCQl9CisJfSwKKworCW1hcDogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKk9iamVjdHxGdW5jdGlvbiovb2JqLCAvKkZ1bmN0aW9uPyovdW5hcnlfZnVuYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIGEgbmV3IGFycmF5IGNvbnN0aXR1ZGVkIGZyb20gdGhlIHJldHVybiB2YWx1ZXMgb2YKKwkJLy8JCXBhc3NpbmcgZWFjaCBlbGVtZW50IG9mIGFyciBpbnRvIHVuYXJ5X2Z1bmMuIFRoZSBvYmogcGFyYW1ldGVyCisJCS8vCQltYXkgYmUgcGFzc2VkIHRvIGVuYWJsZSB0aGUgcGFzc2VkIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbgorCQkvLwkJdGhhdCBzY29wZS4gSW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBKYXZhU2NyaXB0IDEuNiwgdGhpcworCQkvLwkJZnVuY3Rpb24gaXMgYSBwYXNzdGhyb3VnaCB0byB0aGUgYnVpbHQtaW4gbWFwKCkgZnVuY3Rpb24KKwkJLy8JCXByb3ZpZGVkIGJ5IEFycmF5IGluc3RhbmNlcy4gRm9yIGRldGFpbHMgb24gdGhpcywgc2VlOgorCQkvLyAJCQlodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2U6R2xvYmFsX09iamVjdHM6QXJyYXk6bWFwCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLm1hcChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbSsxIH0pOworCQkvLwkJLy8gcmV0dXJucyBbMiwgMywgNCwgNV0KKwkJdmFyIGlzU3RyaW5nID0gZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CisJCWlmKGlzU3RyaW5nKXsKKwkJCS8vIGFycjogU3RyaW5nCisJCQlhcnIgPSBhcnIuc3BsaXQoIiIpOworCQl9CisJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikmJighdW5hcnlfZnVuYykpeworCQkJdW5hcnlfZnVuYyA9IG9iajsKKwkJCW9iaiA9IGRqX2dsb2JhbDsKKwkJfWVsc2UgaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSAmJiB1bmFyeV9mdW5jKXsKKwkJCS8vIGZmIDEuNSBjb21wYXQKKwkJCXZhciB0bXBPYmogPSBvYmo7CisJCQlvYmogPSB1bmFyeV9mdW5jOworCQkJdW5hcnlfZnVuYyA9IHRtcE9iajsKKwkJfQorCQlpZihBcnJheS5tYXApeworCQkJdmFyIG91dEFyciA9IEFycmF5Lm1hcChhcnIsIHVuYXJ5X2Z1bmMsIG9iaik7CisJCX1lbHNleworCQkJdmFyIG91dEFyciA9IFtdOworCQkJZm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSl7CisJCQkJb3V0QXJyLnB1c2godW5hcnlfZnVuYy5jYWxsKG9iaiwgYXJyW2ldKSk7CisJCQl9CisJCX0KKwkJaWYoaXNTdHJpbmcpIHsKKwkJCXJldHVybiBvdXRBcnIuam9pbigiIik7IC8vIFN0cmluZworCQl9IGVsc2UgeworCQkJcmV0dXJuIG91dEFycjsgLy8gQXJyYXkKKwkJfQorCX0sCisKKwlyZWR1Y2U6IGZ1bmN0aW9uKC8qQXJyYXkqL2FyciwgaW5pdGlhbFZhbHVlLCAvKk9iamVjdHxGdW5jdGlvbiovb2JqLCAvKkZ1bmN0aW9uKi9iaW5hcnlfZnVuYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vIAkJc2ltaWxhciB0byBQeXRob24ncyBidWlsdGluIHJlZHVjZSgpIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IG9mCisJCS8vIAkJdGhlIHByZXZpb3VzIGNvbXB1dGF0aW9uIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KKwkJLy8gCQliaW5hcnlfZnVuYyBhbG9uZyB3aXRoIHRoZSBuZXh0IHZhbHVlIGZyb20gYXJyLiBUaGUgcmVzdWx0IG9mCisJCS8vIAkJdGhpcyBjYWxsIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgc3Vic2VxdWVudCB2YWx1ZSBmcm9tIGFyciwgYW5kCisJCS8vIAkJdGhpcyBjb250aW51ZXMgdW50aWwgYXJyIGlzIGV4aGF1c3RlZC4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKKwkJLy8gCQlsYXN0IHJlc3VsdC4gVGhlICJvYmoiIGFuZCAiaW5pdGlhbFZhbHVlIiBwYXJhbWV0ZXJzIG1heSBiZQorCQkvLyAJCXNhZmVseSBvbWl0dGVkIGFuZCB0aGUgb3JkZXIgb2Ygb2JqIGFuZCBiaW5hcnlfZnVuYyBtYXkgYmUKKwkJLy8gCQlyZXZlcnNlZC4gVGhlIGRlZmF1bHQgb3JkZXIgb2YgdGhlIG9iaiBhbmQgYmluYXJ5X2Z1bmMgYXJndW1lbnQKKwkJLy8gCQl3aWxsIHByb2JhYmx5IGJlIHJldmVyc2VkIGluIGEgZnV0dXJlIHJlbGVhc2UsIGFuZCB0aGlzIGNhbGwKKwkJLy8gCQlvcmRlciBpcyBzdXBwb3J0ZWQgdG9kYXkuCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLnJlZHVjZShbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGxhc3QsIG5leHQpeyByZXR1cm4gbGFzdCtuZXh0fSk7CisJCS8vCQlyZXR1cm5zIDEwCisJCXZhciByZWR1Y2VkVmFsdWUgPSBpbml0aWFsVmFsdWU7CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMil7CisJCQliaW5hcnlfZnVuYyA9IGluaXRpYWxWYWx1ZTsKKwkJCXJlZHVjZWRWYWx1ZSA9IGFyclswXTsKKwkJCWFyciA9IGFyci5zbGljZSgxKTsKKwkJfWVsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAzKXsKKwkJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikpeworCQkJCWJpbmFyeV9mdW5jID0gb2JqOworCQkJCW9iaiA9IG51bGw7CisJCQl9CisJCX1lbHNleworCQkJLy8gdW4tZnNjayB0aGUgZGVmYXVsdCBvcmRlcgorCQkJLy8gRklYTUU6CisJCQkvLwkJY291bGQgYmUgd3JvbmcgZm9yIHNvbWUgc3RyYW5nZSBmdW5jdGlvbiBvYmplY3QgY2FzZXMuIE5vdAorCQkJLy8JCXN1cmUgaG93IHRvIHRlc3QgZm9yIHRoZW0uCisJCQlpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopKXsKKwkJCQl2YXIgdG1wID0gYmluYXJ5X2Z1bmM7CisJCQkJYmluYXJ5X2Z1bmMgPSBvYmo7CisJCQkJb2JqID0gdG1wOworCQkJfQorCQl9CisKKwkJdmFyIG9iID0gb2JqIHx8IGRqX2dsb2JhbDsKKwkJZG9qby5sYW5nLm1hcChhcnIsIAorCQkJZnVuY3Rpb24odmFsKXsKKwkJCQlyZWR1Y2VkVmFsdWUgPSBiaW5hcnlfZnVuYy5jYWxsKG9iLCByZWR1Y2VkVmFsdWUsIHZhbCk7CisJCQl9CisJCSk7CisJCXJldHVybiByZWR1Y2VkVmFsdWU7CisJfSwKKworCWZvckVhY2g6IGZ1bmN0aW9uKC8qQXJyYXkqL2FuQXJyYXksIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZm9yIGV2ZXJ5IGl0ZW0gaW4gYW5BcnJheSwgY2FsbCBjYWxsYmFjayB3aXRoIHRoYXQgaXRlbSBhcyBpdHMKKwkJLy8JCW9ubHkgcGFyYW1ldGVyLiBSZXR1cm4gdmFsdWVzIGFyZSBpZ25vcmVkLiBUaGlzIGZ1bmNpdG9uCisJCS8vCQljb3JyZXNwb25kcyAoYW5kIHdyYXBzKSB0aGUgSmF2YVNjcmlwdCAxLjYgZm9yRWFjaCBtZXRob2QuIEZvcgorCQkvLwkJbW9yZSBkZXRhaWxzLCBzZWU6CisJCS8vCQkJaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOkdsb2JhbF9PYmplY3RzOkFycmF5OmZvckVhY2gKKwkJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFuQXJyYXkpKXsKKwkJCS8vIGFuQXJyYXk6IFN0cmluZworCQkJYW5BcnJheSA9IGFuQXJyYXkuc3BsaXQoIiIpOyAKKwkJfQorCQlpZihBcnJheS5mb3JFYWNoKXsKKwkJCUFycmF5LmZvckVhY2goYW5BcnJheSwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworCQl9ZWxzZXsKKwkJCS8vIEZJWE1FOiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIGhhbmRpbG5nIHRoaXNPYmplY3QuIElzIGRqX2dsb2JhbCBhbHdheXMgdGhlIGRlZmF1bHQgY29udGV4dD8KKwkJCWlmKCF0aGlzT2JqZWN0KXsKKwkJCQl0aGlzT2JqZWN0PWRqX2dsb2JhbDsKKwkJCX0KKwkJCWZvcih2YXIgaT0wLGw9YW5BcnJheS5sZW5ndGg7IGk8bDsgaSsrKXsgCisJCQkJY2FsbGJhY2suY2FsbCh0aGlzT2JqZWN0LCBhbkFycmF5W2ldLCBpLCBhbkFycmF5KTsKKwkJCX0KKwkJfQorCX0sCisKKwlfZXZlcnlPclNvbWU6IGZ1bmN0aW9uKC8qQm9vbGVhbiovZXZlcnksIC8qQXJyYXkqL2FyciwgLypGdW5jdGlvbiovY2FsbGJhY2ssIC8qT2JqZWN0PyovdGhpc09iamVjdCl7CisJCWlmKGRvam8ubGFuZy5pc1N0cmluZyhhcnIpKXsgCisJCQkvL2FycjogU3RyaW5nCisJCQlhcnIgPSBhcnIuc3BsaXQoIiIpOyAKKwkJfQorCQlpZihBcnJheS5ldmVyeSl7CisJCQlyZXR1cm4gQXJyYXlbIGV2ZXJ5ID8gImV2ZXJ5IiA6ICJzb21lIiBdKGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworCQl9ZWxzZXsKKwkJCWlmKCF0aGlzT2JqZWN0KXsKKwkJCQl0aGlzT2JqZWN0ID0gZGpfZ2xvYmFsOworCQkJfQorCQkJZm9yKHZhciBpPTAsbD1hcnIubGVuZ3RoOyBpPGw7IGkrKyl7CisJCQkJdmFyIHJlc3VsdCA9IGNhbGxiYWNrLmNhbGwodGhpc09iamVjdCwgYXJyW2ldLCBpLCBhcnIpOworCQkJCWlmKGV2ZXJ5ICYmICFyZXN1bHQpeworCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEJvb2xlYW4KKwkJCQl9ZWxzZSBpZigoIWV2ZXJ5KSYmKHJlc3VsdCkpeworCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBCb29sZWFuKGV2ZXJ5KTsgLy8gQm9vbGVhbgorCQl9CisJfSwKKworCWV2ZXJ5OiBmdW5jdGlvbigvKkFycmF5Ki9hcnIsIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBldmVyeSBpdGVtIGluIHRoZSBhcnJheSBzYXRpc2ZpZXMgdGhlCisJCS8vCQljb25kaXRpb24gaW1wbGVtZW50ZWQgYnkgY2FsbGJhY2suIHRoaXNPYmplY3QgbWF5IGJlIHVzZWQgdG8KKwkJLy8JCXNjb3BlIHRoZSBjYWxsIHRvIGNhbGxiYWNrLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGRlcml2ZWQKKwkJLy8JCWZyb20gdGhlIEphdmFTY3JpcHQgMS42IEFycmF5LmV2ZXJ5KCkgZnVuY3Rpb24uIE1vcmUKKwkJLy8JCWluZm9ybWF0aW9uIG9uIHRoaXMgY2FuIGJlIGZvdW5kIGhlcmU6CisJCS8vCQkJaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOkdsb2JhbF9PYmplY3RzOkFycmF5OmV2ZXJ5CisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLmV2ZXJ5KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPjE7IH0pOworCQkvLwkJLy8gcmV0dXJucyBmYWxzZQorCQkvLwkJZG9qby5sYW5nLmV2ZXJ5KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPjA7IH0pOworCQkvLwkJLy8gcmV0dXJucyB0cnVlIAorCQlyZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUodHJ1ZSwgYXJyLCBjYWxsYmFjaywgdGhpc09iamVjdCk7IC8vIEJvb2xlYW4KKwl9LAorCisJc29tZTogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKkZ1bmN0aW9uKi9jYWxsYmFjaywgLypPYmplY3Q/Ki90aGlzT2JqZWN0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRldGVybWluZXMgd2hldGhlciBvciBub3QgYW55IGl0ZW0gaW4gdGhlIGFycmF5IHNhdGlzZmllcyB0aGUKKwkJLy8JCWNvbmRpdGlvbiBpbXBsZW1lbnRlZCBieSBjYWxsYmFjay4gdGhpc09iamVjdCBtYXkgYmUgdXNlZCB0bworCQkvLwkJc2NvcGUgdGhlIGNhbGwgdG8gY2FsbGJhY2suIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaXMgZGVyaXZlZAorCQkvLwkJZnJvbSB0aGUgSmF2YVNjcmlwdCAxLjYgQXJyYXkuc29tZSgpIGZ1bmN0aW9uLiBNb3JlCisJCS8vCQlpbmZvcm1hdGlvbiBvbiB0aGlzIGNhbiBiZSBmb3VuZCBoZXJlOgorCQkvLwkJCWh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpBcnJheTpzb21lCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLnNvbWUoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0+MTsgfSk7CisJCS8vCQkvLyByZXR1cm5zIHRydWUKKwkJLy8JCWRvam8ubGFuZy5zb21lKFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPDE7IH0pOworCQkvLwkJLy8gcmV0dXJucyBmYWxzZQorCQlyZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUoZmFsc2UsIGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOyAvLyBCb29sZWFuCisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKkZ1bmN0aW9uKi9jYWxsYmFjaywgLypPYmplY3Q/Ki90aGlzT2JqZWN0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybnMgYSBuZXcgQXJyYXkgd2l0aCB0aG9zZSBpdGVtcyBmcm9tIGFyciB0aGF0IG1hdGNoIHRoZQorCQkvLwkJY29uZGl0aW9uIGltcGxlbWVudGVkIGJ5IGNhbGxiYWNrLnRoaXNPYmplY3QgbWF5IGJlIHVzZWQgdG8KKwkJLy8JCXNjb3BlIHRoZSBjYWxsIHRvIGNhbGxiYWNrLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGRlcml2ZWQKKwkJLy8JCWZyb20gdGhlIEphdmFTY3JpcHQgMS42IEFycmF5LmZpbHRlcigpIGZ1bmN0aW9uLCBhbHRob3VnaAorCQkvLwkJc3BlY2lhbCBhY2NvbWlkYXRpb24gaXMgbWFkZSBpbiBvdXIgaW1wbGVtZW50YXRpb24gZm9yIHN0cmluZ3MuCisJCS8vCQlNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBKUyAxLjYgQVBJIGNhbiBiZSBmb3VuZCBoZXJlOgorCQkvLwkJCWh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpBcnJheTpmaWx0ZXIKKwkJLy8gZXhhbXBsZXM6CisJCS8vCQlkb2pvLmxhbmcuc29tZShbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbT4xOyB9KTsKKwkJLy8JCS8vIHJldHVybnMgWzIsIDMsIDRdCisJCXZhciBpc1N0cmluZyA9IGRvam8ubGFuZy5pc1N0cmluZyhhcnIpOworCQlpZihpc1N0cmluZyl7IC8qYXJyOiBTdHJpbmcqL2FyciA9IGFyci5zcGxpdCgiIik7IH0KKwkJdmFyIG91dEFycjsKKwkJaWYoQXJyYXkuZmlsdGVyKXsKKwkJCW91dEFyciA9IEFycmF5LmZpbHRlcihhcnIsIGNhbGxiYWNrLCB0aGlzT2JqZWN0KTsKKwkJfWVsc2V7CisJCQlpZighdGhpc09iamVjdCl7CisJCQkJaWYoYXJndW1lbnRzLmxlbmd0aCA+PSAzKXsgZG9qby5yYWlzZSgidGhpc09iamVjdCBkb2Vzbid0IGV4aXN0ISIpOyB9CisJCQkJdGhpc09iamVjdCA9IGRqX2dsb2JhbDsKKwkJCX0KKworCQkJb3V0QXJyID0gW107CisJCQlmb3IodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKXsKKwkJCQlpZihjYWxsYmFjay5jYWxsKHRoaXNPYmplY3QsIGFycltpXSwgaSwgYXJyKSl7CisJCQkJCW91dEFyci5wdXNoKGFycltpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKGlzU3RyaW5nKXsKKwkJCXJldHVybiBvdXRBcnIuam9pbigiIik7IC8vIFN0cmluZworCQl9IGVsc2UgeworCQkJcmV0dXJuIG91dEFycjsgLy8gQXJyYXkKKwkJfQorCX0sCisKKwl1bm5lc3Q6IGZ1bmN0aW9uKC8qIC4uLiAqLyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlDcmVhdGVzIGEgMS1EIGFycmF5IG91dCBvZiBhbGwgdGhlIGFyZ3VtZW50cyBwYXNzZWQsCisJCS8vCQl1bnJhdmVsbGluZyBhbnkgYXJyYXktbGlrZSBvYmplY3RzIGluIHRoZSBwcm9jZXNzCisJCS8vIHVzYWdlOgorCQkvLwkJdW5uZXN0KDEsIDIsIDMpID09PiBbMSwgMiwgM10KKwkJLy8JCXVubmVzdCgxLCBbMiwgWzNdLCBbW1s0XV1dXSkgPT0+IFsxLCAyLCAzLCA0XQorCisJCXZhciBvdXQgPSBbXTsKKwkJZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7CisJCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2UoYXJndW1lbnRzW2ldKSl7CisJCQkJdmFyIGFkZCA9IGRvam8ubGFuZy51bm5lc3QuYXBwbHkodGhpcywgYXJndW1lbnRzW2ldKTsKKwkJCQlvdXQgPSBvdXQuY29uY2F0KGFkZCk7CisJCQl9ZWxzZXsKKwkJCQlvdXQucHVzaChhcmd1bWVudHNbaV0pOworCQkJfQorCQl9CisJCXJldHVybiBvdXQ7IC8vIEFycmF5CisJfSwKKworCXRvQXJyYXk6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9hcnJheUxpa2UsIC8qTnVtYmVyKi9zdGFydE9mZnNldCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlDb252ZXJ0cyBhbiBhcnJheS1saWtlIG9iamVjdCAoaS5lLiBhcmd1bWVudHMsIERPTUNvbGxlY3Rpb24pCisJCS8vCQl0byBhbiBhcnJheS4gUmV0dXJucyBhIG5ldyBBcnJheSBvYmplY3QuCisJCXZhciBhcnJheSA9IFtdOworCQlmb3IodmFyIGkgPSBzdGFydE9mZnNldHx8MDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKyl7CisJCQlhcnJheS5wdXNoKGFycmF5TGlrZVtpXSk7CisJCX0KKwkJcmV0dXJuIGFycmF5OyAvLyBBcnJheQorCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5mdW5jIik7CisKKworZG9qby5sYW5nLmhpdGNoID0gZnVuY3Rpb24oLypPYmplY3QqL3RoaXNPYmplY3QsIC8qRnVuY3Rpb258U3RyaW5nKi9tZXRob2QgLyosIC4uLiovKXsKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGV2ZXIgZXhlY3V0ZSBpbiB0aGUgYSBnaXZlbiBzY29wZQorCS8vCQkodGhpc09iamVjdCkuIFRoaXMgYWxsb3dzIGZvciBlYXN5IHVzZSBvZiBvYmplY3QgbWVtYmVyIGZ1bmN0aW9ucworCS8vCQlpbiBjYWxsYmFja3MgYW5kIG90aGVyIHBsYWNlcyBpbiB3aGljaCB0aGUgInRoaXMiIGtleXdvcmQgbWF5CisJLy8JCW90aGVyd2lzZSBub3QgcmVmZXJlbmNlIHRoZSBleHBlY3RlZCBzY29wZS4gQW55IG51bWJlciBvZiBkZWZhdWx0CisJLy8JCXBvc2l0aW9uYWwgYXJndW1lbnRzIG1heSBiZSBwYXNzZWQgYXMgcGFyYW1ldGVycyBiZXlvbmQgIm1ldGhvZCIuCisJLy8JCUVhY2ggb2YgdGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byAicGxhY2Vob2xkIiAoc2ltaWxhciB0byBjdXJyeSkKKwkvLwkJZm9yIHRoZSBoaXRjaGVkIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGFyZ3VtZW50cyBtYXkgYmUKKwkvLwkJcmV2ZXJzZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KKwkvLyB0aGlzT2JqZWN0OiB0aGUgc2NvcGUgdG8gcnVuIHRoZSBtZXRob2QgaW4KKwkvLyBtZXRob2Q6CisJLy8JCWEgZnVuY3Rpb24gdG8gYmUgImJvdW5kIiB0byB0aGlzT2JqZWN0IG9yIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4KKwkvLwkJdGhpc09iamVjdCB0byBiZSB1c2VkIGFzIHRoZSBiYXNpcyBmb3IgdGhlIGJpbmRpbmcKKwkvLyB1c2FnZToKKwkvLwkJZG9qby5sYW5nLmhpdGNoKGZvbywgImJhciIpKCk7IC8vIHJ1bnMgZm9vLmJhcigpIGluIHRoZSBzY29wZSBvZiBmb28KKwkvLwkJZG9qby5sYW5nLmhpdGNoKGZvbywgbXlGdW5jdGlvbik7IC8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJ1bnMgbXlGdW5jdGlvbiBpbiB0aGUgc2NvcGUgb2YgZm9vCisKKwl2YXIgYXJncyA9IFtdOworCWZvcih2YXIgeD0yOyB4PGFyZ3VtZW50cy5sZW5ndGg7IHgrKyl7CisJCWFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCX0KKwl2YXIgZmNuID0gKGRvam8ubGFuZy5pc1N0cmluZyhtZXRob2QpID8gdGhpc09iamVjdFttZXRob2RdIDogbWV0aG9kKSB8fCBmdW5jdGlvbigpe307CisJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCXZhciB0YSA9IGFyZ3MuY29uY2F0KFtdKTsgLy8gbWFrZSBhIGNvcHkKKwkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCXRhLnB1c2goYXJndW1lbnRzW3hdKTsKKwkJfQorCQlyZXR1cm4gZmNuLmFwcGx5KHRoaXNPYmplY3QsIHRhKTsgLy8gRnVuY3Rpb24KKwkJLy8gcmV0dXJuIGZjbi5hcHBseSh0aGlzT2JqZWN0LCBhcmd1bWVudHMpOyAvLyBGdW5jdGlvbgorCX07Cit9CisKK2Rvam8ubGFuZy5hbm9uQ3RyID0gMDsKK2Rvam8ubGFuZy5hbm9uID0ge307CisKK2Rvam8ubGFuZy5uYW1lQW5vbkZ1bmMgPSBmdW5jdGlvbigvKkZ1bmN0aW9uKi9hbm9uRnVuY1B0ciwgLypPYmplY3QqL3RoaXNPYmosIC8qQm9vbGVhbiovc2VhcmNoRm9yTmFtZXMpeworCS8vIHN1bW1hcnk6CisJLy8JCUNyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYW5vbkZ1bmNQdHIgaW4gdGhpc09iaiB3aXRoIGEgY29tcGxldGVseQorCS8vCQl1bmlxdWUgbmFtZS4gVGhlIG5ldyBuYW1lIGlzIHJldHVybmVkIGFzIGEgU3RyaW5nLiAgSWYKKwkvLwkJc2VhcmNoRm9yTmFtZXMgaXMgdHJ1ZSwgYW4gZWZmb3J0IHdpbGwgYmUgbWFkZSB0byBsb2NhdGUgYW4KKwkvLwkJZXhpc3RpbmcgcmVmZXJlbmNlIHRvIGFub25GdW5jUHRyIGluIHRoaXNPYmosIGFuZCBpZiBvbmUgaXMgZm91bmQsCisJLy8JCXRoZSBleGlzdGluZyBuYW1lIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4gVGhlIGRlZmF1bHQgaXMgZm9yCisJLy8JCXNlYXJjaEZvck5hbWVzIHRvIGJlIGZhbHNlLgorCXZhciBuc28gPSAodGhpc09ianx8IGRvam8ubGFuZy5hbm9uKTsKKwlpZiggKHNlYXJjaEZvck5hbWVzKSB8fAorCQkoKGRqX2dsb2JhbFsiZGpDb25maWciXSkmJihkakNvbmZpZ1sic2xvd0Fub25GdW5jTG9va3VwcyJdID09IHRydWUpKSApeworCQlmb3IodmFyIHggaW4gbnNvKXsKKwkJCXRyeXsKKwkJCQlpZihuc29beF0gPT09IGFub25GdW5jUHRyKXsKKwkJCQkJcmV0dXJuIHg7CisJCQkJfQorCQkJfWNhdGNoKGUpe30gLy8gd2luZG93LmV4dGVybmFsIGZhaWxzIGluIElFIGVtYmVkZGVkIGluIEVjbGlwc2UgKEVjbGlwc2UgYnVnICMxNTExNjUpCisJCX0KKwl9CisJdmFyIHJldCA9ICJfXyIrZG9qby5sYW5nLmFub25DdHIrKzsKKwl3aGlsZSh0eXBlb2YgbnNvW3JldF0gIT0gInVuZGVmaW5lZCIpeworCQlyZXQgPSAiX18iK2Rvam8ubGFuZy5hbm9uQ3RyKys7CisJfQorCW5zb1tyZXRdID0gYW5vbkZ1bmNQdHI7CisJcmV0dXJuIHJldDsgLy8gU3RyaW5nCit9CisKK2Rvam8ubGFuZy5mb3J3YXJkID0gZnVuY3Rpb24oZnVuY05hbWUpeworCS8vIHN1bW1hcnk6CisJLy8gCQlSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBmb3J3YXJkcyBhIG1ldGhvZCBjYWxsIHRvCisJLy8gCQl0aGlzLmZ1bmNOYW1lKC4uLikuICBVbmxpa2UgZG9qby5sYW5nLmhpdGNoKCksIHRoZSAidGhpcyIgc2NvcGUgaXMKKwkvLyAJCW5vdCBmaXhlZCBvbiBhIHNpbmdsZSBvYmplY3QuIFBvcnRlZCBmcm9tIE1vY2hpS2l0LgorCXJldHVybiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpc1tmdW5jTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9OyAvLyBGdW5jdGlvbgorfQorCitkb2pvLmxhbmcuY3VycnkgPSBmdW5jdGlvbih0aGlzT2JqLCBmdW5jIC8qIGFyZ3MgLi4uICovKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlzaW1pbGFyIHRvIHRoZSBjdXJyeSgpIG1ldGhvZCBmb3VuZCBpbiBtYW55IGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcKKwkvLwkJZW52aXJvbm1lbnRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gImFyZ3VtZW50IGFjY3VtdWxhdG9yIgorCS8vCQlmdW5jdGlvbiwgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIHNjb3BlLCBhbmQgInByaW1lZCIgd2l0aCBhIHZhcmlhYmxlCisJLy8JCW51bWJlciBvZiBhcmd1bWVudHMuIFRoZSBjdXJyeSBtZXRob2QgaXMgdW5pcXVlIGluIHRoYXQgaXQgcmV0dXJucworCS8vCQlhIGZ1bmN0aW9uIHRoYXQgbWF5IHJldHVybiBvdGhlciAicGFydGlhbCIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlCisJLy8JCWNhbGxlZCByZXBlYXRlZGx5LiBOZXcgZnVuY3Rpb25zIGFyZSByZXR1cm5lZCB1bnRpbCB0aGUgYXJpdHkgb2YKKwkvLwkJdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGlzIHJlYWNoZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB1bmRlcmx5aW5nCisJLy8JCWZ1bmN0aW9uIChmdW5jKSBpcyBjYWxsZWQgaW4gdGhlIHNjb3BlIHRoaXNPYmogd2l0aCBhbGwgb2YgdGhlCisJLy8JCWFjY3VtdWxhdGVkIGFyZ3VtZW50cyAocGx1cyBhbnkgZXh0cmFzKSBpbiBwb3NpdGlvbmFsIG9yZGVyLgorCS8vIGV4YW1wbGVzOgorCS8vCQlhc3N1bWluZyBhIGZ1bmN0aW9uIGRlZmluZWQgbGlrZSB0aGlzOgorCS8vCQkJdmFyIGZvbyA9IHsKKwkvLwkJCQliYXI6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpeworCS8vCQkJCQlkb2pvLmRlYnVnLmFwcGx5KGRvam8sIGFyZ3VtZW50cyk7CisJLy8JCQkJfQorCS8vCQkJfTsKKwkvLwkJCisJLy8JCWRvam8ubGFuZy5jdXJyeSgpIGNhbiBiZSB1c2VkIG1vc3Qgc2ltcGx5IGluIHRoaXMgd2F5OgorCS8vCQkKKwkvLwkJCXRtcCA9IGRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJhcmcgb25lIiwgInRoaW5nZXIiKTsKKwkvLwkJCXRtcCgiYmxhaCIsICJ0aGlzIGlzIHN1cGVyZmx1b3VzIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIHRoaW5nZXIgYmxhaCB0aGlzIGlzIHN1cGVyZmx1b3VzIgorCS8vCQkJdG1wKCJibGFoIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIHRoaW5nZXIgYmxhaCIKKwkvLwkJCXRtcCgpOworCS8vCQkJLy8gcmV0dXJucyBhIGZ1bmN0aW9uIGV4YWN0bHkgbGlrZSB0bXAgdGhhdCBleHBlY3RzIG9uZSBhcmd1bWVudAorCS8vCisJLy8JCW90aGVyIGludGVybWl0dGVudCBmdW5jdGlvbnMgY291bGQgYmUgY3JlYXRlZCB1bnRpbCB0aGUgMworCS8vCQlwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgZmlsbGVkOgorCS8vCisJLy8JCQl0bXAgPSBkb2pvLmxhbmcuY3VycnkoZm9vLCBmb28uYmFyLCAiYXJnIG9uZSIpOworCS8vCQkJdG1wMiA9IHRtcCgiYXJnIHR3byIpOworCS8vCQkJdG1wMigiYmxhaCBibGFoIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIGFyZyB0d28gYmxhaCBibGFoIgorCS8vCQkJdG1wMigib3kiKTsKKwkvLwkJCS8vIGRlYnVnczogImFyZyBvbmUgYXJnIHR3byBveSIKKwkvLworCS8vCQljdXJyeSgpIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaWYgZW5vdWdoIGFyZ3VtZW50cworCS8vCQlhcmUgcGFzc2VkIGluIHRoZSBpbml0aWFsIGludm9jYXRpb246CisJLy8KKwkvLwkJCWRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiKTsKKwkvLwkJCS8vIGRlYnVnczogIm9uZSB0d28gdGhyZWUgZm91ciIKKwkvLwkJCWRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJvbmUiLCAidHdvIiwgInRocmVlIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJvbmUgdHdvIHRocmVlIgorCisKKwkvLyBGSVhNRTogdGhlIG9yZGVyIG9mIGZ1bmMgYW5kIHRoaXNPYmogc2hvdWxkIGJlIGNoYW5nZWQhISEKKwl2YXIgb3V0ZXJBcmdzID0gW107CisJdGhpc09iaiA9IHRoaXNPYmp8fGRqX2dsb2JhbDsKKwlpZihkb2pvLmxhbmcuaXNTdHJpbmcoZnVuYykpeworCQlmdW5jID0gdGhpc09ialtmdW5jXTsKKwl9CisJZm9yKHZhciB4PTI7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJb3V0ZXJBcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKKwl9CisJLy8gc2luY2UgdGhlIGV2ZW50IHN5c3RlbSByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCBhIG5ldworCS8vIGpvaW4tcG9pbnQgcnVubmVyIHdpdGggYW4gYXJpdHkgb2YgMCwgd2UgY2hlY2sgdG8gc2VlIGlmIGl0J3MgbGVmdCB1cworCS8vIGFueSBjbHVlcyBhYm91dCB0aGUgb3JpZ2luYWwgYXJpdHkgaW4gbGlldSBvZiB0aGUgZnVuY3Rpb24ncyBhY3R1YWwKKwkvLyBsZW5ndGggcHJvcGVydHkKKwl2YXIgZWNvdW50ID0gKGZ1bmNbIl9fcHJlSm9pbkFyaXR5Il18fGZ1bmMubGVuZ3RoKSAtIG91dGVyQXJncy5sZW5ndGg7CisJLy8gYm9ycm93ZWQgZnJvbSBzdmVuZCB0b2Z0ZQorCWZ1bmN0aW9uIGdhdGhlcihuZXh0QXJncywgaW5uZXJBcmdzLCBleHBlY3RlZCl7CisJCXZhciB0ZXhwZWN0ZWQgPSBleHBlY3RlZDsKKwkJdmFyIHRvdGFsQXJncyA9IGlubmVyQXJncy5zbGljZSgwKTsgLy8gY29weQorCQlmb3IodmFyIHg9MDsgeDxuZXh0QXJncy5sZW5ndGg7IHgrKyl7CisJCQl0b3RhbEFyZ3MucHVzaChuZXh0QXJnc1t4XSk7CisJCX0KKwkJLy8gY2hlY2sgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgbmV4dEFyZ3MgdG8gc2VlIGlmIGl0LCBwbHVzIHRoZQorCQkvLyBudW1iZXIgb2YgaW5uZXJBcmdzIGFscmVhZHkgc3VwcGxpZWQsIG1lZXRzIHRoZSB0b3RhbAorCQkvLyBleHBlY3RlZC4KKwkJZXhwZWN0ZWQgPSBleHBlY3RlZC1uZXh0QXJncy5sZW5ndGg7CisJCWlmKGV4cGVjdGVkPD0wKXsKKwkJCXZhciByZXMgPSBmdW5jLmFwcGx5KHRoaXNPYmosIHRvdGFsQXJncyk7CisJCQlleHBlY3RlZCA9IHRleHBlY3RlZDsKKwkJCXJldHVybiByZXM7CisJCX1lbHNleworCQkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQkJcmV0dXJuIGdhdGhlcihhcmd1bWVudHMsLy8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGJlZW4gcnVuCisJCQkJCQkJCQkJLy8gd2l0aCBlbm91Z2ggYXJncworCQkJCQkJCXRvdGFsQXJncywJLy8gYSBjb3B5CisJCQkJCQkJZXhwZWN0ZWQpOwkvLyBob3cgbWFueSBtb3JlIGRvIHdlIG5lZWQgdG8gcnVuPzsKKwkJCX07CisJCX0KKwl9CisJcmV0dXJuIGdhdGhlcihbXSwgb3V0ZXJBcmdzLCBlY291bnQpOworfQorCitkb2pvLmxhbmcuY3VycnlBcmd1bWVudHMgPSBmdW5jdGlvbigvKk9iamVjdCovdGhpc09iaiwgLypGdW5jdGlvbiovZnVuYywgLypBcnJheSovYXJncywgLypJbnRlZ2VyLCBvcHRpb25hbCovb2Zmc2V0KXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlzaW1pbGFyIHRvIGRvam8ubGFuZy5jdXJyeSgpLCBleGNlcHQgdGhhdCBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvCisJLy8JCXN0YXJ0IHRoZSBjdXJyeSB3aXRoIG1heSBiZSBwcm92aWRlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGFzCisJLy8JCXBvc2l0aW9uYWwgYXJndW1lbnRzLiBBbiBvZmZzZXQgbWF5IGJlIHNwZWNpZmllZCBmcm9tIHRoZSAwIGluZGV4CisJLy8JCXRvIHNraXAgc29tZSBlbGVtZW50cyBpbiBhcmdzLgorCXZhciB0YXJncyA9IFtdOworCXZhciB4ID0gb2Zmc2V0fHwwOworCWZvcih4PW9mZnNldDsgeDxhcmdzLmxlbmd0aDsgeCsrKXsKKwkJdGFyZ3MucHVzaChhcmdzW3hdKTsgLy8gZW5zdXJlIHRoYXQgaXQncyBhbiBhcnIKKwl9CisJcmV0dXJuIGRvam8ubGFuZy5jdXJyeS5hcHBseShkb2pvLmxhbmcsIFt0aGlzT2JqLCBmdW5jXS5jb25jYXQodGFyZ3MpKTsKK30KKworZG9qby5sYW5nLnRyeVRoZXNlID0gZnVuY3Rpb24oLyouLi4qLyl7CisJLy8gc3VtbWFyeToKKwkvLwkJZXhlY3V0ZXMgZWFjaCBmdW5jdGlvbiBhcmd1bWVudCBpbiB0dXJuLCByZXR1cm5pbmcgdGhlIHJldHVybiB2YWx1ZQorCS8vCQlmcm9tIHRoZSBmaXJzdCBvbmUgd2hpY2ggZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGluIGV4ZWN1dGlvbi4KKwkvLwkJQW55IG51bWJlciBvZiBmdW5jdGlvbnMgbWF5IGJlIHBhc3NlZC4KKwlmb3IodmFyIHg9MDsgeDxhcmd1bWVudHMubGVuZ3RoOyB4KyspeworCQl0cnl7CisJCQlpZih0eXBlb2YgYXJndW1lbnRzW3hdID09ICJmdW5jdGlvbiIpeworCQkJCXZhciByZXQgPSAoYXJndW1lbnRzW3hdKCkpOworCQkJCWlmKHJldCl7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9Y2F0Y2goZSl7CisJCQlkb2pvLmRlYnVnKGUpOworCQl9CisJfQorfQorCitkb2pvLmxhbmcuZGVsYXlUaGVzZSA9IGZ1bmN0aW9uKC8qQXJyYXkqL2ZhcnIsIC8qRnVuY3Rpb24sIG9wdGlvbmFsKi9jYiwgLypJbnRlZ2VyKi9kZWxheSwgLypGdW5jdGlvbiwgb3B0aW9uYWwqL29uZW5kKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlleGVjdXRlcyBhIHNlcmllcyBvZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGZhcnIsIGJ1dCBzcGFjZXMgb3V0CisJLy8JCWNhbGxzIHRvIGVhY2ggZnVuY3Rpb24gYnkgdGhlIG1pbGxpc2Vjb25kIGRlbGF5IHByb3ZpZGVkLiBJZiBjYiBpcworCS8vCQlwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgZWFjaCBpdGVtIGluIGZhcnIgaXMKKwkvLwkJY2FsbGVkIGFuZCBpZiBvbmVuZCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYWxsIGl0ZW1zCisJLy8JCWhhdmUgY29tcGxldGVkIGV4ZWN1dGluZy4KKworCS8qKgorCSAqIGFsdGVybmF0ZTogKGFycmF5IGZ1bmNBcnJheSwgZnVuY3Rpb24gY2FsbGJhY2ssIGZ1bmN0aW9uIG9uZW5kKQorCSAqIGFsdGVybmF0ZTogKGFycmF5IGZ1bmNBcnJheSwgZnVuY3Rpb24gY2FsbGJhY2spCisJICogYWx0ZXJuYXRlOiAoYXJyYXkgZnVuY0FycmF5KQorCSAqLworCWlmKCFmYXJyLmxlbmd0aCl7IAorCQlpZih0eXBlb2Ygb25lbmQgPT0gImZ1bmN0aW9uIil7CisJCQlvbmVuZCgpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYoKHR5cGVvZiBkZWxheSA9PSAidW5kZWZpbmVkIikmJih0eXBlb2YgY2IgPT0gIm51bWJlciIpKXsKKwkJZGVsYXkgPSBjYjsKKwkJY2IgPSBmdW5jdGlvbigpe307CisJfWVsc2UgaWYoIWNiKXsKKwkJY2IgPSBmdW5jdGlvbigpe307CisJCWlmKCFkZWxheSl7IGRlbGF5ID0gMDsgfQorCX0KKwlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisJCShmYXJyLnNoaWZ0KCkpKCk7CisJCWNiKCk7CisJCWRvam8ubGFuZy5kZWxheVRoZXNlKGZhcnIsIGNiLCBkZWxheSwgb25lbmQpOworCX0sIGRlbGF5KTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZy5leHRyYXMiKTsKKworCisKKworCisvL1RPRE86IHNob3VsZCB3ZSB1c2UgJHt9IHN1YnN0aXR1dGlvbiBzeW50YXggaW5zdGVhZCwgbGlrZSB3aWRnZXRzIGRvPworZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcyA9IGZ1bmN0aW9uKC8qc3RyaW5nKi90ZW1wbGF0ZSwgLyogb2JqZWN0IC0gb3B0aW9uYWwgb3IgLi4uICovaGFzaCl7CisvLyBzdW1tYXJ5OgorLy8JUGVyZm9ybXMgcGFyYW1ldGVyaXplZCBzdWJzdGl0dXRpb25zIG9uIGEgc3RyaW5nLiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgdW5tYXRjaGVkLgorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8JRm9yIGV4YW1wbGUsCisvLwkJZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcygiRmlsZSAnJXswfScgaXMgbm90IGZvdW5kIGluIGRpcmVjdG9yeSAnJXsxfScuIiwiZm9vLmh0bWwiLCIvdGVtcCIpOworLy8JcmV0dXJucworLy8JCSJGaWxlICdmb28uaHRtbCcgaXMgbm90IGZvdW5kIGluIGRpcmVjdG9yeSAnL3RlbXAnLiIKKy8vCisvLyB0ZW1wbGF0ZTogdGhlIG9yaWdpbmFsIHN0cmluZyB0ZW1wbGF0ZSB3aXRoICV7dmFsdWVzfSB0byBiZSByZXBsYWNlZAorLy8gaGFzaDogbmFtZS92YWx1ZSBwYWlycyAodHlwZSBvYmplY3QpIHRvIHByb3ZpZGUgc3Vic3RpdHV0aW9ucy4gIEFsdGVybmF0aXZlbHksIHN1YnN0aXR1dGlvbnMgbWF5IGJlCisvLwlpbmNsdWRlZCBhcyBhcmd1bWVudHMgMS4ubiB0byB0aGlzIGZ1bmN0aW9uLCBjb3JyZXNwb25kaW5nIHRvIHRlbXBsYXRlIHBhcmFtZXRlcnMgMC4ubi0xCisKKwl2YXIgbWFwID0gKHR5cGVvZiBoYXNoID09ICdvYmplY3QnKSA/IGhhc2ggOiBkb2pvLmxhbmcudG9BcnJheShhcmd1bWVudHMsIDEpOworCisJcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1wlXHsoXHcrKVx9L2csIGZ1bmN0aW9uKG1hdGNoLCBrZXkpeworCQlpZih0eXBlb2YobWFwW2tleV0pICE9ICJ1bmRlZmluZWQiICYmIG1hcFtrZXldICE9IG51bGwpeworCQkJcmV0dXJuIG1hcFtrZXldOworCQl9CisJCWRvam8ucmFpc2UoIlN1YnN0aXR1dGlvbiBub3QgZm91bmQ6ICIgKyBrZXkpOworCX0pOyAvLyBzdHJpbmcKK307CisKK2Rvam8uc3RyaW5nLmNhcGl0YWxpemUgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyKXsKKy8vIHN1bW1hcnk6CisvLwlVcHBlcmNhc2VzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkCisKKwlpZighZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpeyByZXR1cm4gIiI7IH0KKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDApeyBzdHIgPSB0aGlzOyB9CisKKwl2YXIgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsKKwlmb3IodmFyIGk9MDsgaTx3b3Jkcy5sZW5ndGg7IGkrKyl7CisJCXdvcmRzW2ldID0gd29yZHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkc1tpXS5zdWJzdHJpbmcoMSk7CisJfQorCXJldHVybiB3b3Jkcy5qb2luKCIgIik7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5pc0JsYW5rID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisvLyBzdW1tYXJ5OgorLy8JUmV0dXJuIHRydWUgaWYgdGhlIGVudGlyZSBzdHJpbmcgaXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisKKwlpZighZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpeyByZXR1cm4gdHJ1ZTsgfQorCXJldHVybiAoZG9qby5zdHJpbmcudHJpbShzdHIpLmxlbmd0aCA9PSAwKTsgLy8gYm9vbGVhbgorfQorCisvL0ZJWE1FOiBub3Qgc3VyZSBleGFjdGx5IHdoYXQgZW5jb2RlQXNjaWkgaXMgdHJ5aW5nIHRvIGRvLCBvciBpZiBpdCdzIHdvcmtpbmcgcmlnaHQKK2Rvam8uc3RyaW5nLmVuY29kZUFzY2lpID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisJaWYoIWRvam8ubGFuZy5pc1N0cmluZyhzdHIpKXsgcmV0dXJuIHN0cjsgfSAvLyB1bmtub3duCisJdmFyIHJldCA9ICIiOworCXZhciB2YWx1ZSA9IGVzY2FwZShzdHIpOworCXZhciBtYXRjaCwgcmUgPSAvJXUoWzAtOUEtRl17NH0pL2k7CisJd2hpbGUoKG1hdGNoID0gdmFsdWUubWF0Y2gocmUpKSl7CisJCXZhciBudW0gPSBOdW1iZXIoIjB4IittYXRjaFsxXSk7CisJCXZhciBuZXdWYWwgPSBlc2NhcGUoIiYjIiArIG51bSArICI7Iik7CisJCXJldCArPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgbmV3VmFsOworCQl2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhtYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGgpOworCX0KKwlyZXQgKz0gdmFsdWUucmVwbGFjZSgvXCsvZywgIiUyQiIpOworCXJldHVybiByZXQ7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5lc2NhcGUgPSBmdW5jdGlvbigvKnN0cmluZyovdHlwZSwgLypzdHJpbmcqL3N0cil7CisvLyBzdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIG9mICd0eXBlJworLy8KKy8vIHR5cGU6IG9uZSBvZiB4bWx8aHRtbHx4aHRtbHxzcWx8cmVnZXhwfHJlZ2V4fGphdmFzY3JpcHR8anNjcmlwdHxqc3xhc2NpaQorLy8gc3RyOiB0aGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQKKworCXZhciBhcmdzID0gZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzLCAxKTsKKwlzd2l0Y2godHlwZS50b0xvd2VyQ2FzZSgpKXsKKwkJY2FzZSAieG1sIjoKKwkJY2FzZSAiaHRtbCI6CisJCWNhc2UgInhodG1sIjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVYbWwuYXBwbHkodGhpcywgYXJncyk7IC8vIHN0cmluZworCQljYXNlICJzcWwiOgorCQkJcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVNxbC5hcHBseSh0aGlzLCBhcmdzKTsgLy8gc3RyaW5nCisJCWNhc2UgInJlZ2V4cCI6CisJCWNhc2UgInJlZ2V4IjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVSZWdFeHAuYXBwbHkodGhpcywgYXJncyk7IC8vIHN0cmluZworCQljYXNlICJqYXZhc2NyaXB0IjoKKwkJY2FzZSAianNjcmlwdCI6CisJCWNhc2UgImpzIjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVKYXZhU2NyaXB0LmFwcGx5KHRoaXMsIGFyZ3MpOyAvLyBzdHJpbmcKKwkJY2FzZSAiYXNjaWkiOgorCQkJLy8gc28gaXQncyBlbmNvZGUsIGJ1dCBpdCBzZWVtcyB1c2VmdWwKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaS5hcHBseSh0aGlzLCBhcmdzKTsgLy8gc3RyaW5nCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc3RyOyAvLyBzdHJpbmcKKwl9Cit9CisKK2Rvam8uc3RyaW5nLmVzY2FwZVhtbCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qYm9vbGVhbiovbm9TaW5nbGVRdW90ZXMpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gWE1MOiAmPD4iJworLy8gIE9wdGlvbmFsbHkgc2tpcHMgZXNjYXBlcyBmb3Igc2luZ2xlIHF1b3RlcworCisJc3RyID0gc3RyLnJlcGxhY2UoLyYvZ20sICImYW1wOyIpLnJlcGxhY2UoLzwvZ20sICImbHQ7IikKKwkJLnJlcGxhY2UoLz4vZ20sICImZ3Q7IikucmVwbGFjZSgvIi9nbSwgIiZxdW90OyIpOworCWlmKCFub1NpbmdsZVF1b3Rlcyl7IHN0ciA9IHN0ci5yZXBsYWNlKC8nL2dtLCAiJiMzOTsiKTsgfQorCXJldHVybiBzdHI7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5lc2NhcGVTcWwgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyKXsKKy8vc3VtbWFyeToKKy8vCUFkZHMgZXNjYXBlIHNlcXVlbmNlcyBmb3Igc2luZ2xlIHF1b3RlcyBpbiBTUUwgZXhwcmVzc2lvbnMKKworCXJldHVybiBzdHIucmVwbGFjZSgvJy9nbSwgIicnIik7IC8vc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gcmVndWxhciBleHByZXNzaW9ucworCisJcmV0dXJuIHN0ci5yZXBsYWNlKC9cXC9nbSwgIlxcXFwiKS5yZXBsYWNlKC8oW1xmXGJcblx0XHJbXF4kfD8qKygpe31dKS9nbSwgIlxcJDEiKTsgLy8gc3RyaW5nCit9CisKKy8vRklYTUU6IHNob3VsZCB0aGlzIG9uZSBhbHNvIGVzY2FwZSBiYWNrc2xhc2g/Citkb2pvLnN0cmluZy5lc2NhcGVKYXZhU2NyaXB0ID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisvL3N1bW1hcnk6CisvLwlBZGRzIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhcyB3ZWxsCisvLwlhcyBub24tdmlzaWJsZSBjaGFyYWN0ZXJzIGluIEphdmFTY3JpcHQgc3RyaW5nIGxpdGVyYWwgZXhwcmVzc2lvbnMKKworCXJldHVybiBzdHIucmVwbGFjZSgvKFsiJ1xmXGJcblx0XHJdKS9nbSwgIlxcJDEiKTsgLy8gc3RyaW5nCit9CisKKy8vRklYTUU6IGxvb2tzIGEgbG90IGxpa2UgZXNjYXBlSmF2YVNjcmlwdCwganVzdCBhZGRzIHF1b3Rlcz8gZGVwcmVjYXRlIG9uZT8KK2Rvam8uc3RyaW5nLmVzY2FwZVN0cmluZyA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBub24tdmlzdWFsIGNoYXJhY3RlcnMsIGRvdWJsZSBxdW90ZSBhbmQgYmFja3NsYXNoCisvLwlhbmQgc3Vycm91bmRzIHdpdGggZG91YmxlIHF1b3RlcyB0byBmb3JtIGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwuCisJcmV0dXJuICgnIicgKyBzdHIucmVwbGFjZSgvKFsiXFxdKS9nLCAnXFwkMScpICsgJyInCisJCSkucmVwbGFjZSgvW1xmXS9nLCAiXFxmIgorCQkpLnJlcGxhY2UoL1tcYl0vZywgIlxcYiIKKwkJKS5yZXBsYWNlKC9bXG5dL2csICJcXG4iCisJCSkucmVwbGFjZSgvW1x0XS9nLCAiXFx0IgorCQkpLnJlcGxhY2UoL1tccl0vZywgIlxcciIpOyAvLyBzdHJpbmcKK30KKworLy8gVE9ETzogbWFrZSBhbiBIVE1MIHZlcnNpb24KK2Rvam8uc3RyaW5nLnN1bW1hcnkgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKm51bWJlciovbGVuKXsKKy8vIHN1bW1hcnk6CisvLwlUcnVuY2F0ZXMgJ3N0cicgYWZ0ZXIgJ2xlbicgY2hhcmFjdGVycyBhbmQgYXBwZW5kcyBwZXJpb2RzIGFzIG5lY2Vzc2FyeSBzbyB0aGF0IGl0IGVuZHMgd2l0aCAiLi4uIgorCisJaWYoIWxlbiB8fCBzdHIubGVuZ3RoIDw9IGxlbil7CisJCXJldHVybiBzdHI7IC8vIHN0cmluZworCX0KKworCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGxlbikucmVwbGFjZSgvXC4rJC8sICIiKSArICIuLi4iOyAvLyBzdHJpbmcKK30KKworZG9qby5zdHJpbmcuZW5kc1dpdGggPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKnN0cmluZyovZW5kLCAvKmJvb2xlYW4qL2lnbm9yZUNhc2UpeworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBlbmRzIHdpdGggJ2VuZCcKKworCWlmKGlnbm9yZUNhc2UpeworCQlzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTsKKwkJZW5kID0gZW5kLnRvTG93ZXJDYXNlKCk7CisJfQorCWlmKChzdHIubGVuZ3RoIC0gZW5kLmxlbmd0aCkgPCAwKXsKKwkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJfQorCXJldHVybiBzdHIubGFzdEluZGV4T2YoZW5kKSA9PSBzdHIubGVuZ3RoIC0gZW5kLmxlbmd0aDsgLy8gYm9vbGVhbgorfQorCitkb2pvLnN0cmluZy5lbmRzV2l0aEFueSA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIgLyogLCAuLi4gKi8peworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBlbmRzIHdpdGggYW55IG9mIHRoZSBhcmd1bWVudHNbMiAtPiBuXQorCisJZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZihkb2pvLnN0cmluZy5lbmRzV2l0aChzdHIsIGFyZ3VtZW50c1tpXSkpIHsKKwkJCXJldHVybiB0cnVlOyAvLyBib29sZWFuCisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGggPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKnN0cmluZyovc3RhcnQsIC8qYm9vbGVhbiovaWdub3JlQ2FzZSl7CisvLyBzdW1tYXJ5OgorLy8JUmV0dXJucyB0cnVlIGlmICdzdHInIHN0YXJ0cyB3aXRoICdzdGFydCcKKworCWlmKGlnbm9yZUNhc2UpIHsKKwkJc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7CisJCXN0YXJ0ID0gc3RhcnQudG9Mb3dlckNhc2UoKTsKKwl9CisJcmV0dXJuIHN0ci5pbmRleE9mKHN0YXJ0KSA9PSAwOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGhBbnkgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyIC8qICwgLi4uICovKXsKKy8vIHN1bW1hcnk6CisvLwlSZXR1cm5zIHRydWUgaWYgJ3N0cicgc3RhcnRzIHdpdGggYW55IG9mIHRoZSBhcmd1bWVudHNbMiAtPiBuXQorCisJZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZihkb2pvLnN0cmluZy5zdGFydHNXaXRoKHN0ciwgYXJndW1lbnRzW2ldKSkgeworCQkJcmV0dXJuIHRydWU7IC8vIGJvb2xlYW4KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KK30KKworZG9qby5zdHJpbmcuaGFzID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0ciAvKiAsIC4uLiAqLykgeworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBjb250YWlucyBhbnkgb2YgdGhlIGFyZ3VtZW50cyAyIC0+IG4KKworCWZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJaWYoc3RyLmluZGV4T2YoYXJndW1lbnRzW2ldKSA+IC0xKXsKKwkJCXJldHVybiB0cnVlOyAvLyBib29sZWFuCisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLm5vcm1hbGl6ZU5ld2xpbmVzID0gZnVuY3Rpb24oLypzdHJpbmcqL3RleHQsIC8qc3RyaW5nPyAoXG4gb3IgXHIpKi9uZXdsaW5lQ2hhcil7CisvLyBzdW1tYXJ5OgorLy8JQ2hhbmdlcyBvY2N1cmVuY2VzIG9mIENSIGFuZCBMRiBpbiB0ZXh0IHRvIENSTEYsIG9yIGlmIG5ld2xpbmVDaGFyIGlzIHByb3ZpZGVkIGFzICdcbicgb3IgJ1xyJywKKy8vCXN1YnN0aXR1dGVzIG5ld2xpbmVDaGFyIGZvciBvY2N1cnJlbmNlcyBvZiBDUi9MRiBhbmQgQ1JMRgorCisJaWYgKG5ld2xpbmVDaGFyID09ICJcbiIpeworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxuL2csICJcbiIpOworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cci9nLCAiXG4iKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmVDaGFyID09ICJcciIpeworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxuL2csICJcciIpOworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCAiXHIiKTsKKwl9ZWxzZXsKKwkJdGV4dCA9IHRleHQucmVwbGFjZSgvKFteXHJdKVxuL2csICIkMVxyXG4iKS5yZXBsYWNlKC9ccihbXlxuXSkvZywgIlxyXG4kMSIpOworCX0KKwlyZXR1cm4gdGV4dDsgLy8gc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnNwbGl0RXNjYXBlZCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qc3RyaW5nIG9mIGxlbmd0aD0xKi9jaGFyYWMpeworLy8gc3VtbWFyeToKKy8vCVNwbGl0cyAnc3RyJyBpbnRvIGFuIGFycmF5IHNlcGFyYXRlZCBieSAnY2hhcmFjJywgYnV0IHNraXBzIGNoYXJhY3RlcnMgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoCisKKwl2YXIgY29tcG9uZW50cyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBwcmV2Y29tbWEgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKXsKKwkJaWYgKHN0ci5jaGFyQXQoaSkgPT0gJ1xcJyl7IGkrKzsgY29udGludWU7IH0KKwkJaWYgKHN0ci5jaGFyQXQoaSkgPT0gY2hhcmFjKXsKKwkJCWNvbXBvbmVudHMucHVzaChzdHIuc3Vic3RyaW5nKHByZXZjb21tYSwgaSkpOworCQkJcHJldmNvbW1hID0gaSArIDE7CisJCX0KKwl9CisJY29tcG9uZW50cy5wdXNoKHN0ci5zdWJzdHIocHJldmNvbW1hKSk7CisJcmV0dXJuIGNvbXBvbmVudHM7IC8vIGFycmF5Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kb20iKTsKKworZG9qby5kb20uRUxFTUVOVF9OT0RFICAgICAgICAgICAgICAgICAgPSAxOworZG9qby5kb20uQVRUUklCVVRFX05PREUgICAgICAgICAgICAgICAgPSAyOworZG9qby5kb20uVEVYVF9OT0RFICAgICAgICAgICAgICAgICAgICAgPSAzOworZG9qby5kb20uQ0RBVEFfU0VDVElPTl9OT0RFICAgICAgICAgICAgPSA0OworZG9qby5kb20uRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgICAgPSA1OworZG9qby5kb20uRU5USVRZX05PREUgICAgICAgICAgICAgICAgICAgPSA2OworZG9qby5kb20uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFICAgPSA3OworZG9qby5kb20uQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgICAgPSA4OworZG9qby5kb20uRE9DVU1FTlRfTk9ERSAgICAgICAgICAgICAgICAgPSA5OworZG9qby5kb20uRE9DVU1FTlRfVFlQRV9OT0RFICAgICAgICAgICAgPSAxMDsKK2Rvam8uZG9tLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAgID0gMTE7Citkb2pvLmRvbS5OT1RBVElPTl9OT0RFICAgICAgICAgICAgICAgICA9IDEyOworCQorZG9qby5kb20uZG9qb21sID0gImh0dHA6Ly93d3cuZG9qb3Rvb2xraXQub3JnLzIwMDQvZG9qb21sIjsKKworLyoqCisgKgljb21wcmVoZW5zaXZlIGxpc3Qgb2YgWE1MIG5hbWVzcGFjZXMKKyoqLworZG9qby5kb20ueG1sbnMgPSB7CisJLy8Jc3VtbWFyeQorCS8vCWFsaWFzZXMgZm9yIHZhcmlvdXMgY29tbW9uIFhNTCBuYW1lc3BhY2VzCisJc3ZnIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKKwlzbWlsIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvU01JTDIwLyIsCisJbW1sIDogImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLAorCWNtbCA6ICJodHRwOi8vd3d3LnhtbC1jbWwub3JnIiwKKwl4bGluayA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKKwl4aHRtbCA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKKwl4dWwgOiAiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCIsCisJeGJsIDogImh0dHA6Ly93d3cubW96aWxsYS5vcmcveGJsIiwKKwlmbyA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiLAorCXhzbCA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLAorCXhzbHQgOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiwKKwl4aSA6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIiwKKwl4Zm9ybXMgOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wMS94Zm9ybXMiLAorCXNheG9uIDogImh0dHA6Ly9pY2wuY29tL3NheG9uIiwKKwl4YWxhbiA6ICJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIsCisJeHNkIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwKKwlkdDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIsCisJeHNpIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKKwlyZGYgOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIsCisJcmRmcyA6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiwKKwlkYyA6ICJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIsCisJZGNxOiAiaHR0cDovL3B1cmwub3JnL2RjL3F1YWxpZmllcnMvMS4wIiwKKwkic29hcC1lbnYiIDogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwKKwl3c2RsIDogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwKKwlBZG9iZUV4dGVuc2lvbnMgOiAiaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZVNWR1ZpZXdlckV4dGVuc2lvbnMvMy4wLyIKK307CisKK2Rvam8uZG9tLmlzTm9kZSA9IGZ1bmN0aW9uKC8qIG9iamVjdCAqL3doKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQljaGVja3MgdG8gc2VlIGlmIHdoIGlzIGFjdHVhbGx5IGEgbm9kZS4KKwlpZih0eXBlb2YgRWxlbWVudCA9PSAiZnVuY3Rpb24iKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gd2ggaW5zdGFuY2VvZiBFbGVtZW50OwkvLwlib29sZWFuCisJCX0gY2F0Y2goZSkge30KKwl9IGVsc2UgeworCQkvLyBiZXN0LWd1ZXNzCisJCXJldHVybiB3aCAmJiAhaXNOYU4od2gubm9kZVR5cGUpOwkvLwlib29sZWFuCisJfQorfQorCitkb2pvLmRvbS5nZXRVbmlxdWVJZCA9IGZ1bmN0aW9uKCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgZm9yIHVzZSB3aXRoIGFueSBET00gZWxlbWVudAorCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCWRvIHsKKwkJdmFyIGlkID0gImRqX3VuaXF1ZV8iICsgKCsrYXJndW1lbnRzLmNhbGxlZS5faWRJbmNyZW1lbnQpOworCX13aGlsZShfZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKTsKKwlyZXR1cm4gaWQ7CS8vCXN0cmluZworfQorZG9qby5kb20uZ2V0VW5pcXVlSWQuX2lkSW5jcmVtZW50ID0gMDsKKworZG9qby5kb20uZmlyc3RFbGVtZW50ID0gZG9qby5kb20uZ2V0Rmlyc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbigvKiBFbGVtZW50ICovcGFyZW50Tm9kZSwgLyogc3RyaW5nPyAqL3RhZ05hbWUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgbWF0Y2hpbmcgdGFnTmFtZQorCXZhciBub2RlID0gcGFyZW50Tm9kZS5maXJzdENoaWxkOworCXdoaWxlKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpeworCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwl9CisJaWYodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLm5leHRFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsJLy8JRWxlbWVudAorfQorCitkb2pvLmRvbS5sYXN0RWxlbWVudCA9IGRvam8uZG9tLmdldExhc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbigvKiBFbGVtZW50ICovcGFyZW50Tm9kZSwgLyogc3RyaW5nPyAqL3RhZ05hbWUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgdGhlIGxhc3QgY2hpbGQgZWxlbWVudCBtYXRjaGluZyB0YWdOYW1lCisJdmFyIG5vZGUgPSBwYXJlbnROb2RlLmxhc3RDaGlsZDsKKwl3aGlsZShub2RlICYmIG5vZGUubm9kZVR5cGUgIT0gZG9qby5kb20uRUxFTUVOVF9OT0RFKSB7CisJCW5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZzsKKwl9CisJaWYodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLnByZXZFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsJLy8JRWxlbWVudAorfQorCitkb2pvLmRvbS5uZXh0RWxlbWVudCA9IGRvam8uZG9tLmdldE5leHRTaWJsaW5nRWxlbWVudCA9IGZ1bmN0aW9uKC8qIE5vZGUgKi9ub2RlLCAvKiBzdHJpbmc/ICovdGFnTmFtZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgbWF0Y2hpbmcgdGFnTmFtZQorCWlmKCFub2RlKSB7IHJldHVybiBudWxsOyB9CisJZG8geworCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwl9IHdoaWxlKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpOworCisJaWYobm9kZSAmJiB0YWdOYW1lICYmIHRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgeworCQlyZXR1cm4gZG9qby5kb20ubmV4dEVsZW1lbnQobm9kZSwgdGFnTmFtZSk7CisJfQorCXJldHVybiBub2RlOwkvLwlFbGVtZW50Cit9CisKK2Rvam8uZG9tLnByZXZFbGVtZW50ID0gZG9qby5kb20uZ2V0UHJldmlvdXNTaWJsaW5nRWxlbWVudCA9IGZ1bmN0aW9uKC8qIE5vZGUgKi9ub2RlLCAvKiBzdHJpbmc/ICovdGFnTmFtZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IG1hdGNoaW5nIHRhZ05hbWUKKwlpZighbm9kZSkgeyByZXR1cm4gbnVsbDsgfQorCWlmKHRhZ05hbWUpIHsgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsgfQorCWRvIHsKKwkJbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOworCX0gd2hpbGUobm9kZSAmJiBub2RlLm5vZGVUeXBlICE9IGRvam8uZG9tLkVMRU1FTlRfTk9ERSk7CisKKwlpZihub2RlICYmIHRhZ05hbWUgJiYgdGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJCXJldHVybiBkb2pvLmRvbS5wcmV2RWxlbWVudChub2RlLCB0YWdOYW1lKTsKKwl9CisJcmV0dXJuIG5vZGU7CS8vCUVsZW1lbnQKK30KKworLy8gVE9ETzogaG1waAorLyp0aGlzLmZvckVhY2hDaGlsZFRhZyA9IGZ1bmN0aW9uKG5vZGUsIHVuYXJ5RnVuYykgeworCXZhciBjaGlsZCA9IHRoaXMuZ2V0Rmlyc3RDaGlsZFRhZyhub2RlKTsKKwl3aGlsZShjaGlsZCkgeworCQlpZih1bmFyeUZ1bmMoY2hpbGQpID09ICJicmVhayIpIHsgYnJlYWs7IH0KKwkJY2hpbGQgPSB0aGlzLmdldE5leHRTaWJsaW5nVGFnKGNoaWxkKTsKKwl9Cit9Ki8KKworZG9qby5kb20ubW92ZUNoaWxkcmVuID0gZnVuY3Rpb24oLypFbGVtZW50Ki9zcmNOb2RlLCAvKkVsZW1lbnQqL2Rlc3ROb2RlLCAvKmJvb2xlYW4/Ki90cmltKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlNb3ZlcyBjaGlsZHJlbiBmcm9tIHNyY05vZGUgdG8gZGVzdE5vZGUgYW5kIHJldHVybnMgdGhlIGNvdW50IG9mCisJLy8JCWNoaWxkcmVuIG1vdmVkOyB3aWxsIHRyaW0gb2ZmIHRleHQgbm9kZXMgaWYgdHJpbSA9PSB0cnVlCisJdmFyIGNvdW50ID0gMDsKKwlpZih0cmltKSB7CisJCXdoaWxlKHNyY05vZGUuaGFzQ2hpbGROb2RlcygpICYmCisJCQlzcmNOb2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gZG9qby5kb20uVEVYVF9OT0RFKSB7CisJCQlzcmNOb2RlLnJlbW92ZUNoaWxkKHNyY05vZGUuZmlyc3RDaGlsZCk7CisJCX0KKwkJd2hpbGUoc3JjTm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYKKwkJCXNyY05vZGUubGFzdENoaWxkLm5vZGVUeXBlID09IGRvam8uZG9tLlRFWFRfTk9ERSkgeworCQkJc3JjTm9kZS5yZW1vdmVDaGlsZChzcmNOb2RlLmxhc3RDaGlsZCk7CisJCX0KKwl9CisJd2hpbGUoc3JjTm9kZS5oYXNDaGlsZE5vZGVzKCkpeworCQlkZXN0Tm9kZS5hcHBlbmRDaGlsZChzcmNOb2RlLmZpcnN0Q2hpbGQpOworCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7CS8vCW51bWJlcgorfQorCitkb2pvLmRvbS5jb3B5Q2hpbGRyZW4gPSBmdW5jdGlvbigvKkVsZW1lbnQqL3NyY05vZGUsIC8qRWxlbWVudCovZGVzdE5vZGUsIC8qYm9vbGVhbj8qL3RyaW0peworCS8vCXN1bW1hcnk6CisJLy8JCUNvcGllcyBjaGlsZHJlbiBmcm9tIHNyY05kZSB0byBkZXN0Tm9kZSBhbmQgcmV0dXJucyB0aGUgY291bnQgb2YKKwkvLwkJY2hpbGRyZW4gY29waWVkOyB3aWxsIHRyaW0gb2ZmIHRleHQgbm9kZXMgaWYgdHJpbSA9PSB0cnVlCisJdmFyIGNsb25lZE5vZGUgPSBzcmNOb2RlLmNsb25lTm9kZSh0cnVlKTsKKwlyZXR1cm4gdGhpcy5tb3ZlQ2hpbGRyZW4oY2xvbmVkTm9kZSwgZGVzdE5vZGUsIHRyaW0pOwkvLwludW1iZXIKK30KKworZG9qby5kb20ucmVwbGFjZUNoaWxkcmVuID0gZnVuY3Rpb24oLypFbGVtZW50Ki9ub2RlLCAvKk5vZGUqL25ld0NoaWxkKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlSZW1vdmVzIGFsbCBjaGlsZHJlbiBvZiBub2RlIGFuZCBhcHBlbmRzIG5ld0NoaWxkLiBBbGwgdGhlIGV4aXN0aW5nCisJLy8JCWNoaWxkcmVuIHdpbGwgYmUgZGVzdHJveWVkLgorCS8vIEZJWE1FOiB3aGF0IGlmIG5ld0NoaWxkIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0PworCXZhciBub2RlcyA9IFtdOworCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQlmb3IodmFyIGk9MDtpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXsKKwkJCW5vZGVzLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJfQorCX0KKwlkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbihub2RlKTsKKwlub2RlLmFwcGVuZENoaWxkKG5ld0NoaWxkKTsKKwlmb3IodmFyIGk9MDtpPG5vZGVzLmxlbmd0aDtpKyspeworCQlkb2pvLmRvbS5kZXN0cm95Tm9kZShub2Rlc1tpXSk7CisJfQorfQorCitkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKC8qRWxlbWVudCovbm9kZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSBub2RlIGFuZCByZXR1cm5zIHRoZSBjb3VudCBvZiBjaGlsZHJlbiByZW1vdmVkLgorCS8vCQlUaGUgY2hpbGRyZW4gbm9kZXMgYXJlIG5vdCBkZXN0cm95ZWQuIEJlIHN1cmUgdG8gY2FsbCBkZXN0cm95Tm9kZSBvbiB0aGVtCisJLy8JCWFmdGVyIHRoZXkgYXJlIG5vdCB1c2VkIGFueW1vcmUuCisJdmFyIGNvdW50ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsKKwl3aGlsZShub2RlLmhhc0NoaWxkTm9kZXMoKSl7IGRvam8uZG9tLnJlbW92ZU5vZGUobm9kZS5maXJzdENoaWxkKTsgfQorCXJldHVybiBjb3VudDsgLy8gaW50Cit9CisKK2Rvam8uZG9tLnJlcGxhY2VOb2RlID0gZnVuY3Rpb24oLypFbGVtZW50Ki9ub2RlLCAvKkVsZW1lbnQqL25ld05vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJlcGxhY2VzIG5vZGUgd2l0aCBuZXdOb2RlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIG5vZGUuCisJLy8JCVRvIHByZXZlbnQgSUUgbWVtb3J5IGxlYWssIGNhbGwgZGVzdHJveU5vZGUgb24gdGhlIHJldHVybmVkIG5vZGUgd2hlbgorCS8vCQlpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCXJldHVybiBub2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld05vZGUsIG5vZGUpOyAvLyBOb2RlCit9CisKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlkZXN0cm95IGEgbm9kZSAoaXQgY2FuIG5vdCBiZSB1c2VkIGFueSBtb3JlKS4gRm9yIElFLCB0aGlzIGlzIHRoZQorCS8vCQlyaWdodCBmdW5jdGlvbiB0byBjYWxsIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiBXaGlsZSBmb3Igb3RoZXIKKwkvLwkJYnJvd3NlcnMsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIGRvam8uZG9tLnJlbW92ZU5vZGUKKwlpZihub2RlLnBhcmVudE5vZGUpeworCQlub2RlID0gZG9qby5kb20ucmVtb3ZlTm9kZShub2RlKTsKKwl9CisJaWYobm9kZS5ub2RlVHlwZSAhPSAzKXsgLy8gaW5nb3JlIFRFWFRfTk9ERQorCQlpZihkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4iLCBmYWxzZSkpeworCQkJZG9qby5ldmVudC5icm93c2VyLmNsZWFuKG5vZGUpOworCQl9CisJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJbm9kZS5vdXRlckhUTUw9Jyc7IC8vcHJldmVudCB1Z2x5IElFIG1lbSBsZWFrIGFzc29jaWF0ZWQgd2l0aCBOb2RlLnJlbW92ZUNoaWxkICh0aWNrZXQgIzE3MjcpCisJCX0KKwl9Cit9CisKK2Rvam8uZG9tLnJlbW92ZU5vZGUgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vIHN1bW1hcnk6CisJLy8JCWlmIG5vZGUgaGFzIGEgcGFyZW50LCByZW1vdmVzIG5vZGUgZnJvbSBwYXJlbnQgYW5kIHJldHVybnMgYQorCS8vCQlyZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgY2hpbGQuCisJLy8JCVRvIHByZXZlbnQgSUUgbWVtb3J5IGxlYWssIGNhbGwgZGVzdHJveU5vZGUgb24gdGhlIHJldHVybmVkIG5vZGUgd2hlbgorCS8vCQlpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCS8vCW5vZGU6CisJLy8JCXRoZSBub2RlIHRvIHJlbW92ZSBmcm9tIGl0cyBwYXJlbnQuCisKKwlpZihub2RlICYmIG5vZGUucGFyZW50Tm9kZSl7CisJCS8vIHJldHVybiBhIHJlZiB0byB0aGUgcmVtb3ZlZCBjaGlsZAorCQlyZXR1cm4gbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOyAvL05vZGUKKwl9Cit9CisKK2Rvam8uZG9tLmdldEFuY2VzdG9ycyA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypmdW5jdGlvbj8qL2ZpbHRlckZ1bmN0aW9uLCAvKmJvb2xlYW4/Ki9yZXR1cm5GaXJzdEhpdCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhbGwgYW5jZXN0b3JzIG1hdGNoaW5nIG9wdGlvbmFsIGZpbHRlckZ1bmN0aW9uOyB3aWxsIHJldHVybgorCS8vCQlvbmx5IHRoZSBmaXJzdCBpZiByZXR1cm5GaXJzdEhpdAorCXZhciBhbmNlc3RvcnMgPSBbXTsKKwl2YXIgaXNGdW5jdGlvbiA9IChmaWx0ZXJGdW5jdGlvbiAmJiAoZmlsdGVyRnVuY3Rpb24gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgZmlsdGVyRnVuY3Rpb24gPT0gImZ1bmN0aW9uIikpOworCXdoaWxlKG5vZGUpeworCQlpZighaXNGdW5jdGlvbiB8fCBmaWx0ZXJGdW5jdGlvbihub2RlKSl7CisJCQlhbmNlc3RvcnMucHVzaChub2RlKTsKKwkJfQorCQlpZihyZXR1cm5GaXJzdEhpdCAmJiBhbmNlc3RvcnMubGVuZ3RoID4gMCl7IAorCQkJcmV0dXJuIGFuY2VzdG9yc1swXTsgCS8vCU5vZGUKKwkJfQorCQkKKwkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwl9CisJaWYocmV0dXJuRmlyc3RIaXQpeyByZXR1cm4gbnVsbDsgfQorCXJldHVybiBhbmNlc3RvcnM7CS8vCWFycmF5Cit9CisKK2Rvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKlN0cmluZyovdGFnLCAvKmJvb2xlYW4/Ki9yZXR1cm5GaXJzdEhpdCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhbGwgYW5jZXN0b3JzIG1hdGNoaW5nIHRhZyAoYXMgdGFnTmFtZSksIHdpbGwgb25seSByZXR1cm4KKwkvLwkJZmlyc3Qgb25lIGlmIHJldHVybkZpcnN0SGl0CisJdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7CisJcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9ycyhub2RlLCBmdW5jdGlvbihlbCl7CisJCXJldHVybiAoKGVsLnRhZ05hbWUpJiYoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZykpOworCX0sIHJldHVybkZpcnN0SGl0KTsJLy8JTm9kZSB8fCBhcnJheQorfQorCitkb2pvLmRvbS5nZXRGaXJzdEFuY2VzdG9yQnlUYWcgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUsIC8qc3RyaW5nKi90YWcpeworCS8vCXN1bW1hcnk6CisJLy8JCVJldHVybnMgZmlyc3QgYW5jZXN0b3Igb2Ygbm9kZSB3aXRoIHRhZyB0YWdOYW1lCisJcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnKG5vZGUsIHRhZywgdHJ1ZSk7CS8vCU5vZGUKK30KKworZG9qby5kb20uaXNEZXNjZW5kYW50T2YgPSBmdW5jdGlvbigvKiBOb2RlICovbm9kZSwgLyogTm9kZSAqL2FuY2VzdG9yLCAvKiBib29sZWFuPyAqL2d1YXJhbnRlZURlc2NlbmRhbnQpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIGJvb2xlYW4gaWYgbm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgYW5jZXN0b3IKKwkvLyBndWFyYW50ZWVEZXNjZW5kYW50IGFsbG93cyB1cyB0byBiZSBhICJ0cnVlIiBpc0Rlc2NlbmRhbnRPZiBmdW5jdGlvbgorCWlmKGd1YXJhbnRlZURlc2NlbmRhbnQgJiYgbm9kZSkgeyBub2RlID0gbm9kZS5wYXJlbnROb2RlOyB9CisJd2hpbGUobm9kZSkgeworCQlpZihub2RlID09IGFuY2VzdG9yKXsgCisJCQlyZXR1cm4gdHJ1ZTsgCS8vCWJvb2xlYW4KKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gZmFsc2U7CS8vCWJvb2xlYW4KK30KKworZG9qby5kb20uaW5uZXJYTUwgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCUltcGxlbWVudGF0aW9uIG9mIE1TJ3MgaW5uZXJYTUwgZnVuY3Rpb24uCisJaWYobm9kZS5pbm5lclhNTCl7CisJCXJldHVybiBub2RlLmlubmVyWE1MOwkvLwlzdHJpbmcKKwl9ZWxzZSBpZiAobm9kZS54bWwpeworCQlyZXR1cm4gbm9kZS54bWw7CQkvLwlzdHJpbmcKKwl9ZWxzZSBpZih0eXBlb2YgWE1MU2VyaWFsaXplciAhPSAidW5kZWZpbmVkIil7CisJCXJldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcobm9kZSk7CS8vCXN0cmluZworCX0KK30KKworZG9qby5kb20uY3JlYXRlRG9jdW1lbnQgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnk6CisJLy8JCWNyb3NzLWJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRpbmcgYW4gWE1MIGRvY3VtZW50IG9iamVjdC4KKwl2YXIgZG9jID0gbnVsbDsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKworCWlmKCFkal91bmRlZigiQWN0aXZlWE9iamVjdCIpKXsKKwkJdmFyIHByZWZpeGVzID0gWyAiTVNYTUwyIiwgIk1pY3Jvc29mdCIsICJNU1hNTCIsICJNU1hNTDMiIF07CisJCWZvcih2YXIgaSA9IDA7IGk8cHJlZml4ZXMubGVuZ3RoOyBpKyspeworCQkJdHJ5eworCQkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KHByZWZpeGVzW2ldKyIuWE1MRE9NIik7CisJCQl9Y2F0Y2goZSl7IC8qIHNxdWVsY2ggKi8gfTsKKworCQkJaWYoZG9jKXsgYnJlYWs7IH0KKwkJfQorCX1lbHNlIGlmKChfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24pJiYKKwkJKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCkpeworCQlkb2MgPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsKKwl9CisJCisJcmV0dXJuIGRvYzsJLy8JRE9NRG9jdW1lbnQKK30KKworZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qc3RyaW5nPyovbWltZXR5cGUpeworCS8vCXN1bW1hcnk6CisJLy8JCWF0dGVtcHRzIHRvIGNyZWF0ZSBhIERvY3VtZW50IG9iamVjdCBiYXNlZCBvbiBvcHRpb25hbCBtaW1lLXR5cGUsCisJLy8JCXVzaW5nIHN0ciBhcyB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50CisJaWYoIW1pbWV0eXBlKXsgbWltZXR5cGUgPSAidGV4dC94bWwiOyB9CisJaWYoIWRqX3VuZGVmKCJET01QYXJzZXIiKSl7CisJCXZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CisJCXJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0ciwgbWltZXR5cGUpOwkvLwlET01Eb2N1bWVudAorCX1lbHNlIGlmKCFkal91bmRlZigiQWN0aXZlWE9iamVjdCIpKXsKKwkJdmFyIGRvbURvYyA9IGRvam8uZG9tLmNyZWF0ZURvY3VtZW50KCk7CisJCWlmKGRvbURvYyl7CisJCQlkb21Eb2MuYXN5bmMgPSBmYWxzZTsKKwkJCWRvbURvYy5sb2FkWE1MKHN0cik7CisJCQlyZXR1cm4gZG9tRG9jOwkvLwlET01Eb2N1bWVudAorCQl9ZWxzZXsKKwkJCWRvam8uZGVidWcoInRvWG1sIGRpZG4ndCB3b3JrPyIpOworCQl9CisJLyoKKwl9ZWxzZSBpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSl7CisJCS8vIEZJWE1FOiB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmshCisJCS8vIGZyb206IGh0dHA6Ly93ZWItZ3JhcGhpY3MuY29tL210YXJjaGl2ZS8wMDE2MDYucGhwCisJCS8vIHZhciB4bWwgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JytzdHI7CisJCXZhciBtdHlwZSA9ICJ0ZXh0L3htbCI7CisJCXZhciB4bWwgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JytzdHI7CisJCXZhciB1cmwgPSAiZGF0YToiK210eXBlKyI7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudCh4bWwpOworCQl2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCXJlcS5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKKwkJcmVxLm92ZXJyaWRlTWltZVR5cGUobXR5cGUpOworCQlyZXEuc2VuZChudWxsKTsKKwkJcmV0dXJuIHJlcS5yZXNwb25zZVhNTDsKKwkqLworCX1lbHNleworCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJaWYoX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQpeworCQkJLy8gRklYTUU6IHRoaXMgbWF5IGNoYW5nZSBhbGwgdGFncyB0byB1cHBlcmNhc2UhCisJCQl2YXIgdG1wID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInhtbCIpOworCQkJdG1wLmlubmVySFRNTCA9IHN0cjsKKwkJCWlmKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbiAmJiBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpeworCQkJCXZhciB4bWxEb2MgPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoImZvbyIsICIiLCBudWxsKTsKKwkJCQlmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJeG1sRG9jLmltcG9ydE5vZGUodG1wLmNoaWxkTm9kZXMuaXRlbShpKSwgdHJ1ZSk7CisJCQkJfQorCQkJCXJldHVybiB4bWxEb2M7CS8vCURPTURvY3VtZW50CisJCQl9CisJCQkvLyBGSVhNRTogcHJvYmFibHkgbm90IGEgZ29vZCBpZGVhIHRvIGhhdmUgdG8gcmV0dXJuIGFuIEhUTUwgZnJhZ21lbnQKKwkJCS8vIEZJWE1FOiB0aGUgdG1wLmRvYy5maXJzdENoaWxkIGlzIGFzIHRlc3RlZCBmcm9tIElFLCBzbyBpdCBtYXkgbm90CisJCQkvLyB3b3JrIHRoYXQgd2F5IGFjcm9zcyB0aGUgYm9hcmQKKwkJCXJldHVybiAoKHRtcC5kb2N1bWVudCkmJgorCQkJCSh0bXAuZG9jdW1lbnQuZmlyc3RDaGlsZCA/ICB0bXAuZG9jdW1lbnQuZmlyc3RDaGlsZCA6IHRtcCkpOwkvLwlET01Eb2N1bWVudAorCQl9CisJfQorCXJldHVybiBudWxsOworfQorCitkb2pvLmRvbS5wcmVwZW5kQ2hpbGQgPSBmdW5jdGlvbigvKkVsZW1lbnQqL25vZGUsIC8qRWxlbWVudCovcGFyZW50KXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlwcmVwZW5kcyBub2RlIHRvIHBhcmVudCdzIGNoaWxkcmVuIG5vZGVzCisJaWYocGFyZW50LmZpcnN0Q2hpbGQpIHsKKwkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBwYXJlbnQuZmlyc3RDaGlsZCk7CisJfSBlbHNlIHsKKwkJcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUsIC8qTm9kZSovcmVmLCAvKmJvb2xlYW4/Ki9mb3JjZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJVHJ5IHRvIGluc2VydCBub2RlIGJlZm9yZSByZWYKKwlpZigJKGZvcmNlICE9IHRydWUpJiYKKwkJKG5vZGUgPT09IHJlZiB8fCBub2RlLm5leHRTaWJsaW5nID09PSByZWYpKXsgcmV0dXJuIGZhbHNlOyB9CisJdmFyIHBhcmVudCA9IHJlZi5wYXJlbnROb2RlOworCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmKTsKKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypOb2RlKi9yZWYsIC8qYm9vbGVhbj8qL2ZvcmNlKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlUcnkgdG8gaW5zZXJ0IG5vZGUgYWZ0ZXIgcmVmCisJdmFyIHBuID0gcmVmLnBhcmVudE5vZGU7CisJaWYocmVmID09IHBuLmxhc3RDaGlsZCl7CisJCWlmKChmb3JjZSAhPSB0cnVlKSYmKG5vZGUgPT09IHJlZikpeworCQkJcmV0dXJuIGZhbHNlOwkvLwlib29sZWFuCisJCX0KKwkJcG4uYXBwZW5kQ2hpbGQobm9kZSk7CisJfWVsc2V7CisJCXJldHVybiB0aGlzLmluc2VydEJlZm9yZShub2RlLCByZWYubmV4dFNpYmxpbmcsIGZvcmNlKTsJLy8JYm9vbGVhbgorCX0KKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRBdFBvc2l0aW9uID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKk5vZGUqL3JlZiwgLypzdHJpbmcqL3Bvc2l0aW9uKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlhdHRlbXB0IHRvIGluc2VydCBub2RlIGluIHJlbGF0aW9uIHRvIHJlZiBiYXNlZCBvbiBwb3NpdGlvbgorCWlmKCghbm9kZSl8fCghcmVmKXx8KCFwb3NpdGlvbikpeyAKKwkJcmV0dXJuIGZhbHNlOwkvLwlib29sZWFuIAorCX0KKwlzd2l0Y2gocG9zaXRpb24udG9Mb3dlckNhc2UoKSl7CisJCWNhc2UgImJlZm9yZSI6CisJCQlyZXR1cm4gZG9qby5kb20uaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZik7CS8vCWJvb2xlYW4KKwkJY2FzZSAiYWZ0ZXIiOgorCQkJcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUsIHJlZik7CQkvLwlib29sZWFuCisJCWNhc2UgImZpcnN0IjoKKwkJCWlmKHJlZi5maXJzdENoaWxkKXsKKwkJCQlyZXR1cm4gZG9qby5kb20uaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZi5maXJzdENoaWxkKTsJLy8JYm9vbGVhbgorCQkJfWVsc2V7CisJCQkJcmVmLmFwcGVuZENoaWxkKG5vZGUpOworCQkJCXJldHVybiB0cnVlOwkvLwlib29sZWFuCisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogLy8gYWthOiBsYXN0CisJCQlyZWYuYXBwZW5kQ2hpbGQobm9kZSk7CisJCQlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorCX0KK30KKworZG9qby5kb20uaW5zZXJ0QXRJbmRleCA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypFbGVtZW50Ki9jb250YWluaW5nTm9kZSwgLypudW1iZXIqL2luc2VydGlvbkluZGV4KXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlpbnNlcnQgbm9kZSBpbnRvIGNoaWxkIG5vZGVzIG5vZGVsaXN0IG9mIGNvbnRhaW5pbmdOb2RlIGF0CisJLy8JCWluc2VydGlvbkluZGV4LiBpbnNlcnRpb25JbmRleCBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAKKwkvLwkJdGhlIG51bWJlciBvZiB0aGUgY2hpbGROb2RlcyBpbiBjb250YWluaW5nTm9kZS4gaW5zZXJ0aW9uSW5kZXgKKwkvLwkJc3BlY2lmeXMgYWZ0ZXIgaG93IG1hbnkgY2hpbGROb2RlcyBpbiBjb250YWluaW5nTm9kZSB0aGUgbm9kZQorCS8vCQlzaGFsbCBiZSBpbnNlcnRlZC4gSWYgMCBpcyBnaXZlbiwgbm9kZSB3aWxsIGJlIGFwcGVuZGVkIHRvIAorCS8vCQljb250YWluaW5nTm9kZS4KKwl2YXIgc2libGluZ05vZGVzID0gY29udGFpbmluZ05vZGUuY2hpbGROb2RlczsKKworCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkga2lkcyB5ZXQsIGp1c3QgYWRkIGl0IHRvIHRoZSBiZWdpbm5pbmcKKworCWlmICghc2libGluZ05vZGVzLmxlbmd0aCB8fCBzaWJsaW5nTm9kZXMubGVuZ3RoID09IGluc2VydGlvbkluZGV4KXsKKwkJY29udGFpbmluZ05vZGUuYXBwZW5kQ2hpbGQobm9kZSk7CisJCXJldHVybiB0cnVlOwkvLwlib29sZWFuCisJfQorCisJaWYoaW5zZXJ0aW9uSW5kZXggPT0gMCl7CisJCXJldHVybiBkb2pvLmRvbS5wcmVwZW5kQ2hpbGQobm9kZSwgY29udGFpbmluZ05vZGUpOwkvLwlib29sZWFuCisJfQorCS8vIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHdhbGsgdGhlIGNoaWxkTm9kZXMKKwkvLyBhbmQgZmluZCBvdXIgc3BvdAorCisJcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUsIHNpYmxpbmdOb2Rlc1tpbnNlcnRpb25JbmRleC0xXSk7CS8vCWJvb2xlYW4KK30KKwkKK2Rvam8uZG9tLnRleHRDb250ZW50ID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKnN0cmluZyovdGV4dCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJaW1wbGVtZW50YXRpb24gb2YgdGhlIERPTSBMZXZlbCAzIGF0dHJpYnV0ZTsgc2NhbiBub2RlIGZvciB0ZXh0CisJaWYgKGFyZ3VtZW50cy5sZW5ndGg+MSkgeworCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJZG9qby5kb20ucmVwbGFjZUNoaWxkcmVuKG5vZGUsIF9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CisJCXJldHVybiB0ZXh0OwkvLwlzdHJpbmcKKwl9IGVsc2UgeworCQlpZihub2RlLnRleHRDb250ZW50ICE9IHVuZGVmaW5lZCl7IC8vRkYgMS41CisJCQlyZXR1cm4gbm9kZS50ZXh0Q29udGVudDsJLy8Jc3RyaW5nCisJCX0KKwkJdmFyIF9yZXN1bHQgPSAiIjsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gX3Jlc3VsdDsgfQorCQlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJc3dpdGNoIChub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVR5cGUpIHsKKwkJCQljYXNlIDE6IC8vIEVMRU1FTlRfTk9ERQorCQkJCWNhc2UgNTogLy8gRU5USVRZX1JFRkVSRU5DRV9OT0RFCisJCQkJCV9yZXN1bHQgKz0gZG9qby5kb20udGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOiAvLyBURVhUX05PREUKKwkJCQljYXNlIDI6IC8vIEFUVFJJQlVURV9OT0RFCisJCQkJY2FzZSA0OiAvLyBDREFUQV9TRUNUSU9OX05PREUKKwkJCQkJX3Jlc3VsdCArPSBub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVZhbHVlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gX3Jlc3VsdDsJLy8Jc3RyaW5nCisJfQorfQorCitkb2pvLmRvbS5oYXNQYXJlbnQgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgd2hldGhlciBvciBub3Qgbm9kZSBpcyBhIGNoaWxkIG9mIGFub3RoZXIgbm9kZS4KKwlyZXR1cm4gQm9vbGVhbihub2RlICYmIG5vZGUucGFyZW50Tm9kZSAmJiBkb2pvLmRvbS5pc05vZGUobm9kZS5wYXJlbnROb2RlKSk7CS8vCWJvb2xlYW4KK30KKworLyoqCisgKiBFeGFtcGxlczoKKyAqCisgKiBteUZvb05vZGUgPSA8Zm9vIC8+CisgKiBpc1RhZyhteUZvb05vZGUsICJmb28iKTsgLy8gcmV0dXJucyAiZm9vIgorICogaXNUYWcobXlGb29Ob2RlLCAiYmFyIik7IC8vIHJldHVybnMgIiIKKyAqIGlzVGFnKG15Rm9vTm9kZSwgIkZPTyIpOyAvLyByZXR1cm5zICIiCisgKiBpc1RhZyhteUZvb05vZGUsICJoZXkiLCAiZm9vIiwgImJhciIpOyAvLyByZXR1cm5zICJmb28iCisqKi8KK2Rvam8uZG9tLmlzVGFnID0gZnVuY3Rpb24oLyogTm9kZSAqL25vZGUgLyogLi4uICovKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlkZXRlcm1pbmVzIGlmIG5vZGUgaGFzIGFueSBvZiB0aGUgcHJvdmlkZWQgdGFnIG5hbWVzIGFuZCByZXR1cm5zCisJLy8JCXRoZSB0YWcgbmFtZSB0aGF0IG1hdGNoZXMsIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCisJaWYobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJZm9yKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCWlmKG5vZGUudGFnTmFtZT09U3RyaW5nKGFyZ3VtZW50c1tpXSkpeworCQkJCXJldHVybiBTdHJpbmcoYXJndW1lbnRzW2ldKTsJLy8Jc3RyaW5nCisJCQl9CisJCX0KKwl9CisJcmV0dXJuICIiOwkvLwlzdHJpbmcKK30KKworZG9qby5kb20uc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbigJLypFbGVtZW50Ki9lbGVtLCAvKnN0cmluZyovbmFtZXNwYWNlVVJJLCAKKwkJCQkJCQkJCS8qc3RyaW5nKi9hdHRyTmFtZSwgLypzdHJpbmcqL2F0dHJWYWx1ZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJaW1wbGVtZW50YXRpb24gb2YgRE9NMiBzZXRBdHRyaWJ1dGVOUyB0aGF0IHdvcmtzIGNyb3NzIGJyb3dzZXIuCisJaWYoZWxlbSA9PSBudWxsIHx8ICgoZWxlbSA9PSB1bmRlZmluZWQpJiYodHlwZW9mIGVsZW0gPT0gInVuZGVmaW5lZCIpKSl7CisJCWRvam8ucmFpc2UoIk5vIGVsZW1lbnQgZ2l2ZW4gdG8gZG9qby5kb20uc2V0QXR0cmlidXRlTlMiKTsKKwl9CisJCisJaWYoISgoZWxlbS5zZXRBdHRyaWJ1dGVOUyA9PSB1bmRlZmluZWQpJiYodHlwZW9mIGVsZW0uc2V0QXR0cmlidXRlTlMgPT0gInVuZGVmaW5lZCIpKSl7IC8vIHczYworCQllbGVtLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7CisJfWVsc2V7IC8vIElFCisJCS8vIGdldCBhIHJvb3QgWE1MIGRvY3VtZW50CisJCXZhciBvd25lckRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKKwkJdmFyIGF0dHJpYnV0ZSA9IG93bmVyRG9jLmNyZWF0ZU5vZGUoCisJCQkyLCAvLyBub2RlIHR5cGUKKwkJCWF0dHJOYW1lLAorCQkJbmFtZXNwYWNlVVJJCisJCSk7CisJCQorCQkvLyBzZXQgdmFsdWUKKwkJYXR0cmlidXRlLm5vZGVWYWx1ZSA9IGF0dHJWYWx1ZTsKKwkJCisJCS8vIGF0dGFjaCB0byBlbGVtZW50CisJCWVsZW0uc2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOworCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLnVuZG8uYnJvd3NlciIpOworCisKK3RyeXsKKwlpZigoIWRqQ29uZmlnWyJwcmV2ZW50QmFja0J1dHRvbkZpeCJdKSYmKCFkb2pvLmhvc3RlbnYucG9zdF9sb2FkXykpeworCQlkb2N1bWVudC53cml0ZSgiPGlmcmFtZSBzdHlsZT0nYm9yZGVyOiAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IGJvdHRvbTogMHB4OyByaWdodDogMHB4OyB2aXNpYmlsaXR5OiB2aXNpYmxlOycgbmFtZT0nZGpoaXN0b3J5JyBpZD0nZGpoaXN0b3J5JyBzcmM9JyIgKyAoZGpDb25maWdbImRvam9JZnJhbWVIaXN0b3J5VXJsIl0gfHwgZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKSsnaWZyYW1lX2hpc3RvcnkuaHRtbCcpICsgIic+PC9pZnJhbWU+Iik7CisJfQorfWNhdGNoKGUpey8qIHNxdWVsY2ggKi99CisKK2lmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworCWRvam8uZGVidWcoIk9wZXJhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb2pvLnVuZG8uYnJvd3Nlciwgc28gYmFjay9mb3J3YXJkIGRldGVjdGlvbiB3aWxsIG5vdCB3b3JrLiIpOworfQorCitkb2pvLnVuZG8uYnJvd3NlciA9IHsKKwlpbml0aWFsSHJlZjogKCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiAiIiwKKwlpbml0aWFsSGFzaDogKCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhhc2ggOiAiIiwKKworCW1vdmVGb3J3YXJkOiBmYWxzZSwKKwloaXN0b3J5U3RhY2s6IFtdLAorCWZvcndhcmRTdGFjazogW10sCisJaGlzdG9yeUlmcmFtZTogbnVsbCwKKwlib29rbWFya0FuY2hvcjogbnVsbCwKKwlsb2NhdGlvblRpbWVyOiBudWxsLAorCisJLyoqCisJICogCisJICovCisJc2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigvKk9iamVjdCovYXJncyl7CisJCS8vc3VtbWFyeTogU2V0cyB0aGUgc3RhdGUgb2JqZWN0IGFuZCBiYWNrIGNhbGxiYWNrIGZvciB0aGUgdmVyeSBmaXJzdCBwYWdlIHRoYXQgaXMgbG9hZGVkLgorCQkvL2Rlc2NyaXB0aW9uOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoaXMgbWV0aG9kIGFzIHBhcnQgb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIHZpYQorCQkvL2Rvam8uYWRkT25Mb2FkKCkuCisJCS8vYXJnczogT2JqZWN0CisJCS8vCQlTZWUgdGhlIGFkZFRvSGlzdG9yeSgpIGZ1bmN0aW9uIGZvciB0aGUgbGlzdCBvZiB2YWxpZCBhcmdzIHByb3BlcnRpZXMuCisJCXRoaXMuaW5pdGlhbFN0YXRlID0gdGhpcy5fY3JlYXRlU3RhdGUodGhpcy5pbml0aWFsSHJlZiwgYXJncywgdGhpcy5pbml0aWFsSGFzaCk7CisJfSwKKworCS8vRklYTUU6IFdvdWxkIGxpa2UgdG8gc3VwcG9ydCBhcmJpdHJhcnkgYmFjay9mb3J3YXJkIGp1bXBzLiBIYXZlIHRvIHJld29yayBpZnJhbWVMb2FkZWQgYW1vbmcgb3RoZXIgdGhpbmdzLgorCS8vRklYTUU6IGlzIHRoZXJlIGEgc2xpZ2h0IHJhY2UgY29uZGl0aW9uIGluIG1veiB1c2luZyBjaGFuZ2UgVVJMIHdpdGggdGhlIHRpbWVyIGNoZWNrIGFuZCB3aGVuCisJLy8gICAgICAgdGhlIGhhc2ggZ2V0cyBzZXQ/IEkgdGhpbmsgSSBoYXZlIHNlZW4gYSBiYWNrL2ZvcndhcmQgY2FsbCBpbiBxdWljayBzdWNjZXNzaW9uLCBidXQgbm90IGNvbnNpc3RlbnQuCisJYWRkVG9IaXN0b3J5OiBmdW5jdGlvbihhcmdzKXsKKwkJLy9zdW1tYXJ5OiBhZGRzIGEgc3RhdGUgb2JqZWN0IChhcmdzKSB0byB0aGUgaGlzdG9yeSBsaXN0LiBZb3UgbXVzdCBzZXQKKwkJLy9kakNvbmZpZy5wcmV2ZW50QmFja0J1dHRvbkZpeCA9IGZhbHNlIHRvIHVzZSBkb2pvLnVuZG8uYnJvd3Nlci4KKworCQkvL2FyZ3M6IE9iamVjdAorCQkvLwkJYXJncyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisJCS8vCQlUbyBzdXBwb3J0IGdldHRpbmcgYmFjayBidXR0b24gbm90aWZpY2F0aW9ucywgdGhlIG9iamVjdCBhcmd1bWVudCBzaG91bGQgaW1wbGVtZW50IGEKKwkJLy8JCWZ1bmN0aW9uIGNhbGxlZCBlaXRoZXIgImJhY2siLCAiYmFja0J1dHRvbiIsIG9yICJoYW5kbGUiLiBUaGUgc3RyaW5nICJiYWNrIiB3aWxsIGJlCisJCS8vCQlwYXNzZWQgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IGFyZ3VtZW50IHRvIHRoaXMgY2FsbGJhY2suCisJCS8vCQktIFRvIHN1cHBvcnQgZ2V0dGluZyBmb3J3YXJkIGJ1dHRvbiBub3RpZmljYXRpb25zLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHNob3VsZCBpbXBsZW1lbnQgYQorCQkvLwkJZnVuY3Rpb24gY2FsbGVkIGVpdGhlciAiZm9yd2FyZCIsICJmb3J3YXJkQnV0dG9uIiwgb3IgImhhbmRsZSIuIFRoZSBzdHJpbmcgImZvcndhcmQiIHdpbGwgYmUKKwkJLy8JCXBhc3NlZCBhcyB0aGUgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQgdG8gdGhpcyBjYWxsYmFjay4KKwkJLy8JCS0gSWYgeW91IHdhbnQgdGhlIGJyb3dzZXIgbG9jYXRpb24gc3RyaW5nIHRvIGNoYW5nZSwgZGVmaW5lICJjaGFuZ2VVcmwiIG9uIHRoZSBvYmplY3QuIElmIHRoZQorCQkvLwkJdmFsdWUgb2YgImNoYW5nZVVybCIgaXMgdHJ1ZSwgdGhlbiBhIHVuaXF1ZSBudW1iZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIGFzIGEgZnJhZ21lbnQKKwkJLy8JCWlkZW50aWZpZXIgKGh0dHA6Ly9zb21lLmRvbWFpbi5jb20vcGF0aCN1bmlxdWVudW1iZXIpLiBJZiBpdCBpcyBhbnkgb3RoZXIgdmFsdWUgdGhhdCBkb2VzCisJCS8vCQlub3QgZXZhbHVhdGUgdG8gZmFsc2UsIHRoYXQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyLiBGb3IgZXhhbXBsZSwKKwkJLy8JCWlmIGNoYW5nZVVybDogJ3BhZ2UxJywgdGhlbiB0aGUgVVJMIHdpbGwgbG9vayBsaWtlOiBodHRwOi8vc29tZS5kb21haW4uY29tL3BhdGgjcGFnZTEKKwkgCS8vCQlGdWxsIGV4YW1wbGU6CisJCS8vCQlkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3RvcnkoeworCQkvLwkJICBiYWNrOiBmdW5jdGlvbigpIHsgYWxlcnQoJ2JhY2sgcHJlc3NlZCcpOyB9LAorCQkvLwkJICBmb3J3YXJkOiBmdW5jdGlvbigpIHsgYWxlcnQoJ2ZvcndhcmQgcHJlc3NlZCcpOyB9LAorCQkvLwkJICBjaGFuZ2VVcmw6IHRydWUKKwkJLy8JCX0pOworCQkvLworCQkvLwlCUk9XU0VSIE5PVEVTOgorCQkvLyAgU2FmYXJpIDEuMjogCisJCS8vCWJhY2sgYnV0dG9uICJ3b3JrcyIgZmluZSwgaG93ZXZlciBpdCdzIG5vdCBwb3NzaWJsZSB0byBhY3R1YWxseQorCQkvLwlERVRFQ1QgdGhhdCB5b3UndmUgbW92ZWQgYmFja3dhcmRzIGJ5IGluc3BlY3Rpbmcgd2luZG93LmxvY2F0aW9uLgorCQkvLwlVbmxlc3MgdGhlcmUgaXMgc29tZSBvdGhlciBtZWFucyBvZiBsb2NhdGluZy4KKwkJLy8JRklYTUU6IHBlcmhhcHMgd2UgY2FuIHBvbGwgb24gaGlzdG9yeS5sZW5ndGg/CisJCS8vCVNhZmFyaSAyLjAuMysgKGFuZCBwcm9iYWJseSAxLjMuMispOgorCQkvLwl3b3JrcyBmaW5lLCBleGNlcHQgd2hlbiBjaGFuZ2VVcmwgaXMgdXNlZC4gV2hlbiBjaGFuZ2VVcmwgaXMgdXNlZCwKKwkJLy8JU2FmYXJpIGp1bXBzIGFsbCB0aGUgd2F5IGJhY2sgdG8gd2hhdGV2ZXIgcGFnZSB3YXMgc2hvd24gYmVmb3JlCisJCS8vCXRoZSBwYWdlIHRoYXQgdXNlcyBkb2pvLnVuZG8uYnJvd3NlciBzdXBwb3J0LgorCQkvLwlJRSA1LjUgU1AyOgorCQkvLwliYWNrIGJ1dHRvbiBiZWhhdmlvciBpcyBtYWNyby4gSXQgZG9lcyBub3QgbW92ZSBiYWNrIHRvIHRoZQorCQkvLwlwcmV2aW91cyBoYXNoIHZhbHVlLCBidXQgdG8gdGhlIGxhc3QgZnVsbCBwYWdlIGxvYWQuIFRoaXMgc3VnZ2VzdHMKKwkJLy8JdGhhdCB0aGUgaWZyYW1lIGlzIHRoZSBjb3JyZWN0IHdheSB0byBjYXB0dXJlIHRoZSBiYWNrIGJ1dHRvbiBpbgorCQkvLwl0aGVzZSBjYXNlcy4KKwkJLy8JRG9uJ3QgdGVzdCB0aGlzIHBhZ2UgdXNpbmcgbG9jYWwgZGlzayBmb3IgTVNJRS4gTVNJRSB3aWxsIG5vdCBjcmVhdGUgCisJCS8vCWEgaGlzdG9yeSBsaXN0IGZvciBpZnJhbWVfaGlzdG9yeS5odG1sIGlmIHNlcnZlZCBmcm9tIGEgZmlsZTogVVJMLiAKKwkJLy8JVGhlIFhNTCBzZXJ2ZWQgYmFjayBmcm9tIHRoZSBYSFIgdGVzdHMgd2lsbCBhbHNvIG5vdCBiZSBwcm9wZXJseSAKKwkJLy8JY3JlYXRlZCBpZiBzZXJ2ZWQgZnJvbSBsb2NhbCBkaXNrLiBTZXJ2ZSB0aGUgdGVzdCBwYWdlcyBmcm9tIGEgd2ViIAorCQkvLwlzZXJ2ZXIgdG8gdGVzdCBpbiB0aGF0IGJyb3dzZXIuCisJCS8vCUlFIDYuMDoKKwkJLy8Jc2FtZSBiZWhhdmlvciBhcyBJRSA1LjUgU1AyCisJCS8vCUZpcmVmb3ggMS4wKzoKKwkJLy8JdGhlIGJhY2sgYnV0dG9uIHdpbGwgcmV0dXJuIHVzIHRvIHRoZSBwcmV2aW91cyBoYXNoIG9uIHRoZSBzYW1lCisJCS8vCXBhZ2UsIHRoZXJlYnkgbm90IHJlcXVpcmluZyBhbiBpZnJhbWUgaGFjaywgYWx0aG91Z2ggd2UgZG8gdGhlbgorCQkvLwluZWVkIHRvIHJ1biBhIHRpbWVyIHRvIGRldGVjdCBpbnRlci1wYWdlIG1vdmVtZW50LgorCisJCS8vSWYgYWRkVG9IaXN0b3J5IGlzIGNhbGxlZCwgdGhlbiB0aGF0IG1lYW5zIHdlIHBydW5lIHRoZQorCQkvL2ZvcndhcmQgc3RhY2sgLS0gdGhlIHVzZXIgd2VudCBiYWNrLCB0aGVuIHdhbnRlZCB0bworCQkvL3N0YXJ0IGEgbmV3IGZvcndhcmQgcGF0aC4KKwkJdGhpcy5mb3J3YXJkU3RhY2sgPSBbXTsgCisKKwkJdmFyIGhhc2ggPSBudWxsOworCQl2YXIgdXJsID0gbnVsbDsKKwkJaWYoIXRoaXMuaGlzdG9yeUlmcmFtZSl7CisJCQlpZihkakNvbmZpZ1sidXNlWERvbWFpbiJdICYmICFkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSl7CisJCQkJZG9qby5kZWJ1ZygiZG9qby51bmRvLmJyb3dzZXI6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIKKwkJCQkJKyAiIHBsZWFzZSBzYXZlIGlmcmFtZV9oaXN0b3J5Lmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvSWZyYW1lSGlzdG9yeVVybCIKKwkJCQkJKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIGlmcmFtZV9oaXN0b3J5Lmh0bWwiKTsKKwkJCX0KKwkJCXRoaXMuaGlzdG9yeUlmcmFtZSA9IHdpbmRvdy5mcmFtZXNbImRqaGlzdG9yeSJdOworCQl9CisJCWlmKCF0aGlzLmJvb2ttYXJrQW5jaG9yKXsKKwkJCXRoaXMuYm9va21hcmtBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmJvb2ttYXJrQW5jaG9yKTsKKwkJCXRoaXMuYm9va21hcmtBbmNob3Iuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJfQorCQlpZihhcmdzWyJjaGFuZ2VVcmwiXSl7CisJCQloYXNoID0gIiMiKyAoKGFyZ3NbImNoYW5nZVVybCJdIT09dHJ1ZSkgPyBhcmdzWyJjaGFuZ2VVcmwiXSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpOworCQkJCisJCQkvL0lmIHRoZSBjdXJyZW50IGhhc2ggbWF0Y2hlcyB0aGUgbmV3IG9uZSwganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5IG9iamVjdCB3aXRoCisJCQkvL3RoaXMgbmV3IG9uZS4gSXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHRyYWNrIGRpZmZlcmVudCBzdGF0ZSBvYmplY3RzIGZvciB0aGUgc2FtZQorCQkJLy9sb2dpY2FsIFVSTC4gVGhpcyBtYXRjaGVzIHRoZSBicm93c2VyIGJlaGF2aW9yIG9mIG9ubHkgcHV0dGluZyBpbiBvbmUgaGlzdG9yeQorCQkJLy9pdGVtIG5vIG1hdHRlciBob3cgbWFueSB0aW1lcyB5b3UgY2xpY2sgb24gdGhlIHNhbWUgI2hhc2ggbGluaywgYXQgbGVhc3QgaW4gRmlyZWZveAorCQkJLy9hbmQgU2FmYXJpLCBhbmQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IGluIHRob3NlIGJyb3dzZXJzIHRvIGtub3cgaWYgYSAjaGFzaCBsaW5rCisJCQkvL2hhcyBiZWVuIGNsaWNrZWQgb24gbXVsdGlwbGUgdGltZXMuIFNvIG1ha2luZyB0aGlzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciBpbiBhbGwgYnJvd3NlcnMKKwkJCS8vc28gdGhhdCBkb2pvLnVuZG8uYnJvd3NlcidzIGJlaGF2aW9yIGlzIHRoZSBzYW1lIGluIGFsbCBicm93c2Vycy4KKwkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAwICYmIHRoaXMuaW5pdGlhbFN0YXRlLnVybEhhc2ggPT0gaGFzaCl7CisJCQkJdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLl9jcmVhdGVTdGF0ZSh1cmwsIGFyZ3MsIGhhc2gpOworCQkJCXJldHVybjsKKwkJCX1lbHNlIGlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA+IDAgJiYgdGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIC0gMV0udXJsSGFzaCA9PSBoYXNoKXsKKwkJCQl0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggLSAxXSA9IHRoaXMuX2NyZWF0ZVN0YXRlKHVybCwgYXJncywgaGFzaCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQl0aGlzLmNoYW5naW5nVXJsID0gdHJ1ZTsKKwkJCXNldFRpbWVvdXQoIndpbmRvdy5sb2NhdGlvbi5ocmVmID0gJyIraGFzaCsiJzsgZG9qby51bmRvLmJyb3dzZXIuY2hhbmdpbmdVcmwgPSBmYWxzZTsiLCAxKTsKKwkJCXRoaXMuYm9va21hcmtBbmNob3IuaHJlZiA9IGhhc2g7CisJCQkKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCXVybCA9IHRoaXMuX2xvYWRJZnJhbWVIaXN0b3J5KCk7CisKKwkJCQl2YXIgb2xkQ0IgPSBhcmdzWyJiYWNrIl18fGFyZ3NbImJhY2tCdXR0b24iXXx8YXJnc1siaGFuZGxlIl07CisKKwkJCQkvL1RoZSBmdW5jdGlvbiB0YWtlcyBoYW5kbGVOYW1lIGFzIGEgcGFyYW1ldGVyLCBpbiBjYXNlIHRoZQorCQkJCS8vY2FsbGJhY2sgd2UgYXJlIG92ZXJyaWRpbmcgd2FzICJoYW5kbGUiLiBJbiB0aGF0IGNhc2UsCisJCQkJLy93ZSB3aWxsIG5lZWQgdG8gcGFzcyB0aGUgaGFuZGxlIG5hbWUgdG8gaGFuZGxlLgorCQkJCXZhciB0Y2IgPSBmdW5jdGlvbihoYW5kbGVOYW1lKXsKKwkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhhc2ggIT0gIiIpeworCQkJCQkJc2V0VGltZW91dCgid2luZG93LmxvY2F0aW9uLmhyZWYgPSAnIitoYXNoKyInOyIsIDEpOworCQkJCQl9CisJCQkJCS8vVXNlIGFwcGx5IHRvIHNldCAidGhpcyIgdG8gYXJncywgYW5kIHRvIHRyeSB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisJCQkJCW9sZENCLmFwcGx5KHRoaXMsIFtoYW5kbGVOYW1lXSk7CisJCQkJfQorCQkKKwkJCQkvL1NldCBpbnRlcmNlcHRvciBmdW5jdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuCisJCQkJaWYoYXJnc1siYmFjayJdKXsKKwkJCQkJYXJncy5iYWNrID0gdGNiOworCQkJCX1lbHNlIGlmKGFyZ3NbImJhY2tCdXR0b24iXSl7CisJCQkJCWFyZ3MuYmFja0J1dHRvbiA9IHRjYjsKKwkJCQl9ZWxzZSBpZihhcmdzWyJoYW5kbGUiXSl7CisJCQkJCWFyZ3MuaGFuZGxlID0gdGNiOworCQkJCX0KKwkJCisJCQkJdmFyIG9sZEZXID0gYXJnc1siZm9yd2FyZCJdfHxhcmdzWyJmb3J3YXJkQnV0dG9uIl18fGFyZ3NbImhhbmRsZSJdOworCQkKKwkJCQkvL1RoZSBmdW5jdGlvbiB0YWtlcyBoYW5kbGVOYW1lIGFzIGEgcGFyYW1ldGVyLCBpbiBjYXNlIHRoZQorCQkJCS8vY2FsbGJhY2sgd2UgYXJlIG92ZXJyaWRpbmcgd2FzICJoYW5kbGUiLiBJbiB0aGF0IGNhc2UsCisJCQkJLy93ZSB3aWxsIG5lZWQgdG8gcGFzcyB0aGUgaGFuZGxlIG5hbWUgdG8gaGFuZGxlLgorCQkJCXZhciB0ZncgPSBmdW5jdGlvbihoYW5kbGVOYW1lKXsKKwkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhhc2ggIT0gIiIpeworCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBoYXNoOworCQkJCQl9CisJCQkJCWlmKG9sZEZXKXsgLy8gd2UgbWlnaHQgbm90IGFjdHVhbGx5IGhhdmUgb25lCisJCQkJCQkvL1VzZSBhcHBseSB0byBzZXQgInRoaXMiIHRvIGFyZ3MsIGFuZCB0byB0cnkgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorCQkJCQkJb2xkRlcuYXBwbHkodGhpcywgW2hhbmRsZU5hbWVdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vU2V0IGludGVyY2VwdG9yIGZ1bmN0aW9uIGluIHRoZSByaWdodCBwbGFjZS4KKwkJCQlpZihhcmdzWyJmb3J3YXJkIl0peworCQkJCQlhcmdzLmZvcndhcmQgPSB0Znc7CisJCQkJfWVsc2UgaWYoYXJnc1siZm9yd2FyZEJ1dHRvbiJdKXsKKwkJCQkJYXJncy5mb3J3YXJkQnV0dG9uID0gdGZ3OworCQkJCX1lbHNlIGlmKGFyZ3NbImhhbmRsZSJdKXsKKwkJCQkJYXJncy5oYW5kbGUgPSB0Znc7CisJCQkJfQorCisJCQl9ZWxzZSBpZihkb2pvLnJlbmRlci5odG1sLm1veil7CisJCQkJLy8gc3RhcnQgdGhlIHRpbWVyCisJCQkJaWYoIXRoaXMubG9jYXRpb25UaW1lcil7CisJCQkJCXRoaXMubG9jYXRpb25UaW1lciA9IHNldEludGVydmFsKCJkb2pvLnVuZG8uYnJvd3Nlci5jaGVja0xvY2F0aW9uKCk7IiwgMjAwKTsKKwkJCQl9CisJCQl9CisJCX1lbHNleworCQkJdXJsID0gdGhpcy5fbG9hZElmcmFtZUhpc3RvcnkoKTsKKwkJfQorCisJCXRoaXMuaGlzdG9yeVN0YWNrLnB1c2godGhpcy5fY3JlYXRlU3RhdGUodXJsLCBhcmdzLCBoYXNoKSk7CisJfSwKKworCWNoZWNrTG9jYXRpb246IGZ1bmN0aW9uKCl7CisJCS8vc3VtbWFyeTogcHJpdmF0ZSBtZXRob2QuIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkuCisJCWlmICghdGhpcy5jaGFuZ2luZ1VybCl7CisJCQl2YXIgaHNsID0gdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoOworCisJCQlpZigod2luZG93LmxvY2F0aW9uLmhhc2ggPT0gdGhpcy5pbml0aWFsSGFzaHx8d2luZG93LmxvY2F0aW9uLmhyZWYgPT0gdGhpcy5pbml0aWFsSHJlZikmJihoc2wgPT0gMSkpeworCQkJCS8vIEZJWE1FOiBjb3VsZCB0aGlzIGV2ZXIgYmUgYSBmb3J3YXJkIGJ1dHRvbj8KKwkJCQkvLyB3ZSBjYW4ndCBjbGVhciBpdCBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgZm9yIGZvcndhcmRzLiBVZ2cuCisJCQkJLy8gY2xlYXJJbnRlcnZhbCh0aGlzLmxvY2F0aW9uVGltZXIpOworCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGNvdWxkIGhhdmUgZ29uZSBmb3J3YXJkLiBXZSBhbHdheXMgaGFsdCBvbgorCQkJLy8gYSBuby1oYXNoIGl0ZW0uCisJCQlpZih0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggPiAwKXsKKwkJCQlpZih0aGlzLmZvcndhcmRTdGFja1t0aGlzLmZvcndhcmRTdGFjay5sZW5ndGgtMV0udXJsSGFzaCA9PSB3aW5kb3cubG9jYXRpb24uaGFzaCl7CisJCQkJCXRoaXMuaGFuZGxlRm9yd2FyZEJ1dHRvbigpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQorCQkJLy8gb2ssIHRoYXQgZGlkbid0IHdvcmssIHRyeSBzb21lcGxhY2UgYmFjayBpbiB0aGUgaGlzdG9yeSBzdGFjaworCQkJaWYoKGhzbCA+PSAyKSYmKHRoaXMuaGlzdG9yeVN0YWNrW2hzbC0yXSkpeworCQkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrW2hzbC0yXS51cmxIYXNoPT13aW5kb3cubG9jYXRpb24uaGFzaCl7CisJCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCWlmcmFtZUxvYWRlZDogZnVuY3Rpb24oZXZ0LCBpZnJMb2MpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCQlpZighZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7CisJCQl2YXIgcXVlcnkgPSB0aGlzLl9nZXRVcmxRdWVyeShpZnJMb2MuaHJlZik7CisJCQlpZihxdWVyeSA9PSBudWxsKXsgCisJCQkJLy8gYWxlcnQoImlmcmFtZUxvYWRlZCIpOworCQkJCS8vIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5LCBzbyB3ZSBzaG91bGQgZ28gYmFjaworCQkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAxKXsKKwkJCQkJdGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmKHRoaXMubW92ZUZvcndhcmQpeworCQkJCS8vIHdlIHdlcmUgZXhwZWN0aW5nIGl0LCBzbyBpdCdzIG5vdCBlaXRoZXIgYSBmb3J3YXJkIG9yIGJhY2t3YXJkIG1vdmVtZW50CisJCQkJdGhpcy5tb3ZlRm9yd2FyZCA9IGZhbHNlOworCQkJCXJldHVybjsKKwkJCX0KKwkKKwkJCS8vQ2hlY2sgdGhlIGJhY2sgc3RhY2sgZmlyc3QsIHNpbmNlIGl0IGlzIG1vcmUgbGlrZWx5LgorCQkJLy9Ob3RlIHRoYXQgb25seSBvbmUgc3RlcCBiYWNrIG9yIGZvcndhcmQgaXMgc3VwcG9ydGVkLgorCQkJaWYodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID49IDIgJiYgcXVlcnkgPT0gdGhpcy5fZ2V0VXJsUXVlcnkodGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoLTJdLnVybCkpeworCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJfQorCQkJZWxzZSBpZih0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggPiAwICYmIHF1ZXJ5ID09IHRoaXMuX2dldFVybFF1ZXJ5KHRoaXMuZm9yd2FyZFN0YWNrW3RoaXMuZm9yd2FyZFN0YWNrLmxlbmd0aC0xXS51cmwpKXsKKwkJCQl0aGlzLmhhbmRsZUZvcndhcmRCdXR0b24oKTsKKwkJCX0KKwkJfQorCX0sCisKKwloYW5kbGVCYWNrQnV0dG9uOiBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCisJCS8vVGhlICJjdXJyZW50IiBwYWdlIGlzIGFsd2F5cyBhdCB0aGUgdG9wIG9mIHRoZSBoaXN0b3J5IHN0YWNrLgorCQl2YXIgY3VycmVudCA9IHRoaXMuaGlzdG9yeVN0YWNrLnBvcCgpOworCQlpZighY3VycmVudCl7IHJldHVybjsgfQorCQl2YXIgbGFzdCA9IHRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aC0xXTsKKwkJaWYoIWxhc3QgJiYgdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID09IDApeworCQkJbGFzdCA9IHRoaXMuaW5pdGlhbFN0YXRlOworCQl9CisJCWlmIChsYXN0KXsKKwkJCWlmKGxhc3Qua3dBcmdzWyJiYWNrIl0peworCQkJCWxhc3Qua3dBcmdzWyJiYWNrIl0oKTsKKwkJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJiYWNrQnV0dG9uIl0peworCQkJCWxhc3Qua3dBcmdzWyJiYWNrQnV0dG9uIl0oKTsKKwkJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CisJCQkJbGFzdC5rd0FyZ3MuaGFuZGxlKCJiYWNrIik7CisJCQl9CisJCX0KKwkJdGhpcy5mb3J3YXJkU3RhY2sucHVzaChjdXJyZW50KTsKKwl9LAorCisJaGFuZGxlRm9yd2FyZEJ1dHRvbjogZnVuY3Rpb24oKXsKKwkJLy9zdW1tYXJ5OiBwcml2YXRlIG1ldGhvZC4gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKworCQl2YXIgbGFzdCA9IHRoaXMuZm9yd2FyZFN0YWNrLnBvcCgpOworCQlpZighbGFzdCl7IHJldHVybjsgfQorCQlpZihsYXN0Lmt3QXJnc1siZm9yd2FyZCJdKXsKKwkJCWxhc3Qua3dBcmdzLmZvcndhcmQoKTsKKwkJfWVsc2UgaWYobGFzdC5rd0FyZ3NbImZvcndhcmRCdXR0b24iXSl7CisJCQlsYXN0Lmt3QXJncy5mb3J3YXJkQnV0dG9uKCk7CisJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CisJCQlsYXN0Lmt3QXJncy5oYW5kbGUoImZvcndhcmQiKTsKKwkJfQorCQl0aGlzLmhpc3RvcnlTdGFjay5wdXNoKGxhc3QpOworCX0sCisKKwlfY3JlYXRlU3RhdGU6IGZ1bmN0aW9uKHVybCwgYXJncywgaGFzaCl7CisJCS8vc3VtbWFyeTogcHJpdmF0ZSBtZXRob2QuIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkuCisKKwkJcmV0dXJuIHsidXJsIjogdXJsLCAia3dBcmdzIjogYXJncywgInVybEhhc2giOiBoYXNofTsJLy9PYmplY3QKKwl9LAorCisJX2dldFVybFF1ZXJ5OiBmdW5jdGlvbih1cmwpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCQl2YXIgc2VnbWVudHMgPSB1cmwuc3BsaXQoIj8iKTsKKwkJaWYgKHNlZ21lbnRzLmxlbmd0aCA8IDIpeworCQkJcmV0dXJuIG51bGw7IC8vbnVsbAorCQl9CisJCWVsc2V7CisJCQlyZXR1cm4gc2VnbWVudHNbMV07IC8vU3RyaW5nCisJCX0KKwl9LAorCQorCV9sb2FkSWZyYW1lSGlzdG9yeTogZnVuY3Rpb24oKXsKKwkJLy9zdW1tYXJ5OiBwcml2YXRlIG1ldGhvZC4gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKwkJdmFyIHVybCA9IChkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSB8fCBkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpKydpZnJhbWVfaGlzdG9yeS5odG1sJykKKwkJCSsgIj8iICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwkJdGhpcy5tb3ZlRm9yd2FyZCA9IHRydWU7CisJCWRvam8uaW8uc2V0SUZyYW1lU3JjKHRoaXMuaGlzdG9yeUlmcmFtZSwgdXJsLCBmYWxzZSk7CQorCQlyZXR1cm4gdXJsOyAvL1N0cmluZworCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLmlvLkJyb3dzZXJJTyIpOworCisKKworCisKKworCisKK2lmKCFkal91bmRlZigid2luZG93IikpIHsKKworZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSl7CisJLy9zdW1tYXJ5OiBDaGVja3MgYW55IGNoaWxkIG5vZGVzIG9mIG5vZGUgZm9yIGFuIGlucHV0IHR5cGU9ImZpbGUiIGVsZW1lbnQuCisJdmFyIGhhc0ZpbGUgPSBmYWxzZTsKKwl2YXIgaW5wdXRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKKwlkb2pvLmxhbmcuZm9yRWFjaChpbnB1dHMsIGZ1bmN0aW9uKGlucHV0KXsKKwkJaWYoaGFzRmlsZSl7IHJldHVybjsgfQorCQlpZihpbnB1dC5nZXRBdHRyaWJ1dGUoInR5cGUiKT09ImZpbGUiKXsKKwkJCWhhc0ZpbGUgPSB0cnVlOworCQl9CisJfSk7CisJcmV0dXJuIGhhc0ZpbGU7IC8vYm9vbGVhbgorfQorCitkb2pvLmlvLmZvcm1IYXNGaWxlID0gZnVuY3Rpb24oLypET01Ob2RlKi9mb3JtTm9kZSl7CisJLy9zdW1tYXJ5OiBKdXN0IGNhbGxzIGRvam8uaW8uY2hlY2tDaGlsZHJlbkZvckZpbGUoKS4KKwlyZXR1cm4gZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZShmb3JtTm9kZSk7IC8vYm9vbGVhbgorfQorCitkb2pvLmlvLnVwZGF0ZU5vZGUgPSBmdW5jdGlvbigvKkRPTU5vZGUqL25vZGUsIC8qU3RyaW5nIG9yIE9iamVjdCovdXJsT3JBcmdzKXsKKwkvL3N1bW1hcnk6IFVwZGF0ZXMgYSBET01ub2RlIHdpdGggdGhlIHJlc3VsdCBvZiBhIGRvam8uaW8uYmluZCgpIGNhbGwuCisJLy9ub2RlOiBET01Ob2RlCisJLy91cmxPckFyZ3M6IFN0cmluZyBvciBPYmplY3QKKwkvLwkJRWl0aGVyIGEgU3RyaW5nIHRoYXQgaGFzIGFuIFVSTCwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZG9qby5pby5iaW5kKCkKKwkvLwkJYXJndW1lbnRzLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGFyZ3MgPSB1cmxPckFyZ3M7CisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKHVybE9yQXJncykpeworCQlhcmdzID0geyB1cmw6IHVybE9yQXJncyB9OworCX0KKwlhcmdzLm1pbWV0eXBlID0gInRleHQvaHRtbCI7CisJYXJncy5sb2FkID0gZnVuY3Rpb24odCwgZCwgZSl7CisJCXdoaWxlKG5vZGUuZmlyc3RDaGlsZCl7CisJCQlkb2pvLmRvbS5kZXN0cm95Tm9kZShub2RlLmZpcnN0Q2hpbGQpOworCQl9CisJCW5vZGUuaW5uZXJIVE1MID0gZDsKKwl9OworCWRvam8uaW8uYmluZChhcmdzKTsKK30KKworZG9qby5pby5mb3JtRmlsdGVyID0gZnVuY3Rpb24oLypET01Ob2RlKi9ub2RlKSB7CisJLy9zdW1tYXJ5OiBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYW4gaW5wdXQgZWxlbWVudCB0aGF0IGlzIGVuYWJsZWQsIGhhcworCS8vYSBuYW1lLCBhbmQgd2hvc2UgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFsiZmlsZSIsICJzdWJtaXQiLCAiaW1hZ2UiLCAicmVzZXQiLCAiYnV0dG9uIl0KKwl2YXIgdHlwZSA9IChub2RlLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpOworCXJldHVybiAhbm9kZS5kaXNhYmxlZCAmJiBub2RlLm5hbWUKKwkJJiYgIWRvam8ubGFuZy5pbkFycmF5KFsiZmlsZSIsICJzdWJtaXQiLCAiaW1hZ2UiLCAicmVzZXQiLCAiYnV0dG9uIl0sIHR5cGUpOyAvL2Jvb2xlYW4KK30KKworLy8gVE9ETzogTW92ZSB0byBodG1sVXRpbHMKK2Rvam8uaW8uZW5jb2RlRm9ybSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovZm9ybU5vZGUsIC8qU3RyaW5nPyovZW5jb2RpbmcsIC8qRnVuY3Rpb24/Ki9mb3JtRmlsdGVyKXsKKwkvL3N1bW1hcnk6IENvbnZlcnRzIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGZvcm0gZWxlbWVudHMgaW50byBhbiBVUkwtZW5jb2RlZAorCS8vc3RyaW5nIChuYW1lPXZhbHVlJm5hbWU9dmFsdWUuLi4pLgorCS8vZm9ybU5vZGU6IERPTU5vZGUKKwkvL2VuY29kaW5nOiBTdHJpbmc/CisJLy8JCVRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSB2YWx1ZXMuIFNwZWNpZnkgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aAorCS8vCQkidXRmIiAoZm9yIGluc3RhbmNlLCAidXRmOCIpLCB0byB1c2UgZW5jb2RlVVJJQ29tcG9uZW50KCkgYXMgdGhlIGVuY29kaW5nCisJLy8JCWZ1bmN0aW9uLiBPdGhlcndpc2UsIGRvam8uc3RyaW5nLmVuY29kZUFzY2lpIHdpbGwgYmUgdXNlZC4KKwkvL2Zvcm1GaWx0ZXI6IEZ1bmN0aW9uPworCS8vCUEgZnVuY3Rpb24gdXNlZCB0byBmaWx0ZXIgb3V0IGZvcm0gZWxlbWVudHMuIFRoZSBlbGVtZW50IG5vZGUgd2lsbCBiZSBwYXNzZWQKKwkvLwl0byB0aGUgZm9ybUZpbHRlciBmdW5jdGlvbiwgYW5kIGEgYm9vbGVhbiByZXN1bHQgaXMgZXhwZWN0ZWQgKHRydWUgaW5kaWNhdGluZworCS8vCWluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBzaG91bGQgaGF2ZSBpdHMgbmFtZS92YWx1ZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0KS4KKwkvLwlJZiBubyBmb3JtRmlsdGVyIGlzIHNwZWNpZmllZCwgdGhlbiBkb2pvLmlvLmZvcm1GaWx0ZXIoKSB3aWxsIGJlIHVzZWQuCisJaWYoKCFmb3JtTm9kZSl8fCghZm9ybU5vZGUudGFnTmFtZSl8fCghZm9ybU5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJmb3JtIikpeworCQlkb2pvLnJhaXNlKCJBdHRlbXB0ZWQgdG8gZW5jb2RlIGEgbm9uLWZvcm0gZWxlbWVudC4iKTsKKwl9CisJaWYoIWZvcm1GaWx0ZXIpIHsgZm9ybUZpbHRlciA9IGRvam8uaW8uZm9ybUZpbHRlcjsgfQorCXZhciBlbmMgPSAvdXRmL2kudGVzdChlbmNvZGluZ3x8IiIpID8gZW5jb2RlVVJJQ29tcG9uZW50IDogZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk7CisJdmFyIHZhbHVlcyA9IFtdOworCisJZm9yKHZhciBpID0gMDsgaSA8IGZvcm1Ob2RlLmVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJdmFyIGVsbSA9IGZvcm1Ob2RlLmVsZW1lbnRzW2ldOworCQlpZighZWxtIHx8IGVsbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImZpZWxkc2V0IiB8fCAhZm9ybUZpbHRlcihlbG0pKSB7IGNvbnRpbnVlOyB9CisJCXZhciBuYW1lID0gZW5jKGVsbS5uYW1lKTsKKwkJdmFyIHR5cGUgPSBlbG0udHlwZS50b0xvd2VyQ2FzZSgpOworCisJCWlmKHR5cGUgPT0gInNlbGVjdC1tdWx0aXBsZSIpeworCQkJZm9yKHZhciBqID0gMDsgaiA8IGVsbS5vcHRpb25zLmxlbmd0aDsgaisrKXsKKwkJCQlpZihlbG0ub3B0aW9uc1tqXS5zZWxlY3RlZCkgeworCQkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGVsbS5vcHRpb25zW2pdLnZhbHVlKSk7CisJCQkJfQorCQkJfQorCQl9ZWxzZSBpZihkb2pvLmxhbmcuaW5BcnJheShbInJhZGlvIiwgImNoZWNrYm94Il0sIHR5cGUpKXsKKwkJCWlmKGVsbS5jaGVja2VkKXsKKwkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGVsbS52YWx1ZSkpOworCQkJfQorCQl9ZWxzZXsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiPSIgKyBlbmMoZWxtLnZhbHVlKSk7CisJCX0KKwl9CisKKwkvLyBub3cgY29sbGVjdCBpbnB1dCB0eXBlPSJpbWFnZSIsIHdoaWNoIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgZWxlbWVudHMgYXJyYXkKKwl2YXIgaW5wdXRzID0gZm9ybU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7CisJZm9yKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgeworCQl2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisJCWlmKGlucHV0LnR5cGUudG9Mb3dlckNhc2UoKSA9PSAiaW1hZ2UiICYmIGlucHV0LmZvcm0gPT0gZm9ybU5vZGUKKwkJCSYmIGZvcm1GaWx0ZXIoaW5wdXQpKSB7CisJCQl2YXIgbmFtZSA9IGVuYyhpbnB1dC5uYW1lKTsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiPSIgKyBlbmMoaW5wdXQudmFsdWUpKTsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiLng9MCIpOworCQkJdmFsdWVzLnB1c2gobmFtZSArICIueT0wIik7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlcy5qb2luKCImIikgKyAiJiI7IC8vU3RyaW5nCit9CisKK2Rvam8uaW8uRm9ybUJpbmQgPSBmdW5jdGlvbigvKkRPTU5vZGUgb3IgT2JqZWN0Ki9hcmdzKSB7CisJLy9zdW1tYXJ5OiBjb25zdHJ1Y3RvciBmb3IgYSBkb2pvLmlvLkZvcm1CaW5kIG9iamVjdC4gU2VlIHRoZSBEb2pvIEJvb2sgZm9yCisJLy9zb21lIGluZm9ybWF0aW9uIG9uIHVzYWdlOiBodHRwOi8vbWFudWFsLmRvam90b29sa2l0Lm9yZy9XaWtpSG9tZS9Eb2pvRG90Qm9vay9Cb29rMjMKKwkvL2FyZ3M6IERPTU5vZGUgb3IgT2JqZWN0CisJLy8JCWFyZ3MgY2FuIGVpdGhlciBiZSB0aGUgRE9NTm9kZSBmb3IgYSBmb3JtIGVsZW1lbnQsIG9yIGFuIG9iamVjdCBjb250YWluaW5nCisJLy8JCWRvam8uaW8uYmluZCgpIGFyZ3VtZW50cywgb25lIG9mIHdoaWNoIHNob3VsZCBiZSBmb3JtTm9kZSB3aXRoIHRoZSB2YWx1ZSBvZgorCS8vCQlhIGZvcm0gZWxlbWVudCBET01Ob2RlLgorCXRoaXMuYmluZEFyZ3MgPSB7fTsKKworCWlmKGFyZ3MgJiYgYXJncy5mb3JtTm9kZSkgeworCQl0aGlzLmluaXQoYXJncyk7CisJfSBlbHNlIGlmKGFyZ3MpIHsKKwkJdGhpcy5pbml0KHtmb3JtTm9kZTogYXJnc30pOworCX0KK30KK2Rvam8ubGFuZy5leHRlbmQoZG9qby5pby5Gb3JtQmluZCwgeworCWZvcm06IG51bGwsCisKKwliaW5kQXJnczogbnVsbCwKKworCWNsaWNrZWRCdXR0b246IG51bGwsCisKKwlpbml0OiBmdW5jdGlvbigvKkRPTU5vZGUgb3IgT2JqZWN0Ki9hcmdzKSB7CisJCS8vc3VtbWFyeTogSW50ZXJuYWwgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBkb2pvLmlvLkZvcm1CaW5kKCkgY29uc3RydWN0b3IKKwkJLy9kbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKwkJdmFyIGZvcm0gPSBkb2pvLmJ5SWQoYXJncy5mb3JtTm9kZSk7CisKKwkJaWYoIWZvcm0gfHwgIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAiZm9ybSIpIHsKKwkJCXRocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IENvdWxkbid0IGFwcGx5LCBpbnZhbGlkIGZvcm0iKTsKKwkJfSBlbHNlIGlmKHRoaXMuZm9ybSA9PSBmb3JtKSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZih0aGlzLmZvcm0pIHsKKwkJCXRocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IEFscmVhZHkgYXBwbGllZCB0byBhIGZvcm0iKTsKKwkJfQorCisJCWRvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLCBhcmdzKTsKKwkJdGhpcy5mb3JtID0gZm9ybTsKKworCQl0aGlzLmNvbm5lY3QoZm9ybSwgIm9uc3VibWl0IiwgInN1Ym1pdCIpOworCisJCWZvcih2YXIgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgbm9kZSA9IGZvcm0uZWxlbWVudHNbaV07CisJCQlpZihub2RlICYmIG5vZGUudHlwZSAmJiBkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsICJidXR0b24iXSwgbm9kZS50eXBlLnRvTG93ZXJDYXNlKCkpKSB7CisJCQkJdGhpcy5jb25uZWN0KG5vZGUsICJvbmNsaWNrIiwgImNsaWNrIik7CisJCQl9CisJCX0KKworCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKKwkJZm9yKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIGlucHV0ID0gaW5wdXRzW2ldOworCQkJaWYoaW5wdXQudHlwZS50b0xvd2VyQ2FzZSgpID09ICJpbWFnZSIgJiYgaW5wdXQuZm9ybSA9PSBmb3JtKSB7CisJCQkJdGhpcy5jb25uZWN0KGlucHV0LCAib25jbGljayIsICJjbGljayIpOworCQkJfQorCQl9CisJfSwKKworCW9uU3VibWl0OiBmdW5jdGlvbigvKkRPTU5vZGUqL2Zvcm0pIHsKKwkJLy9zdW1tYXJ5OiBGdW5jdGlvbiB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmb3JtIGlzIE9LIHRvIHN1Ym1pdC4KKwkJLy9PdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHNwZWNpZmljIGZvcm0gdmFsaWRhdGlvbiBkb25lLgorCQlyZXR1cm4gdHJ1ZTsgLy9ib29sZWFuCisJfSwKKworCXN1Ym1pdDogZnVuY3Rpb24oLypFdmVudCovZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIGZ1bmN0aW9uIHRoYXQgaXMgY29ubmVjdGVkIGFzIGEgbGlzdGVuZXIgdG8gdGhlCisJCS8vZm9ybSdzIG9uc3VibWl0IGV2ZW50LgorCQllLnByZXZlbnREZWZhdWx0KCk7CisJCWlmKHRoaXMub25TdWJtaXQodGhpcy5mb3JtKSkgeworCQkJZG9qby5pby5iaW5kKGRvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLCB7CisJCQkJZm9ybUZpbHRlcjogZG9qby5sYW5nLmhpdGNoKHRoaXMsICJmb3JtRmlsdGVyIikKKwkJCX0pKTsKKwkJfQorCX0sCisKKwljbGljazogZnVuY3Rpb24oLypFdmVudCovZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB0aGF0IGlzIGNvbm5lY3RlZCBhcyBhIGxpc3RlbmVyIHRvIHRoZQorCQkvL2Zvcm0ncyBlbGVtZW50cyB3aG9zZSBjbGljayBldmVudCBjYW4gc3VibWl0IGEgZm9ybS4KKwkJdmFyIG5vZGUgPSBlLmN1cnJlbnRUYXJnZXQ7CisJCWlmKG5vZGUuZGlzYWJsZWQpIHsgcmV0dXJuOyB9CisJCXRoaXMuY2xpY2tlZEJ1dHRvbiA9IG5vZGU7CisJfSwKKworCWZvcm1GaWx0ZXI6IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8ga25vdyB3aGljaCBmb3JtIGVsZW1lbnQgdmFsdWVzIHRvIGluY2x1ZGUKKwkJLy8JCWluIHRoZSBkb2pvLmlvLmJpbmQoKSByZXF1ZXN0LgorCQl2YXIgdHlwZSA9IChub2RlLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpOworCQl2YXIgYWNjZXB0ID0gZmFsc2U7CisJCWlmKG5vZGUuZGlzYWJsZWQgfHwgIW5vZGUubmFtZSkgeworCQkJYWNjZXB0ID0gZmFsc2U7CisJCX0gZWxzZSBpZihkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsICJidXR0b24iLCAiaW1hZ2UiXSwgdHlwZSkpIHsKKwkJCWlmKCF0aGlzLmNsaWNrZWRCdXR0b24pIHsgdGhpcy5jbGlja2VkQnV0dG9uID0gbm9kZTsgfQorCQkJYWNjZXB0ID0gbm9kZSA9PSB0aGlzLmNsaWNrZWRCdXR0b247CisJCX0gZWxzZSB7CisJCQlhY2NlcHQgPSAhZG9qby5sYW5nLmluQXJyYXkoWyJmaWxlIiwgInN1Ym1pdCIsICJyZXNldCIsICJidXR0b24iXSwgdHlwZSk7CisJCX0KKwkJcmV0dXJuIGFjY2VwdDsgLy9ib29sZWFuCisJfSwKKworCS8vIGluIGNhc2UgeW91IGRvbid0IGhhdmUgZG9qby5ldmVudC4qIHB1bGxlZCBpbgorCWNvbm5lY3Q6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9zcmNPYmosIC8qRnVuY3Rpb24qL3NyY0ZjbiwgLypGdW5jdGlvbiovdGFyZ2V0RmNuKSB7CisJCS8vc3VtbWFyeTogaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBjb25uZWN0IGV2ZW50IGxpc3RlbmVycyB0byBmb3JtIGVsZW1lbnRzCisJCS8vdGhhdCB0cmlnZ2VyIGV2ZW50cy4gVXNlZCBpbiBjYXNlIGRvam8uZXZlbnQgaXMgbm90IGxvYWRlZC4KKwkJaWYoZG9qby5ldmFsT2JqUGF0aCgiZG9qby5ldmVudC5jb25uZWN0IikpIHsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChzcmNPYmosIHNyY0ZjbiwgdGhpcywgdGFyZ2V0RmNuKTsKKwkJfSBlbHNlIHsKKwkJCXZhciBmY24gPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGFyZ2V0RmNuKTsKKwkJCXNyY09ialtzcmNGY25dID0gZnVuY3Rpb24oZSkgeworCQkJCWlmKCFlKSB7IGUgPSB3aW5kb3cuZXZlbnQ7IH0KKwkJCQlpZighZS5jdXJyZW50VGFyZ2V0KSB7IGUuY3VycmVudFRhcmdldCA9IGUuc3JjRWxlbWVudDsgfQorCQkJCWlmKCFlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsgd2luZG93LmV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7IH0gfQorCQkJCWZjbihlKTsKKwkJCX0KKwkJfQorCX0KK30pOworCitkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQgPSBuZXcgZnVuY3Rpb24oKXsKKwkvL3N1bW1hcnk6IFRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBkb2pvLmlvLmJpbmQgdHJhbnNwb3J0IGZvciBYTUxIdHRwUmVxdWVzdC4KKwl2YXIgX3RoaXMgPSB0aGlzOworCisJdmFyIF9jYWNoZSA9IHt9OyAvLyBGSVhNRTogbWFrZSB0aGlzIHB1YmxpYz8gZG8gd2UgZXZlbiBuZWVkIHRvPworCXRoaXMudXNlQ2FjaGUgPSBmYWxzZTsgLy8gaWYgdGhpcyBpcyB0cnVlLCB3ZSdsbCBjYWNoZSB1bmxlc3Mga3dBcmdzLnVzZUNhY2hlID0gZmFsc2UKKwl0aGlzLnByZXZlbnRDYWNoZSA9IGZhbHNlOyAvLyBpZiB0aGlzIGlzIHRydWUsIHdlJ2xsIGFsd2F5cyBmb3JjZSBHRVQgcmVxdWVzdHMgdG8gY2FjaGUKKworCS8vIEZJWE1FOiBTaG91bGQgdGhpcyBldmVuIGJlIGEgZnVuY3Rpb24/IG9yIGRvIHdlIGp1c3QgaGFyZCBjb2RlIGl0IGluIHRoZSBuZXh0IDIgZnVuY3Rpb25zPworCWZ1bmN0aW9uIGdldENhY2hlS2V5KHVybCwgcXVlcnksIG1ldGhvZCkgeworCQlyZXR1cm4gdXJsICsgInwiICsgcXVlcnkgKyAifCIgKyBtZXRob2QudG9Mb3dlckNhc2UoKTsKKwl9CisKKwlmdW5jdGlvbiBhZGRUb0NhY2hlKHVybCwgcXVlcnksIG1ldGhvZCwgaHR0cCkgeworCQlfY2FjaGVbZ2V0Q2FjaGVLZXkodXJsLCBxdWVyeSwgbWV0aG9kKV0gPSBodHRwOworCX0KKworCWZ1bmN0aW9uIGdldEZyb21DYWNoZSh1cmwsIHF1ZXJ5LCBtZXRob2QpIHsKKwkJcmV0dXJuIF9jYWNoZVtnZXRDYWNoZUtleSh1cmwsIHF1ZXJ5LCBtZXRob2QpXTsKKwl9CisKKwl0aGlzLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbigpIHsKKwkJX2NhY2hlID0ge307CisJfQorCisJLy8gbW92ZWQgc3VjY2Vzc2Z1bCBsb2FkIHN0dWZmIGhlcmUKKwlmdW5jdGlvbiBkb0xvYWQoa3dBcmdzLCBodHRwLCB1cmwsIHF1ZXJ5LCB1c2VDYWNoZSkgeworCQlpZigJKChodHRwLnN0YXR1cz49MjAwKSYmKGh0dHAuc3RhdHVzPDMwMCkpfHwgCS8vIGFsbG93IGFueSAyWFggcmVzcG9uc2UgY29kZQorCQkJKGh0dHAuc3RhdHVzPT0zMDQpfHwgCQkJCQkJLy8gZ2V0IGl0IG91dCBvZiB0aGUgY2FjaGUKKwkJCShodHRwLnN0YXR1cz09MTIyMyl8fCAJCQkJCQkvLyBJbnRlcm5ldCBFeHBsb3JlciBtYW5nbGVkIHRoZSBzdGF0dXMgY29kZQorCQkJKGxvY2F0aW9uLnByb3RvY29sPT0iZmlsZToiICYmIChodHRwLnN0YXR1cz09MCB8fCBodHRwLnN0YXR1cz09dW5kZWZpbmVkKSl8fAorCQkJKGxvY2F0aW9uLnByb3RvY29sPT0iY2hyb21lOiIgJiYgKGh0dHAuc3RhdHVzPT0wIHx8IGh0dHAuc3RhdHVzPT11bmRlZmluZWQpKQorCQkpeworCQkJdmFyIHJldDsKKwkJCWlmKGt3QXJncy5tZXRob2QudG9Mb3dlckNhc2UoKSA9PSAiaGVhZCIpeworCQkJCXZhciBoZWFkZXJzID0gaHR0cC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKKwkJCQlyZXQgPSB7fTsKKwkJCQlyZXQudG9TdHJpbmcgPSBmdW5jdGlvbigpeyByZXR1cm4gaGVhZGVyczsgfQorCQkJCXZhciB2YWx1ZXMgPSBoZWFkZXJzLnNwbGl0KC9bXHJcbl0rL2cpOworCQkJCWZvcih2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJdmFyIHBhaXIgPSB2YWx1ZXNbaV0ubWF0Y2goL14oW146XSspXHMqOlxzKiguKykkL2kpOworCQkJCQlpZihwYWlyKSB7CisJCQkJCQlyZXRbcGFpclsxXV0gPSBwYWlyWzJdOworCQkJCQl9CisJCQkJfQorCQkJfWVsc2UgaWYoa3dBcmdzLm1pbWV0eXBlID09ICJ0ZXh0L2phdmFzY3JpcHQiKXsKKwkJCQl0cnl7CisJCQkJCXJldCA9IGRqX2V2YWwoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCQkJZG9qby5kZWJ1ZyhodHRwLnJlc3BvbnNlVGV4dCk7CisJCQkJCXJldCA9IG51bGw7CisJCQkJfQorCQkJfWVsc2UgaWYoa3dBcmdzLm1pbWV0eXBlLnN1YnN0cigwLCA5KSA9PSAidGV4dC9qc29uIiB8fCBrd0FyZ3MubWltZXR5cGUuc3Vic3RyKDAsIDE2KSA9PSAiYXBwbGljYXRpb24vanNvbiIpeworCQkJCXRyeXsKKwkJCQkJcmV0ID0gZGpfZXZhbCgiKCIra3dBcmdzLmpzb25GaWx0ZXIoaHR0cC5yZXNwb25zZVRleHQpKyIpIik7CisJCQkJfWNhdGNoKGUpeworCQkJCQlkb2pvLmRlYnVnKGUpOworCQkJCQlkb2pvLmRlYnVnKGh0dHAucmVzcG9uc2VUZXh0KTsKKwkJCQkJcmV0ID0gZmFsc2U7CisJCQkJfQorCQkJfWVsc2UgaWYoKGt3QXJncy5taW1ldHlwZSA9PSAiYXBwbGljYXRpb24veG1sIil8fAorCQkJCQkJKGt3QXJncy5taW1ldHlwZSA9PSAidGV4dC94bWwiKSl7CisJCQkJcmV0ID0gaHR0cC5yZXNwb25zZVhNTDsKKwkJCQlpZighcmV0IHx8IHR5cGVvZiByZXQgPT0gInN0cmluZyIgfHwgIWh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKSB7CisJCQkJCXJldCA9IGRvam8uZG9tLmNyZWF0ZURvY3VtZW50RnJvbVRleHQoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXJldCA9IGh0dHAucmVzcG9uc2VUZXh0OworCQkJfQorCisJCQlpZih1c2VDYWNoZSl7IC8vIG9ubHkgY2FjaGUgc3VjY2Vzc2Z1bCByZXNwb25zZXMKKwkJCQlhZGRUb0NhY2hlKHVybCwgcXVlcnksIGt3QXJncy5tZXRob2QsIGh0dHApOworCQkJfQorCQkJa3dBcmdzWyh0eXBlb2Yga3dBcmdzLmxvYWQgPT0gImZ1bmN0aW9uIikgPyAibG9hZCIgOiAiaGFuZGxlIl0oImxvYWQiLCByZXQsIGh0dHAsIGt3QXJncyk7CisJCX1lbHNleworCQkJdmFyIGVyck9iaiA9IG5ldyBkb2pvLmlvLkVycm9yKCJYTUxIdHRwVHJhbnNwb3J0IEVycm9yOiAiK2h0dHAuc3RhdHVzKyIgIitodHRwLnN0YXR1c1RleHQpOworCQkJa3dBcmdzWyh0eXBlb2Yga3dBcmdzLmVycm9yID09ICJmdW5jdGlvbiIpID8gImVycm9yIiA6ICJoYW5kbGUiXSgiZXJyb3IiLCBlcnJPYmosIGh0dHAsIGt3QXJncyk7CisJCX0KKwl9CisKKwkvLyBzZXQgaGVhZGVycyAobm90ZTogQ29udGVudC1UeXBlIHdpbGwgZ2V0IG92ZXJyaWRlbiBpZiBrd0FyZ3MuY29udGVudFR5cGUgaXMgc2V0KQorCWZ1bmN0aW9uIHNldEhlYWRlcnMoaHR0cCwga3dBcmdzKXsKKwkJaWYoa3dBcmdzWyJoZWFkZXJzIl0pIHsKKwkJCWZvcih2YXIgaGVhZGVyIGluIGt3QXJnc1siaGVhZGVycyJdKSB7CisJCQkJaWYoaGVhZGVyLnRvTG93ZXJDYXNlKCkgPT0gImNvbnRlbnQtdHlwZSIgJiYgIWt3QXJnc1siY29udGVudFR5cGUiXSkgeworCQkJCQlrd0FyZ3NbImNvbnRlbnRUeXBlIl0gPSBrd0FyZ3NbImhlYWRlcnMiXVtoZWFkZXJdOworCQkJCX0gZWxzZSB7CisJCQkJCWh0dHAuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGt3QXJnc1siaGVhZGVycyJdW2hlYWRlcl0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXRoaXMuaW5GbGlnaHQgPSBbXTsKKwl0aGlzLmluRmxpZ2h0VGltZXIgPSBudWxsOworCisJdGhpcy5zdGFydFdhdGNoaW5nSW5GbGlnaHQgPSBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB1c2VkIHRvIHRyaWdnZXIgYSB0aW1lciB0byB3YXRjaCBhbGwgaW5mbGlnaHQKKwkJLy9YTUxIdHRwUmVxdWVzdHMuCisJCWlmKCF0aGlzLmluRmxpZ2h0VGltZXIpeworCQkJLy8gc2V0SW50ZXJ2YWwgYnJva2VuIGluIG1vemlsbGEgeDg2XzY0IGluIHNvbWUgY2lyY3Vtc3RhbmNlcywgc2VlCisJCQkvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDQ0MzkKKwkJCS8vIHVzaW5nIHNldFRpbWVvdXQgaW5zdGVhZAorCQkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMCk7CisJCX0KKwl9CisKKwl0aGlzLndhdGNoSW5GbGlnaHQgPSBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB0aGF0IGNoZWNrcyBlYWNoIGluZmxpZ2h0IFhNTEh0dHBSZXF1ZXN0IHRvIHNlZQorCQkvL2lmIGl0IGhhcyBjb21wbGV0ZWQgb3IgaWYgdGhlIHRpbWVvdXQgc2l0dWF0aW9uIGFwcGxpZXMuCisJCXZhciBub3cgPSBudWxsOworCQkvLyBtYWtlIHN1cmUgc3luYyBjYWxscyBzdGF5IHRocmVhZCBzYWZlLCBpZiB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBkdXJpbmcgYSBzeW5jIGNhbGwKKwkJLy8gYW5kIHRoaXMgcmVzdWx0cyBpbiBhbm90aGVyIHN5bmMgY2FsbCBiZWZvcmUgdGhlIGZpcnN0IHN5bmMgY2FsbCBlbmRzIHRoZSBicm93c2VyIGhhbmdzCisJCWlmKCFkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgJiYgIV90aGlzLl9ibG9ja0FzeW5jKXsKKwkJCWZvcih2YXIgeD10aGlzLmluRmxpZ2h0Lmxlbmd0aC0xOyB4Pj0wOyB4LS0peworCQkJCXRyeXsKKwkJCQkJdmFyIHRpZiA9IHRoaXMuaW5GbGlnaHRbeF07CisJCQkJCWlmKCF0aWYgfHwgdGlmLmh0dHAuX2Fib3J0ZWQgfHwgIXRpZi5odHRwLnJlYWR5U3RhdGUpeworCQkJCQkJdGhpcy5pbkZsaWdodC5zcGxpY2UoeCwgMSk7IGNvbnRpbnVlOyAKKwkJCQkJfQorCQkJCQlpZig0PT10aWYuaHR0cC5yZWFkeVN0YXRlKXsKKwkJCQkJCS8vIHJlbW92ZSBpdCBzbyB3ZSBjYW4gY2xlYW4gcmVmcworCQkJCQkJdGhpcy5pbkZsaWdodC5zcGxpY2UoeCwgMSk7CisJCQkJCQlkb0xvYWQodGlmLnJlcSwgdGlmLmh0dHAsIHRpZi51cmwsIHRpZi5xdWVyeSwgdGlmLnVzZUNhY2hlKTsKKwkJCQkJfWVsc2UgaWYgKHRpZi5zdGFydFRpbWUpeworCQkJCQkJLy9TZWUgaWYgdGhpcyBpcyBhIHRpbWVvdXQgY2FzZS4KKwkJCQkJCWlmKCFub3cpeworCQkJCQkJCW5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJCQkJCQl9CisJCQkJCQlpZih0aWYuc3RhcnRUaW1lICsgKHRpZi5yZXEudGltZW91dFNlY29uZHMgKiAxMDAwKSA8IG5vdyl7CisJCQkJCQkJLy9TdG9wIHRoZSByZXF1ZXN0LgorCQkJCQkJCWlmKHR5cGVvZiB0aWYuaHR0cC5hYm9ydCA9PSAiZnVuY3Rpb24iKXsKKwkJCQkJCQkJdGlmLmh0dHAuYWJvcnQoKTsKKwkJCQkJCQl9CisJCQorCQkJCQkJCS8vIHJlbW92ZSBpdCBzbyB3ZSBjYW4gY2xlYW4gcmVmcworCQkJCQkJCXRoaXMuaW5GbGlnaHQuc3BsaWNlKHgsIDEpOworCQkJCQkJCXRpZi5yZXFbKHR5cGVvZiB0aWYucmVxLnRpbWVvdXQgPT0gImZ1bmN0aW9uIikgPyAidGltZW91dCIgOiAiaGFuZGxlIl0oInRpbWVvdXQiLCBudWxsLCB0aWYuaHR0cCwgdGlmLnJlcSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9Y2F0Y2goZSl7CisJCQkJCXRyeXsKKwkJCQkJCXZhciBlcnJPYmogPSBuZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0IEVycm9yOiAiICsgZSk7CisJCQkJCQl0aWYucmVxWyh0eXBlb2YgdGlmLnJlcS5lcnJvciA9PSAiZnVuY3Rpb24iKSA/ICJlcnJvciIgOiAiaGFuZGxlIl0oImVycm9yIiwgZXJyT2JqLCB0aWYuaHR0cCwgdGlmLnJlcSk7CisJCQkJCX1jYXRjaChlMil7CisJCQkJCQlkb2pvLmRlYnVnKCJYTUxIdHRwVHJhbnNwb3J0IGVycm9yIGNhbGxiYWNrIGZhaWxlZDogIiArIGUyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWNsZWFyVGltZW91dCh0aGlzLmluRmxpZ2h0VGltZXIpOworCQlpZih0aGlzLmluRmxpZ2h0Lmxlbmd0aCA9PSAwKXsKKwkJCXRoaXMuaW5GbGlnaHRUaW1lciA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMCk7CisJfQorCisJdmFyIGhhc1htbEh0dHAgPSBkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCgpID8gdHJ1ZSA6IGZhbHNlOworCXRoaXMuY2FuSGFuZGxlID0gZnVuY3Rpb24oLypkb2pvLmlvLlJlcXVlc3QqL2t3QXJncyl7CisJCS8vc3VtbWFyeTogVGVsbHMgZG9qby5pby5iaW5kKCkgaWYgdGhpcyBpcyBhIGdvb2QgdHJhbnNwb3J0IHRvCisJCS8vdXNlIGZvciB0aGUgcGFydGljdWxhciB0eXBlIG9mIHJlcXVlc3QuIFRoaXMgdHlwZSBvZiB0cmFuc3BvcnQgY2Fubm90CisJCS8vaGFuZGxlIGZvcm1zIHRoYXQgaGF2ZSBhbiBpbnB1dCB0eXBlPSJmaWxlIiBlbGVtZW50LgorCisJCS8vIEZJWE1FOiB3ZSBuZWVkIHRvIGRldGVybWluZSB3aGVuIGZvcm0gdmFsdWVzIG5lZWQgdG8gYmUKKwkJLy8gbXVsdGktcGFydCBtaW1lIGVuY29kZWQgYW5kIGF2b2lkIHVzaW5nIHRoaXMgdHJhbnNwb3J0IGZvciB0aG9zZQorCQkvLyByZXF1ZXN0cy4KKwkJdmFyIG1sYyA9IGt3QXJnc1sibWltZXR5cGUiXS50b0xvd2VyQ2FzZSgpfHwiIjsKKwkJcmV0dXJuIGhhc1htbEh0dHAKKwkJCSYmICgKKwkJCQkoCisJCQkJCWRvam8ubGFuZy5pbkFycmF5KFsKKwkJCQkJCSJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94bWwiLCAKKwkJCQkJCSJ0ZXh0L3htbCIsICJ0ZXh0L2phdmFzY3JpcHQiCisJCQkJCQldLCBtbGMKKwkJCQkJKQorCQkJCSkgfHwgKAorCQkJCQltbGMuc3Vic3RyKDAsIDkpID09ICJ0ZXh0L2pzb24iIHx8IG1sYy5zdWJzdHIoMCwgMTYpID09ICJhcHBsaWNhdGlvbi9qc29uIgorCQkJCSkKKwkJCSkKKwkJCSYmICEoIGt3QXJnc1siZm9ybU5vZGUiXSAmJiBkb2pvLmlvLmZvcm1IYXNGaWxlKGt3QXJnc1siZm9ybU5vZGUiXSkgKTsgLy9ib29sZWFuCisJfQorCisJdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSA9ICI0NTMwOUZGRi1CRDY1LTRkNTAtOTlDOS0zNjk4Njg5NkE5NkYiOwkvLyB1bmlxdWUgZ3VpZCBhcyBhIGJvdW5kYXJ5IHZhbHVlIGZvciBtdWx0aXBhcnQgcG9zdHMKKworCXRoaXMuYmluZCA9IGZ1bmN0aW9uKC8qZG9qby5pby5SZXF1ZXN0Ki9rd0FyZ3MpeworCQkvL3N1bW1hcnk6IGZ1bmN0aW9uIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KKworCQkvL1RoaXMgZnVuY3Rpb24gd2lsbCBhdHRhY2ggYW4gYWJvcnQoKSBmdW5jdGlvbiB0byB0aGUga3dBcmdzIGRvam8uaW8uUmVxdWVzdCBvYmplY3QsCisJCS8vc28gaWYgeW91IG5lZWQgdG8gYWJvcnQgdGhlIHJlcXVlc3QsIHlvdSBjYW4gY2FsbCB0aGF0IG1ldGhvZCBvbiB0aGUgcmVxdWVzdCBvYmplY3QuCisJCS8vVGhlIGZvbGxvd2luZyBhcmUgYWNjZXB0YWJsZSBwcm9wZXJ0aWVzIGluIGt3QXJncyAoaW4gYWRkaXRpb24gdG8gdGhlCisJCS8vbm9ybWFsIGRvam8uaW8uUmVxdWVzdCBvYmplY3QgcHJvcGVydGllcykuCisJCS8vdXJsOiBTdHJpbmc6IFVSTCB0aGUgc2VydmVyIFVSTCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgorCQkvL21ldGhvZDogU3RyaW5nOiB0aGUgSFRUUCBtZXRob2QgdG8gdXNlIChHRVQsIFBPU1QsIGV0Yy4uLikuCisJCS8vbWltZXR5cGU6IFNwZWNpZmllcyB3aGF0IGZvcm1hdCB0aGUgcmVzdWx0IGRhdGEgc2hvdWxkIGJlIGdpdmVuIHRvIHRoZSBsb2FkL2hhbmRsZSBjYWxsYmFjay4gVmFsaWQgdmFsdWVzIGFyZToKKwkJLy8JCXRleHQvamF2YXNjcmlwdCwgdGV4dC9qc29uLCBhcHBsaWNhdGlvbi9qc29uLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLiBBbnkgb3RoZXIgbWltZXR5cGUgd2lsbCBnaXZlIGJhY2sgYSB0ZXh0CisJCS8vCQlzdHJpbmcuCisJCS8vdHJhbnNwb3J0OiBTdHJpbmc6IHNwZWNpZnkgIlhNTEhUVFBUcmFuc3BvcnQiIHRvIGZvcmNlIHRoZSB1c2Ugb2YgdGhpcyBYTUxIdHRwUmVxdWVzdCB0cmFuc3BvcnQuCisJCS8vaGVhZGVyczogT2JqZWN0OiBUaGUgb2JqZWN0IHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgd2lsbCBiZSBzZW50IGFzIEhUVFAgcmVxdWVzdCBoZWFkZXIKKwkJLy8JCW5hbWVzIGFuZCB2YWx1ZXMuCisJCS8vc2VuZFRyYW5zcG9ydDogYm9vbGVhbjogSWYgdHJ1ZSwgdGhlbiBkb2pvLnRyYW5zcG9ydD14bWxodHRwIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlcXVlc3QuCisJCS8vZW5jb2Rpbmc6IFN0cmluZzogVGhlIHR5cGUgb2YgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIHRoZSBjb250ZW50IGt3QXJncyBwcm9wZXJ0eS4KKwkJLy9jb250ZW50OiBPYmplY3Q6IFRoZSBjb250ZW50IG9iamVjdCBpcyBjb252ZXJ0ZWQgaW50byBhIG5hbWU9dmFsdWUmbmFtZT12YWx1ZSBzdHJpbmcsIGJ5CisJCS8vCQl1c2luZyBkb2pvLmlvLmFyZ3NGcm9tTWFwKCkuIFRoZSBlbmNvZGluZyBrd0FyZ3MgcHJvcGVydHkgaXMgcGFzc2VkIHRvIGRvam8uaW8uYXJnc0Zyb21NYXAoKQorCQkvLwkJZm9yIHVzZSBpbiBlbmNvZGluZyB0aGUgbmFtZXMgYW5kIHZhbHVlcy4gVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgYWRkZWQgdG8gdGhlIHJlcXVlc3QuCisJCS8vZm9ybU5vZGU6IERPTU5vZGU6IGEgZm9ybSBlbGVtZW50IG5vZGUuIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLiBVc2UgbmV3IGRvam8uaW8uRm9ybUJpbmQoKSBpbnN0ZWFkLgorCQkvLwkJSWYgZm9ybU5vZGUgaXMgdXNlZCwgdGhlbiB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiB0aGUgZm9ybSBlbGVtZW50cyB3aWxsIGJlIGNvbnZlcnRlZAorCQkvLwkJdG8gYSBuYW1lPXZhbHVlJm5hbWU9dmFsdWUgc3RyaW5nIGFuZCBhZGRlZCB0byB0aGUgcmVxdWVzdC4gVGhlIGVuY29kaW5nIGt3QXJncyBwcm9wZXJ0eSBpcyB1c2VkCisJCS8vCQl0byBlbmNvZGUgdGhlIG5hbWVzIGFuZCB2YWx1ZXMuCisJCS8vcG9zdENvbnRlbnQ6IFN0cmluZzogUmF3IG5hbWU9dmFsdWUmbmFtZT12YWx1ZSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4KKwkJLy9iYWNrIG9yIGJhY2tCdXR0b246IEZ1bmN0aW9uOiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpZiB0aGUgYmFjayBidXR0b24gaXMgcHJlc3NlZC4gSWYgdGhpcyBrd0FyZ3MgcHJvcGVydHkKKwkJLy8JCWlzIHVzZWQsIHRoZW4gYmFjayBidXR0b24gc3VwcG9ydCB2aWEgZG9qby51bmRvLmJyb3dzZXIgd2lsbCBiZSB1c2VkLiBTZWUgbm90ZXMgZm9yIGRvam8udW5kby5icm93c2VyIG9uIHVzYWdlLgorCQkvLwkJWW91IG5lZWQgdG8gc2V0IGRqQ29uZmlnLnByZXZlbnRCYWNrQnV0dG9uRml4ID0gZmFsc2UgdG8gZW5hYmxlIGJhY2sgYnV0dG9uIHN1cHBvcnQuCisJCS8vY2hhbmdlVXJsOiBib29sZWFuIG9yIFN0cmluZzogVXNlZCBhcyBwYXJ0IG9mIGJhY2sgYnV0dG9uIHN1cHBvcnQuIFNlZSBub3RlcyBmb3IgZG9qby51bmRvLmJyb3dzZXIgb24gdXNhZ2UuCisJCS8vdXNlcjogU3RyaW5nOiBUaGUgdXNlciBuYW1lLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBwYXNzd29yZC4gUGFzc2VkIHRvIFhNTEh0dHBSZXF1ZXN0Lm9wZW4oKS4KKwkJLy9wYXNzd29yZDogU3RyaW5nOiBUaGUgdXNlcidzIHBhc3N3b3JkLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB1c2VyLiBQYXNzZWQgdG8gWE1MSHR0cFJlcXVlc3Qub3BlbigpLgorCQkvL2ZpbGU6IE9iamVjdCBvciBBcnJheSBvZiBPYmplY3RzOiBhbiBvYmplY3Qgc2ltdWxhdGluZyBhIGZpbGUgdG8gYmUgdXBsb2FkZWQuIGZpbGUgb2JqZWN0cyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisJCS8vCQluYW1lIG9yIGZpbGVOYW1lOiB0aGUgbmFtZSBvZiB0aGUgZmlsZQorCQkvLwkJY29udGVudFR5cGU6IHRoZSBNSU1FIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGZpbGUuCisJCS8vCQljb250ZW50OiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGZpbGUuCisJCS8vbXVsdGlwYXJ0OiBib29sZWFuOiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIG11bHRpcGFydCBtaW1lIHJlcXVlc3QuIElmIGt3QXJncy5maWxlIGV4aXN0cywgdGhlbiB0aGlzCisJCS8vCQlwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSBhdXRvbWF0aWNhbGx5LgorCQkvL3N5bmM6IGJvb2xlYW46IGlmIHRydWUsIHRoZW4gYSBzeW5jaHJvbm91cyBYTUxIdHRwUmVxdWVzdCBjYWxsIGlzIGRvbmUsCisJCS8vCQlpZiBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGVuIGFuIGFzeW5jaHJvbm91cyBjYWxsIGlzIHVzZWQuCisJCS8vcHJldmVudENhY2hlOiBib29sZWFuOiBJZiB0cnVlLCB0aGVuIGEgY2FjaGUgYnVzdGluZyBwYXJhbWV0ZXIgaXMgYWRkZWQgdG8gdGhlIHJlcXVlc3QgVVJMLgorCQkvLwkJZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKwkJLy91c2VDYWNoZTogYm9vbGVhbjogSWYgdHJ1ZSwgdGhlbiBYTUxIdHRwVHJhbnNwb3J0IHdpbGwga2VlcCBhbiBpbnRlcm5hbCBjYWNoZSBvZiB0aGUgc2VydmVyCisJCS8vCQlyZXNwb25zZSBhbmQgdXNlIHRoYXQgcmVzcG9uc2UgaWYgYSBzaW1pbGFyIHJlcXVlc3QgaXMgZG9uZSBhZ2Fpbi4KKwkJLy8JCUEgc2ltaWxhciByZXF1ZXN0IGlzIG9uZSB0aGF0IGhhcyB0aGUgc2FtZSBVUkwsIHF1ZXJ5IHN0cmluZyBhbmQgSFRUUCBtZXRob2QgdmFsdWUuCisJCS8vCQlkZWZhdWx0IGlzIGZhbHNlLgorCQlpZigha3dBcmdzWyJ1cmwiXSl7CisJCQkvLyBhcmUgd2UgcGVyZm9ybWluZyBhIGhpc3RvcnkgYWN0aW9uPworCQkJaWYoICFrd0FyZ3NbImZvcm1Ob2RlIl0KKwkJCQkmJiAoa3dBcmdzWyJiYWNrQnV0dG9uIl0gfHwga3dBcmdzWyJiYWNrIl0gfHwga3dBcmdzWyJjaGFuZ2VVcmwiXSB8fCBrd0FyZ3NbIndhdGNoRm9yVVJMIl0pCisJCQkJJiYgKCFkakNvbmZpZy5wcmV2ZW50QmFja0J1dHRvbkZpeCkpIHsKKyAgICAgICAgZG9qby5kZXByZWNhdGVkKCJVc2luZyBkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQuYmluZCgpIHRvIGFkZCB0byBicm93c2VyIGhpc3Rvcnkgd2l0aG91dCBkb2luZyBhbiBJTyByZXF1ZXN0IiwKKyAgICAgICAgCQkJCSJVc2UgZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KCkgaW5zdGVhZC4iLCAiMC40Iik7CisJCQkJZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KGt3QXJncyk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQkvLyBidWlsZCB0aGlzIGZpcnN0IGZvciBjYWNoZSBwdXJwb3NlcworCQl2YXIgdXJsID0ga3dBcmdzLnVybDsKKwkJdmFyIHF1ZXJ5ID0gIiI7CisJCWlmKGt3QXJnc1siZm9ybU5vZGUiXSl7CisJCQl2YXIgdGEgPSBrd0FyZ3MuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTsKKwkJCWlmKCh0YSkmJigha3dBcmdzWyJ1cmwiXSkpeyB1cmwgPSB0YTsgfQorCQkJdmFyIHRwID0ga3dBcmdzLmZvcm1Ob2RlLmdldEF0dHJpYnV0ZSgibWV0aG9kIik7CisJCQlpZigodHApJiYoIWt3QXJnc1sibWV0aG9kIl0pKXsga3dBcmdzLm1ldGhvZCA9IHRwOyB9CisJCQlxdWVyeSArPSBkb2pvLmlvLmVuY29kZUZvcm0oa3dBcmdzLmZvcm1Ob2RlLCBrd0FyZ3MuZW5jb2RpbmcsIGt3QXJnc1siZm9ybUZpbHRlciJdKTsKKwkJfQorCisJCWlmKHVybC5pbmRleE9mKCIjIikgPiAtMSkgeworCQkJZG9qby5kZWJ1ZygiV2FybmluZzogZG9qby5pby5iaW5kOiBzdHJpcHBpbmcgaGFzaCB2YWx1ZXMgZnJvbSB1cmw6IiwgdXJsKTsKKwkJCXVybCA9IHVybC5zcGxpdCgiIyIpWzBdOworCQl9CisKKwkJaWYoa3dBcmdzWyJmaWxlIl0peworCQkJLy8gZm9yY2UgcG9zdCBmb3IgZmlsZSB0cmFuc2ZlcgorCQkJa3dBcmdzLm1ldGhvZCA9ICJwb3N0IjsKKwkJfQorCisJCWlmKCFrd0FyZ3NbIm1ldGhvZCJdKXsKKwkJCWt3QXJncy5tZXRob2QgPSAiZ2V0IjsKKwkJfQorCisJCS8vIGd1ZXNzIHRoZSBtdWx0aXBhcnQgdmFsdWUKKwkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJnZXQiKXsKKwkJCS8vIEdFVCBjYW5ub3QgdXNlIG11bHRpcGFydAorCQkJa3dBcmdzLm11bHRpcGFydCA9IGZhbHNlOworCQl9ZWxzZXsKKwkJCWlmKGt3QXJnc1siZmlsZSJdKXsKKwkJCQkvLyBlbmZvcmNlIG11bHRpcGFydCB3aGVuIHNlbmRpbmcgZmlsZXMKKwkJCQlrd0FyZ3MubXVsdGlwYXJ0ID0gdHJ1ZTsKKwkJCX1lbHNlIGlmKCFrd0FyZ3NbIm11bHRpcGFydCJdKXsKKwkJCQkvLyBkZWZhdWx0IAorCQkJCWt3QXJncy5tdWx0aXBhcnQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWlmKGt3QXJnc1siYmFja0J1dHRvbiJdIHx8IGt3QXJnc1siYmFjayJdIHx8IGt3QXJnc1siY2hhbmdlVXJsIl0peworCQkJZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KGt3QXJncyk7CisJCX0KKworCQl2YXIgY29udGVudCA9IGt3QXJnc1siY29udGVudCJdIHx8IHt9OworCisJCWlmKGt3QXJncy5zZW5kVHJhbnNwb3J0KSB7CisJCQljb250ZW50WyJkb2pvLnRyYW5zcG9ydCJdID0gInhtbGh0dHAiOworCQl9CisKKwkJZG8geyAvLyBicmVhay1ibG9jaworCQkJaWYoa3dBcmdzLnBvc3RDb250ZW50KXsKKwkJCQlxdWVyeSA9IGt3QXJncy5wb3N0Q29udGVudDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYoY29udGVudCkgeworCQkJCXF1ZXJ5ICs9IGRvam8uaW8uYXJnc0Zyb21NYXAoY29udGVudCwga3dBcmdzLmVuY29kaW5nKTsKKwkJCX0KKwkJCQorCQkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJnZXQiIHx8ICFrd0FyZ3MubXVsdGlwYXJ0KXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdmFyCXQgPSBbXTsKKwkJCWlmKHF1ZXJ5Lmxlbmd0aCl7CisJCQkJdmFyIHEgPSBxdWVyeS5zcGxpdCgiJiIpOworCQkJCWZvcih2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgKytpKXsKKwkJCQkJaWYocVtpXS5sZW5ndGgpeworCQkJCQkJdmFyIHAgPSBxW2ldLnNwbGl0KCI9Iik7CisJCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCQkiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIHBbMF0gKyAiXCIiLCAKKwkJCQkJCQkJIiIsCisJCQkJCQkJCXBbMV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihrd0FyZ3MuZmlsZSl7CisJCQkJaWYoZG9qby5sYW5nLmlzQXJyYXkoa3dBcmdzLmZpbGUpKXsKKwkJCQkJZm9yKHZhciBpID0gMDsgaSA8IGt3QXJncy5maWxlLmxlbmd0aDsgKytpKXsKKwkJCQkJCXZhciBvID0ga3dBcmdzLmZpbGVbaV07CisJCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCQkiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG8ubmFtZSArICJcIjsgZmlsZW5hbWU9XCIiICsgKCJmaWxlTmFtZSIgaW4gbyA/IG8uZmlsZU5hbWUgOiBvLm5hbWUpICsgIlwiIiwKKwkJCQkJCQkJIkNvbnRlbnQtVHlwZTogIiArICgiY29udGVudFR5cGUiIGluIG8gPyBvLmNvbnRlbnRUeXBlIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLAorCQkJCQkJCQkiIiwKKwkJCQkJCQkJby5jb250ZW50KTsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQl2YXIgbyA9IGt3QXJncy5maWxlOworCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCSJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgby5uYW1lICsgIlwiOyBmaWxlbmFtZT1cIiIgKyAoImZpbGVOYW1lIiBpbiBvID8gby5maWxlTmFtZSA6IG8ubmFtZSkgKyAiXCIiLAorCQkJCQkJCSJDb250ZW50LVR5cGU6ICIgKyAoImNvbnRlbnRUeXBlIiBpbiBvID8gby5jb250ZW50VHlwZSA6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSwKKwkJCQkJCQkiIiwKKwkJCQkJCQlvLmNvbnRlbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYodC5sZW5ndGgpeworCQkJCXQucHVzaCgiLS0iK3RoaXMubXVsdGlwYXJ0Qm91bmRhcnkrIi0tIiwgIiIpOworCQkJCXF1ZXJ5ID0gdC5qb2luKCJcclxuIik7CisJCQl9CisJCX13aGlsZShmYWxzZSk7CisKKwkJLy8ga3dBcmdzLkNvbm5lY3Rpb24gPSAiY2xvc2UiOworCisJCXZhciBhc3luYyA9IGt3QXJnc1sic3luYyJdID8gZmFsc2UgOiB0cnVlOworCisJCXZhciBwcmV2ZW50Q2FjaGUgPSBrd0FyZ3NbInByZXZlbnRDYWNoZSJdIHx8CisJCQkodGhpcy5wcmV2ZW50Q2FjaGUgPT0gdHJ1ZSAmJiBrd0FyZ3NbInByZXZlbnRDYWNoZSJdICE9IGZhbHNlKTsKKwkJdmFyIHVzZUNhY2hlID0ga3dBcmdzWyJ1c2VDYWNoZSJdID09IHRydWUgfHwKKwkJCSh0aGlzLnVzZUNhY2hlID09IHRydWUgJiYga3dBcmdzWyJ1c2VDYWNoZSJdICE9IGZhbHNlICk7CisKKwkJLy8gcHJldmVudENhY2hlIGlzIGJyb3dzZXItbGV2ZWwgKGFkZCBxdWVyeSBzdHJpbmcganVuayksIHVzZUNhY2hlCisJCS8vIGlzIGZvciB0aGUgbG9jYWwgY2FjaGUuIElmIHdlIHNheSBwcmV2ZW50Q2FjaGUsIHRoZW4gZG9uJ3QgYXR0ZW1wdAorCQkvLyB0byBsb29rIGluIHRoZSBjYWNoZSwgYnV0IGlmIHVzZUNhY2hlIGlzIHRydWUsIHdlIHN0aWxsIHdhbnQgdG8gY2FjaGUKKwkJLy8gdGhlIHJlc3BvbnNlCisJCWlmKCFwcmV2ZW50Q2FjaGUgJiYgdXNlQ2FjaGUpeworCQkJdmFyIGNhY2hlZEh0dHAgPSBnZXRGcm9tQ2FjaGUodXJsLCBxdWVyeSwga3dBcmdzLm1ldGhvZCk7CisJCQlpZihjYWNoZWRIdHRwKXsKKwkJCQlkb0xvYWQoa3dBcmdzLCBjYWNoZWRIdHRwLCB1cmwsIHF1ZXJ5LCBmYWxzZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLy8gbXVjaCBvZiB0aGlzIGlzIGZyb20gZ2V0VGV4dCwgYnV0IHJlcHJvZHVjZWQgaGVyZSBiZWNhdXNlIHdlIG5lZWQKKwkJLy8gbW9yZSBmbGV4aWJpbGl0eQorCQl2YXIgaHR0cCA9IGRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0KGt3QXJncyk7CQorCQl2YXIgcmVjZWl2ZWQgPSBmYWxzZTsKKworCQkvLyBidWlsZCBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBoYW5kbGVyIG9iagorCQlpZihhc3luYyl7CisJCQl2YXIgc3RhcnRUaW1lID0gCisJCQkvLyBGSVhNRTogc2V0dGluZyB1cCB0aGlzIGNhbGxiYWNrIGhhbmRsZXIgbGVha3Mgb24gSUUhISEKKwkJCXRoaXMuaW5GbGlnaHQucHVzaCh7CisJCQkJInJlcSI6CQlrd0FyZ3MsCisJCQkJImh0dHAiOgkJaHR0cCwKKwkJCQkidXJsIjoJIAl1cmwsCisJCQkJInF1ZXJ5IjoJcXVlcnksCisJCQkJInVzZUNhY2hlIjoJdXNlQ2FjaGUsCisJCQkJInN0YXJ0VGltZSI6IGt3QXJncy50aW1lb3V0U2Vjb25kcyA/IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgOiAwCisJCQl9KTsKKwkJCXRoaXMuc3RhcnRXYXRjaGluZ0luRmxpZ2h0KCk7CisJCX1lbHNleworCQkJLy8gYmxvY2sgYXN5bmMgY2FsbGJhY2tzIHVudGlsIHN5bmMgaXMgaW4sIG5lZWRlZCBpbiBraHRtbCwgb3RoZXJzPworCQkJX3RoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOworCQl9CisKKwkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJwb3N0Iil7CisJCQkvLyBGSVhNRTogbmVlZCB0byBoYWNrIGluIG1vcmUgZmxleGlibGUgQ29udGVudC1UeXBlIHNldHRpbmcgaGVyZSEKKwkJCWlmICgha3dBcmdzLnVzZXIpIHsKKwkJCQlodHRwLm9wZW4oIlBPU1QiLCB1cmwsIGFzeW5jKTsKKwkJCX1lbHNleworICAgICAgICBodHRwLm9wZW4oIlBPU1QiLCB1cmwsIGFzeW5jLCBrd0FyZ3MudXNlciwga3dBcmdzLnBhc3N3b3JkKTsKKwkJCX0KKwkJCXNldEhlYWRlcnMoaHR0cCwga3dBcmdzKTsKKwkJCWh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwga3dBcmdzLm11bHRpcGFydCA/ICgibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9IiArIHRoaXMubXVsdGlwYXJ0Qm91bmRhcnkpIDogCisJCQkJKGt3QXJncy5jb250ZW50VHlwZSB8fCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikpOworCQkJdHJ5eworCQkJCWh0dHAuc2VuZChxdWVyeSk7CisJCQl9Y2F0Y2goZSl7CisJCQkJaWYodHlwZW9mIGh0dHAuYWJvcnQgPT0gImZ1bmN0aW9uIil7CisJCQkJCWh0dHAuYWJvcnQoKTsKKwkJCQl9CisJCQkJZG9Mb2FkKGt3QXJncywge3N0YXR1czogNDA0fSwgdXJsLCBxdWVyeSwgdXNlQ2FjaGUpOworCQkJfQorCQl9ZWxzZXsKKwkJCXZhciB0bXBVcmwgPSB1cmw7CisJCQlpZihxdWVyeSAhPSAiIikgeworCQkJCXRtcFVybCArPSAodG1wVXJsLmluZGV4T2YoIj8iKSA+IC0xID8gIiYiIDogIj8iKSArIHF1ZXJ5OworCQkJfQorCQkJaWYocHJldmVudENhY2hlKSB7CisJCQkJdG1wVXJsICs9IChkb2pvLnN0cmluZy5lbmRzV2l0aEFueSh0bXBVcmwsICI/IiwgIiYiKQorCQkJCQk/ICIiIDogKHRtcFVybC5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikpICsgImRvam8ucHJldmVudENhY2hlPSIgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJCX0KKwkJCWlmICgha3dBcmdzLnVzZXIpIHsKKwkJCQlodHRwLm9wZW4oa3dBcmdzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0bXBVcmwsIGFzeW5jKTsKKwkJCX1lbHNleworCQkJCWh0dHAub3Blbihrd0FyZ3MubWV0aG9kLnRvVXBwZXJDYXNlKCksIHRtcFVybCwgYXN5bmMsIGt3QXJncy51c2VyLCBrd0FyZ3MucGFzc3dvcmQpOworCQkJfQorCQkJc2V0SGVhZGVycyhodHRwLCBrd0FyZ3MpOworCQkJdHJ5IHsKKwkJCQlodHRwLnNlbmQobnVsbCk7CisJCQl9Y2F0Y2goZSkJeworCQkJCWlmKHR5cGVvZiBodHRwLmFib3J0ID09ICJmdW5jdGlvbiIpeworCQkJCQlodHRwLmFib3J0KCk7CisJCQkJfQorCQkJCWRvTG9hZChrd0FyZ3MsIHtzdGF0dXM6IDQwNH0sIHVybCwgcXVlcnksIHVzZUNhY2hlKTsKKwkJCX0KKwkJfQorCisJCWlmKCAhYXN5bmMgKSB7CisJCQlkb0xvYWQoa3dBcmdzLCBodHRwLCB1cmwsIHF1ZXJ5LCB1c2VDYWNoZSk7CisJCQlfdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQl9CisKKwkJa3dBcmdzLmFib3J0ID0gZnVuY3Rpb24oKXsKKwkJCXRyeXsvLyBraHRtbCBkb2VzZW50IHJlc2V0IHJlYWR5U3RhdGUgb24gYWJvcnQsIG5lZWQgdGhpcyB3b3JrYXJvdW5kCisJCQkJaHR0cC5fYWJvcnRlZCA9IHRydWU7IAorCQkJfWNhdGNoKGUpey8qc3F1ZWxzaCovfQorCQkJcmV0dXJuIGh0dHAuYWJvcnQoKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisJZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCgiWE1MSFRUUFRyYW5zcG9ydCIpOworfQorCit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5pby5jb29raWUiKTsKKworZG9qby5pby5jb29raWUuc2V0Q29va2llID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qU3RyaW5nKi92YWx1ZSwgCisJCQkJCQkJCQkvKk51bWJlcj8qL2RheXMsIC8qU3RyaW5nPyovcGF0aCwgCisJCQkJCQkJCQkvKlN0cmluZz8qL2RvbWFpbiwgLypib29sZWFuPyovc2VjdXJlKXsKKwkvL3N1bW1hcnk6IHNldHMgYSBjb29raWUuCisJdmFyIGV4cGlyZXMgPSAtMTsKKwlpZigodHlwZW9mIGRheXMgPT0gIm51bWJlciIpJiYoZGF5cyA+PSAwKSl7CisJCXZhciBkID0gbmV3IERhdGUoKTsKKwkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpKyhkYXlzKjI0KjYwKjYwKjEwMDApKTsKKwkJZXhwaXJlcyA9IGQudG9HTVRTdHJpbmcoKTsKKwl9CisJdmFsdWUgPSBlc2NhcGUodmFsdWUpOworCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyB2YWx1ZSArICI7IgorCQkrIChleHBpcmVzICE9IC0xID8gIiBleHBpcmVzPSIgKyBleHBpcmVzICsgIjsiIDogIiIpCisJCSsgKHBhdGggPyAicGF0aD0iICsgcGF0aCA6ICIiKQorCQkrIChkb21haW4gPyAiOyBkb21haW49IiArIGRvbWFpbiA6ICIiKQorCQkrIChzZWN1cmUgPyAiOyBzZWN1cmUiIDogIiIpOworfQorCitkb2pvLmlvLmNvb2tpZS5zZXQgPSBkb2pvLmlvLmNvb2tpZS5zZXRDb29raWU7CisKK2Rvam8uaW8uY29va2llLmdldENvb2tpZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvL3N1bW1hcnk6IEdldHMgYSBjb29raWUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworCS8vIEZJWE1FOiBXaGljaCBjb29raWUgc2hvdWxkIHdlIHJldHVybj8KKwkvLyAgICAgICAgSWYgdGhlcmUgYXJlIGNvb2tpZXMgc2V0IGZvciBkaWZmZXJlbnQgc3ViIGRvbWFpbnMgaW4gdGhlIGN1cnJlbnQKKwkvLyAgICAgICAgc2NvcGUgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBjb29raWUgd2l0aCB0aGUgc2FtZSBuYW1lLgorCS8vICAgICAgICBJIHRoaW5rIHRha2luZyB0aGUgbGFzdCBvbmUgaW4gdGhlIGxpc3QgdGFrZXMgdGhlIG9uZSBmcm9tIHRoZQorCS8vICAgICAgICBkZWVwZXN0IHN1YmRvbWFpbiwgd2hpY2ggaXMgd2hhdCB3ZSdyZSBkb2luZyBoZXJlLgorCXZhciBpZHggPSBkb2N1bWVudC5jb29raWUubGFzdEluZGV4T2YobmFtZSsnPScpOworCWlmKGlkeCA9PSAtMSkgeyByZXR1cm4gbnVsbDsgfQorCXZhciB2YWx1ZSA9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoaWR4K25hbWUubGVuZ3RoKzEpOworCXZhciBlbmQgPSB2YWx1ZS5pbmRleE9mKCc7Jyk7CisJaWYoZW5kID09IC0xKSB7IGVuZCA9IHZhbHVlLmxlbmd0aDsgfQorCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGVuZCk7CisJdmFsdWUgPSB1bmVzY2FwZSh2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOyAvL1N0cmluZworfQorCitkb2pvLmlvLmNvb2tpZS5nZXQgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWU7CisKK2Rvam8uaW8uY29va2llLmRlbGV0ZUNvb2tpZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvL3N1bW1hcnk6IERlbGV0ZXMgYSBjb29raWUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgIi0iLCAwKTsKK30KKworZG9qby5pby5jb29raWUuc2V0T2JqZWN0Q29va2llID0gZnVuY3Rpb24oCS8qU3RyaW5nKi9uYW1lLCAvKk9iamVjdCovb2JqLCAKKwkJCQkJCQkJCQkJLypOdW1iZXI/Ki9kYXlzLCAvKlN0cmluZz8qL3BhdGgsIAorCQkJCQkJCQkJCQkvKlN0cmluZz8qL2RvbWFpbiwgLypib29sZWFuPyovc2VjdXJlLCAKKwkJCQkJCQkJCQkJLypib29sZWFuPyovY2xlYXJDdXJyZW50KXsKKwkvL3N1bW1hcnk6IFRha2VzIGFuIG9iamVjdCwgc2VyaWFsaXplcyBpdCB0byBhIGNvb2tpZSB2YWx1ZSwgYW5kIGVpdGhlcgorCS8vc2V0cyBhIGNvb2tpZSB3aXRoIHRoZSBzZXJpYWxpemVkIHZhbHVlLgorCS8vZGVzY3JpcHRpb246IElmIGNsZWFyQ3VycmVudCBpcyB0cnVlLCB0aGVuIGFueSBjdXJyZW50IGNvb2tpZSB2YWx1ZQorCS8vZm9yIHRoaXMgb2JqZWN0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdGhlIG5ldyBzZXJpYWxpemVkIG9iamVjdCB2YWx1ZS4KKwkvL0lmIGNsZWFyQ3VycmVudCBpcyBmYWxzZSwgdGhlbiB0aGUgZXhpc3RpbmcgY29va2llIHZhbHVlIHdpbGwgYmUgbW9kaWZpZWQKKwkvL3dpdGggYW55IGNoYW5nZXMgZnJvbSB0aGUgbmV3IG9iamVjdCB2YWx1ZS4KKwkvL09iamVjdHMgbXVzdCBiZSBzaW1wbGUgbmFtZS92YWx1ZSBwYWlycyB3aGVyZSB0aGUgdmFsdWUgaXMgZWl0aGVyIGEgc3RyaW5nCisJLy9vciBhIG51bWJlci4gQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgaWdub3JlZC4KKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDUpeyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdAorCQljbGVhckN1cnJlbnQgPSBkb21haW47CisJCWRvbWFpbiA9IG51bGw7CisJCXNlY3VyZSA9IG51bGw7CisJfQorCXZhciBwYWlycyA9IFtdLCBjb29raWUsIHZhbHVlID0gIiI7CisJaWYoIWNsZWFyQ3VycmVudCl7CisJCWNvb2tpZSA9IGRvam8uaW8uY29va2llLmdldE9iamVjdENvb2tpZShuYW1lKTsKKwl9CisJaWYoZGF5cyA+PSAwKXsKKwkJaWYoIWNvb2tpZSl7IGNvb2tpZSA9IHt9OyB9CisJCWZvcih2YXIgcHJvcCBpbiBvYmopeworCQkJaWYob2JqW3Byb3BdID09IG51bGwpeworCQkJCWRlbGV0ZSBjb29raWVbcHJvcF07CisJCQl9ZWxzZSBpZigodHlwZW9mIG9ialtwcm9wXSA9PSAic3RyaW5nIil8fCh0eXBlb2Ygb2JqW3Byb3BdID09ICJudW1iZXIiKSl7CisJCQkJY29va2llW3Byb3BdID0gb2JqW3Byb3BdOworCQkJfQorCQl9CisJCXByb3AgPSBudWxsOworCQlmb3IodmFyIHByb3AgaW4gY29va2llKXsKKwkJCXBhaXJzLnB1c2goZXNjYXBlKHByb3ApICsgIj0iICsgZXNjYXBlKGNvb2tpZVtwcm9wXSkpOworCQl9CisJCXZhbHVlID0gcGFpcnMuam9pbigiJiIpOworCX0KKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgdmFsdWUsIGRheXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKTsKK30KKworZG9qby5pby5jb29raWUuZ2V0T2JqZWN0Q29va2llID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUpeworCS8vc3VtbWFyeTogR2V0cyBhbiBvYmplY3QgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb29raWUgbmFtZS4gVGhlIGNvbXBsZW1lbnQgb2YKKwkvL2Rvam8uaW8uY29va2llLnNldE9iamVjdENvb2tpZSgpLgorCXZhciB2YWx1ZXMgPSBudWxsLCBjb29raWUgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWUobmFtZSk7CisJaWYoY29va2llKXsKKwkJdmFsdWVzID0ge307CisJCXZhciBwYWlycyA9IGNvb2tpZS5zcGxpdCgiJiIpOworCQlmb3IodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspeworCQkJdmFyIHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgiPSIpOworCQkJdmFyIHZhbHVlID0gcGFpclsxXTsKKwkJCWlmKCBpc05hTih2YWx1ZSkgKXsgdmFsdWUgPSB1bmVzY2FwZShwYWlyWzFdKTsgfQorCQkJdmFsdWVzWyB1bmVzY2FwZShwYWlyWzBdKSBdID0gdmFsdWU7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlczsKK30KKworZG9qby5pby5jb29raWUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbigpeworCS8vc3VtbWFyeTogVGVzdHMgdGhlIGJyb3dzZXIgdG8gc2VlIGlmIGNvb2tpZXMgYXJlIGVuYWJsZWQuCisJaWYodHlwZW9mIG5hdmlnYXRvci5jb29raWVFbmFibGVkICE9ICJib29sZWFuIil7CisJCWRvam8uaW8uY29va2llLnNldENvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iLAorCQkJIkNvb2tpZXNBbGxvd2VkIiwgOTAsIG51bGwpOworCQl2YXIgY29va2llVmFsID0gZG9qby5pby5jb29raWUuZ2V0Q29va2llKCJfX1Rlc3RpbmdZb3VyQnJvd3NlckZvckNvb2tpZVN1cHBvcnRfXyIpOworCQluYXZpZ2F0b3IuY29va2llRW5hYmxlZCA9IChjb29raWVWYWwgPT0gIkNvb2tpZXNBbGxvd2VkIik7CisJCWlmKG5hdmlnYXRvci5jb29raWVFbmFibGVkKXsKKwkJCS8vIEZJWE1FOiBzaG91bGQgd2UgbGVhdmUgdGhpcyBhcm91bmQ/CisJCQl0aGlzLmRlbGV0ZUNvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iKTsKKwkJfQorCX0KKwlyZXR1cm4gbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ7IC8vYm9vbGVhbgorfQorCisvLyBuZWVkIHRvIGxlYXZlIHRoaXMgaW4gZm9yIGJhY2t3YXJkcy1jb21wYXQgZnJvbSAwLjEgZm9yIHdoZW4gaXQgZ2V0cyBwdWxsZWQgaW4gYnkgZG9qby5pby4qCitpZighZG9qby5pby5jb29raWVzKXsgZG9qby5pby5jb29raWVzID0gZG9qby5pby5jb29raWU7IH0KKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbImRvam8uaW8uY29tbW9uIl0sCisJcmhpbm86IFsiZG9qby5pby5SaGlub0lPIl0sCisJYnJvd3NlcjogWyJkb2pvLmlvLkJyb3dzZXJJTyIsICJkb2pvLmlvLmNvb2tpZSJdLAorCWRhc2hib2FyZDogWyJkb2pvLmlvLkJyb3dzZXJJTyIsICJkb2pvLmlvLmNvb2tpZSJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5pby4qIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC5jb21tb24iKTsKKworCisKKworCisvLyBUT0RPOiBjb25uZWN0aW9uIGZpbHRlciBmdW5jdGlvbnMKKy8vCQkJdGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBhIG1ldGhvZCBpbnZvY2F0aW9uIChsaWtlIGFyb3VuZAorLy8JCQlhZHZpY2UpIGFuZCByZXR1cm4gYSBib29sZWFuIGJhc2VkIG9uIGl0LiBUaGF0IHZhbHVlIGRldGVybWluZXMKKy8vCQkJd2hldGhlciBvciBub3QgdGhlIGNvbm5lY3Rpb24gcHJvY2VlZHMuIEl0IGNvdWxkICJmZWVsIiBsaWtlIGFyb3VuZAorLy8JCQlhZHZpY2UgZm9yIHRob3NlIHdobyBrbm93IHdoYXQgaXQgaXMgKGNhbGxpbmcgcHJvY2VlZCgpIG9yIG5vdCksCisvLwkJCWJ1dCBJIHRoaW5rIHByZXNlbnRpbmcgaXQgYXMgYSAiZmlsdGVyIiBhbmQvb3IgY2FsbGluZyBpdCB3aXRoIHRoZQorLy8JCQlmdW5jdGlvbiBhcmdzIGFuZCBub3QgdGhlIE1ldGhvZEludm9jYXRpb24gbWlnaHQgbWFrZSBpdCBtb3JlCisvLwkJCXBhbGxldGFibGUgdG8gIm5vcm1hbCIgdXNlcnMgdGhhbiBhcm91bmQtYWR2aWNlIGN1cnJlbnRseSBpcworLy8gVE9ETzogZXhlY3V0aW9uIHNjb3BlIG1hbmdsaW5nCisvLwkJCVlVSSdzIGV2ZW50IGZhY2lsaXR5IGJ5IGRlZmF1bHQgZXhlY3V0ZXMgbGlzdGVuZXJzIGluIHRoZSBjb250ZXh0CisvLwkJCW9mIHRoZSBzb3VyY2Ugb2JqZWN0LiBUaGlzIGlzIHZlcnkgb2RkLCBidXQgc2hvdWxkIHByb2JhYmx5IGJlCisvLwkJCXN1cHBvcnRlZCBhcyBhbiBvcHRpb24gKGJvdGggZm9yIHRoZSBzb3VyY2UgYW5kIGZvciB0aGUgZGVzdCkuIEl0CisvLwkJCWNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY29ubmVjdGlvbi1zcGVjaWZpYyBoaXRjaCgpLgorLy8gVE9ETzogbW9yZSByZXNpbGllbmN5IGZvciA0KyBhcmd1bWVudHMgdG8gY29ubmVjdCgpCisKK2Rvam8uZXZlbnQgPSBuZXcgZnVuY3Rpb24oKXsKKwl0aGlzLl9jYW5UaW1lb3V0ID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oZGpfZ2xvYmFsWyJzZXRUaW1lb3V0Il0pfHxkb2pvLmxhbmcuaXNBbGllbihkal9nbG9iYWxbInNldFRpbWVvdXQiXSk7CisKKwkvLyBGSVhNRTogd2hlcmUgc2hvdWxkIHdlIHB1dCB0aGlzIG1ldGhvZCAobm90IGhlcmUhKT8KKwlmdW5jdGlvbiBpbnRlcnBvbGF0ZUFyZ3MoYXJncywgc2VhcmNoRm9yTmFtZXMpeworCQl2YXIgZGwgPSBkb2pvLmxhbmc7CisJCXZhciBhbyA9IHsKKwkJCXNyY09iajogZGpfZ2xvYmFsLAorCQkJc3JjRnVuYzogbnVsbCwKKwkJCWFkdmljZU9iajogZGpfZ2xvYmFsLAorCQkJYWR2aWNlRnVuYzogbnVsbCwKKwkJCWFyb3VuZE9iajogbnVsbCwKKwkJCWFyb3VuZEZ1bmM6IG51bGwsCisJCQlhZHZpY2VUeXBlOiAoYXJncy5sZW5ndGg+MikgPyBhcmdzWzBdIDogImFmdGVyIiwKKwkJCXByZWNlZGVuY2U6ICJsYXN0IiwKKwkJCW9uY2U6IGZhbHNlLAorCQkJZGVsYXk6IG51bGwsCisJCQlyYXRlOiAwLAorCQkJYWR2aWNlTXNnOiBmYWxzZSwKKwkJCW1heENhbGxzOiAtMQorCQl9OworCisJCXN3aXRjaChhcmdzLmxlbmd0aCl7CisJCQljYXNlIDA6IHJldHVybjsKKwkJCWNhc2UgMTogcmV0dXJuOworCQkJY2FzZSAyOgorCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzBdOworCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzFdOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmKChkbC5pc09iamVjdChhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworCQkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCX1lbHNlIGlmKChkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbMl07CisJCQkJfWVsc2UgaWYoKGRsLmlzT2JqZWN0KGFyZ3NbMF0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMV0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1syXSkpKXsKKwkJCQkJYW8uYWR2aWNlVHlwZSA9ICJhZnRlciI7CisJCQkJCWFvLnNyY09iaiA9IGFyZ3NbMF07CisJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzFdOworCQkJCQl2YXIgdG1wTmFtZSAgPSBkbC5uYW1lQW5vbkZ1bmMoYXJnc1syXSwgYW8uYWR2aWNlT2JqLCBzZWFyY2hGb3JOYW1lcyk7CisJCQkJCWFvLmFkdmljZUZ1bmMgPSB0bXBOYW1lOworCQkJCX1lbHNlIGlmKChkbC5pc0Z1bmN0aW9uKGFyZ3NbMF0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSl7CisJCQkJCWFvLmFkdmljZVR5cGUgPSAiYWZ0ZXIiOworCQkJCQlhby5zcmNPYmogPSBkal9nbG9iYWw7CisJCQkJCXZhciB0bXBOYW1lICA9IGRsLm5hbWVBbm9uRnVuYyhhcmdzWzBdLCBhby5zcmNPYmosIHNlYXJjaEZvck5hbWVzKTsKKwkJCQkJYW8uc3JjRnVuYyA9IHRtcE5hbWU7CisJCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlpZigoZGwuaXNPYmplY3QoYXJnc1swXSkpJiYoZGwuaXNPYmplY3QoYXJnc1syXSkpKXsKKwkJCQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IHdlJ3ZlIGdvdCBhbiBvbGQtc3R5bGUgImNvbm5lY3QiIGZyb20KKwkJCQkJLy8gdGhlIHNpZ3Nsb3Qgc2Nob29sIG9mIGV2ZW50IGF0dGFjaG1lbnQuIFdlIHRoZXJlZm9yZQorCQkJCQkvLyBhc3N1bWUgYWZ0ZXItYWR2aWNlLgorCQkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMl07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzNdOworCQkJCX1lbHNlIGlmKChkbC5pc1N0cmluZyhhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc09iamVjdChhcmdzWzJdKSkpeworCQkJCQlhby5hZHZpY2VUeXBlID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2UgaWYoKGRsLmlzU3RyaW5nKGFyZ3NbMF0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1sxXSkpJiYoZGwuaXNPYmplY3QoYXJnc1syXSkpKXsKKwkJCQkJYW8uYWR2aWNlVHlwZSA9IGFyZ3NbMF07CisJCQkJCWFvLnNyY09iaiA9IGRqX2dsb2JhbDsKKwkJCQkJdmFyIHRtcE5hbWUgID0gZGwubmFtZUFub25GdW5jKGFyZ3NbMV0sIGRqX2dsb2JhbCwgc2VhcmNoRm9yTmFtZXMpOworCQkJCQlhby5zcmNGdW5jID0gdG1wTmFtZTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2UgaWYoKGRsLmlzU3RyaW5nKGFyZ3NbMF0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1szXSkpKXsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMl07CisJCQkJCXZhciB0bXBOYW1lICA9IGRsLm5hbWVBbm9uRnVuYyhhcmdzWzNdLCBkal9nbG9iYWwsIHNlYXJjaEZvck5hbWVzKTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJCQl9ZWxzZSBpZihkbC5pc09iamVjdChhcmdzWzFdKSl7CisJCQkJCWFvLnNyY09iaiA9IGFyZ3NbMV07CisJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCQlhby5hZHZpY2VPYmogPSBkal9nbG9iYWw7CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzNdOworCQkJCX1lbHNlIGlmKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKXsKKwkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2V7CisJCQkJCWFvLnNyY09iaiA9IGFvLmFkdmljZU9iaiA9IGFvLmFyb3VuZE9iaiA9IGRqX2dsb2JhbDsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCQlhby5hcm91bmRGdW5jID0gYXJnc1szXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQlhby5zcmNGdW5jID0gYXJnc1syXTsKKwkJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdCisJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQkJYW8uYXJvdW5kRnVuYyA9IGFyZ3NbNV07CisJCQkJYW8uYXJvdW5kT2JqID0gZGpfZ2xvYmFsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhby5zcmNPYmogPSBhcmdzWzFdOworCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbM10KKwkJCQlhby5hZHZpY2VGdW5jID0gYXJnc1s0XTsKKwkJCQlhby5hcm91bmRPYmogPSBhcmdzWzVdOworCQkJCWFvLmFyb3VuZEZ1bmMgPSBhcmdzWzZdOworCQkJCWFvLm9uY2UgPSBhcmdzWzddOworCQkJCWFvLmRlbGF5ID0gYXJnc1s4XTsKKwkJCQlhby5yYXRlID0gYXJnc1s5XTsKKwkJCQlhby5hZHZpY2VNc2cgPSBhcmdzWzEwXTsKKwkJCQlhby5tYXhDYWxscyA9ICghaXNOYU4ocGFyc2VJbnQoYXJnc1sxMV0pKSkgPyBhcmdzWzExXSA6IC0xOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYoZGwuaXNGdW5jdGlvbihhby5hcm91bmRGdW5jKSl7CisJCQl2YXIgdG1wTmFtZSAgPSBkbC5uYW1lQW5vbkZ1bmMoYW8uYXJvdW5kRnVuYywgYW8uYXJvdW5kT2JqLCBzZWFyY2hGb3JOYW1lcyk7CisJCQlhby5hcm91bmRGdW5jID0gdG1wTmFtZTsKKwkJfQorCisJCWlmKGRsLmlzRnVuY3Rpb24oYW8uc3JjRnVuYykpeworCQkJYW8uc3JjRnVuYyA9IGRsLmdldE5hbWVJbk9iaihhby5zcmNPYmosIGFvLnNyY0Z1bmMpOworCQl9CisKKwkJaWYoZGwuaXNGdW5jdGlvbihhby5hZHZpY2VGdW5jKSl7CisJCQlhby5hZHZpY2VGdW5jID0gZGwuZ2V0TmFtZUluT2JqKGFvLmFkdmljZU9iaiwgYW8uYWR2aWNlRnVuYyk7CisJCX0KKworCQlpZigoYW8uYXJvdW5kT2JqKSYmKGRsLmlzRnVuY3Rpb24oYW8uYXJvdW5kRnVuYykpKXsKKwkJCWFvLmFyb3VuZEZ1bmMgPSBkbC5nZXROYW1lSW5PYmooYW8uYXJvdW5kT2JqLCBhby5hcm91bmRGdW5jKTsKKwkJfQorCisJCWlmKCFhby5zcmNPYmopeworCQkJZG9qby5yYWlzZSgiYmFkIHNyY09iaiBmb3Igc3JjRnVuYzogIithby5zcmNGdW5jKTsKKwkJfQorCQlpZighYW8uYWR2aWNlT2JqKXsKKwkJCWRvam8ucmFpc2UoImJhZCBhZHZpY2VPYmogZm9yIGFkdmljZUZ1bmM6ICIrYW8uYWR2aWNlRnVuYyk7CisJCX0KKwkJCisJCWlmKCFhby5hZHZpY2VGdW5jKXsKKwkJCWRvam8uZGVidWcoImJhZCBhZHZpY2VGdW5jIGZvciBzcmNGdW5jOiAiK2FvLnNyY0Z1bmMpOworCQkJZG9qby5kZWJ1Z1NoYWxsb3coYW8pOworCQl9IAorCQkKKwkJcmV0dXJuIGFvOworCX0KKworCXRoaXMuY29ubmVjdCA9IGZ1bmN0aW9uKC8qLi4uKi8peworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZG9qby5ldmVudC5jb25uZWN0IGlzIHRoZSBnbHVlIHRoYXQgaG9sZHMgbW9zdCBEb2pvLWJhc2VkCisJCS8vCQlhcHBsaWNhdGlvbnMgdG9nZXRoZXIuIE1vc3QgY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cyBhcmUKKwkJLy8JCXN1cHBvcnRlZCwgd2l0aCB0aGUgY29ubmVjdCgpIG1ldGhvZCBhdHRlbXB0aW5nIHRvIGRpc2FtYmlndWF0ZQorCQkvLwkJdGhlIGltcGxpZWQgdHlwZXMgb2YgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLiBUaGUgZm9sbG93aW5nIHdpbGwKKwkJLy8JCWFsbCB3b3JrOgorCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiZ2xvYmFsRnVuY3Rpb25OYW1lMSIsICJnbG9iYWxGdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KGZ1bmN0aW9uUmVmZXJlbmNlMSwgZnVuY3Rpb25SZWZlcmVuY2UyKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImdsb2JhbEZ1bmN0aW9uTmFtZTEiLCBmdW5jdGlvblJlZmVyZW5jZTIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdChmdW5jdGlvblJlZmVyZW5jZTEsICJnbG9iYWxGdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KHNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAiZ2xvYmFsRnVuY3Rpb25OYW1lMiIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiZ2xvYmFsRnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3Qoc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImFmdGVyIiwgc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZSIsIHNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCBzY29wZTIsICJmdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQlhcm91bmRGdW5jdGlvblJlZmVyZW5jZSk7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQlzY29wZTMsICJhcm91bmRGdW5jdGlvbk5hbWUiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZS1hcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJCQlzY29wZTIsICJmdW5jdGlvbk5hbWUyIiwKKwkJLy8JCQkJCQkJCQkJCQkJYXJvdW5kRnVuY3Rpb25SZWZlcmVuY2UpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYWZ0ZXItYXJvdW5kIiwgCQlzY29wZTEsICJmdW5jdGlvbk5hbWUxIiwgCisJCS8vCQkJCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJCQlhcm91bmRGdW5jdGlvblJlZmVyZW5jZSk7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhZnRlci1hcm91bmQiLCAJCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQkJCXNjb3BlMywgImFyb3VuZEZ1bmN0aW9uTmFtZSIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYXJvdW5kIiwgCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJc2NvcGUzLCAiYXJvdW5kRnVuY3Rpb25OYW1lIiwgdHJ1ZSwgMzApOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYXJvdW5kIiwgCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJc2NvcGUzLCAiYXJvdW5kRnVuY3Rpb25OYW1lIiwgbnVsbCwgbnVsbCwgMTApOworCQkvLyBhZHZpY2VUeXBlOiAKKwkJLy8JCU9wdGlvbmFsLiBTdHJpbmcuIE9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImFyb3VuZCIsCisJCS8vCQkiYmVmb3JlLWFyb3VuZCIsIG9yICJhZnRlci1hcm91bmQiLiBGSVhNRQorCQkvLyBzcmNPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIHNyY0Z1bmMuIEFsb25nCisJCS8vCQl3aXRoIHNyY0Z1bmMsIHRoaXMgY3JlYXRlcyBhIHdheSB0byBkZXJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gdG8KKwkJLy8JCWNhbGwuIFNvIGlmIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBpcyAiZm9vLmJhciIsIHRoZQorCQkvLwkJc3JjT2JqL3NyY0Z1bmMgcGFpciB3b3VsZCBiZSBmb28gYW5kICJiYXIiLCB3aGVyZSAiYmFyIiBpcyBhCisJCS8vCQlzdHJpbmcgYW5kIGZvbyBpcyBhbiBvYmplY3QgcmVmZXJlbmNlLgorCQkvLyBzcmNGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNvbm5lY3QgdG8uIFdoZW4gaXQgaXMgZXhlY3V0ZWQsCisJCS8vCQl0aGUgbGlzdGVuZXIgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2FsbCB3aWxsIGJlIGNhbGxlZC4KKwkJLy8JCVRoZSBhZHZpY2VUeXBlIGRlZmluZXMgdGhlIGNhbGwgb3JkZXIgYmV0d2VlbiB0aGUgc291cmNlIGFuZAorCQkvLwkJdGhlIHRhcmdldCBmdW5jdGlvbnMuCisJCS8vIGFkdmljZU9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYWR2aWNlRnVuYy4KKwkJLy8gYWR2aWNlRnVuYzoKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjb25lY3RlZCB0byBzcmNPYmouc3JjRnVuYworCQkvLyBhcm91bmRPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFyb3VuZEZ1bmMuCisJCS8vIGFyb3VuZEZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiwgb3IgYSByZWZlcmVuY2UgdG8sIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZAorCQkvLwkJdG8gbWVkaWF0ZSB0aGUgYWR2aWNlIGNhbGwuIEFyb3VuZCBhZHZpY2UgcmVxdWlyZXMgYSBzcGVjaWFsCisJCS8vCQl1bmFyeSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIGEgIk1ldGhvZEludm9jYXRpb24iIG9iamVjdC4KKwkJLy8JCVRoZXNlIG9iamVjdHMgaGF2ZSBzZXZlcmFsIGltcG9ydGFudCBwcm9wZXJ0aWVzLCBuYW1lbHk6CisJCS8vCQkJLSBhcmdzCisJCS8vCQkJCWEgbXV0YWJsZSBhcnJheSBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlCisJCS8vCQkJCXdyYXBwZWQgZnVuY3Rpb24KKwkJLy8JCQktIHByb2NlZWQKKwkJLy8JCQkJYSBmdW5jdGlvbiB0aGF0ICJjb250aW51ZXMiIHRoZSBpbnZvY2F0aW9uLiBUaGUgcmVzdWx0CisJCS8vCQkJCW9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldHVybiBvZiB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKwkJLy8JCQkJWW91IGNhbiB0aGVuIG1hbmlwdWxhdGUgdGhpcyByZXR1cm4gYmVmb3JlIHBhc3NpbmcgaXQKKwkJLy8JCQkJYmFjayBvdXQgKG9yIHRha2UgZnVydGhlciBhY3Rpb24gYmFzZWQgb24gaXQpLgorCQkvLyBvbmNlOgorCQkvLwkJYm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBjb25uZWN0KCkgd2lsbAorCQkvLwkJY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gaWYgYW4gaWRlbnRpY2FsIGNvbm5lY3QoKSBoYXMgYWxyZWFkeQorCQkvLwkJYmVlbiBtYWRlLiBEZWZhdWx0cyB0byAiZmFsc2UiLgorCQkvLyBkZWxheToKKwkJLy8JCWFuIG9wdGlvbmFsIGRlbGF5IChpbiBtcyksIGFzIGFuIGludGVnZXIsIGZvciBkaXNwYXRjaCBvZiBhCisJCS8vCQlsaXN0ZW5lciBhZnRlciB0aGUgc291cmNlIGhhcyBiZWVuIGZpcmVkLgorCQkvLyByYXRlOgorCQkvLwkJYW4gb3B0aW9uYWwgcmF0ZSB0aHJvdHRsaW5nIHBhcmFtZXRlciAoaW50ZWdlciwgaW4gbXMpLiBXaGVuCisJCS8vCQlzcGVjaWZpZWQsIHRoaXMgcGFydGljdWxhciBjb25uZWN0aW9uIHdpbGwgbm90IGZpcmUgbW9yZSB0aGFuCisJCS8vCQlvbmNlIGluIHRoZSBpbnRlcnZhbCBzcGVjaWZpZWQgYnkgdGhlIHJhdGUKKwkJLy8gYWR2aWNlTXNnOgorCQkvLwkJYm9vbGVhbi4gU2hvdWxkIHRoZSBsaXN0ZW5lciBoYXZlIGFsbCB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW4KKwkJLy8JCWFzIGEgc2luZ2xlIGFyZ3VtZW50PworCisJCS8qCisJCQkJYW8uYWR2aWNlVHlwZSA9IGFyZ3NbMF07CisJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQlhby5zcmNGdW5jID0gYXJnc1syXTsKKwkJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdCisJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQkJYW8uYXJvdW5kT2JqID0gYXJnc1s1XTsKKwkJCQlhby5hcm91bmRGdW5jID0gYXJnc1s2XTsKKwkJCQlhby5vbmNlID0gYXJnc1s3XTsKKwkJCQlhby5kZWxheSA9IGFyZ3NbOF07CisJCQkJYW8ucmF0ZSA9IGFyZ3NbOV07CisJCQkJYW8uYWR2aWNlTXNnID0gYXJnc1sxMF07CisJCQkJYW8ubWF4Q2FsbHMgPSBhcmdzWzExXTsKKwkJKi8KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsKKwkJCXZhciBhbyA9IGFyZ3VtZW50c1swXTsKKwkJfWVsc2V7CisJCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJfQorCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcoYW8uc3JjRnVuYykgJiYgKGFvLnNyY0Z1bmMudG9Mb3dlckNhc2UoKSA9PSAib25rZXkiKSApeworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJYW8uc3JjRnVuYyA9ICJvbmtleWRvd24iOworCQkJCXRoaXMuY29ubmVjdChhbyk7CisJCQl9CisJCQlhby5zcmNGdW5jID0gIm9ua2V5cHJlc3MiOworCQl9CisKKwkJaWYoZG9qby5sYW5nLmlzQXJyYXkoYW8uc3JjT2JqKSAmJiBhby5zcmNPYmohPSIiKXsKKwkJCXZhciB0bXBBTyA9IHt9OworCQkJZm9yKHZhciB4IGluIGFvKXsKKwkJCQl0bXBBT1t4XSA9IGFvW3hdOworCQkJfQorCQkJdmFyIG1qcHMgPSBbXTsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKGFvLnNyY09iaiwgZnVuY3Rpb24oc3JjKXsKKwkJCQlpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ubGFuZy5pc1N0cmluZyhzcmMpKSl7CisJCQkJCXNyYyA9IGRvam8uYnlJZChzcmMpOworCQkJCQkvLyBkb2pvLmRlYnVnKHNyYyk7CisJCQkJfQorCQkJCXRtcEFPLnNyY09iaiA9IHNyYzsKKwkJCQkvLyBkb2pvLmRlYnVnKHRtcEFPLnNyY09iaiwgdG1wQU8uc3JjRnVuYyk7CisJCQkJLy8gZG9qby5kZWJ1Zyh0bXBBTy5hZHZpY2VPYmosIHRtcEFPLmFkdmljZUZ1bmMpOworCQkJCW1qcHMucHVzaChkb2pvLmV2ZW50LmNvbm5lY3QuY2FsbChkb2pvLmV2ZW50LCB0bXBBTykpOworCQkJfSk7CisJCQlyZXR1cm4gbWpwczsKKwkJfQorCisJCS8vIEZJWE1FOiBqdXN0IGRvaW5nIGEgImdldEZvck1ldGhvZCgpIiBzZWVtcyB0byBiZSBlbm91Z2ggdG8gcHV0IHRoaXMgaW50byBpbmZpbml0ZSByZWN1cnNpb24hIQorCQl2YXIgbWpwID0gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaiwgYW8uc3JjRnVuYyk7CisJCWlmKGFvLmFkdmljZUZ1bmMpeworCQkJdmFyIG1qcDIgPSBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QoYW8uYWR2aWNlT2JqLCBhby5hZHZpY2VGdW5jKTsKKwkJfQorCisJCW1qcC5rd0FkZEFkdmljZShhbyk7CisKKwkJLy8gYWR2YW5jZWQgdXNlcnMgbWlnaHQgd2FudCB0byBmc2NrIHcvIHRoZSBqb2luIHBvaW50IG1hbnVhbGx5CisJCXJldHVybiBtanA7IC8vIGEgTWV0aG9kSm9pblBvaW50IG9iamVjdAorCX0KKworCXRoaXMubG9nID0gZnVuY3Rpb24oLypvYmplY3Qgb3IgZnVuY05hbWUqLyBhMSwgLypmdW5jTmFtZSovIGEyKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWEgZnVuY3Rpb24gdGhhdCB3aWxsIHdyYXAgYW5kIGxvZyBhbGwgY2FsbHMgdG8gdGhlIHNwZWNpZmllZAorCQkvLwkJYTEuYTIoKSBmdW5jdGlvbi4gSWYgb25seSBhMSBpcyBwYXNzZWQsIGl0J2xsIGJlIHVzZWQgYXMgYQorCQkvLwkJZnVuY3Rpb24gb3IgZnVuY3Rpb24gbmFtZSBvbiB0aGUgZ2xvYmFsIGNvbnRleHQuIExvZ2dpbmcgd2lsbAorCQkvLwkJYmUgc2VudCB0byBkb2pvLmRlYnVnCisJCS8vIGExOgorCQkvLwkJaWYgYTIgaXMgcGFzc2VkLCB0aGlzIHNob3VsZCBiZSBhbiBvYmplY3QuIElmIG5vdCwgaXQgY2FuIGJlIGEKKwkJLy8JCWZ1bmN0aW9uIG9yIGZ1bmN0aW9uIG5hbWUuCisJCS8vIGEyOgorCQkvLwkJYSBmdW5jdGlvbiBuYW1lCisJCXZhciBrd0FyZ3M7CisJCWlmKChhcmd1bWVudHMubGVuZ3RoID09IDEpJiYodHlwZW9mIGExID09ICJvYmplY3QiKSl7CisJCQlrd0FyZ3MgPSBhMTsKKwkJfWVsc2V7CisJCQlrd0FyZ3MgPSB7CisJCQkJc3JjT2JqOiBhMSwKKwkJCQlzcmNGdW5jOiBhMgorCQkJfTsKKwkJfQorCQlrd0FyZ3MuYWR2aWNlRnVuYyA9IGZ1bmN0aW9uKCl7CisJCQl2YXIgYXJnc1N0ciA9IFtdOworCQkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCQlhcmdzU3RyLnB1c2goYXJndW1lbnRzW3hdKTsKKwkJCX0KKwkJCWRvam8uZGVidWcoIigiK2t3QXJncy5zcmNPYmorIikuIitrd0FyZ3Muc3JjRnVuYywgIjoiLCBhcmdzU3RyLmpvaW4oIiwgIikpOworCQl9OworCQl0aGlzLmt3Q29ubmVjdChrd0FyZ3MpOworCX0KKworCXRoaXMuY29ubmVjdEJlZm9yZSA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCSAJdGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBkb2pvLmV2ZW50LmNvbm5lY3QoKSwgZXhjZXB0IHRoYXQKKwkJLy8JIAl0aGUgYWR2aWNlIHR5cGUgd2lsbCBhbHdheXMgYmUgImJlZm9yZSIKKwkJdmFyIGFyZ3MgPSBbImJlZm9yZSJdOworCQlmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KKwkJcmV0dXJuIHRoaXMuY29ubmVjdC5hcHBseSh0aGlzLCBhcmdzKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJfQorCisJdGhpcy5jb25uZWN0QXJvdW5kID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JIAl0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpLCBleGNlcHQgdGhhdAorCQkvLwkgCXRoZSBhZHZpY2UgdHlwZSB3aWxsIGFsd2F5cyBiZSAiYXJvdW5kIgorCQl2YXIgYXJncyA9IFsiYXJvdW5kIl07CisJCWZvcih2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspeyBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfQorCQlyZXR1cm4gdGhpcy5jb25uZWN0LmFwcGx5KHRoaXMsIGFyZ3MpOyAvLyBhIE1ldGhvZEpvaW5Qb2ludCBvYmplY3QKKwl9CisKKwl0aGlzLmNvbm5lY3RPbmNlID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JIAl0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpLCBleGNlcHQgdGhhdAorCQkvLwkgCXRoZSAib25jZSIgZmxhZyB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gInRydWUiCisJCXZhciBhbyA9IGludGVycG9sYXRlQXJncyhhcmd1bWVudHMsIHRydWUpOworCQlhby5vbmNlID0gdHJ1ZTsKKwkJcmV0dXJuIHRoaXMuY29ubmVjdChhbyk7IC8vIGEgTWV0aG9kSm9pblBvaW50IG9iamVjdAorCX0KKworCXRoaXMuY29ubmVjdFJ1bk9uY2UgPSBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkgCXRha2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgZG9qby5ldmVudC5jb25uZWN0KCksIGV4Y2VwdCB0aGF0CisJCS8vCSAJdGhlICJtYXhDYWxscyIgZmxhZyB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gMQorCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJYW8ubWF4Q2FsbHMgPSAxOworCQlyZXR1cm4gdGhpcy5jb25uZWN0KGFvKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJfQorCisJdGhpcy5fa3dDb25uZWN0SW1wbCA9IGZ1bmN0aW9uKGt3QXJncywgZGlzY29ubmVjdCl7CisJCXZhciBmbiA9IChkaXNjb25uZWN0KSA/ICJkaXNjb25uZWN0IiA6ICJjb25uZWN0IjsKKwkJaWYodHlwZW9mIGt3QXJnc1sic3JjRnVuYyJdID09ICJmdW5jdGlvbiIpeworCQkJa3dBcmdzLnNyY09iaiA9IGt3QXJnc1sic3JjT2JqIl18fGRqX2dsb2JhbDsKKwkJCXZhciB0bXBOYW1lICA9IGRvam8ubGFuZy5uYW1lQW5vbkZ1bmMoa3dBcmdzLnNyY0Z1bmMsIGt3QXJncy5zcmNPYmosIHRydWUpOworCQkJa3dBcmdzLnNyY0Z1bmMgPSB0bXBOYW1lOworCQl9CisJCWlmKHR5cGVvZiBrd0FyZ3NbImFkdmljZUZ1bmMiXSA9PSAiZnVuY3Rpb24iKXsKKwkJCWt3QXJncy5hZHZpY2VPYmogPSBrd0FyZ3NbImFkdmljZU9iaiJdfHxkal9nbG9iYWw7CisJCQl2YXIgdG1wTmFtZSAgPSBkb2pvLmxhbmcubmFtZUFub25GdW5jKGt3QXJncy5hZHZpY2VGdW5jLCBrd0FyZ3MuYWR2aWNlT2JqLCB0cnVlKTsKKwkJCWt3QXJncy5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJfQorCQlrd0FyZ3Muc3JjT2JqID0ga3dBcmdzWyJzcmNPYmoiXXx8ZGpfZ2xvYmFsOworCQlrd0FyZ3MuYWR2aWNlT2JqID0ga3dBcmdzWyJhZHZpY2VPYmoiXXx8a3dBcmdzWyJ0YXJnZXRPYmoiXXx8ZGpfZ2xvYmFsOworCQlrd0FyZ3MuYWR2aWNlRnVuYyA9IGt3QXJnc1siYWR2aWNlRnVuYyJdfHxrd0FyZ3NbInRhcmdldEZ1bmMiXTsKKwkJLy8gcGFzcyBrd2FyZ3MgdG8gYXZvaWQgdW5yb2xsaW5nL3JlcGFja2luZworCQlyZXR1cm4gZG9qby5ldmVudFtmbl0oa3dBcmdzKTsKKwl9CisKKwl0aGlzLmt3Q29ubmVjdCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki8ga3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUEgdmVyc2lvbiBvZiBkb2pvLmV2ZW50LmNvbm5lY3QoKSB0aGF0IHRha2VzIGEgbWFwIG9mIG5hbWVkCisJCS8vCQlwYXJhbWV0ZXJzIGluc3RlYWQgb2YgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGF0CisJCS8vCQlkb2pvLmV2ZW50LmNvbm5lY3QoKSB1c2VzLiBGb3IgbWFueSBhZHZhbmNlZCBjb25uZWN0aW9uIHR5cGVzLAorCQkvLwkJdGhpcyBjYW4gYmUgYSBtdWNoIG1vcmUgcmVhZGFibGUgKGFuZCBwb3RlbnRpYWxseSBmYXN0ZXIpCisJCS8vCQlhbHRlcm5hdGl2ZS4KKwkJLy8ga3dBcmdzOgorCQkvLyAJCUFuIG9iamVjdCB0aGF0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKwkJLy8JCQktIGFkdmljZVR5cGUKKwkJLy8JCQktIHNyY09iagorCQkvLwkJCS0gc3JjRnVuYworCQkvLwkJCS0gYWR2aWNlT2JqCisJCS8vCQkJLSBhZHZpY2VGdW5jIAorCQkvLwkJCS0gYXJvdW5kT2JqCisJCS8vCQkJLSBhcm91bmRGdW5jCisJCS8vCQkJLSBvbmNlCisJCS8vCQkJLSBkZWxheQorCQkvLwkJCS0gcmF0ZQorCQkvLwkJCS0gYWR2aWNlTXNnCisJCS8vCQlBcyB3aXRoIGNvbm5lY3QsIG9ubHkgc3JjRnVuYyBhbmQgYWR2aWNlRnVuYyBhcmUgZ2VuZXJhbGx5CisJCS8vCQlyZXF1aXJlZAorCisJCXJldHVybiB0aGlzLl9rd0Nvbm5lY3RJbXBsKGt3QXJncywgZmFsc2UpOyAvLyBhIE1ldGhvZEpvaW5Qb2ludCBvYmplY3QKKworCX0KKworCXRoaXMuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlUYWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpIGJ1dCBkZXN0cm95cworCQkvLwkJYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS4gRm9yCisJCS8vCQltdWx0aXBsZSBpZGVudGljYWwgY29ubmVjdGlvbnMsIG11bHRpcGxlIGRpc2Nvbm5lY3QoKSBjYWxscworCQkvLwkJd2lsbCB1bnJvbGwgb25lIGVhY2ggdGltZSBpdCdzIGNhbGxlZC4KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsKKwkJCXZhciBhbyA9IGFyZ3VtZW50c1swXTsKKwkJfWVsc2V7CisJCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJfQorCQlpZighYW8uYWR2aWNlRnVuYyl7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRpc2Nvbm5lY3QKKwkJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFvLnNyY0Z1bmMpICYmIChhby5zcmNGdW5jLnRvTG93ZXJDYXNlKCkgPT0gIm9ua2V5IikgKXsKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCWFvLnNyY0Z1bmMgPSAib25rZXlkb3duIjsKKwkJCQl0aGlzLmRpc2Nvbm5lY3QoYW8pOworCQkJfQorCQkJYW8uc3JjRnVuYyA9ICJvbmtleXByZXNzIjsKKwkJfQorCQlpZighYW8uc3JjT2JqW2FvLnNyY0Z1bmNdKXsgcmV0dXJuIG51bGw7IH0gLy8gcHJldmVudCB1bi1uZWNlc3NhcmF5IGpvaW5wb2ludCBjcmVhdGlvbgorCQl2YXIgbWpwID0gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaiwgYW8uc3JjRnVuYywgdHJ1ZSk7CisJCW1qcC5yZW1vdmVBZHZpY2UoYW8uYWR2aWNlT2JqLCBhby5hZHZpY2VGdW5jLCBhby5hZHZpY2VUeXBlLCBhby5vbmNlKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJCXJldHVybiBtanA7CisJfQorCisJdGhpcy5rd0Rpc2Nvbm5lY3QgPSBmdW5jdGlvbihrd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJVGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBkb2pvLmV2ZW50Lmt3Q29ubmVjdCgpIGJ1dAorCQkvLwkJZGVzdHJveXMgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS4KKwkJcmV0dXJuIHRoaXMuX2t3Q29ubmVjdEltcGwoa3dBcmdzLCB0cnVlKTsKKwl9Cit9CisKKy8vIGV4YWN0bHkgb25lIG9mIHRoZXNlIGlzIGNyZWF0ZWQgd2hlbmV2ZXIgYSBtZXRob2Qgd2l0aCBhIGpvaW50IHBvaW50IGlzIHJ1biwKKy8vIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAnYXJvdW5kJyBhZHZpY2UuCitkb2pvLmV2ZW50Lk1ldGhvZEludm9jYXRpb24gPSBmdW5jdGlvbigvKmRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50Ki9qb2luX3BvaW50LCAvKk9iamVjdCovb2JqLCAvKkFycmF5Ki9hcmdzKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlhIGNsYXNzIHRoZSBtb2RlbHMgdGhlIGNhbGwgaW50byBhIGZ1bmN0aW9uLiBUaGlzIGlzIHVzZWQgdW5kZXIgdGhlCisJLy8JCWNvdmVycyBmb3IgYWxsIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBib3RoIGVuZHMgb2YgYQorCS8vCQljb25uZWN0KCktd3JhcHBlZCBmdW5jdGlvbiBkaXNwYXRjaC4gVGhpcyBhbGxvd3MgdXMgdG8gInBpY2tsZSIKKwkvLwkJY2FsbHMsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYXJvdW5kIGFkdmljZS4KKwkvLyBqb2luX3BvaW50OgorCS8vCQlhIGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBjb25uZWN0aW9uCisJLy8gb2JqOgorCS8vCQl0aGUgc2NvcGUgdGhlIGNhbGwgd2lsbCBleGVjdXRlIGluCisJLy8gYXJnczoKKwkvLwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0aGF0IHdpbGwgZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGVlCisJdGhpcy5qcF8gPSBqb2luX3BvaW50OworCXRoaXMub2JqZWN0ID0gb2JqOworCXRoaXMuYXJncyA9IFtdOworCS8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb2NrIGludG8gYSBtdXRhYmxlIG9iamVjdCB3aGljaCBjYW4gY2hhbmdlIHVuZGVyIHVzLgorCS8vIEl0J3Mgb2sgaWYgdGhlIGluZGl2aWR1YWwgaXRlbXMgY2hhbmdlLCB0aG91Z2guCisJZm9yKHZhciB4PTA7IHg8YXJncy5sZW5ndGg7IHgrKyl7CisJCXRoaXMuYXJnc1t4XSA9IGFyZ3NbeF07CisJfQorCS8vIHRoZSBpbmRleCBvZiB0aGUgJ2Fyb3VuZCcgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQuCisJdGhpcy5hcm91bmRfaW5kZXggPSAtMTsKK30KKworZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uLnByb3RvdHlwZS5wcm9jZWVkID0gZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlwcm9jZWVkIHdpdGggdGhlIG1ldGhvZCBjYWxsIHRoYXQncyByZXByZXNlbnRlZCBieSB0aGlzIGludm9jYXRpb24KKwkvLwkJb2JqZWN0CisJdGhpcy5hcm91bmRfaW5kZXgrKzsKKwlpZih0aGlzLmFyb3VuZF9pbmRleCA+PSB0aGlzLmpwXy5hcm91bmQubGVuZ3RoKXsKKwkJcmV0dXJuIHRoaXMuanBfLm9iamVjdFt0aGlzLmpwXy5tZXRob2RuYW1lXS5hcHBseSh0aGlzLmpwXy5vYmplY3QsIHRoaXMuYXJncyk7CisJCS8vIHJldHVybiB0aGlzLmpwXy5ydW5fYmVmb3JlX2FmdGVyKHRoaXMub2JqZWN0LCB0aGlzLmFyZ3MpOworCX1lbHNleworCQl2YXIgdGkgPSB0aGlzLmpwXy5hcm91bmRbdGhpcy5hcm91bmRfaW5kZXhdOworCQl2YXIgbW9iaiA9IHRpWzBdfHxkal9nbG9iYWw7CisJCXZhciBtZXRoID0gdGlbMV07CisJCXJldHVybiBtb2JqW21ldGhdLmNhbGwobW9iaiwgdGhpcyk7CisJfQorfSAKKworCitkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9vYmosIC8qU3RyaW5nKi9mdW5jTmFtZSl7CisJdGhpcy5vYmplY3QgPSBvYmp8fGRqX2dsb2JhbDsKKwl0aGlzLm1ldGhvZG5hbWUgPSBmdW5jTmFtZTsKKwl0aGlzLm1ldGhvZGZ1bmMgPSB0aGlzLm9iamVjdFtmdW5jTmFtZV07CisJdGhpcy5zcXVlbGNoID0gZmFsc2U7CisJLy8gdGhpcy5iZWZvcmUgPSBbXTsKKwkvLyB0aGlzLmFmdGVyID0gW107CisJLy8gdGhpcy5hcm91bmQgPSBbXTsKK30KKworZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kID0gZnVuY3Rpb24oLypPYmplY3QqL29iaiwgLypTdHJpbmcqL2Z1bmNOYW1lKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQkic3RhdGljIiBjbGFzcyBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgTWV0aG9kSm9pblBvaW50IGZyb20gYQorCS8vCQlzY29wZWQgZnVuY3Rpb24uIElmIG9uZSBkb2Vzbid0IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4KKwkvLyBvYmo6CisJLy8JCXRoZSBzY29wZSB0byBzZWFyY2ggZm9yIHRoZSBmdW5jdGlvbiBpbgorCS8vIGZ1bmNOYW1lOgorCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGEgTWV0aG9kSm9pblBvaW50IGZvcgorCWlmKCFvYmopeyBvYmogPSBkal9nbG9iYWw7IH0KKwl2YXIgb2ZuID0gb2JqW2Z1bmNOYW1lXTsKKwlpZighb2ZuKXsKKwkJLy8gc3VwcGx5IGEgZG8tbm90aGluZyBtZXRob2QgaW1wbGVtZW50YXRpb24KKwkJb2ZuID0gb2JqW2Z1bmNOYW1lXSA9IGZ1bmN0aW9uKCl7fTsKKwkJaWYoIW9ialtmdW5jTmFtZV0peworCQkJLy8gZS5nLiBjYW5ub3QgYWRkIHRvIGluYnVpbHQgb2JqZWN0cyBpbiBJRTYKKwkJCWRvam8ucmFpc2UoIkNhbm5vdCBzZXQgZG8tbm90aGluZyBtZXRob2Qgb24gdGhhdCBvYmplY3QgIitmdW5jTmFtZSk7CisJCX0KKwl9ZWxzZSBpZigodHlwZW9mIG9mbiAhPSAiZnVuY3Rpb24iKSYmKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihvZm4pKSYmKCFkb2pvLmxhbmcuaXNBbGllbihvZm4pKSl7CisJCS8vIEZJWE1FOiBzaG91bGQgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgaW5zdGVhZD8KKwkJcmV0dXJuIG51bGw7IAorCX0KKwkvLyB3ZSBoaWRlIG91ciBqb2lucG9pbnQgaW5zdGFuY2UgaW4gb2JqW2Z1bmNOYW1lICsgJyRqb2lucG9pbnQnXQorCXZhciBqcG5hbWUgPSBmdW5jTmFtZSArICIkam9pbnBvaW50IjsKKwl2YXIganBmdW5jbmFtZSA9IGZ1bmNOYW1lICsgIiRqb2lucG9pbnQkbWV0aG9kIjsKKwl2YXIgam9pbnBvaW50ID0gb2JqW2pwbmFtZV07CisJaWYoIWpvaW5wb2ludCl7CisJCXZhciBpc05vZGUgPSBmYWxzZTsKKwkJaWYoZG9qby5ldmVudFsiYnJvd3NlciJdKXsKKwkJCWlmKCAob2JqWyJhdHRhY2hFdmVudCJdKXx8CisJCQkJKG9ialsibm9kZVR5cGUiXSl8fAorCQkJCShvYmpbImFkZEV2ZW50TGlzdGVuZXIiXSkgKXsKKwkJCQlpc05vZGUgPSB0cnVlOworCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRDbG9iYmVyTm9kZUF0dHJzKG9iaiwgW2pwbmFtZSwganBmdW5jbmFtZSwgZnVuY05hbWVdKTsKKwkJCX0KKwkJfQorCQl2YXIgb3JpZ0FyaXR5ID0gb2ZuLmxlbmd0aDsKKwkJb2JqW2pwZnVuY25hbWVdID0gb2ZuOworCQkvLyBqb2lucG9pbnQgPSBvYmpbanBuYW1lXSA9IG5ldyBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludChvYmosIGZ1bmNOYW1lKTsKKwkJam9pbnBvaW50ID0gb2JqW2pwbmFtZV0gPSBuZXcgZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQob2JqLCBqcGZ1bmNuYW1lKTsKKworCQlpZighaXNOb2RlKXsKKwkJCW9ialtmdW5jTmFtZV0gPSBmdW5jdGlvbigpeyAKKwkJCQkvLyB2YXIgYXJncyA9IFtdOworCQkJCS8vIGZvcih2YXIgeD0wOyB4PGFyZ3VtZW50cy5sZW5ndGg7IHgrKyl7CisJCQkJCS8vIGFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCQkJCS8vIH0KKwkJCQkvLyByZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3MpOyAKKwkJCQlyZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3VtZW50cyk7IAorCQkJfQorCQl9ZWxzZXsKKwkJCW9ialtmdW5jTmFtZV0gPSBmdW5jdGlvbigpeyAKKwkJCQl2YXIgYXJncyA9IFtdOworCisJCQkJaWYoIWFyZ3VtZW50cy5sZW5ndGgpeworCQkJCQl2YXIgZXZ0ID0gbnVsbDsKKwkJCQkJdHJ5eworCQkJCQkJaWYob2JqLm93bmVyRG9jdW1lbnQpeworCQkJCQkJCWV2dCA9IG9iai5vd25lckRvY3VtZW50LnBhcmVudFdpbmRvdy5ldmVudDsKKwkJCQkJCX1lbHNlIGlmKG9iai5kb2N1bWVudEVsZW1lbnQpeworCQkJCQkJCWV2dCA9IG9iai5kb2N1bWVudEVsZW1lbnQub3duZXJEb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7CisJCQkJCQl9ZWxzZSBpZihvYmouZXZlbnQpeyAvL29iaiBpcyBhIHdpbmRvdworCQkJCQkJCWV2dCA9IG9iai5ldmVudDsKKwkJCQkJCX1lbHNleworCQkJCQkJCWV2dCA9IHdpbmRvdy5ldmVudDsKKwkJCQkJCX0KKwkJCQkJfWNhdGNoKGUpeworCQkJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJCQl9CisKKwkJCQkJaWYoZXZ0KXsKKwkJCQkJCWFyZ3MucHVzaChkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LCB0aGlzKSk7CisJCQkJCX0KKwkJCQl9ZWxzZXsKKwkJCQkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCQkJCWlmKCh4PT0wKSYmKGRvam8uZXZlbnQuYnJvd3Nlci5pc0V2ZW50KGFyZ3VtZW50c1t4XSkpKXsKKwkJCQkJCQlhcmdzLnB1c2goZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGFyZ3VtZW50c1t4XSwgdGhpcykpOworCQkJCQkJfWVsc2V7CisJCQkJCQkJYXJncy5wdXNoKGFyZ3VtZW50c1t4XSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmV0dXJuIGpvaW5wb2ludC5ydW4uYXBwbHkoam9pbnBvaW50LCBhcmd1bWVudHMpOyAKKwkJCQlyZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3MpOyAKKwkJCX0KKwkJfQorCQlvYmpbZnVuY05hbWVdLl9fcHJlSm9pbkFyaXR5ID0gb3JpZ0FyaXR5OworCX0KKwlyZXR1cm4gam9pbnBvaW50OyAvLyBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludAorfQorCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LCB7CisJc3F1ZWxjaDogZmFsc2UsCisKKwl1bmludGVyY2VwdDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlkZXN0cm95IHRoZSBjb25uZWN0aW9uIHRvIGFsbCBsaXN0ZW5lcnMgdGhhdCBtYXkgaGF2ZSBiZWVuCisJCS8vCQlyZWdpc3RlcmVkIG9uIHRoaXMgam9pbnBvaW50CisJCXRoaXMub2JqZWN0W3RoaXMubWV0aG9kbmFtZV0gPSB0aGlzLm1ldGhvZGZ1bmM7CisJCXRoaXMuYmVmb3JlID0gW107CisJCXRoaXMuYWZ0ZXIgPSBbXTsKKwkJdGhpcy5hcm91bmQgPSBbXTsKKwl9LAorCisJZGlzY29ubmVjdDogZG9qby5sYW5nLmZvcndhcmQoInVuaW50ZXJjZXB0IiksCisKKwlydW46IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlleGVjdXRlIHRoZSBjb25uZWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgam9pbiBwb2ludC4gVGhlCisJCS8vCQlhcmd1bWVudHMgcGFzc2VkIHRvIHJ1bigpIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhbmQKKwkJLy8JCWl0cyBsaXN0ZW5lcnMuCisJCXZhciBvYmogPSB0aGlzLm9iamVjdHx8ZGpfZ2xvYmFsOworCQl2YXIgYXJncyA9IGFyZ3VtZW50czsKKworCQkvLyBvcHRpbWl6YXRpb24uIFdlIG9ubHkgY29tcHV0ZSBvbmNlIHRoZSBhcnJheSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudHMKKwkJLy8gcHNldWRvLWFyciBpbiBvcmRlciB0byBwcmV2ZW50IGJ1aWxkaW5nIGl0IGVhY2ggdGltZSBhZHZpY2UgaXMgdW5yb2xsZWQuCisJCXZhciBhYXJncyA9IFtdOworCQlmb3IodmFyIHg9MDsgeDxhcmdzLmxlbmd0aDsgeCsrKXsKKwkJCWFhcmdzW3hdID0gYXJnc1t4XTsKKwkJfQorCisJCXZhciB1bnJvbGxBZHZpY2UgID0gZnVuY3Rpb24obWFycil7IAorCQkJaWYoIW1hcnIpeworCQkJCWRvam8uZGVidWcoIk51bGwgYXJndW1lbnQgdG8gdW5yb2xsQWR2aWNlKCkiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCSAgCisJCQl2YXIgY2FsbE9iaiA9IG1hcnJbMF18fGRqX2dsb2JhbDsKKwkJCXZhciBjYWxsRnVuYyA9IG1hcnJbMV07CisJCQkKKwkJCWlmKCFjYWxsT2JqW2NhbGxGdW5jXSl7CisJCQkJZG9qby5yYWlzZSgiZnVuY3Rpb24gXCIiICsgY2FsbEZ1bmMgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb24gXCIiICsgY2FsbE9iaiArICJcIiIpOworCQkJfQorCQkJCisJCQl2YXIgYXJvdW5kT2JqID0gbWFyclsyXXx8ZGpfZ2xvYmFsOworCQkJdmFyIGFyb3VuZEZ1bmMgPSBtYXJyWzNdOworCQkJdmFyIG1zZyA9IG1hcnJbNl07CisJCQl2YXIgbWF4Q291bnQgPSBtYXJyWzddOworCQkJaWYobWF4Q291bnQgPiAtMSl7CisJCQkJaWYobWF4Q291bnQgPT0gMCl7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbWFycls3XS0tOworCQkJfQorCQkJdmFyIHVuZGVmOworCisJCQl2YXIgdG8gPSB7CisJCQkJYXJnczogW10sCisJCQkJanBfOiB0aGlzLAorCQkJCW9iamVjdDogb2JqLAorCQkJCXByb2NlZWQ6IGZ1bmN0aW9uKCl7CisJCQkJCXJldHVybiBjYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCB0by5hcmdzKTsKKwkJCQl9CisJCQl9OworCQkJdG8uYXJncyA9IGFhcmdzOworCisJCQl2YXIgZGVsYXkgPSBwYXJzZUludChtYXJyWzRdKTsKKwkJCXZhciBoYXNEZWxheSA9ICgoIWlzTmFOKGRlbGF5KSkmJihtYXJyWzRdIT09bnVsbCkmJih0eXBlb2YgbWFycls0XSAhPSAidW5kZWZpbmVkIikpOworCQkJaWYobWFycls1XSl7CisJCQkJdmFyIHJhdGUgPSBwYXJzZUludChtYXJyWzVdKTsKKwkJCQl2YXIgY3VyID0gbmV3IERhdGUoKTsKKwkJCQl2YXIgdGltZXJTZXQgPSBmYWxzZTsKKwkJCQlpZigobWFyclsibGFzdCJdKSYmKChjdXItbWFyci5sYXN0KTw9cmF0ZSkpeworCQkJCQlpZihkb2pvLmV2ZW50Ll9jYW5UaW1lb3V0KXsKKwkJCQkJCWlmKG1hcnJbImRlbGF5VGltZXIiXSl7CisJCQkJCQkJY2xlYXJUaW1lb3V0KG1hcnIuZGVsYXlUaW1lcik7CisJCQkJCQl9CisJCQkJCQl2YXIgdG9kID0gcGFyc2VJbnQocmF0ZSoyKTsgLy8gaXMgcmF0ZSoyIG5haXZlPworCQkJCQkJdmFyIG1jcHkgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkobWFycik7CisJCQkJCQltYXJyLmRlbGF5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisJCQkJCQkJLy8gRklYTUU6IG9uIElFIGF0IGxlYXN0LCBldmVudCBvYmplY3RzIGZyb20gdGhlCisJCQkJCQkJLy8gYnJvd3NlciBjYW4gZ28gb3V0IG9mIHNjb3BlLiBIb3cgKG9yIHNob3VsZD8pIHdlCisJCQkJCQkJLy8gZGVhbCB3aXRoIGl0PworCQkJCQkJCW1jcHlbNV0gPSAwOworCQkJCQkJCXVucm9sbEFkdmljZShtY3B5KTsKKwkJCQkJCX0sIHRvZCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX1lbHNleworCQkJCQltYXJyLmxhc3QgPSBjdXI7CisJCQkJfQorCQkJfQorCisJCQkvLyBGSVhNRTogbmVlZCB0byBlbmZvcmNlIHJhdGVzIGZvciBhIGNvbm5lY3Rpb24gaGVyZSEKKworCQkJaWYoYXJvdW5kRnVuYyl7CisJCQkJLy8gTk9URTogYXJvdW5kIGFkdmljZSBjYW4ndCBkZWxheSBzaW5jZSB3ZSBtaWdodCBvdGhlcndpc2UgZGVwZW5kCisJCQkJLy8gb24gZXhlY3V0aW9uIG9yZGVyIQorCQkJCWFyb3VuZE9ialthcm91bmRGdW5jXS5jYWxsKGFyb3VuZE9iaiwgdG8pOworCQkJfWVsc2V7CisJCQkJLy8gdmFyIHRtanAgPSBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2Qob2JqLCBtZXRobmFtZSk7CisJCQkJaWYoKGhhc0RlbGF5KSYmKChkb2pvLnJlbmRlci5odG1sKXx8KGRvam8ucmVuZGVyLnN2ZykpKXsgIC8vIEZJWE1FOiB0aGUgcmVuZGVyIGNoZWNrcyBhcmUgZ3JvdHR5IQorCQkJCQlkal9nbG9iYWxbInNldFRpbWVvdXQiXShmdW5jdGlvbigpeworCQkJCQkJaWYobXNnKXsKKwkJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5jYWxsKGNhbGxPYmosIHRvKTsgCisJCQkJCQl9ZWxzZXsKKwkJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsgCisJCQkJCQl9CisJCQkJCX0sIGRlbGF5KTsKKwkJCQl9ZWxzZXsgLy8gbWFueSBlbnZpcm9ubWVudHMgY2FuJ3Qgc3VwcG9ydCBkZWxheSEKKwkJCQkJaWYobXNnKXsKKwkJCQkJCWNhbGxPYmpbY2FsbEZ1bmNdLmNhbGwoY2FsbE9iaiwgdG8pOyAKKwkJCQkJfWVsc2V7CisJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsgCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkJdmFyIHVuUm9sbFNxdWVsY2ggPSBmdW5jdGlvbigpeworCQkJaWYodGhpcy5zcXVlbGNoKXsKKwkJCQl0cnl7CisJCQkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCQl9Y2F0Y2goZSl7IAorCQkJCQlkb2pvLmRlYnVnKGUpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0KKwkJfTsKKworCQlpZigodGhpc1siYmVmb3JlIl0pJiYodGhpcy5iZWZvcmUubGVuZ3RoPjApKXsKKwkJCS8vIHBhc3MgYSBjbG9uZWQgYXJyYXksIGlmIHRoaXMgZXZlbnQgZGlzY29ubmVjdHMgdGhpcyBldmVudCBmb3JFYWNoIG9uIHRoaXMuYmVmb3JlIHdvbnQgd29yaworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5iZWZvcmUuY29uY2F0KG5ldyBBcnJheSgpKSwgdW5Sb2xsU3F1ZWxjaCk7CisJCX0KKworCQl2YXIgcmVzdWx0OworCQl0cnl7CisJCQlpZigodGhpc1siYXJvdW5kIl0pJiYodGhpcy5hcm91bmQubGVuZ3RoPjApKXsKKwkJCQl2YXIgbWkgPSBuZXcgZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uKHRoaXMsIG9iaiwgYXJncyk7CisJCQkJcmVzdWx0ID0gbWkucHJvY2VlZCgpOworCQkJfWVsc2UgaWYodGhpcy5tZXRob2RmdW5jKXsKKwkJCQlyZXN1bHQgPSB0aGlzLm9iamVjdFt0aGlzLm1ldGhvZG5hbWVdLmFwcGx5KHRoaXMub2JqZWN0LCBhcmdzKTsKKwkJCX0KKwkJfWNhdGNoKGUpeyAKKwkJCWlmKCF0aGlzLnNxdWVsY2gpeyAKKwkJCQlkb2pvLmRlYnVnKGUsIndoZW4gY2FsbGluZyIsdGhpcy5tZXRob2RuYW1lLCJvbiIsdGhpcy5vYmplY3QsIndpdGggYXJndW1lbnRzIixhcmdzKTsKKwkJCQlkb2pvLnJhaXNlKGUpOworCQkJfSAKKwkJfQorCisJCWlmKCh0aGlzWyJhZnRlciJdKSYmKHRoaXMuYWZ0ZXIubGVuZ3RoPjApKXsKKwkJCS8vIHNlZSBjb21tZW50IG9uIHRoaXMuYmVmb3JlIGFib3ZlCisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmFmdGVyLmNvbmNhdChuZXcgQXJyYXkoKSksIHVuUm9sbFNxdWVsY2gpOworCQl9CisKKwkJcmV0dXJuICh0aGlzLm1ldGhvZGZ1bmMpID8gcmVzdWx0IDogbnVsbDsKKwl9LAorCisJZ2V0QXJyOiBmdW5jdGlvbigvKlN0cmluZyova2luZCl7CisJCS8vIHN1bW1hcnk6IHJldHVybiBhIGxpc3Qgb2YgbGlzdGVuZXJzIG9mIHRoZSBwYXN0ICJraW5kIgorCQkvLyBraW5kOgorCQkvLwkJY2FuIGJlIG9uZSBvZjogImJlZm9yZSIsICJhZnRlciIsICJhcm91bmQiLCAiYmVmb3JlLWFyb3VuZCIsIG9yCisJCS8vCQkiYWZ0ZXItYXJvdW5kIgorCQl2YXIgdHlwZSA9ICJhZnRlciI7CisJCS8vIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkbyB0aGlzIHRocm91Z2ggcHJvcHMgb3IgQXJyYXkuaW4oKQorCQlpZigodHlwZW9mIGtpbmQgPT0gInN0cmluZyIpJiYoa2luZC5pbmRleE9mKCJiZWZvcmUiKSE9LTEpKXsKKwkJCXR5cGUgPSAiYmVmb3JlIjsKKwkJfWVsc2UgaWYoa2luZD09ImFyb3VuZCIpeworCQkJdHlwZSA9ICJhcm91bmQiOworCQl9CisJCWlmKCF0aGlzW3R5cGVdKXsgdGhpc1t0eXBlXSA9IFtdOyB9CisJCXJldHVybiB0aGlzW3R5cGVdOyAvLyBBcnJheQorCX0sCisKKwlrd0FkZEFkdmljZTogZnVuY3Rpb24oLypPYmplY3QqL2FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJYWRkcyBhZHZpY2UgdG8gdGhlIGpvaW5wb2ludCB3aXRoIGFyZ3VtZW50cyBpbiBhIG1hcAorCQkvLyBhcmdzOgorCQkvLyAJCUFuIG9iamVjdCB0aGF0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKwkJLy8JCQktIGFkdmljZVR5cGUKKwkJLy8JCQktIGFkdmljZU9iagorCQkvLwkJCS0gYWR2aWNlRnVuYyAKKwkJLy8JCQktIGFyb3VuZE9iagorCQkvLwkJCS0gYXJvdW5kRnVuYworCQkvLwkJCS0gb25jZQorCQkvLwkJCS0gZGVsYXkKKwkJLy8JCQktIHJhdGUKKwkJLy8JCQktIGFkdmljZU1zZworCQkvLwkJCS0gbWF4Q2FsbHMKKwkJdGhpcy5hZGRBZHZpY2UoCWFyZ3NbImFkdmljZU9iaiJdLCBhcmdzWyJhZHZpY2VGdW5jIl0sIAorCQkJCQkJYXJnc1siYXJvdW5kT2JqIl0sIGFyZ3NbImFyb3VuZEZ1bmMiXSwgCisJCQkJCQlhcmdzWyJhZHZpY2VUeXBlIl0sIGFyZ3NbInByZWNlZGVuY2UiXSwgCisJCQkJCQlhcmdzWyJvbmNlIl0sIGFyZ3NbImRlbGF5Il0sIGFyZ3NbInJhdGUiXSwgCisJCQkJCQlhcmdzWyJhZHZpY2VNc2ciXSwgYXJnc1sibWF4Q2FsbHMiXSk7CisJfSwKKworCWFkZEFkdmljZTogZnVuY3Rpb24oCXRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIAorCQkJCQkJCXRoaXNBcm91bmRPYmosIHRoaXNBcm91bmQsIAorCQkJCQkJCWFkdmljZVR5cGUsIHByZWNlZGVuY2UsIAorCQkJCQkJCW9uY2UsIGRlbGF5LCByYXRlLCBhc01lc3NhZ2UsCisJCQkJCQkJbWF4Q2FsbHMpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJYWRkIGFkdmljZSB0byB0aGlzIGpvaW5wb2ludCB1c2luZyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKKwkJLy8gdGhpc0FkdmljZU9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYWR2aWNlRnVuYy4KKwkJLy8gdGhpc0FkdmljZUZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY29uZWN0ZWQKKwkJLy8gdGhpc0Fyb3VuZE9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYXJvdW5kRnVuYy4KKwkJLy8gdGhpc0Fyb3VuZEZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbWVkaWF0ZSB0aGUKKwkJLy8JCWFkdmljZSBjYWxsLgorCQkvLyBhZHZpY2VUeXBlOiAKKwkJLy8JCU9wdGlvbmFsLiBTdHJpbmcuIE9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImFyb3VuZCIsCisJCS8vCQkiYmVmb3JlLWFyb3VuZCIsIG9yICJhZnRlci1hcm91bmQiLiBGSVhNRQorCQkvLyBvbmNlOgorCQkvLwkJYm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBhZHZpY2Ugd2lsbCBjcmVhdGUKKwkJLy8JCWEgbmV3IGNvbm5lY3Rpb24gaWYgYW4gaWRlbnRpY2FsIGFkdmljZSBzZXQgaGFzIGFscmVhZHkgYmVlbgorCQkvLwkJcHJvdmlkZWQuIERlZmF1bHRzIHRvICJmYWxzZSIuCisJCS8vIGRlbGF5OgorCQkvLwkJYW4gb3B0aW9uYWwgZGVsYXkgKGluIG1zKSwgYXMgYW4gaW50ZWdlciwgZm9yIGRpc3BhdGNoIG9mIGEKKwkJLy8JCWxpc3RlbmVyIGFmdGVyIHRoZSBzb3VyY2UgaGFzIGJlZW4gZmlyZWQuCisJCS8vIHJhdGU6CisJCS8vCQlhbiBvcHRpb25hbCByYXRlIHRocm90dGxpbmcgcGFyYW1ldGVyIChpbnRlZ2VyLCBpbiBtcykuIFdoZW4KKwkJLy8JCXNwZWNpZmllZCwgdGhpcyBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24gd2lsbCBub3QgZmlyZSBtb3JlIHRoYW4KKwkJLy8JCW9uY2UgaW4gdGhlIGludGVydmFsIHNwZWNpZmllZCBieSB0aGUgcmF0ZQorCQkvLyBhZHZpY2VNc2c6CisJCS8vCQlib29sZWFuLiBTaG91bGQgdGhlIGxpc3RlbmVyIGhhdmUgYWxsIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbgorCQkvLwkJYXMgYSBzaW5nbGUgYXJndW1lbnQ/CisJCS8vIG1heENhbGxzOgorCQkvLwkJSW50ZWdlci4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoaXMgY29ubmVjdGlvbiBjYW4gYmUKKwkJLy8JCXVzZWQgYmVmb3JlIGJlaW5nIGF1dG8tZGlzY29ubmVjdGVkLiAtMSBzaWduYWxzIHRoYXQgdGhlCisJCS8vCQljb25uZWN0aW9uIHNob3VsZCBuZXZlciBiZSBkaXNjb25uZWN0ZWQuCisJCXZhciBhcnIgPSB0aGlzLmdldEFycihhZHZpY2VUeXBlKTsKKwkJaWYoIWFycil7CisJCQlkb2pvLnJhaXNlKCJiYWQgdGhpczogIiArIHRoaXMpOworCQl9CisKKwkJdmFyIGFvID0gW3RoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIHRoaXNBcm91bmRPYmosIHRoaXNBcm91bmQsIGRlbGF5LCByYXRlLCBhc01lc3NhZ2UsIG1heENhbGxzXTsKKwkJCisJCWlmKG9uY2UpeworCQkJaWYodGhpcy5oYXNBZHZpY2UodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgYXJyKSA+PSAwKXsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZihwcmVjZWRlbmNlID09ICJmaXJzdCIpeworCQkJYXJyLnVuc2hpZnQoYW8pOworCQl9ZWxzZXsKKwkJCWFyci5wdXNoKGFvKTsKKwkJfQorCX0sCisKKwloYXNBZHZpY2U6IGZ1bmN0aW9uKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycil7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgZmlyc3QgZXhpc3RpbmcgY29ubmVjdGlvbgorCQkvLwkJYmV0d2VlbmVkIHRoZSBwYXNzZWQgYWR2aWNlIGFuZCB0aGlzIGpvaW5wb2ludC4gV2lsbCBiZSAtMSBpZgorCQkvLwkJbm9uZSBleGlzdHMuCisJCS8vIHRoaXNBZHZpY2VPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFkdmljZUZ1bmMuCisJCS8vIHRoaXNBZHZpY2VGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNvbmVjdGVkCisJCS8vIGFkdmljZVR5cGU6IAorCQkvLwkJT3B0aW9uYWwuIFN0cmluZy4gT25lIG9mICJiZWZvcmUiLCAiYWZ0ZXIiLCAiYXJvdW5kIiwKKwkJLy8JCSJiZWZvcmUtYXJvdW5kIiwgb3IgImFmdGVyLWFyb3VuZCIuIEZJWE1FCisJCS8vIGFycjoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgbGlzdCBvZiBhZHZpY2VzIHRvIHNlYXJjaC4gV2lsbCBiZSBmb3VuZCB2aWEKKwkJLy8JCWFkdmljZVR5cGUgaWYgbm90IHBhc3NlZAorCQlpZighYXJyKXsgYXJyID0gdGhpcy5nZXRBcnIoYWR2aWNlVHlwZSk7IH0KKwkJdmFyIGluZCA9IC0xOworCQlmb3IodmFyIHg9MDsgeDxhcnIubGVuZ3RoOyB4KyspeworCQkJdmFyIGFhbyA9ICh0eXBlb2YgdGhpc0FkdmljZSA9PSAib2JqZWN0IikgPyAobmV3IFN0cmluZyh0aGlzQWR2aWNlKSkudG9TdHJpbmcoKSA6IHRoaXNBZHZpY2U7CisJCQl2YXIgYTFvID0gKHR5cGVvZiBhcnJbeF1bMV0gPT0gIm9iamVjdCIpID8gKG5ldyBTdHJpbmcoYXJyW3hdWzFdKSkudG9TdHJpbmcoKSA6IGFyclt4XVsxXTsKKwkJCWlmKChhcnJbeF1bMF0gPT0gdGhpc0FkdmljZU9iaikmJihhMW8gPT0gYWFvKSl7CisJCQkJaW5kID0geDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5kOyAvLyBJbnRlZ2VyCisJfSwKKworCXJlbW92ZUFkdmljZTogZnVuY3Rpb24odGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgb25jZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgZmlyc3QgZXhpc3RpbmcgY29ubmVjdGlvbgorCQkvLwkJYmV0d2VlbmVkIHRoZSBwYXNzZWQgYWR2aWNlIGFuZCB0aGlzIGpvaW5wb2ludC4gV2lsbCBiZSAtMSBpZgorCQkvLwkJbm9uZSBleGlzdHMuCisJCS8vIHRoaXNBZHZpY2VPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFkdmljZUZ1bmMuCisJCS8vIHRoaXNBZHZpY2VGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNvbmVjdGVkCisJCS8vIGFkdmljZVR5cGU6IAorCQkvLwkJT3B0aW9uYWwuIFN0cmluZy4gT25lIG9mICJiZWZvcmUiLCAiYWZ0ZXIiLCAiYXJvdW5kIiwKKwkJLy8JCSJiZWZvcmUtYXJvdW5kIiwgb3IgImFmdGVyLWFyb3VuZCIuIEZJWE1FCisJCS8vIG9uY2U6CisJCS8vCQlPcHRpb25hbC4gU2hvdWxkIHRoaXMgb25seSByZW1vdmUgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiB0aGUKKwkJLy8JCWNvbm5lY3Rpb24/CisJCXZhciBhcnIgPSB0aGlzLmdldEFycihhZHZpY2VUeXBlKTsKKwkJdmFyIGluZCA9IHRoaXMuaGFzQWR2aWNlKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycik7CisJCWlmKGluZCA9PSAtMSl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJd2hpbGUoaW5kICE9IC0xKXsKKwkJCWFyci5zcGxpY2UoaW5kLCAxKTsKKwkJCWlmKG9uY2UpeyBicmVhazsgfQorCQkJaW5kID0gdGhpcy5oYXNBZHZpY2UodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgYXJyKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9KTsKKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQudG9waWMiKTsKKworZG9qby5ldmVudC50b3BpYyA9IG5ldyBmdW5jdGlvbigpeworCXRoaXMudG9waWNzID0ge307CisKKwl0aGlzLmdldFRvcGljID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybnMgYSB0b3BpYyBpbXBsZW1lbnRhdGlvbiBvYmplY3Qgb2YgdHlwZQorCQkvLwkJZG9qby5ldmVudC50b3BpYy5Ub3BpY0ltcGwKKwkJLy8gdG9waWM6CisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQlpZighdGhpcy50b3BpY3NbdG9waWNdKXsKKwkJCXRoaXMudG9waWNzW3RvcGljXSA9IG5ldyB0aGlzLlRvcGljSW1wbCh0b3BpYyk7CisJCX0KKwkJcmV0dXJuIHRoaXMudG9waWNzW3RvcGljXTsgLy8gYSBkb2pvLmV2ZW50LnRvcGljLlRvcGljSW1wbCBvYmplY3QKKwl9CisKKwl0aGlzLnJlZ2lzdGVyUHVibGlzaGVyID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVnaXN0ZXJzIGEgZnVuY3Rpb24gYXMgYSBwdWJsaXNoZXIgb24gYSB0b3BpYy4gU3Vic2VxdWVudAorCQkvLwkJY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgYSBwdWJsaXNoIGV2ZW50IG9uIHRoZSB0b3BpYworCQkvLwkJd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIHJlZ2lzdGVyZWQKKwkJLy8JCWxpc3RlbmVycy4KKwkJLy8gdG9waWM6IAorCQkvLwkJYSB1bmlxdWUsIG9wYXF1ZSBzdHJpbmcgdGhhdCBuYW1lcyB0aGUgdG9waWMKKwkJLy8gb2JqOgorCQkvLwkJdGhlIHNjb3BlIHRvIGxvY2F0ZSB0aGUgZnVuY3Rpb24gaW4KKwkJLy8gZnVuY05hbWU6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnJlZ2lzdGVyUHVibGlzaGVyKG9iaiwgZnVuY05hbWUpOworCX0KKworCXRoaXMuc3Vic2NyaWJlID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3VzYnNjcmliZXMgdGhlIGZ1bmN0aW9uIHRvIHRoZSB0b3BpYy4gU3Vic2VxdWVudCBldmVudHMKKwkJLy8JCWRpc3BhY2hlZCB0byB0aGUgdG9waWMgd2lsbCBjcmVhdGUgYSBmdW5jdGlvbiBjYWxsIGZvciB0aGUKKwkJLy8JCW9iai5mdW5jTmFtZSgpIGZ1bmN0aW9uLgorCQkvLyB0b3BpYzogCisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQkvLyBvYmo6CisJCS8vCQl0aGUgc2NvcGUgdG8gbG9jYXRlIHRoZSBmdW5jdGlvbiBpbgorCQkvLyBmdW5jTmFtZToKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZWluZyByZWdpc3RlcmVkIGFzIGEgbGlzdGVuZXIKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnN1YnNjcmliZShvYmosIGZ1bmNOYW1lKTsKKwl9CisKKwl0aGlzLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJdW5zdWJzY3JpYmVzIHRoZSBvYmouZnVuY05hbWUoKSBmcm9tIHRoZSB0b3BpYworCQkvLyB0b3BpYzogCisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQkvLyBvYmo6CisJCS8vCQl0aGUgc2NvcGUgdG8gbG9jYXRlIHRoZSBmdW5jdGlvbiBpbgorCQkvLyBmdW5jTmFtZToKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZWluZyB1bnJlZ2lzdGVyZWQgYXMgYSBsaXN0ZW5lcgorCQl2YXIgdG9waWMgPSB0aGlzLmdldFRvcGljKHRvcGljKTsKKwkJdG9waWMudW5zdWJzY3JpYmUob2JqLCBmdW5jTmFtZSk7CisJfQorCisJdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlkZXN0cm95cyB0aGUgdG9waWMgYW5kIHVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMKKwkJLy8gdG9waWM6CisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQl0aGlzLmdldFRvcGljKHRvcGljKS5kZXN0cm95KCk7CisJCWRlbGV0ZSB0aGlzLnRvcGljc1t0b3BpY107CisJfQorCisJdGhpcy5wdWJsaXNoQXBwbHkgPSBmdW5jdGlvbigvKlN0cmluZyovdG9waWMsIC8qQXJyYXkqL2FyZ3MpeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCWRpc3BhdGNoZXMgYW4gZXZlbnQgdG8gdGhlIHRvcGljIHVzaW5nIHRoZSBhcmdzIGFycmF5IGFzIHRoZQorCQkvLwkJc291cmNlIGZvciB0aGUgY2FsbCBhcmd1bWVudHMgdG8gZWFjaCBsaXN0ZW5lci4gVGhpcyBpcyBzaW1pbGFyCisJCS8vCQl0byBKYXZhU2NyaXB0J3MgYnVpbHQtaW4gRnVuY3Rpb24uYXBwbHkoKQorCQkvLyB0b3BpYzoKKwkJLy8JCWEgdW5pcXVlLCBvcGFxdWUgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHRvcGljCisJCS8vIGFyZ3M6CisJCS8vCQl0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIGxpc3RlbmVycyBvZiB0aGUgdG9waWMKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnNlbmRNZXNzYWdlLmFwcGx5KHRvcGljLCBhcmdzKTsKKwl9CisKKwl0aGlzLnB1Ymxpc2ggPSBmdW5jdGlvbigvKlN0cmluZyovdG9waWMsIC8qT2JqZWN0Ki9tZXNzYWdlKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQltYW51YWxseSAicHVibGlzaCIgdG8gdGhlIHBhc3NlZCB0b3BpYworCQkvLyB0b3BpYzoKKwkJLy8JCWEgdW5pcXVlLCBvcGFxdWUgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHRvcGljCisJCS8vIG1lc3NhZ2U6CisJCS8vCQljYW4gYmUgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyAoc2ltaWxhciB0byBwdWJsaXNoQXBwbHkpLCBvcgorCQkvLwkJd2lsbCBiZSB0cmVhdGVkIGFzIG9uZSBvZiBtYW55IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgYWxvbmcgaW4KKwkJLy8JCWEgImZsYXQiIHVucm9sbGluZworCQl2YXIgdG9waWMgPSB0aGlzLmdldFRvcGljKHRvcGljKTsKKwkJLy8gaWYgbWVzc2FnZSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgYXJndW1lbnRzLAorCQkvLyBvdGhlcndpc2UsIHdlIGp1c3QgcGFzcyBvbiB0aGUgYXJndW1lbnRzIHBhc3NlZCBpbiBhcy1pcworCQl2YXIgYXJncyA9IFtdOworCQkvLyBjb3VsZCB3ZSB1c2UgY29uY2F0IGluc3RlYWQgaGVyZT8KKwkJZm9yKHZhciB4PTE7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCWFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCQl9CisJCXRvcGljLnNlbmRNZXNzYWdlLmFwcGx5KHRvcGljLCBhcmdzKTsKKwl9Cit9CisKK2Rvam8uZXZlbnQudG9waWMuVG9waWNJbXBsID0gZnVuY3Rpb24odG9waWNOYW1lKXsKKwkvLyBzdW1tYXJ5OiBhIGNsYXNzIHRvIHJlcHJlc2VudCB0b3BpY3MKKworCXRoaXMudG9waWNOYW1lID0gdG9waWNOYW1lOworCisJdGhpcy5zdWJzY3JpYmUgPSBmdW5jdGlvbigvKk9iamVjdCovbGlzdGVuZXJPYmplY3QsIC8qRnVuY3Rpb24gb3IgU3RyaW5nKi9saXN0ZW5lck1ldGhvZCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQl1c2UgZG9qby5ldmVudC5jb25uZWN0KCkgdG8gYXR0YWNoIHRoZSBwYXNzZWQgbGlzdGVuZXIgdG8gdGhlCisJCS8vCQl0b3BpYyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdAorCQkvLyBsaXN0ZW5lck9iamVjdDoKKwkJLy8JCWlmIGEgc3RyaW5nIGFuZCBsaXN0ZW5lck1ldGhvZCBpcyBvbW1pdHRlZCwgdGhpcyBpcyB0cmVhdGVkIGFzCisJCS8vCQl0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJZgorCQkvLwkJbGlzdGVuZXJNZXRob2QgaXMgcHJvdmlkZWQsIHRoaXMgaXMgdGhlIHNjb3BlIHRvIGZpbmQvZXhlY3V0ZQorCQkvLwkJdGhlIGZ1bmN0aW9uIGluLgorCQkvLyBsaXN0ZW5lck1ldGhvZDoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIuCisJCXZhciB0ZiA9IGxpc3RlbmVyTWV0aG9kfHxsaXN0ZW5lck9iamVjdDsKKwkJdmFyIHRvID0gKCFsaXN0ZW5lck1ldGhvZCkgPyBkal9nbG9iYWwgOiBsaXN0ZW5lck9iamVjdDsKKwkJcmV0dXJuIGRvam8uZXZlbnQua3dDb25uZWN0KHsgLy8gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQKKwkJCXNyY09iajoJCXRoaXMsIAorCQkJc3JjRnVuYzoJInNlbmRNZXNzYWdlIiwgCisJCQlhZHZpY2VPYmo6CXRvLAorCQkJYWR2aWNlRnVuYzogdGYKKwkJfSk7CisJfQorCisJdGhpcy51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9saXN0ZW5lck9iamVjdCwgLypGdW5jdGlvbiBvciBTdHJpbmcqL2xpc3RlbmVyTWV0aG9kKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXVzZSBkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoKSB0byBhdHRhY2ggdGhlIHBhc3NlZCBsaXN0ZW5lciB0byB0aGUKKwkJLy8JCXRvcGljIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0CisJCS8vIGxpc3RlbmVyT2JqZWN0OgorCQkvLwkJaWYgYSBzdHJpbmcgYW5kIGxpc3RlbmVyTWV0aG9kIGlzIG9tbWl0dGVkLCB0aGlzIGlzIHRyZWF0ZWQgYXMKKwkJLy8JCXRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIElmCisJCS8vCQlsaXN0ZW5lck1ldGhvZCBpcyBwcm92aWRlZCwgdGhpcyBpcyB0aGUgc2NvcGUgdG8gZmluZCB0aGUKKwkJLy8JCWZ1bmN0aW9uIGluLgorCQkvLyBsaXN0ZW5lck1ldGhvZDoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gdG8gdW5yZWdpc3Rlci4KKwkJdmFyIHRmID0gKCFsaXN0ZW5lck1ldGhvZCkgPyBsaXN0ZW5lck9iamVjdCA6IGxpc3RlbmVyTWV0aG9kOworCQl2YXIgdG8gPSAoIWxpc3RlbmVyTWV0aG9kKSA/IG51bGwgOiBsaXN0ZW5lck9iamVjdDsKKwkJcmV0dXJuIGRvam8uZXZlbnQua3dEaXNjb25uZWN0KHsgLy8gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQKKwkJCXNyY09iajoJCXRoaXMsIAorCQkJc3JjRnVuYzoJInNlbmRNZXNzYWdlIiwgCisJCQlhZHZpY2VPYmo6CXRvLAorCQkJYWR2aWNlRnVuYzogdGYKKwkJfSk7CisJfQorCisJdGhpcy5fZ2V0Sm9pblBvaW50ID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZCh0aGlzLCAic2VuZE1lc3NhZ2UiKTsKKwl9CisKKwl0aGlzLnNldFNxdWVsY2ggPSBmdW5jdGlvbigvKkJvb2xlYW4qL3Nob3VsZFNxdWVsY2gpeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCWRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBleGNlcHRpb25zIGluIHRoZSBjYWxsaW5nIG9mIGEKKwkJLy8JCWxpc3RlbmVyIGluIHRoZSBjaGFpbiBzaG91bGQgc3RvcCBleGVjdXRpb24gb2YgdGhlIGNoYWluLgorCQl0aGlzLl9nZXRKb2luUG9pbnQoKS5zcXVlbGNoID0gc2hvdWxkU3F1ZWxjaDsKKwl9CisKKwl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBkaXNjb25uZWN0cyBhbGwgbGlzdGVuZXJzIGZyb20gdGhpcyB0b3BpYworCQl0aGlzLl9nZXRKb2luUG9pbnQoKS5kaXNjb25uZWN0KCk7CisJfQorCisJdGhpcy5yZWdpc3RlclB1Ymxpc2hlciA9IGZ1bmN0aW9uKAkvKk9iamVjdCovcHVibGlzaGVyT2JqZWN0LCAKKwkJCQkJCQkJCQkvKkZ1bmN0aW9uIG9yIFN0cmluZyovcHVibGlzaGVyTWV0aG9kKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJlZ2lzdGVycyB0aGUgcGFzc2VkIGZ1bmN0aW9uIGFzIGEgcHVibGlzaGVyIG9uIHRoaXMgdG9waWMuCisJCS8vCQlFYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW4gZXZlbnQgd2lsbCBiZSBwdWJsaXNoZWQgb24KKwkJLy8JCXRoaXMgdG9waWMuCisJCS8vIHB1Ymxpc2hlck9iamVjdDoKKwkJLy8JCWlmIGEgc3RyaW5nIGFuZCBsaXN0ZW5lck1ldGhvZCBpcyBvbW1pdHRlZCwgdGhpcyBpcyB0cmVhdGVkIGFzCisJCS8vCQl0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJZgorCQkvLwkJbGlzdGVuZXJNZXRob2QgaXMgcHJvdmlkZWQsIHRoaXMgaXMgdGhlIHNjb3BlIHRvIGZpbmQgdGhlCisJCS8vCQlmdW5jdGlvbiBpbi4KKwkJLy8gcHVibGlzaGVyTWV0aG9kOgorCQkvLwkJT3B0aW9uYWwuIFRoZSBmdW5jdGlvbiB0byByZWdpc3Rlci4KKwkJZG9qby5ldmVudC5jb25uZWN0KHB1Ymxpc2hlck9iamVjdCwgcHVibGlzaGVyTWV0aG9kLCB0aGlzLCAic2VuZE1lc3NhZ2UiKTsKKwl9CisKKwl0aGlzLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSl7CisJCS8vIHN1bW1hcnk6IGEgc3R1YiB0byBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgdG9waWMuCisKKwkJLy8gVGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvcGFnYXRlZAorCX0KK30KKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuYnJvd3NlciIpOworCisKKy8vIEZJWE1FOiBhbnkgcGFydGljdWxhciByZWFzb24gdGhpcyBpcyBpbiB0aGUgZ2xvYmFsIHNjb3BlPworZG9qby5faWVfY2xvYmJlciA9IG5ldyBmdW5jdGlvbigpeworCXRoaXMuY2xvYmJlck5vZGVzID0gW107CisKKwlmdW5jdGlvbiBudWtlUHJvcChub2RlLCBwcm9wKXsKKwkJLy8gdHJ5eyBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsgCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCXRyeXsgbm9kZVtwcm9wXSA9IG51bGw7IAkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCXRyeXsgZGVsZXRlIG5vZGVbcHJvcF07IAkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCS8vIEZJWE1FOiBKb3RMaXZlIG5lZWRzIHRoaXMsIGJ1dCBJJ20gbm90IHN1cmUgaWYgaXQncyB0b28gc2xvdyBvciBub3QKKwkJdHJ5eyBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsJfWNhdGNoKGUpeyAvKiBzcXVlbGNoICovIH0KKwl9CisKKwl0aGlzLmNsb2JiZXIgPSBmdW5jdGlvbihub2RlUmVmKXsKKwkJdmFyIG5hOworCQl2YXIgdG5hOworCQlpZihub2RlUmVmKXsKKwkJCXRuYSA9IG5vZGVSZWYuYWxsIHx8IG5vZGVSZWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJCW5hID0gW25vZGVSZWZdOworCQkJZm9yKHZhciB4PTA7IHg8dG5hLmxlbmd0aDsgeCsrKXsKKwkJCQkvLyBpZiB3ZSdyZSBnb25uYSBiZSBjbG9iYmVyaW5nIHRoZSB0aGluZywgYXQgbGVhc3QgbWFrZSBzdXJlCisJCQkJLy8gd2UgYXJlbid0IHRyeWluZyB0byBkbyBpdCB0d2ljZQorCQkJCWlmKHRuYVt4XVsiX19kb0Nsb2JiZXJfXyJdKXsKKwkJCQkJbmEucHVzaCh0bmFbeF0pOworCQkJCX0KKwkJCX0KKwkJfWVsc2V7CisJCQl0cnl7IHdpbmRvdy5vbmxvYWQgPSBudWxsOyB9Y2F0Y2goZSl7fQorCQkJbmEgPSAodGhpcy5jbG9iYmVyTm9kZXMubGVuZ3RoKSA/IHRoaXMuY2xvYmJlck5vZGVzIDogZG9jdW1lbnQuYWxsOworCQl9CisJCXRuYSA9IG51bGw7CisJCXZhciBiYXNpcyA9IHt9OworCQlmb3IodmFyIGkgPSBuYS5sZW5ndGgtMTsgaT49MDsgaT1pLTEpeworCQkJdmFyIGVsID0gbmFbaV07CisJCQl0cnl7CisJCQkJaWYoZWwgJiYgZWxbIl9fY2xvYmJlckF0dHJzX18iXSl7CisJCQkJCWZvcih2YXIgaj0wOyBqPGVsLl9fY2xvYmJlckF0dHJzX18ubGVuZ3RoOyBqKyspeworCQkJCQkJbnVrZVByb3AoZWwsIGVsLl9fY2xvYmJlckF0dHJzX19bal0pOworCQkJCQl9CisJCQkJCW51a2VQcm9wKGVsLCAiX19jbG9iYmVyQXR0cnNfXyIpOworCQkJCQludWtlUHJvcChlbCwgIl9fZG9DbG9iYmVyX18iKTsKKwkJCQl9CisJCQl9Y2F0Y2goZSl7IC8qIHNxdWVsY2ghICovfTsKKwkJfQorCQluYSA9IG51bGw7CisJfQorfQorCitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwlkb2pvLmFkZE9uVW5sb2FkKGZ1bmN0aW9uKCl7CisJCWRvam8uX2llX2Nsb2JiZXIuY2xvYmJlcigpOworCQl0cnl7CisJCQlpZigoZG9qb1sid2lkZ2V0Il0pJiYoZG9qby53aWRnZXRbIm1hbmFnZXIiXSkpeworCQkJCWRvam8ud2lkZ2V0Lm1hbmFnZXIuZGVzdHJveUFsbCgpOworCQkJfQorCQl9Y2F0Y2goZSl7fQorCisJCS8vIFdvcmthcm91bmQgZm9yIElFIGxlYWsgcmVjb21tZW5kZWQgaW4gdGlja2V0ICMxNzI3IGJ5IHNjaGFsbG0KKwkJaWYoZG9qby53aWRnZXQpeworCQkJZm9yKHZhciBuYW1lIGluIGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlKXsKKwkJCQlpZihkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVtuYW1lXS5ub2RlKXsKKwkJCQkJZG9qby5kb20uZGVzdHJveU5vZGUoZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZSk7CisJCQkJCWRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGUgPSBudWxsOworCQkJCQlkZWxldGUgZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl0cnl7IHdpbmRvdy5vbmxvYWQgPSBudWxsOyB9Y2F0Y2goZSl7fQorCQl0cnl7IHdpbmRvdy5vbnVubG9hZCA9IG51bGw7IH1jYXRjaChlKXt9CisJCWRvam8uX2llX2Nsb2JiZXIuY2xvYmJlck5vZGVzID0gW107CisJCS8vIENvbGxlY3RHYXJiYWdlKCk7CisJfSk7Cit9CisKK2Rvam8uZXZlbnQuYnJvd3NlciA9IG5ldyBmdW5jdGlvbigpeworCisJdmFyIGNsb2JiZXJJZHggPSAwOworCisJdGhpcy5ub3JtYWxpemVkRXZlbnROYW1lID0gZnVuY3Rpb24oLypTdHJpbmcqL2V2ZW50TmFtZSl7CisJCXN3aXRjaChldmVudE5hbWUpeworCQkJY2FzZSAiQ2hlY2tib3hTdGF0ZUNoYW5nZSI6CisJCQljYXNlICJET01BdHRyTW9kaWZpZWQiOgorCQkJY2FzZSAiRE9NTWVudUl0ZW1BY3RpdmUiOgorCQkJY2FzZSAiRE9NTWVudUl0ZW1JbmFjdGl2ZSI6CisJCQljYXNlICJET01Nb3VzZVNjcm9sbCI6CisJCQljYXNlICJET01Ob2RlSW5zZXJ0ZWQiOgorCQkJY2FzZSAiRE9NTm9kZVJlbW92ZWQiOgorCQkJY2FzZSAiUmFkaW9TdGF0ZUNoYW5nZSI6CisJCQkJcmV0dXJuIGV2ZW50TmFtZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFyIGxjbiA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpOworCQkJCXJldHVybiAobGNuLmluZGV4T2YoIm9uIikgPT0gMCkgPyBsY24uc3Vic3RyKDIpIDogbGNuOworCQkJCWJyZWFrOworCQl9CisJfQorCQorCXRoaXMuY2xlYW4gPSBmdW5jdGlvbigvKkRPTU5vZGUqL25vZGUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVtb3ZlcyBuYXRpdmUgZXZlbnQgaGFuZGxlcnMgc28gdGhhdCBkZXN0cnVjdGlvbiBvZiB0aGUgbm9kZQorCQkvLwkJd2lsbCBub3QgbGVhayBtZW1vcnkuIE9uIG1vc3QgYnJvd3NlcnMgdGhpcyBpcyBhIG5vLW9wLCBidXQKKwkJLy8JCWl0J3MgY3JpdGljYWwgZm9yIG1hbnVhbCBub2RlIHJlbW92YWwgb24gSUUuCisJCS8vIG5vZGU6CisJCS8vCQlBIERPTSBub2RlLiBBbGwgb2YgaXQncyBjaGlsZHJlbiB3aWxsIGFsc28gYmUgY2xlYW5lZC4KKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7IAorCQkJZG9qby5faWVfY2xvYmJlci5jbG9iYmVyKG5vZGUpOworCQl9CisJfQorCisJdGhpcy5hZGRDbG9iYmVyTm9kZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZWdpc3RlciB0aGUgcGFzc2VkIG5vZGUgdG8gc3VwcG9ydCBldmVudCBzdHJpcHBpbmcKKwkJLy8gbm9kZToKKwkJLy8JCUEgRE9NIG5vZGUKKwkJaWYoIWRvam8ucmVuZGVyLmh0bWwuaWUpeyByZXR1cm47IH0KKwkJaWYoIW5vZGVbIl9fZG9DbG9iYmVyX18iXSl7CisJCQlub2RlLl9fZG9DbG9iYmVyX18gPSB0cnVlOworCQkJZG9qby5faWVfY2xvYmJlci5jbG9iYmVyTm9kZXMucHVzaChub2RlKTsKKwkJCS8vIHRoaXMgbWlnaHQgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB0aGluZyB0byBkbywgYnV0IGl0J3MKKwkJCS8vIG11Y2ggbGVzcyBlcnJvciBwcm9uZSB0aGFuIG90aGVyIGFwcHJvYWNoZXMgd2hpY2ggd2VyZQorCQkJLy8gcHJldmlvdXNseSB0cmllZCBhbmQgZmFpbGVkCisJCQlub2RlLl9fY2xvYmJlckF0dHJzX18gPSBbXTsKKwkJfQorCX0KKworCXRoaXMuYWRkQ2xvYmJlck5vZGVBdHRycyA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSwgLypBcnJheSovcHJvcHMpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVnaXN0ZXIgdGhlIHBhc3NlZCBub2RlIHRvIHN1cHBvcnQgZXZlbnQgc3RyaXBwaW5nCisJCS8vIG5vZGU6CisJCS8vCQlBIERPTSBub2RlIHRvIHN0aXAgcHJvcGVydGllcyBmcm9tIGxhdGVyCisJCS8vIHByb3BzOgorCQkvLwkJQSBsaXN0IG9mIHByb3BldGllcyB0byBzdHJpcCBmcm9tIHRoZSBub2RlCisJCWlmKCFkb2pvLnJlbmRlci5odG1sLmllKXsgcmV0dXJuOyB9CisJCXRoaXMuYWRkQ2xvYmJlck5vZGUobm9kZSk7CisJCWZvcih2YXIgeD0wOyB4PHByb3BzLmxlbmd0aDsgeCsrKXsKKwkJCW5vZGUuX19jbG9iYmVyQXR0cnNfXy5wdXNoKHByb3BzW3hdKTsKKwkJfQorCX0KKworCXRoaXMucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbigJLypET01Ob2RlKi8gbm9kZSwgCisJCQkJCQkJCQkvKlN0cmluZyovCWV2dE5hbWUsIAorCQkJCQkJCQkJLypGdW5jdGlvbiovZnAsIAorCQkJCQkJCQkJLypCb29sZWFuKi8JY2FwdHVyZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQljbG9iYmVycyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgbm9kZQorCQkvLyBldnROYW1lOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgdG8gcmVtb3ZlIHRoZSBmdW5jdGlvbiBmcm9tCisJCS8vIG5vZGU6CisJCS8vCQlET00gbm9kZSB0byBhdHRhY2ggdGhlIGV2ZW50IHRvCisJCS8vIGZwOgorCQkvLwkJdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyCisJCS8vIGNhcHR1cmU6CisJCS8vCQlPcHRpb25hbC4gc2hvdWxkIHRoaXMgbGlzdGVuZXIgcHJldmVudCBwcm9waWdhdGlvbj8KKwkJaWYoIWNhcHR1cmUpeyB2YXIgY2FwdHVyZSA9IGZhbHNlOyB9CisJCWV2dE5hbWUgPSBkb2pvLmV2ZW50LmJyb3dzZXIubm9ybWFsaXplZEV2ZW50TmFtZShldnROYW1lKTsKKwkJaWYoZXZ0TmFtZSA9PSAia2V5Iil7CisJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQl0aGlzLnJlbW92ZUxpc3RlbmVyKG5vZGUsICJvbmtleWRvd24iLCBmcCwgY2FwdHVyZSk7CisJCQl9CisJCQlldnROYW1lID0gImtleXByZXNzIjsKKwkJfQorCQkvLyBGSVhNRTogdGhpcyBpcyBtb3N0bHkgYSBwdW50LCB3ZSBhcmVuJ3QgYWN0dWFsbHkgZG9pbmcgYW55dGhpbmcgb24gSUUKKwkJaWYobm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKXsKKwkJCW5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnROYW1lLCBmcCwgY2FwdHVyZSk7CisJCX0KKwl9CisKKwl0aGlzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24oLypET01Ob2RlKi9ub2RlLCAvKlN0cmluZyovZXZ0TmFtZSwgLypGdW5jdGlvbiovZnAsIC8qQm9vbGVhbiovY2FwdHVyZSwgLypCb29sZWFuKi9kb250Rml4KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWFkZHMgYSBsaXN0ZW5lciB0byB0aGUgbm9kZQorCQkvLyBldnROYW1lOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byBjYW4gYmUgZWl0aGVyIG9mCisJCS8vCQl0aGUgZm9ybSAib25jbGljayIgb3IgImNsaWNrIgorCQkvLyBub2RlOgorCQkvLwkJRE9NIG5vZGUgdG8gYXR0YWNoIHRoZSBldmVudCB0bworCQkvLyBmcDoKKwkJLy8JCXRoZSBmdW5jdGlvbiB0byByZWdpc3RlcgorCQkvLyBjYXB0dXJlOgorCQkvLwkJT3B0aW9uYWwuIFNob3VsZCB0aGlzIGxpc3RlbmVyIHByZXZlbnQgcHJvcGlnYXRpb24/CisJCS8vIGRvbnRGaXg6CisJCS8vCQlPcHRpb25hbC4gU2hvdWxkIHdlIGF2b2lkIHJlZ2lzdGVyaW5nIGEgbmV3IGNsb3N1cmUgYXJvdW5kIHRoZQorCQkvLwkJbGlzdGVuZXIgdG8gZW5hYmxlIGZpeEV2ZW50IGZvciBkaXNwYXRjaCBvZiB0aGUgcmVnaXN0ZXJlZAorCQkvLwkJZnVuY3Rpb24/CisJCWlmKCFub2RlKXsgcmV0dXJuOyB9IC8vIEZJWE1FOiBsb2cgYW5kL29yIGJhaWw/CisJCWlmKCFjYXB0dXJlKXsgdmFyIGNhcHR1cmUgPSBmYWxzZTsgfQorCQlldnROYW1lID0gZG9qby5ldmVudC5icm93c2VyLm5vcm1hbGl6ZWRFdmVudE5hbWUoZXZ0TmFtZSk7CisJCWlmKGV2dE5hbWUgPT0gImtleSIpeworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJdGhpcy5hZGRMaXN0ZW5lcihub2RlLCAib25rZXlkb3duIiwgZnAsIGNhcHR1cmUsIGRvbnRGaXgpOworCQkJfQorCQkJZXZ0TmFtZSA9ICJrZXlwcmVzcyI7CisJCX0KKworCQlpZighZG9udEZpeCl7CisJCQkvLyBidWlsZCB5ZXQgYW5vdGhlciBjbG9zdXJlIGFyb3VuZCBmcCBpbiBvcmRlciB0byBpbmplY3QgZml4RXZlbnQKKwkJCS8vIGFyb3VuZCB0aGUgcmVzdWx0aW5nIGV2ZW50CisJCQl2YXIgbmV3ZnAgPSBmdW5jdGlvbihldnQpeworCQkJCWlmKCFldnQpeyBldnQgPSB3aW5kb3cuZXZlbnQ7IH0KKwkJCQl2YXIgcmV0ID0gZnAoZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCwgdGhpcykpOworCQkJCWlmKGNhcHR1cmUpeworCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQkJfQorCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX1lbHNleworCQkJbmV3ZnAgPSBmcDsKKwkJfQorCisJCWlmKG5vZGUuYWRkRXZlbnRMaXN0ZW5lcil7IAorCQkJbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dE5hbWUsIG5ld2ZwLCBjYXB0dXJlKTsKKwkJCXJldHVybiBuZXdmcDsKKwkJfWVsc2V7CisJCQlldnROYW1lID0gIm9uIitldnROYW1lOworCQkJaWYodHlwZW9mIG5vZGVbZXZ0TmFtZV0gPT0gImZ1bmN0aW9uIiApeworCQkJCXZhciBvbGRFdnQgPSBub2RlW2V2dE5hbWVdOworCQkJCW5vZGVbZXZ0TmFtZV0gPSBmdW5jdGlvbihlKXsKKwkJCQkJb2xkRXZ0KGUpOworCQkJCQlyZXR1cm4gbmV3ZnAoZSk7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJbm9kZVtldnROYW1lXT1uZXdmcDsKKwkJCX0KKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCXRoaXMuYWRkQ2xvYmJlck5vZGVBdHRycyhub2RlLCBbZXZ0TmFtZV0pOworCQkJfQorCQkJcmV0dXJuIG5ld2ZwOworCQl9CisJfQorCisJdGhpcy5pc0V2ZW50ID0gZnVuY3Rpb24oLypPYmplY3QqL29iail7CisJCS8vIHN1bW1hcnk6IAorCQkvLwkJVHJpZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gZXZlbnQuCisKKwkJLy8gRklYTUU6IGV2ZW50IGRldGVjdGlvbiBoYWNrIC4uLiBjb3VsZCB0ZXN0IGZvciBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMKKwkJLy8gaWYgbmVjZXNzYXJ5CisJCXJldHVybiAodHlwZW9mIG9iaiAhPSAidW5kZWZpbmVkIikmJihvYmopJiYodHlwZW9mIEV2ZW50ICE9ICJ1bmRlZmluZWQiKSYmKG9iai5ldmVudFBoYXNlKTsgLy8gQm9vbGVhbgorCQkvLyBFdmVudCBkb2VzIG5vdCBzdXBwb3J0IGluc3RhbmNlb2YgaW4gT3BlcmEsIG90aGVyd2lzZToKKwkJLy9yZXR1cm4gKHR5cGVvZiBFdmVudCAhPSAidW5kZWZpbmVkIikmJihvYmogaW5zdGFuY2VvZiBFdmVudCk7CisJfQorCisJdGhpcy5jdXJyZW50RXZlbnQgPSBudWxsOworCQorCXRoaXMuY2FsbExpc3RlbmVyID0gZnVuY3Rpb24oLypGdW5jdGlvbiovbGlzdGVuZXIsIC8qRE9NTm9kZSovY3VyVGFyZ2V0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWNhbGxzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBub2RlCisJCS8vCQl3aXRoIHRoZSBjdXJyZW50IERPTSBldmVudCBvYmplY3QgYXMgdGhlIG9ubHkgcGFyYW1ldGVyCisJCS8vIGxpc3RlbmVyOgorCQkvLwkJdGhlIGZ1bmN0aW9uIHRvIGNhbGwKKwkJLy8gY3VyVGFyZ2V0OgorCQkvLwkJdGhlIE5vZGUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaW4gdGhlIHNjb3BlIG9mCisJCWlmKHR5cGVvZiBsaXN0ZW5lciAhPSAnZnVuY3Rpb24nKXsKKwkJCWRvam8ucmFpc2UoImxpc3RlbmVyIG5vdCBhIGZ1bmN0aW9uOiAiICsgbGlzdGVuZXIpOworCQl9CisJCWRvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQuY3VycmVudFRhcmdldCA9IGN1clRhcmdldDsKKwkJcmV0dXJuIGxpc3RlbmVyLmNhbGwoY3VyVGFyZ2V0LCBkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50KTsKKwl9CisKKwl0aGlzLl9zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpeworCQlkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7IAorCX0KKworCXRoaXMuX3ByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKXsKKwkJZG9qby5ldmVudC5icm93c2VyLmN1cnJlbnRFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCX0KKworCXRoaXMua2V5cyA9IHsKKwkJS0VZX0JBQ0tTUEFDRTogOCwKKwkJS0VZX1RBQjogOSwKKwkJS0VZX0NMRUFSOiAxMiwKKwkJS0VZX0VOVEVSOiAxMywKKwkJS0VZX1NISUZUOiAxNiwKKwkJS0VZX0NUUkw6IDE3LAorCQlLRVlfQUxUOiAxOCwKKwkJS0VZX1BBVVNFOiAxOSwKKwkJS0VZX0NBUFNfTE9DSzogMjAsCisJCUtFWV9FU0NBUEU6IDI3LAorCQlLRVlfU1BBQ0U6IDMyLAorCQlLRVlfUEFHRV9VUDogMzMsCisJCUtFWV9QQUdFX0RPV046IDM0LAorCQlLRVlfRU5EOiAzNSwKKwkJS0VZX0hPTUU6IDM2LAorCQlLRVlfTEVGVF9BUlJPVzogMzcsCisJCUtFWV9VUF9BUlJPVzogMzgsCisJCUtFWV9SSUdIVF9BUlJPVzogMzksCisJCUtFWV9ET1dOX0FSUk9XOiA0MCwKKwkJS0VZX0lOU0VSVDogNDUsCisJCUtFWV9ERUxFVEU6IDQ2LAorCQlLRVlfSEVMUDogNDcsCisJCUtFWV9MRUZUX1dJTkRPVzogOTEsCisJCUtFWV9SSUdIVF9XSU5ET1c6IDkyLAorCQlLRVlfU0VMRUNUOiA5MywKKwkJS0VZX05VTVBBRF8wOiA5NiwKKwkJS0VZX05VTVBBRF8xOiA5NywKKwkJS0VZX05VTVBBRF8yOiA5OCwKKwkJS0VZX05VTVBBRF8zOiA5OSwKKwkJS0VZX05VTVBBRF80OiAxMDAsCisJCUtFWV9OVU1QQURfNTogMTAxLAorCQlLRVlfTlVNUEFEXzY6IDEwMiwKKwkJS0VZX05VTVBBRF83OiAxMDMsCisJCUtFWV9OVU1QQURfODogMTA0LAorCQlLRVlfTlVNUEFEXzk6IDEwNSwKKwkJS0VZX05VTVBBRF9NVUxUSVBMWTogMTA2LAorCQlLRVlfTlVNUEFEX1BMVVM6IDEwNywKKwkJS0VZX05VTVBBRF9FTlRFUjogMTA4LAorCQlLRVlfTlVNUEFEX01JTlVTOiAxMDksCisJCUtFWV9OVU1QQURfUEVSSU9EOiAxMTAsCisJCUtFWV9OVU1QQURfRElWSURFOiAxMTEsCisJCUtFWV9GMTogMTEyLAorCQlLRVlfRjI6IDExMywKKwkJS0VZX0YzOiAxMTQsCisJCUtFWV9GNDogMTE1LAorCQlLRVlfRjU6IDExNiwKKwkJS0VZX0Y2OiAxMTcsCisJCUtFWV9GNzogMTE4LAorCQlLRVlfRjg6IDExOSwKKwkJS0VZX0Y5OiAxMjAsCisJCUtFWV9GMTA6IDEyMSwKKwkJS0VZX0YxMTogMTIyLAorCQlLRVlfRjEyOiAxMjMsCisJCUtFWV9GMTM6IDEyNCwKKwkJS0VZX0YxNDogMTI1LAorCQlLRVlfRjE1OiAxMjYsCisJCUtFWV9OVU1fTE9DSzogMTQ0LAorCQlLRVlfU0NST0xMX0xPQ0s6IDE0NQorCX07CisKKwkvLyByZXZlcnNlIGxvb2t1cAorCXRoaXMucmV2S2V5cyA9IFtdOworCWZvcih2YXIga2V5IGluIHRoaXMua2V5cyl7CisJCXRoaXMucmV2S2V5c1t0aGlzLmtleXNba2V5XV0gPSBrZXk7CisJfQorCisJdGhpcy5maXhFdmVudCA9IGZ1bmN0aW9uKC8qRXZlbnQqL2V2dCwgLypET01Ob2RlKi9zZW5kZXIpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJbm9ybWFsaXplcyBwcm9wZXJ0aWVzIG9uIHRoZSBldmVudCBvYmplY3QgaW5jbHVkaW5nIGV2ZW50CisJCS8vCQlidWJibGluZyBtZXRob2RzLCBrZXlzdHJva2Ugbm9ybWFsaXphdGlvbiwgYW5kIHgveSBwb3NpdGlvbnMKKwkJLy8gZXZ0OiB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAorCQkvLyBzZW5kZXI6IHRoZSBub2RlIHRvIHRyZWF0IGFzICJjdXJyZW50VGFyZ2V0IgorCQlpZighZXZ0KXsKKwkJCWlmKHdpbmRvd1siZXZlbnQiXSl7CisJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJfQorCQl9CisJCQorCQlpZigoZXZ0WyJ0eXBlIl0pJiYoZXZ0WyJ0eXBlIl0uaW5kZXhPZigia2V5IikgPT0gMCkpeyAvLyBrZXkgZXZlbnRzCisJCQlldnQua2V5cyA9IHRoaXMucmV2S2V5czsKKwkJCS8vIEZJWE1FOiBob3cgY2FuIHdlIGVsaW1pbmF0ZSB0aGlzIGl0ZXJhdGlvbj8KKwkJCWZvcih2YXIga2V5IGluIHRoaXMua2V5cyl7CisJCQkJZXZ0W2tleV0gPSB0aGlzLmtleXNba2V5XTsKKwkJCX0KKwkJCWlmKGV2dFsidHlwZSJdID09ICJrZXlkb3duIiAmJiBkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQlzd2l0Y2goZXZ0LmtleUNvZGUpeworCQkJCQljYXNlIGV2dC5LRVlfU0hJRlQ6CisJCQkJCWNhc2UgZXZ0LktFWV9DVFJMOgorCQkJCQljYXNlIGV2dC5LRVlfQUxUOgorCQkJCQljYXNlIGV2dC5LRVlfQ0FQU19MT0NLOgorCQkJCQljYXNlIGV2dC5LRVlfTEVGVF9XSU5ET1c6CisJCQkJCWNhc2UgZXZ0LktFWV9SSUdIVF9XSU5ET1c6CisJCQkJCWNhc2UgZXZ0LktFWV9TRUxFQ1Q6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1fTE9DSzoKKwkJCQkJY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorCQkJCQkvLyBJJ2xsIGdldCB0aGVzZSBpbiBrZXlwcmVzcyBhZnRlciB0aGUgT1MgbXVuZ2VzIHRoZW0gYmFzZWQgb24gbnVtbG9jaworCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzA6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfMToKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF8yOgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzM6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfNDoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF81OgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzY6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfNzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF84OgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzk6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfUEVSSU9EOgorCQkJCQkJYnJlYWs7IC8vIGp1c3QgaWdub3JlIHRoZSBrZXlzIHRoYXQgY2FuIG1vcnBoCisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfTVVMVElQTFk6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfUExVUzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9FTlRFUjoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9NSU5VUzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9ESVZJREU6CisJCQkJCQlicmVhazsgLy8gSSBjb3VsZCBoYW5kbGUgdGhlc2UgYnV0IGp1c3QgcGljayB0aGVtIHVwIGluIGtleXByZXNzCisJCQkJCWNhc2UgZXZ0LktFWV9QQVVTRToKKwkJCQkJY2FzZSBldnQuS0VZX1RBQjoKKwkJCQkJY2FzZSBldnQuS0VZX0JBQ0tTUEFDRToKKwkJCQkJY2FzZSBldnQuS0VZX0VOVEVSOgorCQkJCQljYXNlIGV2dC5LRVlfRVNDQVBFOgorCQkJCQljYXNlIGV2dC5LRVlfUEFHRV9VUDoKKwkJCQkJY2FzZSBldnQuS0VZX1BBR0VfRE9XTjoKKwkJCQkJY2FzZSBldnQuS0VZX0VORDoKKwkJCQkJY2FzZSBldnQuS0VZX0hPTUU6CisJCQkJCWNhc2UgZXZ0LktFWV9MRUZUX0FSUk9XOgorCQkJCQljYXNlIGV2dC5LRVlfVVBfQVJST1c6CisJCQkJCWNhc2UgZXZ0LktFWV9SSUdIVF9BUlJPVzoKKwkJCQkJY2FzZSBldnQuS0VZX0RPV05fQVJST1c6CisJCQkJCWNhc2UgZXZ0LktFWV9JTlNFUlQ6CisJCQkJCWNhc2UgZXZ0LktFWV9ERUxFVEU6CisJCQkJCWNhc2UgZXZ0LktFWV9GMToKKwkJCQkJY2FzZSBldnQuS0VZX0YyOgorCQkJCQljYXNlIGV2dC5LRVlfRjM6CisJCQkJCWNhc2UgZXZ0LktFWV9GNDoKKwkJCQkJY2FzZSBldnQuS0VZX0Y1OgorCQkJCQljYXNlIGV2dC5LRVlfRjY6CisJCQkJCWNhc2UgZXZ0LktFWV9GNzoKKwkJCQkJY2FzZSBldnQuS0VZX0Y4OgorCQkJCQljYXNlIGV2dC5LRVlfRjk6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTA6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTE6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTI6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTI6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTM6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTQ6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTU6CisJCQkJCWNhc2UgZXZ0LktFWV9DTEVBUjoKKwkJCQkJY2FzZSBldnQuS0VZX0hFTFA6CisJCQkJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmKGV2dC5jdHJsS2V5IHx8IGV2dC5hbHRLZXkpeworCQkJCQkJCXZhciB1bmlmaWVkQ2hhckNvZGUgPSBldnQua2V5Q29kZTsKKwkJCQkJCQkvLyBpZiBsb3dlciBjYXNlIGJ1dCBrZXljb2RlIGlzIHVwcGVyY2FzZSwgY29udmVydCBpdAorCQkJCQkJCWlmKHVuaWZpZWRDaGFyQ29kZSA+PSA2NSAmJiB1bmlmaWVkQ2hhckNvZGUgPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKXsKKwkJCQkJCQkJdW5pZmllZENoYXJDb2RlICs9IDMyOworCQkJCQkJCX0KKwkJCQkJCQlpZih1bmlmaWVkQ2hhckNvZGUgPj0gMSAmJiB1bmlmaWVkQ2hhckNvZGUgPD0gMjYgJiYgZXZ0LmN0cmxLZXkpeworCQkJCQkJCQl1bmlmaWVkQ2hhckNvZGUgKz0gOTY7IC8vIDAwMS0wMzIgPSBjdHJsK1thLXpdCisJCQkJCQkJfQorCQkJCQkJCWV2dC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWZpZWRDaGFyQ29kZSk7CisJCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmKGV2dFsidHlwZSJdID09ICJrZXlwcmVzcyIpeworCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworCQkJCQlpZihldnQud2hpY2ggPT0gMCl7CisJCQkJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQkJCX1lbHNlIGlmKGV2dC53aGljaCA+IDApeworCQkJCQkJc3dpdGNoKGV2dC53aGljaCl7CisJCQkJCQkJY2FzZSBldnQuS0VZX1NISUZUOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9DVFJMOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9BTFQ6CisJCQkJCQkJY2FzZSBldnQuS0VZX0NBUFNfTE9DSzoKKwkJCQkJCQljYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CisJCQkJCQkJY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIGV2dC5LRVlfUEFVU0U6CisJCQkJCQkJY2FzZSBldnQuS0VZX1RBQjoKKwkJCQkJCQljYXNlIGV2dC5LRVlfQkFDS1NQQUNFOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9FTlRFUjoKKwkJCQkJCQljYXNlIGV2dC5LRVlfRVNDQVBFOgorCQkJCQkJCQlldnQua2V5ID0gZXZ0LndoaWNoOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQl2YXIgdW5pZmllZENoYXJDb2RlID0gZXZ0LndoaWNoOworCQkJCQkJCQlpZigoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSB8fCBldnQubWV0YUtleSkgJiYgKGV2dC53aGljaCA+PSA2NSAmJiBldnQud2hpY2ggPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKSl7CisJCQkJCQkJCQl1bmlmaWVkQ2hhckNvZGUgKz0gMzI7CisJCQkJCQkJCX0KKwkJCQkJCQkJZXZ0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pZmllZENoYXJDb2RlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX1lbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeyAvLyBjYXRjaCBzb21lIElFIGtleXMgdGhhdCBhcmUgaGFyZCB0byBnZXQgaW4ga2V5RG93bgorCQkJCQkvLyBrZXkgY29tYmluYXRpb25zIHdlcmUgaGFuZGxlZCBpbiBvbktleURvd24KKwkJCQkJaWYoIWV2dC5jdHJsS2V5ICYmICFldnQuYWx0S2V5ICYmIGV2dC5rZXlDb2RlID49IGV2dC5LRVlfU1BBQ0UpeworCQkJCQkJZXZ0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmtleUNvZGUpOworCQkJCQl9CisJCQkJfWVsc2UgaWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpeworCQkJCQlzd2l0Y2goZXZ0LmtleUNvZGUpeworCQkJCQkJY2FzZSAyNTogZXZ0LmtleSA9IGV2dC5LRVlfVEFCOyBldnQuc2hpZnQgPSB0cnVlO2JyZWFrOworCQkJCQkJY2FzZSA2MzIzMjogZXZ0LmtleSA9IGV2dC5LRVlfVVBfQVJST1c7IGJyZWFrOworCQkJCQkJY2FzZSA2MzIzMzogZXZ0LmtleSA9IGV2dC5LRVlfRE9XTl9BUlJPVzsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjM0OiBldnQua2V5ID0gZXZ0LktFWV9MRUZUX0FSUk9XOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzU6IGV2dC5rZXkgPSBldnQuS0VZX1JJR0hUX0FSUk9XOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzY6IGV2dC5rZXkgPSBldnQuS0VZX0YxOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzc6IGV2dC5rZXkgPSBldnQuS0VZX0YyOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzg6IGV2dC5rZXkgPSBldnQuS0VZX0YzOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzk6IGV2dC5rZXkgPSBldnQuS0VZX0Y0OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDA6IGV2dC5rZXkgPSBldnQuS0VZX0Y1OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDE6IGV2dC5rZXkgPSBldnQuS0VZX0Y2OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDI6IGV2dC5rZXkgPSBldnQuS0VZX0Y3OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDM6IGV2dC5rZXkgPSBldnQuS0VZX0Y4OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDQ6IGV2dC5rZXkgPSBldnQuS0VZX0Y5OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDU6IGV2dC5rZXkgPSBldnQuS0VZX0YxMDsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjQ2OiBldnQua2V5ID0gZXZ0LktFWV9GMTE7IGJyZWFrOworCQkJCQkJY2FzZSA2MzI0NzogZXZ0LmtleSA9IGV2dC5LRVlfRjEyOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNTA6IGV2dC5rZXkgPSBldnQuS0VZX1BBVVNFOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzI6IGV2dC5rZXkgPSBldnQuS0VZX0RFTEVURTsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjczOiBldnQua2V5ID0gZXZ0LktFWV9IT01FOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzU6IGV2dC5rZXkgPSBldnQuS0VZX0VORDsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjc2OiBldnQua2V5ID0gZXZ0LktFWV9QQUdFX1VQOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzc6IGV2dC5rZXkgPSBldnQuS0VZX1BBR0VfRE9XTjsgYnJlYWs7CisJCQkJCQljYXNlIDYzMzAyOiBldnQua2V5ID0gZXZ0LktFWV9JTlNFUlQ7IGJyZWFrOworCQkJCQkJY2FzZSA2MzI0ODovL3BydHNjcgorCQkJCQkJY2FzZSA2MzI0OTovL3Njcm9sbGxvY2sKKwkJCQkJCWNhc2UgNjMyODk6Ly9udW1sb2NrCisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAKKwkJCQkJCQlldnQua2V5ID0gZXZ0LmNoYXJDb2RlID49IGV2dC5LRVlfU1BBQ0UgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2dC5jaGFyQ29kZSkgOiBldnQua2V5Q29kZTsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQlldnQua2V5ID0gZXZ0LmNoYXJDb2RlID4gMCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmNoYXJDb2RlKSA6IGV2dC5rZXlDb2RlOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCWlmKCFldnQudGFyZ2V0KXsgZXZ0LnRhcmdldCA9IGV2dC5zcmNFbGVtZW50OyB9CisJCQlpZighZXZ0LmN1cnJlbnRUYXJnZXQpeyBldnQuY3VycmVudFRhcmdldCA9IChzZW5kZXIgPyBzZW5kZXIgOiBldnQuc3JjRWxlbWVudCk7IH0KKwkJCWlmKCFldnQubGF5ZXJYKXsgZXZ0LmxheWVyWCA9IGV2dC5vZmZzZXRYOyB9CisJCQlpZighZXZ0LmxheWVyWSl7IGV2dC5sYXllclkgPSBldnQub2Zmc2V0WTsgfQorCQkJLy8gRklYTUU6IHNjcm9sbCBwb3NpdGlvbiBxdWVyeSBpcyBkdXBlZCBmcm9tIGRvam8uaHRtbCB0byBhdm9pZCBkZXBlbmRlbmN5IG9uIHRoYXQgZW50aXJlIG1vZHVsZQorCQkJLy8gRE9OT1QgcmVwbGFjZSB0aGUgZm9sbG93aW5nIHRvIHVzZSBkb2pvLmJvZHkoKSwgaW4gSUUsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBzaG91bGQgYmUgdXNlZAorCQkJLy8gaGVyZSByYXRoZXIgdGhhbiBkb2N1bWVudC5ib2R5CisJCQl2YXIgZG9jID0gKGV2dC5zcmNFbGVtZW50ICYmIGV2dC5zcmNFbGVtZW50Lm93bmVyRG9jdW1lbnQpID8gZXZ0LnNyY0VsZW1lbnQub3duZXJEb2N1bWVudCA6IGRvY3VtZW50OworCQkJdmFyIGRvY0JvZHkgPSAoKGRvam8ucmVuZGVyLmh0bWwuaWU1NSl8fChkb2NbImNvbXBhdE1vZGUiXSA9PSAiQmFja0NvbXBhdCIpKSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudDsKKwkJCWlmKCFldnQucGFnZVgpeyBldnQucGFnZVggPSBldnQuY2xpZW50WCArIChkb2NCb2R5LnNjcm9sbExlZnQgfHwgMCkgfQorCQkJaWYoIWV2dC5wYWdlWSl7IGV2dC5wYWdlWSA9IGV2dC5jbGllbnRZICsgKGRvY0JvZHkuc2Nyb2xsVG9wIHx8IDApIH0KKwkJCS8vIG1vdXNlb3ZlcgorCQkJaWYoZXZ0LnR5cGUgPT0gIm1vdXNlb3ZlciIpeyBldnQucmVsYXRlZFRhcmdldCA9IGV2dC5mcm9tRWxlbWVudDsgfQorCQkJLy8gbW91c2VvdXQKKwkJCWlmKGV2dC50eXBlID09ICJtb3VzZW91dCIpeyBldnQucmVsYXRlZFRhcmdldCA9IGV2dC50b0VsZW1lbnQ7IH0KKwkJCXRoaXMuY3VycmVudEV2ZW50ID0gZXZ0OworCQkJZXZ0LmNhbGxMaXN0ZW5lciA9IHRoaXMuY2FsbExpc3RlbmVyOworCQkJZXZ0LnN0b3BQcm9wYWdhdGlvbiA9IHRoaXMuX3N0b3BQcm9wYWdhdGlvbjsKKwkJCWV2dC5wcmV2ZW50RGVmYXVsdCA9IHRoaXMuX3ByZXZlbnREZWZhdWx0OworCQl9CisJCXJldHVybiBldnQ7IC8vIEV2ZW50CisJfQorCisJdGhpcy5zdG9wRXZlbnQgPSBmdW5jdGlvbigvKkV2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcHJldmVudHMgcHJvcGlnYXRpb24gYW5kIGNsb2JiZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUKKwkJLy8JCXBhc3NlZCBldmVudAorCQkvLyBldnQ6IE9wdGlvbmFsIGZvciBJRS4gVGhlIG5hdGl2ZSBldmVudCBvYmplY3QuCisJCWlmKHdpbmRvdy5ldmVudCl7CisJCQlldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwkJCWV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQl9ZWxzZXsKKwkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOworCQkJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworCQl9CisJfQorfQorCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwljb21tb246IFsiZG9qby5ldmVudC5jb21tb24iLCAiZG9qby5ldmVudC50b3BpYyJdLAorCWJyb3dzZXI6IFsiZG9qby5ldmVudC5icm93c2VyIl0sCisJZGFzaGJvYXJkOiBbImRvam8uZXZlbnQuYnJvd3NlciJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC4qIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5nZnguY29sb3IiKTsKKworCisKKy8vIFRPRE86IHJld3JpdGUgdGhlICJ4MnkiIG1ldGhvZHMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHBhcnNpbmcKKy8vICAgICAgIGFiaWxpdGllcyBvZiB0aGUgQ29sb3Igb2JqZWN0LiBBbHNvLCBiZWVmIHVwIHRoZSBDb2xvcgorLy8gICAgICAgb2JqZWN0IChhcyBwb3NzaWJsZSkgdG8gcGFyc2UgbW9zdCBjb21tb24gZm9ybWF0cworCisvLyB0YWtlcyBhbiByLCBnLCBiLCBhKGxwaGEpIHZhbHVlLCBbciwgZywgYiwgYV0gYXJyYXksICJyZ2IoLi4uKSIgc3RyaW5nLCBoZXggc3RyaW5nICgjYWFhLCAjYWFhYWFhLCBhYWFhYWFhKQorZG9qby5nZnguY29sb3IuQ29sb3IgPSBmdW5jdGlvbihyLCBnLCBiLCBhKSB7CisJLy8gZG9qby5kZWJ1ZygicjoiLCByWzBdLCAiZzoiLCByWzFdLCAiYjoiLCByWzJdKTsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShyKSl7CisJCXRoaXMuciA9IHJbMF07CisJCXRoaXMuZyA9IHJbMV07CisJCXRoaXMuYiA9IHJbMl07CisJCXRoaXMuYSA9IHJbM118fDEuMDsKKwl9ZWxzZSBpZihkb2pvLmxhbmcuaXNTdHJpbmcocikpeworCQl2YXIgcmdiID0gZG9qby5nZnguY29sb3IuZXh0cmFjdFJHQihyKTsKKwkJdGhpcy5yID0gcmdiWzBdOworCQl0aGlzLmcgPSByZ2JbMV07CisJCXRoaXMuYiA9IHJnYlsyXTsKKwkJdGhpcy5hID0gZ3x8MS4wOworCX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcil7CisJCS8vIHdoeSBkb2VzIHRoaXMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGlmIHdlIHdlcmUgcGFzc2VkIG9uZT8KKwkJdGhpcy5yID0gci5yOworCQl0aGlzLmIgPSByLmI7CisJCXRoaXMuZyA9IHIuZzsKKwkJdGhpcy5hID0gci5hOworCX1lbHNleworCQl0aGlzLnIgPSByOworCQl0aGlzLmcgPSBnOworCQl0aGlzLmIgPSBiOworCQl0aGlzLmEgPSBhOworCX0KK30KKworZG9qby5nZnguY29sb3IuQ29sb3IuZnJvbUFycmF5ID0gZnVuY3Rpb24oYXJyKSB7CisJcmV0dXJuIG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10pOworfQorCitkb2pvLmV4dGVuZChkb2pvLmdmeC5jb2xvci5Db2xvciwgeworCXRvUmdiOiBmdW5jdGlvbihpbmNsdWRlQWxwaGEpIHsKKwkJaWYoaW5jbHVkZUFscGhhKSB7CisJCQlyZXR1cm4gdGhpcy50b1JnYmEoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYl07CisJCX0KKwl9LAorCXRvUmdiYTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hXTsKKwl9LAorCXRvSGV4OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoZXgodGhpcy50b1JnYigpKTsKKwl9LAorCXRvQ3NzOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuICJyZ2IoIiArIHRoaXMudG9SZ2IoKS5qb2luKCkgKyAiKSI7CisJfSwKKwl0b1N0cmluZzogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnRvSGV4KCk7IC8vIGRlY2VudCBkZWZhdWx0PworCX0sCisJYmxlbmQ6IGZ1bmN0aW9uKGNvbG9yLCB3ZWlnaHQpeworCQl2YXIgcmdiID0gbnVsbDsKKwkJaWYoZG9qby5sYW5nLmlzQXJyYXkoY29sb3IpKXsKKwkJCXJnYiA9IGNvbG9yOworCQl9ZWxzZSBpZihjb2xvciBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKKwkJCXJnYiA9IGNvbG9yLnRvUmdiKCk7CisJCX1lbHNleworCQkJcmdiID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGNvbG9yKS50b1JnYigpOworCQl9CisJCXJldHVybiBkb2pvLmdmeC5jb2xvci5ibGVuZCh0aGlzLnRvUmdiKCksIHJnYiwgd2VpZ2h0KTsKKwl9Cit9KTsKKworZG9qby5nZnguY29sb3IubmFtZWQgPSB7CisJd2hpdGU6ICAgICAgWzI1NSwyNTUsMjU1XSwKKwlibGFjazogICAgICBbMCwwLDBdLAorCXJlZDogICAgICAgIFsyNTUsMCwwXSwKKwlncmVlbjoJICAgIFswLDI1NSwwXSwKKwlsaW1lOgkgICAgWzAsMjU1LDBdLAorCWJsdWU6ICAgICAgIFswLDAsMjU1XSwKKwluYXZ5OiAgICAgICBbMCwwLDEyOF0sCisJZ3JheTogICAgICAgWzEyOCwxMjgsMTI4XSwKKwlzaWx2ZXI6ICAgICBbMTkyLDE5MiwxOTJdCit9OworCitkb2pvLmdmeC5jb2xvci5ibGVuZCA9IGZ1bmN0aW9uKGEsIGIsIHdlaWdodCl7CisJLy8gc3VtbWFyeTogCisJLy8JCWJsZW5kIGNvbG9ycyBhIGFuZCBiIChib3RoIGFzIFJHQiBhcnJheSBvciBoZXggc3RyaW5ncykgd2l0aCB3ZWlnaHQKKwkvLwkJZnJvbSAtMSB0byArMSwgMCBiZWluZyBhIDUwLzUwIGJsZW5kCisJaWYodHlwZW9mIGEgPT0gInN0cmluZyIpeworCQlyZXR1cm4gZG9qby5nZnguY29sb3IuYmxlbmRIZXgoYSwgYiwgd2VpZ2h0KTsKKwl9CisJaWYoIXdlaWdodCl7CisJCXdlaWdodCA9IDA7CisJfQorCXdlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KC0xLCB3ZWlnaHQpLCAxKTsKKworCS8vIGFsZXg6IHRoaXMgaW50ZXJmYWNlIGJsb3dzLgorCS8vIG1hcCAtMSB0byAxIHRvIHRoZSByYW5nZSAwIHRvIDEKKwl3ZWlnaHQgPSAoKHdlaWdodCArIDEpLzIpOworCQorCXZhciBjID0gW107CisKKwkvLyB2YXIgc3RvcCA9ICgxMDAwKndlaWdodCk7CisJZm9yKHZhciB4ID0gMDsgeCA8IDM7IHgrKyl7CisJCWNbeF0gPSBwYXJzZUludCggYlt4XSArICggKGFbeF0gLSBiW3hdKSAqIHdlaWdodCkgKTsKKwl9CisJcmV0dXJuIGM7Cit9CisKKy8vIHZlcnkgY29udmVuaWVudCBibGVuZCB0aGF0IHRha2VzIGFuZCByZXR1cm5zIGhleCB2YWx1ZXMKKy8vICh3aWxsIGdldCBjYWxsZWQgYXV0b21hdGljYWxseSBieSBibGVuZCB3aGVuIGJsZW5kIGdldHMgc3RyaW5ncykKK2Rvam8uZ2Z4LmNvbG9yLmJsZW5kSGV4ID0gZnVuY3Rpb24oYSwgYiwgd2VpZ2h0KSB7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoZXgoZG9qby5nZnguY29sb3IuYmxlbmQoZG9qby5nZnguY29sb3IuaGV4MnJnYihhKSwgZG9qby5nZnguY29sb3IuaGV4MnJnYihiKSwgd2VpZ2h0KSk7Cit9CisKKy8vIGdldCBSR0IgYXJyYXkgZnJvbSBjc3Mtc3R5bGUgY29sb3IgZGVjbGFyYXRpb25zCitkb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCID0gZnVuY3Rpb24oY29sb3IpIHsKKwl2YXIgaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCWNvbG9yID0gY29sb3IudG9Mb3dlckNhc2UoKTsKKwlpZiggY29sb3IuaW5kZXhPZigicmdiIikgPT0gMCApIHsKKwkJdmFyIG1hdGNoZXMgPSBjb2xvci5tYXRjaCgvcmdiYSpcKChcZCspLCAqKFxkKyksICooXGQrKS9pKTsKKwkJdmFyIHJldCA9IG1hdGNoZXMuc3BsaWNlKDEsIDMpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXZhciBjb2xvcnMgPSBkb2pvLmdmeC5jb2xvci5oZXgycmdiKGNvbG9yKTsKKwkJaWYoY29sb3JzKSB7CisJCQlyZXR1cm4gY29sb3JzOworCQl9IGVsc2UgeworCQkJLy8gbmFtZWQgY29sb3IgKGhvdyBtYW55IGRvIHdlIHN1cHBvcnQ/KQorCQkJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLm5hbWVkW2NvbG9yXSB8fCBbMjU1LCAyNTUsIDI1NV07CisJCX0KKwl9Cit9CisKK2Rvam8uZ2Z4LmNvbG9yLmhleDJyZ2IgPSBmdW5jdGlvbihoZXgpIHsKKwl2YXIgaGV4TnVtID0gIjAxMjM0NTY3ODlBQkNERUYiOworCXZhciByZ2IgPSBuZXcgQXJyYXkoMyk7CisJaWYoIGhleC5pbmRleE9mKCIjIikgPT0gMCApIHsgaGV4ID0gaGV4LnN1YnN0cmluZygxKTsgfQorCWhleCA9IGhleC50b1VwcGVyQ2FzZSgpOworCWlmKGhleC5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiK2hleE51bSsiXSIsICJnIiksICIiKSAhPSAiIikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYoIGhleC5sZW5ndGggPT0gMyApIHsKKwkJcmdiWzBdID0gaGV4LmNoYXJBdCgwKSArIGhleC5jaGFyQXQoMCkKKwkJcmdiWzFdID0gaGV4LmNoYXJBdCgxKSArIGhleC5jaGFyQXQoMSkKKwkJcmdiWzJdID0gaGV4LmNoYXJBdCgyKSArIGhleC5jaGFyQXQoMik7CisJfSBlbHNlIHsKKwkJcmdiWzBdID0gaGV4LnN1YnN0cmluZygwLCAyKTsKKwkJcmdiWzFdID0gaGV4LnN1YnN0cmluZygyLCA0KTsKKwkJcmdiWzJdID0gaGV4LnN1YnN0cmluZyg0KTsKKwl9CisJZm9yKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykgeworCQlyZ2JbaV0gPSBoZXhOdW0uaW5kZXhPZihyZ2JbaV0uY2hhckF0KDApKSAqIDE2ICsgaGV4TnVtLmluZGV4T2YocmdiW2ldLmNoYXJBdCgxKSk7CisJfQorCXJldHVybiByZ2I7Cit9CisKK2Rvam8uZ2Z4LmNvbG9yLnJnYjJoZXggPSBmdW5jdGlvbihyLCBnLCBiKSB7CisJaWYoZG9qby5sYW5nLmlzQXJyYXkocikpIHsKKwkJZyA9IHJbMV0gfHwgMDsKKwkJYiA9IHJbMl0gfHwgMDsKKwkJciA9IHJbMF0gfHwgMDsKKwl9CisJdmFyIHJldCA9IGRvam8ubGFuZy5tYXAoW3IsIGcsIGJdLCBmdW5jdGlvbih4KSB7CisJCXggPSBuZXcgTnVtYmVyKHgpOworCQl2YXIgcyA9IHgudG9TdHJpbmcoMTYpOworCQl3aGlsZShzLmxlbmd0aCA8IDIpIHsgcyA9ICIwIiArIHM7IH0KKwkJcmV0dXJuIHM7CisJfSk7CisJcmV0LnVuc2hpZnQoIiMiKTsKKwlyZXR1cm4gcmV0LmpvaW4oIiIpOworfQorCitkb2pvLnByb3ZpZGUoImRvam8ubGZ4LkFuaW1hdGlvbiIpOworCisKKworLyoKKwlBbmltYXRpb24gcGFja2FnZSBiYXNlZCBvbiBEYW4gUHVwaXVzJyB3b3JrOiBodHRwOi8vcHVwaXVzLmNvLnVrL2pzL1Rvb2xraXQuRHJhd2luZy5qcworKi8KK2Rvam8ubGZ4LkxpbmUgPSBmdW5jdGlvbigvKmludCovIHN0YXJ0LCAvKmludCovIGVuZCl7CisJLy8gc3VtbWFyeTogZG9qby5sZnguTGluZSBpcyB0aGUgb2JqZWN0IHVzZWQgdG8gZ2VuZXJhdGUgdmFsdWVzCisJLy8JCQlmcm9tIGEgc3RhcnQgdmFsdWUgdG8gYW4gZW5kIHZhbHVlCisJdGhpcy5zdGFydCA9IHN0YXJ0OworCXRoaXMuZW5kID0gZW5kOworCWlmKGRvam8ubGFuZy5pc0FycmF5KHN0YXJ0KSl7CisJCS8qIHN0YXJ0OiBBcnJheQorCQkgICBlbmQ6IEFycmF5CisJCSAgIHBJZDogYSAqLworCQl2YXIgZGlmZiA9IFtdOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnN0YXJ0LCBmdW5jdGlvbihzLGkpeworCQkJZGlmZltpXSA9IHRoaXMuZW5kW2ldIC0gczsKKwkJfSwgdGhpcyk7CisJCQorCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oLypmbG9hdCovIG4peworCQkJdmFyIHJlcyA9IFtdOworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5zdGFydCwgZnVuY3Rpb24ocywgaSl7CisJCQkJcmVzW2ldID0gKGRpZmZbaV0gKiBuKSArIHM7CisJCQl9LCB0aGlzKTsKKwkJCXJldHVybiByZXM7IC8vIEFycmF5CisJCX0KKwl9ZWxzZXsKKwkJdmFyIGRpZmYgPSBlbmQgLSBzdGFydDsKKwkJCQorCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oLypmbG9hdCovIG4peworCQkJLy8Jc3VtbWFyeTogcmV0dXJucyB0aGUgcG9pbnQgb24gdGhlIGxpbmUKKwkJCS8vCW46IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMQorCQkJcmV0dXJuIChkaWZmICogbikgKyB0aGlzLnN0YXJ0OyAvLyBEZWNpbWFsCisJCX0KKwl9Cit9CisKK2lmKChkb2pvLnJlbmRlci5odG1sLmtodG1sKSYmKCFkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkpeworCS8vIHRoZSBjb29sIGtpZHMgYXJlIG9idmlvdXNseSBub3QgdXNpbmcga29ucXVlcm9yLi4uCisJLy8gZm91bmQgYSB2ZXJ5IHdpZXJkIGJ1ZyBpbiBmbG9hdHMgY29uc3RhbnRzLCAxLjUgZXZhbHMgYXMgMQorCS8vIHNlZW1zIHNvbWVib2R5IG1peGVkIHVwIGludHMgYW5kIGZsb2F0cyBpbiAzLjUuNCA/PworCS8vIEZJWE1FOiBpbnZlc3RpZ2F0ZSBtb3JlIGFuZCBwb3N0IGEgS0RFIGJ1ZyAoRnJlZHJpaykKKwlkb2pvLmxmeC5lYXNlRGVmYXVsdCA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkJLy8Jc3VtbWFyeTogUmV0dXJucyB0aGUgcG9pbnQgZm9yIHBvaW50IG4gb24gYSBzaW4gd2F2ZS4KKwkJcmV0dXJuIChwYXJzZUZsb2F0KCIwLjUiKSsoKE1hdGguc2luKCAobitwYXJzZUZsb2F0KCIxLjUiKSkgKiBNYXRoLlBJKSkvMikpOworCX0KK31lbHNleworCWRvam8ubGZ4LmVhc2VEZWZhdWx0ID0gZnVuY3Rpb24oLypEZWNpbWFsPyovIG4peworCQlyZXR1cm4gKDAuNSsoKE1hdGguc2luKCAobisxLjUpICogTWF0aC5QSSkpLzIpKTsKKwl9Cit9CisKK2Rvam8ubGZ4LmVhc2VJbiA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkvLwlzdW1tYXJ5OiByZXR1cm5zIHRoZSBwb2ludCBvbiBhbiBlYXNpbmcgY3VydmUKKwkvLwluOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEKKwlyZXR1cm4gTWF0aC5wb3cobiwgMyk7Cit9CisKK2Rvam8ubGZ4LmVhc2VPdXQgPSBmdW5jdGlvbigvKkRlY2ltYWw/Ki8gbil7CisJLy8Jc3VtbWFyeTogcmV0dXJucyB0aGUgcG9pbnQgb24gdGhlIGxpbmUKKwkvLwluOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEKKwlyZXR1cm4gKCAxIC0gTWF0aC5wb3coMSAtIG4sIDMpICk7Cit9CisKK2Rvam8ubGZ4LmVhc2VJbk91dCA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkvLwlzdW1tYXJ5OiByZXR1cm5zIHRoZSBwb2ludCBvbiB0aGUgbGluZQorCS8vCW46IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMQorCXJldHVybiAoICgzICogTWF0aC5wb3cobiwgMikpIC0gKDIgKiBNYXRoLnBvdyhuLCAzKSkgKTsKK30KKworZG9qby5sZnguSUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeTogZG9qby5sZnguSUFuaW1hdGlvbiBpcyBhbiBpbnRlcmZhY2UgdGhhdCBpbXBsZW1lbnRzCisJLy8JCQljb21tb25seSB1c2VkIGZ1bmN0aW9ucyBvZiBhbmltYXRpb24gb2JqZWN0cworfQorZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5JQW5pbWF0aW9uLCB7CisJLy8gcHVibGljIHByb3BlcnRpZXMKKwljdXJ2ZTogbnVsbCwKKwlkdXJhdGlvbjogMTAwMCwKKwllYXNpbmc6IG51bGwsCisJcmVwZWF0Q291bnQ6IDAsCisJcmF0ZTogMTAsCisJCisJLy8gZXZlbnRzCisJaGFuZGxlcjogbnVsbCwKKwliZWZvcmVCZWdpbjogbnVsbCwKKwlvbkJlZ2luOiBudWxsLAorCW9uQW5pbWF0ZTogbnVsbCwKKwlvbkVuZDogbnVsbCwKKwlvblBsYXk6IG51bGwsCisJb25QYXVzZTogbnVsbCwKKwlvblN0b3A6IG51bGwsCisJCisJLy8gcHVibGljIG1ldGhvZHMKKwlwbGF5OiBudWxsLAorCXBhdXNlOiBudWxsLAorCXN0b3A6IG51bGwsCisJCisJY29ubmVjdDogZnVuY3Rpb24oLypFdmVudCovIGV2dCwgLypPYmplY3QqLyBzY29wZSwgLypGdW5jdGlvbiovIG5ld0Z1bmMpeworCQkvLyBzdW1tYXJ5OiBDb252ZW5pZW5jZSBmdW5jdGlvbi4gIFF1aWNrbHkgY29ubmVjdCB0byBhbiBldmVudAorCQkvLwkJCW9mIHRoaXMgb2JqZWN0IGFuZCBzYXZlIHRoZSBvbGQgZnVuY3Rpb25zIGNvbm5lY3RlZCB0byBpdC4KKwkJLy8gZXZ0OiBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gY29ubmVjdCB0by4KKwkJLy8gc2NvcGU6IHRoZSBzY29wZSBpbiB3aGljaCB0byBydW4gbmV3RnVuYy4KKwkJLy8gbmV3RnVuYzogdGhlIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIGV2dCBpcyBmaXJlZC4KKwkJaWYoIW5ld0Z1bmMpeworCQkJLyogc2NvcGU6IEZ1bmN0aW9uCisJCQkgICBuZXdGdW5jOiBudWxsCisJCQkgICBwSWQ6IGYgKi8KKwkJCW5ld0Z1bmMgPSBzY29wZTsKKwkJCXNjb3BlID0gdGhpczsKKwkJfQorCQluZXdGdW5jID0gZG9qby5sYW5nLmhpdGNoKHNjb3BlLCBuZXdGdW5jKTsKKwkJdmFyIG9sZEZ1bmMgPSB0aGlzW2V2dF18fGZ1bmN0aW9uKCl7fTsKKwkJdGhpc1tldnRdID0gZnVuY3Rpb24oKXsKKwkJCXZhciByZXQgPSBvbGRGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQluZXdGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKworCWZpcmU6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQsIC8qQXJyYXkqLyBhcmdzKXsKKwkJLy8gc3VtbWFyeTogQ29udmVuaWVuY2UgZnVuY3Rpb24uICBGaXJlIGV2ZW50ICJldnQiIGFuZCBwYXNzIGl0CisJCS8vCQkJdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gImFyZ3MiLgorCQkvLyBldnQ6IFRoZSBldmVudCB0byBmaXJlLgorCQkvLyBhcmdzOiBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50LgorCQlpZih0aGlzW2V2dF0peworCQkJdGhpc1tldnRdLmFwcGx5KHRoaXMsIChhcmdzfHxbXSkpOworCQl9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKwkKKwlyZXBlYXQ6IGZ1bmN0aW9uKC8qaW50Ki8gY291bnQpeworCQkvLyBzdW1tYXJ5OiBTZXQgdGhlIHJlcGVhdCBjb3VudCBvZiB0aGlzIG9iamVjdC4KKwkJLy8gY291bnQ6IEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uLgorCQl0aGlzLnJlcGVhdENvdW50ID0gY291bnQ7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKworCS8vIHByaXZhdGUgcHJvcGVydGllcworCV9hY3RpdmU6IGZhbHNlLAorCV9wYXVzZWQ6IGZhbHNlCit9KTsKKworZG9qby5sZnguQW5pbWF0aW9uID0gZnVuY3Rpb24oCS8qT2JqZWN0Ki8gaGFuZGxlcnMsIAorCQkJCQkJCQkvKmludCovIGR1cmF0aW9uLCAKKwkJCQkJCQkJLypkb2pvLmxmeC5MaW5lKi8gY3VydmUsIAorCQkJCQkJCQkvKmZ1bmN0aW9uKi8gZWFzaW5nLCAKKwkJCQkJCQkJLyppbnQqLyByZXBlYXRDb3VudCwgCisJCQkJCQkJCS8qaW50Ki8gcmF0ZSl7CisJLy8Jc3VtbWFyeQorCS8vCQlhIGdlbmVyaWMgYW5pbWF0aW9uIG9iamVjdCB0aGF0IGZpcmVzIGNhbGxiYWNrcyBpbnRvIGl0J3MgaGFuZGxlcnMKKwkvLwkJb2JqZWN0IGF0IHZhcmlvdXMgc3RhdGVzCisJLy8JaGFuZGxlcnM6IHsgaGFuZGxlcjogRnVuY3Rpb24/LCBvbnN0YXJ0OiBGdW5jdGlvbj8sIG9uc3RvcDogRnVuY3Rpb24/LCBvbmFuaW1hdGU6IEZ1bmN0aW9uPyB9CisJZG9qby5sZnguSUFuaW1hdGlvbi5jYWxsKHRoaXMpOworCWlmKGRvam8ubGFuZy5pc051bWJlcihoYW5kbGVycyl8fCghaGFuZGxlcnMgJiYgZHVyYXRpb24uZ2V0VmFsdWUpKXsKKwkJLy8gbm8gaGFuZGxlcnMgYXJndW1lbnQ6CisJCXJhdGUgPSByZXBlYXRDb3VudDsKKwkJcmVwZWF0Q291bnQgPSBlYXNpbmc7CisJCWVhc2luZyA9IGN1cnZlOworCQljdXJ2ZSA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IGhhbmRsZXJzOworCQloYW5kbGVycyA9IG51bGw7CisJfWVsc2UgaWYoaGFuZGxlcnMuZ2V0VmFsdWV8fGRvam8ubGFuZy5pc0FycmF5KGhhbmRsZXJzKSl7CisJCS8vIG5vIGhhbmRsZXJzIG9yIGR1cmF0aW9uOgorCQlyYXRlID0gZWFzaW5nOworCQlyZXBlYXRDb3VudCA9IGN1cnZlOworCQllYXNpbmcgPSBkdXJhdGlvbjsKKwkJY3VydmUgPSBoYW5kbGVyczsKKwkJZHVyYXRpb24gPSBudWxsOworCQloYW5kbGVycyA9IG51bGw7CisJfQorCWlmKGRvam8ubGFuZy5pc0FycmF5KGN1cnZlKSl7CisJCS8qIGN1cnZlOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJdGhpcy5jdXJ2ZSA9IG5ldyBkb2pvLmxmeC5MaW5lKGN1cnZlWzBdLCBjdXJ2ZVsxXSk7CisJfWVsc2V7CisJCXRoaXMuY3VydmUgPSBjdXJ2ZTsKKwl9CisJaWYoZHVyYXRpb24gIT0gbnVsbCAmJiBkdXJhdGlvbiA+IDApeyB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247IH0KKwlpZihyZXBlYXRDb3VudCl7IHRoaXMucmVwZWF0Q291bnQgPSByZXBlYXRDb3VudDsgfQorCWlmKHJhdGUpeyB0aGlzLnJhdGUgPSByYXRlOyB9CisJaWYoaGFuZGxlcnMpeworCQlkb2pvLmxhbmcuZm9yRWFjaChbCisJCQkJImhhbmRsZXIiLCAiYmVmb3JlQmVnaW4iLCAib25CZWdpbiIsIAorCQkJCSJvbkVuZCIsICJvblBsYXkiLCAib25TdG9wIiwgIm9uQW5pbWF0ZSIKKwkJCV0sIGZ1bmN0aW9uKGl0ZW0peworCQkJCWlmKGhhbmRsZXJzW2l0ZW1dKXsKKwkJCQkJdGhpcy5jb25uZWN0KGl0ZW0sIGhhbmRsZXJzW2l0ZW1dKTsKKwkJCQl9CisJCQl9LCB0aGlzKTsKKwl9CisJaWYoZWFzaW5nICYmIGRvam8ubGFuZy5pc0Z1bmN0aW9uKGVhc2luZykpeworCQl0aGlzLmVhc2luZz1lYXNpbmc7CisJfQorfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5BbmltYXRpb24sIGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5BbmltYXRpb24sIHsKKwkvLyAicHJpdmF0ZSIgcHJvcGVydGllcworCV9zdGFydFRpbWU6IG51bGwsCisJX2VuZFRpbWU6IG51bGwsCisJX3RpbWVyOiBudWxsLAorCV9wZXJjZW50OiAwLAorCV9zdGFydFJlcGVhdENvdW50OiAwLAorCisJLy8gcHVibGljIG1ldGhvZHMKKwlwbGF5OiBmdW5jdGlvbigvKmludD8qLyBkZWxheSwgLypib29sPyovIGdvdG9TdGFydCl7CisJCS8vIHN1bW1hcnk6IFN0YXJ0IHRoZSBhbmltYXRpb24uCisJCS8vIGRlbGF5OiBIb3cgbWFueSBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHN0YXJ0aW5nLgorCQkvLyBnb3RvU3RhcnQ6IElmIHRydWUsIHN0YXJ0cyB0aGUgYW5pbWF0aW9uIGZyb20gdGhlIGJlZ2lubmluZzsgb3RoZXJ3aXNlLAorCQkvLyAgICAgICAgICAgIHN0YXJ0cyBpdCBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uLgorCQlpZihnb3RvU3RhcnQpeworCQkJY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKKwkJCXRoaXMuX2FjdGl2ZSA9IGZhbHNlOworCQkJdGhpcy5fcGF1c2VkID0gZmFsc2U7CisJCQl0aGlzLl9wZXJjZW50ID0gMDsKKwkJfWVsc2UgaWYodGhpcy5fYWN0aXZlICYmICF0aGlzLl9wYXVzZWQpeworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCQl9CisJCQorCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImJlZm9yZUJlZ2luIl0pOworCQl0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CisKKwkJaWYoZGVsYXkgPiAwKXsKKwkJCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMucGxheShudWxsLCBnb3RvU3RhcnQpOyB9KSwgZGVsYXkpOworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCQl9CisJCQorCQl0aGlzLl9zdGFydFRpbWUgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJaWYodGhpcy5fcGF1c2VkKXsKKwkJCXRoaXMuX3N0YXJ0VGltZSAtPSAodGhpcy5kdXJhdGlvbiAqIHRoaXMuX3BlcmNlbnQgLyAxMDApOworCQl9CisJCXRoaXMuX2VuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLmR1cmF0aW9uOworCisJCXRoaXMuX2FjdGl2ZSA9IHRydWU7CisJCXRoaXMuX3BhdXNlZCA9IGZhbHNlOworCQkKKwkJdmFyIHN0ZXAgPSB0aGlzLl9wZXJjZW50IC8gMTAwOworCQl2YXIgdmFsdWUgPSB0aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOworCQlpZih0aGlzLl9wZXJjZW50ID09IDAgKXsKKwkJCWlmKCF0aGlzLl9zdGFydFJlcGVhdENvdW50KXsKKwkJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gdGhpcy5yZXBlYXRDb3VudDsKKwkJCX0KKwkJCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsiYmVnaW4iLCB2YWx1ZV0pOworCQkJdGhpcy5maXJlKCJvbkJlZ2luIiwgW3ZhbHVlXSk7CisJCX0KKworCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbInBsYXkiLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uUGxheSIsIFt2YWx1ZV0pOworCisJCXRoaXMuX2N5Y2xlKCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KKwl9LAorCisJcGF1c2U6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFBhdXNlcyBhIHJ1bm5pbmcgYW5pbWF0aW9uLgorCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQlpZighdGhpcy5fYWN0aXZlKXsgcmV0dXJuIHRoaXM7IC8qZG9qby5sZnguQW5pbWF0aW9uKi99CisJCXRoaXMuX3BhdXNlZCA9IHRydWU7CisJCXZhciB2YWx1ZSA9IHRoaXMuY3VydmUuZ2V0VmFsdWUodGhpcy5fcGVyY2VudCAvIDEwMCk7CisJCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsicGF1c2UiLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uUGF1c2UiLCBbdmFsdWVdKTsKKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCX0sCisKKwlnb3RvUGVyY2VudDogZnVuY3Rpb24oLypEZWNpbWFsKi8gcGN0LCAvKmJvb2w/Ki8gYW5kUGxheSl7CisJCS8vIHN1bW1hcnk6IFNldHMgdGhlIHByb2dyZXNzIG9mIHRoZSBhbmltYXRpb24uCisJCS8vIHBjdDogQSBwZXJjZW50YWdlIGluIGRlY2ltYWwgbm90YXRpb24gKGJldHdlZW4gYW5kIGluY2x1ZGluZyAwLjAgYW5kIDEuMCkuCisJCS8vIGFuZFBsYXk6IElmIHRydWUsIHBsYXkgdGhlIGFuaW1hdGlvbiBhZnRlciBzZXR0aW5nIHRoZSBwcm9ncmVzcy4KKwkJY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKKwkJdGhpcy5fYWN0aXZlID0gdHJ1ZTsKKwkJdGhpcy5fcGF1c2VkID0gdHJ1ZTsKKwkJdGhpcy5fcGVyY2VudCA9IHBjdDsKKwkJaWYoYW5kUGxheSl7IHRoaXMucGxheSgpOyB9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KKwl9LAorCisJc3RvcDogZnVuY3Rpb24oLypib29sPyovIGdvdG9FbmQpeworCQkvLyBzdW1tYXJ5OiBTdG9wcyBhIHJ1bm5pbmcgYW5pbWF0aW9uLgorCQkvLyBnb3RvRW5kOiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgZW5kLgorCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQl2YXIgc3RlcCA9IHRoaXMuX3BlcmNlbnQgLyAxMDA7CisJCWlmKGdvdG9FbmQpeworCQkJc3RlcCA9IDE7CisJCX0KKwkJdmFyIHZhbHVlID0gdGhpcy5jdXJ2ZS5nZXRWYWx1ZShzdGVwKTsKKwkJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJzdG9wIiwgdmFsdWVdKTsKKwkJdGhpcy5maXJlKCJvblN0b3AiLCBbdmFsdWVdKTsKKwkJdGhpcy5fYWN0aXZlID0gZmFsc2U7CisJCXRoaXMuX3BhdXNlZCA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQW5pbWF0aW9uCisJfSwKKworCXN0YXR1czogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIG9mCisJCS8vCQkJdGhlIGFuaW1hdGlvbi4KKwkJaWYodGhpcy5fYWN0aXZlKXsKKwkJCXJldHVybiB0aGlzLl9wYXVzZWQgPyAicGF1c2VkIiA6ICJwbGF5aW5nIjsgLy8gU3RyaW5nCisJCX1lbHNleworCQkJcmV0dXJuICJzdG9wcGVkIjsgLy8gU3RyaW5nCisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCS8vICJwcml2YXRlIiBtZXRob2RzCisJX2N5Y2xlOiBmdW5jdGlvbigpeworCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQlpZih0aGlzLl9hY3RpdmUpeworCQkJdmFyIGN1cnIgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJCXZhciBzdGVwID0gKGN1cnIgLSB0aGlzLl9zdGFydFRpbWUpIC8gKHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUpOworCisJCQlpZihzdGVwID49IDEpeworCQkJCXN0ZXAgPSAxOworCQkJCXRoaXMuX3BlcmNlbnQgPSAxMDA7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLl9wZXJjZW50ID0gc3RlcCAqIDEwMDsKKwkJCX0KKwkJCQorCQkJLy8gUGVyZm9ybSBlYXNpbmcKKwkJCWlmKCh0aGlzLmVhc2luZykmJihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmVhc2luZykpKXsKKwkJCQlzdGVwID0gdGhpcy5lYXNpbmcoc3RlcCk7CisJCQl9CisKKwkJCXZhciB2YWx1ZSA9IHRoaXMuY3VydmUuZ2V0VmFsdWUoc3RlcCk7CisJCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImFuaW1hdGUiLCB2YWx1ZV0pOworCQkJdGhpcy5maXJlKCJvbkFuaW1hdGUiLCBbdmFsdWVdKTsKKworCQkJaWYoIHN0ZXAgPCAxICl7CisJCQkJdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX2N5Y2xlIiksIHRoaXMucmF0ZSk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwkJCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImVuZCJdKTsKKwkJCQl0aGlzLmZpcmUoIm9uRW5kIik7CisKKwkJCQlpZih0aGlzLnJlcGVhdENvdW50ID4gMCl7CisJCQkJCXRoaXMucmVwZWF0Q291bnQtLTsKKwkJCQkJdGhpcy5wbGF5KG51bGwsIHRydWUpOworCQkJCX1lbHNlIGlmKHRoaXMucmVwZWF0Q291bnQgPT0gLTEpeworCQkJCQl0aGlzLnBsYXkobnVsbCwgdHJ1ZSk7CisJCQkJfWVsc2V7CisJCQkJCWlmKHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQpeworCQkJCQkJdGhpcy5yZXBlYXRDb3VudCA9IHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQ7CisJCQkJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQW5pbWF0aW9uCisJfQorfSk7CisKK2Rvam8ubGZ4LkNvbWJpbmUgPSBmdW5jdGlvbigvKmRvam8ubGZ4LklBbmltYXRpb24uLi4qLyBhbmltYXRpb25zKXsKKwkvLyBzdW1tYXJ5OiBBbiBhbmltYXRpb24gb2JqZWN0IHRvIHBsYXkgYW5pbWF0aW9ucyBwYXNzZWQgdG8gaXQgYXQgdGhlIHNhbWUgdGltZS4KKwlkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7CisJdGhpcy5fYW5pbXMgPSBbXTsKKwl0aGlzLl9hbmltc0VuZGVkID0gMDsKKwkKKwl2YXIgYW5pbXMgPSBhcmd1bWVudHM7CisJaWYoYW5pbXMubGVuZ3RoID09IDEgJiYgKGRvam8ubGFuZy5pc0FycmF5KGFuaW1zWzBdKSB8fCBkb2pvLmxhbmcuaXNBcnJheUxpa2UoYW5pbXNbMF0pKSl7CisJCS8qIGFuaW1hdGlvbnM6IGRvam8ubGZ4LklBbmltYXRpb25bXQorCQkgICBwSWQ6IGEgKi8KKwkJYW5pbXMgPSBhbmltc1swXTsKKwl9CisJCisJZG9qby5sYW5nLmZvckVhY2goYW5pbXMsIGZ1bmN0aW9uKGFuaW0peworCQl0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJfb25Bbmltc0VuZGVkIikpOworCX0sIHRoaXMpOworfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5Db21iaW5lLCBkb2pvLmxmeC5JQW5pbWF0aW9uKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguQ29tYmluZSwgeworCS8vIHByaXZhdGUgbWVtYmVycworCV9hbmltc0VuZGVkOiAwLAorCQorCS8vIHB1YmxpYyBtZXRob2RzCisJcGxheTogZnVuY3Rpb24oLyppbnQ/Ki8gZGVsYXksIC8qYm9vbD8qLyBnb3RvU3RhcnQpeworCQkvLyBzdW1tYXJ5OiBTdGFydCB0aGUgYW5pbWF0aW9ucy4KKwkJLy8gZGVsYXk6IEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcuCisJCS8vIGdvdG9TdGFydDogSWYgdHJ1ZSwgc3RhcnRzIHRoZSBhbmltYXRpb25zIGZyb20gdGhlIGJlZ2lubmluZzsgb3RoZXJ3aXNlLAorCQkvLyAgICAgICAgICAgIHN0YXJ0cyB0aGVtIGZyb20gdGhlaXIgY3VycmVudCBwb3NpdGlvbi4KKwkJaWYoICF0aGlzLl9hbmltcy5sZW5ndGggKXsgcmV0dXJuIHRoaXM7IC8qZG9qby5sZnguQ29tYmluZSovfQorCisJCXRoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKKworCQlpZihkZWxheSA+IDApeworCQkJc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24oKXsgdGhpcy5wbGF5KG51bGwsIGdvdG9TdGFydCk7IH0pLCBkZWxheSk7CisJCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCQl9CisJCQorCQlpZihnb3RvU3RhcnQgfHwgdGhpcy5fYW5pbXNbMF0ucGVyY2VudCA9PSAwKXsKKwkJCXRoaXMuZmlyZSgib25CZWdpbiIpOworCQl9CisJCXRoaXMuZmlyZSgib25QbGF5Iik7CisJCXRoaXMuX2FuaW1zQ2FsbCgicGxheSIsIG51bGwsIGdvdG9TdGFydCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5Db21iaW5lCisJfSwKKwkKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUGF1c2VzIHRoZSBydW5uaW5nIGFuaW1hdGlvbnMuCisJCXRoaXMuZmlyZSgib25QYXVzZSIpOworCQl0aGlzLl9hbmltc0NhbGwoInBhdXNlIik7IAorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCX0sCisJCisJc3RvcDogZnVuY3Rpb24oLypib29sPyovIGdvdG9FbmQpeworCQkvLyBzdW1tYXJ5OiBTdG9wcyB0aGUgcnVubmluZyBhbmltYXRpb25zLgorCQkvLyBnb3RvRW5kOiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9ucyB3aWxsIGVuZC4KKwkJdGhpcy5maXJlKCJvblN0b3AiKTsKKwkJdGhpcy5fYW5pbXNDYWxsKCJzdG9wIiwgZ290b0VuZCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5Db21iaW5lCisJfSwKKwkKKwkvLyBwcml2YXRlIG1ldGhvZHMKKwlfb25Bbmltc0VuZGVkOiBmdW5jdGlvbigpeworCQl0aGlzLl9hbmltc0VuZGVkKys7CisJCWlmKHRoaXMuX2FuaW1zRW5kZWQgPj0gdGhpcy5fYW5pbXMubGVuZ3RoKXsKKwkJCXRoaXMuZmlyZSgib25FbmQiKTsKKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCX0sCisJCisJX2FuaW1zQ2FsbDogZnVuY3Rpb24oLypTdHJpbmcqLyBmdW5jTmFtZSl7CisJCXZhciBhcmdzID0gW107CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsKKwkJCWZvcih2YXIgaSA9IDEgOyBpIDwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKyl7CisJCQkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCQl9CisJCX0KKwkJdmFyIF90aGlzID0gdGhpczsKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy5fYW5pbXMsIGZ1bmN0aW9uKGFuaW0peworCQkJYW5pbVtmdW5jTmFtZV0oYXJncyk7CisJCX0sIF90aGlzKTsKKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNvbWJpbmUKKwl9Cit9KTsKKworZG9qby5sZnguQ2hhaW4gPSBmdW5jdGlvbigvKmRvam8ubGZ4LklBbmltYXRpb24uLi4qLyBhbmltYXRpb25zKSB7CisJLy8gc3VtbWFyeTogQW4gYW5pbWF0aW9uIG9iamVjdCB0byBwbGF5IGFuaW1hdGlvbnMgcGFzc2VkIHRvIGl0CisJLy8JCQlvbmUgYWZ0ZXIgYW5vdGhlci4KKwlkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7CisJdGhpcy5fYW5pbXMgPSBbXTsKKwl0aGlzLl9jdXJyQW5pbSA9IC0xOworCQorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihhbmltcy5sZW5ndGggPT0gMSAmJiAoZG9qby5sYW5nLmlzQXJyYXkoYW5pbXNbMF0pIHx8IGRvam8ubGFuZy5pc0FycmF5TGlrZShhbmltc1swXSkpKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFuaW1zWzBdOworCX0KKwkKKwl2YXIgX3RoaXMgPSB0aGlzOworCWRvam8ubGFuZy5mb3JFYWNoKGFuaW1zLCBmdW5jdGlvbihhbmltLCBpLCBhbmltc19hcnIpeworCQl0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworCQlpZihpIDwgYW5pbXNfYXJyLmxlbmd0aCAtIDEpeworCQkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX3BsYXlOZXh0IikgKTsKKwkJfWVsc2V7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMuZmlyZSgib25FbmQiKTsgfSkgKTsKKwkJfQorCX0sIHRoaXMpOworfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5DaGFpbiwgZG9qby5sZnguSUFuaW1hdGlvbik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LkNoYWluLCB7CisJLy8gcHJpdmF0ZSBtZW1iZXJzCisJX2N1cnJBbmltOiAtMSwKKwkKKwkvLyBwdWJsaWMgbWV0aG9kcworCXBsYXk6IGZ1bmN0aW9uKC8qaW50PyovIGRlbGF5LCAvKmJvb2w/Ki8gZ290b1N0YXJ0KXsKKwkJLy8gc3VtbWFyeTogU3RhcnQgdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZS4KKwkJLy8gZGVsYXk6IEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcuCisJCS8vIGdvdG9TdGFydDogSWYgdHJ1ZSwgc3RhcnRzIHRoZSBzZXF1ZW5jZSBmcm9tIHRoZSBiZWdpbm5pbmc7IG90aGVyd2lzZSwKKwkJLy8gICAgICAgICAgICBzdGFydHMgaXQgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbi4KKwkJaWYoICF0aGlzLl9hbmltcy5sZW5ndGggKSB7IHJldHVybiB0aGlzOyAvKmRvam8ubGZ4LkNoYWluKi99CisJCWlmKCBnb3RvU3RhcnQgfHwgIXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSApIHsKKwkJCXRoaXMuX2N1cnJBbmltID0gMDsKKwkJfQorCisJCXZhciBjdXJyZW50QW5pbWF0aW9uID0gdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dOworCisJCXRoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKKwkJaWYoZGVsYXkgPiAwKXsKKwkJCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMucGxheShudWxsLCBnb3RvU3RhcnQpOyB9KSwgZGVsYXkpOworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJCX0KKwkJCisJCWlmKGN1cnJlbnRBbmltYXRpb24peworCQkJaWYodGhpcy5fY3VyckFuaW0gPT0gMCl7CisJCQkJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJiZWdpbiIsIHRoaXMuX2N1cnJBbmltXSk7CisJCQkJdGhpcy5maXJlKCJvbkJlZ2luIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJCQl9CisJCQl0aGlzLmZpcmUoIm9uUGxheSIsIFt0aGlzLl9jdXJyQW5pbV0pOworCQkJY3VycmVudEFuaW1hdGlvbi5wbGF5KG51bGwsIGdvdG9TdGFydCk7CisJCX0KKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJfSwKKwkKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUGF1c2VzIHRoZSBydW5uaW5nIGFuaW1hdGlvbiBzZXF1ZW5jZS4KKwkJaWYoIHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSApIHsKKwkJCXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXS5wYXVzZSgpOworCQkJdGhpcy5maXJlKCJvblBhdXNlIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJfSwKKwkKKwlwbGF5UGF1c2U6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IElmIHRoZSBhbmltYXRpb24gc2VxdWVuY2UgaXMgcGxheWluZywgcGF1c2UgaXQ7IG90aGVyd2lzZSwKKwkJLy8JCQlwbGF5IGl0LgorCQlpZih0aGlzLl9hbmltcy5sZW5ndGggPT0gMCl7IHJldHVybiB0aGlzOyB9CisJCWlmKHRoaXMuX2N1cnJBbmltID09IC0xKXsgdGhpcy5fY3VyckFuaW0gPSAwOyB9CisJCXZhciBjdXJyQW5pbSA9IHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKKwkJaWYoIGN1cnJBbmltICkgeworCQkJaWYoICFjdXJyQW5pbS5fYWN0aXZlIHx8IGN1cnJBbmltLl9wYXVzZWQgKSB7CisJCQkJdGhpcy5wbGF5KCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucGF1c2UoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ2hhaW4KKwl9LAorCQorCXN0b3A6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFN0b3BzIHRoZSBydW5uaW5nIGFuaW1hdGlvbnMuCisJCXZhciBjdXJyQW5pbSA9IHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKKwkJaWYoY3VyckFuaW0peworCQkJY3VyckFuaW0uc3RvcCgpOworCQkJdGhpcy5maXJlKCJvblN0b3AiLCBbdGhpcy5fY3VyckFuaW1dKTsKKwkJfQorCQlyZXR1cm4gY3VyckFuaW07IC8vIGRvam8ubGZ4LklBbmltYXRpb24KKwl9LAorCQorCS8vIHByaXZhdGUgbWV0aG9kcworCV9wbGF5TmV4dDogZnVuY3Rpb24oKXsKKwkJaWYoIHRoaXMuX2N1cnJBbmltID09IC0xIHx8IHRoaXMuX2FuaW1zLmxlbmd0aCA9PSAwICkgeyByZXR1cm4gdGhpczsgfQorCQl0aGlzLl9jdXJyQW5pbSsrOworCQlpZiggdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dICl7CisJCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheShudWxsLCB0cnVlKTsKKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ2hhaW4KKwl9Cit9KTsKKworZG9qby5sZnguY29tYmluZSA9IGZ1bmN0aW9uKC8qZG9qby5sZnguSUFuaW1hdGlvbi4uLiovIGFuaW1hdGlvbnMpeworCS8vIHN1bW1hcnk6IENvbnZlbmllbmNlIGZ1bmN0aW9uLiAgUmV0dXJucyBhIGRvam8ubGZ4LkNvbWJpbmUgY3JlYXRlZAorCS8vCQkJdXNpbmcgdGhlIGFuaW1hdGlvbnMgcGFzc2VkIGluLgorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFyZ3VtZW50c1swXTsKKwl9CisJaWYoYW5pbXMubGVuZ3RoID09IDEpeyByZXR1cm4gYW5pbXNbMF07IH0KKwlyZXR1cm4gbmV3IGRvam8ubGZ4LkNvbWJpbmUoYW5pbXMpOyAvLyBkb2pvLmxmeC5Db21iaW5lCit9CisKK2Rvam8ubGZ4LmNoYWluID0gZnVuY3Rpb24oLypkb2pvLmxmeC5JQW5pbWF0aW9uLi4uKi8gYW5pbWF0aW9ucyl7CisJLy8gc3VtbWFyeTogQ29udmVuaWVuY2UgZnVuY3Rpb24uICBSZXR1cm5zIGEgZG9qby5sZnguQ2hhaW4gY3JlYXRlZAorCS8vCQkJdXNpbmcgdGhlIGFuaW1hdGlvbnMgcGFzc2VkIGluLgorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFyZ3VtZW50c1swXTsKKwl9CisJaWYoYW5pbXMubGVuZ3RoID09IDEpeyByZXR1cm4gYW5pbXNbMF07IH0KKwlyZXR1cm4gbmV3IGRvam8ubGZ4LkNoYWluKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5jb21tb24iKTsKKworCisKK2Rvam8ubGFuZy5taXhpbihkb2pvLmh0bWwsIGRvam8uZG9tKTsKKworZG9qby5odG1sLmJvZHkgPSBmdW5jdGlvbigpeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLmJvZHkoKSBtb3ZlZCB0byBkb2pvLmJvZHkoKSIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5ib2R5KCk7Cit9CisKKy8vIEZJWE1FOiB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIHRocm93IGFueSBhbmQgZXZlcnkgcmVuZGVyaW5nCisvLyBlbmdpbmUgaW50byB0aGUgSUUgNS54IGJveCBtb2RlbC4gSW4gTW96aWxsYSwgd2UgZG8gdGhpcyB3LyBDU1MuCisvLyBOZWVkIHRvIGludmVzdGlnYXRlIGZvciBLSFRNTCBhbmQgT3BlcmEKKworZG9qby5odG1sLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24oLyogRE9NRXZlbnQgKi9ldnQpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB0YXJnZXQgb2YgYW4gZXZlbnQKKwlpZighZXZ0KSB7IGV2dCA9IGRvam8uZ2xvYmFsKCkuZXZlbnQgfHwge30gfTsKKwl2YXIgdCA9IChldnQuc3JjRWxlbWVudCA/IGV2dC5zcmNFbGVtZW50IDogKGV2dC50YXJnZXQgPyBldnQudGFyZ2V0IDogbnVsbCkpOworCXdoaWxlKCh0KSYmKHQubm9kZVR5cGUhPTEpKXsgdCA9IHQucGFyZW50Tm9kZTsgfQorCXJldHVybiB0OwkvLwlIVE1MRWxlbWVudAorfQorCitkb2pvLmh0bWwuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWV3YWJsZSBhcmVhIG9mIGEgYnJvd3NlciB3aW5kb3cKKwl2YXIgX3dpbmRvdyA9IGRvam8uZ2xvYmFsKCk7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdmFyIHcgPSAwOworCXZhciBoID0gMDsKKworCWlmKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSl7CisJCS8vIG1vemlsbGEKKwkJdyA9IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CisJCWggPSBfd2luZG93LmlubmVySGVpZ2h0OworCX1lbHNlIGlmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIF93aW5kb3cuaW5uZXJXaWR0aCl7CisJCS8vaW4gb3BlcmE5LCBkb2pvLmJvZHkoKS5jbGllbnRXaWR0aCBzaG91bGQgYmUgdXNlZCwgaW5zdGVhZAorCQkvL29mIHdpbmRvdy5pbm5lcldpZHRoL2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aAorCQkvL3NvIHdlIGhhdmUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBvcGVyYQorCQl3ID0gX3dpbmRvdy5pbm5lcldpZHRoOworCQloID0gX3dpbmRvdy5pbm5lckhlaWdodDsKKwl9IGVsc2UgaWYgKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIGRvam8uZXhpc3RzKF9kb2N1bWVudCwgImRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCIpKXsKKwkJLy8gSUU2IFN0cmljdAorCQl2YXIgdzIgPSBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOworCQkvLyB0aGlzIGxldHMgdXMgYWNjb3VudCBmb3Igc2Nyb2xsYmFycworCQlpZighdyB8fCB3MiAmJiB3MiA8IHcpIHsKKwkJCXcgPSB3MjsKKwkJfQorCQloID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CisJfSBlbHNlIGlmIChkb2pvLmJvZHkoKS5jbGllbnRXaWR0aCl7CisJCS8vIElFLCBPcGVyYQorCQl3ID0gZG9qby5ib2R5KCkuY2xpZW50V2lkdGg7CisJCWggPSBkb2pvLmJvZHkoKS5jbGllbnRIZWlnaHQ7CisJfQorCXJldHVybiB7IHdpZHRoOiB3LCBoZWlnaHQ6IGggfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRTY3JvbGwgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50CisJdmFyIF93aW5kb3cgPSBkb2pvLmdsb2JhbCgpOworCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCXZhciB0b3AgPSBfd2luZG93LnBhZ2VZT2Zmc2V0IHx8IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvam8uYm9keSgpLnNjcm9sbFRvcCB8fCAwOworCXZhciBsZWZ0ID0gX3dpbmRvdy5wYWdlWE9mZnNldCB8fCBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9qby5ib2R5KCkuc2Nyb2xsTGVmdCB8fCAwOworCXJldHVybiB7IAorCQl0b3A6IHRvcCwgCisJCWxlZnQ6IGxlZnQsIAorCQlvZmZzZXQ6eyB4OiBsZWZ0LCB5OiB0b3AgfQkvLwlub3RlIHRoZSBjaGFuZ2UsIE5PVCBhbiBBcnJheSB3aXRoIGFkZGVkIHByb3BlcnRpZXMuIAorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0UGFyZW50QnlUeXBlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi90eXBlKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIGZpcnN0IGFuY2VzdG9yIG9mIG5vZGUgd2l0aCB0YWdOYW1lIHR5cGUuCisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdmFyIHBhcmVudCA9IGRvam8uYnlJZChub2RlKTsKKwl0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworCXdoaWxlKChwYXJlbnQpJiYocGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPXR5cGUpKXsKKwkJaWYocGFyZW50PT0oX2RvY3VtZW50WyJib2R5Il18fF9kb2N1bWVudFsiZG9jdW1lbnRFbGVtZW50Il0pKXsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gcGFyZW50OwkvLwlIVE1MRWxlbWVudAorfQorCitkb2pvLmh0bWwuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9hdHRyKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgdmFsdWUgb2YgYXR0cmlidXRlIGF0dHIgZnJvbSBub2RlLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJLy8gRklYTUU6IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGF0dHItc3BlY2lmaWMgYWNjZXNzb3JzCisJaWYoKCFub2RlKXx8KCFub2RlLmdldEF0dHJpYnV0ZSkpeworCQkvLyBpZihhdHRyICE9PSAnbndUeXBlJyl7CisJCS8vCWFsZXJ0KCJnZXRBdHRyIG9mICciICsgYXR0ciArICInIHdpdGggYmFkIG5vZGUiKTsgCisJCS8vIH0KKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciB0YSA9IHR5cGVvZiBhdHRyID09ICdzdHJpbmcnID8gYXR0ciA6IG5ldyBTdHJpbmcoYXR0cik7CisKKwkvLyBmaXJzdCB0cnkgdGhlIGFwcHJvYWNoIG1vc3QgbGlrZWx5IHRvIHN1Y2NlZWQKKwl2YXIgdiA9IG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvVXBwZXJDYXNlKCkpOworCWlmKCh2KSYmKHR5cGVvZiB2ID09ICdzdHJpbmcnKSYmKHYhPSIiKSl7IAorCQlyZXR1cm4gdjsJLy8Jc3RyaW5nIAorCX0KKworCS8vIHRyeSByZXR1cm5pbmcgdGhlIGF0dHJpYnV0ZXMgdmFsdWUsIGlmIHdlIGNvdWxkbid0IGdldCBpdCBhcyBhIHN0cmluZworCWlmKHYgJiYgdi52YWx1ZSl7IAorCQlyZXR1cm4gdi52YWx1ZTsJLy8Jc3RyaW5nIAorCX0KKworCS8vIHRoaXMgc2hvdWxkIHdvcmsgb24gT3BlcmEgNywgYnV0IGl0J3MgYSBsaXR0bGUgb24gdGhlIGNyYXNoeSBzaWRlCisJaWYoKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSkmJihub2RlLmdldEF0dHJpYnV0ZU5vZGUodGEpKSl7CisJCXJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlKHRhKSkudmFsdWU7CS8vCXN0cmluZworCX1lbHNlIGlmKG5vZGUuZ2V0QXR0cmlidXRlKHRhKSl7CisJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZSh0YSk7CS8vCXN0cmluZworCX1lbHNlIGlmKG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvTG93ZXJDYXNlKCkpKXsKKwkJcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvTG93ZXJDYXNlKCkpOwkvLwlzdHJpbmcKKwl9CisJcmV0dXJuIG51bGw7CS8vCXN0cmluZworfQorCQorZG9qby5odG1sLmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovYXR0cil7CisJLy8Jc3VtbWFyeQorCS8vCURldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBub2RlIGNhcnJpZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbi4KKwlyZXR1cm4gZG9qby5odG1sLmdldEF0dHJpYnV0ZShkb2pvLmJ5SWQobm9kZSksIGF0dHIpID8gdHJ1ZSA6IGZhbHNlOwkvLwlib29sZWFuCit9CisJCitkb2pvLmh0bWwuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbigvKiBET01FdmVudCAqL2UpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgKG5vdCB0aGUgdmlld3BvcnQpLgorCS8vCUZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRvY3VtZW50IHRoYXQgaXMgMTAwMDBweCB0YWxsLAorCS8vCWJ1dCB5b3VyIGJyb3dzZXIgd2luZG93IGlzIG9ubHkgMTAwcHggdGFsbCwKKwkvLwlpZiB5b3Ugc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50IGFuZCBjYWxsIHRoaXMgZnVuY3Rpb24gaXQKKwkvLwl3aWxsIHJldHVybiB7eDogMCwgeTogMTAwMDB9CisJLy8JTk9URTogZm9yIGV2ZW50cyBkZWxpdmVyZWQgdmlhIGRvam8uZXZlbnQuY29ubmVjdCgpIGFuZC9vciBkb2pvQXR0YWNoRXZlbnQgKGZvciB3aWRnZXRzKSwKKwkvLwl5b3UgY2FuIGp1c3QgYWNjZXNzIGV2dC5wYWdlWCBhbmQgZXZ0LnBhZ2VZLCByYXRoZXIgdGhhbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisJZSA9IGUgfHwgZG9qby5nbG9iYWwoKS5ldmVudDsKKwl2YXIgY3Vyc29yID0ge3g6MCwgeTowfTsKKwlpZihlLnBhZ2VYIHx8IGUucGFnZVkpeworCQljdXJzb3IueCA9IGUucGFnZVg7CisJCWN1cnNvci55ID0gZS5wYWdlWTsKKwl9ZWxzZXsKKwkJdmFyIGRlID0gZG9qby5kb2MoKS5kb2N1bWVudEVsZW1lbnQ7CisJCXZhciBkYiA9IGRvam8uYm9keSgpOworCQljdXJzb3IueCA9IGUuY2xpZW50WCArICgoZGV8fGRiKVsic2Nyb2xsTGVmdCJdKSAtICgoZGV8fGRiKVsiY2xpZW50TGVmdCJdKTsKKwkJY3Vyc29yLnkgPSBlLmNsaWVudFkgKyAoKGRlfHxkYilbInNjcm9sbFRvcCJdKSAtICgoZGV8fGRiKVsiY2xpZW50VG9wIl0pOworCX0KKwlyZXR1cm4gY3Vyc29yOwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmlzVGFnID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKSB7CisJLy8Jc3VtbWFyeQorCS8vCUxpa2UgZG9qby5kb20uaXNUYWcsIGV4Y2VwdCBjYXNlLWluc2Vuc2l0aXZlCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZihub2RlICYmIG5vZGUudGFnTmFtZSkgeworCQlmb3IgKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCWlmIChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09U3RyaW5nKGFyZ3VtZW50c1tpXSkudG9Mb3dlckNhc2UoKSl7CisJCQkJcmV0dXJuIFN0cmluZyhhcmd1bWVudHNbaV0pLnRvTG93ZXJDYXNlKCk7CS8vCXN0cmluZworCQkJfQorCQl9CisJfQorCXJldHVybiAiIjsJLy8Jc3RyaW5nCit9CisKKy8vZGVmaW5lIGRvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQgZm9yIElFIHRvIHdvcmthcm91bmQgdGhlIGFubm95aW5nIGFjdGl2YXRpb24gImZlYXR1cmUiIGluIG5ldyBJRQorLy9kZXRhaWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS93b3Jrc2hvcC9hdXRob3IvZGh0bWwvb3ZlcnZpZXcvYWN0aXZhdGluZ19hY3RpdmV4LmFzcAoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiAhZG9qby5yZW5kZXIuaHRtbC5pZTcwKXsKKwkvL29ubHkgZGVmaW5lIGNyZWF0ZUV4dGVybmFsRWxlbWVudCBmb3IgSUUgaW4gbm9uZSBodHRwcyB0byBhdm9pZCAibWl4ZWQgY29udGVudCIgd2FybmluZyBkaWFsb2cKKwlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIoMCw2KS50b0xvd2VyQ2FzZSgpICE9ICJodHRwczoiKXsKKwkJKGZ1bmN0aW9uKCl7CisJCQkvLyBGSVhNRTogdGhpcyBzZWVtcyBub3QgdG8gd29yayBjb3JyZWN0bHkgb24gSUUgNyEhCisKKwkJCS8vVGhlIHRyaWNrIGlzIHRvIGRlZmluZSBhIGZ1bmN0aW9uIGluIGEgc2NyaXB0LnNyYyBwcm9wZXJ0eToKKwkJCS8vIDxzY3JpcHQgc3JjPSJqYXZhc2NyaXB0OidmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbEVsZW1lbnQoKXsuLi59JyI+PC9zY3JpcHQ+LAorCQkJLy93aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gZXh0ZXJuYWwgamF2YXNjcmlwdCBmaWxlIGluIElFCisJCQl2YXIgeHNjcmlwdCA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisJCQl4c2NyaXB0LnNyYyA9ICJqYXZhc2NyaXB0Oidkb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50PWZ1bmN0aW9uKGRvYywgdGFnKXsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7IH0nIjsKKwkJCWRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh4c2NyaXB0KTsKKwkJfSkoKTsKKwl9Cit9ZWxzZXsKKwkvL2ZvciBvdGhlciBicm93c2Vycywgc2ltcGx5IHVzZSBkb2N1bWVudC5jcmVhdGVFbGVtZW50CisJLy9pcyBlbm91Z2gKKwlkb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50ID0gZnVuY3Rpb24oLyogSFRNTERvY3VtZW50ICovZG9jLCAvKiBzdHJpbmcgKi90YWcpeworCQkvLwlzdW1tYXJ5CisJCS8vCUNyZWF0ZXMgYW4gZWxlbWVudCBpbiB0aGUgSFRNTCBkb2N1bWVudCwgaGVyZSBmb3IgQWN0aXZlWCBhY3RpdmF0aW9uIHdvcmthcm91bmQuCisJCXJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWcpOwkvLwlIVE1MRWxlbWVudAorCX0KK30KKworZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCA9IGZ1bmN0aW9uKGluRnVuYywgcmVwbEZ1bmMsIGFyZ3MsIGFyZ05hbWUsIHJldFZhbHVlKXsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC4iICsgaW5GdW5jLAorCQkJCQkicmVwbGFjZWQgYnkgZG9qby5odG1sLiIgKyByZXBsRnVuYyArICIoIiArIChhcmdOYW1lID8gIm5vZGUsIHsiKyBhcmdOYW1lICsgIjogIiArIGFyZ05hbWUgKyAifSIgOiAiIiApICsgIikiICsgKHJldFZhbHVlID8gIi4iICsgcmV0VmFsdWUgOiAiIiksICIwLjUiKTsKKwl2YXIgbmV3QXJncyA9IFtdOworCWlmKGFyZ05hbWUpeyB2YXIgYXJnc0luID0ge307IGFyZ3NJblthcmdOYW1lXSA9IGFyZ3NbMV07IG5ld0FyZ3MucHVzaChhcmdzWzBdKTsgbmV3QXJncy5wdXNoKGFyZ3NJbik7IH0KKwllbHNlIHsgbmV3QXJncyA9IGFyZ3MgfQorCXZhciByZXQgPSBkb2pvLmh0bWxbcmVwbEZ1bmNdLmFwcGx5KGRvam8uaHRtbCwgYXJncyk7CisJaWYocmV0VmFsdWUpeyByZXR1cm4gcmV0W3JldFZhbHVlXTsgfQorCWVsc2UgeyByZXR1cm4gcmV0OyB9Cit9CisKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydFdpZHRoID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Vmlld3BvcnRXaWR0aCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnRIZWlnaHQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRWaWV3cG9ydEhlaWdodCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldFZpZXdwb3J0U2l6ZSA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFZpZXdwb3J0U2l6ZSIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cyk7Cit9Citkb2pvLmh0bWwuZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsVG9wIiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgInRvcCIpOworfQorZG9qby5odG1sLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxMZWZ0IiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgImxlZnQiKTsKK30KK2Rvam8uaHRtbC5nZXRTY3JvbGxPZmZzZXQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxPZmZzZXQiLCAiZ2V0U2Nyb2xsIiwgYXJndW1lbnRzLCBudWxsLCAib2Zmc2V0Iik7Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby51cmkuVXJpIik7CisKK2Rvam8udXJpID0gbmV3IGZ1bmN0aW9uKCkgeworCXRoaXMuZG9qb1VyaSA9IGZ1bmN0aW9uICgvKmRvam8udXJpLlVyaXx8U3RyaW5nKi91cmkpIHsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyBhIFVyaSBvYmplY3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGRvam8gcm9vdAorCQlyZXR1cm4gbmV3IGRvam8udXJpLlVyaShkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpLCB1cmkpOworCX0KKworCXRoaXMubW9kdWxlVXJpID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypkb2pvLnVyaS5Vcml8fFN0cmluZyovdXJpKXsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyBhIFVyaSBvYmplY3QgcmVsYXRpdmUgdG8gYSBtb2R1bGUKKwkJLy8gZGVzY3JpcHRpb246IEV4YW1wbGVzOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL3RlbXBsYXRlLmh0bWwiKSwgb3IgZG9qby51cmkubW9kdWxlVXJpKCJhY21lIiwiaW1hZ2VzL3NtYWxsLnBuZyIpCisJCXZhciBsb2MgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGUpLmpvaW4oJy8nKTsKKwkJaWYoIWxvYyl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZihsb2MubGFzdEluZGV4T2YoIi8iKSAhPSBsb2MubGVuZ3RoLTEpeworCQkJbG9jICs9ICIvIjsKKwkJfQorCQkKKwkJLy9JZiB0aGUgcGF0aCBpcyBhbiBhYnNvbHV0ZSBwYXRoIChzdGFydHMgd2l0aCBhIC8gb3IgaXMgb24gYW5vdGhlciBkb21haW4veGRvbWFpbikKKwkJLy90aGVuIGRvbid0IGFkZCB0aGUgYmFzZVNjcmlwdFVyaS4KKwkJdmFyIGNvbG9uSW5kZXggPSBsb2MuaW5kZXhPZigiOiIpOworCQl2YXIgc2xhc2hJbmRleCA9IGxvYy5pbmRleE9mKCIvIik7CisJCWlmKGxvYy5jaGFyQXQoMCkgIT0gIi8iICYmIChjb2xvbkluZGV4ID09IC0xIHx8IGNvbG9uSW5kZXggPiBzbGFzaEluZGV4KSl7CisJCQlsb2MgPSBkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpICsgbG9jOworCQl9CisKKwkJcmV0dXJuIG5ldyBkb2pvLnVyaS5VcmkobG9jLHVyaSk7CisJfQorCisJdGhpcy5VcmkgPSBmdW5jdGlvbiAoLypkb2pvLnVyaS5Vcml8fFN0cmluZy4uLiovKSB7CisJCS8vIHN1bW1hcnk6IENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgVVJJLgorCQkvLyBkZXNjcmlwdGlvbjogCisJCS8vICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCBpbiBvcmRlciByZWxhdGl2ZSB0byB0aGUgbmV4dCB1bnRpbAorCQkvLyAgYSBjYW5vbmljYWwgdXJpIGlzIHByb2R1Y2VkLiBUbyBnZXQgYW4gYWJzb2x1dGUgVXJpIHJlbGF0aXZlCisJCS8vICB0byB0aGUgY3VycmVudCBkb2N1bWVudCB1c2UKKwkJLy8gICAgICBuZXcgZG9qby51cmkuVXJpKGRvY3VtZW50LmJhc2VVUkksIHVyaSkKKworCQkvLyBUT0RPOiBzdXBwb3J0IGZvciBJUHY2LCBzZWUgUkZDIDI3MzIKKworCQkvLyByZXNvbHZlIHVyaSBjb21wb25lbnRzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIKKwkJdmFyIHVyaSA9IGFyZ3VtZW50c1swXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmKCFhcmd1bWVudHNbaV0pIHsgY29udGludWU7IH0KKworCQkJLy8gU2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLmNvbnN0cnVjdG9yIHNvIHdlIGhhdmUgdG8gYmUgZXhwbGljaXQKKwkJCXZhciByZWxvYmogPSBuZXcgZG9qby51cmkuVXJpKGFyZ3VtZW50c1tpXS50b1N0cmluZygpKTsKKwkJCXZhciB1cmlvYmogPSBuZXcgZG9qby51cmkuVXJpKHVyaS50b1N0cmluZygpKTsKKworCQkJaWYgKChyZWxvYmoucGF0aD09IiIpJiYocmVsb2JqLnNjaGVtZT09bnVsbCkmJihyZWxvYmouYXV0aG9yaXR5PT1udWxsKSYmKHJlbG9iai5xdWVyeT09bnVsbCkpIHsKKwkJCQlpZiAocmVsb2JqLmZyYWdtZW50ICE9IG51bGwpIHsgdXJpb2JqLmZyYWdtZW50ID0gcmVsb2JqLmZyYWdtZW50OyB9CisJCQkJcmVsb2JqID0gdXJpb2JqOworCQkJfSBlbHNlIGlmIChyZWxvYmouc2NoZW1lID09IG51bGwpIHsKKwkJCQlyZWxvYmouc2NoZW1lID0gdXJpb2JqLnNjaGVtZTsKKworCQkJCWlmIChyZWxvYmouYXV0aG9yaXR5ID09IG51bGwpIHsKKwkJCQkJcmVsb2JqLmF1dGhvcml0eSA9IHVyaW9iai5hdXRob3JpdHk7CisKKwkJCQkJaWYgKHJlbG9iai5wYXRoLmNoYXJBdCgwKSAhPSAiLyIpIHsKKwkJCQkJCXZhciBwYXRoID0gdXJpb2JqLnBhdGguc3Vic3RyaW5nKDAsCisJCQkJCQkJdXJpb2JqLnBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpICsgcmVsb2JqLnBhdGg7CisKKwkJCQkJCXZhciBzZWdzID0gcGF0aC5zcGxpdCgiLyIpOworCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBzZWdzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJaWYgKHNlZ3Nbal0gPT0gIi4iKSB7CisJCQkJCQkJCWlmIChqID09IHNlZ3MubGVuZ3RoIC0gMSkgeyBzZWdzW2pdID0gIiI7IH0KKwkJCQkJCQkJZWxzZSB7IHNlZ3Muc3BsaWNlKGosIDEpOyBqLS07IH0KKwkJCQkJCQl9IGVsc2UgaWYgKGogPiAwICYmICEoaiA9PSAxICYmIHNlZ3NbMF0gPT0gIiIpICYmCisJCQkJCQkJCXNlZ3Nbal0gPT0gIi4uIiAmJiBzZWdzW2otMV0gIT0gIi4uIikgeworCisJCQkJCQkJCWlmIChqID09IHNlZ3MubGVuZ3RoIC0gMSkgeyBzZWdzLnNwbGljZShqLCAxKTsgc2Vnc1tqIC0gMV0gPSAiIjsgfQorCQkJCQkJCQllbHNlIHsgc2Vncy5zcGxpY2UoaiAtIDEsIDIpOyBqIC09IDI7IH0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZWxvYmoucGF0aCA9IHNlZ3Muam9pbigiLyIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQl1cmkgPSAiIjsKKwkJCWlmIChyZWxvYmouc2NoZW1lICE9IG51bGwpIHsgdXJpICs9IHJlbG9iai5zY2hlbWUgKyAiOiI7IH0KKwkJCWlmIChyZWxvYmouYXV0aG9yaXR5ICE9IG51bGwpIHsgdXJpICs9ICIvLyIgKyByZWxvYmouYXV0aG9yaXR5OyB9CisJCQl1cmkgKz0gcmVsb2JqLnBhdGg7CisJCQlpZiAocmVsb2JqLnF1ZXJ5ICE9IG51bGwpIHsgdXJpICs9ICI/IiArIHJlbG9iai5xdWVyeTsgfQorCQkJaWYgKHJlbG9iai5mcmFnbWVudCAhPSBudWxsKSB7IHVyaSArPSAiIyIgKyByZWxvYmouZnJhZ21lbnQ7IH0KKwkJfQorCisJCXRoaXMudXJpID0gdXJpLnRvU3RyaW5nKCk7CisKKwkJLy8gYnJlYWsgdGhlIHVyaSBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHMKKwkJdmFyIHJlZ2V4cCA9ICJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/JCI7CisJCXZhciByID0gdGhpcy51cmkubWF0Y2gobmV3IFJlZ0V4cChyZWdleHApKTsKKworCQl0aGlzLnNjaGVtZSA9IHJbMl0gfHwgKHJbMV0gPyAiIiA6IG51bGwpOworCQl0aGlzLmF1dGhvcml0eSA9IHJbNF0gfHwgKHJbM10gPyAiIiA6IG51bGwpOworCQl0aGlzLnBhdGggPSByWzVdOyAvLyBjYW4gbmV2ZXIgYmUgdW5kZWZpbmVkCisJCXRoaXMucXVlcnkgPSByWzddIHx8IChyWzZdID8gIiIgOiBudWxsKTsKKwkJdGhpcy5mcmFnbWVudCAgPSByWzldIHx8IChyWzhdID8gIiIgOiBudWxsKTsKKworCQlpZiAodGhpcy5hdXRob3JpdHkgIT0gbnVsbCkgeworCQkJLy8gc2VydmVyIGJhc2VkIG5hbWluZyBhdXRob3JpdHkKKwkJCXJlZ2V4cCA9ICJeKCgoW146XSs6KT8oW15AXSspKUApPyhbXjpdKikoOihbMC05XSspKT8kIjsKKwkJCXIgPSB0aGlzLmF1dGhvcml0eS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCisJCQl0aGlzLnVzZXIgPSByWzNdIHx8IG51bGw7CisJCQl0aGlzLnBhc3N3b3JkID0gcls0XSB8fCBudWxsOworCQkJdGhpcy5ob3N0ID0gcls1XTsKKwkJCXRoaXMucG9ydCA9IHJbN10gfHwgbnVsbDsKKwkJfQorCisJCXRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy51cmk7IH0KKwl9Cit9OworCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5zdHlsZSIpOworCisKKworZG9qby5odG1sLmdldENsYXNzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBsaXN0IG9mIENTUyBjbGFzc2VzIGN1cnJlbnRseSBhc3NpZ25lZCBkaXJlY3RseSAKKwkvLwl0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kOworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYoIW5vZGUpeyByZXR1cm4gIiI7IH0KKwl2YXIgY3MgPSAiIjsKKwlpZihub2RlLmNsYXNzTmFtZSl7CisJCWNzID0gbm9kZS5jbGFzc05hbWU7CisJfWVsc2UgaWYoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShub2RlLCAiY2xhc3MiKSl7CisJCWNzID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShub2RlLCAiY2xhc3MiKTsKKwl9CisJcmV0dXJuIGNzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSkgeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIGFuIGFycmF5IG9mIENTUyBjbGFzc2VzIGN1cnJlbnRseSBhc3NpZ25lZCBkaXJlY3RseSB0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4gCisJLy8JUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBubyBjbGFzc2VzIGFyZSBmb3VuZDsKKwl2YXIgYyA9IGRvam8uaHRtbC5nZXRDbGFzcyhub2RlKTsKKwlyZXR1cm4gKGMgPT0gIiIpID8gW10gOiBjLnNwbGl0KC9ccysvZyk7CS8vCWFycmF5Cit9CisKK2Rvam8uaHRtbC5oYXNDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovY2xhc3NuYW1lKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGNsYXNzbmFtZSBpcyBhIHBvcnRpb24gb2YgdGhlCisJLy8JY2xhc3MgbGlzdCBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgbm9kZS4gRG9lcyBub3QgY292ZXIgY2FzY2FkZWQKKwkvLwlzdHlsZXMsIG9ubHkgY2xhc3NlcyBkaXJlY3RseSBhcHBsaWVkIHRvIHRoZSBub2RlLgorCXJldHVybiAobmV3IFJlZ0V4cCgnKF58XFxzKyknK2NsYXNzbmFtZSsnKFxccyt8JCknKSkudGVzdChkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSkpCS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnByZXBlbmRDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovY2xhc3NTdHIpeworCS8vCXN1bW1hcnkKKwkvLwlBZGRzIHRoZSBzcGVjaWZpZWQgY2xhc3MgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2xhc3MgbGlzdCBvbiB0aGUKKwkvLwlwYXNzZWQgbm9kZS4gVGhpcyBnaXZlcyB0aGUgc3BlY2lmaWVkIGNsYXNzIHRoZSBoaWdoZXN0IHByZWNpZGVuY2UKKwkvLwl3aGVuIHN0eWxlIGNhc2NhZGluZyBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbm9kZS4gUmV0dXJucyB0cnVlIG9yCisJLy8JZmFsc2U7IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBvcGVyYXRpb24sIHJlc3BlY3RpdmVseS4KKwljbGFzc1N0ciArPSAiICIgKyBkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSk7CisJcmV0dXJuIGRvam8uaHRtbC5zZXRDbGFzcyhub2RlLCBjbGFzc1N0cik7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLmFkZENsYXNzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9jbGFzc1N0cil7CisJLy8Jc3VtbWFyeQorCS8vCUFkZHMgdGhlIHNwZWNpZmllZCBjbGFzcyB0byB0aGUgZW5kIG9mIHRoZSBjbGFzcyBsaXN0IG9uIHRoZQorCS8vCXBhc3NlZCAmbm9kZTsuIFJldHVybnMgJnRydWU7IG9yICZmYWxzZTsgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCisJaWYgKGRvam8uaHRtbC5oYXNDbGFzcyhub2RlLCBjbGFzc1N0cikpIHsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisJY2xhc3NTdHIgPSAoZG9qby5odG1sLmdldENsYXNzKG5vZGUpICsgIiAiICsgY2xhc3NTdHIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTsKKwlyZXR1cm4gZG9qby5odG1sLnNldENsYXNzKG5vZGUsIGNsYXNzU3RyKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwuc2V0Q2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2NsYXNzU3RyKXsKKwkvLwlzdW1tYXJ5CisJLy8JQ2xvYmJlcnMgdGhlIGV4aXN0aW5nIGxpc3Qgb2YgY2xhc3NlcyBmb3IgdGhlIG5vZGUsIHJlcGxhY2luZyBpdCB3aXRoCisJLy8JdGhlIGxpc3QgZ2l2ZW4gaW4gdGhlIDJuZCBhcmd1bWVudC4gUmV0dXJucyB0cnVlIG9yIGZhbHNlCisJLy8JaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgY3MgPSBuZXcgU3RyaW5nKGNsYXNzU3RyKTsKKwl0cnl7CisJCWlmKHR5cGVvZiBub2RlLmNsYXNzTmFtZSA9PSAic3RyaW5nIil7CisJCQlub2RlLmNsYXNzTmFtZSA9IGNzOworCQl9ZWxzZSBpZihub2RlLnNldEF0dHJpYnV0ZSl7CisJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBjbGFzc1N0cik7CisJCQlub2RlLmNsYXNzTmFtZSA9IGNzOworCQl9ZWxzZXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX1jYXRjaChlKXsKKwkJZG9qby5kZWJ1ZygiZG9qby5odG1sLnNldENsYXNzKCkgZmFpbGVkIiwgZSk7CisJfQorCXJldHVybiB0cnVlOworfQorCitkb2pvLmh0bWwucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2NsYXNzU3RyLCAvKiBib29sZWFuPyAqL2FsbG93UGFydGlhbE1hdGNoZXMpeworCS8vCXN1bW1hcnkKKwkvLwlSZW1vdmVzIHRoZSBjbGFzc05hbWUgZnJvbSB0aGUgbm9kZTsuIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKwl0cnl7CisJCWlmICghYWxsb3dQYXJ0aWFsTWF0Y2hlcykgeworCQkJdmFyIG5ld2NzID0gZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxzKyknK2NsYXNzU3RyKycoXFxzK3wkKScpLCAiJDEkMiIpOworCQl9IGVsc2UgeworCQkJdmFyIG5ld2NzID0gZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UoY2xhc3NTdHIsJycpOworCQl9CisJCWRvam8uaHRtbC5zZXRDbGFzcyhub2RlLCBuZXdjcyk7CisJfWNhdGNoKGUpeworCQlkb2pvLmRlYnVnKCJkb2pvLmh0bWwucmVtb3ZlQ2xhc3MoKSBmYWlsZWQiLCBlKTsKKwl9CisJcmV0dXJuIHRydWU7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnJlcGxhY2VDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovbmV3Q2xhc3MsIC8qIHN0cmluZyAqL29sZENsYXNzKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJlcGxhY2VzICdvbGRDbGFzcycgYW5kIGFkZHMgJ25ld0NsYXNzJyB0byBub2RlCisJZG9qby5odG1sLnJlbW92ZUNsYXNzKG5vZGUsIG9sZENsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSwgbmV3Q2xhc3MpOworfQorCisvLyBFbnVtIHR5cGUgZm9yIGdldEVsZW1lbnRzQnlDbGFzcyBjbGFzc01hdGNoVHlwZSBhcmc6Citkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUgPSB7CisJQ29udGFpbnNBbGwgOiAwLCAvLyBhbGwgb2YgdGhlIGNsYXNzZXMgYXJlIHBhcnQgb2YgdGhlIG5vZGUncyBjbGFzcyAoZGVmYXVsdCkKKwlDb250YWluc0FueSA6IDEsIC8vIGFueSBvZiB0aGUgY2xhc3NlcyBhcmUgcGFydCBvZiB0aGUgbm9kZSdzIGNsYXNzCisJSXNPbmx5IDogMiAvLyBvbmx5IGFsbCBvZiB0aGUgY2xhc3NlcyBhcmUgcGFydCBvZiB0aGUgbm9kZSdzIGNsYXNzCit9CisKKworZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzcyA9IGZ1bmN0aW9uKAorCS8qIHN0cmluZyAqL2NsYXNzU3RyLCAKKwkvKiBIVE1MRWxlbWVudD8gKi9wYXJlbnQsIAorCS8qIHN0cmluZz8gKi9ub2RlVHlwZSwgCisJLyogaW50ZWdlcj8gKi9jbGFzc01hdGNoVHlwZSwgCisJLyogYm9vbGVhbj8gKi91c2VOb25YcGF0aAorKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyBhbiBhcnJheSBvZiBub2RlcyBmb3IgdGhlIGdpdmVuIGNsYXNzU3RyLCBjaGlsZHJlbiBvZiBhCisJLy8JcGFyZW50LCBhbmQgb3B0aW9uYWxseSBvZiBhIGNlcnRhaW4gbm9kZVR5cGUKKwkvLyBGSVhNRTogdGVtcG9yYXJpbHkgc2V0IHRvIGZhbHNlIGJlY2F1c2Ugb2Ygc2V2ZXJhbCBkb2pvIHRpY2tldHMgcmVsYXRlZAorCS8vIHRvIHRoZSB4cGF0aCB2ZXJzaW9uIG5vdCB3b3JraW5nIGNvbnNpc3RlbnRseSBpbiBmaXJlZm94LgorCXVzZU5vblhwYXRoID0gZmFsc2U7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJcGFyZW50ID0gZG9qby5ieUlkKHBhcmVudCkgfHwgX2RvY3VtZW50OworCXZhciBjbGFzc2VzID0gY2xhc3NTdHIuc3BsaXQoL1xzKy9nKTsKKwl2YXIgbm9kZXMgPSBbXTsKKwlpZiggY2xhc3NNYXRjaFR5cGUgIT0gMSAmJiBjbGFzc01hdGNoVHlwZSAhPSAyICkgY2xhc3NNYXRjaFR5cGUgPSAwOyAvLyBtYWtlIGl0IGVudW0KKwl2YXIgcmVDbGFzcyA9IG5ldyBSZWdFeHAoIihcXHN8XikoKCIgKyBjbGFzc2VzLmpvaW4oIil8KCIpICsgIikpKFxcc3wkKSIpOworCXZhciBzcnRMZW5ndGggPSBjbGFzc2VzLmpvaW4oIiAiKS5sZW5ndGg7CisJdmFyIGNhbmRpZGF0ZU5vZGVzID0gW107CisJCisJaWYoIXVzZU5vblhwYXRoICYmIF9kb2N1bWVudC5ldmFsdWF0ZSkgeyAvLyBzdXBwb3J0cyBkb20gMyB4cGF0aAorCQl2YXIgeHBhdGggPSAiLi8vIiArIChub2RlVHlwZSB8fCAiKiIpICsgIltjb250YWlucygiOworCQlpZihjbGFzc01hdGNoVHlwZSAhPSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpeworCQkJeHBhdGggKz0gImNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIiArCisJCQljbGFzc2VzLmpvaW4oIiAnKSBhbmQgY29udGFpbnMoY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiKSArCisJCQkiICcpIjsKKwkJCWlmIChjbGFzc01hdGNoVHlwZSA9PSAyKSB7CisJCQkJeHBhdGggKz0gIiBhbmQgc3RyaW5nLWxlbmd0aChAY2xhc3MpPSIrc3J0TGVuZ3RoKyJdIjsKKwkJCX1lbHNleworCQkJCXhwYXRoICs9ICJdIjsKKwkJCX0KKwkJfWVsc2V7CisJCQl4cGF0aCArPSAiY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiICsKKwkJCWNsYXNzZXMuam9pbigiICcpIG9yIGNvbnRhaW5zKGNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIikgKworCQkJIiAnKV0iOworCQl9CisJCXZhciB4cGF0aFJlc3VsdCA9IF9kb2N1bWVudC5ldmFsdWF0ZSh4cGF0aCwgcGFyZW50LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7CisJCXZhciByZXN1bHQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpOworCQl3aGlsZShyZXN1bHQpeworCQkJdHJ5eworCQkJCWNhbmRpZGF0ZU5vZGVzLnB1c2gocmVzdWx0KTsKKwkJCQlyZXN1bHQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpOworCQkJfWNhdGNoKGUpeyBicmVhazsgfQorCQl9CisJCXJldHVybiBjYW5kaWRhdGVOb2RlczsJLy8JTm9kZUxpc3QKKwl9ZWxzZXsKKwkJaWYoIW5vZGVUeXBlKXsKKwkJCW5vZGVUeXBlID0gIioiOworCQl9CisJCWNhbmRpZGF0ZU5vZGVzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5vZGVUeXBlKTsKKworCQl2YXIgbm9kZSwgaSA9IDA7CisJCW91dGVyOgorCQl3aGlsZShub2RlID0gY2FuZGlkYXRlTm9kZXNbaSsrXSl7CisJCQl2YXIgbm9kZUNsYXNzZXMgPSBkb2pvLmh0bWwuZ2V0Q2xhc3Nlcyhub2RlKTsKKwkJCWlmKG5vZGVDbGFzc2VzLmxlbmd0aCA9PSAwKXsgY29udGludWUgb3V0ZXI7IH0KKwkJCXZhciBtYXRjaGVzID0gMDsKKwkKKwkJCWZvcih2YXIgaiA9IDA7IGogPCBub2RlQ2xhc3Nlcy5sZW5ndGg7IGorKyl7CisJCQkJaWYocmVDbGFzcy50ZXN0KG5vZGVDbGFzc2VzW2pdKSl7CisJCQkJCWlmKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FueSl7CisJCQkJCQlub2Rlcy5wdXNoKG5vZGUpOworCQkJCQkJY29udGludWUgb3V0ZXI7CisJCQkJCX1lbHNleworCQkJCQkJbWF0Y2hlcysrOworCQkJCQl9CisJCQkJfWVsc2V7CisJCQkJCWlmKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Jc09ubHkpeworCQkJCQkJY29udGludWUgb3V0ZXI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCisJCQlpZihtYXRjaGVzID09IGNsYXNzZXMubGVuZ3RoKXsKKwkJCQlpZigJKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Jc09ubHkpJiYKKwkJCQkJKG1hdGNoZXMgPT0gbm9kZUNsYXNzZXMubGVuZ3RoKSl7CisJCQkJCW5vZGVzLnB1c2gobm9kZSk7CisJCQkJfWVsc2UgaWYoY2xhc3NNYXRjaFR5cGUgPT0gZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlLkNvbnRhaW5zQWxsKXsKKwkJCQkJbm9kZXMucHVzaChub2RlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG5vZGVzOwkvLwlOb2RlTGlzdAorCX0KK30KK2Rvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzczsKKworZG9qby5odG1sLnRvQ2FtZWxDYXNlID0gZnVuY3Rpb24oLyogc3RyaW5nICovc2VsZWN0b3IpeworCS8vCXN1bW1hcnkKKwkvLwlUcmFuc2xhdGVzIGEgQ1NTIHNlbGVjdG9yIHN0cmluZyB0byBhIGNhbWVsLWNhc2VkIG9uZS4KKwl2YXIgYXJyID0gc2VsZWN0b3Iuc3BsaXQoJy0nKSwgY2MgPSBhcnJbMF07CisJZm9yKHZhciBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeworCQljYyArPSBhcnJbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhcnJbaV0uc3Vic3RyaW5nKDEpOworCX0KKwlyZXR1cm4gY2M7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwudG9TZWxlY3RvckNhc2UgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zZWxlY3Rvcil7CisJLy8Jc3VtbWFyeQorCS8vCVRyYW5zbGF0ZXMgYSBjYW1lbCBjYXNlZCBzdHJpbmcgdG8gYSBzZWxlY3RvciBjYXNlZCBvbmUuCisJcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOwkvLwlzdHJpbmcKK30KKworaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkvLyBJRSBicmFuY2gKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKC8qSFRNTEVsZW1lbnR8U3RyaW5nKi9ub2RlLCAvKlN0cmluZyovcHJvcGVydHksIC8qU3RyaW5nKi92YWx1ZSkgeworCQkvLyBzdW1tYXJ5CisJCS8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgdmFsdWUgZm9yIHN0eWxlICJwcm9wZXJ0eSIgb24gIm5vZGUiIChJRSkuCisJCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7IC8vIEZJWE1FOiByZW1vdmUgYWJpbGl0eSB0byBhY2Nlc3Mgbm9kZXMgYnkgaWQgZm9yIHRoaXMgdGltZS1jcml0aWNhbCBmdW5jdGlvbgorCQlpZighbm9kZSB8fCAhbm9kZS5jdXJyZW50U3R5bGUpe3JldHVybiB2YWx1ZTt9CisJCS8vIEZJWE1FOiBzdGFuZGFyZGl6ZSBvbiBjYW1lbC1jYXNlIGlucHV0IHRvIGltcHJvdmUgc3BlZWQKKwkJcmV0dXJuIG5vZGUuY3VycmVudFN0eWxlW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShwcm9wZXJ0eSldOyAvLyBTdHJpbmcKKwl9CisJLy8gU0pNOiBnZXRDb21wdXRlZFN0eWxlIHNob3VsZCBiZSBhYmFuZG9uZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlIGJlbG93IGZ1bmN0aW9uLgorCS8vIEFsbCBvdXIgc3VwcG9ydGVkIGJyb3dzZXJzIGNhbiByZXR1cm4gQ1NTMiBjb21wbGlhbnQgQ3NzU3R5bGVEZWNsYXJhdGlvbiBvYmplY3RzCisJLy8gd2hpY2ggY2FuIGJlIHF1ZXJpZWQgZGlyZWN0bHkgZm9yIG11bHRpcGxlIHN0eWxlcy4KKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZXMgPSBmdW5jdGlvbigvKkhUTUxFbGVtZW50Ki9ub2RlKSB7CisJCS8vIHN1bW1hcnkKKwkJLy8gR2V0IGEgc3R5bGUgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHV0ZWQgc3R5bGVzIGZvciBIVE1MIEVsZW1lbnQgbm9kZSAoSUUpLgorCQlyZXR1cm4gbm9kZS5jdXJyZW50U3R5bGU7IC8vIENTU1N0eWxlRGVjbGFyYXRpb24KKwl9Cit9IGVsc2UgeworCS8vIG5vbi1JRSBicmFuY2gKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKC8qSFRNTEVsZW1lbnR8U3RyaW5nKi9ub2RlLCAvKlN0cmluZyovcHJvcGVydHksIC8qQW55Ki92YWx1ZSkgeworCQkvLyBzdW1tYXJ5CisJCS8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgdmFsdWUgZm9yIHN0eWxlICJwcm9wZXJ0eSIgb24gIm5vZGUiIChub24tSUUpLgorCQlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCQlpZighbm9kZSB8fCAhbm9kZS5zdHlsZSl7cmV0dXJuIHZhbHVlO30KKwkJdmFyIHMgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpOworCQkvLyBzIG1heSBiZSBudWxsIG9uIFNhZmFyaQorCQlyZXR1cm4gKHMmJnNbZG9qby5odG1sLnRvQ2FtZWxDYXNlKHByb3BlcnR5KV0pfHwnJzsgLy8gU3RyaW5nCisJfQkKKwkvLyBTSk06IGdldENvbXB1dGVkU3R5bGUgc2hvdWxkIGJlIGFiYW5kb25lZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUgYmVsb3cgZnVuY3Rpb24uCisJLy8gQWxsIG91ciBzdXBwb3J0ZWQgYnJvd3NlcnMgY2FuIHJldHVybiBDU1MyIGNvbXBsaWFudCBDc3NTdHlsZURlY2xhcmF0aW9uIG9iamVjdHMKKwkvLyB3aGljaCBjYW4gYmUgcXVlcmllZCBkaXJlY3RseSBmb3IgbXVsdGlwbGUgc3R5bGVzLgorCWRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlcyA9IGZ1bmN0aW9uKG5vZGUpIHsKKwkJLy8gc3VtbWFyeQorCQkvLyBHZXQgYSBzdHlsZSBvYmplY3QgY29udGFpbmluZyBjb21wdXRlZCBzdHlsZXMgZm9yIEhUTUwgRWxlbWVudCBub2RlIChub24tSUUpLgorCQlyZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTsgLy8gQ1NTU3R5bGVEZWNsYXJhdGlvbgorCX0JCit9CisKK2Rvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9jc3NTZWxlY3Rvcil7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwYXNzZWQgc3R5bGUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXJldHVybiAobm9kZSAmJiBub2RlLnN0eWxlID8gbm9kZS5zdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UoY3NzU2VsZWN0b3IpXSA6IHVuZGVmaW5lZCk7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuZ2V0U3R5bGUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIHBhc3NlZCBzdHlsZQorCXZhciB2YWx1ZSA9IGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsIGNzc1NlbGVjdG9yKTsKKwlyZXR1cm4gKHZhbHVlID8gdmFsdWUgOiBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBjc3NTZWxlY3RvcikpOwkvLwlzdHJpbmcgfHwgaW50ZWdlcgorfQorCitkb2pvLmh0bWwuc2V0U3R5bGUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yLCAvKiBzdHJpbmcgKi92YWx1ZSl7CisJLy8Jc3VtbWFyeQorCS8vCVNldCB0aGUgdmFsdWUgb2YgcGFzc2VkIHN0eWxlIG9uIG5vZGUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKG5vZGUgJiYgbm9kZS5zdHlsZSl7CisJCXZhciBjYW1lbENhc2VkID0gZG9qby5odG1sLnRvQ2FtZWxDYXNlKGNzc1NlbGVjdG9yKTsKKwkJbm9kZS5zdHlsZVtjYW1lbENhc2VkXSA9IHZhbHVlOworCX0KK30KKworZG9qby5odG1sLnNldFN0eWxlVGV4dCA9IGZ1bmN0aW9uICgvKiBIVE1MRWxlbWVudCAqL3RhcmdldCwgLyogc3RyaW5nICovdGV4dCkgeworCS8vCXN1bW1hcnkKKwkvLwlUcnkgdG8gc2V0IHRoZSBlbnRpcmUgY3NzVGV4dCBwcm9wZXJ0eSBvZiB0aGUgcGFzc2VkIHRhcmdldDsgZXF1aXYgb2Ygc2V0dGluZyBzdHlsZSBhdHRyaWJ1dGUuCisJdHJ5IHsKKwkgCXRhcmdldC5zdHlsZS5jc3NUZXh0ID0gdGV4dDsKKwl9IGNhdGNoIChlKSB7CisJCXRhcmdldC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgdGV4dCk7CisJfQorfQorCitkb2pvLmh0bWwuY29weVN0eWxlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi90YXJnZXQsIC8qIEhUTUxFbGVtZW50ICovc291cmNlKXsKKwkvLwlzdW1tYXJ5CisJLy8gd29yayBhcm91bmQgZm9yIG9wZXJhIHdoaWNoIGRvZXNuJ3QgaGF2ZSBjc3NUZXh0LCBhbmQgZm9yIElFIHdoaWNoIGZhaWxzIG9uIHNldEF0dHJpYnV0ZSAKKwlpZighc291cmNlLnN0eWxlLmNzc1RleHQpeyAKKwkJdGFyZ2V0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzb3VyY2UuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKTsgCisJfWVsc2V7CisJCXRhcmdldC5zdHlsZS5jc3NUZXh0ID0gc291cmNlLnN0eWxlLmNzc1RleHQ7IAorCX0KKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGFyZ2V0LCBkb2pvLmh0bWwuZ2V0Q2xhc3Moc291cmNlKSk7Cit9CisKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yLCAvKiBib29sZWFuPyAqL2F1dG9Jc1plcm8peworCS8vCXN1bW1hcnkKKwkvLwlHZXQgdGhlIHZhbHVlIG9mIHBhc3NlZCBzZWxlY3Rvciwgd2l0aCB0aGUgc3BlY2lmaWMgdW5pdHMgdXNlZAorCXZhciBzID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgY3NzU2VsZWN0b3IpOworCWlmKCghcyl8fCgocyA9PSAnYXV0bycpJiYoYXV0b0lzWmVybykpKXsgCisJCXJldHVybiB7IHZhbHVlOiAwLCB1bml0czogJ3B4JyB9OwkvLwlvYmplY3QgCisJfQorCS8vIEZJWE1FOiBpcyByZWdleCBpbmVmZmljaWVudCB2cy4gcGFyc2VJbnQgb3Igc29tZSBtYW51YWwgdGVzdD8gCisJdmFyIG1hdGNoID0gcy5tYXRjaCgvKFwtP1tcZC5dKykoW2EteiVdKikvaSk7CisJaWYgKCFtYXRjaCl7cmV0dXJuIGRvam8uaHRtbC5nZXRVbml0VmFsdWUuYmFkO30KKwlyZXR1cm4geyB2YWx1ZTogTnVtYmVyKG1hdGNoWzFdKSwgdW5pdHM6IG1hdGNoWzJdLnRvTG93ZXJDYXNlKCkgfTsJLy8Jb2JqZWN0Cit9Citkb2pvLmh0bWwuZ2V0VW5pdFZhbHVlLmJhZCA9IHsgdmFsdWU6IE5hTiwgdW5pdHM6ICcnIH07CisKK2lmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJLy8gSUUgYnJhbmNoCisJZG9qby5odG1sLnRvUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovZWxlbWVudCwgLyogU3RyaW5nICovc3R5bGVWYWx1ZSl7CisJCS8vIHN1bW1hcnkKKwkJLy8gIEV4dHJhY3QgdmFsdWUgaW4gcGl4ZWxzIGZyb20gc3R5bGVWYWx1ZSAoSUUgdmVyc2lvbikuCisJCS8vICBJZiBhIHZhbHVlIGNhbm5vdCBiZSBleHRyYWN0ZWQsIHplcm8gaXMgcmV0dXJuZWQuCisJCWlmKCFzdHlsZVZhbHVlKXtyZXR1cm4gMDt9CisJCWlmKHN0eWxlVmFsdWUuc2xpY2UoLTIpID09ICdweCcpe3JldHVybiBwYXJzZUZsb2F0KHN0eWxlVmFsdWUpO30KKwkJdmFyIHBpeGVsVmFsdWUgPSAwOworCQl3aXRoKGVsZW1lbnQpeworCQkJdmFyIHNMZWZ0ID0gc3R5bGUubGVmdDsKKwkJCXZhciByc0xlZnQgPSBydW50aW1lU3R5bGUubGVmdDsKKwkJCXJ1bnRpbWVTdHlsZS5sZWZ0ID0gY3VycmVudFN0eWxlLmxlZnQ7CisJCQl0cnkgeworCQkJCXN0eWxlLmxlZnQgPSBzdHlsZVZhbHVlIHx8IDA7CisJCQkJcGl4ZWxWYWx1ZSA9IHN0eWxlLnBpeGVsTGVmdDsKKwkJCQlzdHlsZS5sZWZ0ID0gc0xlZnQ7CisJCQkJcnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CisJCQl9Y2F0Y2goZSl7CisJCQkJLy8gRklYTUU6IGl0J3MgcG9zc2libGUgZm9yIHN0eWxlVmFsdWUgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGgKKwkJCQkvLyBzdHlsZS5sZWZ0LiBJbiBwYXJ0aWN1bGFyLCBib3JkZXIgd2lkdGggdmFsdWVzIG9mIAorCQkJCS8vICJ0aGljayIsICJtZWRpdW0iLCBvciAidGhpbiIgd2lsbCBwcm92b2tlIGFuIGV4Y2VwdGlvbi4KKwkJCX0KKwkJfQorCQlyZXR1cm4gcGl4ZWxWYWx1ZTsgLy8gTnVtYmVyCisJfQorfSBlbHNlIHsKKwkvLyBub24tSUUgYnJhbmNoCisJZG9qby5odG1sLnRvUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovZWxlbWVudCwgLyogU3RyaW5nICovc3R5bGVWYWx1ZSl7CisJCS8vIHN1bW1hcnkKKwkJLy8gIEV4dHJhY3QgdmFsdWUgaW4gcGl4ZWxzIGZyb20gc3R5bGVWYWx1ZSAobm9uLUlFIHZlcnNpb24pLgorCQkvLyAgSWYgYSB2YWx1ZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCB6ZXJvIGlzIHJldHVybmVkLgorCQlyZXR1cm4gKHN0eWxlVmFsdWUgJiYgKHN0eWxlVmFsdWUuc2xpY2UoLTIpPT0ncHgnKSA/IHBhcnNlRmxvYXQoc3R5bGVWYWx1ZSkgOiAwKTsgLy8gTnVtYmVyCisJfQorfQorCitkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovc3R5bGVQcm9wZXJ0eSwgLyogYm9vbGVhbj8gKi9hdXRvSXNaZXJvKXsKKwkvLyBzdW1tYXJ5CisJLy8gIEdldCBhIGNvbXB1dGVkIHN0eWxlIHZhbHVlLCBpbiBwaXhlbHMuCisJLy8gbm9kZTogSFRNTEVsZW1lbnQKKwkvLyAgTm9kZSB0byBpbnRlcnJvZ2F0ZQorCS8vIHN0eWxlUHJvcGVydHk6IFN0cmluZworCS8vICBTdHlsZSBwcm9wZXJ0eSB0byBxdWVyeSwgaW4gZWl0aGVyIGNzcy1zZWxlY3RvciBvciBjYW1lbENhc2UgKHByb3BlcnR5KSBmb3JtYXQuCisJLy8gYXV0b0lzWmVybzogQm9vbGVhbgorCS8vICBEZXByZWNhdGVkLiBBbnkgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIHBpeGVscyBpcyByZXR1cm5lZCBhcyB6ZXJvLgorCS8vIAorCS8vICBzdW1tYXJ5CisJLy8gIEdldCB0aGUgdmFsdWUgb2YgcGFzc2VkIHNlbGVjdG9yIGluIHBpeGVscy4KKwkvLworCXJldHVybiBkb2pvLmh0bWwudG9QaXhlbFZhbHVlKG5vZGUsIGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIHN0eWxlUHJvcGVydHkpKTsKK30gCisKK2Rvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NlbGVjdG9yLCAvKiBpbnRlZ2VyICovdmFsdWUpeworCS8vCXN1bW1hcnkKKwkvLwlBdHRlbXB0IHRvIHNldCB0aGUgdmFsdWUgb2Ygc2VsZWN0b3Igb24gbm9kZSBhcyBhIHBvc2l0aXZlIHBpeGVsIHZhbHVlLgorCWlmKGlzTmFOKHZhbHVlKSl7cmV0dXJuIGZhbHNlO30KKwlub2RlLnN0eWxlW3NlbGVjdG9yXSA9IE1hdGgubWF4KDAsIHZhbHVlKSArICdweCc7IAorCXJldHVybiB0cnVlOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC5zdHlsZVNoZWV0ID0gbnVsbDsKKworLy8gRklYTUU6IHRoaXMgaXMgYSByZWFsbHkgYmFzaWMgc3R1YiBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBjc3NSdWxlcywgYnV0CisvLyBpdCBhc3N1bWVzIHRoYXQgeW91IGtub3cgdGhlIGluZGV4IG9mIHRoZSBjc3NSdWxlIHRoYXQgeW91IHdhbnQgdG8gYWRkIAorLy8gb3IgcmVtb3ZlLCBtYWtpbmcgaXQgbGVzcyB0aGFuIHVzZWZ1bC4gIFNvIHdlIG5lZWQgc29tZXRoaW5nIHRoYXQgY2FuIAorLy8gc2VhcmNoIGZvciB0aGUgc2VsZWN0b3IgdGhhdCB5b3UgeW91IHdhbnQgdG8gcmVtb3ZlLgorZG9qby5odG1sLmluc2VydENzc1J1bGUgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zZWxlY3RvciwgLyogc3RyaW5nICovZGVjbGFyYXRpb24sIC8qIGludGVnZXI/ICovaW5kZXgpIHsKKwkvLwlzdW1tYXJ5CisJLy8JQXR0ZW1wdCB0byBpbnNlcnQgZGVjbGFyYXRpb24gYXMgc2VsZWN0b3Igb24gdGhlIGludGVybmFsIHN0eWxlc2hlZXQ7IGlmIGluZGV4IHRyeSB0byBzZXQgaXQgdGhlcmUuCisJaWYgKCFkb2pvLmh0bWwuc3R5bGVTaGVldCkgeworCQlpZiAoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCkgeyAvLyBJRQorCQkJZG9qby5odG1sLnN0eWxlU2hlZXQgPSBkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KCk7CisJCX0gZWxzZSBpZiAoZG9jdW1lbnQuc3R5bGVTaGVldHNbMF0pIHsgLy8gcmVzdAorCQkJLy8gRklYTUU6IHNob3VsZCBjcmVhdGUgYSBuZXcgc3R5bGUgc2hlZXQgaGVyZQorCQkJLy8gZmFsbCBiYWNrIG9uIGFuIGV4c2l0aW5nIHN0eWxlIHNoZWV0CisJCQlkb2pvLmh0bWwuc3R5bGVTaGVldCA9IGRvY3VtZW50LnN0eWxlU2hlZXRzWzBdOworCQl9IGVsc2UgeyAKKwkJCXJldHVybiBudWxsOwkvLwlpbnRlZ2VyIAorCQl9IC8vIGZhaWwKKwl9CisKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgLy8gaW5kZXggbWF5ID09IDAKKwkJaWYgKGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzKSB7IC8vIFczCisJCQlpbmRleCA9IGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aDsKKwkJfSBlbHNlIGlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcykgeyAvLyBJRQorCQkJaW5kZXggPSBkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcy5sZW5ndGg7CisJCX0gZWxzZSB7IAorCQkJcmV0dXJuIG51bGw7CS8vCWludGVnZXIgCisJCX0gLy8gZmFpbAorCX0KKworCWlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5pbnNlcnRSdWxlKSB7IC8vIFczCisJCXZhciBydWxlID0gc2VsZWN0b3IgKyAiIHsgIiArIGRlY2xhcmF0aW9uICsgIiB9IjsKKwkJcmV0dXJuIGRvam8uaHRtbC5zdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgaW5kZXgpOwkvLwlpbnRlZ2VyCisJfSBlbHNlIGlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKSB7IC8vIElFCisJCXJldHVybiBkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKHNlbGVjdG9yLCBkZWNsYXJhdGlvbiwgaW5kZXgpOwkvLwlpbnRlZ2VyCisJfSBlbHNlIHsgCisJCXJldHVybiBudWxsOyAvLyBpbnRlZ2VyCisJfSAvLyBmYWlsCit9CisKK2Rvam8uaHRtbC5yZW1vdmVDc3NSdWxlID0gZnVuY3Rpb24oLyogaW50ZWdlcj8gKi9pbmRleCl7CisJLy8Jc3VtbWFyeQorCS8vCUF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBydWxlIGF0IGluZGV4LgorCWlmKCFkb2pvLmh0bWwuc3R5bGVTaGVldCl7CisJCWRvam8uZGVidWcoIm5vIHN0eWxlc2hlZXQgZGVmaW5lZCBmb3IgcmVtb3ZpbmcgcnVsZXMiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJaWYoIWluZGV4KXsKKwkJCWluZGV4ID0gZG9qby5odG1sLnN0eWxlU2hlZXQucnVsZXMubGVuZ3RoOworCQkJZG9qby5odG1sLnN0eWxlU2hlZXQucmVtb3ZlUnVsZShpbmRleCk7CisJCX0KKwl9ZWxzZSBpZihkb2N1bWVudC5zdHlsZVNoZWV0c1swXSl7CisJCWlmKCFpbmRleCl7CisJCQlpbmRleCA9IGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aDsKKwkJfQorCQlkb2pvLmh0bWwuc3R5bGVTaGVldC5kZWxldGVSdWxlKGluZGV4KTsKKwl9CisJcmV0dXJuIHRydWU7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzID0gW107IC8vIGNhY2hlIGNvbnRhaW5lciBuZWVkZWQgYmVjYXVzZSBJRSByZWZvcm1hdHMgY3NzVGV4dCB3aGVuIGFkZGVkIHRvIERPTQorZG9qby5odG1sLmluc2VydENzc0ZpbGUgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9VUkksIC8qIEhUTUxEb2N1bWVudD8gKi9kb2MsIC8qIGJvb2xlYW4/ICovY2hlY2tEdXBsaWNhdGVzLCAvKiBib29sZWFuICovZmFpbF9vayl7CisJLy8Jc3VtbWFyeQorCS8vIGNhbGxzIGNzcyBieSBYbWxIVFRQIGFuZCBpbnNlcnRzIGl0IGludG8gRE9NIGFzIDxzdHlsZSBbd2lkZ2V0VHlwZT0id2lkZ2V0VHlwZSJdPiAqZG93bmxvYWRlZCBjc3NUZXh0Kjwvc3R5bGU+CisJaWYoIVVSSSl7IHJldHVybjsgfQorCWlmKCFkb2MpeyBkb2MgPSBkb2N1bWVudDsgfQorCXZhciBjc3NTdHIgPSBkb2pvLmhvc3RlbnYuZ2V0VGV4dChVUkksIGZhbHNlLCBmYWlsX29rKTsKKwlpZihjc3NTdHI9PT1udWxsKXsgcmV0dXJuOyB9CisJY3NzU3RyID0gZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KGNzc1N0ciwgVVJJKTsKKworCWlmKGNoZWNrRHVwbGljYXRlcyl7CisJCXZhciBpZHggPSAtMSwgbm9kZSwgZW50ID0gZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzOworCQlmb3IodmFyIGkgPSAwOyBpIDwgZW50Lmxlbmd0aDsgaSsrKXsKKwkJCWlmKChlbnRbaV0uZG9jID09IGRvYykgJiYgKGVudFtpXS5jc3NUZXh0ID09IGNzc1N0cikpeworCQkJCWlkeCA9IGk7IG5vZGUgPSBlbnRbaV0ubm9kZVJlZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZW50IGRlbGV0ZWQgb3VyIG5vZGUKKwkJaWYobm9kZSl7CisJCQl2YXIgc3R5bGVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpOworCQkJZm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKyl7CisJCQkJaWYoc3R5bGVzW2ldID09IG5vZGUpeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gZGVsZXRlIHRoaXMgZW50cnkKKwkJCWRvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5zaGlmdChpZHgsIDEpOworCQl9CisJfQorCisJdmFyIHN0eWxlID0gZG9qby5odG1sLmluc2VydENzc1RleHQoY3NzU3RyLCBkb2MpOworCWRvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5wdXNoKHsnZG9jJzogZG9jLCAnY3NzVGV4dCc6IGNzc1N0ciwgJ25vZGVSZWYnOiBzdHlsZX0pOworCisJLy8gaW5zZXJ0IGN1c3RvbSBhdHRyaWJ1dGUgZXggZGJnSHJlZj0iLi4vZm9vLmNzcyIgdXNlZnVsbCB3aGVuIGRlYnVnZ2luZyBpbiBET00gaW5zcGVjdG9ycywgbm8/CisJaWYoc3R5bGUgJiYgZGpDb25maWcuaXNEZWJ1Zyl7CisJCXN0eWxlLnNldEF0dHJpYnV0ZSgiZGJnSHJlZiIsIFVSSSk7CisJfQorCXJldHVybiBzdHlsZTsJLy8JSFRNTFN0eWxlRWxlbWVudAorfQorCitkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL2Nzc1N0ciwgLyogSFRNTERvY3VtZW50PyAqL2RvYywgLyogc3RyaW5nPyAqL1VSSSl7CisJLy8Jc3VtbWFyeQorCS8vCUF0dGVtcHQgdG8gaW5zZXJ0IENTUyBydWxlcyBpbnRvIHRoZSBkb2N1bWVudCB0aHJvdWdoIGluc2VydGluZyBhIHN0eWxlIGVsZW1lbnQKKwkvLyBEb21Ob2RlIFN0eWxlICA9IGluc2VydENzc1RleHQoU3RyaW5nICIuZG9qb01lbnUge2NvbG9yOiBncmVlbjt9IlssIERvbURvYyBkb2N1bWVudCwgZG9qby51cmkuVXJpIFVybCBdKQorCWlmKCFjc3NTdHIpeyAKKwkJcmV0dXJuOyAvLwlIVE1MU3R5bGVFbGVtZW50CisJfQorCWlmKCFkb2MpeyBkb2MgPSBkb2N1bWVudDsgfQorCWlmKFVSSSl7Ly8gZml4IHBhdGhzIGluIGNzc1N0cgorCQljc3NTdHIgPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQoY3NzU3RyLCBVUkkpOworCX0KKwl2YXIgc3R5bGUgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKwlzdHlsZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3MiKTsKKwkvLyBJRSBpcyBiMHJrZW4gZW5vdWdoIHRvIHJlcXVpcmUgdGhhdCB3ZSBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIGRvYworCS8vIGJlZm9yZSBjaGFuZ2luZyBpdCdzIHByb3BlcnRpZXMKKwl2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCWlmKCFoZWFkKXsgLy8gbXVzdCBoYXZlIGEgaGVhZCB0YWcgCisJCWRvam8uZGVidWcoIk5vIGhlYWQgdGFnIGluIGRvY3VtZW50LCBhYm9ydGluZyBzdHlsZXMiKTsKKwkJcmV0dXJuOwkvLwlIVE1MU3R5bGVFbGVtZW50CisJfWVsc2V7CisJCWhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOworCX0KKwlpZihzdHlsZS5zdHlsZVNoZWV0KXsvLyBJRQorCQl2YXIgc2V0RnVuYyA9IGZ1bmN0aW9uKCl7IAorCQkJdHJ5eworCQkJCXN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzc1N0cjsKKwkJCX1jYXRjaChlKXsgZG9qby5kZWJ1ZyhlKTsgfQorCQl9OworCQlpZihzdHlsZS5zdHlsZVNoZWV0LmRpc2FibGVkKXsKKwkJCXNldFRpbWVvdXQoc2V0RnVuYywgMTApOworCQl9ZWxzZXsKKwkJCXNldEZ1bmMoKTsKKwkJfQorCX1lbHNleyAvLyB3M2MKKwkJdmFyIGNzc1RleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoY3NzU3RyKTsKKwkJc3R5bGUuYXBwZW5kQ2hpbGQoY3NzVGV4dCk7CisJfQorCXJldHVybiBzdHlsZTsJLy8JSFRNTFN0eWxlRWxlbWVudAorfQorCitkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9jc3NTdHIsIC8qIHN0cmluZyAqL1VSSSl7CisJLy8Jc3VtbWFyeQorCS8vIHVzYWdlOiBjc3NUZXh0IGNvbWVzIGZyb20gZG9qb3Jvb3Qvc3JjL3dpZGdldC90ZW1wbGF0ZXMvRm9vYmFyLmNzcworCS8vIAlpdCBoYXMgLmRvam9Gb28geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Jhci5wbmcpO30gdGhlbiB1cmkgc2hvdWxkIHBvaW50IHRvIGRvam9yb290L3NyYy93aWRnZXQvdGVtcGxhdGVzLworCWlmKCFjc3NTdHIgfHwgIVVSSSl7IHJldHVybjsgfQorCXZhciBtYXRjaCwgc3RyID0gIiIsIHVybCA9ICIiLCB1cmxDaHJzID0gIltcXHRcXHNcXHdcXChcXClcXC9cXC5cXFxcJ1wiLTojPSY/fl0rIjsKKwl2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCd1cmxcXChcXHMqKCcrdXJsQ2hycysnKVxccypcXCknKTsKKwl2YXIgcmVnZXhQcm90b2NvbCA9IC8oZmlsZXxodHRwcz98ZnRwcz8pOlwvXC8vOworCXJlZ2V4VHJpbSA9IG5ldyBSZWdFeHAoIl5bXFxzXSooWydcIl0/KSgiK3VybENocnMrIilcXDFbXFxzXSo/JCIpOworCWlmKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApeworCQl2YXIgcmVnZXhJZSA9IG5ldyBSZWdFeHAoIkFscGhhSW1hZ2VMb2FkZXJcXCgoLiopc3JjXD1bJ1wiXSgiK3VybENocnMrIilbJ1wiXSIpOworCQkvLyBUT0RPOiBuZWVkIHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIGFuZCBBbHBoYUltYWdlTG9hZGVyIHNlZSAjMTQ0MQorCQkvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJyZWFrcyBvbiBidWlsZCB3aXRoIGludGVybl9zdHJpbmdzCisJCXdoaWxlKG1hdGNoID0gcmVnZXhJZS5leGVjKGNzc1N0cikpeworCQkJdXJsID0gbWF0Y2hbMl0ucmVwbGFjZShyZWdleFRyaW0sICIkMiIpOworCQkJaWYoIXJlZ2V4UHJvdG9jb2wuZXhlYyh1cmwpKXsKKwkJCQl1cmwgPSAobmV3IGRvam8udXJpLlVyaShVUkksIHVybCkudG9TdHJpbmcoKSk7CisJCQl9CisJCQlzdHIgKz0gY3NzU3RyLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyAiQWxwaGFJbWFnZUxvYWRlcigiICsgbWF0Y2hbMV0gKyAic3JjPSciICsgdXJsICsgIiciOworCQkJY3NzU3RyID0gY3NzU3RyLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJCX0KKwkJY3NzU3RyID0gc3RyICsgY3NzU3RyOworCQlzdHIgPSAiIjsKKwl9CisKKwl3aGlsZShtYXRjaCA9IHJlZ2V4LmV4ZWMoY3NzU3RyKSl7CisJCXVybCA9IG1hdGNoWzFdLnJlcGxhY2UocmVnZXhUcmltLCAiJDIiKTsKKwkJaWYoIXJlZ2V4UHJvdG9jb2wuZXhlYyh1cmwpKXsKKwkJCXVybCA9IChuZXcgZG9qby51cmkuVXJpKFVSSSwgdXJsKS50b1N0cmluZygpKTsKKwkJfQorCQlzdHIgKz0gY3NzU3RyLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyAidXJsKCIgKyB1cmwgKyAiKSI7CisJCWNzc1N0ciA9IGNzc1N0ci5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCX0KKwlyZXR1cm4gc3RyICsgY3NzU3RyOwkvLwlzdHJpbmcKK30KKworZG9qby5odG1sLnNldEFjdGl2ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi90aXRsZSl7CisJLy8Jc3VtbWFyeQorCS8vCUFjdGl2YXRlIHN0eWxlIHNoZWV0IHdpdGggc3BlY2lmaWVkIHRpdGxlLgorCXZhciBpID0gMCwgYSwgZWxzID0gZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOworCXdoaWxlIChhID0gZWxzW2krK10pIHsKKwkJaWYoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikgIT0gLTEgJiYgYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpeworCQkJYS5kaXNhYmxlZCA9IHRydWU7CisJCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikgPT0gdGl0bGUpIHsgYS5kaXNhYmxlZCA9IGZhbHNlOyB9CisJCX0KKwl9Cit9CisKK2Rvam8uaHRtbC5nZXRBY3RpdmVTdHlsZVNoZWV0ID0gZnVuY3Rpb24oKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZXNoZWV0CisJdmFyIGkgPSAwLCBhLCBlbHMgPSBkb2pvLmRvYygpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7CisJd2hpbGUgKGEgPSBlbHNbaSsrXSkgeworCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikgIT0gLTEgCisJCQkmJiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSAKKwkJCSYmICFhLmRpc2FibGVkCisJCSl7CisJCQlyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInRpdGxlIik7CS8vCXN0cmluZyAKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsJLy8Jc3RyaW5nCit9CisKK2Rvam8uaHRtbC5nZXRQcmVmZXJyZWRTdHlsZVNoZWV0ID0gZnVuY3Rpb24oKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJuIHRoZSBwcmVmZXJyZWQgc3R5bGVzaGVldCB0aXRsZSAoaS5lLiBsaW5rIHdpdGhvdXQgYWx0IGF0dHJpYnV0ZSkKKwl2YXIgaSA9IDAsIGEsIGVscyA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKKwl3aGlsZSAoYSA9IGVsc1tpKytdKSB7CisJCWlmKGEuZ2V0QXR0cmlidXRlKCJyZWwiKS5pbmRleE9mKCJzdHlsZSIpICE9IC0xCisJCQkmJiBhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigiYWx0IikgPT0gLTEKKwkJCSYmIGEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpCisJCSl7IAorCQkJcmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAJLy8Jc3RyaW5nCisJCX0KKwl9CisJcmV0dXJuIG51bGw7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlBcHBsaWVzIHByZS1zZXQgY2xhc3MgbmFtZXMgYmFzZWQgb24gYnJvd3NlciAmIHZlcnNpb24gdG8gdGhlIHBhc3NlZCBub2RlLgorCS8vCU1vZGlmaWVkIHZlcnNpb24gb2YgTW9ycmlzJyBDU1MgaGFjay4KKwl2YXIgZHJoPWRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGNsYXNzZXMgPSB7CisJCWRqX2llOiBkcmguaWUsCisJCWRqX2llNTU6IGRyaC5pZTU1LAorCQlkal9pZTY6IGRyaC5pZTYwLAorCQlkal9pZTc6IGRyaC5pZTcwLAorCQlkal9pZXF1aXJrczogZHJoLmllICYmIGRyaC5xdWlya3MsCisJCWRqX29wZXJhOiBkcmgub3BlcmEsCisJCWRqX29wZXJhODogZHJoLm9wZXJhICYmIChNYXRoLmZsb29yKGRvam8ucmVuZGVyLnZlcnNpb24pPT04KSwKKwkJZGpfb3BlcmE5OiBkcmgub3BlcmEgJiYgKE1hdGguZmxvb3IoZG9qby5yZW5kZXIudmVyc2lvbik9PTkpLAorCQlkal9raHRtbDogZHJoLmtodG1sLAorCQlkal9zYWZhcmk6IGRyaC5zYWZhcmksCisJCWRqX2dlY2tvOiBkcmgubW96aWxsYQorCX07IC8vIG5vIGRvam8gdW5zdXBwb3J0ZWQgYnJvd3NlcnMKKwlmb3IodmFyIHAgaW4gY2xhc3Nlcyl7CisJCWlmKGNsYXNzZXNbcF0peworCQkJZG9qby5odG1sLmFkZENsYXNzKG5vZGUsIHApOworCQl9CisJfQorfTsKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworCisKK2Rvam8uaHRtbC5fdG9nZ2xlID0gZnVuY3Rpb24obm9kZSwgdGVzdGVyLCBzZXR0ZXIpeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJc2V0dGVyKG5vZGUsICF0ZXN0ZXIobm9kZSkpOworCXJldHVybiB0ZXN0ZXIobm9kZSk7Cit9CisKK2Rvam8uaHRtbC5zaG93ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JU2hvdyB0aGUgcGFzc2VkIGVsZW1lbnQgYnkgcmV2ZXJ0aW5nIGRpc3BsYXkgcHJvcGVydHkgc2V0IGJ5IGRvam8uaHRtbC5oaWRlCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZihkb2pvLmh0bWwuZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAnZGlzcGxheScpPT0nbm9uZScpeworCQlkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwgJ2Rpc3BsYXknLCAobm9kZS5kb2pvRGlzcGxheUNhY2hlfHwnJykpOworCQlub2RlLmRvam9EaXNwbGF5Q2FjaGUgPSB1bmRlZmluZWQ7CS8vIGNhbm5vdCB1c2UgZGVsZXRlIG9uIGEgbm9kZSBpbiBJRTYKKwl9Cit9CisKK2Rvam8uaHRtbC5oaWRlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JSGlkZSB0aGUgcGFzc2VkIGVsZW1lbnQgYnkgc2V0dGluZyBkaXNwbGF5Om5vbmUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKHR5cGVvZiBub2RlWyJkb2pvRGlzcGxheUNhY2hlIl0gPT0gInVuZGVmaW5lZCIpeyAvLyBpdCBjb3VsZCA9PSAnJywgc28gd2UgY2Fubm90IHNheSAhbm9kZS5kb2pvRGlzcGxheUNvdW50CisJCXZhciBkID0gZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2Rpc3BsYXknKQorCQlpZihkIT0nbm9uZScpeworCQkJbm9kZS5kb2pvRGlzcGxheUNhY2hlID0gZDsKKwkJfQorCX0KKwlkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwgJ2Rpc3BsYXknLCAnbm9uZScpOworfQorCitkb2pvLmh0bWwuc2V0U2hvd2luZyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogYm9vbGVhbj8gKi9zaG93aW5nKXsKKwkvLwlzdW1tYXJ5CisJLy8gQ2FsbHMgc2hvdygpIGlmIHNob3dpbmcgaXMgdHJ1ZSwgaGlkZSgpIG90aGVyd2lzZQorCWRvam8uaHRtbFsoc2hvd2luZyA/ICdzaG93JyA6ICdoaWRlJyldKG5vZGUpOworfQorCitkb2pvLmh0bWwuaXNTaG93aW5nID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc3BsYXllZCBvciBub3QuCisJLy8gRklYTUU6IHJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGJhZCwgaXNIaWRkZW4gd291bGQgYmUgZWFzaWVyIHRvIG1ha2UgY29ycmVjdAorCXJldHVybiAoZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2Rpc3BsYXknKSAhPSAnbm9uZScpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC50b2dnbGVTaG93aW5nID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gQ2FsbCBzZXRTaG93aW5nKCkgb24gbm9kZSB3aXRoIHRoZSBjb21wbGVtZW50IG9mIGlzU2hvd2luZygpLCB0aGVuIHJldHVybiB0aGUgbmV3IHZhbHVlIG9mIGlzU2hvd2luZygpCisJcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsIGRvam8uaHRtbC5pc1Nob3dpbmcsIGRvam8uaHRtbC5zZXRTaG93aW5nKTsJLy8JYm9vbGVhbgorfQorCisvLyBTaW1wbGUgbWFwcGluZyBvZiB0YWcgbmFtZXMgdG8gZGlzcGxheSB2YWx1ZXMKKy8vIEZJWE1FOiBzaW1wbGlzdGljIAorZG9qby5odG1sLmRpc3BsYXlNYXAgPSB7IHRyOiAnJywgdGQ6ICcnLCB0aDogJycsIGltZzogJ2lubGluZScsIHNwYW46ICdpbmxpbmUnLCBpbnB1dDogJ2lubGluZScsIGJ1dHRvbjogJ2lubGluZScgfTsKKworZG9qby5odG1sLnN1Z2dlc3REaXNwbGF5QnlUYWdOYW1lID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gU3VnZ2VzdCBhIHZhbHVlIGZvciB0aGUgZGlzcGxheSBwcm9wZXJ0eSB0aGF0IHdpbGwgc2hvdyAnbm9kZScgYmFzZWQgb24gaXQncyB0YWcKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKG5vZGUgJiYgbm9kZS50YWdOYW1lKXsKKwkJdmFyIHRhZyA9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworCQlyZXR1cm4gKHRhZyBpbiBkb2pvLmh0bWwuZGlzcGxheU1hcCA/IGRvam8uaHRtbC5kaXNwbGF5TWFwW3RhZ10gOiAnYmxvY2snKTsJLy8Jc3RyaW5nCisJfQorfQorCitkb2pvLmh0bWwuc2V0RGlzcGxheSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovZGlzcGxheSl7CisJLy8Jc3VtbWFyeQorCS8vIAlTZXRzIHRoZSB2YWx1ZSBvZiBzdHlsZS5kaXNwbGF5IHRvIHZhbHVlIG9mICdkaXNwbGF5JyBwYXJhbWV0ZXIgaWYgaXQgaXMgYSBzdHJpbmcuCisJLy8gCU90aGVyd2lzZSwgaWYgJ2Rpc3BsYXknIGlzIGZhbHNlLCBzZXQgc3R5bGUuZGlzcGxheSB0byAnbm9uZScuCisJLy8gCUZpbmFsbHksIHNldCAnZGlzcGxheScgdG8gYSBzdWdnZXN0ZWQgZGlzcGxheSB2YWx1ZSBiYXNlZCBvbiB0aGUgbm9kZSdzIHRhZworCWRvam8uaHRtbC5zZXRTdHlsZShub2RlLCAnZGlzcGxheScsICgoZGlzcGxheSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2YgZGlzcGxheSA9PSAic3RyaW5nIikgPyBkaXNwbGF5IDogKGRpc3BsYXkgPyBkb2pvLmh0bWwuc3VnZ2VzdERpc3BsYXlCeVRhZ05hbWUobm9kZSkgOiAnbm9uZScpKSk7Cit9CisKK2Rvam8uaHRtbC5pc0Rpc3BsYXllZCA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIAlJcyB0cnVlIGlmIHRoZSB0aGUgY29tcHV0ZWQgZGlzcGxheSBzdHlsZSBmb3Igbm9kZSBpcyBub3QgJ25vbmUnCisJLy8gCUZJWE1FOiByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBiYWQsIGlzTm90RGlzcGxheWVkIHdvdWxkIGJlIGVhc2llciB0byBtYWtlIGNvcnJlY3QKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdkaXNwbGF5JykgIT0gJ25vbmUnKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwudG9nZ2xlRGlzcGxheSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIAlDYWxsIHNldERpc3BsYXkoKSBvbiBub2RlIHdpdGggdGhlIGNvbXBsZW1lbnQgb2YgaXNEaXNwbGF5ZWQoKSwgdGhlbgorCS8vIAlyZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiBpc0Rpc3BsYXllZCgpCisJcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsIGRvam8uaHRtbC5pc0Rpc3BsYXllZCwgZG9qby5odG1sLnNldERpc3BsYXkpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC5zZXRWaXNpYmlsaXR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi92aXNpYmlsaXR5KXsKKwkvLwlzdW1tYXJ5CisJLy8gCVNldHMgdGhlIHZhbHVlIG9mIHN0eWxlLnZpc2liaWxpdHkgdG8gdmFsdWUgb2YgJ3Zpc2liaWxpdHknIHBhcmFtZXRlciBpZiBpdCBpcyBhIHN0cmluZy4KKwkvLyAJT3RoZXJ3aXNlLCBpZiAndmlzaWJpbGl0eScgaXMgZmFsc2UsIHNldCBzdHlsZS52aXNpYmlsaXR5IHRvICdoaWRkZW4nLiBGaW5hbGx5LCBzZXQgc3R5bGUudmlzaWJpbGl0eSB0byAndmlzaWJsZScuCisJZG9qby5odG1sLnNldFN0eWxlKG5vZGUsICd2aXNpYmlsaXR5JywgKCh2aXNpYmlsaXR5IGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiB2aXNpYmlsaXR5ID09ICJzdHJpbmciKSA/IHZpc2liaWxpdHkgOiAodmlzaWJpbGl0eSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKSkpOworfQorCitkb2pvLmh0bWwuaXNWaXNpYmxlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gCVJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlIGNvbXB1dGVkIHZpc2liaWxpdHkgc3R5bGUgZm9yIG5vZGUgaXMgbm90ICdoaWRkZW4nCisJLy8gCUZJWE1FOiByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBiYWQsIGlzSW52aXNpYmxlIHdvdWxkIGJlIGVhc2llciB0byBtYWtlIGNvcnJlY3QKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICd2aXNpYmlsaXR5JykgIT0gJ2hpZGRlbicpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC50b2dnbGVWaXNpYmlsaXR5ID0gZnVuY3Rpb24obm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIENhbGwgc2V0VmlzaWJpbGl0eSgpIG9uIG5vZGUgd2l0aCB0aGUgY29tcGxlbWVudCBvZiBpc1Zpc2libGUoKSwgdGhlbiByZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiBpc1Zpc2libGUoKQorCXJldHVybiBkb2pvLmh0bWwuX3RvZ2dsZShub2RlLCBkb2pvLmh0bWwuaXNWaXNpYmxlLCBkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eSk7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnNldE9wYWNpdHkgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIGZsb2F0ICovb3BhY2l0eSwgLyogYm9vbGVhbj8gKi9kb250Rml4T3BhY2l0eSl7CisJLy8Jc3VtbWFyeQorCS8vCVNldHMgdGhlIG9wYWNpdHkgb2Ygbm9kZSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LgorCS8vCWZsb2F0IGJldHdlZW4gMC4wICh0cmFuc3BhcmVudCkgYW5kIDEuMCAob3BhcXVlKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCWlmKCFkb250Rml4T3BhY2l0eSl7CisJCWlmKCBvcGFjaXR5ID49IDEuMCl7CisJCQlpZihoLmllKXsKKwkJCQlkb2pvLmh0bWwuY2xlYXJPcGFjaXR5KG5vZGUpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCW9wYWNpdHkgPSAwLjk5OTk5OTsKKwkJCX0KKwkJfWVsc2UgaWYoIG9wYWNpdHkgPCAwLjApeyBvcGFjaXR5ID0gMDsgfQorCX0KKwlpZihoLmllKXsKKwkJaWYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ciIpeworCQkJLy8gRklYTUU6IGlzIHRoaXMgdG9vIG5haXZlPyB3aWxsIHdlIGdldCBtb3JlIHRoYW4gd2Ugd2FudD8KKwkJCXZhciB0ZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJZm9yKHZhciB4PTA7IHg8dGRzLmxlbmd0aDsgeCsrKXsKKwkJCQl0ZHNbeF0uc3R5bGUuZmlsdGVyID0gIkFscGhhKE9wYWNpdHk9IitvcGFjaXR5KjEwMCsiKSI7CisJCQl9CisJCX0KKwkJbm9kZS5zdHlsZS5maWx0ZXIgPSAiQWxwaGEoT3BhY2l0eT0iK29wYWNpdHkqMTAwKyIpIjsKKwl9ZWxzZSBpZihoLm1veil7CisJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7IC8vIGZmb3ggMS4wIGRpcmVjdGx5IHN1cHBvcnRzICJvcGFjaXR5IgorCQlub2RlLnN0eWxlLk1vek9wYWNpdHkgPSBvcGFjaXR5OworCX1lbHNlIGlmKGguc2FmYXJpKXsKKwkJbm9kZS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTsgLy8gMS4zIGRpcmVjdGx5IHN1cHBvcnRzICJvcGFjaXR5IgorCQlub2RlLnN0eWxlLktodG1sT3BhY2l0eSA9IG9wYWNpdHk7CisJfWVsc2V7CisJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJfQorfQorCitkb2pvLmh0bWwuY2xlYXJPcGFjaXR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JQ2xlYXJzIGFueSBvcGFjaXR5IHNldHRpbmcgb24gdGhlIHBhc3NlZCBlbGVtZW50LgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIG5zID0gbm9kZS5zdHlsZTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJaWYoaC5pZSl7CisJCXRyeSB7CisJCQlpZiggbm9kZS5maWx0ZXJzICYmIG5vZGUuZmlsdGVycy5hbHBoYSApeworCQkJCW5zLmZpbHRlciA9ICIiOyAvLyBGSVhNRTogbWF5IGdldCByaWQgb2Ygb3RoZXIgZmlsdGVyIGVmZmVjdHMKKwkJCX0KKwkJfSBjYXRjaChlKSB7CisJCQkvKgorCQkJICogSUU3IGdpdmVzIGVycm9yIGlmIG5vZGUuZmlsdGVycyBub3Qgc2V0OworCQkJICogZG9uJ3Qga25vdyB3aHkgb3IgaG93IHRvIHdvcmthcm91bmQgKG90aGVyIHRoYW4gdGhpcykKKwkJCSAqLworCQl9CisJfWVsc2UgaWYoaC5tb3opeworCQlucy5vcGFjaXR5ID0gMTsKKwkJbnMuTW96T3BhY2l0eSA9IDE7CisJfWVsc2UgaWYoaC5zYWZhcmkpeworCQlucy5vcGFjaXR5ID0gMTsKKwkJbnMuS2h0bWxPcGFjaXR5ID0gMTsKKwl9ZWxzZXsKKwkJbnMub3BhY2l0eSA9IDE7CisJfQorfQorCitkb2pvLmh0bWwuZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIG9wYWNpdHkgb2YgdGhlIHBhc3NlZCBlbGVtZW50CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJaWYoaC5pZSl7CisJCXZhciBvcGFjID0gKG5vZGUuZmlsdGVycyAmJiBub2RlLmZpbHRlcnMuYWxwaGEgJiYKKwkJCXR5cGVvZiBub2RlLmZpbHRlcnMuYWxwaGEub3BhY2l0eSA9PSAibnVtYmVyIgorCQkJPyBub2RlLmZpbHRlcnMuYWxwaGEub3BhY2l0eSA6IDEwMCkgLyAxMDA7CisJfWVsc2V7CisJCXZhciBvcGFjID0gbm9kZS5zdHlsZS5vcGFjaXR5IHx8IG5vZGUuc3R5bGUuTW96T3BhY2l0eSB8fAorCQkJbm9kZS5zdHlsZS5LaHRtbE9wYWNpdHkgfHwgMTsKKwl9CisJcmV0dXJuIG9wYWMgPj0gMC45OTk5OTkgPyAxLjAgOiBOdW1iZXIob3BhYyk7CS8vCWZsb2F0Cit9CisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuY29sb3IiKTsKKworCisKKworZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCXJldHVybnMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHBhc3NlZCBub2RlIGFzIGEgMzItYml0IGNvbG9yIChSR0JBKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGNvbG9yOworCWRveworCQljb2xvciA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYmFja2dyb3VuZC1jb2xvciIpOworCQkvLyBTYWZhcmkgZG9lc24ndCBzYXkgInRyYW5zcGFyZW50IgorCQlpZihjb2xvci50b0xvd2VyQ2FzZSgpID09ICJyZ2JhKDAsIDAsIDAsIDApIikgeyBjb2xvciA9ICJ0cmFuc3BhcmVudCI7IH0KKwkJaWYobm9kZSA9PSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKSB7IG5vZGUgPSBudWxsOyBicmVhazsgfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX13aGlsZShub2RlICYmIGRvam8ubGFuZy5pbkFycmF5KFsidHJhbnNwYXJlbnQiLCAiIl0sIGNvbG9yKSk7CisJaWYoY29sb3IgPT0gInRyYW5zcGFyZW50Iil7CisJCWNvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDBdOworCX1lbHNleworCQljb2xvciA9IGRvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0IoY29sb3IpOworCX0KKwlyZXR1cm4gY29sb3I7CS8vCWFycmF5Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmxheW91dCIpOworCisKKworCisKK2Rvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXMgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3Byb3ApeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHBhc3NlZCBwcm9wZXJ0eSBvbiBhbGwgYW5jZXN0b3JzIG9mIG5vZGUuCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZighbm9kZSl7IHJldHVybiAwOyB9IC8vIEZJWE1FOiB0aHJvdyBhbiBlcnJvcj8KKwkKKwl2YXIgcmV0VmFsID0gMDsKKwl3aGlsZShub2RlKXsKKwkJaWYoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3Bvc2l0aW9uJykgPT0gJ2ZpeGVkJyl7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl2YXIgdmFsID0gbm9kZVtwcm9wXTsKKwkJaWYodmFsKXsKKwkJCXJldFZhbCArPSB2YWwgLSAwOworCQkJaWYobm9kZT09ZG9qby5ib2R5KCkpeyBicmVhazsgfS8vIG9wZXJhIGFuZCBraHRtbCAjYm9keSAmICNodG1sIGhhcyB0aGUgc2FtZSB2YWx1ZXMsIHdlIG9ubHkgbmVlZCBvbmUgdmFsdWUKKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gcmV0VmFsOwkvLwlpbnRlZ2VyCit9CisKK2Rvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2F0dHJpYnV0ZXMpIHsgCisJLy8Jc3VtbWFyeQorCS8vCWFsbG93cyBhIGRldiB0byBwYXNzIGEgc3RyaW5nIHNpbWlsYXIgdG8gd2hhdCB5b3UnZCBwYXNzIGluIHN0eWxlPSIiLCBhbmQgYXBwbHkgaXQgdG8gYSBub2RlLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHNwbGl0dGVkQXR0cmlicz1hdHRyaWJ1dGVzLnJlcGxhY2UoLyg7KT9ccyokLywgIiIpLnNwbGl0KCI7Iik7IAorCWZvcih2YXIgaT0wOyBpPHNwbGl0dGVkQXR0cmlicy5sZW5ndGg7IGkrKyl7IAorCQl2YXIgbmFtZVZhbHVlPXNwbGl0dGVkQXR0cmlic1tpXS5zcGxpdCgiOiIpOyAKKwkJdmFyIG5hbWU9bmFtZVZhbHVlWzBdLnJlcGxhY2UoL1xzKiQvLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKS50b0xvd2VyQ2FzZSgpOworCQl2YXIgdmFsdWU9bmFtZVZhbHVlWzFdLnJlcGxhY2UoL1xzKiQvLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKTsKKwkJc3dpdGNoKG5hbWUpeworCQkJY2FzZSAib3BhY2l0eSI6CisJCQkJZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSwgdmFsdWUpOyAKKwkJCQlicmVhazsgCisJCQljYXNlICJjb250ZW50LWhlaWdodCI6CisJCQkJZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSwge2hlaWdodDogdmFsdWV9KTsgCisJCQkJYnJlYWs7IAorCQkJY2FzZSAiY29udGVudC13aWR0aCI6CisJCQkJZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSwge3dpZHRoOiB2YWx1ZX0pOyAKKwkJCQlicmVhazsgCisJCQljYXNlICJvdXRlci1oZWlnaHQiOgorCQkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSwge2hlaWdodDogdmFsdWV9KTsgCisJCQkJYnJlYWs7IAorCQkJY2FzZSAib3V0ZXItd2lkdGgiOgorCQkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSwge3dpZHRoOiB2YWx1ZX0pOyAKKwkJCQlicmVhazsgCisJCQlkZWZhdWx0OgorCQkJCW5vZGUuc3R5bGVbZG9qby5odG1sLnRvQ2FtZWxDYXNlKG5hbWUpXT12YWx1ZTsgCisJCX0KKwl9IAorfQorCitkb2pvLmh0bWwuYm94U2l6aW5nID0geworCU1BUkdJTl9CT1g6ICJtYXJnaW4tYm94IiwKKwlCT1JERVJfQk9YOiAiYm9yZGVyLWJveCIsCisJUEFERElOR19CT1g6ICJwYWRkaW5nLWJveCIsCisJQ09OVEVOVF9CT1g6ICJjb250ZW50LWJveCIKK307CisKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uID0gZG9qby5odG1sLmFicyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogYm9vbGVhbj8gKi9pbmNsdWRlU2Nyb2xsLCAvKiBzdHJpbmc/ICovYm94VHlwZSl7CisJLy8Jc3VtbWFyeQorCS8vCUdldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBwYXNzZWQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQgaXRzZWxmLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSwgbm9kZS5vd25lckRvY3VtZW50KTsKKwl2YXIgcmV0ID0geworCQl4OiAwLAorCQl5OiAwCisJfTsKKworCXZhciBicyA9IGRvam8uaHRtbC5ib3hTaXppbmc7CisJaWYoIWJveFR5cGUpIHsgYm94VHlwZSA9IGJzLkNPTlRFTlRfQk9YOyB9CisJdmFyIG5hdGl2ZUJveFR5cGUgPSAyOyAvL0JPUkRFUiBib3gKKwl2YXIgdGFyZ2V0Qm94VHlwZTsKKwlzd2l0Y2goYm94VHlwZSl7CisJCWNhc2UgYnMuTUFSR0lOX0JPWDoKKwkJCXRhcmdldEJveFR5cGUgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgYnMuQk9SREVSX0JPWDoKKwkJCXRhcmdldEJveFR5cGUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgYnMuUEFERElOR19CT1g6CisJCWRlZmF1bHQ6CisJCQl0YXJnZXRCb3hUeXBlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGJzLkNPTlRFTlRfQk9YOgorCQkJdGFyZ2V0Qm94VHlwZSA9IDA7CisJCQlicmVhazsKKwl9CisKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGRiID0gZG9jdW1lbnRbImJvZHkiXXx8ZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdOworCisJaWYoaC5pZSl7CisJCXdpdGgobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl7CisJCQlyZXQueCA9IGxlZnQtMjsKKwkJCXJldC55ID0gdG9wLTI7CisJCX0KKwl9ZWxzZSBpZihkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IpeworCQkvLyBtb3ppbGxhCisJCW5hdGl2ZUJveFR5cGUgPSAxOyAvL2dldEJveE9iamVjdEZvciByZXR1cm4gcGFkZGluZyBib3ggY29vcmRpbmF0ZQorCQl0cnl7CisJCQl2YXIgYm8gPSBkb2N1bWVudC5nZXRCb3hPYmplY3RGb3Iobm9kZSk7CisJCQlyZXQueCA9IGJvLnggLSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsICJzY3JvbGxMZWZ0Iik7CisJCQlyZXQueSA9IGJvLnkgLSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsICJzY3JvbGxUb3AiKTsKKwkJfWNhdGNoKGUpeworCQkJLy8gc3F1ZWxjaAorCQl9CisJfWVsc2V7CisJCWlmKG5vZGVbIm9mZnNldFBhcmVudCJdKXsKKwkJCXZhciBlbmROb2RlOworCQkJLy8gaW4gU2FmYXJpLCBpZiB0aGUgbm9kZSBpcyBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgY2hpbGQgb2YKKwkJCS8vIHRoZSBib2R5IGFuZCB0aGUgYm9keSBoYXMgYSBtYXJnaW4gdGhlIG9mZnNldCBvZiB0aGUgY2hpbGQKKwkJCS8vIGFuZCB0aGUgYm9keSBjb250YWluIHRoZSBib2R5J3MgbWFyZ2lucywgc28gd2UgbmVlZCB0byBlbmQKKwkJCS8vIGF0IHRoZSBib2R5CisJCQlpZigJKGguc2FmYXJpKSYmCisJCQkJKG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKSYmCisJCQkJKG5vZGUucGFyZW50Tm9kZSA9PSBkYikpeworCQkJCWVuZE5vZGUgPSBkYjsKKwkJCX1lbHNleworCQkJCWVuZE5vZGUgPSBkYi5wYXJlbnROb2RlOworCQkJfQorCisJCQkvL1RPRE86IHNldCBjb3JyZWN0IG5hdGl2ZUJveFR5cGUgZm9yIHNhZmFyaS9rb25xdWVyb3IKKworCQkJaWYobm9kZS5wYXJlbnROb2RlICE9IGRiKXsKKwkJCQl2YXIgbmQgPSBub2RlOworCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeyBuZCA9IGRiOyB9CisJCQkJcmV0LnggLT0gZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyhuZCwgInNjcm9sbExlZnQiKTsKKwkJCQlyZXQueSAtPSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5kLCAic2Nyb2xsVG9wIik7CisJCQl9CisJCQl2YXIgY3Vybm9kZSA9IG5vZGU7CisJCQlkb3sKKwkJCQl2YXIgbiA9IGN1cm5vZGVbIm9mZnNldExlZnQiXTsKKwkJCQkvL0ZJWE1FOiB1Z2x5IGhhY2sgdG8gd29ya2Fyb3VuZCB0aGUgc3VibWVudSBpbiAKKwkJCQkvL3BvcHVwbWVudTIgZG9lcyBub3Qgc2hvd24gdXAgY29ycmVjdGx5IGluIG9wZXJhLiAKKwkJCQkvL1NvbWVvbmUgaGF2ZSBhIGJldHRlciB3b3JrYXJvdW5kPworCQkJCWlmKCFoLm9wZXJhIHx8IG4+MCl7CisJCQkJCXJldC54ICs9IGlzTmFOKG4pID8gMCA6IG47CisJCQkJfQorCQkJCXZhciBtID0gY3Vybm9kZVsib2Zmc2V0VG9wIl07CisJCQkJcmV0LnkgKz0gaXNOYU4obSkgPyAwIDogbTsKKwkJCQljdXJub2RlID0gY3Vybm9kZS5vZmZzZXRQYXJlbnQ7CisJCQl9d2hpbGUoKGN1cm5vZGUgIT0gZW5kTm9kZSkmJihjdXJub2RlICE9IG51bGwpKTsKKwkJfWVsc2UgaWYobm9kZVsieCJdJiZub2RlWyJ5Il0peworCQkJcmV0LnggKz0gaXNOYU4obm9kZS54KSA/IDAgOiBub2RlLng7CisJCQlyZXQueSArPSBpc05hTihub2RlLnkpID8gMCA6IG5vZGUueTsKKwkJfQorCX0KKworCS8vIGFjY291bnQgZm9yIGRvY3VtZW50IHNjcm9sbGluZyEKKwlpZihpbmNsdWRlU2Nyb2xsKXsKKwkJdmFyIHNjcm9sbCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKTsKKwkJcmV0LnkgKz0gc2Nyb2xsLnRvcDsKKwkJcmV0LnggKz0gc2Nyb2xsLmxlZnQ7CisJfQorCisJdmFyIGV4dGVudEZ1bmNBcnJheT1bZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQsIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQsIGRvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnRdOworCWlmKG5hdGl2ZUJveFR5cGUgPiB0YXJnZXRCb3hUeXBlKXsKKwkJZm9yKHZhciBpPXRhcmdldEJveFR5cGU7aTxuYXRpdmVCb3hUeXBlOysraSl7CisJCQlyZXQueSArPSBleHRlbnRGdW5jQXJyYXlbaV0obm9kZSwgJ3RvcCcpOworCQkJcmV0LnggKz0gZXh0ZW50RnVuY0FycmF5W2ldKG5vZGUsICdsZWZ0Jyk7CisJCX0KKwl9ZWxzZSBpZihuYXRpdmVCb3hUeXBlIDwgdGFyZ2V0Qm94VHlwZSl7CisJCWZvcih2YXIgaT10YXJnZXRCb3hUeXBlO2k+bmF0aXZlQm94VHlwZTstLWkpeworCQkJcmV0LnkgLT0gZXh0ZW50RnVuY0FycmF5W2ktMV0obm9kZSwgJ3RvcCcpOworCQkJcmV0LnggLT0gZXh0ZW50RnVuY0FycmF5W2ktMV0obm9kZSwgJ2xlZnQnKTsKKwkJfQorCX0KKwlyZXQudG9wID0gcmV0Lnk7CisJcmV0LmxlZnQgPSByZXQueDsKKwlyZXR1cm4gcmV0OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuCisJcmV0dXJuIChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCBzZWxlY3RvcnMsIGF1dG9Jc1plcm8peworCXZhciB0b3RhbCA9IDA7CisJZm9yKHZhciB4PTA7IHg8c2VsZWN0b3JzLmxlbmd0aDsgeCsrKXsKKwkJdG90YWwgKz0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUobm9kZSwgc2VsZWN0b3JzW3hdLCBhdXRvSXNaZXJvKTsKKwl9CisJcmV0dXJuIHRvdGFsOworfQorCitkb2pvLmh0bWwuZ2V0TWFyZ2luID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBtYXJnaW4KKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCJdLCAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykpLAorCQloZWlnaHQ6IGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJtYXJnaW4tdG9wIiwgIm1hcmdpbi1ib3R0b20iXSwgKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpKQorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0Qm9yZGVyID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBib3JkZXIKKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCAnbGVmdCcpICsgZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCAncmlnaHQnKSwKKwkJaGVpZ2h0OiBkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsICd0b3AnKSArIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwgJ2JvdHRvbScpCisJfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlyZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIGJvcmRlcgorCXJldHVybiAoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICdib3JkZXItJyArIHNpZGUgKyAnLXN0eWxlJykgPT0gJ25vbmUnID8gMCA6IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKG5vZGUsICdib3JkZXItJyArIHNpZGUgKyAnLXdpZHRoJykpOwkvLyBpbnRlZ2VyCit9CisKK2Rvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlyZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIG1hcmdpbgorCXJldHVybiBkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsIFsibWFyZ2luLSIgKyBzaWRlXSwgZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZShub2RlKSk7CS8vCWludGVnZXIKK30KKworZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIHBhZGRpbmcgCisJcmV0dXJuIGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJwYWRkaW5nLSIgKyBzaWRlXSwgdHJ1ZSk7CS8vCWludGVnZXIKK30KKworZG9qby5odG1sLmdldFBhZGRpbmcgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYXNzZWQgbm9kZSdzIHBhZGRpbmcKKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbInBhZGRpbmctbGVmdCIsICJwYWRkaW5nLXJpZ2h0Il0sIHRydWUpLAorCQloZWlnaHQ6IGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJwYWRkaW5nLXRvcCIsICJwYWRkaW5nLWJvdHRvbSJdLCB0cnVlKQorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0UGFkQm9yZGVyID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBwYWRkaW5nIGFuZCBib3JkZXIKKwl2YXIgcGFkID0gZG9qby5odG1sLmdldFBhZGRpbmcobm9kZSk7CisJdmFyIGJvcmRlciA9IGRvam8uaHRtbC5nZXRCb3JkZXIobm9kZSk7CisJcmV0dXJuIHsgd2lkdGg6IHBhZC53aWR0aCArIGJvcmRlci53aWR0aCwgaGVpZ2h0OiBwYWQuaGVpZ2h0ICsgYm9yZGVyLmhlaWdodCB9OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmdldEJveFNpemluZyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgd2hpY2ggYm94IG1vZGVsIHRoZSBwYXNzZWQgZWxlbWVudCBpcyB3b3JraW5nIHdpdGgKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGJzID0gZG9qby5odG1sLmJveFNpemluZzsKKwlpZigoKGguaWUpfHwoaC5vcGVyYSkpICYmIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiaW1nIil7IAorCQl2YXIgY20gPSBkb2N1bWVudFsiY29tcGF0TW9kZSJdOworCQlpZigoY20gPT0gIkJhY2tDb21wYXQiKXx8KGNtID09ICJRdWlya3NNb2RlIikpeworCQkJcmV0dXJuIGJzLkJPUkRFUl9CT1g7IAkvLwlzdHJpbmcKKwkJfWVsc2V7CisJCQlyZXR1cm4gYnMuQ09OVEVOVF9CT1g7IAkvLwlzdHJpbmcKKwkJfQorCX1lbHNleworCQlpZihhcmd1bWVudHMubGVuZ3RoID09IDApeyBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyB9CisJCXZhciBzaXppbmc7CisJCWlmKCFoLmllKXsKKwkJCXNpemluZyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiLW1vei1ib3gtc2l6aW5nIik7CisJCQlpZighc2l6aW5nKXsgCisJCQkJc2l6aW5nID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJib3gtc2l6aW5nIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIChzaXppbmcgPyBzaXppbmcgOiBicy5DT05URU5UX0JPWCk7CS8vCXN0cmluZworCX0KK30KKworZG9qby5odG1sLmlzQm9yZGVyQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJucyB3aGV0aGVyIHRoZSBwYXNzZWQgZWxlbWVudCBpcyB1c2luZyBib3JkZXIgYm94IHNpemluZyBvciBub3QuCisJcmV0dXJuIChkb2pvLmh0bWwuZ2V0Qm94U2l6aW5nKG5vZGUpID09IGRvam8uaHRtbC5ib3hTaXppbmcuQk9SREVSX0JPWCk7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLmdldEJvcmRlckJveCA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHBhc3NlZCBlbGVtZW50IGJhc2VkIG9uIGJvcmRlci1ib3ggc2l6aW5nLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJcmV0dXJuIHsgd2lkdGg6IG5vZGUub2Zmc2V0V2lkdGgsIGhlaWdodDogbm9kZS5vZmZzZXRIZWlnaHQgfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRQYWRkaW5nQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFkZGluZyBib3ggKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9ib3guaHRtbCkKKwl2YXIgYm94ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsKKwl2YXIgYm9yZGVyID0gZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKKwlyZXR1cm4geworCQl3aWR0aDogYm94LndpZHRoIC0gYm9yZGVyLndpZHRoLAorCQloZWlnaHQ6Ym94LmhlaWdodCAtIGJvcmRlci5oZWlnaHQKKwl9OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmdldENvbnRlbnRCb3ggPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb250ZW50IGJveCAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9IGRvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSk7CisJcmV0dXJuIHsKKwkJd2lkdGg6IG5vZGUub2Zmc2V0V2lkdGggLSBwYWRib3JkZXIud2lkdGgsCisJCWhlaWdodDogbm9kZS5vZmZzZXRIZWlnaHQgLSBwYWRib3JkZXIuaGVpZ2h0CisJfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBvYmplY3QgKi9hcmdzKXsKKwkvLwlzdW1tYXJ5CisJLy8JU2V0cyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFzc2VkIG5vZGUgYWNjb3JkaW5nIHRvIGNvbnRlbnQgc2l6aW5nLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpZHRoID0gMDsgdmFyIGhlaWdodCA9IDA7CisJdmFyIGlzYmIgPSBkb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9IChpc2JiID8gZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKSA6IHsgd2lkdGg6IDAsIGhlaWdodDogMH0pOworCXZhciByZXQgPSB7fTsKKwlpZih0eXBlb2YgYXJncy53aWR0aCAhPSAidW5kZWZpbmVkIil7CisJCXdpZHRoID0gYXJncy53aWR0aCArIHBhZGJvcmRlci53aWR0aDsKKwkJcmV0LndpZHRoID0gZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCAid2lkdGgiLCB3aWR0aCk7CisJfQorCWlmKHR5cGVvZiBhcmdzLmhlaWdodCAhPSAidW5kZWZpbmVkIil7CisJCWhlaWdodCA9IGFyZ3MuaGVpZ2h0ICsgcGFkYm9yZGVyLmhlaWdodDsKKwkJcmV0LmhlaWdodCA9IGRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwgImhlaWdodCIsIGhlaWdodCk7CisJfQorCXJldHVybiByZXQ7CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0TWFyZ2luQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFzc2VkIG5vZGUgaW5jbHVkaW5nIGFueSBtYXJnaW5zLgorCXZhciBib3JkZXJib3ggPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOworCXZhciBtYXJnaW4gPSBkb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOworCXJldHVybiB7IHdpZHRoOiBib3JkZXJib3gud2lkdGggKyBtYXJnaW4ud2lkdGgsIGhlaWdodDogYm9yZGVyYm94LmhlaWdodCArIG1hcmdpbi5oZWlnaHQgfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3ggPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIG9iamVjdCAqL2FyZ3MpeworCS8vCXN1bW1hcnkKKwkvLwlTZXRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwYXNzZWQgbm9kZSB1c2luZyBtYXJnaW4gYm94IGNhbGNzLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpZHRoID0gMDsgdmFyIGhlaWdodCA9IDA7CisJdmFyIGlzYmIgPSBkb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9ICghaXNiYiA/IGRvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSkgOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7CisJdmFyIG1hcmdpbiA9IGRvam8uaHRtbC5nZXRNYXJnaW4obm9kZSk7CisJdmFyIHJldCA9IHt9OworCWlmKHR5cGVvZiBhcmdzLndpZHRoICE9ICJ1bmRlZmluZWQiKXsKKwkJd2lkdGggPSBhcmdzLndpZHRoIC0gcGFkYm9yZGVyLndpZHRoOworCQl3aWR0aCAtPSBtYXJnaW4ud2lkdGg7CisJCXJldC53aWR0aCA9IGRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwgIndpZHRoIiwgd2lkdGgpOworCX0KKwlpZih0eXBlb2YgYXJncy5oZWlnaHQgIT0gInVuZGVmaW5lZCIpeworCQloZWlnaHQgPSBhcmdzLmhlaWdodCAtIHBhZGJvcmRlci5oZWlnaHQ7CisJCWhlaWdodCAtPSBtYXJnaW4uaGVpZ2h0OworCQlyZXQuaGVpZ2h0ID0gZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCAiaGVpZ2h0IiwgaGVpZ2h0KTsKKwl9CisJcmV0dXJuIHJldDsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi90eXBlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJuIGRpbWVzaW9ucyBvZiBhIG5vZGUgYmFzZWQgb24gdGhlIHBhc3NlZCBib3ggbW9kZWwgdHlwZS4KKwl2YXIgYnMgPSBkb2pvLmh0bWwuYm94U2l6aW5nOworCXN3aXRjaCh0eXBlKXsKKwkJY2FzZSBicy5NQVJHSU5fQk9YOgorCQkJcmV0dXJuIGRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSk7CS8vCW9iamVjdAorCQljYXNlIGJzLkJPUkRFUl9CT1g6CisJCQlyZXR1cm4gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsJLy8Jb2JqZWN0CisJCWNhc2UgYnMuUEFERElOR19CT1g6CisJCQlyZXR1cm4gZG9qby5odG1sLmdldFBhZGRpbmdCb3gobm9kZSk7CS8vCW9iamVjdAorCQljYXNlIGJzLkNPTlRFTlRfQk9YOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpOwkvLwlvYmplY3QKKwl9Cit9CisvLyBpbjogY29vcmRpbmF0ZSBhcnJheSBbeCx5LHcsaF0gb3IgZG9tIG5vZGUKKy8vIHJldHVybjogY29vcmRpbmF0ZSBvYmplY3QKK2Rvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3QgPSBkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkgPSBmdW5jdGlvbigvKiBhcnJheSAqL2Nvb3JkcywgLyogYm9vbGVhbj8gKi9pbmNsdWRlU2Nyb2xsLCAvKiBzdHJpbmc/ICovYm94dHlwZSkgeworCS8vCXN1bW1hcnkKKwkvLwlDb252ZXJ0cyBhbiBhcnJheSBvZiBjb29yZGluYXRlcyBpbnRvIGFuIG9iamVjdCBvZiBuYW1lZCBhcmd1bWVudHMuCisJaWYoY29vcmRzIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGNvb3JkcyA9PSAiYXJyYXkiKXsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkiLCAidXNlIGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3Qoe2xlZnQ6ICwgdG9wOiAsIHdpZHRoOiAsIGhlaWdodDogfSkgaW5zdGVhZCIsICIwLjUiKTsKKwkJLy8gY29vcmRzIGlzIGFscmVhZHkgYW4gYXJyYXkgKG9mIGZvcm1hdCBbeCx5LHcsaF0pLCBqdXN0IHJldHVybiBpdAorCQl3aGlsZSAoIGNvb3Jkcy5sZW5ndGggPCA0ICkgeyBjb29yZHMucHVzaCgwKTsgfQorCQl3aGlsZSAoIGNvb3Jkcy5sZW5ndGggPiA0ICkgeyBjb29yZHMucG9wKCk7IH0KKwkJdmFyIHJldCA9IHsKKwkJCWxlZnQ6IGNvb3Jkc1swXSwKKwkJCXRvcDogY29vcmRzWzFdLAorCQkJd2lkdGg6IGNvb3Jkc1syXSwKKwkJCWhlaWdodDogY29vcmRzWzNdCisJCX07CisJfWVsc2UgaWYoIWNvb3Jkcy5ub2RlVHlwZSAmJiAhKGNvb3JkcyBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2YgY29vcmRzID09ICJzdHJpbmciKSAmJgorCQkJICgnd2lkdGgnIGluIGNvb3JkcyB8fCAnaGVpZ2h0JyBpbiBjb29yZHMgfHwgJ2xlZnQnIGluIGNvb3JkcyB8fAorCQkJICAneCcgaW4gY29vcmRzIHx8ICd0b3AnIGluIGNvb3JkcyB8fCAneScgaW4gY29vcmRzKSl7CisJCS8vIGNvb3JkcyBpcyBhIGNvb3JkaW5hdGUgb2JqZWN0IG9yIGF0IGxlYXN0IHBhcnQgb2Ygb25lCisJCXZhciByZXQgPSB7CisJCQlsZWZ0OiBjb29yZHMubGVmdHx8Y29vcmRzLnh8fDAsCisJCQl0b3A6IGNvb3Jkcy50b3B8fGNvb3Jkcy55fHwwLAorCQkJd2lkdGg6IGNvb3Jkcy53aWR0aHx8MCwKKwkJCWhlaWdodDogY29vcmRzLmhlaWdodHx8MAorCQl9OworCX1lbHNleworCQkvLyBjb29yZHMgaXMgYW4gZG9tIG9iamVjdCAob3IgZG9tIG9iamVjdCBpZCk7IHJldHVybiBpdCdzIGNvb3JkaW5hdGVzCisJCXZhciBub2RlID0gZG9qby5ieUlkKGNvb3Jkcyk7CisJCXZhciBwb3MgPSBkb2pvLmh0bWwuYWJzKG5vZGUsIGluY2x1ZGVTY3JvbGwsIGJveHR5cGUpOworCQl2YXIgbWFyZ2luYm94ID0gZG9qby5odG1sLmdldE1hcmdpbkJveChub2RlKTsKKwkJdmFyIHJldCA9IHsKKwkJCWxlZnQ6IHBvcy5sZWZ0LAorCQkJdG9wOiBwb3MudG9wLAorCQkJd2lkdGg6IG1hcmdpbmJveC53aWR0aCwKKwkJCWhlaWdodDogbWFyZ2luYm94LmhlaWdodAorCQl9OworCX0KKwlyZXQueCA9IHJldC5sZWZ0OworCXJldC55ID0gcmV0LnRvcDsKKwlyZXR1cm4gcmV0OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLnNldE1hcmdpbkJveFdpZHRoID0gZG9qby5odG1sLnNldE91dGVyV2lkdGggPSBmdW5jdGlvbihub2RlLCB3aWR0aCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldE1hcmdpbkJveFdpZHRoIiwgInNldE1hcmdpbkJveCIsIGFyZ3VtZW50cywgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94SGVpZ2h0ID0gZG9qby5odG1sLnNldE91dGVySGVpZ2h0ID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0TWFyZ2luQm94SGVpZ2h0IiwgInNldE1hcmdpbkJveCIsIGFyZ3VtZW50cywgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldE1hcmdpbkJveFdpZHRoID0gZG9qby5odG1sLmdldE91dGVyV2lkdGggPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5Cb3hXaWR0aCIsICJnZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldE1hcmdpbkJveEhlaWdodCA9IGRvam8uaHRtbC5nZXRPdXRlckhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbkJveEhlaWdodCIsICJnZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRUb3RhbE9mZnNldCA9IGZ1bmN0aW9uKG5vZGUsIHR5cGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRUb3RhbE9mZnNldCIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCB0eXBlKTsKK30KK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVggPSBmdW5jdGlvbihub2RlLCBpbmNsdWRlU2Nyb2xsKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0QWJzb2x1dGVYIiwgImdldEFic29sdXRlUG9zaXRpb24iLCBhcmd1bWVudHMsIG51bGwsICJ4Iik7Cit9Citkb2pvLmh0bWwuZ2V0QWJzb2x1dGVZID0gZnVuY3Rpb24obm9kZSwgaW5jbHVkZVNjcm9sbCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEFic29sdXRlWSIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCAieSIpOworfQorZG9qby5odG1sLnRvdGFsT2Zmc2V0TGVmdCA9IGZ1bmN0aW9uKG5vZGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJ0b3RhbE9mZnNldExlZnQiLCAiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsIGFyZ3VtZW50cywgbnVsbCwgImxlZnQiKTsKK30KK2Rvam8uaHRtbC50b3RhbE9mZnNldFRvcCA9IGZ1bmN0aW9uKG5vZGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJ0b3RhbE9mZnNldFRvcCIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCAidG9wIik7Cit9Citkb2pvLmh0bWwuZ2V0TWFyZ2luV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luV2lkdGgiLCAiZ2V0TWFyZ2luIiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5nZXRNYXJnaW5IZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luSGVpZ2h0IiwgImdldE1hcmdpbiIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldEJvcmRlcldpZHRoID0gZnVuY3Rpb24obm9kZSl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlcldpZHRoIiwgImdldEJvcmRlciIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuZ2V0Qm9yZGVySGVpZ2h0ID0gZnVuY3Rpb24obm9kZSl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckhlaWdodCIsICJnZXRCb3JkZXIiLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRQYWRkaW5nV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkZGluZ1dpZHRoIiwgImdldFBhZGRpbmciLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldFBhZGRpbmdIZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkZGluZ0hlaWdodCIsICJnZXRQYWRkaW5nIiwgYXJndW1lbnRzLCBudWxsLCAiaGVpZ2h0Iik7Cit9Citkb2pvLmh0bWwuZ2V0UGFkQm9yZGVyV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkQm9yZGVyV2lkdGgiLCAiZ2V0UGFkQm9yZGVyIiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXJIZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkQm9yZGVySGVpZ2h0IiwgImdldFBhZEJvcmRlciIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldEJvcmRlckJveFdpZHRoID0gZG9qby5odG1sLmdldElubmVyV2lkdGggPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJCb3hXaWR0aCIsICJnZXRCb3JkZXJCb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldEJvcmRlckJveEhlaWdodCA9IGRvam8uaHRtbC5nZXRJbm5lckhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckJveEhlaWdodCIsICJnZXRCb3JkZXJCb3giLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRDb250ZW50Qm94V2lkdGggPSBkb2pvLmh0bWwuZ2V0Q29udGVudFdpZHRoID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Q29udGVudEJveFdpZHRoIiwgImdldENvbnRlbnRCb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldENvbnRlbnRCb3hIZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldENvbnRlbnRCb3hIZWlnaHQiLCAiZ2V0Q29udGVudEJveCIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLnNldENvbnRlbnRCb3hXaWR0aCA9IGRvam8uaHRtbC5zZXRDb250ZW50V2lkdGggPSBmdW5jdGlvbihub2RlLCB3aWR0aCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldENvbnRlbnRCb3hXaWR0aCIsICJzZXRDb250ZW50Qm94IiwgYXJndW1lbnRzLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94SGVpZ2h0ID0gZG9qby5odG1sLnNldENvbnRlbnRIZWlnaHQgPSBmdW5jdGlvbihub2RlLCBoZWlnaHQpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRDb250ZW50Qm94SGVpZ2h0IiwgInNldENvbnRlbnRCb3giLCBhcmd1bWVudHMsICJoZWlnaHQiKTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLmxmeC5odG1sIik7CisKKworCisKKworCisKKworZG9qby5sZnguaHRtbC5fYnlJZCA9IGZ1bmN0aW9uKG5vZGVzKXsKKwlpZighbm9kZXMpeyByZXR1cm4gW107IH0KKwlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJaWYoIW5vZGVzLmFscmVhZHlDaGVja2VkKXsKKwkJCXZhciBuID0gW107CisJCQlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCQkJbi5wdXNoKGRvam8uYnlJZChub2RlKSk7CisJCQl9KTsKKwkJCW4uYWxyZWFkeUNoZWNrZWQgPSB0cnVlOworCQkJcmV0dXJuIG47CisJCX1lbHNleworCQkJcmV0dXJuIG5vZGVzOworCQl9CisJfWVsc2V7CisJCXZhciBuID0gW107CisJCW4ucHVzaChkb2pvLmJ5SWQobm9kZXMpKTsKKwkJbi5hbHJlYWR5Q2hlY2tlZCA9IHRydWU7CisJCXJldHVybiBuOworCX0KK30KKworZG9qby5sZnguaHRtbC5wcm9wZXJ0eUFuaW1hdGlvbiA9IGZ1bmN0aW9uKAkvKkRPTU5vZGVbXSovIG5vZGVzLCAKKwkJCQkJCQkJCQkJLypPYmplY3RbXSovIHByb3BlcnR5TWFwLCAKKwkJCQkJCQkJCQkJLyppbnQqLyBkdXJhdGlvbiwKKwkJCQkJCQkJCQkJLypmdW5jdGlvbiovIGVhc2luZywKKwkJCQkJCQkJCQkJLypPYmplY3QqLyBoYW5kbGVycyl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHRyYW5zaXRpb24gdGhlIHByb3BlcnRpZXMgb2YgIm5vZGVzIgorCS8vCQkJZGVwZW5kaW5nIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluICJwcm9wZXJ0eU1hcCIuCisJLy8gbm9kZXM6IEFuIGFycmF5IG9mIERPTU5vZGVzIG9yIG9uZSBET01Ob2RlLgorCS8vIHByb3BlcnR5TWFwOiB7IHByb3BlcnR5OiBTdHJpbmcsIHN0YXJ0OiBEZWNpbWFsPywgZW5kOiBEZWNpbWFsPywgdW5pdHM6IFN0cmluZz8gfQorCS8vCQkJCUFuIGFycmF5IG9mIG9iamVjdHMgZGVmaW5pbmcgcHJvcGVydGllcyB0byBjaGFuZ2UuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGhhbmRsZXJzOiB7IGhhbmRsZXI6IEZ1bmN0aW9uPywgb25zdGFydDogRnVuY3Rpb24/LCBvbnN0b3A6IEZ1bmN0aW9uPywgb25hbmltYXRlOiBGdW5jdGlvbj8gfQorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisKKwl2YXIgdGFyZ3MgPSB7CisJCSJwcm9wZXJ0eU1hcCI6IHByb3BlcnR5TWFwLAorCQkibm9kZXMiOiBub2RlcywKKwkJImR1cmF0aW9uIjogZHVyYXRpb24sCisJCSJlYXNpbmciOiBlYXNpbmd8fGRvam8ubGZ4LmVhc2VEZWZhdWx0CisJfTsKKwkKKwl2YXIgc2V0RW1VcCA9IGZ1bmN0aW9uKGFyZ3MpeworCQlpZihhcmdzLm5vZGVzLmxlbmd0aD09MSl7CisJCQkvLyBGSVhNRTogd2UncmUgb25seSBzdXBwb3J0aW5nIHN0YXJ0LXZhbHVlIGZpbGxpbmcgd2hlbiBvbmUgbm9kZSBpcworCQkJLy8gcGFzc2VkCisJCQkKKwkJCXZhciBwbSA9IGFyZ3MucHJvcGVydHlNYXA7CisJCQlpZighZG9qby5sYW5nLmlzQXJyYXkoYXJncy5wcm9wZXJ0eU1hcCkpeworCQkJCS8vIGl0J3Mgc3R1cGlkIHRvIGhhdmUgdG8gcGFjayBhbiBhcnJheSB3aXRoIGEgc2V0IG9mIG9iamVjdHMKKwkJCQkvLyB3aGVuIHlvdSBjYW4ganVzdCBwYXNzIGluIGFuIG9iamVjdCBsaXN0CisJCQkJdmFyIHBhcnIgPSBbXTsKKwkJCQlmb3IodmFyIHBuYW1lIGluIHBtKXsKKwkJCQkJcG1bcG5hbWVdLnByb3BlcnR5ID0gcG5hbWU7CisJCQkJCXBhcnIucHVzaChwbVtwbmFtZV0pOworCQkJCX0KKwkJCQlwbSA9IGFyZ3MucHJvcGVydHlNYXAgPSBwYXJyOworCQkJfQorCQkJZG9qby5sYW5nLmZvckVhY2gocG0sIGZ1bmN0aW9uKHByb3ApeworCQkJCWlmKGRqX3VuZGVmKCJzdGFydCIsIHByb3ApKXsKKwkJCQkJaWYocHJvcC5wcm9wZXJ0eSAhPSAib3BhY2l0eSIpeworCQkJCQkJcHJvcC5zdGFydCA9IHBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKGFyZ3Mubm9kZXNbMF0sIHByb3AucHJvcGVydHkpKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlwcm9wLnN0YXJ0ID0gZG9qby5odG1sLmdldE9wYWNpdHkoYXJncy5ub2Rlc1swXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXZhciBjb29yZHNBc0ludHMgPSBmdW5jdGlvbihjb29yZHMpeworCQl2YXIgY2ludHMgPSBbXTsKKwkJZG9qby5sYW5nLmZvckVhY2goY29vcmRzLCBmdW5jdGlvbihjKXsgCisJCQljaW50cy5wdXNoKE1hdGgucm91bmQoYykpOworCQl9KTsKKwkJcmV0dXJuIGNpbnRzOworCX0KKworCXZhciBzZXRTdHlsZSA9IGZ1bmN0aW9uKG4sIHN0eWxlKXsKKwkJbiA9IGRvam8uYnlJZChuKTsKKwkJaWYoIW4gfHwgIW4uc3R5bGUpeyByZXR1cm47IH0KKwkJZm9yKHZhciBzIGluIHN0eWxlKXsKKwkJCXRyeXsKKwkJCQlpZihzID09ICJvcGFjaXR5Iil7CisJCQkJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG4sIHN0eWxlW3NdKTsKKwkJCQl9ZWxzZXsKKwkJCQkJCW4uc3R5bGVbc10gPSBzdHlsZVtzXTsKKwkJCQl9CisJCQl9Y2F0Y2goZSl7IGRvam8uZGVidWcoZSk7IH0KKwkJfQorCX0KKworCXZhciBwcm9wTGluZSA9IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQl0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwkJdGhpcy5kaWZmcyA9IG5ldyBBcnJheShwcm9wZXJ0aWVzLmxlbmd0aCk7CisJCWRvam8ubGFuZy5mb3JFYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uKHByb3AsIGkpeworCQkJLy8gY2FsY3VsYXRlIHRoZSBlbmQgLSBzdGFydCB0byBvcHRpbWl6ZSBhIGJpdAorCQkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5zdGFydCkpeworCQkJCXByb3Auc3RhcnQgPSBwcm9wLnN0YXJ0KHByb3AsIGkpOworCQkJfQorCQkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5lbmQpKXsKKwkJCQlwcm9wLmVuZCA9IHByb3AuZW5kKHByb3AsIGkpOworCQkJfQorCQkJaWYoZG9qby5sYW5nLmlzQXJyYXkocHJvcC5zdGFydCkpeworCQkJCS8vIGRvbid0IGxvb3AgdGhyb3VnaCB0aGUgYXJyYXlzCisJCQkJdGhpcy5kaWZmc1tpXSA9IG51bGw7CisJCQl9ZWxzZSBpZihwcm9wLnN0YXJ0IGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpeworCQkJCS8vIHNhdmUgdGhlc2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRvUmdiKCkgZXZlcnkgZ2V0VmFsdWUoKSBjYWxsCisJCQkJcHJvcC5zdGFydFJnYiA9IHByb3Auc3RhcnQudG9SZ2IoKTsKKwkJCQlwcm9wLmVuZFJnYiA9IHByb3AuZW5kLnRvUmdiKCk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLmRpZmZzW2ldID0gcHJvcC5lbmQgLSBwcm9wLnN0YXJ0OworCQkJfQorCQl9LCB0aGlzKTsKKworCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24obil7CisJCQl2YXIgcmV0ID0ge307CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLl9wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wLCBpKXsKKwkJCQl2YXIgdmFsdWUgPSBudWxsOworCQkJCWlmKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKXsKKwkJCQkJLy8gRklYTUU6IHdoYXQgdG8gZG8gaGVyZT8KKwkJCQl9ZWxzZSBpZihwcm9wLnN0YXJ0IGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpeworCQkJCQl2YWx1ZSA9IChwcm9wLnVuaXRzfHwicmdiIikgKyAiKCI7CisJCQkJCWZvcih2YXIgaiA9IDAgOyBqIDwgcHJvcC5zdGFydFJnYi5sZW5ndGggOyBqKyspeworCQkJCQkJdmFsdWUgKz0gTWF0aC5yb3VuZCgoKHByb3AuZW5kUmdiW2pdIC0gcHJvcC5zdGFydFJnYltqXSkgKiBuKSArIHByb3Auc3RhcnRSZ2Jbal0pICsgKGogPCBwcm9wLnN0YXJ0UmdiLmxlbmd0aCAtIDEgPyAiLCIgOiAiIik7CisJCQkJCX0KKwkJCQkJdmFsdWUgKz0gIikiOworCQkJCX1lbHNleworCQkJCQl2YWx1ZSA9ICgodGhpcy5kaWZmc1tpXSkgKiBuKSArIHByb3Auc3RhcnQgKyAocHJvcC5wcm9wZXJ0eSAhPSAib3BhY2l0eSIgPyBwcm9wLnVuaXRzfHwicHgiIDogIiIpOworCQkJCX0KKwkJCQlyZXRbZG9qby5odG1sLnRvQ2FtZWxDYXNlKHByb3AucHJvcGVydHkpXSA9IHZhbHVlOworCQkJfSwgdGhpcyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCQorCXZhciBhbmltID0gbmV3IGRvam8ubGZ4LkFuaW1hdGlvbih7CisJCQliZWZvcmVCZWdpbjogZnVuY3Rpb24oKXsgCisJCQkJc2V0RW1VcCh0YXJncyk7IAorCQkJCWFuaW0uY3VydmUgPSBuZXcgcHJvcExpbmUodGFyZ3MucHJvcGVydHlNYXApOworCQkJfSwKKwkJCW9uQW5pbWF0ZTogZnVuY3Rpb24ocHJvcFZhbHVlcyl7CisJCQkJZG9qby5sYW5nLmZvckVhY2godGFyZ3Mubm9kZXMsIGZ1bmN0aW9uKG5vZGUpeworCQkJCQlzZXRTdHlsZShub2RlLCBwcm9wVmFsdWVzKTsKKwkJCQl9KTsKKwkJCX0KKwkJfSwKKwkJdGFyZ3MuZHVyYXRpb24sIAorCQludWxsLAorCQl0YXJncy5lYXNpbmcKKwkpOworCWlmKGhhbmRsZXJzKXsKKwkJZm9yKHZhciB4IGluIGhhbmRsZXJzKXsKKwkJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGhhbmRsZXJzW3hdKSl7CisJCQkJYW5pbS5jb25uZWN0KHgsIGFuaW0sIGhhbmRsZXJzW3hdKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuX21ha2VGYWRlYWJsZSA9IGZ1bmN0aW9uKG5vZGVzKXsKKwl2YXIgbWFrZUZhZGUgPSBmdW5jdGlvbihub2RlKXsKKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkvLyBvbmx5IHNldCB0aGUgem9vbSBpZiB0aGUgInRpY2tsZSIgdmFsdWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlCisJCQkvLyBkZWZhdWx0CisJCQlpZiggKG5vZGUuc3R5bGUuem9vbS5sZW5ndGggPT0gMCkgJiYKKwkJCQkoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJ6b29tIikgPT0gIm5vcm1hbCIpICl7CisJCQkJLy8gbWFrZSBzdXJlIHRoZSBub2RlICJoYXNMYXlvdXQiCisJCQkJLy8gTk9URTogdGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBsYXJnZXIgYW5kIHNtYWxsZXIgdXNlci1zZXQgdGV4dAorCQkJCS8vIHNpemVzIGFuZCB3b3JrcyBmaW5lCisJCQkJbm9kZS5zdHlsZS56b29tID0gIjEiOworCQkJCS8vIG5vZGUuc3R5bGUuem9vbSA9ICJub3JtYWwiOworCQkJfQorCQkJLy8gZG9uJ3Qgc2V0IHRoZSB3aWR0aCB0byBhdXRvIGlmIGl0IGRpZG4ndCBhbHJlYWR5IGNhc2NhZGUgdGhhdCB3YXkuCisJCQkvLyBXZSBkb24ndCB3YW50IHRvIGYgYW55b25lcyBkZXNpZ25zCisJCQlpZigJKG5vZGUuc3R5bGUud2lkdGgubGVuZ3RoID09IDApICYmCisJCQkJKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAid2lkdGgiKSA9PSAiYXV0byIpICl7CisJCQkJbm9kZS5zdHlsZS53aWR0aCA9ICJhdXRvIjsKKwkJCX0KKwkJfQorCX0KKwlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIG1ha2VGYWRlKTsKKwl9ZWxzZXsKKwkJbWFrZUZhZGUobm9kZXMpOworCX0KK30KKworZG9qby5sZnguaHRtbC5mYWRlID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkgIC8qT2JqZWN0Ki92YWx1ZXMsCisJCQkJCQkJICAvKmludD8qLyBkdXJhdGlvbiwKKwkJCQkJCQkgIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLAorCQkJCQkJCSAgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTpSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSB0aGUgIm5vZGVzIiBmcm9tIHRoZSBzdGFydCB0byBlbmQgdmFsdWVzIHBhc3NlZC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gdmFsdWVzOiB7IHN0YXJ0OiBEZWNpbWFsPywgZW5kOiBEZWNpbWFsPyB9CisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIHByb3BzID0geyBwcm9wZXJ0eTogIm9wYWNpdHkiIH07CisJaWYoIWRqX3VuZGVmKCJzdGFydCIsIHZhbHVlcykpeworCQlwcm9wcy5zdGFydCA9IHZhbHVlcy5zdGFydDsKKwl9ZWxzZXsKKwkJcHJvcHMuc3RhcnQgPSBmdW5jdGlvbigpeyByZXR1cm4gZG9qby5odG1sLmdldE9wYWNpdHkobm9kZXNbMF0pOyB9OworCX0KKworCWlmKCFkal91bmRlZigiZW5kIiwgdmFsdWVzKSl7CisJCXByb3BzLmVuZCA9IHZhbHVlcy5lbmQ7CisJfWVsc2V7CisJCWRvam8ucmFpc2UoImRvam8ubGZ4Lmh0bWwuZmFkZSBuZWVkcyBhbiBlbmQgdmFsdWUiKTsKKwl9CisKKwl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGVzLCBbIHByb3BzIF0sIGR1cmF0aW9uLCBlYXNpbmcpOworCWFuaW0uY29ubmVjdCgiYmVmb3JlQmVnaW4iLCBmdW5jdGlvbigpeworCQlkb2pvLmxmeC5odG1sLl9tYWtlRmFkZWFibGUobm9kZXMpOworCX0pOworCWlmKGNhbGxiYWNrKXsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKG5vZGVzLCBhbmltKTsgfSk7CisJfQorCisJcmV0dXJuIGFuaW07IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLmZhZGVJbiA9IGZ1bmN0aW9uKC8qRE9NTm9kZVtdKi8gbm9kZXMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIGZhZGUgIm5vZGVzIiBmcm9tIGl0cyBjdXJyZW50IG9wYWNpdHkgdG8gZnVsbHkgb3BhcXVlLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJcmV0dXJuIGRvam8ubGZ4Lmh0bWwuZmFkZShub2RlcywgeyBlbmQ6IDEgfSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KK30KKworZG9qby5sZnguaHRtbC5mYWRlT3V0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywgLyppbnQ/Ki8gZHVyYXRpb24sIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLCAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSAibm9kZXMiIGZyb20gaXRzIGN1cnJlbnQgb3BhY2l0eSB0byBmdWxseSB0cmFuc3BhcmVudC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgkKKwlyZXR1cm4gZG9qby5sZnguaHRtbC5mYWRlKG5vZGVzLCB7IGVuZDogMCB9LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayk7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLmZhZGVTaG93ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywgLyppbnQ/Ki8gZHVyYXRpb24sIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLCAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSAibm9kZXMiIGZyb20gdHJhbnNwYXJlbnQgdG8gb3BhcXVlIGFuZCBzaG93cworCS8vCQkJIm5vZGVzIiBhdCB0aGUgZW5kIGlmIGl0IGlzIGhpZGRlbi4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgkKKwlub2Rlcz1kb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG5vZGUsIDAuMCk7CisJfSk7CisKKwl2YXIgYW5pbSA9IGRvam8ubGZ4Lmh0bWwuZmFkZUluKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayk7CisJYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsIGZ1bmN0aW9uKCl7IAorCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBkb2pvLmh0bWwuc2hvdyk7CisJCX1lbHNleworCQkJZG9qby5odG1sLnNob3cobm9kZXMpOworCQl9CisJfSk7CisKKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuZmFkZUhpZGUgPSBmdW5jdGlvbigvKkRPTU5vZGVbXSovIG5vZGVzLCAvKmludD8qLyBkdXJhdGlvbiwgLypGdW5jdGlvbj8qLyBlYXNpbmcsIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCBmYWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBvcGFjaXR5IHRvIG9wYXF1ZSBhbmQgaGlkZXMKKwkvLwkJCSJub2RlcyIgYXQgdGhlIGVuZC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCXZhciBhbmltID0gZG9qby5sZnguaHRtbC5mYWRlT3V0KG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBmdW5jdGlvbigpeworCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBkb2pvLmh0bWwuaGlkZSk7CisJCX1lbHNleworCQkJZG9qby5odG1sLmhpZGUobm9kZXMpOworCQl9CisJCWlmKGNhbGxiYWNrKXsgY2FsbGJhY2sobm9kZXMsIGFuaW0pOyB9CisJfSk7CisJCisJcmV0dXJuIGFuaW07IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLndpcGVJbiA9IGZ1bmN0aW9uKC8qRE9NTm9kZVtdKi8gbm9kZXMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNob3cgYW5kIHdpcGUgaW4gIm5vZGVzIi4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBvcHJvcCA9IHsgIH07CS8vIG9sZCBwcm9wZXJ0aWVzIG9mIG5vZGUgKGJlZm9yZSB3ZSBtdWNrZWQgdy90aGVtKQorCQkKKwkJLy8gZ2V0IG5vZGUgaGVpZ2h0LCBlaXRoZXIgaXQncyBuYXR1cmFsIGhlaWdodCBvciBpdCdzIGhlaWdodCBzcGVjaWZpZWQgdmlhIHN0eWxlIG9yIGNsYXNzIGF0dHJpYnV0ZXMKKwkJLy8gKGZvciBGRiwgdGhlIG5vZGUgaGFzIHRvIGJlICh0ZW1wb3JhcmlseSkgcmVuZGVyZWQgdG8gbWVhc3VyZSBoZWlnaHQpCisJCS8vIFRPRE86IHNob3VsZCB0aGlzIG9mZnNjcmVlbiBjb2RlIGJlIHBhcnQgb2YgZG9qby5odG1sLCBzbyB0aGF0IGdldEJvcmRlckJveCgpIHdvcmtzIG9uIGhpZGRlbiBub2Rlcz8KKwkJdmFyIG9yaWdUb3AsIG9yaWdMZWZ0LCBvcmlnUG9zaXRpb247CisJCXdpdGgobm9kZS5zdHlsZSl7CisJCQlvcmlnVG9wPXRvcDsgb3JpZ0xlZnQ9bGVmdDsgb3JpZ1Bvc2l0aW9uPXBvc2l0aW9uOworCQkJdG9wPSItOTk5OXB4IjsgbGVmdD0iLTk5OTlweCI7IHBvc2l0aW9uPSJhYnNvbHV0ZSI7CisJCQlkaXNwbGF5PSIiOworCQl9CisJCXZhciBub2RlSGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKS5oZWlnaHQ7CisJCXdpdGgobm9kZS5zdHlsZSl7CisJCQl0b3A9b3JpZ1RvcDsgbGVmdD1vcmlnTGVmdDsgcG9zaXRpb249b3JpZ1Bvc2l0aW9uOworCQkJZGlzcGxheT0ibm9uZSI7CisJCX0KKworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJoZWlnaHQiOiB7CisJCQkJCXN0YXJ0OiAxLCAvLyAwIGNhdXNlcyBJRSB0byBkaXNwbGF5IHRoZSB3aG9sZSBwYW5lbAorCQkJCQllbmQ6IGZ1bmN0aW9uKCl7IHJldHVybiBub2RlSGVpZ2h0OyB9IAorCQkJCX0KKwkJCX0sIAorCQkJZHVyYXRpb24sIAorCQkJZWFzaW5nKTsKKwkKKwkJYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsIGZ1bmN0aW9uKCl7CisJCQlvcHJvcC5vdmVyZmxvdyA9IG5vZGUuc3R5bGUub3ZlcmZsb3c7CisJCQlvcHJvcC5oZWlnaHQgPSBub2RlLnN0eWxlLmhlaWdodDsKKwkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQloZWlnaHQgPSAiMXB4IjsgLy8gMCBjYXVzZXMgSUUgdG8gZGlzcGxheSB0aGUgd2hvbGUgcGFuZWwKKwkJCX0KKwkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQl9KTsKKwkJCisJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbigpeyAKKwkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJb3ZlcmZsb3cgPSBvcHJvcC5vdmVyZmxvdzsKKwkJCQloZWlnaHQgPSBvcHJvcC5oZWlnaHQ7CisJCQl9CisJCQlpZihjYWxsYmFjayl7IGNhbGxiYWNrKG5vZGUsIGFuaW0pOyB9CisJCX0pOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCQorCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLndpcGVPdXQgPSBmdW5jdGlvbigvKkRPTU5vZGVbXSovIG5vZGVzLCAvKmludD8qLyBkdXJhdGlvbiwgLypGdW5jdGlvbj8qLyBlYXNpbmcsIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCB3aXBlIG91dCBhbmQgaGlkZSAibm9kZXMiLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKwkKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBvcHJvcCA9IHsgIH07CS8vIG9sZCBwcm9wZXJ0aWVzIG9mIG5vZGUgKGJlZm9yZSB3ZSBtdWNrZWQgdy90aGVtKQorCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJoZWlnaHQiOiB7CisJCQkJCXN0YXJ0OiBmdW5jdGlvbigpeyByZXR1cm4gZG9qby5odG1sLmdldENvbnRlbnRCb3gobm9kZSkuaGVpZ2h0OyB9LAorCQkJCQllbmQ6IDEgLy8gMCBjYXVzZXMgSUUgdG8gZGlzcGxheSB0aGUgd2hvbGUgcGFuZWwKKwkJCQl9IAorCQkJfSwKKwkJCWR1cmF0aW9uLAorCQkJZWFzaW5nLAorCQkJeworCQkJCSJiZWZvcmVCZWdpbiI6IGZ1bmN0aW9uKCl7CisJCQkJCW9wcm9wLm92ZXJmbG93ID0gbm9kZS5zdHlsZS5vdmVyZmxvdzsKKwkJCQkJb3Byb3AuaGVpZ2h0ID0gbm9kZS5zdHlsZS5oZWlnaHQ7CisJCQkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJCQlvdmVyZmxvdyA9ICJoaWRkZW4iOworCQkJCQl9CisJCQkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQkJCX0sCisJCQkJCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWRvam8uaHRtbC5oaWRlKG5vZGUpOworCQkJCQl3aXRoKG5vZGUuc3R5bGUpeworCQkJCQkJb3ZlcmZsb3cgPSBvcHJvcC5vdmVyZmxvdzsKKwkJCQkJCWhlaWdodCA9IG9wcm9wLmhlaWdodDsKKwkJCQkJfQorCQkJCQlpZihjYWxsYmFjayl7IGNhbGxiYWNrKG5vZGUsIGFuaW0pOyB9CisJCQkJfQorCQkJfQorCQkpOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCisJcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoYW5pbXMpOyAvLyBkb2pvLmxmeC5Db21iaW5lCit9CisKK2Rvam8ubGZ4Lmh0bWwuc2xpZGVUbyA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovIG5vZGVzLAorCQkJCQkJCQkgLypPYmplY3QqLyBjb29yZHMsCisJCQkJCQkJCSAvKmludD8qLyBkdXJhdGlvbiwKKwkJCQkJCQkJIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLAorCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNsaWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB0bworCS8vCQkJdGhlIHBvc2l0aW9uIGRlZmluZWQgaW4gImNvb3JkcyIuCisJLy8gbm9kZXM6IEFuIGFycmF5IG9mIERPTU5vZGVzIG9yIG9uZSBET01Ob2RlLgorCS8vIGNvb3JkczogeyB0b3A6IERlY2ltYWw/LCBsZWZ0OiBEZWNpbWFsPyB9CisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisJdmFyIGNvbXB1dGUgPSBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZTsKKwkKKwlpZihkb2pvLmxhbmcuaXNBcnJheShjb29yZHMpKXsKKwkJLyogY29vcmRzOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLmxmeC5odG1sLnNsaWRlVG8obm9kZSwgYXJyYXkpJywgJ3VzZSBkb2pvLmxmeC5odG1sLnNsaWRlVG8obm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7JywgJzAuNScpOworCQljb29yZHMgPSB7IHRvcDogY29vcmRzWzBdLCBsZWZ0OiBjb29yZHNbMV0gfTsKKwl9CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpeworCQl2YXIgdG9wID0gbnVsbDsKKwkJdmFyIGxlZnQgPSBudWxsOworCQkKKwkJdmFyIGluaXQgPSAoZnVuY3Rpb24oKXsKKwkJCXZhciBpbm5lck5vZGUgPSBub2RlOworCQkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQkJdmFyIHBvcyA9IGNvbXB1dGUoaW5uZXJOb2RlLCAncG9zaXRpb24nKTsKKwkJCQl0b3AgPSAocG9zID09ICdhYnNvbHV0ZScgPyBub2RlLm9mZnNldFRvcCA6IHBhcnNlSW50KGNvbXB1dGUobm9kZSwgJ3RvcCcpKSB8fCAwKTsKKwkJCQlsZWZ0ID0gKHBvcyA9PSAnYWJzb2x1dGUnID8gbm9kZS5vZmZzZXRMZWZ0IDogcGFyc2VJbnQoY29tcHV0ZShub2RlLCAnbGVmdCcpKSB8fCAwKTsKKworCQkJCWlmICghZG9qby5sYW5nLmluQXJyYXkoWydhYnNvbHV0ZScsICdyZWxhdGl2ZSddLCBwb3MpKSB7CisJCQkJCXZhciByZXQgPSBkb2pvLmh0bWwuYWJzKGlubmVyTm9kZSwgdHJ1ZSk7CisJCQkJCWRvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMoaW5uZXJOb2RlLCAicG9zaXRpb246YWJzb2x1dGU7dG9wOiIrcmV0LnkrInB4O2xlZnQ6IityZXQueCsicHg7Iik7CisJCQkJCXRvcCA9IHJldC55OworCQkJCQlsZWZ0ID0gcmV0Lng7CisJCQkJfQorCQkJfQorCQl9KSgpOworCQlpbml0KCk7CisJCQorCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJ0b3AiOiB7IHN0YXJ0OiB0b3AsIGVuZDogKGNvb3Jkcy50b3B8fDApIH0sCisJCQkJImxlZnQiOiB7IHN0YXJ0OiBsZWZ0LCBlbmQ6IChjb29yZHMubGVmdHx8MCkgIH0KKwkJCX0sCisJCQlkdXJhdGlvbiwKKwkJCWVhc2luZywKKwkJCXsgImJlZm9yZUJlZ2luIjogaW5pdCB9CisJCSk7CisKKwkJaWYoY2FsbGJhY2speworCQkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKG5vZGVzLCBhbmltKTsgfSk7CisJCX0KKworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCQorCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLnNsaWRlQnkgPSBmdW5jdGlvbigvKkRPTU5vZGUqLyBub2RlcywgLypPYmplY3QqLyBjb29yZHMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNsaWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbgorCS8vCQkJdG8gaXRzIGN1cnJlbnQgcG9zaXRpb24gcGx1cyB0aGUgbnVtYmVycyBkZWZpbmVkIGluICJjb29yZHMiLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBjb29yZHM6IHsgdG9wOiBEZWNpbWFsPywgbGVmdDogRGVjaW1hbD8gfQorCS8vIGR1cmF0aW9uOiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkvLyBlYXNpbmc6IEFuIGVhc2luZyBmdW5jdGlvbi4KKwkvLyBjYWxsYmFjazogRnVuY3Rpb24gdG8gcnVuIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltcyA9IFtdOworCXZhciBjb21wdXRlID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU7CisKKwlpZihkb2pvLmxhbmcuaXNBcnJheShjb29yZHMpKXsKKwkJLyogY29vcmRzOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwgYXJyYXkpJywgJ3VzZSBkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7JywgJzAuNScpOworCQljb29yZHMgPSB7IHRvcDogY29vcmRzWzBdLCBsZWZ0OiBjb29yZHNbMV0gfTsKKwl9CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciB0b3AgPSBudWxsOworCQl2YXIgbGVmdCA9IG51bGw7CisJCQorCQl2YXIgaW5pdCA9IChmdW5jdGlvbigpeworCQkJdmFyIGlubmVyTm9kZSA9IG5vZGU7CisJCQlyZXR1cm4gZnVuY3Rpb24oKXsKKwkJCQl2YXIgcG9zID0gY29tcHV0ZShpbm5lck5vZGUsICdwb3NpdGlvbicpOworCQkJCXRvcCA9IChwb3MgPT0gJ2Fic29sdXRlJyA/IG5vZGUub2Zmc2V0VG9wIDogcGFyc2VJbnQoY29tcHV0ZShub2RlLCAndG9wJykpIHx8IDApOworCQkJCWxlZnQgPSAocG9zID09ICdhYnNvbHV0ZScgPyBub2RlLm9mZnNldExlZnQgOiBwYXJzZUludChjb21wdXRlKG5vZGUsICdsZWZ0JykpIHx8IDApOworCisJCQkJaWYgKCFkb2pvLmxhbmcuaW5BcnJheShbJ2Fic29sdXRlJywgJ3JlbGF0aXZlJ10sIHBvcykpIHsKKwkJCQkJdmFyIHJldCA9IGRvam8uaHRtbC5hYnMoaW5uZXJOb2RlLCB0cnVlKTsKKwkJCQkJZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcyhpbm5lck5vZGUsICJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6IityZXQueSsicHg7bGVmdDoiK3JldC54KyJweDsiKTsKKwkJCQkJdG9wID0gcmV0Lnk7CisJCQkJCWxlZnQgPSByZXQueDsKKwkJCQl9CisJCQl9CisJCX0pKCk7CisJCWluaXQoKTsKKwkJCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwKKwkJCXsKKwkJCQkidG9wIjogeyBzdGFydDogdG9wLCBlbmQ6IHRvcCsoY29vcmRzLnRvcHx8MCkgfSwKKwkJCQkibGVmdCI6IHsgc3RhcnQ6IGxlZnQsIGVuZDogbGVmdCsoY29vcmRzLmxlZnR8fDApIH0KKwkJCX0sCisJCQlkdXJhdGlvbiwKKwkJCWVhc2luZykuY29ubmVjdCgiYmVmb3JlQmVnaW4iLCBpbml0KTsKKworCQlpZihjYWxsYmFjayl7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24oKXsgY2FsbGJhY2sobm9kZXMsIGFuaW0pOyB9KTsKKwkJfQorCisJCWFuaW1zLnB1c2goYW5pbSk7CisJfSk7CisKKwlyZXR1cm4gZG9qby5sZnguY29tYmluZShhbmltcyk7IC8vIGRvam8ubGZ4LkNvbWJpbmUKK30KKworZG9qby5sZnguaHRtbC5leHBsb2RlID0gZnVuY3Rpb24oLypET01Ob2RlKi8gc3RhcnQsCisJCQkJCQkJCSAvKkRPTU5vZGUqLyBlbmROb2RlLAorCQkJCQkJCQkgLyppbnQ/Ki8gZHVyYXRpb24sCisJCQkJCQkJCSAvKkZ1bmN0aW9uPyovIGVhc2luZywKKwkJCQkJCQkJIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCAKKwkvLyBzdGFydDoKKwkvLyBlbmROb2RlOgorCS8vIGR1cmF0aW9uOiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkvLyBlYXNpbmc6IEFuIGVhc2luZyBmdW5jdGlvbi4KKwkvLyBjYWxsYmFjazogRnVuY3Rpb24gdG8gcnVuIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KKwl2YXIgaCA9IGRvam8uaHRtbDsKKwlzdGFydCA9IGRvam8uYnlJZChzdGFydCk7CisJZW5kTm9kZSA9IGRvam8uYnlJZChlbmROb2RlKTsKKwl2YXIgc3RhcnRDb29yZHMgPSBoLnRvQ29vcmRpbmF0ZU9iamVjdChzdGFydCwgdHJ1ZSk7CisJdmFyIG91dGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwloLmNvcHlTdHlsZShvdXRsaW5lLCBlbmROb2RlKTsKKwlpZihlbmROb2RlLmV4cGxvZGVDbGFzc05hbWUpeyBvdXRsaW5lLmNsYXNzTmFtZSA9IGVuZE5vZGUuZXhwbG9kZUNsYXNzTmFtZTsgfQorCXdpdGgob3V0bGluZS5zdHlsZSl7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJLy8gYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayI7CisJCXZhciBiYWNrZ3JvdW5kU3R5bGUgPSBoLmdldFN0eWxlKHN0YXJ0LCAiYmFja2dyb3VuZC1jb2xvciIpOworCQliYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kU3R5bGUgPyBiYWNrZ3JvdW5kU3R5bGUudG9Mb3dlckNhc2UoKSA6ICJ0cmFuc3BhcmVudCI7CisJCWJhY2tncm91bmRDb2xvciA9IChiYWNrZ3JvdW5kQ29sb3IgPT0gInRyYW5zcGFyZW50IikgPyAicmdiKDIyMSwgMjIxLCAyMjEpIiA6IGJhY2tncm91bmRDb2xvcjsKKwl9CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQob3V0bGluZSk7CisKKwl3aXRoKGVuZE5vZGUuc3R5bGUpeworCQl2aXNpYmlsaXR5ID0gImhpZGRlbiI7CisJCWRpc3BsYXkgPSAiYmxvY2siOworCX0KKwl2YXIgZW5kQ29vcmRzID0gaC50b0Nvb3JkaW5hdGVPYmplY3QoZW5kTm9kZSwgdHJ1ZSk7CisJd2l0aChlbmROb2RlLnN0eWxlKXsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJdmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKKwl9CisKKwl2YXIgcHJvcHMgPSB7IG9wYWNpdHk6IHsgc3RhcnQ6IDAuNSwgZW5kOiAxLjAgfSB9OworCWRvam8ubGFuZy5mb3JFYWNoKFsiaGVpZ2h0IiwgIndpZHRoIiwgInRvcCIsICJsZWZ0Il0sIGZ1bmN0aW9uKHR5cGUpeworCQlwcm9wc1t0eXBlXSA9IHsgc3RhcnQ6IHN0YXJ0Q29vcmRzW3R5cGVdLCBlbmQ6IGVuZENvb3Jkc1t0eXBlXSB9CisJfSk7CisJCisJdmFyIGFuaW0gPSBuZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24ob3V0bGluZSwgCisJCXByb3BzLAorCQlkdXJhdGlvbiwKKwkJZWFzaW5nLAorCQl7CisJCQkiYmVmb3JlQmVnaW4iOiBmdW5jdGlvbigpeworCQkJCWguc2V0RGlzcGxheShvdXRsaW5lLCAiYmxvY2siKTsKKwkJCX0sCisJCQkib25FbmQiOiBmdW5jdGlvbigpeworCQkJCWguc2V0RGlzcGxheShlbmROb2RlLCAiYmxvY2siKTsKKwkJCQlvdXRsaW5lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob3V0bGluZSk7CisJCQl9CisJCX0KKwkpOworCisJaWYoY2FsbGJhY2speworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24oKXsgY2FsbGJhY2soZW5kTm9kZSwgYW5pbSk7IH0pOworCX0KKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuaW1wbG9kZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovIHN0YXJ0Tm9kZSwKKwkJCQkJCQkJIC8qRE9NTm9kZSovIGVuZCwKKwkJCQkJCQkJIC8qaW50PyovIGR1cmF0aW9uLAorCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBlYXNpbmcsCisJCQkJCQkJCSAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgCisJLy8gc3RhcnROb2RlOgorCS8vIGVuZDoKKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJdmFyIGggPSBkb2pvLmh0bWw7CisJc3RhcnROb2RlID0gZG9qby5ieUlkKHN0YXJ0Tm9kZSk7CisJZW5kID0gZG9qby5ieUlkKGVuZCk7CisJdmFyIHN0YXJ0Q29vcmRzID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdChzdGFydE5vZGUsIHRydWUpOworCXZhciBlbmRDb29yZHMgPSBkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KGVuZCwgdHJ1ZSk7CisKKwl2YXIgb3V0bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRvam8uaHRtbC5jb3B5U3R5bGUob3V0bGluZSwgc3RhcnROb2RlKTsKKwlpZiAoc3RhcnROb2RlLmV4cGxvZGVDbGFzc05hbWUpIHsgb3V0bGluZS5jbGFzc05hbWUgPSBzdGFydE5vZGUuZXhwbG9kZUNsYXNzTmFtZTsgfQorCWRvam8uaHRtbC5zZXRPcGFjaXR5KG91dGxpbmUsIDAuMyk7CisJd2l0aChvdXRsaW5lLnN0eWxlKXsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlkaXNwbGF5ID0gIm5vbmUiOworCQliYWNrZ3JvdW5kQ29sb3IgPSBoLmdldFN0eWxlKHN0YXJ0Tm9kZSwgImJhY2tncm91bmQtY29sb3IiKS50b0xvd2VyQ2FzZSgpOworCX0KKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChvdXRsaW5lKTsKKworCXZhciBwcm9wcyA9IHsgb3BhY2l0eTogeyBzdGFydDogMS4wLCBlbmQ6IDAuNSB9IH07CisJZG9qby5sYW5nLmZvckVhY2goWyJoZWlnaHQiLCAid2lkdGgiLCAidG9wIiwgImxlZnQiXSwgZnVuY3Rpb24odHlwZSl7CisJCXByb3BzW3R5cGVdID0geyBzdGFydDogc3RhcnRDb29yZHNbdHlwZV0sIGVuZDogZW5kQ29vcmRzW3R5cGVdIH0KKwl9KTsKKwkKKwl2YXIgYW5pbSA9IG5ldyBkb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihvdXRsaW5lLAorCQlwcm9wcywKKwkJZHVyYXRpb24sCisJCWVhc2luZywKKwkJeworCQkJImJlZm9yZUJlZ2luIjogZnVuY3Rpb24oKXsKKwkJCQlkb2pvLmh0bWwuaGlkZShzdGFydE5vZGUpOworCQkJCWRvam8uaHRtbC5zaG93KG91dGxpbmUpOworCQkJfSwKKwkJCSJvbkVuZCI6IGZ1bmN0aW9uKCl7CisJCQkJb3V0bGluZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGxpbmUpOworCQkJfQorCQl9CisJKTsKKworCWlmKGNhbGxiYWNrKXsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKHN0YXJ0Tm9kZSwgYW5pbSk7IH0pOworCX0KKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkJICAgLypkb2pvLmdmeC5jb2xvci5Db2xvciovIHN0YXJ0Q29sb3IsCisJCQkJCQkJCSAgIC8qaW50PyovIGR1cmF0aW9uLAorCQkJCQkJCQkgICAvKkZ1bmN0aW9uPyovIGVhc2luZywKKwkJCQkJCQkJICAgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgorCS8vCQkJb2YgIm5vZGVzIiB0byBzdGFydENvbG9yIGFuZCB0cmFuc2l0aW9uIGl0IHRvICJub2RlcyIKKwkvLwkJCW9yaWdpbmFsIGNvbG9yLgorCS8vIHN0YXJ0Q29sb3I6IENvbG9yIHRvIHRyYW5zaXRpb24gZnJvbS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKworCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKXsKKwkJdmFyIGNvbG9yID0gZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKTsKKwkJdmFyIGJnID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGJnSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwkJdmFyIHdhc1RyYW5zcGFyZW50ID0gKGJnID09ICJ0cmFuc3BhcmVudCIgfHwgYmcgPT0gInJnYmEoMCwgMCwgMCwgMCkiKTsKKwkJd2hpbGUoY29sb3IubGVuZ3RoID4gMykgeyBjb2xvci5wb3AoKTsgfQorCisJCXZhciByZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3Ioc3RhcnRDb2xvcik7CisJCXZhciBlbmRSZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoY29sb3IpOworCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgCisJCQl7ICJiYWNrZ3JvdW5kLWNvbG9yIjogeyBzdGFydDogcmdiLCBlbmQ6IGVuZFJnYiB9IH0sIAorCQkJZHVyYXRpb24sIAorCQkJZWFzaW5nLAorCQkJeworCQkJCSJiZWZvcmVCZWdpbiI6IGZ1bmN0aW9uKCl7IAorCQkJCQlpZihiZ0ltYWdlKXsKKwkJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIm5vbmUiOworCQkJCQl9CisJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInJnYigiICsgcmdiLnRvUmdiKCkuam9pbigiLCIpICsgIikiOworCQkJCX0sCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWlmKGJnSW1hZ2UpeworCQkJCQkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBiZ0ltYWdlOworCQkJCQl9CisJCQkJCWlmKHdhc1RyYW5zcGFyZW50KXsKKwkJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInRyYW5zcGFyZW50IjsKKwkJCQkJfQorCQkJCQlpZihjYWxsYmFjayl7CisJCQkJCQljYWxsYmFjayhub2RlLCBhbmltKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJKTsKKworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLnVuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkJCSAvKmRvam8uZ2Z4LmNvbG9yLkNvbG9yKi8gZW5kQ29sb3IsCisJCQkJCQkJCQkgLyppbnQ/Ki8gZHVyYXRpb24sCisJCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBlYXNpbmcsCisJCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHRyYW5zaXRpb24gIm5vZGVzIiBiYWNrZ3JvdW5kIGNvbG9yCisJLy8JCQlmcm9tIGl0cyBjdXJyZW50IGNvbG9yIHRvICJlbmRDb2xvciIuCisJLy8gZW5kQ29sb3I6IENvbG9yIHRvIHRyYW5zaXRpb24gdG8uCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBjb2xvciA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihkb2pvLmh0bWwuZ2V0QmFja2dyb3VuZENvbG9yKG5vZGUpKTsKKwkJdmFyIHJnYiA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihlbmRDb2xvcik7CisKKwkJdmFyIGJnSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwkJCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgCisJCQl7ICJiYWNrZ3JvdW5kLWNvbG9yIjogeyBzdGFydDogY29sb3IsIGVuZDogcmdiIH0gfSwKKwkJCWR1cmF0aW9uLCAKKwkJCWVhc2luZywKKwkJCXsKKwkJCQkiYmVmb3JlQmVnaW4iOiBmdW5jdGlvbigpeyAKKwkJCQkJaWYoYmdJbWFnZSl7CisJCQkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJub25lIjsKKwkJCQkJfQorCQkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2IoIiArIGNvbG9yLnRvUmdiKCkuam9pbigiLCIpICsgIikiOworCQkJCX0sCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWlmKGNhbGxiYWNrKXsKKwkJCQkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkpOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxhbmcubWl4aW4oZG9qby5sZngsIGRvam8ubGZ4Lmh0bWwpOworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwlicm93c2VyOiBbImRvam8ubGZ4Lmh0bWwiXSwKKwlkYXNoYm9hcmQ6IFsiZG9qby5sZnguaHRtbCJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9mbGFzaDZfZ2F0ZXdheS5zd2YgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9mbGFzaDZfZ2F0ZXdheS5zd2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1MmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL2ZsYXNoNl9nYXRld2F5LnN3ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9pZnJhbWVfaGlzdG9yeS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vaWZyYW1lX2hpc3RvcnkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDMwOWYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vaWZyYW1lX2hpc3RvcnkuaHRtbApAQCAtMCwwICsxLDg0IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisJPHRpdGxlPjwvdGl0bGU+CisJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPjwvbWV0YT4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisJLy8gPCEtLQorCXZhciBub0luaXQgPSBmYWxzZTsKKwl2YXIgZG9tYWluID0gIiI7CisJLy8gZG9jdW1lbnQuZG9tYWluID0gImxvY2FsaG9zdCI7CisJCisJZnVuY3Rpb24gZGVmaW5lUGFyYW1zKHNwYXJhbXMpeworCQlpZihzcGFyYW1zKXsKKwkJCXZhciBzcyA9IChzcGFyYW1zLmluZGV4T2YoIiZhbXA7IikgPj0gMCkgPyAiJmFtcDsiIDogIiYiOworCQkJc3BhcmFtcyA9IHNwYXJhbXMuc3BsaXQoc3MpOworCQkJZm9yKHZhciB4PTA7IHg8c3BhcmFtcy5sZW5ndGg7IHgrKyl7CisJCQkJdmFyIHRwID0gc3BhcmFtc1t4XS5zcGxpdCgiPSIpOworCQkJCWlmKHR5cGVvZiB3aW5kb3dbdHBbMF1dICE9ICJ1bmRlZmluZWQiKXsKKwkJCQkJd2luZG93W3RwWzBdXSA9ICgodHBbMV09PSJ0cnVlIil8fCh0cFsxXT09ImZhbHNlIikpID8gZXZhbCh0cFsxXSkgOiB0cFsxXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJZnVuY3Rpb24gaW5pdCgpeworCQkvLyBwYXJzZSB0aGUgcXVlcnkgc3RyaW5nIGlmIHRoZXJlIGlzIG9uZSB0byB0cnkgdG8gZ2V0IHBhcmFtcyB0aGF0CisJCS8vIHdlIGNhbiBhY3Qgb24uIEFsc28gYWxsb3cgcGFyYW1zIHRvIGJlIGluIGEgZnJhZ21lbnQgaWRlbnRpZmllci4KKwkJdmFyIHF1ZXJ5ID0gbnVsbDsKKwkJdmFyIGZyYWcgPSBudWxsOworCQl2YXIgdXJsID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsKKwkJdmFyIGhhc2hJbmRleCA9IHVybC5pbmRleE9mKCIjIik7CisJCQorCQkvL0V4dHJhY3QgZnJhZ21lbnQgaWRlbnRpZmllcgorCQlpZihoYXNoSW5kZXggIT0gLTEpeworCQkJZnJhZyA9IHVybC5zdWJzdHJpbmcoaGFzaEluZGV4ICsgMSwgdXJsLmxlbmd0aCk7CisJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJbmRleCk7CisJCX0KKworCQkvL0V4dHJhY3QgcXVlcnlzdHJpbmcKKwkJdmFyIHBhcnRzID0gdXJsLnNwbGl0KCI/Iik7CisJCWlmKHBhcnRzLmxlbmd0aCA9PSAyKXsKKwkJCXF1ZXJ5ID0gcGFydHNbMV07CisJCX0KKworCQlkZWZpbmVQYXJhbXMocXVlcnkpOworCQlkZWZpbmVQYXJhbXMoZnJhZyk7CisKKwkJaWYobm9Jbml0KXsgcmV0dXJuOyB9CisJCWlmKGRvbWFpbi5sZW5ndGggPiAwKXsKKwkJCWRvY3VtZW50LmRvbWFpbiA9IGRvbWFpbjsKKwkJfQorCQl2YXIgaGFzUGFyZW50RG9qbyA9IGZhbHNlOworCQl0cnl7CisJCQloYXNQYXJlbnREb2pvID0gd2luZG93LnBhcmVudCAhPSB3aW5kb3cgJiYgd2luZG93LnBhcmVudFsiZG9qbyJdOworCQl9Y2F0Y2goZSl7CisJCQlhbGVydCgiSW5pdGlhbGl6aW5nIGlmcmFtZV9oaXN0b3J5Lmh0bWwgZmFpbGVkLiBJZiB5b3UgYXJlIHVzaW5nIGEgY3Jvc3MtZG9tYWluIERvam8gYnVpbGQsIgorCQkJCSsgIiBwbGVhc2Ugc2F2ZSBpZnJhbWVfaGlzdG9yeS5odG1sIHRvIHlvdXIgZG9tYWluIGFuZCBzZXQgZGpDb25maWcuZG9qb0lmcmFtZUhpc3RvcnlVcmwiCisJCQkJKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIGlmcmFtZV9oaXN0b3J5Lmh0bWwiKTsKKwkJCXRocm93IGU7CisJCX0KKworCQlpZihoYXNQYXJlbnREb2pvKXsKKwkJCS8vU2V0IHRoZSBwYWdlIHRpdGxlIHNvIElFIGhpc3Rvcnkgc2hvd3MgdXAgd2l0aCBhIHNvbWV3aGF0IGNvcnJlY3QgbmFtZS4KKwkJCWRvY3VtZW50LnRpdGxlID0gd2luZG93LnBhcmVudC5kb2N1bWVudC50aXRsZTsKKwkJCQorCQkJLy9Ob3RpZnkgcGFyZW50IHRoYXQgd2UgYXJlIGxvYWRlZC4KKwkJCXZhciBwZGogPSB3aW5kb3cucGFyZW50LmRvam87CisJCQlpZihwZGpbInVuZG8iXSAmJiBwZGpbInVuZG8iXVsiYnJvd3NlciJdKXsKKwkJCQlwZGoudW5kby5icm93c2VyLmlmcmFtZUxvYWRlZChudWxsLCB3aW5kb3cubG9jYXRpb24pOworCQkJfQorCQl9CisKKwl9CisJLy8gLS0+CisJPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keSBvbmxvYWQ9InRyeXsgaW5pdCgpOyB9Y2F0Y2goZSl7IGFsZXJ0KGUpOyB9Ij4KKwk8aDQ+VGhlIERvam8gVG9vbGtpdCAtLSBpZnJhbWVfaGlzdG9yeS5odG1sPC9oND4KKworCTxwPlRoaXMgZmlsZSBpcyB1c2VkIGluIERvam8ncyBiYWNrL2Z3ZCBidXR0b24gbWFuYWdlbWVudC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19ST09ULmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fUk9PVC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FhMjEwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fUk9PVC5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX1JPT1QiKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5ST09UIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uUk9PVD17ImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJkYXRlRm9ybWF0LW1lZGl1bSI6Inl5eXkgTU1NIGQiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISDptbTpzcyB6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJhbSI6IkFNIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3Il0sImZpZWxkLXllYXIiOiJZZWFyIiwiZXJhcyI6WyJCQ0UiLCJDRSJdLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtaG91ciI6IkhvdXIiLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5IE1NTU0gZCIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJkYXRlRm9ybWF0LXNob3J0IjoieXkvTU0vZGQiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sImZpZWxkLWVyYSI6IkVyYSIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiXSwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsImRheXMtZm9ybWF0LXdpZGUiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCB5eXl5IE1NTU0gZGQiLCJmaWVsZC16b25lIjoiWm9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdfTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5ST09UIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuUk9PVD17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uUk9PVCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLlJPT1Q9eyJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5IE1NTSBkIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJwbSI6IlBNIiwidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiXSwiYW0iOiJBTSIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdLCJmaWVsZC15ZWFyIjoiWWVhciIsImVyYXMiOlsiQkNFIiwiQ0UiXSwiZmllbGQtbWludXRlIjoiTWludXRlIiwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsImZpZWxkLWhvdXIiOiJIb3VyIiwiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSBNTU1NIGQiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJmaWVsZC1lcmEiOiJFcmEiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoiLCJkYXlzLWZvcm1hdC13aWRlIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgeXl5eSBNTU1NIGRkIiwiZmllbGQtem9uZSI6IlpvbmUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciXX07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuUk9PVCIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLlJPT1Q9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5ST09UIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5ST09UPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuUk9PVCIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuUk9PVD17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fZGUtZGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19kZS1kZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI1YmFjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fZGUtZGUuanMKQEAgLTAsMCArMSwxMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJubHMuZG9qb19kZS1kZSIpO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmRlX2RlIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZGVfZGU9eyJmaWVsZC13ZWVrZGF5IjoiV29jaGVudGFnIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkZC5NTS55eXl5IiwiZmllbGQtc2Vjb25kIjoiU2VrdW5kZSIsImZpZWxkLXdlZWsiOiJXb2NoZSIsInBtIjoibmFjaG0uIiwidGltZUZvcm1hdC1mdWxsIjoiSDptbScgVWhyICd6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJhbSI6InZvcm0uIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJTIiwiTSIsIkQiLCJNIiwiRCIsIkYiLCJTIl0sImZpZWxkLXllYXIiOiJKYWhyIiwiZXJhcyI6WyJ2LiBDaHIuIiwibi4gQ2hyLiJdLCJmaWVsZC1ob3VyIjoiU3R1bmRlIiwiZGF0ZUZvcm1hdC1sb25nIjoiZC4gTU1NTSB5eXl5IiwiZmllbGQtZGF5IjoiVGFnIiwiZmllbGQtZGF5cGVyaW9kIjoiVGFnZXNow6RsZnRlIiwiZmllbGQtbW9udGgiOiJNb25hdCIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC5NTS55eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJKYW51YXIiLCJGZWJydWFyIiwiTcOkcnoiLCJBcHJpbCIsIk1haSIsIkp1bmkiLCJKdWxpIiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2t0b2JlciIsIk5vdmVtYmVyIiwiRGV6ZW1iZXIiXSwiZmllbGQtZXJhIjoiRXBvY2hlIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsIkZlYiIsIk1yeiIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIlNvbm50YWciLCJNb250YWciLCJEaWVuc3RhZyIsIk1pdHR3b2NoIiwiRG9ubmVyc3RhZyIsIkZyZWl0YWciLCJTYW1zdGFnIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUsIGQuIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJab25lIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJTbyIsIk1vIiwiRGkiLCJNaSIsIkRvIiwiRnIiLCJTYSJdLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmRlX2RlIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZGVfZGU9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmRlX2RlIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZGVfZGU9eyJmaWVsZC13ZWVrZGF5IjoiV29jaGVudGFnIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkZC5NTS55eXl5IiwiZmllbGQtc2Vjb25kIjoiU2VrdW5kZSIsImZpZWxkLXdlZWsiOiJXb2NoZSIsInBtIjoibmFjaG0uIiwidGltZUZvcm1hdC1mdWxsIjoiSDptbScgVWhyICd6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJhbSI6InZvcm0uIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJTIiwiTSIsIkQiLCJNIiwiRCIsIkYiLCJTIl0sImZpZWxkLXllYXIiOiJKYWhyIiwiZXJhcyI6WyJ2LiBDaHIuIiwibi4gQ2hyLiJdLCJmaWVsZC1ob3VyIjoiU3R1bmRlIiwiZGF0ZUZvcm1hdC1sb25nIjoiZC4gTU1NTSB5eXl5IiwiZmllbGQtZGF5IjoiVGFnIiwiZmllbGQtZGF5cGVyaW9kIjoiVGFnZXNow6RsZnRlIiwiZmllbGQtbW9udGgiOiJNb25hdCIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC5NTS55eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJKYW51YXIiLCJGZWJydWFyIiwiTcOkcnoiLCJBcHJpbCIsIk1haSIsIkp1bmkiLCJKdWxpIiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2t0b2JlciIsIk5vdmVtYmVyIiwiRGV6ZW1iZXIiXSwiZmllbGQtZXJhIjoiRXBvY2hlIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsIkZlYiIsIk1yeiIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIlNvbm50YWciLCJNb250YWciLCJEaWVuc3RhZyIsIk1pdHR3b2NoIiwiRG9ubmVyc3RhZyIsIkZyZWl0YWciLCJTYW1zdGFnIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUsIGQuIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJab25lIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJTbyIsIk1vIiwiRGkiLCJNaSIsIkRvIiwiRnIiLCJTYSJdLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmRlX2RlIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuZGVfZGU9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5kZV9kZSIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZGVfZGU9eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5kZV9kZSIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZGVfZGU9eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2RlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4MDk1MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2RlLmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9fZGUiKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5kZSIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmRlPXsiZmllbGQtd2Vla2RheSI6IldvY2hlbnRhZyIsImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQuTU0ueXl5eSIsImZpZWxkLXNlY29uZCI6IlNla3VuZGUiLCJmaWVsZC13ZWVrIjoiV29jaGUiLCJwbSI6Im5hY2htLiIsInRpbWVGb3JtYXQtZnVsbCI6Ikg6bW0nIFVociAneiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJ2b3JtLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsIk0iLCJEIiwiTSIsIkQiLCJGIiwiUyJdLCJmaWVsZC15ZWFyIjoiSmFociIsImVyYXMiOlsidi4gQ2hyLiIsIm4uIENoci4iXSwiZmllbGQtaG91ciI6IlN0dW5kZSIsImRhdGVGb3JtYXQtbG9uZyI6ImQuIE1NTU0geXl5eSIsImZpZWxkLWRheSI6IlRhZyIsImZpZWxkLWRheXBlcmlvZCI6IlRhZ2VzaMOkbGZ0ZSIsImZpZWxkLW1vbnRoIjoiTW9uYXQiLCJkYXRlRm9ybWF0LXNob3J0IjoiZGQuTU0ueXkiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiSmFudWFyIiwiRmVicnVhciIsIk3DpHJ6IiwiQXByaWwiLCJNYWkiLCJKdW5pIiwiSnVsaSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9rdG9iZXIiLCJOb3ZlbWJlciIsIkRlemVtYmVyIl0sImZpZWxkLWVyYSI6IkVwb2NoZSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCJGZWIiLCJNcnoiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPa3QiLCJOb3YiLCJEZXoiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJTb25udGFnIiwiTW9udGFnIiwiRGllbnN0YWciLCJNaXR0d29jaCIsIkRvbm5lcnN0YWciLCJGcmVpdGFnIiwiU2Ftc3RhZyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBkLiBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiWm9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiU28iLCJNbyIsIkRpIiwiTWkiLCJEbyIsIkZyIiwiU2EiXSwiZmllbGQtbWludXRlIjoiTWludXRlIiwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5kZSIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmRlPXsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXkifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5kZSIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmRlPXsiZmllbGQtd2Vla2RheSI6IldvY2hlbnRhZyIsImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQuTU0ueXl5eSIsImZpZWxkLXNlY29uZCI6IlNla3VuZGUiLCJmaWVsZC13ZWVrIjoiV29jaGUiLCJwbSI6Im5hY2htLiIsInRpbWVGb3JtYXQtZnVsbCI6Ikg6bW0nIFVociAneiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJ2b3JtLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsIk0iLCJEIiwiTSIsIkQiLCJGIiwiUyJdLCJmaWVsZC15ZWFyIjoiSmFociIsImVyYXMiOlsidi4gQ2hyLiIsIm4uIENoci4iXSwiZmllbGQtaG91ciI6IlN0dW5kZSIsImRhdGVGb3JtYXQtbG9uZyI6ImQuIE1NTU0geXl5eSIsImZpZWxkLWRheSI6IlRhZyIsImZpZWxkLWRheXBlcmlvZCI6IlRhZ2VzaMOkbGZ0ZSIsImZpZWxkLW1vbnRoIjoiTW9uYXQiLCJkYXRlRm9ybWF0LXNob3J0IjoiZGQuTU0ueXkiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiSmFudWFyIiwiRmVicnVhciIsIk3DpHJ6IiwiQXByaWwiLCJNYWkiLCJKdW5pIiwiSnVsaSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9rdG9iZXIiLCJOb3ZlbWJlciIsIkRlemVtYmVyIl0sImZpZWxkLWVyYSI6IkVwb2NoZSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCJGZWIiLCJNcnoiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPa3QiLCJOb3YiLCJEZXoiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJTb25udGFnIiwiTW9udGFnIiwiRGllbnN0YWciLCJNaXR0d29jaCIsIkRvbm5lcnN0YWciLCJGcmVpdGFnIiwiU2Ftc3RhZyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBkLiBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiWm9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiU28iLCJNbyIsIkRpIiwiTWkiLCJEbyIsIkZyIiwiU2EiXSwiZmllbGQtbWludXRlIjoiTWludXRlIiwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5kZSIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmRlPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZGUiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmRlPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZGUiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmRlPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi1nYi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2VuLWdiLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmJiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi1nYi5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2VuLWdiIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW5fZ2IiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5lbl9nYj17Im1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiZGF0ZUZvcm1hdC1sb25nIjoiTU1NTSBkLCB5eXl5IiwidGltZUZvcm1hdC1mdWxsIjoiaDptbTpzcyBhIHYiLCJlcmFzIjpbIkJDIiwiQUQiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJoOm1tOnNzIGEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6Ik1NTSBkLCB5eXl5IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBNTU1NIGQsIHl5eXkiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJoOm1tOnNzIGEgeiIsInRpbWVGb3JtYXQtc2hvcnQiOiJoOm1tIGEiLCJkYXRlRm9ybWF0LXNob3J0IjoiTS9kL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsIk0iLCJUIiwiVyIsIlQiLCJGIiwiUyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJhbSI6IkFNIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJmaWVsZC16b25lIjoiWm9uZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmVuX2diIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZW5fZ2I9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmVuX2diIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW5fZ2I9eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImRhdGVGb3JtYXQtbG9uZyI6Ik1NTU0gZCwgeXl5eSIsInRpbWVGb3JtYXQtZnVsbCI6Img6bW06c3MgYSB2IiwiZXJhcyI6WyJCQyIsIkFEIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiaDptbTpzcyBhIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJNTU0gZCwgeXl5eSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgTU1NTSBkLCB5eXl5IiwiZGF5cy1mb3JtYXQtYWJiciI6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSwidGltZUZvcm1hdC1sb25nIjoiaDptbTpzcyBhIHoiLCJ0aW1lRm9ybWF0LXNob3J0IjoiaDptbSBhIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Ik0vZC95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlMiLCJNIiwiVCIsIlciLCJUIiwiRiIsIlMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJwbSI6IlBNIiwiYW0iOiJBTSIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5lbl9nYiIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmVuX2diPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZW5fZ2IiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmVuX2diPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZW5fZ2IiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmVuX2diPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi11cy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2VuLXVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjMzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi11cy5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2VuLXVzIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW5fdXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5lbl91cz17Im1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiZGF0ZUZvcm1hdC1sb25nIjoiTU1NTSBkLCB5eXl5IiwidGltZUZvcm1hdC1mdWxsIjoiaDptbTpzcyBhIHYiLCJlcmFzIjpbIkJDIiwiQUQiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJoOm1tOnNzIGEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6Ik1NTSBkLCB5eXl5IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBNTU1NIGQsIHl5eXkiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJoOm1tOnNzIGEgeiIsInRpbWVGb3JtYXQtc2hvcnQiOiJoOm1tIGEiLCJkYXRlRm9ybWF0LXNob3J0IjoiTS9kL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsIk0iLCJUIiwiVyIsIlQiLCJGIiwiUyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJhbSI6IkFNIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJmaWVsZC16b25lIjoiWm9uZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmVuX3VzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZW5fdXM9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmVuX3VzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW5fdXM9eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImRhdGVGb3JtYXQtbG9uZyI6Ik1NTU0gZCwgeXl5eSIsInRpbWVGb3JtYXQtZnVsbCI6Img6bW06c3MgYSB2IiwiZXJhcyI6WyJCQyIsIkFEIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiaDptbTpzcyBhIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJNTU0gZCwgeXl5eSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgTU1NTSBkLCB5eXl5IiwiZGF5cy1mb3JtYXQtYWJiciI6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSwidGltZUZvcm1hdC1sb25nIjoiaDptbTpzcyBhIHoiLCJ0aW1lRm9ybWF0LXNob3J0IjoiaDptbSBhIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Ik0vZC95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlMiLCJNIiwiVCIsIlciLCJUIiwiRiIsIlMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJwbSI6IlBNIiwiYW0iOiJBTSIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5lbl91cyIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmVuX3VzPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZW5fdXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmVuX3VzPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZW5fdXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmVuX3VzPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2VuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjZmODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lbi5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2VuIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5lbj17Im1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiZGF0ZUZvcm1hdC1sb25nIjoiTU1NTSBkLCB5eXl5IiwidGltZUZvcm1hdC1mdWxsIjoiaDptbTpzcyBhIHYiLCJlcmFzIjpbIkJDIiwiQUQiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJoOm1tOnNzIGEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6Ik1NTSBkLCB5eXl5IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBNTU1NIGQsIHl5eXkiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJoOm1tOnNzIGEgeiIsInRpbWVGb3JtYXQtc2hvcnQiOiJoOm1tIGEiLCJkYXRlRm9ybWF0LXNob3J0IjoiTS9kL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsIk0iLCJUIiwiVyIsIlQiLCJGIiwiUyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJhbSI6IkFNIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJmaWVsZC16b25lIjoiWm9uZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmVuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZW49eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmVuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZW49eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImRhdGVGb3JtYXQtbG9uZyI6Ik1NTU0gZCwgeXl5eSIsInRpbWVGb3JtYXQtZnVsbCI6Img6bW06c3MgYSB2IiwiZXJhcyI6WyJCQyIsIkFEIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiaDptbTpzcyBhIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJNTU0gZCwgeXl5eSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgTU1NTSBkLCB5eXl5IiwiZGF5cy1mb3JtYXQtYWJiciI6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSwidGltZUZvcm1hdC1sb25nIjoiaDptbTpzcyBhIHoiLCJ0aW1lRm9ybWF0LXNob3J0IjoiaDptbSBhIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Ik0vZC95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlMiLCJNIiwiVCIsIlciLCJUIiwiRiIsIlMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJwbSI6IlBNIiwiYW0iOiJBTSIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5lbiIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmVuPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZW4iKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmVuPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZW4iKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmVuPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lcy1lcy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2VzLWVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTBjODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lcy1lcy5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2VzLWVzIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZXNfZXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5lc19lcz17ImZpZWxkLXdlZWtkYXkiOiJkw61hIGRlIGxhIHNlbWFuYSIsImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQtTU1NLXl5IiwiZmllbGQtc2Vjb25kIjoic2VndW5kbyIsImZpZWxkLXdlZWsiOiJzZW1hbmEiLCJwbSI6InAubS4iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISCdIJ21tJydzc1wiIHoiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRSIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoiYS5tLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkoiLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYcOxbyIsImVyYXMiOlsiYS5DLiIsImQuQy4iXSwiZmllbGQtbWludXRlIjoibWludXRvIiwiZmllbGQtaG91ciI6ImhvcmEiLCJkYXRlRm9ybWF0LWxvbmciOiJkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJmaWVsZC1kYXkiOiJkw61hIiwiZmllbGQtZGF5cGVyaW9kIjoicGVyaW9kbyBkZWwgZMOtYSIsImZpZWxkLW1vbnRoIjoibWVzIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImQvTU0veXkiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiZW5lcm8iLCJmZWJyZXJvIiwibWFyem8iLCJhYnJpbCIsIm1heW8iLCJqdW5pbyIsImp1bGlvIiwiYWdvc3RvIiwic2VwdGllbWJyZSIsIm9jdHVicmUiLCJub3ZpZW1icmUiLCJkaWNpZW1icmUiXSwiZmllbGQtZXJhIjoiZXJhIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbImVuZSIsImZlYiIsIm1hciIsImFiciIsIm1heSIsImp1biIsImp1bCIsImFnbyIsInNlcCIsIm9jdCIsIm5vdiIsImRpYyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbImRvbWluZ28iLCJsdW5lcyIsIm1hcnRlcyIsIm1pw6lyY29sZXMiLCJqdWV2ZXMiLCJ2aWVybmVzIiwic8OhYmFkbyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFIGQnIGRlICdNTU1NJyBkZSAneXl5eSIsImZpZWxkLXpvbmUiOiJ6b25hIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJsdW4iLCJtYXIiLCJtacOpIiwianVlIiwidmllIiwic8OhYiJdLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmVzX2VzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZXNfZXM9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmVzX2VzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZXNfZXM9eyJmaWVsZC13ZWVrZGF5IjoiZMOtYSBkZSBsYSBzZW1hbmEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkLU1NTS15eSIsImZpZWxkLXNlY29uZCI6InNlZ3VuZG8iLCJmaWVsZC13ZWVrIjoic2VtYW5hIiwicG0iOiJwLm0uIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnSCdtbScnc3NcIiB6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkUiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJhbSI6ImEubS4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJKIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImHDsW8iLCJlcmFzIjpbImEuQy4iLCJkLkMuIl0sImZpZWxkLW1pbnV0ZSI6Im1pbnV0byIsImZpZWxkLWhvdXIiOiJob3JhIiwiZGF0ZUZvcm1hdC1sb25nIjoiZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwiZmllbGQtZGF5IjoiZMOtYSIsImZpZWxkLWRheXBlcmlvZCI6InBlcmlvZG8gZGVsIGTDrWEiLCJmaWVsZC1tb250aCI6Im1lcyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImVuZXJvIiwiZmVicmVybyIsIm1hcnpvIiwiYWJyaWwiLCJtYXlvIiwianVuaW8iLCJqdWxpbyIsImFnb3N0byIsInNlcHRpZW1icmUiLCJvY3R1YnJlIiwibm92aWVtYnJlIiwiZGljaWVtYnJlIl0sImZpZWxkLWVyYSI6ImVyYSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJlbmUiLCJmZWIiLCJtYXIiLCJhYnIiLCJtYXkiLCJqdW4iLCJqdWwiLCJhZ28iLCJzZXAiLCJvY3QiLCJub3YiLCJkaWMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkb21pbmdvIiwibHVuZXMiLCJtYXJ0ZXMiLCJtacOpcmNvbGVzIiwianVldmVzIiwidmllcm5lcyIsInPDoWJhZG8iXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJmaWVsZC16b25lIjoiem9uYSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZG9tIiwibHVuIiwibWFyIiwibWnDqSIsImp1ZSIsInZpZSIsInPDoWIiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5lc19lcyIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmVzX2VzPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZXNfZXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmVzX2VzPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZXNfZXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmVzX2VzPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lcy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2NlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19lcy5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2VzIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5lcz17ImZpZWxkLXdlZWtkYXkiOiJkw61hIGRlIGxhIHNlbWFuYSIsImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQtTU1NLXl5IiwiZmllbGQtc2Vjb25kIjoic2VndW5kbyIsImZpZWxkLXdlZWsiOiJzZW1hbmEiLCJwbSI6InAubS4iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISCdIJ21tJydzc1wiIHoiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRSIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoiYS5tLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkoiLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYcOxbyIsImVyYXMiOlsiYS5DLiIsImQuQy4iXSwiZmllbGQtbWludXRlIjoibWludXRvIiwiZmllbGQtaG91ciI6ImhvcmEiLCJkYXRlRm9ybWF0LWxvbmciOiJkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJmaWVsZC1kYXkiOiJkw61hIiwiZmllbGQtZGF5cGVyaW9kIjoicGVyaW9kbyBkZWwgZMOtYSIsImZpZWxkLW1vbnRoIjoibWVzIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImQvTU0veXkiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiZW5lcm8iLCJmZWJyZXJvIiwibWFyem8iLCJhYnJpbCIsIm1heW8iLCJqdW5pbyIsImp1bGlvIiwiYWdvc3RvIiwic2VwdGllbWJyZSIsIm9jdHVicmUiLCJub3ZpZW1icmUiLCJkaWNpZW1icmUiXSwiZmllbGQtZXJhIjoiZXJhIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbImVuZSIsImZlYiIsIm1hciIsImFiciIsIm1heSIsImp1biIsImp1bCIsImFnbyIsInNlcCIsIm9jdCIsIm5vdiIsImRpYyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbImRvbWluZ28iLCJsdW5lcyIsIm1hcnRlcyIsIm1pw6lyY29sZXMiLCJqdWV2ZXMiLCJ2aWVybmVzIiwic8OhYmFkbyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFIGQnIGRlICdNTU1NJyBkZSAneXl5eSIsImZpZWxkLXpvbmUiOiJ6b25hIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJsdW4iLCJtYXIiLCJtacOpIiwianVlIiwidmllIiwic8OhYiJdLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmVzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZXM9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmVzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZXM9eyJmaWVsZC13ZWVrZGF5IjoiZMOtYSBkZSBsYSBzZW1hbmEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkLU1NTS15eSIsImZpZWxkLXNlY29uZCI6InNlZ3VuZG8iLCJmaWVsZC13ZWVrIjoic2VtYW5hIiwicG0iOiJwLm0uIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnSCdtbScnc3NcIiB6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkUiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJhbSI6ImEubS4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJKIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImHDsW8iLCJlcmFzIjpbImEuQy4iLCJkLkMuIl0sImZpZWxkLW1pbnV0ZSI6Im1pbnV0byIsImZpZWxkLWhvdXIiOiJob3JhIiwiZGF0ZUZvcm1hdC1sb25nIjoiZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwiZmllbGQtZGF5IjoiZMOtYSIsImZpZWxkLWRheXBlcmlvZCI6InBlcmlvZG8gZGVsIGTDrWEiLCJmaWVsZC1tb250aCI6Im1lcyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImVuZXJvIiwiZmVicmVybyIsIm1hcnpvIiwiYWJyaWwiLCJtYXlvIiwianVuaW8iLCJqdWxpbyIsImFnb3N0byIsInNlcHRpZW1icmUiLCJvY3R1YnJlIiwibm92aWVtYnJlIiwiZGljaWVtYnJlIl0sImZpZWxkLWVyYSI6ImVyYSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJlbmUiLCJmZWIiLCJtYXIiLCJhYnIiLCJtYXkiLCJqdW4iLCJqdWwiLCJhZ28iLCJzZXAiLCJvY3QiLCJub3YiLCJkaWMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkb21pbmdvIiwibHVuZXMiLCJtYXJ0ZXMiLCJtacOpcmNvbGVzIiwianVldmVzIiwidmllcm5lcyIsInPDoWJhZG8iXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJmaWVsZC16b25lIjoiem9uYSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZG9tIiwibHVuIiwibWFyIiwibWnDqSIsImp1ZSIsInZpZSIsInPDoWIiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5lcyIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmVzPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmVzPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZXMiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmVzPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19mci1mci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2ZyLWZyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTcxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19mci1mci5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2ZyLWZyIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZnJfZnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5mcl9mcj17ImZpZWxkLXdlZWtkYXkiOiJqb3VyIGRlIGxhIHNlbWFpbmUiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImQgTU1NIHl5IiwiZmllbGQtc2Vjb25kIjoic2Vjb25kZSIsImZpZWxkLXdlZWsiOiJzZW1haW5lIiwicG0iOiJhcC4gbS4iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISCcgaCAnbW0geiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJtYXRpbiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkoiLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYW5uw6llIiwiZXJhcyI6WyJhdi4gSi4tQy4iLCJhcHIuIEouLUMuIl0sImZpZWxkLW1pbnV0ZSI6Im1pbnV0ZSIsImZpZWxkLWhvdXIiOiJoZXVyZSIsImRhdGVGb3JtYXQtbG9uZyI6ImQgTU1NTSB5eXl5IiwiZmllbGQtZGF5Ijoiam91ciIsImZpZWxkLWRheXBlcmlvZCI6InDDqXJpb2RlIGRlIGxhIGpvdXJuw6llIiwiZmllbGQtbW9udGgiOiJtb2lzIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImphbnZpZXIiLCJmw6l2cmllciIsIm1hcnMiLCJhdnJpbCIsIm1haSIsImp1aW4iLCJqdWlsbGV0IiwiYW/Du3QiLCJzZXB0ZW1icmUiLCJvY3RvYnJlIiwibm92ZW1icmUiLCJkw6ljZW1icmUiXSwiZmllbGQtZXJhIjoiw6lwb3F1ZSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW52LiIsImbDqXZyLiIsIm1hcnMiLCJhdnIuIiwibWFpIiwianVpbiIsImp1aWwuIiwiYW/Du3QiLCJzZXB0LiIsIm9jdC4iLCJub3YuIiwiZMOpYy4iXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkaW1hbmNoZSIsImx1bmRpIiwibWFyZGkiLCJtZXJjcmVkaSIsImpldWRpIiwidmVuZHJlZGkiLCJzYW1lZGkiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJ6b25lIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkaW0uIiwibHVuLiIsIm1hci4iLCJtZXIuIiwiamV1LiIsInZlbi4iLCJzYW0uIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZnJfZnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5mcl9mcj17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZnJfZnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5mcl9mcj17ImZpZWxkLXdlZWtkYXkiOiJqb3VyIGRlIGxhIHNlbWFpbmUiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImQgTU1NIHl5IiwiZmllbGQtc2Vjb25kIjoic2Vjb25kZSIsImZpZWxkLXdlZWsiOiJzZW1haW5lIiwicG0iOiJhcC4gbS4iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISCcgaCAnbW0geiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJtYXRpbiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkoiLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYW5uw6llIiwiZXJhcyI6WyJhdi4gSi4tQy4iLCJhcHIuIEouLUMuIl0sImZpZWxkLW1pbnV0ZSI6Im1pbnV0ZSIsImZpZWxkLWhvdXIiOiJoZXVyZSIsImRhdGVGb3JtYXQtbG9uZyI6ImQgTU1NTSB5eXl5IiwiZmllbGQtZGF5Ijoiam91ciIsImZpZWxkLWRheXBlcmlvZCI6InDDqXJpb2RlIGRlIGxhIGpvdXJuw6llIiwiZmllbGQtbW9udGgiOiJtb2lzIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImphbnZpZXIiLCJmw6l2cmllciIsIm1hcnMiLCJhdnJpbCIsIm1haSIsImp1aW4iLCJqdWlsbGV0IiwiYW/Du3QiLCJzZXB0ZW1icmUiLCJvY3RvYnJlIiwibm92ZW1icmUiLCJkw6ljZW1icmUiXSwiZmllbGQtZXJhIjoiw6lwb3F1ZSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW52LiIsImbDqXZyLiIsIm1hcnMiLCJhdnIuIiwibWFpIiwianVpbiIsImp1aWwuIiwiYW/Du3QiLCJzZXB0LiIsIm9jdC4iLCJub3YuIiwiZMOpYy4iXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkaW1hbmNoZSIsImx1bmRpIiwibWFyZGkiLCJtZXJjcmVkaSIsImpldWRpIiwidmVuZHJlZGkiLCJzYW1lZGkiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJ6b25lIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkaW0uIiwibHVuLiIsIm1hci4iLCJtZXIuIiwiamV1LiIsInZlbi4iLCJzYW0uIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuZnJfZnIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5mcl9mcj17ImFueSI6ImFueSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmZyX2ZyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5mcl9mcj17InNlbGVjdFRpbWUiOiJTZWxlY3QgdGltZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmZyX2ZyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5mcl9mcj17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fZnIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19mci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVmZGZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fZnIuanMKQEAgLTAsMCArMSwxMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJubHMuZG9qb19mciIpO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmZyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZnI9eyJmaWVsZC13ZWVrZGF5Ijoiam91ciBkZSBsYSBzZW1haW5lIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkIE1NTSB5eSIsImZpZWxkLXNlY29uZCI6InNlY29uZGUiLCJmaWVsZC13ZWVrIjoic2VtYWluZSIsInBtIjoiYXAuIG0uIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnIGggJ21tIHoiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoibWF0aW4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJKIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImFubsOpZSIsImVyYXMiOlsiYXYuIEouLUMuIiwiYXByLiBKLi1DLiJdLCJmaWVsZC1taW51dGUiOiJtaW51dGUiLCJmaWVsZC1ob3VyIjoiaGV1cmUiLCJkYXRlRm9ybWF0LWxvbmciOiJkIE1NTU0geXl5eSIsImZpZWxkLWRheSI6ImpvdXIiLCJmaWVsZC1kYXlwZXJpb2QiOiJww6lyaW9kZSBkZSBsYSBqb3VybsOpZSIsImZpZWxkLW1vbnRoIjoibW9pcyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW52aWVyIiwiZsOpdnJpZXIiLCJtYXJzIiwiYXZyaWwiLCJtYWkiLCJqdWluIiwianVpbGxldCIsImFvw7t0Iiwic2VwdGVtYnJlIiwib2N0b2JyZSIsIm5vdmVtYnJlIiwiZMOpY2VtYnJlIl0sImZpZWxkLWVyYSI6IsOpcG9xdWUiLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiamFudi4iLCJmw6l2ci4iLCJtYXJzIiwiYXZyLiIsIm1haSIsImp1aW4iLCJqdWlsLiIsImFvw7t0Iiwic2VwdC4iLCJvY3QuIiwibm92LiIsImTDqWMuIl0sImRheXMtZm9ybWF0LXdpZGUiOlsiZGltYW5jaGUiLCJsdW5kaSIsIm1hcmRpIiwibWVyY3JlZGkiLCJqZXVkaSIsInZlbmRyZWRpIiwic2FtZWRpIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUgZCBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiem9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZGltLiIsImx1bi4iLCJtYXIuIiwibWVyLiIsImpldS4iLCJ2ZW4uIiwic2FtLiJdLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmZyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuZnI9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmZyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uZnI9eyJmaWVsZC13ZWVrZGF5Ijoiam91ciBkZSBsYSBzZW1haW5lIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkIE1NTSB5eSIsImZpZWxkLXNlY29uZCI6InNlY29uZGUiLCJmaWVsZC13ZWVrIjoic2VtYWluZSIsInBtIjoiYXAuIG0uIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnIGggJ21tIHoiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoibWF0aW4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJKIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImFubsOpZSIsImVyYXMiOlsiYXYuIEouLUMuIiwiYXByLiBKLi1DLiJdLCJmaWVsZC1taW51dGUiOiJtaW51dGUiLCJmaWVsZC1ob3VyIjoiaGV1cmUiLCJkYXRlRm9ybWF0LWxvbmciOiJkIE1NTU0geXl5eSIsImZpZWxkLWRheSI6ImpvdXIiLCJmaWVsZC1kYXlwZXJpb2QiOiJww6lyaW9kZSBkZSBsYSBqb3VybsOpZSIsImZpZWxkLW1vbnRoIjoibW9pcyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW52aWVyIiwiZsOpdnJpZXIiLCJtYXJzIiwiYXZyaWwiLCJtYWkiLCJqdWluIiwianVpbGxldCIsImFvw7t0Iiwic2VwdGVtYnJlIiwib2N0b2JyZSIsIm5vdmVtYnJlIiwiZMOpY2VtYnJlIl0sImZpZWxkLWVyYSI6IsOpcG9xdWUiLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiamFudi4iLCJmw6l2ci4iLCJtYXJzIiwiYXZyLiIsIm1haSIsImp1aW4iLCJqdWlsLiIsImFvw7t0Iiwic2VwdC4iLCJvY3QuIiwibm92LiIsImTDqWMuIl0sImRheXMtZm9ybWF0LXdpZGUiOlsiZGltYW5jaGUiLCJsdW5kaSIsIm1hcmRpIiwibWVyY3JlZGkiLCJqZXVkaSIsInZlbmRyZWRpIiwic2FtZWRpIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUgZCBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiem9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZGltLiIsImx1bi4iLCJtYXIuIiwibWVyLiIsImpldS4iLCJ2ZW4uIiwic2FtLiJdLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmZyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuZnI9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5mciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuZnI9eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5mciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuZnI9eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2l0LWl0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9faXQtaXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxZWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2l0LWl0LmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9faXQtaXQiKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5pdF9pdCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLml0X2l0PXsiZmllbGQtd2Vla2RheSI6Imdpb3JubyBkZWxsYSBzZXR0aW1hbmEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkL01NTS95eSIsImZpZWxkLXNlY29uZCI6InNlY29uZG8iLCJmaWVsZC13ZWVrIjoic2V0dGltYW5hIiwicG0iOiJwLiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJHIiwiRiIsIk0iLCJBIiwiTSIsIkciLCJMIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJtLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkciLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYW5ubyIsImVyYXMiOlsiYUMiLCJkQyJdLCJmaWVsZC1taW51dGUiOiJtaW51dG8iLCJmaWVsZC1ob3VyIjoib3JhIiwiZGF0ZUZvcm1hdC1sb25nIjoiZGQgTU1NTSB5eXl5IiwiZmllbGQtZGF5IjoiZ2lvcm5vIiwiZmllbGQtZGF5cGVyaW9kIjoicGVyaW9kbyBkZWwgZ2lvcm5vIiwiZmllbGQtbW9udGgiOiJtZXNlIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImdlbm5haW8iLCJmZWJicmFpbyIsIm1hcnpvIiwiYXByaWxlIiwibWFnZ2lvIiwiZ2l1Z25vIiwibHVnbGlvIiwiYWdvc3RvIiwic2V0dGVtYnJlIiwib3R0b2JyZSIsIm5vdmVtYnJlIiwiZGljZW1icmUiXSwiZmllbGQtZXJhIjoiZXJhIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbImdlbiIsImZlYiIsIm1hciIsImFwciIsIm1hZyIsImdpdSIsImx1ZyIsImFnbyIsInNldCIsIm90dCIsIm5vdiIsImRpYyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbImRvbWVuaWNhIiwibHVuZWTDrCIsIm1hcnRlZMOsIiwibWVyY29sZWTDrCIsImdpb3ZlZMOsIiwidmVuZXJkw6wiLCJzYWJhdG8iXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJ6b25hIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJsdW4iLCJtYXIiLCJtZXIiLCJnaW8iLCJ2ZW4iLCJzYWIiXSwidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuaXRfaXQiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5pdF9pdD17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uaXRfaXQiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5pdF9pdD17ImZpZWxkLXdlZWtkYXkiOiJnaW9ybm8gZGVsbGEgc2V0dGltYW5hIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkZC9NTU0veXkiLCJmaWVsZC1zZWNvbmQiOiJzZWNvbmRvIiwiZmllbGQtd2VlayI6InNldHRpbWFuYSIsInBtIjoicC4iLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRyIsIkYiLCJNIiwiQSIsIk0iLCJHIiwiTCIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoibS4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJHIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImFubm8iLCJlcmFzIjpbImFDIiwiZEMiXSwiZmllbGQtbWludXRlIjoibWludXRvIiwiZmllbGQtaG91ciI6Im9yYSIsImRhdGVGb3JtYXQtbG9uZyI6ImRkIE1NTU0geXl5eSIsImZpZWxkLWRheSI6Imdpb3JubyIsImZpZWxkLWRheXBlcmlvZCI6InBlcmlvZG8gZGVsIGdpb3JubyIsImZpZWxkLW1vbnRoIjoibWVzZSIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJnZW5uYWlvIiwiZmViYnJhaW8iLCJtYXJ6byIsImFwcmlsZSIsIm1hZ2dpbyIsImdpdWdubyIsImx1Z2xpbyIsImFnb3N0byIsInNldHRlbWJyZSIsIm90dG9icmUiLCJub3ZlbWJyZSIsImRpY2VtYnJlIl0sImZpZWxkLWVyYSI6ImVyYSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJnZW4iLCJmZWIiLCJtYXIiLCJhcHIiLCJtYWciLCJnaXUiLCJsdWciLCJhZ28iLCJzZXQiLCJvdHQiLCJub3YiLCJkaWMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkb21lbmljYSIsImx1bmVkw6wiLCJtYXJ0ZWTDrCIsIm1lcmNvbGVkw6wiLCJnaW92ZWTDrCIsInZlbmVyZMOsIiwic2FiYXRvIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUgZCBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiem9uYSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZG9tIiwibHVuIiwibWFyIiwibWVyIiwiZ2lvIiwidmVuIiwic2FiIl0sInRpbWVGb3JtYXQtZnVsbCI6IkhIOm1tOnNzIHoiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLml0X2l0Iik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuaXRfaXQ9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5pdF9pdCIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuaXRfaXQ9eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5pdF9pdCIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuaXRfaXQ9eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2l0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9faXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0OGNlNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2l0LmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9faXQiKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5pdCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLml0PXsiZmllbGQtd2Vla2RheSI6Imdpb3JubyBkZWxsYSBzZXR0aW1hbmEiLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkL01NTS95eSIsImZpZWxkLXNlY29uZCI6InNlY29uZG8iLCJmaWVsZC13ZWVrIjoic2V0dGltYW5hIiwicG0iOiJwLiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJHIiwiRiIsIk0iLCJBIiwiTSIsIkciLCJMIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSwiYW0iOiJtLiIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIkwiLCJNIiwiTSIsIkciLCJWIiwiUyJdLCJmaWVsZC15ZWFyIjoiYW5ubyIsImVyYXMiOlsiYUMiLCJkQyJdLCJmaWVsZC1taW51dGUiOiJtaW51dG8iLCJmaWVsZC1ob3VyIjoib3JhIiwiZGF0ZUZvcm1hdC1sb25nIjoiZGQgTU1NTSB5eXl5IiwiZmllbGQtZGF5IjoiZ2lvcm5vIiwiZmllbGQtZGF5cGVyaW9kIjoicGVyaW9kbyBkZWwgZ2lvcm5vIiwiZmllbGQtbW9udGgiOiJtZXNlIiwiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkL01NL3l5IiwibW9udGhzLWZvcm1hdC13aWRlIjpbImdlbm5haW8iLCJmZWJicmFpbyIsIm1hcnpvIiwiYXByaWxlIiwibWFnZ2lvIiwiZ2l1Z25vIiwibHVnbGlvIiwiYWdvc3RvIiwic2V0dGVtYnJlIiwib3R0b2JyZSIsIm5vdmVtYnJlIiwiZGljZW1icmUiXSwiZmllbGQtZXJhIjoiZXJhIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbImdlbiIsImZlYiIsIm1hciIsImFwciIsIm1hZyIsImdpdSIsImx1ZyIsImFnbyIsInNldCIsIm90dCIsIm5vdiIsImRpYyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbImRvbWVuaWNhIiwibHVuZWTDrCIsIm1hcnRlZMOsIiwibWVyY29sZWTDrCIsImdpb3ZlZMOsIiwidmVuZXJkw6wiLCJzYWJhdG8iXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkIE1NTU0geXl5eSIsImZpZWxkLXpvbmUiOiJ6b25hIiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJsdW4iLCJtYXIiLCJtZXIiLCJnaW8iLCJ2ZW4iLCJzYWIiXSwidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuaXQiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5pdD17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uaXQiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5pdD17ImZpZWxkLXdlZWtkYXkiOiJnaW9ybm8gZGVsbGEgc2V0dGltYW5hIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkZC9NTU0veXkiLCJmaWVsZC1zZWNvbmQiOiJzZWNvbmRvIiwiZmllbGQtd2VlayI6InNldHRpbWFuYSIsInBtIjoicC4iLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRyIsIkYiLCJNIiwiQSIsIk0iLCJHIiwiTCIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImFtIjoibS4iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCJMIiwiTSIsIk0iLCJHIiwiViIsIlMiXSwiZmllbGQteWVhciI6ImFubm8iLCJlcmFzIjpbImFDIiwiZEMiXSwiZmllbGQtbWludXRlIjoibWludXRvIiwiZmllbGQtaG91ciI6Im9yYSIsImRhdGVGb3JtYXQtbG9uZyI6ImRkIE1NTU0geXl5eSIsImZpZWxkLWRheSI6Imdpb3JubyIsImZpZWxkLWRheXBlcmlvZCI6InBlcmlvZG8gZGVsIGdpb3JubyIsImZpZWxkLW1vbnRoIjoibWVzZSIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJnZW5uYWlvIiwiZmViYnJhaW8iLCJtYXJ6byIsImFwcmlsZSIsIm1hZ2dpbyIsImdpdWdubyIsImx1Z2xpbyIsImFnb3N0byIsInNldHRlbWJyZSIsIm90dG9icmUiLCJub3ZlbWJyZSIsImRpY2VtYnJlIl0sImZpZWxkLWVyYSI6ImVyYSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyJnZW4iLCJmZWIiLCJtYXIiLCJhcHIiLCJtYWciLCJnaXUiLCJsdWciLCJhZ28iLCJzZXQiLCJvdHQiLCJub3YiLCJkaWMiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyJkb21lbmljYSIsImx1bmVkw6wiLCJtYXJ0ZWTDrCIsIm1lcmNvbGVkw6wiLCJnaW92ZWTDrCIsInZlbmVyZMOsIiwic2FiYXRvIl0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUgZCBNTU1NIHl5eXkiLCJmaWVsZC16b25lIjoiem9uYSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZG9tIiwibHVuIiwibWFyIiwibWVyIiwiZ2lvIiwidmVuIiwic2FiIl0sInRpbWVGb3JtYXQtZnVsbCI6IkhIOm1tOnNzIHoiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLml0Iik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuaXQ9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5pdCIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuaXQ9eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5pdCIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuaXQ9eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2phLWpwLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9famEtanAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiYTViOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2phLWpwLmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9famEtanAiKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5qYV9qcCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmphX2pwPXsiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLml6UiLCLmnIgiLCLnP6siLCLmsLQiLCLmnKgiLCLph5EiLCLlnJ8iXSwidGltZUZvcm1hdC1mdWxsIjoiSCfmmYInbW0n5YiGJ3NzJ+enkid6IiwiZXJhcyI6WyLntIDlhYPliT8iLCLopb/mmqYiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJIOm1tOnNzIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5L01NL2RkIiwiYW0iOiLlP4jliT8iLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMSDmnIgiLCIyIOaciCIsIjMg5pyIIiwiNCDmnIgiLCI1IOaciCIsIjYg5pyIIiwiNyDmnIgiLCI4IOaciCIsIjkg5pyIIiwiMTAg5pyIIiwiMTEg5pyIIiwiMTIg5pyIIl0sImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJ0VFRUUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuaXpSIsIuaciCIsIuc/qyIsIuawtCIsIuacqCIsIumHkSIsIuWcnyJdLCJ0aW1lRm9ybWF0LWxvbmciOiJIOm1tOnNzOnoiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSDptbSIsInBtIjoi5T+I5b6MIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIjEg5pyIIiwiMiDmnIgiLCIzIOaciCIsIjQg5pyIIiwiNSDmnIgiLCI2IOaciCIsIjcg5pyIIiwiOCDmnIgiLCI5IOaciCIsIjEwIOaciCIsIjExIOaciCIsIjEyIOaciCJdLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSciLCJkYXlzLWZvcm1hdC13aWRlIjpbIuaXpeabnOaXpSIsIuaciOabnOaXpSIsIuc/q+abnOaXpSIsIuawtOabnOaXpSIsIuacqOabnOaXpSIsIumHkeabnOaXpSIsIuWcn+abnOaXpSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5qYV9qcCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmphX2pwPXsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXnlubQifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5qYV9qcCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmphX2pwPXsiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLml6UiLCLmnIgiLCLnP6siLCLmsLQiLCLmnKgiLCLph5EiLCLlnJ8iXSwidGltZUZvcm1hdC1mdWxsIjoiSCfmmYInbW0n5YiGJ3NzJ+enkid6IiwiZXJhcyI6WyLntIDlhYPliT8iLCLopb/mmqYiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJIOm1tOnNzIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5L01NL2RkIiwiYW0iOiLlP4jliT8iLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMSDmnIgiLCIyIOaciCIsIjMg5pyIIiwiNCDmnIgiLCI1IOaciCIsIjYg5pyIIiwiNyDmnIgiLCI4IOaciCIsIjkg5pyIIiwiMTAg5pyIIiwiMTEg5pyIIiwiMTIg5pyIIl0sImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJ0VFRUUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuaXpSIsIuaciCIsIuc/qyIsIuawtCIsIuacqCIsIumHkSIsIuWcnyJdLCJ0aW1lRm9ybWF0LWxvbmciOiJIOm1tOnNzOnoiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSDptbSIsInBtIjoi5T+I5b6MIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIjEg5pyIIiwiMiDmnIgiLCIzIOaciCIsIjQg5pyIIiwiNSDmnIgiLCI2IOaciCIsIjcg5pyIIiwiOCDmnIgiLCI5IOaciCIsIjEwIOaciCIsIjExIOaciCIsIjEyIOaciCJdLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSciLCJkYXlzLWZvcm1hdC13aWRlIjpbIuaXpeabnOaXpSIsIuaciOabnOaXpSIsIuc/q+abnOaXpSIsIuawtOabnOaXpSIsIuacqOabnOaXpSIsIumHkeabnOaXpSIsIuWcn+abnOaXpSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5qYV9qcCIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmphX2pwPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuamFfanAiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmphX2pwPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuamFfanAiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmphX2pwPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19qYS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2phLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWIyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19qYS5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX2phIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uamEiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5qYT17ImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsi5pelIiwi5pyIIiwi5z+rIiwi5rC0Iiwi5pyoIiwi6YeRIiwi5ZyfIl0sInRpbWVGb3JtYXQtZnVsbCI6Ikgn5pmCJ21tJ+WIhidzcyfnp5IneiIsImVyYXMiOlsi57SA5YWD5Yk/Iiwi6KW/5pqmIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiSDptbTpzcyIsImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS9NTS9kZCIsImFtIjoi5T+I5Yk/IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIjEg5pyIIiwiMiDmnIgiLCIzIOaciCIsIjQg5pyIIiwiNSDmnIgiLCI2IOaciCIsIjcg5pyIIiwiOCDmnIgiLCI5IOaciCIsIjEwIOaciCIsIjExIOaciCIsIjEyIOaciCJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSdFRUVFIiwiZGF5cy1mb3JtYXQtYWJiciI6WyLml6UiLCLmnIgiLCLnP6siLCLmsLQiLCLmnKgiLCLph5EiLCLlnJ8iXSwidGltZUZvcm1hdC1sb25nIjoiSDptbTpzczp6IiwidGltZUZvcm1hdC1zaG9ydCI6Ikg6bW0iLCJwbSI6IuU/iOW+jCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyIxIOaciCIsIjIg5pyIIiwiMyDmnIgiLCI0IOaciCIsIjUg5pyIIiwiNiDmnIgiLCI3IOaciCIsIjgg5pyIIiwiOSDmnIgiLCIxMCDmnIgiLCIxMSDmnIgiLCIxMiDmnIgiXSwiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSflubQnTSfmnIgnZCfml6UnIiwiZGF5cy1mb3JtYXQtd2lkZSI6WyLml6Xmm5zml6UiLCLmnIjmm5zml6UiLCLnP6vmm5zml6UiLCLmsLTmm5zml6UiLCLmnKjmm5zml6UiLCLph5Hmm5zml6UiLCLlnJ/mm5zml6UiXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJmaWVsZC15ZWFyIjoiWWVhciIsImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsImZpZWxkLWhvdXIiOiJIb3VyIiwiZmllbGQtZGF5IjoiRGF5IiwiZmllbGQtZGF5cGVyaW9kIjoiRGF5cGVyaW9kIiwiZmllbGQtbW9udGgiOiJNb250aCIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS9NTS9kZCIsImZpZWxkLWVyYSI6IkVyYSIsImZpZWxkLXpvbmUiOiJab25lIn07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuamEiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5qYT17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl55bm0In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uamEiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5qYT17ImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsi5pelIiwi5pyIIiwi5z+rIiwi5rC0Iiwi5pyoIiwi6YeRIiwi5ZyfIl0sInRpbWVGb3JtYXQtZnVsbCI6Ikgn5pmCJ21tJ+WIhidzcyfnp5IneiIsImVyYXMiOlsi57SA5YWD5Yk/Iiwi6KW/5pqmIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiSDptbTpzcyIsImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS9NTS9kZCIsImFtIjoi5T+I5Yk/IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIjEg5pyIIiwiMiDmnIgiLCIzIOaciCIsIjQg5pyIIiwiNSDmnIgiLCI2IOaciCIsIjcg5pyIIiwiOCDmnIgiLCI5IOaciCIsIjEwIOaciCIsIjExIOaciCIsIjEyIOaciCJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSdFRUVFIiwiZGF5cy1mb3JtYXQtYWJiciI6WyLml6UiLCLmnIgiLCLnP6siLCLmsLQiLCLmnKgiLCLph5EiLCLlnJ8iXSwidGltZUZvcm1hdC1sb25nIjoiSDptbTpzczp6IiwidGltZUZvcm1hdC1zaG9ydCI6Ikg6bW0iLCJwbSI6IuU/iOW+jCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyIxIOaciCIsIjIg5pyIIiwiMyDmnIgiLCI0IOaciCIsIjUg5pyIIiwiNiDmnIgiLCI3IOaciCIsIjgg5pyIIiwiOSDmnIgiLCIxMCDmnIgiLCIxMSDmnIgiLCIxMiDmnIgiXSwiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSflubQnTSfmnIgnZCfml6UnIiwiZGF5cy1mb3JtYXQtd2lkZSI6WyLml6Xmm5zml6UiLCLmnIjmm5zml6UiLCLnP6vmm5zml6UiLCLmsLTmm5zml6UiLCLmnKjmm5zml6UiLCLph5Hmm5zml6UiLCLlnJ/mm5zml6UiXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJmaWVsZC15ZWFyIjoiWWVhciIsImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsImZpZWxkLWhvdXIiOiJIb3VyIiwiZmllbGQtZGF5IjoiRGF5IiwiZmllbGQtZGF5cGVyaW9kIjoiRGF5cGVyaW9kIiwiZmllbGQtbW9udGgiOiJNb250aCIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS9NTS9kZCIsImZpZWxkLWVyYSI6IkVyYSIsImZpZWxkLXpvbmUiOiJab25lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuamEiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5qYT17ImFueSI6ImFueSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmphIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5qYT17InNlbGVjdFRpbWUiOiJTZWxlY3QgdGltZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmphIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5qYT17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fa28ta3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19rby1rci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcxZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fa28ta3IuanMKQEAgLTAsMCArMSwxMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJubHMuZG9qb19rby1rciIpO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmtvX2tyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ua29fa3I9eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkn64WEJyBNJ+yblCcgZCfsP7wnIiwidGltZUZvcm1hdC1mdWxsIjoiYSBoaCfsi5wnIG1tJ+u2hCcgc3Mn7LSIJyB6IiwiZXJhcyI6WyLquLDsmz/soIQiLCLshJzquLAiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJhIGhoJ+yLnCcgbW0n67aEJyIsImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS4gTU0uIGRkIiwiYW0iOiLsmKTsoIQiLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkn64WEJyBNJ+yblCcgZCfsP7wnIEVFRUUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuw/vCIsIuyblCIsIu2ZlCIsIuyImCIsIuuqqSIsIuq4iCIsIu2GoCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJhIGhoJ+yLnCcgbW0n67aEJyBzcyfstIgnIiwidGltZUZvcm1hdC1zaG9ydCI6ImEgaGgn7IucJyBtbSfrtoQnIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5LiBNTS4gZGQiLCJwbSI6IuyYpO2bhCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyIx7JuUIiwiMuyblCIsIjPsm5QiLCI07JuUIiwiNeyblCIsIjbsm5QiLCI37JuUIiwiOOyblCIsIjnsm5QiLCIxMOyblCIsIjEx7JuUIiwiMTLsm5QiXSwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLsP7wiLCLsm5QiLCLtmZQiLCLsiJgiLCLrqqkiLCLquIgiLCLthqAiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyLsP7zsmpTsP7wiLCLsm5TsmpTsP7wiLCLtmZTsmpTsP7wiLCLsiJjsmpTsP7wiLCLrqqnsmpTsP7wiLCLquIjsmpTsP7wiLCLthqDsmpTsP7wiXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJmaWVsZC16b25lIjoiWm9uZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmtvX2tyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMua29fa3I9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmtvX2tyIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ua29fa3I9eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkn64WEJyBNJ+yblCcgZCfsP7wnIiwidGltZUZvcm1hdC1mdWxsIjoiYSBoaCfsi5wnIG1tJ+u2hCcgc3Mn7LSIJyB6IiwiZXJhcyI6WyLquLDsmz/soIQiLCLshJzquLAiXSwidGltZUZvcm1hdC1tZWRpdW0iOiJhIGhoJ+yLnCcgbW0n67aEJyIsImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS4gTU0uIGRkIiwiYW0iOiLsmKTsoIQiLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkn64WEJyBNJ+yblCcgZCfsP7wnIEVFRUUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuw/vCIsIuyblCIsIu2ZlCIsIuyImCIsIuuqqSIsIuq4iCIsIu2GoCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJhIGhoJ+yLnCcgbW0n67aEJyBzcyfstIgnIiwidGltZUZvcm1hdC1zaG9ydCI6ImEgaGgn7IucJyBtbSfrtoQnIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5LiBNTS4gZGQiLCJwbSI6IuyYpO2bhCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyIx7JuUIiwiMuyblCIsIjPsm5QiLCI07JuUIiwiNeyblCIsIjbsm5QiLCI37JuUIiwiOOyblCIsIjnsm5QiLCIxMOyblCIsIjEx7JuUIiwiMTLsm5QiXSwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLsP7wiLCLsm5QiLCLtmZQiLCLsiJgiLCLrqqkiLCLquIgiLCLthqAiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyLsP7zsmpTsP7wiLCLsm5TsmpTsP7wiLCLtmZTsmpTsP7wiLCLsiJjsmpTsP7wiLCLrqqnsmpTsP7wiLCLquIjsmpTsP7wiLCLthqDsmpTsP7wiXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJmaWVsZC16b25lIjoiWm9uZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmtvX2tyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIua29fa3I9eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5rb19rciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIua29fa3I9eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5rb19rciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIua29fa3I9eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2tvLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fa28uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MjQyZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX2tvLmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9fa28iKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5rbyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmtvPXsibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjHsm5QiLCIy7JuUIiwiM+yblCIsIjTsm5QiLCI17JuUIiwiNuyblCIsIjfsm5QiLCI47JuUIiwiOeyblCIsIjEw7JuUIiwiMTHsm5QiLCIxMuyblCJdLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J+uFhCcgTSfsm5QnIGQn7D+8JyIsInRpbWVGb3JtYXQtZnVsbCI6ImEgaGgn7IucJyBtbSfrtoQnIHNzJ+y0iCcgeiIsImVyYXMiOlsi6riw7Js/7KCEIiwi7ISc6riwIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiYSBoaCfsi5wnIG1tJ+u2hCciLCJkYXRlRm9ybWF0LW1lZGl1bSI6Inl5eXkuIE1NLiBkZCIsImFtIjoi7Jik7KCEIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIjHsm5QiLCIy7JuUIiwiM+yblCIsIjTsm5QiLCI17JuUIiwiNuyblCIsIjfsm5QiLCI47JuUIiwiOeyblCIsIjEw7JuUIiwiMTHsm5QiLCIxMuyblCJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJ5eXl5J+uFhCcgTSfsm5QnIGQn7D+8JyBFRUVFIiwiZGF5cy1mb3JtYXQtYWJiciI6WyLsP7wiLCLsm5QiLCLtmZQiLCLsiJgiLCLrqqkiLCLquIgiLCLthqAiXSwidGltZUZvcm1hdC1sb25nIjoiYSBoaCfsi5wnIG1tJ+u2hCcgc3Mn7LSIJyIsInRpbWVGb3JtYXQtc2hvcnQiOiJhIGhoJ+yLnCcgbW0n67aEJyIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS4gTU0uIGRkIiwicG0iOiLsmKTtm4QiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsi7D+8Iiwi7JuUIiwi7ZmUIiwi7IiYIiwi66qpIiwi6riIIiwi7YagIl0sImRheXMtZm9ybWF0LXdpZGUiOlsi7D+87JqU7D+8Iiwi7JuU7JqU7D+8Iiwi7ZmU7JqU7D+8Iiwi7IiY7JqU7D+8Iiwi66qp7JqU7D+8Iiwi6riI7JqU7D+8Iiwi7Yag7JqU7D+8Il0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5rbyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLmtvPXsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXkifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5rbyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLmtvPXsibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjHsm5QiLCIy7JuUIiwiM+yblCIsIjTsm5QiLCI17JuUIiwiNuyblCIsIjfsm5QiLCI47JuUIiwiOeyblCIsIjEw7JuUIiwiMTHsm5QiLCIxMuyblCJdLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J+uFhCcgTSfsm5QnIGQn7D+8JyIsInRpbWVGb3JtYXQtZnVsbCI6ImEgaGgn7IucJyBtbSfrtoQnIHNzJ+y0iCcgeiIsImVyYXMiOlsi6riw7Js/7KCEIiwi7ISc6riwIl0sInRpbWVGb3JtYXQtbWVkaXVtIjoiYSBoaCfsi5wnIG1tJ+u2hCciLCJkYXRlRm9ybWF0LW1lZGl1bSI6Inl5eXkuIE1NLiBkZCIsImFtIjoi7Jik7KCEIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIjHsm5QiLCIy7JuUIiwiM+yblCIsIjTsm5QiLCI17JuUIiwiNuyblCIsIjfsm5QiLCI47JuUIiwiOeyblCIsIjEw7JuUIiwiMTHsm5QiLCIxMuyblCJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJ5eXl5J+uFhCcgTSfsm5QnIGQn7D+8JyBFRUVFIiwiZGF5cy1mb3JtYXQtYWJiciI6WyLsP7wiLCLsm5QiLCLtmZQiLCLsiJgiLCLrqqkiLCLquIgiLCLthqAiXSwidGltZUZvcm1hdC1sb25nIjoiYSBoaCfsi5wnIG1tJ+u2hCcgc3Mn7LSIJyIsInRpbWVGb3JtYXQtc2hvcnQiOiJhIGhoJ+yLnCcgbW0n67aEJyIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS4gTU0uIGRkIiwicG0iOiLsmKTtm4QiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiMeyblCIsIjLsm5QiLCIz7JuUIiwiNOyblCIsIjXsm5QiLCI27JuUIiwiN+yblCIsIjjsm5QiLCI57JuUIiwiMTDsm5QiLCIxMeyblCIsIjEy7JuUIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsi7D+8Iiwi7JuUIiwi7ZmUIiwi7IiYIiwi66qpIiwi6riIIiwi7YagIl0sImRheXMtZm9ybWF0LXdpZGUiOlsi7D+87JqU7D+8Iiwi7JuU7JqU7D+8Iiwi7ZmU7JqU7D+8Iiwi7IiY7JqU7D+8Iiwi66qp7JqU7D+8Iiwi6riI7JqU7D+8Iiwi7Yag7JqU7D+8Il0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5rbyIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLmtvPXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIua28iKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLmtvPXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIua28iKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLmtvPXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19wdC1ici5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX3B0LWJyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2VlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19wdC1ici5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX3B0LWJyIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ucHRfYnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5wdF9icj17ImZpZWxkLWhvdXIiOiJIb3JhIiwiZmllbGQtZGF5cGVyaW9kIjoiUGVyw61vZG8gZG8gZGlhIiwiZmllbGQtbWludXRlIjoiTWludXRvIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnaCdtbSdtaW4nc3MncycgeiIsImZpZWxkLXdlZWtkYXkiOiJEaWEgZGEgc2VtYW5hIiwiZmllbGQtd2VlayI6IlNlbWFuYSIsImZpZWxkLXNlY29uZCI6IlNlZ3VuZG8iLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkL01NL3l5eXkiLCJmaWVsZC1kYXkiOiJEaWEiLCJ0aW1lRm9ybWF0LWxvbmciOiJIJ2gnbSdtaW4ncydzJyB6IiwiZmllbGQtbW9udGgiOiJNw6pzIiwiZmllbGQteWVhciI6IkFubyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsImZpZWxkLXpvbmUiOiJGdXNvIiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJkYXRlRm9ybWF0LWxvbmciOiJkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJlcmFzIjpbImEuQy4iLCJkLkMuIl0sIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW4iLCJmZXYiLCJtYXIiLCJhYnIiLCJtYWkiLCJqdW4iLCJqdWwiLCJhZ28iLCJzZXQiLCJvdXQiLCJub3YiLCJkZXoiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJzZWciLCJ0ZXIiLCJxdWEiLCJxdWkiLCJzZXgiLCJzw6FiIl0sIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW5laXJvIiwiZmV2ZXJlaXJvIiwibWFyw6dvIiwiYWJyaWwiLCJtYWlvIiwianVuaG8iLCJqdWxobyIsImFnb3N0byIsInNldGVtYnJvIiwib3V0dWJybyIsIm5vdmVtYnJvIiwiZGV6ZW1icm8iXSwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJEIiwiUyIsIlQiLCJRIiwiUSIsIlMiLCJTIl0sImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsInNlZ3VuZGEtZmVpcmEiLCJ0ZXLDp2EtZmVpcmEiLCJxdWFydGEtZmVpcmEiLCJxdWludGEtZmVpcmEiLCJzZXh0YS1mZWlyYSIsInPDoWJhZG8iXSwicG0iOiJQTSIsImFtIjoiQU0iLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtZXJhIjoiRXJhIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIn07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMucHRfYnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5wdF9icj17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ucHRfYnIiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5wdF9icj17ImZpZWxkLWhvdXIiOiJIb3JhIiwiZmllbGQtZGF5cGVyaW9kIjoiUGVyw61vZG8gZG8gZGlhIiwiZmllbGQtbWludXRlIjoiTWludXRvIiwidGltZUZvcm1hdC1mdWxsIjoiSEgnaCdtbSdtaW4nc3MncycgeiIsImZpZWxkLXdlZWtkYXkiOiJEaWEgZGEgc2VtYW5hIiwiZmllbGQtd2VlayI6IlNlbWFuYSIsImZpZWxkLXNlY29uZCI6IlNlZ3VuZG8iLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImRkL01NL3l5eXkiLCJmaWVsZC1kYXkiOiJEaWEiLCJ0aW1lRm9ybWF0LWxvbmciOiJIJ2gnbSdtaW4ncydzJyB6IiwiZmllbGQtbW9udGgiOiJNw6pzIiwiZmllbGQteWVhciI6IkFubyIsImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsImZpZWxkLXpvbmUiOiJGdXNvIiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJkYXRlRm9ybWF0LWxvbmciOiJkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJlcmFzIjpbImEuQy4iLCJkLkMuIl0sIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW4iLCJmZXYiLCJtYXIiLCJhYnIiLCJtYWkiLCJqdW4iLCJqdWwiLCJhZ28iLCJzZXQiLCJvdXQiLCJub3YiLCJkZXoiXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCJzZWciLCJ0ZXIiLCJxdWEiLCJxdWkiLCJzZXgiLCJzw6FiIl0sIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW5laXJvIiwiZmV2ZXJlaXJvIiwibWFyw6dvIiwiYWJyaWwiLCJtYWlvIiwianVuaG8iLCJqdWxobyIsImFnb3N0byIsInNldGVtYnJvIiwib3V0dWJybyIsIm5vdmVtYnJvIiwiZGV6ZW1icm8iXSwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJEIiwiUyIsIlQiLCJRIiwiUSIsIlMiLCJTIl0sImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsInNlZ3VuZGEtZmVpcmEiLCJ0ZXLDp2EtZmVpcmEiLCJxdWFydGEtZmVpcmEiLCJxdWludGEtZmVpcmEiLCJzZXh0YS1mZWlyYSIsInPDoWJhZG8iXSwicG0iOiJQTSIsImFtIjoiQU0iLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtZXJhIjoiRXJhIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIucHRfYnIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5wdF9icj17ImFueSI6ImFueSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLnB0X2JyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5wdF9icj17InNlbGVjdFRpbWUiOiJTZWxlY3QgdGltZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLnB0X2JyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5wdF9icj17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fcHQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb19wdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE5YzJhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9fcHQuanMKQEAgLTAsMCArMSwxMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJubHMuZG9qb19wdCIpO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLnB0Iik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ucHQ9eyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsIkYiLCJNIiwiQSIsIk0iLCJKIiwiSiIsIkEiLCJTIiwiTyIsIk4iLCJEIl0sImRhdGVGb3JtYXQtbG9uZyI6ImQnIGRlICdNTU1NJyBkZSAneXl5eSIsInRpbWVGb3JtYXQtZnVsbCI6IkhIJ0gnbW0nbSdzcydzJyB6IiwiZXJhcyI6WyJhLkMuIiwiZC5DLiJdLCJkYXRlRm9ybWF0LW1lZGl1bSI6ImQvTU1NL3l5eXkiLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiamFuIiwiZmV2IiwibWFyIiwiYWJyIiwibWFpIiwianVuIiwianVsIiwiYWdvIiwic2V0Iiwib3V0Iiwibm92IiwiZGV6Il0sImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUsIGQnIGRlICdNTU1NJyBkZSAneXl5eSIsImRheXMtZm9ybWF0LWFiYnIiOlsiZG9tIiwic2VnIiwidGVyIiwicXVhIiwicXVpIiwic2V4Iiwic8OhYiJdLCJkYXRlRm9ybWF0LXNob3J0IjoiZGQtTU0teXl5eSIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW5laXJvIiwiZmV2ZXJlaXJvIiwibWFyw6dvIiwiYWJyaWwiLCJtYWlvIiwianVuaG8iLCJqdWxobyIsImFnb3N0byIsInNldGVtYnJvIiwib3V0dWJybyIsIm5vdmVtYnJvIiwiZGV6ZW1icm8iXSwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJEIiwiUyIsIlQiLCJRIiwiUSIsIlMiLCJTIl0sImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsInNlZ3VuZGEtZmVpcmEiLCJ0ZXLDp2EtZmVpcmEiLCJxdWFydGEtZmVpcmEiLCJxdWludGEtZmVpcmEiLCJzZXh0YS1mZWlyYSIsInPDoWJhZG8iXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwicG0iOiJQTSIsImFtIjoiQU0iLCJmaWVsZC15ZWFyIjoiWWVhciIsImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCJmaWVsZC1ob3VyIjoiSG91ciIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJmaWVsZC1lcmEiOiJFcmEiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6IiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5wdCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLnB0PXsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXkifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5wdCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLnB0PXsibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLCJkYXRlRm9ybWF0LWxvbmciOiJkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISCdIJ21tJ20nc3MncycgeiIsImVyYXMiOlsiYS5DLiIsImQuQy4iXSwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkL01NTS95eXl5IiwibW9udGhzLWZvcm1hdC1hYmJyIjpbImphbiIsImZldiIsIm1hciIsImFiciIsIm1haSIsImp1biIsImp1bCIsImFnbyIsInNldCIsIm91dCIsIm5vdiIsImRleiJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCJkYXlzLWZvcm1hdC1hYmJyIjpbImRvbSIsInNlZyIsInRlciIsInF1YSIsInF1aSIsInNleCIsInPDoWIiXSwiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkLU1NLXl5eXkiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiamFuZWlybyIsImZldmVyZWlybyIsIm1hcsOnbyIsImFicmlsIiwibWFpbyIsImp1bmhvIiwianVsaG8iLCJhZ29zdG8iLCJzZXRlbWJybyIsIm91dHVicm8iLCJub3ZlbWJybyIsImRlemVtYnJvIl0sImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiRCIsIlMiLCJUIiwiUSIsIlEiLCJTIiwiUyJdLCJkYXlzLWZvcm1hdC13aWRlIjpbImRvbWluZ28iLCJzZWd1bmRhLWZlaXJhIiwidGVyw6dhLWZlaXJhIiwicXVhcnRhLWZlaXJhIiwicXVpbnRhLWZlaXJhIiwic2V4dGEtZmVpcmEiLCJzw6FiYWRvIl0sImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJhbSI6IkFNIiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtaG91ciI6IkhvdXIiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZmllbGQtZXJhIjoiRXJhIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsImZpZWxkLXpvbmUiOiJab25lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIucHQiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5wdD17ImFueSI6ImFueSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLnB0Iik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5wdD17InNlbGVjdFRpbWUiOiJTZWxlY3QgdGltZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLnB0Iik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5wdD17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9feHguanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb194eC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODk5NmYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9feHguanMKQEAgLTAsMCArMSwxMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJubHMuZG9qb194eCIpO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLnh4Iik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ueHg9eyJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5IE1NTSBkIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJwbSI6IlBNIiwidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiXSwiYW0iOiJBTSIsImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdLCJmaWVsZC15ZWFyIjoiWWVhciIsImVyYXMiOlsiQkNFIiwiQ0UiXSwiZmllbGQtbWludXRlIjoiTWludXRlIiwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsImZpZWxkLWhvdXIiOiJIb3VyIiwiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSBNTU1NIGQiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJmaWVsZC1lcmEiOiJFcmEiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoiLCJkYXlzLWZvcm1hdC13aWRlIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciXSwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgeXl5eSBNTU1NIGRkIiwiZmllbGQtem9uZSI6IlpvbmUiLCJkYXlzLWZvcm1hdC1hYmJyIjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciXX07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMueHgiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy54eD17ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4ueHgiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi54eD17ImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCJkYXRlRm9ybWF0LW1lZGl1bSI6Inl5eXkgTU1NIGQiLCJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCJmaWVsZC13ZWVrIjoiV2VlayIsInBtIjoiUE0iLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISDptbTpzcyB6IiwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLCJhbSI6IkFNIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3Il0sImZpZWxkLXllYXIiOiJZZWFyIiwiZXJhcyI6WyJCQ0UiLCJDRSJdLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtaG91ciI6IkhvdXIiLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5IE1NTU0gZCIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJkYXRlRm9ybWF0LXNob3J0IjoieXkvTU0vZGQiLCJtb250aHMtZm9ybWF0LXdpZGUiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sImZpZWxkLWVyYSI6IkVyYSIsInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiXSwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsImRheXMtZm9ybWF0LXdpZGUiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdLCJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCB5eXl5IE1NTU0gZGQiLCJmaWVsZC16b25lIjoiWm9uZSIsImRheXMtZm9ybWF0LWFiYnIiOlsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdfTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci54eCIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLnh4PXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIueHgiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLnh4PXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIueHgiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLnh4PXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb196aC1jbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX3poLWNuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDllN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb196aC1jbi5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX3poLWNuIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uemhfY24iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi56aF9jbj17ImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS1NLWQiLCJmaWVsZC1zZWNvbmQiOiLnp5Lpkp8iLCJmaWVsZC13ZWVrIjoi5ZGoIiwidGltZUZvcm1hdC1mdWxsIjoiYWhoJ+aXtidtbSfliIYnc3Mn56eSJyB6IiwiZmllbGQteWVhciI6IuW5tCIsImZpZWxkLW1pbnV0ZSI6IuWIhumSnyIsInRpbWVGb3JtYXQtbWVkaXVtIjoiYWhoOm1tOnNzIiwiZmllbGQtaG91ciI6IuWwP+aXtiIsImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJyIsImZpZWxkLWRheSI6IuaXpSIsImZpZWxkLWRheXBlcmlvZCI6IuS4iuU/iC/kuIvlP4giLCJmaWVsZC1tb250aCI6IuaciCIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS1NLWQiLCJmaWVsZC1lcmEiOiLml7bmnJ8iLCJ0aW1lRm9ybWF0LXNob3J0IjoiYWg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJhaGgn5pe2J21tJ+WIhidzcyfnp5InIiwiZGF0ZUZvcm1hdC1mdWxsIjoieXl5eSflubQnTSfmnIgnZCfml6UnRUVFRSIsImZpZWxkLXdlZWtkYXkiOiLlkajlpKkiLCJmaWVsZC16b25lIjoi5Yy65Z+fIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLml6UiLCLkuIAiLCLkuowiLCLkuIkiLCLlm5siLCLkupQiLCLlha0iXSwiZXJhcyI6WyLlhazlhYPliT8iLCLlhazlhYMiXSwiYW0iOiLkuIrlP4giLCJtb250aHMtZm9ybWF0LWFiYnIiOlsi5LiA5pyIIiwi5LqM5pyIIiwi5LiJ5pyIIiwi5Zub5pyIIiwi5LqU5pyIIiwi5YWt5pyIIiwi5LiD5pyIIiwi5YWr5pyIIiwi5Lk/5pyIIiwi5T8/5pyIIiwi5T8/5LiA5pyIIiwi5T8/5LqM5pyIIl0sImRheXMtZm9ybWF0LWFiYnIiOlsi5ZGo5pelIiwi5ZGo5LiAIiwi5ZGo5LqMIiwi5ZGo5LiJIiwi5ZGo5ZubIiwi5ZGo5LqUIiwi5ZGo5YWtIl0sInBtIjoi5LiL5T+IIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIuS4gOaciCIsIuS6jOaciCIsIuS4ieaciCIsIuWbm+aciCIsIuS6lOaciCIsIuWFreaciCIsIuS4g+aciCIsIuWFq+aciCIsIuS5P+aciCIsIuU/P+aciCIsIuU/P+S4gOaciCIsIuU/P+S6jOaciCJdLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMeaciCIsIjLmnIgiLCIz5pyIIiwiNOaciCIsIjXmnIgiLCI25pyIIiwiN+aciCIsIjjmnIgiLCI55pyIIiwiMTDmnIgiLCIxMeaciCIsIjEy5pyIIl0sImRheXMtZm9ybWF0LXdpZGUiOlsi5pif5pyf5pelIiwi5pif5pyf5LiAIiwi5pif5pyf5LqMIiwi5pif5pyf5LiJIiwi5pif5pyf5ZubIiwi5pif5pyf5LqUIiwi5pif5pyf5YWtIl19O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLnpoX2NuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuemhfY249eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSflubQnIn07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uemhfY24iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi56aF9jbj17ImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eS1NLWQiLCJmaWVsZC1zZWNvbmQiOiLnp5Lpkp8iLCJmaWVsZC13ZWVrIjoi5ZGoIiwidGltZUZvcm1hdC1mdWxsIjoiYWhoJ+aXtidtbSfliIYnc3Mn56eSJyB6IiwiZmllbGQteWVhciI6IuW5tCIsImZpZWxkLW1pbnV0ZSI6IuWIhumSnyIsInRpbWVGb3JtYXQtbWVkaXVtIjoiYWhoOm1tOnNzIiwiZmllbGQtaG91ciI6IuWwP+aXtiIsImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJyIsImZpZWxkLWRheSI6IuaXpSIsImZpZWxkLWRheXBlcmlvZCI6IuS4iuU/iC/kuIvlP4giLCJmaWVsZC1tb250aCI6IuaciCIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eS1NLWQiLCJmaWVsZC1lcmEiOiLml7bmnJ8iLCJ0aW1lRm9ybWF0LXNob3J0IjoiYWg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJhaGgn5pe2J21tJ+WIhidzcyfnp5InIiwiZGF0ZUZvcm1hdC1mdWxsIjoieXl5eSflubQnTSfmnIgnZCfml6UnRUVFRSIsImZpZWxkLXdlZWtkYXkiOiLlkajlpKkiLCJmaWVsZC16b25lIjoi5Yy65Z+fIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLml6UiLCLkuIAiLCLkuowiLCLkuIkiLCLlm5siLCLkupQiLCLlha0iXSwiZXJhcyI6WyLlhazlhYPliT8iLCLlhazlhYMiXSwiYW0iOiLkuIrlP4giLCJtb250aHMtZm9ybWF0LWFiYnIiOlsi5LiA5pyIIiwi5LqM5pyIIiwi5LiJ5pyIIiwi5Zub5pyIIiwi5LqU5pyIIiwi5YWt5pyIIiwi5LiD5pyIIiwi5YWr5pyIIiwi5Lk/5pyIIiwi5T8/5pyIIiwi5T8/5LiA5pyIIiwi5T8/5LqM5pyIIl0sImRheXMtZm9ybWF0LWFiYnIiOlsi5ZGo5pelIiwi5ZGo5LiAIiwi5ZGo5LqMIiwi5ZGo5LiJIiwi5ZGo5ZubIiwi5ZGo5LqUIiwi5ZGo5YWtIl0sInBtIjoi5LiL5T+IIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIuS4gOaciCIsIuS6jOaciCIsIuS4ieaciCIsIuWbm+aciCIsIuS6lOaciCIsIuWFreaciCIsIuS4g+aciCIsIuWFq+aciCIsIuS5P+aciCIsIuU/P+aciCIsIuU/P+S4gOaciCIsIuU/P+S6jOaciCJdLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMeaciCIsIjLmnIgiLCIz5pyIIiwiNOaciCIsIjXmnIgiLCI25pyIIiwiN+aciCIsIjjmnIgiLCI55pyIIiwiMTDmnIgiLCIxMeaciCIsIjEy5pyIIl0sImRheXMtZm9ybWF0LXdpZGUiOlsi5pif5pyf5pelIiwi5pif5pyf5LiAIiwi5pif5pyf5LqMIiwi5pif5pyf5LiJIiwi5pif5pyf5ZubIiwi5pif5pyf5LqUIiwi5pif5pyf5YWtIl19O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLnpoX2NuIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuemhfY249eyJhbnkiOiJhbnkifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci56aF9jbiIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuemhfY249eyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIiKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci56aF9jbiIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuemhfY249eyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX3poLXR3LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vbmxzL2Rvam9femgtdHcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MGYzNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX3poLXR3LmpzCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgibmxzLmRvam9femgtdHciKTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi56aF90dyIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLnpoX3R3PXsiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSciLCJmaWVsZC1zZWNvbmQiOiLnp5IiLCJmaWVsZC13ZWVrIjoi6YCxIiwidGltZUZvcm1hdC1mdWxsIjoiYWhoJ+aZgidtbSfliIYnc3Mn56eSJyB6IiwiZXJhcyI6WyLopb/lhYPliT8iLCLopb/lhYMiXSwiZmllbGQteWVhciI6IuW5tCIsImZpZWxkLW1pbnV0ZSI6IuWIhuk/mCIsInRpbWVGb3JtYXQtbWVkaXVtIjoiYWhoOm1tOnNzIiwiZmllbGQtaG91ciI6IuWwP+aZgiIsImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJyIsImZpZWxkLWRheSI6IuaVtOaXpSIsImZpZWxkLWRheXBlcmlvZCI6IuaXpemWkyIsImZpZWxkLW1vbnRoIjoi5pyIIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5J+W5tCdNJ+aciCdkJ+aXpSciLCJmaWVsZC1lcmEiOiLlubTku6MiLCJ0aW1lRm9ybWF0LXNob3J0IjoiYWg6bW0iLCJtb250aHMtZm9ybWF0LWFiYnIiOlsiMeaciCIsIjLmnIgiLCIz5pyIIiwiNOaciCIsIjXmnIgiLCI25pyIIiwiN+aciCIsIjjmnIgiLCI55pyIIiwiMTDmnIgiLCIxMeaciCIsIjEy5pyIIl0sInRpbWVGb3JtYXQtbG9uZyI6ImFoaCfmmYInbW0n5YiGJ3NzJ+enkiciLCJmaWVsZC13ZWVrZGF5Ijoi6YCx5aSpIiwiZGF0ZUZvcm1hdC1mdWxsIjoieXl5eSflubQnTSfmnIgnZCfml6UnRUVFRSIsImZpZWxkLXpvbmUiOiLlP4Dln58iLCJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIuaXpSIsIuS4gCIsIuS6jCIsIuS4iSIsIuWbmyIsIuS6lCIsIuWFrSJdLCJhbSI6IuS4iuU/iCIsImRheXMtZm9ybWF0LWFiYnIiOlsi5ZGo5pelIiwi5ZGo5LiAIiwi5ZGo5LqMIiwi5ZGo5LiJIiwi5ZGo5ZubIiwi5ZGo5LqUIiwi5ZGo5YWtIl0sInBtIjoi5LiL5T+IIiwibW9udGhzLWZvcm1hdC13aWRlIjpbIuS4gOaciCIsIuS6jOaciCIsIuS4ieaciCIsIuWbm+aciCIsIuS6lOaciCIsIuWFreaciCIsIuS4g+aciCIsIuWFq+aciCIsIuS5P+aciCIsIuU/P+aciCIsIuU/P+S4gOaciCIsIuU/P+S6jOaciCJdLCJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMeaciCIsIjLmnIgiLCIz5pyIIiwiNOaciCIsIjXmnIgiLCI25pyIIiwiN+aciCIsIjjmnIgiLCI55pyIIiwiMTDmnIgiLCIxMeaciCIsIjEy5pyIIl0sImRheXMtZm9ybWF0LXdpZGUiOlsi5pif5pyf5pelIiwi5pif5pyf5LiAIiwi5pif5pyf5LqMIiwi5pif5pyf5LiJIiwi5pif5pyf5ZubIiwi5pif5pyf5LqUIiwi5pif5pyf5YWtIl19O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLnpoX3R3Iik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuemhfdHc9eyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eSflubQnIn07ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uemhfdHciKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi56aF90dz17ImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eSflubQnTSfmnIgnZCfml6UnIiwiZmllbGQtc2Vjb25kIjoi56eSIiwiZmllbGQtd2VlayI6IumAsSIsInRpbWVGb3JtYXQtZnVsbCI6ImFoaCfmmYInbW0n5YiGJ3NzJ+enkicgeiIsImVyYXMiOlsi6KW/5YWD5Yk/Iiwi6KW/5YWDIl0sImZpZWxkLXllYXIiOiLlubQiLCJmaWVsZC1taW51dGUiOiLliIbpP5giLCJ0aW1lRm9ybWF0LW1lZGl1bSI6ImFoaDptbTpzcyIsImZpZWxkLWhvdXIiOiLlsD/mmYIiLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J+W5tCdNJ+aciCdkJ+aXpSciLCJmaWVsZC1kYXkiOiLmlbTml6UiLCJmaWVsZC1kYXlwZXJpb2QiOiLml6XplpMiLCJmaWVsZC1tb250aCI6IuaciCIsImRhdGVGb3JtYXQtc2hvcnQiOiJ5eSflubQnTSfmnIgnZCfml6UnIiwiZmllbGQtZXJhIjoi5bm05LujIiwidGltZUZvcm1hdC1zaG9ydCI6ImFoOm1tIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIjHmnIgiLCIy5pyIIiwiM+aciCIsIjTmnIgiLCI15pyIIiwiNuaciCIsIjfmnIgiLCI45pyIIiwiOeaciCIsIjEw5pyIIiwiMTHmnIgiLCIxMuaciCJdLCJ0aW1lRm9ybWF0LWxvbmciOiJhaGgn5pmCJ21tJ+WIhidzcyfnp5InIiwiZmllbGQtd2Vla2RheSI6IumAseWkqSIsImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkn5bm0J00n5pyIJ2Qn5pelJ0VFRUUiLCJmaWVsZC16b25lIjoi5T+A5Z+fIiwiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyLml6UiLCLkuIAiLCLkuowiLCLkuIkiLCLlm5siLCLkupQiLCLlha0iXSwiYW0iOiLkuIrlP4giLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuWRqOaXpSIsIuWRqOS4gCIsIuWRqOS6jCIsIuWRqOS4iSIsIuWRqOWbmyIsIuWRqOS6lCIsIuWRqOWFrSJdLCJwbSI6IuS4i+U/iCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyLkuIDmnIgiLCLkuozmnIgiLCLkuInmnIgiLCLlm5vmnIgiLCLkupTmnIgiLCLlha3mnIgiLCLkuIPmnIgiLCLlhavmnIgiLCLkuT/mnIgiLCLlPz/mnIgiLCLlPz/kuIDmnIgiLCLlPz/kuozmnIgiXSwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjHmnIgiLCIy5pyIIiwiM+aciCIsIjTmnIgiLCI15pyIIiwiNuaciCIsIjfmnIgiLCI45pyIIiwiOeaciCIsIjEw5pyIIiwiMTHmnIgiLCIxMuaciCJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIuaYn+acn+aXpSIsIuaYn+acn+S4gCIsIuaYn+acn+S6jCIsIuaYn+acn+S4iSIsIuaYn+acn+WbmyIsIuaYn+acn+S6lCIsIuaYn+acn+WFrSJdfTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci56aF90dyIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLnpoX3R3PXsiYW55IjoiYW55In07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuemhfdHciKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLnpoX3R3PXsic2VsZWN0VGltZSI6IlNlbGVjdCB0aW1lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuemhfdHciKTtkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLnpoX3R3PXsic2VsZWN0RGF0ZSI6IlNlbGVjdCBhIGRhdGUifTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb196aC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL25scy9kb2pvX3poLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGNjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9ubHMvZG9qb196aC5qcwpAQCAtMCwwICsxLDExIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoIm5scy5kb2pvX3poIik7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbiIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uemgiKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi56aD17ImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsi5pelIiwi5LiAIiwi5LqMIiwi5LiJIiwi5ZubIiwi5LqUIiwi5YWtIl0sImVyYXMiOlsi5YWs5YWD5Yk/Iiwi5YWs5YWDIl0sImFtIjoi5LiK5T+IIiwibW9udGhzLWZvcm1hdC1hYmJyIjpbIuS4gOaciCIsIuS6jOaciCIsIuS4ieaciCIsIuWbm+aciCIsIuS6lOaciCIsIuWFreaciCIsIuS4g+aciCIsIuWFq+aciCIsIuS5P+aciCIsIuU/P+aciCIsIuU/P+S4gOaciCIsIuU/P+S6jOaciCJdLCJkYXlzLWZvcm1hdC1hYmJyIjpbIuWRqOaXpSIsIuWRqOS4gCIsIuWRqOS6jCIsIuWRqOS4iSIsIuWRqOWbmyIsIuWRqOS6lCIsIuWRqOWFrSJdLCJwbSI6IuS4i+U/iCIsIm1vbnRocy1mb3JtYXQtd2lkZSI6WyLkuIDmnIgiLCLkuozmnIgiLCLkuInmnIgiLCLlm5vmnIgiLCLkupTmnIgiLCLlha3mnIgiLCLkuIPmnIgiLCLlhavmnIgiLCLkuT/mnIgiLCLlPz/mnIgiLCLlPz/kuIDmnIgiLCLlPz/kuozmnIgiXSwibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjHmnIgiLCIy5pyIIiwiM+aciCIsIjTmnIgiLCI15pyIIiwiNuaciCIsIjfmnIgiLCI45pyIIiwiOeaciCIsIjEw5pyIIiwiMTHmnIgiLCIxMuaciCJdLCJkYXlzLWZvcm1hdC13aWRlIjpbIuaYn+acn+aXpSIsIuaYn+acn+S4gCIsIuaYn+acn+S6jCIsIuaYn+acn+S4iSIsIuaYn+acn+WbmyIsIuaYn+acn+S6lCIsIuaYn+acn+WFrSJdLCJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5IE1NTSBkIiwiZmllbGQtc2Vjb25kIjoiU2Vjb25kIiwiZmllbGQtd2VlayI6IldlZWsiLCJ0aW1lRm9ybWF0LWZ1bGwiOiJISDptbTpzcyB6IiwiZmllbGQteWVhciI6IlllYXIiLCJmaWVsZC1taW51dGUiOiJNaW51dGUiLCJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwiZmllbGQtaG91ciI6IkhvdXIiLCJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5IE1NTU0gZCIsImZpZWxkLWRheSI6IkRheSIsImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsImZpZWxkLW1vbnRoIjoiTW9udGgiLCJkYXRlRm9ybWF0LXNob3J0IjoieXkvTU0vZGQiLCJmaWVsZC1lcmEiOiJFcmEiLCJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6IiwiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgeXl5eSBNTU1NIGRkIiwiZmllbGQtem9uZSI6IlpvbmUifTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW5FeHRyYXMuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbkV4dHJhcy56aCIpO2Rvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuRXh0cmFzLnpoPXsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXkn5bm0JyJ9O2Rvam8ucHJvdmlkZSgiZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4iKTtkb2pvLmkxOG4uY2FsZW5kYXIubmxzLmdyZWdvcmlhbi5fYnVpbHQ9dHJ1ZTtkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jYWxlbmRhci5ubHMuZ3JlZ29yaWFuLnpoIik7ZG9qby5pMThuLmNhbGVuZGFyLm5scy5ncmVnb3JpYW4uemg9eyJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIuaXpSIsIuS4gCIsIuS6jCIsIuS4iSIsIuWbmyIsIuS6lCIsIuWFrSJdLCJlcmFzIjpbIuWFrOWFg+WJPyIsIuWFrOWFgyJdLCJhbSI6IuS4iuU/iCIsIm1vbnRocy1mb3JtYXQtYWJiciI6WyLkuIDmnIgiLCLkuozmnIgiLCLkuInmnIgiLCLlm5vmnIgiLCLkupTmnIgiLCLlha3mnIgiLCLkuIPmnIgiLCLlhavmnIgiLCLkuT/mnIgiLCLlPz/mnIgiLCLlPz/kuIDmnIgiLCLlPz/kuozmnIgiXSwiZGF5cy1mb3JtYXQtYWJiciI6WyLlkajml6UiLCLlkajkuIAiLCLlkajkuowiLCLlkajkuIkiLCLlkajlm5siLCLlkajkupQiLCLlkajlha0iXSwicG0iOiLkuIvlP4giLCJtb250aHMtZm9ybWF0LXdpZGUiOlsi5LiA5pyIIiwi5LqM5pyIIiwi5LiJ5pyIIiwi5Zub5pyIIiwi5LqU5pyIIiwi5YWt5pyIIiwi5LiD5pyIIiwi5YWr5pyIIiwi5Lk/5pyIIiwi5T8/5pyIIiwi5T8/5LiA5pyIIiwi5T8/5LqM5pyIIl0sIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyIx5pyIIiwiMuaciCIsIjPmnIgiLCI05pyIIiwiNeaciCIsIjbmnIgiLCI35pyIIiwiOOaciCIsIjnmnIgiLCIxMOaciCIsIjEx5pyIIiwiMTLmnIgiXSwiZGF5cy1mb3JtYXQtd2lkZSI6WyLmmJ/mnJ/ml6UiLCLmmJ/mnJ/kuIAiLCLmmJ/mnJ/kuowiLCLmmJ/mnJ/kuIkiLCLmmJ/mnJ/lm5siLCLmmJ/mnJ/kupQiLCLmmJ/mnJ/lha0iXSwiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eSBNTU0gZCIsImZpZWxkLXNlY29uZCI6IlNlY29uZCIsImZpZWxkLXdlZWsiOiJXZWVrIiwidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsImZpZWxkLXllYXIiOiJZZWFyIiwiZmllbGQtbWludXRlIjoiTWludXRlIiwidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsImZpZWxkLWhvdXIiOiJIb3VyIiwiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSBNTU1NIGQiLCJmaWVsZC1kYXkiOiJEYXkiLCJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCJmaWVsZC1tb250aCI6Ik1vbnRoIiwiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwiZmllbGQtZXJhIjoiRXJhIiwidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUsIHl5eXkgTU1NTSBkZCIsImZpZWxkLXpvbmUiOiJab25lIn07ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5UaW1lUGlja2VyLl9idWlsdD10cnVlO2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLlRpbWVQaWNrZXIuemgiKTtkb2pvLndpZGdldC5ubHMuVGltZVBpY2tlci56aD17ImFueSI6ImFueSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93blRpbWVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25UaW1lUGlja2VyLnpoIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duVGltZVBpY2tlci56aD17InNlbGVjdFRpbWUiOiJTZWxlY3QgdGltZSJ9O2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlciIpO2Rvam8ud2lkZ2V0Lm5scy5Ecm9wZG93bkRhdGVQaWNrZXIuX2J1aWx0PXRydWU7ZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5ubHMuRHJvcGRvd25EYXRlUGlja2VyLnpoIik7ZG9qby53aWRnZXQubmxzLkRyb3Bkb3duRGF0ZVBpY2tlci56aD17InNlbGVjdERhdGUiOiJTZWxlY3QgYSBkYXRlIn07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL0FkYXB0ZXJSZWdpc3RyeS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9BZGFwdGVyUmVnaXN0cnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4YjU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9BZGFwdGVyUmVnaXN0cnkuanMKQEAgLTAsMCArMSw0NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5BZGFwdGVyUmVnaXN0cnkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2Rvam8uQWRhcHRlclJlZ2lzdHJ5ID0gZnVuY3Rpb24gKHJldHVybldyYXBwZXJzKSB7CisJdGhpcy5wYWlycyA9IFtdOworCXRoaXMucmV0dXJuV3JhcHBlcnMgPSByZXR1cm5XcmFwcGVycyB8fCBmYWxzZTsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uQWRhcHRlclJlZ2lzdHJ5LCB7cmVnaXN0ZXI6ZnVuY3Rpb24gKG5hbWUsIGNoZWNrLCB3cmFwLCBkaXJlY3RSZXR1cm4sIG92ZXJyaWRlKSB7CisJdmFyIHR5cGUgPSAob3ZlcnJpZGUpID8gInVuc2hpZnQiIDogInB1c2giOworCXRoaXMucGFpcnNbdHlwZV0oW25hbWUsIGNoZWNrLCB3cmFwLCBkaXJlY3RSZXR1cm5dKTsKK30sIG1hdGNoOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFpcnMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHBhaXIgPSB0aGlzLnBhaXJzW2ldOworCQlpZiAocGFpclsxXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7CisJCQlpZiAoKHBhaXJbM10pIHx8ICh0aGlzLnJldHVybldyYXBwZXJzKSkgeworCQkJCXJldHVybiBwYWlyWzJdOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gcGFpclsyXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJfQorCQl9CisJfQorCXRocm93IG5ldyBFcnJvcigiTm8gbWF0Y2ggZm91bmQiKTsKK30sIHVucmVnaXN0ZXI6ZnVuY3Rpb24gKG5hbWUpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFpcnMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHBhaXIgPSB0aGlzLnBhaXJzW2ldOworCQlpZiAocGFpclswXSA9PSBuYW1lKSB7CisJCQl0aGlzLnBhaXJzLnNwbGljZShpLCAxKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL0RlZmVycmVkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL0RlZmVycmVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2YyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvRGVmZXJyZWQuanMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uRGVmZXJyZWQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2Rvam8uRGVmZXJyZWQgPSBmdW5jdGlvbiAoY2FuY2VsbGVyKSB7CisJdGhpcy5jaGFpbiA9IFtdOworCXRoaXMuaWQgPSB0aGlzLl9uZXh0SWQoKTsKKwl0aGlzLmZpcmVkID0gLTE7CisJdGhpcy5wYXVzZWQgPSAwOworCXRoaXMucmVzdWx0cyA9IFtudWxsLCBudWxsXTsKKwl0aGlzLmNhbmNlbGxlciA9IGNhbmNlbGxlcjsKKwl0aGlzLnNpbGVudGx5Q2FuY2VsbGVkID0gZmFsc2U7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLkRlZmVycmVkLCB7Z2V0RnVuY3Rpb25Gcm9tQXJnczpmdW5jdGlvbiAoKSB7CisJdmFyIGEgPSBhcmd1bWVudHM7CisJaWYgKChhWzBdKSAmJiAoIWFbMV0pKSB7CisJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihhWzBdKSkgeworCQkJcmV0dXJuIGFbMF07CisJCX0gZWxzZSB7CisJCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGFbMF0pKSB7CisJCQkJcmV0dXJuIGRqX2dsb2JhbFthWzBdXTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmICgoYVswXSkgJiYgKGFbMV0pKSB7CisJCQlyZXR1cm4gZG9qby5sYW5nLmhpdGNoKGFbMF0sIGFbMV0pOworCQl9CisJfQorCXJldHVybiBudWxsOworfSwgbWFrZUNhbGxlZDpmdW5jdGlvbiAoKSB7CisJdmFyIGRlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwlkZWZlcnJlZC5jYWxsYmFjaygpOworCXJldHVybiBkZWZlcnJlZDsKK30sIHJlcHI6ZnVuY3Rpb24gKCkgeworCXZhciBzdGF0ZTsKKwlpZiAodGhpcy5maXJlZCA9PSAtMSkgeworCQlzdGF0ZSA9ICJ1bmZpcmVkIjsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5maXJlZCA9PSAwKSB7CisJCQlzdGF0ZSA9ICJzdWNjZXNzIjsKKwkJfSBlbHNlIHsKKwkJCXN0YXRlID0gImVycm9yIjsKKwkJfQorCX0KKwlyZXR1cm4gIkRlZmVycmVkKCIgKyB0aGlzLmlkICsgIiwgIiArIHN0YXRlICsgIikiOworfSwgdG9TdHJpbmc6ZG9qby5sYW5nLmZvcndhcmQoInJlcHIiKSwgX25leHRJZDooZnVuY3Rpb24gKCkgeworCXZhciBuID0gMTsKKwlyZXR1cm4gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbisrOworCX07Cit9KSgpLCBjYW5jZWw6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmZpcmVkID09IC0xKSB7CisJCWlmICh0aGlzLmNhbmNlbGxlcikgeworCQkJdGhpcy5jYW5jZWxsZXIodGhpcyk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNpbGVudGx5Q2FuY2VsbGVkID0gdHJ1ZTsKKwkJfQorCQlpZiAodGhpcy5maXJlZCA9PSAtMSkgeworCQkJdGhpcy5lcnJiYWNrKG5ldyBFcnJvcih0aGlzLnJlcHIoKSkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh0aGlzLmZpcmVkID09IDApICYmICh0aGlzLnJlc3VsdHNbMF0gaW5zdGFuY2VvZiBkb2pvLkRlZmVycmVkKSkgeworCQkJdGhpcy5yZXN1bHRzWzBdLmNhbmNlbCgpOworCQl9CisJfQorfSwgX3BhdXNlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnBhdXNlZCsrOworfSwgX3VucGF1c2U6ZnVuY3Rpb24gKCkgeworCXRoaXMucGF1c2VkLS07CisJaWYgKCh0aGlzLnBhdXNlZCA9PSAwKSAmJiAodGhpcy5maXJlZCA+PSAwKSkgeworCQl0aGlzLl9maXJlKCk7CisJfQorfSwgX2NvbnRpbnVlOmZ1bmN0aW9uIChyZXMpIHsKKwl0aGlzLl9yZXNiYWNrKHJlcyk7CisJdGhpcy5fdW5wYXVzZSgpOworfSwgX3Jlc2JhY2s6ZnVuY3Rpb24gKHJlcykgeworCXRoaXMuZmlyZWQgPSAoKHJlcyBpbnN0YW5jZW9mIEVycm9yKSA/IDEgOiAwKTsKKwl0aGlzLnJlc3VsdHNbdGhpcy5maXJlZF0gPSByZXM7CisJdGhpcy5fZmlyZSgpOworfSwgX2NoZWNrOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5maXJlZCAhPSAtMSkgeworCQlpZiAoIXRoaXMuc2lsZW50bHlDYW5jZWxsZWQpIHsKKwkJCWRvam8ucmFpc2UoImFscmVhZHkgY2FsbGVkISIpOworCQl9CisJCXRoaXMuc2lsZW50bHlDYW5jZWxsZWQgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KK30sIGNhbGxiYWNrOmZ1bmN0aW9uIChyZXMpIHsKKwl0aGlzLl9jaGVjaygpOworCXRoaXMuX3Jlc2JhY2socmVzKTsKK30sIGVycmJhY2s6ZnVuY3Rpb24gKHJlcykgeworCXRoaXMuX2NoZWNrKCk7CisJaWYgKCEocmVzIGluc3RhbmNlb2YgRXJyb3IpKSB7CisJCXJlcyA9IG5ldyBFcnJvcihyZXMpOworCX0KKwl0aGlzLl9yZXNiYWNrKHJlcyk7Cit9LCBhZGRCb3RoOmZ1bmN0aW9uIChjYiwgY2JmbikgeworCXZhciBlbmNsb3NlZCA9IHRoaXMuZ2V0RnVuY3Rpb25Gcm9tQXJncyhjYiwgY2Jmbik7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisJCWVuY2xvc2VkID0gZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzKG51bGwsIGVuY2xvc2VkLCBhcmd1bWVudHMsIDIpOworCX0KKwlyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoZW5jbG9zZWQsIGVuY2xvc2VkKTsKK30sIGFkZENhbGxiYWNrOmZ1bmN0aW9uIChjYiwgY2JmbikgeworCXZhciBlbmNsb3NlZCA9IHRoaXMuZ2V0RnVuY3Rpb25Gcm9tQXJncyhjYiwgY2Jmbik7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisJCWVuY2xvc2VkID0gZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzKG51bGwsIGVuY2xvc2VkLCBhcmd1bWVudHMsIDIpOworCX0KKwlyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoZW5jbG9zZWQsIG51bGwpOworfSwgYWRkRXJyYmFjazpmdW5jdGlvbiAoY2IsIGNiZm4pIHsKKwl2YXIgZW5jbG9zZWQgPSB0aGlzLmdldEZ1bmN0aW9uRnJvbUFyZ3MoY2IsIGNiZm4pOworCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgeworCQllbmNsb3NlZCA9IGRvam8ubGFuZy5jdXJyeUFyZ3VtZW50cyhudWxsLCBlbmNsb3NlZCwgYXJndW1lbnRzLCAyKTsKKwl9CisJcmV0dXJuIHRoaXMuYWRkQ2FsbGJhY2tzKG51bGwsIGVuY2xvc2VkKTsKKwlyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MobnVsbCwgY2Jmbik7Cit9LCBhZGRDYWxsYmFja3M6ZnVuY3Rpb24gKGNiLCBlYikgeworCXRoaXMuY2hhaW4ucHVzaChbY2IsIGViXSk7CisJaWYgKHRoaXMuZmlyZWQgPj0gMCkgeworCQl0aGlzLl9maXJlKCk7CisJfQorCXJldHVybiB0aGlzOworfSwgX2ZpcmU6ZnVuY3Rpb24gKCkgeworCXZhciBjaGFpbiA9IHRoaXMuY2hhaW47CisJdmFyIGZpcmVkID0gdGhpcy5maXJlZDsKKwl2YXIgcmVzID0gdGhpcy5yZXN1bHRzW2ZpcmVkXTsKKwl2YXIgc2VsZiA9IHRoaXM7CisJdmFyIGNiID0gbnVsbDsKKwl3aGlsZSAoY2hhaW4ubGVuZ3RoID4gMCAmJiB0aGlzLnBhdXNlZCA9PSAwKSB7CisJCXZhciBwYWlyID0gY2hhaW4uc2hpZnQoKTsKKwkJdmFyIGYgPSBwYWlyW2ZpcmVkXTsKKwkJaWYgKGYgPT0gbnVsbCkgeworCQkJY29udGludWU7CisJCX0KKwkJdHJ5IHsKKwkJCXJlcyA9IGYocmVzKTsKKwkJCWZpcmVkID0gKChyZXMgaW5zdGFuY2VvZiBFcnJvcikgPyAxIDogMCk7CisJCQlpZiAocmVzIGluc3RhbmNlb2YgZG9qby5EZWZlcnJlZCkgeworCQkJCWNiID0gZnVuY3Rpb24gKHJlcykgeworCQkJCQlzZWxmLl9jb250aW51ZShyZXMpOworCQkJCX07CisJCQkJdGhpcy5fcGF1c2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoZXJyKSB7CisJCQlmaXJlZCA9IDE7CisJCQlyZXMgPSBlcnI7CisJCX0KKwl9CisJdGhpcy5maXJlZCA9IGZpcmVkOworCXRoaXMucmVzdWx0c1tmaXJlZF0gPSByZXM7CisJaWYgKChjYikgJiYgKHRoaXMucGF1c2VkKSkgeworCQlyZXMuYWRkQm90aChjYik7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvRGVmZXJyZWRMaXN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL0RlZmVycmVkTGlzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL0RlZmVycmVkTGlzdC5qcwpAQCAtMCwwICsxLDc3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZXF1aXJlKCJkb2pvLkRlZmVycmVkIik7Citkb2pvLnByb3ZpZGUoImRvam8uRGVmZXJyZWRMaXN0Iik7Citkb2pvLkRlZmVycmVkTGlzdCA9IGZ1bmN0aW9uIChsaXN0LCBmaXJlT25PbmVDYWxsYmFjaywgZmlyZU9uT25lRXJyYmFjaywgY29uc3VtZUVycm9ycywgY2FuY2VsbGVyKSB7CisJdGhpcy5saXN0ID0gbGlzdDsKKwl0aGlzLnJlc3VsdExpc3QgPSBuZXcgQXJyYXkodGhpcy5saXN0Lmxlbmd0aCk7CisJdGhpcy5jaGFpbiA9IFtdOworCXRoaXMuaWQgPSB0aGlzLl9uZXh0SWQoKTsKKwl0aGlzLmZpcmVkID0gLTE7CisJdGhpcy5wYXVzZWQgPSAwOworCXRoaXMucmVzdWx0cyA9IFtudWxsLCBudWxsXTsKKwl0aGlzLmNhbmNlbGxlciA9IGNhbmNlbGxlcjsKKwl0aGlzLnNpbGVudGx5Q2FuY2VsbGVkID0gZmFsc2U7CisJaWYgKHRoaXMubGlzdC5sZW5ndGggPT09IDAgJiYgIWZpcmVPbk9uZUNhbGxiYWNrKSB7CisJCXRoaXMuY2FsbGJhY2sodGhpcy5yZXN1bHRMaXN0KTsKKwl9CisJdGhpcy5maW5pc2hlZENvdW50ID0gMDsKKwl0aGlzLmZpcmVPbk9uZUNhbGxiYWNrID0gZmlyZU9uT25lQ2FsbGJhY2s7CisJdGhpcy5maXJlT25PbmVFcnJiYWNrID0gZmlyZU9uT25lRXJyYmFjazsKKwl0aGlzLmNvbnN1bWVFcnJvcnMgPSBjb25zdW1lRXJyb3JzOworCXZhciBpbmRleCA9IDA7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmxpc3QsIGZ1bmN0aW9uIChkKSB7CisJCXZhciBfaW5kZXggPSBpbmRleDsKKwkJZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAocikgeworCQkJX3RoaXMuX2NiRGVmZXJyZWQoX2luZGV4LCB0cnVlLCByKTsKKwkJfSk7CisJCWQuYWRkRXJyYmFjayhmdW5jdGlvbiAocikgeworCQkJX3RoaXMuX2NiRGVmZXJyZWQoX2luZGV4LCBmYWxzZSwgcik7CisJCX0pOworCQlpbmRleCsrOworCX0pOworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5EZWZlcnJlZExpc3QsIGRvam8uRGVmZXJyZWQpOworZG9qby5sYW5nLmV4dGVuZChkb2pvLkRlZmVycmVkTGlzdCwge19jYkRlZmVycmVkOmZ1bmN0aW9uIChpbmRleCwgc3VjY2VlZGVkLCByZXN1bHQpIHsKKwl0aGlzLnJlc3VsdExpc3RbaW5kZXhdID0gW3N1Y2NlZWRlZCwgcmVzdWx0XTsKKwl0aGlzLmZpbmlzaGVkQ291bnQgKz0gMTsKKwlpZiAodGhpcy5maXJlZCAhPT0gMCkgeworCQlpZiAoc3VjY2VlZGVkICYmIHRoaXMuZmlyZU9uT25lQ2FsbGJhY2spIHsKKwkJCXRoaXMuY2FsbGJhY2soW2luZGV4LCByZXN1bHRdKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghc3VjY2VlZGVkICYmIHRoaXMuZmlyZU9uT25lRXJyYmFjaykgeworCQkJCXRoaXMuZXJyYmFjayhyZXN1bHQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5maW5pc2hlZENvdW50ID09IHRoaXMubGlzdC5sZW5ndGgpIHsKKwkJCQkJdGhpcy5jYWxsYmFjayh0aGlzLnJlc3VsdExpc3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoIXN1Y2NlZWRlZCAmJiB0aGlzLmNvbnN1bWVFcnJvcnMpIHsKKwkJcmVzdWx0ID0gbnVsbDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30sIGdhdGhlclJlc3VsdHM6ZnVuY3Rpb24gKGRlZmVycmVkTGlzdCkgeworCXZhciBkID0gbmV3IGRvam8uRGVmZXJyZWRMaXN0KGRlZmVycmVkTGlzdCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKwlkLmFkZENhbGxiYWNrKGZ1bmN0aW9uIChyZXN1bHRzKSB7CisJCXZhciByZXQgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7CisJCQlyZXQucHVzaChyZXN1bHRzW2ldWzFdKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0pOworCXJldHVybiBkOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYTExeS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hMTF5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTFiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYTExeS5qcwpAQCAtMCwwICsxLDU0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmExMXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuY29tbW9uIik7Citkb2pvLmExMXkgPSB7aW1nUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMiKSwgZG9BY2Nlc3NpYmxlQ2hlY2s6dHJ1ZSwgYWNjZXNzaWJsZTpudWxsLCBjaGVja0FjY2Vzc2libGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmFjY2Vzc2libGUgPT09IG51bGwpIHsKKwkJdGhpcy5hY2Nlc3NpYmxlID0gZmFsc2U7CisJCWlmICh0aGlzLmRvQWNjZXNzaWJsZUNoZWNrID09IHRydWUpIHsKKwkJCXRoaXMuYWNjZXNzaWJsZSA9IHRoaXMudGVzdEFjY2Vzc2libGUoKTsKKwkJfQorCX0KKwlyZXR1cm4gdGhpcy5hY2Nlc3NpYmxlOworfSwgdGVzdEFjY2Vzc2libGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuYWNjZXNzaWJsZSA9IGZhbHNlOworCWlmIChkb2pvLnJlbmRlci5odG1sLmllIHx8IGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgeworCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWRpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKFwiIiArIHRoaXMuaW1nUGF0aCArICIvdGFiX2Nsb3NlLmdpZlwiKSI7CisJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKGRpdik7CisJCXZhciBia0ltZyA9IG51bGw7CisJCWlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkgeworCQkJdmFyIGNTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZGl2LCAiIik7CisJCQlia0ltZyA9IGNTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWltYWdlIik7CisJCX0gZWxzZSB7CisJCQlia0ltZyA9IGRpdi5jdXJyZW50U3R5bGUuYmFja2dyb3VuZEltYWdlOworCQl9CisJCXZhciBiVXNlSW1nRWxlbSA9IGZhbHNlOworCQlpZiAoYmtJbWcgIT0gbnVsbCAmJiAoYmtJbWcgPT0gIm5vbmUiIHx8IGJrSW1nID09ICJ1cmwoaW52YWxpZC11cmw6KSIpKSB7CisJCQl0aGlzLmFjY2Vzc2libGUgPSB0cnVlOworCQl9CisJCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKGRpdik7CisJfQorCXJldHVybiB0aGlzLmFjY2Vzc2libGU7Cit9LCBzZXRDaGVja0FjY2Vzc2libGU6ZnVuY3Rpb24gKGJUZXN0KSB7CisJdGhpcy5kb0FjY2Vzc2libGVDaGVjayA9IGJUZXN0OworfSwgc2V0QWNjZXNzaWJsZU1vZGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmFjY2Vzc2libGUgPT09IG51bGwpIHsKKwkJaWYgKHRoaXMuY2hlY2tBY2Nlc3NpYmxlKCkpIHsKKwkJCWRvam8ucmVuZGVyLmh0bWwucHJlZml4ZXMudW5zaGlmdCgiYTExeSIpOworCQl9CisJfQorCXJldHVybiB0aGlzLmFjY2Vzc2libGU7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlZDc1YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24uanMKQEAgLTAsMCArMSwxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5hbmltYXRpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5hbmltYXRpb24uQW5pbWF0aW9uIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uYW5pbWF0aW9uIGlzIHNsYXRlZCBmb3IgcmVtb3ZhbCBpbiAwLjU7IHVzZSBkb2pvLmxmeCBpbnN0ZWFkLiIsICIwLjUiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9BbmltYXRpb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTdlMDFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9BbmltYXRpb24uanMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmFuaW1hdGlvbi5BbmltYXRpb25FdmVudCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoLmN1cnZlcyIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmFuaW1hdGlvbi5BbmltYXRpb24gaXMgc2xhdGVkIGZvciByZW1vdmFsIGluIDAuNTsgdXNlIGRvam8ubGZ4LiogaW5zdGVhZC4iLCAiMC41Iik7Citkb2pvLmFuaW1hdGlvbi5BbmltYXRpb24gPSBmdW5jdGlvbiAoY3VydmUsIGR1cmF0aW9uLCBhY2NlbCwgcmVwZWF0Q291bnQsIHJhdGUpIHsKKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkoY3VydmUpKSB7CisJCWN1cnZlID0gbmV3IGRvam8ubWF0aC5jdXJ2ZXMuTGluZShjdXJ2ZVswXSwgY3VydmVbMV0pOworCX0KKwl0aGlzLmN1cnZlID0gY3VydmU7CisJdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOworCXRoaXMucmVwZWF0Q291bnQgPSByZXBlYXRDb3VudCB8fCAwOworCXRoaXMucmF0ZSA9IHJhdGUgfHwgMjU7CisJaWYgKGFjY2VsKSB7CisJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihhY2NlbC5nZXRWYWx1ZSkpIHsKKwkJCXRoaXMuYWNjZWwgPSBhY2NlbDsKKwkJfSBlbHNlIHsKKwkJCXZhciBpID0gMC4zNSAqIGFjY2VsICsgMC41OworCQkJdGhpcy5hY2NlbCA9IG5ldyBkb2pvLm1hdGguY3VydmVzLkNhdG11bGxSb20oW1swXSwgW2ldLCBbMV1dLCAwLjQ1KTsKKwkJfQorCX0KK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbiwge2N1cnZlOm51bGwsIGR1cmF0aW9uOjAsIHJlcGVhdENvdW50OjAsIGFjY2VsOm51bGwsIG9uQmVnaW46bnVsbCwgb25BbmltYXRlOm51bGwsIG9uRW5kOm51bGwsIG9uUGxheTpudWxsLCBvblBhdXNlOm51bGwsIG9uU3RvcDpudWxsLCBoYW5kbGVyOm51bGwsIF9hbmltU2VxdWVuY2U6bnVsbCwgX3N0YXJ0VGltZTpudWxsLCBfZW5kVGltZTpudWxsLCBfbGFzdEZyYW1lOm51bGwsIF90aW1lcjpudWxsLCBfcGVyY2VudDowLCBfYWN0aXZlOmZhbHNlLCBfcGF1c2VkOmZhbHNlLCBfc3RhcnRSZXBlYXRDb3VudDowLCBwbGF5OmZ1bmN0aW9uIChnb3RvU3RhcnQpIHsKKwlpZiAoZ290b1N0YXJ0KSB7CisJCWNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CisJCXRoaXMuX2FjdGl2ZSA9IGZhbHNlOworCQl0aGlzLl9wYXVzZWQgPSBmYWxzZTsKKwkJdGhpcy5fcGVyY2VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuX2FjdGl2ZSAmJiAhdGhpcy5fcGF1c2VkKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdGhpcy5fc3RhcnRUaW1lID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7CisJaWYgKHRoaXMuX3BhdXNlZCkgeworCQl0aGlzLl9zdGFydFRpbWUgLT0gKHRoaXMuZHVyYXRpb24gKiB0aGlzLl9wZXJjZW50IC8gMTAwKTsKKwl9CisJdGhpcy5fZW5kVGltZSA9IHRoaXMuX3N0YXJ0VGltZSArIHRoaXMuZHVyYXRpb247CisJdGhpcy5fbGFzdEZyYW1lID0gdGhpcy5fc3RhcnRUaW1lOworCXZhciBlID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50KHRoaXMsIG51bGwsIHRoaXMuY3VydmUuZ2V0VmFsdWUodGhpcy5fcGVyY2VudCksIHRoaXMuX3N0YXJ0VGltZSwgdGhpcy5fc3RhcnRUaW1lLCB0aGlzLl9lbmRUaW1lLCB0aGlzLmR1cmF0aW9uLCB0aGlzLl9wZXJjZW50LCAwKTsKKwl0aGlzLl9hY3RpdmUgPSB0cnVlOworCXRoaXMuX3BhdXNlZCA9IGZhbHNlOworCWlmICh0aGlzLl9wZXJjZW50ID09IDApIHsKKwkJaWYgKCF0aGlzLl9zdGFydFJlcGVhdENvdW50KSB7CisJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gdGhpcy5yZXBlYXRDb3VudDsKKwkJfQorCQllLnR5cGUgPSAiYmVnaW4iOworCQlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCQl0aGlzLmhhbmRsZXIoZSk7CisJCX0KKwkJaWYgKHR5cGVvZiB0aGlzLm9uQmVnaW4gPT0gImZ1bmN0aW9uIikgeworCQkJdGhpcy5vbkJlZ2luKGUpOworCQl9CisJfQorCWUudHlwZSA9ICJwbGF5IjsKKwlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMuaGFuZGxlcihlKTsKKwl9CisJaWYgKHR5cGVvZiB0aGlzLm9uUGxheSA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMub25QbGF5KGUpOworCX0KKwlpZiAodGhpcy5fYW5pbVNlcXVlbmNlKSB7CisJCXRoaXMuX2FuaW1TZXF1ZW5jZS5fc2V0Q3VycmVudCh0aGlzKTsKKwl9CisJdGhpcy5fY3ljbGUoKTsKK30sIHBhdXNlOmZ1bmN0aW9uICgpIHsKKwljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCWlmICghdGhpcy5fYWN0aXZlKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5fcGF1c2VkID0gdHJ1ZTsKKwl2YXIgZSA9IG5ldyBkb2pvLmFuaW1hdGlvbi5BbmltYXRpb25FdmVudCh0aGlzLCAicGF1c2UiLCB0aGlzLmN1cnZlLmdldFZhbHVlKHRoaXMuX3BlcmNlbnQpLCB0aGlzLl9zdGFydFRpbWUsIG5ldyBEYXRlKCkudmFsdWVPZigpLCB0aGlzLl9lbmRUaW1lLCB0aGlzLmR1cmF0aW9uLCB0aGlzLl9wZXJjZW50LCAwKTsKKwlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMuaGFuZGxlcihlKTsKKwl9CisJaWYgKHR5cGVvZiB0aGlzLm9uUGF1c2UgPT0gImZ1bmN0aW9uIikgeworCQl0aGlzLm9uUGF1c2UoZSk7CisJfQorfSwgcGxheVBhdXNlOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuX2FjdGl2ZSB8fCB0aGlzLl9wYXVzZWQpIHsKKwkJdGhpcy5wbGF5KCk7CisJfSBlbHNlIHsKKwkJdGhpcy5wYXVzZSgpOworCX0KK30sIGdvdG9QZXJjZW50OmZ1bmN0aW9uIChwY3QsIGFuZFBsYXkpIHsKKwljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCXRoaXMuX2FjdGl2ZSA9IHRydWU7CisJdGhpcy5fcGF1c2VkID0gdHJ1ZTsKKwl0aGlzLl9wZXJjZW50ID0gcGN0OworCWlmIChhbmRQbGF5KSB7CisJCXRoaXMucGxheSgpOworCX0KK30sIHN0b3A6ZnVuY3Rpb24gKGdvdG9FbmQpIHsKKwljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCXZhciBzdGVwID0gdGhpcy5fcGVyY2VudCAvIDEwMDsKKwlpZiAoZ290b0VuZCkgeworCQlzdGVwID0gMTsKKwl9CisJdmFyIGUgPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uRXZlbnQodGhpcywgInN0b3AiLCB0aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApLCB0aGlzLl9zdGFydFRpbWUsIG5ldyBEYXRlKCkudmFsdWVPZigpLCB0aGlzLl9lbmRUaW1lLCB0aGlzLmR1cmF0aW9uLCB0aGlzLl9wZXJjZW50KTsKKwlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMuaGFuZGxlcihlKTsKKwl9CisJaWYgKHR5cGVvZiB0aGlzLm9uU3RvcCA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMub25TdG9wKGUpOworCX0KKwl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwl0aGlzLl9wYXVzZWQgPSBmYWxzZTsKK30sIHN0YXR1czpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FjdGl2ZSkgeworCQlyZXR1cm4gdGhpcy5fcGF1c2VkID8gInBhdXNlZCIgOiAicGxheWluZyI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJzdG9wcGVkIjsKKwl9Cit9LCBfY3ljbGU6ZnVuY3Rpb24gKCkgeworCWNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CisJaWYgKHRoaXMuX2FjdGl2ZSkgeworCQl2YXIgY3VyciA9IG5ldyBEYXRlKCkudmFsdWVPZigpOworCQl2YXIgc3RlcCA9IChjdXJyIC0gdGhpcy5fc3RhcnRUaW1lKSAvICh0aGlzLl9lbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lKTsKKwkJdmFyIGZwcyA9IDEwMDAgLyAoY3VyciAtIHRoaXMuX2xhc3RGcmFtZSk7CisJCXRoaXMuX2xhc3RGcmFtZSA9IGN1cnI7CisJCWlmIChzdGVwID49IDEpIHsKKwkJCXN0ZXAgPSAxOworCQkJdGhpcy5fcGVyY2VudCA9IDEwMDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuX3BlcmNlbnQgPSBzdGVwICogMTAwOworCQl9CisJCWlmICh0aGlzLmFjY2VsICYmIHRoaXMuYWNjZWwuZ2V0VmFsdWUpIHsKKwkJCXN0ZXAgPSB0aGlzLmFjY2VsLmdldFZhbHVlKHN0ZXApOworCQl9CisJCXZhciBlID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50KHRoaXMsICJhbmltYXRlIiwgdGhpcy5jdXJ2ZS5nZXRWYWx1ZShzdGVwKSwgdGhpcy5fc3RhcnRUaW1lLCBjdXJyLCB0aGlzLl9lbmRUaW1lLCB0aGlzLmR1cmF0aW9uLCB0aGlzLl9wZXJjZW50LCBNYXRoLnJvdW5kKGZwcykpOworCQlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCQl0aGlzLmhhbmRsZXIoZSk7CisJCX0KKwkJaWYgKHR5cGVvZiB0aGlzLm9uQW5pbWF0ZSA9PSAiZnVuY3Rpb24iKSB7CisJCQl0aGlzLm9uQW5pbWF0ZShlKTsKKwkJfQorCQlpZiAoc3RlcCA8IDEpIHsKKwkJCXRoaXMuX3RpbWVyID0gc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgIl9jeWNsZSIpLCB0aGlzLnJhdGUpOworCQl9IGVsc2UgeworCQkJZS50eXBlID0gImVuZCI7CisJCQl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwkJCWlmICh0eXBlb2YgdGhpcy5oYW5kbGVyID09ICJmdW5jdGlvbiIpIHsKKwkJCQl0aGlzLmhhbmRsZXIoZSk7CisJCQl9CisJCQlpZiAodHlwZW9mIHRoaXMub25FbmQgPT0gImZ1bmN0aW9uIikgeworCQkJCXRoaXMub25FbmQoZSk7CisJCQl9CisJCQlpZiAodGhpcy5yZXBlYXRDb3VudCA+IDApIHsKKwkJCQl0aGlzLnJlcGVhdENvdW50LS07CisJCQkJdGhpcy5wbGF5KHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5yZXBlYXRDb3VudCA9PSAtMSkgeworCQkJCQl0aGlzLnBsYXkodHJ1ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQpIHsKKwkJCQkJCXRoaXMucmVwZWF0Q291bnQgPSB0aGlzLl9zdGFydFJlcGVhdENvdW50OworCQkJCQkJdGhpcy5fc3RhcnRSZXBlYXRDb3VudCA9IDA7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuX2FuaW1TZXF1ZW5jZSkgeworCQkJCQkJdGhpcy5fYW5pbVNlcXVlbmNlLl9wbGF5TmV4dCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbkV2ZW50LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25FdmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMxMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25FdmVudC5qcwpAQCAtMCwwICsxLDM3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmFuaW1hdGlvbi5BbmltYXRpb25FdmVudCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50IGlzIHNsYXRlZCBmb3IgcmVtb3ZhbCBpbiAwLjU7IHVzZSBkb2pvLmxmeC4qIGluc3RlYWQuIiwgIjAuNSIpOworZG9qby5hbmltYXRpb24uQW5pbWF0aW9uRXZlbnQgPSBmdW5jdGlvbiAoYW5pbWF0aW9uLCB0eXBlLCBjb29yZHMsIHN0YXJ0VGltZSwgY3VycmVudFRpbWUsIGVuZFRpbWUsIGR1cmF0aW9uLCBwZXJjZW50LCBmcHMpIHsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMuYW5pbWF0aW9uID0gYW5pbWF0aW9uOworCXRoaXMuY29vcmRzID0gY29vcmRzOworCXRoaXMueCA9IGNvb3Jkc1swXTsKKwl0aGlzLnkgPSBjb29yZHNbMV07CisJdGhpcy56ID0gY29vcmRzWzJdOworCXRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOworCXRoaXMuY3VycmVudFRpbWUgPSBjdXJyZW50VGltZTsKKwl0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOworCXRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKKwl0aGlzLnBlcmNlbnQgPSBwZXJjZW50OworCXRoaXMuZnBzID0gZnBzOworfTsKK2Rvam8uZXh0ZW5kKGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50LCB7Y29vcmRzQXNJbnRzOmZ1bmN0aW9uICgpIHsKKwl2YXIgY2ludHMgPSBuZXcgQXJyYXkodGhpcy5jb29yZHMubGVuZ3RoKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29vcmRzLmxlbmd0aDsgaSsrKSB7CisJCWNpbnRzW2ldID0gTWF0aC5yb3VuZCh0aGlzLmNvb3Jkc1tpXSk7CisJfQorCXJldHVybiBjaW50czsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25TZXF1ZW5jZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyM2M2MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uU2VxdWVuY2UuanMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvblNlcXVlbmNlIik7Citkb2pvLnJlcXVpcmUoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50Iik7Citkb2pvLnJlcXVpcmUoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbiIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmFuaW1hdGlvbi5BbmltYXRpb25TZXF1ZW5jZSBpcyBzbGF0ZWQgZm9yIHJlbW92YWwgaW4gMC41OyB1c2UgZG9qby5sZnguKiBpbnN0ZWFkLiIsICIwLjUiKTsKK2Rvam8uYW5pbWF0aW9uLkFuaW1hdGlvblNlcXVlbmNlID0gZnVuY3Rpb24gKHJlcGVhdENvdW50KSB7CisJdGhpcy5fYW5pbXMgPSBbXTsKKwl0aGlzLnJlcGVhdENvdW50ID0gcmVwZWF0Q291bnQgfHwgMDsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvblNlcXVlbmNlLCB7cmVwZWF0Q291bnQ6MCwgX2FuaW1zOltdLCBfY3VyckFuaW06LTEsIG9uQmVnaW46bnVsbCwgb25FbmQ6bnVsbCwgb25OZXh0Om51bGwsIGhhbmRsZXI6bnVsbCwgYWRkOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQl0aGlzLl9hbmltcy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCWFyZ3VtZW50c1tpXS5fYW5pbVNlcXVlbmNlID0gdGhpczsKKwl9Cit9LCByZW1vdmU6ZnVuY3Rpb24gKGFuaW0pIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FuaW1zLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLl9hbmltc1tpXSA9PSBhbmltKSB7CisJCQl0aGlzLl9hbmltc1tpXS5fYW5pbVNlcXVlbmNlID0gbnVsbDsKKwkJCXRoaXMuX2FuaW1zLnNwbGljZShpLCAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorfSwgcmVtb3ZlQWxsOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FuaW1zLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuX2FuaW1zW2ldLl9hbmltU2VxdWVuY2UgPSBudWxsOworCX0KKwl0aGlzLl9hbmltcyA9IFtdOworCXRoaXMuX2N1cnJBbmltID0gLTE7Cit9LCBjbGVhcjpmdW5jdGlvbiAoKSB7CisJdGhpcy5yZW1vdmVBbGwoKTsKK30sIHBsYXk6ZnVuY3Rpb24gKGdvdG9TdGFydCkgeworCWlmICh0aGlzLl9hbmltcy5sZW5ndGggPT0gMCkgeworCQlyZXR1cm47CisJfQorCWlmIChnb3RvU3RhcnQgfHwgIXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSkgeworCQl0aGlzLl9jdXJyQW5pbSA9IDA7CisJfQorCWlmICh0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0pIHsKKwkJaWYgKHRoaXMuX2N1cnJBbmltID09IDApIHsKKwkJCXZhciBlID0ge3R5cGU6ImJlZ2luIiwgYW5pbWF0aW9uOnRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXX07CisJCQlpZiAodHlwZW9mIHRoaXMuaGFuZGxlciA9PSAiZnVuY3Rpb24iKSB7CisJCQkJdGhpcy5oYW5kbGVyKGUpOworCQkJfQorCQkJaWYgKHR5cGVvZiB0aGlzLm9uQmVnaW4gPT0gImZ1bmN0aW9uIikgeworCQkJCXRoaXMub25CZWdpbihlKTsKKwkJCX0KKwkJfQorCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheShnb3RvU3RhcnQpOworCX0KK30sIHBhdXNlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKSB7CisJCXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXS5wYXVzZSgpOworCX0KK30sIHBsYXlQYXVzZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FuaW1zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMuX2N1cnJBbmltID09IC0xKSB7CisJCXRoaXMuX2N1cnJBbmltID0gMDsKKwl9CisJaWYgKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSkgeworCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheVBhdXNlKCk7CisJfQorfSwgc3RvcDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSkgeworCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0uc3RvcCgpOworCX0KK30sIHN0YXR1czpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSkgeworCQlyZXR1cm4gdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dLnN0YXR1cygpOworCX0gZWxzZSB7CisJCXJldHVybiAic3RvcHBlZCI7CisJfQorfSwgX3NldEN1cnJlbnQ6ZnVuY3Rpb24gKGFuaW0pIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FuaW1zLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLl9hbmltc1tpXSA9PSBhbmltKSB7CisJCQl0aGlzLl9jdXJyQW5pbSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KK30sIF9wbGF5TmV4dDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2N1cnJBbmltID09IC0xIHx8IHRoaXMuX2FuaW1zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5fY3VyckFuaW0rKzsKKwlpZiAodGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKSB7CisJCXZhciBlID0ge3R5cGU6Im5leHQiLCBhbmltYXRpb246dGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dfTsKKwkJaWYgKHR5cGVvZiB0aGlzLmhhbmRsZXIgPT0gImZ1bmN0aW9uIikgeworCQkJdGhpcy5oYW5kbGVyKGUpOworCQl9CisJCWlmICh0eXBlb2YgdGhpcy5vbk5leHQgPT0gImZ1bmN0aW9uIikgeworCQkJdGhpcy5vbk5leHQoZSk7CisJCX0KKwkJdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dLnBsYXkodHJ1ZSk7CisJfSBlbHNlIHsKKwkJdmFyIGUgPSB7dHlwZToiZW5kIiwgYW5pbWF0aW9uOnRoaXMuX2FuaW1zW3RoaXMuX2FuaW1zLmxlbmd0aCAtIDFdfTsKKwkJaWYgKHR5cGVvZiB0aGlzLmhhbmRsZXIgPT0gImZ1bmN0aW9uIikgeworCQkJdGhpcy5oYW5kbGVyKGUpOworCQl9CisJCWlmICh0eXBlb2YgdGhpcy5vbkVuZCA9PSAiZnVuY3Rpb24iKSB7CisJCQl0aGlzLm9uRW5kKGUpOworCQl9CisJCWlmICh0aGlzLnJlcGVhdENvdW50ID4gMCkgeworCQkJdGhpcy5fY3VyckFuaW0gPSAwOworCQkJdGhpcy5yZXBlYXRDb3VudC0tOworCQkJdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dLnBsYXkodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5yZXBlYXRDb3VudCA9PSAtMSkgeworCQkJCXRoaXMuX2N1cnJBbmltID0gMDsKKwkJCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheSh0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5fY3VyckFuaW0gPSAtMTsKKwkJCX0KKwkJfQorCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9UaW1lci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vVGltZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2ZTdjMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vVGltZXIuanMKQEAgLTAsMCArMSwxNyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5hbmltYXRpb24uVGltZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLnRpbWluZy5UaW1lciIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmFuaW1hdGlvbi5UaW1lciBpcyBub3cgZG9qby5sYW5nLnRpbWluZy5UaW1lciIsICIwLjUiKTsKK2Rvam8uYW5pbWF0aW9uLlRpbWVyID0gZG9qby5sYW5nLnRpbWluZy5UaW1lcjsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2FuaW1hdGlvbi9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjZDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9hbmltYXRpb24vX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbkV2ZW50IiwgImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbiIsICJkb2pvLmFuaW1hdGlvbi5BbmltYXRpb25TZXF1ZW5jZSJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8uYW5pbWF0aW9uLioiKTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5BbmltYXRpb24uKiBpcyBzbGF0ZWQgZm9yIHJlbW92YWwgaW4gMC41OyB1c2UgZG9qby5sZnguKiBpbnN0ZWFkLiIsICIwLjUiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2JlaGF2aW9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2JlaGF2aW9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWNjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYmVoYXZpb3IuanMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uYmVoYXZpb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5iZWhhdmlvciIpOworZG9qby5iZWhhdmlvciA9IG5ldyBmdW5jdGlvbiAoKSB7CisJZnVuY3Rpb24gYXJySW4ob2JqLCBuYW1lKSB7CisJCWlmICghb2JqW25hbWVdKSB7CisJCQlvYmpbbmFtZV0gPSBbXTsKKwkJfQorCQlyZXR1cm4gb2JqW25hbWVdOworCX0KKwlmdW5jdGlvbiBmb3JJbihvYmosIHNjb3BlLCBmdW5jKSB7CisJCXZhciB0bXBPYmogPSB7fTsKKwkJZm9yICh2YXIgeCBpbiBvYmopIHsKKwkJCWlmICh0eXBlb2YgdG1wT2JqW3hdID09ICJ1bmRlZmluZWQiKSB7CisJCQkJaWYgKCFmdW5jKSB7CisJCQkJCXNjb3BlKG9ialt4XSwgeCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZnVuYy5jYWxsKHNjb3BlLCBvYmpbeF0sIHgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl0aGlzLmJlaGF2aW9ycyA9IHt9OworCXRoaXMuYWRkID0gZnVuY3Rpb24gKGJlaGF2aW9yT2JqKSB7CisJCXZhciB0bXBPYmogPSB7fTsKKwkJZm9ySW4oYmVoYXZpb3JPYmosIHRoaXMsIGZ1bmN0aW9uIChiZWhhdmlvciwgbmFtZSkgeworCQkJdmFyIHRCZWhhdmlvciA9IGFyckluKHRoaXMuYmVoYXZpb3JzLCBuYW1lKTsKKwkJCWlmICgoZG9qby5sYW5nLmlzU3RyaW5nKGJlaGF2aW9yKSkgfHwgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGJlaGF2aW9yKSkpIHsKKwkJCQliZWhhdmlvciA9IHtmb3VuZDpiZWhhdmlvcn07CisJCQl9CisJCQlmb3JJbihiZWhhdmlvciwgZnVuY3Rpb24gKHJ1bGUsIHJ1bGVOYW1lKSB7CisJCQkJYXJySW4odEJlaGF2aW9yLCBydWxlTmFtZSkucHVzaChydWxlKTsKKwkJCX0pOworCQl9KTsKKwl9OworCXRoaXMuYXBwbHkgPSBmdW5jdGlvbiAoKSB7CisJCWRvam8ucHJvZmlsZS5zdGFydCgiZG9qby5iZWhhdmlvci5hcHBseSIpOworCQl2YXIgciA9IGRvam8ucmVuZGVyLmh0bWw7CisJCXZhciBzYWZhcmlHb29kRW5vdWdoID0gKCFyLnNhZmFyaSk7CisJCWlmIChyLnNhZmFyaSkgeworCQkJdmFyIHVhcyA9IHIuVUEuc3BsaXQoIkFwcGxlV2ViS2l0LyIpWzFdOworCQkJaWYgKHBhcnNlSW50KHVhcy5tYXRjaCgvWzAtOS5dezMsfS8pKSA+PSA0MjApIHsKKwkJCQlzYWZhcmlHb29kRW5vdWdoID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAoKGRqX3VuZGVmKCJiZWhhdmlvckZhc3RQYXJzZSIsIGRqQ29uZmlnKSA/IChzYWZhcmlHb29kRW5vdWdoKSA6IGRqQ29uZmlnWyJiZWhhdmlvckZhc3RQYXJzZSJdKSkgeworCQkJdGhpcy5hcHBseUZhc3QoKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYXBwbHlTbG93KCk7CisJCX0KKwkJZG9qby5wcm9maWxlLmVuZCgiZG9qby5iZWhhdmlvci5hcHBseSIpOworCX07CisJdGhpcy5tYXRjaENhY2hlID0ge307CisJdGhpcy5lbGVtZW50c0J5SWQgPSBmdW5jdGlvbiAoaWQsIGhhbmRsZVJlbW92ZWQpIHsKKwkJdmFyIHJlbW92ZWQgPSBbXTsKKwkJdmFyIGFkZGVkID0gW107CisJCWFyckluKHRoaXMubWF0Y2hDYWNoZSwgaWQpOworCQlpZiAoaGFuZGxlUmVtb3ZlZCkgeworCQkJdmFyIG5vZGVzID0gdGhpcy5tYXRjaENhY2hlW2lkXTsKKwkJCWZvciAodmFyIHggPSAwOyB4IDwgbm9kZXMubGVuZ3RoOyB4KyspIHsKKwkJCQlpZiAobm9kZXNbeF0uaWQgIT0gIiIpIHsKKwkJCQkJcmVtb3ZlZC5wdXNoKG5vZGVzW3hdKTsKKwkJCQkJbm9kZXMuc3BsaWNlKHgsIDEpOworCQkJCQl4LS07CisJCQkJfQorCQkJfQorCQl9CisJCXZhciB0RWxlbSA9IGRvam8uYnlJZChpZCk7CisJCXdoaWxlICh0RWxlbSkgeworCQkJaWYgKCF0RWxlbVsiaWRjYWNoZWQiXSkgeworCQkJCWFkZGVkLnB1c2godEVsZW0pOworCQkJfQorCQkJdEVsZW0uaWQgPSAiIjsKKwkJCXRFbGVtID0gZG9qby5ieUlkKGlkKTsKKwkJfQorCQl0aGlzLm1hdGNoQ2FjaGVbaWRdID0gdGhpcy5tYXRjaENhY2hlW2lkXS5jb25jYXQoYWRkZWQpOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLm1hdGNoQ2FjaGVbaWRdLCBmdW5jdGlvbiAobm9kZSkgeworCQkJbm9kZS5pZCA9IGlkOworCQkJbm9kZS5pZGNhY2hlZCA9IHRydWU7CisJCX0pOworCQlyZXR1cm4geyJyZW1vdmVkIjpyZW1vdmVkLCAiYWRkZWQiOmFkZGVkLCAibWF0Y2giOnRoaXMubWF0Y2hDYWNoZVtpZF19OworCX07CisJdGhpcy5hcHBseVRvTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBhY3Rpb24sIHJ1bGVTZXROYW1lKSB7CisJCWlmICh0eXBlb2YgYWN0aW9uID09ICJzdHJpbmciKSB7CisJCQlkb2pvLmV2ZW50LnRvcGljLnJlZ2lzdGVyUHVibGlzaGVyKGFjdGlvbiwgbm9kZSwgcnVsZVNldE5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKHR5cGVvZiBhY3Rpb24gPT0gImZ1bmN0aW9uIikgeworCQkJCWlmIChydWxlU2V0TmFtZSA9PSAiZm91bmQiKSB7CisJCQkJCWFjdGlvbihub2RlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwgcnVsZVNldE5hbWUsIGFjdGlvbik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlhY3Rpb24uc3JjT2JqID0gbm9kZTsKKwkJCQlhY3Rpb24uc3JjRnVuYyA9IHJ1bGVTZXROYW1lOworCQkJCWRvam8uZXZlbnQua3dDb25uZWN0KGFjdGlvbik7CisJCQl9CisJCX0KKwl9OworCXRoaXMuYXBwbHlGYXN0ID0gZnVuY3Rpb24gKCkgeworCQlkb2pvLnByb2ZpbGUuc3RhcnQoImRvam8uYmVoYXZpb3IuYXBwbHlGYXN0Iik7CisJCWZvckluKHRoaXMuYmVoYXZpb3JzLCBmdW5jdGlvbiAodEJlaGF2aW9yLCBpZCkgeworCQkJdmFyIGVsZW1zID0gZG9qby5iZWhhdmlvci5lbGVtZW50c0J5SWQoaWQpOworCQkJZG9qby5sYW5nLmZvckVhY2goZWxlbXMuYWRkZWQsIGZ1bmN0aW9uIChlbGVtKSB7CisJCQkJZm9ySW4odEJlaGF2aW9yLCBmdW5jdGlvbiAocnVsZVNldCwgcnVsZVNldE5hbWUpIHsKKwkJCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHJ1bGVTZXQpKSB7CisJCQkJCQlkb2pvLmxhbmcuZm9yRWFjaChydWxlU2V0LCBmdW5jdGlvbiAoYWN0aW9uKSB7CisJCQkJCQkJZG9qby5iZWhhdmlvci5hcHBseVRvTm9kZShlbGVtLCBhY3Rpb24sIHJ1bGVTZXROYW1lKTsKKwkJCQkJCX0pOworCQkJCQl9CisJCQkJfSk7CisJCQl9KTsKKwkJfSk7CisJCWRvam8ucHJvZmlsZS5lbmQoImRvam8uYmVoYXZpb3IuYXBwbHlGYXN0Iik7CisJfTsKKwl0aGlzLmFwcGx5U2xvdyA9IGZ1bmN0aW9uICgpIHsKKwkJZG9qby5wcm9maWxlLnN0YXJ0KCJkb2pvLmJlaGF2aW9yLmFwcGx5U2xvdyIpOworCQl2YXIgYWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJdmFyIGFsbExlbiA9IGFsbC5sZW5ndGg7CisJCWZvciAodmFyIHggPSAwOyB4IDwgYWxsTGVuOyB4KyspIHsKKwkJCXZhciBlbGVtID0gYWxsW3hdOworCQkJaWYgKChlbGVtLmlkKSAmJiAoIWVsZW1bImJlaGF2aW9yQWRkZWQiXSkgJiYgKHRoaXMuYmVoYXZpb3JzW2VsZW0uaWRdKSkgeworCQkJCWVsZW1bImJlaGF2aW9yQWRkZWQiXSA9IHRydWU7CisJCQkJZm9ySW4odGhpcy5iZWhhdmlvcnNbZWxlbS5pZF0sIGZ1bmN0aW9uIChydWxlU2V0LCBydWxlU2V0TmFtZSkgeworCQkJCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkocnVsZVNldCkpIHsKKwkJCQkJCWRvam8ubGFuZy5mb3JFYWNoKHJ1bGVTZXQsIGZ1bmN0aW9uIChhY3Rpb24pIHsKKwkJCQkJCQlkb2pvLmJlaGF2aW9yLmFwcGx5VG9Ob2RlKGVsZW0sIGFjdGlvbiwgcnVsZVNldE5hbWUpOworCQkJCQkJfSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCQlkb2pvLnByb2ZpbGUuZW5kKCJkb2pvLmJlaGF2aW9yLmFwcGx5U2xvdyIpOworCX07Cit9OworZG9qby5hZGRPbkxvYWQoZG9qby5iZWhhdmlvciwgImFwcGx5Iik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ib290c3RyYXAxLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Jvb3RzdHJhcDEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NTk4YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ib290c3RyYXAxLmpzCkBAIC0wLDAgKzEsMTYwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKwordmFyIGRqX2dsb2JhbCA9IHRoaXM7Cit2YXIgZGpfY3VycmVudENvbnRleHQgPSB0aGlzOworZnVuY3Rpb24gZGpfdW5kZWYobmFtZSwgb2JqZWN0KSB7CisJcmV0dXJuICh0eXBlb2YgKG9iamVjdCB8fCBkal9jdXJyZW50Q29udGV4dClbbmFtZV0gPT0gInVuZGVmaW5lZCIpOworfQoraWYgKGRqX3VuZGVmKCJkakNvbmZpZyIsIHRoaXMpKSB7CisJdmFyIGRqQ29uZmlnID0ge307Cit9CitpZiAoZGpfdW5kZWYoImRvam8iLCB0aGlzKSkgeworCXZhciBkb2pvID0ge307Cit9Citkb2pvLmdsb2JhbCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZGpfY3VycmVudENvbnRleHQ7Cit9OworZG9qby5sb2NhbGUgPSBkakNvbmZpZy5sb2NhbGU7Citkb2pvLnZlcnNpb24gPSB7bWFqb3I6MCwgbWlub3I6NCwgcGF0Y2g6MywgZmxhZzoiIiwgcmV2aXNpb246TnVtYmVyKCIkUmV2JCIubWF0Y2goL1swLTldKy8pWzBdKSwgdG9TdHJpbmc6ZnVuY3Rpb24gKCkgeworCXdpdGggKGRvam8udmVyc2lvbikgeworCQlyZXR1cm4gbWFqb3IgKyAiLiIgKyBtaW5vciArICIuIiArIHBhdGNoICsgZmxhZyArICIgKCIgKyByZXZpc2lvbiArICIpIjsKKwl9Cit9fTsKK2Rvam8uZXZhbFByb3AgPSBmdW5jdGlvbiAobmFtZSwgb2JqZWN0LCBjcmVhdGUpIHsKKwlpZiAoKCFvYmplY3QpIHx8ICghbmFtZSkpIHsKKwkJcmV0dXJuIHVuZGVmaW5lZDsKKwl9CisJaWYgKCFkal91bmRlZihuYW1lLCBvYmplY3QpKSB7CisJCXJldHVybiBvYmplY3RbbmFtZV07CisJfQorCXJldHVybiAoY3JlYXRlID8gKG9iamVjdFtuYW1lXSA9IHt9KSA6IHVuZGVmaW5lZCk7Cit9OworZG9qby5wYXJzZU9ialBhdGggPSBmdW5jdGlvbiAocGF0aCwgY29udGV4dCwgY3JlYXRlKSB7CisJdmFyIG9iamVjdCA9IChjb250ZXh0IHx8IGRvam8uZ2xvYmFsKCkpOworCXZhciBuYW1lcyA9IHBhdGguc3BsaXQoIi4iKTsKKwl2YXIgcHJvcCA9IG5hbWVzLnBvcCgpOworCWZvciAodmFyIGkgPSAwLCBsID0gbmFtZXMubGVuZ3RoOyBpIDwgbCAmJiBvYmplY3Q7IGkrKykgeworCQlvYmplY3QgPSBkb2pvLmV2YWxQcm9wKG5hbWVzW2ldLCBvYmplY3QsIGNyZWF0ZSk7CisJfQorCXJldHVybiB7b2JqOm9iamVjdCwgcHJvcDpwcm9wfTsKK307Citkb2pvLmV2YWxPYmpQYXRoID0gZnVuY3Rpb24gKHBhdGgsIGNyZWF0ZSkgeworCWlmICh0eXBlb2YgcGF0aCAhPSAic3RyaW5nIikgeworCQlyZXR1cm4gZG9qby5nbG9iYWwoKTsKKwl9CisJaWYgKHBhdGguaW5kZXhPZigiLiIpID09IC0xKSB7CisJCXJldHVybiBkb2pvLmV2YWxQcm9wKHBhdGgsIGRvam8uZ2xvYmFsKCksIGNyZWF0ZSk7CisJfQorCXZhciByZWYgPSBkb2pvLnBhcnNlT2JqUGF0aChwYXRoLCBkb2pvLmdsb2JhbCgpLCBjcmVhdGUpOworCWlmIChyZWYpIHsKKwkJcmV0dXJuIGRvam8uZXZhbFByb3AocmVmLnByb3AsIHJlZi5vYmosIGNyZWF0ZSk7CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8uZXJyb3JUb1N0cmluZyA9IGZ1bmN0aW9uIChleGNlcHRpb24pIHsKKwlpZiAoIWRqX3VuZGVmKCJtZXNzYWdlIiwgZXhjZXB0aW9uKSkgeworCQlyZXR1cm4gZXhjZXB0aW9uLm1lc3NhZ2U7CisJfSBlbHNlIHsKKwkJaWYgKCFkal91bmRlZigiZGVzY3JpcHRpb24iLCBleGNlcHRpb24pKSB7CisJCQlyZXR1cm4gZXhjZXB0aW9uLmRlc2NyaXB0aW9uOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGV4Y2VwdGlvbjsKKwkJfQorCX0KK307Citkb2pvLnJhaXNlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGV4Y2VwdGlvbikgeworCWlmIChleGNlcHRpb24pIHsKKwkJbWVzc2FnZSA9IG1lc3NhZ2UgKyAiOiAiICsgZG9qby5lcnJvclRvU3RyaW5nKGV4Y2VwdGlvbik7CisJfSBlbHNlIHsKKwkJbWVzc2FnZSA9IGRvam8uZXJyb3JUb1N0cmluZyhtZXNzYWdlKTsKKwl9CisJdHJ5IHsKKwkJaWYgKGRqQ29uZmlnLmlzRGVidWcpIHsKKwkJCWRvam8uaG9zdGVudi5wcmludGxuKCJGQVRBTCBleGNlcHRpb24gcmFpc2VkOiAiICsgbWVzc2FnZSk7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwl9CisJdGhyb3cgZXhjZXB0aW9uIHx8IEVycm9yKG1lc3NhZ2UpOworfTsKK2Rvam8uZGVidWcgPSBmdW5jdGlvbiAoKSB7Cit9OworZG9qby5kZWJ1Z1NoYWxsb3cgPSBmdW5jdGlvbiAob2JqKSB7Cit9OworZG9qby5wcm9maWxlID0ge3N0YXJ0OmZ1bmN0aW9uICgpIHsKK30sIGVuZDpmdW5jdGlvbiAoKSB7Cit9LCBzdG9wOmZ1bmN0aW9uICgpIHsKK30sIGR1bXA6ZnVuY3Rpb24gKCkgeworfX07CitmdW5jdGlvbiBkal9ldmFsKHNjcmlwdEZyYWdtZW50KSB7CisJcmV0dXJuIGRqX2dsb2JhbC5ldmFsID8gZGpfZ2xvYmFsLmV2YWwoc2NyaXB0RnJhZ21lbnQpIDogZXZhbChzY3JpcHRGcmFnbWVudCk7Cit9Citkb2pvLnVuaW1wbGVtZW50ZWQgPSBmdW5jdGlvbiAoZnVuY25hbWUsIGV4dHJhKSB7CisJdmFyIG1lc3NhZ2UgPSAiJyIgKyBmdW5jbmFtZSArICInIG5vdCBpbXBsZW1lbnRlZCI7CisJaWYgKGV4dHJhICE9IG51bGwpIHsKKwkJbWVzc2FnZSArPSAiICIgKyBleHRyYTsKKwl9CisJZG9qby5yYWlzZShtZXNzYWdlKTsKK307Citkb2pvLmRlcHJlY2F0ZWQgPSBmdW5jdGlvbiAoYmVoYXZpb3VyLCBleHRyYSwgcmVtb3ZhbCkgeworCXZhciBtZXNzYWdlID0gIkRFUFJFQ0FURUQ6ICIgKyBiZWhhdmlvdXI7CisJaWYgKGV4dHJhKSB7CisJCW1lc3NhZ2UgKz0gIiAiICsgZXh0cmE7CisJfQorCWlmIChyZW1vdmFsKSB7CisJCW1lc3NhZ2UgKz0gIiAtLSB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbjogIiArIHJlbW92YWw7CisJfQorCWRvam8uZGVidWcobWVzc2FnZSk7Cit9OworZG9qby5yZW5kZXIgPSAoZnVuY3Rpb24gKCkgeworCWZ1bmN0aW9uIHZzY2FmZm9sZChwcmVmcywgbmFtZXMpIHsKKwkJdmFyIHRtcCA9IHtjYXBhYmxlOmZhbHNlLCBzdXBwb3J0OntidWlsdGluOmZhbHNlLCBwbHVnaW46ZmFsc2V9LCBwcmVmaXhlczpwcmVmc307CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCXRtcFtuYW1lc1tpXV0gPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4ge25hbWU6IiIsIHZlcjpkb2pvLnZlcnNpb24sIG9zOnt3aW46ZmFsc2UsIGxpbnV4OmZhbHNlLCBvc3g6ZmFsc2V9LCBodG1sOnZzY2FmZm9sZChbImh0bWwiXSwgWyJpZSIsICJvcGVyYSIsICJraHRtbCIsICJzYWZhcmkiLCAibW96Il0pLCBzdmc6dnNjYWZmb2xkKFsic3ZnIl0sIFsiY29yZWwiLCAiYWRvYmUiLCAiYmF0aWsiXSksIHZtbDp2c2NhZmZvbGQoWyJ2bWwiXSwgWyJpZSJdKSwgc3dmOnZzY2FmZm9sZChbIlN3ZiIsICJGbGFzaCIsICJNbSJdLCBbIm1tIl0pLCBzd3Q6dnNjYWZmb2xkKFsiU3d0Il0sIFsiaWJtIl0pfTsKK30pKCk7Citkb2pvLmhvc3RlbnYgPSAoZnVuY3Rpb24gKCkgeworCXZhciBjb25maWcgPSB7aXNEZWJ1ZzpmYWxzZSwgYWxsb3dRdWVyeUNvbmZpZzpmYWxzZSwgYmFzZVNjcmlwdFVyaToiIiwgYmFzZVJlbGF0aXZlUGF0aDoiIiwgbGlicmFyeVNjcmlwdFVyaToiIiwgaWVQcmV2ZW50Q2xvYmJlcjpmYWxzZSwgaWVDbG9iYmVyTWluaW1hbDp0cnVlLCBwcmV2ZW50QmFja0J1dHRvbkZpeDp0cnVlLCBkZWxheU1vekxvYWRpbmdGaXg6ZmFsc2UsIHNlYXJjaElkczpbXSwgcGFyc2VXaWRnZXRzOnRydWV9OworCWlmICh0eXBlb2YgZGpDb25maWcgPT0gInVuZGVmaW5lZCIpIHsKKwkJZGpDb25maWcgPSBjb25maWc7CisJfSBlbHNlIHsKKwkJZm9yICh2YXIgb3B0aW9uIGluIGNvbmZpZykgeworCQkJaWYgKHR5cGVvZiBkakNvbmZpZ1tvcHRpb25dID09ICJ1bmRlZmluZWQiKSB7CisJCQkJZGpDb25maWdbb3B0aW9uXSA9IGNvbmZpZ1tvcHRpb25dOworCQkJfQorCQl9CisJfQorCXJldHVybiB7bmFtZV86Iih1bnNldCkiLCB2ZXJzaW9uXzoiKHVuc2V0KSIsIGdldE5hbWU6ZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lXzsKKwl9LCBnZXRWZXJzaW9uOmZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMudmVyc2lvbl87CisJfSwgZ2V0VGV4dDpmdW5jdGlvbiAodXJpKSB7CisJCWRvam8udW5pbXBsZW1lbnRlZCgiZ2V0VGV4dCIsICJ1cmk9IiArIHVyaSk7CisJfX07Cit9KSgpOworZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkgPSBmdW5jdGlvbiAoKSB7CisJaWYgKGRqQ29uZmlnLmJhc2VTY3JpcHRVcmkubGVuZ3RoKSB7CisJCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOworCX0KKwl2YXIgdXJpID0gbmV3IFN0cmluZyhkakNvbmZpZy5saWJyYXJ5U2NyaXB0VXJpIHx8IGRqQ29uZmlnLmJhc2VSZWxhdGl2ZVBhdGgpOworCWlmICghdXJpKSB7CisJCWRvam8ucmFpc2UoIk5vdGhpbmcgcmV0dXJuZWQgYnkgZ2V0TGlicmFyeVNjcmlwdFVyaSgpOiAiICsgdXJpKTsKKwl9CisJdmFyIGxhc3RzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZigiLyIpOworCWRqQ29uZmlnLmJhc2VTY3JpcHRVcmkgPSBkakNvbmZpZy5iYXNlUmVsYXRpdmVQYXRoOworCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Jvb3RzdHJhcDIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYm9vdHN0cmFwMi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ4MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Jvb3RzdHJhcDIuanMKQEAgLTAsMCArMSw1OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworLy9TZW1pY29sb24gaXMgZm9yIHdoZW4gdGhpcyBmaWxlIGlzIGludGVncmF0ZWQgd2l0aCBhIGN1c3RvbSBidWlsZCBvbiBvbmUgbGluZQorLy93aXRoIHNvbWUgb3RoZXIgZmlsZSdzIGNvbnRlbnRzLiBTb21ldGltZXMgdGhhdCBtYWtlcyB0aGluZ3Mgbm90IGdldCBkZWZpbmVkCisvL3Byb3Blcmx5LCBwYXJ0aWN1bGFybHkgd2l0aCB0aGUgdXNpbmcgdGhlIGNsb3N1cmUgYmVsb3cgdG8gZG8gYWxsIHRoZSB3b3JrLgorOyhmdW5jdGlvbigpeworCS8vRG9uJ3QgZG8gdGhpcyB3b3JrIGlmIGRvam8uanMgaGFzIGFscmVhZHkgZG9uZSBpdC4KKwlpZih0eXBlb2YgZGpfdXNpbmdCb290c3RyYXAgIT0gInVuZGVmaW5lZCIpeworCQlyZXR1cm47CisJfQorCisJdmFyIGlzUmhpbm8gPSBmYWxzZTsKKwl2YXIgaXNTcGlkZXJtb25rZXkgPSBmYWxzZTsKKwl2YXIgaXNEYXNoYm9hcmQgPSBmYWxzZTsKKwlpZigodHlwZW9mIHRoaXNbImxvYWQiXSA9PSAiZnVuY3Rpb24iKSYmKCh0eXBlb2YgdGhpc1siUGFja2FnZXMiXSA9PSAiZnVuY3Rpb24iKXx8KHR5cGVvZiB0aGlzWyJQYWNrYWdlcyJdID09ICJvYmplY3QiKSkpeworCQlpc1JoaW5vID0gdHJ1ZTsKKwl9ZWxzZSBpZih0eXBlb2YgdGhpc1sibG9hZCJdID09ICJmdW5jdGlvbiIpeworCQlpc1NwaWRlcm1vbmtleSAgPSB0cnVlOworCX1lbHNlIGlmKHdpbmRvdy53aWRnZXQpeworCQlpc0Rhc2hib2FyZCA9IHRydWU7CisJfQorCisJdmFyIHRtcHMgPSBbXTsKKwlpZigodGhpc1siZGpDb25maWciXSkmJigoZGpDb25maWdbImlzRGVidWciXSl8fChkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0pKSl7CisJCXRtcHMucHVzaCgiZGVidWcuanMiKTsKKwl9CisKKwlpZigodGhpc1siZGpDb25maWciXSkmJihkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0pJiYoIWlzUmhpbm8pJiYoIWlzRGFzaGJvYXJkKSl7CisJCXRtcHMucHVzaCgiYnJvd3Nlcl9kZWJ1Zy5qcyIpOworCX0KKworCXZhciBsb2FkZXJSb290ID0gZGpDb25maWdbImJhc2VTY3JpcHRVcmkiXTsKKwlpZigodGhpc1siZGpDb25maWciXSkmJihkakNvbmZpZ1siYmFzZUxvYWRlclVyaSJdKSl7CisJCWxvYWRlclJvb3QgPSBkakNvbmZpZ1siYmFzZUxvYWRlclVyaSJdOworCX0KKworCWZvcih2YXIgeD0wOyB4IDwgdG1wcy5sZW5ndGg7IHgrKyl7CisJCXZhciBzcGF0aCA9IGxvYWRlclJvb3QrInNyYy8iK3RtcHNbeF07CisJCWlmKGlzUmhpbm98fGlzU3BpZGVybW9ua2V5KXsKKwkJCWxvYWQoc3BhdGgpOworCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlkb2N1bWVudC53cml0ZSgiPHNjciIrImlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nIitzcGF0aCsiJz48L3NjciIrImlwdD4iKTsKKwkJCX0gY2F0Y2ggKGUpIHsKKwkJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisJCQkJc2NyaXB0LnNyYyA9IHNwYXRoOworCQkJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKwkJCX0KKwkJfQorCX0KK30pKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYnJvd3Nlcl9kZWJ1Zy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9icm93c2VyX2RlYnVnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZmIwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvYnJvd3Nlcl9kZWJ1Zy5qcwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5icm93c2VyX2RlYnVnIik7Citkb2pvLmhvc3RlbnYubG9hZGVkVXJpcy5wdXNoKCIuLi9zcmMvYm9vdHN0cmFwMS5qcyIpOworZG9qby5ob3N0ZW52LmxvYWRlZFVyaXMucHVzaCgiLi4vc3JjL2xvYWRlci5qcyIpOworZG9qby5ob3N0ZW52LmxvYWRlZFVyaXMucHVzaCgiLi4vc3JjL2hvc3RlbnZfYnJvd3Nlci5qcyIpOworZG9qby5ob3N0ZW52Ll9sb2FkZWRVcmlzTGlzdFN0YXJ0ID0gZG9qby5ob3N0ZW52LmxvYWRlZFVyaXMubGVuZ3RoOworZnVuY3Rpb24gcmVtb3ZlQ29tbWVudHMoY29udGVudHMpIHsKKwljb250ZW50cyA9IG5ldyBTdHJpbmcoKCFjb250ZW50cykgPyAiIiA6IGNvbnRlbnRzKTsKKwljb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL14oLio/KVwvXC8oLiopJC9tZywgIiQxIik7CisJY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlKC8oXG4pL21nLCAiX19ET0pPTkVXTElORSIpOworCWNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZSgvXC9cKiguKj8pXCpcLy9nLCAiIik7CisJcmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoL19fRE9KT05FV0xJTkUvbWcsICJcbiIpOworfQorZG9qby5ob3N0ZW52LmdldFJlcXVpcmVzQW5kUHJvdmlkZXMgPSBmdW5jdGlvbiAoY29udGVudHMpIHsKKwlpZiAoIWNvbnRlbnRzKSB7CisJCXJldHVybiBbXTsKKwl9CisJdmFyIGRlcHMgPSBbXTsKKwl2YXIgdG1wOworCVJlZ0V4cC5sYXN0SW5kZXggPSAwOworCXZhciB0ZXN0RXhwID0gL2Rvam8uKGhvc3RlbnYubG9hZE1vZHVsZXxob3N0ZW52LnJlcXVpcmV8cmVxdWlyZXxyZXF1aXJlSWZ8a3dDb21wb3VuZFJlcXVpcmV8aG9zdGVudi5jb25kaXRpb25hbExvYWRNb2R1bGV8aG9zdGVudi5zdGFydFBhY2thZ2V8cHJvdmlkZSlcKFtcd1xXXSo/XCkvbWc7CisJd2hpbGUgKCh0bXAgPSB0ZXN0RXhwLmV4ZWMoY29udGVudHMpKSAhPSBudWxsKSB7CisJCWRlcHMucHVzaCh0bXBbMF0pOworCX0KKwlyZXR1cm4gZGVwczsKK307Citkb2pvLmhvc3RlbnYuZ2V0RGVsYXlSZXF1aXJlc0FuZFByb3ZpZGVzID0gZnVuY3Rpb24gKGNvbnRlbnRzKSB7CisJaWYgKCFjb250ZW50cykgeworCQlyZXR1cm4gW107CisJfQorCXZhciBkZXBzID0gW107CisJdmFyIHRtcDsKKwlSZWdFeHAubGFzdEluZGV4ID0gMDsKKwl2YXIgdGVzdEV4cCA9IC9kb2pvLihyZXF1aXJlQWZ0ZXJJZilcKFtcd1xXXSo/XCkvbWc7CisJd2hpbGUgKCh0bXAgPSB0ZXN0RXhwLmV4ZWMoY29udGVudHMpKSAhPSBudWxsKSB7CisJCWRlcHMucHVzaCh0bXBbMF0pOworCX0KKwlyZXR1cm4gZGVwczsKK307Citkb2pvLmNsb2JiZXJMYXN0T2JqZWN0ID0gZnVuY3Rpb24gKG9ianBhdGgpIHsKKwlpZiAob2JqcGF0aC5pbmRleE9mKCIuIikgPT0gLTEpIHsKKwkJaWYgKCFkal91bmRlZihvYmpwYXRoLCBkal9nbG9iYWwpKSB7CisJCQlkZWxldGUgZGpfZ2xvYmFsW29ianBhdGhdOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwl2YXIgc3ltcyA9IG9ianBhdGguc3BsaXQoL1wuLyk7CisJdmFyIGJhc2UgPSBkb2pvLmV2YWxPYmpQYXRoKHN5bXMuc2xpY2UoMCwgLTEpLmpvaW4oIi4iKSwgZmFsc2UpOworCXZhciBjaGlsZCA9IHN5bXNbc3ltcy5sZW5ndGggLSAxXTsKKwlpZiAoIWRqX3VuZGVmKGNoaWxkLCBiYXNlKSkgeworCQlkZWxldGUgYmFzZVtjaGlsZF07CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9OwordmFyIHJlbW92YWxzID0gW107CitmdW5jdGlvbiB6aXAoYXJyKSB7CisJdmFyIHJldCA9IFtdOworCXZhciBzZWVuID0ge307CisJZm9yICh2YXIgeCA9IDA7IHggPCBhcnIubGVuZ3RoOyB4KyspIHsKKwkJaWYgKCFzZWVuW2Fyclt4XV0pIHsKKwkJCXJldC5wdXNoKGFyclt4XSk7CisJCQlzZWVuW2Fyclt4XV0gPSB0cnVlOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9Cit2YXIgb2xkX2RqX2V2YWwgPSBkal9ldmFsOworZGpfZXZhbCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLmhvc3RlbnYub2xkTG9hZFVyaSA9IGRvam8uaG9zdGVudi5sb2FkVXJpOworZG9qby5ob3N0ZW52LmxvYWRVcmkgPSBmdW5jdGlvbiAodXJpLCBjYikgeworCWlmIChkb2pvLmhvc3RlbnYubG9hZGVkVXJpc1t1cmldKSB7CisJCXJldHVybiB0cnVlOworCX0KKwl0cnkgeworCQl2YXIgdGV4dCA9IHRoaXMuZ2V0VGV4dCh1cmksIG51bGwsIHRydWUpOworCQlpZiAoIXRleHQpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2IpIHsKKwkJCXZhciBleHByID0gb2xkX2RqX2V2YWwoIigiICsgdGV4dCArICIpIik7CisJCQljYihleHByKTsKKwkJfSBlbHNlIHsKKwkJCXZhciByZXF1aXJlcyA9IGRvam8uaG9zdGVudi5nZXRSZXF1aXJlc0FuZFByb3ZpZGVzKHRleHQpOworCQkJZXZhbChyZXF1aXJlcy5qb2luKCI7IikpOworCQkJZG9qby5ob3N0ZW52LmxvYWRlZFVyaXMucHVzaCh1cmkpOworCQkJZG9qby5ob3N0ZW52LmxvYWRlZFVyaXNbdXJpXSA9IHRydWU7CisJCQl2YXIgZGVsYXlSZXF1aXJlcyA9IGRvam8uaG9zdGVudi5nZXREZWxheVJlcXVpcmVzQW5kUHJvdmlkZXModGV4dCk7CisJCQlldmFsKGRlbGF5UmVxdWlyZXMuam9pbigiOyIpKTsKKwkJfQorCX0KKwljYXRjaCAoZSkgeworCQlhbGVydChlKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5ob3N0ZW52Ll93cml0dGVuSW5jbHVkZXMgPSB7fTsKK2Rvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzID0gZnVuY3Rpb24gKHdpbGxDYWxsQWdhaW4pIHsKKwlmb3IgKHZhciB4ID0gcmVtb3ZhbHMubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsKKwkJZG9qby5jbG9iYmVyTGFzdE9iamVjdChyZW1vdmFsc1t4XSk7CisJfQorCXZhciBkZXBMaXN0ID0gW107CisJdmFyIHNlZW4gPSBkb2pvLmhvc3RlbnYuX3dyaXR0ZW5JbmNsdWRlczsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGRvam8uaG9zdGVudi5sb2FkZWRVcmlzLmxlbmd0aDsgeCsrKSB7CisJCXZhciBjdXJpID0gZG9qby5ob3N0ZW52LmxvYWRlZFVyaXNbeF07CisJCWlmICghc2VlbltjdXJpXSkgeworCQkJc2VlbltjdXJpXSA9IHRydWU7CisJCQlkZXBMaXN0LnB1c2goY3VyaSk7CisJCX0KKwl9CisJZG9qby5ob3N0ZW52Ll9nbG9iYWxfb21pdF9tb2R1bGVfY2hlY2sgPSB0cnVlOworCWZvciAodmFyIHggPSBkb2pvLmhvc3RlbnYuX2xvYWRlZFVyaXNMaXN0U3RhcnQ7IHggPCBkZXBMaXN0Lmxlbmd0aDsgeCsrKSB7CisJCWRvY3VtZW50LndyaXRlKCI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSciICsgZGVwTGlzdFt4XSArICInPjwvc2NyaXB0PiIpOworCX0KKwlkb2N1bWVudC53cml0ZSgiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPmRvam8uaG9zdGVudi5fZ2xvYmFsX29taXRfbW9kdWxlX2NoZWNrID0gZmFsc2U7PC9zY3JpcHQ+Iik7CisJZG9qby5ob3N0ZW52Ll9sb2FkZWRVcmlzTGlzdFN0YXJ0ID0gMDsKKwlpZiAoIXdpbGxDYWxsQWdhaW4pIHsKKwkJZGpfZXZhbCA9IG9sZF9kal9ldmFsOworCQlkb2pvLmhvc3RlbnYubG9hZFVyaSA9IGRvam8uaG9zdGVudi5vbGRMb2FkVXJpOworCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9icm93c2VyX2RlYnVnX3hkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Jyb3dzZXJfZGVidWdfeGQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzYjAwNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9icm93c2VyX2RlYnVnX3hkLmpzCkBAIC0wLDAgKzEsMzggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uYnJvd3Nlcl9kZWJ1Z194ZCIpOworZG9qby5ub25EZWJ1Z1Byb3ZpZGUgPSBkb2pvLnByb3ZpZGU7Citkb2pvLnByb3ZpZGUgPSBmdW5jdGlvbiAocmVzb3VyY2VOYW1lKSB7CisJdmFyIGRiZ1F1ZXVlID0gZG9qby5ob3N0ZW52WyJ4ZERlYnVnUXVldWUiXTsKKwlpZiAoZGJnUXVldWUgJiYgZGJnUXVldWUubGVuZ3RoID4gMCAmJiByZXNvdXJjZU5hbWUgPT0gZGJnUXVldWVbImN1cnJlbnRSZXNvdXJjZU5hbWUiXSkgeworCQl3aW5kb3cuc2V0VGltZW91dCgiZG9qby5ob3N0ZW52LnhkRGVidWdGaWxlTG9hZGVkKCciICsgcmVzb3VyY2VOYW1lICsgIicpIiwgMSk7CisJfQorCWRvam8ubm9uRGVidWdQcm92aWRlLmFwcGx5KGRvam8sIGFyZ3VtZW50cyk7Cit9OworZG9qby5ob3N0ZW52LnhkRGVidWdGaWxlTG9hZGVkID0gZnVuY3Rpb24gKHJlc291cmNlTmFtZSkgeworCXZhciBkYmdRdWV1ZSA9IHRoaXMueGREZWJ1Z1F1ZXVlOworCWlmIChyZXNvdXJjZU5hbWUgJiYgcmVzb3VyY2VOYW1lID09IGRiZ1F1ZXVlLmN1cnJlbnRSZXNvdXJjZU5hbWUpIHsKKwkJZGJnUXVldWUuc2hpZnQoKTsKKwl9CisJaWYgKGRiZ1F1ZXVlLmxlbmd0aCA9PSAwKSB7CisJCWRiZ1F1ZXVlLmN1cnJlbnRSZXNvdXJjZU5hbWUgPSBudWxsOworCQl0aGlzLnhkTm90aWZ5TG9hZGVkKCk7CisJfSBlbHNlIHsKKwkJZGJnUXVldWUuY3VycmVudFJlc291cmNlTmFtZSA9IGRiZ1F1ZXVlWzBdLnJlc291cmNlTmFtZTsKKwkJdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKwkJZWxlbWVudC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJCWVsZW1lbnQuc3JjID0gZGJnUXVldWVbMF0ucmVzb3VyY2VQYXRoOworCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGVsZW1lbnQpOworCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jYWwvaUNhbGVuZGFyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NhbC9pQ2FsZW5kYXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyZDRkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jYWwvaUNhbGVuZGFyLmpzCkBAIC0wLDAgKzEsNTY3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNhbC5pQ2FsZW5kYXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNhbC50ZXh0RGlyZWN0b3J5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLnNlcmlhbGl6ZSIpOworZG9qby5jYWwuaUNhbGVuZGFyLmZyb21UZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsKKwl2YXIgcHJvcGVydGllcyA9IGRvam8uY2FsLnRleHREaXJlY3RvcnkudG9rZW5pc2UodGV4dCk7CisJdmFyIGNhbGVuZGFycyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBiZWd1biA9IGZhbHNlOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgeworCQl2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07CisJCWlmICghYmVndW4pIHsKKwkJCWlmIChwcm9wLm5hbWUgPT0gIkJFR0lOIiAmJiBwcm9wLnZhbHVlID09ICJWQ0FMRU5EQVIiKSB7CisJCQkJYmVndW4gPSB0cnVlOworCQkJCXZhciBjYWxib2R5ID0gW107CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocHJvcC5uYW1lID09ICJFTkQiICYmIHByb3AudmFsdWUgPT0gIlZDQUxFTkRBUiIpIHsKKwkJCQljYWxlbmRhcnMucHVzaChuZXcgZG9qby5jYWwuaUNhbGVuZGFyLlZDYWxlbmRhcihjYWxib2R5KSk7CisJCQkJYmVndW4gPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJY2FsYm9keS5wdXNoKHByb3ApOworCQkJfQorCQl9CisJfQorCXJldHVybiBjYWxlbmRhcnM7Cit9OworZG9qby5jYWwuaUNhbGVuZGFyLkNvbXBvbmVudCA9IGZ1bmN0aW9uIChib2R5KSB7CisJaWYgKCF0aGlzLm5hbWUpIHsKKwkJdGhpcy5uYW1lID0gIkNPTVBPTkVOVCI7CisJfQorCXRoaXMucHJvcGVydGllcyA9IFtdOworCXRoaXMuY29tcG9uZW50cyA9IFtdOworCWlmIChib2R5KSB7CisJCWZvciAodmFyIGkgPSAwLCBjb250ZXh0ID0gIiI7IGkgPCBib2R5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoY29udGV4dCA9PSAiIikgeworCQkJCWlmIChib2R5W2ldLm5hbWUgPT0gIkJFR0lOIikgeworCQkJCQljb250ZXh0ID0gYm9keVtpXS52YWx1ZTsKKwkJCQkJdmFyIGNoaWxkcHJvcHMgPSBbXTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmFkZFByb3BlcnR5KG5ldyBkb2pvLmNhbC5pQ2FsZW5kYXIuUHJvcGVydHkoYm9keVtpXSkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJvZHlbaV0ubmFtZSA9PSAiRU5EIiAmJiBib2R5W2ldLnZhbHVlID09IGNvbnRleHQpIHsKKwkJCQkJaWYgKGNvbnRleHQgPT0gIlZFVkVOVCIpIHsKKwkJCQkJCXRoaXMuYWRkQ29tcG9uZW50KG5ldyBkb2pvLmNhbC5pQ2FsZW5kYXIuVkV2ZW50KGNoaWxkcHJvcHMpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjb250ZXh0ID09ICJWVElNRVpPTkUiKSB7CisJCQkJCQkJdGhpcy5hZGRDb21wb25lbnQobmV3IGRvam8uY2FsLmlDYWxlbmRhci5WVGltZVpvbmUoY2hpbGRwcm9wcykpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoY29udGV4dCA9PSAiVlRPRE8iKSB7CisJCQkJCQkJCXRoaXMuYWRkQ29tcG9uZW50KG5ldyBkb2pvLmNhbC5pQ2FsZW5kYXIuVlRvZG8oY2hpbGRwcm9wcykpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmIChjb250ZXh0ID09ICJWSk9VUk5BTCIpIHsKKwkJCQkJCQkJCXRoaXMuYWRkQ29tcG9uZW50KG5ldyBkb2pvLmNhbC5pQ2FsZW5kYXIuVkpvdXJuYWwoY2hpbGRwcm9wcykpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaWYgKGNvbnRleHQgPT0gIlZGUkVFQlVTWSIpIHsKKwkJCQkJCQkJCQl0aGlzLmFkZENvbXBvbmVudChuZXcgZG9qby5jYWwuaUNhbGVuZGFyLlZGcmVlQnVzeShjaGlsZHByb3BzKSk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWlmIChjb250ZXh0ID09ICJTVEFOREFSRCIpIHsKKwkJCQkJCQkJCQkJdGhpcy5hZGRDb21wb25lbnQobmV3IGRvam8uY2FsLmlDYWxlbmRhci5TdGFuZGFyZChjaGlsZHByb3BzKSk7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJaWYgKGNvbnRleHQgPT0gIkRBWUxJR0hUIikgeworCQkJCQkJCQkJCQkJdGhpcy5hZGRDb21wb25lbnQobmV3IGRvam8uY2FsLmlDYWxlbmRhci5EYXlsaWdodChjaGlsZHByb3BzKSk7CisJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQlpZiAoY29udGV4dCA9PSAiVkFMQVJNIikgeworCQkJCQkJCQkJCQkJCXRoaXMuYWRkQ29tcG9uZW50KG5ldyBkb2pvLmNhbC5pQ2FsZW5kYXIuVkFsYXJtKGNoaWxkcHJvcHMpKTsKKwkJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmNhbC5pQ2FsZW5kYXIuIiArIGNvbnRleHQpOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWNvbnRleHQgPSAiIjsKKwkJCQl9IGVsc2UgeworCQkJCQljaGlsZHByb3BzLnB1c2goYm9keVtpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh0aGlzLl9WYWxpZFByb3BlcnRpZXMpIHsKKwkJCXRoaXMucG9zdENyZWF0ZSgpOworCQl9CisJfQorfTsKK2Rvam8uZXh0ZW5kKGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQsIHthZGRQcm9wZXJ0eTpmdW5jdGlvbiAocHJvcCkgeworCXRoaXMucHJvcGVydGllcy5wdXNoKHByb3ApOworCXRoaXNbcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCldID0gcHJvcDsKK30sIGFkZENvbXBvbmVudDpmdW5jdGlvbiAocHJvcCkgeworCXRoaXMuY29tcG9uZW50cy5wdXNoKHByb3ApOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLl9WYWxpZFByb3BlcnRpZXMubGVuZ3RoOyB4KyspIHsKKwkJdmFyIGV2dFByb3BlcnR5ID0gdGhpcy5fVmFsaWRQcm9wZXJ0aWVzW3hdOworCQl2YXIgZm91bmQgPSBmYWxzZTsKKwkJZm9yICh2YXIgeSA9IDA7IHkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyB5KyspIHsKKwkJCXZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW3ldOworCQkJdmFyIHByb3BOYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCk7CisJCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkoZXZ0UHJvcGVydHkpKSB7CisJCQkJdmFyIGFscmVhZHlTZXQgPSBmYWxzZTsKKwkJCQlmb3IgKHZhciB6ID0gMDsgeiA8IGV2dFByb3BlcnR5Lmxlbmd0aDsgeisrKSB7CisJCQkJCXZhciBldnRQcm9wZXJ0eU5hbWUgPSBldnRQcm9wZXJ0eVt6XS5uYW1lLnRvTG93ZXJDYXNlKCk7CisJCQkJCWlmICgodGhpc1tldnRQcm9wZXJ0eU5hbWVdKSAmJiAoZXZ0UHJvcGVydHlOYW1lICE9IHByb3BOYW1lKSkgeworCQkJCQkJYWxyZWFkeVNldCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFhbHJlYWR5U2V0KSB7CisJCQkJCXRoaXNbcHJvcE5hbWVdID0gcHJvcDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChwcm9wTmFtZSA9PSBldnRQcm9wZXJ0eS5uYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJCQlpZiAoZXZ0UHJvcGVydHkub2NjdXJhbmNlID09IDEpIHsKKwkJCQkJCXRoaXNbcHJvcE5hbWVdID0gcHJvcDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWlmICghZG9qby5sYW5nLmlzQXJyYXkodGhpc1twcm9wTmFtZV0pKSB7CisJCQkJCQkJdGhpc1twcm9wTmFtZV0gPSBbXTsKKwkJCQkJCX0KKwkJCQkJCXRoaXNbcHJvcE5hbWVdLnB1c2gocHJvcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGV2dFByb3BlcnR5LnJlcXVpcmVkICYmICFmb3VuZCkgeworCQkJZG9qby5kZWJ1ZygiaUNhbGVuZGFyIC0gIiArIHRoaXMubmFtZSArICI6IFJlcXVpcmVkIFByb3BlcnR5IG5vdCBmb3VuZDogIiArIGV2dFByb3BlcnR5Lm5hbWUpOworCQl9CisJfQorCWlmIChkb2pvLmxhbmcuaXNBcnJheSh0aGlzLnJydWxlKSkgeworCQlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMucnJ1bGUubGVuZ3RoOyB4KyspIHsKKwkJCXZhciBydWxlID0gdGhpcy5ycnVsZVt4XS52YWx1ZTsKKwkJCXRoaXMucnJ1bGVbeF0uY2FjaGUgPSBmdW5jdGlvbiAoKSB7CisJCQl9OworCQkJdmFyIHRlbXAgPSBydWxlLnNwbGl0KCI7Iik7CisJCQlmb3IgKHZhciB5ID0gMDsgeSA8IHRlbXAubGVuZ3RoOyB5KyspIHsKKwkJCQl2YXIgcGFpciA9IHRlbXBbeV0uc3BsaXQoIj0iKTsKKwkJCQl2YXIga2V5ID0gcGFpclswXS50b0xvd2VyQ2FzZSgpOworCQkJCXZhciB2YWwgPSBwYWlyWzFdOworCQkJCWlmICgoa2V5ID09ICJmcmVxIikgfHwgKGtleSA9PSAiaW50ZXJ2YWwiKSB8fCAoa2V5ID09ICJ1bnRpbCIpKSB7CisJCQkJCXRoaXMucnJ1bGVbeF1ba2V5XSA9IHZhbDsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgdmFsQXJyYXkgPSB2YWwuc3BsaXQoIiwiKTsKKwkJCQkJdGhpcy5ycnVsZVt4XVtrZXldID0gdmFsQXJyYXk7CisJCQkJfQorCQkJfQorCQl9CisJCXRoaXMucmVjdXJyaW5nID0gdHJ1ZTsKKwl9Cit9LCB0b1N0cmluZzpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICJbaUNhbGVuZGFyLkNvbXBvbmVudDsgIiArIHRoaXMubmFtZSArICIsICIgKyB0aGlzLnByb3BlcnRpZXMubGVuZ3RoICsgIiBwcm9wZXJ0aWVzLCAiICsgdGhpcy5jb21wb25lbnRzLmxlbmd0aCArICIgY29tcG9uZW50c10iOworfX0pOworZG9qby5jYWwuaUNhbGVuZGFyLlByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3ApIHsKKwl0aGlzLm5hbWUgPSBwcm9wLm5hbWU7CisJdGhpcy5ncm91cCA9IHByb3AuZ3JvdXA7CisJdGhpcy5wYXJhbXMgPSBwcm9wLnBhcmFtczsKKwl0aGlzLnZhbHVlID0gcHJvcC52YWx1ZTsKK307Citkb2pvLmV4dGVuZChkb2pvLmNhbC5pQ2FsZW5kYXIuUHJvcGVydHksIHt0b1N0cmluZzpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICJbaUNhbGVuZGF5LlByb3BlcnR5OyAiICsgdGhpcy5uYW1lICsgIjogIiArIHRoaXMudmFsdWUgKyAiXSI7Cit9fSk7Cit2YXIgX1AgPSBmdW5jdGlvbiAobiwgb2MsIHJlcSkgeworCXJldHVybiB7bmFtZTpuLCByZXF1aXJlZDoocmVxKSA/IHRydWUgOiBmYWxzZSwgb2NjdXJhbmNlOihvYyA9PSAiKiIgfHwgIW9jKSA/IC0xIDogb2N9OworfTsKK2Rvam8uY2FsLmlDYWxlbmRhci5WQ2FsZW5kYXIgPSBmdW5jdGlvbiAoY2FsYm9keSkgeworCXRoaXMubmFtZSA9ICJWQ0FMRU5EQVIiOworCXRoaXMucmVjdXJyaW5nID0gW107CisJdGhpcy5ub25SZWN1cnJpbmdFdmVudHMgPSBmdW5jdGlvbiAoKSB7CisJfTsKKwlkb2pvLmNhbC5pQ2FsZW5kYXIuQ29tcG9uZW50LmNhbGwodGhpcywgY2FsYm9keSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmNhbC5pQ2FsZW5kYXIuVkNhbGVuZGFyLCBkb2pvLmNhbC5pQ2FsZW5kYXIuQ29tcG9uZW50KTsKK2Rvam8uZXh0ZW5kKGRvam8uY2FsLmlDYWxlbmRhci5WQ2FsZW5kYXIsIHthZGRDb21wb25lbnQ6ZnVuY3Rpb24gKHByb3ApIHsKKwl0aGlzLmNvbXBvbmVudHMucHVzaChwcm9wKTsKKwlpZiAocHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkgPT0gInZldmVudCIpIHsKKwkJaWYgKHByb3AucnJ1bGUpIHsKKwkJCXRoaXMucmVjdXJyaW5nLnB1c2gocHJvcCk7CisJCX0gZWxzZSB7CisJCQl2YXIgc3RhcnREYXRlID0gcHJvcC5nZXREYXRlKCk7CisJCQl2YXIgbW9udGggPSBzdGFydERhdGUuZ2V0TW9udGgoKSArIDE7CisJCQl2YXIgZGF0ZVN0cmluZyA9IG1vbnRoICsgIi0iICsgc3RhcnREYXRlLmdldERhdGUoKSArICItIiArIHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpOworCQkJaWYgKCFkb2pvLmxhbmcuaXNBcnJheSh0aGlzW2RhdGVTdHJpbmddKSkgeworCQkJCXRoaXMubm9uUmVjdXJyaW5nRXZlbnRzW2RhdGVTdHJpbmddID0gW107CisJCQl9CisJCQl0aGlzLm5vblJlY3VycmluZ0V2ZW50c1tkYXRlU3RyaW5nXS5wdXNoKHByb3ApOworCQl9CisJfQorfSwgcHJlQ29tcHV0ZVJlY3VycmluZ0V2ZW50czpmdW5jdGlvbiAodW50aWwpIHsKKwl2YXIgY2FsY3VsYXRlZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHsKKwl9OworCWZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5yZWN1cnJpbmcubGVuZ3RoOyB4KyspIHsKKwkJdmFyIGRhdGVzID0gdGhpcy5yZWN1cnJpbmdbeF0uZ2V0RGF0ZXModW50aWwpOworCQlmb3IgKHZhciB5ID0gMDsgeSA8IGRhdGVzLmxlbmd0aDsgeSsrKSB7CisJCQl2YXIgbW9udGggPSBkYXRlc1t5XS5nZXRNb250aCgpICsgMTsKKwkJCXZhciBkYXRlU3RyID0gbW9udGggKyAiLSIgKyBkYXRlc1t5XS5nZXREYXRlKCkgKyAiLSIgKyBkYXRlc1t5XS5nZXRGdWxsWWVhcigpOworCQkJaWYgKCFkb2pvLmxhbmcuaXNBcnJheShjYWxjdWxhdGVkRXZlbnRzW2RhdGVTdHJdKSkgeworCQkJCWNhbGN1bGF0ZWRFdmVudHNbZGF0ZVN0cl0gPSBbXTsKKwkJCX0KKwkJCWlmICghZG9qby5sYW5nLmluQXJyYXkoY2FsY3VsYXRlZEV2ZW50c1tkYXRlU3RyXSwgdGhpcy5yZWN1cnJpbmdbeF0pKSB7CisJCQkJY2FsY3VsYXRlZEV2ZW50c1tkYXRlU3RyXS5wdXNoKHRoaXMucmVjdXJyaW5nW3hdKTsKKwkJCX0KKwkJfQorCX0KKwl0aGlzLnJlY3VycmluZ0V2ZW50cyA9IGNhbGN1bGF0ZWRFdmVudHM7Cit9LCBnZXRFdmVudHM6ZnVuY3Rpb24gKGRhdGUpIHsKKwl2YXIgZXZlbnRzID0gW107CisJdmFyIHJlY3VyID0gW107CisJdmFyIG5vblJlY3VyID0gW107CisJdmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTsKKwl2YXIgZGF0ZVN0ciA9IG1vbnRoICsgIi0iICsgZGF0ZS5nZXREYXRlKCkgKyAiLSIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KHRoaXMubm9uUmVjdXJyaW5nRXZlbnRzW2RhdGVTdHJdKSkgeworCQlub25SZWN1ciA9IHRoaXMubm9uUmVjdXJyaW5nRXZlbnRzW2RhdGVTdHJdOworCQlkb2pvLmRlYnVnKCJOdW1iZXIgb2Ygbm9uUmVjdXJyaW5nIEV2ZW50czogIiArIG5vblJlY3VyLmxlbmd0aCk7CisJfQorCWlmIChkb2pvLmxhbmcuaXNBcnJheSh0aGlzLnJlY3VycmluZ0V2ZW50c1tkYXRlU3RyXSkpIHsKKwkJcmVjdXIgPSB0aGlzLnJlY3VycmluZ0V2ZW50c1tkYXRlU3RyXTsKKwl9CisJZXZlbnRzID0gcmVjdXIuY29uY2F0KG5vblJlY3VyKTsKKwlpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHsKKwkJcmV0dXJuIGV2ZW50czsKKwl9CisJcmV0dXJuIG51bGw7Cit9fSk7Cit2YXIgU3RhbmRhcmRQcm9wZXJ0aWVzID0gW19QKCJkdHN0YXJ0IiwgMSwgdHJ1ZSksIF9QKCJ0em9mZnNldHRvIiwgMSwgdHJ1ZSksIF9QKCJ0em9mZnNldGZyb20iLCAxLCB0cnVlKSwgX1AoImNvbW1lbnQiKSwgX1AoInJkYXRlIiksIF9QKCJycnVsZSIpLCBfUCgidHpuYW1lIildOworZG9qby5jYWwuaUNhbGVuZGFyLlN0YW5kYXJkID0gZnVuY3Rpb24gKGJvZHkpIHsKKwl0aGlzLm5hbWUgPSAiU1RBTkRBUkQiOworCXRoaXMuX1ZhbGlkUHJvcGVydGllcyA9IFN0YW5kYXJkUHJvcGVydGllczsKKwlkb2pvLmNhbC5pQ2FsZW5kYXIuQ29tcG9uZW50LmNhbGwodGhpcywgYm9keSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmNhbC5pQ2FsZW5kYXIuU3RhbmRhcmQsIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOwordmFyIERheWxpZ2h0UHJvcGVydGllcyA9IFtfUCgiZHRzdGFydCIsIDEsIHRydWUpLCBfUCgidHpvZmZzZXR0byIsIDEsIHRydWUpLCBfUCgidHpvZmZzZXRmcm9tIiwgMSwgdHJ1ZSksIF9QKCJjb21tZW50IiksIF9QKCJyZGF0ZSIpLCBfUCgicnJ1bGUiKSwgX1AoInR6bmFtZSIpXTsKK2Rvam8uY2FsLmlDYWxlbmRhci5EYXlsaWdodCA9IGZ1bmN0aW9uIChib2R5KSB7CisJdGhpcy5uYW1lID0gIkRBWUxJR0hUIjsKKwl0aGlzLl9WYWxpZFByb3BlcnRpZXMgPSBEYXlsaWdodFByb3BlcnRpZXM7CisJZG9qby5jYWwuaUNhbGVuZGFyLkNvbXBvbmVudC5jYWxsKHRoaXMsIGJvZHkpOworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5jYWwuaUNhbGVuZGFyLkRheWxpZ2h0LCBkb2pvLmNhbC5pQ2FsZW5kYXIuQ29tcG9uZW50KTsKK3ZhciBWRXZlbnRQcm9wZXJ0aWVzID0gW19QKCJjbGFzcyIsIDEpLCBfUCgiY3JlYXRlZCIsIDEpLCBfUCgiZGVzY3JpcHRpb24iLCAxKSwgX1AoImR0c3RhcnQiLCAxKSwgX1AoImdlbyIsIDEpLCBfUCgibGFzdC1tb2QiLCAxKSwgX1AoImxvY2F0aW9uIiwgMSksIF9QKCJvcmdhbml6ZXIiLCAxKSwgX1AoInByaW9yaXR5IiwgMSksIF9QKCJkdHN0YW1wIiwgMSksIF9QKCJzZXEiLCAxKSwgX1AoInN0YXR1cyIsIDEpLCBfUCgic3VtbWFyeSIsIDEpLCBfUCgidHJhbnNwIiwgMSksIF9QKCJ1aWQiLCAxKSwgX1AoInVybCIsIDEpLCBfUCgicmVjdXJpZCIsIDEpLCBbX1AoImR0ZW5kIiwgMSksIF9QKCJkdXJhdGlvbiIsIDEpXSwgX1AoImF0dGFjaCIpLCBfUCgiYXR0ZW5kZWUiKSwgX1AoImNhdGVnb3JpZXMiKSwgX1AoImNvbW1lbnQiKSwgX1AoImNvbnRhY3QiKSwgX1AoImV4ZGF0ZSIpLCBfUCgiZXhydWxlIiksIF9QKCJyc3RhdHVzIiksIF9QKCJyZWxhdGVkIiksIF9QKCJyZXNvdXJjZXMiKSwgX1AoInJkYXRlIiksIF9QKCJycnVsZSIpXTsKK2Rvam8uY2FsLmlDYWxlbmRhci5WRXZlbnQgPSBmdW5jdGlvbiAoYm9keSkgeworCXRoaXMuX1ZhbGlkUHJvcGVydGllcyA9IFZFdmVudFByb3BlcnRpZXM7CisJdGhpcy5uYW1lID0gIlZFVkVOVCI7CisJZG9qby5jYWwuaUNhbGVuZGFyLkNvbXBvbmVudC5jYWxsKHRoaXMsIGJvZHkpOworCXRoaXMucmVjdXJyaW5nID0gZmFsc2U7CisJdGhpcy5zdGFydERhdGUgPSBkb2pvLmRhdGUuZnJvbUlzbzg2MDEodGhpcy5kdHN0YXJ0LnZhbHVlKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uY2FsLmlDYWxlbmRhci5WRXZlbnQsIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOworZG9qby5leHRlbmQoZG9qby5jYWwuaUNhbGVuZGFyLlZFdmVudCwge2dldERhdGVzOmZ1bmN0aW9uICh1bnRpbCkgeworCXZhciBkdHN0YXJ0ID0gdGhpcy5nZXREYXRlKCk7CisJdmFyIHJlY3VycmFuY2VTZXQgPSBbXTsKKwl2YXIgd2Vla2RheXMgPSBbInN1IiwgIm1vIiwgInR1IiwgIndlIiwgInRoIiwgImZyIiwgInNhIl07CisJdmFyIG9yZGVyID0geyJkYWlseSI6MSwgIndlZWtseSI6MiwgIm1vbnRobHkiOjMsICJ5ZWFybHkiOjQsICJieWRheSI6MSwgImJ5bW9udGhkYXkiOjEsICJieXdlZWtubyI6MiwgImJ5bW9udGgiOjMsICJieXllYXJkYXkiOjR9OworCWZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5ycnVsZS5sZW5ndGg7IHgrKykgeworCQl2YXIgcnJ1bGUgPSB0aGlzLnJydWxlW3hdOworCQl2YXIgZnJlcSA9IHJydWxlLmZyZXEudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGludGVydmFsID0gMTsKKwkJaWYgKHJydWxlLmludGVydmFsID4gaW50ZXJ2YWwpIHsKKwkJCWludGVydmFsID0gcnJ1bGUuaW50ZXJ2YWw7CisJCX0KKwkJdmFyIHNldCA9IFtdOworCQl2YXIgZnJlcUludCA9IG9yZGVyW2ZyZXFdOworCQlpZiAocnJ1bGUudW50aWwpIHsKKwkJCXZhciB0bXBVbnRpbCA9IGRvam8uZGF0ZS5mcm9tSXNvODYwMShycnVsZS51bnRpbCk7CisJCX0gZWxzZSB7CisJCQl2YXIgdG1wVW50aWwgPSB1bnRpbDsKKwkJfQorCQlpZiAodG1wVW50aWwgPiB1bnRpbCkgeworCQkJdG1wVW50aWwgPSB1bnRpbDsKKwkJfQorCQlpZiAoZHRzdGFydCA8IHRtcFVudGlsKSB7CisJCQl2YXIgZXhwYW5kaW5nUnVsZXMgPSBmdW5jdGlvbiAoKSB7CisJCQl9OworCQkJdmFyIGN1bGxpbmdSdWxlcyA9IGZ1bmN0aW9uICgpIHsKKwkJCX07CisJCQlleHBhbmRpbmdSdWxlcy5sZW5ndGggPSAwOworCQkJY3VsbGluZ1J1bGVzLmxlbmd0aCA9IDA7CisJCQlzd2l0Y2ggKGZyZXEpIHsKKwkJCSAgY2FzZSAieWVhcmx5IjoKKwkJCQl2YXIgbmV4dERhdGUgPSBuZXcgRGF0ZShkdHN0YXJ0KTsKKwkJCQlzZXQucHVzaChuZXh0RGF0ZSk7CisJCQkJd2hpbGUgKG5leHREYXRlIDwgdG1wVW50aWwpIHsKKwkJCQkJbmV4dERhdGUuc2V0WWVhcihuZXh0RGF0ZS5nZXRGdWxsWWVhcigpICsgaW50ZXJ2YWwpOworCQkJCQl0bXBEYXRlID0gbmV3IERhdGUobmV4dERhdGUpOworCQkJCQlpZiAodG1wRGF0ZSA8IHRtcFVudGlsKSB7CisJCQkJCQlzZXQucHVzaCh0bXBEYXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgY2FzZSAibW9udGhseSI6CisJCQkJbmV4dERhdGUgPSBuZXcgRGF0ZShkdHN0YXJ0KTsKKwkJCQlzZXQucHVzaChuZXh0RGF0ZSk7CisJCQkJd2hpbGUgKG5leHREYXRlIDwgdG1wVW50aWwpIHsKKwkJCQkJbmV4dERhdGUuc2V0TW9udGgobmV4dERhdGUuZ2V0TW9udGgoKSArIGludGVydmFsKTsKKwkJCQkJdmFyIHRtcERhdGUgPSBuZXcgRGF0ZShuZXh0RGF0ZSk7CisJCQkJCWlmICh0bXBEYXRlIDwgdG1wVW50aWwpIHsKKwkJCQkJCXNldC5wdXNoKHRtcERhdGUpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJICBjYXNlICJ3ZWVrbHkiOgorCQkJCW5leHREYXRlID0gbmV3IERhdGUoZHRzdGFydCk7CisJCQkJc2V0LnB1c2gobmV4dERhdGUpOworCQkJCXdoaWxlIChuZXh0RGF0ZSA8IHRtcFVudGlsKSB7CisJCQkJCW5leHREYXRlLnNldERhdGUobmV4dERhdGUuZ2V0RGF0ZSgpICsgKDcgKiBpbnRlcnZhbCkpOworCQkJCQl2YXIgdG1wRGF0ZSA9IG5ldyBEYXRlKG5leHREYXRlKTsKKwkJCQkJaWYgKHRtcERhdGUgPCB0bXBVbnRpbCkgeworCQkJCQkJc2V0LnB1c2godG1wRGF0ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImRhaWx5IjoKKwkJCQluZXh0RGF0ZSA9IG5ldyBEYXRlKGR0c3RhcnQpOworCQkJCXNldC5wdXNoKG5leHREYXRlKTsKKwkJCQl3aGlsZSAobmV4dERhdGUgPCB0bXBVbnRpbCkgeworCQkJCQluZXh0RGF0ZS5zZXREYXRlKG5leHREYXRlLmdldERhdGUoKSArIGludGVydmFsKTsKKwkJCQkJdmFyIHRtcERhdGUgPSBuZXcgRGF0ZShuZXh0RGF0ZSk7CisJCQkJCWlmICh0bXBEYXRlIDwgdG1wVW50aWwpIHsKKwkJCQkJCXNldC5wdXNoKHRtcERhdGUpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChycnVsZVsiYnltb250aCJdKSAmJiAob3JkZXJbImJ5bW9udGgiXSA8IGZyZXFJbnQpKSB7CisJCQkJZm9yICh2YXIgeiA9IDA7IHogPCBycnVsZVsiYnltb250aCJdLmxlbmd0aDsgeisrKSB7CisJCQkJCWlmICh6ID09IDApIHsKKwkJCQkJCWZvciAodmFyIHp6ID0gMDsgenogPCBzZXQubGVuZ3RoOyB6eisrKSB7CisJCQkJCQkJc2V0W3p6XS5zZXRNb250aChycnVsZVsiYnltb250aCJdW3pdIC0gMSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgc3Vic2V0ID0gW107CisJCQkJCQlmb3IgKHZhciB6eiA9IDA7IHp6IDwgc2V0Lmxlbmd0aDsgenorKykgeworCQkJCQkJCXZhciBuZXdEYXRlID0gbmV3IERhdGUoc2V0W3p6XSk7CisJCQkJCQkJbmV3RGF0ZS5zZXRNb250aChycnVsZVt6XSk7CisJCQkJCQkJc3Vic2V0LnB1c2gobmV3RGF0ZSk7CisJCQkJCQl9CisJCQkJCQl0bXAgPSBzZXQuY29uY2F0KHN1YnNldCk7CisJCQkJCQlzZXQgPSB0bXA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocnJ1bGVbImJ5d2Vla25vIl0gJiYgIXJydWxlWyJieW1vbnRoIl0pIHsKKwkJCQlkb2pvLmRlYnVnKCJUT0RPOiBubyBzdXBwb3J0IGZvciBieXdlZWtubyB5ZXQiKTsKKwkJCX0KKwkJCWlmIChycnVsZVsiYnl5ZWFyZGF5Il0gJiYgIXJydWxlWyJieW1vbnRoIl0gJiYgIXJydWxlWyJieXdlZWtubyJdKSB7CisJCQkJaWYgKHJydWxlWyJieXllYXJkYXkiXS5sZW5ndGggPiAxKSB7CisJCQkJCXZhciByZWdleCA9ICIoWystXT8pKFswLTldezEsM30pIjsKKwkJCQkJZm9yICh2YXIgeiA9IDE7IHggPCBycnVsZVsiYnl5ZWFyZGF5Il0ubGVuZ3RoOyB6KyspIHsKKwkJCQkJCXZhciByZWdleFJlc3VsdCA9IHJydWxlWyJieXllYXJkYXkiXVt6XS5tYXRjaChyZWdleCk7CisJCQkJCQlpZiAoeiA9PSAxKSB7CisJCQkJCQkJZm9yICh2YXIgenogPSAwOyB6eiA8IHNldC5sZW5ndGg7IHp6KyspIHsKKwkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzFdID09ICItIikgeworCQkJCQkJCQkJZG9qby5kYXRlLnNldERheU9mWWVhcihzZXRbenpdLCAzNjYgLSByZWdleFJlc3VsdFsyXSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlkb2pvLmRhdGUuc2V0RGF5T2ZZZWFyKHNldFt6el0sIHJlZ2V4UmVzdWx0WzJdKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdmFyIHN1YnNldCA9IFtdOworCQkJCQkJCWZvciAodmFyIHp6ID0gMDsgenogPCBzZXQubGVuZ3RoOyB6eisrKSB7CisJCQkJCQkJCXZhciBuZXdEYXRlID0gbmV3IERhdGUoc2V0W3p6XSk7CisJCQkJCQkJCWlmIChyZWdleFJlc3VsdFsxXSA9PSAiLSIpIHsKKwkJCQkJCQkJCWRvam8uZGF0ZS5zZXREYXlPZlllYXIobmV3RGF0ZSwgMzY2IC0gcmVnZXhSZXN1bHRbMl0pOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJZG9qby5kYXRlLnNldERheU9mWWVhcihuZXdEYXRlLCByZWdleFJlc3VsdFsyXSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJc3Vic2V0LnB1c2gobmV3RGF0ZSk7CisJCQkJCQkJfQorCQkJCQkJCXRtcCA9IHNldC5jb25jYXQoc3Vic2V0KTsKKwkJCQkJCQlzZXQgPSB0bXA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocnJ1bGVbImJ5bW9udGhkYXkiXSAmJiAob3JkZXJbImJ5bW9udGhkYXkiXSA8IGZyZXFJbnQpKSB7CisJCQkJaWYgKHJydWxlWyJieW1vbnRoZGF5Il0ubGVuZ3RoID4gMCkgeworCQkJCQl2YXIgcmVnZXggPSAiKFsrLV0/KShbMC05XXsxLDN9KSI7CisJCQkJCWZvciAodmFyIHogPSAwOyB6IDwgcnJ1bGVbImJ5bW9udGhkYXkiXS5sZW5ndGg7IHorKykgeworCQkJCQkJdmFyIHJlZ2V4UmVzdWx0ID0gcnJ1bGVbImJ5bW9udGhkYXkiXVt6XS5tYXRjaChyZWdleCk7CisJCQkJCQlpZiAoeiA9PSAwKSB7CisJCQkJCQkJZm9yICh2YXIgenogPSAwOyB6eiA8IHNldC5sZW5ndGg7IHp6KyspIHsKKwkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzFdID09ICItIikgeworCQkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzJdIDwgZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pKSB7CisJCQkJCQkJCQkJc2V0W3p6XS5zZXREYXRlKGRvam8uZGF0ZS5nZXREYXlzSW5Nb250aChzZXRbenpdKSAtIHJlZ2V4UmVzdWx0WzJdKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmIChyZWdleFJlc3VsdFsyXSA8IGRvam8uZGF0ZS5nZXREYXlzSW5Nb250aChzZXRbenpdKSkgeworCQkJCQkJCQkJCXNldFt6el0uc2V0RGF0ZShyZWdleFJlc3VsdFsyXSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZhciBzdWJzZXQgPSBbXTsKKwkJCQkJCQlmb3IgKHZhciB6eiA9IDA7IHp6IDwgc2V0Lmxlbmd0aDsgenorKykgeworCQkJCQkJCQl2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKHNldFt6el0pOworCQkJCQkJCQlpZiAocmVnZXhSZXN1bHRbMV0gPT0gIi0iKSB7CisJCQkJCQkJCQlpZiAocmVnZXhSZXN1bHRbMl0gPCBkb2pvLmRhdGUuZ2V0RGF5c0luTW9udGgoc2V0W3p6XSkpIHsKKwkJCQkJCQkJCQluZXdEYXRlLnNldERhdGUoZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pIC0gcmVnZXhSZXN1bHRbMl0pOworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzJdIDwgZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pKSB7CisJCQkJCQkJCQkJbmV3RGF0ZS5zZXREYXRlKHJlZ2V4UmVzdWx0WzJdKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlzdWJzZXQucHVzaChuZXdEYXRlKTsKKwkJCQkJCQl9CisJCQkJCQkJdG1wID0gc2V0LmNvbmNhdChzdWJzZXQpOworCQkJCQkJCXNldCA9IHRtcDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChycnVsZVsiYnlkYXkiXSAmJiAob3JkZXJbImJ5ZGF5Il0gPCBmcmVxSW50KSkgeworCQkJCWlmIChycnVsZVsiYnltb250aCJdKSB7CisJCQkJCWlmIChycnVsZVsiYnlkYXkiXS5sZW5ndGggPiAwKSB7CisJCQkJCQl2YXIgcmVnZXggPSAiKFsrLV0/KShbMC05XXswLDF9PykoW0EtWmEtel17MSwyfSkiOworCQkJCQkJZm9yICh2YXIgeiA9IDA7IHogPCBycnVsZVsiYnlkYXkiXS5sZW5ndGg7IHorKykgeworCQkJCQkJCXZhciByZWdleFJlc3VsdCA9IHJydWxlWyJieWRheSJdW3pdLm1hdGNoKHJlZ2V4KTsKKwkJCQkJCQl2YXIgb2NjdXJhbmNlID0gcmVnZXhSZXN1bHRbMl07CisJCQkJCQkJdmFyIGRheSA9IHJlZ2V4UmVzdWx0WzNdLnRvTG93ZXJDYXNlKCk7CisJCQkJCQkJaWYgKHogPT0gMCkgeworCQkJCQkJCQlmb3IgKHZhciB6eiA9IDA7IHp6IDwgc2V0Lmxlbmd0aDsgenorKykgeworCQkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzFdID09ICItIikgeworCQkJCQkJCQkJCXZhciBudW1EYXlzRm91bmQgPSAwOworCQkJCQkJCQkJCXZhciBsYXN0RGF5T2ZNb250aCA9IGRvam8uZGF0ZS5nZXREYXlzSW5Nb250aChzZXRbenpdKTsKKwkJCQkJCQkJCQl2YXIgZGF5c1RvU3VidHJhY3QgPSAxOworCQkJCQkJCQkJCXNldFt6el0uc2V0RGF0ZShsYXN0RGF5T2ZNb250aCk7CisJCQkJCQkJCQkJaWYgKHdlZWtkYXlzW3NldFt6el0uZ2V0RGF5KCldID09IGRheSkgeworCQkJCQkJCQkJCQludW1EYXlzRm91bmQrKzsKKwkJCQkJCQkJCQkJZGF5c1RvU3VidHJhY3QgPSA3OworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlkYXlzVG9TdWJ0cmFjdCA9IDE7CisJCQkJCQkJCQkJd2hpbGUgKG51bURheXNGb3VuZCA8IG9jY3VyYW5jZSkgeworCQkJCQkJCQkJCQlzZXRbenpdLnNldERhdGUoc2V0W3p6XS5nZXREYXRlKCkgLSBkYXlzVG9TdWJ0cmFjdCk7CisJCQkJCQkJCQkJCWlmICh3ZWVrZGF5c1tzZXRbenpdLmdldERheSgpXSA9PSBkYXkpIHsKKwkJCQkJCQkJCQkJCW51bURheXNGb3VuZCsrOworCQkJCQkJCQkJCQkJZGF5c1RvU3VidHJhY3QgPSA3OworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpZiAob2NjdXJhbmNlKSB7CisJCQkJCQkJCQkJCXZhciBudW1EYXlzRm91bmQgPSAwOworCQkJCQkJCQkJCQlzZXRbenpdLnNldERhdGUoMSk7CisJCQkJCQkJCQkJCXZhciBkYXlzVG9BZGQgPSAxOworCQkJCQkJCQkJCQlpZiAod2Vla2RheXNbc2V0W3p6XS5nZXREYXkoKV0gPT0gZGF5KSB7CisJCQkJCQkJCQkJCQludW1EYXlzRm91bmQrKzsKKwkJCQkJCQkJCQkJCWRheXNUb0FkZCA9IDc7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJd2hpbGUgKG51bURheXNGb3VuZCA8IG9jY3VyYW5jZSkgeworCQkJCQkJCQkJCQkJc2V0W3p6XS5zZXREYXRlKHNldFt6el0uZ2V0RGF0ZSgpICsgZGF5c1RvQWRkKTsKKwkJCQkJCQkJCQkJCWlmICh3ZWVrZGF5c1tzZXRbenpdLmdldERheSgpXSA9PSBkYXkpIHsKKwkJCQkJCQkJCQkJCQludW1EYXlzRm91bmQrKzsKKwkJCQkJCQkJCQkJCQlkYXlzVG9BZGQgPSA3OworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJdmFyIG51bURheXNGb3VuZCA9IDA7CisJCQkJCQkJCQkJCXZhciBzdWJzZXQgPSBbXTsKKwkJCQkJCQkJCQkJbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZShzZXRbenpdKTsKKwkJCQkJCQkJCQkJdmFyIGRheXNJbk1vbnRoID0gZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pOworCQkJCQkJCQkJCQlsYXN0RGF5T2ZNb250aC5zZXREYXRlKGRheXNJbk1vbnRoKTsKKwkJCQkJCQkJCQkJc2V0W3p6XS5zZXREYXRlKDEpOworCQkJCQkJCQkJCQlpZiAod2Vla2RheXNbc2V0W3p6XS5nZXREYXkoKV0gPT0gZGF5KSB7CisJCQkJCQkJCQkJCQludW1EYXlzRm91bmQrKzsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl2YXIgdG1wRGF0ZSA9IG5ldyBEYXRlKHNldFt6el0pOworCQkJCQkJCQkJCQlkYXlzVG9BZGQgPSAxOworCQkJCQkJCQkJCQl3aGlsZSAodG1wRGF0ZS5nZXREYXRlKCkgPCBsYXN0RGF5T2ZNb250aCkgeworCQkJCQkJCQkJCQkJaWYgKHdlZWtkYXlzW3RtcERhdGUuZ2V0RGF5KCldID09IGRheSkgeworCQkJCQkJCQkJCQkJCW51bURheXNGb3VuZCsrOworCQkJCQkJCQkJCQkJCWlmIChudW1EYXlzRm91bmQgPT0gMSkgeworCQkJCQkJCQkJCQkJCQlzZXRbenpdID0gdG1wRGF0ZTsKKwkJCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCQlzdWJzZXQucHVzaCh0bXBEYXRlKTsKKwkJCQkJCQkJCQkJCQkJdG1wRGF0ZSA9IG5ldyBEYXRlKHRtcERhdGUpOworCQkJCQkJCQkJCQkJCQlkYXlzVG9BZGQgPSA3OworCQkJCQkJCQkJCQkJCQl0bXBEYXRlLnNldERhdGUodG1wRGF0ZS5nZXREYXRlKCkgKyBkYXlzVG9BZGQpOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJdG1wRGF0ZS5zZXREYXRlKHRtcERhdGUuZ2V0RGF0ZSgpICsgZGF5c1RvQWRkKTsKKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl2YXIgdCA9IHNldC5jb25jYXQoc3Vic2V0KTsKKwkJCQkJCQkJCQkJc2V0ID0gdDsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl2YXIgc3Vic2V0ID0gW107CisJCQkJCQkJCWZvciAodmFyIHp6ID0gMDsgenogPCBzZXQubGVuZ3RoOyB6eisrKSB7CisJCQkJCQkJCQl2YXIgbmV3RGF0ZSA9IG5ldyBEYXRlKHNldFt6el0pOworCQkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzFdID09ICItIikgeworCQkJCQkJCQkJCWlmIChyZWdleFJlc3VsdFsyXSA8IGRvam8uZGF0ZS5nZXREYXlzSW5Nb250aChzZXRbenpdKSkgeworCQkJCQkJCQkJCQluZXdEYXRlLnNldERhdGUoZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pIC0gcmVnZXhSZXN1bHRbMl0pOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJaWYgKHJlZ2V4UmVzdWx0WzJdIDwgZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHNldFt6el0pKSB7CisJCQkJCQkJCQkJCW5ld0RhdGUuc2V0RGF0ZShyZWdleFJlc3VsdFsyXSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJc3Vic2V0LnB1c2gobmV3RGF0ZSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJdG1wID0gc2V0LmNvbmNhdChzdWJzZXQpOworCQkJCQkJCQlzZXQgPSB0bXA7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZG9qby5kZWJ1ZygiVE9ETzogYnlkYXkgd2l0aGluIGEgeWVhcmx5IHJ1bGUgd2l0aG91dCBhIGJ5bW9udGgiKTsKKwkJCQl9CisJCQl9CisJCQlkb2pvLmRlYnVnKCJUT0RPOiBQcm9jZXNzIEJZcnVsZXMgZm9yIHVuaXRzIGxhcmdlciB0aGFuIGZyZXF1ZW5jeSIpOworCQkJdmFyIHRtcCA9IHJlY3VycmFuY2VTZXQuY29uY2F0KHNldCk7CisJCQlyZWN1cnJhbmNlU2V0ID0gdG1wOworCQl9CisJfQorCXJlY3VycmFuY2VTZXQucHVzaChkdHN0YXJ0KTsKKwlyZXR1cm4gcmVjdXJyYW5jZVNldDsKK30sIGdldERhdGU6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmRhdGUuZnJvbUlzbzg2MDEodGhpcy5kdHN0YXJ0LnZhbHVlKTsKK319KTsKK3ZhciBWVGltZVpvbmVQcm9wZXJ0aWVzID0gW19QKCJ0emlkIiwgMSwgdHJ1ZSksIF9QKCJsYXN0LW1vZCIsIDEpLCBfUCgidHp1cmwiLCAxKV07Citkb2pvLmNhbC5pQ2FsZW5kYXIuVlRpbWVab25lID0gZnVuY3Rpb24gKGJvZHkpIHsKKwl0aGlzLm5hbWUgPSAiVlRJTUVaT05FIjsKKwl0aGlzLl9WYWxpZFByb3BlcnRpZXMgPSBWVGltZVpvbmVQcm9wZXJ0aWVzOworCWRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQuY2FsbCh0aGlzLCBib2R5KTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uY2FsLmlDYWxlbmRhci5WVGltZVpvbmUsIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOwordmFyIFZUb2RvUHJvcGVydGllcyA9IFtfUCgiY2xhc3MiLCAxKSwgX1AoImNvbXBsZXRlZCIsIDEpLCBfUCgiY3JlYXRlZCIsIDEpLCBfUCgiZGVzY3JpcHRpb24iLCAxKSwgX1AoImR0c3RhcnQiLCAxKSwgX1AoImdlbyIsIDEpLCBfUCgibGFzdC1tb2QiLCAxKSwgX1AoImxvY2F0aW9uIiwgMSksIF9QKCJvcmdhbml6ZXIiLCAxKSwgX1AoInBlcmNlbnQiLCAxKSwgX1AoInByaW9yaXR5IiwgMSksIF9QKCJkdHN0YW1wIiwgMSksIF9QKCJzZXEiLCAxKSwgX1AoInN0YXR1cyIsIDEpLCBfUCgic3VtbWFyeSIsIDEpLCBfUCgidWlkIiwgMSksIF9QKCJ1cmwiLCAxKSwgX1AoInJlY3VyaWQiLCAxKSwgW19QKCJkdWUiLCAxKSwgX1AoImR1cmF0aW9uIiwgMSldLCBfUCgiYXR0YWNoIiksIF9QKCJhdHRlbmRlZSIpLCBfUCgiY2F0ZWdvcmllcyIpLCBfUCgiY29tbWVudCIpLCBfUCgiY29udGFjdCIpLCBfUCgiZXhkYXRlIiksIF9QKCJleHJ1bGUiKSwgX1AoInJzdGF0dXMiKSwgX1AoInJlbGF0ZWQiKSwgX1AoInJlc291cmNlcyIpLCBfUCgicmRhdGUiKSwgX1AoInJydWxlIildOworZG9qby5jYWwuaUNhbGVuZGFyLlZUb2RvID0gZnVuY3Rpb24gKGJvZHkpIHsKKwl0aGlzLm5hbWUgPSAiVlRPRE8iOworCXRoaXMuX1ZhbGlkUHJvcGVydGllcyA9IFZUb2RvUHJvcGVydGllczsKKwlkb2pvLmNhbC5pQ2FsZW5kYXIuQ29tcG9uZW50LmNhbGwodGhpcywgYm9keSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmNhbC5pQ2FsZW5kYXIuVlRvZG8sIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOwordmFyIFZKb3VybmFsUHJvcGVydGllcyA9IFtfUCgiY2xhc3MiLCAxKSwgX1AoImNyZWF0ZWQiLCAxKSwgX1AoImRlc2NyaXB0aW9uIiwgMSksIF9QKCJkdHN0YXJ0IiwgMSksIF9QKCJsYXN0LW1vZCIsIDEpLCBfUCgib3JnYW5pemVyIiwgMSksIF9QKCJkdHN0YW1wIiwgMSksIF9QKCJzZXEiLCAxKSwgX1AoInN0YXR1cyIsIDEpLCBfUCgic3VtbWFyeSIsIDEpLCBfUCgidWlkIiwgMSksIF9QKCJ1cmwiLCAxKSwgX1AoInJlY3VyaWQiLCAxKSwgX1AoImF0dGFjaCIpLCBfUCgiYXR0ZW5kZWUiKSwgX1AoImNhdGVnb3JpZXMiKSwgX1AoImNvbW1lbnQiKSwgX1AoImNvbnRhY3QiKSwgX1AoImV4ZGF0ZSIpLCBfUCgiZXhydWxlIiksIF9QKCJyZWxhdGVkIiksIF9QKCJyc3RhdHVzIiksIF9QKCJyZGF0ZSIpLCBfUCgicnJ1bGUiKV07Citkb2pvLmNhbC5pQ2FsZW5kYXIuVkpvdXJuYWwgPSBmdW5jdGlvbiAoYm9keSkgeworCXRoaXMubmFtZSA9ICJWSk9VUk5BTCI7CisJdGhpcy5fVmFsaWRQcm9wZXJ0aWVzID0gVkpvdXJuYWxQcm9wZXJ0aWVzOworCWRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQuY2FsbCh0aGlzLCBib2R5KTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uY2FsLmlDYWxlbmRhci5WSm91cm5hbCwgZG9qby5jYWwuaUNhbGVuZGFyLkNvbXBvbmVudCk7Cit2YXIgVkZyZWVCdXN5UHJvcGVydGllcyA9IFtfUCgiY29udGFjdCIpLCBfUCgiZHRzdGFydCIsIDEpLCBfUCgiZHRlbmQiKSwgX1AoImR1cmF0aW9uIiksIF9QKCJvcmdhbml6ZXIiLCAxKSwgX1AoImR0c3RhbXAiLCAxKSwgX1AoInVpZCIsIDEpLCBfUCgidXJsIiwgMSksIF9QKCJhdHRlbmRlZSIpLCBfUCgiY29tbWVudCIpLCBfUCgiZnJlZWJ1c3kiKSwgX1AoInJzdGF0dXMiKV07Citkb2pvLmNhbC5pQ2FsZW5kYXIuVkZyZWVCdXN5ID0gZnVuY3Rpb24gKGJvZHkpIHsKKwl0aGlzLm5hbWUgPSAiVkZSRUVCVVNZIjsKKwl0aGlzLl9WYWxpZFByb3BlcnRpZXMgPSBWRnJlZUJ1c3lQcm9wZXJ0aWVzOworCWRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQuY2FsbCh0aGlzLCBib2R5KTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uY2FsLmlDYWxlbmRhci5WRnJlZUJ1c3ksIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOwordmFyIFZBbGFybVByb3BlcnRpZXMgPSBbW19QKCJhY3Rpb24iLCAxLCB0cnVlKSwgX1AoInRyaWdnZXIiLCAxLCB0cnVlKSwgW19QKCJkdXJhdGlvbiIsIDEpLCBfUCgicmVwZWF0IiwgMSldLCBfUCgiYXR0YWNoIiwgMSldLCBbX1AoImFjdGlvbiIsIDEsIHRydWUpLCBfUCgiZGVzY3JpcHRpb24iLCAxLCB0cnVlKSwgX1AoInRyaWdnZXIiLCAxLCB0cnVlKSwgW19QKCJkdXJhdGlvbiIsIDEpLCBfUCgicmVwZWF0IiwgMSldXSwgW19QKCJhY3Rpb24iLCAxLCB0cnVlKSwgX1AoImRlc2NyaXB0aW9uIiwgMSwgdHJ1ZSksIF9QKCJ0cmlnZ2VyIiwgMSwgdHJ1ZSksIF9QKCJzdW1tYXJ5IiwgMSwgdHJ1ZSksIF9QKCJhdHRlbmRlZSIsICIqIiwgdHJ1ZSksIFtfUCgiZHVyYXRpb24iLCAxKSwgX1AoInJlcGVhdCIsIDEpXSwgX1AoImF0dGFjaCIsIDEpXSwgW19QKCJhY3Rpb24iLCAxLCB0cnVlKSwgX1AoImF0dGFjaCIsIDEsIHRydWUpLCBfUCgidHJpZ2dlciIsIDEsIHRydWUpLCBbX1AoImR1cmF0aW9uIiwgMSksIF9QKCJyZXBlYXQiLCAxKV0sIF9QKCJkZXNjcmlwdGlvbiIsIDEpXV07Citkb2pvLmNhbC5pQ2FsZW5kYXIuVkFsYXJtID0gZnVuY3Rpb24gKGJvZHkpIHsKKwl0aGlzLm5hbWUgPSAiVkFMQVJNIjsKKwl0aGlzLl9WYWxpZFByb3BlcnRpZXMgPSBWQWxhcm1Qcm9wZXJ0aWVzOworCWRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQuY2FsbCh0aGlzLCBib2R5KTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uY2FsLmlDYWxlbmRhci5WQWxhcm0sIGRvam8uY2FsLmlDYWxlbmRhci5Db21wb25lbnQpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2FsL3RleHREaXJlY3RvcnkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2FsL3RleHREaXJlY3RvcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MTM3NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jYWwvdGV4dERpcmVjdG9yeS5qcwpAQCAtMCwwICsxLDU3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNhbC50ZXh0RGlyZWN0b3J5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nIik7Citkb2pvLmNhbC50ZXh0RGlyZWN0b3J5LlByb3BlcnR5ID0gZnVuY3Rpb24gKGxpbmUpIHsKKwl2YXIgbGVmdCA9IGRvam8uc3RyaW5nLnRyaW0obGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKCI6IikpKTsKKwl2YXIgcmlnaHQgPSBkb2pvLnN0cmluZy50cmltKGxpbmUuc3Vic3RyKGxpbmUuaW5kZXhPZigiOiIpICsgMSkpOworCXZhciBwYXJhbWV0ZXJzID0gZG9qby5zdHJpbmcuc3BsaXRFc2NhcGVkKGxlZnQsICI7Iik7CisJdGhpcy5uYW1lID0gcGFyYW1ldGVyc1swXTsKKwlwYXJhbWV0ZXJzLnNwbGljZSgwLCAxKTsKKwl0aGlzLnBhcmFtcyA9IFtdOworCXZhciBhcnI7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisJCWFyciA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoIj0iKTsKKwkJdmFyIGtleSA9IGRvam8uc3RyaW5nLnRyaW0oYXJyWzBdLnRvVXBwZXJDYXNlKCkpOworCQlpZiAoYXJyLmxlbmd0aCA9PSAxKSB7CisJCQl0aGlzLnBhcmFtcy5wdXNoKFtrZXldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhciB2YWx1ZXMgPSBkb2pvLnN0cmluZy5zcGxpdEVzY2FwZWQoYXJyWzFdLCAiLCIpOworCQlmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykgeworCQkJaWYgKGRvam8uc3RyaW5nLnRyaW0odmFsdWVzW2pdKSAhPSAiIikgeworCQkJCXRoaXMucGFyYW1zLnB1c2goW2tleSwgZG9qby5zdHJpbmcudHJpbSh2YWx1ZXNbal0pXSk7CisJCQl9CisJCX0KKwl9CisJaWYgKHRoaXMubmFtZS5pbmRleE9mKCIuIikgPiAwKSB7CisJCWFyciA9IHRoaXMubmFtZS5zcGxpdCgiLiIpOworCQl0aGlzLmdyb3VwID0gYXJyWzBdOworCQl0aGlzLm5hbWUgPSBhcnJbMV07CisJfQorCXRoaXMudmFsdWUgPSByaWdodDsKK307Citkb2pvLmNhbC50ZXh0RGlyZWN0b3J5LnRva2VuaXNlID0gZnVuY3Rpb24gKHRleHQpIHsKKwl2YXIgblRleHQgPSBkb2pvLnN0cmluZy5ub3JtYWxpemVOZXdsaW5lcyh0ZXh0LCAiXG4iKS5yZXBsYWNlKC9cblsgXHRdL2csICIiKS5yZXBsYWNlKC9ceDAwL2csICIiKTsKKwl2YXIgbGluZXMgPSBuVGV4dC5zcGxpdCgiXG4iKTsKKwl2YXIgcHJvcGVydGllcyA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGRvam8uc3RyaW5nLnRyaW0obGluZXNbaV0pID09ICIiKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgcHJvcCA9IG5ldyBkb2pvLmNhbC50ZXh0RGlyZWN0b3J5LlByb3BlcnR5KGxpbmVzW2ldKTsKKwkJcHJvcGVydGllcy5wdXNoKHByb3ApOworCX0KKwlyZXR1cm4gcHJvcGVydGllczsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9BeGlzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL0F4aXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0NzQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9BeGlzLmpzCkBAIC0wLDAgKzEsMTMyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNoYXJ0aW5nLkF4aXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5jaGFydGluZy5BeGlzID0gZnVuY3Rpb24gKGxhYmVsLCBzY2FsZSwgbGFiZWxzKSB7CisJdmFyIGlkID0gImRvam8tY2hhcnRpbmctYXhpcy0iICsgZG9qby5jaGFydGluZy5BeGlzLmNvdW50Kys7CisJdGhpcy5nZXRJZCA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIGlkOworCX07CisJdGhpcy5zZXRJZCA9IGZ1bmN0aW9uIChrZXkpIHsKKwkJaWQgPSBrZXk7CisJfTsKKwl0aGlzLnNjYWxlID0gc2NhbGUgfHwgImxpbmVhciI7CisJdGhpcy5sYWJlbCA9IGxhYmVsIHx8ICIiOworCXRoaXMuc2hvd0xhYmVsID0gdHJ1ZTsKKwl0aGlzLnNob3dMYWJlbHMgPSB0cnVlOworCXRoaXMuc2hvd0xpbmVzID0gZmFsc2U7CisJdGhpcy5zaG93VGlja3MgPSBmYWxzZTsKKwl0aGlzLnJhbmdlID0ge3VwcGVyOjEwMCwgbG93ZXI6MH07CisJdGhpcy5vcmlnaW4gPSAibWluIjsKKwl0aGlzLl9vcmlnaW4gPSBudWxsOworCXRoaXMubGFiZWxzID0gbGFiZWxzIHx8IFtdOworCXRoaXMuX2xhYmVscyA9IFtdOworCXRoaXMubm9kZXMgPSB7bWFpbjpudWxsLCBheGlzOm51bGwsIGxhYmVsOm51bGwsIGxhYmVsczpudWxsLCBsaW5lczpudWxsLCB0aWNrczpudWxsfTsKKwl0aGlzLl9yZXJlbmRlciA9IGZhbHNlOworfTsKK2Rvam8uY2hhcnRpbmcuQXhpcy5jb3VudCA9IDA7Citkb2pvLmV4dGVuZChkb2pvLmNoYXJ0aW5nLkF4aXMsIHtnZXRDb29yZDpmdW5jdGlvbiAodmFsLCBwbG90QXJlYSwgcGxvdCkgeworCXZhbCA9IHBhcnNlRmxvYXQodmFsLCAxMCk7CisJdmFyIGFyZWEgPSBwbG90QXJlYS5nZXRBcmVhKCk7CisJaWYgKHBsb3QuYXhpc1ggPT0gdGhpcykgeworCQl2YXIgb2Zmc2V0ID0gMCAtIHRoaXMucmFuZ2UubG93ZXI7CisJCXZhciBtaW4gPSB0aGlzLnJhbmdlLmxvd2VyICsgb2Zmc2V0OworCQl2YXIgbWF4ID0gdGhpcy5yYW5nZS51cHBlciArIG9mZnNldDsKKwkJdmFsICs9IG9mZnNldDsKKwkJcmV0dXJuICh2YWwgKiAoKGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpIC8gbWF4KSkgKyBhcmVhLmxlZnQ7CisJfSBlbHNlIHsKKwkJdmFyIG1heCA9IHRoaXMucmFuZ2UudXBwZXI7CisJCXZhciBtaW4gPSB0aGlzLnJhbmdlLmxvd2VyOworCQl2YXIgb2Zmc2V0ID0gMDsKKwkJaWYgKG1pbiA8IDApIHsKKwkJCW9mZnNldCArPSBNYXRoLmFicyhtaW4pOworCQl9CisJCW1heCArPSBvZmZzZXQ7CisJCW1pbiArPSBvZmZzZXQ7CisJCXZhbCArPSBvZmZzZXQ7CisJCXZhciBwbWluID0gYXJlYS5ib3R0b207CisJCXZhciBwbWF4ID0gYXJlYS50b3A7CisJCXJldHVybiAoKChwbWluIC0gcG1heCkgLyAobWF4IC0gbWluKSkgKiAobWF4IC0gdmFsKSkgKyBwbWF4OworCX0KK30sIGluaXRpYWxpemVPcmlnaW46ZnVuY3Rpb24gKGRyYXdBZ2FpbnN0LCBwbGFuZSkgeworCWlmICh0aGlzLl9vcmlnaW4gPT0gbnVsbCkgeworCQl0aGlzLl9vcmlnaW4gPSB0aGlzLm9yaWdpbjsKKwl9CisJaWYgKGlzTmFOKHRoaXMuX29yaWdpbikpIHsKKwkJaWYgKHRoaXMuX29yaWdpbi50b0xvd2VyQ2FzZSgpID09ICJtYXgiKSB7CisJCQl0aGlzLm9yaWdpbiA9IGRyYXdBZ2FpbnN0LnJhbmdlWyhwbGFuZSA9PSAieSIpID8gInVwcGVyIiA6ICJsb3dlciJdOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuX29yaWdpbi50b0xvd2VyQ2FzZSgpID09ICJtaW4iKSB7CisJCQkJdGhpcy5vcmlnaW4gPSBkcmF3QWdhaW5zdC5yYW5nZVsocGxhbmUgPT0gInkiKSA/ICJsb3dlciIgOiAidXBwZXIiXTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5vcmlnaW4gPSAwOworCQkJfQorCQl9CisJfQorfSwgaW5pdGlhbGl6ZUxhYmVsczpmdW5jdGlvbiAoKSB7CisJdGhpcy5fbGFiZWxzID0gW107CisJaWYgKHRoaXMubGFiZWxzLmxlbmd0aCA9PSAwKSB7CisJCXRoaXMuc2hvd0xhYmVscyA9IGZhbHNlOworCQl0aGlzLnNob3dMaW5lcyA9IGZhbHNlOworCQl0aGlzLnNob3dUaWNrcyA9IGZhbHNlOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmxhYmVsc1swXS5sYWJlbCAmJiB0aGlzLmxhYmVsc1swXS52YWx1ZSAhPSBudWxsKSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5fbGFiZWxzLnB1c2godGhpcy5sYWJlbHNbaV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFpc05hTih0aGlzLmxhYmVsc1swXSkpIHsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7CisJCQkJCXRoaXMuX2xhYmVscy5wdXNoKHtsYWJlbDp0aGlzLmxhYmVsc1tpXSwgdmFsdWU6dGhpcy5sYWJlbHNbaV19KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZhciBhID0gW107CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykgeworCQkJCQlhLnB1c2godGhpcy5sYWJlbHNbaV0pOworCQkJCX0KKwkJCQl2YXIgcyA9IGEuc2hpZnQoKTsKKwkJCQl0aGlzLl9sYWJlbHMucHVzaCh7bGFiZWw6cywgdmFsdWU6dGhpcy5yYW5nZS5sb3dlcn0pOworCQkJCWlmIChhLmxlbmd0aCA+IDApIHsKKwkJCQkJdmFyIHMgPSBhLnBvcCgpOworCQkJCQl0aGlzLl9sYWJlbHMucHVzaCh7bGFiZWw6cywgdmFsdWU6dGhpcy5yYW5nZS51cHBlcn0pOworCQkJCX0KKwkJCQlpZiAoYS5sZW5ndGggPiAwKSB7CisJCQkJCXZhciByYW5nZSA9IHRoaXMucmFuZ2UudXBwZXIgLSB0aGlzLnJhbmdlLmxvd2VyOworCQkJCQl2YXIgc3RlcCA9IHJhbmdlIC8gKHRoaXMubGFiZWxzLmxlbmd0aCAtIDEpOworCQkJCQlmb3IgKHZhciBpID0gMTsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7CisJCQkJCQl0aGlzLl9sYWJlbHMucHVzaCh7bGFiZWw6YVtpIC0gMV0sIHZhbHVlOnRoaXMucmFuZ2UubG93ZXIgKyAoc3RlcCAqIGkpfSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9LCBpbml0aWFsaXplOmZ1bmN0aW9uIChwbG90QXJlYSwgcGxvdCwgZHJhd0FnYWluc3QsIHBsYW5lKSB7CisJdGhpcy5kZXN0cm95KCk7CisJdGhpcy5pbml0aWFsaXplT3JpZ2luKGRyYXdBZ2FpbnN0LCBwbGFuZSk7CisJdGhpcy5pbml0aWFsaXplTGFiZWxzKCk7CisJdmFyIG5vZGUgPSB0aGlzLnJlbmRlcihwbG90QXJlYSwgcGxvdCwgZHJhd0FnYWluc3QsIHBsYW5lKTsKKwlyZXR1cm4gbm9kZTsKK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIHAgaW4gdGhpcy5ub2RlcykgeworCQl3aGlsZSAodGhpcy5ub2Rlc1twXSAmJiB0aGlzLm5vZGVzW3BdLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQkJdGhpcy5ub2Rlc1twXS5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzW3BdLmNoaWxkTm9kZXNbMF0pOworCQl9CisJCWlmICh0aGlzLm5vZGVzW3BdICYmIHRoaXMubm9kZXNbcF0ucGFyZW50Tm9kZSkgeworCQkJdGhpcy5ub2Rlc1twXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZXNbcF0pOworCQl9CisJCXRoaXMubm9kZXNbcF0gPSBudWxsOworCX0KK319KTsKK2Rvam8ucmVxdWlyZUlmKGRvam8ucmVuZGVyLnN2Zy5jYXBhYmxlLCAiZG9qby5jaGFydGluZy5zdmcuQXhpcyIpOworZG9qby5yZXF1aXJlSWYoZG9qby5yZW5kZXIudm1sLmNhcGFibGUsICJkb2pvLmNoYXJ0aW5nLnZtbC5BeGlzIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9DaGFydC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9DaGFydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQyNDFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL0NoYXJ0LmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY2hhcnRpbmcuQ2hhcnQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNoYXJ0aW5nLlBsb3RBcmVhIik7Citkb2pvLmNoYXJ0aW5nLkNoYXJ0ID0gZnVuY3Rpb24gKG5vZGUsIHRpdGxlLCBkZXNjcmlwdGlvbikgeworCXRoaXMubm9kZSA9IG5vZGUgfHwgbnVsbDsKKwl0aGlzLnRpdGxlID0gdGl0bGUgfHwgIkNoYXJ0IjsKKwl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgIiI7CisJdGhpcy5wbG90QXJlYXMgPSBbXTsKK307Citkb2pvLmV4dGVuZChkb2pvLmNoYXJ0aW5nLkNoYXJ0LCB7YWRkUGxvdEFyZWE6ZnVuY3Rpb24gKG9iaiwgZG9SZW5kZXIpIHsKKwlpZiAob2JqLnggIT0gbnVsbCAmJiBvYmoubGVmdCA9PSBudWxsKSB7CisJCW9iai5sZWZ0ID0gb2JqLng7CisJfQorCWlmIChvYmoueSAhPSBudWxsICYmIG9iai50b3AgPT0gbnVsbCkgeworCQlvYmoudG9wID0gb2JqLnk7CisJfQorCXRoaXMucGxvdEFyZWFzLnB1c2gob2JqKTsKKwlpZiAoZG9SZW5kZXIpIHsKKwkJdGhpcy5yZW5kZXIoKTsKKwl9Cit9LCBvbkluaXRpYWxpemU6ZnVuY3Rpb24gKGNoYXJ0KSB7Cit9LCBvblJlbmRlcjpmdW5jdGlvbiAoY2hhcnQpIHsKK30sIG9uRGVzdHJveTpmdW5jdGlvbiAoY2hhcnQpIHsKK30sIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5ub2RlKSB7CisJCWRvam8ucmFpc2UoImRvam8uY2hhcnRpbmcuQ2hhcnQuaW5pdGlhbGl6ZTogdGhlcmUgbXVzdCBiZSBhIHJvb3Qgbm9kZSBkZWZpbmVkIGZvciB0aGUgQ2hhcnQuIik7CisJfQorCXRoaXMuZGVzdHJveSgpOworCXRoaXMucmVuZGVyKCk7CisJdGhpcy5vbkluaXRpYWxpemUodGhpcyk7Cit9LCByZW5kZXI6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLm5vZGUuc3R5bGUucG9zaXRpb24gIT0gImFic29sdXRlIikgeworCQl0aGlzLm5vZGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGxvdEFyZWFzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBhcmVhID0gdGhpcy5wbG90QXJlYXNbaV0ucGxvdEFyZWE7CisJCXZhciBub2RlID0gYXJlYS5pbml0aWFsaXplKCk7CisJCW5vZGUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlub2RlLnN0eWxlLnRvcCA9IHRoaXMucGxvdEFyZWFzW2ldLnRvcCArICJweCI7CisJCW5vZGUuc3R5bGUubGVmdCA9IHRoaXMucGxvdEFyZWFzW2ldLmxlZnQgKyAicHgiOworCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7CisJCWFyZWEucmVuZGVyKCk7CisJfQorfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RBcmVhcy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnBsb3RBcmVhc1tpXS5wbG90QXJlYS5kZXN0cm95KCk7CisJfQorCXdoaWxlICh0aGlzLm5vZGUgJiYgdGhpcy5ub2RlLmNoaWxkTm9kZXMgJiYgdGhpcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQl0aGlzLm5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlLmNoaWxkTm9kZXNbMF0pOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL1Bsb3QuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvUGxvdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MThmYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL1Bsb3QuanMKQEAgLTAsMCArMSw4MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jaGFydGluZy5QbG90Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5jaGFydGluZy5BeGlzIik7Citkb2pvLnJlcXVpcmUoImRvam8uY2hhcnRpbmcuU2VyaWVzIik7Citkb2pvLmNoYXJ0aW5nLlJlbmRlclBsb3RTZXJpZXMgPSB7U2luZ2x5OiJzaW5nbGUiLCBHcm91cGVkOiJncm91cGVkIn07Citkb2pvLmNoYXJ0aW5nLlBsb3QgPSBmdW5jdGlvbiAoeGF4aXMsIHlheGlzLCBzZXJpZXMpIHsKKwl2YXIgaWQgPSAiZG9qby1jaGFydGluZy1wbG90LSIgKyBkb2pvLmNoYXJ0aW5nLlBsb3QuY291bnQrKzsKKwl0aGlzLmdldElkID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gaWQ7CisJfTsKKwl0aGlzLnNldElkID0gZnVuY3Rpb24gKGtleSkgeworCQlpZCA9IGtleTsKKwl9OworCXRoaXMuYXhpc1ggPSBudWxsOworCXRoaXMuYXhpc1kgPSBudWxsOworCXRoaXMuc2VyaWVzID0gW107CisJdGhpcy5kYXRhTm9kZSA9IG51bGw7CisJdGhpcy5yZW5kZXJUeXBlID0gZG9qby5jaGFydGluZy5SZW5kZXJQbG90U2VyaWVzLlNpbmdseTsKKwlpZiAoeGF4aXMpIHsKKwkJdGhpcy5zZXRBeGlzKHhheGlzLCAieCIpOworCX0KKwlpZiAoeWF4aXMpIHsKKwkJdGhpcy5zZXRBeGlzKHlheGlzLCAieSIpOworCX0KKwlpZiAoc2VyaWVzKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLmFkZFNlcmllcyhzZXJpZXNbaV0pOworCQl9CisJfQorfTsKK2Rvam8uY2hhcnRpbmcuUGxvdC5jb3VudCA9IDA7Citkb2pvLmV4dGVuZChkb2pvLmNoYXJ0aW5nLlBsb3QsIHthZGRTZXJpZXM6ZnVuY3Rpb24gKHNlcmllcywgcGxvdHRlcikgeworCWlmIChzZXJpZXMucGxvdHRlcikgeworCQl0aGlzLnNlcmllcy5wdXNoKHNlcmllcyk7CisJfSBlbHNlIHsKKwkJdGhpcy5zZXJpZXMucHVzaCh7ZGF0YTpzZXJpZXMsIHBsb3R0ZXI6cGxvdHRlciB8fCBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzWyJEZWZhdWx0Il19KTsKKwl9Cit9LCBzZXRBeGlzOmZ1bmN0aW9uIChheGlzLCB3aGljaCkgeworCWlmICh3aGljaC50b0xvd2VyQ2FzZSgpID09ICJ4IikgeworCQl0aGlzLmF4aXNYID0gYXhpczsKKwl9IGVsc2UgeworCQlpZiAod2hpY2gudG9Mb3dlckNhc2UoKSA9PSAieSIpIHsKKwkJCXRoaXMuYXhpc1kgPSBheGlzOworCQl9CisJfQorfSwgZ2V0UmFuZ2VzOmZ1bmN0aW9uICgpIHsKKwl2YXIgeG1pbiwgeG1heCwgeW1pbiwgeW1heDsKKwl4bWluID0geW1pbiA9IE51bWJlci5NQVhfVkFMVUU7CisJeG1heCA9IHltYXggPSBOdW1iZXIuTUlOX1ZBTFVFOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHZhbHVlcyA9IHRoaXMuc2VyaWVzW2ldLmRhdGEuZXZhbHVhdGUoKTsKKwkJZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKKwkJCXZhciBjb21wID0gdmFsdWVzW2pdOworCQkJeG1pbiA9IE1hdGgubWluKGNvbXAueCwgeG1pbik7CisJCQl5bWluID0gTWF0aC5taW4oY29tcC55LCB5bWluKTsKKwkJCXhtYXggPSBNYXRoLm1heChjb21wLngsIHhtYXgpOworCQkJeW1heCA9IE1hdGgubWF4KGNvbXAueSwgeW1heCk7CisJCX0KKwl9CisJcmV0dXJuIHt4Ont1cHBlcjp4bWF4LCBsb3dlcjp4bWlufSwgeTp7dXBwZXI6eW1heCwgbG93ZXI6eW1pbn0sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuICJbIHg6IiArIHhtYXggKyAiIC0gIiArIHhtaW4gKyAiLCB5OiIgKyB5bWF4ICsgIiAtICIgKyB5bWluICsgIl0iOworCX19OworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdmFyIG5vZGUgPSB0aGlzLmRhdGFOb2RlOworCXdoaWxlIChub2RlICYmIG5vZGUuY2hpbGROb2RlcyAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQlub2RlLnJlbW92ZUNoaWxkKG5vZGUuY2hpbGROb2Rlc1swXSk7CisJfQorCXRoaXMuZGF0YU5vZGUgPSBudWxsOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvUGxvdEFyZWEuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvUGxvdEFyZWEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhOTc4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9QbG90QXJlYS5qcwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jaGFydGluZy5QbG90QXJlYSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbG9yIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbG9yLmhzbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNoYXJ0aW5nLlBsb3QiKTsKK2Rvam8uY2hhcnRpbmcuUGxvdEFyZWEgPSBmdW5jdGlvbiAoKSB7CisJdmFyIGlkID0gImRvam8tY2hhcnRpbmctcGxvdGFyZWEtIiArIGRvam8uY2hhcnRpbmcuUGxvdEFyZWEuY291bnQrKzsKKwl0aGlzLmdldElkID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gaWQ7CisJfTsKKwl0aGlzLnNldElkID0gZnVuY3Rpb24gKGtleSkgeworCQlpZCA9IGtleTsKKwl9OworCXRoaXMuYXJlYVR5cGUgPSAic3RhbmRhcmQiOworCXRoaXMucGxvdHMgPSBbXTsKKwl0aGlzLnNpemUgPSB7d2lkdGg6NjAwLCBoZWlnaHQ6NDAwfTsKKwl0aGlzLnBhZGRpbmcgPSB7dG9wOjEwLCByaWdodDoxMCwgYm90dG9tOjIwLCBsZWZ0OjIwfTsKKwl0aGlzLm5vZGVzID0ge21haW46bnVsbCwgYXJlYTpudWxsLCBiYWNrZ3JvdW5kOm51bGwsIGF4ZXM6bnVsbCwgcGxvdHM6bnVsbH07CisJdGhpcy5fY29sb3IgPSB7aDoxNDAsIHM6MTIwLCBsOjEyMCwgc3RlcDoyN307Cit9OworZG9qby5jaGFydGluZy5QbG90QXJlYS5jb3VudCA9IDA7Citkb2pvLmV4dGVuZChkb2pvLmNoYXJ0aW5nLlBsb3RBcmVhLCB7bmV4dENvbG9yOmZ1bmN0aW9uICgpIHsKKwl2YXIgcmdiID0gZG9qby5nZnguY29sb3IuaHNsMnJnYih0aGlzLl9jb2xvci5oLCB0aGlzLl9jb2xvci5zLCB0aGlzLl9jb2xvci5sKTsKKwl0aGlzLl9jb2xvci5oID0gKHRoaXMuX2NvbG9yLmggKyB0aGlzLl9jb2xvci5zdGVwKSAlIDM2MDsKKwl3aGlsZSAodGhpcy5fY29sb3IuaCA8IDE0MCkgeworCQl0aGlzLl9jb2xvci5oICs9IHRoaXMuX2NvbG9yLnN0ZXA7CisJfQorCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4KHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOworfSwgZ2V0QXJlYTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHtsZWZ0OnRoaXMucGFkZGluZy5sZWZ0LCByaWdodDp0aGlzLnNpemUud2lkdGggLSB0aGlzLnBhZGRpbmcucmlnaHQsIHRvcDp0aGlzLnBhZGRpbmcudG9wLCBib3R0b206dGhpcy5zaXplLmhlaWdodCAtIHRoaXMucGFkZGluZy5ib3R0b20sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwkJdmFyIGEgPSBbdGhpcy50b3AsIHRoaXMucmlnaHQsIHRoaXMuYm90dG9tLCB0aGlzLmxlZnRdOworCQlyZXR1cm4gIlsiICsgYS5qb2luKCkgKyAiXSI7CisJfX07Cit9LCBnZXRBeGVzOmZ1bmN0aW9uICgpIHsKKwl2YXIgYXhlcyA9IHt9OworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wbG90cy5sZW5ndGg7IGkrKykgeworCQl2YXIgcGxvdCA9IHRoaXMucGxvdHNbaV07CisJCWF4ZXNbcGxvdC5heGlzWC5nZXRJZCgpXSA9IHtheGlzOnBsb3QuYXhpc1gsIGRyYXdBZ2FpbnN0OnBsb3QuYXhpc1ksIHBsb3Q6cGxvdCwgcGxhbmU6IngifTsKKwkJYXhlc1twbG90LmF4aXNZLmdldElkKCldID0ge2F4aXM6cGxvdC5heGlzWSwgZHJhd0FnYWluc3Q6cGxvdC5heGlzWCwgcGxvdDpwbG90LCBwbGFuZToieSJ9OworCX0KKwlyZXR1cm4gYXhlczsKK30sIGdldExlZ2VuZEluZm86ZnVuY3Rpb24gKCkgeworCXZhciBhID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RzLmxlbmd0aDsgaSsrKSB7CisJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5wbG90c1tpXS5zZXJpZXMubGVuZ3RoOyBqKyspIHsKKwkJCXZhciBkYXRhID0gdGhpcy5wbG90c1tpXS5zZXJpZXNbal0uZGF0YTsKKwkJCWEucHVzaCh7bGFiZWw6ZGF0YS5sYWJlbCwgY29sb3I6ZGF0YS5jb2xvcn0pOworCQl9CisJfQorCXJldHVybiBhOworfSwgc2V0QXhlc1JhbmdlczpmdW5jdGlvbiAoKSB7CisJdmFyIHJhbmdlcyA9IHt9OworCXZhciBheGVzID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBwbG90ID0gdGhpcy5wbG90c1tpXTsKKwkJdmFyIHJhbmdlcyA9IHBsb3QuZ2V0UmFuZ2VzKCk7CisJCXZhciB4ID0gcmFuZ2VzLng7CisJCXZhciB5ID0gcmFuZ2VzLnk7CisJCXZhciBheCwgYXk7CisJCWlmICghYXhlc1twbG90LmF4aXNYLmdldElkKCldKSB7CisJCQlheGVzW3Bsb3QuYXhpc1guZ2V0SWQoKV0gPSBwbG90LmF4aXNYOworCQkJcmFuZ2VzW3Bsb3QuYXhpc1guZ2V0SWQoKV0gPSB7dXBwZXI6eC51cHBlciwgbG93ZXI6eC5sb3dlcn07CisJCX0KKwkJYXggPSByYW5nZXNbcGxvdC5heGlzWC5nZXRJZCgpXTsKKwkJYXgudXBwZXIgPSBNYXRoLm1heChheC51cHBlciwgeC51cHBlcik7CisJCWF4Lmxvd2VyID0gTWF0aC5taW4oYXgubG93ZXIsIHgubG93ZXIpOworCQlpZiAoIWF4ZXNbcGxvdC5heGlzWS5nZXRJZCgpXSkgeworCQkJYXhlc1twbG90LmF4aXNZLmdldElkKCldID0gcGxvdC5heGlzWTsKKwkJCXJhbmdlc1twbG90LmF4aXNZLmdldElkKCldID0ge3VwcGVyOnkudXBwZXIsIGxvd2VyOnkubG93ZXJ9OworCQl9CisJCWF5ID0gcmFuZ2VzW3Bsb3QuYXhpc1kuZ2V0SWQoKV07CisJCWF5LnVwcGVyID0gTWF0aC5tYXgoYXkudXBwZXIsIHkudXBwZXIpOworCQlheS5sb3dlciA9IE1hdGgubWluKGF5Lmxvd2VyLCB5Lmxvd2VyKTsKKwl9CisJZm9yICh2YXIgcCBpbiBheGVzKSB7CisJCWF4ZXNbcF0ucmFuZ2UgPSByYW5nZXNbcF07CisJfQorfSwgcmVuZGVyOmZ1bmN0aW9uIChrd0FyZ3MsIGFwcGx5VG9EYXRhKSB7CisJaWYgKCF0aGlzLm5vZGVzLm1haW4gfHwgIXRoaXMubm9kZXMuYXJlYSB8fCAhdGhpcy5ub2Rlcy5iYWNrZ3JvdW5kIHx8ICF0aGlzLm5vZGVzLnBsb3RzIHx8ICF0aGlzLm5vZGVzLmF4ZXMpIHsKKwkJdGhpcy5pbml0aWFsaXplKCk7CisJfQorCXRoaXMucmVzaXplKCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBwbG90ID0gdGhpcy5wbG90c1tpXTsKKwkJaWYgKHBsb3QuZGF0YU5vZGUpIHsKKwkJCXRoaXMubm9kZXMucGxvdHMucmVtb3ZlQ2hpbGQocGxvdC5kYXRhTm9kZSk7CisJCX0KKwkJdmFyIHRhcmdldCA9IHRoaXMuaW5pdGlhbGl6ZVBsb3QocGxvdCk7CisJCXN3aXRjaCAocGxvdC5yZW5kZXJUeXBlKSB7CisJCSAgY2FzZSBkb2pvLmNoYXJ0aW5nLlJlbmRlclBsb3RTZXJpZXMuR3JvdXBlZDoKKwkJCWlmIChwbG90LnNlcmllc1swXSkgeworCQkJCXRhcmdldC5hcHBlbmRDaGlsZChwbG90LnNlcmllc1swXS5wbG90dGVyKHRoaXMsIHBsb3QsIGt3QXJncywgYXBwbHlUb0RhdGEpKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgIGNhc2UgZG9qby5jaGFydGluZy5SZW5kZXJQbG90U2VyaWVzLlNpbmdseToKKwkJICBkZWZhdWx0OgorCQkJZm9yICh2YXIgaiA9IDA7IGogPCBwbG90LnNlcmllcy5sZW5ndGg7IGorKykgeworCQkJCXZhciBzZXJpZXMgPSBwbG90LnNlcmllc1tqXTsKKwkJCQl2YXIgZGF0YSA9IHNlcmllcy5kYXRhLmV2YWx1YXRlKGt3QXJncyk7CisJCQkJdGFyZ2V0LmFwcGVuZENoaWxkKHNlcmllcy5wbG90dGVyKGRhdGEsIHRoaXMsIHBsb3QsIGFwcGx5VG9EYXRhKSk7CisJCQl9CisJCX0KKwkJdGhpcy5ub2Rlcy5wbG90cy5hcHBlbmRDaGlsZCh0YXJnZXQpOworCX0KK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wbG90cy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnBsb3RzW2ldLmRlc3Ryb3koKTsKKwl9CisJZm9yICh2YXIgcCBpbiB0aGlzLm5vZGVzKSB7CisJCXZhciBub2RlID0gdGhpcy5ub2Rlc1twXTsKKwkJaWYgKCFub2RlKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW5vZGUuY2hpbGROb2RlcykgeworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CisJCQlub2RlLnJlbW92ZUNoaWxkKG5vZGUuY2hpbGROb2Rlc1swXSk7CisJCX0KKwkJdGhpcy5ub2Rlc1twXSA9IG51bGw7CisJfQorfX0pOworZG9qby5yZXF1aXJlSWYoZG9qby5yZW5kZXIuc3ZnLmNhcGFibGUsICJkb2pvLmNoYXJ0aW5nLnN2Zy5QbG90QXJlYSIpOworZG9qby5yZXF1aXJlSWYoZG9qby5yZW5kZXIudm1sLmNhcGFibGUsICJkb2pvLmNoYXJ0aW5nLnZtbC5QbG90QXJlYSIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvUGxvdHRlcnMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvUGxvdHRlcnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MTA4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9QbG90dGVycy5qcwpAQCAtMCwwICsxLDE2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzIik7Citkb2pvLnJlcXVpcmVJZihkb2pvLnJlbmRlci5zdmcuY2FwYWJsZSwgImRvam8uY2hhcnRpbmcuc3ZnLlBsb3R0ZXJzIik7Citkb2pvLnJlcXVpcmVJZihkb2pvLnJlbmRlci52bWwuY2FwYWJsZSwgImRvam8uY2hhcnRpbmcudm1sLlBsb3R0ZXJzIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9SRUFETUUudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwYTQxNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNDYgQEAKK0Rvam8gQ2hhcnRpbmcgRW5naW5lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgRG9qbyBDaGFydGluZyBFbmdpbmUgaXMgYSAoZmFpcmx5KSBjb21wbGV4IG9iamVjdCBzdHJ1Y3R1cmUsIGRlc2lnbmVkCit0byBwcm92aWRlIGFzIG11Y2ggZmxleGliaWxpdHkgYXMgcG9zc2libGUgaW4gdGVybXMgb2YgY2hhcnQgY29uc3RydWN0aW9uLgorVG8gdGhpcyBlbmQsIHRoZSBlbmdpbmUgZGV0YWlscyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworQ2hhcnQKKy0tLVBsb3RBcmVhW10KKy0tLS0tLVBsb3RbXQorLS0tLS0tLS0tQXhpcyAoYXhpc1gpCistLS0tLS0tLS1BeGlzIChheGlzWSkKKy0tLS0tLS0tLVNlcmllc1tdCisKKworQSBDaGFydCBvYmplY3QgaXMgdGhlIG1haW4gZW50aXR5OyBpdCBpcyB0aGUgZW50aXJlIGdyYXBoaWMuICBBIENoYXJ0IG1heQoraGF2ZSBhbnkgbnVtYmVyIG9mIFBsb3RBcmVhIG9iamVjdHMsIHdoaWNoIGFyZSB0aGUgYmFzaWMgY2FudmFzIGFnYWluc3QgCit3aGljaCBkYXRhIGlzIHBsb3R0ZWQuICBBIFBsb3RBcmVhIG1heSBoYXZlIGFueSBudW1iZXIgb2YgUGxvdCBvYmplY3RzLAord2hpY2ggaXMgYSBjb250YWluZXIgcmVwcmVzZW50aW5nIHVwIHRvIDIgYXhlcyBhbmQgYW55IG51bWJlciBvZiBzZXJpZXMKK3RvIGJlIHBsb3R0ZWQgYWdhaW5zdCB0aG9zZSBheGVzOyBhIFNlcmllcyByZXByZXNlbnRzIGEgYmluZGluZyBhZ2FpbnN0Cit0d28gZmllbGRzIGZyb20gYSBkYXRhIHNvdXJjZSAoaW5pdGlhbCByZXYsIHRoaXMgZGF0YSBzb3VyY2UgaXMgYWx3YXlzIG9mCit0eXBlIGRvam8uY29sbGVjdGlvbnMuU3RvcmUgYnV0IHRoaXMgd2lsbCBwcm9iYWJseSBjaGFuZ2Ugb25jZSBkb2pvLmRhdGEKK2lzIGluIHByb2R1Y3Rpb24pLgorCitUaGUgcG9pbnQgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgdG8gYWxsb3cgZm9yIGFzIG11Y2ggZmxleGliaWxpdHkgYXMgcG9zc2libGUKK2luIHRlcm1zIG9mIHdoYXQga2luZHMgb2YgY2hhcnRzIGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGUgZW5naW5lLiAgVGhlCitjdXJyZW50IHBsYW4gaXMgdG8gYWNjb21vZGF0ZSB1cCB0byBhbmFseXRpY2FsIGZpbmFuY2lhbCBjaGFydHMsIHdoaWNoIHRlbmQKK3RvIGhhdmUgMyBwbG90IGFyZWFzIGFuZCBhbnkgbnVtYmVyIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBheGVzIG9uIGVhY2ggb25lLgorCitUaGUgbWFpbiBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgcGllIGNoYXJ0LCB3aGljaCB3aWxsIGhhdmUgaXQncyBvd24KK2N1c3RvbSBjb2RlYmFzZS4gIEFsc28sIDNEIGNoYXJ0cyBhcmUgbm90IGFjY291bnRlZCBmb3IgYXQgdGhpcyB0aW1lLAorYWx0aG91Z2ggdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIHByb2JhYmx5IG5lZWQgdG8gYmUgYWx0ZXJlZCB0byBtYWtlCit0aGF0IHdvcmsgd291bGQgYmUgUGxvdCBhbmQgU2VyaWVzICh0byBhY2NvbW9kYXRlIHRoZSBhZGRpdGlvbmFsIFogYXhpcykuCisKK0ZpbmFsbHksIGEgUGxvdCB3aWxsIHJlbmRlciBpdHMgc2VyaWVzW10gdGhyb3VnaCB0aGUgdXNlIG9mIFBsb3R0ZXJzLCB3aGljaAorYXJlIGN1c3RvbSBtZXRob2RzIHRvIHJlbmRlciBzcGVjaWZpYyB0eXBlcyBvZiBjaGFydHMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbiB0ZXJtcyBvZiB3aWRnZXRzLCB0aGUgYmFzaWMgY29uY2VwdCBpcyB0aGF0IHRoZXJlIGlzIGEgY2VudHJhbCwgc3VwZXItCitmbGV4aWJsZSBDaGFydCB3aWRnZXQgKENoYXJ0LCBvZGRseSBlbm91Z2gpLCBhbmQgdGhlbiBhbnkgbnVtYmVyIG9mIHByZXNldAorY2hhcnQgdHlwZSB3aWRnZXRzLCB0aGF0IGFyZSBiYXNpY2FsbHkgYnVpbHQgdG8gc2VydmUgYSBzaW1wbGUsIGVhc3kgCitwdXJwb3NlLiAgRm9yIGluc3RhbmNlLCBpZiBzb21lb25lIGp1c3QgbmVlZHMgdG8gcGxvdCBhIHNlcmllcyBvZiBsaW5lcywKK3RoZXkgd291bGQgYmUgYmV0dGVyIG9mZiB1c2luZyB0aGUgTGluZUNoYXJ0IHdpZGdldDsgYnV0IGlmIHNvbWVvbmUgbmVlZGVkCit0byBwbG90IGEgY29tYm8gY2hhcnQsIHRoYXQgaGFzIDIgWSBBeGVzIChvbmUgbGluZWFyLCBvbmUgbG9nKSBhZ2FpbnN0IHRoZQorc2FtZSBYIEF4aXMsIHVzaW5nIGxpbmVzIGFuZCBhcmVhcywgdGhlbiB0aGV5IHdpbGwgd2FudCB0byB1c2UgYSBDaGFydCB3aWRnZXQuCitOb3RlIGFsc28gdGhhdCB1bmxpa2Ugb3RoZXIgd2lkZ2V0cywgdGhlIENoYXJ0aW5nIGVuZ2luZSAqY2FuKiBiZSBjYWxsZWQKK2RpcmVjdGx5IGZyb20gc2NyaXB0ICp3aXRob3V0KiB0aGUgbmVlZCBmb3IgdGhlIGFjdHVhbCB3aWRnZXQgZW5naW5lIHRvIGJlCitsb2FkZWQ7IHRoZSBDaGFydCB3aWRnZXRzIGFyZSB0aGluIHdyYXBwZXJzIGFyb3VuZCB0aGUgY2hhcnRpbmcgZW5naW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9TZXJpZXMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvU2VyaWVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvU2VyaWVzLmpzCkBAIC0wLDAgKzEsMTk0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNoYXJ0aW5nLlNlcmllcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uY2hhcnRpbmcuUGxvdHRlcnMiKTsKK2Rvam8uY2hhcnRpbmcuU2VyaWVzID0gZnVuY3Rpb24gKGt3QXJncykgeworCXZhciBhcmdzID0ga3dBcmdzIHx8IHtsZW5ndGg6MX07CisJdGhpcy5kYXRhU291cmNlID0gYXJncy5kYXRhU291cmNlIHx8IG51bGw7CisJdGhpcy5iaW5kaW5ncyA9IHt9OworCXRoaXMuY29sb3IgPSBhcmdzLmNvbG9yOworCXRoaXMubGFiZWwgPSBhcmdzLmxhYmVsOworCWlmIChhcmdzLmJpbmRpbmdzKSB7CisJCWZvciAodmFyIHAgaW4gYXJncy5iaW5kaW5ncykgeworCQkJdGhpcy5hZGRCaW5kaW5nKHAsIGFyZ3MuYmluZGluZ3NbcF0pOworCQl9CisJfQorfTsKK2Rvam8uZXh0ZW5kKGRvam8uY2hhcnRpbmcuU2VyaWVzLCB7YmluZDpmdW5jdGlvbiAoc3JjLCBiaW5kaW5ncykgeworCXRoaXMuZGF0YVNvdXJjZSA9IHNyYzsKKwl0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7Cit9LCBhZGRCaW5kaW5nOmZ1bmN0aW9uIChuYW1lLCBiaW5kaW5nKSB7CisJdGhpcy5iaW5kaW5nc1tuYW1lXSA9IGJpbmRpbmc7Cit9LCBldmFsdWF0ZTpmdW5jdGlvbiAoa3dBcmdzKSB7CisJdmFyIHJldCA9IFtdOworCXZhciBhID0gdGhpcy5kYXRhU291cmNlLmdldERhdGEoKTsKKwl2YXIgbCA9IGEubGVuZ3RoOworCXZhciBzdGFydCA9IDA7CisJdmFyIGVuZCA9IGw7CisJaWYgKGt3QXJncykgeworCQlpZiAoa3dBcmdzLmJldHdlZW4pIHsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CisJCQkJdmFyIGZsZCA9IHRoaXMuZGF0YVNvdXJjZS5nZXRGaWVsZChhW2ldLCBrd0FyZ3MuYmV0d2Vlbi5maWVsZCk7CisJCQkJaWYgKGZsZCA+PSBrd0FyZ3MuYmV0d2Vlbi5sb3cgJiYgZmxkIDw9IGt3QXJncy5iZXR3ZWVuLmhpZ2gpIHsKKwkJCQkJdmFyIG8gPSB7c3JjOmFbaV0sIHNlcmllczp0aGlzfTsKKwkJCQkJZm9yICh2YXIgcCBpbiB0aGlzLmJpbmRpbmdzKSB7CisJCQkJCQlvW3BdID0gdGhpcy5kYXRhU291cmNlLmdldEZpZWxkKGFbaV0sIHRoaXMuYmluZGluZ3NbcF0pOworCQkJCQl9CisJCQkJCXJldC5wdXNoKG8pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChrd0FyZ3MuZnJvbSB8fCBrd0FyZ3MubGVuZ3RoKSB7CisJCQkJaWYgKGt3QXJncy5mcm9tKSB7CisJCQkJCXN0YXJ0ID0gTWF0aC5tYXgoa3dBcmdzLmZyb20sIDApOworCQkJCQlpZiAoa3dBcmdzLnRvKSB7CisJCQkJCQllbmQgPSBNYXRoLm1pbihrd0FyZ3MudG8sIGVuZCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoa3dBcmdzLmxlbmd0aCA8IDApIHsKKwkJCQkJCXN0YXJ0ID0gTWF0aC5tYXgoKGVuZCArIGxlbmd0aCksIDApOworCQkJCQl9IGVsc2UgeworCQkJCQkJZW5kID0gTWF0aC5taW4oKHN0YXJ0ICsgbGVuZ3RoKSwgZW5kKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQkJCQl2YXIgbyA9IHtzcmM6YVtpXSwgc2VyaWVzOnRoaXN9OworCQkJCQlmb3IgKHZhciBwIGluIHRoaXMuYmluZGluZ3MpIHsKKwkJCQkJCW9bcF0gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0RmllbGQoYVtpXSwgdGhpcy5iaW5kaW5nc1twXSk7CisJCQkJCX0KKwkJCQkJcmV0LnB1c2gobyk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKwkJCXZhciBvID0ge3NyYzphW2ldLCBzZXJpZXM6dGhpc307CisJCQlmb3IgKHZhciBwIGluIHRoaXMuYmluZGluZ3MpIHsKKwkJCQlvW3BdID0gdGhpcy5kYXRhU291cmNlLmdldEZpZWxkKGFbaV0sIHRoaXMuYmluZGluZ3NbcF0pOworCQkJfQorCQkJcmV0LnB1c2gobyk7CisJCX0KKwl9CisJaWYgKHJldC5sZW5ndGggPiAwICYmIHR5cGVvZiAocmV0WzBdLngpICE9ICJ1bmRlZmluZWQiKSB7CisJCXJldC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisJCQlpZiAoYS54ID4gYi54KSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAoYS54IDwgYi54KSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0pOworCX0KKwlyZXR1cm4gcmV0OworfSwgdHJlbmRzOntjcmVhdGVSYW5nZTpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgaWR4ID0gdmFsdWVzLmxlbmd0aCAtIDE7CisJdmFyIGxlbmd0aCA9IChsZW4gfHwgdmFsdWVzLmxlbmd0aCk7CisJcmV0dXJuIHsiaW5kZXgiOmlkeCwgImxlbmd0aCI6bGVuZ3RoLCAic3RhcnQiOk1hdGgubWF4KGlkeCAtIGxlbmd0aCwgMCl9OworfSwgbWVhbjpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgdG90YWwgPSAwOworCXZhciBjb3VudCA9IDA7CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdG90YWwgKz0gdmFsdWVzW2ldLnk7CisJCWNvdW50Kys7CisJfQorCXRvdGFsIC89IE1hdGgubWF4KGNvdW50LCAxKTsKKwlyZXR1cm4gdG90YWw7Cit9LCB2YXJpYW5jZTpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgdG90YWwgPSAwOworCXZhciBzcXVhcmUgPSAwOworCXZhciBjb3VudCA9IDA7CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdG90YWwgKz0gdmFsdWVzW2ldLnk7CisJCXNxdWFyZSArPSBNYXRoLnBvdyh2YWx1ZXNbaV0ueSwgMik7CisJCWNvdW50Kys7CisJfQorCXJldHVybiAoc3F1YXJlIC8gY291bnQpIC0gTWF0aC5wb3codG90YWwgLyBjb3VudCwgMik7Cit9LCBzdGFuZGFyZERldmlhdGlvbjpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwlyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZ2V0VmFyaWFuY2UodmFsdWVzLCBsZW4pKTsKK30sIG1heDpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTsKKwlmb3IgKHZhciBpID0gcmFuZ2UuaW5kZXg7IGkgPj0gcmFuZ2Uuc3RhcnQ7IGktLSkgeworCQltYXggPSBNYXRoLm1heCh2YWx1ZXNbaV0ueSwgbWF4KTsKKwl9CisJcmV0dXJuIG1heDsKK30sIG1pbjpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKKwlmb3IgKHZhciBpID0gcmFuZ2UuaW5kZXg7IGkgPj0gcmFuZ2Uuc3RhcnQ7IGktLSkgeworCQltaW4gPSBNYXRoLm1pbih2YWx1ZXNbaV0ueSwgbWluKTsKKwl9CisJcmV0dXJuIG1pbjsKK30sIG1lZGlhbjpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgYSA9IFtdOworCWZvciAodmFyIGkgPSByYW5nZS5pbmRleDsgaSA+PSByYW5nZS5zdGFydDsgaS0tKSB7CisJCXZhciBiID0gZmFsc2U7CisJCWZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgeworCQkJaWYgKHZhbHVlc1tpXS55ID09IGFbal0pIHsKKwkJCQliID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWIpIHsKKwkJCWEucHVzaCh2YWx1ZXNbaV0ueSk7CisJCX0KKwl9CisJYS5zb3J0KCk7CisJaWYgKGEubGVuZ3RoID4gMCkgeworCQlyZXR1cm4gYVtNYXRoLmNlaWwoYS5sZW5ndGggLyAyKV07CisJfQorCXJldHVybiAwOworfSwgbW9kZTpmdW5jdGlvbiAodmFsdWVzLCBsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKHZhbHVlcywgbGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgbyA9IHt9OworCXZhciByZXQgPSAwOworCXZhciBtZWRpYW4gPSBOdW1iZXIuTUlOX1ZBTFVFOworCWZvciAodmFyIGkgPSByYW5nZS5pbmRleDsgaSA+PSByYW5nZS5zdGFydDsgaS0tKSB7CisJCWlmICghb1t2YWx1ZXNbaV0ueV0pIHsKKwkJCW9bdmFsdWVzW2ldLnldID0gMTsKKwkJfSBlbHNlIHsKKwkJCW9bdmFsdWVzW2ldLnldKys7CisJCX0KKwl9CisJZm9yICh2YXIgcCBpbiBvKSB7CisJCWlmIChtZWRpYW4gPCBvW3BdKSB7CisJCQltZWRpYW4gPSBvW3BdOworCQkJcmV0ID0gcDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfX19KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjc5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jaGFydGluZy4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9zdmcvQXhpcy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy9zdmcvQXhpcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTlmY2VjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3N2Zy9BeGlzLmpzCkBAIC0wLDAgKzEsMTg4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNoYXJ0aW5nLnN2Zy5BeGlzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2lmIChkb2pvLnJlbmRlci5zdmcuY2FwYWJsZSkgeworCWRvam8uZXh0ZW5kKGRvam8uY2hhcnRpbmcuQXhpcywge3JlbmRlckxpbmVzOmZ1bmN0aW9uIChwbG90QXJlYSwgcGxvdCwgcGxhbmUpIHsKKwkJaWYgKHRoaXMubm9kZXMubGluZXMpIHsKKwkJCXdoaWxlICh0aGlzLm5vZGVzLmxpbmVzLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQkJCXRoaXMubm9kZXMubGluZXMucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5saW5lcy5jaGlsZE5vZGVzWzBdKTsKKwkJCX0KKwkJCWlmICh0aGlzLm5vZGVzLmxpbmVzLnBhcmVudE5vZGUpIHsKKwkJCQl0aGlzLm5vZGVzLmxpbmVzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5saW5lcyk7CisJCQkJdGhpcy5ub2Rlcy5saW5lcyA9IG51bGw7CisJCQl9CisJCX0KKwkJdmFyIGFyZWEgPSBwbG90QXJlYS5nZXRBcmVhKCk7CisJCXZhciBnID0gdGhpcy5ub2Rlcy5saW5lcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCWcuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItbGluZXMiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICh0aGlzLl9sYWJlbHNbaV0udmFsdWUgPT0gdGhpcy5vcmlnaW4pIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciB2ID0gdGhpcy5nZXRDb29yZCh0aGlzLl9sYWJlbHNbaV0udmFsdWUsIHBsb3RBcmVhLCBwbG90KTsKKwkJCXZhciBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImxpbmUiKTsKKwkJCWwuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJzdHJva2U6Izk5OTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1kYXNoYXJyYXk6MSw0OyIpOworCQkJaWYgKHBsYW5lID09ICJ4IikgeworCQkJCWwuc2V0QXR0cmlidXRlKCJ5MSIsIGFyZWEudG9wKTsKKwkJCQlsLnNldEF0dHJpYnV0ZSgieTIiLCBhcmVhLmJvdHRvbSk7CisJCQkJbC5zZXRBdHRyaWJ1dGUoIngxIiwgdik7CisJCQkJbC5zZXRBdHRyaWJ1dGUoIngyIiwgdik7CisJCQl9IGVsc2UgeworCQkJCWlmIChwbGFuZSA9PSAieSIpIHsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoInkxIiwgdik7CisJCQkJCWwuc2V0QXR0cmlidXRlKCJ5MiIsIHYpOworCQkJCQlsLnNldEF0dHJpYnV0ZSgieDEiLCBhcmVhLmxlZnQpOworCQkJCQlsLnNldEF0dHJpYnV0ZSgieDIiLCBhcmVhLnJpZ2h0KTsKKwkJCQl9CisJCQl9CisJCQlnLmFwcGVuZENoaWxkKGwpOworCQl9CisJCXJldHVybiBnOworCX0sIHJlbmRlclRpY2tzOmZ1bmN0aW9uIChwbG90QXJlYSwgcGxvdCwgcGxhbmUsIGNvb3JkKSB7CisJCWlmICh0aGlzLm5vZGVzLnRpY2tzKSB7CisJCQl3aGlsZSAodGhpcy5ub2Rlcy50aWNrcy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJCQl0aGlzLm5vZGVzLnRpY2tzLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMudGlja3MuY2hpbGROb2Rlc1swXSk7CisJCQl9CisJCQlpZiAodGhpcy5ub2Rlcy50aWNrcy5wYXJlbnROb2RlKSB7CisJCQkJdGhpcy5ub2Rlcy50aWNrcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMudGlja3MpOworCQkJCXRoaXMubm9kZXMudGlja3MgPSBudWxsOworCQkJfQorCQl9CisJCXZhciBnID0gdGhpcy5ub2Rlcy50aWNrcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCWcuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItdGlja3MiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB2ID0gdGhpcy5nZXRDb29yZCh0aGlzLl9sYWJlbHNbaV0udmFsdWUsIHBsb3RBcmVhLCBwbG90KTsKKwkJCXZhciBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImxpbmUiKTsKKwkJCWwuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB0OyIpOworCQkJaWYgKHBsYW5lID09ICJ4IikgeworCQkJCWwuc2V0QXR0cmlidXRlKCJ5MSIsIGNvb3JkKTsKKwkJCQlsLnNldEF0dHJpYnV0ZSgieTIiLCBjb29yZCArIDMpOworCQkJCWwuc2V0QXR0cmlidXRlKCJ4MSIsIHYpOworCQkJCWwuc2V0QXR0cmlidXRlKCJ4MiIsIHYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGxhbmUgPT0gInkiKSB7CisJCQkJCWwuc2V0QXR0cmlidXRlKCJ5MSIsIHYpOworCQkJCQlsLnNldEF0dHJpYnV0ZSgieTIiLCB2KTsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoIngxIiwgY29vcmQgLSAyKTsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoIngyIiwgY29vcmQgKyAyKTsKKwkJCQl9CisJCQl9CisJCQlnLmFwcGVuZENoaWxkKGwpOworCQl9CisJCXJldHVybiBnOworCX0sIHJlbmRlckxhYmVsczpmdW5jdGlvbiAocGxvdEFyZWEsIHBsb3QsIHBsYW5lLCBjb29yZCwgdGV4dFNpemUsIGFuY2hvcikgeworCQlmdW5jdGlvbiBjcmVhdGVMYWJlbChsYWJlbCwgeCwgeSwgdGV4dFNpemUsIGFuY2hvcikgeworCQkJdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAidGV4dCIpOworCQkJdGV4dC5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCXRleHQuc2V0QXR0cmlidXRlKCJ5IiwgKHBsYW5lID09ICJ4IiA/IHkgOiB5ICsgMikpOworCQkJdGV4dC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYW5jaG9yOiIgKyBhbmNob3IgKyAiO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOiIgKyB0ZXh0U2l6ZSArICJweDtmaWxsOiMwMDA7Iik7CisJCQl0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxhYmVsKSk7CisJCQlyZXR1cm4gdGV4dDsKKwkJfQorCQlpZiAodGhpcy5ub2Rlcy5sYWJlbHMpIHsKKwkJCXdoaWxlICh0aGlzLm5vZGVzLmxhYmVscy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJCQl0aGlzLm5vZGVzLmxhYmVscy5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmxhYmVscy5jaGlsZE5vZGVzWzBdKTsKKwkJCX0KKwkJCWlmICh0aGlzLm5vZGVzLmxhYmVscy5wYXJlbnROb2RlKSB7CisJCQkJdGhpcy5ub2Rlcy5sYWJlbHMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmxhYmVscyk7CisJCQkJdGhpcy5ub2Rlcy5sYWJlbHMgPSBudWxsOworCQkJfQorCQl9CisJCXZhciBnID0gdGhpcy5ub2Rlcy5sYWJlbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQlnLnNldEF0dHJpYnV0ZSgiaWQiLCB0aGlzLmdldElkKCkgKyAiLWxhYmVscyIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHYgPSB0aGlzLmdldENvb3JkKHRoaXMuX2xhYmVsc1tpXS52YWx1ZSwgcGxvdEFyZWEsIHBsb3QpOworCQkJaWYgKHBsYW5lID09ICJ4IikgeworCQkJCWcuYXBwZW5kQ2hpbGQoY3JlYXRlTGFiZWwodGhpcy5fbGFiZWxzW2ldLmxhYmVsLCB2LCBjb29yZCwgdGV4dFNpemUsIGFuY2hvcikpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGxhbmUgPT0gInkiKSB7CisJCQkJCWcuYXBwZW5kQ2hpbGQoY3JlYXRlTGFiZWwodGhpcy5fbGFiZWxzW2ldLmxhYmVsLCBjb29yZCwgdiwgdGV4dFNpemUsIGFuY2hvcikpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZzsKKwl9LCByZW5kZXI6ZnVuY3Rpb24gKHBsb3RBcmVhLCBwbG90LCBkcmF3QWdhaW5zdCwgcGxhbmUpIHsKKwkJaWYgKCF0aGlzLl9yZXJlbmRlciAmJiB0aGlzLm5vZGVzLm1haW4pIHsKKwkJCXJldHVybiB0aGlzLm5vZGVzLm1haW47CisJCX0KKwkJdGhpcy5fcmVyZW5kZXIgPSBmYWxzZTsKKwkJdmFyIGFyZWEgPSBwbG90QXJlYS5nZXRBcmVhKCk7CisJCXZhciBzdHJva2UgPSAxOworCQl2YXIgc3R5bGUgPSAic3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOiIgKyBzdHJva2UgKyAicHg7IjsKKwkJdmFyIHRleHRTaXplID0gMTA7CisJCXZhciBjb29yZCA9IGRyYXdBZ2FpbnN0LmdldENvb3JkKHRoaXMub3JpZ2luLCBwbG90QXJlYSwgcGxvdCk7CisJCXRoaXMubm9kZXMubWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCXZhciBnID0gdGhpcy5ub2Rlcy5tYWluOworCQlnLnNldEF0dHJpYnV0ZSgiaWQiLCB0aGlzLmdldElkKCkpOworCQl2YXIgbGluZSA9IHRoaXMubm9kZXMuYXhpcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJsaW5lIik7CisJCWlmIChwbGFuZSA9PSAieCIpIHsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ5MSIsIGNvb3JkKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ5MiIsIGNvb3JkKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIGFyZWEubGVmdCAtIHN0cm9rZSk7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgieDIiLCBhcmVhLnJpZ2h0ICsgc3Ryb2tlKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsIHN0eWxlKTsKKwkJCXZhciB5ID0gY29vcmQgKyB0ZXh0U2l6ZSArIDI7CisJCQlpZiAodGhpcy5zaG93TGluZXMpIHsKKwkJCQlnLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTGluZXMocGxvdEFyZWEsIHBsb3QsIHBsYW5lLCB5KSk7CisJCQl9CisJCQlpZiAodGhpcy5zaG93VGlja3MpIHsKKwkJCQlnLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyVGlja3MocGxvdEFyZWEsIHBsb3QsIHBsYW5lLCBjb29yZCkpOworCQkJfQorCQkJaWYgKHRoaXMuc2hvd0xhYmVscykgeworCQkJCWcuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJMYWJlbHMocGxvdEFyZWEsIHBsb3QsIHBsYW5lLCB5LCB0ZXh0U2l6ZSwgIm1pZGRsZSIpKTsKKwkJCX0KKwkJCWlmICh0aGlzLnNob3dMYWJlbCAmJiB0aGlzLmxhYmVsKSB7CisJCQkJdmFyIHggPSBwbG90QXJlYS5zaXplLndpZHRoIC8gMjsKKwkJCQl2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJ0ZXh0Iik7CisJCQkJdGV4dC5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCQl0ZXh0LnNldEF0dHJpYnV0ZSgieSIsIChjb29yZCArICh0ZXh0U2l6ZSAqIDIpICsgKHRleHRTaXplIC8gMikpKTsKKwkJCQl0ZXh0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAidGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6IiArICh0ZXh0U2l6ZSArIDIpICsgInB4O2ZpbGw6IzAwMDsiKTsKKwkJCQl0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubGFiZWwpKTsKKwkJCQlnLmFwcGVuZENoaWxkKHRleHQpOworCQkJfQorCQl9IGVsc2UgeworCQkJbGluZS5zZXRBdHRyaWJ1dGUoIngxIiwgY29vcmQpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoIngyIiwgY29vcmQpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInkxIiwgYXJlYS50b3ApOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInkyIiwgYXJlYS5ib3R0b20pOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgc3R5bGUpOworCQkJdmFyIGlzTWF4ID0gdGhpcy5vcmlnaW4gPT0gZHJhd0FnYWluc3QucmFuZ2UudXBwZXI7CisJCQl2YXIgeCA9IGNvb3JkICsgKGlzTWF4ID8gNCA6IC00KTsKKwkJCXZhciBhbmNob3IgPSBpc01heCA/ICJzdGFydCIgOiAiZW5kIjsKKwkJCWlmICh0aGlzLnNob3dMaW5lcykgeworCQkJCWcuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJMaW5lcyhwbG90QXJlYSwgcGxvdCwgcGxhbmUsIHgpKTsKKwkJCX0KKwkJCWlmICh0aGlzLnNob3dUaWNrcykgeworCQkJCWcuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJUaWNrcyhwbG90QXJlYSwgcGxvdCwgcGxhbmUsIGNvb3JkKSk7CisJCQl9CisJCQlpZiAodGhpcy5zaG93TGFiZWxzKSB7CisJCQkJZy5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlckxhYmVscyhwbG90QXJlYSwgcGxvdCwgcGxhbmUsIHgsIHRleHRTaXplLCBhbmNob3IpKTsKKwkJCX0KKwkJCWlmICh0aGlzLnNob3dMYWJlbCAmJiB0aGlzLmxhYmVsKSB7CisJCQkJdmFyIHggPSBpc01heCA/IChjb29yZCArICh0ZXh0U2l6ZSAqIDIpICsgKHRleHRTaXplIC8gMikpIDogKGNvb3JkIC0gKHRleHRTaXplICogNCkpOworCQkJCXZhciB5ID0gcGxvdEFyZWEuc2l6ZS5oZWlnaHQgLyAyOworCQkJCXZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInRleHQiKTsKKwkJCQl0ZXh0LnNldEF0dHJpYnV0ZSgieCIsIHgpOworCQkJCXRleHQuc2V0QXR0cmlidXRlKCJ5IiwgeSk7CisJCQkJdGV4dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJyb3RhdGUoOTAsICIgKyB4ICsgIiwgIiArIHkgKyAiKSIpOworCQkJCXRleHQuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToiICsgKHRleHRTaXplICsgMikgKyAicHg7ZmlsbDojMDAwOyIpOworCQkJCXRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5sYWJlbCkpOworCQkJCWcuYXBwZW5kQ2hpbGQodGV4dCk7CisJCQl9CisJCX0KKwkJZy5hcHBlbmRDaGlsZChsaW5lKTsKKwkJcmV0dXJuIGc7CisJfX0pOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvc3ZnL1Bsb3RBcmVhLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3N2Zy9QbG90QXJlYS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNmYmFhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3N2Zy9QbG90QXJlYS5qcwpAQCAtMCwwICsxLDc3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNoYXJ0aW5nLnN2Zy5QbG90QXJlYSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7CitpZiAoZG9qby5yZW5kZXIuc3ZnLmNhcGFibGUpIHsKKwlkb2pvLnJlcXVpcmUoImRvam8uc3ZnIik7CisJZG9qby5leHRlbmQoZG9qby5jaGFydGluZy5QbG90QXJlYSwge3Jlc2l6ZTpmdW5jdGlvbiAoKSB7CisJCXZhciBhcmVhID0gdGhpcy5nZXRBcmVhKCk7CisJCXRoaXMubm9kZXMuYXJlYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdGhpcy5zaXplLndpZHRoKTsKKwkJdGhpcy5ub2Rlcy5hcmVhLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgdGhpcy5zaXplLmhlaWdodCk7CisJCXZhciByZWN0ID0gdGhpcy5ub2Rlcy5hcmVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJyZWN0IilbMF07CisJCXJlY3Quc2V0QXR0cmlidXRlKCJ4IiwgYXJlYS5sZWZ0KTsKKwkJcmVjdC5zZXRBdHRyaWJ1dGUoInkiLCBhcmVhLnRvcCk7CisJCXJlY3Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpOworCQlyZWN0LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgYXJlYS5ib3R0b20gLSBhcmVhLnRvcCk7CisJCXRoaXMubm9kZXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdGhpcy5zaXplLndpZHRoKTsKKwkJdGhpcy5ub2Rlcy5iYWNrZ3JvdW5kLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgdGhpcy5zaXplLmhlaWdodCk7CisJCWlmICh0aGlzLm5vZGVzLnBsb3RzKSB7CisJCQl0aGlzLm5vZGVzLmFyZWEucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5wbG90cyk7CisJCQl0aGlzLm5vZGVzLnBsb3RzID0gbnVsbDsKKwkJfQorCQl0aGlzLm5vZGVzLnBsb3RzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImciKTsKKwkJdGhpcy5ub2Rlcy5wbG90cy5zZXRBdHRyaWJ1dGUoImlkIiwgdGhpcy5nZXRJZCgpICsgIi1wbG90cyIpOworCQl0aGlzLm5vZGVzLnBsb3RzLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiY2xpcC1wYXRoOnVybCgjIiArIHRoaXMuZ2V0SWQoKSArICItY2xpcCk7Iik7CisJCXRoaXMubm9kZXMuYXJlYS5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLnBsb3RzKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RzLmxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLm5vZGVzLnBsb3RzLmFwcGVuZENoaWxkKHRoaXMuaW5pdGlhbGl6ZVBsb3QodGhpcy5wbG90c1tpXSkpOworCQl9CisJCWlmICh0aGlzLm5vZGVzLmF4ZXMpIHsKKwkJCXRoaXMubm9kZXMuYXJlYS5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmF4ZXMpOworCQkJdGhpcy5ub2Rlcy5heGVzID0gbnVsbDsKKwkJfQorCQl0aGlzLm5vZGVzLmF4ZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl0aGlzLm5vZGVzLmF4ZXMuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItYXhlcyIpOworCQl0aGlzLm5vZGVzLmFyZWEuYXBwZW5kQ2hpbGQodGhpcy5ub2Rlcy5heGVzKTsKKwkJdmFyIGF4ZXMgPSB0aGlzLmdldEF4ZXMoKTsKKwkJZm9yICh2YXIgcCBpbiBheGVzKSB7CisJCQl2YXIgb2JqID0gYXhlc1twXTsKKwkJCXRoaXMubm9kZXMuYXhlcy5hcHBlbmRDaGlsZChvYmouYXhpcy5pbml0aWFsaXplKHRoaXMsIG9iai5wbG90LCBvYmouZHJhd0FnYWluc3QsIG9iai5wbGFuZSkpOworCQl9CisJfSwgaW5pdGlhbGl6ZVBsb3Q6ZnVuY3Rpb24gKHBsb3QpIHsKKwkJcGxvdC5kZXN0cm95KCk7CisJCXBsb3QuZGF0YU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQlwbG90LmRhdGFOb2RlLnNldEF0dHJpYnV0ZSgiaWQiLCBwbG90LmdldElkKCkpOworCQlyZXR1cm4gcGxvdC5kYXRhTm9kZTsKKwl9LCBpbml0aWFsaXplOmZ1bmN0aW9uICgpIHsKKwkJdGhpcy5kZXN0cm95KCk7CisJCXRoaXMubm9kZXMubWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQl0aGlzLm5vZGVzLmFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAic3ZnIik7CisJCXRoaXMubm9kZXMuYXJlYS5zZXRBdHRyaWJ1dGUoImlkIiwgdGhpcy5nZXRJZCgpKTsKKwkJdGhpcy5ub2Rlcy5tYWluLmFwcGVuZENoaWxkKHRoaXMubm9kZXMuYXJlYSk7CisJCXZhciBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImRlZnMiKTsKKwkJdmFyIGNsaXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiY2xpcFBhdGgiKTsKKwkJY2xpcC5zZXRBdHRyaWJ1dGUoImlkIiwgdGhpcy5nZXRJZCgpICsgIi1jbGlwIik7CisJCXZhciByZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInJlY3QiKTsKKwkJY2xpcC5hcHBlbmRDaGlsZChyZWN0KTsKKwkJZGVmcy5hcHBlbmRDaGlsZChjbGlwKTsKKwkJdGhpcy5ub2Rlcy5hcmVhLmFwcGVuZENoaWxkKGRlZnMpOworCQl0aGlzLm5vZGVzLmJhY2tncm91bmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicmVjdCIpOworCQl0aGlzLm5vZGVzLmJhY2tncm91bmQuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItYmFja2dyb3VuZCIpOworCQl0aGlzLm5vZGVzLmJhY2tncm91bmQuc2V0QXR0cmlidXRlKCJmaWxsIiwgIiNmZmYiKTsKKwkJdGhpcy5ub2Rlcy5hcmVhLmFwcGVuZENoaWxkKHRoaXMubm9kZXMuYmFja2dyb3VuZCk7CisJCXRoaXMucmVzaXplKCk7CisJCXJldHVybiB0aGlzLm5vZGVzLm1haW47CisJfX0pOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvc3ZnL1Bsb3R0ZXJzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3N2Zy9QbG90dGVycy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjVkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3N2Zy9QbG90dGVycy5qcwpAQCAtMCwwICsxLDcwMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jaGFydGluZy5zdmcuUGxvdHRlcnMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworaWYgKGRvam8ucmVuZGVyLnN2Zy5jYXBhYmxlKSB7CisJZG9qby5yZXF1aXJlKCJkb2pvLnN2ZyIpOworCWRvam8ubWl4aW4oZG9qby5jaGFydGluZy5QbG90dGVycywge0JhcjpmdW5jdGlvbiAocGxvdGFyZWEsIHBsb3QsIGt3QXJncywgYXBwbHlUbykgeworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImciKTsKKwkJdmFyIG4gPSBwbG90LnNlcmllcy5sZW5ndGg7CisJCXZhciBkYXRhID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgdG1wID0gcGxvdC5zZXJpZXNbaV0uZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJZGF0YS5wdXNoKHRtcCk7CisJCX0KKwkJdmFyIHNwYWNlID0gODsKKwkJdmFyIG5Qb2ludHMgPSBkYXRhWzBdLmxlbmd0aDsKKwkJaWYgKG5Qb2ludHMgPT0gMCkgeworCQkJcmV0dXJuIGdyb3VwOworCQl9CisJCXZhciB3aWR0aCA9ICgoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgLSAoc3BhY2UgKiAoblBvaW50cyAtIDEpKSkgLyBuUG9pbnRzOworCQl2YXIgYmFyV2lkdGggPSB3aWR0aCAvIG47CisJCXZhciB5T3JpZ2luID0gcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworCQkJdmFyIHhTdGFydCA9IGFyZWEubGVmdCArICh3aWR0aCAqIGkpICsgKHNwYWNlICogaSk7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykgeworCQkJCXZhciB2YWx1ZSA9IGRhdGFbal1baV0ueTsKKwkJCQl2YXIgeUEgPSB5T3JpZ2luOworCQkJCXZhciB4ID0geFN0YXJ0ICsgKGJhcldpZHRoICogaik7CisJCQkJdmFyIHkgPSBwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlLCBwbG90YXJlYSwgcGxvdCk7CisJCQkJdmFyIGggPSBNYXRoLmFicyh5QSAtIHkpOworCQkJCWlmICh2YWx1ZSA8IHBsb3QuYXhpc1gub3JpZ2luKSB7CisJCQkJCXlBID0geTsKKwkJCQkJeSA9IHlPcmlnaW47CisJCQkJfQorCQkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicmVjdCIpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2pdW2ldLnNlcmllcy5jb2xvcik7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJ4IiwgeCk7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgieSIsIHkpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgYmFyV2lkdGgpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIGgpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjYiKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGJhciwgZGF0YVtqXVtpXS5zcmMpOworCQkJCX0KKwkJCQlncm91cC5hcHBlbmRDaGlsZChiYXIpOworCQkJfQorCQl9CisJCXJldHVybiBncm91cDsKKwl9LCBIb3Jpem9udGFsQmFyOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IHBsb3Quc2VyaWVzLmxlbmd0aDsKKwkJdmFyIGRhdGEgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXZhciB0bXAgPSBwbG90LnNlcmllc1tpXS5kYXRhLmV2YWx1YXRlKGt3QXJncyk7CisJCQlkYXRhLnB1c2godG1wKTsKKwkJfQorCQl2YXIgc3BhY2UgPSA2OworCQl2YXIgblBvaW50cyA9IGRhdGFbMF0ubGVuZ3RoOworCQlpZiAoblBvaW50cyA9PSAwKSB7CisJCQlyZXR1cm4gZ3JvdXA7CisJCX0KKwkJdmFyIGggPSAoKGFyZWEuYm90dG9tIC0gYXJlYS50b3ApIC0gKHNwYWNlICogKG5Qb2ludHMgLSAxKSkpIC8gblBvaW50czsKKwkJdmFyIGJhckggPSBoIC8gbjsKKwkJdmFyIHhPcmlnaW4gPSBwbG90LmF4aXNYLmdldENvb3JkKDAsIHBsb3RhcmVhLCBwbG90KTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKwkJCXZhciB5U3RhcnQgPSBhcmVhLnRvcCArIChoICogaSkgKyAoc3BhY2UgKiBpKTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7CisJCQkJdmFyIHZhbHVlID0gZGF0YVtqXVtpXS55OworCQkJCXZhciB5ID0geVN0YXJ0ICsgKGJhckggKiBqKTsKKwkJCQl2YXIgeEEgPSB4T3JpZ2luOworCQkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZSwgcGxvdGFyZWEsIHBsb3QpOworCQkJCXZhciB3ID0gTWF0aC5hYnMoeCAtIHhBKTsKKwkJCQlpZiAodmFsdWUgPiAwKSB7CisJCQkJCXggPSB4T3JpZ2luOworCQkJCX0KKwkJCQl2YXIgYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInJlY3QiKTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtqXVtpXS5zZXJpZXMuY29sb3IpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIwIik7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgieCIsIHhBKTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJ5IiwgeSk7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgid2lkdGgiLCB3KTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBiYXJIKTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC42Iik7CisJCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQkJYXBwbHlUbyhiYXIsIGRhdGFbal1baV0uc3JjKTsKKwkJCQl9CisJCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoYmFyKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgR2FudHQ6ZnVuY3Rpb24gKHBsb3RhcmVhLCBwbG90LCBrd0FyZ3MsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCXZhciBuID0gcGxvdC5zZXJpZXMubGVuZ3RoOworCQl2YXIgZGF0YSA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHRtcCA9IHBsb3Quc2VyaWVzW2ldLmRhdGEuZXZhbHVhdGUoa3dBcmdzKTsKKwkJCWRhdGEucHVzaCh0bXApOworCQl9CisJCXZhciBzcGFjZSA9IDI7CisJCXZhciBuUG9pbnRzID0gZGF0YVswXS5sZW5ndGg7CisJCWlmIChuUG9pbnRzID09IDApIHsKKwkJCXJldHVybiBncm91cDsKKwkJfQorCQl2YXIgaCA9ICgoYXJlYS5ib3R0b20gLSBhcmVhLnRvcCkgLSAoc3BhY2UgKiAoblBvaW50cyAtIDEpKSkgLyBuUG9pbnRzOworCQl2YXIgYmFySCA9IGggLyBuOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworCQkJdmFyIHlTdGFydCA9IGFyZWEudG9wICsgKGggKiBpKSArIChzcGFjZSAqIGkpOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCQl2YXIgaGlnaCA9IGRhdGFbal1baV0uaGlnaDsKKwkJCQl2YXIgbG93ID0gZGF0YVtqXVtpXS5sb3c7CisJCQkJaWYgKGxvdyA+IGhpZ2gpIHsKKwkJCQkJdmFyIHQgPSBoaWdoOworCQkJCQloaWdoID0gbG93OworCQkJCQlsb3cgPSB0OworCQkJCX0KKwkJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQobG93LCBwbG90YXJlYSwgcGxvdCk7CisJCQkJdmFyIHcgPSBwbG90LmF4aXNYLmdldENvb3JkKGhpZ2gsIHBsb3RhcmVhLCBwbG90KSAtIHg7CisJCQkJdmFyIHkgPSB5U3RhcnQgKyAoYmFySCAqIGopOworCQkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicmVjdCIpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2pdW2ldLnNlcmllcy5jb2xvcik7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJ4IiwgeCk7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgieSIsIHkpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdyk7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgYmFySCk7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgIjAuNiIpOworCQkJCWlmIChhcHBseVRvKSB7CisJCQkJCWFwcGx5VG8oYmFyLCBkYXRhW2pdW2ldLnNyYyk7CisJCQkJfQorCQkJCWdyb3VwLmFwcGVuZENoaWxkKGJhcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIFN0YWNrZWRBcmVhOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IHBsb3Quc2VyaWVzLmxlbmd0aDsKKwkJdmFyIGRhdGEgPSBbXTsKKwkJdmFyIHRvdGFscyA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHRtcCA9IHBsb3Quc2VyaWVzW2ldLmRhdGEuZXZhbHVhdGUoa3dBcmdzKTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgaisrKSB7CisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQl0b3RhbHMucHVzaCh0bXBbal0ueSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdG90YWxzW2pdICs9IHRtcFtqXS55OworCQkJCX0KKwkJCQl0bXBbal0ueSA9IHRvdGFsc1tqXTsKKwkJCX0KKwkJCWRhdGEucHVzaCh0bXApOworCQl9CisJCWZvciAodmFyIGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCXZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInBhdGgiKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtpXVswXS5zZXJpZXMuY29sb3IpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjQiKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2UiLCBkYXRhW2ldWzBdLnNlcmllcy5jb2xvcik7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjEiKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsICIwLjg1Iik7CisJCQl2YXIgY21kID0gW107CisJCQl2YXIgciA9IDM7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHsKKwkJCQl2YXIgdmFsdWVzID0gZGF0YVtpXTsKKwkJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQodmFsdWVzW2pdLngsIHBsb3RhcmVhLCBwbG90KTsKKwkJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCQlpZiAoaiA9PSAwKSB7CisJCQkJCWNtZC5wdXNoKCJNIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJY21kLnB1c2goIkwiKTsKKwkJCQl9CisJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImNpcmNsZSIpOworCQkJCWMuc2V0QXR0cmlidXRlKCJjeCIsIHgpOworCQkJCWMuc2V0QXR0cmlidXRlKCJjeSIsIHkpOworCQkJCWMuc2V0QXR0cmlidXRlKCJyIiwgIjMiKTsKKwkJCQljLnNldEF0dHJpYnV0ZSgiZmlsbCIsIHZhbHVlc1tqXS5zZXJpZXMuY29sb3IpOworCQkJCWMuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC42Iik7CisJCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIxIik7CisJCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgIjAuODUiKTsKKwkJCQlncm91cC5hcHBlbmRDaGlsZChjKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIkwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQljbWQucHVzaCgiTCIpOworCQkJCWNtZC5wdXNoKHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVswXVswXS54LCBwbG90YXJlYSwgcGxvdCkgKyAiLCIgKyBwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpOworCQkJCWNtZC5wdXNoKCJaIik7CisJCQl9IGVsc2UgeworCQkJCXZhciB2YWx1ZXMgPSBkYXRhW2kgLSAxXTsKKwkJCQljbWQucHVzaCgiTCIpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS55LCBwbG90YXJlYSwgcGxvdCkpKTsKKwkJCQlmb3IgKHZhciBqID0gdmFsdWVzLmxlbmd0aCAtIDI7IGogPj0gMDsgai0tKSB7CisJCQkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbal0ueCwgcGxvdGFyZWEsIHBsb3QpOworCQkJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCQkJY21kLnB1c2goIkwiKTsKKwkJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJCX0KKwkJCX0KKwkJCXBhdGguc2V0QXR0cmlidXRlKCJkIiwgY21kLmpvaW4oIiAiKSArICIgWiIpOworCQkJZ3JvdXAuYXBwZW5kQ2hpbGQocGF0aCk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIFN0YWNrZWRDdXJ2ZWRBcmVhOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciB0ZW5zaW9uID0gMzsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCXZhciBuID0gcGxvdC5zZXJpZXMubGVuZ3RoOworCQl2YXIgZGF0YSA9IFtdOworCQl2YXIgdG90YWxzID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgdG1wID0gcGxvdC5zZXJpZXNbaV0uZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCB0bXAubGVuZ3RoOyBqKyspIHsKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCXRvdGFscy5wdXNoKHRtcFtqXS55KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0b3RhbHNbal0gKz0gdG1wW2pdLnk7CisJCQkJfQorCQkJCXRtcFtqXS55ID0gdG90YWxzW2pdOworCQkJfQorCQkJZGF0YS5wdXNoKHRtcCk7CisJCX0KKwkJZm9yICh2YXIgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgeworCQkJdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicGF0aCIpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2ldWzBdLnNlcmllcy5jb2xvcik7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgIjAuNCIpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIGRhdGFbaV1bMF0uc2VyaWVzLmNvbG9yKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMSIpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgIjAuODUiKTsKKwkJCXZhciBjbWQgPSBbXTsKKwkJCXZhciByID0gMzsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykgeworCQkJCXZhciB2YWx1ZXMgPSBkYXRhW2ldOworCQkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbal0ueCwgcGxvdGFyZWEsIHBsb3QpOworCQkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZCh2YWx1ZXNbal0ueSwgcGxvdGFyZWEsIHBsb3QpOworCQkJCXZhciBkeCA9IGFyZWEubGVmdCArIDE7CisJCQkJdmFyIGR5ID0gYXJlYS5ib3R0b207CisJCQkJaWYgKGogPiAwKSB7CisJCQkJCWR4ID0geCAtIHBsb3QuYXhpc1guZ2V0Q29vcmQodmFsdWVzW2ogLSAxXS54LCBwbG90YXJlYSwgcGxvdCk7CisJCQkJCWR5ID0gcGxvdC5heGlzWS5nZXRDb29yZCh2YWx1ZXNbaiAtIDFdLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCQl9CisJCQkJaWYgKGogPT0gMCkgeworCQkJCQljbWQucHVzaCgiTSIpOworCQkJCX0gZWxzZSB7CisJCQkJCWNtZC5wdXNoKCJDIik7CisJCQkJCXZhciBjeCA9IHggLSAodGVuc2lvbiAtIDEpICogKGR4IC8gdGVuc2lvbik7CisJCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgZHkpOworCQkJCQljeCA9IHggLSAoZHggLyB0ZW5zaW9uKTsKKwkJCQkJY21kLnB1c2goY3ggKyAiLCIgKyB5KTsKKwkJCQl9CisJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImNpcmNsZSIpOworCQkJCWMuc2V0QXR0cmlidXRlKCJjeCIsIHgpOworCQkJCWMuc2V0QXR0cmlidXRlKCJjeSIsIHkpOworCQkJCWMuc2V0QXR0cmlidXRlKCJyIiwgIjMiKTsKKwkJCQljLnNldEF0dHJpYnV0ZSgiZmlsbCIsIHZhbHVlc1tqXS5zZXJpZXMuY29sb3IpOworCQkJCWMuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC42Iik7CisJCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIxIik7CisJCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgIjAuODUiKTsKKwkJCQlncm91cC5hcHBlbmRDaGlsZChjKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIkwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQljbWQucHVzaCgiTCIpOworCQkJCWNtZC5wdXNoKHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVswXVswXS54LCBwbG90YXJlYSwgcGxvdCkgKyAiLCIgKyBwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpOworCQkJCWNtZC5wdXNoKCJaIik7CisJCQl9IGVsc2UgeworCQkJCXZhciB2YWx1ZXMgPSBkYXRhW2kgLSAxXTsKKwkJCQljbWQucHVzaCgiTCIpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS55LCBwbG90YXJlYSwgcGxvdCkpKTsKKwkJCQlmb3IgKHZhciBqID0gdmFsdWVzLmxlbmd0aCAtIDI7IGogPj0gMDsgai0tKSB7CisJCQkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbal0ueCwgcGxvdGFyZWEsIHBsb3QpOworCQkJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCQkJdmFyIGR4ID0geCAtIHBsb3QuYXhpc1guZ2V0Q29vcmQodmFsdWVzW2ogKyAxXS54LCBwbG90YXJlYSwgcGxvdCk7CisJCQkJCXZhciBkeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2ogKyAxXS55LCBwbG90YXJlYSwgcGxvdCk7CisJCQkJCWNtZC5wdXNoKCJDIik7CisJCQkJCXZhciBjeCA9IHggLSAodGVuc2lvbiAtIDEpICogKGR4IC8gdGVuc2lvbik7CisJCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgZHkpOworCQkJCQljeCA9IHggLSAoZHggLyB0ZW5zaW9uKTsKKwkJCQkJY21kLnB1c2goY3ggKyAiLCIgKyB5KTsKKwkJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJCX0KKwkJCX0KKwkJCXBhdGguc2V0QXR0cmlidXRlKCJkIiwgY21kLmpvaW4oIiAiKSArICIgWiIpOworCQkJZ3JvdXAuYXBwZW5kQ2hpbGQocGF0aCk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIERhdGFCYXI6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgdyA9IChhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0KSAvIChwbG90LmF4aXNYLnJhbmdlLnVwcGVyIC0gcGxvdC5heGlzWC5yYW5nZS5sb3dlcik7CisJCXZhciB5T3JpZ2luID0gcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHZhbHVlID0gZGF0YVtpXS55OworCQkJdmFyIHlBID0geU9yaWdpbjsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMik7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWUsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBoID0gTWF0aC5hYnMoeUEgLSB5KTsKKwkJCWlmICh2YWx1ZSA8IHBsb3QuYXhpc1gub3JpZ2luKSB7CisJCQkJeUEgPSB5OworCQkJCXkgPSB5T3JpZ2luOworCQkJfQorCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJyZWN0Iik7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInkiLCB5KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdyk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjYiKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhiYXIsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJCWdyb3VwLmFwcGVuZENoaWxkKGJhcik7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIExpbmU6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJCWlmIChkYXRhLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gbGluZTsKKwkJfQorCQl2YXIgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJwYXRoIik7CisJCWxpbmUuYXBwZW5kQ2hpbGQocGF0aCk7CisJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIGRhdGFbMF0uc2VyaWVzLmNvbG9yKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIyIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsICIwLjg1Iik7CisJCWlmIChkYXRhWzBdLnNlcmllcy5sYWJlbCAhPSBudWxsKSB7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgidGl0bGUiLCBkYXRhWzBdLnNlcmllcy5sYWJlbCk7CisJCX0KKwkJdmFyIGNtZCA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCWlmIChpID09IDApIHsKKwkJCQljbWQucHVzaCgiTSIpOworCQkJfSBlbHNlIHsKKwkJCQljbWQucHVzaCgiTCIpOworCQkJfQorCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiY2lyY2xlIik7CisJCQljLnNldEF0dHJpYnV0ZSgiY3giLCB4KTsKKwkJCWMuc2V0QXR0cmlidXRlKCJjeSIsIHkpOworCQkJYy5zZXRBdHRyaWJ1dGUoInIiLCAiMyIpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQljLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgIjAuNiIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIxIik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCAiMC44NSIpOworCQkJbGluZS5hcHBlbmRDaGlsZChjKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhjLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCX0KKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImQiLCBjbWQuam9pbigiICIpKTsKKwkJcmV0dXJuIGxpbmU7CisJfSwgQ3VydmVkTGluZTpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIHRlbnNpb24gPSAzOworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQlpZiAoZGF0YS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIGxpbmU7CisJCX0KKwkJdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicGF0aCIpOworCQlsaW5lLmFwcGVuZENoaWxkKHBhdGgpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJub25lIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2UiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMiIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCAiMC44NSIpOworCQlpZiAoZGF0YVswXS5zZXJpZXMubGFiZWwgIT0gbnVsbCkgeworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgZGF0YVswXS5zZXJpZXMubGFiZWwpOworCQl9CisJCXZhciBjbWQgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpXS55LCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgZHggPSBhcmVhLmxlZnQgKyAxOworCQkJdmFyIGR5ID0gYXJlYS5ib3R0b207CisJCQlpZiAoaSA+IDApIHsKKwkJCQlkeCA9IHggLSBwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbaSAtIDFdLngsIHBsb3RhcmVhLCBwbG90KTsKKwkJCQlkeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpIC0gMV0ueSwgcGxvdGFyZWEsIHBsb3QpOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCWNtZC5wdXNoKCJNIik7CisJCQl9IGVsc2UgeworCQkJCWNtZC5wdXNoKCJDIik7CisJCQkJdmFyIGN4ID0geCAtICh0ZW5zaW9uIC0gMSkgKiAoZHggLyB0ZW5zaW9uKTsKKwkJCQljbWQucHVzaChjeCArICIsIiArIGR5KTsKKwkJCQljeCA9IHggLSAoZHggLyB0ZW5zaW9uKTsKKwkJCQljbWQucHVzaChjeCArICIsIiArIHkpOworCQkJfQorCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiY2lyY2xlIik7CisJCQljLnNldEF0dHJpYnV0ZSgiY3giLCB4KTsKKwkJCWMuc2V0QXR0cmlidXRlKCJjeSIsIHkpOworCQkJYy5zZXRBdHRyaWJ1dGUoInIiLCAiMyIpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQljLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgIjAuNiIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIxIik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCAiMC44NSIpOworCQkJbGluZS5hcHBlbmRDaGlsZChjKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhjLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCX0KKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImQiLCBjbWQuam9pbigiICIpKTsKKwkJcmV0dXJuIGxpbmU7CisJfSwgQXJlYTpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImciKTsKKwkJaWYgKGRhdGEubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBsaW5lOworCQl9CisJCXZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInBhdGgiKTsKKwkJbGluZS5hcHBlbmRDaGlsZChwYXRoKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC40Iik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2UiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMSIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCAiMC44NSIpOworCQlpZiAoZGF0YVswXS5zZXJpZXMubGFiZWwgIT0gbnVsbCkgeworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgZGF0YVswXS5zZXJpZXMubGFiZWwpOworCQl9CisJCXZhciBjbWQgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpXS55LCBwbG90YXJlYSwgcGxvdCk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIk0iKTsKKwkJCX0gZWxzZSB7CisJCQkJY21kLnB1c2goIkwiKTsKKwkJCX0KKwkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImNpcmNsZSIpOworCQkJYy5zZXRBdHRyaWJ1dGUoImN4IiwgeCk7CisJCQljLnNldEF0dHJpYnV0ZSgiY3kiLCB5KTsKKwkJCWMuc2V0QXR0cmlidXRlKCJyIiwgIjMiKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjYiKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMSIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgIjAuODUiKTsKKwkJCWxpbmUuYXBwZW5kQ2hpbGQoYyk7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8oYywgZGF0YVtpXS5zcmMpOworCQkJfQorCQl9CisJCWNtZC5wdXNoKCJMIik7CisJCWNtZC5wdXNoKHggKyAiLCIgKyBwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpOworCQljbWQucHVzaCgiTCIpOworCQljbWQucHVzaChwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbMF0ueCwgcGxvdGFyZWEsIHBsb3QpICsgIiwiICsgcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJY21kLnB1c2goIloiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImQiLCBjbWQuam9pbigiICIpKTsKKwkJcmV0dXJuIGxpbmU7CisJfSwgQ3VydmVkQXJlYTpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIHRlbnNpb24gPSAzOworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQlpZiAoZGF0YS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIGxpbmU7CisJCX0KKwkJdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicGF0aCIpOworCQlsaW5lLmFwcGVuZENoaWxkKHBhdGgpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbCIsIGRhdGFbMF0uc2VyaWVzLmNvbG9yKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjQiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIGRhdGFbMF0uc2VyaWVzLmNvbG9yKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIxIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsICIwLjg1Iik7CisJCWlmIChkYXRhWzBdLnNlcmllcy5sYWJlbCAhPSBudWxsKSB7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgidGl0bGUiLCBkYXRhWzBdLnNlcmllcy5sYWJlbCk7CisJCX0KKwkJdmFyIGNtZCA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBkeCA9IGFyZWEubGVmdCArIDE7CisJCQl2YXIgZHkgPSBhcmVhLmJvdHRvbTsKKwkJCWlmIChpID4gMCkgeworCQkJCWR4ID0geCAtIHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpIC0gMV0ueCwgcGxvdGFyZWEsIHBsb3QpOworCQkJCWR5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2kgLSAxXS55LCBwbG90YXJlYSwgcGxvdCk7CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIk0iKTsKKwkJCX0gZWxzZSB7CisJCQkJY21kLnB1c2goIkMiKTsKKwkJCQl2YXIgY3ggPSB4IC0gKHRlbnNpb24gLSAxKSAqIChkeCAvIHRlbnNpb24pOworCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgZHkpOworCQkJCWN4ID0geCAtIChkeCAvIHRlbnNpb24pOworCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgeSk7CisJCQl9CisJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQl2YXIgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJjaXJjbGUiKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJjeCIsIHgpOworCQkJYy5zZXRBdHRyaWJ1dGUoImN5IiwgeSk7CisJCQljLnNldEF0dHJpYnV0ZSgiciIsICIzIik7CisJCQljLnNldEF0dHJpYnV0ZSgiZmlsbCIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC42Iik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjEiKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsICIwLjg1Iik7CisJCQlsaW5lLmFwcGVuZENoaWxkKGMpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJfQorCQljbWQucHVzaCgiTCIpOworCQljbWQucHVzaCh4ICsgIiwiICsgcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJY21kLnB1c2goIkwiKTsKKwkJY21kLnB1c2gocGxvdC5heGlzWC5nZXRDb29yZChkYXRhWzBdLngsIHBsb3RhcmVhLCBwbG90KSArICIsIiArIHBsb3QuYXhpc1kuZ2V0Q29vcmQocGxvdC5heGlzWC5vcmlnaW4sIHBsb3RhcmVhLCBwbG90KSk7CisJCWNtZC5wdXNoKCJaIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJkIiwgY21kLmpvaW4oIiAiKSk7CisJCXJldHVybiBsaW5lOworCX0sIEhpZ2hMb3c6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgcGFydCA9ICgoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgLyAocGxvdC5heGlzWC5yYW5nZS51cHBlciAtIHBsb3QuYXhpc1gucmFuZ2UubG93ZXIpKSAvIDQ7CisJCXZhciB3ID0gcGFydCAqIDI7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgaGlnaCA9IGRhdGFbaV0uaGlnaDsKKwkJCXZhciBsb3cgPSBkYXRhW2ldLmxvdzsKKwkJCWlmIChsb3cgPiBoaWdoKSB7CisJCQkJdmFyIHQgPSBsb3c7CisJCQkJbG93ID0gaGlnaDsKKwkJCQloaWdoID0gdDsKKwkJCX0KKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMik7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoaGlnaCwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGggPSBwbG90LmF4aXNZLmdldENvb3JkKGxvdywgcGxvdGFyZWEsIHBsb3QpIC0geTsKKwkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicmVjdCIpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgiZmlsbCIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIwIik7CisJCQliYXIuc2V0QXR0cmlidXRlKCJ4IiwgeCk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJ5IiwgeSk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHcpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgaCk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAiMC42Iik7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8oYmFyLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCQlncm91cC5hcHBlbmRDaGlsZChiYXIpOworCQl9CisJCXJldHVybiBncm91cDsKKwl9LCBIaWdoTG93Q2xvc2U6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgcGFydCA9ICgoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgLyAocGxvdC5heGlzWC5yYW5nZS51cHBlciAtIHBsb3QuYXhpc1gucmFuZ2UubG93ZXIpKSAvIDQ7CisJCXZhciB3ID0gcGFydCAqIDI7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgaGlnaCA9IGRhdGFbaV0uaGlnaDsKKwkJCXZhciBsb3cgPSBkYXRhW2ldLmxvdzsKKwkJCWlmIChsb3cgPiBoaWdoKSB7CisJCQkJdmFyIHQgPSBsb3c7CisJCQkJbG93ID0gaGlnaDsKKwkJCQloaWdoID0gdDsKKwkJCX0KKwkJCXZhciBjID0gZGF0YVtpXS5jbG9zZTsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMik7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoaGlnaCwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGggPSBwbG90LmF4aXNZLmdldENvb3JkKGxvdywgcGxvdGFyZWEsIHBsb3QpIC0geTsKKwkJCXZhciBjbG9zZSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoYywgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJyZWN0Iik7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInkiLCB5KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdyk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjYiKTsKKwkJCWcuYXBwZW5kQ2hpbGQoYmFyKTsKKwkJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImxpbmUiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIHgpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoIngyIiwgeCArIHcgKyAocGFydCAqIDIpKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ5MSIsIGNsb3NlKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ5MiIsIGNsb3NlKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJzdHJva2U6IiArIGRhdGFbaV0uc2VyaWVzLmNvbG9yICsgIjtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1vcGFjaXR5OjAuNjsiKTsKKwkJCWcuYXBwZW5kQ2hpbGQobGluZSk7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8oZywgZGF0YVtpXS5zcmMpOworCQkJfQorCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZyk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIEhpZ2hMb3dPcGVuQ2xvc2U6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgcGFydCA9ICgoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgLyAocGxvdC5heGlzWC5yYW5nZS51cHBlciAtIHBsb3QuYXhpc1gucmFuZ2UubG93ZXIpKSAvIDQ7CisJCXZhciB3ID0gcGFydCAqIDI7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgaGlnaCA9IGRhdGFbaV0uaGlnaDsKKwkJCXZhciBsb3cgPSBkYXRhW2ldLmxvdzsKKwkJCWlmIChsb3cgPiBoaWdoKSB7CisJCQkJdmFyIHQgPSBsb3c7CisJCQkJbG93ID0gaGlnaDsKKwkJCQloaWdoID0gdDsKKwkJCX0KKwkJCXZhciBvID0gZGF0YVtpXS5vcGVuOworCQkJdmFyIGMgPSBkYXRhW2ldLmNsb3NlOworCQkJdmFyIHggPSBwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbaV0ueCwgcGxvdGFyZWEsIHBsb3QpIC0gKHcgLyAyKTsKKwkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZChoaWdoLCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgaCA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQobG93LCBwbG90YXJlYSwgcGxvdCkgLSB5OworCQkJdmFyIG9wZW4gPSBwbG90LmF4aXNZLmdldENvb3JkKG8sIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBjbG9zZSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoYywgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJyZWN0Iik7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInkiLCB5KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdyk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjYiKTsKKwkJCWcuYXBwZW5kQ2hpbGQoYmFyKTsKKwkJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImxpbmUiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIHggLSAocGFydCAqIDIpKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ4MiIsIHggKyB3KTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ5MSIsIG9wZW4pOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInkyIiwgb3Blbik7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAic3Ryb2tlOiIgKyBkYXRhW2ldLnNlcmllcy5jb2xvciArICI7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2Utb3BhY2l0eTowLjY7Iik7CisJCQlnLmFwcGVuZENoaWxkKGxpbmUpOworCQkJdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAibGluZSIpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoIngxIiwgeCk7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgieDIiLCB4ICsgdyArIChwYXJ0ICogMikpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInkxIiwgY2xvc2UpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInkyIiwgY2xvc2UpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInN0cm9rZToiICsgZGF0YVtpXS5zZXJpZXMuY29sb3IgKyAiO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLW9wYWNpdHk6MC42OyIpOworCQkJZy5hcHBlbmRDaGlsZChsaW5lKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhnLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCQlncm91cC5hcHBlbmRDaGlsZChnKTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgU2NhdHRlcjpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIHIgPSA3OworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnksIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBwb2ludCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJwYXRoIik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIwIik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImQiLCAiTSAiICsgeCArICIsIiArICh5IC0gcikgKyAiICIgKyAiUSAiICsgeCArICIsIiArIHkgKyAiICIgKyAoeCArIHIpICsgIiwiICsgeSArICIgIiArICJRICIgKyB4ICsgIiwiICsgeSArICIgIiArIHggKyAiLCIgKyAoeSArIHIpICsgIiAiICsgIlEgIiArIHggKyAiLCIgKyB5ICsgIiAiICsgKHggLSByKSArICIsIiArIHkgKyAiICIgKyAiUSAiICsgeCArICIsIiArIHkgKyAiICIgKyB4ICsgIiwiICsgKHkgLSByKSArICIgIiArICJaIik7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8ocG9pbnQsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJCWdyb3VwLmFwcGVuZENoaWxkKHBvaW50KTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgQnViYmxlOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgZ3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCQl2YXIgc2l6ZUZhY3RvciA9IDE7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbaV0ueCwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIHkgPSBwbG90LmF4aXNZLmdldENvb3JkKGRhdGFbaV0ueSwgcGxvdGFyZWEsIHBsb3QpOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXZhciByYXcgPSBkYXRhW2ldLnNpemU7CisJCQkJdmFyIGR5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnkgKyByYXcsIHBsb3RhcmVhLCBwbG90KSAtIHk7CisJCQkJc2l6ZUZhY3RvciA9IGR5IC8gcmF3OworCQkJfQorCQkJaWYgKHNpemVGYWN0b3IgPCAxKSB7CisJCQkJc2l6ZUZhY3RvciA9IDE7CisJCQl9CisJCQl2YXIgcG9pbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiY2lyY2xlIik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGwiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjgiKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMSIpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJjeCIsIHgpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJjeSIsIHkpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJyIiwgKGRhdGFbaV0uc2l6ZSAvIDIpICogc2l6ZUZhY3Rvcik7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8ocG9pbnQsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJCWdyb3VwLmFwcGVuZENoaWxkKHBvaW50KTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfX0pOworCWRvam8uY2hhcnRpbmcuUGxvdHRlcnNbIkRlZmF1bHQiXSA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuTGluZTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3ZtbC9BeGlzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3ZtbC9BeGlzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDBiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvdm1sL0F4aXMuanMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY2hhcnRpbmcudm1sLkF4aXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworaWYgKGRvam8ucmVuZGVyLnZtbC5jYXBhYmxlKSB7CisJZG9qby5leHRlbmQoZG9qby5jaGFydGluZy5BeGlzLCB7cmVuZGVyTGluZXM6ZnVuY3Rpb24gKHBsb3RBcmVhLCBwbG90LCBwbGFuZSkgeworCQlpZiAodGhpcy5ub2Rlcy5saW5lcykgeworCQkJd2hpbGUgKHRoaXMubm9kZXMubGluZXMuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CisJCQkJdGhpcy5ub2Rlcy5saW5lcy5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmxpbmVzLmNoaWxkTm9kZXNbMF0pOworCQkJfQorCQkJaWYgKHRoaXMubm9kZXMubGluZXMucGFyZW50Tm9kZSkgeworCQkJCXRoaXMubm9kZXMubGluZXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmxpbmVzKTsKKwkJCQl0aGlzLm5vZGVzLmxpbmVzID0gbnVsbDsKKwkJCX0KKwkJfQorCQl2YXIgYXJlYSA9IHBsb3RBcmVhLmdldEFyZWEoKTsKKwkJdmFyIGcgPSB0aGlzLm5vZGVzLmxpbmVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWcuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItbGluZXMiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICh0aGlzLl9sYWJlbHNbaV0udmFsdWUgPT0gdGhpcy5vcmlnaW4pIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciB2ID0gdGhpcy5nZXRDb29yZCh0aGlzLl9sYWJlbHNbaV0udmFsdWUsIHBsb3RBcmVhLCBwbG90KTsKKwkJCXZhciBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpsaW5lIik7CisJCQl2YXIgc3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJCXN0ci5kYXNoc3R5bGUgPSAiZG90IjsKKwkJCWwuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCWwuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsICIjNjY2Iik7CisJCQlsLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJdmFyIHMgPSBsLnN0eWxlOworCQkJcy5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQlzLnRvcCA9ICIwcHgiOworCQkJcy5sZWZ0ID0gIjBweCI7CisJCQlzLmFudGlhbGlhcyA9ICJmYWxzZSI7CisJCQlpZiAocGxhbmUgPT0gIngiKSB7CisJCQkJbC5zZXRBdHRyaWJ1dGUoImZyb20iLCB2ICsgInB4LCIgKyBhcmVhLnRvcCArICJweCIpOworCQkJCWwuc2V0QXR0cmlidXRlKCJ0byIsIHYgKyAicHgsIiArIGFyZWEuYm90dG9tICsgInB4Iik7CisJCQl9IGVsc2UgeworCQkJCWlmIChwbGFuZSA9PSAieSIpIHsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoImZyb20iLCBhcmVhLmxlZnQgKyAicHgsIiArIHYgKyAicHgiKTsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoInRvIiwgYXJlYS5yaWdodCArICJweCwiICsgdiArICJweCIpOworCQkJCX0KKwkJCX0KKwkJCWcuYXBwZW5kQ2hpbGQobCk7CisJCX0KKwkJcmV0dXJuIGc7CisJfSwgcmVuZGVyVGlja3M6ZnVuY3Rpb24gKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgY29vcmQpIHsKKwkJaWYgKHRoaXMubm9kZXMudGlja3MpIHsKKwkJCXdoaWxlICh0aGlzLm5vZGVzLnRpY2tzLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQkJCXRoaXMubm9kZXMudGlja3MucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy50aWNrcy5jaGlsZE5vZGVzWzBdKTsKKwkJCX0KKwkJCWlmICh0aGlzLm5vZGVzLnRpY2tzLnBhcmVudE5vZGUpIHsKKwkJCQl0aGlzLm5vZGVzLnRpY2tzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy50aWNrcyk7CisJCQkJdGhpcy5ub2Rlcy50aWNrcyA9IG51bGw7CisJCQl9CisJCX0KKwkJdmFyIGcgPSB0aGlzLm5vZGVzLnRpY2tzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWcuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuZ2V0SWQoKSArICItdGlja3MiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB2ID0gdGhpcy5nZXRDb29yZCh0aGlzLl9sYWJlbHNbaV0udmFsdWUsIHBsb3RBcmVhLCBwbG90KTsKKwkJCXZhciBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpsaW5lIik7CisJCQlsLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCAiIzAwMCIpOworCQkJbC5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsICIxcHgiKTsKKwkJCXZhciBzID0gbC5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAiMHB4IjsKKwkJCXMubGVmdCA9ICIwcHgiOworCQkJcy5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJaWYgKHBsYW5lID09ICJ4IikgeworCQkJCWwuc2V0QXR0cmlidXRlKCJmcm9tIiwgdiArICJweCwiICsgY29vcmQgKyAicHgiKTsKKwkJCQlsLnNldEF0dHJpYnV0ZSgidG8iLCB2ICsgInB4LCIgKyAoY29vcmQgKyAzKSArICJweCIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGxhbmUgPT0gInkiKSB7CisJCQkJCWwuc2V0QXR0cmlidXRlKCJmcm9tIiwgKGNvb3JkIC0gMikgKyAicHgsIiArIHYgKyAicHgiKTsKKwkJCQkJbC5zZXRBdHRyaWJ1dGUoInRvIiwgKGNvb3JkICsgMikgKyAicHgsIiArIHYgKyAicHgiKTsKKwkJCQl9CisJCQl9CisJCQlnLmFwcGVuZENoaWxkKGwpOworCQl9CisJCXJldHVybiBnOworCX0sIHJlbmRlckxhYmVsczpmdW5jdGlvbiAocGxvdEFyZWEsIHBsb3QsIHBsYW5lLCBjb29yZCwgdGV4dFNpemUsIGFuY2hvcikgeworCQlmdW5jdGlvbiBjcmVhdGVMYWJlbChsYWJlbCwgeCwgeSwgdGV4dFNpemUsIGFuY2hvcikgeworCQkJdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCXZhciBzID0gdGV4dC5zdHlsZTsKKwkJCXRleHQuaW5uZXJIVE1MID0gbGFiZWw7CisJCQlzLmZvbnRTaXplID0gdGV4dFNpemUgKyAicHgiOworCQkJcy5mb250RmFtaWx5ID0gInNhbnMtc2VyaWYiOworCQkJcy5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQlzLnRvcCA9IHkgKyAicHgiOworCQkJaWYgKGFuY2hvciA9PSAiY2VudGVyIikgeworCQkJCXMubGVmdCA9IHggKyAicHgiOworCQkJCXMudGV4dEFsaWduID0gImNlbnRlciI7CisJCQl9IGVsc2UgeworCQkJCWlmIChhbmNob3IgPT0gImxlZnQiKSB7CisJCQkJCXMubGVmdCA9IHggKyAicHgiOworCQkJCQlzLnRleHRBbGlnbiA9ICJsZWZ0IjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoYW5jaG9yID09ICJyaWdodCIpIHsKKwkJCQkJCXMucmlnaHQgPSB4ICsgInB4IjsKKwkJCQkJCXMudGV4dEFsaWduID0gInJpZ2h0IjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0ZXh0OworCQl9CisJCWlmICh0aGlzLm5vZGVzLmxhYmVscykgeworCQkJd2hpbGUgKHRoaXMubm9kZXMubGFiZWxzLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQkJCXRoaXMubm9kZXMubGFiZWxzLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMubGFiZWxzLmNoaWxkTm9kZXNbMF0pOworCQkJfQorCQkJaWYgKHRoaXMubm9kZXMubGFiZWxzLnBhcmVudE5vZGUpIHsKKwkJCQl0aGlzLm5vZGVzLmxhYmVscy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMubGFiZWxzKTsKKwkJCQl0aGlzLm5vZGVzLmxhYmVscyA9IG51bGw7CisJCQl9CisJCX0KKwkJdmFyIGcgPSB0aGlzLm5vZGVzLmxhYmVscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQlnLnNldEF0dHJpYnV0ZSgiaWQiLCB0aGlzLmdldElkKCkgKyAiLWxhYmVscyIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHYgPSB0aGlzLmdldENvb3JkKHRoaXMuX2xhYmVsc1tpXS52YWx1ZSwgcGxvdEFyZWEsIHBsb3QpOworCQkJaWYgKHBsYW5lID09ICJ4IikgeworCQkJCXZhciBub2RlID0gY3JlYXRlTGFiZWwodGhpcy5fbGFiZWxzW2ldLmxhYmVsLCB2LCBjb29yZCwgdGV4dFNpemUsIGFuY2hvcik7CisJCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKKwkJCQlub2RlLnN0eWxlLmxlZnQgPSB2IC0gKG5vZGUub2Zmc2V0V2lkdGggLyAyKSArICJweCI7CisJCQkJZy5hcHBlbmRDaGlsZChub2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBsYW5lID09ICJ5IikgeworCQkJCQl2YXIgbm9kZSA9IGNyZWF0ZUxhYmVsKHRoaXMuX2xhYmVsc1tpXS5sYWJlbCwgY29vcmQsIHYsIHRleHRTaXplLCBhbmNob3IpOworCQkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vZGUpOworCQkJCQlub2RlLnN0eWxlLnRvcCA9IHYgLSAobm9kZS5vZmZzZXRIZWlnaHQgLyAyKSArICJweCI7CisJCQkJCWcuYXBwZW5kQ2hpbGQobm9kZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBnOworCX0sIHJlbmRlcjpmdW5jdGlvbiAocGxvdEFyZWEsIHBsb3QsIGRyYXdBZ2FpbnN0LCBwbGFuZSkgeworCQlpZiAoIXRoaXMuX3JlcmVuZGVyICYmIHRoaXMubm9kZXMubWFpbikgeworCQkJcmV0dXJuIHRoaXMubm9kZXMubWFpbjsKKwkJfQorCQl0aGlzLl9yZXJlbmRlciA9IGZhbHNlOworCQl2YXIgYXJlYSA9IHBsb3RBcmVhLmdldEFyZWEoKTsKKwkJdmFyIHN0cm9rZSA9IDE7CisJCXZhciBzdHlsZSA9ICJzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6IiArIHN0cm9rZSArICJweDsiOworCQl2YXIgdGV4dFNpemUgPSAxMDsKKwkJdmFyIGNvb3JkID0gZHJhd0FnYWluc3QuZ2V0Q29vcmQodGhpcy5vcmlnaW4sIHBsb3RBcmVhLCBwbG90KTsKKwkJdmFyIGcgPSB0aGlzLm5vZGVzLm1haW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZy5zZXRBdHRyaWJ1dGUoImlkIiwgdGhpcy5nZXRJZCgpKTsKKwkJdmFyIGxpbmUgPSB0aGlzLm5vZGVzLmF4aXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmxpbmUiKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgIiMwMDAiKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsIHN0cm9rZSArICJweCIpOworCQl2YXIgcyA9IGxpbmUuc3R5bGU7CisJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlzLnRvcCA9ICIwcHgiOworCQlzLmxlZnQgPSAiMHB4IjsKKwkJcy5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQlpZiAocGxhbmUgPT0gIngiKSB7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgiZnJvbSIsIGFyZWEubGVmdCArICJweCwiICsgY29vcmQgKyAicHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ0byIsIGFyZWEucmlnaHQgKyAicHgsIiArIGNvb3JkICsgInB4Iik7CisJCQl2YXIgeSA9IGNvb3JkICsgTWF0aC5mbG9vcih0ZXh0U2l6ZSAvIDIpOworCQkJaWYgKHRoaXMuc2hvd0xpbmVzKSB7CisJCQkJZy5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlckxpbmVzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgeSkpOworCQkJfQorCQkJaWYgKHRoaXMuc2hvd1RpY2tzKSB7CisJCQkJZy5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlclRpY2tzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgY29vcmQpKTsKKwkJCX0KKwkJCWlmICh0aGlzLnNob3dMYWJlbHMpIHsKKwkJCQlnLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTGFiZWxzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgeSwgdGV4dFNpemUsICJjZW50ZXIiKSk7CisJCQl9CisJCQlpZiAodGhpcy5zaG93TGFiZWwgJiYgdGhpcy5sYWJlbCkgeworCQkJCXZhciB4ID0gcGxvdEFyZWEuc2l6ZS53aWR0aCAvIDI7CisJCQkJdmFyIHkgPSBjb29yZCArIE1hdGgucm91bmQodGV4dFNpemUgKiAxLjUpOworCQkJCXZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJdmFyIHMgPSB0ZXh0LnN0eWxlOworCQkJCXRleHQuaW5uZXJIVE1MID0gdGhpcy5sYWJlbDsKKwkJCQlzLmZvbnRTaXplID0gKHRleHRTaXplICsgMikgKyAicHgiOworCQkJCXMuZm9udEZhbWlseSA9ICJzYW5zLXNlcmlmIjsKKwkJCQlzLmZvbnRXZWlnaHQgPSAiYm9sZCI7CisJCQkJcy5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJcy50b3AgPSB5ICsgInB4IjsKKwkJCQlzLmxlZnQgPSB4ICsgInB4IjsKKwkJCQlzLnRleHRBbGlnbiA9ICJjZW50ZXIiOworCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dCk7CisJCQkJdGV4dC5zdHlsZS5sZWZ0ID0geCAtICh0ZXh0Lm9mZnNldFdpZHRoIC8gMikgKyAicHgiOworCQkJCWcuYXBwZW5kQ2hpbGQodGV4dCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgiZnJvbSIsIGNvb3JkICsgInB4LCIgKyBhcmVhLnRvcCArICJweCIpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInRvIiwgY29vcmQgKyAicHgsIiArIGFyZWEuYm90dG9tICsgInB4Iik7CisJCQl2YXIgaXNNYXggPSB0aGlzLm9yaWdpbiA9PSBkcmF3QWdhaW5zdC5yYW5nZS51cHBlcjsKKwkJCXZhciB4ID0gY29vcmQgKyA0OworCQkJdmFyIGFuY2hvciA9ICJsZWZ0IjsKKwkJCWlmICghaXNNYXgpIHsKKwkJCQl4ID0gYXJlYS5yaWdodCAtIGNvb3JkICsgdGV4dFNpemUgKyA0OworCQkJCWFuY2hvciA9ICJyaWdodCI7CisJCQkJaWYgKGNvb3JkID09IGFyZWEubGVmdCkgeworCQkJCQl4ICs9ICh0ZXh0U2l6ZSAqIDIpIC0gKHRleHRTaXplIC8gMik7CisJCQkJfQorCQkJfQorCQkJaWYgKHRoaXMuc2hvd0xpbmVzKSB7CisJCQkJZy5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlckxpbmVzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgeCkpOworCQkJfQorCQkJaWYgKHRoaXMuc2hvd1RpY2tzKSB7CisJCQkJZy5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlclRpY2tzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgY29vcmQpKTsKKwkJCX0KKwkJCWlmICh0aGlzLnNob3dMYWJlbHMpIHsKKwkJCQlnLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTGFiZWxzKHBsb3RBcmVhLCBwbG90LCBwbGFuZSwgeCwgdGV4dFNpemUsIGFuY2hvcikpOworCQkJfQorCQkJaWYgKHRoaXMuc2hvd0xhYmVsICYmIHRoaXMubGFiZWwpIHsKKwkJCQl4ICs9ICh0ZXh0U2l6ZSAqIDIpIC0gMjsKKwkJCQl2YXIgeSA9IHBsb3RBcmVhLnNpemUuaGVpZ2h0IC8gMjsKKwkJCQl2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCXZhciBzID0gdGV4dC5zdHlsZTsKKwkJCQl0ZXh0LmlubmVySFRNTCA9IHRoaXMubGFiZWw7CisJCQkJcy5mb250U2l6ZSA9ICh0ZXh0U2l6ZSArIDIpICsgInB4IjsKKwkJCQlzLmZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiI7CisJCQkJcy5mb250V2VpZ2h0ID0gImJvbGQiOworCQkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCXMuaGVpZ2h0ID0gcGxvdEFyZWEuc2l6ZS5oZWlnaHQgKyAicHgiOworCQkJCXMud3JpdGluZ01vZGUgPSAidGItcmwiOworCQkJCXMudGV4dEFsaWduID0gImNlbnRlciI7CisJCQkJc1thbmNob3JdID0geCArICJweCI7CisJCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0KTsKKwkJCQlzLnRvcCA9IHkgLSAodGV4dC5vZmZzZXRIZWlnaHQgLyAyKSArICJweCI7CisJCQkJZy5hcHBlbmRDaGlsZCh0ZXh0KTsKKwkJCX0KKwkJfQorCQlnLmFwcGVuZENoaWxkKGxpbmUpOworCQlyZXR1cm4gZzsKKwl9fSk7Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy92bWwvUGxvdEFyZWEuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvdm1sL1Bsb3RBcmVhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2RlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY2hhcnRpbmcvdm1sL1Bsb3RBcmVhLmpzCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY2hhcnRpbmcudm1sLlBsb3RBcmVhIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2lmIChkb2pvLnJlbmRlci52bWwuY2FwYWJsZSkgeworCWRvam8uZXh0ZW5kKGRvam8uY2hhcnRpbmcuUGxvdEFyZWEsIHtyZXNpemU6ZnVuY3Rpb24gKCkgeworCQl2YXIgYSA9IHRoaXMuZ2V0QXJlYSgpOworCQl0aGlzLm5vZGVzLmFyZWEuc3R5bGUud2lkdGggPSB0aGlzLnNpemUud2lkdGggKyAicHgiOworCQl0aGlzLm5vZGVzLmFyZWEuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaXplLmhlaWdodCArICJweCI7CisJCXRoaXMubm9kZXMuYmFja2dyb3VuZC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZS53aWR0aCArICJweCI7CisJCXRoaXMubm9kZXMuYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQgPSB0aGlzLnNpemUuaGVpZ2h0ICsgInB4IjsKKwkJdGhpcy5ub2Rlcy5wbG90cy53aWR0aCA9IHRoaXMuc2l6ZS53aWR0aCArICJweCI7CisJCXRoaXMubm9kZXMucGxvdHMuaGVpZ2h0ID0gdGhpcy5zaXplLmhlaWdodCArICJweCI7CisJCXRoaXMubm9kZXMucGxvdHMuc3R5bGUuY2xpcCA9ICJyZWN0KCIgKyBhLnRvcCArICIgIiArIGEucmlnaHQgKyAiICIgKyBhLmJvdHRvbSArICIgIiArIGEubGVmdCArICIpIjsKKwkJaWYgKHRoaXMubm9kZXMuYXhlcykgeworCQkJdGhpcy5ub2Rlcy5hcmVhLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMuYXhlcyk7CisJCX0KKwkJdmFyIGF4ZXMgPSB0aGlzLm5vZGVzLmF4ZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJYXhlcy5pZCA9IHRoaXMuZ2V0SWQoKSArICItYXhlcyI7CisJCXRoaXMubm9kZXMuYXJlYS5hcHBlbmRDaGlsZChheGVzKTsKKwkJdmFyIGF4ID0gdGhpcy5nZXRBeGVzKCk7CisJCWZvciAodmFyIHAgaW4gYXgpIHsKKwkJCXZhciBvYmogPSBheFtwXTsKKwkJCWF4ZXMuYXBwZW5kQ2hpbGQob2JqLmF4aXMuaW5pdGlhbGl6ZSh0aGlzLCBvYmoucGxvdCwgb2JqLmRyYXdBZ2FpbnN0LCBvYmoucGxhbmUpKTsKKwkJfQorCX0sIGluaXRpYWxpemVQbG90OmZ1bmN0aW9uIChwbG90KSB7CisJCXBsb3QuZGVzdHJveSgpOworCQlwbG90LmRhdGFOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCXBsb3QuZGF0YU5vZGUuaWQgPSBwbG90LmdldElkKCk7CisJCXJldHVybiBwbG90LmRhdGFOb2RlOworCX0sIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCQl0aGlzLmRlc3Ryb3koKTsKKwkJdmFyIG1haW4gPSB0aGlzLm5vZGVzLm1haW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJdmFyIGFyZWEgPSB0aGlzLm5vZGVzLmFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJYXJlYS5pZCA9IHRoaXMuZ2V0SWQoKTsKKwkJYXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCW1haW4uYXBwZW5kQ2hpbGQoYXJlYSk7CisJCXZhciBiZyA9IHRoaXMubm9kZXMuYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQliZy5pZCA9IHRoaXMuZ2V0SWQoKSArICItYmFja2dyb3VuZCI7CisJCWJnLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJYmcuc3R5bGUudG9wID0gIjBweCI7CisJCWJnLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJYmcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNmZmYiOworCQlhcmVhLmFwcGVuZENoaWxkKGJnKTsKKwkJdmFyIGEgPSB0aGlzLmdldEFyZWEoKTsKKwkJdmFyIHBsb3RzID0gdGhpcy5ub2Rlcy5wbG90cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQlwbG90cy5pZCA9IHRoaXMuZ2V0SWQoKSArICItcGxvdHMiOworCQlwbG90cy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCXBsb3RzLnN0eWxlLnRvcCA9ICIwcHgiOworCQlwbG90cy5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCWFyZWEuYXBwZW5kQ2hpbGQocGxvdHMpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGxvdHMubGVuZ3RoOyBpKyspIHsKKwkJCXBsb3RzLmFwcGVuZENoaWxkKHRoaXMuaW5pdGlhbGl6ZVBsb3QodGhpcy5wbG90c1tpXSkpOworCQl9CisJCXRoaXMucmVzaXplKCk7CisJCXJldHVybiBtYWluOworCX19KTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NoYXJ0aW5nL3ZtbC9QbG90dGVycy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy92bWwvUGxvdHRlcnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlZjNiMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jaGFydGluZy92bWwvUGxvdHRlcnMuanMKQEAgLTAsMCArMSw4ODkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY2hhcnRpbmcudm1sLlBsb3R0ZXJzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2lmIChkb2pvLnJlbmRlci52bWwuY2FwYWJsZSkgeworCWRvam8ubWl4aW4oZG9qby5jaGFydGluZy5QbG90dGVycywge19ncm91cDpmdW5jdGlvbiAocGxvdGFyZWEpIHsKKwkJdmFyIGdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWdyb3VwLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJZ3JvdXAuc3R5bGUudG9wID0gIjBweCI7CisJCWdyb3VwLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJZ3JvdXAuc3R5bGUud2lkdGggPSBwbG90YXJlYS5zaXplLndpZHRoICsgInB4IjsKKwkJZ3JvdXAuc3R5bGUuaGVpZ2h0ID0gcGxvdGFyZWEuc2l6ZS5oZWlnaHQgKyAicHgiOworCQlyZXR1cm4gZ3JvdXA7CisJfSwgQmFyOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLl9ncm91cChwbG90YXJlYSk7CisJCXZhciBuID0gcGxvdC5zZXJpZXMubGVuZ3RoOworCQl2YXIgZGF0YSA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHRtcCA9IHBsb3Quc2VyaWVzW2ldLmRhdGEuZXZhbHVhdGUoa3dBcmdzKTsKKwkJCWRhdGEucHVzaCh0bXApOworCQl9CisJCXZhciBzcGFjZSA9IDg7CisJCXZhciBuUG9pbnRzID0gZGF0YVswXS5sZW5ndGg7CisJCWlmIChuUG9pbnRzID09IDApIHsKKwkJCXJldHVybiBncm91cDsKKwkJfQorCQl2YXIgd2lkdGggPSAoKGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpIC0gKHNwYWNlICogKG5Qb2ludHMgLSAxKSkpIC8gblBvaW50czsKKwkJdmFyIGJhcldpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAvIG4pOworCQl2YXIgeU9yaWdpbiA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQocGxvdC5heGlzWC5vcmlnaW4sIHBsb3RhcmVhLCBwbG90KTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKwkJCXZhciB4U3RhcnQgPSBhcmVhLmxlZnQgKyAod2lkdGggKiBpKSArIChzcGFjZSAqIGkpOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCQl2YXIgdmFsdWUgPSBkYXRhW2pdW2ldLnk7CisJCQkJdmFyIHlBID0geU9yaWdpbjsKKwkJCQl2YXIgeCA9IHhTdGFydCArIChiYXJXaWR0aCAqIGopOworCQkJCXZhciB5ID0gcGxvdC5heGlzWS5nZXRDb29yZCh2YWx1ZSwgcGxvdGFyZWEsIHBsb3QpOworCQkJCXZhciBoID0gTWF0aC5hYnMoeUEgLSB5KTsKKwkJCQlpZiAodmFsdWUgPCBwbG90LmF4aXNYLm9yaWdpbikgeworCQkJCQl5QSA9IHk7CisJCQkJCXkgPSB5T3JpZ2luOworCQkJCX0KKwkJCQl2YXIgYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpyZWN0Iik7CisJCQkJYmFyLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCQliYXIuc3R5bGUudG9wID0geSArIDEgKyAicHgiOworCQkJCWJhci5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJCQkJYmFyLnN0eWxlLndpZHRoID0gYmFyV2lkdGggKyAicHgiOworCQkJCWJhci5zdHlsZS5oZWlnaHQgPSBoICsgInB4IjsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCBkYXRhW2pdW2ldLnNlcmllcy5jb2xvcik7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlZCIsICJmYWxzZSIpOworCQkJCWJhci5zdHlsZS5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQkJYmFyLmFwcGVuZENoaWxkKGZpbGwpOworCQkJCWlmIChhcHBseVRvKSB7CisJCQkJCWFwcGx5VG8oYmFyLCBkYXRhW2pdW2ldLnNyYyk7CisJCQkJfQorCQkJCWdyb3VwLmFwcGVuZENoaWxkKGJhcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIEhvcml6b250YWxCYXI6ZnVuY3Rpb24gKHBsb3RhcmVhLCBwbG90LCBrd0FyZ3MsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJdmFyIG4gPSBwbG90LnNlcmllcy5sZW5ndGg7CisJCXZhciBkYXRhID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgdG1wID0gcGxvdC5zZXJpZXNbaV0uZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJZGF0YS5wdXNoKHRtcCk7CisJCX0KKwkJdmFyIHNwYWNlID0gNjsKKwkJdmFyIG5Qb2ludHMgPSBkYXRhWzBdLmxlbmd0aDsKKwkJaWYgKG5Qb2ludHMgPT0gMCkgeworCQkJcmV0dXJuIGdyb3VwOworCQl9CisJCXZhciBoID0gKChhcmVhLmJvdHRvbSAtIGFyZWEudG9wKSAtIChzcGFjZSAqIChuUG9pbnRzIC0gMSkpKSAvIG5Qb2ludHM7CisJCXZhciBiYXJIID0gaCAvIG47CisJCXZhciB4T3JpZ2luID0gcGxvdC5heGlzWC5nZXRDb29yZCgwLCBwbG90YXJlYSwgcGxvdCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7CisJCQl2YXIgeVN0YXJ0ID0gYXJlYS50b3AgKyAoaCAqIGkpICsgKHNwYWNlICogaSk7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykgeworCQkJCXZhciB2YWx1ZSA9IGRhdGFbal1baV0ueTsKKwkJCQl2YXIgeSA9IHlTdGFydCArIChiYXJIICogaik7CisJCQkJdmFyIHhBID0geE9yaWdpbjsKKwkJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQodmFsdWUsIHBsb3RhcmVhLCBwbG90KTsKKwkJCQl2YXIgdyA9IE1hdGguYWJzKHggLSB4QSk7CisJCQkJaWYgKHZhbHVlID4gMCkgeworCQkJCQl4ID0geE9yaWdpbjsKKwkJCQl9CisJCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6cmVjdCIpOworCQkJCWJhci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJYmFyLnN0eWxlLnRvcCA9IHkgKyAxICsgInB4IjsKKwkJCQliYXIuc3R5bGUubGVmdCA9IHhBICsgInB4IjsKKwkJCQliYXIuc3R5bGUud2lkdGggPSB3ICsgInB4IjsKKwkJCQliYXIuc3R5bGUuaGVpZ2h0ID0gYmFySCArICJweCI7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwgZGF0YVtqXVtpXS5zZXJpZXMuY29sb3IpOworCQkJCWJhci5zZXRBdHRyaWJ1dGUoInN0cm9rZWQiLCAiZmFsc2UiKTsKKwkJCQliYXIuc3R5bGUuYW50aWFsaWFzID0gImZhbHNlIjsKKwkJCQl2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJCWZpbGwuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJCWJhci5hcHBlbmRDaGlsZChmaWxsKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGJhciwgZGF0YVtqXVtpXS5zcmMpOworCQkJCX0KKwkJCQlncm91cC5hcHBlbmRDaGlsZChiYXIpOworCQkJfQorCQl9CisJCXZhciBzcGFjZSA9IDQ7CisJCXZhciBuID0gcGxvdC5zZXJpZXMubGVuZ3RoOworCQl2YXIgaCA9ICgoYXJlYS5ib3R0b20gLSBhcmVhLnRvcCkgLSAoc3BhY2UgKiAobiAtIDEpKSkgLyBuOworCQl2YXIgeE9yaWdpbiA9IHBsb3QuYXhpc1guZ2V0Q29vcmQoMCwgcGxvdGFyZWEsIHBsb3QpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHNlcmllcyA9IHBsb3Quc2VyaWVzW2ldOworCQkJdmFyIGRhdGEgPSBzZXJpZXMuZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJdmFyIHkgPSBhcmVhLnRvcCArIChoICogaSkgKyAoc3BhY2UgKiBpKTsKKwkJCXZhciB2YWx1ZSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXS55OworCQkJdmFyIHhBID0geE9yaWdpbjsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZSwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIHcgPSBNYXRoLmFicyh4QSAtIHgpOworCQkJaWYgKHZhbHVlID4gMCkgeworCQkJCXhBID0geDsKKwkJCQl4ID0geE9yaWdpbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgR2FudHQ6ZnVuY3Rpb24gKHBsb3RhcmVhLCBwbG90LCBrd0FyZ3MsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJdmFyIG4gPSBwbG90LnNlcmllcy5sZW5ndGg7CisJCXZhciBkYXRhID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgdG1wID0gcGxvdC5zZXJpZXNbaV0uZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJZGF0YS5wdXNoKHRtcCk7CisJCX0KKwkJdmFyIHNwYWNlID0gMjsKKwkJdmFyIG5Qb2ludHMgPSBkYXRhWzBdLmxlbmd0aDsKKwkJaWYgKG5Qb2ludHMgPT0gMCkgeworCQkJcmV0dXJuIGdyb3VwOworCQl9CisJCXZhciBoID0gKChhcmVhLmJvdHRvbSAtIGFyZWEudG9wKSAtIChzcGFjZSAqIChuUG9pbnRzIC0gMSkpKSAvIG5Qb2ludHM7CisJCXZhciBiYXJIID0gaCAvIG47CisJCWZvciAodmFyIGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7CisJCQl2YXIgeVN0YXJ0ID0gYXJlYS50b3AgKyAoaCAqIGkpICsgKHNwYWNlICogaSk7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykgeworCQkJCXZhciBoaWdoID0gZGF0YVtqXVtpXS5oaWdoOworCQkJCXZhciBsb3cgPSBkYXRhW2pdW2ldLmxvdzsKKwkJCQlpZiAobG93ID4gaGlnaCkgeworCQkJCQl2YXIgdCA9IGhpZ2g7CisJCQkJCWhpZ2ggPSBsb3c7CisJCQkJCWxvdyA9IHQ7CisJCQkJfQorCQkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChsb3csIHBsb3RhcmVhLCBwbG90KTsKKwkJCQl2YXIgdyA9IHBsb3QuYXhpc1guZ2V0Q29vcmQoaGlnaCwgcGxvdGFyZWEsIHBsb3QpIC0geDsKKwkJCQl2YXIgeSA9IHlTdGFydCArIChiYXJIICogaik7CisJCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6cmVjdCIpOworCQkJCWJhci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJYmFyLnN0eWxlLnRvcCA9IHkgKyAxICsgInB4IjsKKwkJCQliYXIuc3R5bGUubGVmdCA9IHggKyAicHgiOworCQkJCWJhci5zdHlsZS53aWR0aCA9IHcgKyAicHgiOworCQkJCWJhci5zdHlsZS5oZWlnaHQgPSBiYXJIICsgInB4IjsKKwkJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCBkYXRhW2pdW2ldLnNlcmllcy5jb2xvcik7CisJCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlZCIsICJmYWxzZSIpOworCQkJCWJhci5zdHlsZS5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQkJYmFyLmFwcGVuZENoaWxkKGZpbGwpOworCQkJCWlmIChhcHBseVRvKSB7CisJCQkJCWFwcGx5VG8oYmFyLCBkYXRhW2pdW2ldLnNyYyk7CisJCQkJfQorCQkJCWdyb3VwLmFwcGVuZENoaWxkKGJhcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIFN0YWNrZWRBcmVhOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLl9ncm91cChwbG90YXJlYSk7CisJCXZhciBuID0gcGxvdC5zZXJpZXMubGVuZ3RoOworCQl2YXIgZGF0YSA9IFtdOworCQl2YXIgdG90YWxzID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgdG1wID0gcGxvdC5zZXJpZXNbaV0uZGF0YS5ldmFsdWF0ZShrd0FyZ3MpOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCB0bXAubGVuZ3RoOyBqKyspIHsKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCXRvdGFscy5wdXNoKHRtcFtqXS55KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0b3RhbHNbal0gKz0gdG1wW2pdLnk7CisJCQkJfQorCQkJCXRtcFtqXS55ID0gdG90YWxzW2pdOworCQkJfQorCQkJZGF0YS5wdXNoKHRtcCk7CisJCX0KKwkJZm9yICh2YXIgaSA9IG4gLSAxOyBpID49IDA7IGktLSkgeworCQkJdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnNoYXBlIik7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXVswXS5zZXJpZXMuY29sb3IpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIGRhdGFbaV1bMF0uc2VyaWVzLmNvbG9yKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJjb29yZHNpemUiLCAoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgKyAiLCIgKyAoYXJlYS5ib3R0b20gLSBhcmVhLnRvcCkpOworCQkJcGF0aC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQlwYXRoLnN0eWxlLnRvcCA9ICIwcHgiOworCQkJcGF0aC5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCQlwYXRoLnN0eWxlLndpZHRoID0gYXJlYS5yaWdodCAtIGFyZWEubGVmdCArICJweCI7CisJCQlwYXRoLnN0eWxlLmhlaWdodCA9IGFyZWEuYm90dG9tIC0gYXJlYS50b3AgKyAicHgiOworCQkJdmFyIHN0cm9rZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCQlzdHJva2Uuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuOCIpOworCQkJcGF0aC5hcHBlbmRDaGlsZChzdHJva2UpOworCQkJdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCWZpbGwuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNCIpOworCQkJcGF0aC5hcHBlbmRDaGlsZChmaWxsKTsKKwkJCXZhciBjbWQgPSBbXTsKKwkJCXZhciByID0gMzsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykgeworCQkJCXZhciB2YWx1ZXMgPSBkYXRhW2ldOworCQkJCXZhciB4ID0gTWF0aC5yb3VuZChwbG90LmF4aXNYLmdldENvb3JkKHZhbHVlc1tqXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCXZhciB5ID0gTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlc1tqXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCWlmIChqID09IDApIHsKKwkJCQkJY21kLnB1c2goIm0iKTsKKwkJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJCX0gZWxzZSB7CisJCQkJCWNtZC5wdXNoKCJsIik7CisJCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCQl9CisJCQkJdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2Om92YWwiKTsKKwkJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJCWMuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsIHZhbHVlc1tqXS5zZXJpZXMuY29sb3IpOworCQkJCWMuc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCB2YWx1ZXNbal0uc2VyaWVzLmNvbG9yKTsKKwkJCQl2YXIgc3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuOCIpOworCQkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCQlzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCQl2YXIgcyA9IGMuc3R5bGU7CisJCQkJcy5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJcy50b3AgPSAoeSAtIHIpICsgInB4IjsKKwkJCQlzLmxlZnQgPSAoeCAtIHIpICsgInB4IjsKKwkJCQlzLndpZHRoID0gKHIgKiAyKSArICJweCI7CisJCQkJcy5oZWlnaHQgPSAociAqIDIpICsgInB4IjsKKwkJCQlncm91cC5hcHBlbmRDaGlsZChjKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGMsIGRhdGFbal0uc3JjKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goImwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpKTsKKwkJCQljbWQucHVzaCgibCIpOworCQkJCWNtZC5wdXNoKE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhWzBdWzBdLngsIHBsb3RhcmVhLCBwbG90KSkgKyAiLCIgKyBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQocGxvdC5heGlzWC5vcmlnaW4sIHBsb3RhcmVhLCBwbG90KSkpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgdmFsdWVzID0gZGF0YVtpIC0gMV07CisJCQkJY21kLnB1c2goImwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0ueSwgcGxvdGFyZWEsIHBsb3QpKSk7CisJCQkJZm9yICh2YXIgaiA9IHZhbHVlcy5sZW5ndGggLSAyOyBqID49IDA7IGotLSkgeworCQkJCQl2YXIgeCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbal0ueCwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJCWNtZC5wdXNoKCJsIik7CisJCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCQl9CisJCQl9CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgicGF0aCIsIGNtZC5qb2luKCIgIikgKyAiIHggZSIpOworCQkJZ3JvdXAuYXBwZW5kQ2hpbGQocGF0aCk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0sIFN0YWNrZWRDdXJ2ZWRBcmVhOmZ1bmN0aW9uIChwbG90YXJlYSwgcGxvdCwga3dBcmdzLCBhcHBseVRvKSB7CisJCXZhciB0ZW5zaW9uID0gMzsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJdmFyIG4gPSBwbG90LnNlcmllcy5sZW5ndGg7CisJCXZhciBkYXRhID0gW107CisJCXZhciB0b3RhbHMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXZhciB0bXAgPSBwbG90LnNlcmllc1tpXS5kYXRhLmV2YWx1YXRlKGt3QXJncyk7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IHRtcC5sZW5ndGg7IGorKykgeworCQkJCWlmIChpID09IDApIHsKKwkJCQkJdG90YWxzLnB1c2godG1wW2pdLnkpOworCQkJCX0gZWxzZSB7CisJCQkJCXRvdGFsc1tqXSArPSB0bXBbal0ueTsKKwkJCQl9CisJCQkJdG1wW2pdLnkgPSB0b3RhbHNbal07CisJCQl9CisJCQlkYXRhLnB1c2godG1wKTsKKwkJfQorCQlmb3IgKHZhciBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQl2YXIgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c2hhcGUiKTsKKwkJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2V3ZWlnaHQiLCAiMXB4Iik7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBkYXRhW2ldWzBdLnNlcmllcy5jb2xvcik7CisJCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgZGF0YVtpXVswXS5zZXJpZXMuY29sb3IpOworCQkJcGF0aC5zZXRBdHRyaWJ1dGUoImNvb3Jkc2l6ZSIsIChhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0KSArICIsIiArIChhcmVhLmJvdHRvbSAtIGFyZWEudG9wKSk7CisJCQlwYXRoLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXBhdGguc3R5bGUudG9wID0gIjBweCI7CisJCQlwYXRoLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJCXBhdGguc3R5bGUud2lkdGggPSBhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0ICsgInB4IjsKKwkJCXBhdGguc3R5bGUuaGVpZ2h0ID0gYXJlYS5ib3R0b20gLSBhcmVhLnRvcCArICJweCI7CisJCQl2YXIgc3Ryb2tlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJCXN0cm9rZS5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC44Iik7CisJCQlwYXRoLmFwcGVuZENoaWxkKHN0cm9rZSk7CisJCQl2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC40Iik7CisJCQlwYXRoLmFwcGVuZENoaWxkKGZpbGwpOworCQkJdmFyIGNtZCA9IFtdOworCQkJdmFyIHIgPSAzOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7CisJCQkJdmFyIHZhbHVlcyA9IGRhdGFbaV07CisJCQkJdmFyIHggPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1guZ2V0Q29vcmQodmFsdWVzW2pdLngsIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJaWYgKGogPT0gMCkgeworCQkJCQljbWQucHVzaCgibSIpOworCQkJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFyIGxhc3R4ID0gTWF0aC5yb3VuZChwbG90LmF4aXNYLmdldENvb3JkKHZhbHVlc1tqIC0gMV0ueCwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQkJdmFyIGxhc3R5ID0gTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlc1tqIC0gMV0ueSwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQkJdmFyIGR4ID0geCAtIGxhc3R4OworCQkJCQl2YXIgZHkgPSB5IC0gbGFzdHk7CisJCQkJCWNtZC5wdXNoKCJjIik7CisJCQkJCXZhciBjeCA9IE1hdGgucm91bmQoKHggLSAodGVuc2lvbiAtIDEpICogKGR4IC8gdGVuc2lvbikpKTsKKwkJCQkJY21kLnB1c2goY3ggKyAiLCIgKyBsYXN0eSk7CisJCQkJCWN4ID0gTWF0aC5yb3VuZCgoeCAtIChkeCAvIHRlbnNpb24pKSk7CisJCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgeSk7CisJCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCQl9CisJCQkJdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2Om92YWwiKTsKKwkJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJCWMuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsIHZhbHVlc1tqXS5zZXJpZXMuY29sb3IpOworCQkJCWMuc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCB2YWx1ZXNbal0uc2VyaWVzLmNvbG9yKTsKKwkJCQl2YXIgc3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuOCIpOworCQkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCQlzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCQl2YXIgcyA9IGMuc3R5bGU7CisJCQkJcy5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJcy50b3AgPSAoeSAtIHIpICsgInB4IjsKKwkJCQlzLmxlZnQgPSAoeCAtIHIpICsgInB4IjsKKwkJCQlzLndpZHRoID0gKHIgKiAyKSArICJweCI7CisJCQkJcy5oZWlnaHQgPSAociAqIDIpICsgInB4IjsKKwkJCQlncm91cC5hcHBlbmRDaGlsZChjKTsKKwkJCQlpZiAoYXBwbHlUbykgeworCQkJCQlhcHBseVRvKGMsIGRhdGFbal0uc3JjKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goImwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpKTsKKwkJCQljbWQucHVzaCgibCIpOworCQkJCWNtZC5wdXNoKE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhWzBdWzBdLngsIHBsb3RhcmVhLCBwbG90KSkgKyAiLCIgKyBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQocGxvdC5heGlzWC5vcmlnaW4sIHBsb3RhcmVhLCBwbG90KSkpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgdmFsdWVzID0gZGF0YVtpIC0gMV07CisJCQkJY21kLnB1c2goImwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0ueSwgcGxvdGFyZWEsIHBsb3QpKSk7CisJCQkJZm9yICh2YXIgaiA9IHZhbHVlcy5sZW5ndGggLSAyOyBqID49IDA7IGotLSkgeworCQkJCQl2YXIgeCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbal0ueCwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQodmFsdWVzW2pdLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJCXZhciBsYXN0eCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZCh2YWx1ZXNbaiArIDFdLngsIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJCXZhciBsYXN0eSA9IE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZCh2YWx1ZXNbaiArIDFdLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQkJCXZhciBkeCA9IHggLSBsYXN0eDsKKwkJCQkJdmFyIGR5ID0geSAtIGxhc3R5OworCQkJCQljbWQucHVzaCgiYyIpOworCQkJCQl2YXIgY3ggPSBNYXRoLnJvdW5kKCh4IC0gKHRlbnNpb24gLSAxKSAqIChkeCAvIHRlbnNpb24pKSk7CisJCQkJCWNtZC5wdXNoKGN4ICsgIiwiICsgbGFzdHkpOworCQkJCQljeCA9IE1hdGgucm91bmQoKHggLSAoZHggLyB0ZW5zaW9uKSkpOworCQkJCQljbWQucHVzaChjeCArICIsIiArIHkpOworCQkJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQkJfQorCQkJfQorCQkJcGF0aC5zZXRBdHRyaWJ1dGUoInBhdGgiLCBjbWQuam9pbigiICIpICsgIiB4IGUiKTsKKwkJCWdyb3VwLmFwcGVuZENoaWxkKHBhdGgpOworCQl9CisJCXJldHVybiBncm91cDsKKwl9LCBEYXRhQmFyOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGdyb3VwID0gZG9qby5jaGFydGluZy5QbG90dGVycy5fZ3JvdXAocGxvdGFyZWEpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgdyA9IChhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0KSAvIChwbG90LmF4aXNYLnJhbmdlLnVwcGVyIC0gcGxvdC5heGlzWC5yYW5nZS5sb3dlcik7CisJCXZhciB5T3JpZ2luID0gcGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIHZhbHVlID0gZGF0YVtpXS55OworCQkJdmFyIHlBID0geU9yaWdpbjsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMikgKyAxOworCQkJdmFyIHkgPSBwbG90LmF4aXNZLmdldENvb3JkKHZhbHVlLCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgaCA9IE1hdGguYWJzKHlBIC0geSk7CisJCQlpZiAodmFsdWUgPCBwbG90LmF4aXNYLm9yaWdpbikgeworCQkJCXlBID0geTsKKwkJCQl5ID0geU9yaWdpbjsKKwkJCX0KKwkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnJlY3QiKTsKKwkJCWJhci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQliYXIuc3R5bGUudG9wID0geSArIDEgKyAicHgiOworCQkJYmFyLnN0eWxlLmxlZnQgPSB4ICsgInB4IjsKKwkJCWJhci5zdHlsZS53aWR0aCA9IHcgKyAicHgiOworCQkJYmFyLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOworCQkJYmFyLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlZCIsICJmYWxzZSIpOworCQkJYmFyLnN0eWxlLmFudGlhbGlhcyA9ICJmYWxzZSI7CisJCQl2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQliYXIuYXBwZW5kQ2hpbGQoZmlsbCk7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8oYmFyLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCQlncm91cC5hcHBlbmRDaGlsZChiYXIpOworCQl9CisJCXJldHVybiBncm91cDsKKwl9LCBMaW5lOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGdyb3VwID0gZG9qby5jaGFydGluZy5QbG90dGVycy5fZ3JvdXAocGxvdGFyZWEpOworCQlpZiAoZGF0YS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIGdyb3VwOworCQl9CisJCXZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzaGFwZSIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjJweCIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCAibm9uZSIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbGVkIiwgImZhbHNlIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJjb29yZHNpemUiLCAoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgKyAiLCIgKyAoYXJlYS5ib3R0b20gLSBhcmVhLnRvcCkpOworCQlwYXRoLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJcGF0aC5zdHlsZS50b3AgPSAiMHB4IjsKKwkJcGF0aC5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCXBhdGguc3R5bGUud2lkdGggPSBhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0ICsgInB4IjsKKwkJcGF0aC5zdHlsZS5oZWlnaHQgPSBhcmVhLmJvdHRvbSAtIGFyZWEudG9wICsgInB4IjsKKwkJdmFyIHN0cm9rZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCXN0cm9rZS5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC44Iik7CisJCXBhdGguYXBwZW5kQ2hpbGQoc3Ryb2tlKTsKKwkJdmFyIGNtZCA9IFtdOworCQl2YXIgciA9IDM7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJaWYgKGkgPT0gMCkgeworCQkJCWNtZC5wdXNoKCJtIik7CisJCQkJY21kLnB1c2goeCArICIsIiArIHkpOworCQkJfSBlbHNlIHsKKwkJCQljbWQucHVzaCgibCIpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCX0KKwkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpvdmFsIik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCXZhciBzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnN0cm9rZSIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjgiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXN0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXZhciBzID0gYy5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAoeSAtIHIpICsgInB4IjsKKwkJCXMubGVmdCA9ICh4IC0gcikgKyAicHgiOworCQkJcy53aWR0aCA9IChyICogMikgKyAicHgiOworCQkJcy5oZWlnaHQgPSAociAqIDIpICsgInB4IjsKKwkJCWdyb3VwLmFwcGVuZENoaWxkKGMpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJfQorCQlwYXRoLnNldEF0dHJpYnV0ZSgicGF0aCIsIGNtZC5qb2luKCIgIikgKyAiIGUiKTsKKwkJZ3JvdXAuYXBwZW5kQ2hpbGQocGF0aCk7CisJCXJldHVybiBncm91cDsKKwl9LCBDdXJ2ZWRMaW5lOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgdGVuc2lvbiA9IDM7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLl9ncm91cChwbG90YXJlYSk7CisJCWlmIChkYXRhLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gZ3JvdXA7CisJCX0KKwkJdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnNoYXBlIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2V3ZWlnaHQiLCAiMnB4Iik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsIGRhdGFbMF0uc2VyaWVzLmNvbG9yKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsICJub25lIik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsZWQiLCAiZmFsc2UiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoImNvb3Jkc2l6ZSIsIChhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0KSArICIsIiArIChhcmVhLmJvdHRvbSAtIGFyZWEudG9wKSk7CisJCXBhdGguc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlwYXRoLnN0eWxlLnRvcCA9ICIwcHgiOworCQlwYXRoLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJcGF0aC5zdHlsZS53aWR0aCA9IGFyZWEucmlnaHQgLSBhcmVhLmxlZnQgKyAicHgiOworCQlwYXRoLnN0eWxlLmhlaWdodCA9IGFyZWEuYm90dG9tIC0gYXJlYS50b3AgKyAicHgiOworCQl2YXIgc3Ryb2tlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJc3Ryb2tlLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjgiKTsKKwkJcGF0aC5hcHBlbmRDaGlsZChzdHJva2UpOworCQl2YXIgY21kID0gW107CisJCXZhciByID0gMzsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSk7CisJCQl2YXIgeSA9IE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIm0iKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQl9IGVsc2UgeworCQkJCXZhciBsYXN0eCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2kgLSAxXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCXZhciBsYXN0eSA9IE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2kgLSAxXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCXZhciBkeCA9IHggLSBsYXN0eDsKKwkJCQl2YXIgZHkgPSB5IC0gbGFzdHk7CisJCQkJY21kLnB1c2goImMiKTsKKwkJCQl2YXIgY3ggPSBNYXRoLnJvdW5kKCh4IC0gKHRlbnNpb24gLSAxKSAqIChkeCAvIHRlbnNpb24pKSk7CisJCQkJY21kLnB1c2goY3ggKyAiLCIgKyBsYXN0eSk7CisJCQkJY3ggPSBNYXRoLnJvdW5kKCh4IC0gKGR4IC8gdGVuc2lvbikpKTsKKwkJCQljbWQucHVzaChjeCArICIsIiArIHkpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCX0KKwkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpvdmFsIik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCXZhciBzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnN0cm9rZSIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjgiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXN0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXZhciBzID0gYy5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAoeSAtIHIpICsgInB4IjsKKwkJCXMubGVmdCA9ICh4IC0gcikgKyAicHgiOworCQkJcy53aWR0aCA9IChyICogMikgKyAicHgiOworCQkJcy5oZWlnaHQgPSAociAqIDIpICsgInB4IjsKKwkJCWdyb3VwLmFwcGVuZENoaWxkKGMpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJfQorCQlwYXRoLnNldEF0dHJpYnV0ZSgicGF0aCIsIGNtZC5qb2luKCIgIikgKyAiIGUiKTsKKwkJZ3JvdXAuYXBwZW5kQ2hpbGQocGF0aCk7CisJCXJldHVybiBncm91cDsKKwl9LCBBcmVhOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGdyb3VwID0gZG9qby5jaGFydGluZy5QbG90dGVycy5fZ3JvdXAocGxvdGFyZWEpOworCQlpZiAoZGF0YS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIGdyb3VwOworCQl9CisJCXZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzaGFwZSIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCBkYXRhWzBdLnNlcmllcy5jb2xvcik7CisJCXBhdGguc2V0QXR0cmlidXRlKCJjb29yZHNpemUiLCAoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgKyAiLCIgKyAoYXJlYS5ib3R0b20gLSBhcmVhLnRvcCkpOworCQlwYXRoLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJcGF0aC5zdHlsZS50b3AgPSAiMHB4IjsKKwkJcGF0aC5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCXBhdGguc3R5bGUud2lkdGggPSBhcmVhLnJpZ2h0IC0gYXJlYS5sZWZ0ICsgInB4IjsKKwkJcGF0aC5zdHlsZS5oZWlnaHQgPSBhcmVhLmJvdHRvbSAtIGFyZWEudG9wICsgInB4IjsKKwkJdmFyIHN0cm9rZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCXN0cm9rZS5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC44Iik7CisJCXBhdGguYXBwZW5kQ2hpbGQoc3Ryb2tlKTsKKwkJdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC40Iik7CisJCXBhdGguYXBwZW5kQ2hpbGQoZmlsbCk7CisJCXZhciBjbWQgPSBbXTsKKwkJdmFyIHIgPSAzOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCXZhciB4ID0gTWF0aC5yb3VuZChwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbaV0ueCwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCXZhciB5ID0gTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKGRhdGFbaV0ueSwgcGxvdGFyZWEsIHBsb3QpKTsKKwkJCWlmIChpID09IDApIHsKKwkJCQljbWQucHVzaCgibSIpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCX0gZWxzZSB7CisJCQkJY21kLnB1c2goImwiKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQl9CisJCQl2YXIgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6b3ZhbCIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsICIxcHgiKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWMuc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQl2YXIgc3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJCXN0ci5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC44Iik7CisJCQljLmFwcGVuZENoaWxkKHN0cik7CisJCQlzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCXN0ci5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQljLmFwcGVuZENoaWxkKHN0cik7CisJCQl2YXIgcyA9IGMuc3R5bGU7CisJCQlzLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXMudG9wID0gKHkgLSByKSArICJweCI7CisJCQlzLmxlZnQgPSAoeCAtIHIpICsgInB4IjsKKwkJCXMud2lkdGggPSAociAqIDIpICsgInB4IjsKKwkJCXMuaGVpZ2h0ID0gKHIgKiAyKSArICJweCI7CisJCQlncm91cC5hcHBlbmRDaGlsZChjKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhjLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCX0KKwkJY21kLnB1c2goImwiKTsKKwkJY21kLnB1c2goeCArICIsIiArIE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKSk7CisJCWNtZC5wdXNoKCJsIik7CisJCWNtZC5wdXNoKE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhWzBdLngsIHBsb3RhcmVhLCBwbG90KSkgKyAiLCIgKyBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQocGxvdC5heGlzWC5vcmlnaW4sIHBsb3RhcmVhLCBwbG90KSkpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgicGF0aCIsIGNtZC5qb2luKCIgIikgKyAiIHggZSIpOworCQlncm91cC5hcHBlbmRDaGlsZChwYXRoKTsKKwkJcmV0dXJuIGdyb3VwOworCX0sIEN1cnZlZEFyZWE6ZnVuY3Rpb24gKGRhdGEsIHBsb3RhcmVhLCBwbG90LCBhcHBseVRvKSB7CisJCXZhciB0ZW5zaW9uID0gMzsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJaWYgKGRhdGEubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBncm91cDsKKwkJfQorCQl2YXIgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c2hhcGUiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsICIxcHgiKTsKKwkJcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVswXS5zZXJpZXMuY29sb3IpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgZGF0YVswXS5zZXJpZXMuY29sb3IpOworCQlwYXRoLnNldEF0dHJpYnV0ZSgiY29vcmRzaXplIiwgKGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpICsgIiwiICsgKGFyZWEuYm90dG9tIC0gYXJlYS50b3ApKTsKKwkJcGF0aC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCXBhdGguc3R5bGUudG9wID0gIjBweCI7CisJCXBhdGguc3R5bGUubGVmdCA9ICIwcHgiOworCQlwYXRoLnN0eWxlLndpZHRoID0gYXJlYS5yaWdodCAtIGFyZWEubGVmdCArICJweCI7CisJCXBhdGguc3R5bGUuaGVpZ2h0ID0gYXJlYS5ib3R0b20gLSBhcmVhLnRvcCArICJweCI7CisJCXZhciBzdHJva2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnN0cm9rZSIpOworCQlzdHJva2Uuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuOCIpOworCQlwYXRoLmFwcGVuZENoaWxkKHN0cm9rZSk7CisJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCWZpbGwuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNCIpOworCQlwYXRoLmFwcGVuZENoaWxkKGZpbGwpOworCQl2YXIgY21kID0gW107CisJCXZhciByID0gMzsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSk7CisJCQl2YXIgeSA9IE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnksIHBsb3RhcmVhLCBwbG90KSk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJY21kLnB1c2goIm0iKTsKKwkJCQljbWQucHVzaCh4ICsgIiwiICsgeSk7CisJCQl9IGVsc2UgeworCQkJCXZhciBsYXN0eCA9IE1hdGgucm91bmQocGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2kgLSAxXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCXZhciBsYXN0eSA9IE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2kgLSAxXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJCXZhciBkeCA9IHggLSBsYXN0eDsKKwkJCQl2YXIgZHkgPSB5IC0gbGFzdHk7CisJCQkJY21kLnB1c2goImMiKTsKKwkJCQl2YXIgY3ggPSBNYXRoLnJvdW5kKCh4IC0gKHRlbnNpb24gLSAxKSAqIChkeCAvIHRlbnNpb24pKSk7CisJCQkJY21kLnB1c2goY3ggKyAiLCIgKyBsYXN0eSk7CisJCQkJY3ggPSBNYXRoLnJvdW5kKCh4IC0gKGR4IC8gdGVuc2lvbikpKTsKKwkJCQljbWQucHVzaChjeCArICIsIiArIHkpOworCQkJCWNtZC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCX0KKwkJCXZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpvdmFsIik7CisJCQljLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQkJYy5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYy5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCXZhciBzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnN0cm9rZSIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjgiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXN0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCWMuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCXZhciBzID0gYy5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAoeSAtIHIpICsgInB4IjsKKwkJCXMubGVmdCA9ICh4IC0gcikgKyAicHgiOworCQkJcy53aWR0aCA9IChyICogMikgKyAicHgiOworCQkJcy5oZWlnaHQgPSAociAqIDIpICsgInB4IjsKKwkJCWdyb3VwLmFwcGVuZENoaWxkKGMpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKGMsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJfQorCQljbWQucHVzaCgibCIpOworCQljbWQucHVzaCh4ICsgIiwiICsgTWF0aC5yb3VuZChwbG90LmF4aXNZLmdldENvb3JkKHBsb3QuYXhpc1gub3JpZ2luLCBwbG90YXJlYSwgcGxvdCkpKTsKKwkJY21kLnB1c2goImwiKTsKKwkJY21kLnB1c2goTWF0aC5yb3VuZChwbG90LmF4aXNYLmdldENvb3JkKGRhdGFbMF0ueCwgcGxvdGFyZWEsIHBsb3QpKSArICIsIiArIE1hdGgucm91bmQocGxvdC5heGlzWS5nZXRDb29yZChwbG90LmF4aXNYLm9yaWdpbiwgcGxvdGFyZWEsIHBsb3QpKSk7CisJCXBhdGguc2V0QXR0cmlidXRlKCJwYXRoIiwgY21kLmpvaW4oIiAiKSArICIgeCBlIik7CisJCWdyb3VwLmFwcGVuZENoaWxkKHBhdGgpOworCQlyZXR1cm4gZ3JvdXA7CisJfSwgSGlnaExvdzpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJdmFyIG4gPSBkYXRhLmxlbmd0aDsKKwkJdmFyIHBhcnQgPSAoKGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpIC8gKHBsb3QuYXhpc1gucmFuZ2UudXBwZXIgLSBwbG90LmF4aXNYLnJhbmdlLmxvd2VyKSkgLyA0OworCQl2YXIgdyA9IHBhcnQgKiAyOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIGhpZ2ggPSBkYXRhW2ldLmhpZ2g7CisJCQl2YXIgbG93ID0gZGF0YVtpXS5sb3c7CisJCQlpZiAobG93ID4gaGlnaCkgeworCQkJCXZhciB0ID0gbG93OworCQkJCWxvdyA9IGhpZ2g7CisJCQkJaGlnaCA9IHQ7CisJCQl9CisJCQl2YXIgeCA9IHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCkgLSAodyAvIDIpOworCQkJdmFyIHkgPSBwbG90LmF4aXNZLmdldENvb3JkKGhpZ2gsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBoID0gcGxvdC5heGlzWS5nZXRDb29yZChsb3csIHBsb3RhcmVhLCBwbG90KSAtIHk7CisJCQl2YXIgYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpyZWN0Iik7CisJCQliYXIuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJYmFyLnN0eWxlLnRvcCA9IHkgKyAxICsgInB4IjsKKwkJCWJhci5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJCQliYXIuc3R5bGUud2lkdGggPSB3ICsgInB4IjsKKwkJCWJhci5zdHlsZS5oZWlnaHQgPSBoICsgInB4IjsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInN0cm9rZWQiLCAiZmFsc2UiKTsKKwkJCWJhci5zdHlsZS5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCWZpbGwuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJYmFyLmFwcGVuZENoaWxkKGZpbGwpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKGJhciwgZGF0YVtpXS5zcmMpOworCQkJfQorCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoYmFyKTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgSGlnaExvd0Nsb3NlOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgYXJlYSA9IHBsb3RhcmVhLmdldEFyZWEoKTsKKwkJdmFyIGdyb3VwID0gZG9qby5jaGFydGluZy5QbG90dGVycy5fZ3JvdXAocGxvdGFyZWEpOworCQl2YXIgbiA9IGRhdGEubGVuZ3RoOworCQl2YXIgcGFydCA9ICgoYXJlYS5yaWdodCAtIGFyZWEubGVmdCkgLyAocGxvdC5heGlzWC5yYW5nZS51cHBlciAtIHBsb3QuYXhpc1gucmFuZ2UubG93ZXIpKSAvIDQ7CisJCXZhciB3ID0gcGFydCAqIDI7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl2YXIgaGlnaCA9IGRhdGFbaV0uaGlnaDsKKwkJCXZhciBsb3cgPSBkYXRhW2ldLmxvdzsKKwkJCWlmIChsb3cgPiBoaWdoKSB7CisJCQkJdmFyIHQgPSBsb3c7CisJCQkJbG93ID0gaGlnaDsKKwkJCQloaWdoID0gdDsKKwkJCX0KKwkJCXZhciBjID0gZGF0YVtpXS5jbG9zZTsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMik7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoaGlnaCwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGggPSBwbG90LmF4aXNZLmdldENvb3JkKGxvdywgcGxvdGFyZWEsIHBsb3QpIC0geTsKKwkJCXZhciBjbG9zZSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoYywgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnJlY3QiKTsKKwkJCWJhci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQliYXIuc3R5bGUudG9wID0geSArIDEgKyAicHgiOworCQkJYmFyLnN0eWxlLmxlZnQgPSB4ICsgInB4IjsKKwkJCWJhci5zdHlsZS53aWR0aCA9IHcgKyAicHgiOworCQkJYmFyLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOworCQkJYmFyLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlZCIsICJmYWxzZSIpOworCQkJYmFyLnN0eWxlLmFudGlhbGlhcyA9ICJmYWxzZSI7CisJCQl2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQliYXIuYXBwZW5kQ2hpbGQoZmlsbCk7CisJCQlnLmFwcGVuZENoaWxkKGJhcik7CisJCQl2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6bGluZSIpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsICIxcHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJmcm9tIiwgeCArICJweCwiICsgY2xvc2UgKyAicHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ0byIsICh4ICsgdyArIChwYXJ0ICogMikgLSAyKSArICJweCwiICsgY2xvc2UgKyAicHgiKTsKKwkJCXZhciBzID0gbGluZS5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAiMHB4IjsKKwkJCXMubGVmdCA9ICIwcHgiOworCQkJcy5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJdmFyIHN0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJbGluZS5hcHBlbmRDaGlsZChzdHIpOworCQkJZy5hcHBlbmRDaGlsZChsaW5lKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhnLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCQlncm91cC5hcHBlbmRDaGlsZChnKTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgSGlnaExvd09wZW5DbG9zZTpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIGFyZWEgPSBwbG90YXJlYS5nZXRBcmVhKCk7CisJCXZhciBncm91cCA9IGRvam8uY2hhcnRpbmcuUGxvdHRlcnMuX2dyb3VwKHBsb3RhcmVhKTsKKwkJdmFyIG4gPSBkYXRhLmxlbmd0aDsKKwkJdmFyIHBhcnQgPSAoKGFyZWEucmlnaHQgLSBhcmVhLmxlZnQpIC8gKHBsb3QuYXhpc1gucmFuZ2UudXBwZXIgLSBwbG90LmF4aXNYLnJhbmdlLmxvd2VyKSkgLyA0OworCQl2YXIgdyA9IHBhcnQgKiAyOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgeworCQkJdmFyIGhpZ2ggPSBkYXRhW2ldLmhpZ2g7CisJCQl2YXIgbG93ID0gZGF0YVtpXS5sb3c7CisJCQlpZiAobG93ID4gaGlnaCkgeworCQkJCXZhciB0ID0gbG93OworCQkJCWxvdyA9IGhpZ2g7CisJCQkJaGlnaCA9IHQ7CisJCQl9CisJCQl2YXIgbyA9IGRhdGFbaV0ub3BlbjsKKwkJCXZhciBjID0gZGF0YVtpXS5jbG9zZTsKKwkJCXZhciB4ID0gcGxvdC5heGlzWC5nZXRDb29yZChkYXRhW2ldLngsIHBsb3RhcmVhLCBwbG90KSAtICh3IC8gMik7CisJCQl2YXIgeSA9IHBsb3QuYXhpc1kuZ2V0Q29vcmQoaGlnaCwgcGxvdGFyZWEsIHBsb3QpOworCQkJdmFyIGggPSBwbG90LmF4aXNZLmdldENvb3JkKGxvdywgcGxvdGFyZWEsIHBsb3QpIC0geTsKKwkJCXZhciBvcGVuID0gcGxvdC5heGlzWS5nZXRDb29yZChvLCBwbG90YXJlYSwgcGxvdCk7CisJCQl2YXIgY2xvc2UgPSBwbG90LmF4aXNZLmdldENvb3JkKGMsIHBsb3RhcmVhLCBwbG90KTsKKwkJCXZhciBnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQl2YXIgYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpyZWN0Iik7CisJCQliYXIuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJYmFyLnN0eWxlLnRvcCA9IHkgKyAxICsgInB4IjsKKwkJCWJhci5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJCQliYXIuc3R5bGUud2lkdGggPSB3ICsgInB4IjsKKwkJCWJhci5zdHlsZS5oZWlnaHQgPSBoICsgInB4IjsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInN0cm9rZWQiLCAiZmFsc2UiKTsKKwkJCWJhci5zdHlsZS5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJCWZpbGwuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJYmFyLmFwcGVuZENoaWxkKGZpbGwpOworCQkJZy5hcHBlbmRDaGlsZChiYXIpOworCQkJdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmxpbmUiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2V3ZWlnaHQiLCAiMXB4Iik7CisJCQlsaW5lLnNldEF0dHJpYnV0ZSgiZnJvbSIsICh4IC0gKHBhcnQgKiAyKSkgKyAicHgsIiArIG9wZW4gKyAicHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ0byIsICh4ICsgdyAtIDIpICsgInB4LCIgKyBvcGVuICsgInB4Iik7CisJCQl2YXIgcyA9IGxpbmUuc3R5bGU7CisJCQlzLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXMudG9wID0gIjBweCI7CisJCQlzLmxlZnQgPSAiMHB4IjsKKwkJCXMuYW50aWFsaWFzID0gImZhbHNlIjsKKwkJCXZhciBzdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnN0cm9rZSIpOworCQkJc3RyLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCWxpbmUuYXBwZW5kQ2hpbGQoc3RyKTsKKwkJCWcuYXBwZW5kQ2hpbGQobGluZSk7CisJCQl2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6bGluZSIpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsICIxcHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJmcm9tIiwgeCArICJweCwiICsgY2xvc2UgKyAicHgiKTsKKwkJCWxpbmUuc2V0QXR0cmlidXRlKCJ0byIsICh4ICsgdyArIChwYXJ0ICogMikgLSAyKSArICJweCwiICsgY2xvc2UgKyAicHgiKTsKKwkJCXZhciBzID0gbGluZS5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy50b3AgPSAiMHB4IjsKKwkJCXMubGVmdCA9ICIwcHgiOworCQkJcy5hbnRpYWxpYXMgPSAiZmFsc2UiOworCQkJdmFyIHN0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCQlzdHIuc2V0QXR0cmlidXRlKCJvcGFjaXR5IiwgIjAuNiIpOworCQkJbGluZS5hcHBlbmRDaGlsZChzdHIpOworCQkJZy5hcHBlbmRDaGlsZChsaW5lKTsKKwkJCWlmIChhcHBseVRvKSB7CisJCQkJYXBwbHlUbyhnLCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCQlncm91cC5hcHBlbmRDaGlsZChnKTsKKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgU2NhdHRlcjpmdW5jdGlvbiAoZGF0YSwgcGxvdGFyZWEsIHBsb3QsIGFwcGx5VG8pIHsKKwkJdmFyIHIgPSA2OworCQl2YXIgbW9kID0gciAvIDI7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLl9ncm91cChwbG90YXJlYSk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJdmFyIHBvaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpyZWN0Iik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgZGF0YVtpXS5zZXJpZXMuY29sb3IpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQl2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6ZmlsbCIpOworCQkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC42Iik7CisJCQlwb2ludC5hcHBlbmRDaGlsZChmaWxsKTsKKwkJCXZhciBzID0gcG9pbnQuc3R5bGU7CisJCQlzLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXMucm90YXRpb24gPSAiNDUiOworCQkJcy50b3AgPSAoeSAtIG1vZCkgKyAicHgiOworCQkJcy5sZWZ0ID0gKHggLSBtb2QpICsgInB4IjsKKwkJCXMud2lkdGggPSByICsgInB4IjsKKwkJCXMuaGVpZ2h0ID0gciArICJweCI7CisJCQlncm91cC5hcHBlbmRDaGlsZChwb2ludCk7CisJCQlpZiAoYXBwbHlUbykgeworCQkJCWFwcGx5VG8ocG9pbnQsIGRhdGFbaV0uc3JjKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JvdXA7CisJfSwgQnViYmxlOmZ1bmN0aW9uIChkYXRhLCBwbG90YXJlYSwgcGxvdCwgYXBwbHlUbykgeworCQl2YXIgc2l6ZUZhY3RvciA9IDE7CisJCXZhciBhcmVhID0gcGxvdGFyZWEuZ2V0QXJlYSgpOworCQl2YXIgZ3JvdXAgPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLl9ncm91cChwbG90YXJlYSk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1guZ2V0Q29vcmQoZGF0YVtpXS54LCBwbG90YXJlYSwgcGxvdCkpOworCQkJdmFyIHkgPSBNYXRoLnJvdW5kKHBsb3QuYXhpc1kuZ2V0Q29vcmQoZGF0YVtpXS55LCBwbG90YXJlYSwgcGxvdCkpOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXZhciByYXcgPSBkYXRhW2ldLnNpemU7CisJCQkJdmFyIGR5ID0gcGxvdC5heGlzWS5nZXRDb29yZChkYXRhW2ldLnkgKyByYXcsIHBsb3RhcmVhLCBwbG90KSAtIHk7CisJCQkJc2l6ZUZhY3RvciA9IGR5IC8gcmF3OworCQkJfQorCQkJaWYgKHNpemVGYWN0b3IgPCAxKSB7CisJCQkJc2l6ZUZhY3RvciA9IDE7CisJCQl9CisJCQl2YXIgciA9IChkYXRhW2ldLnNpemUgLyAyKSAqIHNpemVGYWN0b3I7CisJCQl2YXIgcG9pbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2Om92YWwiKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBkYXRhW2ldLnNlcmllcy5jb2xvcik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIGRhdGFbaV0uc2VyaWVzLmNvbG9yKTsKKwkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQlmaWxsLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCXBvaW50LmFwcGVuZENoaWxkKGZpbGwpOworCQkJdmFyIHMgPSBwb2ludC5zdHlsZTsKKwkJCXMucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJcy5yb3RhdGlvbiA9ICI0NSI7CisJCQlzLnRvcCA9ICh5IC0gcikgKyAicHgiOworCQkJcy5sZWZ0ID0gKHggLSByKSArICJweCI7CisJCQlzLndpZHRoID0gKHIgKiAyKSArICJweCI7CisJCQlzLmhlaWdodCA9IChyICogMikgKyAicHgiOworCQkJZ3JvdXAuYXBwZW5kQ2hpbGQocG9pbnQpOworCQkJaWYgKGFwcGx5VG8pIHsKKwkJCQlhcHBseVRvKHBvaW50LCBkYXRhW2ldLnNyYyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX19KTsKKwlkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzWyJEZWZhdWx0Il0gPSBkb2pvLmNoYXJ0aW5nLlBsb3R0ZXJzLkxpbmU7Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9BcnJheUxpc3QuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQXJyYXlMaXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTBiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQXJyYXlMaXN0LmpzCkBAIC0wLDAgKzEsMTE0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLkFycmF5TGlzdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25zIik7Citkb2pvLmNvbGxlY3Rpb25zLkFycmF5TGlzdCA9IGZ1bmN0aW9uIChhcnIpIHsKKwl2YXIgaXRlbXMgPSBbXTsKKwlpZiAoYXJyKSB7CisJCWl0ZW1zID0gaXRlbXMuY29uY2F0KGFycik7CisJfQorCXRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7CisJdGhpcy5hZGQgPSBmdW5jdGlvbiAob2JqKSB7CisJCWl0ZW1zLnB1c2gob2JqKTsKKwkJdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDsKKwl9OworCXRoaXMuYWRkUmFuZ2UgPSBmdW5jdGlvbiAoYSkgeworCQlpZiAoYS5nZXRJdGVyYXRvcikgeworCQkJdmFyIGUgPSBhLmdldEl0ZXJhdG9yKCk7CisJCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJCXRoaXMuYWRkKGUuZ2V0KCkpOworCQkJfQorCQkJdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworCQkJCWl0ZW1zLnB1c2goYVtpXSk7CisJCQl9CisJCQl0aGlzLmNvdW50ID0gaXRlbXMubGVuZ3RoOworCQl9CisJfTsKKwl0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkgeworCQlpdGVtcy5zcGxpY2UoMCwgaXRlbXMubGVuZ3RoKTsKKwkJdGhpcy5jb3VudCA9IDA7CisJfTsKKwl0aGlzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KGl0ZW1zKTsKKwl9OworCXRoaXMuY29udGFpbnMgPSBmdW5jdGlvbiAob2JqKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpdGVtc1tpXSA9PSBvYmopIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfTsKKwl0aGlzLmZvckVhY2ggPSBmdW5jdGlvbiAoZm4sIHNjb3BlKSB7CisJCXZhciBzID0gc2NvcGUgfHwgZGpfZ2xvYmFsOworCQlpZiAoQXJyYXkuZm9yRWFjaCkgeworCQkJQXJyYXkuZm9yRWFjaChpdGVtcywgZm4sIHMpOworCQl9IGVsc2UgeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCWZuLmNhbGwocywgaXRlbXNbaV0sIGksIGl0ZW1zKTsKKwkJCX0KKwkJfQorCX07CisJdGhpcy5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIG5ldyBkb2pvLmNvbGxlY3Rpb25zLkl0ZXJhdG9yKGl0ZW1zKTsKKwl9OworCXRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uIChvYmopIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGl0ZW1zW2ldID09IG9iaikgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9OworCXRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24gKGksIG9iaikgeworCQlpdGVtcy5zcGxpY2UoaSwgMCwgb2JqKTsKKwkJdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDsKKwl9OworCXRoaXMuaXRlbSA9IGZ1bmN0aW9uIChpKSB7CisJCXJldHVybiBpdGVtc1tpXTsKKwl9OworCXRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKG9iaikgeworCQl2YXIgaSA9IHRoaXMuaW5kZXhPZihvYmopOworCQlpZiAoaSA+PSAwKSB7CisJCQlpdGVtcy5zcGxpY2UoaSwgMSk7CisJCX0KKwkJdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDsKKwl9OworCXRoaXMucmVtb3ZlQXQgPSBmdW5jdGlvbiAoaSkgeworCQlpdGVtcy5zcGxpY2UoaSwgMSk7CisJCXRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7CisJfTsKKwl0aGlzLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7CisJCWl0ZW1zLnJldmVyc2UoKTsKKwl9OworCXRoaXMuc29ydCA9IGZ1bmN0aW9uIChmbikgeworCQlpZiAoZm4pIHsKKwkJCWl0ZW1zLnNvcnQoZm4pOworCQl9IGVsc2UgeworCQkJaXRlbXMuc29ydCgpOworCQl9CisJfTsKKwl0aGlzLnNldEJ5SW5kZXggPSBmdW5jdGlvbiAoaSwgb2JqKSB7CisJCWl0ZW1zW2ldID0gb2JqOworCQl0aGlzLmNvdW50ID0gaXRlbXMubGVuZ3RoOworCX07CisJdGhpcy50b0FycmF5ID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gW10uY29uY2F0KGl0ZW1zKTsKKwl9OworCXRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbiAoZGVsaW0pIHsKKwkJcmV0dXJuIGl0ZW1zLmpvaW4oKGRlbGltIHx8ICIsIikpOworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQmluYXJ5VHJlZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9CaW5hcnlUcmVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yjc1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQmluYXJ5VHJlZS5qcwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jb2xsZWN0aW9ucy5CaW5hcnlUcmVlIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuQ29sbGVjdGlvbnMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmNvbGxlY3Rpb25zLkJpbmFyeVRyZWUiKTsKK2Rvam8uY29sbGVjdGlvbnMuQmluYXJ5VHJlZSA9IGZ1bmN0aW9uIChkYXRhKSB7CisJZnVuY3Rpb24gbm9kZShkYXRhLCBybm9kZSwgbG5vZGUpIHsKKwkJdGhpcy52YWx1ZSA9IGRhdGEgfHwgbnVsbDsKKwkJdGhpcy5yaWdodCA9IHJub2RlIHx8IG51bGw7CisJCXRoaXMubGVmdCA9IGxub2RlIHx8IG51bGw7CisJCXRoaXMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CisJCQl2YXIgYyA9IG5ldyBub2RlKCk7CisJCQlpZiAodGhpcy52YWx1ZS52YWx1ZSkgeworCQkJCWMudmFsdWUgPSB0aGlzLnZhbHVlLmNsb25lKCk7CisJCQl9IGVsc2UgeworCQkJCWMudmFsdWUgPSB0aGlzLnZhbHVlOworCQkJfQorCQkJaWYgKHRoaXMubGVmdCkgeworCQkJCWMubGVmdCA9IHRoaXMubGVmdC5jbG9uZSgpOworCQkJfQorCQkJaWYgKHRoaXMucmlnaHQpIHsKKwkJCQljLnJpZ2h0ID0gdGhpcy5yaWdodC5jbG9uZSgpOworCQkJfQorCQl9OworCQl0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbiAobikgeworCQkJaWYgKHRoaXMudmFsdWUgPiBuLnZhbHVlKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAodGhpcy52YWx1ZSA8IG4udmFsdWUpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfTsKKwkJdGhpcy5jb21wYXJlRGF0YSA9IGZ1bmN0aW9uIChkKSB7CisJCQlpZiAodGhpcy52YWx1ZSA+IGQpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmICh0aGlzLnZhbHVlIDwgZCkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9OworCX0KKwlmdW5jdGlvbiBpbm9yZGVyVHJhdmVyc2FsQnVpbGR1cChjdXJyZW50LCBhKSB7CisJCWlmIChjdXJyZW50KSB7CisJCQlpbm9yZGVyVHJhdmVyc2FsQnVpbGR1cChjdXJyZW50LmxlZnQsIGEpOworCQkJYS5hZGQoY3VycmVudCk7CisJCQlpbm9yZGVyVHJhdmVyc2FsQnVpbGR1cChjdXJyZW50LnJpZ2h0LCBhKTsKKwkJfQorCX0KKwlmdW5jdGlvbiBwcmVvcmRlclRyYXZlcnNhbChjdXJyZW50LCBzZXApIHsKKwkJdmFyIHMgPSAiIjsKKwkJaWYgKGN1cnJlbnQpIHsKKwkJCXMgPSBjdXJyZW50LnZhbHVlLnRvU3RyaW5nKCkgKyBzZXA7CisJCQlzICs9IHByZW9yZGVyVHJhdmVyc2FsKGN1cnJlbnQubGVmdCwgc2VwKTsKKwkJCXMgKz0gcHJlb3JkZXJUcmF2ZXJzYWwoY3VycmVudC5yaWdodCwgc2VwKTsKKwkJfQorCQlyZXR1cm4gczsKKwl9CisJZnVuY3Rpb24gaW5vcmRlclRyYXZlcnNhbChjdXJyZW50LCBzZXApIHsKKwkJdmFyIHMgPSAiIjsKKwkJaWYgKGN1cnJlbnQpIHsKKwkJCXMgPSBpbm9yZGVyVHJhdmVyc2FsKGN1cnJlbnQubGVmdCwgc2VwKTsKKwkJCXMgKz0gY3VycmVudC52YWx1ZS50b1N0cmluZygpICsgc2VwOworCQkJcyArPSBpbm9yZGVyVHJhdmVyc2FsKGN1cnJlbnQucmlnaHQsIHNlcCk7CisJCX0KKwkJcmV0dXJuIHM7CisJfQorCWZ1bmN0aW9uIHBvc3RvcmRlclRyYXZlcnNhbChjdXJyZW50LCBzZXApIHsKKwkJdmFyIHMgPSAiIjsKKwkJaWYgKGN1cnJlbnQpIHsKKwkJCXMgPSBwb3N0b3JkZXJUcmF2ZXJzYWwoY3VycmVudC5sZWZ0LCBzZXApOworCQkJcyArPSBwb3N0b3JkZXJUcmF2ZXJzYWwoY3VycmVudC5yaWdodCwgc2VwKTsKKwkJCXMgKz0gY3VycmVudC52YWx1ZS50b1N0cmluZygpICsgc2VwOworCQl9CisJCXJldHVybiBzOworCX0KKwlmdW5jdGlvbiBzZWFyY2hIZWxwZXIoY3VycmVudCwgZGF0YSkgeworCQlpZiAoIWN1cnJlbnQpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXZhciBpID0gY3VycmVudC5jb21wYXJlRGF0YShkYXRhKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJcmV0dXJuIGN1cnJlbnQ7CisJCX0KKwkJaWYgKGkgPiAwKSB7CisJCQlyZXR1cm4gc2VhcmNoSGVscGVyKGN1cnJlbnQubGVmdCwgZGF0YSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gc2VhcmNoSGVscGVyKGN1cnJlbnQucmlnaHQsIGRhdGEpOworCQl9CisJfQorCXRoaXMuYWRkID0gZnVuY3Rpb24gKGRhdGEpIHsKKwkJdmFyIG4gPSBuZXcgbm9kZShkYXRhKTsKKwkJdmFyIGk7CisJCXZhciBjdXJyZW50ID0gcm9vdDsKKwkJdmFyIHBhcmVudCA9IG51bGw7CisJCXdoaWxlIChjdXJyZW50KSB7CisJCQlpID0gY3VycmVudC5jb21wYXJlKG4pOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXBhcmVudCA9IGN1cnJlbnQ7CisJCQlpZiAoaSA+IDApIHsKKwkJCQljdXJyZW50ID0gY3VycmVudC5sZWZ0OworCQkJfSBlbHNlIHsKKwkJCQljdXJyZW50ID0gY3VycmVudC5yaWdodDsKKwkJCX0KKwkJfQorCQl0aGlzLmNvdW50Kys7CisJCWlmICghcGFyZW50KSB7CisJCQlyb290ID0gbjsKKwkJfSBlbHNlIHsKKwkJCWkgPSBwYXJlbnQuY29tcGFyZShuKTsKKwkJCWlmIChpID4gMCkgeworCQkJCXBhcmVudC5sZWZ0ID0gbjsKKwkJCX0gZWxzZSB7CisJCQkJcGFyZW50LnJpZ2h0ID0gbjsKKwkJCX0KKwkJfQorCX07CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJcm9vdCA9IG51bGw7CisJCXRoaXMuY291bnQgPSAwOworCX07CisJdGhpcy5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIGMgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5CaW5hcnlUcmVlKCk7CisJCWMucm9vdCA9IHJvb3QuY2xvbmUoKTsKKwkJYy5jb3VudCA9IHRoaXMuY291bnQ7CisJCXJldHVybiBjOworCX07CisJdGhpcy5jb250YWlucyA9IGZ1bmN0aW9uIChkYXRhKSB7CisJCXJldHVybiB0aGlzLnNlYXJjaChkYXRhKSAhPSBudWxsOworCX07CisJdGhpcy5kZWxldGVEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHsKKwkJdmFyIGN1cnJlbnQgPSByb290OworCQl2YXIgcGFyZW50ID0gbnVsbDsKKwkJdmFyIGkgPSBjdXJyZW50LmNvbXBhcmVEYXRhKGRhdGEpOworCQl3aGlsZSAoaSAhPSAwICYmIGN1cnJlbnQgIT0gbnVsbCkgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJcGFyZW50ID0gY3VycmVudDsKKwkJCQljdXJyZW50ID0gY3VycmVudC5sZWZ0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaSA8IDApIHsKKwkJCQkJcGFyZW50ID0gY3VycmVudDsKKwkJCQkJY3VycmVudCA9IGN1cnJlbnQucmlnaHQ7CisJCQkJfQorCQkJfQorCQkJaSA9IGN1cnJlbnQuY29tcGFyZURhdGEoZGF0YSk7CisJCX0KKwkJaWYgKCFjdXJyZW50KSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5jb3VudC0tOworCQlpZiAoIWN1cnJlbnQucmlnaHQpIHsKKwkJCWlmICghcGFyZW50KSB7CisJCQkJcm9vdCA9IGN1cnJlbnQubGVmdDsKKwkJCX0gZWxzZSB7CisJCQkJaSA9IHBhcmVudC5jb21wYXJlKGN1cnJlbnQpOworCQkJCWlmIChpID4gMCkgeworCQkJCQlwYXJlbnQubGVmdCA9IGN1cnJlbnQubGVmdDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaSA8IDApIHsKKwkJCQkJCXBhcmVudC5yaWdodCA9IGN1cnJlbnQubGVmdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghY3VycmVudC5yaWdodC5sZWZ0KSB7CisJCQkJaWYgKCFwYXJlbnQpIHsKKwkJCQkJcm9vdCA9IGN1cnJlbnQucmlnaHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaSA9IHBhcmVudC5jb21wYXJlKGN1cnJlbnQpOworCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCXBhcmVudC5sZWZ0ID0gY3VycmVudC5yaWdodDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChpIDwgMCkgeworCQkJCQkJCXBhcmVudC5yaWdodCA9IGN1cnJlbnQucmlnaHQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZhciBsZWZ0bW9zdCA9IGN1cnJlbnQucmlnaHQubGVmdDsKKwkJCQl2YXIgbG1QYXJlbnQgPSBjdXJyZW50LnJpZ2h0OworCQkJCXdoaWxlIChsZWZ0bW9zdC5sZWZ0ICE9IG51bGwpIHsKKwkJCQkJbG1QYXJlbnQgPSBsZWZ0bW9zdDsKKwkJCQkJbGVmdG1vc3QgPSBsZWZ0bW9zdC5sZWZ0OworCQkJCX0KKwkJCQlsbVBhcmVudC5sZWZ0ID0gbGVmdG1vc3QucmlnaHQ7CisJCQkJbGVmdG1vc3QubGVmdCA9IGN1cnJlbnQubGVmdDsKKwkJCQlsZWZ0bW9zdC5yaWdodCA9IGN1cnJlbnQucmlnaHQ7CisJCQkJaWYgKCFwYXJlbnQpIHsKKwkJCQkJcm9vdCA9IGxlZnRtb3N0OworCQkJCX0gZWxzZSB7CisJCQkJCWkgPSBwYXJlbnQuY29tcGFyZShjdXJyZW50KTsKKwkJCQkJaWYgKGkgPiAwKSB7CisJCQkJCQlwYXJlbnQubGVmdCA9IGxlZnRtb3N0OworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGkgPCAwKSB7CisJCQkJCQkJcGFyZW50LnJpZ2h0ID0gbGVmdG1vc3Q7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9OworCXRoaXMuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBhID0gW107CisJCWlub3JkZXJUcmF2ZXJzYWxCdWlsZHVwKHJvb3QsIGEpOworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuSXRlcmF0b3IoYSk7CisJfTsKKwl0aGlzLnNlYXJjaCA9IGZ1bmN0aW9uIChkYXRhKSB7CisJCXJldHVybiBzZWFyY2hIZWxwZXIocm9vdCwgZGF0YSk7CisJfTsKKwl0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKG9yZGVyLCBzZXApIHsKKwkJaWYgKCFvcmRlcikgeworCQkJdmFyIG9yZGVyID0gZG9qby5jb2xsZWN0aW9ucy5CaW5hcnlUcmVlLlRyYXZlcnNhbE1ldGhvZHMuSW5vcmRlcjsKKwkJfQorCQlpZiAoIXNlcCkgeworCQkJdmFyIHNlcCA9ICIgIjsKKwkJfQorCQl2YXIgcyA9ICIiOworCQlzd2l0Y2ggKG9yZGVyKSB7CisJCSAgY2FzZSBkb2pvLmNvbGxlY3Rpb25zLkJpbmFyeVRyZWUuVHJhdmVyc2FsTWV0aG9kcy5QcmVvcmRlcjoKKwkJCXMgPSBwcmVvcmRlclRyYXZlcnNhbChyb290LCBzZXApOworCQkJYnJlYWs7CisJCSAgY2FzZSBkb2pvLmNvbGxlY3Rpb25zLkJpbmFyeVRyZWUuVHJhdmVyc2FsTWV0aG9kcy5Jbm9yZGVyOgorCQkJcyA9IGlub3JkZXJUcmF2ZXJzYWwocm9vdCwgc2VwKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgZG9qby5jb2xsZWN0aW9ucy5CaW5hcnlUcmVlLlRyYXZlcnNhbE1ldGhvZHMuUG9zdG9yZGVyOgorCQkJcyA9IHBvc3RvcmRlclRyYXZlcnNhbChyb290LCBzZXApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHMubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiAiIjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBzLnN1YnN0cmluZygwLCBzLmxlbmd0aCAtIHNlcC5sZW5ndGgpOworCQl9CisJfTsKKwl0aGlzLmNvdW50ID0gMDsKKwl2YXIgcm9vdCA9IHRoaXMucm9vdCA9IG51bGw7CisJaWYgKGRhdGEpIHsKKwkJdGhpcy5hZGQoZGF0YSk7CisJfQorfTsKK2Rvam8uY29sbGVjdGlvbnMuQmluYXJ5VHJlZS5UcmF2ZXJzYWxNZXRob2RzID0ge1ByZW9yZGVyOjEsIElub3JkZXI6MiwgUG9zdG9yZGVyOjN9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQ29sbGVjdGlvbnMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvQ29sbGVjdGlvbnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMzk5NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9Db2xsZWN0aW9ucy5qcwpAQCAtMCwwICsxLDkyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25zIik7Citkb2pvLmNvbGxlY3Rpb25zLkRpY3Rpb25hcnlFbnRyeSA9IGZ1bmN0aW9uIChrLCB2KSB7CisJdGhpcy5rZXkgPSBrOworCXRoaXMudmFsdWUgPSB2OworCXRoaXMudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfTsKKwl0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpOworCX07Cit9OworZG9qby5jb2xsZWN0aW9ucy5JdGVyYXRvciA9IGZ1bmN0aW9uIChhcnIpIHsKKwl2YXIgYSA9IGFycjsKKwl2YXIgcG9zaXRpb24gPSAwOworCXRoaXMuZWxlbWVudCA9IGFbcG9zaXRpb25dIHx8IG51bGw7CisJdGhpcy5hdEVuZCA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIChwb3NpdGlvbiA+PSBhLmxlbmd0aCk7CisJfTsKKwl0aGlzLmdldCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuYXRFbmQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdGhpcy5lbGVtZW50ID0gYVtwb3NpdGlvbisrXTsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudDsKKwl9OworCXRoaXMubWFwID0gZnVuY3Rpb24gKGZuLCBzY29wZSkgeworCQl2YXIgcyA9IHNjb3BlIHx8IGRqX2dsb2JhbDsKKwkJaWYgKEFycmF5Lm1hcCkgeworCQkJcmV0dXJuIEFycmF5Lm1hcChhLCBmbiwgcyk7CisJCX0gZWxzZSB7CisJCQl2YXIgYXJyID0gW107CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKwkJCQlhcnIucHVzaChmbi5jYWxsKHMsIGFbaV0pKTsKKwkJCX0KKwkJCXJldHVybiBhcnI7CisJCX0KKwl9OworCXRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7CisJCXBvc2l0aW9uID0gMDsKKwkJdGhpcy5lbGVtZW50ID0gYVtwb3NpdGlvbl07CisJfTsKK307Citkb2pvLmNvbGxlY3Rpb25zLkRpY3Rpb25hcnlJdGVyYXRvciA9IGZ1bmN0aW9uIChvYmopIHsKKwl2YXIgYSA9IFtdOworCXZhciB0ZXN0T2JqZWN0ID0ge307CisJZm9yICh2YXIgcCBpbiBvYmopIHsKKwkJaWYgKCF0ZXN0T2JqZWN0W3BdKSB7CisJCQlhLnB1c2gob2JqW3BdKTsKKwkJfQorCX0KKwl2YXIgcG9zaXRpb24gPSAwOworCXRoaXMuZWxlbWVudCA9IGFbcG9zaXRpb25dIHx8IG51bGw7CisJdGhpcy5hdEVuZCA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIChwb3NpdGlvbiA+PSBhLmxlbmd0aCk7CisJfTsKKwl0aGlzLmdldCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuYXRFbmQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdGhpcy5lbGVtZW50ID0gYVtwb3NpdGlvbisrXTsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudDsKKwl9OworCXRoaXMubWFwID0gZnVuY3Rpb24gKGZuLCBzY29wZSkgeworCQl2YXIgcyA9IHNjb3BlIHx8IGRqX2dsb2JhbDsKKwkJaWYgKEFycmF5Lm1hcCkgeworCQkJcmV0dXJuIEFycmF5Lm1hcChhLCBmbiwgcyk7CisJCX0gZWxzZSB7CisJCQl2YXIgYXJyID0gW107CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKwkJCQlhcnIucHVzaChmbi5jYWxsKHMsIGFbaV0pKTsKKwkJCX0KKwkJCXJldHVybiBhcnI7CisJCX0KKwl9OworCXRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7CisJCXBvc2l0aW9uID0gMDsKKwkJdGhpcy5lbGVtZW50ID0gYVtwb3NpdGlvbl07CisJfTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9EaWN0aW9uYXJ5LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL0RpY3Rpb25hcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmZWM4OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9EaWN0aW9uYXJ5LmpzCkBAIC0wLDAgKzEsMTAxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLkRpY3Rpb25hcnkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5jb2xsZWN0aW9ucy5Db2xsZWN0aW9ucyIpOworZG9qby5jb2xsZWN0aW9ucy5EaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKGRpY3Rpb25hcnkpIHsKKwl2YXIgaXRlbXMgPSB7fTsKKwl0aGlzLmNvdW50ID0gMDsKKwl2YXIgdGVzdE9iamVjdCA9IHt9OworCXRoaXMuYWRkID0gZnVuY3Rpb24gKGssIHYpIHsKKwkJdmFyIGIgPSAoayBpbiBpdGVtcyk7CisJCWl0ZW1zW2tdID0gbmV3IGRvam8uY29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5KGssIHYpOworCQlpZiAoIWIpIHsKKwkJCXRoaXMuY291bnQrKzsKKwkJfQorCX07CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJaXRlbXMgPSB7fTsKKwkJdGhpcy5jb3VudCA9IDA7CisJfTsKKwl0aGlzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuRGljdGlvbmFyeSh0aGlzKTsKKwl9OworCXRoaXMuY29udGFpbnMgPSB0aGlzLmNvbnRhaW5zS2V5ID0gZnVuY3Rpb24gKGspIHsKKwkJaWYgKHRlc3RPYmplY3Rba10pIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKGl0ZW1zW2tdICE9IG51bGwpOworCX07CisJdGhpcy5jb250YWluc1ZhbHVlID0gZnVuY3Rpb24gKHYpIHsKKwkJdmFyIGUgPSB0aGlzLmdldEl0ZXJhdG9yKCk7CisJCXdoaWxlIChlLmdldCgpKSB7CisJCQlpZiAoZS5lbGVtZW50LnZhbHVlID09IHYpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfTsKKwl0aGlzLmVudHJ5ID0gZnVuY3Rpb24gKGspIHsKKwkJcmV0dXJuIGl0ZW1zW2tdOworCX07CisJdGhpcy5mb3JFYWNoID0gZnVuY3Rpb24gKGZuLCBzY29wZSkgeworCQl2YXIgYSA9IFtdOworCQlmb3IgKHZhciBwIGluIGl0ZW1zKSB7CisJCQlpZiAoIXRlc3RPYmplY3RbcF0pIHsKKwkJCQlhLnB1c2goaXRlbXNbcF0pOworCQkJfQorCQl9CisJCXZhciBzID0gc2NvcGUgfHwgZGpfZ2xvYmFsOworCQlpZiAoQXJyYXkuZm9yRWFjaCkgeworCQkJQXJyYXkuZm9yRWFjaChhLCBmbiwgcyk7CisJCX0gZWxzZSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKwkJCQlmbi5jYWxsKHMsIGFbaV0sIGksIGEpOworCQkJfQorCQl9CisJfTsKKwl0aGlzLmdldEtleUxpc3QgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiAodGhpcy5nZXRJdGVyYXRvcigpKS5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7CisJCQlyZXR1cm4gZW50cnkua2V5OworCQl9KTsKKwl9OworCXRoaXMuZ2V0VmFsdWVMaXN0ID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0SXRlcmF0b3IoKSkubWFwKGZ1bmN0aW9uIChlbnRyeSkgeworCQkJcmV0dXJuIGVudHJ5LnZhbHVlOworCQl9KTsKKwl9OworCXRoaXMuaXRlbSA9IGZ1bmN0aW9uIChrKSB7CisJCWlmIChrIGluIGl0ZW1zKSB7CisJCQlyZXR1cm4gaXRlbXNba10udmFsdWVPZigpOworCQl9CisJCXJldHVybiB1bmRlZmluZWQ7CisJfTsKKwl0aGlzLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuRGljdGlvbmFyeUl0ZXJhdG9yKGl0ZW1zKTsKKwl9OworCXRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKGspIHsKKwkJaWYgKGsgaW4gaXRlbXMgJiYgIXRlc3RPYmplY3Rba10pIHsKKwkJCWRlbGV0ZSBpdGVtc1trXTsKKwkJCXRoaXMuY291bnQtLTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9OworCWlmIChkaWN0aW9uYXJ5KSB7CisJCXZhciBlID0gZGljdGlvbmFyeS5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoZS5nZXQoKSkgeworCQkJdGhpcy5hZGQoZS5lbGVtZW50LmtleSwgZS5lbGVtZW50LnZhbHVlKTsKKwkJfQorCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9HcmFwaC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9HcmFwaC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM5OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL0dyYXBoLmpzCkBAIC0wLDAgKzEsMTUxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLkdyYXBoIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuQ29sbGVjdGlvbnMiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmNvbGxlY3Rpb25zLkdyYXBoIik7Citkb2pvLmNvbGxlY3Rpb25zLkdyYXBoID0gZnVuY3Rpb24gKG5vZGVzKSB7CisJZnVuY3Rpb24gbm9kZShrZXksIGRhdGEsIG5laWdoYm9ycykgeworCQl0aGlzLmtleSA9IGtleTsKKwkJdGhpcy5kYXRhID0gZGF0YTsKKwkJdGhpcy5uZWlnaGJvcnMgPSBuZWlnaGJvcnMgfHwgbmV3IGFkamFjZW5jeUxpc3QoKTsKKwkJdGhpcy5hZGREaXJlY3RlZCA9IGZ1bmN0aW9uICgpIHsKKwkJCWlmIChhcmd1bWVudHNbMF0uY29uc3RydWN0b3IgPT0gZWRnZVRvTmVpZ2hib3IpIHsKKwkJCQl0aGlzLm5laWdoYm9ycy5hZGQoYXJndW1lbnRzWzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIG4gPSBhcmd1bWVudHNbMF07CisJCQkJdmFyIGNvc3QgPSBhcmd1bWVudHNbMV0gfHwgMDsKKwkJCQl0aGlzLm5laWdoYm9ycy5hZGQobmV3IGVkZ2VUb05laWdoYm9yKG4sIGNvc3QpKTsKKwkJCX0KKwkJfTsKKwl9CisJZnVuY3Rpb24gbm9kZUxpc3QoKSB7CisJCXZhciBkID0gbmV3IGRvam8uY29sbGVjdGlvbnMuRGljdGlvbmFyeSgpOworCQlmdW5jdGlvbiBub2RlbGlzdGl0ZXJhdG9yKCkgeworCQkJdmFyIG8gPSBbXTsKKwkJCXZhciBlID0gZC5nZXRJdGVyYXRvcigpOworCQkJd2hpbGUgKGUuZ2V0KCkpIHsKKwkJCQlvW28ubGVuZ3RoXSA9IGUuZWxlbWVudDsKKwkJCX0KKwkJCXZhciBwb3NpdGlvbiA9IDA7CisJCQl0aGlzLmVsZW1lbnQgPSBvW3Bvc2l0aW9uXSB8fCBudWxsOworCQkJdGhpcy5hdEVuZCA9IGZ1bmN0aW9uICgpIHsKKwkJCQlyZXR1cm4gKHBvc2l0aW9uID49IG8ubGVuZ3RoKTsKKwkJCX07CisJCQl0aGlzLmdldCA9IGZ1bmN0aW9uICgpIHsKKwkJCQlpZiAodGhpcy5hdEVuZCgpKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQl0aGlzLmVsZW1lbnQgPSBvW3Bvc2l0aW9uKytdOworCQkJCXJldHVybiB0aGlzLmVsZW1lbnQ7CisJCQl9OworCQkJdGhpcy5tYXAgPSBmdW5jdGlvbiAoZm4sIHNjb3BlKSB7CisJCQkJdmFyIHMgPSBzY29wZSB8fCBkal9nbG9iYWw7CisJCQkJaWYgKEFycmF5Lm1hcCkgeworCQkJCQlyZXR1cm4gQXJyYXkubWFwKG8sIGZuLCBzKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgYXJyID0gW107CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKykgeworCQkJCQkJYXJyLnB1c2goZm4uY2FsbChzLCBvW2ldKSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGFycjsKKwkJCQl9CisJCQl9OworCQkJdGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHsKKwkJCQlwb3NpdGlvbiA9IDA7CisJCQkJdGhpcy5lbGVtZW50ID0gb1twb3NpdGlvbl07CisJCQl9OworCQl9CisJCXRoaXMuYWRkID0gZnVuY3Rpb24gKG5vZGUpIHsKKwkJCWQuYWRkKG5vZGUua2V5LCBub2RlKTsKKwkJfTsKKwkJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJCWQuY2xlYXIoKTsKKwkJfTsKKwkJdGhpcy5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrZXkpIHsKKwkJCXJldHVybiBkLmNvbnRhaW5zS2V5KGtleSk7CisJCX07CisJCXRoaXMuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gbmV3IG5vZGVsaXN0aXRlcmF0b3IodGhpcyk7CisJCX07CisJCXRoaXMuaXRlbSA9IGZ1bmN0aW9uIChrZXkpIHsKKwkJCXJldHVybiBkLml0ZW0oa2V5KTsKKwkJfTsKKwkJdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkgeworCQkJZC5yZW1vdmUobm9kZS5rZXkpOworCQl9OworCX0KKwlmdW5jdGlvbiBlZGdlVG9OZWlnaGJvcihub2RlLCBjb3N0KSB7CisJCXRoaXMubmVpZ2hib3IgPSBub2RlOworCQl0aGlzLmNvc3QgPSBjb3N0OworCX0KKwlmdW5jdGlvbiBhZGphY2VuY3lMaXN0KCkgeworCQl2YXIgZCA9IFtdOworCQl0aGlzLmFkZCA9IGZ1bmN0aW9uIChvKSB7CisJCQlkLnB1c2gobyk7CisJCX07CisJCXRoaXMuaXRlbSA9IGZ1bmN0aW9uIChpKSB7CisJCQlyZXR1cm4gZFtpXTsKKwkJfTsKKwkJdGhpcy5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uICgpIHsKKwkJCXJldHVybiBuZXcgZG9qby5jb2xsZWN0aW9ucy5JdGVyYXRvcihbXS5jb25jYXQoZCkpOworCQl9OworCX0KKwl0aGlzLm5vZGVzID0gbm9kZXMgfHwgbmV3IG5vZGVMaXN0KCk7CisJdGhpcy5jb3VudCA9IHRoaXMubm9kZXMuY291bnQ7CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5ub2Rlcy5jbGVhcigpOworCQl0aGlzLmNvdW50ID0gMDsKKwl9OworCXRoaXMuYWRkTm9kZSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIG4gPSBhcmd1bWVudHNbMF07CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworCQkJbiA9IG5ldyBub2RlKGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKTsKKwkJfQorCQlpZiAoIXRoaXMubm9kZXMuY29udGFpbnNLZXkobi5rZXkpKSB7CisJCQl0aGlzLm5vZGVzLmFkZChuKTsKKwkJCXRoaXMuY291bnQrKzsKKwkJfQorCX07CisJdGhpcy5hZGREaXJlY3RlZEVkZ2UgPSBmdW5jdGlvbiAodUtleSwgdktleSwgY29zdCkgeworCQl2YXIgdU5vZGUsIHZOb2RlOworCQlpZiAodUtleS5jb25zdHJ1Y3RvciAhPSBub2RlKSB7CisJCQl1Tm9kZSA9IHRoaXMubm9kZXMuaXRlbSh1S2V5KTsKKwkJCXZOb2RlID0gdGhpcy5ub2Rlcy5pdGVtKHZLZXkpOworCQl9IGVsc2UgeworCQkJdU5vZGUgPSB1S2V5OworCQkJdk5vZGUgPSB2S2V5OworCQl9CisJCXZhciBjID0gY29zdCB8fCAwOworCQl1Tm9kZS5hZGREaXJlY3RlZCh2Tm9kZSwgYyk7CisJfTsKKwl0aGlzLmFkZFVuZGlyZWN0ZWRFZGdlID0gZnVuY3Rpb24gKHVLZXksIHZLZXksIGNvc3QpIHsKKwkJdmFyIHVOb2RlLCB2Tm9kZTsKKwkJaWYgKHVLZXkuY29uc3RydWN0b3IgIT0gbm9kZSkgeworCQkJdU5vZGUgPSB0aGlzLm5vZGVzLml0ZW0odUtleSk7CisJCQl2Tm9kZSA9IHRoaXMubm9kZXMuaXRlbSh2S2V5KTsKKwkJfSBlbHNlIHsKKwkJCXVOb2RlID0gdUtleTsKKwkJCXZOb2RlID0gdktleTsKKwkJfQorCQl2YXIgYyA9IGNvc3QgfHwgMDsKKwkJdU5vZGUuYWRkRGlyZWN0ZWQodk5vZGUsIGMpOworCQl2Tm9kZS5hZGREaXJlY3RlZCh1Tm9kZSwgYyk7CisJfTsKKwl0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24gKG4pIHsKKwkJcmV0dXJuIHRoaXMubm9kZXMuY29udGFpbnNLZXkobi5rZXkpOworCX07CisJdGhpcy5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrKSB7CisJCXJldHVybiB0aGlzLm5vZGVzLmNvbnRhaW5zS2V5KGspOworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvUXVldWUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvUXVldWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0YTdhNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9RdWV1ZS5qcwpAQCAtMCwwICsxLDY3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLlF1ZXVlIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuQ29sbGVjdGlvbnMiKTsKK2Rvam8uY29sbGVjdGlvbnMuUXVldWUgPSBmdW5jdGlvbiAoYXJyKSB7CisJdmFyIHEgPSBbXTsKKwlpZiAoYXJyKSB7CisJCXEgPSBxLmNvbmNhdChhcnIpOworCX0KKwl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJcSA9IFtdOworCQl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJfTsKKwl0aGlzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuUXVldWUocSk7CisJfTsKKwl0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24gKG8pIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAocVtpXSA9PSBvKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX07CisJdGhpcy5jb3B5VG8gPSBmdW5jdGlvbiAoYXJyLCBpKSB7CisJCWFyci5zcGxpY2UoaSwgMCwgcSk7CisJfTsKKwl0aGlzLmRlcXVldWUgPSBmdW5jdGlvbiAoKSB7CisJCXZhciByID0gcS5zaGlmdCgpOworCQl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJCXJldHVybiByOworCX07CisJdGhpcy5lbnF1ZXVlID0gZnVuY3Rpb24gKG8pIHsKKwkJdGhpcy5jb3VudCA9IHEucHVzaChvKTsKKwl9OworCXRoaXMuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgc2NvcGUpIHsKKwkJdmFyIHMgPSBzY29wZSB8fCBkal9nbG9iYWw7CisJCWlmIChBcnJheS5mb3JFYWNoKSB7CisJCQlBcnJheS5mb3JFYWNoKHEsIGZuLCBzKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykgeworCQkJCWZuLmNhbGwocywgcVtpXSwgaSwgcSk7CisJCQl9CisJCX0KKwl9OworCXRoaXMuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBuZXcgZG9qby5jb2xsZWN0aW9ucy5JdGVyYXRvcihxKTsKKwl9OworCXRoaXMucGVlayA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHFbMF07CisJfTsKKwl0aGlzLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBbXS5jb25jYXQocSk7CisJfTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9TZXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODI0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU2V0LmpzCkBAIC0wLDAgKzEsMTE0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLlNldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25zIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0Iik7Citkb2pvLmNvbGxlY3Rpb25zLlNldCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy51bmlvbiA9IGZ1bmN0aW9uIChzZXRBLCBzZXRCKSB7CisJCWlmIChzZXRBLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CisJCQl2YXIgc2V0QSA9IG5ldyBkb2pvLmNvbGxlY3Rpb25zLkFycmF5TGlzdChzZXRBKTsKKwkJfQorCQlpZiAoc2V0Qi5jb25zdHJ1Y3RvciA9PSBBcnJheSkgeworCQkJdmFyIHNldEIgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3Qoc2V0Qik7CisJCX0KKwkJaWYgKCFzZXRBLnRvQXJyYXkgfHwgIXNldEIudG9BcnJheSkgeworCQkJZG9qby5yYWlzZSgiU2V0IG9wZXJhdGlvbnMgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGFycmF5LWJhc2VkIGNvbGxlY3Rpb25zLiIpOworCQl9CisJCXZhciByZXN1bHQgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3Qoc2V0QS50b0FycmF5KCkpOworCQl2YXIgZSA9IHNldEIuZ2V0SXRlcmF0b3IoKTsKKwkJd2hpbGUgKCFlLmF0RW5kKCkpIHsKKwkJCXZhciBpdGVtID0gZS5nZXQoKTsKKwkJCWlmICghcmVzdWx0LmNvbnRhaW5zKGl0ZW0pKSB7CisJCQkJcmVzdWx0LmFkZChpdGVtKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX07CisJdGhpcy5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAoc2V0QSwgc2V0QikgeworCQlpZiAoc2V0QS5jb25zdHJ1Y3RvciA9PSBBcnJheSkgeworCQkJdmFyIHNldEEgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3Qoc2V0QSk7CisJCX0KKwkJaWYgKHNldEIuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKKwkJCXZhciBzZXRCID0gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KHNldEIpOworCQl9CisJCWlmICghc2V0QS50b0FycmF5IHx8ICFzZXRCLnRvQXJyYXkpIHsKKwkJCWRvam8ucmFpc2UoIlNldCBvcGVyYXRpb25zIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBvbiBhcnJheS1iYXNlZCBjb2xsZWN0aW9ucy4iKTsKKwkJfQorCQl2YXIgcmVzdWx0ID0gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KCk7CisJCXZhciBlID0gc2V0Qi5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJdmFyIGl0ZW0gPSBlLmdldCgpOworCQkJaWYgKHNldEEuY29udGFpbnMoaXRlbSkpIHsKKwkJCQlyZXN1bHQuYWRkKGl0ZW0pOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfTsKKwl0aGlzLmRpZmZlcmVuY2UgPSBmdW5jdGlvbiAoc2V0QSwgc2V0QikgeworCQlpZiAoc2V0QS5jb25zdHJ1Y3RvciA9PSBBcnJheSkgeworCQkJdmFyIHNldEEgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3Qoc2V0QSk7CisJCX0KKwkJaWYgKHNldEIuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKKwkJCXZhciBzZXRCID0gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KHNldEIpOworCQl9CisJCWlmICghc2V0QS50b0FycmF5IHx8ICFzZXRCLnRvQXJyYXkpIHsKKwkJCWRvam8ucmFpc2UoIlNldCBvcGVyYXRpb25zIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBvbiBhcnJheS1iYXNlZCBjb2xsZWN0aW9ucy4iKTsKKwkJfQorCQl2YXIgcmVzdWx0ID0gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KCk7CisJCXZhciBlID0gc2V0QS5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJdmFyIGl0ZW0gPSBlLmdldCgpOworCQkJaWYgKCFzZXRCLmNvbnRhaW5zKGl0ZW0pKSB7CisJCQkJcmVzdWx0LmFkZChpdGVtKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX07CisJdGhpcy5pc1N1YlNldCA9IGZ1bmN0aW9uIChzZXRBLCBzZXRCKSB7CisJCWlmIChzZXRBLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CisJCQl2YXIgc2V0QSA9IG5ldyBkb2pvLmNvbGxlY3Rpb25zLkFycmF5TGlzdChzZXRBKTsKKwkJfQorCQlpZiAoc2V0Qi5jb25zdHJ1Y3RvciA9PSBBcnJheSkgeworCQkJdmFyIHNldEIgPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3Qoc2V0Qik7CisJCX0KKwkJaWYgKCFzZXRBLnRvQXJyYXkgfHwgIXNldEIudG9BcnJheSkgeworCQkJZG9qby5yYWlzZSgiU2V0IG9wZXJhdGlvbnMgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGFycmF5LWJhc2VkIGNvbGxlY3Rpb25zLiIpOworCQl9CisJCXZhciBlID0gc2V0QS5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJaWYgKCFzZXRCLmNvbnRhaW5zKGUuZ2V0KCkpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX07CisJdGhpcy5pc1N1cGVyU2V0ID0gZnVuY3Rpb24gKHNldEEsIHNldEIpIHsKKwkJaWYgKHNldEEuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKKwkJCXZhciBzZXRBID0gbmV3IGRvam8uY29sbGVjdGlvbnMuQXJyYXlMaXN0KHNldEEpOworCQl9CisJCWlmIChzZXRCLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CisJCQl2YXIgc2V0QiA9IG5ldyBkb2pvLmNvbGxlY3Rpb25zLkFycmF5TGlzdChzZXRCKTsKKwkJfQorCQlpZiAoIXNldEEudG9BcnJheSB8fCAhc2V0Qi50b0FycmF5KSB7CisJCQlkb2pvLnJhaXNlKCJTZXQgb3BlcmF0aW9ucyBjYW4gb25seSBiZSBwZXJmb3JtZWQgb24gYXJyYXktYmFzZWQgY29sbGVjdGlvbnMuIik7CisJCX0KKwkJdmFyIGUgPSBzZXRCLmdldEl0ZXJhdG9yKCk7CisJCXdoaWxlICghZS5hdEVuZCgpKSB7CisJCQlpZiAoIXNldEEuY29udGFpbnMoZS5nZXQoKSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfTsKK30oKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL1NraXBMaXN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL1NraXBMaXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjBhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU2tpcExpc3QuanMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY29sbGVjdGlvbnMuU2tpcExpc3QiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5jb2xsZWN0aW9ucy5Db2xsZWN0aW9ucyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8uY29sbGVjdGlvbnMuU2tpcExpc3QiKTsKK2Rvam8uY29sbGVjdGlvbnMuU2tpcExpc3QgPSBmdW5jdGlvbiAoKSB7CisJZnVuY3Rpb24gbm9kZShoZWlnaHQsIHZhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsOworCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKKwkJdGhpcy5ub2RlcyA9IG5ldyBub2RlTGlzdChoZWlnaHQpOworCQl0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbiAodmFsKSB7CisJCQlpZiAodGhpcy52YWx1ZSA+IHZhbCkgeworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKHRoaXMudmFsdWUgPCB2YWwpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfTsKKwkJdGhpcy5pbmNyZW1lbnRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CisJCQl0aGlzLm5vZGVzLmluY3JlbWVudEhlaWdodCgpOworCQkJdGhpcy5oZWlnaHQrKzsKKwkJfTsKKwkJdGhpcy5kZWNyZW1lbnRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CisJCQl0aGlzLm5vZGVzLmRlY3JlbWVudEhlaWdodCgpOworCQkJdGhpcy5oZWlnaHQtLTsKKwkJfTsKKwl9CisJZnVuY3Rpb24gbm9kZUxpc3QoaGVpZ2h0KSB7CisJCXZhciBhcnIgPSBbXTsKKwkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJCWFycltpXSA9IG51bGw7CisJCX0KKwkJdGhpcy5pdGVtID0gZnVuY3Rpb24gKGkpIHsKKwkJCXJldHVybiBhcnJbaV07CisJCX07CisJCXRoaXMuaW5jcmVtZW50SGVpZ2h0ID0gZnVuY3Rpb24gKCkgeworCQkJdGhpcy5oZWlnaHQrKzsKKwkJCWFyclt0aGlzLmhlaWdodF0gPSBudWxsOworCQl9OworCQl0aGlzLmRlY3JlbWVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKKwkJCWFyci5zcGxpY2UoYXJyLmxlbmd0aCAtIDEsIDEpOworCQkJdGhpcy5oZWlnaHQtLTsKKwkJfTsKKwl9CisJZnVuY3Rpb24gaXRlcmF0b3IobGlzdCkgeworCQl0aGlzLmVsZW1lbnQgPSBsaXN0LmhlYWQ7CisJCXRoaXMuYXRFbmQgPSBmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gKHRoaXMuZWxlbWVudCA9PSBudWxsKTsKKwkJfTsKKwkJdGhpcy5nZXQgPSBmdW5jdGlvbiAoKSB7CisJCQlpZiAodGhpcy5hdEVuZCgpKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQl0aGlzLmVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubm9kZXNbMF07CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50OworCQl9OworCQl0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkgeworCQkJdGhpcy5lbGVtZW50ID0gbGlzdC5oZWFkOworCQl9OworCX0KKwlmdW5jdGlvbiBjaG9vc2VSYW5kb21IZWlnaHQobWF4KSB7CisJCXZhciBsZXZlbCA9IDE7CisJCXdoaWxlIChNYXRoLnJhbmRvbSgpIDwgUFJPQiAmJiBsZXZlbCA8IG1heCkgeworCQkJbGV2ZWwrKzsKKwkJfQorCQlyZXR1cm4gbGV2ZWw7CisJfQorCXZhciBQUk9CID0gMC41OworCXZhciBjb21wYXJpc29ucyA9IDA7CisJdGhpcy5oZWFkID0gbmV3IG5vZGUoMSk7CisJdGhpcy5jb3VudCA9IDA7CisJdGhpcy5hZGQgPSBmdW5jdGlvbiAodmFsKSB7CisJCXZhciB1cGRhdGVzID0gW107CisJCXZhciBjdXJyZW50ID0gdGhpcy5oZWFkOworCQlmb3IgKHZhciBpID0gdGhpcy5oZWFkLmhlaWdodDsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICghKGN1cnJlbnQubm9kZXNbaV0gIT0gbnVsbCAmJiBjdXJyZW50Lm5vZGVzW2ldLmNvbXBhcmUodmFsKSA8IDApKSB7CisJCQkJY29tcGFyaXNvbnMrKzsKKwkJCX0KKwkJCXdoaWxlIChjdXJyZW50Lm5vZGVzW2ldICE9IG51bGwgJiYgY3VycmVudC5ub2Rlc1tpXS5jb21wYXJlKHZhbCkgPCAwKSB7CisJCQkJY3VycmVudCA9IGN1cnJlbnQubm9kZXNbaV07CisJCQkJY29tcGFyaXNvbnMrKzsKKwkJCX0KKwkJCXVwZGF0ZXNbaV0gPSBjdXJyZW50OworCQl9CisJCWlmIChjdXJyZW50Lm5vZGVzWzBdICE9IG51bGwgJiYgY3VycmVudC5ub2Rlc1swXS5jb21wYXJlKHZhbCkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCXZhciBuID0gbmV3IG5vZGUodmFsLCBjaG9vc2VSYW5kb21IZWlnaHQodGhpcy5oZWFkLmhlaWdodCArIDEpKTsKKwkJdGhpcy5jb3VudCsrOworCQlpZiAobi5oZWlnaHQgPiB0aGlzLmhlYWQuaGVpZ2h0KSB7CisJCQl0aGlzLmhlYWQuaW5jcmVtZW50SGVpZ2h0KCk7CisJCQl0aGlzLmhlYWQubm9kZXNbdGhpcy5oZWFkLmhlaWdodCAtIDFdID0gbjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbi5oZWlnaHQ7IGkrKykgeworCQkJaWYgKGkgPCB1cGRhdGVzLmxlbmd0aCkgeworCQkJCW4ubm9kZXNbaV0gPSB1cGRhdGVzW2ldLm5vZGVzW2ldOworCQkJCXVwZGF0ZXNbaV0ubm9kZXNbaV0gPSBuOworCQkJfQorCQl9CisJfTsKKwl0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24gKHZhbCkgeworCQl2YXIgY3VycmVudCA9IHRoaXMuaGVhZDsKKwkJdmFyIGk7CisJCWZvciAoaSA9IHRoaXMuaGVhZC5oZWlnaHQgLSAxOyBpID49IDA7IGktLSkgeworCQkJd2hpbGUgKGN1cnJlbnQuaXRlbShpKSAhPSBudWxsKSB7CisJCQkJY29tcGFyaXNvbnMrKzsKKwkJCQl2YXIgcmVzdWx0ID0gY3VycmVudC5ub2Rlc1tpXS5jb21wYXJlKHZhbCk7CisJCQkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCQljdXJyZW50ID0gY3VycmVudC5ub2Rlc1tpXTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9OworCXRoaXMuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBuZXcgaXRlcmF0b3IodGhpcyk7CisJfTsKKwl0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHsKKwkJdmFyIHVwZGF0ZXMgPSBbXTsKKwkJdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7CisJCWZvciAodmFyIGkgPSB0aGlzLmhlYWQuaGVpZ2h0IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICghKGN1cnJlbnQubm9kZXNbaV0gIT0gbnVsbCAmJiBjdXJyZW50Lm5vZGVzW2ldLmNvbXBhcmUodmFsKSA8IDApKSB7CisJCQkJY29tcGFyaXNvbnMrKzsKKwkJCX0KKwkJCXdoaWxlIChjdXJyZW50Lm5vZGVzW2ldICE9IG51bGwgJiYgY3VycmVudC5ub2Rlc1tpXS5jb21wYXJlKHZhbCkgPCAwKSB7CisJCQkJY3VycmVudCA9IGN1cnJlbnQubm9kZXNbaV07CisJCQkJY29tcGFyaXNvbnMrKzsKKwkJCX0KKwkJCXVwZGF0ZXNbaV0gPSBjdXJyZW50OworCQl9CisJCWN1cnJlbnQgPSBjdXJyZW50Lm5vZGVzWzBdOworCQlpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuY29tcGFyZSh2YWwpID09IDApIHsKKwkJCXRoaXMuY291bnQtLTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5oZWFkLmhlaWdodDsgaSsrKSB7CisJCQkJaWYgKHVwZGF0ZXNbaV0ubm9kZXNbaV0gIT0gY3VycmVudCkgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQl1cGRhdGVzW2ldLm5vZGVzW2ldID0gY3VycmVudC5ub2Rlc1tpXTsKKwkJCQl9CisJCQl9CisJCQlpZiAodGhpcy5oZWFkLm5vZGVzW3RoaXMuaGVhZC5oZWlnaHQgLSAxXSA9PSBudWxsKSB7CisJCQkJdGhpcy5oZWFkLmRlY3JlbWVudEhlaWdodCgpOworCQkJfQorCQl9CisJfTsKKwl0aGlzLnJlc2V0Q29tcGFyaXNvbnMgPSBmdW5jdGlvbiAoKSB7CisJCWNvbXBhcmlzb25zID0gMDsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL1NvcnRlZExpc3QuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU29ydGVkTGlzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ4YjczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NvbGxlY3Rpb25zL1NvcnRlZExpc3QuanMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uY29sbGVjdGlvbnMuU29ydGVkTGlzdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25zIik7Citkb2pvLmNvbGxlY3Rpb25zLlNvcnRlZExpc3QgPSBmdW5jdGlvbiAoZGljdGlvbmFyeSkgeworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIGl0ZW1zID0ge307CisJdmFyIHEgPSBbXTsKKwl2YXIgc29ydGVyID0gZnVuY3Rpb24gKGEsIGIpIHsKKwkJaWYgKGEua2V5ID4gYi5rZXkpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChhLmtleSA8IGIua2V5KSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfTsKKwl2YXIgYnVpbGQgPSBmdW5jdGlvbiAoKSB7CisJCXEgPSBbXTsKKwkJdmFyIGUgPSBfdGhpcy5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJcS5wdXNoKGUuZ2V0KCkpOworCQl9CisJCXEuc29ydChzb3J0ZXIpOworCX07CisJdmFyIHRlc3RPYmplY3QgPSB7fTsKKwl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJdGhpcy5hZGQgPSBmdW5jdGlvbiAoaywgdikgeworCQlpZiAoIWl0ZW1zW2tdKSB7CisJCQlpdGVtc1trXSA9IG5ldyBkb2pvLmNvbGxlY3Rpb25zLkRpY3Rpb25hcnlFbnRyeShrLCB2KTsKKwkJCXRoaXMuY291bnQgPSBxLnB1c2goaXRlbXNba10pOworCQkJcS5zb3J0KHNvcnRlcik7CisJCX0KKwl9OworCXRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisJCWl0ZW1zID0ge307CisJCXEgPSBbXTsKKwkJdGhpcy5jb3VudCA9IHEubGVuZ3RoOworCX07CisJdGhpcy5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIG5ldyBkb2pvLmNvbGxlY3Rpb25zLlNvcnRlZExpc3QodGhpcyk7CisJfTsKKwl0aGlzLmNvbnRhaW5zID0gdGhpcy5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrKSB7CisJCWlmICh0ZXN0T2JqZWN0W2tdKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIChpdGVtc1trXSAhPSBudWxsKTsKKwl9OworCXRoaXMuY29udGFpbnNWYWx1ZSA9IGZ1bmN0aW9uIChvKSB7CisJCXZhciBlID0gdGhpcy5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJdmFyIGl0ZW0gPSBlLmdldCgpOworCQkJaWYgKGl0ZW0udmFsdWUgPT0gbykgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9OworCXRoaXMuY29weVRvID0gZnVuY3Rpb24gKGFyciwgaSkgeworCQl2YXIgZSA9IHRoaXMuZ2V0SXRlcmF0b3IoKTsKKwkJdmFyIGlkeCA9IGk7CisJCXdoaWxlICghZS5hdEVuZCgpKSB7CisJCQlhcnIuc3BsaWNlKGlkeCwgMCwgZS5nZXQoKSk7CisJCQlpZHgrKzsKKwkJfQorCX07CisJdGhpcy5lbnRyeSA9IGZ1bmN0aW9uIChrKSB7CisJCXJldHVybiBpdGVtc1trXTsKKwl9OworCXRoaXMuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgc2NvcGUpIHsKKwkJdmFyIHMgPSBzY29wZSB8fCBkal9nbG9iYWw7CisJCWlmIChBcnJheS5mb3JFYWNoKSB7CisJCQlBcnJheS5mb3JFYWNoKHEsIGZuLCBzKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykgeworCQkJCWZuLmNhbGwocywgcVtpXSwgaSwgcSk7CisJCQl9CisJCX0KKwl9OworCXRoaXMuZ2V0QnlJbmRleCA9IGZ1bmN0aW9uIChpKSB7CisJCXJldHVybiBxW2ldLnZhbHVlT2YoKTsKKwl9OworCXRoaXMuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBuZXcgZG9qby5jb2xsZWN0aW9ucy5EaWN0aW9uYXJ5SXRlcmF0b3IoaXRlbXMpOworCX07CisJdGhpcy5nZXRLZXkgPSBmdW5jdGlvbiAoaSkgeworCQlyZXR1cm4gcVtpXS5rZXk7CisJfTsKKwl0aGlzLmdldEtleUxpc3QgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBhcnIgPSBbXTsKKwkJdmFyIGUgPSB0aGlzLmdldEl0ZXJhdG9yKCk7CisJCXdoaWxlICghZS5hdEVuZCgpKSB7CisJCQlhcnIucHVzaChlLmdldCgpLmtleSk7CisJCX0KKwkJcmV0dXJuIGFycjsKKwl9OworCXRoaXMuZ2V0VmFsdWVMaXN0ID0gZnVuY3Rpb24gKCkgeworCQl2YXIgYXJyID0gW107CisJCXZhciBlID0gdGhpcy5nZXRJdGVyYXRvcigpOworCQl3aGlsZSAoIWUuYXRFbmQoKSkgeworCQkJYXJyLnB1c2goZS5nZXQoKS52YWx1ZSk7CisJCX0KKwkJcmV0dXJuIGFycjsKKwl9OworCXRoaXMuaW5kZXhPZktleSA9IGZ1bmN0aW9uIChrKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykgeworCQkJaWYgKHFbaV0ua2V5ID09IGspIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfTsKKwl0aGlzLmluZGV4T2ZWYWx1ZSA9IGZ1bmN0aW9uIChvKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykgeworCQkJaWYgKHFbaV0udmFsdWUgPT0gbykgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9OworCXRoaXMuaXRlbSA9IGZ1bmN0aW9uIChrKSB7CisJCWlmIChrIGluIGl0ZW1zICYmICF0ZXN0T2JqZWN0W2tdKSB7CisJCQlyZXR1cm4gaXRlbXNba10udmFsdWVPZigpOworCQl9CisJCXJldHVybiB1bmRlZmluZWQ7CisJfTsKKwl0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uIChrKSB7CisJCWRlbGV0ZSBpdGVtc1trXTsKKwkJYnVpbGQoKTsKKwkJdGhpcy5jb3VudCA9IHEubGVuZ3RoOworCX07CisJdGhpcy5yZW1vdmVBdCA9IGZ1bmN0aW9uIChpKSB7CisJCWRlbGV0ZSBpdGVtc1txW2ldLmtleV07CisJCWJ1aWxkKCk7CisJCXRoaXMuY291bnQgPSBxLmxlbmd0aDsKKwl9OworCXRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uIChrLCB2KSB7CisJCWlmICghaXRlbXNba10pIHsKKwkJCXRoaXMuYWRkKGssIHYpOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJaXRlbXNba10gPSBuZXcgZG9qby5jb2xsZWN0aW9ucy5EaWN0aW9uYXJ5RW50cnkoaywgdik7CisJCQlxLnNvcnQoc29ydGVyKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfTsKKwl0aGlzLnNldEJ5SW5kZXggPSBmdW5jdGlvbiAoaSwgbykgeworCQlpdGVtc1txW2ldLmtleV0udmFsdWUgPSBvOworCQlidWlsZCgpOworCQl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJfTsKKwlpZiAoZGljdGlvbmFyeSkgeworCQl2YXIgZSA9IGRpY3Rpb25hcnkuZ2V0SXRlcmF0b3IoKTsKKwkJd2hpbGUgKCFlLmF0RW5kKCkpIHsKKwkJCXZhciBpdGVtID0gZS5nZXQoKTsKKwkJCXFbcS5sZW5ndGhdID0gaXRlbXNbaXRlbS5rZXldID0gbmV3IGRvam8uY29sbGVjdGlvbnMuRGljdGlvbmFyeUVudHJ5KGl0ZW0ua2V5LCBpdGVtLnZhbHVlKTsKKwkJfQorCQlxLnNvcnQoc29ydGVyKTsKKwl9Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU3RhY2suanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU3RhY2suanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5M2ZmOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9TdGFjay5qcwpAQCAtMCwwICsxLDY3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNvbGxlY3Rpb25zLlN0YWNrIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuQ29sbGVjdGlvbnMiKTsKK2Rvam8uY29sbGVjdGlvbnMuU3RhY2sgPSBmdW5jdGlvbiAoYXJyKSB7CisJdmFyIHEgPSBbXTsKKwlpZiAoYXJyKSB7CisJCXEgPSBxLmNvbmNhdChhcnIpOworCX0KKwl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJcSA9IFtdOworCQl0aGlzLmNvdW50ID0gcS5sZW5ndGg7CisJfTsKKwl0aGlzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuU3RhY2socSk7CisJfTsKKwl0aGlzLmNvbnRhaW5zID0gZnVuY3Rpb24gKG8pIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAocVtpXSA9PSBvKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX07CisJdGhpcy5jb3B5VG8gPSBmdW5jdGlvbiAoYXJyLCBpKSB7CisJCWFyci5zcGxpY2UoaSwgMCwgcSk7CisJfTsKKwl0aGlzLmZvckVhY2ggPSBmdW5jdGlvbiAoZm4sIHNjb3BlKSB7CisJCXZhciBzID0gc2NvcGUgfHwgZGpfZ2xvYmFsOworCQlpZiAoQXJyYXkuZm9yRWFjaCkgeworCQkJQXJyYXkuZm9yRWFjaChxLCBmbiwgcyk7CisJCX0gZWxzZSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHsKKwkJCQlmbi5jYWxsKHMsIHFbaV0sIGksIHEpOworCQkJfQorCQl9CisJfTsKKwl0aGlzLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuSXRlcmF0b3IocSk7CisJfTsKKwl0aGlzLnBlZWsgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBxWyhxLmxlbmd0aCAtIDEpXTsKKwl9OworCXRoaXMucG9wID0gZnVuY3Rpb24gKCkgeworCQl2YXIgciA9IHEucG9wKCk7CisJCXRoaXMuY291bnQgPSBxLmxlbmd0aDsKKwkJcmV0dXJuIHI7CisJfTsKKwl0aGlzLnB1c2ggPSBmdW5jdGlvbiAobykgeworCQl0aGlzLmNvdW50ID0gcS5wdXNoKG8pOworCX07CisJdGhpcy50b0FycmF5ID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gW10uY29uY2F0KHEpOworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU3RvcmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvU3RvcmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlMTJmYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9TdG9yZS5qcwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5jb2xsZWN0aW9ucy5TdG9yZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmNvbGxlY3Rpb25zLlN0b3JlID0gZnVuY3Rpb24gKGpzb25BcnJheSkgeworCXZhciBkYXRhID0gW107CisJdmFyIGl0ZW1zID0ge307CisJdGhpcy5rZXlGaWVsZCA9ICJJZCI7CisJdGhpcy5nZXQgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBkYXRhOworCX07CisJdGhpcy5nZXRCeUtleSA9IGZ1bmN0aW9uIChrZXkpIHsKKwkJcmV0dXJuIGl0ZW1zW2tleV07CisJfTsKKwl0aGlzLmdldEJ5SW5kZXggPSBmdW5jdGlvbiAoaWR4KSB7CisJCXJldHVybiBkYXRhW2lkeF07CisJfTsKKwl0aGlzLmdldEluZGV4T2YgPSBmdW5jdGlvbiAoa2V5KSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRhdGFbaV0ua2V5ID09IGtleSkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9OworCXRoaXMuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIGFyciA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCWFyci5wdXNoKGRhdGFbaV0uc3JjKTsKKwkJfQorCQlyZXR1cm4gYXJyOworCX07CisJdGhpcy5nZXREYXRhQnlLZXkgPSBmdW5jdGlvbiAoa2V5KSB7CisJCWlmIChpdGVtc1trZXldICE9IG51bGwpIHsKKwkJCXJldHVybiBpdGVtc1trZXldLnNyYzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9OworCXRoaXMuZ2V0SW5kZXhPZkRhdGEgPSBmdW5jdGlvbiAob2JqKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRhdGFbaV0uc3JjID09IG9iaikgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9OworCXRoaXMuZ2V0RGF0YUJ5SW5kZXggPSBmdW5jdGlvbiAoaWR4KSB7CisJCWlmIChkYXRhW2lkeF0pIHsKKwkJCXJldHVybiBkYXRhW2lkeF0uc3JjOworCQl9CisJCXJldHVybiBudWxsOworCX07CisJdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAob2JqLCBmaWVsZFBhdGgsIHZhbCwgYkRvbnRGaXJlKSB7CisJCXZhciBwYXJ0cyA9IGZpZWxkUGF0aC5zcGxpdCgiLiIpLCBpID0gMCwgbyA9IG9iaiwgZmllbGQ7CisJCWlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CisJCQlmaWVsZCA9IHBhcnRzLnBvcCgpOworCQkJZG8geworCQkJCWlmIChwYXJ0c1tpXS5pbmRleE9mKCIoKSIpID4gLTEpIHsKKwkJCQkJdmFyIHRlbXAgPSBwYXJ0c1tpKytdLnNwbGl0KCIoKSIpWzBdOworCQkJCQlpZiAoIW9bdGVtcF0pIHsKKwkJCQkJCWRvam8ucmFpc2UoImRvam8uY29sbGVjdGlvbnMuU3RvcmUuZ2V0RmllbGQob2JqLCAnIiArIGZpZWxkICsgIicpOiAnIiArIHRlbXAgKyAiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgcGFzc2VkIG9iamVjdC4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW8gPSBvW3RlbXBdKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlvID0gb1twYXJ0c1tpKytdXTsKKwkJCQl9CisJCQl9IHdoaWxlIChpIDwgcGFydHMubGVuZ3RoICYmIG8gIT0gbnVsbCk7CisJCX0gZWxzZSB7CisJCQlmaWVsZCA9IHBhcnRzWzBdOworCQl9CisJCW9ialtmaWVsZF0gPSB2YWw7CisJCWlmICghYkRvbnRGaXJlKSB7CisJCQl0aGlzLm9uVXBkYXRlRmllbGQob2JqLCBmaWVsZFBhdGgsIHZhbCk7CisJCX0KKwl9OworCXRoaXMuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbikgeworCQlpZiAoQXJyYXkuZm9yRWFjaCkgeworCQkJQXJyYXkuZm9yRWFjaChkYXRhLCBmbiwgdGhpcyk7CisJCX0gZWxzZSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCQlmbi5jYWxsKHRoaXMsIGRhdGFbaV0pOworCQkJfQorCQl9CisJfTsKKwl0aGlzLmZvckVhY2hEYXRhID0gZnVuY3Rpb24gKGZuKSB7CisJCWlmIChBcnJheS5mb3JFYWNoKSB7CisJCQlBcnJheS5mb3JFYWNoKHRoaXMuZ2V0RGF0YSgpLCBmbiwgdGhpcyk7CisJCX0gZWxzZSB7CisJCQl2YXIgYSA9IHRoaXMuZ2V0RGF0YSgpOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCQkJZm4uY2FsbCh0aGlzLCBhW2ldKTsKKwkJCX0KKwkJfQorCX07CisJdGhpcy5zZXREYXRhID0gZnVuY3Rpb24gKGFyciwgYkRvbnRGaXJlKSB7CisJCWRhdGEgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBvID0ge2tleTphcnJbaV1bdGhpcy5rZXlGaWVsZF0sIHNyYzphcnJbaV19OworCQkJZGF0YS5wdXNoKG8pOworCQkJaXRlbXNbby5rZXldID0gbzsKKwkJfQorCQlpZiAoIWJEb250RmlyZSkgeworCQkJdGhpcy5vblNldERhdGEoKTsKKwkJfQorCX07CisJdGhpcy5jbGVhckRhdGEgPSBmdW5jdGlvbiAoYkRvbnRGaXJlKSB7CisJCWRhdGEgPSBbXTsKKwkJaXRlbXMgPSB7fTsKKwkJaWYgKCFiRG9udEZpcmUpIHsKKwkJCXRoaXMub25DbGVhckRhdGEoKTsKKwkJfQorCX07CisJdGhpcy5hZGREYXRhID0gZnVuY3Rpb24gKG9iaiwga2V5LCBiRG9udEZpcmUpIHsKKwkJdmFyIGsgPSBrZXkgfHwgb2JqW3RoaXMua2V5RmllbGRdOworCQlpZiAoaXRlbXNba10gIT0gbnVsbCkgeworCQkJdmFyIG8gPSBpdGVtc1trXTsKKwkJCW8uc3JjID0gb2JqOworCQl9IGVsc2UgeworCQkJdmFyIG8gPSB7a2V5OmssIHNyYzpvYmp9OworCQkJZGF0YS5wdXNoKG8pOworCQkJaXRlbXNbby5rZXldID0gbzsKKwkJfQorCQlpZiAoIWJEb250RmlyZSkgeworCQkJdGhpcy5vbkFkZERhdGEobyk7CisJCX0KKwl9OworCXRoaXMuYWRkRGF0YVJhbmdlID0gZnVuY3Rpb24gKGFyciwgYkRvbnRGaXJlKSB7CisJCXZhciBvYmplY3RzID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgayA9IGFycltpXVt0aGlzLmtleUZpZWxkXTsKKwkJCWlmIChpdGVtc1trXSAhPSBudWxsKSB7CisJCQkJdmFyIG8gPSBpdGVtc1trXTsKKwkJCQlvLnNyYyA9IGFycltpXTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIG8gPSB7a2V5OmssIHNyYzphcnJbaV19OworCQkJCWRhdGEucHVzaChvKTsKKwkJCQlpdGVtc1trXSA9IG87CisJCQl9CisJCQlvYmplY3RzLnB1c2gobyk7CisJCX0KKwkJaWYgKCFiRG9udEZpcmUpIHsKKwkJCXRoaXMub25BZGREYXRhUmFuZ2Uob2JqZWN0cyk7CisJCX0KKwl9OworCXRoaXMuYWRkRGF0YUJ5SW5kZXggPSBmdW5jdGlvbiAob2JqLCBpZHgsIGtleSwgYkRvbnRGaXJlKSB7CisJCXZhciBrID0ga2V5IHx8IG9ialt0aGlzLmtleUZpZWxkXTsKKwkJaWYgKGl0ZW1zW2tdICE9IG51bGwpIHsKKwkJCXZhciBpID0gdGhpcy5nZXRJbmRleE9mKGspOworCQkJdmFyIG8gPSBkYXRhLnNwbGljZShpLCAxKTsKKwkJCW8uc3JjID0gb2JqOworCQl9IGVsc2UgeworCQkJdmFyIG8gPSB7a2V5OmssIHNyYzpvYmp9OworCQkJaXRlbXNba10gPSBvOworCQl9CisJCWRhdGEuc3BsaWNlKGlkeCwgMCwgbyk7CisJCWlmICghYkRvbnRGaXJlKSB7CisJCQl0aGlzLm9uQWRkRGF0YShvKTsKKwkJfQorCX07CisJdGhpcy5hZGREYXRhUmFuZ2VCeUluZGV4ID0gZnVuY3Rpb24gKGFyciwgaWR4LCBiRG9udEZpcmUpIHsKKwkJdmFyIG9iamVjdHMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBrID0gYXJyW2ldW3RoaXMua2V5RmllbGRdOworCQkJaWYgKGl0ZW1zW2tdICE9IG51bGwpIHsKKwkJCQl2YXIgaiA9IHRoaXMuZ2V0SW5kZXhPZihrKTsKKwkJCQl2YXIgbyA9IGRhdGEuc3BsaWNlKGosIDEpOworCQkJCW8uc3JjID0gYXJyW2ldOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgbyA9IHtrZXk6aywgc3JjOmFycltpXX07CisJCQkJaXRlbXNba10gPSBvOworCQkJfQorCQkJb2JqZWN0cy5wdXNoKG8pOworCQl9CisJCWRhdGEuc3BsaWNlKGlkeCwgMCwgb2JqZWN0cyk7CisJCWlmICghYkRvbnRGaXJlKSB7CisJCQl0aGlzLm9uQWRkRGF0YVJhbmdlKG9iamVjdHMpOworCQl9CisJfTsKKwl0aGlzLnJlbW92ZURhdGEgPSBmdW5jdGlvbiAob2JqLCBiRG9udEZpcmUpIHsKKwkJdmFyIGlkeCA9IC0xOworCQl2YXIgbyA9IG51bGw7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRhdGFbaV0uc3JjID09IG9iaikgeworCQkJCWlkeCA9IGk7CisJCQkJbyA9IGRhdGFbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFiRG9udEZpcmUpIHsKKwkJCXRoaXMub25SZW1vdmVEYXRhKG8pOworCQl9CisJCWlmIChpZHggPiAtMSkgeworCQkJZGF0YS5zcGxpY2UoaWR4LCAxKTsKKwkJCWRlbGV0ZSBpdGVtc1tvLmtleV07CisJCX0KKwl9OworCXRoaXMucmVtb3ZlRGF0YVJhbmdlID0gZnVuY3Rpb24gKGlkeCwgcmFuZ2UsIGJEb250RmlyZSkgeworCQl2YXIgcmV0ID0gZGF0YS5zcGxpY2UoaWR4LCByYW5nZSk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7CisJCQlkZWxldGUgaXRlbXNbcmV0W2ldLmtleV07CisJCX0KKwkJaWYgKCFiRG9udEZpcmUpIHsKKwkJCXRoaXMub25SZW1vdmVEYXRhUmFuZ2UocmV0KTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07CisJdGhpcy5yZW1vdmVEYXRhQnlLZXkgPSBmdW5jdGlvbiAoa2V5LCBiRG9udEZpcmUpIHsKKwkJdGhpcy5yZW1vdmVEYXRhKHRoaXMuZ2V0RGF0YUJ5S2V5KGtleSksIGJEb250RmlyZSk7CisJfTsKKwl0aGlzLnJlbW92ZURhdGFCeUluZGV4ID0gZnVuY3Rpb24gKGlkeCwgYkRvbnRGaXJlKSB7CisJCXRoaXMucmVtb3ZlRGF0YSh0aGlzLmdldERhdGFCeUluZGV4KGlkeCksIGJEb250RmlyZSk7CisJfTsKKwlpZiAoanNvbkFycmF5ICYmIGpzb25BcnJheS5sZW5ndGggJiYganNvbkFycmF5WzBdKSB7CisJCXRoaXMuc2V0RGF0YShqc29uQXJyYXksIHRydWUpOworCX0KK307Citkb2pvLmV4dGVuZChkb2pvLmNvbGxlY3Rpb25zLlN0b3JlLCB7Z2V0RmllbGQ6ZnVuY3Rpb24gKG9iaiwgZmllbGQpIHsKKwl2YXIgcGFydHMgPSBmaWVsZC5zcGxpdCgiLiIpLCBpID0gMCwgbyA9IG9iajsKKwlkbyB7CisJCWlmIChwYXJ0c1tpXS5pbmRleE9mKCIoKSIpID4gLTEpIHsKKwkJCXZhciB0ZW1wID0gcGFydHNbaSsrXS5zcGxpdCgiKCkiKVswXTsKKwkJCWlmICghb1t0ZW1wXSkgeworCQkJCWRvam8ucmFpc2UoImRvam8uY29sbGVjdGlvbnMuU3RvcmUuZ2V0RmllbGQob2JqLCAnIiArIGZpZWxkICsgIicpOiAnIiArIHRlbXAgKyAiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgcGFzc2VkIG9iamVjdC4iKTsKKwkJCX0gZWxzZSB7CisJCQkJbyA9IG9bdGVtcF0oKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW8gPSBvW3BhcnRzW2krK11dOworCQl9CisJfSB3aGlsZSAoaSA8IHBhcnRzLmxlbmd0aCAmJiBvICE9IG51bGwpOworCWlmIChpIDwgcGFydHMubGVuZ3RoKSB7CisJCWRvam8ucmFpc2UoImRvam8uY29sbGVjdGlvbnMuU3RvcmUuZ2V0RmllbGQob2JqLCAnIiArIGZpZWxkICsgIicpOiAnIiArIGZpZWxkICsgIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhlIHBhc3NlZCBvYmplY3QuIik7CisJfQorCXJldHVybiBvOworfSwgZ2V0RnJvbUh0bWw6ZnVuY3Rpb24gKG1ldGEsIGJvZHksIGZuTW9kKSB7CisJdmFyIHJvd3MgPSBib2R5LnJvd3M7CisJdmFyIGN0b3IgPSBmdW5jdGlvbiAocm93KSB7CisJCXZhciBvYmogPSB7fTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgbyA9IG9iajsKKwkJCXZhciBkYXRhID0gcm93LmNlbGxzW2ldLmlubmVySFRNTDsKKwkJCXZhciBwID0gbWV0YVtpXS5nZXRGaWVsZCgpOworCQkJaWYgKHAuaW5kZXhPZigiLiIpID4gLTEpIHsKKwkJCQlwID0gcC5zcGxpdCgiLiIpOworCQkJCXdoaWxlIChwLmxlbmd0aCA+IDEpIHsKKwkJCQkJdmFyIHByID0gcC5zaGlmdCgpOworCQkJCQlvW3ByXSA9IHt9OworCQkJCQlvID0gb1twcl07CisJCQkJfQorCQkJCXAgPSBwWzBdOworCQkJfQorCQkJdmFyIHR5cGUgPSBtZXRhW2ldLmdldFR5cGUoKTsKKwkJCWlmICh0eXBlID09IFN0cmluZykgeworCQkJCW9bcF0gPSBkYXRhOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGF0YSkgeworCQkJCQlvW3BdID0gbmV3IHR5cGUoZGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb1twXSA9IG5ldyB0eXBlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBvYmo7CisJfTsKKwl2YXIgYXJyID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBvID0gY3Rvcihyb3dzW2ldKTsKKwkJaWYgKGZuTW9kKSB7CisJCQlmbk1vZChvLCByb3dzW2ldKTsKKwkJfQorCQlhcnIucHVzaChvKTsKKwl9CisJcmV0dXJuIGFycjsKK30sIG9uU2V0RGF0YTpmdW5jdGlvbiAoKSB7Cit9LCBvbkNsZWFyRGF0YTpmdW5jdGlvbiAoKSB7Cit9LCBvbkFkZERhdGE6ZnVuY3Rpb24gKG9iaikgeworfSwgb25BZGREYXRhUmFuZ2U6ZnVuY3Rpb24gKGFycikgeworfSwgb25SZW1vdmVEYXRhOmZ1bmN0aW9uIChvYmopIHsKK30sIG9uUmVtb3ZlRGF0YVJhbmdlOmZ1bmN0aW9uIChhcnIpIHsKK30sIG9uVXBkYXRlRmllbGQ6ZnVuY3Rpb24gKG9iaiwgZmllbGQsIHZhbCkgeworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY29sbGVjdGlvbnMvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MTNkOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jb2xsZWN0aW9ucy9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5jb2xsZWN0aW9ucy5Db2xsZWN0aW9ucyIsICJkb2pvLmNvbGxlY3Rpb25zLlNvcnRlZExpc3QiLCAiZG9qby5jb2xsZWN0aW9ucy5EaWN0aW9uYXJ5IiwgImRvam8uY29sbGVjdGlvbnMuUXVldWUiLCAiZG9qby5jb2xsZWN0aW9ucy5BcnJheUxpc3QiLCAiZG9qby5jb2xsZWN0aW9ucy5TdGFjayIsICJkb2pvLmNvbGxlY3Rpb25zLlNldCJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8uY29sbGVjdGlvbnMuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWEyZTQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by5qcwpAQCAtMCwwICsxLDE2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNyeXB0byIpOworZG9qby5jcnlwdG8uY2lwaGVyTW9kZXMgPSB7RUNCOjAsIENCQzoxLCBQQ0JDOjIsIENGQjozLCBPRkI6NCwgQ1RSOjV9OworZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMgPSB7QmFzZTY0OjAsIEhleDoxLCBTdHJpbmc6MiwgUmF3OjN9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL0Jsb3dmaXNoLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9CbG93ZmlzaC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY3NDVhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9CbG93ZmlzaC5qcwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucmVxdWlyZSgiZG9qby5jcnlwdG8iKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5jcnlwdG8uQmxvd2Zpc2giKTsKK2Rvam8uY3J5cHRvLkJsb3dmaXNoID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl2YXIgUE9XMiA9IE1hdGgucG93KDIsIDIpOworCXZhciBQT1czID0gTWF0aC5wb3coMiwgMyk7CisJdmFyIFBPVzQgPSBNYXRoLnBvdygyLCA0KTsKKwl2YXIgUE9XOCA9IE1hdGgucG93KDIsIDgpOworCXZhciBQT1cxNiA9IE1hdGgucG93KDIsIDE2KTsKKwl2YXIgUE9XMjQgPSBNYXRoLnBvdygyLCAyNCk7CisJdmFyIGl2ID0gbnVsbDsKKwl2YXIgYm94ZXMgPSB7cDpbNjA4MTM1ODE2LCAyMjQyMDU0MzU1LCAzMjA0NDA4NzgsIDU3NzAxMTg4LCAyNzUyMDY3NjE4LCA2OTgyOTg4MzIsIDEzNzI5NjUzNiwgMzk2NDU2MjU2OSwgMTE2MDI1ODAyMiwgOTUzMTYwNTY3LCAzMTkzMjAyMzgzLCA4ODc2ODgzMDAsIDMyMzI1MDgzNDMsIDMzODAzNjc1ODEsIDEwNjU2NzAwNjksIDMwNDEzMzE0NzksIDI0NTA5NzAwNzMsIDIzMDY0NzI3MzFdLCBzMDpbMzUwOTY1MjM5MCwgMjU2NDc5Nzg2OCwgODA1MTM5MTYzLCAzNDkxNDIyMTM1LCAzMTAxNzk4MzgxLCAxNzgwOTA3NjcwLCAzMTI4NzI1NTczLCA0MDQ2MjI1MzA1LCA2MTQ1NzAzMTEsIDMwMTI2NTIyNzksIDEzNDM0NTQ0MiwgMjI0MDc0MDM3NCwgMTY2NzgzNDA3MiwgMTkwMTU0NzExMywgMjc1NzI5NTc3OSwgNDEwMzI5MDIzOCwgMjI3ODk4NTExLCAxOTIxOTU1NDE2LCAxOTA0OTg3NDgwLCAyMTgyNDMzNTE4LCAyMDY5MTQ0NjA1LCAzMjYwNzAxMTA5LCAyNjIwNDQ2MDA5LCA3MjA1MjczNzksIDMzMTg4NTM2NjcsIDY3NzQxNDM4NCwgMzM5MzI4ODQ3MiwgMzEwMTM3NDcwMywgMjM5MDM1MTAyNCwgMTYxNDQxOTk4MiwgMTgyMjI5NzczOSwgMjk1NDc5MTQ4NiwgMzYwODUwODM1MywgMzE3NDEyNDMyNywgMjAyNDc0Njk3MCwgMTQzMjM3ODQ2NCwgMzg2NDMzOTk1NSwgMjg1Nzc0MTIwNCwgMTQ2NDM3NTM5NCwgMTY3NjE1MzkyMCwgMTQzOTMxNjMzMCwgNzE1ODU0MDA2LCAzMDMzMjkxODI4LCAyODk1MzIxMTAsIDI3MDY2NzEyNzksIDIwODc5MDU2ODMsIDMwMTg3MjQzNjksIDE2NjgyNjcwNTAsIDczMjU0NjM5NywgMTk0Nzc0MjcxMCwgMzQ2MjE1MTcwMiwgMjYwOTM1MzUwMiwgMjk1MDA4NTE3MSwgMTgxNDM1MTcwOCwgMjA1MDExODUyOSwgNjgwODg3OTI3LCA5OTkyNDU5NzYsIDE4MDAxMjQ4NDcsIDMzMDA5MTExMzEsIDE3MTM5MDYwNjcsIDE2NDE1NDgyMzYsIDQyMTMyODczMTMsIDEyMTYxMzAxNDQsIDE1NzU3ODA0MDIsIDQwMTg0MjkyNzcsIDM5MTc4Mzc3NDUsIDM2OTM0ODY4NTAsIDM5NDkyNzE5NDQsIDU5NjE5Njk5MywgMzU0OTg2NzIwNSwgMjU4ODMwMzIzLCAyMjEzODIzMDMzLCA3NzI0OTAzNzAsIDI3NjAxMjIzNzIsIDE3NzQ3NzYzOTQsIDI2NTI4NzE1MTgsIDU2NjY1MDk0NiwgNDE0MjQ5MjgyNiwgMTcyODg3OTcxMywgMjg4Mjc2NzA4OCwgMTc4MzczNDQ4MiwgMzYyOTM5NTgxNiwgMjUxNzYwODIzMiwgMjg3NDIyNTU3MSwgMTg2MTE1OTc4OCwgMzI2Nzc3ODI4LCAzMTI0NDkwMzIwLCAyMTMwMzg5NjU2LCAyNzE2OTUxODM3LCA5Njc3NzA0ODYsIDE3MjQ1MzcxNTAsIDIxODU0MzI3MTIsIDIzNjQ0NDIxMzcsIDExNjQ5NDMyODQsIDIxMDU4NDUxODcsIDk5ODk4OTUwMiwgMzc2NTQwMTA0OCwgMjI0NDAyNjQ4MywgMTA3NTQ2MzMyNywgMTQ1NTUxNjMyNiwgMTMyMjQ5NDU2MiwgOTEwMTI4OTAyLCA0Njk2ODgxNzgsIDExMTc0NTQ5MDksIDkzNjQzMzQ0NCwgMzQ5MDMyMDk2OCwgMzY3NTI1MzQ1OSwgMTI0MDU4MDI1MSwgMTIyOTA5Mzg1LCAyMTU3NTE3NjkxLCA2MzQ2ODE4MTYsIDQxNDI0NTY1NjcsIDM4MjUwOTQ2ODIsIDMwNjE0MDI2ODMsIDI1NDA0OTUwMzcsIDc5NjkzNDk4LCAzMjQ5MDk4Njc4LCAxMDg0MTg2ODIwLCAxNTgzMTI4MjU4LCA0MjYzODY1MzEsIDE3NjEzMDg1OTEsIDEwNDcyODY3MDksIDMyMjU0ODQ1OSwgOTk1MjkwMjIzLCAxODQ1MjUyMzgzLCAyNjAzNjUyMzk2LCAzNDMxMDIzOTQwLCAyOTQyMjIxNTc3LCAzMjAyNjAwOTY0LCAzNzI3OTAzNDg1LCAxNzEyMjY5MzE5LCA0MjI0NjQ0MzUsIDMyMzQ1NzIzNzUsIDExNzA3NjQ4MTUsIDM1MjM5NjA2MzMsIDMxMTc2Nzc1MzEsIDE0MzQwNDI1NTcsIDQ0MjUxMTg4MiwgMzYwMDg3NTcxOCwgMTA3NjY1NDcxMywgMTczODQ4MzE5OCwgNDIxMzE1NDc2NCwgMjM5MzIzODAwOCwgMzY3NzQ5NjA1NiwgMTAxNDMwNjUyNywgNDI1MTAyMDA1MywgNzkzNzc5OTEyLCAyOTAyODA3MjExLCA4NDI5MDUwODIsIDQyNDY5NjQwNjQsIDEzOTU3NTE3NTIsIDEwNDAyNDQ2MTAsIDI2NTY4NTE4OTksIDMzOTYzMDgxMjgsIDQ0NTA3NzAzOCwgMzc0Mjg1MzU5NSwgMzU3NzkxNTYzOCwgNjc5NDExNjUxLCAyODkyNDQ0MzU4LCAyMzU0MDA5NDU5LCAxNzY3NTgxNjE2LCAzMTUwNjAwMzkyLCAzNzkxNjI3MTAxLCAzMTAyNzQwODk2LCAyODQ4MzUyMjQsIDQyNDY4MzIwNTYsIDEyNTgwNzU1MDAsIDc2ODcyNTg1MSwgMjU4OTE4OTI0MSwgMzA2OTcyNDAwNSwgMzUzMjU0MDM0OCwgMTI3NDc3OTUzNiwgMzc4OTQxOTIyNiwgMjc2NDc5OTUzOSwgMTY2MDYyMTYzMywgMzQ3MTA5OTYyNCwgNDAxMTkwMzcwNiwgOTEzNzg3OTA1LCAzNDk3OTU5MTY2LCA3MzcyMjI1ODAsIDI1MTQyMTM0NTMsIDI5Mjg3MTAwNDAsIDM5MzcyNDI3MzcsIDE4MDQ4NTA1OTIsIDM0OTkwMjA3NTIsIDI5NDkwNjQxNjAsIDIzODYzMjAxNzUsIDIzOTAwNzA0NTUsIDI0MTUzMjE4NTEsIDQwNjEyNzcwMjgsIDIyOTA2NjEzOTQsIDI0MTY4MzI1NDAsIDEzMzY3NjIwMTYsIDE3NTQyNTIwNjAsIDM1MjAwNjU5MzcsIDMwMTQxODEyOTMsIDc5MTYxODA3MiwgMzE4ODU5NDU1MSwgMzkzMzU0ODAzMCwgMjMzMjE3MjE5MywgMzg1MjUyMDQ2MywgMzA0Mzk4MDUyMCwgNDEzOTg3Nzk4LCAzNDY1MTQyOTM3LCAzMDMwOTI5Mzc2LCA0MjQ1OTM4MzU5LCAyMDkzMjM1MDczLCAzNTM0NTk2MzEzLCAzNzUzNjYyNDYsIDIxNTcyNzg5ODEsIDI0Nzk2NDk1NTYsIDU1NTM1NzMwMywgMzg3MDEwNTcwMSwgMjAwODQxNDg1NCwgMzM0NDE4ODE0OSwgNDIyMTM4NDE0MywgMzk1NjEyNTQ1MiwgMjA2NzY5NjAzMiwgMzU5NDU5MTE4NywgMjkyMTIzMzk5MywgMjQyODQ2MSwgNTQ0MzIyMzk4LCA1NzcyNDEyNzUsIDE0NzE3MzM5MzUsIDYxMDU0NzM1NSwgNDAyNzE2OTA1NCwgMTQzMjU4ODU3MywgMTUwNzgyOTQxOCwgMjAyNTkzMTY1NywgMzY0NjU3NTQ4NywgNTQ1MDg2MzcwLCA0ODYwOTczMywgMjIwMDMwNjU1MCwgMTY1Mzk4NTE5MywgMjk4MzI2Mzc2LCAxMzE2MTc4NDk3LCAzMDA3Nzg2NDQyLCAyMDY0OTUxNjI2LCA0NTgyOTMzMzAsIDI1ODkxNDEyNjksIDM1OTEzMjk1OTksIDMxNjQzMjU2MDQsIDcyNzc1Mzg0NiwgMjE3OTM2Mzg0MCwgMTQ2NDM2MDIxLCAxNDYxNDQ2OTQzLCA0MDY5OTc3MTk1LCA3MDU1NTA2MTMsIDMwNTk5NjcyNjUsIDM4ODc3MjQ5ODIsIDQyODE1OTkyNzgsIDMzMTM4NDk5NTYsIDE0MDQwNTQ4NzcsIDI4NDU4MDY0OTcsIDE0NjQyNTc1MywgMTg1NDIxMTk0Nl0sIHMxOlsxMjY2MzE1NDk3LCAzMDQ4NDE3NjA0LCAzNjgxODgwMzY2LCAzMjg5OTgyNDk5LCAyOTA5NzEwMDAwLCAxMjM1NzM4NDkzLCAyNjMyODY4MDI0LCAyNDE0NzE5NTkwLCAzOTcwNjAwMDQ5LCAxNzcxNzA2MzY3LCAxNDQ5NDE1Mjc2LCAzMjY2NDIwNDQ5LCA0MjI5NzAwMjEsIDE5NjM1NDM1OTMsIDI2OTAxOTIxOTIsIDM4MjY3OTMwMjIsIDEwNjI1MDg2OTgsIDE1MzEwOTIzMjUsIDE4MDQ1OTIzNDIsIDI1ODMxMTc3ODIsIDI3MTQ5MzQyNzksIDQwMjQ5NzE1MDksIDEyOTQ4MDkzMTgsIDQwMjg5ODA2NzMsIDEyODk1NjAxOTgsIDIyMjE5OTI3NDIsIDE2Njk1MjM5MTAsIDM1NTcyODMwLCAxNTc4MzgxNDMsIDEwNTI0Mzg0NzMsIDEwMTY1MzUwNjAsIDE4MDIxMzc3NjEsIDE3NTMxNjcyMzYsIDEzODYyNzU0NjIsIDMwODA0NzUzOTcsIDI4NTczNzE0NDcsIDEwNDA2Nzk5NjQsIDIxNDUzMDAwNjAsIDIzOTA1NzQzMTYsIDE0NjExMjE3MjAsIDI5NTY2NDY5NjcsIDQwMzE3Nzc4MDUsIDQwMjgzNzQ3ODgsIDMzNjAwNTExLCAyOTIwMDg0NzYyLCAxMDE4NTI0ODUwLCA2MjkzNzM1MjgsIDM2OTE1ODU5ODEsIDM1MTU5NDU5NzcsIDIwOTE0NjI2NDYsIDI0ODYzMjMwNTksIDU4NjQ5OTg0MSwgOTg4MTQ1MDI1LCA5MzU1MTY4OTIsIDMzNjczMzU0NzYsIDI1OTk2NzMyNTUsIDI4Mzk4MzA4NTQsIDI2NTI5MDUxMCwgMzk3MjU4MTE4MiwgMjc1OTEzODg4MSwgMzc5NTM3MzQ2NSwgMTAwNTE5NDc5OSwgODQ3Mjk3NDQxLCA0MDY3NjIyODksIDEzMTQxNjM1MTIsIDEzMzI1OTA4NTYsIDE4NjY1OTk2ODMsIDQxMjc4NTE3MTEsIDc1MDI2MDg4MCwgNjEzOTA3NTc3LCAxNDUwODE1NjAyLCAzMTY1NjIwNjU1LCAzNzM0NjY0OTkxLCAzNjUwMjkxNzI4LCAzMDEyMjc1NzMwLCAzNzA0NTY5NjQ2LCAxNDI3MjcyMjIzLCA3Nzg3OTMyNTIsIDEzNDM5MzgwMjIsIDI2NzYyODA3MTEsIDIwNTI2MDU3MjAsIDE5NDY3MzcxNzUsIDMxNjQ1NzY0NDQsIDM5MTQwMzg2NjgsIDM5Njc0Nzg4NDIsIDM2ODI5MzQyNjYsIDE2NjE1NTE0NjIsIDMyOTQ5MzgwNjYsIDQwMTE1OTU4NDcsIDg0MDI5MjYxNiwgMzcxMjE3MDgwNywgNjE2NzQxMzk4LCAzMTI1NjA5NjMsIDcxMTMxMjQ2NSwgMTM1MTg3NjYxMCwgMzIyNjI2NzgxLCAxOTEwNTAzNTgyLCAyNzE2NjY3NzMsIDIxNzU1NjM3MzQsIDE1OTQ5NTYxODcsIDcwNjA0NTI5LCAzNjE3ODM0ODU5LCAxMDA3NzUzMjc1LCAxNDk1NTczNzY5LCA0MDY5NTE3MDM3LCAyNTQ5MjE4Mjk4LCAyNjYzMDM4NzY0LCA1MDQ3MDgyMDYsIDIyNjMwNDEzOTIsIDM5NDExNjcwMjUsIDIyNDkwODg1MjIsIDE1MTQwMjM2MDMsIDE5OTg1Nzk0ODQsIDEzMTI2MjIzMzAsIDY5NDU0MTQ5NywgMjU4MjA2MDMwMywgMjE1MTU4MjE2NiwgMTM4MjQ2NzYyMSwgNzc2Nzg0MjQ4LCAyNjE4MzQwMjAyLCAzMzIzMjY4Nzk0LCAyNDk3ODk5MTI4LCAyNzg0NzcxMTU1LCA1MDM5ODM2MDQsIDQwNzYyOTM3OTksIDkwNzg4MTI3NywgNDIzMTc1Njk1LCA0MzIxNzU0NTYsIDEzNzgwNjgyMzIsIDQxNDUyMjIzMjYsIDM5NTQwNDg2MjIsIDM5Mzg2NTYxMDIsIDM4MjA3NjY2MTMsIDI3OTMxMzAxMTUsIDI5Nzc5MDQ1OTMsIDI2MDE3NTc2LCAzMjc0ODkwNzM1LCAzMTk0NzcyMTMzLCAxNzAwMjc0NTY1LCAxNzU2MDc2MDM0LCA0MDA2NTIwMDc5LCAzNjc3MzI4Njk5LCA3MjAzMzgzNDksIDE1MzM5NDc3ODAsIDM1NDUzMDg1NiwgNjg4MzQ5NTUyLCAzOTczOTI0NzI1LCAxNjM3ODE1NTY4LCAzMzIxNzk1MDQsIDM5NDkwNTEyODYsIDUzODA0NTc0LCAyODUyMzQ4ODc5LCAzMDQ0MjM2NDMyLCAxMjgyNDQ5OTc3LCAzNTgzOTQyMTU1LCAzNDE2OTcyODIwLCA0MDA2MzgxMjQ0LCAxNjE3MDQ2Njk1LCAyNjI4NDc2MDc1LCAzMDAyMzAzNTk4LCAxNjg2ODM4OTU5LCA0MzE4NzgzNDYsIDI2ODY2NzUzODUsIDE3MDA0NDUwMDgsIDEwODA1ODA2NTgsIDEwMDk0MzE3MzEsIDgzMjQ5ODEzMywgMzIyMzQzNTUxMSwgMjYwNTk3NjM0NSwgMjI3MTE5MTE5MywgMjUxNjAzMTg3MCwgMTY0ODE5NzAzMiwgNDE2NDM4OTAxOCwgMjU0ODI0NzkyNywgMzAwNzgyNDMxLCAzNzU5MTkyMzMsIDIzODM4OTI4OSwgMzM1Mzc0NzQxNCwgMjUzMTE4ODY0MSwgMjAxOTA4MDg1NywgMTQ3NTcwODA2OSwgNDU1MjQyMzM5LCAyNjA5MTAzODcxLCA0NDg5Mzk2NzAsIDM0NTEwNjMwMTksIDEzOTU1MzU5NTYsIDI0MTMzODE4NjAsIDE4NDEwNDk4OTYsIDE0OTE4NTgxNTksIDg4NTQ1Njg3NCwgNDI2NDA5NTA3MywgNDAwMTExOTM0NywgMTU2NTEzNjA4OSwgMzg5ODkxNDc4NywgMTEwODM2ODY2MCwgNTQwOTM5MjMyLCAxMTczMjgzNTEwLCAyNzQ1ODcxMzM4LCAzNjgxMzA4NDM3LCA0MjA3NjI4MjQwLCAzMzQzMDUzODkwLCA0MDE2NzQ5NDkzLCAxNjk5NjkxMjkzLCAxMTAzOTYyMzczLCAzNjI1ODc1ODcwLCAyMjU2ODgzMTQzLCAzODMwMTM4NzMwLCAxMDMxODg5NDg4LCAzNDc5MzQ3Njk4LCAxNTM1OTc3MDMwLCA0MjM2ODA1MDI0LCAzMjUxMDkxMTA3LCAyMTMyMDkyMDk5LCAxNzc0OTQxMzMwLCAxMTk5ODY4NDI3LCAxNDUyNDU0NTMzLCAxNTcwMDc2MTYsIDI5MDQxMTUzNTcsIDM0MjAxMjI3NiwgNTk1NzI1ODI0LCAxNDgwNzU2NTIyLCAyMDY5NjAxMDYsIDQ5NzkzOTUxOCwgNTkxMzYwMDk3LCA4NjMxNzA3MDYsIDIzNzUyNTM1NjksIDM1OTY2MTA4MDEsIDE4MTQxODI4NzUsIDIwOTQ5Mzc5NDUsIDM0MjE0MDIyMDgsIDEwODI1MjAyMzEsIDM0NjM5MTgxOTAsIDI3ODU1MDk1MDgsIDQzNTcwMzk2NiwgMzkwODAzMjU5NywgMTY0MTY0OTk3MywgMjg0MjI3MzcwNiwgMzMwNTg5OTcxNCwgMTUxMDI1NTYxMiwgMjE0ODI1NjQ3NiwgMjY1NTI4Nzg1NCwgMzI3NjA5MjU0OCwgNDI1ODYyMTE4OSwgMjM2ODg3NzUzLCAzNjgxODAzMjE5LCAyNzQwNDEwMzcsIDE3MzQzMzUwOTcsIDM4MTUxOTU0NTYsIDMzMTc5NzAwMjEsIDE4OTk5MDMxOTIsIDEwMjYwOTUyNjIsIDQwNTA1MTc3OTIsIDM1NjM5MzQ0NywgMjQxMDY5MTkxNCwgMzg3MzY3NzA5OSwgMzY4Mjg0MDA1NV0sIHMyOlszOTEzMTEyMTY4LCAyNDkxNDk4NzQzLCA0MTMyMTg1NjI4LCAyNDg5OTE5Nzk2LCAxMDkxOTAzNzM1LCAxOTc5ODk3MDc5LCAzMTcwMTM0ODMwLCAzNTY3Mzg2NzI4LCAzNTU3MzAzNDA5LCA4NTc3OTc3MzgsIDExMzYxMjEwMTUsIDEzNDIyMDIyODcsIDUwNzExNTA1NCwgMjUzNTczNjY0NiwgMzM3NzI3MzQ4LCAzMjEzNTkyNjQwLCAxMzAxNjc1MDM3LCAyNTI4NDgxNzExLCAxODk1MDk1NzYzLCAxNzIxNzczODkzLCAzMjE2NzcxNTY0LCA2Mjc1Njc0MSwgMjE0MjAwNjczNiwgODM1NDIxNDQ0LCAyNTMxOTkzNTIzLCAxNDQyNjU4NjI1LCAzNjU5ODc2MzI2LCAyODgyMTQ0OTIyLCA2NzYzNjIyNzcsIDEzOTI3ODE4MTIsIDE3MDY5MDI2NiwgMzkyMTA0NzAzNSwgMTc1OTI1MzYwMiwgMzYxMTg0NjkxMiwgMTc0NTc5NzI4NCwgNjY0ODk5MDU0LCAxMzI5NTk0MDE4LCAzOTAxMjA1OTAwLCAzMDQ1OTA4NDg2LCAyMDYyODY2MTAyLCAyODY1NjM0OTQwLCAzNTQzNjIxNjEyLCAzNDY0MDEyNjk3LCAxMDgwNzY0OTk0LCA1NTM1NTc1NTcsIDM2NTY2MTUzNTMsIDM5OTY3NjgxNzEsIDk5MTA1NTQ5OSwgNDk5Nzc2MjQ3LCAxMjY1NDQwODU0LCA2NDgyNDI3MzcsIDM5NDA3ODQwNTAsIDk4MDM1MTYwNCwgMzcxMzc0NTcxNCwgMTc0OTE0OTY4NywgMzM5Njg3MDM5NSwgNDIxMTc5OTM3NCwgMzY0MDU3MDc3NSwgMTE2MTg0NDM5NiwgMzEyNTMxODk1MSwgMTQzMTUxNzc1NCwgNTQ1NDkyMzU5LCA0MjY4NDY4NjYzLCAzNDk5NTI5NTQ3LCAxNDM3MDk5OTY0LCAyNzAyNTQ3NTQ0LCAzNDMzNjM4MjQzLCAyNTgxNzE1NzYzLCAyNzg3Nzg5Mzk4LCAxMDYwMTg1NTkzLCAxNTkzMDgxMzcyLCAyNDE4NjE4NzQ4LCA0MjYwOTQ3OTcwLCA2OTY3NjkxMiwgMjE1OTc0NDM0OCwgODY1MTkwMTEsIDI1MTI0NTkwODAsIDM4MzgyMDkzMTQsIDEyMjA2MTI5MjcsIDMzMzk2ODM1NDgsIDEzMzgxMDY3MCwgMTA5MDc4OTEzNSwgMTA3ODQyNjAyMCwgMTU2OTIyMjE2NywgODQ1MTA3NjkxLCAzNTgzNzU0NDQ5LCA0MDcyNDU2NTkxLCAxMDkxNjQ2ODIwLCA2Mjg4NDg2OTIsIDE2MTM0MDUyODAsIDM3NTc2MzE2NTEsIDUyNjYwOTQzNSwgMjM2MTA2OTQ2LCA0ODMxMjk5MCwgMjk0MjcxNzkwNSwgMzQwMjcyNzcwMSwgMTc5NzQ5NDI0MCwgODU5NzM4ODQ5LCA5OTIyMTc5NTQsIDQwMDU0NzY2NDIsIDIyNDMwNzY2MjIsIDM4NzA5NTI4NTcsIDM3MzIwMTYyNjgsIDc2NTY1NDgyNCwgMzQ5MDg3MTM2NSwgMjUxMTgzNjQxMywgMTY4NTkxNTc0NiwgMzg4ODk2OTIwMCwgMTQxNDExMjExMSwgMjI3MzEzNDg0MiwgMzI4MTkxMTA3OSwgNDA4MDk2Mjg0NiwgMTcyNDUwNjI1LCAyNTY5OTk0MTAwLCA5ODAzODEzNTUsIDQxMDk5NTg0NTUsIDI4MTk4MDgzNTIsIDI3MTY1ODk1NjAsIDI1Njg3NDExOTYsIDM2ODE0NDY2NjksIDMzMjk5NzE0NzIsIDE4MzU0NzgwNzEsIDY2MDk4NDg5MSwgMzcwNDY3ODQwNCwgNDA0NTk5OTU1OSwgMzQyMjYxNzUwNywgMzA0MDQxNTYzNCwgMTc2MjY1MTQwMywgMTcxOTM3NzkxNSwgMzQ3MDQ5MTAzNiwgMjY5MzkxMDI4MywgMzY0MjA1NjM1NSwgMzEzODU5Njc0NCwgMTM2NDk2MjU5NiwgMjA3MzMyODA2MywgMTk4MzYzMzEzMSwgOTI2NDk0Mzg3LCAzNDIzNjg5MDgxLCAyMTUwMDMyMDIzLCA0MDk2NjY3OTQ5LCAxNzQ5MjAwMjk1LCAzMzI4ODQ2NjUxLCAzMDk2NzcyNjAsIDIwMTYzNDIzMDAsIDE3Nzk1ODE0OTUsIDMwNzk4MTk3NTEsIDExMTI2MjY5NCwgMTI3NDc2NjE2MCwgNDQzMjI0MDg4LCAyOTg1MTE4NjYsIDEwMjU4ODM2MDgsIDM4MDY0NDY1MzcsIDExNDUxODE3ODUsIDE2ODk1NjgwNiwgMzY0MTUwMjgzMCwgMzU4NDgxMzYxMCwgMTY4OTIxNjg0NiwgMzY2NjI1ODAxNSwgMzIwMDI0ODIwMCwgMTY5MjcxMzk4MiwgMjY0NjM3NjUzNSwgNDA0Mjc2ODUxOCwgMTYxODUwODc5MiwgMTYxMDgzMzk5NywgMzUyMzA1MjM1OCwgNDEzMDg3MzI2NCwgMjAwMTA1NTIzNiwgMzYxMDcwNTEwMCwgMjIwMjE2ODExNSwgNDAyODU0MTgwOSwgMjk2MTE5NTM5OSwgMTAwNjY1NzExOSwgMjAwNjk5NjkyNiwgMzE4NjE0Mjc1NiwgMTQzMDY2NzkyOSwgMzIxMDIyNzI5NywgMTMxNDQ1MjYyMywgNDA3NDYzNDY1OCwgNDEwMTMwNDEyMCwgMjI3Mzk1MTE3MCwgMTM5OTI1NzUzOSwgMzM2NzIxMDYxMiwgMzAyNzYyODYyOSwgMTE5MDk3NTkyOSwgMjA2MjIzMTEzNywgMjMzMzk5MDc4OCwgMjIyMTU0MzAzMywgMjQzODk2MDYxMCwgMTE4MTYzNzAwNiwgNTQ4Njg5Nzc2LCAyMzYyNzkxMzEzLCAzMzcyNDA4Mzk2LCAzMTA0NTUwMTEzLCAzMTQ1ODYwNTYwLCAyOTYyNDc4ODAsIDE5NzA1Nzk4NzAsIDMwNzg1NjAxODIsIDM3NjkyMjgyOTcsIDE3MTQyMjc2MTcsIDMyOTE2MjkxMDcsIDM4OTgyMjAyOTAsIDE2Njc3MjM2NCwgMTI1MTU4MTk4OSwgNDkzODEzMjY0LCA0NDgzNDc0MjEsIDE5NTQwNTAyMywgMjcwOTk3NTU2NywgNjc3OTY2MTg1LCAzNzAzMDM2NTQ3LCAxNDYzMzU1MTM0LCAyNzE1OTk1ODAzLCAxMzM4ODY3NTM4LCAxMzQzMzE1NDU3LCAyODAyMjIyMDc0LCAyNjg0NTMyMTY0LCAyMzMyMzAzNzUsIDI1OTk5ODAwNzEsIDIwMDA2NTE4NDEsIDMyNzc4NjgwMzgsIDE2Mzg0MDE3MTcsIDQwMjgwNzA0NDAsIDMyMzczMTYzMjAsIDYzMTQxNTQsIDgxOTc1NjM4NiwgMzAwMzI2NjE1LCA1OTA5MzI1NzksIDE0MDUyNzk2MzYsIDMyNjc0OTk1NzIsIDMxNTA3MDQyMTQsIDI0MjgyODY2ODYsIDM5NTkxOTI5OTMsIDM0NjE5NDY3NDIsIDE4NjI2NTcwMzMsIDEyNjY0MTgwNTYsIDk2Mzc3NTAzNywgMjA4OTk3NDgyMCwgMjI2MzA1Mjg5NSwgMTkxNzY4OTI3MywgNDQ4ODc5NTQwLCAzNTUwMzk0NjIwLCAzOTgxNzI3MDk2LCAxNTA3NzUyMjEsIDM2Mjc5MDgzMDcsIDEzMDMxODczOTYsIDUwODYyMDYzOCwgMjk3NTk4MzM1MiwgMjcyNjYzMDYxNywgMTgxNzI1MjY2OCwgMTg3NjI4MTMxOSwgMTQ1NzYwNjM0MCwgOTA4NzcxMjc4LCAzNzIwNzkyMTE5LCAzNjE3MjA2ODM2LCAyNDU1OTk0ODk4LCAxNzI5MDM0ODk0LCAxMDgwMDMzNTA0XSwgczM6Wzk3Njg2Njg3MSwgMzU1NjQzOTUwMywgMjg4MTY0ODQzOSwgMTUyMjg3MTU3OSwgMTU1NTA2NDczNCwgMTMzNjA5NjU3OCwgMzU0ODUyMjMwNCwgMjU3OTI3NDY4NiwgMzU3NDY5NzYyOSwgMzIwNTQ2MDc1NywgMzU5MzI4MDYzOCwgMzMzODcxNjI4MywgMzA3OTQxMjU4NywgNTY0MjM2MzU3LCAyOTkzNTk4OTEwLCAxNzgxOTUyMTgwLCAxNDY0MzgwMjA3LCAzMTYzODQ0MjE3LCAzMzMyNjAxNTU0LCAxNjk5MzMyODA4LCAxMzkzNTU1Njk0LCAxMTgzNzAyNjUzLCAzNTgxMDg2MjM3LCAxMjg4NzE5ODE0LCA2OTE2NDk0OTksIDI4NDc1NTcyMDAsIDI4OTU0NTU5NzYsIDMxOTM4ODk1NDAsIDI3MTc1NzA1NDQsIDE3ODEzNTQ5MDYsIDE2NzY2NDM1NTQsIDI1OTI1MzQwNTAsIDMyMzAyNTM3NTIsIDExMjY0NDQ3OTAsIDI3NzAyMDc2NTgsIDI2MzMxNTg4MjAsIDIyMTA0MjMyMjYsIDI2MTU3NjU1ODEsIDI0MTQxNTUwODgsIDMxMjcxMzkyODYsIDY3MzYyMDcyOSwgMjgwNTYxMTIzMywgMTI2OTQwNTA2MiwgNDAxNTM1MDUwNSwgMzM0MTgwNzU3MSwgNDE0OTQwOTc1NCwgMTA1NzI1NTI3MywgMjAxMjg3NTM1MywgMjE2MjQ2OTE0MSwgMjI3NjQ5MjgwMSwgMjYwMTExNzM1NywgOTkzOTc3NzQ3LCAzOTE4NTkzMzcwLCAyNjU0MjYzMTkxLCA3NTM5NzMyMDksIDM2NDA4MTQ1LCAyNTMwNTg1NjU4LCAyNTAxMTgzNywgMzUyMDAyMDE4MiwgMjA4ODU3ODM0NCwgNTMwNTIzNTk5LCAyOTE4MzY1MzM5LCAxNTI0MDIwMzM4LCAxNTE4OTI1MTMyLCAzNzYwODI3NTA1LCAzNzU5Nzc3MjU0LCAxMjAyNzYwOTU3LCAzOTg1ODk4MTM5LCAzOTA2MTkyNTI1LCA2NzQ5Nzc3NDAsIDQxNzQ3MzQ4ODksIDIwMzEzMDAxMzYsIDIwMTk0OTIyNDEsIDM5ODM4OTI1NjUsIDQxNTM4MDY0MDQsIDM4MjIyODAzMzIsIDM1MjY3NzMzMiwgMjI5NzcyMDI1MCwgNjA5MDc4MTMsIDkwNTAxMzA5LCAzMjg2OTk4NTQ5LCAxMDE2MDkyNTc4LCAyNTM1OTIyNDEyLCAyODM5MTUyNDI2LCA0NTcxNDE2NTksIDUwOTgxMzIzNywgNDEyMDY2Nzg5OSwgNjUyMDE0MzYxLCAxOTY2MzMyMjAwLCAyOTc1MjAyODA1LCA1NTk4MTE4NiwgMjMyNzQ2MTA1MSwgNjc2NDI3NTM3LCAzMjU1NDkxMDY0LCAyODgyMjk0MTE5LCAzNDMzOTI3MjYzLCAxMzA3MDU1OTUzLCA5NDI3MjYyODYsIDkzMzA1ODY1OCwgMjQ2ODQxMTc5MywgMzkzMzkwMDk5NCwgNDIxNTE3NjE0MiwgMTM2MTE3MDAyMCwgMjAwMTcxNDczOCwgMjgzMDU1ODA3OCwgMzI3NDI1OTc4MiwgMTIyMjUyOTg5NywgMTY3OTAyNTc5MiwgMjcyOTMxNDMyMCwgMzcxNDk1Mzc2NCwgMTc3MDMzNTc0MSwgMTUxNDYyMjQ2LCAzMDEzMjMyMTM4LCAxNjgyMjkyOTU3LCAxNDgzNTI5OTM1LCA0NzE5MTA1NzQsIDE1MzkyNDE5NDksIDQ1ODc4ODE2MCwgMzQzNjMxNTAwNywgMTgwNzAxNjg5MSwgMzcxODQwODgzMCwgOTc4OTc2NTgxLCAxMDQzNjYzNDI4LCAzMTY1OTY1NzgxLCAxOTI3OTkwOTUyLCA0MjAwODkxNTc5LCAyMzcyMjc2OTEwLCAzMjA4NDA4OTAzLCAzNTMzNDMxOTA3LCAxNDEyMzkwMzAyLCAyOTMxOTgwMDU5LCA0MTMyMzMyNDAwLCAxOTQ3MDc4MDI5LCAzODgxNTA1NjIzLCA0MTY4MjI2NDE3LCAyOTQxNDg0MzgxLCAxMDc3OTg4MTA0LCAxMzIwNDc3Mzg4LCA4ODYxOTU4MTgsIDE4MTk4NDA0LCAzNzg2NDA5MDAwLCAyNTA5NzgxNTMzLCAxMTI3NjI4MDQsIDM0NjMzNTY0ODgsIDE4NjY0MTQ5NzgsIDg5MTMzMzUwNiwgMTg0ODg2NTEsIDY2MTc5Mjc2MCwgMTYyODc5MDk2MSwgMzg4NTE4NzAzNiwgMzE0MTE3MTQ5OSwgODc2OTQ2ODc3LCAyNjkzMjgyMjczLCAxMzcyNDg1OTYzLCA3OTE4NTc1OTEsIDI2ODY0MzM5OTMsIDM3NTk5ODI3MTgsIDMxNjcyMTIwMjIsIDM0NzI5NTM3OTUsIDI3MTYzNzk4NDcsIDQ0NTY3OTQzMywgMzU2MTk5NTY3NCwgMzUwNDAwNDgxMSwgMzU3NDI1ODIzMiwgNTQxMTcxNjIsIDMzMzE0MDU0MTUsIDIzODE5MTg1ODgsIDM3Njk3MDczNDMsIDQxNTQzNTAwMDcsIDExNDAxNzc3MjIsIDQwNzQwNTIwOTUsIDY2ODU1MDU1NiwgMzIxNDM1Mjk0MCwgMzY3NDU5MzcwLCAyNjEyMjU1ODUsIDI2MTAxNzMyMjEsIDQyMDkzNDk0NzMsIDM0NjgwNzQyMTksIDMyNjU4MTU2NDEsIDMxNDIyMjgwMSwgMzA2NjEwMzY0NiwgMzgwODc4Mjg2MCwgMjgyMjE4NTk3LCAzNDA2MDEzNTA2LCAzNzczNTkxMDU0LCAzNzkxMTYzNDcsIDEyODUwNzEwMzgsIDg0Njc4NDg2OCwgMjY2OTY0NzE1NCwgMzc3MTk2MjA3OSwgMzU1MDQ5MTY5MSwgMjMwNTk0NjE0MiwgNDUzNjY5OTUzLCAxMjY4OTg3MDIwLCAzMzE3NTkyMzUyLCAzMjc5MzAzMzg0LCAzNzQ0ODMzNDIxLCAyNjEwNTA3NTY2LCAzODU5NTA5MDYzLCAyNjY1OTY2MzcsIDM4NDcwMTkwOTIsIDUxNzY1ODc2OSwgMzQ2MjU2MDIwNywgMzQ0MzQyNDg3OSwgMzcwNzE3MDMwLCA0MjQ3NTI2NjYxLCAyMjI0MDE4MTE3LCA0MTQzNjUzNTI5LCA0MTEyNzczOTc1LCAyNzg4MzI0ODk5LCAyNDc3Mjc0NDE3LCAxNDU2MjYyNDAyLCAyOTAxNDQyOTE0LCAxNTE3Njc3NDkzLCAxODQ2OTQ5NTI3LCAyMjk1NDkzNTgwLCAzNzM0Mzk3NTg2LCAyMTc2NDAzOTIwLCAxMjgwMzQ4MTg3LCAxOTA4ODIzNTcyLCAzODcxNzg2OTQxLCA4NDY4NjEzMjIsIDExNzI0MjY3NTgsIDMyODc0NDg0NzQsIDMzODMzODMwMzcsIDE2NTUxODEwNTYsIDMxMzk4MTMzNDYsIDkwMTYzMjc1OCwgMTg5NzAzMTk0MSwgMjk4NjYwNzEzOCwgMzA2NjgxMDIzNiwgMzQ0NzEwMjUwNywgMTM5MzYzOTEwNCwgMzczMzUxMzc5LCA5NTA3NzkyMzIsIDYyNTQ1NDU3NiwgMzEyNDI0MDU0MCwgNDE0ODYxMjcyNiwgMjAwNzk5ODkxNywgNTQ0NTYzMjk2LCAyMjQ0NzM4NjM4LCAyMzMwNDk2NDcyLCAyMDU4MDI1MzkyLCAxMjkxNDMwNTI2LCA0MjQxOTg3NDgsIDUwMDM5NDM2LCAyOTU4NDEwMCwgMzYwNTc4MzAzMywgMjQyOTg3NjMyOSwgMjc5MTEwNDE2MCwgMTA1NzU2Mzk0OSwgMzI1NTM2MzIzMSwgMzA3NTM2NzIxOCwgMzQ2Mzk2MzIyNywgMTQ2OTA0Njc1NSwgOTg1ODg3NDYyXX07CisJZnVuY3Rpb24gYWRkKHgsIHkpIHsKKwkJdmFyIHN1bSA9ICh4ICsgeSkgJiA0Mjk0OTY3Mjk1OworCQlpZiAoc3VtIDwgMCkgeworCQkJc3VtID0gLXN1bTsKKwkJCXJldHVybiAoNjU1MzYgKiAoKHN1bSA+PiAxNikgXiA2NTUzNSkpICsgKCgoc3VtICYgNjU1MzUpIF4gNjU1MzUpICsgMSk7CisJCX0KKwkJcmV0dXJuIHN1bTsKKwl9CisJZnVuY3Rpb24gc3BsaXQoeCkgeworCQl2YXIgciA9IHggJiA0Mjk0OTY3Mjk1OworCQlpZiAociA8IDApIHsKKwkJCXIgPSAtcjsKKwkJCXJldHVybiBbKChyICYgNjU1MzUpIF4gNjU1MzUpICsgMSwgKHIgPj4gMTYpIF4gNjU1MzVdOworCQl9CisJCXJldHVybiBbciAmIDY1NTM1LCAociA+PiAxNildOworCX0KKwlmdW5jdGlvbiB4b3IoeCwgeSkgeworCQl2YXIgeHMgPSBzcGxpdCh4KTsKKwkJdmFyIHlzID0gc3BsaXQoeSk7CisJCXJldHVybiAoNjU1MzYgKiAoeHNbMV0gXiB5c1sxXSkpICsgKHhzWzBdIF4geXNbMF0pOworCX0KKwlmdW5jdGlvbiAkKHYsIGJveCkgeworCQl2YXIgZCA9IHYgJiAyNTU7CisJCXYgPj49IDg7CisJCXZhciBjID0gdiAmIDI1NTsKKwkJdiA+Pj0gODsKKwkJdmFyIGIgPSB2ICYgMjU1OworCQl2ID4+PSA4OworCQl2YXIgYSA9IHYgJiAyNTU7CisJCXZhciByID0gYWRkKGJveC5zMFthXSwgYm94LnMxW2JdKTsKKwkJciA9IHhvcihyLCBib3guczJbY10pOworCQlyZXR1cm4gYWRkKHIsIGJveC5zM1tkXSk7CisJfQorCWZ1bmN0aW9uIGViKG8sIGJveCkgeworCQl2YXIgbCA9IG8ubGVmdDsKKwkJdmFyIHIgPSBvLnJpZ2h0OworCQlsID0geG9yKGwsIGJveC5wWzBdKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFsxXSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzJdKSk7CisJCXIgPSB4b3IociwgeG9yKCQobCwgYm94KSwgYm94LnBbM10pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFs0XSkpOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzVdKSk7CisJCWwgPSB4b3IobCwgeG9yKCQociwgYm94KSwgYm94LnBbNl0pKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFs3XSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzhdKSk7CisJCXIgPSB4b3IociwgeG9yKCQobCwgYm94KSwgYm94LnBbOV0pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFsxMF0pKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFsxMV0pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFsxMl0pKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFsxM10pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFsxNF0pKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFsxNV0pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFsxNl0pKTsKKwkJby5yaWdodCA9IGw7CisJCW8ubGVmdCA9IHhvcihyLCBib3gucFsxN10pOworCX0KKwlmdW5jdGlvbiBkYihvLCBib3gpIHsKKwkJdmFyIGwgPSBvLmxlZnQ7CisJCXZhciByID0gby5yaWdodDsKKwkJbCA9IHhvcihsLCBib3gucFsxN10pOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzE2XSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzE1XSkpOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzE0XSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzEzXSkpOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzEyXSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzExXSkpOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzEwXSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzldKSk7CisJCXIgPSB4b3IociwgeG9yKCQobCwgYm94KSwgYm94LnBbOF0pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFs3XSkpOworCQlyID0geG9yKHIsIHhvcigkKGwsIGJveCksIGJveC5wWzZdKSk7CisJCWwgPSB4b3IobCwgeG9yKCQociwgYm94KSwgYm94LnBbNV0pKTsKKwkJciA9IHhvcihyLCB4b3IoJChsLCBib3gpLCBib3gucFs0XSkpOworCQlsID0geG9yKGwsIHhvcigkKHIsIGJveCksIGJveC5wWzNdKSk7CisJCXIgPSB4b3IociwgeG9yKCQobCwgYm94KSwgYm94LnBbMl0pKTsKKwkJbCA9IHhvcihsLCB4b3IoJChyLCBib3gpLCBib3gucFsxXSkpOworCQlvLnJpZ2h0ID0gbDsKKwkJby5sZWZ0ID0geG9yKHIsIGJveC5wWzBdKTsKKwl9CisJZnVuY3Rpb24gaW5pdChrZXkpIHsKKwkJdmFyIGsgPSBrZXk7CisJCWlmICh0eXBlb2YgKGspID09ICJzdHJpbmciKSB7CisJCQl2YXIgYSA9IFtdOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7CisJCQkJYS5wdXNoKGsuY2hhckNvZGVBdChpKSAmIDI1NSk7CisJCQl9CisJCQlrID0gYTsKKwkJfQorCQl2YXIgYm94ID0ge3A6W10sIHMwOltdLCBzMTpbXSwgczI6W10sIHMzOltdfTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5wLmxlbmd0aDsgaSsrKSB7CisJCQlib3gucC5wdXNoKGJveGVzLnBbaV0pOworCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYm94ZXMuczAubGVuZ3RoOyBpKyspIHsKKwkJCWJveC5zMC5wdXNoKGJveGVzLnMwW2ldKTsKKwkJfQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGJveGVzLnMxLmxlbmd0aDsgaSsrKSB7CisJCQlib3guczEucHVzaChib3hlcy5zMVtpXSk7CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5zMi5sZW5ndGg7IGkrKykgeworCQkJYm94LnMyLnB1c2goYm94ZXMuczJbaV0pOworCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYm94ZXMuczMubGVuZ3RoOyBpKyspIHsKKwkJCWJveC5zMy5wdXNoKGJveGVzLnMzW2ldKTsKKwkJfQorCQl2YXIgcG9zID0gMDsKKwkJdmFyIGRhdGEgPSAwOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGJveC5wLmxlbmd0aDsgaSsrKSB7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykgeworCQkJCWRhdGEgPSAoZGF0YSAqIFBPVzgpIHwga1twb3NdOworCQkJCWlmICgrK3BvcyA9PSBrLmxlbmd0aCkgeworCQkJCQlwb3MgPSAwOworCQkJCX0KKwkJCX0KKwkJCWJveC5wW2ldID0geG9yKGJveC5wW2ldLCBkYXRhKTsKKwkJfQorCQl2YXIgcmVzID0ge2xlZnQ6MCwgcmlnaHQ6MH07CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYm94LnAubGVuZ3RoOyApIHsKKwkJCWViKHJlcywgYm94KTsKKwkJCWJveC5wW2krK10gPSByZXMubGVmdDsKKwkJCWJveC5wW2krK10gPSByZXMucmlnaHQ7CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgYm94WyJzIiArIGldLmxlbmd0aDsgKSB7CisJCQkJZWIocmVzLCBib3gpOworCQkJCWJveFsicyIgKyBpXVtqKytdID0gcmVzLmxlZnQ7CisJCQkJYm94WyJzIiArIGldW2orK10gPSByZXMucmlnaHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJveDsKKwl9CisJZnVuY3Rpb24gdG9CYXNlNjQoYmEpIHsKKwkJdmFyIHAgPSAiPSI7CisJCXZhciB0YWIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisJCXZhciBzID0gW107CisJCXZhciBsID0gYmEubGVuZ3RoOworCQl2YXIgcm0gPSBsICUgMzsKKwkJdmFyIHggPSBsIC0gcm07CisJCWZvciAodmFyIGkgPSAwOyBpIDwgeDsgKSB7CisJCQl2YXIgdCA9IGJhW2krK10gPDwgMTYgfCBiYVtpKytdIDw8IDggfCBiYVtpKytdOworCQkJcy5wdXNoKHRhYi5jaGFyQXQoKHQgPj4+IDE4KSAmIDYzKSk7CisJCQlzLnB1c2godGFiLmNoYXJBdCgodCA+Pj4gMTIpICYgNjMpKTsKKwkJCXMucHVzaCh0YWIuY2hhckF0KCh0ID4+PiA2KSAmIDYzKSk7CisJCQlzLnB1c2godGFiLmNoYXJBdCh0ICYgNjMpKTsKKwkJfQorCQlzd2l0Y2ggKHJtKSB7CisJCSAgY2FzZSAyOgorCQkJdmFyIHQgPSBiYVtpKytdIDw8IDE2IHwgYmFbaSsrXSA8PCA4OworCQkJcy5wdXNoKHRhYi5jaGFyQXQoKHQgPj4+IDE4KSAmIDYzKSk7CisJCQlzLnB1c2godGFiLmNoYXJBdCgodCA+Pj4gMTIpICYgNjMpKTsKKwkJCXMucHVzaCh0YWIuY2hhckF0KCh0ID4+PiA2KSAmIDYzKSk7CisJCQlzLnB1c2gocCk7CisJCQlicmVhazsKKwkJICBjYXNlIDE6CisJCQl2YXIgdCA9IGJhW2krK10gPDwgMTY7CisJCQlzLnB1c2godGFiLmNoYXJBdCgodCA+Pj4gMTgpICYgNjMpKTsKKwkJCXMucHVzaCh0YWIuY2hhckF0KCh0ID4+PiAxMikgJiA2MykpOworCQkJcy5wdXNoKHApOworCQkJcy5wdXNoKHApOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHMuam9pbigiIik7CisJfQorCWZ1bmN0aW9uIGZyb21CYXNlNjQoc3RyKSB7CisJCXZhciBzID0gc3RyLnNwbGl0KCIiKTsKKwkJdmFyIHAgPSAiPSI7CisJCXZhciB0YWIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisJCXZhciBvdXQgPSBbXTsKKwkJdmFyIGwgPSBzLmxlbmd0aDsKKwkJd2hpbGUgKHNbLS1sXSA9PSBwKSB7CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyApIHsKKwkJCXZhciB0ID0gdGFiLmluZGV4T2Yoc1tpKytdKSA8PCAxOCB8IHRhYi5pbmRleE9mKHNbaSsrXSkgPDwgMTIgfCB0YWIuaW5kZXhPZihzW2krK10pIDw8IDYgfCB0YWIuaW5kZXhPZihzW2krK10pOworCQkJb3V0LnB1c2goKHQgPj4+IDE2KSAmIDI1NSk7CisJCQlvdXQucHVzaCgodCA+Pj4gOCkgJiAyNTUpOworCQkJb3V0LnB1c2godCAmIDI1NSk7CisJCX0KKwkJcmV0dXJuIG91dDsKKwl9CisJdGhpcy5nZXRJViA9IGZ1bmN0aW9uIChvdXRwdXRUeXBlKSB7CisJCXZhciBvdXQgPSBvdXRwdXRUeXBlIHx8IGRvam8uY3J5cHRvLm91dHB1dFR5cGVzLkJhc2U2NDsKKwkJc3dpdGNoIChvdXQpIHsKKwkJICBjYXNlIGRvam8uY3J5cHRvLm91dHB1dFR5cGVzLkhleDoKKwkJCXZhciBzID0gW107CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGl2Lmxlbmd0aDsgaSsrKSB7CisJCQkJcy5wdXNoKChpdltpXSkudG9TdHJpbmcoMTYpKTsKKwkJCX0KKwkJCXJldHVybiBzLmpvaW4oIiIpOworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuU3RyaW5nOgorCQkJcmV0dXJuIGl2LmpvaW4oIiIpOworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuUmF3OgorCQkJcmV0dXJuIGl2OworCQkgIGRlZmF1bHQ6CisJCQlyZXR1cm4gdG9CYXNlNjQoaXYpOworCQl9CisJfTsKKwl0aGlzLnNldElWID0gZnVuY3Rpb24gKGRhdGEsIGlucHV0VHlwZSkgeworCQl2YXIgaXAgPSBpbnB1dFR5cGUgfHwgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQl2YXIgYmEgPSBudWxsOworCQlzd2l0Y2ggKGlwKSB7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5TdHJpbmc6CisJCQliYSA9IFtdOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJYmEucHVzaChkYXRhLmNoYXJDb2RlQXQoaSkpOworCQkJfQorCQkJYnJlYWs7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5IZXg6CisJCQliYSA9IFtdOworCQkJdmFyIGkgPSAwOworCQkJd2hpbGUgKGkgKyAxIDwgZGF0YS5sZW5ndGgpIHsKKwkJCQliYS5wdXNoKHBhcnNlSW50KGRhdGEuc3Vic3RyKGksIDIpLCAxNikpOworCQkJCWkgKz0gMjsKKwkJCX0KKwkJCWJyZWFrOworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuUmF3OgorCQkJYmEgPSBkYXRhOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCWJhID0gZnJvbUJhc2U2NChkYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWl2ID0ge307CisJCWl2LmxlZnQgPSBiYVswXSAqIFBPVzI0IHwgYmFbMV0gKiBQT1cxNiB8IGJhWzJdICogUE9XOCB8IGJhWzNdOworCQlpdi5yaWdodCA9IGJhWzRdICogUE9XMjQgfCBiYVs1XSAqIFBPVzE2IHwgYmFbNl0gKiBQT1c4IHwgYmFbN107CisJfTsKKwl0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbiAocGxhaW50ZXh0LCBrZXksIGFvKSB7CisJCXZhciBvdXQgPSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5CYXNlNjQ7CisJCXZhciBtb2RlID0gZG9qby5jcnlwdG8uY2lwaGVyTW9kZXMuRUJDOworCQlpZiAoYW8pIHsKKwkJCWlmIChhby5vdXRwdXRUeXBlKSB7CisJCQkJb3V0ID0gYW8ub3V0cHV0VHlwZTsKKwkJCX0KKwkJCWlmIChhby5jaXBoZXJNb2RlKSB7CisJCQkJbW9kZSA9IGFvLmNpcGhlck1vZGU7CisJCQl9CisJCX0KKwkJdmFyIGJ4ID0gaW5pdChrZXkpOworCQl2YXIgcGFkZGluZyA9IDggLSAocGxhaW50ZXh0Lmxlbmd0aCAmIDcpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworCQkJcGxhaW50ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFkZGluZyk7CisJCX0KKwkJdmFyIGNpcGhlciA9IFtdOworCQl2YXIgY291bnQgPSBwbGFpbnRleHQubGVuZ3RoID4+IDM7CisJCXZhciBwb3MgPSAwOworCQl2YXIgbyA9IHt9OworCQl2YXIgaXNDQkMgPSAobW9kZSA9PSBkb2pvLmNyeXB0by5jaXBoZXJNb2Rlcy5DQkMpOworCQl2YXIgdmVjdG9yID0ge2xlZnQ6aXYubGVmdCB8fCBudWxsLCByaWdodDppdi5yaWdodCB8fCBudWxsfTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlvLmxlZnQgPSBwbGFpbnRleHQuY2hhckNvZGVBdChwb3MpICogUE9XMjQgfCBwbGFpbnRleHQuY2hhckNvZGVBdChwb3MgKyAxKSAqIFBPVzE2IHwgcGxhaW50ZXh0LmNoYXJDb2RlQXQocG9zICsgMikgKiBQT1c4IHwgcGxhaW50ZXh0LmNoYXJDb2RlQXQocG9zICsgMyk7CisJCQlvLnJpZ2h0ID0gcGxhaW50ZXh0LmNoYXJDb2RlQXQocG9zICsgNCkgKiBQT1cyNCB8IHBsYWludGV4dC5jaGFyQ29kZUF0KHBvcyArIDUpICogUE9XMTYgfCBwbGFpbnRleHQuY2hhckNvZGVBdChwb3MgKyA2KSAqIFBPVzggfCBwbGFpbnRleHQuY2hhckNvZGVBdChwb3MgKyA3KTsKKwkJCWlmIChpc0NCQykgeworCQkJCW8ubGVmdCA9IHhvcihvLmxlZnQsIHZlY3Rvci5sZWZ0KTsKKwkJCQlvLnJpZ2h0ID0geG9yKG8ucmlnaHQsIHZlY3Rvci5yaWdodCk7CisJCQl9CisJCQllYihvLCBieCk7CisJCQlpZiAoaXNDQkMpIHsKKwkJCQl2ZWN0b3IubGVmdCA9IG8ubGVmdDsKKwkJCQl2ZWN0b3IucmlnaHQgPSBvLnJpZ2h0OworCQkJCWRvam8uY3J5cHRvLm91dHB1dFR5cGVzLkhleDsKKwkJCX0KKwkJCWNpcGhlci5wdXNoKChvLmxlZnQgPj4gMjQpICYgMjU1KTsKKwkJCWNpcGhlci5wdXNoKChvLmxlZnQgPj4gMTYpICYgMjU1KTsKKwkJCWNpcGhlci5wdXNoKChvLmxlZnQgPj4gOCkgJiAyNTUpOworCQkJY2lwaGVyLnB1c2goby5sZWZ0ICYgMjU1KTsKKwkJCWNpcGhlci5wdXNoKChvLnJpZ2h0ID4+IDI0KSAmIDI1NSk7CisJCQljaXBoZXIucHVzaCgoby5yaWdodCA+PiAxNikgJiAyNTUpOworCQkJY2lwaGVyLnB1c2goKG8ucmlnaHQgPj4gOCkgJiAyNTUpOworCQkJY2lwaGVyLnB1c2goby5yaWdodCAmIDI1NSk7CisJCQlwb3MgKz0gODsKKwkJfQorCQlzd2l0Y2ggKG91dCkgeworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuSGV4OgorCQkJdmFyIHMgPSBbXTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2lwaGVyLmxlbmd0aDsgaSsrKSB7CisJCQkJcy5wdXNoKChjaXBoZXJbaV0pLnRvU3RyaW5nKDE2KSk7CisJCQl9CisJCQlyZXR1cm4gcy5qb2luKCIiKTsKKwkJICBjYXNlIGRvam8uY3J5cHRvLm91dHB1dFR5cGVzLlN0cmluZzoKKwkJCXJldHVybiBjaXBoZXIuam9pbigiIik7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5SYXc6CisJCQlyZXR1cm4gY2lwaGVyOworCQkgIGRlZmF1bHQ6CisJCQlyZXR1cm4gdG9CYXNlNjQoY2lwaGVyKTsKKwkJfQorCX07CisJdGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24gKGNpcGhlcnRleHQsIGtleSwgYW8pIHsKKwkJdmFyIGlwID0gZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQl2YXIgbW9kZSA9IGRvam8uY3J5cHRvLmNpcGhlck1vZGVzLkVCQzsKKwkJaWYgKGFvKSB7CisJCQlpZiAoYW8ub3V0cHV0VHlwZSkgeworCQkJCWlwID0gYW8ub3V0cHV0VHlwZTsKKwkJCX0KKwkJCWlmIChhby5jaXBoZXJNb2RlKSB7CisJCQkJbW9kZSA9IGFvLmNpcGhlck1vZGU7CisJCQl9CisJCX0KKwkJdmFyIGJ4ID0gaW5pdChrZXkpOworCQl2YXIgcHQgPSBbXTsKKwkJdmFyIGMgPSBudWxsOworCQlzd2l0Y2ggKGlwKSB7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5IZXg6CisJCQljID0gW107CisJCQl2YXIgaSA9IDA7CisJCQl3aGlsZSAoaSArIDEgPCBjaXBoZXJ0ZXh0Lmxlbmd0aCkgeworCQkJCWMucHVzaChwYXJzZUludChjaXBoZXJ0ZXh0LnN1YnN0cihpLCAyKSwgMTYpKTsKKwkJCQlpICs9IDI7CisJCQl9CisJCQlicmVhazsKKwkJICBjYXNlIGRvam8uY3J5cHRvLm91dHB1dFR5cGVzLlN0cmluZzoKKwkJCWMgPSBbXTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2lwaGVydGV4dC5sZW5ndGg7IGkrKykgeworCQkJCWMucHVzaChjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoaSkpOworCQkJfQorCQkJYnJlYWs7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5SYXc6CisJCQljID0gY2lwaGVydGV4dDsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQljID0gZnJvbUJhc2U2NChjaXBoZXJ0ZXh0KTsKKwkJCWJyZWFrOworCQl9CisJCXZhciBjb3VudCA9IGMubGVuZ3RoID4+IDM7CisJCXZhciBwb3MgPSAwOworCQl2YXIgbyA9IHt9OworCQl2YXIgaXNDQkMgPSAobW9kZSA9PSBkb2pvLmNyeXB0by5jaXBoZXJNb2Rlcy5DQkMpOworCQl2YXIgdmVjdG9yID0ge2xlZnQ6aXYubGVmdCB8fCBudWxsLCByaWdodDppdi5yaWdodCB8fCBudWxsfTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlvLmxlZnQgPSBjW3Bvc10gKiBQT1cyNCB8IGNbcG9zICsgMV0gKiBQT1cxNiB8IGNbcG9zICsgMl0gKiBQT1c4IHwgY1twb3MgKyAzXTsKKwkJCW8ucmlnaHQgPSBjW3BvcyArIDRdICogUE9XMjQgfCBjW3BvcyArIDVdICogUE9XMTYgfCBjW3BvcyArIDZdICogUE9XOCB8IGNbcG9zICsgN107CisJCQlpZiAoaXNDQkMpIHsKKwkJCQl2YXIgbGVmdCA9IG8ubGVmdDsKKwkJCQl2YXIgcmlnaHQgPSBvLnJpZ2h0OworCQkJfQorCQkJZGIobywgYngpOworCQkJaWYgKGlzQ0JDKSB7CisJCQkJby5sZWZ0ID0geG9yKG8ubGVmdCwgdmVjdG9yLmxlZnQpOworCQkJCW8ucmlnaHQgPSB4b3Ioby5yaWdodCwgdmVjdG9yLnJpZ2h0KTsKKwkJCQl2ZWN0b3IubGVmdCA9IGxlZnQ7CisJCQkJdmVjdG9yLnJpZ2h0ID0gcmlnaHQ7CisJCQl9CisJCQlwdC5wdXNoKChvLmxlZnQgPj4gMjQpICYgMjU1KTsKKwkJCXB0LnB1c2goKG8ubGVmdCA+PiAxNikgJiAyNTUpOworCQkJcHQucHVzaCgoby5sZWZ0ID4+IDgpICYgMjU1KTsKKwkJCXB0LnB1c2goby5sZWZ0ICYgMjU1KTsKKwkJCXB0LnB1c2goKG8ucmlnaHQgPj4gMjQpICYgMjU1KTsKKwkJCXB0LnB1c2goKG8ucmlnaHQgPj4gMTYpICYgMjU1KTsKKwkJCXB0LnB1c2goKG8ucmlnaHQgPj4gOCkgJiAyNTUpOworCQkJcHQucHVzaChvLnJpZ2h0ICYgMjU1KTsKKwkJCXBvcyArPSA4OworCQl9CisJCWlmIChwdFtwdC5sZW5ndGggLSAxXSA9PSBwdFtwdC5sZW5ndGggLSAyXSB8fCBwdFtwdC5sZW5ndGggLSAxXSA9PSAxKSB7CisJCQl2YXIgbiA9IHB0W3B0Lmxlbmd0aCAtIDFdOworCQkJcHQuc3BsaWNlKHB0Lmxlbmd0aCAtIG4sIG4pOworCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcHQubGVuZ3RoOyBpKyspIHsKKwkJCXB0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShwdFtpXSk7CisJCX0KKwkJcmV0dXJuIHB0LmpvaW4oIiIpOworCX07CisJdGhpcy5zZXRJVigiMDAwMDAwMDAwMDAwMDAwMCIsIGRvam8uY3J5cHRvLm91dHB1dFR5cGVzLkhleCk7Cit9KCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jcnlwdG8vTElDRU5TRSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jcnlwdG8vTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNjYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9MSUNFTlNFCkBAIC0wLDAgKzEsMTEgQEAKK0xpY2Vuc2UgRGlzY2xhaW1lcjoKKworQWxsIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5IGFyZSBDb3B5cmlnaHQgKGMpIHRoZSBEb2pvIEZvdW5kYXRpb24sIHdpdGggdGhlCitmb2xsb3dpbmcgZXhjZXB0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTUQ1LmpzLCBTSEExLmpzOgorCSogQ29weXJpZ2h0IDE5OTgtMjAwNSwgUGF1bCBKb2huc3RvbmUKKwkgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIExpY2Vuc2UKKworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL01ENS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jcnlwdG8vTUQ1LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGE5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL01ENS5qcwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucmVxdWlyZSgiZG9qby5jcnlwdG8iKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5jcnlwdG8uTUQ1Iik7Citkb2pvLmNyeXB0by5NRDUgPSBuZXcgZnVuY3Rpb24gKCkgeworCXZhciBjaHJzeiA9IDg7CisJdmFyIG1hc2sgPSAoMSA8PCBjaHJzeikgLSAxOworCWZ1bmN0aW9uIHRvV29yZChzKSB7CisJCXZhciB3YSA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoICogY2hyc3o7IGkgKz0gY2hyc3opIHsKKwkJCXdhW2kgPj4gNV0gfD0gKHMuY2hhckNvZGVBdChpIC8gY2hyc3opICYgbWFzaykgPDwgKGkgJSAzMik7CisJCX0KKwkJcmV0dXJuIHdhOworCX0KKwlmdW5jdGlvbiB0b1N0cmluZyh3YSkgeworCQl2YXIgcyA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHdhLmxlbmd0aCAqIDMyOyBpICs9IGNocnN6KSB7CisJCQlzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgod2FbaSA+PiA1XSA+Pj4gKGkgJSAzMikpICYgbWFzaykpOworCQl9CisJCXJldHVybiBzLmpvaW4oIiIpOworCX0KKwlmdW5jdGlvbiB0b0hleCh3YSkgeworCQl2YXIgaCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwkJdmFyIHMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB3YS5sZW5ndGggKiA0OyBpKyspIHsKKwkJCXMucHVzaChoLmNoYXJBdCgod2FbaSA+PiAyXSA+PiAoKGkgJSA0KSAqIDggKyA0KSkgJiAxNSkgKyBoLmNoYXJBdCgod2FbaSA+PiAyXSA+PiAoKGkgJSA0KSAqIDgpKSAmIDE1KSk7CisJCX0KKwkJcmV0dXJuIHMuam9pbigiIik7CisJfQorCWZ1bmN0aW9uIHRvQmFzZTY0KHdhKSB7CisJCXZhciBwID0gIj0iOworCQl2YXIgdGFiID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCQl2YXIgcyA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHdhLmxlbmd0aCAqIDQ7IGkgKz0gMykgeworCQkJdmFyIHQgPSAoKCh3YVtpID4+IDJdID4+IDggKiAoaSAlIDQpKSAmIDI1NSkgPDwgMTYpIHwgKCgod2FbaSArIDEgPj4gMl0gPj4gOCAqICgoaSArIDEpICUgNCkpICYgMjU1KSA8PCA4KSB8ICgod2FbaSArIDIgPj4gMl0gPj4gOCAqICgoaSArIDIpICUgNCkpICYgMjU1KTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQkJaWYgKGkgKiA4ICsgaiAqIDYgPiB3YS5sZW5ndGggKiAzMikgeworCQkJCQlzLnB1c2gocCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcy5wdXNoKHRhYi5jaGFyQXQoKHQgPj4gNiAqICgzIC0gaikpICYgNjMpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHMuam9pbigiIik7CisJfQorCWZ1bmN0aW9uIGFkZCh4LCB5KSB7CisJCXZhciBsID0gKHggJiA2NTUzNSkgKyAoeSAmIDY1NTM1KTsKKwkJdmFyIG0gPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobCA+PiAxNik7CisJCXJldHVybiAobSA8PCAxNikgfCAobCAmIDY1NTM1KTsKKwl9CisJZnVuY3Rpb24gUihuLCBjKSB7CisJCXJldHVybiAobiA8PCBjKSB8IChuID4+PiAoMzIgLSBjKSk7CisJfQorCWZ1bmN0aW9uIEMocSwgYSwgYiwgeCwgcywgdCkgeworCQlyZXR1cm4gYWRkKFIoYWRkKGFkZChhLCBxKSwgYWRkKHgsIHQpKSwgcyksIGIpOworCX0KKwlmdW5jdGlvbiBGRihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CisJCXJldHVybiBDKChiICYgYykgfCAoKH5iKSAmIGQpLCBhLCBiLCB4LCBzLCB0KTsKKwl9CisJZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgdCkgeworCQlyZXR1cm4gQygoYiAmIGQpIHwgKGMgJiAofmQpKSwgYSwgYiwgeCwgcywgdCk7CisJfQorCWZ1bmN0aW9uIEhIKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHsKKwkJcmV0dXJuIEMoYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTsKKwl9CisJZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgdCkgeworCQlyZXR1cm4gQyhjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7CisJfQorCWZ1bmN0aW9uIGNvcmUoeCwgbGVuKSB7CisJCXhbbGVuID4+IDVdIHw9IDEyOCA8PCAoKGxlbikgJSAzMik7CisJCXhbKCgobGVuICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IGxlbjsKKwkJdmFyIGEgPSAxNzMyNTg0MTkzOworCQl2YXIgYiA9IC0yNzE3MzM4Nzk7CisJCXZhciBjID0gLTE3MzI1ODQxOTQ7CisJCXZhciBkID0gMjcxNzMzODc4OworCQlmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7CisJCQl2YXIgb2xkYSA9IGE7CisJCQl2YXIgb2xkYiA9IGI7CisJCQl2YXIgb2xkYyA9IGM7CisJCQl2YXIgb2xkZCA9IGQ7CisJCQlhID0gRkYoYSwgYiwgYywgZCwgeFtpICsgMF0sIDcsIC02ODA4NzY5MzYpOworCQkJZCA9IEZGKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7CisJCQljID0gRkYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpOworCQkJYiA9IEZGKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApOworCQkJYSA9IEZGKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTsKKwkJCWQgPSBGRihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpOworCQkJYyA9IEZGKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpOworCQkJYiA9IEZGKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTsKKwkJCWEgPSBGRihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7CisJCQlkID0gRkYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7CisJCQljID0gRkYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTsKKwkJCWIgPSBGRihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7CisJCQlhID0gRkYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTsKKwkJCWQgPSBGRihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpOworCQkJYyA9IEZGKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTsKKwkJCWIgPSBGRihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTsKKwkJCWEgPSBHRyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7CisJCQlkID0gR0coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTsKKwkJCWMgPSBHRyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpOworCQkJYiA9IEdHKGIsIGMsIGQsIGEsIHhbaSArIDBdLCAyMCwgLTM3Mzg5NzMwMik7CisJCQlhID0gR0coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpOworCQkJZCA9IEdHKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpOworCQkJYyA9IEdHKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpOworCQkJYiA9IEdHKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7CisJCQlhID0gR0coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7CisJCQlkID0gR0coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7CisJCQljID0gR0coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTsKKwkJCWIgPSBHRyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpOworCQkJYSA9IEdHKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpOworCQkJZCA9IEdHKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpOworCQkJYyA9IEdHKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7CisJCQliID0gR0coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpOworCQkJYSA9IEhIKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTsKKwkJCWQgPSBISChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTsKKwkJCWMgPSBISChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTsKKwkJCWIgPSBISChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpOworCQkJYSA9IEhIKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7CisJCQlkID0gSEgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTsKKwkJCWMgPSBISChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpOworCQkJYiA9IEhIKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTsKKwkJCWEgPSBISChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7CisJCQlkID0gSEgoZCwgYSwgYiwgYywgeFtpICsgMF0sIDExLCAtMzU4NTM3MjIyKTsKKwkJCWMgPSBISChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpOworCQkJYiA9IEhIKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpOworCQkJYSA9IEhIKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTsKKwkJCWQgPSBISChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTsKKwkJCWMgPSBISChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApOworCQkJYiA9IEhIKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7CisJCQlhID0gSUkoYSwgYiwgYywgZCwgeFtpICsgMF0sIDYsIC0xOTg2MzA4NDQpOworCQkJZCA9IElJKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7CisJCQljID0gSUkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpOworCQkJYiA9IElJKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTsKKwkJCWEgPSBJSShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpOworCQkJZCA9IElJKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpOworCQkJYyA9IElJKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTsKKwkJCWIgPSBJSShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTsKKwkJCWEgPSBJSShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7CisJCQlkID0gSUkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTsKKwkJCWMgPSBJSShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTsKKwkJCWIgPSBJSShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTsKKwkJCWEgPSBJSShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7CisJCQlkID0gSUkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpOworCQkJYyA9IElJKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTsKKwkJCWIgPSBJSShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpOworCQkJYSA9IGFkZChhLCBvbGRhKTsKKwkJCWIgPSBhZGQoYiwgb2xkYik7CisJCQljID0gYWRkKGMsIG9sZGMpOworCQkJZCA9IGFkZChkLCBvbGRkKTsKKwkJfQorCQlyZXR1cm4gW2EsIGIsIGMsIGRdOworCX0KKwlmdW5jdGlvbiBobWFjKGRhdGEsIGtleSkgeworCQl2YXIgd2EgPSB0b1dvcmQoa2V5KTsKKwkJaWYgKHdhLmxlbmd0aCA+IDE2KSB7CisJCQl3YSA9IGNvcmUod2EsIGtleS5sZW5ndGggKiBjaHJzeik7CisJCX0KKwkJdmFyIGwgPSBbXSwgciA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWxbaV0gPSB3YVtpXSBeIDkwOTUyMjQ4NjsKKwkJCXJbaV0gPSB3YVtpXSBeIDE1NDk1NTY4Mjg7CisJCX0KKwkJdmFyIGggPSBjb3JlKGwuY29uY2F0KHRvV29yZChkYXRhKSksIDUxMiArIGRhdGEubGVuZ3RoICogY2hyc3opOworCQlyZXR1cm4gY29yZShyLmNvbmNhdChoKSwgNjQwKTsKKwl9CisJdGhpcy5jb21wdXRlID0gZnVuY3Rpb24gKGRhdGEsIG91dHB1dFR5cGUpIHsKKwkJdmFyIG91dCA9IG91dHB1dFR5cGUgfHwgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQlzd2l0Y2ggKG91dCkgeworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuSGV4OgorCQkJcmV0dXJuIHRvSGV4KGNvcmUodG9Xb3JkKGRhdGEpLCBkYXRhLmxlbmd0aCAqIGNocnN6KSk7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5TdHJpbmc6CisJCQlyZXR1cm4gdG9TdHJpbmcoY29yZSh0b1dvcmQoZGF0YSksIGRhdGEubGVuZ3RoICogY2hyc3opKTsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIHRvQmFzZTY0KGNvcmUodG9Xb3JkKGRhdGEpLCBkYXRhLmxlbmd0aCAqIGNocnN6KSk7CisJCX0KKwl9OworCXRoaXMuZ2V0SE1BQyA9IGZ1bmN0aW9uIChkYXRhLCBrZXksIG91dHB1dFR5cGUpIHsKKwkJdmFyIG91dCA9IG91dHB1dFR5cGUgfHwgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQlzd2l0Y2ggKG91dCkgeworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuSGV4OgorCQkJcmV0dXJuIHRvSGV4KGhtYWMoZGF0YSwga2V5KSk7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5TdHJpbmc6CisJCQlyZXR1cm4gdG9TdHJpbmcoaG1hYyhkYXRhLCBrZXkpKTsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIHRvQmFzZTY0KGhtYWMoZGF0YSwga2V5KSk7CisJCX0KKwl9OworfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL1Jpam5kYWVsLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9SaWpuZGFlbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UxYWNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9SaWpuZGFlbC5qcwpAQCAtMCwwICsxLDIzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNyeXB0by5SaWpuZGFlbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmNyeXB0byIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8uY3J5cHRvLlJpam5kYWVsIik7Citkb2pvLmNyeXB0by5SaWpuZGFlbCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24gKHBsYWludGV4dCwga2V5KSB7CisJfTsKKwl0aGlzLmRlY3J5cHQgPSBmdW5jdGlvbiAoY2lwaGVydGV4dCwga2V5KSB7CisJfTsKK30oKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9TSEExLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9TSEExLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjAyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL1NIQTEuanMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uY3J5cHRvIik7Citkb2pvLnByb3ZpZGUoImRvam8uY3J5cHRvLlNIQTEiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmNyeXB0by5TSEExIik7Citkb2pvLmNyeXB0by5TSEExID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl2YXIgY2hyc3ogPSA4OworCXZhciBtYXNrID0gKDEgPDwgY2hyc3opIC0gMTsKKwlmdW5jdGlvbiB0b1dvcmQocykgeworCQl2YXIgd2EgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aCAqIGNocnN6OyBpICs9IGNocnN6KSB7CisJCQl3YVtpID4+IDVdIHw9IChzLmNoYXJDb2RlQXQoaSAvIGNocnN6KSAmIG1hc2spIDw8IChpICUgMzIpOworCQl9CisJCXJldHVybiB3YTsKKwl9CisJZnVuY3Rpb24gdG9TdHJpbmcod2EpIHsKKwkJdmFyIHMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB3YS5sZW5ndGggKiAzMjsgaSArPSBjaHJzeikgeworCQkJcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKHdhW2kgPj4gNV0gPj4+IChpICUgMzIpKSAmIG1hc2spKTsKKwkJfQorCQlyZXR1cm4gcy5qb2luKCIiKTsKKwl9CisJZnVuY3Rpb24gdG9IZXgod2EpIHsKKwkJdmFyIGggPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJCXZhciBzID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgd2EubGVuZ3RoICogNDsgaSsrKSB7CisJCQlzLnB1c2goaC5jaGFyQXQoKHdhW2kgPj4gMl0gPj4gKChpICUgNCkgKiA4ICsgNCkpICYgMTUpICsgaC5jaGFyQXQoKHdhW2kgPj4gMl0gPj4gKChpICUgNCkgKiA4KSkgJiAxNSkpOworCQl9CisJCXJldHVybiBzLmpvaW4oIiIpOworCX0KKwlmdW5jdGlvbiB0b0Jhc2U2NCh3YSkgeworCQl2YXIgcCA9ICI9IjsKKwkJdmFyIHRhYiA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKwkJdmFyIHMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB3YS5sZW5ndGggKiA0OyBpICs9IDMpIHsKKwkJCXZhciB0ID0gKCgod2FbaSA+PiAyXSA+PiA4ICogKGkgJSA0KSkgJiAyNTUpIDw8IDE2KSB8ICgoKHdhW2kgKyAxID4+IDJdID4+IDggKiAoKGkgKyAxKSAlIDQpKSAmIDI1NSkgPDwgOCkgfCAoKHdhW2kgKyAyID4+IDJdID4+IDggKiAoKGkgKyAyKSAlIDQpKSAmIDI1NSk7CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykgeworCQkJCWlmIChpICogOCArIGogKiA2ID4gd2EubGVuZ3RoICogMzIpIHsKKwkJCQkJcy5wdXNoKHApOworCQkJCX0gZWxzZSB7CisJCQkJCXMucHVzaCh0YWIuY2hhckF0KCh0ID4+IDYgKiAoMyAtIGopKSAmIDYzKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBzLmpvaW4oIiIpOworCX0KKwlmdW5jdGlvbiBhZGQoeCwgeSkgeworCQl2YXIgbCA9ICh4ICYgNjU1MzUpICsgKHkgJiA2NTUzNSk7CisJCXZhciBtID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGwgPj4gMTYpOworCQlyZXR1cm4gKG0gPDwgMTYpIHwgKGwgJiA2NTUzNSk7CisJfQorCWZ1bmN0aW9uIHIoeCwgbikgeworCQlyZXR1cm4gKHggPDwgbikgfCAoeCA+Pj4gKDMyIC0gbikpOworCX0KKwlmdW5jdGlvbiBmKHUsIHYsIHcpIHsKKwkJcmV0dXJuICgodSAmIHYpIHwgKH51ICYgdykpOworCX0KKwlmdW5jdGlvbiBnKHUsIHYsIHcpIHsKKwkJcmV0dXJuICgodSAmIHYpIHwgKHUgJiB3KSB8ICh2ICYgdykpOworCX0KKwlmdW5jdGlvbiBoKHUsIHYsIHcpIHsKKwkJcmV0dXJuICh1IF4gdiBeIHcpOworCX0KKwlmdW5jdGlvbiBmbihpLCB1LCB2LCB3KSB7CisJCWlmIChpIDwgMjApIHsKKwkJCXJldHVybiBmKHUsIHYsIHcpOworCQl9CisJCWlmIChpIDwgNDApIHsKKwkJCXJldHVybiBoKHUsIHYsIHcpOworCQl9CisJCWlmIChpIDwgNjApIHsKKwkJCXJldHVybiBnKHUsIHYsIHcpOworCQl9CisJCXJldHVybiBoKHUsIHYsIHcpOworCX0KKwlmdW5jdGlvbiBjbnN0KGkpIHsKKwkJaWYgKGkgPCAyMCkgeworCQkJcmV0dXJuIDE1MTg1MDAyNDk7CisJCX0KKwkJaWYgKGkgPCA0MCkgeworCQkJcmV0dXJuIDE4NTk3NzUzOTM7CisJCX0KKwkJaWYgKGkgPCA2MCkgeworCQkJcmV0dXJuIC0xODk0MDA3NTg4OworCQl9CisJCXJldHVybiAtODk5NDk3NTE0OworCX0KKwlmdW5jdGlvbiBjb3JlKHgsIGxlbikgeworCQl4W2xlbiA+PiA1XSB8PSAxMjggPDwgKDI0IC0gbGVuICUgMzIpOworCQl4WygobGVuICsgNjQgPj4gOSkgPDwgNCkgKyAxNV0gPSBsZW47CisJCXZhciB3ID0gW107CisJCXZhciBhID0gMTczMjU4NDE5MzsKKwkJdmFyIGIgPSAtMjcxNzMzODc5OworCQl2YXIgYyA9IC0xNzMyNTg0MTk0OworCQl2YXIgZCA9IDI3MTczMzg3ODsKKwkJdmFyIGUgPSAtMTAwOTU4OTc3NjsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikgeworCQkJdmFyIG9sZGEgPSBhOworCQkJdmFyIG9sZGIgPSBiOworCQkJdmFyIG9sZGMgPSBjOworCQkJdmFyIG9sZGQgPSBkOworCQkJdmFyIG9sZGUgPSBlOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7CisJCQkJaWYgKGogPCAxNikgeworCQkJCQl3W2pdID0geFtpICsgal07CisJCQkJfSBlbHNlIHsKKwkJCQkJd1tqXSA9IHIod1tqIC0gM10gXiB3W2ogLSA4XSBeIHdbaiAtIDE0XSBeIHdbaiAtIDE2XSwgMSk7CisJCQkJfQorCQkJCXZhciB0ID0gYWRkKGFkZChyKGEsIDUpLCBmbihqLCBiLCBjLCBkKSksIGFkZChhZGQoZSwgd1tqXSksIGNuc3QoaikpKTsKKwkJCQllID0gZDsKKwkJCQlkID0gYzsKKwkJCQljID0gcihiLCAzMCk7CisJCQkJYiA9IGE7CisJCQkJYSA9IHQ7CisJCQl9CisJCQlhID0gYWRkKGEsIG9sZGEpOworCQkJYiA9IGFkZChiLCBvbGRiKTsKKwkJCWMgPSBhZGQoYywgb2xkYyk7CisJCQlkID0gYWRkKGQsIG9sZGQpOworCQkJZSA9IGFkZChlLCBvbGRlKTsKKwkJfQorCQlyZXR1cm4gW2EsIGIsIGMsIGQsIGVdOworCX0KKwlmdW5jdGlvbiBobWFjKGRhdGEsIGtleSkgeworCQl2YXIgd2EgPSB0b1dvcmQoa2V5KTsKKwkJaWYgKHdhLmxlbmd0aCA+IDE2KSB7CisJCQl3YSA9IGNvcmUod2EsIGtleS5sZW5ndGggKiBjaHJzeik7CisJCX0KKwkJdmFyIGwgPSBbXSwgciA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWxbaV0gPSB3YVtpXSBeIDkwOTUyMjQ4NjsKKwkJCXJbaV0gPSB3YVtpXSBeIDE1NDk1NTY4Mjg7CisJCX0KKwkJdmFyIGggPSBjb3JlKGwuY29uY2F0KHRvV29yZChkYXRhKSksIDUxMiArIGRhdGEubGVuZ3RoICogY2hyc3opOworCQlyZXR1cm4gY29yZShyLmNvbmNhdChoKSwgNjQwKTsKKwl9CisJdGhpcy5jb21wdXRlID0gZnVuY3Rpb24gKGRhdGEsIG91dHB1dFR5cGUpIHsKKwkJdmFyIG91dCA9IG91dHB1dFR5cGUgfHwgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQlzd2l0Y2ggKG91dCkgeworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuSGV4OgorCQkJcmV0dXJuIHRvSGV4KGNvcmUodG9Xb3JkKGRhdGEpLCBkYXRhLmxlbmd0aCAqIGNocnN6KSk7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5TdHJpbmc6CisJCQlyZXR1cm4gdG9TdHJpbmcoY29yZSh0b1dvcmQoZGF0YSksIGRhdGEubGVuZ3RoICogY2hyc3opKTsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIHRvQmFzZTY0KGNvcmUodG9Xb3JkKGRhdGEpLCBkYXRhLmxlbmd0aCAqIGNocnN6KSk7CisJCX0KKwl9OworCXRoaXMuZ2V0SE1BQyA9IGZ1bmN0aW9uIChkYXRhLCBrZXksIG91dHB1dFR5cGUpIHsKKwkJdmFyIG91dCA9IG91dHB1dFR5cGUgfHwgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuQmFzZTY0OworCQlzd2l0Y2ggKG91dCkgeworCQkgIGNhc2UgZG9qby5jcnlwdG8ub3V0cHV0VHlwZXMuSGV4OgorCQkJcmV0dXJuIHRvSGV4KGhtYWMoZGF0YSwga2V5KSk7CisJCSAgY2FzZSBkb2pvLmNyeXB0by5vdXRwdXRUeXBlcy5TdHJpbmc6CisJCQlyZXR1cm4gdG9TdHJpbmcoaG1hYyhkYXRhLCBrZXkpKTsKKwkJICBkZWZhdWx0OgorCQkJcmV0dXJuIHRvQmFzZTY0KGhtYWMoZGF0YSwga2V5KSk7CisJCX0KKwl9OworfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL1NIQTI1Ni5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9jcnlwdG8vU0hBMjU2LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjY0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL1NIQTI1Ni5qcwpAQCAtMCwwICsxLDIxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmNyeXB0by5TSEEyNTYiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5jcnlwdG8iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmNyeXB0by5TSEEyNTYiKTsKK2Rvam8uY3J5cHRvLlNIQTI1NiA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5jb21wdXRlID0gZnVuY3Rpb24gKHMpIHsKKwl9OworfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvY3J5cHRvL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDlmNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2NyeXB0by9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5jcnlwdG8iLCAiZG9qby5jcnlwdG8uTUQ1Il19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5jcnlwdG8uKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEiKTsKK2Rvam8uZGF0YSA9IHt9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9Dc3ZTdG9yZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL0NzdlN0b3JlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGNiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9Dc3ZTdG9yZS5qcwpAQCAtMCwwICsxLDExNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLkNzdlN0b3JlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5jb3JlLlJlbW90ZVN0b3JlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kYXRhLkNzdlN0b3JlIiwgZG9qby5kYXRhLmNvcmUuUmVtb3RlU3RvcmUsIHtfc2V0dXBRdWVyeVJlcXVlc3Q6ZnVuY3Rpb24gKHJlc3VsdCwgcmVxdWVzdEt3KSB7CisJdmFyIHNlcnZlclF1ZXJ5VXJsID0gdGhpcy5fc2VydmVyUXVlcnlVcmwgPyB0aGlzLl9zZXJ2ZXJRdWVyeVVybCA6ICIiOworCXZhciBxdWVyeVVybCA9IHJlc3VsdC5xdWVyeSA/IHJlc3VsdC5xdWVyeSA6ICIiOworCXJlcXVlc3RLdy51cmwgPSBzZXJ2ZXJRdWVyeVVybCArIHF1ZXJ5VXJsOworCXJlcXVlc3RLdy5tZXRob2QgPSAiZ2V0IjsKK30sIF9yZXN1bHRUb1F1ZXJ5RGF0YTpmdW5jdGlvbiAoc2VydmVyUmVzcG9uc2VEYXRhKSB7CisJdmFyIGNzdkZpbGVDb250ZW50U3RyaW5nID0gc2VydmVyUmVzcG9uc2VEYXRhOworCXZhciBhcnJheU9mQXJyYXlzID0gdGhpcy5fZ2V0QXJyYXlPZkFycmF5c0Zyb21Dc3ZGaWxlQ29udGVudHMoY3N2RmlsZUNvbnRlbnRTdHJpbmcpOworCXZhciBhcnJheU9mT2JqZWN0cyA9IHRoaXMuX2dldEFycmF5T2ZPYmplY3RzRnJvbUFycmF5T2ZBcnJheXMoYXJyYXlPZkFycmF5cyk7CisJdmFyIHJlbW90ZVN0b3JlRGF0YSA9IHRoaXMuX2dldFJlbW90ZVN0b3JlRGF0YUZyb21BcnJheU9mT2JqZWN0cyhhcnJheU9mT2JqZWN0cyk7CisJcmV0dXJuIHJlbW90ZVN0b3JlRGF0YTsKK30sIF9zZXR1cFNhdmVSZXF1ZXN0OmZ1bmN0aW9uIChzYXZlS2V5d29yZEFyZ3MsIHJlcXVlc3RLdykgeworfSwgX2dldEFycmF5T2ZBcnJheXNGcm9tQ3N2RmlsZUNvbnRlbnRzOmZ1bmN0aW9uIChjc3ZGaWxlQ29udGVudHMpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShjc3ZGaWxlQ29udGVudHMsIFN0cmluZyk7CisJdmFyIGxpbmVFbmRpbmdDaGFyYWN0ZXJzID0gbmV3IFJlZ0V4cCgiXHJcbnxcbnxcciIpOworCXZhciBsZWFkaW5nV2hpdGVTcGFjZUNoYXJhY3RlcnMgPSBuZXcgUmVnRXhwKCJeXFxzKyIsICJnIik7CisJdmFyIHRyYWlsaW5nV2hpdGVTcGFjZUNoYXJhY3RlcnMgPSBuZXcgUmVnRXhwKCJcXHMrJCIsICJnIik7CisJdmFyIGRvdWJsZVF1b3RlcyA9IG5ldyBSZWdFeHAoIlwiXCIiLCAiZyIpOworCXZhciBhcnJheU9mT3V0cHV0UmVjb3JkcyA9IFtdOworCXZhciBhcnJheU9mSW5wdXRMaW5lcyA9IGNzdkZpbGVDb250ZW50cy5zcGxpdChsaW5lRW5kaW5nQ2hhcmFjdGVycyk7CisJZm9yICh2YXIgaSBpbiBhcnJheU9mSW5wdXRMaW5lcykgeworCQl2YXIgc2luZ2xlTGluZSA9IGFycmF5T2ZJbnB1dExpbmVzW2ldOworCQlpZiAoc2luZ2xlTGluZS5sZW5ndGggPiAwKSB7CisJCQl2YXIgbGlzdE9mRmllbGRzID0gc2luZ2xlTGluZS5zcGxpdCgiLCIpOworCQkJdmFyIGogPSAwOworCQkJd2hpbGUgKGogPCBsaXN0T2ZGaWVsZHMubGVuZ3RoKSB7CisJCQkJdmFyIHNwYWNlX2ZpZWxkX3NwYWNlID0gbGlzdE9mRmllbGRzW2pdOworCQkJCXZhciBmaWVsZF9zcGFjZSA9IHNwYWNlX2ZpZWxkX3NwYWNlLnJlcGxhY2UobGVhZGluZ1doaXRlU3BhY2VDaGFyYWN0ZXJzLCAiIik7CisJCQkJdmFyIGZpZWxkID0gZmllbGRfc3BhY2UucmVwbGFjZSh0cmFpbGluZ1doaXRlU3BhY2VDaGFyYWN0ZXJzLCAiIik7CisJCQkJdmFyIGZpcnN0Q2hhciA9IGZpZWxkLmNoYXJBdCgwKTsKKwkJCQl2YXIgbGFzdENoYXIgPSBmaWVsZC5jaGFyQXQoZmllbGQubGVuZ3RoIC0gMSk7CisJCQkJdmFyIHNlY29uZFRvTGFzdENoYXIgPSBmaWVsZC5jaGFyQXQoZmllbGQubGVuZ3RoIC0gMik7CisJCQkJdmFyIHRoaXJkVG9MYXN0Q2hhciA9IGZpZWxkLmNoYXJBdChmaWVsZC5sZW5ndGggLSAzKTsKKwkJCQlpZiAoKGZpcnN0Q2hhciA9PSAiXCIiKSAmJiAoKGxhc3RDaGFyICE9ICJcIiIpIHx8ICgobGFzdENoYXIgPT0gIlwiIikgJiYgKHNlY29uZFRvTGFzdENoYXIgPT0gIlwiIikgJiYgKHRoaXJkVG9MYXN0Q2hhciAhPSAiXCIiKSkpKSB7CisJCQkJCWlmIChqICsgMSA9PT0gbGlzdE9mRmllbGRzLmxlbmd0aCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJdmFyIG5leHRGaWVsZCA9IGxpc3RPZkZpZWxkc1tqICsgMV07CisJCQkJCWxpc3RPZkZpZWxkc1tqXSA9IGZpZWxkX3NwYWNlICsgIiwiICsgbmV4dEZpZWxkOworCQkJCQlsaXN0T2ZGaWVsZHMuc3BsaWNlKGogKyAxLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGZpcnN0Q2hhciA9PSAiXCIiKSAmJiAobGFzdENoYXIgPT0gIlwiIikpIHsKKwkJCQkJCWZpZWxkID0gZmllbGQuc2xpY2UoMSwgKGZpZWxkLmxlbmd0aCAtIDEpKTsKKwkJCQkJCWZpZWxkID0gZmllbGQucmVwbGFjZShkb3VibGVRdW90ZXMsICJcIiIpOworCQkJCQl9CisJCQkJCWxpc3RPZkZpZWxkc1tqXSA9IGZpZWxkOworCQkJCQlqICs9IDE7CisJCQkJfQorCQkJfQorCQkJYXJyYXlPZk91dHB1dFJlY29yZHMucHVzaChsaXN0T2ZGaWVsZHMpOworCQl9CisJfQorCXJldHVybiBhcnJheU9mT3V0cHV0UmVjb3JkczsKK30sIF9nZXRBcnJheU9mT2JqZWN0c0Zyb21BcnJheU9mQXJyYXlzOmZ1bmN0aW9uIChhcnJheU9mQXJyYXlzKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoYXJyYXlPZkFycmF5cywgQXJyYXkpOworCXZhciBhcnJheU9mSXRlbXMgPSBbXTsKKwlpZiAoYXJyYXlPZkFycmF5cy5sZW5ndGggPiAxKSB7CisJCXZhciBhcnJheU9mS2V5cyA9IGFycmF5T2ZBcnJheXNbMF07CisJCWZvciAodmFyIGkgPSAxOyBpIDwgYXJyYXlPZkFycmF5cy5sZW5ndGg7ICsraSkgeworCQkJdmFyIHJvdyA9IGFycmF5T2ZBcnJheXNbaV07CisJCQl2YXIgaXRlbSA9IHt9OworCQkJZm9yICh2YXIgaiBpbiByb3cpIHsKKwkJCQl2YXIgdmFsdWUgPSByb3dbal07CisJCQkJdmFyIGtleSA9IGFycmF5T2ZLZXlzW2pdOworCQkJCWl0ZW1ba2V5XSA9IHZhbHVlOworCQkJfQorCQkJYXJyYXlPZkl0ZW1zLnB1c2goaXRlbSk7CisJCX0KKwl9CisJcmV0dXJuIGFycmF5T2ZJdGVtczsKK30sIF9nZXRSZW1vdGVTdG9yZURhdGFGcm9tQXJyYXlPZk9iamVjdHM6ZnVuY3Rpb24gKGFycmF5T2ZPYmplY3RzKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoYXJyYXlPZk9iamVjdHMsIEFycmF5KTsKKwl2YXIgb3V0cHV0ID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mT2JqZWN0cy5sZW5ndGg7ICsraSkgeworCQl2YXIgb2JqZWN0ID0gYXJyYXlPZk9iamVjdHNbaV07CisJCWZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKKwkJCXZhciB2YWx1ZSA9IG9iamVjdFtrZXldOworCQkJb2JqZWN0W2tleV0gPSBbdmFsdWVdOworCQl9CisJCW91dHB1dFtpXSA9IG9iamVjdDsKKwl9CisJcmV0dXJuIG91dHB1dDsKK30sIG5ld0l0ZW06ZnVuY3Rpb24gKGF0dHJpYnV0ZXMsIGtleXdvcmRBcmdzKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuQ3N2U3RvcmUubmV3SXRlbSIpOworfSwgZGVsZXRlSXRlbTpmdW5jdGlvbiAoaXRlbSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLkNzdlN0b3JlLmRlbGV0ZUl0ZW0iKTsKK30sIHNldFZhbHVlczpmdW5jdGlvbiAoaXRlbSwgYXR0cmlidXRlLCB2YWx1ZXMpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0YS5Dc3ZTdG9yZS5zZXRWYWx1ZXMiKTsKK30sIHNldDpmdW5jdGlvbiAoaXRlbSwgYXR0cmlidXRlLCB2YWx1ZSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLkNzdlN0b3JlLnNldCIpOworfSwgdW5zZXRBdHRyaWJ1dGU6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLkNzdlN0b3JlLnVuc2V0QXR0cmlidXRlIik7Cit9LCBzYXZlOmZ1bmN0aW9uIChrZXl3b3JkQXJncykgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLkNzdlN0b3JlLnNhdmUiKTsKK30sIHJldmVydDpmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuQ3N2U3RvcmUucmV2ZXJ0Iik7Cit9LCBpc0RpcnR5OmZ1bmN0aW9uIChpdGVtKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuQ3N2U3RvcmUuaXNEaXJ0eSIpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9PcG1sU3RvcmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9PcG1sU3RvcmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MTY3MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL09wbWxTdG9yZS5qcwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLk9wbWxTdG9yZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuY29yZS5SZWFkIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5jb3JlLlJlc3VsdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXNzZXJ0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5PcG1sU3RvcmUiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kYXRhLk9wbWxTdG9yZSIsIGRvam8uZGF0YS5jb3JlLlJlYWQsIHtpbml0aWFsaXplcjpmdW5jdGlvbiAoa2V5d29yZFBhcmFtZXRlcnMpIHsKKwl0aGlzLl9hcnJheU9mVG9wTGV2ZWxJdGVtcyA9IFtdOworCXRoaXMuX21ldGFkYXRhTm9kZXMgPSBudWxsOworCXRoaXMuX2xvYWRGaW5pc2hlZCA9IGZhbHNlOworCXRoaXMuX29wbWxGaWxlVXJsID0ga2V5d29yZFBhcmFtZXRlcnNbInVybCJdOworfSwgX2Fzc2VydElzSXRlbTpmdW5jdGlvbiAoaXRlbSkgeworCWlmICghdGhpcy5pc0l0ZW0oaXRlbSkpIHsKKwkJdGhyb3cgbmV3IEVycm9yKCJkb2pvLmRhdGEuT3BtbFN0b3JlOiBhIGZ1bmN0aW9uIHdhcyBwYXNzZWQgYW4gaXRlbSBhcmd1bWVudCB0aGF0IHdhcyBub3QgYW4gaXRlbSIpOworCX0KK30sIF9yZW1vdmVDaGlsZE5vZGVzVGhhdEFyZU5vdEVsZW1lbnROb2RlczpmdW5jdGlvbiAobm9kZSwgcmVjdXJzaXZlKSB7CisJdmFyIGNoaWxkTm9kZXMgPSBub2RlLmNoaWxkTm9kZXM7CisJaWYgKGNoaWxkTm9kZXMubGVuZ3RoID09IDApIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgbm9kZXNUb1JlbW92ZSA9IFtdOworCXZhciBpLCBjaGlsZE5vZGU7CisJZm9yIChpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHsKKwkJY2hpbGROb2RlID0gY2hpbGROb2Rlc1tpXTsKKwkJaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgeworCQkJbm9kZXNUb1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IG5vZGVzVG9SZW1vdmUubGVuZ3RoOyArK2kpIHsKKwkJY2hpbGROb2RlID0gbm9kZXNUb1JlbW92ZVtpXTsKKwkJbm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpOworCX0KKwlpZiAocmVjdXJzaXZlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7CisJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2ldOworCQkJdGhpcy5fcmVtb3ZlQ2hpbGROb2Rlc1RoYXRBcmVOb3RFbGVtZW50Tm9kZXMoY2hpbGROb2RlLCByZWN1cnNpdmUpOworCQl9CisJfQorfSwgX3Byb2Nlc3NSYXdYbWxUcmVlOmZ1bmN0aW9uIChyYXdYbWxUcmVlKSB7CisJdmFyIGhlYWROb2RlcyA9IHJhd1htbFRyZWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKTsKKwl2YXIgaGVhZE5vZGUgPSBoZWFkTm9kZXNbMF07CisJdGhpcy5fcmVtb3ZlQ2hpbGROb2Rlc1RoYXRBcmVOb3RFbGVtZW50Tm9kZXMoaGVhZE5vZGUpOworCXRoaXMuX21ldGFkYXRhTm9kZXMgPSBoZWFkTm9kZS5jaGlsZE5vZGVzOworCXZhciBib2R5Tm9kZXMgPSByYXdYbWxUcmVlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5Iik7CisJdmFyIGJvZHlOb2RlID0gYm9keU5vZGVzWzBdOworCXRoaXMuX3JlbW92ZUNoaWxkTm9kZXNUaGF0QXJlTm90RWxlbWVudE5vZGVzKGJvZHlOb2RlLCB0cnVlKTsKKwl2YXIgYm9keUNoaWxkTm9kZXMgPSBib2R5Tm9kZXNbMF0uY2hpbGROb2RlczsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGJvZHlDaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7CisJCXZhciBub2RlID0gYm9keUNoaWxkTm9kZXNbaV07CisJCWlmIChub2RlLnRhZ05hbWUgPT0gIm91dGxpbmUiKSB7CisJCQl0aGlzLl9hcnJheU9mVG9wTGV2ZWxJdGVtcy5wdXNoKG5vZGUpOworCQl9CisJfQorfSwgZ2V0OmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIGRlZmF1bHRWYWx1ZSkgeworCXRoaXMuX2Fzc2VydElzSXRlbShpdGVtKTsKKwlpZiAoYXR0cmlidXRlID09ICJjaGlsZHJlbiIpIHsKKwkJcmV0dXJuIChpdGVtLmZpcnN0Q2hpbGQgfHwgZGVmYXVsdFZhbHVlKTsKKwl9IGVsc2UgeworCQl2YXIgdmFsdWUgPSBpdGVtLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworCQl2YWx1ZSA9ICh2YWx1ZSAhPSB1bmRlZmluZWQpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7CisJCXJldHVybiB2YWx1ZTsKKwl9Cit9LCBnZXRWYWx1ZXM6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSkgeworCXRoaXMuX2Fzc2VydElzSXRlbShpdGVtKTsKKwlpZiAoYXR0cmlidXRlID09ICJjaGlsZHJlbiIpIHsKKwkJdmFyIGFycmF5ID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgaXRlbS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7CisJCQlhcnJheS5wdXNoKGl0ZW0uY2hpbGROb2Rlc1tpXSk7CisJCX0KKwkJcmV0dXJuIGFycmF5OworCX0gZWxzZSB7CisJCXJldHVybiBbaXRlbS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKV07CisJfQorfSwgZ2V0QXR0cmlidXRlczpmdW5jdGlvbiAoaXRlbSkgeworCXRoaXMuX2Fzc2VydElzSXRlbShpdGVtKTsKKwl2YXIgYXR0cmlidXRlcyA9IFtdOworCXZhciB4bWxOb2RlID0gaXRlbTsKKwl2YXIgeG1sQXR0cmlidXRlcyA9IHhtbE5vZGUuYXR0cmlidXRlczsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHhtbEF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsKKwkJdmFyIHhtbEF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZXMuaXRlbShpKTsKKwkJYXR0cmlidXRlcy5wdXNoKHhtbEF0dHJpYnV0ZS5ub2RlTmFtZSk7CisJfQorCWlmICh4bWxOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQlhdHRyaWJ1dGVzLnB1c2goImNoaWxkcmVuIik7CisJfQorCXJldHVybiBhdHRyaWJ1dGVzOworfSwgaGFzQXR0cmlidXRlOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUpIHsKKwlyZXR1cm4gKHRoaXMuZ2V0VmFsdWVzKGl0ZW0sIGF0dHJpYnV0ZSkubGVuZ3RoID4gMCk7Cit9LCBjb250YWluc1ZhbHVlOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CisJdmFyIHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKGl0ZW0sIGF0dHJpYnV0ZSk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHsKKwkJdmFyIHBvc3NpYmxlVmFsdWUgPSB2YWx1ZXNbaV07CisJCWlmICh2YWx1ZSA9PSBwb3NzaWJsZVZhbHVlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBpc0l0ZW06ZnVuY3Rpb24gKHNvbWV0aGluZykgeworCXJldHVybiAoc29tZXRoaW5nICYmIHNvbWV0aGluZy5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBzb21ldGhpbmcudGFnTmFtZSA9PSAib3V0bGluZSIpOworfSwgaXNJdGVtQXZhaWxhYmxlOmZ1bmN0aW9uIChzb21ldGhpbmcpIHsKKwlyZXR1cm4gdGhpcy5pc0l0ZW0oc29tZXRoaW5nKTsKK30sIGZpbmQ6ZnVuY3Rpb24gKGtleXdvcmRBcmdzKSB7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJaWYgKGtleXdvcmRBcmdzIGluc3RhbmNlb2YgZG9qby5kYXRhLmNvcmUuUmVzdWx0KSB7CisJCXJlc3VsdCA9IGtleXdvcmRBcmdzOworCQlyZXN1bHQuc3RvcmUgPSB0aGlzOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IG5ldyBkb2pvLmRhdGEuY29yZS5SZXN1bHQoa2V5d29yZEFyZ3MsIHRoaXMpOworCX0KKwl2YXIgc2VsZiA9IHRoaXM7CisJdmFyIGJpbmRIYW5kbGVyID0gZnVuY3Rpb24gKHR5cGUsIGRhdGEsIGV2dCkgeworCQl2YXIgc2NvcGUgPSByZXN1bHQuc2NvcGUgfHwgZGpfZ2xvYmFsOworCQlpZiAodHlwZSA9PSAibG9hZCIpIHsKKwkJCXNlbGYuX3Byb2Nlc3NSYXdYbWxUcmVlKGRhdGEpOworCQkJaWYgKHJlc3VsdC5zYXZlUmVzdWx0KSB7CisJCQkJcmVzdWx0Lml0ZW1zID0gc2VsZi5fYXJyYXlPZlRvcExldmVsSXRlbXM7CisJCQl9CisJCQlpZiAocmVzdWx0Lm9uYmVnaW4pIHsKKwkJCQlyZXN1bHQub25iZWdpbi5jYWxsKHNjb3BlLCByZXN1bHQpOworCQkJfQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLl9hcnJheU9mVG9wTGV2ZWxJdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCXZhciBpdGVtID0gc2VsZi5fYXJyYXlPZlRvcExldmVsSXRlbXNbaV07CisJCQkJaWYgKHJlc3VsdC5vbm5leHQgJiYgIXJlc3VsdC5fYWJvcnRlZCkgeworCQkJCQlyZXN1bHQub25uZXh0LmNhbGwoc2NvcGUsIGl0ZW0sIHJlc3VsdCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlc3VsdC5vbmNvbXBsZXRlZCAmJiAhcmVzdWx0Ll9hYm9ydGVkKSB7CisJCQkJcmVzdWx0Lm9uY29tcGxldGVkLmNhbGwoc2NvcGUsIHJlc3VsdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZSA9PSAiZXJyb3IiIHx8IHR5cGUgPT0gInRpbWVvdXQiKSB7CisJCQkJdmFyIGVycm9yT2JqZWN0ID0gZGF0YTsKKwkJCQlpZiAocmVzdWx0Lm9uZXJyb3IpIHsKKwkJCQkJcmVzdWx0Lm9uZXJyb3IuY2FsbChzY29wZSwgZGF0YSk7CisJCQkJfQorCQkJfQorCQl9CisJfTsKKwlpZiAoIXRoaXMuX2xvYWRGaW5pc2hlZCkgeworCQlpZiAodGhpcy5fb3BtbEZpbGVVcmwpIHsKKwkJCXZhciBiaW5kUmVxdWVzdCA9IGRvam8uaW8uYmluZCh7dXJsOnRoaXMuX29wbWxGaWxlVXJsLCBoYW5kbGU6YmluZEhhbmRsZXIsIG1pbWV0eXBlOiJ0ZXh0L3htbCIsIHN5bmM6KHJlc3VsdC5zeW5jIHx8IGZhbHNlKX0pOworCQkJcmVzdWx0Ll9hYm9ydEZ1bmMgPSBiaW5kUmVxdWVzdC5hYm9ydDsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgZ2V0SWRlbnRpdHk6ZnVuY3Rpb24gKGl0ZW0pIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0YS5PcG1sU3RvcmUuZ2V0SWRlbnRpdHkoKSIpOworCXJldHVybiBudWxsOworfSwgZmluZEJ5SWRlbnRpdHk6ZnVuY3Rpb24gKGlkZW50aXR5KSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuT3BtbFN0b3JlLmZpbmRCeUlkZW50aXR5KCkiKTsKKwlyZXR1cm4gbnVsbDsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvUmRmU3RvcmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9SZGZTdG9yZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI3OWVmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvUmRmU3RvcmUuanMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5SZGZTdG9yZSIpOworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEuUmhpem9tZVN0b3JlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5jb3JlLlJlbW90ZVN0b3JlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmRhdGEuUmRmRGF0YXR5cGVTZXJpYWxpemVyID0gZnVuY3Rpb24gKHR5cGUsIGNvbnZlcnRGdW5jLCB1cmkpIHsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMuX2NvbnZlcnRlciA9IGNvbnZlcnRGdW5jOworCXRoaXMudXJpID0gdXJpOworCXRoaXMuc2VyaWFsaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7CisJCXJldHVybiB0aGlzLl9jb252ZXJ0ZXIuY2FsbCh2YWx1ZSwgdmFsdWUpOworCX07Cit9OworZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuUmRmU3RvcmUiLCBkb2pvLmRhdGEuY29yZS5SZW1vdGVTdG9yZSwge19kYXRhdHlwZU1hcDp7bGl0ZXJhbDpmdW5jdGlvbiAodmFsdWUpIHsKKwl2YXIgbGl0ZXJhbCA9IHZhbHVlLnZhbHVlOworCWlmICh2YWx1ZVsieG1sOmxhbmciXSkgeworCQlsaXRlcmFsLmxhbmcgPSB2YWx1ZVsieG1sOmxhbmciXTsKKwl9CisJcmV0dXJuIGxpdGVyYWw7Cit9LCB1cmk6ZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIHtpZDp2YWx1ZS52YWx1ZX07Cit9LCBibm9kZTpmdW5jdGlvbiAodmFsdWUpIHsKKwlyZXR1cm4ge2lkOiJfOiIgKyB2YWx1ZS52YWx1ZX07Cit9LCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50IjpmdW5jdGlvbiAodmFsdWUpIHsKKwlyZXR1cm4gcGFyc2VJbnQodmFsdWUudmFsdWUpOworfSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludGVnZXIiOmZ1bmN0aW9uICh2YWx1ZSkgeworCXJldHVybiBwYXJzZUludCh2YWx1ZS52YWx1ZSk7Cit9LCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbG9uZyI6ZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIHBhcnNlSW50KHZhbHVlLnZhbHVlKTsKK30sICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNmbG9hdCI6ZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUudmFsdWUpOworfSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RvdWJsZSI6ZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUudmFsdWUpOworfSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW4iOmZ1bmN0aW9uICh2YWx1ZSkgeworCXJldHVybiAhdmFsdWUgfHwgdmFsdWUgPT0gImZhbHNlIiB8fCB2YWx1ZSA9PSAiMCIgPyBmYWxzZSA6IHRydWU7Cit9fSwgX2RhdGF0eXBlU2VyaWFsaXplcnM6W25ldyBkb2pvLmRhdGEuUmRmRGF0YXR5cGVTZXJpYWxpemVyKE51bWJlciwgTnVtYmVyLnRvU3RyaW5nLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZmxvYXQiKSwgbmV3IGRvam8uZGF0YS5SZGZEYXRhdHlwZVNlcmlhbGl6ZXIoQm9vbGVhbiwgQm9vbGVhbi50b1N0cmluZywgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW4iKV0sIF9maW5kRGF0YXR5cGVTZXJpYWxpemVyOmZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciBsZW5ndGggPSB0aGlzLl9kYXRhdHlwZVNlcmlhbGl6ZXJzLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXZhciBkYXRhdHlwZSA9IHRoaXMuX2RhdGF0eXBlU2VyaWFsaXplcnNbaV07CisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIGRhdGF0eXBlLnR5cGUpIHsKKwkJCXJldHVybiBkYXRhdHlwZTsKKwkJfQorCX0KK30sIF90b1JERlZhbHVlOmZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciByZGZ2YWx1ZSA9IHt9OworCWlmICh2YWx1ZS5pZCkgeworCQlpZiAodmFsdWUuaWQuc2xpY2UoMCwgMikgPT0gIl86IikgeworCQkJcmRmdmFsdWUudHlwZSA9ICJibm9kZSI7CisJCQlyZGZ2YWx1ZS52YWx1ZSA9IHZhbHVlLmlkLnN1YnN0cmluZygyKTsKKwkJfSBlbHNlIHsKKwkJCXJkZnZhbHVlLnR5cGUgPSAidXJpIjsKKwkJCXJkZnZhbHVlLnZhbHVlID0gdmFsdWUuaWQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlyZGZ2YWx1ZS50eXBlID0gImxpdGVyYWwiOworCQkJcmRmdmFsdWUudmFsdWUgPSB2YWx1ZTsKKwkJCWlmICh2YWx1ZS5sYW5nKSB7CisJCQkJcmRmdmFsdWVbInhtbDpsYW5nIl0gPSB2YWx1ZS5sYW5nOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHR5cGVvZiB2YWx1ZSA9PSAibnVtYmVyIikgeworCQkJCXZhbHVlID0gbmV3IE51bWJlcih2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWlmICh0eXBlb2YgdmFsdWUgPT0gImJvb2xlYW4iKSB7CisJCQkJCXZhbHVlID0gbmV3IEJvb2xlYW4odmFsdWUpOworCQkJCX0KKwkJCX0KKwkJCXZhciBkYXRhdHlwZSA9IHRoaXMuX2ZpbmREYXRhdHlwZVNlcmlhbGl6ZXIodmFsdWUpOworCQkJaWYgKGRhdGF0eXBlKSB7CisJCQkJcmRmdmFsdWUgPSB7InR5cGUiOiJ0eXBlZC1saXRlcmFsIiwgImRhdGF0eXBlIjpkYXRhdHlwZS51cmksICJ2YWx1ZSI6dmFsdWUudG9TdHJpbmcoKX07CisJCQl9IGVsc2UgeworCQkJCXJkZnZhbHVlID0geyJ0eXBlIjoibGl0ZXJhbCIsICJ2YWx1ZSI6dmFsdWUudG9TdHJpbmcoKX07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJkZnZhbHVlOworfSwgX3NldHVwU2F2ZVJlcXVlc3Q6ZnVuY3Rpb24gKHNhdmVLZXl3b3JkQXJncywgcmVxdWVzdEt3KSB7CisJdmFyIHJkZlJlc3VsdCA9IHsiaGVhZCI6eyJ2YXJzIjpbInMiLCAicCIsICJvIl19LCAicmVzdWx0cyI6eyJiaW5kaW5ncyI6W119fTsKKwl2YXIgcmVzb3VyY2VzID0gW107CisJZm9yICh2YXIga2V5IGluIHRoaXMuX2RlbGV0ZWQpIHsKKwkJcmVzb3VyY2VzLnB1c2goa2V5KTsKKwl9CisJcmRmUmVzdWx0LnJlc3VsdHMuZGVsZXRlZCA9IHJlc291cmNlczsKKwlmb3IgKGtleSBpbiB0aGlzLl9jaGFuZ2VkKSB7CisJCXZhciBzdWJqZWN0ID0gdGhpcy5fdG9SREZWYWx1ZSh0aGlzLmdldElkZW50aXR5KGtleSkpOworCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMuX2NoYW5nZWRba2V5XTsKKwkJZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7CisJCQl2YXIgcHJlZGljYXRlID0ge3R5cGU6InVyaSIsIHZhbHVlOmF0dHJ9OworCQkJdmFyIHZhbHVlcyA9IGF0dHJpYnV0ZXNbYXR0cl07CisJCQlpZiAoIXZhbHVlcy5sZW5ndGgpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciByZGZ2YWx1ZXMgPSBbXTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIHJkZnZhbHVlID0gdGhpcy5fdG9SREZWYWx1ZSh2YWx1ZXNbaV0pOworCQkJCXJkZlJlc3VsdC5yZXN1bHRzLmJpbmRpbmdzLnB1c2goe3M6c3ViamVjdCwgcDpwcmVkaWNhdGUsIG86cmRmdmFsdWV9KTsKKwkJCX0KKwkJfQorCX0KKwl2YXIgb2xkUmVnaXN0cnkgPSBkb2pvLmpzb24uanNvblJlZ2lzdHJ5OworCWRvam8uanNvbi5qc29uUmVnaXN0cnkgPSB0aGlzLl9qc29uUmVnaXN0cnk7CisJdmFyIGpzb25TdHJpbmcgPSBkb2pvLmpzb24uc2VyaWFsaXplKHJkZlJlc3VsdCk7CisJZG9qby5qc29uLmpzb25SZWdpc3RyeSA9IG9sZFJlZ2lzdHJ5OworCXJlcXVlc3RLdy5wb3N0Q29udGVudCA9IGpzb25TdHJpbmc7Cit9LCBfcmVzdWx0VG9RdWVyeU1ldGFkYXRhOmZ1bmN0aW9uIChqc29uKSB7CisJcmV0dXJuIGpzb24uaGVhZDsKK30sIF9yZXN1bHRUb1F1ZXJ5RGF0YTpmdW5jdGlvbiAoanNvbikgeworCXZhciBpdGVtcyA9IHt9OworCXZhciBzdG10cyA9IGpzb24ucmVzdWx0cy5iaW5kaW5nczsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHN0bXRzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBzdG10ID0gc3RtdHNbaV07CisJCXZhciBzdWJqZWN0ID0gc3RtdC5zLnZhbHVlOworCQlpZiAoc3RtdC5zLnR5cGUgPT0gImJub2RlIikgeworCQkJc3ViamVjdCA9ICJfOiIgKyBzdWJqZWN0OworCQl9CisJCXZhciBhdHRyaWJ1dGVzID0gZGF0YVtzdWJqZWN0XTsKKwkJaWYgKCFhdHRyaWJ1dGVzKSB7CisJCQlhdHRyaWJ1dGVzID0ge307CisJCQlkYXRhW3N0bXQuc10gPSBhdHRyaWJ1dGVzOworCQl9CisJCXZhciBhdHRyID0gYXR0cmlidXRlc1tzdG10LnAudmFsdWVdOworCQlpZiAoIWF0dHIpIHsKKwkJCWF0dHJpYnV0ZXNbc3RtdC5wLnZhbHVlXSA9IFtzdG10Lm9dOworCQl9IGVsc2UgeworCQkJYXR0ci5wdXNoKHN0bXQubyk7CisJCX0KKwl9CisJcmV0dXJuIGl0ZW1zOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuUmhpem9tZVN0b3JlIiwgZG9qby5kYXRhLlJkZlN0b3JlLCB7aW5pdGlhbGl6ZXI6ZnVuY3Rpb24gKGt3QXJncykgeworCXRoaXMuX3NlcnZlclF1ZXJ5VXJsID0ga3dBcmdzLmJhc2VVcmwgKyAic2VhcmNoP3ZpZXc9anNvbiZzZWFyY2hUeXBlPVJ4UGF0aCZzZWFyY2g9IjsKKwl0aGlzLl9zZXJ2ZXJTYXZlVXJsID0ga3dBcmdzLmJhc2VVcmwgKyAic2F2ZS1tZXRhZGF0YSI7Cit9LCBfcmVzdWx0VG9RdWVyeU1ldGFkYXRhOmZ1bmN0aW9uIChqc29uKSB7CisJcmV0dXJuIGpzb247Cit9LCBfcmVzdWx0VG9RdWVyeURhdGE6ZnVuY3Rpb24gKGpzb24pIHsKKwlyZXR1cm4ganNvbjsKK30sIF9zZXR1cFNhdmVSZXF1ZXN0OmZ1bmN0aW9uIChzYXZlS2V5d29yZEFyZ3MsIHJlcXVlc3RLdykgeworCXJlcXVlc3RLdy51cmwgPSB0aGlzLl9zZXJ2ZXJTYXZlVXJsOworCXJlcXVlc3RLdy5tZXRob2QgPSAicG9zdCI7CisJcmVxdWVzdEt3Lm1pbWV0eXBlID0gInRleHQvcGxhaW4iOworCXZhciByZXNvdXJjZXMgPSBbXTsKKwlmb3IgKHZhciBrZXkgaW4gdGhpcy5fZGVsZXRlZCkgeworCQlyZXNvdXJjZXMucHVzaChrZXkpOworCX0KKwl2YXIgY2hhbmdlcyA9IHt9OworCWZvciAoa2V5IGluIHRoaXMuX2NoYW5nZWQpIHsKKwkJaWYgKCF0aGlzLl9hZGRlZFtrZXldKSB7CisJCQlyZXNvdXJjZXMucHVzaChrZXkpOworCQl9CisJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5fY2hhbmdlZFtrZXldOworCQl2YXIgcmRmYXR0cmlidXRlcyA9IHt9OworCQlmb3IgKHZhciBhdHRyIGluIGF0dHJpYnV0ZXMpIHsKKwkJCXZhciB2YWx1ZXMgPSBhdHRyaWJ1dGVzW2F0dHJdOworCQkJaWYgKCF2YWx1ZXMubGVuZ3RoKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl2YXIgcmRmdmFsdWVzID0gW107CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJCXZhciByZGZ2YWx1ZSA9IHRoaXMuX3RvUkRGVmFsdWUodmFsdWVzW2ldKTsKKwkJCQlyZGZ2YWx1ZXMucHVzaChyZGZ2YWx1ZSk7CisJCQl9CisJCQlyZGZhdHRyaWJ1dGVzW2F0dHJdID0gcmRmdmFsdWVzOworCQl9CisJCWNoYW5nZXNba2V5XSA9IHJkZmF0dHJpYnV0ZXM7CisJfQorCXZhciBvbGRSZWdpc3RyeSA9IGRvam8uanNvbi5qc29uUmVnaXN0cnk7CisJZG9qby5qc29uLmpzb25SZWdpc3RyeSA9IHRoaXMuX2pzb25SZWdpc3RyeTsKKwl2YXIganNvblN0cmluZyA9IGRvam8uanNvbi5zZXJpYWxpemUoY2hhbmdlcyk7CisJZG9qby5qc29uLmpzb25SZWdpc3RyeSA9IG9sZFJlZ2lzdHJ5OworCXJlcXVlc3RLdy5jb250ZW50ID0ge3JkZkZvcm1hdDoianNvbiIsIHJlc291cmNlOnJlc291cmNlcywgbWV0YWRhdGE6anNvblN0cmluZ307Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL1JlYWQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9SZWFkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjkwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9SZWFkLmpzCkBAIC0wLDAgKzEsMjI0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5SZWFkIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5SZXN1bHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKKworLyogc3VtbWFyeToKKyAqICAgVGhpcyBpcyBhbiBhYnN0cmFjdCBBUEkgdGhhdCBkYXRhIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBjb25mb3JtIHRvLiAgCisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIG1ldGhvZHMgc2lnbmF0dXJlcyBhbmQgaW50ZW50aW9uYWxseSBsZWF2ZXMgYWxsIHRoZQorICogICBtZXRob2RzIHVuaW1wbGVtZW50ZWQuCisgKi8KK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmRhdGEuUmVhZCIpOworIAorZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuUmVhZCIsIG51bGwsIHsKKwlnZXQ6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKi8gaXRlbSwgLyogYXR0cmlidXRlIHx8IGF0dHJpYnV0ZS1uYW1lLXN0cmluZyAqLyBhdHRyaWJ1dGUsIC8qIHZhbHVlPyAqLyBkZWZhdWx0VmFsdWUpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZS4KKwkJICogICBSZXR1cm5zIGRlZmF1bHRWYWx1ZSBpZiBpdGVtIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgYXR0cmlidXRlLgorCQkgKiAgIFJldHVybnMgbnVsbCBpZiBudWxsIHdhcyBleHBsaWNpdGx5IHNldCBhcyB0aGUgYXR0cmlidXRlIHZhbHVlLgorCQkgKiAgIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKwkJICogICAoU28sIGlmIHN0b3JlLmhhc0F0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpIHJldHVybnMgZmFsc2UsIHRoZW4KKwkJICogICBzdG9yZS5nZXQoaXRlbSwgYXR0cmlidXRlKSB3aWxsIHJldHVybiB1bmRlZmluZWQuKQorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIENvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgKml0ZW0qIGlzIG5vdAorCQkgKiAgIGFuIGl0ZW0sIG9yICphdHRyaWJ1dGUqIGlzIG5laXRoZXIgYW4gYXR0cmlidXRlIG9iamVjdCBvciBhIHN0cmluZy4KKwkJICogZXhhbXBsZXM6CisJCSAqICAgdmFyIGRhcnRoVmFkZXIgPSBzdG9yZS5nZXQobHVrZVNreXdhbGtlciwgImZhdGhlciIpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuZ2V0Jyk7CisJCQl2YXIgYXR0cmlidXRlVmFsdWUgPSBudWxsOworCQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOyAvLyBhIGxpdGVyYWwsIGFuIGl0ZW0sIG51bGwsIG9yIHVuZGVmaW5lZCAobmV2ZXIgYW4gYXJyYXkpCisJCX0sCisJZ2V0VmFsdWVzOgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0sIC8qIGF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGUtbmFtZS1zdHJpbmcgKi8gYXR0cmlidXRlKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgVGhpcyBnZXRWYWx1ZXMoKSBtZXRob2Qgd29ya3MganVzdCBsaWtlIHRoZSBnZXQoKSBtZXRob2QsIGJ1dCBnZXRWYWx1ZXMoKQorCQkgKiAgIGFsd2F5cyByZXR1cm5zIGFuIGFycmF5IHJhdGhlciB0aGFuIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBhcnJheQorCQkgKiAgIG1heSBiZSBlbXB0eSwgbWF5IGNvbnRhaW4gYSBzaW5nbGUgYXR0cmlidXRlIHZhbHVlLCBvciBtYXkgY29udGFpbiBtYW55CisJCSAqICAgYXR0cmlidXRlIHZhbHVlcy4KKwkJICogICBJZiB0aGUgaXRlbSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIHRoZW4gZ2V0VmFsdWVzKCkKKwkJICogICB3aWxsIHJldHVybiBhbiBlbXB0eSBhcnJheTogW10uICAoU28sIGlmIHN0b3JlLmhhc0F0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpCisJCSAqICAgcmV0dXJucyBmYWxzZSwgdGhlbiBzdG9yZS5nZXRWYWx1ZXMoaXRlbSwgYXR0cmlidXRlKSB3aWxsIHJldHVybiBbXS4pCisJCSAqLworCQkgCisJCS8qIGV4Y2VwdGlvbnM6CisJCSAqICAgVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdGVtIGlzIG5vdCBhbiBpdGVtLCBvciBhdHRyaWJ1dGUgaXMgbmVpdGhlciBhbiAKKwkJICogICBhdHRyaWJ1dGUgb2JqZWN0IG9yIGEgc3RyaW5nLgorCQkgKiBleGFtcGxlczoKKwkJICogICB2YXIgZnJpZW5kc09mTHVrZSA9IHN0b3JlLmdldChsdWtlU2t5d2Fsa2VyLCAiZnJpZW5kcyIpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuZ2V0VmFsdWVzJyk7CisJCQl2YXIgYXJyYXkgPSBudWxsOworCQkJcmV0dXJuIGFycmF5OyAvLyBhbiBhcnJheSB0aGF0IG1heSBjb250YWluIGxpdGVyYWxzIGFuZCBpdGVtcworCQl9LAorCWdldEF0dHJpYnV0ZXM6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKi8gaXRlbSkgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGl0ZW0gaGFzLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgaXRlbSBpcyBub3QgYW4gaXRlbS4gCisJCSAqIGV4YW1wbGVzOgorCQkgKiAgIHZhciBhcnJheSA9IHN0b3JlLmdldEF0dHJpYnV0ZXMoa2VybWl0KTsKKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5SZWFkLmdldEF0dHJpYnV0ZXMnKTsKKwkJCXZhciBhcnJheSA9IG51bGw7CisJCQlyZXR1cm4gYXJyYXk7IC8vIGFycmF5CisJCX0sCisJaGFzQXR0cmlidXRlOgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0sIC8qIGF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGUtbmFtZS1zdHJpbmcgKi8gYXR0cmlidXRlKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiAqaXRlbSogaGFzIGEgdmFsdWUgb3IgdGhlIGdpdmVuICphdHRyaWJ1dGUqLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgaXRlbSBpcyBub3QgYW4gaXRlbSwgb3IgYXR0cmlidXRlIGlzIG5laXRoZXIgYW4gCisJCSAqICAgYXR0cmlidXRlIG9iamVjdCBvciBhIHN0cmluZy4KKwkJICogZXhhbXBsZXM6CisJCSAqICAgdmFyIHllcyA9IHN0b3JlLmhhc0F0dHJpYnV0ZShrZXJtaXQsICJjb2xvciIpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuaGFzQXR0cmlidXRlJyk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KKwkJfSwKKwloYXNBdHRyaWJ1dGVWYWx1ZToKKwkJZnVuY3Rpb24oLyogaXRlbSAqLyBpdGVtLCAvKiBhdHRyaWJ1dGUgfHwgYXR0cmlidXRlLW5hbWUtc3RyaW5nICovIGF0dHJpYnV0ZSwgLyogYW55dGhpbmcgKi8gdmFsdWUpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuICp2YWx1ZSogaXMgb25lIG9mIHRoZSB2YWx1ZXMgdGhhdCBnZXRWYWx1ZSgpCisJCSAqICAgd291bGQgcmV0dXJuLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgaXRlbSBpcyBub3QgYW4gaXRlbSwgb3IgYXR0cmlidXRlIGlzIG5laXRoZXIgYW4gCisJCSAqICAgYXR0cmlidXRlIG9iamVjdCBvciBhIHN0cmluZy4KKwkJICogZXhhbXBsZXM6CisJCSAqICAgdmFyIHllcyA9IHN0b3JlLmhhc0F0dHJpYnV0ZVZhbHVlKGtlcm1pdCwgImNvbG9yIiwgImdyZWVuIik7CisJCSAqLworCQkJZG9qby51bmltcGxlbWVudGVkKCdkb2pvLmRhdGEuUmVhZC5oYXNBdHRyaWJ1dGVWYWx1ZScpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJaXNJdGVtOgorCQlmdW5jdGlvbigvKiBhbnl0aGluZyAqLyBzb21ldGhpbmcpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIHRydWUgaWYgKnNvbWV0aGluZyogaXMgYW4gaXRlbS4gIFJldHVybnMgZmFsc2UgaWYgKnNvbWV0aGluZyoKKwkJICogICBpcyBhIGxpdGVyYWwgb3IgaXMgYW55IG9iamVjdCBvdGhlciB0aGFuIGFuIGl0ZW0uCisJCSAqLworCQkgCisJCS8qIGV4YW1wbGVzOgorCQkgKiAgIHZhciB5ZXMgPSBzdG9yZS5pc0l0ZW0oc3RvcmUubmV3SXRlbSgpKTsKKwkJICogICB2YXIgbm8gID0gc3RvcmUuaXNJdGVtKCJncmVlbiIpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuaXNJdGVtJyk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KKwkJfSwKKwlmaW5kOgorCQlmdW5jdGlvbigvKiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgKi8gcXVlcnksIC8qIG9iamVjdCAqLyBvcHRpb25hbEtleXdvcmRBcmdzICkgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIEdpdmVuIGEgcXVlcnksIHRoaXMgbWV0aG9kIHJldHVybnMgYSBSZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcKKwkJICogICBhbGwgdGhlIGl0ZW1zIGluIHRoZSBxdWVyeSByZXN1bHQgc2V0LgorCQkgKiBkZXNjcmlwdGlvbjoKKwkJICogICBBIFJlc3VsdCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgcmV0dXJuZWQsIGV2ZW4gaWYgdGhlIHJlc3VsdCBzZXQKKwkJICogICBpcyBlbXB0eS4gIEEgUmVzdWx0IG9iamVjdCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS4KKwkJICogICBCeSBkZWZhdWx0IHRoZSBSZXN1bHQgb2JqZWN0IHdpbGwgYmUgZnVsbHkgcG9wdWxhdGVkIHdpdGggcmVzdWx0CisJCSAqICAgaXRlbXMgYXMgc29vbiBhcyBpdCBpcyBjcmVhdGVkIChzeW5jaHJvbm91c2x5KS4gIFRoZSBjYWxsZXIgbWF5IHJlcXVlc3QKKwkJICogICBhbiBhc3luY2hyb25vdXMgUmVzdWx0LCBtZWFuaW5nIGEgUmVzdWx0IHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQKKwkJICogICB3aXRoIHJlc3VsdCBpdGVtcyBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuICBJZiB0aGUgY2FsbGVyIHJlcXVlc3RzCisJCSAqICAgYW4gYXN5bmNocm9ub3VzIFJlc3VsdCwgdGhlIGRhdGEgc3RvcmUgbWF5IHJldHVybiBlaXRoZXIgYSBzeW5jaHJvbm91cworCQkgKiAgIG9yIGFzeW5jaHJvbm91cyBSZXN1bHQsIHdoaWNoZXZlciBpdCBwcmVmZXJzLiAgU2ltcGxlIGRhdGEgc3RvcmUKKwkJICogICBpbXBsZW1lbnRhdGlvbnMgbWF5IGFsd2F5cyByZXR1cm4gc3luY2hyb25vdXMgUmVzdWx0cy4KKwkJICogICBGb3IgbW9yZSBpbmZvIGFib3V0IHRoZSBSZXN1bHQgQVBJLCBzZWUgZG9qby5kYXRhLlJlc3VsdAorCQkgKiBxdWVyeToKKwkJICogICBUaGUgcXVlcnkgbWF5IGJlIG9wdGlvbmFsIGluIHNvbWUgZGF0YSBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuCisJCSAqICAgVGhlIGRvam8uZGF0YS5SZWFkIEFQSSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBzeW50YXggb3Igc2VtYW50aWNzCisJCSAqICAgb2YgdGhlIHF1ZXJ5IGl0c2VsZiAtLSBlYWNoIGRpZmZlcmVudCBkYXRhIHN0b3JlIGltcGxlbWVudGF0aW9uCisJCSAqICAgbWF5IGhhdmUgaXRzIG93biBub3Rpb24gb2Ygd2hhdCBhIHF1ZXJ5IHNob3VsZCBsb29rIGxpa2UuCisJCSAqICAgSW4gbW9zdCBpbXBsZW1lbnRhdGlvbnMgdGhlIHF1ZXJ5IHdpbGwgcHJvYmFibHkgYmUgYSBzdHJpbmcsIGJ1dAorCQkgKiAgIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIHRoZSBxdWVyeSBtaWdodCBiZSBhIERhdGUsIG9yIGEgbnVtYmVyLAorCQkgKiAgIG9yIHNvbWUgY29tcGxleCBrZXl3b3JkIHBhcmFtZXRlciBvYmplY3QuICBUaGUgZG9qby5kYXRhLlJlYWQKKwkJICogICBBUEkgaXMgY29tcGxldGVseSBhZ25vc3RpYyBhYm91dCB3aGF0IHRoZSBxdWVyeSBhY3R1YWxseSBpcy4KKwkJICogb3B0aW9uYWxLZXl3b3JkQXJnczoKKwkJICogICBUaGUgb3B0aW9uYWxLZXl3b3JkQXJncyBhcmd1bWVudCBpcyBhIG9iamVjdCBsaWtlIHthc3luYzogdHJ1ZX0uCisJCSAqICAgQWxsIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWNjZXB0IHthc3luYzogdHJ1ZX0gYW5kIHthc3luYzogZmFsc2V9CisJCSAqICAgYXMgdmFsaWQgcGFyYW1ldGVycywgYWx0aG91Z2ggdGhlIEFQSSBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlCisJCSAqICAgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHBlcmZvcm0gYXN5bmNocm9ub3VzbHkgd2hlbgorCQkgKiAgIHthc3luYzogdHJ1ZX0gaXMgc2V0LiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHRha2UgYWRkaXRpb25hbAorCQkgKiAgIGtleXdvcmQgb3B0aW9ucywgc3VjaCBhcyB7YXN5bmM6IHRydWUsIG1heFJlc3VsdHM6MTAwfS4KKwkJICovCisJCQorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHF1ZXJ5IGlzIG5vdCB2YWxpZCwgb3IgaWYgdGhlIHF1ZXJ5CisJCSAqICAgaXMgcmVxdWlyZWQgYnV0IHdhcyBub3Qgc3VwcGxpZWQuCisJCSAqIGV4YW1wbGVzOgorCQkgKiAgIHZhciByZXN1bHRzID0gc3RvcmUuZmluZCgiYWxsIGJvb2tzIik7CisJCSAqICAgdmFyIHJlc3VsdHMgPSBzdG9yZS5maW5kKCk7CisJCSAqICAgdmFyIHJlc3VsdHMgPSBzdG9yZS5maW5kKCJmb28vYmFyIiwge2FzeW5jOiB0cnVlfSk7CisJCSAqICAgdmFyIHJlc3VsdHMgPSBzdG9yZS5maW5kKCJmb28vYmFyIiwge2FzeW5jOiBmYWxzZX0pOworCQkgKiAgIHZhciByZXN1bHRzID0gc3RvcmUuZmluZCh7YXV0aG9yOiJLaW5nIiwge2FzeW5jOiB0cnVlLCBtYXhSZXN1bHRzOjEwMH0pOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuZmluZCcpOworCQkJdmFyIHJlc3VsdCA9IG51bGw7IC8vIG5ldyBkb2pvLmRhdGEuUmVzdWx0KCkuCisJCQlyZXR1cm4gcmVzdWx0OyAvLyBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGRvam8uZGF0YS5SZXN1bHQKKwkJfSwKKwlnZXRJZGVudGl0eToKKwkJZnVuY3Rpb24oLyogaXRlbSAqLyBpdGVtKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmZXIgZm9yIGFuIGl0ZW0uICBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKKwkJICogICBlaXRoZXIgYSBzdHJpbmcgb3Igc29tZXRoaW5nIHRoYXQgaGFzIGEgdG9TdHJpbmcoKSBtZXRob2QgKHN1Y2ggYXMsCisJCSAqICAgZm9yIGV4YW1wbGUsIGEgZG9qby51dWlkLlV1aWQgb2JqZWN0KS4KKwkJICogZGVzY3JpcHRpb246CisJCSAqIElTU1VFIC0gCisJCSAqICAgU2hvdWxkIHdlIG1vdmUgdGhpcyBtZXRob2Qgb3V0IG9mIGRvam8uZGF0YS5SZWFkLCBhbmQgcHV0IGl0IHNvbWV3aGVyZQorCQkgKiAgIGVsc2UsIGxpa2UgbWF5YmUgZG9qby5kYXRhLklkZW50aXR5PworCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIENvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIG1heSB0aHJvdyBhbiBleGNlcHRpb24gb3IgcmV0dXJuIG51bGwgaWYKKwkJICogICBpdGVtIGlzIG5vdCBhbiBpdGVtLgorCQkgKiBleGFtcGxlczoKKwkJICogICB2YXIgaXRlbUlkID0gc3RvcmUuZ2V0SWRlbnRpdHkoa2VybWl0KTsKKwkJICogICBhc3NlcnQoa2VybWl0ID09PSBzdG9yZS5nZXRCeUlkZW50aXR5KHN0b3JlLmdldElkZW50aXR5KGtlcm1pdCkpKTsKKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5SZWFkLmdldElkZW50aXR5Jyk7CisJCQl2YXIgaXRlbUlkZW50aWZ5U3RyaW5nID0gbnVsbDsKKwkJCXJldHVybiBpdGVtSWRlbnRpZnlTdHJpbmc7IC8vIHN0cmluZworCQl9LAorCWdldEJ5SWRlbnRpdHk6CisJCWZ1bmN0aW9uKC8qIHN0cmluZyAqLyBpZCkgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIEdpdmVuIHRoZSBpZCBvZiBhbiBpdGVtLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpdGVtIHRoYXQgaGFzIHRoYXQgaWQuCisJCSAqICAgQ29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGl0ZW0gd2l0aAorCQkgKiAgIHRoZSBnaXZlbiBpZC4KKwkJICogZGVzY3JpcHRpb246CisJCSAqIElTU1VFIC0gCisJCSAqICAgV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBuYW1lIGZyb20gZ2V0QnlJZGVudGl0eSgpIHRvIGZpbmRCeUlkZW50aXR5KCksCisJCSAqICAgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIGltcGxlbWVudGF0aW9uIG1heSBub3QgYmUgYWJsZSB0byBnZXQgdGhlCisJCSAqICAgaXRlbSBmcm9tIGEgbG9jYWwgY2FjaGUsIGFuZCBtYXkgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLgorCQkgKiBJU1NVRSAtIAorCQkgKiAgIENhbiB0aGlzIG1ldGhvZCBydW4gYXN5bmNocm9ub3VzbHk/ICBTaG91bGQgdGhlIHJldHVybiB2YWx1ZSBiZSBhIERlZmVycmVkPworCQkgKiBJU1NVRSAtIAorCQkgKiAgIFNob3VsZCB3ZSBtb3ZlIHRoaXMgbWV0aG9kIG91dCBvZiBkb2pvLmRhdGEuUmVhZCwgYW5kIHB1dCBpdCBzb21ld2hlcmUKKwkJICogICBlbHNlLCBsaWtlIG1heWJlIGRvam8uZGF0YS5JZGVudGl0eT8KKwkJICovCisJCSAKKwkJLyogZXhhbXBsZXM6CisJCSAqICAgdmFyIGFsYXNrYSA9IHN0b3JlLmdldEJ5SWRlbnRpdHkoIkFLIik7CisJCSAqICAgYXNzZXJ0KCJBSyIgPT0gc3RvcmUuZ2V0SWRlbnRpdHkoc3RvcmUuZ2V0QnlJZGVudGl0eSgiQUsiKSkpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlYWQuZ2V0QnlJZGVudGl0eScpOworCQkJdmFyIGl0ZW0gPSBudWxsOworCQkJcmV0dXJuIGl0ZW07IC8vIGl0ZW0KKwkJfQorfSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9SZXN1bHQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9SZXN1bHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNTk4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL1Jlc3VsdC5qcwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEuUmVzdWx0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7CisKKy8qIHN1bW1hcnk6CisgKiAgIFRoaXMgaXMgYW4gYWJzdHJhY3QgQVBJIHVzZWQgYnkgZGF0YSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbnMuICAKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgbWV0aG9kcyBzaWduYXR1cmVzIGFuZCBpbnRlbnRpb25hbGx5IGxlYXZlcyBhbGwgdGhlCisgKiAgIG1ldGhvZHMgdW5pbXBsZW1lbnRlZC4KKyAqLworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5SZXN1bHQiKTsKKworZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuUmVzdWx0IiwgbnVsbCwgeworCWZvckVhY2g6CisJCWZ1bmN0aW9uKC8qIGZ1bmN0aW9uICovIGNhbGxiYWNrRnVuY3Rpb24sIC8qIG9iamVjdD8gKi8gY2FsbGJhY2tPYmplY3QsIC8qIG9iamVjdD8gKi8gb3B0aW9uYWxLZXl3b3JkQXJncykgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIExvb3BzIHRocm91Z2ggdGhlIHJlc3VsdCBsaXN0LCBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24KKwkJICogICBmb3IgZWFjaCBpdGVtIGluIHRoZSByZXN1bHQgbGlzdC4KKwkJICogZGVzY3JpcHRpb246CisJCSAqICAgVGhlIGZvckVhY2goKSBtZXRob2Qgd2lsbCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvbmNlIGZvciAKKwkJICogICBlYWNoIGl0ZW0gaW4gdGhlIHJlc3VsdCBsaXN0LiAgVGhlIGZvckVhY2goKSBtZXRob2Qgd2lsbCBwYXNzIAorCQkgKiAgIDMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFja0Z1bmN0aW9uOiBhbiBpdGVtLCB0aGUgaW5kZXggb2YgCisJCSAqICAgaXRlbSBpbiB0aGUgY29udGV4dCBvZiB0aGlzIGZvckVhY2goKSBsb29wLCBhbmQgdGhlIHJlc3VsdCBvYmplY3QKKwkJICogICBpdHNlbGYuICBUaGUgc2lnbmF0dXJlIG9mIHRoaXMgZm9yRWFjaCgpIG1ldGhvZCB3YXMgbW9kZWxlZCBvbgorCQkgKiAgIHRoZSBmb3JFYWNoKCkgbWV0aG9kIG9mIE1vemlsbGEncyBBcnJheSBvYmplY3QgaW4gSmF2YVNjcmlwdCAxLjY6CisJCSAqICAgaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOk9iamVjdHM6QXJyYXk6Zm9yRWFjaAorCQkgKiAgIFRoZSBmb3JFYWNoKCkgbWV0aG9kIHdpbGwgcmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgcmVzdWx0IGxpc3QgCisJCSAqICAgaGFzIGJlZW4gbG9vcGVkIHRocm91Z2gsIG9yIGZhbHNlIGlmIHRoZSByZXN1bHQgbGlzdCBoYXMgbm90IHlldAorCQkgKiAgIGJlZW4gbG9vcGVkIHRocm91Z2guCisJCSAqICAgVGhlIGZvckVhY2goKSBtZXRob2Qgd2lsbCBpZ25vcmUgYW55IHJldHVybiB2YWx1ZSByZXR1cm5lZCBieQorCQkgKiAgIHRoZSBjYWxsYmFja0Z1bmN0aW9uLgorCQkgKiAgIEFmdGVyIHRoZSBmb3JFYWNoKCkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZCAob3IgYmVlbiBjYW5jZWxsZWQpCisJCSAqICAgcmVzdWx0LmZvckVhY2goKSBjYW4gYmUgY2FsbGVkIGFnYWluIG9uIHRoZSBzYW1lIHJlc3VsdCBvYmplY3QuCisJCSAqIElTU1VFUyAtCisJCSAqICAgV2UgaGF2ZW4ndCB5ZXQgZGVjaWRlZCB3aGF0IG90aGVyIHBhcmFtZXRlcnMgd2UgbWlnaHQgYWxsb3cgdG8KKwkJICogICBzdXBwb3J0IGZhbmN5IGZlYXR1cmVzLiAgSGVyZSBhcmUgc29tZSBpZGVhczoKKwkJICogICAgIHJlc3VsdHMuZm9yRWFjaCh7Y2FsbGJhY2s6Y2FsbGJhY2tGdW5jdGlvbiwgb25Db21wbGV0aW9uOiBmaW5pc2hlZEZ1bmN0aW9ufSk7CisJCSAqICAgICByZXN1bHRzLmZvckVhY2goe2NhbGxiYWNrOmNhbGxiYWNrRnVuY3Rpb24sIGZpcnN0OiAyMDEsIGxhc3Q6IDMwMH0pOyAvLyBwYXJ0aWFsIGxvb3AKKwkJICogICAgIHJlc3VsdHMuZm9yRWFjaCh7Y2FsbGJhY2s6Y2FsbGJhY2tGdW5jdGlvbiwgZmlyc3Q6IDIwMCwgbnVtSXRlbXM6IDUwfSk7IC8vIHBhcnRpYWwgbG9vcCBmcm9tIDIwMCB0byAyNTAKKwkJICogICBDQ00gLSBIb3cgdG8gc3BlY2lmeSBkYXRhc3RvcmUtc3BlY2lmaWMgb3B0aW9ucyB0byBhbGxvdyBjYWNoaW5nIG4KKwkJICogICBpdGVtcyBiZWZvcmUvYWZ0ZXIgY3VycmVudCB3aW5kb3cgb2YgaXRlbXMgYmVpbmcgdmlld2VkPworCQkgKiBjYWxsYmFja09iamVjdDoKKwkJICogICBJZiBhIGNhbGxiYWNrT2JqZWN0IGlzIHByb3ZpZGVkIHRoZSBjYWxsYmFja0Z1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisJCSAqICAgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGNhbGxiYWNrT2JqZWN0ICh0aGUgY2FsbGJhY2tPYmplY3Qgd2lsbCBiZSAKKwkJICogICB1c2VkIGFzIHRoZSAndGhpcycgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgY2FsbGJhY2tGdW5jdGlvbikuCisJCSAqICAgSWYgY2FsbGJhY2tPYmplY3QgaXMgbm90IHByb3ZpZGVkLCBvciBpcyBudWxsLCB0aGUgZ2xvYmFsIG9iamVjdAorCQkgKiAgIGFzc29jaWF0ZWQgd2l0aCBjYWxsYmFjayBpcyB1c2VkIGluc3RlYWQuCisJCSAqIG9wdGlvbmFsS2V5d29yZEFyZ3M6CisJCSAqICAgVGhlIGZvckVhY2goKSBtZXRob2QgbWF5IGFjY2VwdCBhIHRoaXJkIHBhcmFtZXRlciwgd2hpY2ggc2hvdWxkIGJlCisJCSAqICAgYW4gb2JqZWN0IHdpdGgga2V5d29yZCBwYXJhbWV0ZXJzLiAgRGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBtYXkKKwkJICogICBtYWtlIHVzZSBvZiBkaWZmZXJlbnQga2V5d29yZCBwYXJhbXRlcnMuICBDb25mb3JtaW5nIAorCQkgKiAgIGltcGxlbWVudGF0aW9ucyBpZ25vcmUga2V5d29yZCBwYXJhbWV0ZXJzIHRoYXQgdGhleSBkb24ndCAKKwkJICogICByZWNvZ25pemUuCisJCSAqLworCQkgCisJCS8qIGV4YW1wbGVzOgorCQkgKiAgIHZhciByZXN1bHRzID0gc3RvcmUuZmluZCgicmVjZW50IGJvb2tzIik7ICAgICAgICAgICAgLy8gc3luY2hyb25vdXMKKwkJICogICB2YXIgcmVzdWx0cyA9IHN0b3JlLmZpbmQoImFsbCBib29rcyIsIHtzeW5jOiBmYWxzZX0pOyAvLyBhc3luY2hyb25vdXMKKwkJICogICBzb21lQ2FsbGJhY2tGdW5jdGlvbiA9IGZ1bmN0aW9uKGl0ZW0sIHJlc3VsdE9iamVjdCkge307CisJCSAqICAgcmVzdWx0cy5mb3JFYWNoKHNvbWVDYWxsYmFja0Z1bmN0aW9uKTsKKwkJICogICByZXN1bHRzLmZvckVhY2goe29iamVjdDpzb21lSGFuZGxlck9iamVjdCwgY2FsbGJhY2s6InNvbWVDYWxsYmFja01ldGhvZCJ9KTsKKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5SZXN1bHQuZm9yRWFjaCcpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJZ2V0TGVuZ3RoOgorCQlmdW5jdGlvbigpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIGFuIGludGVnZXIgLS0gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcmVzdWx0IGxpc3QuCisJCSAqICAgUmV0dXJucyAtMSBpZiB0aGUgbGVuZ3RoIGlzIG5vdCBrbm93biB3aGVuIHRoZSBtZXRob2QgaXMgY2FsbGVkLgorCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlc3VsdC5nZXRMZW5ndGgnKTsKKwkJCXJldHVybiAtMTsgLy8gaW50ZWdlcgorCQl9LAorCWluUHJvZ3Jlc3M6CisJCWZ1bmN0aW9uKCkgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIFJldHVybnMgdHJ1ZSBpZiBhIGZvckVhY2goKSBsb29wIGlzIGluIHByb2dyZXNzLgorCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlc3VsdC5pblByb2dyZXNzJyk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KKwkJfSwKKwljYW5jZWw6CisJCWZ1bmN0aW9uKCkgeworCQkvKiBzdW1tYXJ5OgorCQkgKiAgIENhbGxpbmcgY2FuY2VsKCkgc3RvcHMgYW55IGFuZCBhbGwgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggdGhpcworCQkgKiAgIHJlc3VsdCBvYmplY3QuICAKKwkJICogZGVzY3JpcHRpb246IAorCQkgKiAgIElmIGEgZm9yRWFjaCgpIGxvb3AgaXMgaW4gcHJvZ3Jlc3MsIGNhbGxpbmcgY2FuY2VsKCkgd2lsbCBzdG9wIAorCQkgKiAgIHRoZSBsb29wLiAgSWYgYSBzdG9yZS5maW5kKCkgaXMgaW4gcHJvZ3Jlc3MsIGFuZCB0aGF0IGZpbmQoKSAKKwkJICogICBpbnZvbHZlcyBhbiBYTUxIdHRwUmVxdWVzdCwgY2FsbGluZyBjYW5jZWwoKSB3aWxsIGFib3J0IHRoZSAKKwkJICogICBYTUxIdHRwUmVxdWVzdC4gIElmIGNhbGxiYWNrcyBoYXZlIGJlZW4gc2V0IHVzaW5nIHNldE9uRmluZENvbXBsZXRlZCgpIAorCQkgKiAgIG9yIHNldE9uRXJyb3IoKSwgY2FsbGluZyBjYW5jZWwoKSB3aWxsIGNhdXNlIHRob3NlIGNhbGxiYWNrcyB0byAKKwkJICogICBub3QgYmUgY2FsbGVkIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLgorCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLlJlc3VsdC5jYW5jZWwnKTsKKwkJfSwKKwlzZXRPbkZpbmRDb21wbGV0ZWQ6CisJCWZ1bmN0aW9uKC8qIGZ1bmN0aW9uICovIGNhbGxiYWNrRnVuY3Rpb24sIC8qIG9iamVjdD8gKi8gY2FsbGJhY2tPYmplY3QpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBBbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2tGdW5jdGlvbiB0aGF0IHdpbGwKKwkJICogICBiZSBjYWxsZWQgd2hlbiBhbGwgdGhlIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KKwkJICogZGVzY3JpcHRpb246CisJCSAqICAgSWYgYSBjYWxsYmFja09iamVjdCBpcyBwcm92aWRlZCB0aGUgY2FsbGJhY2tGdW5jdGlvbiB3aWxsIGJlIAorCQkgKiAgIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2FsbGJhY2tPYmplY3QgKHRoZSBjYWxsYmFja09iamVjdAorCQkgKiAgIHdpbGwgYmUgdXNlZCBhcyB0aGUgJ3RoaXMnIGZvciBlYWNoIGludm9jYXRpb24gb2YgdGhlCisJCSAqICAgY2FsbGJhY2tGdW5jdGlvbikuICBJZiBjYWxsYmFja09iamVjdCBpcyBub3QgcHJvdmlkZWQsIG9yIGlzIAorCQkgKiAgIG51bGwsIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBjYWxsYmFjayBpcyB1c2VkIGluc3RlYWQuCisJCSAqICAgVGhlIHNldE9uRmluZENvbXBsZXRlZCgpIG1ldGhvZCB3aWxsIGlnbm9yZSBhbnkgcmV0dXJuIHZhbHVlIAorCQkgKiAgIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja0Z1bmN0aW9uLgorCQkgKiBJU1NVRVMgLQorCQkgKiAgIFdlIGhhdmUgbm90IHlldCBkZWNpZGVkIHdoYXQgcGFyYW1ldGVycyB0aGUgc2V0T25GaW5kQ29tcGxldGVkKCkgCisJCSAqICAgd2lsbCBwYXNzIHRvIHRoZSBjYWxsYmFja0Z1bmN0aW9uLi4uCisJCSAqICAgKEEpIFRoZSBzZXRPbkZpbmRDb21wbGV0ZWQoKSBtZXRob2Qgd2lsbCBwYXNzIG9uZSBwYXJhbWV0ZXIgdG8gdGhlIAorCQkgKiAgIGNhbGxiYWNrRnVuY3Rpb246IHRoZSByZXN1bHQgb2JqZWN0IGl0c2VsZi4KKwkJICogICAoQikgVGhlIHNldE9uRmluZENvbXBsZXRlZCgpIG1ldGhvZCB3aWxsIHBhc3MgdHdvIHBhcmFtZXRlcnMgdG8gdGhlIAorCQkgKiAgIGNhbGxiYWNrRnVuY3Rpb246IGFuIGl0ZXJhdG9yIG9iamVjdCwgYW5kIHRoZSByZXN1bHQgb2JqZWN0IGl0c2VsZi4KKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5SZXN1bHQuc2V0T25GaW5kQ29tcGxldGVkJyk7CisJCX0sCisJc2V0T25FcnJvcjoKKwkJZnVuY3Rpb24oLyogZnVuY3Rpb24gKi8gZXJyb3JDYWxsYmFja0Z1bmN0aW9uLCAvKiBvYmplY3Q/ICovIGNhbGxiYWNrT2JqZWN0KSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgQWxsb3dzIHlvdSB0byByZWdpc3RlciBhIGVycm9yQ2FsbGJhY2tGdW5jdGlvbiB0aGF0CisJCSAqICAgd2lsbCBiZSBjYWxsZWQgaWYgdGhlcmUgaXMgYW55IHNvcnQgb2YgZXJyb3IuCisJCSAqIGRlc2NyaXB0aW9uOgorCQkgKiAgIElmIGEgY2FsbGJhY2tPYmplY3QgaXMgcHJvdmlkZWQgdGhlIGVycm9yQ2FsbGJhY2tGdW5jdGlvbiB3aWxsCisJCSAqICAgYmUgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsYmFja09iamVjdCAodGhlIGNhbGxiYWNrT2JqZWN0CisJCSAqICAgd2lsbCBiZSB1c2VkIGFzIHRoZSAndGhpcycgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUKKwkJICogICBlcnJvckNhbGxiYWNrRnVuY3Rpb24pLiAgSWYgY2FsbGJhY2tPYmplY3QgaXMgbm90IHByb3ZpZGVkLCBvciBpcyAKKwkJICogICBudWxsLCB0aGUgZ2xvYmFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggY2FsbGJhY2sgaXMgdXNlZCBpbnN0ZWFkLgorCQkgKiAgIFRoZSBzZXRPbkVycm9yKCkgbWV0aG9kIHdpbGwgcGFzcyB0d28gcGFyYW1ldGVycyB0byB0aGUgCisJCSAqICAgZXJyb3JDYWxsYmFja0Z1bmN0aW9uOiBhbiBFcnJvciBvYmplY3QsIGFuZCB0aGUgcmVzdWx0IG9iamVjdCAKKwkJICogICBpdHNlbGY6CisJCSAqICAgICBlcnJvckNhbGxiYWNrRnVuY3Rpb24oZXJyb3JPYmplY3QsIHJlc3VsdE9iamVjdCk7IAorCQkgKiAgIFRoZSBzZXRPbkVycm9yKCkgbWV0aG9kIHdpbGwgaWdub3JlIGFueSByZXR1cm4gdmFsdWUgcmV0dXJuZWQgCisJCSAqICAgYnkgdGhlIGVycm9yQ2FsbGJhY2tGdW5jdGlvbi4KKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5SZXN1bHQuc2V0T25FcnJvcicpOworCQl9LAorCWdldFN0b3JlOgorCQlmdW5jdGlvbigpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIHRoZSBkYXRhc3RvcmUgb2JqZWN0IHRoYXQgY3JlYXRlZCB0aGlzIHJlc3VsdCBsaXN0CisJCSAqLworCQkJZG9qby51bmltcGxlbWVudGVkKCdkb2pvLmRhdGEuUmVzdWx0LmdldFN0b3JlJyk7CisJCQlyZXR1cm4gbnVsbDsgLy8gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBkb2pvLmRhdGEuUmVhZAorCQl9Cit9KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL1dyaXRlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvV3JpdGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNWJiNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL1dyaXRlLmpzCkBAIC0wLDAgKzEsMTY5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5Xcml0ZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZGVjbGFyZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuUmVhZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworCisvKiBzdW1tYXJ5OgorICogICBUaGlzIGlzIGFuIGFic3RyYWN0IEFQSSB0aGF0IGRhdGEgcHJvdmlkZXIgaW1wbGVtZW50YXRpb25zIGNvbmZvcm0gdG8uICAKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgbWV0aG9kcyBzaWduYXR1cmVzIGFuZCBpbnRlbnRpb25hbGx5IGxlYXZlcyBhbGwgdGhlCisgKiAgIG1ldGhvZHMgdW5pbXBsZW1lbnRlZC4KKyAqLworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5Xcml0ZSIpOworIAorZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuV3JpdGUiLCBkb2pvLmRhdGEuUmVhZCwgeworCW5ld0l0ZW06CisJCWZ1bmN0aW9uKC8qIG9iamVjdD8gKi8ga2V5d29yZEFyZ3MpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBpdGVtLiAgU2V0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3CisJCSAqICAgaXRlbSBiYXNlZCBvbiB0aGUga2V5d29yZEFyZ3MgcHJvdmlkZWQuCisJCSAqLworCQkgCisJCS8qIGV4Y2VwdGlvbnM6CisJCSAqICAgVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiAqa2V5d29yZEFyZ3MqIGlzIGEgc3RyaW5nIG9yIGEgbnVtYmVyIG9yCisJCSAqICAgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNpbXBsZSBhbm9ueW1vdXMgb2JqZWN0LgorCQkgKiBleGFtcGxlczoKKwkJICogICB2YXIga2VybWl0ID0gc3RvcmUubmV3SXRlbSh7bmFtZTogIktlcm1pdCJ9KTsKKwkJICovCisJCQl2YXIgbmV3SXRlbTsKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLldyaXRlLm5ld0l0ZW0nKTsKKwkJCXJldHVybiBuZXdJdGVtOyAvLyBpdGVtCisJCX0sCisJZGVsZXRlSXRlbToKKwkJZnVuY3Rpb24oLyogaXRlbSAqLyBpdGVtKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgRGVsZXRlcyBhbiBpdGVtIGZyb20gdGhlIHN0b3JlLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgKml0ZW0qIGlzIG5vdCBhbiBpdGVtIChpZiBzdG9yZS5pc0l0ZW0oaXRlbSkKKwkJICogICByZXR1cm5zIGZhbHNlKS4KKwkJICogZXhhbXBsZXM6CisJCSAqICAgdmFyIHN1Y2Nlc3MgPSBzdG9yZS5kZWxldGVJdGVtKGtlcm1pdCk7CisJCSAqLworCQkJZG9qby51bmltcGxlbWVudGVkKCdkb2pvLmRhdGEuV3JpdGUuZGVsZXRlSXRlbScpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJc2V0OgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0sIC8qIGF0dHJpYnV0ZSB8fCBzdHJpbmcgKi8gYXR0cmlidXRlLCAvKiBhbG1vc3QgYW55dGhpbmcgKi8gdmFsdWUpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gYW4gaXRlbS4KKwkJICogICBSZXBsYWNlcyBhbnkgcHJldmlvdXMgdmFsdWUgb3IgdmFsdWVzLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgKml0ZW0qIGlzIG5vdCBhbiBpdGVtLCBvciBpZiAqYXR0cmlidXRlKgorCQkgKiAgIGlzIG5laXRoZXIgYW4gYXR0cmlidXRlIG9iamVjdCBvciBhIHN0cmluZy4KKwkJICogICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmICp2YWx1ZSogaXMgdW5kZWZpbmVkLgorCQkgKiBleGFtcGxlczoKKwkJICogICB2YXIgc3VjY2VzcyA9IHN0b3JlLnNldChrZXJtaXQsICJjb2xvciIsICJncmVlbiIpOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLldyaXRlLnNldCcpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJc2V0VmFsdWVzOgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0sIC8qIGF0dHJpYnV0ZSB8fCBzdHJpbmcgKi8gYXR0cmlidXRlLCAvKiBhcnJheSAqLyB2YWx1ZXMpIHsKKwkJLyogc3VtbWFyeToKKwkJICogICBBZGRzIGVhY2ggdmFsdWUgaW4gdGhlICp2YWx1ZXMqIGFycmF5IGFzIGEgdmFsdWUgb2YgdGhlIGdpdmVuCisJCSAqICAgYXR0cmlidXRlIG9uIHRoZSBnaXZlbiBpdGVtLgorCQkgKiAgIFJlcGxhY2VzIGFueSBwcmV2aW91cyB2YWx1ZSBvciB2YWx1ZXMuCisJCSAqICAgQ2FsbGluZyBzdG9yZS5zZXRWYWx1ZXMoeCwgeSwgW10pICh3aXRoICp2YWx1ZXMqIGFzIGFuIGVtcHR5IGFycmF5KSBoYXMKKwkJICogICB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZyBzdG9yZS5jbGVhcih4LCB5KS4KKwkJICovCisJCSAKKwkJLyogZXhjZXB0aW9uczoKKwkJICogICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmICp2YWx1ZXMqIGlzIG5vdCBhbiBhcnJheSwgaWYgKml0ZW0qIGlzIG5vdCBhbgorCQkgKiAgIGl0ZW0sIG9yIGlmICphdHRyaWJ1dGUqIGlzIG5laXRoZXIgYW4gYXR0cmlidXRlIG9iamVjdCBvciBhIHN0cmluZy4KKwkJICogZXhhbXBsZXM6CisJCSAqICAgdmFyIHN1Y2Nlc3MgPSBzdG9yZS5zZXRWYWx1ZXMoa2VybWl0LCAiY29sb3IiLCBbImdyZWVuIiwgImFxdWEiXSk7CisJCSAqICAgc3VjY2VzcyA9IHN0b3JlLnNldFZhbHVlcyhrZXJtaXQsICJjb2xvciIsIFtdKTsKKwkJICogICBpZiAoc3VjY2Vzcykge2Fzc2VydCghc3RvcmUuaGFzQXR0cmlidXRlKGtlcm1pdCwgImNvbG9yIikpO30KKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5Xcml0ZS5zZXRWYWx1ZXMnKTsKKwkJCXJldHVybiBmYWxzZTsgLy8gYm9vbGVhbgorCQl9LAorCWNsZWFyOgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0sIC8qIGF0dHJpYnV0ZSB8fCBzdHJpbmcgKi8gYXR0cmlidXRlKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgRGVsZXRlcyBhbGwgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUgb24gYW4gaXRlbS4KKwkJICovCisJCSAKKwkJLyogZXhjZXB0aW9uczoKKwkJICogICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmICppdGVtKiBpcyBub3QgYW4gaXRlbSwgb3IgaWYgKmF0dHJpYnV0ZSoKKwkJICogICBpcyBuZWl0aGVyIGFuIGF0dHJpYnV0ZSBvYmplY3Qgb3IgYSBzdHJpbmcuCisJCSAqIGV4YW1wbGVzOgorCQkgKiAgIHZhciBzdWNjZXNzID0gc3RvcmUuY2xlYXIoa2VybWl0LCAiY29sb3IiKTsKKwkJICogICBpZiAoc3VjY2Vzcykge2Fzc2VydCghc3RvcmUuaGFzQXR0cmlidXRlKGtlcm1pdCwgImNvbG9yIikpO30KKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5Xcml0ZS5jbGVhcicpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJc2F2ZToKKwkJZnVuY3Rpb24oKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgU2F2ZXMgdG8gdGhlIHNlcnZlciBhbGwgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBsb2NhbGx5LgorCQkgKiAgIFRoZSBzYXZlIG9wZXJhdGlvbiBtYXkgdGFrZSBzb21lIHRpbWUuICBCeSBkZWZhdWx0IHRoZSBzYXZlIHdpbGwKKwkJICogICBiZSBkb25lIHN5bmNocm9ub3VzbHksIGJlZm9yZSB0aGUgY2FsbCByZXR1cm5zLiAgVGhlIGNhbGxlciBtYXkKKwkJICogICBiZSByZXF1ZXN0IGFuIGFzeW5jaHJvbm91cyBzYXZlIGJ5IHBhc3Npbmcge2FzeW5jOiB0cnVlfS4KKwkJICogICBJZiB0aGUgY2FsbGVyIHJlcXVlc3RzIGFuIGFzeW5jaHJvbm91cyBzYXZlLCB0aGUgZGF0YSBzdG9yZSBtYXkgZG8KKwkJICogICBlaXRoZXIgYSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgc2F2ZSwgd2hpY2hldmVyIGl0IHByZWZlcnMuCisJCSAqICAgRGlmZmVyZW50IGRhdGEgc3RvcmUgaW1wbGVtZW50YXRpb25zIG1heSB0YWtlIGFkZGl0aW9uYWwgb3B0aW9uYWwKKwkJICogICBwYXJhbWV0ZXJzLgorCQkgKiBkZXNjcmlwdGlvbjoKKwkJICogSVNTVUUgLSAKKwkJICogICBTaG91bGQgdGhlIGFzeW5jIHNhdmUgdGFrZSBhIGNhbGxiYWNrLCBsaWtlIHRoaXM6CisJCSAqICAgICBzdG9yZS5zYXZlKHthc3luYzogdHJ1ZSwgb25Db21wbGV0ZTogY2FsbGJhY2t9KTsKKwkJICogICBPciBzaG91bGQgdGhlIGFzeW5jIHNhdmUgcmV0dXJuIGEgRGVmZXJyZWQsIGxpa2UgdGhpczoKKwkJICogICAgIHZhciBkZWZlcnJlZCA9IHN0b3JlLnNhdmUoe2FzeW5jOiB0cnVlfSk7CisJCSAqICAgICBkZWZlcnJlZC5hZGRDYWxsYmFja3Moc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTsKKwkJICogICBPciBzaG91bGQgc2F2ZSgpIHJldHVybiBib29sZWFuLCBsaWtlIHRoaXM6CisJCSAqICAgICB2YXIgc3VjY2VzcyA9IHN0b3JlLnNhdmUoKTsKKwkJICovCisJCSAKKwkJLyogZXhhbXBsZXM6CisJCSAqICAgdmFyIHN1Y2Nlc3MgPSBzdG9yZS5zYXZlKCk7CisJCSAqICAgdmFyIHN1Y2Nlc3MgPSBzdG9yZS5zYXZlKHthc3luYzogdHJ1ZX0pOworCQkgKi8KKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLldyaXRlLnNhdmUnKTsKKwkJCXJldHVybiBmYWxzZTsgLy8gYm9vbGVhbgorCQl9LAorCXJldmVydDoKKwkJZnVuY3Rpb24oKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgRGlzY2FyZHMgYW55IHVuc2F2ZWQgY2hhbmdlcy4KKwkJICovCisJCSAKKwkJLyogZXhhbXBsZXM6CisJCSAqICAgdmFyIHN1Y2Nlc3MgPSBzdG9yZS5yZXZlcnQoKTsKKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5Xcml0ZS5yZXZlcnQnKTsKKwkJCXJldHVybiBmYWxzZTsgLy8gYm9vbGVhbgorCQl9LAorCWlzRGlydHk6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKG9yIHN0b3JlKSAqLyBpdGVtKSB7CisJCS8qIHN1bW1hcnk6CisJCSAqICAgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBpdGVtIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHNhdmUoKS4KKwkJICogICBJZiB0aGUgZGF0YXN0b3JlIG9iamVjdCBpdHNlbGYgaXMgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBhbgorCQkgKiAgIGl0ZW0sIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGFueSBpdGVtIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlCisJCSAqICAgdGhlIGxhc3Qgc2F2ZSgpLgorCQkgKi8KKwkJIAorCQkvKiBleGNlcHRpb25zOgorCQkgKiAgIFRocm93cyBhbiBleGNlcHRpb24gaWYgKml0ZW0qIGlzIG5laXRoZXIgYW4gaXRlbSBub3IgdGhlIGRhdGFzdG9yZSBpdHNlbGYuCisJCSAqIGV4YW1wbGVzOgorCQkgKiAgIHZhciB0cnVlT3JGYWxzZSA9IHN0b3JlLmlzRGlydHkoa2VybWl0KTsgLy8gdHJ1ZSBpZiBrZXJtaXQgaXMgZGlydHkKKwkJICogICB2YXIgdHJ1ZU9yRmFsc2UgPSBzdG9yZS5pc0RpcnR5KHN0b3JlKTsgIC8vIHRydWUgaWYgYW55IGl0ZW0gaXMgZGlydHkKKwkJICovCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoJ2Rvam8uZGF0YS5Xcml0ZS5pc0RpcnR5Jyk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KKwkJfQorfSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9ZYWhvb1N0b3JlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvWWFob29TdG9yZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYxM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvWWFob29TdG9yZS5qcwpAQCAtMCwwICsxLDQ0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEuWWFob29TdG9yZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuY29yZS5SZW1vdGVTdG9yZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZGVjbGFyZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLlNjcmlwdFNyY0lPIik7Citkb2pvLmRlY2xhcmUoImRvam8uZGF0YS5ZYWhvb1N0b3JlIiwgZG9qby5kYXRhLmNvcmUuUmVtb3RlU3RvcmUsIHtfc2V0dXBRdWVyeVJlcXVlc3Q6ZnVuY3Rpb24gKHJlc3VsdCwgcmVxdWVzdEt3KSB7CisJdmFyIHN0YXJ0ID0gMTsKKwl2YXIgY291bnQgPSAxOworCWlmIChyZXN1bHQpIHsKKwkJc3RhcnQgPSByZXN1bHQuc3RhcnQgfHwgc3RhcnQ7CisJCWNvdW50ID0gcmVzdWx0LmNvdW50IHx8IGNvdW50OworCX0KKwl2YXIgc291cmNlVXJsID0gImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9XZWJTZWFyY2hTZXJ2aWNlL1YxL3dlYlNlYXJjaD9hcHBpZD1kb2pvJmxhbmd1YWdlPWVuJnF1ZXJ5PSIgKyByZXN1bHQucXVlcnkgKyAiJnN0YXJ0PSIgKyBzdGFydCArICImcmVzdWx0cz0iICsgY291bnQgKyAiJm91dHB1dD1qc29uIjsKKwlyZXF1ZXN0S3cudXJsID0gc291cmNlVXJsOworCXJlcXVlc3RLdy50cmFuc3BvcnQgPSAiU2NyaXB0U3JjVHJhbnNwb3J0IjsKKwlyZXF1ZXN0S3cubWltZXR5cGUgPSAidGV4dC9qc29uIjsKKwlyZXF1ZXN0S3cuanNvblBhcmFtTmFtZSA9ICJjYWxsYmFjayI7Cit9LCBfcmVzdWx0VG9RdWVyeU1ldGFkYXRhOmZ1bmN0aW9uIChqc29uKSB7CisJcmV0dXJuIGpzb24uUmVzdWx0U2V0OworfSwgX3Jlc3VsdFRvUXVlcnlEYXRhOmZ1bmN0aW9uIChqc29uKSB7CisJdmFyIGRhdGEgPSB7fTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGpzb24uUmVzdWx0U2V0LnRvdGFsUmVzdWx0c1JldHVybmVkOyArK2kpIHsKKwkJdmFyIHJlY29yZCA9IGpzb24uUmVzdWx0U2V0LlJlc3VsdFtpXTsKKwkJdmFyIGl0ZW0gPSB7fTsKKwkJaXRlbVsiVXJsIl0gPSBbcmVjb3JkLlVybF07CisJCWl0ZW1bIlRpdGxlIl0gPSBbcmVjb3JkLlRpdGxlXTsKKwkJaXRlbVsiU3VtbWFyeSJdID0gW3JlY29yZC5TdW1tYXJ5XTsKKwkJdmFyIGFycmF5SW5kZXggPSAoanNvbi5SZXN1bHRTZXQuZmlyc3RSZXN1bHRQb3NpdGlvbiAtIDEpICsgaTsKKwkJZGF0YVthcnJheUluZGV4LnRvU3RyaW5nKCldID0gaXRlbTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNmFkMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8uaG9zdGVudi5jb25kaXRpb25hbExvYWRNb2R1bGUoeworCWNvbW1vbjogWyJkb2pvLmRhdGEiXQorfSk7Citkb2pvLmhvc3RlbnYubW9kdWxlTG9hZGVkKCJkb2pvLmRhdGEuKiIpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZWFkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZWFkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2VmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jb3JlL1JlYWQuanMKQEAgLTAsMCArMSw1NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLmNvcmUuUmVhZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuY29yZS5SZXN1bHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmRlY2xhcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmRhdGEuY29yZS5SZWFkIik7Citkb2pvLmRlY2xhcmUoImRvam8uZGF0YS5jb3JlLlJlYWQiLCBudWxsLCB7Z2V0OmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIGRlZmF1bHRWYWx1ZSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5nZXQiKTsKKwl2YXIgYXR0cmlidXRlVmFsdWUgPSBudWxsOworCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKK30sIGdldFZhbHVlczpmdW5jdGlvbiAoaXRlbSwgYXR0cmlidXRlKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5SZWFkLmdldFZhbHVlcyIpOworCXZhciBhcnJheSA9IG51bGw7CisJcmV0dXJuIGFycmF5OworfSwgZ2V0QXR0cmlidXRlczpmdW5jdGlvbiAoaXRlbSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5nZXRBdHRyaWJ1dGVzIik7CisJdmFyIGFycmF5ID0gbnVsbDsKKwlyZXR1cm4gYXJyYXk7Cit9LCBoYXNBdHRyaWJ1dGU6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5oYXNBdHRyaWJ1dGUiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBjb250YWluc1ZhbHVlOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5SZWFkLmNvbnRhaW5zVmFsdWUiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBpc0l0ZW06ZnVuY3Rpb24gKHNvbWV0aGluZykgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5pc0l0ZW0iKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBpc0l0ZW1BdmFpbGFibGU6ZnVuY3Rpb24gKHNvbWV0aGluZykgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5pc0l0ZW1BdmFpbGFibGUiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBmaW5kOmZ1bmN0aW9uIChrZXl3b3JkQXJncykgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5maW5kIik7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJcmV0dXJuIHJlc3VsdDsKK30sIGdldElkZW50aXR5OmZ1bmN0aW9uIChpdGVtKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5SZWFkLmdldElkZW50aXR5Iik7CisJdmFyIGl0ZW1JZGVudGlmeVN0cmluZyA9IG51bGw7CisJcmV0dXJuIGl0ZW1JZGVudGlmeVN0cmluZzsKK30sIGZpbmRCeUlkZW50aXR5OmZ1bmN0aW9uIChpZGVudGl0eSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuUmVhZC5nZXRCeUlkZW50aXR5Iik7CisJdmFyIGl0ZW0gPSBudWxsOworCXJldHVybiBpdGVtOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jb3JlL1JlbW90ZVN0b3JlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZW1vdGVTdG9yZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVhNWFiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZW1vdGVTdG9yZS5qcwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLmNvcmUuUmVtb3RlU3RvcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLmNvcmUuUmVhZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuY29yZS5Xcml0ZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEuY29yZS5SZXN1bHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5EZWZlcnJlZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZGVjbGFyZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmpzb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5kYXRhLmNvcmUuUmVtb3RlU3RvcmUiKTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLmRhdGEuY29yZS5SZW1vdGVTdG9yZSIsIFtkb2pvLmRhdGEuY29yZS5SZWFkLCBkb2pvLmRhdGEuY29yZS5Xcml0ZV0sIHtfZGF0YXR5cGVNYXA6e30sIF9qc29uUmVnaXN0cnk6ZG9qby5qc29uLmpzb25SZWdpc3RyeSwgaW5pdGlhbGl6ZXI6ZnVuY3Rpb24gKGt3QXJncykgeworCWlmICgha3dBcmdzKSB7CisJCWt3QXJncyA9IHt9OworCX0KKwl0aGlzLl9zZXJ2ZXJRdWVyeVVybCA9IGt3QXJncy5xdWVyeVVybCB8fCAiIjsKKwl0aGlzLl9zZXJ2ZXJTYXZlVXJsID0ga3dBcmdzLnNhdmVVcmwgfHwgIiI7CisJdGhpcy5fZGVsZXRlZCA9IHt9OworCXRoaXMuX2NoYW5nZWQgPSB7fTsKKwl0aGlzLl9hZGRlZCA9IHt9OworCXRoaXMuX3Jlc3VsdHMgPSB7fTsKKwl0aGlzLl9kYXRhID0ge307CisJdGhpcy5fbnVtSXRlbXMgPSAwOworfSwgX3NldHVwUXVlcnlSZXF1ZXN0OmZ1bmN0aW9uIChyZXN1bHQsIHJlcXVlc3RLdykgeworCXJlc3VsdC5xdWVyeSA9IHJlc3VsdC5xdWVyeSB8fCAiIjsKKwlyZXF1ZXN0S3cudXJsID0gdGhpcy5fc2VydmVyUXVlcnlVcmwgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0LnF1ZXJ5KTsKKwlyZXF1ZXN0S3cubWV0aG9kID0gImdldCI7CisJcmVxdWVzdEt3Lm1pbWV0eXBlID0gInRleHQvanNvbiI7Cit9LCBfcmVzdWx0VG9RdWVyeU1ldGFkYXRhOmZ1bmN0aW9uIChzZXJ2ZXJSZXNwb25zZURhdGEpIHsKKwlyZXR1cm4gc2VydmVyUmVzcG9uc2VEYXRhOworfSwgX3Jlc3VsdFRvUXVlcnlEYXRhOmZ1bmN0aW9uIChzZXJ2ZXJSZXNwb25zZURhdGEpIHsKKwlyZXR1cm4gc2VydmVyUmVzcG9uc2VEYXRhLmRhdGE7Cit9LCBfcmVtb3RlVG9Mb2NhbFZhbHVlczpmdW5jdGlvbiAoYXR0cmlidXRlcykgeworCWZvciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7CisJCXZhciB2YWx1ZXMgPSBhdHRyaWJ1dGVzW2tleV07CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CisJCQl2YXIgdHlwZSA9IHZhbHVlLmRhdGF0eXBlIHx8IHZhbHVlLnR5cGU7CisJCQlpZiAodHlwZSkgeworCQkJCXZhciBsb2NhbFZhbHVlID0gdmFsdWUudmFsdWU7CisJCQkJaWYgKHRoaXMuX2RhdGF0eXBlTWFwW3R5cGVdKSB7CisJCQkJCWxvY2FsVmFsdWUgPSB0aGlzLl9kYXRhdHlwZU1hcFt0eXBlXSh2YWx1ZSk7CisJCQkJfQorCQkJCXZhbHVlc1tpXSA9IGxvY2FsVmFsdWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGF0dHJpYnV0ZXM7Cit9LCBfcXVlcnlUb1F1ZXJ5S2V5OmZ1bmN0aW9uIChxdWVyeSkgeworCWlmICh0eXBlb2YgcXVlcnkgPT0gInN0cmluZyIpIHsKKwkJcmV0dXJuIHF1ZXJ5OworCX0gZWxzZSB7CisJCXJldHVybiBkb2pvLmpzb24uc2VyaWFsaXplKHF1ZXJ5KTsKKwl9Cit9LCBfYXNzZXJ0SXNJdGVtOmZ1bmN0aW9uIChpdGVtKSB7CisJaWYgKCF0aGlzLmlzSXRlbShpdGVtKSkgeworCQl0aHJvdyBuZXcgRXJyb3IoImRvam8uZGF0YS5SZW1vdGVTdG9yZTogYSBmdW5jdGlvbiB3YXMgcGFzc2VkIGFuIGl0ZW0gYXJndW1lbnQgdGhhdCB3YXMgbm90IGFuIGl0ZW0iKTsKKwl9Cit9LCBnZXQ6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlKSB7CisJdmFyIHZhbHVlQXJyYXkgPSB0aGlzLmdldFZhbHVlcyhpdGVtLCBhdHRyaWJ1dGUpOworCWlmICh2YWx1ZUFycmF5Lmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJfQorCXJldHVybiB2YWx1ZUFycmF5WzBdOworfSwgZ2V0VmFsdWVzOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUpIHsKKwl2YXIgaXRlbUlkZW50aXR5ID0gdGhpcy5nZXRJZGVudGl0eShpdGVtKTsKKwl0aGlzLl9hc3NlcnRJc0l0ZW0oaXRlbUlkZW50aXR5KTsKKwl2YXIgY2hhbmdlcyA9IHRoaXMuX2NoYW5nZWRbaXRlbUlkZW50aXR5XTsKKwlpZiAoY2hhbmdlcykgeworCQl2YXIgbmV3dmFsdWVzID0gY2hhbmdlc1thdHRyaWJ1dGVdOworCQlpZiAobmV3dmFsdWVzICE9PSB1bmRlZmluZWQpIHsKKwkJCXJldHVybiBuZXd2YWx1ZXM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gW107CisJCX0KKwl9CisJcmV0dXJuIHRoaXMuX2RhdGFbaXRlbUlkZW50aXR5XVswXVthdHRyaWJ1dGVdOworfSwgZ2V0QXR0cmlidXRlczpmdW5jdGlvbiAoaXRlbSkgeworCXZhciBpdGVtSWRlbnRpdHkgPSB0aGlzLmdldElkZW50aXR5KGl0ZW0pOworCWlmICghaXRlbUlkZW50aXR5KSB7CisJCXJldHVybiB1bmRlZmluZWQ7CisJfQorCXZhciBhdHRzID0gW107CisJdmFyIGF0dHJEaWN0ID0gdGhpcy5fZGF0YVtpdGVtSWRlbnRpdHldWzBdOworCWZvciAodmFyIGF0dCBpbiBhdHRyRGljdCkgeworCQlhdHRzLnB1c2goYXR0KTsKKwl9CisJcmV0dXJuIGF0dHM7Cit9LCBoYXNBdHRyaWJ1dGU6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSkgeworCXZhciB2YWx1ZUFycmF5ID0gdGhpcy5nZXRWYWx1ZXMoaXRlbSwgYXR0cmlidXRlKTsKKwlyZXR1cm4gdmFsdWVBcnJheS5sZW5ndGggPyB0cnVlIDogZmFsc2U7Cit9LCBjb250YWluc1ZhbHVlOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CisJdmFyIHZhbHVlQXJyYXkgPSB0aGlzLmdldFZhbHVlcyhpdGVtLCBhdHRyaWJ1dGUpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7IGkrKykgeworCQlpZiAodmFsdWVBcnJheVtpXSA9PSB2YWx1ZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfSwgaXNJdGVtOmZ1bmN0aW9uIChzb21ldGhpbmcpIHsKKwlpZiAoIXNvbWV0aGluZykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBpdGVtSWRlbnRpdHkgPSBzb21ldGhpbmc7CisJaWYgKHRoaXMuX2RlbGV0ZWRbaXRlbUlkZW50aXR5XSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0aGlzLl9kYXRhW2l0ZW1JZGVudGl0eV0pIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmICh0aGlzLl9hZGRlZFtpdGVtSWRlbnRpdHldKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBmaW5kOmZ1bmN0aW9uIChrZXl3b3JkQXJncykgeworCXZhciByZXN1bHQgPSBudWxsOworCWlmIChrZXl3b3JkQXJncyBpbnN0YW5jZW9mIGRvam8uZGF0YS5jb3JlLlJlc3VsdCkgeworCQlyZXN1bHQgPSBrZXl3b3JkQXJnczsKKwkJcmVzdWx0LnN0b3JlID0gdGhpczsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBuZXcgZG9qby5kYXRhLmNvcmUuUmVzdWx0KGtleXdvcmRBcmdzLCB0aGlzKTsKKwl9CisJdmFyIHF1ZXJ5ID0gcmVzdWx0LnF1ZXJ5OworCXZhciBzZWxmID0gdGhpczsKKwl2YXIgYmluZGZ1bmMgPSBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0KSB7CisJCXZhciBzY29wZSA9IHJlc3VsdC5zY29wZSB8fCBkal9nbG9iYWw7CisJCWlmICh0eXBlID09ICJsb2FkIikgeworCQkJcmVzdWx0LnJlc3VsdE1ldGFkYXRhID0gc2VsZi5fcmVzdWx0VG9RdWVyeU1ldGFkYXRhKGRhdGEpOworCQkJdmFyIGRhdGFEaWN0ID0gc2VsZi5fcmVzdWx0VG9RdWVyeURhdGEoZGF0YSk7CisJCQlpZiAocmVzdWx0Lm9uYmVnaW4pIHsKKwkJCQlyZXN1bHQub25iZWdpbi5jYWxsKHNjb3BlLCByZXN1bHQpOworCQkJfQorCQkJdmFyIGNvdW50ID0gMDsKKwkJCXZhciByZXN1bHREYXRhID0gW107CisJCQl2YXIgbmV3SXRlbUNvdW50ID0gMDsKKwkJCWZvciAodmFyIGtleSBpbiBkYXRhRGljdCkgeworCQkJCWlmIChyZXN1bHQuX2Fib3J0ZWQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghc2VsZi5fZGVsZXRlZFtrZXldKSB7CisJCQkJCXZhciB2YWx1ZXMgPSBkYXRhRGljdFtrZXldOworCQkJCQl2YXIgYXR0cmlidXRlRGljdCA9IHNlbGYuX3JlbW90ZVRvTG9jYWxWYWx1ZXModmFsdWVzKTsKKwkJCQkJdmFyIGV4aXN0aW5nVmFsdWUgPSBzZWxmLl9kYXRhW2tleV07CisJCQkJCXZhciByZWZDb3VudCA9IDE7CisJCQkJCWlmIChleGlzdGluZ1ZhbHVlKSB7CisJCQkJCQlyZWZDb3VudCA9ICsrZXhpc3RpbmdWYWx1ZVsxXTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5ld0l0ZW1Db3VudCsrOworCQkJCQl9CisJCQkJCXNlbGYuX2RhdGFba2V5XSA9IFthdHRyaWJ1dGVEaWN0LCByZWZDb3VudF07CisJCQkJCXJlc3VsdERhdGEucHVzaChrZXkpOworCQkJCQljb3VudCsrOworCQkJCQlpZiAocmVzdWx0Lm9ubmV4dCkgeworCQkJCQkJcmVzdWx0Lm9ubmV4dC5jYWxsKHNjb3BlLCBrZXksIHJlc3VsdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzZWxmLl9yZXN1bHRzW3NlbGYuX3F1ZXJ5VG9RdWVyeUtleShxdWVyeSldID0gcmVzdWx0RGF0YTsKKwkJCXNlbGYuX251bUl0ZW1zICs9IG5ld0l0ZW1Db3VudDsKKwkJCXJlc3VsdC5sZW5ndGggPSBjb3VudDsKKwkJCWlmIChyZXN1bHQuc2F2ZVJlc3VsdCkgeworCQkJCXJlc3VsdC5pdGVtcyA9IHJlc3VsdERhdGE7CisJCQl9CisJCQlpZiAoIXJlc3VsdC5fYWJvcnRlZCAmJiByZXN1bHQub25jb21wbGV0ZWQpIHsKKwkJCQlyZXN1bHQub25jb21wbGV0ZWQuY2FsbChzY29wZSwgcmVzdWx0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09ICJlcnJvciIgfHwgdHlwZSA9PSAidGltZW91dCIpIHsKKwkJCQlkb2pvLmRlYnVnKCJmaW5kIGVycm9yOiAiICsgZG9qby5qc29uLnNlcmlhbGl6ZShkYXRhKSk7CisJCQkJaWYgKHJlc3VsdC5vbmVycm9yKSB7CisJCQkJCXJlc3VsdC5vbmVycm9yLmNhbGwoc2NvcGUsIGRhdGEpOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisJdmFyIGJpbmRLdyA9IGtleXdvcmRBcmdzLmJpbmRBcmdzIHx8IHt9OworCWJpbmRLdy5zeW5jID0gcmVzdWx0LnN5bmM7CisJYmluZEt3LmhhbmRsZSA9IGJpbmRmdW5jOworCXRoaXMuX3NldHVwUXVlcnlSZXF1ZXN0KHJlc3VsdCwgYmluZEt3KTsKKwl2YXIgcmVxdWVzdCA9IGRvam8uaW8uYmluZChiaW5kS3cpOworCXJlc3VsdC5fYWJvcnRGdW5jID0gcmVxdWVzdC5hYm9ydDsKKwlyZXR1cm4gcmVzdWx0OworfSwgZ2V0SWRlbnRpdHk6ZnVuY3Rpb24gKGl0ZW0pIHsKKwlpZiAoIXRoaXMuaXNJdGVtKGl0ZW0pKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gKGl0ZW0uaWQgPyBpdGVtLmlkIDogaXRlbSk7Cit9LCBuZXdJdGVtOmZ1bmN0aW9uIChhdHRyaWJ1dGVzLCBrZXl3b3JkQXJncykgeworCXZhciBpdGVtSWRlbnRpdHkgPSBrZXl3b3JkQXJnc1siaWRlbnRpdHkiXTsKKwlpZiAodGhpcy5fZGVsZXRlZFtpdGVtSWRlbnRpdHldKSB7CisJCWRlbGV0ZSB0aGlzLl9kZWxldGVkW2l0ZW1JZGVudGl0eV07CisJfSBlbHNlIHsKKwkJdGhpcy5fYWRkZWRbaXRlbUlkZW50aXR5XSA9IDE7CisJfQorCWlmIChhdHRyaWJ1dGVzKSB7CisJCWZvciAodmFyIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzKSB7CisJCQl2YXIgdmFsdWVPckFycmF5T2ZWYWx1ZXMgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CisJCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkodmFsdWVPckFycmF5T2ZWYWx1ZXMpKSB7CisJCQkJdGhpcy5zZXRWYWx1ZXMoaXRlbUlkZW50aXR5LCBhdHRyaWJ1dGUsIHZhbHVlT3JBcnJheU9mVmFsdWVzKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5zZXQoaXRlbUlkZW50aXR5LCBhdHRyaWJ1dGUsIHZhbHVlT3JBcnJheU9mVmFsdWVzKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4ge2lkOml0ZW1JZGVudGl0eX07Cit9LCBkZWxldGVJdGVtOmZ1bmN0aW9uIChpdGVtKSB7CisJdmFyIGlkZW50aXR5ID0gdGhpcy5nZXRJZGVudGl0eShpdGVtKTsKKwlpZiAoIWlkZW50aXR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHRoaXMuX2FkZGVkW2lkZW50aXR5XSkgeworCQlkZWxldGUgdGhpcy5fYWRkZWRbaWRlbnRpdHldOworCX0gZWxzZSB7CisJCXRoaXMuX2RlbGV0ZWRbaWRlbnRpdHldID0gMTsKKwl9CisJaWYgKHRoaXMuX2NoYW5nZWRbaWRlbnRpdHldKSB7CisJCWRlbGV0ZSB0aGlzLl9jaGFuZ2VkW2lkZW50aXR5XTsKKwl9CisJcmV0dXJuIHRydWU7Cit9LCBzZXRWYWx1ZXM6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSwgdmFsdWVzKSB7CisJdmFyIGlkZW50aXR5ID0gdGhpcy5nZXRJZGVudGl0eShpdGVtKTsKKwlpZiAoIWlkZW50aXR5KSB7CisJCXJldHVybiB1bmRlZmluZWQ7CisJfQorCXZhciBjaGFuZ2VzID0gdGhpcy5fY2hhbmdlZFtpZGVudGl0eV07CisJaWYgKCFjaGFuZ2VzKSB7CisJCWNoYW5nZXMgPSB7fTsKKwkJdGhpcy5fY2hhbmdlZFtpZGVudGl0eV0gPSBjaGFuZ2VzOworCX0KKwljaGFuZ2VzW2F0dHJpYnV0ZV0gPSB2YWx1ZXM7CisJcmV0dXJuIHRydWU7Cit9LCBzZXQ6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSwgdmFsdWUpIHsKKwlyZXR1cm4gdGhpcy5zZXRWYWx1ZXMoaXRlbSwgYXR0cmlidXRlLCBbdmFsdWVdKTsKK30sIHVuc2V0QXR0cmlidXRlOmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUpIHsKKwlyZXR1cm4gdGhpcy5zZXRWYWx1ZXMoaXRlbSwgYXR0cmlidXRlLCBbXSk7Cit9LCBfaW5pdENoYW5nZXM6ZnVuY3Rpb24gKCkgeworCXRoaXMuX2RlbGV0ZWQgPSB7fTsKKwl0aGlzLl9jaGFuZ2VkID0ge307CisJdGhpcy5fYWRkZWQgPSB7fTsKK30sIF9zZXR1cFNhdmVSZXF1ZXN0OmZ1bmN0aW9uIChzYXZlS2V5d29yZEFyZ3MsIHJlcXVlc3RLdykgeworCXJlcXVlc3RLdy51cmwgPSB0aGlzLl9zZXJ2ZXJTYXZlVXJsOworCXJlcXVlc3RLdy5tZXRob2QgPSAicG9zdCI7CisJcmVxdWVzdEt3Lm1pbWV0eXBlID0gInRleHQvcGxhaW4iOworCXZhciBkZWxldGVkID0gW107CisJZm9yICh2YXIga2V5IGluIHRoaXMuX2RlbGV0ZWQpIHsKKwkJZGVsZXRlZC5wdXNoKGtleSk7CisJfQorCXZhciBzYXZlU3RydWN0ID0geyJjaGFuZ2VkIjp0aGlzLl9jaGFuZ2VkLCAiZGVsZXRlZCI6ZGVsZXRlZH07CisJdmFyIG9sZFJlZ2lzdHJ5ID0gZG9qby5qc29uLmpzb25SZWdpc3RyeTsKKwlkb2pvLmpzb24uanNvblJlZ2lzdHJ5ID0gdGhpcy5fanNvblJlZ2lzdHJ5OworCXZhciBqc29uU3RyaW5nID0gZG9qby5qc29uLnNlcmlhbGl6ZShzYXZlU3RydWN0KTsKKwlkb2pvLmpzb24uanNvblJlZ2lzdHJ5ID0gb2xkUmVnaXN0cnk7CisJcmVxdWVzdEt3LnBvc3RDb250ZW50ID0ganNvblN0cmluZzsKK30sIHNhdmU6ZnVuY3Rpb24gKGtleXdvcmRBcmdzKSB7CisJa2V5d29yZEFyZ3MgPSBrZXl3b3JkQXJncyB8fCB7fTsKKwl2YXIgcmVzdWx0ID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwl2YXIgc2VsZiA9IHRoaXM7CisJdmFyIGJpbmRmdW5jID0gZnVuY3Rpb24gKHR5cGUsIGRhdGEsIGV2dCkgeworCQlpZiAodHlwZSA9PSAibG9hZCIpIHsKKwkJCWlmIChyZXN1bHQuZmlyZWQgPT0gMSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXZhciBrZXkgPSBudWxsOworCQkJZm9yIChrZXkgaW4gc2VsZi5fYWRkZWQpIHsKKwkJCQlpZiAoIXNlbGYuX2RhdGFba2V5XSkgeworCQkJCQlzZWxmLl9kYXRhW2tleV0gPSBbe30sIDFdOworCQkJCX0KKwkJCX0KKwkJCWZvciAoa2V5IGluIHNlbGYuX2NoYW5nZWQpIHsKKwkJCQl2YXIgZXhpc3RpbmcgPSBzZWxmLl9kYXRhW2tleV07CisJCQkJdmFyIGNoYW5nZXMgPSBzZWxmLl9jaGFuZ2VkW2tleV07CisJCQkJaWYgKGV4aXN0aW5nKSB7CisJCQkJCWV4aXN0aW5nWzBdID0gY2hhbmdlczsKKwkJCQl9IGVsc2UgeworCQkJCQlzZWxmLl9kYXRhW2tleV0gPSBbY2hhbmdlcywgMV07CisJCQkJfQorCQkJfQorCQkJZm9yIChrZXkgaW4gc2VsZi5fZGVsZXRlZCkgeworCQkJCWlmIChzZWxmLl9kYXRhW2tleV0pIHsKKwkJCQkJZGVsZXRlIHNlbGYuX2RhdGFba2V5XTsKKwkJCQl9CisJCQl9CisJCQlzZWxmLl9pbml0Q2hhbmdlcygpOworCQkJcmVzdWx0LmNhbGxiYWNrKHRydWUpOworCQl9IGVsc2UgeworCQkJaWYgKHR5cGUgPT0gImVycm9yIiB8fCB0eXBlID09ICJ0aW1lb3V0IikgeworCQkJCXJlc3VsdC5lcnJiYWNrKGRhdGEpOworCQkJfQorCQl9CisJfTsKKwl2YXIgYmluZEt3ID0ge3N5bmM6a2V5d29yZEFyZ3NbInN5bmMiXSwgaGFuZGxlOmJpbmRmdW5jfTsKKwl0aGlzLl9zZXR1cFNhdmVSZXF1ZXN0KGtleXdvcmRBcmdzLCBiaW5kS3cpOworCXZhciByZXF1ZXN0ID0gZG9qby5pby5iaW5kKGJpbmRLdyk7CisJcmVzdWx0LmNhbmNlbGxlciA9IGZ1bmN0aW9uIChkZWZlcnJlZCkgeworCQlyZXF1ZXN0LmFib3J0KCk7CisJfTsKKwlyZXR1cm4gcmVzdWx0OworfSwgcmV2ZXJ0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9pbml0Q2hhbmdlcygpOworCXJldHVybiB0cnVlOworfSwgaXNEaXJ0eTpmdW5jdGlvbiAoaXRlbSkgeworCWlmIChpdGVtKSB7CisJCXZhciBpZGVudGl0eSA9IGl0ZW0uaWQgfHwgaXRlbTsKKwkJcmV0dXJuIHRoaXMuX2RlbGV0ZWRbaWRlbnRpdHldIHx8IHRoaXMuX2NoYW5nZWRbaWRlbnRpdHldOworCX0gZWxzZSB7CisJCXZhciBrZXkgPSBudWxsOworCQlmb3IgKGtleSBpbiB0aGlzLl9jaGFuZ2VkKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlmb3IgKGtleSBpbiB0aGlzLl9kZWxldGVkKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlmb3IgKGtleSBpbiB0aGlzLl9hZGRlZCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30sIGNyZWF0ZVJlZmVyZW5jZTpmdW5jdGlvbiAoaWRzdHJpbmcpIHsKKwlyZXR1cm4ge2lkOmlkc3RyaW5nfTsKK30sIGdldFNpemU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9udW1JdGVtczsKK30sIGZvcmdldFJlc3VsdHM6ZnVuY3Rpb24gKHF1ZXJ5KSB7CisJdmFyIHF1ZXJ5S2V5ID0gdGhpcy5fcXVlcnlUb1F1ZXJ5S2V5KHF1ZXJ5KTsKKwl2YXIgcmVzdWx0cyA9IHRoaXMuX3Jlc3VsdHNbcXVlcnlLZXldOworCWlmICghcmVzdWx0cykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciByZW1vdmVkID0gMDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGtleSA9IHJlc3VsdHNbaV07CisJCXZhciBleGlzdGluZ1ZhbHVlID0gdGhpcy5fZGF0YVtrZXldOworCQlpZiAoZXhpc3RpbmdWYWx1ZVsxXSA8PSAxKSB7CisJCQlkZWxldGUgdGhpcy5fZGF0YVtrZXldOworCQkJcmVtb3ZlZCsrOworCQl9IGVsc2UgeworCQkJZXhpc3RpbmdWYWx1ZVsxXSA9IC0tZXhpc3RpbmdWYWx1ZVsxXTsKKwkJfQorCX0KKwlkZWxldGUgdGhpcy5fcmVzdWx0c1txdWVyeUtleV07CisJdGhpcy5fbnVtSXRlbXMgLT0gcmVtb3ZlZDsKKwlyZXR1cm4gdHJ1ZTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZXN1bHQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jb3JlL1Jlc3VsdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZhY2QxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9SZXN1bHQuanMKQEAgLTAsMCArMSwzNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLmNvcmUuUmVzdWx0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5kYXRhLmNvcmUuUmVzdWx0Iik7Citkb2pvLmRlY2xhcmUoImRvam8uZGF0YS5jb3JlLlJlc3VsdCIsIG51bGwsIHtpbml0aWFsaXplcjpmdW5jdGlvbiAoa2V5d29yZEFyZ3MsIHN0b3JlKSB7CisJdGhpcy5mcm9tS3dBcmdzKGtleXdvcmRBcmdzIHx8IHt9KTsKKwl0aGlzLml0ZW1zID0gbnVsbDsKKwl0aGlzLnJlc3VsdE1ldGFkYXRhID0gbnVsbDsKKwl0aGlzLmxlbmd0aCA9IC0xOworCXRoaXMuc3RvcmUgPSBzdG9yZTsKKwl0aGlzLl9hYm9ydGVkID0gZmFsc2U7CisJdGhpcy5fYWJvcnRGdW5jID0gbnVsbDsKK30sIHN5bmM6dHJ1ZSwgYWJvcnQ6ZnVuY3Rpb24gKCkgeworCXRoaXMuX2Fib3J0ZWQgPSB0cnVlOworCWlmICh0aGlzLl9hYm9ydEZ1bmMpIHsKKwkJdGhpcy5fYWJvcnRGdW5jKCk7CisJfQorfSwgZnJvbUt3QXJnczpmdW5jdGlvbiAoa3dBcmdzKSB7CisJaWYgKHR5cGVvZiBrd0FyZ3Muc2F2ZVJlc3VsdCA9PSAidW5kZWZpbmVkIikgeworCQl0aGlzLnNhdmVSZXN1bHQgPSBrd0FyZ3Mub25uZXh0ID8gZmFsc2UgOiB0cnVlOworCX0KKwlkb2pvLmxhbmcubWl4aW4odGhpcywga3dBcmdzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY29yZS9Xcml0ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL2NvcmUvV3JpdGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3OTY1MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL2NvcmUvV3JpdGUuanMKQEAgLTAsMCArMSw0NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLmNvcmUuV3JpdGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLmNvcmUuUmVhZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZGVjbGFyZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5jb3JlLldyaXRlIik7Citkb2pvLmRlY2xhcmUoImRvam8uZGF0YS5jb3JlLldyaXRlIiwgZG9qby5kYXRhLmNvcmUuUmVhZCwge25ld0l0ZW06ZnVuY3Rpb24gKGtleXdvcmRBcmdzKSB7CisJdmFyIG5ld0l0ZW07CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5uZXdJdGVtIik7CisJcmV0dXJuIG5ld0l0ZW07Cit9LCBkZWxldGVJdGVtOmZ1bmN0aW9uIChpdGVtKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5kZWxldGVJdGVtIik7CisJcmV0dXJuIGZhbHNlOworfSwgc2V0OmZ1bmN0aW9uIChpdGVtLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5zZXQiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBzZXRWYWx1ZXM6ZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSwgdmFsdWVzKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5zZXRWYWx1ZXMiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCB1bnNldEF0dHJpYnV0ZTpmdW5jdGlvbiAoaXRlbSwgYXR0cmlidXRlKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5jbGVhciIpOworCXJldHVybiBmYWxzZTsKK30sIHNhdmU6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLmNvcmUuV3JpdGUuc2F2ZSIpOworCXJldHVybiBmYWxzZTsKK30sIHJldmVydDpmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5yZXZlcnQiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBpc0RpcnR5OmZ1bmN0aW9uIChpdGVtKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEuY29yZS5Xcml0ZS5pc0RpcnR5Iik7CisJcmV0dXJuIGZhbHNlOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jc3YvQ3N2U3RvcmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jc3YvQ3N2U3RvcmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMmFlZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL2Nzdi9Dc3ZTdG9yZS5qcwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEuY3N2LkNzdlN0b3JlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5SZWFkIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKKworZG9qby5kZWNsYXJlKCJkb2pvLmRhdGEuY3N2LkNzdlN0b3JlIiwgZG9qby5kYXRhLlJlYWQsIHsKKwkvKiBzdW1tYXJ5OgorCSAqICAgVGhlIENzdlN0b3JlIGltcGxlbWVudHMgdGhlIGRvam8uZGF0YS5SZWFkIEFQSS4gIAorCSAqLworCSAKKwkvKiBleGFtcGxlczoKKwkgKiAgIHZhciBjc3ZTdG9yZSA9IG5ldyBkb2pvLmRhdGEuY3N2LkNzdlN0b3JlKHt1cmw6Im1vdmllcy5jc3YiKTsKKwkgKiAgIHZhciBjc3ZTdG9yZSA9IG5ldyBkb2pvLmRhdGEuY3N2LkNzdlN0b3JlKHt1cmw6Imh0dHA6Ly9leGFtcGxlLmNvbS9tb3ZpZXMuY3N2Iik7CisJICogICB2YXIgZmlsZUNvbnRlbnRzID0gZG9qby5ob3N0ZW52LmdldFRleHQoIm1vdmllcy5jc3YiKTsKKwkgKiAgIHZhciBjc3ZTdG9yZSA9IG5ldyBkb2pvLmRhdGEuY3N2LkNzdlN0b3JlKHtzdHJpbmc6ZmlsZUNvbnRlbnRzKTsKKwkgKi8KKwlpbml0aWFsaXplcjogCisJCWZ1bmN0aW9uKC8qIG9iamVjdCAqLyBrZXl3b3JkUGFyYW1ldGVycykgeworCQkJLy8ga2V5d29yZFBhcmFtZXRlcnM6IHtzdHJpbmc6IFN0cmluZywgdXJsOiBTdHJpbmd9CisJCQl0aGlzLl9hcnJheU9mSXRlbXMgPSBbXTsKKwkJCXRoaXMuX2xvYWRGaW5pc2hlZCA9IGZhbHNlOworCQkJdGhpcy5fY3N2RmlsZVVybCA9IGtleXdvcmRQYXJhbWV0ZXJzWyJ1cmwiXTsKKwkJCXRoaXMuX2NzdkZpbGVDb250ZW50cyA9IGtleXdvcmRQYXJhbWV0ZXJzWyJzdHJpbmciXTsKKwkJfSwKKwlnZXQ6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKi8gaXRlbSwgLyogYXR0cmlidXRlIG9yIGF0dHJpYnV0ZS1uYW1lLXN0cmluZyAqLyBhdHRyaWJ1dGUsIC8qIHZhbHVlPyAqLyBkZWZhdWx0VmFsdWUpIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVhZC5nZXQoKQorCQkJdmFyIGF0dHJpYnV0ZVZhbHVlID0gaXRlbVthdHRyaWJ1dGVdIHx8IGRlZmF1bHRWYWx1ZTsKKwkJCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsgLy8gYSBsaXRlcmFsLCBhbiBpdGVtLCBudWxsLCBvciB1bmRlZmluZWQgKG5ldmVyIGFuIGFycmF5KQorCQl9LAorCWdldFZhbHVlczoKKwkJZnVuY3Rpb24oLyogaXRlbSAqLyBpdGVtLCAvKiBhdHRyaWJ1dGUgb3IgYXR0cmlidXRlLW5hbWUtc3RyaW5nICovIGF0dHJpYnV0ZSkgeworCQkJLy8gc3VtbWFyeTogU2VlIGRvam8uZGF0YS5SZWFkLmdldFZhbHVlcygpCisJCQl2YXIgYXJyYXkgPSBbdGhpcy5nZXQoaXRlbSwgYXR0cmlidXRlKV07CisJCQlyZXR1cm4gYXJyYXk7IC8vIGFuIGFycmF5IHRoYXQgbWF5IGNvbnRhaW4gbGl0ZXJhbHMgYW5kIGl0ZW1zCisJCX0sCisJZ2V0QXR0cmlidXRlczoKKwkJZnVuY3Rpb24oLyogaXRlbSAqLyBpdGVtKSB7CisJCQkvLyBzdW1tYXJ5OiBTZWUgZG9qby5kYXRhLlJlYWQuZ2V0QXR0cmlidXRlcygpCisJCQl2YXIgYXJyYXkgPSB0aGlzLl9hcnJheU9mS2V5czsKKwkJCXJldHVybiBhcnJheTsgLy8gYXJyYXkKKwkJfSwKKwloYXNBdHRyaWJ1dGU6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKi8gaXRlbSwgLyogYXR0cmlidXRlIG9yIGF0dHJpYnV0ZS1uYW1lLXN0cmluZyAqLyBhdHRyaWJ1dGUpIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVhZC5oYXNBdHRyaWJ1dGUoKQorCQkJZm9yICh2YXIgaSBpbiB0aGlzLl9hcnJheU9mS2V5cykgeworCQkJCWlmICh0aGlzLl9hcnJheU9mS2V5c1tpXSA9PSBhdHRyaWJ1dGUpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJaGFzQXR0cmlidXRlVmFsdWU6CisJCWZ1bmN0aW9uKC8qIGl0ZW0gKi8gaXRlbSwgLyogYXR0cmlidXRlIG9yIGF0dHJpYnV0ZS1uYW1lLXN0cmluZyAqLyBhdHRyaWJ1dGUsIC8qIGFueXRoaW5nICovIHZhbHVlKSB7CisJCQkvLyBzdW1tYXJ5OiBTZWUgZG9qby5kYXRhLlJlYWQuaGFzQXR0cmlidXRlVmFsdWUoKQorCQkJcmV0dXJuICh0aGlzLmdldChpdGVtLCBhdHRyaWJ1dGUpID09IHZhbHVlKTsgLy8gYm9vbGVhbgorCQl9LAorCWlzSXRlbToKKwkJZnVuY3Rpb24oLyogYW55dGhpbmcgKi8gc29tZXRoaW5nKSB7CisJCQkvLyBzdW1tYXJ5OiBTZWUgZG9qby5kYXRhLlJlYWQuaXNJdGVtKCkKKwkJCWZvciAodmFyIGkgaW4gdGhpcy5fYXJyYXlPZkl0ZW1zKSB7CisJCQkJaWYgKHRoaXMuX2FycmF5T2ZJdGVtc1tpXSA9PSBzb21ldGhpbmcpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJCX0sCisJZmluZDoKKwkJZnVuY3Rpb24oLyogaW1wbGVtZW50YXRpb24tZGVwZW5kZW50ICovIHF1ZXJ5LCAvKiBvYmplY3QgKi8gb3B0aW9uYWxLZXl3b3JkQXJncyApIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVhZC5maW5kKCkKKwkJCWlmICghdGhpcy5fbG9hZEZpbmlzaGVkKSB7CisJCQkJaWYgKHRoaXMuX2NzdkZpbGVVcmwpIHsKKwkJCQkJdGhpcy5fY3N2RmlsZUNvbnRlbnRzID0gZG9qby5ob3N0ZW52LmdldFRleHQodGhpcy5fY3N2RmlsZVVybCk7CisJCQkJfQorCQkJCXZhciBhcnJheU9mQXJyYXlzID0gdGhpcy5fZ2V0QXJyYXlPZkFycmF5c0Zyb21Dc3ZGaWxlQ29udGVudHModGhpcy5fY3N2RmlsZUNvbnRlbnRzKTsKKwkJCQlpZiAoYXJyYXlPZkFycmF5cy5sZW5ndGggPT0gMCkgeworCQkJCQl0aGlzLl9hcnJheU9mS2V5cyA9IFtdOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuX2FycmF5T2ZLZXlzID0gYXJyYXlPZkFycmF5c1swXTsKKwkJCQl9CisJCQkJdGhpcy5fYXJyYXlPZkl0ZW1zID0gdGhpcy5fZ2V0QXJyYXlPZkl0ZW1zRnJvbUFycmF5T2ZBcnJheXMoYXJyYXlPZkFycmF5cyk7CisJCQl9CisJCQl2YXIgcmVzdWx0ID0gbmV3IGRvam8uZGF0YS5jc3YuUmVzdWx0KHRoaXMuX2FycmF5T2ZJdGVtcywgdGhpcyk7CisJCQlyZXR1cm4gcmVzdWx0OyAvLyBkb2pvLmRhdGEuY3N2LlJlc3VsdAorCQl9LAorCWdldElkZW50aXR5OgorCQlmdW5jdGlvbigvKiBpdGVtICovIGl0ZW0pIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVhZC5nZXRJZGVudGl0eSgpCisJCQlmb3IgKHZhciBpIGluIHRoaXMuX2FycmF5T2ZJdGVtcykgeworCQkJCWlmICh0aGlzLl9hcnJheU9mSXRlbXNbaV0gPT0gaXRlbSkgeworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsgLy8gYm9vbGVhbgorCQl9LAorCWdldEJ5SWRlbnRpdHk6CisJCWZ1bmN0aW9uKC8qIHN0cmluZyAqLyBpZCkgeworCQkJLy8gc3VtbWFyeTogU2VlIGRvam8uZGF0YS5SZWFkLmdldEJ5SWRlbnRpdHkoKQorCQkJdmFyIGkgPSBwYXJzZUludChpZCk7CisJCQlpZiAoaSA8IHRoaXMuX2FycmF5T2ZJdGVtcy5sZW5ndGgpIHsKKwkJCQlyZXR1cm4gdGhpcy5fYXJyYXlPZkl0ZW1zW2ldOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSwKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwlfZ2V0QXJyYXlPZkFycmF5c0Zyb21Dc3ZGaWxlQ29udGVudHM6CisJCWZ1bmN0aW9uKC8qIHN0cmluZyAqLyBjc3ZGaWxlQ29udGVudHMpIHsKKwkJCS8qIHN1bW1hcnk6CisJCQkgKiAgIFBhcnNlcyBhIHN0cmluZyBvZiBDU1YgcmVjb3JkcyBpbnRvIGEgbmVzdGVkIGFycmF5IHN0cnVjdHVyZS4KKwkJCSAqIGRlc2NyaXB0aW9uOgorCQkJICogICBHaXZlbiBhIHN0cmluZyBjb250YWluaW5nIENTViByZWNvcmRzLCB0aGlzIG1ldGhvZCBwYXJzZXMKKwkJCSAqICAgdGhlIHN0cmluZyBhbmQgcmV0dXJucyBhIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcnNlZAorCQkJICogICBjb250ZW50LiAgVGhlIGRhdGEgc3RydWN0dXJlIHdlIHJldHVybiBpcyBhbiBhcnJheSBvZiBsZW5ndGgKKwkJCSAqICAgUiwgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHJvd3MgKGxpbmVzKSBpbiB0aGUgQ1NWIGRhdGEuICBUaGUgCisJCQkgKiAgIHJldHVybiBhcnJheSBjb250YWlucyBvbmUgc3ViLWFycmF5IGZvciBlYWNoIENTViBsaW5lLCBhbmQgZWFjaCAKKwkJCSAqICAgc3ViLWFycmF5IGNvbnRhaW5zIEMgc3RyaW5nIHZhbHVlcywgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIAorCQkJICogICBjb2x1bW5zIGluIHRoZSBDU1YgZGF0YS4KKwkJCSAqLworCQkJIAorCQkJLyogZXhhbXBsZToKKwkJCSAqICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoaXMgQ1NWIHN0cmluZyBhcyBpbnB1dDoKKwkJCSAqICAgICAiVGl0bGUsIFllYXIsIFByb2R1Y2VyIFxuIEFsaWVuLCAxOTc5LCBSaWRsZXkgU2NvdHQgXG4gQmxhZGUgUnVubmVyLCAxOTgyLCBSaWRsZXkgU2NvdHQiCisJCQkgKiAgIFdlIHdpbGwgcmV0dXJuIHRoaXMgZGF0YSBzdHJ1Y3R1cmU6CisJCQkgKiAgICAgW1siVGl0bGUiLCAiWWVhciIsICJQcm9kdWNlciJdCisJCQkgKiAgICAgIFsiQWxpZW4iLCAiMTk3OSIsICJSaWRsZXkgU2NvdHQiXSwgIAorCQkJICogICAgICBbIkJsYWRlIFJ1bm5lciIsICIxOTgyIiwgIlJpZGxleSBTY290dCJdXQorCQkJICovCisJCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShjc3ZGaWxlQ29udGVudHMsIFN0cmluZyk7CisJCQkKKwkJCXZhciBsaW5lRW5kaW5nQ2hhcmFjdGVycyA9IG5ldyBSZWdFeHAoIlxyXG58XG58XHIiKTsKKwkJCXZhciBsZWFkaW5nV2hpdGVTcGFjZUNoYXJhY3RlcnMgPSBuZXcgUmVnRXhwKCJeXFxzKyIsJ2cnKTsKKwkJCXZhciB0cmFpbGluZ1doaXRlU3BhY2VDaGFyYWN0ZXJzID0gbmV3IFJlZ0V4cCgiXFxzKyQiLCdnJyk7CisJCQl2YXIgZG91YmxlUXVvdGVzID0gbmV3IFJlZ0V4cCgnIiInLCdnJyk7CisJCQl2YXIgYXJyYXlPZk91dHB1dFJlY29yZHMgPSBbXTsKKwkJCQorCQkJdmFyIGFycmF5T2ZJbnB1dExpbmVzID0gY3N2RmlsZUNvbnRlbnRzLnNwbGl0KGxpbmVFbmRpbmdDaGFyYWN0ZXJzKTsKKwkJCWZvciAodmFyIGkgaW4gYXJyYXlPZklucHV0TGluZXMpIHsKKwkJCQl2YXIgc2luZ2xlTGluZSA9IGFycmF5T2ZJbnB1dExpbmVzW2ldOworCQkJCWlmIChzaW5nbGVMaW5lLmxlbmd0aCA+IDApIHsKKwkJCQkJdmFyIGxpc3RPZkZpZWxkcyA9IHNpbmdsZUxpbmUuc3BsaXQoJywnKTsKKwkJCQkJdmFyIGogPSAwOworCQkJCQl3aGlsZSAoaiA8IGxpc3RPZkZpZWxkcy5sZW5ndGgpIHsKKwkJCQkJCXZhciBzcGFjZV9maWVsZF9zcGFjZSA9IGxpc3RPZkZpZWxkc1tqXTsKKwkJCQkJCXZhciBmaWVsZF9zcGFjZSA9IHNwYWNlX2ZpZWxkX3NwYWNlLnJlcGxhY2UobGVhZGluZ1doaXRlU3BhY2VDaGFyYWN0ZXJzLCAnJyk7IC8vIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlCisJCQkJCQl2YXIgZmllbGQgPSBmaWVsZF9zcGFjZS5yZXBsYWNlKHRyYWlsaW5nV2hpdGVTcGFjZUNoYXJhY3RlcnMsICcnKTsgLy8gdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlCisJCQkJCQl2YXIgZmlyc3RDaGFyID0gZmllbGQuY2hhckF0KDApOworCQkJCQkJdmFyIGxhc3RDaGFyID0gZmllbGQuY2hhckF0KGZpZWxkLmxlbmd0aCAtIDEpOworCQkJCQkJdmFyIHNlY29uZFRvTGFzdENoYXIgPSBmaWVsZC5jaGFyQXQoZmllbGQubGVuZ3RoIC0gMik7CisJCQkJCQl2YXIgdGhpcmRUb0xhc3RDaGFyID0gZmllbGQuY2hhckF0KGZpZWxkLmxlbmd0aCAtIDMpOworCQkJCQkJaWYgKChmaXJzdENoYXIgPT0gJyInKSAmJiAKKwkJCQkJCQkJKChsYXN0Q2hhciAhPSAnIicpIHx8IAorCQkJCQkJCQkgKChsYXN0Q2hhciA9PSAnIicpICYmIChzZWNvbmRUb0xhc3RDaGFyID09ICciJykgJiYgKHRoaXJkVG9MYXN0Q2hhciAhPSAnIicpKSApKSB7CisJCQkJCQkJaWYgKGorMSA9PT0gbGlzdE9mRmllbGRzLmxlbmd0aCkgeworCQkJCQkJCQkvLyBhbGVydCgiVGhlIGxhc3QgZmllbGQgaW4gcmVjb3JkICIgKyBpICsgIiBpcyBjb3JydXB0ZWQ6XG4iICsgZmllbGQpOworCQkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJCQl9CisJCQkJCQkJdmFyIG5leHRGaWVsZCA9IGxpc3RPZkZpZWxkc1tqKzFdOworCQkJCQkJCWxpc3RPZkZpZWxkc1tqXSA9IGZpZWxkX3NwYWNlICsgJywnICsgbmV4dEZpZWxkOworCQkJCQkJCWxpc3RPZkZpZWxkcy5zcGxpY2UoaisxLCAxKTsgLy8gZGVsZXRlIGVsZW1lbnQgW2orMV0gZnJvbSB0aGUgbGlzdAorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoKGZpcnN0Q2hhciA9PSAnIicpICYmIChsYXN0Q2hhciA9PSAnIicpKSB7CisJCQkJCQkJCWZpZWxkID0gZmllbGQuc2xpY2UoMSwgKGZpZWxkLmxlbmd0aCAtIDEpKTsgLy8gdHJpbSB0aGUgIiBjaGFyYWN0ZXJzIG9mZiB0aGUgZW5kcworCQkJCQkJCQlmaWVsZCA9IGZpZWxkLnJlcGxhY2UoZG91YmxlUXVvdGVzLCAnIicpOyAgIC8vIHJlcGxhY2UgIiIgd2l0aCAiCisJCQkJCQkJfQorCQkJCQkJCWxpc3RPZkZpZWxkc1tqXSA9IGZpZWxkOworCQkJCQkJCWogKz0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlhcnJheU9mT3V0cHV0UmVjb3Jkcy5wdXNoKGxpc3RPZkZpZWxkcyk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGFycmF5T2ZPdXRwdXRSZWNvcmRzOyAvLyBBcnJheQorCQl9LAorCisJX2dldEFycmF5T2ZJdGVtc0Zyb21BcnJheU9mQXJyYXlzOgorCQlmdW5jdGlvbigvKiBhcnJheSAqLyBhcnJheU9mQXJyYXlzKSB7CisJCQkvKiBzdW1tYXJ5OgorCQkJICogICBDb252ZXJ0cyBhIG5lc3RlZCBhcnJheSBzdHJ1Y3R1cmUgaW50byBhbiBhcnJheSBvZiBrZXl3b3JkIG9iamVjdHMuCisJCQkgKi8KKwkJCSAKKwkJCS8qIGV4YW1wbGU6CisJCQkgKiAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGlzIGFzIGlucHV0OgorCQkJICogICAgIFtbIlRpdGxlIiwgIlllYXIiLCAiUHJvZHVjZXIiXQorCQkJICogICAgICBbIkFsaWVuIiwgIjE5NzkiLCAiUmlkbGV5IFNjb3R0Il0sICAKKwkJCSAqICAgICAgWyJCbGFkZSBSdW5uZXIiLCAiMTk4MiIsICJSaWRsZXkgU2NvdHQiXV0KKwkJCSAqICAgV2Ugd2lsbCByZXR1cm4gdGhpcyBhcyBvdXRwdXQ6CisJCQkgKiAgICAgW3siVGl0bGUiOiJBbGllbiIsICJZZWFyIjoiMTk3OSIsICJQcm9kdWNlciI6IlJpZGxleSBTY290dCJ9LAorCQkJICogICAgICB7IlRpdGxlIjoiQmxhZGUgUnVubmVyIiwgIlllYXIiOiIxOTgyIiwgIlByb2R1Y2VyIjoiUmlkbGV5IFNjb3R0In1dCisJCQkgKi8KKwkJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGFycmF5T2ZBcnJheXMsIEFycmF5KTsKKwkJCXZhciBhcnJheU9mSXRlbXMgPSBbXTsKKwkJCWlmIChhcnJheU9mQXJyYXlzLmxlbmd0aCA+IDEpIHsKKwkJCQl2YXIgYXJyYXlPZktleXMgPSBhcnJheU9mQXJyYXlzWzBdOworCQkJCWZvciAodmFyIGkgPSAxOyBpIDwgYXJyYXlPZkFycmF5cy5sZW5ndGg7ICsraSkgeworCQkJCQl2YXIgcm93ID0gYXJyYXlPZkFycmF5c1tpXTsKKwkJCQkJdmFyIGl0ZW0gPSB7fTsKKwkJCQkJZm9yICh2YXIgaiBpbiByb3cpIHsKKwkJCQkJCXZhciB2YWx1ZSA9IHJvd1tqXTsKKwkJCQkJCXZhciBrZXkgPSBhcnJheU9mS2V5c1tqXTsKKwkJCQkJCWl0ZW1ba2V5XSA9IHZhbHVlOworCQkJCQl9CisJCQkJCWFycmF5T2ZJdGVtcy5wdXNoKGl0ZW0pOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBhcnJheU9mSXRlbXM7IC8vIEFycmF5CisJCX0KK30pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9jc3YvUmVzdWx0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY3N2L1Jlc3VsdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJkZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY3N2L1Jlc3VsdC5qcwpAQCAtMCwwICsxLDgxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5jc3YuUmVzdWx0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5SZXN1bHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFzc2VydCIpOworCitkb2pvLmRlY2xhcmUoImRvam8uZGF0YS5jc3YuUmVzdWx0IiwgZG9qby5kYXRhLlJlc3VsdCwgeworCS8qIHN1bW1hcnk6CisJICogICBkb2pvLmRhdGEuY3N2LlJlc3VsdCBpbXBsZW1lbnRzIHRoZSBkb2pvLmRhdGEuUmVzdWx0IEFQSS4gIFRoaXMKKwkgKiAgIGlzIGEgZmFpcmx5IGdlbmVyYWwgcHVycG9zZSBSZXN1bHQgb2JqZWN0IHRoYXQgY291bGQgYmUgdXNlZAorCSAqICAgYnkgYW55IGRhdGFzdG9yZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBwcm92aWRlIGFuIGFycmF5IG9mIGl0ZW1zCisJICogICBpbiByZXNwb25zZSB0byBhIHF1ZXJ5LgorCSAqLworCWluaXRpYWxpemVyOiAKKwkJZnVuY3Rpb24oLyogYXJyYXkgKi8gYXJyYXlPZkl0ZW1zLCAvKiBvYmplY3QgKi8gZGF0YVN0b3JlKSB7CisJCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhcnJheU9mSXRlbXMsIEFycmF5KTsKKwkJCXRoaXMuX2FycmF5T2ZJdGVtcyA9IGFycmF5T2ZJdGVtczsKKwkJCXRoaXMuX2RhdGFTdG9yZSA9IGRhdGFTdG9yZTsKKwkJCXRoaXMuX2NhbmNlbCA9IGZhbHNlOworCQkJdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlOworCQl9LAorCWZvckVhY2g6CisJCWZ1bmN0aW9uKC8qIGZ1bmN0aW9uICovIGNhbGxiYWNrRnVuY3Rpb24sIC8qIG9iamVjdD8gKi8gY2FsbGJhY2tPYmplY3QsIC8qIG9iamVjdD8gKi8gb3B0aW9uYWxLZXl3b3JkQXJncykgeworCQkJLy8gc3VtbWFyeTogU2VlIGRvam8uZGF0YS5SZXN1bHQuZm9yRWFjaCgpCisJCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShjYWxsYmFja0Z1bmN0aW9uLCBGdW5jdGlvbik7IAorCQkJZG9qby5sYW5nLmFzc2VydFR5cGUoY2FsbGJhY2tPYmplY3QsIE9iamVjdCwge29wdGlvbmFsOnRydWV9KTsgCisJCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShvcHRpb25hbEtleXdvcmRBcmdzLCAicHVyZW9iamVjdCIsIHtvcHRpb25hbDp0cnVlfSk7IAorCQkJdGhpcy5faW5Qcm9ncmVzcyA9IHRydWU7CisJCQlmb3IgKHZhciBpIGluIHRoaXMuX2FycmF5T2ZJdGVtcykgeworCQkJCXZhciBpdGVtID0gdGhpcy5fYXJyYXlPZkl0ZW1zW2ldOworCQkJCWlmICghdGhpcy5fY2FuY2VsKSB7CisJCQkJCWNhbGxiYWNrRnVuY3Rpb24uY2FsbChjYWxsYmFja09iamVjdCwgaXRlbSwgaSwgdGhpcyk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlOworCQkJdGhpcy5fY2FuY2VsID0gZmFsc2U7CisJCQkKKwkJCXJldHVybiB0cnVlOyAvLyBib29sZWFuCisJCX0sCisJZ2V0TGVuZ3RoOgorCQlmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVzdWx0LmdldExlbmd0aCgpCisJCQlyZXR1cm4gdGhpcy5fYXJyYXlPZkl0ZW1zLmxlbmd0aDsgLy8gaW50ZWdlcgorCQl9LAorCWluUHJvZ3Jlc3M6CisJCWZ1bmN0aW9uKCkgeworCQkJLy8gc3VtbWFyeTogU2VlIGRvam8uZGF0YS5SZXN1bHQuaW5Qcm9ncmVzcygpCisJCQlyZXR1cm4gdGhpcy5faW5Qcm9ncmVzczsgLy8gYm9vbGVhbgorCQl9LAorCWNhbmNlbDoKKwkJZnVuY3Rpb24oKSB7CisJCQkvLyBzdW1tYXJ5OiBTZWUgZG9qby5kYXRhLlJlc3VsdC5jYW5jZWwoKQorCQkJaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHsKKwkJCQl0aGlzLl9jYW5jZWwgPSB0cnVlOworCQkJfQorCQl9LAorCXNldE9uRmluZENvbXBsZXRlZDoKKwkJZnVuY3Rpb24oLyogZnVuY3Rpb24gKi8gY2FsbGJhY2tGdW5jdGlvbiwgLyogb2JqZWN0PyAqLyBjYWxsYmFja09iamVjdCkgeworCQkJLy8gc3VtbWFyeTogU2VlIGRvam8uZGF0YS5SZXN1bHQuc2V0T25GaW5kQ29tcGxldGVkKCkKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLmNzdi5SZXN1bHQuc2V0T25GaW5kQ29tcGxldGVkJyk7CisJCX0sCisJc2V0T25FcnJvcjoKKwkJZnVuY3Rpb24oLyogZnVuY3Rpb24gKi8gZXJyb3JDYWxsYmFja0Z1bmN0aW9uLCAvKiBvYmplY3Q/ICovIGNhbGxiYWNrT2JqZWN0KSB7CisJCQkvLyBzdW1tYXJ5OiBTZWUgZG9qby5kYXRhLlJlc3VsdC5zZXRPbkVycm9yKCkKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZG9qby5kYXRhLmNzdi5SZXN1bHQuc2V0T25FcnJvcicpOworCQl9LAorCWdldFN0b3JlOgorCQlmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6IFNlZSBkb2pvLmRhdGEuUmVzdWx0LmdldFN0b3JlKCkKKwkJCXJldHVybiB0aGlzLl9kYXRhU3RvcmU7IC8vIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgZG9qby5kYXRhLlJlYWQKKwkJfQorfSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL2Nzdi9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL2Nzdi9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI1YzZhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvY3N2L19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKKworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5jc3YuKiIpOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbCisJCSJkb2pvLmRhdGEuY3N2LkNzdlN0b3JlIiwKKwkJImRvam8uZGF0YS5jc3YuUmVzdWx0IgorCV0KK30pOworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEuY3N2LioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL0F0dHJpYnV0ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9BdHRyaWJ1dGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5ODE3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9BdHRyaWJ1dGUuanMKQEAgLTAsMCArMSwzNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5BdHRyaWJ1dGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLm9sZC5JdGVtIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8uZGF0YS5vbGQuQXR0cmlidXRlID0gZnVuY3Rpb24gKGRhdGFQcm92aWRlciwgYXR0cmlidXRlSWQpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShkYXRhUHJvdmlkZXIsIGRvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZSwge29wdGlvbmFsOnRydWV9KTsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhdHRyaWJ1dGVJZCwgU3RyaW5nKTsKKwlkb2pvLmRhdGEub2xkLkl0ZW0uY2FsbCh0aGlzLCBkYXRhUHJvdmlkZXIpOworCXRoaXMuX2F0dHJpYnV0ZUlkID0gYXR0cmlidXRlSWQ7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRhdGEub2xkLkF0dHJpYnV0ZSwgZG9qby5kYXRhLm9sZC5JdGVtKTsKK2Rvam8uZGF0YS5vbGQuQXR0cmlidXRlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fYXR0cmlidXRlSWQ7Cit9OworZG9qby5kYXRhLm9sZC5BdHRyaWJ1dGUucHJvdG90eXBlLmdldEF0dHJpYnV0ZUlkID0gZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9hdHRyaWJ1dGVJZDsKK307Citkb2pvLmRhdGEub2xkLkF0dHJpYnV0ZS5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5nZXQoInR5cGUiKTsKK307Citkb2pvLmRhdGEub2xkLkF0dHJpYnV0ZS5wcm90b3R5cGUuc2V0VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7CisJdGhpcy5zZXQoInR5cGUiLCB0eXBlKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9JdGVtLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL0l0ZW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzOTdkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9JdGVtLmpzCkBAIC0wLDAgKzEsMjIzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEub2xkLkl0ZW0iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLm9sZC5PYnNlcnZhYmxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5vbGQuVmFsdWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXNzZXJ0Iik7Citkb2pvLmRhdGEub2xkLkl0ZW0gPSBmdW5jdGlvbiAoZGF0YVByb3ZpZGVyKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoZGF0YVByb3ZpZGVyLCBkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UsIHtvcHRpb25hbDp0cnVlfSk7CisJZG9qby5kYXRhLm9sZC5PYnNlcnZhYmxlLmNhbGwodGhpcyk7CisJdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyOworCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlcyA9IHt9OworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5kYXRhLm9sZC5JdGVtLCBkb2pvLmRhdGEub2xkLk9ic2VydmFibGUpOworZG9qby5kYXRhLm9sZC5JdGVtLmNvbXBhcmUgPSBmdW5jdGlvbiAoaXRlbU9uZSwgaXRlbVR3bykgeworCWRvam8ubGFuZy5hc3NlcnRUeXBlKGl0ZW1PbmUsIGRvam8uZGF0YS5vbGQuSXRlbSk7CisJaWYgKCFkb2pvLmxhbmcuaXNPZlR5cGUoaXRlbVR3bywgZG9qby5kYXRhLm9sZC5JdGVtKSkgeworCQlyZXR1cm4gLTE7CisJfQorCXZhciBuYW1lT25lID0gaXRlbU9uZS5nZXROYW1lKCk7CisJdmFyIG5hbWVUd28gPSBpdGVtVHdvLmdldE5hbWUoKTsKKwlpZiAobmFtZU9uZSA9PSBuYW1lVHdvKSB7CisJCXZhciBhdHRyaWJ1dGVBcnJheU9uZSA9IGl0ZW1PbmUuZ2V0QXR0cmlidXRlcygpOworCQl2YXIgYXR0cmlidXRlQXJyYXlUd28gPSBpdGVtVHdvLmdldEF0dHJpYnV0ZXMoKTsKKwkJaWYgKGF0dHJpYnV0ZUFycmF5T25lLmxlbmd0aCAhPSBhdHRyaWJ1dGVBcnJheVR3by5sZW5ndGgpIHsKKwkJCWlmIChhdHRyaWJ1dGVBcnJheU9uZS5sZW5ndGggPiBhdHRyaWJ1dGVBcnJheVR3by5sZW5ndGgpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWZvciAodmFyIGkgaW4gYXR0cmlidXRlQXJyYXlPbmUpIHsKKwkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheU9uZVtpXTsKKwkJCXZhciBhcnJheU9mVmFsdWVzT25lID0gaXRlbU9uZS5nZXRWYWx1ZXMoYXR0cmlidXRlKTsKKwkJCXZhciBhcnJheU9mVmFsdWVzVHdvID0gaXRlbVR3by5nZXRWYWx1ZXMoYXR0cmlidXRlKTsKKwkJCWRvam8ubGFuZy5hc3NlcnQoYXJyYXlPZlZhbHVlc09uZSAmJiAoYXJyYXlPZlZhbHVlc09uZS5sZW5ndGggPiAwKSk7CisJCQlpZiAoIWFycmF5T2ZWYWx1ZXNUd28pIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmIChhcnJheU9mVmFsdWVzT25lLmxlbmd0aCAhPSBhcnJheU9mVmFsdWVzVHdvLmxlbmd0aCkgeworCQkJCWlmIChhcnJheU9mVmFsdWVzT25lLmxlbmd0aCA+IGFycmF5T2ZWYWx1ZXNUd28ubGVuZ3RoKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKHZhciBqIGluIGFycmF5T2ZWYWx1ZXNPbmUpIHsKKwkJCQl2YXIgdmFsdWUgPSBhcnJheU9mVmFsdWVzT25lW2pdOworCQkJCWlmICghaXRlbVR3by5oYXNBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSkpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmFtZU9uZSA+IG5hbWVUd28pIHsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisJdmFyIGFycmF5T2ZTdHJpbmdzID0gW107CisJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKTsKKwlmb3IgKHZhciBpIGluIGF0dHJpYnV0ZXMpIHsKKwkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07CisJCXZhciBhcnJheU9mVmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoYXR0cmlidXRlKTsKKwkJdmFyIHZhbHVlU3RyaW5nOworCQlpZiAoYXJyYXlPZlZhbHVlcy5sZW5ndGggPT0gMSkgeworCQkJdmFsdWVTdHJpbmcgPSBhcnJheU9mVmFsdWVzWzBdOworCQl9IGVsc2UgeworCQkJdmFsdWVTdHJpbmcgPSAiWyI7CisJCQl2YWx1ZVN0cmluZyArPSBhcnJheU9mVmFsdWVzLmpvaW4oIiwgIik7CisJCQl2YWx1ZVN0cmluZyArPSAiXSI7CisJCX0KKwkJYXJyYXlPZlN0cmluZ3MucHVzaCgiICAiICsgYXR0cmlidXRlICsgIjogIiArIHZhbHVlU3RyaW5nKTsKKwl9CisJdmFyIHJldHVyblN0cmluZyA9ICJ7ICI7CisJcmV0dXJuU3RyaW5nICs9IGFycmF5T2ZTdHJpbmdzLmpvaW4oIixcbiIpOworCXJldHVyblN0cmluZyArPSAiIH0iOworCXJldHVybiByZXR1cm5TdHJpbmc7Cit9OworZG9qby5kYXRhLm9sZC5JdGVtLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKG90aGVySXRlbSkgeworCXJldHVybiBkb2pvLmRhdGEub2xkLkl0ZW0uY29tcGFyZSh0aGlzLCBvdGhlckl0ZW0pOworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuaXNFcXVhbCA9IGZ1bmN0aW9uIChvdGhlckl0ZW0pIHsKKwlyZXR1cm4gKHRoaXMuY29tcGFyZShvdGhlckl0ZW0pID09IDApOworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5nZXQoIm5hbWUiKTsKK307Citkb2pvLmRhdGEub2xkLkl0ZW0ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCkgeworCXZhciBsaXRlcmFsT3JWYWx1ZU9yQXJyYXkgPSB0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVWYWx1ZXNbYXR0cmlidXRlSWRdOworCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKGxpdGVyYWxPclZhbHVlT3JBcnJheSBpbnN0YW5jZW9mIGRvam8uZGF0YS5vbGQuVmFsdWUpIHsKKwkJcmV0dXJuIGxpdGVyYWxPclZhbHVlT3JBcnJheS5nZXRWYWx1ZSgpOworCX0KKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQl2YXIgZG9qb0RhdGFWYWx1ZSA9IGxpdGVyYWxPclZhbHVlT3JBcnJheVswXTsKKwkJcmV0dXJuIGRvam9EYXRhVmFsdWUuZ2V0VmFsdWUoKTsKKwl9CisJcmV0dXJuIGxpdGVyYWxPclZhbHVlT3JBcnJheTsKK307Citkb2pvLmRhdGEub2xkLkl0ZW0ucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZUlkKSB7CisJdmFyIGxpdGVyYWxPclZhbHVlT3JBcnJheSA9IHRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF07CisJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChsaXRlcmFsT3JWYWx1ZU9yQXJyYXkpKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAobGl0ZXJhbE9yVmFsdWVPckFycmF5IGluc3RhbmNlb2YgZG9qby5kYXRhLm9sZC5WYWx1ZSkgeworCQlyZXR1cm4gbGl0ZXJhbE9yVmFsdWVPckFycmF5OworCX0KKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQl2YXIgZG9qb0RhdGFWYWx1ZSA9IGxpdGVyYWxPclZhbHVlT3JBcnJheVswXTsKKwkJcmV0dXJuIGRvam9EYXRhVmFsdWU7CisJfQorCXZhciBsaXRlcmFsID0gbGl0ZXJhbE9yVmFsdWVPckFycmF5OworCWRvam9EYXRhVmFsdWUgPSBuZXcgZG9qby5kYXRhLm9sZC5WYWx1ZShsaXRlcmFsKTsKKwl0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVWYWx1ZXNbYXR0cmlidXRlSWRdID0gZG9qb0RhdGFWYWx1ZTsKKwlyZXR1cm4gZG9qb0RhdGFWYWx1ZTsKK307Citkb2pvLmRhdGEub2xkLkl0ZW0ucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCkgeworCXZhciBsaXRlcmFsT3JWYWx1ZU9yQXJyYXkgPSB0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVWYWx1ZXNbYXR0cmlidXRlSWRdOworCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKGxpdGVyYWxPclZhbHVlT3JBcnJheSBpbnN0YW5jZW9mIGRvam8uZGF0YS5vbGQuVmFsdWUpIHsKKwkJdmFyIGFycmF5ID0gW2xpdGVyYWxPclZhbHVlT3JBcnJheV07CisJCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF0gPSBhcnJheTsKKwkJcmV0dXJuIGFycmF5OworCX0KKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQlyZXR1cm4gbGl0ZXJhbE9yVmFsdWVPckFycmF5OworCX0KKwl2YXIgbGl0ZXJhbCA9IGxpdGVyYWxPclZhbHVlT3JBcnJheTsKKwl2YXIgZG9qb0RhdGFWYWx1ZSA9IG5ldyBkb2pvLmRhdGEub2xkLlZhbHVlKGxpdGVyYWwpOworCWFycmF5ID0gW2Rvam9EYXRhVmFsdWVdOworCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF0gPSBhcnJheTsKKwlyZXR1cm4gYXJyYXk7Cit9OworZG9qby5kYXRhLm9sZC5JdGVtLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGF0dHJpYnV0ZUlkLCB2YWx1ZSkgeworCXRoaXMuX2RhdGFQcm92aWRlci5yZWdpc3RlckF0dHJpYnV0ZShhdHRyaWJ1dGVJZCk7CisJdmFyIGxpdGVyYWxPclZhbHVlT3JBcnJheSA9IHRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF07CisJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChsaXRlcmFsT3JWYWx1ZU9yQXJyYXkpKSB7CisJCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF0gPSB2YWx1ZTsKKwkJcmV0dXJuOworCX0KKwlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGRvam8uZGF0YS5vbGQuVmFsdWUpKSB7CisJCXZhbHVlID0gbmV3IGRvam8uZGF0YS5vbGQuVmFsdWUodmFsdWUpOworCX0KKwlpZiAobGl0ZXJhbE9yVmFsdWVPckFycmF5IGluc3RhbmNlb2YgZG9qby5kYXRhLm9sZC5WYWx1ZSkgeworCQl2YXIgYXJyYXkgPSBbbGl0ZXJhbE9yVmFsdWVPckFycmF5LCB2YWx1ZV07CisJCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZVZhbHVlc1thdHRyaWJ1dGVJZF0gPSBhcnJheTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkobGl0ZXJhbE9yVmFsdWVPckFycmF5KSkgeworCQlsaXRlcmFsT3JWYWx1ZU9yQXJyYXkucHVzaCh2YWx1ZSk7CisJCXJldHVybjsKKwl9CisJdmFyIGxpdGVyYWwgPSBsaXRlcmFsT3JWYWx1ZU9yQXJyYXk7CisJdmFyIGRvam9EYXRhVmFsdWUgPSBuZXcgZG9qby5kYXRhLm9sZC5WYWx1ZShsaXRlcmFsKTsKKwlhcnJheSA9IFtkb2pvRGF0YVZhbHVlLCB2YWx1ZV07CisJdGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlVmFsdWVzW2F0dHJpYnV0ZUlkXSA9IGFycmF5OworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGF0dHJpYnV0ZUlkLCB2YWx1ZSkgeworCXRoaXMuX2RhdGFQcm92aWRlci5yZWdpc3RlckF0dHJpYnV0ZShhdHRyaWJ1dGVJZCk7CisJdGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlVmFsdWVzW2F0dHJpYnV0ZUlkXSA9IHZhbHVlOworCXRoaXMuX2RhdGFQcm92aWRlci5ub3RlQ2hhbmdlKHRoaXMsIGF0dHJpYnV0ZUlkLCB2YWx1ZSk7Cit9OworZG9qby5kYXRhLm9sZC5JdGVtLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCwgdmFsdWUpIHsKKwl0aGlzLnNldChhdHRyaWJ1dGVJZCwgdmFsdWUpOworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuYWRkVmFsdWUgPSBmdW5jdGlvbiAoYXR0cmlidXRlSWQsIHZhbHVlKSB7CisJdGhpcy5sb2FkKGF0dHJpYnV0ZUlkLCB2YWx1ZSk7CisJdGhpcy5fZGF0YVByb3ZpZGVyLm5vdGVDaGFuZ2UodGhpcywgYXR0cmlidXRlSWQsIHZhbHVlKTsKK307Citkb2pvLmRhdGEub2xkLkl0ZW0ucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCwgYXJyYXlPZlZhbHVlcykgeworCWRvam8ubGFuZy5hc3NlcnRUeXBlKGFycmF5T2ZWYWx1ZXMsIEFycmF5KTsKKwl0aGlzLl9kYXRhUHJvdmlkZXIucmVnaXN0ZXJBdHRyaWJ1dGUoYXR0cmlidXRlSWQpOworCXZhciBmaW5hbEFycmF5ID0gW107CisJdGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlVmFsdWVzW2F0dHJpYnV0ZUlkXSA9IGZpbmFsQXJyYXk7CisJZm9yICh2YXIgaSBpbiBhcnJheU9mVmFsdWVzKSB7CisJCXZhciB2YWx1ZSA9IGFycmF5T2ZWYWx1ZXNbaV07CisJCWlmICghKHZhbHVlIGluc3RhbmNlb2YgZG9qby5kYXRhLm9sZC5WYWx1ZSkpIHsKKwkJCXZhbHVlID0gbmV3IGRvam8uZGF0YS5vbGQuVmFsdWUodmFsdWUpOworCQl9CisJCWZpbmFsQXJyYXkucHVzaCh2YWx1ZSk7CisJCXRoaXMuX2RhdGFQcm92aWRlci5ub3RlQ2hhbmdlKHRoaXMsIGF0dHJpYnV0ZUlkLCB2YWx1ZSk7CisJfQorfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgYXJyYXlPZkF0dHJpYnV0ZXMgPSBbXTsKKwlmb3IgKHZhciBrZXkgaW4gdGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlVmFsdWVzKSB7CisJCWFycmF5T2ZBdHRyaWJ1dGVzLnB1c2godGhpcy5fZGF0YVByb3ZpZGVyLmdldEF0dHJpYnV0ZShrZXkpKTsKKwl9CisJcmV0dXJuIGFycmF5T2ZBdHRyaWJ1dGVzOworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuaGFzQXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZUlkKSB7CisJcmV0dXJuIChhdHRyaWJ1dGVJZCBpbiB0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVWYWx1ZXMpOworfTsKK2Rvam8uZGF0YS5vbGQuSXRlbS5wcm90b3R5cGUuaGFzQXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbiAoYXR0cmlidXRlSWQsIHZhbHVlKSB7CisJdmFyIGFycmF5T2ZWYWx1ZXMgPSB0aGlzLmdldFZhbHVlcyhhdHRyaWJ1dGVJZCk7CisJZm9yICh2YXIgaSBpbiBhcnJheU9mVmFsdWVzKSB7CisJCXZhciBjYW5kaWRhdGVWYWx1ZSA9IGFycmF5T2ZWYWx1ZXNbaV07CisJCWlmIChjYW5kaWRhdGVWYWx1ZS5pc0VxdWFsKHZhbHVlKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL0tpbmQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvS2luZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE2MWEzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL0tpbmQuanMKQEAgLTAsMCArMSwxOSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5LaW5kIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5vbGQuSXRlbSIpOworZG9qby5kYXRhLm9sZC5LaW5kID0gZnVuY3Rpb24gKGRhdGFQcm92aWRlcikgeworCWRvam8uZGF0YS5vbGQuSXRlbS5jYWxsKHRoaXMsIGRhdGFQcm92aWRlcik7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRhdGEub2xkLktpbmQsIGRvam8uZGF0YS5vbGQuSXRlbSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9PYnNlcnZhYmxlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL09ic2VydmFibGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyOTFiOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9PYnNlcnZhYmxlLmpzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5vbGQuT2JzZXJ2YWJsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8uZGF0YS5vbGQuT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHsKK307Citkb2pvLmRhdGEub2xkLk9ic2VydmFibGUucHJvdG90eXBlLmFkZE9ic2VydmVyID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUob2JzZXJ2ZXIsIE9iamVjdCk7CisJZG9qby5sYW5nLmFzc2VydFR5cGUob2JzZXJ2ZXIub2JzZXJ2ZWRPYmplY3RIYXNDaGFuZ2VkLCBGdW5jdGlvbik7CisJaWYgKCF0aGlzLl9hcnJheU9mT2JzZXJ2ZXJzKSB7CisJCXRoaXMuX2FycmF5T2ZPYnNlcnZlcnMgPSBbXTsKKwl9CisJaWYgKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLl9hcnJheU9mT2JzZXJ2ZXJzLCBvYnNlcnZlcikpIHsKKwkJdGhpcy5fYXJyYXlPZk9ic2VydmVycy5wdXNoKG9ic2VydmVyKTsKKwl9Cit9OworZG9qby5kYXRhLm9sZC5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikgeworCWlmICghdGhpcy5fYXJyYXlPZk9ic2VydmVycykgeworCQlyZXR1cm47CisJfQorCXZhciBpbmRleCA9IGRvam8ubGFuZy5pbmRleE9mKHRoaXMuX2FycmF5T2ZPYnNlcnZlcnMsIG9ic2VydmVyKTsKKwlpZiAoaW5kZXggIT0gLTEpIHsKKwkJdGhpcy5fYXJyYXlPZk9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpOworCX0KK307Citkb2pvLmRhdGEub2xkLk9ic2VydmFibGUucHJvdG90eXBlLmdldE9ic2VydmVycyA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fYXJyYXlPZk9ic2VydmVyczsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9SZXN1bHRTZXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvUmVzdWx0U2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2I5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvUmVzdWx0U2V0LmpzCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5vbGQuUmVzdWx0U2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5jb2xsZWN0aW9ucy5Db2xsZWN0aW9ucyIpOworZG9qby5kYXRhLm9sZC5SZXN1bHRTZXQgPSBmdW5jdGlvbiAoZGF0YVByb3ZpZGVyLCBhcnJheU9mSXRlbXMpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShkYXRhUHJvdmlkZXIsIGRvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZSwge29wdGlvbmFsOnRydWV9KTsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhcnJheU9mSXRlbXMsIEFycmF5LCB7b3B0aW9uYWw6dHJ1ZX0pOworCWRvam8uZGF0YS5vbGQuT2JzZXJ2YWJsZS5jYWxsKHRoaXMpOworCXRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjsKKwl0aGlzLl9hcnJheU9mSXRlbXMgPSBbXTsKKwlpZiAoYXJyYXlPZkl0ZW1zKSB7CisJCXRoaXMuX2FycmF5T2ZJdGVtcyA9IGFycmF5T2ZJdGVtczsKKwl9Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRhdGEub2xkLlJlc3VsdFNldCwgZG9qby5kYXRhLm9sZC5PYnNlcnZhYmxlKTsKK2Rvam8uZGF0YS5vbGQuUmVzdWx0U2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgcmV0dXJuU3RyaW5nID0gdGhpcy5fYXJyYXlPZkl0ZW1zLmpvaW4oIiwgIik7CisJcmV0dXJuIHJldHVyblN0cmluZzsKK307Citkb2pvLmRhdGEub2xkLlJlc3VsdFNldC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fYXJyYXlPZkl0ZW1zOworfTsKK2Rvam8uZGF0YS5vbGQuUmVzdWx0U2V0LnByb3RvdHlwZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gbmV3IGRvam8uY29sbGVjdGlvbnMuSXRlcmF0b3IodGhpcy5fYXJyYXlPZkl0ZW1zKTsKK307Citkb2pvLmRhdGEub2xkLlJlc3VsdFNldC5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9hcnJheU9mSXRlbXMubGVuZ3RoOworfTsKK2Rvam8uZGF0YS5vbGQuUmVzdWx0U2V0LnByb3RvdHlwZS5nZXRJdGVtQXQgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKwlyZXR1cm4gdGhpcy5fYXJyYXlPZkl0ZW1zW2luZGV4XTsKK307Citkb2pvLmRhdGEub2xkLlJlc3VsdFNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIChpdGVtKSB7CisJcmV0dXJuIGRvam8ubGFuZy5pbmRleE9mKHRoaXMuX2FycmF5T2ZJdGVtcywgaXRlbSk7Cit9OworZG9qby5kYXRhLm9sZC5SZXN1bHRTZXQucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGl0ZW0pIHsKKwlyZXR1cm4gZG9qby5sYW5nLmluQXJyYXkodGhpcy5fYXJyYXlPZkl0ZW1zLCBpdGVtKTsKK307Citkb2pvLmRhdGEub2xkLlJlc3VsdFNldC5wcm90b3R5cGUuZ2V0RGF0YVByb3ZpZGVyID0gZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvVHlwZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9UeXBlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGRjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvVHlwZS5qcwpAQCAtMCwwICsxLDE5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEub2xkLlR5cGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLm9sZC5JdGVtIik7Citkb2pvLmRhdGEub2xkLlR5cGUgPSBmdW5jdGlvbiAoZGF0YVByb3ZpZGVyKSB7CisJZG9qby5kYXRhLm9sZC5JdGVtLmNhbGwodGhpcywgZGF0YVByb3ZpZGVyKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uZGF0YS5vbGQuVHlwZSwgZG9qby5kYXRhLm9sZC5JdGVtKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL1ZhbHVlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL1ZhbHVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWVhODkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvVmFsdWUuanMKQEAgLTAsMCArMSwzNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5WYWx1ZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXNzZXJ0Iik7Citkb2pvLmRhdGEub2xkLlZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7CisJdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKwl0aGlzLl90eXBlID0gbnVsbDsKK307Citkb2pvLmRhdGEub2xkLlZhbHVlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTsKK307Citkb2pvLmRhdGEub2xkLlZhbHVlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fdmFsdWU7Cit9OworZG9qby5kYXRhLm9sZC5WYWx1ZS5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uICgpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0YS5vbGQuVmFsdWUucHJvdG90eXBlLmdldFR5cGUiKTsKKwlyZXR1cm4gdGhpcy5fdHlwZTsKK307Citkb2pvLmRhdGEub2xkLlZhbHVlLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLm9sZC5WYWx1ZS5wcm90b3R5cGUuY29tcGFyZSIpOworfTsKK2Rvam8uZGF0YS5vbGQuVmFsdWUucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLlZhbHVlLnByb3RvdHlwZS5pc0VxdWFsIik7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxMmQzMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8uZGF0YS5vbGQuKiIpOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5kYXRhLm9sZC5JdGVtIiwgImRvam8uZGF0YS5vbGQuUmVzdWx0U2V0IiwgImRvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEub2xkLioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL2Zvcm1hdC9Dc3YuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvZm9ybWF0L0Nzdi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U3OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL2Zvcm1hdC9Dc3YuanMKQEAgLTAsMCArMSw4MSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5mb3JtYXQuQ3N2Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8uZGF0YS5vbGQuZm9ybWF0LkNzdiA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5nZXRBcnJheVN0cnVjdHVyZUZyb21Dc3ZGaWxlQ29udGVudHMgPSBmdW5jdGlvbiAoY3N2RmlsZUNvbnRlbnRzKSB7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGNzdkZpbGVDb250ZW50cywgU3RyaW5nKTsKKwkJdmFyIGxpbmVFbmRpbmdDaGFyYWN0ZXJzID0gbmV3IFJlZ0V4cCgiXHJcbnxcbnxcciIpOworCQl2YXIgbGVhZGluZ1doaXRlU3BhY2VDaGFyYWN0ZXJzID0gbmV3IFJlZ0V4cCgiXlxccysiLCAiZyIpOworCQl2YXIgdHJhaWxpbmdXaGl0ZVNwYWNlQ2hhcmFjdGVycyA9IG5ldyBSZWdFeHAoIlxccyskIiwgImciKTsKKwkJdmFyIGRvdWJsZVF1b3RlcyA9IG5ldyBSZWdFeHAoIlwiXCIiLCAiZyIpOworCQl2YXIgYXJyYXlPZk91dHB1dFJlY29yZHMgPSBbXTsKKwkJdmFyIGFycmF5T2ZJbnB1dExpbmVzID0gY3N2RmlsZUNvbnRlbnRzLnNwbGl0KGxpbmVFbmRpbmdDaGFyYWN0ZXJzKTsKKwkJZm9yICh2YXIgaSBpbiBhcnJheU9mSW5wdXRMaW5lcykgeworCQkJdmFyIHNpbmdsZUxpbmUgPSBhcnJheU9mSW5wdXRMaW5lc1tpXTsKKwkJCWlmIChzaW5nbGVMaW5lLmxlbmd0aCA+IDApIHsKKwkJCQl2YXIgbGlzdE9mRmllbGRzID0gc2luZ2xlTGluZS5zcGxpdCgiLCIpOworCQkJCXZhciBqID0gMDsKKwkJCQl3aGlsZSAoaiA8IGxpc3RPZkZpZWxkcy5sZW5ndGgpIHsKKwkJCQkJdmFyIHNwYWNlX2ZpZWxkX3NwYWNlID0gbGlzdE9mRmllbGRzW2pdOworCQkJCQl2YXIgZmllbGRfc3BhY2UgPSBzcGFjZV9maWVsZF9zcGFjZS5yZXBsYWNlKGxlYWRpbmdXaGl0ZVNwYWNlQ2hhcmFjdGVycywgIiIpOworCQkJCQl2YXIgZmllbGQgPSBmaWVsZF9zcGFjZS5yZXBsYWNlKHRyYWlsaW5nV2hpdGVTcGFjZUNoYXJhY3RlcnMsICIiKTsKKwkJCQkJdmFyIGZpcnN0Q2hhciA9IGZpZWxkLmNoYXJBdCgwKTsKKwkJCQkJdmFyIGxhc3RDaGFyID0gZmllbGQuY2hhckF0KGZpZWxkLmxlbmd0aCAtIDEpOworCQkJCQl2YXIgc2Vjb25kVG9MYXN0Q2hhciA9IGZpZWxkLmNoYXJBdChmaWVsZC5sZW5ndGggLSAyKTsKKwkJCQkJdmFyIHRoaXJkVG9MYXN0Q2hhciA9IGZpZWxkLmNoYXJBdChmaWVsZC5sZW5ndGggLSAzKTsKKwkJCQkJaWYgKChmaXJzdENoYXIgPT0gIlwiIikgJiYgKChsYXN0Q2hhciAhPSAiXCIiKSB8fCAoKGxhc3RDaGFyID09ICJcIiIpICYmIChzZWNvbmRUb0xhc3RDaGFyID09ICJcIiIpICYmICh0aGlyZFRvTGFzdENoYXIgIT0gIlwiIikpKSkgeworCQkJCQkJaWYgKGogKyAxID09PSBsaXN0T2ZGaWVsZHMubGVuZ3RoKSB7CisJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQl9CisJCQkJCQl2YXIgbmV4dEZpZWxkID0gbGlzdE9mRmllbGRzW2ogKyAxXTsKKwkJCQkJCWxpc3RPZkZpZWxkc1tqXSA9IGZpZWxkX3NwYWNlICsgIiwiICsgbmV4dEZpZWxkOworCQkJCQkJbGlzdE9mRmllbGRzLnNwbGljZShqICsgMSwgMSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoKGZpcnN0Q2hhciA9PSAiXCIiKSAmJiAobGFzdENoYXIgPT0gIlwiIikpIHsKKwkJCQkJCQlmaWVsZCA9IGZpZWxkLnNsaWNlKDEsIChmaWVsZC5sZW5ndGggLSAxKSk7CisJCQkJCQkJZmllbGQgPSBmaWVsZC5yZXBsYWNlKGRvdWJsZVF1b3RlcywgIlwiIik7CisJCQkJCQl9CisJCQkJCQlsaXN0T2ZGaWVsZHNbal0gPSBmaWVsZDsKKwkJCQkJCWogKz0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhcnJheU9mT3V0cHV0UmVjb3Jkcy5wdXNoKGxpc3RPZkZpZWxkcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFycmF5T2ZPdXRwdXRSZWNvcmRzOworCX07CisJdGhpcy5sb2FkRGF0YVByb3ZpZGVyRnJvbUZpbGVDb250ZW50cyA9IGZ1bmN0aW9uIChkYXRhUHJvdmlkZXIsIGNzdkZpbGVDb250ZW50cykgeworCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShkYXRhUHJvdmlkZXIsIGRvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZSk7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGNzdkZpbGVDb250ZW50cywgU3RyaW5nKTsKKwkJdmFyIGFycmF5T2ZBcnJheXMgPSB0aGlzLmdldEFycmF5U3RydWN0dXJlRnJvbUNzdkZpbGVDb250ZW50cyhjc3ZGaWxlQ29udGVudHMpOworCQlpZiAoYXJyYXlPZkFycmF5cykgeworCQkJdmFyIGFycmF5T2ZLZXlzID0gYXJyYXlPZkFycmF5c1swXTsKKwkJCWZvciAodmFyIGkgPSAxOyBpIDwgYXJyYXlPZkFycmF5cy5sZW5ndGg7ICsraSkgeworCQkJCXZhciByb3cgPSBhcnJheU9mQXJyYXlzW2ldOworCQkJCXZhciBpdGVtID0gZGF0YVByb3ZpZGVyLmdldE5ld0l0ZW1Ub0xvYWQoKTsKKwkJCQlmb3IgKHZhciBqIGluIHJvdykgeworCQkJCQl2YXIgdmFsdWUgPSByb3dbal07CisJCQkJCXZhciBrZXkgPSBhcnJheU9mS2V5c1tqXTsKKwkJCQkJaXRlbS5sb2FkKGtleSwgdmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisJdGhpcy5nZXRDc3ZTdHJpbmdGcm9tUmVzdWx0U2V0ID0gZnVuY3Rpb24gKHJlc3VsdFNldCkgeworCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0YS5vbGQuZm9ybWF0LkNzdi5nZXRDc3ZTdHJpbmdGcm9tUmVzdWx0U2V0Iik7CisJCXZhciBjc3ZTdHJpbmcgPSBudWxsOworCQlyZXR1cm4gY3N2U3RyaW5nOworCX07Cit9KCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9mb3JtYXQvSnNvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9mb3JtYXQvSnNvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmMyZTZhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL2Zvcm1hdC9Kc29uLmpzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5vbGQuZm9ybWF0Lkpzb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFzc2VydCIpOworZG9qby5kYXRhLm9sZC5mb3JtYXQuSnNvbiA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5sb2FkRGF0YVByb3ZpZGVyRnJvbUZpbGVDb250ZW50cyA9IGZ1bmN0aW9uIChkYXRhUHJvdmlkZXIsIGpzb25GaWxlQ29udGVudHMpIHsKKwkJZG9qby5sYW5nLmFzc2VydFR5cGUoZGF0YVByb3ZpZGVyLCBkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UpOworCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShqc29uRmlsZUNvbnRlbnRzLCBTdHJpbmcpOworCQl2YXIgYXJyYXlPZkpzb25EYXRhID0gZXZhbCgiKCIgKyBqc29uRmlsZUNvbnRlbnRzICsgIikiKTsKKwkJdGhpcy5sb2FkRGF0YVByb3ZpZGVyRnJvbUFycmF5T2ZKc29uRGF0YShkYXRhUHJvdmlkZXIsIGFycmF5T2ZKc29uRGF0YSk7CisJfTsKKwl0aGlzLmxvYWREYXRhUHJvdmlkZXJGcm9tQXJyYXlPZkpzb25EYXRhID0gZnVuY3Rpb24gKGRhdGFQcm92aWRlciwgYXJyYXlPZkpzb25EYXRhKSB7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGFycmF5T2ZKc29uRGF0YSwgQXJyYXksIHtvcHRpb25hbDp0cnVlfSk7CisJCWlmIChhcnJheU9mSnNvbkRhdGEgJiYgKGFycmF5T2ZKc29uRGF0YS5sZW5ndGggPiAwKSkgeworCQkJdmFyIGZpcnN0Um93ID0gYXJyYXlPZkpzb25EYXRhWzBdOworCQkJZG9qby5sYW5nLmFzc2VydFR5cGUoZmlyc3RSb3csIFtBcnJheSwgInB1cmVvYmplY3QiXSk7CisJCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkoZmlyc3RSb3cpKSB7CisJCQkJX2xvYWREYXRhUHJvdmlkZXJGcm9tQXJyYXlPZkFycmF5cyhkYXRhUHJvdmlkZXIsIGFycmF5T2ZKc29uRGF0YSk7CisJCQl9IGVsc2UgeworCQkJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGZpcnN0Um93LCAicHVyZW9iamVjdCIpOworCQkJCV9sb2FkRGF0YVByb3ZpZGVyRnJvbUFycmF5T2ZPYmplY3RzKGRhdGFQcm92aWRlciwgYXJyYXlPZkpzb25EYXRhKTsKKwkJCX0KKwkJfQorCX07CisJdGhpcy5nZXRKc29uU3RyaW5nRnJvbVJlc3VsdFNldCA9IGZ1bmN0aW9uIChyZXN1bHRTZXQpIHsKKwkJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLmZvcm1hdC5Kc29uLmdldEpzb25TdHJpbmdGcm9tUmVzdWx0U2V0Iik7CisJCXZhciBqc29uU3RyaW5nID0gbnVsbDsKKwkJcmV0dXJuIGpzb25TdHJpbmc7CisJfTsKKwlmdW5jdGlvbiBfbG9hZERhdGFQcm92aWRlckZyb21BcnJheU9mQXJyYXlzKGRhdGFQcm92aWRlciwgYXJyYXlPZkpzb25EYXRhKSB7CisJCXZhciBhcnJheU9mS2V5cyA9IGFycmF5T2ZKc29uRGF0YVswXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcnJheU9mSnNvbkRhdGEubGVuZ3RoOyArK2kpIHsKKwkJCXZhciByb3cgPSBhcnJheU9mSnNvbkRhdGFbaV07CisJCQl2YXIgaXRlbSA9IGRhdGFQcm92aWRlci5nZXROZXdJdGVtVG9Mb2FkKCk7CisJCQlmb3IgKHZhciBqIGluIHJvdykgeworCQkJCXZhciB2YWx1ZSA9IHJvd1tqXTsKKwkJCQl2YXIga2V5ID0gYXJyYXlPZktleXNbal07CisJCQkJaXRlbS5sb2FkKGtleSwgdmFsdWUpOworCQkJfQorCQl9CisJfQorCWZ1bmN0aW9uIF9sb2FkRGF0YVByb3ZpZGVyRnJvbUFycmF5T2ZPYmplY3RzKGRhdGFQcm92aWRlciwgYXJyYXlPZkpzb25EYXRhKSB7CisJCWZvciAodmFyIGkgaW4gYXJyYXlPZkpzb25EYXRhKSB7CisJCQl2YXIgcm93ID0gYXJyYXlPZkpzb25EYXRhW2ldOworCQkJdmFyIGl0ZW0gPSBkYXRhUHJvdmlkZXIuZ2V0TmV3SXRlbVRvTG9hZCgpOworCQkJZm9yICh2YXIga2V5IGluIHJvdykgeworCQkJCXZhciB2YWx1ZSA9IHJvd1trZXldOworCQkJCWlmIChkb2pvLmxhbmcuaXNBcnJheSh2YWx1ZSkpIHsKKwkJCQkJdmFyIGFycmF5T2ZWYWx1ZXMgPSB2YWx1ZTsKKwkJCQkJZm9yICh2YXIgaiBpbiBhcnJheU9mVmFsdWVzKSB7CisJCQkJCQl2YWx1ZSA9IGFycmF5T2ZWYWx1ZXNbal07CisJCQkJCQlpdGVtLmxvYWQoa2V5LCB2YWx1ZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpdGVtLmxvYWQoa2V5LCB2YWx1ZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvQmFzZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9wcm92aWRlci9CYXNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvQmFzZS5qcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZSA9IGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9jb3VudE9mTmVzdGVkVHJhbnNhY3Rpb25zID0gMDsKKwl0aGlzLl9jaGFuZ2VzSW5DdXJyZW50VHJhbnNhY3Rpb24gPSBudWxsOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUuYmVnaW5UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fY291bnRPZk5lc3RlZFRyYW5zYWN0aW9ucyA9PT0gMCkgeworCQl0aGlzLl9jaGFuZ2VzSW5DdXJyZW50VHJhbnNhY3Rpb24gPSBbXTsKKwl9CisJdGhpcy5fY291bnRPZk5lc3RlZFRyYW5zYWN0aW9ucyArPSAxOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUuZW5kVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7CisJdGhpcy5fY291bnRPZk5lc3RlZFRyYW5zYWN0aW9ucyAtPSAxOworCWRvam8ubGFuZy5hc3NlcnQodGhpcy5fY291bnRPZk5lc3RlZFRyYW5zYWN0aW9ucyA+PSAwKTsKKwlpZiAodGhpcy5fY291bnRPZk5lc3RlZFRyYW5zYWN0aW9ucyA9PT0gMCkgeworCQl2YXIgbGlzdE9mQ2hhbmdlc01hZGUgPSB0aGlzLl9zYXZlQ2hhbmdlcygpOworCQl0aGlzLl9jaGFuZ2VzSW5DdXJyZW50VHJhbnNhY3Rpb24gPSBudWxsOworCQlpZiAobGlzdE9mQ2hhbmdlc01hZGUubGVuZ3RoID4gMCkgeworCQkJdGhpcy5fbm90aWZ5T2JzZXJ2ZXJzT2ZDaGFuZ2VzKGxpc3RPZkNoYW5nZXNNYWRlKTsKKwkJfQorCX0KK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UucHJvdG90eXBlLmdldE5ld0l0ZW1Ub0xvYWQgPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX25ld0l0ZW0oKTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UucHJvdG90eXBlLm5ld0l0ZW0gPSBmdW5jdGlvbiAoaXRlbU5hbWUpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShpdGVtTmFtZSwgU3RyaW5nLCB7b3B0aW9uYWw6dHJ1ZX0pOworCXZhciBpdGVtID0gdGhpcy5fbmV3SXRlbSgpOworCWlmIChpdGVtTmFtZSkgeworCQlpdGVtLnNldCgibmFtZSIsIGl0ZW1OYW1lKTsKKwl9CisJcmV0dXJuIGl0ZW07Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5uZXdBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlSWQpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhdHRyaWJ1dGVJZCwgU3RyaW5nLCB7b3B0aW9uYWw6dHJ1ZX0pOworCXZhciBhdHRyaWJ1dGUgPSB0aGlzLl9uZXdBdHRyaWJ1dGUoYXR0cmlidXRlSWQpOworCXJldHVybiBhdHRyaWJ1dGU7Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlSWQpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZSIpOworCXZhciBhdHRyaWJ1dGU7CisJcmV0dXJuIGF0dHJpYnV0ZTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UucHJvdG90eXBlLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UiKTsKKwlyZXR1cm4gdGhpcy5fYXJyYXlPZkF0dHJpYnV0ZXM7Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5mZXRjaEFycmF5ID0gZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlIik7CisJcmV0dXJuIFtdOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUuZmV0Y2hSZXN1bHRTZXQgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UiKTsKKwl2YXIgcmVzdWx0U2V0OworCXJldHVybiByZXN1bHRTZXQ7Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5ub3RlQ2hhbmdlID0gZnVuY3Rpb24gKGl0ZW0sIGF0dHJpYnV0ZSwgdmFsdWUpIHsKKwl2YXIgY2hhbmdlID0ge2l0ZW06aXRlbSwgYXR0cmlidXRlOmF0dHJpYnV0ZSwgdmFsdWU6dmFsdWV9OworCWlmICh0aGlzLl9jb3VudE9mTmVzdGVkVHJhbnNhY3Rpb25zID09PSAwKSB7CisJCXRoaXMuYmVnaW5UcmFuc2FjdGlvbigpOworCQl0aGlzLl9jaGFuZ2VzSW5DdXJyZW50VHJhbnNhY3Rpb24ucHVzaChjaGFuZ2UpOworCQl0aGlzLmVuZFRyYW5zYWN0aW9uKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5fY2hhbmdlc0luQ3VycmVudFRyYW5zYWN0aW9uLnB1c2goY2hhbmdlKTsKKwl9Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5hZGRJdGVtT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoaXRlbSwgb2JzZXJ2ZXIpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShpdGVtLCBkb2pvLmRhdGEub2xkLkl0ZW0pOworCWl0ZW0uYWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUucmVtb3ZlSXRlbU9ic2VydmVyID0gZnVuY3Rpb24gKGl0ZW0sIG9ic2VydmVyKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoaXRlbSwgZG9qby5kYXRhLm9sZC5JdGVtKTsKKwlpdGVtLnJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UucHJvdG90eXBlLl9uZXdJdGVtID0gZnVuY3Rpb24gKCkgeworCXZhciBpdGVtID0gbmV3IGRvam8uZGF0YS5vbGQuSXRlbSh0aGlzKTsKKwlyZXR1cm4gaXRlbTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UucHJvdG90eXBlLl9uZXdBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlSWQpIHsKKwl2YXIgYXR0cmlidXRlID0gbmV3IGRvam8uZGF0YS5vbGQuQXR0cmlidXRlKHRoaXMpOworCXJldHVybiBhdHRyaWJ1dGU7Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5fc2F2ZUNoYW5nZXMgPSBmdW5jdGlvbiAoKSB7CisJdmFyIGFycmF5T2ZDaGFuZ2VzTWFkZSA9IHRoaXMuX2NoYW5nZXNJbkN1cnJlbnRUcmFuc2FjdGlvbjsKKwlyZXR1cm4gYXJyYXlPZkNoYW5nZXNNYWRlOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUuX25vdGlmeU9ic2VydmVyc09mQ2hhbmdlcyA9IGZ1bmN0aW9uIChhcnJheU9mQ2hhbmdlcykgeworCXZhciBhcnJheU9mUmVzdWx0U2V0cyA9IHRoaXMuX2dldFJlc3VsdFNldHMoKTsKKwlmb3IgKHZhciBpIGluIGFycmF5T2ZDaGFuZ2VzKSB7CisJCXZhciBjaGFuZ2UgPSBhcnJheU9mQ2hhbmdlc1tpXTsKKwkJdmFyIGNoYW5nZWRJdGVtID0gY2hhbmdlLml0ZW07CisJCXZhciBhcnJheU9mSXRlbU9ic2VydmVycyA9IGNoYW5nZWRJdGVtLmdldE9ic2VydmVycygpOworCQlmb3IgKHZhciBqIGluIGFycmF5T2ZJdGVtT2JzZXJ2ZXJzKSB7CisJCQl2YXIgb2JzZXJ2ZXIgPSBhcnJheU9mSXRlbU9ic2VydmVyc1tqXTsKKwkJCW9ic2VydmVyLm9ic2VydmVkT2JqZWN0SGFzQ2hhbmdlZChjaGFuZ2VkSXRlbSwgY2hhbmdlKTsKKwkJfQorCQlmb3IgKHZhciBrIGluIGFycmF5T2ZSZXN1bHRTZXRzKSB7CisJCQl2YXIgcmVzdWx0U2V0ID0gYXJyYXlPZlJlc3VsdFNldHNba107CisJCQl2YXIgYXJyYXlPZlJlc3VsdFNldE9ic2VydmVycyA9IHJlc3VsdFNldC5nZXRPYnNlcnZlcnMoKTsKKwkJCWZvciAodmFyIG0gaW4gYXJyYXlPZlJlc3VsdFNldE9ic2VydmVycykgeworCQkJCW9ic2VydmVyID0gYXJyYXlPZlJlc3VsdFNldE9ic2VydmVyc1ttXTsKKwkJCQlvYnNlcnZlci5vYnNlcnZlZE9iamVjdEhhc0NoYW5nZWQocmVzdWx0U2V0LCBjaGFuZ2UpOworCQkJfQorCQl9CisJfQorfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuQmFzZS5wcm90b3R5cGUuX2dldFJlc3VsdFNldHMgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UiKTsKKwlyZXR1cm4gW107Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvRGVsaWNpb3VzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL0RlbGljaW91cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA5YWIxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL0RlbGljaW91cy5qcwpAQCAtMCwwICsxLDMzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkRlbGljaW91cyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5vbGQuZm9ybWF0Lkpzb24iKTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRGVsaWNpb3VzID0gZnVuY3Rpb24gKCkgeworCWRvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUuY2FsbCh0aGlzKTsKKwlpZiAoRGVsaWNpb3VzICYmIERlbGljaW91cy5wb3N0cykgeworCQlkb2pvLmRhdGEub2xkLmZvcm1hdC5Kc29uLmxvYWREYXRhUHJvdmlkZXJGcm9tQXJyYXlPZkpzb25EYXRhKHRoaXMsIERlbGljaW91cy5wb3N0cyk7CisJfSBlbHNlIHsKKwl9CisJdmFyIHUgPSB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKCJ1Iik7CisJdmFyIGQgPSB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKCJkIik7CisJdmFyIHQgPSB0aGlzLnJlZ2lzdGVyQXR0cmlidXRlKCJ0Iik7CisJdS5sb2FkKCJuYW1lIiwgIkJvb2ttYXJrIik7CisJZC5sb2FkKCJuYW1lIiwgIkRlc2NyaXB0aW9uIik7CisJdC5sb2FkKCJuYW1lIiwgIlRhZ3MiKTsKKwl1LmxvYWQoInR5cGUiLCAiU3RyaW5nIik7CisJZC5sb2FkKCJ0eXBlIiwgIlN0cmluZyIpOworCXQubG9hZCgidHlwZSIsICJTdHJpbmciKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uZGF0YS5vbGQucHJvdmlkZXIuRGVsaWNpb3VzLCBkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL0ZsYXRGaWxlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL0ZsYXRGaWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjMyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvRmxhdEZpbGUuanMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5vbGQuSXRlbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEub2xkLkF0dHJpYnV0ZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEub2xkLlJlc3VsdFNldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEub2xkLmZvcm1hdC5Kc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0YS5vbGQuZm9ybWF0LkNzdiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXNzZXJ0Iik7Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlID0gZnVuY3Rpb24gKGtleXdvcmRQYXJhbWV0ZXJzKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoa2V5d29yZFBhcmFtZXRlcnMsICJwdXJlb2JqZWN0Iiwge29wdGlvbmFsOnRydWV9KTsKKwlkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UuY2FsbCh0aGlzKTsKKwl0aGlzLl9hcnJheU9mSXRlbXMgPSBbXTsKKwl0aGlzLl9yZXN1bHRTZXQgPSBudWxsOworCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZXMgPSB7fTsKKwlpZiAoa2V5d29yZFBhcmFtZXRlcnMpIHsKKwkJdmFyIGpzb25PYmplY3RzID0ga2V5d29yZFBhcmFtZXRlcnNbImpzb25PYmplY3RzIl07CisJCXZhciBqc29uU3RyaW5nID0ga2V5d29yZFBhcmFtZXRlcnNbImpzb25TdHJpbmciXTsKKwkJdmFyIGZpbGVVcmwgPSBrZXl3b3JkUGFyYW1ldGVyc1sidXJsIl07CisJCWlmIChqc29uT2JqZWN0cykgeworCQkJZG9qby5kYXRhLm9sZC5mb3JtYXQuSnNvbi5sb2FkRGF0YVByb3ZpZGVyRnJvbUFycmF5T2ZKc29uRGF0YSh0aGlzLCBqc29uT2JqZWN0cyk7CisJCX0KKwkJaWYgKGpzb25TdHJpbmcpIHsKKwkJCWRvam8uZGF0YS5vbGQuZm9ybWF0Lkpzb24ubG9hZERhdGFQcm92aWRlckZyb21GaWxlQ29udGVudHModGhpcywganNvblN0cmluZyk7CisJCX0KKwkJaWYgKGZpbGVVcmwpIHsKKwkJCXZhciBhcnJheU9mUGFydHMgPSBmaWxlVXJsLnNwbGl0KCIuIik7CisJCQl2YXIgbGFzdFBhcnQgPSBhcnJheU9mUGFydHNbKGFycmF5T2ZQYXJ0cy5sZW5ndGggLSAxKV07CisJCQl2YXIgZm9ybWF0UGFyc2VyID0gbnVsbDsKKwkJCWlmIChsYXN0UGFydCA9PSAianNvbiIpIHsKKwkJCQlmb3JtYXRQYXJzZXIgPSBkb2pvLmRhdGEub2xkLmZvcm1hdC5Kc29uOworCQkJfQorCQkJaWYgKGxhc3RQYXJ0ID09ICJjc3YiKSB7CisJCQkJZm9ybWF0UGFyc2VyID0gZG9qby5kYXRhLm9sZC5mb3JtYXQuQ3N2OworCQkJfQorCQkJaWYgKGZvcm1hdFBhcnNlcikgeworCQkJCXZhciBmaWxlQ29udGVudHMgPSBkb2pvLmhvc3RlbnYuZ2V0VGV4dChmaWxlVXJsKTsKKwkJCQlmb3JtYXRQYXJzZXIubG9hZERhdGFQcm92aWRlckZyb21GaWxlQ29udGVudHModGhpcywgZmlsZUNvbnRlbnRzKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9qby5sYW5nLmFzc2VydChmYWxzZSwgIm5ldyBkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlKHt1cmw6IH0pIHdhcyBwYXNzZWQgYSBmaWxlIHdpdGhvdXQgYSAuY3N2IG9yIC5qc29uIHN1ZmZpeCIpOworCQkJfQorCQl9CisJfQorfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5kYXRhLm9sZC5wcm92aWRlci5GbGF0RmlsZSwgZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlKTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUucHJvdG90eXBlLmdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gKGtleXdvcmQpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0VHlwZShrZXl3b3JkLCBTdHJpbmcsIHtvcHRpb25hbDp0cnVlfSk7CisJaWYgKCF0aGlzLl9vdXJDYXBhYmlsaXRpZXMpIHsKKwkJdGhpcy5fb3VyQ2FwYWJpbGl0aWVzID0ge3RyYW5zYWN0aW9uczpmYWxzZSwgdW5kbzpmYWxzZSwgbG9naW46ZmFsc2UsIHZlcnNpb25pbmc6ZmFsc2UsIGFub255bW91c1JlYWQ6dHJ1ZSwgYW5vbnltb3VzV3JpdGU6ZmFsc2UsIHBlcm1pc3Npb25zOmZhbHNlLCBxdWVyaWVzOmZhbHNlLCBzdHJvbmdUeXBpbmc6ZmFsc2UsIGRhdGF0eXBlczpbU3RyaW5nLCBEYXRlLCBOdW1iZXJdfTsKKwl9CisJaWYgKGtleXdvcmQpIHsKKwkJcmV0dXJuIHRoaXMuX291ckNhcGFiaWxpdGllc1trZXl3b3JkXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5fb3VyQ2FwYWJpbGl0aWVzOworCX0KK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlLnByb3RvdHlwZS5yZWdpc3RlckF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCkgeworCXZhciByZWdpc3RlcmVkQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlSWQpOworCWlmICghcmVnaXN0ZXJlZEF0dHJpYnV0ZSkgeworCQl2YXIgbmV3QXR0cmlidXRlID0gbmV3IGRvam8uZGF0YS5vbGQuQXR0cmlidXRlKHRoaXMsIGF0dHJpYnV0ZUlkKTsKKwkJdGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlc1thdHRyaWJ1dGVJZF0gPSBuZXdBdHRyaWJ1dGU7CisJCXJlZ2lzdGVyZWRBdHRyaWJ1dGUgPSBuZXdBdHRyaWJ1dGU7CisJfQorCXJldHVybiByZWdpc3RlcmVkQXR0cmlidXRlOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUucHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVJZCkgeworCXZhciBhdHRyaWJ1dGUgPSAodGhpcy5fZGljdGlvbmFyeU9mQXR0cmlidXRlc1thdHRyaWJ1dGVJZF0gfHwgbnVsbCk7CisJcmV0dXJuIGF0dHJpYnV0ZTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkgeworCXZhciBhcnJheU9mQXR0cmlidXRlcyA9IFtdOworCWZvciAodmFyIGtleSBpbiB0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVzKSB7CisJCXZhciBhdHRyaWJ1dGUgPSB0aGlzLl9kaWN0aW9uYXJ5T2ZBdHRyaWJ1dGVzW2tleV07CisJCWFycmF5T2ZBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTsKKwl9CisJcmV0dXJuIGFycmF5T2ZBdHRyaWJ1dGVzOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUucHJvdG90eXBlLmZldGNoQXJyYXkgPSBmdW5jdGlvbiAocXVlcnkpIHsKKwlyZXR1cm4gdGhpcy5fYXJyYXlPZkl0ZW1zOworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUucHJvdG90eXBlLmZldGNoUmVzdWx0U2V0ID0gZnVuY3Rpb24gKHF1ZXJ5KSB7CisJaWYgKCF0aGlzLl9yZXN1bHRTZXQpIHsKKwkJdGhpcy5fcmVzdWx0U2V0ID0gbmV3IGRvam8uZGF0YS5vbGQuUmVzdWx0U2V0KHRoaXMsIHRoaXMuZmV0Y2hBcnJheShxdWVyeSkpOworCX0KKwlyZXR1cm4gdGhpcy5fcmVzdWx0U2V0OworfTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuRmxhdEZpbGUucHJvdG90eXBlLl9uZXdJdGVtID0gZnVuY3Rpb24gKCkgeworCXZhciBpdGVtID0gbmV3IGRvam8uZGF0YS5vbGQuSXRlbSh0aGlzKTsKKwl0aGlzLl9hcnJheU9mSXRlbXMucHVzaChpdGVtKTsKKwlyZXR1cm4gaXRlbTsKK307Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkZsYXRGaWxlLnByb3RvdHlwZS5fbmV3QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZUlkKSB7CisJZG9qby5sYW5nLmFzc2VydFR5cGUoYXR0cmlidXRlSWQsIFN0cmluZyk7CisJZG9qby5sYW5nLmFzc2VydCh0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVJZCkgPT09IG51bGwpOworCXZhciBhdHRyaWJ1dGUgPSBuZXcgZG9qby5kYXRhLm9sZC5BdHRyaWJ1dGUodGhpcywgYXR0cmlidXRlSWQpOworCXRoaXMuX2RpY3Rpb25hcnlPZkF0dHJpYnV0ZXNbYXR0cmlidXRlSWRdID0gYXR0cmlidXRlOworCXJldHVybiBhdHRyaWJ1dGU7Cit9OworZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlLnByb3RvdHlwZS5fZ2V0UmVzdWx0U2V0cyA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gW3RoaXMuX3Jlc3VsdFNldF07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvSm90U3BvdC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRhL29sZC9wcm92aWRlci9Kb3RTcG90LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZThmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvSm90U3BvdC5qcwpAQCAtMCwwICsxLDE5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkpvdFNwb3QiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlIik7Citkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkpvdFNwb3QgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkpvdFNwb3QiKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uZGF0YS5vbGQucHJvdmlkZXIuSm90U3BvdCwgZG9qby5kYXRhLm9sZC5wcm92aWRlci5CYXNlKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL015U3FsLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3Byb3ZpZGVyL015U3FsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGJhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvcHJvdmlkZXIvTXlTcWwuanMKQEAgLTAsMCArMSwxOSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRhLm9sZC5wcm92aWRlci5NeVNxbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UiKTsKK2Rvam8uZGF0YS5vbGQucHJvdmlkZXIuTXlTcWwgPSBmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGEub2xkLnByb3ZpZGVyLk15U3FsIik7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRhdGEub2xkLnByb3ZpZGVyLk15U3FsLCBkb2pvLmRhdGEub2xkLnByb3ZpZGVyLkJhc2UpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0YS9vbGQvdG9fZG8udHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3RvX2RvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcwNWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGEvb2xkL3RvX2RvLnR4dApAQCAtMCwwICsxLDQ1IEBACitFeGlzdGluZyBGZWF0dXJlcworICogY2FuIGltcG9ydCBkYXRhIGZyb20gLmpzb24gb3IgLmNzdiBmb3JtYXQgZmlsZXMKKyAqIGNhbiBpbXBvcnQgZGF0YSBmcm9tIGRlbC5pY2lvLnVzCisgKiBjYW4gY3JlYXRlIGFuZCBtb2RpZnkgZGF0YSBwcm9ncmFtbWF0aWNhbGx5CisgKiBjYW4gYmluZCBkYXRhIHRvIGRvam8ud2lkZ2V0LkNoYXJ0CisgKiBjYW4gYmluZCBkYXRhIHRvIGRvam8ud2lkZ2V0LlNvcnRhYmxlVGFibGUKKyAqIGNhbiBiaW5kIG9uZSBkYXRhIHNldCB0byBtdWx0aXBsZSB3aWRnZXRzCisgKiBub3RpZmljYXRpb25zOiB3aWRnZXRzIGFyZSBub3RpZmllZCB3aGVuIGRhdGEgY2hhbmdlcworICogbm90aWZpY2F0aW9uIGF2YWlsYWJsZSBwZXItaXRlbSBvciBwZXItcmVzdWx0U2V0CisgKiBjYW4gY3JlYXRlIGFkLWhvYyBhdHRyaWJ1dGVzCisgKiBhdHRyaWJ1dGVzIGNhbiBiZSBsb29zZWx5LXR5cGVkIAorICogYXR0cmlidXRlcyBjYW4gaGF2ZSBtZXRhLWRhdGEgbGlrZSB0eXBlIGFuZCBkaXNwbGF5IG5hbWUKKyAqIGhhbGYtaW1wbGVtZW50ZWQgc3VwcG9ydCBmb3Igc29ydGluZworICogaGFsZi1pbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBleHBvcnQgdG8gLmpzb24KKyAqIEFQSSBmb3IgZ2V0dGluZyBkYXRhIGluIHNpbXBsZSBhcnJheXMgCisgKiBBUEkgZm9yIGdldHRpbmcgUmVzdWx0U2V0cyB3aXRoIGl0ZXJhdG9ycyAocHJlY3Vyc29yIHRvIHN1cHBvcnQgZm9yIHNvbWV0aGluZyBsaWtlIHRoZSBvcGVucmljby5vcmcgbGl2ZSBncmlkKQorIAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUby1EbyBMaXN0CisgKiBiZSBhYmxlIHRvIGltcG9ydCBkYXRhIGZyb20gYW4gaHRtbCA8dGFibGU+PC90YWJsZT4KKyAqIHRoaW5rIGFib3V0IGJlaW5nIGFibGUgdG8gaW1wb3J0IGRhdGEgZnJvbSBzb21lIHR5cGUgb2YgWE1MIAorICogdGhpbmsgYWJvdXQgaW50ZWdyYXRpb24gd2l0aCBkb2pvLnVuZG8uTWFuYWdlcgorICogdGhpbmsgbW9yZSBhYm91dCBob3cgdG8gcmVwcmVzZW50IHRoZSBub3Rpb24gb2YgZGlmZmVyZW50IGRhdGEgdHlwZXMKKyAqIHRoaW5rIGFib3V0IHdoYXQgcHJvYmxlbXMgd2UnbGwgcnVuIGludG8gd2hlbiB3ZSBoYXZlIGEgTXlTUUwgZGF0YSBwcm92aWRlcgorICogaW4gVGFibGVCaW5kaW5nSGFjaywgaW1wcm92ZSBzdXBwb3J0IGZvciBkYXRhIHR5cGVzIGluIHRoZSBTb3J0YWJsZVRhYmxlIGJpbmRpbmcKKyAqIGRlYWwgd2l0aCBpZHMgKGluY2x1ZGluZyBNeVNRTCBtdWx0aS1maWVsZCBrZXlzKQorICogYWRkIHN1cHBvcnQgZm9yIGl0ZW0tcmVmZXJlbmNlczogIGVtcGxveWVlSXRlbS5zZXQoJ2RlcGFydG1lbnQnLCBkZXBhcnRtZW50SXRlbSk7CisgKiBkZWFsIHdpdGggQXR0cmlidXRlcyBhcyBpbnN0YW5jZXMgb2YgSXRlbXMsIG5vdCBqdXN0IHN1YmNsYXNzZXMgb2YgSXRlbXMKKyAqIHVuaXQgdGVzdHMgZm9yIGNvbXBhcmUvc29ydCBjb2RlCisgKiB1bml0IHRlc3RzIGZvciBldmVyeXRoaW5nCisgKiBpbXBsZW1lbnQgaXRlbS50b1N0cmluZygnanNvbicpIGFuZCBpdGVtLnRvU3RyaW5nKCd4bWwnKQorICogaW1wbGVtZW50IGRhdGFQcm92aWRlci5uZXdJdGVtKHtuYW1lOiAnZm9vJywgYWdlOiAyNn0pCisgKiBkZWFsIGJldHRlciB3aXRoIHRyYW5zYWN0aW9ucworICogYWRkIHN1cHBvcnQgZm9yIGRlbGV0aW5nIGl0ZW1zCisgKiBkb24ndCBzZW5kIG91dCBtdWx0aXBsZSBub3RpZmljYXRpb25zIHRvIHRoZSBzYW1lIG9ic2VydmVyCisgKiBkZWFsIHdpdGggaXRlbSB2ZXJzaW9ucworICogcHJvdG90eXBlIGEgWWFob28gZGF0YSBwcm92aWRlciAtLSBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLm5ldC9jb21tb24vanNvbi5odG1sCisgKiBwcm90b3R5cGUgYSBkYXRhIHByb3ZpZGVyIHRoYXQgZW5mb3JjZXMgc3Ryb25nIHR5cGluZworICogcHJvdG90eXBlIGEgZGF0YSBwcm92aWRlciB0aGF0IHByZXZlbnRzIGFkLWhvYyBhdHRyaWJ1dGVzCisgKiBwcm90b3R5cGUgYSBkYXRhIHByb3ZpZGVyIHRoYXQgZW5mb3JjZXMgc2luZ2xlLWtpbmQgaXRlbQorICogcHJvdG90eXBlIGEgZGF0YSBwcm92aWRlciB0aGF0IGFsbG93cyBmb3IgbG9naW4vYXV0aGVudGljYXRpb24KKyAqIGhhdmUgbG9vc2VseSB0eXBlZCByZXN1bHQgc2V0cyBwbGF5IG5pY2VseSB3aXRoIHdpZGdldHMgdGhhdCBleHBlY3Qgc3Ryb25nIHR5cGluZworICogcHJvdG90eXBlIGFuIGV4YW1wbGUgb2Ygc3ByZWFkc2hlZXQtc3R5bGUgZm9ybXVsYXMgb3IgZGVyaXZhdGlvbiBydWxlcworICogZXhwZXJpbWVudCB3aXRoIHNvbWUgc29ydCBvZiBmZXRjaCgpIHRoYXQgcmV0dXJucyBvbmx5IGEgc3Vic2V0IG9mIGEgZGF0YSBwcm92aWRlcidzIGl0ZW1zCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYzUxMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0ZSIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmRhdGUiLCAidXNlIG9uZSBvZiB0aGUgbW9kdWxlcyBpbiBkb2pvLmRhdGUuKiBpbnN0ZWFkIiwgIjAuNSIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0ZS9jb21tb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGF0ZS9jb21tb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyNDkwYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL2NvbW1vbi5qcwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRlLmNvbW1vbiIpOworZG9qby5kYXRlLnNldERheU9mWWVhciA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBkYXlPZlllYXIpIHsKKwlkYXRlT2JqZWN0LnNldE1vbnRoKDApOworCWRhdGVPYmplY3Quc2V0RGF0ZShkYXlPZlllYXIpOworCXJldHVybiBkYXRlT2JqZWN0OworfTsKK2Rvam8uZGF0ZS5nZXREYXlPZlllYXIgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCkgeworCXZhciBmdWxsWWVhciA9IGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKTsKKwl2YXIgbGFzdERheU9mUHJldlllYXIgPSBuZXcgRGF0ZShmdWxsWWVhciAtIDEsIDExLCAzMSk7CisJcmV0dXJuIE1hdGguZmxvb3IoKGRhdGVPYmplY3QuZ2V0VGltZSgpIC0gbGFzdERheU9mUHJldlllYXIuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKTsKK307Citkb2pvLmRhdGUuc2V0V2Vla09mWWVhciA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCB3ZWVrLCBmaXJzdERheSkgeworCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKwkJZmlyc3REYXkgPSAwOworCX0KKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0ZS5zZXRXZWVrT2ZZZWFyIik7Cit9OworZG9qby5kYXRlLmdldFdlZWtPZlllYXIgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgZmlyc3REYXkpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisJCWZpcnN0RGF5ID0gMDsKKwl9CisJdmFyIGZpcnN0RGF5T2ZZZWFyID0gbmV3IERhdGUoZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpLCAwLCAxKTsKKwl2YXIgZGF5ID0gZmlyc3REYXlPZlllYXIuZ2V0RGF5KCk7CisJZmlyc3REYXlPZlllYXIuc2V0RGF0ZShmaXJzdERheU9mWWVhci5nZXREYXRlKCkgLSBkYXkgKyBmaXJzdERheSAtIChkYXkgPiBmaXJzdERheSA/IDcgOiAwKSk7CisJcmV0dXJuIE1hdGguZmxvb3IoKGRhdGVPYmplY3QuZ2V0VGltZSgpIC0gZmlyc3REYXlPZlllYXIuZ2V0VGltZSgpKSAvIDYwNDgwMDAwMCk7Cit9OworZG9qby5kYXRlLnNldElzb1dlZWtPZlllYXIgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgd2VlaywgZmlyc3REYXkpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisJCWZpcnN0RGF5ID0gMTsKKwl9CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUuc2V0SXNvV2Vla09mWWVhciIpOworfTsKK2Rvam8uZGF0ZS5nZXRJc29XZWVrT2ZZZWFyID0gZnVuY3Rpb24gKGRhdGVPYmplY3QsIGZpcnN0RGF5KSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQlmaXJzdERheSA9IDE7CisJfQorCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRlLmdldElzb1dlZWtPZlllYXIiKTsKK307Citkb2pvLmRhdGUuc2hvcnRUaW1lem9uZXMgPSBbIklETFciLCAiQkVUIiwgIkhTVCIsICJNQVJUIiwgIkFLU1QiLCAiUFNUIiwgIk1TVCIsICJDU1QiLCAiRVNUIiwgIkFTVCIsICJORlQiLCAiQlNUIiwgIkZTVCIsICJBVCIsICJHTVQiLCAiQ0VUIiwgIkVFVCIsICJNU0siLCAiSVJUIiwgIkdTVCIsICJBRlQiLCAiQUdUVCIsICJJU1QiLCAiTlBUIiwgIkFMTVQiLCAiTU1UIiwgIkpUIiwgIkFXU1QiLCAiSlNUIiwgIkFDU1QiLCAiQUVTVCIsICJMSFNUIiwgIlZVVCIsICJORlQiLCAiTlpUIiwgIkNIQVNUIiwgIlBIT1QiLCAiTElOVCJdOworZG9qby5kYXRlLnRpbWV6b25lT2Zmc2V0cyA9IFstNzIwLCAtNjYwLCAtNjAwLCAtNTcwLCAtNTQwLCAtNDgwLCAtNDIwLCAtMzYwLCAtMzAwLCAtMjQwLCAtMjEwLCAtMTgwLCAtMTIwLCAtNjAsIDAsIDYwLCAxMjAsIDE4MCwgMjEwLCAyNDAsIDI3MCwgMzAwLCAzMzAsIDM0NSwgMzYwLCAzOTAsIDQyMCwgNDgwLCA1NDAsIDU3MCwgNjAwLCA2MzAsIDY2MCwgNjkwLCA3MjAsIDc2NSwgNzgwLCA4NDBdOworZG9qby5kYXRlLmdldERheXNJbk1vbnRoID0gZnVuY3Rpb24gKGRhdGVPYmplY3QpIHsKKwl2YXIgbW9udGggPSBkYXRlT2JqZWN0LmdldE1vbnRoKCk7CisJdmFyIGRheXMgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CisJaWYgKG1vbnRoID09IDEgJiYgZG9qby5kYXRlLmlzTGVhcFllYXIoZGF0ZU9iamVjdCkpIHsKKwkJcmV0dXJuIDI5OworCX0gZWxzZSB7CisJCXJldHVybiBkYXlzW21vbnRoXTsKKwl9Cit9OworZG9qby5kYXRlLmlzTGVhcFllYXIgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCkgeworCXZhciB5ZWFyID0gZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpOworCXJldHVybiAoeWVhciAlIDQwMCA9PSAwKSA/IHRydWUgOiAoeWVhciAlIDEwMCA9PSAwKSA/IGZhbHNlIDogKHllYXIgJSA0ID09IDApID8gdHJ1ZSA6IGZhbHNlOworfTsKK2Rvam8uZGF0ZS5nZXRUaW1lem9uZU5hbWUgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCkgeworCXZhciBzdHIgPSBkYXRlT2JqZWN0LnRvU3RyaW5nKCk7CisJdmFyIHR6ID0gIiI7CisJdmFyIG1hdGNoOworCXZhciBwb3MgPSBzdHIuaW5kZXhPZigiKCIpOworCWlmIChwb3MgPiAtMSkgeworCQlwb3MrKzsKKwkJdHogPSBzdHIuc3Vic3RyaW5nKHBvcywgc3RyLmluZGV4T2YoIikiKSk7CisJfSBlbHNlIHsKKwkJdmFyIHBhdCA9IC8oW0EtWlwvXSspIFxkezR9JC87CisJCWlmICgobWF0Y2ggPSBzdHIubWF0Y2gocGF0KSkpIHsKKwkJCXR6ID0gbWF0Y2hbMV07CisJCX0gZWxzZSB7CisJCQlzdHIgPSBkYXRlT2JqZWN0LnRvTG9jYWxlU3RyaW5nKCk7CisJCQlwYXQgPSAvIChbQS1aXC9dKykkLzsKKwkJCWlmICgobWF0Y2ggPSBzdHIubWF0Y2gocGF0KSkpIHsKKwkJCQl0eiA9IG1hdGNoWzFdOworCQkJfQorCQl9CisJfQorCXJldHVybiB0eiA9PSAiQU0iIHx8IHR6ID09ICJQTSIgPyAiIiA6IHR6OworfTsKK2Rvam8uZGF0ZS5nZXRPcmRpbmFsID0gZnVuY3Rpb24gKGRhdGVPYmplY3QpIHsKKwl2YXIgZGF0ZSA9IGRhdGVPYmplY3QuZ2V0RGF0ZSgpOworCWlmIChkYXRlICUgMTAwICE9IDExICYmIGRhdGUgJSAxMCA9PSAxKSB7CisJCXJldHVybiAic3QiOworCX0gZWxzZSB7CisJCWlmIChkYXRlICUgMTAwICE9IDEyICYmIGRhdGUgJSAxMCA9PSAyKSB7CisJCQlyZXR1cm4gIm5kIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChkYXRlICUgMTAwICE9IDEzICYmIGRhdGUgJSAxMCA9PSAzKSB7CisJCQkJcmV0dXJuICJyZCI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAidGgiOworCQkJfQorCQl9CisJfQorfTsKK2Rvam8uZGF0ZS5jb21wYXJlVHlwZXMgPSB7REFURToxLCBUSU1FOjJ9OworZG9qby5kYXRlLmNvbXBhcmUgPSBmdW5jdGlvbiAoZGF0ZUEsIGRhdGVCLCBvcHRpb25zKSB7CisJdmFyIGRBID0gZGF0ZUE7CisJdmFyIGRCID0gZGF0ZUIgfHwgbmV3IERhdGUoKTsKKwl2YXIgbm93ID0gbmV3IERhdGUoKTsKKwl3aXRoIChkb2pvLmRhdGUuY29tcGFyZVR5cGVzKSB7CisJCXZhciBvcHQgPSBvcHRpb25zIHx8IChEQVRFIHwgVElNRSk7CisJCXZhciBkMSA9IG5ldyBEYXRlKChvcHQgJiBEQVRFKSA/IGRBLmdldEZ1bGxZZWFyKCkgOiBub3cuZ2V0RnVsbFllYXIoKSwgKG9wdCAmIERBVEUpID8gZEEuZ2V0TW9udGgoKSA6IG5vdy5nZXRNb250aCgpLCAob3B0ICYgREFURSkgPyBkQS5nZXREYXRlKCkgOiBub3cuZ2V0RGF0ZSgpLCAob3B0ICYgVElNRSkgPyBkQS5nZXRIb3VycygpIDogMCwgKG9wdCAmIFRJTUUpID8gZEEuZ2V0TWludXRlcygpIDogMCwgKG9wdCAmIFRJTUUpID8gZEEuZ2V0U2Vjb25kcygpIDogMCk7CisJCXZhciBkMiA9IG5ldyBEYXRlKChvcHQgJiBEQVRFKSA/IGRCLmdldEZ1bGxZZWFyKCkgOiBub3cuZ2V0RnVsbFllYXIoKSwgKG9wdCAmIERBVEUpID8gZEIuZ2V0TW9udGgoKSA6IG5vdy5nZXRNb250aCgpLCAob3B0ICYgREFURSkgPyBkQi5nZXREYXRlKCkgOiBub3cuZ2V0RGF0ZSgpLCAob3B0ICYgVElNRSkgPyBkQi5nZXRIb3VycygpIDogMCwgKG9wdCAmIFRJTUUpID8gZEIuZ2V0TWludXRlcygpIDogMCwgKG9wdCAmIFRJTUUpID8gZEIuZ2V0U2Vjb25kcygpIDogMCk7CisJfQorCWlmIChkMS52YWx1ZU9mKCkgPiBkMi52YWx1ZU9mKCkpIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChkMS52YWx1ZU9mKCkgPCBkMi52YWx1ZU9mKCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK307Citkb2pvLmRhdGUuZGF0ZVBhcnRzID0ge1lFQVI6MCwgTU9OVEg6MSwgREFZOjIsIEhPVVI6MywgTUlOVVRFOjQsIFNFQ09ORDo1LCBNSUxMSVNFQ09ORDo2LCBRVUFSVEVSOjcsIFdFRUs6OCwgV0VFS0RBWTo5fTsKK2Rvam8uZGF0ZS5hZGQgPSBmdW5jdGlvbiAoZHQsIGludGVydiwgaW5jcikgeworCWlmICh0eXBlb2YgZHQgPT0gIm51bWJlciIpIHsKKwkJZHQgPSBuZXcgRGF0ZShkdCk7CisJfQorCWZ1bmN0aW9uIGZpeE92ZXJzaG9vdCgpIHsKKwkJaWYgKHN1bS5nZXREYXRlKCkgPCBkdC5nZXREYXRlKCkpIHsKKwkJCXN1bS5zZXREYXRlKDApOworCQl9CisJfQorCXZhciBzdW0gPSBuZXcgRGF0ZShkdCk7CisJd2l0aCAoZG9qby5kYXRlLmRhdGVQYXJ0cykgeworCQlzd2l0Y2ggKGludGVydikgeworCQkgIGNhc2UgWUVBUjoKKwkJCXN1bS5zZXRGdWxsWWVhcihkdC5nZXRGdWxsWWVhcigpICsgaW5jcik7CisJCQlmaXhPdmVyc2hvb3QoKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgUVVBUlRFUjoKKwkJCWluY3IgKj0gMzsKKwkJICBjYXNlIE1PTlRIOgorCQkJc3VtLnNldE1vbnRoKGR0LmdldE1vbnRoKCkgKyBpbmNyKTsKKwkJCWZpeE92ZXJzaG9vdCgpOworCQkJYnJlYWs7CisJCSAgY2FzZSBXRUVLOgorCQkJaW5jciAqPSA3OworCQkgIGNhc2UgREFZOgorCQkJc3VtLnNldERhdGUoZHQuZ2V0RGF0ZSgpICsgaW5jcik7CisJCQlicmVhazsKKwkJICBjYXNlIFdFRUtEQVk6CisJCQl2YXIgZGF0ID0gZHQuZ2V0RGF0ZSgpOworCQkJdmFyIHdlZWtzID0gMDsKKwkJCXZhciBkYXlzID0gMDsKKwkJCXZhciBzdHJ0ID0gMDsKKwkJCXZhciB0cmd0ID0gMDsKKwkJCXZhciBhZGogPSAwOworCQkJdmFyIG1vZCA9IGluY3IgJSA1OworCQkJaWYgKG1vZCA9PSAwKSB7CisJCQkJZGF5cyA9IChpbmNyID4gMCkgPyA1IDogLTU7CisJCQkJd2Vla3MgPSAoaW5jciA+IDApID8gKChpbmNyIC0gNSkgLyA1KSA6ICgoaW5jciArIDUpIC8gNSk7CisJCQl9IGVsc2UgeworCQkJCWRheXMgPSBtb2Q7CisJCQkJd2Vla3MgPSBwYXJzZUludChpbmNyIC8gNSk7CisJCQl9CisJCQlzdHJ0ID0gZHQuZ2V0RGF5KCk7CisJCQlpZiAoc3RydCA9PSA2ICYmIGluY3IgPiAwKSB7CisJCQkJYWRqID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0cnQgPT0gMCAmJiBpbmNyIDwgMCkgeworCQkJCQlhZGogPSAtMTsKKwkJCQl9CisJCQl9CisJCQl0cmd0ID0gKHN0cnQgKyBkYXlzKTsKKwkJCWlmICh0cmd0ID09IDAgfHwgdHJndCA9PSA2KSB7CisJCQkJYWRqID0gKGluY3IgPiAwKSA/IDIgOiAtMjsKKwkJCX0KKwkJCXN1bS5zZXREYXRlKGRhdCArICg3ICogd2Vla3MpICsgZGF5cyArIGFkaik7CisJCQlicmVhazsKKwkJICBjYXNlIEhPVVI6CisJCQlzdW0uc2V0SG91cnMoc3VtLmdldEhvdXJzKCkgKyBpbmNyKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgTUlOVVRFOgorCQkJc3VtLnNldE1pbnV0ZXMoc3VtLmdldE1pbnV0ZXMoKSArIGluY3IpOworCQkJYnJlYWs7CisJCSAgY2FzZSBTRUNPTkQ6CisJCQlzdW0uc2V0U2Vjb25kcyhzdW0uZ2V0U2Vjb25kcygpICsgaW5jcik7CisJCQlicmVhazsKKwkJICBjYXNlIE1JTExJU0VDT05EOgorCQkJc3VtLnNldE1pbGxpc2Vjb25kcyhzdW0uZ2V0TWlsbGlzZWNvbmRzKCkgKyBpbmNyKTsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gc3VtOworfTsKK2Rvam8uZGF0ZS5kaWZmID0gZnVuY3Rpb24gKGR0QSwgZHRCLCBpbnRlcnYpIHsKKwlpZiAodHlwZW9mIGR0QSA9PSAibnVtYmVyIikgeworCQlkdEEgPSBuZXcgRGF0ZShkdEEpOworCX0KKwlpZiAodHlwZW9mIGR0QiA9PSAibnVtYmVyIikgeworCQlkdEIgPSBuZXcgRGF0ZShkdEIpOworCX0KKwl2YXIgeWVhRGlmZiA9IGR0Qi5nZXRGdWxsWWVhcigpIC0gZHRBLmdldEZ1bGxZZWFyKCk7CisJdmFyIG1vbkRpZmYgPSAoZHRCLmdldE1vbnRoKCkgLSBkdEEuZ2V0TW9udGgoKSkgKyAoeWVhRGlmZiAqIDEyKTsKKwl2YXIgbXNEaWZmID0gZHRCLmdldFRpbWUoKSAtIGR0QS5nZXRUaW1lKCk7CisJdmFyIHNlY0RpZmYgPSBtc0RpZmYgLyAxMDAwOworCXZhciBtaW5EaWZmID0gc2VjRGlmZiAvIDYwOworCXZhciBob3VEaWZmID0gbWluRGlmZiAvIDYwOworCXZhciBkYXlEaWZmID0gaG91RGlmZiAvIDI0OworCXZhciB3ZWVEaWZmID0gZGF5RGlmZiAvIDc7CisJdmFyIGRlbHRhID0gMDsKKwl3aXRoIChkb2pvLmRhdGUuZGF0ZVBhcnRzKSB7CisJCXN3aXRjaCAoaW50ZXJ2KSB7CisJCSAgY2FzZSBZRUFSOgorCQkJZGVsdGEgPSB5ZWFEaWZmOworCQkJYnJlYWs7CisJCSAgY2FzZSBRVUFSVEVSOgorCQkJdmFyIG1BID0gZHRBLmdldE1vbnRoKCk7CisJCQl2YXIgbUIgPSBkdEIuZ2V0TW9udGgoKTsKKwkJCXZhciBxQSA9IE1hdGguZmxvb3IobUEgLyAzKSArIDE7CisJCQl2YXIgcUIgPSBNYXRoLmZsb29yKG1CIC8gMykgKyAxOworCQkJcUIgKz0gKHllYURpZmYgKiA0KTsKKwkJCWRlbHRhID0gcUIgLSBxQTsKKwkJCWJyZWFrOworCQkgIGNhc2UgTU9OVEg6CisJCQlkZWx0YSA9IG1vbkRpZmY7CisJCQlicmVhazsKKwkJICBjYXNlIFdFRUs6CisJCQlkZWx0YSA9IHBhcnNlSW50KHdlZURpZmYpOworCQkJYnJlYWs7CisJCSAgY2FzZSBEQVk6CisJCQlkZWx0YSA9IGRheURpZmY7CisJCQlicmVhazsKKwkJICBjYXNlIFdFRUtEQVk6CisJCQl2YXIgZGF5cyA9IE1hdGgucm91bmQoZGF5RGlmZik7CisJCQl2YXIgd2Vla3MgPSBwYXJzZUludChkYXlzIC8gNyk7CisJCQl2YXIgbW9kID0gZGF5cyAlIDc7CisJCQlpZiAobW9kID09IDApIHsKKwkJCQlkYXlzID0gd2Vla3MgKiA1OworCQkJfSBlbHNlIHsKKwkJCQl2YXIgYWRqID0gMDsKKwkJCQl2YXIgYURheSA9IGR0QS5nZXREYXkoKTsKKwkJCQl2YXIgYkRheSA9IGR0Qi5nZXREYXkoKTsKKwkJCQl3ZWVrcyA9IHBhcnNlSW50KGRheXMgLyA3KTsKKwkJCQltb2QgPSBkYXlzICUgNzsKKwkJCQl2YXIgZHRNYXJrID0gbmV3IERhdGUoZHRBKTsKKwkJCQlkdE1hcmsuc2V0RGF0ZShkdE1hcmsuZ2V0RGF0ZSgpICsgKHdlZWtzICogNykpOworCQkJCXZhciBkYXlNYXJrID0gZHRNYXJrLmdldERheSgpOworCQkJCWlmIChkYXlEaWZmID4gMCkgeworCQkJCQlzd2l0Y2ggKHRydWUpIHsKKwkJCQkJICBjYXNlIGFEYXkgPT0gNjoKKwkJCQkJCWFkaiA9IC0xOworCQkJCQkJYnJlYWs7CisJCQkJCSAgY2FzZSBhRGF5ID09IDA6CisJCQkJCQlhZGogPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCSAgY2FzZSBiRGF5ID09IDY6CisJCQkJCQlhZGogPSAtMTsKKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgYkRheSA9PSAwOgorCQkJCQkJYWRqID0gLTI7CisJCQkJCQlicmVhazsKKwkJCQkJICBjYXNlIChkYXlNYXJrICsgbW9kKSA+IDU6CisJCQkJCQlhZGogPSAtMjsKKwkJCQkJCWJyZWFrOworCQkJCQkgIGRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChkYXlEaWZmIDwgMCkgeworCQkJCQkJc3dpdGNoICh0cnVlKSB7CisJCQkJCQkgIGNhc2UgYURheSA9PSA2OgorCQkJCQkJCWFkaiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGNhc2UgYURheSA9PSAwOgorCQkJCQkJCWFkaiA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGNhc2UgYkRheSA9PSA2OgorCQkJCQkJCWFkaiA9IDI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGNhc2UgYkRheSA9PSAwOgorCQkJCQkJCWFkaiA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGNhc2UgKGRheU1hcmsgKyBtb2QpIDwgMDoKKwkJCQkJCQlhZGogPSAyOworCQkJCQkJCWJyZWFrOworCQkJCQkJICBkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWRheXMgKz0gYWRqOworCQkJCWRheXMgLT0gKHdlZWtzICogMik7CisJCQl9CisJCQlkZWx0YSA9IGRheXM7CisJCQlicmVhazsKKwkJICBjYXNlIEhPVVI6CisJCQlkZWx0YSA9IGhvdURpZmY7CisJCQlicmVhazsKKwkJICBjYXNlIE1JTlVURToKKwkJCWRlbHRhID0gbWluRGlmZjsKKwkJCWJyZWFrOworCQkgIGNhc2UgU0VDT05EOgorCQkJZGVsdGEgPSBzZWNEaWZmOworCQkJYnJlYWs7CisJCSAgY2FzZSBNSUxMSVNFQ09ORDoKKwkJCWRlbHRhID0gbXNEaWZmOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBNYXRoLnJvdW5kKGRlbHRhKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL2Zvcm1hdC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL2Zvcm1hdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDcyMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGUvZm9ybWF0LmpzCkBAIC0wLDAgKzEsNzEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuZm9ybWF0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLnN1cHBsZW1lbnRhbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pMThuLmNvbW1vbiIpOworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCAiZ3JlZ29yaWFuIiwgbnVsbCwgImtvLHpoLWNuLHpoLHN2LGphLGVuLHpoLXR3LGl0LGh1LG5sLGZpLHpoLWhrLGZyLHB0LFJPT1QsZXMsZGUscHQtYnIiKTsKK2Rvam8ucmVxdWlyZUxvY2FsaXphdGlvbigiZG9qby5pMThuLmNhbGVuZGFyIiwgImdyZWdvcmlhbkV4dHJhcyIsIG51bGwsICJ6aCxST09ULGphIik7CisoZnVuY3Rpb24gKCkgeworCWRvam8uZGF0ZS5mb3JtYXQgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgb3B0aW9ucykgeworCQlpZiAodHlwZW9mIG9wdGlvbnMgPT0gInN0cmluZyIpIHsKKwkJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5kYXRlLmZvcm1hdCIsICJUbyBmb3JtYXQgZGF0ZXMgd2l0aCBQT1NJWC1zdHlsZSBzdHJpbmdzLCBwbGVhc2UgdXNlIGRvam8uZGF0ZS5zdHJmdGltZSBpbnN0ZWFkIiwgIjAuNSIpOworCQkJcmV0dXJuIGRvam8uZGF0ZS5zdHJmdGltZShkYXRlT2JqZWN0LCBvcHRpb25zKTsKKwkJfQorCQlmdW5jdGlvbiBmb3JtYXRQYXR0ZXJuKGRhdGVPYmplY3QsIHBhdHRlcm4pIHsKKwkJCXJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLyhbYS16XSlcMSovaWcsIGZ1bmN0aW9uIChtYXRjaCkgeworCQkJCXZhciBzOworCQkJCXZhciBjID0gbWF0Y2guY2hhckF0KDApOworCQkJCXZhciBsID0gbWF0Y2gubGVuZ3RoOworCQkJCXZhciBwYWQ7CisJCQkJdmFyIHdpZHRoTGlzdCA9IFsiYWJiciIsICJ3aWRlIiwgIm5hcnJvdyJdOworCQkJCXN3aXRjaCAoYykgeworCQkJCSAgY2FzZSAiRyI6CisJCQkJCWlmIChsID4gMykgeworCQkJCQkJZG9qby51bmltcGxlbWVudGVkKCJFcmEgZm9ybWF0IG5vdCBpbXBsZW1lbnRlZCIpOworCQkJCQl9CisJCQkJCXMgPSBpbmZvLmVyYXNbZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpIDwgMCA/IDEgOiAwXTsKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJ5IjoKKwkJCQkJcyA9IGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKTsKKwkJCQkJc3dpdGNoIChsKSB7CisJCQkJCSAgY2FzZSAxOgorCQkJCQkJYnJlYWs7CisJCQkJCSAgY2FzZSAyOgorCQkJCQkJcyA9IFN0cmluZyhzKS5zdWJzdHIoLTIpOworCQkJCQkJYnJlYWs7CisJCQkJCSAgZGVmYXVsdDoKKwkJCQkJCXBhZCA9IHRydWU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJRIjoKKwkJCQkgIGNhc2UgInEiOgorCQkJCQlzID0gTWF0aC5jZWlsKChkYXRlT2JqZWN0LmdldE1vbnRoKCkgKyAxKSAvIDMpOworCQkJCQlzd2l0Y2ggKGwpIHsKKwkJCQkJICBjYXNlIDE6CisJCQkJCSAgY2FzZSAyOgorCQkJCQkJcGFkID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgMzoKKwkJCQkJICBjYXNlIDQ6CisJCQkJCQlkb2pvLnVuaW1wbGVtZW50ZWQoIlF1YXJ0ZXIgZm9ybWF0IG5vdCBpbXBsZW1lbnRlZCIpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiTSI6CisJCQkJICBjYXNlICJMIjoKKwkJCQkJdmFyIG0gPSBkYXRlT2JqZWN0LmdldE1vbnRoKCk7CisJCQkJCXZhciB3aWR0aDsKKwkJCQkJc3dpdGNoIChsKSB7CisJCQkJCSAgY2FzZSAxOgorCQkJCQkgIGNhc2UgMjoKKwkJCQkJCXMgPSBtICsgMTsKKwkJCQkJCXBhZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJICBjYXNlIDM6CisJCQkJCSAgY2FzZSA0OgorCQkJCQkgIGNhc2UgNToKKwkJCQkJCXdpZHRoID0gd2lkdGhMaXN0W2wgLSAzXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmICh3aWR0aCkgeworCQkJCQkJdmFyIHR5cGUgPSAoYyA9PSAiTCIpID8gInN0YW5kYWxvbmUiIDogImZvcm1hdCI7CisJCQkJCQl2YXIgcHJvcCA9IFsibW9udGhzIiwgdHlwZSwgd2lkdGhdLmpvaW4oIi0iKTsKKwkJCQkJCXMgPSBpbmZvW3Byb3BdW21dOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAidyI6CisJCQkJCXZhciBmaXJzdERheSA9IDA7CisJCQkJCXMgPSBkb2pvLmRhdGUuZ2V0V2Vla09mWWVhcihkYXRlT2JqZWN0LCBmaXJzdERheSk7CisJCQkJCXBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiZCI6CisJCQkJCXMgPSBkYXRlT2JqZWN0LmdldERhdGUoKTsKKwkJCQkJcGFkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJEIjoKKwkJCQkJcyA9IGRvam8uZGF0ZS5nZXREYXlPZlllYXIoZGF0ZU9iamVjdCk7CisJCQkJCXBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiRSI6CisJCQkJICBjYXNlICJlIjoKKwkJCQkgIGNhc2UgImMiOgorCQkJCQl2YXIgZCA9IGRhdGVPYmplY3QuZ2V0RGF5KCk7CisJCQkJCXZhciB3aWR0aDsKKwkJCQkJc3dpdGNoIChsKSB7CisJCQkJCSAgY2FzZSAxOgorCQkJCQkgIGNhc2UgMjoKKwkJCQkJCWlmIChjID09ICJlIikgeworCQkJCQkJCXZhciBmaXJzdCA9IGRvam8uZGF0ZS5nZXRGaXJzdERheU9mV2VlayhvcHRpb25zLmxvY2FsZSk7CisJCQkJCQkJZCA9IChkIC0gZmlyc3QgKyA3KSAlIDc7CisJCQkJCQl9CisJCQkJCQlpZiAoYyAhPSAiYyIpIHsKKwkJCQkJCQlzID0gZCArIDE7CisJCQkJCQkJcGFkID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJICBjYXNlIDM6CisJCQkJCSAgY2FzZSA0OgorCQkJCQkgIGNhc2UgNToKKwkJCQkJCXdpZHRoID0gd2lkdGhMaXN0W2wgLSAzXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmICh3aWR0aCkgeworCQkJCQkJdmFyIHR5cGUgPSAoYyA9PSAiYyIpID8gInN0YW5kYWxvbmUiIDogImZvcm1hdCI7CisJCQkJCQl2YXIgcHJvcCA9IFsiZGF5cyIsIHR5cGUsIHdpZHRoXS5qb2luKCItIik7CisJCQkJCQlzID0gaW5mb1twcm9wXVtkXTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgImEiOgorCQkJCQl2YXIgdGltZVBlcmlvZCA9IChkYXRlT2JqZWN0LmdldEhvdXJzKCkgPCAxMikgPyAiYW0iIDogInBtIjsKKwkJCQkJcyA9IGluZm9bdGltZVBlcmlvZF07CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiaCI6CisJCQkJICBjYXNlICJIIjoKKwkJCQkgIGNhc2UgIksiOgorCQkJCSAgY2FzZSAiayI6CisJCQkJCXZhciBoID0gZGF0ZU9iamVjdC5nZXRIb3VycygpOworCQkJCQlzd2l0Y2ggKGMpIHsKKwkJCQkJICBjYXNlICJoIjoKKwkJCQkJCXMgPSAoaCAlIDEyKSB8fCAxMjsKKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgIkgiOgorCQkJCQkJcyA9IGg7CisJCQkJCQlicmVhazsKKwkJCQkJICBjYXNlICJLIjoKKwkJCQkJCXMgPSAoaCAlIDEyKTsKKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgImsiOgorCQkJCQkJcyA9IGggfHwgMjQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlwYWQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgIm0iOgorCQkJCQlzID0gZGF0ZU9iamVjdC5nZXRNaW51dGVzKCk7CisJCQkJCXBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAicyI6CisJCQkJCXMgPSBkYXRlT2JqZWN0LmdldFNlY29uZHMoKTsKKwkJCQkJcGFkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJTIjoKKwkJCQkJcyA9IE1hdGgucm91bmQoZGF0ZU9iamVjdC5nZXRNaWxsaXNlY29uZHMoKSAqIE1hdGgucG93KDEwLCBsIC0gMykpOworCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgInYiOgorCQkJCSAgY2FzZSAieiI6CisJCQkJCXMgPSBkb2pvLmRhdGUuZ2V0VGltZXpvbmVOYW1lKGRhdGVPYmplY3QpOworCQkJCQlpZiAocykgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbCA9IDQ7CisJCQkJICBjYXNlICJaIjoKKwkJCQkJdmFyIG9mZnNldCA9IGRhdGVPYmplY3QuZ2V0VGltZXpvbmVPZmZzZXQoKTsKKwkJCQkJdmFyIHR6ID0gWyhvZmZzZXQgPD0gMCA/ICIrIiA6ICItIiksIGRvam8uc3RyaW5nLnBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCksIDIpLCBkb2pvLnN0cmluZy5wYWQoTWF0aC5hYnMob2Zmc2V0KSAlIDYwLCAyKV07CisJCQkJCWlmIChsID09IDQpIHsKKwkJCQkJCXR6LnNwbGljZSgwLCAwLCAiR01UIik7CisJCQkJCQl0ei5zcGxpY2UoMywgMCwgIjoiKTsKKwkJCQkJfQorCQkJCQlzID0gdHouam9pbigiIik7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiWSI6CisJCQkJICBjYXNlICJ1IjoKKwkJCQkgIGNhc2UgIlciOgorCQkJCSAgY2FzZSAiRiI6CisJCQkJICBjYXNlICJnIjoKKwkJCQkgIGNhc2UgIkEiOgorCQkJCQlkb2pvLmRlYnVnKG1hdGNoICsgIiBtb2RpZmllciBub3QgeWV0IGltcGxlbWVudGVkIik7CisJCQkJCXMgPSAiPyI7CisJCQkJCWJyZWFrOworCQkJCSAgZGVmYXVsdDoKKwkJCQkJZG9qby5yYWlzZSgiZG9qby5kYXRlLmZvcm1hdDogaW52YWxpZCBwYXR0ZXJuIGNoYXI6ICIgKyBwYXR0ZXJuKTsKKwkJCQl9CisJCQkJaWYgKHBhZCkgeworCQkJCQlzID0gZG9qby5zdHJpbmcucGFkKHMsIGwpOworCQkJCX0KKwkJCQlyZXR1cm4gczsKKwkJCX0pOworCQl9CisJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCQl2YXIgbG9jYWxlID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShvcHRpb25zLmxvY2FsZSk7CisJCXZhciBmb3JtYXRMZW5ndGggPSBvcHRpb25zLmZvcm1hdExlbmd0aCB8fCAiZnVsbCI7CisJCXZhciBpbmZvID0gZG9qby5kYXRlLl9nZXRHcmVnb3JpYW5CdW5kbGUobG9jYWxlKTsKKwkJdmFyIHN0ciA9IFtdOworCQl2YXIgc2F1Y2UgPSBkb2pvLmxhbmcuY3VycnkodGhpcywgZm9ybWF0UGF0dGVybiwgZGF0ZU9iamVjdCk7CisJCWlmIChvcHRpb25zLnNlbGVjdG9yICE9ICJ0aW1lT25seSIpIHsKKwkJCXZhciBkYXRlUGF0dGVybiA9IG9wdGlvbnMuZGF0ZVBhdHRlcm4gfHwgaW5mb1siZGF0ZUZvcm1hdC0iICsgZm9ybWF0TGVuZ3RoXTsKKwkJCWlmIChkYXRlUGF0dGVybikgeworCQkJCXN0ci5wdXNoKF9wcm9jZXNzUGF0dGVybihkYXRlUGF0dGVybiwgc2F1Y2UpKTsKKwkJCX0KKwkJfQorCQlpZiAob3B0aW9ucy5zZWxlY3RvciAhPSAiZGF0ZU9ubHkiKSB7CisJCQl2YXIgdGltZVBhdHRlcm4gPSBvcHRpb25zLnRpbWVQYXR0ZXJuIHx8IGluZm9bInRpbWVGb3JtYXQtIiArIGZvcm1hdExlbmd0aF07CisJCQlpZiAodGltZVBhdHRlcm4pIHsKKwkJCQlzdHIucHVzaChfcHJvY2Vzc1BhdHRlcm4odGltZVBhdHRlcm4sIHNhdWNlKSk7CisJCQl9CisJCX0KKwkJdmFyIHJlc3VsdCA9IHN0ci5qb2luKCIgIik7CisJCXJldHVybiByZXN1bHQ7CisJfTsKKwlkb2pvLmRhdGUucGFyc2UgPSBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpIHsKKwkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisJCXZhciBsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKG9wdGlvbnMubG9jYWxlKTsKKwkJdmFyIGluZm8gPSBkb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZShsb2NhbGUpOworCQl2YXIgZm9ybWF0TGVuZ3RoID0gb3B0aW9ucy5mb3JtYXRMZW5ndGggfHwgImZ1bGwiOworCQlpZiAoIW9wdGlvbnMuc2VsZWN0b3IpIHsKKwkJCW9wdGlvbnMuc2VsZWN0b3IgPSAiZGF0ZU9ubHkiOworCQl9CisJCXZhciBkYXRlUGF0dGVybiA9IG9wdGlvbnMuZGF0ZVBhdHRlcm4gfHwgaW5mb1siZGF0ZUZvcm1hdC0iICsgZm9ybWF0TGVuZ3RoXTsKKwkJdmFyIHRpbWVQYXR0ZXJuID0gb3B0aW9ucy50aW1lUGF0dGVybiB8fCBpbmZvWyJ0aW1lRm9ybWF0LSIgKyBmb3JtYXRMZW5ndGhdOworCQl2YXIgcGF0dGVybjsKKwkJaWYgKG9wdGlvbnMuc2VsZWN0b3IgPT0gImRhdGVPbmx5IikgeworCQkJcGF0dGVybiA9IGRhdGVQYXR0ZXJuOworCQl9IGVsc2UgeworCQkJaWYgKG9wdGlvbnMuc2VsZWN0b3IgPT0gInRpbWVPbmx5IikgeworCQkJCXBhdHRlcm4gPSB0aW1lUGF0dGVybjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG9wdGlvbnMuc2VsZWN0b3IgPT0gImRhdGVUaW1lIikgeworCQkJCQlwYXR0ZXJuID0gZGF0ZVBhdHRlcm4gKyAiICIgKyB0aW1lUGF0dGVybjsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgbXNnID0gImRvam8uZGF0ZS5wYXJzZTogVW5rbm93biBzZWxlY3RvciBwYXJhbSBwYXNzZWQ6ICciICsgb3B0aW9ucy5zZWxlY3RvciArICInLiI7CisJCQkJCW1zZyArPSAiIERlZmF1bHRpbmcgdG8gZGF0ZSBwYXR0ZXJuLiI7CisJCQkJCWRvam8uZGVidWcobXNnKTsKKwkJCQkJcGF0dGVybiA9IGRhdGVQYXR0ZXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQl2YXIgZ3JvdXBzID0gW107CisJCXZhciBkYXRlUkVTdHJpbmcgPSBfcHJvY2Vzc1BhdHRlcm4ocGF0dGVybiwgZG9qby5sYW5nLmN1cnJ5KHRoaXMsIF9idWlsZERhdGVUaW1lUkUsIGdyb3VwcywgaW5mbywgb3B0aW9ucykpOworCQl2YXIgZGF0ZVJFID0gbmV3IFJlZ0V4cCgiXiIgKyBkYXRlUkVTdHJpbmcgKyAiJCIpOworCQl2YXIgbWF0Y2ggPSBkYXRlUkUuZXhlYyh2YWx1ZSk7CisJCWlmICghbWF0Y2gpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXZhciB3aWR0aExpc3QgPSBbImFiYnIiLCAid2lkZSIsICJuYXJyb3ciXTsKKwkJdmFyIHJlc3VsdCA9IG5ldyBEYXRlKDE5NzIsIDApOworCQl2YXIgZXhwZWN0ZWQgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykgeworCQkJdmFyIGdycCA9IGdyb3Vwc1tpIC0gMV07CisJCQl2YXIgbCA9IGdycC5sZW5ndGg7CisJCQl2YXIgdiA9IG1hdGNoW2ldOworCQkJc3dpdGNoIChncnAuY2hhckF0KDApKSB7CisJCQkgIGNhc2UgInkiOgorCQkJCWlmIChsICE9IDIpIHsKKwkJCQkJcmVzdWx0LnNldEZ1bGxZZWFyKHYpOworCQkJCQlleHBlY3RlZC55ZWFyID0gdjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodiA8IDEwMCkgeworCQkJCQkJdiA9IE51bWJlcih2KTsKKwkJCQkJCXZhciB5ZWFyID0gIiIgKyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7CisJCQkJCQl2YXIgY2VudHVyeSA9IHllYXIuc3Vic3RyaW5nKDAsIDIpICogMTAwOworCQkJCQkJdmFyIHllYXJQYXJ0ID0gTnVtYmVyKHllYXIuc3Vic3RyaW5nKDIsIDQpKTsKKwkJCQkJCXZhciBjdXRvZmYgPSBNYXRoLm1pbih5ZWFyUGFydCArIDIwLCA5OSk7CisJCQkJCQl2YXIgbnVtID0gKHYgPCBjdXRvZmYpID8gY2VudHVyeSArIHYgOiBjZW50dXJ5IC0gMTAwICsgdjsKKwkJCQkJCXJlc3VsdC5zZXRGdWxsWWVhcihudW0pOworCQkJCQkJZXhwZWN0ZWQueWVhciA9IG51bTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChvcHRpb25zLnN0cmljdCkgeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQkJcmVzdWx0LnNldEZ1bGxZZWFyKHYpOworCQkJCQkJZXhwZWN0ZWQueWVhciA9IHY7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgIk0iOgorCQkJCWlmIChsID4gMikgeworCQkJCQlpZiAoIW9wdGlvbnMuc3RyaWN0KSB7CisJCQkJCQl2ID0gdi5yZXBsYWNlKC9cLi9nLCAiIik7CisJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOworCQkJCQl9CisJCQkJCXZhciBtb250aHMgPSBpbmZvWyJtb250aHMtZm9ybWF0LSIgKyB3aWR0aExpc3RbbCAtIDNdXS5jb25jYXQoKTsKKwkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBtb250aHMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCWlmICghb3B0aW9ucy5zdHJpY3QpIHsKKwkJCQkJCQltb250aHNbal0gPSBtb250aHNbal0udG9Mb3dlckNhc2UoKTsKKwkJCQkJCX0KKwkJCQkJCWlmICh2ID09IG1vbnRoc1tqXSkgeworCQkJCQkJCXJlc3VsdC5zZXRNb250aChqKTsKKwkJCQkJCQlleHBlY3RlZC5tb250aCA9IGo7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGogPT0gbW9udGhzLmxlbmd0aCkgeworCQkJCQkJZG9qby5kZWJ1ZygiZG9qby5kYXRlLnBhcnNlOiBDb3VsZCBub3QgcGFyc2UgbW9udGggbmFtZTogJyIgKyB2ICsgIicuIik7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdC5zZXRNb250aCh2IC0gMSk7CisJCQkJCWV4cGVjdGVkLm1vbnRoID0gdiAtIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICBjYXNlICJFIjoKKwkJCSAgY2FzZSAiZSI6CisJCQkJaWYgKCFvcHRpb25zLnN0cmljdCkgeworCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOworCQkJCX0KKwkJCQl2YXIgZGF5cyA9IGluZm9bImRheXMtZm9ybWF0LSIgKyB3aWR0aExpc3RbbCAtIDNdXS5jb25jYXQoKTsKKwkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGRheXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJaWYgKCFvcHRpb25zLnN0cmljdCkgeworCQkJCQkJZGF5c1tqXSA9IGRheXNbal0udG9Mb3dlckNhc2UoKTsKKwkJCQkJfQorCQkJCQlpZiAodiA9PSBkYXlzW2pdKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaiA9PSBkYXlzLmxlbmd0aCkgeworCQkJCQlkb2pvLmRlYnVnKCJkb2pvLmRhdGUucGFyc2U6IENvdWxkIG5vdCBwYXJzZSB3ZWVrZGF5IG5hbWU6ICciICsgdiArICInLiIpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImQiOgorCQkJCXJlc3VsdC5zZXREYXRlKHYpOworCQkJCWV4cGVjdGVkLmRhdGUgPSB2OworCQkJCWJyZWFrOworCQkJICBjYXNlICJhIjoKKwkJCQl2YXIgYW0gPSBvcHRpb25zLmFtIHx8IGluZm8uYW07CisJCQkJdmFyIHBtID0gb3B0aW9ucy5wbSB8fCBpbmZvLnBtOworCQkJCWlmICghb3B0aW9ucy5zdHJpY3QpIHsKKwkJCQkJdiA9IHYucmVwbGFjZSgvXC4vZywgIiIpLnRvTG93ZXJDYXNlKCk7CisJCQkJCWFtID0gYW0ucmVwbGFjZSgvXC4vZywgIiIpLnRvTG93ZXJDYXNlKCk7CisJCQkJCXBtID0gcG0ucmVwbGFjZSgvXC4vZywgIiIpLnRvTG93ZXJDYXNlKCk7CisJCQkJfQorCQkJCWlmIChvcHRpb25zLnN0cmljdCAmJiB2ICE9IGFtICYmIHYgIT0gcG0pIHsKKwkJCQkJZG9qby5kZWJ1ZygiZG9qby5kYXRlLnBhcnNlOiBDb3VsZCBub3QgcGFyc2UgYW0vcG0gcGFydC4iKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXZhciBob3VycyA9IHJlc3VsdC5nZXRIb3VycygpOworCQkJCWlmICh2ID09IHBtICYmIGhvdXJzIDwgMTIpIHsKKwkJCQkJcmVzdWx0LnNldEhvdXJzKGhvdXJzICsgMTIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh2ID09IGFtICYmIGhvdXJzID09IDEyKSB7CisJCQkJCQlyZXN1bHQuc2V0SG91cnMoMCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgIksiOgorCQkJCWlmICh2ID09IDI0KSB7CisJCQkJCXYgPSAwOworCQkJCX0KKwkJCSAgY2FzZSAiaCI6CisJCQkgIGNhc2UgIkgiOgorCQkJICBjYXNlICJrIjoKKwkJCQlpZiAodiA+IDIzKSB7CisJCQkJCWRvam8uZGVidWcoImRvam8uZGF0ZS5wYXJzZTogSWxsZWdhbCBob3VycyB2YWx1ZSIpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmVzdWx0LnNldEhvdXJzKHYpOworCQkJCWJyZWFrOworCQkJICBjYXNlICJtIjoKKwkJCQlyZXN1bHQuc2V0TWludXRlcyh2KTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAicyI6CisJCQkJcmVzdWx0LnNldFNlY29uZHModik7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgIlMiOgorCQkJCXJlc3VsdC5zZXRNaWxsaXNlY29uZHModik7CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUucGFyc2U6IHVuc3VwcG9ydGVkIHBhdHRlcm4gY2hhcj0iICsgZ3JwLmNoYXJBdCgwKSk7CisJCQl9CisJCX0KKwkJaWYgKGV4cGVjdGVkLnllYXIgJiYgcmVzdWx0LmdldEZ1bGxZZWFyKCkgIT0gZXhwZWN0ZWQueWVhcikgeworCQkJZG9qby5kZWJ1ZygiUGFyc2VkIHllYXI6ICciICsgcmVzdWx0LmdldEZ1bGxZZWFyKCkgKyAiJyBkaWQgbm90IG1hdGNoIGlucHV0IHllYXI6ICciICsgZXhwZWN0ZWQueWVhciArICInLiIpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGV4cGVjdGVkLm1vbnRoICYmIHJlc3VsdC5nZXRNb250aCgpICE9IGV4cGVjdGVkLm1vbnRoKSB7CisJCQlkb2pvLmRlYnVnKCJQYXJzZWQgbW9udGg6ICciICsgcmVzdWx0LmdldE1vbnRoKCkgKyAiJyBkaWQgbm90IG1hdGNoIGlucHV0IG1vbnRoOiAnIiArIGV4cGVjdGVkLm1vbnRoICsgIicuIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoZXhwZWN0ZWQuZGF0ZSAmJiByZXN1bHQuZ2V0RGF0ZSgpICE9IGV4cGVjdGVkLmRhdGUpIHsKKwkJCWRvam8uZGVidWcoIlBhcnNlZCBkYXkgb2YgbW9udGg6ICciICsgcmVzdWx0LmdldERhdGUoKSArICInIGRpZCBub3QgbWF0Y2ggaW5wdXQgZGF5IG9mIG1vbnRoOiAnIiArIGV4cGVjdGVkLmRhdGUgKyAiJy4iKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfTsKKwlmdW5jdGlvbiBfcHJvY2Vzc1BhdHRlcm4ocGF0dGVybiwgYXBwbHlQYXR0ZXJuLCBhcHBseUxpdGVyYWwsIGFwcGx5QWxsKSB7CisJCXZhciBpZGVudGl0eSA9IGZ1bmN0aW9uICh4KSB7CisJCQlyZXR1cm4geDsKKwkJfTsKKwkJYXBwbHlQYXR0ZXJuID0gYXBwbHlQYXR0ZXJuIHx8IGlkZW50aXR5OworCQlhcHBseUxpdGVyYWwgPSBhcHBseUxpdGVyYWwgfHwgaWRlbnRpdHk7CisJCWFwcGx5QWxsID0gYXBwbHlBbGwgfHwgaWRlbnRpdHk7CisJCXZhciBjaHVua3MgPSBwYXR0ZXJuLm1hdGNoKC8oJyd8W14nXSkrL2cpOworCQl2YXIgbGl0ZXJhbCA9IGZhbHNlOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKCFjaHVua3NbaV0pIHsKKwkJCQljaHVua3NbaV0gPSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJY2h1bmtzW2ldID0gKGxpdGVyYWwgPyBhcHBseUxpdGVyYWwgOiBhcHBseVBhdHRlcm4pKGNodW5rc1tpXSk7CisJCQkJbGl0ZXJhbCA9ICFsaXRlcmFsOworCQkJfQorCQl9CisJCXJldHVybiBhcHBseUFsbChjaHVua3Muam9pbigiIikpOworCX0KKwlmdW5jdGlvbiBfYnVpbGREYXRlVGltZVJFKGdyb3VwcywgaW5mbywgb3B0aW9ucywgcGF0dGVybikgeworCQlyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC8oW2Etel0pXDEqL2lnLCBmdW5jdGlvbiAobWF0Y2gpIHsKKwkJCXZhciBzOworCQkJdmFyIGMgPSBtYXRjaC5jaGFyQXQoMCk7CisJCQl2YXIgbCA9IG1hdGNoLmxlbmd0aDsKKwkJCXN3aXRjaCAoYykgeworCQkJICBjYXNlICJ5IjoKKwkJCQlzID0gIlxcZCIgKyAoKGwgPT0gMikgPyAiezIsNH0iIDogIisiKTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiTSI6CisJCQkJcyA9IChsID4gMikgPyAiXFxTKyIgOiAiXFxkezEsMn0iOworCQkJCWJyZWFrOworCQkJICBjYXNlICJkIjoKKwkJCQlzID0gIlxcZHsxLDJ9IjsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiRSI6CisJCQkJcyA9ICJcXFMrIjsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiaCI6CisJCQkgIGNhc2UgIkgiOgorCQkJICBjYXNlICJLIjoKKwkJCSAgY2FzZSAiayI6CisJCQkJcyA9ICJcXGR7MSwyfSI7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgIm0iOgorCQkJICBjYXNlICJzIjoKKwkJCQlzID0gIlswLTVdXFxkIjsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiUyI6CisJCQkJcyA9ICJcXGR7MSwzfSI7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImEiOgorCQkJCXZhciBhbSA9IG9wdGlvbnMuYW0gfHwgaW5mby5hbSB8fCAiQU0iOworCQkJCXZhciBwbSA9IG9wdGlvbnMucG0gfHwgaW5mby5wbSB8fCAiUE0iOworCQkJCWlmIChvcHRpb25zLnN0cmljdCkgeworCQkJCQlzID0gYW0gKyAifCIgKyBwbTsKKwkJCQl9IGVsc2UgeworCQkJCQlzID0gYW07CisJCQkJCXMgKz0gKGFtICE9IGFtLnRvTG93ZXJDYXNlKCkpID8gInwiICsgYW0udG9Mb3dlckNhc2UoKSA6ICIiOworCQkJCQlzICs9ICJ8IjsKKwkJCQkJcyArPSAocG0gIT0gcG0udG9Mb3dlckNhc2UoKSkgPyBwbSArICJ8IiArIHBtLnRvTG93ZXJDYXNlKCkgOiBwbTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJZG9qby51bmltcGxlbWVudGVkKCJwYXJzZSBvZiBkYXRlIGZvcm1hdCwgcGF0dGVybj0iICsgcGF0dGVybik7CisJCQl9CisJCQlpZiAoZ3JvdXBzKSB7CisJCQkJZ3JvdXBzLnB1c2gobWF0Y2gpOworCQkJfQorCQkJcmV0dXJuICJcXHMqKCIgKyBzICsgIilcXHMqIjsKKwkJfSk7CisJfQorfSkoKTsKK2Rvam8uZGF0ZS5zdHJmdGltZSA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBmb3JtYXQsIGxvY2FsZSkgeworCXZhciBwYWRDaGFyID0gbnVsbDsKKwlmdW5jdGlvbiBfKHMsIG4pIHsKKwkJcmV0dXJuIGRvam8uc3RyaW5nLnBhZChzLCBuIHx8IDIsIHBhZENoYXIgfHwgIjAiKTsKKwl9CisJdmFyIGluZm8gPSBkb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZShsb2NhbGUpOworCWZ1bmN0aW9uICQocHJvcGVydHkpIHsKKwkJc3dpdGNoIChwcm9wZXJ0eSkgeworCQkgIGNhc2UgImEiOgorCQkJcmV0dXJuIGRvam8uZGF0ZS5nZXREYXlTaG9ydE5hbWUoZGF0ZU9iamVjdCwgbG9jYWxlKTsKKwkJICBjYXNlICJBIjoKKwkJCXJldHVybiBkb2pvLmRhdGUuZ2V0RGF5TmFtZShkYXRlT2JqZWN0LCBsb2NhbGUpOworCQkgIGNhc2UgImIiOgorCQkgIGNhc2UgImgiOgorCQkJcmV0dXJuIGRvam8uZGF0ZS5nZXRNb250aFNob3J0TmFtZShkYXRlT2JqZWN0LCBsb2NhbGUpOworCQkgIGNhc2UgIkIiOgorCQkJcmV0dXJuIGRvam8uZGF0ZS5nZXRNb250aE5hbWUoZGF0ZU9iamVjdCwgbG9jYWxlKTsKKwkJICBjYXNlICJjIjoKKwkJCXJldHVybiBkb2pvLmRhdGUuZm9ybWF0KGRhdGVPYmplY3QsIHtsb2NhbGU6bG9jYWxlfSk7CisJCSAgY2FzZSAiQyI6CisJCQlyZXR1cm4gXyhNYXRoLmZsb29yKGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKSAvIDEwMCkpOworCQkgIGNhc2UgImQiOgorCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXREYXRlKCkpOworCQkgIGNhc2UgIkQiOgorCQkJcmV0dXJuICQoIm0iKSArICIvIiArICQoImQiKSArICIvIiArICQoInkiKTsKKwkJICBjYXNlICJlIjoKKwkJCWlmIChwYWRDaGFyID09IG51bGwpIHsKKwkJCQlwYWRDaGFyID0gIiAiOworCQkJfQorCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXREYXRlKCkpOworCQkgIGNhc2UgImYiOgorCQkJaWYgKHBhZENoYXIgPT0gbnVsbCkgeworCQkJCXBhZENoYXIgPSAiICI7CisJCQl9CisJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldE1vbnRoKCkgKyAxKTsKKwkJICBjYXNlICJnIjoKKwkJCWJyZWFrOworCQkgIGNhc2UgIkciOgorCQkJZG9qby51bmltcGxlbWVudGVkKCJ1bmltcGxlbWVudGVkIG1vZGlmaWVyICdHJyIpOworCQkJYnJlYWs7CisJCSAgY2FzZSAiRiI6CisJCQlyZXR1cm4gJCgiWSIpICsgIi0iICsgJCgibSIpICsgIi0iICsgJCgiZCIpOworCQkgIGNhc2UgIkgiOgorCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXRIb3VycygpKTsKKwkJICBjYXNlICJJIjoKKwkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKTsKKwkJICBjYXNlICJqIjoKKwkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXREYXlPZlllYXIoZGF0ZU9iamVjdCksIDMpOworCQkgIGNhc2UgImsiOgorCQkJaWYgKHBhZENoYXIgPT0gbnVsbCkgeworCQkJCXBhZENoYXIgPSAiICI7CisJCQl9CisJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldEhvdXJzKCkpOworCQkgIGNhc2UgImwiOgorCQkJaWYgKHBhZENoYXIgPT0gbnVsbCkgeworCQkJCXBhZENoYXIgPSAiICI7CisJCQl9CisJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldEhvdXJzKCkgJSAxMiB8fCAxMik7CisJCSAgY2FzZSAibSI6CisJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldE1vbnRoKCkgKyAxKTsKKwkJICBjYXNlICJNIjoKKwkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0TWludXRlcygpKTsKKwkJICBjYXNlICJuIjoKKwkJCXJldHVybiAiXG4iOworCQkgIGNhc2UgInAiOgorCQkJcmV0dXJuIGluZm9bZGF0ZU9iamVjdC5nZXRIb3VycygpIDwgMTIgPyAiYW0iIDogInBtIl07CisJCSAgY2FzZSAiciI6CisJCQlyZXR1cm4gJCgiSSIpICsgIjoiICsgJCgiTSIpICsgIjoiICsgJCgiUyIpICsgIiAiICsgJCgicCIpOworCQkgIGNhc2UgIlIiOgorCQkJcmV0dXJuICQoIkgiKSArICI6IiArICQoIk0iKTsKKwkJICBjYXNlICJTIjoKKwkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0U2Vjb25kcygpKTsKKwkJICBjYXNlICJ0IjoKKwkJCXJldHVybiAiXHQiOworCQkgIGNhc2UgIlQiOgorCQkJcmV0dXJuICQoIkgiKSArICI6IiArICQoIk0iKSArICI6IiArICQoIlMiKTsKKwkJICBjYXNlICJ1IjoKKwkJCXJldHVybiBTdHJpbmcoZGF0ZU9iamVjdC5nZXREYXkoKSB8fCA3KTsKKwkJICBjYXNlICJVIjoKKwkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXRXZWVrT2ZZZWFyKGRhdGVPYmplY3QpKTsKKwkJICBjYXNlICJWIjoKKwkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXRJc29XZWVrT2ZZZWFyKGRhdGVPYmplY3QpKTsKKwkJICBjYXNlICJXIjoKKwkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXRXZWVrT2ZZZWFyKGRhdGVPYmplY3QsIDEpKTsKKwkJICBjYXNlICJ3IjoKKwkJCXJldHVybiBTdHJpbmcoZGF0ZU9iamVjdC5nZXREYXkoKSk7CisJCSAgY2FzZSAieCI6CisJCQlyZXR1cm4gZG9qby5kYXRlLmZvcm1hdChkYXRlT2JqZWN0LCB7c2VsZWN0b3I6ImRhdGVPbmx5IiwgbG9jYWxlOmxvY2FsZX0pOworCQkgIGNhc2UgIlgiOgorCQkJcmV0dXJuIGRvam8uZGF0ZS5mb3JtYXQoZGF0ZU9iamVjdCwge3NlbGVjdG9yOiJ0aW1lT25seSIsIGxvY2FsZTpsb2NhbGV9KTsKKwkJICBjYXNlICJ5IjoKKwkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKSAlIDEwMCk7CisJCSAgY2FzZSAiWSI6CisJCQlyZXR1cm4gU3RyaW5nKGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKSk7CisJCSAgY2FzZSAieiI6CisJCQl2YXIgdGltZXpvbmVPZmZzZXQgPSBkYXRlT2JqZWN0LmdldFRpbWV6b25lT2Zmc2V0KCk7CisJCQlyZXR1cm4gKHRpbWV6b25lT2Zmc2V0ID4gMCA/ICItIiA6ICIrIikgKyBfKE1hdGguZmxvb3IoTWF0aC5hYnModGltZXpvbmVPZmZzZXQpIC8gNjApKSArICI6IiArIF8oTWF0aC5hYnModGltZXpvbmVPZmZzZXQpICUgNjApOworCQkgIGNhc2UgIloiOgorCQkJcmV0dXJuIGRvam8uZGF0ZS5nZXRUaW1lem9uZU5hbWUoZGF0ZU9iamVjdCk7CisJCSAgY2FzZSAiJSI6CisJCQlyZXR1cm4gIiUiOworCQl9CisJfQorCXZhciBzdHJpbmcgPSAiIjsKKwl2YXIgaSA9IDA7CisJdmFyIGluZGV4ID0gMDsKKwl2YXIgc3dpdGNoQ2FzZSA9IG51bGw7CisJd2hpbGUgKChpbmRleCA9IGZvcm1hdC5pbmRleE9mKCIlIiwgaSkpICE9IC0xKSB7CisJCXN0cmluZyArPSBmb3JtYXQuc3Vic3RyaW5nKGksIGluZGV4KyspOworCQlzd2l0Y2ggKGZvcm1hdC5jaGFyQXQoaW5kZXgrKykpIHsKKwkJICBjYXNlICJfIjoKKwkJCXBhZENoYXIgPSAiICI7CisJCQlicmVhazsKKwkJICBjYXNlICItIjoKKwkJCXBhZENoYXIgPSAiIjsKKwkJCWJyZWFrOworCQkgIGNhc2UgIjAiOgorCQkJcGFkQ2hhciA9ICIwIjsKKwkJCWJyZWFrOworCQkgIGNhc2UgIl4iOgorCQkJc3dpdGNoQ2FzZSA9ICJ1cHBlciI7CisJCQlicmVhazsKKwkJICBjYXNlICIqIjoKKwkJCXN3aXRjaENhc2UgPSAibG93ZXIiOworCQkJYnJlYWs7CisJCSAgY2FzZSAiIyI6CisJCQlzd2l0Y2hDYXNlID0gInN3YXAiOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCXBhZENoYXIgPSBudWxsOworCQkJaW5kZXgtLTsKKwkJCWJyZWFrOworCQl9CisJCXZhciBwcm9wZXJ0eSA9ICQoZm9ybWF0LmNoYXJBdChpbmRleCsrKSk7CisJCXN3aXRjaCAoc3dpdGNoQ2FzZSkgeworCQkgIGNhc2UgInVwcGVyIjoKKwkJCXByb3BlcnR5ID0gcHJvcGVydHkudG9VcHBlckNhc2UoKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgImxvd2VyIjoKKwkJCXByb3BlcnR5ID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgInN3YXAiOgorCQkJdmFyIGNvbXBhcmVTdHJpbmcgPSBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOworCQkJdmFyIHN3YXBTdHJpbmcgPSAiIjsKKwkJCXZhciBqID0gMDsKKwkJCXZhciBjaCA9ICIiOworCQkJd2hpbGUgKGogPCBwcm9wZXJ0eS5sZW5ndGgpIHsKKwkJCQljaCA9IHByb3BlcnR5LmNoYXJBdChqKTsKKwkJCQlzd2FwU3RyaW5nICs9IChjaCA9PSBjb21wYXJlU3RyaW5nLmNoYXJBdChqKSkgPyBjaC50b1VwcGVyQ2FzZSgpIDogY2gudG9Mb3dlckNhc2UoKTsKKwkJCQlqKys7CisJCQl9CisJCQlwcm9wZXJ0eSA9IHN3YXBTdHJpbmc7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoQ2FzZSA9IG51bGw7CisJCXN0cmluZyArPSBwcm9wZXJ0eTsKKwkJaSA9IGluZGV4OworCX0KKwlzdHJpbmcgKz0gZm9ybWF0LnN1YnN0cmluZyhpKTsKKwlyZXR1cm4gc3RyaW5nOworfTsKKyhmdW5jdGlvbiAoKSB7CisJdmFyIF9jdXN0b21Gb3JtYXRzID0gW107CisJZG9qby5kYXRlLmFkZEN1c3RvbUZvcm1hdHMgPSBmdW5jdGlvbiAocGFja2FnZU5hbWUsIGJ1bmRsZU5hbWUpIHsKKwkJX2N1c3RvbUZvcm1hdHMucHVzaCh7cGtnOnBhY2thZ2VOYW1lLCBuYW1lOmJ1bmRsZU5hbWV9KTsKKwl9OworCWRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlID0gZnVuY3Rpb24gKGxvY2FsZSkgeworCQl2YXIgZ3JlZ29yaWFuID0ge307CisJCWRvam8ubGFuZy5mb3JFYWNoKF9jdXN0b21Gb3JtYXRzLCBmdW5jdGlvbiAoZGVzYykgeworCQkJdmFyIGJ1bmRsZSA9IGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oZGVzYy5wa2csIGRlc2MubmFtZSwgbG9jYWxlKTsKKwkJCWdyZWdvcmlhbiA9IGRvam8ubGFuZy5taXhpbihncmVnb3JpYW4sIGJ1bmRsZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gZ3JlZ29yaWFuOworCX07Cit9KSgpOworZG9qby5kYXRlLmFkZEN1c3RvbUZvcm1hdHMoImRvam8uaTE4bi5jYWxlbmRhciIsICJncmVnb3JpYW4iKTsKK2Rvam8uZGF0ZS5hZGRDdXN0b21Gb3JtYXRzKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCAiZ3JlZ29yaWFuRXh0cmFzIik7Citkb2pvLmRhdGUuZ2V0TmFtZXMgPSBmdW5jdGlvbiAoaXRlbSwgdHlwZSwgdXNlLCBsb2NhbGUpIHsKKwl2YXIgbGFiZWw7CisJdmFyIGxvb2t1cCA9IGRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKGxvY2FsZSk7CisJdmFyIHByb3BzID0gW2l0ZW0sIHVzZSwgdHlwZV07CisJaWYgKHVzZSA9PSAic3RhbmRBbG9uZSIpIHsKKwkJbGFiZWwgPSBsb29rdXBbcHJvcHMuam9pbigiLSIpXTsKKwl9CisJcHJvcHNbMV0gPSAiZm9ybWF0IjsKKwlyZXR1cm4gKGxhYmVsIHx8IGxvb2t1cFtwcm9wcy5qb2luKCItIildKS5jb25jYXQoKTsKK307Citkb2pvLmRhdGUuZ2V0RGF5TmFtZSA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBsb2NhbGUpIHsKKwlyZXR1cm4gZG9qby5kYXRlLmdldE5hbWVzKCJkYXlzIiwgIndpZGUiLCAiZm9ybWF0IiwgbG9jYWxlKVtkYXRlT2JqZWN0LmdldERheSgpXTsKK307Citkb2pvLmRhdGUuZ2V0RGF5U2hvcnROYW1lID0gZnVuY3Rpb24gKGRhdGVPYmplY3QsIGxvY2FsZSkgeworCXJldHVybiBkb2pvLmRhdGUuZ2V0TmFtZXMoImRheXMiLCAiYWJiciIsICJmb3JtYXQiLCBsb2NhbGUpW2RhdGVPYmplY3QuZ2V0RGF5KCldOworfTsKK2Rvam8uZGF0ZS5nZXRNb250aE5hbWUgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgbG9jYWxlKSB7CisJcmV0dXJuIGRvam8uZGF0ZS5nZXROYW1lcygibW9udGhzIiwgIndpZGUiLCAiZm9ybWF0IiwgbG9jYWxlKVtkYXRlT2JqZWN0LmdldE1vbnRoKCldOworfTsKK2Rvam8uZGF0ZS5nZXRNb250aFNob3J0TmFtZSA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBsb2NhbGUpIHsKKwlyZXR1cm4gZG9qby5kYXRlLmdldE5hbWVzKCJtb250aHMiLCAiYWJiciIsICJmb3JtYXQiLCBsb2NhbGUpW2RhdGVPYmplY3QuZ2V0TW9udGgoKV07Cit9OworZG9qby5kYXRlLnRvUmVsYXRpdmVTdHJpbmcgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCkgeworCXZhciBub3cgPSBuZXcgRGF0ZSgpOworCXZhciBkaWZmID0gKG5vdyAtIGRhdGVPYmplY3QpIC8gMTAwMDsKKwl2YXIgZW5kID0gIiBhZ28iOworCXZhciBmdXR1cmUgPSBmYWxzZTsKKwlpZiAoZGlmZiA8IDApIHsKKwkJZnV0dXJlID0gdHJ1ZTsKKwkJZW5kID0gIiBmcm9tIG5vdyI7CisJCWRpZmYgPSAtZGlmZjsKKwl9CisJaWYgKGRpZmYgPCA2MCkgeworCQlkaWZmID0gTWF0aC5yb3VuZChkaWZmKTsKKwkJcmV0dXJuIGRpZmYgKyAiIHNlY29uZCIgKyAoZGlmZiA9PSAxID8gIiIgOiAicyIpICsgZW5kOworCX0KKwlpZiAoZGlmZiA8IDYwICogNjApIHsKKwkJZGlmZiA9IE1hdGgucm91bmQoZGlmZiAvIDYwKTsKKwkJcmV0dXJuIGRpZmYgKyAiIG1pbnV0ZSIgKyAoZGlmZiA9PSAxID8gIiIgOiAicyIpICsgZW5kOworCX0KKwlpZiAoZGlmZiA8IDYwICogNjAgKiAyNCkgeworCQlkaWZmID0gTWF0aC5yb3VuZChkaWZmIC8gMzYwMCk7CisJCXJldHVybiBkaWZmICsgIiBob3VyIiArIChkaWZmID09IDEgPyAiIiA6ICJzIikgKyBlbmQ7CisJfQorCWlmIChkaWZmIDwgNjAgKiA2MCAqIDI0ICogNykgeworCQlkaWZmID0gTWF0aC5yb3VuZChkaWZmIC8gKDM2MDAgKiAyNCkpOworCQlpZiAoZGlmZiA9PSAxKSB7CisJCQlyZXR1cm4gZnV0dXJlID8gIlRvbW9ycm93IiA6ICJZZXN0ZXJkYXkiOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGRpZmYgKyAiIGRheXMiICsgZW5kOworCQl9CisJfQorCXJldHVybiBkb2pvLmRhdGUuZm9ybWF0KGRhdGVPYmplY3QpOworfTsKK2Rvam8uZGF0ZS50b1NxbCA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBub1RpbWUpIHsKKwlyZXR1cm4gZG9qby5kYXRlLnN0cmZ0aW1lKGRhdGVPYmplY3QsICIlRiIgKyAhbm9UaW1lID8gIiAlVCIgOiAiIik7Cit9OworZG9qby5kYXRlLmZyb21TcWwgPSBmdW5jdGlvbiAoc3FsRGF0ZSkgeworCXZhciBwYXJ0cyA9IHNxbERhdGUuc3BsaXQoL1tcLSA6XS9nKTsKKwl3aGlsZSAocGFydHMubGVuZ3RoIDwgNikgeworCQlwYXJ0cy5wdXNoKDApOworCX0KKwlyZXR1cm4gbmV3IERhdGUocGFydHNbMF0sIChwYXJzZUludChwYXJ0c1sxXSwgMTApIC0gMSksIHBhcnRzWzJdLCBwYXJ0c1szXSwgcGFydHNbNF0sIHBhcnRzWzVdKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL3NlcmlhbGl6ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL3NlcmlhbGl6ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJlMzEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGUvc2VyaWFsaXplLmpzCkBAIC0wLDAgKzEsMTI5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuc2VyaWFsaXplIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nLmNvbW1vbiIpOworZG9qby5kYXRlLnNldElzbzg2MDEgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgZm9ybWF0dGVkU3RyaW5nKSB7CisJdmFyIGNvbXBzID0gKGZvcm1hdHRlZFN0cmluZy5pbmRleE9mKCJUIikgPT0gLTEpID8gZm9ybWF0dGVkU3RyaW5nLnNwbGl0KCIgIikgOiBmb3JtYXR0ZWRTdHJpbmcuc3BsaXQoIlQiKTsKKwlkYXRlT2JqZWN0ID0gZG9qby5kYXRlLnNldElzbzg2MDFEYXRlKGRhdGVPYmplY3QsIGNvbXBzWzBdKTsKKwlpZiAoY29tcHMubGVuZ3RoID09IDIpIHsKKwkJZGF0ZU9iamVjdCA9IGRvam8uZGF0ZS5zZXRJc284NjAxVGltZShkYXRlT2JqZWN0LCBjb21wc1sxXSk7CisJfQorCXJldHVybiBkYXRlT2JqZWN0OworfTsKK2Rvam8uZGF0ZS5mcm9tSXNvODYwMSA9IGZ1bmN0aW9uIChmb3JtYXR0ZWRTdHJpbmcpIHsKKwlyZXR1cm4gZG9qby5kYXRlLnNldElzbzg2MDEobmV3IERhdGUoMCwgMCksIGZvcm1hdHRlZFN0cmluZyk7Cit9OworZG9qby5kYXRlLnNldElzbzg2MDFEYXRlID0gZnVuY3Rpb24gKGRhdGVPYmplY3QsIGZvcm1hdHRlZFN0cmluZykgeworCXZhciByZWdleHAgPSAiXihbMC05XXs0fSkoKC0/KFswLTldezJ9KSgtPyhbMC05XXsyfSkpPyl8IiArICIoLT8oWzAtOV17M30pKXwoLT9XKFswLTldezJ9KSgtPyhbMS03XSkpPykpPyQiOworCXZhciBkID0gZm9ybWF0dGVkU3RyaW5nLm1hdGNoKG5ldyBSZWdFeHAocmVnZXhwKSk7CisJaWYgKCFkKSB7CisJCWRvam8uZGVidWcoImludmFsaWQgZGF0ZSBzdHJpbmc6ICIgKyBmb3JtYXR0ZWRTdHJpbmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJdmFyIHllYXIgPSBkWzFdOworCXZhciBtb250aCA9IGRbNF07CisJdmFyIGRhdGUgPSBkWzZdOworCXZhciBkYXlvZnllYXIgPSBkWzhdOworCXZhciB3ZWVrID0gZFsxMF07CisJdmFyIGRheW9md2VlayA9IGRbMTJdID8gZFsxMl0gOiAxOworCWRhdGVPYmplY3Quc2V0RnVsbFllYXIoeWVhcik7CisJaWYgKGRheW9meWVhcikgeworCQlkYXRlT2JqZWN0LnNldE1vbnRoKDApOworCQlkYXRlT2JqZWN0LnNldERhdGUoTnVtYmVyKGRheW9meWVhcikpOworCX0gZWxzZSB7CisJCWlmICh3ZWVrKSB7CisJCQlkYXRlT2JqZWN0LnNldE1vbnRoKDApOworCQkJZGF0ZU9iamVjdC5zZXREYXRlKDEpOworCQkJdmFyIGdkID0gZGF0ZU9iamVjdC5nZXREYXkoKTsKKwkJCXZhciBkYXkgPSBnZCA/IGdkIDogNzsKKwkJCXZhciBvZmZzZXQgPSBOdW1iZXIoZGF5b2Z3ZWVrKSArICg3ICogTnVtYmVyKHdlZWspKTsKKwkJCWlmIChkYXkgPD0gNCkgeworCQkJCWRhdGVPYmplY3Quc2V0RGF0ZShvZmZzZXQgKyAxIC0gZGF5KTsKKwkJCX0gZWxzZSB7CisJCQkJZGF0ZU9iamVjdC5zZXREYXRlKG9mZnNldCArIDggLSBkYXkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG1vbnRoKSB7CisJCQkJZGF0ZU9iamVjdC5zZXREYXRlKDEpOworCQkJCWRhdGVPYmplY3Quc2V0TW9udGgobW9udGggLSAxKTsKKwkJCX0KKwkJCWlmIChkYXRlKSB7CisJCQkJZGF0ZU9iamVjdC5zZXREYXRlKGRhdGUpOworCQkJfQorCQl9CisJfQorCXJldHVybiBkYXRlT2JqZWN0OworfTsKK2Rvam8uZGF0ZS5mcm9tSXNvODYwMURhdGUgPSBmdW5jdGlvbiAoZm9ybWF0dGVkU3RyaW5nKSB7CisJcmV0dXJuIGRvam8uZGF0ZS5zZXRJc284NjAxRGF0ZShuZXcgRGF0ZSgwLCAwKSwgZm9ybWF0dGVkU3RyaW5nKTsKK307Citkb2pvLmRhdGUuc2V0SXNvODYwMVRpbWUgPSBmdW5jdGlvbiAoZGF0ZU9iamVjdCwgZm9ybWF0dGVkU3RyaW5nKSB7CisJdmFyIHRpbWV6b25lID0gIlp8KChbLStdKShbMC05XXsyfSkoOj8oWzAtOV17Mn0pKT8pJCI7CisJdmFyIGQgPSBmb3JtYXR0ZWRTdHJpbmcubWF0Y2gobmV3IFJlZ0V4cCh0aW1lem9uZSkpOworCXZhciBvZmZzZXQgPSAwOworCWlmIChkKSB7CisJCWlmIChkWzBdICE9ICJaIikgeworCQkJb2Zmc2V0ID0gKE51bWJlcihkWzNdKSAqIDYwKSArIE51bWJlcihkWzVdKTsKKwkJCW9mZnNldCAqPSAoKGRbMl0gPT0gIi0iKSA/IDEgOiAtMSk7CisJCX0KKwkJb2Zmc2V0IC09IGRhdGVPYmplY3QuZ2V0VGltZXpvbmVPZmZzZXQoKTsKKwkJZm9ybWF0dGVkU3RyaW5nID0gZm9ybWF0dGVkU3RyaW5nLnN1YnN0cigwLCBmb3JtYXR0ZWRTdHJpbmcubGVuZ3RoIC0gZFswXS5sZW5ndGgpOworCX0KKwl2YXIgcmVnZXhwID0gIl4oWzAtOV17Mn0pKDo/KFswLTldezJ9KSg6PyhbMC05XXsyfSkoLihbMC05XSspKT8pPyk/JCI7CisJZCA9IGZvcm1hdHRlZFN0cmluZy5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCWlmICghZCkgeworCQlkb2pvLmRlYnVnKCJpbnZhbGlkIHRpbWUgc3RyaW5nOiAiICsgZm9ybWF0dGVkU3RyaW5nKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciBob3VycyA9IGRbMV07CisJdmFyIG1pbnMgPSBOdW1iZXIoKGRbM10pID8gZFszXSA6IDApOworCXZhciBzZWNzID0gKGRbNV0pID8gZFs1XSA6IDA7CisJdmFyIG1zID0gZFs3XSA/IChOdW1iZXIoIjAuIiArIGRbN10pICogMTAwMCkgOiAwOworCWRhdGVPYmplY3Quc2V0SG91cnMoaG91cnMpOworCWRhdGVPYmplY3Quc2V0TWludXRlcyhtaW5zKTsKKwlkYXRlT2JqZWN0LnNldFNlY29uZHMoc2Vjcyk7CisJZGF0ZU9iamVjdC5zZXRNaWxsaXNlY29uZHMobXMpOworCWlmIChvZmZzZXQgIT09IDApIHsKKwkJZGF0ZU9iamVjdC5zZXRUaW1lKGRhdGVPYmplY3QuZ2V0VGltZSgpICsgb2Zmc2V0ICogNjAwMDApOworCX0KKwlyZXR1cm4gZGF0ZU9iamVjdDsKK307Citkb2pvLmRhdGUuZnJvbUlzbzg2MDFUaW1lID0gZnVuY3Rpb24gKGZvcm1hdHRlZFN0cmluZykgeworCXJldHVybiBkb2pvLmRhdGUuc2V0SXNvODYwMVRpbWUobmV3IERhdGUoMCwgMCksIGZvcm1hdHRlZFN0cmluZyk7Cit9OworZG9qby5kYXRlLnRvUmZjMzMzOSA9IGZ1bmN0aW9uIChkYXRlT2JqZWN0LCBzZWxlY3RvcikgeworCWlmICghZGF0ZU9iamVjdCkgeworCQlkYXRlT2JqZWN0ID0gbmV3IERhdGUoKTsKKwl9CisJdmFyIF8gPSBkb2pvLnN0cmluZy5wYWQ7CisJdmFyIGZvcm1hdHRlZERhdGUgPSBbXTsKKwlpZiAoc2VsZWN0b3IgIT0gInRpbWVPbmx5IikgeworCQl2YXIgZGF0ZSA9IFtfKGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKSwgNCksIF8oZGF0ZU9iamVjdC5nZXRNb250aCgpICsgMSwgMiksIF8oZGF0ZU9iamVjdC5nZXREYXRlKCksIDIpXS5qb2luKCItIik7CisJCWZvcm1hdHRlZERhdGUucHVzaChkYXRlKTsKKwl9CisJaWYgKHNlbGVjdG9yICE9ICJkYXRlT25seSIpIHsKKwkJdmFyIHRpbWUgPSBbXyhkYXRlT2JqZWN0LmdldEhvdXJzKCksIDIpLCBfKGRhdGVPYmplY3QuZ2V0TWludXRlcygpLCAyKSwgXyhkYXRlT2JqZWN0LmdldFNlY29uZHMoKSwgMildLmpvaW4oIjoiKTsKKwkJdmFyIHRpbWV6b25lT2Zmc2V0ID0gZGF0ZU9iamVjdC5nZXRUaW1lem9uZU9mZnNldCgpOworCQl0aW1lICs9ICh0aW1lem9uZU9mZnNldCA+IDAgPyAiLSIgOiAiKyIpICsgXyhNYXRoLmZsb29yKE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0KSAvIDYwKSwgMikgKyAiOiIgKyBfKE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0KSAlIDYwLCAyKTsKKwkJZm9ybWF0dGVkRGF0ZS5wdXNoKHRpbWUpOworCX0KKwlyZXR1cm4gZm9ybWF0dGVkRGF0ZS5qb2luKCJUIik7Cit9OworZG9qby5kYXRlLmZyb21SZmMzMzM5ID0gZnVuY3Rpb24gKHJmY0RhdGUpIHsKKwlpZiAocmZjRGF0ZS5pbmRleE9mKCJUYW55IikgIT0gLTEpIHsKKwkJcmZjRGF0ZSA9IHJmY0RhdGUucmVwbGFjZSgiVGFueSIsICIiKTsKKwl9CisJdmFyIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSgpOworCXJldHVybiBkb2pvLmRhdGUuc2V0SXNvODYwMShkYXRlT2JqZWN0LCByZmNEYXRlKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL3N1cHBsZW1lbnRhbC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kYXRlL3N1cHBsZW1lbnRhbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmZhZTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RhdGUvc3VwcGxlbWVudGFsLmpzCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0ZS5zdXBwbGVtZW50YWwiKTsKK2Rvam8uZGF0ZS5nZXRGaXJzdERheU9mV2VlayA9IGZ1bmN0aW9uIChsb2NhbGUpIHsKKwl2YXIgZmlyc3REYXkgPSB7bXY6NSwgYWU6NiwgYWY6NiwgYmg6NiwgZGo6NiwgZHo6NiwgZWc6NiwgZXI6NiwgZXQ6NiwgaXE6NiwgaXI6Niwgam86Niwga2U6Niwga3c6NiwgbGI6NiwgbHk6NiwgbWE6Niwgb206NiwgcWE6Niwgc2E6Niwgc2Q6Niwgc286NiwgdG46NiwgeWU6NiwgYXM6MCwgYXU6MCwgYXo6MCwgYnc6MCwgY2E6MCwgY246MCwgZm86MCwgZ2U6MCwgZ2w6MCwgZ3U6MCwgaGs6MCwgaWU6MCwgaWw6MCwgaXM6MCwgam06MCwganA6MCwga2c6MCwga3I6MCwgbGE6MCwgbWg6MCwgbW86MCwgbXA6MCwgbXQ6MCwgbno6MCwgcGg6MCwgcGs6MCwgc2c6MCwgdGg6MCwgdHQ6MCwgdHc6MCwgdW06MCwgdXM6MCwgdXo6MCwgdmk6MCwgemE6MCwgenc6MCwgZXQ6MCwgbXc6MCwgbmc6MCwgdGo6MCwgZ2I6MCwgc3k6NH07CisJbG9jYWxlID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpOworCXZhciBjb3VudHJ5ID0gbG9jYWxlLnNwbGl0KCItIilbMV07CisJdmFyIGRvdyA9IGZpcnN0RGF5W2NvdW50cnldOworCXJldHVybiAodHlwZW9mIGRvdyA9PSAidW5kZWZpbmVkIikgPyAxIDogZG93OworfTsKK2Rvam8uZGF0ZS5nZXRXZWVrZW5kID0gZnVuY3Rpb24gKGxvY2FsZSkgeworCXZhciB3ZWVrZW5kU3RhcnQgPSB7ZWc6NSwgaWw6NSwgc3k6NSwgImluIjowLCBhZTo0LCBiaDo0LCBkejo0LCBpcTo0LCBqbzo0LCBrdzo0LCBsYjo0LCBseTo0LCBtYTo0LCBvbTo0LCBxYTo0LCBzYTo0LCBzZDo0LCB0bjo0LCB5ZTo0fTsKKwl2YXIgd2Vla2VuZEVuZCA9IHthZTo1LCBiaDo1LCBkejo1LCBpcTo1LCBqbzo1LCBrdzo1LCBsYjo1LCBseTo1LCBtYTo1LCBvbTo1LCBxYTo1LCBzYTo1LCBzZDo1LCB0bjo1LCB5ZTo1LCBhZjo1LCBpcjo1LCBlZzo2LCBpbDo2LCBzeTo2fTsKKwlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJdmFyIGNvdW50cnkgPSBsb2NhbGUuc3BsaXQoIi0iKVsxXTsKKwl2YXIgc3RhcnQgPSB3ZWVrZW5kU3RhcnRbY291bnRyeV07CisJdmFyIGVuZCA9IHdlZWtlbmRFbmRbY291bnRyeV07CisJaWYgKHR5cGVvZiBzdGFydCA9PSAidW5kZWZpbmVkIikgeworCQlzdGFydCA9IDY7CisJfQorCWlmICh0eXBlb2YgZW5kID09ICJ1bmRlZmluZWQiKSB7CisJCWVuZCA9IDA7CisJfQorCXJldHVybiB7c3RhcnQ6c3RhcnQsIGVuZDplbmR9OworfTsKK2Rvam8uZGF0ZS5pc1dlZWtlbmQgPSBmdW5jdGlvbiAoZGF0ZU9iaiwgbG9jYWxlKSB7CisJdmFyIHdlZWtlbmQgPSBkb2pvLmRhdGUuZ2V0V2Vla2VuZChsb2NhbGUpOworCXZhciBkYXkgPSAoZGF0ZU9iaiB8fCBuZXcgRGF0ZSgpKS5nZXREYXkoKTsKKwlpZiAod2Vla2VuZC5lbmQgPCB3ZWVrZW5kLnN0YXJ0KSB7CisJCXdlZWtlbmQuZW5kICs9IDc7CisJCWlmIChkYXkgPCB3ZWVrZW5kLnN0YXJ0KSB7CisJCQlkYXkgKz0gNzsKKwkJfQorCX0KKwlyZXR1cm4gZGF5ID49IHdlZWtlbmQuc3RhcnQgJiYgZGF5IDw9IHdlZWtlbmQuZW5kOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2RjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcuanMKQEAgLTAsMCArMSw4NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kZWJ1ZyIpOworZG9qby5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKwlpZiAoIWRqQ29uZmlnLmlzRGVidWcpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgYXJncyA9IGFyZ3VtZW50czsKKwlpZiAoZGpfdW5kZWYoInByaW50bG4iLCBkb2pvLmhvc3RlbnYpKSB7CisJCWRvam8ucmFpc2UoImRvam8uZGVidWcgbm90IGF2YWlsYWJsZSAoeWV0PykiKTsKKwl9CisJdmFyIGlzSlVNID0gZGpfZ2xvYmFsWyJqdW0iXSAmJiAhZGpfZ2xvYmFsWyJqdW0iXS5pc0Jyb3dzZXI7CisJdmFyIHMgPSBbKGlzSlVNID8gIiIgOiAiREVCVUc6ICIpXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKwkJaWYgKCFmYWxzZSAmJiBhcmdzW2ldICYmIGFyZ3NbaV0gaW5zdGFuY2VvZiBFcnJvcikgeworCQkJdmFyIG1zZyA9ICJbIiArIGFyZ3NbaV0ubmFtZSArICI6ICIgKyBkb2pvLmVycm9yVG9TdHJpbmcoYXJnc1tpXSkgKyAoYXJnc1tpXS5maWxlTmFtZSA/ICIsIGZpbGU6ICIgKyBhcmdzW2ldLmZpbGVOYW1lIDogIiIpICsgKGFyZ3NbaV0ubGluZU51bWJlciA/ICIsIGxpbmU6ICIgKyBhcmdzW2ldLmxpbmVOdW1iZXIgOiAiIikgKyAiXSI7CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCXZhciBtc2cgPSBTdHJpbmcoYXJnc1tpXSk7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJCXZhciBtc2cgPSAiW0FjdGl2ZVhPYmplY3RdIjsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgbXNnID0gIlt1bmtub3duXSI7CisJCQkJfQorCQkJfQorCQl9CisJCXMucHVzaChtc2cpOworCX0KKwlkb2pvLmhvc3RlbnYucHJpbnRsbihzLmpvaW4oIiAiKSk7Cit9OworZG9qby5kZWJ1Z1NoYWxsb3cgPSBmdW5jdGlvbiAob2JqKSB7CisJaWYgKCFkakNvbmZpZy5pc0RlYnVnKSB7CisJCXJldHVybjsKKwl9CisJZG9qby5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJZG9qby5kZWJ1ZygiT2JqZWN0OiAiICsgb2JqKTsKKwl2YXIgcHJvcHMgPSBbXTsKKwlmb3IgKHZhciBwcm9wIGluIG9iaikgeworCQl0cnkgeworCQkJcHJvcHMucHVzaChwcm9wICsgIjogIiArIG9ialtwcm9wXSk7CisJCX0KKwkJY2F0Y2ggKEUpIHsKKwkJCXByb3BzLnB1c2gocHJvcCArICI6IEVSUk9SIC0gIiArIEUubWVzc2FnZSk7CisJCX0KKwl9CisJcHJvcHMuc29ydCgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKKwkJZG9qby5kZWJ1Zyhwcm9wc1tpXSk7CisJfQorCWRvam8uZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworfTsKK2Rvam8uZGVidWdEZWVwID0gZnVuY3Rpb24gKG9iaikgeworCWlmICghZGpDb25maWcuaXNEZWJ1ZykgeworCQlyZXR1cm47CisJfQorCWlmICghZG9qby51cmkgfHwgIWRvam8udXJpLmRvam9VcmkpIHsKKwkJcmV0dXJuIGRvam8uZGVidWcoIllvdSdsbCBuZWVkIHRvIGxvYWQgZG9qby51cmkuKiBmb3IgZGVlcCBkZWJ1Z2dpbmcgLSBzb3JyeSEiKTsKKwl9CisJaWYgKCF3aW5kb3cub3BlbikgeworCQlyZXR1cm4gZG9qby5kZWJ1ZygiRGVlcCBkZWJ1Z2dpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gaG9zdCBlbnZpcm9ubWVudHMgd2l0aCB3aW5kb3cub3BlbiIpOworCX0KKwl2YXIgaWR4ID0gZG9qby5kZWJ1Z0RlZXAuZGVidWdWYXJzLmxlbmd0aDsKKwlkb2pvLmRlYnVnRGVlcC5kZWJ1Z1ZhcnMucHVzaChvYmopOworCXZhciB1cmwgPSAoZGpDb25maWdbImRvam9EZWJ1Z0RlZXBIdG1sVXJsIl0gfHwgbmV3IGRvam8udXJpLlVyaShsb2NhdGlvbiwgZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLmRlYnVnIiwgImRlZXAuaHRtbCIpKS50b1N0cmluZygpKSArICI/dmFyPSIgKyBpZHg7CisJdmFyIHdpbiA9IHdpbmRvdy5vcGVuKHVybCwgIl9ibGFuayIsICJ3aWR0aD02MDAsIGhlaWdodD00MDAsIHJlc2l6YWJsZT15ZXMsIHNjcm9sbGJhcnM9eWVzLCBzdGF0dXM9eWVzIik7CisJdHJ5IHsKKwkJd2luLmRlYnVnVmFyID0gb2JqOworCX0KKwljYXRjaCAoZSkgeworCX0KK307Citkb2pvLmRlYnVnRGVlcC5kZWJ1Z1ZhcnMgPSBbXTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL0ZpcmVidWcuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvRmlyZWJ1Zy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE4YzkzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL0ZpcmVidWcuanMKQEAgLTAsMCArMSw1NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kZWJ1Zy5GaXJlYnVnIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uZGVidWcuRmlyZWJ1ZyBpcyBzbGF0ZWQgZm9yIHJlbW92YWwgaW4gMC41OyB1c2UgZG9qby5kZWJ1Zy5jb25zb2xlIGluc3RlYWQuIiwgIjAuNSIpOworaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJaWYgKGNvbnNvbGUgJiYgY29uc29sZS5sb2cpIHsKKwkJdmFyIGNvbnNvbGVMb2cgPSBmdW5jdGlvbiAoKSB7CisJCQlpZiAoIWRqQ29uZmlnLmlzRGVidWcpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2YXIgYXJncyA9IGRvam8ubGFuZy50b0FycmF5KGFyZ3VtZW50cyk7CisJCQlhcmdzLnNwbGljZSgwLCAwLCAiREVCVUc6ICIpOworCQkJY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJncyk7CisJCX07CisJCWRvam8uZGVidWcgPSBjb25zb2xlTG9nOworCQlkb2pvLmRlYnVnRGVlcCA9IGNvbnNvbGVMb2c7CisJCWRvam8uZGVidWdTaGFsbG93ID0gZnVuY3Rpb24gKG9iaikgeworCQkJaWYgKCFkakNvbmZpZy5pc0RlYnVnKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KG9iaikpIHsKKwkJCQljb25zb2xlLmxvZygiQXJyYXk6ICIsIG9iaik7CisJCQkJZm9yICh2YXIgaSA9IDA7IHggPCBvYmoubGVuZ3RoOyBpKyspIHsKKwkJCQkJY29uc29sZS5sb2coIgkiLCAiWyIgKyBpICsgIl0iLCBvYmpbaV0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29uc29sZS5sb2coIk9iamVjdDogIiwgb2JqKTsKKwkJCQl2YXIgcHJvcE5hbWVzID0gW107CisJCQkJZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKwkJCQkJcHJvcE5hbWVzLnB1c2gocHJvcCk7CisJCQkJfQorCQkJCXByb3BOYW1lcy5zb3J0KCk7CisJCQkJZG9qby5sYW5nLmZvckVhY2gocHJvcE5hbWVzLCBmdW5jdGlvbiAocHJvcCkgeworCQkJCQl0cnkgeworCQkJCQkJY29uc29sZS5sb2coIgkiLCBwcm9wLCBvYmpbcHJvcF0pOworCQkJCQl9CisJCQkJCWNhdGNoIChlKSB7CisJCQkJCQljb25zb2xlLmxvZygiCSIsIHByb3AsICJFUlJPUiIsIGUubWVzc2FnZSwgZSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfTsKKwl9IGVsc2UgeworCQlkb2pvLmRlYnVnKCJkb2pvLmRlYnVnLkZpcmVidWcgcmVxdWlyZXMgRmlyZWJ1ZyA+IDAuNCIpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2Fycm93X2hpZGUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2Fycm93X2hpZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDZiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvYXJyb3dfaGlkZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2Fycm93X3Nob3cuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2Fycm93X3Nob3cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDZiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvYXJyb3dfc2hvdy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2NvbnNvbGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvY29uc29sZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RlYnVnL2NvbnNvbGUuanMKQEAgLTAsMCArMSw5NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kZWJ1Zy5jb25zb2xlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubG9nZ2luZy5Db25zb2xlTG9nZ2VyIik7CitpZiAod2luZG93LmNvbnNvbGUpIHsKKwlpZiAoY29uc29sZS5pbmZvICE9IG51bGwpIHsKKwkJZG9qby5ob3N0ZW52LnByaW50bG4gPSBmdW5jdGlvbiAoKSB7CisJCQlpZiAoIWRqQ29uZmlnLmlzRGVidWcpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljb25zb2xlLmluZm8uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTsKKwkJfTsKKwkJZG9qby5kZWJ1ZyA9IGRvam8uaG9zdGVudi5wcmludGxuOworCQlkb2pvLmRlYnVnRGVlcCA9IGRvam8uZGVidWc7CisJCWRvam8uZGVidWdTaGFsbG93ID0gZnVuY3Rpb24gKG9iaiwgc2hvd01ldGhvZHMsIHNvcnQpIHsKKwkJCWlmICghZGpDb25maWcuaXNEZWJ1ZykgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNob3dNZXRob2RzID0gKHNob3dNZXRob2RzICE9IGZhbHNlKTsKKwkJCXNvcnQgPSAoc29ydCAhPSBmYWxzZSk7CisJCQlpZiAob2JqID09IG51bGwgfHwgb2JqLmNvbnN0cnVjdG9yID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZG9qby5kZWJ1ZyhvYmopOworCQkJfQorCQkJdmFyIHR5cGUgPSBvYmouZGVjbGFyZWRDbGFzczsKKwkJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCQl0eXBlID0gb2JqLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uXHMqKC4qKVwoLyk7CisJCQkJaWYgKHR5cGUpIHsKKwkJCQkJdHlwZSA9IHR5cGVbMV07CisJCQkJfQorCQkJfQorCQkJaWYgKHR5cGUpIHsKKwkJCQlpZiAodHlwZSA9PSAiU3RyaW5nIiB8fCB0eXBlID09ICJOdW1iZXIiKSB7CisJCQkJCXJldHVybiBkb2pvLmRlYnVnKHR5cGUgKyAiOiAiLCBvYmopOworCQkJCX0KKwkJCQlpZiAoc2hvd01ldGhvZHMgJiYgIXNvcnQpIHsKKwkJCQkJdmFyIHNvcnRlZE9iaiA9IG9iajsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXIgcHJvcE5hbWVzID0gW107CisJCQkJCWlmIChzaG93TWV0aG9kcykgeworCQkJCQkJZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKwkJCQkJCQlwcm9wTmFtZXMucHVzaChwcm9wKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZvciAodmFyIHByb3AgaW4gb2JqKSB7CisJCQkJCQkJaWYgKHR5cGVvZiBvYmpbcHJvcF0gIT0gImZ1bmN0aW9uIikgeworCQkJCQkJCQlwcm9wTmFtZXMucHVzaChwcm9wKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkb2pvLmRlYnVnKHByb3ApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoc29ydCkgeworCQkJCQkJcHJvcE5hbWVzLnNvcnQoKTsKKwkJCQkJfQorCQkJCQl2YXIgc29ydGVkT2JqID0ge307CisJCQkJCWRvam8ubGFuZy5mb3JFYWNoKHByb3BOYW1lcywgZnVuY3Rpb24gKHByb3ApIHsKKwkJCQkJCXNvcnRlZE9ialtwcm9wXSA9IG9ialtwcm9wXTsKKwkJCQkJfSk7CisJCQkJfQorCQkJCXJldHVybiBkb2pvLmRlYnVnKHR5cGUgKyAiOiAlb1xuJTIubyIsIG9iaiwgc29ydGVkT2JqKTsKKwkJCX0KKwkJCXJldHVybiBkb2pvLmRlYnVnKG9iai5jb25zdHJ1Y3RvciArICI6ICIsIG9iaik7CisJCX07CisJfSBlbHNlIHsKKwkJaWYgKGNvbnNvbGUubG9nICE9IG51bGwpIHsKKwkJCWRvam8uaG9zdGVudi5wcmludGxuID0gZnVuY3Rpb24gKCkgeworCQkJCWlmICghZGpDb25maWcuaXNEZWJ1ZykgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXZhciBhcmdzID0gZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzKTsKKwkJCQljb25zb2xlLmxvZygiREVCVUc6ICIgKyBhcmdzLmpvaW4oIiAiKSk7CisJCQl9OworCQkJZG9qby5kZWJ1ZyA9IGRvam8uaG9zdGVudi5wcmludGxuOworCQl9IGVsc2UgeworCQkJZG9qby5kZWJ1ZygiZG9qby5kZWJ1Zy5jb25zb2xlIHJlcXVpcmVzIEZpcmVidWcgPiAwLjQiKTsKKwkJfQorCX0KK30gZWxzZSB7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpIHsKKwkJaWYgKG9wZXJhICYmIG9wZXJhLnBvc3RFcnJvcikgeworCQkJZG9qby5ob3N0ZW52LnByaW50bG4gPSBvcGVyYS5wb3N0RXJyb3I7CisJCX0gZWxzZSB7CisJCQlkb2pvLmRlYnVnKCJkb2pvLmRlYnVnLk9wZXJhIHJlcXVpcmVzIE9wZXJhID4gOC4wIik7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kZWJ1Zy9kZWVwLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvZGVlcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjJmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvZGVlcC5odG1sCkBAIC0wLDAgKzEsMzYyIEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkRlZXAgRGVidWdnZXI8L3RpdGxlPgorPHNjcmlwdD4KKwordmFyIHRhYmxlUm93cyA9IHt9OwordmFyIHRhYmxlQ2VscyA9IHt9OwordmFyIHRhYmxlT2JqcyA9IHt9OwordmFyIHRhYmxlc0J1aWx0ID0ge307Cit2YXIgdGFibGVTaG93cyA9IHt9OwordmFyIHRhYmxlSGlkZXMgPSB7fTsKKworLy8gSUU6IG5vZGVzIHcvaWQgbmVlZCB0byBiZSByZWRlY2xhcmVkIG9yIGdldEVsZW1lbnRCeUlkIGlzIGIwcmtlZAordmFyIGZyYW1lID0gbnVsbDsKKword2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCl7CisJLy8gaWYgSUUgbG9hZHMgdGhpcyBwYWdlIHRvbyBxdWlja2x5IChpbnN0YW50bHkpIHRoZW4gCisJLy8gd2luZG93LmRlYnVnVmFyIG1pZ2h0IG5vdCBoYXZlIGJlZW4gc2V0CisJd2luZG93LnNldFRpbWVvdXQoc3RhcnRNZVVwLCAxMDApOworfQorCitmdW5jdGlvbiBzdGFydE1lVXAoKXsKKwlmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmcmFtZScpOworCS8vIEdFVCBzdHJpbmcgCisJdmFyIGluZGV4ID0gbG9jYXRpb24uc2VhcmNoLnNwbGl0KCI9IikucG9wKCk7CisJdmFyIGRlYnVnT2JqID0gd2luZG93Lm9wZW5lci5kb2pvLmRlYnVnRGVlcDsKKwl2YXIgZGVidWdWYXIgPSBkZWJ1Z09iai5kZWJ1Z1ZhcnNbaW5kZXhdIHx8IHdpbmRvdy5kZWJ1Z1ZhcjsKKwlidWlsZFRhYmxlKCdyb290JywgZnJhbWUsIGRlYnVnVmFyKTsKK30KKworZnVuY3Rpb24gYnVpbGRUYWJsZShwYXRoLCBwYXJlbnQsIG9iail7CisJdmFyIGtleXMgPSBbXTsKKwl2YXIgdmFscyA9IFtdOworCWZvcih2YXIgcHJvcCBpbiBvYmopeworCQlrZXlzLnB1c2gocHJvcCk7CisJCXRyeSB7CisJCQl2YWxzW3Byb3BdID0gb2JqW3Byb3BdOworCQl9IGNhdGNoKEUpIHsKKwkJCXZhbHNbcHJvcF0gPSAnRVJST1I6ICcgKyBFLm1lc3NhZ2U7CisJCX0KKwl9CisJa2V5cy5zb3J0KGtleVNvcnRlcik7CisKKwlpZiAoIWtleXMubGVuZ3RoKXsKKworCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnT2JqZWN0IGhhcyBubyBwcm9wZXJ0aWVzLicpKTsKKworCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJcmV0dXJuOworCX0KKworCisJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpOworCXQuYm9yZGVyID0gIjEiOworCisJdmFyIHRiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKKwl0LmFwcGVuZENoaWxkKHRiKTsKKworCisJZm9yKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKwkJYnVpbGRUYWJsZVJvdyhwYXRoKyctJytrZXlzW2ldLCB0Yiwga2V5c1tpXSwgdmFsc1trZXlzW2ldXSk7CisJfQorCisJaWYgKHBhdGggPT0gJ3Jvb3QnKXsKKwkJLy90LnN0eWxlLndpZHRoID0gJzkwJSc7CisJfQorCXQuc3R5bGUud2lkdGggPSAnMTAwJSc7CisKKwlwYXJlbnQuYXBwZW5kQ2hpbGQodCk7CisKKwl0YWJsZXNCdWlsdFtwYXRoXSA9IHRydWU7Cit9CisKK2Z1bmN0aW9uIGJ1aWxkVGFibGVSb3cocGF0aCwgdGIsIG5hbWUsIHZhbHVlKSB7CisKKwl2YXIgc2ltcGxlVHlwZSA9IHR5cGVvZih2YWx1ZSk7CisJdmFyIGNyZWF0ZVN1YnJvdyA9IChzaW1wbGVUeXBlID09ICdvYmplY3QnKTsKKwl2YXIgY29tcGxleFR5cGUgPSBzaW1wbGVUeXBlOworCisJaWYgKHNpbXBsZVR5cGUgPT0gJ29iamVjdCcpeworCQl2YXIgY2xzID0gZ2V0Q29uc3RydWN0b3JDbGFzcyh2YWx1ZSk7CisJCWlmIChjbHMpeworCQkJaWYgKGNscyA9PSAnT2JqZWN0Jyl7CisJCQl9ZWxzZSBpZiAoY2xzID09ICdBcnJheScpeworCQkJCWNvbXBsZXhUeXBlID0gJ2FycmF5JzsKKwkJCX1lbHNleworCQkJCWNvbXBsZXhUeXBlICs9ICcgKCcrY2xzKycpJzsKKwkJCX0KKwkJfQorCX0KKworLyp2YXIgdHIxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKKwl2YXIgdGQxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwl2YXIgdGQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwl2YXIgdGQzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwl2YXIgdGQ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsqLworCisJdmFyIHJvdyA9IHRiLnJvd3MubGVuZ3RoOworCXZhciB0cjEgPSB0Yi5pbnNlcnRSb3cocm93KyspOworCXZhciB0ZDEgPSB0cjEuaW5zZXJ0Q2VsbCgwKTsKKwl2YXIgdGQyID0gdHIxLmluc2VydENlbGwoMSk7CisJdmFyIHRkMyA9IHRyMS5pbnNlcnRDZWxsKDIpOworCXZhciB0ZDQgPSB0cjEuaW5zZXJ0Q2VsbCgzKTsKKwkKKwl0cjEuc3R5bGUudmVydGljYWxBbGlnbiA9ICd0b3AnOworCXRkMS5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ21pZGRsZSc7CisKKwl0ZDEuY2xhc3NOYW1lID0gJ3Byb3BQbHVzJzsKKwl0ZDIuY2xhc3NOYW1lID0gJ3Byb3BOYW1lJzsKKwl0ZDMuY2xhc3NOYW1lID0gJ3Byb3BUeXBlJzsKKwl0ZDQuY2xhc3NOYW1lID0gJ3Byb3BWYWwnOworCisJLy90cjEuYXBwZW5kQ2hpbGQodGQxKTsKKwkvL3RyMS5hcHBlbmRDaGlsZCh0ZDIpOworCS8vdHIxLmFwcGVuZENoaWxkKHRkMyk7CisJLy90cjEuYXBwZW5kQ2hpbGQodGQ0KTsKKworCWlmIChjcmVhdGVTdWJyb3cpeworCQl2YXIgaW1nMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQlpbWcxLndpZHRoID0gOTsKKwkJaW1nMS5oZWlnaHQgPSA5OworCQlpbWcxLnNyYyA9ICdhcnJvd19zaG93LmdpZic7CisJCXZhciBhMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKwkJYTEuYXBwZW5kQ2hpbGQoaW1nMSk7CisJCWExLmhyZWYgPSAnIyc7CisJCWExLm9uY2xpY2sgPSBmdW5jdGlvbigpeyBzaG93VGFibGVSb3cocGF0aCk7IHJldHVybiBmYWxzZTsgfTsKKworCQl2YXIgaW1nMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQlpbWcyLndpZHRoID0gOTsKKwkJaW1nMi5oZWlnaHQgPSA5OworCQlpbWcyLnNyYyA9ICdhcnJvd19oaWRlLmdpZic7CisJCXZhciBhMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKwkJYTIuYXBwZW5kQ2hpbGQoaW1nMik7CisJCWEyLmhyZWYgPSAnIyc7CisJCWEyLm9uY2xpY2sgPSBmdW5jdGlvbigpeyBoaWRlVGFibGVSb3cocGF0aCk7IHJldHVybiBmYWxzZTsgfTsKKwkJYTIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKworCQl0YWJsZVNob3dzW3BhdGhdID0gYTE7CisJCXRhYmxlSGlkZXNbcGF0aF0gPSBhMjsKKworCQl0ZDEuYXBwZW5kQ2hpbGQoYTEpOworCQl0ZDEuYXBwZW5kQ2hpbGQoYTIpOworCX1lbHNleworCQl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJCWltZy53aWR0aCA9IDk7CisJCWltZy5oZWlnaHQgPSA5OworCQlpbWcuc3JjID0gJ3NwYWNlci5naWYnOworCisJCXRkMS5hcHBlbmRDaGlsZChpbWcpOworCX0KKworCXRkMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKSk7CisJdGQzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbXBsZXhUeXBlKSk7CisJdGQ0LmFwcGVuZENoaWxkKGJ1aWxkUHJlQmxvY2sodmFsdWUpKTsKKworCS8vdGIuYXBwZW5kQ2hpbGQodHIxKTsKKworCWlmIChjcmVhdGVTdWJyb3cpeworCQl2YXIgdHIyID0gdGIuaW5zZXJ0Um93KHJvdysrKTsKKwkJdmFyIHRkNSA9IHRyMi5pbnNlcnRDZWxsKDApOworCQl2YXIgdGQ2ID0gdHIyLmluc2VydENlbGwoMSk7CisJCQorCQkvL3ZhciB0cjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOworCQkvL3ZhciB0ZDUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCQkvL3ZhciB0ZDYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCisJCXRkNS5pbm5lckhUTUwgPSAnJm5ic3A7JzsKKwkJLy90ZDYuaW5uZXJIVE1MID0gJyZuYnNwOyc7CisKKwkJdGQ2LmNvbFNwYW4gPSAnMyc7CisKKwkJdHIyLmFwcGVuZENoaWxkKHRkNSk7CisJCXRyMi5hcHBlbmRDaGlsZCh0ZDYpOworCisJCXRyMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCisJCXRiLmFwcGVuZENoaWxkKHRyMik7CisKKwkJdGFibGVSb3dzW3BhdGhdID0gdHIyOworCQl0YWJsZUNlbHNbcGF0aF0gPSB0ZDY7CisJCXRhYmxlT2Jqc1twYXRoXSA9IHZhbHVlOworCX0KK30KKworZnVuY3Rpb24gc2hvd1RhYmxlUm93KHBhdGgpeworCisJdmFyIHRyID0gdGFibGVSb3dzW3BhdGhdOworCXZhciB0ZCA9IHRhYmxlQ2Vsc1twYXRoXTsKKwl2YXIgYTEgPSB0YWJsZVNob3dzW3BhdGhdOworCXZhciBhMiA9IHRhYmxlSGlkZXNbcGF0aF07CisKKwlpZiAoIXRhYmxlc0J1aWx0W3BhdGhdKXsKKworCQkvL2FsZXJ0KCdidWlsZGluZyB0YWJsZSBmb3IgJytwYXRoKTsKKwkJYnVpbGRUYWJsZShwYXRoLCB0ZCwgdGFibGVPYmpzW3BhdGhdKTsKKwl9CisKKwl0ci5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlLXJvdyc7CisKKwlhMS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCWEyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKK30KKworZnVuY3Rpb24gaGlkZVRhYmxlUm93KHBhdGgpeworCisJdmFyIHRyID0gdGFibGVSb3dzW3BhdGhdOworCXZhciBhMSA9IHRhYmxlU2hvd3NbcGF0aF07CisJdmFyIGEyID0gdGFibGVIaWRlc1twYXRoXTsKKworCXRyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisKKwlhMS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CisJYTIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKK30KKworZnVuY3Rpb24gYnVpbGRQcmVCbG9jayh2YWx1ZSl7CisKKwkvLworCS8vIGhvdyBtYW55IGxpbmVzID8KKwkvLworCisJdmFyIHMgPSAnJyt2YWx1ZTsKKwlzID0gcy5yZXBsYWNlKCJcclxuIiwgIlxuIik7CisJcyA9IHMucmVwbGFjZSgiXHIiLCAiIik7CisJdmFyIGxpbmVzID0gcy5zcGxpdCgiXG4iKTsKKworCisJaWYgKGxpbmVzLmxlbmd0aCA8IDIpeworCisJCWlmIChsaW5lc1swXS5sZW5ndGggPCA2MCl7CisKKwkJCXZhciBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTsKKwkJCXByZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSk7CisJCQlyZXR1cm4gcHJlOworCQl9CisJfQorCisKKwkvLworCS8vIG11bHRpcGxlIGxpbmVzIDooCisJLy8KKworCXZhciBwcmV2aWV3ID0gbGluZXNbMF0uc3Vic3RyKDAsIDYwKSArICcgLi4uJzsKKworCXZhciBwcmUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7CisJcHJlMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwcmV2aWV3KSk7CisJcHJlMS5jbGFzc05hbWUgPSAnY2xpY2t5JzsKKworCXZhciBwcmUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7CisJcHJlMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSk7CisJcHJlMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCXByZTIuY2xhc3NOYW1lID0gJ2NsaWNreSc7CisKKwlwcmUxLm9uY2xpY2sgPSBmdW5jdGlvbigpeworCQlwcmUxLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJCXByZTIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CisJfQorCisJcHJlMi5vbmNsaWNrID0gZnVuY3Rpb24oKXsKKwkJcHJlMS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKKwkJcHJlMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCX0KKworCXZhciBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKworCXByZS5hcHBlbmRDaGlsZChwcmUxKTsKKwlwcmUuYXBwZW5kQ2hpbGQocHJlMik7CisKKwlyZXR1cm4gcHJlOworfQorCitmdW5jdGlvbiBnZXRDb25zdHJ1Y3RvckNsYXNzKG9iail7CisKKwlpZiAoIW9iai5jb25zdHJ1Y3RvciB8fCAhb2JqLmNvbnN0cnVjdG9yLnRvU3RyaW5nKSByZXR1cm47CisKKwl2YXIgbSA9IG9iai5jb25zdHJ1Y3Rvci50b1N0cmluZygpLm1hdGNoKC9mdW5jdGlvblxzKihcdyspLyk7CisKKwlpZiAobSAmJiBtLmxlbmd0aCA9PSAyKSByZXR1cm4gbVsxXTsKKworCXJldHVybiBudWxsOworfQorCitmdW5jdGlvbiBrZXlTb3J0ZXIoYSwgYil7CisKKwlpZiAoYSA9PSBwYXJzZUludChhKSAmJiBiID09IHBhcnNlSW50KGIpKXsKKworCQlyZXR1cm4gKHBhcnNlSW50KGEpID4gcGFyc2VJbnQoYikpID8gMSA6ICgocGFyc2VJbnQoYSkgPCBwYXJzZUludChiKSkgPyAtMSA6IDApOworCX0KKworCS8vIHNvcnQgYnkgbG93ZXJjYXNlIHN0cmluZworCisJdmFyIGEyID0gU3RyaW5nKGEpLnRvTG93ZXJDYXNlKCk7CisJdmFyIGIyID0gU3RyaW5nKGIpLnRvTG93ZXJDYXNlKCk7CisKKwlyZXR1cm4gKGEyID4gYjIpID8gMSA6ICgoYTIgPCBiMikgPyAtMSA6IDApOworfQorCis8L3NjcmlwdD4KKzxzdHlsZT4KKworYm9keSB7CisJZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CisKK3RhYmxlIHsKKwlib3JkZXItd2lkdGg6IDBweDsKKwlib3JkZXItc3BhY2luZzogMXB4OworCWJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7Cit9CisKK3RkIHsKKwlib3JkZXItd2lkdGg6IDBweDsKKwlwYWRkaW5nOiAycHg7Cit9CisKK2ltZyB7CisJYm9yZGVyOiAwOworfQorCitwcmUgeworCW1hcmdpbjogMDsKKwlwYWRkaW5nOiAwOworCXdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyAgLyogTW96aWxsYSwgc3VwcG9ydGVkIHNpbmNlIDE5OTkgKi8KKwl3aGl0ZS1zcGFjZTogLXByZS13cmFwOyAgICAgIC8qIE9wZXJhIDQgLSA2ICovCisJd2hpdGUtc3BhY2U6IC1vLXByZS13cmFwOyAgICAvKiBPcGVyYSA3ICovCisJd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgICAvKiBDU1MzIC0gVGV4dCBtb2R1bGUgKENhbmRpZGF0ZSBSZWNvbW1lbmRhdGlvbikgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy10ZXh0LyN3aGl0ZS1zcGFjZSAqLworCXdvcmQtd3JhcDogYnJlYWstd29yZDsgICAgICAgLyogSUUgNS41KyAqLworfQorCitwcmUuY2xpY2t5IHsKKwljdXJzb3I6IGhhbmQ7CisJY3Vyc29yOiBwb2ludGVyOworfQorCit0ZC5wcm9wUGx1cyB7CisJd2lkdGg6IDlweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOworfQorCit0ZC5wcm9wTmFtZSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKK30KKwordGQucHJvcFR5cGUgeworCWJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cit9CisKK3RkLnByb3BWYWwgeworCWJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cit9CisKKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPkphdmFzY3JpcHQgT2JqZWN0IEJyb3dzZXI8L2gyPgorCis8ZGl2IGlkPSJmcmFtZSI+PC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvc3BhY2VyLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kZWJ1Zy9zcGFjZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTUwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZGVidWcvc3BhY2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0RyYWdBbmREcm9wLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9EcmFnQW5kRHJvcC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNiZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9EcmFnQW5kRHJvcC5qcwpAQCAtMCwwICsxLDc2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnByb3ZpZGUoImRvam8uZG5kLkRyYWdBbmREcm9wIik7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdTb3VyY2UiLCBudWxsLCB7dHlwZToiIiwgb25EcmFnRW5kOmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uIChldnQpIHsKK30sIG9uU2VsZWN0ZWQ6ZnVuY3Rpb24gKGV2dCkgeworfSwgdW5yZWdpc3RlcjpmdW5jdGlvbiAoKSB7CisJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7Cit9LCByZXJlZ2lzdGVyOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmRuZC5kcmFnTWFuYWdlci5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdPYmplY3QiLCBudWxsLCB7dHlwZToiIiwgcmVnaXN0ZXI6ZnVuY3Rpb24gKCkgeworCXZhciBkbSA9IGRvam8uZG5kLmRyYWdNYW5hZ2VyOworCWlmIChkbVsicmVnaXN0ZXJEcmFnT2JqZWN0Il0pIHsKKwkJZG0ucmVnaXN0ZXJEcmFnT2JqZWN0KHRoaXMpOworCX0KK30sIG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJhZ01vdmU6ZnVuY3Rpb24gKGV2dCkgeworfSwgb25EcmFnT3ZlcjpmdW5jdGlvbiAoZXZ0KSB7Cit9LCBvbkRyYWdPdXQ6ZnVuY3Rpb24gKGV2dCkgeworfSwgb25EcmFnRW5kOmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJhZ0xlYXZlOmRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdXQiKSwgb25EcmFnRW50ZXI6ZG9qby5sYW5nLmZvcndhcmQoIm9uRHJhZ092ZXIiKSwgb25kcmFnb3V0OmRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdXQiKSwgb25kcmFnb3Zlcjpkb2pvLmxhbmcuZm9yd2FyZCgib25EcmFnT3ZlciIpfSk7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyb3BUYXJnZXQiLCBudWxsLCB7YWNjZXB0c1R5cGU6ZnVuY3Rpb24gKHR5cGUpIHsKKwlpZiAoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMuYWNjZXB0ZWRUeXBlcywgIioiKSkgeworCQlpZiAoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMuYWNjZXB0ZWRUeXBlcywgdHlwZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIGFjY2VwdHM6ZnVuY3Rpb24gKGRyYWdPYmplY3RzKSB7CisJaWYgKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLmFjY2VwdGVkVHlwZXMsICIqIikpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJaWYgKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLmFjY2VwdGVkVHlwZXMsIGRyYWdPYmplY3RzW2ldLnR5cGUpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorCXJldHVybiB0cnVlOworfSwgdW5yZWdpc3RlcjpmdW5jdGlvbiAoKSB7CisJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyb3BUYXJnZXQodGhpcyk7Cit9LCBvbkRyYWdPdmVyOmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJhZ091dDpmdW5jdGlvbiAoZXZ0KSB7Cit9LCBvbkRyYWdNb3ZlOmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJvcFN0YXJ0OmZ1bmN0aW9uIChldnQpIHsKK30sIG9uRHJvcDpmdW5jdGlvbiAoZXZ0KSB7Cit9LCBvbkRyb3BFbmQ6ZnVuY3Rpb24gKCkgeworfX0sIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmFjY2VwdGVkVHlwZXMgPSBbXTsKK30pOworZG9qby5kbmQuRHJhZ0V2ZW50ID0gZnVuY3Rpb24gKCkgeworCXRoaXMuZHJhZ1NvdXJjZSA9IG51bGw7CisJdGhpcy5kcmFnT2JqZWN0ID0gbnVsbDsKKwl0aGlzLnRhcmdldCA9IG51bGw7CisJdGhpcy5ldmVudFN0YXR1cyA9ICJzdWNjZXNzIjsKK307Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdNYW5hZ2VyIiwgbnVsbCwge3NlbGVjdGVkU291cmNlczpbXSwgZHJhZ09iamVjdHM6W10sIGRyYWdTb3VyY2VzOltdLCByZWdpc3RlckRyYWdTb3VyY2U6ZnVuY3Rpb24gKHNvdXJjZSkgeworfSwgZHJvcFRhcmdldHM6W10sIHJlZ2lzdGVyRHJvcFRhcmdldDpmdW5jdGlvbiAodGFyZ2V0KSB7Cit9LCBsYXN0RHJhZ1RhcmdldDpudWxsLCBjdXJyZW50RHJhZ1RhcmdldDpudWxsLCBvbktleURvd246ZnVuY3Rpb24gKCkgeworfSwgb25Nb3VzZU91dDpmdW5jdGlvbiAoKSB7Cit9LCBvbk1vdXNlTW92ZTpmdW5jdGlvbiAoKSB7Cit9LCBvbk1vdXNlVXA6ZnVuY3Rpb24gKCkgeworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnQW5kRHJvcC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvSHRtbERyYWdBbmREcm9wLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTAyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnQW5kRHJvcC5qcwpAQCAtMCwwICsxLDM2OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuSHRtbERyYWdBbmREcm9wIik7Citkb2pvLnJlcXVpcmUoImRvam8uZG5kLkh0bWxEcmFnTWFuYWdlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRuZC5EcmFnQW5kRHJvcCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwudXRpbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5pZnJhbWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSIsIGRvam8uZG5kLkRyYWdTb3VyY2UsIHtkcmFnQ2xhc3M6IiIsIG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uICgpIHsKKwl2YXIgZHJhZ09iaiA9IG5ldyBkb2pvLmRuZC5IdG1sRHJhZ09iamVjdCh0aGlzLmRyYWdPYmplY3QsIHRoaXMudHlwZSk7CisJaWYgKHRoaXMuZHJhZ0NsYXNzKSB7CisJCWRyYWdPYmouZHJhZ0NsYXNzID0gdGhpcy5kcmFnQ2xhc3M7CisJfQorCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCWRyYWdPYmouY29uc3RyYWluVG8odGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIgfHwgdGhpcy5kb21Ob2RlLnBhcmVudE5vZGUpOworCX0KKwlyZXR1cm4gZHJhZ09iajsKK30sIHNldERyYWdIYW5kbGU6ZnVuY3Rpb24gKG5vZGUpIHsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMpOworCXRoaXMuZG9tTm9kZSA9IG5vZGU7CisJZG9qby5kbmQuZHJhZ01hbmFnZXIucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMpOworfSwgc2V0RHJhZ1RhcmdldDpmdW5jdGlvbiAobm9kZSkgeworCXRoaXMuZHJhZ09iamVjdCA9IG5vZGU7Cit9LCBjb25zdHJhaW5UbzpmdW5jdGlvbiAoY29udGFpbmVyKSB7CisJdGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lciA9IHRydWU7CisJaWYgKGNvbnRhaW5lcikgeworCQl0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciA9IGNvbnRhaW5lcjsKKwl9Cit9LCBvblNlbGVjdGVkOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHJhZ09iamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJZG9qby5kbmQuZHJhZ01hbmFnZXIuc2VsZWN0ZWRTb3VyY2VzLnB1c2gobmV3IGRvam8uZG5kLkh0bWxEcmFnU291cmNlKHRoaXMuZHJhZ09iamVjdHNbaV0pKTsKKwl9Cit9LCBhZGREcmFnT2JqZWN0czpmdW5jdGlvbiAoZWwpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQl0aGlzLmRyYWdPYmplY3RzLnB1c2goZG9qby5ieUlkKGFyZ3VtZW50c1tpXSkpOworCX0KK319LCBmdW5jdGlvbiAobm9kZSwgdHlwZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdGhpcy5kcmFnT2JqZWN0cyA9IFtdOworCXRoaXMuY29uc3RyYWluVG9Db250YWluZXIgPSBmYWxzZTsKKwlpZiAobm9kZSkgeworCQl0aGlzLmRvbU5vZGUgPSBub2RlOworCQl0aGlzLmRyYWdPYmplY3QgPSBub2RlOworCQl0aGlzLnR5cGUgPSAodHlwZSkgfHwgKHRoaXMuZG9tTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKKwkJZG9qby5kbmQuRHJhZ1NvdXJjZS5wcm90b3R5cGUucmVyZWdpc3Rlci5jYWxsKHRoaXMpOworCX0KK30pOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ09iamVjdCIsIGRvam8uZG5kLkRyYWdPYmplY3QsIHtkcmFnQ2xhc3M6IiIsIG9wYWNpdHk6MC41LCBjcmVhdGVJZnJhbWU6dHJ1ZSwgZGlzYWJsZVg6ZmFsc2UsIGRpc2FibGVZOmZhbHNlLCBjcmVhdGVEcmFnTm9kZTpmdW5jdGlvbiAoKSB7CisJdmFyIG5vZGUgPSB0aGlzLmRvbU5vZGUuY2xvbmVOb2RlKHRydWUpOworCWlmICh0aGlzLmRyYWdDbGFzcykgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSwgdGhpcy5kcmFnQ2xhc3MpOworCX0KKwlpZiAodGhpcy5vcGFjaXR5IDwgMSkgeworCQlkb2pvLmh0bWwuc2V0T3BhY2l0eShub2RlLCB0aGlzLm9wYWNpdHkpOworCX0KKwl2YXIgbHRuID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJdmFyIGlzVHIgPSAobHRuID09ICJ0ciIpOworCWlmICgoaXNUcikgfHwgKGx0biA9PSAidGJvZHkiKSkgeworCQl2YXIgZG9jID0gdGhpcy5kb21Ob2RlLm93bmVyRG9jdW1lbnQ7CisJCXZhciB0YWJsZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOworCQlpZiAoaXNUcikgeworCQkJdmFyIHRib2R5ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7CisJCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7CisJCQl0Ym9keS5hcHBlbmRDaGlsZChub2RlKTsKKwkJfSBlbHNlIHsKKwkJCXRhYmxlLmFwcGVuZENoaWxkKG5vZGUpOworCQl9CisJCXZhciB0bXBTcmNUciA9ICgoaXNUcikgPyB0aGlzLmRvbU5vZGUgOiB0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7CisJCXZhciB0bXBEc3RUciA9ICgoaXNUcikgPyBub2RlIDogbm9kZS5maXJzdENoaWxkKTsKKwkJdmFyIGRvbVRkcyA9IHRtcFNyY1RyLmNoaWxkTm9kZXM7CisJCXZhciBjbG9uZVRkcyA9IHRtcERzdFRyLmNoaWxkTm9kZXM7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZG9tVGRzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoKGNsb25lVGRzW2ldKSAmJiAoY2xvbmVUZHNbaV0uc3R5bGUpKSB7CisJCQkJY2xvbmVUZHNbaV0uc3R5bGUud2lkdGggPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveChkb21UZHNbaV0pLndpZHRoICsgInB4IjsKKwkJCX0KKwkJfQorCQlub2RlID0gdGFibGU7CisJfQorCWlmICgoZG9qby5yZW5kZXIuaHRtbC5pZTU1IHx8IGRvam8ucmVuZGVyLmh0bWwuaWU2MCkgJiYgdGhpcy5jcmVhdGVJZnJhbWUpIHsKKwkJd2l0aCAobm9kZS5zdHlsZSkgeworCQkJdG9wID0gIjBweCI7CisJCQlsZWZ0ID0gIjBweCI7CisJCX0KKwkJdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCW91dGVyLmFwcGVuZENoaWxkKG5vZGUpOworCQl0aGlzLmJnSWZyYW1lID0gbmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKG91dGVyKTsKKwkJb3V0ZXIuYXBwZW5kQ2hpbGQodGhpcy5iZ0lmcmFtZS5pZnJhbWUpOworCQlub2RlID0gb3V0ZXI7CisJfQorCW5vZGUuc3R5bGUuekluZGV4ID0gOTk5OworCXJldHVybiBub2RlOworfSwgb25EcmFnU3RhcnQ6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmh0bWwuY2xlYXJTZWxlY3Rpb24oKTsKKwl0aGlzLnNjcm9sbE9mZnNldCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisJdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgdHJ1ZSk7CisJdGhpcy5kcmFnT2Zmc2V0ID0ge3k6dGhpcy5kcmFnU3RhcnRQb3NpdGlvbi55IC0gZS5wYWdlWSwgeDp0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnggLSBlLnBhZ2VYfTsKKwl0aGlzLmRyYWdDbG9uZSA9IHRoaXMuY3JlYXRlRHJhZ05vZGUoKTsKKwl0aGlzLmNvbnRhaW5pbmdCbG9ja1Bvc2l0aW9uID0gdGhpcy5kb21Ob2RlLm9mZnNldFBhcmVudCA/IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZS5vZmZzZXRQYXJlbnQsIHRydWUpIDoge3g6MCwgeTowfTsKKwlpZiAodGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcikgeworCQl0aGlzLmNvbnN0cmFpbnRzID0gdGhpcy5nZXRDb25zdHJhaW50cygpOworCX0KKwl3aXRoICh0aGlzLmRyYWdDbG9uZS5zdHlsZSkgeworCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCXRvcCA9IHRoaXMuZHJhZ09mZnNldC55ICsgZS5wYWdlWSArICJweCI7CisJCWxlZnQgPSB0aGlzLmRyYWdPZmZzZXQueCArIGUucGFnZVggKyAicHgiOworCX0KKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkcmFnU3RhcnQiLCB7c291cmNlOnRoaXN9KTsKK30sIGdldENvbnN0cmFpbnRzOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiYm9keSIpIHsKKwkJdmFyIHZpZXdwb3J0ID0gZG9qby5odG1sLmdldFZpZXdwb3J0KCk7CisJCXZhciB3aWR0aCA9IHZpZXdwb3J0LndpZHRoOworCQl2YXIgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0OworCQl2YXIgc2Nyb2xsID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwkJdmFyIHggPSBzY3JvbGwueDsKKwkJdmFyIHkgPSBzY3JvbGwueTsKKwl9IGVsc2UgeworCQl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyKTsKKwkJd2lkdGggPSBjb250ZW50LndpZHRoOworCQloZWlnaHQgPSBjb250ZW50LmhlaWdodDsKKwkJeCA9IHRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24ueCArIGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLCAicGFkZGluZy1sZWZ0IiwgdHJ1ZSkgKyBkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLCAibGVmdCIpOworCQl5ID0gdGhpcy5jb250YWluaW5nQmxvY2tQb3NpdGlvbi55ICsgZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIsICJwYWRkaW5nLXRvcCIsIHRydWUpICsgZG9qby5odG1sLmdldEJvcmRlckV4dGVudCh0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciwgInRvcCIpOworCX0KKwl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJcmV0dXJuIHttaW5YOngsIG1pblk6eSwgbWF4WDp4ICsgd2lkdGggLSBtYi53aWR0aCwgbWF4WTp5ICsgaGVpZ2h0IC0gbWIuaGVpZ2h0fTsKK30sIHVwZGF0ZURyYWdPZmZzZXQ6ZnVuY3Rpb24gKCkgeworCXZhciBzY3JvbGwgPSBkb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OworCWlmIChzY3JvbGwueSAhPSB0aGlzLnNjcm9sbE9mZnNldC55KSB7CisJCXZhciBkaWZmID0gc2Nyb2xsLnkgLSB0aGlzLnNjcm9sbE9mZnNldC55OworCQl0aGlzLmRyYWdPZmZzZXQueSArPSBkaWZmOworCQl0aGlzLnNjcm9sbE9mZnNldC55ID0gc2Nyb2xsLnk7CisJfQorCWlmIChzY3JvbGwueCAhPSB0aGlzLnNjcm9sbE9mZnNldC54KSB7CisJCXZhciBkaWZmID0gc2Nyb2xsLnggLSB0aGlzLnNjcm9sbE9mZnNldC54OworCQl0aGlzLmRyYWdPZmZzZXQueCArPSBkaWZmOworCQl0aGlzLnNjcm9sbE9mZnNldC54ID0gc2Nyb2xsLng7CisJfQorfSwgb25EcmFnTW92ZTpmdW5jdGlvbiAoZSkgeworCXRoaXMudXBkYXRlRHJhZ09mZnNldCgpOworCXZhciB4ID0gdGhpcy5kcmFnT2Zmc2V0LnggKyBlLnBhZ2VYOworCXZhciB5ID0gdGhpcy5kcmFnT2Zmc2V0LnkgKyBlLnBhZ2VZOworCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCWlmICh4IDwgdGhpcy5jb25zdHJhaW50cy5taW5YKSB7CisJCQl4ID0gdGhpcy5jb25zdHJhaW50cy5taW5YOworCQl9CisJCWlmICh5IDwgdGhpcy5jb25zdHJhaW50cy5taW5ZKSB7CisJCQl5ID0gdGhpcy5jb25zdHJhaW50cy5taW5ZOworCQl9CisJCWlmICh4ID4gdGhpcy5jb25zdHJhaW50cy5tYXhYKSB7CisJCQl4ID0gdGhpcy5jb25zdHJhaW50cy5tYXhYOworCQl9CisJCWlmICh5ID4gdGhpcy5jb25zdHJhaW50cy5tYXhZKSB7CisJCQl5ID0gdGhpcy5jb25zdHJhaW50cy5tYXhZOworCQl9CisJfQorCXRoaXMuc2V0QWJzb2x1dGVQb3NpdGlvbih4LCB5KTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRyYWdNb3ZlIiwge3NvdXJjZTp0aGlzfSk7Cit9LCBzZXRBYnNvbHV0ZVBvc2l0aW9uOmZ1bmN0aW9uICh4LCB5KSB7CisJaWYgKCF0aGlzLmRpc2FibGVZKSB7CisJCXRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IHkgKyAicHgiOworCX0KKwlpZiAoIXRoaXMuZGlzYWJsZVgpIHsKKwkJdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IHggKyAicHgiOworCX0KK30sIG9uRHJhZ0VuZDpmdW5jdGlvbiAoZSkgeworCXN3aXRjaCAoZS5kcmFnU3RhdHVzKSB7CisJICBjYXNlICJkcm9wU3VjY2VzcyI6CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZHJhZ0Nsb25lKTsKKwkJdGhpcy5kcmFnQ2xvbmUgPSBudWxsOworCQlicmVhazsKKwkgIGNhc2UgImRyb3BGYWlsdXJlIjoKKwkJdmFyIHN0YXJ0Q29vcmRzID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kcmFnQ2xvbmUsIHRydWUpOworCQl2YXIgZW5kQ29vcmRzID0ge2xlZnQ6dGhpcy5kcmFnU3RhcnRQb3NpdGlvbi54ICsgMSwgdG9wOnRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueSArIDF9OworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnNsaWRlVG8odGhpcy5kcmFnQ2xvbmUsIGVuZENvb3JkcywgMzAwKTsKKwkJdmFyIGRyYWdPYmplY3QgPSB0aGlzOworCQlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uRW5kIiwgZnVuY3Rpb24gKGUpIHsKKwkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGRyYWdPYmplY3QuZHJhZ0Nsb25lKTsKKwkJCWRyYWdPYmplY3QuZHJhZ0Nsb25lID0gbnVsbDsKKwkJfSk7CisJCWFuaW0ucGxheSgpOworCQlicmVhazsKKwl9CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkcmFnRW5kIiwge3NvdXJjZTp0aGlzfSk7Cit9LCBjb25zdHJhaW5UbzpmdW5jdGlvbiAoY29udGFpbmVyKSB7CisJdGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lciA9IHRydWU7CisJaWYgKGNvbnRhaW5lcikgeworCQl0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciA9IGNvbnRhaW5lcjsKKwl9IGVsc2UgeworCQl0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciA9IHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlOworCX0KK319LCBmdW5jdGlvbiAobm9kZSwgdHlwZSkgeworCXRoaXMuZG9tTm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMuY29uc3RyYWluVG9Db250YWluZXIgPSBmYWxzZTsKKwl0aGlzLmRyYWdTb3VyY2UgPSBudWxsOworCWRvam8uZG5kLkRyYWdPYmplY3QucHJvdG90eXBlLnJlZ2lzdGVyLmNhbGwodGhpcyk7Cit9KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuSHRtbERyb3BUYXJnZXQiLCBkb2pvLmRuZC5Ecm9wVGFyZ2V0LCB7dmVydGljYWw6ZmFsc2UsIG9uRHJhZ092ZXI6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIXRoaXMuYWNjZXB0cyhlLmRyYWdPYmplY3RzKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMuY2hpbGRCb3hlcyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBjaGlsZDsgaSA8IHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWNoaWxkID0gdGhpcy5kb21Ob2RlLmNoaWxkTm9kZXNbaV07CisJCWlmIChjaGlsZC5ub2RlVHlwZSAhPSBkb2pvLmh0bWwuRUxFTUVOVF9OT0RFKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgcG9zID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24oY2hpbGQsIHRydWUpOworCQl2YXIgaW5uZXIgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KGNoaWxkKTsKKwkJdGhpcy5jaGlsZEJveGVzLnB1c2goe3RvcDpwb3MueSwgYm90dG9tOnBvcy55ICsgaW5uZXIuaGVpZ2h0LCBsZWZ0OnBvcy54LCByaWdodDpwb3MueCArIGlubmVyLndpZHRoLCBoZWlnaHQ6aW5uZXIuaGVpZ2h0LCB3aWR0aDppbm5lci53aWR0aCwgbm9kZTpjaGlsZH0pOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIF9nZXROb2RlVW5kZXJNb3VzZTpmdW5jdGlvbiAoZSkgeworCWZvciAodmFyIGkgPSAwLCBjaGlsZDsgaSA8IHRoaXMuY2hpbGRCb3hlcy5sZW5ndGg7IGkrKykgeworCQl3aXRoICh0aGlzLmNoaWxkQm94ZXNbaV0pIHsKKwkJCWlmIChlLnBhZ2VYID49IGxlZnQgJiYgZS5wYWdlWCA8PSByaWdodCAmJiBlLnBhZ2VZID49IHRvcCAmJiBlLnBhZ2VZIDw9IGJvdHRvbSkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJfQorCXJldHVybiAtMTsKK30sIGNyZWF0ZURyb3BJbmRpY2F0b3I6ZnVuY3Rpb24gKCkgeworCXRoaXMuZHJvcEluZGljYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXdpdGggKHRoaXMuZHJvcEluZGljYXRvci5zdHlsZSkgeworCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCXpJbmRleCA9IDk5OTsKKwkJaWYgKHRoaXMudmVydGljYWwpIHsKKwkJCWJvcmRlckxlZnRXaWR0aCA9ICIxcHgiOworCQkJYm9yZGVyTGVmdENvbG9yID0gImJsYWNrIjsKKwkJCWJvcmRlckxlZnRTdHlsZSA9ICJzb2xpZCI7CisJCQloZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9tTm9kZSkuaGVpZ2h0ICsgInB4IjsKKwkJCXRvcCA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgdHJ1ZSkueSArICJweCI7CisJCX0gZWxzZSB7CisJCQlib3JkZXJUb3BXaWR0aCA9ICIxcHgiOworCQkJYm9yZGVyVG9wQ29sb3IgPSAiYmxhY2siOworCQkJYm9yZGVyVG9wU3R5bGUgPSAic29saWQiOworCQkJd2lkdGggPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9tTm9kZSkud2lkdGggKyAicHgiOworCQkJbGVmdCA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgdHJ1ZSkueCArICJweCI7CisJCX0KKwl9Cit9LCBvbkRyYWdNb3ZlOmZ1bmN0aW9uIChlLCBkcmFnT2JqZWN0cykgeworCXZhciBpID0gdGhpcy5fZ2V0Tm9kZVVuZGVyTW91c2UoZSk7CisJaWYgKCF0aGlzLmRyb3BJbmRpY2F0b3IpIHsKKwkJdGhpcy5jcmVhdGVEcm9wSW5kaWNhdG9yKCk7CisJfQorCXZhciBncmF2aXR5ID0gdGhpcy52ZXJ0aWNhbCA/IGRvam8uaHRtbC5ncmF2aXR5LldFU1QgOiBkb2pvLmh0bWwuZ3Jhdml0eS5OT1JUSDsKKwl2YXIgaGlkZSA9IGZhbHNlOworCWlmIChpIDwgMCkgeworCQlpZiAodGhpcy5jaGlsZEJveGVzLmxlbmd0aCkgeworCQkJdmFyIGJlZm9yZSA9IChkb2pvLmh0bWwuZ3Jhdml0eSh0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwgZSkgJiBncmF2aXR5KTsKKwkJCWlmIChiZWZvcmUpIHsKKwkJCQloaWRlID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhciBiZWZvcmUgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZEJveGVzW2ldOworCQl2YXIgYmVmb3JlID0gKGRvam8uaHRtbC5ncmF2aXR5KGNoaWxkLm5vZGUsIGUpICYgZ3Jhdml0eSk7CisJCWlmIChjaGlsZC5ub2RlID09PSBkcmFnT2JqZWN0c1swXS5kcmFnU291cmNlLmRvbU5vZGUpIHsKKwkJCWhpZGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdmFyIGN1cnJlbnRQb3NDaGlsZCA9IGJlZm9yZSA/IChpID4gMCA/IHRoaXMuY2hpbGRCb3hlc1tpIC0gMV0gOiBjaGlsZCkgOiAoaSA8IHRoaXMuY2hpbGRCb3hlcy5sZW5ndGggLSAxID8gdGhpcy5jaGlsZEJveGVzW2kgKyAxXSA6IGNoaWxkKTsKKwkJCWlmIChjdXJyZW50UG9zQ2hpbGQubm9kZSA9PT0gZHJhZ09iamVjdHNbMF0uZHJhZ1NvdXJjZS5kb21Ob2RlKSB7CisJCQkJaGlkZSA9IHRydWU7CisJCQl9CisJCX0KKwl9CisJaWYgKGhpZGUpIHsKKwkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9ICIiOworCX0KKwl0aGlzLnBsYWNlSW5kaWNhdG9yKGUsIGRyYWdPYmplY3RzLCBpLCBiZWZvcmUpOworCWlmICghZG9qby5odG1sLmhhc1BhcmVudCh0aGlzLmRyb3BJbmRpY2F0b3IpKSB7CisJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuZHJvcEluZGljYXRvcik7CisJfQorfSwgcGxhY2VJbmRpY2F0b3I6ZnVuY3Rpb24gKGUsIGRyYWdPYmplY3RzLCBib3hJbmRleCwgYmVmb3JlKSB7CisJdmFyIHRhcmdldFByb3BlcnR5ID0gdGhpcy52ZXJ0aWNhbCA/ICJsZWZ0IiA6ICJ0b3AiOworCXZhciBjaGlsZDsKKwlpZiAoYm94SW5kZXggPCAwKSB7CisJCWlmICh0aGlzLmNoaWxkQm94ZXMubGVuZ3RoKSB7CisJCQljaGlsZCA9IGJlZm9yZSA/IHRoaXMuY2hpbGRCb3hlc1swXSA6IHRoaXMuY2hpbGRCb3hlc1t0aGlzLmNoaWxkQm94ZXMubGVuZ3RoIC0gMV07CisJCX0gZWxzZSB7CisJCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGVbdGFyZ2V0UHJvcGVydHldID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLCB0cnVlKVt0aGlzLnZlcnRpY2FsID8gIngiIDogInkiXSArICJweCI7CisJCX0KKwl9IGVsc2UgeworCQljaGlsZCA9IHRoaXMuY2hpbGRCb3hlc1tib3hJbmRleF07CisJfQorCWlmIChjaGlsZCkgeworCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGVbdGFyZ2V0UHJvcGVydHldID0gKGJlZm9yZSA/IGNoaWxkW3RhcmdldFByb3BlcnR5XSA6IGNoaWxkW3RoaXMudmVydGljYWwgPyAicmlnaHQiIDogImJvdHRvbSJdKSArICJweCI7CisJCWlmICh0aGlzLnZlcnRpY2FsKSB7CisJCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUuaGVpZ2h0ID0gY2hpbGQuaGVpZ2h0ICsgInB4IjsKKwkJCXRoaXMuZHJvcEluZGljYXRvci5zdHlsZS50b3AgPSBjaGlsZC50b3AgKyAicHgiOworCQl9IGVsc2UgeworCQkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLndpZHRoID0gY2hpbGQud2lkdGggKyAicHgiOworCQkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBjaGlsZC5sZWZ0ICsgInB4IjsKKwkJfQorCX0KK30sIG9uRHJhZ091dDpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmRyb3BJbmRpY2F0b3IpIHsKKwkJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kcm9wSW5kaWNhdG9yKTsKKwkJZGVsZXRlIHRoaXMuZHJvcEluZGljYXRvcjsKKwl9Cit9LCBvbkRyb3A6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLm9uRHJhZ091dChlKTsKKwl2YXIgaSA9IHRoaXMuX2dldE5vZGVVbmRlck1vdXNlKGUpOworCXZhciBncmF2aXR5ID0gdGhpcy52ZXJ0aWNhbCA/IGRvam8uaHRtbC5ncmF2aXR5LldFU1QgOiBkb2pvLmh0bWwuZ3Jhdml0eS5OT1JUSDsKKwlpZiAoaSA8IDApIHsKKwkJaWYgKHRoaXMuY2hpbGRCb3hlcy5sZW5ndGgpIHsKKwkJCWlmIChkb2pvLmh0bWwuZ3Jhdml0eSh0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwgZSkgJiBncmF2aXR5KSB7CisJCQkJcmV0dXJuIHRoaXMuaW5zZXJ0KGUsIHRoaXMuY2hpbGRCb3hlc1swXS5ub2RlLCAiYmVmb3JlIik7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aGlzLmluc2VydChlLCB0aGlzLmNoaWxkQm94ZXNbdGhpcy5jaGlsZEJveGVzLmxlbmd0aCAtIDFdLm5vZGUsICJhZnRlciIpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmluc2VydChlLCB0aGlzLmRvbU5vZGUsICJhcHBlbmQiKTsKKwl9CisJdmFyIGNoaWxkID0gdGhpcy5jaGlsZEJveGVzW2ldOworCWlmIChkb2pvLmh0bWwuZ3Jhdml0eShjaGlsZC5ub2RlLCBlKSAmIGdyYXZpdHkpIHsKKwkJcmV0dXJuIHRoaXMuaW5zZXJ0KGUsIGNoaWxkLm5vZGUsICJiZWZvcmUiKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5pbnNlcnQoZSwgY2hpbGQubm9kZSwgImFmdGVyIik7CisJfQorfSwgaW5zZXJ0OmZ1bmN0aW9uIChlLCByZWZOb2RlLCBwb3NpdGlvbikgeworCXZhciBub2RlID0gZS5kcmFnT2JqZWN0LmRvbU5vZGU7CisJaWYgKHBvc2l0aW9uID09ICJiZWZvcmUiKSB7CisJCXJldHVybiBkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpOworCX0gZWxzZSB7CisJCWlmIChwb3NpdGlvbiA9PSAiYWZ0ZXIiKSB7CisJCQlyZXR1cm4gZG9qby5odG1sLmluc2VydEFmdGVyKG5vZGUsIHJlZk5vZGUpOworCQl9IGVsc2UgeworCQkJaWYgKHBvc2l0aW9uID09ICJhcHBlbmQiKSB7CisJCQkJcmVmTm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9fSwgZnVuY3Rpb24gKG5vZGUsIHR5cGVzKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuZG9tTm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlkb2pvLmRuZC5Ecm9wVGFyZ2V0LmNhbGwodGhpcyk7CisJaWYgKHR5cGVzICYmIGRvam8ubGFuZy5pc1N0cmluZyh0eXBlcykpIHsKKwkJdHlwZXMgPSBbdHlwZXNdOworCX0KKwl0aGlzLmFjY2VwdGVkVHlwZXMgPSB0eXBlcyB8fCBbXTsKKwlkb2pvLmRuZC5kcmFnTWFuYWdlci5yZWdpc3RlckRyb3BUYXJnZXQodGhpcyk7Cit9KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9IdG1sRHJhZ0NvcHkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnQ29weS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRlZDZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9IdG1sRHJhZ0NvcHkuanMKQEAgLTAsMCArMSw3MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuSHRtbERyYWdDb3B5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZG5kLioiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuSHRtbERyYWdDb3B5U291cmNlIiwgZG9qby5kbmQuSHRtbERyYWdTb3VyY2UsIGZ1bmN0aW9uIChub2RlLCB0eXBlLCBjb3B5T25jZSkgeworCXRoaXMuY29weU9uY2UgPSBjb3B5T25jZTsKKwl0aGlzLm1ha2VDb3B5ID0gdHJ1ZTsKK30sIHtvbkRyYWdTdGFydDpmdW5jdGlvbiAoKSB7CisJdmFyIGRyYWdPYmogPSBuZXcgZG9qby5kbmQuSHRtbERyYWdDb3B5T2JqZWN0KHRoaXMuZHJhZ09iamVjdCwgdGhpcy50eXBlLCB0aGlzKTsKKwlpZiAodGhpcy5kcmFnQ2xhc3MpIHsKKwkJZHJhZ09iai5kcmFnQ2xhc3MgPSB0aGlzLmRyYWdDbGFzczsKKwl9CisJaWYgKHRoaXMuY29uc3RyYWluVG9Db250YWluZXIpIHsKKwkJZHJhZ09iai5jb25zdHJhaW5Ubyh0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciB8fCB0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSk7CisJfQorCXJldHVybiBkcmFnT2JqOworfSwgb25TZWxlY3RlZDpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdPYmplY3RzLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnNlbGVjdGVkU291cmNlcy5wdXNoKG5ldyBkb2pvLmRuZC5IdG1sRHJhZ0NvcHlTb3VyY2UodGhpcy5kcmFnT2JqZWN0c1tpXSkpOworCX0KK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuSHRtbERyYWdDb3B5T2JqZWN0IiwgZG9qby5kbmQuSHRtbERyYWdPYmplY3QsIGZ1bmN0aW9uIChkcmFnT2JqZWN0LCB0eXBlLCBzb3VyY2UpIHsKKwl0aGlzLmNvcHlTb3VyY2UgPSBzb3VyY2U7Cit9LCB7b25EcmFnU3RhcnQ6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmRuZC5IdG1sRHJhZ0NvcHlPYmplY3Quc3VwZXJjbGFzcy5vbkRyYWdTdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICh0aGlzLmNvcHlTb3VyY2UubWFrZUNvcHkpIHsKKwkJdGhpcy5zb3VyY2VOb2RlID0gdGhpcy5kb21Ob2RlOworCQl0aGlzLmRvbU5vZGUgPSB0aGlzLmRvbU5vZGUuY2xvbmVOb2RlKHRydWUpOworCX0KK30sIG9uRHJhZ0VuZDpmdW5jdGlvbiAoZSkgeworCXN3aXRjaCAoZS5kcmFnU3RhdHVzKSB7CisJICBjYXNlICJkcm9wRmFpbHVyZSI6CisJCXZhciBzdGFydENvb3JkcyA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZHJhZ0Nsb25lLCB0cnVlKTsKKwkJdmFyIGVuZENvb3JkcyA9IHtsZWZ0OnRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueCArIDEsIHRvcDp0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnkgKyAxfTsKKwkJdmFyIGFuaW0gPSBkb2pvLmxmeC5zbGlkZVRvKHRoaXMuZHJhZ0Nsb25lLCBlbmRDb29yZHMsIDUwMCwgZG9qby5sZnguZWFzZU91dCk7CisJCXZhciBkcmFnT2JqZWN0ID0gdGhpczsKKwkJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uIChlKSB7CisJCQlkb2pvLmxhbmcuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisJCQkJZG9qby5odG1sLnJlbW92ZU5vZGUoZHJhZ09iamVjdC5kcmFnQ2xvbmUpOworCQkJCWRyYWdPYmplY3QuZHJhZ0Nsb25lID0gbnVsbDsKKwkJCQlpZiAoZHJhZ09iamVjdC5jb3B5U291cmNlLm1ha2VDb3B5KSB7CisJCQkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGRyYWdPYmplY3QuZG9tTm9kZSk7CisJCQkJCWRyYWdPYmplY3QuZG9tTm9kZSA9IGRyYWdPYmplY3Quc291cmNlTm9kZTsKKwkJCQkJZHJhZ09iamVjdC5zb3VyY2VOb2RlID0gbnVsbDsKKwkJCQl9CisJCQl9LCAyMDApOworCQl9KTsKKwkJYW5pbS5wbGF5KCk7CisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCgiZHJhZ0VuZCIsIHtzb3VyY2U6dGhpc30pOworCQlyZXR1cm47CisJfQorCWRvam8uZG5kLkh0bWxEcmFnQ29weU9iamVjdC5zdXBlcmNsYXNzLm9uRHJhZ0VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCXRoaXMuY29weVNvdXJjZS5kcmFnT2JqZWN0ID0gdGhpcy5kb21Ob2RlOworCWlmICh0aGlzLmNvcHlTb3VyY2UuY29weU9uY2UpIHsKKwkJdGhpcy5jb3B5U291cmNlLm1ha2VDb3B5ID0gZmFsc2U7CisJfQorCW5ldyBkb2pvLmRuZC5IdG1sRHJhZ0NvcHlTb3VyY2UodGhpcy5zb3VyY2VOb2RlLCB0aGlzLnR5cGUsIHRoaXMuY29weVNvdXJjZS5jb3B5T25jZSk7CisJdGhpcy5zb3VyY2VOb2RlID0gbnVsbDsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9IdG1sRHJhZ01hbmFnZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnTWFuYWdlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI0MWNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9IdG1sRHJhZ01hbmFnZXIuanMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZG5kLkh0bWxEcmFnTWFuYWdlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRuZC5EcmFnQW5kRHJvcCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01hbmFnZXIiLCBkb2pvLmRuZC5EcmFnTWFuYWdlciwge2Rpc2FibGVkOmZhbHNlLCBuZXN0ZWRUYXJnZXRzOmZhbHNlLCBtb3VzZURvd25UaW1lcjpudWxsLCBkc0NvdW50ZXI6MCwgZHNQcmVmaXg6ImRvam9EcmFnU291cmNlIiwgZHJvcFRhcmdldERpbWVuc2lvbnM6W10sIGN1cnJlbnREcm9wVGFyZ2V0Om51bGwsIHByZXZpb3VzRHJvcFRhcmdldDpudWxsLCBfZHJhZ1RyaWdnZXJlZDpmYWxzZSwgc2VsZWN0ZWRTb3VyY2VzOltdLCBkcmFnT2JqZWN0czpbXSwgZHJhZ1NvdXJjZXM6W10sIGRyb3BUYXJnZXRzOltdLCBjdXJyZW50WDpudWxsLCBjdXJyZW50WTpudWxsLCBsYXN0WDpudWxsLCBsYXN0WTpudWxsLCBtb3VzZURvd25YOm51bGwsIG1vdXNlRG93blk6bnVsbCwgdGhyZXNob2xkOjcsIGRyb3BBY2NlcHRhYmxlOmZhbHNlLCBjYW5jZWxFdmVudDpmdW5jdGlvbiAoZSkgeworCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJZS5wcmV2ZW50RGVmYXVsdCgpOworfSwgcmVnaXN0ZXJEcmFnU291cmNlOmZ1bmN0aW9uIChkcykgeworCWlmIChkc1siZG9tTm9kZSJdKSB7CisJCXZhciBkcCA9IHRoaXMuZHNQcmVmaXg7CisJCXZhciBkcElkeCA9IGRwICsgIklkeF8iICsgKHRoaXMuZHNDb3VudGVyKyspOworCQlkcy5kcmFnU291cmNlSWQgPSBkcElkeDsKKwkJdGhpcy5kcmFnU291cmNlc1tkcElkeF0gPSBkczsKKwkJZHMuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoZHAsIGRwSWR4KTsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcihkcy5kb21Ob2RlLCAib25kcmFnc3RhcnQiLCB0aGlzLmNhbmNlbEV2ZW50KTsKKwkJfQorCX0KK30sIHVucmVnaXN0ZXJEcmFnU291cmNlOmZ1bmN0aW9uIChkcykgeworCWlmIChkc1siZG9tTm9kZSJdKSB7CisJCXZhciBkcCA9IHRoaXMuZHNQcmVmaXg7CisJCXZhciBkcElkeCA9IGRzLmRyYWdTb3VyY2VJZDsKKwkJZGVsZXRlIGRzLmRyYWdTb3VyY2VJZDsKKwkJZGVsZXRlIHRoaXMuZHJhZ1NvdXJjZXNbZHBJZHhdOworCQlkcy5kb21Ob2RlLnNldEF0dHJpYnV0ZShkcCwgbnVsbCk7CisJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIucmVtb3ZlTGlzdGVuZXIoZHMuZG9tTm9kZSwgIm9uZHJhZ3N0YXJ0IiwgdGhpcy5jYW5jZWxFdmVudCk7CisJCX0KKwl9Cit9LCByZWdpc3RlckRyb3BUYXJnZXQ6ZnVuY3Rpb24gKGR0KSB7CisJdGhpcy5kcm9wVGFyZ2V0cy5wdXNoKGR0KTsKK30sIHVucmVnaXN0ZXJEcm9wVGFyZ2V0OmZ1bmN0aW9uIChkdCkgeworCXZhciBpbmRleCA9IGRvam8ubGFuZy5maW5kKHRoaXMuZHJvcFRhcmdldHMsIGR0LCB0cnVlKTsKKwlpZiAoaW5kZXggPj0gMCkgeworCQl0aGlzLmRyb3BUYXJnZXRzLnNwbGljZShpbmRleCwgMSk7CisJfQorfSwgZ2V0RHJhZ1NvdXJjZTpmdW5jdGlvbiAoZSkgeworCXZhciB0biA9IGUudGFyZ2V0OworCWlmICh0biA9PT0gZG9qby5ib2R5KCkpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgdGEgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKHRuLCB0aGlzLmRzUHJlZml4KTsKKwl3aGlsZSAoKCF0YSkgJiYgKHRuKSkgeworCQl0biA9IHRuLnBhcmVudE5vZGU7CisJCWlmICgoIXRuKSB8fCAodG4gPT09IGRvam8uYm9keSgpKSkgeworCQkJcmV0dXJuOworCQl9CisJCXRhID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZSh0biwgdGhpcy5kc1ByZWZpeCk7CisJfQorCXJldHVybiB0aGlzLmRyYWdTb3VyY2VzW3RhXTsKK30sIG9uS2V5RG93bjpmdW5jdGlvbiAoZSkgeworfSwgb25Nb3VzZURvd246ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWlmIChlLmJ1dHRvbiAhPSAxKSB7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZS53aGljaCAhPSAxKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdmFyIHRhcmdldCA9IGUudGFyZ2V0Lm5vZGVUeXBlID09IGRvam8uaHRtbC5URVhUX05PREUgPyBlLnRhcmdldC5wYXJlbnROb2RlIDogZS50YXJnZXQ7CisJaWYgKGRvam8uaHRtbC5pc1RhZyh0YXJnZXQsICJidXR0b24iLCAidGV4dGFyZWEiLCAiaW5wdXQiLCAic2VsZWN0IiwgIm9wdGlvbiIpKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGRzID0gdGhpcy5nZXREcmFnU291cmNlKGUpOworCWlmICghZHMpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMuc2VsZWN0ZWRTb3VyY2VzLCBkcykpIHsKKwkJdGhpcy5zZWxlY3RlZFNvdXJjZXMucHVzaChkcyk7CisJCWRzLm9uU2VsZWN0ZWQoKTsKKwl9CisJdGhpcy5tb3VzZURvd25YID0gZS5wYWdlWDsKKwl0aGlzLm1vdXNlRG93blkgPSBlLnBhZ2VZOworCWUucHJldmVudERlZmF1bHQoKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQsICJvbm1vdXNlbW92ZSIsIHRoaXMsICJvbk1vdXNlTW92ZSIpOworfSwgb25Nb3VzZVVwOmZ1bmN0aW9uIChlLCBjYW5jZWwpIHsKKwlpZiAodGhpcy5zZWxlY3RlZFNvdXJjZXMubGVuZ3RoID09IDApIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLm1vdXNlRG93blggPSBudWxsOworCXRoaXMubW91c2VEb3duWSA9IG51bGw7CisJdGhpcy5fZHJhZ1RyaWdnZXJlZCA9IGZhbHNlOworCWUuZHJhZ1NvdXJjZSA9IHRoaXMuZHJhZ1NvdXJjZTsKKwlpZiAoKCFlLnNoaWZ0S2V5KSAmJiAoIWUuY3RybEtleSkpIHsKKwkJaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHsKKwkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25Ecm9wU3RhcnQoKTsKKwkJfQorCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmRyYWdPYmplY3RzLCBmdW5jdGlvbiAodGVtcERyYWdPYmopIHsKKwkJCXZhciByZXQgPSBudWxsOworCQkJaWYgKCF0ZW1wRHJhZ09iaikgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7CisJCQkJZS5kcmFnT2JqZWN0ID0gdGVtcERyYWdPYmo7CisJCQkJdmFyIGNlID0gdGhpcy5jdXJyZW50RHJvcFRhcmdldC5kb21Ob2RlLmNoaWxkTm9kZXM7CisJCQkJaWYgKGNlLmxlbmd0aCA+IDApIHsKKwkJCQkJZS5kcm9wVGFyZ2V0ID0gY2VbMF07CisJCQkJCXdoaWxlIChlLmRyb3BUYXJnZXQgPT0gdGVtcERyYWdPYmouZG9tTm9kZSkgeworCQkJCQkJZS5kcm9wVGFyZ2V0ID0gZS5kcm9wVGFyZ2V0Lm5leHRTaWJsaW5nOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZS5kcm9wVGFyZ2V0ID0gdGhpcy5jdXJyZW50RHJvcFRhcmdldC5kb21Ob2RlOworCQkJCX0KKwkJCQlpZiAodGhpcy5kcm9wQWNjZXB0YWJsZSkgeworCQkJCQlyZXQgPSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJvcChlKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ091dChlKTsKKwkJCQl9CisJCQl9CisJCQllLmRyYWdTdGF0dXMgPSB0aGlzLmRyb3BBY2NlcHRhYmxlICYmIHJldCA/ICJkcm9wU3VjY2VzcyIgOiAiZHJvcEZhaWx1cmUiOworCQkJZG9qby5sYW5nLmRlbGF5VGhlc2UoW2Z1bmN0aW9uICgpIHsKKwkJCQl0cnkgeworCQkJCQl0ZW1wRHJhZ09iai5kcmFnU291cmNlLm9uRHJhZ0VuZChlKTsKKwkJCQl9CisJCQkJY2F0Y2ggKGVycikgeworCQkJCQl2YXIgZWNvcHkgPSB7fTsKKwkJCQkJZm9yICh2YXIgaSBpbiBlKSB7CisJCQkJCQlpZiAoaSA9PSAidHlwZSIpIHsKKwkJCQkJCQllY29weS50eXBlID0gIm1vdXNldXAiOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJZWNvcHlbaV0gPSBlW2ldOworCQkJCQl9CisJCQkJCXRlbXBEcmFnT2JqLmRyYWdTb3VyY2Uub25EcmFnRW5kKGVjb3B5KTsKKwkJCQl9CisJCQl9LCBmdW5jdGlvbiAoKSB7CisJCQkJdGVtcERyYWdPYmoub25EcmFnRW5kKGUpOworCQkJfV0pOworCQl9LCB0aGlzKTsKKwkJdGhpcy5zZWxlY3RlZFNvdXJjZXMgPSBbXTsKKwkJdGhpcy5kcmFnT2JqZWN0cyA9IFtdOworCQl0aGlzLmRyYWdTb3VyY2UgPSBudWxsOworCQlpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgeworCQkJdGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyb3BFbmQoKTsKKwkJfQorCX0gZWxzZSB7CisJfQorCWRvam8uZXZlbnQuZGlzY29ubmVjdChkb2N1bWVudCwgIm9ubW91c2Vtb3ZlIiwgdGhpcywgIm9uTW91c2VNb3ZlIik7CisJdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7Cit9LCBvblNjcm9sbDpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdPYmplY3RzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLmRyYWdPYmplY3RzW2ldLnVwZGF0ZURyYWdPZmZzZXQpIHsKKwkJCXRoaXMuZHJhZ09iamVjdHNbaV0udXBkYXRlRHJhZ09mZnNldCgpOworCQl9CisJfQorCWlmICh0aGlzLmRyYWdPYmplY3RzLmxlbmd0aCkgeworCQl0aGlzLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7CisJfQorfSwgX2RyYWdTdGFydERpc3RhbmNlOmZ1bmN0aW9uICh4LCB5KSB7CisJaWYgKCghdGhpcy5tb3VzZURvd25YKSB8fCAoIXRoaXMubW91c2VEb3duWCkpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgZHggPSBNYXRoLmFicyh4IC0gdGhpcy5tb3VzZURvd25YKTsKKwl2YXIgZHgyID0gZHggKiBkeDsKKwl2YXIgZHkgPSBNYXRoLmFicyh5IC0gdGhpcy5tb3VzZURvd25ZKTsKKwl2YXIgZHkyID0gZHkgKiBkeTsKKwlyZXR1cm4gcGFyc2VJbnQoTWF0aC5zcXJ0KGR4MiArIGR5MiksIDEwKTsKK30sIGNhY2hlVGFyZ2V0TG9jYXRpb25zOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnByb2ZpbGUuc3RhcnQoImNhY2hlVGFyZ2V0TG9jYXRpb25zIik7CisJdGhpcy5kcm9wVGFyZ2V0RGltZW5zaW9ucyA9IFtdOworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZHJvcFRhcmdldHMsIGZ1bmN0aW9uICh0ZW1wVGFyZ2V0KSB7CisJCXZhciB0biA9IHRlbXBUYXJnZXQuZG9tTm9kZTsKKwkJaWYgKCF0biB8fCAhdGVtcFRhcmdldC5hY2NlcHRzKFt0aGlzLmRyYWdTb3VyY2VdKSkgeworCQkJcmV0dXJuOworCQl9CisJCXZhciBhYnMgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0biwgdHJ1ZSk7CisJCXZhciBiYiA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3godG4pOworCQl0aGlzLmRyb3BUYXJnZXREaW1lbnNpb25zLnB1c2goW1thYnMueCwgYWJzLnldLCBbYWJzLnggKyBiYi53aWR0aCwgYWJzLnkgKyBiYi5oZWlnaHRdLCB0ZW1wVGFyZ2V0XSk7CisJfSwgdGhpcyk7CisJZG9qby5wcm9maWxlLmVuZCgiY2FjaGVUYXJnZXRMb2NhdGlvbnMiKTsKK30sIG9uTW91c2VNb3ZlOmZ1bmN0aW9uIChlKSB7CisJaWYgKChkb2pvLnJlbmRlci5odG1sLmllKSAmJiAoZS5idXR0b24gIT0gMSkpIHsKKwkJdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7CisJCXRoaXMub25Nb3VzZVVwKGUsIHRydWUpOworCQlyZXR1cm47CisJfQorCWlmICgodGhpcy5zZWxlY3RlZFNvdXJjZXMubGVuZ3RoKSAmJiAoIXRoaXMuZHJhZ09iamVjdHMubGVuZ3RoKSkgeworCQl2YXIgZHg7CisJCXZhciBkeTsKKwkJaWYgKCF0aGlzLl9kcmFnVHJpZ2dlcmVkKSB7CisJCQl0aGlzLl9kcmFnVHJpZ2dlcmVkID0gKHRoaXMuX2RyYWdTdGFydERpc3RhbmNlKGUucGFnZVgsIGUucGFnZVkpID4gdGhpcy50aHJlc2hvbGQpOworCQkJaWYgKCF0aGlzLl9kcmFnVHJpZ2dlcmVkKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZHggPSBlLnBhZ2VYIC0gdGhpcy5tb3VzZURvd25YOworCQkJZHkgPSBlLnBhZ2VZIC0gdGhpcy5tb3VzZURvd25ZOworCQl9CisJCXRoaXMuZHJhZ1NvdXJjZSA9IHRoaXMuc2VsZWN0ZWRTb3VyY2VzWzBdOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnNlbGVjdGVkU291cmNlcywgZnVuY3Rpb24gKHRlbXBTb3VyY2UpIHsKKwkJCWlmICghdGVtcFNvdXJjZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXZhciB0ZG8gPSB0ZW1wU291cmNlLm9uRHJhZ1N0YXJ0KGUpOworCQkJaWYgKHRkbykgeworCQkJCXRkby5vbkRyYWdTdGFydChlKTsKKwkJCQl0ZG8uZHJhZ09mZnNldC55ICs9IGR5OworCQkJCXRkby5kcmFnT2Zmc2V0LnggKz0gZHg7CisJCQkJdGRvLmRyYWdTb3VyY2UgPSB0ZW1wU291cmNlOworCQkJCXRoaXMuZHJhZ09iamVjdHMucHVzaCh0ZG8pOworCQkJfQorCQl9LCB0aGlzKTsKKwkJdGhpcy5wcmV2aW91c0Ryb3BUYXJnZXQgPSBudWxsOworCQl0aGlzLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7CisJfQorCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZHJhZ09iamVjdHMsIGZ1bmN0aW9uIChkcmFnT2JqKSB7CisJCWlmIChkcmFnT2JqKSB7CisJCQlkcmFnT2JqLm9uRHJhZ01vdmUoZSk7CisJCX0KKwl9KTsKKwlpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgeworCQl2YXIgYyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3QodGhpcy5jdXJyZW50RHJvcFRhcmdldC5kb21Ob2RlLCB0cnVlKTsKKwkJdmFyIGR0cCA9IFtbYy54LCBjLnldLCBbYy54ICsgYy53aWR0aCwgYy55ICsgYy5oZWlnaHRdXTsKKwl9CisJaWYgKCghdGhpcy5uZXN0ZWRUYXJnZXRzKSAmJiAoZHRwKSAmJiAodGhpcy5pc0luc2lkZUJveChlLCBkdHApKSkgeworCQlpZiAodGhpcy5kcm9wQWNjZXB0YWJsZSkgeworCQkJdGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdNb3ZlKGUsIHRoaXMuZHJhZ09iamVjdHMpOworCQl9CisJfSBlbHNlIHsKKwkJdmFyIGJlc3RCb3ggPSB0aGlzLmZpbmRCZXN0VGFyZ2V0KGUpOworCQlpZiAoYmVzdEJveC50YXJnZXQgPT09IG51bGwpIHsKKwkJCWlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7CisJCQkJdGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdPdXQoZSk7CisJCQkJdGhpcy5wcmV2aW91c0Ryb3BUYXJnZXQgPSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0OworCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsOworCQkJfQorCQkJdGhpcy5kcm9wQWNjZXB0YWJsZSA9IGZhbHNlOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ICE9PSBiZXN0Qm94LnRhcmdldCkgeworCQkJaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHsKKwkJCQl0aGlzLnByZXZpb3VzRHJvcFRhcmdldCA9IHRoaXMuY3VycmVudERyb3BUYXJnZXQ7CisJCQkJdGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdPdXQoZSk7CisJCQl9CisJCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gYmVzdEJveC50YXJnZXQ7CisJCQllLmRyYWdPYmplY3RzID0gdGhpcy5kcmFnT2JqZWN0czsKKwkJCXRoaXMuZHJvcEFjY2VwdGFibGUgPSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ092ZXIoZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5kcm9wQWNjZXB0YWJsZSkgeworCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnTW92ZShlLCB0aGlzLmRyYWdPYmplY3RzKTsKKwkJCX0KKwkJfQorCX0KK30sIGZpbmRCZXN0VGFyZ2V0OmZ1bmN0aW9uIChlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgYmVzdEJveCA9IG5ldyBPYmplY3QoKTsKKwliZXN0Qm94LnRhcmdldCA9IG51bGw7CisJYmVzdEJveC5wb2ludHMgPSBudWxsOworCWRvam8ubGFuZy5ldmVyeSh0aGlzLmRyb3BUYXJnZXREaW1lbnNpb25zLCBmdW5jdGlvbiAodG1wREEpIHsKKwkJaWYgKCFfdGhpcy5pc0luc2lkZUJveChlLCB0bXBEQSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWJlc3RCb3gudGFyZ2V0ID0gdG1wREFbMl07CisJCWJlc3RCb3gucG9pbnRzID0gdG1wREE7CisJCXJldHVybiBCb29sZWFuKF90aGlzLm5lc3RlZFRhcmdldHMpOworCX0pOworCXJldHVybiBiZXN0Qm94OworfSwgaXNJbnNpZGVCb3g6ZnVuY3Rpb24gKGUsIGNvb3JkcykgeworCWlmICgoZS5wYWdlWCA+IGNvb3Jkc1swXVswXSkgJiYgKGUucGFnZVggPCBjb29yZHNbMV1bMF0pICYmIChlLnBhZ2VZID4gY29vcmRzWzBdWzFdKSAmJiAoZS5wYWdlWSA8IGNvb3Jkc1sxXVsxXSkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30sIG9uTW91c2VPdmVyOmZ1bmN0aW9uIChlKSB7Cit9LCBvbk1vdXNlT3V0OmZ1bmN0aW9uIChlKSB7Cit9fSk7Citkb2pvLmRuZC5kcmFnTWFuYWdlciA9IG5ldyBkb2pvLmRuZC5IdG1sRHJhZ01hbmFnZXIoKTsKKyhmdW5jdGlvbiAoKSB7CisJdmFyIGQgPSBkb2N1bWVudDsKKwl2YXIgZG0gPSBkb2pvLmRuZC5kcmFnTWFuYWdlcjsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ua2V5ZG93biIsIGRtLCAib25LZXlEb3duIik7CisJZG9qby5ldmVudC5jb25uZWN0KGQsICJvbm1vdXNlb3ZlciIsIGRtLCAib25Nb3VzZU92ZXIiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ubW91c2VvdXQiLCBkbSwgIm9uTW91c2VPdXQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ubW91c2Vkb3duIiwgZG0sICJvbk1vdXNlRG93biIpOworCWRvam8uZXZlbnQuY29ubmVjdChkLCAib25tb3VzZXVwIiwgZG0sICJvbk1vdXNlVXAiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib25zY3JvbGwiLCBkbSwgIm9uU2Nyb2xsIik7Cit9KSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnTW92ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvSHRtbERyYWdNb3ZlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzdhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL0h0bWxEcmFnTW92ZS5qcwpAQCAtMCwwICsxLDU0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kbmQuKiIpOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmVTb3VyY2UiLCBkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSwge29uRHJhZ1N0YXJ0OmZ1bmN0aW9uICgpIHsKKwl2YXIgZHJhZ09iaiA9IG5ldyBkb2pvLmRuZC5IdG1sRHJhZ01vdmVPYmplY3QodGhpcy5kcmFnT2JqZWN0LCB0aGlzLnR5cGUpOworCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCWRyYWdPYmouY29uc3RyYWluVG8odGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIpOworCX0KKwlyZXR1cm4gZHJhZ09iajsKK30sIG9uU2VsZWN0ZWQ6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5zZWxlY3RlZFNvdXJjZXMucHVzaChuZXcgZG9qby5kbmQuSHRtbERyYWdNb3ZlU291cmNlKHRoaXMuZHJhZ09iamVjdHNbaV0pKTsKKwl9Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcmFnTW92ZU9iamVjdCIsIGRvam8uZG5kLkh0bWxEcmFnT2JqZWN0LCB7b25EcmFnU3RhcnQ6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmh0bWwuY2xlYXJTZWxlY3Rpb24oKTsKKwl0aGlzLmRyYWdDbG9uZSA9IHRoaXMuZG9tTm9kZTsKKwlpZiAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCAicG9zaXRpb24iKSAhPSAiYWJzb2x1dGUiKSB7CisJCXRoaXMuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJfQorCXZhciBsZWZ0ID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCAibGVmdCIpKTsKKwl2YXIgdG9wID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCAidG9wIikpOworCXRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSB7eDppc05hTihsZWZ0KSA/IDAgOiBsZWZ0LCB5OmlzTmFOKHRvcCkgPyAwIDogdG9wfTsKKwl0aGlzLnNjcm9sbE9mZnNldCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisJdGhpcy5kcmFnT2Zmc2V0ID0ge3k6dGhpcy5kcmFnU3RhcnRQb3NpdGlvbi55IC0gZS5wYWdlWSwgeDp0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnggLSBlLnBhZ2VYfTsKKwl0aGlzLmNvbnRhaW5pbmdCbG9ja1Bvc2l0aW9uID0ge3g6MCwgeTowfTsKKwlpZiAodGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcikgeworCQl0aGlzLmNvbnN0cmFpbnRzID0gdGhpcy5nZXRDb25zdHJhaW50cygpOworCX0KKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5kb21Ob2RlLCAib25jbGljayIsIHRoaXMsICJfc3F1ZWxjaE9uQ2xpY2siKTsKK30sIG9uRHJhZ0VuZDpmdW5jdGlvbiAoZSkgeworfSwgc2V0QWJzb2x1dGVQb3NpdGlvbjpmdW5jdGlvbiAoeCwgeSkgeworCWlmICghdGhpcy5kaXNhYmxlWSkgeworCQl0aGlzLmRvbU5vZGUuc3R5bGUudG9wID0geSArICJweCI7CisJfQorCWlmICghdGhpcy5kaXNhYmxlWCkgeworCQl0aGlzLmRvbU5vZGUuc3R5bGUubGVmdCA9IHggKyAicHgiOworCX0KK30sIF9zcXVlbGNoT25DbGljazpmdW5jdGlvbiAoZSkgeworCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMuZG9tTm9kZSwgIm9uY2xpY2siLCB0aGlzLCAiX3NxdWVsY2hPbkNsaWNrIik7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvU29ydGFibGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL1NvcnRhYmxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjEyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL1NvcnRhYmxlLmpzCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZG5kLlNvcnRhYmxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZG5kLioiKTsKK2Rvam8uZG5kLlNvcnRhYmxlID0gZnVuY3Rpb24gKCkgeworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5kbmQuU29ydGFibGUsIHtvbmRyYWdzdGFydDpmdW5jdGlvbiAoZSkgeworCXZhciBkcmFnT2JqZWN0ID0gZS50YXJnZXQ7CisJd2hpbGUgKGRyYWdPYmplY3QucGFyZW50Tm9kZSAmJiBkcmFnT2JqZWN0LnBhcmVudE5vZGUgIT0gdGhpcykgeworCQlkcmFnT2JqZWN0ID0gZHJhZ09iamVjdC5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gZHJhZ09iamVjdDsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9UcmVlRHJhZ0FuZERyb3AuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL1RyZWVEcmFnQW5kRHJvcC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmNlNWQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9UcmVlRHJhZ0FuZERyb3AuanMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZG5kLlRyZWVEcmFnQW5kRHJvcCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRuZC5IdG1sRHJhZ0FuZERyb3AiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5leHRyYXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5kbmQuVHJlZURyYWdTb3VyY2UgPSBmdW5jdGlvbiAobm9kZSwgc3luY0NvbnRyb2xsZXIsIHR5cGUsIHRyZWVOb2RlKSB7CisJdGhpcy5jb250cm9sbGVyID0gc3luY0NvbnRyb2xsZXI7CisJdGhpcy50cmVlTm9kZSA9IHRyZWVOb2RlOworCWRvam8uZG5kLkh0bWxEcmFnU291cmNlLmNhbGwodGhpcywgbm9kZSwgdHlwZSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZSwgZG9qby5kbmQuSHRtbERyYWdTb3VyY2UpOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZSwge29uRHJhZ1N0YXJ0OmZ1bmN0aW9uICgpIHsKKwl2YXIgZHJhZ09iamVjdCA9IGRvam8uZG5kLkh0bWxEcmFnU291cmNlLnByb3RvdHlwZS5vbkRyYWdTdGFydC5jYWxsKHRoaXMpOworCWRyYWdPYmplY3QudHJlZU5vZGUgPSB0aGlzLnRyZWVOb2RlOworCWRyYWdPYmplY3Qub25EcmFnU3RhcnQgPSBkb2pvLmxhbmcuaGl0Y2goZHJhZ09iamVjdCwgZnVuY3Rpb24gKGUpIHsKKwkJdGhpcy5zYXZlZFNlbGVjdGVkTm9kZSA9IHRoaXMudHJlZU5vZGUudHJlZS5zZWxlY3Rvci5zZWxlY3RlZE5vZGU7CisJCWlmICh0aGlzLnNhdmVkU2VsZWN0ZWROb2RlKSB7CisJCQl0aGlzLnNhdmVkU2VsZWN0ZWROb2RlLnVuTWFya1NlbGVjdGVkKCk7CisJCX0KKwkJdmFyIHJlc3VsdCA9IGRvam8uZG5kLkh0bWxEcmFnT2JqZWN0LnByb3RvdHlwZS5vbkRyYWdTdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl2YXIgY2xvbmVHcmlkID0gdGhpcy5kcmFnQ2xvbmUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lR3JpZC5sZW5ndGg7IGkrKykgeworCQkJY2xvbmVHcmlkLml0ZW0oaSkuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgpIjsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0pOworCWRyYWdPYmplY3Qub25EcmFnRW5kID0gZnVuY3Rpb24gKGUpIHsKKwkJaWYgKHRoaXMuc2F2ZWRTZWxlY3RlZE5vZGUpIHsKKwkJCXRoaXMuc2F2ZWRTZWxlY3RlZE5vZGUubWFya1NlbGVjdGVkKCk7CisJCX0KKwkJcmV0dXJuIGRvam8uZG5kLkh0bWxEcmFnT2JqZWN0LnByb3RvdHlwZS5vbkRyYWdFbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9OworCXJldHVybiBkcmFnT2JqZWN0OworfSwgb25EcmFnRW5kOmZ1bmN0aW9uIChlKSB7CisJdmFyIHJlcyA9IGRvam8uZG5kLkh0bWxEcmFnU291cmNlLnByb3RvdHlwZS5vbkRyYWdFbmQuY2FsbCh0aGlzLCBlKTsKKwlyZXR1cm4gcmVzOworfX0pOworZG9qby5kbmQuVHJlZURyb3BUYXJnZXQgPSBmdW5jdGlvbiAoZG9tTm9kZSwgY29udHJvbGxlciwgdHlwZSwgdHJlZU5vZGUpIHsKKwl0aGlzLnRyZWVOb2RlID0gdHJlZU5vZGU7CisJdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKwlkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5hcHBseSh0aGlzLCBbZG9tTm9kZSwgdHlwZV0pOworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5kbmQuVHJlZURyb3BUYXJnZXQsIGRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0KTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5kbmQuVHJlZURyb3BUYXJnZXQsIHthdXRvRXhwYW5kRGVsYXk6MTUwMCwgYXV0b0V4cGFuZFRpbWVyOm51bGwsIHBvc2l0aW9uOm51bGwsIGluZGljYXRvclN0eWxlOiIycHggYmxhY2sgc29saWQiLCBzaG93SW5kaWNhdG9yOmZ1bmN0aW9uIChwb3NpdGlvbikgeworCWlmICh0aGlzLnBvc2l0aW9uID09IHBvc2l0aW9uKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5oaWRlSW5kaWNhdG9yKCk7CisJdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworCWlmIChwb3NpdGlvbiA9PSAiYmVmb3JlIikgeworCQl0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJUb3AgPSB0aGlzLmluZGljYXRvclN0eWxlOworCX0gZWxzZSB7CisJCWlmIChwb3NpdGlvbiA9PSAiYWZ0ZXIiKSB7CisJCQl0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLmluZGljYXRvclN0eWxlOworCQl9IGVsc2UgeworCQkJaWYgKHBvc2l0aW9uID09ICJvbnRvIikgeworCQkJCXRoaXMudHJlZU5vZGUubWFya1NlbGVjdGVkKCk7CisJCQl9CisJCX0KKwl9Cit9LCBoaWRlSW5kaWNhdG9yOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJCb3R0b20gPSAiIjsKKwl0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJUb3AgPSAiIjsKKwl0aGlzLnRyZWVOb2RlLnVuTWFya1NlbGVjdGVkKCk7CisJdGhpcy5wb3NpdGlvbiA9IG51bGw7Cit9LCBvbkRyYWdPdmVyOmZ1bmN0aW9uIChlKSB7CisJdmFyIGFjY2VwdHMgPSBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUub25EcmFnT3Zlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmIChhY2NlcHRzICYmIHRoaXMudHJlZU5vZGUuaXNGb2xkZXIgJiYgIXRoaXMudHJlZU5vZGUuaXNFeHBhbmRlZCkgeworCQl0aGlzLnNldEF1dG9FeHBhbmRUaW1lcigpOworCX0KKwlyZXR1cm4gYWNjZXB0czsKK30sIGFjY2VwdHM6ZnVuY3Rpb24gKGRyYWdPYmplY3RzKSB7CisJdmFyIGFjY2VwdHMgPSBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUuYWNjZXB0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICghYWNjZXB0cykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBzb3VyY2VUcmVlTm9kZSA9IGRyYWdPYmplY3RzWzBdLnRyZWVOb2RlOworCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoc291cmNlVHJlZU5vZGUpIHx8ICFzb3VyY2VUcmVlTm9kZSB8fCAhc291cmNlVHJlZU5vZGUuaXNUcmVlTm9kZSkgeworCQlkb2pvLnJhaXNlKCJTb3VyY2UgaXMgbm90IFRyZWVOb2RlIG9yIG5vdCBmb3VuZCIpOworCX0KKwlpZiAoc291cmNlVHJlZU5vZGUgPT09IHRoaXMudHJlZU5vZGUpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIHNldEF1dG9FeHBhbmRUaW1lcjpmdW5jdGlvbiAoKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgYXV0b0V4cGFuZCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKGRvam8uZG5kLmRyYWdNYW5hZ2VyLmN1cnJlbnREcm9wVGFyZ2V0ID09PSBfdGhpcykgeworCQkJX3RoaXMuY29udHJvbGxlci5leHBhbmQoX3RoaXMudHJlZU5vZGUpOworCQl9CisJfTsKKwl0aGlzLmF1dG9FeHBhbmRUaW1lciA9IGRvam8ubGFuZy5zZXRUaW1lb3V0KGF1dG9FeHBhbmQsIF90aGlzLmF1dG9FeHBhbmREZWxheSk7Cit9LCBnZXRETkRNb2RlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlTm9kZS50cmVlLkRORE1vZGU7Cit9LCBnZXRBY2NlcHRQb3NpdGlvbjpmdW5jdGlvbiAoZSwgc291cmNlVHJlZU5vZGUpIHsKKwl2YXIgRE5ETW9kZSA9IHRoaXMuZ2V0RE5ETW9kZSgpOworCWlmIChETkRNb2RlICYgZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuT05UTyAmJiAhKCF0aGlzLnRyZWVOb2RlLmFjdGlvbklzRGlzYWJsZWQoZG9qby53aWRnZXQuVHJlZU5vZGUucHJvdG90eXBlLmFjdGlvbnMuQUREQ0hJTEQpICYmIHNvdXJjZVRyZWVOb2RlLnBhcmVudCAhPT0gdGhpcy50cmVlTm9kZSAmJiB0aGlzLmNvbnRyb2xsZXIuY2FuTW92ZShzb3VyY2VUcmVlTm9kZSwgdGhpcy50cmVlTm9kZSkpKSB7CisJCURORE1vZGUgJj0gfmRvam8ud2lkZ2V0LlRyZWUucHJvdG90eXBlLkRORE1vZGVzLk9OVE87CisJfQorCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb24oZSwgRE5ETW9kZSk7CisJaWYgKHBvc2l0aW9uID09ICJvbnRvIiB8fCAoIXRoaXMuaXNBZGphY2VudE5vZGUoc291cmNlVHJlZU5vZGUsIHBvc2l0aW9uKSAmJiB0aGlzLmNvbnRyb2xsZXIuY2FuTW92ZShzb3VyY2VUcmVlTm9kZSwgdGhpcy50cmVlTm9kZS5wYXJlbnQpKSkgeworCQlyZXR1cm4gcG9zaXRpb247CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30sIG9uRHJhZ091dDpmdW5jdGlvbiAoZSkgeworCXRoaXMuY2xlYXJBdXRvRXhwYW5kVGltZXIoKTsKKwl0aGlzLmhpZGVJbmRpY2F0b3IoKTsKK30sIGNsZWFyQXV0b0V4cGFuZFRpbWVyOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5hdXRvRXhwYW5kVGltZXIpIHsKKwkJY2xlYXJUaW1lb3V0KHRoaXMuYXV0b0V4cGFuZFRpbWVyKTsKKwkJdGhpcy5hdXRvRXhwYW5kVGltZXIgPSBudWxsOworCX0KK30sIG9uRHJhZ01vdmU6ZnVuY3Rpb24gKGUsIGRyYWdPYmplY3RzKSB7CisJdmFyIHNvdXJjZVRyZWVOb2RlID0gZHJhZ09iamVjdHNbMF0udHJlZU5vZGU7CisJdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRBY2NlcHRQb3NpdGlvbihlLCBzb3VyY2VUcmVlTm9kZSk7CisJaWYgKHBvc2l0aW9uKSB7CisJCXRoaXMuc2hvd0luZGljYXRvcihwb3NpdGlvbik7CisJfQorfSwgaXNBZGphY2VudE5vZGU6ZnVuY3Rpb24gKHNvdXJjZU5vZGUsIHBvc2l0aW9uKSB7CisJaWYgKHNvdXJjZU5vZGUgPT09IHRoaXMudHJlZU5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChzb3VyY2VOb2RlLmdldE5leHRTaWJsaW5nKCkgPT09IHRoaXMudHJlZU5vZGUgJiYgcG9zaXRpb24gPT0gImJlZm9yZSIpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChzb3VyY2VOb2RlLmdldFByZXZpb3VzU2libGluZygpID09PSB0aGlzLnRyZWVOb2RlICYmIHBvc2l0aW9uID09ICJhZnRlciIpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30sIGdldFBvc2l0aW9uOmZ1bmN0aW9uIChlLCBETkRNb2RlKSB7CisJdmFyIG5vZGUgPSBkb2pvLmJ5SWQodGhpcy50cmVlTm9kZS5sYWJlbE5vZGUpOworCXZhciBtb3VzZXkgPSBlLnBhZ2VZIHx8IGUuY2xpZW50WSArIGRvam8uYm9keSgpLnNjcm9sbFRvcDsKKwl2YXIgbm9kZXkgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihub2RlKS55OworCXZhciBoZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpLmhlaWdodDsKKwl2YXIgcmVsWSA9IG1vdXNleSAtIG5vZGV5OworCXZhciBwID0gcmVsWSAvIGhlaWdodDsKKwl2YXIgcG9zaXRpb24gPSAiIjsKKwlpZiAoRE5ETW9kZSAmIGRvam8ud2lkZ2V0LlRyZWUucHJvdG90eXBlLkRORE1vZGVzLk9OVE8gJiYgRE5ETW9kZSAmIGRvam8ud2lkZ2V0LlRyZWUucHJvdG90eXBlLkRORE1vZGVzLkJFVFdFRU4pIHsKKwkJaWYgKHAgPD0gMC4zKSB7CisJCQlwb3NpdGlvbiA9ICJiZWZvcmUiOworCQl9IGVsc2UgeworCQkJaWYgKHAgPD0gMC43KSB7CisJCQkJcG9zaXRpb24gPSAib250byI7CisJCQl9IGVsc2UgeworCQkJCXBvc2l0aW9uID0gImFmdGVyIjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChETkRNb2RlICYgZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuQkVUV0VFTikgeworCQkJaWYgKHAgPD0gMC41KSB7CisJCQkJcG9zaXRpb24gPSAiYmVmb3JlIjsKKwkJCX0gZWxzZSB7CisJCQkJcG9zaXRpb24gPSAiYWZ0ZXIiOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKERORE1vZGUgJiBkb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5PTlRPKSB7CisJCQkJcG9zaXRpb24gPSAib250byI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHBvc2l0aW9uOworfSwgZ2V0VGFyZ2V0UGFyZW50SW5kZXg6ZnVuY3Rpb24gKHNvdXJjZVRyZWVOb2RlLCBwb3NpdGlvbikgeworCXZhciBpbmRleCA9IHBvc2l0aW9uID09ICJiZWZvcmUiID8gdGhpcy50cmVlTm9kZS5nZXRQYXJlbnRJbmRleCgpIDogdGhpcy50cmVlTm9kZS5nZXRQYXJlbnRJbmRleCgpICsgMTsKKwlpZiAodGhpcy50cmVlTm9kZS5wYXJlbnQgPT09IHNvdXJjZVRyZWVOb2RlLnBhcmVudCAmJiB0aGlzLnRyZWVOb2RlLmdldFBhcmVudEluZGV4KCkgPiBzb3VyY2VUcmVlTm9kZS5nZXRQYXJlbnRJbmRleCgpKSB7CisJCWluZGV4LS07CisJfQorCXJldHVybiBpbmRleDsKK30sIG9uRHJvcDpmdW5jdGlvbiAoZSkgeworCXZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247CisJdGhpcy5vbkRyYWdPdXQoZSk7CisJdmFyIHNvdXJjZVRyZWVOb2RlID0gZS5kcmFnT2JqZWN0LnRyZWVOb2RlOworCWlmICghZG9qby5sYW5nLmlzT2JqZWN0KHNvdXJjZVRyZWVOb2RlKSkgeworCQlkb2pvLnJhaXNlKCJUcmVlTm9kZSBub3QgZm91bmQgaW4gZHJhZ09iamVjdCIpOworCX0KKwlpZiAocG9zaXRpb24gPT0gIm9udG8iKSB7CisJCXJldHVybiB0aGlzLmNvbnRyb2xsZXIubW92ZShzb3VyY2VUcmVlTm9kZSwgdGhpcy50cmVlTm9kZSwgMCk7CisJfSBlbHNlIHsKKwkJdmFyIGluZGV4ID0gdGhpcy5nZXRUYXJnZXRQYXJlbnRJbmRleChzb3VyY2VUcmVlTm9kZSwgcG9zaXRpb24pOworCQlyZXR1cm4gdGhpcy5jb250cm9sbGVyLm1vdmUoc291cmNlVHJlZU5vZGUsIHRoaXMudHJlZU5vZGUucGFyZW50LCBpbmRleCk7CisJfQorfX0pOworZG9qby5kbmQuVHJlZURORENvbnRyb2xsZXIgPSBmdW5jdGlvbiAodHJlZUNvbnRyb2xsZXIpIHsKKwl0aGlzLnRyZWVDb250cm9sbGVyID0gdHJlZUNvbnRyb2xsZXI7CisJdGhpcy5kcmFnU291cmNlcyA9IHt9OworCXRoaXMuZHJvcFRhcmdldHMgPSB7fTsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZG5kLlRyZWVETkRDb250cm9sbGVyLCB7bGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jcmVhdGVET01Ob2RlLCB0aGlzLCAib25DcmVhdGVET01Ob2RlIik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLm1vdmVGcm9tLCB0aGlzLCAib25Nb3ZlRnJvbSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCwgdGhpcywgIm9uQWRkQ2hpbGQiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMucmVtb3ZlTm9kZSwgdGhpcywgIm9uUmVtb3ZlTm9kZSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKK30sIHVubGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHRoaXMsICJvbkNyZWF0ZURPTU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgdGhpcywgIm9uTW92ZUZyb20iKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmFkZENoaWxkLCB0aGlzLCAib25BZGRDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUsIHRoaXMsICJvblJlbW92ZU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKK30sIG9uVHJlZURlc3Ryb3k6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnVubGlzdGVuVHJlZShtZXNzYWdlLnNvdXJjZSk7Cit9LCBvbkNyZWF0ZURPTU5vZGU6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnJlZ2lzdGVyRE5ETm9kZShtZXNzYWdlLnNvdXJjZSk7Cit9LCBvbkFkZENoaWxkOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdGhpcy5yZWdpc3RlckRORE5vZGUobWVzc2FnZS5jaGlsZCk7Cit9LCBvbk1vdmVGcm9tOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaChtZXNzYWdlLmNoaWxkLmdldERlc2NlbmRhbnRzKCksIGZ1bmN0aW9uIChub2RlKSB7CisJCV90aGlzLnVucmVnaXN0ZXJETkROb2RlKG5vZGUpOworCX0pOworfSwgb25Nb3ZlVG86ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCWRvam8ubGFuZy5mb3JFYWNoKG1lc3NhZ2UuY2hpbGQuZ2V0RGVzY2VuZGFudHMoKSwgZnVuY3Rpb24gKG5vZGUpIHsKKwkJX3RoaXMucmVnaXN0ZXJETkROb2RlKG5vZGUpOworCX0pOworfSwgcmVnaXN0ZXJETkROb2RlOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKCFub2RlLnRyZWUuRE5ETW9kZSkgeworCQlyZXR1cm47CisJfQorCXZhciBzb3VyY2UgPSBudWxsOworCXZhciB0YXJnZXQgPSBudWxsOworCWlmICghbm9kZS5hY3Rpb25Jc0Rpc2FibGVkKG5vZGUuYWN0aW9ucy5NT1ZFKSkgeworCQl2YXIgc291cmNlID0gbmV3IGRvam8uZG5kLlRyZWVEcmFnU291cmNlKG5vZGUubGFiZWxOb2RlLCB0aGlzLCBub2RlLnRyZWUud2lkZ2V0SWQsIG5vZGUpOworCQl0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdID0gc291cmNlOworCX0KKwl2YXIgdGFyZ2V0ID0gbmV3IGRvam8uZG5kLlRyZWVEcm9wVGFyZ2V0KG5vZGUubGFiZWxOb2RlLCB0aGlzLnRyZWVDb250cm9sbGVyLCBub2RlLnRyZWUuRE5EQWNjZXB0VHlwZXMsIG5vZGUpOworCXRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0gPSB0YXJnZXQ7Cit9LCB1bnJlZ2lzdGVyRE5ETm9kZTpmdW5jdGlvbiAobm9kZSkgeworCWlmICh0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdKSB7CisJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF0pOworCQlkZWxldGUgdGhpcy5kcmFnU291cmNlc1tub2RlLndpZGdldElkXTsKKwl9CisJaWYgKHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0pIHsKKwkJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyb3BUYXJnZXQodGhpcy5kcm9wVGFyZ2V0c1tub2RlLndpZGdldElkXSk7CisJCWRlbGV0ZSB0aGlzLmRyb3BUYXJnZXRzW25vZGUud2lkZ2V0SWRdOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RuZC9UcmVlRHJhZ0FuZERyb3BWMy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvVHJlZURyYWdBbmREcm9wVjMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjNTdlOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvVHJlZURyYWdBbmREcm9wVjMuanMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZG5kLlRyZWVEcmFnQW5kRHJvcFYzIik7Citkb2pvLnJlcXVpcmUoImRvam8uZG5kLkh0bWxEcmFnQW5kRHJvcCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLkRlZmVycmVkIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8uZG5kLlRyZWVEcmFnU291cmNlVjMgPSBmdW5jdGlvbiAobm9kZSwgc3luY0NvbnRyb2xsZXIsIHR5cGUsIHRyZWVOb2RlKSB7CisJdGhpcy5jb250cm9sbGVyID0gc3luY0NvbnRyb2xsZXI7CisJdGhpcy50cmVlTm9kZSA9IHRyZWVOb2RlOworCWRvam8uZG5kLkh0bWxEcmFnU291cmNlLmNhbGwodGhpcywgbm9kZSwgdHlwZSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZVYzLCBkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSk7Citkb2pvLmRuZC5UcmVlRHJvcFRhcmdldFYzID0gZnVuY3Rpb24gKGRvbU5vZGUsIGNvbnRyb2xsZXIsIHR5cGUsIHRyZWVOb2RlKSB7CisJdGhpcy50cmVlTm9kZSA9IHRyZWVOb2RlOworCXRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisJZG9qby5kbmQuSHRtbERyb3BUYXJnZXQuY2FsbCh0aGlzLCBkb21Ob2RlLCB0eXBlKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8uZG5kLlRyZWVEcm9wVGFyZ2V0VjMsIGRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0KTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5kbmQuVHJlZURyb3BUYXJnZXRWMywge2F1dG9FeHBhbmREZWxheToxNTAwLCBhdXRvRXhwYW5kVGltZXI6bnVsbCwgcG9zaXRpb246bnVsbCwgaW5kaWNhdG9yU3R5bGU6IjJweCBibGFjayBncm9vdmUiLCBzaG93SW5kaWNhdG9yOmZ1bmN0aW9uIChwb3NpdGlvbikgeworCWlmICh0aGlzLnBvc2l0aW9uID09IHBvc2l0aW9uKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5oaWRlSW5kaWNhdG9yKCk7CisJdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworCXZhciBub2RlID0gdGhpcy50cmVlTm9kZTsKKwlub2RlLmNvbnRlbnROb2RlLnN0eWxlLndpZHRoID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlLmxhYmVsTm9kZSkud2lkdGggKyAicHgiOworCWlmIChwb3NpdGlvbiA9PSAib250byIpIHsKKwkJbm9kZS5jb250ZW50Tm9kZS5zdHlsZS5ib3JkZXIgPSB0aGlzLmluZGljYXRvclN0eWxlOworCX0gZWxzZSB7CisJCWlmIChwb3NpdGlvbiA9PSAiYmVmb3JlIikgeworCQkJbm9kZS5jb250ZW50Tm9kZS5zdHlsZS5ib3JkZXJUb3AgPSB0aGlzLmluZGljYXRvclN0eWxlOworCQl9IGVsc2UgeworCQkJaWYgKHBvc2l0aW9uID09ICJhZnRlciIpIHsKKwkJCQlub2RlLmNvbnRlbnROb2RlLnN0eWxlLmJvcmRlckJvdHRvbSA9IHRoaXMuaW5kaWNhdG9yU3R5bGU7CisJCQl9CisJCX0KKwl9Cit9LCBoaWRlSW5kaWNhdG9yOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnRyZWVOb2RlLmNvbnRlbnROb2RlLnN0eWxlLmJvcmRlckJvdHRvbSA9ICIiOworCXRoaXMudHJlZU5vZGUuY29udGVudE5vZGUuc3R5bGUuYm9yZGVyVG9wID0gIiI7CisJdGhpcy50cmVlTm9kZS5jb250ZW50Tm9kZS5zdHlsZS5ib3JkZXIgPSAiIjsKKwl0aGlzLnRyZWVOb2RlLmNvbnRlbnROb2RlLnN0eWxlLndpZHRoID0gIiI7CisJdGhpcy5wb3NpdGlvbiA9IG51bGw7Cit9LCBvbkRyYWdPdmVyOmZ1bmN0aW9uIChlKSB7CisJdmFyIGFjY2VwdHMgPSBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUub25EcmFnT3Zlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmIChhY2NlcHRzICYmIHRoaXMudHJlZU5vZGUuaXNGb2xkZXIgJiYgIXRoaXMudHJlZU5vZGUuaXNFeHBhbmRlZCkgeworCQl0aGlzLnNldEF1dG9FeHBhbmRUaW1lcigpOworCX0KKwlpZiAoYWNjZXB0cykgeworCQl0aGlzLmNhY2hlTm9kZUNvb3JkcygpOworCX0KKwlyZXR1cm4gYWNjZXB0czsKK30sIGFjY2VwdHM6ZnVuY3Rpb24gKGRyYWdPYmplY3RzKSB7CisJdmFyIGFjY2VwdHMgPSBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUuYWNjZXB0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICghYWNjZXB0cykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgZHJhZ09iamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHNvdXJjZVRyZWVOb2RlID0gZHJhZ09iamVjdHNbaV0udHJlZU5vZGU7CisJCWlmIChzb3VyY2VUcmVlTm9kZSA9PT0gdGhpcy50cmVlTm9kZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfSwgc2V0QXV0b0V4cGFuZFRpbWVyOmZ1bmN0aW9uICgpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBhdXRvRXhwYW5kID0gZnVuY3Rpb24gKCkgeworCQlpZiAoZG9qby5kbmQuZHJhZ01hbmFnZXIuY3VycmVudERyb3BUYXJnZXQgPT09IF90aGlzKSB7CisJCQlfdGhpcy5jb250cm9sbGVyLmV4cGFuZChfdGhpcy50cmVlTm9kZSk7CisJCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5jYWNoZVRhcmdldExvY2F0aW9ucygpOworCQl9CisJfTsKKwl0aGlzLmF1dG9FeHBhbmRUaW1lciA9IGRvam8ubGFuZy5zZXRUaW1lb3V0KGF1dG9FeHBhbmQsIF90aGlzLmF1dG9FeHBhbmREZWxheSk7Cit9LCBnZXRBY2NlcHRQb3NpdGlvbjpmdW5jdGlvbiAoZSwgZHJhZ09iamVjdHMpIHsKKwl2YXIgRG5kTW9kZSA9IHRoaXMudHJlZU5vZGUudHJlZS5EbmRNb2RlOworCWlmIChEbmRNb2RlICYgZG9qby53aWRnZXQuVHJlZVYzLnByb3RvdHlwZS5EbmRNb2Rlcy5PTlRPICYmIHRoaXMudHJlZU5vZGUuYWN0aW9uSXNEaXNhYmxlZE5vdyh0aGlzLnRyZWVOb2RlLmFjdGlvbnMuQUREQ0hJTEQpKSB7CisJCURuZE1vZGUgJj0gfmRvam8ud2lkZ2V0LlRyZWVWMy5wcm90b3R5cGUuRG5kTW9kZXMuT05UTzsKKwl9CisJdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihlLCBEbmRNb2RlKTsKKwlpZiAocG9zaXRpb24gPT0gIm9udG8iKSB7CisJCXJldHVybiBwb3NpdGlvbjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQl2YXIgc291cmNlID0gZHJhZ09iamVjdHNbaV0uZHJhZ1NvdXJjZTsKKwkJaWYgKHNvdXJjZS50cmVlTm9kZSAmJiB0aGlzLmlzQWRqYWNlbnROb2RlKHNvdXJjZS50cmVlTm9kZSwgcG9zaXRpb24pKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXRoaXMuY29udHJvbGxlci5jYW5Nb3ZlKHNvdXJjZS50cmVlTm9kZSA/IHNvdXJjZS50cmVlTm9kZSA6IHNvdXJjZSwgdGhpcy50cmVlTm9kZS5wYXJlbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHBvc2l0aW9uOworfSwgb25Ecm9wRW5kOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5jbGVhckF1dG9FeHBhbmRUaW1lcigpOworCXRoaXMuaGlkZUluZGljYXRvcigpOworfSwgb25EcmFnT3V0OmZ1bmN0aW9uIChlKSB7CisJdGhpcy5jbGVhckF1dG9FeHBhbmRUaW1lcigpOworCXRoaXMuaGlkZUluZGljYXRvcigpOworfSwgY2xlYXJBdXRvRXhwYW5kVGltZXI6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmF1dG9FeHBhbmRUaW1lcikgeworCQljbGVhclRpbWVvdXQodGhpcy5hdXRvRXhwYW5kVGltZXIpOworCQl0aGlzLmF1dG9FeHBhbmRUaW1lciA9IG51bGw7CisJfQorfSwgb25EcmFnTW92ZTpmdW5jdGlvbiAoZSwgZHJhZ09iamVjdHMpIHsKKwl2YXIgcG9zaXRpb24gPSB0aGlzLmdldEFjY2VwdFBvc2l0aW9uKGUsIGRyYWdPYmplY3RzKTsKKwlpZiAocG9zaXRpb24pIHsKKwkJdGhpcy5zaG93SW5kaWNhdG9yKHBvc2l0aW9uKTsKKwl9Cit9LCBpc0FkamFjZW50Tm9kZTpmdW5jdGlvbiAoc291cmNlTm9kZSwgcG9zaXRpb24pIHsKKwlpZiAoc291cmNlTm9kZSA9PT0gdGhpcy50cmVlTm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKHNvdXJjZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PT0gdGhpcy50cmVlTm9kZSAmJiBwb3NpdGlvbiA9PSAiYmVmb3JlIikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKHNvdXJjZU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT09IHRoaXMudHJlZU5vZGUgJiYgcG9zaXRpb24gPT0gImFmdGVyIikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgY2FjaGVOb2RlQ29vcmRzOmZ1bmN0aW9uICgpIHsKKwl2YXIgbm9kZSA9IHRoaXMudHJlZU5vZGUuY29udGVudE5vZGU7CisJdGhpcy5jYWNoZWROb2RlWSA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKG5vZGUpLnk7CisJdGhpcy5jYWNoZWROb2RlSGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKS5oZWlnaHQ7Cit9LCBnZXRQb3NpdGlvbjpmdW5jdGlvbiAoZSwgRG5kTW9kZSkgeworCXZhciBtb3VzZXkgPSBlLnBhZ2VZIHx8IGUuY2xpZW50WSArIGRvam8uYm9keSgpLnNjcm9sbFRvcDsKKwl2YXIgcmVsWSA9IG1vdXNleSAtIHRoaXMuY2FjaGVkTm9kZVk7CisJdmFyIHAgPSByZWxZIC8gdGhpcy5jYWNoZWROb2RlSGVpZ2h0OworCXZhciBwb3NpdGlvbiA9ICIiOworCWlmIChEbmRNb2RlICYgZG9qby53aWRnZXQuVHJlZVYzLnByb3RvdHlwZS5EbmRNb2Rlcy5PTlRPICYmIERuZE1vZGUgJiBkb2pvLndpZGdldC5UcmVlVjMucHJvdG90eXBlLkRuZE1vZGVzLkJFVFdFRU4pIHsKKwkJaWYgKHAgPD0gMC4zMykgeworCQkJcG9zaXRpb24gPSAiYmVmb3JlIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwIDw9IDAuNjYgfHwgdGhpcy50cmVlTm9kZS5pc0V4cGFuZGVkICYmIHRoaXMudHJlZU5vZGUuY2hpbGRyZW4ubGVuZ3RoICYmICF0aGlzLnRyZWVOb2RlLmlzTGFzdENoaWxkKCkpIHsKKwkJCQlwb3NpdGlvbiA9ICJvbnRvIjsKKwkJCX0gZWxzZSB7CisJCQkJcG9zaXRpb24gPSAiYWZ0ZXIiOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKERuZE1vZGUgJiBkb2pvLndpZGdldC5UcmVlVjMucHJvdG90eXBlLkRuZE1vZGVzLkJFVFdFRU4pIHsKKwkJCWlmIChwIDw9IDAuNSB8fCB0aGlzLnRyZWVOb2RlLmlzRXhwYW5kZWQgJiYgdGhpcy50cmVlTm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgIXRoaXMudHJlZU5vZGUuaXNMYXN0Q2hpbGQoKSkgeworCQkJCXBvc2l0aW9uID0gImJlZm9yZSI7CisJCQl9IGVsc2UgeworCQkJCXBvc2l0aW9uID0gImFmdGVyIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChEbmRNb2RlICYgZG9qby53aWRnZXQuVHJlZVYzLnByb3RvdHlwZS5EbmRNb2Rlcy5PTlRPKSB7CisJCQkJcG9zaXRpb24gPSAib250byI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHBvc2l0aW9uOworfSwgZ2V0VGFyZ2V0UGFyZW50SW5kZXg6ZnVuY3Rpb24gKHNvdXJjZSwgcG9zaXRpb24pIHsKKwl2YXIgaW5kZXggPSBwb3NpdGlvbiA9PSAiYmVmb3JlIiA/IHRoaXMudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSA6IHRoaXMudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSArIDE7CisJaWYgKHNvdXJjZS50cmVlTm9kZSAmJiB0aGlzLnRyZWVOb2RlLnBhcmVudCA9PT0gc291cmNlLnRyZWVOb2RlLnBhcmVudCAmJiB0aGlzLnRyZWVOb2RlLmdldFBhcmVudEluZGV4KCkgPiBzb3VyY2UudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSkgeworCQlpbmRleC0tOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9LCBvbkRyb3A6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uOworCXZhciBzb3VyY2UgPSBlLmRyYWdPYmplY3QuZHJhZ1NvdXJjZTsKKwl2YXIgdGFyZ2V0UGFyZW50LCB0YXJnZXRJbmRleDsKKwlpZiAocG9zaXRpb24gPT0gIm9udG8iKSB7CisJCXRhcmdldFBhcmVudCA9IHRoaXMudHJlZU5vZGU7CisJCXRhcmdldEluZGV4ID0gMDsKKwl9IGVsc2UgeworCQl0YXJnZXRJbmRleCA9IHRoaXMuZ2V0VGFyZ2V0UGFyZW50SW5kZXgoc291cmNlLCBwb3NpdGlvbik7CisJCXRhcmdldFBhcmVudCA9IHRoaXMudHJlZU5vZGUucGFyZW50OworCX0KKwl2YXIgciA9IHRoaXMuZ2V0RHJvcEhhbmRsZXIoZSwgc291cmNlLCB0YXJnZXRQYXJlbnQsIHRhcmdldEluZGV4KSgpOworCXJldHVybiByOworfSwgZ2V0RHJvcEhhbmRsZXI6ZnVuY3Rpb24gKGUsIHNvdXJjZSwgdGFyZ2V0UGFyZW50LCB0YXJnZXRJbmRleCkgeworCXZhciBoYW5kbGVyOworCXZhciBfdGhpcyA9IHRoaXM7CisJaGFuZGxlciA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIHJlc3VsdDsKKwkJaWYgKHNvdXJjZS50cmVlTm9kZSkgeworCQkJcmVzdWx0ID0gX3RoaXMuY29udHJvbGxlci5tb3ZlKHNvdXJjZS50cmVlTm9kZSwgdGFyZ2V0UGFyZW50LCB0YXJnZXRJbmRleCwgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24oc291cmNlLm9uRHJvcCkpIHsKKwkJCQlzb3VyY2Uub25Ecm9wKHRhcmdldFBhcmVudCwgdGFyZ2V0SW5kZXgpOworCQkJfQorCQkJdmFyIHRyZWVOb2RlID0gc291cmNlLmdldFRyZWVOb2RlKCk7CisJCQlpZiAodHJlZU5vZGUpIHsKKwkJCQlyZXN1bHQgPSBfdGhpcy5jb250cm9sbGVyLmNyZWF0ZUNoaWxkKHRhcmdldFBhcmVudCwgdGFyZ2V0SW5kZXgsIHRyZWVOb2RlLCB0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgZG9qby5EZWZlcnJlZCkgeworCQkJdmFyIGlzU3VjY2VzcyA9IHJlc3VsdC5maXJlZCA9PSAwOworCQkJaWYgKCFpc1N1Y2Nlc3MpIHsKKwkJCQlfdGhpcy5oYW5kbGVEcm9wRXJyb3Ioc291cmNlLCB0YXJnZXRQYXJlbnQsIHRhcmdldEluZGV4LCByZXN1bHQpOworCQkJfQorCQkJcmV0dXJuIGlzU3VjY2VzczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9OworCXJldHVybiBoYW5kbGVyOworfSwgaGFuZGxlRHJvcEVycm9yOmZ1bmN0aW9uIChzb3VyY2UsIHBhcmVudCwgaW5kZXgsIHJlc3VsdCkgeworCWRvam8uZGVidWcoIlRyZWVEcm9wVGFyZ2V0VjMuaGFuZGxlRHJvcEVycm9yOiBETkQgZXJyb3Igb2NjdXJlZCIpOworCWRvam8uZGVidWdTaGFsbG93KHJlc3VsdCk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kbmQvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDU4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG5kL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmRuZC5EcmFnQW5kRHJvcCJdLCBicm93c2VyOlsiZG9qby5kbmQuSHRtbERyYWdBbmREcm9wIl0sIGRhc2hib2FyZDpbImRvam8uZG5kLkh0bWxEcmFnQW5kRHJvcCJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8uZG5kLioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RvY3MuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG9jcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg3MmJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2RvY3MuanMKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kb2NzIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LnRvcGljIik7Citkb2pvLnJlcXVpcmUoImRvam8ucnBjLkpvdFNlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kb20iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuVXJpIik7Citkb2pvLnJlcXVpcmUoImRvam8uRGVmZXJyZWQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5EZWZlcnJlZExpc3QiKTsKKworLyoKKyAqIFRPRE86CisgKgorICogUGFja2FnZSBzdW1tYXJ5IG5lZWRzIHRvIGNvbXBlbnNhdGUgZm9yICJpcyIKKyAqIEhhbmRsZSBob3N0IGVudmlyb25tZW50cworICogRGVhbCB3aXRoIGRvam8ud2lkZ2V0IHdlaXJkbmVzcworICogUGFyc2UgcGFyYW1ldGVycworICogTGltaXQgZnVuY3Rpb24gcGFyYW1ldGVycyB0byBvbmx5IHRoZSB2YWxpZCBvbmVzIChJbnZvbHZlcyBwYWNraW5nIHBhcmFtZXRlcnMgb250byBtZXRhIGR1cmluZyByZXdyaXRpbmcpCisgKgorICovCisKK2Rvam8uZG9jcyA9IG5ldyBmdW5jdGlvbigpIHsKKwl0aGlzLl91cmwgPSBkb2pvLnVyaS5kb2pvVXJpKCJkb2NzY3JpcHRzIik7CisJdGhpcy5fcnBjID0gbmV3IGRvam8ucnBjLkpvdFNlcnZpY2U7CisJdGhpcy5fcnBjLnNlcnZpY2VVcmwgPSBkb2pvLnVyaS5kb2pvVXJpKCJkb2NzY3JpcHRzL2pzb25ycGMucGhwIik7Cit9OworZG9qby5sYW5nLm1peGluKGRvam8uZG9jcywgeworCV9jb3VudDogMCwKKwlfY2FsbGJhY2tzOiB7ZnVuY3Rpb25fbmFtZXM6IFtdfSwKKwlfY2FjaGU6IHt9LCAvLyBTYXZlcyB0aGUgSlNPTiBvYmplY3RzIGluIGNhY2hlCisJcmVxdWlyZTogZnVuY3Rpb24oLypTdHJpbmcqLyByZXF1aXJlLCAvKmJvb2wqLyBzeW5jKSB7CisJCWRvam8uZGVidWcoInJlcXVpcmUoKTogIiArIHJlcXVpcmUpOworCQl2YXIgcGFydHMgPSByZXF1aXJlLnNwbGl0KCIvIik7CisJCQorCQl2YXIgc2l6ZSA9IHBhcnRzLmxlbmd0aDsKKwkJdmFyIGRlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQ7CisJCXZhciBhcmdzID0geworCQkJbWltZXR5cGU6ICJ0ZXh0L2pzb24iLAorCQkJbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSl7CisJCQkJZG9qby5kZWJ1ZygicmVxdWlyZSgpOiBsb2FkZWQgZm9yICIgKyByZXF1aXJlKTsKKwkJCQkKKwkJCQlpZihwYXJ0c1swXSAhPSAiZnVuY3Rpb25fbmFtZXMiKSB7CisJCQkJCWZvcih2YXIgaSA9IDAsIHBhcnQ7IHBhcnQgPSBwYXJ0c1tpXTsgaSsrKXsKKwkJCQkJCWRhdGEgPSBkYXRhW3BhcnRdOworCQkJCQl9CisJCQkJfQorCQkJCWRlZmVycmVkLmNhbGxiYWNrKGRhdGEpOworCQkJfSwKKwkJCWVycm9yOiBmdW5jdGlvbigpeworCQkJCWRlZmVycmVkLmVycmJhY2soKTsKKwkJCX0KKwkJfTsKKworCQlpZihsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiKXsKKwkJCWlmKHNpemUpeworCQkJCWlmKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09ICJkb2N1bWVudGF0aW9uIil7CisJCQkJCXBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID0gIm1ldGEiOworCQkJCX0KKwkJCQorCQkJCWlmKHBhcnRzWzBdID09ICJmdW5jdGlvbl9uYW1lcyIpeworCQkJCQlhcmdzLnVybCA9IFt0aGlzLl91cmwsICJsb2NhbF9qc29uIiwgImZ1bmN0aW9uX25hbWVzIl0uam9pbigiLyIpOworCQkJCX1lbHNleworCQkJCQl2YXIgZGlycyA9IHBhcnRzWzBdLnNwbGl0KCIuIik7CisJCQkJCWFyZ3MudXJsID0gW3RoaXMuX3VybCwgImxvY2FsX2pzb24iLCBkaXJzWzBdXS5qb2luKCIvIik7CisJCQkJCWlmKGRpcnMubGVuZ3RoID4gMSl7CisJCQkJCQlhcmdzLnVybCA9IFthcmdzLnVybCwgZGlyc1sxXV0uam9pbigiLiIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlkb2pvLmlvLmJpbmQoYXJncyk7CisJCXJldHVybiBkZWZlcnJlZDsKKwl9LAorCWdldEZ1bmN0aW9uTmFtZXM6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcXVpcmUoImZ1bmN0aW9uX25hbWVzIik7IC8vIGRvam8uRGVmZXJyZWQKKwl9LAorCXVuRm9ybWF0OiBmdW5jdGlvbigvKlN0cmluZyovIHN0cmluZyl7CisJCXZhciBmU3RyaW5nID0gc3RyaW5nOworCQlpZihzdHJpbmcuY2hhckF0KHN0cmluZy5sZW5ndGggLSAxKSA9PSAiXyIpeworCQkJZlN0cmluZyA9IFtzdHJpbmcuc3Vic3RyaW5nKDAsIHN0cmluZy5sZW5ndGggLSAxKSwgIioiXS5qb2luKCIiKTsKKwkJfQorCQlyZXR1cm4gZlN0cmluZzsKKwl9LAorCWdldE1ldGE6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gcGtnLCAvKlN0cmluZyovIG5hbWUsIC8qRnVuY3Rpb24qLyBjYWxsYmFjaywgLypTdHJpbmc/Ki8gaWQpeworCQkvLyBzdW1tYXJ5OiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24gaW4gcmVnYXJkcyB0byBpdHMgbWV0YSBkYXRhCisJCWlmKHR5cGVvZiBuYW1lID09ICJmdW5jdGlvbiIpeworCQkJLy8gcElkOiBhCisJCQkvLyBwa2c6IGlnbm9yZQorCQkJaWQgPSBjYWxsYmFjazsKKwkJCWNhbGxiYWNrID0gbmFtZTsKKwkJCW5hbWUgPSBwa2c7CisJCQlwa2cgPSBudWxsOworCQkJZG9qby5kZWJ1ZygiZ2V0TWV0YSgiICsgbmFtZSArICIpIik7CisJCX1lbHNleworCQkJZG9qby5kZWJ1ZygiZ2V0TWV0YSgiICsgcGtnICsgIi8iICsgbmFtZSArICIpIik7CisJCX0KKwkJCisJCWlmKCFpZCl7CisJCQlpZCA9ICJfIjsKKwkJfQorCX0sCisJX3dpdGhQa2c6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypPYmplY3QqLyBkYXRhLCAvKk9iamVjdCovIGV2dCwgLypPYmplY3QqLyBpbnB1dCwgLypTdHJpbmcqLyBuZXdUeXBlKXsKKwkJZG9qby5kZWJ1ZygiX3dpdGhQa2coIiArIGV2dC5uYW1lICsgIikgaGFzIHBhY2thZ2U6ICIgKyBkYXRhWzBdKTsKKwkJZXZ0LnBrZyA9IGRhdGFbMF07CisJCWlmKCJsb2FkIiA9PSB0eXBlICYmIGV2dC5wa2cpeworCQkJZXZ0LnR5cGUgPSBuZXdUeXBlOworCQl9ZWxzZXsKKwkJCWlmKGV2dC5jYWxsYmFja3MgJiYgZXZ0LmNhbGxiYWNrcy5sZW5ndGgpeworCQkJCWV2dC5jYWxsYmFja3Muc2hpZnQoKSgiZXJyb3IiLCB7fSwgZXZ0LCBldnQuaW5wdXQpOworCQkJfQorCQl9CisJfSwKKwlfZ290TWV0YTogZnVuY3Rpb24oLypTdHJpbmcqLyB0eXBlLCAvKk9iamVjdCovIGRhdGEsIC8qT2JqZWN0Ki8gZXZ0KXsKKwkJZG9qby5kZWJ1ZygiX2dvdE1ldGEoIiArIGV2dC5uYW1lICsgIikiKTsKKworCQl2YXIgY2FjaGVkID0gZG9qby5kb2NzLl9nZXRDYWNoZShldnQucGtnLCBldnQubmFtZSwgIm1ldGEiLCAiZnVuY3Rpb25zIiwgZXZ0LmlkKTsKKwkJaWYoY2FjaGVkLnN1bW1hcnkpeworCQkJZGF0YS5zdW1tYXJ5ID0gY2FjaGVkLnN1bW1hcnk7CisJCX0KKwkJaWYoZXZ0LmNhbGxiYWNrcyAmJiBldnQuY2FsbGJhY2tzLmxlbmd0aCl7CisJCQlldnQuY2FsbGJhY2tzLnNoaWZ0KCkodHlwZSwgZGF0YSwgZXZ0LCBldnQuaW5wdXQpOworCQl9CisJfSwKKwlnZXRTcmM6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gbmFtZSwgLypGdW5jdGlvbiovIGNhbGxiYWNrLCAvKlN0cmluZz8qLyBpZCl7CisJCS8vIHN1bW1hcnk6IEdldHMgc3JjIGZpbGUgKGNyZWF0ZWQgYnkgdGhlIGRvYyBwYXJzZXIpCisJCWRvam8uZGVidWcoImdldFNyYygiICsgbmFtZSArICIpIik7CisJCWlmKCFpZCl7CisJCQlpZCA9ICJfIjsKKwkJfQorCX0sCisJZ2V0RG9jOiBmdW5jdGlvbigvKlN0cmluZyovIG5hbWUsIC8qRnVuY3Rpb24qLyBjYWxsYmFjaywgLypTdHJpbmc/Ki8gaWQpeworCQkvLyBzdW1tYXJ5OiBHZXRzIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc3RvcmVkIG9uIEpvdCBmb3IgYSBnaXZlbiBmdW5jdGlvbgorCQlkb2pvLmRlYnVnKCJnZXREb2MoIiArIG5hbWUgICsgIikiKTsKKworCQlpZighaWQpeworCQkJaWQgPSAiXyI7CisJCX0KKworCQl2YXIgaW5wdXQgPSB7fTsKKworCQlpbnB1dC50eXBlID0gImRvYyI7CisJCWlucHV0Lm5hbWUgPSBuYW1lOworCQlpbnB1dC5jYWxsYmFja3MgPSBbY2FsbGJhY2tdOworCX0sCisJX2dvdERvYzogZnVuY3Rpb24oLypTdHJpbmcqLyB0eXBlLCAvKkFycmF5Ki8gZGF0YSwgLypPYmplY3QqLyBldnQsIC8qT2JqZWN0Ki8gaW5wdXQpeworCQlkb2pvLmRlYnVnKCJfZ290RG9jKCIgKyBldnQudHlwZSArICIpIik7CisJCQorCQlldnRbZXZ0LnR5cGVdID0gZGF0YTsKKwkJaWYoZXZ0LmV4cGVjdHMgJiYgZXZ0LmV4cGVjdHMuZG9jKXsKKwkJCWZvcih2YXIgaSA9IDAsIGV4cGVjdDsgZXhwZWN0ID0gZXZ0LmV4cGVjdHMuZG9jW2ldOyBpKyspeworCQkJCWlmKCEoZXhwZWN0IGluIGV2dCkpeworCQkJCQlkb2pvLmRlYnVnKCJfZ290RG9jKCkgd2FpdGluZyBmb3IgbW9yZSBkYXRhIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXZhciBjYWNoZSA9IGRvam8uZG9jcy5fZ2V0Q2FjaGUoZXZ0LnBrZywgIm1ldGEiLCAiZnVuY3Rpb25zIiwgZXZ0Lm5hbWUsIGV2dC5pZCwgIm1ldGEiKTsKKworCQl2YXIgZGVzY3JpcHRpb24gPSBldnQuZm4uZGVzY3JpcHRpb247CisJCWNhY2hlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRhdGEgPSB7CisJCQlyZXR1cm5zOiBldnQuZm4ucmV0dXJucywKKwkJCWlkOiBldnQuaWQsCisJCQl2YXJpYWJsZXM6IFtdCisJCX0KKwkJaWYoIWNhY2hlLnBhcmFtZXRlcnMpeworCQkJY2FjaGUucGFyYW1ldGVycyA9IHt9OworCQl9CisJCWZvcih2YXIgaSA9IDAsIHBhcmFtOyBwYXJhbSA9IGV2dC5wYXJhbVtpXTsgaSsrKXsKKwkJCXZhciBmTmFtZSA9IHBhcmFtWyJEb2NQYXJhbUZvcm0vbmFtZSJdOworCQkJaWYoIWNhY2hlLnBhcmFtZXRlcnNbZk5hbWVdKXsKKwkJCQljYWNoZS5wYXJhbWV0ZXJzW2ZOYW1lXSA9IHt9OworCQkJfQorCQkJY2FjaGUucGFyYW1ldGVyc1tmTmFtZV0uZGVzY3JpcHRpb24gPSBwYXJhbVsiRG9jUGFyYW1Gb3JtL2Rlc2MiXQorCQl9CisKKwkJZGF0YS5kZXNjcmlwdGlvbiA9IGNhY2hlLmRlc2NyaXB0aW9uOworCQlkYXRhLnBhcmFtZXRlcnMgPSBjYWNoZS5wYXJhbWV0ZXJzOworCQkKKwkJZXZ0LnR5cGUgPSAiZG9jIjsKKwkKKwkJaWYoZXZ0LmNhbGxiYWNrcyAmJiBldnQuY2FsbGJhY2tzLmxlbmd0aCl7CisJCQlldnQuY2FsbGJhY2tzLnNoaWZ0KCkoImxvYWQiLCBkYXRhLCBldnQsIGlucHV0KTsKKwkJfQorCX0sCisJZ2V0UGtnRG9jOiBmdW5jdGlvbigvKlN0cmluZyovIG5hbWUsIC8qRnVuY3Rpb24qLyBjYWxsYmFjayl7CisJCS8vIHN1bW1hcnk6IEdldHMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzdG9yZWQgb24gSm90IGZvciBhIGdpdmVuIHBhY2thZ2UKKwkJZG9qby5kZWJ1ZygiZ2V0UGtnRG9jKCIgKyBuYW1lICsgIikiKTsKKwkJdmFyIGlucHV0ID0ge307CisJfSwKKwlnZXRQa2dJbmZvOiBmdW5jdGlvbigvKlN0cmluZyovIG5hbWUsIC8qRnVuY3Rpb24qLyBjYWxsYmFjayl7CisJCS8vIHN1bW1hcnk6IEdldHMgYSBjb21iaW5hdGlvbiBvZiB0aGUgbWV0YWRhdGEgYW5kIGV4dGVybmFsIGRvY3VtZW50YXRpb24gZm9yIGEgZ2l2ZW4gcGFja2FnZQorCQlkb2pvLmRlYnVnKCJnZXRQa2dJbmZvKCIgKyBuYW1lICsgIikiKTsKKworCQl2YXIgaW5wdXQgPSB7CisJCQlleHBlY3RzOiB7CisJCQkJcGtnaW5mbzogWyJwa2dtZXRhIiwgInBrZ2RvYyJdCisJCQl9LAorCQkJY2FsbGJhY2s6IGNhbGxiYWNrCisJCX07CisJCWRvam8uZG9jcy5nZXRQa2dNZXRhKGlucHV0LCBuYW1lLCBkb2pvLmRvY3MuX2dldFBrZ0luZm8pOworCQlkb2pvLmRvY3MuZ2V0UGtnRG9jKGlucHV0LCBuYW1lLCBkb2pvLmRvY3MuX2dldFBrZ0luZm8pOworCX0sCisJX2dldFBrZ0luZm86IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypPYmplY3QqLyBkYXRhLCAvKk9iamVjdCovIGV2dCl7CisJCWRvam8uZGVidWcoIl9nZXRQa2dJbmZvKCkgZm9yICIgKyBldnQudHlwZSk7CisJCXZhciBpbnB1dCA9IHt9OworCQl2YXIgcmVzdWx0cyA9IHt9OworCQlpZih0eXBlb2Yga2V5ID09ICJvYmplY3QiKXsKKwkJCWlucHV0ID0ga2V5OworCQkJaW5wdXRbZXZ0LnR5cGVdID0gZGF0YTsKKwkJCWlmKGlucHV0LmV4cGVjdHMgJiYgaW5wdXQuZXhwZWN0cy5wa2dpbmZvKXsKKwkJCQlmb3IodmFyIGkgPSAwLCBleHBlY3Q7IGV4cGVjdCA9IGlucHV0LmV4cGVjdHMucGtnaW5mb1tpXTsgaSsrKXsKKwkJCQkJaWYoIShleHBlY3QgaW4gaW5wdXQpKXsKKwkJCQkJCWRvam8uZGVidWcoIl9nZXRQa2dJbmZvKCkgd2FpdGluZyBmb3IgbW9yZSBkYXRhIik7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXN1bHRzID0gaW5wdXQucGtnbWV0YTsKKwkJCXJlc3VsdHMuZGVzY3JpcHRpb24gPSBpbnB1dC5wa2dkb2M7CisJCX0KKworCQlpZihpbnB1dC5jYWxsYmFjayl7CisJCQlpbnB1dC5jYWxsYmFjaygibG9hZCIsIHJlc3VsdHMsIGV2dCk7CisJCX0KKwl9LAorCWdldEluZm86IGZ1bmN0aW9uKC8qU3RyaW5nKi8gbmFtZSwgLypGdW5jdGlvbiovIGNhbGxiYWNrKXsKKwkJZG9qby5kZWJ1ZygiZ2V0SW5mbygiICsgbmFtZSArICIpIik7CisJCXZhciBpbnB1dCA9IHsKKwkJCWV4cGVjdHM6IHsKKwkJCQkiaW5mbyI6IFsibWV0YSIsICJkb2MiXQorCQkJfSwKKwkJCWNhbGxiYWNrOiBjYWxsYmFjaworCQl9CisJCWRvam8uZG9jcy5nZXRNZXRhKGlucHV0LCBuYW1lLCBkb2pvLmRvY3MuX2dldEluZm8pOworCQlkb2pvLmRvY3MuZ2V0RG9jKGlucHV0LCBuYW1lLCBkb2pvLmRvY3MuX2dldEluZm8pOworCX0sCisJX2dldEluZm86IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypTdHJpbmcqLyBkYXRhLCAvKk9iamVjdCovIGV2dCwgLypPYmplY3QqLyBpbnB1dCl7CisJCWRvam8uZGVidWcoIl9nZXRJbmZvKCIgKyBldnQudHlwZSArICIpIik7CisJCWlmKGlucHV0ICYmIGlucHV0LmV4cGVjdHMgJiYgaW5wdXQuZXhwZWN0cy5pbmZvKXsKKwkJCWlucHV0W2V2dC50eXBlXSA9IGRhdGE7CisJCQlmb3IodmFyIGkgPSAwLCBleHBlY3Q7IGV4cGVjdCA9IGlucHV0LmV4cGVjdHMuaW5mb1tpXTsgaSsrKXsKKwkJCQlpZighKGV4cGVjdCBpbiBpbnB1dCkpeworCQkJCQlkb2pvLmRlYnVnKCJfZ2V0SW5mbygpIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoaW5wdXQuY2FsbGJhY2speworCQkJaW5wdXQuY2FsbGJhY2soImxvYWQiLCBkb2pvLmRvY3MuX2dldENhY2hlKGV2dC5wa2csICJtZXRhIiwgImZ1bmN0aW9ucyIsIGV2dC5uYW1lLCBldnQuaWQsICJtZXRhIiksIGV2dCwgaW5wdXQpOworCQl9CisJfSwKKwlfZ2V0TWFpblRleHQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdGV4dCl7CisJCS8vIHN1bW1hcnk6IEdyYWJzIHRoZSBpbm5lckhUTUwgZnJvbSBhIEpvdCBSZWNoIFRleHQgbm9kZQorCQlkb2pvLmRlYnVnKCJfZ2V0TWFpblRleHQoKSIpOworCQlyZXR1cm4gdGV4dC5yZXBsYWNlKC9ePGh0bWxbXjxdKj4vLCAiIikucmVwbGFjZSgvPFwvaHRtbD4kLywgIiIpLnJlcGxhY2UoLzxcdytccypcLz4vZywgIiIpOworCX0sCisJZ2V0UGFja2FnZU1ldGE6IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gaW5wdXQpeworCQlkb2pvLmRlYnVnKCJnZXRQYWNrYWdlTWV0YSgpOiAiICsgaW5wdXQucGFja2FnZSk7CisJCXJldHVybiB0aGlzLnJlcXVpcmUoaW5wdXQucGFja2FnZSArICIvbWV0YSIsIGlucHV0LnN5bmMpOworCX0sCisJZ2V0RnVuY3Rpb25NZXRhOiBmdW5jdGlvbigvKk9iamVjdCovIGlucHV0KXsKKwkJdmFyIHBhY2thZ2UgPSBpbnB1dC5wYWNrYWdlIHx8ICIiOworCQl2YXIgbmFtZSA9IGlucHV0Lm5hbWU7CisJCXZhciBpZCA9IGlucHV0LmlkIHx8ICJfIjsKKwkJZG9qby5kZWJ1ZygiZ2V0RnVuY3Rpb25NZXRhKCk6ICIgKyBuYW1lKTsKKworCQlpZighbmFtZSkgcmV0dXJuOworCisJCWlmKHBhY2thZ2UpeworCQkJcmV0dXJuIHRoaXMucmVxdWlyZShwYWNrYWdlICsgIi9tZXRhL2Z1bmN0aW9ucy8iICsgbmFtZSArICIvIiArIGlkICsgIi9tZXRhIik7CisJCX1lbHNleworCQkJdGhpcy5nZXRGdW5jdGlvbk5hbWVzKCk7CisJCX0KKwl9LAorCWdldEZ1bmN0aW9uRG9jdW1lbnRhdGlvbjogZnVuY3Rpb24oLypPYmplY3QqLyBpbnB1dCl7CisJCXZhciBwYWNrYWdlID0gaW5wdXQucGFja2FnZSB8fCAiIjsKKwkJdmFyIG5hbWUgPSBpbnB1dC5uYW1lOworCQl2YXIgaWQgPSBpbnB1dC5pZCB8fCAiXyI7CisJCWRvam8uZGVidWcoImdldEZ1bmN0aW9uRG9jdW1lbnRhdGlvbigpOiAiICsgbmFtZSk7CisJCQorCQlpZighbmFtZSkgcmV0dXJuOworCQkKKwkJaWYocGFja2FnZSl7CisJCQlyZXR1cm4gdGhpcy5yZXF1aXJlKHBhY2thZ2UgKyAiL21ldGEvZnVuY3Rpb25zLyIgKyBuYW1lICsgIi8iICsgaWQgKyAiL2RvY3VtZW50YXRpb24iKTsKKwkJfQorCX0sCisJX29uRG9jU2VhcmNoOiBmdW5jdGlvbigvKk9iamVjdCovIGlucHV0KXsKKwkJdmFyIF90aGlzID0gdGhpczsKKwkJdmFyIG5hbWUgPSBpbnB1dC5uYW1lLnRvTG93ZXJDYXNlKCk7CisJCWlmKCFuYW1lKSByZXR1cm47CisKKwkJdGhpcy5nZXRGdW5jdGlvbk5hbWVzKCkuYWRkQ2FsbGJhY2soZnVuY3Rpb24oZGF0YSl7CisJCQlkb2pvLmRlYnVnKCJfb25Eb2NTZWFyY2goKTogZnVuY3Rpb24gbmFtZXMgbG9hZGVkIGZvciAiICsgbmFtZSk7CisKKwkJCXZhciBvdXRwdXQgPSBbXTsKKwkJCXZhciBsaXN0ID0gW107CisJCQl2YXIgY2xvc3VyZSA9IGZ1bmN0aW9uKHBrZywgZm4pIHsKKwkJCQlyZXR1cm4gZnVuY3Rpb24oZGF0YSl7CisJCQkJCWRvam8uZGVidWcoIl9vbkRvY1NlYXJjaCgpOiBwYWNrYWdlIG1ldGEgbG9hZGVkIGZvcjogIiArIHBrZyk7CisJCQkJCWlmKGRhdGEuZnVuY3Rpb25zKXsKKwkJCQkJCXZhciBmdW5jdGlvbnMgPSBkYXRhLmZ1bmN0aW9uczsKKwkJCQkJCWZvcih2YXIga2V5IGluIGZ1bmN0aW9ucyl7CisJCQkJCQkJaWYoZm4gPT0ga2V5KXsKKwkJCQkJCQkJdmFyIGlkcyA9IGZ1bmN0aW9uc1trZXldOworCQkJCQkJCQlmb3IodmFyIGlkIGluIGlkcyl7CisJCQkJCQkJCQl2YXIgZm5NZXRhID0gaWRzW2lkXTsKKwkJCQkJCQkJCW91dHB1dC5wdXNoKHsKKwkJCQkJCQkJCQlwYWNrYWdlOiBwa2csCisJCQkJCQkJCQkJbmFtZTogZm4sCisJCQkJCQkJCQkJaWQ6IGlkLAorCQkJCQkJCQkJCXN1bW1hcnk6IGZuTWV0YS5zdW1tYXJ5CisJCQkJCQkJCQl9KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gb3V0cHV0OworCQkJCX0KKwkJCX0KKworCQkJcGtnTG9vcDoKKwkJCWZvcih2YXIgcGtnIGluIGRhdGEpeworCQkJCWlmKHBrZy50b0xvd2VyQ2FzZSgpID09IG5hbWUpeworCQkJCQluYW1lID0gcGtnOworCQkJCQlkb2pvLmRlYnVnKCJfb25Eb2NTZWFyY2ggZm91bmQgYSBwYWNrYWdlIik7CisJCQkJCS8vZG9qby5kb2NzLl9vbkRvY1NlbGVjdFBhY2thZ2UoaW5wdXQpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWZvcih2YXIgaSA9IDAsIGZuOyBmbiA9IGRhdGFbcGtnXVtpXTsgaSsrKXsKKwkJCQkJaWYoZm4udG9Mb3dlckNhc2UoKS5pbmRleE9mKG5hbWUpICE9IC0xKXsKKwkJCQkJCWRvam8uZGVidWcoIl9vbkRvY1NlYXJjaCgpOiBTZWFyY2ggbWF0Y2hlZCAiICsgZm4pOworCQkJCQkJdmFyIG1ldGEgPSBfdGhpcy5nZXRQYWNrYWdlTWV0YSh7cGFja2FnZTogcGtnfSk7CisJCQkJCQltZXRhLmFkZENhbGxiYWNrKGNsb3N1cmUocGtnLCBmbikpOworCQkJCQkJbGlzdC5wdXNoKG1ldGEpOworCisJCQkJCQkvLyBCdWlsZCBhIGxpc3Qgb2YgYWxsIHBhY2thZ2VzIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYW5kIHRoZWlyIGxvYWRlZCBzdGF0ZS4KKwkJCQkJCWNvbnRpbnVlIHBrZ0xvb3A7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWxpc3QgPSBuZXcgZG9qby5EZWZlcnJlZExpc3QobGlzdCk7CisJCQlsaXN0LmFkZENhbGxiYWNrKGZ1bmN0aW9uKHJlc3VsdHMpeworCQkJCWRvam8uZGVidWcoIl9vbkRvY1NlYXJjaCgpOiBBbGwgcGFja2FnZXMgbG9hZGVkIik7CisJCQkJX3RoaXMuX3ByaW50RnVuY3Rpb25SZXN1bHRzKHJlc3VsdHNbMF1bMV0pOworCQkJfSk7CisJCX0pOworCX0sCisJX29uRG9jU2VhcmNoRm46IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypBcnJheSovIGRhdGEsIC8qT2JqZWN0Ki8gZXZ0KXsKKwkJZG9qby5kZWJ1ZygiX29uRG9jU2VhcmNoRm4oIiArIGV2dC5uYW1lICsgIikiKTsKKworCQl2YXIgbmFtZSA9IGV2dC5uYW1lIHx8IGV2dC5wa2c7CisKKwkJZG9qby5kZWJ1ZygiX29uRG9jU2VhcmNoRm4gZm91bmQgYSBmdW5jdGlvbiIpOworCisJCWV2dC5wa2dzID0gcGFja2FnZXM7CisJCWV2dC5wa2cgPSBuYW1lOworCQlldnQubG9hZGVkID0gMDsKKwkJZm9yKHZhciBpID0gMCwgcGtnOyBwa2cgPSBwYWNrYWdlc1tpXTsgaSsrKXsKKwkJCWRvam8uZG9jcy5nZXRQa2dNZXRhKGV2dCwgcGtnLCBkb2pvLmRvY3MuX29uRG9jUmVzdWx0cyk7CisJCX0KKwl9LAorCV9vblBrZ1Jlc3VsdHM6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypPYmplY3QqLyBkYXRhLCAvKk9iamVjdCovIGV2dCwgLypPYmplY3QqLyBpbnB1dCl7CisJCWRvam8uZGVidWcoIl9vblBrZ1Jlc3VsdHMoIiArIGV2dC50eXBlICsgIikiKTsKKwkJdmFyIGRlc2NyaXB0aW9uID0gIiI7CisJCXZhciBwYXRoID0gIiI7CisJCXZhciBtZXRob2RzID0ge307CisJCXZhciByZXF1aXJlcyA9IHt9OworCQlpZihpbnB1dCl7CisJCQlpbnB1dFtldnQudHlwZV0gPSBkYXRhOworCQkJaWYoaW5wdXQuZXhwZWN0cyAmJiBpbnB1dC5leHBlY3RzLnBrZ3Jlc3VsdHMpeworCQkJCWZvcih2YXIgaSA9IDAsIGV4cGVjdDsgZXhwZWN0ID0gaW5wdXQuZXhwZWN0cy5wa2dyZXN1bHRzW2ldOyBpKyspeworCQkJCQlpZighKGV4cGVjdCBpbiBpbnB1dCkpeworCQkJCQkJZG9qby5kZWJ1ZygiX29uUGtnUmVzdWx0cygpIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSIpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcGF0aCA9IGlucHV0LnBrZ2RvYy5wYXRoOworCQkJZGVzY3JpcHRpb24gPSBpbnB1dC5wa2dkb2MuZGVzY3JpcHRpb247CisJCQltZXRob2RzID0gaW5wdXQucGtnbWV0YS5tZXRob2RzOworCQkJcmVxdWlyZXMgPSBpbnB1dC5wa2dtZXRhLnJlcXVpcmVzOworCQl9CisJCXZhciBwa2cgPSBldnQubmFtZS5yZXBsYWNlKCJfIiwgIioiKTsKKwkJdmFyIHJlc3VsdHMgPSB7CisJCQlwYXRoOiBwYXRoLAorCQkJZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLAorCQkJc2l6ZTogMCwKKwkJCW1ldGhvZHM6IFtdLAorCQkJcGtnOiBwa2csCisJCQlyZXF1aXJlczogcmVxdWlyZXMKKwkJfQorCQl2YXIgcmVQcml2YXRlID0gL19bXi5dKyQvOworCQlmb3IodmFyIG1ldGhvZCBpbiBtZXRob2RzKXsKKwkJCWlmKCFyZVByaXZhdGUudGVzdChtZXRob2QpKXsKKwkJCQlmb3IodmFyIHBJZCBpbiBtZXRob2RzW21ldGhvZF0peworCQkJCQlyZXN1bHRzLm1ldGhvZHMucHVzaCh7CisJCQkJCQlwa2c6IHBrZywKKwkJCQkJCW5hbWU6IG1ldGhvZCwKKwkJCQkJCWlkOiBwSWQsCisJCQkJCQlzdW1tYXJ5OiBtZXRob2RzW21ldGhvZF1bcElkXS5zdW1tYXJ5CisJCQkJCX0pCisJCQkJfQorCQkJfQorCQl9CisJCXJlc3VsdHMuc2l6ZSA9IHJlc3VsdHMubWV0aG9kcy5sZW5ndGg7CisJCWRvam8uZG9jcy5fcHJpbnRQa2dSZXN1bHQocmVzdWx0cyk7CisJfSwKKwlfb25Eb2NSZXN1bHRzOiBmdW5jdGlvbigvKlN0cmluZyovIHR5cGUsIC8qT2JqZWN0Ki8gZGF0YSwgLypPYmplY3QqLyBldnQsIC8qT2JqZWN0Ki8gaW5wdXQpeworCQlkb2pvLmRlYnVnKCJfb25Eb2NSZXN1bHRzKCIgKyBldnQubmFtZSArICIvIiArIGlucHV0LnBrZyArICIpICIgKyB0eXBlKTsKKwkJKytpbnB1dC5sb2FkZWQ7CisKKwkJaWYoaW5wdXQubG9hZGVkID09IGlucHV0LnBrZ3MubGVuZ3RoKXsKKwkJCXZhciBwa2dzID0gaW5wdXQucGtnczsKKwkJCXZhciBuYW1lID0gaW5wdXQucGtnOworCQkJdmFyIHJlc3VsdHMgPSB7bWV0aG9kczogW119OworCQkJdmFyIHJlUHJpdmF0ZSA9IC9fW14uXSskLzsKKwkJCWRhdGEgPSBkb2pvLmRvY3MuX2NhY2hlOworCisJCQlmb3IodmFyIGkgPSAwLCBwa2c7IHBrZyA9IHBrZ3NbaV07IGkrKyl7CisJCQkJdmFyIG1ldGhvZHMgPSBkb2pvLmRvY3MuX2dldENhY2hlKHBrZywgIm1ldGEiLCAibWV0aG9kcyIpOworCQkJCWZvcih2YXIgZm4gaW4gbWV0aG9kcyl7CisJCQkJCWlmKGZuLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuYW1lKSA9PSAtMSl7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZihmbiAhPSAicmVxdWlyZXMiICYmICFyZVByaXZhdGUudGVzdChmbikpeworCQkJCQkJZm9yKHZhciBwSWQgaW4gbWV0aG9kc1tmbl0peworCQkJCQkJCXZhciByZXN1bHQgPSB7CisJCQkJCQkJCXBrZzogcGtnLAorCQkJCQkJCQluYW1lOiBmbiwKKwkJCQkJCQkJaWQ6ICJfIiwKKwkJCQkJCQkJc3VtbWFyeTogIiIKKwkJCQkJCQl9CisJCQkJCQkJaWYobWV0aG9kc1tmbl1bcElkXS5zdW1tYXJ5KXsKKwkJCQkJCQkJcmVzdWx0LnN1bW1hcnkgPSBtZXRob2RzW2ZuXVtwSWRdLnN1bW1hcnk7CisJCQkJCQkJfQorCQkJCQkJCXJlc3VsdHMubWV0aG9kcy5wdXNoKHJlc3VsdCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWRvam8uZGVidWcoIlB1Ymxpc2hpbmcgZG9jUmVzdWx0cyIpOworCQkJZG9qby5kb2NzLl9wcmludEZuUmVzdWx0cyhyZXN1bHRzKTsKKwkJfQorCX0sCisJX3ByaW50RnVuY3Rpb25SZXN1bHRzOiBmdW5jdGlvbihyZXN1bHRzKXsKKwkJZG9qby5kZWJ1ZygiX3ByaW50Rm5SZXN1bHRzKCk6IGNhbGxlZCIpOworCQkvLyBzdW1tYXJ5OiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCB0aGUgL2RvY3MvZnVuY3Rpb24vcmVzdWx0cyB0b3BpYworCX0sCisJX3ByaW50UGtnUmVzdWx0OiBmdW5jdGlvbihyZXN1bHRzKXsKKwkJZG9qby5kZWJ1ZygiX3ByaW50UGtnUmVzdWx0KCk6IGNhbGxlZCIpOworCX0sCisJX29uRG9jU2VsZWN0RnVuY3Rpb246IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gaW5wdXQpeworCQkvLyBzdW1tYXJ5OiBHZXQgZG9jLCBtZXRhLCBhbmQgc3JjCisJCXZhciBuYW1lID0gaW5wdXQubmFtZTsKKwkJdmFyIHBhY2thZ2UgPSBpbnB1dC5wYWNrYWdlIHx8ICIiOworCQl2YXIgaWQgPSBpbnB1dC5pZCB8fCAiXyI7CisJCWRvam8uZGVidWcoIl9vbkRvY1NlbGVjdEZ1bmN0aW9uKCIgKyBuYW1lICsgIikiKTsKKwkJaWYoIW5hbWUgfHwgIXBhY2thZ2UpIHJldHVybiBmYWxzZTsKKworCQl2YXIgcGtnTWV0YSA9IHRoaXMuZ2V0UGFja2FnZU1ldGEoe3BhY2thZ2U6IHBhY2thZ2V9KTsKKwkJdmFyIG1ldGEgPSB0aGlzLmdldEZ1bmN0aW9uTWV0YSh7cGFja2FnZTogcGFja2FnZSwgbmFtZTogbmFtZSwgaWQ6IGlkfSk7CisJCXZhciBkb2MgPSB0aGlzLmdldEZ1bmN0aW9uRG9jdW1lbnRhdGlvbih7cGFja2FnZTogcGFja2FnZSwgbmFtZTogbmFtZSwgaWQ6IGlkfSk7CisJCQorCQl2YXIgbGlzdCA9IG5ldyBkb2pvLkRlZmVycmVkTGlzdChbcGtnTWV0YSwgbWV0YSwgZG9jXSk7CisJCWxpc3QuYWRkQ2FsbGJhY2soZnVuY3Rpb24ocmVzdWx0cyl7CisJCQlkb2pvLmRlYnVnKCJfb25Eb2NTZWxlY3RGdW5jdGlvbigpIGxvYWRlZCIpOworCQkJZm9yKHZhciBpID0gMCwgcmVzdWx0OyByZXN1bHQgPSByZXN1bHRzW2ldOyBpKyspeworCQkJCWRvam8uZGVidWdTaGFsbG93KHJlc3VsdFsxXSk7CisJCQl9CisJCX0pOworCQkKKwkJcmV0dXJuIGxpc3Q7CisJfSwKKwlfb25Eb2NTZWxlY3RQYWNrYWdlOiBmdW5jdGlvbigvKk9iamVjdCovIGlucHV0KXsKKwkJZG9qby5kZWJ1ZygiX29uRG9jU2VsZWN0UGFja2FnZSgiICsgaW5wdXQubmFtZSArICIpIikKKwkJaW5wdXQuZXhwZWN0cyA9IHsKKwkJCSJwa2dyZXN1bHRzIjogWyJwa2dtZXRhIiwgInBrZ2RvYyJdCisJCX07CisJCWRvam8uZG9jcy5nZXRQa2dNZXRhKGlucHV0LCBpbnB1dC5uYW1lLCBkb2pvLmRvY3MuX29uUGtnUmVzdWx0cyk7CisJCWRvam8uZG9jcy5nZXRQa2dEb2MoaW5wdXQsIGlucHV0Lm5hbWUsIGRvam8uZG9jcy5fb25Qa2dSZXN1bHRzKTsKKwl9LAorCV9vbkRvY1NlbGVjdFJlc3VsdHM6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdHlwZSwgLypPYmplY3QqLyBkYXRhLCAvKk9iamVjdCovIGV2dCwgLypPYmplY3QqLyBpbnB1dCl7CisJCWRvam8uZGVidWcoIl9vbkRvY1NlbGVjdFJlc3VsdHMoIiArIGV2dC50eXBlICsgIiwgIiArIGV2dC5uYW1lICsgIikiKTsKKwkJaWYoZXZ0LnR5cGUgPT0gIm1ldGEiKXsKKwkJCWRvam8uZG9jcy5nZXRQa2dNZXRhKGlucHV0LCBldnQucGtnLCBkb2pvLmRvY3MuX29uRG9jU2VsZWN0UmVzdWx0cyk7CisJCX0KKwkJaWYoaW5wdXQpeworCQkJaW5wdXRbZXZ0LnR5cGVdID0gZGF0YTsKKwkJCWlmKGlucHV0LmV4cGVjdHMgJiYgaW5wdXQuZXhwZWN0cy5kb2NyZXN1bHRzKXsKKwkJCQlmb3IodmFyIGkgPSAwLCBleHBlY3Q7IGV4cGVjdCA9IGlucHV0LmV4cGVjdHMuZG9jcmVzdWx0c1tpXTsgaSsrKXsKKwkJCQkJaWYoIShleHBlY3QgaW4gaW5wdXQpKXsKKwkJCQkJCWRvam8uZGVidWcoIl9vbkRvY1NlbGVjdFJlc3VsdHMoKSB3YWl0aW5nIGZvciBtb3JlIGRhdGEiKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWRvam8uZG9jcy5fcHJpbnRGdW5jdGlvbkRldGFpbChpbnB1dCk7CisJfSwKKwkKKwlfcHJpbnRGdW5jdGlvbkRldGFpbDogZnVuY3Rpb24ocmVzdWx0cykgeworCQkvLyBzdW1tYXJ5OiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCB0aGUgL2RvY3MvZnVuY3Rpb24vZGV0YWlsIHRvcGljIGV2ZW50CisJfSwKKworCXNlbGVjdEZ1bmN0aW9uOiBmdW5jdGlvbigvKlN0cmluZyovIG5hbWUsIC8qU3RyaW5nPyovIGlkKXsKKwkJLy8gc3VtbWFyeTogVGhlIGNvbWJpbmVkIGluZm9ybWF0aW9uCisJfSwKKwlzYXZlUGFja2FnZTogZnVuY3Rpb24oLypPYmplY3QqLyBjYWxsYmFja09iamVjdCwgLypTdHJpbmcqLyBjYWxsYmFjaywgLypPYmplY3QqLyBwYXJhbWV0ZXJzKXsKKwkJZG9qby5ldmVudC5rd0Nvbm5lY3QoeworCQkJc3JjT2JqOiBkb2pvLmRvY3MsCisJCQlzcmNGdW5jOiAiX3NhdmVkUGtnUnBjIiwKKwkJCXRhcmdldE9iajogY2FsbGJhY2tPYmplY3QsCisJCQl0YXJnZXRGdW5jOiBjYWxsYmFjaywKKwkJCW9uY2U6IHRydWUKKwkJfSk7CisJCQorCQl2YXIgcHJvcHMgPSB7fTsKKwkJdmFyIGNhY2hlID0gZG9qby5kb2NzLl9nZXRDYWNoZShwYXJhbWV0ZXJzLnBrZywgIm1ldGEiKTsKKworCQl2YXIgaSA9IDE7CisKKwkJaWYoIWNhY2hlLnBhdGgpeworCQkJdmFyIHBhdGggPSAiaWQiOworCQkJcHJvcHNbWyJwbmFtZSIsIGldLmpvaW4oIiIpXSA9ICJEb2NQa2dGb3JtL3JlcXVpcmUiOworCQkJcHJvcHNbWyJwdmFsdWUiLCBpKytdLmpvaW4oIiIpXSA9IHBhcmFtZXRlcnMucGtnOworCQl9ZWxzZXsKKwkJCXZhciBwYXRoID0gY2FjaGUucGF0aDsKKwkJfQorCisJCXByb3BzLmZvcm0gPSAiLy9Eb2NQa2dGb3JtIjsKKwkJcHJvcHMucGF0aCA9IFsiL1dpa2lIb21lL0Rvam9Eb3REb2MvIiwgcGF0aF0uam9pbigiIik7CisKKwkJaWYocGFyYW1ldGVycy5kZXNjcmlwdGlvbil7CisJCQlwcm9wc1tbInBuYW1lIiwgaV0uam9pbigiIildID0gIm1haW4vdGV4dCI7CisJCQlwcm9wc1tbInB2YWx1ZSIsIGkrK10uam9pbigiIildID0gcGFyYW1ldGVycy5kZXNjcmlwdGlvbjsKKwkJfQorCQkKKwkJZG9qby5kb2NzLl9ycGMuY2FsbFJlbW90ZSgic2F2ZUZvcm0iLAlwcm9wcykuYWRkQ2FsbGJhY2tzKGRvam8uZG9jcy5fcGtnUnBjLCBkb2pvLmRvY3MuX3BrZ1JwYyk7CisJfSwKKwlfcGtnUnBjOiBmdW5jdGlvbihkYXRhKXsKKwkJaWYoZGF0YS5uYW1lKXsKKwkJCWRvam8uZG9jcy5fZ2V0Q2FjaGUoZGF0YVsiRG9jUGtnRm9ybS9yZXF1aXJlIl0sICJtZXRhIikucGF0aCA9IGRhdGEubmFtZTsKKwkJCWRvam8uZG9jcy5fc2F2ZWRQa2dScGMoImxvYWQiKTsKKwkJfWVsc2V7CisJCQlkb2pvLmRvY3MuX3NhdmVkUGtnUnBjKCJlcnJvciIpOworCQl9CisJfSwKKwlfc2F2ZWRQa2dScGM6IGZ1bmN0aW9uKHR5cGUpeworCX0sCisJZnVuY3Rpb25QYWNrYWdlczogZnVuY3Rpb24oLypTdHJpbmcqLyBuYW1lLCAvKkZ1bmN0aW9uKi8gY2FsbGJhY2ssIC8qT2JqZWN0Ki8gaW5wdXQpeworCQkvLyBzdW1tYXJ5OiBHZXRzIHRoZSBwYWNrYWdlIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bmN0aW9uIGFuZCBzdG9yZXMgaXQgaW4gdGhlIC5wa2cgdmFsdWUgb2YgaW5wdXQKKwkJZG9qby5kZWJ1ZygiZnVuY3Rpb25QYWNrYWdlcygpIG5hbWU6ICIgKyBuYW1lKTsKKworCQlpZighaW5wdXQpeworCQkJaW5wdXQgPSB7fTsKKwkJfQorCQlpZighaW5wdXQuY2FsbGJhY2tzKXsKKwkJCWlucHV0LmNhbGxiYWNrcyA9IFtdOworCQl9CisKKwkJaW5wdXQudHlwZSA9ICJmdW5jdGlvbl9uYW1lcyI7CisJCWlucHV0Lm5hbWUgPSBuYW1lOworCQlpbnB1dC5jYWxsYmFja3MudW5zaGlmdChjYWxsYmFjayk7CisJCWlucHV0LmNhbGxiYWNrcy51bnNoaWZ0KGRvam8uZG9jcy5fZnVuY3Rpb25QYWNrYWdlcyk7CisJfSwKKwlfZnVuY3Rpb25QYWNrYWdlczogZnVuY3Rpb24oLypTdHJpbmcqLyB0eXBlLCAvKkFycmF5Ki8gZGF0YSwgLypPYmplY3QqLyBldnQpeworCQlkb2pvLmRlYnVnKCJfZnVuY3Rpb25QYWNrYWdlcygpIG5hbWU6ICIgKyBldnQubmFtZSk7CisJCWV2dC5wa2cgPSAnJzsKKworCQl2YXIgcmVzdWx0cyA9IFtdOworCQl2YXIgZGF0YSA9IGRvam8uZG9jcy5fY2FjaGVbJ2Z1bmN0aW9uX25hbWVzJ107CisJCWZvcih2YXIga2V5IGluIGRhdGEpeworCQkJaWYoZG9qby5sYW5nLmluQXJyYXkoZGF0YVtrZXldLCBldnQubmFtZSkpeworCQkJCWRvam8uZGVidWcoIl9mdW5jdGlvblBhY2thZ2VzKCkgcGFja2FnZTogIiArIGtleSk7CisJCQkJcmVzdWx0cy5wdXNoKGtleSk7CisJCQl9CisJCX0KKworCQlpZihldnQuY2FsbGJhY2tzICYmIGV2dC5jYWxsYmFja3MubGVuZ3RoKXsKKwkJCWV2dC5jYWxsYmFja3Muc2hpZnQoKSh0eXBlLCByZXN1bHRzLCBldnQsIGV2dC5pbnB1dCk7CisJCX0KKwl9LAorCXNldFVzZXJOYW1lOiBmdW5jdGlvbigvKlN0cmluZyovIG5hbWUpeworCQlkb2pvLmRvY3MuX3VzZXJOYW1lID0gbmFtZTsKKwkJaWYobmFtZSAmJiBkb2pvLmRvY3MuX3Bhc3N3b3JkKXsKKwkJCWRvam8uZG9jcy5fbG9nSW4oKTsKKwkJfQorCX0sCisJc2V0UGFzc3dvcmQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gcGFzc3dvcmQpeworCQlkb2pvLmRvY3MuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7CisJCWlmKHBhc3N3b3JkICYmIGRvam8uZG9jcy5fdXNlck5hbWUpeworCQkJZG9qby5kb2NzLl9sb2dJbigpOworCQl9CisJfSwKKwlfbG9nSW46IGZ1bmN0aW9uKCl7CisJCWRvam8uaW8uYmluZCh7CisJCQl1cmw6IGRvam8uZG9jcy5fcnBjLnNlcnZpY2VVcmwudG9TdHJpbmcoKSwKKwkJCW1ldGhvZDogInBvc3QiLAorCQkJbWltZXR5cGU6ICJ0ZXh0L2pzb24iLAorCQkJY29udGVudDogeworCQkJCXVzZXJuYW1lOiBkb2pvLmRvY3MuX3VzZXJOYW1lLAorCQkJCXBhc3N3b3JkOiBkb2pvLmRvY3MuX3Bhc3N3b3JkCisJCQl9LAorCQkJbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSl7CisJCQkJaWYoZGF0YS5lcnJvcil7CisJCQkJCWRvam8uZG9jcy5sb2dJblN1Y2Nlc3MoKTsKKwkJCQl9ZWxzZXsKKwkJCQkJZG9qby5kb2NzLmxvZ0luRmFpbHVyZSgpOworCQkJCX0KKwkJCX0sCisJCQllcnJvcjogZnVuY3Rpb24oKXsKKwkJCQlkb2pvLmRvY3MubG9nSW5GYWlsdXJlKCk7CisJCQl9CisJCX0pOworCX0sCisJbG9nSW5TdWNjZXNzOiBmdW5jdGlvbigpe30sCisJbG9nSW5GYWlsdXJlOiBmdW5jdGlvbigpe30sCisJX3NldDogZnVuY3Rpb24oLypPYmplY3QqLyBiYXNlLCAvKlN0cmluZy4uLiovIGtleXMsIC8qU3RyaW5nKi8gdmFsdWUpeworCQl2YXIgYXJncyA9IFtdOworCQlmb3IodmFyIGkgPSAwLCBhcmc7IGFyZyA9IGFyZ3VtZW50c1tpXTsgaSsrKXsKKwkJCWFyZ3MucHVzaChhcmcpOworCQl9CisKKwkJaWYoYXJncy5sZW5ndGggPCAzKSByZXR1cm47CisJCWJhc2UgPSBhcmdzLnNoaWZ0KCk7CisJCXZhbHVlID0gYXJncy5wb3AoKTsKKwkJdmFyIGtleSA9IGFyZ3MucG9wKCk7CisJCWZvcih2YXIgaSA9IDAsIGFyZzsgYXJnID0gYXJnc1tpXTsgaSsrKXsKKwkJCWlmKHR5cGVvZiBiYXNlW2FyZ10gIT0gIm9iamVjdCIpeworCQkJCWJhc2VbYXJnXSA9IHt9OworCQkJfQorCQkJYmFzZSA9IGJhc2VbYXJnXTsKKwkJfQorCQliYXNlW2tleV0gPSB2YWx1ZTsKKwl9LAorCV9nZXRDYWNoZTogZnVuY3Rpb24oLypTdHJpbmcuLi4qLyBrZXlzKXsKKwkJdmFyIG9iaiA9IGRvam8uZG9jcy5fY2FjaGU7CisJCWZvcih2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspeworCQkJdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKKwkJCWlmKCFvYmpbYXJnXSl7CisJCQkJb2JqW2FyZ10gPSB7fTsKKwkJCX0KKwkJCW9iaiA9IG9ialthcmddOworCQl9CisJCXJldHVybiBvYmo7CisJfQorfSk7CisKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvZG9jcy9zZWFyY2giLCBkb2pvLmRvY3MsICJfb25Eb2NTZWFyY2giKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCIvZG9jcy9mdW5jdGlvbi9zZWxlY3QiLCBkb2pvLmRvY3MsICJfb25Eb2NTZWxlY3RGdW5jdGlvbiIpOworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoIi9kb2NzL3BhY2thZ2Uvc2VsZWN0IiwgZG9qby5kb2NzLCAiX29uRG9jU2VsZWN0UGFja2FnZSIpOworCitkb2pvLmV2ZW50LnRvcGljLnJlZ2lzdGVyUHVibGlzaGVyKCIvZG9jcy9mdW5jdGlvbi9yZXN1bHRzIiwgZG9qby5kb2NzLCAiX3ByaW50RnVuY3Rpb25SZXN1bHRzIik7Citkb2pvLmV2ZW50LnRvcGljLnJlZ2lzdGVyUHVibGlzaGVyKCIvZG9jcy9mdW5jdGlvbi9kZXRhaWwiLCBkb2pvLmRvY3MsICJfcHJpbnRGdW5jdGlvbkRldGFpbCIpOworZG9qby5ldmVudC50b3BpYy5yZWdpc3RlclB1Ymxpc2hlcigiL2RvY3MvcGFja2FnZS9kZXRhaWwiLCBkb2pvLmRvY3MsICJfcHJpbnRQa2dSZXN1bHQiKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9kb20uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG9tLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTc5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZG9tLmpzCkBAIC0wLDAgKzEsMzgxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRvbSIpOworZG9qby5kb20uRUxFTUVOVF9OT0RFID0gMTsKK2Rvam8uZG9tLkFUVFJJQlVURV9OT0RFID0gMjsKK2Rvam8uZG9tLlRFWFRfTk9ERSA9IDM7Citkb2pvLmRvbS5DREFUQV9TRUNUSU9OX05PREUgPSA0OworZG9qby5kb20uRU5USVRZX1JFRkVSRU5DRV9OT0RFID0gNTsKK2Rvam8uZG9tLkVOVElUWV9OT0RFID0gNjsKK2Rvam8uZG9tLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IDc7Citkb2pvLmRvbS5DT01NRU5UX05PREUgPSA4OworZG9qby5kb20uRE9DVU1FTlRfTk9ERSA9IDk7Citkb2pvLmRvbS5ET0NVTUVOVF9UWVBFX05PREUgPSAxMDsKK2Rvam8uZG9tLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTsKK2Rvam8uZG9tLk5PVEFUSU9OX05PREUgPSAxMjsKK2Rvam8uZG9tLmRvam9tbCA9ICJodHRwOi8vd3d3LmRvam90b29sa2l0Lm9yZy8yMDA0L2Rvam9tbCI7Citkb2pvLmRvbS54bWxucyA9IHtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgc21pbDoiaHR0cDovL3d3dy53My5vcmcvMjAwMS9TTUlMMjAvIiwgbW1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIiwgY21sOiJodHRwOi8vd3d3LnhtbC1jbWwub3JnIiwgeGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCB4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsIHh1bDoiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCIsIHhibDoiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy94YmwiLCBmbzoiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IiwgeHNsOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLCB4c2x0OiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLCB4aToiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIsIHhmb3JtczoiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wMS94Zm9ybXMiLCBzYXhvbjoiaHR0cDovL2ljbC5jb20vc2F4b24iLCB4YWxhbjoiaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiLCB4c2Q6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgZHQ6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIsIHhzaToiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCByZGY6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiLCByZGZzOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiwgZGM6Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiwgZGNxOiJodHRwOi8vcHVybC5vcmcvZGMvcXVhbGlmaWVycy8xLjAiLCAic29hcC1lbnYiOiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsIHdzZGw6Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgQWRvYmVFeHRlbnNpb25zOiJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlU1ZHVmlld2VyRXh0ZW5zaW9ucy8zLjAvIn07Citkb2pvLmRvbS5pc05vZGUgPSBmdW5jdGlvbiAod2gpIHsKKwlpZiAodHlwZW9mIEVsZW1lbnQgPT0gImZ1bmN0aW9uIikgeworCQl0cnkgeworCQkJcmV0dXJuIHdoIGluc3RhbmNlb2YgRWxlbWVudDsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHdoICYmICFpc05hTih3aC5ub2RlVHlwZSk7CisJfQorfTsKK2Rvam8uZG9tLmdldFVuaXF1ZUlkID0gZnVuY3Rpb24gKCkgeworCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCWRvIHsKKwkJdmFyIGlkID0gImRqX3VuaXF1ZV8iICsgKCsrYXJndW1lbnRzLmNhbGxlZS5faWRJbmNyZW1lbnQpOworCX0gd2hpbGUgKF9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpOworCXJldHVybiBpZDsKK307Citkb2pvLmRvbS5nZXRVbmlxdWVJZC5faWRJbmNyZW1lbnQgPSAwOworZG9qby5kb20uZmlyc3RFbGVtZW50ID0gZG9qby5kb20uZ2V0Rmlyc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgdGFnTmFtZSkgeworCXZhciBub2RlID0gcGFyZW50Tm9kZS5maXJzdENoaWxkOworCXdoaWxlIChub2RlICYmIG5vZGUubm9kZVR5cGUgIT0gZG9qby5kb20uRUxFTUVOVF9OT0RFKSB7CisJCW5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworCX0KKwlpZiAodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLm5leHRFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5sYXN0RWxlbWVudCA9IGRvam8uZG9tLmdldExhc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgdGFnTmFtZSkgeworCXZhciBub2RlID0gcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7CisJd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpIHsKKwkJbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOworCX0KKwlpZiAodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLnByZXZFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5uZXh0RWxlbWVudCA9IGRvam8uZG9tLmdldE5leHRTaWJsaW5nRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlLCB0YWdOYW1lKSB7CisJaWYgKCFub2RlKSB7CisJCXJldHVybiBudWxsOworCX0KKwlkbyB7CisJCW5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworCX0gd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpOworCWlmIChub2RlICYmIHRhZ05hbWUgJiYgdGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJCXJldHVybiBkb2pvLmRvbS5uZXh0RWxlbWVudChub2RlLCB0YWdOYW1lKTsKKwl9CisJcmV0dXJuIG5vZGU7Cit9OworZG9qby5kb20ucHJldkVsZW1lbnQgPSBkb2pvLmRvbS5nZXRQcmV2aW91c1NpYmxpbmdFbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRhZ05hbWUpIHsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmICh0YWdOYW1lKSB7CisJCXRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJfQorCWRvIHsKKwkJbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOworCX0gd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpOworCWlmIChub2RlICYmIHRhZ05hbWUgJiYgdGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJCXJldHVybiBkb2pvLmRvbS5wcmV2RWxlbWVudChub2RlLCB0YWdOYW1lKTsKKwl9CisJcmV0dXJuIG5vZGU7Cit9OworZG9qby5kb20ubW92ZUNoaWxkcmVuID0gZnVuY3Rpb24gKHNyY05vZGUsIGRlc3ROb2RlLCB0cmltKSB7CisJdmFyIGNvdW50ID0gMDsKKwlpZiAodHJpbSkgeworCQl3aGlsZSAoc3JjTm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgc3JjTm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IGRvam8uZG9tLlRFWFRfTk9ERSkgeworCQkJc3JjTm9kZS5yZW1vdmVDaGlsZChzcmNOb2RlLmZpcnN0Q2hpbGQpOworCQl9CisJCXdoaWxlIChzcmNOb2RlLmhhc0NoaWxkTm9kZXMoKSAmJiBzcmNOb2RlLmxhc3RDaGlsZC5ub2RlVHlwZSA9PSBkb2pvLmRvbS5URVhUX05PREUpIHsKKwkJCXNyY05vZGUucmVtb3ZlQ2hpbGQoc3JjTm9kZS5sYXN0Q2hpbGQpOworCQl9CisJfQorCXdoaWxlIChzcmNOb2RlLmhhc0NoaWxkTm9kZXMoKSkgeworCQlkZXN0Tm9kZS5hcHBlbmRDaGlsZChzcmNOb2RlLmZpcnN0Q2hpbGQpOworCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9OworZG9qby5kb20uY29weUNoaWxkcmVuID0gZnVuY3Rpb24gKHNyY05vZGUsIGRlc3ROb2RlLCB0cmltKSB7CisJdmFyIGNsb25lZE5vZGUgPSBzcmNOb2RlLmNsb25lTm9kZSh0cnVlKTsKKwlyZXR1cm4gdGhpcy5tb3ZlQ2hpbGRyZW4oY2xvbmVkTm9kZSwgZGVzdE5vZGUsIHRyaW0pOworfTsKK2Rvam8uZG9tLnJlcGxhY2VDaGlsZHJlbiA9IGZ1bmN0aW9uIChub2RlLCBuZXdDaGlsZCkgeworCXZhciBub2RlcyA9IFtdOworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCQlub2Rlcy5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7CisJCX0KKwl9CisJZG9qby5kb20ucmVtb3ZlQ2hpbGRyZW4obm9kZSk7CisJbm9kZS5hcHBlbmRDaGlsZChuZXdDaGlsZCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQlkb2pvLmRvbS5kZXN0cm95Tm9kZShub2Rlc1tpXSk7CisJfQorfTsKK2Rvam8uZG9tLnJlbW92ZUNoaWxkcmVuID0gZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgY291bnQgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOworCXdoaWxlIChub2RlLmhhc0NoaWxkTm9kZXMoKSkgeworCQlkb2pvLmRvbS5yZW1vdmVOb2RlKG5vZGUuZmlyc3RDaGlsZCk7CisJfQorCXJldHVybiBjb3VudDsKK307Citkb2pvLmRvbS5yZXBsYWNlTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBuZXdOb2RlKSB7CisJcmV0dXJuIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgbm9kZSk7Cit9OworZG9qby5kb20uZGVzdHJveU5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlLnBhcmVudE5vZGUpIHsKKwkJbm9kZSA9IGRvam8uZG9tLnJlbW92ZU5vZGUobm9kZSk7CisJfQorCWlmIChub2RlLm5vZGVUeXBlICE9IDMpIHsKKwkJaWYgKGRvam8uZXZhbE9ialBhdGgoImRvam8uZXZlbnQuYnJvd3Nlci5jbGVhbiIsIGZhbHNlKSkgeworCQkJZG9qby5ldmVudC5icm93c2VyLmNsZWFuKG5vZGUpOworCQl9CisJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlub2RlLm91dGVySFRNTCA9ICIiOworCQl9CisJfQorfTsKK2Rvam8uZG9tLnJlbW92ZU5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlICYmIG5vZGUucGFyZW50Tm9kZSkgeworCQlyZXR1cm4gbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOworCX0KK307Citkb2pvLmRvbS5nZXRBbmNlc3RvcnMgPSBmdW5jdGlvbiAobm9kZSwgZmlsdGVyRnVuY3Rpb24sIHJldHVybkZpcnN0SGl0KSB7CisJdmFyIGFuY2VzdG9ycyA9IFtdOworCXZhciBpc0Z1bmN0aW9uID0gKGZpbHRlckZ1bmN0aW9uICYmIChmaWx0ZXJGdW5jdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHR5cGVvZiBmaWx0ZXJGdW5jdGlvbiA9PSAiZnVuY3Rpb24iKSk7CisJd2hpbGUgKG5vZGUpIHsKKwkJaWYgKCFpc0Z1bmN0aW9uIHx8IGZpbHRlckZ1bmN0aW9uKG5vZGUpKSB7CisJCQlhbmNlc3RvcnMucHVzaChub2RlKTsKKwkJfQorCQlpZiAocmV0dXJuRmlyc3RIaXQgJiYgYW5jZXN0b3JzLmxlbmd0aCA+IDApIHsKKwkJCXJldHVybiBhbmNlc3RvcnNbMF07CisJCX0KKwkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwl9CisJaWYgKHJldHVybkZpcnN0SGl0KSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gYW5jZXN0b3JzOworfTsKK2Rvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnID0gZnVuY3Rpb24gKG5vZGUsIHRhZywgcmV0dXJuRmlyc3RIaXQpIHsKKwl0YWcgPSB0YWcudG9Mb3dlckNhc2UoKTsKKwlyZXR1cm4gZG9qby5kb20uZ2V0QW5jZXN0b3JzKG5vZGUsIGZ1bmN0aW9uIChlbCkgeworCQlyZXR1cm4gKChlbC50YWdOYW1lKSAmJiAoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZykpOworCX0sIHJldHVybkZpcnN0SGl0KTsKK307Citkb2pvLmRvbS5nZXRGaXJzdEFuY2VzdG9yQnlUYWcgPSBmdW5jdGlvbiAobm9kZSwgdGFnKSB7CisJcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnKG5vZGUsIHRhZywgdHJ1ZSk7Cit9OworZG9qby5kb20uaXNEZXNjZW5kYW50T2YgPSBmdW5jdGlvbiAobm9kZSwgYW5jZXN0b3IsIGd1YXJhbnRlZURlc2NlbmRhbnQpIHsKKwlpZiAoZ3VhcmFudGVlRGVzY2VuZGFudCAmJiBub2RlKSB7CisJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJfQorCXdoaWxlIChub2RlKSB7CisJCWlmIChub2RlID09IGFuY2VzdG9yKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9OworZG9qby5kb20uaW5uZXJYTUwgPSBmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlLmlubmVyWE1MKSB7CisJCXJldHVybiBub2RlLmlubmVyWE1MOworCX0gZWxzZSB7CisJCWlmIChub2RlLnhtbCkgeworCQkJcmV0dXJuIG5vZGUueG1sOworCQl9IGVsc2UgeworCQkJaWYgKHR5cGVvZiBYTUxTZXJpYWxpemVyICE9ICJ1bmRlZmluZWQiKSB7CisJCQkJcmV0dXJuIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTsKKwkJCX0KKwkJfQorCX0KK307Citkb2pvLmRvbS5jcmVhdGVEb2N1bWVudCA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgZG9jID0gbnVsbDsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwlpZiAoIWRqX3VuZGVmKCJBY3RpdmVYT2JqZWN0IikpIHsKKwkJdmFyIHByZWZpeGVzID0gWyJNU1hNTDIiLCAiTWljcm9zb2Z0IiwgIk1TWE1MIiwgIk1TWE1MMyJdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KHByZWZpeGVzW2ldICsgIi5YTUxET00iKTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCQlpZiAoZG9jKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbikgJiYgKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCkpIHsKKwkJCWRvYyA9IF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgIiIsIG51bGwpOworCQl9CisJfQorCXJldHVybiBkb2M7Cit9OworZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dCA9IGZ1bmN0aW9uIChzdHIsIG1pbWV0eXBlKSB7CisJaWYgKCFtaW1ldHlwZSkgeworCQltaW1ldHlwZSA9ICJ0ZXh0L3htbCI7CisJfQorCWlmICghZGpfdW5kZWYoIkRPTVBhcnNlciIpKSB7CisJCXZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CisJCXJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0ciwgbWltZXR5cGUpOworCX0gZWxzZSB7CisJCWlmICghZGpfdW5kZWYoIkFjdGl2ZVhPYmplY3QiKSkgeworCQkJdmFyIGRvbURvYyA9IGRvam8uZG9tLmNyZWF0ZURvY3VtZW50KCk7CisJCQlpZiAoZG9tRG9jKSB7CisJCQkJZG9tRG9jLmFzeW5jID0gZmFsc2U7CisJCQkJZG9tRG9jLmxvYWRYTUwoc3RyKTsKKwkJCQlyZXR1cm4gZG9tRG9jOworCQkJfSBlbHNlIHsKKwkJCQlkb2pvLmRlYnVnKCJ0b1htbCBkaWRuJ3Qgd29yaz8iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCQkJaWYgKF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7CisJCQkJdmFyIHRtcCA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ4bWwiKTsKKwkJCQl0bXAuaW5uZXJIVE1MID0gc3RyOworCQkJCWlmIChfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gJiYgX2RvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KSB7CisJCQkJCXZhciB4bWxEb2MgPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoImZvbyIsICIiLCBudWxsKTsKKwkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0bXAuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJeG1sRG9jLmltcG9ydE5vZGUodG1wLmNoaWxkTm9kZXMuaXRlbShpKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHhtbERvYzsKKwkJCQl9CisJCQkJcmV0dXJuICgodG1wLmRvY3VtZW50KSAmJiAodG1wLmRvY3VtZW50LmZpcnN0Q2hpbGQgPyB0bXAuZG9jdW1lbnQuZmlyc3RDaGlsZCA6IHRtcCkpOworCQkJfQorCQl9CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8uZG9tLnByZXBlbmRDaGlsZCA9IGZ1bmN0aW9uIChub2RlLCBwYXJlbnQpIHsKKwlpZiAocGFyZW50LmZpcnN0Q2hpbGQpIHsKKwkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBwYXJlbnQuZmlyc3RDaGlsZCk7CisJfSBlbHNlIHsKKwkJcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLmRvbS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAobm9kZSwgcmVmLCBmb3JjZSkgeworCWlmICgoZm9yY2UgIT0gdHJ1ZSkgJiYgKG5vZGUgPT09IHJlZiB8fCBub2RlLm5leHRTaWJsaW5nID09PSByZWYpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIHBhcmVudCA9IHJlZi5wYXJlbnROb2RlOworCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmKTsKKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLmRvbS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChub2RlLCByZWYsIGZvcmNlKSB7CisJdmFyIHBuID0gcmVmLnBhcmVudE5vZGU7CisJaWYgKHJlZiA9PSBwbi5sYXN0Q2hpbGQpIHsKKwkJaWYgKChmb3JjZSAhPSB0cnVlKSAmJiAobm9kZSA9PT0gcmVmKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXBuLmFwcGVuZENoaWxkKG5vZGUpOworCX0gZWxzZSB7CisJCXJldHVybiB0aGlzLmluc2VydEJlZm9yZShub2RlLCByZWYubmV4dFNpYmxpbmcsIGZvcmNlKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5kb20uaW5zZXJ0QXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChub2RlLCByZWYsIHBvc2l0aW9uKSB7CisJaWYgKCghbm9kZSkgfHwgKCFyZWYpIHx8ICghcG9zaXRpb24pKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJc3dpdGNoIChwb3NpdGlvbi50b0xvd2VyQ2FzZSgpKSB7CisJICBjYXNlICJiZWZvcmUiOgorCQlyZXR1cm4gZG9qby5kb20uaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZik7CisJICBjYXNlICJhZnRlciI6CisJCXJldHVybiBkb2pvLmRvbS5pbnNlcnRBZnRlcihub2RlLCByZWYpOworCSAgY2FzZSAiZmlyc3QiOgorCQlpZiAocmVmLmZpcnN0Q2hpbGQpIHsKKwkJCXJldHVybiBkb2pvLmRvbS5pbnNlcnRCZWZvcmUobm9kZSwgcmVmLmZpcnN0Q2hpbGQpOworCQl9IGVsc2UgeworCQkJcmVmLmFwcGVuZENoaWxkKG5vZGUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlyZWYuYXBwZW5kQ2hpbGQobm9kZSk7CisJCXJldHVybiB0cnVlOworCX0KK307Citkb2pvLmRvbS5pbnNlcnRBdEluZGV4ID0gZnVuY3Rpb24gKG5vZGUsIGNvbnRhaW5pbmdOb2RlLCBpbnNlcnRpb25JbmRleCkgeworCXZhciBzaWJsaW5nTm9kZXMgPSBjb250YWluaW5nTm9kZS5jaGlsZE5vZGVzOworCWlmICghc2libGluZ05vZGVzLmxlbmd0aCB8fCBzaWJsaW5nTm9kZXMubGVuZ3RoID09IGluc2VydGlvbkluZGV4KSB7CisJCWNvbnRhaW5pbmdOb2RlLmFwcGVuZENoaWxkKG5vZGUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGluc2VydGlvbkluZGV4ID09IDApIHsKKwkJcmV0dXJuIGRvam8uZG9tLnByZXBlbmRDaGlsZChub2RlLCBjb250YWluaW5nTm9kZSk7CisJfQorCXJldHVybiBkb2pvLmRvbS5pbnNlcnRBZnRlcihub2RlLCBzaWJsaW5nTm9kZXNbaW5zZXJ0aW9uSW5kZXggLSAxXSk7Cit9OworZG9qby5kb20udGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkgeworCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJZG9qby5kb20ucmVwbGFjZUNoaWxkcmVuKG5vZGUsIF9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CisJCXJldHVybiB0ZXh0OworCX0gZWxzZSB7CisJCWlmIChub2RlLnRleHRDb250ZW50ICE9IHVuZGVmaW5lZCkgeworCQkJcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ7CisJCX0KKwkJdmFyIF9yZXN1bHQgPSAiIjsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIF9yZXN1bHQ7CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCXN3aXRjaCAobm9kZS5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlKSB7CisJCQkgIGNhc2UgMToKKwkJCSAgY2FzZSA1OgorCQkJCV9yZXN1bHQgKz0gZG9qby5kb20udGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAzOgorCQkJICBjYXNlIDI6CisJCQkgIGNhc2UgNDoKKwkJCQlfcmVzdWx0ICs9IG5vZGUuY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIF9yZXN1bHQ7CisJfQorfTsKK2Rvam8uZG9tLmhhc1BhcmVudCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIEJvb2xlYW4obm9kZSAmJiBub2RlLnBhcmVudE5vZGUgJiYgZG9qby5kb20uaXNOb2RlKG5vZGUucGFyZW50Tm9kZSkpOworfTsKK2Rvam8uZG9tLmlzVGFnID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChub2RlLnRhZ05hbWUgPT0gU3RyaW5nKGFyZ3VtZW50c1tpXSkpIHsKKwkJCQlyZXR1cm4gU3RyaW5nKGFyZ3VtZW50c1tpXSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICIiOworfTsKK2Rvam8uZG9tLnNldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW0sIG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkgeworCWlmIChlbGVtID09IG51bGwgfHwgKChlbGVtID09IHVuZGVmaW5lZCkgJiYgKHR5cGVvZiBlbGVtID09ICJ1bmRlZmluZWQiKSkpIHsKKwkJZG9qby5yYWlzZSgiTm8gZWxlbWVudCBnaXZlbiB0byBkb2pvLmRvbS5zZXRBdHRyaWJ1dGVOUyIpOworCX0KKwlpZiAoISgoZWxlbS5zZXRBdHRyaWJ1dGVOUyA9PSB1bmRlZmluZWQpICYmICh0eXBlb2YgZWxlbS5zZXRBdHRyaWJ1dGVOUyA9PSAidW5kZWZpbmVkIikpKSB7CisJCWVsZW0uc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTsKKwl9IGVsc2UgeworCQl2YXIgb3duZXJEb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7CisJCXZhciBhdHRyaWJ1dGUgPSBvd25lckRvYy5jcmVhdGVOb2RlKDIsIGF0dHJOYW1lLCBuYW1lc3BhY2VVUkkpOworCQlhdHRyaWJ1dGUubm9kZVZhbHVlID0gYXR0clZhbHVlOworCQllbGVtLnNldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKwl9Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZXZlbnQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZTM0NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ldmVudC5qcwpAQCAtMCwwICsxLDE2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmV2ZW50Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmV2ZW50IiwgInJlcGxhY2VkIGJ5IGRvam8uZXZlbnQuKiIsICIwLjUiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWRkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZXZlbnQvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8uZXZlbnQuY29tbW9uIiwgImRvam8uZXZlbnQudG9waWMiXSwgYnJvd3NlcjpbImRvam8uZXZlbnQuYnJvd3NlciJdLCBkYXNoYm9hcmQ6WyJkb2pvLmV2ZW50LmJyb3dzZXIiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmV2ZW50LioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L2Jyb3dzZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZXZlbnQvYnJvd3Nlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGFiNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L2Jyb3dzZXIuanMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuYnJvd3NlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LmNvbW1vbiIpOworZG9qby5faWVfY2xvYmJlciA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5jbG9iYmVyTm9kZXMgPSBbXTsKKwlmdW5jdGlvbiBudWtlUHJvcChub2RlLCBwcm9wKSB7CisJCXRyeSB7CisJCQlub2RlW3Byb3BdID0gbnVsbDsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJCXRyeSB7CisJCQlkZWxldGUgbm9kZVtwcm9wXTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJCXRyeSB7CisJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfQorCXRoaXMuY2xvYmJlciA9IGZ1bmN0aW9uIChub2RlUmVmKSB7CisJCXZhciBuYTsKKwkJdmFyIHRuYTsKKwkJaWYgKG5vZGVSZWYpIHsKKwkJCXRuYSA9IG5vZGVSZWYuYWxsIHx8IG5vZGVSZWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJCW5hID0gW25vZGVSZWZdOworCQkJZm9yICh2YXIgeCA9IDA7IHggPCB0bmEubGVuZ3RoOyB4KyspIHsKKwkJCQlpZiAodG5hW3hdWyJfX2RvQ2xvYmJlcl9fIl0pIHsKKwkJCQkJbmEucHVzaCh0bmFbeF0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJd2luZG93Lm9ubG9hZCA9IG51bGw7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJfQorCQkJbmEgPSAodGhpcy5jbG9iYmVyTm9kZXMubGVuZ3RoKSA/IHRoaXMuY2xvYmJlck5vZGVzIDogZG9jdW1lbnQuYWxsOworCQl9CisJCXRuYSA9IG51bGw7CisJCXZhciBiYXNpcyA9IHt9OworCQlmb3IgKHZhciBpID0gbmEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpID0gaSAtIDEpIHsKKwkJCXZhciBlbCA9IG5hW2ldOworCQkJdHJ5IHsKKwkJCQlpZiAoZWwgJiYgZWxbIl9fY2xvYmJlckF0dHJzX18iXSkgeworCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGVsLl9fY2xvYmJlckF0dHJzX18ubGVuZ3RoOyBqKyspIHsKKwkJCQkJCW51a2VQcm9wKGVsLCBlbC5fX2Nsb2JiZXJBdHRyc19fW2pdKTsKKwkJCQkJfQorCQkJCQludWtlUHJvcChlbCwgIl9fY2xvYmJlckF0dHJzX18iKTsKKwkJCQkJbnVrZVByb3AoZWwsICJfX2RvQ2xvYmJlcl9fIik7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCX0KKwkJfQorCQluYSA9IG51bGw7CisJfTsKK307CitpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCWRvam8uYWRkT25VbmxvYWQoZnVuY3Rpb24gKCkgeworCQlkb2pvLl9pZV9jbG9iYmVyLmNsb2JiZXIoKTsKKwkJdHJ5IHsKKwkJCWlmICgoZG9qb1sid2lkZ2V0Il0pICYmIChkb2pvLndpZGdldFsibWFuYWdlciJdKSkgeworCQkJCWRvam8ud2lkZ2V0Lm1hbmFnZXIuZGVzdHJveUFsbCgpOworCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJaWYgKGRvam8ud2lkZ2V0KSB7CisJCQlmb3IgKHZhciBuYW1lIGluIGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlKSB7CisJCQkJaWYgKGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGUpIHsKKwkJCQkJZG9qby5kb20uZGVzdHJveU5vZGUoZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZSk7CisJCQkJCWRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGUgPSBudWxsOworCQkJCQlkZWxldGUgZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdHJ5IHsKKwkJCXdpbmRvdy5vbmxvYWQgPSBudWxsOworCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJdHJ5IHsKKwkJCXdpbmRvdy5vbnVubG9hZCA9IG51bGw7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCQlkb2pvLl9pZV9jbG9iYmVyLmNsb2JiZXJOb2RlcyA9IFtdOworCX0pOworfQorZG9qby5ldmVudC5icm93c2VyID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl2YXIgY2xvYmJlcklkeCA9IDA7CisJdGhpcy5ub3JtYWxpemVkRXZlbnROYW1lID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkgeworCQlzd2l0Y2ggKGV2ZW50TmFtZSkgeworCQkgIGNhc2UgIkNoZWNrYm94U3RhdGVDaGFuZ2UiOgorCQkgIGNhc2UgIkRPTUF0dHJNb2RpZmllZCI6CisJCSAgY2FzZSAiRE9NTWVudUl0ZW1BY3RpdmUiOgorCQkgIGNhc2UgIkRPTU1lbnVJdGVtSW5hY3RpdmUiOgorCQkgIGNhc2UgIkRPTU1vdXNlU2Nyb2xsIjoKKwkJICBjYXNlICJET01Ob2RlSW5zZXJ0ZWQiOgorCQkgIGNhc2UgIkRPTU5vZGVSZW1vdmVkIjoKKwkJICBjYXNlICJSYWRpb1N0YXRlQ2hhbmdlIjoKKwkJCXJldHVybiBldmVudE5hbWU7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJdmFyIGxjbiA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIChsY24uaW5kZXhPZigib24iKSA9PSAwKSA/IGxjbi5zdWJzdHIoMikgOiBsY247CisJCQlicmVhazsKKwkJfQorCX07CisJdGhpcy5jbGVhbiA9IGZ1bmN0aW9uIChub2RlKSB7CisJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2pvLl9pZV9jbG9iYmVyLmNsb2JiZXIobm9kZSk7CisJCX0KKwl9OworCXRoaXMuYWRkQ2xvYmJlck5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeworCQlpZiAoIWRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIW5vZGVbIl9fZG9DbG9iYmVyX18iXSkgeworCQkJbm9kZS5fX2RvQ2xvYmJlcl9fID0gdHJ1ZTsKKwkJCWRvam8uX2llX2Nsb2JiZXIuY2xvYmJlck5vZGVzLnB1c2gobm9kZSk7CisJCQlub2RlLl9fY2xvYmJlckF0dHJzX18gPSBbXTsKKwkJfQorCX07CisJdGhpcy5hZGRDbG9iYmVyTm9kZUF0dHJzID0gZnVuY3Rpb24gKG5vZGUsIHByb3BzKSB7CisJCWlmICghZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJcmV0dXJuOworCQl9CisJCXRoaXMuYWRkQ2xvYmJlck5vZGUobm9kZSk7CisJCWZvciAodmFyIHggPSAwOyB4IDwgcHJvcHMubGVuZ3RoOyB4KyspIHsKKwkJCW5vZGUuX19jbG9iYmVyQXR0cnNfXy5wdXNoKHByb3BzW3hdKTsKKwkJfQorCX07CisJdGhpcy5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChub2RlLCBldnROYW1lLCBmcCwgY2FwdHVyZSkgeworCQlpZiAoIWNhcHR1cmUpIHsKKwkJCXZhciBjYXB0dXJlID0gZmFsc2U7CisJCX0KKwkJZXZ0TmFtZSA9IGRvam8uZXZlbnQuYnJvd3Nlci5ub3JtYWxpemVkRXZlbnROYW1lKGV2dE5hbWUpOworCQlpZiAoZXZ0TmFtZSA9PSAia2V5IikgeworCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCQl0aGlzLnJlbW92ZUxpc3RlbmVyKG5vZGUsICJvbmtleWRvd24iLCBmcCwgY2FwdHVyZSk7CisJCQl9CisJCQlldnROYW1lID0gImtleXByZXNzIjsKKwkJfQorCQlpZiAobm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKSB7CisJCQlub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0TmFtZSwgZnAsIGNhcHR1cmUpOworCQl9CisJfTsKKwl0aGlzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gKG5vZGUsIGV2dE5hbWUsIGZwLCBjYXB0dXJlLCBkb250Rml4KSB7CisJCWlmICghbm9kZSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICghY2FwdHVyZSkgeworCQkJdmFyIGNhcHR1cmUgPSBmYWxzZTsKKwkJfQorCQlldnROYW1lID0gZG9qby5ldmVudC5icm93c2VyLm5vcm1hbGl6ZWRFdmVudE5hbWUoZXZ0TmFtZSk7CisJCWlmIChldnROYW1lID09ICJrZXkiKSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCXRoaXMuYWRkTGlzdGVuZXIobm9kZSwgIm9ua2V5ZG93biIsIGZwLCBjYXB0dXJlLCBkb250Rml4KTsKKwkJCX0KKwkJCWV2dE5hbWUgPSAia2V5cHJlc3MiOworCQl9CisJCWlmICghZG9udEZpeCkgeworCQkJdmFyIG5ld2ZwID0gZnVuY3Rpb24gKGV2dCkgeworCQkJCWlmICghZXZ0KSB7CisJCQkJCWV2dCA9IHdpbmRvdy5ldmVudDsKKwkJCQl9CisJCQkJdmFyIHJldCA9IGZwKGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudChldnQsIHRoaXMpKTsKKwkJCQlpZiAoY2FwdHVyZSkgeworCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQkJfQorCQkJCXJldHVybiByZXQ7CisJCQl9OworCQl9IGVsc2UgeworCQkJbmV3ZnAgPSBmcDsKKwkJfQorCQlpZiAobm9kZS5hZGRFdmVudExpc3RlbmVyKSB7CisJCQlub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0TmFtZSwgbmV3ZnAsIGNhcHR1cmUpOworCQkJcmV0dXJuIG5ld2ZwOworCQl9IGVsc2UgeworCQkJZXZ0TmFtZSA9ICJvbiIgKyBldnROYW1lOworCQkJaWYgKHR5cGVvZiBub2RlW2V2dE5hbWVdID09ICJmdW5jdGlvbiIpIHsKKwkJCQl2YXIgb2xkRXZ0ID0gbm9kZVtldnROYW1lXTsKKwkJCQlub2RlW2V2dE5hbWVdID0gZnVuY3Rpb24gKGUpIHsKKwkJCQkJb2xkRXZ0KGUpOworCQkJCQlyZXR1cm4gbmV3ZnAoZSk7CisJCQkJfTsKKwkJCX0gZWxzZSB7CisJCQkJbm9kZVtldnROYW1lXSA9IG5ld2ZwOworCQkJfQorCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCQl0aGlzLmFkZENsb2JiZXJOb2RlQXR0cnMobm9kZSwgW2V2dE5hbWVdKTsKKwkJCX0KKwkJCXJldHVybiBuZXdmcDsKKwkJfQorCX07CisJdGhpcy5pc0V2ZW50ID0gZnVuY3Rpb24gKG9iaikgeworCQlyZXR1cm4gKHR5cGVvZiBvYmogIT0gInVuZGVmaW5lZCIpICYmIChvYmopICYmICh0eXBlb2YgRXZlbnQgIT0gInVuZGVmaW5lZCIpICYmIChvYmouZXZlbnRQaGFzZSk7CisJfTsKKwl0aGlzLmN1cnJlbnRFdmVudCA9IG51bGw7CisJdGhpcy5jYWxsTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIsIGN1clRhcmdldCkgeworCQlpZiAodHlwZW9mIGxpc3RlbmVyICE9ICJmdW5jdGlvbiIpIHsKKwkJCWRvam8ucmFpc2UoImxpc3RlbmVyIG5vdCBhIGZ1bmN0aW9uOiAiICsgbGlzdGVuZXIpOworCQl9CisJCWRvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQuY3VycmVudFRhcmdldCA9IGN1clRhcmdldDsKKwkJcmV0dXJuIGxpc3RlbmVyLmNhbGwoY3VyVGFyZ2V0LCBkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50KTsKKwl9OworCXRoaXMuX3N0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHsKKwkJZG9qby5ldmVudC5icm93c2VyLmN1cnJlbnRFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOworCX07CisJdGhpcy5fcHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwl9OworCXRoaXMua2V5cyA9IHtLRVlfQkFDS1NQQUNFOjgsIEtFWV9UQUI6OSwgS0VZX0NMRUFSOjEyLCBLRVlfRU5URVI6MTMsIEtFWV9TSElGVDoxNiwgS0VZX0NUUkw6MTcsIEtFWV9BTFQ6MTgsIEtFWV9QQVVTRToxOSwgS0VZX0NBUFNfTE9DSzoyMCwgS0VZX0VTQ0FQRToyNywgS0VZX1NQQUNFOjMyLCBLRVlfUEFHRV9VUDozMywgS0VZX1BBR0VfRE9XTjozNCwgS0VZX0VORDozNSwgS0VZX0hPTUU6MzYsIEtFWV9MRUZUX0FSUk9XOjM3LCBLRVlfVVBfQVJST1c6MzgsIEtFWV9SSUdIVF9BUlJPVzozOSwgS0VZX0RPV05fQVJST1c6NDAsIEtFWV9JTlNFUlQ6NDUsIEtFWV9ERUxFVEU6NDYsIEtFWV9IRUxQOjQ3LCBLRVlfTEVGVF9XSU5ET1c6OTEsIEtFWV9SSUdIVF9XSU5ET1c6OTIsIEtFWV9TRUxFQ1Q6OTMsIEtFWV9OVU1QQURfMDo5NiwgS0VZX05VTVBBRF8xOjk3LCBLRVlfTlVNUEFEXzI6OTgsIEtFWV9OVU1QQURfMzo5OSwgS0VZX05VTVBBRF80OjEwMCwgS0VZX05VTVBBRF81OjEwMSwgS0VZX05VTVBBRF82OjEwMiwgS0VZX05VTVBBRF83OjEwMywgS0VZX05VTVBBRF84OjEwNCwgS0VZX05VTVBBRF85OjEwNSwgS0VZX05VTVBBRF9NVUxUSVBMWToxMDYsIEtFWV9OVU1QQURfUExVUzoxMDcsIEtFWV9OVU1QQURfRU5URVI6MTA4LCBLRVlfTlVNUEFEX01JTlVTOjEwOSwgS0VZX05VTVBBRF9QRVJJT0Q6MTEwLCBLRVlfTlVNUEFEX0RJVklERToxMTEsIEtFWV9GMToxMTIsIEtFWV9GMjoxMTMsIEtFWV9GMzoxMTQsIEtFWV9GNDoxMTUsIEtFWV9GNToxMTYsIEtFWV9GNjoxMTcsIEtFWV9GNzoxMTgsIEtFWV9GODoxMTksIEtFWV9GOToxMjAsIEtFWV9GMTA6MTIxLCBLRVlfRjExOjEyMiwgS0VZX0YxMjoxMjMsIEtFWV9GMTM6MTI0LCBLRVlfRjE0OjEyNSwgS0VZX0YxNToxMjYsIEtFWV9OVU1fTE9DSzoxNDQsIEtFWV9TQ1JPTExfTE9DSzoxNDV9OworCXRoaXMucmV2S2V5cyA9IFtdOworCWZvciAodmFyIGtleSBpbiB0aGlzLmtleXMpIHsKKwkJdGhpcy5yZXZLZXlzW3RoaXMua2V5c1trZXldXSA9IGtleTsKKwl9CisJdGhpcy5maXhFdmVudCA9IGZ1bmN0aW9uIChldnQsIHNlbmRlcikgeworCQlpZiAoIWV2dCkgeworCQkJaWYgKHdpbmRvd1siZXZlbnQiXSkgeworCQkJCWV2dCA9IHdpbmRvdy5ldmVudDsKKwkJCX0KKwkJfQorCQlpZiAoKGV2dFsidHlwZSJdKSAmJiAoZXZ0WyJ0eXBlIl0uaW5kZXhPZigia2V5IikgPT0gMCkpIHsKKwkJCWV2dC5rZXlzID0gdGhpcy5yZXZLZXlzOworCQkJZm9yICh2YXIga2V5IGluIHRoaXMua2V5cykgeworCQkJCWV2dFtrZXldID0gdGhpcy5rZXlzW2tleV07CisJCQl9CisJCQlpZiAoZXZ0WyJ0eXBlIl0gPT0gImtleWRvd24iICYmIGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCQlzd2l0Y2ggKGV2dC5rZXlDb2RlKSB7CisJCQkJICBjYXNlIGV2dC5LRVlfU0hJRlQ6CisJCQkJICBjYXNlIGV2dC5LRVlfQ1RSTDoKKwkJCQkgIGNhc2UgZXZ0LktFWV9BTFQ6CisJCQkJICBjYXNlIGV2dC5LRVlfQ0FQU19MT0NLOgorCQkJCSAgY2FzZSBldnQuS0VZX0xFRlRfV0lORE9XOgorCQkJCSAgY2FzZSBldnQuS0VZX1JJR0hUX1dJTkRPVzoKKwkJCQkgIGNhc2UgZXZ0LktFWV9TRUxFQ1Q6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CisJCQkJICBjYXNlIGV2dC5LRVlfU0NST0xMX0xPQ0s6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzA6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzE6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzI6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzM6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzQ6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzU6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzY6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzc6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzg6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEXzk6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEX1BFUklPRDoKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEX01VTFRJUExZOgorCQkJCSAgY2FzZSBldnQuS0VZX05VTVBBRF9QTFVTOgorCQkJCSAgY2FzZSBldnQuS0VZX05VTVBBRF9FTlRFUjoKKwkJCQkgIGNhc2UgZXZ0LktFWV9OVU1QQURfTUlOVVM6CisJCQkJICBjYXNlIGV2dC5LRVlfTlVNUEFEX0RJVklERToKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlIGV2dC5LRVlfUEFVU0U6CisJCQkJICBjYXNlIGV2dC5LRVlfVEFCOgorCQkJCSAgY2FzZSBldnQuS0VZX0JBQ0tTUEFDRToKKwkJCQkgIGNhc2UgZXZ0LktFWV9FTlRFUjoKKwkJCQkgIGNhc2UgZXZ0LktFWV9FU0NBUEU6CisJCQkJICBjYXNlIGV2dC5LRVlfUEFHRV9VUDoKKwkJCQkgIGNhc2UgZXZ0LktFWV9QQUdFX0RPV046CisJCQkJICBjYXNlIGV2dC5LRVlfRU5EOgorCQkJCSAgY2FzZSBldnQuS0VZX0hPTUU6CisJCQkJICBjYXNlIGV2dC5LRVlfTEVGVF9BUlJPVzoKKwkJCQkgIGNhc2UgZXZ0LktFWV9VUF9BUlJPVzoKKwkJCQkgIGNhc2UgZXZ0LktFWV9SSUdIVF9BUlJPVzoKKwkJCQkgIGNhc2UgZXZ0LktFWV9ET1dOX0FSUk9XOgorCQkJCSAgY2FzZSBldnQuS0VZX0lOU0VSVDoKKwkJCQkgIGNhc2UgZXZ0LktFWV9ERUxFVEU6CisJCQkJICBjYXNlIGV2dC5LRVlfRjE6CisJCQkJICBjYXNlIGV2dC5LRVlfRjI6CisJCQkJICBjYXNlIGV2dC5LRVlfRjM6CisJCQkJICBjYXNlIGV2dC5LRVlfRjQ6CisJCQkJICBjYXNlIGV2dC5LRVlfRjU6CisJCQkJICBjYXNlIGV2dC5LRVlfRjY6CisJCQkJICBjYXNlIGV2dC5LRVlfRjc6CisJCQkJICBjYXNlIGV2dC5LRVlfRjg6CisJCQkJICBjYXNlIGV2dC5LRVlfRjk6CisJCQkJICBjYXNlIGV2dC5LRVlfRjEwOgorCQkJCSAgY2FzZSBldnQuS0VZX0YxMToKKwkJCQkgIGNhc2UgZXZ0LktFWV9GMTI6CisJCQkJICBjYXNlIGV2dC5LRVlfRjEyOgorCQkJCSAgY2FzZSBldnQuS0VZX0YxMzoKKwkJCQkgIGNhc2UgZXZ0LktFWV9GMTQ6CisJCQkJICBjYXNlIGV2dC5LRVlfRjE1OgorCQkJCSAgY2FzZSBldnQuS0VZX0NMRUFSOgorCQkJCSAgY2FzZSBldnQuS0VZX0hFTFA6CisJCQkJCWV2dC5rZXkgPSBldnQua2V5Q29kZTsKKwkJCQkJYnJlYWs7CisJCQkJICBkZWZhdWx0OgorCQkJCQlpZiAoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSkgeworCQkJCQkJdmFyIHVuaWZpZWRDaGFyQ29kZSA9IGV2dC5rZXlDb2RlOworCQkJCQkJaWYgKHVuaWZpZWRDaGFyQ29kZSA+PSA2NSAmJiB1bmlmaWVkQ2hhckNvZGUgPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKSB7CisJCQkJCQkJdW5pZmllZENoYXJDb2RlICs9IDMyOworCQkJCQkJfQorCQkJCQkJaWYgKHVuaWZpZWRDaGFyQ29kZSA+PSAxICYmIHVuaWZpZWRDaGFyQ29kZSA8PSAyNiAmJiBldnQuY3RybEtleSkgeworCQkJCQkJCXVuaWZpZWRDaGFyQ29kZSArPSA5NjsKKwkJCQkJCX0KKwkJCQkJCWV2dC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWZpZWRDaGFyQ29kZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChldnRbInR5cGUiXSA9PSAia2V5cHJlc3MiKSB7CisJCQkJCWlmIChkb2pvLnJlbmRlci5odG1sLm9wZXJhKSB7CisJCQkJCQlpZiAoZXZ0LndoaWNoID09IDApIHsKKwkJCQkJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChldnQud2hpY2ggPiAwKSB7CisJCQkJCQkJCXN3aXRjaCAoZXZ0LndoaWNoKSB7CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX1NISUZUOgorCQkJCQkJCQkgIGNhc2UgZXZ0LktFWV9DVFJMOgorCQkJCQkJCQkgIGNhc2UgZXZ0LktFWV9BTFQ6CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX0NBUFNfTE9DSzoKKwkJCQkJCQkJICBjYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX1BBVVNFOgorCQkJCQkJCQkgIGNhc2UgZXZ0LktFWV9UQUI6CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX0JBQ0tTUEFDRToKKwkJCQkJCQkJICBjYXNlIGV2dC5LRVlfRU5URVI6CisJCQkJCQkJCSAgY2FzZSBldnQuS0VZX0VTQ0FQRToKKwkJCQkJCQkJCWV2dC5rZXkgPSBldnQud2hpY2g7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBkZWZhdWx0OgorCQkJCQkJCQkJdmFyIHVuaWZpZWRDaGFyQ29kZSA9IGV2dC53aGljaDsKKwkJCQkJCQkJCWlmICgoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSB8fCBldnQubWV0YUtleSkgJiYgKGV2dC53aGljaCA+PSA2NSAmJiBldnQud2hpY2ggPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKSkgeworCQkJCQkJCQkJCXVuaWZpZWRDaGFyQ29kZSArPSAzMjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWV2dC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWZpZWRDaGFyQ29kZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCQkJCWlmICghZXZ0LmN0cmxLZXkgJiYgIWV2dC5hbHRLZXkgJiYgZXZ0LmtleUNvZGUgPj0gZXZ0LktFWV9TUEFDRSkgeworCQkJCQkJCQlldnQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldnQua2V5Q29kZSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpIHsKKwkJCQkJCQkJc3dpdGNoIChldnQua2V5Q29kZSkgeworCQkJCQkJCQkgIGNhc2UgMjU6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9UQUI7CisJCQkJCQkJCQlldnQuc2hpZnQgPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCSAgY2FzZSA2MzIzMjoKKwkJCQkJCQkJCWV2dC5rZXkgPSBldnQuS0VZX1VQX0FSUk9XOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCSAgY2FzZSA2MzIzMzoKKwkJCQkJCQkJCWV2dC5rZXkgPSBldnQuS0VZX0RPV05fQVJST1c7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBjYXNlIDYzMjM0OgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5LRVlfTEVGVF9BUlJPVzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyMzU6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9SSUdIVF9BUlJPVzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyMzY6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GMTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyMzc6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GMjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyMzg6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GMzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyMzk6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GNDsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDA6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GNTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDE6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GNjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDI6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GNzsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDM6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GODsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDQ6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GOTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNDU6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9GMTA7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBjYXNlIDYzMjQ2OgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5LRVlfRjExOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCSAgY2FzZSA2MzI0NzoKKwkJCQkJCQkJCWV2dC5rZXkgPSBldnQuS0VZX0YxMjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNTA6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9QQVVTRTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNzI6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9ERUxFVEU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBjYXNlIDYzMjczOgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5LRVlfSE9NRTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNzU6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9FTkQ7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBjYXNlIDYzMjc2OgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5LRVlfUEFHRV9VUDsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkgIGNhc2UgNjMyNzc6CisJCQkJCQkJCQlldnQua2V5ID0gZXZ0LktFWV9QQUdFX0RPV047CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBjYXNlIDYzMzAyOgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5LRVlfSU5TRVJUOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCSAgY2FzZSA2MzI0ODoKKwkJCQkJCQkJICBjYXNlIDYzMjQ5OgorCQkJCQkJCQkgIGNhc2UgNjMyODk6CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJICBkZWZhdWx0OgorCQkJCQkJCQkJZXZ0LmtleSA9IGV2dC5jaGFyQ29kZSA+PSBldnQuS0VZX1NQQUNFID8gU3RyaW5nLmZyb21DaGFyQ29kZShldnQuY2hhckNvZGUpIDogZXZ0LmtleUNvZGU7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlldnQua2V5ID0gZXZ0LmNoYXJDb2RlID4gMCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmNoYXJDb2RlKSA6IGV2dC5rZXlDb2RlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJaWYgKCFldnQudGFyZ2V0KSB7CisJCQkJZXZ0LnRhcmdldCA9IGV2dC5zcmNFbGVtZW50OworCQkJfQorCQkJaWYgKCFldnQuY3VycmVudFRhcmdldCkgeworCQkJCWV2dC5jdXJyZW50VGFyZ2V0ID0gKHNlbmRlciA/IHNlbmRlciA6IGV2dC5zcmNFbGVtZW50KTsKKwkJCX0KKwkJCWlmICghZXZ0LmxheWVyWCkgeworCQkJCWV2dC5sYXllclggPSBldnQub2Zmc2V0WDsKKwkJCX0KKwkJCWlmICghZXZ0LmxheWVyWSkgeworCQkJCWV2dC5sYXllclkgPSBldnQub2Zmc2V0WTsKKwkJCX0KKwkJCXZhciBkb2MgPSAoZXZ0LnNyY0VsZW1lbnQgJiYgZXZ0LnNyY0VsZW1lbnQub3duZXJEb2N1bWVudCkgPyBldnQuc3JjRWxlbWVudC5vd25lckRvY3VtZW50IDogZG9jdW1lbnQ7CisJCQl2YXIgZG9jQm9keSA9ICgoZG9qby5yZW5kZXIuaHRtbC5pZTU1KSB8fCAoZG9jWyJjb21wYXRNb2RlIl0gPT0gIkJhY2tDb21wYXQiKSkgPyBkb2MuYm9keSA6IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisJCQlpZiAoIWV2dC5wYWdlWCkgeworCQkJCWV2dC5wYWdlWCA9IGV2dC5jbGllbnRYICsgKGRvY0JvZHkuc2Nyb2xsTGVmdCB8fCAwKTsKKwkJCX0KKwkJCWlmICghZXZ0LnBhZ2VZKSB7CisJCQkJZXZ0LnBhZ2VZID0gZXZ0LmNsaWVudFkgKyAoZG9jQm9keS5zY3JvbGxUb3AgfHwgMCk7CisJCQl9CisJCQlpZiAoZXZ0LnR5cGUgPT0gIm1vdXNlb3ZlciIpIHsKKwkJCQlldnQucmVsYXRlZFRhcmdldCA9IGV2dC5mcm9tRWxlbWVudDsKKwkJCX0KKwkJCWlmIChldnQudHlwZSA9PSAibW91c2VvdXQiKSB7CisJCQkJZXZ0LnJlbGF0ZWRUYXJnZXQgPSBldnQudG9FbGVtZW50OworCQkJfQorCQkJdGhpcy5jdXJyZW50RXZlbnQgPSBldnQ7CisJCQlldnQuY2FsbExpc3RlbmVyID0gdGhpcy5jYWxsTGlzdGVuZXI7CisJCQlldnQuc3RvcFByb3BhZ2F0aW9uID0gdGhpcy5fc3RvcFByb3BhZ2F0aW9uOworCQkJZXZ0LnByZXZlbnREZWZhdWx0ID0gdGhpcy5fcHJldmVudERlZmF1bHQ7CisJCX0KKwkJcmV0dXJuIGV2dDsKKwl9OworCXRoaXMuc3RvcEV2ZW50ID0gZnVuY3Rpb24gKGV2dCkgeworCQlpZiAod2luZG93LmV2ZW50KSB7CisJCQlldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwkJCWV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7CisJCQlldnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCX0KKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L2NvbW1vbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ldmVudC9jb21tb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNWIyMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ldmVudC9jb21tb24uanMKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hcnJheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZXh0cmFzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLmV2ZW50ID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9jYW5UaW1lb3V0ID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oZGpfZ2xvYmFsWyJzZXRUaW1lb3V0Il0pIHx8IGRvam8ubGFuZy5pc0FsaWVuKGRqX2dsb2JhbFsic2V0VGltZW91dCJdKTsKKwlmdW5jdGlvbiBpbnRlcnBvbGF0ZUFyZ3MoYXJncywgc2VhcmNoRm9yTmFtZXMpIHsKKwkJdmFyIGRsID0gZG9qby5sYW5nOworCQl2YXIgYW8gPSB7c3JjT2JqOmRqX2dsb2JhbCwgc3JjRnVuYzpudWxsLCBhZHZpY2VPYmo6ZGpfZ2xvYmFsLCBhZHZpY2VGdW5jOm51bGwsIGFyb3VuZE9iajpudWxsLCBhcm91bmRGdW5jOm51bGwsIGFkdmljZVR5cGU6KGFyZ3MubGVuZ3RoID4gMikgPyBhcmdzWzBdIDogImFmdGVyIiwgcHJlY2VkZW5jZToibGFzdCIsIG9uY2U6ZmFsc2UsIGRlbGF5Om51bGwsIHJhdGU6MCwgYWR2aWNlTXNnOmZhbHNlLCBtYXhDYWxsczotMX07CisJCXN3aXRjaCAoYXJncy5sZW5ndGgpIHsKKwkJICBjYXNlIDA6CisJCQlyZXR1cm47CisJCSAgY2FzZSAxOgorCQkJcmV0dXJuOworCQkgIGNhc2UgMjoKKwkJCWFvLnNyY0Z1bmMgPSBhcmdzWzBdOworCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbMV07CisJCQlicmVhazsKKwkJICBjYXNlIDM6CisJCQlpZiAoKGRsLmlzT2JqZWN0KGFyZ3NbMF0pKSAmJiAoZGwuaXNTdHJpbmcoYXJnc1sxXSkpICYmIChkbC5pc1N0cmluZyhhcmdzWzJdKSkpIHsKKwkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQlhby5zcmNPYmogPSBhcmdzWzBdOworCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzFdOworCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGRsLmlzU3RyaW5nKGFyZ3NbMV0pKSAmJiAoZGwuaXNTdHJpbmcoYXJnc1syXSkpKSB7CisJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzFdOworCQkJCQlhby5hZHZpY2VGdW5jID0gYXJnc1syXTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGRsLmlzT2JqZWN0KGFyZ3NbMF0pKSAmJiAoZGwuaXNTdHJpbmcoYXJnc1sxXSkpICYmIChkbC5pc0Z1bmN0aW9uKGFyZ3NbMl0pKSkgeworCQkJCQkJYW8uYWR2aWNlVHlwZSA9ICJhZnRlciI7CisJCQkJCQlhby5zcmNPYmogPSBhcmdzWzBdOworCQkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCQl2YXIgdG1wTmFtZSA9IGRsLm5hbWVBbm9uRnVuYyhhcmdzWzJdLCBhby5hZHZpY2VPYmosIHNlYXJjaEZvck5hbWVzKTsKKwkJCQkJCWFvLmFkdmljZUZ1bmMgPSB0bXBOYW1lOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChkbC5pc0Z1bmN0aW9uKGFyZ3NbMF0pKSAmJiAoZGwuaXNPYmplY3QoYXJnc1sxXSkpICYmIChkbC5pc1N0cmluZyhhcmdzWzJdKSkpIHsKKwkJCQkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQkJCQlhby5zcmNPYmogPSBkal9nbG9iYWw7CisJCQkJCQkJdmFyIHRtcE5hbWUgPSBkbC5uYW1lQW5vbkZ1bmMoYXJnc1swXSwgYW8uc3JjT2JqLCBzZWFyY2hGb3JOYW1lcyk7CisJCQkJCQkJYW8uc3JjRnVuYyA9IHRtcE5hbWU7CisJCQkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1sxXTsKKwkJCQkJCQlhby5hZHZpY2VGdW5jID0gYXJnc1syXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkgIGNhc2UgNDoKKwkJCWlmICgoZGwuaXNPYmplY3QoYXJnc1swXSkpICYmIChkbC5pc09iamVjdChhcmdzWzJdKSkpIHsKKwkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQlhby5zcmNPYmogPSBhcmdzWzBdOworCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzFdOworCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMl07CisJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQl9IGVsc2UgeworCQkJCWlmICgoZGwuaXNTdHJpbmcoYXJnc1swXSkpICYmIChkbC5pc1N0cmluZyhhcmdzWzFdKSkgJiYgKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKSkgeworCQkJCQlhby5hZHZpY2VUeXBlID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChkbC5pc1N0cmluZyhhcmdzWzBdKSkgJiYgKGRsLmlzRnVuY3Rpb24oYXJnc1sxXSkpICYmIChkbC5pc09iamVjdChhcmdzWzJdKSkpIHsKKwkJCQkJCWFvLmFkdmljZVR5cGUgPSBhcmdzWzBdOworCQkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQkJdmFyIHRtcE5hbWUgPSBkbC5uYW1lQW5vbkZ1bmMoYXJnc1sxXSwgZGpfZ2xvYmFsLCBzZWFyY2hGb3JOYW1lcyk7CisJCQkJCQlhby5zcmNGdW5jID0gdG1wTmFtZTsKKwkJCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMl07CisJCQkJCQlhby5hZHZpY2VGdW5jID0gYXJnc1szXTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgoZGwuaXNTdHJpbmcoYXJnc1swXSkpICYmIChkbC5pc09iamVjdChhcmdzWzFdKSkgJiYgKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSAmJiAoZGwuaXNGdW5jdGlvbihhcmdzWzNdKSkpIHsKKwkJCQkJCQlhby5zcmNPYmogPSBhcmdzWzFdOworCQkJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCQkJCXZhciB0bXBOYW1lID0gZGwubmFtZUFub25GdW5jKGFyZ3NbM10sIGRqX2dsb2JhbCwgc2VhcmNoRm9yTmFtZXMpOworCQkJCQkJCWFvLmFkdmljZU9iaiA9IGRqX2dsb2JhbDsKKwkJCQkJCQlhby5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSB7CisJCQkJCQkJCWFvLnNyY09iaiA9IGFyZ3NbMV07CisJCQkJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCQkJCQlhby5hZHZpY2VPYmogPSBkal9nbG9iYWw7CisJCQkJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzNdOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmIChkbC5pc09iamVjdChhcmdzWzJdKSkgeworCQkJCQkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCQkJCQlhby5hZHZpY2VPYmogPSBhcmdzWzJdOworCQkJCQkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlhby5zcmNPYmogPSBhby5hZHZpY2VPYmogPSBhby5hcm91bmRPYmogPSBkal9nbG9iYWw7CisJCQkJCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCQkJCQkJYW8uYXJvdW5kRnVuYyA9IGFyZ3NbM107CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJICBjYXNlIDY6CisJCQlhby5zcmNPYmogPSBhcmdzWzFdOworCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMl07CisJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdOworCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQlhby5hcm91bmRGdW5jID0gYXJnc1s1XTsKKwkJCWFvLmFyb3VuZE9iaiA9IGRqX2dsb2JhbDsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlhby5zcmNPYmogPSBhcmdzWzFdOworCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMl07CisJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdOworCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQlhby5hcm91bmRPYmogPSBhcmdzWzVdOworCQkJYW8uYXJvdW5kRnVuYyA9IGFyZ3NbNl07CisJCQlhby5vbmNlID0gYXJnc1s3XTsKKwkJCWFvLmRlbGF5ID0gYXJnc1s4XTsKKwkJCWFvLnJhdGUgPSBhcmdzWzldOworCQkJYW8uYWR2aWNlTXNnID0gYXJnc1sxMF07CisJCQlhby5tYXhDYWxscyA9ICghaXNOYU4ocGFyc2VJbnQoYXJnc1sxMV0pKSkgPyBhcmdzWzExXSA6IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRsLmlzRnVuY3Rpb24oYW8uYXJvdW5kRnVuYykpIHsKKwkJCXZhciB0bXBOYW1lID0gZGwubmFtZUFub25GdW5jKGFvLmFyb3VuZEZ1bmMsIGFvLmFyb3VuZE9iaiwgc2VhcmNoRm9yTmFtZXMpOworCQkJYW8uYXJvdW5kRnVuYyA9IHRtcE5hbWU7CisJCX0KKwkJaWYgKGRsLmlzRnVuY3Rpb24oYW8uc3JjRnVuYykpIHsKKwkJCWFvLnNyY0Z1bmMgPSBkbC5nZXROYW1lSW5PYmooYW8uc3JjT2JqLCBhby5zcmNGdW5jKTsKKwkJfQorCQlpZiAoZGwuaXNGdW5jdGlvbihhby5hZHZpY2VGdW5jKSkgeworCQkJYW8uYWR2aWNlRnVuYyA9IGRsLmdldE5hbWVJbk9iaihhby5hZHZpY2VPYmosIGFvLmFkdmljZUZ1bmMpOworCQl9CisJCWlmICgoYW8uYXJvdW5kT2JqKSAmJiAoZGwuaXNGdW5jdGlvbihhby5hcm91bmRGdW5jKSkpIHsKKwkJCWFvLmFyb3VuZEZ1bmMgPSBkbC5nZXROYW1lSW5PYmooYW8uYXJvdW5kT2JqLCBhby5hcm91bmRGdW5jKTsKKwkJfQorCQlpZiAoIWFvLnNyY09iaikgeworCQkJZG9qby5yYWlzZSgiYmFkIHNyY09iaiBmb3Igc3JjRnVuYzogIiArIGFvLnNyY0Z1bmMpOworCQl9CisJCWlmICghYW8uYWR2aWNlT2JqKSB7CisJCQlkb2pvLnJhaXNlKCJiYWQgYWR2aWNlT2JqIGZvciBhZHZpY2VGdW5jOiAiICsgYW8uYWR2aWNlRnVuYyk7CisJCX0KKwkJaWYgKCFhby5hZHZpY2VGdW5jKSB7CisJCQlkb2pvLmRlYnVnKCJiYWQgYWR2aWNlRnVuYyBmb3Igc3JjRnVuYzogIiArIGFvLnNyY0Z1bmMpOworCQkJZG9qby5kZWJ1Z1NoYWxsb3coYW8pOworCQl9CisJCXJldHVybiBhbzsKKwl9CisJdGhpcy5jb25uZWN0ID0gZnVuY3Rpb24gKCkgeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisJCQl2YXIgYW8gPSBhcmd1bWVudHNbMF07CisJCX0gZWxzZSB7CisJCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJfQorCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGFvLnNyY0Z1bmMpICYmIChhby5zcmNGdW5jLnRvTG93ZXJDYXNlKCkgPT0gIm9ua2V5IikpIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJYW8uc3JjRnVuYyA9ICJvbmtleWRvd24iOworCQkJCXRoaXMuY29ubmVjdChhbyk7CisJCQl9CisJCQlhby5zcmNGdW5jID0gIm9ua2V5cHJlc3MiOworCQl9CisJCWlmIChkb2pvLmxhbmcuaXNBcnJheShhby5zcmNPYmopICYmIGFvLnNyY09iaiAhPSAiIikgeworCQkJdmFyIHRtcEFPID0ge307CisJCQlmb3IgKHZhciB4IGluIGFvKSB7CisJCQkJdG1wQU9beF0gPSBhb1t4XTsKKwkJCX0KKwkJCXZhciBtanBzID0gW107CisJCQlkb2pvLmxhbmcuZm9yRWFjaChhby5zcmNPYmosIGZ1bmN0aW9uIChzcmMpIHsKKwkJCQlpZiAoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkgJiYgKGRvam8ubGFuZy5pc1N0cmluZyhzcmMpKSkgeworCQkJCQlzcmMgPSBkb2pvLmJ5SWQoc3JjKTsKKwkJCQl9CisJCQkJdG1wQU8uc3JjT2JqID0gc3JjOworCQkJCW1qcHMucHVzaChkb2pvLmV2ZW50LmNvbm5lY3QuY2FsbChkb2pvLmV2ZW50LCB0bXBBTykpOworCQkJfSk7CisJCQlyZXR1cm4gbWpwczsKKwkJfQorCQl2YXIgbWpwID0gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaiwgYW8uc3JjRnVuYyk7CisJCWlmIChhby5hZHZpY2VGdW5jKSB7CisJCQl2YXIgbWpwMiA9IGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZChhby5hZHZpY2VPYmosIGFvLmFkdmljZUZ1bmMpOworCQl9CisJCW1qcC5rd0FkZEFkdmljZShhbyk7CisJCXJldHVybiBtanA7CisJfTsKKwl0aGlzLmxvZyA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKKwkJdmFyIGt3QXJnczsKKwkJaWYgKChhcmd1bWVudHMubGVuZ3RoID09IDEpICYmICh0eXBlb2YgYTEgPT0gIm9iamVjdCIpKSB7CisJCQlrd0FyZ3MgPSBhMTsKKwkJfSBlbHNlIHsKKwkJCWt3QXJncyA9IHtzcmNPYmo6YTEsIHNyY0Z1bmM6YTJ9OworCQl9CisJCWt3QXJncy5hZHZpY2VGdW5jID0gZnVuY3Rpb24gKCkgeworCQkJdmFyIGFyZ3NTdHIgPSBbXTsKKwkJCWZvciAodmFyIHggPSAwOyB4IDwgYXJndW1lbnRzLmxlbmd0aDsgeCsrKSB7CisJCQkJYXJnc1N0ci5wdXNoKGFyZ3VtZW50c1t4XSk7CisJCQl9CisJCQlkb2pvLmRlYnVnKCIoIiArIGt3QXJncy5zcmNPYmogKyAiKS4iICsga3dBcmdzLnNyY0Z1bmMsICI6IiwgYXJnc1N0ci5qb2luKCIsICIpKTsKKwkJfTsKKwkJdGhpcy5rd0Nvbm5lY3Qoa3dBcmdzKTsKKwl9OworCXRoaXMuY29ubmVjdEJlZm9yZSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIGFyZ3MgPSBbImJlZm9yZSJdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCX0KKwkJcmV0dXJuIHRoaXMuY29ubmVjdC5hcHBseSh0aGlzLCBhcmdzKTsKKwl9OworCXRoaXMuY29ubmVjdEFyb3VuZCA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIGFyZ3MgPSBbImFyb3VuZCJdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCX0KKwkJcmV0dXJuIHRoaXMuY29ubmVjdC5hcHBseSh0aGlzLCBhcmdzKTsKKwl9OworCXRoaXMuY29ubmVjdE9uY2UgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBhbyA9IGludGVycG9sYXRlQXJncyhhcmd1bWVudHMsIHRydWUpOworCQlhby5vbmNlID0gdHJ1ZTsKKwkJcmV0dXJuIHRoaXMuY29ubmVjdChhbyk7CisJfTsKKwl0aGlzLmNvbm5lY3RSdW5PbmNlID0gZnVuY3Rpb24gKCkgeworCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJYW8ubWF4Q2FsbHMgPSAxOworCQlyZXR1cm4gdGhpcy5jb25uZWN0KGFvKTsKKwl9OworCXRoaXMuX2t3Q29ubmVjdEltcGwgPSBmdW5jdGlvbiAoa3dBcmdzLCBkaXNjb25uZWN0KSB7CisJCXZhciBmbiA9IChkaXNjb25uZWN0KSA/ICJkaXNjb25uZWN0IiA6ICJjb25uZWN0IjsKKwkJaWYgKHR5cGVvZiBrd0FyZ3NbInNyY0Z1bmMiXSA9PSAiZnVuY3Rpb24iKSB7CisJCQlrd0FyZ3Muc3JjT2JqID0ga3dBcmdzWyJzcmNPYmoiXSB8fCBkal9nbG9iYWw7CisJCQl2YXIgdG1wTmFtZSA9IGRvam8ubGFuZy5uYW1lQW5vbkZ1bmMoa3dBcmdzLnNyY0Z1bmMsIGt3QXJncy5zcmNPYmosIHRydWUpOworCQkJa3dBcmdzLnNyY0Z1bmMgPSB0bXBOYW1lOworCQl9CisJCWlmICh0eXBlb2Yga3dBcmdzWyJhZHZpY2VGdW5jIl0gPT0gImZ1bmN0aW9uIikgeworCQkJa3dBcmdzLmFkdmljZU9iaiA9IGt3QXJnc1siYWR2aWNlT2JqIl0gfHwgZGpfZ2xvYmFsOworCQkJdmFyIHRtcE5hbWUgPSBkb2pvLmxhbmcubmFtZUFub25GdW5jKGt3QXJncy5hZHZpY2VGdW5jLCBrd0FyZ3MuYWR2aWNlT2JqLCB0cnVlKTsKKwkJCWt3QXJncy5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJfQorCQlrd0FyZ3Muc3JjT2JqID0ga3dBcmdzWyJzcmNPYmoiXSB8fCBkal9nbG9iYWw7CisJCWt3QXJncy5hZHZpY2VPYmogPSBrd0FyZ3NbImFkdmljZU9iaiJdIHx8IGt3QXJnc1sidGFyZ2V0T2JqIl0gfHwgZGpfZ2xvYmFsOworCQlrd0FyZ3MuYWR2aWNlRnVuYyA9IGt3QXJnc1siYWR2aWNlRnVuYyJdIHx8IGt3QXJnc1sidGFyZ2V0RnVuYyJdOworCQlyZXR1cm4gZG9qby5ldmVudFtmbl0oa3dBcmdzKTsKKwl9OworCXRoaXMua3dDb25uZWN0ID0gZnVuY3Rpb24gKGt3QXJncykgeworCQlyZXR1cm4gdGhpcy5fa3dDb25uZWN0SW1wbChrd0FyZ3MsIGZhbHNlKTsKKwl9OworCXRoaXMuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQkJdmFyIGFvID0gYXJndW1lbnRzWzBdOworCQl9IGVsc2UgeworCQkJdmFyIGFvID0gaW50ZXJwb2xhdGVBcmdzKGFyZ3VtZW50cywgdHJ1ZSk7CisJCX0KKwkJaWYgKCFhby5hZHZpY2VGdW5jKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhhby5zcmNGdW5jKSAmJiAoYW8uc3JjRnVuYy50b0xvd2VyQ2FzZSgpID09ICJvbmtleSIpKSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCWFvLnNyY0Z1bmMgPSAib25rZXlkb3duIjsKKwkJCQl0aGlzLmRpc2Nvbm5lY3QoYW8pOworCQkJfQorCQkJYW8uc3JjRnVuYyA9ICJvbmtleXByZXNzIjsKKwkJfQorCQlpZiAoIWFvLnNyY09ialthby5zcmNGdW5jXSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdmFyIG1qcCA9IGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZChhby5zcmNPYmosIGFvLnNyY0Z1bmMsIHRydWUpOworCQltanAucmVtb3ZlQWR2aWNlKGFvLmFkdmljZU9iaiwgYW8uYWR2aWNlRnVuYywgYW8uYWR2aWNlVHlwZSwgYW8ub25jZSk7CisJCXJldHVybiBtanA7CisJfTsKKwl0aGlzLmt3RGlzY29ubmVjdCA9IGZ1bmN0aW9uIChrd0FyZ3MpIHsKKwkJcmV0dXJuIHRoaXMuX2t3Q29ubmVjdEltcGwoa3dBcmdzLCB0cnVlKTsKKwl9OworfTsKK2Rvam8uZXZlbnQuTWV0aG9kSW52b2NhdGlvbiA9IGZ1bmN0aW9uIChqb2luX3BvaW50LCBvYmosIGFyZ3MpIHsKKwl0aGlzLmpwXyA9IGpvaW5fcG9pbnQ7CisJdGhpcy5vYmplY3QgPSBvYmo7CisJdGhpcy5hcmdzID0gW107CisJZm9yICh2YXIgeCA9IDA7IHggPCBhcmdzLmxlbmd0aDsgeCsrKSB7CisJCXRoaXMuYXJnc1t4XSA9IGFyZ3NbeF07CisJfQorCXRoaXMuYXJvdW5kX2luZGV4ID0gLTE7Cit9OworZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uLnByb3RvdHlwZS5wcm9jZWVkID0gZnVuY3Rpb24gKCkgeworCXRoaXMuYXJvdW5kX2luZGV4Kys7CisJaWYgKHRoaXMuYXJvdW5kX2luZGV4ID49IHRoaXMuanBfLmFyb3VuZC5sZW5ndGgpIHsKKwkJcmV0dXJuIHRoaXMuanBfLm9iamVjdFt0aGlzLmpwXy5tZXRob2RuYW1lXS5hcHBseSh0aGlzLmpwXy5vYmplY3QsIHRoaXMuYXJncyk7CisJfSBlbHNlIHsKKwkJdmFyIHRpID0gdGhpcy5qcF8uYXJvdW5kW3RoaXMuYXJvdW5kX2luZGV4XTsKKwkJdmFyIG1vYmogPSB0aVswXSB8fCBkal9nbG9iYWw7CisJCXZhciBtZXRoID0gdGlbMV07CisJCXJldHVybiBtb2JqW21ldGhdLmNhbGwobW9iaiwgdGhpcyk7CisJfQorfTsKK2Rvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50ID0gZnVuY3Rpb24gKG9iaiwgZnVuY05hbWUpIHsKKwl0aGlzLm9iamVjdCA9IG9iaiB8fCBkal9nbG9iYWw7CisJdGhpcy5tZXRob2RuYW1lID0gZnVuY05hbWU7CisJdGhpcy5tZXRob2RmdW5jID0gdGhpcy5vYmplY3RbZnVuY05hbWVdOworCXRoaXMuc3F1ZWxjaCA9IGZhbHNlOworfTsKK2Rvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZCA9IGZ1bmN0aW9uIChvYmosIGZ1bmNOYW1lKSB7CisJaWYgKCFvYmopIHsKKwkJb2JqID0gZGpfZ2xvYmFsOworCX0KKwl2YXIgb2ZuID0gb2JqW2Z1bmNOYW1lXTsKKwlpZiAoIW9mbikgeworCQlvZm4gPSBvYmpbZnVuY05hbWVdID0gZnVuY3Rpb24gKCkgeworCQl9OworCQlpZiAoIW9ialtmdW5jTmFtZV0pIHsKKwkJCWRvam8ucmFpc2UoIkNhbm5vdCBzZXQgZG8tbm90aGluZyBtZXRob2Qgb24gdGhhdCBvYmplY3QgIiArIGZ1bmNOYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgodHlwZW9mIG9mbiAhPSAiZnVuY3Rpb24iKSAmJiAoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKG9mbikpICYmICghZG9qby5sYW5nLmlzQWxpZW4ob2ZuKSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCXZhciBqcG5hbWUgPSBmdW5jTmFtZSArICIkam9pbnBvaW50IjsKKwl2YXIganBmdW5jbmFtZSA9IGZ1bmNOYW1lICsgIiRqb2lucG9pbnQkbWV0aG9kIjsKKwl2YXIgam9pbnBvaW50ID0gb2JqW2pwbmFtZV07CisJaWYgKCFqb2lucG9pbnQpIHsKKwkJdmFyIGlzTm9kZSA9IGZhbHNlOworCQlpZiAoZG9qby5ldmVudFsiYnJvd3NlciJdKSB7CisJCQlpZiAoKG9ialsiYXR0YWNoRXZlbnQiXSkgfHwgKG9ialsibm9kZVR5cGUiXSkgfHwgKG9ialsiYWRkRXZlbnRMaXN0ZW5lciJdKSkgeworCQkJCWlzTm9kZSA9IHRydWU7CisJCQkJZG9qby5ldmVudC5icm93c2VyLmFkZENsb2JiZXJOb2RlQXR0cnMob2JqLCBbanBuYW1lLCBqcGZ1bmNuYW1lLCBmdW5jTmFtZV0pOworCQkJfQorCQl9CisJCXZhciBvcmlnQXJpdHkgPSBvZm4ubGVuZ3RoOworCQlvYmpbanBmdW5jbmFtZV0gPSBvZm47CisJCWpvaW5wb2ludCA9IG9ialtqcG5hbWVdID0gbmV3IGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50KG9iaiwganBmdW5jbmFtZSk7CisJCWlmICghaXNOb2RlKSB7CisJCQlvYmpbZnVuY05hbWVdID0gZnVuY3Rpb24gKCkgeworCQkJCXJldHVybiBqb2lucG9pbnQucnVuLmFwcGx5KGpvaW5wb2ludCwgYXJndW1lbnRzKTsKKwkJCX07CisJCX0gZWxzZSB7CisJCQlvYmpbZnVuY05hbWVdID0gZnVuY3Rpb24gKCkgeworCQkJCXZhciBhcmdzID0gW107CisJCQkJaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CisJCQkJCXZhciBldnQgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJaWYgKG9iai5vd25lckRvY3VtZW50KSB7CisJCQkJCQkJZXZ0ID0gb2JqLm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93LmV2ZW50OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAob2JqLmRvY3VtZW50RWxlbWVudCkgeworCQkJCQkJCQlldnQgPSBvYmouZG9jdW1lbnRFbGVtZW50Lm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93LmV2ZW50OworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmIChvYmouZXZlbnQpIHsKKwkJCQkJCQkJCWV2dCA9IG9iai5ldmVudDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWV2dCA9IHdpbmRvdy5ldmVudDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljYXRjaCAoZSkgeworCQkJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJCQl9CisJCQkJCWlmIChldnQpIHsKKwkJCQkJCWFyZ3MucHVzaChkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LCB0aGlzKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IGFyZ3VtZW50cy5sZW5ndGg7IHgrKykgeworCQkJCQkJaWYgKCh4ID09IDApICYmIChkb2pvLmV2ZW50LmJyb3dzZXIuaXNFdmVudChhcmd1bWVudHNbeF0pKSkgeworCQkJCQkJCWFyZ3MucHVzaChkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoYXJndW1lbnRzW3hdLCB0aGlzKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBqb2lucG9pbnQucnVuLmFwcGx5KGpvaW5wb2ludCwgYXJncyk7CisJCQl9OworCQl9CisJCW9ialtmdW5jTmFtZV0uX19wcmVKb2luQXJpdHkgPSBvcmlnQXJpdHk7CisJfQorCXJldHVybiBqb2lucG9pbnQ7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludCwge3NxdWVsY2g6ZmFsc2UsIHVuaW50ZXJjZXB0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLm9iamVjdFt0aGlzLm1ldGhvZG5hbWVdID0gdGhpcy5tZXRob2RmdW5jOworCXRoaXMuYmVmb3JlID0gW107CisJdGhpcy5hZnRlciA9IFtdOworCXRoaXMuYXJvdW5kID0gW107Cit9LCBkaXNjb25uZWN0OmRvam8ubGFuZy5mb3J3YXJkKCJ1bmludGVyY2VwdCIpLCBydW46ZnVuY3Rpb24gKCkgeworCXZhciBvYmogPSB0aGlzLm9iamVjdCB8fCBkal9nbG9iYWw7CisJdmFyIGFyZ3MgPSBhcmd1bWVudHM7CisJdmFyIGFhcmdzID0gW107CisJZm9yICh2YXIgeCA9IDA7IHggPCBhcmdzLmxlbmd0aDsgeCsrKSB7CisJCWFhcmdzW3hdID0gYXJnc1t4XTsKKwl9CisJdmFyIHVucm9sbEFkdmljZSA9IGZ1bmN0aW9uIChtYXJyKSB7CisJCWlmICghbWFycikgeworCQkJZG9qby5kZWJ1ZygiTnVsbCBhcmd1bWVudCB0byB1bnJvbGxBZHZpY2UoKSIpOworCQkJcmV0dXJuOworCQl9CisJCXZhciBjYWxsT2JqID0gbWFyclswXSB8fCBkal9nbG9iYWw7CisJCXZhciBjYWxsRnVuYyA9IG1hcnJbMV07CisJCWlmICghY2FsbE9ialtjYWxsRnVuY10pIHsKKwkJCWRvam8ucmFpc2UoImZ1bmN0aW9uIFwiIiArIGNhbGxGdW5jICsgIlwiIGRvZXMgbm90IGV4aXN0IG9uIFwiIiArIGNhbGxPYmogKyAiXCIiKTsKKwkJfQorCQl2YXIgYXJvdW5kT2JqID0gbWFyclsyXSB8fCBkal9nbG9iYWw7CisJCXZhciBhcm91bmRGdW5jID0gbWFyclszXTsKKwkJdmFyIG1zZyA9IG1hcnJbNl07CisJCXZhciBtYXhDb3VudCA9IG1hcnJbN107CisJCWlmIChtYXhDb3VudCA+IC0xKSB7CisJCQlpZiAobWF4Q291bnQgPT0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCW1hcnJbN10tLTsKKwkJfQorCQl2YXIgdW5kZWY7CisJCXZhciB0byA9IHthcmdzOltdLCBqcF86dGhpcywgb2JqZWN0Om9iaiwgcHJvY2VlZDpmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gY2FsbE9ialtjYWxsRnVuY10uYXBwbHkoY2FsbE9iaiwgdG8uYXJncyk7CisJCX19OworCQl0by5hcmdzID0gYWFyZ3M7CisJCXZhciBkZWxheSA9IHBhcnNlSW50KG1hcnJbNF0pOworCQl2YXIgaGFzRGVsYXkgPSAoKCFpc05hTihkZWxheSkpICYmIChtYXJyWzRdICE9PSBudWxsKSAmJiAodHlwZW9mIG1hcnJbNF0gIT0gInVuZGVmaW5lZCIpKTsKKwkJaWYgKG1hcnJbNV0pIHsKKwkJCXZhciByYXRlID0gcGFyc2VJbnQobWFycls1XSk7CisJCQl2YXIgY3VyID0gbmV3IERhdGUoKTsKKwkJCXZhciB0aW1lclNldCA9IGZhbHNlOworCQkJaWYgKChtYXJyWyJsYXN0Il0pICYmICgoY3VyIC0gbWFyci5sYXN0KSA8PSByYXRlKSkgeworCQkJCWlmIChkb2pvLmV2ZW50Ll9jYW5UaW1lb3V0KSB7CisJCQkJCWlmIChtYXJyWyJkZWxheVRpbWVyIl0pIHsKKwkJCQkJCWNsZWFyVGltZW91dChtYXJyLmRlbGF5VGltZXIpOworCQkJCQl9CisJCQkJCXZhciB0b2QgPSBwYXJzZUludChyYXRlICogMik7CisJCQkJCXZhciBtY3B5ID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KG1hcnIpOworCQkJCQltYXJyLmRlbGF5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKwkJCQkJCW1jcHlbNV0gPSAwOworCQkJCQkJdW5yb2xsQWR2aWNlKG1jcHkpOworCQkJCQl9LCB0b2QpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCW1hcnIubGFzdCA9IGN1cjsKKwkJCX0KKwkJfQorCQlpZiAoYXJvdW5kRnVuYykgeworCQkJYXJvdW5kT2JqW2Fyb3VuZEZ1bmNdLmNhbGwoYXJvdW5kT2JqLCB0byk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGhhc0RlbGF5KSAmJiAoKGRvam8ucmVuZGVyLmh0bWwpIHx8IChkb2pvLnJlbmRlci5zdmcpKSkgeworCQkJCWRqX2dsb2JhbFsic2V0VGltZW91dCJdKGZ1bmN0aW9uICgpIHsKKwkJCQkJaWYgKG1zZykgeworCQkJCQkJY2FsbE9ialtjYWxsRnVuY10uY2FsbChjYWxsT2JqLCB0byk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsKKwkJCQkJfQorCQkJCX0sIGRlbGF5KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG1zZykgeworCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5jYWxsKGNhbGxPYmosIHRvKTsKKwkJCQl9IGVsc2UgeworCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9OworCXZhciB1blJvbGxTcXVlbGNoID0gZnVuY3Rpb24gKCkgeworCQlpZiAodGhpcy5zcXVlbGNoKSB7CisJCQl0cnkgeworCQkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX07CisJaWYgKCh0aGlzWyJiZWZvcmUiXSkgJiYgKHRoaXMuYmVmb3JlLmxlbmd0aCA+IDApKSB7CisJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuYmVmb3JlLmNvbmNhdChuZXcgQXJyYXkoKSksIHVuUm9sbFNxdWVsY2gpOworCX0KKwl2YXIgcmVzdWx0OworCXRyeSB7CisJCWlmICgodGhpc1siYXJvdW5kIl0pICYmICh0aGlzLmFyb3VuZC5sZW5ndGggPiAwKSkgeworCQkJdmFyIG1pID0gbmV3IGRvam8uZXZlbnQuTWV0aG9kSW52b2NhdGlvbih0aGlzLCBvYmosIGFyZ3MpOworCQkJcmVzdWx0ID0gbWkucHJvY2VlZCgpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMubWV0aG9kZnVuYykgeworCQkJCXJlc3VsdCA9IHRoaXMub2JqZWN0W3RoaXMubWV0aG9kbmFtZV0uYXBwbHkodGhpcy5vYmplY3QsIGFyZ3MpOworCQkJfQorCQl9CisJfQorCWNhdGNoIChlKSB7CisJCWlmICghdGhpcy5zcXVlbGNoKSB7CisJCQlkb2pvLmRlYnVnKGUsICJ3aGVuIGNhbGxpbmciLCB0aGlzLm1ldGhvZG5hbWUsICJvbiIsIHRoaXMub2JqZWN0LCAid2l0aCBhcmd1bWVudHMiLCBhcmdzKTsKKwkJCWRvam8ucmFpc2UoZSk7CisJCX0KKwl9CisJaWYgKCh0aGlzWyJhZnRlciJdKSAmJiAodGhpcy5hZnRlci5sZW5ndGggPiAwKSkgeworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmFmdGVyLmNvbmNhdChuZXcgQXJyYXkoKSksIHVuUm9sbFNxdWVsY2gpOworCX0KKwlyZXR1cm4gKHRoaXMubWV0aG9kZnVuYykgPyByZXN1bHQgOiBudWxsOworfSwgZ2V0QXJyOmZ1bmN0aW9uIChraW5kKSB7CisJdmFyIHR5cGUgPSAiYWZ0ZXIiOworCWlmICgodHlwZW9mIGtpbmQgPT0gInN0cmluZyIpICYmIChraW5kLmluZGV4T2YoImJlZm9yZSIpICE9IC0xKSkgeworCQl0eXBlID0gImJlZm9yZSI7CisJfSBlbHNlIHsKKwkJaWYgKGtpbmQgPT0gImFyb3VuZCIpIHsKKwkJCXR5cGUgPSAiYXJvdW5kIjsKKwkJfQorCX0KKwlpZiAoIXRoaXNbdHlwZV0pIHsKKwkJdGhpc1t0eXBlXSA9IFtdOworCX0KKwlyZXR1cm4gdGhpc1t0eXBlXTsKK30sIGt3QWRkQWR2aWNlOmZ1bmN0aW9uIChhcmdzKSB7CisJdGhpcy5hZGRBZHZpY2UoYXJnc1siYWR2aWNlT2JqIl0sIGFyZ3NbImFkdmljZUZ1bmMiXSwgYXJnc1siYXJvdW5kT2JqIl0sIGFyZ3NbImFyb3VuZEZ1bmMiXSwgYXJnc1siYWR2aWNlVHlwZSJdLCBhcmdzWyJwcmVjZWRlbmNlIl0sIGFyZ3NbIm9uY2UiXSwgYXJnc1siZGVsYXkiXSwgYXJnc1sicmF0ZSJdLCBhcmdzWyJhZHZpY2VNc2ciXSwgYXJnc1sibWF4Q2FsbHMiXSk7Cit9LCBhZGRBZHZpY2U6ZnVuY3Rpb24gKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIHRoaXNBcm91bmRPYmosIHRoaXNBcm91bmQsIGFkdmljZVR5cGUsIHByZWNlZGVuY2UsIG9uY2UsIGRlbGF5LCByYXRlLCBhc01lc3NhZ2UsIG1heENhbGxzKSB7CisJdmFyIGFyciA9IHRoaXMuZ2V0QXJyKGFkdmljZVR5cGUpOworCWlmICghYXJyKSB7CisJCWRvam8ucmFpc2UoImJhZCB0aGlzOiAiICsgdGhpcyk7CisJfQorCXZhciBhbyA9IFt0aGlzQWR2aWNlT2JqLCB0aGlzQWR2aWNlLCB0aGlzQXJvdW5kT2JqLCB0aGlzQXJvdW5kLCBkZWxheSwgcmF0ZSwgYXNNZXNzYWdlLCBtYXhDYWxsc107CisJaWYgKG9uY2UpIHsKKwkJaWYgKHRoaXMuaGFzQWR2aWNlKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycikgPj0gMCkgeworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChwcmVjZWRlbmNlID09ICJmaXJzdCIpIHsKKwkJYXJyLnVuc2hpZnQoYW8pOworCX0gZWxzZSB7CisJCWFyci5wdXNoKGFvKTsKKwl9Cit9LCBoYXNBZHZpY2U6ZnVuY3Rpb24gKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycikgeworCWlmICghYXJyKSB7CisJCWFyciA9IHRoaXMuZ2V0QXJyKGFkdmljZVR5cGUpOworCX0KKwl2YXIgaW5kID0gLTE7CisJZm9yICh2YXIgeCA9IDA7IHggPCBhcnIubGVuZ3RoOyB4KyspIHsKKwkJdmFyIGFhbyA9ICh0eXBlb2YgdGhpc0FkdmljZSA9PSAib2JqZWN0IikgPyAobmV3IFN0cmluZyh0aGlzQWR2aWNlKSkudG9TdHJpbmcoKSA6IHRoaXNBZHZpY2U7CisJCXZhciBhMW8gPSAodHlwZW9mIGFyclt4XVsxXSA9PSAib2JqZWN0IikgPyAobmV3IFN0cmluZyhhcnJbeF1bMV0pKS50b1N0cmluZygpIDogYXJyW3hdWzFdOworCQlpZiAoKGFyclt4XVswXSA9PSB0aGlzQWR2aWNlT2JqKSAmJiAoYTFvID09IGFhbykpIHsKKwkJCWluZCA9IHg7CisJCX0KKwl9CisJcmV0dXJuIGluZDsKK30sIHJlbW92ZUFkdmljZTpmdW5jdGlvbiAodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgb25jZSkgeworCXZhciBhcnIgPSB0aGlzLmdldEFycihhZHZpY2VUeXBlKTsKKwl2YXIgaW5kID0gdGhpcy5oYXNBZHZpY2UodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgYXJyKTsKKwlpZiAoaW5kID09IC0xKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJd2hpbGUgKGluZCAhPSAtMSkgeworCQlhcnIuc3BsaWNlKGluZCwgMSk7CisJCWlmIChvbmNlKSB7CisJCQlicmVhazsKKwkJfQorCQlpbmQgPSB0aGlzLmhhc0FkdmljZSh0aGlzQWR2aWNlT2JqLCB0aGlzQWR2aWNlLCBhZHZpY2VUeXBlLCBhcnIpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L3RvcGljLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V2ZW50L3RvcGljLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjEyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZXZlbnQvdG9waWMuanMKQEAgLTAsMCArMSw3OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC5jb21tb24iKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC50b3BpYyIpOworZG9qby5ldmVudC50b3BpYyA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy50b3BpY3MgPSB7fTsKKwl0aGlzLmdldFRvcGljID0gZnVuY3Rpb24gKHRvcGljKSB7CisJCWlmICghdGhpcy50b3BpY3NbdG9waWNdKSB7CisJCQl0aGlzLnRvcGljc1t0b3BpY10gPSBuZXcgdGhpcy5Ub3BpY0ltcGwodG9waWMpOworCQl9CisJCXJldHVybiB0aGlzLnRvcGljc1t0b3BpY107CisJfTsKKwl0aGlzLnJlZ2lzdGVyUHVibGlzaGVyID0gZnVuY3Rpb24gKHRvcGljLCBvYmosIGZ1bmNOYW1lKSB7CisJCXZhciB0b3BpYyA9IHRoaXMuZ2V0VG9waWModG9waWMpOworCQl0b3BpYy5yZWdpc3RlclB1Ymxpc2hlcihvYmosIGZ1bmNOYW1lKTsKKwl9OworCXRoaXMuc3Vic2NyaWJlID0gZnVuY3Rpb24gKHRvcGljLCBvYmosIGZ1bmNOYW1lKSB7CisJCXZhciB0b3BpYyA9IHRoaXMuZ2V0VG9waWModG9waWMpOworCQl0b3BpYy5zdWJzY3JpYmUob2JqLCBmdW5jTmFtZSk7CisJfTsKKwl0aGlzLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKHRvcGljLCBvYmosIGZ1bmNOYW1lKSB7CisJCXZhciB0b3BpYyA9IHRoaXMuZ2V0VG9waWModG9waWMpOworCQl0b3BpYy51bnN1YnNjcmliZShvYmosIGZ1bmNOYW1lKTsKKwl9OworCXRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICh0b3BpYykgeworCQl0aGlzLmdldFRvcGljKHRvcGljKS5kZXN0cm95KCk7CisJCWRlbGV0ZSB0aGlzLnRvcGljc1t0b3BpY107CisJfTsKKwl0aGlzLnB1Ymxpc2hBcHBseSA9IGZ1bmN0aW9uICh0b3BpYywgYXJncykgeworCQl2YXIgdG9waWMgPSB0aGlzLmdldFRvcGljKHRvcGljKTsKKwkJdG9waWMuc2VuZE1lc3NhZ2UuYXBwbHkodG9waWMsIGFyZ3MpOworCX07CisJdGhpcy5wdWJsaXNoID0gZnVuY3Rpb24gKHRvcGljLCBtZXNzYWdlKSB7CisJCXZhciB0b3BpYyA9IHRoaXMuZ2V0VG9waWModG9waWMpOworCQl2YXIgYXJncyA9IFtdOworCQlmb3IgKHZhciB4ID0gMTsgeCA8IGFyZ3VtZW50cy5sZW5ndGg7IHgrKykgeworCQkJYXJncy5wdXNoKGFyZ3VtZW50c1t4XSk7CisJCX0KKwkJdG9waWMuc2VuZE1lc3NhZ2UuYXBwbHkodG9waWMsIGFyZ3MpOworCX07Cit9OworZG9qby5ldmVudC50b3BpYy5Ub3BpY0ltcGwgPSBmdW5jdGlvbiAodG9waWNOYW1lKSB7CisJdGhpcy50b3BpY05hbWUgPSB0b3BpY05hbWU7CisJdGhpcy5zdWJzY3JpYmUgPSBmdW5jdGlvbiAobGlzdGVuZXJPYmplY3QsIGxpc3RlbmVyTWV0aG9kKSB7CisJCXZhciB0ZiA9IGxpc3RlbmVyTWV0aG9kIHx8IGxpc3RlbmVyT2JqZWN0OworCQl2YXIgdG8gPSAoIWxpc3RlbmVyTWV0aG9kKSA/IGRqX2dsb2JhbCA6IGxpc3RlbmVyT2JqZWN0OworCQlyZXR1cm4gZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajp0aGlzLCBzcmNGdW5jOiJzZW5kTWVzc2FnZSIsIGFkdmljZU9iajp0bywgYWR2aWNlRnVuYzp0Zn0pOworCX07CisJdGhpcy51bnN1YnNjcmliZSA9IGZ1bmN0aW9uIChsaXN0ZW5lck9iamVjdCwgbGlzdGVuZXJNZXRob2QpIHsKKwkJdmFyIHRmID0gKCFsaXN0ZW5lck1ldGhvZCkgPyBsaXN0ZW5lck9iamVjdCA6IGxpc3RlbmVyTWV0aG9kOworCQl2YXIgdG8gPSAoIWxpc3RlbmVyTWV0aG9kKSA/IG51bGwgOiBsaXN0ZW5lck9iamVjdDsKKwkJcmV0dXJuIGRvam8uZXZlbnQua3dEaXNjb25uZWN0KHtzcmNPYmo6dGhpcywgc3JjRnVuYzoic2VuZE1lc3NhZ2UiLCBhZHZpY2VPYmo6dG8sIGFkdmljZUZ1bmM6dGZ9KTsKKwl9OworCXRoaXMuX2dldEpvaW5Qb2ludCA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZCh0aGlzLCAic2VuZE1lc3NhZ2UiKTsKKwl9OworCXRoaXMuc2V0U3F1ZWxjaCA9IGZ1bmN0aW9uIChzaG91bGRTcXVlbGNoKSB7CisJCXRoaXMuX2dldEpvaW5Qb2ludCgpLnNxdWVsY2ggPSBzaG91bGRTcXVlbGNoOworCX07CisJdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeworCQl0aGlzLl9nZXRKb2luUG9pbnQoKS5kaXNjb25uZWN0KCk7CisJfTsKKwl0aGlzLnJlZ2lzdGVyUHVibGlzaGVyID0gZnVuY3Rpb24gKHB1Ymxpc2hlck9iamVjdCwgcHVibGlzaGVyTWV0aG9kKSB7CisJCWRvam8uZXZlbnQuY29ubmVjdChwdWJsaXNoZXJPYmplY3QsIHB1Ymxpc2hlck1ldGhvZCwgdGhpcywgInNlbmRNZXNzYWdlIik7CisJfTsKKwl0aGlzLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2V4cGVyaW1lbnRhbC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9leHBlcmltZW50YWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllM2Q0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9leHBlcmltZW50YWwuanMKQEAgLTAsMCArMSwyMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsID0gZnVuY3Rpb24gKG1vZHVsZU5hbWUsIGV4dHJhKSB7CisJdmFyIG1lc3NhZ2UgPSAiRVhQRVJJTUVOVEFMOiAiICsgbW9kdWxlTmFtZTsKKwltZXNzYWdlICs9ICIgLS0gTm90IHlldCByZWFkeSBmb3IgdXNlLiAgQVBJcyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4iOworCWlmIChleHRyYSkgeworCQltZXNzYWdlICs9ICIgIiArIGV4dHJhOworCX0KKwlkb2pvLmRlYnVnKG1lc3NhZ2UpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2ZsYXNoLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2ZsYXNoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDEyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2guanMKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZmxhc2giKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnVyaS4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5jb21tb24iKTsKK2Rvam8uZmxhc2ggPSBmdW5jdGlvbiAoKSB7Cit9OworZG9qby5mbGFzaCA9IHtmbGFzaDZfdmVyc2lvbjpudWxsLCBmbGFzaDhfdmVyc2lvbjpudWxsLCByZWFkeTpmYWxzZSwgX3Zpc2libGU6dHJ1ZSwgX2xvYWRlZExpc3RlbmVyczpuZXcgQXJyYXkoKSwgX2luc3RhbGxpbmdMaXN0ZW5lcnM6bmV3IEFycmF5KCksIHNldFN3ZjpmdW5jdGlvbiAoZmlsZUluZm8pIHsKKwlpZiAoZmlsZUluZm8gPT0gbnVsbCB8fCBkb2pvLmxhbmcuaXNVbmRlZmluZWQoZmlsZUluZm8pKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGZpbGVJbmZvLmZsYXNoNiAhPSBudWxsICYmICFkb2pvLmxhbmcuaXNVbmRlZmluZWQoZmlsZUluZm8uZmxhc2g2KSkgeworCQl0aGlzLmZsYXNoNl92ZXJzaW9uID0gZmlsZUluZm8uZmxhc2g2OworCX0KKwlpZiAoZmlsZUluZm8uZmxhc2g4ICE9IG51bGwgJiYgIWRvam8ubGFuZy5pc1VuZGVmaW5lZChmaWxlSW5mby5mbGFzaDgpKSB7CisJCXRoaXMuZmxhc2g4X3ZlcnNpb24gPSBmaWxlSW5mby5mbGFzaDg7CisJfQorCWlmICghZG9qby5sYW5nLmlzVW5kZWZpbmVkKGZpbGVJbmZvLnZpc2libGUpKSB7CisJCXRoaXMuX3Zpc2libGUgPSBmaWxlSW5mby52aXNpYmxlOworCX0KKwl0aGlzLl9pbml0aWFsaXplKCk7Cit9LCB1c2VGbGFzaDY6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmZsYXNoNl92ZXJzaW9uID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmZsYXNoNl92ZXJzaW9uICE9IG51bGwgJiYgZG9qby5mbGFzaC5pbmZvLmNvbW1WZXJzaW9uID09IDYpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfSwgdXNlRmxhc2g4OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5mbGFzaDhfdmVyc2lvbiA9PSBudWxsKSB7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5mbGFzaDhfdmVyc2lvbiAhPSBudWxsICYmIGRvam8uZmxhc2guaW5mby5jb21tVmVyc2lvbiA9PSA4KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30sIGFkZExvYWRlZExpc3RlbmVyOmZ1bmN0aW9uIChsaXN0ZW5lcikgeworCXRoaXMuX2xvYWRlZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKK30sIGFkZEluc3RhbGxpbmdMaXN0ZW5lcjpmdW5jdGlvbiAobGlzdGVuZXIpIHsKKwl0aGlzLl9pbnN0YWxsaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworfSwgbG9hZGVkOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmZsYXNoLnJlYWR5ID0gdHJ1ZTsKKwlpZiAoZG9qby5mbGFzaC5fbG9hZGVkTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkb2pvLmZsYXNoLl9sb2FkZWRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkJCWRvam8uZmxhc2guX2xvYWRlZExpc3RlbmVyc1tpXS5jYWxsKG51bGwpOworCQl9CisJfQorfSwgaW5zdGFsbGluZzpmdW5jdGlvbiAoKSB7CisJaWYgKGRvam8uZmxhc2guX2luc3RhbGxpbmdMaXN0ZW5lcnMubGVuZ3RoID4gMCkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRvam8uZmxhc2guX2luc3RhbGxpbmdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkJCWRvam8uZmxhc2guX2luc3RhbGxpbmdMaXN0ZW5lcnNbaV0uY2FsbChudWxsKTsKKwkJfQorCX0KK30sIF9pbml0aWFsaXplOmZ1bmN0aW9uICgpIHsKKwl2YXIgaW5zdGFsbGVyID0gbmV3IGRvam8uZmxhc2guSW5zdGFsbCgpOworCWRvam8uZmxhc2guaW5zdGFsbGVyID0gaW5zdGFsbGVyOworCWlmIChpbnN0YWxsZXIubmVlZGVkKCkgPT0gdHJ1ZSkgeworCQlpbnN0YWxsZXIuaW5zdGFsbCgpOworCX0gZWxzZSB7CisJCWRvam8uZmxhc2gub2JqID0gbmV3IGRvam8uZmxhc2guRW1iZWQodGhpcy5fdmlzaWJsZSk7CisJCWRvam8uZmxhc2gub2JqLndyaXRlKGRvam8uZmxhc2guaW5mby5jb21tVmVyc2lvbik7CisJCWRvam8uZmxhc2guY29tbSA9IG5ldyBkb2pvLmZsYXNoLkNvbW11bmljYXRvcigpOworCX0KK319OworZG9qby5mbGFzaC5JbmZvID0gZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWRvY3VtZW50LndyaXRlbG4oIjxzY3JpcHQgbGFuZ3VhZ2U9XCJWQlNjcmlwdFwiIHR5cGU9XCJ0ZXh0L3Zic2NyaXB0XCI+Iik7CisJCWRvY3VtZW50LndyaXRlbG4oIkZ1bmN0aW9uIFZCR2V0U3dmVmVyKGkpIik7CisJCWRvY3VtZW50LndyaXRlbG4oIiAgb24gZXJyb3IgcmVzdW1lIG5leHQiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiICBEaW0gc3dDb250cm9sLCBzd1ZlcnNpb24iKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiICBzd1ZlcnNpb24gPSAwIik7CisJCWRvY3VtZW50LndyaXRlbG4oIiAgc2V0IHN3Q29udHJvbCA9IENyZWF0ZU9iamVjdChcIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLlwiICsgQ1N0cihpKSkiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiICBpZiAoSXNPYmplY3Qoc3dDb250cm9sKSkgdGhlbiIpOworCQlkb2N1bWVudC53cml0ZWxuKCIJc3dWZXJzaW9uID0gc3dDb250cm9sLkdldFZhcmlhYmxlKFwiJHZlcnNpb25cIikiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiICBlbmQgaWYiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiICBWQkdldFN3ZlZlciA9IHN3VmVyc2lvbiIpOworCQlkb2N1bWVudC53cml0ZWxuKCJFbmQgRnVuY3Rpb24iKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiPC9zY3JpcHQ+Iik7CisJfQorCXRoaXMuX2RldGVjdFZlcnNpb24oKTsKKwl0aGlzLl9kZXRlY3RDb21tdW5pY2F0aW9uVmVyc2lvbigpOworfTsKK2Rvam8uZmxhc2guSW5mby5wcm90b3R5cGUgPSB7dmVyc2lvbjotMSwgdmVyc2lvbk1ham9yOi0xLCB2ZXJzaW9uTWlub3I6LTEsIHZlcnNpb25SZXZpc2lvbjotMSwgY2FwYWJsZTpmYWxzZSwgY29tbVZlcnNpb246NiwgaW5zdGFsbGluZzpmYWxzZSwgaXNWZXJzaW9uT3JBYm92ZTpmdW5jdGlvbiAocmVxTWFqb3JWZXIsIHJlcU1pbm9yVmVyLCByZXFWZXIpIHsKKwlyZXFWZXIgPSBwYXJzZUZsb2F0KCIuIiArIHJlcVZlcik7CisJaWYgKHRoaXMudmVyc2lvbk1ham9yID49IHJlcU1ham9yVmVyICYmIHRoaXMudmVyc2lvbk1pbm9yID49IHJlcU1pbm9yVmVyICYmIHRoaXMudmVyc2lvblJldmlzaW9uID49IHJlcVZlcikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfSwgX2RldGVjdFZlcnNpb246ZnVuY3Rpb24gKCkgeworCXZhciB2ZXJzaW9uU3RyOworCWZvciAodmFyIHRlc3RWZXJzaW9uID0gMjU7IHRlc3RWZXJzaW9uID4gMDsgdGVzdFZlcnNpb24tLSkgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJdmVyc2lvblN0ciA9IFZCR2V0U3dmVmVyKHRlc3RWZXJzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCXZlcnNpb25TdHIgPSB0aGlzLl9KU0ZsYXNoSW5mbyh0ZXN0VmVyc2lvbik7CisJCX0KKwkJaWYgKHZlcnNpb25TdHIgPT0gLTEpIHsKKwkJCXRoaXMuY2FwYWJsZSA9IGZhbHNlOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKHZlcnNpb25TdHIgIT0gMCkgeworCQkJCXZhciB2ZXJzaW9uQXJyYXk7CisJCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCQkJdmFyIHRlbXBBcnJheSA9IHZlcnNpb25TdHIuc3BsaXQoIiAiKTsKKwkJCQkJdmFyIHRlbXBTdHJpbmcgPSB0ZW1wQXJyYXlbMV07CisJCQkJCXZlcnNpb25BcnJheSA9IHRlbXBTdHJpbmcuc3BsaXQoIiwiKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2ZXJzaW9uQXJyYXkgPSB2ZXJzaW9uU3RyLnNwbGl0KCIuIik7CisJCQkJfQorCQkJCXRoaXMudmVyc2lvbk1ham9yID0gdmVyc2lvbkFycmF5WzBdOworCQkJCXRoaXMudmVyc2lvbk1pbm9yID0gdmVyc2lvbkFycmF5WzFdOworCQkJCXRoaXMudmVyc2lvblJldmlzaW9uID0gdmVyc2lvbkFycmF5WzJdOworCQkJCXZhciB2ZXJzaW9uU3RyaW5nID0gdGhpcy52ZXJzaW9uTWFqb3IgKyAiLiIgKyB0aGlzLnZlcnNpb25SZXZpc2lvbjsKKwkJCQl0aGlzLnZlcnNpb24gPSBwYXJzZUZsb2F0KHZlcnNpb25TdHJpbmcpOworCQkJCXRoaXMuY2FwYWJsZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9LCBfSlNGbGFzaEluZm86ZnVuY3Rpb24gKHRlc3RWZXJzaW9uKSB7CisJaWYgKG5hdmlnYXRvci5wbHVnaW5zICE9IG51bGwgJiYgbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoID4gMCkgeworCQlpZiAobmF2aWdhdG9yLnBsdWdpbnNbIlNob2Nrd2F2ZSBGbGFzaCAyLjAiXSB8fCBuYXZpZ2F0b3IucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIl0pIHsKKwkJCXZhciBzd1ZlcjIgPSBuYXZpZ2F0b3IucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIDIuMCJdID8gIiAyLjAiIDogIiI7CisJCQl2YXIgZmxhc2hEZXNjcmlwdGlvbiA9IG5hdmlnYXRvci5wbHVnaW5zWyJTaG9ja3dhdmUgRmxhc2giICsgc3dWZXIyXS5kZXNjcmlwdGlvbjsKKwkJCXZhciBkZXNjQXJyYXkgPSBmbGFzaERlc2NyaXB0aW9uLnNwbGl0KCIgIik7CisJCQl2YXIgdGVtcEFycmF5TWFqb3IgPSBkZXNjQXJyYXlbMl0uc3BsaXQoIi4iKTsKKwkJCXZhciB2ZXJzaW9uTWFqb3IgPSB0ZW1wQXJyYXlNYWpvclswXTsKKwkJCXZhciB2ZXJzaW9uTWlub3IgPSB0ZW1wQXJyYXlNYWpvclsxXTsKKwkJCWlmIChkZXNjQXJyYXlbM10gIT0gIiIpIHsKKwkJCQl2YXIgdGVtcEFycmF5TWlub3IgPSBkZXNjQXJyYXlbM10uc3BsaXQoInIiKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIHRlbXBBcnJheU1pbm9yID0gZGVzY0FycmF5WzRdLnNwbGl0KCJyIik7CisJCQl9CisJCQl2YXIgdmVyc2lvblJldmlzaW9uID0gdGVtcEFycmF5TWlub3JbMV0gPiAwID8gdGVtcEFycmF5TWlub3JbMV0gOiAwOworCQkJdmFyIHZlcnNpb24gPSB2ZXJzaW9uTWFqb3IgKyAiLiIgKyB2ZXJzaW9uTWlub3IgKyAiLiIgKyB2ZXJzaW9uUmV2aXNpb247CisJCQlyZXR1cm4gdmVyc2lvbjsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9LCBfZGV0ZWN0Q29tbXVuaWNhdGlvblZlcnNpb246ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmNhcGFibGUgPT0gZmFsc2UpIHsKKwkJdGhpcy5jb21tVmVyc2lvbiA9IG51bGw7CisJCXJldHVybjsKKwl9CisJaWYgKHR5cGVvZiBkakNvbmZpZ1siZm9yY2VGbGFzaENvbW0iXSAhPSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZGpDb25maWdbImZvcmNlRmxhc2hDb21tIl0gIT0gbnVsbCkgeworCQl0aGlzLmNvbW1WZXJzaW9uID0gZGpDb25maWdbImZvcmNlRmxhc2hDb21tIl07CisJCXJldHVybjsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpID09IHRydWUgfHwgZG9qby5yZW5kZXIuaHRtbC5vcGVyYSA9PSB0cnVlKSB7CisJCXRoaXMuY29tbVZlcnNpb24gPSA4OworCX0gZWxzZSB7CisJCXRoaXMuY29tbVZlcnNpb24gPSA2OworCX0KK319OworZG9qby5mbGFzaC5FbWJlZCA9IGZ1bmN0aW9uICh2aXNpYmxlKSB7CisJdGhpcy5fdmlzaWJsZSA9IHZpc2libGU7Cit9OworZG9qby5mbGFzaC5FbWJlZC5wcm90b3R5cGUgPSB7d2lkdGg6MjE1LCBoZWlnaHQ6MTM4LCBpZDoiZmxhc2hPYmplY3QiLCBfdmlzaWJsZTp0cnVlLCBwcm90b2NvbDpmdW5jdGlvbiAoKSB7CisJc3dpdGNoICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpIHsKKwkgIGNhc2UgImh0dHBzOiI6CisJCXJldHVybiAiaHR0cHMiOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXJldHVybiAiaHR0cCI7CisJCWJyZWFrOworCX0KK30sIHdyaXRlOmZ1bmN0aW9uIChmbGFzaFZlciwgZG9FeHByZXNzSW5zdGFsbCkgeworCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoZG9FeHByZXNzSW5zdGFsbCkpIHsKKwkJZG9FeHByZXNzSW5zdGFsbCA9IGZhbHNlOworCX0KKwl2YXIgY29udGFpbmVyU3R5bGUgPSBuZXcgZG9qby5zdHJpbmcuQnVpbGRlcigpOworCWNvbnRhaW5lclN0eWxlLmFwcGVuZCgid2lkdGg6ICIgKyB0aGlzLndpZHRoICsgInB4OyAiKTsKKwljb250YWluZXJTdHlsZS5hcHBlbmQoImhlaWdodDogIiArIHRoaXMuaGVpZ2h0ICsgInB4OyAiKTsKKwlpZiAodGhpcy5fdmlzaWJsZSA9PSBmYWxzZSkgeworCQljb250YWluZXJTdHlsZS5hcHBlbmQoInBvc2l0aW9uOiBhYnNvbHV0ZTsgIik7CisJCWNvbnRhaW5lclN0eWxlLmFwcGVuZCgiei1pbmRleDogMTAwMDA7ICIpOworCQljb250YWluZXJTdHlsZS5hcHBlbmQoInRvcDogLTEwMDBweDsgIik7CisJCWNvbnRhaW5lclN0eWxlLmFwcGVuZCgibGVmdDogLTEwMDBweDsgIik7CisJfQorCWNvbnRhaW5lclN0eWxlID0gY29udGFpbmVyU3R5bGUudG9TdHJpbmcoKTsKKwl2YXIgb2JqZWN0SFRNTDsKKwl2YXIgc3dmbG9jOworCWlmIChmbGFzaFZlciA9PSA2KSB7CisJCXN3ZmxvYyA9IGRvam8uZmxhc2guZmxhc2g2X3ZlcnNpb247CisJCXZhciBkb2pvUGF0aCA9IGRqQ29uZmlnLmJhc2VSZWxhdGl2ZVBhdGg7CisJCXN3ZmxvYyA9IHN3ZmxvYyArICI/YmFzZVJlbGF0aXZlUGF0aD0iICsgZXNjYXBlKGRvam9QYXRoKTsKKwkJb2JqZWN0SFRNTCA9ICI8ZW1iZWQgaWQ9XCIiICsgdGhpcy5pZCArICJcIiBzcmM9XCIiICsgc3dmbG9jICsgIlwiICIgKyAiCXF1YWxpdHk9XCJoaWdoXCIgYmdjb2xvcj1cIiNmZmZmZmZcIiAiICsgIgl3aWR0aD1cIiIgKyB0aGlzLndpZHRoICsgIlwiIGhlaWdodD1cIiIgKyB0aGlzLmhlaWdodCArICJcIiAiICsgIgluYW1lPVwiIiArIHRoaXMuaWQgKyAiXCIgIiArICIJYWxpZ249XCJtaWRkbGVcIiBhbGxvd1NjcmlwdEFjY2Vzcz1cInNhbWVEb21haW5cIiAiICsgIgl0eXBlPVwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIiBzd0xpdmVDb25uZWN0PVwidHJ1ZVwiICIgKyAiCXBsdWdpbnNwYWdlPVwiIiArIHRoaXMucHJvdG9jb2woKSArICI6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXJcIj4iOworCX0gZWxzZSB7CisJCXN3ZmxvYyA9IGRvam8uZmxhc2guZmxhc2g4X3ZlcnNpb247CisJCXZhciBzd2Zsb2NPYmplY3QgPSBzd2Zsb2M7CisJCXZhciBzd2Zsb2NFbWJlZCA9IHN3ZmxvYzsKKwkJdmFyIGRvam9QYXRoID0gZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aDsKKwkJaWYgKGRvRXhwcmVzc0luc3RhbGwpIHsKKwkJCXZhciByZWRpcmVjdFVSTCA9IGVzY2FwZSh3aW5kb3cubG9jYXRpb24pOworCQkJZG9jdW1lbnQudGl0bGUgPSBkb2N1bWVudC50aXRsZS5zbGljZSgwLCA0NykgKyAiIC0gRmxhc2ggUGxheWVyIEluc3RhbGxhdGlvbiI7CisJCQl2YXIgZG9jVGl0bGUgPSBlc2NhcGUoZG9jdW1lbnQudGl0bGUpOworCQkJc3dmbG9jT2JqZWN0ICs9ICI/TU1yZWRpcmVjdFVSTD0iICsgcmVkaXJlY3RVUkwgKyAiJk1NcGxheWVyVHlwZT1BY3RpdmVYIiArICImTU1kb2N0aXRsZT0iICsgZG9jVGl0bGUgKyAiJmJhc2VSZWxhdGl2ZVBhdGg9IiArIGVzY2FwZShkb2pvUGF0aCk7CisJCQlzd2Zsb2NFbWJlZCArPSAiP01NcmVkaXJlY3RVUkw9IiArIHJlZGlyZWN0VVJMICsgIiZNTXBsYXllclR5cGU9UGx1Z0luIiArICImYmFzZVJlbGF0aXZlUGF0aD0iICsgZXNjYXBlKGRvam9QYXRoKTsKKwkJfQorCQlpZiAoc3dmbG9jRW1iZWQuaW5kZXhPZigiPyIpID09IC0xKSB7CisJCQlzd2Zsb2NFbWJlZCArPSAiP2Jhc2VSZWxhdGl2ZVBhdGg9IiArIGVzY2FwZShkb2pvUGF0aCkgKyAiJyAiOworCQl9CisJCW9iamVjdEhUTUwgPSAiPG9iamVjdCBjbGFzc2lkPVwiY2xzaWQ6ZDI3Y2RiNmUtYWU2ZC0xMWNmLTk2YjgtNDQ0NTUzNTQwMDAwXCIgIiArICJjb2RlYmFzZT1cIiIgKyB0aGlzLnByb3RvY29sKCkgKyAiOi8vZnBkb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvIiArICJzd2ZsYXNoLmNhYiN2ZXJzaW9uPTgsMCwwLDBcIiAiICsgIndpZHRoPVwiIiArIHRoaXMud2lkdGggKyAiXCIgIiArICJoZWlnaHQ9XCIiICsgdGhpcy5oZWlnaHQgKyAiXCIgIiArICJpZD1cIiIgKyB0aGlzLmlkICsgIlwiICIgKyAiYWxpZ249XCJtaWRkbGVcIj4gIiArICI8cGFyYW0gbmFtZT1cImFsbG93U2NyaXB0QWNjZXNzXCIgdmFsdWU9XCJzYW1lRG9tYWluXCIgLz4gIiArICI8cGFyYW0gbmFtZT1cIm1vdmllXCIgdmFsdWU9XCIiICsgc3dmbG9jT2JqZWN0ICsgIlwiIC8+ICIgKyAiPHBhcmFtIG5hbWU9XCJxdWFsaXR5XCIgdmFsdWU9XCJoaWdoXCIgLz4gIiArICI8cGFyYW0gbmFtZT1cImJnY29sb3JcIiB2YWx1ZT1cIiNmZmZmZmZcIiAvPiAiICsgIjxlbWJlZCBzcmM9XCIiICsgc3dmbG9jRW1iZWQgKyAiJyAiICsgInF1YWxpdHk9XCJoaWdoXCIgIiArICJiZ2NvbG9yPVwiI2ZmZmZmZlwiICIgKyAid2lkdGg9XCIiICsgdGhpcy53aWR0aCArICJcIiAiICsgImhlaWdodD1cIiIgKyB0aGlzLmhlaWdodCArICJcIiAiICsgImlkPVwiIiArIHRoaXMuaWQgKyAiXCIgIiArICJuYW1lPVwiIiArIHRoaXMuaWQgKyAiXCIgIiArICJzd0xpdmVDb25uZWN0PVwidHJ1ZVwiICIgKyAiYWxpZ249XCJtaWRkbGVcIiAiICsgImFsbG93U2NyaXB0QWNjZXNzPVwic2FtZURvbWFpblwiICIgKyAidHlwZT1cImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoXCIgIiArICJwbHVnaW5zcGFnZT1cIiIgKyB0aGlzLnByb3RvY29sKCkgKyAiOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyXCIgLz4iICsgIjwvb2JqZWN0PiI7CisJfQorCW9iamVjdEhUTUwgPSAiPGRpdiBpZD1cIiIgKyB0aGlzLmlkICsgIkNvbnRhaW5lclwiIHN0eWxlPVwiIiArIGNvbnRhaW5lclN0eWxlICsgIlwiPiAiICsgb2JqZWN0SFRNTCArICI8L2Rpdj4iOworCWRvY3VtZW50LndyaXRlbG4ob2JqZWN0SFRNTCk7Cit9LCBnZXQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTsKK30sIHNldFZpc2libGU6ZnVuY3Rpb24gKHZpc2libGUpIHsKKwl2YXIgY29udGFpbmVyID0gZG9qby5ieUlkKHRoaXMuaWQgKyAiQ29udGFpbmVyIik7CisJaWYgKHZpc2libGUgPT0gdHJ1ZSkgeworCQljb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKKwl9IGVsc2UgeworCQljb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQljb250YWluZXIuc3R5bGUueCA9ICItMTAwMHB4IjsKKwkJY29udGFpbmVyLnN0eWxlLnkgPSAiLTEwMDBweCI7CisJCWNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CisJfQorfSwgY2VudGVyOmZ1bmN0aW9uICgpIHsKKwl2YXIgZWxlbWVudFdpZHRoID0gdGhpcy53aWR0aDsKKwl2YXIgZWxlbWVudEhlaWdodCA9IHRoaXMuaGVpZ2h0OworCXZhciBzY3JvbGxfb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwl2YXIgdmlld3BvcnRfc2l6ZSA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCXZhciB4ID0gc2Nyb2xsX29mZnNldC54ICsgKHZpZXdwb3J0X3NpemUud2lkdGggLSBlbGVtZW50V2lkdGgpIC8gMjsKKwl2YXIgeSA9IHNjcm9sbF9vZmZzZXQueSArICh2aWV3cG9ydF9zaXplLmhlaWdodCAtIGVsZW1lbnRIZWlnaHQpIC8gMjsKKwl2YXIgY29udGFpbmVyID0gZG9qby5ieUlkKHRoaXMuaWQgKyAiQ29udGFpbmVyIik7CisJY29udGFpbmVyLnN0eWxlLnRvcCA9IHkgKyAicHgiOworCWNvbnRhaW5lci5zdHlsZS5sZWZ0ID0geCArICJweCI7Cit9fTsKK2Rvam8uZmxhc2guQ29tbXVuaWNhdG9yID0gZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmZsYXNoLnVzZUZsYXNoNigpKSB7CisJCXRoaXMuX3dyaXRlRmxhc2g2KCk7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8uZmxhc2gudXNlRmxhc2g4KCkpIHsKKwkJCXRoaXMuX3dyaXRlRmxhc2g4KCk7CisJCX0KKwl9Cit9OworZG9qby5mbGFzaC5Db21tdW5pY2F0b3IucHJvdG90eXBlID0ge193cml0ZUZsYXNoNjpmdW5jdGlvbiAoKSB7CisJdmFyIGlkID0gZG9qby5mbGFzaC5vYmouaWQ7CisJZG9jdW1lbnQud3JpdGVsbigiPHNjcmlwdCBsYW5ndWFnZT1cIkphdmFTY3JpcHRcIj4iKTsKKwlkb2N1bWVudC53cml0ZWxuKCIgIGZ1bmN0aW9uICIgKyBpZCArICJfRG9GU0NvbW1hbmQoY29tbWFuZCwgYXJncyl7ICIpOworCWRvY3VtZW50LndyaXRlbG4oIglkb2pvLmZsYXNoLmNvbW0uX2hhbmRsZUZTQ29tbWFuZChjb21tYW5kLCBhcmdzKTsgIik7CisJZG9jdW1lbnQud3JpdGVsbigifSIpOworCWRvY3VtZW50LndyaXRlbG4oIjwvc2NyaXB0PiIpOworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWRvY3VtZW50LndyaXRlbG4oIjxTQ1JJUFQgTEFOR1VBR0U9VkJTY3JpcHQ+ICIpOworCQlkb2N1bWVudC53cml0ZWxuKCJvbiBlcnJvciByZXN1bWUgbmV4dCAiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiU3ViICIgKyBpZCArICJfRlNDb21tYW5kKEJ5VmFsIGNvbW1hbmQsIEJ5VmFsIGFyZ3MpIik7CisJCWRvY3VtZW50LndyaXRlbG4oIiBjYWxsICIgKyBpZCArICJfRG9GU0NvbW1hbmQoY29tbWFuZCwgYXJncykiKTsKKwkJZG9jdW1lbnQud3JpdGVsbigiZW5kIHN1YiIpOworCQlkb2N1bWVudC53cml0ZWxuKCI8L1NDUklQVD4gIik7CisJfQorfSwgX3dyaXRlRmxhc2g4OmZ1bmN0aW9uICgpIHsKK30sIF9oYW5kbGVGU0NvbW1hbmQ6ZnVuY3Rpb24gKGNvbW1hbmQsIGFyZ3MpIHsKKwlpZiAoY29tbWFuZCAhPSBudWxsICYmICFkb2pvLmxhbmcuaXNVbmRlZmluZWQoY29tbWFuZCkgJiYgL15GU0NvbW1hbmQ6KC4qKS8udGVzdChjb21tYW5kKSA9PSB0cnVlKSB7CisJCWNvbW1hbmQgPSBjb21tYW5kLm1hdGNoKC9eRlNDb21tYW5kOiguKikvKVsxXTsKKwl9CisJaWYgKGNvbW1hbmQgPT0gImFkZENhbGxiYWNrIikgeworCQl0aGlzLl9mc2NvbW1hbmRBZGRDYWxsYmFjayhjb21tYW5kLCBhcmdzKTsKKwl9IGVsc2UgeworCQlpZiAoY29tbWFuZCA9PSAiY2FsbCIpIHsKKwkJCXRoaXMuX2ZzY29tbWFuZENhbGwoY29tbWFuZCwgYXJncyk7CisJCX0gZWxzZSB7CisJCQlpZiAoY29tbWFuZCA9PSAiZnNjb21tYW5kUmVhZHkiKSB7CisJCQkJdGhpcy5fZnNjb21tYW5kUmVhZHkoKTsKKwkJCX0KKwkJfQorCX0KK30sIF9mc2NvbW1hbmRBZGRDYWxsYmFjazpmdW5jdGlvbiAoY29tbWFuZCwgYXJncykgeworCXZhciBmdW5jdGlvbk5hbWUgPSBhcmdzOworCXZhciBjYWxsRnVuYyA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIGRvam8uZmxhc2guY29tbS5fY2FsbChmdW5jdGlvbk5hbWUsIGFyZ3VtZW50cyk7CisJfTsKKwlkb2pvLmZsYXNoLmNvbW1bZnVuY3Rpb25OYW1lXSA9IGNhbGxGdW5jOworCWRvam8uZmxhc2gub2JqLmdldCgpLlNldFZhcmlhYmxlKCJfc3VjY2VlZGVkIiwgdHJ1ZSk7Cit9LCBfZnNjb21tYW5kQ2FsbDpmdW5jdGlvbiAoY29tbWFuZCwgYXJncykgeworCXZhciBwbHVnaW4gPSBkb2pvLmZsYXNoLm9iai5nZXQoKTsKKwl2YXIgZnVuY3Rpb25OYW1lID0gYXJnczsKKwl2YXIgbnVtQXJncyA9IHBhcnNlSW50KHBsdWdpbi5HZXRWYXJpYWJsZSgiX251bUFyZ3MiKSk7CisJdmFyIGZsYXNoQXJncyA9IG5ldyBBcnJheSgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisJCXZhciBjdXJyZW50QXJnID0gcGx1Z2luLkdldFZhcmlhYmxlKCJfIiArIGkpOworCQlmbGFzaEFyZ3MucHVzaChjdXJyZW50QXJnKTsKKwl9CisJdmFyIHJ1bk1lOworCWlmIChmdW5jdGlvbk5hbWUuaW5kZXhPZigiLiIpID09IC0xKSB7CisJCXJ1bk1lID0gd2luZG93W2Z1bmN0aW9uTmFtZV07CisJfSBlbHNlIHsKKwkJcnVuTWUgPSBldmFsKGZ1bmN0aW9uTmFtZSk7CisJfQorCXZhciByZXN1bHRzID0gbnVsbDsKKwlpZiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChydW5NZSkgJiYgcnVuTWUgIT0gbnVsbCkgeworCQlyZXN1bHRzID0gcnVuTWUuYXBwbHkobnVsbCwgZmxhc2hBcmdzKTsKKwl9CisJcGx1Z2luLlNldFZhcmlhYmxlKCJfcmV0dXJuUmVzdWx0IiwgcmVzdWx0cyk7Cit9LCBfZnNjb21tYW5kUmVhZHk6ZnVuY3Rpb24gKCkgeworCXZhciBwbHVnaW4gPSBkb2pvLmZsYXNoLm9iai5nZXQoKTsKKwlwbHVnaW4uU2V0VmFyaWFibGUoImZzY29tbWFuZFJlYWR5IiwgInRydWUiKTsKK30sIF9jYWxsOmZ1bmN0aW9uIChmdW5jdGlvbk5hbWUsIGFyZ3MpIHsKKwl2YXIgcGx1Z2luID0gZG9qby5mbGFzaC5vYmouZ2V0KCk7CisJcGx1Z2luLlNldFZhcmlhYmxlKCJfZnVuY3Rpb25OYW1lIiwgZnVuY3Rpb25OYW1lKTsKKwlwbHVnaW4uU2V0VmFyaWFibGUoIl9udW1BcmdzIiwgYXJncy5sZW5ndGgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQl2YXIgdmFsdWUgPSBhcmdzW2ldOworCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1wwL2csICJcXDAiKTsKKwkJcGx1Z2luLlNldFZhcmlhYmxlKCJfIiArIGksIHZhbHVlKTsKKwl9CisJcGx1Z2luLlRDYWxsTGFiZWwoIi9fZmxhc2hSdW5uZXIiLCAiZXhlY3V0ZSIpOworCXZhciByZXN1bHRzID0gcGx1Z2luLkdldFZhcmlhYmxlKCJfcmV0dXJuUmVzdWx0Iik7CisJcmVzdWx0cyA9IHJlc3VsdHMucmVwbGFjZSgvXFwwL2csICJceDAwIik7CisJcmV0dXJuIHJlc3VsdHM7Cit9LCBfYWRkRXh0ZXJuYWxJbnRlcmZhY2VDYWxsYmFjazpmdW5jdGlvbiAobWV0aG9kTmFtZSkgeworCXZhciB3cmFwcGVyQ2FsbCA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIG1ldGhvZEFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQltZXRob2RBcmdzW2ldID0gYXJndW1lbnRzW2ldOworCQl9CisJCXJldHVybiBkb2pvLmZsYXNoLmNvbW0uX2V4ZWNGbGFzaChtZXRob2ROYW1lLCBtZXRob2RBcmdzKTsKKwl9OworCWRvam8uZmxhc2guY29tbVttZXRob2ROYW1lXSA9IHdyYXBwZXJDYWxsOworfSwgX2VuY29kZURhdGE6ZnVuY3Rpb24gKGRhdGEpIHsKKwl2YXIgZW50aXR5UkUgPSAvXCYoW147XSopXDsvZzsKKwlkYXRhID0gZGF0YS5yZXBsYWNlKGVudGl0eVJFLCAiJmFtcDskMTsiKTsKKwlkYXRhID0gZGF0YS5yZXBsYWNlKC88L2csICImbHQ7Iik7CisJZGF0YSA9IGRhdGEucmVwbGFjZSgvPi9nLCAiJmd0OyIpOworCWRhdGEgPSBkYXRhLnJlcGxhY2UoIlxcIiwgIiZjdXN0b21fYmFja3NsYXNoOyZjdXN0b21fYmFja3NsYXNoOyIpOworCWRhdGEgPSBkYXRhLnJlcGxhY2UoL1xuL2csICJcXG4iKTsKKwlkYXRhID0gZGF0YS5yZXBsYWNlKC9cci9nLCAiXFxyIik7CisJZGF0YSA9IGRhdGEucmVwbGFjZSgvXGYvZywgIlxcZiIpOworCWRhdGEgPSBkYXRhLnJlcGxhY2UoL1wwL2csICJcXDAiKTsKKwlkYXRhID0gZGF0YS5yZXBsYWNlKC9cJy9nLCAiXFwnIik7CisJZGF0YSA9IGRhdGEucmVwbGFjZSgvXCIvZywgIlxcXCIiKTsKKwlyZXR1cm4gZGF0YTsKK30sIF9kZWNvZGVEYXRhOmZ1bmN0aW9uIChkYXRhKSB7CisJaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSA9PSAidW5kZWZpbmVkIikgeworCQlyZXR1cm4gZGF0YTsKKwl9CisJZGF0YSA9IGRhdGEucmVwbGFjZSgvXCZjdXN0b21fbHRcOy9nLCAiPCIpOworCWRhdGEgPSBkYXRhLnJlcGxhY2UoL1wmY3VzdG9tX2d0XDsvZywgIj4iKTsKKwlkYXRhID0gZXZhbCgiXCIiICsgZGF0YSArICJcIiIpOworCXJldHVybiBkYXRhOworfSwgX2NodW5rQXJndW1lbnREYXRhOmZ1bmN0aW9uICh2YWx1ZSwgYXJnSW5kZXgpIHsKKwl2YXIgcGx1Z2luID0gZG9qby5mbGFzaC5vYmouZ2V0KCk7CisJdmFyIG51bVNlZ21lbnRzID0gTWF0aC5jZWlsKHZhbHVlLmxlbmd0aCAvIDEwMjQpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtU2VnbWVudHM7IGkrKykgeworCQl2YXIgc3RhcnRDdXQgPSBpICogMTAyNDsKKwkJdmFyIGVuZEN1dCA9IGkgKiAxMDI0ICsgMTAyNDsKKwkJaWYgKGkgPT0gKG51bVNlZ21lbnRzIC0gMSkpIHsKKwkJCWVuZEN1dCA9IGkgKiAxMDI0ICsgdmFsdWUubGVuZ3RoOworCQl9CisJCXZhciBwaWVjZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydEN1dCwgZW5kQ3V0KTsKKwkJcGllY2UgPSB0aGlzLl9lbmNvZGVEYXRhKHBpZWNlKTsKKwkJcGx1Z2luLkNhbGxGdW5jdGlvbigiPGludm9rZSBuYW1lPVwiY2h1bmtBcmd1bWVudERhdGFcIiAiICsgInJldHVybnR5cGU9XCJqYXZhc2NyaXB0XCI+IiArICI8YXJndW1lbnRzPiIgKyAiPHN0cmluZz4iICsgcGllY2UgKyAiPC9zdHJpbmc+IiArICI8bnVtYmVyPiIgKyBhcmdJbmRleCArICI8L251bWJlcj4iICsgIjwvYXJndW1lbnRzPiIgKyAiPC9pbnZva2U+Iik7CisJfQorfSwgX2NodW5rUmV0dXJuRGF0YTpmdW5jdGlvbiAoKSB7CisJdmFyIHBsdWdpbiA9IGRvam8uZmxhc2gub2JqLmdldCgpOworCXZhciBudW1TZWdtZW50cyA9IHBsdWdpbi5nZXRSZXR1cm5MZW5ndGgoKTsKKwl2YXIgcmVzdWx0c0FycmF5ID0gbmV3IEFycmF5KCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1TZWdtZW50czsgaSsrKSB7CisJCXZhciBwaWVjZSA9IHBsdWdpbi5DYWxsRnVuY3Rpb24oIjxpbnZva2UgbmFtZT1cImNodW5rUmV0dXJuRGF0YVwiICIgKyAicmV0dXJudHlwZT1cImphdmFzY3JpcHRcIj4iICsgIjxhcmd1bWVudHM+IiArICI8bnVtYmVyPiIgKyBpICsgIjwvbnVtYmVyPiIgKyAiPC9hcmd1bWVudHM+IiArICI8L2ludm9rZT4iKTsKKwkJaWYgKHBpZWNlID09ICJcIlwiIiB8fCBwaWVjZSA9PSAiJyciKSB7CisJCQlwaWVjZSA9ICIiOworCQl9IGVsc2UgeworCQkJcGllY2UgPSBwaWVjZS5zdWJzdHJpbmcoMSwgcGllY2UubGVuZ3RoIC0gMSk7CisJCX0KKwkJcmVzdWx0c0FycmF5LnB1c2gocGllY2UpOworCX0KKwl2YXIgcmVzdWx0cyA9IHJlc3VsdHNBcnJheS5qb2luKCIiKTsKKwlyZXR1cm4gcmVzdWx0czsKK30sIF9leGVjRmxhc2g6ZnVuY3Rpb24gKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MpIHsKKwl2YXIgcGx1Z2luID0gZG9qby5mbGFzaC5vYmouZ2V0KCk7CisJcGx1Z2luLnN0YXJ0RXhlYygpOworCXBsdWdpbi5zZXROdW1iZXJBcmd1bWVudHMobWV0aG9kQXJncy5sZW5ndGgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbWV0aG9kQXJncy5sZW5ndGg7IGkrKykgeworCQl0aGlzLl9jaHVua0FyZ3VtZW50RGF0YShtZXRob2RBcmdzW2ldLCBpKTsKKwl9CisJcGx1Z2luLmV4ZWMobWV0aG9kTmFtZSk7CisJdmFyIHJlc3VsdHMgPSB0aGlzLl9jaHVua1JldHVybkRhdGEoKTsKKwlyZXN1bHRzID0gdGhpcy5fZGVjb2RlRGF0YShyZXN1bHRzKTsKKwlwbHVnaW4uZW5kRXhlYygpOworCXJldHVybiByZXN1bHRzOworfX07Citkb2pvLmZsYXNoLkluc3RhbGwgPSBmdW5jdGlvbiAoKSB7Cit9OworZG9qby5mbGFzaC5JbnN0YWxsLnByb3RvdHlwZSA9IHtuZWVkZWQ6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmZsYXNoLmluZm8uY2FwYWJsZSA9PSBmYWxzZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGRvam8ucmVuZGVyLm9zLm1hYyA9PSB0cnVlICYmICFkb2pvLmZsYXNoLmluZm8uaXNWZXJzaW9uT3JBYm92ZSg4LCAwLCAwKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKCFkb2pvLmZsYXNoLmluZm8uaXNWZXJzaW9uT3JBYm92ZSg2LCAwLCAwKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgaW5zdGFsbDpmdW5jdGlvbiAoKSB7CisJZG9qby5mbGFzaC5pbmZvLmluc3RhbGxpbmcgPSB0cnVlOworCWRvam8uZmxhc2guaW5zdGFsbGluZygpOworCWlmIChkb2pvLmZsYXNoLmluZm8uY2FwYWJsZSA9PSBmYWxzZSkgeworCQl2YXIgaW5zdGFsbE9iaiA9IG5ldyBkb2pvLmZsYXNoLkVtYmVkKGZhbHNlKTsKKwkJaW5zdGFsbE9iai53cml0ZSg4KTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5mbGFzaC5pbmZvLmlzVmVyc2lvbk9yQWJvdmUoNiwgMCwgNjUpKSB7CisJCQl2YXIgaW5zdGFsbE9iaiA9IG5ldyBkb2pvLmZsYXNoLkVtYmVkKGZhbHNlKTsKKwkJCWluc3RhbGxPYmoud3JpdGUoOCwgdHJ1ZSk7CisJCQlpbnN0YWxsT2JqLnNldFZpc2libGUodHJ1ZSk7CisJCQlpbnN0YWxsT2JqLmNlbnRlcigpOworCQl9IGVsc2UgeworCQkJYWxlcnQoIlRoaXMgY29udGVudCByZXF1aXJlcyBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgdGhlIE1hY3JvbWVkaWEgIiArICIgRmxhc2ggUGxheWVyLiIpOworCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSArZG9qby5mbGFzaC5FbWJlZC5wcm90b2NvbCgpICsgIjovL3d3dy5tYWNyb21lZGlhLmNvbS9nby9nZXRmbGFzaHBsYXllciI7CisJCX0KKwl9Cit9LCBfb25JbnN0YWxsU3RhdHVzOmZ1bmN0aW9uIChtc2cpIHsKKwlpZiAobXNnID09ICJEb3dubG9hZC5Db21wbGV0ZSIpIHsKKwkJZG9qby5mbGFzaC5faW5pdGlhbGl6ZSgpOworCX0gZWxzZSB7CisJCWlmIChtc2cgPT0gIkRvd25sb2FkLkNhbmNlbGxlZCIpIHsKKwkJCWFsZXJ0KCJUaGlzIGNvbnRlbnQgcmVxdWlyZXMgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBNYWNyb21lZGlhICIgKyAiIEZsYXNoIFBsYXllci4iKTsKKwkJCXdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG9qby5mbGFzaC5FbWJlZC5wcm90b2NvbCgpICsgIjovL3d3dy5tYWNyb21lZGlhLmNvbS9nby9nZXRmbGFzaHBsYXllciI7CisJCX0gZWxzZSB7CisJCQlpZiAobXNnID09ICJEb3dubG9hZC5GYWlsZWQiKSB7CisJCQkJYWxlcnQoIlRoZXJlIHdhcyBhbiBlcnJvciBkb3dubG9hZGluZyB0aGUgRmxhc2ggUGxheWVyIHVwZGF0ZS4gIiArICJQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLCBvciB2aXNpdCBtYWNyb21lZGlhLmNvbSB0byBkb3dubG9hZCAiICsgInRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRmxhc2ggcGx1Z2luLiIpOworCQkJfQorCQl9CisJfQorfX07Citkb2pvLmZsYXNoLmluZm8gPSBuZXcgZG9qby5mbGFzaC5JbmZvKCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9mbGFzaC9mbGFzaDYvRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2ZsYXNoL2ZsYXNoNi9Eb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlMWQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9mbGFzaC9mbGFzaDYvRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFzCkBAIC0wLDAgKzEsMjE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisvKiogCisJCUFuIGltcGxlbWVudGF0aW9uIG9mIEZsYXNoIDgncyBFeHRlcm5hbEludGVyZmFjZSB0aGF0IHdvcmtzIHdpdGggRmxhc2ggNgorCQlhbmQgd2hpY2ggaXMgc291cmNlLWNvbXBhdGlibGUgd2l0aCBGbGFzaCA4LiAKKwkJCisJCUBhdXRob3IgQnJhZCBOZXViZXJnLCBia24zQGNvbHVtYmlhLmVkdSAKKyovCisKK2NsYXNzIERvam9FeHRlcm5hbEludGVyZmFjZXsKKwlwdWJsaWMgc3RhdGljIHZhciBhdmFpbGFibGU6Qm9vbGVhbjsKKwlwdWJsaWMgc3RhdGljIHZhciBkb2pvUGF0aCA9ICIiOworCQorCXB1YmxpYyBzdGF0aWMgdmFyIF9mc2NvbW1hbmRSZWFkeSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgdmFyIF9jYWxsYmFja3MgPSBuZXcgQXJyYXkoKTsKKworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpeyAKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnRkxBU0g6RG9qb0V4dGVybmFsSW50ZXJmYWNlIGluaXRpYWxpemUnKSIpOworCQkvLyBGSVhNRTogU2V0IGF2YWlsYWJsZSB2YXJpYWJsZSBieSB0ZXN0aW5nIGZvciBjYXBhYmlsaXRpZXMKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmF2YWlsYWJsZSA9IHRydWU7CisJCQorCQkvLyBleHRyYWN0IHRoZSBkb2pvIGJhc2UgcGF0aAorCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGggPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZ2V0RG9qb1BhdGgoKTsKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnRkxBU0g6ZG9qb1BhdGg9IitEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGgrIicpIik7CisJCQorCQkvLyBTb21ldGltZXMsIG9uIElFLCB0aGUgZnNjb21tYW5kIGluZnJhc3RydWN0dXJlIGNhbiB0YWtlIGEgZmV3IGh1bmRyZWQKKwkJLy8gbWlsbGlzZWNvbmRzIHRoZSBmaXJzdCB0aW1lIGEgcGFnZSBsb2Fkcy4gU2V0IGEgdGltZXIgdG8ga2VlcCBjaGVja2luZworCQkvLyB0byBtYWtlIHN1cmUgd2UgY2FuIGlzc3VlIGZzY29tbWFuZHM7IG90aGVyd2lzZSwgb3VyIGNhbGxzIHRvIGZzY29tbWFuZAorCQkvLyBmb3Igc2V0Q2FsbGJhY2soKSBhbmQgbG9hZGVkKCkgd2lsbCBqdXN0ICJkaXNhcHBlYXIiCisJCV9yb290LmZzY29tbWFuZFJlYWR5ID0gZmFsc2U7CisJCXZhciBmc0NoZWNrZXIgPSBmdW5jdGlvbigpeworCQkJLy8gaXNzdWUgYSB0ZXN0IGZzY29tbWFuZAorCQkJZnNjb21tYW5kKCJmc2NvbW1hbmRSZWFkeSIpOworCQkJCisJCQkvLyBKYXZhU2NyaXB0IHNob3VsZCBzZXQgX3Jvb3QuZnNjb21tYW5kUmVhZHkgaWYgaXQgZ290IHRoZSBjYWxsCisJCQlpZihfcm9vdC5mc2NvbW1hbmRSZWFkeSA9PSAidHJ1ZSIpeworCQkJCURvam9FeHRlcm5hbEludGVyZmFjZS5fZnNjb21tYW5kUmVhZHkgPSB0cnVlOworCQkJCWNsZWFySW50ZXJ2YWwoX3Jvb3QuZnNUaW1lcik7CisJCQl9CisJCX07CisJCV9yb290LmZzVGltZXIgPSBzZXRJbnRlcnZhbChmc0NoZWNrZXIsIDEwMCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkQ2FsbGJhY2sobWV0aG9kTmFtZTpTdHJpbmcsIGluc3RhbmNlOk9iamVjdCwgCisJCQkJCQkJCQkJCW1ldGhvZDpGdW5jdGlvbikgOiBCb29sZWFueworCQkvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGwgYmVsb3cgc3VjY2VlZGVkCisJCV9yb290Ll9zdWNjZWVkZWQgPSBudWxsOworCQkKKwkJLy8gQ2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEphdmFTY3JpcHQgc2lkZSBhcyBmb2xsb3dzLgorCQkvLyBPbiB0aGUgRmxhc2ggc2lkZSwgd2UgbWFpbnRhaW4gYSBsb29rdXAgdGFibGUgdGhhdCBhc3NvY2lhdGVzCisJCS8vIHRoZSBtZXRob2ROYW1lIHdpdGggdGhlIGFjdHVhbCBpbnN0YW5jZSBhbmQgbWV0aG9kIHRoYXQgYXJlCisJCS8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1ldGhvZC4KKwkJLy8gVXNpbmcgZnNjb21tYW5kLCB3ZSBzZW5kIG92ZXIgdGhlIGFjdGlvbiAiYWRkQ2FsbGJhY2siLCB3aXRoIHRoZQorCQkvLyBhcmd1bWVudCBiZWluZyB0aGUgbWV0aG9kTmFtZSB0byBhZGQsIHN1Y2ggYXMgImZvb2JhciIuCisJCS8vIFRoZSBKYXZhU2NyaXB0IHRha2VzIHRoZXNlIHZhbHVlcyBhbmQgcmVnaXN0ZXJzIHRoZSBleGlzdGVuY2Ugb2YKKwkJLy8gdGhpcyBjYWxsYmFjayBwb2ludC4KKwkJCisJCS8vIHByZWNlZGUgdGhlIG1ldGhvZCBuYW1lIHdpdGggYSBfIGNoYXJhY3RlciBpbiBjYXNlIGl0IHN0YXJ0cworCQkvLyB3aXRoIGEgbnVtYmVyCisJCV9jYWxsYmFja3NbIl8iICsgbWV0aG9kTmFtZV0gPSB7X2luc3RhbmNlOiBpbnN0YW5jZSwgX21ldGhvZDogbWV0aG9kfTsKKwkJX2NhbGxiYWNrc1tfY2FsbGJhY2tzLmxlbmd0aF0gPSBtZXRob2ROYW1lOworCQkKKwkJLy8gVGhlIEFQSSBmb3IgRXh0ZXJuYWxJbnRlcmZhY2Ugc2F5cyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgY2FsbAorCQkvLyBzdWNjZWVkZWQ7IGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHZhbHVlIAorCQkvLyBmb3IgX3N1Y2NlZWRlZCwgd2hpY2ggaXMgc2V0IGJ5IHRoZSBKYXZhU2NyaXB0IHNpZGUKKwkJaWYoX3Jvb3QuX3N1Y2NlZWRlZCA9PSBudWxsKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfWVsc2V7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbGwobWV0aG9kTmFtZTpTdHJpbmcsIAorCQkJCQkJCQlyZXN1bHRzQ2FsbGJhY2s6RnVuY3Rpb24pIDogVm9pZHsKKwkJLy8gRklYTUU6IHN1cHBvcnQgZnVsbCBKU09OIHNlcmlhbGl6YXRpb24KKwkJCisJCS8vIEZpcnN0LCB3ZSBwYWNrIHVwIGFsbCBvZiB0aGUgYXJndW1lbnRzIHRvIHRoaXMgY2FsbCBhbmQgc2V0IHRoZW0KKwkJLy8gYXMgRmxhc2ggdmFyaWFibGVzLCB3aGljaCB0aGUgSmF2YVNjcmlwdCBzaWRlIHdpbGwgdW5wYWNrIHVzaW5nCisJCS8vIHBsdWdpbi5HZXRWYXJpYWJsZSgpLiBXZSBzZXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYXMgIl9udW1BcmdzIiwKKwkJLy8gYW5kIGFkZCBlYWNoIGFyZ3VtZW50IGFzIGEgdmFyaWFibGUsIHN1Y2ggYXMgIl8xIiwgIl8yIiwgZXRjLiwgc3RhcnRpbmcKKwkJLy8gZnJvbSAwLgorCQkvLyBXZSB0aGVuIGV4ZWN1dGUgYW4gZnNjb21tYW5kIHdpdGggdGhlIGFjdGlvbiAiY2FsbCIgYW5kIHRoZQorCQkvLyBhcmd1bWVudCBiZWluZyB0aGUgbWV0aG9kIG5hbWUuIEphdmFTY3JpcHQgdGFrZXMgdGhlIG1ldGhvZCBuYW1lLAorCQkvLyByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50cyB1c2luZyBHZXRWYXJpYWJsZSwgZXhlY3V0ZXMgdGhlIG1ldGhvZCwKKwkJLy8gYW5kIHRoZW4gcGxhY2VzIHRoZSByZXR1cm4gcmVzdWx0IGluIGEgRmxhc2ggdmFyaWFibGUKKwkJLy8gbmFtZWQgIl9yZXR1cm5SZXN1bHQiLgorCQlfcm9vdC5fbnVtQXJncyA9IGFyZ3VtZW50cy5sZW5ndGggLSAyOworCQlmb3IodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCXZhciBhcmdJbmRleCA9IGkgLSAyOworCQkJX3Jvb3RbIl8iICsgYXJnSW5kZXhdID0gYXJndW1lbnRzW2ldOworCQl9CisJCQorCQlfcm9vdC5fcmV0dXJuUmVzdWx0ID0gdW5kZWZpbmVkOworCQlmc2NvbW1hbmQoImNhbGwiLCBtZXRob2ROYW1lKTsKKwkJCisJCS8vIGltbWVkaWF0ZWx5IHJldHVybiBpZiB0aGUgY2FsbGVyIGlzIG5vdCB3YWl0aW5nIGZvciByZXR1cm4gcmVzdWx0cworCQlpZihyZXN1bHRzQ2FsbGJhY2sgPT0gdW5kZWZpbmVkIHx8IHJlc3VsdHNDYWxsYmFjayA9PSBudWxsKXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gY2hlY2sgYXQgcmVndWxhciBpbnRlcnZhbHMgZm9yIHJldHVybiByZXN1bHRzCQorCQl2YXIgcmVzdWx0c0NoZWNrZXIgPSBmdW5jdGlvbigpeworCQkJaWYoKHR5cGVvZiBfcm9vdC5fcmV0dXJuUmVzdWx0ICE9ICJ1bmRlZmluZWQiKSYmCisJCQkJKF9yb290Ll9yZXR1cm5SZXN1bHQgIT0gInVuZGVmaW5lZCIpKXsKKwkJCQljbGVhckludGVydmFsKF9yb290Ll9jYWxsYmFja0lEKTsKKwkJCQlyZXN1bHRzQ2FsbGJhY2suY2FsbChudWxsLCBfcm9vdC5fcmV0dXJuUmVzdWx0KTsKKwkJCX0KKwkJfTsJCisJCV9yb290Ll9jYWxsYmFja0lEID0gc2V0SW50ZXJ2YWwocmVzdWx0c0NoZWNrZXIsIDEwMCk7CisJfQorCQorCS8qKiAKKwkJCUNhbGxlZCBieSBGbGFzaCB0byBpbmRpY2F0ZSB0byBKYXZhU2NyaXB0IHRoYXQgd2UgYXJlIHJlYWR5IHRvIGhhdmUKKwkJCW91ciBGbGFzaCBmdW5jdGlvbnMgY2FsbGVkLiBDYWxsaW5nIGxvYWRlZCgpCisJCQl3aWxsIGZpcmUgdGhlIGRvam8uZmxhc2gubG9hZGVkKCkgZXZlbnQsIHNvIHRoYXQgSmF2YVNjcmlwdCBjYW4ga25vdyB0aGF0CisJCQlGbGFzaCBoYXMgZmluaXNoZWQgbG9hZGluZyBhbmQgYWRkaW5nIGl0cyBjYWxsYmFja3MsIGFuZCBjYW4gYmVnaW4gdG8KKwkJCWludGVyYWN0IHdpdGggdGhlIEZsYXNoIGZpbGUuCisJKi8KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRlZCgpeworCQkvL2dldFVSTCgiamF2YXNjcmlwdDpkb2pvLmRlYnVnKCdGTEFTSDpsb2FkZWQnKSIpOworCQkKKwkJLy8gb25lIG1vcmUgc3RlcDogc2VlIGlmIGZzY29tbWFuZHMgYXJlIHJlYWR5IHRvIGJlIGV4ZWN1dGVkOyBpZiBub3QsCisJCS8vIHNldCBhbiBpbnRlcnZhbCB0aGF0IHdpbGwga2VlcCBydW5uaW5nIHVudGlsIGZzY29tbWFuZHMgYXJlIHJlYWR5OworCQkvLyBtYWtlIHN1cmUgdGhlIGdhdGV3YXkgaXMgbG9hZGVkIGFzIHdlbGwKKwkJdmFyIGV4ZWNMb2FkZWQgPSBmdW5jdGlvbigpeworCQkJaWYoRG9qb0V4dGVybmFsSW50ZXJmYWNlLl9mc2NvbW1hbmRSZWFkeSA9PSB0cnVlKXsKKwkJCQljbGVhckludGVydmFsKF9yb290LmxvYWRlZEludGVydmFsKTsKKwkJCQkKKwkJCQkvLyBpbml0aWFsaXplIHRoZSBzbWFsbCBGbGFzaCBmaWxlIHRoYXQgaGVscHMgZ2F0ZXdheSBKUyB0byBGbGFzaAorCQkJCS8vIGNhbGxzCisJCQkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLl9pbml0aWFsaXplRmxhc2hSdW5uZXIoKTsKKwkJCX0JCisJCX07CisJCQorCQlpZihfZnNjb21tYW5kUmVhZHkgPT0gdHJ1ZSl7CisJCQlleGVjTG9hZGVkKCk7CisJCX1lbHNleworCQkJX3Jvb3QubG9hZGVkSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChleGVjTG9hZGVkLCA1MCk7CisJCX0KKwl9CisJCisJLyoqIAorCQkJSGFuZGxlcyBhbmQgZXhlY3V0ZXMgYSBKYXZhU2NyaXB0IHRvIEZsYXNoIG1ldGhvZCBjYWxsLiBVc2VkIGJ5CisJCQlpbml0aWFsaXplRmxhc2hSdW5uZXIuIAorCSovCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfaGFuZGxlSlNDYWxsKCl7CisJCS8vIGdldCBvdXIgcGFyYW1ldGVycworCQl2YXIgbnVtQXJncyA9IHBhcnNlSW50KF9yb290Ll9udW1BcmdzKTsKKwkJdmFyIGpzQXJncyA9IG5ldyBBcnJheSgpOworCQlmb3IodmFyIGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKXsKKwkJCXZhciBjdXJyZW50VmFsdWUgPSBfcm9vdFsiXyIgKyBpXTsKKwkJCWpzQXJncy5wdXNoKGN1cnJlbnRWYWx1ZSk7CisJCX0KKwkJCisJCS8vIGdldCBvdXIgZnVuY3Rpb24gbmFtZQorCQl2YXIgZnVuY3Rpb25OYW1lID0gX3Jvb3QuX2Z1bmN0aW9uTmFtZTsKKwkJCisJCS8vIG5vdyBnZXQgdGhlIGFjdHVhbCBpbnN0YW5jZSBhbmQgbWV0aG9kIG9iamVjdCB0byBleGVjdXRlIG9uLAorCQkvLyB1c2luZyBvdXIgbG9va3VwIHRhYmxlIHRoYXQgd2FzIGNvbnN0cnVjdGVkIGJ5IGNhbGxzIHRvCisJCS8vIGFkZENhbGxiYWNrIG9uIGluaXRpYWxpemF0aW9uCisJCXZhciBpbnN0YW5jZSA9IF9jYWxsYmFja3NbIl8iICsgZnVuY3Rpb25OYW1lXS5faW5zdGFuY2U7CisJCXZhciBtZXRob2QgPSBfY2FsbGJhY2tzWyJfIiArIGZ1bmN0aW9uTmFtZV0uX21ldGhvZDsKKwkJCisJCS8vIGV4ZWN1dGUgaXQKKwkJdmFyIHJlc3VsdHMgPSBtZXRob2QuYXBwbHkoaW5zdGFuY2UsIGpzQXJncyk7CisJCQorCQkvLyByZXR1cm4gdGhlIHJlc3VsdHMKKwkJX3Jvb3QuX3JldHVyblJlc3VsdCA9IHJlc3VsdHM7CisJfQorCQorCS8qKiBDYWxsZWQgYnkgdGhlIGZsYXNoNl9nYXRld2F5LnN3ZiB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGxvYWRlZC4gKi8KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9nYXRld2F5UmVhZHkoKXsKKwkJZm9yKHZhciBpID0gMDsgaSA8IF9jYWxsYmFja3MubGVuZ3RoOyBpKyspeworCQkJZnNjb21tYW5kKCJhZGRDYWxsYmFjayIsIF9jYWxsYmFja3NbaV0pOworCQl9CisJCWNhbGwoImRvam8uZmxhc2gubG9hZGVkIik7CisJfQorCQorCS8qKiAKKwkJCVdoZW4gSmF2YVNjcmlwdCB3YW50cyB0byBjb21tdW5pY2F0ZSB3aXRoIEZsYXNoIGl0IHNpbXBseSBzZXRzCisJCQl0aGUgRmxhc2ggdmFyaWFibGUgIl9leGVjdXRlIiB0byB0cnVlOyB0aGlzIG1ldGhvZCBjcmVhdGVzIHRoZQorCQkJaW50ZXJuYWwgTW92aWUgQ2xpcCwgY2FsbGVkIHRoZSBGbGFzaCBSdW5uZXIsIHRoYXQgbWFrZXMgdGhpcworCQkJbWFnaWMgaGFwcGVuLgorCSovCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfaW5pdGlhbGl6ZUZsYXNoUnVubmVyKCl7CisJCS8vIGZpZ3VyZSBvdXQgd2hlcmUgb3VyIEZsYXNoIG1vdmllIGlzCisJCXZhciBzd2ZMb2MgPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGggKyAiZmxhc2g2X2dhdGV3YXkuc3dmIjsKKwkJCisJCS8vIGxvYWQgb3VyIGdhdGV3YXkgaGVscGVyIGZpbGUKKwkJX3Jvb3QuY3JlYXRlRW1wdHlNb3ZpZUNsaXAoIl9mbGFzaFJ1bm5lciIsIDUwMDApOworCQlfcm9vdC5fZmxhc2hSdW5uZXIuX2xvY2tyb290ID0gdHJ1ZTsKKwkJX3Jvb3QuX2ZsYXNoUnVubmVyLmxvYWRNb3ZpZShzd2ZMb2MpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXREb2pvUGF0aCgpeworCQl2YXIgdXJsID0gX3Jvb3QuX3VybDsKKwkJdmFyIHN0YXJ0ID0gdXJsLmluZGV4T2YoImJhc2VSZWxhdGl2ZVBhdGg9IikgKyAiYmFzZVJlbGF0aXZlUGF0aD0iLmxlbmd0aDsKKwkJdmFyIHBhdGggPSB1cmwuc3Vic3RyaW5nKHN0YXJ0KTsKKwkJdmFyIGVuZCA9IHBhdGguaW5kZXhPZigiJiIpOworCQlpZihlbmQgIT0gLTEpeworCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGVuZCk7CisJCX0KKwkJcmV0dXJuIHBhdGg7CisJfQorfQorCisvLyB2aW06dHM9NDpub2V0OnR3PTA6CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g2L2ZsYXNoNl9nYXRld2F5LmZsYSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9mbGFzaC9mbGFzaDYvZmxhc2g2X2dhdGV3YXkuZmxhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjFjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g2L2ZsYXNoNl9nYXRld2F5LmZsYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g4L0Rvam9FeHRlcm5hbEludGVyZmFjZS5hcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9mbGFzaC9mbGFzaDgvRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzg3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g4L0Rvam9FeHRlcm5hbEludGVyZmFjZS5hcwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworLyoqCisJQSB3cmFwcGVyIGFyb3VuZCBGbGFzaCA4J3MgRXh0ZXJuYWxJbnRlcmZhY2U7IERvam9FeHRlcm5hbEludGVyZmFjZSBpcyBuZWVkZWQgc28gdGhhdCB3ZQorCWNhbiBkbyBhIEZsYXNoIDYgaW1wbGVtZW50YXRpb24gb2YgRXh0ZXJuYWxJbnRlcmZhY2UsIGFuZCBiZSBhYmxlCisJdG8gc3VwcG9ydCBoYXZpbmcgYSBzaW5nbGUgY29kZWJhc2UgdGhhdCB1c2VzIERvam9FeHRlcm5hbEludGVyZmFjZQorCWFjcm9zcyBGbGFzaCB2ZXJzaW9ucyByYXRoZXIgdGhhbiBoYXZpbmcgdHdvIHNlcGVyYXRlIHNvdXJjZSBiYXNlcywKKwl3aGVyZSBvbmUgdXNlcyBFeHRlcm5hbEludGVyZmFjZSBhbmQgdGhlIG90aGVyIHVzZXMgRG9qb0V4dGVybmFsSW50ZXJmYWNlLgorCQorCURvam9FeHRlcm5hbEludGVyZmFjZSBjbGFzcyBkb2VzIGEgdmFyaWV0eSBvZiBvcHRpbWl6YXRpb25zIHRvIGJ5cGFzcyBFeHRlcm5hbEludGVyZmFjZSdzCisJdW5iZWxpZXZhYmx5IGJhZCBwZXJmb3JtYW5jZSBzbyB0aGF0IHdlIGNhbiBoYXZlIGdvb2QgcGVyZm9ybWFuY2UKKwlvbiBTYWZhcmk7IHNlZSB0aGUgYmxvZyBwb3N0CisJaHR0cDovL2NvZGluZ2lucGFyYWRpc2Uub3JnL3dlYmxvZy8yMDA2LzAyL2hvdy10by1zcGVlZC11cC1mbGFzaC04cy5odG1sCisJZm9yIGRldGFpbHMuCisJCisJQGF1dGhvciBCcmFkIE5ldWJlcmcsIGJrbjNAY29sdW1iaWEuZWR1CisqLworaW1wb3J0IGZsYXNoLmV4dGVybmFsLkV4dGVybmFsSW50ZXJmYWNlOworCitjbGFzcyBEb2pvRXh0ZXJuYWxJbnRlcmZhY2V7CisJcHVibGljIHN0YXRpYyB2YXIgYXZhaWxhYmxlOkJvb2xlYW47CisJcHVibGljIHN0YXRpYyB2YXIgZG9qb1BhdGggPSAiIjsKKwkKKwlwcml2YXRlIHN0YXRpYyB2YXIgZmxhc2hNZXRob2RzOkFycmF5ID0gbmV3IEFycmF5KCk7CisJcHJpdmF0ZSBzdGF0aWMgdmFyIG51bUFyZ3M6TnVtYmVyOworCXByaXZhdGUgc3RhdGljIHZhciBhcmdEYXRhOkFycmF5OworCXByaXZhdGUgc3RhdGljIHZhciByZXN1bHREYXRhID0gbnVsbDsKKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKXsKKwkJLy8gZXh0cmFjdCB0aGUgZG9qbyBiYXNlIHBhdGgKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmRvam9QYXRoID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLmdldERvam9QYXRoKCk7CisJCQorCQkvLyBzZWUgaWYgd2UgbmVlZCB0byBkbyBhbiBleHByZXNzIGluc3RhbGwKKwkJdmFyIGluc3RhbGw6RXhwcmVzc0luc3RhbGwgPSBuZXcgRXhwcmVzc0luc3RhbGwoKTsKKwkJaWYoaW5zdGFsbC5uZWVkc1VwZGF0ZSl7CisJCQlpbnN0YWxsLmluaXQoKTsKKwkJfQorCQkKKwkJLy8gcmVnaXN0ZXIgb3VyIGNhbGxiYWNrIGZ1bmN0aW9ucworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygic3RhcnRFeGVjIiwgRG9qb0V4dGVybmFsSW50ZXJmYWNlLCBzdGFydEV4ZWMpOworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygic2V0TnVtYmVyQXJndW1lbnRzIiwgRG9qb0V4dGVybmFsSW50ZXJmYWNlLAorCQkJCQkJCQkJCQkJCQkJCQlzZXROdW1iZXJBcmd1bWVudHMpOworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygiY2h1bmtBcmd1bWVudERhdGEiLCBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UsCisJCQkJCQkJCQkJCQkJCQkJCWNodW5rQXJndW1lbnREYXRhKTsKKwkJRXh0ZXJuYWxJbnRlcmZhY2UuYWRkQ2FsbGJhY2soImV4ZWMiLCBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UsIGV4ZWMpOworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygiZ2V0UmV0dXJuTGVuZ3RoIiwgRG9qb0V4dGVybmFsSW50ZXJmYWNlLAorCQkJCQkJCQkJCQkJCQkJCQlnZXRSZXR1cm5MZW5ndGgpOworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygiY2h1bmtSZXR1cm5EYXRhIiwgRG9qb0V4dGVybmFsSW50ZXJmYWNlLAorCQkJCQkJCQkJCQkJCQkJCQljaHVua1JldHVybkRhdGEpOworCQlFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygiZW5kRXhlYyIsIERvam9FeHRlcm5hbEludGVyZmFjZSwgZW5kRXhlYyk7CisJCQorCQkvLyBzZXQgd2hldGhlciBjb21tdW5pY2F0aW9uIGlzIGF2YWlsYWJsZQorCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXZhaWxhYmxlID0gRXh0ZXJuYWxJbnRlcmZhY2UuYXZhaWxhYmxlOworCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgibG9hZGVkIik7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkQ2FsbGJhY2sobWV0aG9kTmFtZTpTdHJpbmcsIGluc3RhbmNlOk9iamVjdCwgCisJCQkJCQkJCQkJIAkJCQkJCQkJIG1ldGhvZDpGdW5jdGlvbikgOiBCb29sZWFueworCQkvLyByZWdpc3RlciBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UgbWV0aG9kTmFtZSB3aXRoIGl0J3MgaW5zdGFuY2UKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmZsYXNoTWV0aG9kc1ttZXRob2ROYW1lXSA9IGluc3RhbmNlOworCQkKKwkJLy8gdGVsbCBKYXZhU2NyaXB0IGFib3V0IERvam9FeHRlcm5hbEludGVyZmFjZSBuZXcgbWV0aG9kIHNvIHdlIGNhbiBjcmVhdGUgYSBwcm94eQorCQlFeHRlcm5hbEludGVyZmFjZS5jYWxsKCJkb2pvLmZsYXNoLmNvbW0uX2FkZEV4dGVybmFsSW50ZXJmYWNlQ2FsbGJhY2siLCAKKwkJCQkJCQkJCQkJCQkgbWV0aG9kTmFtZSk7CisJCQkJCQkJCQkJCQkJIAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxsKG1ldGhvZE5hbWU6U3RyaW5nLAorCQkJCQkJCQlyZXN1bHRzQ2FsbGJhY2s6RnVuY3Rpb24pIDogVm9pZHsKKwkJLy8gd2UgbWlnaHQgaGF2ZSBhbnkgbnVtYmVyIG9mIG9wdGlvbmFsIGFyZ3VtZW50cywgc28gd2UgaGF2ZSB0byAKKwkJLy8gcGFzcyB0aGVtIGluIGR5bmFtaWNhbGx5OyBzdHJpcCBvdXQgdGhlIHJlc3VsdHMgY2FsbGJhY2sKKwkJdmFyIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXkoKTsKKwkJZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7CisJCQlpZihpICE9IDEpeyAvLyBza2lwIHRoZSBjYWxsYmFjaworCQkJCXBhcmFtZXRlcnMucHVzaChhcmd1bWVudHNbaV0pOworCQkJfQorCQl9CisJCQorCQl2YXIgcmVzdWx0cyA9IEV4dGVybmFsSW50ZXJmYWNlLmNhbGwuYXBwbHkoRXh0ZXJuYWxJbnRlcmZhY2UsIHBhcmFtZXRlcnMpOworCQkKKwkJLy8gaW1tZWRpYXRlbHkgZ2l2ZSB0aGUgcmVzdWx0cyBiYWNrLCBzaW5jZSBFeHRlcm5hbEludGVyZmFjZSBpcworCQkvLyBzeW5jaHJvbm91cworCQlpZihyZXN1bHRzQ2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0c0NhbGxiYWNrICE9ICJ1bmRlZmluZWQiKXsKKwkJCXJlc3VsdHNDYWxsYmFjay5jYWxsKG51bGwsIHJlc3VsdHMpOworCQl9CisJfQorCQorCS8qKiAKKwkJCUNhbGxlZCBieSBGbGFzaCB0byBpbmRpY2F0ZSB0byBKYXZhU2NyaXB0IHRoYXQgd2UgYXJlIHJlYWR5IHRvIGhhdmUKKwkJCW91ciBGbGFzaCBmdW5jdGlvbnMgY2FsbGVkLiBDYWxsaW5nIGxvYWRlZCgpCisJCQl3aWxsIGZpcmUgdGhlIGRvam8uZmxhc2gubG9hZGVkKCkgZXZlbnQsIHNvIHRoYXQgSmF2YVNjcmlwdCBjYW4ga25vdyB0aGF0CisJCQlGbGFzaCBoYXMgZmluaXNoZWQgbG9hZGluZyBhbmQgYWRkaW5nIGl0cyBjYWxsYmFja3MsIGFuZCBjYW4gYmVnaW4gdG8KKwkJCWludGVyYWN0IHdpdGggdGhlIEZsYXNoIGZpbGUuCisJKi8KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRlZCgpeworCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgiZG9qby5mbGFzaC5sb2FkZWQiKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdGFydEV4ZWMoKTpWb2lkeworCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UubnVtQXJncyA9IG51bGw7CisJCURvam9FeHRlcm5hbEludGVyZmFjZS5hcmdEYXRhID0gbnVsbDsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlc3VsdERhdGEgPSBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldE51bWJlckFyZ3VtZW50cyhudW1BcmdzKTpWb2lkeworCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UubnVtQXJncyA9IG51bUFyZ3M7CisJCURvam9FeHRlcm5hbEludGVyZmFjZS5hcmdEYXRhID0gbmV3IEFycmF5KERvam9FeHRlcm5hbEludGVyZmFjZS5udW1BcmdzKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaHVua0FyZ3VtZW50RGF0YSh2YWx1ZSwgYXJnSW5kZXg6TnVtYmVyKTpWb2lkeworCQkvL2dldFVSTCgiamF2YXNjcmlwdDpkb2pvLmRlYnVnKCdGTEFTSDogY2h1bmtBcmd1bWVudERhdGEsIHZhbHVlPSIrdmFsdWUrIiwgYXJnSW5kZXg9IithcmdJbmRleCsiJykiKTsKKwkJdmFyIGN1cnJlbnRWYWx1ZSA9IERvam9FeHRlcm5hbEludGVyZmFjZS5hcmdEYXRhW2FyZ0luZGV4XTsKKwkJaWYoY3VycmVudFZhbHVlID09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PSAidW5kZWZpbmVkIil7CisJCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXJnRGF0YVthcmdJbmRleF0gPSB2YWx1ZTsKKwkJfWVsc2V7CisJCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXJnRGF0YVthcmdJbmRleF0gKz0gdmFsdWU7CisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleGVjKG1ldGhvZE5hbWUpOlZvaWR7CisJCS8vIGRlY29kZSBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGluCisJCWZvcih2YXIgaSA9IDA7IGkgPCBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXJnRGF0YS5sZW5ndGg7IGkrKyl7CisJCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYXJnRGF0YVtpXSA9IAorCQkJCURvam9FeHRlcm5hbEludGVyZmFjZS5kZWNvZGVEYXRhKERvam9FeHRlcm5hbEludGVyZmFjZS5hcmdEYXRhW2ldKTsKKwkJfQorCQkKKwkJdmFyIGluc3RhbmNlID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLmZsYXNoTWV0aG9kc1ttZXRob2ROYW1lXTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlc3VsdERhdGEgPSBpbnN0YW5jZVttZXRob2ROYW1lXS5hcHBseSgKKwkJCQkJCQkJCQkJCQkJCQkJCQlpbnN0YW5jZSwgRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFyZ0RhdGEpOworCQkvLyBlbmNvZGUgdGhlIHJlc3VsdCBkYXRhCisJCURvam9FeHRlcm5hbEludGVyZmFjZS5yZXN1bHREYXRhID0gCisJCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZW5jb2RlRGF0YShEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVzdWx0RGF0YSk7CisJCQkKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnRkxBU0g6IGVuY29kZWQgcmVzdWx0IGRhdGE9IitEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVzdWx0RGF0YSsiJykiKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZXR1cm5MZW5ndGgoKTpOdW1iZXJ7CisJIGlmKERvam9FeHRlcm5hbEludGVyZmFjZS5yZXN1bHREYXRhID09IG51bGwgfHwgCisJIAkJCQkJdHlwZW9mIERvam9FeHRlcm5hbEludGVyZmFjZS5yZXN1bHREYXRhID09ICJ1bmRlZmluZWQiKXsKKwkgCXJldHVybiAwOworCSB9CisJIHZhciBzZWdtZW50cyA9IE1hdGguY2VpbChEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVzdWx0RGF0YS5sZW5ndGggLyAxMDI0KTsKKwkgcmV0dXJuIHNlZ21lbnRzOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNodW5rUmV0dXJuRGF0YShzZWdtZW50Ok51bWJlcik6U3RyaW5neworCQl2YXIgbnVtU2VnbWVudHMgPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZ2V0UmV0dXJuTGVuZ3RoKCk7CisJCXZhciBzdGFydEN1dCA9IHNlZ21lbnQgKiAxMDI0OworCQl2YXIgZW5kQ3V0ID0gc2VnbWVudCAqIDEwMjQgKyAxMDI0OworCQlpZihzZWdtZW50ID09IChudW1TZWdtZW50cyAtIDEpKXsKKwkJCWVuZEN1dCA9IHNlZ21lbnQgKiAxMDI0ICsgRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlc3VsdERhdGEubGVuZ3RoOworCQl9CisJCQkKKwkJdmFyIHBpZWNlID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlc3VsdERhdGEuc3Vic3RyaW5nKHN0YXJ0Q3V0LCBlbmRDdXQpOworCQkKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnRkxBU0g6IGNodW5raW5nIHJldHVybiBwaWVjZT0iK3BpZWNlKyInKSIpOworCQkKKwkJcmV0dXJuIHBpZWNlOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuZEV4ZWMoKTpWb2lkeworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGVEYXRhKGRhdGEpOlN0cmluZ3sKKwkJLy8gd2UgaGF2ZSB0byB1c2UgY3VzdG9tIGVuY29kaW5ncyBmb3IgY2VydGFpbiBjaGFyYWN0ZXJzIHdoZW4gcGFzc2luZworCQkvLyB0aGVtIG92ZXI7IGZvciBleGFtcGxlLCBwYXNzaW5nIGEgYmFja3NsYXNoIG92ZXIgYXMgLy8vLyBmcm9tIEphdmFTY3JpcHQKKwkJLy8gdG8gRmxhc2ggZG9lc24ndCB3b3JrCisJCWRhdGEgPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVwbGFjZVN0cihkYXRhLCAiJmN1c3RvbV9iYWNrc2xhc2g7IiwgIlxcIik7CisJCQorCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgIlxcXCciLCAiXCciKTsKKwkJZGF0YSA9IERvam9FeHRlcm5hbEludGVyZmFjZS5yZXBsYWNlU3RyKGRhdGEsICJcXFwiIiwgIlwiIik7CisJCQorCQlyZXR1cm4gZGF0YTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlRGF0YShkYXRhKXsKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnaW5zaWRlIGZsYXNoLCBkYXRhIGJlZm9yZT0iK2RhdGErIicpIik7CisKKwkJLy8gZG91YmxlIGVuY29kZSBhbGwgZW50aXR5IHZhbHVlcywgb3IgdGhleSB3aWxsIGJlIG1pcy1kZWNvZGVkCisJCS8vIGJ5IEZsYXNoIHdoZW4gcmV0dXJuZWQKKwkJZGF0YSA9IERvam9FeHRlcm5hbEludGVyZmFjZS5yZXBsYWNlU3RyKGRhdGEsICImIiwgIiZhbXA7Iik7CisJCQorCQkvLyBjZXJ0YWluIFhNTGlzaCBjaGFyYWN0ZXJzIGJyZWFrIEZsYXNoJ3Mgd2lyZSBzZXJpYWxpemF0aW9uIGZvcgorCQkvLyBFeHRlcm5hbEludGVyZmFjZTsgZW5jb2RlIHRoZXNlIGludG8gYSBjdXN0b20gZW5jb2RpbmcsIHJhdGhlciB0aGFuCisJCS8vIHRoZSBzdGFuZGFyZCBlbnRpdHkgZW5jb2RpbmcsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGJlIGFibGUgdG8KKwkJLy8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG91ciBvd24gZW5jb2RpbmcgYW5kIGFueSBlbnRpdHkgY2hhcmFjdGVycworCQkvLyB0aGF0IGFyZSBiZWluZyB1c2VkIGluIHRoZSBzdHJpbmcgaXRzZWxmCisJCWRhdGEgPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVwbGFjZVN0cihkYXRhLCAnPCcsICcmY3VzdG9tX2x0OycpOworCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgJz4nLCAnJmN1c3RvbV9ndDsnKTsKKwkJCisJCS8vIGVuY29kZSBjb250cm9sIGNoYXJhY3RlcnMgYW5kIEphdmFTY3JpcHQgZGVsaW1pdGVycworCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgIlxuIiwgIlxcbiIpOworCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgIlxyIiwgIlxcciIpOworCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgIlxmIiwgIlxcZiIpOworCQlkYXRhID0gRG9qb0V4dGVybmFsSW50ZXJmYWNlLnJlcGxhY2VTdHIoZGF0YSwgIiciLCAiXFwnIik7CisJCWRhdGEgPSBEb2pvRXh0ZXJuYWxJbnRlcmZhY2UucmVwbGFjZVN0cihkYXRhLCAnIicsICdcIicpOworCQkKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnaW5zaWRlIGZsYXNoLCBkYXRhIGFmdGVyPSIrZGF0YSsiJykiKTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCQorCS8qKiAKKwkJCUZsYXNoIEFjdGlvblNjcmlwdCBoYXMgbm8gU3RyaW5nLnJlcGxhY2UgbWV0aG9kIG9yIHN1cHBvcnQgZm9yCisJCQlSZWd1bGFyIEV4cHJlc3Npb25zISBXZSByb2xsIG91ciBvd24gdmVyeSBzaW1wbGUgb25lLgorCSovCisJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZVN0cihpbnB1dFN0cjpTdHJpbmcsIHJlcGxhY2VUaGlzOlN0cmluZywgCisJCQkJCQkJCQkJCQkJCQkJCQkgd2l0aFRoaXM6U3RyaW5nKTpTdHJpbmcgeworCQl2YXIgc3BsaXRTdHIgPSBpbnB1dFN0ci5zcGxpdChyZXBsYWNlVGhpcykKKwkJaW5wdXRTdHIgPSBzcGxpdFN0ci5qb2luKHdpdGhUaGlzKQorCQlyZXR1cm4gaW5wdXRTdHI7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldERvam9QYXRoKCl7CisJCXZhciB1cmwgPSBfcm9vdC5fdXJsOworCQl2YXIgc3RhcnQgPSB1cmwuaW5kZXhPZigiYmFzZVJlbGF0aXZlUGF0aD0iKSArICJiYXNlUmVsYXRpdmVQYXRoPSIubGVuZ3RoOworCQl2YXIgcGF0aCA9IHVybC5zdWJzdHJpbmcoc3RhcnQpOworCQl2YXIgZW5kID0gcGF0aC5pbmRleE9mKCImIik7CisJCWlmKGVuZCAhPSAtMSl7CisJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgZW5kKTsKKwkJfQorCQlyZXR1cm4gcGF0aDsKKwl9Cit9CisKKy8vIHZpbTp0cz00Om5vZXQ6dHc9MDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9mbGFzaC9mbGFzaDgvRXhwcmVzc0luc3RhbGwuYXMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g4L0V4cHJlc3NJbnN0YWxsLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTQ1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZmxhc2gvZmxhc2g4L0V4cHJlc3NJbnN0YWxsLmFzCkBAIC0wLDAgKzEsODEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKy8qKgorICogQmFzZWQgb24gdGhlIGV4cHJlc3NpbnN0YWxsLmFzIGNsYXNzIGNyZWF0ZWQgYnkgR2VvZmYgU3RlYXJucyBhcyBwYXJ0CisgKiBvZiB0aGUgRmxhc2hPYmplY3QgbGlicmFyeS4KKyAqCisgKiBVc2UgdGhpcyBmaWxlIHRvIGludm9rZSB0aGUgTWFjcm9tZWRpYSBGbGFzaCBQbGF5ZXIgRXhwcmVzcyBJbnN0YWxsIGZ1bmN0aW9uYWxpdHkKKyAqIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIEZsYXNoT2JqZWN0IGVtYmVkIHNjcmlwdC4gWW91IGNhbiBkb3dubG9hZCBGbGFzaE9iamVjdCAKKyAqIGFuZCB0aGlzIGZpbGUgYXQgdGhlIGZvbGxvd2luZyBVUkw6IGh0dHA6Ly9ibG9nLmRlY29uY2VwdC5jb20vZmxhc2hvYmplY3QvCisgKgorICogVXNhZ2U6IAorICogICAgICAgICAgdmFyIEV4cHJlc3NJbnN0YWxsID0gbmV3IEV4cHJlc3NJbnN0YWxsKCk7CisgKiAgICAgICAgICAKKyAqICAgICAgICAgIC8vIHRlc3QgdG8gc2VlIGlmIGluc3RhbGwgaXMgbmVlZGVkOgorICogICAgICAgICAgaWYgKEV4cHJlc3NJbnN0YWxsLm5lZWRzVXBkYXRlKSB7IC8vIHJldHVybnMgdHJ1ZSBpZiB1cGRhdGUgaXMgbmVlZGVkCisgKiAgICAgICAgICAgICAgRXhwcmVzc0luc3RhbGwuaW5pdCgpOyAvLyBzdGFydHMgdGhlIHVwZGF0ZQorICogICAgICAgICAgfQorICoKKyAqCU5PVEU6IFlvdXIgRmxhc2ggbW92aWUgbXVzdCBiZSBhdCBsZWFzdCAyMTRweCBieSAxMzdweCBpbiBvcmRlciB0byB1c2UgRXhwcmVzc0luc3RhbGwuCisgKgorICovCisKK2NsYXNzIEV4cHJlc3NJbnN0YWxsIHsKKwlwdWJsaWMgdmFyIG5lZWRzVXBkYXRlOkJvb2xlYW47CisJcHJpdmF0ZSB2YXIgdXBkYXRlcjpNb3ZpZUNsaXA7CisJcHJpdmF0ZSB2YXIgaG9sZDpNb3ZpZUNsaXA7CisJCisJcHVibGljIGZ1bmN0aW9uIEV4cHJlc3NJbnN0YWxsKCl7CisJCS8vIGRvZXMgdGhlIHVzZXIgbmVlZCB0byB1cGRhdGU/CisJCXRoaXMubmVlZHNVcGRhdGUgPSAoX3Jvb3QuTU1wbGF5ZXJUeXBlID09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IHRydWU7CQorCX0KKworCXB1YmxpYyBmdW5jdGlvbiBpbml0KCk6Vm9pZHsKKwkJdGhpcy5sb2FkVXBkYXRlcigpOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBsb2FkVXBkYXRlcigpOlZvaWQgeworCQlTeXN0ZW0uc2VjdXJpdHkuYWxsb3dEb21haW4oImZwZG93bmxvYWQubWFjcm9tZWRpYS5jb20iKTsKKworCQkvLyBob3BlIHRoYXQgbm90aGluZyBpcyBhdCBhIGRlcHRoIG9mIDEwMDAwMDAwLCB5b3UgY2FuIGNoYW5nZSB0aGlzIGRlcHRoIGlmIG5lZWRlZCwgYnV0IHlvdSB3YW50CisJCS8vIGl0IHRvIGJlIG9uIHRvcCBvZiB5b3VyIGNvbnRlbnQgaWYgeW91IGhhdmUgYW55IHN0dWZmIG9uIHRoZSBmaXJzdCBmcmFtZQorCQl0aGlzLnVwZGF0ZXIgPSBfcm9vdC5jcmVhdGVFbXB0eU1vdmllQ2xpcCgiZXhwcmVzc0luc3RhbGxIb2xkZXIiLCAxMDAwMDAwMCk7CisKKwkJLy8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIHNvIHdlIGtub3cgaWYgdGhleSBjYW5jZWwgb3IgdGhlcmUgaXMgYW4gZXJyb3IKKwkJdmFyIF9zZWxmID0gdGhpczsKKwkJdGhpcy51cGRhdGVyLmluc3RhbGxTdGF0dXMgPSBfc2VsZi5vbkluc3RhbGxTdGF0dXM7CisJCXRoaXMuaG9sZCA9IHRoaXMudXBkYXRlci5jcmVhdGVFbXB0eU1vdmllQ2xpcCgiaG9sZCIsIDEpOworCisJCS8vIGNhbid0IHVzZSBtb3ZpZUNsaXBMb2FkZXIgYmVjYXVzZSBpdCBoYXMgdG8gd29yayBpbiA2LjAuNjUKKwkJdGhpcy51cGRhdGVyLm9uRW50ZXJGcmFtZSA9IGZ1bmN0aW9uKCk6Vm9pZCB7CisJCQlpZih0eXBlb2YgdGhpcy5ob2xkLnN0YXJ0VXBkYXRlID09ICdmdW5jdGlvbicpeworCQkJCV9zZWxmLmluaXRVcGRhdGVyKCk7CisJCQkJdGhpcy5vbkVudGVyRnJhbWUgPSBudWxsOworCQkJfQorCQl9CisKKwkJdmFyIGNhY2hlQnVzdGVyOk51bWJlciA9IE1hdGgucmFuZG9tKCk7CisKKwkJdGhpcy5ob2xkLmxvYWRNb3ZpZSgiaHR0cDovL2ZwZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL2ZsYXNocGxheWVyLyIKKwkJCQkJCQkJCQkJCSsidXBkYXRlL2N1cnJlbnQvc3dmL2F1dG9VcGRhdGVyLnN3Zj8iKyBjYWNoZUJ1c3Rlcik7CisJfQorCisJcHJpdmF0ZSBmdW5jdGlvbiBpbml0VXBkYXRlcigpOlZvaWR7CisJCXRoaXMuaG9sZC5yZWRpcmVjdFVSTCA9IF9yb290Lk1NcmVkaXJlY3RVUkw7CisJCXRoaXMuaG9sZC5NTXBsYXllclR5cGUgPSBfcm9vdC5NTXBsYXllclR5cGU7CisJCXRoaXMuaG9sZC5NTWRvY3RpdGxlID0gX3Jvb3QuTU1kb2N0aXRsZTsKKwkJdGhpcy5ob2xkLnN0YXJ0VXBkYXRlKCk7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIG9uSW5zdGFsbFN0YXR1cyhtc2cpOlZvaWR7CisJCWdldFVSTCgiamF2YXNjcmlwdDpkb2pvLmZsYXNoLmluc3RhbGwuX29uSW5zdGFsbFN0YXR1cygnIittc2crIicpIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Z4L19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Z4L19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZGRkODEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZngvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5ob3N0ZW52LmNvbmRpdGlvbmFsTG9hZE1vZHVsZSh7CisJYnJvd3NlcjogWyJkb2pvLmZ4Lmh0bWwiXQorfSk7Citkb2pvLmhvc3RlbnYubW9kdWxlTG9hZGVkKCJkb2pvLmZ4LioiKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9meC9odG1sLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Z4L2h0bWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYjllMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9meC9odG1sLmpzCkBAIC0wLDAgKzEsNTY1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitkb2pvLnByb3ZpZGUoImRvam8uZnguaHRtbCIpOworCitkb2pvLnJlcXVpcmUoImRvam8uaHRtbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0eWxlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmFuaW1hdGlvbi4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdyYXBoaWNzLmNvbG9yIik7CisKK2Rvam8uZnguZHVyYXRpb24gPSA1MDA7CisKK2Rvam8uZnguaHRtbC5fbWFrZUZhZGVhYmxlID0gZnVuY3Rpb24obm9kZSl7CisJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCS8vIG9ubHkgc2V0IHRoZSB6b29tIGlmIHRoZSAidGlja2xlIiB2YWx1ZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUKKwkJLy8gZGVmYXVsdAorCQlpZiggKG5vZGUuc3R5bGUuem9vbS5sZW5ndGggPT0gMCkgJiYKKwkJCShkb2pvLnN0eWxlLmdldFN0eWxlKG5vZGUsICJ6b29tIikgPT0gIm5vcm1hbCIpICl7CisJCQkvLyBtYWtlIHN1cmUgdGhlIG5vZGUgImhhc0xheW91dCIKKwkJCS8vIE5PVEU6IHRoaXMgaGFzIGJlZW4gdGVzdGVkIHdpdGggbGFyZ2VyIGFuZCBzbWFsbGVyIHVzZXItc2V0IHRleHQKKwkJCS8vIHNpemVzIGFuZCB3b3JrcyBmaW5lCisJCQlub2RlLnN0eWxlLnpvb20gPSAiMSI7CisJCQkvLyBub2RlLnN0eWxlLnpvb20gPSAibm9ybWFsIjsKKwkJfQorCQkvLyBkb24ndCBzZXQgdGhlIHdpZHRoIHRvIGF1dG8gaWYgaXQgZGlkbid0IGFscmVhZHkgY2FzY2FkZSB0aGF0IHdheS4KKwkJLy8gV2UgZG9uJ3Qgd2FudCB0byBmIGFueW9uZXMgZGVzaWducworCQlpZigJKG5vZGUuc3R5bGUud2lkdGgubGVuZ3RoID09IDApICYmCisJCQkoZG9qby5zdHlsZS5nZXRTdHlsZShub2RlLCAid2lkdGgiKSA9PSAiYXV0byIpICl7CisJCQlub2RlLnN0eWxlLndpZHRoID0gImF1dG8iOworCQl9CisJfQorfQorCitkb2pvLmZ4Lmh0bWwuZmFkZU91dCA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBjYWxsYmFjaywgZG9udFBsYXkpIHsKKwlyZXR1cm4gZG9qby5meC5odG1sLmZhZGUobm9kZSwgZHVyYXRpb24sIGRvam8uc3R5bGUuZ2V0T3BhY2l0eShub2RlKSwgMCwgY2FsbGJhY2ssIGRvbnRQbGF5KTsKK307CisKK2Rvam8uZnguaHRtbC5mYWRlSW4gPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJcmV0dXJuIGRvam8uZnguaHRtbC5mYWRlKG5vZGUsIGR1cmF0aW9uLCBkb2pvLnN0eWxlLmdldE9wYWNpdHkobm9kZSksIDEsIGNhbGxiYWNrLCBkb250UGxheSk7Cit9OworCitkb2pvLmZ4Lmh0bWwuZmFkZUhpZGUgPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZighZHVyYXRpb24pIHsgZHVyYXRpb24gPSAxNTA7IH0gLy8gd2h5IG5vdCBoYXZlIGEgZGVmYXVsdD8KKwlyZXR1cm4gZG9qby5meC5odG1sLmZhZGVPdXQobm9kZSwgZHVyYXRpb24sIGZ1bmN0aW9uKG5vZGUpIHsKKwkJbm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQlpZih0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgeyBjYWxsYmFjayhub2RlKTsgfQorCX0pOworfTsKKworZG9qby5meC5odG1sLmZhZGVTaG93ID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrLCBkb250UGxheSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYoIWR1cmF0aW9uKSB7IGR1cmF0aW9uID0gMTUwOyB9IC8vIHdoeSBub3QgaGF2ZSBhIGRlZmF1bHQ/CisJbm9kZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwlyZXR1cm4gZG9qby5meC5odG1sLmZhZGUobm9kZSwgZHVyYXRpb24sIDAsIDEsIGNhbGxiYWNrLCBkb250UGxheSk7Cit9OworCitkb2pvLmZ4Lmh0bWwuZmFkZSA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBzdGFydE9wYWMsIGVuZE9wYWMsIGNhbGxiYWNrLCBkb250UGxheSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJZG9qby5meC5odG1sLl9tYWtlRmFkZWFibGUobm9kZSk7CisJdmFyIGFuaW0gPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uKAorCQluZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKFtzdGFydE9wYWNdLFtlbmRPcGFjXSksCisJCWR1cmF0aW9ufHxkb2pvLmZ4LmR1cmF0aW9uLCAwKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uKGUpIHsKKwkJZG9qby5zdHlsZS5zZXRPcGFjaXR5KG5vZGUsIGUueCk7CisJfSk7CisJaWYoY2FsbGJhY2spIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uKGUpIHsKKwkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQl9KTsKKwl9CisJaWYoIWRvbnRQbGF5KSB7IGFuaW0ucGxheSh0cnVlKTsgfQorCXJldHVybiBhbmltOworfTsKKworZG9qby5meC5odG1sLnNsaWRlVG8gPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgZW5kQ29vcmRzLCBjYWxsYmFjaywgZG9udFBsYXkpIHsKKwlpZighZG9qby5sYW5nLmlzTnVtYmVyKGR1cmF0aW9uKSkgeworCQl2YXIgdG1wID0gZHVyYXRpb247CisJCWR1cmF0aW9uID0gZW5kQ29vcmRzOworCQllbmRDb29yZHMgPSB0bXA7CisJfQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisKKwl2YXIgdG9wID0gbm9kZS5vZmZzZXRUb3A7CisJdmFyIGxlZnQgPSBub2RlLm9mZnNldExlZnQ7CisJdmFyIHBvcyA9IGRvam8uc3R5bGUuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAncG9zaXRpb24nKTsKKworCWlmIChwb3MgPT0gJ3JlbGF0aXZlJyB8fCBwb3MgPT0gJ3N0YXRpYycpIHsKKwkJdG9wID0gcGFyc2VJbnQoZG9qby5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICd0b3AnKSkgfHwgMDsKKwkJbGVmdCA9IHBhcnNlSW50KGRvam8uc3R5bGUuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAnbGVmdCcpKSB8fCAwOworCX0KKworCXJldHVybiBkb2pvLmZ4Lmh0bWwuc2xpZGUobm9kZSwgZHVyYXRpb24sIFtsZWZ0LCB0b3BdLAorCQllbmRDb29yZHMsIGNhbGxiYWNrLCBkb250UGxheSk7Cit9OworCitkb2pvLmZ4Lmh0bWwuc2xpZGVCeSA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBjb29yZHMsIGNhbGxiYWNrLCBkb250UGxheSkgeworCWlmKCFkb2pvLmxhbmcuaXNOdW1iZXIoZHVyYXRpb24pKSB7CisJCXZhciB0bXAgPSBkdXJhdGlvbjsKKwkJZHVyYXRpb24gPSBjb29yZHM7CisJCWNvb3JkcyA9IHRtcDsKKwl9CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKworCXZhciB0b3AgPSBub2RlLm9mZnNldFRvcDsKKwl2YXIgbGVmdCA9IG5vZGUub2Zmc2V0TGVmdDsKKwl2YXIgcG9zID0gZG9qby5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdwb3NpdGlvbicpOworCisJaWYgKHBvcyA9PSAncmVsYXRpdmUnIHx8IHBvcyA9PSAnc3RhdGljJykgeworCQl0b3AgPSBwYXJzZUludChkb2pvLnN0eWxlLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3RvcCcpKSB8fCAwOworCQlsZWZ0ID0gcGFyc2VJbnQoZG9qby5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdsZWZ0JykpIHx8IDA7CisJfQorCisJcmV0dXJuIGRvam8uZnguaHRtbC5zbGlkZVRvKG5vZGUsIGR1cmF0aW9uLCBbbGVmdCtjb29yZHNbMF0sIHRvcCtjb29yZHNbMV1dLAorCQljYWxsYmFjaywgZG9udFBsYXkpOworfTsKKworZG9qby5meC5odG1sLnNsaWRlID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIHN0YXJ0Q29vcmRzLCBlbmRDb29yZHMsIGNhbGxiYWNrLCBkb250UGxheSkgeworCWlmKCFkb2pvLmxhbmcuaXNOdW1iZXIoZHVyYXRpb24pKSB7CisJCXZhciB0bXAgPSBkdXJhdGlvbjsKKwkJZHVyYXRpb24gPSBlbmRDb29yZHM7CisJCWVuZENvb3JkcyA9IHN0YXJ0Q29vcmRzOworCQlzdGFydENvb3JkcyA9IHRtcDsKKwl9CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKworCWlmIChkb2pvLnN0eWxlLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpIHsKKwkJbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisJfQorCisJdmFyIGFuaW0gPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uKAorCQluZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKHN0YXJ0Q29vcmRzLCBlbmRDb29yZHMpLAorCQlkdXJhdGlvbnx8ZG9qby5meC5kdXJhdGlvbiwgMCk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKSB7CisJCXdpdGgoIG5vZGUuc3R5bGUgKSB7CisJCQlsZWZ0ID0gZS54ICsgInB4IjsKKwkJCXRvcCA9IGUueSArICJweCI7CisJCX0KKwl9KTsKKwlpZihjYWxsYmFjaykgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uRW5kIiwgZnVuY3Rpb24oZSkgeworCQkJY2FsbGJhY2sobm9kZSwgYW5pbSk7CisJCX0pOworCX0KKwlpZighZG9udFBsYXkpIHsgYW5pbS5wbGF5KHRydWUpOyB9CisJcmV0dXJuIGFuaW07Cit9OworCisvLyBGYWRlIGZyb20gc3RhcnRDb2xvciB0byB0aGUgbm9kZSdzIGJhY2tncm91bmQgY29sb3IKK2Rvam8uZnguaHRtbC5jb2xvckZhZGVJbiA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBzdGFydENvbG9yLCBkZWxheSwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJaWYoIWRvam8ubGFuZy5pc051bWJlcihkdXJhdGlvbikpIHsKKwkJdmFyIHRtcCA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IHN0YXJ0Q29sb3I7CisJCXN0YXJ0Q29sb3IgPSB0bXA7CisJfQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGNvbG9yID0gZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKTsKKwl2YXIgYmcgPSBkb2pvLnN0eWxlLmdldFN0eWxlKG5vZGUsICJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKKwl2YXIgd2FzVHJhbnNwYXJlbnQgPSBiZyA9PSAidHJhbnNwYXJlbnQiIHx8IGJnID09ICJyZ2JhKDAsIDAsIDAsIDApIjsKKwl3aGlsZShjb2xvci5sZW5ndGggPiAzKSB7IGNvbG9yLnBvcCgpOyB9CisKKwl2YXIgcmdiID0gbmV3IGRvam8uZ3JhcGhpY3MuY29sb3IuQ29sb3Ioc3RhcnRDb2xvcikudG9SZ2IoKTsKKwl2YXIgYW5pbSA9IGRvam8uZnguaHRtbC5jb2xvckZhZGUobm9kZSwgZHVyYXRpb258fGRvam8uZnguZHVyYXRpb24sIHN0YXJ0Q29sb3IsIGNvbG9yLCBjYWxsYmFjaywgdHJ1ZSk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uKGUpIHsKKwkJaWYoIHdhc1RyYW5zcGFyZW50ICkgeworCQkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAidHJhbnNwYXJlbnQiOworCQl9CisJfSk7CisJaWYoIGRlbGF5ID4gMCApIHsKKwkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAicmdiKCIgKyByZ2Iuam9pbigiLCIpICsgIikiOworCQlpZighZG9udFBsYXkpIHsgc2V0VGltZW91dChmdW5jdGlvbigpe2FuaW0ucGxheSh0cnVlKX0sIGRlbGF5KTsgfQorCX0gZWxzZSB7CisJCWlmKCFkb250UGxheSkgeyBhbmltLnBsYXkodHJ1ZSk7IH0KKwl9CisJcmV0dXJuIGFuaW07Cit9OworLy8gYWxpYXMgZm9yIChwcm9iYWJseT8pIGNvbW1vbiB1c2UvdGVybWlub2xvZ3kKK2Rvam8uZnguaHRtbC5oaWdobGlnaHQgPSBkb2pvLmZ4Lmh0bWwuY29sb3JGYWRlSW47Citkb2pvLmZ4Lmh0bWwuY29sb3JGYWRlRnJvbSA9IGRvam8uZnguaHRtbC5jb2xvckZhZGVJbjsKKworLy8gRmFkZSBmcm9tIG5vZGUncyBiYWNrZ3JvdW5kIGNvbG9yIHRvIGVuZENvbG9yCitkb2pvLmZ4Lmh0bWwuY29sb3JGYWRlT3V0ID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGVuZENvbG9yLCBkZWxheSwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJaWYoIWRvam8ubGFuZy5pc051bWJlcihkdXJhdGlvbikpIHsKKwkJdmFyIHRtcCA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IGVuZENvbG9yOworCQllbmRDb2xvciA9IHRtcDsKKwl9CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgY29sb3IgPSBuZXcgZG9qby5ncmFwaGljcy5jb2xvci5Db2xvcihkb2pvLmh0bWwuZ2V0QmFja2dyb3VuZENvbG9yKG5vZGUpKS50b1JnYigpOworCisJdmFyIHJnYiA9IG5ldyBkb2pvLmdyYXBoaWNzLmNvbG9yLkNvbG9yKGVuZENvbG9yKS50b1JnYigpOworCXZhciBhbmltID0gZG9qby5meC5odG1sLmNvbG9yRmFkZShub2RlLCBkdXJhdGlvbnx8ZG9qby5meC5kdXJhdGlvbiwgY29sb3IsIHJnYiwgY2FsbGJhY2ssIGRlbGF5ID4gMCB8fCBkb250UGxheSk7CisJaWYoIGRlbGF5ID4gMCApIHsKKwkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAicmdiKCIgKyBjb2xvci5qb2luKCIsIikgKyAiKSI7CisJCWlmKCFkb250UGxheSkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YW5pbS5wbGF5KHRydWUpfSwgZGVsYXkpOyB9CisJfQorCXJldHVybiBhbmltOworfTsKKy8vIEZJWE1FOiBub3Qgc3VyZSB3aGljaCBuYW1lIGlzIGJldHRlci4gYW4gYWxpYXMgaGVyZSBtYXkgYmUgYmFkLgorZG9qby5meC5odG1sLnVuaGlnaGxpZ2h0ID0gZG9qby5meC5odG1sLmNvbG9yRmFkZU91dDsKK2Rvam8uZnguaHRtbC5jb2xvckZhZGVUbyA9IGRvam8uZnguaHRtbC5jb2xvckZhZGVPdXQ7CisKKy8vIEZhZGUgbm9kZSBiYWNrZ3JvdW5kIGZyb20gc3RhcnRDb2xvciB0byBlbmRDb2xvcgorZG9qby5meC5odG1sLmNvbG9yRmFkZSA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBzdGFydENvbG9yLCBlbmRDb2xvciwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJaWYoIWRvam8ubGFuZy5pc051bWJlcihkdXJhdGlvbikpIHsKKwkJdmFyIHRtcCA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IGVuZENvbG9yOworCQllbmRDb2xvciA9IHN0YXJ0Q29sb3I7CisJCXN0YXJ0Q29sb3IgPSB0bXA7CisJfQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHN0YXJ0UmdiID0gbmV3IGRvam8uZ3JhcGhpY3MuY29sb3IuQ29sb3Ioc3RhcnRDb2xvcikudG9SZ2IoKTsKKwl2YXIgZW5kUmdiID0gbmV3IGRvam8uZ3JhcGhpY3MuY29sb3IuQ29sb3IoZW5kQ29sb3IpLnRvUmdiKCk7CisJdmFyIGFuaW0gPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uKAorCQluZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKHN0YXJ0UmdiLCBlbmRSZ2IpLAorCQlkdXJhdGlvbnx8ZG9qby5meC5kdXJhdGlvbiwgMCk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKSB7CisJCW5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInJnYigiICsgZS5jb29yZHNBc0ludHMoKS5qb2luKCIsIikgKyAiKSI7CisJfSk7CisJaWYoY2FsbGJhY2spIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uKGUpIHsKKwkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQl9KTsKKwl9CisJaWYoICFkb250UGxheSApIHsgYW5pbS5wbGF5KHRydWUpOyB9CisJcmV0dXJuIGFuaW07Cit9OworCitkb2pvLmZ4Lmh0bWwud2lwZVNob3cgPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgb3ZlcmZsb3cgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgIm92ZXJmbG93Iik7CisJbm9kZS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCW5vZGUuc3R5bGUuaGVpZ2h0ID0gMDsKKwlkb2pvLmh0bWwuc2hvdyhub2RlKTsKKwl2YXIgYW5pbSA9IG5ldyBkb2pvLmFuaW1hdGlvbi5BbmltYXRpb24oW1swXSwgW25vZGUuc2Nyb2xsSGVpZ2h0XV0sIGR1cmF0aW9ufHxkb2pvLmZ4LmR1cmF0aW9uLCAwKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uKGUpIHsKKwkJbm9kZS5zdHlsZS5oZWlnaHQgPSBlLnggKyAicHgiOworCX0pOworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25FbmQiLCBmdW5jdGlvbigpIHsKKwkJbm9kZS5zdHlsZS5vdmVyZmxvdyA9IG92ZXJmbG93OworCQlub2RlLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKKwkJaWYoY2FsbGJhY2spIHsgY2FsbGJhY2sobm9kZSwgYW5pbSk7IH0KKwl9KTsKKwlpZighZG9udFBsYXkpIHsgYW5pbS5wbGF5KCk7IH0KKwlyZXR1cm4gYW5pbTsKK30KKworZG9qby5meC5odG1sLndpcGVIaWRlID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrLCBkb250UGxheSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIG92ZXJmbG93ID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJvdmVyZmxvdyIpOworCW5vZGUuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwl2YXIgYW5pbSA9IG5ldyBkb2pvLmFuaW1hdGlvbi5BbmltYXRpb24oW1tub2RlLm9mZnNldEhlaWdodF0sIFswXV0sIGR1cmF0aW9ufHxkb2pvLmZ4LmR1cmF0aW9uLCAwKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uKGUpIHsKKwkJbm9kZS5zdHlsZS5oZWlnaHQgPSBlLnggKyAicHgiOworCX0pOworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25FbmQiLCBmdW5jdGlvbigpIHsKKwkJbm9kZS5zdHlsZS5vdmVyZmxvdyA9IG92ZXJmbG93OworCQlkb2pvLmh0bWwuaGlkZShub2RlKTsKKwkJaWYoY2FsbGJhY2spIHsgY2FsbGJhY2sobm9kZSwgYW5pbSk7IH0KKwl9KTsKKwlpZighZG9udFBsYXkpIHsgYW5pbS5wbGF5KCk7IH0KKwlyZXR1cm4gYW5pbTsKK30KKworZG9qby5meC5odG1sLndpcGVyID0gZnVuY3Rpb24obm9kZSwgY29udHJvbE5vZGUpIHsKKwl0aGlzLm5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYoY29udHJvbE5vZGUpIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KGRvam8uYnlJZChjb250cm9sTm9kZSksICJvbmNsaWNrIiwgdGhpcywgInRvZ2dsZSIpOworCX0KK30KK2Rvam8ubGFuZy5leHRlbmQoZG9qby5meC5odG1sLndpcGVyLCB7CisJZHVyYXRpb246IGRvam8uZnguZHVyYXRpb24sCisJX2FuaW06IG51bGwsCisKKwl0b2dnbGU6IGZ1bmN0aW9uKCkgeworCQlpZighdGhpcy5fYW5pbSkgeworCQkJdmFyIHR5cGUgPSAid2lwZSIgKyAoZG9qby5odG1sLmlzVmlzaWJsZSh0aGlzLm5vZGUpID8gIkhpZGUiIDogIlNob3ciKTsKKwkJCXRoaXMuX2FuaW0gPSBkb2pvLmZ4W3R5cGVdKHRoaXMubm9kZSwgdGhpcy5kdXJhdGlvbiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJfY2FsbGJhY2siKSk7CisJCX0KKwl9LAorCisJX2NhbGxiYWNrOiBmdW5jdGlvbigpIHsKKwkJdGhpcy5fYW5pbSA9IG51bGw7CisJfQorfSk7CisKK2Rvam8uZnguaHRtbC53aXBlSW4gPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgc2F2ZWRIZWlnaHQgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImhlaWdodCIpOworCWRvam8uaHRtbC5zaG93KG5vZGUpOworCXZhciBoZWlnaHQgPSBub2RlLm9mZnNldEhlaWdodDsKKwl2YXIgYW5pbSA9IGRvam8uZnguaHRtbC53aXBlSW5Ub0hlaWdodChub2RlLCBkdXJhdGlvbiwgaGVpZ2h0LCBmdW5jdGlvbihlKSB7CisJCW5vZGUuc3R5bGUuaGVpZ2h0ID0gc2F2ZWRIZWlnaHQgfHwgImF1dG8iOworCQlpZihjYWxsYmFjaykgeyBjYWxsYmFjayhub2RlLCBhbmltKTsgfQorCX0sIGRvbnRQbGF5KTsKK307CisKK2Rvam8uZnguaHRtbC53aXBlSW5Ub0hlaWdodCA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBoZWlnaHQsIGNhbGxiYWNrLCBkb250UGxheSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHNhdmVkT3ZlcmZsb3cgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgIm92ZXJmbG93Iik7CisJLy8gRklYTUU6IHNob3VsZCB3ZSBiZSBzZXR0aW5nIGRpc3BsYXkgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gIiIgZm9yIHRoZSB0YWJsZSBlbGVtZW50cz8KKwlub2RlLnN0eWxlLmhlaWdodCA9ICIwcHgiOworCW5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlpZihzYXZlZE92ZXJmbG93ID09ICJ2aXNpYmxlIikgeworCQlub2RlLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJfQorCXZhciBkaXNwVHlwZSA9IGRvam8ubGFuZy5pbkFycmF5KG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBbJ3RyJywgJ3RkJywgJ3RoJ10pID8gIiIgOiAiYmxvY2siOworCW5vZGUuc3R5bGUuZGlzcGxheSA9IGRpc3BUeXBlOworCisJdmFyIGFuaW0gPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uKAorCQluZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKFswXSwgW2hlaWdodF0pLAorCQlkdXJhdGlvbnx8ZG9qby5meC5kdXJhdGlvbiwgMCk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKSB7CisJCW5vZGUuc3R5bGUuaGVpZ2h0ID0gTWF0aC5yb3VuZChlLngpICsgInB4IjsKKwl9KTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uRW5kIiwgZnVuY3Rpb24oZSkgeworCQlpZihzYXZlZE92ZXJmbG93ICE9ICJ2aXNpYmxlIikgeworCQkJbm9kZS5zdHlsZS5vdmVyZmxvdyA9IHNhdmVkT3ZlcmZsb3c7CisJCX0KKwkJaWYoY2FsbGJhY2spIHsgY2FsbGJhY2sobm9kZSwgYW5pbSk7IH0KKwl9KTsKKwlpZiggIWRvbnRQbGF5ICkgeyBhbmltLnBsYXkodHJ1ZSk7IH0KKwlyZXR1cm4gYW5pbTsKK30KKworZG9qby5meC5odG1sLndpcGVPdXQgPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgc2F2ZWRPdmVyZmxvdyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAib3ZlcmZsb3ciKTsKKwl2YXIgc2F2ZWRIZWlnaHQgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImhlaWdodCIpOworCXZhciBoZWlnaHQgPSBub2RlLm9mZnNldEhlaWdodDsKKwlub2RlLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisKKwl2YXIgYW5pbSA9IG5ldyBkb2pvLmFuaW1hdGlvbi5BbmltYXRpb24oCisJCW5ldyBkb2pvLm1hdGguY3VydmVzLkxpbmUoW2hlaWdodF0sIFswXSksCisJCWR1cmF0aW9ufHxkb2pvLmZ4LmR1cmF0aW9uLCAwKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uKGUpIHsKKwkJbm9kZS5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKGUueCkgKyAicHgiOworCX0pOworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25FbmQiLCBmdW5jdGlvbihlKSB7CisJCW5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJbm9kZS5zdHlsZS5vdmVyZmxvdyA9IHNhdmVkT3ZlcmZsb3c7CisJCW5vZGUuc3R5bGUuaGVpZ2h0ID0gc2F2ZWRIZWlnaHQgfHwgImF1dG8iOworCQlpZihjYWxsYmFjaykgeyBjYWxsYmFjayhub2RlLCBhbmltKTsgfQorCX0pOworCWlmKCAhZG9udFBsYXkgKSB7IGFuaW0ucGxheSh0cnVlKTsgfQorCXJldHVybiBhbmltOworfTsKKworZG9qby5meC5odG1sLmV4cGxvZGUgPSBmdW5jdGlvbihzdGFydCwgZW5kTm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrLCBkb250UGxheSkgeworCXZhciBzdGFydENvb3JkcyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVBcnJheShzdGFydCk7CisKKwl2YXIgb3V0bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXdpdGgob3V0bGluZS5zdHlsZSkgeworCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCWJvcmRlciA9ICIxcHggc29saWQgYmxhY2siOworCQlkaXNwbGF5ID0gIm5vbmUiOworCX0KKwlkb2pvLmh0bWwuYm9keSgpLmFwcGVuZENoaWxkKG91dGxpbmUpOworCisJZW5kTm9kZSA9IGRvam8uYnlJZChlbmROb2RlKTsKKwl3aXRoKGVuZE5vZGUuc3R5bGUpIHsKKwkJdmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQlkaXNwbGF5ID0gImJsb2NrIjsKKwl9CisJdmFyIGVuZENvb3JkcyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVBcnJheShlbmROb2RlKTsKKworCXdpdGgoZW5kTm9kZS5zdHlsZSkgeworCQlkaXNwbGF5ID0gIm5vbmUiOworCQl2aXNpYmlsaXR5ID0gInZpc2libGUiOworCX0KKworCXZhciBhbmltID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbigKKwkJbmV3IGRvam8ubWF0aC5jdXJ2ZXMuTGluZShzdGFydENvb3JkcywgZW5kQ29vcmRzKSwKKwkJZHVyYXRpb258fGRvam8uZnguZHVyYXRpb24sIDAKKwkpOworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25CZWdpbiIsIGZ1bmN0aW9uKGUpIHsKKwkJb3V0bGluZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwl9KTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uKGUpIHsKKwkJd2l0aChvdXRsaW5lLnN0eWxlKSB7CisJCQlsZWZ0ID0gZS54ICsgInB4IjsKKwkJCXRvcCA9IGUueSArICJweCI7CisJCQl3aWR0aCA9IGUuY29vcmRzWzJdICsgInB4IjsKKwkJCWhlaWdodCA9IGUuY29vcmRzWzNdICsgInB4IjsKKwkJfQorCX0pOworCisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uKCkgeworCQllbmROb2RlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCQlvdXRsaW5lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob3V0bGluZSk7CisJCWlmKGNhbGxiYWNrKSB7IGNhbGxiYWNrKGVuZE5vZGUsIGFuaW0pOyB9CisJfSk7CisJaWYoIWRvbnRQbGF5KSB7IGFuaW0ucGxheSgpOyB9CisJcmV0dXJuIGFuaW07Cit9OworCitkb2pvLmZ4Lmh0bWwuaW1wbG9kZSA9IGZ1bmN0aW9uKHN0YXJ0Tm9kZSwgZW5kLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7CisJdmFyIHN0YXJ0Q29vcmRzID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZUFycmF5KHN0YXJ0Tm9kZSk7CisJdmFyIGVuZENvb3JkcyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVBcnJheShlbmQpOworCisJc3RhcnROb2RlID0gZG9qby5ieUlkKHN0YXJ0Tm9kZSk7CisJdmFyIG91dGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl3aXRoKG91dGxpbmUuc3R5bGUpIHsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlib3JkZXIgPSAiMXB4IHNvbGlkIGJsYWNrIjsKKwkJZGlzcGxheSA9ICJub25lIjsKKwl9CisJZG9qby5odG1sLmJvZHkoKS5hcHBlbmRDaGlsZChvdXRsaW5lKTsKKworCXZhciBhbmltID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbigKKwkJbmV3IGRvam8ubWF0aC5jdXJ2ZXMuTGluZShzdGFydENvb3JkcywgZW5kQ29vcmRzKSwKKwkJZHVyYXRpb258fGRvam8uZnguZHVyYXRpb24sIDAKKwkpOworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25CZWdpbiIsIGZ1bmN0aW9uKGUpIHsKKwkJc3RhcnROb2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCW91dGxpbmUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJfSk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKSB7CisJCXdpdGgob3V0bGluZS5zdHlsZSkgeworCQkJbGVmdCA9IGUueCArICJweCI7CisJCQl0b3AgPSBlLnkgKyAicHgiOworCQkJd2lkdGggPSBlLmNvb3Jkc1syXSArICJweCI7CisJCQloZWlnaHQgPSBlLmNvb3Jkc1szXSArICJweCI7CisJCX0KKwl9KTsKKworCWRvam8uZXZlbnQuY29ubmVjdChhbmltLCAib25FbmQiLCBmdW5jdGlvbigpIHsKKwkJb3V0bGluZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGxpbmUpOworCQlpZihjYWxsYmFjaykgeyBjYWxsYmFjayhzdGFydE5vZGUsIGFuaW0pOyB9CisJfSk7CisJaWYoIWRvbnRQbGF5KSB7IGFuaW0ucGxheSgpOyB9CisJcmV0dXJuIGFuaW07Cit9OworCitkb2pvLmZ4Lmh0bWwuRXhwbG9kZXIgPSBmdW5jdGlvbih0cmlnZ2VyTm9kZSwgYm94Tm9kZSkgeworCXRyaWdnZXJOb2RlID0gZG9qby5ieUlkKHRyaWdnZXJOb2RlKTsKKwlib3hOb2RlID0gZG9qby5ieUlkKGJveE5vZGUpOworCXZhciBfdGhpcyA9IHRoaXM7CisKKwkvLyBjdXN0b20gb3B0aW9ucworCXRoaXMud2FpdFRvSGlkZSA9IDUwMDsKKwl0aGlzLnRpbWVUb1Nob3cgPSAxMDA7CisJdGhpcy53YWl0VG9TaG93ID0gMjAwOworCXRoaXMudGltZVRvSGlkZSA9IDcwOworCXRoaXMuYXV0b1Nob3cgPSBmYWxzZTsKKwl0aGlzLmF1dG9IaWRlID0gZmFsc2U7CisKKwl2YXIgYW5pbVNob3cgPSBudWxsOworCXZhciBhbmltSGlkZSA9IG51bGw7CisKKwl2YXIgc2hvd1RpbWVyID0gbnVsbDsKKwl2YXIgaGlkZVRpbWVyID0gbnVsbDsKKworCXZhciBzdGFydENvb3JkcyA9IG51bGw7CisJdmFyIGVuZENvb3JkcyA9IG51bGw7CisKKwl0aGlzLnNob3dpbmcgPSBmYWxzZTsKKworCXRoaXMub25CZWZvcmVFeHBsb2RlID0gbnVsbDsKKwl0aGlzLm9uQWZ0ZXJFeHBsb2RlID0gbnVsbDsKKwl0aGlzLm9uQmVmb3JlSW1wbG9kZSA9IG51bGw7CisJdGhpcy5vbkFmdGVySW1wbG9kZSA9IG51bGw7CisJdGhpcy5vbkV4cGxvZGluZyA9IG51bGw7CisJdGhpcy5vbkltcGxvZGluZyA9IG51bGw7CisKKwl0aGlzLnRpbWVTaG93ID0gZnVuY3Rpb24oKSB7CisJCWNsZWFyVGltZW91dChzaG93VGltZXIpOworCQlzaG93VGltZXIgPSBzZXRUaW1lb3V0KF90aGlzLnNob3csIF90aGlzLndhaXRUb1Nob3cpOworCX0KKworCXRoaXMuc2hvdyA9IGZ1bmN0aW9uKCkgeworCQljbGVhclRpbWVvdXQoc2hvd1RpbWVyKTsKKwkJY2xlYXJUaW1lb3V0KGhpZGVUaW1lcik7CisJCS8vdHJpZ2dlck5vZGUuYmx1cigpOworCisJCWlmKCAoYW5pbUhpZGUgJiYgYW5pbUhpZGUuc3RhdHVzKCkgPT0gInBsYXlpbmciKQorCQkJfHwgKGFuaW1TaG93ICYmIGFuaW1TaG93LnN0YXR1cygpID09ICJwbGF5aW5nIikKKwkJCXx8IF90aGlzLnNob3dpbmcgKSB7IHJldHVybjsgfQorCisJCWlmKHR5cGVvZiBfdGhpcy5vbkJlZm9yZUV4cGxvZGUgPT0gImZ1bmN0aW9uIikgeyBfdGhpcy5vbkJlZm9yZUV4cGxvZGUodHJpZ2dlck5vZGUsIGJveE5vZGUpOyB9CisJCWFuaW1TaG93ID0gZG9qby5meC5odG1sLmV4cGxvZGUodHJpZ2dlck5vZGUsIGJveE5vZGUsIF90aGlzLnRpbWVUb1Nob3csIGZ1bmN0aW9uKGUpIHsKKwkJCV90aGlzLnNob3dpbmcgPSB0cnVlOworCQkJaWYodHlwZW9mIF90aGlzLm9uQWZ0ZXJFeHBsb2RlID09ICJmdW5jdGlvbiIpIHsgX3RoaXMub25BZnRlckV4cGxvZGUodHJpZ2dlck5vZGUsIGJveE5vZGUpOyB9CisJCX0pOworCQlpZih0eXBlb2YgX3RoaXMub25FeHBsb2RpbmcgPT0gImZ1bmN0aW9uIikgeworCQkJZG9qby5ldmVudC5jb25uZWN0KGFuaW1TaG93LCAib25BbmltYXRlIiwgdGhpcywgIm9uRXhwbG9kaW5nIik7CisJCX0KKwl9CisKKwl0aGlzLnRpbWVIaWRlID0gZnVuY3Rpb24oKSB7CisJCWNsZWFyVGltZW91dChzaG93VGltZXIpOworCQljbGVhclRpbWVvdXQoaGlkZVRpbWVyKTsKKwkJaWYoX3RoaXMuc2hvd2luZykgeworCQkJaGlkZVRpbWVyID0gc2V0VGltZW91dChfdGhpcy5oaWRlLCBfdGhpcy53YWl0VG9IaWRlKTsKKwkJfQorCX0KKworCXRoaXMuaGlkZSA9IGZ1bmN0aW9uKCkgeworCQljbGVhclRpbWVvdXQoc2hvd1RpbWVyKTsKKwkJY2xlYXJUaW1lb3V0KGhpZGVUaW1lcik7CisJCWlmKCBhbmltU2hvdyAmJiBhbmltU2hvdy5zdGF0dXMoKSA9PSAicGxheWluZyIgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlfdGhpcy5zaG93aW5nID0gZmFsc2U7CisJCWlmKHR5cGVvZiBfdGhpcy5vbkJlZm9yZUltcGxvZGUgPT0gImZ1bmN0aW9uIikgeyBfdGhpcy5vbkJlZm9yZUltcGxvZGUodHJpZ2dlck5vZGUsIGJveE5vZGUpOyB9CisJCWFuaW1IaWRlID0gZG9qby5meC5odG1sLmltcGxvZGUoYm94Tm9kZSwgdHJpZ2dlck5vZGUsIF90aGlzLnRpbWVUb0hpZGUsIGZ1bmN0aW9uKGUpeworCQkJaWYodHlwZW9mIF90aGlzLm9uQWZ0ZXJJbXBsb2RlID09ICJmdW5jdGlvbiIpIHsgX3RoaXMub25BZnRlckltcGxvZGUodHJpZ2dlck5vZGUsIGJveE5vZGUpOyB9CisJCX0pOworCQlpZih0eXBlb2YgX3RoaXMub25JbXBsb2RpbmcgPT0gImZ1bmN0aW9uIikgeworCQkJZG9qby5ldmVudC5jb25uZWN0KGFuaW1IaWRlLCAib25BbmltYXRlIiwgdGhpcywgIm9uSW1wbG9kaW5nIik7CisJCX0KKwl9CisKKwkvLyB0cmlnZ2VyIGV2ZW50cworCWRvam8uZXZlbnQuY29ubmVjdCh0cmlnZ2VyTm9kZSwgIm9uY2xpY2siLCBmdW5jdGlvbihlKSB7CisJCWlmKF90aGlzLnNob3dpbmcpIHsKKwkJCV90aGlzLmhpZGUoKTsKKwkJfSBlbHNlIHsKKwkJCV90aGlzLnNob3coKTsKKwkJfQorCX0pOworCWRvam8uZXZlbnQuY29ubmVjdCh0cmlnZ2VyTm9kZSwgIm9ubW91c2VvdmVyIiwgZnVuY3Rpb24oZSkgeworCQlpZihfdGhpcy5hdXRvU2hvdykgeworCQkJX3RoaXMudGltZVNob3coKTsKKwkJfQorCX0pOworCWRvam8uZXZlbnQuY29ubmVjdCh0cmlnZ2VyTm9kZSwgIm9ubW91c2VvdXQiLCBmdW5jdGlvbihlKSB7CisJCWlmKF90aGlzLmF1dG9IaWRlKSB7CisJCQlfdGhpcy50aW1lSGlkZSgpOworCQl9CisJfSk7CisKKwkvLyBib3ggZXZlbnRzCisJZG9qby5ldmVudC5jb25uZWN0KGJveE5vZGUsICJvbm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGUpIHsKKwkJY2xlYXJUaW1lb3V0KGhpZGVUaW1lcik7CisJfSk7CisJZG9qby5ldmVudC5jb25uZWN0KGJveE5vZGUsICJvbm1vdXNlb3V0IiwgZnVuY3Rpb24oZSkgeworCQlpZihfdGhpcy5hdXRvSGlkZSkgeworCQkJX3RoaXMudGltZUhpZGUoKTsKKwkJfQorCX0pOworCisJLy8gZG9jdW1lbnQgZXZlbnRzCisJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2pvLmh0bWwuYm9keSgpLCAib25jbGljayIsIGZ1bmN0aW9uKGUpIHsKKwkJaWYoX3RoaXMuYXV0b0hpZGUgJiYgX3RoaXMuc2hvd2luZworCQkJJiYgIWRvam8uZG9tLmlzRGVzY2VuZGFudE9mKGUudGFyZ2V0LCBib3hOb2RlKQorCQkJJiYgIWRvam8uZG9tLmlzRGVzY2VuZGFudE9mKGUudGFyZ2V0LCB0cmlnZ2VyTm9kZSkgKSB7CisJCQlfdGhpcy5oaWRlKCk7CisJCX0KKwl9KTsKKworCXJldHVybiB0aGlzOworfTsKKworZG9qby5sYW5nLm1peGluKGRvam8uZngsIGRvam8uZnguaHRtbCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZngvc3ZnLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Z4L3N2Zy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA2MTYxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2Z4L3N2Zy5qcwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLmZ4LnN2ZyIpOworCitkb2pvLnJlcXVpcmUoImRvam8uc3ZnIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmFuaW1hdGlvbi4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworCitkb2pvLmZ4LnN2Zy5mYWRlT3V0ID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrKXsKKwlyZXR1cm4gZG9qby5meC5zdmcuZmFkZShub2RlLCBkdXJhdGlvbiwgZG9qby5zdmcuZ2V0T3BhY2l0eShub2RlKSwgMCwgY2FsbGJhY2spOworfTsKK2Rvam8uZnguc3ZnLmZhZGVJbiA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBjYWxsYmFjayl7CisJcmV0dXJuIGRvam8uZnguc3ZnLmZhZGUobm9kZSwgZHVyYXRpb24sIGRvam8uc3ZnLmdldE9wYWNpdHkobm9kZSksIDEsIGNhbGxiYWNrKTsKK307Citkb2pvLmZ4LnN2Zy5mYWRlSGlkZSA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBjYWxsYmFjayl7CisJaWYoIWR1cmF0aW9uKSB7IGR1cmF0aW9uID0gMTUwOyB9IC8vIHdoeSBub3QgaGF2ZSBhIGRlZmF1bHQ/CisJcmV0dXJuIGRvam8uZnguc3ZnLmZhZGVPdXQobm9kZSwgZHVyYXRpb24sIGZ1bmN0aW9uKG5vZGUpIHsKKwkJaWYodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpIHsgY2FsbGJhY2sobm9kZSk7IH0KKwl9KTsKK307Citkb2pvLmZ4LnN2Zy5mYWRlU2hvdyA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBjYWxsYmFjayl7CisJaWYoIWR1cmF0aW9uKSB7IGR1cmF0aW9uID0gMTUwOyB9IC8vIHdoeSBub3QgaGF2ZSBhIGRlZmF1bHQ/CisJcmV0dXJuIGRvam8uZnguc3ZnLmZhZGUobm9kZSwgZHVyYXRpb24sIDAsIDEsIGNhbGxiYWNrKTsKK307Citkb2pvLmZ4LnN2Zy5mYWRlID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIHN0YXJ0T3BhYywgZW5kT3BhYywgY2FsbGJhY2speworCXZhciBhbmltID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbigKKwkJbmV3IGRvam8ubWF0aC5jdXJ2ZXMuTGluZShbc3RhcnRPcGFjXSxbZW5kT3BhY10pLAorCQlkdXJhdGlvbiwKKwkJMAorCSk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKXsKKwkJZG9qby5zdmcuc2V0T3BhY2l0eShub2RlLCBlLngpOworCX0pOworCWlmIChjYWxsYmFjaykgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uRW5kIiwgZnVuY3Rpb24oZSl7CisJCQljYWxsYmFjayhub2RlLCBhbmltKTsKKwkJfSk7CisJfTsKKwlhbmltLnBsYXkodHJ1ZSk7CisJcmV0dXJuIGFuaW07Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8JVE9ETworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8JU0xJREVTCitkb2pvLmZ4LnN2Zy5zbGlkZVRvID0gZnVuY3Rpb24obm9kZSwgZW5kQ29vcmRzLCBkdXJhdGlvbiwgY2FsbGJhY2spIHsgfTsKK2Rvam8uZnguc3ZnLnNsaWRlQnkgPSBmdW5jdGlvbihub2RlLCBjb29yZHMsIGR1cmF0aW9uLCBjYWxsYmFjaykgeyB9OworZG9qby5meC5zdmcuc2xpZGUgPSBmdW5jdGlvbihub2RlLCBzdGFydENvb3JkcywgZW5kQ29vcmRzLCBkdXJhdGlvbiwgY2FsbGJhY2spIHsgCisJdmFyIGFuaW0gPSBuZXcgZG9qby5hbmltYXRpb24uQW5pbWF0aW9uKAorCQluZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKFtzdGFydENvb3Jkc10sW2VuZENvb3Jkc10pLAorCQlkdXJhdGlvbiwKKwkJMAorCSk7CisJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkFuaW1hdGUiLCBmdW5jdGlvbihlKXsKKwkJZG9qby5zdmcuc2V0Q29vcmRzKG5vZGUsIHt4OiBlLngsIHk6IGUueSB9KTsKKwl9KTsKKwlpZiAoY2FsbGJhY2spIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KGFuaW0sICJvbkVuZCIsIGZ1bmN0aW9uKGUpeworCQkJY2FsbGJhY2sobm9kZSwgYW5pbSk7CisJCX0pOworCX07CisJYW5pbS5wbGF5KHRydWUpOworCXJldHVybiBhbmltOworfTsKKworLy8JQ09MT1JTCitkb2pvLmZ4LnN2Zy5jb2xvckZhZGVJbiA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0UkdCLCBkdXJhdGlvbiwgZGVsYXksIGNhbGxiYWNrKSB7IH07Citkb2pvLmZ4LnN2Zy5oaWdobGlnaHQgPSBkb2pvLmZ4LnN2Zy5jb2xvckZhZGVJbjsKK2Rvam8uZnguc3ZnLmNvbG9yRmFkZUZyb20gPSBkb2pvLmZ4LnN2Zy5jb2xvckZhZGVJbjsKKworZG9qby5meC5zdmcuY29sb3JGYWRlT3V0ID0gZnVuY3Rpb24obm9kZSwgZW5kUkdCLCBkdXJhdGlvbiwgZGVsYXksIGNhbGxiYWNrKSB7IH07Citkb2pvLmZ4LnN2Zy51bmhpZ2hsaWdodCA9IGRvam8uZnguc3ZnLmNvbG9yRmFkZU91dDsKK2Rvam8uZnguc3ZnLmNvbG9yRmFkZVRvID0gZG9qby5meC5zdmcuY29sb3JGYWRlT3V0OworCitkb2pvLmZ4LnN2Zy5jb2xvckZhZGUgPSBmdW5jdGlvbihub2RlLCBzdGFydFJHQiwgZW5kUkdCLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7IH07CisKKy8vCVdJUEVTCitkb2pvLmZ4LnN2Zy53aXBlSW4gPSBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgY2FsbGJhY2ssIGRvbnRQbGF5KSB7IH07Citkb2pvLmZ4LnN2Zy53aXBlSW5Ub0hlaWdodCA9IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBoZWlnaHQsIGNhbGxiYWNrLCBkb250UGxheSkgeyB9Citkb2pvLmZ4LnN2Zy53aXBlT3V0ID0gZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrLCBkb250UGxheSkgeyB9OworCisvLwlFeHBsb2RlIGFuZCBJbXBsb2RlCitkb2pvLmZ4LnN2Zy5leHBsb2RlID0gZnVuY3Rpb24oc3RhcnROb2RlLCBlbmROb2RlLCBkdXJhdGlvbiwgY2FsbGJhY2spIHsgfTsKK2Rvam8uZnguc3ZnLmV4cGxvZGVGcm9tQm94ID0gZnVuY3Rpb24oc3RhcnRDb29yZHMsIGVuZE5vZGUsIGR1cmF0aW9uLCBjYWxsYmFjaykgeyB9OworZG9qby5meC5zdmcuaW1wbG9kZSA9IGZ1bmN0aW9uKHN0YXJ0Tm9kZSwgZW5kTm9kZSwgZHVyYXRpb24sIGNhbGxiYWNrKSB7IH07Citkb2pvLmZ4LnN2Zy5pbXBsb2RlVG9Cb3ggPSBmdW5jdGlvbihzdGFydE5vZGUsIGVuZENvb3JkcywgZHVyYXRpb24sIGNhbGxiYWNrKSB7IH07Citkb2pvLmZ4LnN2Zy5FeHBsb2RlciA9IGZ1bmN0aW9uKHRyaWdnZXJOb2RlLCBib3hOb2RlKSB7IH07CisKKy8vCWh0bWwgbWl4ZXMgaW4sIHdlIHdhbnQgU1ZHIHRvIHJlbWFpbiBzZXBhcmF0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9Db2xvcnNwYWNlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9Db2xvcnNwYWNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzA0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L0NvbG9yc3BhY2UuanMKQEAgLTAsMCArMSw3MjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZ2Z4LkNvbG9yc3BhY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgubWF0cml4Iik7Citkb2pvLmdmeC5Db2xvcnNwYWNlID0gZnVuY3Rpb24gKCkgeworCXRoaXMud2hpdGVQb2ludCA9ICJENjUiOworCXRoaXMuc3RkT2JzZXJ2ZXIgPSAiMTAiOworCXRoaXMuY2hyb21hdGljQWRhcHRhdGlvbkFsZyA9ICJicmFkZm9yZCI7CisJdGhpcy5SR0JXb3JraW5nU3BhY2UgPSAic19yZ2IiOworCXRoaXMudXNlQXBwcm94Q0lFTGFiTWFwcGluZyA9IDE7CisJdGhpcy5jaGFpbk1hcHMgPSB7IlJHQl90b194eVkiOlsiWFlaIl0sICJ4eVlfdG9fUkdCIjpbIlhZWiJdLCAiUkdCX3RvX0xhYiI6WyJYWVoiXSwgIkxhYl90b19SR0IiOlsiWFlaIl0sICJSR0JfdG9fTENIYWIiOlsiWFlaIiwgIkxhYiJdLCAiTENIYWJfdG9fUkdCIjpbIkxhYiJdLCAieHlZX3RvX0xhYiI6WyJYWVoiXSwgIkxhYl90b194eVkiOlsiWFlaIl0sICJYWVpfdG9fTENIYWIiOlsiTGFiIl0sICJMQ0hhYl90b19YWVoiOlsiTGFiIl0sICJ4eVlfdG9fTENIYWIiOlsiWFlaIiwgIkxhYiJdLCAiTENIYWJfdG9feHlZIjpbIkxhYiIsICJYWVoiXSwgIlJHQl90b19MdXYiOlsiWFlaIl0sICJMdXZfdG9fUkdCIjpbIlhZWiJdLCAieHlZX3RvX0x1diI6WyJYWVoiXSwgIkx1dl90b194eVkiOlsiWFlaIl0sICJMYWJfdG9fTHV2IjpbIlhZWiJdLCAiTHV2X3RvX0xhYiI6WyJYWVoiXSwgIkxDSGFiX3RvX0x1diI6WyJMYWIiLCAiWFlaIl0sICJMdXZfdG9fTENIYWIiOlsiWFlaIiwgIkxhYiJdLCAiUkdCX3RvX0xDSHV2IjpbIlhZWiIsICJMdXYiXSwgIkxDSHV2X3RvX1JHQiI6WyJMdXYiLCAiWFlaIl0sICJYWVpfdG9fTENIdXYiOlsiTHV2Il0sICJMQ0h1dl90b19YWVoiOlsiTHV2Il0sICJ4eVlfdG9fTENIdXYiOlsiWFlaIiwgIkx1diJdLCAiTENIdXZfdG9feHlZIjpbIkx1diIsICJYWVoiXSwgIkxhYl90b19MQ0h1diI6WyJYWVoiLCAiTHV2Il0sICJMQ0h1dl90b19MYWIiOlsiTHV2IiwgIlhZWiJdLCAiTENIYWJfdG9fTENIdXYiOlsiTGFiIiwgIlhZWiIsICJMdXYiXSwgIkxDSHV2X3RvX0xDSGFiIjpbIkx1diIsICJYWVoiLCAiTGFiIl0sICJYWVpfdG9fQ01ZIjpbIlJHQiJdLCAiQ01ZX3RvX1hZWiI6WyJSR0IiXSwgInh5WV90b19DTVkiOlsiUkdCIl0sICJDTVlfdG9feHlZIjpbIlJHQiJdLCAiTGFiX3RvX0NNWSI6WyJSR0IiXSwgIkNNWV90b19MYWIiOlsiUkdCIl0sICJMQ0hhYl90b19DTVkiOlsiUkdCIl0sICJDTVlfdG9fTENIYWIiOlsiUkdCIl0sICJMdXZfdG9fQ01ZIjpbIlJHQiJdLCAiQ01ZX3RvX0x1diI6WyJSR0IiXSwgIkxDSHV2X3RvX0NNWSI6WyJSR0IiXSwgIkNNWV90b19MQ0h1diI6WyJSR0IiXSwgIlhZWl90b19IU0wiOlsiUkdCIl0sICJIU0xfdG9fWFlaIjpbIlJHQiJdLCAieHlZX3RvX0hTTCI6WyJSR0IiXSwgIkhTTF90b194eVkiOlsiUkdCIl0sICJMYWJfdG9fSFNMIjpbIlJHQiJdLCAiSFNMX3RvX0xhYiI6WyJSR0IiXSwgIkxDSGFiX3RvX0hTTCI6WyJSR0IiXSwgIkhTTF90b19MQ0hhYiI6WyJSR0IiXSwgIkx1dl90b19IU0wiOlsiUkdCIl0sICJIU0xfdG9fTHV2IjpbIlJHQiJdLCAiTENIdXZfdG9fSFNMIjpbIlJHQiJdLCAiSFNMX3RvX0xDSHV2IjpbIlJHQiJdLCAiQ01ZX3RvX0hTTCI6WyJSR0IiXSwgIkhTTF90b19DTVkiOlsiUkdCIl0sICJDTVlLX3RvX0hTTCI6WyJSR0IiXSwgIkhTTF90b19DTVlLIjpbIlJHQiJdLCAiWFlaX3RvX0hTViI6WyJSR0IiXSwgIkhTVl90b19YWVoiOlsiUkdCIl0sICJ4eVlfdG9fSFNWIjpbIlJHQiJdLCAiSFNWX3RvX3h5WSI6WyJSR0IiXSwgIkxhYl90b19IU1YiOlsiUkdCIl0sICJIU1ZfdG9fTGFiIjpbIlJHQiJdLCAiTENIYWJfdG9fSFNWIjpbIlJHQiJdLCAiSFNWX3RvX0xDSGFiIjpbIlJHQiJdLCAiTHV2X3RvX0hTViI6WyJSR0IiXSwgIkhTVl90b19MdXYiOlsiUkdCIl0sICJMQ0h1dl90b19IU1YiOlsiUkdCIl0sICJIU1ZfdG9fTENIdXYiOlsiUkdCIl0sICJDTVlfdG9fSFNWIjpbIlJHQiJdLCAiSFNWX3RvX0NNWSI6WyJSR0IiXSwgIkNNWUtfdG9fSFNWIjpbIlJHQiJdLCAiSFNWX3RvX0NNWUsiOlsiUkdCIl0sICJIU0xfdG9fSFNWIjpbIlJHQiJdLCAiSFNWX3RvX0hTTCI6WyJSR0IiXSwgIlhZWl90b19DTVlLIjpbIlJHQiJdLCAiQ01ZS190b19YWVoiOlsiUkdCIl0sICJ4eVlfdG9fQ01ZSyI6WyJSR0IiXSwgIkNNWUtfdG9feHlZIjpbIlJHQiJdLCAiTGFiX3RvX0NNWUsiOlsiUkdCIl0sICJDTVlLX3RvX0xhYiI6WyJSR0IiXSwgIkxDSGFiX3RvX0NNWUsiOlsiUkdCIl0sICJDTVlLX3RvX0xDSGFiIjpbIlJHQiJdLCAiTHV2X3RvX0NNWUsiOlsiUkdCIl0sICJDTVlLX3RvX0x1diI6WyJSR0IiXSwgIkxDSHV2X3RvX0NNWUsiOlsiUkdCIl0sICJDTVlLX3RvX0xDSHV2IjpbIlJHQiJdfTsKKwlyZXR1cm4gdGhpczsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5jb252ZXJ0ID0gZnVuY3Rpb24gKGNvbCwgbW9kZWxfZnJvbSwgbW9kZWxfdG8pIHsKKwl2YXIgayA9IG1vZGVsX2Zyb20gKyAiX3RvXyIgKyBtb2RlbF90bzsKKwlpZiAodGhpc1trXSkgeworCQlyZXR1cm4gdGhpc1trXShjb2wpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmNoYWluTWFwc1trXSkgeworCQkJdmFyIGN1ciA9IG1vZGVsX2Zyb207CisJCQl2YXIgbW9kZWxzID0gdGhpcy5jaGFpbk1hcHNba10uY29uY2F0KCk7CisJCQltb2RlbHMucHVzaChtb2RlbF90byk7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVscy5sZW5ndGg7IGkrKykgeworCQkJCWNvbCA9IHRoaXMuY29udmVydChjb2wsIGN1ciwgbW9kZWxzW2ldKTsKKwkJCQljdXIgPSBtb2RlbHNbaV07CisJCQl9CisJCQlyZXR1cm4gY29sOworCQl9IGVsc2UgeworCQkJZG9qby5kZWJ1ZygiQ2FuJ3QgY29udmVydCBmcm9tICIgKyBtb2RlbF9mcm9tICsgIiB0byAiICsgbW9kZWxfdG8pOworCQl9CisJfQorfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLm11bmdlID0gZnVuY3Rpb24gKGtleXMsIGFyZ3MpIHsKKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkoYXJnc1swXSkpIHsKKwkJYXJncyA9IGFyZ3NbMF07CisJfQorCXZhciBvdXQgPSBuZXcgQXJyYXkoKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKwkJb3V0W2tleXMuY2hhckF0KGkpXSA9IGFyZ3NbaV07CisJfQorCXJldHVybiBvdXQ7Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuZ2V0V2hpdGVQb2ludCA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgeCA9IDA7CisJdmFyIHkgPSAwOworCXZhciB0ID0gMDsKKwlzd2l0Y2ggKHRoaXMuc3RkT2JzZXJ2ZXIpIHsKKwkgIGNhc2UgIjIiOgorCQlzd2l0Y2ggKHRoaXMud2hpdGVQb2ludCkgeworCQkgIGNhc2UgIkUiOgorCQkJeCA9IDEgLyAzOworCQkJeSA9IDEgLyAzOworCQkJdCA9IDU0MDA7CisJCQlicmVhazsKKwkJICBjYXNlICJENTAiOgorCQkJeCA9IDAuMzQ1Njc7CisJCQl5ID0gMC4zNTg1OworCQkJdCA9IDUwMDA7CisJCQlicmVhazsKKwkJICBjYXNlICJENTUiOgorCQkJeCA9IDAuMzMyNDI7CisJCQl5ID0gMC4zNDc0MzsKKwkJCXQgPSA1NTAwOworCQkJYnJlYWs7CisJCSAgY2FzZSAiRDY1IjoKKwkJCXggPSAwLjMxMjcxOworCQkJeSA9IDAuMzI5MDI7CisJCQl0ID0gNjUwMDsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkQ3NSI6CisJCQl4ID0gMC4yOTkwMjsKKwkJCXkgPSAwLjMxNDg1OworCQkJdCA9IDc1MDA7CisJCQlicmVhazsKKwkJICBjYXNlICJBIjoKKwkJCXggPSAwLjQ0NzU3OworCQkJeSA9IDAuNDA3NDU7CisJCQl0ID0gMjg1NjsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkIiOgorCQkJeCA9IDAuMzQ4NDI7CisJCQl5ID0gMC4zNTE2MTsKKwkJCXQgPSA0ODc0OworCQkJYnJlYWs7CisJCSAgY2FzZSAiQyI6CisJCQl4ID0gMC4zMTAwNjsKKwkJCXkgPSAwLjMxNjE2OworCQkJdCA9IDY3NzQ7CisJCQlicmVhazsKKwkJICBjYXNlICI5MzAwIjoKKwkJCXggPSAwLjI4NDg7CisJCQl5ID0gMC4yOTMyOworCQkJdCA9IDkzMDA7CisJCQlicmVhazsKKwkJICBjYXNlICJGMiI6CisJCQl4ID0gMC4zNzIwNzsKKwkJCXkgPSAwLjM3NTEyOworCQkJdCA9IDQyMDA7CisJCQlicmVhazsKKwkJICBjYXNlICJGNyI6CisJCQl4ID0gMC4zMTI4NTsKKwkJCXkgPSAwLjMyOTE4OworCQkJdCA9IDY1MDA7CisJCQlicmVhazsKKwkJICBjYXNlICJGMTEiOgorCQkJeCA9IDAuMzgwNTQ7CisJCQl5ID0gMC4zNzY5MTsKKwkJCXQgPSA0MDAwOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCWRvam8uZGVidWcoIldoaXRlIHBvaW50ICIgKyB0aGlzLndoaXRlUG9pbnQgKyAiIGlzbid0IGRlZmluZWQgZm9yIFN0ZC4gT2JzZXJ2ZXIgIiArIHRoaXMuc3RyT2JzZXJ2ZXIpOworCQl9CisJCWJyZWFrOworCSAgY2FzZSAiMTAiOgorCQlzd2l0Y2ggKHRoaXMud2hpdGVQb2ludCkgeworCQkgIGNhc2UgIkUiOgorCQkJeCA9IDEgLyAzOworCQkJeSA9IDEgLyAzOworCQkJdCA9IDU0MDA7CisJCQlicmVhazsKKwkJICBjYXNlICJENTAiOgorCQkJeCA9IDAuMzQ3NzM7CisJCQl5ID0gMC4zNTk1MjsKKwkJCXQgPSA1MDAwOworCQkJYnJlYWs7CisJCSAgY2FzZSAiRDU1IjoKKwkJCXggPSAwLjMzNDExOworCQkJeSA9IDAuMzQ4Nzc7CisJCQl0ID0gNTUwMDsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkQ2NSI6CisJCQl4ID0gMC4zMTM4MjsKKwkJCXkgPSAwLjMzMTsKKwkJCXQgPSA2NTAwOworCQkJYnJlYWs7CisJCSAgY2FzZSAiRDc1IjoKKwkJCXggPSAwLjI5OTY4OworCQkJeSA9IDAuMzE3NDsKKwkJCXQgPSA3NTAwOworCQkJYnJlYWs7CisJCSAgY2FzZSAiQSI6CisJCQl4ID0gMC40NTExNzsKKwkJCXkgPSAwLjQwNTk0OworCQkJdCA9IDI4NTY7CisJCQlicmVhazsKKwkJICBjYXNlICJCIjoKKwkJCXggPSAwLjM0OTg7CisJCQl5ID0gMC4zNTI3OworCQkJdCA9IDQ4NzQ7CisJCQlicmVhazsKKwkJICBjYXNlICJDIjoKKwkJCXggPSAwLjMxMDM5OworCQkJeSA9IDAuMzE5MDU7CisJCQl0ID0gNjc3NDsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkYyIjoKKwkJCXggPSAwLjM3OTI4OworCQkJeSA9IDAuMzY3MjM7CisJCQl0ID0gNDIwMDsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkY3IjoKKwkJCXggPSAwLjMxNTY1OworCQkJeSA9IDAuMzI5NTE7CisJCQl0ID0gNjUwMDsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkYxMSI6CisJCQl4ID0gMC4zODU0MzsKKwkJCXkgPSAwLjM3MTE7CisJCQl0ID0gNDAwMDsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlkb2pvLmRlYnVnKCJXaGl0ZSBwb2ludCAiICsgdGhpcy53aGl0ZVBvaW50ICsgIiBpc24ndCBkZWZpbmVkIGZvciBTdGQuIE9ic2VydmVyICIgKyB0aGlzLnN0ck9ic2VydmVyKTsKKwkJfQorCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCWRvam8uZGVidWcoIlN0ZC4gT2JzZXJ2ZXIgIiArIHRoaXMuc3RyT2JzZXJ2ZXIgKyAiIGlzbid0IGRlZmluZWQiKTsKKwl9CisJdmFyIHogPSAxIC0geCAtIHk7CisJdmFyIHdwID0geyJ4Ijp4LCAieSI6eSwgInoiOnosICJ0Ijp0fTsKKwl3cC5ZID0gMTsKKwl2YXIgWFlaID0gdGhpcy54eVlfdG9fWFlaKFt3cC54LCB3cC55LCB3cC5ZXSk7CisJd3AuWCA9IFhZWlswXTsKKwl3cC5ZID0gWFlaWzFdOworCXdwLlogPSBYWVpbMl07CisJcmV0dXJuIHdwOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLmdldFByaW1hcmllcyA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgbSA9IFtdOworCXN3aXRjaCAodGhpcy5SR0JXb3JraW5nU3BhY2UpIHsKKwkgIGNhc2UgImFkb2JlX3JnYl8xOTk4IjoKKwkJbSA9IFsyLjIsICJENjUiLCAwLjY0LCAwLjMzLCAwLjI5NzM2MSwgMC4yMSwgMC43MSwgMC42MjczNTUsIDAuMTUsIDAuMDYsIDAuMDc1Mjg1XTsKKwkJYnJlYWs7CisJICBjYXNlICJhcHBsZV9yZ2IiOgorCQltID0gWzEuOCwgIkQ2NSIsIDAuNjI1LCAwLjM0LCAwLjI0NDYzNCwgMC4yOCwgMC41OTUsIDAuNjcyMDM0LCAwLjE1NSwgMC4wNywgMC4wODMzMzJdOworCQlicmVhazsKKwkgIGNhc2UgImJlc3RfcmdiIjoKKwkJbSA9IFsyLjIsICJENTAiLCAwLjczNDcsIDAuMjY1MywgMC4yMjg0NTcsIDAuMjE1LCAwLjc3NSwgMC43MzczNTIsIDAuMTMsIDAuMDM1LCAwLjAzNDE5MV07CisJCWJyZWFrOworCSAgY2FzZSAiYmV0YV9yZ2IiOgorCQltID0gWzIuMiwgIkQ1MCIsIDAuNjg4OCwgMC4zMTEyLCAwLjMwMzI3MywgMC4xOTg2LCAwLjc1NTEsIDAuNjYzNzg2LCAwLjEyNjUsIDAuMDM1MiwgMC4wMzI5NDFdOworCQlicmVhazsKKwkgIGNhc2UgImJydWNlX3JnYiI6CisJCW0gPSBbMi4yLCAiRDY1IiwgMC42NCwgMC4zMywgMC4yNDA5OTUsIDAuMjgsIDAuNjUsIDAuNjgzNTU0LCAwLjE1LCAwLjA2LCAwLjA3NTQ1Ml07CisJCWJyZWFrOworCSAgY2FzZSAiY2llX3JnYiI6CisJCW0gPSBbMi4yLCAiRSIsIDAuNzM1LCAwLjI2NSwgMC4xNzYyMDQsIDAuMjc0LCAwLjcxNywgMC44MTI5ODUsIDAuMTY3LCAwLjAwOSwgMC4wMTA4MTFdOworCQlicmVhazsKKwkgIGNhc2UgImNvbG9yX21hdGNoX3JnYiI6CisJCW0gPSBbMS44LCAiRDUwIiwgMC42MywgMC4zNCwgMC4yNzQ4ODQsIDAuMjk1LCAwLjYwNSwgMC42NTgxMzIsIDAuMTUsIDAuMDc1LCAwLjA2Njk4NV07CisJCWJyZWFrOworCSAgY2FzZSAiZG9uX3JnYl80IjoKKwkJbSA9IFsyLjIsICJENTAiLCAwLjY5NiwgMC4zLCAwLjI3ODM1LCAwLjIxNSwgMC43NjUsIDAuNjg3OTcsIDAuMTMsIDAuMDM1LCAwLjAzMzY4XTsKKwkJYnJlYWs7CisJICBjYXNlICJlY2lfcmdiIjoKKwkJbSA9IFsxLjgsICJENTAiLCAwLjY3LCAwLjMzLCAwLjMyMDI1LCAwLjIxLCAwLjcxLCAwLjYwMjA3MSwgMC4xNCwgMC4wOCwgMC4wNzc2NzldOworCQlicmVhazsKKwkgIGNhc2UgImVrdGFfc3BhY2VfcHM1IjoKKwkJbSA9IFsyLjIsICJENTAiLCAwLjY5NSwgMC4zMDUsIDAuMjYwNjI5LCAwLjI2LCAwLjcsIDAuNzM0OTQ2LCAwLjExLCAwLjAwNSwgMC4wMDQ0MjVdOworCQlicmVhazsKKwkgIGNhc2UgIm50c2NfcmdiIjoKKwkJbSA9IFsyLjIsICJDIiwgMC42NywgMC4zMywgMC4yOTg4MzksIDAuMjEsIDAuNzEsIDAuNTg2ODExLCAwLjE0LCAwLjA4LCAwLjExNDM1XTsKKwkJYnJlYWs7CisJICBjYXNlICJwYWxfc2VjYW1fcmdiIjoKKwkJbSA9IFsyLjIsICJENjUiLCAwLjY0LCAwLjMzLCAwLjIyMjAyMSwgMC4yOSwgMC42LCAwLjcwNjY0NSwgMC4xNSwgMC4wNiwgMC4wNzEzMzRdOworCQlicmVhazsKKwkgIGNhc2UgInByb19waG90b19yZ2IiOgorCQltID0gWzEuOCwgIkQ1MCIsIDAuNzM0NywgMC4yNjUzLCAwLjI4ODA0LCAwLjE1OTYsIDAuODQwNCwgMC43MTE4NzQsIDAuMDM2NiwgMC4wMDAxLCAwLjAwMDA4Nl07CisJCWJyZWFrOworCSAgY2FzZSAic21wdGUtY19yZ2IiOgorCQltID0gWzIuMiwgIkQ2NSIsIDAuNjMsIDAuMzQsIDAuMjEyMzk1LCAwLjMxLCAwLjU5NSwgMC43MDEwNDksIDAuMTU1LCAwLjA3LCAwLjA4NjU1Nl07CisJCWJyZWFrOworCSAgY2FzZSAic19yZ2IiOgorCQltID0gWzIuMiwgIkQ2NSIsIDAuNjQsIDAuMzMsIDAuMjEyNjU2LCAwLjMsIDAuNiwgMC43MTUxNTgsIDAuMTUsIDAuMDYsIDAuMDcyMTg2XTsKKwkJYnJlYWs7CisJICBjYXNlICJ3aWRlX2dhbXV0X3JnYiI6CisJCW0gPSBbMi4yLCAiRDUwIiwgMC43MzUsIDAuMjY1LCAwLjI1ODE4NywgMC4xMTUsIDAuODI2LCAwLjcyNDkzOCwgMC4xNTcsIDAuMDE4LCAwLjAxNjg3NV07CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJZG9qby5kZWJ1ZygiUkdCIHdvcmtpbmcgc3BhY2UgIiArIHRoaXMuUkdCV29ya2luZ1NwYWNlICsgIiBpc24ndCBkZWZpbmVkIik7CisJfQorCXZhciBwID0ge25hbWU6dGhpcy5SR0JXb3JraW5nU3BhY2UsIGdhbW1hOm1bMF0sIHdwOm1bMV0sIHhyOm1bMl0sIHlyOm1bM10sIFlyOm1bNF0sIHhnOm1bNV0sIHlnOm1bNl0sIFlnOm1bN10sIHhiOm1bOF0sIHliOm1bOV0sIFliOm1bMTBdfTsKKwlpZiAocC53cCAhPSB0aGlzLndoaXRlUG9pbnQpIHsKKwkJdmFyIHIgPSB0aGlzLlhZWl90b194eVkodGhpcy5jaHJvbWF0aWNBZGFwdGF0aW9uKHRoaXMueHlZX3RvX1hZWihbcC54ciwgcC55ciwgcC5Zcl0pLCBwLndwLCB0aGlzLndoaXRlUG9pbnQpKTsKKwkJdmFyIGcgPSB0aGlzLlhZWl90b194eVkodGhpcy5jaHJvbWF0aWNBZGFwdGF0aW9uKHRoaXMueHlZX3RvX1hZWihbcC54ZywgcC55ZywgcC5ZZ10pLCBwLndwLCB0aGlzLndoaXRlUG9pbnQpKTsKKwkJdmFyIGIgPSB0aGlzLlhZWl90b194eVkodGhpcy5jaHJvbWF0aWNBZGFwdGF0aW9uKHRoaXMueHlZX3RvX1hZWihbcC54YiwgcC55YiwgcC5ZYl0pLCBwLndwLCB0aGlzLndoaXRlUG9pbnQpKTsKKwkJcC54ciA9IHJbMF07CisJCXAueXIgPSByWzFdOworCQlwLllyID0gclsyXTsKKwkJcC54ZyA9IGdbMF07CisJCXAueWcgPSBnWzFdOworCQlwLllnID0gZ1syXTsKKwkJcC54YiA9IGJbMF07CisJCXAueWIgPSBiWzFdOworCQlwLlliID0gYlsyXTsKKwkJcC53cCA9IHRoaXMud2hpdGVQb2ludDsKKwl9CisJcC56ciA9IDEgLSBwLnhyIC0gcC55cjsKKwlwLnpnID0gMSAtIHAueGcgLSBwLnlnOworCXAuemIgPSAxIC0gcC54YiAtIHAueWI7CisJcmV0dXJuIHA7Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuZXBzaWxvbiA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy51c2VBcHByb3hDSUVMYWJNYXBwaW5nID8gMC4wMDg4NTYgOiAyMTYgLyAyNDI4OTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5rYXBwYSA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy51c2VBcHByb3hDSUVMYWJNYXBwaW5nID8gOTAzLjMgOiAyNDM4OSAvIDI3OworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLlhZWl90b194eVkgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIlhZWiIsIGFyZ3VtZW50cyk7CisJdmFyIHN1bSA9IHNyYy5YICsgc3JjLlkgKyBzcmMuWjsKKwlpZiAoc3VtID09IDApIHsKKwkJdmFyIHdwID0gdGhpcy5nZXRXaGl0ZVBvaW50KCk7CisJCXZhciB4ID0gd3AueDsKKwkJdmFyIHkgPSB3cC55OworCX0gZWxzZSB7CisJCXZhciB4ID0gc3JjLlggLyBzdW07CisJCXZhciB5ID0gc3JjLlkgLyBzdW07CisJfQorCXZhciBZID0gc3JjLlk7CisJcmV0dXJuIFt4LCB5LCBZXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS54eVlfdG9fWFlaID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJ4eVkiLCBhcmd1bWVudHMpOworCWlmIChzcmMueSA9PSAwKSB7CisJCXZhciBYID0gMDsKKwkJdmFyIFkgPSAwOworCQl2YXIgWiA9IDA7CisJfSBlbHNlIHsKKwkJdmFyIFggPSAoc3JjLnggKiBzcmMuWSkgLyBzcmMueTsKKwkJdmFyIFkgPSBzcmMuWTsKKwkJdmFyIFogPSAoKDEgLSBzcmMueCAtIHNyYy55KSAqIHNyYy5ZKSAvIHNyYy55OworCX0KKwlyZXR1cm4gW1gsIFksIFpdOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLlJHQl90b19YWVogPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIlJHQiIsIGFyZ3VtZW50cyk7CisJdmFyIG0gPSB0aGlzLmdldFJHQl9YWVpfTWF0cml4KCk7CisJdmFyIHByID0gdGhpcy5nZXRQcmltYXJpZXMoKTsKKwlpZiAodGhpcy5SR0JXb3JraW5nU3BhY2UgPT0gInNfcmdiIikgeworCQl2YXIgciA9IChzcmMuUiA+IDAuMDQwNDUpID8gTWF0aC5wb3coKChzcmMuUiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IHNyYy5SIC8gMTIuOTI7CisJCXZhciBnID0gKHNyYy5HID4gMC4wNDA0NSkgPyBNYXRoLnBvdygoKHNyYy5HICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogc3JjLkcgLyAxMi45MjsKKwkJdmFyIGIgPSAoc3JjLkIgPiAwLjA0MDQ1KSA/IE1hdGgucG93KCgoc3JjLkIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiBzcmMuQiAvIDEyLjkyOworCX0gZWxzZSB7CisJCXZhciByID0gTWF0aC5wb3coc3JjLlIsIHByLmdhbW1hKTsKKwkJdmFyIGcgPSBNYXRoLnBvdyhzcmMuRywgcHIuZ2FtbWEpOworCQl2YXIgYiA9IE1hdGgucG93KHNyYy5CLCBwci5nYW1tYSk7CisJfQorCXZhciBYWVogPSBkb2pvLm1hdGgubWF0cml4Lm11bHRpcGx5KFtbciwgZywgYl1dLCBtKTsKKwlyZXR1cm4gW1hZWlswXVswXSwgWFlaWzBdWzFdLCBYWVpbMF1bMl1dOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLlhZWl90b19SR0IgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIlhZWiIsIGFyZ3VtZW50cyk7CisJdmFyIG1pID0gdGhpcy5nZXRYWVpfUkdCX01hdHJpeCgpOworCXZhciBwciA9IHRoaXMuZ2V0UHJpbWFyaWVzKCk7CisJdmFyIHJnYiA9IGRvam8ubWF0aC5tYXRyaXgubXVsdGlwbHkoW1tzcmMuWCwgc3JjLlksIHNyYy5aXV0sIG1pKTsKKwl2YXIgciA9IHJnYlswXVswXTsKKwl2YXIgZyA9IHJnYlswXVsxXTsKKwl2YXIgYiA9IHJnYlswXVsyXTsKKwlpZiAodGhpcy5SR0JXb3JraW5nU3BhY2UgPT0gInNfcmdiIikgeworCQl2YXIgUiA9IChyID4gMC4wMDMxMzA4KSA/ICgxLjA1NSAqIE1hdGgucG93KHIsIDEgLyAyLjQpKSAtIDAuMDU1IDogMTIuOTIgKiByOworCQl2YXIgRyA9IChnID4gMC4wMDMxMzA4KSA/ICgxLjA1NSAqIE1hdGgucG93KGcsIDEgLyAyLjQpKSAtIDAuMDU1IDogMTIuOTIgKiBnOworCQl2YXIgQiA9IChiID4gMC4wMDMxMzA4KSA/ICgxLjA1NSAqIE1hdGgucG93KGIsIDEgLyAyLjQpKSAtIDAuMDU1IDogMTIuOTIgKiBiOworCX0gZWxzZSB7CisJCXZhciBSID0gTWF0aC5wb3cociwgMSAvIHByLmdhbW1hKTsKKwkJdmFyIEcgPSBNYXRoLnBvdyhnLCAxIC8gcHIuZ2FtbWEpOworCQl2YXIgQiA9IE1hdGgucG93KGIsIDEgLyBwci5nYW1tYSk7CisJfQorCXJldHVybiBbUiwgRywgQl07Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuWFlaX3RvX0xhYiA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgc3JjID0gdGhpcy5tdW5nZSgiWFlaIiwgYXJndW1lbnRzKTsKKwl2YXIgd3AgPSB0aGlzLmdldFdoaXRlUG9pbnQoKTsKKwl2YXIgeHIgPSBzcmMuWCAvIHdwLlg7CisJdmFyIHlyID0gc3JjLlkgLyB3cC5ZOworCXZhciB6ciA9IHNyYy5aIC8gd3AuWjsKKwl2YXIgZnggPSAoeHIgPiB0aGlzLmVwc2lsb24oKSkgPyBNYXRoLnBvdyh4ciwgMSAvIDMpIDogKHRoaXMua2FwcGEoKSAqIHhyICsgMTYpIC8gMTE2OworCXZhciBmeSA9ICh5ciA+IHRoaXMuZXBzaWxvbigpKSA/IE1hdGgucG93KHlyLCAxIC8gMykgOiAodGhpcy5rYXBwYSgpICogeXIgKyAxNikgLyAxMTY7CisJdmFyIGZ6ID0gKHpyID4gdGhpcy5lcHNpbG9uKCkpID8gTWF0aC5wb3coenIsIDEgLyAzKSA6ICh0aGlzLmthcHBhKCkgKiB6ciArIDE2KSAvIDExNjsKKwl2YXIgTCA9IDExNiAqIGZ5IC0gMTY7CisJdmFyIGEgPSA1MDAgKiAoZnggLSBmeSk7CisJdmFyIGIgPSAyMDAgKiAoZnkgLSBmeik7CisJcmV0dXJuIFtMLCBhLCBiXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5MYWJfdG9fWFlaID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJMYWIiLCBhcmd1bWVudHMpOworCXZhciB3cCA9IHRoaXMuZ2V0V2hpdGVQb2ludCgpOworCXZhciB5ciA9IChzcmMuTCA+ICh0aGlzLmthcHBhKCkgKiB0aGlzLmVwc2lsb24oKSkpID8gTWF0aC5wb3coKHNyYy5MICsgMTYpIC8gMTE2LCAzKSA6IHNyYy5MIC8gdGhpcy5rYXBwYSgpOworCXZhciBmeSA9ICh5ciA+IHRoaXMuZXBzaWxvbigpKSA/IChzcmMuTCArIDE2KSAvIDExNiA6ICh0aGlzLmthcHBhKCkgKiB5ciArIDE2KSAvIDExNjsKKwl2YXIgZnggPSAoc3JjLmEgLyA1MDApICsgZnk7CisJdmFyIGZ6ID0gZnkgLSAoc3JjLmIgLyAyMDApOworCXZhciBmeGN1YmUgPSBNYXRoLnBvdyhmeCwgMyk7CisJdmFyIGZ6Y3ViZSA9IE1hdGgucG93KGZ6LCAzKTsKKwl2YXIgeHIgPSAoZnhjdWJlID4gdGhpcy5lcHNpbG9uKCkpID8gZnhjdWJlIDogKDExNiAqIGZ4IC0gMTYpIC8gdGhpcy5rYXBwYSgpOworCXZhciB6ciA9IChmemN1YmUgPiB0aGlzLmVwc2lsb24oKSkgPyBmemN1YmUgOiAoMTE2ICogZnogLSAxNikgLyB0aGlzLmthcHBhKCk7CisJdmFyIFggPSB4ciAqIHdwLlg7CisJdmFyIFkgPSB5ciAqIHdwLlk7CisJdmFyIFogPSB6ciAqIHdwLlo7CisJcmV0dXJuIFtYLCBZLCBaXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5MYWJfdG9fTENIYWIgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIkxhYiIsIGFyZ3VtZW50cyk7CisJdmFyIEwgPSBzcmMuTDsKKwl2YXIgQyA9IE1hdGgucG93KHNyYy5hICogc3JjLmEgKyBzcmMuYiAqIHNyYy5iLCAwLjUpOworCXZhciBIID0gTWF0aC5hdGFuMihzcmMuYiwgc3JjLmEpICogKDE4MCAvIE1hdGguUEkpOworCWlmIChIIDwgMCkgeworCQlIICs9IDM2MDsKKwl9CisJaWYgKEggPiAzNjApIHsKKwkJSCAtPSAzNjA7CisJfQorCXJldHVybiBbTCwgQywgSF07Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuTENIYWJfdG9fTGFiID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJMQ0giLCBhcmd1bWVudHMpOworCXZhciBIX3JhZCA9IHNyYy5IICogKE1hdGguUEkgLyAxODApOworCXZhciBMID0gc3JjLkw7CisJdmFyIGEgPSBzcmMuQyAvIE1hdGgucG93KE1hdGgucG93KE1hdGgudGFuKEhfcmFkKSwgMikgKyAxLCAwLjUpOworCWlmICgoOTAgPCBzcmMuSCkgJiYgKHNyYy5IIDwgMjcwKSkgeworCQlhID0gLWE7CisJfQorCXZhciBiID0gTWF0aC5wb3coTWF0aC5wb3coc3JjLkMsIDIpIC0gTWF0aC5wb3coYSwgMiksIDAuNSk7CisJaWYgKHNyYy5IID4gMTgwKSB7CisJCWIgPSAtYjsKKwl9CisJcmV0dXJuIFtMLCBhLCBiXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5jaHJvbWF0aWNBZGFwdGF0aW9uID0gZnVuY3Rpb24gKGNvbCwgc3JjX3csIGRzdF93KSB7CisJY29sID0gdGhpcy5tdW5nZSgiWFlaIiwgW2NvbF0pOworCXZhciBvbGRfd3AgPSB0aGlzLndoaXRlUG9pbnQ7CisJdGhpcy53aGl0ZVBvaW50ID0gc3JjX3c7CisJdmFyIHdwX3NyYyA9IHRoaXMuZ2V0V2hpdGVQb2ludCgpOworCXRoaXMud2hpdGVQb2ludCA9IGRzdF93OworCXZhciB3cF9kc3QgPSB0aGlzLmdldFdoaXRlUG9pbnQoKTsKKwl0aGlzLndoaXRlUG9pbnQgPSBvbGRfd3A7CisJc3dpdGNoICh0aGlzLmNocm9tYXRpY0FkYXB0YXRpb25BbGcpIHsKKwkgIGNhc2UgInh5el9zY2FsaW5nIjoKKwkJdmFyIG1hID0gW1sxLCAwLCAwXSwgWzAsIDEsIDBdLCBbMCwgMCwgMV1dOworCQl2YXIgbWFpID0gW1sxLCAwLCAwXSwgWzAsIDEsIDBdLCBbMCwgMCwgMV1dOworCQlicmVhazsKKwkgIGNhc2UgImJyYWRmb3JkIjoKKwkJdmFyIG1hID0gW1swLjg5NTEsIC0wLjc1MDIsIDAuMDM4OV0sIFswLjI2NjQsIDEuNzEzNSwgLTAuMDY4NV0sIFstMC4xNjE0LCAwLjAzNjcsIDEuMDI5Nl1dOworCQl2YXIgbWFpID0gW1swLjk4Njk5MywgMC40MzIzMDUsIC0wLjAwODUyOV0sIFstMC4xNDcwNTQsIDAuNTE4MzYsIDAuMDQwMDQzXSwgWzAuMTU5OTYzLCAwLjA0OTI5MSwgMC45Njg0ODddXTsKKwkJYnJlYWs7CisJICBjYXNlICJ2b25fa3JpZXMiOgorCQl2YXIgbWEgPSBbWzAuNDAwMjQsIC0wLjIyNjMsIDBdLCBbMC43MDc2LCAxLjE2NTMyLCAwXSwgWy0wLjA4MDgxLCAwLjA0NTcsIDAuOTE4MjJdXTsKKwkJdmFyIG1haSA9IFtbMS44NTk5MzYsIDAuMzYxMTkxLCAwXSwgWy0xLjEyOTM4MiwgMC42Mzg4MTIsIDBdLCBbMC4yMTk4OTcsIC0wLjAwMDAwNiwgMS4wODkwNjRdXTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlkb2pvLmRlYnVnKCJUaGUgIiArIHRoaXMuY2hyb21hdGljQWRhcHRhdGlvbkFsZyArICIgY2hyb21hdGljIGFkYXB0YXRpb24gYWxnb3JpdGhtIG1hdHJpY2llcyBhcmUgbm90IGRlZmluZWQiKTsKKwl9CisJdmFyIGRvbWFpbl9zcmMgPSBkb2pvLm1hdGgubWF0cml4Lm11bHRpcGx5KFtbd3Bfc3JjLngsIHdwX3NyYy55LCB3cF9zcmMuel1dLCBtYSk7CisJdmFyIGRvbWFpbl9kc3QgPSBkb2pvLm1hdGgubWF0cml4Lm11bHRpcGx5KFtbd3BfZHN0LngsIHdwX2RzdC55LCB3cF9kc3Quel1dLCBtYSk7CisJdmFyIGNlbnRyZSA9IFtbZG9tYWluX2RzdFswXVswXSAvIGRvbWFpbl9zcmNbMF1bMF0sIDAsIDBdLCBbMCwgZG9tYWluX2RzdFswXVsxXSAvIGRvbWFpbl9zcmNbMF1bMV0sIDBdLCBbMCwgMCwgZG9tYWluX2RzdFswXVsyXSAvIGRvbWFpbl9zcmNbMF1bMl1dXTsKKwl2YXIgbSA9IGRvam8ubWF0aC5tYXRyaXgubXVsdGlwbHkoZG9qby5tYXRoLm1hdHJpeC5tdWx0aXBseShtYSwgY2VudHJlKSwgbWFpKTsKKwl2YXIgZHN0ID0gZG9qby5tYXRoLm1hdHJpeC5tdWx0aXBseShbW2NvbC5YLCBjb2wuWSwgY29sLlpdXSwgbSk7CisJcmV0dXJuIGRzdFswXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5nZXRSR0JfWFlaX01hdHJpeCA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgd3AgPSB0aGlzLmdldFdoaXRlUG9pbnQoKTsKKwl2YXIgcHIgPSB0aGlzLmdldFByaW1hcmllcygpOworCXZhciBYciA9IHByLnhyIC8gcHIueXI7CisJdmFyIFlyID0gMTsKKwl2YXIgWnIgPSAoMSAtIHByLnhyIC0gcHIueXIpIC8gcHIueXI7CisJdmFyIFhnID0gcHIueGcgLyBwci55ZzsKKwl2YXIgWWcgPSAxOworCXZhciBaZyA9ICgxIC0gcHIueGcgLSBwci55ZykgLyBwci55ZzsKKwl2YXIgWGIgPSBwci54YiAvIHByLnliOworCXZhciBZYiA9IDE7CisJdmFyIFpiID0gKDEgLSBwci54YiAtIHByLnliKSAvIHByLnliOworCXZhciBtMSA9IFtbWHIsIFlyLCBacl0sIFtYZywgWWcsIFpnXSwgW1hiLCBZYiwgWmJdXTsKKwl2YXIgbTIgPSBbW3dwLlgsIHdwLlksIHdwLlpdXTsKKwl2YXIgc20gPSBkb2pvLm1hdGgubWF0cml4Lm11bHRpcGx5KG0yLCBkb2pvLm1hdGgubWF0cml4LmludmVyc2UobTEpKTsKKwl2YXIgU3IgPSBzbVswXVswXTsKKwl2YXIgU2cgPSBzbVswXVsxXTsKKwl2YXIgU2IgPSBzbVswXVsyXTsKKwl2YXIgbTQgPSBbW1NyICogWHIsIFNyICogWXIsIFNyICogWnJdLCBbU2cgKiBYZywgU2cgKiBZZywgU2cgKiBaZ10sIFtTYiAqIFhiLCBTYiAqIFliLCBTYiAqIFpiXV07CisJcmV0dXJuIG00OworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLmdldFhZWl9SR0JfTWF0cml4ID0gZnVuY3Rpb24gKCkgeworCXZhciBtID0gdGhpcy5nZXRSR0JfWFlaX01hdHJpeCgpOworCXJldHVybiBkb2pvLm1hdGgubWF0cml4LmludmVyc2UobSk7Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuWFlaX3RvX0x1diA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgc3JjID0gdGhpcy5tdW5nZSgiWFlaIiwgYXJndW1lbnRzKTsKKwl2YXIgd3AgPSB0aGlzLmdldFdoaXRlUG9pbnQoKTsKKwl2YXIgdWQgPSAoNCAqIHNyYy5YKSAvIChzcmMuWCArIDE1ICogc3JjLlkgKyAzICogc3JjLlopOworCXZhciB2ZCA9ICg5ICogc3JjLlkpIC8gKHNyYy5YICsgMTUgKiBzcmMuWSArIDMgKiBzcmMuWik7CisJdmFyIHVkciA9ICg0ICogd3AuWCkgLyAod3AuWCArIDE1ICogd3AuWSArIDMgKiB3cC5aKTsKKwl2YXIgdmRyID0gKDkgKiB3cC5ZKSAvICh3cC5YICsgMTUgKiB3cC5ZICsgMyAqIHdwLlopOworCXZhciB5ciA9IHNyYy5ZIC8gd3AuWTsKKwl2YXIgTCA9ICh5ciA+IHRoaXMuZXBzaWxvbigpKSA/IDExNiAqIE1hdGgucG93KHlyLCAxIC8gMykgLSAxNiA6IHRoaXMua2FwcGEoKSAqIHlyOworCXZhciB1ID0gMTMgKiBMICogKHVkIC0gdWRyKTsKKwl2YXIgdiA9IDEzICogTCAqICh2ZCAtIHZkcik7CisJcmV0dXJuIFtMLCB1LCB2XTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5MdXZfdG9fWFlaID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJMdXYiLCBhcmd1bWVudHMpOworCXZhciB3cCA9IHRoaXMuZ2V0V2hpdGVQb2ludCgpOworCXZhciB1eiA9ICg0ICogd3AuWCkgLyAod3AuWCArIDE1ICogd3AuWSArIDMgKiB3cC5aKTsKKwl2YXIgdnogPSAoOSAqIHdwLlkpIC8gKHdwLlggKyAxNSAqIHdwLlkgKyAzICogd3AuWik7CisJdmFyIFkgPSAoc3JjLkwgPiB0aGlzLmthcHBhKCkgKiB0aGlzLmVwc2lsb24oKSkgPyBNYXRoLnBvdygoc3JjLkwgKyAxNikgLyAxMTYsIDMpIDogc3JjLkwgLyB0aGlzLmthcHBhKCk7CisJdmFyIGEgPSAoMSAvIDMpICogKCgoNTIgKiBzcmMuTCkgLyAoc3JjLnUgKyAxMyAqIHNyYy5MICogdXopKSAtIDEpOworCXZhciBiID0gLTUgKiBZOworCXZhciBjID0gLSgxIC8gMyk7CisJdmFyIGQgPSBZICogKCgoMzkgKiBzcmMuTCkgLyAoc3JjLnYgKyAxMyAqIHNyYy5MICogdnopKSAtIDUpOworCXZhciBYID0gKGQgLSBiKSAvIChhIC0gYyk7CisJdmFyIFogPSBYICogYSArIGI7CisJcmV0dXJuIFtYLCBZLCBaXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5MdXZfdG9fTENIdXYgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIkx1diIsIGFyZ3VtZW50cyk7CisJdmFyIEwgPSBzcmMuTDsKKwl2YXIgQyA9IE1hdGgucG93KHNyYy51ICogc3JjLnUgKyBzcmMudiAqIHNyYy52LCAwLjUpOworCXZhciBIID0gTWF0aC5hdGFuMihzcmMudiwgc3JjLnUpICogKDE4MCAvIE1hdGguUEkpOworCWlmIChIIDwgMCkgeworCQlIICs9IDM2MDsKKwl9CisJaWYgKEggPiAzNjApIHsKKwkJSCAtPSAzNjA7CisJfQorCXJldHVybiBbTCwgQywgSF07Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuTENIdXZfdG9fTHV2ID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJMQ0giLCBhcmd1bWVudHMpOworCXZhciBIX3JhZCA9IHNyYy5IICogKE1hdGguUEkgLyAxODApOworCXZhciBMID0gc3JjLkw7CisJdmFyIHUgPSBzcmMuQyAvIE1hdGgucG93KE1hdGgucG93KE1hdGgudGFuKEhfcmFkKSwgMikgKyAxLCAwLjUpOworCXZhciB2ID0gTWF0aC5wb3coc3JjLkMgKiBzcmMuQyAtIHUgKiB1LCAwLjUpOworCWlmICgoOTAgPCBzcmMuSCkgJiYgKHNyYy5IIDwgMjcwKSkgeworCQl1ICo9IC0xOworCX0KKwlpZiAoc3JjLkggPiAxODApIHsKKwkJdiAqPSAtMTsKKwl9CisJcmV0dXJuIFtMLCB1LCB2XTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLmNvbG9yVGVtcF90b193aGl0ZVBvaW50ID0gZnVuY3Rpb24gKFQpIHsKKwlpZiAoVCA8IDQwMDApIHsKKwkJZG9qby5kZWJ1ZygiQ2FuJ3QgZmluZCBhIHdoaXRlIHBvaW50IGZvciB0ZW1wZXJhdHVyZXMgdW5kZXIgNDAwMEsiKTsKKwkJcmV0dXJuIFswLCAwXTsKKwl9CisJaWYgKFQgPiAyNTAwMCkgeworCQlkb2pvLmRlYnVnKCJDYW4ndCBmaW5kIGEgd2hpdGUgcG9pbnQgZm9yIHRlbXBlcmF0dXJlcyBvdmVyIDI1MDAwSyIpOworCQlyZXR1cm4gWzAsIDBdOworCX0KKwl2YXIgVDEgPSBUOworCXZhciBUMiA9IFQgKiBUOworCXZhciBUMyA9IFQyICogVDsKKwl2YXIgdGVuOSA9IE1hdGgucG93KDEwLCA5KTsKKwl2YXIgdGVuNiA9IE1hdGgucG93KDEwLCA2KTsKKwl2YXIgdGVuMyA9IE1hdGgucG93KDEwLCAzKTsKKwlpZiAoVCA8PSA3MDAwKSB7CisJCXZhciB4ID0gKC00LjYwNyAqIHRlbjkgLyBUMykgKyAoMi45Njc4ICogdGVuNiAvIFQyKSArICgwLjA5OTExICogdGVuMyAvIFQpICsgMC4yNDQwNjM7CisJfSBlbHNlIHsKKwkJdmFyIHggPSAoLTIuMDA2NCAqIHRlbjkgLyBUMykgKyAoMS45MDE4ICogdGVuNiAvIFQyKSArICgwLjI0NzQ4ICogdGVuMyAvIFQpICsgMC4yMzcwNDsKKwl9CisJdmFyIHkgPSAtMyAqIHggKiB4ICsgMi44NyAqIHggLSAwLjI3NTsKKwlyZXR1cm4gW3gsIHldOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLlJHQl90b19DTVkgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIlJHQiIsIGFyZ3VtZW50cyk7CisJdmFyIEMgPSAxIC0gc3JjLlI7CisJdmFyIE0gPSAxIC0gc3JjLkc7CisJdmFyIFkgPSAxIC0gc3JjLkI7CisJcmV0dXJuIFtDLCBNLCBZXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5DTVlfdG9fUkdCID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJDTVkiLCBhcmd1bWVudHMpOworCXZhciBSID0gMSAtIHNyYy5DOworCXZhciBHID0gMSAtIHNyYy5NOworCXZhciBCID0gMSAtIHNyYy5ZOworCXJldHVybiBbUiwgRywgQl07Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuUkdCX3RvX0NNWUsgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIlJHQiIsIGFyZ3VtZW50cyk7CisJdmFyIEsgPSBNYXRoLm1pbigxIC0gc3JjLlIsIDEgLSBzcmMuRywgMSAtIHNyYy5CKTsKKwl2YXIgQyA9ICgxIC0gc3JjLlIgLSBLKSAvICgxIC0gSyk7CisJdmFyIE0gPSAoMSAtIHNyYy5HIC0gSykgLyAoMSAtIEspOworCXZhciBZID0gKDEgLSBzcmMuQiAtIEspIC8gKDEgLSBLKTsKKwlyZXR1cm4gW0MsIE0sIFksIEtdOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLkNNWUtfdG9fUkdCID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJDTVlLIiwgYXJndW1lbnRzKTsKKwl2YXIgUiA9IDEgLSBNYXRoLm1pbigxLCBzcmMuQyAqICgxIC0gc3JjLkspICsgc3JjLkspOworCXZhciBHID0gMSAtIE1hdGgubWluKDEsIHNyYy5NICogKDEgLSBzcmMuSykgKyBzcmMuSyk7CisJdmFyIEIgPSAxIC0gTWF0aC5taW4oMSwgc3JjLlkgKiAoMSAtIHNyYy5LKSArIHNyYy5LKTsKKwlyZXR1cm4gW1IsIEcsIEJdOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLkNNWV90b19DTVlLID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJDTVkiLCBhcmd1bWVudHMpOworCXZhciBLID0gTWF0aC5taW4oc3JjLkMsIHNyYy5NLCBzcmMuWSk7CisJdmFyIEMgPSAoc3JjLkMgLSBLKSAvICgxIC0gSyk7CisJdmFyIE0gPSAoc3JjLk0gLSBLKSAvICgxIC0gSyk7CisJdmFyIFkgPSAoc3JjLlkgLSBLKSAvICgxIC0gSyk7CisJcmV0dXJuIFtDLCBNLCBZLCBLXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5DTVlLX3RvX0NNWSA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgc3JjID0gdGhpcy5tdW5nZSgiQ01ZSyIsIGFyZ3VtZW50cyk7CisJdmFyIEMgPSBNYXRoLm1pbigxLCBzcmMuQyAqICgxIC0gc3JjLkspICsgc3JjLkspOworCXZhciBNID0gTWF0aC5taW4oMSwgc3JjLk0gKiAoMSAtIHNyYy5LKSArIHNyYy5LKTsKKwl2YXIgWSA9IE1hdGgubWluKDEsIHNyYy5ZICogKDEgLSBzcmMuSykgKyBzcmMuSyk7CisJcmV0dXJuIFtDLCBNLCBZXTsKK307Citkb2pvLmdmeC5Db2xvcnNwYWNlLnByb3RvdHlwZS5SR0JfdG9fSFNWID0gZnVuY3Rpb24gKCkgeworCXZhciBzcmMgPSB0aGlzLm11bmdlKCJSR0IiLCBhcmd1bWVudHMpOworCXZhciBtaW4gPSBNYXRoLm1pbihzcmMuUiwgc3JjLkcsIHNyYy5CKTsKKwl2YXIgViA9IE1hdGgubWF4KHNyYy5SLCBzcmMuRywgc3JjLkIpOworCXZhciBkZWx0YSA9IFYgLSBtaW47CisJdmFyIEggPSBudWxsOworCXZhciBTID0gKFYgPT0gMCkgPyAwIDogZGVsdGEgLyBWOworCWlmIChTID09IDApIHsKKwkJSCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHNyYy5SID09IFYpIHsKKwkJCUggPSA2MCAqIChzcmMuRyAtIHNyYy5CKSAvIGRlbHRhOworCQl9IGVsc2UgeworCQkJaWYgKHNyYy5HID09IFYpIHsKKwkJCQlIID0gMTIwICsgNjAgKiAoc3JjLkIgLSBzcmMuUikgLyBkZWx0YTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNyYy5CID09IFYpIHsKKwkJCQkJSCA9IDI0MCArIDYwICogKHNyYy5SIC0gc3JjLkcpIC8gZGVsdGE7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChIIDwgMCkgeworCQkJSCArPSAzNjA7CisJCX0KKwl9CisJSCA9IChIID09IDApID8gMzYwIDogSDsKKwlyZXR1cm4gW0gsIFMsIFZdOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLkhTVl90b19SR0IgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIkhTViIsIGFyZ3VtZW50cyk7CisJaWYgKHNyYy5IID09IDM2MCkgeworCQlzcmMuSCA9IDA7CisJfQorCXZhciByID0gbnVsbDsKKwl2YXIgZyA9IG51bGw7CisJdmFyIGIgPSBudWxsOworCWlmIChzcmMuUyA9PSAwKSB7CisJCXZhciBSID0gc3JjLlY7CisJCXZhciBHID0gc3JjLlY7CisJCXZhciBCID0gc3JjLlY7CisJfSBlbHNlIHsKKwkJdmFyIGhUZW1wID0gc3JjLkggLyA2MDsKKwkJdmFyIGkgPSBNYXRoLmZsb29yKGhUZW1wKTsKKwkJdmFyIGYgPSBoVGVtcCAtIGk7CisJCXZhciBwID0gc3JjLlYgKiAoMSAtIHNyYy5TKTsKKwkJdmFyIHEgPSBzcmMuViAqICgxIC0gKHNyYy5TICogZikpOworCQl2YXIgdCA9IHNyYy5WICogKDEgLSAoc3JjLlMgKiAoMSAtIGYpKSk7CisJCXN3aXRjaCAoaSkgeworCQkgIGNhc2UgMDoKKwkJCVIgPSBzcmMuVjsKKwkJCUcgPSB0OworCQkJQiA9IHA7CisJCQlicmVhazsKKwkJICBjYXNlIDE6CisJCQlSID0gcTsKKwkJCUcgPSBzcmMuVjsKKwkJCUIgPSBwOworCQkJYnJlYWs7CisJCSAgY2FzZSAyOgorCQkJUiA9IHA7CisJCQlHID0gc3JjLlY7CisJCQlCID0gdDsKKwkJCWJyZWFrOworCQkgIGNhc2UgMzoKKwkJCVIgPSBwOworCQkJRyA9IHE7CisJCQlCID0gc3JjLlY7CisJCQlicmVhazsKKwkJICBjYXNlIDQ6CisJCQlSID0gdDsKKwkJCUcgPSBwOworCQkJQiA9IHNyYy5WOworCQkJYnJlYWs7CisJCSAgY2FzZSA1OgorCQkJUiA9IHNyYy5WOworCQkJRyA9IHA7CisJCQlCID0gcTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBbUiwgRywgQl07Cit9OworZG9qby5nZnguQ29sb3JzcGFjZS5wcm90b3R5cGUuUkdCX3RvX0hTTCA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgc3JjID0gdGhpcy5tdW5nZSgiUkdCIiwgYXJndW1lbnRzKTsKKwl2YXIgbWluID0gTWF0aC5taW4oc3JjLlIsIHNyYy5HLCBzcmMuQik7CisJdmFyIG1heCA9IE1hdGgubWF4KHNyYy5SLCBzcmMuRywgc3JjLkIpOworCXZhciBkZWx0YSA9IG1heCAtIG1pbjsKKwl2YXIgSCA9IDA7CisJdmFyIFMgPSAwOworCXZhciBMID0gKG1pbiArIG1heCkgLyAyOworCWlmICgoTCA+IDApICYmIChMIDwgMSkpIHsKKwkJUyA9IGRlbHRhIC8gKChMIDwgMC41KSA/ICgyICogTCkgOiAoMiAtIDIgKiBMKSk7CisJfQorCWlmIChkZWx0YSA+IDApIHsKKwkJaWYgKChtYXggPT0gc3JjLlIpICYmIChtYXggIT0gc3JjLkcpKSB7CisJCQlIICs9IChzcmMuRyAtIHNyYy5CKSAvIGRlbHRhOworCQl9CisJCWlmICgobWF4ID09IHNyYy5HKSAmJiAobWF4ICE9IHNyYy5CKSkgeworCQkJSCArPSAoMiArIChzcmMuQiAtIHNyYy5SKSAvIGRlbHRhKTsKKwkJfQorCQlpZiAoKG1heCA9PSBzcmMuQikgJiYgKG1heCAhPSBzcmMuUikpIHsKKwkJCUggKz0gKDQgKyAoc3JjLlIgLSBzcmMuRykgLyBkZWx0YSk7CisJCX0KKwkJSCAqPSA2MDsKKwl9CisJSCA9IChIID09IDApID8gMzYwIDogSDsKKwlyZXR1cm4gW0gsIFMsIExdOworfTsKK2Rvam8uZ2Z4LkNvbG9yc3BhY2UucHJvdG90eXBlLkhTTF90b19SR0IgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHNyYyA9IHRoaXMubXVuZ2UoIkhTTCIsIGFyZ3VtZW50cyk7CisJd2hpbGUgKHNyYy5IIDwgMCkgeworCQlzcmMuSCArPSAzNjA7CisJfQorCXdoaWxlIChzcmMuSCA+PSAzNjApIHsKKwkJc3JjLkggLT0gMzYwOworCX0KKwl2YXIgUiA9IDA7CisJdmFyIEcgPSAwOworCXZhciBCID0gMDsKKwlpZiAoc3JjLkggPCAxMjApIHsKKwkJUiA9ICgxMjAgLSBzcmMuSCkgLyA2MDsKKwkJRyA9IHNyYy5IIC8gNjA7CisJCUIgPSAwOworCX0gZWxzZSB7CisJCWlmIChzcmMuSCA8IDI0MCkgeworCQkJUiA9IDA7CisJCQlHID0gKDI0MCAtIHNyYy5IKSAvIDYwOworCQkJQiA9IChzcmMuSCAtIDEyMCkgLyA2MDsKKwkJfSBlbHNlIHsKKwkJCVIgPSAoc3JjLkggLSAyNDApIC8gNjA7CisJCQlHID0gMDsKKwkJCUIgPSAoMzYwIC0gc3JjLkgpIC8gNjA7CisJCX0KKwl9CisJUiA9IDIgKiBzcmMuUyAqIE1hdGgubWluKFIsIDEpICsgKDEgLSBzcmMuUyk7CisJRyA9IDIgKiBzcmMuUyAqIE1hdGgubWluKEcsIDEpICsgKDEgLSBzcmMuUyk7CisJQiA9IDIgKiBzcmMuUyAqIE1hdGgubWluKEIsIDEpICsgKDEgLSBzcmMuUyk7CisJaWYgKHNyYy5MIDwgMC41KSB7CisJCVIgPSBzcmMuTCAqIFI7CisJCUcgPSBzcmMuTCAqIEc7CisJCUIgPSBzcmMuTCAqIEI7CisJfSBlbHNlIHsKKwkJUiA9ICgxIC0gc3JjLkwpICogUiArIDIgKiBzcmMuTCAtIDE7CisJCUcgPSAoMSAtIHNyYy5MKSAqIEcgKyAyICogc3JjLkwgLSAxOworCQlCID0gKDEgLSBzcmMuTCkgKiBCICsgMiAqIHNyYy5MIC0gMTsKKwl9CisJcmV0dXJuIFtSLCBHLCBCXTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTNmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmdmeC5jb2xvciIsICJkb2pvLmdmeC5tYXRyaXgiLCAiZG9qby5nZnguY29tbW9uIl19KTsKK2Rvam8ucmVxdWlyZUlmKGRvam8ucmVuZGVyLnN2Zy5jYXBhYmxlLCAiZG9qby5nZnguc3ZnIik7Citkb2pvLnJlcXVpcmVJZihkb2pvLnJlbmRlci52bWwuY2FwYWJsZSwgImRvam8uZ2Z4LnZtbCIpOworZG9qby5wcm92aWRlKCJkb2pvLmdmeC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvY29sb3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L2NvbG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YmQ3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L2NvbG9yLmpzCkBAIC0wLDAgKzEsMTUwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdmeC5jb2xvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hcnJheSIpOworZG9qby5nZnguY29sb3IuQ29sb3IgPSBmdW5jdGlvbiAociwgZywgYiwgYSkgeworCWlmIChkb2pvLmxhbmcuaXNBcnJheShyKSkgeworCQl0aGlzLnIgPSByWzBdOworCQl0aGlzLmcgPSByWzFdOworCQl0aGlzLmIgPSByWzJdOworCQl0aGlzLmEgPSByWzNdIHx8IDE7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhyKSkgeworCQkJdmFyIHJnYiA9IGRvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0Iocik7CisJCQl0aGlzLnIgPSByZ2JbMF07CisJCQl0aGlzLmcgPSByZ2JbMV07CisJCQl0aGlzLmIgPSByZ2JbMl07CisJCQl0aGlzLmEgPSBnIHx8IDE7CisJCX0gZWxzZSB7CisJCQlpZiAociBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKSB7CisJCQkJdGhpcy5yID0gci5yOworCQkJCXRoaXMuYiA9IHIuYjsKKwkJCQl0aGlzLmcgPSByLmc7CisJCQkJdGhpcy5hID0gci5hOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnIgPSByOworCQkJCXRoaXMuZyA9IGc7CisJCQkJdGhpcy5iID0gYjsKKwkJCQl0aGlzLmEgPSBhOworCQkJfQorCQl9CisJfQorfTsKK2Rvam8uZ2Z4LmNvbG9yLkNvbG9yLmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnIpIHsKKwlyZXR1cm4gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSk7Cit9OworZG9qby5leHRlbmQoZG9qby5nZnguY29sb3IuQ29sb3IsIHt0b1JnYjpmdW5jdGlvbiAoaW5jbHVkZUFscGhhKSB7CisJaWYgKGluY2x1ZGVBbHBoYSkgeworCQlyZXR1cm4gdGhpcy50b1JnYmEoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gW3RoaXMuciwgdGhpcy5nLCB0aGlzLmJdOworCX0KK30sIHRvUmdiYTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIFt0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmFdOworfSwgdG9IZXg6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4KHRoaXMudG9SZ2IoKSk7Cit9LCB0b0NzczpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICJyZ2IoIiArIHRoaXMudG9SZ2IoKS5qb2luKCkgKyAiKSI7Cit9LCB0b1N0cmluZzpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMudG9IZXgoKTsKK30sIGJsZW5kOmZ1bmN0aW9uIChjb2xvciwgd2VpZ2h0KSB7CisJdmFyIHJnYiA9IG51bGw7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KGNvbG9yKSkgeworCQlyZ2IgPSBjb2xvcjsKKwl9IGVsc2UgeworCQlpZiAoY29sb3IgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcikgeworCQkJcmdiID0gY29sb3IudG9SZ2IoKTsKKwkJfSBlbHNlIHsKKwkJCXJnYiA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihjb2xvcikudG9SZ2IoKTsKKwkJfQorCX0KKwlyZXR1cm4gZG9qby5nZnguY29sb3IuYmxlbmQodGhpcy50b1JnYigpLCByZ2IsIHdlaWdodCk7Cit9fSk7Citkb2pvLmdmeC5jb2xvci5uYW1lZCA9IHt3aGl0ZTpbMjU1LCAyNTUsIDI1NV0sIGJsYWNrOlswLCAwLCAwXSwgcmVkOlsyNTUsIDAsIDBdLCBncmVlbjpbMCwgMjU1LCAwXSwgbGltZTpbMCwgMjU1LCAwXSwgYmx1ZTpbMCwgMCwgMjU1XSwgbmF2eTpbMCwgMCwgMTI4XSwgZ3JheTpbMTI4LCAxMjgsIDEyOF0sIHNpbHZlcjpbMTkyLCAxOTIsIDE5Ml19OworZG9qby5nZnguY29sb3IuYmxlbmQgPSBmdW5jdGlvbiAoYSwgYiwgd2VpZ2h0KSB7CisJaWYgKHR5cGVvZiBhID09ICJzdHJpbmciKSB7CisJCXJldHVybiBkb2pvLmdmeC5jb2xvci5ibGVuZEhleChhLCBiLCB3ZWlnaHQpOworCX0KKwlpZiAoIXdlaWdodCkgeworCQl3ZWlnaHQgPSAwOworCX0KKwl3ZWlnaHQgPSBNYXRoLm1pbihNYXRoLm1heCgtMSwgd2VpZ2h0KSwgMSk7CisJd2VpZ2h0ID0gKCh3ZWlnaHQgKyAxKSAvIDIpOworCXZhciBjID0gW107CisJZm9yICh2YXIgeCA9IDA7IHggPCAzOyB4KyspIHsKKwkJY1t4XSA9IHBhcnNlSW50KGJbeF0gKyAoKGFbeF0gLSBiW3hdKSAqIHdlaWdodCkpOworCX0KKwlyZXR1cm4gYzsKK307Citkb2pvLmdmeC5jb2xvci5ibGVuZEhleCA9IGZ1bmN0aW9uIChhLCBiLCB3ZWlnaHQpIHsKKwlyZXR1cm4gZG9qby5nZnguY29sb3IucmdiMmhleChkb2pvLmdmeC5jb2xvci5ibGVuZChkb2pvLmdmeC5jb2xvci5oZXgycmdiKGEpLCBkb2pvLmdmeC5jb2xvci5oZXgycmdiKGIpLCB3ZWlnaHQpKTsKK307Citkb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCID0gZnVuY3Rpb24gKGNvbG9yKSB7CisJdmFyIGhleCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwljb2xvciA9IGNvbG9yLnRvTG93ZXJDYXNlKCk7CisJaWYgKGNvbG9yLmluZGV4T2YoInJnYiIpID09IDApIHsKKwkJdmFyIG1hdGNoZXMgPSBjb2xvci5tYXRjaCgvcmdiYSpcKChcZCspLCAqKFxkKyksICooXGQrKS9pKTsKKwkJdmFyIHJldCA9IG1hdGNoZXMuc3BsaWNlKDEsIDMpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXZhciBjb2xvcnMgPSBkb2pvLmdmeC5jb2xvci5oZXgycmdiKGNvbG9yKTsKKwkJaWYgKGNvbG9ycykgeworCQkJcmV0dXJuIGNvbG9yczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkb2pvLmdmeC5jb2xvci5uYW1lZFtjb2xvcl0gfHwgWzI1NSwgMjU1LCAyNTVdOworCQl9CisJfQorfTsKK2Rvam8uZ2Z4LmNvbG9yLmhleDJyZ2IgPSBmdW5jdGlvbiAoaGV4KSB7CisJdmFyIGhleE51bSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKwl2YXIgcmdiID0gbmV3IEFycmF5KDMpOworCWlmIChoZXguaW5kZXhPZigiIyIpID09IDApIHsKKwkJaGV4ID0gaGV4LnN1YnN0cmluZygxKTsKKwl9CisJaGV4ID0gaGV4LnRvVXBwZXJDYXNlKCk7CisJaWYgKGhleC5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiICsgaGV4TnVtICsgIl0iLCAiZyIpLCAiIikgIT0gIiIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChoZXgubGVuZ3RoID09IDMpIHsKKwkJcmdiWzBdID0gaGV4LmNoYXJBdCgwKSArIGhleC5jaGFyQXQoMCk7CisJCXJnYlsxXSA9IGhleC5jaGFyQXQoMSkgKyBoZXguY2hhckF0KDEpOworCQlyZ2JbMl0gPSBoZXguY2hhckF0KDIpICsgaGV4LmNoYXJBdCgyKTsKKwl9IGVsc2UgeworCQlyZ2JbMF0gPSBoZXguc3Vic3RyaW5nKDAsIDIpOworCQlyZ2JbMV0gPSBoZXguc3Vic3RyaW5nKDIsIDQpOworCQlyZ2JbMl0gPSBoZXguc3Vic3RyaW5nKDQpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykgeworCQlyZ2JbaV0gPSBoZXhOdW0uaW5kZXhPZihyZ2JbaV0uY2hhckF0KDApKSAqIDE2ICsgaGV4TnVtLmluZGV4T2YocmdiW2ldLmNoYXJBdCgxKSk7CisJfQorCXJldHVybiByZ2I7Cit9OworZG9qby5nZnguY29sb3IucmdiMmhleCA9IGZ1bmN0aW9uIChyLCBnLCBiKSB7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KHIpKSB7CisJCWcgPSByWzFdIHx8IDA7CisJCWIgPSByWzJdIHx8IDA7CisJCXIgPSByWzBdIHx8IDA7CisJfQorCXZhciByZXQgPSBkb2pvLmxhbmcubWFwKFtyLCBnLCBiXSwgZnVuY3Rpb24gKHgpIHsKKwkJeCA9IG5ldyBOdW1iZXIoeCk7CisJCXZhciBzID0geC50b1N0cmluZygxNik7CisJCXdoaWxlIChzLmxlbmd0aCA8IDIpIHsKKwkJCXMgPSAiMCIgKyBzOworCQl9CisJCXJldHVybiBzOworCX0pOworCXJldC51bnNoaWZ0KCIjIik7CisJcmV0dXJuIHJldC5qb2luKCIiKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvY29sb3IvaHNsLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9jb2xvci9oc2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwMzc0NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvY29sb3IvaHNsLmpzCkBAIC0wLDAgKzEsMTE4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdmeC5jb2xvci5oc2wiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZ2Z4LmNvbG9yLkNvbG9yLCB7dG9Ic2w6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaHNsKHRoaXMudG9SZ2IoKSk7Cit9fSk7Citkb2pvLmdmeC5jb2xvci5yZ2IyaHNsID0gZnVuY3Rpb24gKHIsIGcsIGIpIHsKKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkocikpIHsKKwkJYiA9IHJbMl0gfHwgMDsKKwkJZyA9IHJbMV0gfHwgMDsKKwkJciA9IHJbMF0gfHwgMDsKKwl9CisJciAvPSAyNTU7CisJZyAvPSAyNTU7CisJYiAvPSAyNTU7CisJdmFyIGggPSBudWxsOworCXZhciBzID0gbnVsbDsKKwl2YXIgbCA9IG51bGw7CisJdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpOworCXZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTsKKwl2YXIgZGVsdGEgPSBtYXggLSBtaW47CisJbCA9IChtaW4gKyBtYXgpIC8gMjsKKwlzID0gMDsKKwlpZiAoKGwgPiAwKSAmJiAobCA8IDEpKSB7CisJCXMgPSBkZWx0YSAvICgobCA8IDAuNSkgPyAoMiAqIGwpIDogKDIgLSAyICogbCkpOworCX0KKwloID0gMDsKKwlpZiAoZGVsdGEgPiAwKSB7CisJCWlmICgobWF4ID09IHIpICYmIChtYXggIT0gZykpIHsKKwkJCWggKz0gKGcgLSBiKSAvIGRlbHRhOworCQl9CisJCWlmICgobWF4ID09IGcpICYmIChtYXggIT0gYikpIHsKKwkJCWggKz0gKDIgKyAoYiAtIHIpIC8gZGVsdGEpOworCQl9CisJCWlmICgobWF4ID09IGIpICYmIChtYXggIT0gcikpIHsKKwkJCWggKz0gKDQgKyAociAtIGcpIC8gZGVsdGEpOworCQl9CisJCWggKj0gNjA7CisJfQorCWggPSAoaCA9PSAwKSA/IDM2MCA6IE1hdGguY2VpbCgoaCAvIDM2MCkgKiAyNTUpOworCXMgPSBNYXRoLmNlaWwocyAqIDI1NSk7CisJbCA9IE1hdGguY2VpbChsICogMjU1KTsKKwlyZXR1cm4gW2gsIHMsIGxdOworfTsKK2Rvam8uZ2Z4LmNvbG9yLmhzbDJyZ2IgPSBmdW5jdGlvbiAoaCwgcywgbCkgeworCWlmIChkb2pvLmxhbmcuaXNBcnJheShoKSkgeworCQlsID0gaFsyXSB8fCAwOworCQlzID0gaFsxXSB8fCAwOworCQloID0gaFswXSB8fCAwOworCX0KKwloID0gKGggLyAyNTUpICogMzYwOworCWlmIChoID09IDM2MCkgeworCQloID0gMDsKKwl9CisJcyA9IHMgLyAyNTU7CisJbCA9IGwgLyAyNTU7CisJd2hpbGUgKGggPCAwKSB7CisJCWggKz0gMzYwOworCX0KKwl3aGlsZSAoaCA+IDM2MCkgeworCQloIC09IDM2MDsKKwl9CisJdmFyIHIsIGcsIGI7CisJaWYgKGggPCAxMjApIHsKKwkJciA9ICgxMjAgLSBoKSAvIDYwOworCQlnID0gaCAvIDYwOworCQliID0gMDsKKwl9IGVsc2UgeworCQlpZiAoaCA8IDI0MCkgeworCQkJciA9IDA7CisJCQlnID0gKDI0MCAtIGgpIC8gNjA7CisJCQliID0gKGggLSAxMjApIC8gNjA7CisJCX0gZWxzZSB7CisJCQlyID0gKGggLSAyNDApIC8gNjA7CisJCQlnID0gMDsKKwkJCWIgPSAoMzYwIC0gaCkgLyA2MDsKKwkJfQorCX0KKwlyID0gTWF0aC5taW4ociwgMSk7CisJZyA9IE1hdGgubWluKGcsIDEpOworCWIgPSBNYXRoLm1pbihiLCAxKTsKKwlyID0gMiAqIHMgKiByICsgKDEgLSBzKTsKKwlnID0gMiAqIHMgKiBnICsgKDEgLSBzKTsKKwliID0gMiAqIHMgKiBiICsgKDEgLSBzKTsKKwlpZiAobCA8IDAuNSkgeworCQlyID0gbCAqIHI7CisJCWcgPSBsICogZzsKKwkJYiA9IGwgKiBiOworCX0gZWxzZSB7CisJCXIgPSAoMSAtIGwpICogciArIDIgKiBsIC0gMTsKKwkJZyA9ICgxIC0gbCkgKiBnICsgMiAqIGwgLSAxOworCQliID0gKDEgLSBsKSAqIGIgKyAyICogbCAtIDE7CisJfQorCXIgPSBNYXRoLmNlaWwociAqIDI1NSk7CisJZyA9IE1hdGguY2VpbChnICogMjU1KTsKKwliID0gTWF0aC5jZWlsKGIgKiAyNTUpOworCXJldHVybiBbciwgZywgYl07Cit9OworZG9qby5nZnguY29sb3IuaHNsMmhleCA9IGZ1bmN0aW9uIChoLCBzLCBsKSB7CisJdmFyIHJnYiA9IGRvam8uZ2Z4LmNvbG9yLmhzbDJyZ2IoaCwgcywgbCk7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoZXgocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSk7Cit9OworZG9qby5nZnguY29sb3IuaGV4MmhzbCA9IGZ1bmN0aW9uIChoZXgpIHsKKwl2YXIgcmdiID0gZG9qby5nZnguY29sb3IuaGV4MnJnYihoZXgpOworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaHNsKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9jb2xvci9oc3YuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L2NvbG9yL2hzdi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg0ZjczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9jb2xvci9oc3YuanMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZ2Z4LmNvbG9yLmhzdiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoIik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZ2Z4LmNvbG9yLkNvbG9yLCB7dG9Ic3Y6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaHN2KHRoaXMudG9SZ2IoKSk7Cit9fSk7Citkb2pvLmdmeC5jb2xvci5yZ2IyaHN2ID0gZnVuY3Rpb24gKHIsIGcsIGIsIG9wdGlvbnMpIHsKKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkocikpIHsKKwkJaWYgKGcpIHsKKwkJCW9wdGlvbnMgPSBnOworCQl9CisJCWIgPSByWzJdIHx8IDA7CisJCWcgPSByWzFdIHx8IDA7CisJCXIgPSByWzBdIHx8IDA7CisJfQorCXZhciBvcHQgPSB7aW5wdXRSYW5nZToob3B0aW9ucyAmJiBvcHRpb25zLmlucHV0UmFuZ2UpID8gb3B0aW9ucy5pbnB1dFJhbmdlIDogMjU1LCBvdXRwdXRSYW5nZToob3B0aW9ucyAmJiBvcHRpb25zLm91dHB1dFJhbmdlKSA/IG9wdGlvbnMub3V0cHV0UmFuZ2UgOiBbMjU1LCAyNTUsIDI1NV19OworCXZhciBoID0gbnVsbDsKKwl2YXIgcyA9IG51bGw7CisJdmFyIHYgPSBudWxsOworCXN3aXRjaCAob3B0LmlucHV0UmFuZ2UpIHsKKwkgIGNhc2UgMToKKwkJciA9IChyICogMjU1KTsKKwkJZyA9IChnICogMjU1KTsKKwkJYiA9IChiICogMjU1KTsKKwkJYnJlYWs7CisJICBjYXNlIDEwMDoKKwkJciA9IChyIC8gMTAwKSAqIDI1NTsKKwkJZyA9IChnIC8gMTAwKSAqIDI1NTsKKwkJYiA9IChiIC8gMTAwKSAqIDI1NTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlicmVhazsKKwl9CisJdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpOworCXYgPSBNYXRoLm1heChyLCBnLCBiKTsKKwl2YXIgZGVsdGEgPSB2IC0gbWluOworCXMgPSAodiA9PSAwKSA/IDAgOiBkZWx0YSAvIHY7CisJaWYgKHMgPT0gMCkgeworCQloID0gMDsKKwl9IGVsc2UgeworCQlpZiAociA9PSB2KSB7CisJCQloID0gNjAgKiAoZyAtIGIpIC8gZGVsdGE7CisJCX0gZWxzZSB7CisJCQlpZiAoZyA9PSB2KSB7CisJCQkJaCA9IDEyMCArIDYwICogKGIgLSByKSAvIGRlbHRhOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYiA9PSB2KSB7CisJCQkJCWggPSAyNDAgKyA2MCAqIChyIC0gZykgLyBkZWx0YTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGggPD0gMCkgeworCQkJaCArPSAzNjA7CisJCX0KKwl9CisJc3dpdGNoIChvcHQub3V0cHV0UmFuZ2VbMF0pIHsKKwkgIGNhc2UgMzYwOgorCQlicmVhazsKKwkgIGNhc2UgMTAwOgorCQloID0gKGggLyAzNjApICogMTAwOworCQlicmVhazsKKwkgIGNhc2UgMToKKwkJaCA9IChoIC8gMzYwKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQloID0gKGggLyAzNjApICogMjU1OworCQlicmVhazsKKwl9CisJc3dpdGNoIChvcHQub3V0cHV0UmFuZ2VbMV0pIHsKKwkgIGNhc2UgMTAwOgorCQlzID0gcyAqIDEwMDsKKwkgIGNhc2UgMToKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlzID0gcyAqIDI1NTsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAob3B0Lm91dHB1dFJhbmdlWzJdKSB7CisJICBjYXNlIDEwMDoKKwkJdiA9ICh2IC8gMjU1KSAqIDEwMDsKKwkJYnJlYWs7CisJICBjYXNlIDE6CisJCXYgPSAodiAvIDI1NSk7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWggPSBkb2pvLm1hdGgucm91bmQoaCk7CisJcyA9IGRvam8ubWF0aC5yb3VuZChzKTsKKwl2ID0gZG9qby5tYXRoLnJvdW5kKHYpOworCXJldHVybiBbaCwgcywgdl07Cit9OworZG9qby5nZnguY29sb3IuaHN2MnJnYiA9IGZ1bmN0aW9uIChoLCBzLCB2LCBvcHRpb25zKSB7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KGgpKSB7CisJCWlmIChzKSB7CisJCQlvcHRpb25zID0gczsKKwkJfQorCQl2ID0gaFsyXSB8fCAwOworCQlzID0gaFsxXSB8fCAwOworCQloID0gaFswXSB8fCAwOworCX0KKwl2YXIgb3B0ID0ge2lucHV0UmFuZ2U6KG9wdGlvbnMgJiYgb3B0aW9ucy5pbnB1dFJhbmdlKSA/IG9wdGlvbnMuaW5wdXRSYW5nZSA6IFsyNTUsIDI1NSwgMjU1XSwgb3V0cHV0UmFuZ2U6KG9wdGlvbnMgJiYgb3B0aW9ucy5vdXRwdXRSYW5nZSkgPyBvcHRpb25zLm91dHB1dFJhbmdlIDogMjU1fTsKKwlzd2l0Y2ggKG9wdC5pbnB1dFJhbmdlWzBdKSB7CisJICBjYXNlIDE6CisJCWggPSBoICogMzYwOworCQlicmVhazsKKwkgIGNhc2UgMTAwOgorCQloID0gKGggLyAxMDApICogMzYwOworCQlicmVhazsKKwkgIGNhc2UgMzYwOgorCQloID0gaDsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQloID0gKGggLyAyNTUpICogMzYwOworCX0KKwlpZiAoaCA9PSAzNjApIHsKKwkJaCA9IDA7CisJfQorCXN3aXRjaCAob3B0LmlucHV0UmFuZ2VbMV0pIHsKKwkgIGNhc2UgMTAwOgorCQlzIC89IDEwMDsKKwkJYnJlYWs7CisJICBjYXNlIDI1NToKKwkJcyAvPSAyNTU7CisJfQorCXN3aXRjaCAob3B0LmlucHV0UmFuZ2VbMl0pIHsKKwkgIGNhc2UgMTAwOgorCQl2IC89IDEwMDsKKwkJYnJlYWs7CisJICBjYXNlIDI1NToKKwkJdiAvPSAyNTU7CisJfQorCXZhciByID0gbnVsbDsKKwl2YXIgZyA9IG51bGw7CisJdmFyIGIgPSBudWxsOworCWlmIChzID09IDApIHsKKwkJciA9IHY7CisJCWcgPSB2OworCQliID0gdjsKKwl9IGVsc2UgeworCQl2YXIgaFRlbXAgPSBoIC8gNjA7CisJCXZhciBpID0gTWF0aC5mbG9vcihoVGVtcCk7CisJCXZhciBmID0gaFRlbXAgLSBpOworCQl2YXIgcCA9IHYgKiAoMSAtIHMpOworCQl2YXIgcSA9IHYgKiAoMSAtIChzICogZikpOworCQl2YXIgdCA9IHYgKiAoMSAtIChzICogKDEgLSBmKSkpOworCQlzd2l0Y2ggKGkpIHsKKwkJICBjYXNlIDA6CisJCQlyID0gdjsKKwkJCWcgPSB0OworCQkJYiA9IHA7CisJCQlicmVhazsKKwkJICBjYXNlIDE6CisJCQlyID0gcTsKKwkJCWcgPSB2OworCQkJYiA9IHA7CisJCQlicmVhazsKKwkJICBjYXNlIDI6CisJCQlyID0gcDsKKwkJCWcgPSB2OworCQkJYiA9IHQ7CisJCQlicmVhazsKKwkJICBjYXNlIDM6CisJCQlyID0gcDsKKwkJCWcgPSBxOworCQkJYiA9IHY7CisJCQlicmVhazsKKwkJICBjYXNlIDQ6CisJCQlyID0gdDsKKwkJCWcgPSBwOworCQkJYiA9IHY7CisJCQlicmVhazsKKwkJICBjYXNlIDU6CisJCQlyID0gdjsKKwkJCWcgPSBwOworCQkJYiA9IHE7CisJCQlicmVhazsKKwkJfQorCX0KKwlzd2l0Y2ggKG9wdC5vdXRwdXRSYW5nZSkgeworCSAgY2FzZSAxOgorCQlyID0gZG9qby5tYXRoLnJvdW5kKHIsIDIpOworCQlnID0gZG9qby5tYXRoLnJvdW5kKGcsIDIpOworCQliID0gZG9qby5tYXRoLnJvdW5kKGIsIDIpOworCQlicmVhazsKKwkgIGNhc2UgMTAwOgorCQlyID0gTWF0aC5yb3VuZChyICogMTAwKTsKKwkJZyA9IE1hdGgucm91bmQoZyAqIDEwMCk7CisJCWIgPSBNYXRoLnJvdW5kKGIgKiAxMDApOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXIgPSBNYXRoLnJvdW5kKHIgKiAyNTUpOworCQlnID0gTWF0aC5yb3VuZChnICogMjU1KTsKKwkJYiA9IE1hdGgucm91bmQoYiAqIDI1NSk7CisJfQorCXJldHVybiBbciwgZywgYl07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L2NvbW1vbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvY29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWEzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L2NvbW1vbi5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdmeC5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmRlY2xhcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5sYW5nLm1peGluKGRvam8uZ2Z4LCB7ZGVmYXVsdFBhdGg6e3R5cGU6InBhdGgiLCBwYXRoOiIifSwgZGVmYXVsdFBvbHlsaW5lOnt0eXBlOiJwb2x5bGluZSIsIHBvaW50czpbXX0sIGRlZmF1bHRSZWN0Ont0eXBlOiJyZWN0IiwgeDowLCB5OjAsIHdpZHRoOjEwMCwgaGVpZ2h0OjEwMCwgcjowfSwgZGVmYXVsdEVsbGlwc2U6e3R5cGU6ImVsbGlwc2UiLCBjeDowLCBjeTowLCByeDoyMDAsIHJ5OjEwMH0sIGRlZmF1bHRDaXJjbGU6e3R5cGU6ImNpcmNsZSIsIGN4OjAsIGN5OjAsIHI6MTAwfSwgZGVmYXVsdExpbmU6e3R5cGU6ImxpbmUiLCB4MTowLCB5MTowLCB4MjoxMDAsIHkyOjEwMH0sIGRlZmF1bHRJbWFnZTp7dHlwZToiaW1hZ2UiLCB3aWR0aDowLCBoZWlnaHQ6MCwgc3JjOiIifSwgZGVmYXVsdFN0cm9rZTp7Y29sb3I6ImJsYWNrIiwgd2lkdGg6MSwgY2FwOiJidXR0Iiwgam9pbjo0fSwgZGVmYXVsdExpbmVhckdyYWRpZW50Ont0eXBlOiJsaW5lYXIiLCB4MTowLCB5MTowLCB4MjoxMDAsIHkyOjEwMCwgY29sb3JzOlt7b2Zmc2V0OjAsIGNvbG9yOiJibGFjayJ9LCB7b2Zmc2V0OjEsIGNvbG9yOiJ3aGl0ZSJ9XX0sIGRlZmF1bHRSYWRpYWxHcmFkaWVudDp7dHlwZToicmFkaWFsIiwgY3g6MCwgY3k6MCwgcjoxMDAsIGNvbG9yczpbe29mZnNldDowLCBjb2xvcjoiYmxhY2sifSwge29mZnNldDoxLCBjb2xvcjoid2hpdGUifV19LCBkZWZhdWx0UGF0dGVybjp7dHlwZToicGF0dGVybiIsIHg6MCwgeTowLCB3aWR0aDowLCBoZWlnaHQ6MCwgc3JjOiIifSwgbm9ybWFsaXplQ29sb3I6ZnVuY3Rpb24gKGNvbG9yKSB7CisJcmV0dXJuIChjb2xvciBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKSA/IGNvbG9yIDogbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGNvbG9yKTsKK30sIG5vcm1hbGl6ZVBhcmFtZXRlcnM6ZnVuY3Rpb24gKGV4aXN0ZWQsIHVwZGF0ZSkgeworCWlmICh1cGRhdGUpIHsKKwkJdmFyIGVtcHR5ID0ge307CisJCWZvciAodmFyIHggaW4gZXhpc3RlZCkgeworCQkJaWYgKHggaW4gdXBkYXRlICYmICEoeCBpbiBlbXB0eSkpIHsKKwkJCQlleGlzdGVkW3hdID0gdXBkYXRlW3hdOworCQkJfQorCQl9CisJfQorCXJldHVybiBleGlzdGVkOworfSwgbWFrZVBhcmFtZXRlcnM6ZnVuY3Rpb24gKGRlZmF1bHRzLCB1cGRhdGUpIHsKKwlpZiAoIXVwZGF0ZSkgeworCQlyZXR1cm4gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRlZmF1bHRzLCB0cnVlKTsKKwl9CisJdmFyIHJlc3VsdCA9IHt9OworCWZvciAodmFyIGkgaW4gZGVmYXVsdHMpIHsKKwkJaWYgKCEoaSBpbiByZXN1bHQpKSB7CisJCQlyZXN1bHRbaV0gPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoKGkgaW4gdXBkYXRlKSA/IHVwZGF0ZVtpXSA6IGRlZmF1bHRzW2ldLCB0cnVlKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgZm9ybWF0TnVtYmVyOmZ1bmN0aW9uICh4LCBhZGRTcGFjZSkgeworCXZhciB2YWwgPSB4LnRvU3RyaW5nKCk7CisJaWYgKHZhbC5pbmRleE9mKCJlIikgPj0gMCkgeworCQl2YWwgPSB4LnRvRml4ZWQoNCk7CisJfSBlbHNlIHsKKwkJdmFyIHBvaW50ID0gdmFsLmluZGV4T2YoIi4iKTsKKwkJaWYgKHBvaW50ID49IDAgJiYgdmFsLmxlbmd0aCAtIHBvaW50ID4gNSkgeworCQkJdmFsID0geC50b0ZpeGVkKDQpOworCQl9CisJfQorCWlmICh4IDwgMCkgeworCQlyZXR1cm4gdmFsOworCX0KKwlyZXR1cm4gYWRkU3BhY2UgPyAiICIgKyB2YWwgOiB2YWw7Cit9LCBwYXRoUmVnRXhwOi8oW0EtWmEtel0rKXwoXGQrKFwuXGQrKT8pfChcLlxkKyl8KC1cZCsoXC5cZCspPyl8KC1cLlxkKykvZ30pOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5TdXJmYWNlIiwgbnVsbCwge2luaXRpYWxpemVyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnJhd05vZGUgPSBudWxsOworfSwgZ2V0RXZlbnRTb3VyY2U6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnJhd05vZGU7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LlBvaW50IiwgbnVsbCwge30pOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5SZWN0YW5nbGUiLCBudWxsLCB7fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvbWF0cml4LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9tYXRyaXguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlY2M2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvbWF0cml4LmpzCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdmeC5tYXRyaXgiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGguKiIpOworZG9qby5nZngubWF0cml4Lk1hdHJpeDJEID0gZnVuY3Rpb24gKGFyZykgeworCWlmIChhcmcpIHsKKwkJaWYgKGFyZyBpbnN0YW5jZW9mIEFycmF5KSB7CisJCQlpZiAoYXJnLmxlbmd0aCA+IDApIHsKKwkJCQl2YXIgbSA9IGRvam8uZ2Z4Lm1hdHJpeC5ub3JtYWxpemUoYXJnWzBdKTsKKwkJCQlmb3IgKHZhciBpID0gMTsgaSA8IGFyZy5sZW5ndGg7ICsraSkgeworCQkJCQl2YXIgbCA9IG07CisJCQkJCXZhciByID0gZG9qby5nZngubWF0cml4Lm5vcm1hbGl6ZShhcmdbaV0pOworCQkJCQltID0gbmV3IGRvam8uZ2Z4Lm1hdHJpeC5NYXRyaXgyRCgpOworCQkJCQltLnh4ID0gbC54eCAqIHIueHggKyBsLnh5ICogci55eDsKKwkJCQkJbS54eSA9IGwueHggKiByLnh5ICsgbC54eSAqIHIueXk7CisJCQkJCW0ueXggPSBsLnl4ICogci54eCArIGwueXkgKiByLnl4OworCQkJCQltLnl5ID0gbC55eCAqIHIueHkgKyBsLnl5ICogci55eTsKKwkJCQkJbS5keCA9IGwueHggKiByLmR4ICsgbC54eSAqIHIuZHkgKyBsLmR4OworCQkJCQltLmR5ID0gbC55eCAqIHIuZHggKyBsLnl5ICogci5keSArIGwuZHk7CisJCQkJfQorCQkJCWRvam8ubWl4aW4odGhpcywgbSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkb2pvLm1peGluKHRoaXMsIGFyZyk7CisJCX0KKwl9Cit9OworZG9qby5leHRlbmQoZG9qby5nZngubWF0cml4Lk1hdHJpeDJELCB7eHg6MSwgeHk6MCwgeXg6MCwgeXk6MSwgZHg6MCwgZHk6MH0pOworZG9qby5taXhpbihkb2pvLmdmeC5tYXRyaXgsIHtpZGVudGl0eTpuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKCksIGZsaXBYOm5ldyBkb2pvLmdmeC5tYXRyaXguTWF0cml4MkQoe3h4Oi0xfSksIGZsaXBZOm5ldyBkb2pvLmdmeC5tYXRyaXguTWF0cml4MkQoe3l5Oi0xfSksIGZsaXBYWTpuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHt4eDotMSwgeXk6LTF9KSwgdHJhbnNsYXRlOmZ1bmN0aW9uIChhLCBiKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHtkeDphLCBkeTpifSk7CisJfQorCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHtkeDphLngsIGR5OmEueX0pOworfSwgc2NhbGU6ZnVuY3Rpb24gKGEsIGIpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKwkJcmV0dXJuIG5ldyBkb2pvLmdmeC5tYXRyaXguTWF0cml4MkQoe3h4OmEsIHl5OmJ9KTsKKwl9CisJaWYgKHR5cGVvZiBhID09ICJudW1iZXIiKSB7CisJCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHt4eDphLCB5eTphfSk7CisJfQorCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHt4eDphLngsIHl5OmEueX0pOworfSwgcm90YXRlOmZ1bmN0aW9uIChhbmdsZSkgeworCXZhciBjID0gTWF0aC5jb3MoYW5nbGUpOworCXZhciBzID0gTWF0aC5zaW4oYW5nbGUpOworCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHt4eDpjLCB4eTpzLCB5eDotcywgeXk6Y30pOworfSwgcm90YXRlZzpmdW5jdGlvbiAoZGVncmVlKSB7CisJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5yb3RhdGUoZG9qby5tYXRoLmRlZ1RvUmFkKGRlZ3JlZSkpOworfSwgc2tld1g6ZnVuY3Rpb24gKGFuZ2xlKSB7CisJcmV0dXJuIG5ldyBkb2pvLmdmeC5tYXRyaXguTWF0cml4MkQoe3h5Ok1hdGgudGFuKGFuZ2xlKX0pOworfSwgc2tld1hnOmZ1bmN0aW9uIChkZWdyZWUpIHsKKwlyZXR1cm4gZG9qby5nZngubWF0cml4LnNrZXdYKGRvam8ubWF0aC5kZWdUb1JhZChkZWdyZWUpKTsKK30sIHNrZXdZOmZ1bmN0aW9uIChhbmdsZSkgeworCXJldHVybiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKHt5eDotTWF0aC50YW4oYW5nbGUpfSk7Cit9LCBza2V3WWc6ZnVuY3Rpb24gKGRlZ3JlZSkgeworCXJldHVybiBkb2pvLmdmeC5tYXRyaXguc2tld1koZG9qby5tYXRoLmRlZ1RvUmFkKGRlZ3JlZSkpOworfSwgbm9ybWFsaXplOmZ1bmN0aW9uIChtYXRyaXgpIHsKKwlyZXR1cm4gKG1hdHJpeCBpbnN0YW5jZW9mIGRvam8uZ2Z4Lm1hdHJpeC5NYXRyaXgyRCkgPyBtYXRyaXggOiBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKG1hdHJpeCk7Cit9LCBjbG9uZTpmdW5jdGlvbiAobWF0cml4KSB7CisJdmFyIG9iaiA9IG5ldyBkb2pvLmdmeC5tYXRyaXguTWF0cml4MkQoKTsKKwlmb3IgKHZhciBpIGluIG1hdHJpeCkgeworCQlpZiAodHlwZW9mIChtYXRyaXhbaV0pID09ICJudW1iZXIiICYmIHR5cGVvZiAob2JqW2ldKSA9PSAibnVtYmVyIiAmJiBvYmpbaV0gIT0gbWF0cml4W2ldKSB7CisJCQlvYmpbaV0gPSBtYXRyaXhbaV07CisJCX0KKwl9CisJcmV0dXJuIG9iajsKK30sIGludmVydDpmdW5jdGlvbiAobWF0cml4KSB7CisJdmFyIG0gPSBkb2pvLmdmeC5tYXRyaXgubm9ybWFsaXplKG1hdHJpeCk7CisJdmFyIEQgPSBtLnh4ICogbS55eSAtIG0ueHkgKiBtLnl4OworCXZhciBNID0gbmV3IGRvam8uZ2Z4Lm1hdHJpeC5NYXRyaXgyRCh7eHg6bS55eSAvIEQsIHh5Oi1tLnh5IC8gRCwgeXg6LW0ueXggLyBELCB5eTptLnh4IC8gRCwgZHg6KG0ueXggKiBtLmR5IC0gbS55eSAqIG0uZHgpIC8gRCwgZHk6KG0ueHkgKiBtLmR4IC0gbS54eCAqIG0uZHkpIC8gRH0pOworCXJldHVybiBNOworfSwgX211bHRpcGx5UG9pbnQ6ZnVuY3Rpb24gKG0sIHgsIHkpIHsKKwlyZXR1cm4ge3g6bS54eCAqIHggKyBtLnh5ICogeSArIG0uZHgsIHk6bS55eCAqIHggKyBtLnl5ICogeSArIG0uZHl9OworfSwgbXVsdGlwbHlQb2ludDpmdW5jdGlvbiAobWF0cml4LCBhLCBiKSB7CisJdmFyIG0gPSBkb2pvLmdmeC5tYXRyaXgubm9ybWFsaXplKG1hdHJpeCk7CisJaWYgKHR5cGVvZiBhID09ICJudW1iZXIiICYmIHR5cGVvZiBiID09ICJudW1iZXIiKSB7CisJCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX211bHRpcGx5UG9pbnQobSwgYSwgYik7CisJfQorCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX211bHRpcGx5UG9pbnQobSwgYS54LCBhLnkpOworfSwgbXVsdGlwbHk6ZnVuY3Rpb24gKG1hdHJpeCkgeworCXZhciBtID0gZG9qby5nZngubWF0cml4Lm5vcm1hbGl6ZShtYXRyaXgpOworCWZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisJCXZhciBsID0gbTsKKwkJdmFyIHIgPSBkb2pvLmdmeC5tYXRyaXgubm9ybWFsaXplKGFyZ3VtZW50c1tpXSk7CisJCW0gPSBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKCk7CisJCW0ueHggPSBsLnh4ICogci54eCArIGwueHkgKiByLnl4OworCQltLnh5ID0gbC54eCAqIHIueHkgKyBsLnh5ICogci55eTsKKwkJbS55eCA9IGwueXggKiByLnh4ICsgbC55eSAqIHIueXg7CisJCW0ueXkgPSBsLnl4ICogci54eSArIGwueXkgKiByLnl5OworCQltLmR4ID0gbC54eCAqIHIuZHggKyBsLnh5ICogci5keSArIGwuZHg7CisJCW0uZHkgPSBsLnl4ICogci5keCArIGwueXkgKiByLmR5ICsgbC5keTsKKwl9CisJcmV0dXJuIG07Cit9LCBfc2FuZHdpY2g6ZnVuY3Rpb24gKG0sIHgsIHkpIHsKKwlyZXR1cm4gZG9qby5nZngubWF0cml4Lm11bHRpcGx5KGRvam8uZ2Z4Lm1hdHJpeC50cmFuc2xhdGUoeCwgeSksIG0sIGRvam8uZ2Z4Lm1hdHJpeC50cmFuc2xhdGUoLXgsIC15KSk7Cit9LCBzY2FsZUF0OmZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7CisJc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7CisJICBjYXNlIDQ6CisJCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5zY2FsZShhLCBiKSwgYywgZCk7CisJICBjYXNlIDM6CisJCWlmICh0eXBlb2YgYyA9PSAibnVtYmVyIikgeworCQkJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnNjYWxlKGEpLCBiLCBjKTsKKwkJfQorCQlyZXR1cm4gZG9qby5nZngubWF0cml4Ll9zYW5kd2ljaChkb2pvLmdmeC5tYXRyaXguc2NhbGUoYSwgYiksIGMueCwgYy55KTsKKwl9CisJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnNjYWxlKGEpLCBiLngsIGIueSk7Cit9LCByb3RhdGVBdDpmdW5jdGlvbiAoYW5nbGUsIGEsIGIpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnJvdGF0ZShhbmdsZSksIGEsIGIpOworCX0KKwlyZXR1cm4gZG9qby5nZngubWF0cml4Ll9zYW5kd2ljaChkb2pvLmdmeC5tYXRyaXgucm90YXRlKGFuZ2xlKSwgYS54LCBhLnkpOworfSwgcm90YXRlZ0F0OmZ1bmN0aW9uIChkZWdyZWUsIGEsIGIpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnJvdGF0ZWcoZGVncmVlKSwgYSwgYik7CisJfQorCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5yb3RhdGVnKGRlZ3JlZSksIGEueCwgYS55KTsKK30sIHNrZXdYQXQ6ZnVuY3Rpb24gKGFuZ2xlLCBhLCBiKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisJCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5za2V3WChhbmdsZSksIGEsIGIpOworCX0KKwlyZXR1cm4gZG9qby5nZngubWF0cml4Ll9zYW5kd2ljaChkb2pvLmdmeC5tYXRyaXguc2tld1goYW5nbGUpLCBhLngsIGEueSk7Cit9LCBza2V3WGdBdDpmdW5jdGlvbiAoZGVncmVlLCBhLCBiKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisJCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5za2V3WGcoZGVncmVlKSwgYSwgYik7CisJfQorCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5za2V3WGcoZGVncmVlKSwgYS54LCBhLnkpOworfSwgc2tld1lBdDpmdW5jdGlvbiAoYW5nbGUsIGEsIGIpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnNrZXdZKGFuZ2xlKSwgYSwgYik7CisJfQorCXJldHVybiBkb2pvLmdmeC5tYXRyaXguX3NhbmR3aWNoKGRvam8uZ2Z4Lm1hdHJpeC5za2V3WShhbmdsZSksIGEueCwgYS55KTsKK30sIHNrZXdZZ0F0OmZ1bmN0aW9uIChkZWdyZWUsIGEsIGIpIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnNrZXdZZyhkZWdyZWUpLCBhLCBiKTsKKwl9CisJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5fc2FuZHdpY2goZG9qby5nZngubWF0cml4LnNrZXdZZyhkZWdyZWUpLCBhLngsIGEueSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvcGF0aC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvcGF0aC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE1OGJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9wYXRoLmpzCkBAIC0wLDAgKzEsMjY4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdmeC5wYXRoIik7Citkb2pvLnJlcXVpcmUoImRvam8ubWF0aCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5zaGFwZSIpOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5wYXRoLlBhdGgiLCBkb2pvLmdmeC5TaGFwZSwge2luaXRpYWxpemVyOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdGhpcy5zaGFwZSA9IGRvam8ubGFuZy5zaGFsbG93Q29weShkb2pvLmdmeC5kZWZhdWx0UGF0aCwgdHJ1ZSk7CisJdGhpcy5zZWdtZW50cyA9IFtdOworCXRoaXMuYWJzb2x1dGUgPSB0cnVlOworCXRoaXMubGFzdCA9IHt9OworCXRoaXMuYXR0YWNoKHJhd05vZGUpOworfSwgc2V0QWJzb2x1dGVNb2RlOmZ1bmN0aW9uIChtb2RlKSB7CisJdGhpcy5hYnNvbHV0ZSA9IHR5cGVvZiAobW9kZSkgPT0gInN0cmluZyIgPyAobW9kZSA9PSAiYWJzb2x1dGUiKSA6IG1vZGU7CisJcmV0dXJuIHRoaXM7Cit9LCBnZXRBYnNvbHV0ZU1vZGU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmFic29sdXRlOworfSwgZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24gKCkgeworCXJldHVybiAibCIgaW4gdGhpcy5iYm94ID8ge3g6dGhpcy5iYm94LmwsIHk6dGhpcy5iYm94LnQsIHdpZHRoOnRoaXMuYmJveC5yIC0gdGhpcy5iYm94LmwsIGhlaWdodDp0aGlzLmJib3guYiAtIHRoaXMuYmJveC50fSA6IG51bGw7Cit9LCBnZXRMYXN0UG9zaXRpb246ZnVuY3Rpb24gKCkgeworCXJldHVybiAieCIgaW4gdGhpcy5sYXN0ID8gdGhpcy5sYXN0IDogbnVsbDsKK30sIF91cGRhdGVCQm94OmZ1bmN0aW9uICh4LCB5KSB7CisJaWYgKCJsIiBpbiB0aGlzLmJib3gpIHsKKwkJaWYgKHRoaXMuYmJveC5sID4geCkgeworCQkJdGhpcy5iYm94LmwgPSB4OworCQl9CisJCWlmICh0aGlzLmJib3guciA8IHgpIHsKKwkJCXRoaXMuYmJveC5yID0geDsKKwkJfQorCQlpZiAodGhpcy5iYm94LnQgPiB5KSB7CisJCQl0aGlzLmJib3gudCA9IHk7CisJCX0KKwkJaWYgKHRoaXMuYmJveC5iIDwgeSkgeworCQkJdGhpcy5iYm94LmIgPSB5OworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5iYm94ID0ge2w6eCwgYjp5LCByOngsIHQ6eX07CisJfQorfSwgX3VwZGF0ZVdpdGhTZWdtZW50OmZ1bmN0aW9uIChzZWdtZW50KSB7CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlzd2l0Y2ggKHNlZ21lbnQuYWN0aW9uKSB7CisJICBjYXNlICJNIjoKKwkgIGNhc2UgIkwiOgorCSAgY2FzZSAiQyI6CisJICBjYXNlICJTIjoKKwkgIGNhc2UgIlEiOgorCSAgY2FzZSAiVCI6CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSAyKSB7CisJCQl0aGlzLl91cGRhdGVCQm94KHRoaXMuYmJveCwgbltpXSwgbltpICsgMV0pOworCQl9CisJCXRoaXMubGFzdC54ID0gbltsIC0gMl07CisJCXRoaXMubGFzdC55ID0gbltsIC0gMV07CisJCXRoaXMuYWJzb2x1dGUgPSB0cnVlOworCQlicmVhazsKKwkgIGNhc2UgIkgiOgorCQlmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkgeworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIG5baV0sIHRoaXMubGFzdC55KTsKKwkJfQorCQl0aGlzLmxhc3QueCA9IG5bbCAtIDFdOworCQl0aGlzLmFic29sdXRlID0gdHJ1ZTsKKwkJYnJlYWs7CisJICBjYXNlICJWIjoKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHsKKwkJCXRoaXMuX3VwZGF0ZUJCb3godGhpcy5iYm94LCB0aGlzLmxhc3QueCwgbltpXSk7CisJCX0KKwkJdGhpcy5sYXN0LnkgPSBuW2wgLSAxXTsKKwkJdGhpcy5hYnNvbHV0ZSA9IHRydWU7CisJCWJyZWFrOworCSAgY2FzZSAibSI6CisJCXZhciBzdGFydCA9IDA7CisJCWlmICghKCJ4IiBpbiB0aGlzLmxhc3QpKSB7CisJCQl0aGlzLl91cGRhdGVCQm94KHRoaXMuYmJveCwgdGhpcy5sYXN0LnggPSBuWzBdLCB0aGlzLmxhc3QueSA9IG5bMV0pOworCQkJc3RhcnQgPSAyOworCQl9CisJCWZvciAodmFyIGkgPSBzdGFydDsgaSA8IGw7IGkgKz0gMikgeworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIHRoaXMubGFzdC54ICs9IG5baV0sIHRoaXMubGFzdC55ICs9IG5baSArIDFdKTsKKwkJfQorCQl0aGlzLmFic29sdXRlID0gZmFsc2U7CisJCWJyZWFrOworCSAgY2FzZSAibCI6CisJICBjYXNlICJ0IjoKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDIpIHsKKwkJCXRoaXMuX3VwZGF0ZUJCb3godGhpcy5iYm94LCB0aGlzLmxhc3QueCArPSBuW2ldLCB0aGlzLmxhc3QueSArPSBuW2kgKyAxXSk7CisJCX0KKwkJdGhpcy5hYnNvbHV0ZSA9IGZhbHNlOworCQlicmVhazsKKwkgIGNhc2UgImgiOgorCQlmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkgeworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIHRoaXMubGFzdC54ICs9IG5baV0sIHRoaXMubGFzdC55KTsKKwkJfQorCQl0aGlzLmFic29sdXRlID0gZmFsc2U7CisJCWJyZWFrOworCSAgY2FzZSAidiI6CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7CisJCQl0aGlzLl91cGRhdGVCQm94KHRoaXMuYmJveCwgdGhpcy5sYXN0LngsIHRoaXMubGFzdC55ICs9IG5baV0pOworCQl9CisJCXRoaXMuYWJzb2x1dGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJICBjYXNlICJjIjoKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDYpIHsKKwkJCXRoaXMuX3VwZGF0ZUJCb3godGhpcy5iYm94LCB0aGlzLmxhc3QueCArIG5baV0sIHRoaXMubGFzdC55ICsgbltpICsgMV0pOworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIHRoaXMubGFzdC54ICsgbltpICsgMl0sIHRoaXMubGFzdC55ICsgbltpICsgM10pOworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIHRoaXMubGFzdC54ICs9IG5baSArIDRdLCB0aGlzLmxhc3QueSArPSBuW2kgKyA1XSk7CisJCX0KKwkJdGhpcy5hYnNvbHV0ZSA9IGZhbHNlOworCQlicmVhazsKKwkgIGNhc2UgInMiOgorCSAgY2FzZSAicSI6CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSA0KSB7CisJCQl0aGlzLl91cGRhdGVCQm94KHRoaXMuYmJveCwgdGhpcy5sYXN0LnggKyBuW2ldLCB0aGlzLmxhc3QueSArIG5baSArIDFdKTsKKwkJCXRoaXMuX3VwZGF0ZUJCb3godGhpcy5iYm94LCB0aGlzLmxhc3QueCArPSBuW2kgKyAyXSwgdGhpcy5sYXN0LnkgKz0gbltpICsgM10pOworCQl9CisJCXRoaXMuYWJzb2x1dGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJICBjYXNlICJBIjoKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDcpIHsKKwkJCXRoaXMuX3VwZGF0ZUJCb3godGhpcy5iYm94LCBuW2kgKyA1XSwgbltpICsgNl0pOworCQl9CisJCXRoaXMubGFzdC54ID0gbltsIC0gMl07CisJCXRoaXMubGFzdC55ID0gbltsIC0gMV07CisJCXRoaXMuYWJzb2x1dGUgPSB0cnVlOworCQlicmVhazsKKwkgIGNhc2UgImEiOgorCQlmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gNykgeworCQkJdGhpcy5fdXBkYXRlQkJveCh0aGlzLmJib3gsIHRoaXMubGFzdC54ICs9IG5baSArIDVdLCB0aGlzLmxhc3QueSArPSBuW2kgKyA2XSk7CisJCX0KKwkJdGhpcy5hYnNvbHV0ZSA9IGZhbHNlOworCQlicmVhazsKKwl9CisJdmFyIHBhdGggPSBbc2VnbWVudC5hY3Rpb25dOworCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7CisJCXBhdGgucHVzaChkb2pvLmdmeC5mb3JtYXROdW1iZXIobltpXSwgdHJ1ZSkpOworCX0KKwlpZiAodHlwZW9mICh0aGlzLnNoYXBlLnBhdGgpID09ICJzdHJpbmciKSB7CisJCXRoaXMuc2hhcGUucGF0aCArPSBwYXRoLmpvaW4oIiIpOworCX0gZWxzZSB7CisJCXRoaXMuc2hhcGUucGF0aCA9IHRoaXMuc2hhcGUucGF0aC5jb25jYXQocGF0aCk7CisJfQorfSwgX3ZhbGlkU2VnbWVudHM6e206MiwgbDoyLCBoOjEsIHY6MSwgYzo2LCBzOjQsIHE6NCwgdDoyLCBhOjcsIHo6MH0sIF9wdXNoU2VnbWVudDpmdW5jdGlvbiAoYWN0aW9uLCBhcmdzKSB7CisJdmFyIGdyb3VwID0gdGhpcy5fdmFsaWRTZWdtZW50c1thY3Rpb24udG9Mb3dlckNhc2UoKV07CisJaWYgKHR5cGVvZiAoZ3JvdXApID09ICJudW1iZXIiKSB7CisJCWlmIChncm91cCkgeworCQkJaWYgKGFyZ3MubGVuZ3RoID49IGdyb3VwKSB7CisJCQkJdmFyIHNlZ21lbnQgPSB7YWN0aW9uOmFjdGlvbiwgYXJnczphcmdzLnNsaWNlKDAsIGFyZ3MubGVuZ3RoIC0gYXJncy5sZW5ndGggJSBncm91cCl9OworCQkJCXRoaXMuc2VnbWVudHMucHVzaChzZWdtZW50KTsKKwkJCQl0aGlzLl91cGRhdGVXaXRoU2VnbWVudChzZWdtZW50KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhciBzZWdtZW50ID0ge2FjdGlvbjphY3Rpb24sIGFyZ3M6W119OworCQkJdGhpcy5zZWdtZW50cy5wdXNoKHNlZ21lbnQpOworCQkJdGhpcy5fdXBkYXRlV2l0aFNlZ21lbnQoc2VnbWVudCk7CisJCX0KKwl9Cit9LCBfY29sbGVjdEFyZ3M6ZnVuY3Rpb24gKGFycmF5LCBhcmdzKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisJCXZhciB0ID0gYXJnc1tpXTsKKwkJaWYgKHR5cGVvZiAodCkgPT0gImJvb2xlYW4iKSB7CisJCQlhcnJheS5wdXNoKHQgPyAxIDogMCk7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZW9mICh0KSA9PSAibnVtYmVyIikgeworCQkJCWFycmF5LnB1c2godCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh0IGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJCQkJdGhpcy5fY29sbGVjdEFyZ3MoYXJyYXksIHQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgieCIgaW4gdCAmJiAieSIgaW4gdCkgeworCQkJCQkJYXJyYXkucHVzaCh0LngpOworCQkJCQkJYXJyYXkucHVzaCh0LnkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfSwgbW92ZVRvOmZ1bmN0aW9uICgpIHsKKwl2YXIgYXJncyA9IFtdOworCXRoaXMuX2NvbGxlY3RBcmdzKGFyZ3MsIGFyZ3VtZW50cyk7CisJdGhpcy5fcHVzaFNlZ21lbnQodGhpcy5hYnNvbHV0ZSA/ICJNIiA6ICJtIiwgYXJncyk7CisJcmV0dXJuIHRoaXM7Cit9LCBsaW5lVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIkwiIDogImwiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIGhMaW5lVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIkgiIDogImgiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIHZMaW5lVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIlYiIDogInYiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIGN1cnZlVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIkMiIDogImMiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIHNtb290aEN1cnZlVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIlMiIDogInMiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIHFDdXJ2ZVRvOmZ1bmN0aW9uICgpIHsKKwl2YXIgYXJncyA9IFtdOworCXRoaXMuX2NvbGxlY3RBcmdzKGFyZ3MsIGFyZ3VtZW50cyk7CisJdGhpcy5fcHVzaFNlZ21lbnQodGhpcy5hYnNvbHV0ZSA/ICJRIiA6ICJxIiwgYXJncyk7CisJcmV0dXJuIHRoaXM7Cit9LCBxU21vb3RoQ3VydmVUbzpmdW5jdGlvbiAoKSB7CisJdmFyIGFyZ3MgPSBbXTsKKwl0aGlzLl9jb2xsZWN0QXJncyhhcmdzLCBhcmd1bWVudHMpOworCXRoaXMuX3B1c2hTZWdtZW50KHRoaXMuYWJzb2x1dGUgPyAiVCIgOiAidCIsIGFyZ3MpOworCXJldHVybiB0aGlzOworfSwgYXJjVG86ZnVuY3Rpb24gKCkgeworCXZhciBhcmdzID0gW107CisJdGhpcy5fY29sbGVjdEFyZ3MoYXJncywgYXJndW1lbnRzKTsKKwlmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDcpIHsKKwkJYXJnc1tpXSA9IC1hcmdzW2ldOworCX0KKwl0aGlzLl9wdXNoU2VnbWVudCh0aGlzLmFic29sdXRlID8gIkEiIDogImEiLCBhcmdzKTsKKwlyZXR1cm4gdGhpczsKK30sIGNsb3NlUGF0aDpmdW5jdGlvbiAoKSB7CisJdGhpcy5fcHVzaFNlZ21lbnQoIloiLCBbXSk7CisJcmV0dXJuIHRoaXM7Cit9LCBfc2V0UGF0aDpmdW5jdGlvbiAocGF0aCkgeworCXZhciBwID0gcGF0aC5tYXRjaChkb2pvLmdmeC5wYXRoUmVnRXhwKTsKKwl0aGlzLnNlZ21lbnRzID0gW107CisJdGhpcy5hYnNvbHV0ZSA9IHRydWU7CisJdGhpcy5iYm94ID0ge307CisJdGhpcy5sYXN0ID0ge307CisJaWYgKCFwKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGFjdGlvbiA9ICIiOworCXZhciBhcmdzID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCBwLmxlbmd0aDsgKytpKSB7CisJCXZhciB0ID0gcFtpXTsKKwkJdmFyIHggPSBwYXJzZUZsb2F0KHQpOworCQlpZiAoaXNOYU4oeCkpIHsKKwkJCWlmIChhY3Rpb24pIHsKKwkJCQl0aGlzLl9wdXNoU2VnbWVudChhY3Rpb24sIGFyZ3MpOworCQkJfQorCQkJYXJncyA9IFtdOworCQkJYWN0aW9uID0gdDsKKwkJfSBlbHNlIHsKKwkJCWFyZ3MucHVzaCh4KTsKKwkJfQorCX0KKwl0aGlzLl9wdXNoU2VnbWVudChhY3Rpb24sIGFyZ3MpOworfSwgc2V0U2hhcGU6ZnVuY3Rpb24gKG5ld1NoYXBlKSB7CisJdGhpcy5zaGFwZSA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKHRoaXMuc2hhcGUsIHR5cGVvZiAobmV3U2hhcGUpID09ICJzdHJpbmciID8ge3BhdGg6bmV3U2hhcGV9IDogbmV3U2hhcGUpOworCXZhciBwYXRoID0gdGhpcy5zaGFwZS5wYXRoOworCXRoaXMuc2hhcGUucGF0aCA9IFtdOworCXRoaXMuX3NldFBhdGgocGF0aCk7CisJdGhpcy5zaGFwZS5wYXRoID0gdGhpcy5zaGFwZS5wYXRoLmpvaW4oIiIpOworCXJldHVybiB0aGlzOworfSwgXzJQSTpNYXRoLlBJICogMn0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L3NoYXBlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9zaGFwZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZiNDNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dmeC9zaGFwZS5qcwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5nZnguc2hhcGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmRlY2xhcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29tbW9uIik7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LlNoYXBlIiwgbnVsbCwge2luaXRpYWxpemVyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnJhd05vZGUgPSBudWxsOworCXRoaXMuc2hhcGUgPSBudWxsOworCXRoaXMubWF0cml4ID0gbnVsbDsKKwl0aGlzLmZpbGxTdHlsZSA9IG51bGw7CisJdGhpcy5zdHJva2VTdHlsZSA9IG51bGw7CisJdGhpcy5iYm94ID0gbnVsbDsKKwl0aGlzLnBhcmVudCA9IG51bGw7CisJdGhpcy5wYXJlbnRNYXRyaXggPSBudWxsOworfSwgZ2V0Tm9kZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucmF3Tm9kZTsKK30sIGdldFNoYXBlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5zaGFwZTsKK30sIGdldFRyYW5zZm9ybTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMubWF0cml4OworfSwgZ2V0RmlsbDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZmlsbFN0eWxlOworfSwgZ2V0U3Ryb2tlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5zdHJva2VTdHlsZTsKK30sIGdldFBhcmVudDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucGFyZW50OworfSwgZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmJib3g7Cit9LCBnZXRFdmVudFNvdXJjZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucmF3Tm9kZTsKK30sIHNldFNoYXBlOmZ1bmN0aW9uIChzaGFwZSkgeworCXJldHVybiB0aGlzOworfSwgc2V0RmlsbDpmdW5jdGlvbiAoZmlsbCkgeworCXJldHVybiB0aGlzOworfSwgc2V0U3Ryb2tlOmZ1bmN0aW9uIChzdHJva2UpIHsKKwlyZXR1cm4gdGhpczsKK30sIG1vdmVUb0Zyb250OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpczsKK30sIG1vdmVUb0JhY2s6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzOworfSwgc2V0VHJhbnNmb3JtOmZ1bmN0aW9uIChtYXRyaXgpIHsKKwl0aGlzLm1hdHJpeCA9IGRvam8uZ2Z4Lm1hdHJpeC5jbG9uZShtYXRyaXggPyBkb2pvLmdmeC5tYXRyaXgubm9ybWFsaXplKG1hdHJpeCkgOiBkb2pvLmdmeC5pZGVudGl0eSwgdHJ1ZSk7CisJcmV0dXJuIHRoaXMuX2FwcGx5VHJhbnNmb3JtKCk7Cit9LCBhcHBseVJpZ2h0VHJhbnNmb3JtOmZ1bmN0aW9uIChtYXRyaXgpIHsKKwlyZXR1cm4gbWF0cml4ID8gdGhpcy5zZXRUcmFuc2Zvcm0oW3RoaXMubWF0cml4LCBtYXRyaXhdKSA6IHRoaXM7Cit9LCBhcHBseUxlZnRUcmFuc2Zvcm06ZnVuY3Rpb24gKG1hdHJpeCkgeworCXJldHVybiBtYXRyaXggPyB0aGlzLnNldFRyYW5zZm9ybShbbWF0cml4LCB0aGlzLm1hdHJpeF0pIDogdGhpczsKK30sIGFwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uIChtYXRyaXgpIHsKKwlyZXR1cm4gbWF0cml4ID8gdGhpcy5zZXRUcmFuc2Zvcm0oW3RoaXMubWF0cml4LCBtYXRyaXhdKSA6IHRoaXM7Cit9LCByZW1vdmU6ZnVuY3Rpb24gKHNpbGVudGx5KSB7CisJaWYgKHRoaXMucGFyZW50KSB7CisJCXRoaXMucGFyZW50LnJlbW92ZSh0aGlzLCBzaWxlbnRseSk7CisJfQorCXJldHVybiB0aGlzOworfSwgX3NldFBhcmVudDpmdW5jdGlvbiAocGFyZW50LCBtYXRyaXgpIHsKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwlyZXR1cm4gdGhpcy5fdXBkYXRlUGFyZW50TWF0cml4KG1hdHJpeCk7Cit9LCBfdXBkYXRlUGFyZW50TWF0cml4OmZ1bmN0aW9uIChtYXRyaXgpIHsKKwl0aGlzLnBhcmVudE1hdHJpeCA9IG1hdHJpeCA/IGRvam8uZ2Z4Lm1hdHJpeC5jbG9uZShtYXRyaXgpIDogbnVsbDsKKwlyZXR1cm4gdGhpcy5fYXBwbHlUcmFuc2Zvcm0oKTsKK30sIF9nZXRSZWFsTWF0cml4OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5wYXJlbnRNYXRyaXggPyBuZXcgZG9qby5nZngubWF0cml4Lk1hdHJpeDJEKFt0aGlzLnBhcmVudE1hdHJpeCwgdGhpcy5tYXRyaXhdKSA6IHRoaXMubWF0cml4OworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5zaGFwZS5WaXJ0dWFsR3JvdXAiLCBkb2pvLmdmeC5TaGFwZSwge2luaXRpYWxpemVyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmNoaWxkcmVuID0gW107Cit9LCBhZGQ6ZnVuY3Rpb24gKHNoYXBlKSB7CisJdmFyIG9sZFBhcmVudCA9IHNoYXBlLmdldFBhcmVudCgpOworCWlmIChvbGRQYXJlbnQpIHsKKwkJb2xkUGFyZW50LnJlbW92ZShzaGFwZSwgdHJ1ZSk7CisJfQorCXRoaXMuY2hpbGRyZW4ucHVzaChzaGFwZSk7CisJcmV0dXJuIHNoYXBlLl9zZXRQYXJlbnQodGhpcywgdGhpcy5fZ2V0UmVhbE1hdHJpeCgpKTsKK30sIHJlbW92ZTpmdW5jdGlvbiAoc2hhcGUsIHNpbGVudGx5KSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CisJCWlmICh0aGlzLmNoaWxkcmVuW2ldID09IHNoYXBlKSB7CisJCQlpZiAoc2lsZW50bHkpIHsKKwkJCX0gZWxzZSB7CisJCQkJc2hhcGUuX3NldFBhcmVudChudWxsLCBudWxsKTsKKwkJCX0KKwkJCXRoaXMuY2hpbGRyZW4uc3BsaWNlKGksIDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBfYXBwbHlUcmFuc2Zvcm06ZnVuY3Rpb24gKCkgeworCXZhciBtYXRyaXggPSB0aGlzLl9nZXRSZWFsTWF0cml4KCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CisJCXRoaXMuY2hpbGRyZW5baV0uX3VwZGF0ZVBhcmVudE1hdHJpeChtYXRyaXgpOworCX0KKwlyZXR1cm4gdGhpczsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguc2hhcGUuUmVjdCIsIGRvam8uZ2Z4LlNoYXBlLCB7aW5pdGlhbGl6ZXI6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl0aGlzLnNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRSZWN0LCB0cnVlKTsKKwl0aGlzLmF0dGFjaChyYXdOb2RlKTsKK30sIGdldEJvdW5kaW5nQm94OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5zaGFwZTsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguc2hhcGUuRWxsaXBzZSIsIGRvam8uZ2Z4LlNoYXBlLCB7aW5pdGlhbGl6ZXI6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl0aGlzLnNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRFbGxpcHNlLCB0cnVlKTsKKwl0aGlzLmF0dGFjaChyYXdOb2RlKTsKK30sIGdldEJvdW5kaW5nQm94OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuYmJveCkgeworCQl2YXIgc2hhcGUgPSB0aGlzLnNoYXBlOworCQl0aGlzLmJib3ggPSB7eDpzaGFwZS5jeCAtIHNoYXBlLnJ4LCB5OnNoYXBlLmN5IC0gc2hhcGUucnksIHdpZHRoOjIgKiBzaGFwZS5yeCwgaGVpZ2h0OjIgKiBzaGFwZS5yeX07CisJfQorCXJldHVybiB0aGlzLmJib3g7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LnNoYXBlLkNpcmNsZSIsIGRvam8uZ2Z4LlNoYXBlLCB7aW5pdGlhbGl6ZXI6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl0aGlzLnNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRDaXJjbGUsIHRydWUpOworCXRoaXMuYXR0YWNoKHJhd05vZGUpOworfSwgZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5iYm94KSB7CisJCXZhciBzaGFwZSA9IHRoaXMuc2hhcGU7CisJCXRoaXMuYmJveCA9IHt4OnNoYXBlLmN4IC0gc2hhcGUuciwgeTpzaGFwZS5jeSAtIHNoYXBlLnIsIHdpZHRoOjIgKiBzaGFwZS5yLCBoZWlnaHQ6MiAqIHNoYXBlLnJ9OworCX0KKwlyZXR1cm4gdGhpcy5iYm94OworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5zaGFwZS5MaW5lIiwgZG9qby5nZnguU2hhcGUsIHtpbml0aWFsaXplcjpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXRoaXMuc2hhcGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdExpbmUsIHRydWUpOworCXRoaXMuYXR0YWNoKHJhd05vZGUpOworfSwgZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5iYm94KSB7CisJCXZhciBzaGFwZSA9IHRoaXMuc2hhcGU7CisJCXRoaXMuYmJveCA9IHt4Ok1hdGgubWluKHNoYXBlLngxLCBzaGFwZS54MiksIHk6TWF0aC5taW4oc2hhcGUueTEsIHNoYXBlLnkyKSwgd2lkdGg6TWF0aC5hYnMoc2hhcGUueDIgLSBzaGFwZS54MSksIGhlaWdodDpNYXRoLmFicyhzaGFwZS55MiAtIHNoYXBlLnkxKX07CisJfQorCXJldHVybiB0aGlzLmJib3g7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LnNoYXBlLlBvbHlsaW5lIiwgZG9qby5nZnguU2hhcGUsIHtpbml0aWFsaXplcjpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXRoaXMuc2hhcGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFBvbHlsaW5lLCB0cnVlKTsKKwl0aGlzLmF0dGFjaChyYXdOb2RlKTsKK30sIGdldEJvdW5kaW5nQm94OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuYmJveCAmJiB0aGlzLnNoYXBlLnBvaW50cy5sZW5ndGgpIHsKKwkJdmFyIHAgPSB0aGlzLnNoYXBlLnBvaW50czsKKwkJdmFyIGwgPSBwLmxlbmd0aDsKKwkJdmFyIHQgPSBwWzBdOworCQl2YXIgYmJveCA9IHtsOnQueCwgdDp0LnksIHI6dC54LCBiOnQueX07CisJCWZvciAodmFyIGkgPSAxOyBpIDwgbDsgKytpKSB7CisJCQl0ID0gcFtpXTsKKwkJCWlmIChiYm94LmwgPiB0LngpIHsKKwkJCQliYm94LmwgPSB0Lng7CisJCQl9CisJCQlpZiAoYmJveC5yIDwgdC54KSB7CisJCQkJYmJveC5yID0gdC54OworCQkJfQorCQkJaWYgKGJib3gudCA+IHQueSkgeworCQkJCWJib3gudCA9IHQueTsKKwkJCX0KKwkJCWlmIChiYm94LmIgPCB0LnkpIHsKKwkJCQliYm94LmIgPSB0Lnk7CisJCQl9CisJCX0KKwkJdGhpcy5iYm94ID0ge3g6YmJveC5sLCB5OmJib3gudCwgd2lkdGg6YmJveC5yIC0gYmJveC5sLCBoZWlnaHQ6YmJveC5iIC0gYmJveC50fTsKKwl9CisJcmV0dXJuIHRoaXMuYmJveDsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguc2hhcGUuSW1hZ2UiLCBkb2pvLmdmeC5TaGFwZSwge2luaXRpYWxpemVyOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdGhpcy5zaGFwZSA9IGRvam8ubGFuZy5zaGFsbG93Q29weShkb2pvLmdmeC5kZWZhdWx0SW1hZ2UsIHRydWUpOworCXRoaXMuYXR0YWNoKHJhd05vZGUpOworfSwgZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5iYm94KSB7CisJCXZhciBzaGFwZSA9IHRoaXMuc2hhcGU7CisJCXRoaXMuYmJveCA9IHt4OjAsIHk6MCwgd2lkdGg6c2hhcGUud2lkdGgsIGhlaWdodDpzaGFwZS5oZWlnaHR9OworCX0KKwlyZXR1cm4gdGhpcy5iYm94OworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L3N2Zy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvc3ZnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDY4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L3N2Zy5qcwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5nZnguc3ZnIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3ZnIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbG9yIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5zaGFwZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5wYXRoIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5nZnguc3ZnIik7Citkb2pvLmdmeC5zdmcuZ2V0UmVmID0gZnVuY3Rpb24gKGZpbGwpIHsKKwlpZiAoIWZpbGwgfHwgZmlsbCA9PSAibm9uZSIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChmaWxsLm1hdGNoKC9edXJsXCgjLitcKSQvKSkgeworCQlyZXR1cm4gZG9qby5ieUlkKGZpbGwuc2xpY2UoNSwgLTEpKTsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwub3BlcmEgJiYgZmlsbC5tYXRjaCgvXiNkal91bmlxdWVfLiskLykpIHsKKwkJcmV0dXJuIGRvam8uYnlJZChmaWxsLnNsaWNlKDEpKTsKKwl9CisJcmV0dXJuIG51bGw7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmdmeC5TaGFwZSwge3NldEZpbGw6ZnVuY3Rpb24gKGZpbGwpIHsKKwlpZiAoIWZpbGwpIHsKKwkJdGhpcy5maWxsU3R5bGUgPSBudWxsOworCQl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKwkJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgMCk7CisJCXJldHVybiB0aGlzOworCX0KKwlpZiAodHlwZW9mIChmaWxsKSA9PSAib2JqZWN0IiAmJiAidHlwZSIgaW4gZmlsbCkgeworCQlzd2l0Y2ggKGZpbGwudHlwZSkgeworCQkgIGNhc2UgImxpbmVhciI6CisJCQl2YXIgZiA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRMaW5lYXJHcmFkaWVudCwgZmlsbCk7CisJCQl2YXIgZ3JhZGllbnQgPSB0aGlzLl9zZXRGaWxsT2JqZWN0KGYsICJsaW5lYXJHcmFkaWVudCIpOworCQkJZG9qby5sYW5nLmZvckVhY2goWyJ4MSIsICJ5MSIsICJ4MiIsICJ5MiJdLCBmdW5jdGlvbiAoeCkgeworCQkJCWdyYWRpZW50LnNldEF0dHJpYnV0ZSh4LCBmW3hdLnRvRml4ZWQoOCkpOworCQkJfSk7CisJCQlicmVhazsKKwkJICBjYXNlICJyYWRpYWwiOgorCQkJdmFyIGYgPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyhkb2pvLmdmeC5kZWZhdWx0UmFkaWFsR3JhZGllbnQsIGZpbGwpOworCQkJdmFyIGdyYWRpZW50ID0gdGhpcy5fc2V0RmlsbE9iamVjdChmLCAicmFkaWFsR3JhZGllbnQiKTsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKFsiY3giLCAiY3kiLCAiciJdLCBmdW5jdGlvbiAoeCkgeworCQkJCWdyYWRpZW50LnNldEF0dHJpYnV0ZSh4LCBmW3hdLnRvRml4ZWQoOCkpOworCQkJfSk7CisJCQlicmVhazsKKwkJICBjYXNlICJwYXR0ZXJuIjoKKwkJCXZhciBmID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnMoZG9qby5nZnguZGVmYXVsdFBhdHRlcm4sIGZpbGwpOworCQkJdmFyIHBhdHRlcm4gPSB0aGlzLl9zZXRGaWxsT2JqZWN0KGYsICJwYXR0ZXJuIik7CisJCQlkb2pvLmxhbmcuZm9yRWFjaChbIngiLCAieSIsICJ3aWR0aCIsICJoZWlnaHQiXSwgZnVuY3Rpb24gKHgpIHsKKwkJCQlwYXR0ZXJuLnNldEF0dHJpYnV0ZSh4LCBmW3hdLnRvRml4ZWQoOCkpOworCQkJfSk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisJdmFyIGYgPSBkb2pvLmdmeC5ub3JtYWxpemVDb2xvcihmaWxsKTsKKwl0aGlzLmZpbGxTdHlsZSA9IGY7CisJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiZmlsbCIsIGYudG9Dc3MoKSk7CisJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5IiwgZi5hKTsKKwlyZXR1cm4gdGhpczsKK30sIHNldFN0cm9rZTpmdW5jdGlvbiAoc3Ryb2tlKSB7CisJaWYgKCFzdHJva2UpIHsKKwkJdGhpcy5zdHJva2VTdHlsZSA9IG51bGw7CisJCXRoaXMucmF3Tm9kZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsICJub25lIik7CisJCXRoaXMucmF3Tm9kZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgMCk7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLnN0cm9rZVN0eWxlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnMoZG9qby5nZnguZGVmYXVsdFN0cm9rZSwgc3Ryb2tlKTsKKwl0aGlzLnN0cm9rZVN0eWxlLmNvbG9yID0gZG9qby5nZngubm9ybWFsaXplQ29sb3IodGhpcy5zdHJva2VTdHlsZS5jb2xvcik7CisJdmFyIHMgPSB0aGlzLnN0cm9rZVN0eWxlOworCXZhciBybiA9IHRoaXMucmF3Tm9kZTsKKwlpZiAocykgeworCQlybi5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIHMuY29sb3IudG9Dc3MoKSk7CisJCXJuLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCBzLmNvbG9yLmEpOworCQlybi5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsIHMud2lkdGgpOworCQlybi5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lY2FwIiwgcy5jYXApOworCQlpZiAodHlwZW9mIChzLmpvaW4pID09ICJudW1iZXIiKSB7CisJCQlybi5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsICJtaXRlciIpOworCQkJcm4uc2V0QXR0cmlidXRlKCJzdHJva2UtbWl0ZXJsaW1pdCIsIHMuam9pbik7CisJCX0gZWxzZSB7CisJCQlybi5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsIHMuam9pbik7CisJCX0KKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBfc2V0RmlsbE9iamVjdDpmdW5jdGlvbiAoZiwgbm9kZVR5cGUpIHsKKwl2YXIgZGVmX2VsZW1zID0gdGhpcy5yYXdOb2RlLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRlZnMiKTsKKwlpZiAoZGVmX2VsZW1zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLmZpbGxTdHlsZSA9IGY7CisJdmFyIGRlZnMgPSBkZWZfZWxlbXNbMF07CisJdmFyIGZpbGwgPSB0aGlzLnJhd05vZGUuZ2V0QXR0cmlidXRlKCJmaWxsIik7CisJdmFyIHJlZiA9IGRvam8uZ2Z4LnN2Zy5nZXRSZWYoZmlsbCk7CisJaWYgKHJlZikgeworCQlmaWxsID0gcmVmOworCQlpZiAoZmlsbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gbm9kZVR5cGUudG9Mb3dlckNhc2UoKSkgeworCQkJdmFyIGlkID0gZmlsbC5pZDsKKwkJCWZpbGwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmaWxsKTsKKwkJCWZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCBub2RlVHlwZSk7CisJCQlmaWxsLnNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7CisJCQlkZWZzLmFwcGVuZENoaWxkKGZpbGwpOworCQl9IGVsc2UgeworCQkJd2hpbGUgKGZpbGwuY2hpbGROb2Rlcy5sZW5ndGgpIHsKKwkJCQlmaWxsLnJlbW92ZUNoaWxkKGZpbGwubGFzdENoaWxkKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCBub2RlVHlwZSk7CisJCWZpbGwuc2V0QXR0cmlidXRlKCJpZCIsIGRvam8uZG9tLmdldFVuaXF1ZUlkKCkpOworCQlkZWZzLmFwcGVuZENoaWxkKGZpbGwpOworCX0KKwlpZiAobm9kZVR5cGUgPT0gInBhdHRlcm4iKSB7CisJCWZpbGwuc2V0QXR0cmlidXRlKCJwYXR0ZXJuVW5pdHMiLCAidXNlclNwYWNlT25Vc2UiKTsKKwkJdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJpbWFnZSIpOworCQlpbWcuc2V0QXR0cmlidXRlKCJ4IiwgMCk7CisJCWltZy5zZXRBdHRyaWJ1dGUoInkiLCAwKTsKKwkJaW1nLnNldEF0dHJpYnV0ZSgid2lkdGgiLCBmLndpZHRoLnRvRml4ZWQoOCkpOworCQlpbWcuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBmLmhlaWdodC50b0ZpeGVkKDgpKTsKKwkJaW1nLnNldEF0dHJpYnV0ZU5TKGRvam8uc3ZnLnhtbG5zLnhsaW5rLCAiaHJlZiIsIGYuc3JjKTsKKwkJZmlsbC5hcHBlbmRDaGlsZChpbWcpOworCX0gZWxzZSB7CisJCWZpbGwuc2V0QXR0cmlidXRlKCJncmFkaWVudFVuaXRzIiwgInVzZXJTcGFjZU9uVXNlIik7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZi5jb2xvcnMubGVuZ3RoOyArK2kpIHsKKwkJCWYuY29sb3JzW2ldLmNvbG9yID0gZG9qby5nZngubm9ybWFsaXplQ29sb3IoZi5jb2xvcnNbaV0uY29sb3IpOworCQkJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAic3RvcCIpOworCQkJdC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsIGYuY29sb3JzW2ldLm9mZnNldC50b0ZpeGVkKDgpKTsKKwkJCXQuc2V0QXR0cmlidXRlKCJzdG9wLWNvbG9yIiwgZi5jb2xvcnNbaV0uY29sb3IudG9Dc3MoKSk7CisJCQlmaWxsLmFwcGVuZENoaWxkKHQpOworCQl9CisJfQorCXRoaXMucmF3Tm9kZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAidXJsKCMiICsgZmlsbC5nZXRBdHRyaWJ1dGUoImlkIikgKyAiKSIpOworCXRoaXMucmF3Tm9kZS5yZW1vdmVBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIpOworCXJldHVybiBmaWxsOworfSwgX2FwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uICgpIHsKKwl2YXIgbWF0cml4ID0gdGhpcy5fZ2V0UmVhbE1hdHJpeCgpOworCWlmIChtYXRyaXgpIHsKKwkJdmFyIHRtID0gdGhpcy5tYXRyaXg7CisJCXRoaXMucmF3Tm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJtYXRyaXgoIiArIHRtLnh4LnRvRml4ZWQoOCkgKyAiLCIgKyB0bS55eC50b0ZpeGVkKDgpICsgIiwiICsgdG0ueHkudG9GaXhlZCg4KSArICIsIiArIHRtLnl5LnRvRml4ZWQoOCkgKyAiLCIgKyB0bS5keC50b0ZpeGVkKDgpICsgIiwiICsgdG0uZHkudG9GaXhlZCg4KSArICIpIik7CisJfSBlbHNlIHsKKwkJdGhpcy5yYXdOb2RlLnJlbW92ZUF0dHJpYnV0ZSgidHJhbnNmb3JtIik7CisJfQorCXJldHVybiB0aGlzOworfSwgc2V0UmF3Tm9kZTpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXdpdGggKHJhd05vZGUpIHsKKwkJc2V0QXR0cmlidXRlKCJmaWxsIiwgIm5vbmUiKTsKKwkJc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLCAwKTsKKwkJc2V0QXR0cmlidXRlKCJzdHJva2UiLCAibm9uZSIpOworCQlzZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IiwgMCk7CisJCXNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgMSk7CisJCXNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiLCAiYnV0dCIpOworCQlzZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsICJtaXRlciIpOworCQlzZXRBdHRyaWJ1dGUoInN0cm9rZS1taXRlcmxpbWl0IiwgNCk7CisJfQorCXRoaXMucmF3Tm9kZSA9IHJhd05vZGU7Cit9LCBtb3ZlVG9Gcm9udDpmdW5jdGlvbiAoKSB7CisJdGhpcy5yYXdOb2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5yYXdOb2RlKTsKKwlyZXR1cm4gdGhpczsKK30sIG1vdmVUb0JhY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMucmF3Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJhd05vZGUsIHRoaXMucmF3Tm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOworCXJldHVybiB0aGlzOworfSwgc2V0U2hhcGU6ZnVuY3Rpb24gKG5ld1NoYXBlKSB7CisJdGhpcy5zaGFwZSA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKHRoaXMuc2hhcGUsIG5ld1NoYXBlKTsKKwlmb3IgKHZhciBpIGluIHRoaXMuc2hhcGUpIHsKKwkJaWYgKGkgIT0gInR5cGUiKSB7CisJCQl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKGksIHRoaXMuc2hhcGVbaV0pOworCQl9CisJfQorCXJldHVybiB0aGlzOworfSwgYXR0YWNoRmlsbDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXZhciBmaWxsU3R5bGUgPSBudWxsOworCWlmIChyYXdOb2RlKSB7CisJCXZhciBmaWxsID0gcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoImZpbGwiKTsKKwkJaWYgKGZpbGwgPT0gIm5vbmUiKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIHJlZiA9IGRvam8uZ2Z4LnN2Zy5nZXRSZWYoZmlsbCk7CisJCWlmIChyZWYpIHsKKwkJCXZhciBncmFkaWVudCA9IHJlZjsKKwkJCXN3aXRjaCAoZ3JhZGllbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJCQkgIGNhc2UgImxpbmVhcmdyYWRpZW50IjoKKwkJCQlmaWxsU3R5bGUgPSB0aGlzLl9nZXRHcmFkaWVudChkb2pvLmdmeC5kZWZhdWx0TGluZWFyR3JhZGllbnQsIGdyYWRpZW50KTsKKwkJCQlkb2pvLmxhbmcuZm9yRWFjaChbIngxIiwgInkxIiwgIngyIiwgInkyIl0sIGZ1bmN0aW9uICh4KSB7CisJCQkJCWZpbGxTdHlsZVt4XSA9IGdyYWRpZW50LmdldEF0dHJpYnV0ZSh4KTsKKwkJCQl9KTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAicmFkaWFsZ3JhZGllbnQiOgorCQkJCWZpbGxTdHlsZSA9IHRoaXMuX2dldEdyYWRpZW50KGRvam8uZ2Z4LmRlZmF1bHRSYWRpYWxHcmFkaWVudCwgZ3JhZGllbnQpOworCQkJCWRvam8ubGFuZy5mb3JFYWNoKFsiY3giLCAiY3kiLCAiciJdLCBmdW5jdGlvbiAoeCkgeworCQkJCQlmaWxsU3R5bGVbeF0gPSBncmFkaWVudC5nZXRBdHRyaWJ1dGUoeCk7CisJCQkJfSk7CisJCQkJZmlsbFN0eWxlLmN4ID0gZ3JhZGllbnQuZ2V0QXR0cmlidXRlKCJjeCIpOworCQkJCWZpbGxTdHlsZS5jeSA9IGdyYWRpZW50LmdldEF0dHJpYnV0ZSgiY3kiKTsKKwkJCQlmaWxsU3R5bGUuciA9IGdyYWRpZW50LmdldEF0dHJpYnV0ZSgiciIpOworCQkJCWJyZWFrOworCQkJICBjYXNlICJwYXR0ZXJuIjoKKwkJCQlmaWxsU3R5bGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFBhdHRlcm4sIHRydWUpOworCQkJCWRvam8ubGFuZy5mb3JFYWNoKFsieCIsICJ5IiwgIndpZHRoIiwgImhlaWdodCJdLCBmdW5jdGlvbiAoeCkgeworCQkJCQlmaWxsU3R5bGVbeF0gPSBncmFkaWVudC5nZXRBdHRyaWJ1dGUoeCk7CisJCQkJfSk7CisJCQkJZmlsbFN0eWxlLnNyYyA9IGdyYWRpZW50LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlTlMoZG9qby5zdmcueG1sbnMueGxpbmssICJocmVmIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmaWxsU3R5bGUgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoZmlsbCk7CisJCQl2YXIgb3BhY2l0eSA9IHJhd05vZGUuZ2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiKTsKKwkJCWlmIChvcGFjaXR5ICE9IG51bGwpIHsKKwkJCQlmaWxsU3R5bGUuYSA9IG9wYWNpdHk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZpbGxTdHlsZTsKK30sIF9nZXRHcmFkaWVudDpmdW5jdGlvbiAoZGVmYXVsdEdyYWRpZW50LCBncmFkaWVudCkgeworCXZhciBmaWxsU3R5bGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZGVmYXVsdEdyYWRpZW50LCB0cnVlKTsKKwlmaWxsU3R5bGUuY29sb3JzID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCBncmFkaWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7CisJCWZpbGxTdHlsZS5jb2xvcnMucHVzaCh7b2Zmc2V0OmdyYWRpZW50LmNoaWxkTm9kZXNbaV0uZ2V0QXR0cmlidXRlKCJvZmZzZXQiKSwgY29sb3I6bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGdyYWRpZW50LmNoaWxkTm9kZXNbaV0uZ2V0QXR0cmlidXRlKCJzdG9wLWNvbG9yIikpfSk7CisJfQorCXJldHVybiBmaWxsU3R5bGU7Cit9LCBhdHRhY2hTdHJva2U6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwlpZiAoIXJhd05vZGUpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgc3Ryb2tlID0gcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoInN0cm9rZSIpOworCWlmIChzdHJva2UgPT0gbnVsbCB8fCBzdHJva2UgPT0gIm5vbmUiKSB7CisJCXJldHVybiBudWxsOworCX0KKwl2YXIgc3Ryb2tlU3R5bGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFN0cm9rZSwgdHJ1ZSk7CisJdmFyIGNvbG9yID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKHN0cm9rZSk7CisJaWYgKGNvbG9yKSB7CisJCXN0cm9rZVN0eWxlLmNvbG9yID0gY29sb3I7CisJCXN0cm9rZVN0eWxlLmNvbG9yLmEgPSByYXdOb2RlLmdldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiKTsKKwkJc3Ryb2tlU3R5bGUud2lkdGggPSByYXdOb2RlLmdldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIik7CisJCXN0cm9rZVN0eWxlLmNhcCA9IHJhd05vZGUuZ2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWNhcCIpOworCQlzdHJva2VTdHlsZS5qb2luID0gcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIpOworCQlpZiAoc3Ryb2tlU3R5bGUuam9pbiA9PSAibWl0ZXIiKSB7CisJCQlzdHJva2VTdHlsZS5qb2luID0gcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoInN0cm9rZS1taXRlcmxpbWl0Iik7CisJCX0KKwl9CisJcmV0dXJuIHN0cm9rZVN0eWxlOworfSwgYXR0YWNoVHJhbnNmb3JtOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdmFyIG1hdHJpeCA9IG51bGw7CisJaWYgKHJhd05vZGUpIHsKKwkJbWF0cml4ID0gcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpOworCQlpZiAobWF0cml4Lm1hdGNoKC9ebWF0cml4XCguK1wpJC8pKSB7CisJCQl2YXIgdCA9IG1hdHJpeC5zbGljZSg3LCAtMSkuc3BsaXQoIiwiKTsKKwkJCW1hdHJpeCA9IGRvam8uZ2Z4Lm1hdHJpeC5ub3JtYWxpemUoe3h4OnBhcnNlRmxvYXQodFswXSksIHh5OnBhcnNlRmxvYXQodFsyXSksIHl4OnBhcnNlRmxvYXQodFsxXSksIHl5OnBhcnNlRmxvYXQodFszXSksIGR4OnBhcnNlRmxvYXQodFs0XSksIGR5OnBhcnNlRmxvYXQodFs1XSl9KTsKKwkJfQorCX0KKwlyZXR1cm4gbWF0cml4OworfSwgYXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgc2hhcGUgPSBudWxsOworCWlmIChyYXdOb2RlKSB7CisJCXNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KHRoaXMuc2hhcGUsIHRydWUpOworCQlmb3IgKHZhciBpIGluIHNoYXBlKSB7CisJCQlzaGFwZVtpXSA9IHJhd05vZGUuZ2V0QXR0cmlidXRlKGkpOworCQl9CisJfQorCXJldHVybiBzaGFwZTsKK30sIGF0dGFjaDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCWlmIChyYXdOb2RlKSB7CisJCXRoaXMucmF3Tm9kZSA9IHJhd05vZGU7CisJCXRoaXMuZmlsbFN0eWxlID0gdGhpcy5hdHRhY2hGaWxsKHJhd05vZGUpOworCQl0aGlzLnN0cm9rZVN0eWxlID0gdGhpcy5hdHRhY2hTdHJva2UocmF3Tm9kZSk7CisJCXRoaXMubWF0cml4ID0gdGhpcy5hdHRhY2hUcmFuc2Zvcm0ocmF3Tm9kZSk7CisJCXRoaXMuc2hhcGUgPSB0aGlzLmF0dGFjaFNoYXBlKHJhd05vZGUpOworCX0KK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguR3JvdXAiLCBkb2pvLmdmeC5TaGFwZSwge3NldFJhd05vZGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl0aGlzLnJhd05vZGUgPSByYXdOb2RlOworfX0pOworZG9qby5nZnguR3JvdXAubm9kZVR5cGUgPSAiZyI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LlJlY3QiLCBkb2pvLmdmeC5zaGFwZS5SZWN0LCB7YXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgc2hhcGUgPSBudWxsOworCWlmIChyYXdOb2RlKSB7CisJCXNoYXBlID0gZG9qby5nZnguUmVjdC5zdXBlcmNsYXNzLmF0dGFjaFNoYXBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCXNoYXBlLnIgPSBNYXRoLm1pbihyYXdOb2RlLmdldEF0dHJpYnV0ZSgicngiKSwgcmF3Tm9kZS5nZXRBdHRyaWJ1dGUoInJ5IikpOworCX0KKwlyZXR1cm4gc2hhcGU7Cit9LCBzZXRTaGFwZTpmdW5jdGlvbiAobmV3U2hhcGUpIHsKKwl0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwgbmV3U2hhcGUpOworCXRoaXMuYmJveCA9IG51bGw7CisJZm9yICh2YXIgaSBpbiB0aGlzLnNoYXBlKSB7CisJCWlmIChpICE9ICJ0eXBlIiAmJiBpICE9ICJyIikgeworCQkJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZShpLCB0aGlzLnNoYXBlW2ldKTsKKwkJfQorCX0KKwl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKCJyeCIsIHRoaXMuc2hhcGUucik7CisJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgicnkiLCB0aGlzLnNoYXBlLnIpOworCXJldHVybiB0aGlzOworfX0pOworZG9qby5nZnguUmVjdC5ub2RlVHlwZSA9ICJyZWN0IjsKK2Rvam8uZ2Z4LkVsbGlwc2UgPSBkb2pvLmdmeC5zaGFwZS5FbGxpcHNlOworZG9qby5nZnguRWxsaXBzZS5ub2RlVHlwZSA9ICJlbGxpcHNlIjsKK2Rvam8uZ2Z4LkNpcmNsZSA9IGRvam8uZ2Z4LnNoYXBlLkNpcmNsZTsKK2Rvam8uZ2Z4LkNpcmNsZS5ub2RlVHlwZSA9ICJjaXJjbGUiOworZG9qby5nZnguTGluZSA9IGRvam8uZ2Z4LnNoYXBlLkxpbmU7Citkb2pvLmdmeC5MaW5lLm5vZGVUeXBlID0gImxpbmUiOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5Qb2x5bGluZSIsIGRvam8uZ2Z4LnNoYXBlLlBvbHlsaW5lLCB7c2V0U2hhcGU6ZnVuY3Rpb24gKHBvaW50cykgeworCWlmIChwb2ludHMgJiYgcG9pbnRzIGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJdGhpcy5zaGFwZSA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKHRoaXMuc2hhcGUsIHtwb2ludHM6cG9pbnRzfSk7CisJCWlmIChjbG9zZWQgJiYgdGhpcy5zaGFwZS5wb2ludHMubGVuZ3RoKSB7CisJCQl0aGlzLnNoYXBlLnBvaW50cy5wdXNoKHRoaXMuc2hhcGUucG9pbnRzWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuc2hhcGUgPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyh0aGlzLnNoYXBlLCBwb2ludHMpOworCX0KKwl0aGlzLmJveCA9IG51bGw7CisJdmFyIGF0dHIgPSBbXTsKKwl2YXIgcCA9IHRoaXMuc2hhcGUucG9pbnRzOworCWZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSkgeworCQlhdHRyLnB1c2gocFtpXS54LnRvRml4ZWQoOCkpOworCQlhdHRyLnB1c2gocFtpXS55LnRvRml4ZWQoOCkpOworCX0KKwl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKCJwb2ludHMiLCBhdHRyLmpvaW4oIiAiKSk7CisJcmV0dXJuIHRoaXM7Cit9fSk7Citkb2pvLmdmeC5Qb2x5bGluZS5ub2RlVHlwZSA9ICJwb2x5bGluZSI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LkltYWdlIiwgZG9qby5nZnguc2hhcGUuSW1hZ2UsIHtzZXRTaGFwZTpmdW5jdGlvbiAobmV3U2hhcGUpIHsKKwl0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwgbmV3U2hhcGUpOworCXRoaXMuYmJveCA9IG51bGw7CisJdmFyIHJhd05vZGUgPSB0aGlzLnJhd05vZGU7CisJZm9yICh2YXIgaSBpbiB0aGlzLnNoYXBlKSB7CisJCWlmIChpICE9ICJ0eXBlIiAmJiBpICE9ICJzcmMiKSB7CisJCQlyYXdOb2RlLnNldEF0dHJpYnV0ZShpLCB0aGlzLnNoYXBlW2ldKTsKKwkJfQorCX0KKwlyYXdOb2RlLnNldEF0dHJpYnV0ZU5TKGRvam8uc3ZnLnhtbG5zLnhsaW5rLCAiaHJlZiIsIHRoaXMuc2hhcGUuc3JjKTsKKwlyZXR1cm4gdGhpczsKK30sIHNldFN0cm9rZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXM7Cit9LCBzZXRGaWxsOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpczsKK30sIGF0dGFjaFN0cm9rZTpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXJldHVybiBudWxsOworfSwgYXR0YWNoRmlsbDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXJldHVybiBudWxsOworfX0pOworZG9qby5nZnguSW1hZ2Uubm9kZVR5cGUgPSAiaW1hZ2UiOworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5QYXRoIiwgZG9qby5nZngucGF0aC5QYXRoLCB7X3VwZGF0ZVdpdGhTZWdtZW50OmZ1bmN0aW9uIChzZWdtZW50KSB7CisJZG9qby5nZnguUGF0aC5zdXBlcmNsYXNzLl91cGRhdGVXaXRoU2VnbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICh0eXBlb2YgKHRoaXMuc2hhcGUucGF0aCkgPT0gInN0cmluZyIpIHsKKwkJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiZCIsIHRoaXMuc2hhcGUucGF0aCk7CisJfQorfSwgc2V0U2hhcGU6ZnVuY3Rpb24gKG5ld1NoYXBlKSB7CisJZG9qby5nZnguUGF0aC5zdXBlcmNsYXNzLnNldFNoYXBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiZCIsIHRoaXMuc2hhcGUucGF0aCk7CisJcmV0dXJuIHRoaXM7Cit9fSk7Citkb2pvLmdmeC5QYXRoLm5vZGVUeXBlID0gInBhdGgiOworZG9qby5nZnguX2NyZWF0b3JzID0ge2NyZWF0ZVBhdGg6ZnVuY3Rpb24gKHBhdGgpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguUGF0aCwgcGF0aCk7Cit9LCBjcmVhdGVSZWN0OmZ1bmN0aW9uIChyZWN0KSB7CisJcmV0dXJuIHRoaXMuY3JlYXRlT2JqZWN0KGRvam8uZ2Z4LlJlY3QsIHJlY3QpOworfSwgY3JlYXRlQ2lyY2xlOmZ1bmN0aW9uIChjaXJjbGUpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguQ2lyY2xlLCBjaXJjbGUpOworfSwgY3JlYXRlRWxsaXBzZTpmdW5jdGlvbiAoZWxsaXBzZSkgeworCXJldHVybiB0aGlzLmNyZWF0ZU9iamVjdChkb2pvLmdmeC5FbGxpcHNlLCBlbGxpcHNlKTsKK30sIGNyZWF0ZUxpbmU6ZnVuY3Rpb24gKGxpbmUpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguTGluZSwgbGluZSk7Cit9LCBjcmVhdGVQb2x5bGluZTpmdW5jdGlvbiAocG9pbnRzKSB7CisJcmV0dXJuIHRoaXMuY3JlYXRlT2JqZWN0KGRvam8uZ2Z4LlBvbHlsaW5lLCBwb2ludHMpOworfSwgY3JlYXRlSW1hZ2U6ZnVuY3Rpb24gKGltYWdlKSB7CisJcmV0dXJuIHRoaXMuY3JlYXRlT2JqZWN0KGRvam8uZ2Z4LkltYWdlLCBpbWFnZSk7Cit9LCBjcmVhdGVHcm91cDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuY3JlYXRlT2JqZWN0KGRvam8uZ2Z4Lkdyb3VwKTsKK30sIGNyZWF0ZU9iamVjdDpmdW5jdGlvbiAoc2hhcGVUeXBlLCByYXdTaGFwZSkgeworCWlmICghdGhpcy5yYXdOb2RlKSB7CisJCXJldHVybiBudWxsOworCX0KKwl2YXIgc2hhcGUgPSBuZXcgc2hhcGVUeXBlKCk7CisJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCBzaGFwZVR5cGUubm9kZVR5cGUpOworCXNoYXBlLnNldFJhd05vZGUobm9kZSk7CisJdGhpcy5yYXdOb2RlLmFwcGVuZENoaWxkKG5vZGUpOworCXNoYXBlLnNldFNoYXBlKHJhd1NoYXBlKTsKKwl0aGlzLmFkZChzaGFwZSk7CisJcmV0dXJuIHNoYXBlOworfSwgYWRkOmZ1bmN0aW9uIChzaGFwZSkgeworCXZhciBvbGRQYXJlbnQgPSBzaGFwZS5nZXRQYXJlbnQoKTsKKwlpZiAob2xkUGFyZW50KSB7CisJCW9sZFBhcmVudC5yZW1vdmUoc2hhcGUsIHRydWUpOworCX0KKwlzaGFwZS5fc2V0UGFyZW50KHRoaXMsIG51bGwpOworCXRoaXMucmF3Tm9kZS5hcHBlbmRDaGlsZChzaGFwZS5yYXdOb2RlKTsKKwlyZXR1cm4gdGhpczsKK30sIHJlbW92ZTpmdW5jdGlvbiAoc2hhcGUsIHNpbGVudGx5KSB7CisJaWYgKHRoaXMucmF3Tm9kZSA9PSBzaGFwZS5yYXdOb2RlLnBhcmVudE5vZGUpIHsKKwkJdGhpcy5yYXdOb2RlLnJlbW92ZUNoaWxkKHNoYXBlLnJhd05vZGUpOworCX0KKwlzaGFwZS5fc2V0UGFyZW50KG51bGwsIG51bGwpOworCXJldHVybiB0aGlzOworfX07Citkb2pvLmdmeC5hdHRhY2hOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciBzID0gbnVsbDsKKwlzd2l0Y2ggKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJICBjYXNlIGRvam8uZ2Z4LlJlY3Qubm9kZVR5cGU6CisJCXMgPSBuZXcgZG9qby5nZnguUmVjdCgpOworCQlicmVhazsKKwkgIGNhc2UgZG9qby5nZnguRWxsaXBzZS5ub2RlVHlwZToKKwkJcyA9IG5ldyBkb2pvLmdmeC5FbGxpcHNlKCk7CisJCWJyZWFrOworCSAgY2FzZSBkb2pvLmdmeC5Qb2x5bGluZS5ub2RlVHlwZToKKwkJcyA9IG5ldyBkb2pvLmdmeC5Qb2x5bGluZSgpOworCQlicmVhazsKKwkgIGNhc2UgZG9qby5nZnguUGF0aC5ub2RlVHlwZToKKwkJcyA9IG5ldyBkb2pvLmdmeC5QYXRoKCk7CisJCWJyZWFrOworCSAgY2FzZSBkb2pvLmdmeC5DaXJjbGUubm9kZVR5cGU6CisJCXMgPSBuZXcgZG9qby5nZnguQ2lyY2xlKCk7CisJCWJyZWFrOworCSAgY2FzZSBkb2pvLmdmeC5MaW5lLm5vZGVUeXBlOgorCQlzID0gbmV3IGRvam8uZ2Z4LkxpbmUoKTsKKwkJYnJlYWs7CisJICBjYXNlIGRvam8uZ2Z4LkltYWdlLm5vZGVUeXBlOgorCQlzID0gbmV3IGRvam8uZ2Z4LkltYWdlKCk7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJZG9qby5kZWJ1ZygiRkFUQUwgRVJST1IhIHRhZ05hbWUgPSAiICsgbm9kZS50YWdOYW1lKTsKKwl9CisJcy5hdHRhY2gobm9kZSk7CisJcmV0dXJuIHM7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmdmeC5TdXJmYWNlLCB7c2V0RGltZW5zaW9uczpmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgeworCWlmICghdGhpcy5yYXdOb2RlKSB7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKKwl0aGlzLnJhd05vZGUuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQpOworCXJldHVybiB0aGlzOworfSwgZ2V0RGltZW5zaW9uczpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucmF3Tm9kZSA/IHt3aWR0aDp0aGlzLnJhd05vZGUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLCBoZWlnaHQ6dGhpcy5yYXdOb2RlLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iil9IDogbnVsbDsKK319KTsKK2Rvam8uZ2Z4LmNyZWF0ZVN1cmZhY2UgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgd2lkdGgsIGhlaWdodCkgeworCXZhciBzID0gbmV3IGRvam8uZ2Z4LlN1cmZhY2UoKTsKKwlzLnJhd05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAic3ZnIik7CisJcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCk7CisJcy5yYXdOb2RlLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgaGVpZ2h0KTsKKwl2YXIgZGVmcyA9IG5ldyBkb2pvLmdmeC5zdmcuRGVmaW5lcygpOworCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgZG9qby5nZnguc3ZnLkRlZmluZXMubm9kZVR5cGUpOworCWRlZnMuc2V0UmF3Tm9kZShub2RlKTsKKwlzLnJhd05vZGUuYXBwZW5kQ2hpbGQobm9kZSk7CisJZG9qby5ieUlkKHBhcmVudE5vZGUpLmFwcGVuZENoaWxkKHMucmF3Tm9kZSk7CisJcmV0dXJuIHM7Cit9OworZG9qby5nZnguYXR0YWNoU3VyZmFjZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJdmFyIHMgPSBuZXcgZG9qby5nZnguU3VyZmFjZSgpOworCXMucmF3Tm9kZSA9IG5vZGU7CisJcmV0dXJuIHM7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmdmeC5Hcm91cCwgZG9qby5nZnguX2NyZWF0b3JzKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5nZnguU3VyZmFjZSwgZG9qby5nZnguX2NyZWF0b3JzKTsKK2RlbGV0ZSBkb2pvLmdmeC5fY3JlYXRvcnM7Citkb2pvLmdmeC5zdmcuRGVmaW5lcyA9IGZ1bmN0aW9uICgpIHsKKwl0aGlzLnJhd05vZGUgPSBudWxsOworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5nZnguc3ZnLkRlZmluZXMsIHtzZXRSYXdOb2RlOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdGhpcy5yYXdOb2RlID0gcmF3Tm9kZTsKK319KTsKK2Rvam8uZ2Z4LnN2Zy5EZWZpbmVzLm5vZGVUeXBlID0gImRlZnMiOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L3ZtbC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9nZngvdm1sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjIzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ2Z4L3ZtbC5qcwpAQCAtMCwwICsxLDEwMTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZ2Z4LnZtbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmRlY2xhcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZy4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5tZXRyaWNzIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbG9yIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5zaGFwZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5wYXRoIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5nZngudm1sIik7Citkb2pvLmdmeC52bWwueG1sbnMgPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiOworZG9qby5nZngudm1sLl9wYXJzZUZsb2F0ID0gZnVuY3Rpb24gKHN0cikgeworCXJldHVybiBzdHIubWF0Y2goL15cZCtmJC9pKSA/IHBhcnNlSW50KHN0cikgLyA2NTUzNiA6IHBhcnNlRmxvYXQoc3RyKTsKK307Citkb2pvLmdmeC52bWwuY21faW5fcHQgPSA3MiAvIDIuNTQ7Citkb2pvLmdmeC52bWwubW1faW5fcHQgPSA3LjIgLyAyLjU0OworZG9qby5nZngudm1sLnB4X2luX3B0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuZ2V0Q2FjaGVkRm9udE1lYXN1cmVtZW50cygpWyIxMnB0Il0gLyAxMjsKK307Citkb2pvLmdmeC52bWwucHQycHggPSBmdW5jdGlvbiAobGVuKSB7CisJcmV0dXJuIGxlbiAqIHRoaXMucHhfaW5fcHQoKTsKK307Citkb2pvLmdmeC52bWwucHgycHQgPSBmdW5jdGlvbiAobGVuKSB7CisJcmV0dXJuIGxlbiAvIHRoaXMucHhfaW5fcHQoKTsKK307Citkb2pvLmdmeC52bWwubm9ybWFsaXplZExlbmd0aCA9IGZ1bmN0aW9uIChsZW4pIHsKKwlpZiAobGVuLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAobGVuLmxlbmd0aCA+IDIpIHsKKwkJdmFyIHB4X2luX3B0ID0gdGhpcy5weF9pbl9wdCgpOworCQl2YXIgdmFsID0gcGFyc2VGbG9hdChsZW4pOworCQlzd2l0Y2ggKGxlbi5zbGljZSgtMikpIHsKKwkJICBjYXNlICJweCI6CisJCQlyZXR1cm4gdmFsOworCQkgIGNhc2UgInB0IjoKKwkJCXJldHVybiB2YWwgKiBweF9pbl9wdDsKKwkJICBjYXNlICJpbiI6CisJCQlyZXR1cm4gdmFsICogNzIgKiBweF9pbl9wdDsKKwkJICBjYXNlICJwYyI6CisJCQlyZXR1cm4gdmFsICogMTIgKiBweF9pbl9wdDsKKwkJICBjYXNlICJtbSI6CisJCQlyZXR1cm4gdmFsIC8gdGhpcy5tbV9pbl9wdCAqIHB4X2luX3B0OworCQkgIGNhc2UgImNtIjoKKwkJCXJldHVybiB2YWwgLyB0aGlzLmNtX2luX3B0ICogcHhfaW5fcHQ7CisJCX0KKwl9CisJcmV0dXJuIHBhcnNlRmxvYXQobGVuKTsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZ2Z4LlNoYXBlLCB7c2V0RmlsbDpmdW5jdGlvbiAoZmlsbCkgeworCWlmICghZmlsbCkgeworCQl0aGlzLmZpbGxTdHlsZSA9IG51bGw7CisJCXRoaXMucmF3Tm9kZS5maWxsZWQgPSBmYWxzZTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCWlmICh0eXBlb2YgKGZpbGwpID09ICJvYmplY3QiICYmICJ0eXBlIiBpbiBmaWxsKSB7CisJCXN3aXRjaCAoZmlsbC50eXBlKSB7CisJCSAgY2FzZSAibGluZWFyIjoKKwkJCXZhciBmID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnMoZG9qby5nZnguZGVmYXVsdExpbmVhckdyYWRpZW50LCBmaWxsKTsKKwkJCXRoaXMuZmlsbFN0eWxlID0gZjsKKwkJCXZhciBzID0gIiI7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGYuY29sb3JzLmxlbmd0aDsgKytpKSB7CisJCQkJZi5jb2xvcnNbaV0uY29sb3IgPSBkb2pvLmdmeC5ub3JtYWxpemVDb2xvcihmLmNvbG9yc1tpXS5jb2xvcik7CisJCQkJcyArPSBmLmNvbG9yc1tpXS5vZmZzZXQudG9GaXhlZCg4KSArICIgIiArIGYuY29sb3JzW2ldLmNvbG9yLnRvSGV4KCkgKyAiOyI7CisJCQl9CisJCQl2YXIgZm8gPSB0aGlzLnJhd05vZGUuZmlsbDsKKwkJCWZvLmNvbG9ycy52YWx1ZSA9IHM7CisJCQlmby5tZXRob2QgPSAic2lnbWEiOworCQkJZm8udHlwZSA9ICJncmFkaWVudCI7CisJCQlmby5hbmdsZSA9IChkb2pvLm1hdGgucmFkVG9EZWcoTWF0aC5hdGFuMihmLngyIC0gZi54MSwgZi55MiAtIGYueTEpKSArIDE4MCkgJSAzNjA7CisJCQlmby5vbiA9IHRydWU7CisJCQlicmVhazsKKwkJICBjYXNlICJyYWRpYWwiOgorCQkJdmFyIGYgPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyhkb2pvLmdmeC5kZWZhdWx0UmFkaWFsR3JhZGllbnQsIGZpbGwpOworCQkJdGhpcy5maWxsU3R5bGUgPSBmOworCQkJdmFyIHcgPSBwYXJzZUZsb2F0KHRoaXMucmF3Tm9kZS5zdHlsZS53aWR0aCk7CisJCQl2YXIgaCA9IHBhcnNlRmxvYXQodGhpcy5yYXdOb2RlLnN0eWxlLmhlaWdodCk7CisJCQl2YXIgYyA9IGlzTmFOKHcpID8gMSA6IDIgKiBmLnIgLyB3OworCQkJdmFyIGkgPSBmLmNvbG9ycy5sZW5ndGggLSAxOworCQkJZi5jb2xvcnNbaV0uY29sb3IgPSBkb2pvLmdmeC5ub3JtYWxpemVDb2xvcihmLmNvbG9yc1tpXS5jb2xvcik7CisJCQl2YXIgcyA9ICIwICIgKyBmLmNvbG9yc1tpXS5jb2xvci50b0hleCgpOworCQkJZm9yICg7IGkgPj0gMDsgLS1pKSB7CisJCQkJZi5jb2xvcnNbaV0uY29sb3IgPSBkb2pvLmdmeC5ub3JtYWxpemVDb2xvcihmLmNvbG9yc1tpXS5jb2xvcik7CisJCQkJcyArPSAoMSAtIGMgKiBmLmNvbG9yc1tpXS5vZmZzZXQpLnRvRml4ZWQoOCkgKyAiICIgKyBmLmNvbG9yc1tpXS5jb2xvci50b0hleCgpICsgIjsiOworCQkJfQorCQkJdmFyIGZvID0gdGhpcy5yYXdOb2RlLmZpbGw7CisJCQlmby5jb2xvcnMudmFsdWUgPSBzOworCQkJZm8ubWV0aG9kID0gInNpZ21hIjsKKwkJCWZvLnR5cGUgPSAiZ3JhZGllbnRyYWRpYWwiOworCQkJaWYgKGlzTmFOKHcpIHx8IGlzTmFOKGgpKSB7CisJCQkJZm8uZm9jdXNwb3NpdGlvbiA9ICIwLjUgMC41IjsKKwkJCX0gZWxzZSB7CisJCQkJZm8uZm9jdXNwb3NpdGlvbiA9IChmLmN4IC8gdykudG9GaXhlZCg4KSArICIgIiArIChmLmN5IC8gaCkudG9GaXhlZCg4KTsKKwkJCX0KKwkJCWZvLmZvY3Vzc2l6ZSA9ICIwIDAiOworCQkJZm8ub24gPSB0cnVlOworCQkJYnJlYWs7CisJCSAgY2FzZSAicGF0dGVybiI6CisJCQl2YXIgZiA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRQYXR0ZXJuLCBmaWxsKTsKKwkJCXRoaXMuZmlsbFN0eWxlID0gZjsKKwkJCXZhciBmbyA9IHRoaXMucmF3Tm9kZS5maWxsOworCQkJZm8udHlwZSA9ICJ0aWxlIjsKKwkJCWZvLnNyYyA9IGYuc3JjOworCQkJaWYgKGYud2lkdGggJiYgZi5oZWlnaHQpIHsKKwkJCQlmby5zaXplLnggPSBkb2pvLmdmeC52bWwucHgycHQoZi53aWR0aCk7CisJCQkJZm8uc2l6ZS55ID0gZG9qby5nZngudm1sLnB4MnB0KGYuaGVpZ2h0KTsKKwkJCX0KKwkJCWZvLmFsaWduU2hhcGUgPSBmYWxzZTsKKwkJCWZvLnBvc2l0aW9uLnggPSAwOworCQkJZm8ucG9zaXRpb24ueSA9IDA7CisJCQlmby5vcmlnaW4ueCA9IGYud2lkdGggPyBmLnggLyBmLndpZHRoIDogMDsKKwkJCWZvLm9yaWdpbi55ID0gZi5oZWlnaHQgPyBmLnkgLyBmLmhlaWdodCA6IDA7CisJCQlmby5vbiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQl0aGlzLnJhd05vZGUuZmlsbC5vcGFjaXR5ID0gMTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXRoaXMuZmlsbFN0eWxlID0gZG9qby5nZngubm9ybWFsaXplQ29sb3IoZmlsbCk7CisJdGhpcy5yYXdOb2RlLmZpbGxjb2xvciA9IHRoaXMuZmlsbFN0eWxlLnRvSGV4KCk7CisJdGhpcy5yYXdOb2RlLmZpbGwub3BhY2l0eSA9IHRoaXMuZmlsbFN0eWxlLmE7CisJdGhpcy5yYXdOb2RlLmZpbGxlZCA9IHRydWU7CisJcmV0dXJuIHRoaXM7Cit9LCBzZXRTdHJva2U6ZnVuY3Rpb24gKHN0cm9rZSkgeworCWlmICghc3Ryb2tlKSB7CisJCXRoaXMuc3Ryb2tlU3R5bGUgPSBudWxsOworCQl0aGlzLnJhd05vZGUuc3Ryb2tlZCA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsKKwl9CisJdGhpcy5zdHJva2VTdHlsZSA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRTdHJva2UsIHN0cm9rZSk7CisJdGhpcy5zdHJva2VTdHlsZS5jb2xvciA9IGRvam8uZ2Z4Lm5vcm1hbGl6ZUNvbG9yKHRoaXMuc3Ryb2tlU3R5bGUuY29sb3IpOworCXZhciBzID0gdGhpcy5zdHJva2VTdHlsZTsKKwl0aGlzLnJhd05vZGUuc3Ryb2tlZCA9IHRydWU7CisJdGhpcy5yYXdOb2RlLnN0cm9rZWNvbG9yID0gcy5jb2xvci50b0NzcygpOworCXRoaXMucmF3Tm9kZS5zdHJva2V3ZWlnaHQgPSBzLndpZHRoICsgInB4IjsKKwlpZiAodGhpcy5yYXdOb2RlLnN0cm9rZSkgeworCQl0aGlzLnJhd05vZGUuc3Ryb2tlLm9wYWNpdHkgPSBzLmNvbG9yLmE7CisJCXRoaXMucmF3Tm9kZS5zdHJva2UuZW5kY2FwID0gdGhpcy5fdHJhbnNsYXRlKHRoaXMuX2NhcE1hcCwgcy5jYXApOworCQlpZiAodHlwZW9mIChzLmpvaW4pID09ICJudW1iZXIiKSB7CisJCQl0aGlzLnJhd05vZGUuc3Ryb2tlLmpvaW5zdHlsZSA9ICJtaXRlciI7CisJCQl0aGlzLnJhd05vZGUuc3Ryb2tlLm1pdGVybGltaXQgPSBzLmpvaW47CisJCX0gZWxzZSB7CisJCQl0aGlzLnJhd05vZGUuc3Ryb2tlLmpvaW5zdHlsZSA9IHMuam9pbjsKKwkJfQorCX0KKwlyZXR1cm4gdGhpczsKK30sIF9jYXBNYXA6e2J1dHQ6ImZsYXQifSwgX2NhcE1hcFJldmVyc2VkOntmbGF0OiJidXR0In0sIF90cmFuc2xhdGU6ZnVuY3Rpb24gKGRpY3QsIHZhbHVlKSB7CisJcmV0dXJuICh2YWx1ZSBpbiBkaWN0KSA/IGRpY3RbdmFsdWVdIDogdmFsdWU7Cit9LCBfYXBwbHlUcmFuc2Zvcm06ZnVuY3Rpb24gKCkgeworCXZhciBtYXRyaXggPSB0aGlzLl9nZXRSZWFsTWF0cml4KCk7CisJaWYgKCFtYXRyaXgpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXZhciBza2V3ID0gdGhpcy5yYXdOb2RlLnNrZXc7CisJaWYgKHR5cGVvZiAoc2tldykgPT0gInVuZGVmaW5lZCIpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhd05vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkgeworCQkJaWYgKHRoaXMucmF3Tm9kZS5jaGlsZE5vZGVzW2ldLnRhZ05hbWUgPT0gInNrZXciKSB7CisJCQkJc2tldyA9IHRoaXMucmF3Tm9kZS5jaGlsZE5vZGVzW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChza2V3KSB7CisJCXNrZXcub24gPSBmYWxzZTsKKwkJdmFyIG10ID0gbWF0cml4Lnh4LnRvRml4ZWQoOCkgKyAiICIgKyBtYXRyaXgueHkudG9GaXhlZCg4KSArICIgIiArIG1hdHJpeC55eC50b0ZpeGVkKDgpICsgIiAiICsgbWF0cml4Lnl5LnRvRml4ZWQoOCkgKyAiIDAgMCI7CisJCXZhciBvZmZzZXQgPSBNYXRoLmZsb29yKG1hdHJpeC5keCkudG9GaXhlZCgpICsgInB4ICIgKyBNYXRoLmZsb29yKG1hdHJpeC5keSkudG9GaXhlZCgpICsgInB4IjsKKwkJdmFyIGwgPSBwYXJzZUZsb2F0KHRoaXMucmF3Tm9kZS5zdHlsZS5sZWZ0KTsKKwkJdmFyIHQgPSBwYXJzZUZsb2F0KHRoaXMucmF3Tm9kZS5zdHlsZS50b3ApOworCQl2YXIgdyA9IHBhcnNlRmxvYXQodGhpcy5yYXdOb2RlLnN0eWxlLndpZHRoKTsKKwkJdmFyIGggPSBwYXJzZUZsb2F0KHRoaXMucmF3Tm9kZS5zdHlsZS5oZWlnaHQpOworCQlpZiAoaXNOYU4obCkpIHsKKwkJCWwgPSAwOworCQl9CisJCWlmIChpc05hTih0KSkgeworCQkJdCA9IDA7CisJCX0KKwkJaWYgKGlzTmFOKHcpKSB7CisJCQl3ID0gMTsKKwkJfQorCQlpZiAoaXNOYU4oaCkpIHsKKwkJCWggPSAxOworCQl9CisJCXZhciBvcmlnaW4gPSAoLWwgLyB3IC0gMC41KS50b0ZpeGVkKDgpICsgIiAiICsgKC10IC8gaCAtIDAuNSkudG9GaXhlZCg4KTsKKwkJc2tldy5tYXRyaXggPSBtdDsKKwkJc2tldy5vcmlnaW4gPSBvcmlnaW47CisJCXNrZXcub2Zmc2V0ID0gb2Zmc2V0OworCQlza2V3Lm9uID0gdHJ1ZTsKKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBzZXRSYXdOb2RlOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJcmF3Tm9kZS5zdHJva2VkID0gZmFsc2U7CisJcmF3Tm9kZS5maWxsZWQgPSBmYWxzZTsKKwl0aGlzLnJhd05vZGUgPSByYXdOb2RlOworfSwgYXR0YWNoRmlsbDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXZhciBmaWxsU3R5bGUgPSBudWxsOworCXZhciBmbyA9IHJhd05vZGUuZmlsbDsKKwlpZiAocmF3Tm9kZSkgeworCQlpZiAoZm8ub24gJiYgZm8udHlwZSA9PSAiZ3JhZGllbnQiKSB7CisJCQl2YXIgZmlsbFN0eWxlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRMaW5lYXJHcmFkaWVudCwgdHJ1ZSk7CisJCQl2YXIgcmFkID0gZG9qby5tYXRoLmRlZ1RvUmFkKGZvLmFuZ2xlKTsKKwkJCWZpbGxTdHlsZS54MiA9IE1hdGguY29zKHJhZCk7CisJCQlmaWxsU3R5bGUueTIgPSBNYXRoLnNpbihyYWQpOworCQkJZmlsbFN0eWxlLmNvbG9ycyA9IFtdOworCQkJdmFyIHN0b3BzID0gZm8uY29sb3JzLnZhbHVlLnNwbGl0KCI7Iik7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0b3BzLmxlbmd0aDsgKytpKSB7CisJCQkJdmFyIHQgPSBzdG9wc1tpXS5tYXRjaCgvXFMrL2cpOworCQkJCWlmICghdCB8fCB0Lmxlbmd0aCAhPSAyKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlmaWxsU3R5bGUuY29sb3JzLnB1c2goe29mZnNldDpkb2pvLmdmeC52bWwuX3BhcnNlRmxvYXQodFswXSksIGNvbG9yOm5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcih0WzFdKX0pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZvLm9uICYmIGZvLnR5cGUgPT0gImdyYWRpZW50cmFkaWFsIikgeworCQkJCXZhciBmaWxsU3R5bGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFJhZGlhbEdyYWRpZW50LCB0cnVlKTsKKwkJCQl2YXIgdyA9IHBhcnNlRmxvYXQocmF3Tm9kZS5zdHlsZS53aWR0aCk7CisJCQkJdmFyIGggPSBwYXJzZUZsb2F0KHJhd05vZGUuc3R5bGUuaGVpZ2h0KTsKKwkJCQlmaWxsU3R5bGUuY3ggPSBpc05hTih3KSA/IDAgOiBmby5mb2N1c3Bvc2l0aW9uLnggKiB3OworCQkJCWZpbGxTdHlsZS5jeSA9IGlzTmFOKGgpID8gMCA6IGZvLmZvY3VzcG9zaXRpb24ueSAqIGg7CisJCQkJZmlsbFN0eWxlLnIgPSBpc05hTih3KSA/IDEgOiB3IC8gMjsKKwkJCQlmaWxsU3R5bGUuY29sb3JzID0gW107CisJCQkJdmFyIHN0b3BzID0gZm8uY29sb3JzLnZhbHVlLnNwbGl0KCI7Iik7CisJCQkJZm9yICh2YXIgaSA9IHN0b3BzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCQkJCXZhciB0ID0gc3RvcHNbaV0ubWF0Y2goL1xTKy9nKTsKKwkJCQkJaWYgKCF0IHx8IHQubGVuZ3RoICE9IDIpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWZpbGxTdHlsZS5jb2xvcnMucHVzaCh7b2Zmc2V0OmRvam8uZ2Z4LnZtbC5fcGFyc2VGbG9hdCh0WzBdKSwgY29sb3I6bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKHRbMV0pfSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZm8ub24gJiYgZm8udHlwZSA9PSAidGlsZSIpIHsKKwkJCQkJdmFyIGZpbGxTdHlsZSA9IGRvam8ubGFuZy5zaGFsbG93Q29weShkb2pvLmdmeC5kZWZhdWx0UGF0dGVybiwgdHJ1ZSk7CisJCQkJCWZpbGxTdHlsZS53aWR0aCA9IGRvam8uZ2Z4LnZtbC5wdDJweChmby5zaXplLngpOworCQkJCQlmaWxsU3R5bGUuaGVpZ2h0ID0gZG9qby5nZngudm1sLnB0MnB4KGZvLnNpemUueSk7CisJCQkJCWZpbGxTdHlsZS54ID0gZm8ub3JpZ2luLnggKiBmaWxsU3R5bGUud2lkdGg7CisJCQkJCWZpbGxTdHlsZS55ID0gZm8ub3JpZ2luLnkgKiBmaWxsU3R5bGUuaGVpZ2h0OworCQkJCQlmaWxsU3R5bGUuc3JjID0gZm8uc3JjOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChmby5vbiAmJiByYXdOb2RlLmZpbGxjb2xvcikgeworCQkJCQkJZmlsbFN0eWxlID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKHJhd05vZGUuZmlsbGNvbG9yICsgIiIpOworCQkJCQkJZmlsbFN0eWxlLmEgPSBmby5vcGFjaXR5OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBmaWxsU3R5bGU7Cit9LCBhdHRhY2hTdHJva2U6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgc3Ryb2tlU3R5bGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFN0cm9rZSwgdHJ1ZSk7CisJaWYgKHJhd05vZGUgJiYgcmF3Tm9kZS5zdHJva2VkKSB7CisJCXN0cm9rZVN0eWxlLmNvbG9yID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKHJhd05vZGUuc3Ryb2tlY29sb3IudmFsdWUpOworCQlkb2pvLmRlYnVnKCJXZSBhcmUgZXhwZWN0aW5nIGFuIC43NXB0IGhlcmUsIGluc3RlYWQgb2Ygc3Ryb2tld2VpZ2h0ID0gIiArIHJhd05vZGUuc3Ryb2tld2VpZ2h0KTsKKwkJc3Ryb2tlU3R5bGUud2lkdGggPSBkb2pvLmdmeC52bWwubm9ybWFsaXplZExlbmd0aChyYXdOb2RlLnN0cm9rZXdlaWdodCArICIiKTsKKwkJc3Ryb2tlU3R5bGUuY29sb3IuYSA9IHJhd05vZGUuc3Ryb2tlLm9wYWNpdHk7CisJCXN0cm9rZVN0eWxlLmNhcCA9IHRoaXMuX3RyYW5zbGF0ZSh0aGlzLl9jYXBNYXBSZXZlcnNlZCwgcmF3Tm9kZS5zdHJva2UuZW5kY2FwKTsKKwkJc3Ryb2tlU3R5bGUuam9pbiA9IHJhd05vZGUuc3Ryb2tlLmpvaW5zdHlsZSA9PSAibWl0ZXIiID8gcmF3Tm9kZS5zdHJva2UubWl0ZXJsaW1pdCA6IHJhd05vZGUuc3Ryb2tlLmpvaW5zdHlsZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIHN0cm9rZVN0eWxlOworfSwgYXR0YWNoVHJhbnNmb3JtOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdmFyIG1hdHJpeCA9IHt9OworCWlmIChyYXdOb2RlKSB7CisJCXZhciBzID0gcmF3Tm9kZS5za2V3OworCQltYXRyaXgueHggPSBzLm1hdHJpeC54dG94OworCQltYXRyaXgueHkgPSBzLm1hdHJpeC55dG94OworCQltYXRyaXgueXggPSBzLm1hdHJpeC54dG95OworCQltYXRyaXgueXkgPSBzLm1hdHJpeC55dG95OworCQltYXRyaXguZHggPSBkb2pvLmdmeC52bWwucHQycHgocy5vZmZzZXQueCk7CisJCW1hdHJpeC5keSA9IGRvam8uZ2Z4LnZtbC5wdDJweChzLm9mZnNldC55KTsKKwl9CisJcmV0dXJuIGRvam8uZ2Z4Lm1hdHJpeC5ub3JtYWxpemUobWF0cml4KTsKK30sIGF0dGFjaDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCWlmIChyYXdOb2RlKSB7CisJCXRoaXMucmF3Tm9kZSA9IHJhd05vZGU7CisJCXRoaXMuc2hhcGUgPSB0aGlzLmF0dGFjaFNoYXBlKHJhd05vZGUpOworCQl0aGlzLmZpbGxTdHlsZSA9IHRoaXMuYXR0YWNoRmlsbChyYXdOb2RlKTsKKwkJdGhpcy5zdHJva2VTdHlsZSA9IHRoaXMuYXR0YWNoU3Ryb2tlKHJhd05vZGUpOworCQl0aGlzLm1hdHJpeCA9IHRoaXMuYXR0YWNoVHJhbnNmb3JtKHJhd05vZGUpOworCX0KK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguR3JvdXAiLCBkb2pvLmdmeC5zaGFwZS5WaXJ0dWFsR3JvdXAsIHthZGQ6ZnVuY3Rpb24gKHNoYXBlKSB7CisJaWYgKHRoaXMgIT0gc2hhcGUuZ2V0UGFyZW50KCkpIHsKKwkJdGhpcy5yYXdOb2RlLmFwcGVuZENoaWxkKHNoYXBlLnJhd05vZGUpOworCQlkb2pvLmdmeC5Hcm91cC5zdXBlcmNsYXNzLmFkZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwlyZXR1cm4gdGhpczsKK30sIHJlbW92ZTpmdW5jdGlvbiAoc2hhcGUsIHNpbGVudGx5KSB7CisJaWYgKHRoaXMgPT0gc2hhcGUuZ2V0UGFyZW50KCkpIHsKKwkJaWYgKHRoaXMucmF3Tm9kZSA9PSBzaGFwZS5yYXdOb2RlLnBhcmVudE5vZGUpIHsKKwkJCXRoaXMucmF3Tm9kZS5yZW1vdmVDaGlsZChzaGFwZS5yYXdOb2RlKTsKKwkJfQorCQlkb2pvLmdmeC5Hcm91cC5zdXBlcmNsYXNzLnJlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwlyZXR1cm4gdGhpczsKK30sIGF0dGFjaDpmdW5jdGlvbiAocmF3Tm9kZSkgeworCWlmIChyYXdOb2RlKSB7CisJCXRoaXMucmF3Tm9kZSA9IHJhd05vZGU7CisJCXRoaXMuc2hhcGUgPSBudWxsOworCQl0aGlzLmZpbGxTdHlsZSA9IG51bGw7CisJCXRoaXMuc3Ryb2tlU3R5bGUgPSBudWxsOworCQl0aGlzLm1hdHJpeCA9IG51bGw7CisJfQorfX0pOworZG9qby5nZnguR3JvdXAubm9kZVR5cGUgPSAiZ3JvdXAiOwordmFyIHpJbmRleCA9IHttb3ZlVG9Gcm9udDpmdW5jdGlvbiAoKSB7CisJdGhpcy5yYXdOb2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5yYXdOb2RlKTsKKwlyZXR1cm4gdGhpczsKK30sIG1vdmVUb0JhY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMucmF3Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJhd05vZGUsIHRoaXMucmF3Tm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOworCXJldHVybiB0aGlzOworfX07Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZ2Z4LlNoYXBlLCB6SW5kZXgpOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmdmeC5Hcm91cCwgekluZGV4KTsKK2RlbGV0ZSB6SW5kZXg7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LlJlY3QiLCBkb2pvLmdmeC5zaGFwZS5SZWN0LCB7YXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgYXJjc2l6ZSA9IHJhd05vZGUub3V0ZXJIVE1MLm1hdGNoKC9hcmNzaXplID0gXCIoXGQqXC4/XGQrWyVmXT8pXCIvKVsxXTsKKwlhcmNzaXplID0gKGFyY3NpemUuaW5kZXhPZigiJSIpID49IDApID8gcGFyc2VGbG9hdChhcmNzaXplKSAvIDEwMCA6IGRvam8uZ2Z4LnZtbC5fcGFyc2VGbG9hdChhcmNzaXplKTsKKwl2YXIgc3R5bGUgPSByYXdOb2RlLnN0eWxlOworCXZhciB3aWR0aCA9IHBhcnNlRmxvYXQoc3R5bGUud2lkdGgpOworCXZhciBoZWlnaHQgPSBwYXJzZUZsb2F0KHN0eWxlLmhlaWdodCk7CisJdmFyIG8gPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyhkb2pvLmdmeC5kZWZhdWx0UmVjdCwge3g6cGFyc2VJbnQoc3R5bGUubGVmdCksIHk6cGFyc2VJbnQoc3R5bGUudG9wKSwgd2lkdGg6d2lkdGgsIGhlaWdodDpoZWlnaHQsIHI6TWF0aC5taW4od2lkdGgsIGhlaWdodCkgKiBhcmNzaXplfSk7CisJcmV0dXJuIG87Cit9LCBzZXRTaGFwZTpmdW5jdGlvbiAobmV3U2hhcGUpIHsKKwl2YXIgc2hhcGUgPSB0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwgbmV3U2hhcGUpOworCXRoaXMuYmJveCA9IG51bGw7CisJdmFyIHN0eWxlID0gdGhpcy5yYXdOb2RlLnN0eWxlOworCXN0eWxlLmxlZnQgPSBzaGFwZS54LnRvRml4ZWQoKTsKKwlzdHlsZS50b3AgPSBzaGFwZS55LnRvRml4ZWQoKTsKKwlzdHlsZS53aWR0aCA9ICh0eXBlb2YgKHNoYXBlLndpZHRoKSA9PSAic3RyaW5nIiAmJiBzaGFwZS53aWR0aC5pbmRleE9mKCIlIikgPj0gMCkgPyBzaGFwZS53aWR0aCA6IHNoYXBlLndpZHRoLnRvRml4ZWQoKTsKKwlzdHlsZS5oZWlnaHQgPSAodHlwZW9mIChzaGFwZS53aWR0aCkgPT0gInN0cmluZyIgJiYgc2hhcGUuaGVpZ2h0LmluZGV4T2YoIiUiKSA+PSAwKSA/IHNoYXBlLmhlaWdodCA6IHNoYXBlLmhlaWdodC50b0ZpeGVkKCk7CisJdmFyIHIgPSBNYXRoLm1pbigxLCAoc2hhcGUuciAvIE1hdGgubWluKHBhcnNlRmxvYXQoc2hhcGUud2lkdGgpLCBwYXJzZUZsb2F0KHNoYXBlLmhlaWdodCkpKSkudG9GaXhlZCg4KTsKKwl2YXIgcGFyZW50ID0gdGhpcy5yYXdOb2RlLnBhcmVudE5vZGU7CisJdmFyIGJlZm9yZSA9IG51bGw7CisJaWYgKHBhcmVudCkgeworCQlpZiAocGFyZW50Lmxhc3RDaGlsZCAhPSB0aGlzLnJhd05vZGUpIHsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHsKKwkJCQlpZiAocGFyZW50LmNoaWxkTm9kZXNbaV0gPT0gdGhpcy5yYXdOb2RlKSB7CisJCQkJCWJlZm9yZSA9IHBhcmVudC5jaGlsZE5vZGVzW2kgKyAxXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLnJhd05vZGUpOworCX0KKwl0aGlzLnJhd05vZGUuYXJjc2l6ZSA9IHI7CisJaWYgKHBhcmVudCkgeworCQlpZiAoYmVmb3JlKSB7CisJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMucmF3Tm9kZSwgYmVmb3JlKTsKKwkJfSBlbHNlIHsKKwkJCXBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnJhd05vZGUpOworCQl9CisJfQorCXJldHVybiB0aGlzLnNldFRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7Cit9fSk7Citkb2pvLmdmeC5SZWN0Lm5vZGVUeXBlID0gInJvdW5kcmVjdCI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LkVsbGlwc2UiLCBkb2pvLmdmeC5zaGFwZS5FbGxpcHNlLCB7YXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgc3R5bGUgPSB0aGlzLnJhd05vZGUuc3R5bGU7CisJdmFyIHJ4ID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpIC8gMjsKKwl2YXIgcnkgPSBwYXJzZUludChzdHlsZS5oZWlnaHQpIC8gMjsKKwl2YXIgbyA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRFbGxpcHNlLCB7Y3g6cGFyc2VJbnQoc3R5bGUubGVmdCkgKyByeCwgY3k6cGFyc2VJbnQoc3R5bGUudG9wKSArIHJ5LCByeDpyeCwgcnk6cnl9KTsKKwlyZXR1cm4gbzsKK30sIHNldFNoYXBlOmZ1bmN0aW9uIChuZXdTaGFwZSkgeworCXZhciBzaGFwZSA9IHRoaXMuc2hhcGUgPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyh0aGlzLnNoYXBlLCBuZXdTaGFwZSk7CisJdGhpcy5iYm94ID0gbnVsbDsKKwl2YXIgc3R5bGUgPSB0aGlzLnJhd05vZGUuc3R5bGU7CisJc3R5bGUubGVmdCA9IChzaGFwZS5jeCAtIHNoYXBlLnJ4KS50b0ZpeGVkKCk7CisJc3R5bGUudG9wID0gKHNoYXBlLmN5IC0gc2hhcGUucnkpLnRvRml4ZWQoKTsKKwlzdHlsZS53aWR0aCA9IChzaGFwZS5yeCAqIDIpLnRvRml4ZWQoKTsKKwlzdHlsZS5oZWlnaHQgPSAoc2hhcGUucnkgKiAyKS50b0ZpeGVkKCk7CisJcmV0dXJuIHRoaXMuc2V0VHJhbnNmb3JtKHRoaXMubWF0cml4KTsKK319KTsKK2Rvam8uZ2Z4LkVsbGlwc2Uubm9kZVR5cGUgPSAib3ZhbCI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LkNpcmNsZSIsIGRvam8uZ2Z4LnNoYXBlLkNpcmNsZSwge2F0dGFjaFNoYXBlOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdmFyIHN0eWxlID0gdGhpcy5yYXdOb2RlLnN0eWxlOworCXZhciByID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpIC8gMjsKKwl2YXIgbyA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRDaXJjbGUsIHtjeDpwYXJzZUludChzdHlsZS5sZWZ0KSArIHIsIGN5OnBhcnNlSW50KHN0eWxlLnRvcCkgKyByLCByOnJ9KTsKKwlyZXR1cm4gbzsKK30sIHNldFNoYXBlOmZ1bmN0aW9uIChuZXdTaGFwZSkgeworCXZhciBzaGFwZSA9IHRoaXMuc2hhcGUgPSBkb2pvLmdmeC5tYWtlUGFyYW1ldGVycyh0aGlzLnNoYXBlLCBuZXdTaGFwZSk7CisJdGhpcy5iYm94ID0gbnVsbDsKKwl2YXIgc3R5bGUgPSB0aGlzLnJhd05vZGUuc3R5bGU7CisJc3R5bGUubGVmdCA9IChzaGFwZS5jeCAtIHNoYXBlLnIpLnRvRml4ZWQoKTsKKwlzdHlsZS50b3AgPSAoc2hhcGUuY3kgLSBzaGFwZS5yKS50b0ZpeGVkKCk7CisJc3R5bGUud2lkdGggPSAoc2hhcGUuciAqIDIpLnRvRml4ZWQoKTsKKwlzdHlsZS5oZWlnaHQgPSAoc2hhcGUuciAqIDIpLnRvRml4ZWQoKTsKKwlyZXR1cm4gdGhpczsKK319KTsKK2Rvam8uZ2Z4LkNpcmNsZS5ub2RlVHlwZSA9ICJvdmFsIjsKK2Rvam8uZGVjbGFyZSgiZG9qby5nZnguTGluZSIsIGRvam8uZ2Z4LnNoYXBlLkxpbmUsIGZ1bmN0aW9uIChyYXdOb2RlKSB7CisJaWYgKHJhd05vZGUpIHsKKwkJcmF3Tm9kZS5zZXRBdHRyaWJ1dGUoImRvam9HZnhUeXBlIiwgImxpbmUiKTsKKwl9Cit9LCB7YXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgcCA9IHJhd05vZGUucGF0aC52Lm1hdGNoKGRvam8uZ2Z4LnBhdGhSZWdFeHApOworCXZhciBzaGFwZSA9IHt9OworCWRvIHsKKwkJaWYgKHAubGVuZ3RoIDwgNyB8fCBwWzBdICE9ICJtIiB8fCBwWzNdICE9ICJsIiB8fCBwWzZdICE9ICJlIikgeworCQkJYnJlYWs7CisJCX0KKwkJc2hhcGUueDEgPSBwYXJzZUludChwWzFdKTsKKwkJc2hhcGUueTEgPSBwYXJzZUludChwWzJdKTsKKwkJc2hhcGUueDIgPSBwYXJzZUludChwWzRdKTsKKwkJc2hhcGUueTIgPSBwYXJzZUludChwWzVdKTsKKwl9IHdoaWxlIChmYWxzZSk7CisJcmV0dXJuIGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKGRvam8uZ2Z4LmRlZmF1bHRMaW5lLCBzaGFwZSk7Cit9LCBzZXRTaGFwZTpmdW5jdGlvbiAobmV3U2hhcGUpIHsKKwl2YXIgc2hhcGUgPSB0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwgbmV3U2hhcGUpOworCXRoaXMuYmJveCA9IG51bGw7CisJdGhpcy5yYXdOb2RlLnBhdGgudiA9ICJtIiArIHNoYXBlLngxLnRvRml4ZWQoKSArICIgIiArIHNoYXBlLnkxLnRvRml4ZWQoKSArICJsIiArIHNoYXBlLngyLnRvRml4ZWQoKSArICIgIiArIHNoYXBlLnkyLnRvRml4ZWQoKSArICJlIjsKKwlyZXR1cm4gdGhpcy5zZXRUcmFuc2Zvcm0odGhpcy5tYXRyaXgpOworfX0pOworZG9qby5nZnguTGluZS5ub2RlVHlwZSA9ICJzaGFwZSI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LlBvbHlsaW5lIiwgZG9qby5nZnguc2hhcGUuUG9seWxpbmUsIGZ1bmN0aW9uIChyYXdOb2RlKSB7CisJaWYgKHJhd05vZGUpIHsKKwkJcmF3Tm9kZS5zZXRBdHRyaWJ1dGUoImRvam9HZnhUeXBlIiwgInBvbHlsaW5lIik7CisJfQorfSwge2F0dGFjaFNoYXBlOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdmFyIHNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRQb2x5bGluZSwgdHJ1ZSk7CisJdmFyIHAgPSByYXdOb2RlLnBhdGgudi5tYXRjaChkb2pvLmdmeC5wYXRoUmVnRXhwKTsKKwlkbyB7CisJCWlmIChwLmxlbmd0aCA8IDMgfHwgcFswXSAhPSAibSIpIHsKKwkJCWJyZWFrOworCQl9CisJCXZhciB4ID0gcGFyc2VJbnQocFswXSk7CisJCXZhciB5ID0gcGFyc2VJbnQocFsxXSk7CisJCWlmIChpc05hTih4KSB8fCBpc05hTih5KSkgeworCQkJYnJlYWs7CisJCX0KKwkJc2hhcGUucG9pbnRzLnB1c2goe3g6eCwgeTp5fSk7CisJCWlmIChwLmxlbmd0aCA8IDYgfHwgcFszXSAhPSAibCIpIHsKKwkJCWJyZWFrOworCQl9CisJCWZvciAodmFyIGkgPSA0OyBpIDwgcC5sZW5ndGg7IGkgKz0gMikgeworCQkJeCA9IHBhcnNlSW50KHBbaV0pOworCQkJeSA9IHBhcnNlSW50KHBbaSArIDFdKTsKKwkJCWlmIChpc05hTih4KSB8fCBpc05hTih5KSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJc2hhcGUucG9pbnRzLnB1c2goe3g6eCwgeTp5fSk7CisJCX0KKwl9IHdoaWxlIChmYWxzZSk7CisJcmV0dXJuIHNoYXBlOworfSwgc2V0U2hhcGU6ZnVuY3Rpb24gKHBvaW50cywgY2xvc2VkKSB7CisJaWYgKHBvaW50cyAmJiBwb2ludHMgaW5zdGFuY2VvZiBBcnJheSkgeworCQl0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwge3BvaW50czpwb2ludHN9KTsKKwkJaWYgKGNsb3NlZCAmJiB0aGlzLnNoYXBlLnBvaW50cy5sZW5ndGgpIHsKKwkJCXRoaXMuc2hhcGUucG9pbnRzLnB1c2godGhpcy5zaGFwZS5wb2ludHNbMF0pOworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5zaGFwZSA9IGRvam8uZ2Z4Lm1ha2VQYXJhbWV0ZXJzKHRoaXMuc2hhcGUsIHBvaW50cyk7CisJfQorCXRoaXMuYmJveCA9IG51bGw7CisJdmFyIGF0dHIgPSBbXTsKKwl2YXIgcCA9IHRoaXMuc2hhcGUucG9pbnRzOworCWlmIChwLmxlbmd0aCA+IDApIHsKKwkJYXR0ci5wdXNoKCJtIik7CisJCWF0dHIucHVzaChwWzBdLngudG9GaXhlZCgpKTsKKwkJYXR0ci5wdXNoKHBbMF0ueS50b0ZpeGVkKCkpOworCQlpZiAocC5sZW5ndGggPiAxKSB7CisJCQlhdHRyLnB1c2goImwiKTsKKwkJCWZvciAodmFyIGkgPSAxOyBpIDwgcC5sZW5ndGg7ICsraSkgeworCQkJCWF0dHIucHVzaChwW2ldLngudG9GaXhlZCgpKTsKKwkJCQlhdHRyLnB1c2gocFtpXS55LnRvRml4ZWQoKSk7CisJCQl9CisJCX0KKwl9CisJYXR0ci5wdXNoKCJlIik7CisJdGhpcy5yYXdOb2RlLnBhdGgudiA9IGF0dHIuam9pbigiICIpOworCXJldHVybiB0aGlzLnNldFRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7Cit9fSk7Citkb2pvLmdmeC5Qb2x5bGluZS5ub2RlVHlwZSA9ICJzaGFwZSI7Citkb2pvLmRlY2xhcmUoImRvam8uZ2Z4LkltYWdlIiwgZG9qby5nZnguc2hhcGUuSW1hZ2UsIHtnZXRFdmVudFNvdXJjZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucmF3Tm9kZSA/IHRoaXMucmF3Tm9kZS5maXJzdENoaWxkIDogbnVsbDsKK30sIGF0dGFjaFNoYXBlOmZ1bmN0aW9uIChyYXdOb2RlKSB7CisJdmFyIHNoYXBlID0gZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8uZ2Z4LmRlZmF1bHRJbWFnZSwgdHJ1ZSk7CisJc2hhcGUuc3JjID0gcmF3Tm9kZS5maXJzdENoaWxkLnNyYzsKKwlyZXR1cm4gc2hhcGU7Cit9LCBzZXRTaGFwZTpmdW5jdGlvbiAobmV3U2hhcGUpIHsKKwl2YXIgc2hhcGUgPSB0aGlzLnNoYXBlID0gZG9qby5nZngubWFrZVBhcmFtZXRlcnModGhpcy5zaGFwZSwgbmV3U2hhcGUpOworCXRoaXMuYmJveCA9IG51bGw7CisJdmFyIGZpcnN0Q2hpbGQgPSB0aGlzLnJhd05vZGUuZmlyc3RDaGlsZDsKKwlmaXJzdENoaWxkLnNyYyA9IHNoYXBlLnNyYzsKKwlpZiAoc2hhcGUud2lkdGggfHwgc2hhcGUuaGVpZ2h0KSB7CisJCWZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPSBzaGFwZS53aWR0aDsKKwkJZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSBzaGFwZS5oZWlnaHQ7CisJfQorCXJldHVybiB0aGlzLnNldFRyYW5zZm9ybSh0aGlzLm1hdHJpeCk7Cit9LCBzZXRTdHJva2U6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzOworfSwgc2V0RmlsbDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXM7Cit9LCBhdHRhY2hTdHJva2U6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwlyZXR1cm4gbnVsbDsKK30sIGF0dGFjaEZpbGw6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwlyZXR1cm4gbnVsbDsKK30sIGF0dGFjaFRyYW5zZm9ybTpmdW5jdGlvbiAocmF3Tm9kZSkgeworCXZhciBtYXRyaXggPSB7fTsKKwlpZiAocmF3Tm9kZSkgeworCQl2YXIgbSA9IHJhd05vZGUuZmlsdGVyc1siRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4Il07CisJCW1hdHJpeC54eCA9IG0uTTExOworCQltYXRyaXgueHkgPSBtLk0xMjsKKwkJbWF0cml4Lnl4ID0gbS5NMjE7CisJCW1hdHJpeC55eSA9IG0uTTIyOworCQltYXRyaXguZHggPSBtLkR4OworCQltYXRyaXguZHkgPSBtLkR5OworCX0KKwlyZXR1cm4gZG9qby5nZngubWF0cml4Lm5vcm1hbGl6ZShtYXRyaXgpOworfSwgX2FwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uICgpIHsKKwl2YXIgbWF0cml4ID0gdGhpcy5fZ2V0UmVhbE1hdHJpeCgpOworCWlmICghbWF0cml4KSB7CisJCXJldHVybiB0aGlzOworCX0KKwl3aXRoICh0aGlzLnJhd05vZGUuZmlsdGVyc1siRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4Il0pIHsKKwkJTTExID0gbWF0cml4Lnh4OworCQlNMTIgPSBtYXRyaXgueHk7CisJCU0yMSA9IG1hdHJpeC55eDsKKwkJTTIyID0gbWF0cml4Lnl5OworCQlEeCA9IG1hdHJpeC5keDsKKwkJRHkgPSBtYXRyaXguZHk7CisJfQorCXJldHVybiB0aGlzOworfX0pOworZG9qby5nZnguSW1hZ2Uubm9kZVR5cGUgPSAiaW1hZ2UiOworZG9qby5nZngucGF0aC5fY2FsY0FyYyA9IGZ1bmN0aW9uIChhbHBoYSkgeworCXZhciBjb3NhID0gTWF0aC5jb3MoYWxwaGEpOworCXZhciBzaW5hID0gTWF0aC5zaW4oYWxwaGEpOworCXZhciBwMiA9IHt4OmNvc2EgKyAoNCAvIDMpICogKDEgLSBjb3NhKSwgeTpzaW5hIC0gKDQgLyAzKSAqIGNvc2EgKiAoMSAtIGNvc2EpIC8gc2luYX07CisJcmV0dXJuIHtzOnt4OmNvc2EsIHk6c2luYX0sIGMxOnAyLCBjMjp7eDpwMi54LCB5Oi1wMi55fSwgZTp7eDpjb3NhLCB5Oi1zaW5hfX07Cit9OworZG9qby5kZWNsYXJlKCJkb2pvLmdmeC5QYXRoIiwgZG9qby5nZngucGF0aC5QYXRoLCBmdW5jdGlvbiAocmF3Tm9kZSkgeworCWlmIChyYXdOb2RlKSB7CisJCXJhd05vZGUuc2V0QXR0cmlidXRlKCJkb2pvR2Z4VHlwZSIsICJwYXRoIik7CisJfQorCXRoaXMudm1sUGF0aCA9ICIiOworCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKK30sIHtfdXBkYXRlV2l0aFNlZ21lbnQ6ZnVuY3Rpb24gKHNlZ21lbnQpIHsKKwl2YXIgbGFzdCA9IGRvam8ubGFuZy5zaGFsbG93Q29weSh0aGlzLmxhc3QpOworCWRvam8uZ2Z4LlBhdGguc3VwZXJjbGFzcy5fdXBkYXRlV2l0aFNlZ21lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl2YXIgcGF0aCA9IHRoaXNbdGhpcy5yZW5kZXJlcnNbc2VnbWVudC5hY3Rpb25dXShzZWdtZW50LCBsYXN0KTsKKwlpZiAodHlwZW9mICh0aGlzLnZtbFBhdGgpID09ICJzdHJpbmciKSB7CisJCXRoaXMudm1sUGF0aCArPSBwYXRoLmpvaW4oIiIpOworCX0gZWxzZSB7CisJCXRoaXMudm1sUGF0aCA9IHRoaXMudm1sUGF0aC5jb25jYXQocGF0aCk7CisJfQorCWlmICh0eXBlb2YgKHRoaXMudm1sUGF0aCkgPT0gInN0cmluZyIpIHsKKwkJdGhpcy5yYXdOb2RlLnBhdGgudiA9IHRoaXMudm1sUGF0aCArICIgZSI7CisJfQorfSwgYXR0YWNoU2hhcGU6ZnVuY3Rpb24gKHJhd05vZGUpIHsKKwl2YXIgc2hhcGUgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkoZG9qby5nZnguZGVmYXVsdFBhdGgsIHRydWUpOworCXZhciBwID0gcmF3Tm9kZS5wYXRoLnYubWF0Y2goZG9qby5nZngucGF0aFJlZ0V4cCk7CisJdmFyIHQgPSBbXSwgc2tpcCA9IGZhbHNlOworCWZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsrcCkgeworCQl2YXIgcyA9IHBbaV07CisJCWlmIChzIGluIHRoaXMuX3BhdGhWbWxUb1N2Z01hcCkgeworCQkJc2tpcCA9IGZhbHNlOworCQkJdC5wdXNoKHRoaXMuX3BhdGhWbWxUb1N2Z01hcFtzXSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIXNraXApIHsKKwkJCQl2YXIgbiA9IHBhcnNlSW50KHMpOworCQkJCWlmIChpc05hTihuKSkgeworCQkJCQlza2lwID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQl0LnB1c2gobik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmICh0Lmxlbmd0aCkgeworCQlzaGFwZS5wYXRoID0gdC5qb2luKCIgIik7CisJfQorCXJldHVybiBzaGFwZTsKK30sIHNldFNoYXBlOmZ1bmN0aW9uIChuZXdTaGFwZSkgeworCXRoaXMudm1sUGF0aCA9IFtdOworCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKKwlkb2pvLmdmeC5QYXRoLnN1cGVyY2xhc3Muc2V0U2hhcGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLnZtbFBhdGggPSB0aGlzLnZtbFBhdGguam9pbigiIik7CisJdGhpcy5yYXdOb2RlLnBhdGgudiA9IHRoaXMudm1sUGF0aCArICIgZSI7CisJcmV0dXJuIHRoaXM7Cit9LCBfcGF0aFZtbFRvU3ZnTWFwOnttOiJNIiwgbDoiTCIsIHQ6Im0iLCByOiJsIiwgYzoiQyIsIHY6ImMiLCBxYjoiUSIsIHg6InoiLCBlOiIifSwgcmVuZGVyZXJzOntNOiJfbW92ZVRvQSIsIG06Il9tb3ZlVG9SIiwgTDoiX2xpbmVUb0EiLCBsOiJfbGluZVRvUiIsIEg6Il9oTGluZVRvQSIsIGg6Il9oTGluZVRvUiIsIFY6Il92TGluZVRvQSIsIHY6Il92TGluZVRvUiIsIEM6Il9jdXJ2ZVRvQSIsIGM6Il9jdXJ2ZVRvUiIsIFM6Il9zbW9vdGhDdXJ2ZVRvQSIsIHM6Il9zbW9vdGhDdXJ2ZVRvUiIsIFE6Il9xQ3VydmVUb0EiLCBxOiJfcUN1cnZlVG9SIiwgVDoiX3FTbW9vdGhDdXJ2ZVRvQSIsIHQ6Il9xU21vb3RoQ3VydmVUb1IiLCBBOiJfYXJjVG8iLCBhOiJfYXJjVG8iLCBaOiJfY2xvc2VQYXRoIiwgejoiX2Nsb3NlUGF0aCJ9LCBfYWRkQXJnczpmdW5jdGlvbiAocGF0aCwgYXJncywgZnJvbSwgdXB0bykgeworCWlmICh0eXBlb2YgKHVwdG8pID09ICJ1bmRlZmluZWQiKSB7CisJCXVwdG8gPSBhcmdzLmxlbmd0aDsKKwl9CisJaWYgKHR5cGVvZiAoZnJvbSkgPT0gInVuZGVmaW5lZCIpIHsKKwkJZnJvbSA9IDA7CisJfQorCWZvciAodmFyIGkgPSBmcm9tOyBpIDwgdXB0bzsgKytpKSB7CisJCXBhdGgucHVzaCgiICIpOworCQlwYXRoLnB1c2goYXJnc1tpXS50b0ZpeGVkKCkpOworCX0KK30sIF9hZGRBcmdzQWRqdXN0ZWQ6ZnVuY3Rpb24gKHBhdGgsIGxhc3QsIGFyZ3MsIGZyb20sIHVwdG8pIHsKKwlpZiAodHlwZW9mICh1cHRvKSA9PSAidW5kZWZpbmVkIikgeworCQl1cHRvID0gYXJncy5sZW5ndGg7CisJfQorCWlmICh0eXBlb2YgKGZyb20pID09ICJ1bmRlZmluZWQiKSB7CisJCWZyb20gPSAwOworCX0KKwlmb3IgKHZhciBpID0gZnJvbTsgaSA8IHVwdG87IGkgKz0gMikgeworCQlwYXRoLnB1c2goIiAiKTsKKwkJcGF0aC5wdXNoKChsYXN0LnggKyBhcmdzW2ldKS50b0ZpeGVkKCkpOworCQlwYXRoLnB1c2goIiAiKTsKKwkJcGF0aC5wdXNoKChsYXN0LnkgKyBhcmdzW2kgKyAxXSkudG9GaXhlZCgpKTsKKwl9Cit9LCBfbW92ZVRvQTpmdW5jdGlvbiAoc2VnbWVudCkgeworCXZhciBwID0gWyIgbSJdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJaWYgKGwgPT0gMikgeworCQl0aGlzLl9hZGRBcmdzKHAsIG4pOworCX0gZWxzZSB7CisJCXRoaXMuX2FkZEFyZ3MocCwgbiwgMCwgMik7CisJCXAucHVzaCgiIGwiKTsKKwkJdGhpcy5fYWRkQXJncyhwLCBuLCAyKTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbCA9IHt9OworCXJldHVybiBwOworfSwgX21vdmVUb1I6ZnVuY3Rpb24gKHNlZ21lbnQsIGxhc3QpIHsKKwl2YXIgcCA9IFsieCIgaW4gbGFzdCA/ICIgdCIgOiAiIG0iXTsKKwl2YXIgbiA9IHNlZ21lbnQuYXJnczsKKwl2YXIgbCA9IG4ubGVuZ3RoOworCWlmIChsID09IDIpIHsKKwkJdGhpcy5fYWRkQXJncyhwLCBuKTsKKwl9IGVsc2UgeworCQl0aGlzLl9hZGRBcmdzKHAsIG4sIDAsIDIpOworCQlwLnB1c2goIiByIik7CisJCXRoaXMuX2FkZEFyZ3MocCwgbiwgMik7CisJfQorCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKKwlyZXR1cm4gcDsKK30sIF9saW5lVG9BOmZ1bmN0aW9uIChzZWdtZW50KSB7CisJdmFyIHAgPSBbIiBsIl07CisJdGhpcy5fYWRkQXJncyhwLCBzZWdtZW50LmFyZ3MpOworCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKKwlyZXR1cm4gcDsKK30sIF9saW5lVG9SOmZ1bmN0aW9uIChzZWdtZW50KSB7CisJdmFyIHAgPSBbIiByIl07CisJdGhpcy5fYWRkQXJncyhwLCBzZWdtZW50LmFyZ3MpOworCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKKwlyZXR1cm4gcDsKK30sIF9oTGluZVRvQTpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gWyIgbCJdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJdmFyIHkgPSAiICIgKyBsYXN0LnkudG9GaXhlZCgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSB7CisJCXAucHVzaCgiICIpOworCQlwLnB1c2gobltpXS50b0ZpeGVkKCkpOworCQlwLnB1c2goeSk7CisJfQorCXRoaXMubGFzdENvbnRyb2wgPSB7fTsKKwlyZXR1cm4gcDsKK30sIF9oTGluZVRvUjpmdW5jdGlvbiAoc2VnbWVudCkgeworCXZhciBwID0gWyIgciJdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHsKKwkJcC5wdXNoKCIgIik7CisJCXAucHVzaChuW2ldLnRvRml4ZWQoKSk7CisJCXAucHVzaCgiIDAiKTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbCA9IHt9OworCXJldHVybiBwOworfSwgX3ZMaW5lVG9BOmZ1bmN0aW9uIChzZWdtZW50LCBsYXN0KSB7CisJdmFyIHAgPSBbIiBsIl07CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwl2YXIgeCA9ICIgIiArIGxhc3QueC50b0ZpeGVkKCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHsKKwkJcC5wdXNoKHgpOworCQlwLnB1c2goIiAiKTsKKwkJcC5wdXNoKG5baV0udG9GaXhlZCgpKTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbCA9IHt9OworCXJldHVybiBwOworfSwgX3ZMaW5lVG9SOmZ1bmN0aW9uIChzZWdtZW50KSB7CisJdmFyIHAgPSBbIiByIl07CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkgeworCQlwLnB1c2goIiAwICIpOworCQlwLnB1c2gobltpXS50b0ZpeGVkKCkpOworCX0KKwl0aGlzLmxhc3RDb250cm9sID0ge307CisJcmV0dXJuIHA7Cit9LCBfY3VydmVUb0E6ZnVuY3Rpb24gKHNlZ21lbnQpIHsKKwl2YXIgcCA9IFtdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDYpIHsKKwkJcC5wdXNoKCIgYyIpOworCQl0aGlzLl9hZGRBcmdzKHAsIG4sIGksIGkgKyA2KTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbCA9IHt4Om5bbCAtIDRdLCB5Om5bbCAtIDNdLCB0eXBlOiJDIn07CisJcmV0dXJuIHA7Cit9LCBfY3VydmVUb1I6ZnVuY3Rpb24gKHNlZ21lbnQsIGxhc3QpIHsKKwl2YXIgcCA9IFtdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDYpIHsKKwkJcC5wdXNoKCIgdiIpOworCQl0aGlzLl9hZGRBcmdzKHAsIG4sIGksIGkgKyA2KTsKKwkJdGhpcy5sYXN0Q29udHJvbCA9IHt4Omxhc3QueCArIG5baSArIDJdLCB5Omxhc3QueSArIG5baSArIDNdfTsKKwkJbGFzdC54ICs9IG5baSArIDRdOworCQlsYXN0LnkgKz0gbltpICsgNV07CisJfQorCXRoaXMubGFzdENvbnRyb2wudHlwZSA9ICJDIjsKKwlyZXR1cm4gcDsKK30sIF9zbW9vdGhDdXJ2ZVRvQTpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gW107CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gNCkgeworCQlwLnB1c2goIiBjIik7CisJCWlmICh0aGlzLmxhc3RDb250cm9sLnR5cGUgPT0gIkMiKSB7CisJCQl0aGlzLl9hZGRBcmdzKHAsIFsyICogbGFzdC54IC0gdGhpcy5sYXN0Q29udHJvbC54LCAyICogbGFzdC55IC0gdGhpcy5sYXN0Q29udHJvbC55XSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLl9hZGRBcmdzKHAsIFtsYXN0LngsIGxhc3QueV0pOworCQl9CisJCXRoaXMuX2FkZEFyZ3MocCwgbiwgaSwgaSArIDQpOworCX0KKwl0aGlzLmxhc3RDb250cm9sID0ge3g6bltsIC0gNF0sIHk6bltsIC0gM10sIHR5cGU6IkMifTsKKwlyZXR1cm4gcDsKK30sIF9zbW9vdGhDdXJ2ZVRvUjpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gW107CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gNCkgeworCQlwLnB1c2goIiB2Iik7CisJCWlmICh0aGlzLmxhc3RDb250cm9sLnR5cGUgPT0gIkMiKSB7CisJCQl0aGlzLl9hZGRBcmdzKHAsIFtsYXN0LnggLSB0aGlzLmxhc3RDb250cm9sLngsIGxhc3QueSAtIHRoaXMubGFzdENvbnRyb2wueV0pOworCQl9IGVsc2UgeworCQkJdGhpcy5fYWRkQXJncyhwLCBbMCwgMF0pOworCQl9CisJCXRoaXMuX2FkZEFyZ3MocCwgbiwgaSwgaSArIDQpOworCQl0aGlzLmxhc3RDb250cm9sID0ge3g6bGFzdC54ICsgbltpXSwgeTpsYXN0LnkgKyBuW2kgKyAxXX07CisJCWxhc3QueCArPSBuW2kgKyAyXTsKKwkJbGFzdC55ICs9IG5baSArIDNdOworCX0KKwl0aGlzLmxhc3RDb250cm9sLnR5cGUgPSAiQyI7CisJcmV0dXJuIHA7Cit9LCBfcUN1cnZlVG9BOmZ1bmN0aW9uIChzZWdtZW50KSB7CisJdmFyIHAgPSBbXTsKKwl2YXIgbiA9IHNlZ21lbnQuYXJnczsKKwl2YXIgbCA9IG4ubGVuZ3RoOworCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSA0KSB7CisJCXAucHVzaCgiIHFiIik7CisJCXRoaXMuX2FkZEFyZ3MocCwgbiwgaSwgaSArIDQpOworCX0KKwl0aGlzLmxhc3RDb250cm9sID0ge3g6bltsIC0gNF0sIHk6bltsIC0gM10sIHR5cGU6IlEifTsKKwlyZXR1cm4gcDsKK30sIF9xQ3VydmVUb1I6ZnVuY3Rpb24gKHNlZ21lbnQsIGxhc3QpIHsKKwl2YXIgcCA9IFtdOworCXZhciBuID0gc2VnbWVudC5hcmdzOworCXZhciBsID0gbi5sZW5ndGg7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDQpIHsKKwkJcC5wdXNoKCIgcWIiKTsKKwkJdGhpcy5fYWRkQXJnc0FkanVzdGVkKHAsIGxhc3QsIG4sIGksIGkgKyA0KTsKKwkJdGhpcy5sYXN0Q29udHJvbCA9IHt4Omxhc3QueCArIG5baV0sIHk6bGFzdC55ICsgbltpICsgMV19OworCQlsYXN0LnggKz0gbltpICsgMl07CisJCWxhc3QueSArPSBuW2kgKyAzXTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbC50eXBlID0gIlEiOworCXJldHVybiBwOworfSwgX3FTbW9vdGhDdXJ2ZVRvQTpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gW107CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gMikgeworCQlwLnB1c2goIiBxYiIpOworCQlpZiAodGhpcy5sYXN0Q29udHJvbC50eXBlID09ICJRIikgeworCQkJdGhpcy5fYWRkQXJncyhwLCBbdGhpcy5sYXN0Q29udHJvbC54ID0gMiAqIGxhc3QueCAtIHRoaXMubGFzdENvbnRyb2wueCwgdGhpcy5sYXN0Q29udHJvbC55ID0gMiAqIGxhc3QueSAtIHRoaXMubGFzdENvbnRyb2wueV0pOworCQl9IGVsc2UgeworCQkJdGhpcy5fYWRkQXJncyhwLCBbdGhpcy5sYXN0Q29udHJvbC54ID0gbGFzdC54LCB0aGlzLmxhc3RDb250cm9sLnkgPSBsYXN0LnldKTsKKwkJfQorCQl0aGlzLl9hZGRBcmdzKHAsIG4sIGksIGkgKyAyKTsKKwl9CisJdGhpcy5sYXN0Q29udHJvbC50eXBlID0gIlEiOworCXJldHVybiBwOworfSwgX3FTbW9vdGhDdXJ2ZVRvUjpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gW107CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gMikgeworCQlwLnB1c2goIiBxYiIpOworCQlpZiAodGhpcy5sYXN0Q29udHJvbC50eXBlID09ICJRIikgeworCQkJdGhpcy5fYWRkQXJncyhwLCBbdGhpcy5sYXN0Q29udHJvbC54ID0gMiAqIGxhc3QueCAtIHRoaXMubGFzdENvbnRyb2wueCwgdGhpcy5sYXN0Q29udHJvbC55ID0gMiAqIGxhc3QueSAtIHRoaXMubGFzdENvbnRyb2wueV0pOworCQl9IGVsc2UgeworCQkJdGhpcy5fYWRkQXJncyhwLCBbdGhpcy5sYXN0Q29udHJvbC54ID0gbGFzdC54LCB0aGlzLmxhc3RDb250cm9sLnkgPSBsYXN0LnldKTsKKwkJfQorCQl0aGlzLl9hZGRBcmdzQWRqdXN0ZWQocCwgbGFzdCwgbiwgaSwgaSArIDIpOworCX0KKwl0aGlzLmxhc3RDb250cm9sLnR5cGUgPSAiUSI7CisJcmV0dXJuIHA7Cit9LCBfUEk0Ok1hdGguUEkgLyA0LCBfY3VydmVQSTQ6ZG9qby5nZngucGF0aC5fY2FsY0FyYyhNYXRoLlBJIC8gOCksIF9jYWxjQXJjVG86ZnVuY3Rpb24gKHBhdGgsIGxhc3QsIHJ4LCByeSwgeFJvdGcsIGxhcmdlLCBjdywgeCwgeSkgeworCXZhciBtID0gZG9qby5nZngubWF0cml4OworCXZhciB4Um90ID0gLWRvam8ubWF0aC5kZWdUb1JhZCh4Um90Zyk7CisJdmFyIHJ4MiA9IHJ4ICogcng7CisJdmFyIHJ5MiA9IHJ5ICogcnk7CisJdmFyIHBhID0gbS5tdWx0aXBseVBvaW50KG0ucm90YXRlKC14Um90KSwge3g6KGxhc3QueCAtIHgpIC8gMiwgeToobGFzdC55IC0geSkgLyAyfSk7CisJdmFyIHBheDIgPSBwYS54ICogcGEueDsKKwl2YXIgcGF5MiA9IHBhLnkgKiBwYS55OworCXZhciBjMSA9IE1hdGguc3FydCgocngyICogcnkyIC0gcngyICogcGF5MiAtIHJ5MiAqIHBheDIpIC8gKHJ4MiAqIHBheTIgKyByeTIgKiBwYXgyKSk7CisJdmFyIGNhID0ge3g6YzEgKiByeCAqIHBhLnkgLyByeSwgeTotYzEgKiByeSAqIHBhLnggLyByeH07CisJaWYgKGxhcmdlID09IGN3KSB7CisJCWNhID0ge3g6LWNhLngsIHk6LWNhLnl9OworCX0KKwl2YXIgYyA9IG0ubXVsdGlwbHlQb2ludChbbS50cmFuc2xhdGUoKGxhc3QueCArIHgpIC8gMiwgKGxhc3QueSArIHkpIC8gMiksIG0ucm90YXRlKHhSb3QpXSwgY2EpOworCXZhciBzdGFydEFuZ2xlID0gTWF0aC5hdGFuMihjLnkgLSBsYXN0LnksIGxhc3QueCAtIGMueCkgLSB4Um90OworCXZhciBlbmRBbmdsZSA9IE1hdGguYXRhbjIoYy55IC0geSwgeCAtIGMueCkgLSB4Um90OworCXZhciB0aGV0YSA9IGN3ID8gc3RhcnRBbmdsZSAtIGVuZEFuZ2xlIDogZW5kQW5nbGUgLSBzdGFydEFuZ2xlOworCWlmICh0aGV0YSA8IDApIHsKKwkJdGhldGEgKz0gdGhpcy5fMlBJOworCX0gZWxzZSB7CisJCWlmICh0aGV0YSA+IHRoaXMuXzJQSSkgeworCQkJdGhldGEgPSB0aGlzLl8yUEk7CisJCX0KKwl9CisJdmFyIGVsbGlwdGljX3RyYW5zZm9ybSA9IG0ubm9ybWFsaXplKFttLnRyYW5zbGF0ZShjLngsIGMueSksIG0ucm90YXRlKHhSb3QpLCBtLnNjYWxlKHJ4LCByeSldKTsKKwl2YXIgYWxwaGEgPSB0aGlzLl9QSTQgLyAyOworCXZhciBjdXJ2ZSA9IHRoaXMuX2N1cnZlUEk0OworCXZhciBzdGVwID0gY3cgPyAtYWxwaGEgOiBhbHBoYTsKKwlmb3IgKHZhciBhbmdsZSA9IHRoZXRhOyBhbmdsZSA+IDA7IGFuZ2xlIC09IHRoaXMuX1BJNCkgeworCQlpZiAoYW5nbGUgPCB0aGlzLl9QSTQpIHsKKwkJCWFscGhhID0gYW5nbGUgLyAyOworCQkJY3VydmUgPSBkb2pvLmdmeC5wYXRoLl9jYWxjQXJjKGFscGhhKTsKKwkJCXN0ZXAgPSBjdyA/IC1hbHBoYSA6IGFscGhhOworCQl9CisJCXZhciBjMSwgYzIsIGU7CisJCXZhciBNID0gbS5ub3JtYWxpemUoW2VsbGlwdGljX3RyYW5zZm9ybSwgbS5yb3RhdGUoc3RhcnRBbmdsZSArIHN0ZXApXSk7CisJCWlmIChjdykgeworCQkJYzEgPSBtLm11bHRpcGx5UG9pbnQoTSwgY3VydmUuYzIpOworCQkJYzIgPSBtLm11bHRpcGx5UG9pbnQoTSwgY3VydmUuYzEpOworCQkJZSA9IG0ubXVsdGlwbHlQb2ludChNLCBjdXJ2ZS5zKTsKKwkJfSBlbHNlIHsKKwkJCWMxID0gbS5tdWx0aXBseVBvaW50KE0sIGN1cnZlLmMxKTsKKwkJCWMyID0gbS5tdWx0aXBseVBvaW50KE0sIGN1cnZlLmMyKTsKKwkJCWUgPSBtLm11bHRpcGx5UG9pbnQoTSwgY3VydmUuZSk7CisJCX0KKwkJcGF0aC5wdXNoKCIgYyIpOworCQl0aGlzLl9hZGRBcmdzKHBhdGgsIFtjMS54LCBjMS55LCBjMi54LCBjMi55LCBlLngsIGUueV0pOworCQlzdGFydEFuZ2xlICs9IDIgKiBzdGVwOworCX0KK30sIF9hcmNUbzpmdW5jdGlvbiAoc2VnbWVudCwgbGFzdCkgeworCXZhciBwID0gW107CisJdmFyIG4gPSBzZWdtZW50LmFyZ3M7CisJdmFyIGwgPSBuLmxlbmd0aDsKKwl2YXIgcmVsYXRpdmUgPSBzZWdtZW50LmFjdGlvbiA9PSAiYSI7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDcpIHsKKwkJdmFyIHgxID0gbltpICsgNV07CisJCXZhciB5MSA9IG5baSArIDZdOworCQlpZiAocmVsYXRpdmUpIHsKKwkJCXgxICs9IGxhc3QueDsKKwkJCXkxICs9IGxhc3QueTsKKwkJfQorCQl0aGlzLl9jYWxjQXJjVG8ocCwgbGFzdCwgbltpXSwgbltpICsgMV0sIG5baSArIDJdLCBuW2kgKyAzXSA/IDEgOiAwLCBuW2kgKyA0XSA/IDEgOiAwLCB4MSwgeTEpOworCQlsYXN0ID0ge3g6eDEsIHk6eTF9OworCX0KKwl0aGlzLmxhc3RDb250cm9sID0ge307CisJcmV0dXJuIHA7Cit9LCBfY2xvc2VQYXRoOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmxhc3RDb250cm9sID0ge307CisJcmV0dXJuIFsieCJdOworfX0pOworZG9qby5nZnguUGF0aC5ub2RlVHlwZSA9ICJzaGFwZSI7Citkb2pvLmdmeC5fY3JlYXRvcnMgPSB7Y3JlYXRlUGF0aDpmdW5jdGlvbiAocGF0aCkgeworCXJldHVybiB0aGlzLmNyZWF0ZU9iamVjdChkb2pvLmdmeC5QYXRoLCBwYXRoLCB0cnVlKTsKK30sIGNyZWF0ZVJlY3Q6ZnVuY3Rpb24gKHJlY3QpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguUmVjdCwgcmVjdCk7Cit9LCBjcmVhdGVDaXJjbGU6ZnVuY3Rpb24gKGNpcmNsZSkgeworCXJldHVybiB0aGlzLmNyZWF0ZU9iamVjdChkb2pvLmdmeC5DaXJjbGUsIGNpcmNsZSk7Cit9LCBjcmVhdGVFbGxpcHNlOmZ1bmN0aW9uIChlbGxpcHNlKSB7CisJcmV0dXJuIHRoaXMuY3JlYXRlT2JqZWN0KGRvam8uZ2Z4LkVsbGlwc2UsIGVsbGlwc2UpOworfSwgY3JlYXRlTGluZTpmdW5jdGlvbiAobGluZSkgeworCXJldHVybiB0aGlzLmNyZWF0ZU9iamVjdChkb2pvLmdmeC5MaW5lLCBsaW5lLCB0cnVlKTsKK30sIGNyZWF0ZVBvbHlsaW5lOmZ1bmN0aW9uIChwb2ludHMpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguUG9seWxpbmUsIHBvaW50cywgdHJ1ZSk7Cit9LCBjcmVhdGVJbWFnZTpmdW5jdGlvbiAoaW1hZ2UpIHsKKwlpZiAoIXRoaXMucmF3Tm9kZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJdmFyIHNoYXBlID0gbmV3IGRvam8uZ2Z4LkltYWdlKCk7CisJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlub2RlLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwlub2RlLnN0eWxlLndpZHRoID0gdGhpcy5yYXdOb2RlLnN0eWxlLndpZHRoOworCW5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5yYXdOb2RlLnN0eWxlLmhlaWdodDsKKwlub2RlLnN0eWxlLmZpbHRlciA9ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KE0xMT0xLCBNMTI9MCwgTTIxPTAsIE0yMj0xLCBEeD0wLCBEeT0wKSI7CisJdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOworCW5vZGUuYXBwZW5kQ2hpbGQoaW1nKTsKKwlzaGFwZS5zZXRSYXdOb2RlKG5vZGUpOworCXRoaXMucmF3Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwlzaGFwZS5zZXRTaGFwZShpbWFnZSk7CisJdGhpcy5hZGQoc2hhcGUpOworCXJldHVybiBzaGFwZTsKK30sIGNyZWF0ZUdyb3VwOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5jcmVhdGVPYmplY3QoZG9qby5nZnguR3JvdXAsIG51bGwsIHRydWUpOworfSwgY3JlYXRlT2JqZWN0OmZ1bmN0aW9uIChzaGFwZVR5cGUsIHJhd1NoYXBlLCBvdmVycmlkZVNpemUpIHsKKwlpZiAoIXRoaXMucmF3Tm9kZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJdmFyIHNoYXBlID0gbmV3IHNoYXBlVHlwZSgpOworCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjoiICsgc2hhcGVUeXBlLm5vZGVUeXBlKTsKKwlzaGFwZS5zZXRSYXdOb2RlKG5vZGUpOworCXRoaXMucmF3Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwlpZiAob3ZlcnJpZGVTaXplKSB7CisJCXRoaXMuX292ZXJyaWRlU2l6ZShub2RlKTsKKwl9CisJc2hhcGUuc2V0U2hhcGUocmF3U2hhcGUpOworCXRoaXMuYWRkKHNoYXBlKTsKKwlyZXR1cm4gc2hhcGU7Cit9LCBfb3ZlcnJpZGVTaXplOmZ1bmN0aW9uIChub2RlKSB7CisJbm9kZS5zdHlsZS53aWR0aCA9IHRoaXMucmF3Tm9kZS5zdHlsZS53aWR0aDsKKwlub2RlLnN0eWxlLmhlaWdodCA9IHRoaXMucmF3Tm9kZS5zdHlsZS5oZWlnaHQ7CisJbm9kZS5jb29yZHNpemUgPSBwYXJzZUZsb2F0KG5vZGUuc3R5bGUud2lkdGgpICsgIiAiICsgcGFyc2VGbG9hdChub2RlLnN0eWxlLmhlaWdodCk7Cit9fTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5nZnguR3JvdXAsIGRvam8uZ2Z4Ll9jcmVhdG9ycyk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZ2Z4LlN1cmZhY2UsIGRvam8uZ2Z4Ll9jcmVhdG9ycyk7CitkZWxldGUgZG9qby5nZnguX2NyZWF0b3JzOworZG9qby5nZnguYXR0YWNoTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJaWYgKCFub2RlKSB7CisJCXJldHVybiBudWxsOworCX0KKwl2YXIgcyA9IG51bGw7CisJc3dpdGNoIChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgeworCSAgY2FzZSBkb2pvLmdmeC5SZWN0Lm5vZGVUeXBlOgorCQlzID0gbmV3IGRvam8uZ2Z4LlJlY3QoKTsKKwkJYnJlYWs7CisJICBjYXNlIGRvam8uZ2Z4LkVsbGlwc2Uubm9kZVR5cGU6CisJCXMgPSAobm9kZS5zdHlsZS53aWR0aCA9PSBub2RlLnN0eWxlLmhlaWdodCkgPyBuZXcgZG9qby5nZnguQ2lyY2xlKCkgOiBuZXcgZG9qby5nZnguRWxsaXBzZSgpOworCQlicmVhazsKKwkgIGNhc2UgZG9qby5nZnguUGF0aC5ub2RlVHlwZToKKwkJc3dpdGNoIChub2RlLmdldEF0dHJpYnV0ZSgiZG9qb0dmeFR5cGUiKSkgeworCQkgIGNhc2UgImxpbmUiOgorCQkJcyA9IG5ldyBkb2pvLmdmeC5MaW5lKCk7CisJCQlicmVhazsKKwkJICBjYXNlICJwb2x5bGluZSI6CisJCQlzID0gbmV3IGRvam8uZ2Z4LlBvbHlsaW5lKCk7CisJCQlicmVhazsKKwkJICBjYXNlICJwYXRoIjoKKwkJCXMgPSBuZXcgZG9qby5nZnguUGF0aCgpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJICBjYXNlIGRvam8uZ2Z4LkltYWdlLm5vZGVUeXBlOgorCQlzID0gbmV3IGRvam8uZ2Z4LkltYWdlKCk7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJZG9qby5kZWJ1ZygiRkFUQUwgRVJST1IhIHRhZ05hbWUgPSAiICsgbm9kZS50YWdOYW1lKTsKKwl9CisJcy5hdHRhY2gobm9kZSk7CisJcmV0dXJuIHM7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmdmeC5TdXJmYWNlLCB7c2V0RGltZW5zaW9uczpmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgeworCWlmICghdGhpcy5yYXdOb2RlKSB7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLnJhd05vZGUuc3R5bGUud2lkdGggPSB3aWR0aDsKKwl0aGlzLnJhd05vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OworCXRoaXMucmF3Tm9kZS5jb29yZHNpemUgPSB3aWR0aCArICIgIiArIGhlaWdodDsKKwlyZXR1cm4gdGhpczsKK30sIGdldERpbWVuc2lvbnM6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnJhd05vZGUgPyB7d2lkdGg6dGhpcy5yYXdOb2RlLnN0eWxlLndpZHRoLCBoZWlnaHQ6dGhpcy5yYXdOb2RlLnN0eWxlLmhlaWdodH0gOiBudWxsOworfSwgYWRkOmZ1bmN0aW9uIChzaGFwZSkgeworCXZhciBvbGRQYXJlbnQgPSBzaGFwZS5nZXRQYXJlbnQoKTsKKwlpZiAodGhpcyAhPSBvbGRQYXJlbnQpIHsKKwkJdGhpcy5yYXdOb2RlLmFwcGVuZENoaWxkKHNoYXBlLnJhd05vZGUpOworCQlpZiAob2xkUGFyZW50KSB7CisJCQlvbGRQYXJlbnQucmVtb3ZlKHNoYXBlLCB0cnVlKTsKKwkJfQorCQlzaGFwZS5fc2V0UGFyZW50KHRoaXMsIG51bGwpOworCX0KKwlyZXR1cm4gdGhpczsKK30sIHJlbW92ZTpmdW5jdGlvbiAoc2hhcGUsIHNpbGVudGx5KSB7CisJaWYgKHRoaXMgPT0gc2hhcGUuZ2V0UGFyZW50KCkpIHsKKwkJaWYgKHRoaXMucmF3Tm9kZSA9PSBzaGFwZS5yYXdOb2RlLnBhcmVudE5vZGUpIHsKKwkJCXRoaXMucmF3Tm9kZS5yZW1vdmVDaGlsZChzaGFwZS5yYXdOb2RlKTsKKwkJfQorCQlzaGFwZS5fc2V0UGFyZW50KG51bGwsIG51bGwpOworCX0KKwlyZXR1cm4gdGhpczsKK319KTsKK2Rvam8uZ2Z4LmNyZWF0ZVN1cmZhY2UgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgd2lkdGgsIGhlaWdodCkgeworCXZhciBzID0gbmV3IGRvam8uZ2Z4LlN1cmZhY2UoKTsKKwlzLnJhd05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2Omdyb3VwIik7CisJcy5yYXdOb2RlLnN0eWxlLndpZHRoID0gd2lkdGggPyB3aWR0aCA6ICIxMDAlIjsKKwlzLnJhd05vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ID8gaGVpZ2h0IDogIjEwMCUiOworCXMucmF3Tm9kZS5jb29yZHNpemUgPSAod2lkdGggJiYgaGVpZ2h0KSA/IChwYXJzZUZsb2F0KHdpZHRoKSArICIgIiArIHBhcnNlRmxvYXQoaGVpZ2h0KSkgOiAiMTAwJSAxMDAlIjsKKwlzLnJhd05vZGUuY29vcmRvcmlnaW4gPSAiMCAwIjsKKwlkb2pvLmJ5SWQocGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQocy5yYXdOb2RlKTsKKwlyZXR1cm4gczsKK307Citkb2pvLmdmeC5hdHRhY2hTdXJmYWNlID0gZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgcyA9IG5ldyBkb2pvLmdmeC5TdXJmYWNlKCk7CisJcy5yYXdOb2RlID0gbm9kZTsKKwlyZXR1cm4gczsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9Db2xvcnNwYWNlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dyYXBoaWNzL0NvbG9yc3BhY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5YTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9Db2xvcnNwYWNlLmpzCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uZ3JhcGhpY3MuQ29sb3JzcGFjZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5Db2xvcnNwYWNlIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuQ29sb3JzcGFjZTogdXNlIGRvam8uZ2Z4LkNvbG9yc3BhY2UgaW5zdGVhZC4iLCAiMC41Iik7Citkb2pvLmdyYXBoaWNzLkNvbG9yc3BhY2UgPSBkb2pvLmdmeC5Db2xvcnNwYWNlOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ3JhcGhpY3MvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ3JhcGhpY3MvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiNjBjMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmdyYXBoaWNzLioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dyYXBoaWNzL2NvbG9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dyYXBoaWNzL2NvbG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmRjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvZ3JhcGhpY3MvY29sb3IuanMKQEAgLTAsMCArMSwzOCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ncmFwaGljcy5jb2xvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5jb2xvciIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmdyYXBoaWNzLmNvbG9yLkNvbG9yIGlzIG5vdyBkb2pvLmdmeC5jb2xvci5Db2xvci4iLCAiMC41Iik7Citkb2pvLmdyYXBoaWNzLmNvbG9yLkNvbG9yID0gZG9qby5nZnguY29sb3IuQ29sb3I7Citkb2pvLmdyYXBoaWNzLmNvbG9yLm5hbWVkID0gZG9qby5nZnguY29sb3IubmFtZWQ7Citkb2pvLmdyYXBoaWNzLmNvbG9yLmJsZW5kID0gZnVuY3Rpb24gKGEsIGIsIHdlaWdodCkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5ncmFwaGljcy5jb2xvci5ibGVuZCBpcyBub3cgZG9qby5nZnguY29sb3IuYmxlbmQiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmJsZW5kKGEsIGIsIHdlaWdodCk7Cit9OworZG9qby5ncmFwaGljcy5jb2xvci5ibGVuZEhleCA9IGZ1bmN0aW9uIChhLCBiLCB3ZWlnaHQpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IuYmxlbmRIZXggaXMgbm93IGRvam8uZ2Z4LmNvbG9yLmJsZW5kSGV4IiwgIjAuNSIpOworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4KGRvam8uZ2Z4LmNvbG9yLmJsZW5kKGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoYSksIGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoYiksIHdlaWdodCkpOworfTsKK2Rvam8uZ3JhcGhpY3MuY29sb3IuZXh0cmFjdFJHQiA9IGZ1bmN0aW9uIChjb2xvcikgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5ncmFwaGljcy5jb2xvci5leHRyYWN0UkdCIGlzIG5vdyBkb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCIiwgIjAuNSIpOworCXJldHVybiBkb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCKGNvbG9yKTsKK307Citkb2pvLmdyYXBoaWNzLmNvbG9yLmhleDJyZ2IgPSBmdW5jdGlvbiAoaGV4KSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmdyYXBoaWNzLmNvbG9yLmhleDJyZ2IgaXMgbm93IGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoaGV4KTsKK307Citkb2pvLmdyYXBoaWNzLmNvbG9yLnJnYjJoZXggPSBmdW5jdGlvbiAociwgZywgYikgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5ncmFwaGljcy5jb2xvci5yZ2IyaGV4IGlzIG5vdyBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4IiwgIjAuNSIpOworCXJldHVybiBkb2pvLmdmeC5jb2xvci5yZ2IyaGV4OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dyYXBoaWNzL2NvbG9yL2hzbC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9jb2xvci9oc2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMmI1MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9jb2xvci9oc2wuanMKQEAgLTAsMCArMSwzMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ncmFwaGljcy5jb2xvci5oc2wiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IuaHNsIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IuaHNsIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggZG9qby5nZnguY29sb3IuaHNsIiwgIjAuNSIpOworZG9qby5ncmFwaGljcy5jb2xvci5yZ2IyaHNsID0gZnVuY3Rpb24gKHIsIGcsIGIpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IucmdiMmhzbCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGRvam8uZ2Z4LmNvbG9yLnJnYjJoc2wiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoc2wociwgZywgYik7Cit9OworZG9qby5ncmFwaGljcy5jb2xvci5oc2wycmdiID0gZnVuY3Rpb24gKGgsIHMsIGwpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IuaHNsMnJnYiBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGRvam8uZ2Z4LmNvbG9yLmhzbDJyZ2IiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmhzbDJyZ2IoaCwgcywgbCk7Cit9OworZG9qby5ncmFwaGljcy5jb2xvci5oc2wyaGV4ID0gZnVuY3Rpb24gKGgsIHMsIGwpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IuaHNsMmhleCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGRvam8uZ2Z4LmNvbG9yLmhzbDJoZXgiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmhzbDJoZXgoaCwgcywgbCk7Cit9OworZG9qby5ncmFwaGljcy5jb2xvci5oZXgyaHNsID0gZnVuY3Rpb24gKGhleCkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5ncmFwaGljcy5jb2xvci5oZXgyaHNsIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggZG9qby5nZnguY29sb3IuaGV4MmhzbCIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5nZnguY29sb3IuaGV4MmhzbChoZXgpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2dyYXBoaWNzL2NvbG9yL2hzdi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9jb2xvci9oc3YuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZTU3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ncmFwaGljcy9jb2xvci9oc3YuanMKQEAgLTAsMCArMSwyNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ncmFwaGljcy5jb2xvci5oc3YiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IuaHN2Iik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uZ3JhcGhpY3MuY29sb3IuaHN2IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGRvam8uZ2Z4LmNvbG9yLmhzdiIsICIwLjUiKTsKK2Rvam8uZ3JhcGhpY3MuY29sb3IucmdiMmhzdiA9IGZ1bmN0aW9uIChyLCBnLCBiKSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmdyYXBoaWNzLmNvbG9yLnJnYjJoc3YgaGFzIGJlZW4gcmVwbGFjZWQgYnkgZG9qby5nZnguY29sb3IucmdiMmhzdiIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5nZnguY29sb3IucmdiMmhzdihyLCBnLCBiKTsKK307Citkb2pvLmdyYXBoaWNzLmNvbG9yLmhzdjJyZ2IgPSBmdW5jdGlvbiAoaCwgcywgdikgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5ncmFwaGljcy5jb2xvci5oc3YycmdiIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGRvam8uZ2Z4LmNvbG9yLmhzdjJyZ2IiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLmhzdjJyZ2IoaCwgcywgdik7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaG9zdGVudl9hZG9iZXN2Zy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2Fkb2Jlc3ZnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzJkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaG9zdGVudl9hZG9iZXN2Zy5qcwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2lmICh0eXBlb2Ygd2luZG93ID09ICJ1bmRlZmluZWQiKSB7CisJZG9qby5yYWlzZSgiYXR0ZW1wdCB0byB1c2UgYWRvYmUgc3ZnIGhvc3RlbnYgd2hlbiBubyB3aW5kb3cgb2JqZWN0Iik7Cit9Cit3aXRoIChkb2pvLnJlbmRlcikgeworCW5hbWUgPSBuYXZpZ2F0b3IuYXBwTmFtZTsKKwl2ZXIgPSBwYXJzZUZsb2F0KG5hdmlnYXRvci5hcHBWZXJzaW9uLCAxMCk7CisJc3dpdGNoIChuYXZpZ2F0b3IucGxhdGZvcm0pIHsKKwkgIGNhc2UgIk1hY09TIjoKKwkJb3Mub3N4ID0gdHJ1ZTsKKwkJYnJlYWs7CisJICBjYXNlICJMaW51eCI6CisJCW9zLmxpbnV4ID0gdHJ1ZTsKKwkJYnJlYWs7CisJICBjYXNlICJXaW5kb3dzIjoKKwkJb3Mud2luID0gdHJ1ZTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlvcy5saW51eCA9IHRydWU7CisJCWJyZWFrOworCX0KKwlzdmcuY2FwYWJsZSA9IHRydWU7CisJc3ZnLnN1cHBvcnQuYnVpbHRpbiA9IHRydWU7CisJc3ZnLmFkb2JlID0gdHJ1ZTsKK30KK2Rvam8uaG9zdGVudi5wcmludGxuID0gZnVuY3Rpb24gKHMpIHsKKwl0cnkgeworCQl2YXIgdGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0Iik7CisJCXRpLnNldEF0dHJpYnV0ZSgieCIsICI1MCIpOworCQl2YXIgeVBvcyA9IDI1ICsgMTUgKiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGV4dCIpLmxlbmd0aDsKKwkJdGkuc2V0QXR0cmlidXRlKCJ5IiwgeVBvcyk7CisJCXZhciB0biA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMpOworCQl0aS5hcHBlbmRDaGlsZCh0bik7CisJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aSk7CisJfQorCWNhdGNoIChlKSB7CisJfQorfTsKK2Rvam8uZGVidWcgPSBmdW5jdGlvbiAoKSB7CisJaWYgKCFkakNvbmZpZy5pc0RlYnVnKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGFyZ3MgPSBhcmd1bWVudHM7CisJaWYgKHR5cGVvZiBkb2pvLmhvc3RlbnYucHJpbnRsbiAhPSAiZnVuY3Rpb24iKSB7CisJCWRvam8ucmFpc2UoImF0dGVtcHQgdG8gY2FsbCBkb2pvLmRlYnVnIHdoZW4gdGhlcmUgaXMgbm8gZG9qby5ob3N0ZW52IHByaW50bG4gaW1wbGVtZW50YXRpb24gKHlldD8pIik7CisJfQorCXZhciBpc0pVTSA9IGRqX2dsb2JhbFsianVtIl07CisJdmFyIHMgPSBpc0pVTSA/ICIiIDogIkRFQlVHOiAiOworCWZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworCQlzICs9IGFyZ3NbaV07CisJfQorCWlmIChpc0pVTSkgeworCQlqdW0uZGVidWcocyk7CisJfSBlbHNlIHsKKwkJZG9qby5ob3N0ZW52LnByaW50bG4ocyk7CisJfQorfTsKK2Rvam8uaG9zdGVudi5zdGFydFBhY2thZ2UoImRvam8uaG9zdGVudiIpOworZG9qby5ob3N0ZW52Lm5hbWVfID0gImFkb2Jlc3ZnIjsKK2Rvam8uaG9zdGVudi5hbm9uQ3RyID0gMDsKK2Rvam8uaG9zdGVudi5hbm9uID0ge307Citkb2pvLmhvc3RlbnYubmFtZUFub25GdW5jID0gZnVuY3Rpb24gKGFub25GdW5jUHRyLCBuYW1lc3BhY2VPYmopIHsKKwl2YXIgcmV0ID0gIl8iICsgdGhpcy5hbm9uQ3RyKys7CisJdmFyIG5zbyA9IChuYW1lc3BhY2VPYmogfHwgdGhpcy5hbm9uKTsKKwl3aGlsZSAodHlwZW9mIG5zb1tyZXRdICE9ICJ1bmRlZmluZWQiKSB7CisJCXJldCA9ICJfIiArIHRoaXMuYW5vbkN0cisrOworCX0KKwluc29bcmV0XSA9IGFub25GdW5jUHRyOworCXJldHVybiByZXQ7Cit9OworZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWRGaXJlZCA9IGZhbHNlOworZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMgPSBbXTsKK2Rvam8uaG9zdGVudi5nZXRUZXh0U3RhY2sgPSBbXTsKK2Rvam8uaG9zdGVudi5sb2FkVXJpU3RhY2sgPSBbXTsKK2Rvam8uaG9zdGVudi5sb2FkZWRVcmlzID0gW107Citkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5tb2R1bGVzTG9hZGVkRmlyZWQpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHRoaXMubG9hZFVyaVN0YWNrLmxlbmd0aCA9PSAwKSAmJiAodGhpcy5nZXRUZXh0U3RhY2subGVuZ3RoID09IDApKSB7CisJCWlmICh0aGlzLmluRmxpZ2h0Q291bnQgPiAwKSB7CisJCQlkb2pvLmRlYnVnKCJjb3VsZG4ndCBpbml0aWFsaXplLCB0aGVyZSBhcmUgZmlsZXMgc3RpbGwgaW4gZmxpZ2h0Iik7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5tb2R1bGVzTG9hZGVkRmlyZWQgPSB0cnVlOworCQl2YXIgbWxsID0gdGhpcy5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzOworCQlmb3IgKHZhciB4ID0gMDsgeCA8IG1sbC5sZW5ndGg7IHgrKykgeworCQkJbWxsW3hdKCk7CisJCX0KKwl9Cit9OworZG9qby5ob3N0ZW52LmdldE5ld0Fub25GdW5jID0gZnVuY3Rpb24gKCkgeworCXZhciByZXQgPSAiXyIgKyB0aGlzLmFub25DdHIrKzsKKwl3aGlsZSAodHlwZW9mIHRoaXMuYW5vbltyZXRdICE9ICJ1bmRlZmluZWQiKSB7CisJCXJldCA9ICJfIiArIHRoaXMuYW5vbkN0cisrOworCX0KKwlldmFsKCJkb2pvLm5vc3RlbnYuYW5vbi4iICsgcmV0ICsgIiA9IGZ1bmN0aW9uKCl7fTsiKTsKKwlyZXR1cm4gW3JldCwgdGhpcy5hbm9uW3JldF1dOworfTsKK2Rvam8uaG9zdGVudi5kaXNwbGF5U3RhY2sgPSBmdW5jdGlvbiAoKSB7CisJdmFyIG9hID0gW107CisJdmFyIHN0YWNrID0gdGhpcy5sb2FkVXJpU3RhY2s7CisJZm9yICh2YXIgeCA9IDA7IHggPCBzdGFjay5sZW5ndGg7IHgrKykgeworCQlvYS51bnNoaWZ0KFtzdGFja1t4XVswXSwgKHR5cGVvZiBzdGFja1t4XVsyXSldKTsKKwl9CisJZG9qby5kZWJ1ZygiPHByZT4iICsgb2Euam9pbigiXG4iKSArICI8L3ByZT4iKTsKK307Citkb2pvLmhvc3RlbnYudW53aW5kVXJpU3RhY2sgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHN0YWNrID0gdGhpcy5sb2FkVXJpU3RhY2s7CisJZm9yICh2YXIgeCBpbiBkb2pvLmhvc3RlbnYubG9hZGVkVXJpcykgeworCQlmb3IgKHZhciB5ID0gc3RhY2subGVuZ3RoIC0gMTsgeSA+PSAwOyB5LS0pIHsKKwkJCWlmIChzdGFja1t5XVswXSA9PSB4KSB7CisJCQkJc3RhY2suc3BsaWNlKHksIDEpOworCQkJfQorCQl9CisJfQorCXZhciBuZXh0ID0gc3RhY2sucG9wKCk7CisJaWYgKCghbmV4dCkgJiYgKHN0YWNrLmxlbmd0aCA9PSAwKSkgeworCQlyZXR1cm47CisJfQorCWZvciAodmFyIHggPSAwOyB4IDwgc3RhY2subGVuZ3RoOyB4KyspIHsKKwkJaWYgKChzdGFja1t4XVswXSA9PSBuZXh0WzBdKSAmJiAoc3RhY2tbeF1bMl0pKSB7CisJCQluZXh0WzJdID09IHN0YWNrW3hdWzJdOworCQl9CisJfQorCXZhciBsYXN0ID0gbmV4dDsKKwl3aGlsZSAoZG9qby5ob3N0ZW52LmxvYWRlZFVyaXNbbmV4dFswXV0pIHsKKwkJbGFzdCA9IG5leHQ7CisJCW5leHQgPSBzdGFjay5wb3AoKTsKKwl9CisJd2hpbGUgKHR5cGVvZiBuZXh0WzJdID09ICJzdHJpbmciKSB7CisJCXRyeSB7CisJCQlkal9ldmFsKG5leHRbMl0pOworCQkJbmV4dFsxXSh0cnVlKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQkJZG9qby5kZWJ1Zygid2UgZ290IGFuIGVycm9yIHdoZW4gbG9hZGluZyAiICsgbmV4dFswXSk7CisJCQlkb2pvLmRlYnVnKCJlcnJvcjogIiArIGUpOworCQl9CisJCWRvam8uaG9zdGVudi5sb2FkZWRVcmlzW25leHRbMF1dID0gdHJ1ZTsKKwkJZG9qby5ob3N0ZW52LmxvYWRlZFVyaXMucHVzaChuZXh0WzBdKTsKKwkJbGFzdCA9IG5leHQ7CisJCW5leHQgPSBzdGFjay5wb3AoKTsKKwkJaWYgKCghbmV4dCkgJiYgKHN0YWNrLmxlbmd0aCA9PSAwKSkgeworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKGRvam8uaG9zdGVudi5sb2FkZWRVcmlzW25leHRbMF1dKSB7CisJCQlsYXN0ID0gbmV4dDsKKwkJCW5leHQgPSBzdGFjay5wb3AoKTsKKwkJfQorCX0KKwlpZiAobmV4dCkgeworCQlzdGFjay5wdXNoKG5leHQpOworCQlkb2pvLmRlYnVnKCIjIyMgQ0hPS0VEIE9OOiAiICsgbmV4dFswXSk7CisJfQorfTsKK2Rvam8uaG9zdGVudi5sb2FkVXJpID0gZnVuY3Rpb24gKHVyaSwgY2IpIHsKKwlpZiAoZG9qby5ob3N0ZW52LmxvYWRlZFVyaXNbdXJpXSkgeworCQlyZXR1cm47CisJfQorCXZhciBzdGFjayA9IHRoaXMubG9hZFVyaVN0YWNrOworCXN0YWNrLnB1c2goW3VyaSwgY2IsIG51bGxdKTsKKwl2YXIgdGNiID0gZnVuY3Rpb24gKGNvbnRlbnRzKSB7CisJCWlmIChjb250ZW50cy5jb250ZW50KSB7CisJCQljb250ZW50cyA9IGNvbnRlbnRzLmNvbnRlbnQ7CisJCX0KKwkJdmFyIG5leHQgPSBzdGFjay5wb3AoKTsKKwkJaWYgKCghbmV4dCkgJiYgKHN0YWNrLmxlbmd0aCA9PSAwKSkgeworCQkJZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWQoKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodHlwZW9mIGNvbnRlbnRzID09ICJzdHJpbmciKSB7CisJCQlzdGFjay5wdXNoKG5leHQpOworCQkJZm9yICh2YXIgeCA9IDA7IHggPCBzdGFjay5sZW5ndGg7IHgrKykgeworCQkJCWlmIChzdGFja1t4XVswXSA9PSB1cmkpIHsKKwkJCQkJc3RhY2tbeF1bMl0gPSBjb250ZW50czsKKwkJCQl9CisJCQl9CisJCQluZXh0ID0gc3RhY2sucG9wKCk7CisJCX0KKwkJaWYgKGRvam8uaG9zdGVudi5sb2FkZWRVcmlzW25leHRbMF1dKSB7CisJCQlkb2pvLmhvc3RlbnYudW53aW5kVXJpU3RhY2soKTsKKwkJCXJldHVybjsKKwkJfQorCQlzdGFjay5wdXNoKG5leHQpOworCQlpZiAobmV4dFswXSAhPSB1cmkpIHsKKwkJCWlmICh0eXBlb2YgbmV4dFsyXSA9PSAic3RyaW5nIikgeworCQkJCWRvam8uaG9zdGVudi51bndpbmRVcmlTdGFjaygpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFjb250ZW50cykgeworCQkJCW5leHRbMV0oZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgZGVwcyA9IGRvam8uaG9zdGVudi5nZXREZXBzRm9yRXZhbChuZXh0WzJdKTsKKwkJCQlpZiAoZGVwcy5sZW5ndGggPiAwKSB7CisJCQkJCWV2YWwoZGVwcy5qb2luKCI7IikpOworCQkJCX0gZWxzZSB7CisJCQkJCWRvam8uaG9zdGVudi51bndpbmRVcmlTdGFjaygpOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisJdGhpcy5nZXRUZXh0KHVyaSwgdGNiLCB0cnVlKTsKK307Citkb2pvLmhvc3RlbnYubG9hZE1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGVuYW1lLCBleGFjdF9vbmx5LCBvbWl0X21vZHVsZV9jaGVjaykgeworCXZhciBtb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlbmFtZSwgMCk7CisJaWYgKG1vZHVsZSkgeworCQlyZXR1cm4gbW9kdWxlOworCX0KKwlpZiAodHlwZW9mIHRoaXMubG9hZGluZ19tb2R1bGVzX1ttb2R1bGVuYW1lXSAhPT0gInVuZGVmaW5lZCIpIHsKKwkJZG9qby5kZWJ1ZygicmVjdXJzaXZlIGF0dGVtcHQgdG8gbG9hZCBtb2R1bGUgJyIgKyBtb2R1bGVuYW1lICsgIiciKTsKKwl9IGVsc2UgeworCQl0aGlzLmFkZGVkVG9Mb2FkaW5nQ291bnQucHVzaChtb2R1bGVuYW1lKTsKKwl9CisJdGhpcy5sb2FkaW5nX21vZHVsZXNfW21vZHVsZW5hbWVdID0gMTsKKwl2YXIgcmVscGF0aCA9IG1vZHVsZW5hbWUucmVwbGFjZSgvXC4vZywgIi8iKSArICIuanMiOworCXZhciBzeW1zID0gbW9kdWxlbmFtZS5zcGxpdCgiLiIpOworCXZhciBuc3ltcyA9IG1vZHVsZW5hbWUuc3BsaXQoIi4iKTsKKwlpZiAoc3ltc1swXSA9PSAiZG9qbyIpIHsKKwkJc3ltc1swXSA9ICJzcmMiOworCX0KKwl2YXIgbGFzdCA9IHN5bXMucG9wKCk7CisJc3ltcy5wdXNoKGxhc3QpOworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIHBmbiA9IHRoaXMucGtnRmlsZU5hbWU7CisJaWYgKGxhc3QgPT0gIioiKSB7CisJCW1vZHVsZW5hbWUgPSAobnN5bXMuc2xpY2UoMCwgLTEpKS5qb2luKCIuIik7CisJCXZhciBtb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlbmFtZSwgMCk7CisJCWlmIChtb2R1bGUpIHsKKwkJCV90aGlzLnJlbW92ZWRGcm9tTG9hZGluZ0NvdW50LnB1c2gobW9kdWxlbmFtZSk7CisJCQlyZXR1cm4gbW9kdWxlOworCQl9CisJCXZhciBuZXh0VHJ5ID0gZnVuY3Rpb24gKGxhc3RTdGF0dXMpIHsKKwkJCWlmIChsYXN0U3RhdHVzKSB7CisJCQkJbW9kdWxlID0gX3RoaXMuZmluZE1vZHVsZShtb2R1bGVuYW1lLCBmYWxzZSk7CisJCQkJaWYgKCghbW9kdWxlKSAmJiAoc3ltc1tzeW1zLmxlbmd0aCAtIDFdICE9IHBmbikpIHsKKwkJCQkJZG9qby5yYWlzZSgiTW9kdWxlIHN5bWJvbCAnIiArIG1vZHVsZW5hbWUgKyAiJyBpcyBub3QgZGVmaW5lZCBhZnRlciBsb2FkaW5nICciICsgcmVscGF0aCArICInIik7CisJCQkJfQorCQkJCWlmIChtb2R1bGUpIHsKKwkJCQkJX3RoaXMucmVtb3ZlZEZyb21Mb2FkaW5nQ291bnQucHVzaChtb2R1bGVuYW1lKTsKKwkJCQkJZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWQoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXN5bXMucG9wKCk7CisJCQlzeW1zLnB1c2gocGZuKTsKKwkJCXJlbHBhdGggPSBzeW1zLmpvaW4oIi8iKSArICIuanMiOworCQkJaWYgKHJlbHBhdGguY2hhckF0KDApID09ICIvIikgeworCQkJCXJlbHBhdGggPSByZWxwYXRoLnNsaWNlKDEpOworCQkJfQorCQkJX3RoaXMubG9hZFBhdGgocmVscGF0aCwgKCghb21pdF9tb2R1bGVfY2hlY2spID8gbW9kdWxlbmFtZSA6IG51bGwpLCBuZXh0VHJ5KTsKKwkJfTsKKwkJbmV4dFRyeSgpOworCX0gZWxzZSB7CisJCXJlbHBhdGggPSBzeW1zLmpvaW4oIi8iKSArICIuanMiOworCQltb2R1bGVuYW1lID0gbnN5bXMuam9pbigiLiIpOworCQl2YXIgbmV4dFRyeSA9IGZ1bmN0aW9uIChsYXN0U3RhdHVzKSB7CisJCQlpZiAobGFzdFN0YXR1cykgeworCQkJCW1vZHVsZSA9IF90aGlzLmZpbmRNb2R1bGUobW9kdWxlbmFtZSwgZmFsc2UpOworCQkJCWlmICgoIW1vZHVsZSkgJiYgKHN5bXNbc3ltcy5sZW5ndGggLSAxXSAhPSBwZm4pKSB7CisJCQkJCWRvam8ucmFpc2UoIk1vZHVsZSBzeW1ib2wgJyIgKyBtb2R1bGVuYW1lICsgIicgaXMgbm90IGRlZmluZWQgYWZ0ZXIgbG9hZGluZyAnIiArIHJlbHBhdGggKyAiJyIpOworCQkJCX0KKwkJCQlpZiAobW9kdWxlKSB7CisJCQkJCV90aGlzLnJlbW92ZWRGcm9tTG9hZGluZ0NvdW50LnB1c2gobW9kdWxlbmFtZSk7CisJCQkJCWRvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkKCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQl2YXIgc2V0UEtHID0gKHN5bXNbc3ltcy5sZW5ndGggLSAxXSA9PSBwZm4pID8gZmFsc2UgOiB0cnVlOworCQkJc3ltcy5wb3AoKTsKKwkJCWlmIChzZXRQS0cpIHsKKwkJCQlzeW1zLnB1c2gocGZuKTsKKwkJCX0KKwkJCXJlbHBhdGggPSBzeW1zLmpvaW4oIi8iKSArICIuanMiOworCQkJaWYgKHJlbHBhdGguY2hhckF0KDApID09ICIvIikgeworCQkJCXJlbHBhdGggPSByZWxwYXRoLnNsaWNlKDEpOworCQkJfQorCQkJX3RoaXMubG9hZFBhdGgocmVscGF0aCwgKCghb21pdF9tb2R1bGVfY2hlY2spID8gbW9kdWxlbmFtZSA6IG51bGwpLCBuZXh0VHJ5KTsKKwkJfTsKKwkJdGhpcy5sb2FkUGF0aChyZWxwYXRoLCAoKCFvbWl0X21vZHVsZV9jaGVjaykgPyBtb2R1bGVuYW1lIDogbnVsbCksIG5leHRUcnkpOworCX0KKwlyZXR1cm47Cit9OworZG9qby5ob3N0ZW52LmFzeW5jX2NiID0gbnVsbDsKK2Rvam8uaG9zdGVudi51bldpbmRHZXRUZXh0U3RhY2sgPSBmdW5jdGlvbiAoKSB7CisJaWYgKGRvam8uaG9zdGVudi5pbkZsaWdodENvdW50ID4gMCkgeworCQlzZXRUaW1lb3V0KCJkb2pvLmhvc3RlbnYudW5XaW5kR2V0VGV4dFN0YWNrKCkiLCAxMDApOworCQlyZXR1cm47CisJfQorCWRvam8uaG9zdGVudi5pbkZsaWdodENvdW50Kys7CisJdmFyIG5leHQgPSBkb2pvLmhvc3RlbnYuZ2V0VGV4dFN0YWNrLnBvcCgpOworCWlmICgoIW5leHQpICYmIChkb2pvLmhvc3RlbnYuZ2V0VGV4dFN0YWNrLmxlbmd0aCA9PSAwKSkgeworCQlkb2pvLmhvc3RlbnYuaW5GbGlnaHRDb3VudC0tOworCQlkb2pvLmhvc3RlbnYuYXN5bmNfY2IgPSBmdW5jdGlvbiAoKSB7CisJCX07CisJCXJldHVybjsKKwl9CisJZG9qby5ob3N0ZW52LmFzeW5jX2NiID0gbmV4dFsxXTsKKwl3aW5kb3cuZ2V0VVJMKG5leHRbMF0sIGZ1bmN0aW9uIChyZXN1bHQpIHsKKwkJZG9qby5ob3N0ZW52LmluRmxpZ2h0Q291bnQtLTsKKwkJZG9qby5ob3N0ZW52LmFzeW5jX2NiKHJlc3VsdC5jb250ZW50KTsKKwkJZG9qby5ob3N0ZW52LnVuV2luZEdldFRleHRTdGFjaygpOworCX0pOworfTsKK2Rvam8uaG9zdGVudi5nZXRUZXh0ID0gZnVuY3Rpb24gKHVyaSwgYXN5bmNfY2IsIGZhaWxfb2spIHsKKwl0cnkgeworCQlpZiAoYXN5bmNfY2IpIHsKKwkJCWRvam8uaG9zdGVudi5nZXRUZXh0U3RhY2sucHVzaChbdXJpLCBhc3luY19jYiwgZmFpbF9va10pOworCQkJZG9qby5ob3N0ZW52LnVuV2luZEdldFRleHRTdGFjaygpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGRvam8ucmFpc2UoIk5vIHN5bmNocm9ub3VzIFhNTEhUVFAgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLCBmb3IgdXJpICIgKyB1cmkpOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJCXJldHVybiBkb2pvLnJhaXNlKCJObyBYTUxIVFRQIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSwgZm9yIHVyaSAiICsgdXJpKTsKKwl9Cit9OworZG9qby5ob3N0ZW52LnBvc3RUZXh0ID0gZnVuY3Rpb24gKHVyaSwgYXN5bmNfY2IsIHRleHQsIGZhaWxfb2ssIG1pbWVfdHlwZSwgZW5jb2RpbmcpIHsKKwl2YXIgaHR0cCA9IG51bGw7CisJdmFyIGFzeW5jX2NhbGxiYWNrID0gZnVuY3Rpb24gKGh0dHBSZXNwb25zZSkgeworCQlpZiAoIWh0dHBSZXNwb25zZS5zdWNjZXNzKSB7CisJCQlkb2pvLnJhaXNlKCJSZXF1ZXN0IGZvciB1cmkgJyIgKyB1cmkgKyAiJyByZXN1bHRlZCBpbiAiICsgaHR0cFJlc3BvbnNlLnN0YXR1cyk7CisJCX0KKwkJaWYgKCFodHRwUmVzcG9uc2UuY29udGVudCkgeworCQkJaWYgKCFmYWlsX29rKSB7CisJCQkJZG9qby5yYWlzZSgiUmVxdWVzdCBmb3IgdXJpICciICsgdXJpICsgIicgcmVzdWx0ZWQgaW4gbm8gY29udGVudCIpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJYXN5bmNfY2IoaHR0cFJlc3BvbnNlLmNvbnRlbnQpOworCX07CisJdHJ5IHsKKwkJaWYgKGFzeW5jX2NiKSB7CisJCQlodHRwID0gd2luZG93LnBvc3RVUkwodXJpLCB0ZXh0LCBhc3luY19jYWxsYmFjaywgbWltZVR5cGUsIGVuY29kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkb2pvLnJhaXNlKCJObyBzeW5jaHJvbm91cyBYTUxIVFRQIHBvc3QgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLCBmb3IgdXJpICIgKyB1cmkpOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJCXJldHVybiBkb2pvLnJhaXNlKCJObyBYTUxIVFRQIHBvc3QgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLCBmb3IgdXJpICIgKyB1cmkpOworCX0KK307CitmdW5jdGlvbiBkal9sYXN0X3NjcmlwdF9zcmMoKSB7CisJdmFyIHNjcmlwdHMgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOworCWlmIChzY3JpcHRzLmxlbmd0aCA8IDEpIHsKKwkJZG9qby5yYWlzZSgiTm8gc2NyaXB0IGVsZW1lbnRzIGluIHdpbmRvdy5kb2N1bWVudCwgc28gY2FuJ3QgZmlndXJlIG91dCBteSBzY3JpcHQgc3JjIik7CisJfQorCXZhciBsaSA9IHNjcmlwdHMubGVuZ3RoIC0gMTsKKwl2YXIgeGxpbmtOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIjsKKwl2YXIgc3JjID0gbnVsbDsKKwl2YXIgc2NyaXB0ID0gbnVsbDsKKwl3aGlsZSAoIXNyYykgeworCQlzY3JpcHQgPSBzY3JpcHRzLml0ZW0obGkpOworCQlzcmMgPSBzY3JpcHQuZ2V0QXR0cmlidXRlTlMoeGxpbmtOUywgImhyZWYiKTsKKwkJbGktLTsKKwkJaWYgKGxpIDwgMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzcmMpIHsKKwkJZG9qby5yYWlzZSgiTGFzdCBzY3JpcHQgZWxlbWVudCAob3V0IG9mICIgKyBzY3JpcHRzLmxlbmd0aCArICIpIGhhcyBubyBzcmMiKTsKKwl9CisJcmV0dXJuIHNyYzsKK30KK2lmICghZG9qby5ob3N0ZW52WyJsaWJyYXJ5X3NjcmlwdF91cmlfIl0pIHsKKwlkb2pvLmhvc3RlbnYubGlicmFyeV9zY3JpcHRfdXJpXyA9IGRqX2xhc3Rfc2NyaXB0X3NyYygpOworfQorZG9qby5yZXF1aXJlSWYoKGRqQ29uZmlnWyJpc0RlYnVnIl0gfHwgZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdKSwgImRvam8uZGVidWciKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfYnJvd3Nlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2Jyb3dzZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNGQyNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2Jyb3dzZXIuanMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitpZiAodHlwZW9mIHdpbmRvdyAhPSAidW5kZWZpbmVkIikgeworCShmdW5jdGlvbiAoKSB7CisJCWlmIChkakNvbmZpZy5hbGxvd1F1ZXJ5Q29uZmlnKSB7CisJCQl2YXIgYmFzZVVybCA9IGRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCk7CisJCQl2YXIgcGFyYW1zID0gYmFzZVVybC5zcGxpdCgiPyIsIDIpOworCQkJaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7CisJCQkJdmFyIHBhcmFtU3RyID0gcGFyYW1zWzFdOworCQkJCXZhciBwYWlycyA9IHBhcmFtU3RyLnNwbGl0KCImIik7CisJCQkJZm9yICh2YXIgeCBpbiBwYWlycykgeworCQkJCQl2YXIgc3AgPSBwYWlyc1t4XS5zcGxpdCgiPSIpOworCQkJCQlpZiAoKHNwWzBdLmxlbmd0aCA+IDkpICYmIChzcFswXS5zdWJzdHIoMCwgOSkgPT0gImRqQ29uZmlnLiIpKSB7CisJCQkJCQl2YXIgb3B0ID0gc3BbMF0uc3Vic3RyKDkpOworCQkJCQkJdHJ5IHsKKwkJCQkJCQlkakNvbmZpZ1tvcHRdID0gZXZhbChzcFsxXSk7CisJCQkJCQl9CisJCQkJCQljYXRjaCAoZSkgeworCQkJCQkJCWRqQ29uZmlnW29wdF0gPSBzcFsxXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoKChkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdID09ICIiKSB8fCAoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXSA9PSAiIikpICYmIChkb2N1bWVudCAmJiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkpIHsKKwkJCXZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOworCQkJdmFyIHJlUGtnID0gLyhfX3BhY2thZ2VfX3xkb2pvfGJvb3RzdHJhcDEpXC5qcyhbXD9cLl18JCkvaTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykgeworCQkJCXZhciBzcmMgPSBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSgic3JjIik7CisJCQkJaWYgKCFzcmMpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXZhciBtID0gc3JjLm1hdGNoKHJlUGtnKTsKKwkJCQlpZiAobSkgeworCQkJCQl2YXIgcm9vdCA9IHNyYy5zdWJzdHJpbmcoMCwgbS5pbmRleCk7CisJCQkJCWlmIChzcmMuaW5kZXhPZigiYm9vdHN0cmFwMSIpID4gLTEpIHsKKwkJCQkJCXJvb3QgKz0gIi4uLyI7CisJCQkJCX0KKwkJCQkJaWYgKCF0aGlzWyJkakNvbmZpZyJdKSB7CisJCQkJCQlkakNvbmZpZyA9IHt9OworCQkJCQl9CisJCQkJCWlmIChkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdID09ICIiKSB7CisJCQkJCQlkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdID0gcm9vdDsKKwkJCQkJfQorCQkJCQlpZiAoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXSA9PSAiIikgeworCQkJCQkJZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXSA9IHJvb3Q7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXZhciBkciA9IGRvam8ucmVuZGVyOworCQl2YXIgZHJoID0gZG9qby5yZW5kZXIuaHRtbDsKKwkJdmFyIGRycyA9IGRvam8ucmVuZGVyLnN2ZzsKKwkJdmFyIGR1YSA9IChkcmguVUEgPSBuYXZpZ2F0b3IudXNlckFnZW50KTsKKwkJdmFyIGRhdiA9IChkcmguQVYgPSBuYXZpZ2F0b3IuYXBwVmVyc2lvbik7CisJCXZhciB0ID0gdHJ1ZTsKKwkJdmFyIGYgPSBmYWxzZTsKKwkJZHJoLmNhcGFibGUgPSB0OworCQlkcmguc3VwcG9ydC5idWlsdGluID0gdDsKKwkJZHIudmVyID0gcGFyc2VGbG9hdChkcmguQVYpOworCQlkci5vcy5tYWMgPSBkYXYuaW5kZXhPZigiTWFjaW50b3NoIikgPj0gMDsKKwkJZHIub3Mud2luID0gZGF2LmluZGV4T2YoIldpbmRvd3MiKSA+PSAwOworCQlkci5vcy5saW51eCA9IGRhdi5pbmRleE9mKCJYMTEiKSA+PSAwOworCQlkcmgub3BlcmEgPSBkdWEuaW5kZXhPZigiT3BlcmEiKSA+PSAwOworCQlkcmgua2h0bWwgPSAoZGF2LmluZGV4T2YoIktvbnF1ZXJvciIpID49IDApIHx8IChkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMCk7CisJCWRyaC5zYWZhcmkgPSBkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMDsKKwkJdmFyIGdlY2tvUG9zID0gZHVhLmluZGV4T2YoIkdlY2tvIik7CisJCWRyaC5tb3ppbGxhID0gZHJoLm1veiA9IChnZWNrb1BvcyA+PSAwKSAmJiAoIWRyaC5raHRtbCk7CisJCWlmIChkcmgubW96aWxsYSkgeworCQkJZHJoLmdlY2tvVmVyc2lvbiA9IGR1YS5zdWJzdHJpbmcoZ2Vja29Qb3MgKyA2LCBnZWNrb1BvcyArIDE0KTsKKwkJfQorCQlkcmguaWUgPSAoZG9jdW1lbnQuYWxsKSAmJiAoIWRyaC5vcGVyYSk7CisJCWRyaC5pZTUwID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDUuMCIpID49IDA7CisJCWRyaC5pZTU1ID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDUuNSIpID49IDA7CisJCWRyaC5pZTYwID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDYuMCIpID49IDA7CisJCWRyaC5pZTcwID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDcuMCIpID49IDA7CisJCXZhciBjbSA9IGRvY3VtZW50WyJjb21wYXRNb2RlIl07CisJCWRyaC5xdWlya3MgPSAoY20gPT0gIkJhY2tDb21wYXQiKSB8fCAoY20gPT0gIlF1aXJrc01vZGUiKSB8fCBkcmguaWU1NSB8fCBkcmguaWU1MDsKKwkJZG9qby5sb2NhbGUgPSBkb2pvLmxvY2FsZSB8fCAoZHJoLmllID8gbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSA6IG5hdmlnYXRvci5sYW5ndWFnZSkudG9Mb3dlckNhc2UoKTsKKwkJZHIudm1sLmNhcGFibGUgPSBkcmguaWU7CisJCWRycy5jYXBhYmxlID0gZjsKKwkJZHJzLnN1cHBvcnQucGx1Z2luID0gZjsKKwkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IGY7CisJCXZhciB0ZG9jID0gd2luZG93WyJkb2N1bWVudCJdOworCQl2YXIgdGRpID0gdGRvY1siaW1wbGVtZW50YXRpb24iXTsKKwkJaWYgKCh0ZGkpICYmICh0ZGlbImhhc0ZlYXR1cmUiXSkgJiYgKHRkaS5oYXNGZWF0dXJlKCJvcmcudzNjLmRvbS5zdmciLCAiMS4wIikpKSB7CisJCQlkcnMuY2FwYWJsZSA9IHQ7CisJCQlkcnMuc3VwcG9ydC5idWlsdGluID0gdDsKKwkJCWRycy5zdXBwb3J0LnBsdWdpbiA9IGY7CisJCX0KKwkJaWYgKGRyaC5zYWZhcmkpIHsKKwkJCXZhciB0bXAgPSBkdWEuc3BsaXQoIkFwcGxlV2ViS2l0LyIpWzFdOworCQkJdmFyIHZlciA9IHBhcnNlRmxvYXQodG1wLnNwbGl0KCIgIilbMF0pOworCQkJaWYgKHZlciA+PSA0MjApIHsKKwkJCQlkcnMuY2FwYWJsZSA9IHQ7CisJCQkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IHQ7CisJCQkJZHJzLnN1cHBvcnQucGx1Z2luID0gZjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJfQorCX0pKCk7CisJZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSgiZG9qby5ob3N0ZW52Iik7CisJZG9qby5yZW5kZXIubmFtZSA9IGRvam8uaG9zdGVudi5uYW1lXyA9ICJicm93c2VyIjsKKwlkb2pvLmhvc3RlbnYuc2VhcmNoSWRzID0gW107CisJZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFMgPSBbIk1zeG1sMi5YTUxIVFRQIiwgIk1pY3Jvc29mdC5YTUxIVFRQIiwgIk1zeG1sMi5YTUxIVFRQLjQuMCJdOworCWRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0ID0gZnVuY3Rpb24gKCkgeworCQl2YXIgaHR0cCA9IG51bGw7CisJCXZhciBsYXN0X2UgPSBudWxsOworCQl0cnkgeworCQkJaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJaWYgKCFodHRwKSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IDM7ICsraSkgeworCQkJCXZhciBwcm9naWQgPSBkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEU1tpXTsKKwkJCQl0cnkgeworCQkJCQlodHRwID0gbmV3IEFjdGl2ZVhPYmplY3QocHJvZ2lkKTsKKwkJCQl9CisJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJbGFzdF9lID0gZTsKKwkJCQl9CisJCQkJaWYgKGh0dHApIHsKKwkJCQkJZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFMgPSBbcHJvZ2lkXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghaHR0cCkgeworCQkJcmV0dXJuIGRvam8ucmFpc2UoIlhNTEhUVFAgbm90IGF2YWlsYWJsZSIsIGxhc3RfZSk7CisJCX0KKwkJcmV0dXJuIGh0dHA7CisJfTsKKwlkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgPSBmYWxzZTsKKwlkb2pvLmhvc3RlbnYuZ2V0VGV4dCA9IGZ1bmN0aW9uICh1cmksIGFzeW5jX2NiLCBmYWlsX29rKSB7CisJCWlmICghYXN5bmNfY2IpIHsKKwkJCXRoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOworCQl9CisJCXZhciBodHRwID0gdGhpcy5nZXRYbWxodHRwT2JqZWN0KCk7CisJCWZ1bmN0aW9uIGlzRG9jdW1lbnRPayhodHRwKSB7CisJCQl2YXIgc3RhdCA9IGh0dHBbInN0YXR1cyJdOworCQkJcmV0dXJuIEJvb2xlYW4oKCFzdGF0KSB8fCAoKDIwMCA8PSBzdGF0KSAmJiAoMzAwID4gc3RhdCkpIHx8IChzdGF0ID09IDMwNCkpOworCQl9CisJCWlmIChhc3luY19jYikgeworCQkJdmFyIF90aGlzID0gdGhpcywgdGltZXIgPSBudWxsLCBnYmwgPSBkb2pvLmdsb2JhbCgpOworCQkJdmFyIHhociA9IGRvam8uZXZhbE9ialBhdGgoImRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydCIpOworCQkJaHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisJCQkJaWYgKHRpbWVyKSB7CisJCQkJCWdibC5jbGVhclRpbWVvdXQodGltZXIpOworCQkJCQl0aW1lciA9IG51bGw7CisJCQkJfQorCQkJCWlmIChfdGhpcy5fYmxvY2tBc3luYyB8fCAoeGhyICYmIHhoci5fYmxvY2tBc3luYykpIHsKKwkJCQkJdGltZXIgPSBnYmwuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisJCQkJCQlodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZS5hcHBseSh0aGlzKTsKKwkJCQkJfSwgMTApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICg0ID09IGh0dHAucmVhZHlTdGF0ZSkgeworCQkJCQkJaWYgKGlzRG9jdW1lbnRPayhodHRwKSkgeworCQkJCQkJCWFzeW5jX2NiKGh0dHAucmVzcG9uc2VUZXh0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCX0KKwkJaHR0cC5vcGVuKCJHRVQiLCB1cmksIGFzeW5jX2NiID8gdHJ1ZSA6IGZhbHNlKTsKKwkJdHJ5IHsKKwkJCWh0dHAuc2VuZChudWxsKTsKKwkJCWlmIChhc3luY19jYikgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKCFpc0RvY3VtZW50T2soaHR0cCkpIHsKKwkJCQl2YXIgZXJyID0gRXJyb3IoIlVuYWJsZSB0byBsb2FkICIgKyB1cmkgKyAiIHN0YXR1czoiICsgaHR0cC5zdGF0dXMpOworCQkJCWVyci5zdGF0dXMgPSBodHRwLnN0YXR1czsKKwkJCQllcnIucmVzcG9uc2VUZXh0ID0gaHR0cC5yZXNwb25zZVRleHQ7CisJCQkJdGhyb3cgZXJyOworCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCQl0aGlzLl9ibG9ja0FzeW5jID0gZmFsc2U7CisJCQlpZiAoKGZhaWxfb2spICYmICghYXN5bmNfY2IpKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGVsc2UgeworCQkJCXRocm93IGU7CisJCQl9CisJCX0KKwkJdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQlyZXR1cm4gaHR0cC5yZXNwb25zZVRleHQ7CisJfTsKKwlkb2pvLmhvc3RlbnYuZGVmYXVsdERlYnVnQ29udGFpbmVySWQgPSAiZG9qb0RlYnVnIjsKKwlkb2pvLmhvc3RlbnYuX3ByaW50bG5fYnVmZmVyID0gW107CisJZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmUgPSBmYWxzZTsKKwlkb2pvLmhvc3RlbnYucHJpbnRsbiA9IGZ1bmN0aW9uIChsaW5lKSB7CisJCWlmICghZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmUpIHsKKwkJCWRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIucHVzaChsaW5lKTsKKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJdmFyIGNvbnNvbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkakNvbmZpZy5kZWJ1Z0NvbnRhaW5lcklkID8gZGpDb25maWcuZGVidWdDb250YWluZXJJZCA6IGRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCk7CisJCQkJaWYgKCFjb25zb2xlKSB7CisJCQkJCWNvbnNvbGUgPSBkb2pvLmJvZHkoKTsKKwkJCQl9CisJCQkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7CisJCQkJY29uc29sZS5hcHBlbmRDaGlsZChkaXYpOworCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCQl0cnkgeworCQkJCQlkb2N1bWVudC53cml0ZSgiPGRpdj4iICsgbGluZSArICI8L2Rpdj4iKTsKKwkJCQl9CisJCQkJY2F0Y2ggKGUyKSB7CisJCQkJCXdpbmRvdy5zdGF0dXMgPSBsaW5lOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisJZG9qby5hZGRPbkxvYWQoZnVuY3Rpb24gKCkgeworCQlkb2pvLmhvc3RlbnYuX3ByaW50bG5fc2FmZSA9IHRydWU7CisJCXdoaWxlIChkb2pvLmhvc3RlbnYuX3ByaW50bG5fYnVmZmVyLmxlbmd0aCA+IDApIHsKKwkJCWRvam8uaG9zdGVudi5wcmludGxuKGRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIuc2hpZnQoKSk7CisJCX0KKwl9KTsKKwlmdW5jdGlvbiBkal9hZGROb2RlRXZ0SGRscihub2RlLCBldnROYW1lLCBmcCkgeworCQl2YXIgb2xkSGFuZGxlciA9IG5vZGVbIm9uIiArIGV2dE5hbWVdIHx8IGZ1bmN0aW9uICgpIHsKKwkJfTsKKwkJbm9kZVsib24iICsgZXZ0TmFtZV0gPSBmdW5jdGlvbiAoKSB7CisJCQlmcC5hcHBseShub2RlLCBhcmd1bWVudHMpOworCQkJb2xkSGFuZGxlci5hcHBseShub2RlLCBhcmd1bWVudHMpOworCQl9OworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZCA9IGZhbHNlOworCWZ1bmN0aW9uIGRqX2xvYWRfaW5pdChlKSB7CisJCWRvam8uaG9zdGVudi5fZGpJbml0RmlyZWQgPSB0cnVlOworCQl2YXIgdHlwZSA9IChlICYmIGUudHlwZSkgPyBlLnR5cGUudG9Mb3dlckNhc2UoKSA6ICJsb2FkIjsKKwkJaWYgKGFyZ3VtZW50cy5jYWxsZWUuaW5pdGlhbGl6ZWQgfHwgKHR5cGUgIT0gImRvbWNvbnRlbnRsb2FkZWQiICYmIHR5cGUgIT0gImxvYWQiKSkgeworCQkJcmV0dXJuOworCQl9CisJCWFyZ3VtZW50cy5jYWxsZWUuaW5pdGlhbGl6ZWQgPSB0cnVlOworCQlpZiAodHlwZW9mIChfdGltZXIpICE9ICJ1bmRlZmluZWQiKSB7CisJCQljbGVhckludGVydmFsKF90aW1lcik7CisJCQlkZWxldGUgX3RpbWVyOworCQl9CisJCXZhciBpbml0RnVuYyA9IGZ1bmN0aW9uICgpIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJZG9qby5ob3N0ZW52Lm1ha2VXaWRnZXRzKCk7CisJCQl9CisJCX07CisJCWlmIChkb2pvLmhvc3RlbnYuaW5GbGlnaHRDb3VudCA9PSAwKSB7CisJCQlpbml0RnVuYygpOworCQkJZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWQoKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnVuc2hpZnQoaW5pdEZ1bmMpOworCQl9CisJfQorCWlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CisJCWlmIChkb2pvLnJlbmRlci5odG1sLm9wZXJhIHx8IChkb2pvLnJlbmRlci5odG1sLm1veiAmJiAoZGpDb25maWdbImVuYWJsZU1vekRvbUNvbnRlbnRMb2FkZWQiXSA9PT0gdHJ1ZSkpKSB7CisJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZGpfbG9hZF9pbml0LCBudWxsKTsKKwkJfQorCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRqX2xvYWRfaW5pdCwgbnVsbCk7CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllICYmIGRvam8ucmVuZGVyLm9zLndpbikgeworCQlkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKKwkJCWlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpIHsKKwkJCQlkal9sb2FkX2luaXQoKTsKKwkJCX0KKwkJfSk7CisJfQorCWlmICgvKFdlYktpdHxraHRtbCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CisJCXZhciBfdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CisJCQlpZiAoL2xvYWRlZHxjb21wbGV0ZS8udGVzdChkb2N1bWVudC5yZWFkeVN0YXRlKSkgeworCQkJCWRqX2xvYWRfaW5pdCgpOworCQkJfQorCQl9LCAxMCk7CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWRqX2FkZE5vZGVFdnRIZGxyKHdpbmRvdywgImJlZm9yZXVubG9hZCIsIGZ1bmN0aW9uICgpIHsKKwkJCWRvam8uaG9zdGVudi5fdW5sb2FkaW5nID0gdHJ1ZTsKKwkJCXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKwkJCQlkb2pvLmhvc3RlbnYuX3VubG9hZGluZyA9IGZhbHNlOworCQkJfSwgMCk7CisJCX0pOworCX0KKwlkal9hZGROb2RlRXZ0SGRscih3aW5kb3csICJ1bmxvYWQiLCBmdW5jdGlvbiAoKSB7CisJCWRvam8uaG9zdGVudi51bmxvYWRlZCgpOworCQlpZiAoKCFkb2pvLnJlbmRlci5odG1sLmllKSB8fCAoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiBkb2pvLmhvc3RlbnYuX3VubG9hZGluZykpIHsKKwkJCWRvam8uaG9zdGVudi51bmxvYWRlZCgpOworCQl9CisJfSk7CisJZG9qby5ob3N0ZW52Lm1ha2VXaWRnZXRzID0gZnVuY3Rpb24gKCkgeworCQl2YXIgc2lkcyA9IFtdOworCQlpZiAoZGpDb25maWcuc2VhcmNoSWRzICYmIGRqQ29uZmlnLnNlYXJjaElkcy5sZW5ndGggPiAwKSB7CisJCQlzaWRzID0gc2lkcy5jb25jYXQoZGpDb25maWcuc2VhcmNoSWRzKTsKKwkJfQorCQlpZiAoZG9qby5ob3N0ZW52LnNlYXJjaElkcyAmJiBkb2pvLmhvc3RlbnYuc2VhcmNoSWRzLmxlbmd0aCA+IDApIHsKKwkJCXNpZHMgPSBzaWRzLmNvbmNhdChkb2pvLmhvc3RlbnYuc2VhcmNoSWRzKTsKKwkJfQorCQlpZiAoKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cykgfHwgKHNpZHMubGVuZ3RoID4gMCkpIHsKKwkJCWlmIChkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLndpZGdldC5QYXJzZSIpKSB7CisJCQkJdmFyIHBhcnNlciA9IG5ldyBkb2pvLnhtbC5QYXJzZSgpOworCQkJCWlmIChzaWRzLmxlbmd0aCA+IDApIHsKKwkJCQkJZm9yICh2YXIgeCA9IDA7IHggPCBzaWRzLmxlbmd0aDsgeCsrKSB7CisJCQkJCQl2YXIgdG1wTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNpZHNbeF0pOworCQkJCQkJaWYgKCF0bXBOb2RlKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQl2YXIgZnJhZyA9IHBhcnNlci5wYXJzZUVsZW1lbnQodG1wTm9kZSwgbnVsbCwgdHJ1ZSk7CisJCQkJCQlkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVDb21wb25lbnRzKGZyYWcpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cykgeworCQkJCQkJdmFyIGZyYWcgPSBwYXJzZXIucGFyc2VFbGVtZW50KGRvam8uYm9keSgpLCBudWxsLCB0cnVlKTsKKwkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoZnJhZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9OworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uICgpIHsKKwkJaWYgKCFkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKKwkJfQorCX0pOworCXRyeSB7CisJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2N1bWVudC5uYW1lc3BhY2VzLmFkZCgidiIsICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpOworCQkJZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCgpLmFkZFJ1bGUoInZcXDoqIiwgImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpIik7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwl9CisJZG9qby5ob3N0ZW52LndyaXRlSW5jbHVkZXMgPSBmdW5jdGlvbiAoKSB7CisJfTsKKwlpZiAoIWRqX3VuZGVmKCJkb2N1bWVudCIsIHRoaXMpKSB7CisJCWRqX2N1cnJlbnREb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7CisJfQorCWRvam8uZG9jID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gZGpfY3VycmVudERvY3VtZW50OworCX07CisJZG9qby5ib2R5ID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gZG9qby5kb2MoKS5ib2R5IHx8IGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTsKKwl9OworCWRvam8uYnlJZCA9IGZ1bmN0aW9uIChpZCwgZG9jKSB7CisJCWlmICgoaWQpICYmICgodHlwZW9mIGlkID09ICJzdHJpbmciKSB8fCAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpKSkgeworCQkJaWYgKCFkb2MpIHsKKwkJCQlkb2MgPSBkal9jdXJyZW50RG9jdW1lbnQ7CisJCQl9CisJCQl2YXIgZWxlID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKKwkJCWlmIChlbGUgJiYgKGVsZS5pZCAhPSBpZCkgJiYgZG9jLmFsbCkgeworCQkJCWVsZSA9IG51bGw7CisJCQkJZWxlcyA9IGRvYy5hbGxbaWRdOworCQkJCWlmIChlbGVzKSB7CisJCQkJCWlmIChlbGVzLmxlbmd0aCkgeworCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJaWYgKGVsZXNbaV0uaWQgPT0gaWQpIHsKKwkJCQkJCQkJZWxlID0gZWxlc1tpXTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJZWxlID0gZWxlczsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbGU7CisJCX0KKwkJcmV0dXJuIGlkOworCX07CisJZG9qby5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKGdsb2JhbE9iamVjdCwgZ2xvYmFsRG9jdW1lbnQpIHsKKwkJZGpfY3VycmVudENvbnRleHQgPSBnbG9iYWxPYmplY3Q7CisJCWRqX2N1cnJlbnREb2N1bWVudCA9IGdsb2JhbERvY3VtZW50OworCX07CisJZG9qby5fZmlyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0LCBjYkFyZ3VtZW50cykgeworCQlpZiAoKGNvbnRleHQpICYmICgodHlwZW9mIGNhbGxiYWNrID09ICJzdHJpbmciKSB8fCAoY2FsbGJhY2sgaW5zdGFuY2VvZiBTdHJpbmcpKSkgeworCQkJY2FsbGJhY2sgPSBjb250ZXh0W2NhbGxiYWNrXTsKKwkJfQorCQlyZXR1cm4gKGNvbnRleHQgPyBjYWxsYmFjay5hcHBseShjb250ZXh0LCBjYkFyZ3VtZW50cyB8fCBbXSkgOiBjYWxsYmFjaygpKTsKKwl9OworCWRvam8ud2l0aEdsb2JhbCA9IGZ1bmN0aW9uIChnbG9iYWxPYmplY3QsIGNhbGxiYWNrLCB0aGlzT2JqZWN0LCBjYkFyZ3VtZW50cykgeworCQl2YXIgcnZhbDsKKwkJdmFyIG9sZEdsb2IgPSBkal9jdXJyZW50Q29udGV4dDsKKwkJdmFyIG9sZERvYyA9IGRqX2N1cnJlbnREb2N1bWVudDsKKwkJdHJ5IHsKKwkJCWRvam8uc2V0Q29udGV4dChnbG9iYWxPYmplY3QsIGdsb2JhbE9iamVjdC5kb2N1bWVudCk7CisJCQlydmFsID0gZG9qby5fZmlyZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzT2JqZWN0LCBjYkFyZ3VtZW50cyk7CisJCX0KKwkJZmluYWxseSB7CisJCQlkb2pvLnNldENvbnRleHQob2xkR2xvYiwgb2xkRG9jKTsKKwkJfQorCQlyZXR1cm4gcnZhbDsKKwl9OworCWRvam8ud2l0aERvYyA9IGZ1bmN0aW9uIChkb2N1bWVudE9iamVjdCwgY2FsbGJhY2ssIHRoaXNPYmplY3QsIGNiQXJndW1lbnRzKSB7CisJCXZhciBydmFsOworCQl2YXIgb2xkRG9jID0gZGpfY3VycmVudERvY3VtZW50OworCQl0cnkgeworCQkJZGpfY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnRPYmplY3Q7CisJCQlydmFsID0gZG9qby5fZmlyZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzT2JqZWN0LCBjYkFyZ3VtZW50cyk7CisJCX0KKwkJZmluYWxseSB7CisJCQlkal9jdXJyZW50RG9jdW1lbnQgPSBvbGREb2M7CisJCX0KKwkJcmV0dXJuIHJ2YWw7CisJfTsKK30KK2Rvam8ucmVxdWlyZUlmKChkakNvbmZpZ1siaXNEZWJ1ZyJdIHx8IGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSksICJkb2pvLmRlYnVnIik7Citkb2pvLnJlcXVpcmVJZihkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0gJiYgIXdpbmRvdy53aWRnZXQgJiYgIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0sICJkb2pvLmJyb3dzZXJfZGVidWciKTsKK2Rvam8ucmVxdWlyZUlmKGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSAmJiAhd2luZG93LndpZGdldCAmJiBkakNvbmZpZ1sidXNlWERvbWFpbiJdLCAiZG9qby5icm93c2VyX2RlYnVnX3hkIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2Rhc2hib2FyZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2Rhc2hib2FyZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY0ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfZGFzaGJvYXJkLmpzCkBAIC0wLDAgKzEsMTgwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZW5kZXIubmFtZSA9IGRvam8uaG9zdGVudi5uYW1lXyA9ICJkYXNoYm9hcmQiOworZG9qby5ob3N0ZW52LnByaW50bG4gPSBmdW5jdGlvbiAobWVzc2FnZSkgeworCXJldHVybiBhbGVydChtZXNzYWdlKTsKK307Citkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCA9IGZ1bmN0aW9uIChrd0FyZ3MpIHsKKwlpZiAod2lkZ2V0LnN5c3RlbSAmJiBrd0FyZ3MpIHsKKwkJaWYgKChrd0FyZ3MuY29udGVudFR5cGUgJiYga3dBcmdzLmNvbnRlbnRUeXBlLmluZGV4T2YoInRleHQvIikgIT0gMCkgfHwgKGt3QXJncy5oZWFkZXJzICYmIGt3QXJncy5oZWFkZXJzWyJjb250ZW50LXR5cGUiXSAmJiBrd0FyZ3MuaGVhZGVyc1siY29udGVudC10eXBlIl0uaW5kZXhPZigidGV4dC8iKSAhPSAwKSkgeworCQkJdmFyIGN1cmwgPSBuZXcgZG9qby5ob3N0ZW52LkN1cmxSZXF1ZXN0OworCQkJY3VybC5fc2F2ZSA9IHRydWU7CisJCQlyZXR1cm4gY3VybDsKKwkJfSBlbHNlIHsKKwkJCWlmIChrd0FyZ3MubWV0aG9kICYmIGt3QXJncy5tZXRob2QudG9VcHBlckNhc2UoKSA9PSAiSEVBRCIpIHsKKwkJCQlyZXR1cm4gbmV3IGRvam8uaG9zdGVudi5DdXJsUmVxdWVzdDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGt3QXJncy5oZWFkZXJzICYmIGt3QXJncy5oZWFkZXIucmVmZXJlcikgeworCQkJCQlyZXR1cm4gbmV3IGRvam8uaG9zdGVudi5DdXJsUmVxdWVzdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdDsKK307Citkb2pvLmhvc3RlbnYuQ3VybFJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CisJdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOworCXRoaXMucmVhZHlTdGF0ZSA9IDA7CisJdGhpcy5yZXNwb25zZVRleHQgPSAiIjsKKwl0aGlzLnJlc3BvbnNlWE1MID0gbnVsbDsKKwl0aGlzLnN0YXR1cyA9IDA7CisJdGhpcy5zdGF0dXNUZXh0ID0gIiI7CisJdGhpcy5fbWV0aG9kID0gIiI7CisJdGhpcy5fdXJsID0gIiI7CisJdGhpcy5fYXN5bmMgPSB0cnVlOworCXRoaXMuX3JlZmVycmVyID0gIiI7CisJdGhpcy5faGVhZGVycyA9IFtdOworCXRoaXMuX3NhdmUgPSBmYWxzZTsKKwl0aGlzLl9yZXNwb25zZUhlYWRlciA9ICIiOworCXRoaXMuX3Jlc3BvbnNlSGVhZGVycyA9IHt9OworCXRoaXMuX2ZpbGVOYW1lID0gIiI7CisJdGhpcy5fdXNlcm5hbWUgPSAiIjsKKwl0aGlzLl9wYXNzd29yZCA9ICIiOworfTsKK2Rvam8uaG9zdGVudi5DdXJsUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChtZXRob2QsIHVybCwgYXN5bmMsIHVzZXJuYW1lLCBwYXNzd29yZCkgeworCXRoaXMuX21ldGhvZCA9IG1ldGhvZDsKKwl0aGlzLl91cmwgPSB1cmw7CisJaWYgKGFzeW5jKSB7CisJCXRoaXMuX2FzeW5jID0gYXN5bmM7CisJfQorCWlmICh1c2VybmFtZSkgeworCQl0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lOworCX0KKwlpZiAocGFzc3dvcmQpIHsKKwkJdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKKwl9Cit9OworZG9qby5ob3N0ZW52LkN1cmxSZXF1ZXN0LnByb3RvdHlwZS5zZXRSZXF1ZXN0SGVhZGVyID0gZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkgeworCXN3aXRjaCAobGFiZWwpIHsKKwkgIGNhc2UgIlJlZmVyZXIiOgorCQl0aGlzLl9yZWZlcnJlciA9IHZhbHVlOworCQlicmVhazsKKwkgIGNhc2UgImNvbnRlbnQtdHlwZSI6CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJdGhpcy5faGVhZGVycy5wdXNoKGxhYmVsICsgIj0iICsgdmFsdWUpOworCQlicmVhazsKKwl9Cit9OworZG9qby5ob3N0ZW52LkN1cmxSZXF1ZXN0LnByb3RvdHlwZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX3Jlc3BvbnNlSGVhZGVyOworfTsKK2Rvam8uaG9zdGVudi5DdXJsUmVxdWVzdC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VIZWFkZXIgPSBmdW5jdGlvbiAoaGVhZGVyTGFiZWwpIHsKKwlyZXR1cm4gdGhpcy5fcmVzcG9uc2VIZWFkZXJzW2hlYWRlckxhYmVsXTsKK307Citkb2pvLmhvc3RlbnYuQ3VybFJlcXVlc3QucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoY29udGVudCkgeworCXRoaXMucmVhZHlTdGF0ZSA9IDE7CisJaWYgKHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKSB7CisJCXRoaXMub25yZWFkeXN0YXRlY2hhbmdlLmNhbGwodGhpcyk7CisJfQorCXZhciBxdWVyeSA9IHtzUzoiIn07CisJaWYgKHRoaXMuX3JlZmVycmVyKSB7CisJCXF1ZXJ5LmUgPSB0aGlzLl9yZWZlcnJlcjsKKwl9CisJaWYgKHRoaXMuX2hlYWRlcnMubGVuZ3RoKSB7CisJCXF1ZXJ5LkggPSB0aGlzLl9oZWFkZXJzLmpvaW4oIiYiKTsKKwl9CisJaWYgKHRoaXMuX3VzZXJuYW1lKSB7CisJCWlmICh0aGlzLl9wYXNzd29yZCkgeworCQkJcXVlcnkudSA9IHRoaXMuX3VzZXJuYW1lICsgIjoiICsgdGhpcy5fcGFzc3dvcmQ7CisJCX0gZWxzZSB7CisJCQlxdWVyeS51ID0gdGhpcy5fdXNlcm5hbWU7CisJCX0KKwl9CisJaWYgKGNvbnRlbnQpIHsKKwkJcXVlcnkuZCA9IHRoaXMuY29udGVudDsKKwkJaWYgKHRoaXMuX21ldGhvZCAhPSAiUE9TVCIpIHsKKwkJCXF1ZXJ5LkcgPSAiIjsKKwkJfQorCX0KKwlpZiAodGhpcy5fbWV0aG9kID09ICJIRUFEIikgeworCQlxdWVyeS5JID0gIiI7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuX3NhdmUpIHsKKwkJCXF1ZXJ5LkkgPSAiIjsKKwkJfSBlbHNlIHsKKwkJCXF1ZXJ5LmkgPSAiIjsKKwkJfQorCX0KKwl2YXIgc3lzdGVtID0gd2lkZ2V0LnN5c3RlbShkb2pvLmhvc3RlbnYuQ3VybFJlcXVlc3QuX2Zvcm1hdENhbGwocXVlcnksIHRoaXMuX3VybCksIG51bGwpOworCXRoaXMucmVhZHlTdGF0ZSA9IDI7CisJaWYgKHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKSB7CisJCXRoaXMub25yZWFkeXN0YXRlY2hhbmdlLmNhbGwodGhpcyk7CisJfQorCWlmIChzeXN0ZW0uZXJyb3JTdHJpbmcpIHsKKwkJdGhpcy5yZXNwb25zZVRleHQgPSBzeXN0ZW0uZXJyb3JTdHJpbmc7CisJCXRoaXMuc3RhdHVzID0gMDsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5fc2F2ZSkgeworCQkJdGhpcy5fcmVzcG9uc2VIZWFkZXIgPSBzeXN0ZW0ub3V0cHV0U3RyaW5nOworCQl9IGVsc2UgeworCQkJdmFyIHNwbGl0ID0gc3lzdGVtLm91dHB1dFN0cmluZy5yZXBsYWNlKC9cci9nLCAiIikuc3BsaXQoIlxuXG4iLCAyKTsKKwkJCXRoaXMuX3Jlc3BvbnNlSGVhZGVyID0gc3BsaXRbMF07CisJCQl0aGlzLnJlc3BvbnNlVGV4dCA9IHNwbGl0WzFdOworCQl9CisJCXNwbGl0ID0gdGhpcy5fcmVzcG9uc2VIZWFkZXIuc3BsaXQoIlxuIik7CisJCXRoaXMuc3RhdHVzVGV4dCA9IHNwbGl0LnNoaWZ0KCk7CisJCXRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNUZXh0LnNwbGl0KCIgIilbMV07CisJCWZvciAodmFyIGkgPSAwLCBoZWFkZXI7IGhlYWRlciA9IHNwbGl0W2ldOyBpKyspIHsKKwkJCXZhciBoZWFkZXJfc3BsaXQgPSBoZWFkZXIuc3BsaXQoIjogIiwgMik7CisJCQl0aGlzLl9yZXNwb25zZUhlYWRlcnNbaGVhZGVyX3NwbGl0WzBdXSA9IGhlYWRlcl9zcGxpdFsxXTsKKwkJfQorCQlpZiAodGhpcy5fc2F2ZSkgeworCQkJd2lkZ2V0LnN5c3RlbSgiL2Jpbi9ta2RpciBjYWNoZSIsIG51bGwpOworCQkJdGhpcy5fZmlsZU5hbWUgPSB0aGlzLl91cmwuc3BsaXQoIi8iKS5wb3AoKS5yZXBsYWNlKC9cVy9nLCAiIik7CisJCQl0aGlzLl9maWxlTmFtZSArPSAiLiIgKyB0aGlzLl9yZXNwb25zZUhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdLnJlcGxhY2UoL1tcclxuXS9nLCAiIikuc3BsaXQoIi8iKS5wb3AoKTsKKwkJCWRlbGV0ZSBxdWVyeS5JOworCQkJcXVlcnkubyA9ICJjYWNoZS8iICsgdGhpcy5fZmlsZU5hbWU7CisJCQlzeXN0ZW0gPSB3aWRnZXQuc3lzdGVtKGRvam8uaG9zdGVudi5DdXJsUmVxdWVzdC5fZm9ybWF0Q2FsbChxdWVyeSwgdGhpcy5fdXJsKSwgbnVsbCk7CisJCQlpZiAoIXN5c3RlbS5lcnJvclN0cmluZykgeworCQkJCXRoaXMucmVzcG9uc2VUZXh0ID0gImNhY2hlLyIgKyB0aGlzLl9maWxlTmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLl9tZXRob2QgPT0gIkhFQUQiKSB7CisJCQkJdGhpcy5yZXNwb25zZVRleHQgPSB0aGlzLl9yZXNwb25zZUhlYWRlcjsKKwkJCX0KKwkJfQorCX0KKwl0aGlzLnJlYWR5U3RhdGUgPSA0OworCWlmICh0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSkgeworCQl0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZS5jYWxsKHRoaXMpOworCX0KK307Citkb2pvLmhvc3RlbnYuQ3VybFJlcXVlc3QuX2Zvcm1hdENhbGwgPSBmdW5jdGlvbiAocXVlcnksIHVybCkgeworCXZhciBjYWxsID0gWyIvdXNyL2Jpbi9jdXJsIl07CisJZm9yICh2YXIga2V5IGluIHF1ZXJ5KSB7CisJCWlmIChxdWVyeVtrZXldICE9ICIiKSB7CisJCQljYWxsLnB1c2goIi0iICsga2V5ICsgIiAnIiArIHF1ZXJ5W2tleV0ucmVwbGFjZSgvJy9nLCAiJyIpICsgIiciKTsKKwkJfSBlbHNlIHsKKwkJCWNhbGwucHVzaCgiLSIgKyBrZXkpOworCQl9CisJfQorCWNhbGwucHVzaCgiJyIgKyB1cmwucmVwbGFjZSgvJy9nLCAiJyIpICsgIiciKTsKKwlyZXR1cm4gY2FsbC5qb2luKCIgIik7Cit9OworZG9qby5ob3N0ZW52LmV4aXQgPSBmdW5jdGlvbiAoKSB7CisJaWYgKHdpZGdldC5zeXN0ZW0pIHsKKwkJd2lkZ2V0LnN5c3RlbSgiL2Jpbi9ybSAtcmYgY2FjaGUvKiIsIG51bGwpOworCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2pzYy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X2pzYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVmMTAxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfanNjLmpzCkBAIC0wLDAgKzEsNzggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKy8qCisgKiBKU2NyaXB0IC5ORVQganNjCisgKgorICovCisKK2Rvam8uaG9zdGVudi5uYW1lXyA9ICdqc2MnOworCisvLyBTYW5pdHkgY2hlY2sgdGhpcyBpcyB0aGUgcmlnaHQgaG9zdGVudi4KKy8vIFNlZSB0aGUgUm90b3Igc291cmNlIGNvZGUganNjcmlwdC9lbmdpbmUvZ2xvYmFsb2JqZWN0LmNzIGZvciB3aGF0IGdsb2JhbHMKKy8vIGFyZSBhdmFpbGFibGUuCitpZigodHlwZW9mIFNjcmlwdEVuZ2luZU1ham9yVmVyc2lvbiAhPSAnZnVuY3Rpb24nKXx8KFNjcmlwdEVuZ2luZU1ham9yVmVyc2lvbigpIDwgNykpeworCWRvam8ucmFpc2UoImF0dGVtcHQgdG8gdXNlIEpTY3JpcHQgLk5FVCBob3N0IGVudmlyb25tZW50IHdpdGggaW5hcHByb3ByaWF0ZSBTY3JpcHRFbmdpbmUiKTsgCit9CisKKy8vIGZvciBtb3JlIHRoYW4geW91IHdhbnRlZCB0byBrbm93IGFib3V0IHdoeSB0aGlzIGltcG9ydCBpcyByZXF1aXJlZCBldmVuIGlmCisvLyB3ZSBmdWxseSBxdWFsaWZ5IGFsbCBzeW1ib2xzLCBzZWUKKy8vIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/dGg9ZjA1MGM3YWVlZmRjYmRlMiZybnVtPTEyCitpbXBvcnQgU3lzdGVtOworCitkb2pvLmhvc3RlbnYuZ2V0VGV4dCA9IGZ1bmN0aW9uKHVyaSl7CisJaWYoIVN5c3RlbS5JTy5GaWxlLkV4aXN0cyh1cmkpKXsKKwkJLy8gZG9qby5yYWlzZSgiTm8gc3VjaCBmaWxlICciICsgdXJpICsgIiciKTsKKwkJcmV0dXJuIDA7CisJfQorCXZhciByZWFkZXIgPSBuZXcgU3lzdGVtLklPLlN0cmVhbVJlYWRlcih1cmkpOworCXZhciBjb250ZW50cyA6IFN0cmluZyA9IHJlYWRlci5SZWFkVG9FbmQoKTsKKwlyZXR1cm4gY29udGVudHM7Cit9CisKK2Rvam8uaG9zdGVudi5sb2FkVXJpID0gZnVuY3Rpb24odXJpKXsKKwl2YXIgY29udGVudHMgPSB0aGlzLmdldFRleHQodXJpKTsKKwlpZighY29udGVudHMpeworCQlkb2pvLnJhaXNlKCJnb3Qgbm8gYmFjayBjb250ZW50cyBmcm9tIHVyaSAnIiArIHVyaSArICInOiAiICsgY29udGVudHMpOworCX0KKwkvLyBUT0RPOiBpbiBKU2NyaXB0IC5ORVQsIGV2YWwgd2lsbCBub3QgYWZmZWN0IHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGN1cnJlbnQgY29kZT8KKwl2YXIgdmFsdWUgPSBkal9ldmFsKGNvbnRlbnRzKTsKKwlkb2pvLmRlYnVnKCJqc2MgZXZhbCBvZiBjb250ZW50cyByZXR1cm5lZDogIiwgdmFsdWUpOworCXJldHVybiAxOworCisJLy8gZm9yIGFuIGV4YW1wbGUgZG9pbmcgcnVudGltZSBjb2RlIGNvbXBpbGF0aW9uLCBzZWU6CisJLy8gaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz9zZWxtPWVRMWFlY2lDQkhBLjE2NDQlNDB0a21zZnRuZ3AwNSZybnVtPTYKKwkvLyBNaWNyb3NvZnQuSlNjcmlwdCBvciBTeXN0ZW0uQ29kZURvbS5Db21waWxlciA/CisJLy8gdmFyIGVuZ2luZSA9IG5ldyBNaWNyb3NvZnQuSlNjcmlwdC5Wc2EuVnNhRW5naW5lKCkKKwkvLyB3aGF0IGFib3V0IGxvYWRpbmcgYSBqcyBmaWxlIHZzLiBhIGRsbD8KKwkvLyBHZXRPYmplY3QoInNjcmlwdDoiIC4gdXJpKTsKK30KKworLyogVGhlIFN5c3RlbS5FbnZpcm9ubWVudCBvYmplY3QgaXMgdXNlZnVsOgorICAgIHByaW50ICgiQ29tbWFuZExpbmU9JyIgKyBTeXN0ZW0uRW52aXJvbm1lbnQuQ29tbWFuZExpbmUgKyAiJyAiICsKKwkgICAicHJvZ3JhbSBuYW1lPSciICsgU3lzdGVtLkVudmlyb25tZW50LkdldENvbW1hbmRMaW5lQXJncygpWzBdICsgIicgIiArCisJICAgIkN1cnJlbnREaXJlY3Rvcnk9JyIgKyBTeXN0ZW0uRW52aXJvbm1lbnQuQ3VycmVudERpcmVjdG9yeSArICInICIgKworCSAgICJTdGFja1RyYWNlPSciICsgU3lzdGVtLkVudmlyb25tZW50LlN0YWNrVHJhY2UgKyAiJyIpOworKi8KKworLy8gc2FtZSBhcyBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUKKy8vIHNpZ2g7IFJvdG9yIHRyZWF0cyBzeW1ib2wgInByaW50IiBhdCBwYXJzZSB0aW1lIHdpdGhvdXQgYWN0dWFsbHkgcHV0dGluZyBpdAorLy8gaW4gdGhlIGJ1aWx0aW4gc3ltYm9sIHRhYmxlLgorLy8gTm90ZSB0aGF0IHRoZSBwcmludCBzeW1ib2wgaXMgbm90IGF2YWlsYWJsZSBpZiBqc2MgaXMgcnVuIHdpdGggdGhlICIvcHJpbnQtIgorLy8gb3B0aW9uLgorZG9qby5ob3N0ZW52LnByaW50bG4gPSBmdW5jdGlvbihzKXsKKwlwcmludChzKTsgLy8gPSBwcmludAorfQorCitkb2pvLmhvc3RlbnYuZ2V0TGlicmFyeVNjcmlwdFVyaSA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIFN5c3RlbS5FbnZpcm9ubWVudC5HZXRDb21tYW5kTGluZUFyZ3MoKVswXTsKK30KKworZG9qby5yZXF1aXJlSWYoKGRqQ29uZmlnWyJpc0RlYnVnIl0gfHwgZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdKSwgImRvam8uZGVidWciKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X3JoaW5vLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfcmhpbm8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjMjg0NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X3JoaW5vLmpzCkBAIC0wLDAgKzEsMTYzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5ob3N0ZW52LnByaW50bG4gPSBmdW5jdGlvbiAobGluZSkgeworCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgeworCQlwcmludChhcmd1bWVudHNbMF0pOworCQlmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHZhbGlkID0gZmFsc2U7CisJCQlmb3IgKHZhciBwIGluIGFyZ3VtZW50c1tpXSkgeworCQkJCXZhbGlkID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh2YWxpZCkgeworCQkJCWRvam8uZGVidWdTaGFsbG93KGFyZ3VtZW50c1tpXSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwcmludChsaW5lKTsKKwl9Cit9OworZG9qby5sb2NhbGUgPSBkb2pvLmxvY2FsZSB8fCBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLnJlcGxhY2UoIl8iLCAiLSIpLnRvTG93ZXJDYXNlKCk7Citkb2pvLnJlbmRlci5uYW1lID0gZG9qby5ob3N0ZW52Lm5hbWVfID0gInJoaW5vIjsKK2Rvam8uaG9zdGVudi5nZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkgeworCXJldHVybiB2ZXJzaW9uKCk7Cit9OworaWYgKGRqX3VuZGVmKCJieUlkIikpIHsKKwlkb2pvLmJ5SWQgPSBmdW5jdGlvbiAoaWQsIGRvYykgeworCQlpZiAoaWQgJiYgKHR5cGVvZiBpZCA9PSAic3RyaW5nIiB8fCBpZCBpbnN0YW5jZW9mIFN0cmluZykpIHsKKwkJCWlmICghZG9jKSB7CisJCQkJZG9jID0gZG9jdW1lbnQ7CisJCQl9CisJCQlyZXR1cm4gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKKwkJfQorCQlyZXR1cm4gaWQ7CisJfTsKK30KK2Rvam8uaG9zdGVudi5sb2FkVXJpID0gZnVuY3Rpb24gKHVyaSwgY2IpIHsKKwl0cnkgeworCQl2YXIgbG9jYWwgPSAobmV3IGphdmEuaW8uRmlsZSh1cmkpKS5leGlzdHMoKTsKKwkJaWYgKCFsb2NhbCkgeworCQkJdHJ5IHsKKwkJCQl2YXIgc3RyZWFtID0gKG5ldyBqYXZhLm5ldC5VUkwodXJpKSkub3BlblN0cmVhbSgpOworCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKGNiKSB7CisJCQl2YXIgY29udGVudHMgPSAobG9jYWwgPyByZWFkVGV4dCA6IHJlYWRVcmkpKHVyaSwgIlVURi04Iik7CisJCQljYihldmFsKCIoIiArIGNvbnRlbnRzICsgIikiKSk7CisJCX0gZWxzZSB7CisJCQlsb2FkKHVyaSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoInJoaW5vIGxvYWQoJyIgKyB1cmkgKyAiJykgZmFpbGVkLiBFeGNlcHRpb246ICIgKyBlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK307Citkb2pvLmhvc3RlbnYuZXhpdCA9IGZ1bmN0aW9uIChleGl0Y29kZSkgeworCXF1aXQoZXhpdGNvZGUpOworfTsKK2Z1bmN0aW9uIGRqX3JoaW5vX2N1cnJlbnRfc2NyaXB0X3ZpYV9qYXZhKGRlcHRoKSB7CisJdmFyIG9wdExldmVsID0gUGFja2FnZXMub3JnLm1vemlsbGEuamF2YXNjcmlwdC5Db250ZXh0LmdldEN1cnJlbnRDb250ZXh0KCkuZ2V0T3B0aW1pemF0aW9uTGV2ZWwoKTsKKwl2YXIgY2F3ID0gbmV3IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyKCk7CisJdmFyIHB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoY2F3KTsKKwl2YXIgZXhjID0gbmV3IGphdmEubGFuZy5FeGNlcHRpb24oKTsKKwl2YXIgcyA9IGNhdy50b1N0cmluZygpOworCXZhciBtYXRjaGVzID0gcy5tYXRjaCgvW15cKF0qXC5qc1wpL2dpKTsKKwlpZiAoIW1hdGNoZXMpIHsKKwkJdGhyb3cgRXJyb3IoImNhbm5vdCBwYXJzZSBwcmludFN0YWNrVHJhY2Ugb3V0cHV0OiAiICsgcyk7CisJfQorCXZhciBmbmFtZSA9ICgodHlwZW9mIGRlcHRoICE9ICJ1bmRlZmluZWQiKSAmJiAoZGVwdGgpKSA/IG1hdGNoZXNbZGVwdGggKyAxXSA6IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTsKKwl2YXIgZm5hbWUgPSBtYXRjaGVzWzNdOworCWlmICghZm5hbWUpIHsKKwkJZm5hbWUgPSBtYXRjaGVzWzFdOworCX0KKwlpZiAoIWZuYW1lKSB7CisJCXRocm93IEVycm9yKCJjb3VsZCBub3QgZmluZCBqcyBmaWxlIGluIHByaW50U3RhY2tUcmFjZSBvdXRwdXQ6ICIgKyBzKTsKKwl9CisJcmV0dXJuIGZuYW1lOworfQorZnVuY3Rpb24gcmVhZFRleHQocGF0aCwgZW5jb2RpbmcpIHsKKwllbmNvZGluZyA9IGVuY29kaW5nIHx8ICJ1dGYtOCI7CisJdmFyIGpmID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTsKKwl2YXIgaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oamYpOworCXJldHVybiBkal9yZWFkSW5wdXRTdHJlYW0oaXMsIGVuY29kaW5nKTsKK30KK2Z1bmN0aW9uIHJlYWRVcmkodXJpLCBlbmNvZGluZykgeworCXZhciBjb25uID0gKG5ldyBqYXZhLm5ldC5VUkwodXJpKSkub3BlbkNvbm5lY3Rpb24oKTsKKwllbmNvZGluZyA9IGVuY29kaW5nIHx8IGNvbm4uZ2V0Q29udGVudEVuY29kaW5nKCkgfHwgInV0Zi04IjsKKwl2YXIgaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7CisJcmV0dXJuIGRqX3JlYWRJbnB1dFN0cmVhbShpcywgZW5jb2RpbmcpOworfQorZnVuY3Rpb24gZGpfcmVhZElucHV0U3RyZWFtKGlzLCBlbmNvZGluZykgeworCXZhciBpbnB1dCA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZykpOworCXRyeSB7CisJCXZhciBzYiA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7CisJCXZhciBsaW5lID0gIiI7CisJCXdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9PSBudWxsKSB7CisJCQlzYi5hcHBlbmQobGluZSk7CisJCQlzYi5hcHBlbmQoamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCWZpbmFsbHkgeworCQlpbnB1dC5jbG9zZSgpOworCX0KK30KK2lmICghZGpDb25maWcubGlicmFyeVNjcmlwdFVyaS5sZW5ndGgpIHsKKwl0cnkgeworCQlkakNvbmZpZy5saWJyYXJ5U2NyaXB0VXJpID0gZGpfcmhpbm9fY3VycmVudF9zY3JpcHRfdmlhX2phdmEoMSk7CisJfQorCWNhdGNoIChlKSB7CisJCWlmIChkakNvbmZpZ1siaXNEZWJ1ZyJdKSB7CisJCQlwcmludCgiXG4iKTsKKwkJCXByaW50KCJ3ZSBoYXZlIG5vIGlkZWEgd2hlcmUgRG9qbyBpcyBsb2NhdGVkLiIpOworCQkJcHJpbnQoIlBsZWFzZSB0cnkgbG9hZGluZyByaGlubyBpbiBhIG5vbi1pbnRlcnByZXRlZCBtb2RlIG9yIHNldCBhIik7CisJCQlwcmludCgiXG5cdGRqQ29uZmlnLmxpYnJhcnlTY3JpcHRVcmlcbiIpOworCQkJcHJpbnQoIlNldHRpbmcgdGhlIGRvam8gcGF0aCB0byAnLi8nIik7CisJCQlwcmludCgiVGhpcyBpcyBwcm9iYWJseSB3cm9uZyEiKTsKKwkJCXByaW50KCJcbiIpOworCQkJcHJpbnQoIkRvam8gd2lsbCB0cnkgdG8gbG9hZCBhbnl3YXkiKTsKKwkJfQorCQlkakNvbmZpZy5saWJyYXJ5U2NyaXB0VXJpID0gIi4vIjsKKwl9Cit9Citkb2pvLmRvYyA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9jdW1lbnQ7Cit9OworZG9qby5ib2R5ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2N1bWVudC5ib2R5OworfTsKK2Z1bmN0aW9uIHNldFRpbWVvdXQoZnVuYywgZGVsYXkpIHsKKwl2YXIgZGVmID0ge3NsZWVwVGltZTpkZWxheSwgaGFzU2xlcHQ6ZmFsc2UsIHJ1bjpmdW5jdGlvbiAoKSB7CisJCWlmICghdGhpcy5oYXNTbGVwdCkgeworCQkJdGhpcy5oYXNTbGVwdCA9IHRydWU7CisJCQlqYXZhLmxhbmcuVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCh0aGlzLnNsZWVwVGltZSk7CisJCX0KKwkJdHJ5IHsKKwkJCWZ1bmMoKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQkJZG9qby5kZWJ1ZygiRXJyb3IgcnVubmluZyBzZXRUaW1lb3V0IHRocmVhZDoiICsgZSk7CisJCX0KKwl9fTsKKwl2YXIgcnVubmFibGUgPSBuZXcgamF2YS5sYW5nLlJ1bm5hYmxlKGRlZik7CisJdmFyIHRocmVhZCA9IG5ldyBqYXZhLmxhbmcuVGhyZWFkKHJ1bm5hYmxlKTsKKwl0aHJlYWQuc3RhcnQoKTsKK30KK2Rvam8ucmVxdWlyZUlmKChkakNvbmZpZ1siaXNEZWJ1ZyJdIHx8IGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSksICJkb2pvLmRlYnVnIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X3NwaWRlcm1vbmtleS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X3NwaWRlcm1vbmtleS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFlNTlkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfc3BpZGVybW9ua2V5LmpzCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmhvc3RlbnYubmFtZV8gPSAic3BpZGVybW9ua2V5IjsKK2Rvam8uaG9zdGVudi5wcmludGxuID0gcHJpbnQ7Citkb2pvLmhvc3RlbnYuZXhpdCA9IGZ1bmN0aW9uIChleGl0Y29kZSkgeworCXF1aXQoZXhpdGNvZGUpOworfTsKK2Rvam8uaG9zdGVudi5nZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkgeworCXJldHVybiB2ZXJzaW9uKCk7Cit9OworaWYgKHR5cGVvZiBsaW5lMnBjID09ICJ1bmRlZmluZWQiKSB7CisJZG9qby5yYWlzZSgiYXR0ZW1wdCB0byB1c2UgU3BpZGVyTW9ua2V5IGhvc3QgZW52aXJvbm1lbnQgd2hlbiBubyAnbGluZTJwYycgZ2xvYmFsIik7Cit9CitmdW5jdGlvbiBkal9zcGlkZXJtb25rZXlfY3VycmVudF9maWxlKGRlcHRoKSB7CisJdmFyIHMgPSAiIjsKKwl0cnkgeworCQl0aHJvdyBFcnJvcigid2hhdGV2ZXIiKTsKKwl9CisJY2F0Y2ggKGUpIHsKKwkJcyA9IGUuc3RhY2s7CisJfQorCXZhciBtYXRjaGVzID0gcy5tYXRjaCgvW15AXSpcLmpzL2dpKTsKKwlpZiAoIW1hdGNoZXMpIHsKKwkJZG9qby5yYWlzZSgiY291bGQgbm90IHBhcnNlIHN0YWNrIHN0cmluZzogJyIgKyBzICsgIiciKTsKKwl9CisJdmFyIGZuYW1lID0gKHR5cGVvZiBkZXB0aCAhPSAidW5kZWZpbmVkIiAmJiBkZXB0aCkgPyBtYXRjaGVzW2RlcHRoICsgMV0gOiBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07CisJaWYgKCFmbmFtZSkgeworCQlkb2pvLnJhaXNlKCJjb3VsZCBub3QgZmluZCBmaWxlIG5hbWUgaW4gc3RhY2sgc3RyaW5nICciICsgcyArICInIik7CisJfQorCXJldHVybiBmbmFtZTsKK30KK2lmICghZG9qby5ob3N0ZW52LmxpYnJhcnlfc2NyaXB0X3VyaV8pIHsKKwlkb2pvLmhvc3RlbnYubGlicmFyeV9zY3JpcHRfdXJpXyA9IGRqX3NwaWRlcm1vbmtleV9jdXJyZW50X2ZpbGUoMCk7Cit9Citkb2pvLmhvc3RlbnYubG9hZFVyaSA9IGZ1bmN0aW9uICh1cmkpIHsKKwl2YXIgb2sgPSBsb2FkKHVyaSk7CisJcmV0dXJuIDE7Cit9OworZG9qby5yZXF1aXJlSWYoKGRqQ29uZmlnWyJpc0RlYnVnIl0gfHwgZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdKSwgImRvam8uZGVidWciKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfc3ZnLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2hvc3RlbnZfc3ZnLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjkyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaG9zdGVudl9zdmcuanMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZpbmVkIikgeworCWRvam8ucmFpc2UoImF0dGVtcHQgdG8gdXNlIGFkb2JlIHN2ZyBob3N0ZW52IHdoZW4gbm8gd2luZG93IG9iamVjdCIpOworfQorZG9qby5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKwlpZiAoIWRqQ29uZmlnLmlzRGVidWcpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgYXJncyA9IGFyZ3VtZW50czsKKwl2YXIgaXNKVU0gPSBkal9nbG9iYWxbImp1bSJdOworCXZhciBzID0gaXNKVU0gPyAiIiA6ICJERUJVRzogIjsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKwkJcyArPSBhcmdzW2ldOworCX0KKwlpZiAoaXNKVU0pIHsKKwkJanVtLmRlYnVnKHMpOworCX0gZWxzZSB7CisJCWRvam8uaG9zdGVudi5wcmludGxuKHMpOworCX0KK307Citkb2pvLnJlbmRlci5uYW1lID0gbmF2aWdhdG9yLmFwcE5hbWU7Citkb2pvLnJlbmRlci52ZXIgPSBwYXJzZUZsb2F0KG5hdmlnYXRvci5hcHBWZXJzaW9uLCAxMCk7Citzd2l0Y2ggKG5hdmlnYXRvci5wbGF0Zm9ybSkgeworICBjYXNlICJNYWNPUyI6CisJZG9qby5yZW5kZXIub3Mub3N4ID0gdHJ1ZTsKKwlicmVhazsKKyAgY2FzZSAiTGludXgiOgorCWRvam8ucmVuZGVyLm9zLmxpbnV4ID0gdHJ1ZTsKKwlicmVhazsKKyAgY2FzZSAiV2luZG93cyI6CisJZG9qby5yZW5kZXIub3Mud2luID0gdHJ1ZTsKKwlicmVhazsKKyAgZGVmYXVsdDoKKwlkb2pvLnJlbmRlci5vcy5saW51eCA9IHRydWU7CisJYnJlYWs7Cit9Citkb2pvLnJlbmRlci5zdmcuY2FwYWJsZSA9IHRydWU7Citkb2pvLnJlbmRlci5zdmcuc3VwcG9ydC5idWlsdGluID0gdHJ1ZTsKK2Rvam8ucmVuZGVyLnN2Zy5tb3ogPSAoKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiR2Vja28iKSA+PSAwKSAmJiAoISgobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZigiS29ucXVlcm9yIikgPj0gMCkgfHwgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIlNhZmFyaSIpID49IDApKSkpOworZG9qby5yZW5kZXIuc3ZnLmFkb2JlID0gKHdpbmRvdy5wYXJzZVhNTCAhPSBudWxsKTsKK2Rvam8uaG9zdGVudi5zdGFydFBhY2thZ2UoImRvam8uaG9zdGVudiIpOworZG9qby5ob3N0ZW52LnByaW50bG4gPSBmdW5jdGlvbiAocykgeworCXRyeSB7CisJCXZhciB0aSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHQiKTsKKwkJdGkuc2V0QXR0cmlidXRlKCJ4IiwgIjUwIik7CisJCXRpLnNldEF0dHJpYnV0ZSgieSIsICgyNSArIDE1ICogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHQiKS5sZW5ndGgpKTsKKwkJdGkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocykpOworCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGkpOworCX0KKwljYXRjaCAoZSkgeworCX0KK307Citkb2pvLmhvc3RlbnYubmFtZV8gPSAic3ZnIjsKK2Rvam8uaG9zdGVudi5zZXRNb2R1bGVQcmVmaXggPSBmdW5jdGlvbiAobW9kdWxlLCBwcmVmaXgpIHsKK307Citkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlUHJlZml4ID0gZnVuY3Rpb24gKG1vZHVsZSkgeworfTsKK2Rvam8uaG9zdGVudi5nZXRUZXh0U3RhY2sgPSBbXTsKK2Rvam8uaG9zdGVudi5sb2FkVXJpU3RhY2sgPSBbXTsKK2Rvam8uaG9zdGVudi5sb2FkZWRVcmlzID0gW107Citkb2pvLmhvc3RlbnYubW9kdWxlc18gPSB7fTsKK2Rvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkRmlyZWQgPSBmYWxzZTsKK2Rvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzID0gW107Citkb2pvLmhvc3RlbnYuZ2V0VGV4dCA9IGZ1bmN0aW9uICh1cmksIGNiLCBkYXRhKSB7CisJaWYgKCFjYikgeworCQl2YXIgY2IgPSBmdW5jdGlvbiAocmVzdWx0KSB7CisJCQl3aW5kb3cuYWxlcnQocmVzdWx0KTsKKwkJfTsKKwl9CisJaWYgKCFkYXRhKSB7CisJCXdpbmRvdy5nZXRVcmwodXJpLCBjYik7CisJfSBlbHNlIHsKKwkJd2luZG93LnBvc3RVcmwodXJpLCBkYXRhLCBjYik7CisJfQorfTsKK2Rvam8uaG9zdGVudi5nZXRMaWJhcnlTY3JpcHRVcmkgPSBmdW5jdGlvbiAoKSB7Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmkgPSBmdW5jdGlvbiAodXJpKSB7Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmlBbmRDaGVjayA9IGZ1bmN0aW9uICh1cmksIG1vZHVsZSkgeworfTsKK2Rvam8uaG9zdGVudi5sb2FkTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKKwl2YXIgYSA9IG1vZHVsZU5hbWUuc3BsaXQoIi4iKTsKKwl2YXIgY3VycmVudE9iaiA9IHdpbmRvdzsKKwl2YXIgcyA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworCQlpZiAoYVtpXSA9PSAiKiIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXMucHVzaChhW2ldKTsKKwkJaWYgKCFjdXJyZW50T2JqW2FbaV1dKSB7CisJCQlkb2pvLnJhaXNlKCJkb2pvLnJlcXVpcmUoJyIgKyBtb2R1bGVOYW1lICsgIicpOiBtb2R1bGUgZG9lcyBub3QgZXhpc3QuIik7CisJCX0gZWxzZSB7CisJCQljdXJyZW50T2JqID0gY3VycmVudE9ialthW2ldXTsKKwkJfQorCX0KKwlyZXR1cm47Cit9OworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSA9IGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7CisJdmFyIGEgPSBtb2R1bGVOYW1lLnNwbGl0KCIuIik7CisJdmFyIGN1cnJlbnRPYmogPSB3aW5kb3c7CisJdmFyIHMgPSBbXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFbaV0gPT0gIioiKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzLnB1c2goYVtpXSk7CisJCWlmICghY3VycmVudE9ialthW2ldXSkgeworCQkJY3VycmVudE9ialthW2ldXSA9IHt9OworCQl9CisJCWN1cnJlbnRPYmogPSBjdXJyZW50T2JqW2FbaV1dOworCX0KKwlyZXR1cm47Cit9OworaWYgKHdpbmRvdy5wYXJzZVhNTCkgeworCXdpbmRvdy5YTUxTZXJpYWx6ZXIgPSBmdW5jdGlvbiAoKSB7CisJCWZ1bmN0aW9uIG5vZGVUb1N0cmluZyhuLCBhKSB7CisJCQlmdW5jdGlvbiBmaXhUZXh0KHMpIHsKKwkJCQlyZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1wmL2csICImYW1wOyIpLnJlcGxhY2UoLz4vZywgIiZndDsiKS5yZXBsYWNlKC88L2csICImbHQ7Iik7CisJCQl9CisJCQlmdW5jdGlvbiBmaXhBdHRyaWJ1dGUocykgeworCQkJCXJldHVybiBmaXhUZXh0KHMpLnJlcGxhY2UoL1wiL2csICImcXVvdDsiKTsKKwkJCX0KKwkJCXN3aXRjaCAobi5ub2RlVHlwZSkgeworCQkJICBjYXNlIDE6CisJCQkJdmFyIG5hbWUgPSBuLm5vZGVOYW1lOworCQkJCWEucHVzaCgiPCIgKyBuYW1lKTsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IG4uYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAobi5hdHRyaWJ1dGVzLml0ZW0oaSkuc3BlY2lmaWVkKSB7CisJCQkJCQlhLnB1c2goIiAiICsgbi5hdHRyaWJ1dGVzLml0ZW0oaSkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSArICI9XCIiICsgZml4QXR0cmlidXRlKG4uYXR0cmlidXRlcy5pdGVtKGkpLm5vZGVWYWx1ZSkgKyAiXCIiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobi5jYW5IYXZlQ2hpbGRyZW4gfHwgbi5oYXNDaGlsZE5vZGVzKCkpIHsKKwkJCQkJYS5wdXNoKCI+Iik7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbi5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlub2RlVG9TdHJpbmcobi5jaGlsZE5vZGVzLml0ZW0oaSksIGEpOworCQkJCQl9CisJCQkJCWEucHVzaCgiPC8iICsgbmFtZSArICI+XG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhLnB1c2goIiAvPlxuIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICBjYXNlIDM6CisJCQkJYS5wdXNoKGZpeFRleHQobi5ub2RlVmFsdWUpKTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSA0OgorCQkJCWEucHVzaCgiPCFbQ0RBIiArICJUQVtcbiIgKyBuLm5vZGVWYWx1ZSArICJcbl0iICsgIl0+Iik7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgNzoKKwkJCQlhLnB1c2gobi5ub2RlVmFsdWUpOworCQkJCWlmICgvKF48XD94bWwpfChePFwhRE9DVFlQRSkvLnRlc3Qobi5ub2RlVmFsdWUpKSB7CisJCQkJCWEucHVzaCgiXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgODoKKwkJCQlhLnB1c2goIjwhLS0gIiArIG4ubm9kZVZhbHVlICsgIiAtLT5cbiIpOworCQkJCWJyZWFrOworCQkJICBjYXNlIDk6CisJCQkgIGNhc2UgMTE6CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJbm9kZVRvU3RyaW5nKG4uY2hpbGROb2Rlcy5pdGVtKGkpLCBhKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJYS5wdXNoKCI8IS0tXG5Ob3QgU3VwcG9ydGVkOlxuXG4iICsgIm5vZGVUeXBlOiAiICsgbi5ub2RlVHlwZSArICJcbm5vZGVOYW1lOiAiICsgbi5ub2RlTmFtZSArICJcbi0tPiIpOworCQkJfQorCQl9CisJCXRoaXMuc2VyaWFsaXplVG9TdHJpbmcgPSBmdW5jdGlvbiAobm9kZSkgeworCQkJdmFyIGEgPSBbXTsKKwkJCW5vZGVUb1N0cmluZyhub2RlLCBhKTsKKwkJCXJldHVybiBhLmpvaW4oIiIpOworCQl9OworCX07CisJd2luZG93LkRPTVBhcnNlciA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbiAocykgeworCQkJcmV0dXJuIHBhcnNlWE1MKHMsIHdpbmRvdy5kb2N1bWVudCk7CisJCX07CisJfTsKKwl3aW5kb3cuWE1MSHR0cFJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CisJCXZhciB1cmkgPSBudWxsOworCQl2YXIgbWV0aG9kID0gIlBPU1QiOworCQl2YXIgaXNBc3luYyA9IHRydWU7CisJCXZhciBjYiA9IGZ1bmN0aW9uIChkKSB7CisJCQl0aGlzLnJlc3BvbnNlVGV4dCA9IGQuY29udGVudDsKKwkJCXRyeSB7CisJCQkJdGhpcy5yZXNwb25zZVhNTCA9IHBhcnNlWE1MKHRoaXMucmVzcG9uc2VUZXh0LCB3aW5kb3cuZG9jdW1lbnQpOworCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCX0KKwkJCXRoaXMuc3RhdHVzID0gIjIwMCI7CisJCQl0aGlzLnN0YXR1c1RleHQgPSAiT0siOworCQkJaWYgKCFkLnN1Y2Nlc3MpIHsKKwkJCQl0aGlzLnN0YXR1cyA9ICI1MDAiOworCQkJCXRoaXMuc3RhdHVzVGV4dCA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOworCQkJfQorCQkJdGhpcy5vbmxvYWQoKTsKKwkJCXRoaXMub25yZWFkeXN0YXRlY2hhbmdlKCk7CisJCX07CisJCXRoaXMub25sb2FkID0gZnVuY3Rpb24gKCkgeworCQl9OworCQl0aGlzLnJlYWR5U3RhdGUgPSA0OworCQl0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKwkJfTsKKwkJdGhpcy5zdGF0dXMgPSAwOworCQl0aGlzLnN0YXR1c1RleHQgPSAiIjsKKwkJdGhpcy5yZXNwb25zZUJvZHkgPSBudWxsOworCQl0aGlzLnJlc3BvbnNlU3RyZWFtID0gbnVsbDsKKwkJdGhpcy5yZXNwb25zZVhNTCA9IG51bGw7CisJCXRoaXMucmVzcG9uc2VUZXh0ID0gbnVsbDsKKwkJdGhpcy5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKKwkJCXJldHVybjsKKwkJfTsKKwkJdGhpcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gW107CisJCX07CisJCXRoaXMuZ2V0UmVzcG9uc2VIZWFkZXIgPSBmdW5jdGlvbiAobikgeworCQkJcmV0dXJuIG51bGw7CisJCX07CisJCXRoaXMuc2V0UmVxdWVzdEhlYWRlciA9IGZ1bmN0aW9uIChubSwgdmFsKSB7CisJCX07CisJCXRoaXMub3BlbiA9IGZ1bmN0aW9uIChtZXRoLCB1cmwsIGFzeW5jKSB7CisJCQltZXRob2QgPSBtZXRoOworCQkJdXJpID0gdXJsOworCQl9OworCQl0aGlzLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkgeworCQkJdmFyIGQgPSBkYXRhIHx8IG51bGw7CisJCQlpZiAobWV0aG9kID09ICJHRVQiKSB7CisJCQkJZ2V0VVJMKHVyaSwgY2IpOworCQkJfSBlbHNlIHsKKwkJCQlwb3N0VVJMKHVyaSwgZGF0YSwgY2IpOworCQkJfQorCQl9OworCX07Cit9Citkb2pvLnJlcXVpcmVJZigoZGpDb25maWdbImlzRGVidWciXSB8fCBkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0pLCAiZG9qby5kZWJ1ZyIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaG9zdGVudl93c2guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaG9zdGVudl93c2guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4NTZkNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ob3N0ZW52X3dzaC5qcwpAQCAtMCwwICsxLDM1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5ob3N0ZW52Lm5hbWVfID0gIndzaCI7CitpZiAodHlwZW9mIFdTY3JpcHQgPT0gInVuZGVmaW5lZCIpIHsKKwlkb2pvLnJhaXNlKCJhdHRlbXB0IHRvIHVzZSBXU0ggaG9zdCBlbnZpcm9ubWVudCB3aGVuIG5vIFdTY3JpcHQgZ2xvYmFsIik7Cit9Citkb2pvLmhvc3RlbnYucHJpbnRsbiA9IFdTY3JpcHQuRWNobzsKK2Rvam8uaG9zdGVudi5nZXRDdXJyZW50U2NyaXB0VXJpID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBXU2NyaXB0LlNjcmlwdEZ1bGxOYW1lKCk7Cit9OworZG9qby5ob3N0ZW52LmdldFRleHQgPSBmdW5jdGlvbiAoZnBhdGgpIHsKKwl2YXIgZnNvID0gbmV3IEFjdGl2ZVhPYmplY3QoIlNjcmlwdGluZy5GaWxlU3lzdGVtT2JqZWN0Iik7CisJdmFyIGlzdHJlYW0gPSBmc28uT3BlblRleHRGaWxlKGZwYXRoLCAxKTsKKwlpZiAoIWlzdHJlYW0pIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciBjb250ZW50cyA9IGlzdHJlYW0uUmVhZEFsbCgpOworCWlzdHJlYW0uQ2xvc2UoKTsKKwlyZXR1cm4gY29udGVudHM7Cit9OworZG9qby5ob3N0ZW52LmV4aXQgPSBmdW5jdGlvbiAoZXhpdGNvZGUpIHsKKwlXU2NyaXB0LlF1aXQoZXhpdGNvZGUpOworfTsKK2Rvam8ucmVxdWlyZUlmKChkakNvbmZpZ1siaXNEZWJ1ZyJdIHx8IGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSksICJkb2pvLmRlYnVnIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjYWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sLmpzCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwiLCAicmVwbGFjZWQgYnkgZG9qby5odG1sLioiLCAiMC41Iik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhN2RmNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmh0bWwuY29tbW9uIiwgImRvam8uaHRtbC5zdHlsZSJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8uaHRtbC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2NvbG9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvY29sb3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlOTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2NvbG9yLmpzCkBAIC0wLDAgKzEsMzggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgY29sb3I7CisJZG8geworCQljb2xvciA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYmFja2dyb3VuZC1jb2xvciIpOworCQlpZiAoY29sb3IudG9Mb3dlckNhc2UoKSA9PSAicmdiYSgwLCAwLCAwLCAwKSIpIHsKKwkJCWNvbG9yID0gInRyYW5zcGFyZW50IjsKKwkJfQorCQlpZiAobm9kZSA9PSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKSB7CisJCQlub2RlID0gbnVsbDsKKwkJCWJyZWFrOworCQl9CisJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJfSB3aGlsZSAobm9kZSAmJiBkb2pvLmxhbmcuaW5BcnJheShbInRyYW5zcGFyZW50IiwgIiJdLCBjb2xvcikpOworCWlmIChjb2xvciA9PSAidHJhbnNwYXJlbnQiKSB7CisJCWNvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDBdOworCX0gZWxzZSB7CisJCWNvbG9yID0gZG9qby5nZnguY29sb3IuZXh0cmFjdFJHQihjb2xvcik7CisJfQorCXJldHVybiBjb2xvcjsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2NvbW1vbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2NvbW1vbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQyNTViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvY29tbW9uLmpzCkBAIC0wLDAgKzEsMTgyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kb20iKTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmh0bWwsIGRvam8uZG9tKTsKK2Rvam8uaHRtbC5ib2R5ID0gZnVuY3Rpb24gKCkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLmJvZHkoKSBtb3ZlZCB0byBkb2pvLmJvZHkoKSIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5ib2R5KCk7Cit9OworZG9qby5odG1sLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKGV2dCkgeworCWlmICghZXZ0KSB7CisJCWV2dCA9IGRvam8uZ2xvYmFsKCkuZXZlbnQgfHwge307CisJfQorCXZhciB0ID0gKGV2dC5zcmNFbGVtZW50ID8gZXZ0LnNyY0VsZW1lbnQgOiAoZXZ0LnRhcmdldCA/IGV2dC50YXJnZXQgOiBudWxsKSk7CisJd2hpbGUgKCh0KSAmJiAodC5ub2RlVHlwZSAhPSAxKSkgeworCQl0ID0gdC5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gdDsKK307Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7CisJdmFyIF93aW5kb3cgPSBkb2pvLmdsb2JhbCgpOworCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCXZhciB3ID0gMDsKKwl2YXIgaCA9IDA7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgeworCQl3ID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKKwkJaCA9IF93aW5kb3cuaW5uZXJIZWlnaHQ7CisJfSBlbHNlIHsKKwkJaWYgKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIF93aW5kb3cuaW5uZXJXaWR0aCkgeworCQkJdyA9IF93aW5kb3cuaW5uZXJXaWR0aDsKKwkJCWggPSBfd2luZG93LmlubmVySGVpZ2h0OworCQl9IGVsc2UgeworCQkJaWYgKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIGRvam8uZXhpc3RzKF9kb2N1bWVudCwgImRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCIpKSB7CisJCQkJdmFyIHcyID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKKwkJCQlpZiAoIXcgfHwgdzIgJiYgdzIgPCB3KSB7CisJCQkJCXcgPSB3MjsKKwkJCQl9CisJCQkJaCA9IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG9qby5ib2R5KCkuY2xpZW50V2lkdGgpIHsKKwkJCQkJdyA9IGRvam8uYm9keSgpLmNsaWVudFdpZHRoOworCQkJCQloID0gZG9qby5ib2R5KCkuY2xpZW50SGVpZ2h0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4ge3dpZHRoOncsIGhlaWdodDpofTsKK307Citkb2pvLmh0bWwuZ2V0U2Nyb2xsID0gZnVuY3Rpb24gKCkgeworCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwl2YXIgdG9wID0gX3dpbmRvdy5wYWdlWU9mZnNldCB8fCBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2pvLmJvZHkoKS5zY3JvbGxUb3AgfHwgMDsKKwl2YXIgbGVmdCA9IF93aW5kb3cucGFnZVhPZmZzZXQgfHwgX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvam8uYm9keSgpLnNjcm9sbExlZnQgfHwgMDsKKwlyZXR1cm4ge3RvcDp0b3AsIGxlZnQ6bGVmdCwgb2Zmc2V0Ont4OmxlZnQsIHk6dG9wfX07Cit9OworZG9qby5odG1sLmdldFBhcmVudEJ5VHlwZSA9IGZ1bmN0aW9uIChub2RlLCB0eXBlKSB7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdmFyIHBhcmVudCA9IGRvam8uYnlJZChub2RlKTsKKwl0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworCXdoaWxlICgocGFyZW50KSAmJiAocGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gdHlwZSkpIHsKKwkJaWYgKHBhcmVudCA9PSAoX2RvY3VtZW50WyJib2R5Il0gfHwgX2RvY3VtZW50WyJkb2N1bWVudEVsZW1lbnQiXSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gcGFyZW50OworfTsKK2Rvam8uaHRtbC5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobm9kZSwgYXR0cikgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYgKCghbm9kZSkgfHwgKCFub2RlLmdldEF0dHJpYnV0ZSkpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciB0YSA9IHR5cGVvZiBhdHRyID09ICJzdHJpbmciID8gYXR0ciA6IG5ldyBTdHJpbmcoYXR0cik7CisJdmFyIHYgPSBub2RlLmdldEF0dHJpYnV0ZSh0YS50b1VwcGVyQ2FzZSgpKTsKKwlpZiAoKHYpICYmICh0eXBlb2YgdiA9PSAic3RyaW5nIikgJiYgKHYgIT0gIiIpKSB7CisJCXJldHVybiB2OworCX0KKwlpZiAodiAmJiB2LnZhbHVlKSB7CisJCXJldHVybiB2LnZhbHVlOworCX0KKwlpZiAoKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSkgJiYgKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSh0YSkpKSB7CisJCXJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlKHRhKSkudmFsdWU7CisJfSBlbHNlIHsKKwkJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKHRhKSkgeworCQkJcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChub2RlLmdldEF0dHJpYnV0ZSh0YS50b0xvd2VyQ2FzZSgpKSkgeworCQkJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZSh0YS50b0xvd2VyQ2FzZSgpKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK307Citkb2pvLmh0bWwuaGFzQXR0cmlidXRlID0gZnVuY3Rpb24gKG5vZGUsIGF0dHIpIHsKKwlyZXR1cm4gZG9qby5odG1sLmdldEF0dHJpYnV0ZShkb2pvLmJ5SWQobm9kZSksIGF0dHIpID8gdHJ1ZSA6IGZhbHNlOworfTsKK2Rvam8uaHRtbC5nZXRDdXJzb3JQb3NpdGlvbiA9IGZ1bmN0aW9uIChlKSB7CisJZSA9IGUgfHwgZG9qby5nbG9iYWwoKS5ldmVudDsKKwl2YXIgY3Vyc29yID0ge3g6MCwgeTowfTsKKwlpZiAoZS5wYWdlWCB8fCBlLnBhZ2VZKSB7CisJCWN1cnNvci54ID0gZS5wYWdlWDsKKwkJY3Vyc29yLnkgPSBlLnBhZ2VZOworCX0gZWxzZSB7CisJCXZhciBkZSA9IGRvam8uZG9jKCkuZG9jdW1lbnRFbGVtZW50OworCQl2YXIgZGIgPSBkb2pvLmJvZHkoKTsKKwkJY3Vyc29yLnggPSBlLmNsaWVudFggKyAoKGRlIHx8IGRiKVsic2Nyb2xsTGVmdCJdKSAtICgoZGUgfHwgZGIpWyJjbGllbnRMZWZ0Il0pOworCQljdXJzb3IueSA9IGUuY2xpZW50WSArICgoZGUgfHwgZGIpWyJzY3JvbGxUb3AiXSkgLSAoKGRlIHx8IGRiKVsiY2xpZW50VG9wIl0pOworCX0KKwlyZXR1cm4gY3Vyc29yOworfTsKK2Rvam8uaHRtbC5pc1RhZyA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZiAobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBTdHJpbmcoYXJndW1lbnRzW2ldKS50b0xvd2VyQ2FzZSgpKSB7CisJCQkJcmV0dXJuIFN0cmluZyhhcmd1bWVudHNbaV0pLnRvTG93ZXJDYXNlKCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICIiOworfTsKK2lmIChkb2pvLnJlbmRlci5odG1sLmllICYmICFkb2pvLnJlbmRlci5odG1sLmllNzApIHsKKwlpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsIDYpLnRvTG93ZXJDYXNlKCkgIT0gImh0dHBzOiIpIHsKKwkJKGZ1bmN0aW9uICgpIHsKKwkJCXZhciB4c2NyaXB0ID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKwkJCXhzY3JpcHQuc3JjID0gImphdmFzY3JpcHQ6J2Rvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQ9ZnVuY3Rpb24oZG9jLCB0YWcpeyByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsgfSciOworCQkJZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHhzY3JpcHQpOworCQl9KSgpOworCX0KK30gZWxzZSB7CisJZG9qby5odG1sLmNyZWF0ZUV4dGVybmFsRWxlbWVudCA9IGZ1bmN0aW9uIChkb2MsIHRhZykgeworCQlyZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsKKwl9OworfQorZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCA9IGZ1bmN0aW9uIChpbkZ1bmMsIHJlcGxGdW5jLCBhcmdzLCBhcmdOYW1lLCByZXRWYWx1ZSkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLiIgKyBpbkZ1bmMsICJyZXBsYWNlZCBieSBkb2pvLmh0bWwuIiArIHJlcGxGdW5jICsgIigiICsgKGFyZ05hbWUgPyAibm9kZSwgeyIgKyBhcmdOYW1lICsgIjogIiArIGFyZ05hbWUgKyAifSIgOiAiIikgKyAiKSIgKyAocmV0VmFsdWUgPyAiLiIgKyByZXRWYWx1ZSA6ICIiKSwgIjAuNSIpOworCXZhciBuZXdBcmdzID0gW107CisJaWYgKGFyZ05hbWUpIHsKKwkJdmFyIGFyZ3NJbiA9IHt9OworCQlhcmdzSW5bYXJnTmFtZV0gPSBhcmdzWzFdOworCQluZXdBcmdzLnB1c2goYXJnc1swXSk7CisJCW5ld0FyZ3MucHVzaChhcmdzSW4pOworCX0gZWxzZSB7CisJCW5ld0FyZ3MgPSBhcmdzOworCX0KKwl2YXIgcmV0ID0gZG9qby5odG1sW3JlcGxGdW5jXS5hcHBseShkb2pvLmh0bWwsIGFyZ3MpOworCWlmIChyZXRWYWx1ZSkgeworCQlyZXR1cm4gcmV0W3JldFZhbHVlXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gcmV0OworCX0KK307Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Vmlld3BvcnRXaWR0aCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldFZpZXdwb3J0SGVpZ2h0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRWaWV3cG9ydEhlaWdodCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydFNpemUgPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFZpZXdwb3J0U2l6ZSIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cyk7Cit9OworZG9qby5odG1sLmdldFNjcm9sbFRvcCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsVG9wIiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgInRvcCIpOworfTsKK2Rvam8uaHRtbC5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxMZWZ0IiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgImxlZnQiKTsKK307Citkb2pvLmh0bWwuZ2V0U2Nyb2xsT2Zmc2V0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxPZmZzZXQiLCAiZ2V0U2Nyb2xsIiwgYXJndW1lbnRzLCBudWxsLCAib2Zmc2V0Iik7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9kaXNwbGF5LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvZGlzcGxheS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhlODJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvZGlzcGxheS5qcwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmRpc3BsYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLmh0bWwuX3RvZ2dsZSA9IGZ1bmN0aW9uIChub2RlLCB0ZXN0ZXIsIHNldHRlcikgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJc2V0dGVyKG5vZGUsICF0ZXN0ZXIobm9kZSkpOworCXJldHVybiB0ZXN0ZXIobm9kZSk7Cit9OworZG9qby5odG1sLnNob3cgPSBmdW5jdGlvbiAobm9kZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYgKGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsICJkaXNwbGF5IikgPT0gIm5vbmUiKSB7CisJCWRvam8uaHRtbC5zZXRTdHlsZShub2RlLCAiZGlzcGxheSIsIChub2RlLmRvam9EaXNwbGF5Q2FjaGUgfHwgIiIpKTsKKwkJbm9kZS5kb2pvRGlzcGxheUNhY2hlID0gdW5kZWZpbmVkOworCX0KK307Citkb2pvLmh0bWwuaGlkZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZiAodHlwZW9mIG5vZGVbImRvam9EaXNwbGF5Q2FjaGUiXSA9PSAidW5kZWZpbmVkIikgeworCQl2YXIgZCA9IGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsICJkaXNwbGF5Iik7CisJCWlmIChkICE9ICJub25lIikgeworCQkJbm9kZS5kb2pvRGlzcGxheUNhY2hlID0gZDsKKwkJfQorCX0KKwlkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwgImRpc3BsYXkiLCAibm9uZSIpOworfTsKK2Rvam8uaHRtbC5zZXRTaG93aW5nID0gZnVuY3Rpb24gKG5vZGUsIHNob3dpbmcpIHsKKwlkb2pvLmh0bWxbKHNob3dpbmcgPyAic2hvdyIgOiAiaGlkZSIpXShub2RlKTsKK307Citkb2pvLmh0bWwuaXNTaG93aW5nID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsICJkaXNwbGF5IikgIT0gIm5vbmUiKTsKK307Citkb2pvLmh0bWwudG9nZ2xlU2hvd2luZyA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsIGRvam8uaHRtbC5pc1Nob3dpbmcsIGRvam8uaHRtbC5zZXRTaG93aW5nKTsKK307Citkb2pvLmh0bWwuZGlzcGxheU1hcCA9IHt0cjoiIiwgdGQ6IiIsIHRoOiIiLCBpbWc6ImlubGluZSIsIHNwYW46ImlubGluZSIsIGlucHV0OiJpbmxpbmUiLCBidXR0b246ImlubGluZSJ9OworZG9qby5odG1sLnN1Z2dlc3REaXNwbGF5QnlUYWdOYW1lID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmIChub2RlICYmIG5vZGUudGFnTmFtZSkgeworCQl2YXIgdGFnID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJCXJldHVybiAodGFnIGluIGRvam8uaHRtbC5kaXNwbGF5TWFwID8gZG9qby5odG1sLmRpc3BsYXlNYXBbdGFnXSA6ICJibG9jayIpOworCX0KK307Citkb2pvLmh0bWwuc2V0RGlzcGxheSA9IGZ1bmN0aW9uIChub2RlLCBkaXNwbGF5KSB7CisJZG9qby5odG1sLnNldFN0eWxlKG5vZGUsICJkaXNwbGF5IiwgKChkaXNwbGF5IGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBkaXNwbGF5ID09ICJzdHJpbmciKSA/IGRpc3BsYXkgOiAoZGlzcGxheSA/IGRvam8uaHRtbC5zdWdnZXN0RGlzcGxheUJ5VGFnTmFtZShub2RlKSA6ICJub25lIikpKTsKK307Citkb2pvLmh0bWwuaXNEaXNwbGF5ZWQgPSBmdW5jdGlvbiAobm9kZSkgeworCXJldHVybiAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgImRpc3BsYXkiKSAhPSAibm9uZSIpOworfTsKK2Rvam8uaHRtbC50b2dnbGVEaXNwbGF5ID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gZG9qby5odG1sLl90b2dnbGUobm9kZSwgZG9qby5odG1sLmlzRGlzcGxheWVkLCBkb2pvLmh0bWwuc2V0RGlzcGxheSk7Cit9OworZG9qby5odG1sLnNldFZpc2liaWxpdHkgPSBmdW5jdGlvbiAobm9kZSwgdmlzaWJpbGl0eSkgeworCWRvam8uaHRtbC5zZXRTdHlsZShub2RlLCAidmlzaWJpbGl0eSIsICgodmlzaWJpbGl0eSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2YgdmlzaWJpbGl0eSA9PSAic3RyaW5nIikgPyB2aXNpYmlsaXR5IDogKHZpc2liaWxpdHkgPyAidmlzaWJsZSIgOiAiaGlkZGVuIikpKTsKK307Citkb2pvLmh0bWwuaXNWaXNpYmxlID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICJ2aXNpYmlsaXR5IikgIT0gImhpZGRlbiIpOworfTsKK2Rvam8uaHRtbC50b2dnbGVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gZG9qby5odG1sLl90b2dnbGUobm9kZSwgZG9qby5odG1sLmlzVmlzaWJsZSwgZG9qby5odG1sLnNldFZpc2liaWxpdHkpOworfTsKK2Rvam8uaHRtbC5zZXRPcGFjaXR5ID0gZnVuY3Rpb24gKG5vZGUsIG9wYWNpdHksIGRvbnRGaXhPcGFjaXR5KSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJaWYgKCFkb250Rml4T3BhY2l0eSkgeworCQlpZiAob3BhY2l0eSA+PSAxKSB7CisJCQlpZiAoaC5pZSkgeworCQkJCWRvam8uaHRtbC5jbGVhck9wYWNpdHkobm9kZSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlvcGFjaXR5ID0gMC45OTk5OTk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAob3BhY2l0eSA8IDApIHsKKwkJCQlvcGFjaXR5ID0gMDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoaC5pZSkgeworCQlpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ciIpIHsKKwkJCXZhciB0ZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJZm9yICh2YXIgeCA9IDA7IHggPCB0ZHMubGVuZ3RoOyB4KyspIHsKKwkJCQl0ZHNbeF0uc3R5bGUuZmlsdGVyID0gIkFscGhhKE9wYWNpdHk9IiArIG9wYWNpdHkgKiAxMDAgKyAiKSI7CisJCQl9CisJCX0KKwkJbm9kZS5zdHlsZS5maWx0ZXIgPSAiQWxwaGEoT3BhY2l0eT0iICsgb3BhY2l0eSAqIDEwMCArICIpIjsKKwl9IGVsc2UgeworCQlpZiAoaC5tb3opIHsKKwkJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJCQlub2RlLnN0eWxlLk1vek9wYWNpdHkgPSBvcGFjaXR5OworCQl9IGVsc2UgeworCQkJaWYgKGguc2FmYXJpKSB7CisJCQkJbm9kZS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTsKKwkJCQlub2RlLnN0eWxlLktodG1sT3BhY2l0eSA9IG9wYWNpdHk7CisJCQl9IGVsc2UgeworCQkJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJCQl9CisJCX0KKwl9Cit9OworZG9qby5odG1sLmNsZWFyT3BhY2l0eSA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgbnMgPSBub2RlLnN0eWxlOworCXZhciBoID0gZG9qby5yZW5kZXIuaHRtbDsKKwlpZiAoaC5pZSkgeworCQl0cnkgeworCQkJaWYgKG5vZGUuZmlsdGVycyAmJiBub2RlLmZpbHRlcnMuYWxwaGEpIHsKKwkJCQlucy5maWx0ZXIgPSAiIjsKKwkJCX0KKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGgubW96KSB7CisJCQlucy5vcGFjaXR5ID0gMTsKKwkJCW5zLk1vek9wYWNpdHkgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGguc2FmYXJpKSB7CisJCQkJbnMub3BhY2l0eSA9IDE7CisJCQkJbnMuS2h0bWxPcGFjaXR5ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJbnMub3BhY2l0eSA9IDE7CisJCQl9CisJCX0KKwl9Cit9OworZG9qby5odG1sLmdldE9wYWNpdHkgPSBmdW5jdGlvbiAobm9kZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCWlmIChoLmllKSB7CisJCXZhciBvcGFjID0gKG5vZGUuZmlsdGVycyAmJiBub2RlLmZpbHRlcnMuYWxwaGEgJiYgdHlwZW9mIG5vZGUuZmlsdGVycy5hbHBoYS5vcGFjaXR5ID09ICJudW1iZXIiID8gbm9kZS5maWx0ZXJzLmFscGhhLm9wYWNpdHkgOiAxMDApIC8gMTAwOworCX0gZWxzZSB7CisJCXZhciBvcGFjID0gbm9kZS5zdHlsZS5vcGFjaXR5IHx8IG5vZGUuc3R5bGUuTW96T3BhY2l0eSB8fCBub2RlLnN0eWxlLktodG1sT3BhY2l0eSB8fCAxOworCX0KKwlyZXR1cm4gb3BhYyA+PSAwLjk5OTk5OSA/IDEgOiBOdW1iZXIob3BhYyk7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pZnJhbWUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pZnJhbWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4MzJhNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2lmcmFtZS5qcwpAQCAtMCwwICsxLDg0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuaWZyYW1lIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC51dGlsIik7Citkb2pvLmh0bWwuaWZyYW1lQ29udGVudFdpbmRvdyA9IGZ1bmN0aW9uIChpZnJhbWVfZWwpIHsKKwl2YXIgd2luID0gZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KGRvam8uaHRtbC5pZnJhbWVDb250ZW50RG9jdW1lbnQoaWZyYW1lX2VsKSkgfHwgZG9qby5odG1sLmlmcmFtZUNvbnRlbnREb2N1bWVudChpZnJhbWVfZWwpLl9fcGFyZW50X18gfHwgKGlmcmFtZV9lbC5uYW1lICYmIGRvY3VtZW50LmZyYW1lc1tpZnJhbWVfZWwubmFtZV0pIHx8IG51bGw7CisJcmV0dXJuIHdpbjsKK307Citkb2pvLmh0bWwuaWZyYW1lQ29udGVudERvY3VtZW50ID0gZnVuY3Rpb24gKGlmcmFtZV9lbCkgeworCXZhciBkb2MgPSBpZnJhbWVfZWwuY29udGVudERvY3VtZW50IHx8ICgoaWZyYW1lX2VsLmNvbnRlbnRXaW5kb3cpICYmIChpZnJhbWVfZWwuY29udGVudFdpbmRvdy5kb2N1bWVudCkpIHx8ICgoaWZyYW1lX2VsLm5hbWUpICYmIChkb2N1bWVudC5mcmFtZXNbaWZyYW1lX2VsLm5hbWVdKSAmJiAoZG9jdW1lbnQuZnJhbWVzW2lmcmFtZV9lbC5uYW1lXS5kb2N1bWVudCkpIHx8IG51bGw7CisJcmV0dXJuIGRvYzsKK307Citkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApIHsKKwkJdmFyIGh0bWwgPSAiPGlmcmFtZSBzcmM9J2phdmFzY3JpcHQ6ZmFsc2UnIiArICIgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMHB4OyB0b3A6IDBweDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsiICsgInotaW5kZXg6IC0xOyBmaWx0ZXI6QWxwaGEoT3BhY2l0eT1cIjBcIik7JyAiICsgIj4iOworCQl0aGlzLmlmcmFtZSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudChodG1sKTsKKwkJdGhpcy5pZnJhbWUudGFiSW5kZXggPSAtMTsKKwkJaWYgKG5vZGUpIHsKKwkJCW5vZGUuYXBwZW5kQ2hpbGQodGhpcy5pZnJhbWUpOworCQkJdGhpcy5kb21Ob2RlID0gbm9kZTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwkJCXRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCX0KKwl9Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSwge2lmcmFtZTpudWxsLCBvblJlc2l6ZWQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmRvbU5vZGUgJiYgdGhpcy5kb21Ob2RlLnBhcmVudE5vZGUpIHsKKwkJdmFyIG91dGVyID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCQlpZiAob3V0ZXIud2lkdGggPT0gMCB8fCBvdXRlci5oZWlnaHQgPT0gMCkgeworCQkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgdGhpcy5vblJlc2l6ZWQsIDEwMCk7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5pZnJhbWUuc3R5bGUud2lkdGggPSBvdXRlci53aWR0aCArICJweCI7CisJCXRoaXMuaWZyYW1lLnN0eWxlLmhlaWdodCA9IG91dGVyLmhlaWdodCArICJweCI7CisJfQorfSwgc2l6ZTpmdW5jdGlvbiAobm9kZSkgeworCWlmICghdGhpcy5pZnJhbWUpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgY29vcmRzID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdChub2RlLCB0cnVlLCBkb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gpOworCXdpdGggKHRoaXMuaWZyYW1lLnN0eWxlKSB7CisJCXdpZHRoID0gY29vcmRzLndpZHRoICsgInB4IjsKKwkJaGVpZ2h0ID0gY29vcmRzLmhlaWdodCArICJweCI7CisJCWxlZnQgPSBjb29yZHMubGVmdCArICJweCI7CisJCXRvcCA9IGNvb3Jkcy50b3AgKyAicHgiOworCX0KK30sIHNldFpJbmRleDpmdW5jdGlvbiAobm9kZSkgeworCWlmICghdGhpcy5pZnJhbWUpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG9qby5kb20uaXNOb2RlKG5vZGUpKSB7CisJCXRoaXMuaWZyYW1lLnN0eWxlLnpJbmRleCA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiei1pbmRleCIpIC0gMTsKKwl9IGVsc2UgeworCQlpZiAoIWlzTmFOKG5vZGUpKSB7CisJCQl0aGlzLmlmcmFtZS5zdHlsZS56SW5kZXggPSBub2RlOworCQl9CisJfQorfSwgc2hvdzpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaWZyYW1lKSB7CisJCXRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCX0KK30sIGhpZGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlmcmFtZSkgeworCQl0aGlzLmlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCX0KK30sIHJlbW92ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaWZyYW1lKSB7CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuaWZyYW1lLCB0cnVlKTsKKwkJZGVsZXRlIHRoaXMuaWZyYW1lOworCQl0aGlzLmlmcmFtZSA9IG51bGw7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93Qi5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93Qi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhOGEyYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2ltYWdlcy9zaGFkb3dCLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93QkwucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd0JMLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTI2MjgzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd0JMLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93QlIucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd0JSLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTcwNGRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd0JSLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93TC5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93TC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYmMyZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2ltYWdlcy9zaGFkb3dMLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93Ui5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93Ui5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYzk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2ltYWdlcy9zaGFkb3dSLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93VC5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93VC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5OTQzNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2ltYWdlcy9zaGFkb3dULnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93VEwucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd1RMLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg3NDJhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd1RMLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9pbWFnZXMvc2hhZG93VFIucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd1RSLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQ0ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvaW1hZ2VzL3NoYWRvd1RSLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9sYXlvdXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9sYXlvdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyZjhjNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL2xheW91dC5qcwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuIDA7CisJfQorCXZhciByZXRWYWwgPSAwOworCXdoaWxlIChub2RlKSB7CisJCWlmIChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAicG9zaXRpb24iKSA9PSAiZml4ZWQiKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl2YXIgdmFsID0gbm9kZVtwcm9wXTsKKwkJaWYgKHZhbCkgeworCQkJcmV0VmFsICs9IHZhbCAtIDA7CisJCQlpZiAobm9kZSA9PSBkb2pvLmJvZHkoKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJfQorCXJldHVybiByZXRWYWw7Cit9OworZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChub2RlLCBhdHRyaWJ1dGVzKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgc3BsaXR0ZWRBdHRyaWJzID0gYXR0cmlidXRlcy5yZXBsYWNlKC8oOyk/XHMqJC8sICIiKS5zcGxpdCgiOyIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXR0ZWRBdHRyaWJzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBuYW1lVmFsdWUgPSBzcGxpdHRlZEF0dHJpYnNbaV0uc3BsaXQoIjoiKTsKKwkJdmFyIG5hbWUgPSBuYW1lVmFsdWVbMF0ucmVwbGFjZSgvXHMqJC8sICIiKS5yZXBsYWNlKC9eXHMqLywgIiIpLnRvTG93ZXJDYXNlKCk7CisJCXZhciB2YWx1ZSA9IG5hbWVWYWx1ZVsxXS5yZXBsYWNlKC9ccyokLywgIiIpLnJlcGxhY2UoL15ccyovLCAiIik7CisJCXN3aXRjaCAobmFtZSkgeworCQkgIGNhc2UgIm9wYWNpdHkiOgorCQkJZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSwgdmFsdWUpOworCQkJYnJlYWs7CisJCSAgY2FzZSAiY29udGVudC1oZWlnaHQiOgorCQkJZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSwge2hlaWdodDp2YWx1ZX0pOworCQkJYnJlYWs7CisJCSAgY2FzZSAiY29udGVudC13aWR0aCI6CisJCQlkb2pvLmh0bWwuc2V0Q29udGVudEJveChub2RlLCB7d2lkdGg6dmFsdWV9KTsKKwkJCWJyZWFrOworCQkgIGNhc2UgIm91dGVyLWhlaWdodCI6CisJCQlkb2pvLmh0bWwuc2V0TWFyZ2luQm94KG5vZGUsIHtoZWlnaHQ6dmFsdWV9KTsKKwkJCWJyZWFrOworCQkgIGNhc2UgIm91dGVyLXdpZHRoIjoKKwkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSwge3dpZHRoOnZhbHVlfSk7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJbm9kZS5zdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UobmFtZSldID0gdmFsdWU7CisJCX0KKwl9Cit9OworZG9qby5odG1sLmJveFNpemluZyA9IHtNQVJHSU5fQk9YOiJtYXJnaW4tYm94IiwgQk9SREVSX0JPWDoiYm9yZGVyLWJveCIsIFBBRERJTkdfQk9YOiJwYWRkaW5nLWJveCIsIENPTlRFTlRfQk9YOiJjb250ZW50LWJveCJ9OworZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24gPSBkb2pvLmh0bWwuYWJzID0gZnVuY3Rpb24gKG5vZGUsIGluY2x1ZGVTY3JvbGwsIGJveFR5cGUpIHsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUsIG5vZGUub3duZXJEb2N1bWVudCk7CisJdmFyIHJldCA9IHt4OjAsIHk6MH07CisJdmFyIGJzID0gZG9qby5odG1sLmJveFNpemluZzsKKwlpZiAoIWJveFR5cGUpIHsKKwkJYm94VHlwZSA9IGJzLkNPTlRFTlRfQk9YOworCX0KKwl2YXIgbmF0aXZlQm94VHlwZSA9IDI7CisJdmFyIHRhcmdldEJveFR5cGU7CisJc3dpdGNoIChib3hUeXBlKSB7CisJICBjYXNlIGJzLk1BUkdJTl9CT1g6CisJCXRhcmdldEJveFR5cGUgPSAzOworCQlicmVhazsKKwkgIGNhc2UgYnMuQk9SREVSX0JPWDoKKwkJdGFyZ2V0Qm94VHlwZSA9IDI7CisJCWJyZWFrOworCSAgY2FzZSBicy5QQURESU5HX0JPWDoKKwkgIGRlZmF1bHQ6CisJCXRhcmdldEJveFR5cGUgPSAxOworCQlicmVhazsKKwkgIGNhc2UgYnMuQ09OVEVOVF9CT1g6CisJCXRhcmdldEJveFR5cGUgPSAwOworCQlicmVhazsKKwl9CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCXZhciBkYiA9IGRvY3VtZW50WyJib2R5Il0gfHwgZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdOworCWlmIChoLmllKSB7CisJCXdpdGggKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIHsKKwkJCXJldC54ID0gbGVmdCAtIDI7CisJCQlyZXQueSA9IHRvcCAtIDI7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yKSB7CisJCQluYXRpdmVCb3hUeXBlID0gMTsKKwkJCXRyeSB7CisJCQkJdmFyIGJvID0gZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yKG5vZGUpOworCQkJCXJldC54ID0gYm8ueCAtIGRvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXMobm9kZSwgInNjcm9sbExlZnQiKTsKKwkJCQlyZXQueSA9IGJvLnkgLSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsICJzY3JvbGxUb3AiKTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobm9kZVsib2Zmc2V0UGFyZW50Il0pIHsKKwkJCQl2YXIgZW5kTm9kZTsKKwkJCQlpZiAoKGguc2FmYXJpKSAmJiAobm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJwb3NpdGlvbiIpID09ICJhYnNvbHV0ZSIpICYmIChub2RlLnBhcmVudE5vZGUgPT0gZGIpKSB7CisJCQkJCWVuZE5vZGUgPSBkYjsKKwkJCQl9IGVsc2UgeworCQkJCQllbmROb2RlID0gZGIucGFyZW50Tm9kZTsKKwkJCQl9CisJCQkJaWYgKG5vZGUucGFyZW50Tm9kZSAhPSBkYikgeworCQkJCQl2YXIgbmQgPSBub2RlOworCQkJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkgeworCQkJCQkJbmQgPSBkYjsKKwkJCQkJfQorCQkJCQlyZXQueCAtPSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5kLCAic2Nyb2xsTGVmdCIpOworCQkJCQlyZXQueSAtPSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5kLCAic2Nyb2xsVG9wIik7CisJCQkJfQorCQkJCXZhciBjdXJub2RlID0gbm9kZTsKKwkJCQlkbyB7CisJCQkJCXZhciBuID0gY3Vybm9kZVsib2Zmc2V0TGVmdCJdOworCQkJCQlpZiAoIWgub3BlcmEgfHwgbiA+IDApIHsKKwkJCQkJCXJldC54ICs9IGlzTmFOKG4pID8gMCA6IG47CisJCQkJCX0KKwkJCQkJdmFyIG0gPSBjdXJub2RlWyJvZmZzZXRUb3AiXTsKKwkJCQkJcmV0LnkgKz0gaXNOYU4obSkgPyAwIDogbTsKKwkJCQkJY3Vybm9kZSA9IGN1cm5vZGUub2Zmc2V0UGFyZW50OworCQkJCX0gd2hpbGUgKChjdXJub2RlICE9IGVuZE5vZGUpICYmIChjdXJub2RlICE9IG51bGwpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5vZGVbIngiXSAmJiBub2RlWyJ5Il0pIHsKKwkJCQkJcmV0LnggKz0gaXNOYU4obm9kZS54KSA/IDAgOiBub2RlLng7CisJCQkJCXJldC55ICs9IGlzTmFOKG5vZGUueSkgPyAwIDogbm9kZS55OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoaW5jbHVkZVNjcm9sbCkgeworCQl2YXIgc2Nyb2xsID0gZG9qby5odG1sLmdldFNjcm9sbCgpOworCQlyZXQueSArPSBzY3JvbGwudG9wOworCQlyZXQueCArPSBzY3JvbGwubGVmdDsKKwl9CisJdmFyIGV4dGVudEZ1bmNBcnJheSA9IFtkb2pvLmh0bWwuZ2V0UGFkZGluZ0V4dGVudCwgZG9qby5odG1sLmdldEJvcmRlckV4dGVudCwgZG9qby5odG1sLmdldE1hcmdpbkV4dGVudF07CisJaWYgKG5hdGl2ZUJveFR5cGUgPiB0YXJnZXRCb3hUeXBlKSB7CisJCWZvciAodmFyIGkgPSB0YXJnZXRCb3hUeXBlOyBpIDwgbmF0aXZlQm94VHlwZTsgKytpKSB7CisJCQlyZXQueSArPSBleHRlbnRGdW5jQXJyYXlbaV0obm9kZSwgInRvcCIpOworCQkJcmV0LnggKz0gZXh0ZW50RnVuY0FycmF5W2ldKG5vZGUsICJsZWZ0Iik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmF0aXZlQm94VHlwZSA8IHRhcmdldEJveFR5cGUpIHsKKwkJCWZvciAodmFyIGkgPSB0YXJnZXRCb3hUeXBlOyBpID4gbmF0aXZlQm94VHlwZTsgLS1pKSB7CisJCQkJcmV0LnkgLT0gZXh0ZW50RnVuY0FycmF5W2kgLSAxXShub2RlLCAidG9wIik7CisJCQkJcmV0LnggLT0gZXh0ZW50RnVuY0FycmF5W2kgLSAxXShub2RlLCAibGVmdCIpOworCQkJfQorCQl9CisJfQorCXJldC50b3AgPSByZXQueTsKKwlyZXQubGVmdCA9IHJldC54OworCXJldHVybiByZXQ7Cit9OworZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKTsKK307Citkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzID0gZnVuY3Rpb24gKG5vZGUsIHNlbGVjdG9ycywgYXV0b0lzWmVybykgeworCXZhciB0b3RhbCA9IDA7CisJZm9yICh2YXIgeCA9IDA7IHggPCBzZWxlY3RvcnMubGVuZ3RoOyB4KyspIHsKKwkJdG90YWwgKz0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUobm9kZSwgc2VsZWN0b3JzW3hdLCBhdXRvSXNaZXJvKTsKKwl9CisJcmV0dXJuIHRvdGFsOworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW4gPSBmdW5jdGlvbiAobm9kZSkgeworCXJldHVybiB7d2lkdGg6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCJdLCAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikpLCBoZWlnaHQ6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbIm1hcmdpbi10b3AiLCAibWFyZ2luLWJvdHRvbSJdLCAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgInBvc2l0aW9uIikgPT0gImFic29sdXRlIikpfTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4ge3dpZHRoOmRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwgImxlZnQiKSArIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwgInJpZ2h0IiksIGhlaWdodDpkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsICJ0b3AiKSArIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwgImJvdHRvbSIpfTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHNpZGUpIHsKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYm9yZGVyLSIgKyBzaWRlICsgIi1zdHlsZSIpID09ICJub25lIiA/IDAgOiBkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShub2RlLCAiYm9yZGVyLSIgKyBzaWRlICsgIi13aWR0aCIpKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luRXh0ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHNpZGUpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbIm1hcmdpbi0iICsgc2lkZV0sIGRvam8uaHRtbC5pc1Bvc2l0aW9uQWJzb2x1dGUobm9kZSkpOworfTsKK2Rvam8uaHRtbC5nZXRQYWRkaW5nRXh0ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHNpZGUpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbInBhZGRpbmctIiArIHNpZGVdLCB0cnVlKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZyA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIHt3aWR0aDpkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsIFsicGFkZGluZy1sZWZ0IiwgInBhZGRpbmctcmlnaHQiXSwgdHJ1ZSksIGhlaWdodDpkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsIFsicGFkZGluZy10b3AiLCAicGFkZGluZy1ib3R0b20iXSwgdHJ1ZSl9OworfTsKK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXIgPSBmdW5jdGlvbiAobm9kZSkgeworCXZhciBwYWQgPSBkb2pvLmh0bWwuZ2V0UGFkZGluZyhub2RlKTsKKwl2YXIgYm9yZGVyID0gZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKKwlyZXR1cm4ge3dpZHRoOnBhZC53aWR0aCArIGJvcmRlci53aWR0aCwgaGVpZ2h0OnBhZC5oZWlnaHQgKyBib3JkZXIuaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuZ2V0Qm94U2l6aW5nID0gZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGJzID0gZG9qby5odG1sLmJveFNpemluZzsKKwlpZiAoKChoLmllKSB8fCAoaC5vcGVyYSkpICYmIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiaW1nIikgeworCQl2YXIgY20gPSBkb2N1bWVudFsiY29tcGF0TW9kZSJdOworCQlpZiAoKGNtID09ICJCYWNrQ29tcGF0IikgfHwgKGNtID09ICJRdWlya3NNb2RlIikpIHsKKwkJCXJldHVybiBicy5CT1JERVJfQk9YOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGJzLkNPTlRFTlRfQk9YOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgeworCQkJbm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKwkJfQorCQl2YXIgc2l6aW5nOworCQlpZiAoIWguaWUpIHsKKwkJCXNpemluZyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiLW1vei1ib3gtc2l6aW5nIik7CisJCQlpZiAoIXNpemluZykgeworCQkJCXNpemluZyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYm94LXNpemluZyIpOworCQkJfQorCQl9CisJCXJldHVybiAoc2l6aW5nID8gc2l6aW5nIDogYnMuQ09OVEVOVF9CT1gpOworCX0KK307Citkb2pvLmh0bWwuaXNCb3JkZXJCb3ggPSBmdW5jdGlvbiAobm9kZSkgeworCXJldHVybiAoZG9qby5odG1sLmdldEJveFNpemluZyhub2RlKSA9PSBkb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJCb3ggPSBmdW5jdGlvbiAobm9kZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJcmV0dXJuIHt3aWR0aDpub2RlLm9mZnNldFdpZHRoLCBoZWlnaHQ6bm9kZS5vZmZzZXRIZWlnaHR9OworfTsKK2Rvam8uaHRtbC5nZXRQYWRkaW5nQm94ID0gZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgYm94ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsKKwl2YXIgYm9yZGVyID0gZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKKwlyZXR1cm4ge3dpZHRoOmJveC53aWR0aCAtIGJvcmRlci53aWR0aCwgaGVpZ2h0OmJveC5oZWlnaHQgLSBib3JkZXIuaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuZ2V0Q29udGVudEJveCA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgcGFkYm9yZGVyID0gZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKTsKKwlyZXR1cm4ge3dpZHRoOm5vZGUub2Zmc2V0V2lkdGggLSBwYWRib3JkZXIud2lkdGgsIGhlaWdodDpub2RlLm9mZnNldEhlaWdodCAtIHBhZGJvcmRlci5oZWlnaHR9OworfTsKK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94ID0gZnVuY3Rpb24gKG5vZGUsIGFyZ3MpIHsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXZhciB3aWR0aCA9IDA7CisJdmFyIGhlaWdodCA9IDA7CisJdmFyIGlzYmIgPSBkb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9IChpc2JiID8gZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKSA6IHt3aWR0aDowLCBoZWlnaHQ6MH0pOworCXZhciByZXQgPSB7fTsKKwlpZiAodHlwZW9mIGFyZ3Mud2lkdGggIT0gInVuZGVmaW5lZCIpIHsKKwkJd2lkdGggPSBhcmdzLndpZHRoICsgcGFkYm9yZGVyLndpZHRoOworCQlyZXQud2lkdGggPSBkb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsICJ3aWR0aCIsIHdpZHRoKTsKKwl9CisJaWYgKHR5cGVvZiBhcmdzLmhlaWdodCAhPSAidW5kZWZpbmVkIikgeworCQloZWlnaHQgPSBhcmdzLmhlaWdodCArIHBhZGJvcmRlci5oZWlnaHQ7CisJCXJldC5oZWlnaHQgPSBkb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsICJoZWlnaHQiLCBoZWlnaHQpOworCX0KKwlyZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5Cb3ggPSBmdW5jdGlvbiAobm9kZSkgeworCXZhciBib3JkZXJib3ggPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOworCXZhciBtYXJnaW4gPSBkb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOworCXJldHVybiB7d2lkdGg6Ym9yZGVyYm94LndpZHRoICsgbWFyZ2luLndpZHRoLCBoZWlnaHQ6Ym9yZGVyYm94LmhlaWdodCArIG1hcmdpbi5oZWlnaHR9OworfTsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3ggPSBmdW5jdGlvbiAobm9kZSwgYXJncykgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpZHRoID0gMDsKKwl2YXIgaGVpZ2h0ID0gMDsKKwl2YXIgaXNiYiA9IGRvam8uaHRtbC5pc0JvcmRlckJveChub2RlKTsKKwl2YXIgcGFkYm9yZGVyID0gKCFpc2JiID8gZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKSA6IHt3aWR0aDowLCBoZWlnaHQ6MH0pOworCXZhciBtYXJnaW4gPSBkb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOworCXZhciByZXQgPSB7fTsKKwlpZiAodHlwZW9mIGFyZ3Mud2lkdGggIT0gInVuZGVmaW5lZCIpIHsKKwkJd2lkdGggPSBhcmdzLndpZHRoIC0gcGFkYm9yZGVyLndpZHRoOworCQl3aWR0aCAtPSBtYXJnaW4ud2lkdGg7CisJCXJldC53aWR0aCA9IGRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwgIndpZHRoIiwgd2lkdGgpOworCX0KKwlpZiAodHlwZW9mIGFyZ3MuaGVpZ2h0ICE9ICJ1bmRlZmluZWQiKSB7CisJCWhlaWdodCA9IGFyZ3MuaGVpZ2h0IC0gcGFkYm9yZGVyLmhlaWdodDsKKwkJaGVpZ2h0IC09IG1hcmdpbi5oZWlnaHQ7CisJCXJldC5oZWlnaHQgPSBkb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsICJoZWlnaHQiLCBoZWlnaHQpOworCX0KKwlyZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5nZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24gKG5vZGUsIHR5cGUpIHsKKwl2YXIgYnMgPSBkb2pvLmh0bWwuYm94U2l6aW5nOworCXN3aXRjaCAodHlwZSkgeworCSAgY2FzZSBicy5NQVJHSU5fQk9YOgorCQlyZXR1cm4gZG9qby5odG1sLmdldE1hcmdpbkJveChub2RlKTsKKwkgIGNhc2UgYnMuQk9SREVSX0JPWDoKKwkJcmV0dXJuIGRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7CisJICBjYXNlIGJzLlBBRERJTkdfQk9YOgorCQlyZXR1cm4gZG9qby5odG1sLmdldFBhZGRpbmdCb3gobm9kZSk7CisJICBjYXNlIGJzLkNPTlRFTlRfQk9YOgorCSAgZGVmYXVsdDoKKwkJcmV0dXJuIGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpOworCX0KK307Citkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0ID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZUFycmF5ID0gZnVuY3Rpb24gKGNvb3JkcywgaW5jbHVkZVNjcm9sbCwgYm94dHlwZSkgeworCWlmIChjb29yZHMgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2YgY29vcmRzID09ICJhcnJheSIpIHsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkiLCAidXNlIGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3Qoe2xlZnQ6ICwgdG9wOiAsIHdpZHRoOiAsIGhlaWdodDogfSkgaW5zdGVhZCIsICIwLjUiKTsKKwkJd2hpbGUgKGNvb3Jkcy5sZW5ndGggPCA0KSB7CisJCQljb29yZHMucHVzaCgwKTsKKwkJfQorCQl3aGlsZSAoY29vcmRzLmxlbmd0aCA+IDQpIHsKKwkJCWNvb3Jkcy5wb3AoKTsKKwkJfQorCQl2YXIgcmV0ID0ge2xlZnQ6Y29vcmRzWzBdLCB0b3A6Y29vcmRzWzFdLCB3aWR0aDpjb29yZHNbMl0sIGhlaWdodDpjb29yZHNbM119OworCX0gZWxzZSB7CisJCWlmICghY29vcmRzLm5vZGVUeXBlICYmICEoY29vcmRzIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBjb29yZHMgPT0gInN0cmluZyIpICYmICgid2lkdGgiIGluIGNvb3JkcyB8fCAiaGVpZ2h0IiBpbiBjb29yZHMgfHwgImxlZnQiIGluIGNvb3JkcyB8fCAieCIgaW4gY29vcmRzIHx8ICJ0b3AiIGluIGNvb3JkcyB8fCAieSIgaW4gY29vcmRzKSkgeworCQkJdmFyIHJldCA9IHtsZWZ0OmNvb3Jkcy5sZWZ0IHx8IGNvb3Jkcy54IHx8IDAsIHRvcDpjb29yZHMudG9wIHx8IGNvb3Jkcy55IHx8IDAsIHdpZHRoOmNvb3Jkcy53aWR0aCB8fCAwLCBoZWlnaHQ6Y29vcmRzLmhlaWdodCB8fCAwfTsKKwkJfSBlbHNlIHsKKwkJCXZhciBub2RlID0gZG9qby5ieUlkKGNvb3Jkcyk7CisJCQl2YXIgcG9zID0gZG9qby5odG1sLmFicyhub2RlLCBpbmNsdWRlU2Nyb2xsLCBib3h0eXBlKTsKKwkJCXZhciBtYXJnaW5ib3ggPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KG5vZGUpOworCQkJdmFyIHJldCA9IHtsZWZ0OnBvcy5sZWZ0LCB0b3A6cG9zLnRvcCwgd2lkdGg6bWFyZ2luYm94LndpZHRoLCBoZWlnaHQ6bWFyZ2luYm94LmhlaWdodH07CisJCX0KKwl9CisJcmV0LnggPSByZXQubGVmdDsKKwlyZXQueSA9IHJldC50b3A7CisJcmV0dXJuIHJldDsKK307Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94V2lkdGggPSBkb2pvLmh0bWwuc2V0T3V0ZXJXaWR0aCA9IGZ1bmN0aW9uIChub2RlLCB3aWR0aCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRNYXJnaW5Cb3hXaWR0aCIsICJzZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsICJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3hIZWlnaHQgPSBkb2pvLmh0bWwuc2V0T3V0ZXJIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldE1hcmdpbkJveEhlaWdodCIsICJzZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsICJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luQm94V2lkdGggPSBkb2pvLmh0bWwuZ2V0T3V0ZXJXaWR0aCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luQm94V2lkdGgiLCAiZ2V0TWFyZ2luQm94IiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luQm94SGVpZ2h0ID0gZG9qby5odG1sLmdldE91dGVySGVpZ2h0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5Cb3hIZWlnaHQiLCAiZ2V0TWFyZ2luQm94IiwgYXJndW1lbnRzLCBudWxsLCAiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldFRvdGFsT2Zmc2V0ID0gZnVuY3Rpb24gKG5vZGUsIHR5cGUsIGluY2x1ZGVTY3JvbGwpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0VG90YWxPZmZzZXQiLCAiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsIGFyZ3VtZW50cywgbnVsbCwgdHlwZSk7Cit9OworZG9qby5odG1sLmdldEFic29sdXRlWCA9IGZ1bmN0aW9uIChub2RlLCBpbmNsdWRlU2Nyb2xsKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEFic29sdXRlWCIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCAieCIpOworfTsKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVkgPSBmdW5jdGlvbiAobm9kZSwgaW5jbHVkZVNjcm9sbCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRBYnNvbHV0ZVkiLCAiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsIGFyZ3VtZW50cywgbnVsbCwgInkiKTsKK307Citkb2pvLmh0bWwudG90YWxPZmZzZXRMZWZ0ID0gZnVuY3Rpb24gKG5vZGUsIGluY2x1ZGVTY3JvbGwpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgidG90YWxPZmZzZXRMZWZ0IiwgImdldEFic29sdXRlUG9zaXRpb24iLCBhcmd1bWVudHMsIG51bGwsICJsZWZ0Iik7Cit9OworZG9qby5odG1sLnRvdGFsT2Zmc2V0VG9wID0gZnVuY3Rpb24gKG5vZGUsIGluY2x1ZGVTY3JvbGwpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgidG90YWxPZmZzZXRUb3AiLCAiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsIGFyZ3VtZW50cywgbnVsbCwgInRvcCIpOworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5XaWR0aCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbldpZHRoIiwgImdldE1hcmdpbiIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldE1hcmdpbkhlaWdodCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbkhlaWdodCIsICJnZXRNYXJnaW4iLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyV2lkdGggPSBmdW5jdGlvbiAobm9kZSkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJXaWR0aCIsICJnZXRCb3JkZXIiLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJIZWlnaHQgPSBmdW5jdGlvbiAobm9kZSkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJIZWlnaHQiLCAiZ2V0Qm9yZGVyIiwgYXJndW1lbnRzLCBudWxsLCAiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldFBhZGRpbmdXaWR0aCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZGRpbmdXaWR0aCIsICJnZXRQYWRkaW5nIiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZ0hlaWdodCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZGRpbmdIZWlnaHQiLCAiZ2V0UGFkZGluZyIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXJXaWR0aCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZEJvcmRlcldpZHRoIiwgImdldFBhZEJvcmRlciIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldFBhZEJvcmRlckhlaWdodCA9IGZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFBhZEJvcmRlckhlaWdodCIsICJnZXRQYWRCb3JkZXIiLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94V2lkdGggPSBkb2pvLmh0bWwuZ2V0SW5uZXJXaWR0aCA9IGZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Qm9yZGVyQm94V2lkdGgiLCAiZ2V0Qm9yZGVyQm94IiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94SGVpZ2h0ID0gZG9qby5odG1sLmdldElubmVySGVpZ2h0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJCb3hIZWlnaHQiLCAiZ2V0Qm9yZGVyQm94IiwgYXJndW1lbnRzLCBudWxsLCAiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldENvbnRlbnRCb3hXaWR0aCA9IGRvam8uaHRtbC5nZXRDb250ZW50V2lkdGggPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldENvbnRlbnRCb3hXaWR0aCIsICJnZXRDb250ZW50Qm94IiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0Q29udGVudEJveEhlaWdodCA9IGRvam8uaHRtbC5nZXRDb250ZW50SGVpZ2h0ID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRDb250ZW50Qm94SGVpZ2h0IiwgImdldENvbnRlbnRCb3giLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuc2V0Q29udGVudEJveFdpZHRoID0gZG9qby5odG1sLnNldENvbnRlbnRXaWR0aCA9IGZ1bmN0aW9uIChub2RlLCB3aWR0aCkgeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRDb250ZW50Qm94V2lkdGgiLCAic2V0Q29udGVudEJveCIsIGFyZ3VtZW50cywgIndpZHRoIik7Cit9OworZG9qby5odG1sLnNldENvbnRlbnRCb3hIZWlnaHQgPSBkb2pvLmh0bWwuc2V0Q29udGVudEhlaWdodCA9IGZ1bmN0aW9uIChub2RlLCBoZWlnaHQpIHsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0Q29udGVudEJveEhlaWdodCIsICJzZXRDb250ZW50Qm94IiwgYXJndW1lbnRzLCAiaGVpZ2h0Iik7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9tZXRyaWNzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvbWV0cmljcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJmZDdmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvbWV0cmljcy5qcwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLm1ldHJpY3MiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5odG1sLmdldFNjcm9sbGJhciA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgc2Nyb2xsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJc2Nyb2xsLnN0eWxlLndpZHRoID0gIjEwMHB4IjsKKwlzY3JvbGwuc3R5bGUuaGVpZ2h0ID0gIjEwMHB4IjsKKwlzY3JvbGwuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIjsKKwlzY3JvbGwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCXNjcm9sbC5zdHlsZS50b3AgPSAiLTMwMHB4IjsKKwlzY3JvbGwuc3R5bGUubGVmdCA9ICIwcHgiOworCXZhciB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdGVzdC5zdHlsZS53aWR0aCA9ICI0MDBweCI7CisJdGVzdC5zdHlsZS5oZWlnaHQgPSAiNDAwcHgiOworCXNjcm9sbC5hcHBlbmRDaGlsZCh0ZXN0KTsKKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChzY3JvbGwpOworCXZhciB3aWR0aCA9IHNjcm9sbC5vZmZzZXRXaWR0aCAtIHNjcm9sbC5jbGllbnRXaWR0aDsKKwlkb2pvLmJvZHkoKS5yZW1vdmVDaGlsZChzY3JvbGwpOworCXNjcm9sbC5yZW1vdmVDaGlsZCh0ZXN0KTsKKwlzY3JvbGwgPSB0ZXN0ID0gbnVsbDsKKwlyZXR1cm4ge3dpZHRoOndpZHRofTsKK307Citkb2pvLmh0bWwuZ2V0Rm9udE1lYXN1cmVtZW50cyA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgaGVpZ2h0cyA9IHsiMWVtIjowLCAiMWV4IjowLCAiMTAwJSI6MCwgIjEycHQiOjAsICIxNnB4IjowLCAieHgtc21hbGwiOjAsICJ4LXNtYWxsIjowLCAic21hbGwiOjAsICJtZWRpdW0iOjAsICJsYXJnZSI6MCwgIngtbGFyZ2UiOjAsICJ4eC1sYXJnZSI6MH07CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gIjEwMCUiOworCX0KKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwlkaXYuc3R5bGUubGVmdCA9ICItMTAwcHgiOworCWRpdi5zdHlsZS50b3AgPSAiMCI7CisJZGl2LnN0eWxlLndpZHRoID0gIjMwcHgiOworCWRpdi5zdHlsZS5oZWlnaHQgPSAiMTAwMGVtIjsKKwlkaXYuc3R5bGUuYm9yZGVyID0gIjAiOworCWRpdi5zdHlsZS5tYXJnaW4gPSAiMCI7CisJZGl2LnN0eWxlLnBhZGRpbmcgPSAiMCI7CisJZGl2LnN0eWxlLm91dGxpbmUgPSAiMCI7CisJZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAiMSI7CisJZGl2LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQoZGl2KTsKKwlmb3IgKHZhciBwIGluIGhlaWdodHMpIHsKKwkJZGl2LnN0eWxlLmZvbnRTaXplID0gcDsKKwkJaGVpZ2h0c1twXSA9IE1hdGgucm91bmQoZGl2Lm9mZnNldEhlaWdodCAqIDEyIC8gMTYpICogMTYgLyAxMiAvIDEwMDA7CisJfQorCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKGRpdik7CisJZGl2ID0gbnVsbDsKKwlyZXR1cm4gaGVpZ2h0czsKK307Citkb2pvLmh0bWwuX2ZvbnRNZWFzdXJlbWVudHMgPSBudWxsOworZG9qby5odG1sLmdldENhY2hlZEZvbnRNZWFzdXJlbWVudHMgPSBmdW5jdGlvbiAocmVjYWxjdWxhdGUpIHsKKwlpZiAocmVjYWxjdWxhdGUgfHwgIWRvam8uaHRtbC5fZm9udE1lYXN1cmVtZW50cykgeworCQlkb2pvLmh0bWwuX2ZvbnRNZWFzdXJlbWVudHMgPSBkb2pvLmh0bWwuZ2V0Rm9udE1lYXN1cmVtZW50cygpOworCX0KKwlyZXR1cm4gZG9qby5odG1sLl9mb250TWVhc3VyZW1lbnRzOworfTsKK2Rvam8uaHRtbC5tZWFzdXJlRnJhZ21lbnQgPSBmdW5jdGlvbiAobm9kZSwgaHRtbCwgYm94VHlwZSkgeworCXZhciBjbG9uZSA9IG5vZGUuY2xvbmVOb2RlKHRydWUpOworCWNsb25lLmlubmVySFRNTCA9IGh0bWw7CisJbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNsb25lKTsKKwl2YXIgcmV0ID0gZG9qby5odG1sLmdldEVsZW1lbnRCb3goY2xvbmUsIGJveFR5cGUpOworCW5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7CisJY2xvbmUgPSBudWxsOworCXJldHVybiByZXQ7Cit9OworZG9qby5odG1sLmdldEZpdHRlZEZyYWdtZW50ID0gZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHsKKwlmdW5jdGlvbiBjbChub2RlKSB7CisJCXZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlLnRhZ05hbWUpOworCQllbGVtZW50LmlkID0gbm9kZS5pZCArICItY2xvbmUiOworCQllbGVtZW50LmNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lOworCQlmb3IgKHZhciBqID0gMDsgaiA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGorKykgeworCQkJaWYgKG5vZGUuYXR0cmlidXRlc1tqXS5zcGVjaWZpZWQpIHsKKwkJCQlpZiAobm9kZS5hdHRyaWJ1dGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gInN0eWxlIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiZWRpdGVkIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiY29udGVudGVkaXRhYmxlIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiaWQiICYmIG5vZGUuYXR0cmlidXRlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJjbGFzcyIpIHsKKwkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUobm9kZS5hdHRyaWJ1dGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIG5vZGUuYXR0cmlidXRlc1tqXS5ub2RlVmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisJdmFyIGhlaWdodCA9IGRvam8uaHRtbC5nZXRGb250TWVhc3VyZW1lbnRzKClbIjE2cHgiXTsKKwl2YXIgbiA9IGNsKG5vZGUpOworCW4uc3R5bGUud2lkdGggPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpLndpZHRoICsgInB4IjsKKwluLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgKyA0KSArICJweCI7CisJbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG4pOworCXZhciByZW0gPSBkb2pvLmh0bWwuZml0VG9FbGVtZW50KG4sIGh0bWwpOworCXZhciByZXQgPSBuLmlubmVySFRNTDsKKwluLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7CisJcmV0dXJuIHJldDsKK307Citkb2pvLmh0bWwuZml0VG9FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHsKKwlmdW5jdGlvbiBjbChub2RlKSB7CisJCXZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlLnRhZ05hbWUpOworCQllbGVtZW50LmlkID0gbm9kZS5pZCArICItY2xvbmUiOworCQllbGVtZW50LmNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lOworCQlmb3IgKHZhciBqID0gMDsgaiA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGorKykgeworCQkJaWYgKG5vZGUuYXR0cmlidXRlc1tqXS5zcGVjaWZpZWQpIHsKKwkJCQlpZiAobm9kZS5hdHRyaWJ1dGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gInN0eWxlIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiZWRpdGVkIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiY29udGVudGVkaXRhYmxlIiAmJiBub2RlLmF0dHJpYnV0ZXNbal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiaWQiICYmIG5vZGUuYXR0cmlidXRlc1tqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJjbGFzcyIpIHsKKwkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUobm9kZS5hdHRyaWJ1dGVzW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIG5vZGUuYXR0cmlidXRlc1tqXS5ub2RlVmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisJdmFyIGNsb25lID0gY2wobm9kZSk7CisJbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNsb25lKTsKKwl2YXIgdCA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7CisJY2xvbmUuc3R5bGUud2lkdGggPSB0LndpZHRoICsgInB4IjsKKwl2YXIgc2luZ2xldG9ucyA9IFsiYnIiLCAiaW1nIiwgImhyIiwgImlucHV0IiwgIiEtLSJdOworCXZhciBjaG9wID0gWyI8QlI+IiwgIjxicj4iLCAiPGJyLz4iLCAiPGJyIC8+IiwgIjxwPjwvcD4iLCAiPFA+PC9QPiJdOworCXZhciBvcGVuVGFncyA9IFtdOworCXZhciBzdHIgPSBodG1sOworCXZhciBpID0gMDsKKwl2YXIgbGltaXQgPSBzdHIubGVuZ3RoOworCXZhciBhZGQgPSAwOworCXZhciBkb0xvb3AgPSB0cnVlOworCWNsb25lLmlubmVySFRNTCA9IHN0cjsKKwl3aGlsZSAoZG9Mb29wKSB7CisJCWFkZCA9IE1hdGgucm91bmQoKGxpbWl0IC0gaSkgLyAyKTsKKwkJaWYgKGFkZCA8PSAxKSB7CisJCQlkb0xvb3AgPSBmYWxzZTsKKwkJfQorCQlpICs9IGFkZDsKKwkJY2xvbmUuaW5uZXJIVE1MID0gc3RyLnN1YnN0cigwLCBpKTsKKwkJaWYgKGNsb25lLm9mZnNldEhlaWdodCA+IHQuaGVpZ2h0KSB7CisJCQlsaW1pdCA9IGk7CisJCQlpIC09IGFkZDsKKwkJfQorCX0KKwlpZiAoc3RyLnN1YnN0cigwLCBpKSAhPSBzdHIpIHsKKwkJdmFyIGxhc3RTcGFjZSA9IHN0ci5zdWJzdHIoMCwgaSkubGFzdEluZGV4T2YoIiAiKTsKKwkJdmFyIGxhc3ROZXdMaW5lID0gc3RyLnN1YnN0cigwLCBpKS5sYXN0SW5kZXhPZigiXG4iKTsKKwkJdmFyIGxhc3RHcmVhdGVyID0gc3RyLnN1YnN0cigwLCBpKS5sYXN0SW5kZXhPZigiPiIpOworCQl2YXIgbGFzdExlc3MgPSBzdHIuc3Vic3RyKDAsIGkpLmxhc3RJbmRleE9mKCI8Iik7CisJCWlmIChsYXN0TGVzcyA8PSBsYXN0R3JlYXRlciAmJiBsYXN0TmV3TGluZSA9PSBpIC0gMSkgeworCQkJaSA9IGk7CisJCX0gZWxzZSB7CisJCQlpZiAobGFzdFNwYWNlICE9IC0xICYmIGxhc3RTcGFjZSA+IGxhc3RHcmVhdGVyICYmIGxhc3RHcmVhdGVyID4gbGFzdExlc3MpIHsKKwkJCQlpID0gbGFzdFNwYWNlICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxhc3RMZXNzID4gbGFzdEdyZWF0ZXIpIHsKKwkJCQkJaSA9IGxhc3RMZXNzOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChsYXN0R3JlYXRlciAhPSAtMSkgeworCQkJCQkJaSA9IGxhc3RHcmVhdGVyICsgMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlzdHIgPSBzdHIuc3Vic3RyKDAsIGkpOworCXZhciByZXQgPSBodG1sLnN1YnN0cihzdHIubGVuZ3RoKTsKKwl2YXIgZG9QdXNoID0gdHJ1ZTsKKwl2YXIgdGFncyA9IHN0ci5zcGxpdCgiPCIpOworCXRhZ3Muc2hpZnQoKTsKKwlmb3IgKHZhciBqID0gMDsgaiA8IHRhZ3MubGVuZ3RoOyBqKyspIHsKKwkJdGFnc1tqXSA9IHRhZ3Nbal0uc3BsaXQoIj4iKVswXTsKKwkJaWYgKHRhZ3Nbal0uY2hhckF0KHRhZ3Nbal0ubGVuZ3RoIC0gMSkgPT0gIi8iKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodGFnc1tqXS5jaGFyQXQoMCkgIT0gIi8iKSB7CisJCQlmb3IgKHZhciBrID0gMDsgayA8IHNpbmdsZXRvbnMubGVuZ3RoOyBrKyspIHsKKwkJCQlpZiAodGFnc1tqXS5zcGxpdCgiICIpWzBdLnRvTG93ZXJDYXNlKCkgPT0gc2luZ2xldG9uc1trXSkgeworCQkJCQlkb1B1c2ggPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZG9QdXNoKSB7CisJCQkJb3BlblRhZ3MucHVzaCh0YWdzW2pdKTsKKwkJCX0KKwkJCWRvUHVzaCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlvcGVuVGFncy5wb3AoKTsKKwkJfQorCX0KKwlmb3IgKHZhciBqID0gMDsgaiA8IGNob3AubGVuZ3RoOyBqKyspIHsKKwkJaWYgKHJldC5jaGFyQXQoMCkgPT0gIlxuIikgeworCQkJcmV0ID0gcmV0LnN1YnN0cigxKTsKKwkJfQorCQl3aGlsZSAocmV0LmluZGV4T2YoY2hvcFtqXSkgPT0gMCkgeworCQkJcmV0ID0gcmV0LnN1YnN0cihjaG9wW2pdLmxlbmd0aCk7CisJCX0KKwl9CisJZm9yICh2YXIgaiA9IG9wZW5UYWdzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CisJCWlmIChzdHIubGFzdEluZGV4T2Yob3BlblRhZ3Nbal0pID09IChzdHIubGVuZ3RoIC0gb3BlblRhZ3Nbal0ubGVuZ3RoIC0gMSkpIHsKKwkJCXN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxhc3RJbmRleE9mKG9wZW5UYWdzW2pdKSk7CisJCX0gZWxzZSB7CisJCQlzdHIgKz0gIjwvIiArIG9wZW5UYWdzW2pdICsgIj4iOworCQl9CisJCWlmIChyZXQubGVuZ3RoID4gMCkgeworCQkJcmV0ID0gIjwiICsgb3BlblRhZ3Nbal0gKyAiPiIgKyByZXQ7CisJCX0KKwl9CisJZm9yICh2YXIgaiA9IDA7IGogPCBjaG9wLmxlbmd0aDsgaisrKSB7CisJCWlmIChyZXQuY2hhckF0KDApID09ICJcbiIpIHsKKwkJCXJldCA9IHJldC5zdWJzdHIoMSk7CisJCX0KKwkJd2hpbGUgKHJldC5pbmRleE9mKGNob3Bbal0pID09IDApIHsKKwkJCXJldCA9IHJldC5zdWJzdHIoY2hvcFtqXS5sZW5ndGgpOworCQl9CisJfQorCW5vZGUuaW5uZXJIVE1MID0gc3RyOworCWNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpOworCWNsb25lID0gbnVsbDsKKwlyZXR1cm4gcmV0OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvc2VsZWN0aW9uLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvc2VsZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmIwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9zZWxlY3Rpb24uanMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5jb21tb24iKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZSA9IHtOT05FOjAsIFRFWFQ6MSwgQ09OVFJPTDoyfTsKK2Rvam8uaHRtbC5jbGVhclNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgX3dpbmRvdyA9IGRvam8uZ2xvYmFsKCk7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdHJ5IHsKKwkJaWYgKF93aW5kb3dbImdldFNlbGVjdGlvbiJdKSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpIHsKKwkJCQlfd2luZG93LmdldFNlbGVjdGlvbigpLmNvbGxhcHNlKCk7CisJCQl9IGVsc2UgeworCQkJCV93aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoX2RvY3VtZW50LnNlbGVjdGlvbikgeworCQkJCWlmIChfZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSB7CisJCQkJCV9kb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoX2RvY3VtZW50LnNlbGVjdGlvbi5jbGVhcikgeworCQkJCQkJX2RvY3VtZW50LnNlbGVjdGlvbi5jbGVhcigpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKwljYXRjaCAoZSkgeworCQlkb2pvLmRlYnVnKGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfTsKK2Rvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpIHx8IGRvam8uYm9keSgpOworCXZhciBoID0gZG9qby5yZW5kZXIuaHRtbDsKKwlpZiAoaC5tb3ppbGxhKSB7CisJCWVsZW1lbnQuc3R5bGUuTW96VXNlclNlbGVjdCA9ICJub25lIjsKKwl9IGVsc2UgeworCQlpZiAoaC5zYWZhcmkpIHsKKwkJCWVsZW1lbnQuc3R5bGUuS2h0bWxVc2VyU2VsZWN0ID0gIm5vbmUiOworCQl9IGVsc2UgeworCQkJaWYgKGguaWUpIHsKKwkJCQllbGVtZW50LnVuc2VsZWN0YWJsZSA9ICJvbiI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLmh0bWwuZW5hYmxlU2VsZWN0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpIHx8IGRvam8uYm9keSgpOworCXZhciBoID0gZG9qby5yZW5kZXIuaHRtbDsKKwlpZiAoaC5tb3ppbGxhKSB7CisJCWVsZW1lbnQuc3R5bGUuTW96VXNlclNlbGVjdCA9ICIiOworCX0gZWxzZSB7CisJCWlmIChoLnNhZmFyaSkgeworCQkJZWxlbWVudC5zdHlsZS5LaHRtbFVzZXJTZWxlY3QgPSAiIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChoLmllKSB7CisJCQkJZWxlbWVudC51bnNlbGVjdGFibGUgPSAib2ZmIjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorCXJldHVybiB0cnVlOworfTsKK2Rvam8uaHRtbC5zZWxlY3RFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC5zZWxlY3RFbGVtZW50IiwgInJlcGxhY2VkIGJ5IGRvam8uaHRtbC5zZWxlY3Rpb24uc2VsZWN0RWxlbWVudENoaWxkcmVuIiwgMC41KTsKK307Citkb2pvLmh0bWwuc2VsZWN0SW5wdXRUZXh0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKwl2YXIgX3dpbmRvdyA9IGRvam8uZ2xvYmFsKCk7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJZWxlbWVudCA9IGRvam8uYnlJZChlbGVtZW50KTsKKwlpZiAoX2RvY3VtZW50WyJzZWxlY3Rpb24iXSAmJiBkb2pvLmJvZHkoKVsiY3JlYXRlVGV4dFJhbmdlIl0pIHsKKwkJdmFyIHJhbmdlID0gZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJcmFuZ2UubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLCAwKTsKKwkJcmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVyIiwgZWxlbWVudC52YWx1ZS5sZW5ndGgpOworCQlyYW5nZS5zZWxlY3QoKTsKKwl9IGVsc2UgeworCQlpZiAoX3dpbmRvd1siZ2V0U2VsZWN0aW9uIl0pIHsKKwkJCXZhciBzZWxlY3Rpb24gPSBfd2luZG93LmdldFNlbGVjdGlvbigpOworCQkJZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBlbGVtZW50LnZhbHVlLmxlbmd0aCk7CisJCX0KKwl9CisJZWxlbWVudC5mb2N1cygpOworfTsKK2Rvam8uaHRtbC5pc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGZ1bmN0aW9uICgpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC5pc1NlbGVjdGlvbkNvbGxhcHNlZCIsICJyZXBsYWNlZCBieSBkb2pvLmh0bWwuc2VsZWN0aW9uLmlzQ29sbGFwc2VkIiwgMC41KTsKKwlyZXR1cm4gZG9qby5odG1sLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCgpOworfTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmh0bWwuc2VsZWN0aW9uLCB7Z2V0VHlwZTpmdW5jdGlvbiAoKSB7CisJaWYgKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKSB7CisJCXJldHVybiBkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZVtkb2pvLmRvYygpLnNlbGVjdGlvbi50eXBlLnRvVXBwZXJDYXNlKCldOworCX0gZWxzZSB7CisJCXZhciBzdHlwZSA9IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLlRFWFQ7CisJCXZhciBvU2VsOworCQl0cnkgeworCQkJb1NlbCA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCQlpZiAob1NlbCAmJiBvU2VsLnJhbmdlQ291bnQgPT0gMSkgeworCQkJdmFyIG9SYW5nZSA9IG9TZWwuZ2V0UmFuZ2VBdCgwKTsKKwkJCWlmIChvUmFuZ2Uuc3RhcnRDb250YWluZXIgPT0gb1JhbmdlLmVuZENvbnRhaW5lciAmJiAob1JhbmdlLmVuZE9mZnNldCAtIG9SYW5nZS5zdGFydE9mZnNldCkgPT0gMSAmJiBvUmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGUgIT0gZG9qby5kb20uVEVYVF9OT0RFKSB7CisJCQkJc3R5cGUgPSBkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZS5DT05UUk9MOworCQkJfQorCQl9CisJCXJldHVybiBzdHlwZTsKKwl9Cit9LCBpc0NvbGxhcHNlZDpmdW5jdGlvbiAoKSB7CisJdmFyIF93aW5kb3cgPSBkb2pvLmdsb2JhbCgpOworCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCWlmIChfZG9jdW1lbnRbInNlbGVjdGlvbiJdKSB7CisJCXJldHVybiBfZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dCA9PSAiIjsKKwl9IGVsc2UgeworCQlpZiAoX3dpbmRvd1siZ2V0U2VsZWN0aW9uIl0pIHsKKwkJCXZhciBzZWxlY3Rpb24gPSBfd2luZG93LmdldFNlbGVjdGlvbigpOworCQkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhzZWxlY3Rpb24pKSB7CisJCQkJcmV0dXJuIHNlbGVjdGlvbiA9PSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKSA9PSAiIjsKKwkJCX0KKwkJfQorCX0KK30sIGdldFNlbGVjdGVkRWxlbWVudDpmdW5jdGlvbiAoKSB7CisJaWYgKGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpIHsKKwkJaWYgKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKSB7CisJCQl2YXIgcmFuZ2UgPSBkb2pvLmRvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworCQkJaWYgKHJhbmdlICYmIHJhbmdlLml0ZW0pIHsKKwkJCQlyZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKDApOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyIHNlbGVjdGlvbiA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CisJCQlyZXR1cm4gc2VsZWN0aW9uLmFuY2hvck5vZGUuY2hpbGROb2Rlc1tzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0XTsKKwkJfQorCX0KK30sIGdldFBhcmVudEVsZW1lbnQ6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmh0bWwuc2VsZWN0aW9uLmdldFR5cGUoKSA9PSBkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZS5DT05UUk9MKSB7CisJCXZhciBwID0gZG9qby5odG1sLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKKwkJaWYgKHApIHsKKwkJCXJldHVybiBwLnBhcmVudE5vZGU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG9qby5kb2MoKVsic2VsZWN0aW9uIl0pIHsKKwkJCXJldHVybiBkb2pvLmRvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnBhcmVudEVsZW1lbnQoKTsKKwkJfSBlbHNlIHsKKwkJCXZhciBzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworCQkJaWYgKHNlbGVjdGlvbikgeworCQkJCXZhciBub2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7CisJCQkJd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpIHsKKwkJCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwkJCQl9CisJCQkJcmV0dXJuIG5vZGU7CisJCQl9CisJCX0KKwl9Cit9LCBnZXRTZWxlY3RlZFRleHQ6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmRvYygpWyJzZWxlY3Rpb24iXSkgeworCQlpZiAoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRUeXBlKCkgPT0gZG9qby5odG1sLnNlbGVjdGlvblR5cGUuQ09OVFJPTCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKKwl9IGVsc2UgeworCQl2YXIgc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbikgeworCQkJcmV0dXJuIHNlbGVjdGlvbi50b1N0cmluZygpOworCQl9CisJfQorfSwgZ2V0U2VsZWN0ZWRIdG1sOmZ1bmN0aW9uICgpIHsKKwlpZiAoZG9qby5kb2MoKVsic2VsZWN0aW9uIl0pIHsKKwkJaWYgKGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBkb2pvLmRvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmh0bWxUZXh0OworCX0gZWxzZSB7CisJCXZhciBzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50KSB7CisJCQl2YXIgZnJhZyA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lQ29udGVudHMoKTsKKwkJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCWRpdi5hcHBlbmRDaGlsZChmcmFnKTsKKwkJCXJldHVybiBkaXYuaW5uZXJIVE1MOworCQl9CisJCXJldHVybiBudWxsOworCX0KK30sIGhhc0FuY2VzdG9yRWxlbWVudDpmdW5jdGlvbiAodGFnTmFtZSkgeworCXJldHVybiAoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRBbmNlc3RvckVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSAhPSBudWxsKTsKK30sIGdldEFuY2VzdG9yRWxlbWVudDpmdW5jdGlvbiAodGFnTmFtZSkgeworCXZhciBub2RlID0gZG9qby5odG1sLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKSB8fCBkb2pvLmh0bWwuc2VsZWN0aW9uLmdldFBhcmVudEVsZW1lbnQoKTsKKwl3aGlsZSAobm9kZSkgeworCQlpZiAoZG9qby5odG1sLnNlbGVjdGlvbi5pc1RhZyhub2RlLCBhcmd1bWVudHMpLmxlbmd0aCA+IDApIHsKKwkJCXJldHVybiBub2RlOworCQl9CisJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJfQorCXJldHVybiBudWxsOworfSwgaXNUYWc6ZnVuY3Rpb24gKG5vZGUsIHRhZ3MpIHsKKwlpZiAobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAobm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gU3RyaW5nKHRhZ3NbaV0pLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQlyZXR1cm4gU3RyaW5nKHRhZ3NbaV0pLnRvTG93ZXJDYXNlKCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICIiOworfSwgc2VsZWN0RWxlbWVudDpmdW5jdGlvbiAoZWxlbWVudCkgeworCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpOworCWlmIChfZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvam8uYm9keSgpLmNyZWF0ZVRleHRSYW5nZSkgeworCQl0cnkgeworCQkJdmFyIHJhbmdlID0gZG9qby5ib2R5KCkuY3JlYXRlQ29udHJvbFJhbmdlKCk7CisJCQlyYW5nZS5hZGRFbGVtZW50KGVsZW1lbnQpOworCQkJcmFuZ2Uuc2VsZWN0KCk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCWRvam8uaHRtbC5zZWxlY3Rpb24uc2VsZWN0RWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKF93aW5kb3dbImdldFNlbGVjdGlvbiJdKSB7CisJCQl2YXIgc2VsZWN0aW9uID0gX3dpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKwkJCWlmIChzZWxlY3Rpb25bInJlbW92ZUFsbFJhbmdlcyJdKSB7CisJCQkJdmFyIHJhbmdlID0gX2RvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisJCQkJcmFuZ2Uuc2VsZWN0Tm9kZShlbGVtZW50KTsKKwkJCQlzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CisJCQkJc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKKwkJCX0KKwkJfQorCX0KK30sIHNlbGVjdEVsZW1lbnRDaGlsZHJlbjpmdW5jdGlvbiAoZWxlbWVudCkgeworCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpOworCWlmIChfZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvam8uYm9keSgpLmNyZWF0ZVRleHRSYW5nZSkgeworCQl2YXIgcmFuZ2UgPSBkb2pvLmJvZHkoKS5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoZWxlbWVudCk7CisJCXJhbmdlLnNlbGVjdCgpOworCX0gZWxzZSB7CisJCWlmIChfd2luZG93WyJnZXRTZWxlY3Rpb24iXSkgeworCQkJdmFyIHNlbGVjdGlvbiA9IF93aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisJCQlpZiAoc2VsZWN0aW9uWyJzZXRCYXNlQW5kRXh0ZW50Il0pIHsKKwkJCQlzZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChlbGVtZW50LCAwLCBlbGVtZW50LCBlbGVtZW50LmlubmVyVGV4dC5sZW5ndGggLSAxKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNlbGVjdGlvblsic2VsZWN0QWxsQ2hpbGRyZW4iXSkgeworCQkJCQlzZWxlY3Rpb24uc2VsZWN0QWxsQ2hpbGRyZW4oZWxlbWVudCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfSwgZ2V0Qm9va21hcms6ZnVuY3Rpb24gKCkgeworCXZhciBib29rbWFyazsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwlpZiAoX2RvY3VtZW50WyJzZWxlY3Rpb24iXSkgeworCQl2YXIgcmFuZ2UgPSBfZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCWJvb2ttYXJrID0gcmFuZ2UuZ2V0Qm9va21hcmsoKTsKKwl9IGVsc2UgeworCQl2YXIgc2VsZWN0aW9uOworCQl0cnkgeworCQkJc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJCWlmIChzZWxlY3Rpb24pIHsKKwkJCXZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOworCQkJYm9va21hcmsgPSByYW5nZS5jbG9uZVJhbmdlKCk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmRlYnVnKCJObyBpZGVhIGhvdyB0byBzdG9yZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIHRoaXMgYnJvd3NlciEiKTsKKwkJfQorCX0KKwlyZXR1cm4gYm9va21hcms7Cit9LCBtb3ZlVG9Cb29rbWFyazpmdW5jdGlvbiAoYm9va21hcmspIHsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwlpZiAoX2RvY3VtZW50WyJzZWxlY3Rpb24iXSkgeworCQl2YXIgcmFuZ2UgPSBfZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCXJhbmdlLm1vdmVUb0Jvb2ttYXJrKGJvb2ttYXJrKTsKKwkJcmFuZ2Uuc2VsZWN0KCk7CisJfSBlbHNlIHsKKwkJdmFyIHNlbGVjdGlvbjsKKwkJdHJ5IHsKKwkJCXNlbGVjdGlvbiA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCQlpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvblsicmVtb3ZlQWxsUmFuZ2VzIl0pIHsKKwkJCXNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKKwkJCXNlbGVjdGlvbi5hZGRSYW5nZShib29rbWFyayk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmRlYnVnKCJObyBpZGVhIGhvdyB0byByZXN0b3JlIHNlbGVjdGlvbiBmb3IgdGhpcyBicm93c2VyISIpOworCQl9CisJfQorfSwgY29sbGFwc2U6ZnVuY3Rpb24gKGJlZ2lubmluZykgeworCWlmIChkb2pvLmdsb2JhbCgpWyJnZXRTZWxlY3Rpb24iXSkgeworCQl2YXIgc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMpIHsKKwkJCWlmIChiZWdpbm5pbmcpIHsKKwkJCQlzZWxlY3Rpb24uY29sbGFwc2VUb1N0YXJ0KCk7CisJCQl9IGVsc2UgeworCQkJCXNlbGVjdGlvbi5jb2xsYXBzZVRvRW5kKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpLmNvbGxhcHNlKGJlZ2lubmluZyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG9qby5kb2MoKS5zZWxlY3Rpb24pIHsKKwkJCXZhciByYW5nZSA9IGRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQlyYW5nZS5jb2xsYXBzZShiZWdpbm5pbmcpOworCQkJcmFuZ2Uuc2VsZWN0KCk7CisJCX0KKwl9Cit9LCByZW1vdmU6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmRvYygpLnNlbGVjdGlvbikgeworCQl2YXIgc2VsZWN0aW9uID0gZG9qby5kb2MoKS5zZWxlY3Rpb247CisJCWlmIChzZWxlY3Rpb24udHlwZS50b1VwcGVyQ2FzZSgpICE9ICJOT05FIikgeworCQkJc2VsZWN0aW9uLmNsZWFyKCk7CisJCX0KKwkJcmV0dXJuIHNlbGVjdGlvbjsKKwl9IGVsc2UgeworCQl2YXIgc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7CisJCQlzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKS5kZWxldGVDb250ZW50cygpOworCQl9CisJCXJldHVybiBzZWxlY3Rpb247CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9zaGFkb3cuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC9zaGFkb3cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3M2NjZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL3NoYWRvdy5qcwpAQCAtMCwwICsxLDE3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuc2hhZG93Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LnNoYWRvdyIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwuc2hhZG93IGhhcyBiZWVuIG1vdmVkIHRvIGRvam8ubGZ4LiIsICIwLjUiKTsKK2Rvam8uaHRtbC5zaGFkb3cgPSBkb2pvLmxmeC5zaGFkb3c7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL3N0eWxlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2h0bWwvc3R5bGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2NzY0NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL3N0eWxlLmpzCkBAIC0wLDAgKzEsNDgzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnVyaS5VcmkiKTsKK2Rvam8uaHRtbC5nZXRDbGFzcyA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuICIiOworCX0KKwl2YXIgY3MgPSAiIjsKKwlpZiAobm9kZS5jbGFzc05hbWUpIHsKKwkJY3MgPSBub2RlLmNsYXNzTmFtZTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShub2RlLCAiY2xhc3MiKSkgeworCQkJY3MgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKG5vZGUsICJjbGFzcyIpOworCQl9CisJfQorCXJldHVybiBjcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpOworfTsKK2Rvam8uaHRtbC5nZXRDbGFzc2VzID0gZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgYyA9IGRvam8uaHRtbC5nZXRDbGFzcyhub2RlKTsKKwlyZXR1cm4gKGMgPT0gIiIpID8gW10gOiBjLnNwbGl0KC9ccysvZyk7Cit9OworZG9qby5odG1sLmhhc0NsYXNzID0gZnVuY3Rpb24gKG5vZGUsIGNsYXNzbmFtZSkgeworCXJldHVybiAobmV3IFJlZ0V4cCgiKF58XFxzKykiICsgY2xhc3NuYW1lICsgIihcXHMrfCQpIikpLnRlc3QoZG9qby5odG1sLmdldENsYXNzKG5vZGUpKTsKK307Citkb2pvLmh0bWwucHJlcGVuZENsYXNzID0gZnVuY3Rpb24gKG5vZGUsIGNsYXNzU3RyKSB7CisJY2xhc3NTdHIgKz0gIiAiICsgZG9qby5odG1sLmdldENsYXNzKG5vZGUpOworCXJldHVybiBkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZSwgY2xhc3NTdHIpOworfTsKK2Rvam8uaHRtbC5hZGRDbGFzcyA9IGZ1bmN0aW9uIChub2RlLCBjbGFzc1N0cikgeworCWlmIChkb2pvLmh0bWwuaGFzQ2xhc3Mobm9kZSwgY2xhc3NTdHIpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJY2xhc3NTdHIgPSAoZG9qby5odG1sLmdldENsYXNzKG5vZGUpICsgIiAiICsgY2xhc3NTdHIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7CisJcmV0dXJuIGRvam8uaHRtbC5zZXRDbGFzcyhub2RlLCBjbGFzc1N0cik7Cit9OworZG9qby5odG1sLnNldENsYXNzID0gZnVuY3Rpb24gKG5vZGUsIGNsYXNzU3RyKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgY3MgPSBuZXcgU3RyaW5nKGNsYXNzU3RyKTsKKwl0cnkgeworCQlpZiAodHlwZW9mIG5vZGUuY2xhc3NOYW1lID09ICJzdHJpbmciKSB7CisJCQlub2RlLmNsYXNzTmFtZSA9IGNzOworCQl9IGVsc2UgeworCQkJaWYgKG5vZGUuc2V0QXR0cmlidXRlKSB7CisJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xhc3NTdHIpOworCQkJCW5vZGUuY2xhc3NOYW1lID0gY3M7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCX0KKwljYXRjaCAoZSkgeworCQlkb2pvLmRlYnVnKCJkb2pvLmh0bWwuc2V0Q2xhc3MoKSBmYWlsZWQiLCBlKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKG5vZGUsIGNsYXNzU3RyLCBhbGxvd1BhcnRpYWxNYXRjaGVzKSB7CisJdHJ5IHsKKwkJaWYgKCFhbGxvd1BhcnRpYWxNYXRjaGVzKSB7CisJCQl2YXIgbmV3Y3MgPSBkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSkucmVwbGFjZShuZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjbGFzc1N0ciArICIoXFxzK3wkKSIpLCAiJDEkMiIpOworCQl9IGVsc2UgeworCQkJdmFyIG5ld2NzID0gZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UoY2xhc3NTdHIsICIiKTsKKwkJfQorCQlkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZSwgbmV3Y3MpOworCX0KKwljYXRjaCAoZSkgeworCQlkb2pvLmRlYnVnKCJkb2pvLmh0bWwucmVtb3ZlQ2xhc3MoKSBmYWlsZWQiLCBlKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLnJlcGxhY2VDbGFzcyA9IGZ1bmN0aW9uIChub2RlLCBuZXdDbGFzcywgb2xkQ2xhc3MpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3Mobm9kZSwgb2xkQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyhub2RlLCBuZXdDbGFzcyk7Cit9OworZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlID0ge0NvbnRhaW5zQWxsOjAsIENvbnRhaW5zQW55OjEsIElzT25seToyfTsKK2Rvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NTdHIsIHBhcmVudCwgbm9kZVR5cGUsIGNsYXNzTWF0Y2hUeXBlLCB1c2VOb25YcGF0aCkgeworCXVzZU5vblhwYXRoID0gZmFsc2U7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJcGFyZW50ID0gZG9qby5ieUlkKHBhcmVudCkgfHwgX2RvY3VtZW50OworCXZhciBjbGFzc2VzID0gY2xhc3NTdHIuc3BsaXQoL1xzKy9nKTsKKwl2YXIgbm9kZXMgPSBbXTsKKwlpZiAoY2xhc3NNYXRjaFR5cGUgIT0gMSAmJiBjbGFzc01hdGNoVHlwZSAhPSAyKSB7CisJCWNsYXNzTWF0Y2hUeXBlID0gMDsKKwl9CisJdmFyIHJlQ2xhc3MgPSBuZXcgUmVnRXhwKCIoXFxzfF4pKCgiICsgY2xhc3Nlcy5qb2luKCIpfCgiKSArICIpKShcXHN8JCkiKTsKKwl2YXIgc3J0TGVuZ3RoID0gY2xhc3Nlcy5qb2luKCIgIikubGVuZ3RoOworCXZhciBjYW5kaWRhdGVOb2RlcyA9IFtdOworCWlmICghdXNlTm9uWHBhdGggJiYgX2RvY3VtZW50LmV2YWx1YXRlKSB7CisJCXZhciB4cGF0aCA9ICIuLy8iICsgKG5vZGVUeXBlIHx8ICIqIikgKyAiW2NvbnRhaW5zKCI7CisJCWlmIChjbGFzc01hdGNoVHlwZSAhPSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpIHsKKwkJCXhwYXRoICs9ICJjb25jYXQoJyAnLEBjbGFzcywnICcpLCAnICIgKyBjbGFzc2VzLmpvaW4oIiAnKSBhbmQgY29udGFpbnMoY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiKSArICIgJykiOworCQkJaWYgKGNsYXNzTWF0Y2hUeXBlID09IDIpIHsKKwkJCQl4cGF0aCArPSAiIGFuZCBzdHJpbmctbGVuZ3RoKEBjbGFzcyk9IiArIHNydExlbmd0aCArICJdIjsKKwkJCX0gZWxzZSB7CisJCQkJeHBhdGggKz0gIl0iOworCQkJfQorCQl9IGVsc2UgeworCQkJeHBhdGggKz0gImNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIiArIGNsYXNzZXMuam9pbigiICcpIG9yIGNvbnRhaW5zKGNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIikgKyAiICcpXSI7CisJCX0KKwkJdmFyIHhwYXRoUmVzdWx0ID0gX2RvY3VtZW50LmV2YWx1YXRlKHhwYXRoLCBwYXJlbnQsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTsKKwkJdmFyIHJlc3VsdCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7CisJCXdoaWxlIChyZXN1bHQpIHsKKwkJCXRyeSB7CisJCQkJY2FuZGlkYXRlTm9kZXMucHVzaChyZXN1bHQpOworCQkJCXJlc3VsdCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBjYW5kaWRhdGVOb2RlczsKKwl9IGVsc2UgeworCQlpZiAoIW5vZGVUeXBlKSB7CisJCQlub2RlVHlwZSA9ICIqIjsKKwkJfQorCQljYW5kaWRhdGVOb2RlcyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlVHlwZSk7CisJCXZhciBub2RlLCBpID0gMDsKKwlvdXRlcjoKKwkJd2hpbGUgKG5vZGUgPSBjYW5kaWRhdGVOb2Rlc1tpKytdKSB7CisJCQl2YXIgbm9kZUNsYXNzZXMgPSBkb2pvLmh0bWwuZ2V0Q2xhc3Nlcyhub2RlKTsKKwkJCWlmIChub2RlQ2xhc3Nlcy5sZW5ndGggPT0gMCkgeworCQkJCWNvbnRpbnVlIG91dGVyOworCQkJfQorCQkJdmFyIG1hdGNoZXMgPSAwOworCQkJZm9yICh2YXIgaiA9IDA7IGogPCBub2RlQ2xhc3Nlcy5sZW5ndGg7IGorKykgeworCQkJCWlmIChyZUNsYXNzLnRlc3Qobm9kZUNsYXNzZXNbal0pKSB7CisJCQkJCWlmIChjbGFzc01hdGNoVHlwZSA9PSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpIHsKKwkJCQkJCW5vZGVzLnB1c2gobm9kZSk7CisJCQkJCQljb250aW51ZSBvdXRlcjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1hdGNoZXMrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjbGFzc01hdGNoVHlwZSA9PSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuSXNPbmx5KSB7CisJCQkJCQljb250aW51ZSBvdXRlcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaGVzID09IGNsYXNzZXMubGVuZ3RoKSB7CisJCQkJaWYgKChjbGFzc01hdGNoVHlwZSA9PSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuSXNPbmx5KSAmJiAobWF0Y2hlcyA9PSBub2RlQ2xhc3Nlcy5sZW5ndGgpKSB7CisJCQkJCW5vZGVzLnB1c2gobm9kZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FsbCkgeworCQkJCQkJbm9kZXMucHVzaChub2RlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbm9kZXM7CisJfQorfTsKK2Rvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzczsKK2Rvam8uaHRtbC50b0NhbWVsQ2FzZSA9IGZ1bmN0aW9uIChzZWxlY3RvcikgeworCXZhciBhcnIgPSBzZWxlY3Rvci5zcGxpdCgiLSIpLCBjYyA9IGFyclswXTsKKwlmb3IgKHZhciBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeworCQljYyArPSBhcnJbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhcnJbaV0uc3Vic3RyaW5nKDEpOworCX0KKwlyZXR1cm4gY2M7Cit9OworZG9qby5odG1sLnRvU2VsZWN0b3JDYXNlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7CisJcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbQS1aXSkvZywgIi0kMSIpLnRvTG93ZXJDYXNlKCk7Cit9OworaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHsKKwkJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwkJaWYgKCFub2RlIHx8ICFub2RlLmN1cnJlbnRTdHlsZSkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCXJldHVybiBub2RlLmN1cnJlbnRTdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UocHJvcGVydHkpXTsKKwl9OworCWRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlcyA9IGZ1bmN0aW9uIChub2RlKSB7CisJCXJldHVybiBub2RlLmN1cnJlbnRTdHlsZTsKKwl9OworfSBlbHNlIHsKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHsKKwkJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwkJaWYgKCFub2RlIHx8ICFub2RlLnN0eWxlKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwkJdmFyIHMgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpOworCQlyZXR1cm4gKHMgJiYgc1tkb2pvLmh0bWwudG9DYW1lbENhc2UocHJvcGVydHkpXSkgfHwgIiI7CisJfTsKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZXMgPSBmdW5jdGlvbiAobm9kZSkgeworCQlyZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTsKKwl9OworfQorZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkgPSBmdW5jdGlvbiAobm9kZSwgY3NzU2VsZWN0b3IpIHsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXJldHVybiAobm9kZSAmJiBub2RlLnN0eWxlID8gbm9kZS5zdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UoY3NzU2VsZWN0b3IpXSA6IHVuZGVmaW5lZCk7Cit9OworZG9qby5odG1sLmdldFN0eWxlID0gZnVuY3Rpb24gKG5vZGUsIGNzc1NlbGVjdG9yKSB7CisJdmFyIHZhbHVlID0gZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwgY3NzU2VsZWN0b3IpOworCXJldHVybiAodmFsdWUgPyB2YWx1ZSA6IGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIGNzc1NlbGVjdG9yKSk7Cit9OworZG9qby5odG1sLnNldFN0eWxlID0gZnVuY3Rpb24gKG5vZGUsIGNzc1NlbGVjdG9yLCB2YWx1ZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYgKG5vZGUgJiYgbm9kZS5zdHlsZSkgeworCQl2YXIgY2FtZWxDYXNlZCA9IGRvam8uaHRtbC50b0NhbWVsQ2FzZShjc3NTZWxlY3Rvcik7CisJCW5vZGUuc3R5bGVbY2FtZWxDYXNlZF0gPSB2YWx1ZTsKKwl9Cit9OworZG9qby5odG1sLnNldFN0eWxlVGV4dCA9IGZ1bmN0aW9uICh0YXJnZXQsIHRleHQpIHsKKwl0cnkgeworCQl0YXJnZXQuc3R5bGUuY3NzVGV4dCA9IHRleHQ7CisJfQorCWNhdGNoIChlKSB7CisJCXRhcmdldC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgdGV4dCk7CisJfQorfTsKK2Rvam8uaHRtbC5jb3B5U3R5bGUgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKKwlpZiAoIXNvdXJjZS5zdHlsZS5jc3NUZXh0KSB7CisJCXRhcmdldC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgc291cmNlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSk7CisJfSBlbHNlIHsKKwkJdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBzb3VyY2Uuc3R5bGUuY3NzVGV4dDsKKwl9CisJZG9qby5odG1sLmFkZENsYXNzKHRhcmdldCwgZG9qby5odG1sLmdldENsYXNzKHNvdXJjZSkpOworfTsKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWUgPSBmdW5jdGlvbiAobm9kZSwgY3NzU2VsZWN0b3IsIGF1dG9Jc1plcm8pIHsKKwl2YXIgcyA9IGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIGNzc1NlbGVjdG9yKTsKKwlpZiAoKCFzKSB8fCAoKHMgPT0gImF1dG8iKSAmJiAoYXV0b0lzWmVybykpKSB7CisJCXJldHVybiB7dmFsdWU6MCwgdW5pdHM6InB4In07CisJfQorCXZhciBtYXRjaCA9IHMubWF0Y2goLyhcLT9bXGQuXSspKFthLXolXSopL2kpOworCWlmICghbWF0Y2gpIHsKKwkJcmV0dXJuIGRvam8uaHRtbC5nZXRVbml0VmFsdWUuYmFkOworCX0KKwlyZXR1cm4ge3ZhbHVlOk51bWJlcihtYXRjaFsxXSksIHVuaXRzOm1hdGNoWzJdLnRvTG93ZXJDYXNlKCl9OworfTsKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWUuYmFkID0ge3ZhbHVlOk5hTiwgdW5pdHM6IiJ9OworaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwlkb2pvLmh0bWwudG9QaXhlbFZhbHVlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0eWxlVmFsdWUpIHsKKwkJaWYgKCFzdHlsZVZhbHVlKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3R5bGVWYWx1ZS5zbGljZSgtMikgPT0gInB4IikgeworCQkJcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGVWYWx1ZSk7CisJCX0KKwkJdmFyIHBpeGVsVmFsdWUgPSAwOworCQl3aXRoIChlbGVtZW50KSB7CisJCQl2YXIgc0xlZnQgPSBzdHlsZS5sZWZ0OworCQkJdmFyIHJzTGVmdCA9IHJ1bnRpbWVTdHlsZS5sZWZ0OworCQkJcnVudGltZVN0eWxlLmxlZnQgPSBjdXJyZW50U3R5bGUubGVmdDsKKwkJCXRyeSB7CisJCQkJc3R5bGUubGVmdCA9IHN0eWxlVmFsdWUgfHwgMDsKKwkJCQlwaXhlbFZhbHVlID0gc3R5bGUucGl4ZWxMZWZ0OworCQkJCXN0eWxlLmxlZnQgPSBzTGVmdDsKKwkJCQlydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIHBpeGVsVmFsdWU7CisJfTsKK30gZWxzZSB7CisJZG9qby5odG1sLnRvUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZVZhbHVlKSB7CisJCXJldHVybiAoc3R5bGVWYWx1ZSAmJiAoc3R5bGVWYWx1ZS5zbGljZSgtMikgPT0gInB4IikgPyBwYXJzZUZsb2F0KHN0eWxlVmFsdWUpIDogMCk7CisJfTsKK30KK2Rvam8uaHRtbC5nZXRQaXhlbFZhbHVlID0gZnVuY3Rpb24gKG5vZGUsIHN0eWxlUHJvcGVydHksIGF1dG9Jc1plcm8pIHsKKwlyZXR1cm4gZG9qby5odG1sLnRvUGl4ZWxWYWx1ZShub2RlLCBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBzdHlsZVByb3BlcnR5KSk7Cit9OworZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uIChub2RlLCBzZWxlY3RvciwgdmFsdWUpIHsKKwlpZiAoaXNOYU4odmFsdWUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJbm9kZS5zdHlsZVtzZWxlY3Rvcl0gPSBNYXRoLm1heCgwLCB2YWx1ZSkgKyAicHgiOworCXJldHVybiB0cnVlOworfTsKK2Rvam8uaHRtbC5zdHlsZVNoZWV0ID0gbnVsbDsKK2Rvam8uaHRtbC5pbnNlcnRDc3NSdWxlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBkZWNsYXJhdGlvbiwgaW5kZXgpIHsKKwlpZiAoIWRvam8uaHRtbC5zdHlsZVNoZWV0KSB7CisJCWlmIChkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KSB7CisJCQlkb2pvLmh0bWwuc3R5bGVTaGVldCA9IGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkb2N1bWVudC5zdHlsZVNoZWV0c1swXSkgeworCQkJCWRvam8uaHRtbC5zdHlsZVNoZWV0ID0gZG9jdW1lbnQuc3R5bGVTaGVldHNbMF07CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJfQorCWlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgeworCQlpZiAoZG9qby5odG1sLnN0eWxlU2hlZXQuY3NzUnVsZXMpIHsKKwkJCWluZGV4ID0gZG9qby5odG1sLnN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoOworCQl9IGVsc2UgeworCQkJaWYgKGRvam8uaHRtbC5zdHlsZVNoZWV0LnJ1bGVzKSB7CisJCQkJaW5kZXggPSBkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcy5sZW5ndGg7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJfQorCWlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5pbnNlcnRSdWxlKSB7CisJCXZhciBydWxlID0gc2VsZWN0b3IgKyAiIHsgIiArIGRlY2xhcmF0aW9uICsgIiB9IjsKKwkJcmV0dXJuIGRvam8uaHRtbC5zdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgaW5kZXgpOworCX0gZWxzZSB7CisJCWlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKSB7CisJCQlyZXR1cm4gZG9qby5odG1sLnN0eWxlU2hlZXQuYWRkUnVsZShzZWxlY3RvciwgZGVjbGFyYXRpb24sIGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfTsKK2Rvam8uaHRtbC5yZW1vdmVDc3NSdWxlID0gZnVuY3Rpb24gKGluZGV4KSB7CisJaWYgKCFkb2pvLmh0bWwuc3R5bGVTaGVldCkgeworCQlkb2pvLmRlYnVnKCJubyBzdHlsZXNoZWV0IGRlZmluZWQgZm9yIHJlbW92aW5nIHJ1bGVzIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJaWYgKCFpbmRleCkgeworCQkJaW5kZXggPSBkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcy5sZW5ndGg7CisJCQlkb2pvLmh0bWwuc3R5bGVTaGVldC5yZW1vdmVSdWxlKGluZGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkb2N1bWVudC5zdHlsZVNoZWV0c1swXSkgeworCQkJaWYgKCFpbmRleCkgeworCQkJCWluZGV4ID0gZG9qby5odG1sLnN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoOworCQkJfQorCQkJZG9qby5odG1sLnN0eWxlU2hlZXQuZGVsZXRlUnVsZShpbmRleCk7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzID0gW107Citkb2pvLmh0bWwuaW5zZXJ0Q3NzRmlsZSA9IGZ1bmN0aW9uIChVUkksIGRvYywgY2hlY2tEdXBsaWNhdGVzLCBmYWlsX29rKSB7CisJaWYgKCFVUkkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWRvYykgeworCQlkb2MgPSBkb2N1bWVudDsKKwl9CisJdmFyIGNzc1N0ciA9IGRvam8uaG9zdGVudi5nZXRUZXh0KFVSSSwgZmFsc2UsIGZhaWxfb2spOworCWlmIChjc3NTdHIgPT09IG51bGwpIHsKKwkJcmV0dXJuOworCX0KKwljc3NTdHIgPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQoY3NzU3RyLCBVUkkpOworCWlmIChjaGVja0R1cGxpY2F0ZXMpIHsKKwkJdmFyIGlkeCA9IC0xLCBub2RlLCBlbnQgPSBkb2pvLmh0bWwuX2luc2VydGVkQ3NzRmlsZXM7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZW50Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoKGVudFtpXS5kb2MgPT0gZG9jKSAmJiAoZW50W2ldLmNzc1RleHQgPT0gY3NzU3RyKSkgeworCQkJCWlkeCA9IGk7CisJCQkJbm9kZSA9IGVudFtpXS5ub2RlUmVmOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChub2RlKSB7CisJCQl2YXIgc3R5bGVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoc3R5bGVzW2ldID09IG5vZGUpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWRvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5zaGlmdChpZHgsIDEpOworCQl9CisJfQorCXZhciBzdHlsZSA9IGRvam8uaHRtbC5pbnNlcnRDc3NUZXh0KGNzc1N0ciwgZG9jKTsKKwlkb2pvLmh0bWwuX2luc2VydGVkQ3NzRmlsZXMucHVzaCh7ImRvYyI6ZG9jLCAiY3NzVGV4dCI6Y3NzU3RyLCAibm9kZVJlZiI6c3R5bGV9KTsKKwlpZiAoc3R5bGUgJiYgZGpDb25maWcuaXNEZWJ1ZykgeworCQlzdHlsZS5zZXRBdHRyaWJ1dGUoImRiZ0hyZWYiLCBVUkkpOworCX0KKwlyZXR1cm4gc3R5bGU7Cit9OworZG9qby5odG1sLmluc2VydENzc1RleHQgPSBmdW5jdGlvbiAoY3NzU3RyLCBkb2MsIFVSSSkgeworCWlmICghY3NzU3RyKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFkb2MpIHsKKwkJZG9jID0gZG9jdW1lbnQ7CisJfQorCWlmIChVUkkpIHsKKwkJY3NzU3RyID0gZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KGNzc1N0ciwgVVJJKTsKKwl9CisJdmFyIHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CisJc3R5bGUuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7CisJdmFyIGhlYWQgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKKwlpZiAoIWhlYWQpIHsKKwkJZG9qby5kZWJ1ZygiTm8gaGVhZCB0YWcgaW4gZG9jdW1lbnQsIGFib3J0aW5nIHN0eWxlcyIpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CisJfQorCWlmIChzdHlsZS5zdHlsZVNoZWV0KSB7CisJCXZhciBzZXRGdW5jID0gZnVuY3Rpb24gKCkgeworCQkJdHJ5IHsKKwkJCQlzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3NTdHI7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCWRvam8uZGVidWcoZSk7CisJCQl9CisJCX07CisJCWlmIChzdHlsZS5zdHlsZVNoZWV0LmRpc2FibGVkKSB7CisJCQlzZXRUaW1lb3V0KHNldEZ1bmMsIDEwKTsKKwkJfSBlbHNlIHsKKwkJCXNldEZ1bmMoKTsKKwkJfQorCX0gZWxzZSB7CisJCXZhciBjc3NUZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKGNzc1N0cik7CisJCXN0eWxlLmFwcGVuZENoaWxkKGNzc1RleHQpOworCX0KKwlyZXR1cm4gc3R5bGU7Cit9OworZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0ID0gZnVuY3Rpb24gKGNzc1N0ciwgVVJJKSB7CisJaWYgKCFjc3NTdHIgfHwgIVVSSSkgeworCQlyZXR1cm47CisJfQorCXZhciBtYXRjaCwgc3RyID0gIiIsIHVybCA9ICIiLCB1cmxDaHJzID0gIltcXHRcXHNcXHdcXChcXClcXC9cXC5cXFxcJ1wiLTojPSY/fl0rIjsKKwl2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCJ1cmxcXChcXHMqKCIgKyB1cmxDaHJzICsgIilcXHMqXFwpIik7CisJdmFyIHJlZ2V4UHJvdG9jb2wgPSAvKGZpbGV8aHR0cHM/fGZ0cHM/KTpcL1wvLzsKKwlyZWdleFRyaW0gPSBuZXcgUmVnRXhwKCJeW1xcc10qKFsnXCJdPykoIiArIHVybENocnMgKyAiKVxcMVtcXHNdKj8kIik7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApIHsKKwkJdmFyIHJlZ2V4SWUgPSBuZXcgUmVnRXhwKCJBbHBoYUltYWdlTG9hZGVyXFwoKC4qKXNyYz1bJ1wiXSgiICsgdXJsQ2hycyArICIpWydcIl0iKTsKKwkJd2hpbGUgKG1hdGNoID0gcmVnZXhJZS5leGVjKGNzc1N0cikpIHsKKwkJCXVybCA9IG1hdGNoWzJdLnJlcGxhY2UocmVnZXhUcmltLCAiJDIiKTsKKwkJCWlmICghcmVnZXhQcm90b2NvbC5leGVjKHVybCkpIHsKKwkJCQl1cmwgPSAobmV3IGRvam8udXJpLlVyaShVUkksIHVybCkudG9TdHJpbmcoKSk7CisJCQl9CisJCQlzdHIgKz0gY3NzU3RyLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyAiQWxwaGFJbWFnZUxvYWRlcigiICsgbWF0Y2hbMV0gKyAic3JjPSciICsgdXJsICsgIiciOworCQkJY3NzU3RyID0gY3NzU3RyLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJCX0KKwkJY3NzU3RyID0gc3RyICsgY3NzU3RyOworCQlzdHIgPSAiIjsKKwl9CisJd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhjc3NTdHIpKSB7CisJCXVybCA9IG1hdGNoWzFdLnJlcGxhY2UocmVnZXhUcmltLCAiJDIiKTsKKwkJaWYgKCFyZWdleFByb3RvY29sLmV4ZWModXJsKSkgeworCQkJdXJsID0gKG5ldyBkb2pvLnVyaS5VcmkoVVJJLCB1cmwpLnRvU3RyaW5nKCkpOworCQl9CisJCXN0ciArPSBjc3NTdHIuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSArICJ1cmwoIiArIHVybCArICIpIjsKKwkJY3NzU3RyID0gY3NzU3RyLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJfQorCXJldHVybiBzdHIgKyBjc3NTdHI7Cit9OworZG9qby5odG1sLnNldEFjdGl2ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbiAodGl0bGUpIHsKKwl2YXIgaSA9IDAsIGEsIGVscyA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKKwl3aGlsZSAoYSA9IGVsc1tpKytdKSB7CisJCWlmIChhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigic3R5bGUiKSAhPSAtMSAmJiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSkgeworCQkJYS5kaXNhYmxlZCA9IHRydWU7CisJCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikgPT0gdGl0bGUpIHsKKwkJCQlhLmRpc2FibGVkID0gZmFsc2U7CisJCQl9CisJCX0KKwl9Cit9OworZG9qby5odG1sLmdldEFjdGl2ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbiAoKSB7CisJdmFyIGkgPSAwLCBhLCBlbHMgPSBkb2pvLmRvYygpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7CisJd2hpbGUgKGEgPSBlbHNbaSsrXSkgeworCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikgIT0gLTEgJiYgYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikgJiYgIWEuZGlzYWJsZWQpIHsKKwkJCXJldHVybiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKTsKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK307Citkb2pvLmh0bWwuZ2V0UHJlZmVycmVkU3R5bGVTaGVldCA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgaSA9IDAsIGEsIGVscyA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKKwl3aGlsZSAoYSA9IGVsc1tpKytdKSB7CisJCWlmIChhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigic3R5bGUiKSAhPSAtMSAmJiBhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigiYWx0IikgPT0gLTEgJiYgYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpIHsKKwkJCXJldHVybiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKTsKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK307Citkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3MgPSBmdW5jdGlvbiAobm9kZSkgeworCXZhciBkcmggPSBkb2pvLnJlbmRlci5odG1sOworCXZhciBjbGFzc2VzID0ge2RqX2llOmRyaC5pZSwgZGpfaWU1NTpkcmguaWU1NSwgZGpfaWU2OmRyaC5pZTYwLCBkal9pZTc6ZHJoLmllNzAsIGRqX2llcXVpcmtzOmRyaC5pZSAmJiBkcmgucXVpcmtzLCBkal9vcGVyYTpkcmgub3BlcmEsIGRqX29wZXJhODpkcmgub3BlcmEgJiYgKE1hdGguZmxvb3IoZG9qby5yZW5kZXIudmVyc2lvbikgPT0gOCksIGRqX29wZXJhOTpkcmgub3BlcmEgJiYgKE1hdGguZmxvb3IoZG9qby5yZW5kZXIudmVyc2lvbikgPT0gOSksIGRqX2todG1sOmRyaC5raHRtbCwgZGpfc2FmYXJpOmRyaC5zYWZhcmksIGRqX2dlY2tvOmRyaC5tb3ppbGxhfTsKKwlmb3IgKHZhciBwIGluIGNsYXNzZXMpIHsKKwkJaWYgKGNsYXNzZXNbcF0pIHsKKwkJCWRvam8uaHRtbC5hZGRDbGFzcyhub2RlLCBwKTsKKwkJfQorCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9odG1sL3V0aWwuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzI1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaHRtbC91dGlsLmpzCkBAIC0wLDAgKzEsMzU2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwudXRpbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLmh0bWwuZ2V0RWxlbWVudFdpbmRvdyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CisJcmV0dXJuIGRvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyhlbGVtZW50Lm93bmVyRG9jdW1lbnQpOworfTsKK2Rvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyA9IGZ1bmN0aW9uIChkb2MpIHsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkgJiYgIWRvYy5fcGFyZW50V2luZG93KSB7CisJCXZhciBmaXggPSBmdW5jdGlvbiAod2luKSB7CisJCQl3aW4uZG9jdW1lbnQuX3BhcmVudFdpbmRvdyA9IHdpbjsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgd2luLmZyYW1lcy5sZW5ndGg7IGkrKykgeworCQkJCWZpeCh3aW4uZnJhbWVzW2ldKTsKKwkJCX0KKwkJfTsKKwkJZml4KHdpbmRvdy50b3ApOworCX0KKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiB3aW5kb3cgIT09IGRvY3VtZW50LnBhcmVudFdpbmRvdyAmJiAhZG9jLl9wYXJlbnRXaW5kb3cpIHsKKwkJZG9jLnBhcmVudFdpbmRvdy5leGVjU2NyaXB0KCJkb2N1bWVudC5fcGFyZW50V2luZG93ID0gd2luZG93OyIsICJKYXZhc2NyaXB0Iik7CisJCXZhciB3aW4gPSBkb2MuX3BhcmVudFdpbmRvdzsKKwkJZG9jLl9wYXJlbnRXaW5kb3cgPSBudWxsOworCQlyZXR1cm4gd2luOworCX0KKwlyZXR1cm4gZG9jLl9wYXJlbnRXaW5kb3cgfHwgZG9jLnBhcmVudFdpbmRvdyB8fCBkb2MuZGVmYXVsdFZpZXc7Cit9OworZG9qby5odG1sLmdyYXZpdHkgPSBmdW5jdGlvbiAobm9kZSwgZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIG1vdXNlID0gZG9qby5odG1sLmdldEN1cnNvclBvc2l0aW9uKGUpOworCXdpdGggKGRvam8uaHRtbCkgeworCQl2YXIgYWJzb2x1dGUgPSBnZXRBYnNvbHV0ZVBvc2l0aW9uKG5vZGUsIHRydWUpOworCQl2YXIgYmIgPSBnZXRCb3JkZXJCb3gobm9kZSk7CisJCXZhciBub2RlY2VudGVyeCA9IGFic29sdXRlLnggKyAoYmIud2lkdGggLyAyKTsKKwkJdmFyIG5vZGVjZW50ZXJ5ID0gYWJzb2x1dGUueSArIChiYi5oZWlnaHQgLyAyKTsKKwl9CisJd2l0aCAoZG9qby5odG1sLmdyYXZpdHkpIHsKKwkJcmV0dXJuICgobW91c2UueCA8IG5vZGVjZW50ZXJ4ID8gV0VTVCA6IEVBU1QpIHwgKG1vdXNlLnkgPCBub2RlY2VudGVyeSA/IE5PUlRIIDogU09VVEgpKTsKKwl9Cit9OworZG9qby5odG1sLmdyYXZpdHkuTk9SVEggPSAxOworZG9qby5odG1sLmdyYXZpdHkuU09VVEggPSAxIDw8IDE7Citkb2pvLmh0bWwuZ3Jhdml0eS5FQVNUID0gMSA8PCAyOworZG9qby5odG1sLmdyYXZpdHkuV0VTVCA9IDEgPDwgMzsKK2Rvam8uaHRtbC5vdmVyRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBlKSB7CisJZWxlbWVudCA9IGRvam8uYnlJZChlbGVtZW50KTsKKwl2YXIgbW91c2UgPSBkb2pvLmh0bWwuZ2V0Q3Vyc29yUG9zaXRpb24oZSk7CisJdmFyIGJiID0gZG9qby5odG1sLmdldEJvcmRlckJveChlbGVtZW50KTsKKwl2YXIgYWJzb2x1dGUgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihlbGVtZW50LCB0cnVlLCBkb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gpOworCXZhciB0b3AgPSBhYnNvbHV0ZS55OworCXZhciBib3R0b20gPSB0b3AgKyBiYi5oZWlnaHQ7CisJdmFyIGxlZnQgPSBhYnNvbHV0ZS54OworCXZhciByaWdodCA9IGxlZnQgKyBiYi53aWR0aDsKKwlyZXR1cm4gKG1vdXNlLnggPj0gbGVmdCAmJiBtb3VzZS54IDw9IHJpZ2h0ICYmIG1vdXNlLnkgPj0gdG9wICYmIG1vdXNlLnkgPD0gYm90dG9tKTsKK307Citkb2pvLmh0bWwucmVuZGVyZWRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgcmVzdWx0ID0gIiI7CisJaWYgKG5vZGUgPT0gbnVsbCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQlzd2l0Y2ggKG5vZGUuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSkgeworCQkgIGNhc2UgMToKKwkJICBjYXNlIDU6CisJCQl2YXIgZGlzcGxheSA9ICJ1bmtub3duIjsKKwkJCXRyeSB7CisJCQkJZGlzcGxheSA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLmNoaWxkTm9kZXNbaV0sICJkaXNwbGF5Iik7CisJCQl9CisJCQljYXRjaCAoRSkgeworCQkJfQorCQkJc3dpdGNoIChkaXNwbGF5KSB7CisJCQkgIGNhc2UgImJsb2NrIjoKKwkJCSAgY2FzZSAibGlzdC1pdGVtIjoKKwkJCSAgY2FzZSAicnVuLWluIjoKKwkJCSAgY2FzZSAidGFibGUiOgorCQkJICBjYXNlICJ0YWJsZS1yb3ctZ3JvdXAiOgorCQkJICBjYXNlICJ0YWJsZS1oZWFkZXItZ3JvdXAiOgorCQkJICBjYXNlICJ0YWJsZS1mb290ZXItZ3JvdXAiOgorCQkJICBjYXNlICJ0YWJsZS1yb3ciOgorCQkJICBjYXNlICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOgorCQkJICBjYXNlICJ0YWJsZS1jb2x1bW4iOgorCQkJICBjYXNlICJ0YWJsZS1jZWxsIjoKKwkJCSAgY2FzZSAidGFibGUtY2FwdGlvbiI6CisJCQkJcmVzdWx0ICs9ICJcbiI7CisJCQkJcmVzdWx0ICs9IGRvam8uaHRtbC5yZW5kZXJlZFRleHRDb250ZW50KG5vZGUuY2hpbGROb2Rlc1tpXSk7CisJCQkJcmVzdWx0ICs9ICJcbiI7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgIm5vbmUiOgorCQkJCWJyZWFrOworCQkJICBkZWZhdWx0OgorCQkJCWlmIChub2RlLmNoaWxkTm9kZXNbaV0udGFnTmFtZSAmJiBub2RlLmNoaWxkTm9kZXNbaV0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJiciIpIHsKKwkJCQkJcmVzdWx0ICs9ICJcbiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ICs9IGRvam8uaHRtbC5yZW5kZXJlZFRleHRDb250ZW50KG5vZGUuY2hpbGROb2Rlc1tpXSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCSAgY2FzZSAzOgorCQkgIGNhc2UgMjoKKwkJICBjYXNlIDQ6CisJCQl2YXIgdGV4dCA9IG5vZGUuY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7CisJCQl2YXIgdGV4dFRyYW5zZm9ybSA9ICJ1bmtub3duIjsKKwkJCXRyeSB7CisJCQkJdGV4dFRyYW5zZm9ybSA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAidGV4dC10cmFuc2Zvcm0iKTsKKwkJCX0KKwkJCWNhdGNoIChFKSB7CisJCQl9CisJCQlzd2l0Y2ggKHRleHRUcmFuc2Zvcm0pIHsKKwkJCSAgY2FzZSAiY2FwaXRhbGl6ZSI6CisJCQkJdmFyIHdvcmRzID0gdGV4dC5zcGxpdCgiICIpOworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJd29yZHNbaV0gPSB3b3Jkc1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmRzW2ldLnN1YnN0cmluZygxKTsKKwkJCQl9CisJCQkJdGV4dCA9IHdvcmRzLmpvaW4oIiAiKTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAidXBwZXJjYXNlIjoKKwkJCQl0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpOworCQkJCWJyZWFrOworCQkJICBjYXNlICJsb3dlcmNhc2UiOgorCQkJCXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHRleHRUcmFuc2Zvcm0pIHsKKwkJCSAgY2FzZSAibm93cmFwIjoKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAicHJlLXdyYXAiOgorCQkJCWJyZWFrOworCQkJICBjYXNlICJwcmUtbGluZSI6CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgInByZSI6CisJCQkJYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgvXHMrLywgIiAiKTsKKwkJCQlpZiAoL1xzJC8udGVzdChyZXN1bHQpKSB7CisJCQkJCXRleHQucmVwbGFjZSgvXlxzLywgIiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXJlc3VsdCArPSB0ZXh0OworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9OworZG9qby5odG1sLmNyZWF0ZU5vZGVzRnJvbVRleHQgPSBmdW5jdGlvbiAodHh0LCB0cmltKSB7CisJaWYgKHRyaW0pIHsKKwkJdHh0ID0gdHh0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7CisJfQorCXZhciB0biA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdG4uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRuKTsKKwl2YXIgdGFibGVUeXBlID0gIm5vbmUiOworCWlmICgoL148dFtkaF1bXHNcclxuPl0vaSkudGVzdCh0eHQucmVwbGFjZSgvXlxzKy8pKSkgeworCQl0eHQgPSAiPHRhYmxlPjx0Ym9keT48dHI+IiArIHR4dCArICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iOworCQl0YWJsZVR5cGUgPSAiY2VsbCI7CisJfSBlbHNlIHsKKwkJaWYgKCgvXjx0cltcc1xyXG4+XS9pKS50ZXN0KHR4dC5yZXBsYWNlKC9eXHMrLykpKSB7CisJCQl0eHQgPSAiPHRhYmxlPjx0Ym9keT4iICsgdHh0ICsgIjwvdGJvZHk+PC90YWJsZT4iOworCQkJdGFibGVUeXBlID0gInJvdyI7CisJCX0gZWxzZSB7CisJCQlpZiAoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdClbXHNcclxuPl0vaSkudGVzdCh0eHQucmVwbGFjZSgvXlxzKy8pKSkgeworCQkJCXR4dCA9ICI8dGFibGU+IiArIHR4dCArICI8L3RhYmxlPiI7CisJCQkJdGFibGVUeXBlID0gInNlY3Rpb24iOworCQkJfQorCQl9CisJfQorCXRuLmlubmVySFRNTCA9IHR4dDsKKwlpZiAodG5bIm5vcm1hbGl6ZSJdKSB7CisJCXRuLm5vcm1hbGl6ZSgpOworCX0KKwl2YXIgcGFyZW50ID0gbnVsbDsKKwlzd2l0Y2ggKHRhYmxlVHlwZSkgeworCSAgY2FzZSAiY2VsbCI6CisJCXBhcmVudCA9IHRuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpWzBdOworCQlicmVhazsKKwkgIGNhc2UgInJvdyI6CisJCXBhcmVudCA9IHRuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdOworCQlicmVhazsKKwkgIGNhc2UgInNlY3Rpb24iOgorCQlwYXJlbnQgPSB0bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlwYXJlbnQgPSB0bjsKKwkJYnJlYWs7CisJfQorCXZhciBub2RlcyA9IFtdOworCWZvciAodmFyIHggPSAwOyB4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyB4KyspIHsKKwkJbm9kZXMucHVzaChwYXJlbnQuY2hpbGROb2Rlc1t4XS5jbG9uZU5vZGUodHJ1ZSkpOworCX0KKwl0bi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCWRvam8uaHRtbC5kZXN0cm95Tm9kZSh0bik7CisJcmV0dXJuIG5vZGVzOworfTsKK2Rvam8uaHRtbC5wbGFjZU9uU2NyZWVuID0gZnVuY3Rpb24gKG5vZGUsIGRlc2lyZWRYLCBkZXNpcmVkWSwgcGFkZGluZywgaGFzU2Nyb2xsLCBjb3JuZXJzLCB0cnlPbmx5KSB7CisJaWYgKGRlc2lyZWRYIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGRlc2lyZWRYID09ICJhcnJheSIpIHsKKwkJdHJ5T25seSA9IGNvcm5lcnM7CisJCWNvcm5lcnMgPSBoYXNTY3JvbGw7CisJCWhhc1Njcm9sbCA9IHBhZGRpbmc7CisJCXBhZGRpbmcgPSBkZXNpcmVkWTsKKwkJZGVzaXJlZFkgPSBkZXNpcmVkWFsxXTsKKwkJZGVzaXJlZFggPSBkZXNpcmVkWFswXTsKKwl9CisJaWYgKGNvcm5lcnMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIGNvcm5lcnMgPT0gInN0cmluZyIpIHsKKwkJY29ybmVycyA9IGNvcm5lcnMuc3BsaXQoIiwiKTsKKwl9CisJaWYgKCFpc05hTihwYWRkaW5nKSkgeworCQlwYWRkaW5nID0gW051bWJlcihwYWRkaW5nKSwgTnVtYmVyKHBhZGRpbmcpXTsKKwl9IGVsc2UgeworCQlpZiAoIShwYWRkaW5nIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIHBhZGRpbmcgPT0gImFycmF5IikpIHsKKwkJCXBhZGRpbmcgPSBbMCwgMF07CisJCX0KKwl9CisJdmFyIHNjcm9sbCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisJdmFyIHZpZXcgPSBkb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXZhciBvbGREaXNwbGF5ID0gbm9kZS5zdHlsZS5kaXNwbGF5OworCW5vZGUuc3R5bGUuZGlzcGxheSA9ICIiOworCXZhciBiYiA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7CisJdmFyIHcgPSBiYi53aWR0aDsKKwl2YXIgaCA9IGJiLmhlaWdodDsKKwlub2RlLnN0eWxlLmRpc3BsYXkgPSBvbGREaXNwbGF5OworCWlmICghKGNvcm5lcnMgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2YgY29ybmVycyA9PSAiYXJyYXkiKSkgeworCQljb3JuZXJzID0gWyJUTCJdOworCX0KKwl2YXIgYmVzdHgsIGJlc3R5LCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eSwgYmVzdENvcm5lcjsKKwlmb3IgKHZhciBjaWRleCA9IDA7IGNpZGV4IDwgY29ybmVycy5sZW5ndGg7ICsrY2lkZXgpIHsKKwkJdmFyIGNvcm5lciA9IGNvcm5lcnNbY2lkZXhdOworCQl2YXIgbWF0Y2ggPSB0cnVlOworCQl2YXIgdHJ5WCA9IGRlc2lyZWRYIC0gKGNvcm5lci5jaGFyQXQoMSkgPT0gIkwiID8gMCA6IHcpICsgcGFkZGluZ1swXSAqIChjb3JuZXIuY2hhckF0KDEpID09ICJMIiA/IDEgOiAtMSk7CisJCXZhciB0cnlZID0gZGVzaXJlZFkgLSAoY29ybmVyLmNoYXJBdCgwKSA9PSAiVCIgPyAwIDogaCkgKyBwYWRkaW5nWzFdICogKGNvcm5lci5jaGFyQXQoMCkgPT0gIlQiID8gMSA6IC0xKTsKKwkJaWYgKGhhc1Njcm9sbCkgeworCQkJdHJ5WCAtPSBzY3JvbGwueDsKKwkJCXRyeVkgLT0gc2Nyb2xsLnk7CisJCX0KKwkJaWYgKHRyeVggPCAwKSB7CisJCQl0cnlYID0gMDsKKwkJCW1hdGNoID0gZmFsc2U7CisJCX0KKwkJaWYgKHRyeVkgPCAwKSB7CisJCQl0cnlZID0gMDsKKwkJCW1hdGNoID0gZmFsc2U7CisJCX0KKwkJdmFyIHggPSB0cnlYICsgdzsKKwkJaWYgKHggPiB2aWV3LndpZHRoKSB7CisJCQl4ID0gdmlldy53aWR0aCAtIHc7CisJCQltYXRjaCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJeCA9IHRyeVg7CisJCX0KKwkJeCA9IE1hdGgubWF4KHBhZGRpbmdbMF0sIHgpICsgc2Nyb2xsLng7CisJCXZhciB5ID0gdHJ5WSArIGg7CisJCWlmICh5ID4gdmlldy5oZWlnaHQpIHsKKwkJCXkgPSB2aWV3LmhlaWdodCAtIGg7CisJCQltYXRjaCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJeSA9IHRyeVk7CisJCX0KKwkJeSA9IE1hdGgubWF4KHBhZGRpbmdbMV0sIHkpICsgc2Nyb2xsLnk7CisJCWlmIChtYXRjaCkgeworCQkJYmVzdHggPSB4OworCQkJYmVzdHkgPSB5OworCQkJYmVzdERpc3RhbmNlID0gMDsKKwkJCWJlc3RDb3JuZXIgPSBjb3JuZXI7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXZhciBkaXN0ID0gTWF0aC5wb3coeCAtIHRyeVggLSBzY3JvbGwueCwgMikgKyBNYXRoLnBvdyh5IC0gdHJ5WSAtIHNjcm9sbC55LCAyKTsKKwkJCWlmIChiZXN0RGlzdGFuY2UgPiBkaXN0KSB7CisJCQkJYmVzdERpc3RhbmNlID0gZGlzdDsKKwkJCQliZXN0eCA9IHg7CisJCQkJYmVzdHkgPSB5OworCQkJCWJlc3RDb3JuZXIgPSBjb3JuZXI7CisJCQl9CisJCX0KKwl9CisJaWYgKCF0cnlPbmx5KSB7CisJCW5vZGUuc3R5bGUubGVmdCA9IGJlc3R4ICsgInB4IjsKKwkJbm9kZS5zdHlsZS50b3AgPSBiZXN0eSArICJweCI7CisJfQorCXJldHVybiB7bGVmdDpiZXN0eCwgdG9wOmJlc3R5LCB4OmJlc3R4LCB5OmJlc3R5LCBkaXN0OmJlc3REaXN0YW5jZSwgY29ybmVyOmJlc3RDb3JuZXJ9OworfTsKK2Rvam8uaHRtbC5wbGFjZU9uU2NyZWVuUG9pbnQgPSBmdW5jdGlvbiAobm9kZSwgZGVzaXJlZFgsIGRlc2lyZWRZLCBwYWRkaW5nLCBoYXNTY3JvbGwpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC5wbGFjZU9uU2NyZWVuUG9pbnQiLCAidXNlIGRvam8uaHRtbC5wbGFjZU9uU2NyZWVuKCkgaW5zdGVhZCIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5odG1sLnBsYWNlT25TY3JlZW4obm9kZSwgZGVzaXJlZFgsIGRlc2lyZWRZLCBwYWRkaW5nLCBoYXNTY3JvbGwsIFsiVEwiLCAiVFIiLCAiQkwiLCAiQlIiXSk7Cit9OworZG9qby5odG1sLnBsYWNlT25TY3JlZW5Bcm91bmRFbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIGFyb3VuZE5vZGUsIHBhZGRpbmcsIGFyb3VuZFR5cGUsIGFyb3VuZENvcm5lcnMsIHRyeU9ubHkpIHsKKwl2YXIgYmVzdCwgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7CisJYXJvdW5kTm9kZSA9IGRvam8uYnlJZChhcm91bmROb2RlKTsKKwl2YXIgb2xkRGlzcGxheSA9IGFyb3VuZE5vZGUuc3R5bGUuZGlzcGxheTsKKwlhcm91bmROb2RlLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0RWxlbWVudEJveChhcm91bmROb2RlLCBhcm91bmRUeXBlKTsKKwl2YXIgYXJvdW5kTm9kZVcgPSBtYi53aWR0aDsKKwl2YXIgYXJvdW5kTm9kZUggPSBtYi5oZWlnaHQ7CisJdmFyIGFyb3VuZE5vZGVQb3MgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihhcm91bmROb2RlLCB0cnVlLCBhcm91bmRUeXBlKTsKKwlhcm91bmROb2RlLnN0eWxlLmRpc3BsYXkgPSBvbGREaXNwbGF5OworCWZvciAodmFyIG5vZGVDb3JuZXIgaW4gYXJvdW5kQ29ybmVycykgeworCQl2YXIgcG9zLCBkZXNpcmVkWCwgZGVzaXJlZFk7CisJCXZhciBjb3JuZXJzID0gYXJvdW5kQ29ybmVyc1tub2RlQ29ybmVyXTsKKwkJZGVzaXJlZFggPSBhcm91bmROb2RlUG9zLnggKyAobm9kZUNvcm5lci5jaGFyQXQoMSkgPT0gIkwiID8gMCA6IGFyb3VuZE5vZGVXKTsKKwkJZGVzaXJlZFkgPSBhcm91bmROb2RlUG9zLnkgKyAobm9kZUNvcm5lci5jaGFyQXQoMCkgPT0gIlQiID8gMCA6IGFyb3VuZE5vZGVIKTsKKwkJcG9zID0gZG9qby5odG1sLnBsYWNlT25TY3JlZW4obm9kZSwgZGVzaXJlZFgsIGRlc2lyZWRZLCBwYWRkaW5nLCB0cnVlLCBjb3JuZXJzLCB0cnVlKTsKKwkJaWYgKHBvcy5kaXN0ID09IDApIHsKKwkJCWJlc3QgPSBwb3M7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmIChiZXN0RGlzdGFuY2UgPiBwb3MuZGlzdCkgeworCQkJCWJlc3REaXN0YW5jZSA9IHBvcy5kaXN0OworCQkJCWJlc3QgPSBwb3M7CisJCQl9CisJCX0KKwl9CisJaWYgKCF0cnlPbmx5KSB7CisJCW5vZGUuc3R5bGUubGVmdCA9IGJlc3QubGVmdCArICJweCI7CisJCW5vZGUuc3R5bGUudG9wID0gYmVzdC50b3AgKyAicHgiOworCX0KKwlyZXR1cm4gYmVzdDsKK307Citkb2pvLmh0bWwuc2Nyb2xsSW50b1ZpZXcgPSBmdW5jdGlvbiAobm9kZSkgeworCWlmICghbm9kZSkgeworCQlyZXR1cm47CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWlmIChkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUucGFyZW50Tm9kZSkuaGVpZ2h0IDw9IG5vZGUucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpIHsKKwkJCW5vZGUuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgeworCQkJbm9kZS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7CisJCX0gZWxzZSB7CisJCQl2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOworCQkJdmFyIHBhcmVudEJvdHRvbSA9IHBhcmVudC5zY3JvbGxUb3AgKyBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHBhcmVudCkuaGVpZ2h0OworCQkJdmFyIG5vZGVCb3R0b20gPSBub2RlLm9mZnNldFRvcCArIGRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSkuaGVpZ2h0OworCQkJaWYgKHBhcmVudEJvdHRvbSA8IG5vZGVCb3R0b20pIHsKKwkJCQlwYXJlbnQuc2Nyb2xsVG9wICs9IChub2RlQm90dG9tIC0gcGFyZW50Qm90dG9tKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBhcmVudC5zY3JvbGxUb3AgPiBub2RlLm9mZnNldFRvcCkgeworCQkJCQlwYXJlbnQuc2Nyb2xsVG9wIC09IChwYXJlbnQuc2Nyb2xsVG9wIC0gbm9kZS5vZmZzZXRUb3ApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9SRUFETUUgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorQWxsIGZpbGVzIHdpdGhpbiB0aGlzIGRpcmVjdG9yeSBhbmQgc3ViZGlyZWN0b3JpZXMgd2VyZSBtYW51YWxseSBkZXJpdmVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL2NsZHIKKworU2VlIHRlcm1zIG9mIHVzZTogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jb3B5cmlnaHQuaHRtbCNFeGhpYml0MQorCitFdmVudHVhbGx5LCB0aGlzIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBkaXJlY3RseSBmcm9tIHRoZSBYTUwgaW4gdGhlIENMRFIgcmVwb3NpdG9yeSB0byBwcm92aWRlCithY2N1cmF0ZSBhbmQgZnVsbCBzdXBwb3J0IGZvciB0aGUgZnVsbCBzZXQgb2YgbG9jYWxlcy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9kZS9ncmVnb3JpYW4uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvZGUvZ3JlZ29yaWFuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzRjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvZGUvZ3JlZ29yaWFuLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJmaWVsZC13ZWVrZGF5IjoiV29jaGVudGFnIiwgImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQuTU0ueXl5eSIsICJmaWVsZC1zZWNvbmQiOiJTZWt1bmRlIiwgImZpZWxkLXdlZWsiOiJXb2NoZSIsICJwbSI6Im5hY2htLiIsICJ0aW1lRm9ybWF0LWZ1bGwiOiJIOm1tJyBVaHIgJ3oiLCAibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkoiLCAiRiIsICJNIiwgIkEiLCAiTSIsICJKIiwgIkoiLCAiQSIsICJTIiwgIk8iLCAiTiIsICJEIl0sICJhbSI6InZvcm0uIiwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsICJNIiwgIkQiLCAiTSIsICJEIiwgIkYiLCAiUyJdLCAiZmllbGQteWVhciI6IkphaHIiLCAiZXJhcyI6WyJ2LiBDaHIuIiwgIm4uIENoci4iXSwgImZpZWxkLWhvdXIiOiJTdHVuZGUiLCAiZGF0ZUZvcm1hdC1sb25nIjoiZC4gTU1NTSB5eXl5IiwgImZpZWxkLWRheSI6IlRhZyIsICJmaWVsZC1kYXlwZXJpb2QiOiJUYWdlc2hceGU0bGZ0ZSIsICJmaWVsZC1tb250aCI6Ik1vbmF0IiwgImRhdGVGb3JtYXQtc2hvcnQiOiJkZC5NTS55eSIsICJtb250aHMtZm9ybWF0LXdpZGUiOlsiSmFudWFyIiwgIkZlYnJ1YXIiLCAiTVx4ZTRyeiIsICJBcHJpbCIsICJNYWkiLCAiSnVuaSIsICJKdWxpIiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2t0b2JlciIsICJOb3ZlbWJlciIsICJEZXplbWJlciJdLCAiZmllbGQtZXJhIjoiRXBvY2hlIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyJKYW4iLCAiRmViIiwgIk1yeiIsICJBcHIiLCAiTWFpIiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPa3QiLCAiTm92IiwgIkRleiJdLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJTb25udGFnIiwgIk1vbnRhZyIsICJEaWVuc3RhZyIsICJNaXR0d29jaCIsICJEb25uZXJzdGFnIiwgIkZyZWl0YWciLCAiU2Ftc3RhZyJdLCAiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSwgZC4gTU1NTSB5eXl5IiwgImZpZWxkLXpvbmUiOiJab25lIiwgImRheXMtZm9ybWF0LWFiYnIiOlsiU28iLCAiTW8iLCAiRGkiLCAiTWkiLCAiRG8iLCAiRnIiLCAiU2EiXSwgImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwgInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsICJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2VuL2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9lbi9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiMjE4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9lbi9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7Im1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLCAiZGF0ZUZvcm1hdC1sb25nIjoiTU1NTSBkLCB5eXl5IiwgInRpbWVGb3JtYXQtZnVsbCI6Img6bW06c3MgYSB2IiwgImVyYXMiOlsiQkMiLCAiQUQiXSwgInRpbWVGb3JtYXQtbWVkaXVtIjoiaDptbTpzcyBhIiwgImRhdGVGb3JtYXQtbWVkaXVtIjoiTU1NIGQsIHl5eXkiLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIl0sICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBNTU1NIGQsIHl5eXkiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwgInRpbWVGb3JtYXQtbG9uZyI6Img6bW06c3MgYSB6IiwgInRpbWVGb3JtYXQtc2hvcnQiOiJoOm1tIGEiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6Ik0vZC95eSIsICJtb250aHMtZm9ybWF0LXdpZGUiOlsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLCAiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJTIiwgIk0iLCAiVCIsICJXIiwgIlQiLCAiRiIsICJTIl0sICJkYXlzLWZvcm1hdC13aWRlIjpbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sICJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwgImZpZWxkLXNlY29uZCI6IlNlY29uZCIsICJmaWVsZC13ZWVrIjoiV2VlayIsICJwbSI6IlBNIiwgImFtIjoiQU0iLCAiZmllbGQteWVhciI6IlllYXIiLCAiZmllbGQtbWludXRlIjoiTWludXRlIiwgImZpZWxkLWhvdXIiOiJIb3VyIiwgImZpZWxkLWRheSI6IkRheSIsICJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCAiZmllbGQtbW9udGgiOiJNb250aCIsICJmaWVsZC1lcmEiOiJFcmEiLCAiZmllbGQtem9uZSI6IlpvbmUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvZXMvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2VzL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2MxYTdiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2VzL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZmllbGQtd2Vla2RheSI6ImRceGVkYSBkZSBsYSBzZW1hbmEiLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkZC1NTU0teXkiLCAiZmllbGQtc2Vjb25kIjoic2VndW5kbyIsICJmaWVsZC13ZWVrIjoic2VtYW5hIiwgInBtIjoicC5tLiIsICJ0aW1lRm9ybWF0LWZ1bGwiOiJISCdIJ21tJydzc1wiIHoiLCAibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIkUiLCAiRiIsICJNIiwgIkEiLCAiTSIsICJKIiwgIkoiLCAiQSIsICJTIiwgIk8iLCAiTiIsICJEIl0sICJhbSI6ImEubS4iLCAiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJEIiwgIkwiLCAiTSIsICJNIiwgIkoiLCAiViIsICJTIl0sICJmaWVsZC15ZWFyIjoiYVx4ZjFvIiwgImVyYXMiOlsiYS5DLiIsICJkLkMuIl0sICJmaWVsZC1taW51dGUiOiJtaW51dG8iLCAiZmllbGQtaG91ciI6ImhvcmEiLCAiZGF0ZUZvcm1hdC1sb25nIjoiZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwgImZpZWxkLWRheSI6ImRceGVkYSIsICJmaWVsZC1kYXlwZXJpb2QiOiJwZXJpb2RvIGRlbCBkXHhlZGEiLCAiZmllbGQtbW9udGgiOiJtZXMiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6ImQvTU0veXkiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbImVuZXJvIiwgImZlYnJlcm8iLCAibWFyem8iLCAiYWJyaWwiLCAibWF5byIsICJqdW5pbyIsICJqdWxpbyIsICJhZ29zdG8iLCAic2VwdGllbWJyZSIsICJvY3R1YnJlIiwgIm5vdmllbWJyZSIsICJkaWNpZW1icmUiXSwgImZpZWxkLWVyYSI6ImVyYSIsICJtb250aHMtZm9ybWF0LWFiYnIiOlsiZW5lIiwgImZlYiIsICJtYXIiLCAiYWJyIiwgIm1heSIsICJqdW4iLCAianVsIiwgImFnbyIsICJzZXAiLCAib2N0IiwgIm5vdiIsICJkaWMiXSwgImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsICJsdW5lcyIsICJtYXJ0ZXMiLCAibWlceGU5cmNvbGVzIiwgImp1ZXZlcyIsICJ2aWVybmVzIiwgInNceGUxYmFkbyJdLCAiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCAiZmllbGQtem9uZSI6InpvbmEiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCAibHVuIiwgIm1hciIsICJtaVx4ZTkiLCAianVlIiwgInZpZSIsICJzXHhlMWIiXSwgInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCAidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwgInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvZmkvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2ZpL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE0YWMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2ZpL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZmllbGQtd2Vla2RheSI6InZpaWtvbnBceGU0aXZceGU0IiwgImRhdGVGb3JtYXQtbWVkaXVtIjoiZC5NLnl5eXkiLCAiZmllbGQtc2Vjb25kIjoic2VrdW50aSIsICJmaWVsZC13ZWVrIjoidmlpa2tvIiwgInBtIjoiaXAuIiwgInRpbWVGb3JtYXQtZnVsbCI6IkgubW0uc3MgdiIsICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiVCIsICJIIiwgIk0iLCAiSCIsICJUIiwgIksiLCAiSCIsICJFIiwgIlMiLCAiTCIsICJNIiwgIkoiXSwgImFtIjoiYXAuIiwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiUyIsICJNIiwgIlQiLCAiSyIsICJUIiwgIlAiLCAiTCJdLCAiZmllbGQteWVhciI6InZ1b3NpIiwgImVyYXMiOlsiZUtyLiIsICJqS3IuIl0sICJmaWVsZC1taW51dGUiOiJtaW51dXR0aSIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkgubW0uc3MiLCAiZmllbGQtaG91ciI6InR1bnRpIiwgImRhdGVGb3JtYXQtbG9uZyI6ImQuIE1NTU0ndGEgJ3l5eXkiLCAiZmllbGQtZGF5IjoicFx4ZTRpdlx4ZTQiLCAiZmllbGQtZGF5cGVyaW9kIjoiYXAvaXAtdmFsaW50YSIsICJmaWVsZC1tb250aCI6Imt1dWthdXNpIiwgImRhdGVGb3JtYXQtc2hvcnQiOiJkLk0ueXl5eSIsICJtb250aHMtZm9ybWF0LXdpZGUiOlsidGFtbWlrdXUiLCAiaGVsbWlrdXUiLCAibWFhbGlza3V1IiwgImh1aHRpa3V1IiwgInRvdWtva3V1IiwgImtlc1x4ZTRrdXUiLCAiaGVpblx4ZTRrdXUiLCAiZWxva3V1IiwgInN5eXNrdXUiLCAibG9rYWt1dSIsICJtYXJyYXNrdXUiLCAiam91bHVrdXUiXSwgImZpZWxkLWVyYSI6ImFpa2FrYXVzaSIsICJ0aW1lRm9ybWF0LXNob3J0IjoiSC5tbSIsICJtb250aHMtZm9ybWF0LWFiYnIiOlsidGFtbWkiLCAiaGVsbWkiLCAibWFhbGlzIiwgImh1aHRpIiwgInRvdWtvIiwgImtlc1x4ZTQiLCAiaGVpblx4ZTQiLCAiZWxvIiwgInN5eXMiLCAibG9rYSIsICJtYXJyYXMiLCAiam91bHUiXSwgInRpbWVGb3JtYXQtbG9uZyI6IidrbG8gJ0gubW0uc3MiLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJzdW5udW50YWkiLCAibWFhbmFudGFpIiwgInRpaXN0YWkiLCAia2Vza2l2aWlra28iLCAidG9yc3RhaSIsICJwZXJqYW50YWkiLCAibGF1YW50YWkiXSwgImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUnbmEgJ2QuIE1NTU0ndGEgJ3l5eXkiLCAiZmllbGQtem9uZSI6ImFpa2F2eVx4ZjZoeWtlIiwgImRheXMtZm9ybWF0LWFiYnIiOlsic3UiLCAibWEiLCAidGkiLCAia2UiLCAidG8iLCAicGUiLCAibGEiXX0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2ZyL2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9mci9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjZjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9mci9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImZpZWxkLXdlZWtkYXkiOiJqb3VyIGRlIGxhIHNlbWFpbmUiLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkIE1NTSB5eSIsICJmaWVsZC1zZWNvbmQiOiJzZWNvbmRlIiwgImZpZWxkLXdlZWsiOiJzZW1haW5lIiwgInBtIjoiYXAuIG0uIiwgInRpbWVGb3JtYXQtZnVsbCI6IkhIJyBoICdtbSB6IiwgIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLCAiYW0iOiJtYXRpbiIsICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCAiTCIsICJNIiwgIk0iLCAiSiIsICJWIiwgIlMiXSwgImZpZWxkLXllYXIiOiJhbm5ceGU5ZSIsICJlcmFzIjpbImF2LiBKLi1DLiIsICJhcHIuIEouLUMuIl0sICJmaWVsZC1taW51dGUiOiJtaW51dGUiLCAiZmllbGQtaG91ciI6ImhldXJlIiwgImRhdGVGb3JtYXQtbG9uZyI6ImQgTU1NTSB5eXl5IiwgImZpZWxkLWRheSI6ImpvdXIiLCAiZmllbGQtZGF5cGVyaW9kIjoicFx4ZTlyaW9kZSBkZSBsYSBqb3Vyblx4ZTllIiwgImZpZWxkLW1vbnRoIjoibW9pcyIsICJkYXRlRm9ybWF0LXNob3J0IjoiZGQvTU0veXkiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbImphbnZpZXIiLCAiZlx4ZTl2cmllciIsICJtYXJzIiwgImF2cmlsIiwgIm1haSIsICJqdWluIiwgImp1aWxsZXQiLCAiYW9ceGZidCIsICJzZXB0ZW1icmUiLCAib2N0b2JyZSIsICJub3ZlbWJyZSIsICJkXHhlOWNlbWJyZSJdLCAiZmllbGQtZXJhIjoiXHhlOXBvcXVlIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW52LiIsICJmXHhlOXZyLiIsICJtYXJzIiwgImF2ci4iLCAibWFpIiwgImp1aW4iLCAianVpbC4iLCAiYW9ceGZidCIsICJzZXB0LiIsICJvY3QuIiwgIm5vdi4iLCAiZFx4ZTljLiJdLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJkaW1hbmNoZSIsICJsdW5kaSIsICJtYXJkaSIsICJtZXJjcmVkaSIsICJqZXVkaSIsICJ2ZW5kcmVkaSIsICJzYW1lZGkiXSwgImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUgZCBNTU1NIHl5eXkiLCAiZmllbGQtem9uZSI6InpvbmUiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJkaW0uIiwgImx1bi4iLCAibWFyLiIsICJtZXIuIiwgImpldS4iLCAidmVuLiIsICJzYW0uIl0sICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwgInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsICJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1MmYzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImZpZWxkLXdlZWtkYXkiOiJEYXkgb2YgdGhlIFdlZWsiLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5IE1NTSBkIiwgImZpZWxkLXNlY29uZCI6IlNlY29uZCIsICJmaWVsZC13ZWVrIjoiV2VlayIsICJwbSI6IlBNIiwgInRpbWVGb3JtYXQtZnVsbCI6IkhIOm1tOnNzIHoiLCAibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIiwgIjExIiwgIjEyIl0sICJhbSI6IkFNIiwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyJdLCAiZmllbGQteWVhciI6IlllYXIiLCAiZXJhcyI6WyJCQ0UiLCAiQ0UiXSwgImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwgImZpZWxkLWhvdXIiOiJIb3VyIiwgImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkgTU1NTSBkIiwgImZpZWxkLWRheSI6IkRheSIsICJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCAiZmllbGQtbW9udGgiOiJNb250aCIsICJkYXRlRm9ybWF0LXNob3J0IjoieXkvTU0vZGQiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjEwIiwgIjExIiwgIjEyIl0sICJmaWVsZC1lcmEiOiJFcmEiLCAidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSIsICIxMiJdLCAidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsICJkYXlzLWZvcm1hdC13aWRlIjpbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciXSwgImRhdGVGb3JtYXQtZnVsbCI6IkVFRUUsIHl5eXkgTU1NTSBkZCIsICJmaWVsZC16b25lIjoiWm9uZSIsICJkYXlzLWZvcm1hdC1hYmJyIjpbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciXX0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2dyZWdvcmlhbkV4dHJhcy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9ncmVnb3JpYW5FeHRyYXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4MTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9ncmVnb3JpYW5FeHRyYXMuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRhdGVGb3JtYXQteWVhck9ubHkiOiJ5eXl5In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2h1L2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9odS9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MGRjNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9odS9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImZpZWxkLXdlZWtkYXkiOiJoXHhlOXQgbmFwamEiLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5IE1NTSBkIiwgImZpZWxkLXNlY29uZCI6Im1ceGUxc29kcGVyYyIsICJmaWVsZC13ZWVrIjoiaFx4ZTl0IiwgInBtIjoiZC51LiIsICJ0aW1lRm9ybWF0LWZ1bGwiOiJoOm1tOnNzIGEgdiIsICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsICJGIiwgIk0iLCAiXHhjMSIsICJNIiwgIkoiLCAiSiIsICJBIiwgIlMiLCAiTyIsICJOIiwgIkQiXSwgImFtIjoiZC5lLiIsICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlYiLCAiSCIsICJLIiwgIlN6IiwgIkNzIiwgIlAiLCAiU3oiXSwgImZpZWxkLXllYXIiOiJceGU5diIsICJlcmFzIjpbImsuZS4iLCAiay51LiJdLCAiZmllbGQtbWludXRlIjoicGVyYyIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6Img6bW06c3MgYSIsICJmaWVsZC1ob3VyIjoiXHhmM3JhIiwgImRhdGVGb3JtYXQtbG9uZyI6Inl5eXkgTU1NTSBkIiwgImZpZWxkLWRheSI6Im5hcCIsICJmaWVsZC1kYXlwZXJpb2QiOiJuYXBzemFrIiwgImZpZWxkLW1vbnRoIjoiaFx4ZjNuYXAiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5eXktTS1kIiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW51XHhlMXIiLCAiZmVicnVceGUxciIsICJtXHhlMXJjaXVzIiwgIlx4ZTFwcmlsaXMiLCAibVx4ZTFqdXMiLCAialx4ZmFuaXVzIiwgImpceGZhbGl1cyIsICJhdWd1c3p0dXMiLCAic3plcHRlbWJlciIsICJva3RceGYzYmVyIiwgIm5vdmVtYmVyIiwgImRlY2VtYmVyIl0sICJmaWVsZC1lcmEiOiJceGU5cmEiLCAidGltZUZvcm1hdC1zaG9ydCI6Img6bW0gYSIsICJtb250aHMtZm9ybWF0LWFiYnIiOlsiamFuIiwgImZlYiIsICJtXHhlMXIiLCAiYXByIiwgIm1ceGUxaiIsICJqXHhmYW4iLCAialx4ZmFsIiwgImF1ZyIsICJzemUiLCAib2t0IiwgIm5vdiIsICJkZWMiXSwgInRpbWVGb3JtYXQtbG9uZyI6Img6bW06c3MgYSB6IiwgImRheXMtZm9ybWF0LXdpZGUiOlsidmFzXHhlMXJuYXAiLCAiaFx4ZTl0Zlx1MDE1MSIsICJrZWRkIiwgInN6ZXJkYSIsICJjc1x4ZmN0XHhmNnJ0XHhmNmsiLCAicFx4ZTludGVrIiwgInN6b21iYXQiXSwgImRhdGVGb3JtYXQtZnVsbCI6Inl5eXkgTU1NTSBkLCBFRUVFIiwgImZpZWxkLXpvbmUiOiJ6XHhmM25hIiwgImRheXMtZm9ybWF0LWFiYnIiOlsiVmEiLCAiSFx4ZTkiLCAiS2UiLCAiU3plIiwgIkNzXHhmYyIsICJQXHhlOSIsICJTem8iXX0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2l0L2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9pdC9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyNGFhMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9pdC9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImZpZWxkLXdlZWtkYXkiOiJnaW9ybm8gZGVsbGEgc2V0dGltYW5hIiwgImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQvTU1NL3l5IiwgImZpZWxkLXNlY29uZCI6InNlY29uZG8iLCAiZmllbGQtd2VlayI6InNldHRpbWFuYSIsICJwbSI6InAuIiwgIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJHIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiRyIsICJMIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLCAiYW0iOiJtLiIsICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCAiTCIsICJNIiwgIk0iLCAiRyIsICJWIiwgIlMiXSwgImZpZWxkLXllYXIiOiJhbm5vIiwgImVyYXMiOlsiYUMiLCAiZEMiXSwgImZpZWxkLW1pbnV0ZSI6Im1pbnV0byIsICJmaWVsZC1ob3VyIjoib3JhIiwgImRhdGVGb3JtYXQtbG9uZyI6ImRkIE1NTU0geXl5eSIsICJmaWVsZC1kYXkiOiJnaW9ybm8iLCAiZmllbGQtZGF5cGVyaW9kIjoicGVyaW9kbyBkZWwgZ2lvcm5vIiwgImZpZWxkLW1vbnRoIjoibWVzZSIsICJkYXRlRm9ybWF0LXNob3J0IjoiZGQvTU0veXkiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbImdlbm5haW8iLCAiZmViYnJhaW8iLCAibWFyem8iLCAiYXByaWxlIiwgIm1hZ2dpbyIsICJnaXVnbm8iLCAibHVnbGlvIiwgImFnb3N0byIsICJzZXR0ZW1icmUiLCAib3R0b2JyZSIsICJub3ZlbWJyZSIsICJkaWNlbWJyZSJdLCAiZmllbGQtZXJhIjoiZXJhIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyJnZW4iLCAiZmViIiwgIm1hciIsICJhcHIiLCAibWFnIiwgImdpdSIsICJsdWciLCAiYWdvIiwgInNldCIsICJvdHQiLCAibm92IiwgImRpYyJdLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJkb21lbmljYSIsICJsdW5lZFx4ZWMiLCAibWFydGVkXHhlYyIsICJtZXJjb2xlZFx4ZWMiLCAiZ2lvdmVkXHhlYyIsICJ2ZW5lcmRceGVjIiwgInNhYmF0byJdLCAiZGF0ZUZvcm1hdC1mdWxsIjoiRUVFRSBkIE1NTU0geXl5eSIsICJmaWVsZC16b25lIjoiem9uYSIsICJkYXlzLWZvcm1hdC1hYmJyIjpbImRvbSIsICJsdW4iLCAibWFyIiwgIm1lciIsICJnaW8iLCAidmVuIiwgInNhYiJdLCAidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhIOm1tOnNzIiwgInRpbWVGb3JtYXQtc2hvcnQiOiJISDptbSIsICJ0aW1lRm9ybWF0LWxvbmciOiJISDptbTpzcyB6In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL2phL2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9qYS9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ZDE5MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9qYS9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiXHU2NWU1IiwgIlx1NjcwOCIsICJcdTcwNmIiLCAiXHU2YzM0IiwgIlx1NjcyOCIsICJcdTkxZDEiLCAiXHU1NzFmIl0sICJ0aW1lRm9ybWF0LWZ1bGwiOiJIJ1x1NjY0MidtbSdcdTUyMDYnc3MnXHU3OWQyJ3oiLCAiZXJhcyI6WyJcdTdkMDBcdTUxNDNcdTUyNGQiLCAiXHU4OTdmXHU2NmE2Il0sICJ0aW1lRm9ybWF0LW1lZGl1bSI6Ikg6bW06c3MiLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5L01NL2RkIiwgImFtIjoiXHU1MzQ4XHU1MjRkIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyIxIFx1NjcwOCIsICIyIFx1NjcwOCIsICIzIFx1NjcwOCIsICI0IFx1NjcwOCIsICI1IFx1NjcwOCIsICI2IFx1NjcwOCIsICI3IFx1NjcwOCIsICI4IFx1NjcwOCIsICI5IFx1NjcwOCIsICIxMCBcdTY3MDgiLCAiMTEgXHU2NzA4IiwgIjEyIFx1NjcwOCJdLCAiZGF0ZUZvcm1hdC1mdWxsIjoieXl5eSdcdTVlNzQnTSdcdTY3MDgnZCdcdTY1ZTUnRUVFRSIsICJkYXlzLWZvcm1hdC1hYmJyIjpbIlx1NjVlNSIsICJcdTY3MDgiLCAiXHU3MDZiIiwgIlx1NmMzNCIsICJcdTY3MjgiLCAiXHU5MWQxIiwgIlx1NTcxZiJdLCAidGltZUZvcm1hdC1sb25nIjoiSDptbTpzczp6IiwgInRpbWVGb3JtYXQtc2hvcnQiOiJIOm1tIiwgInBtIjoiXHU1MzQ4XHU1ZjhjIiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyIxIFx1NjcwOCIsICIyIFx1NjcwOCIsICIzIFx1NjcwOCIsICI0IFx1NjcwOCIsICI1IFx1NjcwOCIsICI2IFx1NjcwOCIsICI3IFx1NjcwOCIsICI4IFx1NjcwOCIsICI5IFx1NjcwOCIsICIxMCBcdTY3MDgiLCAiMTEgXHU2NzA4IiwgIjEyIFx1NjcwOCJdLCAiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSdcdTVlNzQnTSdcdTY3MDgnZCdcdTY1ZTUnIiwgImRheXMtZm9ybWF0LXdpZGUiOlsiXHU2NWU1XHU2NmRjXHU2NWU1IiwgIlx1NjcwOFx1NjZkY1x1NjVlNSIsICJcdTcwNmJcdTY2ZGNcdTY1ZTUiLCAiXHU2YzM0XHU2NmRjXHU2NWU1IiwgIlx1NjcyOFx1NjZkY1x1NjVlNSIsICJcdTkxZDFcdTY2ZGNcdTY1ZTUiLCAiXHU1NzFmXHU2NmRjXHU2NWU1Il0sICJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwgImZpZWxkLXNlY29uZCI6IlNlY29uZCIsICJmaWVsZC13ZWVrIjoiV2VlayIsICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAiMTEiLCAiMTIiXSwgImZpZWxkLXllYXIiOiJZZWFyIiwgImZpZWxkLW1pbnV0ZSI6Ik1pbnV0ZSIsICJmaWVsZC1ob3VyIjoiSG91ciIsICJmaWVsZC1kYXkiOiJEYXkiLCAiZmllbGQtZGF5cGVyaW9kIjoiRGF5cGVyaW9kIiwgImZpZWxkLW1vbnRoIjoiTW9udGgiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwgImZpZWxkLWVyYSI6IkVyYSIsICJmaWVsZC16b25lIjoiWm9uZSJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9qYS9ncmVnb3JpYW5FeHRyYXMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvamEvZ3JlZ29yaWFuRXh0cmFzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzQ3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvamEvZ3JlZ29yaWFuRXh0cmFzLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkYXRlRm9ybWF0LXllYXJPbmx5IjoieXl5eVx1NWU3NCJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9rby9ncmVnb3JpYW4uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMva28vZ3JlZ29yaWFuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjI1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMva28vZ3JlZ29yaWFuLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMVx1YzZkNCIsICIyXHVjNmQ0IiwgIjNcdWM2ZDQiLCAiNFx1YzZkNCIsICI1XHVjNmQ0IiwgIjZcdWM2ZDQiLCAiN1x1YzZkNCIsICI4XHVjNmQ0IiwgIjlcdWM2ZDQiLCAiMTBcdWM2ZDQiLCAiMTFcdWM2ZDQiLCAiMTJcdWM2ZDQiXSwgImRhdGVGb3JtYXQtbG9uZyI6Inl5eXknXHViMTQ0JyBNJ1x1YzZkNCcgZCdcdWM3N2MnIiwgInRpbWVGb3JtYXQtZnVsbCI6ImEgaGgnXHVjMmRjJyBtbSdcdWJkODQnIHNzJ1x1Y2QwOCcgeiIsICJlcmFzIjpbIlx1YWUzMFx1YzZkMFx1YzgwNCIsICJcdWMxMWNcdWFlMzAiXSwgInRpbWVGb3JtYXQtbWVkaXVtIjoiYSBoaCdcdWMyZGMnIG1tJ1x1YmQ4NCciLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5LiBNTS4gZGQiLCAiYW0iOiJcdWM2MjRcdWM4MDQiLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbIjFcdWM2ZDQiLCAiMlx1YzZkNCIsICIzXHVjNmQ0IiwgIjRcdWM2ZDQiLCAiNVx1YzZkNCIsICI2XHVjNmQ0IiwgIjdcdWM2ZDQiLCAiOFx1YzZkNCIsICI5XHVjNmQ0IiwgIjEwXHVjNmQ0IiwgIjExXHVjNmQ0IiwgIjEyXHVjNmQ0Il0sICJkYXRlRm9ybWF0LWZ1bGwiOiJ5eXl5J1x1YjE0NCcgTSdcdWM2ZDQnIGQnXHVjNzdjJyBFRUVFIiwgImRheXMtZm9ybWF0LWFiYnIiOlsiXHVjNzdjIiwgIlx1YzZkNCIsICJcdWQ2NTQiLCAiXHVjMjE4IiwgIlx1YmFhOSIsICJcdWFlMDgiLCAiXHVkMWEwIl0sICJ0aW1lRm9ybWF0LWxvbmciOiJhIGhoJ1x1YzJkYycgbW0nXHViZDg0JyBzcydcdWNkMDgnIiwgInRpbWVGb3JtYXQtc2hvcnQiOiJhIGhoJ1x1YzJkYycgbW0nXHViZDg0JyIsICJkYXRlRm9ybWF0LXNob3J0IjoieXkuIE1NLiBkZCIsICJwbSI6Ilx1YzYyNFx1ZDZjNCIsICJtb250aHMtZm9ybWF0LXdpZGUiOlsiMVx1YzZkNCIsICIyXHVjNmQ0IiwgIjNcdWM2ZDQiLCAiNFx1YzZkNCIsICI1XHVjNmQ0IiwgIjZcdWM2ZDQiLCAiN1x1YzZkNCIsICI4XHVjNmQ0IiwgIjlcdWM2ZDQiLCAiMTBcdWM2ZDQiLCAiMTFcdWM2ZDQiLCAiMTJcdWM2ZDQiXSwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiXHVjNzdjIiwgIlx1YzZkNCIsICJcdWQ2NTQiLCAiXHVjMjE4IiwgIlx1YmFhOSIsICJcdWFlMDgiLCAiXHVkMWEwIl0sICJkYXlzLWZvcm1hdC13aWRlIjpbIlx1Yzc3Y1x1YzY5NFx1Yzc3YyIsICJcdWM2ZDRcdWM2OTRcdWM3N2MiLCAiXHVkNjU0XHVjNjk0XHVjNzdjIiwgIlx1YzIxOFx1YzY5NFx1Yzc3YyIsICJcdWJhYTlcdWM2OTRcdWM3N2MiLCAiXHVhZTA4XHVjNjk0XHVjNzdjIiwgIlx1ZDFhMFx1YzY5NFx1Yzc3YyJdLCAiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsICJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCAiZmllbGQtd2VlayI6IldlZWsiLCAiZmllbGQteWVhciI6IlllYXIiLCAiZmllbGQtbWludXRlIjoiTWludXRlIiwgImZpZWxkLWhvdXIiOiJIb3VyIiwgImZpZWxkLWRheSI6IkRheSIsICJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCAiZmllbGQtbW9udGgiOiJNb250aCIsICJmaWVsZC1lcmEiOiJFcmEiLCAiZmllbGQtem9uZSI6IlpvbmUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvbmwvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL25sL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZkYjQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL25sL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkIE1NTSB5eXl5IiwgImZpZWxkLXNlY29uZCI6IlNlY29uZGUiLCAidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgdiIsICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsICJGIiwgIk0iLCAiQSIsICJNIiwgIkoiLCAiSiIsICJBIiwgIlMiLCAiTyIsICJOIiwgIkQiXSwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiWiIsICJNIiwgIkQiLCAiVyIsICJEIiwgIlYiLCAiWiJdLCAiZmllbGQteWVhciI6IkphYXIiLCAiZXJhcyI6WyJ2LiBDaHIuIiwgIm4uIENoci4iXSwgImZpZWxkLW1pbnV0ZSI6Ik1pbnV1dCIsICJmaWVsZC1ob3VyIjoiVXVyIiwgImRhdGVGb3JtYXQtbG9uZyI6ImQgTU1NTSB5eXl5IiwgImZpZWxkLWRheSI6IkRhZyIsICJmaWVsZC1kYXlwZXJpb2QiOiJEYWdkZWVsIiwgImZpZWxkLW1vbnRoIjoiTWFhbmQiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6ImRkLU1NLXl5IiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW51YXJpIiwgImZlYnJ1YXJpIiwgIm1hYXJ0IiwgImFwcmlsIiwgIm1laSIsICJqdW5pIiwgImp1bGkiLCAiYXVndXN0dXMiLCAic2VwdGVtYmVyIiwgIm9rdG9iZXIiLCAibm92ZW1iZXIiLCAiZGVjZW1iZXIiXSwgImZpZWxkLWVyYSI6IlRpamRwZXJrIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyJqYW4iLCAiZmViIiwgIm1ydCIsICJhcHIiLCAibWVpIiwgImp1biIsICJqdWwiLCAiYXVnIiwgInNlcCIsICJva3QiLCAibm92IiwgImRlYyJdLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJ6b25kYWciLCAibWFhbmRhZyIsICJkaW5zZGFnIiwgIndvZW5zZGFnIiwgImRvbmRlcmRhZyIsICJ2cmlqZGFnIiwgInphdGVyZGFnIl0sICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFIGQgTU1NTSB5eXl5IiwgImRheXMtZm9ybWF0LWFiYnIiOlsiem8iLCAibWEiLCAiZGkiLCAid28iLCAiZG8iLCAidnIiLCAiemEiXSwgImZpZWxkLXdlZWtkYXkiOiJEYWcgdmFuIGRlIHdlZWsiLCAiZmllbGQtd2VlayI6IldlZWsiLCAicG0iOiJQTSIsICJhbSI6IkFNIiwgInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCAidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIiwgInRpbWVGb3JtYXQtbG9uZyI6IkhIOm1tOnNzIHoiLCAiZmllbGQtem9uZSI6IlpvbmUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvcHQtYnIvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3B0LWJyL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZkNTVhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3B0LWJyL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZmllbGQtaG91ciI6IkhvcmEiLCAiZmllbGQtZGF5cGVyaW9kIjoiUGVyXHhlZG9kbyBkbyBkaWEiLCAiZmllbGQtbWludXRlIjoiTWludXRvIiwgInRpbWVGb3JtYXQtZnVsbCI6IkhIJ2gnbW0nbWluJ3NzJ3MnIHoiLCAiZmllbGQtd2Vla2RheSI6IkRpYSBkYSBzZW1hbmEiLCAiZmllbGQtd2VlayI6IlNlbWFuYSIsICJmaWVsZC1zZWNvbmQiOiJTZWd1bmRvIiwgImRhdGVGb3JtYXQtbWVkaXVtIjoiZGQvTU0veXl5eSIsICJmaWVsZC1kYXkiOiJEaWEiLCAidGltZUZvcm1hdC1sb25nIjoiSCdoJ20nbWluJ3MncycgeiIsICJmaWVsZC1tb250aCI6Ik1ceGVhcyIsICJmaWVsZC15ZWFyIjoiQW5vIiwgImRhdGVGb3JtYXQtc2hvcnQiOiJkZC9NTS95eSIsICJmaWVsZC16b25lIjoiRnVzbyIsICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiSiIsICJGIiwgIk0iLCAiQSIsICJNIiwgIkoiLCAiSiIsICJBIiwgIlMiLCAiTyIsICJOIiwgIkQiXSwgImRhdGVGb3JtYXQtbG9uZyI6ImQnIGRlICdNTU1NJyBkZSAneXl5eSIsICJlcmFzIjpbImEuQy4iLCAiZC5DLiJdLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbImphbiIsICJmZXYiLCAibWFyIiwgImFiciIsICJtYWkiLCAianVuIiwgImp1bCIsICJhZ28iLCAic2V0IiwgIm91dCIsICJub3YiLCAiZGV6Il0sICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCAic2VnIiwgInRlciIsICJxdWEiLCAicXVpIiwgInNleCIsICJzXHhlMWIiXSwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW5laXJvIiwgImZldmVyZWlybyIsICJtYXJceGU3byIsICJhYnJpbCIsICJtYWlvIiwgImp1bmhvIiwgImp1bGhvIiwgImFnb3N0byIsICJzZXRlbWJybyIsICJvdXR1YnJvIiwgIm5vdmVtYnJvIiwgImRlemVtYnJvIl0sICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCAiUyIsICJUIiwgIlEiLCAiUSIsICJTIiwgIlMiXSwgImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsICJzZWd1bmRhLWZlaXJhIiwgInRlclx4ZTdhLWZlaXJhIiwgInF1YXJ0YS1mZWlyYSIsICJxdWludGEtZmVpcmEiLCAic2V4dGEtZmVpcmEiLCAic1x4ZTFiYWRvIl0sICJwbSI6IlBNIiwgImFtIjoiQU0iLCAidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsICJmaWVsZC1lcmEiOiJFcmEiLCAidGltZUZvcm1hdC1zaG9ydCI6IkhIOm1tIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3B0L2dyZWdvcmlhbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9wdC9ncmVnb3JpYW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5YjAwNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9wdC9ncmVnb3JpYW4uanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7Im1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLCAiZGF0ZUZvcm1hdC1sb25nIjoiZCcgZGUgJ01NTU0nIGRlICd5eXl5IiwgInRpbWVGb3JtYXQtZnVsbCI6IkhIJ0gnbW0nbSdzcydzJyB6IiwgImVyYXMiOlsiYS5DLiIsICJkLkMuIl0sICJkYXRlRm9ybWF0LW1lZGl1bSI6ImQvTU1NL3l5eXkiLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbImphbiIsICJmZXYiLCAibWFyIiwgImFiciIsICJtYWkiLCAianVuIiwgImp1bCIsICJhZ28iLCAic2V0IiwgIm91dCIsICJub3YiLCAiZGV6Il0sICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCBkJyBkZSAnTU1NTScgZGUgJ3l5eXkiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJkb20iLCAic2VnIiwgInRlciIsICJxdWEiLCAicXVpIiwgInNleCIsICJzXHhlMWIiXSwgImRhdGVGb3JtYXQtc2hvcnQiOiJkZC1NTS15eXl5IiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJqYW5laXJvIiwgImZldmVyZWlybyIsICJtYXJceGU3byIsICJhYnJpbCIsICJtYWlvIiwgImp1bmhvIiwgImp1bGhvIiwgImFnb3N0byIsICJzZXRlbWJybyIsICJvdXR1YnJvIiwgIm5vdmVtYnJvIiwgImRlemVtYnJvIl0sICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIkQiLCAiUyIsICJUIiwgIlEiLCAiUSIsICJTIiwgIlMiXSwgImRheXMtZm9ybWF0LXdpZGUiOlsiZG9taW5nbyIsICJzZWd1bmRhLWZlaXJhIiwgInRlclx4ZTdhLWZlaXJhIiwgInF1YXJ0YS1mZWlyYSIsICJxdWludGEtZmVpcmEiLCAic2V4dGEtZmVpcmEiLCAic1x4ZTFiYWRvIl0sICJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwgImZpZWxkLXNlY29uZCI6IlNlY29uZCIsICJmaWVsZC13ZWVrIjoiV2VlayIsICJwbSI6IlBNIiwgImFtIjoiQU0iLCAiZmllbGQteWVhciI6IlllYXIiLCAiZmllbGQtbWludXRlIjoiTWludXRlIiwgInRpbWVGb3JtYXQtbWVkaXVtIjoiSEg6bW06c3MiLCAiZmllbGQtaG91ciI6IkhvdXIiLCAiZmllbGQtZGF5IjoiRGF5IiwgImZpZWxkLWRheXBlcmlvZCI6IkRheXBlcmlvZCIsICJmaWVsZC1tb250aCI6Ik1vbnRoIiwgImZpZWxkLWVyYSI6IkVyYSIsICJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCAidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsICJmaWVsZC16b25lIjoiWm9uZSJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy9zdi9ncmVnb3JpYW4uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvc3YvZ3JlZ29yaWFuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjA3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvc3YvZ3JlZ29yaWFuLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJmaWVsZC13ZWVrZGF5IjoidmVja29kYWciLCAiZGF0ZUZvcm1hdC1tZWRpdW0iOiJkIE1NTSB5eXl5IiwgImZpZWxkLXNlY29uZCI6InNla3VuZCIsICJmaWVsZC13ZWVrIjoidmVja2EiLCAicG0iOiJlbSIsICJ0aW1lRm9ybWF0LWZ1bGwiOiIna2wuICdISC5tbS5zcyB6IiwgIm1vbnRocy1zdGFuZEFsb25lLW5hcnJvdyI6WyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLCAiYW0iOiJmbSIsICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlMiLCAiTSIsICJUIiwgIk8iLCAiVCIsICJGIiwgIkwiXSwgImZpZWxkLXllYXIiOiJceGU1ciIsICJlcmFzIjpbImYuS3IuIiwgImUuS3IuIl0sICJmaWVsZC1taW51dGUiOiJtaW51dCIsICJ0aW1lRm9ybWF0LW1lZGl1bSI6IkhILm1tLnNzIiwgImZpZWxkLWhvdXIiOiJ0aW1tZSIsICJkYXRlRm9ybWF0LWxvbmciOiJFRUVFIGQgTU1NIHl5eXkiLCAiZmllbGQtZGF5IjoiZGFnIiwgImZpZWxkLWRheXBlcmlvZCI6ImRhZ3NwZXJpb2QiLCAiZmllbGQtbW9udGgiOiJtXHhlNW5hZCIsICJkYXRlRm9ybWF0LXNob3J0IjoieXl5eS1NTS1kZCIsICJtb250aHMtZm9ybWF0LXdpZGUiOlsiamFudWFyaSIsICJmZWJydWFyaSIsICJtYXJzIiwgImFwcmlsIiwgIm1haiIsICJqdW5pIiwgImp1bGkiLCAiYXVndXN0aSIsICJzZXB0ZW1iZXIiLCAib2t0b2JlciIsICJub3ZlbWJlciIsICJkZWNlbWJlciJdLCAiZmllbGQtZXJhIjoiZXJhIiwgInRpbWVGb3JtYXQtc2hvcnQiOiJISC5tbSIsICJtb250aHMtZm9ybWF0LWFiYnIiOlsiamFuIiwgImZlYiIsICJtYXIiLCAiYXByIiwgIm1haiIsICJqdW4iLCAianVsIiwgImF1ZyIsICJzZXAiLCAib2t0IiwgIm5vdiIsICJkZWMiXSwgInRpbWVGb3JtYXQtbG9uZyI6IkhILm1tLnNzIHoiLCAiZGF5cy1mb3JtYXQtd2lkZSI6WyJzXHhmNm5kYWciLCAibVx4ZTVuZGFnIiwgInRpc2RhZyIsICJvbnNkYWciLCAidG9yc2RhZyIsICJmcmVkYWciLCAibFx4ZjZyZGFnIl0sICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFJ2VuIGRlbicgZCBNTU1NIHl5eXkiLCAiZmllbGQtem9uZSI6InRpZHN6b24iLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJzXHhmNiIsICJtXHhlNSIsICJ0aSIsICJvbiIsICJ0byIsICJmciIsICJsXHhmNiJdfSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgtY24vZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poLWNuL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRkMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poLWNuL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5LU0tZCIsICJmaWVsZC1zZWNvbmQiOiJcdTc5ZDJcdTk0OWYiLCAiZmllbGQtd2VlayI6Ilx1NTQ2OCIsICJ0aW1lRm9ybWF0LWZ1bGwiOiJhaGgnXHU2NWY2J21tJ1x1NTIwNidzcydcdTc5ZDInIHoiLCAiZmllbGQteWVhciI6Ilx1NWU3NCIsICJmaWVsZC1taW51dGUiOiJcdTUyMDZcdTk0OWYiLCAidGltZUZvcm1hdC1tZWRpdW0iOiJhaGg6bW06c3MiLCAiZmllbGQtaG91ciI6Ilx1NWMwZlx1NjVmNiIsICJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J1x1NWU3NCdNJ1x1NjcwOCdkJ1x1NjVlNSciLCAiZmllbGQtZGF5IjoiXHU2NWU1IiwgImZpZWxkLWRheXBlcmlvZCI6Ilx1NGUwYVx1NTM0OC9cdTRlMGJcdTUzNDgiLCAiZmllbGQtbW9udGgiOiJcdTY3MDgiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5LU0tZCIsICJmaWVsZC1lcmEiOiJcdTY1ZjZcdTY3MWYiLCAidGltZUZvcm1hdC1zaG9ydCI6ImFoOm1tIiwgInRpbWVGb3JtYXQtbG9uZyI6ImFoaCdcdTY1ZjYnbW0nXHU1MjA2J3NzJ1x1NzlkMiciLCAiZGF0ZUZvcm1hdC1mdWxsIjoieXl5eSdcdTVlNzQnTSdcdTY3MDgnZCdcdTY1ZTUnRUVFRSIsICJmaWVsZC13ZWVrZGF5IjoiXHU1NDY4XHU1OTI5IiwgImZpZWxkLXpvbmUiOiJcdTUzM2FcdTU3ZGYiLCAiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJcdTY1ZTUiLCAiXHU0ZTAwIiwgIlx1NGU4YyIsICJcdTRlMDkiLCAiXHU1NmRiIiwgIlx1NGU5NCIsICJcdTUxNmQiXSwgImVyYXMiOlsiXHU1MTZjXHU1MTQzXHU1MjRkIiwgIlx1NTE2Y1x1NTE0MyJdLCAiYW0iOiJcdTRlMGFcdTUzNDgiLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbIlx1NGUwMFx1NjcwOCIsICJcdTRlOGNcdTY3MDgiLCAiXHU0ZTA5XHU2NzA4IiwgIlx1NTZkYlx1NjcwOCIsICJcdTRlOTRcdTY3MDgiLCAiXHU1MTZkXHU2NzA4IiwgIlx1NGUwM1x1NjcwOCIsICJcdTUxNmJcdTY3MDgiLCAiXHU0ZTVkXHU2NzA4IiwgIlx1NTM0MVx1NjcwOCIsICJcdTUzNDFcdTRlMDBcdTY3MDgiLCAiXHU1MzQxXHU0ZThjXHU2NzA4Il0sICJkYXlzLWZvcm1hdC1hYmJyIjpbIlx1NTQ2OFx1NjVlNSIsICJcdTU0NjhcdTRlMDAiLCAiXHU1NDY4XHU0ZThjIiwgIlx1NTQ2OFx1NGUwOSIsICJcdTU0NjhcdTU2ZGIiLCAiXHU1NDY4XHU0ZTk0IiwgIlx1NTQ2OFx1NTE2ZCJdLCAicG0iOiJcdTRlMGJcdTUzNDgiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbIlx1NGUwMFx1NjcwOCIsICJcdTRlOGNcdTY3MDgiLCAiXHU0ZTA5XHU2NzA4IiwgIlx1NTZkYlx1NjcwOCIsICJcdTRlOTRcdTY3MDgiLCAiXHU1MTZkXHU2NzA4IiwgIlx1NGUwM1x1NjcwOCIsICJcdTUxNmJcdTY3MDgiLCAiXHU0ZTVkXHU2NzA4IiwgIlx1NTM0MVx1NjcwOCIsICJcdTUzNDFcdTRlMDBcdTY3MDgiLCAiXHU1MzQxXHU0ZThjXHU2NzA4Il0sICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMVx1NjcwOCIsICIyXHU2NzA4IiwgIjNcdTY3MDgiLCAiNFx1NjcwOCIsICI1XHU2NzA4IiwgIjZcdTY3MDgiLCAiN1x1NjcwOCIsICI4XHU2NzA4IiwgIjlcdTY3MDgiLCAiMTBcdTY3MDgiLCAiMTFcdTY3MDgiLCAiMTJcdTY3MDgiXSwgImRheXMtZm9ybWF0LXdpZGUiOlsiXHU2NjFmXHU2NzFmXHU2NWU1IiwgIlx1NjYxZlx1NjcxZlx1NGUwMCIsICJcdTY2MWZcdTY3MWZcdTRlOGMiLCAiXHU2NjFmXHU2NzFmXHU0ZTA5IiwgIlx1NjYxZlx1NjcxZlx1NTZkYiIsICJcdTY2MWZcdTY3MWZcdTRlOTQiLCAiXHU2NjFmXHU2NzFmXHU1MTZkIl19KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NhbGVuZGFyL25scy96aC1oay9ncmVnb3JpYW4uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgtaGsvZ3JlZ29yaWFuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTZhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgtaGsvZ3JlZ29yaWFuLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJ0aW1lRm9ybWF0LWZ1bGwiOiJhaGgnXHU2NjQyJ21tJ1x1NTIwNidzcydcdTc5ZDInIHoiLCAiZXJhcyI6WyJcdTg5N2ZcdTUxNDNcdTUyNGQiLCAiXHU4OTdmXHU1MTQzIl0sICJ0aW1lRm9ybWF0LW1lZGl1bSI6ImEgaDptbTpzcyIsICJkYXRlRm9ybWF0LW1lZGl1bSI6Inl5eXkvTS9kIiwgImRhdGVGb3JtYXQtZnVsbCI6Inl5eXknXHU1ZTc0J00nXHU2NzA4J2QnXHU2NWU1J0VFRUUiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJcdTkwMzFcdTY1ZTUiLCAiXHU5MDMxXHU0ZTAwIiwgIlx1OTAzMVx1NGU4YyIsICJcdTkwMzFcdTRlMDkiLCAiXHU5MDMxXHU1NmRiIiwgIlx1OTAzMVx1NGU5NCIsICJcdTkwMzFcdTUxNmQiXSwgInRpbWVGb3JtYXQtbG9uZyI6ImFoaCdcdTY2NDInbW0nXHU1MjA2J3NzJ1x1NzlkMiciLCAidGltZUZvcm1hdC1zaG9ydCI6ImEgaDptbSIsICJkYXRlRm9ybWF0LXNob3J0IjoieXl5eS9NL2QiLCAiZGF0ZUZvcm1hdC1sb25nIjoieXl5eSdcdTVlNzQnTSdcdTY3MDgnZCdcdTY1ZTUnIiwgImRheXMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiXHU2NWU1IiwgIlx1NGUwMCIsICJcdTRlOGMiLCAiXHU0ZTA5IiwgIlx1NTZkYiIsICJcdTRlOTQiLCAiXHU1MTZkIl0sICJhbSI6Ilx1NGUwYVx1NTM0OCIsICJtb250aHMtZm9ybWF0LWFiYnIiOlsiXHU0ZTAwXHU2NzA4IiwgIlx1NGU4Y1x1NjcwOCIsICJcdTRlMDlcdTY3MDgiLCAiXHU1NmRiXHU2NzA4IiwgIlx1NGU5NFx1NjcwOCIsICJcdTUxNmRcdTY3MDgiLCAiXHU0ZTAzXHU2NzA4IiwgIlx1NTE2Ylx1NjcwOCIsICJcdTRlNWRcdTY3MDgiLCAiXHU1MzQxXHU2NzA4IiwgIlx1NTM0MVx1NGUwMFx1NjcwOCIsICJcdTUzNDFcdTRlOGNcdTY3MDgiXSwgInBtIjoiXHU0ZTBiXHU1MzQ4IiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJcdTRlMDBcdTY3MDgiLCAiXHU0ZThjXHU2NzA4IiwgIlx1NGUwOVx1NjcwOCIsICJcdTU2ZGJcdTY3MDgiLCAiXHU0ZTk0XHU2NzA4IiwgIlx1NTE2ZFx1NjcwOCIsICJcdTRlMDNcdTY3MDgiLCAiXHU1MTZiXHU2NzA4IiwgIlx1NGU1ZFx1NjcwOCIsICJcdTUzNDFcdTY3MDgiLCAiXHU1MzQxXHU0ZTAwXHU2NzA4IiwgIlx1NTM0MVx1NGU4Y1x1NjcwOCJdLCAibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjFcdTY3MDgiLCAiMlx1NjcwOCIsICIzXHU2NzA4IiwgIjRcdTY3MDgiLCAiNVx1NjcwOCIsICI2XHU2NzA4IiwgIjdcdTY3MDgiLCAiOFx1NjcwOCIsICI5XHU2NzA4IiwgIjEwXHU2NzA4IiwgIjExXHU2NzA4IiwgIjEyXHU2NzA4Il0sICJkYXlzLWZvcm1hdC13aWRlIjpbIlx1NjYxZlx1NjcxZlx1NjVlNSIsICJcdTY2MWZcdTY3MWZcdTRlMDAiLCAiXHU2NjFmXHU2NzFmXHU0ZThjIiwgIlx1NjYxZlx1NjcxZlx1NGUwOSIsICJcdTY2MWZcdTY3MWZcdTU2ZGIiLCAiXHU2NjFmXHU2NzFmXHU0ZTk0IiwgIlx1NjYxZlx1NjcxZlx1NTE2ZCJdLCAiZmllbGQtd2Vla2RheSI6IkRheSBvZiB0aGUgV2VlayIsICJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCAiZmllbGQtd2VlayI6IldlZWsiLCAiZmllbGQteWVhciI6IlllYXIiLCAiZmllbGQtbWludXRlIjoiTWludXRlIiwgImZpZWxkLWhvdXIiOiJIb3VyIiwgImZpZWxkLWRheSI6IkRheSIsICJmaWVsZC1kYXlwZXJpb2QiOiJEYXlwZXJpb2QiLCAiZmllbGQtbW9udGgiOiJNb250aCIsICJmaWVsZC1lcmEiOiJFcmEiLCAiZmllbGQtem9uZSI6IlpvbmUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgtdHcvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poLXR3L2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDgwMTFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poLXR3L2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGF0ZUZvcm1hdC1tZWRpdW0iOiJ5eXl5J1x1NWU3NCdNJ1x1NjcwOCdkJ1x1NjVlNSciLCAiZmllbGQtc2Vjb25kIjoiXHU3OWQyIiwgImZpZWxkLXdlZWsiOiJcdTkwMzEiLCAidGltZUZvcm1hdC1mdWxsIjoiYWhoJ1x1NjY0MidtbSdcdTUyMDYnc3MnXHU3OWQyJyB6IiwgImVyYXMiOlsiXHU4OTdmXHU1MTQzXHU1MjRkIiwgIlx1ODk3Zlx1NTE0MyJdLCAiZmllbGQteWVhciI6Ilx1NWU3NCIsICJmaWVsZC1taW51dGUiOiJcdTUyMDZcdTk0MTgiLCAidGltZUZvcm1hdC1tZWRpdW0iOiJhaGg6bW06c3MiLCAiZmllbGQtaG91ciI6Ilx1NWMwZlx1NjY0MiIsICJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5J1x1NWU3NCdNJ1x1NjcwOCdkJ1x1NjVlNSciLCAiZmllbGQtZGF5IjoiXHU2NTc0XHU2NWU1IiwgImZpZWxkLWRheXBlcmlvZCI6Ilx1NjVlNVx1OTU5MyIsICJmaWVsZC1tb250aCI6Ilx1NjcwOCIsICJkYXRlRm9ybWF0LXNob3J0IjoieXknXHU1ZTc0J00nXHU2NzA4J2QnXHU2NWU1JyIsICJmaWVsZC1lcmEiOiJcdTVlNzRcdTRlZTMiLCAidGltZUZvcm1hdC1zaG9ydCI6ImFoOm1tIiwgIm1vbnRocy1mb3JtYXQtYWJiciI6WyIxXHU2NzA4IiwgIjJcdTY3MDgiLCAiM1x1NjcwOCIsICI0XHU2NzA4IiwgIjVcdTY3MDgiLCAiNlx1NjcwOCIsICI3XHU2NzA4IiwgIjhcdTY3MDgiLCAiOVx1NjcwOCIsICIxMFx1NjcwOCIsICIxMVx1NjcwOCIsICIxMlx1NjcwOCJdLCAidGltZUZvcm1hdC1sb25nIjoiYWhoJ1x1NjY0MidtbSdcdTUyMDYnc3MnXHU3OWQyJyIsICJmaWVsZC13ZWVrZGF5IjoiXHU5MDMxXHU1OTI5IiwgImRhdGVGb3JtYXQtZnVsbCI6Inl5eXknXHU1ZTc0J00nXHU2NzA4J2QnXHU2NWU1J0VFRUUiLCAiZmllbGQtem9uZSI6Ilx1NTM0MFx1NTdkZiIsICJkYXlzLXN0YW5kQWxvbmUtbmFycm93IjpbIlx1NjVlNSIsICJcdTRlMDAiLCAiXHU0ZThjIiwgIlx1NGUwOSIsICJcdTU2ZGIiLCAiXHU0ZTk0IiwgIlx1NTE2ZCJdLCAiYW0iOiJcdTRlMGFcdTUzNDgiLCAiZGF5cy1mb3JtYXQtYWJiciI6WyJcdTU0NjhcdTY1ZTUiLCAiXHU1NDY4XHU0ZTAwIiwgIlx1NTQ2OFx1NGU4YyIsICJcdTU0NjhcdTRlMDkiLCAiXHU1NDY4XHU1NmRiIiwgIlx1NTQ2OFx1NGU5NCIsICJcdTU0NjhcdTUxNmQiXSwgInBtIjoiXHU0ZTBiXHU1MzQ4IiwgIm1vbnRocy1mb3JtYXQtd2lkZSI6WyJcdTRlMDBcdTY3MDgiLCAiXHU0ZThjXHU2NzA4IiwgIlx1NGUwOVx1NjcwOCIsICJcdTU2ZGJcdTY3MDgiLCAiXHU0ZTk0XHU2NzA4IiwgIlx1NTE2ZFx1NjcwOCIsICJcdTRlMDNcdTY3MDgiLCAiXHU1MTZiXHU2NzA4IiwgIlx1NGU1ZFx1NjcwOCIsICJcdTUzNDFcdTY3MDgiLCAiXHU1MzQxXHU0ZTAwXHU2NzA4IiwgIlx1NTM0MVx1NGU4Y1x1NjcwOCJdLCAibW9udGhzLXN0YW5kQWxvbmUtbmFycm93IjpbIjFcdTY3MDgiLCAiMlx1NjcwOCIsICIzXHU2NzA4IiwgIjRcdTY3MDgiLCAiNVx1NjcwOCIsICI2XHU2NzA4IiwgIjdcdTY3MDgiLCAiOFx1NjcwOCIsICI5XHU2NzA4IiwgIjEwXHU2NzA4IiwgIjExXHU2NzA4IiwgIjEyXHU2NzA4Il0sICJkYXlzLWZvcm1hdC13aWRlIjpbIlx1NjYxZlx1NjcxZlx1NjVlNSIsICJcdTY2MWZcdTY3MWZcdTRlMDAiLCAiXHU2NjFmXHU2NzFmXHU0ZThjIiwgIlx1NjYxZlx1NjcxZlx1NGUwOSIsICJcdTY2MWZcdTY3MWZcdTU2ZGIiLCAiXHU2NjFmXHU2NzFmXHU0ZTk0IiwgIlx1NjYxZlx1NjcxZlx1NTE2ZCJdfSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgvZ3JlZ29yaWFuLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poL2dyZWdvcmlhbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E2NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poL2dyZWdvcmlhbi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGF5cy1zdGFuZEFsb25lLW5hcnJvdyI6WyJcdTY1ZTUiLCAiXHU0ZTAwIiwgIlx1NGU4YyIsICJcdTRlMDkiLCAiXHU1NmRiIiwgIlx1NGU5NCIsICJcdTUxNmQiXSwgImVyYXMiOlsiXHU1MTZjXHU1MTQzXHU1MjRkIiwgIlx1NTE2Y1x1NTE0MyJdLCAiYW0iOiJcdTRlMGFcdTUzNDgiLCAibW9udGhzLWZvcm1hdC1hYmJyIjpbIlx1NGUwMFx1NjcwOCIsICJcdTRlOGNcdTY3MDgiLCAiXHU0ZTA5XHU2NzA4IiwgIlx1NTZkYlx1NjcwOCIsICJcdTRlOTRcdTY3MDgiLCAiXHU1MTZkXHU2NzA4IiwgIlx1NGUwM1x1NjcwOCIsICJcdTUxNmJcdTY3MDgiLCAiXHU0ZTVkXHU2NzA4IiwgIlx1NTM0MVx1NjcwOCIsICJcdTUzNDFcdTRlMDBcdTY3MDgiLCAiXHU1MzQxXHU0ZThjXHU2NzA4Il0sICJkYXlzLWZvcm1hdC1hYmJyIjpbIlx1NTQ2OFx1NjVlNSIsICJcdTU0NjhcdTRlMDAiLCAiXHU1NDY4XHU0ZThjIiwgIlx1NTQ2OFx1NGUwOSIsICJcdTU0NjhcdTU2ZGIiLCAiXHU1NDY4XHU0ZTk0IiwgIlx1NTQ2OFx1NTE2ZCJdLCAicG0iOiJcdTRlMGJcdTUzNDgiLCAibW9udGhzLWZvcm1hdC13aWRlIjpbIlx1NGUwMFx1NjcwOCIsICJcdTRlOGNcdTY3MDgiLCAiXHU0ZTA5XHU2NzA4IiwgIlx1NTZkYlx1NjcwOCIsICJcdTRlOTRcdTY3MDgiLCAiXHU1MTZkXHU2NzA4IiwgIlx1NGUwM1x1NjcwOCIsICJcdTUxNmJcdTY3MDgiLCAiXHU0ZTVkXHU2NzA4IiwgIlx1NTM0MVx1NjcwOCIsICJcdTUzNDFcdTRlMDBcdTY3MDgiLCAiXHU1MzQxXHU0ZThjXHU2NzA4Il0sICJtb250aHMtc3RhbmRBbG9uZS1uYXJyb3ciOlsiMVx1NjcwOCIsICIyXHU2NzA4IiwgIjNcdTY3MDgiLCAiNFx1NjcwOCIsICI1XHU2NzA4IiwgIjZcdTY3MDgiLCAiN1x1NjcwOCIsICI4XHU2NzA4IiwgIjlcdTY3MDgiLCAiMTBcdTY3MDgiLCAiMTFcdTY3MDgiLCAiMTJcdTY3MDgiXSwgImRheXMtZm9ybWF0LXdpZGUiOlsiXHU2NjFmXHU2NzFmXHU2NWU1IiwgIlx1NjYxZlx1NjcxZlx1NGUwMCIsICJcdTY2MWZcdTY3MWZcdTRlOGMiLCAiXHU2NjFmXHU2NzFmXHU0ZTA5IiwgIlx1NjYxZlx1NjcxZlx1NTZkYiIsICJcdTY2MWZcdTY3MWZcdTRlOTQiLCAiXHU2NjFmXHU2NzFmXHU1MTZkIl0sICJmaWVsZC13ZWVrZGF5IjoiRGF5IG9mIHRoZSBXZWVrIiwgImRhdGVGb3JtYXQtbWVkaXVtIjoieXl5eSBNTU0gZCIsICJmaWVsZC1zZWNvbmQiOiJTZWNvbmQiLCAiZmllbGQtd2VlayI6IldlZWsiLCAidGltZUZvcm1hdC1mdWxsIjoiSEg6bW06c3MgeiIsICJmaWVsZC15ZWFyIjoiWWVhciIsICJmaWVsZC1taW51dGUiOiJNaW51dGUiLCAidGltZUZvcm1hdC1tZWRpdW0iOiJISDptbTpzcyIsICJmaWVsZC1ob3VyIjoiSG91ciIsICJkYXRlRm9ybWF0LWxvbmciOiJ5eXl5IE1NTU0gZCIsICJmaWVsZC1kYXkiOiJEYXkiLCAiZmllbGQtZGF5cGVyaW9kIjoiRGF5cGVyaW9kIiwgImZpZWxkLW1vbnRoIjoiTW9udGgiLCAiZGF0ZUZvcm1hdC1zaG9ydCI6Inl5L01NL2RkIiwgImZpZWxkLWVyYSI6IkVyYSIsICJ0aW1lRm9ybWF0LXNob3J0IjoiSEg6bW0iLCAidGltZUZvcm1hdC1sb25nIjoiSEg6bW06c3MgeiIsICJkYXRlRm9ybWF0LWZ1bGwiOiJFRUVFLCB5eXl5IE1NTU0gZGQiLCAiZmllbGQtem9uZSI6IlpvbmUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jYWxlbmRhci9ubHMvemgvZ3JlZ29yaWFuRXh0cmFzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poL2dyZWdvcmlhbkV4dHJhcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhmZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY2FsZW5kYXIvbmxzL3poL2dyZWdvcmlhbkV4dHJhcy5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGF0ZUZvcm1hdC15ZWFyT25seSI6Inl5eXknXHU1ZTc0JyJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NvbW1vbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2NvbW1vbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIwYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY29tbW9uLmpzCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jb21tb24iKTsKK2Rvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24gPSBmdW5jdGlvbiAocGFja2FnZU5hbWUsIGJ1bmRsZU5hbWUsIGxvY2FsZSkgeworCWRvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworCWxvY2FsZSA9IGRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUobG9jYWxlKTsKKwl2YXIgZWxlbWVudHMgPSBsb2NhbGUuc3BsaXQoIi0iKTsKKwl2YXIgbW9kdWxlID0gW3BhY2thZ2VOYW1lLCAibmxzIiwgYnVuZGxlTmFtZV0uam9pbigiLiIpOworCXZhciBidW5kbGUgPSBkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShtb2R1bGUsIHRydWUpOworCXZhciBsb2NhbGl6YXRpb247CisJZm9yICh2YXIgaSA9IGVsZW1lbnRzLmxlbmd0aDsgaSA+IDA7IGktLSkgeworCQl2YXIgbG9jID0gZWxlbWVudHMuc2xpY2UoMCwgaSkuam9pbigiXyIpOworCQlpZiAoYnVuZGxlW2xvY10pIHsKKwkJCWxvY2FsaXphdGlvbiA9IGJ1bmRsZVtsb2NdOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFsb2NhbGl6YXRpb24pIHsKKwkJbG9jYWxpemF0aW9uID0gYnVuZGxlLlJPT1Q7CisJfQorCWlmIChsb2NhbGl6YXRpb24pIHsKKwkJdmFyIGNsYXp6ID0gZnVuY3Rpb24gKCkgeworCQl9OworCQljbGF6ei5wcm90b3R5cGUgPSBsb2NhbGl6YXRpb247CisJCXJldHVybiBuZXcgY2xhenooKTsKKwl9CisJZG9qby5yYWlzZSgiQnVuZGxlIG5vdCBmb3VuZDogIiArIGJ1bmRsZU5hbWUgKyAiIGluICIgKyBwYWNrYWdlTmFtZSArICIgLCBsb2NhbGU9IiArIGxvY2FsZSk7Cit9OworZG9qby5pMThuLmlzTFRSID0gZnVuY3Rpb24gKGxvY2FsZSkgeworCXZhciBsYW5nID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpLnNwbGl0KCItIilbMF07CisJdmFyIFJUTCA9IHthcjp0cnVlLCBmYTp0cnVlLCBoZTp0cnVlLCB1cjp0cnVlLCB5aTp0cnVlfTsKKwlyZXR1cm4gIVJUTFtsYW5nXTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NmNlNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5LmpzCkBAIC0wLDAgKzEsMTM4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY3VycmVuY3kiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmkxOG4uY3VycmVuY3kiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5yZWdleHAiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pMThuLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmkxOG4ubnVtYmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8uaTE4bi5jdXJyZW5jeS5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgZmxhZ3MsIGxvY2FsZSkgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCXZhciBmb3JtYXREYXRhID0gZG9qby5pMThuLmN1cnJlbmN5Ll9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSwgaXNvLCBsb2NhbGUpOworCWlmICh0eXBlb2YgZmxhZ3MucGxhY2VzID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnBsYWNlcyA9IGZvcm1hdERhdGEucGxhY2VzOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlcyA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZXMgPSAyOworCX0KKwlmbGFncy5zaWduZWQgPSBmYWxzZTsKKwl2YXIgcmVzdWx0ID0gZG9qby5pMThuLm51bWJlci5mb3JtYXQodmFsdWUsIGZsYWdzLCBsb2NhbGUpOworCXZhciBzeW0gPSBmb3JtYXREYXRhLnN5bWJvbDsKKwlpZiAoZm9ybWF0RGF0YS5hZGpTcGFjZSA9PSAic3ltYm9sIikgeworCQlpZiAoZm9ybWF0RGF0YS5wbGFjZW1lbnQgPT0gImFmdGVyIikgeworCQkJc3ltID0gIiAiICsgc3ltOworCQl9IGVsc2UgeworCQkJc3ltID0gc3ltICsgIiAiOworCQl9CisJfQorCWlmICh2YWx1ZSA8IDApIHsKKwkJaWYgKGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYmVmb3JlIikgeworCQkJc3ltID0gIi0iICsgc3ltOworCQl9IGVsc2UgeworCQkJaWYgKGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYWZ0ZXIiKSB7CisJCQkJc3ltID0gc3ltICsgIi0iOworCQkJfQorCQl9CisJfQorCXZhciBzcGMgPSAoZm9ybWF0RGF0YS5hZGpTcGFjZSA9PSAibnVtYmVyIikgPyAiICIgOiAiIjsKKwlpZiAoZm9ybWF0RGF0YS5wbGFjZW1lbnQgPT0gImFmdGVyIikgeworCQlyZXN1bHQgPSByZXN1bHQgKyBzcGMgKyBzeW07CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gc3ltICsgc3BjICsgcmVzdWx0OworCX0KKwlpZiAodmFsdWUgPCAwKSB7CisJCWlmIChmb3JtYXREYXRhLnNpZ25QbGFjZW1lbnQgPT0gImFyb3VuZCIpIHsKKwkJCXJlc3VsdCA9ICIoIiArIHJlc3VsdCArICIpIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChmb3JtYXREYXRhLnNpZ25QbGFjZW1lbnQgPT0gImVuZCIpIHsKKwkJCQlyZXN1bHQgPSByZXN1bHQgKyAiLSI7CisJCQl9IGVsc2UgeworCQkJCWlmICghZm9ybWF0RGF0YS5zaWduUGxhY2VtZW50IHx8IGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYmVnaW4iKSB7CisJCQkJCXJlc3VsdCA9ICItIiArIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK307Citkb2pvLmkxOG4uY3VycmVuY3kucGFyc2UgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgbG9jYWxlLCBmbGFncykgeworCWlmICh0eXBlb2YgZmxhZ3MudmFsaWRhdGUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MudmFsaWRhdGUgPSB0cnVlOworCX0KKwlpZiAoZmxhZ3MudmFsaWRhdGUgJiYgIWRvam8uaTE4bi5udW1iZXIuaXNDdXJyZW5jeSh2YWx1ZSwgaXNvLCBsb2NhbGUsIGZsYWdzKSkgeworCQlyZXR1cm4gTnVtYmVyLk5hTjsKKwl9CisJdmFyIHNpZ24gPSAodmFsdWUuaW5kZXhPZigiLSIpICE9IC0xKTsKKwl2YXIgYWJzID0gYWJzLnJlcGxhY2UoL1wtLywgIiIpOworCXZhciBmb3JtYXREYXRhID0gZG9qby5pMThuLmN1cnJlbmN5Ll9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSwgaXNvLCBsb2NhbGUpOworCWFicyA9IGFicy5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcIiArIGZvcm1hdERhdGEuc3ltYm9sKSwgIiIpOworCXZhciBudW1iZXIgPSBkb2pvLmkxOG4ubnVtYmVyLnBhcnNlKGFicywgbG9jYWxlLCBmbGFncyk7CisJaWYgKHNpZ24pIHsKKwkJbnVtYmVyID0gbnVtYmVyICogLTE7CisJfQorCXJldHVybiBudW1iZXI7Cit9OworZG9qby5pMThuLmN1cnJlbmN5LmlzQ3VycmVuY3kgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgbG9jYWxlLCBmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCXZhciBudW1iZXJGb3JtYXREYXRhID0gZG9qby5pMThuLm51bWJlci5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGRvam8uaTE4bi5udW1iZXIuRk9STUFUX1RBQkxFLCBsb2NhbGUpOworCWlmICh0eXBlb2YgZmxhZ3Muc2VwYXJhdG9yID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnNlcGFyYXRvciA9IG51bWJlckZvcm1hdERhdGFbMF07CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5KGZsYWdzLnNlcGFyYXRvcikgJiYgZmxhZ3Muc2VwYXJhdG9yLmxlbmd0aCA9PSAwKSB7CisJCQlmbGFncy5zZXBhcmF0b3IgPSBbbnVtYmVyRm9ybWF0RGF0YVswXSwgIiJdOworCQl9CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZGVjaW1hbCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5kZWNpbWFsID0gbnVtYmVyRm9ybWF0RGF0YVsyXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MuZ3JvdXBTaXplID0gbnVtYmVyRm9ybWF0RGF0YVszXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUyID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmdyb3VwU2l6ZTIgPSBudW1iZXJGb3JtYXREYXRhWzRdOworCX0KKwl2YXIgZm9ybWF0RGF0YSA9IGRvam8uaTE4bi5jdXJyZW5jeS5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGRvam8uaTE4bi5jdXJyZW5jeS5GT1JNQVRfVEFCTEUsIGlzbywgbG9jYWxlKTsKKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlcyA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZXMgPSBmb3JtYXREYXRhLnBsYWNlczsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5wbGFjZXMgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MucGxhY2VzID0gMjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5zeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc3ltYm9sID0gZm9ybWF0RGF0YS5zeW1ib2w7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5KGZsYWdzLnN5bWJvbCkgJiYgZmxhZ3Muc3ltYm9sLmxlbmd0aCA9PSAwKSB7CisJCQlmbGFncy5zeW1ib2wgPSBbZm9ybWF0RGF0YS5zeW1ib2wsICIiXTsKKwkJfQorCX0KKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlbWVudCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZW1lbnQgPSBmb3JtYXREYXRhLnBsYWNlbWVudDsKKwl9CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC5jdXJyZW5jeShmbGFncykgKyAiJCIpOworCXJldHVybiByZS50ZXN0KHZhbHVlKTsKK307Citkb2pvLmkxOG4uY3VycmVuY3kuX21hcFRvTG9jYWxpemVkRm9ybWF0RGF0YSA9IGZ1bmN0aW9uICh0YWJsZSwgaXNvLCBsb2NhbGUpIHsKKwl2YXIgZm9ybWF0RGF0YSA9IGRvam8uaTE4bi5jdXJyZW5jeS5GT1JNQVRfVEFCTEVbaXNvXTsKKwlpZiAoIWRvam8ubGFuZy5pc0FycmF5KGZvcm1hdERhdGEpKSB7CisJCXJldHVybiBmb3JtYXREYXRhOworCX0KKwlyZXR1cm4gZG9qby5pMThuLm51bWJlci5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGZvcm1hdERhdGFbMF0sIGxvY2FsZSk7Cit9OworKGZ1bmN0aW9uICgpIHsKKwl2YXIgYXJhYmljID0ge3N5bWJvbDoiXHUwNjJjIiwgcGxhY2VtZW50OiJhZnRlciIsIGh0bWxTeW1ib2w6Ij8ifTsKKwl2YXIgZXVybyA9IHtzeW1ib2w6Ilx1MjBhYyIsIHBsYWNlbWVudDoiYmVmb3JlIiwgYWRqU3BhY2U6InN5bWJvbCIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9OworCXZhciBldXJvQWZ0ZXIgPSB7c3ltYm9sOiJcdTIwYWMiLCBwbGFjZW1lbnQ6ImFmdGVyIiwgaHRtbFN5bWJvbDoiJmV1cm87In07CisJZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSA9IHtBRUQ6e3N5bWJvbDoiXHUwNjJjIiwgcGxhY2VtZW50OiJhZnRlciJ9LCBBUlM6e3N5bWJvbDoiJCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIEFUUzp7c3ltYm9sOiJcdTIwYWMiLCBhZGpTcGFjZToibnVtYmVyIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBodG1sU3ltYm9sOiImZXVybzsifSwgQVVEOntzeW1ib2w6IiQifSwgQk9COntzeW1ib2w6IiRiIn0sIEJSTDp7c3ltYm9sOiJSJCIsIGFkalNwYWNlOiJzeW1ib2wifSwgQkVGOmV1cm9BZnRlciwgQkhEOmFyYWJpYywgQ0FEOlt7IioiOntzeW1ib2w6IiQifSwgImZyLWNhIjp7c3ltYm9sOiIkIiwgcGxhY2VtZW50OiJhZnRlciIsIHNpZ25QbGFjZW1lbnQ6ImFyb3VuZCJ9fV0sIENIRjp7c3ltYm9sOiJDSEYiLCBhZGpTcGFjZToic3ltYm9sIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgQ0xQOntzeW1ib2w6IiQifSwgQ09QOntzeW1ib2w6IiQiLCBzaWduUGxhY2VtZW50OiJhcm91bmQifSwgQ05ZOntzeW1ib2w6Ilx4YTUiLCBodG1sU3ltYm9sOiImeWVuOyJ9LCBDUkM6e3N5bWJvbDoiXHUyMGExIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBodG1sU3ltYm9sOiI/In0sIENaSzp7c3ltYm9sOiJLYyIsIGFkalNwYWNlOiJzeW1ib2wiLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBERU06ZXVyb0FmdGVyLCBES0s6e3N5bWJvbDoia3IuIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIERPUDp7c3ltYm9sOiIkIn0sIERaRDphcmFiaWMsIEVDUzp7c3ltYm9sOiIkIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgRUdQOmFyYWJpYywgRVNQOmV1cm9BZnRlciwgRVVSOmV1cm8sIEZJTTpldXJvQWZ0ZXIsIEZSRjpldXJvQWZ0ZXIsIEdCUDp7c3ltYm9sOiJceGEzIiwgaHRtbFN5bWJvbDoiJnBvdW5kOyJ9LCBHUkQ6e3N5bWJvbDoiXHUyMGFjIiwgc2lnblBsYWNlbWVudDoiZW5kIiwgaHRtbFN5bWJvbDoiJmV1cm87In0sIEdUUTp7c3ltYm9sOiJRIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgSEtEOntzeW1ib2w6IkhLJCJ9LCBITkw6e3N5bWJvbDoiTC4iLCBzaWduUGxhY2VtZW50OiJlbmQifSwgSFVGOntzeW1ib2w6IkZ0IiwgcGxhY2VtZW50OiJhZnRlciIsIGFkalNwYWNlOiJzeW1ib2wifSwgSUVQOntzeW1ib2w6Ilx1MjBhYyIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9LCBJTFM6e3N5bWJvbDoiXHUwNWU5XCJcdTA1ZDciLCBwbGFjZW1lbnQ6ImFmdGVyIiwgaHRtbFN5bWJvbDoiPyJ9LCBJTlI6e3N5bWJvbDoiUnMuIn0sIElUTDp7c3ltYm9sOiJcdTIwYWMiLCBzaWduUGxhY2VtZW50OiJhZnRlciIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9LCBKT0Q6YXJhYmljLCBKUFk6e3N5bWJvbDoiXHhhNSIsIHBsYWNlczowLCBodG1sU3ltYm9sOiImeWVuOyJ9LCBLUlc6e3N5bWJvbDoiXHUyMGE5IiwgcGxhY2VzOjAsIGh0bWxTeW1ib2w6Ij8ifSwgS1dEOmFyYWJpYywgTEJQOmFyYWJpYywgTFVGOmV1cm9BZnRlciwgTUFEOmFyYWJpYywgTVhOOntzeW1ib2w6IiQiLCBzaWduUGxhY2VtZW50OiJhcm91bmQifSwgTklPOntzeW1ib2w6IkMkIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIE5MRzp7c3ltYm9sOiJcdTIwYWMiLCBzaWduUGxhY2VtZW50OiJlbmQiLCBodG1sU3ltYm9sOiImZXVybzsifSwgTk9LOntzeW1ib2w6ImtyIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIE5aRDp7c3ltYm9sOiIkIn0sIE9NUjphcmFiaWMsIFBBQjp7c3ltYm9sOiJCLyIsIGFkalNwYWNlOiJzeW1ib2wiLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBQRU46e3N5bWJvbDoiUy8iLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBQTE46e3N5bWJvbDoieiIsIHBsYWNlbWVudDoiYWZ0ZXIifSwgUFRFOmV1cm9BZnRlciwgUFlHOntzeW1ib2w6IkdzLiIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIFFBUjphcmFiaWMsIFJVUjp7c3ltYm9sOiJydWIuIiwgcGxhY2VtZW50OiJhZnRlciJ9LCBTQVI6YXJhYmljLCBTRUs6e3N5bWJvbDoia3IiLCBwbGFjZW1lbnQ6ImFmdGVyIiwgYWRqU3BhY2U6InN5bWJvbCJ9LCBTR0Q6e3N5bWJvbDoiJCJ9LCBTVkM6e3N5bWJvbDoiXHUyMGExIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBhZGpTcGFjZToic3ltYm9sIn0sIFNZUDphcmFiaWMsIFRORDphcmFiaWMsIFRSTDp7c3ltYm9sOiJUTCIsIHBsYWNlbWVudDoiYWZ0ZXIifSwgVFdEOntzeW1ib2w6Ik5UJCJ9LCBVU0Q6e3N5bWJvbDoiJCJ9LCBVWVU6e3N5bWJvbDoiJFUiLCBzaWducGxhY2VtZW50OiJhZnRlciIsIGFkalNwYWNlOiJzeW1ib2wifSwgVkVCOntzeW1ib2w6IkJzIiwgc2lnbnBsYWNlbWVudDoiYWZ0ZXIiLCBhZGpTcGFjZToic3ltYm9sIn0sIFlFUjphcmFiaWMsIFpBUjp7c3ltYm9sOiJSIiwgc2lnblBsYWNlbWVudDoiYXJvdW5kIn19OworfSkoKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvY29tbW9uLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvY29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjllZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9jb21tb24uanMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5jdXJyZW5jeS5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmkxOG4uY3VycmVuY3kiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5yZWdleHAiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pMThuLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmkxOG4ubnVtYmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8uaTE4bi5jdXJyZW5jeS5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgZmxhZ3MsIGxvY2FsZSkgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCXZhciBmb3JtYXREYXRhID0gZG9qby5pMThuLmN1cnJlbmN5Ll9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSwgaXNvLCBsb2NhbGUpOworCWlmICh0eXBlb2YgZmxhZ3MucGxhY2VzID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnBsYWNlcyA9IGZvcm1hdERhdGEucGxhY2VzOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlcyA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZXMgPSAyOworCX0KKwlmbGFncy5zaWduZWQgPSBmYWxzZTsKKwl2YXIgcmVzdWx0ID0gZG9qby5pMThuLm51bWJlci5mb3JtYXQodmFsdWUsIGZsYWdzLCBsb2NhbGUpOworCXZhciBzeW0gPSBmb3JtYXREYXRhLnN5bWJvbDsKKwlpZiAoZm9ybWF0RGF0YS5hZGpTcGFjZSA9PSAic3ltYm9sIikgeworCQlpZiAoZm9ybWF0RGF0YS5wbGFjZW1lbnQgPT0gImFmdGVyIikgeworCQkJc3ltID0gIiAiICsgc3ltOworCQl9IGVsc2UgeworCQkJc3ltID0gc3ltICsgIiAiOworCQl9CisJfQorCWlmICh2YWx1ZSA8IDApIHsKKwkJaWYgKGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYmVmb3JlIikgeworCQkJc3ltID0gIi0iICsgc3ltOworCQl9IGVsc2UgeworCQkJaWYgKGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYWZ0ZXIiKSB7CisJCQkJc3ltID0gc3ltICsgIi0iOworCQkJfQorCQl9CisJfQorCXZhciBzcGMgPSAoZm9ybWF0RGF0YS5hZGpTcGFjZSA9PSAibnVtYmVyIikgPyAiICIgOiAiIjsKKwlpZiAoZm9ybWF0RGF0YS5wbGFjZW1lbnQgPT0gImFmdGVyIikgeworCQlyZXN1bHQgPSByZXN1bHQgKyBzcGMgKyBzeW07CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gc3ltICsgc3BjICsgcmVzdWx0OworCX0KKwlpZiAodmFsdWUgPCAwKSB7CisJCWlmIChmb3JtYXREYXRhLnNpZ25QbGFjZW1lbnQgPT0gImFyb3VuZCIpIHsKKwkJCXJlc3VsdCA9ICIoIiArIHJlc3VsdCArICIpIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChmb3JtYXREYXRhLnNpZ25QbGFjZW1lbnQgPT0gImVuZCIpIHsKKwkJCQlyZXN1bHQgPSByZXN1bHQgKyAiLSI7CisJCQl9IGVsc2UgeworCQkJCWlmICghZm9ybWF0RGF0YS5zaWduUGxhY2VtZW50IHx8IGZvcm1hdERhdGEuc2lnblBsYWNlbWVudCA9PSAiYmVnaW4iKSB7CisJCQkJCXJlc3VsdCA9ICItIiArIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK307Citkb2pvLmkxOG4uY3VycmVuY3kucGFyc2UgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgbG9jYWxlLCBmbGFncykgeworCWlmICh0eXBlb2YgZmxhZ3MudmFsaWRhdGUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MudmFsaWRhdGUgPSB0cnVlOworCX0KKwlpZiAoZmxhZ3MudmFsaWRhdGUgJiYgIWRvam8uaTE4bi5udW1iZXIuaXNDdXJyZW5jeSh2YWx1ZSwgaXNvLCBsb2NhbGUsIGZsYWdzKSkgeworCQlyZXR1cm4gTnVtYmVyLk5hTjsKKwl9CisJdmFyIHNpZ24gPSAodmFsdWUuaW5kZXhPZigiLSIpICE9IC0xKTsKKwl2YXIgYWJzID0gYWJzLnJlcGxhY2UoL1wtLywgIiIpOworCXZhciBmb3JtYXREYXRhID0gZG9qby5pMThuLmN1cnJlbmN5Ll9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSwgaXNvLCBsb2NhbGUpOworCWFicyA9IGFicy5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcIiArIGZvcm1hdERhdGEuc3ltYm9sKSwgIiIpOworCXZhciBudW1iZXIgPSBkb2pvLmkxOG4ubnVtYmVyLnBhcnNlKGFicywgbG9jYWxlLCBmbGFncyk7CisJaWYgKHNpZ24pIHsKKwkJbnVtYmVyID0gbnVtYmVyICogLTE7CisJfQorCXJldHVybiBudW1iZXI7Cit9OworZG9qby5pMThuLmN1cnJlbmN5LmlzQ3VycmVuY3kgPSBmdW5jdGlvbiAodmFsdWUsIGlzbywgbG9jYWxlLCBmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCXZhciBudW1iZXJGb3JtYXREYXRhID0gZG9qby5pMThuLm51bWJlci5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGRvam8uaTE4bi5udW1iZXIuRk9STUFUX1RBQkxFLCBsb2NhbGUpOworCWlmICh0eXBlb2YgZmxhZ3Muc2VwYXJhdG9yID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnNlcGFyYXRvciA9IG51bWJlckZvcm1hdERhdGFbMF07CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5KGZsYWdzLnNlcGFyYXRvcikgJiYgZmxhZ3Muc2VwYXJhdG9yLmxlbmd0aCA9PSAwKSB7CisJCQlmbGFncy5zZXBhcmF0b3IgPSBbbnVtYmVyRm9ybWF0RGF0YVswXSwgIiJdOworCQl9CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZGVjaW1hbCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5kZWNpbWFsID0gbnVtYmVyRm9ybWF0RGF0YVsyXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MuZ3JvdXBTaXplID0gbnVtYmVyRm9ybWF0RGF0YVszXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUyID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmdyb3VwU2l6ZTIgPSBudW1iZXJGb3JtYXREYXRhWzRdOworCX0KKwl2YXIgZm9ybWF0RGF0YSA9IGRvam8uaTE4bi5jdXJyZW5jeS5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGRvam8uaTE4bi5jdXJyZW5jeS5GT1JNQVRfVEFCTEUsIGlzbywgbG9jYWxlKTsKKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlcyA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZXMgPSBmb3JtYXREYXRhLnBsYWNlczsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5wbGFjZXMgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MucGxhY2VzID0gMjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5zeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc3ltYm9sID0gZm9ybWF0RGF0YS5zeW1ib2w7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5KGZsYWdzLnN5bWJvbCkgJiYgZmxhZ3Muc3ltYm9sLmxlbmd0aCA9PSAwKSB7CisJCQlmbGFncy5zeW1ib2wgPSBbZm9ybWF0RGF0YS5zeW1ib2wsICIiXTsKKwkJfQorCX0KKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlbWVudCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5wbGFjZW1lbnQgPSBmb3JtYXREYXRhLnBsYWNlbWVudDsKKwl9CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC5jdXJyZW5jeShmbGFncykgKyAiJCIpOworCXJldHVybiByZS50ZXN0KHZhbHVlKTsKK307Citkb2pvLmkxOG4uY3VycmVuY3kuX21hcFRvTG9jYWxpemVkRm9ybWF0RGF0YSA9IGZ1bmN0aW9uICh0YWJsZSwgaXNvLCBsb2NhbGUpIHsKKwl2YXIgZm9ybWF0RGF0YSA9IGRvam8uaTE4bi5jdXJyZW5jeS5GT1JNQVRfVEFCTEVbaXNvXTsKKwlpZiAoIWRvam8ubGFuZy5pc0FycmF5KGZvcm1hdERhdGEpKSB7CisJCXJldHVybiBmb3JtYXREYXRhOworCX0KKwlyZXR1cm4gZG9qby5pMThuLm51bWJlci5fbWFwVG9Mb2NhbGl6ZWRGb3JtYXREYXRhKGZvcm1hdERhdGFbMF0sIGxvY2FsZSk7Cit9OworKGZ1bmN0aW9uICgpIHsKKwl2YXIgYXJhYmljID0ge3N5bWJvbDoiXHUwNjJjIiwgcGxhY2VtZW50OiJhZnRlciIsIGh0bWxTeW1ib2w6Ij8ifTsKKwl2YXIgZXVybyA9IHtzeW1ib2w6Ilx1MjBhYyIsIHBsYWNlbWVudDoiYmVmb3JlIiwgYWRqU3BhY2U6InN5bWJvbCIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9OworCXZhciBldXJvQWZ0ZXIgPSB7c3ltYm9sOiJcdTIwYWMiLCBwbGFjZW1lbnQ6ImFmdGVyIiwgaHRtbFN5bWJvbDoiJmV1cm87In07CisJZG9qby5pMThuLmN1cnJlbmN5LkZPUk1BVF9UQUJMRSA9IHtBRUQ6e3N5bWJvbDoiXHUwNjJjIiwgcGxhY2VtZW50OiJhZnRlciJ9LCBBUlM6e3N5bWJvbDoiJCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIEFUUzp7c3ltYm9sOiJcdTIwYWMiLCBhZGpTcGFjZToibnVtYmVyIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBodG1sU3ltYm9sOiImZXVybzsifSwgQVVEOntzeW1ib2w6IiQifSwgQk9COntzeW1ib2w6IiRiIn0sIEJSTDp7c3ltYm9sOiJSJCIsIGFkalNwYWNlOiJzeW1ib2wifSwgQkVGOmV1cm9BZnRlciwgQkhEOmFyYWJpYywgQ0FEOlt7IioiOntzeW1ib2w6IiQifSwgImZyLWNhIjp7c3ltYm9sOiIkIiwgcGxhY2VtZW50OiJhZnRlciIsIHNpZ25QbGFjZW1lbnQ6ImFyb3VuZCJ9fV0sIENIRjp7c3ltYm9sOiJDSEYiLCBhZGpTcGFjZToic3ltYm9sIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgQ0xQOntzeW1ib2w6IiQifSwgQ09QOntzeW1ib2w6IiQiLCBzaWduUGxhY2VtZW50OiJhcm91bmQifSwgQ05ZOntzeW1ib2w6Ilx4YTUiLCBodG1sU3ltYm9sOiImeWVuOyJ9LCBDUkM6e3N5bWJvbDoiXHUyMGExIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBodG1sU3ltYm9sOiI/In0sIENaSzp7c3ltYm9sOiJLYyIsIGFkalNwYWNlOiJzeW1ib2wiLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBERU06ZXVyb0FmdGVyLCBES0s6e3N5bWJvbDoia3IuIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIERPUDp7c3ltYm9sOiIkIn0sIERaRDphcmFiaWMsIEVDUzp7c3ltYm9sOiIkIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgRUdQOmFyYWJpYywgRVNQOmV1cm9BZnRlciwgRVVSOmV1cm8sIEZJTTpldXJvQWZ0ZXIsIEZSRjpldXJvQWZ0ZXIsIEdCUDp7c3ltYm9sOiJceGEzIiwgaHRtbFN5bWJvbDoiJnBvdW5kOyJ9LCBHUkQ6e3N5bWJvbDoiXHUyMGFjIiwgc2lnblBsYWNlbWVudDoiZW5kIiwgaHRtbFN5bWJvbDoiJmV1cm87In0sIEdUUTp7c3ltYm9sOiJRIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIifSwgSEtEOntzeW1ib2w6IkhLJCJ9LCBITkw6e3N5bWJvbDoiTC4iLCBzaWduUGxhY2VtZW50OiJlbmQifSwgSFVGOntzeW1ib2w6IkZ0IiwgcGxhY2VtZW50OiJhZnRlciIsIGFkalNwYWNlOiJzeW1ib2wifSwgSUVQOntzeW1ib2w6Ilx1MjBhYyIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9LCBJTFM6e3N5bWJvbDoiXHUwNWU5XCJcdTA1ZDciLCBwbGFjZW1lbnQ6ImFmdGVyIiwgaHRtbFN5bWJvbDoiPyJ9LCBJTlI6e3N5bWJvbDoiUnMuIn0sIElUTDp7c3ltYm9sOiJcdTIwYWMiLCBzaWduUGxhY2VtZW50OiJhZnRlciIsIGh0bWxTeW1ib2w6IiZldXJvOyJ9LCBKT0Q6YXJhYmljLCBKUFk6e3N5bWJvbDoiXHhhNSIsIHBsYWNlczowLCBodG1sU3ltYm9sOiImeWVuOyJ9LCBLUlc6e3N5bWJvbDoiXHUyMGE5IiwgcGxhY2VzOjAsIGh0bWxTeW1ib2w6Ij8ifSwgS1dEOmFyYWJpYywgTEJQOmFyYWJpYywgTFVGOmV1cm9BZnRlciwgTUFEOmFyYWJpYywgTVhOOntzeW1ib2w6IiQiLCBzaWduUGxhY2VtZW50OiJhcm91bmQifSwgTklPOntzeW1ib2w6IkMkIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIE5MRzp7c3ltYm9sOiJcdTIwYWMiLCBzaWduUGxhY2VtZW50OiJlbmQiLCBodG1sU3ltYm9sOiImZXVybzsifSwgTk9LOntzeW1ib2w6ImtyIiwgYWRqU3BhY2U6InN5bWJvbCIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIE5aRDp7c3ltYm9sOiIkIn0sIE9NUjphcmFiaWMsIFBBQjp7c3ltYm9sOiJCLyIsIGFkalNwYWNlOiJzeW1ib2wiLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBQRU46e3N5bWJvbDoiUy8iLCBzaWduUGxhY2VtZW50OiJhZnRlciJ9LCBQTE46e3N5bWJvbDoieiIsIHBsYWNlbWVudDoiYWZ0ZXIifSwgUFRFOmV1cm9BZnRlciwgUFlHOntzeW1ib2w6IkdzLiIsIHNpZ25QbGFjZW1lbnQ6ImFmdGVyIn0sIFFBUjphcmFiaWMsIFJVUjp7c3ltYm9sOiJydWIuIiwgcGxhY2VtZW50OiJhZnRlciJ9LCBTQVI6YXJhYmljLCBTRUs6e3N5bWJvbDoia3IiLCBwbGFjZW1lbnQ6ImFmdGVyIiwgYWRqU3BhY2U6InN5bWJvbCJ9LCBTR0Q6e3N5bWJvbDoiJCJ9LCBTVkM6e3N5bWJvbDoiXHUyMGExIiwgc2lnblBsYWNlbWVudDoiYWZ0ZXIiLCBhZGpTcGFjZToic3ltYm9sIn0sIFNZUDphcmFiaWMsIFRORDphcmFiaWMsIFRSTDp7c3ltYm9sOiJUTCIsIHBsYWNlbWVudDoiYWZ0ZXIifSwgVFdEOntzeW1ib2w6Ik5UJCJ9LCBVU0Q6e3N5bWJvbDoiJCJ9LCBVWVU6e3N5bWJvbDoiJFUiLCBzaWducGxhY2VtZW50OiJhZnRlciIsIGFkalNwYWNlOiJzeW1ib2wifSwgVkVCOntzeW1ib2w6IkJzIiwgc2lnbnBsYWNlbWVudDoiYWZ0ZXIiLCBhZGpTcGFjZToic3ltYm9sIn0sIFlFUjphcmFiaWMsIFpBUjp7c3ltYm9sOiJSIiwgc2lnblBsYWNlbWVudDoiYXJvdW5kIn19OworfSkoKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL0VVUi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9FVVIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzOGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9FVVIuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiRVVSIiwgInN5bWJvbCI6Ilx1MjBhYyJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9HQlAuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvR0JQLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzhiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvR0JQLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6IkdCUCIsICJzeW1ib2wiOiJceGEzIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL0lOUi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9JTlIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NDA5OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9JTlIuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiSU5SIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL0lUTC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9JVEwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3OTY1MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9JVEwuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiSVRMIiwgInN5bWJvbCI6Ilx1MjBhNCJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9KUFkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvSlBZLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmNhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvSlBZLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6IkpQWSIsICJzeW1ib2wiOiJceGE1In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL1JFQURNRSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2YmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9SRUFETUUKQEAgLTAsMCArMSw2IEBACitBbGwgZmlsZXMgd2l0aGluIHRoaXMgZGlyZWN0b3J5IGFuZCBzdWJkaXJlY3RvcmllcyB3ZXJlIG1hbnVhbGx5IGRlcml2ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvY2xkcgorCitTZWUgdGVybXMgb2YgdXNlOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NvcHlyaWdodC5odG1sI0V4aGliaXQxCisKK0V2ZW50dWFsbHksIHRoaXMgZGF0YSBzaG91bGQgYmUgZ2VuZXJhdGVkIGRpcmVjdGx5IGZyb20gdGhlIFhNTCBpbiB0aGUgQ0xEUiByZXBvc2l0b3J5IHRvIHByb3ZpZGUKK2FjY3VyYXRlIGFuZCBmdWxsIHN1cHBvcnQgZm9yIHRoZSBmdWxsIHNldCBvZiBsb2NhbGVzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL1VTRC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9VU0QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjZGY5MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9VU0QuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiVVNEIiwgInN5bWJvbCI6IiQifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvZW4tdXMvVVNELmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuLXVzL1VTRC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZmNzYxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuLXVzL1VTRC5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsic3ltYm9sIjoiJCIsICJkaXNwbGF5TmFtZSI6IlVTIERvbGxhciJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9FVVIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvZW4vRVVSLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDljMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvZW4vRVVSLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6IkV1cm8iLCAic3ltYm9sIjoiXHUyMGFjIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuL0dCUC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9HQlAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjZjI4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9HQlAuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiQnJpdGlzaCBQb3VuZCBTdGVybGluZyIsICJzeW1ib2wiOiJceGEzIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuL0lOUi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9JTlIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmMDZlMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9JTlIuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiSW5kaWFuIFJ1cGVlIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuL0lUTC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9JVEwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyMTA5NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9JVEwuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiSXRhbGlhbiBMaXJhIiwgInN5bWJvbCI6Ilx1MjBhNCJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9KUFkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvZW4vSlBZLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNTVhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvZW4vSlBZLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6IkphcGFuZXNlIFllbiIsICJzeW1ib2wiOiJceGE1In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2VuL1VTRC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9VU0QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhOTczYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9lbi9VU0QuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiVVMgRG9sbGFyIiwgInN5bWJvbCI6IlVTJCJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9oaS9FVVIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvRVVSLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvRVVSLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6Ilx1MDkyZlx1MDk0MVx1MDkzMFx1MDk0YiIsICJzeW1ib2wiOiJcdTIwYWMifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvR0JQLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0dCUC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYxZjRiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0dCUC5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTA5MmNcdTA5NGRcdTA5MzBcdTA5M2ZcdTA5MjRcdTA5MjggXHUwOTE1XHUwOTNlIFx1MDkyYVx1MDk0Y1x1MDkyOFx1MDk0ZFx1MDkyMSBcdTA5MzhcdTA5NGRcdTA5MWZcdTA5MzBcdTA5NGRcdTA5MzJcdTA5M2ZcdTA5MTciLCAic3ltYm9sIjoiXHhhMyJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9oaS9JTlIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvSU5SLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGZjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvSU5SLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6Ilx1MDkyZFx1MDkzZVx1MDkzMFx1MDkyNFx1MDk0MFx1MDkyZiAgXHUwOTMwXHUwOTQyXHUwOTJhXHUwOTJmXHUwOTNlIiwgInN5bWJvbCI6Ilx1MDkzMFx1MDk0MS4ifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvSVRMLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0lUTC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmJlZmYwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0lUTC5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTA5MDdcdTA5MjRcdTA5MzJcdTA5NDAgXHUwOTE1XHUwOTNlIFx1MDkzMlx1MDk0MFx1MDkzMFx1MDkzZSIsICJzeW1ib2wiOiJcdTIwYTQifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvSlBZLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0pQWS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2RmN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL0pQWS5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTA5MWNcdTA5M2VcdTA5MmFcdTA5M2VcdTA5MjhcdTA5NDAgXHUwOTJmXHUwOTQ3XHUwOTI4IiwgInN5bWJvbCI6Ilx4YTUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvaGkvVVNELmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL1VTRC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U5ZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2hpL1VTRC5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTA5MDVcdTA5MmVcdTA5MzBcdTA5NDBcdTA5MTVcdTA5NDAgXHUwOTIxXHUwOTNlXHUwOTMyXHUwOTMwIiwgInN5bWJvbCI6IiQifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvRVVSLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0VVUi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRiMzQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0VVUi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTMwZTZcdTMwZmNcdTMwZWQiLCAic3ltYm9sIjoiXHUyMGFjIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0dCUC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9HQlAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NmY1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9HQlAuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiXHU4MmYxXHU1NmZkXHUzMGRkXHUzMGYzXHUzMGM5IiwgInN5bWJvbCI6Ilx4YTMifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvSU5SLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0lOUi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQzNmVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0lOUi5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiZGlzcGxheU5hbWUiOiJcdTMwYTRcdTMwZjNcdTMwYzkgXHUzMGViXHUzMGQ0XHUzMGZjIiwgInN5bWJvbCI6IklOUiJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9JVEwuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvSVRMLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzc3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvSVRMLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6Ilx1MzBhNFx1MzBiZlx1MzBlYVx1MzBhMiBcdTMwZWFcdTMwZTkiLCAic3ltYm9sIjoiXHUyMGE0In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vY3VycmVuY3kvbmxzL2phL0pQWS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9KUFkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiZDA3MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9KUFkuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7ImRpc3BsYXlOYW1lIjoiXHU2NWU1XHU2NzJjXHU1MTg2IiwgInN5bWJvbCI6Ilx1ZmZlNSJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pMThuL2N1cnJlbmN5L25scy9qYS9VU0QuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvVVNELmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTMyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9jdXJyZW5jeS9ubHMvamEvVVNELmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJkaXNwbGF5TmFtZSI6Ilx1N2M3M1x1MzBjOVx1MzBlYiIsICJzeW1ib2wiOiIkIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vbnVtYmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2kxOG4vbnVtYmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODAzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaTE4bi9udW1iZXIuanMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaTE4bi5udW1iZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJkb2pvLmkxOG4ubnVtYmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ucmVnZXhwIik7Citkb2pvLnJlcXVpcmUoImRvam8uaTE4bi5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5pMThuLm51bWJlci5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWdzLCBsb2NhbGUpIHsKKwlmbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT0gIm9iamVjdCIpID8gZmxhZ3MgOiB7fTsKKwl2YXIgZm9ybWF0RGF0YSA9IGRvam8uaTE4bi5udW1iZXIuX21hcFRvTG9jYWxpemVkRm9ybWF0RGF0YShkb2pvLmkxOG4ubnVtYmVyLkZPUk1BVF9UQUJMRSwgbG9jYWxlKTsKKwlpZiAodHlwZW9mIGZsYWdzLnNlcGFyYXRvciA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5zZXBhcmF0b3IgPSBmb3JtYXREYXRhWzFdOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmRlY2ltYWwgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MuZGVjaW1hbCA9IGZvcm1hdERhdGFbMl07CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZ3JvdXBTaXplID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmdyb3VwU2l6ZSA9IGZvcm1hdERhdGFbM107CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZ3JvdXBTaXplMiA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5ncm91cFNpemUyID0gZm9ybWF0RGF0YVs0XTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5yb3VuZCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5yb3VuZCA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3Muc2lnbmVkID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnNpZ25lZCA9IHRydWU7CisJfQorCXZhciBvdXRwdXQgPSAoZmxhZ3Muc2lnbmVkICYmICh2YWx1ZSA8IDApKSA/ICItIiA6ICIiOworCXZhbHVlID0gTWF0aC5hYnModmFsdWUpOworCXZhciB3aG9sZSA9IFN0cmluZygoKChmbGFncy5wbGFjZXMgPiAwKSB8fCAhZmxhZ3Mucm91bmQpID8gTWF0aC5mbG9vciA6IE1hdGgucm91bmQpKHZhbHVlKSk7CisJZnVuY3Rpb24gc3BsaXRTdWJzdHJpbmdzKHN0ciwgY291bnQpIHsKKwkJZm9yICh2YXIgc3VicyA9IFtdOyBzdHIubGVuZ3RoID49IGNvdW50OyBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSBjb3VudCkpIHsKKwkJCXN1YnMucHVzaChzdHIuc3Vic3RyKC1jb3VudCkpOworCQl9CisJCWlmIChzdHIubGVuZ3RoID4gMCkgeworCQkJc3Vicy5wdXNoKHN0cik7CisJCX0KKwkJcmV0dXJuIHN1YnMucmV2ZXJzZSgpOworCX0KKwlpZiAoZmxhZ3MuZ3JvdXBTaXplMiAmJiAod2hvbGUubGVuZ3RoID4gZmxhZ3MuZ3JvdXBTaXplKSkgeworCQl2YXIgZ3JvdXBzID0gc3BsaXRTdWJzdHJpbmdzKHdob2xlLnN1YnN0cigwLCB3aG9sZS5sZW5ndGggLSBmbGFncy5ncm91cFNpemUpLCBmbGFncy5ncm91cFNpemUyKTsKKwkJZ3JvdXBzLnB1c2god2hvbGUuc3Vic3RyKC1mbGFncy5ncm91cFNpemUpKTsKKwkJb3V0cHV0ID0gb3V0cHV0ICsgZ3JvdXBzLmpvaW4oZmxhZ3Muc2VwYXJhdG9yKTsKKwl9IGVsc2UgeworCQlpZiAoZmxhZ3MuZ3JvdXBTaXplKSB7CisJCQlvdXRwdXQgPSBvdXRwdXQgKyBzcGxpdFN1YnN0cmluZ3Mod2hvbGUsIGZsYWdzLmdyb3VwU2l6ZSkuam9pbihmbGFncy5zZXBhcmF0b3IpOworCQl9IGVsc2UgeworCQkJb3V0cHV0ID0gb3V0cHV0ICsgd2hvbGU7CisJCX0KKwl9CisJaWYgKGZsYWdzLnBsYWNlcyA+IDApIHsKKwkJdmFyIGZyYWN0ID0gdmFsdWUgLSBNYXRoLmZsb29yKHZhbHVlKTsKKwkJZnJhY3QgPSAoZmxhZ3Mucm91bmQgPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikoZnJhY3QgKiBNYXRoLnBvdygxMCwgZmxhZ3MucGxhY2VzKSk7CisJCW91dHB1dCA9IG91dHB1dCArIGZsYWdzLmRlY2ltYWwgKyBmcmFjdDsKKwl9CisJcmV0dXJuIG91dHB1dDsKK307Citkb2pvLmkxOG4ubnVtYmVyLnBhcnNlID0gZnVuY3Rpb24gKHZhbHVlLCBsb2NhbGUsIGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJdmFyIGZvcm1hdERhdGEgPSBkb2pvLmkxOG4ubnVtYmVyLl9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLm51bWJlci5GT1JNQVRfVEFCTEUsIGxvY2FsZSk7CisJaWYgKHR5cGVvZiBmbGFncy5zZXBhcmF0b3IgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2VwYXJhdG9yID0gZm9ybWF0RGF0YVsxXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5kZWNpbWFsID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmRlY2ltYWwgPSBmb3JtYXREYXRhWzJdOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmdyb3VwU2l6ZSA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5ncm91cFNpemUgPSBmb3JtYXREYXRhWzNdOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmdyb3VwU2l6ZTIgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MuZ3JvdXBTaXplMiA9IGZvcm1hdERhdGFbNF07CisJfQorCWlmICh0eXBlb2YgZmxhZ3MudmFsaWRhdGUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MudmFsaWRhdGUgPSB0cnVlOworCX0KKwlpZiAoZmxhZ3MudmFsaWRhdGUgJiYgIWRvam8uaTE4bi5udW1iZXIuaXNSZWFsKHZhbHVlLCBsb2NhbGUsIGZsYWdzKSkgeworCQlyZXR1cm4gTnVtYmVyLk5hTjsKKwl9CisJdmFyIG51bWJlcnMgPSB2YWx1ZS5zcGxpdChmbGFncy5kZWNpbWFsKTsKKwlpZiAobnVtYmVycy5sZW5ndGggPiAyKSB7CisJCXJldHVybiBOdW1iZXIuTmFOOworCX0KKwl2YXIgd2hvbGUgPSBOdW1iZXIobnVtYmVyc1swXS5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcIiArIGZsYWdzLnNlcGFyYXRvciwgImciKSwgIiIpKTsKKwl2YXIgZnJhY3QgPSAobnVtYmVycy5sZW5ndGggPT0gMSkgPyAwIDogTnVtYmVyKG51bWJlcnNbMV0pIC8gTWF0aC5wb3coMTAsIFN0cmluZyhudW1iZXJzWzFdKS5sZW5ndGgpOworCXJldHVybiB3aG9sZSArIGZyYWN0OworfTsKK2Rvam8uaTE4bi5udW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKHZhbHVlLCBsb2NhbGUsIGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJdmFyIGZvcm1hdERhdGEgPSBkb2pvLmkxOG4ubnVtYmVyLl9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLm51bWJlci5GT1JNQVRfVEFCTEUsIGxvY2FsZSk7CisJaWYgKHR5cGVvZiBmbGFncy5zZXBhcmF0b3IgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2VwYXJhdG9yID0gZm9ybWF0RGF0YVsxXTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkoZmxhZ3Muc2VwYXJhdG9yKSAmJiBmbGFncy5zZXBhcmF0b3IubGVuZ3RoID09PSAwKSB7CisJCQlmbGFncy5zZXBhcmF0b3IgPSBbZm9ybWF0RGF0YVsxXSwgIiJdOworCQl9CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZ3JvdXBTaXplID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmdyb3VwU2l6ZSA9IGZvcm1hdERhdGFbM107CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZ3JvdXBTaXplMiA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5ncm91cFNpemUyID0gZm9ybWF0RGF0YVs0XTsKKwl9CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC5pbnRlZ2VyKGZsYWdzKSArICIkIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8uaTE4bi5udW1iZXIuaXNSZWFsID0gZnVuY3Rpb24gKHZhbHVlLCBsb2NhbGUsIGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJdmFyIGZvcm1hdERhdGEgPSBkb2pvLmkxOG4ubnVtYmVyLl9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEoZG9qby5pMThuLm51bWJlci5GT1JNQVRfVEFCTEUsIGxvY2FsZSk7CisJaWYgKHR5cGVvZiBmbGFncy5zZXBhcmF0b3IgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2VwYXJhdG9yID0gZm9ybWF0RGF0YVsxXTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkoZmxhZ3Muc2VwYXJhdG9yKSAmJiBmbGFncy5zZXBhcmF0b3IubGVuZ3RoID09PSAwKSB7CisJCQlmbGFncy5zZXBhcmF0b3IgPSBbZm9ybWF0RGF0YVsxXSwgIiJdOworCQl9CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuZGVjaW1hbCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5kZWNpbWFsID0gZm9ybWF0RGF0YVsyXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3MuZ3JvdXBTaXplID0gZm9ybWF0RGF0YVszXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5ncm91cFNpemUyID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmdyb3VwU2l6ZTIgPSBmb3JtYXREYXRhWzRdOworCX0KKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJeIiArIGRvam8ucmVnZXhwLnJlYWxOdW1iZXIoZmxhZ3MpICsgIiQiKTsKKwlyZXR1cm4gcmUudGVzdCh2YWx1ZSk7Cit9OworKGZ1bmN0aW9uICgpIHsKKwlkb2pvLmkxOG4ubnVtYmVyLkZPUk1BVF9UQUJMRSA9IHsiYXItYWUiOlsiIiwgIiIsICIsIiwgMV0sICJhci1iaCI6WyIiLCAiIiwgIiwiLCAxXSwgImFyLWR6IjpbIiIsICIiLCAiLCIsIDFdLCAiYXItZWciOlsiIiwgIiIsICIsIiwgMV0sICJhci1qbyI6WyIiLCAiIiwgIiwiLCAxXSwgImFyLWt3IjpbIiIsICIiLCAiLCIsIDFdLCAiYXItbGIiOlsiIiwgIiIsICIsIiwgMV0sICJhci1tYSI6WyIiLCAiIiwgIiwiLCAxXSwgImFyLW9tIjpbIiIsICIiLCAiLCIsIDFdLCAiYXItcWEiOlsiIiwgIiIsICIsIiwgMV0sICJhci1zYSI6WyIiLCAiIiwgIiwiLCAxXSwgImFyLXN5IjpbIiIsICIiLCAiLCIsIDFdLCAiYXItdG4iOlsiIiwgIiIsICIsIiwgMV0sICJhci15ZSI6WyIiLCAiIiwgIiwiLCAxXSwgImNzLWN6IjpbIi4iLCAiLiIsICIsIiwgM10sICJkYS1kayI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZGUtYXQiOlsiLiIsICIuIiwgIiwiLCAzXSwgImRlLWRlIjpbIi4iLCAiLiIsICIsIiwgM10sICJkZS1sdSI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZGUtY2giOlsiJyIsICInIiwgIi4iLCAzXSwgImVsLWdyIjpbIi4iLCAiLiIsICIsIiwgM10sICJlbi1hdSI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiZW4tY2EiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVuLWdiIjpbIiwiLCAiLCIsICIuIiwgM10sICJlbi1oayI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiZW4taWUiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVuLWluIjpbIiwiLCAiLCIsICIuIiwgMywgMl0sICJlbi1ueiI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiZW4tdXMiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVuLXphIjpbIiwiLCAiLCIsICIuIiwgM10sICJlcy1hciI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZXMtYm8iOlsiLiIsICIuIiwgIiwiLCAzXSwgImVzLWNsIjpbIi4iLCAiLiIsICIsIiwgM10sICJlcy1jbyI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZXMtY3IiOlsiLiIsICIuIiwgIiwiLCAzXSwgImVzLWRvIjpbIi4iLCAiLiIsICIsIiwgM10sICJlcy1lYyI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZXMtZXMiOlsiLiIsICIuIiwgIiwiLCAzXSwgImVzLWd0IjpbIiwiLCAiLCIsICIuIiwgM10sICJlcy1obiI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiZXMtbXgiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVzLW5pIjpbIiwiLCAiLCIsICIuIiwgM10sICJlcy1wYSI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiZXMtcGUiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVzLXByIjpbIiwiLCAiLCIsICIuIiwgM10sICJlcy1weSI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZXMtc3YiOlsiLCIsICIsIiwgIi4iLCAzXSwgImVzLXV5IjpbIi4iLCAiLiIsICIsIiwgM10sICJlcy12ZSI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiZmktZmkiOlsiICIsICIgIiwgIiwiLCAzXSwgImZyLWJlIjpbIi4iLCAiLiIsICIsIiwgM10sICJmci1jYSI6WyIgIiwgIiAiLCAiLCIsIDNdLCAiZnItY2giOlsiICIsICIgIiwgIi4iLCAzXSwgImZyLWZyIjpbIiAiLCAiICIsICIsIiwgM10sICJmci1sdSI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiaGUtaWwiOlsiLCIsICIsIiwgIi4iLCAzXSwgImh1LWh1IjpbIiAiLCAiICIsICIsIiwgM10sICJpdC1jaCI6WyIgIiwgIiAiLCAiLiIsIDNdLCAiaXQtaXQiOlsiLiIsICIuIiwgIiwiLCAzXSwgImphLWpwIjpbIiwiLCAiLCIsICIuIiwgM10sICJrby1rciI6WyIsIiwgIiwiLCAiLiIsIDNdLCAibm8tbm8iOlsiLiIsICIuIiwgIiwiLCAzXSwgIm5sLWJlIjpbIiAiLCAiICIsICIsIiwgM10sICJubC1ubCI6WyIuIiwgIi4iLCAiLCIsIDNdLCAicGwtcGwiOlsiLiIsICIuIiwgIiwiLCAzXSwgInB0LWJyIjpbIi4iLCAiLiIsICIsIiwgM10sICJwdC1wdCI6WyIuIiwgIi4iLCAiJCIsIDNdLCAicnUtcnUiOlsiICIsICIgIiwgIiwiLCAzXSwgInN2LXNlIjpbIi4iLCAiICIsICIsIiwgM10sICJ0ci10ciI6WyIuIiwgIi4iLCAiLCIsIDNdLCAiemgtY24iOlsiLCIsICIsIiwgIi4iLCAzXSwgInpoLWhrIjpbIiwiLCAiLCIsICIuIiwgM10sICJ6aC10dyI6WyIsIiwgIiwiLCAiLiIsIDNdLCAiKiI6WyIsIiwgIiwiLCAiLiIsIDNdfTsKK30pKCk7Citkb2pvLmkxOG4ubnVtYmVyLl9tYXBUb0xvY2FsaXplZEZvcm1hdERhdGEgPSBmdW5jdGlvbiAodGFibGUsIGxvY2FsZSkgeworCWxvY2FsZSA9IGRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUobG9jYWxlKTsKKwl2YXIgZGF0YSA9IHRhYmxlW2xvY2FsZV07CisJaWYgKHR5cGVvZiBkYXRhID09ICJ1bmRlZmluZWQiKSB7CisJCWRhdGEgPSB0YWJsZVsiKiJdOworCX0KKwlyZXR1cm4gZGF0YTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pQ2FsZW5kYXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaUNhbGVuZGFyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTM0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaUNhbGVuZGFyLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uY2FsLmlDYWxlbmRhciIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLmljYWxlbmRhciIsICJ1c2UgZG9qby5jYWwuaUNhbGVuZGFyIGlzbnRlYWQiLCAiMC41Iik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjIyNmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvLmpzCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaW8iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uaW8iLCAicmVwbGFjZWQgYnkgZG9qby5pby4qIiwgIjAuNSIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vQnJvd3NlcklPLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL0Jyb3dzZXJJTy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU5OTZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL0Jyb3dzZXJJTy5qcwpAQCAtMCwwICsxLDQ5NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5pby5Ccm93c2VySU8iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLnVuZG8uYnJvd3NlciIpOworaWYgKCFkal91bmRlZigid2luZG93IikpIHsKKwlkb2pvLmlvLmNoZWNrQ2hpbGRyZW5Gb3JGaWxlID0gZnVuY3Rpb24gKG5vZGUpIHsKKwkJdmFyIGhhc0ZpbGUgPSBmYWxzZTsKKwkJdmFyIGlucHV0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7CisJCWRvam8ubGFuZy5mb3JFYWNoKGlucHV0cywgZnVuY3Rpb24gKGlucHV0KSB7CisJCQlpZiAoaGFzRmlsZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChpbnB1dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSA9PSAiZmlsZSIpIHsKKwkJCQloYXNGaWxlID0gdHJ1ZTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiBoYXNGaWxlOworCX07CisJZG9qby5pby5mb3JtSGFzRmlsZSA9IGZ1bmN0aW9uIChmb3JtTm9kZSkgeworCQlyZXR1cm4gZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZShmb3JtTm9kZSk7CisJfTsKKwlkb2pvLmlvLnVwZGF0ZU5vZGUgPSBmdW5jdGlvbiAobm9kZSwgdXJsT3JBcmdzKSB7CisJCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCXZhciBhcmdzID0gdXJsT3JBcmdzOworCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKHVybE9yQXJncykpIHsKKwkJCWFyZ3MgPSB7dXJsOnVybE9yQXJnc307CisJCX0KKwkJYXJncy5taW1ldHlwZSA9ICJ0ZXh0L2h0bWwiOworCQlhcmdzLmxvYWQgPSBmdW5jdGlvbiAodCwgZCwgZSkgeworCQkJd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkgeworCQkJCWRvam8uZG9tLmRlc3Ryb3lOb2RlKG5vZGUuZmlyc3RDaGlsZCk7CisJCQl9CisJCQlub2RlLmlubmVySFRNTCA9IGQ7CisJCX07CisJCWRvam8uaW8uYmluZChhcmdzKTsKKwl9OworCWRvam8uaW8uZm9ybUZpbHRlciA9IGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciB0eXBlID0gKG5vZGUudHlwZSB8fCAiIikudG9Mb3dlckNhc2UoKTsKKwkJcmV0dXJuICFub2RlLmRpc2FibGVkICYmIG5vZGUubmFtZSAmJiAhZG9qby5sYW5nLmluQXJyYXkoWyJmaWxlIiwgInN1Ym1pdCIsICJpbWFnZSIsICJyZXNldCIsICJidXR0b24iXSwgdHlwZSk7CisJfTsKKwlkb2pvLmlvLmVuY29kZUZvcm0gPSBmdW5jdGlvbiAoZm9ybU5vZGUsIGVuY29kaW5nLCBmb3JtRmlsdGVyKSB7CisJCWlmICgoIWZvcm1Ob2RlKSB8fCAoIWZvcm1Ob2RlLnRhZ05hbWUpIHx8ICghZm9ybU5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJmb3JtIikpIHsKKwkJCWRvam8ucmFpc2UoIkF0dGVtcHRlZCB0byBlbmNvZGUgYSBub24tZm9ybSBlbGVtZW50LiIpOworCQl9CisJCWlmICghZm9ybUZpbHRlcikgeworCQkJZm9ybUZpbHRlciA9IGRvam8uaW8uZm9ybUZpbHRlcjsKKwkJfQorCQl2YXIgZW5jID0gL3V0Zi9pLnRlc3QoZW5jb2RpbmcgfHwgIiIpID8gZW5jb2RlVVJJQ29tcG9uZW50IDogZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk7CisJCXZhciB2YWx1ZXMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtTm9kZS5lbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIGVsbSA9IGZvcm1Ob2RlLmVsZW1lbnRzW2ldOworCQkJaWYgKCFlbG0gfHwgZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiZmllbGRzZXQiIHx8ICFmb3JtRmlsdGVyKGVsbSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciBuYW1lID0gZW5jKGVsbS5uYW1lKTsKKwkJCXZhciB0eXBlID0gZWxtLnR5cGUudG9Mb3dlckNhc2UoKTsKKwkJCWlmICh0eXBlID09ICJzZWxlY3QtbXVsdGlwbGUiKSB7CisJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBlbG0ub3B0aW9ucy5sZW5ndGg7IGorKykgeworCQkJCQlpZiAoZWxtLm9wdGlvbnNbal0uc2VsZWN0ZWQpIHsKKwkJCQkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiPSIgKyBlbmMoZWxtLm9wdGlvbnNbal0udmFsdWUpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRvam8ubGFuZy5pbkFycmF5KFsicmFkaW8iLCAiY2hlY2tib3giXSwgdHlwZSkpIHsKKwkJCQkJaWYgKGVsbS5jaGVja2VkKSB7CisJCQkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGVsbS52YWx1ZSkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsdWVzLnB1c2gobmFtZSArICI9IiArIGVuYyhlbG0udmFsdWUpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdmFyIGlucHV0cyA9IGZvcm1Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIGlucHV0ID0gaW5wdXRzW2ldOworCQkJaWYgKGlucHV0LnR5cGUudG9Mb3dlckNhc2UoKSA9PSAiaW1hZ2UiICYmIGlucHV0LmZvcm0gPT0gZm9ybU5vZGUgJiYgZm9ybUZpbHRlcihpbnB1dCkpIHsKKwkJCQl2YXIgbmFtZSA9IGVuYyhpbnB1dC5uYW1lKTsKKwkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGlucHV0LnZhbHVlKSk7CisJCQkJdmFsdWVzLnB1c2gobmFtZSArICIueD0wIik7CisJCQkJdmFsdWVzLnB1c2gobmFtZSArICIueT0wIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlcy5qb2luKCImIikgKyAiJiI7CisJfTsKKwlkb2pvLmlvLkZvcm1CaW5kID0gZnVuY3Rpb24gKGFyZ3MpIHsKKwkJdGhpcy5iaW5kQXJncyA9IHt9OworCQlpZiAoYXJncyAmJiBhcmdzLmZvcm1Ob2RlKSB7CisJCQl0aGlzLmluaXQoYXJncyk7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJncykgeworCQkJCXRoaXMuaW5pdCh7Zm9ybU5vZGU6YXJnc30pOworCQkJfQorCQl9CisJfTsKKwlkb2pvLmxhbmcuZXh0ZW5kKGRvam8uaW8uRm9ybUJpbmQsIHtmb3JtOm51bGwsIGJpbmRBcmdzOm51bGwsIGNsaWNrZWRCdXR0b246bnVsbCwgaW5pdDpmdW5jdGlvbiAoYXJncykgeworCQl2YXIgZm9ybSA9IGRvam8uYnlJZChhcmdzLmZvcm1Ob2RlKTsKKwkJaWYgKCFmb3JtIHx8ICFmb3JtLnRhZ05hbWUgfHwgZm9ybS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gImZvcm0iKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIkZvcm1CaW5kOiBDb3VsZG4ndCBhcHBseSwgaW52YWxpZCBmb3JtIik7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5mb3JtID09IGZvcm0pIHsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLmZvcm0pIHsKKwkJCQkJdGhyb3cgbmV3IEVycm9yKCJGb3JtQmluZDogQWxyZWFkeSBhcHBsaWVkIHRvIGEgZm9ybSIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlkb2pvLmxhbmcubWl4aW4odGhpcy5iaW5kQXJncywgYXJncyk7CisJCXRoaXMuZm9ybSA9IGZvcm07CisJCXRoaXMuY29ubmVjdChmb3JtLCAib25zdWJtaXQiLCAic3VibWl0Iik7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZm9ybS5lbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIG5vZGUgPSBmb3JtLmVsZW1lbnRzW2ldOworCQkJaWYgKG5vZGUgJiYgbm9kZS50eXBlICYmIGRvam8ubGFuZy5pbkFycmF5KFsic3VibWl0IiwgImJ1dHRvbiJdLCBub2RlLnR5cGUudG9Mb3dlckNhc2UoKSkpIHsKKwkJCQl0aGlzLmNvbm5lY3Qobm9kZSwgIm9uY2xpY2siLCAiY2xpY2siKTsKKwkJCX0KKwkJfQorCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBpbnB1dCA9IGlucHV0c1tpXTsKKwkJCWlmIChpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCkgPT0gImltYWdlIiAmJiBpbnB1dC5mb3JtID09IGZvcm0pIHsKKwkJCQl0aGlzLmNvbm5lY3QoaW5wdXQsICJvbmNsaWNrIiwgImNsaWNrIik7CisJCQl9CisJCX0KKwl9LCBvblN1Ym1pdDpmdW5jdGlvbiAoZm9ybSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9LCBzdWJtaXQ6ZnVuY3Rpb24gKGUpIHsKKwkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQlpZiAodGhpcy5vblN1Ym1pdCh0aGlzLmZvcm0pKSB7CisJCQlkb2pvLmlvLmJpbmQoZG9qby5sYW5nLm1peGluKHRoaXMuYmluZEFyZ3MsIHtmb3JtRmlsdGVyOmRvam8ubGFuZy5oaXRjaCh0aGlzLCAiZm9ybUZpbHRlciIpfSkpOworCQl9CisJfSwgY2xpY2s6ZnVuY3Rpb24gKGUpIHsKKwkJdmFyIG5vZGUgPSBlLmN1cnJlbnRUYXJnZXQ7CisJCWlmIChub2RlLmRpc2FibGVkKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5jbGlja2VkQnV0dG9uID0gbm9kZTsKKwl9LCBmb3JtRmlsdGVyOmZ1bmN0aW9uIChub2RlKSB7CisJCXZhciB0eXBlID0gKG5vZGUudHlwZSB8fCAiIikudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGFjY2VwdCA9IGZhbHNlOworCQlpZiAobm9kZS5kaXNhYmxlZCB8fCAhbm9kZS5uYW1lKSB7CisJCQlhY2NlcHQgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsICJidXR0b24iLCAiaW1hZ2UiXSwgdHlwZSkpIHsKKwkJCQlpZiAoIXRoaXMuY2xpY2tlZEJ1dHRvbikgeworCQkJCQl0aGlzLmNsaWNrZWRCdXR0b24gPSBub2RlOworCQkJCX0KKwkJCQlhY2NlcHQgPSBub2RlID09IHRoaXMuY2xpY2tlZEJ1dHRvbjsKKwkJCX0gZWxzZSB7CisJCQkJYWNjZXB0ID0gIWRvam8ubGFuZy5pbkFycmF5KFsiZmlsZSIsICJzdWJtaXQiLCAicmVzZXQiLCAiYnV0dG9uIl0sIHR5cGUpOworCQkJfQorCQl9CisJCXJldHVybiBhY2NlcHQ7CisJfSwgY29ubmVjdDpmdW5jdGlvbiAoc3JjT2JqLCBzcmNGY24sIHRhcmdldEZjbikgeworCQlpZiAoZG9qby5ldmFsT2JqUGF0aCgiZG9qby5ldmVudC5jb25uZWN0IikpIHsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChzcmNPYmosIHNyY0ZjbiwgdGhpcywgdGFyZ2V0RmNuKTsKKwkJfSBlbHNlIHsKKwkJCXZhciBmY24gPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGFyZ2V0RmNuKTsKKwkJCXNyY09ialtzcmNGY25dID0gZnVuY3Rpb24gKGUpIHsKKwkJCQlpZiAoIWUpIHsKKwkJCQkJZSA9IHdpbmRvdy5ldmVudDsKKwkJCQl9CisJCQkJaWYgKCFlLmN1cnJlbnRUYXJnZXQpIHsKKwkJCQkJZS5jdXJyZW50VGFyZ2V0ID0gZS5zcmNFbGVtZW50OworCQkJCX0KKwkJCQlpZiAoIWUucHJldmVudERlZmF1bHQpIHsKKwkJCQkJZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHsKKwkJCQkJCXdpbmRvdy5ldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQkJCQl9OworCQkJCX0KKwkJCQlmY24oZSk7CisJCQl9OworCQl9CisJfX0pOworCWRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJCXZhciBfdGhpcyA9IHRoaXM7CisJCXZhciBfY2FjaGUgPSB7fTsKKwkJdGhpcy51c2VDYWNoZSA9IGZhbHNlOworCQl0aGlzLnByZXZlbnRDYWNoZSA9IGZhbHNlOworCQlmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIHF1ZXJ5LCBtZXRob2QpIHsKKwkJCXJldHVybiB1cmwgKyAifCIgKyBxdWVyeSArICJ8IiArIG1ldGhvZC50b0xvd2VyQ2FzZSgpOworCQl9CisJCWZ1bmN0aW9uIGFkZFRvQ2FjaGUodXJsLCBxdWVyeSwgbWV0aG9kLCBodHRwKSB7CisJCQlfY2FjaGVbZ2V0Q2FjaGVLZXkodXJsLCBxdWVyeSwgbWV0aG9kKV0gPSBodHRwOworCQl9CisJCWZ1bmN0aW9uIGdldEZyb21DYWNoZSh1cmwsIHF1ZXJ5LCBtZXRob2QpIHsKKwkJCXJldHVybiBfY2FjaGVbZ2V0Q2FjaGVLZXkodXJsLCBxdWVyeSwgbWV0aG9kKV07CisJCX0KKwkJdGhpcy5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeworCQkJX2NhY2hlID0ge307CisJCX07CisJCWZ1bmN0aW9uIGRvTG9hZChrd0FyZ3MsIGh0dHAsIHVybCwgcXVlcnksIHVzZUNhY2hlKSB7CisJCQlpZiAoKChodHRwLnN0YXR1cyA+PSAyMDApICYmIChodHRwLnN0YXR1cyA8IDMwMCkpIHx8IChodHRwLnN0YXR1cyA9PSAzMDQpIHx8IChodHRwLnN0YXR1cyA9PSAxMjIzKSB8fCAobG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiAmJiAoaHR0cC5zdGF0dXMgPT0gMCB8fCBodHRwLnN0YXR1cyA9PSB1bmRlZmluZWQpKSB8fCAobG9jYXRpb24ucHJvdG9jb2wgPT0gImNocm9tZToiICYmIChodHRwLnN0YXR1cyA9PSAwIHx8IGh0dHAuc3RhdHVzID09IHVuZGVmaW5lZCkpKSB7CisJCQkJdmFyIHJldDsKKwkJCQlpZiAoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJoZWFkIikgeworCQkJCQl2YXIgaGVhZGVycyA9IGh0dHAuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisJCQkJCXJldCA9IHt9OworCQkJCQlyZXQudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisJCQkJCQlyZXR1cm4gaGVhZGVyczsKKwkJCQkJfTsKKwkJCQkJdmFyIHZhbHVlcyA9IGhlYWRlcnMuc3BsaXQoL1tcclxuXSsvZyk7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQl2YXIgcGFpciA9IHZhbHVlc1tpXS5tYXRjaCgvXihbXjpdKylccyo6XHMqKC4rKSQvaSk7CisJCQkJCQlpZiAocGFpcikgeworCQkJCQkJCXJldFtwYWlyWzFdXSA9IHBhaXJbMl07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoa3dBcmdzLm1pbWV0eXBlID09ICJ0ZXh0L2phdmFzY3JpcHQiKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXJldCA9IGRqX2V2YWwoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJCQlkb2pvLmRlYnVnKGUpOworCQkJCQkJCWRvam8uZGVidWcoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCQkJCXJldCA9IG51bGw7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoa3dBcmdzLm1pbWV0eXBlLnN1YnN0cigwLCA5KSA9PSAidGV4dC9qc29uIiB8fCBrd0FyZ3MubWltZXR5cGUuc3Vic3RyKDAsIDE2KSA9PSAiYXBwbGljYXRpb24vanNvbiIpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlyZXQgPSBkal9ldmFsKCIoIiArIGt3QXJncy5qc29uRmlsdGVyKGh0dHAucmVzcG9uc2VUZXh0KSArICIpIik7CisJCQkJCQkJfQorCQkJCQkJCWNhdGNoIChlKSB7CisJCQkJCQkJCWRvam8uZGVidWcoZSk7CisJCQkJCQkJCWRvam8uZGVidWcoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCQkJCQlyZXQgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICgoa3dBcmdzLm1pbWV0eXBlID09ICJhcHBsaWNhdGlvbi94bWwiKSB8fCAoa3dBcmdzLm1pbWV0eXBlID09ICJ0ZXh0L3htbCIpKSB7CisJCQkJCQkJCXJldCA9IGh0dHAucmVzcG9uc2VYTUw7CisJCQkJCQkJCWlmICghcmV0IHx8IHR5cGVvZiByZXQgPT0gInN0cmluZyIgfHwgIWh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKSB7CisJCQkJCQkJCQlyZXQgPSBkb2pvLmRvbS5jcmVhdGVEb2N1bWVudEZyb21UZXh0KGh0dHAucmVzcG9uc2VUZXh0KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXJldCA9IGh0dHAucmVzcG9uc2VUZXh0OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodXNlQ2FjaGUpIHsKKwkJCQkJYWRkVG9DYWNoZSh1cmwsIHF1ZXJ5LCBrd0FyZ3MubWV0aG9kLCBodHRwKTsKKwkJCQl9CisJCQkJa3dBcmdzWyh0eXBlb2Yga3dBcmdzLmxvYWQgPT0gImZ1bmN0aW9uIikgPyAibG9hZCIgOiAiaGFuZGxlIl0oImxvYWQiLCByZXQsIGh0dHAsIGt3QXJncyk7CisJCQl9IGVsc2UgeworCQkJCXZhciBlcnJPYmogPSBuZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydCBFcnJvcjogIiArIGh0dHAuc3RhdHVzICsgIiAiICsgaHR0cC5zdGF0dXNUZXh0KTsKKwkJCQlrd0FyZ3NbKHR5cGVvZiBrd0FyZ3MuZXJyb3IgPT0gImZ1bmN0aW9uIikgPyAiZXJyb3IiIDogImhhbmRsZSJdKCJlcnJvciIsIGVyck9iaiwgaHR0cCwga3dBcmdzKTsKKwkJCX0KKwkJfQorCQlmdW5jdGlvbiBzZXRIZWFkZXJzKGh0dHAsIGt3QXJncykgeworCQkJaWYgKGt3QXJnc1siaGVhZGVycyJdKSB7CisJCQkJZm9yICh2YXIgaGVhZGVyIGluIGt3QXJnc1siaGVhZGVycyJdKSB7CisJCQkJCWlmIChoZWFkZXIudG9Mb3dlckNhc2UoKSA9PSAiY29udGVudC10eXBlIiAmJiAha3dBcmdzWyJjb250ZW50VHlwZSJdKSB7CisJCQkJCQlrd0FyZ3NbImNvbnRlbnRUeXBlIl0gPSBrd0FyZ3NbImhlYWRlcnMiXVtoZWFkZXJdOworCQkJCQl9IGVsc2UgeworCQkJCQkJaHR0cC5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwga3dBcmdzWyJoZWFkZXJzIl1baGVhZGVyXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5pbkZsaWdodCA9IFtdOworCQl0aGlzLmluRmxpZ2h0VGltZXIgPSBudWxsOworCQl0aGlzLnN0YXJ0V2F0Y2hpbmdJbkZsaWdodCA9IGZ1bmN0aW9uICgpIHsKKwkJCWlmICghdGhpcy5pbkZsaWdodFRpbWVyKSB7CisJCQkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMCk7CisJCQl9CisJCX07CisJCXRoaXMud2F0Y2hJbkZsaWdodCA9IGZ1bmN0aW9uICgpIHsKKwkJCXZhciBub3cgPSBudWxsOworCQkJaWYgKCFkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgJiYgIV90aGlzLl9ibG9ja0FzeW5jKSB7CisJCQkJZm9yICh2YXIgeCA9IHRoaXMuaW5GbGlnaHQubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXZhciB0aWYgPSB0aGlzLmluRmxpZ2h0W3hdOworCQkJCQkJaWYgKCF0aWYgfHwgdGlmLmh0dHAuX2Fib3J0ZWQgfHwgIXRpZi5odHRwLnJlYWR5U3RhdGUpIHsKKwkJCQkJCQl0aGlzLmluRmxpZ2h0LnNwbGljZSh4LCAxKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWlmICg0ID09IHRpZi5odHRwLnJlYWR5U3RhdGUpIHsKKwkJCQkJCQl0aGlzLmluRmxpZ2h0LnNwbGljZSh4LCAxKTsKKwkJCQkJCQlkb0xvYWQodGlmLnJlcSwgdGlmLmh0dHAsIHRpZi51cmwsIHRpZi5xdWVyeSwgdGlmLnVzZUNhY2hlKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHRpZi5zdGFydFRpbWUpIHsKKwkJCQkJCQkJaWYgKCFub3cpIHsKKwkJCQkJCQkJCW5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHRpZi5zdGFydFRpbWUgKyAodGlmLnJlcS50aW1lb3V0U2Vjb25kcyAqIDEwMDApIDwgbm93KSB7CisJCQkJCQkJCQlpZiAodHlwZW9mIHRpZi5odHRwLmFib3J0ID09ICJmdW5jdGlvbiIpIHsKKwkJCQkJCQkJCQl0aWYuaHR0cC5hYm9ydCgpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJdGhpcy5pbkZsaWdodC5zcGxpY2UoeCwgMSk7CisJCQkJCQkJCQl0aWYucmVxWyh0eXBlb2YgdGlmLnJlcS50aW1lb3V0ID09ICJmdW5jdGlvbiIpID8gInRpbWVvdXQiIDogImhhbmRsZSJdKCJ0aW1lb3V0IiwgbnVsbCwgdGlmLmh0dHAsIHRpZi5yZXEpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWNhdGNoIChlKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXZhciBlcnJPYmogPSBuZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0IEVycm9yOiAiICsgZSk7CisJCQkJCQkJdGlmLnJlcVsodHlwZW9mIHRpZi5yZXEuZXJyb3IgPT0gImZ1bmN0aW9uIikgPyAiZXJyb3IiIDogImhhbmRsZSJdKCJlcnJvciIsIGVyck9iaiwgdGlmLmh0dHAsIHRpZi5yZXEpOworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKGUyKSB7CisJCQkJCQkJZG9qby5kZWJ1ZygiWE1MSHR0cFRyYW5zcG9ydCBlcnJvciBjYWxsYmFjayBmYWlsZWQ6ICIgKyBlMik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljbGVhclRpbWVvdXQodGhpcy5pbkZsaWdodFRpbWVyKTsKKwkJCWlmICh0aGlzLmluRmxpZ2h0Lmxlbmd0aCA9PSAwKSB7CisJCQkJdGhpcy5pbkZsaWdodFRpbWVyID0gbnVsbDsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzLmluRmxpZ2h0VGltZXIgPSBzZXRUaW1lb3V0KCJkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQud2F0Y2hJbkZsaWdodCgpOyIsIDEwKTsKKwkJfTsKKwkJdmFyIGhhc1htbEh0dHAgPSBkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCgpID8gdHJ1ZSA6IGZhbHNlOworCQl0aGlzLmNhbkhhbmRsZSA9IGZ1bmN0aW9uIChrd0FyZ3MpIHsKKwkJCXZhciBtbGMgPSBrd0FyZ3NbIm1pbWV0eXBlIl0udG9Mb3dlckNhc2UoKSB8fCAiIjsKKwkJCXJldHVybiBoYXNYbWxIdHRwICYmICgoZG9qby5sYW5nLmluQXJyYXkoWyJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAidGV4dC9qYXZhc2NyaXB0Il0sIG1sYykpIHx8IChtbGMuc3Vic3RyKDAsIDkpID09ICJ0ZXh0L2pzb24iIHx8IG1sYy5zdWJzdHIoMCwgMTYpID09ICJhcHBsaWNhdGlvbi9qc29uIikpICYmICEoa3dBcmdzWyJmb3JtTm9kZSJdICYmIGRvam8uaW8uZm9ybUhhc0ZpbGUoa3dBcmdzWyJmb3JtTm9kZSJdKSk7CisJCX07CisJCXRoaXMubXVsdGlwYXJ0Qm91bmRhcnkgPSAiNDUzMDlGRkYtQkQ2NS00ZDUwLTk5QzktMzY5ODY4OTZBOTZGIjsKKwkJdGhpcy5iaW5kID0gZnVuY3Rpb24gKGt3QXJncykgeworCQkJaWYgKCFrd0FyZ3NbInVybCJdKSB7CisJCQkJaWYgKCFrd0FyZ3NbImZvcm1Ob2RlIl0gJiYgKGt3QXJnc1siYmFja0J1dHRvbiJdIHx8IGt3QXJnc1siYmFjayJdIHx8IGt3QXJnc1siY2hhbmdlVXJsIl0gfHwga3dBcmdzWyJ3YXRjaEZvclVSTCJdKSAmJiAoIWRqQ29uZmlnLnByZXZlbnRCYWNrQnV0dG9uRml4KSkgeworCQkJCQlkb2pvLmRlcHJlY2F0ZWQoIlVzaW5nIGRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydC5iaW5kKCkgdG8gYWRkIHRvIGJyb3dzZXIgaGlzdG9yeSB3aXRob3V0IGRvaW5nIGFuIElPIHJlcXVlc3QiLCAiVXNlIGRvam8udW5kby5icm93c2VyLmFkZFRvSGlzdG9yeSgpIGluc3RlYWQuIiwgIjAuNCIpOworCQkJCQlkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3Rvcnkoa3dBcmdzKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJdmFyIHVybCA9IGt3QXJncy51cmw7CisJCQl2YXIgcXVlcnkgPSAiIjsKKwkJCWlmIChrd0FyZ3NbImZvcm1Ob2RlIl0pIHsKKwkJCQl2YXIgdGEgPSBrd0FyZ3MuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTsKKwkJCQlpZiAoKHRhKSAmJiAoIWt3QXJnc1sidXJsIl0pKSB7CisJCQkJCXVybCA9IHRhOworCQkJCX0KKwkJCQl2YXIgdHAgPSBrd0FyZ3MuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJtZXRob2QiKTsKKwkJCQlpZiAoKHRwKSAmJiAoIWt3QXJnc1sibWV0aG9kIl0pKSB7CisJCQkJCWt3QXJncy5tZXRob2QgPSB0cDsKKwkJCQl9CisJCQkJcXVlcnkgKz0gZG9qby5pby5lbmNvZGVGb3JtKGt3QXJncy5mb3JtTm9kZSwga3dBcmdzLmVuY29kaW5nLCBrd0FyZ3NbImZvcm1GaWx0ZXIiXSk7CisJCQl9CisJCQlpZiAodXJsLmluZGV4T2YoIiMiKSA+IC0xKSB7CisJCQkJZG9qby5kZWJ1ZygiV2FybmluZzogZG9qby5pby5iaW5kOiBzdHJpcHBpbmcgaGFzaCB2YWx1ZXMgZnJvbSB1cmw6IiwgdXJsKTsKKwkJCQl1cmwgPSB1cmwuc3BsaXQoIiMiKVswXTsKKwkJCX0KKwkJCWlmIChrd0FyZ3NbImZpbGUiXSkgeworCQkJCWt3QXJncy5tZXRob2QgPSAicG9zdCI7CisJCQl9CisJCQlpZiAoIWt3QXJnc1sibWV0aG9kIl0pIHsKKwkJCQlrd0FyZ3MubWV0aG9kID0gImdldCI7CisJCQl9CisJCQlpZiAoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJnZXQiKSB7CisJCQkJa3dBcmdzLm11bHRpcGFydCA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoa3dBcmdzWyJmaWxlIl0pIHsKKwkJCQkJa3dBcmdzLm11bHRpcGFydCA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFrd0FyZ3NbIm11bHRpcGFydCJdKSB7CisJCQkJCQlrd0FyZ3MubXVsdGlwYXJ0ID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoa3dBcmdzWyJiYWNrQnV0dG9uIl0gfHwga3dBcmdzWyJiYWNrIl0gfHwga3dBcmdzWyJjaGFuZ2VVcmwiXSkgeworCQkJCWRvam8udW5kby5icm93c2VyLmFkZFRvSGlzdG9yeShrd0FyZ3MpOworCQkJfQorCQkJdmFyIGNvbnRlbnQgPSBrd0FyZ3NbImNvbnRlbnQiXSB8fCB7fTsKKwkJCWlmIChrd0FyZ3Muc2VuZFRyYW5zcG9ydCkgeworCQkJCWNvbnRlbnRbImRvam8udHJhbnNwb3J0Il0gPSAieG1saHR0cCI7CisJCQl9CisJCQlkbyB7CisJCQkJaWYgKGt3QXJncy5wb3N0Q29udGVudCkgeworCQkJCQlxdWVyeSA9IGt3QXJncy5wb3N0Q29udGVudDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChjb250ZW50KSB7CisJCQkJCXF1ZXJ5ICs9IGRvam8uaW8uYXJnc0Zyb21NYXAoY29udGVudCwga3dBcmdzLmVuY29kaW5nKTsKKwkJCQl9CisJCQkJaWYgKGt3QXJncy5tZXRob2QudG9Mb3dlckNhc2UoKSA9PSAiZ2V0IiB8fCAha3dBcmdzLm11bHRpcGFydCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdmFyIHQgPSBbXTsKKwkJCQlpZiAocXVlcnkubGVuZ3RoKSB7CisJCQkJCXZhciBxID0gcXVlcnkuc3BsaXQoIiYiKTsKKwkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgKytpKSB7CisJCQkJCQlpZiAocVtpXS5sZW5ndGgpIHsKKwkJCQkJCQl2YXIgcCA9IHFbaV0uc3BsaXQoIj0iKTsKKwkJCQkJCQl0LnB1c2goIi0tIiArIHRoaXMubXVsdGlwYXJ0Qm91bmRhcnksICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgcFswXSArICJcIiIsICIiLCBwWzFdKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoa3dBcmdzLmZpbGUpIHsKKwkJCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KGt3QXJncy5maWxlKSkgeworCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBrd0FyZ3MuZmlsZS5sZW5ndGg7ICsraSkgeworCQkJCQkJCXZhciBvID0ga3dBcmdzLmZpbGVbaV07CisJCQkJCQkJdC5wdXNoKCItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LCAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG8ubmFtZSArICJcIjsgZmlsZW5hbWU9XCIiICsgKCJmaWxlTmFtZSIgaW4gbyA/IG8uZmlsZU5hbWUgOiBvLm5hbWUpICsgIlwiIiwgIkNvbnRlbnQtVHlwZTogIiArICgiY29udGVudFR5cGUiIGluIG8gPyBvLmNvbnRlbnRUeXBlIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLCAiIiwgby5jb250ZW50KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZhciBvID0ga3dBcmdzLmZpbGU7CisJCQkJCQl0LnB1c2goIi0tIiArIHRoaXMubXVsdGlwYXJ0Qm91bmRhcnksICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgby5uYW1lICsgIlwiOyBmaWxlbmFtZT1cIiIgKyAoImZpbGVOYW1lIiBpbiBvID8gby5maWxlTmFtZSA6IG8ubmFtZSkgKyAiXCIiLCAiQ29udGVudC1UeXBlOiAiICsgKCJjb250ZW50VHlwZSIgaW4gbyA/IG8uY29udGVudFR5cGUgOiAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiksICIiLCBvLmNvbnRlbnQpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh0Lmxlbmd0aCkgeworCQkJCQl0LnB1c2goIi0tIiArIHRoaXMubXVsdGlwYXJ0Qm91bmRhcnkgKyAiLS0iLCAiIik7CisJCQkJCXF1ZXJ5ID0gdC5qb2luKCJcclxuIik7CisJCQkJfQorCQkJfSB3aGlsZSAoZmFsc2UpOworCQkJdmFyIGFzeW5jID0ga3dBcmdzWyJzeW5jIl0gPyBmYWxzZSA6IHRydWU7CisJCQl2YXIgcHJldmVudENhY2hlID0ga3dBcmdzWyJwcmV2ZW50Q2FjaGUiXSB8fCAodGhpcy5wcmV2ZW50Q2FjaGUgPT0gdHJ1ZSAmJiBrd0FyZ3NbInByZXZlbnRDYWNoZSJdICE9IGZhbHNlKTsKKwkJCXZhciB1c2VDYWNoZSA9IGt3QXJnc1sidXNlQ2FjaGUiXSA9PSB0cnVlIHx8ICh0aGlzLnVzZUNhY2hlID09IHRydWUgJiYga3dBcmdzWyJ1c2VDYWNoZSJdICE9IGZhbHNlKTsKKwkJCWlmICghcHJldmVudENhY2hlICYmIHVzZUNhY2hlKSB7CisJCQkJdmFyIGNhY2hlZEh0dHAgPSBnZXRGcm9tQ2FjaGUodXJsLCBxdWVyeSwga3dBcmdzLm1ldGhvZCk7CisJCQkJaWYgKGNhY2hlZEh0dHApIHsKKwkJCQkJZG9Mb2FkKGt3QXJncywgY2FjaGVkSHR0cCwgdXJsLCBxdWVyeSwgZmFsc2UpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJdmFyIGh0dHAgPSBkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdChrd0FyZ3MpOworCQkJdmFyIHJlY2VpdmVkID0gZmFsc2U7CisJCQlpZiAoYXN5bmMpIHsKKwkJCQl2YXIgc3RhcnRUaW1lID0gdGhpcy5pbkZsaWdodC5wdXNoKHsicmVxIjprd0FyZ3MsICJodHRwIjpodHRwLCAidXJsIjp1cmwsICJxdWVyeSI6cXVlcnksICJ1c2VDYWNoZSI6dXNlQ2FjaGUsICJzdGFydFRpbWUiOmt3QXJncy50aW1lb3V0U2Vjb25kcyA/IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgOiAwfSk7CisJCQkJdGhpcy5zdGFydFdhdGNoaW5nSW5GbGlnaHQoKTsKKwkJCX0gZWxzZSB7CisJCQkJX3RoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOworCQkJfQorCQkJaWYgKGt3QXJncy5tZXRob2QudG9Mb3dlckNhc2UoKSA9PSAicG9zdCIpIHsKKwkJCQlpZiAoIWt3QXJncy51c2VyKSB7CisJCQkJCWh0dHAub3BlbigiUE9TVCIsIHVybCwgYXN5bmMpOworCQkJCX0gZWxzZSB7CisJCQkJCWh0dHAub3BlbigiUE9TVCIsIHVybCwgYXN5bmMsIGt3QXJncy51c2VyLCBrd0FyZ3MucGFzc3dvcmQpOworCQkJCX0KKwkJCQlzZXRIZWFkZXJzKGh0dHAsIGt3QXJncyk7CisJCQkJaHR0cC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBrd0FyZ3MubXVsdGlwYXJ0ID8gKCJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iICsgdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSkgOiAoa3dBcmdzLmNvbnRlbnRUeXBlIHx8ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSk7CisJCQkJdHJ5IHsKKwkJCQkJaHR0cC5zZW5kKHF1ZXJ5KTsKKwkJCQl9CisJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJaWYgKHR5cGVvZiBodHRwLmFib3J0ID09ICJmdW5jdGlvbiIpIHsKKwkJCQkJCWh0dHAuYWJvcnQoKTsKKwkJCQkJfQorCQkJCQlkb0xvYWQoa3dBcmdzLCB7c3RhdHVzOjQwNH0sIHVybCwgcXVlcnksIHVzZUNhY2hlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZhciB0bXBVcmwgPSB1cmw7CisJCQkJaWYgKHF1ZXJ5ICE9ICIiKSB7CisJCQkJCXRtcFVybCArPSAodG1wVXJsLmluZGV4T2YoIj8iKSA+IC0xID8gIiYiIDogIj8iKSArIHF1ZXJ5OworCQkJCX0KKwkJCQlpZiAocHJldmVudENhY2hlKSB7CisJCQkJCXRtcFVybCArPSAoZG9qby5zdHJpbmcuZW5kc1dpdGhBbnkodG1wVXJsLCAiPyIsICImIikgPyAiIiA6ICh0bXBVcmwuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpKSArICJkb2pvLnByZXZlbnRDYWNoZT0iICsgbmV3IERhdGUoKS52YWx1ZU9mKCk7CisJCQkJfQorCQkJCWlmICgha3dBcmdzLnVzZXIpIHsKKwkJCQkJaHR0cC5vcGVuKGt3QXJncy5tZXRob2QudG9VcHBlckNhc2UoKSwgdG1wVXJsLCBhc3luYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaHR0cC5vcGVuKGt3QXJncy5tZXRob2QudG9VcHBlckNhc2UoKSwgdG1wVXJsLCBhc3luYywga3dBcmdzLnVzZXIsIGt3QXJncy5wYXNzd29yZCk7CisJCQkJfQorCQkJCXNldEhlYWRlcnMoaHR0cCwga3dBcmdzKTsKKwkJCQl0cnkgeworCQkJCQlodHRwLnNlbmQobnVsbCk7CisJCQkJfQorCQkJCWNhdGNoIChlKSB7CisJCQkJCWlmICh0eXBlb2YgaHR0cC5hYm9ydCA9PSAiZnVuY3Rpb24iKSB7CisJCQkJCQlodHRwLmFib3J0KCk7CisJCQkJCX0KKwkJCQkJZG9Mb2FkKGt3QXJncywge3N0YXR1czo0MDR9LCB1cmwsIHF1ZXJ5LCB1c2VDYWNoZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKCFhc3luYykgeworCQkJCWRvTG9hZChrd0FyZ3MsIGh0dHAsIHVybCwgcXVlcnksIHVzZUNhY2hlKTsKKwkJCQlfdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQkJfQorCQkJa3dBcmdzLmFib3J0ID0gZnVuY3Rpb24gKCkgeworCQkJCXRyeSB7CisJCQkJCWh0dHAuX2Fib3J0ZWQgPSB0cnVlOworCQkJCX0KKwkJCQljYXRjaCAoZSkgeworCQkJCX0KKwkJCQlyZXR1cm4gaHR0cC5hYm9ydCgpOworCQkJfTsKKwkJCXJldHVybjsKKwkJfTsKKwkJZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCgiWE1MSFRUUFRyYW5zcG9ydCIpOworCX07Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9JZnJhbWVJTy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9JZnJhbWVJTy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI2ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL0lmcmFtZUlPLmpzCkBAIC0wLDAgKzEsMjE0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmlvLklmcmFtZUlPIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uQnJvd3NlcklPIik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLioiKTsKK2Rvam8uaW8uY3JlYXRlSUZyYW1lID0gZnVuY3Rpb24gKGZuYW1lLCBvbmxvYWRzdHIsIHVyaSkgeworCWlmICh3aW5kb3dbZm5hbWVdKSB7CisJCXJldHVybiB3aW5kb3dbZm5hbWVdOworCX0KKwlpZiAod2luZG93LmZyYW1lc1tmbmFtZV0pIHsKKwkJcmV0dXJuIHdpbmRvdy5mcmFtZXNbZm5hbWVdOworCX0KKwl2YXIgciA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGNmcmFtZSA9IG51bGw7CisJdmFyIHR1cmkgPSB1cmk7CisJaWYgKCF0dXJpKSB7CisJCWlmIChkakNvbmZpZ1sidXNlWERvbWFpbiJdICYmICFkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSkgeworCQkJZG9qby5kZWJ1ZygiZG9qby5pby5jcmVhdGVJRnJhbWU6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIgKyAiIHBsZWFzZSBzYXZlIGlmcmFtZV9oaXN0b3J5Lmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvSWZyYW1lSGlzdG9yeVVybCIgKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIGlmcmFtZV9oaXN0b3J5Lmh0bWwiKTsKKwkJfQorCQl0dXJpID0gKGRqQ29uZmlnWyJkb2pvSWZyYW1lSGlzdG9yeVVybCJdIHx8IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qbyIsICIuLi9pZnJhbWVfaGlzdG9yeS5odG1sIikpICsgIiNub0luaXQ9dHJ1ZSI7CisJfQorCXZhciBpZnJzdHIgPSAoKHIuaWUpICYmIChkb2pvLnJlbmRlci5vcy53aW4pKSA/ICI8aWZyYW1lIG5hbWU9XCIiICsgZm5hbWUgKyAiXCIgc3JjPVwiIiArIHR1cmkgKyAiXCIgb25sb2FkPVwiIiArIG9ubG9hZHN0ciArICJcIj4iIDogImlmcmFtZSI7CisJY2ZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpZnJzdHIpOworCXdpdGggKGNmcmFtZSkgeworCQluYW1lID0gZm5hbWU7CisJCXNldEF0dHJpYnV0ZSgibmFtZSIsIGZuYW1lKTsKKwkJaWQgPSBmbmFtZTsKKwl9CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQoY2ZyYW1lKTsKKwl3aW5kb3dbZm5hbWVdID0gY2ZyYW1lOworCXdpdGggKGNmcmFtZS5zdHlsZSkgeworCQlpZiAoIXIuc2FmYXJpKSB7CisJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCX0KKwkJbGVmdCA9IHRvcCA9ICIwcHgiOworCQloZWlnaHQgPSB3aWR0aCA9ICIxcHgiOworCQl2aXNpYmlsaXR5ID0gImhpZGRlbiI7CisJfQorCWlmICghci5pZSkgeworCQlkb2pvLmlvLnNldElGcmFtZVNyYyhjZnJhbWUsIHR1cmksIHRydWUpOworCQljZnJhbWUub25sb2FkID0gbmV3IEZ1bmN0aW9uKG9ubG9hZHN0cik7CisJfQorCXJldHVybiBjZnJhbWU7Cit9OworZG9qby5pby5JZnJhbWVUcmFuc3BvcnQgPSBuZXcgZnVuY3Rpb24gKCkgeworCXZhciBfdGhpcyA9IHRoaXM7CisJdGhpcy5jdXJyZW50UmVxdWVzdCA9IG51bGw7CisJdGhpcy5yZXF1ZXN0UXVldWUgPSBbXTsKKwl0aGlzLmlmcmFtZU5hbWUgPSAiZG9qb0lvSWZyYW1lIjsKKwl0aGlzLmZpcmVOZXh0UmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKKwkJdHJ5IHsKKwkJCWlmICgodGhpcy5jdXJyZW50UmVxdWVzdCkgfHwgKHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCA9PSAwKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXZhciBjciA9IHRoaXMuY3VycmVudFJlcXVlc3QgPSB0aGlzLnJlcXVlc3RRdWV1ZS5zaGlmdCgpOworCQkJY3IuX2NvbnRlbnRUb0NsZWFuID0gW107CisJCQl2YXIgZm4gPSBjclsiZm9ybU5vZGUiXTsKKwkJCXZhciBjb250ZW50ID0gY3JbImNvbnRlbnQiXSB8fCB7fTsKKwkJCWlmIChjci5zZW5kVHJhbnNwb3J0KSB7CisJCQkJY29udGVudFsiZG9qby50cmFuc3BvcnQiXSA9ICJpZnJhbWUiOworCQkJfQorCQkJaWYgKGZuKSB7CisJCQkJaWYgKGNvbnRlbnQpIHsKKwkJCQkJZm9yICh2YXIgeCBpbiBjb250ZW50KSB7CisJCQkJCQlpZiAoIWZuW3hdKSB7CisJCQkJCQkJdmFyIHRuOworCQkJCQkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJCQkJCXRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nIiArIHggKyAiJyB2YWx1ZT0nIiArIGNvbnRlbnRbeF0gKyAiJz4iKTsKKwkJCQkJCQkJZm4uYXBwZW5kQ2hpbGQodG4pOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKwkJCQkJCQkJZm4uYXBwZW5kQ2hpbGQodG4pOworCQkJCQkJCQl0bi50eXBlID0gImhpZGRlbiI7CisJCQkJCQkJCXRuLm5hbWUgPSB4OworCQkJCQkJCQl0bi52YWx1ZSA9IGNvbnRlbnRbeF07CisJCQkJCQkJfQorCQkJCQkJCWNyLl9jb250ZW50VG9DbGVhbi5wdXNoKHgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmblt4XS52YWx1ZSA9IGNvbnRlbnRbeF07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGNyWyJ1cmwiXSkgeworCQkJCQljci5fb3JpZ2luYWxBY3Rpb24gPSBmbi5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpOworCQkJCQlmbi5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsIGNyLnVybCk7CisJCQkJfQorCQkJCWlmICghZm4uZ2V0QXR0cmlidXRlKCJtZXRob2QiKSkgeworCQkJCQlmbi5zZXRBdHRyaWJ1dGUoIm1ldGhvZCIsIChjclsibWV0aG9kIl0pID8gY3JbIm1ldGhvZCJdIDogInBvc3QiKTsKKwkJCQl9CisJCQkJY3IuX29yaWdpbmFsVGFyZ2V0ID0gZm4uZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKTsKKwkJCQlmbi5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIHRoaXMuaWZyYW1lTmFtZSk7CisJCQkJZm4udGFyZ2V0ID0gdGhpcy5pZnJhbWVOYW1lOworCQkJCWZuLnN1Ym1pdCgpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgcXVlcnkgPSBkb2pvLmlvLmFyZ3NGcm9tTWFwKHRoaXMuY3VycmVudFJlcXVlc3QuY29udGVudCk7CisJCQkJdmFyIHRtcFVybCA9IGNyLnVybCArIChjci51cmwuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpICsgcXVlcnk7CisJCQkJZG9qby5pby5zZXRJRnJhbWVTcmModGhpcy5pZnJhbWUsIHRtcFVybCwgdHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCXRoaXMuaWZyYW1lT25sb2FkKGUpOworCQl9CisJfTsKKwl0aGlzLmNhbkhhbmRsZSA9IGZ1bmN0aW9uIChrd0FyZ3MpIHsKKwkJcmV0dXJuICgoZG9qby5sYW5nLmluQXJyYXkoWyJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIsICJ0ZXh0L2phdmFzY3JpcHQiLCAidGV4dC9qc29uIiwgImFwcGxpY2F0aW9uL2pzb24iXSwga3dBcmdzWyJtaW1ldHlwZSJdKSkgJiYgKGRvam8ubGFuZy5pbkFycmF5KFsicG9zdCIsICJnZXQiXSwga3dBcmdzWyJtZXRob2QiXS50b0xvd2VyQ2FzZSgpKSkgJiYgKCEoKGt3QXJnc1sic3luYyJdKSAmJiAoa3dBcmdzWyJzeW5jIl0gPT0gdHJ1ZSkpKSk7CisJfTsKKwl0aGlzLmJpbmQgPSBmdW5jdGlvbiAoa3dBcmdzKSB7CisJCWlmICghdGhpc1siaWZyYW1lIl0pIHsKKwkJCXRoaXMuc2V0VXBJZnJhbWUoKTsKKwkJfQorCQl0aGlzLnJlcXVlc3RRdWV1ZS5wdXNoKGt3QXJncyk7CisJCXRoaXMuZmlyZU5leHRSZXF1ZXN0KCk7CisJCXJldHVybjsKKwl9OworCXRoaXMuc2V0VXBJZnJhbWUgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuaWZyYW1lID0gZG9qby5pby5jcmVhdGVJRnJhbWUodGhpcy5pZnJhbWVOYW1lLCAiZG9qby5pby5JZnJhbWVUcmFuc3BvcnQuaWZyYW1lT25sb2FkKCk7Iik7CisJfTsKKwl0aGlzLmlmcmFtZU9ubG9hZCA9IGZ1bmN0aW9uIChlcnJvck9iamVjdCkgeworCQlpZiAoIV90aGlzLmN1cnJlbnRSZXF1ZXN0KSB7CisJCQlfdGhpcy5maXJlTmV4dFJlcXVlc3QoKTsKKwkJCXJldHVybjsKKwkJfQorCQl2YXIgcmVxID0gX3RoaXMuY3VycmVudFJlcXVlc3Q7CisJCWlmIChyZXEuZm9ybU5vZGUpIHsKKwkJCXZhciB0b0NsZWFuID0gcmVxLl9jb250ZW50VG9DbGVhbjsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdG9DbGVhbi5sZW5ndGg7IGkrKykgeworCQkJCXZhciBrZXkgPSB0b0NsZWFuW2ldOworCQkJCWlmIChkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkgeworCQkJCQl2YXIgZk5vZGUgPSByZXEuZm9ybU5vZGU7CisJCQkJCWZvciAodmFyIGogPSAwOyBqIDwgZk5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGorKykgeworCQkJCQkJdmFyIGNoTm9kZSA9IGZOb2RlLmNoaWxkTm9kZXNbal07CisJCQkJCQlpZiAoY2hOb2RlLm5hbWUgPT0ga2V5KSB7CisJCQkJCQkJdmFyIHBOb2RlID0gY2hOb2RlLnBhcmVudE5vZGU7CisJCQkJCQkJcE5vZGUucmVtb3ZlQ2hpbGQoY2hOb2RlKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXZhciBpbnB1dCA9IHJlcS5mb3JtTm9kZVtrZXldOworCQkJCQlyZXEuZm9ybU5vZGUucmVtb3ZlQ2hpbGQoaW5wdXQpOworCQkJCQlyZXEuZm9ybU5vZGVba2V5XSA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlcVsiX29yaWdpbmFsQWN0aW9uIl0pIHsKKwkJCQlyZXEuZm9ybU5vZGUuc2V0QXR0cmlidXRlKCJhY3Rpb24iLCByZXEuX29yaWdpbmFsQWN0aW9uKTsKKwkJCX0KKwkJCWlmIChyZXFbIl9vcmlnaW5hbFRhcmdldCJdKSB7CisJCQkJcmVxLmZvcm1Ob2RlLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgcmVxLl9vcmlnaW5hbFRhcmdldCk7CisJCQkJcmVxLmZvcm1Ob2RlLnRhcmdldCA9IHJlcS5fb3JpZ2luYWxUYXJnZXQ7CisJCQl9CisJCX0KKwkJdmFyIGNvbnRlbnREb2MgPSBmdW5jdGlvbiAoaWZyYW1lX2VsKSB7CisJCQl2YXIgZG9jID0gaWZyYW1lX2VsLmNvbnRlbnREb2N1bWVudCB8fCAoKGlmcmFtZV9lbC5jb250ZW50V2luZG93KSAmJiAoaWZyYW1lX2VsLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpKSB8fCAoKGlmcmFtZV9lbC5uYW1lKSAmJiAoZG9jdW1lbnQuZnJhbWVzW2lmcmFtZV9lbC5uYW1lXSkgJiYgKGRvY3VtZW50LmZyYW1lc1tpZnJhbWVfZWwubmFtZV0uZG9jdW1lbnQpKSB8fCBudWxsOworCQkJcmV0dXJuIGRvYzsKKwkJfTsKKwkJdmFyIHZhbHVlOworCQl2YXIgc3VjY2VzcyA9IGZhbHNlOworCQlpZiAoZXJyb3JPYmplY3QpIHsKKwkJCXRoaXMuX2NhbGxFcnJvcihyZXEsICJJZnJhbWVUcmFuc3BvcnQgUmVxdWVzdCBFcnJvcjogIiArIGVycm9yT2JqZWN0KTsKKwkJfSBlbHNlIHsKKwkJCXZhciBpZmQgPSBjb250ZW50RG9jKF90aGlzLmlmcmFtZSk7CisJCQl0cnkgeworCQkJCXZhciBjbXQgPSByZXEubWltZXR5cGU7CisJCQkJaWYgKChjbXQgPT0gInRleHQvamF2YXNjcmlwdCIpIHx8IChjbXQgPT0gInRleHQvanNvbiIpIHx8IChjbXQgPT0gImFwcGxpY2F0aW9uL2pzb24iKSkgeworCQkJCQl2YXIganMgPSBpZmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHRhcmVhIilbMF0udmFsdWU7CisJCQkJCWlmIChjbXQgPT0gInRleHQvanNvbiIgfHwgY210ID09ICJhcHBsaWNhdGlvbi9qc29uIikgeworCQkJCQkJanMgPSAiKCIgKyBqcyArICIpIjsKKwkJCQkJfQorCQkJCQl2YWx1ZSA9IGRqX2V2YWwoanMpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjbXQgPT0gInRleHQvaHRtbCIpIHsKKwkJCQkJCXZhbHVlID0gaWZkOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFsdWUgPSBpZmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRleHRhcmVhIilbMF0udmFsdWU7CisJCQkJCX0KKwkJCQl9CisJCQkJc3VjY2VzcyA9IHRydWU7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCXRoaXMuX2NhbGxFcnJvcihyZXEsICJJZnJhbWVUcmFuc3BvcnQgRXJyb3I6ICIgKyBlKTsKKwkJCX0KKwkJfQorCQl0cnkgeworCQkJaWYgKHN1Y2Nlc3MgJiYgZG9qby5sYW5nLmlzRnVuY3Rpb24ocmVxWyJsb2FkIl0pKSB7CisJCQkJcmVxLmxvYWQoImxvYWQiLCB2YWx1ZSwgcmVxKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoZSkgeworCQkJdGhyb3cgZTsKKwkJfQorCQlmaW5hbGx5IHsKKwkJCV90aGlzLmN1cnJlbnRSZXF1ZXN0ID0gbnVsbDsKKwkJCV90aGlzLmZpcmVOZXh0UmVxdWVzdCgpOworCQl9CisJfTsKKwl0aGlzLl9jYWxsRXJyb3IgPSBmdW5jdGlvbiAocmVxLCBtZXNzYWdlKSB7CisJCXZhciBlcnJPYmogPSBuZXcgZG9qby5pby5FcnJvcihtZXNzYWdlKTsKKwkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHJlcVsiZXJyb3IiXSkpIHsKKwkJCXJlcS5lcnJvcigiZXJyb3IiLCBlcnJPYmosIHJlcSk7CisJCX0KKwl9OworCWRvam8uaW8udHJhbnNwb3J0cy5hZGRUcmFuc3BvcnQoIklmcmFtZVRyYW5zcG9ydCIpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1JlcHVic3ViSU8uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vUmVwdWJzdWJJTy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE4MGUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1JlcHVic3ViSU8uanMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLkJyb3dzZXJJTyIpOworZG9qby5wcm92aWRlKCJkb2pvLmlvLlJlcHVic3ViSU8iKTsKK2Rvam8uaW8ucmVwdWJzdWJUcmFucG9ydCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdmFyIHJwcyA9IGRvam8uaW8ucmVwdWJzdWI7CisJdGhpcy5jYW5IYW5kbGUgPSBmdW5jdGlvbiAoa3dBcmdzKSB7CisJCWlmICgoa3dBcmdzWyJtaW1ldHlwZSJdID09ICJ0ZXh0L2phdmFzY3JpcHQiKSAmJiAoa3dBcmdzWyJtZXRob2QiXSA9PSAicmVwdWJzdWIiKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX07CisJdGhpcy5iaW5kID0gZnVuY3Rpb24gKGt3QXJncykgeworCQlpZiAoIXJwcy5pc0luaXRpYWxpemVkKSB7CisJCQlycHMuaW5pdCgpOworCQl9CisJCWlmICghcnBzLnRvcGljc1trd0FyZ3MudXJsXSkgeworCQkJa3dBcmdzLnJwc0xvYWQgPSBmdW5jdGlvbiAoZXZ0KSB7CisJCQkJa3dBcmdzLmxvYWQoImxvYWQiLCBldnQpOworCQkJfTsKKwkJCXJwcy5zdWJzY3JpYmUoa3dBcmdzLnVybCwga3dBcmdzLCAicnBzTG9hZCIpOworCQl9CisJCWlmIChrd0FyZ3NbImNvbnRlbnQiXSkgeworCQkJdmFyIGNFdnQgPSBkb2pvLmlvLnJlcHVic3ViRXZlbnQuaW5pdEZyb21Qcm9wZXJ0aWVzKGt3QXJncy5jb250ZW50KTsKKwkJCXJwcy5wdWJsaXNoKGt3QXJncy51cmwsIGNFdnQpOworCQl9CisJfTsKKwlkb2pvLmlvLnRyYW5zcG9ydHMuYWRkVHJhbnNwb3J0KCJyZXB1YnN1YlRyYW5wb3J0Iik7Cit9OworZG9qby5pby5yZXB1YnN1YiA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5pbml0RG9jID0gImluaXQuaHRtbCI7CisJdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7CisJdGhpcy5zdWJzY3JpcHRpb25CYWNrbG9nID0gW107CisJdGhpcy5kZWJ1ZyA9IHRydWU7CisJdGhpcy5yY3ZOb2RlTmFtZSA9IG51bGw7CisJdGhpcy5zbmROb2RlTmFtZSA9IG51bGw7CisJdGhpcy5yY3ZOb2RlID0gbnVsbDsKKwl0aGlzLnNuZE5vZGUgPSBudWxsOworCXRoaXMuY2FuUmN2ID0gZmFsc2U7CisJdGhpcy5jYW5TbmQgPSBmYWxzZTsKKwl0aGlzLmNhbkxvZyA9IGZhbHNlOworCXRoaXMuc25kVGltZXIgPSBudWxsOworCXRoaXMud2luZG93UmVmID0gd2luZG93OworCXRoaXMuYmFja2xvZyA9IFtdOworCXRoaXMudHVubmVsSW5pdENvdW50ID0gMDsKKwl0aGlzLnR1bm5lbEZyYW1lS2V5ID0gInR1bm5lbF9mcmFtZSI7CisJdGhpcy5zZXJ2ZXJCYXNlVVJMID0gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdCArIGxvY2F0aW9uLnBhdGhuYW1lOworCXRoaXMubG9nQmFja2xvZyA9IFtdOworCXRoaXMuZ2V0UmFuZFN0ciA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiwgMTApOworCX07CisJdGhpcy51c2VyaWQgPSAiZ3Vlc3QiOworCXRoaXMudHVubmVsSUQgPSB0aGlzLmdldFJhbmRTdHIoKTsKKwl0aGlzLmF0dGFjaFBhdGhMaXN0ID0gW107CisJdGhpcy50b3BpY3MgPSBbXTsKKwl0aGlzLnBhcnNlR2V0U3RyID0gZnVuY3Rpb24gKCkgeworCQl2YXIgYmFzZVVybCA9IGRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCk7CisJCXZhciBwYXJhbXMgPSBiYXNlVXJsLnNwbGl0KCI/IiwgMik7CisJCWlmIChwYXJhbXMubGVuZ3RoID4gMSkgeworCQkJdmFyIHBhcmFtU3RyID0gcGFyYW1zWzFdOworCQkJdmFyIHBhaXJzID0gcGFyYW1TdHIuc3BsaXQoIiYiKTsKKwkJCXZhciBvcHRzID0gW107CisJCQlmb3IgKHZhciB4IGluIHBhaXJzKSB7CisJCQkJdmFyIHNwID0gcGFpcnNbeF0uc3BsaXQoIj0iKTsKKwkJCQl0cnkgeworCQkJCQlvcHRzW3NwWzBdXSA9IGV2YWwoc3BbMV0pOworCQkJCX0KKwkJCQljYXRjaCAoZSkgeworCQkJCQlvcHRzW3NwWzBdXSA9IHNwWzFdOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBvcHRzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFtdOworCQl9CisJfTsKKwl2YXIgZ2V0T3B0cyA9IHRoaXMucGFyc2VHZXRTdHIoKTsKKwlmb3IgKHZhciB4IGluIGdldE9wdHMpIHsKKwkJdGhpc1t4XSA9IGdldE9wdHNbeF07CisJfQorCWlmICghdGhpc1sidHVubmVsVVJJIl0pIHsKKwkJdGhpcy50dW5uZWxVUkkgPSBbIi93aG8vIiwgZXNjYXBlKHRoaXMudXNlcmlkKSwgIi9zLyIsIHRoaXMuZ2V0UmFuZFN0cigpLCAiL2tuX2pvdXJuYWwiXS5qb2luKCIiKTsKKwl9CisJaWYgKHdpbmRvd1sicmVwdWJzdWJPcHRzIl0gfHwgd2luZG93WyJycHNPcHRzIl0pIHsKKwkJdmFyIG9wdE9iaiA9IHdpbmRvd1sicmVwdWJzdWJPcHRzIl0gfHwgd2luZG93WyJycHNPcHRzIl07CisJCWZvciAodmFyIHggaW4gb3B0T2JqKSB7CisJCQl0aGlzW3hdID0gb3B0T2JqW3hdOworCQl9CisJfQorCXRoaXMudHVubmVsQ2xvc2VDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKKwkJZG9qby5pby5zZXRJRnJhbWVTcmModGhpcy5yY3ZOb2RlLCB0aGlzLmluaXREb2MgKyAiP2NhbGxiYWNrPXJlcHVic3ViLnJjdk5vZGVSZWFkeSZkb21haW49IiArIGRvY3VtZW50LmRvbWFpbik7CisJfTsKKwl0aGlzLnJlY2VpdmVFdmVudEZyb21UdW5uZWwgPSBmdW5jdGlvbiAoZXZ0LCBzcmNXaW5kb3cpIHsKKwkJaWYgKCFldnRbImVsZW1lbnRzIl0pIHsKKwkJCXRoaXMubG9nKCJiYWlsaW5nISBldmVudCByZWNlaXZlZCB3aXRob3V0IGVsZW1lbnRzISIsICJlcnJvciIpOworCQkJcmV0dXJuOworCQl9CisJCXZhciBlID0ge307CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZXZ0LmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZWUgPSBldnQuZWxlbWVudHNbaV07CisJCQllW2VlLm5hbWUgfHwgZWUubmFtZVVdID0gKGVlLnZhbHVlIHx8IGVlLnZhbHVlVSk7CisJCQl0aGlzLmxvZygiW2V2ZW50XTogIiArIChlZS5uYW1lIHx8IGVlLm5hbWVVKSArICI6ICIgKyBlW2VlLm5hbWUgfHwgZWUubmFtZVVdKTsKKwkJfQorCQl0aGlzLmRpc3BhdGNoKGUpOworCX07CisJdGhpcy53aWRlbkRvbWFpbiA9IGZ1bmN0aW9uIChkb21haW5TdHIpIHsKKwkJdmFyIGNkID0gZG9tYWluU3RyIHx8IGRvY3VtZW50LmRvbWFpbjsKKwkJaWYgKGNkLmluZGV4T2YoIi4iKSA9PSAtMSkgeworCQkJcmV0dXJuOworCQl9CisJCXZhciBkcHMgPSBjZC5zcGxpdCgiLiIpOworCQlpZiAoZHBzLmxlbmd0aCA8PSAyKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZHBzID0gZHBzLnNsaWNlKGRwcy5sZW5ndGggLSAyKTsKKwkJZG9jdW1lbnQuZG9tYWluID0gZHBzLmpvaW4oIi4iKTsKKwl9OworCXRoaXMucGFyc2VDb29raWUgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBjcyA9IGRvY3VtZW50LmNvb2tpZTsKKwkJdmFyIGtleXBhaXJzID0gY3Muc3BsaXQoIjsiKTsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCBrZXlwYWlycy5sZW5ndGg7IHgrKykgeworCQkJa2V5cGFpcnNbeF0gPSBrZXlwYWlyc1t4XS5zcGxpdCgiPSIpOworCQkJaWYgKHggIT0ga2V5cGFpcnMubGVuZ3RoIC0gMSkgeworCQkJCWNzICs9ICI7IjsKKwkJCX0KKwkJfQorCQlyZXR1cm4ga2V5cGFpcnM7CisJfTsKKwl0aGlzLnNldENvb2tpZSA9IGZ1bmN0aW9uIChrZXlwYWlycywgY2xvYmJlcikgeworCQlpZiAoKGNsb2JiZXIpICYmIChjbG9iYmVyID09IHRydWUpKSB7CisJCQlkb2N1bWVudC5jb29raWUgPSAiIjsKKwkJfQorCQl2YXIgY3MgPSAiIjsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCBrZXlwYWlycy5sZW5ndGg7IHgrKykgeworCQkJY3MgKz0ga2V5cGFpcnNbeF1bMF0gKyAiPSIgKyBrZXlwYWlyc1t4XVsxXTsKKwkJCWlmICh4ICE9IGtleXBhaXJzLmxlbmd0aCAtIDEpIHsKKwkJCQljcyArPSAiOyI7CisJCQl9CisJCX0KKwkJZG9jdW1lbnQuY29va2llID0gY3M7CisJfTsKKwl0aGlzLmxvZyA9IGZ1bmN0aW9uIChzdHIsIGx2bCkgeworCQlpZiAoIXRoaXMuZGVidWcpIHsKKwkJCXJldHVybjsKKwkJfQorCQl3aGlsZSAodGhpcy5sb2dCYWNrbG9nLmxlbmd0aCA+IDApIHsKKwkJCWlmICghdGhpcy5jYW5Mb2cpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXZhciBibG8gPSB0aGlzLmxvZ0JhY2tsb2cuc2hpZnQoKTsKKwkJCXRoaXMud3JpdGVMb2coIlsiICsgYmxvWzBdICsgIl06ICIgKyBibG9bMV0sIGJsb1syXSk7CisJCX0KKwkJdGhpcy53cml0ZUxvZyhzdHIsIGx2bCk7CisJfTsKKwl0aGlzLndyaXRlTG9nID0gZnVuY3Rpb24gKHN0ciwgbHZsKSB7CisJCWRvam8uZGVidWcoKChuZXcgRGF0ZSgpKS50b0xvY2FsZVRpbWVTdHJpbmcoKSkgKyAiOiAiICsgc3RyKTsKKwl9OworCXRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy53aWRlbkRvbWFpbigpOworCQl0aGlzLm9wZW5UdW5uZWwoKTsKKwkJdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTsKKwkJd2hpbGUgKHRoaXMuc3Vic2NyaXB0aW9uQmFja2xvZy5sZW5ndGgpIHsKKwkJCXRoaXMuc3Vic2NyaWJlLmFwcGx5KHRoaXMsIHRoaXMuc3Vic2NyaXB0aW9uQmFja2xvZy5zaGlmdCgpKTsKKwkJfQorCX07CisJdGhpcy5jbG9iYmVyID0gZnVuY3Rpb24gKCkgeworCQlpZiAodGhpcy5yY3ZOb2RlKSB7CisJCQl0aGlzLnNldENvb2tpZShbW3RoaXMudHVubmVsRnJhbWVLZXksICJjbG9zZWQiXSwgWyJwYXRoIiwgIi8iXV0sIGZhbHNlKTsKKwkJfQorCX07CisJdGhpcy5vcGVuVHVubmVsID0gZnVuY3Rpb24gKCkgeworCQl0aGlzLnJjdk5vZGVOYW1lID0gInJjdklGcmFtZV8iICsgdGhpcy5nZXRSYW5kU3RyKCk7CisJCXRoaXMuc2V0Q29va2llKFtbdGhpcy50dW5uZWxGcmFtZUtleSwgdGhpcy5yY3ZOb2RlTmFtZV0sIFsicGF0aCIsICIvIl1dLCBmYWxzZSk7CisJCXRoaXMucmN2Tm9kZSA9IGRvam8uaW8uY3JlYXRlSUZyYW1lKHRoaXMucmN2Tm9kZU5hbWUpOworCQlkb2pvLmlvLnNldElGcmFtZVNyYyh0aGlzLnJjdk5vZGUsIHRoaXMuaW5pdERvYyArICI/Y2FsbGJhY2s9cmVwdWJzdWIucmN2Tm9kZVJlYWR5JmRvbWFpbj0iICsgZG9jdW1lbnQuZG9tYWluKTsKKwkJdGhpcy5zbmROb2RlTmFtZSA9ICJzbmRJRnJhbWVfIiArIHRoaXMuZ2V0UmFuZFN0cigpOworCQl0aGlzLnNuZE5vZGUgPSBkb2pvLmlvLmNyZWF0ZUlGcmFtZSh0aGlzLnNuZE5vZGVOYW1lKTsKKwkJZG9qby5pby5zZXRJRnJhbWVTcmModGhpcy5zbmROb2RlLCB0aGlzLmluaXREb2MgKyAiP2NhbGxiYWNrPXJlcHVic3ViLnNuZE5vZGVSZWFkeSZkb21haW49IiArIGRvY3VtZW50LmRvbWFpbik7CisJfTsKKwl0aGlzLnJjdk5vZGVSZWFkeSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIHN0YXR1c1VSSSA9IFt0aGlzLnR1bm5lbFVSSSwgIi9rbl9zdGF0dXMvIiwgdGhpcy5nZXRSYW5kU3RyKCksICJfIiwgU3RyaW5nKHRoaXMudHVubmVsSW5pdENvdW50KyspXS5qb2luKCIiKTsKKwkJdGhpcy5sb2coInJjdk5vZGVSZWFkeSIpOworCQl2YXIgaW5pdFVSSUFyciA9IFt0aGlzLnNlcnZlckJhc2VVUkwsICIva24/a25fZnJvbT0iLCBlc2NhcGUodGhpcy50dW5uZWxVUkkpLCAiJmtuX2lkPSIsIGVzY2FwZSh0aGlzLnR1bm5lbElEKSwgIiZrbl9zdGF0dXNfZnJvbT0iLCBlc2NhcGUoc3RhdHVzVVJJKV07CisJCWRvam8uaW8uc2V0SUZyYW1lU3JjKHRoaXMucmN2Tm9kZSwgaW5pdFVSSUFyci5qb2luKCIiKSk7CisJCXRoaXMuc3Vic2NyaWJlKHN0YXR1c1VSSSwgdGhpcywgInN0YXR1c0xpc3RlbmVyIiwgdHJ1ZSk7CisJCXRoaXMubG9nKGluaXRVUklBcnIuam9pbigiIikpOworCX07CisJdGhpcy5zbmROb2RlUmVhZHkgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuY2FuU25kID0gdHJ1ZTsKKwkJdGhpcy5sb2coInNuZE5vZGVSZWFkeSIpOworCQl0aGlzLmxvZyh0aGlzLmJhY2tsb2cubGVuZ3RoKTsKKwkJaWYgKHRoaXMuYmFja2xvZy5sZW5ndGggPiAwKSB7CisJCQl0aGlzLmRlcXVldWVFdmVudCgpOworCQl9CisJfTsKKwl0aGlzLnN0YXR1c0xpc3RlbmVyID0gZnVuY3Rpb24gKGV2dCkgeworCQl0aGlzLmxvZygic3RhdHVzIGxpc3RlbmVyIGNhbGxlZCIpOworCQl0aGlzLmxvZyhldnQuc3RhdHVzLCAiaW5mbyIpOworCX07CisJdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIChldnQpIHsKKwkJaWYgKGV2dFsidG8iXSB8fCBldnRbImtuX3JvdXRlZF9mcm9tIl0pIHsKKwkJCXZhciByZiA9IGV2dFsidG8iXSB8fCBldnRbImtuX3JvdXRlZF9mcm9tIl07CisJCQl2YXIgdG9waWMgPSByZi5zcGxpdCh0aGlzLnNlcnZlckJhc2VVUkwsIDIpWzFdOworCQkJaWYgKCF0b3BpYykgeworCQkJCXRvcGljID0gcmY7CisJCQl9CisJCQl0aGlzLmxvZygiW3RvcGljXSAiICsgdG9waWMpOworCQkJaWYgKHRvcGljLmxlbmd0aCA+IDMpIHsKKwkJCQlpZiAodG9waWMuc2xpY2UoMCwgMykgPT0gIi9rbiIpIHsKKwkJCQkJdG9waWMgPSB0b3BpYy5zbGljZSgzKTsKKwkJCQl9CisJCQl9CisJCQlpZiAodGhpcy5hdHRhY2hQYXRoTGlzdFt0b3BpY10pIHsKKwkJCQl0aGlzLmF0dGFjaFBhdGhMaXN0W3RvcGljXShldnQpOworCQkJfQorCQl9CisJfTsKKwl0aGlzLnN1YnNjcmliZSA9IGZ1bmN0aW9uICh0b3BpYywgdG9PYmosIHRvRnVuYywgZG9udFRlbGxTZXJ2ZXIpIHsKKwkJaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHsKKwkJCXRoaXMuc3Vic2NyaXB0aW9uQmFja2xvZy5wdXNoKFt0b3BpYywgdG9PYmosIHRvRnVuYywgZG9udFRlbGxTZXJ2ZXJdKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXRoaXMuYXR0YWNoUGF0aExpc3RbdG9waWNdKSB7CisJCQl0aGlzLmF0dGFjaFBhdGhMaXN0W3RvcGljXSA9IGZ1bmN0aW9uICgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX07CisJCQl0aGlzLmxvZygic3Vic2NyaWJpbmcgdG86ICIgKyB0b3BpYyk7CisJCQl0aGlzLnRvcGljcy5wdXNoKHRvcGljKTsKKwkJfQorCQl2YXIgcmV2dCA9IG5ldyBkb2pvLmlvLnJlcHVic3ViRXZlbnQodGhpcy50dW5uZWxVUkksIHRvcGljLCAicm91dGUiKTsKKwkJdmFyIHJzdHIgPSBbdGhpcy5zZXJ2ZXJCYXNlVVJMICsgIi9rbiIsIHJldnQudG9HZXRTdHJpbmcoKV0uam9pbigiIik7CisJCWRvam8uZXZlbnQua3dDb25uZWN0KHtvbmNlOnRydWUsIHNyY09iajp0aGlzLmF0dGFjaFBhdGhMaXN0LCBzcmNGdW5jOnRvcGljLCBhZHZpY2VPYmo6dG9PYmosIGFkdmljZUZ1bmM6dG9GdW5jfSk7CisJCWlmICghdGhpcy5yY3ZOb2RlKSB7CisJCX0KKwkJaWYgKGRvbnRUZWxsU2VydmVyKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5sb2coInNlbmRpbmcgc3Vic2NyaXB0aW9uIHRvOiAiICsgdG9waWMpOworCQl0aGlzLnNlbmRUb3BpY1N1YlRvU2VydmVyKHRvcGljLCByc3RyKTsKKwl9OworCXRoaXMuc2VuZFRvcGljU3ViVG9TZXJ2ZXIgPSBmdW5jdGlvbiAodG9waWMsIHN0cikgeworCQlpZiAoIXRoaXMuYXR0YWNoUGF0aExpc3RbdG9waWNdWyJzdWJzY3JpcHRpb25zIl0pIHsKKwkJCXRoaXMuZW5xdWV1ZUV2ZW50U3RyKHN0cik7CisJCQl0aGlzLmF0dGFjaFBhdGhMaXN0W3RvcGljXS5zdWJzY3JpcHRpb25zID0gMDsKKwkJfQorCQl0aGlzLmF0dGFjaFBhdGhMaXN0W3RvcGljXS5zdWJzY3JpcHRpb25zKys7CisJfTsKKwl0aGlzLnVuU3Vic2NyaWJlID0gZnVuY3Rpb24gKHRvcGljLCB0b09iaiwgdG9GdW5jKSB7CisJCWRvam8uZXZlbnQua3dEaXNjb25uZWN0KHtzcmNPYmo6dGhpcy5hdHRhY2hQYXRoTGlzdCwgc3JjRnVuYzp0b3BpYywgYWR2aWNlT2JqOnRvT2JqLCBhZHZpY2VGdW5jOnRvRnVuY30pOworCX07CisJdGhpcy5wdWJsaXNoID0gZnVuY3Rpb24gKHRvcGljLCBldmVudCkgeworCQl2YXIgZXZ0ID0gZG9qby5pby5yZXB1YnN1YkV2ZW50LmluaXRGcm9tUHJvcGVydGllcyhldmVudCk7CisJCWV2dC50byA9IHRvcGljOworCQl2YXIgZXZ0VVJMUGFydHMgPSBbXTsKKwkJZXZ0VVJMUGFydHMucHVzaCh0aGlzLnNlcnZlckJhc2VVUkwgKyAiL2tuIik7CisJCWV2dFVSTFBhcnRzLnB1c2goZXZ0LnRvR2V0U3RyaW5nKCkpOworCQl0aGlzLmVucXVldWVFdmVudFN0cihldnRVUkxQYXJ0cy5qb2luKCIiKSk7CisJfTsKKwl0aGlzLmVucXVldWVFdmVudFN0ciA9IGZ1bmN0aW9uIChldnRTdHIpIHsKKwkJdGhpcy5sb2coImVucXVldWVFdmVudFN0ciIpOworCQl0aGlzLmJhY2tsb2cucHVzaChldnRTdHIpOworCQl0aGlzLmRlcXVldWVFdmVudCgpOworCX07CisJdGhpcy5kZXF1ZXVlRXZlbnQgPSBmdW5jdGlvbiAoZm9yY2UpIHsKKwkJdGhpcy5sb2coImRlcXVldWVFdmVudCIpOworCQlpZiAodGhpcy5iYWNrbG9nLmxlbmd0aCA8PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCh0aGlzLmNhblNuZCkgfHwgKGZvcmNlKSkgeworCQkJZG9qby5pby5zZXRJRnJhbWVTcmModGhpcy5zbmROb2RlLCB0aGlzLmJhY2tsb2cuc2hpZnQoKSArICImY2FsbGJhY2s9cmVwdWJzdWIuc25kTm9kZVJlYWR5Iik7CisJCQl0aGlzLmNhblNuZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJdGhpcy5sb2coInNuZE5vZGUgbm90IGF2YWlsYWJsZSB5ZXQhIiwgImRlYnVnIik7CisJCX0KKwl9OworfTsKK2Rvam8uaW8ucmVwdWJzdWJFdmVudCA9IGZ1bmN0aW9uICh0bywgZnJvbSwgbWV0aG9kLCBpZCwgcm91dGVVUkksIHBheWxvYWQsIGRpc3BuYW1lLCB1aWQpIHsKKwl0aGlzLnRvID0gdG87CisJdGhpcy5mcm9tID0gZnJvbTsKKwl0aGlzLm1ldGhvZCA9IG1ldGhvZCB8fCAicm91dGUiOworCXRoaXMuaWQgPSBpZCB8fCByZXB1YnN1Yi5nZXRSYW5kU3RyKCk7CisJdGhpcy51cmkgPSByb3V0ZVVSSTsKKwl0aGlzLmRpc3BsYXluYW1lID0gZGlzcG5hbWUgfHwgcmVwdWJzdWIuZGlzcGxheW5hbWU7CisJdGhpcy51c2VyaWQgPSB1aWQgfHwgcmVwdWJzdWIudXNlcmlkOworCXRoaXMucGF5bG9hZCA9IHBheWxvYWQgfHwgIiI7CisJdGhpcy5mbHVzaENoYXJzID0gNDA5NjsKKwl0aGlzLmluaXRGcm9tUHJvcGVydGllcyA9IGZ1bmN0aW9uIChldnQpIHsKKwkJaWYgKGV2dC5jb25zdHJ1Y3RvciA9IGRvam8uaW8ucmVwdWJzdWJFdmVudCkgeworCQkJZm9yICh2YXIgeCBpbiBldnQpIHsKKwkJCQl0aGlzW3hdID0gZXZ0W3hdOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yICh2YXIgeCBpbiBldnQpIHsKKwkJCQlpZiAodHlwZW9mIHRoaXMuZm9yd2FyZFByb3BlcnRpZXNNYXBbeF0gPT0gInN0cmluZyIpIHsKKwkJCQkJdGhpc1t0aGlzLmZvcndhcmRQcm9wZXJ0aWVzTWFwW3hdXSA9IGV2dFt4XTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzW3hdID0gZXZ0W3hdOworCQkJCX0KKwkJCX0KKwkJfQorCX07CisJdGhpcy50b0dldFN0cmluZyA9IGZ1bmN0aW9uIChub1FtYXJrKSB7CisJCXZhciBxcyA9IFsoKG5vUW1hcmspID8gIiIgOiAiPyIpXTsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyB4KyspIHsKKwkJCXZhciB0cCA9IHRoaXMucHJvcGVydGllc1t4XTsKKwkJCWlmICh0aGlzW3RwWzBdXSkgeworCQkJCXFzLnB1c2godHBbMV0gKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHRoaXNbdHBbMF1dKSkpOworCQkJfQorCQl9CisJCXJldHVybiBxcy5qb2luKCImIik7CisJfTsKK307Citkb2pvLmlvLnJlcHVic3ViRXZlbnQucHJvdG90eXBlLnByb3BlcnRpZXMgPSBbWyJmcm9tIiwgImtuX2Zyb20iXSwgWyJ0byIsICJrbl90byJdLCBbIm1ldGhvZCIsICJkb19tZXRob2QiXSwgWyJpZCIsICJrbl9pZCJdLCBbInVyaSIsICJrbl91cmkiXSwgWyJkaXNwbGF5bmFtZSIsICJrbl9kaXNwbGF5bmFtZSJdLCBbInVzZXJpZCIsICJrbl91c2VyaWQiXSwgWyJwYXlsb2FkIiwgImtuX3BheWxvYWQiXSwgWyJmbHVzaENoYXJzIiwgImtuX3Jlc3BvbnNlX2ZsdXNoIl0sIFsicmVzcG9uc2VGb3JtYXQiLCAia25fcmVzcG9uc2VfZm9ybWF0Il1dOworZG9qby5pby5yZXB1YnN1YkV2ZW50LnByb3RvdHlwZS5mb3J3YXJkUHJvcGVydGllc01hcCA9IHt9OworZG9qby5pby5yZXB1YnN1YkV2ZW50LnByb3RvdHlwZS5yZXZlcnNlUHJvcGVydGllc01hcCA9IHt9OworZm9yICh2YXIgeCA9IDA7IHggPCBkb2pvLmlvLnJlcHVic3ViRXZlbnQucHJvdG90eXBlLnByb3BlcnRpZXMubGVuZ3RoOyB4KyspIHsKKwl2YXIgdHAgPSBkb2pvLmlvLnJlcHVic3ViRXZlbnQucHJvdG90eXBlLnByb3BlcnRpZXNbeF07CisJZG9qby5pby5yZXB1YnN1YkV2ZW50LnByb3RvdHlwZS5yZXZlcnNlUHJvcGVydGllc01hcFt0cFswXV0gPSB0cFsxXTsKKwlkb2pvLmlvLnJlcHVic3ViRXZlbnQucHJvdG90eXBlLmZvcndhcmRQcm9wZXJ0aWVzTWFwW3RwWzFdXSA9IHRwWzBdOworfQorZG9qby5pby5yZXB1YnN1YkV2ZW50LmluaXRGcm9tUHJvcGVydGllcyA9IGZ1bmN0aW9uIChldnQpIHsKKwl2YXIgZXZlbnRPYmogPSBuZXcgZG9qby5pby5yZXB1YnN1YkV2ZW50KCk7CisJZXZlbnRPYmouaW5pdEZyb21Qcm9wZXJ0aWVzKGV2dCk7CisJcmV0dXJuIGV2ZW50T2JqOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1JoaW5vSU8uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vUmhpbm9JTy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI5ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1JoaW5vSU8uanMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uaW8uUmhpbm9JTyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuZXh0cmFzIik7Citkb2pvLmlvLlJoaW5vSFRUUFRyYW5zcG9ydCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5jYW5IYW5kbGUgPSBmdW5jdGlvbiAocmVxKSB7CisJCWlmIChkb2pvLmxhbmcuZmluZChbInRleHQvcGxhaW4iLCAidGV4dC9odG1sIiwgInRleHQveG1sIiwgInRleHQvamF2YXNjcmlwdCIsICJ0ZXh0L2pzb24iLCAiYXBwbGljYXRpb24vanNvbiJdLCAocmVxLm1pbWV0eXBlLnRvTG93ZXJDYXNlKCkgfHwgIiIpKSA8IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAocmVxLnVybC5zdWJzdHIoMCwgNykgIT0gImh0dHA6Ly8iKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfTsKKwlmdW5jdGlvbiBkb0xvYWQocmVxLCBjb25uKSB7CisJCXZhciByZXQ7CisJCWlmIChyZXEubWV0aG9kLnRvTG93ZXJDYXNlKCkgPT0gImhlYWQiKSB7CisJCX0gZWxzZSB7CisJCQl2YXIgc3RyZWFtID0gY29ubi5nZXRDb250ZW50KCk7CisJCQl2YXIgcmVhZGVyID0gbmV3IGphdmEuaW8uQnVmZmVyZWRSZWFkZXIobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7CisJCQl2YXIgdGV4dCA9ICIiOworCQkJdmFyIGxpbmUgPSBudWxsOworCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQl0ZXh0ICs9IGxpbmU7CisJCQl9CisJCQlpZiAocmVxLm1pbWV0eXBlID09ICJ0ZXh0L2phdmFzY3JpcHQiKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0ID0gZGpfZXZhbCh0ZXh0KTsKKwkJCQl9CisJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCQkJZG9qby5kZWJ1Zyh0ZXh0KTsKKwkJCQkJcmV0ID0gbnVsbDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChyZXEubWltZXR5cGUgPT0gInRleHQvanNvbiIgfHwgcmVxLm1pbWV0eXBlID09ICJhcHBsaWNhdGlvbi9qc29uIikgeworCQkJCQl0cnkgeworCQkJCQkJcmV0ID0gZGpfZXZhbCgiKCIgKyB0ZXh0ICsgIikiKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoZSkgeworCQkJCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCQkJCWRvam8uZGVidWcodGV4dCk7CisJCQkJCQlyZXQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldCA9IHRleHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJlcS5sb2FkKCJsb2FkIiwgcmV0LCByZXEpOworCX0KKwlmdW5jdGlvbiBjb25uZWN0KHJlcSkgeworCQl2YXIgY29udGVudCA9IHJlcS5jb250ZW50IHx8IHt9OworCQl2YXIgcXVlcnk7CisJCWlmIChyZXEuc2VuZFRyYW5zcG9ydCkgeworCQkJY29udGVudFsiZG9qby50cmFuc3BvcnQiXSA9ICJyaGlub2h0dHAiOworCQl9CisJCWlmIChyZXEucG9zdENvbnRlbnQpIHsKKwkJCXF1ZXJ5ID0gcmVxLnBvc3RDb250ZW50OworCQl9IGVsc2UgeworCQkJcXVlcnkgPSBkb2pvLmlvLmFyZ3NGcm9tTWFwKGNvbnRlbnQsIHJlcS5lbmNvZGluZyk7CisJCX0KKwkJdmFyIHVybF90ZXh0ID0gcmVxLnVybDsKKwkJaWYgKHJlcS5tZXRob2QudG9Mb3dlckNhc2UoKSA9PSAiZ2V0IiAmJiBxdWVyeSAhPSAiIikgeworCQkJdXJsX3RleHQgPSB1cmxfdGV4dCArICI/IiArIHF1ZXJ5OworCQl9CisJCXZhciB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKHVybF90ZXh0KTsKKwkJdmFyIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKwkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKHJlcS5tZXRob2QudG9VcHBlckNhc2UoKSk7CisJCWlmIChyZXEuaGVhZGVycykgeworCQkJZm9yICh2YXIgaGVhZGVyIGluIHJlcS5oZWFkZXJzKSB7CisJCQkJaWYgKGhlYWRlci50b0xvd2VyQ2FzZSgpID09ICJjb250ZW50LXR5cGUiICYmICFyZXEuY29udGVudFR5cGUpIHsKKwkJCQkJcmVxLmNvbnRlbnRUeXBlID0gcmVxLmhlYWRlcnNbaGVhZGVyXTsKKwkJCQl9IGVsc2UgeworCQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShoZWFkZXIsIHJlcS5oZWFkZXJzW2hlYWRlcl0pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocmVxLmNvbnRlbnRUeXBlKSB7CisJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgcmVxLmNvbnRlbnRUeXBlKTsKKwkJfQorCQlpZiAocmVxLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJwb3N0IikgeworCQkJY29ubi5zZXREb091dHB1dCh0cnVlKTsKKwkJCXZhciBvdXRwdXRfc3RyZWFtID0gY29ubi5nZXRPdXRwdXRTdHJlYW0oKTsKKwkJCXZhciBieXRlX2FycmF5ID0gKG5ldyBqYXZhLmxhbmcuU3RyaW5nKHF1ZXJ5KSkuZ2V0Qnl0ZXMoKTsKKwkJCW91dHB1dF9zdHJlYW0ud3JpdGUoYnl0ZV9hcnJheSwgMCwgYnl0ZV9hcnJheS5sZW5ndGgpOworCQl9CisJCWNvbm4uY29ubmVjdCgpOworCQlkb0xvYWQocmVxLCBjb25uKTsKKwl9CisJdGhpcy5iaW5kID0gZnVuY3Rpb24gKHJlcSkgeworCQl2YXIgYXN5bmMgPSByZXFbInN5bmMiXSA/IGZhbHNlIDogdHJ1ZTsKKwkJaWYgKGFzeW5jKSB7CisJCQlzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoKSB7CisJCQkJY29ubmVjdChyZXEpOworCQkJfSksIDEpOworCQl9IGVsc2UgeworCQkJY29ubmVjdChyZXEpOworCQl9CisJfTsKKwlkb2pvLmlvLnRyYW5zcG9ydHMuYWRkVHJhbnNwb3J0KCJSaGlub0hUVFBUcmFuc3BvcnQiKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9TY3JpcHRTcmNJTy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9TY3JpcHRTcmNJTy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTA5MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1NjcmlwdFNyY0lPLmpzCkBAIC0wLDAgKzEsMzE3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmlvLlNjcmlwdFNyY0lPIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uQnJvd3NlcklPIik7Citkb2pvLnJlcXVpcmUoImRvam8udW5kby5icm93c2VyIik7Citkb2pvLmlvLlNjcmlwdFNyY1RyYW5zcG9ydCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5wcmV2ZW50Q2FjaGUgPSBmYWxzZTsKKwl0aGlzLm1heFVybExlbmd0aCA9IDEwMDA7CisJdGhpcy5pbkZsaWdodFRpbWVyID0gbnVsbDsKKwl0aGlzLkRzclN0YXR1c0NvZGVzID0ge0NvbnRpbnVlOjEwMCwgT2s6MjAwLCBFcnJvcjo1MDB9OworCXRoaXMuc3RhcnRXYXRjaGluZ0luRmxpZ2h0ID0gZnVuY3Rpb24gKCkgeworCQlpZiAoIXRoaXMuaW5GbGlnaHRUaW1lcikgeworCQkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0SW50ZXJ2YWwoImRvam8uaW8uU2NyaXB0U3JjVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMDApOworCQl9CisJfTsKKwl0aGlzLndhdGNoSW5GbGlnaHQgPSBmdW5jdGlvbiAoKSB7CisJCXZhciB0b3RhbENvdW50ID0gMDsKKwkJdmFyIGRvbmVDb3VudCA9IDA7CisJCWZvciAodmFyIHBhcmFtIGluIHRoaXMuX3N0YXRlKSB7CisJCQl0b3RhbENvdW50Kys7CisJCQl2YXIgY3VycmVudFN0YXRlID0gdGhpcy5fc3RhdGVbcGFyYW1dOworCQkJaWYgKGN1cnJlbnRTdGF0ZS5pc0RvbmUpIHsKKwkJCQlkb25lQ291bnQrKzsKKwkJCQlkZWxldGUgdGhpcy5fc3RhdGVbcGFyYW1dOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWN1cnJlbnRTdGF0ZS5pc0ZpbmlzaGluZykgeworCQkJCQl2YXIgbGlzdGVuZXIgPSBjdXJyZW50U3RhdGUua3dBcmdzOworCQkJCQl0cnkgeworCQkJCQkJaWYgKGN1cnJlbnRTdGF0ZS5jaGVja1N0cmluZyAmJiBldmFsKCJ0eXBlb2YoIiArIGN1cnJlbnRTdGF0ZS5jaGVja1N0cmluZyArICIpICE9ICd1bmRlZmluZWQnIikpIHsKKwkJCQkJCQljdXJyZW50U3RhdGUuaXNGaW5pc2hpbmcgPSB0cnVlOworCQkJCQkJCXRoaXMuX2ZpbmlzaChjdXJyZW50U3RhdGUsICJsb2FkIik7CisJCQkJCQkJZG9uZUNvdW50Kys7CisJCQkJCQkJZGVsZXRlIHRoaXMuX3N0YXRlW3BhcmFtXTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKGxpc3RlbmVyLnRpbWVvdXRTZWNvbmRzICYmIGxpc3RlbmVyLnRpbWVvdXQpIHsKKwkJCQkJCQkJaWYgKGN1cnJlbnRTdGF0ZS5zdGFydFRpbWUgKyAobGlzdGVuZXIudGltZW91dFNlY29uZHMgKiAxMDAwKSA8IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpIHsKKwkJCQkJCQkJCWN1cnJlbnRTdGF0ZS5pc0ZpbmlzaGluZyA9IHRydWU7CisJCQkJCQkJCQl0aGlzLl9maW5pc2goY3VycmVudFN0YXRlLCAidGltZW91dCIpOworCQkJCQkJCQkJZG9uZUNvdW50Kys7CisJCQkJCQkJCQlkZWxldGUgdGhpcy5fc3RhdGVbcGFyYW1dOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKCFsaXN0ZW5lci50aW1lb3V0U2Vjb25kcykgeworCQkJCQkJCQkJZG9uZUNvdW50Kys7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJCWN1cnJlbnRTdGF0ZS5pc0ZpbmlzaGluZyA9IHRydWU7CisJCQkJCQl0aGlzLl9maW5pc2goY3VycmVudFN0YXRlLCAiZXJyb3IiLCB7c3RhdHVzOnRoaXMuRHNyU3RhdHVzQ29kZXMuRXJyb3IsIHJlc3BvbnNlOmV9KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZG9uZUNvdW50ID49IHRvdGFsQ291bnQpIHsKKwkJCWNsZWFySW50ZXJ2YWwodGhpcy5pbkZsaWdodFRpbWVyKTsKKwkJCXRoaXMuaW5GbGlnaHRUaW1lciA9IG51bGw7CisJCX0KKwl9OworCXRoaXMuY2FuSGFuZGxlID0gZnVuY3Rpb24gKGt3QXJncykgeworCQlyZXR1cm4gZG9qby5sYW5nLmluQXJyYXkoWyJ0ZXh0L2phdmFzY3JpcHQiLCAidGV4dC9qc29uIiwgImFwcGxpY2F0aW9uL2pzb24iXSwgKGt3QXJnc1sibWltZXR5cGUiXS50b0xvd2VyQ2FzZSgpKSkgJiYgKGt3QXJnc1sibWV0aG9kIl0udG9Mb3dlckNhc2UoKSA9PSAiZ2V0IikgJiYgIShrd0FyZ3NbImZvcm1Ob2RlIl0gJiYgZG9qby5pby5mb3JtSGFzRmlsZShrd0FyZ3NbImZvcm1Ob2RlIl0pKSAmJiAoIWt3QXJnc1sic3luYyJdIHx8IGt3QXJnc1sic3luYyJdID09IGZhbHNlKSAmJiAha3dBcmdzWyJmaWxlIl0gJiYgIWt3QXJnc1sibXVsdGlwYXJ0Il07CisJfTsKKwl0aGlzLnJlbW92ZVNjcmlwdHMgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOworCQlmb3IgKHZhciBpID0gMDsgc2NyaXB0cyAmJiBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHNjcmlwdFRhZyA9IHNjcmlwdHNbaV07CisJCQlpZiAoc2NyaXB0VGFnLmNsYXNzTmFtZSA9PSAiU2NyaXB0U3JjVHJhbnNwb3J0IikgeworCQkJCXZhciBwYXJlbnQgPSBzY3JpcHRUYWcucGFyZW50Tm9kZTsKKwkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTsKKwkJCQlpLS07CisJCQl9CisJCX0KKwl9OworCXRoaXMuYmluZCA9IGZ1bmN0aW9uIChrd0FyZ3MpIHsKKwkJdmFyIHVybCA9IGt3QXJncy51cmw7CisJCXZhciBxdWVyeSA9ICIiOworCQlpZiAoa3dBcmdzWyJmb3JtTm9kZSJdKSB7CisJCQl2YXIgdGEgPSBrd0FyZ3MuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTsKKwkJCWlmICgodGEpICYmICgha3dBcmdzWyJ1cmwiXSkpIHsKKwkJCQl1cmwgPSB0YTsKKwkJCX0KKwkJCXZhciB0cCA9IGt3QXJncy5mb3JtTm9kZS5nZXRBdHRyaWJ1dGUoIm1ldGhvZCIpOworCQkJaWYgKCh0cCkgJiYgKCFrd0FyZ3NbIm1ldGhvZCJdKSkgeworCQkJCWt3QXJncy5tZXRob2QgPSB0cDsKKwkJCX0KKwkJCXF1ZXJ5ICs9IGRvam8uaW8uZW5jb2RlRm9ybShrd0FyZ3MuZm9ybU5vZGUsIGt3QXJncy5lbmNvZGluZywga3dBcmdzWyJmb3JtRmlsdGVyIl0pOworCQl9CisJCWlmICh1cmwuaW5kZXhPZigiIyIpID4gLTEpIHsKKwkJCWRvam8uZGVidWcoIldhcm5pbmc6IGRvam8uaW8uYmluZDogc3RyaXBwaW5nIGhhc2ggdmFsdWVzIGZyb20gdXJsOiIsIHVybCk7CisJCQl1cmwgPSB1cmwuc3BsaXQoIiMiKVswXTsKKwkJfQorCQl2YXIgdXJsUGFydHMgPSB1cmwuc3BsaXQoIj8iKTsKKwkJaWYgKHVybFBhcnRzICYmIHVybFBhcnRzLmxlbmd0aCA9PSAyKSB7CisJCQl1cmwgPSB1cmxQYXJ0c1swXTsKKwkJCXF1ZXJ5ICs9IChxdWVyeSA/ICImIiA6ICIiKSArIHVybFBhcnRzWzFdOworCQl9CisJCWlmIChrd0FyZ3NbImJhY2tCdXR0b24iXSB8fCBrd0FyZ3NbImJhY2siXSB8fCBrd0FyZ3NbImNoYW5nZVVybCJdKSB7CisJCQlkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3Rvcnkoa3dBcmdzKTsKKwkJfQorCQl2YXIgaWQgPSBrd0FyZ3NbImFwaUlkIl0gPyBrd0FyZ3NbImFwaUlkIl0gOiAiaWQiICsgdGhpcy5fY291bnRlcisrOworCQl2YXIgY29udGVudCA9IGt3QXJnc1siY29udGVudCJdOworCQl2YXIganNvbnBOYW1lID0ga3dBcmdzLmpzb25QYXJhbU5hbWU7CisJCWlmIChrd0FyZ3Muc2VuZFRyYW5zcG9ydCB8fCBqc29ucE5hbWUpIHsKKwkJCWlmICghY29udGVudCkgeworCQkJCWNvbnRlbnQgPSB7fTsKKwkJCX0KKwkJCWlmIChrd0FyZ3Muc2VuZFRyYW5zcG9ydCkgeworCQkJCWNvbnRlbnRbImRvam8udHJhbnNwb3J0Il0gPSAic2NyaXB0c3JjIjsKKwkJCX0KKwkJCWlmIChqc29ucE5hbWUpIHsKKwkJCQljb250ZW50W2pzb25wTmFtZV0gPSAiZG9qby5pby5TY3JpcHRTcmNUcmFuc3BvcnQuX3N0YXRlLiIgKyBpZCArICIuanNvbnBDYWxsIjsKKwkJCX0KKwkJfQorCQlpZiAoa3dBcmdzLnBvc3RDb250ZW50KSB7CisJCQlxdWVyeSA9IGt3QXJncy5wb3N0Q29udGVudDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250ZW50KSB7CisJCQkJcXVlcnkgKz0gKChxdWVyeSkgPyAiJiIgOiAiIikgKyBkb2pvLmlvLmFyZ3NGcm9tTWFwKGNvbnRlbnQsIGt3QXJncy5lbmNvZGluZywganNvbnBOYW1lKTsKKwkJCX0KKwkJfQorCQlpZiAoa3dBcmdzWyJhcGlJZCJdKSB7CisJCQlrd0FyZ3NbInVzZVJlcXVlc3RJZCJdID0gdHJ1ZTsKKwkJfQorCQl2YXIgc3RhdGUgPSB7ImlkIjppZCwgImlkUGFyYW0iOiJfZHNyaWQ9IiArIGlkLCAidXJsIjp1cmwsICJxdWVyeSI6cXVlcnksICJrd0FyZ3MiOmt3QXJncywgInN0YXJ0VGltZSI6KG5ldyBEYXRlKCkpLmdldFRpbWUoKSwgImlzRmluaXNoaW5nIjpmYWxzZX07CisJCWlmICghdXJsKSB7CisJCQl0aGlzLl9maW5pc2goc3RhdGUsICJlcnJvciIsIHtzdGF0dXM6dGhpcy5Ec3JTdGF0dXNDb2Rlcy5FcnJvciwgc3RhdHVzVGV4dDoidXJsLm5vbmUifSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNvbnRlbnQgJiYgY29udGVudFtqc29ucE5hbWVdKSB7CisJCQlzdGF0ZS5qc29ucCA9IGNvbnRlbnRbanNvbnBOYW1lXTsKKwkJCXN0YXRlLmpzb25wQ2FsbCA9IGZ1bmN0aW9uIChkYXRhKSB7CisJCQkJaWYgKGRhdGFbIkVycm9yIl0gfHwgZGF0YVsiZXJyb3IiXSkgeworCQkJCQlpZiAoZG9qb1sianNvbiJdICYmIGRvam9bImpzb24iXVsic2VyaWFsaXplIl0pIHsKKwkJCQkJCWRvam8uZGVidWcoZG9qby5qc29uLnNlcmlhbGl6ZShkYXRhKSk7CisJCQkJCX0KKwkJCQkJZG9qby5pby5TY3JpcHRTcmNUcmFuc3BvcnQuX2ZpbmlzaCh0aGlzLCAiZXJyb3IiLCBkYXRhKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkb2pvLmlvLlNjcmlwdFNyY1RyYW5zcG9ydC5fZmluaXNoKHRoaXMsICJsb2FkIiwgZGF0YSk7CisJCQkJfQorCQkJfTsKKwkJfQorCQlpZiAoa3dBcmdzWyJ1c2VSZXF1ZXN0SWQiXSB8fCBrd0FyZ3NbImNoZWNrU3RyaW5nIl0gfHwgc3RhdGVbImpzb25wIl0pIHsKKwkJCXRoaXMuX3N0YXRlW2lkXSA9IHN0YXRlOworCQl9CisJCWlmIChrd0FyZ3NbImNoZWNrU3RyaW5nIl0pIHsKKwkJCXN0YXRlLmNoZWNrU3RyaW5nID0ga3dBcmdzWyJjaGVja1N0cmluZyJdOworCQl9CisJCXN0YXRlLmNvbnN0YW50UGFyYW1zID0gKGt3QXJnc1siY29uc3RhbnRQYXJhbXMiXSA9PSBudWxsID8gIiIgOiBrd0FyZ3NbImNvbnN0YW50UGFyYW1zIl0pOworCQlpZiAoa3dBcmdzWyJwcmV2ZW50Q2FjaGUiXSB8fCAodGhpcy5wcmV2ZW50Q2FjaGUgPT0gdHJ1ZSAmJiBrd0FyZ3NbInByZXZlbnRDYWNoZSJdICE9IGZhbHNlKSkgeworCQkJc3RhdGUubm9jYWNoZVBhcmFtID0gImRvam8ucHJldmVudENhY2hlPSIgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRlLm5vY2FjaGVQYXJhbSA9ICIiOworCQl9CisJCXZhciB1cmxMZW5ndGggPSBzdGF0ZS51cmwubGVuZ3RoICsgc3RhdGUucXVlcnkubGVuZ3RoICsgc3RhdGUuY29uc3RhbnRQYXJhbXMubGVuZ3RoICsgc3RhdGUubm9jYWNoZVBhcmFtLmxlbmd0aCArIHRoaXMuX2V4dHJhUGFkZGluZ0xlbmd0aDsKKwkJaWYgKGt3QXJnc1sidXNlUmVxdWVzdElkIl0pIHsKKwkJCXVybExlbmd0aCArPSBzdGF0ZS5pZFBhcmFtLmxlbmd0aDsKKwkJfQorCQlpZiAoIWt3QXJnc1siY2hlY2tTdHJpbmciXSAmJiBrd0FyZ3NbInVzZVJlcXVlc3RJZCJdICYmICFzdGF0ZVsianNvbnAiXSAmJiAha3dBcmdzWyJmb3JjZVNpbmdsZVJlcXVlc3QiXSAmJiB1cmxMZW5ndGggPiB0aGlzLm1heFVybExlbmd0aCkgeworCQkJaWYgKHVybCA+IHRoaXMubWF4VXJsTGVuZ3RoKSB7CisJCQkJdGhpcy5fZmluaXNoKHN0YXRlLCAiZXJyb3IiLCB7c3RhdHVzOnRoaXMuRHNyU3RhdHVzQ29kZXMuRXJyb3IsIHN0YXR1c1RleHQ6InVybC50b29CaWcifSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLl9tdWx0aUF0dGFjaChzdGF0ZSwgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2YXIgcXVlcnlQYXJhbXMgPSBbc3RhdGUuY29uc3RhbnRQYXJhbXMsIHN0YXRlLm5vY2FjaGVQYXJhbSwgc3RhdGUucXVlcnldOworCQkJaWYgKGt3QXJnc1sidXNlUmVxdWVzdElkIl0gJiYgIXN0YXRlWyJqc29ucCJdKSB7CisJCQkJcXVlcnlQYXJhbXMudW5zaGlmdChzdGF0ZS5pZFBhcmFtKTsKKwkJCX0KKwkJCXZhciBmaW5hbFVybCA9IHRoaXMuX2J1aWxkVXJsKHN0YXRlLnVybCwgcXVlcnlQYXJhbXMpOworCQkJc3RhdGUuZmluYWxVcmwgPSBmaW5hbFVybDsKKwkJCXRoaXMuX2F0dGFjaChzdGF0ZS5pZCwgZmluYWxVcmwpOworCQl9CisJCXRoaXMuc3RhcnRXYXRjaGluZ0luRmxpZ2h0KCk7CisJfTsKKwl0aGlzLl9jb3VudGVyID0gMTsKKwl0aGlzLl9zdGF0ZSA9IHt9OworCXRoaXMuX2V4dHJhUGFkZGluZ0xlbmd0aCA9IDE2OworCXRoaXMuX2J1aWxkVXJsID0gZnVuY3Rpb24gKHVybCwgbmFtZVZhbHVlQXJyYXkpIHsKKwkJdmFyIGZpbmFsVXJsID0gdXJsOworCQl2YXIgam9pbmVyID0gIj8iOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVWYWx1ZUFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAobmFtZVZhbHVlQXJyYXlbaV0pIHsKKwkJCQlmaW5hbFVybCArPSBqb2luZXIgKyBuYW1lVmFsdWVBcnJheVtpXTsKKwkJCQlqb2luZXIgPSAiJiI7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZpbmFsVXJsOworCX07CisJdGhpcy5fYXR0YWNoID0gZnVuY3Rpb24gKGlkLCB1cmwpIHsKKwkJdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKwkJZWxlbWVudC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJCWVsZW1lbnQuc3JjID0gdXJsOworCQllbGVtZW50LmlkID0gaWQ7CisJCWVsZW1lbnQuY2xhc3NOYW1lID0gIlNjcmlwdFNyY1RyYW5zcG9ydCI7CisJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisJfTsKKwl0aGlzLl9tdWx0aUF0dGFjaCA9IGZ1bmN0aW9uIChzdGF0ZSwgcGFydCkgeworCQlpZiAoc3RhdGUucXVlcnkgPT0gbnVsbCkgeworCQkJdGhpcy5fZmluaXNoKHN0YXRlLCAiZXJyb3IiLCB7c3RhdHVzOnRoaXMuRHNyU3RhdHVzQ29kZXMuRXJyb3IsIHN0YXR1c1RleHQ6InF1ZXJ5Lm51bGwifSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdGF0ZS5jb25zdGFudFBhcmFtcykgeworCQkJc3RhdGUuY29uc3RhbnRQYXJhbXMgPSAiIjsKKwkJfQorCQl2YXIgcXVlcnlNYXggPSB0aGlzLm1heFVybExlbmd0aCAtIHN0YXRlLmlkUGFyYW0ubGVuZ3RoIC0gc3RhdGUuY29uc3RhbnRQYXJhbXMubGVuZ3RoIC0gc3RhdGUudXJsLmxlbmd0aCAtIHN0YXRlLm5vY2FjaGVQYXJhbS5sZW5ndGggLSB0aGlzLl9leHRyYVBhZGRpbmdMZW5ndGg7CisJCXZhciBpc0RvbmUgPSBzdGF0ZS5xdWVyeS5sZW5ndGggPCBxdWVyeU1heDsKKwkJdmFyIGN1cnJlbnRRdWVyeTsKKwkJaWYgKGlzRG9uZSkgeworCQkJY3VycmVudFF1ZXJ5ID0gc3RhdGUucXVlcnk7CisJCQlzdGF0ZS5xdWVyeSA9IG51bGw7CisJCX0gZWxzZSB7CisJCQl2YXIgYW1wRW5kID0gc3RhdGUucXVlcnkubGFzdEluZGV4T2YoIiYiLCBxdWVyeU1heCAtIDEpOworCQkJdmFyIGVxRW5kID0gc3RhdGUucXVlcnkubGFzdEluZGV4T2YoIj0iLCBxdWVyeU1heCAtIDEpOworCQkJaWYgKGFtcEVuZCA+IGVxRW5kIHx8IGVxRW5kID09IHF1ZXJ5TWF4IC0gMSkgeworCQkJCWN1cnJlbnRRdWVyeSA9IHN0YXRlLnF1ZXJ5LnN1YnN0cmluZygwLCBhbXBFbmQpOworCQkJCXN0YXRlLnF1ZXJ5ID0gc3RhdGUucXVlcnkuc3Vic3RyaW5nKGFtcEVuZCArIDEsIHN0YXRlLnF1ZXJ5Lmxlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCWN1cnJlbnRRdWVyeSA9IHN0YXRlLnF1ZXJ5LnN1YnN0cmluZygwLCBxdWVyeU1heCk7CisJCQkJdmFyIHF1ZXJ5TmFtZSA9IGN1cnJlbnRRdWVyeS5zdWJzdHJpbmcoKGFtcEVuZCA9PSAtMSA/IDAgOiBhbXBFbmQgKyAxKSwgZXFFbmQpOworCQkJCXN0YXRlLnF1ZXJ5ID0gcXVlcnlOYW1lICsgIj0iICsgc3RhdGUucXVlcnkuc3Vic3RyaW5nKHF1ZXJ5TWF4LCBzdGF0ZS5xdWVyeS5sZW5ndGgpOworCQkJfQorCQl9CisJCXZhciBxdWVyeVBhcmFtcyA9IFtjdXJyZW50UXVlcnksIHN0YXRlLmlkUGFyYW0sIHN0YXRlLmNvbnN0YW50UGFyYW1zLCBzdGF0ZS5ub2NhY2hlUGFyYW1dOworCQlpZiAoIWlzRG9uZSkgeworCQkJcXVlcnlQYXJhbXMucHVzaCgiX3BhcnQ9IiArIHBhcnQpOworCQl9CisJCXZhciB1cmwgPSB0aGlzLl9idWlsZFVybChzdGF0ZS51cmwsIHF1ZXJ5UGFyYW1zKTsKKwkJdGhpcy5fYXR0YWNoKHN0YXRlLmlkICsgIl8iICsgcGFydCwgdXJsKTsKKwl9OworCXRoaXMuX2ZpbmlzaCA9IGZ1bmN0aW9uIChzdGF0ZSwgY2FsbGJhY2ssIGV2ZW50KSB7CisJCWlmIChjYWxsYmFjayAhPSAicGFydE9rIiAmJiAhc3RhdGUua3dBcmdzW2NhbGxiYWNrXSAmJiAhc3RhdGUua3dBcmdzWyJoYW5kbGUiXSkgeworCQkJaWYgKGNhbGxiYWNrID09ICJlcnJvciIpIHsKKwkJCQlzdGF0ZS5pc0RvbmUgPSB0cnVlOworCQkJCXRocm93IGV2ZW50OworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChjYWxsYmFjaykgeworCQkJICBjYXNlICJsb2FkIjoKKwkJCQl2YXIgcmVzcG9uc2UgPSBldmVudCA/IGV2ZW50LnJlc3BvbnNlIDogbnVsbDsKKwkJCQlpZiAoIXJlc3BvbnNlKSB7CisJCQkJCXJlc3BvbnNlID0gZXZlbnQ7CisJCQkJfQorCQkJCXN0YXRlLmt3QXJnc1sodHlwZW9mIHN0YXRlLmt3QXJncy5sb2FkID09ICJmdW5jdGlvbiIpID8gImxvYWQiIDogImhhbmRsZSJdKCJsb2FkIiwgcmVzcG9uc2UsIGV2ZW50LCBzdGF0ZS5rd0FyZ3MpOworCQkJCXN0YXRlLmlzRG9uZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgInBhcnRPayI6CisJCQkJdmFyIHBhcnQgPSBwYXJzZUludChldmVudC5yZXNwb25zZS5wYXJ0LCAxMCkgKyAxOworCQkJCWlmIChldmVudC5yZXNwb25zZS5jb25zdGFudFBhcmFtcykgeworCQkJCQlzdGF0ZS5jb25zdGFudFBhcmFtcyA9IGV2ZW50LnJlc3BvbnNlLmNvbnN0YW50UGFyYW1zOworCQkJCX0KKwkJCQl0aGlzLl9tdWx0aUF0dGFjaChzdGF0ZSwgcGFydCk7CisJCQkJc3RhdGUuaXNEb25lID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImVycm9yIjoKKwkJCQlzdGF0ZS5rd0FyZ3NbKHR5cGVvZiBzdGF0ZS5rd0FyZ3MuZXJyb3IgPT0gImZ1bmN0aW9uIikgPyAiZXJyb3IiIDogImhhbmRsZSJdKCJlcnJvciIsIGV2ZW50LnJlc3BvbnNlLCBldmVudCwgc3RhdGUua3dBcmdzKTsKKwkJCQlzdGF0ZS5pc0RvbmUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJICBkZWZhdWx0OgorCQkJCXN0YXRlLmt3QXJnc1sodHlwZW9mIHN0YXRlLmt3QXJnc1tjYWxsYmFja10gPT0gImZ1bmN0aW9uIikgPyBjYWxsYmFjayA6ICJoYW5kbGUiXShjYWxsYmFjaywgZXZlbnQsIGV2ZW50LCBzdGF0ZS5rd0FyZ3MpOworCQkJCXN0YXRlLmlzRG9uZSA9IHRydWU7CisJCQl9CisJCX0KKwl9OworCWRvam8uaW8udHJhbnNwb3J0cy5hZGRUcmFuc3BvcnQoIlNjcmlwdFNyY1RyYW5zcG9ydCIpOworfTsKK3dpbmRvdy5vbnNjcmlwdGxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKwl2YXIgc3RhdGUgPSBudWxsOworCXZhciB0cmFuc3BvcnQgPSBkb2pvLmlvLlNjcmlwdFNyY1RyYW5zcG9ydDsKKwlpZiAodHJhbnNwb3J0Ll9zdGF0ZVtldmVudC5pZF0pIHsKKwkJc3RhdGUgPSB0cmFuc3BvcnQuX3N0YXRlW2V2ZW50LmlkXTsKKwl9IGVsc2UgeworCQl2YXIgdGVtcFN0YXRlOworCQlmb3IgKHZhciBwYXJhbSBpbiB0cmFuc3BvcnQuX3N0YXRlKSB7CisJCQl0ZW1wU3RhdGUgPSB0cmFuc3BvcnQuX3N0YXRlW3BhcmFtXTsKKwkJCWlmICh0ZW1wU3RhdGUuZmluYWxVcmwgJiYgdGVtcFN0YXRlLmZpbmFsVXJsID09IGV2ZW50LmlkKSB7CisJCQkJc3RhdGUgPSB0ZW1wU3RhdGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHN0YXRlID09IG51bGwpIHsKKwkJCXZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOworCQkJZm9yICh2YXIgaSA9IDA7IHNjcmlwdHMgJiYgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YXIgc2NyaXB0VGFnID0gc2NyaXB0c1tpXTsKKwkJCQlpZiAoc2NyaXB0VGFnLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSA9PSAiU2NyaXB0U3JjVHJhbnNwb3J0IiAmJiBzY3JpcHRUYWcuc3JjID09IGV2ZW50LmlkKSB7CisJCQkJCXN0YXRlID0gdHJhbnNwb3J0Ll9zdGF0ZVtzY3JpcHRUYWcuaWRdOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN0YXRlID09IG51bGwpIHsKKwkJCXRocm93ICJObyBtYXRjaGluZyBzdGF0ZSBmb3Igb25zY3JpcHRsb2FkIGV2ZW50LmlkOiAiICsgZXZlbnQuaWQ7CisJCX0KKwl9CisJdmFyIGNhbGxiYWNrTmFtZSA9ICJlcnJvciI7CisJc3dpdGNoIChldmVudC5zdGF0dXMpIHsKKwkgIGNhc2UgZG9qby5pby5TY3JpcHRTcmNUcmFuc3BvcnQuRHNyU3RhdHVzQ29kZXMuQ29udGludWU6CisJCWNhbGxiYWNrTmFtZSA9ICJwYXJ0T2siOworCQlicmVhazsKKwkgIGNhc2UgZG9qby5pby5TY3JpcHRTcmNUcmFuc3BvcnQuRHNyU3RhdHVzQ29kZXMuT2s6CisJCWNhbGxiYWNrTmFtZSA9ICJsb2FkIjsKKwkJYnJlYWs7CisJfQorCXRyYW5zcG9ydC5fZmluaXNoKHN0YXRlLCBjYWxsYmFja05hbWUsIGV2ZW50KTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9YaHJJZnJhbWVQcm94eS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9YaHJJZnJhbWVQcm94eS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFjYzRkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL1hocklmcmFtZVByb3h5LmpzCkBAIC0wLDAgKzEsMTUyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmlvLlhocklmcmFtZVByb3h5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby5pby5YaHJJZnJhbWVQcm94eSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLklmcmFtZUlPIik7Citkb2pvLnJlcXVpcmUoImRvam8uZG9tIik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLlVyaSIpOworZG9qby5pby5YaHJJZnJhbWVQcm94eSA9IHt4aXBDbGllbnRVcmw6ZGpDb25maWdbInhpcENsaWVudFVybCJdIHx8IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby5pbyIsICJ4aXBfY2xpZW50Lmh0bWwiKSwgX3N0YXRlOnt9LCBfc3RhdGVJZENvdW50ZXI6MCwgbmVlZEZyYW1lUmVjdXJzaW9uOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gKHRydWUgPT0gZG9qby5yZW5kZXIuaHRtbC5pZTcwKTsKK30sIHNlbmQ6ZnVuY3Rpb24gKGZhY2FkZSkgeworCXZhciBzdGF0ZUlkID0gIlhocklmcmFtZVByb3h5IiArICh0aGlzLl9zdGF0ZUlkQ291bnRlcisrKTsKKwlmYWNhZGUuX3N0YXRlSWQgPSBzdGF0ZUlkOworCXZhciBmcmFtZVVybCA9IHRoaXMueGlwQ2xpZW50VXJsICsgIiMwOmluaXQ6aWQ9IiArIHN0YXRlSWQgKyAiJnNlcnZlcj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGZhY2FkZS5faWZwU2VydmVyVXJsKSArICImZnI9ZmFsc2UiOworCWlmICh0aGlzLm5lZWRGcmFtZVJlY3Vyc2lvbigpKSB7CisJCXZhciBmdWxsQ2xpZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CisJCWlmICgodGhpcy54aXBDbGllbnRVcmwgKyAiIikuY2hhckF0KDApID09ICIvIikgeworCQkJdmFyIGVuZEluZGV4ID0gZnVsbENsaWVudFVybC5pbmRleE9mKCI6Ly8iKTsKKwkJCWVuZEluZGV4ID0gZnVsbENsaWVudFVybC5pbmRleE9mKCIvIiwgZW5kSW5kZXggKyAxKTsKKwkJCWZ1bGxDbGllbnRVcmwgPSBmdWxsQ2xpZW50VXJsLnN1YnN0cmluZygwLCBlbmRJbmRleCk7CisJCX0gZWxzZSB7CisJCQlmdWxsQ2xpZW50VXJsID0gZnVsbENsaWVudFVybC5zdWJzdHJpbmcoMCwgZnVsbENsaWVudFVybC5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisJCX0KKwkJZnVsbENsaWVudFVybCArPSB0aGlzLnhpcENsaWVudFVybDsKKwkJdmFyIHNlcnZlclVybCA9IGZhY2FkZS5faWZwU2VydmVyVXJsICsgKGZhY2FkZS5faWZwU2VydmVyVXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIikgKyAiZG9qby5mcj0xIjsKKwkJZnJhbWVVcmwgPSBzZXJ2ZXJVcmwgKyAiIzA6aW5pdDppZD0iICsgc3RhdGVJZCArICImY2xpZW50PSIgKyBlbmNvZGVVUklDb21wb25lbnQoZnVsbENsaWVudFVybCkgKyAiJmZyPSIgKyB0aGlzLm5lZWRGcmFtZVJlY3Vyc2lvbigpOworCX0KKwl0aGlzLl9zdGF0ZVtzdGF0ZUlkXSA9IHtmYWNhZGU6ZmFjYWRlLCBzdGF0ZUlkOnN0YXRlSWQsIGNsaWVudEZyYW1lOmRvam8uaW8uY3JlYXRlSUZyYW1lKHN0YXRlSWQsICIiLCBmcmFtZVVybCl9OworCXJldHVybiBzdGF0ZUlkOworfSwgcmVjZWl2ZTpmdW5jdGlvbiAoc3RhdGVJZCwgdXJsRW5jb2RlZERhdGEpIHsKKwl2YXIgcmVzcG9uc2UgPSB7fTsKKwl2YXIgbnZQYWlycyA9IHVybEVuY29kZWREYXRhLnNwbGl0KCImIik7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBudlBhaXJzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChudlBhaXJzW2ldKSB7CisJCQl2YXIgbmFtZVZhbHVlID0gbnZQYWlyc1tpXS5zcGxpdCgiPSIpOworCQkJcmVzcG9uc2VbZGVjb2RlVVJJQ29tcG9uZW50KG5hbWVWYWx1ZVswXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG5hbWVWYWx1ZVsxXSk7CisJCX0KKwl9CisJdmFyIHN0YXRlID0gdGhpcy5fc3RhdGVbc3RhdGVJZF07CisJdmFyIGZhY2FkZSA9IHN0YXRlLmZhY2FkZTsKKwlmYWNhZGUuX3NldFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5yZXNwb25zZUhlYWRlcnMpOworCWlmIChyZXNwb25zZS5zdGF0dXMgPT0gMCB8fCByZXNwb25zZS5zdGF0dXMpIHsKKwkJZmFjYWRlLnN0YXR1cyA9IHBhcnNlSW50KHJlc3BvbnNlLnN0YXR1cywgMTApOworCX0KKwlpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkgeworCQlmYWNhZGUuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7CisJfQorCWlmIChyZXNwb25zZS5yZXNwb25zZVRleHQpIHsKKwkJZmFjYWRlLnJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKKwkJdmFyIGNvbnRlbnRUeXBlID0gZmFjYWRlLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKTsKKwkJaWYgKGNvbnRlbnRUeXBlICYmIChjb250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24veG1sIiB8fCBjb250ZW50VHlwZSA9PSAidGV4dC94bWwiKSkgeworCQkJZmFjYWRlLnJlc3BvbnNlWE1MID0gZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dChyZXNwb25zZS5yZXNwb25zZVRleHQsIGNvbnRlbnRUeXBlKTsKKwkJfQorCX0KKwlmYWNhZGUucmVhZHlTdGF0ZSA9IDQ7CisJdGhpcy5kZXN0cm95U3RhdGUoc3RhdGVJZCk7Cit9LCBjbGllbnRGcmFtZUxvYWRlZDpmdW5jdGlvbiAoc3RhdGVJZCkgeworCXZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlW3N0YXRlSWRdOworCXZhciBmYWNhZGUgPSBzdGF0ZS5mYWNhZGU7CisJaWYgKHRoaXMubmVlZEZyYW1lUmVjdXJzaW9uKCkpIHsKKwkJdmFyIGNsaWVudFdpbmRvdyA9IHdpbmRvdy5vcGVuKCIiLCBzdGF0ZS5zdGF0ZUlkICsgIl9jbGllbnRFbmRQb2ludCIpOworCX0gZWxzZSB7CisJCXZhciBjbGllbnRXaW5kb3cgPSBzdGF0ZS5jbGllbnRGcmFtZS5jb250ZW50V2luZG93OworCX0KKwl2YXIgcmVxSGVhZGVycyA9IFtdOworCWZvciAodmFyIHBhcmFtIGluIGZhY2FkZS5fcmVxdWVzdEhlYWRlcnMpIHsKKwkJcmVxSGVhZGVycy5wdXNoKHBhcmFtICsgIjogIiArIGZhY2FkZS5fcmVxdWVzdEhlYWRlcnNbcGFyYW1dKTsKKwl9CisJdmFyIHJlcXVlc3REYXRhID0ge3VyaTpmYWNhZGUuX3VyaX07CisJaWYgKHJlcUhlYWRlcnMubGVuZ3RoID4gMCkgeworCQlyZXF1ZXN0RGF0YS5yZXF1ZXN0SGVhZGVycyA9IHJlcUhlYWRlcnMuam9pbigiXHJcbiIpOworCX0KKwlpZiAoZmFjYWRlLl9tZXRob2QpIHsKKwkJcmVxdWVzdERhdGEubWV0aG9kID0gZmFjYWRlLl9tZXRob2Q7CisJfQorCWlmIChmYWNhZGUuX2JvZHlEYXRhKSB7CisJCXJlcXVlc3REYXRhLmRhdGEgPSBmYWNhZGUuX2JvZHlEYXRhOworCX0KKwljbGllbnRXaW5kb3cuc2VuZChkb2pvLmlvLmFyZ3NGcm9tTWFwKHJlcXVlc3REYXRhLCAidXRmOCIpKTsKK30sIGRlc3Ryb3lTdGF0ZTpmdW5jdGlvbiAoc3RhdGVJZCkgeworCXZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlW3N0YXRlSWRdOworCWlmIChzdGF0ZSkgeworCQlkZWxldGUgdGhpcy5fc3RhdGVbc3RhdGVJZF07CisJCXZhciBwYXJlbnROb2RlID0gc3RhdGUuY2xpZW50RnJhbWUucGFyZW50Tm9kZTsKKwkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdGF0ZS5jbGllbnRGcmFtZSk7CisJCXN0YXRlLmNsaWVudEZyYW1lID0gbnVsbDsKKwkJc3RhdGUgPSBudWxsOworCX0KK30sIGNyZWF0ZUZhY2FkZTpmdW5jdGlvbiAoKSB7CisJaWYgKGFyZ3VtZW50cyAmJiBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdWyJpZnJhbWVQcm94eVVybCJdKSB7CisJCXJldHVybiBuZXcgZG9qby5pby5YaHJJZnJhbWVGYWNhZGUoYXJndW1lbnRzWzBdWyJpZnJhbWVQcm94eVVybCJdKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZG9qby5pby5YaHJJZnJhbWVQcm94eS5vbGRHZXRYbWxodHRwT2JqZWN0LmFwcGx5KGRvam8uaG9zdGVudiwgYXJndW1lbnRzKTsKKwl9Cit9fTsKK2Rvam8uaW8uWGhySWZyYW1lUHJveHkub2xkR2V0WG1saHR0cE9iamVjdCA9IGRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0OworZG9qby5ob3N0ZW52LmdldFhtbGh0dHBPYmplY3QgPSBkb2pvLmlvLlhocklmcmFtZVByb3h5LmNyZWF0ZUZhY2FkZTsKK2Rvam8uaW8uWGhySWZyYW1lRmFjYWRlID0gZnVuY3Rpb24gKGlmcFNlcnZlclVybCkgeworCXRoaXMuX3JlcXVlc3RIZWFkZXJzID0ge307CisJdGhpcy5fYWxsUmVzcG9uc2VIZWFkZXJzID0gbnVsbDsKKwl0aGlzLl9yZXNwb25zZUhlYWRlcnMgPSB7fTsKKwl0aGlzLl9tZXRob2QgPSBudWxsOworCXRoaXMuX3VyaSA9IG51bGw7CisJdGhpcy5fYm9keURhdGEgPSBudWxsOworCXRoaXMucmVzcG9uc2VUZXh0ID0gbnVsbDsKKwl0aGlzLnJlc3BvbnNlWE1MID0gbnVsbDsKKwl0aGlzLnN0YXR1cyA9IG51bGw7CisJdGhpcy5zdGF0dXNUZXh0ID0gbnVsbDsKKwl0aGlzLnJlYWR5U3RhdGUgPSAwOworCXRoaXMuX2lmcFNlcnZlclVybCA9IGlmcFNlcnZlclVybDsKKwl0aGlzLl9zdGF0ZUlkID0gbnVsbDsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uaW8uWGhySWZyYW1lRmFjYWRlLCB7b3BlbjpmdW5jdGlvbiAobWV0aG9kLCB1cmkpIHsKKwl0aGlzLl9tZXRob2QgPSBtZXRob2Q7CisJdGhpcy5fdXJpID0gdXJpOworCXRoaXMucmVhZHlTdGF0ZSA9IDE7Cit9LCBzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uIChoZWFkZXIsIHZhbHVlKSB7CisJdGhpcy5fcmVxdWVzdEhlYWRlcnNbaGVhZGVyXSA9IHZhbHVlOworfSwgc2VuZDpmdW5jdGlvbiAoc3RyaW5nRGF0YSkgeworCXRoaXMuX2JvZHlEYXRhID0gc3RyaW5nRGF0YTsKKwl0aGlzLl9zdGF0ZUlkID0gZG9qby5pby5YaHJJZnJhbWVQcm94eS5zZW5kKHRoaXMpOworCXRoaXMucmVhZHlTdGF0ZSA9IDI7Cit9LCBhYm9ydDpmdW5jdGlvbiAoKSB7CisJZG9qby5pby5YaHJJZnJhbWVQcm94eS5kZXN0cm95U3RhdGUodGhpcy5fc3RhdGVJZCk7Cit9LCBnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9hbGxSZXNwb25zZUhlYWRlcnM7Cit9LCBnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbiAoaGVhZGVyKSB7CisJcmV0dXJuIHRoaXMuX3Jlc3BvbnNlSGVhZGVyc1toZWFkZXJdOworfSwgX3NldFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbiAoYWxsSGVhZGVycykgeworCWlmIChhbGxIZWFkZXJzKSB7CisJCXRoaXMuX2FsbFJlc3BvbnNlSGVhZGVycyA9IGFsbEhlYWRlcnM7CisJCWFsbEhlYWRlcnMgPSBhbGxIZWFkZXJzLnJlcGxhY2UoL1xyL2csICIiKTsKKwkJdmFyIG52UGFpcnMgPSBhbGxIZWFkZXJzLnNwbGl0KCJcbiIpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG52UGFpcnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChudlBhaXJzW2ldKSB7CisJCQkJdmFyIG5hbWVWYWx1ZSA9IG52UGFpcnNbaV0uc3BsaXQoIjogIik7CisJCQkJdGhpcy5fcmVzcG9uc2VIZWFkZXJzW25hbWVWYWx1ZVswXV0gPSBuYW1lVmFsdWVbMV07CisJCQl9CisJCX0KKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE5ODBkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmlvLmNvbW1vbiJdLCByaGlubzpbImRvam8uaW8uUmhpbm9JTyJdLCBicm93c2VyOlsiZG9qby5pby5Ccm93c2VySU8iLCAiZG9qby5pby5jb29raWUiXSwgZGFzaGJvYXJkOlsiZG9qby5pby5Ccm93c2VySU8iLCAiZG9qby5pby5jb29raWUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmlvLioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL2NvbWV0ZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9jb21ldGQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwZDdhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9jb21ldGQuanMKQEAgLTAsMCArMSw1MzAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uaW8uY29tbW9uIik7Citkb2pvLnByb3ZpZGUoImRvam8uaW8uY29tZXRkIik7Citkb2pvLnJlcXVpcmUoImRvam8uQWRhcHRlclJlZ2lzdHJ5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLkJyb3dzZXJJTyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLklmcmFtZUlPIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uU2NyaXB0U3JjSU8iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby5jb29raWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2NvbWV0ZCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOworCXRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisJdGhpcy5jb25uZWN0aW9uVHlwZXMgPSBuZXcgZG9qby5BZGFwdGVyUmVnaXN0cnkodHJ1ZSk7CisJdGhpcy52ZXJzaW9uID0gMC4xOworCXRoaXMubWluaW11bVZlcnNpb24gPSAwLjE7CisJdGhpcy5jbGllbnRJZCA9IG51bGw7CisJdGhpcy5faXNYRCA9IGZhbHNlOworCXRoaXMuaGFuZHNoYWtlUmV0dXJuID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRUcmFuc3BvcnQgPSBudWxsOworCXRoaXMudXJsID0gbnVsbDsKKwl0aGlzLmxhc3RNZXNzYWdlID0gbnVsbDsKKwl0aGlzLmdsb2JhbFRvcGljQ2hhbm5lbHMgPSB7fTsKKwl0aGlzLmJhY2tsb2cgPSBbXTsKKwl0aGlzLnR1bm5lbEluaXQgPSBmdW5jdGlvbiAoY2hpbGRMb2NhdGlvbiwgY2hpbGREb21haW4pIHsKKwl9OworCXRoaXMudHVubmVsQ29sbGFwc2UgPSBmdW5jdGlvbiAoKSB7CisJCWRvam8uZGVidWcoInR1bm5lbCBjb2xsYXBzZWQhIik7CisJfTsKKwl0aGlzLmluaXQgPSBmdW5jdGlvbiAocHJvcHMsIHJvb3QsIGJhcmdzKSB7CisJCXByb3BzID0gcHJvcHMgfHwge307CisJCXByb3BzLnZlcnNpb24gPSB0aGlzLnZlcnNpb247CisJCXByb3BzLm1pbmltdW1WZXJzaW9uID0gdGhpcy5taW5pbXVtVmVyc2lvbjsKKwkJcHJvcHMuY2hhbm5lbCA9ICIvbWV0YS9oYW5kc2hha2UiOworCQl0aGlzLnVybCA9IHJvb3QgfHwgZGpDb25maWdbImNvbWV0ZFJvb3QiXTsKKwkJaWYgKCF0aGlzLnVybCkgeworCQkJZG9qby5kZWJ1Zygibm8gY29tZXRkIHJvb3Qgc3BlY2lmaWVkIGluIGRqQ29uZmlnIGFuZCBubyByb290IHBhc3NlZCIpOworCQkJcmV0dXJuOworCQl9CisJCXZhciBiaW5kQXJncyA9IHt1cmw6dGhpcy51cmwsIG1ldGhvZDoiUE9TVCIsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBsb2FkOmRvam8ubGFuZy5oaXRjaCh0aGlzLCAiZmluaXNoSW5pdCIpLCBjb250ZW50OnsibWVzc2FnZSI6ZG9qby5qc29uLnNlcmlhbGl6ZShbcHJvcHNdKX19OworCQl2YXIgcmVnZXhwID0gIl4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kIjsKKwkJdmFyIHIgPSAoIiIgKyB3aW5kb3cubG9jYXRpb24pLm1hdGNoKG5ldyBSZWdFeHAocmVnZXhwKSk7CisJCWlmIChyWzRdKSB7CisJCQl2YXIgdG1wID0gcls0XS5zcGxpdCgiOiIpOworCQkJdmFyIHRoaXNIb3N0ID0gdG1wWzBdOworCQkJdmFyIHRoaXNQb3J0ID0gdG1wWzFdIHx8ICI4MCI7CisJCQlyID0gdGhpcy51cmwubWF0Y2gobmV3IFJlZ0V4cChyZWdleHApKTsKKwkJCWlmIChyWzRdKSB7CisJCQkJdG1wID0gcls0XS5zcGxpdCgiOiIpOworCQkJCXZhciB1cmxIb3N0ID0gdG1wWzBdOworCQkJCXZhciB1cmxQb3J0ID0gdG1wWzFdIHx8ICI4MCI7CisJCQkJaWYgKCh1cmxIb3N0ICE9IHRoaXNIb3N0KSB8fCAodXJsUG9ydCAhPSB0aGlzUG9ydCkpIHsKKwkJCQkJZG9qby5kZWJ1Zyh0aGlzSG9zdCwgdXJsSG9zdCk7CisJCQkJCWRvam8uZGVidWcodGhpc1BvcnQsIHVybFBvcnQpOworCQkJCQl0aGlzLl9pc1hEID0gdHJ1ZTsKKwkJCQkJYmluZEFyZ3MudHJhbnNwb3J0ID0gIlNjcmlwdFNyY1RyYW5zcG9ydCI7CisJCQkJCWJpbmRBcmdzLmpzb25QYXJhbU5hbWUgPSAianNvbnAiOworCQkJCQliaW5kQXJncy5tZXRob2QgPSAiR0VUIjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGJhcmdzKSB7CisJCQlkb2pvLmxhbmcubWl4aW4oYmluZEFyZ3MsIGJhcmdzKTsKKwkJfQorCQlyZXR1cm4gZG9qby5pby5iaW5kKGJpbmRBcmdzKTsKKwl9OworCXRoaXMuZmluaXNoSW5pdCA9IGZ1bmN0aW9uICh0eXBlLCBkYXRhLCBldnQsIHJlcXVlc3QpIHsKKwkJZGF0YSA9IGRhdGFbMF07CisJCXRoaXMuaGFuZHNoYWtlUmV0dXJuID0gZGF0YTsKKwkJaWYgKGRhdGFbImF1dGhTdWNjZXNzZnVsIl0gPT0gZmFsc2UpIHsKKwkJCWRvam8uZGVidWcoImNvbWV0ZCBhdXRoZW50aWNhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZGF0YS52ZXJzaW9uIDwgdGhpcy5taW5pbXVtVmVyc2lvbikgeworCQkJZG9qby5kZWJ1ZygiY29tZXRkIHByb3RvY29sIHZlcnNpb24gbWlzbWF0Y2guIFdlIHdhbnRlZCIsIHRoaXMubWluaW11bVZlcnNpb24sICJidXQgZ290IiwgZGF0YS52ZXJzaW9uKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLmN1cnJlbnRUcmFuc3BvcnQgPSB0aGlzLmNvbm5lY3Rpb25UeXBlcy5tYXRjaChkYXRhLnN1cHBvcnRlZENvbm5lY3Rpb25UeXBlcywgZGF0YS52ZXJzaW9uLCB0aGlzLl9pc1hEKTsKKwkJdGhpcy5jdXJyZW50VHJhbnNwb3J0LnZlcnNpb24gPSBkYXRhLnZlcnNpb247CisJCXRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudElkOworCQl0aGlzLnR1bm5lbEluaXQgPSBkb2pvLmxhbmcuaGl0Y2godGhpcy5jdXJyZW50VHJhbnNwb3J0LCAidHVubmVsSW5pdCIpOworCQl0aGlzLnR1bm5lbENvbGxhcHNlID0gZG9qby5sYW5nLmhpdGNoKHRoaXMuY3VycmVudFRyYW5zcG9ydCwgInR1bm5lbENvbGxhcHNlIik7CisJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOworCQl0aGlzLmN1cnJlbnRUcmFuc3BvcnQuc3RhcnR1cChkYXRhKTsKKwkJd2hpbGUgKHRoaXMuYmFja2xvZy5sZW5ndGggIT0gMCkgeworCQkJdmFyIGN1ciA9IHRoaXMuYmFja2xvZy5zaGlmdCgpOworCQkJdmFyIGZuID0gY3VyLnNoaWZ0KCk7CisJCQl0aGlzW2ZuXS5hcHBseSh0aGlzLCBjdXIpOworCQl9CisJfTsKKwl0aGlzLl9nZXRSYW5kU3RyID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnN1YnN0cmluZygyLCAxMCk7CisJfTsKKwl0aGlzLmRlbGl2ZXIgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHsKKwkJZG9qby5sYW5nLmZvckVhY2gobWVzc2FnZXMsIHRoaXMuX2RlbGl2ZXIsIHRoaXMpOworCX07CisJdGhpcy5fZGVsaXZlciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CisJCWlmICghbWVzc2FnZVsiY2hhbm5lbCJdKSB7CisJCQlkb2pvLmRlYnVnKCJjb21ldGQgZXJyb3I6IG5vIGNoYW5uZWwgZm9yIG1lc3NhZ2UhIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCF0aGlzLmN1cnJlbnRUcmFuc3BvcnQpIHsKKwkJCXRoaXMuYmFja2xvZy5wdXNoKFsiZGVsaXZlciIsIG1lc3NhZ2VdKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLmxhc3RNZXNzYWdlID0gbWVzc2FnZTsKKwkJaWYgKChtZXNzYWdlLmNoYW5uZWwubGVuZ3RoID4gNSkgJiYgKG1lc3NhZ2UuY2hhbm5lbC5zdWJzdHIoMCwgNSkgPT0gIi9tZXRhIikpIHsKKwkJCXN3aXRjaCAobWVzc2FnZS5jaGFubmVsKSB7CisJCQkgIGNhc2UgIi9tZXRhL3N1YnNjcmliZSI6CisJCQkJaWYgKCFtZXNzYWdlLnN1Y2Nlc3NmdWwpIHsKKwkJCQkJZG9qby5kZWJ1ZygiY29tZXRkIHN1YnNjcmlwdGlvbiBlcnJvciBmb3IgY2hhbm5lbCIsIG1lc3NhZ2UuY2hhbm5lbCwgIjoiLCBtZXNzYWdlLmVycm9yKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQl0aGlzLnN1YnNjcmliZWQobWVzc2FnZS5zdWJzY3JpcHRpb24sIG1lc3NhZ2UpOworCQkJCWJyZWFrOworCQkJICBjYXNlICIvbWV0YS91bnN1YnNjcmliZSI6CisJCQkJaWYgKCFtZXNzYWdlLnN1Y2Nlc3NmdWwpIHsKKwkJCQkJZG9qby5kZWJ1ZygiY29tZXRkIHVuc3Vic2NyaXB0aW9uIGVycm9yIGZvciBjaGFubmVsIiwgbWVzc2FnZS5jaGFubmVsLCAiOiIsIG1lc3NhZ2UuZXJyb3IpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXRoaXMudW5zdWJzY3JpYmVkKG1lc3NhZ2Uuc3Vic2NyaXB0aW9uLCBtZXNzYWdlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQl0aGlzLmN1cnJlbnRUcmFuc3BvcnQuZGVsaXZlcihtZXNzYWdlKTsKKwkJaWYgKG1lc3NhZ2UuZGF0YSkgeworCQkJdmFyIHRuYW1lID0gKHRoaXMuZ2xvYmFsVG9waWNDaGFubmVsc1ttZXNzYWdlLmNoYW5uZWxdKSA/IG1lc3NhZ2UuY2hhbm5lbCA6ICIvY29tZXRkIiArIG1lc3NhZ2UuY2hhbm5lbDsKKwkJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0bmFtZSwgbWVzc2FnZSk7CisJCX0KKwl9OworCXRoaXMuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKCF0aGlzLmN1cnJlbnRUcmFuc3BvcnQpIHsKKwkJCWRvam8uZGVidWcoIm5vIGN1cnJlbnQgdHJhbnNwb3J0IHRvIGRpc2Nvbm5lY3QgZnJvbSIpOworCQkJcmV0dXJuOworCQl9CisJCXRoaXMuY3VycmVudFRyYW5zcG9ydC5kaXNjb25uZWN0KCk7CisJfTsKKwl0aGlzLnB1Ymxpc2ggPSBmdW5jdGlvbiAoY2hhbm5lbCwgZGF0YSwgcHJvcGVydGllcykgeworCQlpZiAoIXRoaXMuY3VycmVudFRyYW5zcG9ydCkgeworCQkJdGhpcy5iYWNrbG9nLnB1c2goWyJwdWJsaXNoIiwgY2hhbm5lbCwgZGF0YSwgcHJvcGVydGllc10pOworCQkJcmV0dXJuOworCQl9CisJCXZhciBtZXNzYWdlID0ge2RhdGE6ZGF0YSwgY2hhbm5lbDpjaGFubmVsfTsKKwkJaWYgKHByb3BlcnRpZXMpIHsKKwkJCWRvam8ubGFuZy5taXhpbihtZXNzYWdlLCBwcm9wZXJ0aWVzKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5jdXJyZW50VHJhbnNwb3J0LnNlbmRNZXNzYWdlKG1lc3NhZ2UpOworCX07CisJdGhpcy5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoY2hhbm5lbCwgdXNlTG9jYWxUb3BpY3MsIG9iak9yRnVuYywgZnVuY05hbWUpIHsKKwkJaWYgKCF0aGlzLmN1cnJlbnRUcmFuc3BvcnQpIHsKKwkJCXRoaXMuYmFja2xvZy5wdXNoKFsic3Vic2NyaWJlIiwgY2hhbm5lbCwgdXNlTG9jYWxUb3BpY3MsIG9iak9yRnVuYywgZnVuY05hbWVdKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAob2JqT3JGdW5jKSB7CisJCQl2YXIgdG5hbWUgPSAodXNlTG9jYWxUb3BpY3MpID8gY2hhbm5lbCA6ICIvY29tZXRkIiArIGNoYW5uZWw7CisJCQlpZiAodXNlTG9jYWxUb3BpY3MpIHsKKwkJCQl0aGlzLmdsb2JhbFRvcGljQ2hhbm5lbHNbY2hhbm5lbF0gPSB0cnVlOworCQkJfQorCQkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG5hbWUsIG9iak9yRnVuYywgZnVuY05hbWUpOworCQl9CisJCXJldHVybiB0aGlzLmN1cnJlbnRUcmFuc3BvcnQuc2VuZE1lc3NhZ2Uoe2NoYW5uZWw6Ii9tZXRhL3N1YnNjcmliZSIsIHN1YnNjcmlwdGlvbjpjaGFubmVsfSk7CisJfTsKKwl0aGlzLnN1YnNjcmliZWQgPSBmdW5jdGlvbiAoY2hhbm5lbCwgbWVzc2FnZSkgeworCQlkb2pvLmRlYnVnKGNoYW5uZWwpOworCQlkb2pvLmRlYnVnU2hhbGxvdyhtZXNzYWdlKTsKKwl9OworCXRoaXMudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoY2hhbm5lbCwgdXNlTG9jYWxUb3BpY3MsIG9iak9yRnVuYywgZnVuY05hbWUpIHsKKwkJaWYgKCF0aGlzLmN1cnJlbnRUcmFuc3BvcnQpIHsKKwkJCXRoaXMuYmFja2xvZy5wdXNoKFsidW5zdWJzY3JpYmUiLCBjaGFubmVsLCB1c2VMb2NhbFRvcGljcywgb2JqT3JGdW5jLCBmdW5jTmFtZV0pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChvYmpPckZ1bmMpIHsKKwkJCXZhciB0bmFtZSA9ICh1c2VMb2NhbFRvcGljcykgPyBjaGFubmVsIDogIi9jb21ldGQiICsgY2hhbm5lbDsKKwkJCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodG5hbWUsIG9iak9yRnVuYywgZnVuY05hbWUpOworCQl9CisJCXJldHVybiB0aGlzLmN1cnJlbnRUcmFuc3BvcnQuc2VuZE1lc3NhZ2Uoe2NoYW5uZWw6Ii9tZXRhL3Vuc3Vic2NyaWJlIiwgc3Vic2NyaXB0aW9uOmNoYW5uZWx9KTsKKwl9OworCXRoaXMudW5zdWJzY3JpYmVkID0gZnVuY3Rpb24gKGNoYW5uZWwsIG1lc3NhZ2UpIHsKKwkJZG9qby5kZWJ1ZyhjaGFubmVsKTsKKwkJZG9qby5kZWJ1Z1NoYWxsb3cobWVzc2FnZSk7CisJfTsKK307Citjb21ldGQuaWZyYW1lVHJhbnNwb3J0ID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworCXRoaXMuY29ubmVjdGlvbklkID0gbnVsbDsKKwl0aGlzLnJjdk5vZGUgPSBudWxsOworCXRoaXMucmN2Tm9kZU5hbWUgPSAiIjsKKwl0aGlzLnBob255Rm9ybSA9IG51bGw7CisJdGhpcy5hdXRoVG9rZW4gPSBudWxsOworCXRoaXMubGFzdFRpbWVzdGFtcCA9IG51bGw7CisJdGhpcy5sYXN0SWQgPSBudWxsOworCXRoaXMuYmFja2xvZyA9IFtdOworCXRoaXMuY2hlY2sgPSBmdW5jdGlvbiAodHlwZXMsIHZlcnNpb24sIHhkb21haW4pIHsKKwkJcmV0dXJuICgoIXhkb21haW4pICYmICghZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpICYmIChkb2pvLmxhbmcuaW5BcnJheSh0eXBlcywgImlmcmFtZSIpKSk7CisJfTsKKwl0aGlzLnR1bm5lbEluaXQgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMucG9zdFRvSWZyYW1lKHttZXNzYWdlOmRvam8uanNvbi5zZXJpYWxpemUoW3tjaGFubmVsOiIvbWV0YS9jb25uZWN0IiwgY2xpZW50SWQ6Y29tZXRkLmNsaWVudElkLCBjb25uZWN0aW9uVHlwZToiaWZyYW1lIn1dKX0pOworCX07CisJdGhpcy50dW5uZWxDb2xsYXBzZSA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQl0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworCQkJdGhpcy5wb3N0VG9JZnJhbWUoe21lc3NhZ2U6ZG9qby5qc29uLnNlcmlhbGl6ZShbe2NoYW5uZWw6Ii9tZXRhL3JlY29ubmVjdCIsIGNsaWVudElkOmNvbWV0ZC5jbGllbnRJZCwgY29ubmVjdGlvbklkOnRoaXMuY29ubmVjdGlvbklkLCB0aW1lc3RhbXA6dGhpcy5sYXN0VGltZXN0YW1wLCBpZDp0aGlzLmxhc3RJZH1dKX0pOworCQl9CisJfTsKKwl0aGlzLmRlbGl2ZXIgPSBmdW5jdGlvbiAobWVzc2FnZSkgeworCQlpZiAobWVzc2FnZVsidGltZXN0YW1wIl0pIHsKKwkJCXRoaXMubGFzdFRpbWVzdGFtcCA9IG1lc3NhZ2UudGltZXN0YW1wOworCQl9CisJCWlmIChtZXNzYWdlWyJpZCJdKSB7CisJCQl0aGlzLmxhc3RJZCA9IG1lc3NhZ2UuaWQ7CisJCX0KKwkJaWYgKChtZXNzYWdlLmNoYW5uZWwubGVuZ3RoID4gNSkgJiYgKG1lc3NhZ2UuY2hhbm5lbC5zdWJzdHIoMCwgNSkgPT0gIi9tZXRhIikpIHsKKwkJCXN3aXRjaCAobWVzc2FnZS5jaGFubmVsKSB7CisJCQkgIGNhc2UgIi9tZXRhL2Nvbm5lY3QiOgorCQkJCWlmICghbWVzc2FnZS5zdWNjZXNzZnVsKSB7CisJCQkJCWRvam8uZGVidWcoImNvbWV0ZCBjb25uZWN0aW9uIGVycm9yOiIsIG1lc3NhZ2UuZXJyb3IpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXRoaXMuY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisJCQkJdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCQkJCXRoaXMucHJvY2Vzc0JhY2tsb2coKTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiL21ldGEvcmVjb25uZWN0IjoKKwkJCQlpZiAoIW1lc3NhZ2Uuc3VjY2Vzc2Z1bCkgeworCQkJCQlkb2pvLmRlYnVnKCJjb21ldGQgcmVjb25uZWN0aW9uIGVycm9yOiIsIG1lc3NhZ2UuZXJyb3IpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXRoaXMuY29ubmVjdGVkID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSAiL21ldGEvc3Vic2NyaWJlIjoKKwkJCQlpZiAoIW1lc3NhZ2Uuc3VjY2Vzc2Z1bCkgeworCQkJCQlkb2pvLmRlYnVnKCJjb21ldGQgc3Vic2NyaXB0aW9uIGVycm9yIGZvciBjaGFubmVsIiwgbWVzc2FnZS5jaGFubmVsLCAiOiIsIG1lc3NhZ2UuZXJyb3IpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWRvam8uZGVidWcobWVzc2FnZS5jaGFubmVsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX07CisJdGhpcy53aWRlbkRvbWFpbiA9IGZ1bmN0aW9uIChkb21haW5TdHIpIHsKKwkJdmFyIGNkID0gZG9tYWluU3RyIHx8IGRvY3VtZW50LmRvbWFpbjsKKwkJaWYgKGNkLmluZGV4T2YoIi4iKSA9PSAtMSkgeworCQkJcmV0dXJuOworCQl9CisJCXZhciBkcHMgPSBjZC5zcGxpdCgiLiIpOworCQlpZiAoZHBzLmxlbmd0aCA8PSAyKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZHBzID0gZHBzLnNsaWNlKGRwcy5sZW5ndGggLSAyKTsKKwkJZG9jdW1lbnQuZG9tYWluID0gZHBzLmpvaW4oIi4iKTsKKwkJcmV0dXJuIGRvY3VtZW50LmRvbWFpbjsKKwl9OworCXRoaXMucG9zdFRvSWZyYW1lID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCkgeworCQlpZiAoIXRoaXMucGhvbnlGb3JtKSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCXRoaXMucGhvbnlGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiPGZvcm0gZW5jdHlwZT0nYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyBtZXRob2Q9J1BPU1QnIHN0eWxlPSdkaXNwbGF5OiBub25lOyc+Iik7CisJCQkJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5waG9ueUZvcm0pOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnBob255Rm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKTsKKwkJCQl0aGlzLnBob255Rm9ybS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMucGhvbnlGb3JtKTsKKwkJCQl0aGlzLnBob255Rm9ybS5lbmN0eXBlID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7CisJCQkJdGhpcy5waG9ueUZvcm0ubWV0aG9kID0gIlBPU1QiOworCQkJfQorCQl9CisJCXRoaXMucGhvbnlGb3JtLmFjdGlvbiA9IHVybCB8fCBjb21ldGQudXJsOworCQl0aGlzLnBob255Rm9ybS50YXJnZXQgPSB0aGlzLnJjdk5vZGVOYW1lOworCQl0aGlzLnBob255Rm9ybS5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIHRoaXMucmN2Tm9kZU5hbWUpOworCQl3aGlsZSAodGhpcy5waG9ueUZvcm0uZmlyc3RDaGlsZCkgeworCQkJdGhpcy5waG9ueUZvcm0ucmVtb3ZlQ2hpbGQodGhpcy5waG9ueUZvcm0uZmlyc3RDaGlsZCk7CisJCX0KKwkJZm9yICh2YXIgeCBpbiBjb250ZW50KSB7CisJCQl2YXIgdG47CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCXRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nIiArIHggKyAiJyB2YWx1ZT0nIiArIGNvbnRlbnRbeF0gKyAiJz4iKTsKKwkJCQl0aGlzLnBob255Rm9ybS5hcHBlbmRDaGlsZCh0bik7CisJCQl9IGVsc2UgeworCQkJCXRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKwkJCQl0aGlzLnBob255Rm9ybS5hcHBlbmRDaGlsZCh0bik7CisJCQkJdG4udHlwZSA9ICJoaWRkZW4iOworCQkJCXRuLm5hbWUgPSB4OworCQkJCXRuLnZhbHVlID0gY29udGVudFt4XTsKKwkJCX0KKwkJfQorCQl0aGlzLnBob255Rm9ybS5zdWJtaXQoKTsKKwl9OworCXRoaXMucHJvY2Vzc0JhY2tsb2cgPSBmdW5jdGlvbiAoKSB7CisJCXdoaWxlICh0aGlzLmJhY2tsb2cubGVuZ3RoID4gMCkgeworCQkJdGhpcy5zZW5kTWVzc2FnZSh0aGlzLmJhY2tsb2cuc2hpZnQoKSwgdHJ1ZSk7CisJCX0KKwl9OworCXRoaXMuc2VuZE1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgYnlwYXNzQmFja2xvZykgeworCQlpZiAoKGJ5cGFzc0JhY2tsb2cpIHx8ICh0aGlzLmNvbm5lY3RlZCkpIHsKKwkJCW1lc3NhZ2UuY29ubmVjdGlvbklkID0gdGhpcy5jb25uZWN0aW9uSWQ7CisJCQltZXNzYWdlLmNsaWVudElkID0gY29tZXRkLmNsaWVudElkOworCQkJdmFyIGJpbmRBcmdzID0ge3VybDpjb21ldGQudXJsIHx8IGRqQ29uZmlnWyJjb21ldGRSb290Il0sIG1ldGhvZDoiUE9TVCIsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBjb250ZW50OnttZXNzYWdlOmRvam8uanNvbi5zZXJpYWxpemUoW21lc3NhZ2VdKX19OworCQkJcmV0dXJuIGRvam8uaW8uYmluZChiaW5kQXJncyk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTsKKwkJfQorCX07CisJdGhpcy5zdGFydHVwID0gZnVuY3Rpb24gKGhhbmRzaGFrZURhdGEpIHsKKwkJZG9qby5kZWJ1Zygic3RhcnR1cCEiKTsKKwkJZG9qby5kZWJ1Zyhkb2pvLmpzb24uc2VyaWFsaXplKGhhbmRzaGFrZURhdGEpKTsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5yY3ZOb2RlTmFtZSA9ICJjb21ldGRSY3ZfIiArIGNvbWV0ZC5fZ2V0UmFuZFN0cigpOworCQl2YXIgaW5pdFVybCA9IGNvbWV0ZC51cmwgKyAiLz90dW5uZWxJbml0PWlmcmFtZSI7CisJCWlmIChmYWxzZSAmJiBkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQl0aGlzLnJjdk5vZGUgPSBuZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKTsKKwkJCXRoaXMucmN2Tm9kZS5vcGVuKCk7CisJCQl0aGlzLnJjdk5vZGUud3JpdGUoIjxodG1sPiIpOworCQkJdGhpcy5yY3ZOb2RlLndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LmRvbWFpbiA9ICciICsgZG9jdW1lbnQuZG9tYWluICsgIiciKTsKKwkJCXRoaXMucmN2Tm9kZS53cml0ZSgiPC9odG1sPiIpOworCQkJdGhpcy5yY3ZOb2RlLmNsb3NlKCk7CisJCQl2YXIgaWZyRGl2ID0gdGhpcy5yY3ZOb2RlLmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJdGhpcy5yY3ZOb2RlLmFwcGVuZENoaWxkKGlmckRpdik7CisJCQl0aGlzLnJjdk5vZGUucGFyZW50V2luZG93LmRvam8gPSBkb2pvOworCQkJaWZyRGl2LmlubmVySFRNTCA9ICI8aWZyYW1lIHNyYz0nIiArIGluaXRVcmwgKyAiJz48L2lmcmFtZT4iOworCQl9IGVsc2UgeworCQkJdGhpcy5yY3ZOb2RlID0gZG9qby5pby5jcmVhdGVJRnJhbWUodGhpcy5yY3ZOb2RlTmFtZSwgIiIsIGluaXRVcmwpOworCQl9CisJfTsKK307Citjb21ldGQubWltZVJlcGxhY2VUcmFuc3BvcnQgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisJdGhpcy5jb25uZWN0aW9uSWQgPSBudWxsOworCXRoaXMueGhyID0gbnVsbDsKKwl0aGlzLmF1dGhUb2tlbiA9IG51bGw7CisJdGhpcy5sYXN0VGltZXN0YW1wID0gbnVsbDsKKwl0aGlzLmxhc3RJZCA9IG51bGw7CisJdGhpcy5iYWNrbG9nID0gW107CisJdGhpcy5jaGVjayA9IGZ1bmN0aW9uICh0eXBlcywgdmVyc2lvbiwgeGRvbWFpbikgeworCQlyZXR1cm4gKCgheGRvbWFpbikgJiYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgJiYgKGRvam8ubGFuZy5pbkFycmF5KHR5cGVzLCAibWltZS1tZXNzYWdlLWJsb2NrIikpKTsKKwl9OworCXRoaXMudHVubmVsSW5pdCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5vcGVuVHVubmVsV2l0aCh7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFt7Y2hhbm5lbDoiL21ldGEvY29ubmVjdCIsIGNsaWVudElkOmNvbWV0ZC5jbGllbnRJZCwgY29ubmVjdGlvblR5cGU6Im1pbWUtbWVzc2FnZS1ibG9jayJ9XSl9KTsKKwkJdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCX07CisJdGhpcy50dW5uZWxDb2xsYXBzZSA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQl0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworCQkJdGhpcy5vcGVuVHVubmVsV2l0aCh7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFt7Y2hhbm5lbDoiL21ldGEvcmVjb25uZWN0IiwgY2xpZW50SWQ6Y29tZXRkLmNsaWVudElkLCBjb25uZWN0aW9uSWQ6dGhpcy5jb25uZWN0aW9uSWQsIHRpbWVzdGFtcDp0aGlzLmxhc3RUaW1lc3RhbXAsIGlkOnRoaXMubGFzdElkfV0pfSk7CisJCX0KKwl9OworCXRoaXMuZGVsaXZlciA9IGNvbWV0ZC5pZnJhbWVUcmFuc3BvcnQuZGVsaXZlcjsKKwl0aGlzLmhhbmRsZU9uTG9hZCA9IGZ1bmN0aW9uIChyZXNwKSB7CisJCWNvbWV0ZC5kZWxpdmVyKGRvam8uanNvbi5ldmFsSnNvbih0aGlzLnhoci5yZXNwb25zZVRleHQpKTsKKwl9OworCXRoaXMub3BlblR1bm5lbFdpdGggPSBmdW5jdGlvbiAoY29udGVudCwgdXJsKSB7CisJCXRoaXMueGhyID0gZG9qby5ob3N0ZW52LmdldFhtbGh0dHBPYmplY3QoKTsKKwkJdGhpcy54aHIubXVsdGlwYXJ0ID0gdHJ1ZTsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgeworCQkJdGhpcy54aHIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiaGFuZGxlT25Mb2FkIiksIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkgeworCQkJCWRvam8uZGVidWcoIldlYmtpdCBpcyBicm9rZW4gd2l0aCBtdWx0aXBhcnQgcmVzcG9uc2VzIG92ZXIgWEhSID0gKCIpOworCQkJCXRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiaGFuZGxlT25Mb2FkIik7CisJCQl9IGVsc2UgeworCQkJCXRoaXMueGhyLm9ubG9hZCA9IGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiaGFuZGxlT25Mb2FkIik7CisJCQl9CisJCX0KKwkJdGhpcy54aHIub3BlbigiUE9TVCIsICh1cmwgfHwgY29tZXRkLnVybCksIHRydWUpOworCQl0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CisJCWRvam8uZGVidWcoZG9qby5qc29uLnNlcmlhbGl6ZShjb250ZW50KSk7CisJCXRoaXMueGhyLnNlbmQoZG9qby5pby5hcmdzRnJvbU1hcChjb250ZW50LCAidXRmOCIpKTsKKwl9OworCXRoaXMucHJvY2Vzc0JhY2tsb2cgPSBmdW5jdGlvbiAoKSB7CisJCXdoaWxlICh0aGlzLmJhY2tsb2cubGVuZ3RoID4gMCkgeworCQkJdGhpcy5zZW5kTWVzc2FnZSh0aGlzLmJhY2tsb2cuc2hpZnQoKSwgdHJ1ZSk7CisJCX0KKwl9OworCXRoaXMuc2VuZE1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgYnlwYXNzQmFja2xvZykgeworCQlpZiAoKGJ5cGFzc0JhY2tsb2cpIHx8ICh0aGlzLmNvbm5lY3RlZCkpIHsKKwkJCW1lc3NhZ2UuY29ubmVjdGlvbklkID0gdGhpcy5jb25uZWN0aW9uSWQ7CisJCQltZXNzYWdlLmNsaWVudElkID0gY29tZXRkLmNsaWVudElkOworCQkJdmFyIGJpbmRBcmdzID0ge3VybDpjb21ldGQudXJsIHx8IGRqQ29uZmlnWyJjb21ldGRSb290Il0sIG1ldGhvZDoiUE9TVCIsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBjb250ZW50OnttZXNzYWdlOmRvam8uanNvbi5zZXJpYWxpemUoW21lc3NhZ2VdKX19OworCQkJcmV0dXJuIGRvam8uaW8uYmluZChiaW5kQXJncyk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTsKKwkJfQorCX07CisJdGhpcy5zdGFydHVwID0gZnVuY3Rpb24gKGhhbmRzaGFrZURhdGEpIHsKKwkJZG9qby5kZWJ1Z1NoYWxsb3coaGFuZHNoYWtlRGF0YSk7CisJCWlmICh0aGlzLmNvbm5lY3RlZCkgeworCQkJcmV0dXJuOworCQl9CisJCXRoaXMudHVubmVsSW5pdCgpOworCX07Cit9OworY29tZXRkLmxvbmdQb2xsVHJhbnNwb3J0ID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworCXRoaXMuY29ubmVjdGlvbklkID0gbnVsbDsKKwl0aGlzLmF1dGhUb2tlbiA9IG51bGw7CisJdGhpcy5sYXN0VGltZXN0YW1wID0gbnVsbDsKKwl0aGlzLmxhc3RJZCA9IG51bGw7CisJdGhpcy5iYWNrbG9nID0gW107CisJdGhpcy5jaGVjayA9IGZ1bmN0aW9uICh0eXBlcywgdmVyc2lvbiwgeGRvbWFpbikgeworCQlyZXR1cm4gKCgheGRvbWFpbikgJiYgKGRvam8ubGFuZy5pbkFycmF5KHR5cGVzLCAibG9uZy1wb2xsaW5nIikpKTsKKwl9OworCXRoaXMudHVubmVsSW5pdCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5vcGVuVHVubmVsV2l0aCh7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFt7Y2hhbm5lbDoiL21ldGEvY29ubmVjdCIsIGNsaWVudElkOmNvbWV0ZC5jbGllbnRJZCwgY29ubmVjdGlvblR5cGU6ImxvbmctcG9sbGluZyJ9XSl9KTsKKwkJdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCX07CisJdGhpcy50dW5uZWxDb2xsYXBzZSA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKCF0aGlzLmNvbm5lY3RlZCkgeworCQkJdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKwkJCWRvam8uZGVidWcoImNsaWVudElkOiIsIGNvbWV0ZC5jbGllbnRJZCk7CisJCQl0aGlzLm9wZW5UdW5uZWxXaXRoKHttZXNzYWdlOmRvam8uanNvbi5zZXJpYWxpemUoW3tjaGFubmVsOiIvbWV0YS9yZWNvbm5lY3QiLCBjb25uZWN0aW9uVHlwZToibG9uZy1wb2xsaW5nIiwgY2xpZW50SWQ6Y29tZXRkLmNsaWVudElkLCBjb25uZWN0aW9uSWQ6dGhpcy5jb25uZWN0aW9uSWQsIHRpbWVzdGFtcDp0aGlzLmxhc3RUaW1lc3RhbXAsIGlkOnRoaXMubGFzdElkfV0pfSk7CisJCX0KKwl9OworCXRoaXMuZGVsaXZlciA9IGNvbWV0ZC5pZnJhbWVUcmFuc3BvcnQuZGVsaXZlcjsKKwl0aGlzLm9wZW5UdW5uZWxXaXRoID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCkgeworCQlkb2pvLmlvLmJpbmQoe3VybDoodXJsIHx8IGNvbWV0ZC51cmwpLCBtZXRob2Q6InBvc3QiLCBjb250ZW50OmNvbnRlbnQsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBsb2FkOmRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0LCBhcmdzKSB7CisJCQljb21ldGQuZGVsaXZlcihkYXRhKTsKKwkJCXRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisJCQl0aGlzLnR1bm5lbENvbGxhcHNlKCk7CisJCX0pLCBlcnJvcjpmdW5jdGlvbiAoKSB7CisJCQlkb2pvLmRlYnVnKCJ0dW5uZWwgb3BlbmluZyBmYWlsZWQiKTsKKwkJfX0pOworCQl0aGlzLmNvbm5lY3RlZCA9IHRydWU7CisJfTsKKwl0aGlzLnByb2Nlc3NCYWNrbG9nID0gZnVuY3Rpb24gKCkgeworCQl3aGlsZSAodGhpcy5iYWNrbG9nLmxlbmd0aCA+IDApIHsKKwkJCXRoaXMuc2VuZE1lc3NhZ2UodGhpcy5iYWNrbG9nLnNoaWZ0KCksIHRydWUpOworCQl9CisJfTsKKwl0aGlzLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGJ5cGFzc0JhY2tsb2cpIHsKKwkJaWYgKChieXBhc3NCYWNrbG9nKSB8fCAodGhpcy5jb25uZWN0ZWQpKSB7CisJCQltZXNzYWdlLmNvbm5lY3Rpb25JZCA9IHRoaXMuY29ubmVjdGlvbklkOworCQkJbWVzc2FnZS5jbGllbnRJZCA9IGNvbWV0ZC5jbGllbnRJZDsKKwkJCXZhciBiaW5kQXJncyA9IHt1cmw6Y29tZXRkLnVybCB8fCBkakNvbmZpZ1siY29tZXRkUm9vdCJdLCBtZXRob2Q6InBvc3QiLCBtaW1ldHlwZToidGV4dC9qc29uIiwgY29udGVudDp7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFttZXNzYWdlXSl9LCBsb2FkOmRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0LCBhcmdzKSB7CisJCQkJY29tZXRkLmRlbGl2ZXIoZGF0YSk7CisJCQl9KX07CisJCQlyZXR1cm4gZG9qby5pby5iaW5kKGJpbmRBcmdzKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYmFja2xvZy5wdXNoKG1lc3NhZ2UpOworCQl9CisJfTsKKwl0aGlzLnN0YXJ0dXAgPSBmdW5jdGlvbiAoaGFuZHNoYWtlRGF0YSkgeworCQlpZiAodGhpcy5jb25uZWN0ZWQpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnR1bm5lbEluaXQoKTsKKwl9OworfTsKK2NvbWV0ZC5jYWxsYmFja1BvbGxUcmFuc3BvcnQgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisJdGhpcy5jb25uZWN0aW9uSWQgPSBudWxsOworCXRoaXMuYXV0aFRva2VuID0gbnVsbDsKKwl0aGlzLmxhc3RUaW1lc3RhbXAgPSBudWxsOworCXRoaXMubGFzdElkID0gbnVsbDsKKwl0aGlzLmJhY2tsb2cgPSBbXTsKKwl0aGlzLmNoZWNrID0gZnVuY3Rpb24gKHR5cGVzLCB2ZXJzaW9uLCB4ZG9tYWluKSB7CisJCXJldHVybiBkb2pvLmxhbmcuaW5BcnJheSh0eXBlcywgImNhbGxiYWNrLXBvbGxpbmciKTsKKwl9OworCXRoaXMudHVubmVsSW5pdCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMuY29ubmVjdGVkKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5vcGVuVHVubmVsV2l0aCh7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFt7Y2hhbm5lbDoiL21ldGEvY29ubmVjdCIsIGNsaWVudElkOmNvbWV0ZC5jbGllbnRJZCwgY29ubmVjdGlvblR5cGU6ImNhbGxiYWNrLXBvbGxpbmcifV0pfSk7CisJCXRoaXMuY29ubmVjdGVkID0gdHJ1ZTsKKwl9OworCXRoaXMudHVubmVsQ29sbGFwc2UgPSBmdW5jdGlvbiAoKSB7CisJCWlmICghdGhpcy5jb25uZWN0ZWQpIHsKKwkJCXRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisJCQl0aGlzLm9wZW5UdW5uZWxXaXRoKHttZXNzYWdlOmRvam8uanNvbi5zZXJpYWxpemUoW3tjaGFubmVsOiIvbWV0YS9yZWNvbm5lY3QiLCBjb25uZWN0aW9uVHlwZToibG9uZy1wb2xsaW5nIiwgY2xpZW50SWQ6Y29tZXRkLmNsaWVudElkLCBjb25uZWN0aW9uSWQ6dGhpcy5jb25uZWN0aW9uSWQsIHRpbWVzdGFtcDp0aGlzLmxhc3RUaW1lc3RhbXAsIGlkOnRoaXMubGFzdElkfV0pfSk7CisJCX0KKwl9OworCXRoaXMuZGVsaXZlciA9IGNvbWV0ZC5pZnJhbWVUcmFuc3BvcnQuZGVsaXZlcjsKKwl0aGlzLm9wZW5UdW5uZWxXaXRoID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCkgeworCQl2YXIgcmVxID0gZG9qby5pby5iaW5kKHt1cmw6KHVybCB8fCBjb21ldGQudXJsKSwgY29udGVudDpjb250ZW50LCBtaW1ldHlwZToidGV4dC9qc29uIiwgdHJhbnNwb3J0OiJTY3JpcHRTcmNUcmFuc3BvcnQiLCBqc29uUGFyYW1OYW1lOiJqc29ucCIsIGxvYWQ6ZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICh0eXBlLCBkYXRhLCBldnQsIGFyZ3MpIHsKKwkJCWNvbWV0ZC5kZWxpdmVyKGRhdGEpOworCQkJdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKwkJCXRoaXMudHVubmVsQ29sbGFwc2UoKTsKKwkJfSksIGVycm9yOmZ1bmN0aW9uICgpIHsKKwkJCWRvam8uZGVidWcoInR1bm5lbCBvcGVuaW5nIGZhaWxlZCIpOworCQl9fSk7CisJCXRoaXMuY29ubmVjdGVkID0gdHJ1ZTsKKwl9OworCXRoaXMucHJvY2Vzc0JhY2tsb2cgPSBmdW5jdGlvbiAoKSB7CisJCXdoaWxlICh0aGlzLmJhY2tsb2cubGVuZ3RoID4gMCkgeworCQkJdGhpcy5zZW5kTWVzc2FnZSh0aGlzLmJhY2tsb2cuc2hpZnQoKSwgdHJ1ZSk7CisJCX0KKwl9OworCXRoaXMuc2VuZE1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgYnlwYXNzQmFja2xvZykgeworCQlpZiAoKGJ5cGFzc0JhY2tsb2cpIHx8ICh0aGlzLmNvbm5lY3RlZCkpIHsKKwkJCW1lc3NhZ2UuY29ubmVjdGlvbklkID0gdGhpcy5jb25uZWN0aW9uSWQ7CisJCQltZXNzYWdlLmNsaWVudElkID0gY29tZXRkLmNsaWVudElkOworCQkJdmFyIGJpbmRBcmdzID0ge3VybDpjb21ldGQudXJsIHx8IGRqQ29uZmlnWyJjb21ldGRSb290Il0sIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCB0cmFuc3BvcnQ6IlNjcmlwdFNyY1RyYW5zcG9ydCIsIGpzb25QYXJhbU5hbWU6Impzb25wIiwgY29udGVudDp7bWVzc2FnZTpkb2pvLmpzb24uc2VyaWFsaXplKFttZXNzYWdlXSl9LCBsb2FkOmRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0LCBhcmdzKSB7CisJCQkJY29tZXRkLmRlbGl2ZXIoZGF0YSk7CisJCQl9KX07CisJCQlyZXR1cm4gZG9qby5pby5iaW5kKGJpbmRBcmdzKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYmFja2xvZy5wdXNoKG1lc3NhZ2UpOworCQl9CisJfTsKKwl0aGlzLnN0YXJ0dXAgPSBmdW5jdGlvbiAoaGFuZHNoYWtlRGF0YSkgeworCQlpZiAodGhpcy5jb25uZWN0ZWQpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnR1bm5lbEluaXQoKTsKKwl9OworfTsKK2NvbWV0ZC5jb25uZWN0aW9uVHlwZXMucmVnaXN0ZXIoIm1pbWUtbWVzc2FnZS1ibG9jayIsIGNvbWV0ZC5taW1lUmVwbGFjZVRyYW5zcG9ydC5jaGVjaywgY29tZXRkLm1pbWVSZXBsYWNlVHJhbnNwb3J0KTsKK2NvbWV0ZC5jb25uZWN0aW9uVHlwZXMucmVnaXN0ZXIoImxvbmctcG9sbGluZyIsIGNvbWV0ZC5sb25nUG9sbFRyYW5zcG9ydC5jaGVjaywgY29tZXRkLmxvbmdQb2xsVHJhbnNwb3J0KTsKK2NvbWV0ZC5jb25uZWN0aW9uVHlwZXMucmVnaXN0ZXIoImNhbGxiYWNrLXBvbGxpbmciLCBjb21ldGQuY2FsbGJhY2tQb2xsVHJhbnNwb3J0LmNoZWNrLCBjb21ldGQuY2FsbGJhY2tQb2xsVHJhbnNwb3J0KTsKK2NvbWV0ZC5jb25uZWN0aW9uVHlwZXMucmVnaXN0ZXIoImlmcmFtZSIsIGNvbWV0ZC5pZnJhbWVUcmFuc3BvcnQuY2hlY2ssIGNvbWV0ZC5pZnJhbWVUcmFuc3BvcnQpOworZG9qby5pby5jb21ldGQgPSBjb21ldGQ7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9jb21tb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vY29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjM3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vY29tbW9uLmpzCkBAIC0wLDAgKzEsMjMyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmlvLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZXh0cmFzIik7Citkb2pvLmlvLnRyYW5zcG9ydHMgPSBbXTsKK2Rvam8uaW8uaGRsckZ1bmNOYW1lcyA9IFsibG9hZCIsICJlcnJvciIsICJ0aW1lb3V0Il07Citkb2pvLmlvLlJlcXVlc3QgPSBmdW5jdGlvbiAodXJsLCBtaW1ldHlwZSwgdHJhbnNwb3J0LCBjaGFuZ2VVcmwpIHsKKwlpZiAoKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgJiYgKGFyZ3VtZW50c1swXS5jb25zdHJ1Y3RvciA9PSBPYmplY3QpKSB7CisJCXRoaXMuZnJvbUt3QXJncyhhcmd1bWVudHNbMF0pOworCX0gZWxzZSB7CisJCXRoaXMudXJsID0gdXJsOworCQlpZiAobWltZXR5cGUpIHsKKwkJCXRoaXMubWltZXR5cGUgPSBtaW1ldHlwZTsKKwkJfQorCQlpZiAodHJhbnNwb3J0KSB7CisJCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKwkJfQorCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7CisJCQl0aGlzLmNoYW5nZVVybCA9IGNoYW5nZVVybDsKKwkJfQorCX0KK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uaW8uUmVxdWVzdCwge3VybDoiIiwgbWltZXR5cGU6InRleHQvcGxhaW4iLCBtZXRob2Q6IkdFVCIsIGNvbnRlbnQ6dW5kZWZpbmVkLCB0cmFuc3BvcnQ6dW5kZWZpbmVkLCBjaGFuZ2VVcmw6dW5kZWZpbmVkLCBmb3JtTm9kZTp1bmRlZmluZWQsIHN5bmM6ZmFsc2UsIGJpbmRTdWNjZXNzOmZhbHNlLCB1c2VDYWNoZTpmYWxzZSwgcHJldmVudENhY2hlOmZhbHNlLCBqc29uRmlsdGVyOmZ1bmN0aW9uICh2YWx1ZSkgeworCWlmICgodGhpcy5taW1ldHlwZSA9PSAidGV4dC9qc29uLWNvbW1lbnQtZmlsdGVyZWQiKSB8fCAodGhpcy5taW1ldHlwZSA9PSAiYXBwbGljYXRpb24vanNvbi1jb21tZW50LWZpbHRlcmVkIikpIHsKKwkJdmFyIGNTdGFydElkeCA9IHZhbHVlLmluZGV4T2YoIi8qIik7CisJCXZhciBjRW5kSWR4ID0gdmFsdWUubGFzdEluZGV4T2YoIiovIik7CisJCWlmICgoY1N0YXJ0SWR4ID09IC0xKSB8fCAoY0VuZElkeCA9PSAtMSkpIHsKKwkJCWRvam8uZGVidWcoInlvdXIgSlNPTiB3YXNuJ3QgY29tbWVudCBmaWx0ZXJlZCEiKTsKKwkJCXJldHVybiAiIjsKKwkJfQorCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGNTdGFydElkeCArIDIsIGNFbmRJZHgpOworCX0KKwlkb2pvLmRlYnVnKCJwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBtaW1ldHlwZSBvZiB0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCB0byBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzIHdpdGggSlNPTiBlbmRwb2ludHMiKTsKKwlyZXR1cm4gdmFsdWU7Cit9LCBsb2FkOmZ1bmN0aW9uICh0eXBlLCBkYXRhLCB0cmFuc3BvcnRJbXBsZW1lbnRhdGlvbiwga3dBcmdzKSB7Cit9LCBlcnJvcjpmdW5jdGlvbiAodHlwZSwgZXJyb3IsIHRyYW5zcG9ydEltcGxlbWVudGF0aW9uLCBrd0FyZ3MpIHsKK30sIHRpbWVvdXQ6ZnVuY3Rpb24gKHR5cGUsIGVtcHR5LCB0cmFuc3BvcnRJbXBsZW1lbnRhdGlvbiwga3dBcmdzKSB7Cit9LCBoYW5kbGU6ZnVuY3Rpb24gKHR5cGUsIGRhdGEsIHRyYW5zcG9ydEltcGxlbWVudGF0aW9uLCBrd0FyZ3MpIHsKK30sIHRpbWVvdXRTZWNvbmRzOjAsIGFib3J0OmZ1bmN0aW9uICgpIHsKK30sIGZyb21Ld0FyZ3M6ZnVuY3Rpb24gKGt3QXJncykgeworCWlmIChrd0FyZ3NbInVybCJdKSB7CisJCWt3QXJncy51cmwgPSBrd0FyZ3MudXJsLnRvU3RyaW5nKCk7CisJfQorCWlmIChrd0FyZ3NbImZvcm1Ob2RlIl0pIHsKKwkJa3dBcmdzLmZvcm1Ob2RlID0gZG9qby5ieUlkKGt3QXJncy5mb3JtTm9kZSk7CisJfQorCWlmICgha3dBcmdzWyJtZXRob2QiXSAmJiBrd0FyZ3NbImZvcm1Ob2RlIl0gJiYga3dBcmdzWyJmb3JtTm9kZSJdLm1ldGhvZCkgeworCQlrd0FyZ3MubWV0aG9kID0ga3dBcmdzWyJmb3JtTm9kZSJdLm1ldGhvZDsKKwl9CisJaWYgKCFrd0FyZ3NbImhhbmRsZSJdICYmIGt3QXJnc1siaGFuZGxlciJdKSB7CisJCWt3QXJncy5oYW5kbGUgPSBrd0FyZ3MuaGFuZGxlcjsKKwl9CisJaWYgKCFrd0FyZ3NbImxvYWQiXSAmJiBrd0FyZ3NbImxvYWRlZCJdKSB7CisJCWt3QXJncy5sb2FkID0ga3dBcmdzLmxvYWRlZDsKKwl9CisJaWYgKCFrd0FyZ3NbImNoYW5nZVVybCJdICYmIGt3QXJnc1siY2hhbmdlVVJMIl0pIHsKKwkJa3dBcmdzLmNoYW5nZVVybCA9IGt3QXJncy5jaGFuZ2VVUkw7CisJfQorCWt3QXJncy5lbmNvZGluZyA9IGRvam8ubGFuZy5maXJzdFZhbHVlZChrd0FyZ3NbImVuY29kaW5nIl0sIGRqQ29uZmlnWyJiaW5kRW5jb2RpbmciXSwgIiIpOworCWt3QXJncy5zZW5kVHJhbnNwb3J0ID0gZG9qby5sYW5nLmZpcnN0VmFsdWVkKGt3QXJnc1sic2VuZFRyYW5zcG9ydCJdLCBkakNvbmZpZ1siaW9TZW5kVHJhbnNwb3J0Il0sIGZhbHNlKTsKKwl2YXIgaXNGdW5jdGlvbiA9IGRvam8ubGFuZy5pc0Z1bmN0aW9uOworCWZvciAodmFyIHggPSAwOyB4IDwgZG9qby5pby5oZGxyRnVuY05hbWVzLmxlbmd0aDsgeCsrKSB7CisJCXZhciBmbiA9IGRvam8uaW8uaGRsckZ1bmNOYW1lc1t4XTsKKwkJaWYgKGt3QXJnc1tmbl0gJiYgaXNGdW5jdGlvbihrd0FyZ3NbZm5dKSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGt3QXJnc1siaGFuZGxlIl0gJiYgaXNGdW5jdGlvbihrd0FyZ3NbImhhbmRsZSJdKSkgeworCQkJa3dBcmdzW2ZuXSA9IGt3QXJncy5oYW5kbGU7CisJCX0KKwl9CisJZG9qby5sYW5nLm1peGluKHRoaXMsIGt3QXJncyk7Cit9fSk7Citkb2pvLmlvLkVycm9yID0gZnVuY3Rpb24gKG1zZywgdHlwZSwgbnVtKSB7CisJdGhpcy5tZXNzYWdlID0gbXNnOworCXRoaXMudHlwZSA9IHR5cGUgfHwgInVua25vd24iOworCXRoaXMubnVtYmVyID0gbnVtIHx8IDA7Cit9OworZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCA9IGZ1bmN0aW9uIChuYW1lKSB7CisJdGhpcy5wdXNoKG5hbWUpOworCXRoaXNbbmFtZV0gPSBkb2pvLmlvW25hbWVdOworfTsKK2Rvam8uaW8uYmluZCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7CisJaWYgKCEocmVxdWVzdCBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpIHsKKwkJdHJ5IHsKKwkJCXJlcXVlc3QgPSBuZXcgZG9qby5pby5SZXF1ZXN0KHJlcXVlc3QpOworCQl9CisJCWNhdGNoIChlKSB7CisJCQlkb2pvLmRlYnVnKGUpOworCQl9CisJfQorCXZhciB0c05hbWUgPSAiIjsKKwlpZiAocmVxdWVzdFsidHJhbnNwb3J0Il0pIHsKKwkJdHNOYW1lID0gcmVxdWVzdFsidHJhbnNwb3J0Il07CisJCWlmICghdGhpc1t0c05hbWVdKSB7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgIk5vIGRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIgKyByZXF1ZXN0WyJ0cmFuc3BvcnQiXSArICInLiIpOworCQkJcmV0dXJuIHJlcXVlc3Q7CisJCX0KKwkJaWYgKCF0aGlzW3RzTmFtZV0uY2FuSGFuZGxlKHJlcXVlc3QpKSB7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgImRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIgKyByZXF1ZXN0WyJ0cmFuc3BvcnQiXSArICInIGNhbm5vdCBoYW5kbGUgdGhpcyB0eXBlIG9mIHJlcXVlc3QuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAodmFyIHggPSAwOyB4IDwgZG9qby5pby50cmFuc3BvcnRzLmxlbmd0aDsgeCsrKSB7CisJCQl2YXIgdG1wID0gZG9qby5pby50cmFuc3BvcnRzW3hdOworCQkJaWYgKCh0aGlzW3RtcF0pICYmICh0aGlzW3RtcF0uY2FuSGFuZGxlKHJlcXVlc3QpKSkgeworCQkJCXRzTmFtZSA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodHNOYW1lID09ICIiKSB7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgIk5vbmUgb2YgdGhlIGxvYWRlZCB0cmFuc3BvcnRzIGZvciBkb2pvLmlvLmJpbmQoKSIgKyAiIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsKKwkJfQorCX0KKwl0aGlzW3RzTmFtZV0uYmluZChyZXF1ZXN0KTsKKwlyZXF1ZXN0LmJpbmRTdWNjZXNzID0gdHJ1ZTsKKwlyZXR1cm4gcmVxdWVzdDsKK307Citkb2pvLmlvLnNlbmRCaW5kRXJyb3IgPSBmdW5jdGlvbiAocmVxdWVzdCwgbWVzc2FnZSkgeworCWlmICgodHlwZW9mIHJlcXVlc3QuZXJyb3IgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgcmVxdWVzdC5oYW5kbGUgPT0gImZ1bmN0aW9uIikgJiYgKHR5cGVvZiBzZXRUaW1lb3V0ID09ICJmdW5jdGlvbiIgfHwgdHlwZW9mIHNldFRpbWVvdXQgPT0gIm9iamVjdCIpKSB7CisJCXZhciBlcnJvck9iamVjdCA9IG5ldyBkb2pvLmlvLkVycm9yKG1lc3NhZ2UpOworCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKwkJCXJlcXVlc3RbKHR5cGVvZiByZXF1ZXN0LmVycm9yID09ICJmdW5jdGlvbiIpID8gImVycm9yIiA6ICJoYW5kbGUiXSgiZXJyb3IiLCBlcnJvck9iamVjdCwgbnVsbCwgcmVxdWVzdCk7CisJCX0sIDUwKTsKKwl9IGVsc2UgeworCQlkb2pvLnJhaXNlKG1lc3NhZ2UpOworCX0KK307Citkb2pvLmlvLnF1ZXVlQmluZCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7CisJaWYgKCEocmVxdWVzdCBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpIHsKKwkJdHJ5IHsKKwkJCXJlcXVlc3QgPSBuZXcgZG9qby5pby5SZXF1ZXN0KHJlcXVlc3QpOworCQl9CisJCWNhdGNoIChlKSB7CisJCQlkb2pvLmRlYnVnKGUpOworCQl9CisJfQorCXZhciBvbGRMb2FkID0gcmVxdWVzdC5sb2FkOworCXJlcXVlc3QubG9hZCA9IGZ1bmN0aW9uICgpIHsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSBmYWxzZTsKKwkJdmFyIHJldCA9IG9sZExvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJCXJldHVybiByZXQ7CisJfTsKKwl2YXIgb2xkRXJyID0gcmVxdWVzdC5lcnJvcjsKKwlyZXF1ZXN0LmVycm9yID0gZnVuY3Rpb24gKCkgeworCQlkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodCA9IGZhbHNlOworCQl2YXIgcmV0ID0gb2xkRXJyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCWRvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZCgpOworCQlyZXR1cm4gcmV0OworCX07CisJZG9qby5pby5fYmluZFF1ZXVlLnB1c2gocmVxdWVzdCk7CisJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJcmV0dXJuIHJlcXVlc3Q7Cit9OworZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kID0gZnVuY3Rpb24gKCkgeworCWlmICghZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQpIHsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSB0cnVlOworCQlpZiAoZG9qby5pby5fYmluZFF1ZXVlLmxlbmd0aCA+IDApIHsKKwkJCWRvam8uaW8uYmluZChkb2pvLmlvLl9iaW5kUXVldWUuc2hpZnQoKSk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodCA9IGZhbHNlOworCQl9CisJfQorfTsKK2Rvam8uaW8uX2JpbmRRdWV1ZSA9IFtdOworZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSBmYWxzZTsKK2Rvam8uaW8uYXJnc0Zyb21NYXAgPSBmdW5jdGlvbiAobWFwLCBlbmNvZGluZywgbGFzdCkgeworCXZhciBlbmMgPSAvdXRmL2kudGVzdChlbmNvZGluZyB8fCAiIikgPyBlbmNvZGVVUklDb21wb25lbnQgOiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaTsKKwl2YXIgbWFwcGVkID0gW107CisJdmFyIGNvbnRyb2wgPSBuZXcgT2JqZWN0KCk7CisJZm9yICh2YXIgbmFtZSBpbiBtYXApIHsKKwkJdmFyIGRvbWFwID0gZnVuY3Rpb24gKGVsdCkgeworCQkJdmFyIHZhbCA9IGVuYyhuYW1lKSArICI9IiArIGVuYyhlbHQpOworCQkJbWFwcGVkWyhsYXN0ID09IG5hbWUpID8gInB1c2giIDogInVuc2hpZnQiXSh2YWwpOworCQl9OworCQlpZiAoIWNvbnRyb2xbbmFtZV0pIHsKKwkJCXZhciB2YWx1ZSA9IG1hcFtuYW1lXTsKKwkJCWlmIChkb2pvLmxhbmcuaXNBcnJheSh2YWx1ZSkpIHsKKwkJCQlkb2pvLmxhbmcuZm9yRWFjaCh2YWx1ZSwgZG9tYXApOworCQkJfSBlbHNlIHsKKwkJCQlkb21hcCh2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG1hcHBlZC5qb2luKCImIik7Cit9OworZG9qby5pby5zZXRJRnJhbWVTcmMgPSBmdW5jdGlvbiAoaWZyYW1lLCBzcmMsIHJlcGxhY2UpIHsKKwl0cnkgeworCQl2YXIgciA9IGRvam8ucmVuZGVyLmh0bWw7CisJCWlmICghcmVwbGFjZSkgeworCQkJaWYgKHIuc2FmYXJpKSB7CisJCQkJaWZyYW1lLmxvY2F0aW9uID0gc3JjOworCQkJfSBlbHNlIHsKKwkJCQlmcmFtZXNbaWZyYW1lLm5hbWVdLmxvY2F0aW9uID0gc3JjOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyIGlkb2M7CisJCQlpZiAoci5pZSkgeworCQkJCWlkb2MgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHIuc2FmYXJpKSB7CisJCQkJCWlkb2MgPSBpZnJhbWUuZG9jdW1lbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWRvYyA9IGlmcmFtZS5jb250ZW50V2luZG93OworCQkJCX0KKwkJCX0KKwkJCWlmICghaWRvYykgeworCQkJCWlmcmFtZS5sb2NhdGlvbiA9IHNyYzsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWlkb2MubG9jYXRpb24ucmVwbGFjZShzcmMpOworCQkJfQorCQl9CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoZSk7CisJCWRvam8uZGVidWcoInNldElGcmFtZVNyYzogIiArIGUpOworCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby9jb29raWUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vY29va2llLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjA1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8vY29va2llLmpzCkBAIC0wLDAgKzEsMTA0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmlvLmNvb2tpZSIpOworZG9qby5pby5jb29raWUuc2V0Q29va2llID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkgeworCXZhciBleHBpcmVzID0gLTE7CisJaWYgKCh0eXBlb2YgZGF5cyA9PSAibnVtYmVyIikgJiYgKGRheXMgPj0gMCkpIHsKKwkJdmFyIGQgPSBuZXcgRGF0ZSgpOworCQlkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTsKKwkJZXhwaXJlcyA9IGQudG9HTVRTdHJpbmcoKTsKKwl9CisJdmFsdWUgPSBlc2NhcGUodmFsdWUpOworCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyB2YWx1ZSArICI7IiArIChleHBpcmVzICE9IC0xID8gIiBleHBpcmVzPSIgKyBleHBpcmVzICsgIjsiIDogIiIpICsgKHBhdGggPyAicGF0aD0iICsgcGF0aCA6ICIiKSArIChkb21haW4gPyAiOyBkb21haW49IiArIGRvbWFpbiA6ICIiKSArIChzZWN1cmUgPyAiOyBzZWN1cmUiIDogIiIpOworfTsKK2Rvam8uaW8uY29va2llLnNldCA9IGRvam8uaW8uY29va2llLnNldENvb2tpZTsKK2Rvam8uaW8uY29va2llLmdldENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7CisJdmFyIGlkeCA9IGRvY3VtZW50LmNvb2tpZS5sYXN0SW5kZXhPZihuYW1lICsgIj0iKTsKKwlpZiAoaWR4ID09IC0xKSB7CisJCXJldHVybiBudWxsOworCX0KKwl2YXIgdmFsdWUgPSBkb2N1bWVudC5jb29raWUuc3Vic3RyaW5nKGlkeCArIG5hbWUubGVuZ3RoICsgMSk7CisJdmFyIGVuZCA9IHZhbHVlLmluZGV4T2YoIjsiKTsKKwlpZiAoZW5kID09IC0xKSB7CisJCWVuZCA9IHZhbHVlLmxlbmd0aDsKKwl9CisJdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZW5kKTsKKwl2YWx1ZSA9IHVuZXNjYXBlKHZhbHVlKTsKKwlyZXR1cm4gdmFsdWU7Cit9OworZG9qby5pby5jb29raWUuZ2V0ID0gZG9qby5pby5jb29raWUuZ2V0Q29va2llOworZG9qby5pby5jb29raWUuZGVsZXRlQ29va2llID0gZnVuY3Rpb24gKG5hbWUpIHsKKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgIi0iLCAwKTsKK307Citkb2pvLmlvLmNvb2tpZS5zZXRPYmplY3RDb29raWUgPSBmdW5jdGlvbiAobmFtZSwgb2JqLCBkYXlzLCBwYXRoLCBkb21haW4sIHNlY3VyZSwgY2xlYXJDdXJyZW50KSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gNSkgeworCQljbGVhckN1cnJlbnQgPSBkb21haW47CisJCWRvbWFpbiA9IG51bGw7CisJCXNlY3VyZSA9IG51bGw7CisJfQorCXZhciBwYWlycyA9IFtdLCBjb29raWUsIHZhbHVlID0gIiI7CisJaWYgKCFjbGVhckN1cnJlbnQpIHsKKwkJY29va2llID0gZG9qby5pby5jb29raWUuZ2V0T2JqZWN0Q29va2llKG5hbWUpOworCX0KKwlpZiAoZGF5cyA+PSAwKSB7CisJCWlmICghY29va2llKSB7CisJCQljb29raWUgPSB7fTsKKwkJfQorCQlmb3IgKHZhciBwcm9wIGluIG9iaikgeworCQkJaWYgKG9ialtwcm9wXSA9PSBudWxsKSB7CisJCQkJZGVsZXRlIGNvb2tpZVtwcm9wXTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh0eXBlb2Ygb2JqW3Byb3BdID09ICJzdHJpbmciKSB8fCAodHlwZW9mIG9ialtwcm9wXSA9PSAibnVtYmVyIikpIHsKKwkJCQkJY29va2llW3Byb3BdID0gb2JqW3Byb3BdOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcm9wID0gbnVsbDsKKwkJZm9yICh2YXIgcHJvcCBpbiBjb29raWUpIHsKKwkJCXBhaXJzLnB1c2goZXNjYXBlKHByb3ApICsgIj0iICsgZXNjYXBlKGNvb2tpZVtwcm9wXSkpOworCQl9CisJCXZhbHVlID0gcGFpcnMuam9pbigiJiIpOworCX0KKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgdmFsdWUsIGRheXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKTsKK307Citkb2pvLmlvLmNvb2tpZS5nZXRPYmplY3RDb29raWUgPSBmdW5jdGlvbiAobmFtZSkgeworCXZhciB2YWx1ZXMgPSBudWxsLCBjb29raWUgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWUobmFtZSk7CisJaWYgKGNvb2tpZSkgeworCQl2YWx1ZXMgPSB7fTsKKwkJdmFyIHBhaXJzID0gY29va2llLnNwbGl0KCImIik7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBwYWlyID0gcGFpcnNbaV0uc3BsaXQoIj0iKTsKKwkJCXZhciB2YWx1ZSA9IHBhaXJbMV07CisJCQlpZiAoaXNOYU4odmFsdWUpKSB7CisJCQkJdmFsdWUgPSB1bmVzY2FwZShwYWlyWzFdKTsKKwkJCX0KKwkJCXZhbHVlc1t1bmVzY2FwZShwYWlyWzBdKV0gPSB2YWx1ZTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWVzOworfTsKK2Rvam8uaW8uY29va2llLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkgeworCWlmICh0eXBlb2YgbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQgIT0gImJvb2xlYW4iKSB7CisJCWRvam8uaW8uY29va2llLnNldENvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iLCAiQ29va2llc0FsbG93ZWQiLCA5MCwgbnVsbCk7CisJCXZhciBjb29raWVWYWwgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWUoIl9fVGVzdGluZ1lvdXJCcm93c2VyRm9yQ29va2llU3VwcG9ydF9fIik7CisJCW5hdmlnYXRvci5jb29raWVFbmFibGVkID0gKGNvb2tpZVZhbCA9PSAiQ29va2llc0FsbG93ZWQiKTsKKwkJaWYgKG5hdmlnYXRvci5jb29raWVFbmFibGVkKSB7CisJCQl0aGlzLmRlbGV0ZUNvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iKTsKKwkJfQorCX0KKwlyZXR1cm4gbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ7Cit9OworaWYgKCFkb2pvLmlvLmNvb2tpZXMpIHsKKwlkb2pvLmlvLmNvb2tpZXMgPSBkb2pvLmlvLmNvb2tpZTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL3hpcF9jbGllbnQuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby94aXBfY2xpZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkNmVhNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9pby94aXBfY2xpZW50Lmh0bWwKQEAgLTAsMCArMSwyNjcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKwk8dGl0bGU+PC90aXRsZT4KKwk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+PC9tZXRhPgorCTwhLS0gU2VjdXJpdHkgcHJvdGVjdGlvbjogdW5jb21tZW50IHRoZSBzY3JpcHQgdGFnIHRvIGVuYWJsZS4gLS0+CisJPCEtLSBzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAtLT4KKwkvLyA8IS0tCisJLyoKKwlUaGlzIGZpbGUgaXMgcmVhbGx5IGZvY3VzZWQgb24ganVzdCBzZW5kaW5nIG9uZSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIsIGFuZAorCXJlY2VpdmluZyBvbmUgcmVzcG9uc2UuIFRoZSBjb2RlIGRvZXMgbm90IGV4cGVjdCB0byBiZSByZS11c2VkIGZvciBtdWx0aXBsZSBtZXNzYWdlcy4KKwlUaGlzIG1pZ2h0IGJlIHJld29ya2VkIGxhdGVyIGlmIHBlcmZvcm1hbmNlIGluZGljYXRlcyBhIG5lZWQgZm9yIGl0LgorCQorCXhpcCBmcmFnbWVudCBpZGVudGlmaWVyL2hhc2ggdmFsdWVzIGhhdmUgdGhlIGZvcm06CisJI2lkOmNtZDpyZWFsRW5jb2RlZE1lc3NhZ2UKKworCWlkOiBzb21lIElEIHRoYXQgc2hvdWxkIGJlIHVuaXF1ZSBhbW9uZyBtZXNzYWdlcy4gTm8gaW5oZXJlbnQgbWVhbmluZywKKwkgICAgICAgIGp1c3Qgc29tZXRoaW5nIHRvIG1ha2Ugc3VyZSB0aGUgaGFzaCB2YWx1ZSBpcyB1bmlxdWUgc28gdGhlIG1lc3NhZ2UKKwkgICAgICAgIHJlY2VpdmVyIGtub3dzIGEgbmV3IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLgorCSAgICAgICAgCisJY21kOiBjb21tYW5kIHRvIHRoZSByZWNlaXZlci4gVmFsaWQgdmFsdWVzIGFyZToKKwkgICAgICAgICAtIGluaXQ6IG1lc3NhZ2UgdXNlZCB0byBpbml0IHRoZSBmcmFtZS4gU2VudCBhcyB0aGUgZmlyc3QgVVJMIHdoZW4gbG9hZGluZworCSAgICAgICAgICAgICAgICAgdGhlIHBhZ2UuIENvbnRhaW5zIHNvbWUgY29uZmlnIHBhcmFtZXRlcnMuCisJICAgICAgICAgLSBsb2FkZWQ6IHRoZSByZW1vdGUgZnJhbWUgaXMgbG9hZGVkLiBPbmx5IHNlbnQgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LgorCSAgICAgICAgIC0gb2s6IHRoZSBtZXNzYWdlIHRoYXQgdGhpcyBwYWdlIHNlbnQgd2FzIHJlY2VpdmVkIE9LLiBUaGUgbmV4dCBtZXNzYWdlIG1heQorCSAgICAgICAgICAgICAgIG5vdyBiZSBzZW50LgorCSAgICAgICAgIC0gc3RhcnQ6IHRoZSBzdGFydCBtZXNzYWdlIG9mIGEgYmxvY2sgb2YgbWVzc2FnZXMgKGEgY29tcGxldGUgbWVzc2FnZSBtYXkKKwkgICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIHNlZ21lbnRlZCBpbnRvIG1hbnkgbWVzc2FnZXMgdG8gZ2V0IGFyb3VuZCB0aGUgbGltaXRpYXRpb25zCisJICAgICAgICAgICAgICAgICAgb2YgdGhlIHNpemUgb2YgYW4gVVJMIHRoYXQgYSBicm93c2VyIGFjY2VwdHMuCisJICAgICAgICAgLSBwYXJ0OiBpbmRpY2F0ZXMgdGhpcyBpcyBhIHBhcnQgb2YgYSBtZXNzYWdlLgorCSAgICAgICAgIC0gZW5kOiB0aGUgZW5kIG1lc3NhZ2Ugb2YgYSBibG9jayBvZiBtZXNzYWdlcy4gVGhlIG1lc3NhZ2UgY2FuIG5vdyBiZSBhY3RlZCB1cG9uLgorCSAgICAgICAgICAgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBzbWFsbCBlbm91Z2ggdGhhdCBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgc2VnbWVudGVkLCB0aGVuCisJICAgICAgICAgICAgICAgIGp1c3Qgb25lIGhhc2ggdmFsdWUgbWVzc2FnZSBjYW4gYmUgc2VudCB3aXRoICJlbmQiIGFzIHRoZSBjb21tYW5kLgorCQorCVRvIHJlYXNzZW1ibGUgYSBzZWdtZW50ZWQgbWVzc2FnZSwgdGhlIHJlYWxFbmNvZGVkTWVzc2FnZSBwYXJ0cyBqdXN0IGhhdmUgdG8gYmUgY29uY2F0ZW5hdGVkCisJdG9nZXRoZXIuCisJKi8KKworCS8vTVNJRSBoYXMgdGhlIGxvd2VzdCBsaW1pdCBmb3IgVVJMcyB3aXRoIGZyYWdtZW50IGlkZW50aWZpZXJzLAorCS8vYXQgYXJvdW5kIDRLLiBDaG9vc2luZyBhIHNsaWdodGx5IHNtYWxsZXIgbnVtYmVyIGZvciBnb29kIG1lYXN1cmUuCisJeGlwVXJsTGltaXQgPSA0MDAwOworCXhpcElkQ291bnRlciA9IDE7CisKKwlmdW5jdGlvbiB4aXBJbml0KCl7CisJCXhpcFN0YXRlSWQgPSAiIjsKKwkJeGlwSXNTZW5kaW5nID0gZmFsc2U7CisJCXhpcFNlcnZlclVybCA9IG51bGw7CisJCXhpcFN0YXRlSWQgPSBudWxsOworCQl4aXBSZXF1ZXN0RGF0YSA9IG51bGw7CisJCXhpcEN1cnJlbnRIYXNoID0gIiI7CisJCXhpcFJlc3BvbnNlTWVzc2FnZSA9ICIiOworCQl4aXBSZXF1ZXN0UGFydHMgPSBbXTsKKwkJeGlwUGFydEluZGV4ID0gMDsKKwkJeGlwU2VydmVyV2luZG93ID0gbnVsbDsKKwkJeGlwVXNlRnJhbWVSZWN1cnNpb24gPSBmYWxzZTsKKwl9CisJeGlwSW5pdCgpOworCQorCWZ1bmN0aW9uIHNlbmQoZW5jb2RlZERhdGEpeworCQlpZih4aXBVc2VGcmFtZVJlY3Vyc2lvbiA9PSAidHJ1ZSIpeworCQkJdmFyIGNsaWVudEVuZFBvaW50ID0gd2luZG93Lm9wZW4oeGlwU3RhdGVJZCArICJfY2xpZW50RW5kUG9pbnQiKTsKKwkJCWNsaWVudEVuZFBvaW50LnNlbmQoZW5jb2RlZERhdGEpOworCQl9ZWxzZXsKKwkJCWlmKCF4aXBJc1NlbmRpbmcpeworCQkJCXhpcElzU2VuZGluZyA9IHRydWU7CisJCisJCQkJeGlwUmVxdWVzdERhdGEgPSBlbmNvZGVkRGF0YSB8fCAiIjsKKworCQkJCS8vR2V0IGEgaGFuZGxlIHRvIHRoZSBzZXJ2ZXIgaWZyYW1lLgorCQkJCXhpcFNlcnZlcldpbmRvdyA9IGZyYW1lc1t4aXBTdGF0ZUlkICsgIl9mcmFtZSJdOworCQkJCWlmICgheGlwU2VydmVyV2luZG93KXsKKwkJCQkJeGlwU2VydmVyV2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeGlwU3RhdGVJZCArICJfZnJhbWUiKS5jb250ZW50V2luZG93OworCQkJCX0KKwkKKwkJCQlzZW5kUmVxdWVzdFN0YXJ0KCk7CisJCQl9CisJCX0KKwl9CisKKwkvL01vZGlmeSB0aGUgc2VydmVyIFVSTCBpZiBpdCBpcyBhIGxvY2FsIHBhdGggYW5kIAorCS8vVGhpcyBpcyBkb25lIGZvciBsb2NhbC9zYW1lIGRvbWFpbiB0ZXN0aW5nLgorCWZ1bmN0aW9uIGZpeFNlcnZlclVybChpZnBTZXJ2ZXJVcmwpeworCQlpZihpZnBTZXJ2ZXJVcmwuaW5kZXhPZigiLi4iKSA9PSAwKXsKKwkJCXZhciBwYXJ0cyA9IGlmcFNlcnZlclVybC5zcGxpdCgiLyIpOworCQkJaWZwU2VydmVyVXJsID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CisJCX0KKwkJcmV0dXJuIGlmcFNlcnZlclVybDsKKwl9CisJCisJCisJZnVuY3Rpb24gcG9sbEhhc2goKXsKKwkJLy9DYW4ndCB1c2UgbG9jYXRpb24uaGFzaCBiZWNhdXNlIGF0IGxlYXN0IEZpcmVmb3ggZG9lcyBhIGRlY29kZVVSSUNvbXBvbmVudCBvbiBpdC4KKwkJdmFyIHVybFBhcnRzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIiMiKTsKKwkJaWYodXJsUGFydHMubGVuZ3RoID09IDIpeworCQkJdmFyIG5ld0hhc2ggPSB1cmxQYXJ0c1sxXTsKKwkJCWlmKG5ld0hhc2ggIT0geGlwQ3VycmVudEhhc2gpeworCQkJCXRyeXsKKwkJCQkJbWVzc2FnZVJlY2VpdmVkKG5ld0hhc2gpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJLy9NYWtlIHN1cmUgdG8gbm90IGtlZXAgcHJvY2Vzc2luZyB0aGUgZXJyb3IgaGFzaCB2YWx1ZS4KKwkJCQkJeGlwQ3VycmVudEhhc2ggPSBuZXdIYXNoOworCQkJCQl0aHJvdyBlOworCQkJCX0KKwkJCQl4aXBDdXJyZW50SGFzaCA9IG5ld0hhc2g7CisJCQl9CisJCX0KKwl9CisKKwlmdW5jdGlvbiBtZXNzYWdlUmVjZWl2ZWQoZW5jb2RlZERhdGEpeworCQl2YXIgbXNnID0gdW5wYWNrTWVzc2FnZShlbmNvZGVkRGF0YSk7CisKKwkJc3dpdGNoKG1zZy5jb21tYW5kKXsKKwkJCWNhc2UgImxvYWRlZCI6CisJCQkJeGlwTWFzdGVyRnJhbWUuZG9qby5pby5YaHJJZnJhbWVQcm94eS5jbGllbnRGcmFtZUxvYWRlZCh4aXBTdGF0ZUlkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgIm9rIjoKKwkJCQlzZW5kUmVxdWVzdFBhcnQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0YXJ0IjoKKwkJCQl4aXBSZXNwb25zZU1lc3NhZ2UgPSAiIjsKKwkJCQl4aXBSZXNwb25zZU1lc3NhZ2UgKz0gbXNnLm1lc3NhZ2U7CisJCQkJc2V0U2VydmVyVXJsKCJvayIpOworCQkJCWJyZWFrOworCQkJY2FzZSAicGFydCI6CisJCQkJeGlwUmVzcG9uc2VNZXNzYWdlICs9IG1zZy5tZXNzYWdlOwkJCQorCQkJCXNldFNlcnZlclVybCgib2siKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImVuZCI6CisJCQkJc2V0U2VydmVyVXJsKCJvayIpOworCQkJCXhpcFJlc3BvbnNlTWVzc2FnZSArPSBtc2cubWVzc2FnZTsKKwkJCQl4aXBNYXN0ZXJGcmFtZS5kb2pvLmlvLlhocklmcmFtZVByb3h5LnJlY2VpdmUoeGlwU3RhdGVJZCwgeGlwUmVzcG9uc2VNZXNzYWdlKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkKKwlmdW5jdGlvbiBzZW5kUmVxdWVzdFN0YXJ0KCl7CisJCS8vQnJlYWsgdGhlIG1lc3NhZ2UgaW50byBwYXJ0cywgaWYgbmVjZXNzYXJ5LgorCQl4aXBSZXF1ZXN0UGFydHMgPSBbXTsKKwkJdmFyIHJlcURhdGEgPSB4aXBSZXF1ZXN0RGF0YTsKKwkJdmFyIHVybExlbmd0aCA9IHhpcFNlcnZlclVybC5sZW5ndGg7CisJCXZhciBwYXJ0TGVuZ3RoID0geGlwVXJsTGltaXQgLSB1cmxMZW5ndGg7CisJCXZhciByZXFJbmRleCA9IDA7CisKKwkJd2hpbGUoKHJlcURhdGEubGVuZ3RoIC0gcmVxSW5kZXgpICsgdXJsTGVuZ3RoID4geGlwVXJsTGltaXQpeworCQkJdmFyIHBhcnQgPSByZXFEYXRhLnN1YnN0cmluZyhyZXFJbmRleCwgcmVxSW5kZXggKyBwYXJ0TGVuZ3RoKTsKKwkJCS8vU2FmYXJpIHdpbGwgZG8gc29tZSBleHRyYSBoZXggZXNjYXBpbmcgdW5sZXNzIHdlIGtlZXAgdGhlIG9yaWdpbmFsIGhleAorCQkJLy9lc2NhcGluZyBjb21wbGV0ZS4KKwkJCXZhciBwZXJjZW50SW5kZXggPSBwYXJ0Lmxhc3RJbmRleE9mKCIlIik7CisJCQlpZihwZXJjZW50SW5kZXggPT0gcGFydC5sZW5ndGggLSAxIHx8IHBlcmNlbnRJbmRleCA9PSBwYXJ0Lmxlbmd0aCAtIDIpeworCQkJCXBhcnQgPSBwYXJ0LnN1YnN0cmluZygwLCBwZXJjZW50SW5kZXgpOworCQkJfQorCQkJeGlwUmVxdWVzdFBhcnRzLnB1c2gocGFydCk7CisJCQlyZXFJbmRleCArPSBwYXJ0Lmxlbmd0aDsKKwkJfQorCQl4aXBSZXF1ZXN0UGFydHMucHVzaChyZXFEYXRhLnN1YnN0cmluZyhyZXFJbmRleCwgcmVxRGF0YS5sZW5ndGgpKTsKKwkJCisJCXhpcFBhcnRJbmRleCA9IDA7CisJCXNlbmRSZXF1ZXN0UGFydCgpOworCQkKKwl9CisJCisJZnVuY3Rpb24gc2VuZFJlcXVlc3RQYXJ0KCl7CisJCWlmKHhpcFBhcnRJbmRleCA8IHhpcFJlcXVlc3RQYXJ0cy5sZW5ndGgpeworCQkJLy9HZXQgdGhlIG1lc3NhZ2UgcGFydC4KKwkJCXZhciBwYXJ0RGF0YSA9IHhpcFJlcXVlc3RQYXJ0c1t4aXBQYXJ0SW5kZXhdOworCisJCQkvL0dldCB0aGUgY29tbWFuZC4KKwkJCXZhciBjbWQgPSAicGFydCI7CisJCQlpZih4aXBQYXJ0SW5kZXggKyAxID09IHhpcFJlcXVlc3RQYXJ0cy5sZW5ndGgpeworCQkJCWNtZCA9ICJlbmQiOworCQkJfWVsc2UgaWYgKHhpcFBhcnRJbmRleCA9PSAwKXsKKwkJCQljbWQgPSAic3RhcnQiOworCQkJfQorCQkJCisJCQlzZXRTZXJ2ZXJVcmwoY21kLCBwYXJ0RGF0YSk7CisJCQl4aXBQYXJ0SW5kZXgrKzsKKwkJfQorCX0KKwkKKwlmdW5jdGlvbiBzZXRTZXJ2ZXJVcmwoY21kLCBtZXNzYWdlKXsKKwkJdmFyIHNlcnZlclVybCA9IG1ha2VTZXJ2ZXJVcmwoY21kLCBtZXNzYWdlKTsKKworCQkvL1NhZmFyaSB3b24ndCBsZXQgdXMgcmVwbGFjZSBhY3Jvc3MgZG9tYWlucy4KKwkJaWYobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSA9PSAtMSl7CisJCQl4aXBTZXJ2ZXJXaW5kb3cubG9jYXRpb24ucmVwbGFjZShzZXJ2ZXJVcmwpOworCQl9ZWxzZXsKKwkJCXhpcFNlcnZlcldpbmRvdy5sb2NhdGlvbiA9IHNlcnZlclVybDsKKwkJfQorCX0KKwkKKwlmdW5jdGlvbiBtYWtlU2VydmVyVXJsKGNtZCwgbWVzc2FnZSl7CisJCXZhciBzZXJ2ZXJVcmwgPSB4aXBTZXJ2ZXJVcmwgKyAiIyIgKyAoeGlwSWRDb3VudGVyKyspICsgIjoiICsgY21kOworCQlpZihtZXNzYWdlKXsKKwkJCXNlcnZlclVybCArPSAiOiIgKyBtZXNzYWdlOworCQl9CisJCXJldHVybiBzZXJ2ZXJVcmw7CisJfQorCisJZnVuY3Rpb24gdW5wYWNrTWVzc2FnZShlbmNvZGVkTWVzc2FnZSl7CisJCXZhciBwYXJ0cyA9IGVuY29kZWRNZXNzYWdlLnNwbGl0KCI6Iik7CisJCXZhciBjb21tYW5kID0gcGFydHNbMV07CisJCWVuY29kZWRNZXNzYWdlID0gcGFydHNbMl0gfHwgIiI7CisKKwkJdmFyIGNvbmZpZyA9IG51bGw7CisJCWlmKGNvbW1hbmQgPT0gImluaXQiKXsKKwkJCXZhciBjb25maWdQYXJ0cyA9IGVuY29kZWRNZXNzYWdlLnNwbGl0KCImIik7CisJCQljb25maWcgPSB7fTsKKwkJCWZvcih2YXIgaSA9IDA7IGkgPCBjb25maWdQYXJ0cy5sZW5ndGg7IGkrKyl7CisJCQkJdmFyIG5hbWVWYWx1ZSA9IGNvbmZpZ1BhcnRzW2ldLnNwbGl0KCI9Iik7CisJCQkJY29uZmlnW2RlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMV0pOworCQkJfQorCQl9CisJCXJldHVybiB7Y29tbWFuZDogY29tbWFuZCwgbWVzc2FnZTogZW5jb2RlZE1lc3NhZ2UsIGNvbmZpZzogY29uZmlnfTsKKwl9CisKKwlmdW5jdGlvbiBvbkNsaWVudExvYWQoKXsKKwkJLy9EZWNvZGUgdGhlIGluaXQgcGFyYW1zCisJCXZhciBjb25maWcgPSB1bnBhY2tNZXNzYWdlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCIjIilbMV0pLmNvbmZpZzsKKworCQl4aXBTdGF0ZUlkID0gY29uZmlnLmlkOworCisJCS8vUmVtb3ZlIHRoZSBxdWVyeSBwYXJhbSBmb3IgdGhlIElFNyByZWN1cnNpdmUgY2FzZS4KKwkJeGlwU2VydmVyVXJsID0gZml4U2VydmVyVXJsKGNvbmZpZy5zZXJ2ZXIpLnJlcGxhY2UoLyhcP3xcJilkb2pvXC5mclw9MS8sICIiKTsKKwkJCisJCS8vTWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYSBqYXZhc2NyaXB0OiB1cmwsIGp1c3QgZm9yIGdvb2QgbWVhc3VyZS4KKwkJaWYoeGlwU2VydmVyVXJsLnNwbGl0KCI6IilbMF0ubWF0Y2goL2phdmFzY3JpcHQvaSkpeworCQkJdGhyb3cgIkludmFsaWQgc2VydmVyIFVSTCI7CisJCX0KKworCQl4aXBVc2VGcmFtZVJlY3Vyc2lvbiA9IGNvbmZpZ1siZnIiXTsKKwkJCisJCWlmKHhpcFVzZUZyYW1lUmVjdXJzaW9uID09ICJlbmRwb2ludCIpeworCQkJeGlwTWFzdGVyRnJhbWUgPSBwYXJlbnQucGFyZW50OworCQl9ZWxzZXsKKwkJCXhpcE1hc3RlckZyYW1lID0gcGFyZW50OworCQl9CisJCQorCQkvL1N0YXJ0IGNvdW50ZXIgdG8gaW5zcGVjdCBoYXNoIHZhbHVlLgorCQlzZXRJbnRlcnZhbChwb2xsSGFzaCwgMTApOworCisJCXZhciBjbGllbnRVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiIyIpWzBdOworCQl2YXIgaWZyYW1lTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKVswXTsKKwkJaWZyYW1lTm9kZS5pZCA9IHhpcFN0YXRlSWQgKyAiX2ZyYW1lIjsKKwkJaWZyYW1lTm9kZS5zcmMgPSBtYWtlU2VydmVyVXJsKCJpbml0IiwgJ2lkPScgKyB4aXBTdGF0ZUlkICsgJyZjbGllbnQ9JworCQkJKyBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50VXJsKSArICcmZnI9JyArIHhpcFVzZUZyYW1lUmVjdXJzaW9uKTsKKwl9CisKKwlpZih0eXBlb2Yod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpID09ICJ1bmRlZmluZWQiKXsKKwkJd2luZG93LmF0dGFjaEV2ZW50KCJvbmxvYWQiLCBvbkNsaWVudExvYWQpOworCX1lbHNleworCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uQ2xpZW50TG9hZCwgZmFsc2UpOworCX0KKwkKKwkvLyAtLT4KKwk8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorCTxoND5UaGUgRG9qbyBUb29sa2l0IC0tIHhpcF9jbGllbnQuaHRtbDwvaDQ+CisKKwk8cD5UaGlzIGZpbGUgaXMgdXNlZCBmb3IgRG9qbydzIFhNTEh0dHBSZXF1ZXN0IElmcmFtZSBQcm94eS4gVGhpcyBpcyB0aGUgImNsaWVudCIgZmlsZSB1c2VkCisJaW50ZXJuYWxseSBieSBkb2pvLmlvLlhocklmcmFtZVByb3h5LjwvcD4KKwkKKwk8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZSI+PC9pZnJhbWU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvaW8veGlwX3NlcnZlci5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL3hpcF9zZXJ2ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIzZmNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2lvL3hpcF9zZXJ2ZXIuaHRtbApAQCAtMCwwICsxLDM4NiBAQAorPCEtLQorCS8qCisJCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisJCisJCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCQorCQkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisJKi8KKwlQaWVjZXMgdGFrZW4gZnJvbSBEb2pvIHNvdXJjZSB0byBtYWtlIHRoaXMgZmlsZSBzdGFuZC1hbG9uZQorLS0+Cis8aHRtbD4KKzxoZWFkPgorCTx0aXRsZT48L3RpdGxlPgorCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij48L21ldGE+CisJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaXNBbGxvd2VkLmpzIj48L3NjcmlwdD4KKwk8IS0tCisJQlkgREVGQVVMVCBUSElTIEZJTEUgRE9FUyBOT1QgV09SSyBTTyBUSEFUIFlPVSBET04nVCBBQ0NJREVOVEFMTFkgRVhQT1NFCisJQUxMIE9GIFlPVVIgWEhSLUVOQUJMRUQgU0VSVklDRVMgT04gWU9VUiBTSVRFLiAKKwkKKwlJbiBvcmRlciBmb3IgdGhpcyBmaWxlIHRvIHdvcmssIHlvdSBuZWVkIHRvIHVuY29tbWVudCB0aGUgc2NyaXB0IGVsZW1lbnQsCisJYW5kIHlvdSBzaG91bGQgZGVmaW5lIGEgZnVuY3Rpb24gd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKwkKKwlmdW5jdGlvbiBpc0FsbG93ZWRSZXF1ZXN0KHJlcXVlc3QpeworCQlyZXR1cm4gZmFsc2U7CQorCX0KKwkKKwlSZXR1cm4gdHJ1ZSBvdXQgb2YgdGhlIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHRvIGFsbG93IHRoZSBjcm9zcy1kb21haW4gcmVxdWVzdC4KKwkKKwlET04nVCBERUZJTkUgVEhJUyBGVU5DVElPTiBJTiBUSElTIEZJTEUhIERlZmluZSBpdCBpbiBhIHNlcGFyYXRlIGZpbGUgY2FsbGVkIGlzQWxsb3dlZC5qcworCWFuZCBpbmNsdWRlIGl0IGluIHRoaXMgcGFnZSB3aXRoIGEgc2NyaXB0IHRhZyB0aGF0IGhhcyBhIHNyYyBhdHRyaWJ1dGUgcG9pbnRpbmcgdG8gdGhlIGZpbGUuCisJU2VlIHRoZSB2ZXJ5IGZpcnN0IHNjcmlwdCB0YWcgaW4gdGhpcyBmaWxlIGZvciBhbiBleGFtcGxlLiBZb3UgZG8gbm90IGhhdmUgdG8gcGxhY2UgdGhlCisJc2NyaXB0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgZmlsZSwganVzdCB1cGRhdGUgdGhlIHBhdGggYWJvdmUgaWYgeW91IG1vdmUgaXQKKwlzb21ld2hlcmUgZWxzZS4KKwkKKwlDdXN0b21pemUgdGhlIGlzQWxsb3dlZFJlcXVlc3QgZnVuY3Rpb24gdG8gcmVzdHJpY3Qgd2hhdCB0eXBlcyBvZiByZXF1ZXN0cyBhcmUgYWxsb3dlZAorCWZvciB0aGlzIHNlcnZlci4gVGhlIHJlcXVlc3Qgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisJLSByZXF1ZXN0SGVhZGVyczogYW4gb2JqZWN0IHdpdGggdGhlIHJlcXVlc3QgaGVhZGVycyB0aGF0IGFyZSB0byBiZSBhZGRlZCB0bworCSAgICAgICAgICAgICAgICAgIHRoZSBYSFIgcmVxdWVzdC4KKwktIG1ldGhvZDogdGhlIEhUVFAgbWV0aG9kIChHRVQsIFBPU1QsIGV0Yy4uLikKKwktIHVyaTogVGhlIFVSSSBmb3IgdGhlIHJlcXVlc3QuCisJLSBkYXRhOiBUaGUgVVJMLWVuY29kZWQgZGF0YSBmb3IgdGhlIHJlcXVlc3QuIEZvciBhIEdFVCByZXF1ZXN0LCB0aGlzIHdvdWxkCisJICAgICAgICBiZSB0aGUgcXVlcnlzdHJpbmcgcGFyYW1ldGVycy4gRm9yIGEgUE9TVCByZXF1ZXN0LCBpdCB3bGwgYmUgdGhlCisJICAgICAgICBib2R5IGRhdGEuCisJICAgICAgICAKKwlTZWUgeGlwX2NsaWVudC5odG1sIGZvciBtb3JlIGluZm8gb24gdGhlIHhpcCBmcmFnbWVudCBpZGVudGlmaWVyIHByb3RvY29sLgkKKwktLT4KKwkKKwk8IS0tIFNlY3VyaXR5IHByb3RlY3Rpb246IHVuY29tbWVudCB0aGUgc2NyaXB0IHRhZyB0byBlbmFibGUuIC0tPgorCTwhLS0gc2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgLS0+CisJLy8gPCEtLQorCQkvL0NvcmUgWEhSIGhhbmRsaW5nIHRha2VuIGZyb20gRG9qbyBJTyBjb2RlLgorCQlkb2pvID0ge307CisJCWRvam8uaG9zdGVudiA9IHt9OworCQkvLyBUaGVzZSBhcmUgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBsaWtlbGlob29kOyB0aGlzIHdpbGwgY2hhbmdlIGluIHRpbWUuCisJCWRvam8uaG9zdGVudi5fWE1MSFRUUF9QUk9HSURTID0gWydNc3htbDIuWE1MSFRUUCcsICdNaWNyb3NvZnQuWE1MSFRUUCcsICdNc3htbDIuWE1MSFRUUC40LjAnXTsKKwkJCisJCWRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0ID0gZnVuY3Rpb24oKXsKKwkJCQl2YXIgaHR0cCA9IG51bGw7CisJCQl2YXIgbGFzdF9lID0gbnVsbDsKKwkJCXRyeXsgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9Y2F0Y2goZSl7fQorCQkJCWlmKCFodHRwKXsKKwkJCQlmb3IodmFyIGk9MDsgaTwzOyArK2kpeworCQkJCQl2YXIgcHJvZ2lkID0gZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFNbaV07CisJCQkJCXRyeXsKKwkJCQkJCWh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChwcm9naWQpOworCQkJCQl9Y2F0Y2goZSl7CisJCQkJCQlsYXN0X2UgPSBlOworCQkJCQl9CisJCQorCQkJCQlpZihodHRwKXsKKwkJCQkJCWRvam8uaG9zdGVudi5fWE1MSFRUUF9QUk9HSURTID0gW3Byb2dpZF07ICAvLyBzbyBmYXN0ZXIgbmV4dCB0aW1lCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCisJCQkJLyppZihodHRwICYmICFodHRwLnRvU3RyaW5nKSB7CisJCQkJCWh0dHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgIltvYmplY3QgWE1MSHR0cFJlcXVlc3RdIjsgfQorCQkJCX0qLworCQkJfQorCQkKKwkJCWlmKCFodHRwKXsKKwkJCQl0aHJvdyAieGlwX3NlcnZlci5odG1sOiBYTUxIVFRQIG5vdCBhdmFpbGFibGU6ICIgKyBsYXN0X2U7CisJCQl9CisJCQorCQkJcmV0dXJuIGh0dHA7CisJCX0KKworCQlkb2pvLnNldEhlYWRlcnMgPSBmdW5jdGlvbihodHRwLCBoZWFkZXJzKXsKKwkJCWlmKGhlYWRlcnMpIHsKKwkJCQlmb3IodmFyIGhlYWRlciBpbiBoZWFkZXJzKSB7CisJCQkJCXZhciBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXTsKKwkJCQkJaHR0cC5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJLy9NU0lFIGhhcyB0aGUgbG93ZXN0IGxpbWl0IGZvciBVUkxzIHdpdGggZnJhZ21lbnQgaWRlbnRpZmllcnMsCisJLy9hdCBhcm91bmQgNEsuIENob29zaW5nIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIgZm9yIGdvb2QgbWVhc3VyZS4KKwl4aXBVcmxMaW1pdCA9IDQwMDA7CisJeGlwSWRDb3VudGVyID0gMTsKKworCWZ1bmN0aW9uIHhpcFNlcnZlckluaXQoKXsKKwkJeGlwU3RhdGVJZCA9ICIiOworCQl4aXBDdXJyZW50SGFzaCA9ICIiOworCQl4aXBSZXF1ZXN0TWVzc2FnZSA9ICIiOworCQl4aXBSZXNwb25zZVBhcnRzID0gW107CisJCXhpcFBhcnRJbmRleCA9IDA7CisJfQorCisJZnVuY3Rpb24gcG9sbEhhc2goKXsKKwkJLy9DYW4ndCB1c2UgbG9jYXRpb24uaGFzaCBiZWNhdXNlIGF0IGxlYXN0IEZpcmVmb3ggZG9lcyBhIGRlY29kZVVSSUNvbXBvbmVudCBvbiBpdC4KKwkJdmFyIHVybFBhcnRzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIiMiKTsKKwkJaWYodXJsUGFydHMubGVuZ3RoID09IDIpeworCQkJdmFyIG5ld0hhc2ggPSB1cmxQYXJ0c1sxXTsKKwkJCWlmKG5ld0hhc2ggIT0geGlwQ3VycmVudEhhc2gpeworCQkJCXRyeXsKKwkJCQkJbWVzc2FnZVJlY2VpdmVkKG5ld0hhc2gpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJLy9NYWtlIHN1cmUgdG8gbm90IGtlZXAgcHJvY2Vzc2luZyB0aGUgZXJyb3IgaGFzaCB2YWx1ZS4KKwkJCQkJeGlwQ3VycmVudEhhc2ggPSBuZXdIYXNoOworCQkJCQl0aHJvdyBlOworCQkJCX0KKwkJCQl4aXBDdXJyZW50SGFzaCA9IG5ld0hhc2g7CisJCQl9CisJCX0KKwl9CisKKwlmdW5jdGlvbiBtZXNzYWdlUmVjZWl2ZWQoZW5jb2RlZERhdGEpeworCQl2YXIgbXNnID0gdW5wYWNrTWVzc2FnZShlbmNvZGVkRGF0YSk7CisJCQorCQlzd2l0Y2gobXNnLmNvbW1hbmQpeworCQkJY2FzZSAib2siOgorCQkJCXNlbmRSZXNwb25zZVBhcnQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0YXJ0IjoKKwkJCQl4aXBSZXF1ZXN0TWVzc2FnZSA9ICIiOworCQkJCXhpcFJlcXVlc3RNZXNzYWdlICs9IG1zZy5tZXNzYWdlOworCQkJCXNldENsaWVudFVybCgib2siKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInBhcnQiOgorCQkJCXhpcFJlcXVlc3RNZXNzYWdlICs9IG1zZy5tZXNzYWdlOwkJCQorCQkJCXNldENsaWVudFVybCgib2siKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImVuZCI6CisJCQkJc2V0Q2xpZW50VXJsKCJvayIpOworCQkJCXhpcFJlcXVlc3RNZXNzYWdlICs9IG1zZy5tZXNzYWdlOworCQkJCXNlbmRYaHIoKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWZ1bmN0aW9uIHNlbmRSZXNwb25zZShlbmNvZGVkRGF0YSl7CisJCS8vQnJlYWsgdGhlIG1lc3NhZ2UgaW50byBwYXJ0cywgaWYgbmVjZXNzYXJ5LgorCQl4aXBSZXNwb25zZVBhcnRzID0gW107CisJCXZhciByZXNEYXRhID0gZW5jb2RlZERhdGE7CisJCXZhciB1cmxMZW5ndGggPSB4aXBDbGllbnRVcmwubGVuZ3RoOworCQl2YXIgcGFydExlbmd0aCA9IHhpcFVybExpbWl0IC0gdXJsTGVuZ3RoOworCQl2YXIgcmVzSW5kZXggPSAwOworCisJCXdoaWxlKChyZXNEYXRhLmxlbmd0aCAtIHJlc0luZGV4KSArIHVybExlbmd0aCA+IHhpcFVybExpbWl0KXsKKwkJCXZhciBwYXJ0ID0gcmVzRGF0YS5zdWJzdHJpbmcocmVzSW5kZXgsIHJlc0luZGV4ICsgcGFydExlbmd0aCk7CisJCQkvL1NhZmFyaSB3aWxsIGRvIHNvbWUgZXh0cmEgaGV4IGVzY2FwaW5nIHVubGVzcyB3ZSBrZWVwIHRoZSBvcmlnaW5hbCBoZXgKKwkJCS8vZXNjYXBpbmcgY29tcGxldGUuCisJCQl2YXIgcGVyY2VudEluZGV4ID0gcGFydC5sYXN0SW5kZXhPZigiJSIpOworCQkJaWYocGVyY2VudEluZGV4ID09IHBhcnQubGVuZ3RoIC0gMSB8fCBwZXJjZW50SW5kZXggPT0gcGFydC5sZW5ndGggLSAyKXsKKwkJCQlwYXJ0ID0gcGFydC5zdWJzdHJpbmcoMCwgcGVyY2VudEluZGV4KTsKKwkJCX0KKwkJCXhpcFJlc3BvbnNlUGFydHMucHVzaChwYXJ0KTsKKwkJCXJlc0luZGV4ICs9IHBhcnQubGVuZ3RoOworCQl9CisJCXhpcFJlc3BvbnNlUGFydHMucHVzaChyZXNEYXRhLnN1YnN0cmluZyhyZXNJbmRleCwgcmVzRGF0YS5sZW5ndGgpKTsKKwkJCisJCXhpcFBhcnRJbmRleCA9IDA7CisJCXNlbmRSZXNwb25zZVBhcnQoKTsKKwl9CisJCisJZnVuY3Rpb24gc2VuZFJlc3BvbnNlUGFydCgpeworCQlpZih4aXBQYXJ0SW5kZXggPCB4aXBSZXNwb25zZVBhcnRzLmxlbmd0aCl7CisJCQkvL0dldCB0aGUgbWVzc2FnZSBwYXJ0LgorCQkJdmFyIHBhcnREYXRhID0geGlwUmVzcG9uc2VQYXJ0c1t4aXBQYXJ0SW5kZXhdOworCQkJCisJCQkvL0dldCB0aGUgY29tbWFuZC4KKwkJCXZhciBjbWQgPSAicGFydCI7CisJCQlpZih4aXBQYXJ0SW5kZXggKyAxID09IHhpcFJlc3BvbnNlUGFydHMubGVuZ3RoKXsKKwkJCQljbWQgPSAiZW5kIjsKKwkJCX1lbHNlIGlmICh4aXBQYXJ0SW5kZXggPT0gMCl7CisJCQkJY21kID0gInN0YXJ0IjsKKwkJCX0KKworCQkJc2V0Q2xpZW50VXJsKGNtZCwgcGFydERhdGEpOworCQkJeGlwUGFydEluZGV4Kys7CisJCX1lbHNleworCQkJeGlwU2VydmVySW5pdCgpOworCQl9CisJfQorCisJZnVuY3Rpb24gc2V0Q2xpZW50VXJsKGNtZCwgbWVzc2FnZSl7CisJCXZhciBjbGllbnRVcmwgPSBtYWtlQ2xpZW50VXJsKGNtZCwgbWVzc2FnZSk7CisJCS8vU2FmYXJpIHdvbid0IGxldCB1cyByZXBsYWNlIGFjcm9zcyBkb21haW5zLgorCQlpZihuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpID09IC0xKXsKKwkJCXBhcmVudC5sb2NhdGlvbi5yZXBsYWNlKGNsaWVudFVybCk7CisJCX1lbHNleworCQkJcGFyZW50LmxvY2F0aW9uID0gY2xpZW50VXJsOworCQl9CisJfQorCisJZnVuY3Rpb24gbWFrZUNsaWVudFVybChjbWQsIG1lc3NhZ2UpeworCQl2YXIgY2xpZW50VXJsID0geGlwQ2xpZW50VXJsICsgIiMiICsgKHhpcElkQ291bnRlcisrKSArICI6IiArIGNtZDsKKwkJaWYobWVzc2FnZSl7CisJCQljbGllbnRVcmwgKz0gIjoiICsgbWVzc2FnZTsKKwkJfQorCQlyZXR1cm4gY2xpZW50VXJsCisJfQorCisJZnVuY3Rpb24geGhyRG9uZSh4aHIpeworCQkvKiBOZWVkIHRvIHB1bGwgb2ZmIGFuZCByZXR1cm4gdGhlIGZvbGxvd2luZyBkYXRhOgorCQkJLSByZXNwb25zZUhlYWRlcnMKKwkJCS0gc3RhdHVzCisJCQktIHN0YXR1c1RleHQKKwkJCS0gcmVzcG9uc2VUZXh0CisJCSovCisJCXZhciByZXNwb25zZSA9IHt9OworCQorCQlpZih0eXBlb2YoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycykgIT0gInVuZGVmaW5lZCIpeworCQkJdmFyIGFsbEhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisJCQlpZihhbGxIZWFkZXJzKXsKKwkJCQlyZXNwb25zZS5yZXNwb25zZUhlYWRlcnMgPSBhbGxIZWFkZXJzOworCQkJfQorCQl9CisJCQorCQlpZih4aHIuc3RhdHVzID09IDAgfHwgeGhyLnN0YXR1cyl7CisJCQlyZXNwb25zZS5zdGF0dXMgPSB4aHIuc3RhdHVzOworCQl9CisJCQorCQlpZih4aHIuc3RhdHVzVGV4dCl7CisJCQlyZXNwb25zZS5zdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQ7CisJCX0KKwkJCisJCWlmKHhoci5yZXNwb25zZVRleHQpeworCQkJcmVzcG9uc2UucmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKKwkJfQorCQorCQkvL0J1aWxkIGEgc3RyaW5nIG9mIHRoZSByZXNwb25zZSBvYmplY3QuCisJCXZhciByZXN1bHQgPSAiIjsKKwkJdmFyIGlzRmlyc3QgPSB0cnVlOworCQlmb3IgKHZhciBwYXJhbSBpbiByZXNwb25zZSl7CisJCQlpZihpc0ZpcnN0KXsKKwkJCQlpc0ZpcnN0ID0gZmFsc2U7CisJCQl9ZWxzZXsKKwkJCQlyZXN1bHQgKz0gIiYiOworCQkJfQorCQkJcmVzdWx0ICs9IHBhcmFtICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlc3BvbnNlW3BhcmFtXSk7CisJCX0KKwkJc2VuZFJlc3BvbnNlKHJlc3VsdCk7CisJfQorCisJZnVuY3Rpb24gc2VuZFhocigpeworCQl2YXIgcmVxdWVzdCA9IHt9OworCQl2YXIgbnZQYWlycyA9IHhpcFJlcXVlc3RNZXNzYWdlLnNwbGl0KCImIik7CisJCXZhciBpID0gMDsKKwkJdmFyIG5hbWVWYWx1ZSA9IG51bGw7CisJCWZvcihpID0gMDsgaSA8IG52UGFpcnMubGVuZ3RoOyBpKyspeworCQkJaWYobnZQYWlyc1tpXSl7CisJCQkJdmFyIG5hbWVWYWx1ZSA9IG52UGFpcnNbaV0uc3BsaXQoIj0iKTsKKwkJCQlyZXF1ZXN0W2RlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMV0pOworCQkJfQorCQl9CisKKwkJLy9TcGxpdCB1cCB0aGUgcmVxdWVzdCBoZWFkZXJzLCBpZiBhbnkuCisJCXZhciBoZWFkZXJzID0ge307CisJCWlmKHJlcXVlc3QucmVxdWVzdEhlYWRlcnMpeworCQkJbnZQYWlycyA9IHJlcXVlc3QucmVxdWVzdEhlYWRlcnMuc3BsaXQoIlxyXG4iKTsKKwkJCWZvcihpID0gMDsgaSA8IG52UGFpcnMubGVuZ3RoOyBpKyspeworCQkJCWlmKG52UGFpcnNbaV0peworCQkJCQluYW1lVmFsdWUgPSBudlBhaXJzW2ldLnNwbGl0KCI6ICIpOworCQkJCQloZWFkZXJzW2RlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lVmFsdWVbMV0pOworCQkJCX0KKwkJCX0KKworCQkJcmVxdWVzdC5yZXF1ZXN0SGVhZGVycyA9IGhlYWRlcnM7CisJCX0KKwkJCisJCWlmKGlzQWxsb3dlZFJlcXVlc3QocmVxdWVzdCkpeworCQkKKwkJCS8vVGhlIHJlcXVlc3QgaXMgYWxsb3dlZCwgc28gc2V0IHVwIHRoZSBYSFIgb2JqZWN0LgorCQkJdmFyIHhociA9IGRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0KCk7CisJCQkKKwkJCS8vU3RhcnQgdGltZXIgdG8gbG9vayBmb3IgcmVhZHlTdGF0ZS4KKwkJCXZhciB4aHJJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKKwkJCQorCQkJCWlmKHhoci5yZWFkeVN0YXRlID09IDQpeworCQkJCQljbGVhckludGVydmFsKHhockludGVydmFsSWQpOworCQkJCQl4aHJEb25lKHhocik7CisJCQkJfQorCQkJfSwgMTApOworCisJCQkvL0FjdHVhbGx5IHN0YXJ0IHVwIHRoZSBYSFIgcmVxdWVzdC4KKwkJCXhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVyaSwgdHJ1ZSk7CisJCQlkb2pvLnNldEhlYWRlcnMoeGhyLCByZXF1ZXN0LnJlcXVlc3RIZWFkZXJzKTsKKwkJCQorCQkJdmFyIGNvbnRlbnQgPSAiIjsKKwkJCWlmKHJlcXVlc3QuZGF0YSl7CisJCQkJY29udGVudCA9IHJlcXVlc3QuZGF0YTsKKwkJCX0KKworCQkJdHJ5eworCQkJCXhoci5zZW5kKGNvbnRlbnQpOworCQkJfWNhdGNoKGUpeworCQkJCWlmKHR5cGVvZiB4aHIuYWJvcnQgPT0gImZ1bmN0aW9uIil7CisJCQkJCXhoci5hYm9ydCgpOworCQkJCQl4aHJEb25lKHtzdGF0dXM6IDQwNCwgc3RhdHVzVGV4dDogInhpcF9zZXJ2ZXIuaHRtbCBlcnJvcjogIiArIGV9KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlmdW5jdGlvbiB1bnBhY2tNZXNzYWdlKGVuY29kZWRNZXNzYWdlKXsKKwkJdmFyIHBhcnRzID0gZW5jb2RlZE1lc3NhZ2Uuc3BsaXQoIjoiKTsKKwkJdmFyIGNvbW1hbmQgPSBwYXJ0c1sxXTsKKwkJZW5jb2RlZE1lc3NhZ2UgPSBwYXJ0c1syXSB8fCAiIjsKKworCQl2YXIgY29uZmlnID0gbnVsbDsKKwkJaWYoY29tbWFuZCA9PSAiaW5pdCIpeworCQkJdmFyIGNvbmZpZ1BhcnRzID0gZW5jb2RlZE1lc3NhZ2Uuc3BsaXQoIiYiKTsKKwkJCWNvbmZpZyA9IHt9OworCQkJZm9yKHZhciBpID0gMDsgaSA8IGNvbmZpZ1BhcnRzLmxlbmd0aDsgaSsrKXsKKwkJCQl2YXIgbmFtZVZhbHVlID0gY29uZmlnUGFydHNbaV0uc3BsaXQoIj0iKTsKKwkJCQljb25maWdbZGVjb2RlVVJJQ29tcG9uZW50KG5hbWVWYWx1ZVswXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG5hbWVWYWx1ZVsxXSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHtjb21tYW5kOiBjb21tYW5kLCBtZXNzYWdlOiBlbmNvZGVkTWVzc2FnZSwgY29uZmlnOiBjb25maWd9OworCX0KKworCWZ1bmN0aW9uIG9uU2VydmVyTG9hZCgpeworCQl4aXBTZXJ2ZXJJbml0KCk7CisKKwkJLy9EZWNvZGUgdGhlIGluaXQgcGFyYW1zCisJCXZhciBjb25maWcgPSB1bnBhY2tNZXNzYWdlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCIjIilbMV0pLmNvbmZpZzsKKworCQl4aXBTdGF0ZUlkID0gY29uZmlnLmlkOworCQl4aXBDbGllbnRVcmwgPSBjb25maWcuY2xpZW50OworCQkKKwkJLy9NYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhIGphdmFzY3JpcHQ6IHVybCwganVzdCBmb3IgZ29vZCBtZWFzdXJlLgorCQlpZih4aXBDbGllbnRVcmwuc3BsaXQoIjoiKVswXS5tYXRjaCgvamF2YXNjcmlwdC9pKSl7CisJCQl0aHJvdyAiSW52YWxpZCBjbGllbnQgVVJMIjsKKwkJfQorCQlpZigheGlwU3RhdGVJZC5tYXRjaCgvXlhocklmcmFtZVByb3h5WzAtOV0rJC8pKXsKKwkJCXRocm93ICJJbnZhbGlkIHN0YXRlIElEIjsKKwkJfQorCisJCXhpcFVzZUZyYW1lUmVjdXJzaW9uID0gY29uZmlnWyJmciJdOworCisJCXNldEludGVydmFsKHBvbGxIYXNoLCAxMCk7CisJCQorCQlpZih4aXBVc2VGcmFtZVJlY3Vyc2lvbiA9PSAidHJ1ZSIpeworCQkJdmFyIHNlcnZlclVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCIjIilbMF07CisJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaWZyYW1lSG9sZGVyIikuaW5uZXJIVE1MID0gJzxpZnJhbWUgbmFtZT0iJworCQkJCSsgeGlwU3RhdGVJZCArICdfY2xpZW50RW5kUG9pbnQnCisJCQkJKyAnIiBzcmM9ImphdmFzY3JpcHQ6ZmFsc2UiPicKKwkJCQkrICc8L2lmcmFtZT4nOworCQkJdmFyIGlmcmFtZU5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIilbMF07CisJCQlpZnJhbWVOb2RlLnNyYyA9IG1ha2VDbGllbnRVcmwoImluaXQiLCAnaWQ9JyArIHhpcFN0YXRlSWQgKyAnJnNlcnZlcj0nCisJCQkJKyBlbmNvZGVVUklDb21wb25lbnQoc2VydmVyVXJsKSArICcmZnI9ZW5kcG9pbnQnKTsKKwkJfWVsc2V7CisJCQlzZXRDbGllbnRVcmwoImxvYWRlZCIpOworCQl9CisJfQorCisJaWYodHlwZW9mKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSA9PSAidW5kZWZpbmVkIil7CisJCXdpbmRvdy5hdHRhY2hFdmVudCgib25sb2FkIiwgb25TZXJ2ZXJMb2FkKTsKKwl9ZWxzZXsKKwkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvblNlcnZlckxvYWQsIGZhbHNlKTsKKwl9CisJLy8gLS0+CisJPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKwk8aDQ+VGhlIERvam8gVG9vbGtpdCAtLSB4aXBfc2VydmVyLmh0bWw8L2g0PgorCisJPHA+VGhpcyBmaWxlIGlzIHVzZWQgZm9yIERvam8ncyBYTUxIdHRwUmVxdWVzdCBJZnJhbWUgUHJveHkuIFRoaXMgaXMgdGhlIHRoZSBmaWxlCisJdGhhdCBzaG91bGQgZ28gb24gdGhlIHNlcnZlciB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgZG9pbmcgdGhlIFhIUiByZXF1ZXN0LjwvcD4KKwk8ZGl2IGlkPSJpZnJhbWVIb2xkZXIiPjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2pzb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvanNvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFjNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2pzb24uanMKQEAgLTAsMCArMSw5OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5qc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLkFkYXB0ZXJSZWdpc3RyeSIpOworZG9qby5qc29uID0ge2pzb25SZWdpc3RyeTpuZXcgZG9qby5BZGFwdGVyUmVnaXN0cnkoKSwgcmVnaXN0ZXI6ZnVuY3Rpb24gKG5hbWUsIGNoZWNrLCB3cmFwLCBvdmVycmlkZSkgeworCWRvam8uanNvbi5qc29uUmVnaXN0cnkucmVnaXN0ZXIobmFtZSwgY2hlY2ssIHdyYXAsIG92ZXJyaWRlKTsKK30sIGV2YWxKc29uOmZ1bmN0aW9uIChqc29uKSB7CisJdHJ5IHsKKwkJcmV0dXJuIGV2YWwoIigiICsganNvbiArICIpIik7CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoZSk7CisJCXJldHVybiBqc29uOworCX0KK30sIHNlcmlhbGl6ZTpmdW5jdGlvbiAobykgeworCXZhciBvYmp0eXBlID0gdHlwZW9mIChvKTsKKwlpZiAob2JqdHlwZSA9PSAidW5kZWZpbmVkIikgeworCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJfSBlbHNlIHsKKwkJaWYgKChvYmp0eXBlID09ICJudW1iZXIiKSB8fCAob2JqdHlwZSA9PSAiYm9vbGVhbiIpKSB7CisJCQlyZXR1cm4gbyArICIiOworCQl9IGVsc2UgeworCQkJaWYgKG8gPT09IG51bGwpIHsKKwkJCQlyZXR1cm4gIm51bGwiOworCQkJfQorCQl9CisJfQorCWlmIChvYmp0eXBlID09ICJzdHJpbmciKSB7CisJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVTdHJpbmcobyk7CisJfQorCXZhciBtZSA9IGFyZ3VtZW50cy5jYWxsZWU7CisJdmFyIG5ld09iajsKKwlpZiAodHlwZW9mIChvLl9fanNvbl9fKSA9PSAiZnVuY3Rpb24iKSB7CisJCW5ld09iaiA9IG8uX19qc29uX18oKTsKKwkJaWYgKG8gIT09IG5ld09iaikgeworCQkJcmV0dXJuIG1lKG5ld09iaik7CisJCX0KKwl9CisJaWYgKHR5cGVvZiAoby5qc29uKSA9PSAiZnVuY3Rpb24iKSB7CisJCW5ld09iaiA9IG8uanNvbigpOworCQlpZiAobyAhPT0gbmV3T2JqKSB7CisJCQlyZXR1cm4gbWUobmV3T2JqKTsKKwkJfQorCX0KKwlpZiAob2JqdHlwZSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZiAoby5sZW5ndGgpID09ICJudW1iZXIiKSB7CisJCXZhciByZXMgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgdmFsID0gbWUob1tpXSk7CisJCQlpZiAodHlwZW9mICh2YWwpICE9ICJzdHJpbmciKSB7CisJCQkJdmFsID0gInVuZGVmaW5lZCI7CisJCQl9CisJCQlyZXMucHVzaCh2YWwpOworCQl9CisJCXJldHVybiAiWyIgKyByZXMuam9pbigiLCIpICsgIl0iOworCX0KKwl0cnkgeworCQl3aW5kb3cubyA9IG87CisJCW5ld09iaiA9IGRvam8uanNvbi5qc29uUmVnaXN0cnkubWF0Y2gobyk7CisJCXJldHVybiBtZShuZXdPYmopOworCX0KKwljYXRjaCAoZSkgeworCX0KKwlpZiAob2JqdHlwZSA9PSAiZnVuY3Rpb24iKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXMgPSBbXTsKKwlmb3IgKHZhciBrIGluIG8pIHsKKwkJdmFyIHVzZUtleTsKKwkJaWYgKHR5cGVvZiAoaykgPT0gIm51bWJlciIpIHsKKwkJCXVzZUtleSA9ICJcIiIgKyBrICsgIlwiIjsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlb2YgKGspID09ICJzdHJpbmciKSB7CisJCQkJdXNlS2V5ID0gZG9qby5zdHJpbmcuZXNjYXBlU3RyaW5nKGspOworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQl2YWwgPSBtZShvW2tdKTsKKwkJaWYgKHR5cGVvZiAodmFsKSAhPSAic3RyaW5nIikgeworCQkJY29udGludWU7CisJCX0KKwkJcmVzLnB1c2godXNlS2V5ICsgIjoiICsgdmFsKTsKKwl9CisJcmV0dXJuICJ7IiArIHJlcy5qb2luKCIsIikgKyAifSI7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M4MjIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcuanMKQEAgLTAsMCArMSwxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nIiwgInJlcGxhY2VkIGJ5IGRvam8ubGFuZy5jb21tb24iLCAiMC41Iik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlNmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmxhbmcuY29tbW9uIiwgImRvam8ubGFuZy5hc3NlcnQiLCAiZG9qby5sYW5nLmFycmF5IiwgImRvam8ubGFuZy50eXBlIiwgImRvam8ubGFuZy5mdW5jIiwgImRvam8ubGFuZy5leHRyYXMiLCAiZG9qby5sYW5nLnJlcHIiLCAiZG9qby5sYW5nLmRlY2xhcmUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9hcnJheS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2FycmF5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzY2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9hcnJheS5qcwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmxhbmcsIHtoYXM6ZnVuY3Rpb24gKG9iaiwgbmFtZSkgeworCXRyeSB7CisJCXJldHVybiB0eXBlb2Ygb2JqW25hbWVdICE9ICJ1bmRlZmluZWQiOworCX0KKwljYXRjaCAoZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfSwgaXNFbXB0eTpmdW5jdGlvbiAob2JqKSB7CisJaWYgKGRvam8ubGFuZy5pc09iamVjdChvYmopKSB7CisJCXZhciB0bXAgPSB7fTsKKwkJdmFyIGNvdW50ID0gMDsKKwkJZm9yICh2YXIgeCBpbiBvYmopIHsKKwkJCWlmIChvYmpbeF0gJiYgKCF0bXBbeF0pKSB7CisJCQkJY291bnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQgPT0gMDsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5sYW5nLmlzQXJyYXlMaWtlKG9iaikgfHwgZG9qby5sYW5nLmlzU3RyaW5nKG9iaikpIHsKKwkJCXJldHVybiBvYmoubGVuZ3RoID09IDA7CisJCX0KKwl9Cit9LCBtYXA6ZnVuY3Rpb24gKGFyciwgb2JqLCB1bmFyeV9mdW5jKSB7CisJdmFyIGlzU3RyaW5nID0gZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CisJaWYgKGlzU3RyaW5nKSB7CisJCWFyciA9IGFyci5zcGxpdCgiIik7CisJfQorCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopICYmICghdW5hcnlfZnVuYykpIHsKKwkJdW5hcnlfZnVuYyA9IG9iajsKKwkJb2JqID0gZGpfZ2xvYmFsOworCX0gZWxzZSB7CisJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopICYmIHVuYXJ5X2Z1bmMpIHsKKwkJCXZhciB0bXBPYmogPSBvYmo7CisJCQlvYmogPSB1bmFyeV9mdW5jOworCQkJdW5hcnlfZnVuYyA9IHRtcE9iajsKKwkJfQorCX0KKwlpZiAoQXJyYXkubWFwKSB7CisJCXZhciBvdXRBcnIgPSBBcnJheS5tYXAoYXJyLCB1bmFyeV9mdW5jLCBvYmopOworCX0gZWxzZSB7CisJCXZhciBvdXRBcnIgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsKKwkJCW91dEFyci5wdXNoKHVuYXJ5X2Z1bmMuY2FsbChvYmosIGFycltpXSkpOworCQl9CisJfQorCWlmIChpc1N0cmluZykgeworCQlyZXR1cm4gb3V0QXJyLmpvaW4oIiIpOworCX0gZWxzZSB7CisJCXJldHVybiBvdXRBcnI7CisJfQorfSwgcmVkdWNlOmZ1bmN0aW9uIChhcnIsIGluaXRpYWxWYWx1ZSwgb2JqLCBiaW5hcnlfZnVuYykgeworCXZhciByZWR1Y2VkVmFsdWUgPSBpbml0aWFsVmFsdWU7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgeworCQliaW5hcnlfZnVuYyA9IGluaXRpYWxWYWx1ZTsKKwkJcmVkdWNlZFZhbHVlID0gYXJyWzBdOworCQlhcnIgPSBhcnIuc2xpY2UoMSk7CisJfSBlbHNlIHsKKwkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgeworCQkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikpIHsKKwkJCQliaW5hcnlfZnVuYyA9IG9iajsKKwkJCQlvYmogPSBudWxsOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikpIHsKKwkJCQl2YXIgdG1wID0gYmluYXJ5X2Z1bmM7CisJCQkJYmluYXJ5X2Z1bmMgPSBvYmo7CisJCQkJb2JqID0gdG1wOworCQkJfQorCQl9CisJfQorCXZhciBvYiA9IG9iaiB8fCBkal9nbG9iYWw7CisJZG9qby5sYW5nLm1hcChhcnIsIGZ1bmN0aW9uICh2YWwpIHsKKwkJcmVkdWNlZFZhbHVlID0gYmluYXJ5X2Z1bmMuY2FsbChvYiwgcmVkdWNlZFZhbHVlLCB2YWwpOworCX0pOworCXJldHVybiByZWR1Y2VkVmFsdWU7Cit9LCBmb3JFYWNoOmZ1bmN0aW9uIChhbkFycmF5LCBjYWxsYmFjaywgdGhpc09iamVjdCkgeworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoYW5BcnJheSkpIHsKKwkJYW5BcnJheSA9IGFuQXJyYXkuc3BsaXQoIiIpOworCX0KKwlpZiAoQXJyYXkuZm9yRWFjaCkgeworCQlBcnJheS5mb3JFYWNoKGFuQXJyYXksIGNhbGxiYWNrLCB0aGlzT2JqZWN0KTsKKwl9IGVsc2UgeworCQlpZiAoIXRoaXNPYmplY3QpIHsKKwkJCXRoaXNPYmplY3QgPSBkal9nbG9iYWw7CisJCX0KKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBhbkFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJY2FsbGJhY2suY2FsbCh0aGlzT2JqZWN0LCBhbkFycmF5W2ldLCBpLCBhbkFycmF5KTsKKwkJfQorCX0KK30sIF9ldmVyeU9yU29tZTpmdW5jdGlvbiAoZXZlcnksIGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpIHsKKwlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGFycikpIHsKKwkJYXJyID0gYXJyLnNwbGl0KCIiKTsKKwl9CisJaWYgKEFycmF5LmV2ZXJ5KSB7CisJCXJldHVybiBBcnJheVtldmVyeSA/ICJldmVyeSIgOiAic29tZSJdKGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworCX0gZWxzZSB7CisJCWlmICghdGhpc09iamVjdCkgeworCQkJdGhpc09iamVjdCA9IGRqX2dsb2JhbDsKKwkJfQorCQlmb3IgKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCXZhciByZXN1bHQgPSBjYWxsYmFjay5jYWxsKHRoaXNPYmplY3QsIGFycltpXSwgaSwgYXJyKTsKKwkJCWlmIChldmVyeSAmJiAhcmVzdWx0KSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKCFldmVyeSkgJiYgKHJlc3VsdCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBCb29sZWFuKGV2ZXJ5KTsKKwl9Cit9LCBldmVyeTpmdW5jdGlvbiAoYXJyLCBjYWxsYmFjaywgdGhpc09iamVjdCkgeworCXJldHVybiB0aGlzLl9ldmVyeU9yU29tZSh0cnVlLCBhcnIsIGNhbGxiYWNrLCB0aGlzT2JqZWN0KTsKK30sIHNvbWU6ZnVuY3Rpb24gKGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpIHsKKwlyZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUoZmFsc2UsIGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworfSwgZmlsdGVyOmZ1bmN0aW9uIChhcnIsIGNhbGxiYWNrLCB0aGlzT2JqZWN0KSB7CisJdmFyIGlzU3RyaW5nID0gZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CisJaWYgKGlzU3RyaW5nKSB7CisJCWFyciA9IGFyci5zcGxpdCgiIik7CisJfQorCXZhciBvdXRBcnI7CisJaWYgKEFycmF5LmZpbHRlcikgeworCQlvdXRBcnIgPSBBcnJheS5maWx0ZXIoYXJyLCBjYWxsYmFjaywgdGhpc09iamVjdCk7CisJfSBlbHNlIHsKKwkJaWYgKCF0aGlzT2JqZWN0KSB7CisJCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSB7CisJCQkJZG9qby5yYWlzZSgidGhpc09iamVjdCBkb2Vzbid0IGV4aXN0ISIpOworCQkJfQorCQkJdGhpc09iamVjdCA9IGRqX2dsb2JhbDsKKwkJfQorCQlvdXRBcnIgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjYWxsYmFjay5jYWxsKHRoaXNPYmplY3QsIGFycltpXSwgaSwgYXJyKSkgeworCQkJCW91dEFyci5wdXNoKGFycltpXSk7CisJCQl9CisJCX0KKwl9CisJaWYgKGlzU3RyaW5nKSB7CisJCXJldHVybiBvdXRBcnIuam9pbigiIik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG91dEFycjsKKwl9Cit9LCB1bm5lc3Q6ZnVuY3Rpb24gKCkgeworCXZhciBvdXQgPSBbXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZiAoZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFyZ3VtZW50c1tpXSkpIHsKKwkJCXZhciBhZGQgPSBkb2pvLmxhbmcudW5uZXN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50c1tpXSk7CisJCQlvdXQgPSBvdXQuY29uY2F0KGFkZCk7CisJCX0gZWxzZSB7CisJCQlvdXQucHVzaChhcmd1bWVudHNbaV0pOworCQl9CisJfQorCXJldHVybiBvdXQ7Cit9LCB0b0FycmF5OmZ1bmN0aW9uIChhcnJheUxpa2UsIHN0YXJ0T2Zmc2V0KSB7CisJdmFyIGFycmF5ID0gW107CisJZm9yICh2YXIgaSA9IHN0YXJ0T2Zmc2V0IHx8IDA7IGkgPCBhcnJheUxpa2UubGVuZ3RoOyBpKyspIHsKKwkJYXJyYXkucHVzaChhcnJheUxpa2VbaV0pOworCX0KKwlyZXR1cm4gYXJyYXk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2Fzc2VydC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2Fzc2VydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTVjODZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvYXNzZXJ0LmpzCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLnR5cGUiKTsKK2Rvam8ubGFuZy5hc3NlcnQgPSBmdW5jdGlvbiAoYm9vbGVhblZhbHVlLCBtZXNzYWdlKSB7CisJaWYgKCFib29sZWFuVmFsdWUpIHsKKwkJdmFyIGVycm9yTWVzc2FnZSA9ICJBbiBhc3NlcnQgc3RhdGVtZW50IGZhaWxlZC5cbiIgKyAiVGhlIG1ldGhvZCBkb2pvLmxhbmcuYXNzZXJ0KCkgd2FzIGNhbGxlZCB3aXRoIGEgJ2ZhbHNlJyB2YWx1ZS5cbiI7CisJCWlmIChtZXNzYWdlKSB7CisJCQllcnJvck1lc3NhZ2UgKz0gIkhlcmUncyB0aGUgYXNzZXJ0IG1lc3NhZ2U6XG4iICsgbWVzc2FnZSArICJcbiI7CisJCX0KKwkJdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7CisJfQorfTsKK2Rvam8ubGFuZy5hc3NlcnRUeXBlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlLCBrZXl3b3JkUGFyYW1ldGVycykgeworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoa2V5d29yZFBhcmFtZXRlcnMpKSB7CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLmFzc2VydFR5cGUodmFsdWUsIHR5cGUsIFwibWVzc2FnZVwiKSIsICJ1c2UgZG9qby5sYW5nLmFzc2VydFR5cGUodmFsdWUsIHR5cGUpIGluc3RlYWQiLCAiMC41Iik7CisJfQorCWlmICghZG9qby5sYW5nLmlzT2ZUeXBlKHZhbHVlLCB0eXBlLCBrZXl3b3JkUGFyYW1ldGVycykpIHsKKwkJaWYgKCFkb2pvLmxhbmcuYXNzZXJ0VHlwZS5fZXJyb3JNZXNzYWdlKSB7CisJCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZS5fZXJyb3JNZXNzYWdlID0gIlR5cGUgbWlzbWF0Y2g6IGRvam8ubGFuZy5hc3NlcnRUeXBlKCkgZmFpbGVkLiI7CisJCX0KKwkJZG9qby5sYW5nLmFzc2VydChmYWxzZSwgZG9qby5sYW5nLmFzc2VydFR5cGUuX2Vycm9yTWVzc2FnZSk7CisJfQorfTsKK2Rvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzID0gZnVuY3Rpb24gKG9iamVjdCwgZXhwZWN0ZWRQcm9wZXJ0aWVzLCBtZXNzYWdlKSB7CisJdmFyIGtleTsKKwlpZiAoIW1lc3NhZ2UpIHsKKwkJaWYgKCFkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcy5fZXJyb3JNZXNzYWdlKSB7CisJCQlkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcy5fZXJyb3JNZXNzYWdlID0gIkluIGRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzKCksIGZvdW5kIGludmFsaWQga2V5d29yZDoiOworCQl9CisJCW1lc3NhZ2UgPSBkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcy5fZXJyb3JNZXNzYWdlOworCX0KKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkoZXhwZWN0ZWRQcm9wZXJ0aWVzKSkgeworCQlmb3IgKGtleSBpbiBvYmplY3QpIHsKKwkJCWlmICghZG9qby5sYW5nLmluQXJyYXkoZXhwZWN0ZWRQcm9wZXJ0aWVzLCBrZXkpKSB7CisJCQkJZG9qby5sYW5nLmFzc2VydChmYWxzZSwgbWVzc2FnZSArICIgIiArIGtleSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGtleSBpbiBvYmplY3QpIHsKKwkJCWlmICghKGtleSBpbiBleHBlY3RlZFByb3BlcnRpZXMpKSB7CisJCQkJZG9qby5sYW5nLmFzc2VydChmYWxzZSwgbWVzc2FnZSArICIgIiArIGtleSk7CisJCQl9CisJCX0KKwl9Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9jb21tb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9jb21tb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ZjdlNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2NvbW1vbi5qcwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5sYW5nLmluaGVyaXRzID0gZnVuY3Rpb24gKHN1YmNsYXNzLCBzdXBlcmNsYXNzKSB7CisJaWYgKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihzdXBlcmNsYXNzKSkgeworCQlkb2pvLnJhaXNlKCJkb2pvLmluaGVyaXRzOiBzdXBlcmNsYXNzIGFyZ3VtZW50IFsiICsgc3VwZXJjbGFzcyArICJdIG11c3QgYmUgYSBmdW5jdGlvbiAoc3ViY2xhc3M6IFsiICsgc3ViY2xhc3MgKyAiJ10iKTsKKwl9CisJc3ViY2xhc3MucHJvdG90eXBlID0gbmV3IHN1cGVyY2xhc3MoKTsKKwlzdWJjbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJjbGFzczsKKwlzdWJjbGFzcy5zdXBlcmNsYXNzID0gc3VwZXJjbGFzcy5wcm90b3R5cGU7CisJc3ViY2xhc3NbInN1cGVyIl0gPSBzdXBlcmNsYXNzLnByb3RvdHlwZTsKK307Citkb2pvLmxhbmcuX21peGluID0gZnVuY3Rpb24gKG9iaiwgcHJvcHMpIHsKKwl2YXIgdG9iaiA9IHt9OworCWZvciAodmFyIHggaW4gcHJvcHMpIHsKKwkJaWYgKCh0eXBlb2YgdG9ialt4XSA9PSAidW5kZWZpbmVkIikgfHwgKHRvYmpbeF0gIT0gcHJvcHNbeF0pKSB7CisJCQlvYmpbeF0gPSBwcm9wc1t4XTsKKwkJfQorCX0KKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiAodHlwZW9mIChwcm9wc1sidG9TdHJpbmciXSkgPT0gImZ1bmN0aW9uIikgJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IG9ialsidG9TdHJpbmciXSkgJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IHRvYmpbInRvU3RyaW5nIl0pKSB7CisJCW9iai50b1N0cmluZyA9IHByb3BzLnRvU3RyaW5nOworCX0KKwlyZXR1cm4gb2JqOworfTsKK2Rvam8ubGFuZy5taXhpbiA9IGZ1bmN0aW9uIChvYmosIHByb3BzKSB7CisJZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCWRvam8ubGFuZy5fbWl4aW4ob2JqLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gb2JqOworfTsKK2Rvam8ubGFuZy5leHRlbmQgPSBmdW5jdGlvbiAoY29uc3RydWN0b3IsIHByb3BzKSB7CisJZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCWRvam8ubGFuZy5fbWl4aW4oY29uc3RydWN0b3IucHJvdG90eXBlLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gY29uc3RydWN0b3I7Cit9OworZG9qby5pbmhlcml0cyA9IGRvam8ubGFuZy5pbmhlcml0czsKK2Rvam8ubWl4aW4gPSBkb2pvLmxhbmcubWl4aW47Citkb2pvLmV4dGVuZCA9IGRvam8ubGFuZy5leHRlbmQ7Citkb2pvLmxhbmcuZmluZCA9IGZ1bmN0aW9uIChhcnJheSwgdmFsdWUsIGlkZW50aXR5LCBmaW5kTGFzdCkgeworCWlmICghZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFycmF5KSAmJiBkb2pvLmxhbmcuaXNBcnJheUxpa2UodmFsdWUpKSB7CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLmZpbmQodmFsdWUsIGFycmF5KSIsICJ1c2UgZG9qby5sYW5nLmZpbmQoYXJyYXksIHZhbHVlKSBpbnN0ZWFkIiwgIjAuNSIpOworCQl2YXIgdGVtcCA9IGFycmF5OworCQlhcnJheSA9IHZhbHVlOworCQl2YWx1ZSA9IHRlbXA7CisJfQorCXZhciBpc1N0cmluZyA9IGRvam8ubGFuZy5pc1N0cmluZyhhcnJheSk7CisJaWYgKGlzU3RyaW5nKSB7CisJCWFycmF5ID0gYXJyYXkuc3BsaXQoIiIpOworCX0KKwlpZiAoZmluZExhc3QpIHsKKwkJdmFyIHN0ZXAgPSAtMTsKKwkJdmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOworCQl2YXIgZW5kID0gLTE7CisJfSBlbHNlIHsKKwkJdmFyIHN0ZXAgPSAxOworCQl2YXIgaSA9IDA7CisJCXZhciBlbmQgPSBhcnJheS5sZW5ndGg7CisJfQorCWlmIChpZGVudGl0eSkgeworCQl3aGlsZSAoaSAhPSBlbmQpIHsKKwkJCWlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJCWkgKz0gc3RlcDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChpICE9IGVuZCkgeworCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCQlpICs9IHN0ZXA7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfTsKK2Rvam8ubGFuZy5pbmRleE9mID0gZG9qby5sYW5nLmZpbmQ7Citkb2pvLmxhbmcuZmluZExhc3QgPSBmdW5jdGlvbiAoYXJyYXksIHZhbHVlLCBpZGVudGl0eSkgeworCXJldHVybiBkb2pvLmxhbmcuZmluZChhcnJheSwgdmFsdWUsIGlkZW50aXR5LCB0cnVlKTsKK307Citkb2pvLmxhbmcubGFzdEluZGV4T2YgPSBkb2pvLmxhbmcuZmluZExhc3Q7Citkb2pvLmxhbmcuaW5BcnJheSA9IGZ1bmN0aW9uIChhcnJheSwgdmFsdWUpIHsKKwlyZXR1cm4gZG9qby5sYW5nLmZpbmQoYXJyYXksIHZhbHVlKSA+IC0xOworfTsKK2Rvam8ubGFuZy5pc09iamVjdCA9IGZ1bmN0aW9uIChpdCkgeworCWlmICh0eXBlb2YgaXQgPT0gInVuZGVmaW5lZCIpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gKHR5cGVvZiBpdCA9PSAib2JqZWN0IiB8fCBpdCA9PT0gbnVsbCB8fCBkb2pvLmxhbmcuaXNBcnJheShpdCkgfHwgZG9qby5sYW5nLmlzRnVuY3Rpb24oaXQpKTsKK307Citkb2pvLmxhbmcuaXNBcnJheSA9IGZ1bmN0aW9uIChpdCkgeworCXJldHVybiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBBcnJheSB8fCB0eXBlb2YgaXQgPT0gImFycmF5Iik7Cit9OworZG9qby5sYW5nLmlzQXJyYXlMaWtlID0gZnVuY3Rpb24gKGl0KSB7CisJaWYgKCghaXQpIHx8IChkb2pvLmxhbmcuaXNVbmRlZmluZWQoaXQpKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoaXQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGl0KSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChkb2pvLmxhbmcuaXNBcnJheShpdCkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmICgoaXQudGFnTmFtZSkgJiYgKGl0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiZm9ybSIpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRvam8ubGFuZy5pc051bWJlcihpdC5sZW5ndGgpICYmIGlzRmluaXRlKGl0Lmxlbmd0aCkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK307Citkb2pvLmxhbmcuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChpdCkgeworCXJldHVybiAoaXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgaXQgPT0gImZ1bmN0aW9uIik7Cit9OworKGZ1bmN0aW9uICgpIHsKKwlpZiAoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkgJiYgKGRvam8ucmVuZGVyLmh0bWxbInNhZmFyaSJdKSkgeworCQlkb2pvLmxhbmcuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChpdCkgeworCQkJaWYgKCh0eXBlb2YgKGl0KSA9PSAiZnVuY3Rpb24iKSAmJiAoaXQgPT0gIltvYmplY3QgTm9kZUxpc3RdIikpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gKGl0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHlwZW9mIGl0ID09ICJmdW5jdGlvbiIpOworCQl9OworCX0KK30pKCk7Citkb2pvLmxhbmcuaXNTdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHsKKwlyZXR1cm4gKHR5cGVvZiBpdCA9PSAic3RyaW5nIiB8fCBpdCBpbnN0YW5jZW9mIFN0cmluZyk7Cit9OworZG9qby5sYW5nLmlzQWxpZW4gPSBmdW5jdGlvbiAoaXQpIHsKKwlpZiAoIWl0KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuICFkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkgJiYgL1x7XHMqXFtuYXRpdmUgY29kZVxdXHMqXH0vLnRlc3QoU3RyaW5nKGl0KSk7Cit9OworZG9qby5sYW5nLmlzQm9vbGVhbiA9IGZ1bmN0aW9uIChpdCkgeworCXJldHVybiAoaXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHR5cGVvZiBpdCA9PSAiYm9vbGVhbiIpOworfTsKK2Rvam8ubGFuZy5pc051bWJlciA9IGZ1bmN0aW9uIChpdCkgeworCXJldHVybiAoaXQgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdHlwZW9mIGl0ID09ICJudW1iZXIiKTsKK307Citkb2pvLmxhbmcuaXNVbmRlZmluZWQgPSBmdW5jdGlvbiAoaXQpIHsKKwlyZXR1cm4gKCh0eXBlb2YgKGl0KSA9PSAidW5kZWZpbmVkIikgJiYgKGl0ID09IHVuZGVmaW5lZCkpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvZGVjbGFyZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2RlY2xhcmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiYmVhNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2RlY2xhcmUuanMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5sYW5nLmRlY2xhcmUgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBzdXBlcmNsYXNzLCBpbml0LCBwcm9wcykgeworCWlmICgoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcHMpKSB8fCAoKCFwcm9wcykgJiYgKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihpbml0KSkpKSB7CisJCXZhciB0ZW1wID0gcHJvcHM7CisJCXByb3BzID0gaW5pdDsKKwkJaW5pdCA9IHRlbXA7CisJfQorCXZhciBtaXhpbnMgPSBbXTsKKwlpZiAoZG9qby5sYW5nLmlzQXJyYXkoc3VwZXJjbGFzcykpIHsKKwkJbWl4aW5zID0gc3VwZXJjbGFzczsKKwkJc3VwZXJjbGFzcyA9IG1peGlucy5zaGlmdCgpOworCX0KKwlpZiAoIWluaXQpIHsKKwkJaW5pdCA9IGRvam8uZXZhbE9ialBhdGgoY2xhc3NOYW1lLCBmYWxzZSk7CisJCWlmICgoaW5pdCkgJiYgKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihpbml0KSkpIHsKKwkJCWluaXQgPSBudWxsOworCQl9CisJfQorCXZhciBjdG9yID0gZG9qby5sYW5nLmRlY2xhcmUuX21ha2VDb25zdHJ1Y3RvcigpOworCXZhciBzY3AgPSAoc3VwZXJjbGFzcyA/IHN1cGVyY2xhc3MucHJvdG90eXBlIDogbnVsbCk7CisJaWYgKHNjcCkgeworCQlzY3AucHJvdG90eXBpbmcgPSB0cnVlOworCQljdG9yLnByb3RvdHlwZSA9IG5ldyBzdXBlcmNsYXNzKCk7CisJCXNjcC5wcm90b3R5cGluZyA9IGZhbHNlOworCX0KKwljdG9yLnN1cGVyY2xhc3MgPSBzY3A7CisJY3Rvci5taXhpbnMgPSBtaXhpbnM7CisJZm9yICh2YXIgaSA9IDAsIGwgPSBtaXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCWRvam8ubGFuZy5leHRlbmQoY3RvciwgbWl4aW5zW2ldLnByb3RvdHlwZSk7CisJfQorCWN0b3IucHJvdG90eXBlLmluaXRpYWxpemVyID0gbnVsbDsKKwljdG9yLnByb3RvdHlwZS5kZWNsYXJlZENsYXNzID0gY2xhc3NOYW1lOworCWlmIChkb2pvLmxhbmcuaXNBcnJheShwcm9wcykpIHsKKwkJZG9qby5sYW5nLmV4dGVuZC5hcHBseShkb2pvLmxhbmcsIFtjdG9yXS5jb25jYXQocHJvcHMpKTsKKwl9IGVsc2UgeworCQlkb2pvLmxhbmcuZXh0ZW5kKGN0b3IsIChwcm9wcykgfHwge30pOworCX0KKwlkb2pvLmxhbmcuZXh0ZW5kKGN0b3IsIGRvam8ubGFuZy5kZWNsYXJlLl9jb21tb24pOworCWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKKwljdG9yLnByb3RvdHlwZS5pbml0aWFsaXplciA9IChjdG9yLnByb3RvdHlwZS5pbml0aWFsaXplcikgfHwgKGluaXQpIHx8IChmdW5jdGlvbiAoKSB7CisJfSk7CisJdmFyIGNyZWF0ZWQgPSBkb2pvLnBhcnNlT2JqUGF0aChjbGFzc05hbWUsIG51bGwsIHRydWUpOworCWNyZWF0ZWQub2JqW2NyZWF0ZWQucHJvcF0gPSBjdG9yOworCXJldHVybiBjdG9yOworfTsKK2Rvam8ubGFuZy5kZWNsYXJlLl9tYWtlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJdmFyIHNlbGYgPSB0aGlzLl9nZXRQcm9wQ29udGV4dCgpOworCQl2YXIgcyA9IHNlbGYuY29uc3RydWN0b3Iuc3VwZXJjbGFzczsKKwkJaWYgKChzKSAmJiAocy5jb25zdHJ1Y3RvcikpIHsKKwkJCWlmIChzLmNvbnN0cnVjdG9yID09IGFyZ3VtZW50cy5jYWxsZWUpIHsKKwkJCQl0aGlzLl9pbmhlcml0ZWQoImNvbnN0cnVjdG9yIiwgYXJndW1lbnRzKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5fY29udGV4dE1ldGhvZChzLCAiY29uc3RydWN0b3IiLCBhcmd1bWVudHMpOworCQkJfQorCQl9CisJCXZhciBtcyA9IChzZWxmLmNvbnN0cnVjdG9yLm1peGlucykgfHwgKFtdKTsKKwkJZm9yICh2YXIgaSA9IDAsIG07IChtID0gbXNbaV0pOyBpKyspIHsKKwkJCSgoKG0ucHJvdG90eXBlKSAmJiAobS5wcm90b3R5cGUuaW5pdGlhbGl6ZXIpKSB8fCAobSkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwkJaWYgKCghdGhpcy5wcm90b3R5cGluZykgJiYgKHNlbGYuaW5pdGlhbGl6ZXIpKSB7CisJCQlzZWxmLmluaXRpYWxpemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwl9OworfTsKK2Rvam8ubGFuZy5kZWNsYXJlLl9jb21tb24gPSB7X2dldFByb3BDb250ZXh0OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gKHRoaXMuX19fcHJvdG8gfHwgdGhpcyk7Cit9LCBfY29udGV4dE1ldGhvZDpmdW5jdGlvbiAocHR5cGUsIG1ldGhvZCwgYXJncykgeworCXZhciByZXN1bHQsIHN0YWNrID0gdGhpcy5fX19wcm90bzsKKwl0aGlzLl9fX3Byb3RvID0gcHR5cGU7CisJdHJ5IHsKKwkJcmVzdWx0ID0gcHR5cGVbbWV0aG9kXS5hcHBseSh0aGlzLCAoYXJncyB8fCBbXSkpOworCX0KKwljYXRjaCAoZSkgeworCQl0aHJvdyBlOworCX0KKwlmaW5hbGx5IHsKKwkJdGhpcy5fX19wcm90byA9IHN0YWNrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgX2luaGVyaXRlZDpmdW5jdGlvbiAocHJvcCwgYXJncykgeworCXZhciBwID0gdGhpcy5fZ2V0UHJvcENvbnRleHQoKTsKKwlkbyB7CisJCWlmICgoIXAuY29uc3RydWN0b3IpIHx8ICghcC5jb25zdHJ1Y3Rvci5zdXBlcmNsYXNzKSkgeworCQkJcmV0dXJuOworCQl9CisJCXAgPSBwLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3M7CisJfSB3aGlsZSAoIShwcm9wIGluIHApKTsKKwlyZXR1cm4gKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHBbcHJvcF0pID8gdGhpcy5fY29udGV4dE1ldGhvZChwLCBwcm9wLCBhcmdzKSA6IHBbcHJvcF0pOworfSwgaW5oZXJpdGVkOmZ1bmN0aW9uIChwcm9wLCBhcmdzKSB7CisJZG9qby5kZXByZWNhdGVkKCInaW5oZXJpdGVkJyBtZXRob2QgaXMgZGFuZ2Vyb3VzLCBkbyBub3QgdXAtY2FsbCEgJ2luaGVyaXRlZCcgaXMgc2xhdGVkIGZvciByZW1vdmFsIGluIDAuNTsgbmFtZSB5b3VyIHN1cGVyIGNsYXNzIChvciB1c2Ugc3VwZXJjbGFzcyBwcm9wZXJ0eSkgaW5zdGVhZC4iLCAiMC41Iik7CisJdGhpcy5faW5oZXJpdGVkKHByb3AsIGFyZ3MpOworfX07Citkb2pvLmRlY2xhcmUgPSBkb2pvLmxhbmcuZGVjbGFyZTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvZXh0cmFzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvZXh0cmFzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjIwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9leHRyYXMuanMKQEAgLTAsMCArMSw5NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmxhbmcuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChmdW5jLCBkZWxheSkgeworCXZhciBjb250ZXh0ID0gd2luZG93LCBhcmdzU3RhcnQgPSAyOworCWlmICghZG9qby5sYW5nLmlzRnVuY3Rpb24oZnVuYykpIHsKKwkJY29udGV4dCA9IGZ1bmM7CisJCWZ1bmMgPSBkZWxheTsKKwkJZGVsYXkgPSBhcmd1bWVudHNbMl07CisJCWFyZ3NTdGFydCsrOworCX0KKwlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGZ1bmMpKSB7CisJCWZ1bmMgPSBjb250ZXh0W2Z1bmNdOworCX0KKwl2YXIgYXJncyA9IFtdOworCWZvciAodmFyIGkgPSBhcmdzU3RhcnQ7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJfQorCXJldHVybiBkb2pvLmdsb2JhbCgpLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworCQlmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpOworCX0sIGRlbGF5KTsKK307Citkb2pvLmxhbmcuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKHRpbWVyKSB7CisJZG9qby5nbG9iYWwoKS5jbGVhclRpbWVvdXQodGltZXIpOworfTsKK2Rvam8ubGFuZy5nZXROYW1lSW5PYmogPSBmdW5jdGlvbiAobnMsIGl0ZW0pIHsKKwlpZiAoIW5zKSB7CisJCW5zID0gZGpfZ2xvYmFsOworCX0KKwlmb3IgKHZhciB4IGluIG5zKSB7CisJCWlmIChuc1t4XSA9PT0gaXRlbSkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmcoeCk7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9OworZG9qby5sYW5nLnNoYWxsb3dDb3B5ID0gZnVuY3Rpb24gKG9iaiwgZGVlcCkgeworCXZhciBpLCByZXQ7CisJaWYgKG9iaiA9PT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKGRvam8ubGFuZy5pc09iamVjdChvYmopKSB7CisJCXJldCA9IG5ldyBvYmouY29uc3RydWN0b3IoKTsKKwkJZm9yIChpIGluIG9iaikgeworCQkJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXRbaV0pKSB7CisJCQkJcmV0W2ldID0gZGVlcCA/IGRvam8ubGFuZy5zaGFsbG93Q29weShvYmpbaV0sIGRlZXApIDogb2JqW2ldOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5KG9iaikpIHsKKwkJCXJldCA9IFtdOworCQkJZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgeworCQkJCXJldFtpXSA9IGRlZXAgPyBkb2pvLmxhbmcuc2hhbGxvd0NvcHkob2JqW2ldLCBkZWVwKSA6IG9ialtpXTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IG9iajsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfTsKK2Rvam8ubGFuZy5maXJzdFZhbHVlZCA9IGZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPSAidW5kZWZpbmVkIikgeworCQkJcmV0dXJuIGFyZ3VtZW50c1tpXTsKKwkJfQorCX0KKwlyZXR1cm4gdW5kZWZpbmVkOworfTsKK2Rvam8ubGFuZy5nZXRPYmpQYXRoVmFsdWUgPSBmdW5jdGlvbiAob2JqcGF0aCwgY29udGV4dCwgY3JlYXRlKSB7CisJd2l0aCAoZG9qby5wYXJzZU9ialBhdGgob2JqcGF0aCwgY29udGV4dCwgY3JlYXRlKSkgeworCQlyZXR1cm4gZG9qby5ldmFsUHJvcChwcm9wLCBvYmosIGNyZWF0ZSk7CisJfQorfTsKK2Rvam8ubGFuZy5zZXRPYmpQYXRoVmFsdWUgPSBmdW5jdGlvbiAob2JqcGF0aCwgdmFsdWUsIGNvbnRleHQsIGNyZWF0ZSkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLnNldE9ialBhdGhWYWx1ZSIsICJ1c2UgZG9qby5wYXJzZU9ialBhdGggYW5kIHRoZSAnPScgb3BlcmF0b3IiLCAiMC42Iik7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7CisJCWNyZWF0ZSA9IHRydWU7CisJfQorCXdpdGggKGRvam8ucGFyc2VPYmpQYXRoKG9ianBhdGgsIGNvbnRleHQsIGNyZWF0ZSkpIHsKKwkJaWYgKG9iaiAmJiAoY3JlYXRlIHx8IChwcm9wIGluIG9iaikpKSB7CisJCQlvYmpbcHJvcF0gPSB2YWx1ZTsKKwkJfQorCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL2Z1bmMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9mdW5jLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmJhODQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9mdW5jLmpzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmxhbmcuaGl0Y2ggPSBmdW5jdGlvbiAodGhpc09iamVjdCwgbWV0aG9kKSB7CisJdmFyIGFyZ3MgPSBbXTsKKwlmb3IgKHZhciB4ID0gMjsgeCA8IGFyZ3VtZW50cy5sZW5ndGg7IHgrKykgeworCQlhcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKKwl9CisJdmFyIGZjbiA9IChkb2pvLmxhbmcuaXNTdHJpbmcobWV0aG9kKSA/IHRoaXNPYmplY3RbbWV0aG9kXSA6IG1ldGhvZCkgfHwgZnVuY3Rpb24gKCkgeworCX07CisJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJdmFyIHRhID0gYXJncy5jb25jYXQoW10pOworCQlmb3IgKHZhciB4ID0gMDsgeCA8IGFyZ3VtZW50cy5sZW5ndGg7IHgrKykgeworCQkJdGEucHVzaChhcmd1bWVudHNbeF0pOworCQl9CisJCXJldHVybiBmY24uYXBwbHkodGhpc09iamVjdCwgdGEpOworCX07Cit9OworZG9qby5sYW5nLmFub25DdHIgPSAwOworZG9qby5sYW5nLmFub24gPSB7fTsKK2Rvam8ubGFuZy5uYW1lQW5vbkZ1bmMgPSBmdW5jdGlvbiAoYW5vbkZ1bmNQdHIsIHRoaXNPYmosIHNlYXJjaEZvck5hbWVzKSB7CisJdmFyIG5zbyA9ICh0aGlzT2JqIHx8IGRvam8ubGFuZy5hbm9uKTsKKwlpZiAoKHNlYXJjaEZvck5hbWVzKSB8fCAoKGRqX2dsb2JhbFsiZGpDb25maWciXSkgJiYgKGRqQ29uZmlnWyJzbG93QW5vbkZ1bmNMb29rdXBzIl0gPT0gdHJ1ZSkpKSB7CisJCWZvciAodmFyIHggaW4gbnNvKSB7CisJCQl0cnkgeworCQkJCWlmIChuc29beF0gPT09IGFub25GdW5jUHRyKSB7CisJCQkJCXJldHVybiB4OworCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0KKwl9CisJdmFyIHJldCA9ICJfXyIgKyBkb2pvLmxhbmcuYW5vbkN0cisrOworCXdoaWxlICh0eXBlb2YgbnNvW3JldF0gIT0gInVuZGVmaW5lZCIpIHsKKwkJcmV0ID0gIl9fIiArIGRvam8ubGFuZy5hbm9uQ3RyKys7CisJfQorCW5zb1tyZXRdID0gYW5vbkZ1bmNQdHI7CisJcmV0dXJuIHJldDsKK307Citkb2pvLmxhbmcuZm9yd2FyZCA9IGZ1bmN0aW9uIChmdW5jTmFtZSkgeworCXJldHVybiBmdW5jdGlvbiAoKSB7CisJCXJldHVybiB0aGlzW2Z1bmNOYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX07Cit9OworZG9qby5sYW5nLmN1cnJ5ID0gZnVuY3Rpb24gKHRoaXNPYmosIGZ1bmMpIHsKKwl2YXIgb3V0ZXJBcmdzID0gW107CisJdGhpc09iaiA9IHRoaXNPYmogfHwgZGpfZ2xvYmFsOworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoZnVuYykpIHsKKwkJZnVuYyA9IHRoaXNPYmpbZnVuY107CisJfQorCWZvciAodmFyIHggPSAyOyB4IDwgYXJndW1lbnRzLmxlbmd0aDsgeCsrKSB7CisJCW91dGVyQXJncy5wdXNoKGFyZ3VtZW50c1t4XSk7CisJfQorCXZhciBlY291bnQgPSAoZnVuY1siX19wcmVKb2luQXJpdHkiXSB8fCBmdW5jLmxlbmd0aCkgLSBvdXRlckFyZ3MubGVuZ3RoOworCWZ1bmN0aW9uIGdhdGhlcihuZXh0QXJncywgaW5uZXJBcmdzLCBleHBlY3RlZCkgeworCQl2YXIgdGV4cGVjdGVkID0gZXhwZWN0ZWQ7CisJCXZhciB0b3RhbEFyZ3MgPSBpbm5lckFyZ3Muc2xpY2UoMCk7CisJCWZvciAodmFyIHggPSAwOyB4IDwgbmV4dEFyZ3MubGVuZ3RoOyB4KyspIHsKKwkJCXRvdGFsQXJncy5wdXNoKG5leHRBcmdzW3hdKTsKKwkJfQorCQlleHBlY3RlZCA9IGV4cGVjdGVkIC0gbmV4dEFyZ3MubGVuZ3RoOworCQlpZiAoZXhwZWN0ZWQgPD0gMCkgeworCQkJdmFyIHJlcyA9IGZ1bmMuYXBwbHkodGhpc09iaiwgdG90YWxBcmdzKTsKKwkJCWV4cGVjdGVkID0gdGV4cGVjdGVkOworCQkJcmV0dXJuIHJlczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmdW5jdGlvbiAoKSB7CisJCQkJcmV0dXJuIGdhdGhlcihhcmd1bWVudHMsIHRvdGFsQXJncywgZXhwZWN0ZWQpOworCQkJfTsKKwkJfQorCX0KKwlyZXR1cm4gZ2F0aGVyKFtdLCBvdXRlckFyZ3MsIGVjb3VudCk7Cit9OworZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzID0gZnVuY3Rpb24gKHRoaXNPYmosIGZ1bmMsIGFyZ3MsIG9mZnNldCkgeworCXZhciB0YXJncyA9IFtdOworCXZhciB4ID0gb2Zmc2V0IHx8IDA7CisJZm9yICh4ID0gb2Zmc2V0OyB4IDwgYXJncy5sZW5ndGg7IHgrKykgeworCQl0YXJncy5wdXNoKGFyZ3NbeF0pOworCX0KKwlyZXR1cm4gZG9qby5sYW5nLmN1cnJ5LmFwcGx5KGRvam8ubGFuZywgW3RoaXNPYmosIGZ1bmNdLmNvbmNhdCh0YXJncykpOworfTsKK2Rvam8ubGFuZy50cnlUaGVzZSA9IGZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGFyZ3VtZW50cy5sZW5ndGg7IHgrKykgeworCQl0cnkgeworCQkJaWYgKHR5cGVvZiBhcmd1bWVudHNbeF0gPT0gImZ1bmN0aW9uIikgeworCQkJCXZhciByZXQgPSAoYXJndW1lbnRzW3hdKCkpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCWRvam8uZGVidWcoZSk7CisJCX0KKwl9Cit9OworZG9qby5sYW5nLmRlbGF5VGhlc2UgPSBmdW5jdGlvbiAoZmFyciwgY2IsIGRlbGF5LCBvbmVuZCkgeworCWlmICghZmFyci5sZW5ndGgpIHsKKwkJaWYgKHR5cGVvZiBvbmVuZCA9PSAiZnVuY3Rpb24iKSB7CisJCQlvbmVuZCgpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKCh0eXBlb2YgZGVsYXkgPT0gInVuZGVmaW5lZCIpICYmICh0eXBlb2YgY2IgPT0gIm51bWJlciIpKSB7CisJCWRlbGF5ID0gY2I7CisJCWNiID0gZnVuY3Rpb24gKCkgeworCQl9OworCX0gZWxzZSB7CisJCWlmICghY2IpIHsKKwkJCWNiID0gZnVuY3Rpb24gKCkgeworCQkJfTsKKwkJCWlmICghZGVsYXkpIHsKKwkJCQlkZWxheSA9IDA7CisJCQl9CisJCX0KKwl9CisJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisJCShmYXJyLnNoaWZ0KCkpKCk7CisJCWNiKCk7CisJCWRvam8ubGFuZy5kZWxheVRoZXNlKGZhcnIsIGNiLCBkZWxheSwgb25lbmQpOworCX0sIGRlbGF5KTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL3JlcHIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9yZXByLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTZmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy9yZXByLmpzCkBAIC0wLDAgKzEsNjggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5yZXByIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5BZGFwdGVyUmVnaXN0cnkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuZXh0cmFzIik7Citkb2pvLmxhbmcucmVwclJlZ2lzdHJ5ID0gbmV3IGRvam8uQWRhcHRlclJlZ2lzdHJ5KCk7Citkb2pvLmxhbmcucmVnaXN0ZXJSZXByID0gZnVuY3Rpb24gKG5hbWUsIGNoZWNrLCB3cmFwLCBvdmVycmlkZSkgeworCWRvam8ubGFuZy5yZXByUmVnaXN0cnkucmVnaXN0ZXIobmFtZSwgY2hlY2ssIHdyYXAsIG92ZXJyaWRlKTsKK307Citkb2pvLmxhbmcucmVwciA9IGZ1bmN0aW9uIChvYmopIHsKKwlpZiAodHlwZW9mIChvYmopID09ICJ1bmRlZmluZWQiKSB7CisJCXJldHVybiAidW5kZWZpbmVkIjsKKwl9IGVsc2UgeworCQlpZiAob2JqID09PSBudWxsKSB7CisJCQlyZXR1cm4gIm51bGwiOworCQl9CisJfQorCXRyeSB7CisJCWlmICh0eXBlb2YgKG9ialsiX19yZXByX18iXSkgPT0gImZ1bmN0aW9uIikgeworCQkJcmV0dXJuIG9ialsiX19yZXByX18iXSgpOworCQl9IGVsc2UgeworCQkJaWYgKCh0eXBlb2YgKG9ialsicmVwciJdKSA9PSAiZnVuY3Rpb24iKSAmJiAob2JqLnJlcHIgIT0gYXJndW1lbnRzLmNhbGxlZSkpIHsKKwkJCQlyZXR1cm4gb2JqWyJyZXByIl0oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZG9qby5sYW5nLnJlcHJSZWdpc3RyeS5tYXRjaChvYmopOworCX0KKwljYXRjaCAoZSkgeworCQlpZiAodHlwZW9mIChvYmouTkFNRSkgPT0gInN0cmluZyIgJiYgKG9iai50b1N0cmluZyA9PSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgfHwgb2JqLnRvU3RyaW5nID09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpKSB7CisJCQlyZXR1cm4gb2JqLk5BTUU7CisJCX0KKwl9CisJaWYgKHR5cGVvZiAob2JqKSA9PSAiZnVuY3Rpb24iKSB7CisJCW9iaiA9IChvYmogKyAiIikucmVwbGFjZSgvXlxzKy8sICIiKTsKKwkJdmFyIGlkeCA9IG9iai5pbmRleE9mKCJ7Iik7CisJCWlmIChpZHggIT0gLTEpIHsKKwkJCW9iaiA9IG9iai5zdWJzdHIoMCwgaWR4KSArICJ7Li4ufSI7CisJCX0KKwl9CisJcmV0dXJuIG9iaiArICIiOworfTsKK2Rvam8ubGFuZy5yZXByQXJyYXlMaWtlID0gZnVuY3Rpb24gKGFycikgeworCXRyeSB7CisJCXZhciBuYSA9IGRvam8ubGFuZy5tYXAoYXJyLCBkb2pvLmxhbmcucmVwcik7CisJCXJldHVybiAiWyIgKyBuYS5qb2luKCIsICIpICsgIl0iOworCX0KKwljYXRjaCAoZSkgeworCX0KK307CisoZnVuY3Rpb24gKCkgeworCXZhciBtID0gZG9qby5sYW5nOworCW0ucmVnaXN0ZXJSZXByKCJhcnJheUxpa2UiLCBtLmlzQXJyYXlMaWtlLCBtLnJlcHJBcnJheUxpa2UpOworCW0ucmVnaXN0ZXJSZXByKCJzdHJpbmciLCBtLmlzU3RyaW5nLCBtLnJlcHJTdHJpbmcpOworCW0ucmVnaXN0ZXJSZXByKCJudW1iZXJzIiwgbS5pc051bWJlciwgbS5yZXByTnVtYmVyKTsKKwltLnJlZ2lzdGVyUmVwcigiYm9vbGVhbiIsIG0uaXNCb29sZWFuLCBtLnJlcHJOdW1iZXIpOworfSkoKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdGltaW5nL1N0cmVhbWVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdGltaW5nL1N0cmVhbWVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTkzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy90aW1pbmcvU3RyZWFtZXIuanMKQEAgLTAsMCArMSw2NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnRpbWluZy5TdHJlYW1lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcudGltaW5nLlRpbWVyIik7Citkb2pvLmxhbmcudGltaW5nLlN0cmVhbWVyID0gZnVuY3Rpb24gKGlucHV0LCBvdXRwdXQsIGludGVydmFsLCBtaW5pbXVtLCBpbml0aWFsRGF0YSkgeworCXZhciBzZWxmID0gdGhpczsKKwl2YXIgcXVldWUgPSBbXTsKKwl0aGlzLmludGVydmFsID0gaW50ZXJ2YWwgfHwgMTAwMDsKKwl0aGlzLm1pbmltdW1TaXplID0gbWluaW11bSB8fCAxMDsKKwl0aGlzLmlucHV0RnVuY3Rpb24gPSBpbnB1dCB8fCBmdW5jdGlvbiAocSkgeworCX07CisJdGhpcy5vdXRwdXRGdW5jdGlvbiA9IG91dHB1dCB8fCBmdW5jdGlvbiAocG9pbnQpIHsKKwl9OworCXZhciB0aW1lciA9IG5ldyBkb2pvLmxhbmcudGltaW5nLlRpbWVyKHRoaXMuaW50ZXJ2YWwpOworCXZhciB0aWNrID0gZnVuY3Rpb24gKCkgeworCQlzZWxmLm9uVGljayhzZWxmKTsKKwkJaWYgKHF1ZXVlLmxlbmd0aCA8IHNlbGYubWluaW11bVNpemUpIHsKKwkJCXNlbGYuaW5wdXRGdW5jdGlvbihxdWV1ZSk7CisJCX0KKwkJdmFyIG9iaiA9IHF1ZXVlLnNoaWZ0KCk7CisJCXdoaWxlICh0eXBlb2YgKG9iaikgPT0gInVuZGVmaW5lZCIgJiYgcXVldWUubGVuZ3RoID4gMCkgeworCQkJb2JqID0gcXVldWUuc2hpZnQoKTsKKwkJfQorCQlpZiAodHlwZW9mIChvYmopID09ICJ1bmRlZmluZWQiKSB7CisJCQlzZWxmLnN0b3AoKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZWxmLm91dHB1dEZ1bmN0aW9uKG9iaik7CisJfTsKKwl0aGlzLnNldEludGVydmFsID0gZnVuY3Rpb24gKG1zKSB7CisJCXRoaXMuaW50ZXJ2YWwgPSBtczsKKwkJdGltZXIuc2V0SW50ZXJ2YWwobXMpOworCX07CisJdGhpcy5vblRpY2sgPSBmdW5jdGlvbiAob2JqKSB7CisJfTsKKwl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24gKCkgeworCQlpZiAodHlwZW9mICh0aGlzLmlucHV0RnVuY3Rpb24pID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mICh0aGlzLm91dHB1dEZ1bmN0aW9uKSA9PSAiZnVuY3Rpb24iKSB7CisJCQl0aW1lci5zdGFydCgpOworCQkJcmV0dXJuOworCQl9CisJCWRvam8ucmFpc2UoIllvdSBjYW5ub3Qgc3RhcnQgYSBTdHJlYW1lciB3aXRob3V0IGFuIGlucHV0IGFuZCBhbiBvdXRwdXQgZnVuY3Rpb24uIik7CisJfTsKKwl0aGlzLm9uU3RhcnQgPSBmdW5jdGlvbiAoKSB7CisJfTsKKwl0aGlzLnN0b3AgPSBmdW5jdGlvbiAoKSB7CisJCXRpbWVyLnN0b3AoKTsKKwl9OworCXRoaXMub25TdG9wID0gZnVuY3Rpb24gKCkgeworCX07CisJdGltZXIub25UaWNrID0gdGhpcy50aWNrOworCXRpbWVyLm9uU3RhcnQgPSB0aGlzLm9uU3RhcnQ7CisJdGltZXIub25TdG9wID0gdGhpcy5vblN0b3A7CisJaWYgKGluaXRpYWxEYXRhKSB7CisJCXF1ZXVlLmNvbmNhdChpbml0aWFsRGF0YSk7CisJfQorfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdGltaW5nL1RpbWVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdGltaW5nL1RpbWVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzQ0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy90aW1pbmcvVGltZXIuanMKQEAgLTAsMCArMSw0NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnRpbWluZy5UaW1lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5sYW5nLnRpbWluZy5UaW1lciA9IGZ1bmN0aW9uIChpbnRlcnZhbCkgeworCXRoaXMudGltZXIgPSBudWxsOworCXRoaXMuaXNSdW5uaW5nID0gZmFsc2U7CisJdGhpcy5pbnRlcnZhbCA9IGludGVydmFsOworCXRoaXMub25TdGFydCA9IG51bGw7CisJdGhpcy5vblN0b3AgPSBudWxsOworfTsKK2Rvam8uZXh0ZW5kKGRvam8ubGFuZy50aW1pbmcuVGltZXIsIHtvblRpY2s6ZnVuY3Rpb24gKCkgeworfSwgc2V0SW50ZXJ2YWw6ZnVuY3Rpb24gKGludGVydmFsKSB7CisJaWYgKHRoaXMuaXNSdW5uaW5nKSB7CisJCWRqX2dsb2JhbC5jbGVhckludGVydmFsKHRoaXMudGltZXIpOworCX0KKwl0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisJaWYgKHRoaXMuaXNSdW5uaW5nKSB7CisJCXRoaXMudGltZXIgPSBkal9nbG9iYWwuc2V0SW50ZXJ2YWwoZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvblRpY2siKSwgdGhpcy5pbnRlcnZhbCk7CisJfQorfSwgc3RhcnQ6ZnVuY3Rpb24gKCkgeworCWlmICh0eXBlb2YgdGhpcy5vblN0YXJ0ID09ICJmdW5jdGlvbiIpIHsKKwkJdGhpcy5vblN0YXJ0KCk7CisJfQorCXRoaXMuaXNSdW5uaW5nID0gdHJ1ZTsKKwl0aGlzLnRpbWVyID0gZGpfZ2xvYmFsLnNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25UaWNrIiksIHRoaXMuaW50ZXJ2YWwpOworfSwgc3RvcDpmdW5jdGlvbiAoKSB7CisJaWYgKHR5cGVvZiB0aGlzLm9uU3RvcCA9PSAiZnVuY3Rpb24iKSB7CisJCXRoaXMub25TdG9wKCk7CisJfQorCXRoaXMuaXNSdW5uaW5nID0gZmFsc2U7CisJZGpfZ2xvYmFsLmNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL3RpbWluZy9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sYW5nL3RpbWluZy9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQzNjkzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdGltaW5nL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy50aW1pbmcuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGFuZy90eXBlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdHlwZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JhYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xhbmcvdHlwZS5qcwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnR5cGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5sYW5nLndoYXRBbUkgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8ubGFuZy53aGF0QW1JIiwgInVzZSBkb2pvLmxhbmcuZ2V0VHlwZSBpbnN0ZWFkIiwgIjAuNSIpOworCXJldHVybiBkb2pvLmxhbmcuZ2V0VHlwZSh2YWx1ZSk7Cit9OworZG9qby5sYW5nLndoYXRBbUkuY3VzdG9tID0ge307Citkb2pvLmxhbmcuZ2V0VHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCXRyeSB7CisJCWlmIChkb2pvLmxhbmcuaXNBcnJheSh2YWx1ZSkpIHsKKwkJCXJldHVybiAiYXJyYXkiOworCQl9CisJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih2YWx1ZSkpIHsKKwkJCXJldHVybiAiZnVuY3Rpb24iOworCQl9CisJCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodmFsdWUpKSB7CisJCQlyZXR1cm4gInN0cmluZyI7CisJCX0KKwkJaWYgKGRvam8ubGFuZy5pc051bWJlcih2YWx1ZSkpIHsKKwkJCXJldHVybiAibnVtYmVyIjsKKwkJfQorCQlpZiAoZG9qby5sYW5nLmlzQm9vbGVhbih2YWx1ZSkpIHsKKwkJCXJldHVybiAiYm9vbGVhbiI7CisJCX0KKwkJaWYgKGRvam8ubGFuZy5pc0FsaWVuKHZhbHVlKSkgeworCQkJcmV0dXJuICJhbGllbiI7CisJCX0KKwkJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKKwkJCXJldHVybiAidW5kZWZpbmVkIjsKKwkJfQorCQlmb3IgKHZhciBuYW1lIGluIGRvam8ubGFuZy53aGF0QW1JLmN1c3RvbSkgeworCQkJaWYgKGRvam8ubGFuZy53aGF0QW1JLmN1c3RvbVtuYW1lXSh2YWx1ZSkpIHsKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJfQorCQlpZiAoZG9qby5sYW5nLmlzT2JqZWN0KHZhbHVlKSkgeworCQkJcmV0dXJuICJvYmplY3QiOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9OworZG9qby5sYW5nLmlzTnVtZXJpYyA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCXJldHVybiAoIWlzTmFOKHZhbHVlKSAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgKHZhbHVlICE9IG51bGwpICYmICFkb2pvLmxhbmcuaXNCb29sZWFuKHZhbHVlKSAmJiAhZG9qby5sYW5nLmlzQXJyYXkodmFsdWUpICYmICEvXlxzKiQvLnRlc3QodmFsdWUpKTsKK307Citkb2pvLmxhbmcuaXNCdWlsdEluID0gZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIChkb2pvLmxhbmcuaXNBcnJheSh2YWx1ZSkgfHwgZG9qby5sYW5nLmlzRnVuY3Rpb24odmFsdWUpIHx8IGRvam8ubGFuZy5pc1N0cmluZyh2YWx1ZSkgfHwgZG9qby5sYW5nLmlzTnVtYmVyKHZhbHVlKSB8fCBkb2pvLmxhbmcuaXNCb29sZWFuKHZhbHVlKSB8fCAodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHx8ICh0eXBlb2YgdmFsdWUgPT0gImVycm9yIikpOworfTsKK2Rvam8ubGFuZy5pc1B1cmVPYmplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwlyZXR1cm4gKCh2YWx1ZSAhPSBudWxsKSAmJiBkb2pvLmxhbmcuaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLmNvbnN0cnVjdG9yID09IE9iamVjdCk7Cit9OworZG9qby5sYW5nLmlzT2ZUeXBlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlLCBrZXl3b3JkUGFyYW1ldGVycykgeworCXZhciBvcHRpb25hbCA9IGZhbHNlOworCWlmIChrZXl3b3JkUGFyYW1ldGVycykgeworCQlvcHRpb25hbCA9IGtleXdvcmRQYXJhbWV0ZXJzWyJvcHRpb25hbCJdOworCX0KKwlpZiAob3B0aW9uYWwgJiYgKCh2YWx1ZSA9PT0gbnVsbCkgfHwgZG9qby5sYW5nLmlzVW5kZWZpbmVkKHZhbHVlKSkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChkb2pvLmxhbmcuaXNBcnJheSh0eXBlKSkgeworCQl2YXIgYXJyYXlPZlR5cGVzID0gdHlwZTsKKwkJZm9yICh2YXIgaSBpbiBhcnJheU9mVHlwZXMpIHsKKwkJCXZhciBhVHlwZSA9IGFycmF5T2ZUeXBlc1tpXTsKKwkJCWlmIChkb2pvLmxhbmcuaXNPZlR5cGUodmFsdWUsIGFUeXBlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKHR5cGUpKSB7CisJCQl0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworCQl9CisJCXN3aXRjaCAodHlwZSkgeworCQkgIGNhc2UgQXJyYXk6CisJCSAgY2FzZSAiYXJyYXkiOgorCQkJcmV0dXJuIGRvam8ubGFuZy5pc0FycmF5KHZhbHVlKTsKKwkJICBjYXNlIEZ1bmN0aW9uOgorCQkgIGNhc2UgImZ1bmN0aW9uIjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNGdW5jdGlvbih2YWx1ZSk7CisJCSAgY2FzZSBTdHJpbmc6CisJCSAgY2FzZSAic3RyaW5nIjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNTdHJpbmcodmFsdWUpOworCQkgIGNhc2UgTnVtYmVyOgorCQkgIGNhc2UgIm51bWJlciI6CisJCQlyZXR1cm4gZG9qby5sYW5nLmlzTnVtYmVyKHZhbHVlKTsKKwkJICBjYXNlICJudW1lcmljIjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNOdW1lcmljKHZhbHVlKTsKKwkJICBjYXNlIEJvb2xlYW46CisJCSAgY2FzZSAiYm9vbGVhbiI6CisJCQlyZXR1cm4gZG9qby5sYW5nLmlzQm9vbGVhbih2YWx1ZSk7CisJCSAgY2FzZSBPYmplY3Q6CisJCSAgY2FzZSAib2JqZWN0IjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNPYmplY3QodmFsdWUpOworCQkgIGNhc2UgInB1cmVvYmplY3QiOgorCQkJcmV0dXJuIGRvam8ubGFuZy5pc1B1cmVPYmplY3QodmFsdWUpOworCQkgIGNhc2UgImJ1aWx0aW4iOgorCQkJcmV0dXJuIGRvam8ubGFuZy5pc0J1aWx0SW4odmFsdWUpOworCQkgIGNhc2UgImFsaWVuIjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNBbGllbih2YWx1ZSk7CisJCSAgY2FzZSAidW5kZWZpbmVkIjoKKwkJCXJldHVybiBkb2pvLmxhbmcuaXNVbmRlZmluZWQodmFsdWUpOworCQkgIGNhc2UgbnVsbDoKKwkJICBjYXNlICJudWxsIjoKKwkJCXJldHVybiAodmFsdWUgPT09IG51bGwpOworCQkgIGNhc2UgIm9wdGlvbmFsIjoKKwkJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLmlzT2ZUeXBlKHZhbHVlLCBbdHlwZSwgXCJvcHRpb25hbFwiXSkiLCAidXNlIGRvam8ubGFuZy5pc09mVHlwZSh2YWx1ZSwgdHlwZSwge29wdGlvbmFsOiB0cnVlfSApIGluc3RlYWQiLCAiMC41Iik7CisJCQlyZXR1cm4gKCh2YWx1ZSA9PT0gbnVsbCkgfHwgZG9qby5sYW5nLmlzVW5kZWZpbmVkKHZhbHVlKSk7CisJCSAgZGVmYXVsdDoKKwkJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih0eXBlKSkgeworCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiB0eXBlKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9qby5yYWlzZSgiZG9qby5sYW5nLmlzT2ZUeXBlKCkgd2FzIHBhc3NlZCBhbiBpbnZhbGlkIHR5cGUiKTsKKwkJCX0KKwkJfQorCX0KKwlkb2pvLnJhaXNlKCJJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgYSBidWcgd2FzIGludHJvZHVjZWQgYWJvdmUuIik7Cit9OworZG9qby5sYW5nLmdldE9iamVjdCA9IGZ1bmN0aW9uIChzdHIpIHsKKwl2YXIgcGFydHMgPSBzdHIuc3BsaXQoIi4iKSwgaSA9IDAsIG9iaiA9IGRqX2dsb2JhbDsKKwlkbyB7CisJCW9iaiA9IG9ialtwYXJ0c1tpKytdXTsKKwl9IHdoaWxlIChpIDwgcGFydHMubGVuZ3RoICYmIG9iaik7CisJcmV0dXJuIChvYmogIT0gZGpfZ2xvYmFsKSA/IG9iaiA6IG51bGw7Cit9OworZG9qby5sYW5nLmRvZXNPYmplY3RFeGlzdCA9IGZ1bmN0aW9uIChzdHIpIHsKKwl2YXIgcGFydHMgPSBzdHIuc3BsaXQoIi4iKSwgaSA9IDAsIG9iaiA9IGRqX2dsb2JhbDsKKwlkbyB7CisJCW9iaiA9IG9ialtwYXJ0c1tpKytdXTsKKwl9IHdoaWxlIChpIDwgcGFydHMubGVuZ3RoICYmIG9iaik7CisJcmV0dXJuIChvYmogJiYgb2JqICE9IGRqX2dsb2JhbCk7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGZ4L0FuaW1hdGlvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvQW5pbWF0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGZ4L0FuaW1hdGlvbi5qcwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguQW5pbWF0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLmxmeC5MaW5lID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHsKKwl0aGlzLnN0YXJ0ID0gc3RhcnQ7CisJdGhpcy5lbmQgPSBlbmQ7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KHN0YXJ0KSkgeworCQl2YXIgZGlmZiA9IFtdOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnN0YXJ0LCBmdW5jdGlvbiAocywgaSkgeworCQkJZGlmZltpXSA9IHRoaXMuZW5kW2ldIC0gczsKKwkJfSwgdGhpcyk7CisJCXRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAobikgeworCQkJdmFyIHJlcyA9IFtdOworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5zdGFydCwgZnVuY3Rpb24gKHMsIGkpIHsKKwkJCQlyZXNbaV0gPSAoZGlmZltpXSAqIG4pICsgczsKKwkJCX0sIHRoaXMpOworCQkJcmV0dXJuIHJlczsKKwkJfTsKKwl9IGVsc2UgeworCQl2YXIgZGlmZiA9IGVuZCAtIHN0YXJ0OworCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24gKG4pIHsKKwkJCXJldHVybiAoZGlmZiAqIG4pICsgdGhpcy5zdGFydDsKKwkJfTsKKwl9Cit9OworaWYgKChkb2pvLnJlbmRlci5odG1sLmtodG1sKSAmJiAoIWRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSkgeworCWRvam8ubGZ4LmVhc2VEZWZhdWx0ID0gZnVuY3Rpb24gKG4pIHsKKwkJcmV0dXJuIChwYXJzZUZsb2F0KCIwLjUiKSArICgoTWF0aC5zaW4oKG4gKyBwYXJzZUZsb2F0KCIxLjUiKSkgKiBNYXRoLlBJKSkgLyAyKSk7CisJfTsKK30gZWxzZSB7CisJZG9qby5sZnguZWFzZURlZmF1bHQgPSBmdW5jdGlvbiAobikgeworCQlyZXR1cm4gKDAuNSArICgoTWF0aC5zaW4oKG4gKyAxLjUpICogTWF0aC5QSSkpIC8gMikpOworCX07Cit9Citkb2pvLmxmeC5lYXNlSW4gPSBmdW5jdGlvbiAobikgeworCXJldHVybiBNYXRoLnBvdyhuLCAzKTsKK307Citkb2pvLmxmeC5lYXNlT3V0ID0gZnVuY3Rpb24gKG4pIHsKKwlyZXR1cm4gKDEgLSBNYXRoLnBvdygxIC0gbiwgMykpOworfTsKK2Rvam8ubGZ4LmVhc2VJbk91dCA9IGZ1bmN0aW9uIChuKSB7CisJcmV0dXJuICgoMyAqIE1hdGgucG93KG4sIDIpKSAtICgyICogTWF0aC5wb3cobiwgMykpKTsKK307Citkb2pvLmxmeC5JQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkgeworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguSUFuaW1hdGlvbiwge2N1cnZlOm51bGwsIGR1cmF0aW9uOjEwMDAsIGVhc2luZzpudWxsLCByZXBlYXRDb3VudDowLCByYXRlOjEwLCBoYW5kbGVyOm51bGwsIGJlZm9yZUJlZ2luOm51bGwsIG9uQmVnaW46bnVsbCwgb25BbmltYXRlOm51bGwsIG9uRW5kOm51bGwsIG9uUGxheTpudWxsLCBvblBhdXNlOm51bGwsIG9uU3RvcDpudWxsLCBwbGF5Om51bGwsIHBhdXNlOm51bGwsIHN0b3A6bnVsbCwgY29ubmVjdDpmdW5jdGlvbiAoZXZ0LCBzY29wZSwgbmV3RnVuYykgeworCWlmICghbmV3RnVuYykgeworCQluZXdGdW5jID0gc2NvcGU7CisJCXNjb3BlID0gdGhpczsKKwl9CisJbmV3RnVuYyA9IGRvam8ubGFuZy5oaXRjaChzY29wZSwgbmV3RnVuYyk7CisJdmFyIG9sZEZ1bmMgPSB0aGlzW2V2dF0gfHwgZnVuY3Rpb24gKCkgeworCX07CisJdGhpc1tldnRdID0gZnVuY3Rpb24gKCkgeworCQl2YXIgcmV0ID0gb2xkRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQluZXdGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCXJldHVybiByZXQ7CisJfTsKKwlyZXR1cm4gdGhpczsKK30sIGZpcmU6ZnVuY3Rpb24gKGV2dCwgYXJncykgeworCWlmICh0aGlzW2V2dF0pIHsKKwkJdGhpc1tldnRdLmFwcGx5KHRoaXMsIChhcmdzIHx8IFtdKSk7CisJfQorCXJldHVybiB0aGlzOworfSwgcmVwZWF0OmZ1bmN0aW9uIChjb3VudCkgeworCXRoaXMucmVwZWF0Q291bnQgPSBjb3VudDsKKwlyZXR1cm4gdGhpczsKK30sIF9hY3RpdmU6ZmFsc2UsIF9wYXVzZWQ6ZmFsc2V9KTsKK2Rvam8ubGZ4LkFuaW1hdGlvbiA9IGZ1bmN0aW9uIChoYW5kbGVycywgZHVyYXRpb24sIGN1cnZlLCBlYXNpbmcsIHJlcGVhdENvdW50LCByYXRlKSB7CisJZG9qby5sZnguSUFuaW1hdGlvbi5jYWxsKHRoaXMpOworCWlmIChkb2pvLmxhbmcuaXNOdW1iZXIoaGFuZGxlcnMpIHx8ICghaGFuZGxlcnMgJiYgZHVyYXRpb24uZ2V0VmFsdWUpKSB7CisJCXJhdGUgPSByZXBlYXRDb3VudDsKKwkJcmVwZWF0Q291bnQgPSBlYXNpbmc7CisJCWVhc2luZyA9IGN1cnZlOworCQljdXJ2ZSA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IGhhbmRsZXJzOworCQloYW5kbGVycyA9IG51bGw7CisJfSBlbHNlIHsKKwkJaWYgKGhhbmRsZXJzLmdldFZhbHVlIHx8IGRvam8ubGFuZy5pc0FycmF5KGhhbmRsZXJzKSkgeworCQkJcmF0ZSA9IGVhc2luZzsKKwkJCXJlcGVhdENvdW50ID0gY3VydmU7CisJCQllYXNpbmcgPSBkdXJhdGlvbjsKKwkJCWN1cnZlID0gaGFuZGxlcnM7CisJCQlkdXJhdGlvbiA9IG51bGw7CisJCQloYW5kbGVycyA9IG51bGw7CisJCX0KKwl9CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KGN1cnZlKSkgeworCQl0aGlzLmN1cnZlID0gbmV3IGRvam8ubGZ4LkxpbmUoY3VydmVbMF0sIGN1cnZlWzFdKTsKKwl9IGVsc2UgeworCQl0aGlzLmN1cnZlID0gY3VydmU7CisJfQorCWlmIChkdXJhdGlvbiAhPSBudWxsICYmIGR1cmF0aW9uID4gMCkgeworCQl0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247CisJfQorCWlmIChyZXBlYXRDb3VudCkgeworCQl0aGlzLnJlcGVhdENvdW50ID0gcmVwZWF0Q291bnQ7CisJfQorCWlmIChyYXRlKSB7CisJCXRoaXMucmF0ZSA9IHJhdGU7CisJfQorCWlmIChoYW5kbGVycykgeworCQlkb2pvLmxhbmcuZm9yRWFjaChbImhhbmRsZXIiLCAiYmVmb3JlQmVnaW4iLCAib25CZWdpbiIsICJvbkVuZCIsICJvblBsYXkiLCAib25TdG9wIiwgIm9uQW5pbWF0ZSJdLCBmdW5jdGlvbiAoaXRlbSkgeworCQkJaWYgKGhhbmRsZXJzW2l0ZW1dKSB7CisJCQkJdGhpcy5jb25uZWN0KGl0ZW0sIGhhbmRsZXJzW2l0ZW1dKTsKKwkJCX0KKwkJfSwgdGhpcyk7CisJfQorCWlmIChlYXNpbmcgJiYgZG9qby5sYW5nLmlzRnVuY3Rpb24oZWFzaW5nKSkgeworCQl0aGlzLmVhc2luZyA9IGVhc2luZzsKKwl9Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmxmeC5BbmltYXRpb24sIGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5BbmltYXRpb24sIHtfc3RhcnRUaW1lOm51bGwsIF9lbmRUaW1lOm51bGwsIF90aW1lcjpudWxsLCBfcGVyY2VudDowLCBfc3RhcnRSZXBlYXRDb3VudDowLCBwbGF5OmZ1bmN0aW9uIChkZWxheSwgZ290b1N0YXJ0KSB7CisJaWYgKGdvdG9TdGFydCkgeworCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwkJdGhpcy5fcGF1c2VkID0gZmFsc2U7CisJCXRoaXMuX3BlcmNlbnQgPSAwOworCX0gZWxzZSB7CisJCWlmICh0aGlzLl9hY3RpdmUgJiYgIXRoaXMuX3BhdXNlZCkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwl9CisJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJiZWZvcmVCZWdpbiJdKTsKKwl0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CisJaWYgKGRlbGF5ID4gMCkgeworCQlzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoKSB7CisJCQl0aGlzLnBsYXkobnVsbCwgZ290b1N0YXJ0KTsKKwkJfSksIGRlbGF5KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXRoaXMuX3N0YXJ0VGltZSA9IG5ldyBEYXRlKCkudmFsdWVPZigpOworCWlmICh0aGlzLl9wYXVzZWQpIHsKKwkJdGhpcy5fc3RhcnRUaW1lIC09ICh0aGlzLmR1cmF0aW9uICogdGhpcy5fcGVyY2VudCAvIDEwMCk7CisJfQorCXRoaXMuX2VuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLmR1cmF0aW9uOworCXRoaXMuX2FjdGl2ZSA9IHRydWU7CisJdGhpcy5fcGF1c2VkID0gZmFsc2U7CisJdmFyIHN0ZXAgPSB0aGlzLl9wZXJjZW50IC8gMTAwOworCXZhciB2YWx1ZSA9IHRoaXMuY3VydmUuZ2V0VmFsdWUoc3RlcCk7CisJaWYgKHRoaXMuX3BlcmNlbnQgPT0gMCkgeworCQlpZiAoIXRoaXMuX3N0YXJ0UmVwZWF0Q291bnQpIHsKKwkJCXRoaXMuX3N0YXJ0UmVwZWF0Q291bnQgPSB0aGlzLnJlcGVhdENvdW50OworCQl9CisJCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsiYmVnaW4iLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uQmVnaW4iLCBbdmFsdWVdKTsKKwl9CisJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJwbGF5IiwgdmFsdWVdKTsKKwl0aGlzLmZpcmUoIm9uUGxheSIsIFt2YWx1ZV0pOworCXRoaXMuX2N5Y2xlKCk7CisJcmV0dXJuIHRoaXM7Cit9LCBwYXVzZTpmdW5jdGlvbiAoKSB7CisJY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKKwlpZiAoIXRoaXMuX2FjdGl2ZSkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJdGhpcy5fcGF1c2VkID0gdHJ1ZTsKKwl2YXIgdmFsdWUgPSB0aGlzLmN1cnZlLmdldFZhbHVlKHRoaXMuX3BlcmNlbnQgLyAxMDApOworCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsicGF1c2UiLCB2YWx1ZV0pOworCXRoaXMuZmlyZSgib25QYXVzZSIsIFt2YWx1ZV0pOworCXJldHVybiB0aGlzOworfSwgZ290b1BlcmNlbnQ6ZnVuY3Rpb24gKHBjdCwgYW5kUGxheSkgeworCWNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CisJdGhpcy5fYWN0aXZlID0gdHJ1ZTsKKwl0aGlzLl9wYXVzZWQgPSB0cnVlOworCXRoaXMuX3BlcmNlbnQgPSBwY3Q7CisJaWYgKGFuZFBsYXkpIHsKKwkJdGhpcy5wbGF5KCk7CisJfQorCXJldHVybiB0aGlzOworfSwgc3RvcDpmdW5jdGlvbiAoZ290b0VuZCkgeworCWNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CisJdmFyIHN0ZXAgPSB0aGlzLl9wZXJjZW50IC8gMTAwOworCWlmIChnb3RvRW5kKSB7CisJCXN0ZXAgPSAxOworCX0KKwl2YXIgdmFsdWUgPSB0aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOworCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsic3RvcCIsIHZhbHVlXSk7CisJdGhpcy5maXJlKCJvblN0b3AiLCBbdmFsdWVdKTsKKwl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwl0aGlzLl9wYXVzZWQgPSBmYWxzZTsKKwlyZXR1cm4gdGhpczsKK30sIHN0YXR1czpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FjdGl2ZSkgeworCQlyZXR1cm4gdGhpcy5fcGF1c2VkID8gInBhdXNlZCIgOiAicGxheWluZyI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJzdG9wcGVkIjsKKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBfY3ljbGU6ZnVuY3Rpb24gKCkgeworCWNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CisJaWYgKHRoaXMuX2FjdGl2ZSkgeworCQl2YXIgY3VyciA9IG5ldyBEYXRlKCkudmFsdWVPZigpOworCQl2YXIgc3RlcCA9IChjdXJyIC0gdGhpcy5fc3RhcnRUaW1lKSAvICh0aGlzLl9lbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lKTsKKwkJaWYgKHN0ZXAgPj0gMSkgeworCQkJc3RlcCA9IDE7CisJCQl0aGlzLl9wZXJjZW50ID0gMTAwOworCQl9IGVsc2UgeworCQkJdGhpcy5fcGVyY2VudCA9IHN0ZXAgKiAxMDA7CisJCX0KKwkJaWYgKCh0aGlzLmVhc2luZykgJiYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuZWFzaW5nKSkpIHsKKwkJCXN0ZXAgPSB0aGlzLmVhc2luZyhzdGVwKTsKKwkJfQorCQl2YXIgdmFsdWUgPSB0aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOworCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImFuaW1hdGUiLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uQW5pbWF0ZSIsIFt2YWx1ZV0pOworCQlpZiAoc3RlcCA8IDEpIHsKKwkJCXRoaXMuX3RpbWVyID0gc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgIl9jeWNsZSIpLCB0aGlzLnJhdGUpOworCQl9IGVsc2UgeworCQkJdGhpcy5fYWN0aXZlID0gZmFsc2U7CisJCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImVuZCJdKTsKKwkJCXRoaXMuZmlyZSgib25FbmQiKTsKKwkJCWlmICh0aGlzLnJlcGVhdENvdW50ID4gMCkgeworCQkJCXRoaXMucmVwZWF0Q291bnQtLTsKKwkJCQl0aGlzLnBsYXkobnVsbCwgdHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLnJlcGVhdENvdW50ID09IC0xKSB7CisJCQkJCXRoaXMucGxheShudWxsLCB0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodGhpcy5fc3RhcnRSZXBlYXRDb3VudCkgeworCQkJCQkJdGhpcy5yZXBlYXRDb3VudCA9IHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQ7CisJCQkJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdGhpczsKK319KTsKK2Rvam8ubGZ4LkNvbWJpbmUgPSBmdW5jdGlvbiAoYW5pbWF0aW9ucykgeworCWRvam8ubGZ4LklBbmltYXRpb24uY2FsbCh0aGlzKTsKKwl0aGlzLl9hbmltcyA9IFtdOworCXRoaXMuX2FuaW1zRW5kZWQgPSAwOworCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZiAoYW5pbXMubGVuZ3RoID09IDEgJiYgKGRvam8ubGFuZy5pc0FycmF5KGFuaW1zWzBdKSB8fCBkb2pvLmxhbmcuaXNBcnJheUxpa2UoYW5pbXNbMF0pKSkgeworCQlhbmltcyA9IGFuaW1zWzBdOworCX0KKwlkb2pvLmxhbmcuZm9yRWFjaChhbmltcywgZnVuY3Rpb24gKGFuaW0pIHsKKwkJdGhpcy5fYW5pbXMucHVzaChhbmltKTsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX29uQW5pbXNFbmRlZCIpKTsKKwl9LCB0aGlzKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8ubGZ4LkNvbWJpbmUsIGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5Db21iaW5lLCB7X2FuaW1zRW5kZWQ6MCwgcGxheTpmdW5jdGlvbiAoZGVsYXksIGdvdG9TdGFydCkgeworCWlmICghdGhpcy5fYW5pbXMubGVuZ3RoKSB7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CisJaWYgKGRlbGF5ID4gMCkgeworCQlzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoKSB7CisJCQl0aGlzLnBsYXkobnVsbCwgZ290b1N0YXJ0KTsKKwkJfSksIGRlbGF5KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCWlmIChnb3RvU3RhcnQgfHwgdGhpcy5fYW5pbXNbMF0ucGVyY2VudCA9PSAwKSB7CisJCXRoaXMuZmlyZSgib25CZWdpbiIpOworCX0KKwl0aGlzLmZpcmUoIm9uUGxheSIpOworCXRoaXMuX2FuaW1zQ2FsbCgicGxheSIsIG51bGwsIGdvdG9TdGFydCk7CisJcmV0dXJuIHRoaXM7Cit9LCBwYXVzZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5maXJlKCJvblBhdXNlIik7CisJdGhpcy5fYW5pbXNDYWxsKCJwYXVzZSIpOworCXJldHVybiB0aGlzOworfSwgc3RvcDpmdW5jdGlvbiAoZ290b0VuZCkgeworCXRoaXMuZmlyZSgib25TdG9wIik7CisJdGhpcy5fYW5pbXNDYWxsKCJzdG9wIiwgZ290b0VuZCk7CisJcmV0dXJuIHRoaXM7Cit9LCBfb25Bbmltc0VuZGVkOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9hbmltc0VuZGVkKys7CisJaWYgKHRoaXMuX2FuaW1zRW5kZWQgPj0gdGhpcy5fYW5pbXMubGVuZ3RoKSB7CisJCXRoaXMuZmlyZSgib25FbmQiKTsKKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBfYW5pbXNDYWxsOmZ1bmN0aW9uIChmdW5jTmFtZSkgeworCXZhciBhcmdzID0gW107CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCWZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKKwkJfQorCX0KKwl2YXIgX3RoaXMgPSB0aGlzOworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuX2FuaW1zLCBmdW5jdGlvbiAoYW5pbSkgeworCQlhbmltW2Z1bmNOYW1lXShhcmdzKTsKKwl9LCBfdGhpcyk7CisJcmV0dXJuIHRoaXM7Cit9fSk7Citkb2pvLmxmeC5DaGFpbiA9IGZ1bmN0aW9uIChhbmltYXRpb25zKSB7CisJZG9qby5sZnguSUFuaW1hdGlvbi5jYWxsKHRoaXMpOworCXRoaXMuX2FuaW1zID0gW107CisJdGhpcy5fY3VyckFuaW0gPSAtMTsKKwl2YXIgYW5pbXMgPSBhcmd1bWVudHM7CisJaWYgKGFuaW1zLmxlbmd0aCA9PSAxICYmIChkb2pvLmxhbmcuaXNBcnJheShhbmltc1swXSkgfHwgZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFuaW1zWzBdKSkpIHsKKwkJYW5pbXMgPSBhbmltc1swXTsKKwl9CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaChhbmltcywgZnVuY3Rpb24gKGFuaW0sIGksIGFuaW1zX2FycikgeworCQl0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworCQlpZiAoaSA8IGFuaW1zX2Fyci5sZW5ndGggLSAxKSB7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJfcGxheU5leHQiKSk7CisJCX0gZWxzZSB7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJCQl0aGlzLmZpcmUoIm9uRW5kIik7CisJCQl9KSk7CisJCX0KKwl9LCB0aGlzKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8ubGZ4LkNoYWluLCBkb2pvLmxmeC5JQW5pbWF0aW9uKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguQ2hhaW4sIHtfY3VyckFuaW06LTEsIHBsYXk6ZnVuY3Rpb24gKGRlbGF5LCBnb3RvU3RhcnQpIHsKKwlpZiAoIXRoaXMuX2FuaW1zLmxlbmd0aCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJaWYgKGdvdG9TdGFydCB8fCAhdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKSB7CisJCXRoaXMuX2N1cnJBbmltID0gMDsKKwl9CisJdmFyIGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV07CisJdGhpcy5maXJlKCJiZWZvcmVCZWdpbiIpOworCWlmIChkZWxheSA+IDApIHsKKwkJc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQkJdGhpcy5wbGF5KG51bGwsIGdvdG9TdGFydCk7CisJCX0pLCBkZWxheSk7CisJCXJldHVybiB0aGlzOworCX0KKwlpZiAoY3VycmVudEFuaW1hdGlvbikgeworCQlpZiAodGhpcy5fY3VyckFuaW0gPT0gMCkgeworCQkJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJiZWdpbiIsIHRoaXMuX2N1cnJBbmltXSk7CisJCQl0aGlzLmZpcmUoIm9uQmVnaW4iLCBbdGhpcy5fY3VyckFuaW1dKTsKKwkJfQorCQl0aGlzLmZpcmUoIm9uUGxheSIsIFt0aGlzLl9jdXJyQW5pbV0pOworCQljdXJyZW50QW5pbWF0aW9uLnBsYXkobnVsbCwgZ290b1N0YXJ0KTsKKwl9CisJcmV0dXJuIHRoaXM7Cit9LCBwYXVzZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSkgeworCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGF1c2UoKTsKKwkJdGhpcy5maXJlKCJvblBhdXNlIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJfQorCXJldHVybiB0aGlzOworfSwgcGxheVBhdXNlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fYW5pbXMubGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCWlmICh0aGlzLl9jdXJyQW5pbSA9PSAtMSkgeworCQl0aGlzLl9jdXJyQW5pbSA9IDA7CisJfQorCXZhciBjdXJyQW5pbSA9IHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKKwlpZiAoY3VyckFuaW0pIHsKKwkJaWYgKCFjdXJyQW5pbS5fYWN0aXZlIHx8IGN1cnJBbmltLl9wYXVzZWQpIHsKKwkJCXRoaXMucGxheSgpOworCQl9IGVsc2UgeworCQkJdGhpcy5wYXVzZSgpOworCQl9CisJfQorCXJldHVybiB0aGlzOworfSwgc3RvcDpmdW5jdGlvbiAoKSB7CisJdmFyIGN1cnJBbmltID0gdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dOworCWlmIChjdXJyQW5pbSkgeworCQljdXJyQW5pbS5zdG9wKCk7CisJCXRoaXMuZmlyZSgib25TdG9wIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJfQorCXJldHVybiBjdXJyQW5pbTsKK30sIF9wbGF5TmV4dDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2N1cnJBbmltID09IC0xIHx8IHRoaXMuX2FuaW1zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiB0aGlzOworCX0KKwl0aGlzLl9jdXJyQW5pbSsrOworCWlmICh0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0pIHsKKwkJdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dLnBsYXkobnVsbCwgdHJ1ZSk7CisJfQorCXJldHVybiB0aGlzOworfX0pOworZG9qby5sZnguY29tYmluZSA9IGZ1bmN0aW9uIChhbmltYXRpb25zKSB7CisJdmFyIGFuaW1zID0gYXJndW1lbnRzOworCWlmIChkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7CisJCWFuaW1zID0gYXJndW1lbnRzWzBdOworCX0KKwlpZiAoYW5pbXMubGVuZ3RoID09IDEpIHsKKwkJcmV0dXJuIGFuaW1zWzBdOworCX0KKwlyZXR1cm4gbmV3IGRvam8ubGZ4LkNvbWJpbmUoYW5pbXMpOworfTsKK2Rvam8ubGZ4LmNoYWluID0gZnVuY3Rpb24gKGFuaW1hdGlvbnMpIHsKKwl2YXIgYW5pbXMgPSBhcmd1bWVudHM7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHsKKwkJYW5pbXMgPSBhcmd1bWVudHNbMF07CisJfQorCWlmIChhbmltcy5sZW5ndGggPT0gMSkgeworCQlyZXR1cm4gYW5pbXNbMF07CisJfQorCXJldHVybiBuZXcgZG9qby5sZnguQ2hhaW4oYW5pbXMpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMjdkOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2Jyb3dzZXI6WyJkb2pvLmxmeC5odG1sIl0sIGRhc2hib2FyZDpbImRvam8ubGZ4Lmh0bWwiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxmeC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvZXh0cmFzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC9leHRyYXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMzIzZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvZXh0cmFzLmpzCkBAIC0wLDAgKzEsODAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGZ4LmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC5odG1sIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LkFuaW1hdGlvbiIpOworZG9qby5sZnguaHRtbC5mYWRlV2lwZUluID0gZnVuY3Rpb24gKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW0gPSBkb2pvLmxmeC5jb21iaW5lKGRvam8ubGZ4LmZhZGVJbihub2RlcywgZHVyYXRpb24sIGVhc2luZyksIGRvam8ubGZ4LndpcGVJbihub2RlcywgZHVyYXRpb24sIGVhc2luZykpOworCWlmIChjYWxsYmFjaykgeworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24gKCkgeworCQkJY2FsbGJhY2sobm9kZXMsIGFuaW0pOworCQl9KTsKKwl9CisJcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5mYWRlV2lwZU91dCA9IGZ1bmN0aW9uIChub2RlcywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltID0gZG9qby5sZnguY29tYmluZShkb2pvLmxmeC5mYWRlT3V0KG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nKSwgZG9qby5sZngud2lwZU91dChub2RlcywgZHVyYXRpb24sIGVhc2luZykpOworCWlmIChjYWxsYmFjaykgeworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24gKCkgeworCQkJY2FsbGJhY2sobm9kZXMsIGFuaW0pOworCQl9KTsKKwl9CisJcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5zY2FsZSA9IGZ1bmN0aW9uIChub2RlcywgcGVyY2VudGFnZSwgc2NhbGVDb250ZW50LCBmcm9tQ2VudGVyLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciBvdXRlciA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSk7CisJCXZhciBhY3R1YWxQY3QgPSBwZXJjZW50YWdlIC8gMTAwOworCQl2YXIgcHJvcHMgPSBbe3Byb3BlcnR5OiJ3aWR0aCIsIHN0YXJ0Om91dGVyLndpZHRoLCBlbmQ6b3V0ZXIud2lkdGggKiBhY3R1YWxQY3R9LCB7cHJvcGVydHk6ImhlaWdodCIsIHN0YXJ0Om91dGVyLmhlaWdodCwgZW5kOm91dGVyLmhlaWdodCAqIGFjdHVhbFBjdH1dOworCQlpZiAoc2NhbGVDb250ZW50KSB7CisJCQl2YXIgZm9udFNpemUgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImZvbnQtc2l6ZSIpOworCQkJdmFyIGZvbnRTaXplVHlwZSA9IG51bGw7CisJCQlpZiAoIWZvbnRTaXplKSB7CisJCQkJZm9udFNpemUgPSBwYXJzZUZsb2F0KCIxMDAlIik7CisJCQkJZm9udFNpemVUeXBlID0gIiUiOworCQkJfSBlbHNlIHsKKwkJCQlkb2pvLmxhbmcuc29tZShbImVtIiwgInB4IiwgIiUiXSwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4LCBhcnIpIHsKKwkJCQkJaWYgKGZvbnRTaXplLmluZGV4T2YoaXRlbSkgPiAwKSB7CisJCQkJCQlmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udFNpemUpOworCQkJCQkJZm9udFNpemVUeXBlID0gaXRlbTsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCQlwcm9wcy5wdXNoKHtwcm9wZXJ0eToiZm9udC1zaXplIiwgc3RhcnQ6Zm9udFNpemUsIGVuZDpmb250U2l6ZSAqIGFjdHVhbFBjdCwgdW5pdHM6Zm9udFNpemVUeXBlfSk7CisJCX0KKwkJaWYgKGZyb21DZW50ZXIpIHsKKwkJCXZhciBwb3NpdGlvbmluZyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAicG9zaXRpb24iKTsKKwkJCXZhciBvcmlnaW5hbFRvcCA9IG5vZGUub2Zmc2V0VG9wOworCQkJdmFyIG9yaWdpbmFsTGVmdCA9IG5vZGUub2Zmc2V0TGVmdDsKKwkJCXZhciBlbmRUb3AgPSAoKG91dGVyLmhlaWdodCAqIGFjdHVhbFBjdCkgLSBvdXRlci5oZWlnaHQpIC8gMjsKKwkJCXZhciBlbmRMZWZ0ID0gKChvdXRlci53aWR0aCAqIGFjdHVhbFBjdCkgLSBvdXRlci53aWR0aCkgLyAyOworCQkJcHJvcHMucHVzaCh7cHJvcGVydHk6InRvcCIsIHN0YXJ0Om9yaWdpbmFsVG9wLCBlbmQ6KHBvc2l0aW9uaW5nID09ICJhYnNvbHV0ZSIgPyBvcmlnaW5hbFRvcCAtIGVuZFRvcCA6ICgtMSAqIGVuZFRvcCkpfSk7CisJCQlwcm9wcy5wdXNoKHtwcm9wZXJ0eToibGVmdCIsIHN0YXJ0Om9yaWdpbmFsTGVmdCwgZW5kOihwb3NpdGlvbmluZyA9PSAiYWJzb2x1dGUiID8gb3JpZ2luYWxMZWZ0IC0gZW5kTGVmdCA6ICgtMSAqIGVuZExlZnQpKX0pOworCQl9CisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgcHJvcHMsIGR1cmF0aW9uLCBlYXNpbmcpOworCQlpZiAoY2FsbGJhY2spIHsKKwkJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQkJY2FsbGJhY2sobm9kZSwgYW5pbSk7CisJCQl9KTsKKwkJfQorCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsKK307Citkb2pvLmxhbmcubWl4aW4oZG9qby5sZngsIGRvam8ubGZ4Lmh0bWwpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGZ4L2h0bWwuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGZ4L2h0bWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0NDQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvaHRtbC5qcwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguaHRtbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5jb2xvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC5BbmltYXRpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5kaXNwbGF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5jb2xvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLmxmeC5odG1sLl9ieUlkID0gZnVuY3Rpb24gKG5vZGVzKSB7CisJaWYgKCFub2RlcykgeworCQlyZXR1cm4gW107CisJfQorCWlmIChkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKSB7CisJCWlmICghbm9kZXMuYWxyZWFkeUNoZWNrZWQpIHsKKwkJCXZhciBuID0gW107CisJCQlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHsKKwkJCQluLnB1c2goZG9qby5ieUlkKG5vZGUpKTsKKwkJCX0pOworCQkJbi5hbHJlYWR5Q2hlY2tlZCA9IHRydWU7CisJCQlyZXR1cm4gbjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBub2RlczsKKwkJfQorCX0gZWxzZSB7CisJCXZhciBuID0gW107CisJCW4ucHVzaChkb2pvLmJ5SWQobm9kZXMpKTsKKwkJbi5hbHJlYWR5Q2hlY2tlZCA9IHRydWU7CisJCXJldHVybiBuOworCX0KK307Citkb2pvLmxmeC5odG1sLnByb3BlcnR5QW5pbWF0aW9uID0gZnVuY3Rpb24gKG5vZGVzLCBwcm9wZXJ0eU1hcCwgZHVyYXRpb24sIGVhc2luZywgaGFuZGxlcnMpIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciB0YXJncyA9IHsicHJvcGVydHlNYXAiOnByb3BlcnR5TWFwLCAibm9kZXMiOm5vZGVzLCAiZHVyYXRpb24iOmR1cmF0aW9uLCAiZWFzaW5nIjplYXNpbmcgfHwgZG9qby5sZnguZWFzZURlZmF1bHR9OworCXZhciBzZXRFbVVwID0gZnVuY3Rpb24gKGFyZ3MpIHsKKwkJaWYgKGFyZ3Mubm9kZXMubGVuZ3RoID09IDEpIHsKKwkJCXZhciBwbSA9IGFyZ3MucHJvcGVydHlNYXA7CisJCQlpZiAoIWRvam8ubGFuZy5pc0FycmF5KGFyZ3MucHJvcGVydHlNYXApKSB7CisJCQkJdmFyIHBhcnIgPSBbXTsKKwkJCQlmb3IgKHZhciBwbmFtZSBpbiBwbSkgeworCQkJCQlwbVtwbmFtZV0ucHJvcGVydHkgPSBwbmFtZTsKKwkJCQkJcGFyci5wdXNoKHBtW3BuYW1lXSk7CisJCQkJfQorCQkJCXBtID0gYXJncy5wcm9wZXJ0eU1hcCA9IHBhcnI7CisJCQl9CisJCQlkb2pvLmxhbmcuZm9yRWFjaChwbSwgZnVuY3Rpb24gKHByb3ApIHsKKwkJCQlpZiAoZGpfdW5kZWYoInN0YXJ0IiwgcHJvcCkpIHsKKwkJCQkJaWYgKHByb3AucHJvcGVydHkgIT0gIm9wYWNpdHkiKSB7CisJCQkJCQlwcm9wLnN0YXJ0ID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUoYXJncy5ub2Rlc1swXSwgcHJvcC5wcm9wZXJ0eSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJvcC5zdGFydCA9IGRvam8uaHRtbC5nZXRPcGFjaXR5KGFyZ3Mubm9kZXNbMF0pOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0KKwl9OworCXZhciBjb29yZHNBc0ludHMgPSBmdW5jdGlvbiAoY29vcmRzKSB7CisJCXZhciBjaW50cyA9IFtdOworCQlkb2pvLmxhbmcuZm9yRWFjaChjb29yZHMsIGZ1bmN0aW9uIChjKSB7CisJCQljaW50cy5wdXNoKE1hdGgucm91bmQoYykpOworCQl9KTsKKwkJcmV0dXJuIGNpbnRzOworCX07CisJdmFyIHNldFN0eWxlID0gZnVuY3Rpb24gKG4sIHN0eWxlKSB7CisJCW4gPSBkb2pvLmJ5SWQobik7CisJCWlmICghbiB8fCAhbi5zdHlsZSkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAodmFyIHMgaW4gc3R5bGUpIHsKKwkJCXRyeSB7CisJCQkJaWYgKHMgPT0gIm9wYWNpdHkiKSB7CisJCQkJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG4sIHN0eWxlW3NdKTsKKwkJCQl9IGVsc2UgeworCQkJCQluLnN0eWxlW3NdID0gc3R5bGVbc107CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCQlkb2pvLmRlYnVnKGUpOworCQkJfQorCQl9CisJfTsKKwl2YXIgcHJvcExpbmUgPSBmdW5jdGlvbiAocHJvcGVydGllcykgeworCQl0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwkJdGhpcy5kaWZmcyA9IG5ldyBBcnJheShwcm9wZXJ0aWVzLmxlbmd0aCk7CisJCWRvam8ubGFuZy5mb3JFYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uIChwcm9wLCBpKSB7CisJCQlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5zdGFydCkpIHsKKwkJCQlwcm9wLnN0YXJ0ID0gcHJvcC5zdGFydChwcm9wLCBpKTsKKwkJCX0KKwkJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihwcm9wLmVuZCkpIHsKKwkJCQlwcm9wLmVuZCA9IHByb3AuZW5kKHByb3AsIGkpOworCQkJfQorCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKSB7CisJCQkJdGhpcy5kaWZmc1tpXSA9IG51bGw7CisJCQl9IGVsc2UgeworCQkJCWlmIChwcm9wLnN0YXJ0IGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpIHsKKwkJCQkJcHJvcC5zdGFydFJnYiA9IHByb3Auc3RhcnQudG9SZ2IoKTsKKwkJCQkJcHJvcC5lbmRSZ2IgPSBwcm9wLmVuZC50b1JnYigpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuZGlmZnNbaV0gPSBwcm9wLmVuZCAtIHByb3Auc3RhcnQ7CisJCQkJfQorCQkJfQorCQl9LCB0aGlzKTsKKwkJdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuKSB7CisJCQl2YXIgcmV0ID0ge307CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLl9wcm9wZXJ0aWVzLCBmdW5jdGlvbiAocHJvcCwgaSkgeworCQkJCXZhciB2YWx1ZSA9IG51bGw7CisJCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHByb3Auc3RhcnQgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcikgeworCQkJCQkJdmFsdWUgPSAocHJvcC51bml0cyB8fCAicmdiIikgKyAiKCI7CisJCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IHByb3Auc3RhcnRSZ2IubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQl2YWx1ZSArPSBNYXRoLnJvdW5kKCgocHJvcC5lbmRSZ2Jbal0gLSBwcm9wLnN0YXJ0UmdiW2pdKSAqIG4pICsgcHJvcC5zdGFydFJnYltqXSkgKyAoaiA8IHByb3Auc3RhcnRSZ2IubGVuZ3RoIC0gMSA/ICIsIiA6ICIiKTsKKwkJCQkJCX0KKwkJCQkJCXZhbHVlICs9ICIpIjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZhbHVlID0gKCh0aGlzLmRpZmZzW2ldKSAqIG4pICsgcHJvcC5zdGFydCArIChwcm9wLnByb3BlcnR5ICE9ICJvcGFjaXR5IiA/IHByb3AudW5pdHMgfHwgInB4IiA6ICIiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXRbZG9qby5odG1sLnRvQ2FtZWxDYXNlKHByb3AucHJvcGVydHkpXSA9IHZhbHVlOworCQkJfSwgdGhpcyk7CisJCQlyZXR1cm4gcmV0OworCQl9OworCX07CisJdmFyIGFuaW0gPSBuZXcgZG9qby5sZnguQW5pbWF0aW9uKHtiZWZvcmVCZWdpbjpmdW5jdGlvbiAoKSB7CisJCXNldEVtVXAodGFyZ3MpOworCQlhbmltLmN1cnZlID0gbmV3IHByb3BMaW5lKHRhcmdzLnByb3BlcnR5TWFwKTsKKwl9LCBvbkFuaW1hdGU6ZnVuY3Rpb24gKHByb3BWYWx1ZXMpIHsKKwkJZG9qby5sYW5nLmZvckVhY2godGFyZ3Mubm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCQlzZXRTdHlsZShub2RlLCBwcm9wVmFsdWVzKTsKKwkJfSk7CisJfX0sIHRhcmdzLmR1cmF0aW9uLCBudWxsLCB0YXJncy5lYXNpbmcpOworCWlmIChoYW5kbGVycykgeworCQlmb3IgKHZhciB4IGluIGhhbmRsZXJzKSB7CisJCQlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24oaGFuZGxlcnNbeF0pKSB7CisJCQkJYW5pbS5jb25uZWN0KHgsIGFuaW0sIGhhbmRsZXJzW3hdKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLl9tYWtlRmFkZWFibGUgPSBmdW5jdGlvbiAobm9kZXMpIHsKKwl2YXIgbWFrZUZhZGUgPSBmdW5jdGlvbiAobm9kZSkgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJaWYgKChub2RlLnN0eWxlLnpvb20ubGVuZ3RoID09IDApICYmIChkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgInpvb20iKSA9PSAibm9ybWFsIikpIHsKKwkJCQlub2RlLnN0eWxlLnpvb20gPSAiMSI7CisJCQl9CisJCQlpZiAoKG5vZGUuc3R5bGUud2lkdGgubGVuZ3RoID09IDApICYmIChkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgIndpZHRoIikgPT0gImF1dG8iKSkgeworCQkJCW5vZGUuc3R5bGUud2lkdGggPSAiYXV0byI7CisJCQl9CisJCX0KKwl9OworCWlmIChkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKSB7CisJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBtYWtlRmFkZSk7CisJfSBlbHNlIHsKKwkJbWFrZUZhZGUobm9kZXMpOworCX0KK307Citkb2pvLmxmeC5odG1sLmZhZGUgPSBmdW5jdGlvbiAobm9kZXMsIHZhbHVlcywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBwcm9wcyA9IHtwcm9wZXJ0eToib3BhY2l0eSJ9OworCWlmICghZGpfdW5kZWYoInN0YXJ0IiwgdmFsdWVzKSkgeworCQlwcm9wcy5zdGFydCA9IHZhbHVlcy5zdGFydDsKKwl9IGVsc2UgeworCQlwcm9wcy5zdGFydCA9IGZ1bmN0aW9uICgpIHsKKwkJCXJldHVybiBkb2pvLmh0bWwuZ2V0T3BhY2l0eShub2Rlc1swXSk7CisJCX07CisJfQorCWlmICghZGpfdW5kZWYoImVuZCIsIHZhbHVlcykpIHsKKwkJcHJvcHMuZW5kID0gdmFsdWVzLmVuZDsKKwl9IGVsc2UgeworCQlkb2pvLnJhaXNlKCJkb2pvLmxmeC5odG1sLmZhZGUgbmVlZHMgYW4gZW5kIHZhbHVlIik7CisJfQorCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZXMsIFtwcm9wc10sIGR1cmF0aW9uLCBlYXNpbmcpOworCWFuaW0uY29ubmVjdCgiYmVmb3JlQmVnaW4iLCBmdW5jdGlvbiAoKSB7CisJCWRvam8ubGZ4Lmh0bWwuX21ha2VGYWRlYWJsZShub2Rlcyk7CisJfSk7CisJaWYgKGNhbGxiYWNrKSB7CisJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQljYWxsYmFjayhub2RlcywgYW5pbSk7CisJCX0pOworCX0KKwlyZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLmZhZGVJbiA9IGZ1bmN0aW9uIChub2RlcywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlyZXR1cm4gZG9qby5sZnguaHRtbC5mYWRlKG5vZGVzLCB7ZW5kOjF9LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayk7Cit9OworZG9qby5sZnguaHRtbC5mYWRlT3V0ID0gZnVuY3Rpb24gKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCXJldHVybiBkb2pvLmxmeC5odG1sLmZhZGUobm9kZXMsIHtlbmQ6MH0sIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKTsKK307Citkb2pvLmxmeC5odG1sLmZhZGVTaG93ID0gZnVuY3Rpb24gKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG5vZGUsIDApOworCX0pOworCXZhciBhbmltID0gZG9qby5sZnguaHRtbC5mYWRlSW4obm9kZXMsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKTsKKwlhbmltLmNvbm5lY3QoImJlZm9yZUJlZ2luIiwgZnVuY3Rpb24gKCkgeworCQlpZiAoZG9qby5sYW5nLmlzQXJyYXlMaWtlKG5vZGVzKSkgeworCQkJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGRvam8uaHRtbC5zaG93KTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uaHRtbC5zaG93KG5vZGVzKTsKKwkJfQorCX0pOworCXJldHVybiBhbmltOworfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZUhpZGUgPSBmdW5jdGlvbiAobm9kZXMsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSB7CisJdmFyIGFuaW0gPSBkb2pvLmxmeC5odG1sLmZhZGVPdXQobm9kZXMsIGR1cmF0aW9uLCBlYXNpbmcsIGZ1bmN0aW9uICgpIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5TGlrZShub2RlcykpIHsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBkb2pvLmh0bWwuaGlkZSk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmh0bWwuaGlkZShub2Rlcyk7CisJCX0KKwkJaWYgKGNhbGxiYWNrKSB7CisJCQljYWxsYmFjayhub2RlcywgYW5pbSk7CisJCX0KKwl9KTsKKwlyZXR1cm4gYW5pbTsKK307Citkb2pvLmxmeC5odG1sLndpcGVJbiA9IGZ1bmN0aW9uIChub2RlcywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltcyA9IFtdOworCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkgeworCQl2YXIgb3Byb3AgPSB7fTsKKwkJdmFyIG9yaWdUb3AsIG9yaWdMZWZ0LCBvcmlnUG9zaXRpb247CisJCXdpdGggKG5vZGUuc3R5bGUpIHsKKwkJCW9yaWdUb3AgPSB0b3A7CisJCQlvcmlnTGVmdCA9IGxlZnQ7CisJCQlvcmlnUG9zaXRpb24gPSBwb3NpdGlvbjsKKwkJCXRvcCA9ICItOTk5OXB4IjsKKwkJCWxlZnQgPSAiLTk5OTlweCI7CisJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQlkaXNwbGF5ID0gIiI7CisJCX0KKwkJdmFyIG5vZGVIZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpLmhlaWdodDsKKwkJd2l0aCAobm9kZS5zdHlsZSkgeworCQkJdG9wID0gb3JpZ1RvcDsKKwkJCWxlZnQgPSBvcmlnTGVmdDsKKwkJCXBvc2l0aW9uID0gb3JpZ1Bvc2l0aW9uOworCQkJZGlzcGxheSA9ICJub25lIjsKKwkJfQorCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsIHsiaGVpZ2h0Ijp7c3RhcnQ6MSwgZW5kOmZ1bmN0aW9uICgpIHsKKwkJCXJldHVybiBub2RlSGVpZ2h0OworCQl9fX0sIGR1cmF0aW9uLCBlYXNpbmcpOworCQlhbmltLmNvbm5lY3QoImJlZm9yZUJlZ2luIiwgZnVuY3Rpb24gKCkgeworCQkJb3Byb3Aub3ZlcmZsb3cgPSBub2RlLnN0eWxlLm92ZXJmbG93OworCQkJb3Byb3AuaGVpZ2h0ID0gbm9kZS5zdHlsZS5oZWlnaHQ7CisJCQl3aXRoIChub2RlLnN0eWxlKSB7CisJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQloZWlnaHQgPSAiMXB4IjsKKwkJCX0KKwkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQl9KTsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uICgpIHsKKwkJCXdpdGggKG5vZGUuc3R5bGUpIHsKKwkJCQlvdmVyZmxvdyA9IG9wcm9wLm92ZXJmbG93OworCQkJCWhlaWdodCA9IG9wcm9wLmhlaWdodDsKKwkJCX0KKwkJCWlmIChjYWxsYmFjaykgeworCQkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQkJfQorCQl9KTsKKwkJYW5pbXMucHVzaChhbmltKTsKKwl9KTsKKwlyZXR1cm4gZG9qby5sZnguY29tYmluZShhbmltcyk7Cit9OworZG9qby5sZnguaHRtbC53aXBlT3V0ID0gZnVuY3Rpb24gKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciBvcHJvcCA9IHt9OworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsIHsiaGVpZ2h0Ijp7c3RhcnQ6ZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpLmhlaWdodDsKKwkJfSwgZW5kOjF9fSwgZHVyYXRpb24sIGVhc2luZywgeyJiZWZvcmVCZWdpbiI6ZnVuY3Rpb24gKCkgeworCQkJb3Byb3Aub3ZlcmZsb3cgPSBub2RlLnN0eWxlLm92ZXJmbG93OworCQkJb3Byb3AuaGVpZ2h0ID0gbm9kZS5zdHlsZS5oZWlnaHQ7CisJCQl3aXRoIChub2RlLnN0eWxlKSB7CisJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCX0KKwkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQl9LCAib25FbmQiOmZ1bmN0aW9uICgpIHsKKwkJCWRvam8uaHRtbC5oaWRlKG5vZGUpOworCQkJd2l0aCAobm9kZS5zdHlsZSkgeworCQkJCW92ZXJmbG93ID0gb3Byb3Aub3ZlcmZsb3c7CisJCQkJaGVpZ2h0ID0gb3Byb3AuaGVpZ2h0OworCQkJfQorCQkJaWYgKGNhbGxiYWNrKSB7CisJCQkJY2FsbGJhY2sobm9kZSwgYW5pbSk7CisJCQl9CisJCX19KTsKKwkJYW5pbXMucHVzaChhbmltKTsKKwl9KTsKKwlyZXR1cm4gZG9qby5sZnguY29tYmluZShhbmltcyk7Cit9OworZG9qby5sZnguaHRtbC5zbGlkZVRvID0gZnVuY3Rpb24gKG5vZGVzLCBjb29yZHMsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSB7CisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKwl2YXIgY29tcHV0ZSA9IGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlOworCWlmIChkb2pvLmxhbmcuaXNBcnJheShjb29yZHMpKSB7CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sZnguaHRtbC5zbGlkZVRvKG5vZGUsIGFycmF5KSIsICJ1c2UgZG9qby5sZnguaHRtbC5zbGlkZVRvKG5vZGUsIHt0b3A6IHZhbHVlLCBsZWZ0OiB2YWx1ZX0pOyIsICIwLjUiKTsKKwkJY29vcmRzID0ge3RvcDpjb29yZHNbMF0sIGxlZnQ6Y29vcmRzWzFdfTsKKwl9CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciB0b3AgPSBudWxsOworCQl2YXIgbGVmdCA9IG51bGw7CisJCXZhciBpbml0ID0gKGZ1bmN0aW9uICgpIHsKKwkJCXZhciBpbm5lck5vZGUgPSBub2RlOworCQkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJCQl2YXIgcG9zID0gY29tcHV0ZShpbm5lck5vZGUsICJwb3NpdGlvbiIpOworCQkJCXRvcCA9IChwb3MgPT0gImFic29sdXRlIiA/IG5vZGUub2Zmc2V0VG9wIDogcGFyc2VJbnQoY29tcHV0ZShub2RlLCAidG9wIikpIHx8IDApOworCQkJCWxlZnQgPSAocG9zID09ICJhYnNvbHV0ZSIgPyBub2RlLm9mZnNldExlZnQgOiBwYXJzZUludChjb21wdXRlKG5vZGUsICJsZWZ0IikpIHx8IDApOworCQkJCWlmICghZG9qby5sYW5nLmluQXJyYXkoWyJhYnNvbHV0ZSIsICJyZWxhdGl2ZSJdLCBwb3MpKSB7CisJCQkJCXZhciByZXQgPSBkb2pvLmh0bWwuYWJzKGlubmVyTm9kZSwgdHJ1ZSk7CisJCQkJCWRvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMoaW5uZXJOb2RlLCAicG9zaXRpb246YWJzb2x1dGU7dG9wOiIgKyByZXQueSArICJweDtsZWZ0OiIgKyByZXQueCArICJweDsiKTsKKwkJCQkJdG9wID0gcmV0Lnk7CisJCQkJCWxlZnQgPSByZXQueDsKKwkJCQl9CisJCQl9OworCQl9KSgpOworCQlpbml0KCk7CisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgeyJ0b3AiOntzdGFydDp0b3AsIGVuZDooY29vcmRzLnRvcCB8fCAwKX0sICJsZWZ0Ijp7c3RhcnQ6bGVmdCwgZW5kOihjb29yZHMubGVmdCB8fCAwKX19LCBkdXJhdGlvbiwgZWFzaW5nLCB7ImJlZm9yZUJlZ2luIjppbml0fSk7CisJCWlmIChjYWxsYmFjaykgeworCQkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uICgpIHsKKwkJCQljYWxsYmFjayhub2RlcywgYW5pbSk7CisJCQl9KTsKKwkJfQorCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsKK307Citkb2pvLmxmeC5odG1sLnNsaWRlQnkgPSBmdW5jdGlvbiAobm9kZXMsIGNvb3JkcywgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltcyA9IFtdOworCXZhciBjb21wdXRlID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU7CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KGNvb3JkcykpIHsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwgYXJyYXkpIiwgInVzZSBkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7IiwgIjAuNSIpOworCQljb29yZHMgPSB7dG9wOmNvb3Jkc1swXSwgbGVmdDpjb29yZHNbMV19OworCX0KKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHsKKwkJdmFyIHRvcCA9IG51bGw7CisJCXZhciBsZWZ0ID0gbnVsbDsKKwkJdmFyIGluaXQgPSAoZnVuY3Rpb24gKCkgeworCQkJdmFyIGlubmVyTm9kZSA9IG5vZGU7CisJCQlyZXR1cm4gZnVuY3Rpb24gKCkgeworCQkJCXZhciBwb3MgPSBjb21wdXRlKGlubmVyTm9kZSwgInBvc2l0aW9uIik7CisJCQkJdG9wID0gKHBvcyA9PSAiYWJzb2x1dGUiID8gbm9kZS5vZmZzZXRUb3AgOiBwYXJzZUludChjb21wdXRlKG5vZGUsICJ0b3AiKSkgfHwgMCk7CisJCQkJbGVmdCA9IChwb3MgPT0gImFic29sdXRlIiA/IG5vZGUub2Zmc2V0TGVmdCA6IHBhcnNlSW50KGNvbXB1dGUobm9kZSwgImxlZnQiKSkgfHwgMCk7CisJCQkJaWYgKCFkb2pvLmxhbmcuaW5BcnJheShbImFic29sdXRlIiwgInJlbGF0aXZlIl0sIHBvcykpIHsKKwkJCQkJdmFyIHJldCA9IGRvam8uaHRtbC5hYnMoaW5uZXJOb2RlLCB0cnVlKTsKKwkJCQkJZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcyhpbm5lck5vZGUsICJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6IiArIHJldC55ICsgInB4O2xlZnQ6IiArIHJldC54ICsgInB4OyIpOworCQkJCQl0b3AgPSByZXQueTsKKwkJCQkJbGVmdCA9IHJldC54OworCQkJCX0KKwkJCX07CisJCX0pKCk7CisJCWluaXQoKTsKKwkJdmFyIGFuaW0gPSBkb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihub2RlLCB7InRvcCI6e3N0YXJ0OnRvcCwgZW5kOnRvcCArIChjb29yZHMudG9wIHx8IDApfSwgImxlZnQiOntzdGFydDpsZWZ0LCBlbmQ6bGVmdCArIChjb29yZHMubGVmdCB8fCAwKX19LCBkdXJhdGlvbiwgZWFzaW5nKS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsIGluaXQpOworCQlpZiAoY2FsbGJhY2spIHsKKwkJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQkJY2FsbGJhY2sobm9kZXMsIGFuaW0pOworCQkJfSk7CisJCX0KKwkJYW5pbXMucHVzaChhbmltKTsKKwl9KTsKKwlyZXR1cm4gZG9qby5sZnguY29tYmluZShhbmltcyk7Cit9OworZG9qby5sZnguaHRtbC5leHBsb2RlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmROb2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCXZhciBoID0gZG9qby5odG1sOworCXN0YXJ0ID0gZG9qby5ieUlkKHN0YXJ0KTsKKwllbmROb2RlID0gZG9qby5ieUlkKGVuZE5vZGUpOworCXZhciBzdGFydENvb3JkcyA9IGgudG9Db29yZGluYXRlT2JqZWN0KHN0YXJ0LCB0cnVlKTsKKwl2YXIgb3V0bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWguY29weVN0eWxlKG91dGxpbmUsIGVuZE5vZGUpOworCWlmIChlbmROb2RlLmV4cGxvZGVDbGFzc05hbWUpIHsKKwkJb3V0bGluZS5jbGFzc05hbWUgPSBlbmROb2RlLmV4cGxvZGVDbGFzc05hbWU7CisJfQorCXdpdGggKG91dGxpbmUuc3R5bGUpIHsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlkaXNwbGF5ID0gIm5vbmUiOworCQl2YXIgYmFja2dyb3VuZFN0eWxlID0gaC5nZXRTdHlsZShzdGFydCwgImJhY2tncm91bmQtY29sb3IiKTsKKwkJYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZFN0eWxlID8gYmFja2dyb3VuZFN0eWxlLnRvTG93ZXJDYXNlKCkgOiAidHJhbnNwYXJlbnQiOworCQliYWNrZ3JvdW5kQ29sb3IgPSAoYmFja2dyb3VuZENvbG9yID09ICJ0cmFuc3BhcmVudCIpID8gInJnYigyMjEsIDIyMSwgMjIxKSIgOiBiYWNrZ3JvdW5kQ29sb3I7CisJfQorCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKG91dGxpbmUpOworCXdpdGggKGVuZE5vZGUuc3R5bGUpIHsKKwkJdmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQlkaXNwbGF5ID0gImJsb2NrIjsKKwl9CisJdmFyIGVuZENvb3JkcyA9IGgudG9Db29yZGluYXRlT2JqZWN0KGVuZE5vZGUsIHRydWUpOworCXdpdGggKGVuZE5vZGUuc3R5bGUpIHsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJdmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKKwl9CisJdmFyIHByb3BzID0ge29wYWNpdHk6e3N0YXJ0OjAuNSwgZW5kOjF9fTsKKwlkb2pvLmxhbmcuZm9yRWFjaChbImhlaWdodCIsICJ3aWR0aCIsICJ0b3AiLCAibGVmdCJdLCBmdW5jdGlvbiAodHlwZSkgeworCQlwcm9wc1t0eXBlXSA9IHtzdGFydDpzdGFydENvb3Jkc1t0eXBlXSwgZW5kOmVuZENvb3Jkc1t0eXBlXX07CisJfSk7CisJdmFyIGFuaW0gPSBuZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24ob3V0bGluZSwgcHJvcHMsIGR1cmF0aW9uLCBlYXNpbmcsIHsiYmVmb3JlQmVnaW4iOmZ1bmN0aW9uICgpIHsKKwkJaC5zZXREaXNwbGF5KG91dGxpbmUsICJibG9jayIpOworCX0sICJvbkVuZCI6ZnVuY3Rpb24gKCkgeworCQloLnNldERpc3BsYXkoZW5kTm9kZSwgImJsb2NrIik7CisJCW91dGxpbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvdXRsaW5lKTsKKwl9fSk7CisJaWYgKGNhbGxiYWNrKSB7CisJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQljYWxsYmFjayhlbmROb2RlLCBhbmltKTsKKwkJfSk7CisJfQorCXJldHVybiBhbmltOworfTsKK2Rvam8ubGZ4Lmh0bWwuaW1wbG9kZSA9IGZ1bmN0aW9uIChzdGFydE5vZGUsIGVuZCwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwl2YXIgaCA9IGRvam8uaHRtbDsKKwlzdGFydE5vZGUgPSBkb2pvLmJ5SWQoc3RhcnROb2RlKTsKKwllbmQgPSBkb2pvLmJ5SWQoZW5kKTsKKwl2YXIgc3RhcnRDb29yZHMgPSBkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KHN0YXJ0Tm9kZSwgdHJ1ZSk7CisJdmFyIGVuZENvb3JkcyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3QoZW5kLCB0cnVlKTsKKwl2YXIgb3V0bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRvam8uaHRtbC5jb3B5U3R5bGUob3V0bGluZSwgc3RhcnROb2RlKTsKKwlpZiAoc3RhcnROb2RlLmV4cGxvZGVDbGFzc05hbWUpIHsKKwkJb3V0bGluZS5jbGFzc05hbWUgPSBzdGFydE5vZGUuZXhwbG9kZUNsYXNzTmFtZTsKKwl9CisJZG9qby5odG1sLnNldE9wYWNpdHkob3V0bGluZSwgMC4zKTsKKwl3aXRoIChvdXRsaW5lLnN0eWxlKSB7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJYmFja2dyb3VuZENvbG9yID0gaC5nZXRTdHlsZShzdGFydE5vZGUsICJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKKwl9CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQob3V0bGluZSk7CisJdmFyIHByb3BzID0ge29wYWNpdHk6e3N0YXJ0OjEsIGVuZDowLjV9fTsKKwlkb2pvLmxhbmcuZm9yRWFjaChbImhlaWdodCIsICJ3aWR0aCIsICJ0b3AiLCAibGVmdCJdLCBmdW5jdGlvbiAodHlwZSkgeworCQlwcm9wc1t0eXBlXSA9IHtzdGFydDpzdGFydENvb3Jkc1t0eXBlXSwgZW5kOmVuZENvb3Jkc1t0eXBlXX07CisJfSk7CisJdmFyIGFuaW0gPSBuZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24ob3V0bGluZSwgcHJvcHMsIGR1cmF0aW9uLCBlYXNpbmcsIHsiYmVmb3JlQmVnaW4iOmZ1bmN0aW9uICgpIHsKKwkJZG9qby5odG1sLmhpZGUoc3RhcnROb2RlKTsKKwkJZG9qby5odG1sLnNob3cob3V0bGluZSk7CisJfSwgIm9uRW5kIjpmdW5jdGlvbiAoKSB7CisJCW91dGxpbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvdXRsaW5lKTsKKwl9fSk7CisJaWYgKGNhbGxiYWNrKSB7CisJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQljYWxsYmFjayhzdGFydE5vZGUsIGFuaW0pOworCQl9KTsKKwl9CisJcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5oaWdobGlnaHQgPSBmdW5jdGlvbiAobm9kZXMsIHN0YXJ0Q29sb3IsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSB7CisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHsKKwkJdmFyIGNvbG9yID0gZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKTsKKwkJdmFyIGJnID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGJnSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwkJdmFyIHdhc1RyYW5zcGFyZW50ID0gKGJnID09ICJ0cmFuc3BhcmVudCIgfHwgYmcgPT0gInJnYmEoMCwgMCwgMCwgMCkiKTsKKwkJd2hpbGUgKGNvbG9yLmxlbmd0aCA+IDMpIHsKKwkJCWNvbG9yLnBvcCgpOworCQl9CisJCXZhciByZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3Ioc3RhcnRDb2xvcik7CisJCXZhciBlbmRSZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoY29sb3IpOworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsIHsiYmFja2dyb3VuZC1jb2xvciI6e3N0YXJ0OnJnYiwgZW5kOmVuZFJnYn19LCBkdXJhdGlvbiwgZWFzaW5nLCB7ImJlZm9yZUJlZ2luIjpmdW5jdGlvbiAoKSB7CisJCQlpZiAoYmdJbWFnZSkgeworCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIm5vbmUiOworCQkJfQorCQkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAicmdiKCIgKyByZ2IudG9SZ2IoKS5qb2luKCIsIikgKyAiKSI7CisJCX0sICJvbkVuZCI6ZnVuY3Rpb24gKCkgeworCQkJaWYgKGJnSW1hZ2UpIHsKKwkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGJnSW1hZ2U7CisJCQl9CisJCQlpZiAod2FzVHJhbnNwYXJlbnQpIHsKKwkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJ0cmFuc3BhcmVudCI7CisJCQl9CisJCQlpZiAoY2FsbGJhY2spIHsKKwkJCQljYWxsYmFjayhub2RlLCBhbmltKTsKKwkJCX0KKwkJfX0pOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsKK307Citkb2pvLmxmeC5odG1sLnVuaGlnaGxpZ2h0ID0gZnVuY3Rpb24gKG5vZGVzLCBlbmRDb2xvciwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltcyA9IFtdOworCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkgeworCQl2YXIgY29sb3IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKSk7CisJCXZhciByZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoZW5kQ29sb3IpOworCQl2YXIgYmdJbWFnZSA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYmFja2dyb3VuZC1pbWFnZSIpOworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsIHsiYmFja2dyb3VuZC1jb2xvciI6e3N0YXJ0OmNvbG9yLCBlbmQ6cmdifX0sIGR1cmF0aW9uLCBlYXNpbmcsIHsiYmVmb3JlQmVnaW4iOmZ1bmN0aW9uICgpIHsKKwkJCWlmIChiZ0ltYWdlKSB7CisJCQkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAibm9uZSI7CisJCQl9CisJCQlub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2IoIiArIGNvbG9yLnRvUmdiKCkuam9pbigiLCIpICsgIikiOworCQl9LCAib25FbmQiOmZ1bmN0aW9uICgpIHsKKwkJCWlmIChjYWxsYmFjaykgeworCQkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQkJfQorCQl9fSk7CisJCWFuaW1zLnB1c2goYW5pbSk7CisJfSk7CisJcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoYW5pbXMpOworfTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmxmeCwgZG9qby5sZnguaHRtbCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvcm91bmRlZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvcm91bmRlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC9yb3VuZGVkLmpzCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmxmeC5yb3VuZGVkIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmRpc3BsYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5sZngucm91bmRlZCA9IGZ1bmN0aW9uIChzZXR0aW5ncykgeworCXZhciBvcHRpb25zID0ge3ZhbGlkVGFnczpzZXR0aW5ncy52YWxpZFRhZ3MgfHwgWyJkaXYiXSwgYXV0b1BhZDpzZXR0aW5ncy5hdXRvUGFkICE9IG51bGwgPyBzZXR0aW5ncy5hdXRvUGFkIDogdHJ1ZSwgYW50aUFsaWFzOnNldHRpbmdzLmFudGlBbGlhcyAhPSBudWxsID8gc2V0dGluZ3MuYW50aUFsaWFzIDogdHJ1ZSwgcmFkaWk6e3RsOihzZXR0aW5ncy50bCAmJiBzZXR0aW5ncy50bC5yYWRpdXMgIT0gbnVsbCkgPyBzZXR0aW5ncy50bC5yYWRpdXMgOiA1LCB0cjooc2V0dGluZ3MudHIgJiYgc2V0dGluZ3MudHIucmFkaXVzICE9IG51bGwpID8gc2V0dGluZ3MudHIucmFkaXVzIDogNSwgYmw6KHNldHRpbmdzLmJsICYmIHNldHRpbmdzLmJsLnJhZGl1cyAhPSBudWxsKSA/IHNldHRpbmdzLmJsLnJhZGl1cyA6IDUsIGJyOihzZXR0aW5ncy5iciAmJiBzZXR0aW5ncy5ici5yYWRpdXMgIT0gbnVsbCkgPyBzZXR0aW5ncy5ici5yYWRpdXMgOiA1fX07CisJdmFyIG5vZGVzOworCWlmICh0eXBlb2YgKGFyZ3VtZW50c1sxXSkgPT0gInN0cmluZyIpIHsKKwkJbm9kZXMgPSBkb2pvLmh0bWwuZ2V0RWxlbWVudHNCeUNsYXNzKGFyZ3VtZW50c1sxXSk7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ubGFuZy5pc0FycmF5TGlrZShhcmd1bWVudHNbMV0pKSB7CisJCQlub2RlcyA9IGFyZ3VtZW50c1sxXTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlub2Rlc1tpXSA9IGRvam8uYnlJZChub2Rlc1tpXSk7CisJCQl9CisJCX0KKwl9CisJaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQlkb2pvLmxmeC5yb3VuZGVkLmFwcGx5Q29ybmVycyhvcHRpb25zLCBub2Rlc1tpXSk7CisJfQorfTsKK2Rvam8ubGZ4LnJvdW5kZWQuYXBwbHlDb3JuZXJzID0gZnVuY3Rpb24gKG9wdGlvbnMsIG5vZGUpIHsKKwl2YXIgdG9wID0gbnVsbDsKKwl2YXIgYm90dG9tID0gbnVsbDsKKwl2YXIgY29udGVudE5vZGUgPSBudWxsOworCXZhciBmbnMgPSBkb2pvLmxmeC5yb3VuZGVkLl9mbnM7CisJdmFyIHdpZHRoID0gbm9kZS5vZmZzZXRXaWR0aDsKKwl2YXIgaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQ7CisJdmFyIGJvcmRlcldpZHRoID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgImJvcmRlci10b3Atd2lkdGgiKSk7CisJdmFyIGJvcmRlckNvbG9yID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgImJvcmRlci10b3AtY29sb3IiKTsKKwl2YXIgY29sb3IgPSBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAiYmFja2dyb3VuZC1jb2xvciIpOworCXZhciBiZ0ltYWdlID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwl2YXIgcG9zaXRpb24gPSBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAicG9zaXRpb24iKTsKKwl2YXIgcGFkZGluZyA9IHBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICJwYWRkaW5nLXRvcCIpKTsKKwl2YXIgZm9ybWF0ID0ge2hlaWdodDpoZWlnaHQsIHdpZHRoOndpZHRoLCBib3JkZXJXaWR0aDpib3JkZXJXaWR0aCwgY29sb3I6Zm5zLmdldFJHQihjb2xvciksIHBhZGRpbmc6cGFkZGluZywgYm9yZGVyQ29sb3I6Zm5zLmdldFJHQihib3JkZXJDb2xvciksIGJvcmRlclN0cmluZzpib3JkZXJXaWR0aCArICJweCIgKyAiIHNvbGlkICIgKyBmbnMuZ2V0UkdCKGJvcmRlckNvbG9yKSwgYmdJbWFnZTooKGJnSW1hZ2UgIT0gIm5vbmUiKSA/IGJnSW1hZ2UgOiAiIiksIGNvbnRlbnQ6bm9kZS5pbm5lckhUTUx9OworCWlmICghZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZShub2RlKSkgeworCQlub2RlLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwl9CisJbm9kZS5zdHlsZS5wYWRkaW5nID0gIjBweCI7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgd2lkdGggPT0gImF1dG8iICYmIGhlaWdodCA9PSAiYXV0byIpIHsKKwkJbm9kZS5zdHlsZS53aWR0aCA9ICIxMDAlIjsKKwl9CisJaWYgKG9wdGlvbnMuYXV0b1BhZCAmJiBmb3JtYXQucGFkZGluZyA+IDApIHsKKwkJbm9kZS5pbm5lckhUTUwgPSAiIjsKKwl9CisJdmFyIHRvcEhlaWdodCA9IE1hdGgubWF4KG9wdGlvbnMucmFkaWkudGwsIG9wdGlvbnMucmFkaWkudHIpOworCXZhciBib3R0b21IZWlnaHQgPSBNYXRoLm1heChvcHRpb25zLnJhZGlpLmJsLCBvcHRpb25zLnJhZGlpLmJyKTsKKwlpZiAob3B0aW9ucy5yYWRpaS50bCB8fCBvcHRpb25zLnJhZGlpLnRyKSB7CisJCXRvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQl0b3Auc3R5bGUud2lkdGggPSAiMTAwJSI7CisJCXRvcC5zdHlsZS5mb250U2l6ZSA9ICIxcHgiOworCQl0b3Auc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJdG9wLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJdG9wLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZm9ybWF0LmJvcmRlcldpZHRoICsgInB4IjsKKwkJdG9wLnN0eWxlLnBhZGRpbmdSaWdodCA9IGZvcm1hdC5ib3JkZXJXaWR0aCArICJweCI7CisJCXRvcC5zdHlsZS5oZWlnaHQgPSB0b3BIZWlnaHQgKyAicHgiOworCQl0b3Auc3R5bGUudG9wID0gKDAgLSB0b3BIZWlnaHQpICsgInB4IjsKKwkJdG9wLnN0eWxlLmxlZnQgPSAoMCAtIGZvcm1hdC5ib3JkZXJXaWR0aCkgKyAicHgiOworCQlub2RlLmFwcGVuZENoaWxkKHRvcCk7CisJfQorCWlmIChvcHRpb25zLnJhZGlpLmJsIHx8IG9wdGlvbnMucmFkaWkuYnIpIHsKKwkJYm90dG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWJvdHRvbS5zdHlsZS53aWR0aCA9ICIxMDAlIjsKKwkJYm90dG9tLnN0eWxlLmZvbnRTaXplID0gIjFweCI7CisJCWJvdHRvbS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCQlib3R0b20uc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlib3R0b20uc3R5bGUucGFkZGluZ0xlZnQgPSBmb3JtYXQuYm9yZGVyV2lkdGggKyAicHgiOworCQlib3R0b20uc3R5bGUucGFkZGluZ1JpZ2h0ID0gZm9ybWF0LmJvcmRlcldpZHRoICsgInB4IjsKKwkJYm90dG9tLnN0eWxlLmhlaWdodCA9IGJvdHRvbUhlaWdodCArICJweCI7CisJCWJvdHRvbS5zdHlsZS5ib3R0b20gPSAoMCAtIGJvdHRvbUhlaWdodCkgKyAicHgiOworCQlib3R0b20uc3R5bGUubGVmdCA9ICgwIC0gZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCI7CisJCW5vZGUuYXBwZW5kQ2hpbGQoYm90dG9tKTsKKwl9CisJaWYgKHRvcCkgeworCQlub2RlLnN0eWxlLmJvcmRlclRvcFdpZHRoID0gIjBweCI7CisJfQorCWlmIChib3R0b20pIHsKKwkJbm9kZS5zdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9ICIwcHgiOworCX0KKwl2YXIgY29ybmVycyA9IFsidHIiLCAidGwiLCAiYnIiLCAiYmwiXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNvcm5lcnMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNjID0gY29ybmVyc1tpXTsKKwkJaWYgKG9wdGlvbnMucmFkaWlbY2NdID09IDApIHsKKwkJCWlmICgoY2MuY2hhckF0KDApID09ICJ0IiAmJiB0b3ApIHx8IChjYy5jaGFyQXQoMCkgPT0gImIiICYmIGJvdHRvbSkpIHsKKwkJCQl2YXIgY29ybmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJY29ybmVyLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwkJCQljb3JuZXIuc3R5bGUuZm9udFNpemUgPSAiMXB4OyI7CisJCQkJY29ybmVyLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCQkJaWYgKGZvcm1hdC5iZ0ltYWdlID09ICIiKSB7CisJCQkJCWNvcm5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBmb3JtYXQuY29sb3I7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29ybmVyLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGZvcm1hdC5iZ0ltYWdlOworCQkJCX0KKwkJCQlzd2l0Y2ggKGNjKSB7CisJCQkJICBjYXNlICJ0bCI6CisJCQkJCWNvcm5lci5zdHlsZS5oZWlnaHQgPSB0b3BIZWlnaHQgLSBmb3JtYXQuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQljb3JuZXIuc3R5bGUubWFyZ2luUmlnaHQgPSBvcHRpb25zLnJhZGlpW2NjXSAtIChmb3JtYXQuYm9yZGVyV2lkdGggKiAyKSArICJweCI7CisJCQkJCWNvcm5lci5zdHlsZS5ib3JkZXJMZWZ0ID0gZm9ybWF0LmJvcmRlclN0cmluZzsKKwkJCQkJY29ybmVyLnN0eWxlLmJvcmRlclRvcCA9IGZvcm1hdC5ib3JkZXJTdHJpbmc7CisJCQkJCWNvcm5lci5zdHlsZS5sZWZ0ID0gLWZvcm1hdC5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAidHIiOgorCQkJCQljb3JuZXIuc3R5bGUuaGVpZ2h0ID0gdG9wSGVpZ2h0IC0gZm9ybWF0LmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJY29ybmVyLnN0eWxlLm1hcmdpbkxlZnQgPSBvcHRpb25zLnJhZGlpW2NjXSAtIChmb3JtYXQuYm9yZGVyV2lkdGggKiAyKSArICJweCI7CisJCQkJCWNvcm5lci5zdHlsZS5ib3JkZXJSaWdodCA9IGZvcm1hdC5ib3JkZXJTdHJpbmc7CisJCQkJCWNvcm5lci5zdHlsZS5ib3JkZXJUb3AgPSBmb3JtYXQuYm9yZGVyU3RyaW5nOworCQkJCQljb3JuZXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gIi0iICsgKHRvcEhlaWdodCAtIGZvcm1hdC5ib3JkZXJXaWR0aCkgKyAicHggMHB4IjsKKwkJCQkJY29ybmVyLnN0eWxlLmxlZnQgPSBmb3JtYXQuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgImJsIjoKKwkJCQkJY29ybmVyLnN0eWxlLmhlaWdodCA9IGJvdHRvbUhlaWdodCAtIGZvcm1hdC5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCWNvcm5lci5zdHlsZS5tYXJnaW5SaWdodCA9IG9wdGlvbnMucmFkaWlbY2NdIC0gKGZvcm1hdC5ib3JkZXJXaWR0aCAqIDIpICsgInB4IjsKKwkJCQkJY29ybmVyLnN0eWxlLmJvcmRlckxlZnQgPSBmb3JtYXQuYm9yZGVyU3RyaW5nOworCQkJCQljb3JuZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gZm9ybWF0LmJvcmRlclN0cmluZzsKKwkJCQkJY29ybmVyLnN0eWxlLmxlZnQgPSBmb3JtYXQuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQljb3JuZXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gIi0iICsgZm9ybWF0LmJvcmRlcldpZHRoICsgInB4IC0iICsgKGZvcm1hdC5oZWlnaHQgKyAoYm90dG9tSGVpZ2h0ICsgZm9ybWF0LmJvcmRlcldpZHRoKSkgKyAicHgiOworCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgImJyIjoKKwkJCQkJY29ybmVyLnN0eWxlLmhlaWdodCA9IGJvdHRvbUhlaWdodCAtIGZvcm1hdC5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCWNvcm5lci5zdHlsZS5tYXJnaW5MZWZ0ID0gb3B0aW9ucy5yYWRpaVtjY10gLSAoZm9ybWF0LmJvcmRlcldpZHRoICogMikgKyAicHgiOworCQkJCQljb3JuZXIuc3R5bGUuYm9yZGVyUmlnaHQgPSBmb3JtYXQuYm9yZGVyU3RyaW5nOworCQkJCQljb3JuZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gZm9ybWF0LmJvcmRlclN0cmluZzsKKwkJCQkJY29ybmVyLnN0eWxlLmxlZnQgPSBmb3JtYXQuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQljb3JuZXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gIi0iICsgKGJvdHRvbUhlaWdodCArIGZvcm1hdC5ib3JkZXJXaWR0aCkgKyAicHggLSIgKyAoZm9ybWF0LmhlaWdodCArIChib3R0b21IZWlnaHQgKyBmb3JtYXQuYm9yZGVyV2lkdGgpKSArICJweCI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhciBjb3JuZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCWNvcm5lci5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLnJhZGlpW2NjXSArICJweCI7CisJCQljb3JuZXIuc3R5bGUud2lkdGggPSBvcHRpb25zLnJhZGlpW2NjXSArICJweCI7CisJCQljb3JuZXIuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJY29ybmVyLnN0eWxlLmZvbnRTaXplID0gIjFweCI7CisJCQljb3JuZXIuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCXZhciBib3JkZXJSYWRpdXMgPSBNYXRoLmZsb29yKG9wdGlvbnMucmFkaWlbY2NdIC0gZm9ybWF0LmJvcmRlcldpZHRoKTsKKwkJCWZvciAodmFyIHggPSAwLCBqID0gb3B0aW9ucy5yYWRpaVtjY107IHggPCBqOyB4KyspIHsKKwkJCQl2YXIgeTEgPSBNYXRoLmZsb29yKE1hdGguc3FydChNYXRoLnBvdyhib3JkZXJSYWRpdXMsIDIpIC0gTWF0aC5wb3coKHggKyAxKSwgMikpKSAtIDE7CisJCQkJaWYgKCh4ICsgMSkgPj0gYm9yZGVyUmFkaXVzKSB7CisJCQkJCXZhciB5MSA9IC0xOworCQkJCX0KKwkJCQl2YXIgeTIgPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KE1hdGgucG93KGJvcmRlclJhZGl1cywgMikgLSBNYXRoLnBvdyh4LCAyKSkpOworCQkJCWlmICh4ID49IGJvcmRlclJhZGl1cykgeworCQkJCQl5MiA9IC0xOworCQkJCX0KKwkJCQl2YXIgeTMgPSBNYXRoLmZsb29yKE1hdGguc3FydChNYXRoLnBvdyhqLCAyKSAtIE1hdGgucG93KCh4ICsgMSksIDIpKSkgLSAxOworCQkJCWlmICgoeCArIDEpID49IGopIHsKKwkJCQkJeTMgPSAtMTsKKwkJCQl9CisJCQkJdmFyIHk0ID0gTWF0aC5jZWlsKE1hdGguc3FydChNYXRoLnBvdyhqLCAyKSAtIE1hdGgucG93KHgsIDIpKSk7CisJCQkJaWYgKHggPj0gaikgeworCQkJCQl5NCA9IC0xOworCQkJCX0KKwkJCQlpZiAoeTEgPiAtMSkgeworCQkJCQlmbnMuZHJhdyh4LCAwLCBmb3JtYXQuY29sb3IsIDEwMCwgKHkxICsgMSksIGNvcm5lciwgLTEsIGosIHRvcEhlaWdodCwgZm9ybWF0KTsKKwkJCQl9CisJCQkJZm9yICh2YXIgeSA9ICh5MSArIDEpOyB5IDwgeTI7IHkrKykgeworCQkJCQlpZiAob3B0aW9ucy5hbnRpQWxpYXMpIHsKKwkJCQkJCWlmIChmb3JtYXQuYmdJbWFnZSAhPSAiIikgeworCQkJCQkJCXZhciBmcmFjdCA9IGZucy5mcmFjdGlvbih4LCB5LCBib3JkZXJSYWRpdXMpICogMTAwOworCQkJCQkJCWlmIChmcmFjdCA8IDMwKSB7CisJCQkJCQkJCWZucy5kcmF3KHgsIHksIGZvcm1hdC5ib3JkZXJDb2xvciwgMTAwLCAxLCBjb3JuZXIsIDAsIG9wdGlvbnMucmFkaWlbY2NdLCB0b3BIZWlnaHQsIGZvcm1hdCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZm5zLmRyYXcoeCwgeSwgZm9ybWF0LmJvcmRlckNvbG9yLCAxMDAsIDEsIGNvcm5lciwgLTEsIG9wdGlvbnMucmFkaWlbY2NdLCB0b3BIZWlnaHQsIGZvcm1hdCk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl2YXIgY2xyID0gZm5zLmJsZW5kKGZvcm1hdC5jb2xvciwgZm9ybWF0LmJvcmRlckNvbG9yLCBmbnMuZnJhY3Rpb24oeCwgeSwgYm9yZGVyUmFkaXVzKSk7CisJCQkJCQkJZm5zLmRyYXcoeCwgeSwgY2xyLCAxMDAsIDEsIGNvcm5lciwgMCwgb3B0aW9ucy5yYWRpaVtjY10sIHRvcEhlaWdodCwgZm9ybWF0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAob3B0aW9ucy5hbnRpQWxpYXMpIHsKKwkJCQkJaWYgKHkzID49IHkyKSB7CisJCQkJCQlpZiAoeTIgPT0gLTEpIHsKKwkJCQkJCQl5MiA9IDA7CisJCQkJCQl9CisJCQkJCQlmbnMuZHJhdyh4LCB5MiwgZm9ybWF0LmJvcmRlckNvbG9yLCAxMDAsICh5MyAtIHkyICsgMSksIGNvcm5lciwgMCwgMCwgdG9wSGVpZ2h0LCBmb3JtYXQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHkzID49IHkxKSB7CisJCQkJCQkJZm5zLmRyYXcoeCwgKHkxICsgMSksIGZvcm1hdC5ib3JkZXJDb2xvciwgMTAwLCAoeTMgLSB5MSksIGNvcm5lciwgMCwgMCwgdG9wSGVpZ2h0LCBmb3JtYXQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWZvciAodmFyIHkgPSAoeTMgKyAxKTsgeSA8IHk0OyB5KyspIHsKKwkJCQkJCWZucy5kcmF3KHgsIHksIGZvcm1hdC5ib3JkZXJDb2xvciwgKGZucy5mcmFjdGlvbih4LCB5LCBqKSAqIDEwMCksIDEsIGNvcm5lciwgKGZvcm1hdC5ib3JkZXJXaWR0aCA+IDAgPyAwIDogLTEpLCBvcHRpb25zLnJhZGlpW2NjXSwgdG9wSGVpZ2h0LCBmb3JtYXQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJeTMgPSB5MTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY2MgIT0gImJyIikgeworCQkJCWZvciAodmFyIHQgPSAwLCBrID0gY29ybmVyLmNoaWxkTm9kZXMubGVuZ3RoOyB0IDwgazsgdCsrKSB7CisJCQkJCXZhciBiYXIgPSBjb3JuZXIuY2hpbGROb2Rlc1t0XTsKKwkJCQkJdmFyIGJhclRvcCA9IHBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKGJhciwgInRvcCIpKTsKKwkJCQkJdmFyIGJhckxlZnQgPSBwYXJzZUludChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShiYXIsICJsZWZ0IikpOworCQkJCQl2YXIgYmFySGVpZ2h0ID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUoYmFyLCAiaGVpZ2h0IikpOworCQkJCQlpZiAoY2MuY2hhckF0KDEpID09ICJsIikgeworCQkJCQkJYmFyLnN0eWxlLmxlZnQgPSAob3B0aW9ucy5yYWRpaVtjY10gLSBiYXJMZWZ0IC0gMSkgKyAicHgiOworCQkJCQl9CisJCQkJCWlmIChjYyA9PSAidHIiKSB7CisJCQkJCQliYXIuc3R5bGUudG9wID0gKG9wdGlvbnMucmFkaWlbY2NdIC0gYmFySGVpZ2h0IC0gYmFyVG9wKSArICJweCI7CisJCQkJCQliYXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gIi0iICsgTWF0aC5hYnMoKGZvcm1hdC53aWR0aCAtIG9wdGlvbnMucmFkaWlbY2NdICsgZm9ybWF0LmJvcmRlcldpZHRoKSArIGJhckxlZnQpICsgInB4IC0iICsgTWF0aC5hYnMob3B0aW9ucy5yYWRpaVtjY10gLSBiYXJIZWlnaHQgLSBiYXJUb3AgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjYyA9PSAidGwiKSB7CisJCQkJCQkJYmFyLnN0eWxlLnRvcCA9IChvcHRpb25zLnJhZGlpW2NjXSAtIGJhckhlaWdodCAtIGJhclRvcCkgKyAicHgiOworCQkJCQkJCWJhci5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSAiLSIgKyBNYXRoLmFicygob3B0aW9ucy5yYWRpaVtjY10gLSBiYXJMZWZ0IC0gMSkgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IC0iICsgTWF0aC5hYnMob3B0aW9ucy5yYWRpaVtjY10gLSBiYXJIZWlnaHQgLSBiYXJUb3AgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJYmFyLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICItIiArIE1hdGguYWJzKChvcHRpb25zLnJhZGlpW2NjXSArIGJhckxlZnQpICsgZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCAtIiArIE1hdGguYWJzKChmb3JtYXQuaGVpZ2h0ICsgb3B0aW9ucy5yYWRpaVtjY10gKyBiYXJUb3ApIC0gZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGNvcm5lcikgeworCQkJdmFyIHBzbiA9IFtdOworCQkJaWYgKGNjLmNoYXJBdCgwKSA9PSAidCIpIHsKKwkJCQlwc24ucHVzaCgidG9wIik7CisJCQl9IGVsc2UgeworCQkJCXBzbi5wdXNoKCJib3R0b20iKTsKKwkJCX0KKwkJCWlmIChjYy5jaGFyQXQoMSkgPT0gImwiKSB7CisJCQkJcHNuLnB1c2goImxlZnQiKTsKKwkJCX0gZWxzZSB7CisJCQkJcHNuLnB1c2goInJpZ2h0Iik7CisJCQl9CisJCQlpZiAoY29ybmVyLnN0eWxlLnBvc2l0aW9uID09ICJhYnNvbHV0ZSIpIHsKKwkJCQlmb3IgKHZhciB6ID0gMDsgeiA8IHBzbi5sZW5ndGg7IHorKykgeworCQkJCQljb3JuZXIuc3R5bGVbcHNuW3pdXSA9ICIwcHgiOworCQkJCX0KKwkJCX0KKwkJCWlmIChwc25bMF0gPT0gInRvcCIpIHsKKwkJCQlpZiAodG9wKSB7CisJCQkJCXRvcC5hcHBlbmRDaGlsZChjb3JuZXIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJvdHRvbSkgeworCQkJCQlib3R0b20uYXBwZW5kQ2hpbGQoY29ybmVyKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJdmFyIGRpZmYgPSB7dDpNYXRoLmFicyhvcHRpb25zLnJhZGlpLnRsIC0gb3B0aW9ucy5yYWRpaS50ciksIGI6TWF0aC5hYnMob3B0aW9ucy5yYWRpaS5ibCAtIG9wdGlvbnMucmFkaWkuYnIpfTsKKwlmb3IgKHZhciB6IGluIGRpZmYpIHsKKwkJdmFyIHNtYWxsZXIgPSAob3B0aW9ucy5yYWRpaVt6ICsgImwiXSA8IG9wdGlvbnMucmFkaWlbeiArICJyIl0gPyB6ICsgImwiIDogeiArICJyIik7CisJCXZhciBmaWxsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZmlsbGVyLnN0eWxlLmhlaWdodCA9IGRpZmZbel0gKyAicHgiOworCQlmaWxsZXIuc3R5bGUud2lkdGggPSBvcHRpb25zLnJhZGlpW3NtYWxsZXJdICsgInB4IjsKKwkJZmlsbGVyLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJZmlsbGVyLnN0eWxlLmZvbnRTaXplID0gIjFweCI7CisJCWZpbGxlci5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCQlmaWxsZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZm9ybWF0LmNvbG9yOworCQlzd2l0Y2ggKHNtYWxsZXIpIHsKKwkJICBjYXNlICJ0bCI6CisJCQlmaWxsZXIuc3R5bGUuYm90dG9tID0gIjBweCI7CisJCQlmaWxsZXIuc3R5bGUubGVmdCA9ICIwcHgiOworCQkJZmlsbGVyLnN0eWxlLmJvcmRlckxlZnQgPSBmb3JtYXQuYm9yZGVyU3RyaW5nOworCQkJdG9wLmFwcGVuZENoaWxkKGZpbGxlcik7CisJCQlicmVhazsKKwkJICBjYXNlICJ0ciI6CisJCQlmaWxsZXIuc3R5bGUuYm90dG9tID0gIjBweCI7CisJCQlmaWxsZXIuc3R5bGUucmlnaHQgPSAiMHB4IjsKKwkJCWZpbGxlci5zdHlsZS5ib3JkZXJSaWdodCA9IGZvcm1hdC5ib3JkZXJTdHJpbmc7CisJCQl0b3AuYXBwZW5kQ2hpbGQoZmlsbGVyKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgImJsIjoKKwkJCWZpbGxlci5zdHlsZS50b3AgPSAiMHB4IjsKKwkJCWZpbGxlci5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCQlmaWxsZXIuc3R5bGUuYm9yZGVyTGVmdCA9IGZvcm1hdC5ib3JkZXJTdHJpbmc7CisJCQlib3R0b20uYXBwZW5kQ2hpbGQoZmlsbGVyKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgImJyIjoKKwkJCWZpbGxlci5zdHlsZS50b3AgPSAiMHB4IjsKKwkJCWZpbGxlci5zdHlsZS5yaWdodCA9ICIwcHgiOworCQkJZmlsbGVyLnN0eWxlLmJvcmRlclJpZ2h0ID0gZm9ybWF0LmJvcmRlclN0cmluZzsKKwkJCWJvdHRvbS5hcHBlbmRDaGlsZChmaWxsZXIpOworCQkJYnJlYWs7CisJCX0KKwkJdmFyIGZpbGxCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZmlsbEJhci5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCWZpbGxCYXIuc3R5bGUuZm9udFNpemUgPSAiMXB4IjsKKwkJZmlsbEJhci5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCQlmaWxsQmFyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGZvcm1hdC5jb2xvcjsKKwkJZmlsbEJhci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBmb3JtYXQuYmdJbWFnZTsKKwkJaWYgKHogPT0gInQiKSB7CisJCQlpZiAodG9wKSB7CisJCQkJaWYgKG9wdGlvbnMucmFkaWkudGwgJiYgb3B0aW9ucy5yYWRpaS50cikgeworCQkJCQlmaWxsQmFyLnN0eWxlLmhlaWdodCA9ICh0b3BIZWlnaHQgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IjsKKwkJCQkJZmlsbEJhci5zdHlsZS5tYXJnaW5MZWZ0ID0gKG9wdGlvbnMucmFkaWkudGwgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IjsKKwkJCQkJZmlsbEJhci5zdHlsZS5tYXJnaW5SaWdodCA9IChvcHRpb25zLnJhZGlpLnRyIC0gZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCI7CisJCQkJCWZpbGxCYXIuc3R5bGUuYm9yZGVyVG9wID0gZm9ybWF0LmJvcmRlclN0cmluZzsKKwkJCQkJaWYgKGZvcm1hdC5iZ0ltYWdlICE9ICIiKSB7CisJCQkJCQlmaWxsQmFyLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICItIiArICh0b3BIZWlnaHQgKyBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IDBweCI7CisJCQkJCX0KKwkJCQl9CisJCQkJdG9wLmFwcGVuZENoaWxkKGZpbGxCYXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJvdHRvbSkgeworCQkJCWlmIChvcHRpb25zLnJhZGlpLmJsICYmIG9wdGlvbnMucmFkaWkuYnIpIHsKKwkJCQkJZmlsbEJhci5zdHlsZS5oZWlnaHQgPSAoYm90dG9tSGVpZ2h0IC0gZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCI7CisJCQkJCWZpbGxCYXIuc3R5bGUubWFyZ2luTGVmdCA9IChvcHRpb25zLnJhZGlpLmJsIC0gZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCI7CisJCQkJCWZpbGxCYXIuc3R5bGUubWFyZ2luUmlnaHQgPSAob3B0aW9ucy5yYWRpaS5iciAtIGZvcm1hdC5ib3JkZXJXaWR0aCkgKyAicHgiOworCQkJCQlmaWxsQmFyLnN0eWxlLmJvcmRlckJvdHRvbSA9IGZvcm1hdC5ib3JkZXJTdHJpbmc7CisJCQkJCWlmIChmb3JtYXQuYmdJbWFnZSAhPSAiIikgeworCQkJCQkJZmlsbEJhci5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSAiLSIgKyAoYm90dG9tSGVpZ2h0ICsgZm9ybWF0LmJvcmRlcldpZHRoKSArICJweCAtIiArIChmb3JtYXQuaGVpZ2h0ICsgKHRvcEhlaWdodCArIGZvcm1hdC5ib3JkZXJXaWR0aCkpICsgInB4IjsKKwkJCQkJfQorCQkJCX0KKwkJCQlib3R0b20uYXBwZW5kQ2hpbGQoZmlsbEJhcik7CisJCQl9CisJCX0KKwl9CisJaWYgKG9wdGlvbnMuYXV0b1BhZCAmJiBmb3JtYXQucGFkZGluZyA+IDApIHsKKwkJdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJY29udGVudC5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCWNvbnRlbnQuaW5uZXJIVE1MID0gZm9ybWF0LmNvbnRlbnQ7CisJCWNvbnRlbnQuY2xhc3NOYW1lID0gImF1dG9QYWREaXYiOworCQlpZiAodG9wSGVpZ2h0IDwgZm9ybWF0LnBhZGRpbmcpIHsKKwkJCWNvbnRlbnQuc3R5bGUucGFkZGluZ1RvcCA9IE1hdGguYWJzKHRvcEhlaWdodCAtIGZvcm1hdC5wYWRkaW5nKSArICJweCI7CisJCX0KKwkJaWYgKGJvdHRvbUhlaWdodCA8IGZvcm1hdC5wYWRkaW5nKSB7CisJCQljb250ZW50LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBNYXRoLmFicyhib3R0b21IZWlnaHQgLSBmb3JtYXQucGFkZGluZykgKyAicHgiOworCQl9CisJCWNvbnRlbnQuc3R5bGUucGFkZGluZ0xlZnQgPSBmb3JtYXQucGFkZGluZyArICJweCI7CisJCWNvbnRlbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gZm9ybWF0LnBhZGRpbmcgKyAicHgiOworCQlub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpOworCX0KK307Cit2YXIgY291bnQgPSAwOworZG9qby5sZngucm91bmRlZC5fZm5zID0ge2JsZW5kOmZ1bmN0aW9uIChjbHIxLCBjbHIyLCBmcmFjKSB7CisJdmFyIGMxID0ge3I6cGFyc2VJbnQoY2xyMS5zdWJzdHIoMSwgMiksIDE2KSwgZzpwYXJzZUludChjbHIxLnN1YnN0cigzLCAyKSwgMTYpLCBiOnBhcnNlSW50KGNscjEuc3Vic3RyKDUsIDIpLCAxNil9OworCXZhciBjMiA9IHtyOnBhcnNlSW50KGNscjIuc3Vic3RyKDEsIDIpLCAxNiksIGc6cGFyc2VJbnQoY2xyMi5zdWJzdHIoMywgMiksIDE2KSwgYjpwYXJzZUludChjbHIyLnN1YnN0cig1LCAyKSwgMTYpfTsKKwlpZiAoZnJhYyA+IDEgfHwgZnJhYyA8IDApIHsKKwkJZnJhYyA9IDE7CisJfQorCXZhciByZXQgPSBbTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5yb3VuZCgoYzEuciAqIGZyYWMpICsgKGMyLnIgKiAoMSAtIGZyYWMpKSksIDApLCAyNTUpLCBNYXRoLm1pbihNYXRoLm1heChNYXRoLnJvdW5kKChjMS5nICogZnJhYykgKyAoYzIuZyAqICgxIC0gZnJhYykpKSwgMCksIDI1NSksIE1hdGgubWluKE1hdGgubWF4KE1hdGgucm91bmQoKGMxLmIgKiBmcmFjKSArIChjMi5iICogKDEgLSBmcmFjKSkpLCAwKSwgMjU1KV07CisJZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHsKKwkJdmFyIG4gPSByZXRbaV0udG9TdHJpbmcoMTYpOworCQlpZiAobi5sZW5ndGggPCAyKSB7CisJCQluID0gIjAiICsgbjsKKwkJfQorCQlyZXRbaV0gPSBuOworCX0KKwlyZXR1cm4gIiMiICsgcmV0LmpvaW4oIiIpOworfSwgZnJhY3Rpb246ZnVuY3Rpb24gKHgsIHksIHIpIHsKKwl2YXIgZnJhYyA9IDA7CisJdmFyIHh2YWwgPSBbXTsKKwl2YXIgeXZhbCA9IFtdOworCXZhciBwb2ludCA9IDA7CisJdmFyIHdoYXRzaWRlcyA9ICIiOworCXZhciBpbnRlcnNlY3QgPSBNYXRoLnNxcnQoKE1hdGgucG93KHIsIDIpIC0gTWF0aC5wb3coeCwgMikpKTsKKwlpZiAoaW50ZXJzZWN0ID49IHkgJiYgaW50ZXJzZWN0IDwgKHkgKyAxKSkgeworCQl3aGF0c2lkZXMgPSAiTGVmdCI7CisJCXh2YWxbcG9pbnRdID0gMDsKKwkJeXZhbFtwb2ludCsrXSA9IGludGVyc2VjdCAtIHk7CisJfQorCWludGVyc2VjdCA9IE1hdGguc3FydCgoTWF0aC5wb3cociwgMikgLSBNYXRoLnBvdyh5ICsgMSwgMikpKTsKKwlpZiAoaW50ZXJzZWN0ID49IHggJiYgaW50ZXJzZWN0IDwgKHggKyAxKSkgeworCQl3aGF0c2lkZXMgKz0gIlRvcCI7CisJCXh2YWxbcG9pbnRdID0gaW50ZXJzZWN0IC0geDsKKwkJeXZhbFtwb2ludCsrXSA9IDE7CisJfQorCWludGVyc2VjdCA9IE1hdGguc3FydCgoTWF0aC5wb3cociwgMikgLSBNYXRoLnBvdyh4ICsgMSwgMikpKTsKKwlpZiAoaW50ZXJzZWN0ID49IHkgJiYgaW50ZXJzZWN0IDwgKHkgKyAxKSkgeworCQl3aGF0c2lkZXMgKz0gIlJpZ2h0IjsKKwkJeHZhbFtwb2ludF0gPSAxOworCQl5dmFsW3BvaW50KytdID0gaW50ZXJzZWN0IC0geTsKKwl9CisJaW50ZXJzZWN0ID0gTWF0aC5zcXJ0KChNYXRoLnBvdyhyLCAyKSAtIE1hdGgucG93KHksIDIpKSk7CisJaWYgKGludGVyc2VjdCA+PSB4ICYmIGludGVyc2VjdCA8ICh4ICsgMSkpIHsKKwkJd2hhdHNpZGVzICs9ICJCb3R0b20iOworCQl4dmFsW3BvaW50XSA9IGludGVyc2VjdCAtIHg7CisJCXl2YWxbcG9pbnRdID0gMTsKKwl9CisJc3dpdGNoICh3aGF0c2lkZXMpIHsKKwkgIGNhc2UgIkxlZnRSaWdodCI6CisJCXJldHVybiBNYXRoLm1pbih5dmFsWzBdLCB5dmFsWzFdKSArICgoTWF0aC5tYXgoeXZhbFswXSwgeXZhbFsxXSkgLSBNYXRoLm1pbih5dmFsWzBdLCB5dmFsWzFdKSkgLyAyKTsKKwkgIGNhc2UgIlRvcFJpZ2h0IjoKKwkJcmV0dXJuIDEgLSAoKCgxIC0geHZhbFswXSkgKiAoMSAtIHl2YWxbMV0pKSAvIDIpOworCSAgY2FzZSAiVG9wQm90dG9tIjoKKwkJcmV0dXJuIE1hdGgubWluKHh2YWxbMF0sIHh2YWxbMV0pICsgKChNYXRoLm1heCh4dmFsWzBdLCB4dmFsWzFdKSAtIE1hdGgubWluKHh2YWxbMF0sIHh2YWxbMV0pKSAvIDIpOworCSAgY2FzZSAiTGVmdEJvdHRvbSI6CisJCXJldHVybiAoeXZhbFswXSAqIHh2YWxbMV0pIC8gMjsKKwkgIGRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30sIGRyYXc6ZnVuY3Rpb24gKHgsIHksIGNvbG9yLCBvcGFjLCBoZWlnaHQsIGNvcm5lciwgaW1hZ2UsIHJhZGl1cywgdG9wLCBmb3JtYXQpIHsKKwl2YXIgcHggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlweC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOworCXB4LnN0eWxlLndpZHRoID0gIjFweCI7CisJcHguc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCXB4LnN0eWxlLmZvbnRTaXplID0gIjFweCI7CisJcHguc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwlpZiAoaW1hZ2UgPT0gLTEgJiYgZm9ybWF0LmJnSW1hZ2UgIT0gIiIpIHsKKwkJcHguc3R5bGUuYmFja2dyb3VuZEltYWdlID0gZm9ybWF0LmJnSW1hZ2U7CisJCXB4LnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICItIiArIChmb3JtYXQud2lkdGggLSAocmFkaXVzIC0geCkgKyBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IC0iICsgKChmb3JtYXQuaGVpZ2h0ICsgdG9wICsgeSkgLSBmb3JtYXQuYm9yZGVyV2lkdGgpICsgInB4IjsKKwl9IGVsc2UgeworCQlweC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKKwl9CisJaWYgKG9wYWMgIT0gMTAwKSB7CisJCWRvam8uaHRtbC5zZXRPcGFjaXR5KHB4LCAob3BhYyAvIDEwMCkpOworCX0KKwlweC5zdHlsZS50b3AgPSB5ICsgInB4IjsKKwlweC5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJY29ybmVyLmFwcGVuZENoaWxkKHB4KTsKK30sIGdldFJHQjpmdW5jdGlvbiAoY2xyKSB7CisJdmFyIHJldCA9ICIjZmZmZmZmIjsKKwlpZiAoY2xyICE9ICIiICYmIGNsciAhPSAidHJhbnNwYXJlbnQiKSB7CisJCWlmIChjbHIuc3Vic3RyKDAsIDMpID09ICJyZ2IiKSB7CisJCQl2YXIgdCA9IGNsci5zdWJzdHJpbmcoNCwgY2xyLmluZGV4T2YoIikiKSk7CisJCQl0ID0gdC5zcGxpdCgiLCIpOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIG4gPSBwYXJzZUludCh0W2ldKS50b1N0cmluZygxNik7CisJCQkJaWYgKG4ubGVuZ3RoIDwgMikgeworCQkJCQluID0gIjAiICsgbjsKKwkJCQl9CisJCQkJdFtpXSA9IG47CisJCQl9CisJCQlyZXQgPSAiIyIgKyB0LmpvaW4oIiIpOworCQl9IGVsc2UgeworCQkJaWYgKGNsci5sZW5ndGggPT0gNCkgeworCQkJCXJldCA9ICIjIiArIGNsci5zdWJzdHJpbmcoMSwgMikgKyBjbHIuc3Vic3RyaW5nKDEsIDIpICsgY2xyLnN1YnN0cmluZygyLCAzKSArIGNsci5zdWJzdHJpbmcoMiwgMykgKyBjbHIuc3Vic3RyaW5nKDMsIDQpICsgY2xyLnN1YnN0cmluZygzLCA0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY2xyOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC9zaGFkb3cuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbGZ4L3NoYWRvdy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzYyZmFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC9zaGFkb3cuanMKQEAgLTAsMCArMSw3NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguc2hhZG93Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuVXJpIik7Citkb2pvLmxmeC5zaGFkb3cgPSBmdW5jdGlvbiAobm9kZSkgeworCXRoaXMuc2hhZG93UG5nID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLmh0bWwiLCAiaW1hZ2VzL3NoYWRvdyIpOworCXRoaXMuc2hhZG93VGhpY2tuZXNzID0gODsKKwl0aGlzLnNoYWRvd09mZnNldCA9IDE1OworCXRoaXMuaW5pdChub2RlKTsKK307Citkb2pvLmV4dGVuZChkb2pvLmxmeC5zaGFkb3csIHtpbml0OmZ1bmN0aW9uIChub2RlKSB7CisJdGhpcy5ub2RlID0gbm9kZTsKKwl0aGlzLnBpZWNlcyA9IHt9OworCXZhciB4MSA9IC0xICogdGhpcy5zaGFkb3dUaGlja25lc3M7CisJdmFyIHkwID0gdGhpcy5zaGFkb3dPZmZzZXQ7CisJdmFyIHkxID0gdGhpcy5zaGFkb3dPZmZzZXQgKyB0aGlzLnNoYWRvd1RoaWNrbmVzczsKKwl0aGlzLl9tYWtlUGllY2UoInRsIiwgInRvcCIsIHkwLCAibGVmdCIsIHgxKTsKKwl0aGlzLl9tYWtlUGllY2UoImwiLCAidG9wIiwgeTEsICJsZWZ0IiwgeDEsICJzY2FsZSIpOworCXRoaXMuX21ha2VQaWVjZSgidHIiLCAidG9wIiwgeTAsICJsZWZ0IiwgMCk7CisJdGhpcy5fbWFrZVBpZWNlKCJyIiwgInRvcCIsIHkxLCAibGVmdCIsIDAsICJzY2FsZSIpOworCXRoaXMuX21ha2VQaWVjZSgiYmwiLCAidG9wIiwgMCwgImxlZnQiLCB4MSk7CisJdGhpcy5fbWFrZVBpZWNlKCJiIiwgInRvcCIsIDAsICJsZWZ0IiwgMCwgImNyb3AiKTsKKwl0aGlzLl9tYWtlUGllY2UoImJyIiwgInRvcCIsIDAsICJsZWZ0IiwgMCk7Cit9LCBfbWFrZVBpZWNlOmZ1bmN0aW9uIChuYW1lLCB2ZXJ0QXR0YWNoLCB2ZXJ0Q29vcmQsIGhvcnpBdHRhY2gsIGhvcnpDb29yZCwgc2l6aW5nKSB7CisJdmFyIGltZzsKKwl2YXIgdXJsID0gdGhpcy5zaGFkb3dQbmcgKyBuYW1lLnRvVXBwZXJDYXNlKCkgKyAiLnBuZyI7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApIHsKKwkJaW1nID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJaW1nLnN0eWxlLmZpbHRlciA9ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihzcmM9JyIgKyB1cmwgKyAiJyIgKyAoc2l6aW5nID8gIiwgc2l6aW5nTWV0aG9kPSciICsgc2l6aW5nICsgIiciIDogIiIpICsgIikiOworCX0gZWxzZSB7CisJCWltZyA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiaW1nIik7CisJCWltZy5zcmMgPSB1cmw7CisJfQorCWltZy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJaW1nLnN0eWxlW3ZlcnRBdHRhY2hdID0gdmVydENvb3JkICsgInB4IjsKKwlpbWcuc3R5bGVbaG9yekF0dGFjaF0gPSBob3J6Q29vcmQgKyAicHgiOworCWltZy5zdHlsZS53aWR0aCA9IHRoaXMuc2hhZG93VGhpY2tuZXNzICsgInB4IjsKKwlpbWcuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaGFkb3dUaGlja25lc3MgKyAicHgiOworCXRoaXMucGllY2VzW25hbWVdID0gaW1nOworCXRoaXMubm9kZS5hcHBlbmRDaGlsZChpbWcpOworfSwgc2l6ZTpmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgeworCXZhciBzaWRlSGVpZ2h0ID0gaGVpZ2h0IC0gKHRoaXMuc2hhZG93T2Zmc2V0ICsgdGhpcy5zaGFkb3dUaGlja25lc3MgKyAxKTsKKwlpZiAoc2lkZUhlaWdodCA8IDApIHsKKwkJc2lkZUhlaWdodCA9IDA7CisJfQorCWlmIChoZWlnaHQgPCAxKSB7CisJCWhlaWdodCA9IDE7CisJfQorCWlmICh3aWR0aCA8IDEpIHsKKwkJd2lkdGggPSAxOworCX0KKwl3aXRoICh0aGlzLnBpZWNlcykgeworCQlsLnN0eWxlLmhlaWdodCA9IHNpZGVIZWlnaHQgKyAicHgiOworCQlyLnN0eWxlLmhlaWdodCA9IHNpZGVIZWlnaHQgKyAicHgiOworCQliLnN0eWxlLndpZHRoID0gKHdpZHRoIC0gMSkgKyAicHgiOworCQlibC5zdHlsZS50b3AgPSAoaGVpZ2h0IC0gMSkgKyAicHgiOworCQliLnN0eWxlLnRvcCA9IChoZWlnaHQgLSAxKSArICJweCI7CisJCWJyLnN0eWxlLnRvcCA9IChoZWlnaHQgLSAxKSArICJweCI7CisJCXRyLnN0eWxlLmxlZnQgPSAod2lkdGggLSAxKSArICJweCI7CisJCXIuc3R5bGUubGVmdCA9ICh3aWR0aCAtIDEpICsgInB4IjsKKwkJYnIuc3R5bGUubGVmdCA9ICh3aWR0aCAtIDEpICsgInB4IjsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvdG9nZ2xlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xmeC90b2dnbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sZngvdG9nZ2xlLmpzCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubGZ4LnRvZ2dsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7Citkb2pvLmxmeC50b2dnbGUucGxhaW4gPSB7c2hvdzpmdW5jdGlvbiAobm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlkb2pvLmh0bWwuc2hvdyhub2RlKTsKKwlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CisJCWNhbGxiYWNrKCk7CisJfQorfSwgaGlkZTpmdW5jdGlvbiAobm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIHsKKwlkb2pvLmh0bWwuaGlkZShub2RlKTsKKwlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CisJCWNhbGxiYWNrKCk7CisJfQorfX07Citkb2pvLmxmeC50b2dnbGUuZmFkZSA9IHtzaG93OmZ1bmN0aW9uIChub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCWRvam8ubGZ4LmZhZGVTaG93KG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKS5wbGF5KCk7Cit9LCBoaWRlOmZ1bmN0aW9uIChub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCWRvam8ubGZ4LmZhZGVIaWRlKG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKS5wbGF5KCk7Cit9fTsKK2Rvam8ubGZ4LnRvZ2dsZS53aXBlID0ge3Nob3c6ZnVuY3Rpb24gKG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSB7CisJZG9qby5sZngud2lwZUluKG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKS5wbGF5KCk7Cit9LCBoaWRlOmZ1bmN0aW9uIChub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykgeworCWRvam8ubGZ4LndpcGVPdXQobm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spLnBsYXkoKTsKK319OworZG9qby5sZngudG9nZ2xlLmV4cGxvZGUgPSB7c2hvdzpmdW5jdGlvbiAobm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2ssIGV4cGxvZGVTcmMpIHsKKwlkb2pvLmxmeC5leHBsb2RlKGV4cGxvZGVTcmMgfHwge3g6MCwgeTowLCB3aWR0aDowLCBoZWlnaHQ6MH0sIG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKS5wbGF5KCk7Cit9LCBoaWRlOmZ1bmN0aW9uIChub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaywgZXhwbG9kZVNyYykgeworCWRvam8ubGZ4LmltcGxvZGUobm9kZSwgZXhwbG9kZVNyYyB8fCB7eDowLCB5OjAsIHdpZHRoOjAsIGhlaWdodDowfSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spLnBsYXkoKTsKK319OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9hZGVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xvYWRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RlMTQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xvYWRlci5qcwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyhmdW5jdGlvbiAoKSB7CisJdmFyIF9hZGRIb3N0RW52ID0ge3BrZ0ZpbGVOYW1lOiJfX3BhY2thZ2VfXyIsIGxvYWRpbmdfbW9kdWxlc186e30sIGxvYWRlZF9tb2R1bGVzXzp7fSwgYWRkZWRUb0xvYWRpbmdDb3VudDpbXSwgcmVtb3ZlZEZyb21Mb2FkaW5nQ291bnQ6W10sIGluRmxpZ2h0Q291bnQ6MCwgbW9kdWxlUHJlZml4ZXNfOntkb2pvOntuYW1lOiJkb2pvIiwgdmFsdWU6InNyYyJ9fSwgc2V0TW9kdWxlUHJlZml4OmZ1bmN0aW9uIChtb2R1bGUsIHByZWZpeCkgeworCQl0aGlzLm1vZHVsZVByZWZpeGVzX1ttb2R1bGVdID0ge25hbWU6bW9kdWxlLCB2YWx1ZTpwcmVmaXh9OworCX0sIG1vZHVsZUhhc1ByZWZpeDpmdW5jdGlvbiAobW9kdWxlKSB7CisJCXZhciBtcCA9IHRoaXMubW9kdWxlUHJlZml4ZXNfOworCQlyZXR1cm4gQm9vbGVhbihtcFttb2R1bGVdICYmIG1wW21vZHVsZV0udmFsdWUpOworCX0sIGdldE1vZHVsZVByZWZpeDpmdW5jdGlvbiAobW9kdWxlKSB7CisJCWlmICh0aGlzLm1vZHVsZUhhc1ByZWZpeChtb2R1bGUpKSB7CisJCQlyZXR1cm4gdGhpcy5tb2R1bGVQcmVmaXhlc19bbW9kdWxlXS52YWx1ZTsKKwkJfQorCQlyZXR1cm4gbW9kdWxlOworCX0sIGdldFRleHRTdGFjazpbXSwgbG9hZFVyaVN0YWNrOltdLCBsb2FkZWRVcmlzOltdLCBwb3N0X2xvYWRfOmZhbHNlLCBtb2R1bGVzTG9hZGVkTGlzdGVuZXJzOltdLCB1bmxvYWRMaXN0ZW5lcnM6W10sIGxvYWROb3RpZnlpbmc6ZmFsc2V9OworCWZvciAodmFyIHBhcmFtIGluIF9hZGRIb3N0RW52KSB7CisJCWRvam8uaG9zdGVudltwYXJhbV0gPSBfYWRkSG9zdEVudltwYXJhbV07CisJfQorfSkoKTsKK2Rvam8uaG9zdGVudi5sb2FkUGF0aCA9IGZ1bmN0aW9uIChyZWxwYXRoLCBtb2R1bGUsIGNiKSB7CisJdmFyIHVyaTsKKwlpZiAocmVscGF0aC5jaGFyQXQoMCkgPT0gIi8iIHx8IHJlbHBhdGgubWF0Y2goL15cdys6LykpIHsKKwkJdXJpID0gcmVscGF0aDsKKwl9IGVsc2UgeworCQl1cmkgPSB0aGlzLmdldEJhc2VTY3JpcHRVcmkoKSArIHJlbHBhdGg7CisJfQorCWlmIChkakNvbmZpZy5jYWNoZUJ1c3QgJiYgZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSB7CisJCXVyaSArPSAiPyIgKyBTdHJpbmcoZGpDb25maWcuY2FjaGVCdXN0KS5yZXBsYWNlKC9cVysvZywgIiIpOworCX0KKwl0cnkgeworCQlyZXR1cm4gIW1vZHVsZSA/IHRoaXMubG9hZFVyaSh1cmksIGNiKSA6IHRoaXMubG9hZFVyaUFuZENoZWNrKHVyaSwgbW9kdWxlLCBjYik7CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoZSk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmkgPSBmdW5jdGlvbiAodXJpLCBjYikgeworCWlmICh0aGlzLmxvYWRlZFVyaXNbdXJpXSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJdmFyIGNvbnRlbnRzID0gdGhpcy5nZXRUZXh0KHVyaSwgbnVsbCwgdHJ1ZSk7CisJaWYgKCFjb250ZW50cykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMubG9hZGVkVXJpc1t1cmldID0gdHJ1ZTsKKwlpZiAoY2IpIHsKKwkJY29udGVudHMgPSAiKCIgKyBjb250ZW50cyArICIpIjsKKwl9CisJdmFyIHZhbHVlID0gZGpfZXZhbChjb250ZW50cyk7CisJaWYgKGNiKSB7CisJCWNiKHZhbHVlKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmlBbmRDaGVjayA9IGZ1bmN0aW9uICh1cmksIG1vZHVsZU5hbWUsIGNiKSB7CisJdmFyIG9rID0gdHJ1ZTsKKwl0cnkgeworCQlvayA9IHRoaXMubG9hZFVyaSh1cmksIGNiKTsKKwl9CisJY2F0Y2ggKGUpIHsKKwkJZG9qby5kZWJ1ZygiZmFpbGVkIGxvYWRpbmcgIiwgdXJpLCAiIHdpdGggZXJyb3I6ICIsIGUpOworCX0KKwlyZXR1cm4gQm9vbGVhbihvayAmJiB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpKTsKK307Citkb2pvLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHsKK307Citkb2pvLnVubG9hZGVkID0gZnVuY3Rpb24gKCkgeworfTsKK2Rvam8uaG9zdGVudi5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7CisJdGhpcy5sb2FkTm90aWZ5aW5nID0gdHJ1ZTsKKwl0aGlzLnBvc3RfbG9hZF8gPSB0cnVlOworCXZhciBtbGwgPSB0aGlzLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnM7CisJZm9yICh2YXIgeCA9IDA7IHggPCBtbGwubGVuZ3RoOyB4KyspIHsKKwkJbWxsW3hdKCk7CisJfQorCXRoaXMubW9kdWxlc0xvYWRlZExpc3RlbmVycyA9IFtdOworCXRoaXMubG9hZE5vdGlmeWluZyA9IGZhbHNlOworCWRvam8ubG9hZGVkKCk7Cit9OworZG9qby5ob3N0ZW52LnVubG9hZGVkID0gZnVuY3Rpb24gKCkgeworCXZhciBtbGwgPSB0aGlzLnVubG9hZExpc3RlbmVyczsKKwl3aGlsZSAobWxsLmxlbmd0aCkgeworCQkobWxsLnBvcCgpKSgpOworCX0KKwlkb2pvLnVubG9hZGVkKCk7Cit9OworZG9qby5hZGRPbkxvYWQgPSBmdW5jdGlvbiAob2JqLCBmdW5jdGlvbk5hbWUpIHsKKwl2YXIgZGggPSBkb2pvLmhvc3RlbnY7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQlkaC5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnB1c2gob2JqKTsKKwl9IGVsc2UgeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKwkJCWRoLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMucHVzaChmdW5jdGlvbiAoKSB7CisJCQkJb2JqW2Z1bmN0aW9uTmFtZV0oKTsKKwkJCX0pOworCQl9CisJfQorCWlmIChkaC5wb3N0X2xvYWRfICYmIGRoLmluRmxpZ2h0Q291bnQgPT0gMCAmJiAhZGgubG9hZE5vdGlmeWluZykgeworCQlkaC5jYWxsTG9hZGVkKCk7CisJfQorfTsKK2Rvam8uYWRkT25VbmxvYWQgPSBmdW5jdGlvbiAob2JqLCBmdW5jdGlvbk5hbWUpIHsKKwl2YXIgZGggPSBkb2pvLmhvc3RlbnY7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQlkaC51bmxvYWRMaXN0ZW5lcnMucHVzaChvYmopOworCX0gZWxzZSB7CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworCQkJZGgudW5sb2FkTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24gKCkgeworCQkJCW9ialtmdW5jdGlvbk5hbWVdKCk7CisJCQl9KTsKKwkJfQorCX0KK307Citkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5wb3N0X2xvYWRfKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMubG9hZFVyaVN0YWNrLmxlbmd0aCA9PSAwICYmIHRoaXMuZ2V0VGV4dFN0YWNrLmxlbmd0aCA9PSAwKSB7CisJCWlmICh0aGlzLmluRmxpZ2h0Q291bnQgPiAwKSB7CisJCQlkb2pvLmRlYnVnKCJmaWxlcyBzdGlsbCBpbiBmbGlnaHQhIik7CisJCQlyZXR1cm47CisJCX0KKwkJZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQoKTsKKwl9Cit9OworZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQgPSBmdW5jdGlvbiAoKSB7CisJaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09ICJvYmplY3QiIHx8IChkakNvbmZpZ1sidXNlWERvbWFpbiJdICYmIGRvam8ucmVuZGVyLmh0bWwub3BlcmEpKSB7CisJCXNldFRpbWVvdXQoImRvam8uaG9zdGVudi5sb2FkZWQoKTsiLCAwKTsKKwl9IGVsc2UgeworCQlkb2pvLmhvc3RlbnYubG9hZGVkKCk7CisJfQorfTsKK2Rvam8uaG9zdGVudi5nZXRNb2R1bGVTeW1ib2xzID0gZnVuY3Rpb24gKG1vZHVsZW5hbWUpIHsKKwl2YXIgc3ltcyA9IG1vZHVsZW5hbWUuc3BsaXQoIi4iKTsKKwlmb3IgKHZhciBpID0gc3ltcy5sZW5ndGg7IGkgPiAwOyBpLS0pIHsKKwkJdmFyIHBhcmVudE1vZHVsZSA9IHN5bXMuc2xpY2UoMCwgaSkuam9pbigiLiIpOworCQlpZiAoKGkgPT0gMSkgJiYgIXRoaXMubW9kdWxlSGFzUHJlZml4KHBhcmVudE1vZHVsZSkpIHsKKwkJCXN5bXNbMF0gPSAiLi4vIiArIHN5bXNbMF07CisJCX0gZWxzZSB7CisJCQl2YXIgcGFyZW50TW9kdWxlUGF0aCA9IHRoaXMuZ2V0TW9kdWxlUHJlZml4KHBhcmVudE1vZHVsZSk7CisJCQlpZiAocGFyZW50TW9kdWxlUGF0aCAhPSBwYXJlbnRNb2R1bGUpIHsKKwkJCQlzeW1zLnNwbGljZSgwLCBpLCBwYXJlbnRNb2R1bGVQYXRoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3ltczsKK307Citkb2pvLmhvc3RlbnYuX2dsb2JhbF9vbWl0X21vZHVsZV9jaGVjayA9IGZhbHNlOworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSwgZXhhY3RPbmx5LCBvbWl0TW9kdWxlQ2hlY2spIHsKKwlpZiAoIW1vZHVsZU5hbWUpIHsKKwkJcmV0dXJuOworCX0KKwlvbWl0TW9kdWxlQ2hlY2sgPSB0aGlzLl9nbG9iYWxfb21pdF9tb2R1bGVfY2hlY2sgfHwgb21pdE1vZHVsZUNoZWNrOworCXZhciBtb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCWlmIChtb2R1bGUpIHsKKwkJcmV0dXJuIG1vZHVsZTsKKwl9CisJaWYgKGRqX3VuZGVmKG1vZHVsZU5hbWUsIHRoaXMubG9hZGluZ19tb2R1bGVzXykpIHsKKwkJdGhpcy5hZGRlZFRvTG9hZGluZ0NvdW50LnB1c2gobW9kdWxlTmFtZSk7CisJfQorCXRoaXMubG9hZGluZ19tb2R1bGVzX1ttb2R1bGVOYW1lXSA9IDE7CisJdmFyIHJlbHBhdGggPSBtb2R1bGVOYW1lLnJlcGxhY2UoL1wuL2csICIvIikgKyAiLmpzIjsKKwl2YXIgbnN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCIuIik7CisJdmFyIHN5bXMgPSB0aGlzLmdldE1vZHVsZVN5bWJvbHMobW9kdWxlTmFtZSk7CisJdmFyIHN0YXJ0ZWRSZWxhdGl2ZSA9ICgoc3ltc1swXS5jaGFyQXQoMCkgIT0gIi8iKSAmJiAhc3ltc1swXS5tYXRjaCgvXlx3KzovKSk7CisJdmFyIGxhc3QgPSBzeW1zW3N5bXMubGVuZ3RoIC0gMV07CisJdmFyIG9rOworCWlmIChsYXN0ID09ICIqIikgeworCQltb2R1bGVOYW1lID0gbnN5bXMuc2xpY2UoMCwgLTEpLmpvaW4oIi4iKTsKKwkJd2hpbGUgKHN5bXMubGVuZ3RoKSB7CisJCQlzeW1zLnBvcCgpOworCQkJc3ltcy5wdXNoKHRoaXMucGtnRmlsZU5hbWUpOworCQkJcmVscGF0aCA9IHN5bXMuam9pbigiLyIpICsgIi5qcyI7CisJCQlpZiAoc3RhcnRlZFJlbGF0aXZlICYmIHJlbHBhdGguY2hhckF0KDApID09ICIvIikgeworCQkJCXJlbHBhdGggPSByZWxwYXRoLnNsaWNlKDEpOworCQkJfQorCQkJb2sgPSB0aGlzLmxvYWRQYXRoKHJlbHBhdGgsICFvbWl0TW9kdWxlQ2hlY2sgPyBtb2R1bGVOYW1lIDogbnVsbCk7CisJCQlpZiAob2spIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN5bXMucG9wKCk7CisJCX0KKwl9IGVsc2UgeworCQlyZWxwYXRoID0gc3ltcy5qb2luKCIvIikgKyAiLmpzIjsKKwkJbW9kdWxlTmFtZSA9IG5zeW1zLmpvaW4oIi4iKTsKKwkJdmFyIG1vZEFyZyA9ICFvbWl0TW9kdWxlQ2hlY2sgPyBtb2R1bGVOYW1lIDogbnVsbDsKKwkJb2sgPSB0aGlzLmxvYWRQYXRoKHJlbHBhdGgsIG1vZEFyZyk7CisJCWlmICghb2sgJiYgIWV4YWN0T25seSkgeworCQkJc3ltcy5wb3AoKTsKKwkJCXdoaWxlIChzeW1zLmxlbmd0aCkgeworCQkJCXJlbHBhdGggPSBzeW1zLmpvaW4oIi8iKSArICIuanMiOworCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmIChvaykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc3ltcy5wb3AoKTsKKwkJCQlyZWxwYXRoID0gc3ltcy5qb2luKCIvIikgKyAiLyIgKyB0aGlzLnBrZ0ZpbGVOYW1lICsgIi5qcyI7CisJCQkJaWYgKHN0YXJ0ZWRSZWxhdGl2ZSAmJiByZWxwYXRoLmNoYXJBdCgwKSA9PSAiLyIpIHsKKwkJCQkJcmVscGF0aCA9IHJlbHBhdGguc2xpY2UoMSk7CisJCQkJfQorCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmIChvaykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFvayAmJiAhb21pdE1vZHVsZUNoZWNrKSB7CisJCQlkb2pvLnJhaXNlKCJDb3VsZCBub3QgbG9hZCAnIiArIG1vZHVsZU5hbWUgKyAiJzsgbGFzdCB0cmllZCAnIiArIHJlbHBhdGggKyAiJyIpOworCQl9CisJfQorCWlmICghb21pdE1vZHVsZUNoZWNrICYmICF0aGlzWyJpc1hEb21haW4iXSkgeworCQltb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCQlpZiAoIW1vZHVsZSkgeworCQkJZG9qby5yYWlzZSgic3ltYm9sICciICsgbW9kdWxlTmFtZSArICInIGlzIG5vdCBkZWZpbmVkIGFmdGVyIGxvYWRpbmcgJyIgKyByZWxwYXRoICsgIiciKTsKKwkJfQorCX0KKwlyZXR1cm4gbW9kdWxlOworfTsKK2Rvam8uaG9zdGVudi5zdGFydFBhY2thZ2UgPSBmdW5jdGlvbiAocGFja2FnZU5hbWUpIHsKKwl2YXIgZnVsbFBrZ05hbWUgPSBTdHJpbmcocGFja2FnZU5hbWUpOworCXZhciBzdHJpcHBlZFBrZ05hbWUgPSBmdWxsUGtnTmFtZTsKKwl2YXIgc3ltcyA9IHBhY2thZ2VOYW1lLnNwbGl0KC9cLi8pOworCWlmIChzeW1zW3N5bXMubGVuZ3RoIC0gMV0gPT0gIioiKSB7CisJCXN5bXMucG9wKCk7CisJCXN0cmlwcGVkUGtnTmFtZSA9IHN5bXMuam9pbigiLiIpOworCX0KKwl2YXIgZXZhbGVkUGtnID0gZG9qby5ldmFsT2JqUGF0aChzdHJpcHBlZFBrZ05hbWUsIHRydWUpOworCXRoaXMubG9hZGVkX21vZHVsZXNfW2Z1bGxQa2dOYW1lXSA9IGV2YWxlZFBrZzsKKwl0aGlzLmxvYWRlZF9tb2R1bGVzX1tzdHJpcHBlZFBrZ05hbWVdID0gZXZhbGVkUGtnOworCXJldHVybiBldmFsZWRQa2c7Cit9OworZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSwgbXVzdEV4aXN0KSB7CisJdmFyIGxtbiA9IFN0cmluZyhtb2R1bGVOYW1lKTsKKwlpZiAodGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXSkgeworCQlyZXR1cm4gdGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXTsKKwl9CisJaWYgKG11c3RFeGlzdCkgeworCQlkb2pvLnJhaXNlKCJubyBsb2FkZWQgbW9kdWxlIG5hbWVkICciICsgbW9kdWxlTmFtZSArICInIik7CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUgPSBmdW5jdGlvbiAobW9kTWFwKSB7CisJdmFyIGNvbW1vbiA9IG1vZE1hcFsiY29tbW9uIl0gfHwgW107CisJdmFyIHJlc3VsdCA9IG1vZE1hcFtkb2pvLmhvc3RlbnYubmFtZV9dID8gY29tbW9uLmNvbmNhdChtb2RNYXBbZG9qby5ob3N0ZW52Lm5hbWVfXSB8fCBbXSkgOiBjb21tb24uY29uY2F0KG1vZE1hcFsiZGVmYXVsdCJdIHx8IFtdKTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IHJlc3VsdC5sZW5ndGg7IHgrKykgeworCQl2YXIgY3VyciA9IHJlc3VsdFt4XTsKKwkJaWYgKGN1cnIuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKKwkJCWRvam8uaG9zdGVudi5sb2FkTW9kdWxlLmFwcGx5KGRvam8uaG9zdGVudiwgY3Vycik7CisJCX0gZWxzZSB7CisJCQlkb2pvLmhvc3RlbnYubG9hZE1vZHVsZShjdXJyKTsKKwkJfQorCX0KK307Citkb2pvLnJlcXVpcmUgPSBmdW5jdGlvbiAocmVzb3VyY2VOYW1lKSB7CisJZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUuYXBwbHkoZG9qby5ob3N0ZW52LCBhcmd1bWVudHMpOworfTsKK2Rvam8ucmVxdWlyZUlmID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgcmVzb3VyY2VOYW1lKSB7CisJdmFyIGFyZzAgPSBhcmd1bWVudHNbMF07CisJaWYgKChhcmcwID09PSB0cnVlKSB8fCAoYXJnMCA9PSAiY29tbW9uIikgfHwgKGFyZzAgJiYgZG9qby5yZW5kZXJbYXJnMF0uY2FwYWJsZSkpIHsKKwkJdmFyIGFyZ3MgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworCQl9CisJCWRvam8ucmVxdWlyZS5hcHBseShkb2pvLCBhcmdzKTsKKwl9Cit9OworZG9qby5yZXF1aXJlQWZ0ZXJJZiA9IGRvam8ucmVxdWlyZUlmOworZG9qby5wcm92aWRlID0gZnVuY3Rpb24gKHJlc291cmNlTmFtZSkgeworCXJldHVybiBkb2pvLmhvc3RlbnYuc3RhcnRQYWNrYWdlLmFwcGx5KGRvam8uaG9zdGVudiwgYXJndW1lbnRzKTsKK307Citkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aCA9IGZ1bmN0aW9uIChtb2R1bGUsIHByZWZpeCkgeworCXJldHVybiBkb2pvLmhvc3RlbnYuc2V0TW9kdWxlUHJlZml4KG1vZHVsZSwgcHJlZml4KTsKK307CitpZiAoZGpDb25maWdbIm1vZHVsZVBhdGhzIl0pIHsKKwlmb3IgKHZhciBwYXJhbSBpbiBkakNvbmZpZ1sibW9kdWxlUGF0aHMiXSkgeworCQlkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChwYXJhbSwgZGpDb25maWdbIm1vZHVsZVBhdGhzIl1bcGFyYW1dKTsKKwl9Cit9Citkb2pvLnNldE1vZHVsZVByZWZpeCA9IGZ1bmN0aW9uIChtb2R1bGUsIHByZWZpeCkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5zZXRNb2R1bGVQcmVmaXgoXCIiICsgbW9kdWxlICsgIlwiLCBcIiIgKyBwcmVmaXggKyAiXCIpIiwgInJlcGxhY2VkIGJ5IGRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoIiwgIjAuNSIpOworCXJldHVybiBkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChtb2R1bGUsIHByZWZpeCk7Cit9OworZG9qby5leGlzdHMgPSBmdW5jdGlvbiAob2JqLCBuYW1lKSB7CisJdmFyIHAgPSBuYW1lLnNwbGl0KCIuIik7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7CisJCWlmICghb2JqW3BbaV1dKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJb2JqID0gb2JqW3BbaV1dOworCX0KKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlID0gZnVuY3Rpb24gKGxvY2FsZSkgeworCXZhciByZXN1bHQgPSBsb2NhbGUgPyBsb2NhbGUudG9Mb3dlckNhc2UoKSA6IGRvam8ubG9jYWxlOworCWlmIChyZXN1bHQgPT0gInJvb3QiKSB7CisJCXJlc3VsdCA9ICJST09UIjsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK307Citkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aCA9IGZ1bmN0aW9uIChsb2NhbGUsIGRvd24sIHNlYXJjaEZ1bmMpIHsKKwlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJdmFyIGVsZW1lbnRzID0gbG9jYWxlLnNwbGl0KCItIik7CisJdmFyIHNlYXJjaGxpc3QgPSBbXTsKKwlmb3IgKHZhciBpID0gZWxlbWVudHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7CisJCXNlYXJjaGxpc3QucHVzaChlbGVtZW50cy5zbGljZSgwLCBpKS5qb2luKCItIikpOworCX0KKwlzZWFyY2hsaXN0LnB1c2goZmFsc2UpOworCWlmIChkb3duKSB7CisJCXNlYXJjaGxpc3QucmV2ZXJzZSgpOworCX0KKwlmb3IgKHZhciBqID0gc2VhcmNobGlzdC5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgeworCQl2YXIgbG9jID0gc2VhcmNobGlzdFtqXSB8fCAiUk9PVCI7CisJCXZhciBzdG9wID0gc2VhcmNoRnVuYyhsb2MpOworCQlpZiAoc3RvcCkgeworCQkJYnJlYWs7CisJCX0KKwl9Cit9OworZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQ7Citkb2pvLmhvc3RlbnYucmVnaXN0ZXJObHNQcmVmaXggPSBmdW5jdGlvbiAoKSB7CisJZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgoIm5scyIsICJubHMiKTsKK307Citkb2pvLmhvc3RlbnYucHJlbG9hZExvY2FsaXphdGlvbnMgPSBmdW5jdGlvbiAoKSB7CisJaWYgKGRvam8uaG9zdGVudi5sb2NhbGVzR2VuZXJhdGVkKSB7CisJCWRvam8uaG9zdGVudi5yZWdpc3Rlck5sc1ByZWZpeCgpOworCQlmdW5jdGlvbiBwcmVsb2FkKGxvY2FsZSkgeworCQkJbG9jYWxlID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpOworCQkJZG9qby5ob3N0ZW52LnNlYXJjaExvY2FsZVBhdGgobG9jYWxlLCB0cnVlLCBmdW5jdGlvbiAobG9jKSB7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBkb2pvLmhvc3RlbnYubG9jYWxlc0dlbmVyYXRlZC5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWRbaV0gPT0gbG9jKSB7CisJCQkJCQlkb2pvWyJyZXF1aXJlIl0oIm5scy5kb2pvXyIgKyBsb2MpOworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSk7CisJCX0KKwkJcHJlbG9hZCgpOworCQl2YXIgZXh0cmEgPSBkakNvbmZpZy5leHRyYUxvY2FsZSB8fCBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBleHRyYS5sZW5ndGg7IGkrKykgeworCQkJcHJlbG9hZChleHRyYVtpXSk7CisJCX0KKwl9CisJZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zID0gZnVuY3Rpb24gKCkgeworCX07Cit9OworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uID0gZnVuY3Rpb24gKG1vZHVsZU5hbWUsIGJ1bmRsZU5hbWUsIGxvY2FsZSwgYXZhaWxhYmxlRmxhdExvY2FsZXMpIHsKKwlkb2pvLmhvc3RlbnYucHJlbG9hZExvY2FsaXphdGlvbnMoKTsKKwl2YXIgdGFyZ2V0TG9jYWxlID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpOworCXZhciBidW5kbGVQYWNrYWdlID0gW21vZHVsZU5hbWUsICJubHMiLCBidW5kbGVOYW1lXS5qb2luKCIuIik7CisJdmFyIGJlc3RMb2NhbGUgPSAiIjsKKwlpZiAoYXZhaWxhYmxlRmxhdExvY2FsZXMpIHsKKwkJdmFyIGZsYXRMb2NhbGVzID0gYXZhaWxhYmxlRmxhdExvY2FsZXMuc3BsaXQoIiwiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBmbGF0TG9jYWxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHRhcmdldExvY2FsZS5pbmRleE9mKGZsYXRMb2NhbGVzW2ldKSA9PSAwKSB7CisJCQkJaWYgKGZsYXRMb2NhbGVzW2ldLmxlbmd0aCA+IGJlc3RMb2NhbGUubGVuZ3RoKSB7CisJCQkJCWJlc3RMb2NhbGUgPSBmbGF0TG9jYWxlc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFiZXN0TG9jYWxlKSB7CisJCQliZXN0TG9jYWxlID0gIlJPT1QiOworCQl9CisJfQorCXZhciB0ZW1wTG9jYWxlID0gYXZhaWxhYmxlRmxhdExvY2FsZXMgPyBiZXN0TG9jYWxlIDogdGFyZ2V0TG9jYWxlOworCXZhciBidW5kbGUgPSBkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShidW5kbGVQYWNrYWdlKTsKKwl2YXIgbG9jYWxpemVkQnVuZGxlID0gbnVsbDsKKwlpZiAoYnVuZGxlKSB7CisJCWlmIChkakNvbmZpZy5sb2NhbGl6YXRpb25Db21wbGV0ZSAmJiBidW5kbGUuX2J1aWx0KSB7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIGpzTG9jID0gdGVtcExvY2FsZS5yZXBsYWNlKCItIiwgIl8iKTsKKwkJdmFyIHRyYW5zbGF0aW9uUGFja2FnZSA9IGJ1bmRsZVBhY2thZ2UgKyAiLiIgKyBqc0xvYzsKKwkJbG9jYWxpemVkQnVuZGxlID0gZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUodHJhbnNsYXRpb25QYWNrYWdlKTsKKwl9CisJaWYgKCFsb2NhbGl6ZWRCdW5kbGUpIHsKKwkJYnVuZGxlID0gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShidW5kbGVQYWNrYWdlKTsKKwkJdmFyIHN5bXMgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGVOYW1lKTsKKwkJdmFyIG1vZHBhdGggPSBzeW1zLmNvbmNhdCgibmxzIikuam9pbigiLyIpOworCQl2YXIgcGFyZW50OworCQlkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aCh0ZW1wTG9jYWxlLCBhdmFpbGFibGVGbGF0TG9jYWxlcywgZnVuY3Rpb24gKGxvYykgeworCQkJdmFyIGpzTG9jID0gbG9jLnJlcGxhY2UoIi0iLCAiXyIpOworCQkJdmFyIHRyYW5zbGF0aW9uUGFja2FnZSA9IGJ1bmRsZVBhY2thZ2UgKyAiLiIgKyBqc0xvYzsKKwkJCXZhciBsb2FkZWQgPSBmYWxzZTsKKwkJCWlmICghZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUodHJhbnNsYXRpb25QYWNrYWdlKSkgeworCQkJCWRvam8uaG9zdGVudi5zdGFydFBhY2thZ2UodHJhbnNsYXRpb25QYWNrYWdlKTsKKwkJCQl2YXIgbW9kdWxlID0gW21vZHBhdGhdOworCQkJCWlmIChsb2MgIT0gIlJPT1QiKSB7CisJCQkJCW1vZHVsZS5wdXNoKGxvYyk7CisJCQkJfQorCQkJCW1vZHVsZS5wdXNoKGJ1bmRsZU5hbWUpOworCQkJCXZhciBmaWxlc3BlYyA9IG1vZHVsZS5qb2luKCIvIikgKyAiLmpzIjsKKwkJCQlsb2FkZWQgPSBkb2pvLmhvc3RlbnYubG9hZFBhdGgoZmlsZXNwZWMsIG51bGwsIGZ1bmN0aW9uIChoYXNoKSB7CisJCQkJCXZhciBjbGF6eiA9IGZ1bmN0aW9uICgpIHsKKwkJCQkJfTsKKwkJCQkJY2xhenoucHJvdG90eXBlID0gcGFyZW50OworCQkJCQlidW5kbGVbanNMb2NdID0gbmV3IGNsYXp6KCk7CisJCQkJCWZvciAodmFyIGogaW4gaGFzaCkgeworCQkJCQkJYnVuZGxlW2pzTG9jXVtqXSA9IGhhc2hbal07CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0gZWxzZSB7CisJCQkJbG9hZGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWlmIChsb2FkZWQgJiYgYnVuZGxlW2pzTG9jXSkgeworCQkJCXBhcmVudCA9IGJ1bmRsZVtqc0xvY107CisJCQl9IGVsc2UgeworCQkJCWJ1bmRsZVtqc0xvY10gPSBwYXJlbnQ7CisJCQl9CisJCQlpZiAoYXZhaWxhYmxlRmxhdExvY2FsZXMpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSk7CisJfQorCWlmIChhdmFpbGFibGVGbGF0TG9jYWxlcyAmJiB0YXJnZXRMb2NhbGUgIT0gYmVzdExvY2FsZSkgeworCQlidW5kbGVbdGFyZ2V0TG9jYWxlLnJlcGxhY2UoIi0iLCAiXyIpXSA9IGJ1bmRsZVtiZXN0TG9jYWxlLnJlcGxhY2UoIi0iLCAiXyIpXTsKKwl9Cit9OworKGZ1bmN0aW9uICgpIHsKKwl2YXIgZXh0cmEgPSBkakNvbmZpZy5leHRyYUxvY2FsZTsKKwlpZiAoZXh0cmEpIHsKKwkJaWYgKCFleHRyYSBpbnN0YW5jZW9mIEFycmF5KSB7CisJCQlleHRyYSA9IFtleHRyYV07CisJCX0KKwkJdmFyIHJlcSA9IGRvam8ucmVxdWlyZUxvY2FsaXphdGlvbjsKKwkJZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uID0gZnVuY3Rpb24gKG0sIGIsIGxvY2FsZSwgYXZhaWxhYmxlRmxhdExvY2FsZXMpIHsKKwkJCXJlcShtLCBiLCBsb2NhbGUsIGF2YWlsYWJsZUZsYXRMb2NhbGVzKTsKKwkJCWlmIChsb2NhbGUpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGV4dHJhLmxlbmd0aDsgaSsrKSB7CisJCQkJcmVxKG0sIGIsIGV4dHJhW2ldLCBhdmFpbGFibGVGbGF0TG9jYWxlcyk7CisJCQl9CisJCX07CisJfQorfSkoKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL2xvYWRlcl94ZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sb2FkZXJfeGQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExM2NmMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sb2FkZXJfeGQuanMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmhvc3RlbnYucmVzZXRYZCA9IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmlzWERvbWFpbiA9IGRqQ29uZmlnLnVzZVhEb21haW4gfHwgZmFsc2U7CisJdGhpcy54ZFRpbWVyID0gMDsKKwl0aGlzLnhkSW5GbGlnaHQgPSB7fTsKKwl0aGlzLnhkT3JkZXJlZFJlcXMgPSBbXTsKKwl0aGlzLnhkRGVwTWFwID0ge307CisJdGhpcy54ZENvbnRlbnRzID0gW107CisJdGhpcy54ZERlZkxpc3QgPSBbXTsKK307Citkb2pvLmhvc3RlbnYucmVzZXRYZCgpOworZG9qby5ob3N0ZW52LmNyZWF0ZVhkUGFja2FnZSA9IGZ1bmN0aW9uIChjb250ZW50cywgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVBhdGgpIHsKKwl2YXIgZGVwcyA9IFtdOworCXZhciBkZXBSZWdFeHAgPSAvZG9qby4ocmVxdWlyZUxvY2FsaXphdGlvbnxyZXF1aXJlfHJlcXVpcmVJZnxyZXF1aXJlQWxsfHByb3ZpZGV8cmVxdWlyZUFmdGVySWZ8cmVxdWlyZUFmdGVyfGt3Q29tcG91bmRSZXF1aXJlfGNvbmRpdGlvbmFsUmVxdWlyZXxob3N0ZW52XC5jb25kaXRpb25hbExvYWRNb2R1bGV8Lmhvc3RlbnZcLmxvYWRNb2R1bGV8aG9zdGVudlwubW9kdWxlTG9hZGVkKVwoKFtcd1xXXSo/KVwpL21nOworCXZhciBtYXRjaDsKKwl3aGlsZSAoKG1hdGNoID0gZGVwUmVnRXhwLmV4ZWMoY29udGVudHMpKSAhPSBudWxsKSB7CisJCWlmIChtYXRjaFsxXSA9PSAicmVxdWlyZUxvY2FsaXphdGlvbiIpIHsKKwkJCWV2YWwobWF0Y2hbMF0pOworCQl9IGVsc2UgeworCQkJZGVwcy5wdXNoKCJcIiIgKyBtYXRjaFsxXSArICJcIiwgIiArIG1hdGNoWzJdKTsKKwkJfQorCX0KKwl2YXIgb3V0cHV0ID0gW107CisJb3V0cHV0LnB1c2goImRvam8uaG9zdGVudi5wYWNrYWdlTG9hZGVkKHtcbiIpOworCWlmIChkZXBzLmxlbmd0aCA+IDApIHsKKwkJb3V0cHV0LnB1c2goImRlcGVuZHM6IFsiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaSA+IDApIHsKKwkJCQlvdXRwdXQucHVzaCgiLFxuIik7CisJCQl9CisJCQlvdXRwdXQucHVzaCgiWyIgKyBkZXBzW2ldICsgIl0iKTsKKwkJfQorCQlvdXRwdXQucHVzaCgiXSwiKTsKKwl9CisJb3V0cHV0LnB1c2goIlxuZGVmaW5lUGFja2FnZTogZnVuY3Rpb24oZG9qbyl7Iik7CisJb3V0cHV0LnB1c2goY29udGVudHMpOworCW91dHB1dC5wdXNoKCJcbn0sIHJlc291cmNlTmFtZTogJyIgKyByZXNvdXJjZU5hbWUgKyAiJywgcmVzb3VyY2VQYXRoOiAnIiArIHJlc291cmNlUGF0aCArICInfSk7Iik7CisJcmV0dXJuIG91dHB1dC5qb2luKCIiKTsKK307Citkb2pvLmhvc3RlbnYubG9hZFBhdGggPSBmdW5jdGlvbiAocmVscGF0aCwgbW9kdWxlLCBjYikgeworCXZhciBjb2xvbkluZGV4ID0gcmVscGF0aC5pbmRleE9mKCI6Iik7CisJdmFyIHNsYXNoSW5kZXggPSByZWxwYXRoLmluZGV4T2YoIi8iKTsKKwl2YXIgdXJpOworCXZhciBjdXJyZW50SXNYRG9tYWluID0gZmFsc2U7CisJaWYgKGNvbG9uSW5kZXggPiAwICYmIGNvbG9uSW5kZXggPCBzbGFzaEluZGV4KSB7CisJCXVyaSA9IHJlbHBhdGg7CisJCXRoaXMuaXNYRG9tYWluID0gY3VycmVudElzWERvbWFpbiA9IHRydWU7CisJfSBlbHNlIHsKKwkJdXJpID0gdGhpcy5nZXRCYXNlU2NyaXB0VXJpKCkgKyByZWxwYXRoOworCQljb2xvbkluZGV4ID0gdXJpLmluZGV4T2YoIjoiKTsKKwkJc2xhc2hJbmRleCA9IHVyaS5pbmRleE9mKCIvIik7CisJCWlmIChjb2xvbkluZGV4ID4gMCAmJiBjb2xvbkluZGV4IDwgc2xhc2hJbmRleCAmJiAoIWxvY2F0aW9uLmhvc3QgfHwgdXJpLmluZGV4T2YoImh0dHA6Ly8iICsgbG9jYXRpb24uaG9zdCkgIT0gMCkpIHsKKwkJCXRoaXMuaXNYRG9tYWluID0gY3VycmVudElzWERvbWFpbiA9IHRydWU7CisJCX0KKwl9CisJaWYgKGRqQ29uZmlnLmNhY2hlQnVzdCAmJiBkb2pvLnJlbmRlci5odG1sLmNhcGFibGUpIHsKKwkJdXJpICs9ICI/IiArIFN0cmluZyhkakNvbmZpZy5jYWNoZUJ1c3QpLnJlcGxhY2UoL1xXKy9nLCAiIik7CisJfQorCXRyeSB7CisJCXJldHVybiAoKCFtb2R1bGUgfHwgdGhpcy5pc1hEb21haW4pID8gdGhpcy5sb2FkVXJpKHVyaSwgY2IsIGN1cnJlbnRJc1hEb21haW4sIG1vZHVsZSkgOiB0aGlzLmxvYWRVcmlBbmRDaGVjayh1cmksIG1vZHVsZSwgY2IpKTsKKwl9CisJY2F0Y2ggKGUpIHsKKwkJZG9qby5kZWJ1ZyhlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK307Citkb2pvLmhvc3RlbnYubG9hZFVyaSA9IGZ1bmN0aW9uICh1cmksIGNiLCBjdXJyZW50SXNYRG9tYWluLCBtb2R1bGUpIHsKKwlpZiAodGhpcy5sb2FkZWRVcmlzW3VyaV0pIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0aGlzLmlzWERvbWFpbiAmJiBtb2R1bGUpIHsKKwkJaWYgKHVyaS5pbmRleE9mKCJfX3BhY2thZ2VfXyIpICE9IC0xKSB7CisJCQltb2R1bGUgKz0gIi4qIjsKKwkJfQorCQl0aGlzLnhkT3JkZXJlZFJlcXMucHVzaChtb2R1bGUpOworCQlpZiAoY3VycmVudElzWERvbWFpbiB8fCB1cmkuaW5kZXhPZigiL25scy8iKSA9PSAtMSkgeworCQkJdGhpcy54ZEluRmxpZ2h0W21vZHVsZV0gPSB0cnVlOworCQkJdGhpcy5pbkZsaWdodENvdW50Kys7CisJCX0KKwkJaWYgKCF0aGlzLnhkVGltZXIpIHsKKwkJCXRoaXMueGRUaW1lciA9IHNldEludGVydmFsKCJkb2pvLmhvc3RlbnYud2F0Y2hJbkZsaWdodFhEb21haW4oKTsiLCAxMDApOworCQl9CisJCXRoaXMueGRTdGFydFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOworCX0KKwlpZiAoY3VycmVudElzWERvbWFpbikgeworCQl2YXIgbGFzdEluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7CisJCWlmIChsYXN0SW5kZXggPD0gMCkgeworCQkJbGFzdEluZGV4ID0gdXJpLmxlbmd0aCAtIDE7CisJCX0KKwkJdmFyIHhkVXJpID0gdXJpLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpICsgIi54ZCI7CisJCWlmIChsYXN0SW5kZXggIT0gdXJpLmxlbmd0aCAtIDEpIHsKKwkJCXhkVXJpICs9IHVyaS5zdWJzdHJpbmcobGFzdEluZGV4LCB1cmkubGVuZ3RoKTsKKwkJfQorCQl2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQllbGVtZW50LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwkJZWxlbWVudC5zcmMgPSB4ZFVyaTsKKwkJaWYgKCF0aGlzLmhlYWRFbGVtZW50KSB7CisJCQl0aGlzLmhlYWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKKwkJCWlmICghdGhpcy5oZWFkRWxlbWVudCkgeworCQkJCXRoaXMuaGVhZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaHRtbCIpWzBdOworCQkJfQorCQl9CisJCXRoaXMuaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisJfSBlbHNlIHsKKwkJdmFyIGNvbnRlbnRzID0gdGhpcy5nZXRUZXh0KHVyaSwgbnVsbCwgdHJ1ZSk7CisJCWlmIChjb250ZW50cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAodGhpcy5pc1hEb21haW4gJiYgdXJpLmluZGV4T2YoIi9ubHMvIikgPT0gLTEpIHsKKwkJCXZhciBwa2cgPSB0aGlzLmNyZWF0ZVhkUGFja2FnZShjb250ZW50cywgbW9kdWxlLCB1cmkpOworCQkJZGpfZXZhbChwa2cpOworCQl9IGVsc2UgeworCQkJaWYgKGNiKSB7CisJCQkJY29udGVudHMgPSAiKCIgKyBjb250ZW50cyArICIpIjsKKwkJCX0KKwkJCXZhciB2YWx1ZSA9IGRqX2V2YWwoY29udGVudHMpOworCQkJaWYgKGNiKSB7CisJCQkJY2IodmFsdWUpOworCQkJfQorCQl9CisJfQorCXRoaXMubG9hZGVkVXJpc1t1cmldID0gdHJ1ZTsKKwlyZXR1cm4gMTsKK307Citkb2pvLmhvc3RlbnYucGFja2FnZUxvYWRlZCA9IGZ1bmN0aW9uIChwa2cpIHsKKwl2YXIgZGVwcyA9IHBrZy5kZXBlbmRzOworCXZhciByZXF1aXJlTGlzdCA9IG51bGw7CisJdmFyIHJlcXVpcmVBZnRlckxpc3QgPSBudWxsOworCXZhciBwcm92aWRlTGlzdCA9IFtdOworCWlmIChkZXBzICYmIGRlcHMubGVuZ3RoID4gMCkgeworCQl2YXIgZGVwID0gbnVsbDsKKwkJdmFyIGluc2VydEhpbnQgPSAwOworCQl2YXIgYXR0YWNoZWRQYWNrYWdlID0gZmFsc2U7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgeworCQkJZGVwID0gZGVwc1tpXTsKKwkJCWlmIChkZXBbMF0gPT0gInByb3ZpZGUiIHx8IGRlcFswXSA9PSAiaG9zdGVudi5tb2R1bGVMb2FkZWQiKSB7CisJCQkJcHJvdmlkZUxpc3QucHVzaChkZXBbMV0pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXJlcXVpcmVMaXN0KSB7CisJCQkJCXJlcXVpcmVMaXN0ID0gW107CisJCQkJfQorCQkJCWlmICghcmVxdWlyZUFmdGVyTGlzdCkgeworCQkJCQlyZXF1aXJlQWZ0ZXJMaXN0ID0gW107CisJCQkJfQorCQkJCXZhciB1bnBhY2tlZERlcHMgPSB0aGlzLnVucGFja1hkRGVwZW5kZW5jeShkZXApOworCQkJCWlmICh1bnBhY2tlZERlcHMucmVxdWlyZXMpIHsKKwkJCQkJcmVxdWlyZUxpc3QgPSByZXF1aXJlTGlzdC5jb25jYXQodW5wYWNrZWREZXBzLnJlcXVpcmVzKTsKKwkJCQl9CisJCQkJaWYgKHVucGFja2VkRGVwcy5yZXF1aXJlc0FmdGVyKSB7CisJCQkJCXJlcXVpcmVBZnRlckxpc3QgPSByZXF1aXJlQWZ0ZXJMaXN0LmNvbmNhdCh1bnBhY2tlZERlcHMucmVxdWlyZXNBZnRlcik7CisJCQkJfQorCQkJfQorCQkJdmFyIGRlcFR5cGUgPSBkZXBbMF07CisJCQl2YXIgb2JqUGF0aCA9IGRlcFR5cGUuc3BsaXQoIi4iKTsKKwkJCWlmIChvYmpQYXRoLmxlbmd0aCA9PSAyKSB7CisJCQkJZG9qb1tvYmpQYXRoWzBdXVtvYmpQYXRoWzFdXS5hcHBseShkb2pvW29ialBhdGhbMF1dLCBkZXAuc2xpY2UoMSkpOworCQkJfSBlbHNlIHsKKwkJCQlkb2pvW2RlcFR5cGVdLmFwcGx5KGRvam8sIGRlcC5zbGljZSgxKSk7CisJCQl9CisJCX0KKwkJdmFyIGNvbnRlbnRJbmRleCA9IHRoaXMueGRDb250ZW50cy5wdXNoKHtjb250ZW50OnBrZy5kZWZpbmVQYWNrYWdlLCByZXNvdXJjZU5hbWU6cGtnWyJyZXNvdXJjZU5hbWUiXSwgcmVzb3VyY2VQYXRoOnBrZ1sicmVzb3VyY2VQYXRoIl0sIGlzRGVmaW5lZDpmYWxzZX0pIC0gMTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlTGlzdC5sZW5ndGg7IGkrKykgeworCQkJdGhpcy54ZERlcE1hcFtwcm92aWRlTGlzdFtpXV0gPSB7cmVxdWlyZXM6cmVxdWlyZUxpc3QsIHJlcXVpcmVzQWZ0ZXI6cmVxdWlyZUFmdGVyTGlzdCwgY29udGVudEluZGV4OmNvbnRlbnRJbmRleH07CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlTGlzdC5sZW5ndGg7IGkrKykgeworCQkJdGhpcy54ZEluRmxpZ2h0W3Byb3ZpZGVMaXN0W2ldXSA9IGZhbHNlOworCQl9CisJfQorfTsKK2Rvam8uaG9zdGVudi54ZExvYWRGbGF0dGVuZWRCdW5kbGUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSwgYnVuZGxlTmFtZSwgbG9jYWxlLCBidW5kbGVEYXRhKSB7CisJbG9jYWxlID0gbG9jYWxlIHx8ICJyb290IjsKKwl2YXIganNMb2MgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSkucmVwbGFjZSgiLSIsICJfIik7CisJdmFyIGJ1bmRsZVBhY2thZ2UgPSBbbW9kdWxlTmFtZSwgIm5scyIsIGJ1bmRsZU5hbWVdLmpvaW4oIi4iKTsKKwl2YXIgYnVuZGxlID0gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShidW5kbGVQYWNrYWdlKTsKKwlidW5kbGVbanNMb2NdID0gYnVuZGxlRGF0YTsKKwl2YXIgbWFwTmFtZSA9IFttb2R1bGVOYW1lLCBqc0xvYywgYnVuZGxlTmFtZV0uam9pbigiLiIpOworCXZhciBidW5kbGVNYXAgPSBkb2pvLmhvc3RlbnYueGRCdW5kbGVNYXBbbWFwTmFtZV07CisJaWYgKGJ1bmRsZU1hcCkgeworCQlmb3IgKHZhciBwYXJhbSBpbiBidW5kbGVNYXApIHsKKwkJCWJ1bmRsZVtwYXJhbV0gPSBidW5kbGVEYXRhOworCQl9CisJfQorfTsKK2Rvam8uaG9zdGVudi54ZEJ1bmRsZU1hcCA9IHt9OworZG9qby54ZFJlcXVpcmVMb2NhbGl6YXRpb24gPSBmdW5jdGlvbiAobW9kdWxlTmFtZSwgYnVuZGxlTmFtZSwgbG9jYWxlLCBhdmFpbGFibGVGbGF0TG9jYWxlcykgeworCXZhciBsb2NhbGVzID0gYXZhaWxhYmxlRmxhdExvY2FsZXMuc3BsaXQoIiwiKTsKKwl2YXIganNMb2MgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJdmFyIGJlc3RMb2NhbGUgPSAiIjsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGpzTG9jLmluZGV4T2YobG9jYWxlc1tpXSkgPT0gMCkgeworCQkJaWYgKGxvY2FsZXNbaV0ubGVuZ3RoID4gYmVzdExvY2FsZS5sZW5ndGgpIHsKKwkJCQliZXN0TG9jYWxlID0gbG9jYWxlc1tpXTsKKwkJCX0KKwkJfQorCX0KKwl2YXIgZml4ZWRCZXN0TG9jYWxlID0gYmVzdExvY2FsZS5yZXBsYWNlKCItIiwgIl8iKTsKKwl2YXIgYnVuZGxlUGFja2FnZSA9IGRvam8uZXZhbE9ialBhdGgoW21vZHVsZU5hbWUsICJubHMiLCBidW5kbGVOYW1lXS5qb2luKCIuIikpOworCWlmIChidW5kbGVQYWNrYWdlICYmIGJ1bmRsZVBhY2thZ2VbZml4ZWRCZXN0TG9jYWxlXSkgeworCQlidW5kbGVbanNMb2MucmVwbGFjZSgiLSIsICJfIildID0gYnVuZGxlUGFja2FnZVtmaXhlZEJlc3RMb2NhbGVdOworCX0gZWxzZSB7CisJCXZhciBtYXBOYW1lID0gW21vZHVsZU5hbWUsIChmaXhlZEJlc3RMb2NhbGUgfHwgInJvb3QiKSwgYnVuZGxlTmFtZV0uam9pbigiLiIpOworCQl2YXIgYnVuZGxlTWFwID0gZG9qby5ob3N0ZW52LnhkQnVuZGxlTWFwW21hcE5hbWVdOworCQlpZiAoIWJ1bmRsZU1hcCkgeworCQkJYnVuZGxlTWFwID0gZG9qby5ob3N0ZW52LnhkQnVuZGxlTWFwW21hcE5hbWVdID0ge307CisJCX0KKwkJYnVuZGxlTWFwW2pzTG9jLnJlcGxhY2UoIi0iLCAiXyIpXSA9IHRydWU7CisJCWRvam8ucmVxdWlyZShtb2R1bGVOYW1lICsgIi5ubHMiICsgKGJlc3RMb2NhbGUgPyAiLiIgKyBiZXN0TG9jYWxlIDogIiIpICsgIi4iICsgYnVuZGxlTmFtZSk7CisJfQorfTsKKyhmdW5jdGlvbiAoKSB7CisJdmFyIGV4dHJhID0gZGpDb25maWcuZXh0cmFMb2NhbGU7CisJaWYgKGV4dHJhKSB7CisJCWlmICghZXh0cmEgaW5zdGFuY2VvZiBBcnJheSkgeworCQkJZXh0cmEgPSBbZXh0cmFdOworCQl9CisJCWRvam8uX3hkUmVxTG9jID0gZG9qby54ZFJlcXVpcmVMb2NhbGl6YXRpb247CisJCWRvam8ueGRSZXF1aXJlTG9jYWxpemF0aW9uID0gZnVuY3Rpb24gKG0sIGIsIGxvY2FsZSwgZkxvY2FsZXMpIHsKKwkJCWRvam8uX3hkUmVxTG9jKG0sIGIsIGxvY2FsZSwgZkxvY2FsZXMpOworCQkJaWYgKGxvY2FsZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZXh0cmEubGVuZ3RoOyBpKyspIHsKKwkJCQlkb2pvLl94ZFJlcUxvYyhtLCBiLCBleHRyYVtpXSwgZkxvY2FsZXMpOworCQkJfQorCQl9OworCX0KK30pKCk7Citkb2pvLmhvc3RlbnYudW5wYWNrWGREZXBlbmRlbmN5ID0gZnVuY3Rpb24gKGRlcCkgeworCXZhciBuZXdEZXBzID0gbnVsbDsKKwl2YXIgbmV3QWZ0ZXJEZXBzID0gbnVsbDsKKwlzd2l0Y2ggKGRlcFswXSkgeworCSAgY2FzZSAicmVxdWlyZUlmIjoKKwkgIGNhc2UgInJlcXVpcmVBZnRlcklmIjoKKwkgIGNhc2UgImNvbmRpdGlvbmFsUmVxdWlyZSI6CisJCWlmICgoZGVwWzFdID09PSB0cnVlKSB8fCAoZGVwWzFdID09ICJjb21tb24iKSB8fCAoZGVwWzFdICYmIGRvam8ucmVuZGVyW2RlcFsxXV0uY2FwYWJsZSkpIHsKKwkJCW5ld0RlcHMgPSBbe25hbWU6ZGVwWzJdLCBjb250ZW50Om51bGx9XTsKKwkJfQorCQlicmVhazsKKwkgIGNhc2UgInJlcXVpcmVBbGwiOgorCQlkZXAuc2hpZnQoKTsKKwkJbmV3RGVwcyA9IGRlcDsKKwkJZG9qby5ob3N0ZW52LmZsYXR0ZW5SZXF1aXJlQXJyYXkobmV3RGVwcyk7CisJCWJyZWFrOworCSAgY2FzZSAia3dDb21wb3VuZFJlcXVpcmUiOgorCSAgY2FzZSAiaG9zdGVudi5jb25kaXRpb25hbExvYWRNb2R1bGUiOgorCQl2YXIgbW9kTWFwID0gZGVwWzFdOworCQl2YXIgY29tbW9uID0gbW9kTWFwWyJjb21tb24iXSB8fCBbXTsKKwkJdmFyIG5ld0RlcHMgPSAobW9kTWFwW2Rvam8uaG9zdGVudi5uYW1lX10pID8gY29tbW9uLmNvbmNhdChtb2RNYXBbZG9qby5ob3N0ZW52Lm5hbWVfXSB8fCBbXSkgOiBjb21tb24uY29uY2F0KG1vZE1hcFsiZGVmYXVsdCJdIHx8IFtdKTsKKwkJZG9qby5ob3N0ZW52LmZsYXR0ZW5SZXF1aXJlQXJyYXkobmV3RGVwcyk7CisJCWJyZWFrOworCSAgY2FzZSAicmVxdWlyZSI6CisJICBjYXNlICJyZXF1aXJlQWZ0ZXIiOgorCSAgY2FzZSAiaG9zdGVudi5sb2FkTW9kdWxlIjoKKwkJbmV3RGVwcyA9IFt7bmFtZTpkZXBbMV0sIGNvbnRlbnQ6bnVsbH1dOworCQlicmVhazsKKwl9CisJaWYgKGRlcFswXSA9PSAicmVxdWlyZUFmdGVySWYiIHx8IGRlcFswXSA9PSAicmVxdWlyZUlmIikgeworCQluZXdBZnRlckRlcHMgPSBuZXdEZXBzOworCQluZXdEZXBzID0gbnVsbDsKKwl9CisJcmV0dXJuIHtyZXF1aXJlczpuZXdEZXBzLCByZXF1aXJlc0FmdGVyOm5ld0FmdGVyRGVwc307Cit9OworZG9qby5ob3N0ZW52LnhkV2Fsa1JlcXMgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHJlcUNoYWluID0gbnVsbDsKKwl2YXIgcmVxOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy54ZE9yZGVyZWRSZXFzLmxlbmd0aDsgaSsrKSB7CisJCXJlcSA9IHRoaXMueGRPcmRlcmVkUmVxc1tpXTsKKwkJaWYgKHRoaXMueGREZXBNYXBbcmVxXSkgeworCQkJcmVxQ2hhaW4gPSBbcmVxXTsKKwkJCXJlcUNoYWluW3JlcV0gPSB0cnVlOworCQkJdGhpcy54ZEV2YWxSZXFzKHJlcUNoYWluKTsKKwkJfQorCX0KK307Citkb2pvLmhvc3RlbnYueGRFdmFsUmVxcyA9IGZ1bmN0aW9uIChyZXFDaGFpbikgeworCXdoaWxlIChyZXFDaGFpbi5sZW5ndGggPiAwKSB7CisJCXZhciByZXEgPSByZXFDaGFpbltyZXFDaGFpbi5sZW5ndGggLSAxXTsKKwkJdmFyIHBrZyA9IHRoaXMueGREZXBNYXBbcmVxXTsKKwkJaWYgKHBrZykgeworCQkJdmFyIHJlcXMgPSBwa2cucmVxdWlyZXM7CisJCQlpZiAocmVxcyAmJiByZXFzLmxlbmd0aCA+IDApIHsKKwkJCQl2YXIgbmV4dFJlcTsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHJlcXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJbmV4dFJlcSA9IHJlcXNbaV0ubmFtZTsKKwkJCQkJaWYgKG5leHRSZXEgJiYgIXJlcUNoYWluW25leHRSZXFdKSB7CisJCQkJCQlyZXFDaGFpbi5wdXNoKG5leHRSZXEpOworCQkJCQkJcmVxQ2hhaW5bbmV4dFJlcV0gPSB0cnVlOworCQkJCQkJdGhpcy54ZEV2YWxSZXFzKHJlcUNoYWluKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXZhciBjb250ZW50cyA9IHRoaXMueGRDb250ZW50c1twa2cuY29udGVudEluZGV4XTsKKwkJCWlmICghY29udGVudHMuaXNEZWZpbmVkKSB7CisJCQkJdmFyIGNvbnRlbnQgPSBjb250ZW50cy5jb250ZW50OworCQkJCWNvbnRlbnRbInJlc291cmNlTmFtZSJdID0gY29udGVudHNbInJlc291cmNlTmFtZSJdOworCQkJCWNvbnRlbnRbInJlc291cmNlUGF0aCJdID0gY29udGVudHNbInJlc291cmNlUGF0aCJdOworCQkJCXRoaXMueGREZWZMaXN0LnB1c2goY29udGVudCk7CisJCQkJY29udGVudHMuaXNEZWZpbmVkID0gdHJ1ZTsKKwkJCX0KKwkJCXRoaXMueGREZXBNYXBbcmVxXSA9IG51bGw7CisJCQl2YXIgcmVxcyA9IHBrZy5yZXF1aXJlc0FmdGVyOworCQkJaWYgKHJlcXMgJiYgcmVxcy5sZW5ndGggPiAwKSB7CisJCQkJdmFyIG5leHRSZXE7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7CisJCQkJCW5leHRSZXEgPSByZXFzW2ldLm5hbWU7CisJCQkJCWlmIChuZXh0UmVxICYmICFyZXFDaGFpbltuZXh0UmVxXSkgeworCQkJCQkJcmVxQ2hhaW4ucHVzaChuZXh0UmVxKTsKKwkJCQkJCXJlcUNoYWluW25leHRSZXFdID0gdHJ1ZTsKKwkJCQkJCXRoaXMueGRFdmFsUmVxcyhyZXFDaGFpbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmVxQ2hhaW4ucG9wKCk7CisJfQorfTsKK2Rvam8uaG9zdGVudi5jbGVhclhkSW50ZXJ2YWwgPSBmdW5jdGlvbiAoKSB7CisJY2xlYXJJbnRlcnZhbCh0aGlzLnhkVGltZXIpOworCXRoaXMueGRUaW1lciA9IDA7Cit9OworZG9qby5ob3N0ZW52LndhdGNoSW5GbGlnaHRYRG9tYWluID0gZnVuY3Rpb24gKCkgeworCXZhciB3YWl0SW50ZXJ2YWwgPSAoZGpDb25maWcueGRXYWl0U2Vjb25kcyB8fCAxNSkgKiAxMDAwOworCWlmICh0aGlzLnhkU3RhcnRUaW1lICsgd2FpdEludGVydmFsIDwgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSkgeworCQl0aGlzLmNsZWFyWGRJbnRlcnZhbCgpOworCQl2YXIgbm9Mb2FkcyA9ICIiOworCQlmb3IgKHZhciBwYXJhbSBpbiB0aGlzLnhkSW5GbGlnaHQpIHsKKwkJCWlmICh0aGlzLnhkSW5GbGlnaHRbcGFyYW1dKSB7CisJCQkJbm9Mb2FkcyArPSBwYXJhbSArICIgIjsKKwkJCX0KKwkJfQorCQlkb2pvLnJhaXNlKCJDb3VsZCBub3QgbG9hZCBjcm9zcy1kb21haW4gcGFja2FnZXM6ICIgKyBub0xvYWRzKTsKKwl9CisJZm9yICh2YXIgcGFyYW0gaW4gdGhpcy54ZEluRmxpZ2h0KSB7CisJCWlmICh0aGlzLnhkSW5GbGlnaHRbcGFyYW1dKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdGhpcy5jbGVhclhkSW50ZXJ2YWwoKTsKKwl0aGlzLnhkV2Fsa1JlcXMoKTsKKwl2YXIgZGVmTGVuZ3RoID0gdGhpcy54ZERlZkxpc3QubGVuZ3RoOworCWZvciAodmFyIGkgPSAwOyBpIDwgZGVmTGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNvbnRlbnQgPSBkb2pvLmhvc3RlbnYueGREZWZMaXN0W2ldOworCQlpZiAoZGpDb25maWdbImRlYnVnQXRBbGxDb3N0cyJdICYmIGNvbnRlbnRbInJlc291cmNlTmFtZSJdKSB7CisJCQlpZiAoIXRoaXNbInhkRGVidWdRdWV1ZSJdKSB7CisJCQkJdGhpcy54ZERlYnVnUXVldWUgPSBbXTsKKwkJCX0KKwkJCXRoaXMueGREZWJ1Z1F1ZXVlLnB1c2goe3Jlc291cmNlTmFtZTpjb250ZW50LnJlc291cmNlTmFtZSwgcmVzb3VyY2VQYXRoOmNvbnRlbnQucmVzb3VyY2VQYXRofSk7CisJCX0gZWxzZSB7CisJCQljb250ZW50KGRvam8pOworCQl9CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy54ZENvbnRlbnRzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjdXJyZW50ID0gdGhpcy54ZENvbnRlbnRzW2ldOworCQlpZiAoY3VycmVudC5jb250ZW50ICYmICFjdXJyZW50LmlzRGVmaW5lZCkgeworCQkJY3VycmVudC5jb250ZW50KGRvam8pOworCQl9CisJfQorCXRoaXMucmVzZXRYZCgpOworCWlmICh0aGlzWyJ4ZERlYnVnUXVldWUiXSAmJiB0aGlzLnhkRGVidWdRdWV1ZS5sZW5ndGggPiAwKSB7CisJCXRoaXMueGREZWJ1Z0ZpbGVMb2FkZWQoKTsKKwl9IGVsc2UgeworCQl0aGlzLnhkTm90aWZ5TG9hZGVkKCk7CisJfQorfTsKK2Rvam8uaG9zdGVudi54ZE5vdGlmeUxvYWRlZCA9IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmluRmxpZ2h0Q291bnQgPSAwOworCWlmICh0aGlzLl9kakluaXRGaXJlZCAmJiAhdGhpcy5sb2FkTm90aWZ5aW5nKSB7CisJCXRoaXMuY2FsbExvYWRlZCgpOworCX0KK307Citkb2pvLmhvc3RlbnYuZmxhdHRlblJlcXVpcmVBcnJheSA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKKwlpZiAodGFyZ2V0KSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGFyZ2V0W2ldIGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJCQl0YXJnZXRbaV0gPSB7bmFtZTp0YXJnZXRbaV1bMF0sIGNvbnRlbnQ6bnVsbH07CisJCQl9IGVsc2UgeworCQkJCXRhcmdldFtpXSA9IHtuYW1lOnRhcmdldFtpXSwgY29udGVudDpudWxsfTsKKwkJCX0KKwkJfQorCX0KK307Citkb2pvLmhvc3RlbnYueGRIYXNDYWxsZWRQcmVsb2FkID0gZmFsc2U7Citkb2pvLmhvc3RlbnYueGRSZWFsQ2FsbExvYWRlZCA9IGRvam8uaG9zdGVudi5jYWxsTG9hZGVkOworZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQgPSBmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMueGRIYXNDYWxsZWRQcmVsb2FkIHx8IGRvam8uaG9zdGVudi5nZXRNb2R1bGVQcmVmaXgoImRvam8iKSA9PSAic3JjIiB8fCAhdGhpcy5sb2NhbGVzR2VuZXJhdGVkKSB7CisJCXRoaXMueGRSZWFsQ2FsbExvYWRlZCgpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmxvY2FsZXNHZW5lcmF0ZWQpIHsKKwkJCXRoaXMucmVnaXN0ZXJObHNQcmVmaXggPSBmdW5jdGlvbiAoKSB7CisJCQkJZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgoIm5scyIsIGRvam8uaG9zdGVudi5nZXRNb2R1bGVQcmVmaXgoImRvam8iKSArICIvLi4vbmxzIik7CisJCQl9OworCQkJdGhpcy5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworCQl9CisJfQorCXRoaXMueGRIYXNDYWxsZWRQcmVsb2FkID0gdHJ1ZTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sb2dnaW5nL0NvbnNvbGVMb2dnZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9Db25zb2xlTG9nZ2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3M2I0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9Db25zb2xlTG9nZ2VyLmpzCkBAIC0wLDAgKzEsODYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubG9nZ2luZy5Db25zb2xlTG9nZ2VyIik7Citkb2pvLnJlcXVpcmUoImRvam8ubG9nZ2luZy5Mb2dnZXIiKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sb2dnaW5nLk1lbW9yeUxvZ0hhbmRsZXIsIHtkZWJ1ZzpmdW5jdGlvbiAoKSB7CisJZG9qby5ob3N0ZW52LnByaW50bG4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGluZm86ZnVuY3Rpb24gKCkgeworCWRvam8uaG9zdGVudi5wcmludGxuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCB3YXJuOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmhvc3RlbnYucHJpbnRsbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZXJyb3I6ZnVuY3Rpb24gKCkgeworCWRvam8uaG9zdGVudi5wcmludGxuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBjcml0aWNhbDpmdW5jdGlvbiAoKSB7CisJZG9qby5ob3N0ZW52LnByaW50bG4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGVtaXQ6ZnVuY3Rpb24gKHJlY29yZCkgeworCWlmICghZGpDb25maWcuaXNEZWJ1ZykgeworCQlyZXR1cm47CisJfQorCXZhciBmdW5jTmFtZSA9IG51bGw7CisJc3dpdGNoIChyZWNvcmQubGV2ZWwpIHsKKwkgIGNhc2UgMToKKwkJZnVuY05hbWUgPSAiZGVidWciOworCQlicmVhazsKKwkgIGNhc2UgMjoKKwkJZnVuY05hbWUgPSAiaW5mbyI7CisJCWJyZWFrOworCSAgY2FzZSAzOgorCQlmdW5jTmFtZSA9ICJ3YXJuIjsKKwkJYnJlYWs7CisJICBjYXNlIDQ6CisJCWZ1bmNOYW1lID0gImVycm9yIjsKKwkJYnJlYWs7CisJICBjYXNlIDU6CisJCWZ1bmNOYW1lID0gImNyaXRpY2FsIjsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlmdW5jTmFtZSA9ICJkZWJ1ZyI7CisJfQorCXZhciBsb2dTdHIgPSBTdHJpbmcoZG9qby5sb2cuZ2V0TGV2ZWxOYW1lKHJlY29yZC5sZXZlbCkgKyAiOiAiICsgcmVjb3JkLnRpbWUudG9Mb2NhbGVUaW1lU3RyaW5nKCkpICsgIjogIiArIHJlY29yZC5tZXNzYWdlOworCWlmIChyZWNvcmQubXNnQXJncyAmJiByZWNvcmQubXNnQXJncy5sZW5ndGggPiAwKSB7CisJCXRoaXNbZnVuY05hbWVdLmNhbGwodGhpcywgbG9nU3RyLCByZWNvcmQubXNnQXJncyk7CisJfSBlbHNlIHsKKwkJdGhpc1tmdW5jTmFtZV0uY2FsbCh0aGlzLCBsb2dTdHIpOworCX0KKwl0aGlzLmRhdGEucHVzaChyZWNvcmQpOworCWlmICh0aGlzLm51bVJlY29yZHMgIT0gLTEpIHsKKwkJd2hpbGUgKHRoaXMuZGF0YS5sZW5ndGggPiB0aGlzLm51bVJlY29yZHMpIHsKKwkJCXRoaXMuZGF0YS5zaGlmdCgpOworCQl9CisJfQorfX0pOworaWYgKCFkal91bmRlZigiY29uc29sZSIpICYmICFkal91bmRlZigiaW5mbyIsIGNvbnNvbGUpKSB7CisJZG9qby5sYW5nLmV4dGVuZChkb2pvLmxvZ2dpbmcuTWVtb3J5TG9nSGFuZGxlciwge2RlYnVnOmZ1bmN0aW9uICgpIHsKKwkJY29uc29sZS5kZWJ1Zy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0sIGluZm86ZnVuY3Rpb24gKCkgeworCQljb25zb2xlLmluZm8uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LCB3YXJuOmZ1bmN0aW9uICgpIHsKKwkJY29uc29sZS53YXJuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwgZXJyb3I6ZnVuY3Rpb24gKCkgeworCQljb25zb2xlLmVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwgY3JpdGljYWw6ZnVuY3Rpb24gKCkgeworCQljb25zb2xlLmVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfX0pOworCWRvam8ubGFuZy5leHRlbmQoZG9qby5sb2dnaW5nLkxvZ2dlciwge2V4Y2VwdGlvbjpmdW5jdGlvbiAobXNnLCBlLCBzcXVlbGNoKSB7CisJCXZhciBhcmdzID0gW21zZ107CisJCWlmIChlKSB7CisJCQltc2cgKz0gIiA6ICIgKyBlLm5hbWUgKyAiICIgKyAoZS5kZXNjcmlwdGlvbiB8fCBlLm1lc3NhZ2UpOworCQkJYXJncy5wdXNoKGUpOworCQl9CisJCXRoaXMubG9nVHlwZSgiRVJST1IiLCBhcmdzKTsKKwkJaWYgKCFzcXVlbGNoKSB7CisJCQl0aHJvdyBlOworCQl9CisJfX0pOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9Mb2dnZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9Mb2dnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMGIyOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sb2dnaW5nL0xvZ2dlci5qcwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sb2dnaW5nLkxvZ2dlciIpOworZG9qby5wcm92aWRlKCJkb2pvLmxvZ2dpbmcuTG9nRmlsdGVyIik7Citkb2pvLnByb3ZpZGUoImRvam8ubG9nZ2luZy5SZWNvcmQiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sb2ciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZGVjbGFyZSIpOworZG9qby5sb2dnaW5nLlJlY29yZCA9IGZ1bmN0aW9uIChsb2dMZXZlbCwgbWVzc2FnZSkgeworCXRoaXMubGV2ZWwgPSBsb2dMZXZlbDsKKwl0aGlzLm1lc3NhZ2UgPSAiIjsKKwl0aGlzLm1zZ0FyZ3MgPSBbXTsKKwl0aGlzLnRpbWUgPSBuZXcgRGF0ZSgpOworCWlmIChkb2pvLmxhbmcuaXNBcnJheShtZXNzYWdlKSkgeworCQlpZiAobWVzc2FnZS5sZW5ndGggPiAwICYmIGRvam8ubGFuZy5pc1N0cmluZyhtZXNzYWdlWzBdKSkgeworCQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZS5zaGlmdCgpOworCQl9CisJCXRoaXMubXNnQXJncyA9IG1lc3NhZ2U7CisJfSBlbHNlIHsKKwkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwl9Cit9OworZG9qby5sb2dnaW5nLkxvZ0ZpbHRlciA9IGZ1bmN0aW9uIChsb2dnZXJDaGFpbikgeworCXRoaXMucGFzc0NoYWluID0gbG9nZ2VyQ2hhaW4gfHwgIiI7CisJdGhpcy5maWx0ZXIgPSBmdW5jdGlvbiAocmVjb3JkKSB7CisJCXJldHVybiB0cnVlOworCX07Cit9OworZG9qby5sb2dnaW5nLkxvZ2dlciA9IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmN1dE9mZkxldmVsID0gMDsKKwl0aGlzLnByb3BhZ2F0ZSA9IHRydWU7CisJdGhpcy5wYXJlbnQgPSBudWxsOworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMuZmlsdGVycyA9IFtdOworCXRoaXMuaGFuZGxlcnMgPSBbXTsKK307Citkb2pvLmV4dGVuZChkb2pvLmxvZ2dpbmcuTG9nZ2VyLCB7X2FyZ3NUb0FycjpmdW5jdGlvbiAoYXJncykgeworCXZhciByZXQgPSBbXTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGFyZ3MubGVuZ3RoOyB4KyspIHsKKwkJcmV0LnB1c2goYXJnc1t4XSk7CisJfQorCXJldHVybiByZXQ7Cit9LCBzZXRMZXZlbDpmdW5jdGlvbiAobHZsKSB7CisJdGhpcy5jdXRPZmZMZXZlbCA9IHBhcnNlSW50KGx2bCk7Cit9LCBpc0VuYWJsZWRGb3I6ZnVuY3Rpb24gKGx2bCkgeworCXJldHVybiBwYXJzZUludChsdmwpID49IHRoaXMuY3V0T2ZmTGV2ZWw7Cit9LCBnZXRFZmZlY3RpdmVMZXZlbDpmdW5jdGlvbiAoKSB7CisJaWYgKCh0aGlzLmN1dE9mZkxldmVsID09IDApICYmICh0aGlzLnBhcmVudCkpIHsKKwkJcmV0dXJuIHRoaXMucGFyZW50LmdldEVmZmVjdGl2ZUxldmVsKCk7CisJfQorCXJldHVybiB0aGlzLmN1dE9mZkxldmVsOworfSwgYWRkRmlsdGVyOmZ1bmN0aW9uIChmbHQpIHsKKwl0aGlzLmZpbHRlcnMucHVzaChmbHQpOworCXJldHVybiB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMTsKK30sIHJlbW92ZUZpbHRlckJ5SW5kZXg6ZnVuY3Rpb24gKGZsdEluZGV4KSB7CisJaWYgKHRoaXMuZmlsdGVyc1tmbHRJbmRleF0pIHsKKwkJZGVsZXRlIHRoaXMuZmlsdGVyc1tmbHRJbmRleF07CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCByZW1vdmVGaWx0ZXI6ZnVuY3Rpb24gKGZsdFJlZikgeworCWZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgeCsrKSB7CisJCWlmICh0aGlzLmZpbHRlcnNbeF0gPT09IGZsdFJlZikgeworCQkJZGVsZXRlIHRoaXMuZmlsdGVyc1t4XTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30sIHJlbW92ZUFsbEZpbHRlcnM6ZnVuY3Rpb24gKCkgeworCXRoaXMuZmlsdGVycyA9IFtdOworfSwgZmlsdGVyOmZ1bmN0aW9uIChyZWMpIHsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuZmlsdGVycy5sZW5ndGg7IHgrKykgeworCQlpZiAoKHRoaXMuZmlsdGVyc1t4XVsiZmlsdGVyIl0pICYmICghdGhpcy5maWx0ZXJzW3hdLmZpbHRlcihyZWMpKSB8fCAocmVjLmxldmVsIDwgdGhpcy5jdXRPZmZMZXZlbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIGFkZEhhbmRsZXI6ZnVuY3Rpb24gKGhkbHIpIHsKKwl0aGlzLmhhbmRsZXJzLnB1c2goaGRscik7CisJcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTsKK30sIGhhbmRsZTpmdW5jdGlvbiAocmVjKSB7CisJaWYgKCghdGhpcy5maWx0ZXIocmVjKSkgfHwgKHJlYy5sZXZlbCA8IHRoaXMuY3V0T2ZmTGV2ZWwpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmhhbmRsZXJzLmxlbmd0aDsgeCsrKSB7CisJCWlmICh0aGlzLmhhbmRsZXJzW3hdWyJoYW5kbGUiXSkgeworCQkJdGhpcy5oYW5kbGVyc1t4XS5oYW5kbGUocmVjKTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIGxvZzpmdW5jdGlvbiAobHZsLCBtc2cpIHsKKwlpZiAoKHRoaXMucHJvcGFnYXRlKSAmJiAodGhpcy5wYXJlbnQpICYmICh0aGlzLnBhcmVudC5yZWMubGV2ZWwgPj0gdGhpcy5jdXRPZmZMZXZlbCkpIHsKKwkJdGhpcy5wYXJlbnQubG9nKGx2bCwgbXNnKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl0aGlzLmhhbmRsZShuZXcgZG9qby5sb2dnaW5nLlJlY29yZChsdmwsIG1zZykpOworCXJldHVybiB0cnVlOworfSwgZGVidWc6ZnVuY3Rpb24gKG1zZykgeworCXJldHVybiB0aGlzLmxvZ1R5cGUoIkRFQlVHIiwgdGhpcy5fYXJnc1RvQXJyKGFyZ3VtZW50cykpOworfSwgaW5mbzpmdW5jdGlvbiAobXNnKSB7CisJcmV0dXJuIHRoaXMubG9nVHlwZSgiSU5GTyIsIHRoaXMuX2FyZ3NUb0Fycihhcmd1bWVudHMpKTsKK30sIHdhcm5pbmc6ZnVuY3Rpb24gKG1zZykgeworCXJldHVybiB0aGlzLmxvZ1R5cGUoIldBUk5JTkciLCB0aGlzLl9hcmdzVG9BcnIoYXJndW1lbnRzKSk7Cit9LCBlcnJvcjpmdW5jdGlvbiAobXNnKSB7CisJcmV0dXJuIHRoaXMubG9nVHlwZSgiRVJST1IiLCB0aGlzLl9hcmdzVG9BcnIoYXJndW1lbnRzKSk7Cit9LCBjcml0aWNhbDpmdW5jdGlvbiAobXNnKSB7CisJcmV0dXJuIHRoaXMubG9nVHlwZSgiQ1JJVElDQUwiLCB0aGlzLl9hcmdzVG9BcnIoYXJndW1lbnRzKSk7Cit9LCBleGNlcHRpb246ZnVuY3Rpb24gKG1zZywgZSwgc3F1ZWxjaCkgeworCWlmIChlKSB7CisJCXZhciBlcGFydHMgPSBbZS5uYW1lLCAoZS5kZXNjcmlwdGlvbiB8fCBlLm1lc3NhZ2UpXTsKKwkJaWYgKGUuZmlsZU5hbWUpIHsKKwkJCWVwYXJ0cy5wdXNoKGUuZmlsZU5hbWUpOworCQkJZXBhcnRzLnB1c2goImxpbmUgIiArIGUubGluZU51bWJlcik7CisJCX0KKwkJbXNnICs9ICIgIiArIGVwYXJ0cy5qb2luKCIgOiAiKTsKKwl9CisJdGhpcy5sb2dUeXBlKCJFUlJPUiIsIG1zZyk7CisJaWYgKCFzcXVlbGNoKSB7CisJCXRocm93IGU7CisJfQorfSwgbG9nVHlwZTpmdW5jdGlvbiAodHlwZSwgYXJncykgeworCXJldHVybiB0aGlzLmxvZy5hcHBseSh0aGlzLCBbZG9qby5sb2dnaW5nLmxvZy5nZXRMZXZlbCh0eXBlKSwgYXJnc10pOworfSwgd2FybjpmdW5jdGlvbiAoKSB7CisJdGhpcy53YXJuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBlcnI6ZnVuY3Rpb24gKCkgeworCXRoaXMuZXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGNyaXQ6ZnVuY3Rpb24gKCkgeworCXRoaXMuY3JpdGljYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK319KTsKK2Rvam8ubG9nZ2luZy5Mb2dIYW5kbGVyID0gZnVuY3Rpb24gKGxldmVsKSB7CisJdGhpcy5jdXRPZmZMZXZlbCA9IChsZXZlbCkgPyBsZXZlbCA6IDA7CisJdGhpcy5mb3JtYXR0ZXIgPSBudWxsOworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMuZmlsdGVycyA9IFtdOworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sb2dnaW5nLkxvZ0hhbmRsZXIsIHtzZXRGb3JtYXR0ZXI6ZnVuY3Rpb24gKGZvcm1hdHRlcikgeworCWRvam8udW5pbXBsZW1lbnRlZCgic2V0Rm9ybWF0dGVyIik7Cit9LCBmbHVzaDpmdW5jdGlvbiAoKSB7Cit9LCBjbG9zZTpmdW5jdGlvbiAoKSB7Cit9LCBoYW5kbGVFcnJvcjpmdW5jdGlvbiAoKSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmxvZ2dpbmcuTG9nSGFuZGxlci5oYW5kbGVFcnJvciIsICJ1c2UgaGFuZGxlKCkiLCAiMC42Iik7Cit9LCBoYW5kbGU6ZnVuY3Rpb24gKHJlY29yZCkgeworCWlmICgodGhpcy5maWx0ZXIocmVjb3JkKSkgJiYgKHJlY29yZC5sZXZlbCA+PSB0aGlzLmN1dE9mZkxldmVsKSkgeworCQl0aGlzLmVtaXQocmVjb3JkKTsKKwl9Cit9LCBlbWl0OmZ1bmN0aW9uIChyZWNvcmQpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImVtaXQiKTsKK319KTsKK3ZvaWQgKGZ1bmN0aW9uICgpIHsKKwl2YXIgbmFtZXMgPSBbInNldExldmVsIiwgImFkZEZpbHRlciIsICJyZW1vdmVGaWx0ZXJCeUluZGV4IiwgInJlbW92ZUZpbHRlciIsICJyZW1vdmVBbGxGaWx0ZXJzIiwgImZpbHRlciJdOworCXZhciB0Z3QgPSBkb2pvLmxvZ2dpbmcuTG9nSGFuZGxlci5wcm90b3R5cGU7CisJdmFyIHNyYyA9IGRvam8ubG9nZ2luZy5Mb2dnZXIucHJvdG90eXBlOworCWZvciAodmFyIHggPSAwOyB4IDwgbmFtZXMubGVuZ3RoOyB4KyspIHsKKwkJdGd0W25hbWVzW3hdXSA9IHNyY1tuYW1lc1t4XV07CisJfQorfSkoKTsKK2Rvam8ubG9nZ2luZy5sb2cgPSBuZXcgZG9qby5sb2dnaW5nLkxvZ2dlcigpOworZG9qby5sb2dnaW5nLmxvZy5sZXZlbHMgPSBbeyJuYW1lIjoiREVCVUciLCAibGV2ZWwiOjF9LCB7Im5hbWUiOiJJTkZPIiwgImxldmVsIjoyfSwgeyJuYW1lIjoiV0FSTklORyIsICJsZXZlbCI6M30sIHsibmFtZSI6IkVSUk9SIiwgImxldmVsIjo0fSwgeyJuYW1lIjoiQ1JJVElDQUwiLCAibGV2ZWwiOjV9XTsKK2Rvam8ubG9nZ2luZy5sb2cubG9nZ2VycyA9IHt9OworZG9qby5sb2dnaW5nLmxvZy5nZXRMb2dnZXIgPSBmdW5jdGlvbiAobmFtZSkgeworCWlmICghdGhpcy5sb2dnZXJzW25hbWVdKSB7CisJCXRoaXMubG9nZ2Vyc1tuYW1lXSA9IG5ldyBkb2pvLmxvZ2dpbmcuTG9nZ2VyKCk7CisJCXRoaXMubG9nZ2Vyc1tuYW1lXS5wYXJlbnQgPSB0aGlzOworCX0KKwlyZXR1cm4gdGhpcy5sb2dnZXJzW25hbWVdOworfTsKK2Rvam8ubG9nZ2luZy5sb2cuZ2V0TGV2ZWxOYW1lID0gZnVuY3Rpb24gKGx2bCkgeworCWZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5sZXZlbHMubGVuZ3RoOyB4KyspIHsKKwkJaWYgKHRoaXMubGV2ZWxzW3hdLmxldmVsID09IGx2bCkgeworCQkJcmV0dXJuIHRoaXMubGV2ZWxzW3hdLm5hbWU7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9OworZG9qby5sb2dnaW5nLmxvZy5nZXRMZXZlbCA9IGZ1bmN0aW9uIChuYW1lKSB7CisJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmxldmVscy5sZW5ndGg7IHgrKykgeworCQlpZiAodGhpcy5sZXZlbHNbeF0ubmFtZS50b1VwcGVyQ2FzZSgpID09IG5hbWUudG9VcHBlckNhc2UoKSkgeworCQkJcmV0dXJuIHRoaXMubGV2ZWxzW3hdLmxldmVsOworCQl9CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8uZGVjbGFyZSgiZG9qby5sb2dnaW5nLk1lbW9yeUxvZ0hhbmRsZXIiLCBkb2pvLmxvZ2dpbmcuTG9nSGFuZGxlciwge2luaXRpYWxpemVyOmZ1bmN0aW9uIChsZXZlbCwgcmVjb3Jkc1RvS2VlcCwgcG9zdFR5cGUsIHBvc3RJbnRlcnZhbCkgeworCWRvam8ubG9nZ2luZy5Mb2dIYW5kbGVyLmNhbGwodGhpcywgbGV2ZWwpOworCXRoaXMubnVtUmVjb3JkcyA9ICh0eXBlb2YgZGpDb25maWdbImxvZ2dpbmdOdW1SZWNvcmRzIl0gIT0gInVuZGVmaW5lZCIpID8gZGpDb25maWdbImxvZ2dpbmdOdW1SZWNvcmRzIl0gOiAoKHJlY29yZHNUb0tlZXApID8gcmVjb3Jkc1RvS2VlcCA6IC0xKTsKKwl0aGlzLnBvc3RUeXBlID0gKHR5cGVvZiBkakNvbmZpZ1sibG9nZ2luZ1Bvc3RUeXBlIl0gIT0gInVuZGVmaW5lZCIpID8gZGpDb25maWdbImxvZ2dpbmdQb3N0VHlwZSJdIDogKHBvc3RUeXBlIHx8IC0xKTsKKwl0aGlzLnBvc3RJbnRlcnZhbCA9ICh0eXBlb2YgZGpDb25maWdbImxvZ2dpbmdQb3N0SW50ZXJ2YWwiXSAhPSAidW5kZWZpbmVkIikgPyBkakNvbmZpZ1sibG9nZ2luZ1Bvc3RJbnRlcnZhbCJdIDogKHBvc3RUeXBlIHx8IC0xKTsKK30sIGVtaXQ6ZnVuY3Rpb24gKHJlY29yZCkgeworCWlmICghZGpDb25maWcuaXNEZWJ1ZykgeworCQlyZXR1cm47CisJfQorCXZhciBsb2dTdHIgPSBTdHJpbmcoZG9qby5sb2cuZ2V0TGV2ZWxOYW1lKHJlY29yZC5sZXZlbCkgKyAiOiAiICsgcmVjb3JkLnRpbWUudG9Mb2NhbGVUaW1lU3RyaW5nKCkpICsgIjogIiArIHJlY29yZC5tZXNzYWdlOworCWlmICghZGpfdW5kZWYoInByaW50bG4iLCBkb2pvLmhvc3RlbnYpKSB7CisJCWRvam8uaG9zdGVudi5wcmludGxuKGxvZ1N0ciwgcmVjb3JkLm1zZ0FyZ3MpOworCX0KKwl0aGlzLmRhdGEucHVzaChyZWNvcmQpOworCWlmICh0aGlzLm51bVJlY29yZHMgIT0gLTEpIHsKKwkJd2hpbGUgKHRoaXMuZGF0YS5sZW5ndGggPiB0aGlzLm51bVJlY29yZHMpIHsKKwkJCXRoaXMuZGF0YS5zaGlmdCgpOworCQl9CisJfQorfX0pOworZG9qby5sb2dnaW5nLmxvZ1F1ZXVlSGFuZGxlciA9IG5ldyBkb2pvLmxvZ2dpbmcuTWVtb3J5TG9nSGFuZGxlcigwLCA1MCwgMCwgMTAwMDApOworZG9qby5sb2dnaW5nLmxvZy5hZGRIYW5kbGVyKGRvam8ubG9nZ2luZy5sb2dRdWV1ZUhhbmRsZXIpOworZG9qby5sb2cgPSBkb2pvLmxvZ2dpbmcubG9nOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9sb2dnaW5nL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmE3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbG9nZ2luZy9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOltbImRvam8ubG9nZ2luZy5Mb2dnZXIiLCBmYWxzZSwgZmFsc2VdXSwgcmhpbm86WyJkb2pvLmxvZ2dpbmcuUmhpbm9Mb2dnZXIiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxvZ2dpbmcuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbWF0aC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9tYXRoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjBiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbWF0aC5qcwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5tYXRoIik7Citkb2pvLm1hdGguZGVnVG9SYWQgPSBmdW5jdGlvbiAoeCkgeworCXJldHVybiAoeCAqIE1hdGguUEkpIC8gMTgwOworfTsKK2Rvam8ubWF0aC5yYWRUb0RlZyA9IGZ1bmN0aW9uICh4KSB7CisJcmV0dXJuICh4ICogMTgwKSAvIE1hdGguUEk7Cit9OworZG9qby5tYXRoLmZhY3RvcmlhbCA9IGZ1bmN0aW9uIChuKSB7CisJaWYgKG4gPCAxKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgcmV0VmFsID0gMTsKKwlmb3IgKHZhciBpID0gMTsgaSA8PSBuOyBpKyspIHsKKwkJcmV0VmFsICo9IGk7CisJfQorCXJldHVybiByZXRWYWw7Cit9OworZG9qby5tYXRoLnBlcm11dGF0aW9ucyA9IGZ1bmN0aW9uIChuLCBrKSB7CisJaWYgKG4gPT0gMCB8fCBrID09IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAoZG9qby5tYXRoLmZhY3RvcmlhbChuKSAvIGRvam8ubWF0aC5mYWN0b3JpYWwobiAtIGspKTsKK307Citkb2pvLm1hdGguY29tYmluYXRpb25zID0gZnVuY3Rpb24gKG4sIHIpIHsKKwlpZiAobiA9PSAwIHx8IHIgPT0gMCkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIChkb2pvLm1hdGguZmFjdG9yaWFsKG4pIC8gKGRvam8ubWF0aC5mYWN0b3JpYWwobiAtIHIpICogZG9qby5tYXRoLmZhY3RvcmlhbChyKSkpOworfTsKK2Rvam8ubWF0aC5iZXJuc3RlaW4gPSBmdW5jdGlvbiAodCwgbiwgaSkgeworCXJldHVybiAoZG9qby5tYXRoLmNvbWJpbmF0aW9ucyhuLCBpKSAqIE1hdGgucG93KHQsIGkpICogTWF0aC5wb3coMSAtIHQsIG4gLSBpKSk7Cit9OworZG9qby5tYXRoLmdhdXNzaWFuUmFuZG9tID0gZnVuY3Rpb24gKCkgeworCXZhciBrID0gMjsKKwlkbyB7CisJCXZhciBpID0gMiAqIE1hdGgucmFuZG9tKCkgLSAxOworCQl2YXIgaiA9IDIgKiBNYXRoLnJhbmRvbSgpIC0gMTsKKwkJayA9IGkgKiBpICsgaiAqIGo7CisJfSB3aGlsZSAoayA+PSAxKTsKKwlrID0gTWF0aC5zcXJ0KCgtMiAqIE1hdGgubG9nKGspKSAvIGspOworCXJldHVybiBpICogazsKK307Citkb2pvLm1hdGgubWVhbiA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgYXJyYXkgPSBkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pID8gYXJndW1lbnRzWzBdIDogYXJndW1lbnRzOworCXZhciBtZWFuID0gMDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCW1lYW4gKz0gYXJyYXlbaV07CisJfQorCXJldHVybiBtZWFuIC8gYXJyYXkubGVuZ3RoOworfTsKK2Rvam8ubWF0aC5yb3VuZCA9IGZ1bmN0aW9uIChudW1iZXIsIHBsYWNlcykgeworCWlmICghcGxhY2VzKSB7CisJCXZhciBzaGlmdCA9IDE7CisJfSBlbHNlIHsKKwkJdmFyIHNoaWZ0ID0gTWF0aC5wb3coMTAsIHBsYWNlcyk7CisJfQorCXJldHVybiBNYXRoLnJvdW5kKG51bWJlciAqIHNoaWZ0KSAvIHNoaWZ0OworfTsKK2Rvam8ubWF0aC5zZCA9IGRvam8ubWF0aC5zdGFuZGFyZERldmlhdGlvbiA9IGZ1bmN0aW9uICgpIHsKKwl2YXIgYXJyYXkgPSBkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pID8gYXJndW1lbnRzWzBdIDogYXJndW1lbnRzOworCXJldHVybiBNYXRoLnNxcnQoZG9qby5tYXRoLnZhcmlhbmNlKGFycmF5KSk7Cit9OworZG9qby5tYXRoLnZhcmlhbmNlID0gZnVuY3Rpb24gKCkgeworCXZhciBhcnJheSA9IGRvam8ubGFuZy5pc0FycmF5KGFyZ3VtZW50c1swXSkgPyBhcmd1bWVudHNbMF0gOiBhcmd1bWVudHM7CisJdmFyIG1lYW4gPSAwLCBzcXVhcmVzID0gMDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCW1lYW4gKz0gYXJyYXlbaV07CisJCXNxdWFyZXMgKz0gTWF0aC5wb3coYXJyYXlbaV0sIDIpOworCX0KKwlyZXR1cm4gKHNxdWFyZXMgLyBhcnJheS5sZW5ndGgpIC0gTWF0aC5wb3cobWVhbiAvIGFycmF5Lmxlbmd0aCwgMik7Cit9OworZG9qby5tYXRoLnJhbmdlID0gZnVuY3Rpb24gKGEsIGIsIHN0ZXApIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKKwkJYiA9IGE7CisJCWEgPSAwOworCX0KKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsKKwkJc3RlcCA9IDE7CisJfQorCXZhciByYW5nZSA9IFtdOworCWlmIChzdGVwID4gMCkgeworCQlmb3IgKHZhciBpID0gYTsgaSA8IGI7IGkgKz0gc3RlcCkgeworCQkJcmFuZ2UucHVzaChpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGVwIDwgMCkgeworCQkJZm9yICh2YXIgaSA9IGE7IGkgPiBiOyBpICs9IHN0ZXApIHsKKwkJCQlyYW5nZS5wdXNoKGkpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IEVycm9yKCJkb2pvLm1hdGgucmFuZ2U6IHN0ZXAgbXVzdCBiZSBub24temVybyIpOworCQl9CisJfQorCXJldHVybiByYW5nZTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9tYXRoL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0OTNkYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9tYXRoL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246W1siZG9qby5tYXRoIiwgZmFsc2UsIGZhbHNlXSwgWyJkb2pvLm1hdGguY3VydmVzIiwgZmFsc2UsIGZhbHNlXSwgWyJkb2pvLm1hdGgucG9pbnRzIiwgZmFsc2UsIGZhbHNlXV19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5tYXRoLioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvY3VydmVzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvY3VydmVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbWF0aC9jdXJ2ZXMuanMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ubWF0aC5jdXJ2ZXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoIik7Citkb2pvLm1hdGguY3VydmVzID0ge0xpbmU6ZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHsKKwl0aGlzLnN0YXJ0ID0gc3RhcnQ7CisJdGhpcy5lbmQgPSBlbmQ7CisJdGhpcy5kaW1lbnNpb25zID0gc3RhcnQubGVuZ3RoOworCWZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHsKKwkJc3RhcnRbaV0gPSBOdW1iZXIoc3RhcnRbaV0pOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykgeworCQllbmRbaV0gPSBOdW1iZXIoZW5kW2ldKTsKKwl9CisJdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuKSB7CisJCXZhciByZXRWYWwgPSBuZXcgQXJyYXkodGhpcy5kaW1lbnNpb25zKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpbWVuc2lvbnM7IGkrKykgeworCQkJcmV0VmFsW2ldID0gKCh0aGlzLmVuZFtpXSAtIHRoaXMuc3RhcnRbaV0pICogbikgKyB0aGlzLnN0YXJ0W2ldOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfTsKKwlyZXR1cm4gdGhpczsKK30sIEJlemllcjpmdW5jdGlvbiAocG50cykgeworCXRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoc3RlcCkgeworCQlpZiAoc3RlcCA+PSAxKSB7CisJCQlyZXR1cm4gdGhpcy5wW3RoaXMucC5sZW5ndGggLSAxXTsKKwkJfQorCQlpZiAoc3RlcCA8PSAwKSB7CisJCQlyZXR1cm4gdGhpcy5wWzBdOworCQl9CisJCXZhciByZXRWYWwgPSBuZXcgQXJyYXkodGhpcy5wWzBdLmxlbmd0aCk7CisJCWZvciAodmFyIGsgPSAwOyBqIDwgdGhpcy5wWzBdLmxlbmd0aDsgaysrKSB7CisJCQlyZXRWYWxba10gPSAwOworCQl9CisJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5wWzBdLmxlbmd0aDsgaisrKSB7CisJCQl2YXIgQyA9IDA7CisJCQl2YXIgRCA9IDA7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucC5sZW5ndGg7IGkrKykgeworCQkJCUMgKz0gdGhpcy5wW2ldW2pdICogdGhpcy5wW3RoaXMucC5sZW5ndGggLSAxXVswXSAqIGRvam8ubWF0aC5iZXJuc3RlaW4oc3RlcCwgdGhpcy5wLmxlbmd0aCwgaSk7CisJCQl9CisJCQlmb3IgKHZhciBsID0gMDsgbCA8IHRoaXMucC5sZW5ndGg7IGwrKykgeworCQkJCUQgKz0gdGhpcy5wW3RoaXMucC5sZW5ndGggLSAxXVswXSAqIGRvam8ubWF0aC5iZXJuc3RlaW4oc3RlcCwgdGhpcy5wLmxlbmd0aCwgbCk7CisJCQl9CisJCQlyZXRWYWxbal0gPSBDIC8gRDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX07CisJdGhpcy5wID0gcG50czsKKwlyZXR1cm4gdGhpczsKK30sIENhdG11bGxSb206ZnVuY3Rpb24gKHBudHMsIGMpIHsKKwl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24gKHN0ZXApIHsKKwkJdmFyIHBlcmNlbnQgPSBzdGVwICogKHRoaXMucC5sZW5ndGggLSAxKTsKKwkJdmFyIG5vZGUgPSBNYXRoLmZsb29yKHBlcmNlbnQpOworCQl2YXIgcHJvZ3Jlc3MgPSBwZXJjZW50IC0gbm9kZTsKKwkJdmFyIGkwID0gbm9kZSAtIDE7CisJCWlmIChpMCA8IDApIHsKKwkJCWkwID0gMDsKKwkJfQorCQl2YXIgaSA9IG5vZGU7CisJCXZhciBpMSA9IG5vZGUgKyAxOworCQlpZiAoaTEgPj0gdGhpcy5wLmxlbmd0aCkgeworCQkJaTEgPSB0aGlzLnAubGVuZ3RoIC0gMTsKKwkJfQorCQl2YXIgaTIgPSBub2RlICsgMjsKKwkJaWYgKGkyID49IHRoaXMucC5sZW5ndGgpIHsKKwkJCWkyID0gdGhpcy5wLmxlbmd0aCAtIDE7CisJCX0KKwkJdmFyIHUgPSBwcm9ncmVzczsKKwkJdmFyIHUyID0gcHJvZ3Jlc3MgKiBwcm9ncmVzczsKKwkJdmFyIHUzID0gcHJvZ3Jlc3MgKiBwcm9ncmVzcyAqIHByb2dyZXNzOworCQl2YXIgcmV0VmFsID0gbmV3IEFycmF5KHRoaXMucFswXS5sZW5ndGgpOworCQlmb3IgKHZhciBrID0gMDsgayA8IHRoaXMucFswXS5sZW5ndGg7IGsrKykgeworCQkJdmFyIHgxID0gKC10aGlzLmMgKiB0aGlzLnBbaTBdW2tdKSArICgoMiAtIHRoaXMuYykgKiB0aGlzLnBbaV1ba10pICsgKCh0aGlzLmMgLSAyKSAqIHRoaXMucFtpMV1ba10pICsgKHRoaXMuYyAqIHRoaXMucFtpMl1ba10pOworCQkJdmFyIHgyID0gKDIgKiB0aGlzLmMgKiB0aGlzLnBbaTBdW2tdKSArICgodGhpcy5jIC0gMykgKiB0aGlzLnBbaV1ba10pICsgKCgzIC0gMiAqIHRoaXMuYykgKiB0aGlzLnBbaTFdW2tdKSArICgtdGhpcy5jICogdGhpcy5wW2kyXVtrXSk7CisJCQl2YXIgeDMgPSAoLXRoaXMuYyAqIHRoaXMucFtpMF1ba10pICsgKHRoaXMuYyAqIHRoaXMucFtpMV1ba10pOworCQkJdmFyIHg0ID0gdGhpcy5wW2ldW2tdOworCQkJcmV0VmFsW2tdID0geDEgKiB1MyArIHgyICogdTIgKyB4MyAqIHUgKyB4NDsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX07CisJaWYgKCFjKSB7CisJCXRoaXMuYyA9IDAuNzsKKwl9IGVsc2UgeworCQl0aGlzLmMgPSBjOworCX0KKwl0aGlzLnAgPSBwbnRzOworCXJldHVybiB0aGlzOworfSwgQXJjOmZ1bmN0aW9uIChzdGFydCwgZW5kLCBjY3cpIHsKKwl2YXIgY2VudGVyID0gZG9qby5tYXRoLnBvaW50cy5taWRwb2ludChzdGFydCwgZW5kKTsKKwl2YXIgc2lkZXMgPSBkb2pvLm1hdGgucG9pbnRzLnRyYW5zbGF0ZShkb2pvLm1hdGgucG9pbnRzLmludmVydChjZW50ZXIpLCBzdGFydCk7CisJdmFyIHJhZCA9IE1hdGguc3FydChNYXRoLnBvdyhzaWRlc1swXSwgMikgKyBNYXRoLnBvdyhzaWRlc1sxXSwgMikpOworCXZhciB0aGV0YSA9IGRvam8ubWF0aC5yYWRUb0RlZyhNYXRoLmF0YW4oc2lkZXNbMV0gLyBzaWRlc1swXSkpOworCWlmIChzaWRlc1swXSA8IDApIHsKKwkJdGhldGEgLT0gOTA7CisJfSBlbHNlIHsKKwkJdGhldGEgKz0gOTA7CisJfQorCWRvam8ubWF0aC5jdXJ2ZXMuQ2VudGVyZWRBcmMuY2FsbCh0aGlzLCBjZW50ZXIsIHJhZCwgdGhldGEsIHRoZXRhICsgKGNjdyA/IC0xODAgOiAxODApKTsKK30sIENlbnRlcmVkQXJjOmZ1bmN0aW9uIChjZW50ZXIsIHJhZGl1cywgc3RhcnQsIGVuZCkgeworCXRoaXMuY2VudGVyID0gY2VudGVyOworCXRoaXMucmFkaXVzID0gcmFkaXVzOworCXRoaXMuc3RhcnQgPSBzdGFydCB8fCAwOworCXRoaXMuZW5kID0gZW5kOworCXRoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAobikgeworCQl2YXIgcmV0VmFsID0gbmV3IEFycmF5KDIpOworCQl2YXIgdGhldGEgPSBkb2pvLm1hdGguZGVnVG9SYWQodGhpcy5zdGFydCArICgodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAqIG4pKTsKKwkJcmV0VmFsWzBdID0gdGhpcy5jZW50ZXJbMF0gKyB0aGlzLnJhZGl1cyAqIE1hdGguc2luKHRoZXRhKTsKKwkJcmV0VmFsWzFdID0gdGhpcy5jZW50ZXJbMV0gLSB0aGlzLnJhZGl1cyAqIE1hdGguY29zKHRoZXRhKTsKKwkJcmV0dXJuIHJldFZhbDsKKwl9OworCXJldHVybiB0aGlzOworfSwgQ2lyY2xlOmZ1bmN0aW9uIChjZW50ZXIsIHJhZGl1cykgeworCWRvam8ubWF0aC5jdXJ2ZXMuQ2VudGVyZWRBcmMuY2FsbCh0aGlzLCBjZW50ZXIsIHJhZGl1cywgMCwgMzYwKTsKKwlyZXR1cm4gdGhpczsKK30sIFBhdGg6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJ2ZXMgPSBbXTsKKwl2YXIgd2VpZ2h0cyA9IFtdOworCXZhciByYW5nZXMgPSBbXTsKKwl2YXIgdG90YWxXZWlnaHQgPSAwOworCXRoaXMuYWRkID0gZnVuY3Rpb24gKGN1cnZlLCB3ZWlnaHQpIHsKKwkJaWYgKHdlaWdodCA8IDApIHsKKwkJCWRvam8ucmFpc2UoImRvam8ubWF0aC5jdXJ2ZXMuUGF0aC5hZGQ6IHdlaWdodCBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTsKKwkJfQorCQljdXJ2ZXMucHVzaChjdXJ2ZSk7CisJCXdlaWdodHMucHVzaCh3ZWlnaHQpOworCQl0b3RhbFdlaWdodCArPSB3ZWlnaHQ7CisJCWNvbXB1dGVSYW5nZXMoKTsKKwl9OworCXRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKGN1cnZlKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY3VydmVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoY3VydmVzW2ldID09IGN1cnZlKSB7CisJCQkJY3VydmVzLnNwbGljZShpLCAxKTsKKwkJCQl0b3RhbFdlaWdodCAtPSB3ZWlnaHRzLnNwbGljZShpLCAxKVswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljb21wdXRlUmFuZ2VzKCk7CisJfTsKKwl0aGlzLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHsKKwkJY3VydmVzID0gW107CisJCXdlaWdodHMgPSBbXTsKKwkJdG90YWxXZWlnaHQgPSAwOworCX07CisJdGhpcy5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuKSB7CisJCXZhciBmb3VuZCA9IGZhbHNlLCB2YWx1ZSA9IDA7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgciA9IHJhbmdlc1tpXTsKKwkJCWlmIChuID49IHJbMF0gJiYgbiA8IHJbMV0pIHsKKwkJCQl2YXIgc3ViTiA9IChuIC0gclswXSkgLyByWzJdOworCQkJCXZhbHVlID0gY3VydmVzW2ldLmdldFZhbHVlKHN1Yk4pOworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQl2YWx1ZSA9IGN1cnZlc1tjdXJ2ZXMubGVuZ3RoIC0gMV0uZ2V0VmFsdWUoMSk7CisJCX0KKwkJZm9yICh2YXIgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCXZhbHVlID0gZG9qby5tYXRoLnBvaW50cy50cmFuc2xhdGUodmFsdWUsIGN1cnZlc1tqXS5nZXRWYWx1ZSgxKSk7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX07CisJZnVuY3Rpb24gY29tcHV0ZVJhbmdlcygpIHsKKwkJdmFyIHN0YXJ0ID0gMDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZW5kID0gc3RhcnQgKyB3ZWlnaHRzW2ldIC8gdG90YWxXZWlnaHQ7CisJCQl2YXIgbGVuID0gZW5kIC0gc3RhcnQ7CisJCQlyYW5nZXNbaV0gPSBbc3RhcnQsIGVuZCwgbGVuXTsKKwkJCXN0YXJ0ID0gZW5kOworCQl9CisJfQorCXJldHVybiB0aGlzOworfX07CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9tYXRoL21hdHJpeC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9tYXRoL21hdHJpeC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvbWF0cml4LmpzCkBAIC0wLDAgKzEsMzAzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLm1hdGgubWF0cml4Iik7Citkb2pvLm1hdGgubWF0cml4LmlERiA9IDA7Citkb2pvLm1hdGgubWF0cml4LkFMTU9TVF9aRVJPID0gMWUtMTA7Citkb2pvLm1hdGgubWF0cml4Lm11bHRpcGx5ID0gZnVuY3Rpb24gKGEsIGIpIHsKKwl2YXIgYXkgPSBhLmxlbmd0aDsKKwl2YXIgYXggPSBhWzBdLmxlbmd0aDsKKwl2YXIgYnkgPSBiLmxlbmd0aDsKKwl2YXIgYnggPSBiWzBdLmxlbmd0aDsKKwlpZiAoYXggIT0gYnkpIHsKKwkJZG9qby5kZWJ1ZygiQ2FuJ3QgbXVsdGlwbHkgbWF0cmljaWVzIG9mIHNpemVzICIgKyBheCArICIsIiArIGF5ICsgIiBhbmQgIiArIGJ4ICsgIiwiICsgYnkpOworCQlyZXR1cm4gW1swXV07CisJfQorCXZhciBjID0gW107CisJZm9yICh2YXIgayA9IDA7IGsgPCBheTsgaysrKSB7CisJCWNba10gPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBieDsgaSsrKSB7CisJCQljW2tdW2ldID0gMDsKKwkJCWZvciAodmFyIG0gPSAwOyBtIDwgYXg7IG0rKykgeworCQkJCWNba11baV0gKz0gYVtrXVttXSAqIGJbbV1baV07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGM7Cit9OworZG9qby5tYXRoLm1hdHJpeC5wcm9kdWN0ID0gZnVuY3Rpb24gKCkgeworCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKKwkJZG9qby5kZWJ1ZygiY2FuJ3QgbXVsdGlwbHkgMCBtYXRyaWNlcyEiKTsKKwkJcmV0dXJuIDE7CisJfQorCXZhciByZXN1bHQgPSBhcmd1bWVudHNbMF07CisJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0ID0gZG9qby5tYXRoLm1hdHJpeC5tdWx0aXBseShyZXN1bHQsIGFyZ3VtZW50c1tpXSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9OworZG9qby5tYXRoLm1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgeworCQlkb2pvLmRlYnVnKCJjYW4ndCBzdW0gMCBtYXRyaWNlcyEiKTsKKwkJcmV0dXJuIDA7CisJfQorCXZhciByZXN1bHQgPSBkb2pvLm1hdGgubWF0cml4LmNvcHkoYXJndW1lbnRzWzBdKTsKKwl2YXIgcm93cyA9IHJlc3VsdC5sZW5ndGg7CisJaWYgKHJvd3MgPT0gMCkgeworCQlkb2pvLmRlYnVnKCJjYW4ndCBkZWFsIHdpdGggbWF0cmljZXMgb2YgMCByb3dzISIpOworCQlyZXR1cm4gMDsKKwl9CisJdmFyIGNvbHMgPSByZXN1bHRbMF0ubGVuZ3RoOworCWlmIChjb2xzID09IDApIHsKKwkJZG9qby5kZWJ1ZygiY2FuJ3QgZGVhbCB3aXRoIG1hdHJpY2VzIG9mIDAgY29scyEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisJCXZhciBhcmcgPSBhcmd1bWVudHNbaV07CisJCWlmIChhcmcubGVuZ3RoICE9IHJvd3MgfHwgYXJnWzBdLmxlbmd0aCAhPSBjb2xzKSB7CisJCQlkb2pvLmRlYnVnKCJjYW4ndCBhZGQgbWF0cmljZXMgb2YgZGlmZmVyZW50IGRpbWVuc2lvbnM6IGZpcnN0IGRpbWVuc2lvbnMgd2VyZSAiICsgcm93cyArICJ4IiArIGNvbHMgKyAiLCBjdXJyZW50IGRpbWVuc2lvbnMgYXJlICIgKyBhcmcubGVuZ3RoICsgIngiICsgYXJnWzBdLmxlbmd0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmb3IgKHZhciByID0gMDsgciA8IHJvd3M7IHIrKykgeworCQkJZm9yICh2YXIgYyA9IDA7IGMgPCBjb2xzOyBjKyspIHsKKwkJCQlyZXN1bHRbcl1bY10gKz0gYXJnW3JdW2NdOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9OworZG9qby5tYXRoLm1hdHJpeC5pbnZlcnNlID0gZnVuY3Rpb24gKGEpIHsKKwlpZiAoYS5sZW5ndGggPT0gMSAmJiBhWzBdLmxlbmd0aCA9PSAxKSB7CisJCXJldHVybiBbWzEgLyBhWzBdWzBdXV07CisJfQorCXZhciB0bXMgPSBhLmxlbmd0aDsKKwl2YXIgbSA9IGRvam8ubWF0aC5tYXRyaXguY3JlYXRlKHRtcywgdG1zKTsKKwl2YXIgbW0gPSBkb2pvLm1hdGgubWF0cml4LmFkam9pbnQoYSk7CisJdmFyIGRldCA9IGRvam8ubWF0aC5tYXRyaXguZGV0ZXJtaW5hbnQoYSk7CisJdmFyIGRkID0gMDsKKwlpZiAoZGV0ID09IDApIHsKKwkJZG9qby5kZWJ1ZygiRGV0ZXJtaW5hbnQgRXF1YWxzIDAsIE5vdCBJbnZlcnRpYmxlLiIpOworCQlyZXR1cm4gW1swXV07CisJfSBlbHNlIHsKKwkJZGQgPSAxIC8gZGV0OworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRtczsgaSsrKSB7CisJCWZvciAodmFyIGogPSAwOyBqIDwgdG1zOyBqKyspIHsKKwkJCW1baV1bal0gPSBkZCAqIG1tW2ldW2pdOworCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXguZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkgeworCWlmIChhLmxlbmd0aCAhPSBhWzBdLmxlbmd0aCkgeworCQlkb2pvLmRlYnVnKCJDYW4ndCBjYWxjdWxhdGUgdGhlIGRldGVybWlhbnQgb2YgYSBub24tc3F1cmUgbWF0cml4ISIpOworCQlyZXR1cm4gMDsKKwl9CisJdmFyIHRtcyA9IGEubGVuZ3RoOworCXZhciBkZXQgPSAxOworCXZhciBiID0gZG9qby5tYXRoLm1hdHJpeC51cHBlclRyaWFuZ2xlKGEpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdG1zOyBpKyspIHsKKwkJdmFyIGJpaSA9IGJbaV1baV07CisJCWlmIChNYXRoLmFicyhiaWkpIDwgZG9qby5tYXRoLm1hdHJpeC5BTE1PU1RfWkVSTykgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGV0ICo9IGJpaTsKKwl9CisJZGV0ID0gZGV0ICogZG9qby5tYXRoLm1hdHJpeC5pREY7CisJcmV0dXJuIGRldDsKK307Citkb2pvLm1hdGgubWF0cml4LnVwcGVyVHJpYW5nbGUgPSBmdW5jdGlvbiAobSkgeworCW0gPSBkb2pvLm1hdGgubWF0cml4LmNvcHkobSk7CisJdmFyIGYxID0gMDsKKwl2YXIgdGVtcCA9IDA7CisJdmFyIHRtcyA9IG0ubGVuZ3RoOworCXZhciB2ID0gMTsKKwlkb2pvLm1hdGgubWF0cml4LmlERiA9IDE7CisJZm9yICh2YXIgY29sID0gMDsgY29sIDwgdG1zIC0gMTsgY29sKyspIHsKKwkJaWYgKHR5cGVvZiBtW2NvbF1bY29sXSAhPSAibnVtYmVyIikgeworCQkJZG9qby5kZWJ1Zygibm9uLW51bWVyaWMgZW50cnkgZm91bmQgaW4gYSBudW1lcmljIG1hdHJpeDogbVsiICsgY29sICsgIl1bIiArIGNvbCArICJdPSIgKyBtW2NvbF1bY29sXSk7CisJCX0KKwkJdiA9IDE7CisJCXZhciBzdG9wX2xvb3AgPSAwOworCQl3aGlsZSAoKG1bY29sXVtjb2xdID09IDApICYmICFzdG9wX2xvb3ApIHsKKwkJCWlmIChjb2wgKyB2ID49IHRtcykgeworCQkJCWRvam8ubWF0aC5tYXRyaXguaURGID0gMDsKKwkJCQlzdG9wX2xvb3AgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHZhciByID0gMDsgciA8IHRtczsgcisrKSB7CisJCQkJCXRlbXAgPSBtW2NvbF1bcl07CisJCQkJCW1bY29sXVtyXSA9IG1bY29sICsgdl1bcl07CisJCQkJCW1bY29sICsgdl1bcl0gPSB0ZW1wOworCQkJCX0KKwkJCQl2Kys7CisJCQkJZG9qby5tYXRoLm1hdHJpeC5pREYgKj0gLTE7CisJCQl9CisJCX0KKwkJZm9yICh2YXIgcm93ID0gY29sICsgMTsgcm93IDwgdG1zOyByb3crKykgeworCQkJaWYgKHR5cGVvZiBtW3Jvd11bY29sXSAhPSAibnVtYmVyIikgeworCQkJCWRvam8uZGVidWcoIm5vbi1udW1lcmljIGVudHJ5IGZvdW5kIGluIGEgbnVtZXJpYyBtYXRyaXg6IG1bIiArIHJvdyArICJdWyIgKyBjb2wgKyAiXT0iICsgbVtyb3ddW2NvbF0pOworCQkJfQorCQkJaWYgKHR5cGVvZiBtW2NvbF1bcm93XSAhPSAibnVtYmVyIikgeworCQkJCWRvam8uZGVidWcoIm5vbi1udW1lcmljIGVudHJ5IGZvdW5kIGluIGEgbnVtZXJpYyBtYXRyaXg6IG1bIiArIGNvbCArICJdWyIgKyByb3cgKyAiXT0iICsgbVtjb2xdW3Jvd10pOworCQkJfQorCQkJaWYgKG1bY29sXVtjb2xdICE9IDApIHsKKwkJCQl2YXIgZjEgPSAoLTEpICogbVtyb3ddW2NvbF0gLyBtW2NvbF1bY29sXTsKKwkJCQlmb3IgKHZhciBpID0gY29sOyBpIDwgdG1zOyBpKyspIHsKKwkJCQkJbVtyb3ddW2ldID0gZjEgKiBtW2NvbF1baV0gKyBtW3Jvd11baV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXguY3JlYXRlID0gZnVuY3Rpb24gKGEsIGIsIHZhbHVlKSB7CisJaWYgKCF2YWx1ZSkgeworCQl2YWx1ZSA9IDA7CisJfQorCXZhciBtID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCBiOyBpKyspIHsKKwkJbVtpXSA9IFtdOworCQlmb3IgKHZhciBqID0gMDsgaiA8IGE7IGorKykgeworCQkJbVtpXVtqXSA9IHZhbHVlOworCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXgub25lcyA9IGZ1bmN0aW9uIChhLCBiKSB7CisJcmV0dXJuIGRvam8ubWF0aC5tYXRyaXguY3JlYXRlKGEsIGIsIDEpOworfTsKK2Rvam8ubWF0aC5tYXRyaXguemVyb3MgPSBmdW5jdGlvbiAoYSwgYikgeworCXJldHVybiBkb2pvLm1hdGgubWF0cml4LmNyZWF0ZShhLCBiLCAwKTsKK307Citkb2pvLm1hdGgubWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHNpemUsIHNjYWxlKSB7CisJaWYgKCFzY2FsZSkgeworCQlzY2FsZSA9IDE7CisJfQorCXZhciBtID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbVtpXSA9IFtdOworCQlmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGorKykgeworCQkJbVtpXVtqXSA9IChpID09IGogPyBzY2FsZSA6IDApOworCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXguYWRqb2ludCA9IGZ1bmN0aW9uIChhKSB7CisJdmFyIHRtcyA9IGEubGVuZ3RoOworCWlmICh0bXMgPD0gMSkgeworCQlkb2pvLmRlYnVnKCJDYW4ndCBmaW5kIHRoZSBhZGpvaW50IG9mIGEgbWF0cml4IHdpdGggYSBkaW1lbnNpb24gbGVzcyB0aGFuIDIiKTsKKwkJcmV0dXJuIFtbMF1dOworCX0KKwlpZiAoYS5sZW5ndGggIT0gYVswXS5sZW5ndGgpIHsKKwkJZG9qby5kZWJ1ZygiQ2FuJ3QgZmluZCB0aGUgYWRqb2ludCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4Iik7CisJCXJldHVybiBbWzBdXTsKKwl9CisJdmFyIG0gPSBkb2pvLm1hdGgubWF0cml4LmNyZWF0ZSh0bXMsIHRtcyk7CisJdmFyIGlpID0gMDsKKwl2YXIgamogPSAwOworCXZhciBpYSA9IDA7CisJdmFyIGphID0gMDsKKwl2YXIgZGV0ID0gMDsKKwl2YXIgYXAgPSBkb2pvLm1hdGgubWF0cml4LmNyZWF0ZSh0bXMgLSAxLCB0bXMgLSAxKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRtczsgaSsrKSB7CisJCWZvciAodmFyIGogPSAwOyBqIDwgdG1zOyBqKyspIHsKKwkJCWlhID0gMDsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IHRtczsgaWkrKykgeworCQkJCWlmIChpaSA9PSBpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlqYSA9IDA7CisJCQkJZm9yIChqaiA9IDA7IGpqIDwgdG1zOyBqaisrKSB7CisJCQkJCWlmIChqaiA9PSBqKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlhcFtpYV1bamFdID0gYVtpaV1bampdOworCQkJCQlqYSsrOworCQkJCX0KKwkJCQlpYSsrOworCQkJfQorCQkJZGV0ID0gZG9qby5tYXRoLm1hdHJpeC5kZXRlcm1pbmFudChhcCk7CisJCQltW2ldW2pdID0gTWF0aC5wb3coLTEsIChpICsgaikpICogZGV0OworCQl9CisJfQorCW0gPSBkb2pvLm1hdGgubWF0cml4LnRyYW5zcG9zZShtKTsKKwlyZXR1cm4gbTsKK307Citkb2pvLm1hdGgubWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChhKSB7CisJdmFyIG0gPSBkb2pvLm1hdGgubWF0cml4LmNyZWF0ZShhLmxlbmd0aCwgYVswXS5sZW5ndGgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworCQlmb3IgKHZhciBqID0gMDsgaiA8IGFbaV0ubGVuZ3RoOyBqKyspIHsKKwkJCW1bal1baV0gPSBhW2ldW2pdOworCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXguZm9ybWF0ID0gZnVuY3Rpb24gKGEsIGRlY2ltYWxfcG9pbnRzKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gMSkgeworCQlkZWNpbWFsX3BvaW50cyA9IDU7CisJfQorCWZ1bmN0aW9uIGZvcm1hdF9pbnQoeCwgZHApIHsKKwkJdmFyIGZhYyA9IE1hdGgucG93KDEwLCBkcCk7CisJCXZhciBhID0gTWF0aC5yb3VuZCh4ICogZmFjKSAvIGZhYzsKKwkJdmFyIGIgPSBhLnRvU3RyaW5nKCk7CisJCWlmIChiLmNoYXJBdCgwKSAhPSAiLSIpIHsKKwkJCWIgPSAiICIgKyBiOworCQl9CisJCXZhciBoYXNfZHAgPSAwOworCQlmb3IgKHZhciBpID0gMTsgaSA8IGIubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChiLmNoYXJBdChpKSA9PSAiLiIpIHsKKwkJCQloYXNfZHAgPSAxOworCQkJfQorCQl9CisJCWlmICghaGFzX2RwKSB7CisJCQliICs9ICIuIjsKKwkJfQorCQl3aGlsZSAoYi5sZW5ndGggPCBkcCArIDMpIHsKKwkJCWIgKz0gIjAiOworCQl9CisJCXJldHVybiBiOworCX0KKwl2YXIgeWEgPSBhLmxlbmd0aDsKKwl2YXIgeGEgPSB5YSA+IDAgPyBhWzBdLmxlbmd0aCA6IDA7CisJdmFyIGJ1ZmZlciA9ICIiOworCWZvciAodmFyIHkgPSAwOyB5IDwgeWE7IHkrKykgeworCQlidWZmZXIgKz0gInwgIjsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCB4YTsgeCsrKSB7CisJCQlidWZmZXIgKz0gZm9ybWF0X2ludChhW3ldW3hdLCBkZWNpbWFsX3BvaW50cykgKyAiICI7CisJCX0KKwkJYnVmZmVyICs9ICJ8XG4iOworCX0KKwlyZXR1cm4gYnVmZmVyOworfTsKK2Rvam8ubWF0aC5tYXRyaXguY29weSA9IGZ1bmN0aW9uIChhKSB7CisJdmFyIHlhID0gYS5sZW5ndGg7CisJdmFyIHhhID0gYVswXS5sZW5ndGg7CisJdmFyIG0gPSBkb2pvLm1hdGgubWF0cml4LmNyZWF0ZSh4YSwgeWEpOworCWZvciAodmFyIHkgPSAwOyB5IDwgeWE7IHkrKykgeworCQlmb3IgKHZhciB4ID0gMDsgeCA8IHhhOyB4KyspIHsKKwkJCW1beV1beF0gPSBhW3ldW3hdOworCQl9CisJfQorCXJldHVybiBtOworfTsKK2Rvam8ubWF0aC5tYXRyaXguc2NhbGUgPSBmdW5jdGlvbiAoaywgYSkgeworCWEgPSBkb2pvLm1hdGgubWF0cml4LmNvcHkoYSk7CisJdmFyIHlhID0gYS5sZW5ndGg7CisJdmFyIHhhID0gYVswXS5sZW5ndGg7CisJZm9yICh2YXIgeSA9IDA7IHkgPCB5YTsgeSsrKSB7CisJCWZvciAodmFyIHggPSAwOyB4IDwgeGE7IHgrKykgeworCQkJYVt5XVt4XSAqPSBrOworCQl9CisJfQorCXJldHVybiBhOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvcG9pbnRzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL21hdGgvcG9pbnRzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDAyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbWF0aC9wb2ludHMuanMKQEAgLTAsMCArMSw0MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5tYXRoLnBvaW50cyIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgiKTsKK2Rvam8ubWF0aC5wb2ludHMgPSB7dHJhbnNsYXRlOmZ1bmN0aW9uIChhLCBiKSB7CisJaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSB7CisJCWRvam8ucmFpc2UoImRvam8ubWF0aC50cmFuc2xhdGU6IHBvaW50cyBub3Qgc2FtZSBzaXplIChhOlsiICsgYSArICJdLCBiOlsiICsgYiArICJdKSIpOworCX0KKwl2YXIgYyA9IG5ldyBBcnJheShhLmxlbmd0aCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCWNbaV0gPSBhW2ldICsgYltpXTsKKwl9CisJcmV0dXJuIGM7Cit9LCBtaWRwb2ludDpmdW5jdGlvbiAoYSwgYikgeworCWlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgeworCQlkb2pvLnJhaXNlKCJkb2pvLm1hdGgubWlkcG9pbnQ6IHBvaW50cyBub3Qgc2FtZSBzaXplIChhOlsiICsgYSArICJdLCBiOlsiICsgYiArICJdKSIpOworCX0KKwl2YXIgYyA9IG5ldyBBcnJheShhLmxlbmd0aCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCWNbaV0gPSAoYVtpXSArIGJbaV0pIC8gMjsKKwl9CisJcmV0dXJuIGM7Cit9LCBpbnZlcnQ6ZnVuY3Rpb24gKGEpIHsKKwl2YXIgYiA9IG5ldyBBcnJheShhLmxlbmd0aCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCWJbaV0gPSAtYVtpXTsKKwl9CisJcmV0dXJuIGI7Cit9LCBkaXN0YW5jZTpmdW5jdGlvbiAoYSwgYikgeworCXJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coYlswXSAtIGFbMF0sIDIpICsgTWF0aC5wb3coYlsxXSAtIGFbMV0sIDIpKTsKK319OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbmFtZXNwYWNlcy9kb2pvLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL25hbWVzcGFjZXMvZG9qby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM3ZjEwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL25hbWVzcGFjZXMvZG9qby5qcwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLm5hbWVzcGFjZXMuZG9qbyIpOworZG9qby5yZXF1aXJlKCJkb2pvLm5zIik7CisKKyhmdW5jdGlvbigpeworCS8vIE1hcHBpbmcgb2YgYWxsIHdpZGdldCBzaG9ydCBuYW1lcyB0byB0aGVpciBmdWxsIHBhY2thZ2UgbmFtZXMKKwkvLyBUaGlzIGlzIHVzZWQgZm9yIHdpZGdldCBhdXRvbG9hZGluZyAtIG5vIGRvam8ucmVxdWlyZSgpIGlzIG5lY2Vzc2FyeS4KKwkvLyBJZiB5b3UgdXNlIGEgd2lkZ2V0IGluIG1hcmt1cCBvciBjcmVhdGUgb25lIGR5bmFtaWNhbGx5LCB0aGVuIHRoaXMKKwkvLyBtYXBwaW5nIGlzIHVzZWQgdG8gZmluZCBhbmQgbG9hZCBhbnkgZGVwZW5kZW5jaWVzIG5vdCBhbHJlYWR5IGxvYWRlZC4KKwkvLyBZb3Ugc2hvdWxkIHVzZSB5b3VyIG93biBuYW1lc3BhY2UgZm9yIGFueSBjdXN0b20gd2lkZ2V0cy4KKwkvLyBGb3IgZXh0cmEgd2lkZ2V0cyB5b3UgdXNlLCBkb2pvLmRlY2xhcmUoKSBtYXkgYmUgdXNlZCB0byBleHBsaWNpdGx5IGxvYWQgdGhlbS4KKwkvLyBFeHBlcmltZW50YWwgYW5kIGRlcHJlY2F0ZWQgd2lkZ2V0cyBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgdGFibGUKKwl2YXIgbWFwID0geworCQlodG1sOiB7CisJCQkiYWNjb3JkaW9uY29udGFpbmVyIjogImRvam8ud2lkZ2V0LkFjY29yZGlvbkNvbnRhaW5lciIsCisJCQkiYW5pbWF0ZWRwbmciOiAiZG9qby53aWRnZXQuQW5pbWF0ZWRQbmciLAorCQkJImJ1dHRvbiI6ICJkb2pvLndpZGdldC5CdXR0b24iLAorCQkJImNoYXJ0IjogImRvam8ud2lkZ2V0LkNoYXJ0IiwKKwkJCSJjaGVja2JveCI6ICJkb2pvLndpZGdldC5DaGVja2JveCIsCisJCQkiY2xvY2siOiAiZG9qby53aWRnZXQuQ2xvY2siLAorCQkJImNvbG9ycGFsZXR0ZSI6ICJkb2pvLndpZGdldC5Db2xvclBhbGV0dGUiLAorCQkJImNvbWJvYm94IjogImRvam8ud2lkZ2V0LkNvbWJvQm94IiwKKwkJCSJjb21ib2J1dHRvbiI6ICJkb2pvLndpZGdldC5CdXR0b24iLAorCQkJImNvbnRlbnRwYW5lIjogImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIiwKKwkJCSJjdXJyZW5jeXRleHRib3giOiAiZG9qby53aWRnZXQuQ3VycmVuY3lUZXh0Ym94IiwKKwkJCSJkYXRlcGlja2VyIjogImRvam8ud2lkZ2V0LkRhdGVQaWNrZXIiLAorCQkJImRhdGV0ZXh0Ym94IjogImRvam8ud2lkZ2V0LkRhdGVUZXh0Ym94IiwKKwkJCSJkZWJ1Z2NvbnNvbGUiOiAiZG9qby53aWRnZXQuRGVidWdDb25zb2xlIiwKKwkJCSJkaWFsb2ciOiAiZG9qby53aWRnZXQuRGlhbG9nIiwKKwkJCSJkcm9wZG93bmJ1dHRvbiI6ICJkb2pvLndpZGdldC5CdXR0b24iLAorCQkJImRyb3Bkb3duZGF0ZXBpY2tlciI6ICJkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIiLAorCQkJImRyb3Bkb3dudGltZXBpY2tlciI6ICJkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIiLAorCQkJImVtYWlsbGlzdHRleHRib3giOiAiZG9qby53aWRnZXQuSW50ZXJuZXRUZXh0Ym94IiwKKwkJCSJlbWFpbHRleHRib3giOiAiZG9qby53aWRnZXQuSW50ZXJuZXRUZXh0Ym94IiwKKwkJCSJlZGl0b3IiOiAiZG9qby53aWRnZXQuRWRpdG9yIiwKKwkJCSJlZGl0b3IyIjogImRvam8ud2lkZ2V0LkVkaXRvcjIiLAorCQkJImZpbHRlcmluZ3RhYmxlIjogImRvam8ud2lkZ2V0LkZpbHRlcmluZ1RhYmxlIiwKKwkJCSJmaXNoZXllbGlzdCI6ICJkb2pvLndpZGdldC5GaXNoZXllTGlzdCIsCisJCQkiZmlzaGV5ZWxpc3RpdGVtIjogImRvam8ud2lkZ2V0LkZpc2hleWVMaXN0IiwKKwkJCSJmbG9hdGluZ3BhbmUiOiAiZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lIiwKKwkJCSJtb2RhbGZsb2F0aW5ncGFuZSI6ICJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUiLAorCQkJImZvcm0iOiAiZG9qby53aWRnZXQuRm9ybSIsCisJCQkiZ29vZ2xlbWFwIjogImRvam8ud2lkZ2V0Lkdvb2dsZU1hcCIsCisJCQkiaW5saW5lZWRpdGJveCI6ICJkb2pvLndpZGdldC5JbmxpbmVFZGl0Qm94IiwKKwkJCSJpbnRlZ2Vyc3Bpbm5lciI6ICJkb2pvLndpZGdldC5TcGlubmVyIiwKKwkJCSJpbnRlZ2VydGV4dGJveCI6ICJkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveCIsCisJCQkiaXBhZGRyZXNzdGV4dGJveCI6ICJkb2pvLndpZGdldC5JbnRlcm5ldFRleHRib3giLAorCQkJImxheW91dGNvbnRhaW5lciI6ICJkb2pvLndpZGdldC5MYXlvdXRDb250YWluZXIiLAorCQkJImxpbmtwYW5lIjogImRvam8ud2lkZ2V0LkxpbmtQYW5lIiwKKwkJCSJwb3B1cG1lbnUyIjogImRvam8ud2lkZ2V0Lk1lbnUyIiwKKwkJCSJtZW51aXRlbTIiOiAiZG9qby53aWRnZXQuTWVudTIiLAorCQkJIm1lbnVzZXBhcmF0b3IyIjogImRvam8ud2lkZ2V0Lk1lbnUyIiwKKwkJCSJtZW51YmFyMiI6ICJkb2pvLndpZGdldC5NZW51MiIsCisJCQkibWVudWJhcml0ZW0yIjogImRvam8ud2lkZ2V0Lk1lbnUyIiwKKwkJCSJwYWdlY29udGFpbmVyIjogImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiLAorCQkJInBhZ2Vjb250cm9sbGVyIjogImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiLAorCQkJInBvcHVwY29udGFpbmVyIjogImRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyIiwKKwkJCSJwcm9ncmVzc2JhciI6ICJkb2pvLndpZGdldC5Qcm9ncmVzc0JhciIsCisJCQkicmFkaW9ncm91cCI6ICJkb2pvLndpZGdldC5SYWRpb0dyb3VwIiwKKwkJCSJyZWFsbnVtYmVydGV4dGJveCI6ICJkb2pvLndpZGdldC5SZWFsTnVtYmVyVGV4dGJveCIsCisJCQkicmVnZXhwdGV4dGJveCI6ICJkb2pvLndpZGdldC5SZWdleHBUZXh0Ym94IiwKKwkJCSJyZXBlYXRlciI6ICJkb2pvLndpZGdldC5SZXBlYXRlciIsIAorCQkJInJlc2l6YWJsZXRleHRhcmVhIjogImRvam8ud2lkZ2V0LlJlc2l6YWJsZVRleHRhcmVhIiwKKwkJCSJyaWNodGV4dCI6ICJkb2pvLndpZGdldC5SaWNoVGV4dCIsCisJCQkic2VsZWN0IjogImRvam8ud2lkZ2V0LlNlbGVjdCIsCisJCQkic2hvdyI6ICJkb2pvLndpZGdldC5TaG93IiwKKwkJCSJzaG93YWN0aW9uIjogImRvam8ud2lkZ2V0LlNob3dBY3Rpb24iLAorCQkJInNob3dzbGlkZSI6ICJkb2pvLndpZGdldC5TaG93U2xpZGUiLAorCQkJInNsaWRlcnZlcnRpY2FsIjogImRvam8ud2lkZ2V0LlNsaWRlciIsCisJCQkic2xpZGVyaG9yaXpvbnRhbCI6ICJkb2pvLndpZGdldC5TbGlkZXIiLAorCQkJInNsaWRlciI6ImRvam8ud2lkZ2V0LlNsaWRlciIsCisJCQkic2xpZGVzaG93IjogImRvam8ud2lkZ2V0LlNsaWRlU2hvdyIsCisJCQkic29ydGFibGV0YWJsZSI6ICJkb2pvLndpZGdldC5Tb3J0YWJsZVRhYmxlIiwKKwkJCSJzcGxpdGNvbnRhaW5lciI6ICJkb2pvLndpZGdldC5TcGxpdENvbnRhaW5lciIsCisJCQkidGFiY29udGFpbmVyIjogImRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lciIsCisJCQkidGFiY29udHJvbGxlciI6ICJkb2pvLndpZGdldC5UYWJDb250YWluZXIiLAorCQkJInRhc2tiYXIiOiAiZG9qby53aWRnZXQuVGFza0JhciIsCisJCQkidGV4dGJveCI6ICJkb2pvLndpZGdldC5UZXh0Ym94IiwKKwkJCSJ0aW1lcGlja2VyIjogImRvam8ud2lkZ2V0LlRpbWVQaWNrZXIiLAorCQkJInRpbWV0ZXh0Ym94IjogImRvam8ud2lkZ2V0LkRhdGVUZXh0Ym94IiwKKwkJCSJ0aXRsZXBhbmUiOiAiZG9qby53aWRnZXQuVGl0bGVQYW5lIiwKKwkJCSJ0b2FzdGVyIjogImRvam8ud2lkZ2V0LlRvYXN0ZXIiLAorCQkJInRvZ2dsZXIiOiAiZG9qby53aWRnZXQuVG9nZ2xlciIsCisJCQkidG9vbGJhciI6ICJkb2pvLndpZGdldC5Ub29sYmFyIiwKKwkJCSJ0b29sYmFyY29udGFpbmVyIjogImRvam8ud2lkZ2V0LlRvb2xiYXIiLAorCQkJInRvb2xiYXJpdGVtIjogImRvam8ud2lkZ2V0LlRvb2xiYXIiLAorCQkJInRvb2xiYXJidXR0b25ncm91cCI6ICJkb2pvLndpZGdldC5Ub29sYmFyIiwKKwkJCSJ0b29sYmFyYnV0dG9uIjogImRvam8ud2lkZ2V0LlRvb2xiYXIiLAorCQkJInRvb2xiYXJkaWFsb2ciOiAiZG9qby53aWRnZXQuVG9vbGJhciIsCisJCQkidG9vbGJhcm1lbnUiOiAiZG9qby53aWRnZXQuVG9vbGJhciIsCisJCQkidG9vbGJhcnNlcGFyYXRvciI6ICJkb2pvLndpZGdldC5Ub29sYmFyIiwKKwkJCSJ0b29sYmFyc3BhY2UiOiAiZG9qby53aWRnZXQuVG9vbGJhciIsCisJCQkidG9vbGJhcnNlbGVjdCI6ICJkb2pvLndpZGdldC5Ub29sYmFyIiwKKwkJCSJ0b29sYmFyY29sb3JkaWFsb2ciOiAiZG9qby53aWRnZXQuVG9vbGJhciIsCisJCQkidG9vbHRpcCI6ICJkb2pvLndpZGdldC5Ub29sdGlwIiwKKwkJCSJ0cmVlIjogImRvam8ud2lkZ2V0LlRyZWUiLAorCQkJInRyZWViYXNpY2NvbnRyb2xsZXIiOiAiZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlciIsCisJCQkidHJlZWNvbnRleHRtZW51IjogImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudSIsCisJCQkidHJlZWRpc2FibGV3cmFwZXh0ZW5zaW9uIjogImRvam8ud2lkZ2V0LlRyZWVEaXNhYmxlV3JhcEV4dGVuc2lvbiIsCisJCQkidHJlZWRvY2ljb25leHRlbnNpb24iOiAiZG9qby53aWRnZXQuVHJlZURvY0ljb25FeHRlbnNpb24iLAorCQkJInRyZWVlZGl0b3IiOiAiZG9qby53aWRnZXQuVHJlZUVkaXRvciIsCisJCQkidHJlZWVtcGhhc2l6ZW9uc2VsZWN0IjogImRvam8ud2lkZ2V0LlRyZWVFbXBoYXNpemVPblNlbGVjdCIsCisJCQkidHJlZWV4cGFuZHRvbm9kZW9uc2VsZWN0IjogImRvam8ud2lkZ2V0LlRyZWVFeHBhbmRUb05vZGVPblNlbGVjdCIsCisJCQkidHJlZWxpbmtleHRlbnNpb24iOiAiZG9qby53aWRnZXQuVHJlZUxpbmtFeHRlbnNpb24iLAorCQkJInRyZWVsb2FkaW5nY29udHJvbGxlciI6ICJkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXIiLAorCQkJInRyZWVtZW51aXRlbSI6ICJkb2pvLndpZGdldC5UcmVlQ29udGV4dE1lbnUiLAorCQkJInRyZWVub2RlIjogImRvam8ud2lkZ2V0LlRyZWVOb2RlIiwKKwkJCSJ0cmVlcnBjY29udHJvbGxlciI6ICJkb2pvLndpZGdldC5UcmVlUlBDQ29udHJvbGxlciIsCisJCQkidHJlZXNlbGVjdG9yIjogImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvciIsCisJCQkidHJlZXRvZ2dsZW9uc2VsZWN0IjogImRvam8ud2lkZ2V0LlRyZWVUb2dnbGVPblNlbGVjdCIsCisJCQkidHJlZXYzIjogImRvam8ud2lkZ2V0LlRyZWVWMyIsCisJCQkidHJlZWJhc2ljY29udHJvbGxlcnYzIjogImRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMyIsCisJCQkidHJlZWNvbnRleHRtZW51djMiOiAiZG9qby53aWRnZXQuVHJlZUNvbnRleHRNZW51VjMiLAorCQkJInRyZWVkbmRjb250cm9sbGVydjMiOiAiZG9qby53aWRnZXQuVHJlZURuZENvbnRyb2xsZXJWMyIsCisJCQkidHJlZWxvYWRpbmdjb250cm9sbGVydjMiOiAiZG9qby53aWRnZXQuVHJlZUxvYWRpbmdDb250cm9sbGVyVjMiLAorCQkJInRyZWVtZW51aXRlbXYzIjogImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudVYzIiwKKwkJCSJ0cmVlcnBjY29udHJvbGxlcnYzIjogImRvam8ud2lkZ2V0LlRyZWVScGNDb250cm9sbGVyVjMiLAorCQkJInRyZWVzZWxlY3RvcnYzIjogImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvclYzIiwKKwkJCSJ1cmx0ZXh0Ym94IjogImRvam8ud2lkZ2V0LkludGVybmV0VGV4dGJveCIsCisJCQkidXNwaG9uZW51bWJlcnRleHRib3giOiAiZG9qby53aWRnZXQuVXNUZXh0Ym94IiwKKwkJCSJ1c3NvY2lhbHNlY3VyaXR5bnVtYmVydGV4dGJveCI6ICJkb2pvLndpZGdldC5Vc1RleHRib3giLAorCQkJInVzc3RhdGV0ZXh0Ym94IjogImRvam8ud2lkZ2V0LlVzVGV4dGJveCIsCisJCQkidXN6aXB0ZXh0Ym94IjogImRvam8ud2lkZ2V0LlVzVGV4dGJveCIsCisJCQkidmFsaWRhdGlvbnRleHRib3giOiAiZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3giLAorCQkJInRyZWVsb2FkaW5nY29udHJvbGxlciI6ICJkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXIiLAorCQkJIndpemFyZGNvbnRhaW5lciI6ICJkb2pvLndpZGdldC5XaXphcmQiLAorCQkJIndpemFyZHBhbmUiOiAiZG9qby53aWRnZXQuV2l6YXJkIiwKKwkJCSJ5YWhvb21hcCI6ICJkb2pvLndpZGdldC5ZYWhvb01hcCIKKwkJfSwKKwkJc3ZnOiB7CisJCQkiY2hhcnQiOiAiZG9qby53aWRnZXQuc3ZnLkNoYXJ0IgorCQl9LAorCQl2bWw6IHsKKwkJCSJjaGFydCI6ICJkb2pvLndpZGdldC52bWwuQ2hhcnQiCisJCX0KKwl9OworCisJZG9qby5hZGREb2pvTmFtZXNwYWNlTWFwcGluZyA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9zaG9ydE5hbWUsIC8qU3RyaW5nKi9wYWNrYWdlTmFtZSl7CisJLy8gc3VtbWFyeToKKwkvLwlBZGQgYW4gZW50cnkgdG8gdGhlIG1hcHBpbmcgdGFibGUgZm9yIHRoZSBkb2pvOiBuYW1lc3BhY2UKKwkvLworCS8vIHNob3J0TmFtZTogdGhlIG5hbWUgdG8gYmUgdXNlZCBhcyB0aGUgd2lkZ2V0J3MgdGFnIG5hbWUgaW4gdGhlIGRvam86IG5hbWVzcGFjZQorCS8vIHBhY2thZ2VOYW1lOiB0aGUgcGF0aCB0byB0aGUgSmF2YXNjcmlwdCBtb2R1bGUgaW4gZG90dGVkIHBhY2thZ2Ugbm90YXRpb24KKwkJbWFwW3Nob3J0TmFtZV09cGFja2FnZU5hbWU7ICAgIAorCX07CisJCisJZnVuY3Rpb24gZG9qb05hbWVzcGFjZVJlc29sdmVyKG5hbWUsIGRvbWFpbil7CisJCWlmKCFkb21haW4peyBkb21haW49Imh0bWwiOyB9CisJCWlmKCFtYXBbZG9tYWluXSl7IHJldHVybiBudWxsOyB9CisJCXJldHVybiBtYXBbZG9tYWluXVtuYW1lXTsgICAgCisJfQorCisJZG9qby5yZWdpc3Rlck5hbWVzcGFjZVJlc29sdmVyKCJkb2pvIiwgZG9qb05hbWVzcGFjZVJlc29sdmVyKTsKK30pKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbnMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvbnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ZjAyYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ucy5qcwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ucyIpOworZG9qby5ucyA9IHtuYW1lc3BhY2VzOnt9LCBmYWlsZWQ6e30sIGxvYWRpbmc6e30sIGxvYWRlZDp7fSwgcmVnaXN0ZXI6ZnVuY3Rpb24gKG5hbWUsIG1vZHVsZSwgcmVzb2x2ZXIsIG5vT3ZlcnJpZGUpIHsKKwlpZiAoIW5vT3ZlcnJpZGUgfHwgIXRoaXMubmFtZXNwYWNlc1tuYW1lXSkgeworCQl0aGlzLm5hbWVzcGFjZXNbbmFtZV0gPSBuZXcgZG9qby5ucy5OcyhuYW1lLCBtb2R1bGUsIHJlc29sdmVyKTsKKwl9Cit9LCBhbGxvdzpmdW5jdGlvbiAobmFtZSkgeworCWlmICh0aGlzLmZhaWxlZFtuYW1lXSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICgoZGpDb25maWcuZXhjbHVkZU5hbWVzcGFjZSkgJiYgKGRvam8ubGFuZy5pbkFycmF5KGRqQ29uZmlnLmV4Y2x1ZGVOYW1lc3BhY2UsIG5hbWUpKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiAoKG5hbWUgPT0gdGhpcy5kb2pvKSB8fCAoIWRqQ29uZmlnLmluY2x1ZGVOYW1lc3BhY2UpIHx8IChkb2pvLmxhbmcuaW5BcnJheShkakNvbmZpZy5pbmNsdWRlTmFtZXNwYWNlLCBuYW1lKSkpOworfSwgZ2V0OmZ1bmN0aW9uIChuYW1lKSB7CisJcmV0dXJuIHRoaXMubmFtZXNwYWNlc1tuYW1lXTsKK30sIHJlcXVpcmU6ZnVuY3Rpb24gKG5hbWUpIHsKKwl2YXIgbnMgPSB0aGlzLm5hbWVzcGFjZXNbbmFtZV07CisJaWYgKChucykgJiYgKHRoaXMubG9hZGVkW25hbWVdKSkgeworCQlyZXR1cm4gbnM7CisJfQorCWlmICghdGhpcy5hbGxvdyhuYW1lKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0aGlzLmxvYWRpbmdbbmFtZV0pIHsKKwkJZG9qby5kZWJ1ZygiZG9qby5uYW1lc3BhY2UucmVxdWlyZTogcmUtZW50cmFudCByZXF1ZXN0IHRvIGxvYWQgbmFtZXNwYWNlIFwiIiArIG5hbWUgKyAiXCIgbXVzdCBmYWlsLiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciByZXEgPSBkb2pvLnJlcXVpcmU7CisJdGhpcy5sb2FkaW5nW25hbWVdID0gdHJ1ZTsKKwl0cnkgeworCQlpZiAobmFtZSA9PSAiZG9qbyIpIHsKKwkJCXJlcSgiZG9qby5uYW1lc3BhY2VzLmRvam8iKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghZG9qby5ob3N0ZW52Lm1vZHVsZUhhc1ByZWZpeChuYW1lKSkgeworCQkJCWRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUsICIuLi8iICsgbmFtZSk7CisJCQl9CisJCQlyZXEoW25hbWUsICJtYW5pZmVzdCJdLmpvaW4oIi4iKSwgZmFsc2UsIHRydWUpOworCQl9CisJCWlmICghdGhpcy5uYW1lc3BhY2VzW25hbWVdKSB7CisJCQl0aGlzLmZhaWxlZFtuYW1lXSA9IHRydWU7CisJCX0KKwl9CisJZmluYWxseSB7CisJCXRoaXMubG9hZGluZ1tuYW1lXSA9IGZhbHNlOworCX0KKwlyZXR1cm4gdGhpcy5uYW1lc3BhY2VzW25hbWVdOworfX07Citkb2pvLm5zLk5zID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZSwgcmVzb2x2ZXIpIHsKKwl0aGlzLm5hbWUgPSBuYW1lOworCXRoaXMubW9kdWxlID0gbW9kdWxlOworCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKwl0aGlzLl9sb2FkZWQgPSBbXTsKKwl0aGlzLl9mYWlsZWQgPSBbXTsKK307Citkb2pvLm5zLk5zLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKG5hbWUsIGRvbWFpbiwgb21pdE1vZHVsZUNoZWNrKSB7CisJaWYgKCF0aGlzLnJlc29sdmVyIHx8IGRqQ29uZmlnWyJza2lwQXV0b1JlcXVpcmUiXSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBmdWxsTmFtZSA9IHRoaXMucmVzb2x2ZXIobmFtZSwgZG9tYWluKTsKKwlpZiAoKGZ1bGxOYW1lKSAmJiAoIXRoaXMuX2xvYWRlZFtmdWxsTmFtZV0pICYmICghdGhpcy5fZmFpbGVkW2Z1bGxOYW1lXSkpIHsKKwkJdmFyIHJlcSA9IGRvam8ucmVxdWlyZTsKKwkJcmVxKGZ1bGxOYW1lLCBmYWxzZSwgdHJ1ZSk7CisJCWlmIChkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShmdWxsTmFtZSwgZmFsc2UpKSB7CisJCQl0aGlzLl9sb2FkZWRbZnVsbE5hbWVdID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICghb21pdE1vZHVsZUNoZWNrKSB7CisJCQkJZG9qby5yYWlzZSgiZG9qby5ucy5Ocy5yZXNvbHZlOiBtb2R1bGUgJyIgKyBmdWxsTmFtZSArICInIG5vdCBmb3VuZCBhZnRlciBsb2FkaW5nIHZpYSBuYW1lc3BhY2UgJyIgKyB0aGlzLm5hbWUgKyAiJyIpOworCQkJfQorCQkJdGhpcy5fZmFpbGVkW2Z1bGxOYW1lXSA9IHRydWU7CisJCX0KKwl9CisJcmV0dXJuIEJvb2xlYW4odGhpcy5fbG9hZGVkW2Z1bGxOYW1lXSk7Cit9OworZG9qby5yZWdpc3Rlck5hbWVzcGFjZSA9IGZ1bmN0aW9uIChuYW1lLCBtb2R1bGUsIHJlc29sdmVyKSB7CisJZG9qby5ucy5yZWdpc3Rlci5hcHBseShkb2pvLm5zLCBhcmd1bWVudHMpOworfTsKK2Rvam8ucmVnaXN0ZXJOYW1lc3BhY2VSZXNvbHZlciA9IGZ1bmN0aW9uIChuYW1lLCByZXNvbHZlcikgeworCXZhciBuID0gZG9qby5ucy5uYW1lc3BhY2VzW25hbWVdOworCWlmIChuKSB7CisJCW4ucmVzb2x2ZXIgPSByZXNvbHZlcjsKKwl9Cit9OworZG9qby5yZWdpc3Rlck5hbWVzcGFjZU1hbmlmZXN0ID0gZnVuY3Rpb24gKG1vZHVsZSwgcGF0aCwgbmFtZSwgd2lkZ2V0TW9kdWxlLCByZXNvbHZlcikgeworCWRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUsIHBhdGgpOworCWRvam8ucmVnaXN0ZXJOYW1lc3BhY2UobmFtZSwgd2lkZ2V0TW9kdWxlLCByZXNvbHZlcik7Cit9OworZG9qby5yZWdpc3Rlck5hbWVzcGFjZSgiZG9qbyIsICJkb2pvLndpZGdldCIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcHJvZmlsZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9wcm9maWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2NkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcHJvZmlsZS5qcwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5wcm9maWxlIik7Citkb2pvLnByb2ZpbGUgPSB7X3Byb2ZpbGVzOnt9LCBfcG5zOltdLCBzdGFydDpmdW5jdGlvbiAobmFtZSkgeworCWlmICghdGhpcy5fcHJvZmlsZXNbbmFtZV0pIHsKKwkJdGhpcy5fcHJvZmlsZXNbbmFtZV0gPSB7aXRlcnM6MCwgdG90YWw6MH07CisJCXRoaXMuX3Buc1t0aGlzLl9wbnMubGVuZ3RoXSA9IG5hbWU7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuX3Byb2ZpbGVzW25hbWVdWyJzdGFydCJdKSB7CisJCQl0aGlzLmVuZChuYW1lKTsKKwkJfQorCX0KKwl0aGlzLl9wcm9maWxlc1tuYW1lXS5lbmQgPSBudWxsOworCXRoaXMuX3Byb2ZpbGVzW25hbWVdLnN0YXJ0ID0gbmV3IERhdGUoKTsKK30sIGVuZDpmdW5jdGlvbiAobmFtZSkgeworCXZhciBlZCA9IG5ldyBEYXRlKCk7CisJaWYgKCh0aGlzLl9wcm9maWxlc1tuYW1lXSkgJiYgKHRoaXMuX3Byb2ZpbGVzW25hbWVdWyJzdGFydCJdKSkgeworCQl3aXRoICh0aGlzLl9wcm9maWxlc1tuYW1lXSkgeworCQkJZW5kID0gZWQ7CisJCQl0b3RhbCArPSAoZW5kIC0gc3RhcnQpOworCQkJc3RhcnQgPSBudWxsOworCQkJaXRlcnMrKzsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiB0cnVlOworCX0KK30sIGR1bXA6ZnVuY3Rpb24gKGFwcGVuZFRvRG9jKSB7CisJdmFyIHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CisJd2l0aCAodGJsLnN0eWxlKSB7CisJCWJvcmRlciA9ICIxcHggc29saWQgYmxhY2siOworCQlib3JkZXJDb2xsYXBzZSA9ICJjb2xsYXBzZSI7CisJfQorCXZhciBoZHIgPSB0YmwuY3JlYXRlVEhlYWQoKTsKKwl2YXIgaGRydHIgPSBoZHIuaW5zZXJ0Um93KDApOworCXZhciBjb2xzID0gWyJJZGVudGlmaWVyIiwgIkNhbGxzIiwgIlRvdGFsIiwgIkF2ZyJdOworCWZvciAodmFyIHggPSAwOyB4IDwgY29scy5sZW5ndGg7IHgrKykgeworCQl2YXIgbnRkID0gaGRydHIuaW5zZXJ0Q2VsbCh4KTsKKwkJd2l0aCAobnRkLnN0eWxlKSB7CisJCQliYWNrZ3JvdW5kQ29sb3IgPSAiIzIyNWQ5NCI7CisJCQljb2xvciA9ICJ3aGl0ZSI7CisJCQlib3JkZXJCb3R0b20gPSAiMXB4IHNvbGlkIGJsYWNrIjsKKwkJCWJvcmRlclJpZ2h0ID0gIjFweCBzb2xpZCBibGFjayI7CisJCQlmb250RmFtaWx5ID0gInRhaG9tYSI7CisJCQlmb250V2VpZ2h0ID0gImJvbGRlciI7CisJCQlwYWRkaW5nTGVmdCA9IHBhZGRpbmdSaWdodCA9ICI1cHgiOworCQl9CisJCW50ZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2xzW3hdKSk7CisJfQorCWZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5fcG5zLmxlbmd0aDsgeCsrKSB7CisJCXZhciBwcmYgPSB0aGlzLl9wcm9maWxlc1t0aGlzLl9wbnNbeF1dOworCQl0aGlzLmVuZCh0aGlzLl9wbnNbeF0pOworCQlpZiAocHJmLml0ZXJzID4gMCkgeworCQkJdmFyIGJkeXRyID0gdGJsLmluc2VydFJvdyh0cnVlKTsKKwkJCXZhciB2YWxzID0gW3RoaXMuX3Buc1t4XSwgcHJmLml0ZXJzLCBwcmYudG90YWwsIHBhcnNlSW50KHByZi50b3RhbCAvIHByZi5pdGVycyldOworCQkJZm9yICh2YXIgeSA9IDA7IHkgPCB2YWxzLmxlbmd0aDsgeSsrKSB7CisJCQkJdmFyIGNjID0gYmR5dHIuaW5zZXJ0Q2VsbCh5KTsKKwkJCQljYy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWxzW3ldKSk7CisJCQkJd2l0aCAoY2Muc3R5bGUpIHsKKwkJCQkJYm9yZGVyQm90dG9tID0gIjFweCBzb2xpZCBncmF5IjsKKwkJCQkJcGFkZGluZ0xlZnQgPSBwYWRkaW5nUmlnaHQgPSAiNXB4IjsKKwkJCQkJaWYgKHggJSAyKSB7CisJCQkJCQliYWNrZ3JvdW5kQ29sb3IgPSAiI2UxZjFmZiI7CisJCQkJCX0KKwkJCQkJaWYgKHkgPiAwKSB7CisJCQkJCQl0ZXh0QWxpZ24gPSAicmlnaHQiOworCQkJCQkJYm9yZGVyUmlnaHQgPSAiMXB4IHNvbGlkIGdyYXkiOworCQkJCQl9IGVsc2UgeworCQkJCQkJYm9yZGVyUmlnaHQgPSAiMXB4IHNvbGlkIGJsYWNrIjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoYXBwZW5kVG9Eb2MpIHsKKwkJdmFyIG5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCW5lLmlkID0gInByb2ZpbGVPdXRwdXRUYWJsZSI7CisJCXdpdGggKG5lLnN0eWxlKSB7CisJCQlmb250RmFtaWx5ID0gIkNvdXJpZXIgTmV3LCBtb25vc3BhY2UiOworCQkJZm9udFNpemUgPSAiMTJweCI7CisJCQlsaW5lSGVpZ2h0ID0gIjE2cHgiOworCQkJYm9yZGVyVG9wID0gIjFweCBzb2xpZCBibGFjayI7CisJCQlwYWRkaW5nID0gIjEwcHgiOworCQl9CisJCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZmlsZU91dHB1dFRhYmxlIikpIHsKKwkJCWRvam8uYm9keSgpLnJlcGxhY2VDaGlsZChuZSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2ZpbGVPdXRwdXRUYWJsZSIpKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKG5lKTsKKwkJfQorCQluZS5hcHBlbmRDaGlsZCh0YmwpOworCX0KKwlyZXR1cm4gdGJsOworfX07Citkb2pvLnByb2ZpbGUuc3RvcCA9IGRvam8ucHJvZmlsZS5lbmQ7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9yZWdleHAuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcmVnZXhwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDk1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcmVnZXhwLmpzCkBAIC0wLDAgKzEsMzY1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnJlZ2V4cCIpOworZG9qby5ldmFsT2JqUGF0aCgiZG9qby5yZWdleHAudXMiLCB0cnVlKTsKK2Rvam8ucmVnZXhwLnRsZCA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dDQyAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dDQyA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dJbmZyYSAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dJbmZyYSA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dHZW5lcmljICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0dlbmVyaWMgPSB0cnVlOworCX0KKwl2YXIgaW5mcmFSRSA9ICJhcnBhIjsKKwl2YXIgZ2VuZXJpY1JFID0gImFlcm98Yml6fGNvbXxjb29wfGVkdXxnb3Z8aW5mb3xpbnR8bWlsfG11c2V1bXxuYW1lfG5ldHxvcmd8cHJvfHRyYXZlbHx4eHh8am9ic3xtb2JpfHBvc3QiOworCXZhciBjY1JFID0gImFjfGFkfGFlfGFmfGFnfGFpfGFsfGFtfGFufGFvfGFxfGFyfGFzfGF0fGF1fGF3fGF6fGJhfGJifGJkfGJlfGJmfGJnfGJofGJpfGJqfGJtfGJufGJvfGJyfCIgKyAiYnN8YnR8YnZ8Ynd8Ynl8Ynp8Y2F8Y2N8Y2R8Y2Z8Y2d8Y2h8Y2l8Y2t8Y2x8Y218Y258Y298Y3J8Y3V8Y3Z8Y3h8Y3l8Y3p8ZGV8ZGp8ZGt8ZG18ZG98ZHp8IiArICJlY3xlZXxlZ3xlcnxldXxlc3xldHxmaXxmanxma3xmbXxmb3xmcnxnYXxnZHxnZXxnZnxnZ3xnaHxnaXxnbHxnbXxnbnxncHxncXxncnxnc3xndHxndXxnd3wiICsgImd5fGhrfGhtfGhufGhyfGh0fGh1fGlkfGllfGlsfGltfGlufGlvfGlyfGlzfGl0fGplfGptfGpvfGpwfGtlfGtnfGtofGtpfGttfGtufGtyfGt3fGt5fGt6fCIgKyAibGF8bGJ8bGN8bGl8bGt8bHJ8bHN8bHR8bHV8bHZ8bHl8bWF8bWN8bWR8bWd8bWh8bWt8bWx8bW18bW58bW98bXB8bXF8bXJ8bXN8bXR8bXV8bXZ8bXd8bXh8IiArICJteXxtenxuYXxuY3xuZXxuZnxuZ3xuaXxubHxub3xucHxucnxudXxuenxvbXxwYXxwZXxwZnxwZ3xwaHxwa3xwbHxwbXxwbnxwcnxwc3xwdHxwd3xweXxxYXwiICsgInJlfHJvfHJ1fHJ3fHNhfHNifHNjfHNkfHNlfHNnfHNofHNpfHNrfHNsfHNtfHNufHNyfHN0fHN1fHN2fHN5fHN6fHRjfHRkfHRmfHRnfHRofHRqfHRrfHRtfCIgKyAidG58dG98dHJ8dHR8dHZ8dHd8dHp8dWF8dWd8dWt8dXN8dXl8dXp8dmF8dmN8dmV8dmd8dml8dm58dnV8d2Z8d3N8eWV8eXR8eXV8emF8em18enciOworCXZhciBhID0gW107CisJaWYgKGZsYWdzLmFsbG93SW5mcmEpIHsKKwkJYS5wdXNoKGluZnJhUkUpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dHZW5lcmljKSB7CisJCWEucHVzaChnZW5lcmljUkUpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dDQykgeworCQlhLnB1c2goY2NSRSk7CisJfQorCXZhciB0bGRSRSA9ICIiOworCWlmIChhLmxlbmd0aCA+IDApIHsKKwkJdGxkUkUgPSAiKCIgKyBhLmpvaW4oInwiKSArICIpIjsKKwl9CisJcmV0dXJuIHRsZFJFOworfTsKK2Rvam8ucmVnZXhwLmlwQWRkcmVzcyA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dEb3R0ZWREZWNpbWFsICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0RvdHRlZERlY2ltYWwgPSB0cnVlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmFsbG93RG90dGVkSGV4ICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0RvdHRlZEhleCA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dEb3R0ZWRPY3RhbCAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dEb3R0ZWRPY3RhbCA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dEZWNpbWFsICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0RlY2ltYWwgPSB0cnVlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmFsbG93SGV4ICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0hleCA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dJUHY2ICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0lQdjYgPSB0cnVlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmFsbG93SHlicmlkICE9ICJib29sZWFuIikgeworCQlmbGFncy5hbGxvd0h5YnJpZCA9IHRydWU7CisJfQorCXZhciBkb3R0ZWREZWNpbWFsUkUgPSAiKChcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4pezN9KFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKSI7CisJdmFyIGRvdHRlZEhleFJFID0gIigwW3hYXTAqW1xcZGEtZkEtRl0/W1xcZGEtZkEtRl1cXC4pezN9MFt4WF0wKltcXGRhLWZBLUZdP1tcXGRhLWZBLUZdIjsKKwl2YXIgZG90dGVkT2N0YWxSRSA9ICIoMCtbMC0zXVswLTddWzAtN11cXC4pezN9MCtbMC0zXVswLTddWzAtN10iOworCXZhciBkZWNpbWFsUkUgPSAiKDB8WzEtOV1cXGR7MCw4fXxbMS0zXVxcZHs5fXw0WzAxXVxcZHs4fXw0MlswLThdXFxkezd9fDQyOVswLTNdXFxkezZ9fCIgKyAiNDI5NFswLThdXFxkezV9fDQyOTQ5WzAtNV1cXGR7NH18NDI5NDk2WzAtNl1cXGR7M318NDI5NDk2N1swMV1cXGR7Mn18NDI5NDk2NzJbMC04XVxcZHw0Mjk0OTY3MjlbMC01XSkiOworCXZhciBoZXhSRSA9ICIwW3hYXTAqW1xcZGEtZkEtRl17MSw4fSI7CisJdmFyIGlwdjZSRSA9ICIoW1xcZGEtZkEtRl17MSw0fVxcOil7N31bXFxkYS1mQS1GXXsxLDR9IjsKKwl2YXIgaHlicmlkUkUgPSAiKFtcXGRhLWZBLUZdezEsNH1cXDopezZ9IiArICIoKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLil7M30oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pIjsKKwl2YXIgYSA9IFtdOworCWlmIChmbGFncy5hbGxvd0RvdHRlZERlY2ltYWwpIHsKKwkJYS5wdXNoKGRvdHRlZERlY2ltYWxSRSk7CisJfQorCWlmIChmbGFncy5hbGxvd0RvdHRlZEhleCkgeworCQlhLnB1c2goZG90dGVkSGV4UkUpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dEb3R0ZWRPY3RhbCkgeworCQlhLnB1c2goZG90dGVkT2N0YWxSRSk7CisJfQorCWlmIChmbGFncy5hbGxvd0RlY2ltYWwpIHsKKwkJYS5wdXNoKGRlY2ltYWxSRSk7CisJfQorCWlmIChmbGFncy5hbGxvd0hleCkgeworCQlhLnB1c2goaGV4UkUpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dJUHY2KSB7CisJCWEucHVzaChpcHY2UkUpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dIeWJyaWQpIHsKKwkJYS5wdXNoKGh5YnJpZFJFKTsKKwl9CisJdmFyIGlwQWRkcmVzc1JFID0gIiI7CisJaWYgKGEubGVuZ3RoID4gMCkgeworCQlpcEFkZHJlc3NSRSA9ICIoIiArIGEuam9pbigifCIpICsgIikiOworCX0KKwlyZXR1cm4gaXBBZGRyZXNzUkU7Cit9OworZG9qby5yZWdleHAuaG9zdCA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dJUCAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dJUCA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dMb2NhbCAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dMb2NhbCA9IGZhbHNlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmFsbG93UG9ydCAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dQb3J0ID0gdHJ1ZTsKKwl9CisJdmFyIGRvbWFpbk5hbWVSRSA9ICIoWzAtOWEtekEtWl0oWy0wLTlhLXpBLVpdezAsNjF9WzAtOWEtekEtWl0pP1xcLikrIiArIGRvam8ucmVnZXhwLnRsZChmbGFncyk7CisJdmFyIHBvcnRSRSA9IChmbGFncy5hbGxvd1BvcnQpID8gIihcXDoiICsgZG9qby5yZWdleHAuaW50ZWdlcih7c2lnbmVkOmZhbHNlfSkgKyAiKT8iIDogIiI7CisJdmFyIGhvc3ROYW1lUkUgPSBkb21haW5OYW1lUkU7CisJaWYgKGZsYWdzLmFsbG93SVApIHsKKwkJaG9zdE5hbWVSRSArPSAifCIgKyBkb2pvLnJlZ2V4cC5pcEFkZHJlc3MoZmxhZ3MpOworCX0KKwlpZiAoZmxhZ3MuYWxsb3dMb2NhbCkgeworCQlob3N0TmFtZVJFICs9ICJ8bG9jYWxob3N0IjsKKwl9CisJcmV0dXJuICIoIiArIGhvc3ROYW1lUkUgKyAiKSIgKyBwb3J0UkU7Cit9OworZG9qby5yZWdleHAudXJsID0gZnVuY3Rpb24gKGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJaWYgKHR5cGVvZiBmbGFncy5zY2hlbWUgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2NoZW1lID0gW3RydWUsIGZhbHNlXTsKKwl9CisJdmFyIHByb3RvY29sUkUgPSBkb2pvLnJlZ2V4cC5idWlsZEdyb3VwUkUoZmxhZ3Muc2NoZW1lLCBmdW5jdGlvbiAocSkgeworCQlpZiAocSkgeworCQkJcmV0dXJuICIoaHR0cHM/fGZ0cHM/KVxcOi8vIjsKKwkJfQorCQlyZXR1cm4gIiI7CisJfSk7CisJdmFyIHBhdGhSRSA9ICIoLyhbXj8jXFxzL10rLykqKT8oW14/I1xccy9dKyhcXD9bXj8jXFxzL10qKT8oI1tBLVphLXpdW1xcdy46LV0qKT8pPyI7CisJcmV0dXJuIHByb3RvY29sUkUgKyBkb2pvLnJlZ2V4cC5ob3N0KGZsYWdzKSArIHBhdGhSRTsKK307Citkb2pvLnJlZ2V4cC5lbWFpbEFkZHJlc3MgPSBmdW5jdGlvbiAoZmxhZ3MpIHsKKwlmbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT0gIm9iamVjdCIpID8gZmxhZ3MgOiB7fTsKKwlpZiAodHlwZW9mIGZsYWdzLmFsbG93Q3J1ZnQgIT0gImJvb2xlYW4iKSB7CisJCWZsYWdzLmFsbG93Q3J1ZnQgPSBmYWxzZTsKKwl9CisJZmxhZ3MuYWxsb3dQb3J0ID0gZmFsc2U7CisJdmFyIHVzZXJuYW1lUkUgPSAiKFtcXGRhLXpdK1stLl8rJiddKSpbXFxkYS16XSsiOworCXZhciBlbWFpbEFkZHJlc3NSRSA9IHVzZXJuYW1lUkUgKyAiQCIgKyBkb2pvLnJlZ2V4cC5ob3N0KGZsYWdzKTsKKwlpZiAoZmxhZ3MuYWxsb3dDcnVmdCkgeworCQllbWFpbEFkZHJlc3NSRSA9ICI8PyhtYWlsdG9cXDopPyIgKyBlbWFpbEFkZHJlc3NSRSArICI+PyI7CisJfQorCXJldHVybiBlbWFpbEFkZHJlc3NSRTsKK307Citkb2pvLnJlZ2V4cC5lbWFpbEFkZHJlc3NMaXN0ID0gZnVuY3Rpb24gKGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJaWYgKHR5cGVvZiBmbGFncy5saXN0U2VwYXJhdG9yICE9ICJzdHJpbmciKSB7CisJCWZsYWdzLmxpc3RTZXBhcmF0b3IgPSAiXFxzOywiOworCX0KKwl2YXIgZW1haWxBZGRyZXNzUkUgPSBkb2pvLnJlZ2V4cC5lbWFpbEFkZHJlc3MoZmxhZ3MpOworCXZhciBlbWFpbEFkZHJlc3NMaXN0UkUgPSAiKCIgKyBlbWFpbEFkZHJlc3NSRSArICJcXHMqWyIgKyBmbGFncy5saXN0U2VwYXJhdG9yICsgIl1cXHMqKSoiICsgZW1haWxBZGRyZXNzUkUgKyAiXFxzKlsiICsgZmxhZ3MubGlzdFNlcGFyYXRvciArICJdP1xccyoiOworCXJldHVybiBlbWFpbEFkZHJlc3NMaXN0UkU7Cit9OworZG9qby5yZWdleHAuaW50ZWdlciA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3Muc2lnbmVkID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnNpZ25lZCA9IFt0cnVlLCBmYWxzZV07CisJfQorCWlmICh0eXBlb2YgZmxhZ3Muc2VwYXJhdG9yID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLnNlcGFyYXRvciA9ICIiOworCX0gZWxzZSB7CisJCWlmICh0eXBlb2YgZmxhZ3MuZ3JvdXBTaXplID09ICJ1bmRlZmluZWQiKSB7CisJCQlmbGFncy5ncm91cFNpemUgPSAzOworCQl9CisJfQorCXZhciBzaWduUkUgPSBkb2pvLnJlZ2V4cC5idWlsZEdyb3VwUkUoZmxhZ3Muc2lnbmVkLCBmdW5jdGlvbiAocSkgeworCQlyZXR1cm4gcSA/ICJbLStdIiA6ICIiOworCX0pOworCXZhciBudW1iZXJSRSA9IGRvam8ucmVnZXhwLmJ1aWxkR3JvdXBSRShmbGFncy5zZXBhcmF0b3IsIGZ1bmN0aW9uIChzZXApIHsKKwkJaWYgKHNlcCA9PSAiIikgeworCQkJcmV0dXJuICIoMHxbMS05XVxcZCopIjsKKwkJfQorCQl2YXIgZ3JwID0gZmxhZ3MuZ3JvdXBTaXplLCBncnAyID0gZmxhZ3MuZ3JvdXBTaXplMjsKKwkJaWYgKHR5cGVvZiBncnAyICE9ICJ1bmRlZmluZWQiKSB7CisJCQl2YXIgZ3JwMlJFID0gIigwfFsxLTldXFxkezAsIiArIChncnAyIC0gMSkgKyAifShbIiArIHNlcCArICJdXFxkeyIgKyBncnAyICsgIn0pKlsiICsgc2VwICsgIl1cXGR7IiArIGdycCArICJ9KSI7CisJCQlyZXR1cm4gKChncnAgLSBncnAyKSA+IDApID8gIigiICsgZ3JwMlJFICsgInwoMHxbMS05XVxcZHswLCIgKyAoZ3JwIC0gMSkgKyAifSkpIiA6IGdycDJSRTsKKwkJfQorCQlyZXR1cm4gIigwfFsxLTldXFxkezAsIiArIChncnAgLSAxKSArICJ9KFsiICsgc2VwICsgIl1cXGR7IiArIGdycCArICJ9KSopIjsKKwl9KTsKKwlyZXR1cm4gc2lnblJFICsgbnVtYmVyUkU7Cit9OworZG9qby5yZWdleHAucmVhbE51bWJlciA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MucGxhY2VzICE9ICJudW1iZXIiKSB7CisJCWZsYWdzLnBsYWNlcyA9IEluZmluaXR5OworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmRlY2ltYWwgIT0gInN0cmluZyIpIHsKKwkJZmxhZ3MuZGVjaW1hbCA9ICIuIjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5mcmFjdGlvbmFsID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmZyYWN0aW9uYWwgPSBbdHJ1ZSwgZmFsc2VdOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmV4cG9uZW50ID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmV4cG9uZW50ID0gW3RydWUsIGZhbHNlXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5lU2lnbmVkID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmVTaWduZWQgPSBbdHJ1ZSwgZmFsc2VdOworCX0KKwl2YXIgaW50ZWdlclJFID0gZG9qby5yZWdleHAuaW50ZWdlcihmbGFncyk7CisJdmFyIGRlY2ltYWxSRSA9IGRvam8ucmVnZXhwLmJ1aWxkR3JvdXBSRShmbGFncy5mcmFjdGlvbmFsLCBmdW5jdGlvbiAocSkgeworCQl2YXIgcmUgPSAiIjsKKwkJaWYgKHEgJiYgKGZsYWdzLnBsYWNlcyA+IDApKSB7CisJCQlyZSA9ICJcXCIgKyBmbGFncy5kZWNpbWFsOworCQkJaWYgKGZsYWdzLnBsYWNlcyA9PSBJbmZpbml0eSkgeworCQkJCXJlID0gIigiICsgcmUgKyAiXFxkKyk/IjsKKwkJCX0gZWxzZSB7CisJCQkJcmUgPSByZSArICJcXGR7IiArIGZsYWdzLnBsYWNlcyArICJ9IjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmU7CisJfSk7CisJdmFyIGV4cG9uZW50UkUgPSBkb2pvLnJlZ2V4cC5idWlsZEdyb3VwUkUoZmxhZ3MuZXhwb25lbnQsIGZ1bmN0aW9uIChxKSB7CisJCWlmIChxKSB7CisJCQlyZXR1cm4gIihbZUVdIiArIGRvam8ucmVnZXhwLmludGVnZXIoe3NpZ25lZDpmbGFncy5lU2lnbmVkfSkgKyAiKSI7CisJCX0KKwkJcmV0dXJuICIiOworCX0pOworCXJldHVybiBpbnRlZ2VyUkUgKyBkZWNpbWFsUkUgKyBleHBvbmVudFJFOworfTsKK2Rvam8ucmVnZXhwLmN1cnJlbmN5ID0gZnVuY3Rpb24gKGZsYWdzKSB7CisJZmxhZ3MgPSAodHlwZW9mIGZsYWdzID09ICJvYmplY3QiKSA/IGZsYWdzIDoge307CisJaWYgKHR5cGVvZiBmbGFncy5zaWduZWQgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2lnbmVkID0gW3RydWUsIGZhbHNlXTsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5zeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc3ltYm9sID0gIiQiOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLnBsYWNlbWVudCAhPSAic3RyaW5nIikgeworCQlmbGFncy5wbGFjZW1lbnQgPSAiYmVmb3JlIjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5zaWduUGxhY2VtZW50ICE9ICJzdHJpbmciKSB7CisJCWZsYWdzLnNpZ25QbGFjZW1lbnQgPSAiYmVmb3JlIjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5zZXBhcmF0b3IgPT0gInVuZGVmaW5lZCIpIHsKKwkJZmxhZ3Muc2VwYXJhdG9yID0gIiwiOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLmZyYWN0aW9uYWwgPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGZsYWdzLmNlbnRzICE9ICJ1bmRlZmluZWQiKSB7CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby5yZWdleHAuY3VycmVuY3k6IGZsYWdzLmNlbnRzIiwgInVzZSBmbGFncy5mcmFjdGlvbmFsIGluc3RlYWQiLCAiMC41Iik7CisJCWZsYWdzLmZyYWN0aW9uYWwgPSBmbGFncy5jZW50czsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5kZWNpbWFsICE9ICJzdHJpbmciKSB7CisJCWZsYWdzLmRlY2ltYWwgPSAiLiI7CisJfQorCXZhciBzaWduUkUgPSBkb2pvLnJlZ2V4cC5idWlsZEdyb3VwUkUoZmxhZ3Muc2lnbmVkLCBmdW5jdGlvbiAocSkgeworCQlpZiAocSkgeworCQkJcmV0dXJuICJbLStdIjsKKwkJfQorCQlyZXR1cm4gIiI7CisJfSk7CisJdmFyIHN5bWJvbFJFID0gZG9qby5yZWdleHAuYnVpbGRHcm91cFJFKGZsYWdzLnN5bWJvbCwgZnVuY3Rpb24gKHN5bWJvbCkgeworCQlyZXR1cm4gIlxccz8iICsgc3ltYm9sLnJlcGxhY2UoLyhbLiQ/KiE9OnxcXFwvXl0pL2csICJcXCQxIikgKyAiXFxzPyI7CisJfSk7CisJc3dpdGNoIChmbGFncy5zaWduUGxhY2VtZW50KSB7CisJICBjYXNlICJiZWZvcmUiOgorCQlzeW1ib2xSRSA9IHNpZ25SRSArIHN5bWJvbFJFOworCQlicmVhazsKKwkgIGNhc2UgImFmdGVyIjoKKwkJc3ltYm9sUkUgPSBzeW1ib2xSRSArIHNpZ25SRTsKKwkJYnJlYWs7CisJfQorCXZhciBmbGFnc0NvcHkgPSBmbGFnczsKKwlmbGFnc0NvcHkuc2lnbmVkID0gZmFsc2U7CisJZmxhZ3NDb3B5LmV4cG9uZW50ID0gZmFsc2U7CisJdmFyIG51bWJlclJFID0gZG9qby5yZWdleHAucmVhbE51bWJlcihmbGFnc0NvcHkpOworCXZhciBjdXJyZW5jeVJFOworCXN3aXRjaCAoZmxhZ3MucGxhY2VtZW50KSB7CisJICBjYXNlICJiZWZvcmUiOgorCQljdXJyZW5jeVJFID0gc3ltYm9sUkUgKyBudW1iZXJSRTsKKwkJYnJlYWs7CisJICBjYXNlICJhZnRlciI6CisJCWN1cnJlbmN5UkUgPSBudW1iZXJSRSArIHN5bWJvbFJFOworCQlicmVhazsKKwl9CisJc3dpdGNoIChmbGFncy5zaWduUGxhY2VtZW50KSB7CisJICBjYXNlICJhcm91bmQiOgorCQljdXJyZW5jeVJFID0gIigiICsgY3VycmVuY3lSRSArICJ8IiArICJcXCgiICsgY3VycmVuY3lSRSArICJcXCkiICsgIikiOworCQlicmVhazsKKwkgIGNhc2UgImJlZ2luIjoKKwkJY3VycmVuY3lSRSA9IHNpZ25SRSArIGN1cnJlbmN5UkU7CisJCWJyZWFrOworCSAgY2FzZSAiZW5kIjoKKwkJY3VycmVuY3lSRSA9IGN1cnJlbmN5UkUgKyBzaWduUkU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY3VycmVuY3lSRTsKK307Citkb2pvLnJlZ2V4cC51cy5zdGF0ZSA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dUZXJyaXRvcmllcyAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dUZXJyaXRvcmllcyA9IHRydWU7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MuYWxsb3dNaWxpdGFyeSAhPSAiYm9vbGVhbiIpIHsKKwkJZmxhZ3MuYWxsb3dNaWxpdGFyeSA9IHRydWU7CisJfQorCXZhciBzdGF0ZXNSRSA9ICJBTHxBS3xBWnxBUnxDQXxDT3xDVHxERXxEQ3xGTHxHQXxISXxJRHxJTHxJTnxJQXxLU3xLWXxMQXxNRXxNRHxNQXxNSXxNTnxNU3xNT3xNVHwiICsgIk5FfE5WfE5IfE5KfE5NfE5ZfE5DfE5EfE9IfE9LfE9SfFBBfFJJfFNDfFNEfFROfFRYfFVUfFZUfFZBfFdBfFdWfFdJfFdZIjsKKwl2YXIgdGVycml0b3JpZXNSRSA9ICJBU3xGTXxHVXxNSHxNUHxQV3xQUnxWSSI7CisJdmFyIG1pbGl0YXJ5UkUgPSAiQUF8QUV8QVAiOworCWlmIChmbGFncy5hbGxvd1RlcnJpdG9yaWVzKSB7CisJCXN0YXRlc1JFICs9ICJ8IiArIHRlcnJpdG9yaWVzUkU7CisJfQorCWlmIChmbGFncy5hbGxvd01pbGl0YXJ5KSB7CisJCXN0YXRlc1JFICs9ICJ8IiArIG1pbGl0YXJ5UkU7CisJfQorCXJldHVybiAiKCIgKyBzdGF0ZXNSRSArICIpIjsKK307Citkb2pvLnJlZ2V4cC50aW1lID0gZnVuY3Rpb24gKGZsYWdzKSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLnJlZ2V4cC50aW1lIiwgIlVzZSBkb2pvLmRhdGUucGFyc2UgaW5zdGVhZCIsICIwLjUiKTsKKwlmbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT0gIm9iamVjdCIpID8gZmxhZ3MgOiB7fTsKKwlpZiAodHlwZW9mIGZsYWdzLmZvcm1hdCA9PSAidW5kZWZpbmVkIikgeworCQlmbGFncy5mb3JtYXQgPSAiaDptbTpzcyB0IjsKKwl9CisJaWYgKHR5cGVvZiBmbGFncy5hbVN5bWJvbCAhPSAic3RyaW5nIikgeworCQlmbGFncy5hbVN5bWJvbCA9ICJBTSI7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MucG1TeW1ib2wgIT0gInN0cmluZyIpIHsKKwkJZmxhZ3MucG1TeW1ib2wgPSAiUE0iOworCX0KKwl2YXIgdGltZVJFID0gZnVuY3Rpb24gKGZvcm1hdCkgeworCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvKFsuJD8qIT06fHt9XChcKVxbXF1cXFwvXl0pL2csICJcXCQxIik7CisJCXZhciBhbVJFID0gZmxhZ3MuYW1TeW1ib2wucmVwbGFjZSgvKFsuJD8qIT06fHt9XChcKVxbXF1cXFwvXl0pL2csICJcXCQxIik7CisJCXZhciBwbVJFID0gZmxhZ3MucG1TeW1ib2wucmVwbGFjZSgvKFsuJD8qIT06fHt9XChcKVxbXF1cXFwvXl0pL2csICJcXCQxIik7CisJCWZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKCJoaCIsICIoMFsxLTldfDFbMC0yXSkiKTsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoImgiLCAiKFsxLTldfDFbMC0yXSkiKTsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoIkhIIiwgIihbMDFdWzAtOV18MlswLTNdKSIpOworCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgiSCIsICIoWzAtOV18MVswLTldfDJbMC0zXSkiKTsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoIm1tIiwgIihbMC01XVswLTldKSIpOworCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgibSIsICIoWzEtNV1bMC05XXxbMC05XSkiKTsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoInNzIiwgIihbMC01XVswLTldKSIpOworCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgicyIsICIoWzEtNV1bMC05XXxbMC05XSkiKTsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoInQiLCAiXFxzPygiICsgYW1SRSArICJ8IiArIHBtUkUgKyAiKVxccz8iKTsKKwkJcmV0dXJuIGZvcm1hdDsKKwl9OworCXJldHVybiBkb2pvLnJlZ2V4cC5idWlsZEdyb3VwUkUoZmxhZ3MuZm9ybWF0LCB0aW1lUkUpOworfTsKK2Rvam8ucmVnZXhwLm51bWJlckZvcm1hdCA9IGZ1bmN0aW9uIChmbGFncykgeworCWZsYWdzID0gKHR5cGVvZiBmbGFncyA9PSAib2JqZWN0IikgPyBmbGFncyA6IHt9OworCWlmICh0eXBlb2YgZmxhZ3MuZm9ybWF0ID09ICJ1bmRlZmluZWQiKSB7CisJCWZsYWdzLmZvcm1hdCA9ICIjIyMtIyMjLSMjIyMiOworCX0KKwl2YXIgZGlnaXRSRSA9IGZ1bmN0aW9uIChmb3JtYXQpIHsKKwkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoLyhbLiQqIT06fHt9XChcKVxbXF1cXFwvXl0pL2csICJcXCQxIik7CisJCWZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9cPy9nLCAiXFxkPyIpOworCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvIy9nLCAiXFxkIik7CisJCXJldHVybiBmb3JtYXQ7CisJfTsKKwlyZXR1cm4gZG9qby5yZWdleHAuYnVpbGRHcm91cFJFKGZsYWdzLmZvcm1hdCwgZGlnaXRSRSk7Cit9OworZG9qby5yZWdleHAuYnVpbGRHcm91cFJFID0gZnVuY3Rpb24gKGEsIHJlKSB7CisJaWYgKCEoYSBpbnN0YW5jZW9mIEFycmF5KSkgeworCQlyZXR1cm4gcmUoYSk7CisJfQorCXZhciBiID0gW107CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCWIucHVzaChyZShhW2ldKSk7CisJfQorCXJldHVybiAiKCIgKyBiLmpvaW4oInwiKSArICIpIjsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ycGMvRGVmZXJyZWQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL0RlZmVycmVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTZmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL0RlZmVycmVkLmpzCkBAIC0wLDAgKzEsMTggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ucnBjLkRlZmVycmVkIik7Citkb2pvLnJlcXVpcmUoImRvam8uRGVmZXJyZWQiKTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5ycGMuRGVmZXJyZWQiLCAicmVwbGFjZWQgYnkgZG9qby5EZWZlcnJlZCIsICIwLjYiKTsKK2Rvam8ucnBjLkRlZmVycmVkID0gZG9qby5EZWZlcnJlZDsKK2Rvam8ucnBjLkRlZmVycmVkLnByb3RvdHlwZSA9IGRvam8uRGVmZXJyZWQucHJvdG90eXBlOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL0pvdFNlcnZpY2UuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL0pvdFNlcnZpY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyM2Y3OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ycGMvSm90U2VydmljZS5qcwpAQCAtMCwwICsxLDI3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnJwYy5Kb3RTZXJ2aWNlIik7Citkb2pvLnJlcXVpcmUoImRvam8ucnBjLlJwY1NlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ycGMuSnNvblNlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLnJwYy5Kb3RTZXJ2aWNlID0gZnVuY3Rpb24gKCkgeworCXRoaXMuc2VydmljZVVybCA9ICIvXy9qc29ucnBjIjsKK307Citkb2pvLmluaGVyaXRzKGRvam8ucnBjLkpvdFNlcnZpY2UsIGRvam8ucnBjLkpzb25TZXJ2aWNlKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5ycGMuSm90U2VydmljZSwge2JpbmQ6ZnVuY3Rpb24gKG1ldGhvZCwgcGFyYW1ldGVycywgZGVmZXJyZWRSZXF1ZXN0SGFuZGxlciwgdXJsKSB7CisJZG9qby5pby5iaW5kKHt1cmw6dXJsIHx8IHRoaXMuc2VydmljZVVybCwgY29udGVudDp7anNvbjp0aGlzLmNyZWF0ZVJlcXVlc3QobWV0aG9kLCBwYXJhbWV0ZXJzKX0sIG1ldGhvZDoiUE9TVCIsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBsb2FkOnRoaXMucmVzdWx0Q2FsbGJhY2soZGVmZXJyZWRSZXF1ZXN0SGFuZGxlciksIGVycm9yOnRoaXMuZXJyb3JDYWxsYmFjayhkZWZlcnJlZFJlcXVlc3RIYW5kbGVyKSwgcHJldmVudENhY2hlOnRydWV9KTsKK30sIGNyZWF0ZVJlcXVlc3Q6ZnVuY3Rpb24gKG1ldGhvZCwgcGFyYW1zKSB7CisJdmFyIHJlcSA9IHsicGFyYW1zIjpwYXJhbXMsICJtZXRob2QiOm1ldGhvZCwgImlkIjp0aGlzLmxhc3RTdWJtaXNzaW9uSWQrK307CisJcmV0dXJuIGRvam8uanNvbi5zZXJpYWxpemUocmVxKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9Kc29uU2VydmljZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ycGMvSnNvblNlcnZpY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNzBmMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ycGMvSnNvblNlcnZpY2UuanMKQEAgLTAsMCArMSw3MSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ycGMuSnNvblNlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ycGMuUnBjU2VydmljZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucnBjLkpzb25TZXJ2aWNlID0gZnVuY3Rpb24gKGFyZ3MpIHsKKwlpZiAoYXJncykgeworCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGFyZ3MpKSB7CisJCQl0aGlzLmNvbm5lY3QoYXJncyk7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJnc1sic21kVXJsIl0pIHsKKwkJCQl0aGlzLmNvbm5lY3QoYXJncy5zbWRVcmwpOworCQkJfQorCQkJaWYgKGFyZ3NbInNtZFN0ciJdKSB7CisJCQkJdGhpcy5wcm9jZXNzU21kKGRqX2V2YWwoIigiICsgYXJncy5zbWRTdHIgKyAiKSIpKTsKKwkJCX0KKwkJCWlmIChhcmdzWyJzbWRPYmoiXSkgeworCQkJCXRoaXMucHJvY2Vzc1NtZChhcmdzLnNtZE9iaik7CisJCQl9CisJCQlpZiAoYXJnc1sic2VydmljZVVybCJdKSB7CisJCQkJdGhpcy5zZXJ2aWNlVXJsID0gYXJncy5zZXJ2aWNlVXJsOworCQkJfQorCQkJaWYgKHR5cGVvZiBhcmdzWyJzdHJpY3RBcmdDaGVja3MiXSAhPSAidW5kZWZpbmVkIikgeworCQkJCXRoaXMuc3RyaWN0QXJnQ2hlY2tzID0gYXJncy5zdHJpY3RBcmdDaGVja3M7CisJCQl9CisJCX0KKwl9Cit9OworZG9qby5pbmhlcml0cyhkb2pvLnJwYy5Kc29uU2VydmljZSwgZG9qby5ycGMuUnBjU2VydmljZSk7Citkb2pvLmV4dGVuZChkb2pvLnJwYy5Kc29uU2VydmljZSwge2J1c3RDYWNoZTpmYWxzZSwgY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL2pzb24tcnBjIiwgbGFzdFN1Ym1pc3Npb25JZDowLCBjYWxsUmVtb3RlOmZ1bmN0aW9uIChtZXRob2QsIHBhcmFtcykgeworCXZhciBkZWZlcnJlZCA9IG5ldyBkb2pvLkRlZmVycmVkKCk7CisJdGhpcy5iaW5kKG1ldGhvZCwgcGFyYW1zLCBkZWZlcnJlZCk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgYmluZDpmdW5jdGlvbiAobWV0aG9kLCBwYXJhbWV0ZXJzLCBkZWZlcnJlZFJlcXVlc3RIYW5kbGVyLCB1cmwpIHsKKwlkb2pvLmlvLmJpbmQoe3VybDp1cmwgfHwgdGhpcy5zZXJ2aWNlVXJsLCBwb3N0Q29udGVudDp0aGlzLmNyZWF0ZVJlcXVlc3QobWV0aG9kLCBwYXJhbWV0ZXJzKSwgbWV0aG9kOiJQT1NUIiwgY29udGVudFR5cGU6dGhpcy5jb250ZW50VHlwZSwgbWltZXR5cGU6InRleHQvanNvbiIsIGxvYWQ6dGhpcy5yZXN1bHRDYWxsYmFjayhkZWZlcnJlZFJlcXVlc3RIYW5kbGVyKSwgZXJyb3I6dGhpcy5lcnJvckNhbGxiYWNrKGRlZmVycmVkUmVxdWVzdEhhbmRsZXIpLCBwcmV2ZW50Q2FjaGU6dGhpcy5idXN0Q2FjaGV9KTsKK30sIGNyZWF0ZVJlcXVlc3Q6ZnVuY3Rpb24gKG1ldGhvZCwgcGFyYW1zKSB7CisJdmFyIHJlcSA9IHsicGFyYW1zIjpwYXJhbXMsICJtZXRob2QiOm1ldGhvZCwgImlkIjorK3RoaXMubGFzdFN1Ym1pc3Npb25JZH07CisJdmFyIGRhdGEgPSBkb2pvLmpzb24uc2VyaWFsaXplKHJlcSk7CisJZG9qby5kZWJ1ZygiSnNvblNlcnZpY2U6IEpTT04tUlBDIFJlcXVlc3Q6ICIgKyBkYXRhKTsKKwlyZXR1cm4gZGF0YTsKK30sIHBhcnNlUmVzdWx0czpmdW5jdGlvbiAob2JqKSB7CisJaWYgKCFvYmopIHsKKwkJcmV0dXJuOworCX0KKwlpZiAob2JqWyJSZXN1bHQiXSAhPSBudWxsKSB7CisJCXJldHVybiBvYmpbIlJlc3VsdCJdOworCX0gZWxzZSB7CisJCWlmIChvYmpbInJlc3VsdCJdICE9IG51bGwpIHsKKwkJCXJldHVybiBvYmpbInJlc3VsdCJdOworCQl9IGVsc2UgeworCQkJaWYgKG9ialsiUmVzdWx0U2V0Il0pIHsKKwkJCQlyZXR1cm4gb2JqWyJSZXN1bHRTZXQiXTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG9iajsKKwkJCX0KKwkJfQorCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9ScGNTZXJ2aWNlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9ScGNTZXJ2aWNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjE2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL1JwY1NlcnZpY2UuanMKQEAgLTAsMCArMSw3NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ycGMuUnBjU2VydmljZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8uRGVmZXJyZWQiKTsKK2Rvam8ucnBjLlJwY1NlcnZpY2UgPSBmdW5jdGlvbiAodXJsKSB7CisJaWYgKHVybCkgeworCQl0aGlzLmNvbm5lY3QodXJsKTsKKwl9Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLnJwYy5ScGNTZXJ2aWNlLCB7c3RyaWN0QXJnQ2hlY2tzOnRydWUsIHNlcnZpY2VVcmw6IiIsIHBhcnNlUmVzdWx0czpmdW5jdGlvbiAob2JqKSB7CisJcmV0dXJuIG9iajsKK30sIGVycm9yQ2FsbGJhY2s6ZnVuY3Rpb24gKGRlZmVycmVkUmVxdWVzdEhhbmRsZXIpIHsKKwlyZXR1cm4gZnVuY3Rpb24gKHR5cGUsIGUpIHsKKwkJZGVmZXJyZWRSZXF1ZXN0SGFuZGxlci5lcnJiYWNrKG5ldyBFcnJvcihlLm1lc3NhZ2UpKTsKKwl9OworfSwgcmVzdWx0Q2FsbGJhY2s6ZnVuY3Rpb24gKGRlZmVycmVkUmVxdWVzdEhhbmRsZXIpIHsKKwl2YXIgdGYgPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKHR5cGUsIG9iaiwgZSkgeworCQlpZiAob2JqWyJlcnJvciJdICE9IG51bGwpIHsKKwkJCXZhciBlcnIgPSBuZXcgRXJyb3Iob2JqLmVycm9yKTsKKwkJCWVyci5pZCA9IG9iai5pZDsKKwkJCWRlZmVycmVkUmVxdWVzdEhhbmRsZXIuZXJyYmFjayhlcnIpOworCQl9IGVsc2UgeworCQkJdmFyIHJlc3VsdHMgPSB0aGlzLnBhcnNlUmVzdWx0cyhvYmopOworCQkJZGVmZXJyZWRSZXF1ZXN0SGFuZGxlci5jYWxsYmFjayhyZXN1bHRzKTsKKwkJfQorCX0pOworCXJldHVybiB0ZjsKK30sIGdlbmVyYXRlTWV0aG9kOmZ1bmN0aW9uIChtZXRob2QsIHBhcmFtZXRlcnMsIHVybCkgeworCXJldHVybiBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQl2YXIgZGVmZXJyZWRSZXF1ZXN0SGFuZGxlciA9IG5ldyBkb2pvLkRlZmVycmVkKCk7CisJCWlmICgodGhpcy5zdHJpY3RBcmdDaGVja3MpICYmIChwYXJhbWV0ZXJzICE9IG51bGwpICYmIChhcmd1bWVudHMubGVuZ3RoICE9IHBhcmFtZXRlcnMubGVuZ3RoKSkgeworCQkJZG9qby5yYWlzZSgiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3IgcmVtb3RlIG1ldGhvZC4iKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYmluZChtZXRob2QsIGFyZ3VtZW50cywgZGVmZXJyZWRSZXF1ZXN0SGFuZGxlciwgdXJsKTsKKwkJfQorCQlyZXR1cm4gZGVmZXJyZWRSZXF1ZXN0SGFuZGxlcjsKKwl9KTsKK30sIHByb2Nlc3NTbWQ6ZnVuY3Rpb24gKG9iamVjdCkgeworCWRvam8uZGVidWcoIlJwY1NlcnZpY2U6IFByb2Nlc3NpbmcgcmV0dXJuZWQgU01ELiIpOworCWlmIChvYmplY3QubWV0aG9kcykgeworCQlkb2pvLmxhbmcuZm9yRWFjaChvYmplY3QubWV0aG9kcywgZnVuY3Rpb24gKG0pIHsKKwkJCWlmIChtICYmIG1bIm5hbWUiXSkgeworCQkJCWRvam8uZGVidWcoIlJwY1NlcnZpY2U6IENyZWF0aW5nIE1ldGhvZDogdGhpcy4iLCBtLm5hbWUsICIoKSIpOworCQkJCXRoaXNbbS5uYW1lXSA9IHRoaXMuZ2VuZXJhdGVNZXRob2QobS5uYW1lLCBtLnBhcmFtZXRlcnMsIG1bInVybCJdIHx8IG1bInNlcnZpY2VVcmwiXSB8fCBtWyJzZXJ2aWNlVVJMIl0pOworCQkJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzW20ubmFtZV0pKSB7CisJCQkJCWRvam8uZGVidWcoIlJwY1NlcnZpY2U6IFN1Y2Nlc3NmdWxseSBjcmVhdGVkIiwgbS5uYW1lLCAiKCkiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkb2pvLmRlYnVnKCJScGNTZXJ2aWNlOiBGYWlsZWQgdG8gY3JlYXRlIiwgbS5uYW1lLCAiKCkiKTsKKwkJCQl9CisJCQl9CisJCX0sIHRoaXMpOworCX0KKwl0aGlzLnNlcnZpY2VVcmwgPSBvYmplY3Quc2VydmljZVVybCB8fCBvYmplY3Quc2VydmljZVVSTDsKKwlkb2pvLmRlYnVnKCJScGNTZXJ2aWNlOiBEb2pvIFJwY1NlcnZpY2UgaXMgcmVhZHkgZm9yIHVzZS4iKTsKK30sIGNvbm5lY3Q6ZnVuY3Rpb24gKHNtZFVybCkgeworCWRvam8uZGVidWcoIlJwY1NlcnZpY2U6IEF0dGVtcHRpbmcgdG8gbG9hZCBTTUQgZG9jdW1lbnQgZnJvbToiLCBzbWRVcmwpOworCWRvam8uaW8uYmluZCh7dXJsOnNtZFVybCwgbWltZXR5cGU6InRleHQvanNvbiIsIGxvYWQ6ZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICh0eXBlLCBvYmplY3QsIGUpIHsKKwkJcmV0dXJuIHRoaXMucHJvY2Vzc1NtZChvYmplY3QpOworCX0pLCBzeW5jOnRydWV9KTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9ZYWhvb1NlcnZpY2UuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL1lhaG9vU2VydmljZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdmZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9ZYWhvb1NlcnZpY2UuanMKQEAgLTAsMCArMSw0MSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5ycGMuWWFob29TZXJ2aWNlIik7Citkb2pvLnJlcXVpcmUoImRvam8ucnBjLlJwY1NlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ycGMuSnNvblNlcnZpY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby5TY3JpcHRTcmNJTyIpOworZG9qby5ycGMuWWFob29TZXJ2aWNlID0gZnVuY3Rpb24gKGFwcElkKSB7CisJdGhpcy5hcHBJZCA9IGFwcElkOworCWlmICghYXBwSWQpIHsKKwkJdGhpcy5hcHBJZCA9ICJkb2pvdG9vbGtpdCI7CisJCWRvam8uZGVidWcoInBsZWFzZSBpbml0aWFsaXplIHRoZSBZYWhvb1NlcnZpY2UgY2xhc3Mgd2l0aCB5b3VyIG93biIsICJhcHBsaWNhdGlvbiBJRC4gVXNpbmcgdGhlIGRlZmF1bHQgbWF5IGNhdXNlIHByb2JsZW1zIGR1cmluZyIsICJkZXBsb3ltZW50IG9mIHlvdXIgYXBwbGljYXRpb24iKTsKKwl9CisJaWYgKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gJiYgIWRqQ29uZmlnWyJ5YWhvb1NlcnZpY2VTbWRVcmwiXSkgeworCQlkb2pvLmRlYnVnKCJkb2pvLnJwYy5ZYWhvb1NlcnZpY2U6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIgKyAiIHBsZWFzZSBzYXZlIHlhaG9vLnNtZCB0byB5b3VyIGRvbWFpbiBhbmQgc2V0IGRqQ29uZmlnLnlhaG9vU2VydmljZVNtZFVybCIgKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIHlhaG9vLnNtZCIpOworCX0KKwl0aGlzLmNvbm5lY3QoZGpDb25maWdbInlhaG9vU2VydmljZVNtZFVybCJdIHx8IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby5ycGMiLCAieWFob28uc21kIikpOworCXRoaXMuc3RyaWN0QXJnQ2hlY2tzID0gZmFsc2U7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLnJwYy5ZYWhvb1NlcnZpY2UsIGRvam8ucnBjLkpzb25TZXJ2aWNlKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5ycGMuWWFob29TZXJ2aWNlLCB7c3RyaWN0QXJnQ2hlY2tzOmZhbHNlLCBiaW5kOmZ1bmN0aW9uIChtZXRob2QsIHBhcmFtZXRlcnMsIGRlZmVycmVkUmVxdWVzdEhhbmRsZXIsIHVybCkgeworCXZhciBwYXJhbXMgPSBwYXJhbWV0ZXJzOworCWlmICgoZG9qby5sYW5nLmlzQXJyYXlMaWtlKHBhcmFtZXRlcnMpKSAmJiAocGFyYW1ldGVycy5sZW5ndGggPT0gMSkpIHsKKwkJcGFyYW1zID0gcGFyYW1ldGVyc1swXTsKKwl9CisJcGFyYW1zLm91dHB1dCA9ICJqc29uIjsKKwlwYXJhbXMuYXBwaWQgPSB0aGlzLmFwcElkOworCWRvam8uaW8uYmluZCh7dXJsOnVybCB8fCB0aGlzLnNlcnZpY2VVcmwsIHRyYW5zcG9ydDoiU2NyaXB0U3JjVHJhbnNwb3J0IiwgY29udGVudDpwYXJhbXMsIGpzb25QYXJhbU5hbWU6ImNhbGxiYWNrIiwgbWltZXR5cGU6InRleHQvanNvbiIsIGxvYWQ6dGhpcy5yZXN1bHRDYWxsYmFjayhkZWZlcnJlZFJlcXVlc3RIYW5kbGVyKSwgZXJyb3I6dGhpcy5lcnJvckNhbGxiYWNrKGRlZmVycmVkUmVxdWVzdEhhbmRsZXIpLCBwcmV2ZW50Q2FjaGU6dHJ1ZX0pOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFjYTViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3JwYy9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOltbImRvam8ucnBjLkpzb25TZXJ2aWNlIiwgZmFsc2UsIGZhbHNlXV19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ycGMuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL3lhaG9vLnNtZCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9ycGMveWFob28uc21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzA1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvcnBjL3lhaG9vLnNtZApAQCAtMCwwICsxLDI4OSBAQAoreworCSJTTURWZXJzaW9uIjoiLjEiLAorCSJvYmplY3ROYW1lIjoieWFob28iLAorCSJzZXJ2aWNlVHlwZSI6IkpTT04tUCIsCisJIm1ldGhvZHMiOlsKKwkJLy8KKwkJLy8gTUFQUyAKKwkJLy8KKwkJeworCQkJLy8gaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vbWFwcy9yZXN0L1YxL21hcEltYWdlLmh0bWwKKwkJCSJuYW1lIjoibWFwSW1hZ2UiLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL2FwaS5sb2NhbC55YWhvby5jb20vTWFwc1NlcnZpY2UvVjEvbWFwSW1hZ2UiLAorCQkJInBhcmFtZXRlcnMiOlsKKwkJCQl7ICJuYW1lIjoic3RyZWV0IiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6ImNpdHkiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiemlwIiwgInR5cGUiOiJJTlRFR0VSIiB9LAorCQkJCXsgIm5hbWUiOiJsb2NhdGlvbiIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJsb25naXR1ZGUiLCAidHlwZSI6IkZMT0FUIiB9LAorCQkJCXsgIm5hbWUiOiJsYXRpdHVkZSIsICJ0eXBlIjoiRkxPQVQiIH0sCisJCQkJeyAibmFtZSI6ImltYWdlX3R5cGUiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiaW1hZ2Vfd2lkdGgiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6ImltYWdlX2hlaWdodCIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoiem9vbSIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoicmFkaXVzIiwgInR5cGUiOiJJTlRFR0VSIiB9CisJCQldCisJCX0sCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3RyYWZmaWMvcmVzdC9WMS9pbmRleC5odG1sCisJCQkibmFtZSI6InRyYWZmaWNEYXRhIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkubG9jYWwueWFob28uY29tL01hcHNTZXJ2aWNlL1YxL3RyYWZmaWNEYXRhIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6InN0cmVldCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJjaXR5IiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InppcCIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoibG9jYXRpb24iLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoibG9uZ2l0dWRlIiwgInR5cGUiOiJGTE9BVCIgfSwKKwkJCQl7ICJuYW1lIjoibGF0aXR1ZGUiLCAidHlwZSI6IkZMT0FUIiB9LAorCQkJCXsgIm5hbWUiOiJzZXZlcml0eSIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoiaW5jbHVkZV9tYXAiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6ImltYWdlX3R5cGUiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiaW1hZ2Vfd2lkdGgiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6ImltYWdlX2hlaWdodCIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoiem9vbSIsICJ0eXBlIjoiSU5URUdFUiIgfSwKKwkJCQl7ICJuYW1lIjoicmFkaXVzIiwgInR5cGUiOiJJTlRFR0VSIiB9CisJCQldCisJCX0sCisJCS8qCisJCQkvLyBZYWhvbydzIGdlb2NvZGluZyBzZXJ2aWNlIGlzIGYnZCBmb3IgSlNPTiBhbmQgWSEgYWR2aXNlcyB0aGF0IGl0CisJCQkvLyBtYXkgbm90IGJlIHJldHVybmluZworCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9tYXBzL3Jlc3QvVjEvZ2VvY29kZS5odG1sCisJCQkibmFtZSI6Imdlb2NvZGUiLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL2FwaS5sb2NhbC55YWhvby5jb20vTWFwc1NlcnZpY2UvVjEvZ2VvY29kZSIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJzdHJlZXQiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiY2l0eSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJ6aXAiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6ImxvY2F0aW9uIiwgInR5cGUiOiJTVFJJTkciIH0KKwkJCV0KKwkJfSwKKwkJKi8KKwkJLy8KKwkJLy8gTE9DQUwgU0VBUkNICisJCS8vCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC9sb2NhbC9WMy9sb2NhbFNlYXJjaC5odG1sCisJCQkibmFtZSI6ImxvY2FsU2VhcmNoIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkubG9jYWwueWFob28uY29tL0xvY2FsU2VhcmNoU2VydmljZS9WMy9sb2NhbFNlYXJjaCIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJzdHJlZXQiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiY2l0eSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJ6aXAiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6ImxvY2F0aW9uIiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6Imxpc3RpbmdfaWQiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoic29ydCIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyAicmVsZXZlbmNlIiwgInRpdGxlIiwgImRpc3RhbmNlIiwgb3IgInJhdGluZyIKKwkJCQl7ICJuYW1lIjoic3RhcnQiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6InJhZGl1cyIsICJ0eXBlIjoiRkxPQVQiIH0sCisJCQkJeyAibmFtZSI6InJlc3VsdHMiLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIDEtNTAsIGRlZmF1bHRzIHRvIDEwCisJCQkJeyAibmFtZSI6ImxvbmdpdHVkZSIsICJ0eXBlIjoiRkxPQVQiIH0sCisJCQkJeyAibmFtZSI6ImxhdGl0dWRlIiwgInR5cGUiOiJGTE9BVCIgfSwKKwkJCQl7ICJuYW1lIjoiY2F0ZWdvcnkiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6Im9taXRfY2F0ZWdvcnkiLCAidHlwZSI6IklOVEVHRVIiIH0sCisJCQkJeyAibmFtZSI6Im1pbmltdW1fcmF0aW5nIiwgInR5cGUiOiJJTlRFR0VSIiB9CisJCQldCisJCX0sCisJCS8vCisJCS8vIFdFQiBTRUFSQ0gKKwkJLy8KKwkJeworCQkJLy8gaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vc2VhcmNoL3dlYi9WMS93ZWJTZWFyY2guaHRtbCAKKwkJCSJuYW1lIjoid2ViU2VhcmNoIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9XZWJTZWFyY2hTZXJ2aWNlL1YxL3dlYlNlYXJjaCIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJxdWVyeSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJ0eXBlIiwgInR5cGUiOiJTVFJJTkciIH0sIC8vIGRlZmF1bHRzIHRvICJhbGwiCisJCQkJeyAibmFtZSI6InJlZ2lvbiIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byAidXMiCisJCQkJeyAibmFtZSI6InJlc3VsdHMiLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIDEwCisJCQkJeyAibmFtZSI6InN0YXJ0IiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byAxCisJCQkJeyAibmFtZSI6ImZvcm1hdCIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byAiYW55IiwgY2FuIGJlICJodG1sIiwgIm1zd29yZCIsICJwZGYiLCAicHB0IiwgInJzdCIsICJ0eHQiLCBvciAieGxzIgorCQkJCXsgIm5hbWUiOiJhZHVsdF9vayIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJCXsgIm5hbWUiOiJzaW1pbGFyX29rIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6Imxhbmd1YWdlIiwgInR5cGUiOiJTVFJJTkciIH0sIC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCQl7ICJuYW1lIjoiY291bnRyeSIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6InNpdGUiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJCXsgIm5hbWUiOiJzdWJzY3JpcHRpb24iLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJCXsgIm5hbWUiOiJsaWNlbnNlIiwgInR5cGUiOiJTVFJJTkciIH0gLy8gZGVmYXVsdHMgdG8gImFueSIKKwkJCV0KKwkJfSwKKwkJeworCQkJLy8gaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vc2VhcmNoL3dlYi9WMS9zcGVsbGluZ1N1Z2dlc3Rpb24uaHRtbAorCQkJIm5hbWUiOiJzcGVsbGluZ1N1Z2dlc3Rpb24iLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL2FwaS5zZWFyY2gueWFob28uY29tL1dlYlNlYXJjaFNlcnZpY2UvVjEvc3BlbGxpbmdTdWdnZXN0aW9uIiwKKwkJCSJwYXJhbWV0ZXJzIjpbIHsgIm5hbWUiOiJxdWVyeSIsICJ0eXBlIjoiU1RSSU5HIiB9IF0KKwkJfSwKKwkJeworCQkJLy8gaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vc2VhcmNoL3dlYi9WMS9yZWxhdGVkU3VnZ2VzdGlvbi5odG1sCisJCQkibmFtZSI6InNwZWxsaW5nU3VnZ2VzdGlvbiIsCisJCQkic2VydmljZVVSTCI6ICJodHRwOi8vYXBpLnNlYXJjaC55YWhvby5jb20vV2ViU2VhcmNoU2VydmljZS9WMS9yZWxhdGVkU3VnZ2VzdGlvbiIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJxdWVyeSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9IC8vIDEtNTAsIGRlZmF1bHRzIHRvIDEwCisJCQldCisJCX0sCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC9jb250ZW50L1YxL3Rlcm1FeHRyYWN0aW9uLmh0bWwKKwkJCSJuYW1lIjoidGVybUV4dHJhY3Rpb24iLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL3NlYXJjaC55YWhvb2FwaXMuY29tL0NvbnRlbnRBbmFseXNpc1NlcnZpY2UvVjEvdGVybUV4dHJhY3Rpb24iLAorCQkJInBhcmFtZXRlcnMiOlsKKwkJCQl7ICJuYW1lIjoicXVlcnkiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoiY29udGV4dCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9IC8vIDEtNTAsIGRlZmF1bHRzIHRvIDEwCisJCQldCisJCX0sCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC93ZWIvVjEvY29udGV4dFNlYXJjaC5odG1sCisJCQkibmFtZSI6ImNvbnRleHRTZWFyY2giLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL3NlYXJjaC55YWhvb2FwaXMuY29tL1dlYlNlYXJjaFNlcnZpY2UvVjEvY29udGV4dFNlYXJjaCIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJxdWVyeSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJjb250ZXh0IiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InR5cGUiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gImFsbCIKKwkJCQl7ICJuYW1lIjoicmVzdWx0cyIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gZGVmYXVsdHMgdG8gMTAKKwkJCQl7ICJuYW1lIjoic3RhcnQiLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIDEKKwkJCQl7ICJuYW1lIjoiZm9ybWF0IiwgInR5cGUiOiJTVFJJTkciIH0sIC8vIGRlZmF1bHRzIHRvICJhbnkiLCBjYW4gYmUgImh0bWwiLCAibXN3b3JkIiwgInBkZiIsICJwcHQiLCAicnN0IiwgInR4dCIsIG9yICJ4bHMiCisJCQkJeyAibmFtZSI6ImFkdWx0X29rIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6InNpbWlsYXJfb2siLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCQl7ICJuYW1lIjoibGFuZ3VhZ2UiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJCXsgIm5hbWUiOiJjb3VudHJ5IiwgInR5cGUiOiJTVFJJTkciIH0sIC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCQl7ICJuYW1lIjoic2l0ZSIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6ImxpY2Vuc2UiLCAidHlwZSI6IlNUUklORyIgfSAvLyBkZWZhdWx0cyB0byAiYW55IiwgY291bGQgYmUgImNjX2FueSIsICJjY19jb21tZXJjaWFsIiwgImNjX21vZGlmaWFibGUiCisJCQldCisJCX0sCisJCS8vCisJCS8vIElNQUdFIFNFQVJDSAorCQkvLworCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9zZWFyY2gvaW1hZ2UvVjEvaW1hZ2VTZWFyY2guaHRtbAorCQkJIm5hbWUiOiJpbWFnZVNlYXJjaCIsCisJCQkic2VydmljZVVSTCI6ICJodHRwOi8vYXBpLnNlYXJjaC55YWhvby5jb20vSW1hZ2VTZWFyY2hTZXJ2aWNlL1YxL2ltYWdlU2VhcmNoIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6InF1ZXJ5IiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InR5cGUiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gImFsbCIsIGNhbiBieSAiYW55IiBvciAicGhyYXNlIgorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byAxMAorCQkJCXsgIm5hbWUiOiJzdGFydCIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gZGVmYXVsdHMgdG8gMQorCQkJCXsgIm5hbWUiOiJmb3JtYXQiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gImFueSIsIGNhbiBiZSAiYm1wIiwgImdpZiIsICJqcGVnIiwgb3IgInBuZyIKKwkJCQl7ICJuYW1lIjoiYWR1bHRfb2siLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCQl7ICJuYW1lIjoiY29sb3JhdGlvbiIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyAiYW55IiwgImNvbG9yIiwgb3IgImJ3IgorCQkJCXsgIm5hbWUiOiJzaXRlIiwgInR5cGUiOiJTVFJJTkciIH0gLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJXQorCQl9LAorCQkvLworCQkvLyBTSVRFIEVYUExPUkVSCisJCS8vCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC9zaXRlZXhwbG9yZXIvVjEvaW5saW5rRGF0YS5odG1sIAorCQkJIm5hbWUiOiJpbmxpbmtEYXRhIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9TaXRlRXhwbG9yZXJTZXJ2aWNlL1YxL2lubGlua0RhdGEiLAorCQkJInBhcmFtZXRlcnMiOlsKKwkJCQl7ICJuYW1lIjoicXVlcnkiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoidHlwZSIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byAiYWxsIiwgY2FuIGJ5ICJhbnkiIG9yICJwaHJhc2UiCisJCQkJeyAibmFtZSI6ImVudGlyZV9zaXRlIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6Im9taXRfaW5saW5rcyIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyAiZG9tYWluIiBvciAic3ViZG9tYWluIiwgZGVmYXVsdHMgdG8gbnVsbAorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byA1MAorCQkJCXsgIm5hbWUiOiJzdGFydCIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gZGVmYXVsdHMgdG8gMQorCQkJCXsgIm5hbWUiOiJzaXRlIiwgInR5cGUiOiJTVFJJTkciIH0gLy8gZGVmYXVsdHMgdG8gbnVsbAorCQkJXQorCQl9LAorCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9zZWFyY2gvc2l0ZWV4cGxvcmVyL1YxL3BhZ2VEYXRhLmh0bWwKKwkJCSJuYW1lIjoicGFnZURhdGEiLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL2FwaS5zZWFyY2gueWFob28uY29tL1NpdGVFeHBsb3JlclNlcnZpY2UvVjEvcGFnZURhdGEiLAorCQkJInBhcmFtZXRlcnMiOlsKKwkJCQl7ICJuYW1lIjoicXVlcnkiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoidHlwZSIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyBkZWZhdWx0cyB0byAiYWxsIiwgY2FuIGJ5ICJhbnkiIG9yICJwaHJhc2UiCisJCQkJeyAibmFtZSI6ImRvbWFpbl9vbmx5IiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byBudWxsCisJCQkJeyAibmFtZSI6InJlc3VsdHMiLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIDUwCisJCQkJeyAibmFtZSI6InN0YXJ0IiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyBkZWZhdWx0cyB0byAxCisJCQkJeyAibmFtZSI6InNpdGUiLCAidHlwZSI6IlNUUklORyIgfSAvLyBkZWZhdWx0cyB0byBudWxsCisJCQldCisJCX0sCisJCS8vCisJCS8vIE1VU0lDIFNFQVJDSAorCQkvLworCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9zZWFyY2gvYXVkaW8vVjEvYXJ0aXN0U2VhcmNoLmh0bWwKKwkJCSJuYW1lIjoiYXJ0aXN0U2VhcmNoIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9BdWRpb1NlYXJjaFNlcnZpY2UvVjEvYXJ0aXN0U2VhcmNoIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6ImFydGlzdCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhcnRpc3RpZCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJ0eXBlIiwgInR5cGUiOiJTVFJJTkciIH0sIC8vICJhbGwiLCAiYW55Iiwgb3IgInBocmFzZSIKKwkJCQl7ICJuYW1lIjoicmVzdWx0cyIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gMS01MCwgZGVmYXVsdHMgdG8gMTAKKwkJCQl7ICJuYW1lIjoic3RhcnQiLCAidHlwZSI6IklOVEVHRVIiIH0gLy8gZGVmYXVsdHMgdG8gMQorCQkJXQorCQl9LAorCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9zZWFyY2gvYXVkaW8vVjEvYWxidW1TZWFyY2guaHRtbAorCQkJIm5hbWUiOiJhbGJ1bVNlYXJjaCIsCisJCQkic2VydmljZVVSTCI6ICJodHRwOi8vYXBpLnNlYXJjaC55YWhvby5jb20vQXVkaW9TZWFyY2hTZXJ2aWNlL1YxL2FsYnVtU2VhcmNoIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6ImFydGlzdCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhcnRpc3RpZCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhbGJ1bSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJ0eXBlIiwgInR5cGUiOiJTVFJJTkciIH0sIC8vICJhbGwiLCAiYW55Iiwgb3IgInBocmFzZSIKKwkJCQl7ICJuYW1lIjoicmVzdWx0cyIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gMS01MCwgZGVmYXVsdHMgdG8gMTAKKwkJCQl7ICJuYW1lIjoic3RhcnQiLCAidHlwZSI6IklOVEVHRVIiIH0gLy8gZGVmYXVsdHMgdG8gMQorCQkJXQorCQl9LAorCQl7CisJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9zZWFyY2gvYXVkaW8vVjEvc29uZ1NlYXJjaC5odG1sCisJCQkibmFtZSI6InNvbmdTZWFyY2giLAorCQkJInNlcnZpY2VVUkwiOiAiaHR0cDovL2FwaS5zZWFyY2gueWFob28uY29tL0F1ZGlvU2VhcmNoU2VydmljZS9WMS9zb25nU2VhcmNoIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6ImFydGlzdCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhcnRpc3RpZCIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhbGJ1bSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJhbGJ1bWlkIiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InNvbmciLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCQl7ICJuYW1lIjoic29uZ2lkIiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InR5cGUiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gImFsbCIsICJhbnkiLCBvciAicGhyYXNlIgorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyAxLTUwLCBkZWZhdWx0cyB0byAxMAorCQkJCXsgIm5hbWUiOiJzdGFydCIsICJ0eXBlIjoiSU5URUdFUiIgfSAvLyBkZWZhdWx0cyB0byAxCisJCQldCisJCX0sCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC9hdWRpby9WMS9zb25nRG93bmxvYWRMb2NhdGlvbi5odG1sCisJCQkibmFtZSI6InNvbmdEb3dubG9hZExvY2F0aW9uIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9BdWRpb1NlYXJjaFNlcnZpY2UvVjEvc29uZ0Rvd25sb2FkTG9jYXRpb24iLAorCQkJInBhcmFtZXRlcnMiOlsKKwkJCQl7ICJuYW1lIjoic29uZ2lkIiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJLy8gInNvdXJjZSIgY2FuIGNvbnRhaW46CisJCQkJLy8JYXVkaW9sdW5jaGJveCBhcnRpc3RkaXJlY3QgYnV5bXVzaWMgZG11c2ljCisJCQkJLy8JZW11c2ljIGVwaXRvbmljIGdhcmFnZWJhbmQgaXR1bmVzIHlhaG9vCisJCQkJLy8JbGl2ZWRvd25sb2FkcyBtcDM0dSBtc24gbXVzaWNtYXRjaCBtYXBzdGVyIHBhc3NhbG9uZworCQkJCS8vCXJoYXBzb2R5IHNvdW5kY2xpY2sgdGhld2ViCisJCQkJeyAibmFtZSI6InNvdXJjZSIsICJ0eXBlIjoiU1RSSU5HIiB9LAorCQkJCXsgIm5hbWUiOiJyZXN1bHRzIiwgInR5cGUiOiJJTlRFR0VSIiB9LCAvLyAxLTUwLCBkZWZhdWx0cyB0byAxMAorCQkJCXsgIm5hbWUiOiJzdGFydCIsICJ0eXBlIjoiSU5URUdFUiIgfSAvLyBkZWZhdWx0cyB0byAxCisJCQldCisJCX0sCisJCS8vCisJCS8vIE5FV1MgU0VBUkNICisJCS8vCisJCXsKKwkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3NlYXJjaC9uZXdzL1YxL25ld3NTZWFyY2guaHRtbAorCQkJIm5hbWUiOiJuZXdzU2VhcmNoIiwKKwkJCSJzZXJ2aWNlVVJMIjogImh0dHA6Ly9hcGkuc2VhcmNoLnlhaG9vLmNvbS9OZXdzU2VhcmNoU2VydmljZS9WMS9uZXdzU2VhcmNoIiwKKwkJCSJwYXJhbWV0ZXJzIjpbCisJCQkJeyAibmFtZSI6InF1ZXJ5IiwgInR5cGUiOiJTVFJJTkciIH0sCisJCQkJeyAibmFtZSI6InR5cGUiLCAidHlwZSI6IlNUUklORyIgfSwgLy8gZGVmYXVsdHMgdG8gImFsbCIKKwkJCQl7ICJuYW1lIjoicmVzdWx0cyIsICJ0eXBlIjoiSU5URUdFUiIgfSwgLy8gZGVmYXVsdHMgdG8gMTAKKwkJCQl7ICJuYW1lIjoic3RhcnQiLCAidHlwZSI6IklOVEVHRVIiIH0sIC8vIGRlZmF1bHRzIHRvIDEKKwkJCQl7ICJuYW1lIjoic29ydCIsICJ0eXBlIjoiU1RSSU5HIiB9LCAvLyAicmFuayIgb3IgImRhdGUiCisJCQkJeyAibmFtZSI6Imxhbmd1YWdlIiwgInR5cGUiOiJTVFJJTkciIH0sIC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCQl7ICJuYW1lIjoic2l0ZSIsICJ0eXBlIjoiU1RSSU5HIiB9IC8vIGRlZmF1bHRzIHRvIG51bGwKKwkJCV0KKwkJfQorCQkvKgorCQl7CisJCQkvLyAKKwkJCSJuYW1lIjoiIiwKKwkJCSJzZXJ2aWNlVVJMIjogIiIsCisJCQkicGFyYW1ldGVycyI6WworCQkJCXsgIm5hbWUiOiJzdHJlZXQiLCAidHlwZSI6IlNUUklORyIgfSwKKwkJCV0KKwkJfQorCQkqLworCV0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zZWxlY3Rpb24vU2VsZWN0aW9uLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3NlbGVjdGlvbi9TZWxlY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzZjExYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zZWxlY3Rpb24vU2VsZWN0aW9uLmpzCkBAIC0wLDAgKzEsMzE2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnNlbGVjdGlvbi5TZWxlY3Rpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoIik7Citkb2pvLmRlY2xhcmUoImRvam8uc2VsZWN0aW9uLlNlbGVjdGlvbiIsIG51bGwsIHtpbml0aWFsaXplcjpmdW5jdGlvbiAoaXRlbXMsIGlzQ29sbGVjdGlvbikgeworCXRoaXMuaXRlbXMgPSBbXTsKKwl0aGlzLnNlbGVjdGlvbiA9IFtdOworCXRoaXMuX3Bpdm90SXRlbXMgPSBbXTsKKwl0aGlzLmNsZWFySXRlbXMoKTsKKwlpZiAoaXRlbXMpIHsKKwkJaWYgKGlzQ29sbGVjdGlvbikgeworCQkJdGhpcy5zZXRJdGVtc0NvbGxlY3Rpb24oaXRlbXMpOworCQl9IGVsc2UgeworCQkJdGhpcy5zZXRJdGVtcyhpdGVtcyk7CisJCX0KKwl9Cit9LCBpdGVtczpudWxsLCBzZWxlY3Rpb246bnVsbCwgbGFzdFNlbGVjdGVkOm51bGwsIGFsbG93SW1wbGljaXQ6dHJ1ZSwgbGVuZ3RoOjAsIGlzR3Jvd2FibGU6dHJ1ZSwgX3Bpdm90SXRlbXM6bnVsbCwgX3Bpdm90SXRlbTpudWxsLCBvblNlbGVjdDpmdW5jdGlvbiAoaXRlbSkgeworfSwgb25EZXNlbGVjdDpmdW5jdGlvbiAoaXRlbSkgeworfSwgb25TZWxlY3RDaGFuZ2U6ZnVuY3Rpb24gKGl0ZW0sIHNlbGVjdGVkKSB7Cit9LCBfZmluZDpmdW5jdGlvbiAoaXRlbSwgaW5TZWxlY3Rpb24pIHsKKwlpZiAoaW5TZWxlY3Rpb24pIHsKKwkJcmV0dXJuIGRvam8ubGFuZy5maW5kKHRoaXMuc2VsZWN0aW9uLCBpdGVtKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZG9qby5sYW5nLmZpbmQodGhpcy5pdGVtcywgaXRlbSk7CisJfQorfSwgaXNTZWxlY3RhYmxlOmZ1bmN0aW9uIChpdGVtKSB7CisJcmV0dXJuIHRydWU7Cit9LCBzZXRJdGVtczpmdW5jdGlvbiAoKSB7CisJdGhpcy5jbGVhckl0ZW1zKCk7CisJdGhpcy5hZGRJdGVtcy5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBzZXRJdGVtc0NvbGxlY3Rpb246ZnVuY3Rpb24gKGNvbGxlY3Rpb24pIHsKKwl0aGlzLml0ZW1zID0gY29sbGVjdGlvbjsKK30sIGFkZEl0ZW1zOmZ1bmN0aW9uICgpIHsKKwl2YXIgYXJncyA9IGRvam8ubGFuZy51bm5lc3QoYXJndW1lbnRzKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5pdGVtcy5wdXNoKGFyZ3NbaV0pOworCX0KK30sIGFkZEl0ZW1zQXQ6ZnVuY3Rpb24gKGl0ZW0sIGJlZm9yZSkgeworCWlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiB0aGlzLmFkZEl0ZW1zKGRvam8ubGFuZy50b0FycmF5KGFyZ3VtZW50cywgMikpOworCX0KKwlpZiAoIXRoaXMuaXNJdGVtKGl0ZW0pKSB7CisJCWl0ZW0gPSB0aGlzLml0ZW1zW2l0ZW1dOworCX0KKwlpZiAoIWl0ZW0pIHsKKwkJdGhyb3cgbmV3IEVycm9yKCJhZGRJdGVtc0F0OiBpdGVtIGRvZXNuJ3QgZXhpc3QiKTsKKwl9CisJdmFyIGlkeCA9IHRoaXMuX2ZpbmQoaXRlbSk7CisJaWYgKGlkeCA+IDAgJiYgYmVmb3JlKSB7CisJCWlkeC0tOworCX0KKwlmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZiAoIXRoaXMuaXNJdGVtKGFyZ3VtZW50c1tpXSkpIHsKKwkJCXRoaXMuaXRlbXMuc3BsaWNlKGlkeCsrLCAwLCBhcmd1bWVudHNbaV0pOworCQl9CisJfQorfSwgcmVtb3ZlSXRlbTpmdW5jdGlvbiAoaXRlbSkgeworCXZhciBpZHggPSB0aGlzLl9maW5kKGl0ZW0pOworCWlmIChpZHggPiAtMSkgeworCQl0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpOworCX0KKwlpZHggPSB0aGlzLl9maW5kKGl0ZW0sIHRydWUpOworCWlmIChpZHggPiAtMSkgeworCQl0aGlzLnNlbGVjdGlvbi5zcGxpY2UoaWR4LCAxKTsKKwl9Cit9LCBjbGVhckl0ZW1zOmZ1bmN0aW9uICgpIHsKKwl0aGlzLml0ZW1zID0gW107CisJdGhpcy5kZXNlbGVjdEFsbCgpOworfSwgaXNJdGVtOmZ1bmN0aW9uIChpdGVtKSB7CisJcmV0dXJuIHRoaXMuX2ZpbmQoaXRlbSkgPiAtMTsKK30sIGlzU2VsZWN0ZWQ6ZnVuY3Rpb24gKGl0ZW0pIHsKKwlyZXR1cm4gdGhpcy5fZmluZChpdGVtLCB0cnVlKSA+IC0xOworfSwgc2VsZWN0RmlsdGVyOmZ1bmN0aW9uIChpdGVtLCBzZWxlY3Rpb24sIGFkZCwgZ3JvdykgeworCXJldHVybiB0cnVlOworfSwgdXBkYXRlOmZ1bmN0aW9uIChpdGVtLCBhZGQsIGdyb3csIG5vVG9nZ2xlKSB7CisJaWYgKCF0aGlzLmlzSXRlbShpdGVtKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0aGlzLmlzR3Jvd2FibGUgJiYgZ3JvdykgeworCQlpZiAoKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpICYmIHRoaXMuc2VsZWN0RmlsdGVyKGl0ZW0sIHRoaXMuc2VsZWN0aW9uLCBmYWxzZSwgdHJ1ZSkpIHsKKwkJCXRoaXMuZ3JvdyhpdGVtKTsKKwkJCXRoaXMubGFzdFNlbGVjdGVkID0gaXRlbTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhZGQpIHsKKwkJCWlmICh0aGlzLnNlbGVjdEZpbHRlcihpdGVtLCB0aGlzLnNlbGVjdGlvbiwgdHJ1ZSwgZmFsc2UpKSB7CisJCQkJaWYgKG5vVG9nZ2xlKSB7CisJCQkJCWlmICh0aGlzLnNlbGVjdChpdGVtKSkgeworCQkJCQkJdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRoaXMudG9nZ2xlU2VsZWN0ZWQoaXRlbSkpIHsKKwkJCQkJCXRoaXMubGFzdFNlbGVjdGVkID0gaXRlbTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuZGVzZWxlY3RBbGwoKTsKKwkJCXRoaXMuc2VsZWN0KGl0ZW0pOworCQl9CisJfQorCXRoaXMubGVuZ3RoID0gdGhpcy5zZWxlY3Rpb24ubGVuZ3RoOworCXJldHVybiB0cnVlOworfSwgZ3JvdzpmdW5jdGlvbiAodG9JdGVtLCBmcm9tSXRlbSkgeworCWlmICghdGhpcy5pc0dyb3dhYmxlKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworCQlmcm9tSXRlbSA9IHRoaXMuX3Bpdm90SXRlbTsKKwkJaWYgKCFmcm9tSXRlbSAmJiB0aGlzLmFsbG93SW1wbGljaXQpIHsKKwkJCWZyb21JdGVtID0gdGhpcy5pdGVtc1swXTsKKwkJfQorCX0KKwlpZiAoIXRvSXRlbSB8fCAhZnJvbUl0ZW0pIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl2YXIgZnJvbUlkeCA9IHRoaXMuX2ZpbmQoZnJvbUl0ZW0pOworCXZhciB0b0Rlc2VsZWN0ID0ge307CisJdmFyIGxhc3RJZHggPSAtMTsKKwlpZiAodGhpcy5sYXN0U2VsZWN0ZWQpIHsKKwkJbGFzdElkeCA9IHRoaXMuX2ZpbmQodGhpcy5sYXN0U2VsZWN0ZWQpOworCQl2YXIgc3RlcCA9IGZyb21JZHggPCBsYXN0SWR4ID8gLTEgOiAxOworCQl2YXIgcmFuZ2UgPSBkb2pvLm1hdGgucmFuZ2UobGFzdElkeCwgZnJvbUlkeCwgc3RlcCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2UubGVuZ3RoOyBpKyspIHsKKwkJCXRvRGVzZWxlY3RbcmFuZ2VbaV1dID0gdHJ1ZTsKKwkJfQorCX0KKwl2YXIgdG9JZHggPSB0aGlzLl9maW5kKHRvSXRlbSk7CisJdmFyIHN0ZXAgPSBmcm9tSWR4IDwgdG9JZHggPyAtMSA6IDE7CisJdmFyIHNocmluayA9IGxhc3RJZHggPj0gMCAmJiBzdGVwID09IDEgPyBsYXN0SWR4IDwgdG9JZHggOiBsYXN0SWR4ID4gdG9JZHg7CisJdmFyIHJhbmdlID0gZG9qby5tYXRoLnJhbmdlKHRvSWR4LCBmcm9tSWR4LCBzdGVwKTsKKwlpZiAocmFuZ2UubGVuZ3RoKSB7CisJCWZvciAodmFyIGkgPSByYW5nZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworCQkJdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW3JhbmdlW2ldXTsKKwkJCWlmICh0aGlzLnNlbGVjdEZpbHRlcihpdGVtLCB0aGlzLnNlbGVjdGlvbiwgZmFsc2UsIHRydWUpKSB7CisJCQkJaWYgKHRoaXMuc2VsZWN0KGl0ZW0sIHRydWUpIHx8IHNocmluaykgeworCQkJCQl0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07CisJCQkJfQorCQkJCWlmIChyYW5nZVtpXSBpbiB0b0Rlc2VsZWN0KSB7CisJCQkJCWRlbGV0ZSB0b0Rlc2VsZWN0W3JhbmdlW2ldXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmxhc3RTZWxlY3RlZCA9IGZyb21JdGVtOworCX0KKwlmb3IgKHZhciBpIGluIHRvRGVzZWxlY3QpIHsKKwkJaWYgKHRoaXMuaXRlbXNbaV0gPT0gdGhpcy5sYXN0U2VsZWN0ZWQpIHsKKwkJfQorCQl0aGlzLmRlc2VsZWN0KHRoaXMuaXRlbXNbaV0pOworCX0KKwl0aGlzLl91cGRhdGVQaXZvdCgpOworfSwgZ3Jvd1VwOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaXNHcm93YWJsZSkgeworCQlyZXR1cm47CisJfQorCXZhciBpZHggPSB0aGlzLl9maW5kKHRoaXMubGFzdFNlbGVjdGVkKSAtIDE7CisJd2hpbGUgKGlkeCA+PSAwKSB7CisJCWlmICh0aGlzLnNlbGVjdEZpbHRlcih0aGlzLml0ZW1zW2lkeF0sIHRoaXMuc2VsZWN0aW9uLCBmYWxzZSwgdHJ1ZSkpIHsKKwkJCXRoaXMuZ3Jvdyh0aGlzLml0ZW1zW2lkeF0pOworCQkJYnJlYWs7CisJCX0KKwkJaWR4LS07CisJfQorfSwgZ3Jvd0Rvd246ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5pc0dyb3dhYmxlKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGlkeCA9IHRoaXMuX2ZpbmQodGhpcy5sYXN0U2VsZWN0ZWQpOworCWlmIChpZHggPCAwICYmIHRoaXMuYWxsb3dJbXBsaWNpdCkgeworCQl0aGlzLnNlbGVjdCh0aGlzLml0ZW1zWzBdKTsKKwkJaWR4ID0gMDsKKwl9CisJaWR4Kys7CisJd2hpbGUgKGlkeCA+IDAgJiYgaWR4IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuc2VsZWN0RmlsdGVyKHRoaXMuaXRlbXNbaWR4XSwgdGhpcy5zZWxlY3Rpb24sIGZhbHNlLCB0cnVlKSkgeworCQkJdGhpcy5ncm93KHRoaXMuaXRlbXNbaWR4XSk7CisJCQlicmVhazsKKwkJfQorCQlpZHgrKzsKKwl9Cit9LCB0b2dnbGVTZWxlY3RlZDpmdW5jdGlvbiAoaXRlbSwgbm9QaXZvdCkgeworCWlmICh0aGlzLmlzSXRlbShpdGVtKSkgeworCQlpZiAodGhpcy5zZWxlY3QoaXRlbSwgbm9QaXZvdCkpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICh0aGlzLmRlc2VsZWN0KGl0ZW0pKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9LCBzZWxlY3Q6ZnVuY3Rpb24gKGl0ZW0sIG5vUGl2b3QpIHsKKwlpZiAodGhpcy5pc0l0ZW0oaXRlbSkgJiYgIXRoaXMuaXNTZWxlY3RlZChpdGVtKSAmJiB0aGlzLmlzU2VsZWN0YWJsZShpdGVtKSkgeworCQl0aGlzLnNlbGVjdGlvbi5wdXNoKGl0ZW0pOworCQl0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07CisJCXRoaXMub25TZWxlY3QoaXRlbSk7CisJCXRoaXMub25TZWxlY3RDaGFuZ2UoaXRlbSwgdHJ1ZSk7CisJCWlmICghbm9QaXZvdCkgeworCQkJdGhpcy5fYWRkUGl2b3QoaXRlbSk7CisJCX0KKwkJdGhpcy5sZW5ndGggPSB0aGlzLnNlbGVjdGlvbi5sZW5ndGg7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBkZXNlbGVjdDpmdW5jdGlvbiAoaXRlbSkgeworCXZhciBpZHggPSB0aGlzLl9maW5kKGl0ZW0sIHRydWUpOworCWlmIChpZHggPiAtMSkgeworCQl0aGlzLnNlbGVjdGlvbi5zcGxpY2UoaWR4LCAxKTsKKwkJdGhpcy5vbkRlc2VsZWN0KGl0ZW0pOworCQl0aGlzLm9uU2VsZWN0Q2hhbmdlKGl0ZW0sIGZhbHNlKTsKKwkJaWYgKGl0ZW0gPT0gdGhpcy5sYXN0U2VsZWN0ZWQpIHsKKwkJCXRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDsKKwkJfQorCQl0aGlzLl9yZW1vdmVQaXZvdChpdGVtKTsKKwkJdGhpcy5sZW5ndGggPSB0aGlzLnNlbGVjdGlvbi5sZW5ndGg7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBzZWxlY3RBbGw6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnNlbGVjdCh0aGlzLml0ZW1zW2ldKTsKKwl9Cit9LCBkZXNlbGVjdEFsbDpmdW5jdGlvbiAoKSB7CisJd2hpbGUgKHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCkgeworCQl0aGlzLmRlc2VsZWN0KHRoaXMuc2VsZWN0aW9uWzBdKTsKKwl9Cit9LCBzZWxlY3ROZXh0OmZ1bmN0aW9uICgpIHsKKwl2YXIgaWR4ID0gdGhpcy5fZmluZCh0aGlzLmxhc3RTZWxlY3RlZCk7CisJd2hpbGUgKGlkeCA+IC0xICYmICsraWR4IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKKwkJaWYgKHRoaXMuaXNTZWxlY3RhYmxlKHRoaXMuaXRlbXNbaWR4XSkpIHsKKwkJCXRoaXMuZGVzZWxlY3RBbGwoKTsKKwkJCXRoaXMuc2VsZWN0KHRoaXMuaXRlbXNbaWR4XSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBzZWxlY3RQcmV2aW91czpmdW5jdGlvbiAoKSB7CisJdmFyIGlkeCA9IHRoaXMuX2ZpbmQodGhpcy5sYXN0U2VsZWN0ZWQpOworCXdoaWxlIChpZHgtLSA+IDApIHsKKwkJaWYgKHRoaXMuaXNTZWxlY3RhYmxlKHRoaXMuaXRlbXNbaWR4XSkpIHsKKwkJCXRoaXMuZGVzZWxlY3RBbGwoKTsKKwkJCXRoaXMuc2VsZWN0KHRoaXMuaXRlbXNbaWR4XSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBzZWxlY3RGaXJzdDpmdW5jdGlvbiAoKSB7CisJdGhpcy5kZXNlbGVjdEFsbCgpOworCXZhciBpZHggPSAwOworCXdoaWxlICh0aGlzLml0ZW1zW2lkeF0gJiYgIXRoaXMuc2VsZWN0KHRoaXMuaXRlbXNbaWR4XSkpIHsKKwkJaWR4Kys7CisJfQorCXJldHVybiB0aGlzLml0ZW1zW2lkeF0gPyB0cnVlIDogZmFsc2U7Cit9LCBzZWxlY3RMYXN0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLmRlc2VsZWN0QWxsKCk7CisJdmFyIGlkeCA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsKKwl3aGlsZSAodGhpcy5pdGVtc1tpZHhdICYmICF0aGlzLnNlbGVjdCh0aGlzLml0ZW1zW2lkeF0pKSB7CisJCWlkeC0tOworCX0KKwlyZXR1cm4gdGhpcy5pdGVtc1tpZHhdID8gdHJ1ZSA6IGZhbHNlOworfSwgX2FkZFBpdm90OmZ1bmN0aW9uIChpdGVtLCBhbmRDbGVhcikgeworCXRoaXMuX3Bpdm90SXRlbSA9IGl0ZW07CisJaWYgKGFuZENsZWFyKSB7CisJCXRoaXMuX3Bpdm90SXRlbXMgPSBbaXRlbV07CisJfSBlbHNlIHsKKwkJdGhpcy5fcGl2b3RJdGVtcy5wdXNoKGl0ZW0pOworCX0KK30sIF9yZW1vdmVQaXZvdDpmdW5jdGlvbiAoaXRlbSkgeworCXZhciBpID0gZG9qby5sYW5nLmZpbmQodGhpcy5fcGl2b3RJdGVtcywgaXRlbSk7CisJaWYgKGkgPiAtMSkgeworCQl0aGlzLl9waXZvdEl0ZW1zLnNwbGljZShpLCAxKTsKKwkJdGhpcy5fcGl2b3RJdGVtID0gdGhpcy5fcGl2b3RJdGVtc1t0aGlzLl9waXZvdEl0ZW1zLmxlbmd0aCAtIDFdOworCX0KKwl0aGlzLl91cGRhdGVQaXZvdCgpOworfSwgX3VwZGF0ZVBpdm90OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fcGl2b3RJdGVtcy5sZW5ndGggPT0gMCkgeworCQlpZiAodGhpcy5sYXN0U2VsZWN0ZWQpIHsKKwkJCXRoaXMuX2FkZFBpdm90KHRoaXMubGFzdFNlbGVjdGVkKTsKKwkJfQorCX0KK30sIHNvcnRlZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8ubGFuZy50b0FycmF5KHRoaXMuc2VsZWN0aW9uKS5zb3J0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoYSwgYikgeworCQl2YXIgQSA9IHRoaXMuX2ZpbmQoYSksIEIgPSB0aGlzLl9maW5kKGIpOworCQlpZiAoQSA+IEIpIHsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJaWYgKEEgPCBCKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0pKTsKK30sIHVwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLl9maW5kKHRoaXMuc2VsZWN0aW9uW2ldKSA8IDApIHsKKwkJCXZhciByZW1vdmVkID0gdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGksIDEpOworCQkJdGhpcy5fcmVtb3ZlUGl2b3QocmVtb3ZlZFswXSk7CisJCX0KKwl9CisJdGhpcy5sZW5ndGggPSB0aGlzLnNlbGVjdGlvbi5sZW5ndGg7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0b3JhZ2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5OTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlLmpzCkBAIC0wLDAgKzEsMTI3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnN0b3JhZ2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnN0b3JhZ2UgPSBuZXcgZnVuY3Rpb24gKCkgeworfTsKK2Rvam8uZGVjbGFyZSgiZG9qby5zdG9yYWdlIiwgbnVsbCwge1NVQ0NFU1M6InN1Y2Nlc3MiLCBGQUlMRUQ6ImZhaWxlZCIsIFBFTkRJTkc6InBlbmRpbmciLCBTSVpFX05PVF9BVkFJTEFCTEU6IlNpemUgbm90IGF2YWlsYWJsZSIsIFNJWkVfTk9fTElNSVQ6Ik5vIHNpemUgbGltaXQiLCBuYW1lc3BhY2U6ImRlZmF1bHQiLCBvbkhpZGVTZXR0aW5nc1VJOm51bGwsIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLmluaXRpYWxpemUiKTsKK30sIGlzQXZhaWxhYmxlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uc3RvcmFnZS5pc0F2YWlsYWJsZSIpOworfSwgcHV0OmZ1bmN0aW9uIChrZXksIHZhbHVlLCByZXN1bHRzSGFuZGxlcikgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLnB1dCIpOworfSwgZ2V0OmZ1bmN0aW9uIChrZXkpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uc3RvcmFnZS5nZXQiKTsKK30sIGhhc0tleTpmdW5jdGlvbiAoa2V5KSB7CisJcmV0dXJuICh0aGlzLmdldChrZXkpICE9IG51bGwpOworfSwgZ2V0S2V5czpmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLnN0b3JhZ2UuZ2V0S2V5cyIpOworfSwgY2xlYXI6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLmNsZWFyIik7Cit9LCByZW1vdmU6ZnVuY3Rpb24gKGtleSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLnJlbW92ZSIpOworfSwgaXNQZXJtYW5lbnQ6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLmlzUGVybWFuZW50Iik7Cit9LCBnZXRNYXhpbXVtU2l6ZTpmdW5jdGlvbiAoKSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLnN0b3JhZ2UuZ2V0TWF4aW11bVNpemUiKTsKK30sIGhhc1NldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCXJldHVybiBmYWxzZTsKK30sIHNob3dTZXR0aW5nc1VJOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uc3RvcmFnZS5zaG93U2V0dGluZ3NVSSIpOworfSwgaGlkZVNldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLmhpZGVTZXR0aW5nc1VJIik7Cit9LCBnZXRUeXBlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uc3RvcmFnZS5nZXRUeXBlIik7Cit9LCBpc1ZhbGlkS2V5OmZ1bmN0aW9uIChrZXlOYW1lKSB7CisJaWYgKChrZXlOYW1lID09IG51bGwpIHx8ICh0eXBlb2Yga2V5TmFtZSA9PSAidW5kZWZpbmVkIikpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gL15bMC05QS1aYS16X10qJC8udGVzdChrZXlOYW1lKTsKK319KTsKK2Rvam8uc3RvcmFnZS5tYW5hZ2VyID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLmN1cnJlbnRQcm92aWRlciA9IG51bGw7CisJdGhpcy5hdmFpbGFibGUgPSBmYWxzZTsKKwl0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlOworCXRoaXMuX3Byb3ZpZGVycyA9IFtdOworCXRoaXMubmFtZXNwYWNlID0gImRlZmF1bHQiOworCXRoaXMuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5hdXRvZGV0ZWN0KCk7CisJfTsKKwl0aGlzLnJlZ2lzdGVyID0gZnVuY3Rpb24gKG5hbWUsIGluc3RhbmNlKSB7CisJCXRoaXMuX3Byb3ZpZGVyc1t0aGlzLl9wcm92aWRlcnMubGVuZ3RoXSA9IGluc3RhbmNlOworCQl0aGlzLl9wcm92aWRlcnNbbmFtZV0gPSBpbnN0YW5jZTsKKwl9OworCXRoaXMuc2V0UHJvdmlkZXIgPSBmdW5jdGlvbiAoc3RvcmFnZUNsYXNzKSB7CisJfTsKKwl0aGlzLmF1dG9kZXRlY3QgPSBmdW5jdGlvbiAoKSB7CisJCWlmICh0aGlzLl9pbml0aWFsaXplZCA9PSB0cnVlKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIHByb3ZpZGVyVG9Vc2UgPSBudWxsOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGg7IGkrKykgeworCQkJcHJvdmlkZXJUb1VzZSA9IHRoaXMuX3Byb3ZpZGVyc1tpXTsKKwkJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoZGpDb25maWdbImZvcmNlU3RvcmFnZVByb3ZpZGVyIl0pID09IGZhbHNlICYmIHByb3ZpZGVyVG9Vc2UuZ2V0VHlwZSgpID09IGRqQ29uZmlnWyJmb3JjZVN0b3JhZ2VQcm92aWRlciJdKSB7CisJCQkJcHJvdmlkZXJUb1VzZS5pc0F2YWlsYWJsZSgpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGRqQ29uZmlnWyJmb3JjZVN0b3JhZ2VQcm92aWRlciJdKSA9PSB0cnVlICYmIHByb3ZpZGVyVG9Vc2UuaXNBdmFpbGFibGUoKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHByb3ZpZGVyVG9Vc2UgPT0gbnVsbCkgeworCQkJdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOworCQkJdGhpcy5hdmFpbGFibGUgPSBmYWxzZTsKKwkJCXRoaXMuY3VycmVudFByb3ZpZGVyID0gbnVsbDsKKwkJCWRvam8ucmFpc2UoIk5vIHN0b3JhZ2UgcHJvdmlkZXIgZm91bmQgZm9yIHRoaXMgcGxhdGZvcm0iKTsKKwkJfQorCQl0aGlzLmN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyVG9Vc2U7CisJCWZvciAodmFyIGkgaW4gcHJvdmlkZXJUb1VzZSkgeworCQkJZG9qby5zdG9yYWdlW2ldID0gcHJvdmlkZXJUb1VzZVtpXTsKKwkJfQorCQlkb2pvLnN0b3JhZ2UubWFuYWdlciA9IHRoaXM7CisJCWRvam8uc3RvcmFnZS5pbml0aWFsaXplKCk7CisJCXRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTsKKwkJdGhpcy5hdmFpbGFibGUgPSB0cnVlOworCX07CisJdGhpcy5pc0F2YWlsYWJsZSA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMuYXZhaWxhYmxlOworCX07CisJdGhpcy5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24gKCkgeworCQlpZiAodGhpcy5jdXJyZW50UHJvdmlkZXIuZ2V0VHlwZSgpID09ICJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GbGFzaFN0b3JhZ2VQcm92aWRlciIgJiYgZG9qby5mbGFzaC5yZWFkeSA9PSBmYWxzZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkOworCQl9CisJfTsKKwl0aGlzLnN1cHBvcnRzUHJvdmlkZXIgPSBmdW5jdGlvbiAoc3RvcmFnZUNsYXNzKSB7CisJCXRyeSB7CisJCQl2YXIgcHJvdmlkZXIgPSBldmFsKCJuZXcgIiArIHN0b3JhZ2VDbGFzcyArICIoKSIpOworCQkJdmFyIHJlc3VsdHMgPSBwcm92aWRlci5pc0F2YWlsYWJsZSgpOworCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0cyA9PSAidW5kZWZpbmVkIikgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHRzOworCQl9CisJCWNhdGNoIChleGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX07CisJdGhpcy5nZXRQcm92aWRlciA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMuY3VycmVudFByb3ZpZGVyOworCX07CisJdGhpcy5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7CisJfTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL1N0b3JhZ2UuYXMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9TdG9yYWdlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWExYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9TdG9yYWdlLmFzCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCitpbXBvcnQgRG9qb0V4dGVybmFsSW50ZXJmYWNlOworCitjbGFzcyBTdG9yYWdlIHsKKwlwdWJsaWMgc3RhdGljIHZhciBTVUNDRVNTID0gInN1Y2Nlc3MiOworCXB1YmxpYyBzdGF0aWMgdmFyIEZBSUxFRCA9ICJmYWlsZWQiOworCXB1YmxpYyBzdGF0aWMgdmFyIFBFTkRJTkcgPSAicGVuZGluZyI7CisJCisJcHVibGljIHZhciBzbzsKKwkKKwlwdWJsaWMgZnVuY3Rpb24gU3RvcmFnZSgpeworCQkvL2dldFVSTCgiamF2YXNjcmlwdDpkb2pvLmRlYnVnKCdGTEFTSDpTdG9yYWdlIGNvbnN0cnVjdG9yJykiKTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmluaXRpYWxpemUoKTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFkZENhbGxiYWNrKCJwdXQiLCB0aGlzLCBwdXQpOworCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuYWRkQ2FsbGJhY2soImdldCIsIHRoaXMsIGdldCk7CisJCURvam9FeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygic2hvd1NldHRpbmdzIiwgdGhpcywgc2hvd1NldHRpbmdzKTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFkZENhbGxiYWNrKCJjbGVhciIsIHRoaXMsIGNsZWFyKTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmFkZENhbGxiYWNrKCJnZXRLZXlzIiwgdGhpcywgZ2V0S2V5cyk7CisJCURvam9FeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygicmVtb3ZlIiwgdGhpcywgcmVtb3ZlKTsKKwkJRG9qb0V4dGVybmFsSW50ZXJmYWNlLmxvYWRlZCgpOworCQkKKwkJLy8gcHJlbG9hZCB0aGUgU3lzdGVtIFNldHRpbmdzIGZpbmlzaGVkIGJ1dHRvbiBtb3ZpZSBmb3Igb2ZmbGluZQorCQkvLyBhY2Nlc3Mgc28gaXQgaXMgaW4gdGhlIGNhY2hlCisJCV9yb290LmNyZWF0ZUVtcHR5TW92aWVDbGlwKCJfc2V0dGluZ3NCYWNrZ3JvdW5kIiwgMSk7CisJCS8vIGdldFVSTCgiamF2YXNjcmlwdDphbGVydCgnIitEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGgrIicpOyIpOworCQlfcm9vdC5fc2V0dGluZ3NCYWNrZ3JvdW5kLmxvYWRNb3ZpZShEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGggKyAic3RvcmFnZV9kaWFsb2cuc3dmIik7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIHB1dChrZXlOYW1lLCBrZXlWYWx1ZSwgbmFtZXNwYWNlKXsKKwkJLy8gR2V0IHRoZSBTaGFyZWRPYmplY3QgZm9yIHRoZXNlIHZhbHVlcyBhbmQgc2F2ZSBpdAorCQlzbyA9IFNoYXJlZE9iamVjdC5nZXRMb2NhbChuYW1lc3BhY2UpOworCQkKKwkJLy8gcHJlcGFyZSBhIHN0b3JhZ2Ugc3RhdHVzIGhhbmRsZXIKKwkJdmFyIHNlbGYgPSB0aGlzOworCQlzby5vblN0YXR1cyA9IGZ1bmN0aW9uKGluZm9PYmplY3Q6T2JqZWN0KXsKKwkJCS8vZ2V0VVJMKCJqYXZhc2NyaXB0OmRvam8uZGVidWcoJ0ZMQVNIOiBvblN0YXR1cywgaW5mb09iamVjdD0iK2luZm9PYmplY3QuY29kZSsiJykiKTsKKwkJCQorCQkJLy8gZGVsZXRlIHRoZSBkYXRhIHZhbHVlIGlmIHRoZSByZXF1ZXN0IHdhcyBkZW5pZWQKKwkJCWlmIChpbmZvT2JqZWN0LmNvZGUgPT0gIlNoYXJlZE9iamVjdC5GbHVzaC5GYWlsZWQiKXsKKwkJCQlkZWxldGUgc2VsZi5zby5kYXRhW2tleU5hbWVdOworCQkJfQorCQkJCisJCQl2YXIgc3RhdHVzUmVzdWx0czsKKwkJCWlmKGluZm9PYmplY3QuY29kZSA9PSAiU2hhcmVkT2JqZWN0LkZsdXNoLkZhaWxlZCIpeworCQkJCXN0YXR1c1Jlc3VsdHMgPSBTdG9yYWdlLkZBSUxFRDsKKwkJCX1lbHNlIGlmKGluZm9PYmplY3QuY29kZSA9PSAiU2hhcmVkT2JqZWN0LkZsdXNoLlBlbmRpbmciKXsKKwkJCQlzdGF0dXNSZXN1bHRzID0gU3RvcmFnZS5QRU5ESU5HOworCQkJfWVsc2UgaWYoaW5mb09iamVjdC5jb2RlID09ICJTaGFyZWRPYmplY3QuRmx1c2guU3VjY2VzcyIpeworCQkJCXN0YXR1c1Jlc3VsdHMgPSBTdG9yYWdlLlNVQ0NFU1M7CisJCQl9CisJCQkvL2dldFVSTCgiamF2YXNjcmlwdDpkb2pvLmRlYnVnKCdGTEFTSDogb25TdGF0dXMsIHN0YXR1c1Jlc3VsdHM9IitzdGF0dXNSZXN1bHRzKyInKSIpOworCQkJCisJCQkvLyBnaXZlIHRoZSBzdGF0dXMgcmVzdWx0cyB0byBKYXZhU2NyaXB0CisJCQlEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgiZG9qby5zdG9yYWdlLl9vblN0YXR1cyIsIG51bGwsIHN0YXR1c1Jlc3VsdHMsIAorCQkJCQkJCQkJCQkJCQkJCSBrZXlOYW1lKTsKKwkJfQorCQkKKwkJLy8gc2F2ZSB0aGUga2V5IGFuZCB2YWx1ZQorCQlzby5kYXRhW2tleU5hbWVdID0ga2V5VmFsdWU7CisJCXZhciBmbHVzaFJlc3VsdHMgPSBzby5mbHVzaCgpOworCQkKKwkJLy8gcmV0dXJuIHJlc3VsdHMgb2YgdGhpcyBjb21tYW5kIHRvIEphdmFTY3JpcHQKKwkJdmFyIHN0YXR1c1Jlc3VsdHM7CisJCWlmKGZsdXNoUmVzdWx0cyA9PSB0cnVlKXsKKwkJCXN0YXR1c1Jlc3VsdHMgPSBTdG9yYWdlLlNVQ0NFU1M7CisJCX1lbHNlIGlmKGZsdXNoUmVzdWx0cyA9PSAicGVuZGluZyIpeworCQkJc3RhdHVzUmVzdWx0cyA9IFN0b3JhZ2UuUEVORElORzsKKwkJfWVsc2V7CisJCQlzdGF0dXNSZXN1bHRzID0gU3RvcmFnZS5GQUlMRUQ7CisJCX0KKwkJCisJCURvam9FeHRlcm5hbEludGVyZmFjZS5jYWxsKCJkb2pvLnN0b3JhZ2UuX29uU3RhdHVzIiwgbnVsbCwgc3RhdHVzUmVzdWx0cywgCisJCQkJCQkJCQkJCQkJCQkga2V5TmFtZSk7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldChrZXlOYW1lLCBuYW1lc3BhY2UpeworCQkvLyBHZXQgdGhlIFNoYXJlZE9iamVjdCBmb3IgdGhlc2UgdmFsdWVzIGFuZCBzYXZlIGl0CisJCXNvID0gU2hhcmVkT2JqZWN0LmdldExvY2FsKG5hbWVzcGFjZSk7CisJCXZhciByZXN1bHRzID0gc28uZGF0YVtrZXlOYW1lXTsKKwkJCisJCXJldHVybiByZXN1bHRzOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gc2hvd1NldHRpbmdzKCl7CisJCS8vIFNob3cgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEZsYXNoIHBsYXllciwgb3BlbmVkIHRvIHRoZQorCQkvLyBzZWN0aW9uIGZvciBsb2NhbCBzdG9yYWdlIGNvbnRyb2xzIChwYW5lIDEpCisJCVN5c3RlbS5zaG93U2V0dGluZ3MoMSk7CisJCQorCQkvLyB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIGludGVyY2VwdCB3aGVuIHRoZSBDbG9zZSBidXR0b24gaXMgcHJlc3NlZCwgYWxsb3dpbmcgdXMKKwkJLy8gdG8gaGlkZSB0aGUgRmxhc2ggZGlhbG9nLiBJbnN0ZWFkLCB3ZSBuZWVkIHRvIGxvYWQgYSBtb3ZpZSBpbiB0aGUKKwkJLy8gYmFja2dyb3VuZCB0aGF0IHdlIGNhbiBzaG93IGEgY2xvc2UgYnV0dG9uIG9uLgorCQlfcm9vdC5jcmVhdGVFbXB0eU1vdmllQ2xpcCgiX3NldHRpbmdzQmFja2dyb3VuZCIsIDEpOworCQlfcm9vdC5fc2V0dGluZ3NCYWNrZ3JvdW5kLmxvYWRNb3ZpZShEb2pvRXh0ZXJuYWxJbnRlcmZhY2UuZG9qb1BhdGggKyAic3RvcmFnZV9kaWFsb2cuc3dmIik7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiBjbGVhcihuYW1lc3BhY2UpeworCQlzbyA9IFNoYXJlZE9iamVjdC5nZXRMb2NhbChuYW1lc3BhY2UpOworCQlzby5jbGVhcigpOworCQlzby5mbHVzaCgpOworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5cyhuYW1lc3BhY2UpeworCQkvLyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGtleXMgaW4gdGhpcyBuYW1lc3BhY2UKKwkJCisJCS8vIGdldCB0aGUgc3RvcmFnZSBvYmplY3QKKwkJc28gPSBTaGFyZWRPYmplY3QuZ2V0TG9jYWwobmFtZXNwYWNlKTsKKwkJCisJCS8vIGdldCBhbGwgb2YgdGhlIGtleXMKKwkJdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkoKTsKKwkJZm9yKHZhciBpIGluIHNvLmRhdGEpCisJCQlyZXN1bHRzLnB1c2goaSk7CQorCQkKKwkJLy8gam9pbiB0aGUga2V5cyB0b2dldGhlciBpbiBhIGNvbW1hIHNlcGVyYXRlZCBzdHJpbmcKKwkJcmVzdWx0cyA9IHJlc3VsdHMuam9pbigiLCIpOworCQkKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiByZW1vdmUoa2V5TmFtZSwgbmFtZXNwYWNlKXsKKwkJLy8gUmVtb3ZlcyBhIGtleQorCisJCS8vIGdldCB0aGUgc3RvcmFnZSBvYmplY3QKKwkJc28gPSBTaGFyZWRPYmplY3QuZ2V0TG9jYWwobmFtZXNwYWNlKTsKKwkJCisJCS8vIGRlbGV0ZSB0aGlzIHZhbHVlCisJCWRlbGV0ZSBzby5kYXRhW2tleU5hbWVdOworCQkKKwkJLy8gc2F2ZSB0aGUgY2hhbmdlcworCQlzby5mbHVzaCgpOworCX0KKworCXN0YXRpYyBmdW5jdGlvbiBtYWluKG1jKXsKKwkJLy9nZXRVUkwoImphdmFzY3JpcHQ6ZG9qby5kZWJ1ZygnRkxBU0g6IHN0b3JhZ2UgbG9hZGVkJykiKTsKKwkJX3Jvb3QuYXBwID0gbmV3IFN0b3JhZ2UoKTsgCisJfQorfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Zjc1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5zdG9yYWdlIl0sIGJyb3dzZXI6WyJkb2pvLnN0b3JhZ2UuYnJvd3NlciJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8uc3RvcmFnZS4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL2Jyb3dzZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9icm93c2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGM2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RvcmFnZS9icm93c2VyLmpzCkBAIC0wLDAgKzEsNTUwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnN0b3JhZ2UuYnJvd3NlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0b3JhZ2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5mbGFzaCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmpzb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuKiIpOworZG9qby5zdG9yYWdlLmJyb3dzZXIuRmlsZVN0b3JhZ2VQcm92aWRlciA9IGZ1bmN0aW9uICgpIHsKK307Citkb2pvLmluaGVyaXRzKGRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIsIGRvam8uc3RvcmFnZSk7Citkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9LRVlfSU5ERVhfRklMRU5BTUUgPSAiX19kb2pvQWxsS2V5cyI7Citkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9BUFBMRVRfSUQgPSAiX19kb2pvRmlsZUphdmFPYmoiOworZG9qby5sYW5nLmV4dGVuZChkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLCB7bmFtZXNwYWNlOiJkZWZhdWx0IiwgaW5pdGlhbGl6ZWQ6ZmFsc2UsIF9hdmFpbGFibGU6bnVsbCwgX3N0YXR1c0hhbmRsZXI6bnVsbCwgX2tleUluZGV4Om5ldyBBcnJheSgpLCBpbml0aWFsaXplOmZ1bmN0aW9uICgpIHsKKwlpZiAoZGpDb25maWdbImRpc2FibGVGaWxlU3RvcmFnZSJdID09IHRydWUpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9sb2FkS2V5SW5kZXgoKTsKKwl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKwlkb2pvLnN0b3JhZ2UubWFuYWdlci5sb2FkZWQoKTsKK30sIGlzQXZhaWxhYmxlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9hdmFpbGFibGUgPSBmYWxzZTsKKwl2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7CisJaWYgKHByb3RvY29sLmluZGV4T2YoImZpbGUiKSAhPSAtMSB8fCBwcm90b2NvbC5pbmRleE9mKCJjaHJvbWUiKSAhPSAtMSkgeworCQl0aGlzLl9hdmFpbGFibGUgPSB0aGlzLl9pc0F2YWlsYWJsZVhQQ09NKCk7CisJCWlmICh0aGlzLl9hdmFpbGFibGUgPT0gZmFsc2UpIHsKKwkJCXRoaXMuX2F2YWlsYWJsZSA9IHRoaXMuX2lzQXZhaWxhYmxlQWN0aXZlWCgpOworCQl9CisJfQorCXJldHVybiB0aGlzLl9hdmFpbGFibGU7Cit9LCBwdXQ6ZnVuY3Rpb24gKGtleSwgdmFsdWUsIHJlc3VsdHNIYW5kbGVyKSB7CisJaWYgKHRoaXMuaXNWYWxpZEtleShrZXkpID09IGZhbHNlKSB7CisJCWRvam8ucmFpc2UoIkludmFsaWQga2V5IGdpdmVuOiAiICsga2V5KTsKKwl9CisJdGhpcy5fc3RhdHVzSGFuZGxlciA9IHJlc3VsdHNIYW5kbGVyOworCXRyeSB7CisJCXRoaXMuX3NhdmUoa2V5LCB2YWx1ZSk7CisJCXJlc3VsdHNIYW5kbGVyLmNhbGwobnVsbCwgZG9qby5zdG9yYWdlLlNVQ0NFU1MsIGtleSk7CisJfQorCWNhdGNoIChlKSB7CisJCXRoaXMuX3N0YXR1c0hhbmRsZXIuY2FsbChudWxsLCBkb2pvLnN0b3JhZ2UuRkFJTEVELCBrZXksIGUudG9TdHJpbmcoKSk7CisJfQorfSwgZ2V0OmZ1bmN0aW9uIChrZXkpIHsKKwlpZiAodGhpcy5pc1ZhbGlkS2V5KGtleSkgPT0gZmFsc2UpIHsKKwkJZG9qby5yYWlzZSgiSW52YWxpZCBrZXkgZ2l2ZW46ICIgKyBrZXkpOworCX0KKwl2YXIgcmVzdWx0cyA9IHRoaXMuX2xvYWQoa2V5KTsKKwlyZXR1cm4gcmVzdWx0czsKK30sIGdldEtleXM6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9rZXlJbmRleDsKK30sIGhhc0tleTpmdW5jdGlvbiAoa2V5KSB7CisJaWYgKHRoaXMuaXNWYWxpZEtleShrZXkpID09IGZhbHNlKSB7CisJCWRvam8ucmFpc2UoIkludmFsaWQga2V5IGdpdmVuOiAiICsga2V5KTsKKwl9CisJdGhpcy5fbG9hZEtleUluZGV4KCk7CisJdmFyIGV4aXN0cyA9IGZhbHNlOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5SW5kZXgubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuX2tleUluZGV4W2ldID09IGtleSkgeworCQkJZXhpc3RzID0gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZXhpc3RzOworfSwgY2xlYXI6ZnVuY3Rpb24gKCkgeworCXRoaXMuX2xvYWRLZXlJbmRleCgpOworCXZhciBrZXlJbmRleCA9IG5ldyBBcnJheSgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5SW5kZXgubGVuZ3RoOyBpKyspIHsKKwkJa2V5SW5kZXhba2V5SW5kZXgubGVuZ3RoXSA9IG5ldyBTdHJpbmcodGhpcy5fa2V5SW5kZXhbaV0pOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGtleUluZGV4Lmxlbmd0aDsgaSsrKSB7CisJCXRoaXMucmVtb3ZlKGtleUluZGV4W2ldKTsKKwl9Cit9LCByZW1vdmU6ZnVuY3Rpb24gKGtleSkgeworCWlmICh0aGlzLmlzVmFsaWRLZXkoa2V5KSA9PSBmYWxzZSkgeworCQlkb2pvLnJhaXNlKCJJbnZhbGlkIGtleSBnaXZlbjogIiArIGtleSk7CisJfQorCXRoaXMuX2xvYWRLZXlJbmRleCgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5SW5kZXgubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuX2tleUluZGV4W2ldID09IGtleSkgeworCQkJdGhpcy5fa2V5SW5kZXguc3BsaWNlKGksIDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJdGhpcy5fc2F2ZShkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9LRVlfSU5ERVhfRklMRU5BTUUsIHRoaXMuX2tleUluZGV4LCBmYWxzZSk7CisJdmFyIGZ1bGxQYXRoID0gdGhpcy5fZ2V0UGFnZVBhdGgoKSArIGtleSArICIudHh0IjsKKwlpZiAodGhpcy5faXNBdmFpbGFibGVYUENPTSgpKSB7CisJCXRoaXMuX3JlbW92ZVhQQ09NKGZ1bGxQYXRoKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5faXNBdmFpbGFibGVBY3RpdmVYKCkpIHsKKwkJCXRoaXMuX3JlbW92ZUFjdGl2ZVgoZnVsbFBhdGgpOworCQl9CisJfQorfSwgaXNQZXJtYW5lbnQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0cnVlOworfSwgZ2V0TWF4aW11bVNpemU6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLnN0b3JhZ2UuU0laRV9OT19MSU1JVDsKK30sIGhhc1NldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCXJldHVybiBmYWxzZTsKK30sIHNob3dTZXR0aW5nc1VJOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnJhaXNlKHRoaXMuZ2V0VHlwZSgpICsgIiBkb2VzIG5vdCBzdXBwb3J0IGEgc3RvcmFnZSBzZXR0aW5ncyB1c2VyLWludGVyZmFjZSIpOworfSwgaGlkZVNldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCWRvam8ucmFpc2UodGhpcy5nZXRUeXBlKCkgKyAiIGRvZXMgbm90IHN1cHBvcnQgYSBzdG9yYWdlIHNldHRpbmdzIHVzZXItaW50ZXJmYWNlIik7Cit9LCBnZXRUeXBlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gImRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIiOworfSwgX3NhdmU6ZnVuY3Rpb24gKGtleSwgdmFsdWUsIHVwZGF0ZUtleUluZGV4KSB7CisJaWYgKHR5cGVvZiB1cGRhdGVLZXlJbmRleCA9PSAidW5kZWZpbmVkIikgeworCQl1cGRhdGVLZXlJbmRleCA9IHRydWU7CisJfQorCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodmFsdWUpID09IGZhbHNlKSB7CisJCXZhbHVlID0gZG9qby5qc29uLnNlcmlhbGl6ZSh2YWx1ZSk7CisJCXZhbHVlID0gIi8qIEphdmFTY3JpcHQgKi9cbiIgKyB2YWx1ZSArICJcblxuIjsKKwl9CisJdmFyIGZ1bGxQYXRoID0gdGhpcy5fZ2V0UGFnZVBhdGgoKSArIGtleSArICIudHh0IjsKKwlpZiAodGhpcy5faXNBdmFpbGFibGVYUENPTSgpKSB7CisJCXRoaXMuX3NhdmVGaWxlWFBDT00oZnVsbFBhdGgsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5faXNBdmFpbGFibGVBY3RpdmVYKCkpIHsKKwkJCXRoaXMuX3NhdmVGaWxlQWN0aXZlWChmdWxsUGF0aCwgdmFsdWUpOworCQl9CisJfQorCWlmICh1cGRhdGVLZXlJbmRleCkgeworCQl0aGlzLl91cGRhdGVLZXlJbmRleChrZXkpOworCX0KK30sIF9sb2FkOmZ1bmN0aW9uIChrZXkpIHsKKwl2YXIgZnVsbFBhdGggPSB0aGlzLl9nZXRQYWdlUGF0aCgpICsga2V5ICsgIi50eHQiOworCXZhciByZXN1bHRzID0gbnVsbDsKKwlpZiAodGhpcy5faXNBdmFpbGFibGVYUENPTSgpKSB7CisJCXJlc3VsdHMgPSB0aGlzLl9sb2FkRmlsZVhQQ09NKGZ1bGxQYXRoKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5faXNBdmFpbGFibGVBY3RpdmVYKCkpIHsKKwkJCXJlc3VsdHMgPSB0aGlzLl9sb2FkRmlsZUFjdGl2ZVgoZnVsbFBhdGgpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuX2lzQXZhaWxhYmxlSmF2YSgpKSB7CisJCQkJcmVzdWx0cyA9IHRoaXMuX2xvYWRGaWxlSmF2YShmdWxsUGF0aCk7CisJCQl9CisJCX0KKwl9CisJaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKCFkb2pvLmxhbmcuaXNVbmRlZmluZWQocmVzdWx0cykgJiYgcmVzdWx0cyAhPSBudWxsICYmIC9eXC9cKiBKYXZhU2NyaXB0IFwqXC8vLnRlc3QocmVzdWx0cykpIHsKKwkJcmVzdWx0cyA9IGRvam8uanNvbi5ldmFsSnNvbihyZXN1bHRzKTsKKwl9CisJcmV0dXJuIHJlc3VsdHM7Cit9LCBfdXBkYXRlS2V5SW5kZXg6ZnVuY3Rpb24gKGtleSkgeworCXRoaXMuX2xvYWRLZXlJbmRleCgpOworCXZhciBhbHJlYWR5QWRkZWQgPSBmYWxzZTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleUluZGV4Lmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLl9rZXlJbmRleFtpXSA9PSBrZXkpIHsKKwkJCWFscmVhZHlBZGRlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoYWxyZWFkeUFkZGVkID09IGZhbHNlKSB7CisJCXRoaXMuX2tleUluZGV4W3RoaXMuX2tleUluZGV4Lmxlbmd0aF0gPSBrZXk7CisJfQorCXRoaXMuX3NhdmUoZG9qby5zdG9yYWdlLmJyb3dzZXIuRmlsZVN0b3JhZ2VQcm92aWRlci5fS0VZX0lOREVYX0ZJTEVOQU1FLCB0aGlzLl9rZXlJbmRleCwgZmFsc2UpOworfSwgX2xvYWRLZXlJbmRleDpmdW5jdGlvbiAoKSB7CisJdmFyIGluZGV4Q29udGVudHMgPSB0aGlzLl9sb2FkKGRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX0tFWV9JTkRFWF9GSUxFTkFNRSk7CisJaWYgKGluZGV4Q29udGVudHMgPT0gbnVsbCkgeworCQl0aGlzLl9rZXlJbmRleCA9IG5ldyBBcnJheSgpOworCX0gZWxzZSB7CisJCXRoaXMuX2tleUluZGV4ID0gaW5kZXhDb250ZW50czsKKwl9Cit9LCBfc2F2ZUZpbGVYUENPTTpmdW5jdGlvbiAoZmlsZW5hbWUsIHZhbHVlKSB7CisJdHJ5IHsKKwkJbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoIlVuaXZlcnNhbFhQQ29ubmVjdCIpOworCQl2YXIgZiA9IENvbXBvbmVudHMuY2xhc3Nlc1siQG1vemlsbGEub3JnL2ZpbGUvbG9jYWw7MSJdLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lMb2NhbEZpbGUpOworCQlmLmluaXRXaXRoUGF0aChmaWxlbmFtZSk7CisJCXZhciBvdXB1dFN0cmVhbSA9IENvbXBvbmVudHMuY2xhc3Nlc1siQG1vemlsbGEub3JnL25ldHdvcmsvZmlsZS1vdXRwdXQtc3RyZWFtOzEiXS5jcmVhdGVJbnN0YW5jZShDb21wb25lbnRzLmludGVyZmFjZXMubnNJRmlsZU91dHB1dFN0cmVhbSk7CisJCW91cHV0U3RyZWFtLmluaXQoZiwgMzIgfCA0IHwgOCwgMjU2ICsgMTI4LCBudWxsKTsKKwkJb3VwdXRTdHJlYW0ud3JpdGUodmFsdWUsIHZhbHVlLmxlbmd0aCk7CisJCW91cHV0U3RyZWFtLmNsb3NlKCk7CisJfQorCWNhdGNoIChlKSB7CisJCXZhciBtc2cgPSBlLnRvU3RyaW5nKCk7CisJCWlmIChlLm5hbWUgJiYgZS5tZXNzYWdlKSB7CisJCQltc2cgPSBlLm5hbWUgKyAiOiAiICsgZS5tZXNzYWdlOworCQl9CisJCWRvam8ucmFpc2UoImRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX3NhdmVGaWxlWFBDT00oKTogIiArIG1zZyk7CisJfQorfSwgX2xvYWRGaWxlWFBDT006ZnVuY3Rpb24gKGZpbGVuYW1lKSB7CisJdHJ5IHsKKwkJbmV0c2NhcGUuc2VjdXJpdHkuUHJpdmlsZWdlTWFuYWdlci5lbmFibGVQcml2aWxlZ2UoIlVuaXZlcnNhbFhQQ29ubmVjdCIpOworCQl2YXIgZiA9IENvbXBvbmVudHMuY2xhc3Nlc1siQG1vemlsbGEub3JnL2ZpbGUvbG9jYWw7MSJdLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lMb2NhbEZpbGUpOworCQlmLmluaXRXaXRoUGF0aChmaWxlbmFtZSk7CisJCWlmIChmLmV4aXN0cygpID09IGZhbHNlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQl2YXIgaW5wID0gQ29tcG9uZW50cy5jbGFzc2VzWyJAbW96aWxsYS5vcmcvbmV0d29yay9maWxlLWlucHV0LXN0cmVhbTsxIl0uY3JlYXRlSW5zdGFuY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUZpbGVJbnB1dFN0cmVhbSk7CisJCWlucC5pbml0KGYsIDEsIDQsIG51bGwpOworCQl2YXIgaW5wdXRTdHJlYW0gPSBDb21wb25lbnRzLmNsYXNzZXNbIkBtb3ppbGxhLm9yZy9zY3JpcHRhYmxlaW5wdXRzdHJlYW07MSJdLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lTY3JpcHRhYmxlSW5wdXRTdHJlYW0pOworCQlpbnB1dFN0cmVhbS5pbml0KGlucCk7CisJCXZhciByZXN1bHRzID0gaW5wdXRTdHJlYW0ucmVhZChpbnB1dFN0cmVhbS5hdmFpbGFibGUoKSk7CisJCXJldHVybiByZXN1bHRzOworCX0KKwljYXRjaCAoZSkgeworCQl2YXIgbXNnID0gZS50b1N0cmluZygpOworCQlpZiAoZS5uYW1lICYmIGUubWVzc2FnZSkgeworCQkJbXNnID0gZS5uYW1lICsgIjogIiArIGUubWVzc2FnZTsKKwkJfQorCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9sb2FkRmlsZVhQQ09NKCk6ICIgKyBtc2cpOworCX0KKwlyZXR1cm4gbnVsbDsKK30sIF9zYXZlRmlsZUFjdGl2ZVg6ZnVuY3Rpb24gKGZpbGVuYW1lLCB2YWx1ZSkgeworCXRyeSB7CisJCXZhciBmaWxlU3lzdGVtID0gbmV3IEFjdGl2ZVhPYmplY3QoIlNjcmlwdGluZy5GaWxlU3lzdGVtT2JqZWN0Iik7CisJCXZhciBmID0gZmlsZVN5c3RlbS5PcGVuVGV4dEZpbGUoZmlsZW5hbWUsIDIsIHRydWUpOworCQlmLldyaXRlKHZhbHVlKTsKKwkJZi5DbG9zZSgpOworCX0KKwljYXRjaCAoZSkgeworCQl2YXIgbXNnID0gZS50b1N0cmluZygpOworCQlpZiAoZS5uYW1lICYmIGUubWVzc2FnZSkgeworCQkJbXNnID0gZS5uYW1lICsgIjogIiArIGUubWVzc2FnZTsKKwkJfQorCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9zYXZlRmlsZUFjdGl2ZVgoKTogIiArIG1zZyk7CisJfQorfSwgX2xvYWRGaWxlQWN0aXZlWDpmdW5jdGlvbiAoZmlsZW5hbWUpIHsKKwl0cnkgeworCQl2YXIgZmlsZVN5c3RlbSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCIpOworCQlpZiAoZmlsZVN5c3RlbS5GaWxlRXhpc3RzKGZpbGVuYW1lKSA9PSBmYWxzZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdmFyIGYgPSBmaWxlU3lzdGVtLk9wZW5UZXh0RmlsZShmaWxlbmFtZSwgMSk7CisJCXZhciByZXN1bHRzID0gZi5SZWFkQWxsKCk7CisJCWYuQ2xvc2UoKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCWNhdGNoIChlKSB7CisJCXZhciBtc2cgPSBlLnRvU3RyaW5nKCk7CisJCWlmIChlLm5hbWUgJiYgZS5tZXNzYWdlKSB7CisJCQltc2cgPSBlLm5hbWUgKyAiOiAiICsgZS5tZXNzYWdlOworCQl9CisJCWRvam8ucmFpc2UoImRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX2xvYWRGaWxlQWN0aXZlWCgpOiAiICsgbXNnKTsKKwl9Cit9LCBfc2F2ZUZpbGVKYXZhOmZ1bmN0aW9uIChmaWxlbmFtZSwgdmFsdWUpIHsKKwl0cnkgeworCQl2YXIgYXBwbGV0ID0gZG9qby5ieUlkKGRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX0FQUExFVF9JRCk7CisJCWFwcGxldC5zYXZlKGZpbGVuYW1lLCB2YWx1ZSk7CisJfQorCWNhdGNoIChlKSB7CisJCXZhciBtc2cgPSBlLnRvU3RyaW5nKCk7CisJCWlmIChlLm5hbWUgJiYgZS5tZXNzYWdlKSB7CisJCQltc2cgPSBlLm5hbWUgKyAiOiAiICsgZS5tZXNzYWdlOworCQl9CisJCWRvam8ucmFpc2UoImRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX3NhdmVGaWxlSmF2YSgpOiAiICsgbXNnKTsKKwl9Cit9LCBfbG9hZEZpbGVKYXZhOmZ1bmN0aW9uIChmaWxlbmFtZSkgeworCXRyeSB7CisJCXZhciBhcHBsZXQgPSBkb2pvLmJ5SWQoZG9qby5zdG9yYWdlLmJyb3dzZXIuRmlsZVN0b3JhZ2VQcm92aWRlci5fQVBQTEVUX0lEKTsKKwkJdmFyIHJlc3VsdHMgPSBhcHBsZXQubG9hZChmaWxlbmFtZSk7CisJCXJldHVybiByZXN1bHRzOworCX0KKwljYXRjaCAoZSkgeworCQl2YXIgbXNnID0gZS50b1N0cmluZygpOworCQlpZiAoZS5uYW1lICYmIGUubWVzc2FnZSkgeworCQkJbXNnID0gZS5uYW1lICsgIjogIiArIGUubWVzc2FnZTsKKwkJfQorCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9sb2FkRmlsZUphdmEoKTogIiArIG1zZyk7CisJfQorfSwgX2lzQXZhaWxhYmxlQWN0aXZlWDpmdW5jdGlvbiAoKSB7CisJdHJ5IHsKKwkJaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CisJCQl2YXIgZmlsZVN5c3RlbSA9IG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QiKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoZSk7CisJfQorCXJldHVybiBmYWxzZTsKK30sIF9pc0F2YWlsYWJsZVhQQ09NOmZ1bmN0aW9uICgpIHsKKwl0cnkgeworCQlpZiAod2luZG93LkNvbXBvbmVudHMpIHsKKwkJCW5ldHNjYXBlLnNlY3VyaXR5LlByaXZpbGVnZU1hbmFnZXIuZW5hYmxlUHJpdmlsZWdlKCJVbml2ZXJzYWxYUENvbm5lY3QiKTsKKwkJCUNvbXBvbmVudHMuY2xhc3Nlc1siQG1vemlsbGEub3JnL2ZpbGUvbG9jYWw7MSJdLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lMb2NhbEZpbGUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwkJZG9qby5kZWJ1ZyhlKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgX2lzQXZhaWxhYmxlSmF2YTpmdW5jdGlvbiAoKSB7CisJdHJ5IHsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpID09IHRydWUgfHwgZG9qby5yZW5kZXIuaHRtbC5vcGVyYSA9PSB0cnVlKCkpIHsKKwkJCWlmIChuYXZpZ2F0b3IuamF2YUVuYWJsZWQoKSA9PSB0cnVlKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwkJZG9qby5kZWJ1ZyhlKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgX2dldFBhZ2VQYXRoOmZ1bmN0aW9uICgpIHsKKwl2YXIgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKKwlpZiAoL1wuaHRtbD8kL2kudGVzdChwYXRoKSkgeworCQlwYXRoID0gcGF0aC5yZXBsYWNlKC8oPzpcL3xcXCk/W15cLlwvXFxdKlwuaHRtbD8kLywgIiIpOworCX0KKwlpZiAoL15cLz9bYS16XStcOi9pLnRlc3QocGF0aCkpIHsKKwkJcGF0aCA9IHBhdGgucmVwbGFjZSgvXlwvPy8sICIiKTsKKwkJcGF0aCA9IHBhdGgucmVwbGFjZSgvXC8vZywgIlxcIik7CisJfSBlbHNlIHsKKwkJaWYgKC9eW1wvXFxdezIsM31bXlwvXS8udGVzdChwYXRoKSkgeworCQkJcGF0aCA9IHBhdGgucmVwbGFjZSgvXltcL1xcXXsyLDN9LywgIiIpOworCQkJcGF0aCA9IHBhdGgucmVwbGFjZSgvXC8vZywgIlxcIik7CisJCQlwYXRoID0gIlxcXFwiICsgcGF0aDsKKwkJfQorCX0KKwlpZiAoL1wvJC8udGVzdChwYXRoKSA9PSBmYWxzZSAmJiAvXFwkLy50ZXN0KHBhdGgpID09IGZhbHNlKSB7CisJCWlmICgvXC8vLnRlc3QocGF0aCkpIHsKKwkJCXBhdGggKz0gIi8iOworCQl9IGVsc2UgeworCQkJcGF0aCArPSAiXFwiOworCQl9CisJfQorCXBhdGggPSB1bmVzY2FwZShwYXRoKTsKKwlyZXR1cm4gcGF0aDsKK30sIF9yZW1vdmVYUENPTTpmdW5jdGlvbiAoZmlsZW5hbWUpIHsKKwl0cnkgeworCQluZXRzY2FwZS5zZWN1cml0eS5Qcml2aWxlZ2VNYW5hZ2VyLmVuYWJsZVByaXZpbGVnZSgiVW5pdmVyc2FsWFBDb25uZWN0Iik7CisJCXZhciBmID0gQ29tcG9uZW50cy5jbGFzc2VzWyJAbW96aWxsYS5vcmcvZmlsZS9sb2NhbDsxIl0uY3JlYXRlSW5zdGFuY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUxvY2FsRmlsZSk7CisJCWYuaW5pdFdpdGhQYXRoKGZpbGVuYW1lKTsKKwkJaWYgKGYuZXhpc3RzKCkgPT0gZmFsc2UgfHwgZi5pc0RpcmVjdG9yeSgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGYuaXNGaWxlKCkpIHsKKwkJCWYucmVtb3ZlKGZhbHNlKTsKKwkJfQorCX0KKwljYXRjaCAoZSkgeworCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLnJlbW92ZSgpOiAiICsgZS50b1N0cmluZygpKTsKKwl9Cit9LCBfcmVtb3ZlQWN0aXZlWDpmdW5jdGlvbiAoZmlsZW5hbWUpIHsKKwl0cnkgeworCQl2YXIgZmlsZVN5c3RlbSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCIpOworCQlmaWxlU3lzdGVtLkRlbGV0ZUZpbGUoZmlsZW5hbWUpOworCX0KKwljYXRjaCAoZSkgeworCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLnJlbW92ZSgpOiAiICsgZS50b1N0cmluZygpKTsKKwl9Cit9LCBfcmVtb3ZlSmF2YTpmdW5jdGlvbiAoZmlsZW5hbWUpIHsKKwl0cnkgeworCQl2YXIgYXBwbGV0ID0gZG9qby5ieUlkKGRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX0FQUExFVF9JRCk7CisJCWFwcGxldC5yZW1vdmUoZmlsZW5hbWUpOworCX0KKwljYXRjaCAoZSkgeworCQl2YXIgbXNnID0gZS50b1N0cmluZygpOworCQlpZiAoZS5uYW1lICYmIGUubWVzc2FnZSkgeworCQkJbXNnID0gZS5uYW1lICsgIjogIiArIGUubWVzc2FnZTsKKwkJfQorCQlkb2pvLnJhaXNlKCJkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyLl9yZW1vdmVKYXZhKCk6ICIgKyBtc2cpOworCX0KK30sIF93cml0ZUFwcGxldDpmdW5jdGlvbiAoKSB7CisJdmFyIGFyY2hpdmUgPSBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8iLCAiLi4vRG9qb0ZpbGVTdG9yYWdlUHJvdmlkZXIuamFyIikudG9TdHJpbmcoKTsKKwl2YXIgdGFnID0gIjxhcHBsZXQgIiArICJpZD0nIiArIGRvam8uc3RvcmFnZS5icm93c2VyLkZpbGVTdG9yYWdlUHJvdmlkZXIuX0FQUExFVF9JRCArICInICIgKyAic3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtNTAwcHg7IGxlZnQ6IC01MDBweDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7JyAiICsgImNvZGU9J0Rvam9GaWxlU3RvcmFnZVByb3ZpZGVyLmNsYXNzJyAiICsgImFyY2hpdmU9JyIgKyBhcmNoaXZlICsgIicgIiArICJ3aWR0aD0nMScgIiArICJoZWlnaHQ9JzEnICIgKyAiPiIgKyAiPC9hcHBsZXQ+IjsKKwlkb2N1bWVudC53cml0ZWxuKHRhZyk7Cit9fSk7Citkb2pvLnN0b3JhZ2UuYnJvd3Nlci5XaGF0V0dTdG9yYWdlUHJvdmlkZXIgPSBmdW5jdGlvbiAoKSB7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLnN0b3JhZ2UuYnJvd3Nlci5XaGF0V0dTdG9yYWdlUHJvdmlkZXIsIGRvam8uc3RvcmFnZSk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uc3RvcmFnZS5icm93c2VyLldoYXRXR1N0b3JhZ2VQcm92aWRlciwge25hbWVzcGFjZToiZGVmYXVsdCIsIGluaXRpYWxpemVkOmZhbHNlLCBfZG9tYWluOm51bGwsIF9hdmFpbGFibGU6bnVsbCwgX3N0YXR1c0hhbmRsZXI6bnVsbCwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoKSB7CisJaWYgKGRqQ29uZmlnWyJkaXNhYmxlV2hhdFdHU3RvcmFnZSJdID09IHRydWUpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9kb21haW4gPSBsb2NhdGlvbi5ob3N0bmFtZTsKKwl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKwlkb2pvLnN0b3JhZ2UubWFuYWdlci5sb2FkZWQoKTsKK30sIGlzQXZhaWxhYmxlOmZ1bmN0aW9uICgpIHsKKwl0cnkgeworCQl2YXIgbXlTdG9yYWdlID0gZ2xvYmFsU3RvcmFnZVtsb2NhdGlvbi5ob3N0bmFtZV07CisJfQorCWNhdGNoIChlKSB7CisJCXRoaXMuX2F2YWlsYWJsZSA9IGZhbHNlOworCQlyZXR1cm4gdGhpcy5fYXZhaWxhYmxlOworCX0KKwl0aGlzLl9hdmFpbGFibGUgPSB0cnVlOworCXJldHVybiB0aGlzLl9hdmFpbGFibGU7Cit9LCBwdXQ6ZnVuY3Rpb24gKGtleSwgdmFsdWUsIHJlc3VsdHNIYW5kbGVyKSB7CisJaWYgKHRoaXMuaXNWYWxpZEtleShrZXkpID09IGZhbHNlKSB7CisJCWRvam8ucmFpc2UoIkludmFsaWQga2V5IGdpdmVuOiAiICsga2V5KTsKKwl9CisJdGhpcy5fc3RhdHVzSGFuZGxlciA9IHJlc3VsdHNIYW5kbGVyOworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodmFsdWUpKSB7CisJCXZhbHVlID0gInN0cmluZzoiICsgdmFsdWU7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBkb2pvLmpzb24uc2VyaWFsaXplKHZhbHVlKTsKKwl9CisJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCBmdW5jdGlvbiAoZXZ0KSB7CisJCXJlc3VsdHNIYW5kbGVyLmNhbGwobnVsbCwgZG9qby5zdG9yYWdlLlNVQ0NFU1MsIGtleSk7CisJfSwgZmFsc2UpOworCXRyeSB7CisJCXZhciBteVN0b3JhZ2UgPSBnbG9iYWxTdG9yYWdlW3RoaXMuX2RvbWFpbl07CisJCW15U3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOworCX0KKwljYXRjaCAoZSkgeworCQl0aGlzLl9zdGF0dXNIYW5kbGVyLmNhbGwobnVsbCwgZG9qby5zdG9yYWdlLkZBSUxFRCwga2V5LCBlLnRvU3RyaW5nKCkpOworCX0KK30sIGdldDpmdW5jdGlvbiAoa2V5KSB7CisJaWYgKHRoaXMuaXNWYWxpZEtleShrZXkpID09IGZhbHNlKSB7CisJCWRvam8ucmFpc2UoIkludmFsaWQga2V5IGdpdmVuOiAiICsga2V5KTsKKwl9CisJdmFyIG15U3RvcmFnZSA9IGdsb2JhbFN0b3JhZ2VbdGhpcy5fZG9tYWluXTsKKwl2YXIgcmVzdWx0cyA9IG15U3RvcmFnZS5nZXRJdGVtKGtleSk7CisJaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmVzdWx0cyA9IHJlc3VsdHMudmFsdWU7CisJaWYgKCFkb2pvLmxhbmcuaXNVbmRlZmluZWQocmVzdWx0cykgJiYgcmVzdWx0cyAhPSBudWxsICYmIC9ec3RyaW5nOi8udGVzdChyZXN1bHRzKSkgeworCQlyZXN1bHRzID0gcmVzdWx0cy5zdWJzdHJpbmcoInN0cmluZzoiLmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0cyA9IGRvam8uanNvbi5ldmFsSnNvbihyZXN1bHRzKTsKKwl9CisJcmV0dXJuIHJlc3VsdHM7Cit9LCBnZXRLZXlzOmZ1bmN0aW9uICgpIHsKKwl2YXIgbXlTdG9yYWdlID0gZ2xvYmFsU3RvcmFnZVt0aGlzLl9kb21haW5dOworCXZhciBrZXlzQXJyYXkgPSBuZXcgQXJyYXkoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXlTdG9yYWdlLmxlbmd0aDsgaSsrKSB7CisJCWtleXNBcnJheVtpXSA9IG15U3RvcmFnZS5rZXkoaSk7CisJfQorCXJldHVybiBrZXlzQXJyYXk7Cit9LCBjbGVhcjpmdW5jdGlvbiAoKSB7CisJdmFyIG15U3RvcmFnZSA9IGdsb2JhbFN0b3JhZ2VbdGhpcy5fZG9tYWluXTsKKwl2YXIga2V5cyA9IG5ldyBBcnJheSgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbXlTdG9yYWdlLmxlbmd0aDsgaSsrKSB7CisJCWtleXNba2V5cy5sZW5ndGhdID0gbXlTdG9yYWdlLmtleShpKTsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisJCW15U3RvcmFnZS5yZW1vdmVJdGVtKGtleXNbaV0pOworCX0KK30sIHJlbW92ZTpmdW5jdGlvbiAoa2V5KSB7CisJdmFyIG15U3RvcmFnZSA9IGdsb2JhbFN0b3JhZ2VbdGhpcy5fZG9tYWluXTsKKwlteVN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOworfSwgaXNQZXJtYW5lbnQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0cnVlOworfSwgZ2V0TWF4aW11bVNpemU6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLnN0b3JhZ2UuU0laRV9OT19MSU1JVDsKK30sIGhhc1NldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCXJldHVybiBmYWxzZTsKK30sIHNob3dTZXR0aW5nc1VJOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnJhaXNlKHRoaXMuZ2V0VHlwZSgpICsgIiBkb2VzIG5vdCBzdXBwb3J0IGEgc3RvcmFnZSBzZXR0aW5ncyB1c2VyLWludGVyZmFjZSIpOworfSwgaGlkZVNldHRpbmdzVUk6ZnVuY3Rpb24gKCkgeworCWRvam8ucmFpc2UodGhpcy5nZXRUeXBlKCkgKyAiIGRvZXMgbm90IHN1cHBvcnQgYSBzdG9yYWdlIHNldHRpbmdzIHVzZXItaW50ZXJmYWNlIik7Cit9LCBnZXRUeXBlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gImRvam8uc3RvcmFnZS5icm93c2VyLldoYXRXR1Byb3ZpZGVyIjsKK319KTsKK2Rvam8uc3RvcmFnZS5icm93c2VyLkZsYXNoU3RvcmFnZVByb3ZpZGVyID0gZnVuY3Rpb24gKCkgeworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5zdG9yYWdlLmJyb3dzZXIuRmxhc2hTdG9yYWdlUHJvdmlkZXIsIGRvam8uc3RvcmFnZSk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uc3RvcmFnZS5icm93c2VyLkZsYXNoU3RvcmFnZVByb3ZpZGVyLCB7bmFtZXNwYWNlOiJkZWZhdWx0IiwgaW5pdGlhbGl6ZWQ6ZmFsc2UsIF9hdmFpbGFibGU6bnVsbCwgX3N0YXR1c0hhbmRsZXI6bnVsbCwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoKSB7CisJaWYgKGRqQ29uZmlnWyJkaXNhYmxlRmxhc2hTdG9yYWdlIl0gPT0gdHJ1ZSkgeworCQlyZXR1cm47CisJfQorCXZhciBsb2FkZWRMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHsKKwkJZG9qby5zdG9yYWdlLl9mbGFzaExvYWRlZCgpOworCX07CisJZG9qby5mbGFzaC5hZGRMb2FkZWRMaXN0ZW5lcihsb2FkZWRMaXN0ZW5lcik7CisJdmFyIHN3ZmxvYzYgPSBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8iLCAiLi4vU3RvcmFnZV92ZXJzaW9uNi5zd2YiKS50b1N0cmluZygpOworCXZhciBzd2Zsb2M4ID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvIiwgIi4uL1N0b3JhZ2VfdmVyc2lvbjguc3dmIikudG9TdHJpbmcoKTsKKwlkb2pvLmZsYXNoLnNldFN3Zih7Zmxhc2g2OnN3ZmxvYzYsIGZsYXNoODpzd2Zsb2M4LCB2aXNpYmxlOmZhbHNlfSk7Cit9LCBpc0F2YWlsYWJsZTpmdW5jdGlvbiAoKSB7CisJaWYgKGRqQ29uZmlnWyJkaXNhYmxlRmxhc2hTdG9yYWdlIl0gPT0gdHJ1ZSkgeworCQl0aGlzLl9hdmFpbGFibGUgPSBmYWxzZTsKKwl9IGVsc2UgeworCQl0aGlzLl9hdmFpbGFibGUgPSB0cnVlOworCX0KKwlyZXR1cm4gdGhpcy5fYXZhaWxhYmxlOworfSwgcHV0OmZ1bmN0aW9uIChrZXksIHZhbHVlLCByZXN1bHRzSGFuZGxlcikgeworCWlmICh0aGlzLmlzVmFsaWRLZXkoa2V5KSA9PSBmYWxzZSkgeworCQlkb2pvLnJhaXNlKCJJbnZhbGlkIGtleSBnaXZlbjogIiArIGtleSk7CisJfQorCXRoaXMuX3N0YXR1c0hhbmRsZXIgPSByZXN1bHRzSGFuZGxlcjsKKwlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKHZhbHVlKSkgeworCQl2YWx1ZSA9ICJzdHJpbmc6IiArIHZhbHVlOworCX0gZWxzZSB7CisJCXZhbHVlID0gZG9qby5qc29uLnNlcmlhbGl6ZSh2YWx1ZSk7CisJfQorCWRvam8uZmxhc2guY29tbS5wdXQoa2V5LCB2YWx1ZSwgdGhpcy5uYW1lc3BhY2UpOworfSwgZ2V0OmZ1bmN0aW9uIChrZXkpIHsKKwlpZiAodGhpcy5pc1ZhbGlkS2V5KGtleSkgPT0gZmFsc2UpIHsKKwkJZG9qby5yYWlzZSgiSW52YWxpZCBrZXkgZ2l2ZW46ICIgKyBrZXkpOworCX0KKwl2YXIgcmVzdWx0cyA9IGRvam8uZmxhc2guY29tbS5nZXQoa2V5LCB0aGlzLm5hbWVzcGFjZSk7CisJaWYgKHJlc3VsdHMgPT0gIiIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmICghZG9qby5sYW5nLmlzVW5kZWZpbmVkKHJlc3VsdHMpICYmIHJlc3VsdHMgIT0gbnVsbCAmJiAvXnN0cmluZzovLnRlc3QocmVzdWx0cykpIHsKKwkJcmVzdWx0cyA9IHJlc3VsdHMuc3Vic3RyaW5nKCJzdHJpbmc6Ii5sZW5ndGgpOworCX0gZWxzZSB7CisJCXJlc3VsdHMgPSBkb2pvLmpzb24uZXZhbEpzb24ocmVzdWx0cyk7CisJfQorCXJldHVybiByZXN1bHRzOworfSwgZ2V0S2V5czpmdW5jdGlvbiAoKSB7CisJdmFyIHJlc3VsdHMgPSBkb2pvLmZsYXNoLmNvbW0uZ2V0S2V5cyh0aGlzLm5hbWVzcGFjZSk7CisJaWYgKHJlc3VsdHMgPT0gIiIpIHsKKwkJcmV0dXJuIFtdOworCX0KKwlyZXR1cm4gcmVzdWx0cy5zcGxpdCgiLCIpOworfSwgY2xlYXI6ZnVuY3Rpb24gKCkgeworCWRvam8uZmxhc2guY29tbS5jbGVhcih0aGlzLm5hbWVzcGFjZSk7Cit9LCByZW1vdmU6ZnVuY3Rpb24gKGtleSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby5zdG9yYWdlLmJyb3dzZXIuRmxhc2hTdG9yYWdlUHJvdmlkZXIucmVtb3ZlIik7Cit9LCBpc1Blcm1hbmVudDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRydWU7Cit9LCBnZXRNYXhpbXVtU2l6ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8uc3RvcmFnZS5TSVpFX05PX0xJTUlUOworfSwgaGFzU2V0dGluZ3NVSTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRydWU7Cit9LCBzaG93U2V0dGluZ3NVSTpmdW5jdGlvbiAoKSB7CisJZG9qby5mbGFzaC5jb21tLnNob3dTZXR0aW5ncygpOworCWRvam8uZmxhc2gub2JqLnNldFZpc2libGUodHJ1ZSk7CisJZG9qby5mbGFzaC5vYmouY2VudGVyKCk7Cit9LCBoaWRlU2V0dGluZ3NVSTpmdW5jdGlvbiAoKSB7CisJZG9qby5mbGFzaC5vYmouc2V0VmlzaWJsZShmYWxzZSk7CisJaWYgKGRvam8uc3RvcmFnZS5vbkhpZGVTZXR0aW5nc1VJICE9IG51bGwgJiYgIWRvam8ubGFuZy5pc1VuZGVmaW5lZChkb2pvLnN0b3JhZ2Uub25IaWRlU2V0dGluZ3NVSSkpIHsKKwkJZG9qby5zdG9yYWdlLm9uSGlkZVNldHRpbmdzVUkuY2FsbChudWxsKTsKKwl9Cit9LCBnZXRUeXBlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gImRvam8uc3RvcmFnZS5icm93c2VyLkZsYXNoU3RvcmFnZVByb3ZpZGVyIjsKK30sIF9mbGFzaExvYWRlZDpmdW5jdGlvbiAoKSB7CisJdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOworCWRvam8uc3RvcmFnZS5tYW5hZ2VyLmxvYWRlZCgpOworfSwgX29uU3RhdHVzOmZ1bmN0aW9uIChzdGF0dXNSZXN1bHQsIGtleSkgeworCXZhciBkcyA9IGRvam8uc3RvcmFnZTsKKwl2YXIgZGZvID0gZG9qby5mbGFzaC5vYmo7CisJaWYgKHN0YXR1c1Jlc3VsdCA9PSBkcy5QRU5ESU5HKSB7CisJCWRmby5jZW50ZXIoKTsKKwkJZGZvLnNldFZpc2libGUodHJ1ZSk7CisJfSBlbHNlIHsKKwkJZGZvLnNldFZpc2libGUoZmFsc2UpOworCX0KKwlpZiAoKCFkal91bmRlZigiX3N0YXR1c0hhbmRsZXIiLCBkcykpICYmIChkcy5fc3RhdHVzSGFuZGxlciAhPSBudWxsKSkgeworCQlkcy5fc3RhdHVzSGFuZGxlci5jYWxsKG51bGwsIHN0YXR1c1Jlc3VsdCwga2V5KTsKKwl9Cit9fSk7Citkb2pvLnN0b3JhZ2UubWFuYWdlci5yZWdpc3RlcigiZG9qby5zdG9yYWdlLmJyb3dzZXIuRmlsZVN0b3JhZ2VQcm92aWRlciIsIG5ldyBkb2pvLnN0b3JhZ2UuYnJvd3Nlci5GaWxlU3RvcmFnZVByb3ZpZGVyKCkpOworZG9qby5zdG9yYWdlLm1hbmFnZXIucmVnaXN0ZXIoImRvam8uc3RvcmFnZS5icm93c2VyLldoYXRXR1N0b3JhZ2VQcm92aWRlciIsIG5ldyBkb2pvLnN0b3JhZ2UuYnJvd3Nlci5XaGF0V0dTdG9yYWdlUHJvdmlkZXIoKSk7Citkb2pvLnN0b3JhZ2UubWFuYWdlci5yZWdpc3RlcigiZG9qby5zdG9yYWdlLmJyb3dzZXIuRmxhc2hTdG9yYWdlUHJvdmlkZXIiLCBuZXcgZG9qby5zdG9yYWdlLmJyb3dzZXIuRmxhc2hTdG9yYWdlUHJvdmlkZXIoKSk7Citkb2pvLnN0b3JhZ2UubWFuYWdlci5pbml0aWFsaXplKCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL2Rhc2hib2FyZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL2Rhc2hib2FyZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWVhYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0b3JhZ2UvZGFzaGJvYXJkLmpzCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucmVxdWlyZSgiZG9qby5zdG9yYWdlIik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5wcm92aWRlKCJkb2pvLnN0b3JhZ2UuZGFzaGJvYXJkIik7CisKK2Rvam8uc3RvcmFnZS5kYXNoYm9hcmQuU3RvcmFnZVByb3ZpZGVyID0gZnVuY3Rpb24oKXsKKwl0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7Cit9CisKK2Rvam8uaW5oZXJpdHMoZG9qby5zdG9yYWdlLmRhc2hib2FyZC5TdG9yYWdlUHJvdmlkZXIsIGRvam8uc3RvcmFnZS5TdG9yYWdlUHJvdmlkZXIpOworCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uc3RvcmFnZS5kYXNoYm9hcmQuU3RvcmFnZVByb3ZpZGVyLCB7CisJc3RvcmFnZU9uTG9hZDogZnVuY3Rpb24oKXsKKwkJdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisJfSwKKworCXNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSwgbnMpeworCQlpZiAobnMgJiYgd2lkZ2V0LnN5c3RlbSl7CisJCQl3aWRnZXQuc3lzdGVtKCIvYmluL21rZGlyICIgKyBucyk7CisJCQl2YXIgc3lzdGVtID0gd2lkZ2V0LnN5c3RlbSgiL2Jpbi9lY2hvICIgKyB2YWx1ZSArICIgPiIgKyBucyArICIvIiArIGtleSk7CisJCQlpZihzeXN0ZW0uZXJyb3JTdHJpbmcpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIHdpZGdldC5zZXRQcmVmZXJlbmNlRm9yS2V5KGRvam8uanNvbi5zZXJpYWxpemUodmFsdWUpLCBrZXkpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKGtleSwgbnMpeworCQlpZiAobnMgJiYgd2lkZ2V0LnN5c3RlbSkgeworCQkJdmFyIHN5c3RlbSA9IHdpZGdldC5zeXN0ZW0oIi9iaW4vY2F0ICIgKyBucyArICIvIiArIGtleSk7CisJCQlpZihzeXN0ZW0uZXJyb3JTdHJpbmcpeworCQkJCXJldHVybiAiIjsKKwkJCX0KKwkJCXJldHVybiBzeXN0ZW0ub3V0cHV0U3RyaW5nOworCQl9CisKKwkJcmV0dXJuIGRvam8uanNvbi5ldmFsSnNvbih3aWRnZXQucHJlZmVyZW5jZUZvcktleShrZXkpKTsKKwl9Cit9KTsKKworZG9qby5zdG9yYWdlLnNldFByb3ZpZGVyKG5ldyBkb2pvLnN0b3JhZ2UuZGFzaGJvYXJkLlN0b3JhZ2VQcm92aWRlcigpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL3N0b3JhZ2VfZGlhbG9nLmZsYSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdG9yYWdlL3N0b3JhZ2VfZGlhbG9nLmZsYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjczYzEwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0b3JhZ2Uvc3RvcmFnZV9kaWFsb2cuZmxhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHJpbmcuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjk1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nLmNvbW1vbiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nL0J1aWxkZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nL0J1aWxkZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhOWU5OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHJpbmcvQnVpbGRlci5qcwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5zdHJpbmcuQnVpbGRlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnN0cmluZy5CdWlsZGVyID0gZnVuY3Rpb24gKHN0cikgeworCXRoaXMuYXJyQ29uY2F0ID0gKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSAmJiBkb2pvLnJlbmRlci5odG1sWyJpZSJdKTsKKwl2YXIgYSA9IFtdOworCXZhciBiID0gIiI7CisJdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7CisJaWYgKHRoaXMuYXJyQ29uY2F0KSB7CisJCWlmIChiLmxlbmd0aCA+IDApIHsKKwkJCWEucHVzaChiKTsKKwkJfQorCQliID0gIiI7CisJfQorCXRoaXMudG9TdHJpbmcgPSB0aGlzLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiAodGhpcy5hcnJDb25jYXQpID8gYS5qb2luKCIiKSA6IGI7CisJfTsKKwl0aGlzLmFwcGVuZCA9IGZ1bmN0aW9uICgpIHsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCBhcmd1bWVudHMubGVuZ3RoOyB4KyspIHsKKwkJCXZhciBzID0gYXJndW1lbnRzW3hdOworCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5TGlrZShzKSkgeworCQkJCXRoaXMuYXBwZW5kLmFwcGx5KHRoaXMsIHMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5hcnJDb25jYXQpIHsKKwkJCQkJYS5wdXNoKHMpOworCQkJCX0gZWxzZSB7CisJCQkJCWIgKz0gczsKKwkJCQl9CisJCQkJbGVuZ3RoICs9IHMubGVuZ3RoOworCQkJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzOworCX07CisJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHsKKwkJYSA9IFtdOworCQliID0gIiI7CisJCWxlbmd0aCA9IHRoaXMubGVuZ3RoID0gMDsKKwkJcmV0dXJuIHRoaXM7CisJfTsKKwl0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uIChmLCBsKSB7CisJCXZhciBzID0gIiI7CisJCWlmICh0aGlzLmFyckNvbmNhdCkgeworCQkJYiA9IGEuam9pbigiIik7CisJCX0KKwkJYSA9IFtdOworCQlpZiAoZiA+IDApIHsKKwkJCXMgPSBiLnN1YnN0cmluZygwLCAoZiAtIDEpKTsKKwkJfQorCQliID0gcyArIGIuc3Vic3RyaW5nKGYgKyBsKTsKKwkJbGVuZ3RoID0gdGhpcy5sZW5ndGggPSBiLmxlbmd0aDsKKwkJaWYgKHRoaXMuYXJyQ29uY2F0KSB7CisJCQlhLnB1c2goYik7CisJCQliID0gIiI7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfTsKKwl0aGlzLnJlcGxhY2UgPSBmdW5jdGlvbiAobywgbikgeworCQlpZiAodGhpcy5hcnJDb25jYXQpIHsKKwkJCWIgPSBhLmpvaW4oIiIpOworCQl9CisJCWEgPSBbXTsKKwkJYiA9IGIucmVwbGFjZShvLCBuKTsKKwkJbGVuZ3RoID0gdGhpcy5sZW5ndGggPSBiLmxlbmd0aDsKKwkJaWYgKHRoaXMuYXJyQ29uY2F0KSB7CisJCQlhLnB1c2goYik7CisJCQliID0gIiI7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfTsKKwl0aGlzLmluc2VydCA9IGZ1bmN0aW9uIChpZHgsIHMpIHsKKwkJaWYgKHRoaXMuYXJyQ29uY2F0KSB7CisJCQliID0gYS5qb2luKCIiKTsKKwkJfQorCQlhID0gW107CisJCWlmIChpZHggPT0gMCkgeworCQkJYiA9IHMgKyBiOworCQl9IGVsc2UgeworCQkJdmFyIHQgPSBiLnNwbGl0KCIiKTsKKwkJCXQuc3BsaWNlKGlkeCwgMCwgcyk7CisJCQliID0gdC5qb2luKCIiKTsKKwkJfQorCQlsZW5ndGggPSB0aGlzLmxlbmd0aCA9IGIubGVuZ3RoOworCQlpZiAodGhpcy5hcnJDb25jYXQpIHsKKwkJCWEucHVzaChiKTsKKwkJCWIgPSAiIjsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9OworCXRoaXMuYXBwZW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0cmluZy9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk4M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0cmluZy9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5zdHJpbmciLCAiZG9qby5zdHJpbmcuY29tbW9uIiwgImRvam8uc3RyaW5nLmV4dHJhcyIsICJkb2pvLnN0cmluZy5CdWlsZGVyIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5zdHJpbmcuKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nL2NvbW1vbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHJpbmcvY29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTgwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3RyaW5nL2NvbW1vbi5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZy5jb21tb24iKTsKK2Rvam8uc3RyaW5nLnRyaW0gPSBmdW5jdGlvbiAoc3RyLCB3aCkgeworCWlmICghc3RyLnJlcGxhY2UpIHsKKwkJcmV0dXJuIHN0cjsKKwl9CisJaWYgKCFzdHIubGVuZ3RoKSB7CisJCXJldHVybiBzdHI7CisJfQorCXZhciByZSA9ICh3aCA+IDApID8gKC9eXHMrLykgOiAod2ggPCAwKSA/ICgvXHMrJC8pIDogKC9eXHMrfFxzKyQvZyk7CisJcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCAiIik7Cit9OworZG9qby5zdHJpbmcudHJpbVN0YXJ0ID0gZnVuY3Rpb24gKHN0cikgeworCXJldHVybiBkb2pvLnN0cmluZy50cmltKHN0ciwgMSk7Cit9OworZG9qby5zdHJpbmcudHJpbUVuZCA9IGZ1bmN0aW9uIChzdHIpIHsKKwlyZXR1cm4gZG9qby5zdHJpbmcudHJpbShzdHIsIC0xKTsKK307Citkb2pvLnN0cmluZy5yZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBjb3VudCwgc2VwYXJhdG9yKSB7CisJdmFyIG91dCA9ICIiOworCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlvdXQgKz0gc3RyOworCQlpZiAoc2VwYXJhdG9yICYmIGkgPCBjb3VudCAtIDEpIHsKKwkJCW91dCArPSBzZXBhcmF0b3I7CisJCX0KKwl9CisJcmV0dXJuIG91dDsKK307Citkb2pvLnN0cmluZy5wYWQgPSBmdW5jdGlvbiAoc3RyLCBsZW4sIGMsIGRpcikgeworCXZhciBvdXQgPSBTdHJpbmcoc3RyKTsKKwlpZiAoIWMpIHsKKwkJYyA9ICIwIjsKKwl9CisJaWYgKCFkaXIpIHsKKwkJZGlyID0gMTsKKwl9CisJd2hpbGUgKG91dC5sZW5ndGggPCBsZW4pIHsKKwkJaWYgKGRpciA+IDApIHsKKwkJCW91dCA9IGMgKyBvdXQ7CisJCX0gZWxzZSB7CisJCQlvdXQgKz0gYzsKKwkJfQorCX0KKwlyZXR1cm4gb3V0OworfTsKK2Rvam8uc3RyaW5nLnBhZExlZnQgPSBmdW5jdGlvbiAoc3RyLCBsZW4sIGMpIHsKKwlyZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAxKTsKK307Citkb2pvLnN0cmluZy5wYWRSaWdodCA9IGZ1bmN0aW9uIChzdHIsIGxlbiwgYykgeworCXJldHVybiBkb2pvLnN0cmluZy5wYWQoc3RyLCBsZW4sIGMsIC0xKTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHJpbmcvZXh0cmFzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N0cmluZy9leHRyYXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZjFlZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHJpbmcvZXh0cmFzLmpzCkBAIC0wLDAgKzEsMTc4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZy5leHRyYXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnN0cmluZy5zdWJzdGl0dXRlUGFyYW1zID0gZnVuY3Rpb24gKHRlbXBsYXRlLCBoYXNoKSB7CisJdmFyIG1hcCA9ICh0eXBlb2YgaGFzaCA9PSAib2JqZWN0IikgPyBoYXNoIDogZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzLCAxKTsKKwlyZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXCVceyhcdyspXH0vZywgZnVuY3Rpb24gKG1hdGNoLCBrZXkpIHsKKwkJaWYgKHR5cGVvZiAobWFwW2tleV0pICE9ICJ1bmRlZmluZWQiICYmIG1hcFtrZXldICE9IG51bGwpIHsKKwkJCXJldHVybiBtYXBba2V5XTsKKwkJfQorCQlkb2pvLnJhaXNlKCJTdWJzdGl0dXRpb24gbm90IGZvdW5kOiAiICsga2V5KTsKKwl9KTsKK307Citkb2pvLnN0cmluZy5jYXBpdGFsaXplID0gZnVuY3Rpb24gKHN0cikgeworCWlmICghZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpIHsKKwkJcmV0dXJuICIiOworCX0KKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CisJCXN0ciA9IHRoaXM7CisJfQorCXZhciB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHsKKwkJd29yZHNbaV0gPSB3b3Jkc1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmRzW2ldLnN1YnN0cmluZygxKTsKKwl9CisJcmV0dXJuIHdvcmRzLmpvaW4oIiAiKTsKK307Citkb2pvLnN0cmluZy5pc0JsYW5rID0gZnVuY3Rpb24gKHN0cikgeworCWlmICghZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiAoZG9qby5zdHJpbmcudHJpbShzdHIpLmxlbmd0aCA9PSAwKTsKK307Citkb2pvLnN0cmluZy5lbmNvZGVBc2NpaSA9IGZ1bmN0aW9uIChzdHIpIHsKKwlpZiAoIWRvam8ubGFuZy5pc1N0cmluZyhzdHIpKSB7CisJCXJldHVybiBzdHI7CisJfQorCXZhciByZXQgPSAiIjsKKwl2YXIgdmFsdWUgPSBlc2NhcGUoc3RyKTsKKwl2YXIgbWF0Y2gsIHJlID0gLyV1KFswLTlBLUZdezR9KS9pOworCXdoaWxlICgobWF0Y2ggPSB2YWx1ZS5tYXRjaChyZSkpKSB7CisJCXZhciBudW0gPSBOdW1iZXIoIjB4IiArIG1hdGNoWzFdKTsKKwkJdmFyIG5ld1ZhbCA9IGVzY2FwZSgiJiMiICsgbnVtICsgIjsiKTsKKwkJcmV0ICs9IHZhbHVlLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBuZXdWYWw7CisJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKKwl9CisJcmV0ICs9IHZhbHVlLnJlcGxhY2UoL1wrL2csICIlMkIiKTsKKwlyZXR1cm4gcmV0OworfTsKK2Rvam8uc3RyaW5nLmVzY2FwZSA9IGZ1bmN0aW9uICh0eXBlLCBzdHIpIHsKKwl2YXIgYXJncyA9IGRvam8ubGFuZy50b0FycmF5KGFyZ3VtZW50cywgMSk7CisJc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHsKKwkgIGNhc2UgInhtbCI6CisJICBjYXNlICJodG1sIjoKKwkgIGNhc2UgInhodG1sIjoKKwkJcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVhtbC5hcHBseSh0aGlzLCBhcmdzKTsKKwkgIGNhc2UgInNxbCI6CisJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVTcWwuYXBwbHkodGhpcywgYXJncyk7CisJICBjYXNlICJyZWdleHAiOgorCSAgY2FzZSAicmVnZXgiOgorCQlyZXR1cm4gZG9qby5zdHJpbmcuZXNjYXBlUmVnRXhwLmFwcGx5KHRoaXMsIGFyZ3MpOworCSAgY2FzZSAiamF2YXNjcmlwdCI6CisJICBjYXNlICJqc2NyaXB0IjoKKwkgIGNhc2UgImpzIjoKKwkJcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZUphdmFTY3JpcHQuYXBwbHkodGhpcywgYXJncyk7CisJICBjYXNlICJhc2NpaSI6CisJCXJldHVybiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaS5hcHBseSh0aGlzLCBhcmdzKTsKKwkgIGRlZmF1bHQ6CisJCXJldHVybiBzdHI7CisJfQorfTsKK2Rvam8uc3RyaW5nLmVzY2FwZVhtbCA9IGZ1bmN0aW9uIChzdHIsIG5vU2luZ2xlUXVvdGVzKSB7CisJc3RyID0gc3RyLnJlcGxhY2UoLyYvZ20sICImYW1wOyIpLnJlcGxhY2UoLzwvZ20sICImbHQ7IikucmVwbGFjZSgvPi9nbSwgIiZndDsiKS5yZXBsYWNlKC8iL2dtLCAiJnF1b3Q7Iik7CisJaWYgKCFub1NpbmdsZVF1b3RlcykgeworCQlzdHIgPSBzdHIucmVwbGFjZSgvJy9nbSwgIiYjMzk7Iik7CisJfQorCXJldHVybiBzdHI7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlU3FsID0gZnVuY3Rpb24gKHN0cikgeworCXJldHVybiBzdHIucmVwbGFjZSgvJy9nbSwgIicnIik7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikgeworCXJldHVybiBzdHIucmVwbGFjZSgvXFwvZ20sICJcXFxcIikucmVwbGFjZSgvKFtcZlxiXG5cdFxyW1xeJHw/KisoKXt9XSkvZ20sICJcXCQxIik7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlSmF2YVNjcmlwdCA9IGZ1bmN0aW9uIChzdHIpIHsKKwlyZXR1cm4gc3RyLnJlcGxhY2UoLyhbIidcZlxiXG5cdFxyXSkvZ20sICJcXCQxIik7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlU3RyaW5nID0gZnVuY3Rpb24gKHN0cikgeworCXJldHVybiAoIlwiIiArIHN0ci5yZXBsYWNlKC8oWyJcXF0pL2csICJcXCQxIikgKyAiXCIiKS5yZXBsYWNlKC9bXGZdL2csICJcXGYiKS5yZXBsYWNlKC9bXGJdL2csICJcXGIiKS5yZXBsYWNlKC9bXG5dL2csICJcXG4iKS5yZXBsYWNlKC9bXHRdL2csICJcXHQiKS5yZXBsYWNlKC9bXHJdL2csICJcXHIiKTsKK307Citkb2pvLnN0cmluZy5zdW1tYXJ5ID0gZnVuY3Rpb24gKHN0ciwgbGVuKSB7CisJaWYgKCFsZW4gfHwgc3RyLmxlbmd0aCA8PSBsZW4pIHsKKwkJcmV0dXJuIHN0cjsKKwl9CisJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgbGVuKS5yZXBsYWNlKC9cLiskLywgIiIpICsgIi4uLiI7Cit9OworZG9qby5zdHJpbmcuZW5kc1dpdGggPSBmdW5jdGlvbiAoc3RyLCBlbmQsIGlnbm9yZUNhc2UpIHsKKwlpZiAoaWdub3JlQ2FzZSkgeworCQlzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTsKKwkJZW5kID0gZW5kLnRvTG93ZXJDYXNlKCk7CisJfQorCWlmICgoc3RyLmxlbmd0aCAtIGVuZC5sZW5ndGgpIDwgMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiBzdHIubGFzdEluZGV4T2YoZW5kKSA9PSBzdHIubGVuZ3RoIC0gZW5kLmxlbmd0aDsKK307Citkb2pvLnN0cmluZy5lbmRzV2l0aEFueSA9IGZ1bmN0aW9uIChzdHIpIHsKKwlmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZiAoZG9qby5zdHJpbmcuZW5kc1dpdGgoc3RyLCBhcmd1bWVudHNbaV0pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9OworZG9qby5zdHJpbmcuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBpZ25vcmVDYXNlKSB7CisJaWYgKGlnbm9yZUNhc2UpIHsKKwkJc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7CisJCXN0YXJ0ID0gc3RhcnQudG9Mb3dlckNhc2UoKTsKKwl9CisJcmV0dXJuIHN0ci5pbmRleE9mKHN0YXJ0KSA9PSAwOworfTsKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGhBbnkgPSBmdW5jdGlvbiAoc3RyKSB7CisJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGRvam8uc3RyaW5nLnN0YXJ0c1dpdGgoc3RyLCBhcmd1bWVudHNbaV0pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9OworZG9qby5zdHJpbmcuaGFzID0gZnVuY3Rpb24gKHN0cikgeworCWZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChzdHIuaW5kZXhPZihhcmd1bWVudHNbaV0pID4gLTEpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK307Citkb2pvLnN0cmluZy5ub3JtYWxpemVOZXdsaW5lcyA9IGZ1bmN0aW9uICh0ZXh0LCBuZXdsaW5lQ2hhcikgeworCWlmIChuZXdsaW5lQ2hhciA9PSAiXG4iKSB7CisJCXRleHQgPSB0ZXh0LnJlcGxhY2UoL1xyXG4vZywgIlxuIik7CisJCXRleHQgPSB0ZXh0LnJlcGxhY2UoL1xyL2csICJcbiIpOworCX0gZWxzZSB7CisJCWlmIChuZXdsaW5lQ2hhciA9PSAiXHIiKSB7CisJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxuL2csICJcciIpOworCQkJdGV4dCA9IHRleHQucmVwbGFjZSgvXG4vZywgIlxyIik7CisJCX0gZWxzZSB7CisJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oW15ccl0pXG4vZywgIiQxXHJcbiIpLnJlcGxhY2UoL1xyKFteXG5dKS9nLCAiXHJcbiQxIik7CisJCX0KKwl9CisJcmV0dXJuIHRleHQ7Cit9OworZG9qby5zdHJpbmcuc3BsaXRFc2NhcGVkID0gZnVuY3Rpb24gKHN0ciwgY2hhcmFjKSB7CisJdmFyIGNvbXBvbmVudHMgPSBbXTsKKwlmb3IgKHZhciBpID0gMCwgcHJldmNvbW1hID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworCQlpZiAoc3RyLmNoYXJBdChpKSA9PSAiXFwiKSB7CisJCQlpKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyLmNoYXJBdChpKSA9PSBjaGFyYWMpIHsKKwkJCWNvbXBvbmVudHMucHVzaChzdHIuc3Vic3RyaW5nKHByZXZjb21tYSwgaSkpOworCQkJcHJldmNvbW1hID0gaSArIDE7CisJCX0KKwl9CisJY29tcG9uZW50cy5wdXNoKHN0ci5zdWJzdHIocHJldmNvbW1hKSk7CisJcmV0dXJuIGNvbXBvbmVudHM7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3R5bGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3R5bGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhOTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy9zdHlsZS5qcwpAQCAtMCwwICsxLDE4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnN0eWxlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2Jyb3dzZXI6WyJkb2pvLmh0bWwuc3R5bGUiXX0pOworZG9qby5kZXByZWNhdGVkKCJkb2pvLnN0eWxlIiwgInJlcGxhY2VkIGJ5IGRvam8uaHRtbC5zdHlsZSIsICIwLjUiKTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLnN0eWxlLCBkb2pvLmh0bWwpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvc3ZnLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N2Zy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNhMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3N2Zy5qcwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5zdmciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5taXhpbihkb2pvLnN2ZywgZG9qby5kb20pOworZG9qby5zdmcuZ3JhcGhpY3MgPSBkb2pvLnN2Zy5nID0gbmV3IGZ1bmN0aW9uIChkKSB7CisJdGhpcy5zdXNwZW5kID0gZnVuY3Rpb24gKCkgeworCQl0cnkgeworCQkJZC5kb2N1bWVudEVsZW1lbnQuc3VzcGVuZFJlZHJhdygwKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfTsKKwl0aGlzLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHsKKwkJdHJ5IHsKKwkJCWQuZG9jdW1lbnRFbGVtZW50LnVuc3VzcGVuZFJlZHJhdygwKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfTsKKwl0aGlzLmZvcmNlID0gZnVuY3Rpb24gKCkgeworCQl0cnkgeworCQkJZC5kb2N1bWVudEVsZW1lbnQuZm9yY2VSZWRyYXcoKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfTsKK30oZG9jdW1lbnQpOworZG9qby5zdmcuYW5pbWF0aW9ucyA9IGRvam8uc3ZnLmFuaW0gPSBuZXcgZnVuY3Rpb24gKGQpIHsKKwl0aGlzLmFyZVBhdXNlZCA9IGZ1bmN0aW9uICgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBkLmRvY3VtZW50RWxlbWVudC5hbmltYXRpb25zUGF1c2VkKCk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX07CisJdGhpcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHsKKwkJdHJ5IHsKKwkJCWQuZG9jdW1lbnRFbGVtZW50LnBhdXNlQW5pbWF0aW9ucygpOworCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwl9OworCXRoaXMucmVzdW1lID0gZnVuY3Rpb24gKCkgeworCQl0cnkgeworCQkJZC5kb2N1bWVudEVsZW1lbnQudW5wYXVzZUFuaW1hdGlvbnMoKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfTsKK30oZG9jdW1lbnQpOworZG9qby5zdmcudG9DYW1lbENhc2UgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHsKKwl2YXIgYXJyID0gc2VsZWN0b3Iuc3BsaXQoIi0iKSwgY2MgPSBhcnJbMF07CisJZm9yICh2YXIgaSA9IDE7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKwkJY2MgKz0gYXJyW2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgYXJyW2ldLnN1YnN0cmluZygxKTsKKwl9CisJcmV0dXJuIGNjOworfTsKK2Rvam8uc3ZnLnRvU2VsZWN0b3JDYXNlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7CisJcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbQS1aXSkvZywgIi0kMSIpLnRvTG93ZXJDYXNlKCk7Cit9OworZG9qby5zdmcuZ2V0U3R5bGUgPSBmdW5jdGlvbiAobm9kZSwgY3NzU2VsZWN0b3IpIHsKKwlyZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBjc3NTZWxlY3Rvcik7Cit9OworZG9qby5zdmcuZ2V0TnVtZXJpY1N0eWxlID0gZnVuY3Rpb24gKG5vZGUsIGNzc1NlbGVjdG9yKSB7CisJcmV0dXJuIHBhcnNlRmxvYXQoZG9qby5zdmcuZ2V0U3R5bGUobm9kZSwgY3NzU2VsZWN0b3IpKTsKK307Citkb2pvLnN2Zy5nZXRPcGFjaXR5ID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gTWF0aC5taW4oMSwgZG9qby5zdmcuZ2V0TnVtZXJpY1N0eWxlKG5vZGUsICJmaWxsLW9wYWNpdHkiKSk7Cit9OworZG9qby5zdmcuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uIChub2RlLCBvcGFjaXR5KSB7CisJbm9kZS5zZXRBdHRyaWJ1dGVOUyh0aGlzLnhtbG5zLnN2ZywgImZpbGwtb3BhY2l0eSIsIG9wYWNpdHkpOworCW5vZGUuc2V0QXR0cmlidXRlTlModGhpcy54bWxucy5zdmcsICJzdHJva2Utb3BhY2l0eSIsIG9wYWNpdHkpOworfTsKK2Rvam8uc3ZnLmNsZWFyT3BhY2l0eSA9IGZ1bmN0aW9uIChub2RlKSB7CisJbm9kZS5zZXRBdHRyaWJ1dGVOUyh0aGlzLnhtbG5zLnN2ZywgImZpbGwtb3BhY2l0eSIsICIxLjAiKTsKKwlub2RlLnNldEF0dHJpYnV0ZU5TKHRoaXMueG1sbnMuc3ZnLCAic3Ryb2tlLW9wYWNpdHkiLCAiMS4wIik7Cit9OworZG9qby5zdmcuZ2V0Q29vcmRzID0gZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAobm9kZS5nZXRCQm94KSB7CisJCXZhciBib3ggPSBub2RlLmdldEJCb3goKTsKKwkJcmV0dXJuIHt4OmJveC54LCB5OmJveC55fTsKKwl9CisJcmV0dXJuIG51bGw7Cit9OworZG9qby5zdmcuc2V0Q29vcmRzID0gZnVuY3Rpb24gKG5vZGUsIGNvb3JkcykgeworCXZhciBwID0gZG9qby5zdmcuZ2V0Q29vcmRzKCk7CisJaWYgKCFwKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGR4ID0gcC54IC0gY29vcmRzLng7CisJdmFyIGR5ID0gcC55IC0gY29vcmRzLnk7CisJZG9qby5zdmcudHJhbnNsYXRlKG5vZGUsIGR4LCBkeSk7Cit9OworZG9qby5zdmcuZ2V0RGltZW5zaW9ucyA9IGZ1bmN0aW9uIChub2RlKSB7CisJaWYgKG5vZGUuZ2V0QkJveCkgeworCQl2YXIgYm94ID0gbm9kZS5nZXRCQm94KCk7CisJCXJldHVybiB7d2lkdGg6Ym94LndpZHRoLCBoZWlnaHQ6Ym94LmhlaWdodH07CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8uc3ZnLnNldERpbWVuc2lvbnMgPSBmdW5jdGlvbiAobm9kZSwgZGltKSB7CisJaWYgKG5vZGUud2lkdGgpIHsKKwkJbm9kZS53aWR0aC5iYXNlVmFsLnZhbHVlID0gZGltLndpZHRoOworCQlub2RlLmhlaWdodC5iYXNlVmFsLnZhbHVlID0gZGltLmhlaWdodDsKKwl9IGVsc2UgeworCQlpZiAobm9kZS5yKSB7CisJCQlub2RlLnIuYmFzZVZhbC52YWx1ZSA9IE1hdGgubWluKGRpbS53aWR0aCwgZGltLmhlaWdodCkgLyAyOworCQl9IGVsc2UgeworCQkJaWYgKG5vZGUucngpIHsKKwkJCQlub2RlLnJ4LmJhc2VWYWwudmFsdWUgPSBkaW0ud2lkdGggLyAyOworCQkJCW5vZGUucnkuYmFzZVZhbC52YWx1ZSA9IGRpbS5oZWlnaHQgLyAyOworCQkJfQorCQl9CisJfQorfTsKK2Rvam8uc3ZnLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChub2RlLCBkeCwgZHkpIHsKKwlpZiAobm9kZS50cmFuc2Zvcm0gJiYgbm9kZS5vd25lclNWR0VsZW1lbnQgJiYgbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKSB7CisJCXZhciB0ID0gbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKCk7CisJCXQuc2V0VHJhbnNsYXRlKGR4LCBkeSk7CisJCW5vZGUudHJhbnNmb3JtLmJhc2VWYWwuYXBwZW5kSXRlbSh0KTsKKwl9Cit9OworZG9qby5zdmcuc2NhbGUgPSBmdW5jdGlvbiAobm9kZSwgc2NhbGVYLCBzY2FsZVkpIHsKKwlpZiAoIXNjYWxlWSkgeworCQl2YXIgc2NhbGVZID0gc2NhbGVYOworCX0KKwlpZiAobm9kZS50cmFuc2Zvcm0gJiYgbm9kZS5vd25lclNWR0VsZW1lbnQgJiYgbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKSB7CisJCXZhciB0ID0gbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKCk7CisJCXQuc2V0U2NhbGUoc2NhbGVYLCBzY2FsZVkpOworCQlub2RlLnRyYW5zZm9ybS5iYXNlVmFsLmFwcGVuZEl0ZW0odCk7CisJfQorfTsKK2Rvam8uc3ZnLnJvdGF0ZSA9IGZ1bmN0aW9uIChub2RlLCBhbmcsIGN4LCBjeSkgeworCWlmIChub2RlLnRyYW5zZm9ybSAmJiBub2RlLm93bmVyU1ZHRWxlbWVudCAmJiBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0pIHsKKwkJdmFyIHQgPSBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0oKTsKKwkJaWYgKGN4ID09IG51bGwpIHsKKwkJCXQuc2V0TWF0cml4KHQubWF0cml4LnJvdGF0ZShhbmcpKTsKKwkJfSBlbHNlIHsKKwkJCXQuc2V0Um90YXRlKGFuZywgY3gsIGN5KTsKKwkJfQorCQlub2RlLnRyYW5zZm9ybS5iYXNlVmFsLmFwcGVuZEl0ZW0odCk7CisJfQorfTsKK2Rvam8uc3ZnLnNrZXcgPSBmdW5jdGlvbiAobm9kZSwgYW5nLCBheGlzKSB7CisJdmFyIGRpciA9IGF4aXMgfHwgIngiOworCWlmIChub2RlLnRyYW5zZm9ybSAmJiBub2RlLm93bmVyU1ZHRWxlbWVudCAmJiBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0pIHsKKwkJdmFyIHQgPSBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0oKTsKKwkJaWYgKGRpciAhPSAieCIpIHsKKwkJCXQuc2V0U2tld1koYW5nKTsKKwkJfSBlbHNlIHsKKwkJCXQuc2V0U2tld1goYW5nKTsKKwkJfQorCQlub2RlLnRyYW5zZm9ybS5iYXNlVmFsLmFwcGVuZEl0ZW0odCk7CisJfQorfTsKK2Rvam8uc3ZnLmZsaXAgPSBmdW5jdGlvbiAobm9kZSwgYXhpcykgeworCXZhciBkaXIgPSBheGlzIHx8ICJ4IjsKKwlpZiAobm9kZS50cmFuc2Zvcm0gJiYgbm9kZS5vd25lclNWR0VsZW1lbnQgJiYgbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKSB7CisJCXZhciB0ID0gbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHVHJhbnNmb3JtKCk7CisJCXQuc2V0TWF0cml4KChkaXIgIT0gIngiKSA/IHQubWF0cml4LmZsaXBZKCkgOiB0Lm1hdHJpeC5mbGlwWCgpKTsKKwkJbm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5hcHBlbmRJdGVtKHQpOworCX0KK307Citkb2pvLnN2Zy5pbnZlcnQgPSBmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlLnRyYW5zZm9ybSAmJiBub2RlLm93bmVyU1ZHRWxlbWVudCAmJiBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0pIHsKKwkJdmFyIHQgPSBub2RlLm93bmVyU1ZHRWxlbWVudC5jcmVhdGVTVkdUcmFuc2Zvcm0oKTsKKwkJdC5zZXRNYXRyaXgodC5tYXRyaXguaW52ZXJzZSgpKTsKKwkJbm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5hcHBlbmRJdGVtKHQpOworCX0KK307Citkb2pvLnN2Zy5hcHBseU1hdHJpeCA9IGZ1bmN0aW9uIChub2RlLCBhLCBiLCBjLCBkLCBlLCBmKSB7CisJaWYgKG5vZGUudHJhbnNmb3JtICYmIG5vZGUub3duZXJTVkdFbGVtZW50ICYmIG5vZGUub3duZXJTVkdFbGVtZW50LmNyZWF0ZVNWR1RyYW5zZm9ybSkgeworCQl2YXIgbTsKKwkJaWYgKGIpIHsKKwkJCXZhciBtID0gbm9kZS5vd25lclNWR0VsZW1lbnQuY3JlYXRlU1ZHTWF0cml4KCk7CisJCQltLmEgPSBhOworCQkJbS5iID0gYjsKKwkJCW0uYyA9IGM7CisJCQltLmQgPSBkOworCQkJbS5lID0gZTsKKwkJCW0uZiA9IGY7CisJCX0gZWxzZSB7CisJCQltID0gYTsKKwkJfQorCQl2YXIgdCA9IG5vZGUub3duZXJTVkdFbGVtZW50LmNyZWF0ZVNWR1RyYW5zZm9ybSgpOworCQl0LnNldE1hdHJpeChtKTsKKwkJbm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5hcHBlbmRJdGVtKHQpOworCX0KK307Citkb2pvLnN2Zy5ncm91cCA9IGZ1bmN0aW9uIChub2RlcykgeworCXZhciBwID0gbm9kZXMuaXRlbSgwKS5wYXJlbnROb2RlOworCXZhciBnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMuc3ZnLCAiZyIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJZy5hcHBlbmRDaGlsZChub2Rlcy5pdGVtKGkpKTsKKwl9CisJcC5hcHBlbmRDaGlsZChnKTsKKwlyZXR1cm4gZzsKK307Citkb2pvLnN2Zy51bmdyb3VwID0gZnVuY3Rpb24gKGcpIHsKKwl2YXIgcCA9IGcucGFyZW50Tm9kZTsKKwl3aGlsZSAoZy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJcC5hcHBlbmRDaGlsZChnLmNoaWxkTm9kZXMuaXRlbSgwKSk7CisJfQorCXAucmVtb3ZlQ2hpbGQoZyk7Cit9OworZG9qby5zdmcuZ2V0R3JvdXAgPSBmdW5jdGlvbiAobm9kZSkgeworCXZhciBhID0gdGhpcy5nZXRBbmNlc3RvcnMobm9kZSk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisJCWlmIChhW2ldLm5vZGVUeXBlID09IHRoaXMuRUxFTUVOVF9OT0RFICYmIGFbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZyIpIHsKKwkJCXJldHVybiBhW2ldOworCQl9CisJfQorCXJldHVybiBudWxsOworfTsKK2Rvam8uc3ZnLmJyaW5nVG9Gcm9udCA9IGZ1bmN0aW9uIChub2RlKSB7CisJdmFyIG4gPSB0aGlzLmdldEdyb3VwKG5vZGUpIHx8IG5vZGU7CisJbi5vd25lclNWR0VsZW1lbnQuYXBwZW5kQ2hpbGQobik7Cit9OworZG9qby5zdmcuc2VuZFRvQmFjayA9IGZ1bmN0aW9uIChub2RlKSB7CisJdmFyIG4gPSB0aGlzLmdldEdyb3VwKG5vZGUpIHx8IG5vZGU7CisJbi5vd25lclNWR0VsZW1lbnQuaW5zZXJ0QmVmb3JlKG4sIG4ub3duZXJTVkdFbGVtZW50LmZpcnN0Q2hpbGQpOworfTsKK2Rvam8uc3ZnLmJyaW5nRm9yd2FyZCA9IGZ1bmN0aW9uIChub2RlKSB7CisJdmFyIG4gPSB0aGlzLmdldEdyb3VwKG5vZGUpIHx8IG5vZGU7CisJaWYgKHRoaXMuZ2V0TGFzdENoaWxkRWxlbWVudChuLnBhcmVudE5vZGUpICE9IG4pIHsKKwkJdGhpcy5pbnNlcnRBZnRlcihuLCB0aGlzLmdldE5leHRTaWJsaW5nRWxlbWVudChuKSwgdHJ1ZSk7CisJfQorfTsKK2Rvam8uc3ZnLnNlbmRCYWNrd2FyZCA9IGZ1bmN0aW9uIChub2RlKSB7CisJdmFyIG4gPSB0aGlzLmdldEdyb3VwKG5vZGUpIHx8IG5vZGU7CisJaWYgKHRoaXMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQobi5wYXJlbnROb2RlKSAhPSBuKSB7CisJCXRoaXMuaW5zZXJ0QmVmb3JlKG4sIHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nRWxlbWVudChuKSwgdHJ1ZSk7CisJfQorfTsKK2Rvam8uc3ZnLmNyZWF0ZU5vZGVzRnJvbVRleHQgPSBmdW5jdGlvbiAodHh0LCB3cmFwKSB7CisJdmFyIGRvY0ZyYWcgPSAobmV3IERPTVBhcnNlcigpKS5wYXJzZUZyb21TdHJpbmcodHh0LCAidGV4dC94bWwiKS5ub3JtYWxpemUoKTsKKwlpZiAod3JhcCkgeworCQlyZXR1cm4gW2RvY0ZyYWcuZmlyc3RDaGlsZC5jbG9uZU5vZGUodHJ1ZSldOworCX0KKwl2YXIgbm9kZXMgPSBbXTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGRvY0ZyYWcuY2hpbGROb2Rlcy5sZW5ndGg7IHgrKykgeworCQlub2Rlcy5wdXNoKGRvY0ZyYWcuY2hpbGROb2Rlcy5pdGVtKHgpLmNsb25lTm9kZSh0cnVlKSk7CisJfQorCXJldHVybiBub2RlczsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy90ZXh0L19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3RleHQvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3NmE3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy90ZXh0L19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLnRleHQuU3RyaW5nIiwgImRvam8udGV4dC5CdWlsZGVyIl19KTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby50ZXh0IiwgInRleHREaXJlY3RvcnkgbW92ZWQgdG8gY2FsLCB0ZXh0LlN0cmluZyBhbmQgdGV4dC5CdWlsZGVyIGhhdm5lJ3QgYmVlbiBoZXJlIGZvciBhd2hpbGUiLCAiMC41Iik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy90ZXh0L3RleHREaXJlY3RvcnkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdGV4dC90ZXh0RGlyZWN0b3J5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTBmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdGV4dC90ZXh0RGlyZWN0b3J5LmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8uY2FsLnRleHREaXJlY3RvcnkiKTsKK2Rvam8uZGVwcmVjYXRlKCJkb2pvLnRleHQudGV4dERpcmVjdG9yeSIsICJ1c2UgZG9qby5jYWwudGV4dERpcmVjdG9yeSIsICIwLjUiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VuZG8vTWFuYWdlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91bmRvL01hbmFnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNTdhZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91bmRvL01hbmFnZXIuanMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udW5kby5NYW5hZ2VyIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8udW5kby5NYW5hZ2VyID0gZnVuY3Rpb24gKHBhcmVudCkgeworCXRoaXMuY2xlYXIoKTsKKwl0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7Cit9OworZG9qby5leHRlbmQoZG9qby51bmRvLk1hbmFnZXIsIHtfcGFyZW50Om51bGwsIF91bmRvU3RhY2s6bnVsbCwgX3JlZG9TdGFjazpudWxsLCBfY3VycmVudE1hbmFnZXI6bnVsbCwgY2FuVW5kbzpmYWxzZSwgY2FuUmVkbzpmYWxzZSwgaXNVbmRvaW5nOmZhbHNlLCBpc1JlZG9pbmc6ZmFsc2UsIG9uVW5kbzpmdW5jdGlvbiAobWFuYWdlciwgaXRlbSkgeworfSwgb25SZWRvOmZ1bmN0aW9uIChtYW5hZ2VyLCBpdGVtKSB7Cit9LCBvblVuZG9Bbnk6ZnVuY3Rpb24gKG1hbmFnZXIsIGl0ZW0pIHsKK30sIG9uUmVkb0FueTpmdW5jdGlvbiAobWFuYWdlciwgaXRlbSkgeworfSwgX3VwZGF0ZVN0YXR1czpmdW5jdGlvbiAoKSB7CisJdGhpcy5jYW5VbmRvID0gdGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IDA7CisJdGhpcy5jYW5SZWRvID0gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aCA+IDA7Cit9LCBjbGVhcjpmdW5jdGlvbiAoKSB7CisJdGhpcy5fdW5kb1N0YWNrID0gW107CisJdGhpcy5fcmVkb1N0YWNrID0gW107CisJdGhpcy5fY3VycmVudE1hbmFnZXIgPSB0aGlzOworCXRoaXMuaXNVbmRvaW5nID0gZmFsc2U7CisJdGhpcy5pc1JlZG9pbmcgPSBmYWxzZTsKKwl0aGlzLl91cGRhdGVTdGF0dXMoKTsKK30sIHVuZG86ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5jYW5VbmRvKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdGhpcy5lbmRBbGxUcmFuc2FjdGlvbnMoKTsKKwl0aGlzLmlzVW5kb2luZyA9IHRydWU7CisJdmFyIHRvcCA9IHRoaXMuX3VuZG9TdGFjay5wb3AoKTsKKwlpZiAodG9wIGluc3RhbmNlb2YgZG9qby51bmRvLk1hbmFnZXIpIHsKKwkJdG9wLnVuZG9BbGwoKTsKKwl9IGVsc2UgeworCQl0b3AudW5kbygpOworCX0KKwlpZiAodG9wLnJlZG8pIHsKKwkJdGhpcy5fcmVkb1N0YWNrLnB1c2godG9wKTsKKwl9CisJdGhpcy5pc1VuZG9pbmcgPSBmYWxzZTsKKwl0aGlzLl91cGRhdGVTdGF0dXMoKTsKKwl0aGlzLm9uVW5kbyh0aGlzLCB0b3ApOworCWlmICghKHRvcCBpbnN0YW5jZW9mIGRvam8udW5kby5NYW5hZ2VyKSkgeworCQl0aGlzLmdldFRvcCgpLm9uVW5kb0FueSh0aGlzLCB0b3ApOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIHJlZG86ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5jYW5SZWRvKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdGhpcy5pc1JlZG9pbmcgPSB0cnVlOworCXZhciB0b3AgPSB0aGlzLl9yZWRvU3RhY2sucG9wKCk7CisJaWYgKHRvcCBpbnN0YW5jZW9mIGRvam8udW5kby5NYW5hZ2VyKSB7CisJCXRvcC5yZWRvQWxsKCk7CisJfSBlbHNlIHsKKwkJdG9wLnJlZG8oKTsKKwl9CisJdGhpcy5fdW5kb1N0YWNrLnB1c2godG9wKTsKKwl0aGlzLmlzUmVkb2luZyA9IGZhbHNlOworCXRoaXMuX3VwZGF0ZVN0YXR1cygpOworCXRoaXMub25SZWRvKHRoaXMsIHRvcCk7CisJaWYgKCEodG9wIGluc3RhbmNlb2YgZG9qby51bmRvLk1hbmFnZXIpKSB7CisJCXRoaXMuZ2V0VG9wKCkub25SZWRvQW55KHRoaXMsIHRvcCk7CisJfQorCXJldHVybiB0cnVlOworfSwgdW5kb0FsbDpmdW5jdGlvbiAoKSB7CisJd2hpbGUgKHRoaXMuX3VuZG9TdGFjay5sZW5ndGggPiAwKSB7CisJCXRoaXMudW5kbygpOworCX0KK30sIHJlZG9BbGw6ZnVuY3Rpb24gKCkgeworCXdoaWxlICh0aGlzLl9yZWRvU3RhY2subGVuZ3RoID4gMCkgeworCQl0aGlzLnJlZG8oKTsKKwl9Cit9LCBwdXNoOmZ1bmN0aW9uICh1bmRvLCByZWRvLCBkZXNjcmlwdGlvbikgeworCWlmICghdW5kbykgeworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLl9jdXJyZW50TWFuYWdlciA9PSB0aGlzKSB7CisJCXRoaXMuX3VuZG9TdGFjay5wdXNoKHt1bmRvOnVuZG8sIHJlZG86cmVkbywgZGVzY3JpcHRpb246ZGVzY3JpcHRpb259KTsKKwl9IGVsc2UgeworCQl0aGlzLl9jdXJyZW50TWFuYWdlci5wdXNoLmFwcGx5KHRoaXMuX2N1cnJlbnRNYW5hZ2VyLCBhcmd1bWVudHMpOworCX0KKwl0aGlzLl9yZWRvU3RhY2sgPSBbXTsKKwl0aGlzLl91cGRhdGVTdGF0dXMoKTsKK30sIGNvbmNhdDpmdW5jdGlvbiAobWFuYWdlcikgeworCWlmICghbWFuYWdlcikgeworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLl9jdXJyZW50TWFuYWdlciA9PSB0aGlzKSB7CisJCWZvciAodmFyIHggPSAwOyB4IDwgbWFuYWdlci5fdW5kb1N0YWNrLmxlbmd0aDsgeCsrKSB7CisJCQl0aGlzLl91bmRvU3RhY2sucHVzaChtYW5hZ2VyLl91bmRvU3RhY2tbeF0pOworCQl9CisJCWlmIChtYW5hZ2VyLl91bmRvU3RhY2subGVuZ3RoID4gMCkgeworCQkJdGhpcy5fcmVkb1N0YWNrID0gW107CisJCX0KKwkJdGhpcy5fdXBkYXRlU3RhdHVzKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5fY3VycmVudE1hbmFnZXIuY29uY2F0LmFwcGx5KHRoaXMuX2N1cnJlbnRNYW5hZ2VyLCBhcmd1bWVudHMpOworCX0KK30sIGJlZ2luVHJhbnNhY3Rpb246ZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7CisJaWYgKHRoaXMuX2N1cnJlbnRNYW5hZ2VyID09IHRoaXMpIHsKKwkJdmFyIG1nciA9IG5ldyBkb2pvLnVuZG8uTWFuYWdlcih0aGlzKTsKKwkJbWdyLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPyBkZXNjcmlwdGlvbiA6ICIiOworCQl0aGlzLl91bmRvU3RhY2sucHVzaChtZ3IpOworCQl0aGlzLl9jdXJyZW50TWFuYWdlciA9IG1ncjsKKwkJcmV0dXJuIG1ncjsKKwl9IGVsc2UgeworCQl0aGlzLl9jdXJyZW50TWFuYWdlciA9IHRoaXMuX2N1cnJlbnRNYW5hZ2VyLmJlZ2luVHJhbnNhY3Rpb24uYXBwbHkodGhpcy5fY3VycmVudE1hbmFnZXIsIGFyZ3VtZW50cyk7CisJfQorfSwgZW5kVHJhbnNhY3Rpb246ZnVuY3Rpb24gKGZsYXR0ZW4pIHsKKwlpZiAodGhpcy5fY3VycmVudE1hbmFnZXIgPT0gdGhpcykgeworCQlpZiAodGhpcy5fcGFyZW50KSB7CisJCQl0aGlzLl9wYXJlbnQuX2N1cnJlbnRNYW5hZ2VyID0gdGhpcy5fcGFyZW50OworCQkJaWYgKHRoaXMuX3VuZG9TdGFjay5sZW5ndGggPT0gMCB8fCBmbGF0dGVuKSB7CisJCQkJdmFyIGlkeCA9IGRvam8ubGFuZy5maW5kKHRoaXMuX3BhcmVudC5fdW5kb1N0YWNrLCB0aGlzKTsKKwkJCQlpZiAoaWR4ID49IDApIHsKKwkJCQkJdGhpcy5fcGFyZW50Ll91bmRvU3RhY2suc3BsaWNlKGlkeCwgMSk7CisJCQkJCWlmIChmbGF0dGVuKSB7CisJCQkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuX3VuZG9TdGFjay5sZW5ndGg7IHgrKykgeworCQkJCQkJCXRoaXMuX3BhcmVudC5fdW5kb1N0YWNrLnNwbGljZShpZHgrKywgMCwgdGhpcy5fdW5kb1N0YWNrW3hdKTsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuX3VwZGF0ZVN0YXR1cygpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRoaXMuX3BhcmVudDsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuX2N1cnJlbnRNYW5hZ2VyID0gdGhpcy5fY3VycmVudE1hbmFnZXIuZW5kVHJhbnNhY3Rpb24uYXBwbHkodGhpcy5fY3VycmVudE1hbmFnZXIsIGFyZ3VtZW50cyk7CisJfQorfSwgZW5kQWxsVHJhbnNhY3Rpb25zOmZ1bmN0aW9uICgpIHsKKwl3aGlsZSAodGhpcy5fY3VycmVudE1hbmFnZXIgIT0gdGhpcykgeworCQl0aGlzLmVuZFRyYW5zYWN0aW9uKCk7CisJfQorfSwgZ2V0VG9wOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fcGFyZW50KSB7CisJCXJldHVybiB0aGlzLl9wYXJlbnQuZ2V0VG9wKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdW5kby9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91bmRvL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmQ3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdW5kby9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZXF1aXJlKCJkb2pvLnVuZG8uTWFuYWdlciIpOworZG9qby5wcm92aWRlKCJkb2pvLnVuZG8uKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdW5kby9icm93c2VyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VuZG8vYnJvd3Nlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdmNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VuZG8vYnJvd3Nlci5qcwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby51bmRvLmJyb3dzZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby5jb21tb24iKTsKK3RyeSB7CisJaWYgKCghZGpDb25maWdbInByZXZlbnRCYWNrQnV0dG9uRml4Il0pICYmICghZG9qby5ob3N0ZW52LnBvc3RfbG9hZF8pKSB7CisJCWRvY3VtZW50LndyaXRlKCI8aWZyYW1lIHN0eWxlPSdib3JkZXI6IDBweDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYm90dG9tOiAwcHg7IHJpZ2h0OiAwcHg7IHZpc2liaWxpdHk6IHZpc2libGU7JyBuYW1lPSdkamhpc3RvcnknIGlkPSdkamhpc3RvcnknIHNyYz0nIiArIChkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSB8fCBkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpICsgImlmcmFtZV9oaXN0b3J5Lmh0bWwiKSArICInPjwvaWZyYW1lPiIpOworCX0KK30KK2NhdGNoIChlKSB7Cit9CitpZiAoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkgeworCWRvam8uZGVidWcoIk9wZXJhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb2pvLnVuZG8uYnJvd3Nlciwgc28gYmFjay9mb3J3YXJkIGRldGVjdGlvbiB3aWxsIG5vdCB3b3JrLiIpOworfQorZG9qby51bmRvLmJyb3dzZXIgPSB7aW5pdGlhbEhyZWY6KCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiAiIiwgaW5pdGlhbEhhc2g6KCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhhc2ggOiAiIiwgbW92ZUZvcndhcmQ6ZmFsc2UsIGhpc3RvcnlTdGFjazpbXSwgZm9yd2FyZFN0YWNrOltdLCBoaXN0b3J5SWZyYW1lOm51bGwsIGJvb2ttYXJrQW5jaG9yOm51bGwsIGxvY2F0aW9uVGltZXI6bnVsbCwgc2V0SW5pdGlhbFN0YXRlOmZ1bmN0aW9uIChhcmdzKSB7CisJdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLl9jcmVhdGVTdGF0ZSh0aGlzLmluaXRpYWxIcmVmLCBhcmdzLCB0aGlzLmluaXRpYWxIYXNoKTsKK30sIGFkZFRvSGlzdG9yeTpmdW5jdGlvbiAoYXJncykgeworCXRoaXMuZm9yd2FyZFN0YWNrID0gW107CisJdmFyIGhhc2ggPSBudWxsOworCXZhciB1cmwgPSBudWxsOworCWlmICghdGhpcy5oaXN0b3J5SWZyYW1lKSB7CisJCWlmIChkakNvbmZpZ1sidXNlWERvbWFpbiJdICYmICFkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSkgeworCQkJZG9qby5kZWJ1ZygiZG9qby51bmRvLmJyb3dzZXI6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIgKyAiIHBsZWFzZSBzYXZlIGlmcmFtZV9oaXN0b3J5Lmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvSWZyYW1lSGlzdG9yeVVybCIgKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIGlmcmFtZV9oaXN0b3J5Lmh0bWwiKTsKKwkJfQorCQl0aGlzLmhpc3RvcnlJZnJhbWUgPSB3aW5kb3cuZnJhbWVzWyJkamhpc3RvcnkiXTsKKwl9CisJaWYgKCF0aGlzLmJvb2ttYXJrQW5jaG9yKSB7CisJCXRoaXMuYm9va21hcmtBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CisJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuYm9va21hcmtBbmNob3IpOworCQl0aGlzLmJvb2ttYXJrQW5jaG9yLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJfQorCWlmIChhcmdzWyJjaGFuZ2VVcmwiXSkgeworCQloYXNoID0gIiMiICsgKChhcmdzWyJjaGFuZ2VVcmwiXSAhPT0gdHJ1ZSkgPyBhcmdzWyJjaGFuZ2VVcmwiXSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpOworCQlpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID09IDAgJiYgdGhpcy5pbml0aWFsU3RhdGUudXJsSGFzaCA9PSBoYXNoKSB7CisJCQl0aGlzLmluaXRpYWxTdGF0ZSA9IHRoaXMuX2NyZWF0ZVN0YXRlKHVybCwgYXJncywgaGFzaCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID4gMCAmJiB0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggLSAxXS51cmxIYXNoID09IGhhc2gpIHsKKwkJCQl0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggLSAxXSA9IHRoaXMuX2NyZWF0ZVN0YXRlKHVybCwgYXJncywgaGFzaCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXRoaXMuY2hhbmdpbmdVcmwgPSB0cnVlOworCQlzZXRUaW1lb3V0KCJ3aW5kb3cubG9jYXRpb24uaHJlZiA9ICciICsgaGFzaCArICInOyBkb2pvLnVuZG8uYnJvd3Nlci5jaGFuZ2luZ1VybCA9IGZhbHNlOyIsIDEpOworCQl0aGlzLmJvb2ttYXJrQW5jaG9yLmhyZWYgPSBoYXNoOworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJdXJsID0gdGhpcy5fbG9hZElmcmFtZUhpc3RvcnkoKTsKKwkJCXZhciBvbGRDQiA9IGFyZ3NbImJhY2siXSB8fCBhcmdzWyJiYWNrQnV0dG9uIl0gfHwgYXJnc1siaGFuZGxlIl07CisJCQl2YXIgdGNiID0gZnVuY3Rpb24gKGhhbmRsZU5hbWUpIHsKKwkJCQlpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggIT0gIiIpIHsKKwkJCQkJc2V0VGltZW91dCgid2luZG93LmxvY2F0aW9uLmhyZWYgPSAnIiArIGhhc2ggKyAiJzsiLCAxKTsKKwkJCQl9CisJCQkJb2xkQ0IuYXBwbHkodGhpcywgW2hhbmRsZU5hbWVdKTsKKwkJCX07CisJCQlpZiAoYXJnc1siYmFjayJdKSB7CisJCQkJYXJncy5iYWNrID0gdGNiOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYXJnc1siYmFja0J1dHRvbiJdKSB7CisJCQkJCWFyZ3MuYmFja0J1dHRvbiA9IHRjYjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoYXJnc1siaGFuZGxlIl0pIHsKKwkJCQkJCWFyZ3MuaGFuZGxlID0gdGNiOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJdmFyIG9sZEZXID0gYXJnc1siZm9yd2FyZCJdIHx8IGFyZ3NbImZvcndhcmRCdXR0b24iXSB8fCBhcmdzWyJoYW5kbGUiXTsKKwkJCXZhciB0ZncgPSBmdW5jdGlvbiAoaGFuZGxlTmFtZSkgeworCQkJCWlmICh3aW5kb3cubG9jYXRpb24uaGFzaCAhPSAiIikgeworCQkJCQl3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhhc2g7CisJCQkJfQorCQkJCWlmIChvbGRGVykgeworCQkJCQlvbGRGVy5hcHBseSh0aGlzLCBbaGFuZGxlTmFtZV0pOworCQkJCX0KKwkJCX07CisJCQlpZiAoYXJnc1siZm9yd2FyZCJdKSB7CisJCQkJYXJncy5mb3J3YXJkID0gdGZ3OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYXJnc1siZm9yd2FyZEJ1dHRvbiJdKSB7CisJCQkJCWFyZ3MuZm9yd2FyZEJ1dHRvbiA9IHRmdzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoYXJnc1siaGFuZGxlIl0pIHsKKwkJCQkJCWFyZ3MuaGFuZGxlID0gdGZ3OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJCQkJaWYgKCF0aGlzLmxvY2F0aW9uVGltZXIpIHsKKwkJCQkJdGhpcy5sb2NhdGlvblRpbWVyID0gc2V0SW50ZXJ2YWwoImRvam8udW5kby5icm93c2VyLmNoZWNrTG9jYXRpb24oKTsiLCAyMDApOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXVybCA9IHRoaXMuX2xvYWRJZnJhbWVIaXN0b3J5KCk7CisJfQorCXRoaXMuaGlzdG9yeVN0YWNrLnB1c2godGhpcy5fY3JlYXRlU3RhdGUodXJsLCBhcmdzLCBoYXNoKSk7Cit9LCBjaGVja0xvY2F0aW9uOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuY2hhbmdpbmdVcmwpIHsKKwkJdmFyIGhzbCA9IHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aDsKKwkJaWYgKCh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSB0aGlzLmluaXRpYWxIYXNoIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmID09IHRoaXMuaW5pdGlhbEhyZWYpICYmIChoc2wgPT0gMSkpIHsKKwkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggPiAwKSB7CisJCQlpZiAodGhpcy5mb3J3YXJkU3RhY2tbdGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoIC0gMV0udXJsSGFzaCA9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgeworCQkJCXRoaXMuaGFuZGxlRm9yd2FyZEJ1dHRvbigpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlpZiAoKGhzbCA+PSAyKSAmJiAodGhpcy5oaXN0b3J5U3RhY2tbaHNsIC0gMl0pKSB7CisJCQlpZiAodGhpcy5oaXN0b3J5U3RhY2tbaHNsIC0gMl0udXJsSGFzaCA9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgeworCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30sIGlmcmFtZUxvYWRlZDpmdW5jdGlvbiAoZXZ0LCBpZnJMb2MpIHsKKwlpZiAoIWRvam8ucmVuZGVyLmh0bWwub3BlcmEpIHsKKwkJdmFyIHF1ZXJ5ID0gdGhpcy5fZ2V0VXJsUXVlcnkoaWZyTG9jLmhyZWYpOworCQlpZiAocXVlcnkgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAxKSB7CisJCQkJdGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHRoaXMubW92ZUZvcndhcmQpIHsKKwkJCXRoaXMubW92ZUZvcndhcmQgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID49IDIgJiYgcXVlcnkgPT0gdGhpcy5fZ2V0VXJsUXVlcnkodGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIC0gMl0udXJsKSkgeworCQkJdGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoID4gMCAmJiBxdWVyeSA9PSB0aGlzLl9nZXRVcmxRdWVyeSh0aGlzLmZvcndhcmRTdGFja1t0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggLSAxXS51cmwpKSB7CisJCQkJdGhpcy5oYW5kbGVGb3J3YXJkQnV0dG9uKCk7CisJCQl9CisJCX0KKwl9Cit9LCBoYW5kbGVCYWNrQnV0dG9uOmZ1bmN0aW9uICgpIHsKKwl2YXIgY3VycmVudCA9IHRoaXMuaGlzdG9yeVN0YWNrLnBvcCgpOworCWlmICghY3VycmVudCkgeworCQlyZXR1cm47CisJfQorCXZhciBsYXN0ID0gdGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIC0gMV07CisJaWYgKCFsYXN0ICYmIHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAwKSB7CisJCWxhc3QgPSB0aGlzLmluaXRpYWxTdGF0ZTsKKwl9CisJaWYgKGxhc3QpIHsKKwkJaWYgKGxhc3Qua3dBcmdzWyJiYWNrIl0pIHsKKwkJCWxhc3Qua3dBcmdzWyJiYWNrIl0oKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsYXN0Lmt3QXJnc1siYmFja0J1dHRvbiJdKSB7CisJCQkJbGFzdC5rd0FyZ3NbImJhY2tCdXR0b24iXSgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGFzdC5rd0FyZ3NbImhhbmRsZSJdKSB7CisJCQkJCWxhc3Qua3dBcmdzLmhhbmRsZSgiYmFjayIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl0aGlzLmZvcndhcmRTdGFjay5wdXNoKGN1cnJlbnQpOworfSwgaGFuZGxlRm9yd2FyZEJ1dHRvbjpmdW5jdGlvbiAoKSB7CisJdmFyIGxhc3QgPSB0aGlzLmZvcndhcmRTdGFjay5wb3AoKTsKKwlpZiAoIWxhc3QpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAobGFzdC5rd0FyZ3NbImZvcndhcmQiXSkgeworCQlsYXN0Lmt3QXJncy5mb3J3YXJkKCk7CisJfSBlbHNlIHsKKwkJaWYgKGxhc3Qua3dBcmdzWyJmb3J3YXJkQnV0dG9uIl0pIHsKKwkJCWxhc3Qua3dBcmdzLmZvcndhcmRCdXR0b24oKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsYXN0Lmt3QXJnc1siaGFuZGxlIl0pIHsKKwkJCQlsYXN0Lmt3QXJncy5oYW5kbGUoImZvcndhcmQiKTsKKwkJCX0KKwkJfQorCX0KKwl0aGlzLmhpc3RvcnlTdGFjay5wdXNoKGxhc3QpOworfSwgX2NyZWF0ZVN0YXRlOmZ1bmN0aW9uICh1cmwsIGFyZ3MsIGhhc2gpIHsKKwlyZXR1cm4geyJ1cmwiOnVybCwgImt3QXJncyI6YXJncywgInVybEhhc2giOmhhc2h9OworfSwgX2dldFVybFF1ZXJ5OmZ1bmN0aW9uICh1cmwpIHsKKwl2YXIgc2VnbWVudHMgPSB1cmwuc3BsaXQoIj8iKTsKKwlpZiAoc2VnbWVudHMubGVuZ3RoIDwgMikgeworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCQlyZXR1cm4gc2VnbWVudHNbMV07CisJfQorfSwgX2xvYWRJZnJhbWVIaXN0b3J5OmZ1bmN0aW9uICgpIHsKKwl2YXIgdXJsID0gKGRqQ29uZmlnWyJkb2pvSWZyYW1lSGlzdG9yeVVybCJdIHx8IGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCkgKyAiaWZyYW1lX2hpc3RvcnkuaHRtbCIpICsgIj8iICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwl0aGlzLm1vdmVGb3J3YXJkID0gdHJ1ZTsKKwlkb2pvLmlvLnNldElGcmFtZVNyYyh0aGlzLmhpc3RvcnlJZnJhbWUsIHVybCwgZmFsc2UpOworCXJldHVybiB1cmw7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VyaS9VcmkuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXJpL1VyaS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVhNmJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VyaS9VcmkuanMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udXJpLlVyaSIpOworZG9qby51cmkgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuZG9qb1VyaSA9IGZ1bmN0aW9uICh1cmkpIHsKKwkJcmV0dXJuIG5ldyBkb2pvLnVyaS5VcmkoZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKSwgdXJpKTsKKwl9OworCXRoaXMubW9kdWxlVXJpID0gZnVuY3Rpb24gKG1vZHVsZSwgdXJpKSB7CisJCXZhciBsb2MgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGUpLmpvaW4oIi8iKTsKKwkJaWYgKCFsb2MpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChsb2MubGFzdEluZGV4T2YoIi8iKSAhPSBsb2MubGVuZ3RoIC0gMSkgeworCQkJbG9jICs9ICIvIjsKKwkJfQorCQl2YXIgY29sb25JbmRleCA9IGxvYy5pbmRleE9mKCI6Iik7CisJCXZhciBzbGFzaEluZGV4ID0gbG9jLmluZGV4T2YoIi8iKTsKKwkJaWYgKGxvYy5jaGFyQXQoMCkgIT0gIi8iICYmIChjb2xvbkluZGV4ID09IC0xIHx8IGNvbG9uSW5kZXggPiBzbGFzaEluZGV4KSkgeworCQkJbG9jID0gZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKSArIGxvYzsKKwkJfQorCQlyZXR1cm4gbmV3IGRvam8udXJpLlVyaShsb2MsIHVyaSk7CisJfTsKKwl0aGlzLlVyaSA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIHVyaSA9IGFyZ3VtZW50c1swXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICghYXJndW1lbnRzW2ldKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl2YXIgcmVsb2JqID0gbmV3IGRvam8udXJpLlVyaShhcmd1bWVudHNbaV0udG9TdHJpbmcoKSk7CisJCQl2YXIgdXJpb2JqID0gbmV3IGRvam8udXJpLlVyaSh1cmkudG9TdHJpbmcoKSk7CisJCQlpZiAoKHJlbG9iai5wYXRoID09ICIiKSAmJiAocmVsb2JqLnNjaGVtZSA9PSBudWxsKSAmJiAocmVsb2JqLmF1dGhvcml0eSA9PSBudWxsKSAmJiAocmVsb2JqLnF1ZXJ5ID09IG51bGwpKSB7CisJCQkJaWYgKHJlbG9iai5mcmFnbWVudCAhPSBudWxsKSB7CisJCQkJCXVyaW9iai5mcmFnbWVudCA9IHJlbG9iai5mcmFnbWVudDsKKwkJCQl9CisJCQkJcmVsb2JqID0gdXJpb2JqOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVsb2JqLnNjaGVtZSA9PSBudWxsKSB7CisJCQkJCXJlbG9iai5zY2hlbWUgPSB1cmlvYmouc2NoZW1lOworCQkJCQlpZiAocmVsb2JqLmF1dGhvcml0eSA9PSBudWxsKSB7CisJCQkJCQlyZWxvYmouYXV0aG9yaXR5ID0gdXJpb2JqLmF1dGhvcml0eTsKKwkJCQkJCWlmIChyZWxvYmoucGF0aC5jaGFyQXQoMCkgIT0gIi8iKSB7CisJCQkJCQkJdmFyIHBhdGggPSB1cmlvYmoucGF0aC5zdWJzdHJpbmcoMCwgdXJpb2JqLnBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpICsgcmVsb2JqLnBhdGg7CisJCQkJCQkJdmFyIHNlZ3MgPSBwYXRoLnNwbGl0KCIvIik7CisJCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBzZWdzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJCWlmIChzZWdzW2pdID09ICIuIikgeworCQkJCQkJCQkJaWYgKGogPT0gc2Vncy5sZW5ndGggLSAxKSB7CisJCQkJCQkJCQkJc2Vnc1tqXSA9ICIiOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlzZWdzLnNwbGljZShqLCAxKTsKKwkJCQkJCQkJCQlqLS07CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAoaiA+IDAgJiYgIShqID09IDEgJiYgc2Vnc1swXSA9PSAiIikgJiYgc2Vnc1tqXSA9PSAiLi4iICYmIHNlZ3NbaiAtIDFdICE9ICIuLiIpIHsKKwkJCQkJCQkJCQlpZiAoaiA9PSBzZWdzLmxlbmd0aCAtIDEpIHsKKwkJCQkJCQkJCQkJc2Vncy5zcGxpY2UoaiwgMSk7CisJCQkJCQkJCQkJCXNlZ3NbaiAtIDFdID0gIiI7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJc2Vncy5zcGxpY2UoaiAtIDEsIDIpOworCQkJCQkJCQkJCQlqIC09IDI7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXJlbG9iai5wYXRoID0gc2Vncy5qb2luKCIvIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl1cmkgPSAiIjsKKwkJCWlmIChyZWxvYmouc2NoZW1lICE9IG51bGwpIHsKKwkJCQl1cmkgKz0gcmVsb2JqLnNjaGVtZSArICI6IjsKKwkJCX0KKwkJCWlmIChyZWxvYmouYXV0aG9yaXR5ICE9IG51bGwpIHsKKwkJCQl1cmkgKz0gIi8vIiArIHJlbG9iai5hdXRob3JpdHk7CisJCQl9CisJCQl1cmkgKz0gcmVsb2JqLnBhdGg7CisJCQlpZiAocmVsb2JqLnF1ZXJ5ICE9IG51bGwpIHsKKwkJCQl1cmkgKz0gIj8iICsgcmVsb2JqLnF1ZXJ5OworCQkJfQorCQkJaWYgKHJlbG9iai5mcmFnbWVudCAhPSBudWxsKSB7CisJCQkJdXJpICs9ICIjIiArIHJlbG9iai5mcmFnbWVudDsKKwkJCX0KKwkJfQorCQl0aGlzLnVyaSA9IHVyaS50b1N0cmluZygpOworCQl2YXIgcmVnZXhwID0gIl4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kIjsKKwkJdmFyIHIgPSB0aGlzLnVyaS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCQl0aGlzLnNjaGVtZSA9IHJbMl0gfHwgKHJbMV0gPyAiIiA6IG51bGwpOworCQl0aGlzLmF1dGhvcml0eSA9IHJbNF0gfHwgKHJbM10gPyAiIiA6IG51bGwpOworCQl0aGlzLnBhdGggPSByWzVdOworCQl0aGlzLnF1ZXJ5ID0gcls3XSB8fCAocls2XSA/ICIiIDogbnVsbCk7CisJCXRoaXMuZnJhZ21lbnQgPSByWzldIHx8IChyWzhdID8gIiIgOiBudWxsKTsKKwkJaWYgKHRoaXMuYXV0aG9yaXR5ICE9IG51bGwpIHsKKwkJCXJlZ2V4cCA9ICJeKCgoW146XSs6KT8oW15AXSspKUApPyhbXjpdKikoOihbMC05XSspKT8kIjsKKwkJCXIgPSB0aGlzLmF1dGhvcml0eS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCQkJdGhpcy51c2VyID0gclszXSB8fCBudWxsOworCQkJdGhpcy5wYXNzd29yZCA9IHJbNF0gfHwgbnVsbDsKKwkJCXRoaXMuaG9zdCA9IHJbNV07CisJCQl0aGlzLnBvcnQgPSByWzddIHx8IG51bGw7CisJCX0KKwkJdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKwkJCXJldHVybiB0aGlzLnVyaTsKKwkJfTsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3VyaS9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91cmkvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0Y2UzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91cmkvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbWyJkb2pvLnVyaS5VcmkiLCBmYWxzZSwgZmFsc2VdXX0pOworZG9qby5wcm92aWRlKCJkb2pvLnVyaS4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91cmkvY2FjaGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXJpL2NhY2hlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXJpL2NhY2hlLmpzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udXJpLmNhY2hlIik7Citkb2pvLnVyaS5jYWNoZSA9IHtfY2FjaGU6e30sIHNldDpmdW5jdGlvbiAodXJpLCBjb250ZW50KSB7CisJdGhpcy5fY2FjaGVbdXJpLnRvU3RyaW5nKCldID0gY29udGVudDsKKwlyZXR1cm4gdXJpOworfSwgcmVtb3ZlOmZ1bmN0aW9uICh1cmkpIHsKKwlkZWxldGUgdGhpcy5fY2FjaGVbdXJpLnRvU3RyaW5nKCldOworfSwgZ2V0OmZ1bmN0aW9uICh1cmkpIHsKKwl2YXIga2V5ID0gdXJpLnRvU3RyaW5nKCk7CisJdmFyIHZhbHVlID0gdGhpcy5fY2FjaGVba2V5XTsKKwlpZiAoIXZhbHVlKSB7CisJCXZhbHVlID0gZG9qby5ob3N0ZW52LmdldFRleHQoa2V5KTsKKwkJaWYgKHZhbHVlKSB7CisJCQl0aGlzLl9jYWNoZVtrZXldID0gdmFsdWU7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlOworfSwgYWxsb3c6ZnVuY3Rpb24gKHVyaSkgeworCXJldHVybiB1cmk7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvTGlnaHR3ZWlnaHRHZW5lcmF0b3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXVpZC9MaWdodHdlaWdodEdlbmVyYXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGNiNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvTGlnaHR3ZWlnaHRHZW5lcmF0b3IuanMKQEAgLTAsMCArMSw0MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby51dWlkLkxpZ2h0d2VpZ2h0R2VuZXJhdG9yIik7Citkb2pvLnV1aWQuTGlnaHR3ZWlnaHRHZW5lcmF0b3IgPSBuZXcgZnVuY3Rpb24gKCkgeworCXZhciBIRVhfUkFESVggPSAxNjsKKwlmdW5jdGlvbiBfZ2VuZXJhdGVSYW5kb21FaWdodENoYXJhY3RlckhleFN0cmluZygpIHsKKwkJdmFyIHJhbmRvbTMyYml0TnVtYmVyID0gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAlIDEpICogTWF0aC5wb3coMiwgMzIpKTsKKwkJdmFyIGVpZ2h0Q2hhcmFjdGVySGV4U3RyaW5nID0gcmFuZG9tMzJiaXROdW1iZXIudG9TdHJpbmcoSEVYX1JBRElYKTsKKwkJd2hpbGUgKGVpZ2h0Q2hhcmFjdGVySGV4U3RyaW5nLmxlbmd0aCA8IDgpIHsKKwkJCWVpZ2h0Q2hhcmFjdGVySGV4U3RyaW5nID0gIjAiICsgZWlnaHRDaGFyYWN0ZXJIZXhTdHJpbmc7CisJCX0KKwkJcmV0dXJuIGVpZ2h0Q2hhcmFjdGVySGV4U3RyaW5nOworCX0KKwl0aGlzLmdlbmVyYXRlID0gZnVuY3Rpb24gKHJldHVyblR5cGUpIHsKKwkJdmFyIGh5cGhlbiA9ICItIjsKKwkJdmFyIHZlcnNpb25Db2RlRm9yUmFuZG9tbHlHZW5lcmF0ZWRVdWlkcyA9ICI0IjsKKwkJdmFyIHZhcmlhbnRDb2RlRm9yRENFVXVpZHMgPSAiOCI7CisJCXZhciBhID0gX2dlbmVyYXRlUmFuZG9tRWlnaHRDaGFyYWN0ZXJIZXhTdHJpbmcoKTsKKwkJdmFyIGIgPSBfZ2VuZXJhdGVSYW5kb21FaWdodENoYXJhY3RlckhleFN0cmluZygpOworCQliID0gYi5zdWJzdHJpbmcoMCwgNCkgKyBoeXBoZW4gKyB2ZXJzaW9uQ29kZUZvclJhbmRvbWx5R2VuZXJhdGVkVXVpZHMgKyBiLnN1YnN0cmluZyg1LCA4KTsKKwkJdmFyIGMgPSBfZ2VuZXJhdGVSYW5kb21FaWdodENoYXJhY3RlckhleFN0cmluZygpOworCQljID0gdmFyaWFudENvZGVGb3JEQ0VVdWlkcyArIGMuc3Vic3RyaW5nKDEsIDQpICsgaHlwaGVuICsgYy5zdWJzdHJpbmcoNCwgOCk7CisJCXZhciBkID0gX2dlbmVyYXRlUmFuZG9tRWlnaHRDaGFyYWN0ZXJIZXhTdHJpbmcoKTsKKwkJdmFyIHJldHVyblZhbHVlID0gYSArIGh5cGhlbiArIGIgKyBoeXBoZW4gKyBjICsgZDsKKwkJcmV0dXJuVmFsdWUgPSByZXR1cm5WYWx1ZS50b0xvd2VyQ2FzZSgpOworCQlpZiAocmV0dXJuVHlwZSAmJiAocmV0dXJuVHlwZSAhPSBTdHJpbmcpKSB7CisJCQlyZXR1cm5WYWx1ZSA9IG5ldyByZXR1cm5UeXBlKHJldHVyblZhbHVlKTsKKwkJfQorCQlyZXR1cm4gcmV0dXJuVmFsdWU7CisJfTsKK30oKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvTmFtZUJhc2VkR2VuZXJhdG9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvTmFtZUJhc2VkR2VuZXJhdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTA3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXVpZC9OYW1lQmFzZWRHZW5lcmF0b3IuanMKQEAgLTAsMCArMSwyNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby51dWlkLk5hbWVCYXNlZEdlbmVyYXRvciIpOworZG9qby51dWlkLk5hbWVCYXNlZEdlbmVyYXRvciA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5nZW5lcmF0ZSA9IGZ1bmN0aW9uIChyZXR1cm5UeXBlKSB7CisJCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby51dWlkLk5hbWVCYXNlZEdlbmVyYXRvci5nZW5lcmF0ZSIpOworCQl2YXIgcmV0dXJuVmFsdWUgPSAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIjsKKwkJaWYgKHJldHVyblR5cGUgJiYgKHJldHVyblR5cGUgIT0gU3RyaW5nKSkgeworCQkJcmV0dXJuVmFsdWUgPSBuZXcgcmV0dXJuVHlwZShyZXR1cm5WYWx1ZSk7CisJCX0KKwkJcmV0dXJuIHJldHVyblZhbHVlOworCX07Cit9KCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL05pbEdlbmVyYXRvci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL05pbEdlbmVyYXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZkNmNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvTmlsR2VuZXJhdG9yLmpzCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udXVpZC5OaWxHZW5lcmF0b3IiKTsKK2Rvam8udXVpZC5OaWxHZW5lcmF0b3IgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuZ2VuZXJhdGUgPSBmdW5jdGlvbiAocmV0dXJuVHlwZSkgeworCQl2YXIgcmV0dXJuVmFsdWUgPSAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIjsKKwkJaWYgKHJldHVyblR5cGUgJiYgKHJldHVyblR5cGUgIT0gU3RyaW5nKSkgeworCQkJcmV0dXJuVmFsdWUgPSBuZXcgcmV0dXJuVHlwZShyZXR1cm5WYWx1ZSk7CisJCX0KKwkJcmV0dXJuIHJldHVyblZhbHVlOworCX07Cit9KCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL1JhbmRvbUdlbmVyYXRvci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL1JhbmRvbUdlbmVyYXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFiODFjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvUmFuZG9tR2VuZXJhdG9yLmpzCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udXVpZC5SYW5kb21HZW5lcmF0b3IiKTsKK2Rvam8udXVpZC5SYW5kb21HZW5lcmF0b3IgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuZ2VuZXJhdGUgPSBmdW5jdGlvbiAocmV0dXJuVHlwZSkgeworCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8udXVpZC5SYW5kb21HZW5lcmF0b3IuZ2VuZXJhdGUiKTsKKwkJdmFyIHJldHVyblZhbHVlID0gIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCI7CisJCWlmIChyZXR1cm5UeXBlICYmIChyZXR1cm5UeXBlICE9IFN0cmluZykpIHsKKwkJCXJldHVyblZhbHVlID0gbmV3IHJldHVyblR5cGUocmV0dXJuVmFsdWUpOworCQl9CisJCXJldHVybiByZXR1cm5WYWx1ZTsKKwl9OworfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXVpZC9UaW1lQmFzZWRHZW5lcmF0b3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXVpZC9UaW1lQmFzZWRHZW5lcmF0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjZmFmZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL1RpbWVCYXNlZEdlbmVyYXRvci5qcwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby51dWlkLlRpbWVCYXNlZEdlbmVyYXRvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy50eXBlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8udXVpZC5UaW1lQmFzZWRHZW5lcmF0b3IgPSBuZXcgZnVuY3Rpb24gKCkgeworCXRoaXMuR1JFR09SSUFOX0NIQU5HRV9PRkZTRVRfSU5fSE9VUlMgPSAzMzk0MjQ4OworCXZhciBfdXVpZFBzZXVkb05vZGVTdHJpbmcgPSBudWxsOworCXZhciBfdXVpZENsb2NrU2VxU3RyaW5nID0gbnVsbDsKKwl2YXIgX2RhdGVWYWx1ZU9mUHJldmlvdXNVdWlkID0gbnVsbDsKKwl2YXIgX25leHRJbnRyYU1pbGxpc2Vjb25kSW5jcmVtZW50ID0gMDsKKwl2YXIgX2NhY2hlZE1pbGxpc2Vjb25kc0JldHdlZW4xNTgyYW5kMTk3MCA9IG51bGw7CisJdmFyIF9jYWNoZWRIdW5kcmVkTmFub3NlY29uZEludGVydmFsc1Blck1pbGxpc2Vjb25kID0gbnVsbDsKKwl2YXIgX3VuaWZvcm1Ob2RlID0gbnVsbDsKKwl2YXIgSEVYX1JBRElYID0gMTY7CisJZnVuY3Rpb24gX2NhcnJ5KGFycmF5QSkgeworCQlhcnJheUFbMl0gKz0gYXJyYXlBWzNdID4+PiAxNjsKKwkJYXJyYXlBWzNdICY9IDY1NTM1OworCQlhcnJheUFbMV0gKz0gYXJyYXlBWzJdID4+PiAxNjsKKwkJYXJyYXlBWzJdICY9IDY1NTM1OworCQlhcnJheUFbMF0gKz0gYXJyYXlBWzFdID4+PiAxNjsKKwkJYXJyYXlBWzFdICY9IDY1NTM1OworCQlkb2pvLmxhbmcuYXNzZXJ0KChhcnJheUFbMF0gPj4+IDE2KSA9PT0gMCk7CisJfQorCWZ1bmN0aW9uIF9nZXQ2NGJpdEFycmF5RnJvbUZsb2F0KHgpIHsKKwkJdmFyIHJlc3VsdCA9IG5ldyBBcnJheSgwLCAwLCAwLCAwKTsKKwkJcmVzdWx0WzNdID0geCAlIDY1NTM2OworCQl4IC09IHJlc3VsdFszXTsKKwkJeCAvPSA2NTUzNjsKKwkJcmVzdWx0WzJdID0geCAlIDY1NTM2OworCQl4IC09IHJlc3VsdFsyXTsKKwkJeCAvPSA2NTUzNjsKKwkJcmVzdWx0WzFdID0geCAlIDY1NTM2OworCQl4IC09IHJlc3VsdFsxXTsKKwkJeCAvPSA2NTUzNjsKKwkJcmVzdWx0WzBdID0geDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJZnVuY3Rpb24gX2FkZFR3bzY0Yml0QXJyYXlzKGFycmF5QSwgYXJyYXlCKSB7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGFycmF5QSwgQXJyYXkpOworCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhcnJheUIsIEFycmF5KTsKKwkJZG9qby5sYW5nLmFzc2VydChhcnJheUEubGVuZ3RoID09IDQpOworCQlkb2pvLmxhbmcuYXNzZXJ0KGFycmF5Qi5sZW5ndGggPT0gNCk7CisJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkoMCwgMCwgMCwgMCk7CisJCXJlc3VsdFszXSA9IGFycmF5QVszXSArIGFycmF5QlszXTsKKwkJcmVzdWx0WzJdID0gYXJyYXlBWzJdICsgYXJyYXlCWzJdOworCQlyZXN1bHRbMV0gPSBhcnJheUFbMV0gKyBhcnJheUJbMV07CisJCXJlc3VsdFswXSA9IGFycmF5QVswXSArIGFycmF5QlswXTsKKwkJX2NhcnJ5KHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWZ1bmN0aW9uIF9tdWx0aXBseVR3bzY0Yml0QXJyYXlzKGFycmF5QSwgYXJyYXlCKSB7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKGFycmF5QSwgQXJyYXkpOworCQlkb2pvLmxhbmcuYXNzZXJ0VHlwZShhcnJheUIsIEFycmF5KTsKKwkJZG9qby5sYW5nLmFzc2VydChhcnJheUEubGVuZ3RoID09IDQpOworCQlkb2pvLmxhbmcuYXNzZXJ0KGFycmF5Qi5sZW5ndGggPT0gNCk7CisJCXZhciBvdmVyZmxvdyA9IGZhbHNlOworCQlpZiAoYXJyYXlBWzBdICogYXJyYXlCWzBdICE9PSAwKSB7CisJCQlvdmVyZmxvdyA9IHRydWU7CisJCX0KKwkJaWYgKGFycmF5QVswXSAqIGFycmF5QlsxXSAhPT0gMCkgeworCQkJb3ZlcmZsb3cgPSB0cnVlOworCQl9CisJCWlmIChhcnJheUFbMF0gKiBhcnJheUJbMl0gIT09IDApIHsKKwkJCW92ZXJmbG93ID0gdHJ1ZTsKKwkJfQorCQlpZiAoYXJyYXlBWzFdICogYXJyYXlCWzBdICE9PSAwKSB7CisJCQlvdmVyZmxvdyA9IHRydWU7CisJCX0KKwkJaWYgKGFycmF5QVsxXSAqIGFycmF5QlsxXSAhPT0gMCkgeworCQkJb3ZlcmZsb3cgPSB0cnVlOworCQl9CisJCWlmIChhcnJheUFbMl0gKiBhcnJheUJbMF0gIT09IDApIHsKKwkJCW92ZXJmbG93ID0gdHJ1ZTsKKwkJfQorCQlkb2pvLmxhbmcuYXNzZXJ0KCFvdmVyZmxvdyk7CisJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkoMCwgMCwgMCwgMCk7CisJCXJlc3VsdFswXSArPSBhcnJheUFbMF0gKiBhcnJheUJbM107CisJCV9jYXJyeShyZXN1bHQpOworCQlyZXN1bHRbMF0gKz0gYXJyYXlBWzFdICogYXJyYXlCWzJdOworCQlfY2FycnkocmVzdWx0KTsKKwkJcmVzdWx0WzBdICs9IGFycmF5QVsyXSAqIGFycmF5QlsxXTsKKwkJX2NhcnJ5KHJlc3VsdCk7CisJCXJlc3VsdFswXSArPSBhcnJheUFbM10gKiBhcnJheUJbMF07CisJCV9jYXJyeShyZXN1bHQpOworCQlyZXN1bHRbMV0gKz0gYXJyYXlBWzFdICogYXJyYXlCWzNdOworCQlfY2FycnkocmVzdWx0KTsKKwkJcmVzdWx0WzFdICs9IGFycmF5QVsyXSAqIGFycmF5QlsyXTsKKwkJX2NhcnJ5KHJlc3VsdCk7CisJCXJlc3VsdFsxXSArPSBhcnJheUFbM10gKiBhcnJheUJbMV07CisJCV9jYXJyeShyZXN1bHQpOworCQlyZXN1bHRbMl0gKz0gYXJyYXlBWzJdICogYXJyYXlCWzNdOworCQlfY2FycnkocmVzdWx0KTsKKwkJcmVzdWx0WzJdICs9IGFycmF5QVszXSAqIGFycmF5QlsyXTsKKwkJX2NhcnJ5KHJlc3VsdCk7CisJCXJlc3VsdFszXSArPSBhcnJheUFbM10gKiBhcnJheUJbM107CisJCV9jYXJyeShyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlmdW5jdGlvbiBfcGFkV2l0aExlYWRpbmdaZXJvcyhzdHJpbmcsIGRlc2lyZWRMZW5ndGgpIHsKKwkJd2hpbGUgKHN0cmluZy5sZW5ndGggPCBkZXNpcmVkTGVuZ3RoKSB7CisJCQlzdHJpbmcgPSAiMCIgKyBzdHJpbmc7CisJCX0KKwkJcmV0dXJuIHN0cmluZzsKKwl9CisJZnVuY3Rpb24gX2dlbmVyYXRlUmFuZG9tRWlnaHRDaGFyYWN0ZXJIZXhTdHJpbmcoKSB7CisJCXZhciByYW5kb20zMmJpdE51bWJlciA9IE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgJSAxKSAqIE1hdGgucG93KDIsIDMyKSk7CisJCXZhciBlaWdodENoYXJhY3RlclN0cmluZyA9IHJhbmRvbTMyYml0TnVtYmVyLnRvU3RyaW5nKEhFWF9SQURJWCk7CisJCXdoaWxlIChlaWdodENoYXJhY3RlclN0cmluZy5sZW5ndGggPCA4KSB7CisJCQllaWdodENoYXJhY3RlclN0cmluZyA9ICIwIiArIGVpZ2h0Q2hhcmFjdGVyU3RyaW5nOworCQl9CisJCXJldHVybiBlaWdodENoYXJhY3RlclN0cmluZzsKKwl9CisJZnVuY3Rpb24gX2dlbmVyYXRlVXVpZFN0cmluZyhub2RlKSB7CisJCWRvam8ubGFuZy5hc3NlcnRUeXBlKG5vZGUsIFN0cmluZywge29wdGlvbmFsOnRydWV9KTsKKwkJaWYgKG5vZGUpIHsKKwkJCWRvam8ubGFuZy5hc3NlcnQobm9kZS5sZW5ndGggPT0gMTIpOworCQl9IGVsc2UgeworCQkJaWYgKF91bmlmb3JtTm9kZSkgeworCQkJCW5vZGUgPSBfdW5pZm9ybU5vZGU7CisJCQl9IGVsc2UgeworCQkJCWlmICghX3V1aWRQc2V1ZG9Ob2RlU3RyaW5nKSB7CisJCQkJCXZhciBwc2V1ZG9Ob2RlSW5kaWNhdG9yQml0ID0gMzI3Njg7CisJCQkJCXZhciByYW5kb20xNWJpdE51bWJlciA9IE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgJSAxKSAqIE1hdGgucG93KDIsIDE1KSk7CisJCQkJCXZhciBsZWZ0bW9zdDRIZXhDaGFyYWN0ZXJzID0gKHBzZXVkb05vZGVJbmRpY2F0b3JCaXQgfCByYW5kb20xNWJpdE51bWJlcikudG9TdHJpbmcoSEVYX1JBRElYKTsKKwkJCQkJX3V1aWRQc2V1ZG9Ob2RlU3RyaW5nID0gbGVmdG1vc3Q0SGV4Q2hhcmFjdGVycyArIF9nZW5lcmF0ZVJhbmRvbUVpZ2h0Q2hhcmFjdGVySGV4U3RyaW5nKCk7CisJCQkJfQorCQkJCW5vZGUgPSBfdXVpZFBzZXVkb05vZGVTdHJpbmc7CisJCQl9CisJCX0KKwkJaWYgKCFfdXVpZENsb2NrU2VxU3RyaW5nKSB7CisJCQl2YXIgdmFyaWFudENvZGVGb3JEQ0VVdWlkcyA9IDMyNzY4OworCQkJdmFyIHJhbmRvbTE0Yml0TnVtYmVyID0gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAlIDEpICogTWF0aC5wb3coMiwgMTQpKTsKKwkJCV91dWlkQ2xvY2tTZXFTdHJpbmcgPSAodmFyaWFudENvZGVGb3JEQ0VVdWlkcyB8IHJhbmRvbTE0Yml0TnVtYmVyKS50b1N0cmluZyhIRVhfUkFESVgpOworCQl9CisJCXZhciBub3cgPSBuZXcgRGF0ZSgpOworCQl2YXIgbWlsbGlzZWNvbmRzU2luY2UxOTcwID0gbm93LnZhbHVlT2YoKTsKKwkJdmFyIG5vd0FycmF5ID0gX2dldDY0Yml0QXJyYXlGcm9tRmxvYXQobWlsbGlzZWNvbmRzU2luY2UxOTcwKTsKKwkJaWYgKCFfY2FjaGVkTWlsbGlzZWNvbmRzQmV0d2VlbjE1ODJhbmQxOTcwKSB7CisJCQl2YXIgYXJyYXlTZWNvbmRzUGVySG91ciA9IF9nZXQ2NGJpdEFycmF5RnJvbUZsb2F0KDYwICogNjApOworCQkJdmFyIGFycmF5SG91cnNCZXR3ZWVuMTU4MmFuZDE5NzAgPSBfZ2V0NjRiaXRBcnJheUZyb21GbG9hdChkb2pvLnV1aWQuVGltZUJhc2VkR2VuZXJhdG9yLkdSRUdPUklBTl9DSEFOR0VfT0ZGU0VUX0lOX0hPVVJTKTsKKwkJCXZhciBhcnJheVNlY29uZHNCZXR3ZWVuMTU4MmFuZDE5NzAgPSBfbXVsdGlwbHlUd282NGJpdEFycmF5cyhhcnJheUhvdXJzQmV0d2VlbjE1ODJhbmQxOTcwLCBhcnJheVNlY29uZHNQZXJIb3VyKTsKKwkJCXZhciBhcnJheU1pbGxpc2Vjb25kc1BlclNlY29uZCA9IF9nZXQ2NGJpdEFycmF5RnJvbUZsb2F0KDEwMDApOworCQkJX2NhY2hlZE1pbGxpc2Vjb25kc0JldHdlZW4xNTgyYW5kMTk3MCA9IF9tdWx0aXBseVR3bzY0Yml0QXJyYXlzKGFycmF5U2Vjb25kc0JldHdlZW4xNTgyYW5kMTk3MCwgYXJyYXlNaWxsaXNlY29uZHNQZXJTZWNvbmQpOworCQkJX2NhY2hlZEh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzUGVyTWlsbGlzZWNvbmQgPSBfZ2V0NjRiaXRBcnJheUZyb21GbG9hdCgxMDAwMCk7CisJCX0KKwkJdmFyIGFycmF5TWlsbGlzZWNvbmRzU2luY2UxOTcwID0gbm93QXJyYXk7CisJCXZhciBhcnJheU1pbGxpc2Vjb25kc1NpbmNlMTU4MiA9IF9hZGRUd282NGJpdEFycmF5cyhfY2FjaGVkTWlsbGlzZWNvbmRzQmV0d2VlbjE1ODJhbmQxOTcwLCBhcnJheU1pbGxpc2Vjb25kc1NpbmNlMTk3MCk7CisJCXZhciBhcnJheUh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyID0gX211bHRpcGx5VHdvNjRiaXRBcnJheXMoYXJyYXlNaWxsaXNlY29uZHNTaW5jZTE1ODIsIF9jYWNoZWRIdW5kcmVkTmFub3NlY29uZEludGVydmFsc1Blck1pbGxpc2Vjb25kKTsKKwkJaWYgKG5vdy52YWx1ZU9mKCkgPT0gX2RhdGVWYWx1ZU9mUHJldmlvdXNVdWlkKSB7CisJCQlhcnJheUh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyWzNdICs9IF9uZXh0SW50cmFNaWxsaXNlY29uZEluY3JlbWVudDsKKwkJCV9jYXJyeShhcnJheUh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyKTsKKwkJCV9uZXh0SW50cmFNaWxsaXNlY29uZEluY3JlbWVudCArPSAxOworCQkJaWYgKF9uZXh0SW50cmFNaWxsaXNlY29uZEluY3JlbWVudCA9PSAxMDAwMCkgeworCQkJCXdoaWxlIChub3cudmFsdWVPZigpID09IF9kYXRlVmFsdWVPZlByZXZpb3VzVXVpZCkgeworCQkJCQlub3cgPSBuZXcgRGF0ZSgpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCV9kYXRlVmFsdWVPZlByZXZpb3VzVXVpZCA9IG5vdy52YWx1ZU9mKCk7CisJCQlfbmV4dEludHJhTWlsbGlzZWNvbmRJbmNyZW1lbnQgPSAxOworCQl9CisJCXZhciBoZXhUaW1lTG93TGVmdEhhbGYgPSBhcnJheUh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyWzJdLnRvU3RyaW5nKEhFWF9SQURJWCk7CisJCXZhciBoZXhUaW1lTG93UmlnaHRIYWxmID0gYXJyYXlIdW5kcmVkTmFub3NlY29uZEludGVydmFsc1NpbmNlMTU4MlszXS50b1N0cmluZyhIRVhfUkFESVgpOworCQl2YXIgaGV4VGltZUxvdyA9IF9wYWRXaXRoTGVhZGluZ1plcm9zKGhleFRpbWVMb3dMZWZ0SGFsZiwgNCkgKyBfcGFkV2l0aExlYWRpbmdaZXJvcyhoZXhUaW1lTG93UmlnaHRIYWxmLCA0KTsKKwkJdmFyIGhleFRpbWVNaWQgPSBhcnJheUh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyWzFdLnRvU3RyaW5nKEhFWF9SQURJWCk7CisJCWhleFRpbWVNaWQgPSBfcGFkV2l0aExlYWRpbmdaZXJvcyhoZXhUaW1lTWlkLCA0KTsKKwkJdmFyIGhleFRpbWVIaWdoID0gYXJyYXlIdW5kcmVkTmFub3NlY29uZEludGVydmFsc1NpbmNlMTU4MlswXS50b1N0cmluZyhIRVhfUkFESVgpOworCQloZXhUaW1lSGlnaCA9IF9wYWRXaXRoTGVhZGluZ1plcm9zKGhleFRpbWVIaWdoLCAzKTsKKwkJdmFyIGh5cGhlbiA9ICItIjsKKwkJdmFyIHZlcnNpb25Db2RlRm9yVGltZUJhc2VkVXVpZHMgPSAiMSI7CisJCXZhciByZXN1bHRVdWlkID0gaGV4VGltZUxvdyArIGh5cGhlbiArIGhleFRpbWVNaWQgKyBoeXBoZW4gKyB2ZXJzaW9uQ29kZUZvclRpbWVCYXNlZFV1aWRzICsgaGV4VGltZUhpZ2ggKyBoeXBoZW4gKyBfdXVpZENsb2NrU2VxU3RyaW5nICsgaHlwaGVuICsgbm9kZTsKKwkJcmVzdWx0VXVpZCA9IHJlc3VsdFV1aWQudG9Mb3dlckNhc2UoKTsKKwkJcmV0dXJuIHJlc3VsdFV1aWQ7CisJfQorCXRoaXMuc2V0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJCWRvam8ubGFuZy5hc3NlcnQoKG5vZGUgPT09IG51bGwpIHx8IChub2RlLmxlbmd0aCA9PSAxMikpOworCQlfdW5pZm9ybU5vZGUgPSBub2RlOworCX07CisJdGhpcy5nZXROb2RlID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gX3VuaWZvcm1Ob2RlOworCX07CisJdGhpcy5nZW5lcmF0ZSA9IGZ1bmN0aW9uIChpbnB1dCkgeworCQl2YXIgbm9kZVN0cmluZyA9IG51bGw7CisJCXZhciByZXR1cm5UeXBlID0gbnVsbDsKKwkJaWYgKGlucHV0KSB7CisJCQlpZiAoZG9qby5sYW5nLmlzT2JqZWN0KGlucHV0KSAmJiAhZG9qby5sYW5nLmlzQnVpbHRJbihpbnB1dCkpIHsKKwkJCQl2YXIgbmFtZWRQYXJhbWV0ZXJzID0gaW5wdXQ7CisJCQkJZG9qby5sYW5nLmFzc2VydFZhbGlkS2V5d29yZHMobmFtZWRQYXJhbWV0ZXJzLCBbIm5vZGUiLCAiaGFyZHdhcmVOb2RlIiwgInBzZXVkb05vZGUiLCAicmV0dXJuVHlwZSJdKTsKKwkJCQl2YXIgbm9kZSA9IG5hbWVkUGFyYW1ldGVyc1sibm9kZSJdOworCQkJCXZhciBoYXJkd2FyZU5vZGUgPSBuYW1lZFBhcmFtZXRlcnNbImhhcmR3YXJlTm9kZSJdOworCQkJCXZhciBwc2V1ZG9Ob2RlID0gbmFtZWRQYXJhbWV0ZXJzWyJwc2V1ZG9Ob2RlIl07CisJCQkJbm9kZVN0cmluZyA9IChub2RlIHx8IHBzZXVkb05vZGUgfHwgaGFyZHdhcmVOb2RlKTsKKwkJCQlpZiAobm9kZVN0cmluZykgeworCQkJCQl2YXIgZmlyc3RDaGFyYWN0ZXIgPSBub2RlU3RyaW5nLmNoYXJBdCgwKTsKKwkJCQkJdmFyIGZpcnN0RGlnaXQgPSBwYXJzZUludChmaXJzdENoYXJhY3RlciwgSEVYX1JBRElYKTsKKwkJCQkJaWYgKGhhcmR3YXJlTm9kZSkgeworCQkJCQkJZG9qby5sYW5nLmFzc2VydCgoZmlyc3REaWdpdCA+PSAwKSAmJiAoZmlyc3REaWdpdCA8PSA3KSk7CisJCQkJCX0KKwkJCQkJaWYgKHBzZXVkb05vZGUpIHsKKwkJCQkJCWRvam8ubGFuZy5hc3NlcnQoKGZpcnN0RGlnaXQgPj0gOCkgJiYgKGZpcnN0RGlnaXQgPD0gMTUpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm5UeXBlID0gbmFtZWRQYXJhbWV0ZXJzWyJyZXR1cm5UeXBlIl07CisJCQkJZG9qby5sYW5nLmFzc2VydFR5cGUocmV0dXJuVHlwZSwgRnVuY3Rpb24sIHtvcHRpb25hbDp0cnVlfSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoaW5wdXQpKSB7CisJCQkJCW5vZGVTdHJpbmcgPSBpbnB1dDsKKwkJCQkJcmV0dXJuVHlwZSA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGlucHV0KSkgeworCQkJCQkJbm9kZVN0cmluZyA9IG51bGw7CisJCQkJCQlyZXR1cm5UeXBlID0gaW5wdXQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobm9kZVN0cmluZykgeworCQkJCWRvam8ubGFuZy5hc3NlcnQobm9kZVN0cmluZy5sZW5ndGggPT0gMTIpOworCQkJCXZhciBpbnRlZ2VyID0gcGFyc2VJbnQobm9kZVN0cmluZywgSEVYX1JBRElYKTsKKwkJCQlkb2pvLmxhbmcuYXNzZXJ0KGlzRmluaXRlKGludGVnZXIpKTsKKwkJCX0KKwkJCWRvam8ubGFuZy5hc3NlcnRUeXBlKHJldHVyblR5cGUsIEZ1bmN0aW9uLCB7b3B0aW9uYWw6dHJ1ZX0pOworCQl9CisJCXZhciB1dWlkU3RyaW5nID0gX2dlbmVyYXRlVXVpZFN0cmluZyhub2RlU3RyaW5nKTsKKwkJdmFyIHJldHVyblZhbHVlOworCQlpZiAocmV0dXJuVHlwZSAmJiAocmV0dXJuVHlwZSAhPSBTdHJpbmcpKSB7CisJCQlyZXR1cm5WYWx1ZSA9IG5ldyByZXR1cm5UeXBlKHV1aWRTdHJpbmcpOworCQl9IGVsc2UgeworCQkJcmV0dXJuVmFsdWUgPSB1dWlkU3RyaW5nOworCQl9CisJCXJldHVybiByZXR1cm5WYWx1ZTsKKwl9OworfSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdXVpZC9VdWlkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvVXVpZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzZDcwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvVXVpZC5qcwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby51dWlkLlV1aWQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXNzZXJ0Iik7Citkb2pvLnV1aWQuVXVpZCA9IGZ1bmN0aW9uIChpbnB1dCkgeworCXRoaXMuX3V1aWRTdHJpbmcgPSBkb2pvLnV1aWQuVXVpZC5OSUxfVVVJRDsKKwlpZiAoaW5wdXQpIHsKKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhpbnB1dCkpIHsKKwkJCXRoaXMuX3V1aWRTdHJpbmcgPSBpbnB1dC50b0xvd2VyQ2FzZSgpOworCQkJZG9qby5sYW5nLmFzc2VydCh0aGlzLmlzVmFsaWQoKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9qby5sYW5nLmlzT2JqZWN0KGlucHV0KSAmJiBpbnB1dC5nZW5lcmF0ZSkgeworCQkJCXZhciBnZW5lcmF0b3IgPSBpbnB1dDsKKwkJCQl0aGlzLl91dWlkU3RyaW5nID0gZ2VuZXJhdG9yLmdlbmVyYXRlKCk7CisJCQkJZG9qby5sYW5nLmFzc2VydCh0aGlzLmlzVmFsaWQoKSk7CisJCQl9IGVsc2UgeworCQkJCWRvam8ubGFuZy5hc3NlcnQoZmFsc2UsICJUaGUgZG9qby51dWlkLlV1aWQoKSBjb25zdHJ1Y3RvciBtdXN0IGJlIGluaXRpYWxpemF0ZWQgd2l0aCBhIFVVSUQgc3RyaW5nLiIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdmFyIG91ckdlbmVyYXRvciA9IGRvam8udXVpZC5VdWlkLmdldEdlbmVyYXRvcigpOworCQlpZiAob3VyR2VuZXJhdG9yKSB7CisJCQl0aGlzLl91dWlkU3RyaW5nID0gb3VyR2VuZXJhdG9yLmdlbmVyYXRlKCk7CisJCQlkb2pvLmxhbmcuYXNzZXJ0KHRoaXMuaXNWYWxpZCgpKTsKKwkJfQorCX0KK307Citkb2pvLnV1aWQuVXVpZC5OSUxfVVVJRCA9ICIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiOworZG9qby51dWlkLlV1aWQuVmVyc2lvbiA9IHtVTktOT1dOOjAsIFRJTUVfQkFTRUQ6MSwgRENFX1NFQ1VSSVRZOjIsIE5BTUVfQkFTRURfTUQ1OjMsIFJBTkRPTTo0LCBOQU1FX0JBU0VEX1NIQTE6NX07Citkb2pvLnV1aWQuVXVpZC5WYXJpYW50ID0ge05DUzoiMCIsIERDRToiMTAiLCBNSUNST1NPRlQ6IjExMCIsIFVOS05PV046IjExMSJ9OworZG9qby51dWlkLlV1aWQuSEVYX1JBRElYID0gMTY7Citkb2pvLnV1aWQuVXVpZC5jb21wYXJlID0gZnVuY3Rpb24gKHV1aWRPbmUsIHV1aWRUd28pIHsKKwl2YXIgdXVpZFN0cmluZ09uZSA9IHV1aWRPbmUudG9TdHJpbmcoKTsKKwl2YXIgdXVpZFN0cmluZ1R3byA9IHV1aWRUd28udG9TdHJpbmcoKTsKKwlpZiAodXVpZFN0cmluZ09uZSA+IHV1aWRTdHJpbmdUd28pIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh1dWlkU3RyaW5nT25lIDwgdXVpZFN0cmluZ1R3bykgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfTsKK2Rvam8udXVpZC5VdWlkLnNldEdlbmVyYXRvciA9IGZ1bmN0aW9uIChnZW5lcmF0b3IpIHsKKwlkb2pvLmxhbmcuYXNzZXJ0KCFnZW5lcmF0b3IgfHwgKGRvam8ubGFuZy5pc09iamVjdChnZW5lcmF0b3IpICYmIGdlbmVyYXRvci5nZW5lcmF0ZSkpOworCWRvam8udXVpZC5VdWlkLl9vdXJHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Cit9OworZG9qby51dWlkLlV1aWQuZ2V0R2VuZXJhdG9yID0gZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLnV1aWQuVXVpZC5fb3VyR2VuZXJhdG9yOworfTsKK2Rvam8udXVpZC5VdWlkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHsKKwlpZiAoZm9ybWF0KSB7CisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCSAgY2FzZSAie30iOgorCQkJcmV0dXJuICJ7IiArIHRoaXMuX3V1aWRTdHJpbmcgKyAifSI7CisJCQlicmVhazsKKwkJICBjYXNlICIoKSI6CisJCQlyZXR1cm4gIigiICsgdGhpcy5fdXVpZFN0cmluZyArICIpIjsKKwkJCWJyZWFrOworCQkgIGNhc2UgIlwiXCIiOgorCQkJcmV0dXJuICJcIiIgKyB0aGlzLl91dWlkU3RyaW5nICsgIlwiIjsKKwkJCWJyZWFrOworCQkgIGNhc2UgIicnIjoKKwkJCXJldHVybiAiJyIgKyB0aGlzLl91dWlkU3RyaW5nICsgIiciOworCQkJYnJlYWs7CisJCSAgY2FzZSAidXJuIjoKKwkJCXJldHVybiAidXJuOnV1aWQ6IiArIHRoaXMuX3V1aWRTdHJpbmc7CisJCQlicmVhazsKKwkJICBjYXNlICIhLSI6CisJCQlyZXR1cm4gdGhpcy5fdXVpZFN0cmluZy5zcGxpdCgiLSIpLmpvaW4oIiIpOworCQkJYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJCWRvam8ubGFuZy5hc3NlcnQoZmFsc2UsICJUaGUgdG9TdHJpbmcoKSBtZXRob2Qgb2YgZG9qby51dWlkLlV1aWQgd2FzIHBhc3NlZCBhIGJvZ3VzIGZvcm1hdC4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiB0aGlzLl91dWlkU3RyaW5nOworCX0KK307Citkb2pvLnV1aWQuVXVpZC5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIChvdGhlclV1aWQpIHsKKwlyZXR1cm4gZG9qby51dWlkLlV1aWQuY29tcGFyZSh0aGlzLCBvdGhlclV1aWQpOworfTsKK2Rvam8udXVpZC5VdWlkLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24gKG90aGVyVXVpZCkgeworCXJldHVybiAodGhpcy5jb21wYXJlKG90aGVyVXVpZCkgPT0gMCk7Cit9OworZG9qby51dWlkLlV1aWQucHJvdG90eXBlLmlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7CisJdHJ5IHsKKwkJZG9qby5sYW5nLmFzc2VydFR5cGUodGhpcy5fdXVpZFN0cmluZywgU3RyaW5nKTsKKwkJZG9qby5sYW5nLmFzc2VydCh0aGlzLl91dWlkU3RyaW5nLmxlbmd0aCA9PSAzNik7CisJCWRvam8ubGFuZy5hc3NlcnQodGhpcy5fdXVpZFN0cmluZyA9PSB0aGlzLl91dWlkU3RyaW5nLnRvTG93ZXJDYXNlKCkpOworCQl2YXIgYXJyYXlPZlBhcnRzID0gdGhpcy5fdXVpZFN0cmluZy5zcGxpdCgiLSIpOworCQlkb2pvLmxhbmcuYXNzZXJ0KGFycmF5T2ZQYXJ0cy5sZW5ndGggPT0gNSk7CisJCWRvam8ubGFuZy5hc3NlcnQoYXJyYXlPZlBhcnRzWzBdLmxlbmd0aCA9PSA4KTsKKwkJZG9qby5sYW5nLmFzc2VydChhcnJheU9mUGFydHNbMV0ubGVuZ3RoID09IDQpOworCQlkb2pvLmxhbmcuYXNzZXJ0KGFycmF5T2ZQYXJ0c1syXS5sZW5ndGggPT0gNCk7CisJCWRvam8ubGFuZy5hc3NlcnQoYXJyYXlPZlBhcnRzWzNdLmxlbmd0aCA9PSA0KTsKKwkJZG9qby5sYW5nLmFzc2VydChhcnJheU9mUGFydHNbNF0ubGVuZ3RoID09IDEyKTsKKwkJZm9yICh2YXIgaSBpbiBhcnJheU9mUGFydHMpIHsKKwkJCXZhciBwYXJ0ID0gYXJyYXlPZlBhcnRzW2ldOworCQkJdmFyIGludGVnZXIgPSBwYXJzZUludChwYXJ0LCBkb2pvLnV1aWQuVXVpZC5IRVhfUkFESVgpOworCQkJZG9qby5sYW5nLmFzc2VydChpc0Zpbml0ZShpbnRlZ2VyKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCWNhdGNoIChlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9OworZG9qby51dWlkLlV1aWQucHJvdG90eXBlLmdldFZhcmlhbnQgPSBmdW5jdGlvbiAoKSB7CisJdmFyIHZhcmlhbnRDaGFyYWN0ZXIgPSB0aGlzLl91dWlkU3RyaW5nLmNoYXJBdCgxOSk7CisJdmFyIHZhcmlhbnROdW1iZXIgPSBwYXJzZUludCh2YXJpYW50Q2hhcmFjdGVyLCBkb2pvLnV1aWQuVXVpZC5IRVhfUkFESVgpOworCWRvam8ubGFuZy5hc3NlcnQoKHZhcmlhbnROdW1iZXIgPj0gMCkgJiYgKHZhcmlhbnROdW1iZXIgPD0gMTYpKTsKKwlpZiAoIWRvam8udXVpZC5VdWlkLl9vdXJWYXJpYW50TG9va3VwVGFibGUpIHsKKwkJdmFyIFZhcmlhbnQgPSBkb2pvLnV1aWQuVXVpZC5WYXJpYW50OworCQl2YXIgbG9va3VwVGFibGUgPSBbXTsKKwkJbG9va3VwVGFibGVbMF0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbMV0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbMl0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbM10gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbNF0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbNV0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbNl0gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbN10gPSBWYXJpYW50Lk5DUzsKKwkJbG9va3VwVGFibGVbOF0gPSBWYXJpYW50LkRDRTsKKwkJbG9va3VwVGFibGVbOV0gPSBWYXJpYW50LkRDRTsKKwkJbG9va3VwVGFibGVbMTBdID0gVmFyaWFudC5EQ0U7CisJCWxvb2t1cFRhYmxlWzExXSA9IFZhcmlhbnQuRENFOworCQlsb29rdXBUYWJsZVsxMl0gPSBWYXJpYW50Lk1JQ1JPU09GVDsKKwkJbG9va3VwVGFibGVbMTNdID0gVmFyaWFudC5NSUNST1NPRlQ7CisJCWxvb2t1cFRhYmxlWzE0XSA9IFZhcmlhbnQuVU5LTk9XTjsKKwkJbG9va3VwVGFibGVbMTVdID0gVmFyaWFudC5VTktOT1dOOworCQlkb2pvLnV1aWQuVXVpZC5fb3VyVmFyaWFudExvb2t1cFRhYmxlID0gbG9va3VwVGFibGU7CisJfQorCXJldHVybiBkb2pvLnV1aWQuVXVpZC5fb3VyVmFyaWFudExvb2t1cFRhYmxlW3ZhcmlhbnROdW1iZXJdOworfTsKK2Rvam8udXVpZC5VdWlkLnByb3RvdHlwZS5nZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5fdmVyc2lvbk51bWJlcikgeworCQl2YXIgZXJyb3JNZXNzYWdlID0gIkNhbGxlZCBnZXRWZXJzaW9uKCkgb24gYSBkb2pvLnV1aWQuVXVpZCB0aGF0IHdhcyBub3QgYSBEQ0UgVmFyaWFudCBVVUlELiI7CisJCWRvam8ubGFuZy5hc3NlcnQodGhpcy5nZXRWYXJpYW50KCkgPT0gZG9qby51dWlkLlV1aWQuVmFyaWFudC5EQ0UsIGVycm9yTWVzc2FnZSk7CisJCXZhciB2ZXJzaW9uQ2hhcmFjdGVyID0gdGhpcy5fdXVpZFN0cmluZy5jaGFyQXQoMTQpOworCQl0aGlzLl92ZXJzaW9uTnVtYmVyID0gcGFyc2VJbnQodmVyc2lvbkNoYXJhY3RlciwgZG9qby51dWlkLlV1aWQuSEVYX1JBRElYKTsKKwl9CisJcmV0dXJuIHRoaXMuX3ZlcnNpb25OdW1iZXI7Cit9OworZG9qby51dWlkLlV1aWQucHJvdG90eXBlLmdldE5vZGUgPSBmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLl9ub2RlU3RyaW5nKSB7CisJCXZhciBlcnJvck1lc3NhZ2UgPSAiQ2FsbGVkIGdldE5vZGUoKSBvbiBhIGRvam8udXVpZC5VdWlkIHRoYXQgd2FzIG5vdCBhIFRJTUVfQkFTRUQgVVVJRC4iOworCQlkb2pvLmxhbmcuYXNzZXJ0KHRoaXMuZ2V0VmVyc2lvbigpID09IGRvam8udXVpZC5VdWlkLlZlcnNpb24uVElNRV9CQVNFRCwgZXJyb3JNZXNzYWdlKTsKKwkJdmFyIGFycmF5T2ZTdHJpbmdzID0gdGhpcy5fdXVpZFN0cmluZy5zcGxpdCgiLSIpOworCQl0aGlzLl9ub2RlU3RyaW5nID0gYXJyYXlPZlN0cmluZ3NbNF07CisJfQorCXJldHVybiB0aGlzLl9ub2RlU3RyaW5nOworfTsKK2Rvam8udXVpZC5VdWlkLnByb3RvdHlwZS5nZXRUaW1lc3RhbXAgPSBmdW5jdGlvbiAocmV0dXJuVHlwZSkgeworCXZhciBlcnJvck1lc3NhZ2UgPSAiQ2FsbGVkIGdldFRpbWVzdGFtcCgpIG9uIGEgZG9qby51dWlkLlV1aWQgdGhhdCB3YXMgbm90IGEgVElNRV9CQVNFRCBVVUlELiI7CisJZG9qby5sYW5nLmFzc2VydCh0aGlzLmdldFZlcnNpb24oKSA9PSBkb2pvLnV1aWQuVXVpZC5WZXJzaW9uLlRJTUVfQkFTRUQsIGVycm9yTWVzc2FnZSk7CisJaWYgKCFyZXR1cm5UeXBlKSB7CisJCXJldHVyblR5cGUgPSBudWxsOworCX0KKwlzd2l0Y2ggKHJldHVyblR5cGUpIHsKKwkgIGNhc2UgInN0cmluZyI6CisJICBjYXNlIFN0cmluZzoKKwkJcmV0dXJuIHRoaXMuZ2V0VGltZXN0YW1wKERhdGUpLnRvVVRDU3RyaW5nKCk7CisJCWJyZWFrOworCSAgY2FzZSAiaGV4IjoKKwkJaWYgKCF0aGlzLl90aW1lc3RhbXBBc0hleFN0cmluZykgeworCQkJdmFyIGFycmF5T2ZTdHJpbmdzID0gdGhpcy5fdXVpZFN0cmluZy5zcGxpdCgiLSIpOworCQkJdmFyIGhleFRpbWVMb3cgPSBhcnJheU9mU3RyaW5nc1swXTsKKwkJCXZhciBoZXhUaW1lTWlkID0gYXJyYXlPZlN0cmluZ3NbMV07CisJCQl2YXIgaGV4VGltZUhpZ2ggPSBhcnJheU9mU3RyaW5nc1syXTsKKwkJCWhleFRpbWVIaWdoID0gaGV4VGltZUhpZ2guc2xpY2UoMSk7CisJCQl0aGlzLl90aW1lc3RhbXBBc0hleFN0cmluZyA9IGhleFRpbWVIaWdoICsgaGV4VGltZU1pZCArIGhleFRpbWVMb3c7CisJCQlkb2pvLmxhbmcuYXNzZXJ0KHRoaXMuX3RpbWVzdGFtcEFzSGV4U3RyaW5nLmxlbmd0aCA9PSAxNSk7CisJCX0KKwkJcmV0dXJuIHRoaXMuX3RpbWVzdGFtcEFzSGV4U3RyaW5nOworCQlicmVhazsKKwkgIGNhc2UgbnVsbDoKKwkgIGNhc2UgImRhdGUiOgorCSAgY2FzZSBEYXRlOgorCQlpZiAoIXRoaXMuX3RpbWVzdGFtcEFzRGF0ZSkgeworCQkJdmFyIEdSRUdPUklBTl9DSEFOR0VfT0ZGU0VUX0lOX0hPVVJTID0gMzM5NDI0ODsKKwkJCXZhciBhcnJheU9mUGFydHMgPSB0aGlzLl91dWlkU3RyaW5nLnNwbGl0KCItIik7CisJCQl2YXIgdGltZUxvdyA9IHBhcnNlSW50KGFycmF5T2ZQYXJ0c1swXSwgZG9qby51dWlkLlV1aWQuSEVYX1JBRElYKTsKKwkJCXZhciB0aW1lTWlkID0gcGFyc2VJbnQoYXJyYXlPZlBhcnRzWzFdLCBkb2pvLnV1aWQuVXVpZC5IRVhfUkFESVgpOworCQkJdmFyIHRpbWVIaWdoID0gcGFyc2VJbnQoYXJyYXlPZlBhcnRzWzJdLCBkb2pvLnV1aWQuVXVpZC5IRVhfUkFESVgpOworCQkJdmFyIGh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyID0gdGltZUhpZ2ggJiA0MDk1OworCQkJaHVuZHJlZE5hbm9zZWNvbmRJbnRlcnZhbHNTaW5jZTE1ODIgPDw9IDE2OworCQkJaHVuZHJlZE5hbm9zZWNvbmRJbnRlcnZhbHNTaW5jZTE1ODIgKz0gdGltZU1pZDsKKwkJCWh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyICo9IDQyOTQ5NjcyOTY7CisJCQlodW5kcmVkTmFub3NlY29uZEludGVydmFsc1NpbmNlMTU4MiArPSB0aW1lTG93OworCQkJdmFyIG1pbGxpc2Vjb25kc1NpbmNlMTU4MiA9IGh1bmRyZWROYW5vc2Vjb25kSW50ZXJ2YWxzU2luY2UxNTgyIC8gMTAwMDA7CisJCQl2YXIgc2Vjb25kc1BlckhvdXIgPSA2MCAqIDYwOworCQkJdmFyIGhvdXJzQmV0d2VlbjE1ODJhbmQxOTcwID0gR1JFR09SSUFOX0NIQU5HRV9PRkZTRVRfSU5fSE9VUlM7CisJCQl2YXIgc2Vjb25kc0JldHdlZW4xNTgyYW5kMTk3MCA9IGhvdXJzQmV0d2VlbjE1ODJhbmQxOTcwICogc2Vjb25kc1BlckhvdXI7CisJCQl2YXIgbWlsbGlzZWNvbmRzQmV0d2VlbjE1ODJhbmQxOTcwID0gc2Vjb25kc0JldHdlZW4xNTgyYW5kMTk3MCAqIDEwMDA7CisJCQl2YXIgbWlsbGlzZWNvbmRzU2luY2UxOTcwID0gbWlsbGlzZWNvbmRzU2luY2UxNTgyIC0gbWlsbGlzZWNvbmRzQmV0d2VlbjE1ODJhbmQxOTcwOworCQkJdGhpcy5fdGltZXN0YW1wQXNEYXRlID0gbmV3IERhdGUobWlsbGlzZWNvbmRzU2luY2UxOTcwKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5fdGltZXN0YW1wQXNEYXRlOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCWRvam8ubGFuZy5hc3NlcnQoZmFsc2UsICJUaGUgZ2V0VGltZXN0YW1wKCkgbWV0aG9kIGRvam8udXVpZC5VdWlkIHdhcyBwYXNzZWQgYSBib2d1cyByZXR1cm5UeXBlOiAiICsgcmV0dXJuVHlwZSk7CisJCWJyZWFrOworCX0KK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3V1aWQvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OWRkMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy91dWlkL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLnV1aWQuVXVpZCIsICJkb2pvLnV1aWQuTGlnaHR3ZWlnaHRHZW5lcmF0b3IiLCAiZG9qby51dWlkLlJhbmRvbUdlbmVyYXRvciIsICJkb2pvLnV1aWQuVGltZUJhc2VkR2VuZXJhdG9yIiwgImRvam8udXVpZC5OYW1lQmFzZWRHZW5lcmF0b3IiLCAiZG9qby51dWlkLk5pbEdlbmVyYXRvciJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8udXVpZC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg0MjE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udmFsaWRhdGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby52YWxpZGF0ZS5jb21tb24iKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL19fcGFja2FnZV9fLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTdjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucmVxdWlyZSgiZG9qby52YWxpZGF0ZSIpOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby52YWxpZGF0ZS5jaGVjayIsICJkb2pvLnZhbGlkYXRlLmRhdGV0aW1lIiwgImRvam8udmFsaWRhdGUuZGUiLCAiZG9qby52YWxpZGF0ZS5qcCIsICJkb2pvLnZhbGlkYXRlLnVzIiwgImRvam8udmFsaWRhdGUud2ViIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby52YWxpZGF0ZS4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9jaGVjay5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9jaGVjay5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIxODE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL2NoZWNrLmpzCkBAIC0wLDAgKzEsMjM0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnZhbGlkYXRlLmNoZWNrIik7Citkb2pvLnJlcXVpcmUoImRvam8udmFsaWRhdGUuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8udmFsaWRhdGUuY2hlY2sgPSBmdW5jdGlvbiAoZm9ybSwgcHJvZmlsZSkgeworCXZhciBtaXNzaW5nID0gW107CisJdmFyIGludmFsaWQgPSBbXTsKKwl2YXIgcmVzdWx0cyA9IHtpc1N1Y2Nlc3NmdWw6ZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gKCF0aGlzLmhhc0ludmFsaWQoKSAmJiAhdGhpcy5oYXNNaXNzaW5nKCkpOworCX0sIGhhc01pc3Npbmc6ZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gKG1pc3NpbmcubGVuZ3RoID4gMCk7CisJfSwgZ2V0TWlzc2luZzpmdW5jdGlvbiAoKSB7CisJCXJldHVybiBtaXNzaW5nOworCX0sIGlzTWlzc2luZzpmdW5jdGlvbiAoZWxlbW5hbWUpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZWxlbW5hbWUgPT0gbWlzc2luZ1tpXSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LCBoYXNJbnZhbGlkOmZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIChpbnZhbGlkLmxlbmd0aCA+IDApOworCX0sIGdldEludmFsaWQ6ZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gaW52YWxpZDsKKwl9LCBpc0ludmFsaWQ6ZnVuY3Rpb24gKGVsZW1uYW1lKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgaW52YWxpZC5sZW5ndGg7IGkrKykgeworCQkJaWYgKGVsZW1uYW1lID09IGludmFsaWRbaV0pIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfX07CisJaWYgKHByb2ZpbGUudHJpbSBpbnN0YW5jZW9mIEFycmF5KSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcHJvZmlsZS50cmltLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZWxlbSA9IGZvcm1bcHJvZmlsZS50cmltW2ldXTsKKwkJCWlmIChkal91bmRlZigidHlwZSIsIGVsZW0pIHx8IGVsZW0udHlwZSAhPSAidGV4dCIgJiYgZWxlbS50eXBlICE9ICJ0ZXh0YXJlYSIgJiYgZWxlbS50eXBlICE9ICJwYXNzd29yZCIpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsZW0udmFsdWUgPSBlbGVtLnZhbHVlLnJlcGxhY2UoLyheXHMqfFxzKiQpL2csICIiKTsKKwkJfQorCX0KKwlpZiAocHJvZmlsZS51cHBlcmNhc2UgaW5zdGFuY2VvZiBBcnJheSkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGUudXBwZXJjYXNlLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZWxlbSA9IGZvcm1bcHJvZmlsZS51cHBlcmNhc2VbaV1dOworCQkJaWYgKGRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgfHwgZWxlbS50eXBlICE9ICJ0ZXh0IiAmJiBlbGVtLnR5cGUgIT0gInRleHRhcmVhIiAmJiBlbGVtLnR5cGUgIT0gInBhc3N3b3JkIikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxlbS52YWx1ZSA9IGVsZW0udmFsdWUudG9VcHBlckNhc2UoKTsKKwkJfQorCX0KKwlpZiAocHJvZmlsZS5sb3dlcmNhc2UgaW5zdGFuY2VvZiBBcnJheSkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGUubG93ZXJjYXNlLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZWxlbSA9IGZvcm1bcHJvZmlsZS5sb3dlcmNhc2VbaV1dOworCQkJaWYgKGRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgfHwgZWxlbS50eXBlICE9ICJ0ZXh0IiAmJiBlbGVtLnR5cGUgIT0gInRleHRhcmVhIiAmJiBlbGVtLnR5cGUgIT0gInBhc3N3b3JkIikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxlbS52YWx1ZSA9IGVsZW0udmFsdWUudG9Mb3dlckNhc2UoKTsKKwkJfQorCX0KKwlpZiAocHJvZmlsZS51Y2ZpcnN0IGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlLnVjZmlyc3QubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBlbGVtID0gZm9ybVtwcm9maWxlLnVjZmlyc3RbaV1dOworCQkJaWYgKGRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgfHwgZWxlbS50eXBlICE9ICJ0ZXh0IiAmJiBlbGVtLnR5cGUgIT0gInRleHRhcmVhIiAmJiBlbGVtLnR5cGUgIT0gInBhc3N3b3JkIikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxlbS52YWx1ZSA9IGVsZW0udmFsdWUucmVwbGFjZSgvXGJcdytcYi9nLCBmdW5jdGlvbiAod29yZCkgeworCQkJCXJldHVybiB3b3JkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTsKKwkJCX0pOworCQl9CisJfQorCWlmIChwcm9maWxlLmRpZ2l0IGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlLmRpZ2l0Lmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgZWxlbSA9IGZvcm1bcHJvZmlsZS5kaWdpdFtpXV07CisJCQlpZiAoZGpfdW5kZWYoInR5cGUiLCBlbGVtKSB8fCBlbGVtLnR5cGUgIT0gInRleHQiICYmIGVsZW0udHlwZSAhPSAidGV4dGFyZWEiICYmIGVsZW0udHlwZSAhPSAicGFzc3dvcmQiKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbGVtLnZhbHVlID0gZWxlbS52YWx1ZS5yZXBsYWNlKC9cRC9nLCAiIik7CisJCX0KKwl9CisJaWYgKHByb2ZpbGUucmVxdWlyZWQgaW5zdGFuY2VvZiBBcnJheSkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGUucmVxdWlyZWQubGVuZ3RoOyBpKyspIHsKKwkJCWlmICghZG9qby5sYW5nLmlzU3RyaW5nKHByb2ZpbGUucmVxdWlyZWRbaV0pKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl2YXIgZWxlbSA9IGZvcm1bcHJvZmlsZS5yZXF1aXJlZFtpXV07CisJCQlpZiAoIWRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgJiYgKGVsZW0udHlwZSA9PSAidGV4dCIgfHwgZWxlbS50eXBlID09ICJ0ZXh0YXJlYSIgfHwgZWxlbS50eXBlID09ICJwYXNzd29yZCIpICYmIC9eXHMqJC8udGVzdChlbGVtLnZhbHVlKSkgeworCQkJCW1pc3NpbmdbbWlzc2luZy5sZW5ndGhdID0gZWxlbS5uYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgJiYgKGVsZW0udHlwZSA9PSAic2VsZWN0LW9uZSIgfHwgZWxlbS50eXBlID09ICJzZWxlY3QtbXVsdGlwbGUiKSAmJiAoZWxlbS5zZWxlY3RlZEluZGV4ID09IC0xIHx8IC9eXHMqJC8udGVzdChlbGVtLm9wdGlvbnNbZWxlbS5zZWxlY3RlZEluZGV4XS52YWx1ZSkpKSB7CisJCQkJCW1pc3NpbmdbbWlzc2luZy5sZW5ndGhdID0gZWxlbS5uYW1lOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJCQkJCXZhciBjaGVja2VkID0gZmFsc2U7CisJCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGVsZW0ubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQlpZiAoZWxlbVtqXS5jaGVja2VkKSB7CisJCQkJCQkJCWNoZWNrZWQgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmICghY2hlY2tlZCkgeworCQkJCQkJCW1pc3NpbmdbbWlzc2luZy5sZW5ndGhdID0gZWxlbVswXS5uYW1lOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChwcm9maWxlLnJlcXVpcmVkIGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoIWRvam8ubGFuZy5pc09iamVjdChwcm9maWxlLnJlcXVpcmVkW2ldKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdmFyIGVsZW0sIG51bVJlcXVpcmVkOworCQkJZm9yICh2YXIgbmFtZSBpbiBwcm9maWxlLnJlcXVpcmVkW2ldKSB7CisJCQkJZWxlbSA9IGZvcm1bbmFtZV07CisJCQkJbnVtUmVxdWlyZWQgPSBwcm9maWxlLnJlcXVpcmVkW2ldW25hbWVdOworCQkJfQorCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBBcnJheSkgeworCQkJCXZhciBjaGVja2VkID0gMDsKKwkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGVsZW0ubGVuZ3RoOyBqKyspIHsKKwkJCQkJaWYgKGVsZW1bal0uY2hlY2tlZCkgeworCQkJCQkJY2hlY2tlZCsrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChjaGVja2VkIDwgbnVtUmVxdWlyZWQpIHsKKwkJCQkJbWlzc2luZ1ttaXNzaW5nLmxlbmd0aF0gPSBlbGVtWzBdLm5hbWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgJiYgZWxlbS50eXBlID09ICJzZWxlY3QtbXVsdGlwbGUiKSB7CisJCQkJCXZhciBzZWxlY3RlZCA9IDA7CisJCQkJCWZvciAodmFyIGogPSAwOyBqIDwgZWxlbS5vcHRpb25zLmxlbmd0aDsgaisrKSB7CisJCQkJCQlpZiAoZWxlbS5vcHRpb25zW2pdLnNlbGVjdGVkICYmICEvXlxzKiQvLnRlc3QoZWxlbS5vcHRpb25zW2pdLnZhbHVlKSkgeworCQkJCQkJCXNlbGVjdGVkKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHNlbGVjdGVkIDwgbnVtUmVxdWlyZWQpIHsKKwkJCQkJCW1pc3NpbmdbbWlzc2luZy5sZW5ndGhdID0gZWxlbS5uYW1lOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChkb2pvLmxhbmcuaXNPYmplY3QocHJvZmlsZS5kZXBlbmRlbmNpZXMpIHx8IGRvam8ubGFuZy5pc09iamVjdChwcm9maWxlLmRlcGVuZGFuY2llcykpIHsKKwkJaWYgKHByb2ZpbGVbImRlcGVuZGFuY2llcyJdKSB7CisJCQlkb2pvLmRlcHJlY2F0ZWQoImRvam8udmFsaWRhdGUuY2hlY2siLCAicHJvZmlsZSAnZGVwZW5kYW5jaWVzJyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlICIgKyAiJ2RlcGVuZGVuY2llcyciLCAiMC41Iik7CisJCQlwcm9maWxlLmRlcGVuZGVuY2llcyA9IHByb2ZpbGUuZGVwZW5kYW5jaWVzOworCQl9CisJCWZvciAobmFtZSBpbiBwcm9maWxlLmRlcGVuZGVuY2llcykgeworCQkJdmFyIGVsZW0gPSBmb3JtW25hbWVdOworCQkJaWYgKGRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChlbGVtLnR5cGUgIT0gInRleHQiICYmIGVsZW0udHlwZSAhPSAidGV4dGFyZWEiICYmIGVsZW0udHlwZSAhPSAicGFzc3dvcmQiKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoL1xTKy8udGVzdChlbGVtLnZhbHVlKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJlc3VsdHMuaXNNaXNzaW5nKGVsZW0ubmFtZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciB0YXJnZXQgPSBmb3JtW3Byb2ZpbGUuZGVwZW5kZW5jaWVzW25hbWVdXTsKKwkJCWlmICh0YXJnZXQudHlwZSAhPSAidGV4dCIgJiYgdGFyZ2V0LnR5cGUgIT0gInRleHRhcmVhIiAmJiB0YXJnZXQudHlwZSAhPSAicGFzc3dvcmQiKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoL15ccyokLy50ZXN0KHRhcmdldC52YWx1ZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1pc3NpbmdbbWlzc2luZy5sZW5ndGhdID0gZWxlbS5uYW1lOworCQl9CisJfQorCWlmIChkb2pvLmxhbmcuaXNPYmplY3QocHJvZmlsZS5jb25zdHJhaW50cykpIHsKKwkJZm9yIChuYW1lIGluIHByb2ZpbGUuY29uc3RyYWludHMpIHsKKwkJCXZhciBlbGVtID0gZm9ybVtuYW1lXTsKKwkJCWlmICghZWxlbSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFkal91bmRlZigidGFnTmFtZSIsIGVsZW0pICYmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJpbnB1dCIpID49IDAgfHwgZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigidGV4dGFyZWEiKSA+PSAwKSAmJiAvXlxzKiQvLnRlc3QoZWxlbS52YWx1ZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZhciBpc1ZhbGlkID0gdHJ1ZTsKKwkJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbihwcm9maWxlLmNvbnN0cmFpbnRzW25hbWVdKSkgeworCQkJCWlzVmFsaWQgPSBwcm9maWxlLmNvbnN0cmFpbnRzW25hbWVdKGVsZW0udmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG9qby5sYW5nLmlzQXJyYXkocHJvZmlsZS5jb25zdHJhaW50c1tuYW1lXSkpIHsKKwkJCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHByb2ZpbGUuY29uc3RyYWludHNbbmFtZV1bMF0pKSB7CisJCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGUuY29uc3RyYWludHNbbmFtZV0ubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlpc1ZhbGlkID0gZG9qby52YWxpZGF0ZS5ldmFsdWF0ZUNvbnN0cmFpbnQocHJvZmlsZSwgcHJvZmlsZS5jb25zdHJhaW50c1tuYW1lXVtpXSwgbmFtZSwgZWxlbSk7CisJCQkJCQkJaWYgKCFpc1ZhbGlkKSB7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlzVmFsaWQgPSBkb2pvLnZhbGlkYXRlLmV2YWx1YXRlQ29uc3RyYWludChwcm9maWxlLCBwcm9maWxlLmNvbnN0cmFpbnRzW25hbWVdLCBuYW1lLCBlbGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghaXNWYWxpZCkgeworCQkJCWludmFsaWRbaW52YWxpZC5sZW5ndGhdID0gZWxlbS5uYW1lOworCQkJfQorCQl9CisJfQorCWlmIChkb2pvLmxhbmcuaXNPYmplY3QocHJvZmlsZS5jb25maXJtKSkgeworCQlmb3IgKG5hbWUgaW4gcHJvZmlsZS5jb25maXJtKSB7CisJCQl2YXIgZWxlbSA9IGZvcm1bbmFtZV07CisJCQl2YXIgdGFyZ2V0ID0gZm9ybVtwcm9maWxlLmNvbmZpcm1bbmFtZV1dOworCQkJaWYgKGRqX3VuZGVmKCJ0eXBlIiwgZWxlbSkgfHwgZGpfdW5kZWYoInR5cGUiLCB0YXJnZXQpIHx8IChlbGVtLnR5cGUgIT0gInRleHQiICYmIGVsZW0udHlwZSAhPSAidGV4dGFyZWEiICYmIGVsZW0udHlwZSAhPSAicGFzc3dvcmQiKSB8fCAodGFyZ2V0LnR5cGUgIT0gZWxlbS50eXBlKSB8fCAodGFyZ2V0LnZhbHVlID09IGVsZW0udmFsdWUpIHx8IChyZXN1bHRzLmlzSW52YWxpZChlbGVtLm5hbWUpKSB8fCAoL15ccyokLy50ZXN0KHRhcmdldC52YWx1ZSkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpbnZhbGlkW2ludmFsaWQubGVuZ3RoXSA9IGVsZW0ubmFtZTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0czsKK307Citkb2pvLnZhbGlkYXRlLmV2YWx1YXRlQ29uc3RyYWludCA9IGZ1bmN0aW9uIChwcm9maWxlLCBjb25zdHJhaW50LCBmaWVsZE5hbWUsIGVsZW0pIHsKKwl2YXIgaXNWYWxpZFNvbWV0aGluZyA9IGNvbnN0cmFpbnRbMF07CisJdmFyIHBhcmFtcyA9IGNvbnN0cmFpbnQuc2xpY2UoMSk7CisJcGFyYW1zLnVuc2hpZnQoZWxlbS52YWx1ZSk7CisJaWYgKHR5cGVvZiBpc1ZhbGlkU29tZXRoaW5nICE9ICJ1bmRlZmluZWQiKSB7CisJCXJldHVybiBpc1ZhbGlkU29tZXRoaW5nLmFwcGx5KG51bGwsIHBhcmFtcyk7CisJfQorCXJldHVybiBmYWxzZTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9jb21tb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvY29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2JkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvY29tbW9uLmpzCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udmFsaWRhdGUuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ucmVnZXhwIik7Citkb2pvLnZhbGlkYXRlLmlzVGV4dCA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwlmbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT0gIm9iamVjdCIpID8gZmxhZ3MgOiB7fTsKKwlpZiAoL15ccyokLy50ZXN0KHZhbHVlKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0eXBlb2YgZmxhZ3MubGVuZ3RoID09ICJudW1iZXIiICYmIGZsYWdzLmxlbmd0aCAhPSB2YWx1ZS5sZW5ndGgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLm1pbmxlbmd0aCA9PSAibnVtYmVyIiAmJiBmbGFncy5taW5sZW5ndGggPiB2YWx1ZS5sZW5ndGgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodHlwZW9mIGZsYWdzLm1heGxlbmd0aCA9PSAibnVtYmVyIiAmJiBmbGFncy5tYXhsZW5ndGggPCB2YWx1ZS5sZW5ndGgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLnZhbGlkYXRlLmlzSW50ZWdlciA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJeIiArIGRvam8ucmVnZXhwLmludGVnZXIoZmxhZ3MpICsgIiQiKTsKKwlyZXR1cm4gcmUudGVzdCh2YWx1ZSk7Cit9OworZG9qby52YWxpZGF0ZS5pc1JlYWxOdW1iZXIgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWdzKSB7CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC5yZWFsTnVtYmVyKGZsYWdzKSArICIkIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8udmFsaWRhdGUuaXNDdXJyZW5jeSA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJeIiArIGRvam8ucmVnZXhwLmN1cnJlbmN5KGZsYWdzKSArICIkIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8udmFsaWRhdGUuX2lzSW5SYW5nZUNhY2hlID0ge307Citkb2pvLnZhbGlkYXRlLmlzSW5SYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoZG9qby5sYW5nLmhhcyhmbGFncywgInNlcGFyYXRvciIpID8gZmxhZ3Muc2VwYXJhdG9yIDogIiwiLCAiIiwgImciKS5yZXBsYWNlKGRvam8ubGFuZy5oYXMoZmxhZ3MsICJzeW1ib2wiKSA/IGZsYWdzLnN5bWJvbCA6ICIkIiwgIiIpOworCWlmIChpc05hTih2YWx1ZSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlmbGFncyA9ICh0eXBlb2YgZmxhZ3MgPT0gIm9iamVjdCIpID8gZmxhZ3MgOiB7fTsKKwl2YXIgbWF4ID0gKHR5cGVvZiBmbGFncy5tYXggPT0gIm51bWJlciIpID8gZmxhZ3MubWF4IDogSW5maW5pdHk7CisJdmFyIG1pbiA9ICh0eXBlb2YgZmxhZ3MubWluID09ICJudW1iZXIiKSA/IGZsYWdzLm1pbiA6IC1JbmZpbml0eTsKKwl2YXIgZGVjID0gKHR5cGVvZiBmbGFncy5kZWNpbWFsID09ICJzdHJpbmciKSA/IGZsYWdzLmRlY2ltYWwgOiAiLiI7CisJdmFyIGNhY2hlID0gZG9qby52YWxpZGF0ZS5faXNJblJhbmdlQ2FjaGU7CisJdmFyIGNhY2hlSWR4ID0gdmFsdWUgKyAibWF4IiArIG1heCArICJtaW4iICsgbWluICsgImRlYyIgKyBkZWM7CisJaWYgKHR5cGVvZiBjYWNoZVtjYWNoZUlkeF0gIT0gInVuZGVmaW5lZCIpIHsKKwkJcmV0dXJuIGNhY2hlW2NhY2hlSWR4XTsKKwl9CisJdmFyIHBhdHRlcm4gPSAiW14iICsgZGVjICsgIlxcZGVFKy1dIjsKKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoUmVnRXhwKHBhdHRlcm4sICJnIiksICIiKTsKKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oWystXT8pKFxEKikvLCAiJDEiKTsKKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyhcRCopJC8sICIiKTsKKwlwYXR0ZXJuID0gIihcXGQpWyIgKyBkZWMgKyAiXShcXGQpIjsKKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoUmVnRXhwKHBhdHRlcm4sICJnIiksICIkMS4kMiIpOworCXZhbHVlID0gTnVtYmVyKHZhbHVlKTsKKwlpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHsKKwkJY2FjaGVbY2FjaGVJZHhdID0gZmFsc2U7CisJCXJldHVybiBmYWxzZTsKKwl9CisJY2FjaGVbY2FjaGVJZHhdID0gdHJ1ZTsKKwlyZXR1cm4gdHJ1ZTsKK307Citkb2pvLnZhbGlkYXRlLmlzTnVtYmVyRm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlLCBmbGFncykgeworCXZhciByZSA9IG5ldyBSZWdFeHAoIl4iICsgZG9qby5yZWdleHAubnVtYmVyRm9ybWF0KGZsYWdzKSArICIkIiwgImkiKTsKKwlyZXR1cm4gcmUudGVzdCh2YWx1ZSk7Cit9OworZG9qby52YWxpZGF0ZS5pc1ZhbGlkTHVobiA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciBzdW0sIHBhcml0eSwgY3VyRGlnaXQ7CisJaWYgKHR5cGVvZiB2YWx1ZSAhPSAic3RyaW5nIikgeworCQl2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7CisJfQorCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvWy0gXS9nLCAiIik7CisJcGFyaXR5ID0gdmFsdWUubGVuZ3RoICUgMjsKKwlzdW0gPSAwOworCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKKwkJY3VyRGlnaXQgPSBwYXJzZUludCh2YWx1ZS5jaGFyQXQoaSkpOworCQlpZiAoaSAlIDIgPT0gcGFyaXR5KSB7CisJCQljdXJEaWdpdCAqPSAyOworCQl9CisJCWlmIChjdXJEaWdpdCA+IDkpIHsKKwkJCWN1ckRpZ2l0IC09IDk7CisJCX0KKwkJc3VtICs9IGN1ckRpZ2l0OworCX0KKwlyZXR1cm4gIShzdW0gJSAxMCk7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvY3JlZGl0Q2FyZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9jcmVkaXRDYXJkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmJiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvY3JlZGl0Q2FyZC5qcwpAQCAtMCwwICsxLDY0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnZhbGlkYXRlLmNyZWRpdENhcmQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLmNvbW1vbiIpOworZG9qby52YWxpZGF0ZS5pc1ZhbGlkQ3JlZGl0Q2FyZCA9IGZ1bmN0aW9uICh2YWx1ZSwgY2NUeXBlKSB7CisJaWYgKHZhbHVlICYmIGNjVHlwZSAmJiAoKGNjVHlwZS50b0xvd2VyQ2FzZSgpID09ICJlciIgfHwgZG9qby52YWxpZGF0ZS5pc1ZhbGlkTHVobih2YWx1ZSkpICYmIChkb2pvLnZhbGlkYXRlLmlzVmFsaWRDcmVkaXRDYXJkTnVtYmVyKHZhbHVlLCBjY1R5cGUudG9Mb3dlckNhc2UoKSkpKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfTsKK2Rvam8udmFsaWRhdGUuaXNWYWxpZENyZWRpdENhcmROdW1iZXIgPSBmdW5jdGlvbiAodmFsdWUsIGNjVHlwZSkgeworCWlmICh0eXBlb2YgdmFsdWUgIT0gInN0cmluZyIpIHsKKwkJdmFsdWUgPSBTdHJpbmcodmFsdWUpOworCX0KKwl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1stIF0vZywgIiIpOworCXZhciByZXN1bHRzID0gW107CisJdmFyIGNhcmRpbmZvID0geyJtYyI6IjVbMS01XVswLTldezE0fSIsICJlYyI6IjVbMS01XVswLTldezE0fSIsICJ2aSI6IjQoWzAtOV17MTJ9fFswLTldezE1fSkiLCAiYXgiOiIzWzQ3XVswLTldezEzfSIsICJkYyI6IjMoMFswLTVdWzAtOV17MTF9fFs2OF1bMC05XXsxMn0pIiwgImJsIjoiMygwWzAtNV1bMC05XXsxMX18WzY4XVswLTldezEyfSkiLCAiZGkiOiI2MDExWzAtOV17MTJ9IiwgImpjYiI6IigzWzAtOV17MTV9fCgyMTMxfDE4MDApWzAtOV17MTF9KSIsICJlciI6IjIoMDE0fDE0OSlbMC05XXsxMX0ifTsKKwlpZiAoY2NUeXBlICYmIGRvam8ubGFuZy5oYXMoY2FyZGluZm8sIGNjVHlwZS50b0xvd2VyQ2FzZSgpKSkgeworCQlyZXR1cm4gQm9vbGVhbih2YWx1ZS5tYXRjaChjYXJkaW5mb1tjY1R5cGUudG9Mb3dlckNhc2UoKV0pKTsKKwl9IGVsc2UgeworCQlmb3IgKHZhciBwIGluIGNhcmRpbmZvKSB7CisJCQlpZiAodmFsdWUubWF0Y2goIl4iICsgY2FyZGluZm9bcF0gKyAiJCIpICE9IG51bGwpIHsKKwkJCQlyZXN1bHRzLnB1c2gocCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIChyZXN1bHRzLmxlbmd0aCkgPyByZXN1bHRzLmpvaW4oInwiKSA6IGZhbHNlOworCX0KK307Citkb2pvLnZhbGlkYXRlLmlzVmFsaWRDdnYgPSBmdW5jdGlvbiAodmFsdWUsIGNjVHlwZSkgeworCWlmICh0eXBlb2YgdmFsdWUgIT0gInN0cmluZyIpIHsKKwkJdmFsdWUgPSBTdHJpbmcodmFsdWUpOworCX0KKwl2YXIgZm9ybWF0OworCXN3aXRjaCAoY2NUeXBlLnRvTG93ZXJDYXNlKCkpIHsKKwkgIGNhc2UgIm1jIjoKKwkgIGNhc2UgImVjIjoKKwkgIGNhc2UgInZpIjoKKwkgIGNhc2UgImRpIjoKKwkJZm9ybWF0ID0gIiMjIyI7CisJCWJyZWFrOworCSAgY2FzZSAiYXgiOgorCQlmb3JtYXQgPSAiIyMjIyI7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl2YXIgZmxhZ3MgPSB7Zm9ybWF0OmZvcm1hdH07CisJaWYgKCh2YWx1ZS5sZW5ndGggPT0gZm9ybWF0Lmxlbmd0aCkgJiYgKGRvam8udmFsaWRhdGUuaXNOdW1iZXJGb3JtYXQodmFsdWUsIGZsYWdzKSkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9kYXRldGltZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9kYXRldGltZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q2MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL2RhdGV0aW1lLmpzCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8udmFsaWRhdGUuZGF0ZXRpbWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby52YWxpZGF0ZS5jb21tb24iKTsKK2Rvam8udmFsaWRhdGUuaXNWYWxpZFRpbWUgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWdzKSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLnZhbGlkYXRlLmRhdGV0aW1lIiwgInVzZSBkb2pvLmRhdGUucGFyc2UgaW5zdGVhZCIsICIwLjUiKTsKKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJeIiArIGRvam8ucmVnZXhwLnRpbWUoZmxhZ3MpICsgIiQiLCAiaSIpOworCXJldHVybiByZS50ZXN0KHZhbHVlKTsKK307Citkb2pvLnZhbGlkYXRlLmlzMTJIb3VyVGltZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby52YWxpZGF0ZS5kYXRldGltZSIsICJ1c2UgZG9qby5kYXRlLnBhcnNlIGluc3RlYWQiLCAiMC41Iik7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNWYWxpZFRpbWUodmFsdWUsIHtmb3JtYXQ6WyJoOm1tOnNzIHQiLCAiaDptbSB0Il19KTsKK307Citkb2pvLnZhbGlkYXRlLmlzMjRIb3VyVGltZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby52YWxpZGF0ZS5kYXRldGltZSIsICJ1c2UgZG9qby5kYXRlLnBhcnNlIGluc3RlYWQiLCAiMC41Iik7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNWYWxpZFRpbWUodmFsdWUsIHtmb3JtYXQ6WyJISDptbTpzcyIsICJISDptbSJdfSk7Cit9OworZG9qby52YWxpZGF0ZS5pc1ZhbGlkRGF0ZSA9IGZ1bmN0aW9uIChkYXRlVmFsdWUsIGZvcm1hdCkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby52YWxpZGF0ZS5kYXRldGltZSIsICJ1c2UgZG9qby5kYXRlLnBhcnNlIGluc3RlYWQiLCAiMC41Iik7CisJaWYgKHR5cGVvZiBmb3JtYXQgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGZvcm1hdC5mb3JtYXQgPT0gInN0cmluZyIpIHsKKwkJZm9ybWF0ID0gZm9ybWF0LmZvcm1hdDsKKwl9CisJaWYgKHR5cGVvZiBmb3JtYXQgIT0gInN0cmluZyIpIHsKKwkJZm9ybWF0ID0gIk1NL0REL1lZWVkiOworCX0KKwl2YXIgcmVMaXRlcmFsID0gZm9ybWF0LnJlcGxhY2UoLyhbJF4uKis/PSE6fFwvXFxcKFwpXFtcXVx7XH1dKS9nLCAiXFwkMSIpOworCXJlTGl0ZXJhbCA9IHJlTGl0ZXJhbC5yZXBsYWNlKCJZWVlZIiwgIihbMC05XXs0fSkiKTsKKwlyZUxpdGVyYWwgPSByZUxpdGVyYWwucmVwbGFjZSgiTU0iLCAiKDBbMS05XXwxMHwxMXwxMikiKTsKKwlyZUxpdGVyYWwgPSByZUxpdGVyYWwucmVwbGFjZSgiTSIsICIoWzEtOV18MTB8MTF8MTIpIik7CisJcmVMaXRlcmFsID0gcmVMaXRlcmFsLnJlcGxhY2UoIkRERCIsICIoMDBbMS05XXwwWzEtOV1bMC05XXxbMTJdWzAtOV1bMC05XXwzWzAtNV1bMC05XXwzNlswLTZdKSIpOworCXJlTGl0ZXJhbCA9IHJlTGl0ZXJhbC5yZXBsYWNlKCJERCIsICIoMFsxLTldfFsxMl1bMC05XXwzMHwzMSkiKTsKKwlyZUxpdGVyYWwgPSByZUxpdGVyYWwucmVwbGFjZSgiRCIsICIoWzEtOV18WzEyXVswLTldfDMwfDMxKSIpOworCXJlTGl0ZXJhbCA9IHJlTGl0ZXJhbC5yZXBsYWNlKCJ3dyIsICIoMFsxLTldfFsxLTRdWzAtOV18NVswLTNdKSIpOworCXJlTGl0ZXJhbCA9IHJlTGl0ZXJhbC5yZXBsYWNlKCJkIiwgIihbMS03XSkiKTsKKwlyZUxpdGVyYWwgPSAiXiIgKyByZUxpdGVyYWwgKyAiJCI7CisJdmFyIHJlID0gbmV3IFJlZ0V4cChyZUxpdGVyYWwpOworCWlmICghcmUudGVzdChkYXRlVmFsdWUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIHllYXIgPSAwLCBtb250aCA9IDEsIGRhdGUgPSAxLCBkYXlvZnllYXIgPSAxLCB3ZWVrID0gMSwgZGF5ID0gMTsKKwl2YXIgdG9rZW5zID0gZm9ybWF0Lm1hdGNoKC8oWVlZWXxNTXxNfERERHxERHxEfHd3fGQpL2cpOworCXZhciB2YWx1ZXMgPSByZS5leGVjKGRhdGVWYWx1ZSk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKwkJc3dpdGNoICh0b2tlbnNbaV0pIHsKKwkJICBjYXNlICJZWVlZIjoKKwkJCXllYXIgPSBOdW1iZXIodmFsdWVzW2kgKyAxXSk7CisJCQlicmVhazsKKwkJICBjYXNlICJNIjoKKwkJICBjYXNlICJNTSI6CisJCQltb250aCA9IE51bWJlcih2YWx1ZXNbaSArIDFdKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgIkQiOgorCQkgIGNhc2UgIkREIjoKKwkJCWRhdGUgPSBOdW1iZXIodmFsdWVzW2kgKyAxXSk7CisJCQlicmVhazsKKwkJICBjYXNlICJEREQiOgorCQkJZGF5b2Z5ZWFyID0gTnVtYmVyKHZhbHVlc1tpICsgMV0pOworCQkJYnJlYWs7CisJCSAgY2FzZSAid3ciOgorCQkJd2VlayA9IE51bWJlcih2YWx1ZXNbaSArIDFdKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgImQiOgorCQkJZGF5ID0gTnVtYmVyKHZhbHVlc1tpICsgMV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJdmFyIGxlYXB5ZWFyID0gKHllYXIgJSA0ID09IDAgJiYgKHllYXIgJSAxMDAgIT0gMCB8fCB5ZWFyICUgNDAwID09IDApKTsKKwlpZiAoZGF0ZSA9PSAzMSAmJiAobW9udGggPT0gNCB8fCBtb250aCA9PSA2IHx8IG1vbnRoID09IDkgfHwgbW9udGggPT0gMTEpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRhdGUgPj0gMzAgJiYgbW9udGggPT0gMikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChkYXRlID09IDI5ICYmIG1vbnRoID09IDIgJiYgIWxlYXB5ZWFyKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRheW9meWVhciA9PSAzNjYgJiYgIWxlYXB5ZWFyKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvZGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNTQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS9kZS5qcwpAQCAtMCwwICsxLDE5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnZhbGlkYXRlLmRlIik7Citkb2pvLnJlcXVpcmUoImRvam8udmFsaWRhdGUuY29tbW9uIik7Citkb2pvLnZhbGlkYXRlLmlzR2VybWFuQ3VycmVuY3kgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwl2YXIgZmxhZ3MgPSB7c3ltYm9sOiJcdTIwYWMiLCBwbGFjZW1lbnQ6ImFmdGVyIiwgc2lnblBsYWNlbWVudDoiYmVnaW4iLCBkZWNpbWFsOiIsIiwgc2VwYXJhdG9yOiIuIn07CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNDdXJyZW5jeSh2YWx1ZSwgZmxhZ3MpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL2pwLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL2pwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzhjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvanAuanMKQEAgLTAsMCArMSwxOSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby52YWxpZGF0ZS5qcCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLmNvbW1vbiIpOworZG9qby52YWxpZGF0ZS5pc0phcGFuZXNlQ3VycmVuY3kgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwl2YXIgZmxhZ3MgPSB7c3ltYm9sOiJceGE1IiwgZnJhY3Rpb25hbDpmYWxzZX07CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNDdXJyZW5jeSh2YWx1ZSwgZmxhZ3MpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL3VzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL3VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTEwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvdmFsaWRhdGUvdXMuanMKQEAgLTAsMCArMSwzNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby52YWxpZGF0ZS51cyIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLmNvbW1vbiIpOworZG9qby52YWxpZGF0ZS51cy5pc0N1cnJlbmN5ID0gZnVuY3Rpb24gKHZhbHVlLCBmbGFncykgeworCXJldHVybiBkb2pvLnZhbGlkYXRlLmlzQ3VycmVuY3kodmFsdWUsIGZsYWdzKTsKK307Citkb2pvLnZhbGlkYXRlLnVzLmlzU3RhdGUgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWdzKSB7CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC51cy5zdGF0ZShmbGFncykgKyAiJCIsICJpIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8udmFsaWRhdGUudXMuaXNQaG9uZU51bWJlciA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciBmbGFncyA9IHtmb3JtYXQ6WyIjIyMtIyMjLSMjIyMiLCAiKCMjIykgIyMjLSMjIyMiLCAiKCMjIykgIyMjICMjIyMiLCAiIyMjLiMjIy4jIyMjIiwgIiMjIy8jIyMtIyMjIyIsICIjIyMgIyMjICMjIyMiLCAiIyMjLSMjIy0jIyMjIHgjPz8/IiwgIigjIyMpICMjIy0jIyMjIHgjPz8/IiwgIigjIyMpICMjIyAjIyMjIHgjPz8/IiwgIiMjIy4jIyMuIyMjIyB4Iz8/PyIsICIjIyMvIyMjLSMjIyMgeCM/Pz8iLCAiIyMjICMjIyAjIyMjIHgjPz8/IiwgIiMjIyMjIyMjIyMiXX07CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNOdW1iZXJGb3JtYXQodmFsdWUsIGZsYWdzKTsKK307Citkb2pvLnZhbGlkYXRlLnVzLmlzU29jaWFsU2VjdXJpdHlOdW1iZXIgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwl2YXIgZmxhZ3MgPSB7Zm9ybWF0OlsiIyMjLSMjLSMjIyMiLCAiIyMjICMjICMjIyMiLCAiIyMjIyMjIyMjIl19OworCXJldHVybiBkb2pvLnZhbGlkYXRlLmlzTnVtYmVyRm9ybWF0KHZhbHVlLCBmbGFncyk7Cit9OworZG9qby52YWxpZGF0ZS51cy5pc1ppcENvZGUgPSBmdW5jdGlvbiAodmFsdWUpIHsKKwl2YXIgZmxhZ3MgPSB7Zm9ybWF0OlsiIyMjIyMtIyMjIyIsICIjIyMjIyAjIyMjIiwgIiMjIyMjIyMjIyIsICIjIyMjIyJdfTsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc051bWJlckZvcm1hdCh2YWx1ZSwgZmxhZ3MpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3ZhbGlkYXRlL3dlYi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS93ZWIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZjA3NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy92YWxpZGF0ZS93ZWIuanMKQEAgLTAsMCArMSw0MyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby52YWxpZGF0ZS53ZWIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby52YWxpZGF0ZS5jb21tb24iKTsKK2Rvam8udmFsaWRhdGUuaXNJcEFkZHJlc3MgPSBmdW5jdGlvbiAodmFsdWUsIGZsYWdzKSB7CisJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiIgKyBkb2pvLnJlZ2V4cC5pcEFkZHJlc3MoZmxhZ3MpICsgIiQiLCAiaSIpOworCXJldHVybiByZS50ZXN0KHZhbHVlKTsKK307Citkb2pvLnZhbGlkYXRlLmlzVXJsID0gZnVuY3Rpb24gKHZhbHVlLCBmbGFncykgeworCXZhciByZSA9IG5ldyBSZWdFeHAoIl4iICsgZG9qby5yZWdleHAudXJsKGZsYWdzKSArICIkIiwgImkiKTsKKwlyZXR1cm4gcmUudGVzdCh2YWx1ZSk7Cit9OworZG9qby52YWxpZGF0ZS5pc0VtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJeIiArIGRvam8ucmVnZXhwLmVtYWlsQWRkcmVzcyhmbGFncykgKyAiJCIsICJpIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8udmFsaWRhdGUuaXNFbWFpbEFkZHJlc3NMaXN0ID0gZnVuY3Rpb24gKHZhbHVlLCBmbGFncykgeworCXZhciByZSA9IG5ldyBSZWdFeHAoIl4iICsgZG9qby5yZWdleHAuZW1haWxBZGRyZXNzTGlzdChmbGFncykgKyAiJCIsICJpIik7CisJcmV0dXJuIHJlLnRlc3QodmFsdWUpOworfTsKK2Rvam8udmFsaWRhdGUuZ2V0RW1haWxBZGRyZXNzTGlzdCA9IGZ1bmN0aW9uICh2YWx1ZSwgZmxhZ3MpIHsKKwlpZiAoIWZsYWdzKSB7CisJCWZsYWdzID0ge307CisJfQorCWlmICghZmxhZ3MubGlzdFNlcGFyYXRvcikgeworCQlmbGFncy5saXN0U2VwYXJhdG9yID0gIlxcczssIjsKKwl9CisJaWYgKGRvam8udmFsaWRhdGUuaXNFbWFpbEFkZHJlc3NMaXN0KHZhbHVlLCBmbGFncykpIHsKKwkJcmV0dXJuIHZhbHVlLnNwbGl0KG5ldyBSZWdFeHAoIlxccypbIiArIGZsYWdzLmxpc3RTZXBhcmF0b3IgKyAiXVxccyoiKSk7CisJfQorCXJldHVybiBbXTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQWNjb3JkaW9uQ29udGFpbmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9BY2NvcmRpb25Db250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhNjgwYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQWNjb3JkaW9uQ29udGFpbmVyLmpzCkBAIC0wLDAgKzEsMTI4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5BY2NvcmRpb25Db250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC5odG1sIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5BY2NvcmRpb25Db250YWluZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7aXNDb250YWluZXI6dHJ1ZSwgbGFiZWxOb2RlQ2xhc3M6ImxhYmVsIiwgY29udGFpbmVyTm9kZUNsYXNzOiJhY2NCb2R5IiwgZHVyYXRpb246MjUwLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJd2l0aCAodGhpcy5kb21Ob2RlLnN0eWxlKSB7CisJCWlmIChwb3NpdGlvbiAhPSAiYWJzb2x1dGUiKSB7CisJCQlwb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCX0KKwkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwl9Cit9LCBhZGRDaGlsZDpmdW5jdGlvbiAod2lkZ2V0KSB7CisJdmFyIGNoaWxkID0gdGhpcy5fYWRkQ2hpbGQod2lkZ2V0KTsKKwl0aGlzLl9zZXRTaXplcygpOworCXJldHVybiBjaGlsZDsKK30sIF9hZGRDaGlsZDpmdW5jdGlvbiAod2lkZ2V0KSB7CisJaWYgKHdpZGdldC5vcGVuKSB7CisJCWRvam8uZGVwcmVjYXRlZCgib3BlbiBwYXJhbWV0ZXIgZGVwcmVjYXRlZCwgdXNlICdzZWxlY3RlZD10cnVlJyBpbnN0ZWFkIHdpbGwgYmUgcmVtb3ZlZCBpbiAiLCAiMC41Iik7CisJCWRvam8uZGVidWcod2lkZ2V0LndpZGdldElkICsgIjogb3BlbiA9PSAiICsgd2lkZ2V0Lm9wZW4pOworCQl3aWRnZXQuc2VsZWN0ZWQgPSB0cnVlOworCX0KKwlpZiAod2lkZ2V0LndpZGdldFR5cGUgIT0gIkFjY29yZGlvblBhbmUiKSB7CisJCXZhciB3cmFwcGVyID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJBY2NvcmRpb25QYW5lIiwge2xhYmVsOndpZGdldC5sYWJlbCwgc2VsZWN0ZWQ6d2lkZ2V0LnNlbGVjdGVkLCBsYWJlbE5vZGVDbGFzczp0aGlzLmxhYmVsTm9kZUNsYXNzLCBjb250YWluZXJOb2RlQ2xhc3M6dGhpcy5jb250YWluZXJOb2RlQ2xhc3MsIGFsbG93Q29sbGFwc2U6dGhpcy5hbGxvd0NvbGxhcHNlfSk7CisJCXdyYXBwZXIuYWRkQ2hpbGQod2lkZ2V0KTsKKwkJdGhpcy5hZGRXaWRnZXRBc0RpcmVjdENoaWxkKHdyYXBwZXIpOworCQl0aGlzLnJlZ2lzdGVyQ2hpbGQod3JhcHBlciwgdGhpcy5jaGlsZHJlbi5sZW5ndGgpOworCQlyZXR1cm4gd3JhcHBlcjsKKwl9IGVsc2UgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3Mod2lkZ2V0LmNvbnRhaW5lck5vZGUsIHRoaXMuY29udGFpbmVyTm9kZUNsYXNzKTsKKwkJZG9qby5odG1sLmFkZENsYXNzKHdpZGdldC5sYWJlbE5vZGUsIHRoaXMubGFiZWxOb2RlQ2xhc3MpOworCQl0aGlzLmFkZFdpZGdldEFzRGlyZWN0Q2hpbGQod2lkZ2V0KTsKKwkJdGhpcy5yZWdpc3RlckNoaWxkKHdpZGdldCwgdGhpcy5jaGlsZHJlbi5sZW5ndGgpOworCQlyZXR1cm4gd2lkZ2V0OworCX0KK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXZhciB0bXBDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CisJdGhpcy5jaGlsZHJlbiA9IFtdOworCWRvam8uaHRtbC5yZW1vdmVDaGlsZHJlbih0aGlzLmRvbU5vZGUpOworCWRvam8ubGFuZy5mb3JFYWNoKHRtcENoaWxkcmVuLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIl9hZGRDaGlsZCIpKTsKKwl0aGlzLl9zZXRTaXplcygpOworfSwgcmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24gKHdpZGdldCkgeworCWRvam8ud2lkZ2V0LkFjY29yZGlvbkNvbnRhaW5lci5zdXBlcmNsYXNzLnJlbW92ZUNoaWxkLmNhbGwodGhpcywgd2lkZ2V0KTsKKwl0aGlzLl9zZXRTaXplcygpOworfSwgb25SZXNpemVkOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zZXRTaXplcygpOworfSwgX3NldFNpemVzOmZ1bmN0aW9uICgpIHsKKwl2YXIgdG90YWxDb2xsYXBzZWRIZWlnaHQgPSAwOworCXZhciBvcGVuSWR4ID0gMDsKKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGlkeCkgeworCQl0b3RhbENvbGxhcHNlZEhlaWdodCArPSBjaGlsZC5nZXRMYWJlbEhlaWdodCgpOworCQlpZiAoY2hpbGQuc2VsZWN0ZWQpIHsKKwkJCW9wZW5JZHggPSBpZHg7CisJCX0KKwl9KTsKKwl2YXIgbXlTaXplID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5kb21Ob2RlKTsKKwl2YXIgeSA9IDA7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkLCBpZHgpIHsKKwkJdmFyIGNoaWxkQ29sbGFwc2VkSGVpZ2h0ID0gY2hpbGQuZ2V0TGFiZWxIZWlnaHQoKTsKKwkJY2hpbGQucmVzaXplVG8obXlTaXplLndpZHRoLCBteVNpemUuaGVpZ2h0IC0gdG90YWxDb2xsYXBzZWRIZWlnaHQgKyBjaGlsZENvbGxhcHNlZEhlaWdodCk7CisJCWNoaWxkLmRvbU5vZGUuc3R5bGUuekluZGV4ID0gaWR4ICsgMTsKKwkJY2hpbGQuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCWNoaWxkLmRvbU5vZGUuc3R5bGUudG9wID0geSArICJweCI7CisJCXkgKz0gKGlkeCA9PSBvcGVuSWR4KSA/IGRvam8uaHRtbC5nZXRCb3JkZXJCb3goY2hpbGQuZG9tTm9kZSkuaGVpZ2h0IDogY2hpbGRDb2xsYXBzZWRIZWlnaHQ7CisJfSk7Cit9LCBzZWxlY3RDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgeworCQljaGlsZC5zZXRTZWxlY3RlZChjaGlsZCA9PSBwYWdlKTsKKwl9KTsKKwl2YXIgeSA9IDA7CisJdmFyIGFuaW1zID0gW107CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkLCBpZHgpIHsKKwkJaWYgKGNoaWxkLmRvbU5vZGUuc3R5bGUudG9wICE9ICh5ICsgInB4IikpIHsKKwkJCWFuaW1zLnB1c2goZG9qby5sZnguaHRtbC5zbGlkZVRvKGNoaWxkLmRvbU5vZGUsIHt0b3A6eSwgbGVmdDowfSwgdGhpcy5kdXJhdGlvbikpOworCQl9CisJCXkgKz0gY2hpbGQuc2VsZWN0ZWQgPyBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KGNoaWxkLmRvbU5vZGUpLmhlaWdodCA6IGNoaWxkLmdldExhYmVsSGVpZ2h0KCk7CisJfSwgdGhpcyk7CisJZG9qby5sZnguY29tYmluZShhbmltcykucGxheSgpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5BY2NvcmRpb25QYW5lIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge2xhYmVsOiIiLCAiY2xhc3MiOiJkb2pvQWNjb3JkaW9uUGFuZSIsIGxhYmVsTm9kZUNsYXNzOiJsYWJlbCIsIGNvbnRhaW5lck5vZGVDbGFzczoiYWNjQm9keSIsIHNlbGVjdGVkOmZhbHNlLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkb21Ob2RlXCI+XG48ZGl2IGRvam9BdHRhY2hQb2ludD1cImxhYmVsTm9kZVwiIGRvam9BdHRhY2hFdmVudD1cIm9uY2xpY2s6IG9uTGFiZWxDbGlja1wiIGNsYXNzPVwiJHt0aGlzLmxhYmVsTm9kZUNsYXNzfVwiPiR7dGhpcy5sYWJlbH08L2Rpdj5cbjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIiBjbGFzcz1cIiR7dGhpcy5jb250YWluZXJOb2RlQ2xhc3N9XCI+PC9kaXY+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZG9qb0FjY29yZGlvblBhbmUgLmxhYmVsIHtcblx0Y29sb3I6ICMwMDA7XG5cdGZvbnQtd2VpZ2h0OiBib2xkO1xuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvc29yaWFBY2NvcmRpb25PZmYuZ2lmXCIpIHJlcGVhdC14IHRvcCBsZWZ0ICM4NWFlZWM7XG5cdGJvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtcblx0Zm9udC1zaXplOjAuOWVtO1xufVxuXG4uZG9qb0FjY29yZGlvblBhbmUtc2VsZWN0ZWQgLmxhYmVsIHtcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL3NvcmlhQWNjb3JkaW9uU2VsZWN0ZWQuZ2lmXCIpIHJlcGVhdC14IHRvcCBsZWZ0ICM4NWFlZWM7XG5cdGJvcmRlcjoxcHggc29saWQgIzg0YTNkMTtcbn1cblxuLmRvam9BY2NvcmRpb25QYW5lIC5sYWJlbDpob3ZlciB7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmRvam9BY2NvcmRpb25QYW5lIC5hY2NCb2R5IHtcblx0YmFja2dyb3VuZDogI2ZmZjtcblx0b3ZlcmZsb3c6IGF1dG87XG5cdGJvcmRlcjoxcHggc29saWQgIzg0YTNkMTtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9BY2NvcmRpb25QYW5lLmNzcyIpLCBpc0NvbnRhaW5lcjp0cnVlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgdGhpc1siY2xhc3MiXSk7CisJZG9qby53aWRnZXQuQWNjb3JkaW9uUGFuZS5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcyk7CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5sYWJlbE5vZGUpOworCXRoaXMuc2V0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCk7Cit9LCBzZXRMYWJlbDpmdW5jdGlvbiAobGFiZWwpIHsKKwl0aGlzLmxhYmVsTm9kZS5pbm5lckhUTUwgPSBsYWJlbDsKK30sIHJlc2l6ZVRvOmZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CisJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUsIHt3aWR0aDp3aWR0aCwgaGVpZ2h0OmhlaWdodH0pOworCXZhciBjaGlsZHJlbiA9IFt7ZG9tTm9kZTp0aGlzLmxhYmVsTm9kZSwgbGF5b3V0QWxpZ246InRvcCJ9LCB7ZG9tTm9kZTp0aGlzLmNvbnRhaW5lck5vZGUsIGxheW91dEFsaWduOiJjbGllbnQifV07CisJZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5kb21Ob2RlLCBjaGlsZHJlbik7CisJdmFyIGNoaWxkU2l6ZSA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29udGFpbmVyTm9kZSk7CisJdGhpcy5jaGlsZHJlblswXS5yZXNpemVUbyhjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOworfSwgZ2V0TGFiZWxIZWlnaHQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMubGFiZWxOb2RlKS5oZWlnaHQ7Cit9LCBvbkxhYmVsQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMucGFyZW50LnNlbGVjdENoaWxkKHRoaXMpOworfSwgc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24gKGlzU2VsZWN0ZWQpIHsKKwl0aGlzLnNlbGVjdGVkID0gaXNTZWxlY3RlZDsKKwkoaXNTZWxlY3RlZCA/IGRvam8uaHRtbC5hZGRDbGFzcyA6IGRvam8uaHRtbC5yZW1vdmVDbGFzcykodGhpcy5kb21Ob2RlLCB0aGlzWyJjbGFzcyJdICsgIi1zZWxlY3RlZCIpOworCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bMF07CisJaWYgKGNoaWxkKSB7CisJCWlmIChpc1NlbGVjdGVkKSB7CisJCQlpZiAoIWNoaWxkLmlzU2hvd2luZygpKSB7CisJCQkJY2hpbGQuc2hvdygpOworCQkJfSBlbHNlIHsKKwkJCQljaGlsZC5vblNob3coKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNoaWxkLm9uSGlkZSgpOworCQl9CisJfQorfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5XaWRnZXQsIHtvcGVuOmZhbHNlfSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQW5pbWF0ZWRQbmcuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0FuaW1hdGVkUG5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjAxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0FuaW1hdGVkUG5nLmpzCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkFuaW1hdGVkUG5nIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5BbmltYXRlZFBuZyIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtpc0NvbnRhaW5lcjpmYWxzZSwgd2lkdGg6MCwgaGVpZ2h0OjAsIGFuaVNyYzoiIiwgaW50ZXJ2YWw6MTAwLCBfYmxhbmtTcmM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2JsYW5rLmdpZiIpLCB0ZW1wbGF0ZVN0cmluZzoiPGltZyBjbGFzcz1cImRvam9BbmltYXRlZFBuZ1wiIC8+IiwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5jZWxsV2lkdGggPSB0aGlzLndpZHRoOworCXRoaXMuY2VsbEhlaWdodCA9IHRoaXMuaGVpZ2h0OworCXZhciBpbWcgPSBuZXcgSW1hZ2UoKTsKKwl2YXIgc2VsZiA9IHRoaXM7CisJaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKwkJc2VsZi5faW5pdEFuaShpbWcud2lkdGgsIGltZy5oZWlnaHQpOworCX07CisJaW1nLnNyYyA9IHRoaXMuYW5pU3JjOworfSwgX2luaXRBbmk6ZnVuY3Rpb24gKHcsIGgpIHsKKwl0aGlzLmRvbU5vZGUuc3JjID0gdGhpcy5fYmxhbmtTcmM7CisJdGhpcy5kb21Ob2RlLndpZHRoID0gdGhpcy5jZWxsV2lkdGg7CisJdGhpcy5kb21Ob2RlLmhlaWdodCA9IHRoaXMuY2VsbEhlaWdodDsKKwl0aGlzLmRvbU5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgdGhpcy5hbmlTcmMgKyAiKSI7CisJdGhpcy5kb21Ob2RlLnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSAibm8tcmVwZWF0IjsKKwl0aGlzLmFuaUNvbHMgPSBNYXRoLmZsb29yKHcgLyB0aGlzLmNlbGxXaWR0aCk7CisJdGhpcy5hbmlSb3dzID0gTWF0aC5mbG9vcihoIC8gdGhpcy5jZWxsSGVpZ2h0KTsKKwl0aGlzLmFuaUNlbGxzID0gdGhpcy5hbmlDb2xzICogdGhpcy5hbmlSb3dzOworCXRoaXMuYW5pRnJhbWUgPSAwOworCXdpbmRvdy5zZXRJbnRlcnZhbChkb2pvLmxhbmcuaGl0Y2godGhpcywgIl90aWNrIiksIHRoaXMuaW50ZXJ2YWwpOworfSwgX3RpY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMuYW5pRnJhbWUrKzsKKwlpZiAodGhpcy5hbmlGcmFtZSA9PSB0aGlzLmFuaUNlbGxzKSB7CisJCXRoaXMuYW5pRnJhbWUgPSAwOworCX0KKwl2YXIgY29sID0gdGhpcy5hbmlGcmFtZSAlIHRoaXMuYW5pQ29sczsKKwl2YXIgcm93ID0gTWF0aC5mbG9vcih0aGlzLmFuaUZyYW1lIC8gdGhpcy5hbmlDb2xzKTsKKwl2YXIgYnggPSAtMSAqIGNvbCAqIHRoaXMuY2VsbFdpZHRoOworCXZhciBieSA9IC0xICogcm93ICogdGhpcy5jZWxsSGVpZ2h0OworCXRoaXMuZG9tTm9kZS5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBieCArICJweCAiICsgYnkgKyAicHgiOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0J1dHRvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQnV0dG9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxM2Y1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0J1dHRvbi5qcwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQnV0dG9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5leHRyYXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkJ1dHRvbiIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtpc0NvbnRhaW5lcjp0cnVlLCBjYXB0aW9uOiIiLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJidXR0b25Ob2RlXCIgY2xhc3M9XCJkb2pvQnV0dG9uXCIgc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTtcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbk1vdXNlT3Zlcjsgb25Nb3VzZU91dDsgb25Nb3VzZURvd247IG9uTW91c2VVcDsgb25DbGljazpidXR0b25DbGljazsgb25LZXk6b25LZXk7IG9uRm9jdXM7XCI+XG4gIDxkaXYgY2xhc3M9XCJkb2pvQnV0dG9uQ29udGVudHNcIiBhbGlnbj1jZW50ZXIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO1wiPjwvZGl2PlxuICA8aW1nIGRvam9BdHRhY2hQb2ludD1cImxlZnRJbWFnZVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7XCI+XG4gIDxpbWcgZG9qb0F0dGFjaFBvaW50PVwiY2VudGVySW1hZ2VcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTtcIj5cbiAgPGltZyBkb2pvQXR0YWNoUG9pbnQ9XCJyaWdodEltYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MHB4O3JpZ2h0OjBweDtcIj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii8qIC0tLS0gYnV0dG9uIC0tLSAqL1xuLmRvam9CdXR0b24ge1xuXHRwYWRkaW5nOiAwIDAgMCAwO1xuXHRmb250LXNpemU6IDhwdDtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRmb250LWZhbWlseTogTXlyaWFkLCBUYWhvbWEsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XG59XG5cbi5kb2pvQnV0dG9uIC5kb2pvQnV0dG9uQ29udGVudHMge1xuXHRwYWRkaW5nOiAycHggMnB4IDJweCAycHg7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcdFx0LyogaWYgaWNvbiBhbmQgbGFiZWwgYXJlIHNwbGl0IGFjcm9zcyB0d28gbGluZXMsIGNlbnRlciBpY29uICovXG5cdGNvbG9yOiB3aGl0ZTtcbn1cblxuLmRvam9CdXR0b25MZWZ0UGFydCAuZG9qb0J1dHRvbkNvbnRlbnRzIHtcblx0cGFkZGluZy1yaWdodDogOHB4O1xufVxuXG4uZG9qb0J1dHRvbkRpc2FibGVkIHtcblx0Y3Vyc29yOiB1cmwoXCJpbWFnZXMvbm8uZ2lmXCIpLCBkZWZhdWx0O1xufVxuXG5cbi5kb2pvQnV0dG9uQ29udGVudHMgaW1nIHtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcdC8qIGlmIGljb24gYW5kIGxhYmVsIGFyZSBvbiBzYW1lIGxpbmUsIGNlbnRlciB0aGVtICovXG59XG5cbi8qIC0tLS0tLS0tIGNvbG9ycyAtLS0tLS0tLS0tLS0gKi9cblxuLmRvam9CdXR0b25Ib3ZlciAuZG9qb0J1dHRvbkNvbnRlbnRzIHtcbn1cblxuLmRvam9CdXR0b25EZXByZXNzZWQgLmRvam9CdXR0b25Db250ZW50cyB7XG5cdGNvbG9yOiAjMjkzYTRiO1xufVxuXG4uZG9qb0J1dHRvbkRpc2FibGVkIC5kb2pvQnV0dG9uQ29udGVudHMge1xuXHRjb2xvcjogI2FhYTtcbn1cblxuXG4vKiAtLS0tLS0tLS0tIGRyb3AgZG93biBidXR0b24gc3BlY2lmaWMgLS0tLS0tLS0tLSAqL1xuXG4vKiBib3JkZXIgYmV0d2VlbiBsYWJlbCBhbmQgYXJyb3cgKGZvciBkcm9wIGRvd24gYnV0dG9ucyAqL1xuLmRvam9CdXR0b24gLmJvcmRlciB7XG5cdHdpZHRoOiAxcHg7XG5cdGJhY2tncm91bmQ6IGdyYXk7XG59XG5cbi8qIGJ1dHRvbiBhcnJvdyAqL1xuLmRvam9CdXR0b24gLmRvd25BcnJvdyB7XG5cdHBhZGRpbmctbGVmdDogMTBweDtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uZG9qb0J1dHRvbi5kaXNhYmxlZCAuZG93bkFycm93IHtcblx0Y3Vyc29yIDogZGVmYXVsdDtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9CdXR0b25UZW1wbGF0ZS5jc3MiKSwgaW5hY3RpdmVJbWc6InRlbXBsYXRlcy9pbWFnZXMvc29yaWFCdXR0b24tIiwgYWN0aXZlSW1nOiJ0ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQWN0aXZlLSIsIHByZXNzZWRJbWc6InRlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLSIsIGRpc2FibGVkSW1nOiJ0ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhRGlzYWJsZWQtIiwgd2lkdGgyaGVpZ2h0OjEgLyAzLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuY2FwdGlvbikgeworCQl0aGlzLmNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jYXB0aW9uKSk7CisJfQorCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuY29udGFpbmVyTm9kZSk7Cit9LCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zaXplTXlzZWxmKCk7Cit9LCBfc2l6ZU15c2VsZjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlKSB7CisJCXZhciBwbGFjZUhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKwkJZG9qby5odG1sLmluc2VydEJlZm9yZShwbGFjZUhvbGRlciwgdGhpcy5kb21Ob2RlKTsKKwl9CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKKwl0aGlzLl9zaXplTXlzZWxmSGVscGVyKCk7CisJaWYgKHBsYWNlSG9sZGVyKSB7CisJCWRvam8uaHRtbC5pbnNlcnRCZWZvcmUodGhpcy5kb21Ob2RlLCBwbGFjZUhvbGRlcik7CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHBsYWNlSG9sZGVyKTsKKwl9Cit9LCBfc2l6ZU15c2VsZkhlbHBlcjpmdW5jdGlvbiAoKSB7CisJdmFyIG1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmNvbnRhaW5lck5vZGUpOworCXRoaXMuaGVpZ2h0ID0gbWIuaGVpZ2h0OworCXRoaXMuY29udGFpbmVyV2lkdGggPSBtYi53aWR0aDsKKwl2YXIgZW5kV2lkdGggPSB0aGlzLmhlaWdodCAqIHRoaXMud2lkdGgyaGVpZ2h0OworCXRoaXMuY29udGFpbmVyTm9kZS5zdHlsZS5sZWZ0ID0gZW5kV2lkdGggKyAicHgiOworCXRoaXMubGVmdEltYWdlLmhlaWdodCA9IHRoaXMucmlnaHRJbWFnZS5oZWlnaHQgPSB0aGlzLmNlbnRlckltYWdlLmhlaWdodCA9IHRoaXMuaGVpZ2h0OworCXRoaXMubGVmdEltYWdlLndpZHRoID0gdGhpcy5yaWdodEltYWdlLndpZHRoID0gZW5kV2lkdGggKyAxOworCXRoaXMuY2VudGVySW1hZ2Uud2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoOworCXRoaXMuY2VudGVySW1hZ2Uuc3R5bGUubGVmdCA9IGVuZFdpZHRoICsgInB4IjsKKwl0aGlzLl9zZXRJbWFnZSh0aGlzLmRpc2FibGVkID8gdGhpcy5kaXNhYmxlZEltZyA6IHRoaXMuaW5hY3RpdmVJbWcpOworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCWRvam8uaHRtbC5wcmVwZW5kQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG9qb0J1dHRvbkRpc2FibGVkIik7CisJCXRoaXMuZG9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4Iik7CisJCWRvam8ud2lkZ2V0LndhaS5zZXRBdHRyKHRoaXMuZG9tTm9kZSwgIndhaVN0YXRlIiwgImRpc2FibGVkIiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgImRvam9CdXR0b25EaXNhYmxlZCIpOworCQl0aGlzLmRvbU5vZGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICIwIik7CisJCWRvam8ud2lkZ2V0LndhaS5zZXRBdHRyKHRoaXMuZG9tTm9kZSwgIndhaVN0YXRlIiwgImRpc2FibGVkIiwgZmFsc2UpOworCX0KKwl0aGlzLmRvbU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyAicHgiOworCXRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCA9ICh0aGlzLmNvbnRhaW5lcldpZHRoICsgMiAqIGVuZFdpZHRoKSArICJweCI7Cit9LCBvbk1vdXNlT3ZlcjpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFkb2pvLmh0bWwuaGFzQ2xhc3ModGhpcy5idXR0b25Ob2RlLCAiZG9qb0J1dHRvbkhvdmVyIikpIHsKKwkJZG9qby5odG1sLnByZXBlbmRDbGFzcyh0aGlzLmJ1dHRvbk5vZGUsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwl9CisJdGhpcy5fc2V0SW1hZ2UodGhpcy5hY3RpdmVJbWcpOworfSwgb25Nb3VzZURvd246ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCWRvam8uaHRtbC5wcmVwZW5kQ2xhc3ModGhpcy5idXR0b25Ob2RlLCAiZG9qb0J1dHRvbkRlcHJlc3NlZCIpOworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmJ1dHRvbk5vZGUsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwl0aGlzLl9zZXRJbWFnZSh0aGlzLnByZXNzZWRJbWcpOworfSwgb25Nb3VzZVVwOmZ1bmN0aW9uIChlKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLmh0bWwucHJlcGVuZENsYXNzKHRoaXMuYnV0dG9uTm9kZSwgImRvam9CdXR0b25Ib3ZlciIpOworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmJ1dHRvbk5vZGUsICJkb2pvQnV0dG9uRGVwcmVzc2VkIik7CisJdGhpcy5fc2V0SW1hZ2UodGhpcy5hY3RpdmVJbWcpOworfSwgb25Nb3VzZU91dDpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGUudG9FbGVtZW50ICYmIGRvam8uaHRtbC5pc0Rlc2NlbmRhbnRPZihlLnRvRWxlbWVudCwgdGhpcy5idXR0b25Ob2RlKSkgeworCQlyZXR1cm47CisJfQorCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmJ1dHRvbk5vZGUsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5idXR0b25Ob2RlLCAiZG9qb0J1dHRvbkRlcHJlc3NlZCIpOworCXRoaXMuX3NldEltYWdlKHRoaXMuaW5hY3RpdmVJbWcpOworfSwgb25LZXk6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIWUua2V5KSB7CisJCXJldHVybjsKKwl9CisJdmFyIG1lbnUgPSBkb2pvLndpZGdldC5nZXRXaWRnZXRCeUlkKHRoaXMubWVudUlkKTsKKwlpZiAoZS5rZXkgPT0gZS5LRVlfRU5URVIgfHwgZS5rZXkgPT0gIiAiKSB7CisJCXRoaXMub25Nb3VzZURvd24oZSk7CisJCXRoaXMuYnV0dG9uQ2xpY2soZSk7CisJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJvbk1vdXNlVXAiLCA3NSwgZSk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJfQorCWlmIChtZW51ICYmIG1lbnUuaXNTaG93aW5nTm93ICYmIGUua2V5ID09IGUuS0VZX0RPV05fQVJST1cpIHsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMuZG9tTm9kZSwgIm9uYmx1ciIsIHRoaXMsICJvbkJsdXIiKTsKKwl9Cit9LCBvbkZvY3VzOmZ1bmN0aW9uIChlKSB7CisJdmFyIG1lbnUgPSBkb2pvLndpZGdldC5nZXRXaWRnZXRCeUlkKHRoaXMubWVudUlkKTsKKwlpZiAobWVudSkgeworCQlkb2pvLmV2ZW50LmNvbm5lY3RPbmNlKHRoaXMuZG9tTm9kZSwgIm9uYmx1ciIsIHRoaXMsICJvbkJsdXIiKTsKKwl9Cit9LCBvbkJsdXI6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgbWVudSA9IGRvam8ud2lkZ2V0LmdldFdpZGdldEJ5SWQodGhpcy5tZW51SWQpOworCWlmICghbWVudSkgeworCQlyZXR1cm47CisJfQorCWlmIChtZW51LmNsb3NlICYmIG1lbnUuaXNTaG93aW5nTm93KSB7CisJCW1lbnUuY2xvc2UoKTsKKwl9Cit9LCBidXR0b25DbGljazpmdW5jdGlvbiAoZSkgeworCWlmICghdGhpcy5kaXNhYmxlZCkgeworCQl0cnkgeworCQkJdGhpcy5kb21Ob2RlLmZvY3VzKCk7CisJCX0KKwkJY2F0Y2ggKGUyKSB7CisJCX0KKwkJdGhpcy5vbkNsaWNrKGUpOworCX0KK30sIG9uQ2xpY2s6ZnVuY3Rpb24gKGUpIHsKK30sIF9zZXRJbWFnZTpmdW5jdGlvbiAocHJlZml4KSB7CisJdGhpcy5sZWZ0SW1hZ2Uuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHByZWZpeCArICJsLmdpZiIpOworCXRoaXMuY2VudGVySW1hZ2Uuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHByZWZpeCArICJjLmdpZiIpOworCXRoaXMucmlnaHRJbWFnZS5zcmMgPSBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgcHJlZml4ICsgInIuZ2lmIik7Cit9LCBfdG9nZ2xlTWVudTpmdW5jdGlvbiAobWVudUlkKSB7CisJdmFyIG1lbnUgPSBkb2pvLndpZGdldC5nZXRXaWRnZXRCeUlkKG1lbnVJZCk7CisJaWYgKCFtZW51KSB7CisJCXJldHVybjsKKwl9CisJaWYgKG1lbnUub3BlbiAmJiAhbWVudS5pc1Nob3dpbmdOb3cpIHsKKwkJdmFyIHBvcyA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgZmFsc2UpOworCQltZW51Lm9wZW4ocG9zLngsIHBvcy55ICsgdGhpcy5oZWlnaHQsIHRoaXMpOworCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QodGhpcy5kb21Ob2RlLCAib25ibHVyIiwgdGhpcywgIm9uQmx1ciIpOworCX0gZWxzZSB7CisJCWlmIChtZW51LmNsb3NlICYmIG1lbnUuaXNTaG93aW5nTm93KSB7CisJCQltZW51LmNsb3NlKCk7CisJCX0gZWxzZSB7CisJCQltZW51LnRvZ2dsZSgpOworCQl9CisJfQorfSwgc2V0Q2FwdGlvbjpmdW5jdGlvbiAoY29udGVudCkgeworCXRoaXMuY2FwdGlvbiA9IGNvbnRlbnQ7CisJdGhpcy5jb250YWluZXJOb2RlLmlubmVySFRNTCA9IGNvbnRlbnQ7CisJdGhpcy5fc2l6ZU15c2VsZigpOworfSwgc2V0RGlzYWJsZWQ6ZnVuY3Rpb24gKGRpc2FibGVkKSB7CisJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOworCXRoaXMuX3NpemVNeXNlbGYoKTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRHJvcERvd25CdXR0b24iLCBkb2pvLndpZGdldC5CdXR0b24sIHttZW51SWQ6IiIsIGRvd25BcnJvdzoidGVtcGxhdGVzL2ltYWdlcy93aGl0ZURvd25BcnJvdy5naWYiLCBkaXNhYmxlZERvd25BcnJvdzoidGVtcGxhdGVzL2ltYWdlcy93aGl0ZURvd25BcnJvdy5naWYiLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRHJvcERvd25CdXR0b24uc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCXRoaXMuYXJyb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKwlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5hcnJvdywgImRvd25BcnJvdyIpOworCWRvam8ud2lkZ2V0LndhaS5zZXRBdHRyKHRoaXMuZG9tTm9kZSwgIndhaVN0YXRlIiwgImhhc3BvcHVwIiwgdGhpcy5tZW51SWQpOworfSwgX3NpemVNeXNlbGZIZWxwZXI6ZnVuY3Rpb24gKCkgeworCXRoaXMuYXJyb3cuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHRoaXMuZGlzYWJsZWQgPyB0aGlzLmRpc2FibGVkRG93bkFycm93IDogdGhpcy5kb3duQXJyb3cpOworCXRoaXMuY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh0aGlzLmFycm93KTsKKwlkb2pvLndpZGdldC5Ecm9wRG93bkJ1dHRvbi5zdXBlcmNsYXNzLl9zaXplTXlzZWxmSGVscGVyLmNhbGwodGhpcyk7Cit9LCBvbkNsaWNrOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5fdG9nZ2xlTWVudSh0aGlzLm1lbnVJZCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkNvbWJvQnV0dG9uIiwgZG9qby53aWRnZXQuQnV0dG9uLCB7bWVudUlkOiIiLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9CdXR0b25cIiBzdHlsZT1cInBvc2l0aW9uOnJlbGF0aXZlO3RvcDowcHg7bGVmdDowcHg7IHRleHQtYWxpZ246bm9uZTtcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbktleTtvbkZvY3VzXCI+XG5cblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJidXR0b25Ob2RlXCIgY2xhc3M9XCJkb2pvQnV0dG9uTGVmdFBhcnRcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MHB4O3RvcDowcHg7XCJcblx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbk1vdXNlT3Zlcjsgb25Nb3VzZU91dDsgb25Nb3VzZURvd247IG9uTW91c2VVcDsgb25DbGljazpidXR0b25DbGljaztcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiZG9qb0J1dHRvbkNvbnRlbnRzXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtyaWdodDowcHg7ei1pbmRleDoyO1wiPjwvZGl2PlxuXHRcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwibGVmdEltYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjBweDt0b3A6MHB4O1wiPlxuXHRcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwiY2VudGVySW1hZ2VcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjBweDt0b3A6MHB4O3otaW5kZXg6MTtcIj5cblx0PC9kaXY+XG5cblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyaWdodFBhcnRcIiBjbGFzcz1cImRvam9CdXR0b25SaWdodFBhcnRcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7cmlnaHQ6MHB4O1wiXG5cdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25Nb3VzZU92ZXI6cmlnaHRPdmVyOyBvbk1vdXNlT3V0OnJpZ2h0T3V0OyBvbk1vdXNlRG93bjpyaWdodERvd247IG9uTW91c2VVcDpyaWdodFVwOyBvbkNsaWNrOnJpZ2h0Q2xpY2s7XCI+XG5cdFx0PGltZyBkb2pvQXR0YWNoUG9pbnQ9XCJhcnJvd0JhY2tncm91bmRJbWFnZVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjBweDt6LWluZGV4OjE7XCI+XG5cdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy93aGl0ZURvd25BcnJvdy5naWZcIlxuXHRcdCAgXHRcdHN0eWxlPVwiei1pbmRleDoyO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6M3B4O3RvcDo1MCU7XCI+XG5cdFx0PGltZyBkb2pvQXR0YWNoUG9pbnQ9XCJyaWdodEltYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MHB4O3JpZ2h0OjBweDtcIj5cblx0PC9kaXY+XG5cbjwvZGl2PlxuIiwgc3BsaXRXaWR0aDoyLCBhcnJvd1dpZHRoOjUsIF9zaXplTXlzZWxmSGVscGVyOmZ1bmN0aW9uIChlKSB7CisJdmFyIG1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmNvbnRhaW5lck5vZGUpOworCXRoaXMuaGVpZ2h0ID0gbWIuaGVpZ2h0OworCXRoaXMuY29udGFpbmVyV2lkdGggPSBtYi53aWR0aDsKKwl2YXIgZW5kV2lkdGggPSB0aGlzLmhlaWdodCAvIDM7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJZG9qby53aWRnZXQud2FpLnNldEF0dHIodGhpcy5kb21Ob2RlLCAid2FpU3RhdGUiLCAiZGlzYWJsZWQiLCB0cnVlKTsKKwkJdGhpcy5kb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5kZXgiKTsKKwl9IGVsc2UgeworCQlkb2pvLndpZGdldC53YWkuc2V0QXR0cih0aGlzLmRvbU5vZGUsICJ3YWlTdGF0ZSIsICJkaXNhYmxlZCIsIGZhbHNlKTsKKwkJdGhpcy5kb21Ob2RlLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCAiMCIpOworCX0KKwl0aGlzLmxlZnRJbWFnZS5oZWlnaHQgPSB0aGlzLnJpZ2h0SW1hZ2UuaGVpZ2h0ID0gdGhpcy5jZW50ZXJJbWFnZS5oZWlnaHQgPSB0aGlzLmFycm93QmFja2dyb3VuZEltYWdlLmhlaWdodCA9IHRoaXMuaGVpZ2h0OworCXRoaXMubGVmdEltYWdlLndpZHRoID0gZW5kV2lkdGggKyAxOworCXRoaXMuY2VudGVySW1hZ2Uud2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoOworCXRoaXMuYnV0dG9uTm9kZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArICJweCI7CisJdGhpcy5idXR0b25Ob2RlLnN0eWxlLndpZHRoID0gZW5kV2lkdGggKyB0aGlzLmNvbnRhaW5lcldpZHRoICsgInB4IjsKKwl0aGlzLl9zZXRJbWFnZSh0aGlzLmRpc2FibGVkID8gdGhpcy5kaXNhYmxlZEltZyA6IHRoaXMuaW5hY3RpdmVJbWcpOworCXRoaXMuYXJyb3dCYWNrZ3JvdW5kSW1hZ2Uud2lkdGggPSB0aGlzLmFycm93V2lkdGg7CisJdGhpcy5yaWdodEltYWdlLndpZHRoID0gZW5kV2lkdGggKyAxOworCXRoaXMucmlnaHRQYXJ0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgInB4IjsKKwl0aGlzLnJpZ2h0UGFydC5zdHlsZS53aWR0aCA9IHRoaXMuYXJyb3dXaWR0aCArIGVuZFdpZHRoICsgInB4IjsKKwl0aGlzLl9zZXRJbWFnZVIodGhpcy5kaXNhYmxlZCA/IHRoaXMuZGlzYWJsZWRJbWcgOiB0aGlzLmluYWN0aXZlSW1nKTsKKwl0aGlzLmRvbU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyAicHgiOworCXZhciB0b3RhbFdpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aCArIHRoaXMuc3BsaXRXaWR0aCArIHRoaXMuYXJyb3dXaWR0aCArIDIgKiBlbmRXaWR0aDsKKwl0aGlzLmRvbU5vZGUuc3R5bGUud2lkdGggPSB0b3RhbFdpZHRoICsgInB4IjsKK30sIF9zZXRJbWFnZTpmdW5jdGlvbiAocHJlZml4KSB7CisJdGhpcy5sZWZ0SW1hZ2Uuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHByZWZpeCArICJsLmdpZiIpOworCXRoaXMuY2VudGVySW1hZ2Uuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHByZWZpeCArICJjLmdpZiIpOworfSwgcmlnaHRPdmVyOmZ1bmN0aW9uIChlKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLmh0bWwucHJlcGVuZENsYXNzKHRoaXMucmlnaHRQYXJ0LCAiZG9qb0J1dHRvbkhvdmVyIik7CisJdGhpcy5fc2V0SW1hZ2VSKHRoaXMuYWN0aXZlSW1nKTsKK30sIHJpZ2h0RG93bjpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJZG9qby5odG1sLnByZXBlbmRDbGFzcyh0aGlzLnJpZ2h0UGFydCwgImRvam9CdXR0b25EZXByZXNzZWQiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5yaWdodFBhcnQsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwl0aGlzLl9zZXRJbWFnZVIodGhpcy5wcmVzc2VkSW1nKTsKK30sIHJpZ2h0VXA6ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCWRvam8uaHRtbC5wcmVwZW5kQ2xhc3ModGhpcy5yaWdodFBhcnQsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5yaWdodFBhcnQsICJkb2pvQnV0dG9uRGVwcmVzc2VkIik7CisJdGhpcy5fc2V0SW1hZ2VSKHRoaXMuYWN0aXZlSW1nKTsKK30sIHJpZ2h0T3V0OmZ1bmN0aW9uIChlKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5yaWdodFBhcnQsICJkb2pvQnV0dG9uSG92ZXIiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5yaWdodFBhcnQsICJkb2pvQnV0dG9uRGVwcmVzc2VkIik7CisJdGhpcy5fc2V0SW1hZ2VSKHRoaXMuaW5hY3RpdmVJbWcpOworfSwgcmlnaHRDbGljazpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJdHJ5IHsKKwkJdGhpcy5kb21Ob2RlLmZvY3VzKCk7CisJfQorCWNhdGNoIChlMikgeworCX0KKwl0aGlzLl90b2dnbGVNZW51KHRoaXMubWVudUlkKTsKK30sIF9zZXRJbWFnZVI6ZnVuY3Rpb24gKHByZWZpeCkgeworCXRoaXMuYXJyb3dCYWNrZ3JvdW5kSW1hZ2Uuc3JjID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsIHByZWZpeCArICJjLmdpZiIpOworCXRoaXMucmlnaHRJbWFnZS5zcmMgPSBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgcHJlZml4ICsgInIuZ2lmIik7Cit9LCBvbktleTpmdW5jdGlvbiAoZSkgeworCWlmICghZS5rZXkpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgbWVudSA9IGRvam8ud2lkZ2V0LmdldFdpZGdldEJ5SWQodGhpcy5tZW51SWQpOworCWlmIChlLmtleSA9PSBlLktFWV9FTlRFUiB8fCBlLmtleSA9PSAiICIpIHsKKwkJdGhpcy5vbk1vdXNlRG93bihlKTsKKwkJdGhpcy5idXR0b25DbGljayhlKTsKKwkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIm9uTW91c2VVcCIsIDc1LCBlKTsKKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChlKTsKKwl9IGVsc2UgeworCQlpZiAoZS5rZXkgPT0gZS5LRVlfRE9XTl9BUlJPVyAmJiBlLmFsdEtleSkgeworCQkJdGhpcy5yaWdodERvd24oZSk7CisJCQl0aGlzLnJpZ2h0Q2xpY2soZSk7CisJCQlkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCAicmlnaHRVcCIsIDc1LCBlKTsKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCX0gZWxzZSB7CisJCQlpZiAobWVudSAmJiBtZW51LmlzU2hvd2luZ05vdyAmJiBlLmtleSA9PSBlLktFWV9ET1dOX0FSUk9XKSB7CisJCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMuZG9tTm9kZSwgIm9uYmx1ciIsIHRoaXMsICJvbkJsdXIiKTsKKwkJCX0KKwkJfQorCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DaGFydC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ2hhcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyYzhlYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ2hhcnQuanMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkNoYXJ0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IuaHNsIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkNoYXJ0IiwgbnVsbCwgZnVuY3Rpb24gKCkgeworCXRoaXMuc2VyaWVzID0gW107Cit9LCB7aXNDb250YWluZXI6ZmFsc2UsIGFzc2lnbkNvbG9yczpmdW5jdGlvbiAoKSB7CisJdmFyIGh1ZSA9IDMwOworCXZhciBzYXQgPSAxMjA7CisJdmFyIGx1bSA9IDEyMDsKKwl2YXIgc3RlcHMgPSBNYXRoLnJvdW5kKDMzMCAvIHRoaXMuc2VyaWVzLmxlbmd0aCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlcmllcy5sZW5ndGg7IGkrKykgeworCQl2YXIgYyA9IGRvam8uZ2Z4LmNvbG9yLmhzbDJyZ2IoaHVlLCBzYXQsIGx1bSk7CisJCWlmICghdGhpcy5zZXJpZXNbaV0uY29sb3IpIHsKKwkJCXRoaXMuc2VyaWVzW2ldLmNvbG9yID0gZG9qby5nZnguY29sb3IucmdiMmhleChjWzBdLCBjWzFdLCBjWzJdKTsKKwkJfQorCQlodWUgKz0gc3RlcHM7CisJfQorfSwgcGFyc2VEYXRhOmZ1bmN0aW9uICh0YWJsZSkgeworCXZhciB0aGVhZCA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aGVhZCIpWzBdOworCXZhciB0Ym9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdOworCWlmICghKHRoZWFkICYmIHRib2R5KSkgeworCQlkb2pvLnJhaXNlKCJkb2pvLndpZGdldC5DaGFydDogc3VwcGxpZWQgdGFibGUgbXVzdCBkZWZpbmUgYSBoZWFkIGFuZCBhIGJvZHkuIik7CisJfQorCXZhciBjb2x1bW5zID0gdGhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoIik7CisJZm9yICh2YXIgaSA9IDE7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7CisJCXZhciBrZXkgPSAiY29sdW1uIiArIGk7CisJCXZhciBsYWJlbCA9IGNvbHVtbnNbaV0uaW5uZXJIVE1MOworCQl2YXIgcGxvdFR5cGUgPSBjb2x1bW5zW2ldLmdldEF0dHJpYnV0ZSgicGxvdFR5cGUiKSB8fCAibGluZSI7CisJCXZhciBjb2xvciA9IGNvbHVtbnNbaV0uZ2V0QXR0cmlidXRlKCJjb2xvciIpOworCQl2YXIgZHMgPSBuZXcgZG9qby53aWRnZXQuQ2hhcnQuRGF0YVNlcmllcyhrZXksIGxhYmVsLCBwbG90VHlwZSwgY29sb3IpOworCQl0aGlzLnNlcmllcy5wdXNoKGRzKTsKKwl9CisJdmFyIHJvd3MgPSB0Ym9keS5yb3dzOworCXZhciB4TWluID0gTnVtYmVyLk1BWF9WQUxVRSwgeE1heCA9IE51bWJlci5NSU5fVkFMVUU7CisJdmFyIHlNaW4gPSBOdW1iZXIuTUFYX1ZBTFVFLCB5TWF4ID0gTnVtYmVyLk1JTl9WQUxVRTsKKwl2YXIgaWdub3JlID0gWyJhY2Nlc3NrZXkiLCAiYWxpZ24iLCAiYmdjb2xvciIsICJjbGFzcyIsICJjb2xzcGFuIiwgImhlaWdodCIsICJpZCIsICJub3dyYXAiLCAicm93c3BhbiIsICJzdHlsZSIsICJ0YWJpbmRleCIsICJ0aXRsZSIsICJ2YWxpZ24iLCAid2lkdGgiXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHJvdyA9IHJvd3NbaV07CisJCXZhciBjZWxscyA9IHJvdy5jZWxsczsKKwkJdmFyIHggPSBOdW1iZXIuTUlOX1ZBTFVFOworCQlmb3IgKHZhciBqID0gMDsgaiA8IGNlbGxzLmxlbmd0aDsgaisrKSB7CisJCQlpZiAoaiA9PSAwKSB7CisJCQkJeCA9IHBhcnNlRmxvYXQoY2VsbHNbal0uaW5uZXJIVE1MKTsKKwkJCQl4TWluID0gTWF0aC5taW4oeE1pbiwgeCk7CisJCQkJeE1heCA9IE1hdGgubWF4KHhNYXgsIHgpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgZHMgPSB0aGlzLnNlcmllc1tqIC0gMV07CisJCQkJdmFyIHkgPSBwYXJzZUZsb2F0KGNlbGxzW2pdLmlubmVySFRNTCk7CisJCQkJeU1pbiA9IE1hdGgubWluKHlNaW4sIHkpOworCQkJCXlNYXggPSBNYXRoLm1heCh5TWF4LCB5KTsKKwkJCQl2YXIgbyA9IHt4OngsIHZhbHVlOnl9OworCQkJCXZhciBhdHRycyA9IGNlbGxzW2pdLmF0dHJpYnV0ZXM7CisJCQkJZm9yICh2YXIgayA9IDA7IGsgPCBhdHRycy5sZW5ndGg7IGsrKykgeworCQkJCQl2YXIgYXR0ciA9IGF0dHJzLml0ZW0oayk7CisJCQkJCXZhciBiSWdub3JlID0gZmFsc2U7CisJCQkJCWZvciAodmFyIGwgPSAwOyBsIDwgaWdub3JlLmxlbmd0aDsgbCsrKSB7CisJCQkJCQlpZiAoYXR0ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IGlnbm9yZVtsXSkgeworCQkJCQkJCWJJZ25vcmUgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICghYklnbm9yZSkgeworCQkJCQkJb1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlOworCQkJCQl9CisJCQkJfQorCQkJCWRzLmFkZChvKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4ge3g6e21pbjp4TWluLCBtYXg6eE1heH0sIHk6e21pbjp5TWluLCBtYXg6eU1heH19OworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5DaGFydC5EYXRhU2VyaWVzIiwgbnVsbCwgZnVuY3Rpb24gKGtleSwgbGFiZWwsIHBsb3RUeXBlLCBjb2xvcikgeworCXRoaXMuaWQgPSAiRGF0YVNlcmllcyIgKyBkb2pvLndpZGdldC5DaGFydC5EYXRhU2VyaWVzLmNvdW50Kys7CisJdGhpcy5rZXkgPSBrZXk7CisJdGhpcy5sYWJlbCA9IGxhYmVsIHx8IHRoaXMuaWQ7CisJdGhpcy5wbG90VHlwZSA9IHBsb3RUeXBlIHx8ICJsaW5lIjsKKwl0aGlzLmNvbG9yID0gY29sb3I7CisJdGhpcy52YWx1ZXMgPSBbXTsKK30sIHthZGQ6ZnVuY3Rpb24gKHYpIHsKKwlpZiAodi54ID09IG51bGwgfHwgdi52YWx1ZSA9PSBudWxsKSB7CisJCWRvam8ucmFpc2UoImRvam8ud2lkZ2V0LkNoYXJ0LkRhdGFTZXJpZXMuYWRkOiB2IG11c3QgaGF2ZSBib3RoIGFuICd4JyBhbmQgJ3ZhbHVlJyBwcm9wZXJ0eS4iKTsKKwl9CisJdGhpcy52YWx1ZXMucHVzaCh2KTsKK30sIGNsZWFyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnZhbHVlcyA9IFtdOworfSwgY3JlYXRlUmFuZ2U6ZnVuY3Rpb24gKGxlbikgeworCXZhciBpZHggPSB0aGlzLnZhbHVlcy5sZW5ndGggLSAxOworCXZhciBsZW5ndGggPSAobGVuIHx8IHRoaXMudmFsdWVzLmxlbmd0aCk7CisJcmV0dXJuIHsiaW5kZXgiOmlkeCwgImxlbmd0aCI6bGVuZ3RoLCAic3RhcnQiOk1hdGgubWF4KGlkeCAtIGxlbmd0aCwgMCl9OworfSwgZ2V0TWVhbjpmdW5jdGlvbiAobGVuKSB7CisJdmFyIHJhbmdlID0gdGhpcy5jcmVhdGVSYW5nZShsZW4pOworCWlmIChyYW5nZS5pbmRleCA8IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCXZhciB0ID0gMDsKKwl2YXIgYyA9IDA7CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdmFyIG4gPSBwYXJzZUZsb2F0KHRoaXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJaWYgKCFpc05hTihuKSkgeworCQkJdCArPSBuOworCQkJYysrOworCQl9CisJfQorCXQgLz0gTWF0aC5tYXgoYywgMSk7CisJcmV0dXJuIHQ7Cit9LCBnZXRNb3ZpbmdBdmVyYWdlOmZ1bmN0aW9uIChsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKGxlbik7CisJaWYgKHJhbmdlLmluZGV4IDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJdmFyIHQgPSAwOworCXZhciBjID0gMDsKKwlmb3IgKHZhciBpID0gcmFuZ2UuaW5kZXg7IGkgPj0gcmFuZ2Uuc3RhcnQ7IGktLSkgeworCQl2YXIgbiA9IHBhcnNlRmxvYXQodGhpcy52YWx1ZXNbaV0udmFsdWUpOworCQlpZiAoIWlzTmFOKG4pKSB7CisJCQl0ICs9IG47CisJCQljKys7CisJCX0KKwl9CisJdCAvPSBNYXRoLm1heChjLCAxKTsKKwlyZXR1cm4gdDsKK30sIGdldFZhcmlhbmNlOmZ1bmN0aW9uIChsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKGxlbik7CisJaWYgKHJhbmdlLmluZGV4IDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJdmFyIHQgPSAwOworCXZhciBzID0gMDsKKwl2YXIgYyA9IDA7CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdmFyIG4gPSBwYXJzZUZsb2F0KHRoaXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJaWYgKCFpc05hTihuKSkgeworCQkJdCArPSBuOworCQkJcyArPSBNYXRoLnBvdyhuLCAyKTsKKwkJCWMrKzsKKwkJfQorCX0KKwlyZXR1cm4gKHMgLyBjKSAtIE1hdGgucG93KHQgLyBjLCAyKTsKK30sIGdldFN0YW5kYXJkRGV2aWF0aW9uOmZ1bmN0aW9uIChsZW4pIHsKKwlyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZ2V0VmFyaWFuY2UobGVuKSk7Cit9LCBnZXRNYXg6ZnVuY3Rpb24gKGxlbikgeworCXZhciByYW5nZSA9IHRoaXMuY3JlYXRlUmFuZ2UobGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgdCA9IDA7CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdmFyIG4gPSBwYXJzZUZsb2F0KHRoaXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJaWYgKCFpc05hTihuKSkgeworCQkJdCA9IE1hdGgubWF4KG4sIHQpOworCQl9CisJfQorCXJldHVybiB0OworfSwgZ2V0TWluOmZ1bmN0aW9uIChsZW4pIHsKKwl2YXIgcmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKGxlbik7CisJaWYgKHJhbmdlLmluZGV4IDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJdmFyIHQgPSAwOworCWZvciAodmFyIGkgPSByYW5nZS5pbmRleDsgaSA+PSByYW5nZS5zdGFydDsgaS0tKSB7CisJCXZhciBuID0gcGFyc2VGbG9hdCh0aGlzLnZhbHVlc1tpXS52YWx1ZSk7CisJCWlmICghaXNOYU4obikpIHsKKwkJCXQgPSBNYXRoLm1pbihuLCB0KTsKKwkJfQorCX0KKwlyZXR1cm4gdDsKK30sIGdldE1lZGlhbjpmdW5jdGlvbiAobGVuKSB7CisJdmFyIHJhbmdlID0gdGhpcy5jcmVhdGVSYW5nZShsZW4pOworCWlmIChyYW5nZS5pbmRleCA8IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCXZhciBhID0gW107CisJZm9yICh2YXIgaSA9IHJhbmdlLmluZGV4OyBpID49IHJhbmdlLnN0YXJ0OyBpLS0pIHsKKwkJdmFyIG4gPSBwYXJzZUZsb2F0KHRoaXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJaWYgKCFpc05hTihuKSkgeworCQkJdmFyIGIgPSBmYWxzZTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGggJiYgIWI7IGorKykgeworCQkJCWlmIChuID09IGFbal0pIHsKKwkJCQkJYiA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJaWYgKCFiKSB7CisJCQkJYS5wdXNoKG4pOworCQkJfQorCQl9CisJfQorCWEuc29ydCgpOworCWlmIChhLmxlbmd0aCA+IDApIHsKKwkJcmV0dXJuIGFbTWF0aC5jZWlsKGEubGVuZ3RoIC8gMildOworCX0KKwlyZXR1cm4gMDsKK30sIGdldE1vZGU6ZnVuY3Rpb24gKGxlbikgeworCXZhciByYW5nZSA9IHRoaXMuY3JlYXRlUmFuZ2UobGVuKTsKKwlpZiAocmFuZ2UuaW5kZXggPCAwKSB7CisJCXJldHVybiAwOworCX0KKwl2YXIgbyA9IHt9OworCXZhciByZXQgPSAwOworCXZhciBtID0gMDsKKwlmb3IgKHZhciBpID0gcmFuZ2UuaW5kZXg7IGkgPj0gcmFuZ2Uuc3RhcnQ7IGktLSkgeworCQl2YXIgbiA9IHBhcnNlRmxvYXQodGhpcy52YWx1ZXNbaV0udmFsdWUpOworCQlpZiAoIWlzTmFOKG4pKSB7CisJCQlpZiAoIW9bdGhpcy52YWx1ZXNbaV0udmFsdWVdKSB7CisJCQkJb1t0aGlzLnZhbHVlc1tpXS52YWx1ZV0gPSAxOworCQkJfSBlbHNlIHsKKwkJCQlvW3RoaXMudmFsdWVzW2ldLnZhbHVlXSsrOworCQkJfQorCQl9CisJfQorCWZvciAodmFyIHAgaW4gbykgeworCQlpZiAobSA8IG9bcF0pIHsKKwkJCW0gPSBvW3BdOworCQkJcmV0ID0gcDsKKwkJfQorCX0KKwlyZXR1cm4gcGFyc2VGbG9hdChyZXQpOworfX0pOworZG9qby5yZXF1aXJlSWYoZG9qby5yZW5kZXIuc3ZnLmNhcGFibGUsICJkb2pvLndpZGdldC5zdmcuQ2hhcnQiKTsKK2Rvam8ucmVxdWlyZUlmKCFkb2pvLnJlbmRlci5zdmcuY2FwYWJsZSAmJiBkb2pvLnJlbmRlci52bWwuY2FwYWJsZSwgImRvam8ud2lkZ2V0LnZtbC5DaGFydCIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0NoZWNrYm94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DaGVja2JveC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIyNTcxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DaGVja2JveC5qcwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQ2hlY2tib3giKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5DaGVja2JveCIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIgdGFiSW5kZXg9XCIke3RoaXMudGFiSW5kZXh9XCIgd2FpUm9sZT1cImNoZWNrYm94XCIgaWQ9XCIke3RoaXMuaWR9XCI+XG5cdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VOb2RlXCIgY2xhc3M9XCJkb2pvSHRtbENoZWNrYm94XCIgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvYmxhbmsuZ2lmXCIgYWx0PVwiXCIgLz5cblx0PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCIke3RoaXMubmFtZX1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiB2YWx1ZT1cIiR7dGhpcy52YWx1ZX1cIlxuXHRcdGRvam9BdHRhY2hQb2ludD1cImlucHV0Tm9kZVwiPlxuPC9zcGFuPlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvSHRtbENoZWNrYm94IHtcblx0Ym9yZGVyOiAwcHg7XG5cdHdpZHRoOiAxNnB4O1xuXHRoZWlnaHQ6IDE2cHg7XG5cdG1hcmdpbjogMnB4O1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZG9qb0h0bWxDaGVja2JveE9uIHtcblx0YmFja2dyb3VuZDogdXJsKGNoZWNrLmdpZikgMHB4IDBweDtcbn1cbi5kb2pvSHRtbENoZWNrYm94T2ZmIHtcblx0YmFja2dyb3VuZDogdXJsKGNoZWNrLmdpZikgLTE2cHggMHB4O1xufVxuLmRvam9IdG1sQ2hlY2tib3hEaXNhYmxlZE9uIHtcblx0YmFja2dyb3VuZDogdXJsKGNoZWNrLmdpZikgLTMycHggMHB4O1xufVxuLmRvam9IdG1sQ2hlY2tib3hEaXNhYmxlZE9mZiB7XG5cdGJhY2tncm91bmQ6IHVybChjaGVjay5naWYpIC00OHB4IDBweDtcbn1cbi5kb2pvSHRtbENoZWNrYm94T25Ib3ZlciB7XG5cdGJhY2tncm91bmQ6IHVybChjaGVjay5naWYpIC02NHB4IDBweDtcbn1cbi5kb2pvSHRtbENoZWNrYm94T2ZmSG92ZXIge1xuXHRiYWNrZ3JvdW5kOiB1cmwoY2hlY2suZ2lmKSAtODBweCAwcHg7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvQ2hlY2tib3guY3NzIiksIG5hbWU6IiIsIGlkOiIiLCBjaGVja2VkOmZhbHNlLCB0YWJJbmRleDoiIiwgdmFsdWU6Im9uIiwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuQ2hlY2tib3guc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMudGFiSW5kZXggPT0gIiIpIHsKKwkJdGhpcy50YWJJbmRleCA9ICIwIjsKKwl9Cit9LCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fc2V0SW5mbygpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIG5vdGNvbiA9IHRydWU7CisJdGhpcy5pZCA9IHRoaXMuaWQgIT0gIiIgPyB0aGlzLmlkIDogdGhpcy53aWRnZXRJZDsKKwlpZiAodGhpcy5pZCAhPSAiIikgeworCQl2YXIgbGFiZWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxhYmVsIik7CisJCWlmIChsYWJlbHMgIT0gbnVsbCAmJiBsYWJlbHMubGVuZ3RoID4gMCkgeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobGFiZWxzW2ldLmh0bWxGb3IgPT0gdGhpcy5pZCkgeworCQkJCQlsYWJlbHNbaV0uaWQgPSAobGFiZWxzW2ldLmh0bWxGb3IgKyAibGFiZWwiKTsKKwkJCQkJdGhpcy5fY29ubmVjdEV2ZW50cyhsYWJlbHNbaV0pOworCQkJCQlkb2pvLndpZGdldC53YWkuc2V0QXR0cih0aGlzLmRvbU5vZGUsICJ3YWlTdGF0ZSIsICJsYWJlbGxlZGJ5IiwgbGFiZWxzW2ldLmlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXRoaXMuX2Nvbm5lY3RFdmVudHModGhpcy5kb21Ob2RlKTsKKwl0aGlzLmlucHV0Tm9kZS5jaGVja2VkID0gdGhpcy5jaGVja2VkOworfSwgX2Nvbm5lY3RFdmVudHM6ZnVuY3Rpb24gKG5vZGUpIHsKKwlkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwgIm9ubW91c2VvdmVyIiwgdGhpcywgIm1vdXNlT3ZlciIpOworCWRvam8uZXZlbnQuY29ubmVjdChub2RlLCAib25tb3VzZW91dCIsIHRoaXMsICJtb3VzZU91dCIpOworCWRvam8uZXZlbnQuY29ubmVjdChub2RlLCAib25rZXkiLCB0aGlzLCAib25LZXkiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwgIm9uY2xpY2siLCB0aGlzLCAiX29uQ2xpY2siKTsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihub2RlKTsKK30sIF9vbkNsaWNrOmZ1bmN0aW9uIChlKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQgPT0gZmFsc2UpIHsKKwkJdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDsKKwkJdGhpcy5fc2V0SW5mbygpOworCX0KKwllLnByZXZlbnREZWZhdWx0KCk7CisJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwl0aGlzLm9uQ2xpY2soKTsKK30sIHNldFZhbHVlOmZ1bmN0aW9uIChib29sKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQgPT0gZmFsc2UpIHsKKwkJdGhpcy5jaGVja2VkID0gYm9vbDsKKwkJdGhpcy5fc2V0SW5mbygpOworCX0KK30sIG9uQ2xpY2s6ZnVuY3Rpb24gKCkgeworfSwgb25LZXk6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgayA9IGRvam8uZXZlbnQuYnJvd3Nlci5rZXlzOworCWlmIChlLmtleSA9PSAiICIpIHsKKwkJdGhpcy5fb25DbGljayhlKTsKKwl9Cit9LCBtb3VzZU92ZXI6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLl9ob3ZlcihlLCB0cnVlKTsKK30sIG1vdXNlT3V0OmZ1bmN0aW9uIChlKSB7CisJdGhpcy5faG92ZXIoZSwgZmFsc2UpOworfSwgX2hvdmVyOmZ1bmN0aW9uIChlLCBpc092ZXIpIHsKKwlpZiAodGhpcy5kaXNhYmxlZCA9PSBmYWxzZSkgeworCQl2YXIgc3RhdGUgPSB0aGlzLmNoZWNrZWQgPyAiT24iIDogIk9mZiI7CisJCXZhciBzdHlsZSA9ICJkb2pvSHRtbENoZWNrYm94IiArIHN0YXRlICsgIkhvdmVyIjsKKwkJaWYgKGlzT3ZlcikgeworCQkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuaW1hZ2VOb2RlLCBzdHlsZSk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5pbWFnZU5vZGUsIHN0eWxlKTsKKwkJfQorCX0KK30sIF9zZXRJbmZvOmZ1bmN0aW9uICgpIHsKKwl2YXIgc3RhdGUgPSAiZG9qb0h0bWxDaGVja2JveCIgKyAodGhpcy5kaXNhYmxlZCA/ICJEaXNhYmxlZCIgOiAiIikgKyAodGhpcy5jaGVja2VkID8gIk9uIiA6ICJPZmYiKTsKKwlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5pbWFnZU5vZGUsICJkb2pvSHRtbENoZWNrYm94ICIgKyBzdGF0ZSk7CisJdGhpcy5pbnB1dE5vZGUuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQl0aGlzLmlucHV0Tm9kZS5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJdGhpcy5pbnB1dE5vZGUucmVtb3ZlQXR0cmlidXRlKCJkaXNhYmxlZCIpOworCX0KKwlkb2pvLndpZGdldC53YWkuc2V0QXR0cih0aGlzLmRvbU5vZGUsICJ3YWlTdGF0ZSIsICJjaGVja2VkIiwgdGhpcy5jaGVja2VkKTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuYTExeS5DaGVja2JveCIsIGRvam8ud2lkZ2V0LkNoZWNrYm94LCB7dGVtcGxhdGVTdHJpbmc6IjxzcGFuIGNsYXNzPSdkb2pvSHRtbENoZWNrYm94Jz5cblx0PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCIke3RoaXMubmFtZX1cIiB0YWJJbmRleD1cIiR7dGhpcy50YWJJbmRleH1cIiBpZD1cIiR7dGhpcy5pZH1cIiB2YWx1ZT1cIiR7dGhpcy52YWx1ZX1cIlxuXHRcdCBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBfb25DbGljaztcIiBkb2pvQXR0YWNoUG9pbnQ9XCJpbnB1dE5vZGVcIj4gXG48L3NwYW4+XG4iLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7Cit9LCBwb3N0Q3JlYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdGhpcy5pbnB1dE5vZGUuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQl0aGlzLmlucHV0Tm9kZS5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgdHJ1ZSk7CisJfQorfSwgX29uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMub25DbGljaygpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Nsb2NrLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DbG9jay5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE5MmNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DbG9jay5qcwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQ2xvY2siKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLlVyaSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy50aW1pbmcuVGltZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuQ2xvY2siLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbiAoKSB7CisJdmFyIHNlbGYgPSB0aGlzOworCXRoaXMudGltZVpvbmVPZmZzZXQgPSAwOworCXRoaXMubGFiZWwgPSAiIjsKKwl0aGlzLmRhdGUgPSBuZXcgRGF0ZSgpOworCXRoaXMuaGFuZENvbG9yID0gIiM3ODg1OTgiOworCXRoaXMuaGFuZFN0cm9rZSA9ICIjNmY3YjhjIjsKKwl0aGlzLnNlY29uZEhhbmRDb2xvciA9IFsyMDEsIDQsIDUsIDAuOF07CisJdGhpcy50b3BMYWJlbENvbG9yID0gIiNlZmVmZWYiOworCXRoaXMubGFiZWxDb2xvciA9ICIjZmZmIjsKKwl0aGlzLnRpbWVyID0gbmV3IGRvam8ubGFuZy50aW1pbmcuVGltZXIoMTAwMCk7CisJdGhpcy5jZW50ZXIgPSB7eDo3NSwgeTo3NX07CisJdGhpcy5oYW5kcyA9IHtob3VyOm51bGwsIG1pbnV0ZTpudWxsLCBzZWNvbmQ6bnVsbH07CisJdGhpcy5zaGFkb3dzID0ge2hvdXI6e3NoYWRvdzpudWxsLCBzaGlmdDp7ZHg6MiwgZHk6Mn19LCBtaW51dGU6e3NoYWRvdzpudWxsLCBzaGlmdDp7ZHg6MiwgZHk6M319LCBzZWNvbmQ6e3NoYWRvdzpudWxsLCBzaGlmdDp7ZHg6NCwgZHk6NH19fTsKKwl0aGlzLmltYWdlID0gZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2Nsb2NrLnBuZyIpOworCXRoaXMuc3VyZmFjZSA9IG51bGw7CisJdGhpcy5sYWJlbE5vZGUgPSBudWxsOworCXRoaXMudG9wTGFiZWxOb2RlID0gbnVsbDsKKwl0aGlzLmRyYXcgPSBmdW5jdGlvbiAoKSB7CisJCXNlbGYuZGF0ZSA9IG5ldyBEYXRlKCk7CisJCXZhciBoID0gKHNlbGYuZGF0ZS5nZXRIb3VycygpICsgc2VsZi50aW1lWm9uZU9mZnNldCkgJSAxMjsKKwkJdmFyIG0gPSBzZWxmLmRhdGUuZ2V0TWludXRlcygpOworCQl2YXIgcyA9IHNlbGYuZGF0ZS5nZXRTZWNvbmRzKCk7CisJCXNlbGYucGxhY2VIb3VyKGgsIG0sIHMpOworCQlzZWxmLnBsYWNlTWludXRlKG0sIHMpOworCQlzZWxmLnBsYWNlU2Vjb25kKHMpOworCQlzZWxmLnRvcExhYmVsTm9kZS5pbm5lckhUTUwgPSAoKHNlbGYuZGF0ZS5nZXRIb3VycygpICsgc2VsZi50aW1lWm9uZU9mZnNldCkgPiAxMSkgPyAiUE0iIDogIkFNIjsKKwl9OworCXRoaXMudGltZXIub25UaWNrID0gc2VsZi5kcmF3OworfSwge3NldDpmdW5jdGlvbiAoZHQpIHsKKwl0aGlzLmRhdGUgPSBkdDsKKwlpZiAoIXRoaXMudGltZXIuaXNSdW5uaW5nKSB7CisJCXRoaXMuZHJhdygpOworCX0KK30sIHN0YXJ0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLnRpbWVyLnN0YXJ0KCk7Cit9LCBzdG9wOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnRpbWVyLnN0b3AoKTsKK30sIF9pbml0UG9seTpmdW5jdGlvbiAocGFyZW50LCBwb2ludHMpIHsKKwl2YXIgcGF0aCA9IHBhcmVudC5jcmVhdGVQYXRoKCk7CisJdmFyIGZpcnN0ID0gdHJ1ZTsKKwlkb2pvLmxhbmcuZm9yRWFjaChwb2ludHMsIGZ1bmN0aW9uIChjKSB7CisJCWlmIChmaXJzdCkgeworCQkJcGF0aC5tb3ZlVG8oYy54LCBjLnkpOworCQkJZmlyc3QgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXBhdGgubGluZVRvKGMueCwgYy55KTsKKwkJfQorCX0pOworCXJldHVybiBwYXRoOworfSwgX3BsYWNlSGFuZDpmdW5jdGlvbiAoc2hhcGUsIGFuZ2xlLCBzaGlmdCkgeworCXZhciBtb3ZlID0ge2R4OnRoaXMuY2VudGVyLnggKyAoc2hpZnQgPyBzaGlmdC5keCA6IDApLCBkeTp0aGlzLmNlbnRlci55ICsgKHNoaWZ0ID8gc2hpZnQuZHkgOiAwKX07CisJcmV0dXJuIHNoYXBlLnNldFRyYW5zZm9ybShbbW92ZSwgZG9qby5nZngubWF0cml4LnJvdGF0ZWcoLWFuZ2xlKV0pOworfSwgcGxhY2VIb3VyOmZ1bmN0aW9uIChoLCBtLCBzKSB7CisJdmFyIGFuZ2xlID0gMzAgKiAoaCArIG0gLyA2MCArIHMgLyAzNjAwKTsKKwl0aGlzLl9wbGFjZUhhbmQodGhpcy5oYW5kcy5ob3VyLCBhbmdsZSk7CisJdGhpcy5fcGxhY2VIYW5kKHRoaXMuc2hhZG93cy5ob3VyLnNoYWRvdywgYW5nbGUsIHRoaXMuc2hhZG93cy5ob3VyLnNoaWZ0KTsKK30sIHBsYWNlTWludXRlOmZ1bmN0aW9uIChtLCBzKSB7CisJdmFyIGFuZ2xlID0gNiAqIChtICsgcyAvIDYwKTsKKwl0aGlzLl9wbGFjZUhhbmQodGhpcy5oYW5kcy5taW51dGUsIGFuZ2xlKTsKKwl0aGlzLl9wbGFjZUhhbmQodGhpcy5zaGFkb3dzLm1pbnV0ZS5zaGFkb3csIGFuZ2xlLCB0aGlzLnNoYWRvd3MubWludXRlLnNoaWZ0KTsKK30sIHBsYWNlU2Vjb25kOmZ1bmN0aW9uIChzKSB7CisJdmFyIGFuZ2xlID0gNiAqIHM7CisJdGhpcy5fcGxhY2VIYW5kKHRoaXMuaGFuZHMuc2Vjb25kLCBhbmdsZSk7CisJdGhpcy5fcGxhY2VIYW5kKHRoaXMuc2hhZG93cy5zZWNvbmQuc2hhZG93LCBhbmdsZSwgdGhpcy5zaGFkb3dzLnNlY29uZC5zaGlmdCk7Cit9LCBpbml0OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5kb21Ob2RlLnN0eWxlLnBvc2l0aW9uICE9ICJhYnNvbHV0ZSIpIHsKKwkJdGhpcy5kb21Ob2RlLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwl9CisJd2hpbGUgKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzWzBdKTsKKwl9CisJdGhpcy5kb21Ob2RlLnN0eWxlLndpZHRoID0gIjE1MHB4IjsKKwl0aGlzLmRvbU5vZGUuc3R5bGUuaGVpZ2h0ID0gIjE1MHB4IjsKKwl0aGlzLnN1cmZhY2UgPSBkb2pvLmdmeC5jcmVhdGVTdXJmYWNlKHRoaXMuZG9tTm9kZSwgMTUwLCAxNTApOworCXRoaXMuc3VyZmFjZS5jcmVhdGVSZWN0KHt3aWR0aDoxNTAsIGhlaWdodDoxNTB9KTsKKwl0aGlzLnN1cmZhY2UuY3JlYXRlSW1hZ2Uoe3dpZHRoOjE1MCwgaGVpZ2h0OjE1MCwgc3JjOnRoaXMuaW1hZ2UgKyAiIn0pOworCXZhciBoUCA9IFt7eDotMywgeTotNH0sIHt4OjMsIHk6LTR9LCB7eDoxLCB5Oi0yN30sIHt4Oi0xLCB5Oi0yN30sIHt4Oi0zLCB5Oi00fV07CisJdmFyIG1QID0gW3t4Oi0zLCB5Oi00fSwge3g6MywgeTotNH0sIHt4OjEsIHk6LTM4fSwge3g6LTEsIHk6LTM4fSwge3g6LTMsIHk6LTR9XTsKKwl2YXIgc1AgPSBbe3g6LTIsIHk6LTJ9LCB7eDoyLCB5Oi0yfSwge3g6MSwgeTotNDV9LCB7eDotMSwgeTotNDV9LCB7eDotMiwgeTotMn1dOworCXRoaXMuc2hhZG93cy5ob3VyLnNoYWRvdyA9IHRoaXMuX2luaXRQb2x5KHRoaXMuc3VyZmFjZSwgaFApLnNldEZpbGwoWzAsIDAsIDAsIDAuMV0pOworCXRoaXMuaGFuZHMuaG91ciA9IHRoaXMuX2luaXRQb2x5KHRoaXMuc3VyZmFjZSwgaFApLnNldFN0cm9rZSh7Y29sb3I6dGhpcy5oYW5kU3Ryb2tlLCB3aWR0aDoxfSkuc2V0RmlsbCh7dHlwZToibGluZWFyIiwgeDE6MCwgeTE6MCwgeDI6MCwgeTI6LTI3LCBjb2xvcnM6W3tvZmZzZXQ6MCwgY29sb3I6IiNmZmYifSwge29mZnNldDowLjMzLCBjb2xvcjp0aGlzLmhhbmRDb2xvcn1dfSk7CisJdGhpcy5zaGFkb3dzLm1pbnV0ZS5zaGFkb3cgPSB0aGlzLl9pbml0UG9seSh0aGlzLnN1cmZhY2UsIG1QKS5zZXRGaWxsKFswLCAwLCAwLCAwLjFdKTsKKwl0aGlzLmhhbmRzLm1pbnV0ZSA9IHRoaXMuX2luaXRQb2x5KHRoaXMuc3VyZmFjZSwgbVApLnNldFN0cm9rZSh7Y29sb3I6dGhpcy5oYW5kU3Ryb2tlLCB3aWR0aDoxfSkuc2V0RmlsbCh7dHlwZToibGluZWFyIiwgeDE6MCwgeTE6MCwgeDI6MCwgeTI6LTM4LCBjb2xvcnM6W3tvZmZzZXQ6MCwgY29sb3I6IiNmZmYifSwge29mZnNldDowLjMzLCBjb2xvcjp0aGlzLmhhbmRDb2xvcn1dfSk7CisJdGhpcy5zdXJmYWNlLmNyZWF0ZUNpcmNsZSh7cjo2fSkuc2V0U3Ryb2tlKHtjb2xvcjp0aGlzLmhhbmRTdHJva2UsIHdpZHRoOjJ9KS5zZXRGaWxsKCIjZmZmIikuc2V0VHJhbnNmb3JtKHtkeDo3NSwgZHk6NzV9KTsKKwl0aGlzLnNoYWRvd3Muc2Vjb25kLnNoYWRvdyA9IHRoaXMuX2luaXRQb2x5KHRoaXMuc3VyZmFjZSwgc1ApLnNldEZpbGwoWzAsIDAsIDAsIDAuMV0pOworCXRoaXMuaGFuZHMuc2Vjb25kID0gdGhpcy5faW5pdFBvbHkodGhpcy5zdXJmYWNlLCBzUCkuc2V0RmlsbCh0aGlzLnNlY29uZEhhbmRDb2xvcik7CisJdGhpcy5zdXJmYWNlLmNyZWF0ZUNpcmNsZSh7cjo0fSkuc2V0RmlsbCh0aGlzLnNlY29uZEhhbmRDb2xvcikuc2V0VHJhbnNmb3JtKHtkeDo3NSwgZHk6NzV9KTsKKwl0aGlzLnRvcExhYmVsTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXdpdGggKHRoaXMudG9wTGFiZWxOb2RlLnN0eWxlKSB7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJdG9wID0gIjNweCI7CisJCWxlZnQgPSAiMHB4IjsKKwkJY29sb3IgPSB0aGlzLnRvcExhYmVsQ29sb3I7CisJCXRleHRBbGlnbiA9ICJjZW50ZXIiOworCQl3aWR0aCA9ICIxNTBweCI7CisJCWZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiI7CisJCWZvbnRTaXplID0gIjExcHgiOworCQl0ZXh0VHJhbnNmb3JtID0gInVwcGVyY2FzZSI7CisJCWZvbnRXZWlnaHQgPSAiYm9sZCI7CisJfQorCXRoaXMudG9wTGFiZWxOb2RlLmlubmVySFRNTCA9ICgodGhpcy5kYXRlLmdldEhvdXJzKCkgKyB0aGlzLnRpbWVab25lT2Zmc2V0KSA+IDExKSA/ICJQTSIgOiAiQU0iOworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnRvcExhYmVsTm9kZSk7CisJdGhpcy5sYWJlbE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl3aXRoICh0aGlzLmxhYmVsTm9kZS5zdHlsZSkgeworCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCXRvcCA9ICIxMzRweCI7CisJCWxlZnQgPSAiMHB4IjsKKwkJY29sb3IgPSB0aGlzLmxhYmVsQ29sb3I7CisJCXRleHRBbGlnbiA9ICJjZW50ZXIiOworCQl3aWR0aCA9ICIxNTBweCI7CisJCWZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiI7CisJCWZvbnRTaXplID0gIjEwcHgiOworCQl0ZXh0VHJhbnNmb3JtID0gInVwcGVyY2FzZSI7CisJCWZvbnRXZWlnaHQgPSAiYm9sZCI7CisJfQorCXRoaXMubGFiZWxOb2RlLmlubmVySFRNTCA9IHRoaXMubGFiZWwgfHwgIiZuYnNwOyI7CisJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMubGFiZWxOb2RlKTsKKwl0aGlzLmRyYXcoKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuaW5pdCgpOworCXRoaXMuc3RhcnQoKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Db2xvclBhbGV0dGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0NvbG9yUGFsZXR0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJmMTBiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Db2xvclBhbGV0dGUuanMKQEAgLTAsMCArMSw2MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQ29sb3JQYWxldHRlIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkNvbG9yUGFsZXR0ZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtwYWxldHRlOiI3eDEwIiwgX3BhbGV0dGVzOnsiN3gxMCI6W1siZmZmIiwgImZjYyIsICJmYzkiLCAiZmY5IiwgImZmYyIsICI5ZjkiLCAiOWZmIiwgImNmZiIsICJjY2YiLCAiZmNmIl0sIFsiY2NjIiwgImY2NiIsICJmOTYiLCAiZmY2IiwgImZmMyIsICI2ZjkiLCAiM2ZmIiwgIjZmZiIsICI5OWYiLCAiZjlmIl0sIFsiYzBjMGMwIiwgImYwMCIsICJmOTAiLCAiZmM2IiwgImZmMCIsICIzZjMiLCAiNmNjIiwgIjNjZiIsICI2NmMiLCAiYzZjIl0sIFsiOTk5IiwgImMwMCIsICJmNjAiLCAiZmMzIiwgImZjMCIsICIzYzAiLCAiMGNjIiwgIjM2ZiIsICI2M2YiLCAiYzNjIl0sIFsiNjY2IiwgIjkwMCIsICJjNjAiLCAiYzkzIiwgIjk5MCIsICIwOTAiLCAiMzk5IiwgIjMzZiIsICI2MGMiLCAiOTM5Il0sIFsiMzMzIiwgIjYwMCIsICI5MzAiLCAiOTYzIiwgIjY2MCIsICIwNjAiLCAiMzY2IiwgIjAwOSIsICIzMzkiLCAiNjM2Il0sIFsiMDAwIiwgIjMwMCIsICI2MzAiLCAiNjMzIiwgIjMzMCIsICIwMzAiLCAiMDMzIiwgIjAwNiIsICIzMDkiLCAiMzAzIl1dLCAiM3g0IjpbWyJmZmZmZmYiLCAiMDBmZjAwIiwgIjAwODAwMCIsICIwMDAwZmYiXSwgWyJjMGMwYzAiLCAiZmZmZjAwIiwgImZmMDBmZiIsICIwMDAwODAiXSwgWyI4MDgwODAiLCAiZmYwMDAwIiwgIjgwMDA4MCIsICIwMDAwMDAiXV19LCBidWlsZFJlbmRlcmluZzpmdW5jdGlvbiAoKSB7CisJdGhpcy5kb21Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLmRvbU5vZGUpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbU5vZGUsICJvbm1vdXNlZG93biIsIGZ1bmN0aW9uIChlKSB7CisJCWUucHJldmVudERlZmF1bHQoKTsKKwl9KTsKKwl3aXRoICh0aGlzLmRvbU5vZGUpIHsKKwkJY2VsbFBhZGRpbmcgPSAiMCI7CisJCWNlbGxTcGFjaW5nID0gIjEiOworCQlib3JkZXIgPSAiMSI7CisJCXN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJ3aGl0ZSI7CisJfQorCXZhciBjb2xvcnMgPSB0aGlzLl9wYWxldHRlc1t0aGlzLnBhbGV0dGVdOworCWZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7CisJCXZhciB0ciA9IHRoaXMuZG9tTm9kZS5pbnNlcnRSb3coLTEpOworCQlmb3IgKHZhciBqID0gMDsgaiA8IGNvbG9yc1tpXS5sZW5ndGg7IGorKykgeworCQkJaWYgKGNvbG9yc1tpXVtqXS5sZW5ndGggPT0gMykgeworCQkJCWNvbG9yc1tpXVtqXSA9IGNvbG9yc1tpXVtqXS5yZXBsYWNlKC8oLikoLikoLikvLCAiJDEkMSQyJDIkMyQzIik7CisJCQl9CisJCQl2YXIgdGQgPSB0ci5pbnNlcnRDZWxsKC0xKTsKKwkJCXdpdGggKHRkLnN0eWxlKSB7CisJCQkJYmFja2dyb3VuZENvbG9yID0gIiMiICsgY29sb3JzW2ldW2pdOworCQkJCWJvcmRlciA9ICIxcHggc29saWQgZ3JheSI7CisJCQkJd2lkdGggPSBoZWlnaHQgPSAiMTVweCI7CisJCQkJZm9udFNpemUgPSAiMXB4IjsKKwkJCX0KKwkJCXRkLmNvbG9yID0gIiMiICsgY29sb3JzW2ldW2pdOworCQkJdGQub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoZSkgeworCQkJCXRoaXMuc3R5bGUuYm9yZGVyQ29sb3IgPSAid2hpdGUiOworCQkJfTsKKwkJCXRkLm9ubW91c2VvdXQgPSBmdW5jdGlvbiAoZSkgeworCQkJCXRoaXMuc3R5bGUuYm9yZGVyQ29sb3IgPSAiZ3JheSI7CisJCQl9OworCQkJZG9qby5ldmVudC5jb25uZWN0KHRkLCAib25tb3VzZWRvd24iLCB0aGlzLCAib25DbGljayIpOworCQkJdGQuaW5uZXJIVE1MID0gIiZuYnNwOyI7CisJCX0KKwl9Cit9LCBvbkNsaWNrOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5vbkNvbG9yU2VsZWN0KGUuY3VycmVudFRhcmdldC5jb2xvcik7CisJZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gImdyYXkiOworfSwgb25Db2xvclNlbGVjdDpmdW5jdGlvbiAoY29sb3IpIHsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Db21ib0JveC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ29tYm9Cb3guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5N2U0YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ29tYm9Cb3guanMKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkNvbWJvQm94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5odG1sLnN0YWJpbGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUG9wdXBDb250YWluZXIiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuaW5jcmVtZW50YWxDb21ib0JveERhdGFQcm92aWRlciIsIG51bGwsIGZ1bmN0aW9uIChvcHRpb25zKSB7CisJdGhpcy5zZWFyY2hVcmwgPSBvcHRpb25zLmRhdGFVcmw7CisJdGhpcy5fY2FjaGUgPSB7fTsKKwl0aGlzLl9pbkZsaWdodCA9IGZhbHNlOworCXRoaXMuX2xhc3RSZXF1ZXN0ID0gbnVsbDsKKwl0aGlzLmFsbG93Q2FjaGUgPSBmYWxzZTsKK30sIHtfYWRkVG9DYWNoZTpmdW5jdGlvbiAoa2V5d29yZCwgZGF0YSkgeworCWlmICh0aGlzLmFsbG93Q2FjaGUpIHsKKwkJdGhpcy5fY2FjaGVba2V5d29yZF0gPSBkYXRhOworCX0KK30sIHN0YXJ0U2VhcmNoOmZ1bmN0aW9uIChzZWFyY2hTdHIsIGNhbGxiYWNrKSB7CisJaWYgKHRoaXMuX2luRmxpZ2h0KSB7CisJfQorCXZhciB0c3MgPSBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyKTsKKwl2YXIgcmVhbFVybCA9IGRvam8uc3RyaW5nLnN1YnN0aXR1dGVQYXJhbXModGhpcy5zZWFyY2hVcmwsIHsic2VhcmNoU3RyaW5nIjp0c3N9KTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciByZXF1ZXN0ID0gdGhpcy5fbGFzdFJlcXVlc3QgPSBkb2pvLmlvLmJpbmQoe3VybDpyZWFsVXJsLCBtZXRob2Q6ImdldCIsIG1pbWV0eXBlOiJ0ZXh0L2pzb24iLCBsb2FkOmZ1bmN0aW9uICh0eXBlLCBkYXRhLCBldnQpIHsKKwkJX3RoaXMuX2luRmxpZ2h0ID0gZmFsc2U7CisJCWlmICghZG9qby5sYW5nLmlzQXJyYXkoZGF0YSkpIHsKKwkJCXZhciBhcnJEYXRhID0gW107CisJCQlmb3IgKHZhciBrZXkgaW4gZGF0YSkgeworCQkJCWFyckRhdGEucHVzaChbZGF0YVtrZXldLCBrZXldKTsKKwkJCX0KKwkJCWRhdGEgPSBhcnJEYXRhOworCQl9CisJCV90aGlzLl9hZGRUb0NhY2hlKHNlYXJjaFN0ciwgZGF0YSk7CisJCWlmIChyZXF1ZXN0ID09IF90aGlzLl9sYXN0UmVxdWVzdCkgeworCQkJY2FsbGJhY2soZGF0YSk7CisJCX0KKwl9fSk7CisJdGhpcy5faW5GbGlnaHQgPSB0cnVlOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5iYXNpY0NvbWJvQm94RGF0YVByb3ZpZGVyIiwgbnVsbCwgZnVuY3Rpb24gKG9wdGlvbnMsIG5vZGUpIHsKKwl0aGlzLl9kYXRhID0gW107CisJdGhpcy5zZWFyY2hMaW1pdCA9IDMwOworCXRoaXMuc2VhcmNoVHlwZSA9ICJTVEFSVFNUUklORyI7CisJdGhpcy5jYXNlU2Vuc2l0aXZlID0gZmFsc2U7CisJaWYgKCFkal91bmRlZigiZGF0YVVybCIsIG9wdGlvbnMpICYmICFkb2pvLnN0cmluZy5pc0JsYW5rKG9wdGlvbnMuZGF0YVVybCkpIHsKKwkJdGhpcy5fZ2V0RGF0YShvcHRpb25zLmRhdGFVcmwpOworCX0gZWxzZSB7CisJCWlmICgobm9kZSkgJiYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAic2VsZWN0IikpIHsKKwkJCXZhciBvcHRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIik7CisJCQl2YXIgb2wgPSBvcHRzLmxlbmd0aDsKKwkJCXZhciBkYXRhID0gW107CisJCQlmb3IgKHZhciB4ID0gMDsgeCA8IG9sOyB4KyspIHsKKwkJCQl2YXIgdGV4dCA9IG9wdHNbeF0udGV4dENvbnRlbnQgfHwgb3B0c1t4XS5pbm5lclRleHQgfHwgb3B0c1t4XS5pbm5lckhUTUw7CisJCQkJdmFyIGtleVZhbEFyciA9IFtTdHJpbmcodGV4dCksIFN0cmluZyhvcHRzW3hdLnZhbHVlKV07CisJCQkJZGF0YS5wdXNoKGtleVZhbEFycik7CisJCQkJaWYgKG9wdHNbeF0uc2VsZWN0ZWQpIHsKKwkJCQkJb3B0aW9ucy5zZXRBbGxWYWx1ZXMoa2V5VmFsQXJyWzBdLCBrZXlWYWxBcnJbMV0pOworCQkJCX0KKwkJCX0KKwkJCXRoaXMuc2V0RGF0YShkYXRhKTsKKwkJfQorCX0KK30sIHtfZ2V0RGF0YTpmdW5jdGlvbiAodXJsKSB7CisJZG9qby5pby5iaW5kKHt1cmw6dXJsLCBsb2FkOmRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0KSB7CisJCWlmICghZG9qby5sYW5nLmlzQXJyYXkoZGF0YSkpIHsKKwkJCXZhciBhcnJEYXRhID0gW107CisJCQlmb3IgKHZhciBrZXkgaW4gZGF0YSkgeworCQkJCWFyckRhdGEucHVzaChbZGF0YVtrZXldLCBrZXldKTsKKwkJCX0KKwkJCWRhdGEgPSBhcnJEYXRhOworCQl9CisJCXRoaXMuc2V0RGF0YShkYXRhKTsKKwl9KSwgbWltZXR5cGU6InRleHQvanNvbiJ9KTsKK30sIHN0YXJ0U2VhcmNoOmZ1bmN0aW9uIChzZWFyY2hTdHIsIGNhbGxiYWNrKSB7CisJdGhpcy5fcGVyZm9ybVNlYXJjaChzZWFyY2hTdHIsIGNhbGxiYWNrKTsKK30sIF9wZXJmb3JtU2VhcmNoOmZ1bmN0aW9uIChzZWFyY2hTdHIsIGNhbGxiYWNrKSB7CisJdmFyIHN0ID0gdGhpcy5zZWFyY2hUeXBlOworCXZhciByZXQgPSBbXTsKKwlpZiAoIXRoaXMuY2FzZVNlbnNpdGl2ZSkgeworCQlzZWFyY2hTdHIgPSBzZWFyY2hTdHIudG9Mb3dlckNhc2UoKTsKKwl9CisJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLl9kYXRhLmxlbmd0aDsgeCsrKSB7CisJCWlmICgodGhpcy5zZWFyY2hMaW1pdCA+IDApICYmIChyZXQubGVuZ3RoID49IHRoaXMuc2VhcmNoTGltaXQpKSB7CisJCQlicmVhazsKKwkJfQorCQl2YXIgZGF0YUxhYmVsID0gbmV3IFN0cmluZygoIXRoaXMuY2FzZVNlbnNpdGl2ZSkgPyB0aGlzLl9kYXRhW3hdWzBdLnRvTG93ZXJDYXNlKCkgOiB0aGlzLl9kYXRhW3hdWzBdKTsKKwkJaWYgKGRhdGFMYWJlbC5sZW5ndGggPCBzZWFyY2hTdHIubGVuZ3RoKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3QgPT0gIlNUQVJUU1RSSU5HIikgeworCQkJaWYgKHNlYXJjaFN0ciA9PSBkYXRhTGFiZWwuc3Vic3RyKDAsIHNlYXJjaFN0ci5sZW5ndGgpKSB7CisJCQkJcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoc3QgPT0gIlNVQlNUUklORyIpIHsKKwkJCQlpZiAoZGF0YUxhYmVsLmluZGV4T2Yoc2VhcmNoU3RyKSA+PSAwKSB7CisJCQkJCXJldC5wdXNoKHRoaXMuX2RhdGFbeF0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0ID09ICJTVEFSVFdPUkQiKSB7CisJCQkJCXZhciBpZHggPSBkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIpOworCQkJCQlpZiAoaWR4ID09IDApIHsKKwkJCQkJCXJldC5wdXNoKHRoaXMuX2RhdGFbeF0pOworCQkJCQl9CisJCQkJCWlmIChpZHggPD0gMCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJdmFyIG1hdGNoZXMgPSBmYWxzZTsKKwkJCQkJd2hpbGUgKGlkeCAhPSAtMSkgeworCQkJCQkJaWYgKCIgLC8oIi5pbmRleE9mKGRhdGFMYWJlbC5jaGFyQXQoaWR4IC0gMSkpICE9IC0xKSB7CisJCQkJCQkJbWF0Y2hlcyA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZHggPSBkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIsIGlkeCArIDEpOworCQkJCQl9CisJCQkJCWlmICghbWF0Y2hlcykgeworCQkJCQkJY29udGludWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXQucHVzaCh0aGlzLl9kYXRhW3hdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwljYWxsYmFjayhyZXQpOworfSwgc2V0RGF0YTpmdW5jdGlvbiAocGRhdGEpIHsKKwl0aGlzLl9kYXRhID0gcGRhdGE7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkNvbWJvQm94IiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge2ZvcmNlVmFsaWRPcHRpb246ZmFsc2UsIHNlYXJjaFR5cGU6InN0cmluZ3N0YXJ0IiwgZGF0YVByb3ZpZGVyOm51bGwsIGF1dG9Db21wbGV0ZTp0cnVlLCBzZWFyY2hEZWxheToxMDAsIGRhdGFVcmw6IiIsIGZhZGVUaW1lOjIwMCwgbWF4TGlzdExlbmd0aDo4LCBtb2RlOiJsb2NhbCIsIHNlbGVjdGVkUmVzdWx0Om51bGwsIGRhdGFQcm92aWRlckNsYXNzOiIiLCBidXR0b25TcmM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2NvbWJvX2JveF9hcnJvdy5wbmciKSwgZHJvcGRvd25Ub2dnbGU6ImZhZGUiLCB0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gXz1cIndoaXRlc3BhY2UgYW5kIENSJ3MgYmV0d2VlbiB0YWdzIGFkZHMgJm5ic3A7IGluIEZGXCJcblx0Y2xhc3M9XCJkb2pvQ29tYm9Cb3hPdXRlclwiXG5cdD48aW5wdXQgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIiAgdGFiaW5kZXg9XCItMVwiIG5hbWU9XCJcIiB2YWx1ZT1cIlwiIFxuXHRcdGRvam9BdHRhY2hQb2ludD1cImNvbWJvQm94VmFsdWVcIlxuXHQ+PGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lXCIgIHRhYmluZGV4PVwiLTFcIiBuYW1lPVwiXCIgdmFsdWU9XCJcIiBcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJjb21ib0JveFNlbGVjdGlvblZhbHVlXCJcblx0PjxpbnB1dCB0eXBlPVwidGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiZG9qb0NvbWJvQm94XCJcblx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJrZXk6X2hhbmRsZUtleUV2ZW50czsga2V5VXA6IG9uS2V5VXA7IGNvbXBvc2l0aW9uRW5kOyBvblJlc2l6ZTtcIlxuXHRcdGRvam9BdHRhY2hQb2ludD1cInRleHRJbnB1dE5vZGVcIlxuXHQ+PGltZyBoc3BhY2U9XCIwXCJcblx0XHR2c3BhY2U9XCIwXCJcblx0XHRjbGFzcz1cImRvam9Db21ib0JveFwiXG5cdFx0ZG9qb0F0dGFjaFBvaW50PVwiZG93bkFycm93Tm9kZVwiXG5cdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25Nb3VzZVVwOiBoYW5kbGVBcnJvd0NsaWNrOyBvblJlc2l6ZTtcIlxuXHRcdHNyYz1cIiR7dGhpcy5idXR0b25TcmN9XCJcbj48L3NwYW4+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9Db21ib0JveE91dGVyIHtcblx0Ym9yZGVyOiAwcHggIWltcG9ydGFudDtcblx0bWFyZ2luOiAwcHggIWltcG9ydGFudDtcblx0cGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXAgIWltcG9ydGFudDtcbn1cblxuLmRvam9Db21ib0JveCB7XG5cdGJvcmRlcjogMXB4IGluc2V0ICNhZmFmYWY7XG5cdG1hcmdpbjogMHB4O1xuXHRwYWRkaW5nOiAwcHg7XG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgIWltcG9ydGFudDtcblx0ZmxvYXQ6IG5vbmUgIWltcG9ydGFudDtcblx0cG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xuXHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbn1cblxuLyogdGhlIGlucHV0IGJveCAqL1xuaW5wdXQuZG9qb0NvbWJvQm94IHtcblx0Ym9yZGVyLXJpZ2h0LXdpZHRoOiAwcHggIWltcG9ydGFudDsgXG5cdG1hcmdpbi1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG5cdHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xufVxuXG4vKiB0aGUgZG93biBhcnJvdyAqL1xuaW1nLmRvam9Db21ib0JveCB7XG5cdGJvcmRlci1sZWZ0LXdpZHRoOiAwcHggIWltcG9ydGFudDtcblx0cGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcblx0bWFyZ2luLWxlZnQ6IDBweCAhaW1wb3J0YW50O1xufVxuXG4vKiBJRSB2ZXJ0aWNhbC1hbGlnbm1lbnQgY2FsY3VsYXRpb25zIGNhbiBiZSBvZmYgYnkgKy0xIGJ1dCB0aGVzZSBtYXJnaW5zIGFyZSBjb2xsYXBzZWQgYXdheSAqL1xuLmRqX2llIGltZy5kb2pvQ29tYm9Cb3gge1xuXHRtYXJnaW4tdG9wOiAxcHg7IFxuXHRtYXJnaW4tYm90dG9tOiAxcHg7IFxufVxuXG4vKiB0aGUgZHJvcCBkb3duICovXG4uZG9qb0NvbWJvQm94T3B0aW9ucyB7XG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIEdhcmFtb25kLCBzYW5zLXNlcmlmO1xuXHQvKiBmb250LXNpemU6IDAuN2VtOyAqL1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblx0Ym9yZGVyOiAxcHggc29saWQgI2FmYWZhZjtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR6LWluZGV4OiAxMDAwOyBcblx0b3ZlcmZsb3c6IGF1dG87XG5cdGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmRvam9Db21ib0JveEl0ZW0ge1xuXHRwYWRkaW5nLWxlZnQ6IDJweDtcblx0cGFkZGluZy10b3A6IDJweDtcblx0bWFyZ2luOiAwcHg7XG59XG5cbi5kb2pvQ29tYm9Cb3hJdGVtRXZlbiB7XG5cdGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XG59XG5cbi5kb2pvQ29tYm9Cb3hJdGVtT2RkIHtcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi5kb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0IHtcblx0YmFja2dyb3VuZC1jb2xvcjogIzYzNzA5QTtcblx0Y29sb3I6IHdoaXRlO1xufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0NvbWJvQm94LmNzcyIpLCBzZXRWYWx1ZTpmdW5jdGlvbiAodmFsdWUpIHsKKwl0aGlzLmNvbWJvQm94VmFsdWUudmFsdWUgPSB2YWx1ZTsKKwlpZiAodGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlICE9IHZhbHVlKSB7CisJCXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSA9IHZhbHVlOworCQlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0U3RhdGUodGhpcy53aWRnZXRJZCwgdGhpcy5nZXRTdGF0ZSgpLCB0cnVlKTsKKwkJdGhpcy5vblZhbHVlQ2hhbmdlZCh2YWx1ZSk7CisJfQorfSwgb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24gKHZhbHVlKSB7Cit9LCBnZXRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuY29tYm9Cb3hWYWx1ZS52YWx1ZTsKK30sIGdldFN0YXRlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4ge3ZhbHVlOnRoaXMuZ2V0VmFsdWUoKX07Cit9LCBzZXRTdGF0ZTpmdW5jdGlvbiAoc3RhdGUpIHsKKwl0aGlzLnNldFZhbHVlKHN0YXRlLnZhbHVlKTsKK30sIGVuYWJsZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5kaXNhYmxlZCA9IGZhbHNlOworCXRoaXMudGV4dElucHV0Tm9kZS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7Cit9LCBkaXNhYmxlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmRpc2FibGVkID0gdHJ1ZTsKKwl0aGlzLnRleHRJbnB1dE5vZGUuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsIHRydWUpOworfSwgX2dldENhcmV0UG9zOmZ1bmN0aW9uIChlbGVtZW50KSB7CisJaWYgKGRvam8ubGFuZy5pc051bWJlcihlbGVtZW50LnNlbGVjdGlvblN0YXJ0KSkgeworCQlyZXR1cm4gZWxlbWVudC5zZWxlY3Rpb25TdGFydDsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJdmFyIHRyID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuZHVwbGljYXRlKCk7CisJCQl2YXIgbnRyID0gZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJCXRyLm1vdmUoImNoYXJhY3RlciIsIDApOworCQkJbnRyLm1vdmUoImNoYXJhY3RlciIsIDApOworCQkJdHJ5IHsKKwkJCQludHIuc2V0RW5kUG9pbnQoIkVuZFRvRW5kIiwgdHIpOworCQkJCXJldHVybiBTdHJpbmcobnRyLnRleHQpLnJlcGxhY2UoL1xyL2csICIiKS5sZW5ndGg7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorfSwgX3NldENhcmV0UG9zOmZ1bmN0aW9uIChlbGVtZW50LCBsb2NhdGlvbikgeworCWxvY2F0aW9uID0gcGFyc2VJbnQobG9jYXRpb24pOworCXRoaXMuX3NldFNlbGVjdGVkUmFuZ2UoZWxlbWVudCwgbG9jYXRpb24sIGxvY2F0aW9uKTsKK30sIF9zZXRTZWxlY3RlZFJhbmdlOmZ1bmN0aW9uIChlbGVtZW50LCBzdGFydCwgZW5kKSB7CisJaWYgKCFlbmQpIHsKKwkJZW5kID0gZWxlbWVudC52YWx1ZS5sZW5ndGg7CisJfQorCWlmIChlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKSB7CisJCWVsZW1lbnQuZm9jdXMoKTsKKwkJZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTsKKwl9IGVsc2UgeworCQlpZiAoZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UpIHsKKwkJCXZhciByYW5nZSA9IGVsZW1lbnQuY3JlYXRlVGV4dFJhbmdlKCk7CisJCQl3aXRoIChyYW5nZSkgeworCQkJCWNvbGxhcHNlKHRydWUpOworCQkJCW1vdmVFbmQoImNoYXJhY3RlciIsIGVuZCk7CisJCQkJbW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLCBzdGFydCk7CisJCQkJc2VsZWN0KCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQllbGVtZW50LnZhbHVlID0gZWxlbWVudC52YWx1ZTsKKwkJCWVsZW1lbnQuYmx1cigpOworCQkJZWxlbWVudC5mb2N1cygpOworCQkJdmFyIGRpc3QgPSBwYXJzZUludChlbGVtZW50LnZhbHVlLmxlbmd0aCkgLSBlbmQ7CisJCQl2YXIgdGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDM3KTsKKwkJCXZhciB0Y2MgPSB0Y2hhci5jaGFyQ29kZUF0KDApOworCQkJZm9yICh2YXIgeCA9IDA7IHggPCBkaXN0OyB4KyspIHsKKwkJCQl2YXIgdGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiS2V5RXZlbnRzIik7CisJCQkJdGUuaW5pdEtleUV2ZW50KCJrZXlwcmVzcyIsIHRydWUsIHRydWUsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0Y2MsIHRjYyk7CisJCQkJZWxlbWVudC5kaXNwYXRjaEV2ZW50KHRlKTsKKwkJCX0KKwkJfQorCX0KK30sIF9oYW5kbGVLZXlFdmVudHM6ZnVuY3Rpb24gKGV2dCkgeworCWlmIChldnQuY3RybEtleSB8fCBldnQuYWx0S2V5IHx8ICFldnQua2V5KSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlID0gZmFsc2U7CisJdGhpcy5fcHJldl9rZXlfZXNjID0gZmFsc2U7CisJdmFyIGsgPSBkb2pvLmV2ZW50LmJyb3dzZXIua2V5czsKKwl2YXIgZG9TZWFyY2ggPSB0cnVlOworCXN3aXRjaCAoZXZ0LmtleSkgeworCSAgY2FzZSBrLktFWV9ET1dOX0FSUk9XOgorCQlpZiAoIXRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KSB7CisJCQl0aGlzLl9zdGFydFNlYXJjaEZyb21JbnB1dCgpOworCQl9CisJCXRoaXMuX2hpZ2hsaWdodE5leHRPcHRpb24oKTsKKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQlyZXR1cm47CisJICBjYXNlIGsuS0VZX1VQX0FSUk9XOgorCQl0aGlzLl9oaWdobGlnaHRQcmV2T3B0aW9uKCk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJcmV0dXJuOworCSAgY2FzZSBrLktFWV9UQUI6CisJCWlmICghdGhpcy5hdXRvQ29tcGxldGUgJiYgdGhpcy5wb3B1cFdpZGdldC5pc1Nob3dpbmdOb3cgJiYgdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKSB7CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQl0aGlzLl9zZWxlY3RPcHRpb24oeyJ0YXJnZXQiOnRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiwgIm5vSGlkZSI6ZmFsc2V9KTsKKwkJCXRoaXMuX3NldFNlbGVjdGVkUmFuZ2UodGhpcy50ZXh0SW5wdXROb2RlLCB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuX3NlbGVjdE9wdGlvbigpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCSAgY2FzZSBrLktFWV9FTlRFUjoKKwkJaWYgKHRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KSB7CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCX0KKwkJaWYgKHRoaXMuYXV0b0NvbXBsZXRlKSB7CisJCQl0aGlzLl9zZWxlY3RPcHRpb24oKTsKKwkJCXJldHVybjsKKwkJfQorCSAgY2FzZSAiICI6CisJCWlmICh0aGlzLnBvcHVwV2lkZ2V0LmlzU2hvd2luZ05vdyAmJiB0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pIHsKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCXRoaXMuX3NlbGVjdE9wdGlvbigpOworCQkJdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwkgIGNhc2Ugay5LRVlfRVNDQVBFOgorCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQl0aGlzLl9wcmV2X2tleV9lc2MgPSB0cnVlOworCQlyZXR1cm47CisJICBjYXNlIGsuS0VZX0JBQ0tTUEFDRToKKwkJdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlID0gdHJ1ZTsKKwkJaWYgKCF0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKSB7CisJCQl0aGlzLnNldEFsbFZhbHVlcygiIiwgIiIpOworCQkJdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKwkJCWRvU2VhcmNoID0gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJICBjYXNlIGsuS0VZX1JJR0hUX0FSUk9XOgorCSAgY2FzZSBrLktFWV9MRUZUX0FSUk9XOgorCQlkb1NlYXJjaCA9IGZhbHNlOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCWlmIChldnQuY2hhckNvZGUgPT0gMCkgeworCQkJZG9TZWFyY2ggPSBmYWxzZTsKKwkJfQorCX0KKwlpZiAodGhpcy5zZWFyY2hUaW1lcikgeworCQljbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lcik7CisJfQorCWlmIChkb1NlYXJjaCkgeworCQl0aGlzLl9ibHVyT3B0aW9uTm9kZSgpOworCQl0aGlzLnNlYXJjaFRpbWVyID0gc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgdGhpcy5fc3RhcnRTZWFyY2hGcm9tSW5wdXQpLCB0aGlzLnNlYXJjaERlbGF5KTsKKwl9Cit9LCBjb21wb3NpdGlvbkVuZDpmdW5jdGlvbiAoZXZ0KSB7CisJZXZ0LmtleSA9IGV2dC5rZXlDb2RlOworCXRoaXMuX2hhbmRsZUtleUV2ZW50cyhldnQpOworfSwgb25LZXlVcDpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5zZXRWYWx1ZSh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUpOworfSwgc2V0U2VsZWN0ZWRWYWx1ZTpmdW5jdGlvbiAodmFsdWUpIHsKKwl0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWUgPSB2YWx1ZTsKK30sIHNldEFsbFZhbHVlczpmdW5jdGlvbiAodmFsdWUxLCB2YWx1ZTIpIHsKKwl0aGlzLnNldFNlbGVjdGVkVmFsdWUodmFsdWUyKTsKKwl0aGlzLnNldFZhbHVlKHZhbHVlMSk7Cit9LCBfZm9jdXNPcHRpb25Ob2RlOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiAhPSBub2RlKSB7CisJCXRoaXMuX2JsdXJPcHRpb25Ob2RlKCk7CisJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiA9IG5vZGU7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24sICJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7CisJfQorfSwgX2JsdXJPcHRpb25Ob2RlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKSB7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24sICJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7CisJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiA9IG51bGw7CisJfQorfSwgX2hpZ2hsaWdodE5leHRPcHRpb246ZnVuY3Rpb24gKCkgeworCWlmICgoIXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbikgfHwgIXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wYXJlbnROb2RlKSB7CisJCXRoaXMuX2ZvY3VzT3B0aW9uTm9kZSh0aGlzLm9wdGlvbnNMaXN0Tm9kZS5maXJzdENoaWxkKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm5leHRTaWJsaW5nKSB7CisJCQl0aGlzLl9mb2N1c09wdGlvbk5vZGUodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm5leHRTaWJsaW5nKTsKKwkJfQorCX0KKwlkb2pvLmh0bWwuc2Nyb2xsSW50b1ZpZXcodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKTsKK30sIF9oaWdobGlnaHRQcmV2T3B0aW9uOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uICYmIHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wcmV2aW91c1NpYmxpbmcpIHsKKwkJdGhpcy5fZm9jdXNPcHRpb25Ob2RlKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wcmV2aW91c1NpYmxpbmcpOworCX0gZWxzZSB7CisJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiA9IG51bGw7CisJCXRoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CisJCXJldHVybjsKKwl9CisJZG9qby5odG1sLnNjcm9sbEludG9WaWV3KHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbik7Cit9LCBfaXRlbU1vdXNlT3ZlcjpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKGV2dC50YXJnZXQgPT09IHRoaXMub3B0aW9uc0xpc3ROb2RlKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5fZm9jdXNPcHRpb25Ob2RlKGV2dC50YXJnZXQpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24sICJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7Cit9LCBfaXRlbU1vdXNlT3V0OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoZXZ0LnRhcmdldCA9PT0gdGhpcy5vcHRpb25zTGlzdE5vZGUpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9ibHVyT3B0aW9uTm9kZSgpOworfSwgb25SZXNpemU6ZnVuY3Rpb24gKCkgeworCXZhciBpbnB1dFNpemUgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLnRleHRJbnB1dE5vZGUpOworCWlmIChpbnB1dFNpemUuaGVpZ2h0IDw9IDApIHsKKwkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIm9uUmVzaXplIiwgMTAwKTsKKwkJcmV0dXJuOworCX0KKwl2YXIgYnV0dG9uU2l6ZSA9IHt3aWR0aDppbnB1dFNpemUuaGVpZ2h0LCBoZWlnaHQ6aW5wdXRTaXplLmhlaWdodH07CisJZG9qby5odG1sLnNldENvbnRlbnRCb3godGhpcy5kb3duQXJyb3dOb2RlLCBidXR0b25TaXplKTsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby5odG1sLmFwcGx5QnJvd3NlckNsYXNzKHRoaXMuZG9tTm9kZSk7CisJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJaWYgKCF0aGlzLm5hbWUgJiYgc291cmNlLm5hbWUpIHsKKwkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CisJfQorCXRoaXMuY29tYm9Cb3hWYWx1ZS5uYW1lID0gdGhpcy5uYW1lOworCXRoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS5uYW1lID0gdGhpcy5uYW1lICsgIl9zZWxlY3RlZCI7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLnRleHRJbnB1dE5vZGUsIHNvdXJjZSk7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvd25BcnJvd05vZGUsIHNvdXJjZSk7CisJd2l0aCAodGhpcy5kb3duQXJyb3dOb2RlLnN0eWxlKSB7CisJCXdpZHRoID0gIjBweCI7CisJCWhlaWdodCA9ICIwcHgiOworCX0KKwl2YXIgZHBDbGFzczsKKwlpZiAodGhpcy5kYXRhUHJvdmlkZXJDbGFzcykgeworCQlpZiAodHlwZW9mIHRoaXMuZGF0YVByb3ZpZGVyQ2xhc3MgPT0gInN0cmluZyIpIHsKKwkJCWRwQ2xhc3MgPSBkb2pvLmV2YWxPYmpQYXRoKHRoaXMuZGF0YVByb3ZpZGVyQ2xhc3MpOworCQl9IGVsc2UgeworCQkJZHBDbGFzcyA9IHRoaXMuZGF0YVByb3ZpZGVyQ2xhc3M7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGhpcy5tb2RlID09ICJyZW1vdGUiKSB7CisJCQlkcENsYXNzID0gZG9qby53aWRnZXQuaW5jcmVtZW50YWxDb21ib0JveERhdGFQcm92aWRlcjsKKwkJfSBlbHNlIHsKKwkJCWRwQ2xhc3MgPSBkb2pvLndpZGdldC5iYXNpY0NvbWJvQm94RGF0YVByb3ZpZGVyOworCQl9CisJfQorCXRoaXMuZGF0YVByb3ZpZGVyID0gbmV3IGRwQ2xhc3ModGhpcywgdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKSk7CisJdGhpcy5wb3B1cFdpZGdldCA9IG5ldyBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlBvcHVwQ29udGFpbmVyIiwge3RvZ2dsZTp0aGlzLmRyb3Bkb3duVG9nZ2xlLCB0b2dnbGVEdXJhdGlvbjp0aGlzLnRvZ2dsZUR1cmF0aW9ufSk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJkZXN0cm95IiwgdGhpcy5wb3B1cFdpZGdldCwgImRlc3Ryb3kiKTsKKwl0aGlzLm9wdGlvbnNMaXN0Tm9kZSA9IHRoaXMucG9wdXBXaWRnZXQuZG9tTm9kZTsKKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5vcHRpb25zTGlzdE5vZGUpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLm9wdGlvbnNMaXN0Tm9kZSwgImRvam9Db21ib0JveE9wdGlvbnMiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsICJvbmNsaWNrIiwgdGhpcywgIl9zZWxlY3RPcHRpb24iKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsICJvbm1vdXNlb3ZlciIsIHRoaXMsICJfb25Nb3VzZU92ZXIiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsICJvbm1vdXNlb3V0IiwgdGhpcywgIl9vbk1vdXNlT3V0Iik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMub3B0aW9uc0xpc3ROb2RlLCAib25tb3VzZW92ZXIiLCB0aGlzLCAiX2l0ZW1Nb3VzZU92ZXIiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsICJvbm1vdXNlb3V0IiwgdGhpcywgIl9pdGVtTW91c2VPdXQiKTsKK30sIF9vcGVuUmVzdWx0TGlzdDpmdW5jdGlvbiAocmVzdWx0cykgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5fY2xlYXJSZXN1bHRMaXN0KCk7CisJaWYgKCFyZXN1bHRzLmxlbmd0aCkgeworCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCX0KKwlpZiAoKHRoaXMuYXV0b0NvbXBsZXRlKSAmJiAocmVzdWx0cy5sZW5ndGgpICYmICghdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlKSAmJiAodGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCA+IDApKSB7CisJCXZhciBjcG9zID0gdGhpcy5fZ2V0Q2FyZXRQb3ModGhpcy50ZXh0SW5wdXROb2RlKTsKKwkJaWYgKChjcG9zICsgMSkgPiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKSB7CisJCQl0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgKz0gcmVzdWx0c1swXVswXS5zdWJzdHIoY3Bvcyk7CisJCQl0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSwgY3BvcywgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCk7CisJCX0KKwl9CisJdmFyIGV2ZW4gPSB0cnVlOworCXdoaWxlIChyZXN1bHRzLmxlbmd0aCkgeworCQl2YXIgdHIgPSByZXN1bHRzLnNoaWZ0KCk7CisJCWlmICh0cikgeworCQkJdmFyIHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQl0ZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0clswXSkpOworCQkJdGQuc2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiwgdHJbMF0pOworCQkJdGQuc2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIsIHRyWzFdKTsKKwkJCXRkLmNsYXNzTmFtZSA9ICJkb2pvQ29tYm9Cb3hJdGVtICIgKyAoKGV2ZW4pID8gImRvam9Db21ib0JveEl0ZW1FdmVuIiA6ICJkb2pvQ29tYm9Cb3hJdGVtT2RkIik7CisJCQlldmVuID0gKCFldmVuKTsKKwkJCXRoaXMub3B0aW9uc0xpc3ROb2RlLmFwcGVuZENoaWxkKHRkKTsKKwkJfQorCX0KKwl0aGlzLl9zaG93UmVzdWx0TGlzdCgpOworfSwgX29uRm9jdXNJbnB1dDpmdW5jdGlvbiAoKSB7CisJdGhpcy5faGFzRm9jdXMgPSB0cnVlOworfSwgX29uQmx1cklucHV0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9oYXNGb2N1cyA9IGZhbHNlOworCXRoaXMuX2hhbmRsZUJsdXJUaW1lcih0cnVlLCA1MDApOworfSwgX2hhbmRsZUJsdXJUaW1lcjpmdW5jdGlvbiAoY2xlYXIsIG1pbGxpc2VjKSB7CisJaWYgKHRoaXMuYmx1clRpbWVyICYmIChjbGVhciB8fCBtaWxsaXNlYykpIHsKKwkJY2xlYXJUaW1lb3V0KHRoaXMuYmx1clRpbWVyKTsKKwl9CisJaWYgKG1pbGxpc2VjKSB7CisJCXRoaXMuYmx1clRpbWVyID0gZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIl9jaGVja0JsdXJyZWQiLCBtaWxsaXNlYyk7CisJfQorfSwgX29uTW91c2VPdmVyOmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoIXRoaXMuX21vdXNlb3Zlcl9saXN0KSB7CisJCXRoaXMuX2hhbmRsZUJsdXJUaW1lcih0cnVlLCAwKTsKKwkJdGhpcy5fbW91c2VvdmVyX2xpc3QgPSB0cnVlOworCX0KK30sIF9vbk1vdXNlT3V0OmZ1bmN0aW9uIChldnQpIHsKKwl2YXIgcmVsVGFyZ2V0ID0gZXZ0LnJlbGF0ZWRUYXJnZXQ7CisJdHJ5IHsKKwkJaWYgKCFyZWxUYXJnZXQgfHwgcmVsVGFyZ2V0LnBhcmVudE5vZGUgIT0gdGhpcy5vcHRpb25zTGlzdE5vZGUpIHsKKwkJCXRoaXMuX21vdXNlb3Zlcl9saXN0ID0gZmFsc2U7CisJCQl0aGlzLl9oYW5kbGVCbHVyVGltZXIodHJ1ZSwgMTAwKTsKKwkJCXRoaXMuX3RyeUZvY3VzKCk7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwl9Cit9LCBfaXNJbnB1dEVxdWFsVG9SZXN1bHQ6ZnVuY3Rpb24gKHJlc3VsdCkgeworCXZhciBpbnB1dCA9IHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZTsKKwlpZiAoIXRoaXMuZGF0YVByb3ZpZGVyLmNhc2VTZW5zaXRpdmUpIHsKKwkJaW5wdXQgPSBpbnB1dC50b0xvd2VyQ2FzZSgpOworCQlyZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTsKKwl9CisJcmV0dXJuIChpbnB1dCA9PSByZXN1bHQpOworfSwgX2lzVmFsaWRPcHRpb246ZnVuY3Rpb24gKCkgeworCXZhciB0Z3QgPSBkb2pvLmh0bWwuZmlyc3RFbGVtZW50KHRoaXMub3B0aW9uc0xpc3ROb2RlKTsKKwl2YXIgaXNWYWxpZE9wdGlvbiA9IGZhbHNlOworCXdoaWxlICghaXNWYWxpZE9wdGlvbiAmJiB0Z3QpIHsKKwkJaWYgKHRoaXMuX2lzSW5wdXRFcXVhbFRvUmVzdWx0KHRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSkpIHsKKwkJCWlzVmFsaWRPcHRpb24gPSB0cnVlOworCQl9IGVsc2UgeworCQkJdGd0ID0gZG9qby5odG1sLm5leHRFbGVtZW50KHRndCk7CisJCX0KKwl9CisJcmV0dXJuIGlzVmFsaWRPcHRpb247Cit9LCBfY2hlY2tCbHVycmVkOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuX2hhc0ZvY3VzICYmICF0aGlzLl9tb3VzZW92ZXJfbGlzdCkgeworCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQlpZiAoIXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpIHsKKwkJCXRoaXMuc2V0QWxsVmFsdWVzKCIiLCAiIik7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIGlzVmFsaWRPcHRpb24gPSB0aGlzLl9pc1ZhbGlkT3B0aW9uKCk7CisJCWlmICh0aGlzLmZvcmNlVmFsaWRPcHRpb24gJiYgIWlzVmFsaWRPcHRpb24pIHsKKwkJCXRoaXMuc2V0QWxsVmFsdWVzKCIiLCAiIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFpc1ZhbGlkT3B0aW9uKSB7CisJCQl0aGlzLnNldFNlbGVjdGVkVmFsdWUoIiIpOworCQl9CisJfQorfSwgX3NlbGVjdE9wdGlvbjpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHRndCA9IG51bGw7CisJaWYgKCFldnQpIHsKKwkJZXZ0ID0ge3RhcmdldDp0aGlzLl9oaWdobGlnaHRlZF9vcHRpb259OworCX0KKwlpZiAoIWRvam8uaHRtbC5pc0Rlc2NlbmRhbnRPZihldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnNMaXN0Tm9kZSkpIHsKKwkJaWYgKCF0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGd0ID0gZG9qby5odG1sLmZpcnN0RWxlbWVudCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSk7CisJCWlmICghdGd0IHx8ICF0aGlzLl9pc0lucHV0RXF1YWxUb1Jlc3VsdCh0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIikpKSB7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQl0Z3QgPSBldnQudGFyZ2V0OworCX0KKwl3aGlsZSAoKHRndC5ub2RlVHlwZSAhPSAxKSB8fCAoIXRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSkpIHsKKwkJdGd0ID0gdGd0LnBhcmVudE5vZGU7CisJCWlmICh0Z3QgPT09IGRvam8uYm9keSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisgICAgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlPSIiOworICAgIHRoaXMuc2VsZWN0ZWRSZXN1bHQgPSBbdGd0LmdldEF0dHJpYnV0ZSgicmVzdWx0TmFtZSIpLCB0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIpXTsKKwl0aGlzLnNldEFsbFZhbHVlcyh0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiksIHRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdFZhbHVlIikpOworCWlmICghZXZ0Lm5vSGlkZSkgeworCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQl0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSwgMCwgbnVsbCk7CisJfQorCXRoaXMuX3RyeUZvY3VzKCk7Cit9LCBfY2xlYXJSZXN1bHRMaXN0OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5vcHRpb25zTGlzdE5vZGUuaW5uZXJIVE1MKSB7CisJCXRoaXMub3B0aW9uc0xpc3ROb2RlLmlubmVySFRNTCA9ICIiOworCX0KK30sIF9oaWRlUmVzdWx0TGlzdDpmdW5jdGlvbiAoKSB7CisJdGhpcy5wb3B1cFdpZGdldC5jbG9zZSgpOworfSwgX3Nob3dSZXN1bHRMaXN0OmZ1bmN0aW9uICgpIHsKKwl2YXIgY2hpbGRzID0gdGhpcy5vcHRpb25zTGlzdE5vZGUuY2hpbGROb2RlczsKKwlpZiAoY2hpbGRzLmxlbmd0aCkgeworCQl2YXIgdmlzaWJsZUNvdW50ID0gTWF0aC5taW4oY2hpbGRzLmxlbmd0aCwgdGhpcy5tYXhMaXN0TGVuZ3RoKTsKKwkJd2l0aCAodGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUpIHsKKwkJCWRpc3BsYXkgPSAiIjsKKwkJCWlmICh2aXNpYmxlQ291bnQgPT0gY2hpbGRzLmxlbmd0aCkgeworCQkJCWhlaWdodCA9ICIiOworCQkJfSBlbHNlIHsKKwkJCQloZWlnaHQgPSB2aXNpYmxlQ291bnQgKiBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KGNoaWxkc1swXSkuaGVpZ2h0ICsgInB4IjsKKwkJCX0KKwkJCXdpZHRoID0gKGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKS53aWR0aCAtIDIpICsgInB4IjsKKwkJfQorCQl0aGlzLnBvcHVwV2lkZ2V0Lm9wZW4odGhpcy5kb21Ob2RlLCB0aGlzLCB0aGlzLmRvd25BcnJvd05vZGUpOworCX0gZWxzZSB7CisJCXRoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CisJfQorfSwgaGFuZGxlQXJyb3dDbGljazpmdW5jdGlvbiAoKSB7CisJdGhpcy5faGFuZGxlQmx1clRpbWVyKHRydWUsIDApOworCXRoaXMuX3RyeUZvY3VzKCk7CisJaWYgKHRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KSB7CisJCXRoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CisJfSBlbHNlIHsKKwkJdGhpcy5fc3RhcnRTZWFyY2goIiIpOworCX0KK30sIF90cnlGb2N1czpmdW5jdGlvbiAoKSB7CisJdHJ5IHsKKwkJdGhpcy50ZXh0SW5wdXROb2RlLmZvY3VzKCk7CisJfQorCWNhdGNoIChlKSB7CisJfQorfSwgX3N0YXJ0U2VhcmNoRnJvbUlucHV0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zdGFydFNlYXJjaCh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUpOworfSwgX3N0YXJ0U2VhcmNoOmZ1bmN0aW9uIChrZXkpIHsKKwl0aGlzLmRhdGFQcm92aWRlci5zdGFydFNlYXJjaChrZXksIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX29wZW5SZXN1bHRMaXN0IikpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5vblJlc2l6ZSgpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnRleHRJbnB1dE5vZGUsICJvbmJsdXIiLCB0aGlzLCAiX29uQmx1cklucHV0Iik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMudGV4dElucHV0Tm9kZSwgIm9uZm9jdXMiLCB0aGlzLCAiX29uRm9jdXNJbnB1dCIpOworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXRoaXMuZGlzYWJsZSgpOworCX0KKwl2YXIgcyA9IGRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5nZXRTdGF0ZSh0aGlzLndpZGdldElkKTsKKwlpZiAocykgeworCQl0aGlzLnNldFN0YXRlKHMpOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Db250ZW50UGFuZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ29udGVudFBhbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMGJkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ29udGVudFBhbmUuanMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuZXh0cmFzIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Db250ZW50UGFuZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zdHlsZU5vZGVzID0gW107CisJdGhpcy5fb25Mb2FkU3RhY2sgPSBbXTsKKwl0aGlzLl9vblVubG9hZFN0YWNrID0gW107CisJdGhpcy5fY2FsbE9uVW5sb2FkID0gZmFsc2U7CisJdGhpcy5faW9CaW5kT2JqOworCXRoaXMuc2NyaXB0U2NvcGU7CisJdGhpcy5iaW5kQXJncyA9IHt9OworfSwge2lzQ29udGFpbmVyOnRydWUsIGFkanVzdFBhdGhzOnRydWUsIGhyZWY6IiIsIGV4dHJhY3RDb250ZW50OnRydWUsIHBhcnNlQ29udGVudDp0cnVlLCBjYWNoZUNvbnRlbnQ6dHJ1ZSwgcHJlbG9hZDpmYWxzZSwgcmVmcmVzaE9uU2hvdzpmYWxzZSwgaGFuZGxlcjoiIiwgZXhlY3V0ZVNjcmlwdHM6ZmFsc2UsIHNjcmlwdFNlcGFyYXRpb246dHJ1ZSwgbG9hZGluZ01lc3NhZ2U6IkxvYWRpbmcuLi4iLCBpc0xvYWRlZDpmYWxzZSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZywgcGFyZW50Q29tcCkgeworCWlmICh0aGlzLmhhbmRsZXIgIT09ICIiKSB7CisJCXRoaXMuc2V0SGFuZGxlcih0aGlzLmhhbmRsZXIpOworCX0KKwlpZiAodGhpcy5pc1Nob3dpbmcoKSB8fCB0aGlzLnByZWxvYWQpIHsKKwkJdGhpcy5sb2FkQ29udGVudHMoKTsKKwl9Cit9LCBzaG93OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5yZWZyZXNoT25TaG93KSB7CisJCXRoaXMucmVmcmVzaCgpOworCX0gZWxzZSB7CisJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJfQorCWRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLnN1cGVyY2xhc3Muc2hvdy5jYWxsKHRoaXMpOworfSwgcmVmcmVzaDpmdW5jdGlvbiAoKSB7CisJdGhpcy5pc0xvYWRlZCA9IGZhbHNlOworCXRoaXMubG9hZENvbnRlbnRzKCk7Cit9LCBsb2FkQ29udGVudHM6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzTG9hZGVkKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuaGFuZGxlcikpIHsKKwkJdGhpcy5fcnVuSGFuZGxlcigpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmhyZWYgIT0gIiIpIHsKKwkJCXRoaXMuX2Rvd25sb2FkRXh0ZXJuYWxDb250ZW50KHRoaXMuaHJlZiwgdGhpcy5jYWNoZUNvbnRlbnQgJiYgIXRoaXMucmVmcmVzaE9uU2hvdyk7CisJCX0KKwl9Cit9LCBzZXRVcmw6ZnVuY3Rpb24gKHVybCkgeworCXRoaXMuaHJlZiA9IHVybDsKKwl0aGlzLmlzTG9hZGVkID0gZmFsc2U7CisJaWYgKHRoaXMucHJlbG9hZCB8fCB0aGlzLmlzU2hvd2luZygpKSB7CisJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJfQorfSwgYWJvcnQ6ZnVuY3Rpb24gKCkgeworCXZhciBiaW5kID0gdGhpcy5faW9CaW5kT2JqOworCWlmICghYmluZCB8fCAhYmluZC5hYm9ydCkgeworCQlyZXR1cm47CisJfQorCWJpbmQuYWJvcnQoKTsKKwlkZWxldGUgdGhpcy5faW9CaW5kT2JqOworfSwgX2Rvd25sb2FkRXh0ZXJuYWxDb250ZW50OmZ1bmN0aW9uICh1cmwsIHVzZUNhY2hlKSB7CisJdGhpcy5hYm9ydCgpOworCXRoaXMuX2hhbmRsZURlZmF1bHRzKHRoaXMubG9hZGluZ01lc3NhZ2UsICJvbkRvd25sb2FkU3RhcnQiKTsKKwl2YXIgc2VsZiA9IHRoaXM7CisJdGhpcy5faW9CaW5kT2JqID0gZG9qby5pby5iaW5kKHRoaXMuX2NhY2hlU2V0dGluZyh7dXJsOnVybCwgbWltZXR5cGU6InRleHQvaHRtbCIsIGhhbmRsZXI6ZnVuY3Rpb24gKHR5cGUsIGRhdGEsIHhocikgeworCQlkZWxldGUgc2VsZi5faW9CaW5kT2JqOworCQlpZiAodHlwZSA9PSAibG9hZCIpIHsKKwkJCXNlbGYub25Eb3dubG9hZEVuZC5jYWxsKHNlbGYsIHVybCwgZGF0YSk7CisJCX0gZWxzZSB7CisJCQl2YXIgZSA9IHtyZXNwb25zZVRleHQ6eGhyLnJlc3BvbnNlVGV4dCwgc3RhdHVzOnhoci5zdGF0dXMsIHN0YXR1c1RleHQ6eGhyLnN0YXR1c1RleHQsIHJlc3BvbnNlSGVhZGVyczp4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksIHRleHQ6IkVycm9yIGxvYWRpbmcgJyIgKyB1cmwgKyAiJyAoIiArIHhoci5zdGF0dXMgKyAiICIgKyB4aHIuc3RhdHVzVGV4dCArICIpIn07CisJCQlzZWxmLl9oYW5kbGVEZWZhdWx0cy5jYWxsKHNlbGYsIGUsICJvbkRvd25sb2FkRXJyb3IiKTsKKwkJCXNlbGYub25Mb2FkKCk7CisJCX0KKwl9fSwgdXNlQ2FjaGUpKTsKK30sIF9jYWNoZVNldHRpbmc6ZnVuY3Rpb24gKGJpbmRPYmosIHVzZUNhY2hlKSB7CisJZm9yICh2YXIgeCBpbiB0aGlzLmJpbmRBcmdzKSB7CisJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9ialt4XSkpIHsKKwkJCWJpbmRPYmpbeF0gPSB0aGlzLmJpbmRBcmdzW3hdOworCQl9CisJfQorCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9iai51c2VDYWNoZSkpIHsKKwkJYmluZE9iai51c2VDYWNoZSA9IHVzZUNhY2hlOworCX0KKwlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGJpbmRPYmoucHJldmVudENhY2hlKSkgeworCQliaW5kT2JqLnByZXZlbnRDYWNoZSA9ICF1c2VDYWNoZTsKKwl9CisJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChiaW5kT2JqLm1pbWV0eXBlKSkgeworCQliaW5kT2JqLm1pbWV0eXBlID0gInRleHQvaHRtbCI7CisJfQorCXJldHVybiBiaW5kT2JqOworfSwgb25Mb2FkOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5fcnVuU3RhY2soIl9vbkxvYWRTdGFjayIpOworCXRoaXMuaXNMb2FkZWQgPSB0cnVlOworfSwgb25VbkxvYWQ6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmRlcHJlY2F0ZWQodGhpcy53aWRnZXRUeXBlICsgIi5vblVuTG9hZCwgdXNlIC5vblVubG9hZCAobG93ZXJjYXNlZCBsb2FkKSIsIDAuNSk7Cit9LCBvblVubG9hZDpmdW5jdGlvbiAoZSkgeworCXRoaXMuX3J1blN0YWNrKCJfb25VbmxvYWRTdGFjayIpOworCWRlbGV0ZSB0aGlzLnNjcmlwdFNjb3BlOworCWlmICh0aGlzLm9uVW5Mb2FkICE9PSBkb2pvLndpZGdldC5Db250ZW50UGFuZS5wcm90b3R5cGUub25VbkxvYWQpIHsKKwkJdGhpcy5vblVuTG9hZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KK30sIF9ydW5TdGFjazpmdW5jdGlvbiAoc3ROYW1lKSB7CisJdmFyIHN0ID0gdGhpc1tzdE5hbWVdOworCXZhciBlcnIgPSAiIjsKKwl2YXIgc2NvcGUgPSB0aGlzLnNjcmlwdFNjb3BlIHx8IHdpbmRvdzsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSB7CisJCXRyeSB7CisJCQlzdFtpXS5jYWxsKHNjb3BlKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQkJZXJyICs9ICJcbiIgKyBzdFtpXSArICIgZmFpbGVkOiAiICsgZS5kZXNjcmlwdGlvbjsKKwkJfQorCX0KKwl0aGlzW3N0TmFtZV0gPSBbXTsKKwlpZiAoZXJyLmxlbmd0aCkgeworCQl2YXIgbmFtZSA9IChzdE5hbWUgPT0gIl9vbkxvYWRTdGFjayIpID8gImFkZE9uTG9hZCIgOiAiYWRkT25VbkxvYWQiOworCQl0aGlzLl9oYW5kbGVEZWZhdWx0cyhuYW1lICsgIiBmYWlsdXJlXG4gIiArIGVyciwgIm9uRXhlY0Vycm9yIiwgImRlYnVnIik7CisJfQorfSwgYWRkT25Mb2FkOmZ1bmN0aW9uIChvYmosIGZ1bmMpIHsKKwl0aGlzLl9wdXNoT25TdGFjayh0aGlzLl9vbkxvYWRTdGFjaywgb2JqLCBmdW5jKTsKK30sIGFkZE9uVW5sb2FkOmZ1bmN0aW9uIChvYmosIGZ1bmMpIHsKKwl0aGlzLl9wdXNoT25TdGFjayh0aGlzLl9vblVubG9hZFN0YWNrLCBvYmosIGZ1bmMpOworfSwgYWRkT25VbkxvYWQ6ZnVuY3Rpb24gKCkgeworCWRvam8uZGVwcmVjYXRlZCh0aGlzLndpZGdldFR5cGUgKyAiLmFkZE9uVW5Mb2FkLCB1c2UgYWRkT25VbmxvYWQgaW5zdGVhZC4gKGxvd2VyY2FzZWQgTG9hZCkiLCAwLjUpOworCXRoaXMuYWRkT25VbmxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIF9wdXNoT25TdGFjazpmdW5jdGlvbiAoc3RhY2ssIG9iaiwgZnVuYykgeworCWlmICh0eXBlb2YgZnVuYyA9PSAidW5kZWZpbmVkIikgeworCQlzdGFjay5wdXNoKG9iaik7CisJfSBlbHNlIHsKKwkJc3RhY2sucHVzaChmdW5jdGlvbiAoKSB7CisJCQlvYmpbZnVuY10oKTsKKwkJfSk7CisJfQorfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy5vblVubG9hZCgpOworCWRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworfSwgb25FeGVjRXJyb3I6ZnVuY3Rpb24gKGUpIHsKK30sIG9uQ29udGVudEVycm9yOmZ1bmN0aW9uIChlKSB7Cit9LCBvbkRvd25sb2FkRXJyb3I6ZnVuY3Rpb24gKGUpIHsKK30sIG9uRG93bmxvYWRTdGFydDpmdW5jdGlvbiAoZSkgeworfSwgb25Eb3dubG9hZEVuZDpmdW5jdGlvbiAodXJsLCBkYXRhKSB7CisJZGF0YSA9IHRoaXMuc3BsaXRBbmRGaXhQYXRocyhkYXRhLCB1cmwpOworCXRoaXMuc2V0Q29udGVudChkYXRhKTsKK30sIF9oYW5kbGVEZWZhdWx0czpmdW5jdGlvbiAoZSwgaGFuZGxlciwgbWVzc1R5cGUpIHsKKwlpZiAoIWhhbmRsZXIpIHsKKwkJaGFuZGxlciA9ICJvbkNvbnRlbnRFcnJvciI7CisJfQorCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoZSkpIHsKKwkJZSA9IHt0ZXh0OmV9OworCX0KKwlpZiAoIWUudGV4dCkgeworCQllLnRleHQgPSBlLnRvU3RyaW5nKCk7CisJfQorCWUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiB0aGlzLnRleHQ7CisJfTsKKwlpZiAodHlwZW9mIGUucmV0dXJuVmFsdWUgIT0gImJvb2xlYW4iKSB7CisJCWUucmV0dXJuVmFsdWUgPSB0cnVlOworCX0KKwlpZiAodHlwZW9mIGUucHJldmVudERlZmF1bHQgIT0gImZ1bmN0aW9uIikgeworCQllLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkgeworCQkJdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQl9OworCX0KKwl0aGlzW2hhbmRsZXJdKGUpOworCWlmIChlLnJldHVyblZhbHVlKSB7CisJCXN3aXRjaCAobWVzc1R5cGUpIHsKKwkJICBjYXNlIHRydWU6CisJCSAgY2FzZSAiYWxlcnQiOgorCQkJYWxlcnQoZS50b1N0cmluZygpKTsKKwkJCWJyZWFrOworCQkgIGNhc2UgImRlYnVnIjoKKwkJCWRvam8uZGVidWcoZS50b1N0cmluZygpKTsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlpZiAodGhpcy5fY2FsbE9uVW5sb2FkKSB7CisJCQkJdGhpcy5vblVubG9hZCgpOworCQkJfQorCQkJdGhpcy5fY2FsbE9uVW5sb2FkID0gZmFsc2U7CisJCQlpZiAoYXJndW1lbnRzLmNhbGxlZS5fbG9vcFN0b3ApIHsKKwkJCQlkb2pvLmRlYnVnKGUudG9TdHJpbmcoKSk7CisJCQl9IGVsc2UgeworCQkJCWFyZ3VtZW50cy5jYWxsZWUuX2xvb3BTdG9wID0gdHJ1ZTsKKwkJCQl0aGlzLl9zZXRDb250ZW50KGUudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9CisJYXJndW1lbnRzLmNhbGxlZS5fbG9vcFN0b3AgPSBmYWxzZTsKK30sIHNwbGl0QW5kRml4UGF0aHM6ZnVuY3Rpb24gKHMsIHVybCkgeworCXZhciB0aXRsZXMgPSBbXSwgc2NyaXB0cyA9IFtdLCB0bXAgPSBbXTsKKwl2YXIgbWF0Y2ggPSBbXSwgcmVxdWlyZXMgPSBbXSwgYXR0ciA9IFtdLCBzdHlsZXMgPSBbXTsKKwl2YXIgc3RyID0gIiIsIHBhdGggPSAiIiwgZml4ID0gIiIsIHRhZ0ZpeCA9ICIiLCB0YWcgPSAiIiwgb3JpZ1BhdGggPSAiIjsKKwlpZiAoIXVybCkgeworCQl1cmwgPSAiLi8iOworCX0KKwlpZiAocykgeworCQl2YXIgcmVnZXggPSAvPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOworCQl3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHMpKSB7CisJCQl0aXRsZXMucHVzaChtYXRjaFsxXSk7CisJCQlzID0gcy5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCQl9CisJCWlmICh0aGlzLmFkanVzdFBhdGhzKSB7CisJCQl2YXIgcmVnZXhGaW5kVGFnID0gLzxbYS16XVthLXowLTldKltePl0qXHMoPzooPzpzcmN8aHJlZnxzdHlsZSk9W14+XSkrW14+XSo+L2k7CisJCQl2YXIgcmVnZXhGaW5kQXR0ciA9IC9ccyhzcmN8aHJlZnxzdHlsZSk9KFsnIl0/KShbXHcoKVxbXF1cLy4sXFwnIi06OyM9Jj9cc0BdKz8pXDIvaTsKKwkJCXZhciByZWdleFByb3RvY29scyA9IC9eKD86WyNdfCg/Oig/Omh0dHBzP3xmdHBzP3xmaWxlfGphdmFzY3JpcHR8bWFpbHRvfG5ld3MpOikpLzsKKwkJCXdoaWxlICh0YWcgPSByZWdleEZpbmRUYWcuZXhlYyhzKSkgeworCQkJCXN0ciArPSBzLnN1YnN0cmluZygwLCB0YWcuaW5kZXgpOworCQkJCXMgPSBzLnN1YnN0cmluZygodGFnLmluZGV4ICsgdGFnWzBdLmxlbmd0aCksIHMubGVuZ3RoKTsKKwkJCQl0YWcgPSB0YWdbMF07CisJCQkJdGFnRml4ID0gIiI7CisJCQkJd2hpbGUgKGF0dHIgPSByZWdleEZpbmRBdHRyLmV4ZWModGFnKSkgeworCQkJCQlwYXRoID0gIiI7CisJCQkJCW9yaWdQYXRoID0gYXR0clszXTsKKwkJCQkJc3dpdGNoIChhdHRyWzFdLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkJICBjYXNlICJzcmMiOgorCQkJCQkgIGNhc2UgImhyZWYiOgorCQkJCQkJaWYgKHJlZ2V4UHJvdG9jb2xzLmV4ZWMob3JpZ1BhdGgpKSB7CisJCQkJCQkJcGF0aCA9IG9yaWdQYXRoOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwYXRoID0gKG5ldyBkb2pvLnVyaS5VcmkodXJsLCBvcmlnUGF0aCkudG9TdHJpbmcoKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJICBjYXNlICJzdHlsZSI6CisJCQkJCQlwYXRoID0gZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KG9yaWdQYXRoLCB1cmwpOworCQkJCQkJYnJlYWs7CisJCQkJCSAgZGVmYXVsdDoKKwkJCQkJCXBhdGggPSBvcmlnUGF0aDsKKwkJCQkJfQorCQkJCQlmaXggPSAiICIgKyBhdHRyWzFdICsgIj0iICsgYXR0clsyXSArIHBhdGggKyBhdHRyWzJdOworCQkJCQl0YWdGaXggKz0gdGFnLnN1YnN0cmluZygwLCBhdHRyLmluZGV4KSArIGZpeDsKKwkJCQkJdGFnID0gdGFnLnN1YnN0cmluZygoYXR0ci5pbmRleCArIGF0dHJbMF0ubGVuZ3RoKSwgdGFnLmxlbmd0aCk7CisJCQkJfQorCQkJCXN0ciArPSB0YWdGaXggKyB0YWc7CisJCQl9CisJCQlzID0gc3RyICsgczsKKwkJfQorCQlyZWdleCA9IC8oPzo8KHN0eWxlKVtePl0qPihbXHNcU10qPyk8XC9zdHlsZT58PGxpbmsgKFtePl0qcmVsPVsnIl0/c3R5bGVzaGVldFsnIl0/W14+XSopPikvaTsKKwkJd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzKSkgeworCQkJaWYgKG1hdGNoWzFdICYmIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgPT0gInN0eWxlIikgeworCQkJCXN0eWxlcy5wdXNoKGRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChtYXRjaFsyXSwgdXJsKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhdHRyID0gbWF0Y2hbM10ubWF0Y2goL2hyZWY9KFsnIl0/KShbXiciPl0qKVwxL2kpKSB7CisJCQkJCXN0eWxlcy5wdXNoKHtwYXRoOmF0dHJbMl19KTsKKwkJCQl9CisJCQl9CisJCQlzID0gcy5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCQl9CisJCXZhciByZWdleCA9IC88c2NyaXB0KFtePl0qKT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9pOworCQl2YXIgcmVnZXhTcmMgPSAvc3JjPShbJyJdPykoW14iJ10qKVwxL2k7CisJCXZhciByZWdleERvam9KcyA9IC8uKihcYmRvam9cYlwuanMoPzpcLnVuY29tcHJlc3NlZFwuanMpPykkLzsKKwkJdmFyIHJlZ2V4SW52YWxpZCA9IC8oPzp2YXIgKT9cYmRqQ29uZmlnXGIoPzpbXHNdKj1bXHNdKlx7W159XStcfXxcLltcd10qW1xzXSo9W1xzXSpbXjtcbl0qKT87P3xkb2pvXC5ob3N0ZW52XC53cml0ZUluY2x1ZGVzXChccypcKTs/L2c7CisJCXZhciByZWdleFJlcXVpcmVzID0gL2Rvam9cLig/Oig/OnJlcXVpcmUoPzpBZnRlcik/KD86SWYpPyl8KD86d2lkZ2V0XC4oPzptYW5hZ2VyXC4pP3JlZ2lzdGVyV2lkZ2V0UGFja2FnZSl8KD86KD86aG9zdGVudlwuKT9zZXRNb2R1bGVQcmVmaXh8cmVnaXN0ZXJNb2R1bGVQYXRoKXxkZWZpbmVOYW1lc3BhY2UpXCgoWyciXSkuKj9cMVwpXHMqOz8vOworCQl3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHMpKSB7CisJCQlpZiAodGhpcy5leGVjdXRlU2NyaXB0cyAmJiBtYXRjaFsxXSkgeworCQkJCWlmIChhdHRyID0gcmVnZXhTcmMuZXhlYyhtYXRjaFsxXSkpIHsKKwkJCQkJaWYgKHJlZ2V4RG9qb0pzLmV4ZWMoYXR0clsyXSkpIHsKKwkJCQkJCWRvam8uZGVidWcoIlNlY3VyaXR5IG5vdGUhIGluaGliaXQ6IiArIGF0dHJbMl0gKyAiIGZyb20gIGJlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNjcmlwdHMucHVzaCh7cGF0aDphdHRyWzJdfSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobWF0Y2hbMl0pIHsKKwkJCQl2YXIgc2MgPSBtYXRjaFsyXS5yZXBsYWNlKHJlZ2V4SW52YWxpZCwgIiIpOworCQkJCWlmICghc2MpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXdoaWxlICh0bXAgPSByZWdleFJlcXVpcmVzLmV4ZWMoc2MpKSB7CisJCQkJCXJlcXVpcmVzLnB1c2godG1wWzBdKTsKKwkJCQkJc2MgPSBzYy5zdWJzdHJpbmcoMCwgdG1wLmluZGV4KSArIHNjLnN1YnN0cih0bXAuaW5kZXggKyB0bXBbMF0ubGVuZ3RoKTsKKwkJCQl9CisJCQkJaWYgKHRoaXMuZXhlY3V0ZVNjcmlwdHMpIHsKKwkJCQkJc2NyaXB0cy5wdXNoKHNjKTsKKwkJCQl9CisJCQl9CisJCQlzID0gcy5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCQl9CisJCWlmICh0aGlzLmV4dHJhY3RDb250ZW50KSB7CisJCQltYXRjaCA9IHMubWF0Y2goLzxib2R5W14+XSo+XHMqKFtcc1xTXSspXHMqPFwvYm9keT4vaW0pOworCQkJaWYgKG1hdGNoKSB7CisJCQkJcyA9IG1hdGNoWzFdOworCQkJfQorCQl9CisJCWlmICh0aGlzLmV4ZWN1dGVTY3JpcHRzICYmIHRoaXMuc2NyaXB0U2VwYXJhdGlvbikgeworCQkJdmFyIHJlZ2V4ID0gLyg8W2EtekEtWl1bYS16QS1aMC05XSpcc1tePl0qP1xTPSkoKFsnIl0pW14+XSpzY3JpcHRTY29wZVtePl0qPikvOworCQkJdmFyIHJlZ2V4QXR0ciA9IC8oW1xzJyI7OlwoXSlzY3JpcHRTY29wZSguKikvOworCQkJc3RyID0gIiI7CisJCQl3aGlsZSAodGFnID0gcmVnZXguZXhlYyhzKSkgeworCQkJCXRtcCA9ICgodGFnWzNdID09ICInIikgPyAiXCIiIDogIiciKTsKKwkJCQlmaXggPSAiIjsKKwkJCQlzdHIgKz0gcy5zdWJzdHJpbmcoMCwgdGFnLmluZGV4KSArIHRhZ1sxXTsKKwkJCQl3aGlsZSAoYXR0ciA9IHJlZ2V4QXR0ci5leGVjKHRhZ1syXSkpIHsKKwkJCQkJdGFnWzJdID0gdGFnWzJdLnN1YnN0cmluZygwLCBhdHRyLmluZGV4KSArIGF0dHJbMV0gKyAiZG9qby53aWRnZXQuYnlJZCgiICsgdG1wICsgdGhpcy53aWRnZXRJZCArIHRtcCArICIpLnNjcmlwdFNjb3BlIiArIGF0dHJbMl07CisJCQkJfQorCQkJCXN0ciArPSB0YWdbMl07CisJCQkJcyA9IHMuc3Vic3RyKHRhZy5pbmRleCArIHRhZ1swXS5sZW5ndGgpOworCQkJfQorCQkJcyA9IHN0ciArIHM7CisJCX0KKwl9CisJcmV0dXJuIHsieG1sIjpzLCAic3R5bGVzIjpzdHlsZXMsICJ0aXRsZXMiOnRpdGxlcywgInJlcXVpcmVzIjpyZXF1aXJlcywgInNjcmlwdHMiOnNjcmlwdHMsICJ1cmwiOnVybH07Cit9LCBfc2V0Q29udGVudDpmdW5jdGlvbiAoY29udCkgeworCXRoaXMuZGVzdHJveUNoaWxkcmVuKCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zdHlsZU5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLl9zdHlsZU5vZGVzW2ldICYmIHRoaXMuX3N0eWxlTm9kZXNbaV0ucGFyZW50Tm9kZSkgeworCQkJdGhpcy5fc3R5bGVOb2Rlc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX3N0eWxlTm9kZXNbaV0pOworCQl9CisJfQorCXRoaXMuX3N0eWxlTm9kZXMgPSBbXTsKKwl0cnkgeworCQl2YXIgbm9kZSA9IHRoaXMuY29udGFpbmVyTm9kZSB8fCB0aGlzLmRvbU5vZGU7CisJCXdoaWxlKG5vZGUhPW51bGwgJiYgbm9kZS5maXJzdENoaWxkKXsgCisJCQlkb2pvLmh0bWwuZGVzdHJveU5vZGUobm9kZS5maXJzdENoaWxkKTsKKwkJfQorCQlpZiAodHlwZW9mIGNvbnQgIT0gInN0cmluZyIpIHsKKwkJCW5vZGUuYXBwZW5kQ2hpbGQoY29udCk7CisJCX0gZWxzZSB7CisJCQlub2RlLmlubmVySFRNTCA9IGNvbnQ7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwkJZS50ZXh0ID0gIkNvdWxkbid0IGxvYWQgY29udGVudDoiICsgZS5kZXNjcmlwdGlvbjsKKwkJdGhpcy5faGFuZGxlRGVmYXVsdHMoZSwgIm9uQ29udGVudEVycm9yIik7CisJfQorfSwgc2V0Q29udGVudDpmdW5jdGlvbiAoZGF0YSkgeworCXRoaXMuYWJvcnQoKTsKKwlpZiAodGhpcy5fY2FsbE9uVW5sb2FkKSB7CisJCXRoaXMub25VbmxvYWQoKTsKKwl9CisJdGhpcy5fY2FsbE9uVW5sb2FkID0gdHJ1ZTsKKwlpZiAoIWRhdGEgfHwgZG9qby5odG1sLmlzTm9kZShkYXRhKSkgeworCQl0aGlzLl9zZXRDb250ZW50KGRhdGEpOworCQl0aGlzLm9uUmVzaXplZCgpOworCQl0aGlzLm9uTG9hZCgpOworCX0gZWxzZSB7CisJCWlmICh0eXBlb2YgZGF0YS54bWwgIT0gInN0cmluZyIpIHsKKwkJCXRoaXMuaHJlZiA9ICIiOworCQkJZGF0YSA9IHRoaXMuc3BsaXRBbmRGaXhQYXRocyhkYXRhKTsKKwkJfQorCQl0aGlzLl9zZXRDb250ZW50KGRhdGEueG1sKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLnN0eWxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRhdGEuc3R5bGVzW2ldLnBhdGgpIHsKKwkJCQl0aGlzLl9zdHlsZU5vZGVzLnB1c2goZG9qby5odG1sLmluc2VydENzc0ZpbGUoZGF0YS5zdHlsZXNbaV0ucGF0aCwgZG9qby5kb2MoKSwgZmFsc2UsIHRydWUpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5fc3R5bGVOb2Rlcy5wdXNoKGRvam8uaHRtbC5pbnNlcnRDc3NUZXh0KGRhdGEuc3R5bGVzW2ldKSk7CisJCQl9CisJCX0KKwkJaWYgKHRoaXMucGFyc2VDb250ZW50KSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKKwkJCQl0cnkgeworCQkJCQlldmFsKGRhdGEucmVxdWlyZXNbaV0pOworCQkJCX0KKwkJCQljYXRjaCAoZSkgeworCQkJCQllLnRleHQgPSAiQ29udGVudFBhbmU6IGVycm9yIGluIHBhY2thZ2UgbG9hZGluZyBjYWxscywgIiArIChlLmRlc2NyaXB0aW9uIHx8IGUpOworCQkJCQl0aGlzLl9oYW5kbGVEZWZhdWx0cyhlLCAib25Db250ZW50RXJyb3IiLCAiZGVidWciKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdmFyIF9zZWxmID0gdGhpczsKKwkJZnVuY3Rpb24gYXN5bmNQYXJzZSgpIHsKKwkJCWlmIChfc2VsZi5leGVjdXRlU2NyaXB0cykgeworCQkJCV9zZWxmLl9leGVjdXRlU2NyaXB0cyhkYXRhLnNjcmlwdHMpOworCQkJfQorCQkJaWYgKF9zZWxmLnBhcnNlQ29udGVudCkgeworCQkJCXZhciBub2RlID0gX3NlbGYuY29udGFpbmVyTm9kZSB8fCBfc2VsZi5kb21Ob2RlOworCQkJCXZhciBwYXJzZXIgPSBuZXcgZG9qby54bWwuUGFyc2UoKTsKKwkJCQl2YXIgZnJhZyA9IHBhcnNlci5wYXJzZUVsZW1lbnQobm9kZSwgbnVsbCwgdHJ1ZSk7CisJCQkJZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlU3ViQ29tcG9uZW50cyhmcmFnLCBfc2VsZik7CisJCQl9CisJCQlfc2VsZi5vblJlc2l6ZWQoKTsKKwkJCV9zZWxmLm9uTG9hZCgpOworCQl9CisJCWlmIChkb2pvLmhvc3RlbnYuaXNYRG9tYWluICYmIGRhdGEucmVxdWlyZXMubGVuZ3RoKSB7CisJCQlkb2pvLmFkZE9uTG9hZChhc3luY1BhcnNlKTsKKwkJfSBlbHNlIHsKKwkJCWFzeW5jUGFyc2UoKTsKKwkJfQorCX0KK30sIHNldEhhbmRsZXI6ZnVuY3Rpb24gKGhhbmRsZXIpIHsKKwl2YXIgZmNuID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oaGFuZGxlcikgPyBoYW5kbGVyIDogd2luZG93W2hhbmRsZXJdOworCWlmICghZG9qby5sYW5nLmlzRnVuY3Rpb24oZmNuKSkgeworCQl0aGlzLl9oYW5kbGVEZWZhdWx0cygiVW5hYmxlIHRvIHNldCBoYW5kbGVyLCAnIiArIGhhbmRsZXIgKyAiJyBub3QgYSBmdW5jdGlvbi4iLCAib25FeGVjRXJyb3IiLCB0cnVlKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBmY24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9OworfSwgX3J1bkhhbmRsZXI6ZnVuY3Rpb24gKCkgeworCXZhciByZXQgPSB0cnVlOworCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmhhbmRsZXIpKSB7CisJCXRoaXMuaGFuZGxlcih0aGlzLCB0aGlzLmRvbU5vZGUpOworCQlyZXQgPSBmYWxzZTsKKwl9CisJdGhpcy5vbkxvYWQoKTsKKwlyZXR1cm4gcmV0OworfSwgX2V4ZWN1dGVTY3JpcHRzOmZ1bmN0aW9uIChzY3JpcHRzKSB7CisJdmFyIHNlbGYgPSB0aGlzOworCXZhciB0bXAgPSAiIiwgY29kZSA9ICIiOworCWZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykgeworCQlpZiAoc2NyaXB0c1tpXS5wYXRoKSB7CisJCQlkb2pvLmlvLmJpbmQodGhpcy5fY2FjaGVTZXR0aW5nKHsidXJsIjpzY3JpcHRzW2ldLnBhdGgsICJsb2FkIjpmdW5jdGlvbiAodHlwZSwgc2NyaXB0U3RyKSB7CisJCQkJZG9qby5sYW5nLmhpdGNoKHNlbGYsIHRtcCA9ICI7IiArIHNjcmlwdFN0cik7CisJCQl9LCAiZXJyb3IiOmZ1bmN0aW9uICh0eXBlLCBlcnJvcikgeworCQkJCWVycm9yLnRleHQgPSB0eXBlICsgIiBkb3dubG9hZGluZyByZW1vdGUgc2NyaXB0IjsKKwkJCQlzZWxmLl9oYW5kbGVEZWZhdWx0cy5jYWxsKHNlbGYsIGVycm9yLCAib25FeGVjRXJyb3IiLCAiZGVidWciKTsKKwkJCX0sICJtaW1ldHlwZSI6InRleHQvcGxhaW4iLCAic3luYyI6dHJ1ZX0sIHRoaXMuY2FjaGVDb250ZW50KSk7CisJCQljb2RlICs9IHRtcDsKKwkJfSBlbHNlIHsKKwkJCWNvZGUgKz0gc2NyaXB0c1tpXTsKKwkJfQorCX0KKwl0cnkgeworCQlpZiAodGhpcy5zY3JpcHRTZXBhcmF0aW9uKSB7CisJCQlkZWxldGUgdGhpcy5zY3JpcHRTY29wZTsKKwkJCXRoaXMuc2NyaXB0U2NvcGUgPSBuZXcgKG5ldyBGdW5jdGlvbigiX2NvbnRhaW5lcl8iLCBjb2RlICsgIjsgcmV0dXJuIHRoaXM7IikpKHNlbGYpOworCQl9IGVsc2UgeworCQkJdmFyIGRqZyA9IGRvam8uZ2xvYmFsKCk7CisJCQlpZiAoZGpnLmV4ZWNTY3JpcHQpIHsKKwkJCQlkamcuZXhlY1NjcmlwdChjb2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIGRqZCA9IGRvam8uZG9jKCk7CisJCQkJdmFyIHNjID0gZGpkLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJCXNjLmFwcGVuZENoaWxkKGRqZC5jcmVhdGVUZXh0Tm9kZShjb2RlKSk7CisJCQkJKHRoaXMuY29udGFpbmVyTm9kZSB8fCB0aGlzLmRvbU5vZGUpLmFwcGVuZENoaWxkKHNjKTsKKwkJCX0KKwkJfQorCX0KKwljYXRjaCAoZSkgeworCQllLnRleHQgPSAiRXJyb3IgcnVubmluZyBzY3JpcHRzIGZyb20gY29udGVudDpcbiIgKyBlLmRlc2NyaXB0aW9uOworCQl0aGlzLl9oYW5kbGVEZWZhdWx0cyhlLCAib25FeGVjRXJyb3IiLCAiZGVidWciKTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ3VycmVuY3lUZXh0Ym94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9DdXJyZW5jeVRleHRib3guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYWZiMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvQ3VycmVuY3lUZXh0Ym94LmpzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkN1cnJlbmN5VGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLmNvbW1vbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5DdXJyZW5jeVRleHRib3giLCBkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveCwge21peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuQ3VycmVuY3lUZXh0Ym94LnN1cGVyY2xhc3MubWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJaWYgKGxvY2FsUHJvcGVydGllcy5mcmFjdGlvbmFsKSB7CisJCXRoaXMuZmxhZ3MuZnJhY3Rpb25hbCA9IChsb2NhbFByb3BlcnRpZXMuZnJhY3Rpb25hbCA9PSAidHJ1ZSIpOworCX0gZWxzZSB7CisJCWlmIChsb2NhbFByb3BlcnRpZXMuY2VudHMpIHsKKwkJCWRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuSW50ZWdlclRleHRib3giLCAidXNlIGZyYWN0aW9uYWwgYXR0ciBpbnN0ZWFkIG9mIGNlbnRzIiwgIjAuNSIpOworCQkJdGhpcy5mbGFncy5mcmFjdGlvbmFsID0gKGxvY2FsUHJvcGVydGllcy5jZW50cyA9PSAidHJ1ZSIpOworCQl9CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuc3ltYm9sKSB7CisJCXRoaXMuZmxhZ3Muc3ltYm9sID0gbG9jYWxQcm9wZXJ0aWVzLnN5bWJvbDsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5taW4pIHsKKwkJdGhpcy5mbGFncy5taW4gPSBwYXJzZUZsb2F0KGxvY2FsUHJvcGVydGllcy5taW4pOworCX0KKwlpZiAobG9jYWxQcm9wZXJ0aWVzLm1heCkgeworCQl0aGlzLmZsYWdzLm1heCA9IHBhcnNlRmxvYXQobG9jYWxQcm9wZXJ0aWVzLm1heCk7CisJfQorfSwgaXNWYWxpZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNDdXJyZW5jeSh0aGlzLnRleHRib3gudmFsdWUsIHRoaXMuZmxhZ3MpOworfSwgaXNJblJhbmdlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc0luUmFuZ2UodGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9EYXRlUGlja2VyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9EYXRlUGlja2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjQyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0RhdGVQaWNrZXIuanMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRhdGVQaWNrZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGUuZm9ybWF0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5zZXJpYWxpemUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRGF0ZVBpY2tlciIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt2YWx1ZToiIiwgbmFtZToiIiwgZGlzcGxheVdlZWtzOjYsIGFkanVzdFdlZWtzOmZhbHNlLCBzdGFydERhdGU6IjE0OTItMTAtMTIiLCBlbmREYXRlOiIyOTQxLTEwLTEyIiwgd2Vla1N0YXJ0c09uOiIiLCBzdGF0aWNEaXNwbGF5OmZhbHNlLCBkYXlXaWR0aDoibmFycm93IiwgY2xhc3NOYW1lczp7cHJldmlvdXM6InByZXZpb3VzTW9udGgiLCBkaXNhYmxlZFByZXZpb3VzOiJwcmV2aW91c01vbnRoRGlzYWJsZWQiLCBjdXJyZW50OiJjdXJyZW50TW9udGgiLCBkaXNhYmxlZEN1cnJlbnQ6ImN1cnJlbnRNb250aERpc2FibGVkIiwgbmV4dDoibmV4dE1vbnRoIiwgZGlzYWJsZWROZXh0OiJuZXh0TW9udGhEaXNhYmxlZCIsIGN1cnJlbnREYXRlOiJjdXJyZW50RGF0ZSIsIHNlbGVjdGVkRGF0ZToic2VsZWN0ZWREYXRlIn0sIHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiZGF0ZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImRhdGVQaWNrZXJDb250YWluZXJOb2RlXCI+XG5cdDx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiBjbGFzcz1cImNhbGVuZGFyQ29udGFpbmVyXCI+XG5cdFx0PHRoZWFkPlxuXHRcdFx0PHRyPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJtb250aFdyYXBwZXJcIiB2YWxpZ249XCJ0b3BcIj5cblx0XHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJtb250aENvbnRhaW5lclwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHRcdFx0XHRcdDx0cj5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwibW9udGhDdXJ2ZSBtb250aEN1cnZlVExcIiB2YWxpZ249XCJ0b3BcIj48L3RkPlxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJtb250aExhYmVsQ29udGFpbmVyXCIgdmFsaWduPVwidG9wXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVhc2VXZWVrTm9kZVwiIFxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRXZWVrO1wiIFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGluY3JlYXNlXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW1hZ2VzL2luY3JlbWVudE1vbnRoLnBuZ1wiIFxuXHRcdFx0XHRcdFx0XHRcdFx0YWx0PVwiJmRhcnI7XCIgc3R5bGU9XCJ3aWR0aDo3cHg7aGVpZ2h0OjVweDtcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hQb2ludD1cImluY3JlYXNlTW9udGhOb2RlXCIgXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvbkluY3JlbWVudE1vbnRoO1wiIGNsYXNzPVwiaW5jcmVtZW50Q29udHJvbCBpbmNyZWFzZVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmdcIiBcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWx0PVwiJmRhcnI7XCIgIGRvam9BdHRhY2hQb2ludD1cImluY3JlbWVudE1vbnRoSW1hZ2VOb2RlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIFxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaFBvaW50PVwiZGVjcmVhc2VXZWVrTm9kZVwiIFxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRXZWVrO1wiIFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW1hZ2VzL2RlY3JlbWVudE1vbnRoLnBuZ1wiIGFsdD1cIiZ1YXJyO1wiIHN0eWxlPVwid2lkdGg6N3B4O2hlaWdodDo1cHg7XCIgLz5cblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkZWNyZWFzZU1vbnRoTm9kZVwiIFxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRNb250aDtcIiBjbGFzcz1cImluY3JlbWVudENvbnRyb2wgZGVjcmVhc2VcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nXCIgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFsdD1cIiZ1YXJyO1wiIGRvam9BdHRhY2hQb2ludD1cImRlY3JlbWVudE1vbnRoSW1hZ2VOb2RlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cIm1vbnRoTGFiZWxOb2RlXCIgY2xhc3M9XCJtb250aFwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwibW9udGhDdXJ2ZSBtb250aEN1cnZlVFJcIiB2YWxpZ249XCJ0b3BcIj48L3RkPlxuXHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC90cj5cblx0XHQ8L3RoZWFkPlxuXHRcdDx0Ym9keT5cblx0XHRcdDx0cj5cblx0XHRcdFx0PHRkIGNvbHNwYW49XCIzXCI+XG5cdFx0XHRcdFx0PHRhYmxlIGNsYXNzPVwiY2FsZW5kYXJCb2R5Q29udGFpbmVyXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCIgYm9yZGVyPVwiMFwiPlxuXHRcdFx0XHRcdFx0PHRoZWFkPlxuXHRcdFx0XHRcdFx0XHQ8dHIgZG9qb0F0dGFjaFBvaW50PVwiZGF5TGFiZWxzUm93XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0XHQ8L3RoZWFkPlxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cImNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlXCIgXG5cdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IF9oYW5kbGVVaUNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0XHQ8dHIgZG9qb0F0dGFjaFBvaW50PVwiY2FsZW5kYXJXZWVrVGVtcGxhdGVcIj5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90Ym9keT5cblx0XHQ8dGZvb3Q+XG5cdFx0XHQ8dHI+XG5cdFx0XHRcdDx0ZCBjb2xzcGFuPVwiM1wiIGNsYXNzPVwieWVhcldyYXBwZXJcIj5cblx0XHRcdFx0XHQ8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCIgYm9yZGVyPVwiMFwiIGNsYXNzPVwieWVhckNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJjdXJ2ZUJMXCIgdmFsaWduPVwidG9wXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxoMyBjbGFzcz1cInllYXJMYWJlbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwicHJldmlvdXNZZWFyTGFiZWxOb2RlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRZZWFyO1wiIGNsYXNzPVwicHJldmlvdXNZZWFyXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzZWxlY3RlZFllYXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjdXJyZW50WWVhckxhYmVsTm9kZVwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cIm5leHRZZWFyTGFiZWxOb2RlXCIgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50WWVhcjtcIiBjbGFzcz1cIm5leHRZZWFyXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvaDM+XG5cdFx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cImN1cnZlQlJcIiB2YWxpZ249XCJ0b3BcIj48L3RkPlxuXHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC90cj5cblx0XHQ8L3Rmb290PlxuXHQ8L3RhYmxlPlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRhdGVQaWNrZXJDb250YWluZXIge1xuXHR3aWR0aDoxNjRweDsgLyogbmVlZGVkIGZvciBwcm9wZXIgdXNlciBzdHlsaW5nICovXG59XG5cbi5jYWxlbmRhckNvbnRhaW5lciB7XG4vKlx0Ym9yZGVyOjFweCBzb2xpZCAjNTY2ZjhmOyovXG59XG5cbi5jYWxlbmRhckJvZHlDb250YWluZXIge1xuXHR3aWR0aDoxMDAlOyAvKiBuZWVkZWQgZm9yIHRoZSBleHBsb2RlIGVmZmVjdCAoZXhwbGFpbj8pICovXG5cdGJhY2tncm91bmQ6ICM3NTkxYmMgdXJsKFwiaW1hZ2VzL2RwQmcuZ2lmXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xufVxuXG4uY2FsZW5kYXJCb2R5Q29udGFpbmVyIHRoZWFkIHRyIHRkIHtcblx0Y29sb3I6IzI5M2E0Yjtcblx0Zm9udDpib2xkIDAuNzVlbSBIZWx2ZXRpY2EsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xuXHR0ZXh0LWFsaWduOmNlbnRlcjtcblx0cGFkZGluZzowLjI1ZW07XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEhvcml6TGluZS5naWZcIikgYm90dG9tIGxlZnQgcmVwZWF0LXg7XG59XG5cbi5jYWxlbmRhckJvZHlDb250YWluZXIgdGJvZHkgdHIgdGQge1xuXHRjb2xvcjojZmZmO1xuXHRmb250OmJvbGQgMC43ZW0gSGVsdmV0aWNhLCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjtcblx0dGV4dC1hbGlnbjpjZW50ZXI7XG5cdHBhZGRpbmc6MC40ZW07XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcFZlcnRMaW5lLmdpZlwiKSB0b3AgcmlnaHQgcmVwZWF0LXk7XG5cdGN1cnNvcjpwb2ludGVyO1xuXHRjdXJzb3I6aGFuZDtcbn1cblxuXG4ubW9udGhXcmFwcGVyIHtcblx0cGFkZGluZy1ib3R0b206MnB4O1xuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBIb3JpekxpbmUuZ2lmXCIpIGJvdHRvbSBsZWZ0IHJlcGVhdC14O1xufVxuXG4ubW9udGhDb250YWluZXIge1xuXHR3aWR0aDoxMDAlO1xufVxuXG4ubW9udGhMYWJlbENvbnRhaW5lciB7XG5cdHRleHQtYWxpZ246Y2VudGVyO1xuXHRmb250OmJvbGQgMC43NWVtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcE1vbnRoQmcucG5nXCIpIHJlcGVhdC14IHRvcCBsZWZ0ICFpbXBvcnRhbnQ7XG5cdGNvbG9yOiMyOTNhNGI7XG5cdHBhZGRpbmc6MC4yNWVtO1xufVxuXG4ubW9udGhDdXJ2ZSB7XG5cdHdpZHRoOjEycHg7XG59XG5cbi5tb250aEN1cnZlVEwge1xuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZVRMLnBuZ1wiKSBuby1yZXBlYXQgdG9wIGxlZnQgIWltcG9ydGFudDtcbn1cblxuLm1vbnRoQ3VydmVUUiB7XG5cdFx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUUi5wbmdcIikgbm8tcmVwZWF0IHRvcCByaWdodCAhaW1wb3J0YW50O1xufVxuXG5cbi55ZWFyV3JhcHBlciB7XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEhvcml6TGluZUZvb3QuZ2lmXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xuXHRwYWRkaW5nLXRvcDoycHg7XG59XG5cbi55ZWFyQ29udGFpbmVyIHtcblx0d2lkdGg6MTAwJTtcbn1cblxuLnllYXJDb250YWluZXIgdGQge1xuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9kcFllYXJCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XG59XG5cbi55ZWFyQ29udGFpbmVyIC55ZWFyTGFiZWwge1xuXHRtYXJnaW46MDtcblx0cGFkZGluZzowLjQ1ZW0gMCAwLjQ1ZW0gMDtcblx0Y29sb3I6I2ZmZjtcblx0Zm9udDpib2xkIDAuNzVlbSBIZWx2ZXRpY2EsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xuXHR0ZXh0LWFsaWduOmNlbnRlcjtcbn1cblxuLmN1cnZlQkwge1xuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZUJMLnBuZ1wiKSBib3R0b20gbGVmdCBuby1yZXBlYXQgIWltcG9ydGFudDtcblx0d2lkdGg6OXB4ICFpbXBvcnRhbnQ7XG5cdHBhZGRpbmc6MDtcblx0bWFyZ2luOjA7XG59XG5cbi5jdXJ2ZUJSIHtcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCUi5wbmdcIikgYm90dG9tIHJpZ2h0IG5vLXJlcGVhdCAhaW1wb3J0YW50O1xuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcblx0cGFkZGluZzowO1xuXHRtYXJnaW46MDtcbn1cblxuXG4ucHJldmlvdXNNb250aCB7XG5cdGJhY2tncm91bmQtY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xufVxuXG4ucHJldmlvdXNNb250aERpc2FibGVkIHtcblx0YmFja2dyb3VuZC1jb2xvcjojYTRhNWE2ICFpbXBvcnRhbnQ7XG5cdGN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnRcbn1cbi5jdXJyZW50TW9udGgge1xufVxuXG4uY3VycmVudE1vbnRoRGlzYWJsZWQge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiNiYmJiYmMgIWltcG9ydGFudDtcblx0Y3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudFxufVxuLm5leHRNb250aCB7XG5cdGJhY2tncm91bmQtY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xufVxuLm5leHRNb250aERpc2FibGVkIHtcblx0YmFja2dyb3VuZC1jb2xvcjojYTRhNWE2ICFpbXBvcnRhbnQ7XG5cdGN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnQ7XG59XG5cbi5jdXJyZW50RGF0ZSB7XG5cdHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XG5cdGZvbnQtc3R5bGU6aXRhbGljO1xufVxuXG4uc2VsZWN0ZWREYXRlIHtcblx0YmFja2dyb3VuZC1jb2xvcjojZmZmICFpbXBvcnRhbnQ7XG5cdGNvbG9yOiM2NzgyYTggIWltcG9ydGFudDtcbn1cblxuLnllYXJMYWJlbCAuc2VsZWN0ZWRZZWFyIHtcblx0cGFkZGluZzowLjJlbTtcblx0YmFja2dyb3VuZC1jb2xvcjojOWVjM2ZiICFpbXBvcnRhbnQ7XG59XG5cbi5uZXh0WWVhciwgLnByZXZpb3VzWWVhciB7XG5cdGN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kO1xuXHRwYWRkaW5nOjA7XG59XG5cbi5uZXh0WWVhciB7XG5cdG1hcmdpbjowIDAgMCAwLjU1ZW07XG59XG5cbi5wcmV2aW91c1llYXIge1xuXHRtYXJnaW46MCAwLjU1ZW0gMCAwO1xufVxuXG4uaW5jcmVtZW50Q29udHJvbCB7XG5cdGN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kO1xuXHR3aWR0aDoxZW07XG59XG5cbi5pbmNyZWFzZSB7XG5cdGZsb2F0OnJpZ2h0O1xufVxuXG4uZGVjcmVhc2Uge1xuXHRmbG9hdDpsZWZ0O1xufVxuXG4ubGFzdENvbHVtbiB7XG5cdGJhY2tncm91bmQtaW1hZ2U6bm9uZSAhaW1wb3J0YW50O1xufVxuXG5cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9EYXRlUGlja2VyLmNzcyIpLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5EYXRlUGlja2VyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICghdGhpcy53ZWVrU3RhcnRzT24pIHsKKwkJdGhpcy53ZWVrU3RhcnRzT24gPSBkb2pvLmRhdGUuZ2V0Rmlyc3REYXlPZldlZWsodGhpcy5sYW5nKTsKKwl9CisJdGhpcy50b2RheSA9IG5ldyBEYXRlKCk7CisJdGhpcy50b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKKwlpZiAodHlwZW9mICh0aGlzLnZhbHVlKSA9PSAic3RyaW5nIiAmJiB0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gInRvZGF5IikgeworCQl0aGlzLnZhbHVlID0gbmV3IERhdGUoKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy52YWx1ZSAmJiAodHlwZW9mIHRoaXMudmFsdWUgPT0gInN0cmluZyIpICYmICh0aGlzLnZhbHVlLnNwbGl0KCItIikubGVuZ3RoID4gMikpIHsKKwkJCXRoaXMudmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy52YWx1ZSk7CisJCQl0aGlzLnZhbHVlLnNldEhvdXJzKDAsIDAsIDAsIDApOworCQl9CisJfQorfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwlkb2pvLndpZGdldC5EYXRlUGlja2VyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl2YXIgc291cmNlID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgc291cmNlKTsKKwl0aGlzLndlZWtUZW1wbGF0ZSA9IGRvam8uZG9tLnJlbW92ZU5vZGUodGhpcy5jYWxlbmRhcldlZWtUZW1wbGF0ZSk7CisJdGhpcy5fcHJlSW5pdFVJKHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy50b2RheSwgZmFsc2UsIHRydWUpOworCXZhciBkYXlMYWJlbHMgPSBkb2pvLmxhbmcudW5uZXN0KGRvam8uZGF0ZS5nZXROYW1lcygiZGF5cyIsIHRoaXMuZGF5V2lkdGgsICJzdGFuZEFsb25lIiwgdGhpcy5sYW5nKSk7CisJaWYgKHRoaXMud2Vla1N0YXJ0c09uID4gMCkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2Vla1N0YXJ0c09uOyBpKyspIHsKKwkJCWRheUxhYmVscy5wdXNoKGRheUxhYmVscy5zaGlmdCgpKTsKKwkJfQorCX0KKwl2YXIgZGF5TGFiZWxOb2RlcyA9IHRoaXMuZGF5TGFiZWxzUm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJZGF5TGFiZWxOb2Rlcy5pdGVtKGkpLmlubmVySFRNTCA9IGRheUxhYmVsc1tpXTsKKwl9CisJaWYgKHRoaXMudmFsdWUpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKKwl9Cit9LCBnZXRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8uZGF0ZS50b1JmYzMzMzkobmV3IERhdGUodGhpcy52YWx1ZSksICJkYXRlT25seSIpOworfSwgZ2V0RGF0ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMudmFsdWU7Cit9LCBzZXRWYWx1ZTpmdW5jdGlvbiAocmZjRGF0ZSkgeworCXRoaXMuc2V0RGF0ZShyZmNEYXRlKTsKK30sIHNldERhdGU6ZnVuY3Rpb24gKGRhdGVPYmopIHsKKwlpZiAoZGF0ZU9iaiA9PSAiIikgeworCQl0aGlzLnZhbHVlID0gIiI7CisJCXRoaXMuX3ByZUluaXRVSSh0aGlzLmN1ck1vbnRoLCBmYWxzZSwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJaWYgKHR5cGVvZiBkYXRlT2JqID09ICJzdHJpbmciKSB7CisJCQl0aGlzLnZhbHVlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KGRhdGVPYmopOworCQkJdGhpcy52YWx1ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMudmFsdWUgPSBuZXcgRGF0ZShkYXRlT2JqKTsKKwkJCXRoaXMudmFsdWUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CisJCX0KKwl9CisJaWYgKHRoaXMuc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuc2VsZWN0ZWROb2RlLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWREYXRlKTsKKwl9CisJaWYgKHRoaXMuY2xpY2tlZE5vZGUgIT0gbnVsbCkgeworCQlkb2pvLmRlYnVnKCJhZGRpbmcgc2VsZWN0ZWREYXRlIik7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmNsaWNrZWROb2RlLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWREYXRlKTsKKwkJdGhpcy5zZWxlY3RlZE5vZGUgPSB0aGlzLmNsaWNrZWROb2RlOworCX0gZWxzZSB7CisJCXRoaXMuX3ByZUluaXRVSSh0aGlzLnZhbHVlLCBmYWxzZSwgdHJ1ZSk7CisJfQorCXRoaXMuY2xpY2tlZE5vZGUgPSBudWxsOworCXRoaXMub25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7Cit9LCBfcHJlSW5pdFVJOmZ1bmN0aW9uIChkYXRlT2JqLCBpbml0Rmlyc3QsIGluaXRVSSkgeworCWlmICh0eXBlb2YgKHRoaXMuc3RhcnREYXRlKSA9PSAic3RyaW5nIikgeworCQl0aGlzLnN0YXJ0RGF0ZSA9IGRvam8uZGF0ZS5mcm9tUmZjMzMzOSh0aGlzLnN0YXJ0RGF0ZSk7CisJfQorCWlmICh0eXBlb2YgKHRoaXMuZW5kRGF0ZSkgPT0gInN0cmluZyIpIHsKKwkJdGhpcy5lbmREYXRlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KHRoaXMuZW5kRGF0ZSk7CisJfQorCXRoaXMuc3RhcnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOworCXRoaXMuZW5kRGF0ZS5zZXRIb3VycygyNCwgMCwgMCwgLTEpOworCWlmIChkYXRlT2JqIDwgdGhpcy5zdGFydERhdGUgfHwgZGF0ZU9iaiA+IHRoaXMuZW5kRGF0ZSkgeworCQlkYXRlT2JqID0gbmV3IERhdGUoKGRhdGVPYmogPCB0aGlzLnN0YXJ0RGF0ZSkgPyB0aGlzLnN0YXJ0RGF0ZSA6IHRoaXMuZW5kRGF0ZSk7CisJfQorCXRoaXMuZmlyc3REYXkgPSB0aGlzLl9pbml0Rmlyc3REYXkoZGF0ZU9iaiwgaW5pdEZpcnN0KTsKKwl0aGlzLnNlbGVjdGVkSXNVc2VkID0gZmFsc2U7CisJdGhpcy5jdXJyZW50SXNVc2VkID0gZmFsc2U7CisJdmFyIG5leHREYXRlID0gbmV3IERhdGUodGhpcy5maXJzdERheSk7CisJdmFyIHRtcE1vbnRoID0gbmV4dERhdGUuZ2V0TW9udGgoKTsKKwl0aGlzLmN1ck1vbnRoID0gbmV3IERhdGUobmV4dERhdGUpOworCXRoaXMuY3VyTW9udGguc2V0RGF0ZShuZXh0RGF0ZS5nZXREYXRlKCkgKyA2KTsKKwl0aGlzLmN1ck1vbnRoLnNldERhdGUoMSk7CisJaWYgKHRoaXMuZGlzcGxheVdlZWtzID09ICIiIHx8IHRoaXMuYWRqdXN0V2Vla3MpIHsKKwkJdGhpcy5hZGp1c3RXZWVrcyA9IHRydWU7CisJCXRoaXMuZGlzcGxheVdlZWtzID0gTWF0aC5jZWlsKChkb2pvLmRhdGUuZ2V0RGF5c0luTW9udGgodGhpcy5jdXJNb250aCkgKyB0aGlzLl9nZXRBZGp1c3RlZERheSh0aGlzLmN1ck1vbnRoKSkgLyA3KTsKKwl9CisJdmFyIGRheXMgPSB0aGlzLmRpc3BsYXlXZWVrcyAqIDc7CisJaWYgKGRvam8uZGF0ZS5kaWZmKHRoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuREFZKSA8IGRheXMpIHsKKwkJdGhpcy5zdGF0aWNEaXNwbGF5ID0gdHJ1ZTsKKwkJaWYgKGRvam8uZGF0ZS5kaWZmKG5leHREYXRlLCB0aGlzLmVuZERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuREFZKSA+IGRheXMpIHsKKwkJCXRoaXMuX3ByZUluaXRVSSh0aGlzLnN0YXJ0RGF0ZSwgdHJ1ZSwgZmFsc2UpOworCQkJbmV4dERhdGUgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwkJfQorCQl0aGlzLmN1ck1vbnRoID0gbmV3IERhdGUobmV4dERhdGUpOworCQl0aGlzLmN1ck1vbnRoLnNldERhdGUobmV4dERhdGUuZ2V0RGF0ZSgpICsgNik7CisJCXRoaXMuY3VyTW9udGguc2V0RGF0ZSgxKTsKKwkJdmFyIGN1ckNsYXNzID0gKG5leHREYXRlLmdldE1vbnRoKCkgPT0gdGhpcy5jdXJNb250aC5nZXRNb250aCgpKSA/ICJjdXJyZW50IiA6ICJwcmV2aW91cyI7CisJfQorCWlmIChpbml0VUkpIHsKKwkJdGhpcy5faW5pdFVJKGRheXMpOworCX0KK30sIF9pbml0VUk6ZnVuY3Rpb24gKGRheXMpIHsKKwlkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbih0aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheVdlZWtzOyBpKyspIHsKKwkJdGhpcy5jYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh0aGlzLndlZWtUZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSkpOworCX0KKwl2YXIgbmV4dERhdGUgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwl0aGlzLl9zZXRNb250aExhYmVsKHRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSk7CisJdGhpcy5fc2V0WWVhckxhYmVscyh0aGlzLmN1ck1vbnRoLmdldEZ1bGxZZWFyKCkpOworCXZhciBjYWxlbmRhck5vZGVzID0gdGhpcy5jYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKwl2YXIgY2FsZW5kYXJSb3dzID0gdGhpcy5jYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKTsKKwl2YXIgY3VycmVudENhbGVuZGFyTm9kZTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF5czsgaSsrKSB7CisJCWN1cnJlbnRDYWxlbmRhck5vZGUgPSBjYWxlbmRhck5vZGVzLml0ZW0oaSk7CisJCWN1cnJlbnRDYWxlbmRhck5vZGUuaW5uZXJIVE1MID0gbmV4dERhdGUuZ2V0RGF0ZSgpOworCQljdXJyZW50Q2FsZW5kYXJOb2RlLnNldEF0dHJpYnV0ZSgiZGpEYXRlVmFsdWUiLCBuZXh0RGF0ZS52YWx1ZU9mKCkpOworCQl2YXIgY3VyQ2xhc3MgPSAobmV4dERhdGUuZ2V0TW9udGgoKSAhPSB0aGlzLmN1ck1vbnRoLmdldE1vbnRoKCkgJiYgTnVtYmVyKG5leHREYXRlKSA8IE51bWJlcih0aGlzLmN1ck1vbnRoKSkgPyAicHJldmlvdXMiIDogKG5leHREYXRlLmdldE1vbnRoKCkgPT0gdGhpcy5jdXJNb250aC5nZXRNb250aCgpKSA/ICJjdXJyZW50IiA6ICJuZXh0IjsKKwkJdmFyIG1hcHBlZENsYXNzID0gY3VyQ2xhc3M7CisJCWlmICh0aGlzLl9pc0Rpc2FibGVkRGF0ZShuZXh0RGF0ZSkpIHsKKwkJCXZhciBjbGFzc01hcCA9IHtwcmV2aW91czoiZGlzYWJsZWRQcmV2aW91cyIsIGN1cnJlbnQ6ImRpc2FibGVkQ3VycmVudCIsIG5leHQ6ImRpc2FibGVkTmV4dCJ9OworCQkJbWFwcGVkQ2xhc3MgPSBjbGFzc01hcFtjdXJDbGFzc107CisJCX0KKwkJZG9qby5odG1sLnNldENsYXNzKGN1cnJlbnRDYWxlbmRhck5vZGUsIHRoaXMuX2dldERhdGVDbGFzc05hbWUobmV4dERhdGUsIG1hcHBlZENsYXNzKSk7CisJCWlmIChkb2pvLmh0bWwuaGFzQ2xhc3MoY3VycmVudENhbGVuZGFyTm9kZSwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkRGF0ZSkpIHsKKwkJCXRoaXMuc2VsZWN0ZWROb2RlID0gY3VycmVudENhbGVuZGFyTm9kZTsKKwkJfQorCQluZXh0RGF0ZSA9IGRvam8uZGF0ZS5hZGQobmV4dERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuREFZLCAxKTsKKwl9CisJdGhpcy5sYXN0RGF5ID0gZG9qby5kYXRlLmFkZChuZXh0RGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVksIC0xKTsKKwl0aGlzLl9pbml0Q29udHJvbHMoKTsKK30sIF9pbml0Q29udHJvbHM6ZnVuY3Rpb24gKCkgeworCXZhciBkID0gdGhpcy5maXJzdERheTsKKwl2YXIgZDIgPSB0aGlzLmxhc3REYXk7CisJdmFyIGRlY1dlZWssIGluY1dlZWssIGRlY01vbnRoLCBpbmNNb250aCwgZGVjWWVhciwgaW5jWWVhcjsKKwlkZWNXZWVrID0gaW5jV2VlayA9IGRlY01vbnRoID0gaW5jTW9udGggPSBkZWNZZWFyID0gaW5jWWVhciA9ICF0aGlzLnN0YXRpY0Rpc3BsYXk7CisJd2l0aCAoZG9qby5kYXRlLmRhdGVQYXJ0cykgeworCQl2YXIgYWRkID0gZG9qby5kYXRlLmFkZDsKKwkJaWYgKGRlY1dlZWsgJiYgYWRkKGQsIERBWSwgKC0xICogKHRoaXMuX2dldEFkanVzdGVkRGF5KGQpICsgMSkpKSA8IHRoaXMuc3RhcnREYXRlKSB7CisJCQlkZWNXZWVrID0gZGVjTW9udGggPSBkZWNZZWFyID0gZmFsc2U7CisJCX0KKwkJaWYgKGluY1dlZWsgJiYgZDIgPiB0aGlzLmVuZERhdGUpIHsKKwkJCWluY1dlZWsgPSBpbmNNb250aCA9IGluY1llYXIgPSBmYWxzZTsKKwkJfQorCQlpZiAoZGVjTW9udGggJiYgYWRkKGQsIERBWSwgLTEpIDwgdGhpcy5zdGFydERhdGUpIHsKKwkJCWRlY01vbnRoID0gZGVjWWVhciA9IGZhbHNlOworCQl9CisJCWlmIChpbmNNb250aCAmJiBhZGQoZDIsIERBWSwgMSkgPiB0aGlzLmVuZERhdGUpIHsKKwkJCWluY01vbnRoID0gaW5jWWVhciA9IGZhbHNlOworCQl9CisJCWlmIChkZWNZZWFyICYmIGFkZChkMiwgWUVBUiwgLTEpIDwgdGhpcy5zdGFydERhdGUpIHsKKwkJCWRlY1llYXIgPSBmYWxzZTsKKwkJfQorCQlpZiAoaW5jWWVhciAmJiBhZGQoZCwgWUVBUiwgMSkgPiB0aGlzLmVuZERhdGUpIHsKKwkJCWluY1llYXIgPSBmYWxzZTsKKwkJfQorCX0KKwlmdW5jdGlvbiBlbmFibGVDb250cm9sKG5vZGUsIGVuYWJsZWQpIHsKKwkJZG9qby5odG1sLnNldFZpc2liaWxpdHkobm9kZSwgZW5hYmxlZCA/ICIiIDogImhpZGRlbiIpOworCX0KKwllbmFibGVDb250cm9sKHRoaXMuZGVjcmVhc2VXZWVrTm9kZSwgZGVjV2Vlayk7CisJZW5hYmxlQ29udHJvbCh0aGlzLmluY3JlYXNlV2Vla05vZGUsIGluY1dlZWspOworCWVuYWJsZUNvbnRyb2wodGhpcy5kZWNyZWFzZU1vbnRoTm9kZSwgZGVjTW9udGgpOworCWVuYWJsZUNvbnRyb2wodGhpcy5pbmNyZWFzZU1vbnRoTm9kZSwgaW5jTW9udGgpOworCWVuYWJsZUNvbnRyb2wodGhpcy5wcmV2aW91c1llYXJMYWJlbE5vZGUsIGRlY1llYXIpOworCWVuYWJsZUNvbnRyb2wodGhpcy5uZXh0WWVhckxhYmVsTm9kZSwgaW5jWWVhcik7Cit9LCBfaW5jcmVtZW50V2VlazpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIGQgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwlzd2l0Y2ggKGV2dC50YXJnZXQpIHsKKwkgIGNhc2UgdGhpcy5pbmNyZWFzZVdlZWtOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorCSAgY2FzZSB0aGlzLmluY3JlYXNlV2Vla05vZGU6CisJCXZhciB0bXBEYXRlID0gZG9qby5kYXRlLmFkZChkLCBkb2pvLmRhdGUuZGF0ZVBhcnRzLldFRUssIDEpOworCQlpZiAodG1wRGF0ZSA8IHRoaXMuZW5kRGF0ZSkgeworCQkJZCA9IGRvam8uZGF0ZS5hZGQoZCwgZG9qby5kYXRlLmRhdGVQYXJ0cy5XRUVLLCAxKTsKKwkJfQorCQlicmVhazsKKwkgIGNhc2UgdGhpcy5kZWNyZWFzZVdlZWtOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorCSAgY2FzZSB0aGlzLmRlY3JlYXNlV2Vla05vZGU6CisJCWlmIChkID49IHRoaXMuc3RhcnREYXRlKSB7CisJCQlkID0gZG9qby5kYXRlLmFkZChkLCBkb2pvLmRhdGUuZGF0ZVBhcnRzLldFRUssIC0xKTsKKwkJfQorCQlicmVhazsKKwl9CisJdGhpcy5fcHJlSW5pdFVJKGQsIHRydWUsIHRydWUpOworfSwgX2luY3JlbWVudE1vbnRoOmZ1bmN0aW9uIChldnQpIHsKKwl2YXIgZCA9IG5ldyBEYXRlKHRoaXMuY3VyTW9udGgpOworCXZhciB0bXBEYXRlID0gbmV3IERhdGUodGhpcy5maXJzdERheSk7CisJc3dpdGNoIChldnQuY3VycmVudFRhcmdldCkgeworCSAgY2FzZSB0aGlzLmluY3JlYXNlTW9udGhOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorCSAgY2FzZSB0aGlzLmluY3JlYXNlTW9udGhOb2RlOgorCQl0bXBEYXRlID0gZG9qby5kYXRlLmFkZCh0bXBEYXRlLCBkb2pvLmRhdGUuZGF0ZVBhcnRzLkRBWSwgdGhpcy5kaXNwbGF5V2Vla3MgKiA3KTsKKwkJaWYgKHRtcERhdGUgPCB0aGlzLmVuZERhdGUpIHsKKwkJCWQgPSBkb2pvLmRhdGUuYWRkKGQsIGRvam8uZGF0ZS5kYXRlUGFydHMuTU9OVEgsIDEpOworCQl9IGVsc2UgeworCQkJdmFyIHJldmVydFRvRW5kRGF0ZSA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJICBjYXNlIHRoaXMuZGVjcmVhc2VNb250aE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpLml0ZW0oMCk6CisJICBjYXNlIHRoaXMuZGVjcmVhc2VNb250aE5vZGU6CisJCWlmICh0bXBEYXRlID4gdGhpcy5zdGFydERhdGUpIHsKKwkJCWQgPSBkb2pvLmRhdGUuYWRkKGQsIGRvam8uZGF0ZS5kYXRlUGFydHMuTU9OVEgsIC0xKTsKKwkJfSBlbHNlIHsKKwkJCXZhciByZXZlcnRUb1N0YXJ0RGF0ZSA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmIChyZXZlcnRUb1N0YXJ0RGF0ZSkgeworCQlkID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUpOworCX0gZWxzZSB7CisJCWlmIChyZXZlcnRUb0VuZERhdGUpIHsKKwkJCWQgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpOworCQl9CisJfQorCXRoaXMuX3ByZUluaXRVSShkLCBmYWxzZSwgdHJ1ZSk7Cit9LCBfaW5jcmVtZW50WWVhcjpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHllYXIgPSB0aGlzLmN1ck1vbnRoLmdldEZ1bGxZZWFyKCk7CisJdmFyIHRtcERhdGUgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwlzd2l0Y2ggKGV2dC50YXJnZXQpIHsKKwkgIGNhc2UgdGhpcy5uZXh0WWVhckxhYmVsTm9kZToKKwkJdG1wRGF0ZSA9IGRvam8uZGF0ZS5hZGQodG1wRGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5ZRUFSLCAxKTsKKwkJaWYgKHRtcERhdGUgPCB0aGlzLmVuZERhdGUpIHsKKwkJCXllYXIrKzsKKwkJfSBlbHNlIHsKKwkJCXZhciByZXZlcnRUb0VuZERhdGUgPSB0cnVlOworCQl9CisJCWJyZWFrOworCSAgY2FzZSB0aGlzLnByZXZpb3VzWWVhckxhYmVsTm9kZToKKwkJdG1wRGF0ZSA9IGRvam8uZGF0ZS5hZGQodG1wRGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5ZRUFSLCAtMSk7CisJCWlmICh0bXBEYXRlID4gdGhpcy5zdGFydERhdGUpIHsKKwkJCXllYXItLTsKKwkJfSBlbHNlIHsKKwkJCXZhciByZXZlcnRUb1N0YXJ0RGF0ZSA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJfQorCXZhciBkOworCWlmIChyZXZlcnRUb1N0YXJ0RGF0ZSkgeworCQlkID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUpOworCX0gZWxzZSB7CisJCWlmIChyZXZlcnRUb0VuZERhdGUpIHsKKwkJCWQgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpOworCQl9IGVsc2UgeworCQkJZCA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSwgMSk7CisJCX0KKwl9CisJdGhpcy5fcHJlSW5pdFVJKGQsIGZhbHNlLCB0cnVlKTsKK30sIG9uSW5jcmVtZW50V2VlazpmdW5jdGlvbiAoZXZ0KSB7CisJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworCWlmICghdGhpcy5zdGF0aWNEaXNwbGF5KSB7CisJCXRoaXMuX2luY3JlbWVudFdlZWsoZXZ0KTsKKwl9Cit9LCBvbkluY3JlbWVudE1vbnRoOmZ1bmN0aW9uIChldnQpIHsKKwlldnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJaWYgKCF0aGlzLnN0YXRpY0Rpc3BsYXkpIHsKKwkJdGhpcy5faW5jcmVtZW50TW9udGgoZXZ0KTsKKwl9Cit9LCBvbkluY3JlbWVudFllYXI6ZnVuY3Rpb24gKGV2dCkgeworCWV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKwlpZiAoIXRoaXMuc3RhdGljRGlzcGxheSkgeworCQl0aGlzLl9pbmNyZW1lbnRZZWFyKGV2dCk7CisJfQorfSwgX3NldE1vbnRoTGFiZWw6ZnVuY3Rpb24gKG1vbnRoSW5kZXgpIHsKKwl0aGlzLm1vbnRoTGFiZWxOb2RlLmlubmVySFRNTCA9IGRvam8uZGF0ZS5nZXROYW1lcygibW9udGhzIiwgIndpZGUiLCAic3RhbmRBbG9uZSIsIHRoaXMubGFuZylbbW9udGhJbmRleF07Cit9LCBfc2V0WWVhckxhYmVsczpmdW5jdGlvbiAoeWVhcikgeworCXZhciB5ID0geWVhciAtIDE7CisJdmFyIHRoYXQgPSB0aGlzOworCWZ1bmN0aW9uIGYobikgeworCQl0aGF0W24gKyAiWWVhckxhYmVsTm9kZSJdLmlubmVySFRNTCA9IGRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoeSsrLCAwKSwge2Zvcm1hdExlbmd0aDoieWVhck9ubHkiLCBsb2NhbGU6dGhhdC5sYW5nfSk7CisJfQorCWYoInByZXZpb3VzIik7CisJZigiY3VycmVudCIpOworCWYoIm5leHQiKTsKK30sIF9nZXREYXRlQ2xhc3NOYW1lOmZ1bmN0aW9uIChkYXRlLCBtb250aFN0YXRlKSB7CisJdmFyIGN1cnJlbnRDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZXNbbW9udGhTdGF0ZV07CisJaWYgKCghdGhpcy5zZWxlY3RlZElzVXNlZCAmJiB0aGlzLnZhbHVlKSAmJiAoTnVtYmVyKGRhdGUpID09IE51bWJlcih0aGlzLnZhbHVlKSkpIHsKKwkJY3VycmVudENsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZERhdGUgKyAiICIgKyBjdXJyZW50Q2xhc3NOYW1lOworCQl0aGlzLnNlbGVjdGVkSXNVc2VkID0gdHJ1ZTsKKwl9CisJaWYgKCghdGhpcy5jdXJyZW50SXNVc2VkKSAmJiAoTnVtYmVyKGRhdGUpID09IE51bWJlcih0aGlzLnRvZGF5KSkpIHsKKwkJY3VycmVudENsYXNzTmFtZSA9IGN1cnJlbnRDbGFzc05hbWUgKyAiICIgKyB0aGlzLmNsYXNzTmFtZXMuY3VycmVudERhdGU7CisJCXRoaXMuY3VycmVudElzVXNlZCA9IHRydWU7CisJfQorCXJldHVybiBjdXJyZW50Q2xhc3NOYW1lOworfSwgb25DbGljazpmdW5jdGlvbiAoZXZ0KSB7CisJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworfSwgX2hhbmRsZVVpQ2xpY2s6ZnVuY3Rpb24gKGV2dCkgeworCXZhciBldmVudFRhcmdldCA9IGV2dC50YXJnZXQ7CisJaWYgKGV2ZW50VGFyZ2V0Lm5vZGVUeXBlICE9IGRvam8uZG9tLkVMRU1FTlRfTk9ERSkgeworCQlldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0LnBhcmVudE5vZGU7CisJfQorCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwl0aGlzLnNlbGVjdGVkSXNVc2VkID0gdGhpcy50b2RheUlzVXNlZCA9IGZhbHNlOworCWlmIChkb2pvLmh0bWwuaGFzQ2xhc3MoZXZlbnRUYXJnZXQsIHRoaXMuY2xhc3NOYW1lc1siZGlzYWJsZWRQcmV2aW91cyJdKSB8fCBkb2pvLmh0bWwuaGFzQ2xhc3MoZXZlbnRUYXJnZXQsIHRoaXMuY2xhc3NOYW1lc1siZGlzYWJsZWRDdXJyZW50Il0pIHx8IGRvam8uaHRtbC5oYXNDbGFzcyhldmVudFRhcmdldCwgdGhpcy5jbGFzc05hbWVzWyJkaXNhYmxlZE5leHQiXSkpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmNsaWNrZWROb2RlID0gZXZlbnRUYXJnZXQ7CisJdGhpcy5zZXREYXRlKG5ldyBEYXRlKE51bWJlcihkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGV2ZW50VGFyZ2V0LCAiZGpEYXRlVmFsdWUiKSkpKTsKK30sIG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uIChkYXRlKSB7Cit9LCBfaXNEaXNhYmxlZERhdGU6ZnVuY3Rpb24gKGRhdGVPYmopIHsKKwlpZiAoZGF0ZU9iaiA8IHRoaXMuc3RhcnREYXRlIHx8IGRhdGVPYmogPiB0aGlzLmVuZERhdGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiB0aGlzLmlzRGlzYWJsZWREYXRlKGRhdGVPYmosIHRoaXMubGFuZyk7Cit9LCBpc0Rpc2FibGVkRGF0ZTpmdW5jdGlvbiAoZGF0ZU9iaiwgbG9jYWxlKSB7CisJcmV0dXJuIGZhbHNlOworfSwgX2luaXRGaXJzdERheTpmdW5jdGlvbiAoZGF0ZU9iaiwgYWRqKSB7CisJdmFyIGQgPSBuZXcgRGF0ZShkYXRlT2JqKTsKKwlpZiAoIWFkaikgeworCQlkLnNldERhdGUoMSk7CisJfQorCWQuc2V0RGF0ZShkLmdldERhdGUoKSAtIHRoaXMuX2dldEFkanVzdGVkRGF5KGQsIHRoaXMud2Vla1N0YXJ0c09uKSk7CisJZC5zZXRIb3VycygwLCAwLCAwLCAwKTsKKwlyZXR1cm4gZDsKK30sIF9nZXRBZGp1c3RlZERheTpmdW5jdGlvbiAoZGF0ZU9iaikgeworCXZhciBkYXlzID0gWzAsIDEsIDIsIDMsIDQsIDUsIDZdOworCWlmICh0aGlzLndlZWtTdGFydHNPbiA+IDApIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndlZWtTdGFydHNPbjsgaSsrKSB7CisJCQlkYXlzLnVuc2hpZnQoZGF5cy5wb3AoKSk7CisJCX0KKwl9CisJcmV0dXJuIGRheXNbZGF0ZU9iai5nZXREYXkoKV07Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5EYXRlUGlja2VyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWRvam8uaHRtbC5kZXN0cm95Tm9kZSh0aGlzLndlZWtUZW1wbGF0ZSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRGF0ZVRleHRib3guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0RhdGVUZXh0Ym94LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDBiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0RhdGVUZXh0Ym94LmpzCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRhdGVUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlZhbGlkYXRpb25UZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5mb3JtYXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby52YWxpZGF0ZS5kYXRldGltZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5EYXRlVGV4dGJveCIsIGRvam8ud2lkZ2V0LlZhbGlkYXRpb25UZXh0Ym94LCB7ZGlzcGxheUZvcm1hdDoiIiwgZm9ybWF0TGVuZ3RoOiJzaG9ydCIsIG1peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzKSB7CisJZG9qby53aWRnZXQuRGF0ZVRleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmZvcm1hdCkgeworCQl0aGlzLmZsYWdzLmZvcm1hdCA9IGxvY2FsUHJvcGVydGllcy5mb3JtYXQ7CisJfQorfSwgaXNWYWxpZDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZmxhZ3MuZm9ybWF0KSB7CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRGF0ZVRleHRib3giLCAiZm9ybWF0IGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkOyB1c2UgZGlzcGxheUZvcm1hdCBvciBmb3JtYXRMZW5ndGggaW5zdGVhZCIsICIwLjUiKTsKKwkJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNWYWxpZERhdGUodGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzLmZvcm1hdCk7CisJfQorCXJldHVybiBkb2pvLmRhdGUucGFyc2UodGhpcy50ZXh0Ym94LnZhbHVlLCB7Zm9ybWF0TGVuZ3RoOnRoaXMuZm9ybWF0TGVuZ3RoLCBzZWxlY3RvcjoiZGF0ZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nLCBkYXRlUGF0dGVybjp0aGlzLmRpc3BsYXlGb3JtYXR9KTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVGltZVRleHRib3giLCBkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCwge2Rpc3BsYXlGb3JtYXQ6IiIsIGZvcm1hdExlbmd0aDoic2hvcnQiLCBtaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKGxvY2FsUHJvcGVydGllcykgeworCWRvam8ud2lkZ2V0LlRpbWVUZXh0Ym94LnN1cGVyY2xhc3MubWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJaWYgKGxvY2FsUHJvcGVydGllcy5mb3JtYXQpIHsKKwkJdGhpcy5mbGFncy5mb3JtYXQgPSBsb2NhbFByb3BlcnRpZXMuZm9ybWF0OworCX0KKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFtc3ltYm9sKSB7CisJCXRoaXMuZmxhZ3MuYW1TeW1ib2wgPSBsb2NhbFByb3BlcnRpZXMuYW1zeW1ib2w7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMucG1zeW1ib2wpIHsKKwkJdGhpcy5mbGFncy5wbVN5bWJvbCA9IGxvY2FsUHJvcGVydGllcy5wbXN5bWJvbDsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5mbGFncy5mb3JtYXQpIHsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLndpZGdldC5UaW1lVGV4dGJveCIsICJmb3JtYXQgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQ7IHVzZSBkaXNwbGF5Rm9ybWF0IG9yIGZvcm1hdExlbmd0aCBpbnN0ZWFkIiwgIjAuNSIpOworCQlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc1ZhbGlkVGltZSh0aGlzLnRleHRib3gudmFsdWUsIHRoaXMuZmxhZ3MpOworCX0KKwlyZXR1cm4gZG9qby5kYXRlLnBhcnNlKHRoaXMudGV4dGJveC52YWx1ZSwge2Zvcm1hdExlbmd0aDp0aGlzLmZvcm1hdExlbmd0aCwgc2VsZWN0b3I6InRpbWVPbmx5IiwgbG9jYWxlOnRoaXMubGFuZywgdGltZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0fSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRGVidWdDb25zb2xlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9EZWJ1Z0NvbnNvbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjMjZhMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRGVidWdDb25zb2xlLmpzCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRlYnVnQ29uc29sZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5XaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRGVidWdDb25zb2xlIiwgZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLCB7ZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkRlYnVnQ29uc29sZS5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5jb250YWluZXJOb2RlLmlkID0gImRlYnVnQ29uc29sZUNsaWVudFBhbmUiOworCWRqQ29uZmlnLmlzRGVidWcgPSB0cnVlOworCWRqQ29uZmlnLmRlYnVnQ29udGFpbmVySWQgPSB0aGlzLmNvbnRhaW5lck5vZGUuaWQ7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRGlhbG9nLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9EaWFsb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkMzFhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRGlhbG9nLmpzCkBAIC0wLDAgKzEsMzAwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5EaWFsb2ciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db250ZW50UGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuaWZyYW1lIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZSIsIG51bGwsIHtpc0NvbnRhaW5lcjp0cnVlLCBmb2N1c0VsZW1lbnQ6IiIsIGJnQ29sb3I6ImJsYWNrIiwgYmdPcGFjaXR5OjAuNCwgZm9sbG93U2Nyb2xsOnRydWUsIGNsb3NlT25CYWNrZ3JvdW5kQ2xpY2s6ZmFsc2UsIHRyYXBUYWJzOmZ1bmN0aW9uIChlKSB7CisJaWYgKGUudGFyZ2V0ID09IHRoaXMudGFiU3RhcnRPdXRlcikgeworCQlpZiAodGhpcy5fZnJvbVRyYXApIHsKKwkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJCXRoaXMuX2Zyb21UcmFwID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7CisJCQl0aGlzLnRhYkVuZC5mb2N1cygpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGUudGFyZ2V0ID09IHRoaXMudGFiU3RhcnQpIHsKKwkJCWlmICh0aGlzLl9mcm9tVHJhcCkgeworCQkJCXRoaXMuX2Zyb21UcmFwID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuX2Zyb21UcmFwID0gdHJ1ZTsKKwkJCQl0aGlzLnRhYkVuZC5mb2N1cygpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGUudGFyZ2V0ID09IHRoaXMudGFiRW5kT3V0ZXIpIHsKKwkJCQlpZiAodGhpcy5fZnJvbVRyYXApIHsKKwkJCQkJdGhpcy50YWJFbmQuZm9jdXMoKTsKKwkJCQkJdGhpcy5fZnJvbVRyYXAgPSBmYWxzZTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7CisJCQkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChlLnRhcmdldCA9PSB0aGlzLnRhYkVuZCkgeworCQkJCQlpZiAodGhpcy5fZnJvbVRyYXApIHsKKwkJCQkJCXRoaXMuX2Zyb21UcmFwID0gZmFsc2U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7CisJCQkJCQl0aGlzLnRhYlN0YXJ0LmZvY3VzKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9LCBjbGVhclRyYXA6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworCQlfdGhpcy5fZnJvbVRyYXAgPSBmYWxzZTsKKwl9LCAxMDApOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJd2l0aCAodGhpcy5kb21Ob2RlLnN0eWxlKSB7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJekluZGV4ID0gOTk5OworCQlkaXNwbGF5ID0gIm5vbmUiOworCQlvdmVyZmxvdyA9ICJ2aXNpYmxlIjsKKwl9CisJdmFyIGIgPSBkb2pvLmJvZHkoKTsKKwliLmFwcGVuZENoaWxkKHRoaXMuZG9tTm9kZSk7CisJdGhpcy5iZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXRoaXMuYmcuY2xhc3NOYW1lID0gImRpYWxvZ1VuZGVybGF5IjsKKwl3aXRoICh0aGlzLmJnLnN0eWxlKSB7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJbGVmdCA9IHRvcCA9ICIwcHgiOworCQl6SW5kZXggPSA5OTg7CisJCWRpc3BsYXkgPSAibm9uZSI7CisJfQorCWIuYXBwZW5kQ2hpbGQodGhpcy5iZyk7CisJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IodGhpcy5iZ0NvbG9yKTsKKwl0aGlzLmJnSWZyYW1lID0gbmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKCk7CisJaWYgKHRoaXMuYmdJZnJhbWUuaWZyYW1lKSB7CisJCXdpdGggKHRoaXMuYmdJZnJhbWUuaWZyYW1lLnN0eWxlKSB7CisJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQlsZWZ0ID0gdG9wID0gIjBweCI7CisJCQl6SW5kZXggPSA5MDsKKwkJCWRpc3BsYXkgPSAibm9uZSI7CisJCX0KKwl9CisJaWYgKHRoaXMuY2xvc2VPbkJhY2tncm91bmRDbGljaykgeworCQlkb2pvLmV2ZW50Lmt3Q29ubmVjdCh7c3JjT2JqOnRoaXMuYmcsIHNyY0Z1bmM6Im9uY2xpY2siLCBhZHZpY2VPYmo6dGhpcywgYWR2aWNlRnVuYzoib25CYWNrZ3JvdW5kQ2xpY2siLCBvbmNlOnRydWV9KTsKKwl9Cit9LCB1bmluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCXRoaXMuYmdJZnJhbWUucmVtb3ZlKCk7CisJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5iZywgdHJ1ZSk7Cit9LCBzZXRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24gKGNvbG9yKSB7CisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgeworCQljb2xvciA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTsKKwl9IGVsc2UgeworCQljb2xvciA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihjb2xvcik7CisJfQorCXRoaXMuYmcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3IudG9TdHJpbmcoKTsKKwlyZXR1cm4gdGhpcy5iZ0NvbG9yID0gY29sb3I7Cit9LCBzZXRCYWNrZ3JvdW5kT3BhY2l0eTpmdW5jdGlvbiAob3ApIHsKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CisJCW9wID0gdGhpcy5iZ09wYWNpdHk7CisJfQorCWRvam8uaHRtbC5zZXRPcGFjaXR5KHRoaXMuYmcsIG9wKTsKKwl0cnkgeworCQl0aGlzLmJnT3BhY2l0eSA9IGRvam8uaHRtbC5nZXRPcGFjaXR5KHRoaXMuYmcpOworCX0KKwljYXRjaCAoZSkgeworCQl0aGlzLmJnT3BhY2l0eSA9IG9wOworCX0KKwlyZXR1cm4gdGhpcy5iZ09wYWNpdHk7Cit9LCBfc2l6ZUJhY2tncm91bmQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmJnT3BhY2l0eSA+IDApIHsKKwkJdmFyIHZpZXdwb3J0ID0gZG9qby5odG1sLmdldFZpZXdwb3J0KCk7CisJCXZhciBoID0gdmlld3BvcnQuaGVpZ2h0OworCQl2YXIgdyA9IHZpZXdwb3J0LndpZHRoOworCQl3aXRoICh0aGlzLmJnLnN0eWxlKSB7CisJCQl3aWR0aCA9IHcgKyAicHgiOworCQkJaGVpZ2h0ID0gaCArICJweCI7CisJCX0KKwkJdmFyIHNjcm9sbF9vZmZzZXQgPSBkb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OworCQl0aGlzLmJnLnN0eWxlLnRvcCA9IHNjcm9sbF9vZmZzZXQueSArICJweCI7CisJCXRoaXMuYmcuc3R5bGUubGVmdCA9IHNjcm9sbF9vZmZzZXQueCArICJweCI7CisJCXZhciB2aWV3cG9ydCA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQlpZiAodmlld3BvcnQud2lkdGggIT0gdykgeworCQkJdGhpcy5iZy5zdHlsZS53aWR0aCA9IHZpZXdwb3J0LndpZHRoICsgInB4IjsKKwkJfQorCQlpZiAodmlld3BvcnQuaGVpZ2h0ICE9IGgpIHsKKwkJCXRoaXMuYmcuc3R5bGUuaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0ICsgInB4IjsKKwkJfQorCX0KKwl0aGlzLmJnSWZyYW1lLnNpemUodGhpcy5iZyk7Cit9LCBfc2hvd0JhY2tncm91bmQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmJnT3BhY2l0eSA+IDApIHsKKwkJdGhpcy5iZy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwl9CisJaWYgKHRoaXMuYmdJZnJhbWUuaWZyYW1lKSB7CisJCXRoaXMuYmdJZnJhbWUuaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCX0KK30sIHBsYWNlTW9kYWxEaWFsb2c6ZnVuY3Rpb24gKCkgeworCXZhciBzY3JvbGxfb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwl2YXIgdmlld3BvcnRfc2l6ZSA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCXZhciBtYjsKKwlpZiAodGhpcy5pc1Nob3dpbmcoKSkgeworCQltYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKKwl9IGVsc2UgeworCQlkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eSh0aGlzLmRvbU5vZGUsIGZhbHNlKTsKKwkJZG9qby5odG1sLnNob3codGhpcy5kb21Ob2RlKTsKKwkJbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJCWRvam8uaHRtbC5oaWRlKHRoaXMuZG9tTm9kZSk7CisJCWRvam8uaHRtbC5zZXRWaXNpYmlsaXR5KHRoaXMuZG9tTm9kZSwgdHJ1ZSk7CisJfQorCXZhciB4ID0gc2Nyb2xsX29mZnNldC54ICsgKHZpZXdwb3J0X3NpemUud2lkdGggLSBtYi53aWR0aCkgLyAyOworCXZhciB5ID0gc2Nyb2xsX29mZnNldC55ICsgKHZpZXdwb3J0X3NpemUuaGVpZ2h0IC0gbWIuaGVpZ2h0KSAvIDI7CisJd2l0aCAodGhpcy5kb21Ob2RlLnN0eWxlKSB7CisJCWxlZnQgPSB4ICsgInB4IjsKKwkJdG9wID0geSArICJweCI7CisJfQorfSwgX29uS2V5OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoZXZ0LmtleSkgeworCQl2YXIgbm9kZSA9IGV2dC50YXJnZXQ7CisJCXdoaWxlIChub2RlICE9IG51bGwpIHsKKwkJCWlmIChub2RlID09IHRoaXMuZG9tTm9kZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJCX0KKwkJaWYgKGV2dC5rZXkgIT0gZXZ0LktFWV9UQUIpIHsKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkgeworCQkJCXRyeSB7CisJCQkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9LCBzaG93TW9kYWxEaWFsb2c6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmZvbGxvd1Njcm9sbCAmJiAhdGhpcy5fc2Nyb2xsQ29ubmVjdGVkKSB7CisJCXRoaXMuX3Njcm9sbENvbm5lY3RlZCA9IHRydWU7CisJCWRvam8uZXZlbnQuY29ubmVjdCh3aW5kb3csICJvbnNjcm9sbCIsIHRoaXMsICJfb25TY3JvbGwiKTsKKwl9CisJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ua2V5IiwgdGhpcywgIl9vbktleSIpOworCXRoaXMucGxhY2VNb2RhbERpYWxvZygpOworCXRoaXMuc2V0QmFja2dyb3VuZE9wYWNpdHkoKTsKKwl0aGlzLl9zaXplQmFja2dyb3VuZCgpOworCXRoaXMuX3Nob3dCYWNrZ3JvdW5kKCk7CisJdGhpcy5fZnJvbVRyYXAgPSB0cnVlOworCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJdHJ5IHsKKwkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQl9CisJfSksIDUwKTsKK30sIGhpZGVNb2RhbERpYWxvZzpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZm9jdXNFbGVtZW50KSB7CisJCWRvam8uYnlJZCh0aGlzLmZvY3VzRWxlbWVudCkuZm9jdXMoKTsKKwkJZG9qby5ieUlkKHRoaXMuZm9jdXNFbGVtZW50KS5ibHVyKCk7CisJfQorCXRoaXMuYmcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLmJnLnN0eWxlLndpZHRoID0gdGhpcy5iZy5zdHlsZS5oZWlnaHQgPSAiMXB4IjsKKwlpZiAodGhpcy5iZ0lmcmFtZS5pZnJhbWUpIHsKKwkJdGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl9CisJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ua2V5IiwgdGhpcywgIl9vbktleSIpOworCWlmICh0aGlzLl9zY3JvbGxDb25uZWN0ZWQpIHsKKwkJdGhpcy5fc2Nyb2xsQ29ubmVjdGVkID0gZmFsc2U7CisJCWRvam8uZXZlbnQuZGlzY29ubmVjdCh3aW5kb3csICJvbnNjcm9sbCIsIHRoaXMsICJfb25TY3JvbGwiKTsKKwl9Cit9LCBfb25TY3JvbGw6ZnVuY3Rpb24gKCkgeworCXZhciBzY3JvbGxfb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwl0aGlzLmJnLnN0eWxlLnRvcCA9IHNjcm9sbF9vZmZzZXQueSArICJweCI7CisJdGhpcy5iZy5zdHlsZS5sZWZ0ID0gc2Nyb2xsX29mZnNldC54ICsgInB4IjsKKwl0aGlzLnBsYWNlTW9kYWxEaWFsb2coKTsKK30sIGNoZWNrU2l6ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nKCkpIHsKKwkJdGhpcy5fc2l6ZUJhY2tncm91bmQoKTsKKwkJdGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7CisJCXRoaXMub25SZXNpemVkKCk7CisJfQorfSwgb25CYWNrZ3JvdW5kQ2xpY2s6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmxpZmV0aW1lIC0gdGhpcy50aW1lUmVtYWluaW5nID49IHRoaXMuYmxvY2tEdXJhdGlvbikgeworCQlyZXR1cm47CisJfQorCXRoaXMuaGlkZSgpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5EaWFsb2ciLCBbZG9qby53aWRnZXQuQ29udGVudFBhbmUsIGRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZV0sIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBjbGFzcz1cImRvam9EaWFsb2dcIiBkb2pvYXR0YWNocG9pbnQ9XCJ3cmFwcGVyXCI+XG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYlN0YXJ0T3V0ZXJcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiXHR0YWJpbmRleD1cIjBcIj48L3NwYW4+XG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYlN0YXJ0XCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XG5cdDxkaXYgZG9qb2F0dGFjaHBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAyO1wiPjwvZGl2PlxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJFbmRcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiRW5kT3V0ZXJcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cbjwvZGl2PlxuIiwgYmxvY2tEdXJhdGlvbjowLCBsaWZldGltZTowLCBjbG9zZU5vZGU6IiIsIHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAodGhpcy5jbG9zZU5vZGUpIHsKKwkJdGhpcy5zZXRDbG9zZUNvbnRyb2wodGhpcy5jbG9zZU5vZGUpOworCX0KK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2UucHJvdG90eXBlLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIHNob3c6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmxpZmV0aW1lKSB7CisJCXRoaXMudGltZVJlbWFpbmluZyA9IHRoaXMubGlmZXRpbWU7CisJCWlmICh0aGlzLnRpbWVyTm9kZSkgeworCQkJdGhpcy50aW1lck5vZGUuaW5uZXJIVE1MID0gTWF0aC5jZWlsKHRoaXMudGltZVJlbWFpbmluZyAvIDEwMDApOworCQl9CisJCWlmICh0aGlzLmJsb2NrRHVyYXRpb24gJiYgdGhpcy5jbG9zZU5vZGUpIHsKKwkJCWlmICh0aGlzLmxpZmV0aW1lID4gdGhpcy5ibG9ja0R1cmF0aW9uKSB7CisJCQkJdGhpcy5jbG9zZU5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmNsb3NlTm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfQorCQl9CisJCWlmICh0aGlzLnRpbWVyKSB7CisJCQljbGVhckludGVydmFsKHRoaXMudGltZXIpOworCQl9CisJCXRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChkb2pvLmxhbmcuaGl0Y2godGhpcywgIl9vblRpY2siKSwgMTAwKTsKKwl9CisJdGhpcy5zaG93TW9kYWxEaWFsb2coKTsKKwlkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5zaG93LmNhbGwodGhpcyk7Cit9LCBvbkxvYWQ6ZnVuY3Rpb24gKCkgeworCXRoaXMucGxhY2VNb2RhbERpYWxvZygpOworCWRvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLm9uTG9hZC5jYWxsKHRoaXMpOworfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworfSwgaGlkZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5oaWRlTW9kYWxEaWFsb2coKTsKKwlkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7CisJaWYgKHRoaXMudGltZXIpIHsKKwkJY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKKwl9Cit9LCBzZXRUaW1lck5vZGU6ZnVuY3Rpb24gKG5vZGUpIHsKKwl0aGlzLnRpbWVyTm9kZSA9IG5vZGU7Cit9LCBzZXRDbG9zZUNvbnRyb2w6ZnVuY3Rpb24gKG5vZGUpIHsKKwl0aGlzLmNsb3NlTm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5jbG9zZU5vZGUsICJvbmNsaWNrIiwgdGhpcywgImhpZGUiKTsKK30sIHNldFNob3dDb250cm9sOmZ1bmN0aW9uIChub2RlKSB7CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwgIm9uY2xpY2siLCB0aGlzLCAic2hvdyIpOworfSwgX29uVGljazpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMudGltZXIpIHsKKwkJdGhpcy50aW1lUmVtYWluaW5nIC09IDEwMDsKKwkJaWYgKHRoaXMubGlmZXRpbWUgLSB0aGlzLnRpbWVSZW1haW5pbmcgPj0gdGhpcy5ibG9ja0R1cmF0aW9uKSB7CisJCQlpZiAodGhpcy5jbG9zZU5vZGUpIHsKKwkJCQl0aGlzLmNsb3NlTm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOworCQkJfQorCQl9CisJCWlmICghdGhpcy50aW1lUmVtYWluaW5nKSB7CisJCQljbGVhckludGVydmFsKHRoaXMudGltZXIpOworCQkJdGhpcy5oaWRlKCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy50aW1lck5vZGUpIHsKKwkJCQl0aGlzLnRpbWVyTm9kZS5pbm5lckhUTUwgPSBNYXRoLmNlaWwodGhpcy50aW1lUmVtYWluaW5nIC8gMTAwMCk7CisJCQl9CisJCX0KKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRG9jUGFuZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRG9jUGFuZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM4MWNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Eb2NQYW5lLmpzCkBAIC0wLDAgKzEsMjYyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Eb2NQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkVkaXRvcjIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRGlhbG9nIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmRpc3BsYXkiKTsKK2Rvam8ud2lkZ2V0LkRvY1BhbmUgPSBmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoIi9kb2NzL2Z1bmN0aW9uL3Jlc3VsdHMiLCB0aGlzLCAib25Eb2NSZXN1bHRzIik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoIi9kb2NzL3BhY2thZ2UvcmVzdWx0cyIsIHRoaXMsICJvblBrZ1Jlc3VsdHMiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiL2RvY3MvZnVuY3Rpb24vZGV0YWlsIiwgdGhpcywgIm9uRG9jU2VsZWN0RnVuY3Rpb24iKTsKK307Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkRvY1BhbmUiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7ZGlhbG9nOm51bGwsIGRpYWxvZ0JnOm51bGwsIGRpYWxvZ0ZnOm51bGwsIGxvZ0luOm51bGwsIGVkaXQ6bnVsbCwgc2F2ZTpudWxsLCBjYW5jZWw6bnVsbCwgZGV0YWlsOm51bGwsIHJlc3VsdDpudWxsLCBwYWNrYWc6bnVsbCwgZm46bnVsbCwgZm5MaW5rOm51bGwsIGNvdW50Om51bGwsIHJvdzpudWxsLCBzdW1tYXJ5Om51bGwsIGRlc2NyaXB0aW9uOm51bGwsIHZhcmlhYmxlczpudWxsLCB2Um93Om51bGwsIHZMaW5rOm51bGwsIHZEZXNjOm51bGwsIG1ldGhvZHM6bnVsbCwgbVJvdzpudWxsLCBtTGluazpudWxsLCBtRGVzYzpudWxsLCByZXF1aXJlczpudWxsLCByUm93Om51bGwsIHJSb3cyOm51bGwsIHJIMzpudWxsLCByTGluazpudWxsLCBwYXJhbWV0ZXJzOm51bGwsIHBSb3c6bnVsbCwgcExpbms6bnVsbCwgcERlc2M6bnVsbCwgcE9wdDpudWxsLCBwVHlwZTpudWxsLCBzVHlwZTpudWxsLCBzTmFtZTpudWxsLCBzUGFyYW1zOm51bGwsIHNQVHlwZTpudWxsLCBzUFR5cGVTYXZlOm51bGwsIHNQTmFtZTpudWxsLCBzUE5hbWVTYXZlOm51bGwsIHBrZ0Rlc2NyaXB0aW9uOm51bGwsIF9hcHBlbmRzOltdLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9Eb2NQYW5lXCI+XG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiY29udGFpbmVyXCI+PC9kaXY+XG5cblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkaWFsb2dcIiBjbGFzcz1cImRpYWxvZ1wiPlxuXHRcdDxkaXYgY2xhc3M9XCJjb250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJkaWFsb2dCZ1wiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImRvY0RpYWxvZ1wiIGRvam9BdHRhY2hQb2ludD1cImRpYWxvZ0ZnXCI+XG5cdFx0XHRcdDxoMj5Mb2cgSW48L2gyPlxuXHRcdFx0XHQ8cD48aW5wdXQgaWQ9XCJkb2pvRG9jVXNlck5hbWVcIiBkb2pvQXR0YWNoUG9pbnQ9XCJ1c2VyTmFtZVwiPjxsYWJlbCBmb3I9XCJkb2pvRG9jVXNlck5hbWVcIj5Vc2VyIE5hbWU6PC9sYWJlbD48L3A+XG5cdFx0XHRcdDxwPjxpbnB1dCBpZD1cImRvam9Eb2NQYXNzd29yZFwiIGRvam9BdHRhY2hQb2ludD1cInBhc3N3b3JkXCIgdHlwZT1cInBhc3N3b3JkXCI+PGxhYmVsIGZvcj1cImRvam9Eb2NQYXNzd29yZFwiPlBhc3N3b3JkOjwvbGFiZWw+PC9wPlxuXHRcdFx0XHQ8cD48aW5wdXQgdHlwZT1cImJ1dHRvblwiIGRvam9BdHRhY2hQb2ludD1cImNhbmNlbFwiIHZhbHVlPVwiY2FuY2VsXCI+IDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgZG9qb0F0dGFjaFBvaW50PVwibG9nSW5cIiB2YWx1ZT1cIkxvZyBJblwiPjwvcD5cblx0XHRcdFx0PHA+PC9wPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwibmF2XCIgY2xhc3M9XCJuYXZcIj48c3Bhbj5EZXRhaWw8L3NwYW4+IHwgPHNwYW4+U291cmNlPC9zcGFuPiB8IDxzcGFuPkV4YW1wbGVzPC9zcGFuPiB8IDxzcGFuPldhbGt0aHJvdWdoPC9zcGFuPjwvZGl2PlxuXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiZGV0YWlsXCIgY2xhc3M9XCJkZXRhaWxcIj5cblx0XHQ8aDE+RGV0YWlsOiA8c3BhbiBjbGFzcz1cImZuXCIgZG9qb0F0dGFjaFBvaW50PVwiZm5cIj5kb2pvLnNlbGVjdDwvc3Bhbj48L2gxPlxuXHRcdDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIGRvam9BdHRhY2hQb2ludD1cImRlc2NyaXB0aW9uXCI+RGVzY3JpcHRpb248L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwicGFyYW1zXCIgZG9qb0F0dGFjaFBvaW50PVwicGFyYW1ldGVyc1wiPlxuXHRcdFx0PGgyPlBhcmFtZXRlcnM8L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiIGRvam9BdHRhY2hQb2ludD1cInBSb3dcIj5cblx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwicE9wdFwiPjxlbT5vcHRpb25hbDwvZW0+IDwvc3Bhbj5cblx0XHRcdFx0PHNwYW4+PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwicFR5cGVcIj50eXBlPC9zcGFuPiA8L3NwYW4+XG5cdFx0XHRcdDxhIGhyZWY9XCIjXCIgZG9qb0F0dGFjaFBvaW50PVwicExpbmtcIj52YXJpYWJsZTwvYT5cblx0XHRcdFx0PHNwYW4+IC0gPHNwYW4gZG9qb0F0dGFjaFBvaW50PVwicERlc2NcIj48L3NwYW4+PC9zcGFuPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cInZhcmlhYmxlc1wiIGRvam9BdHRhY2hQb2ludD1cInZhcmlhYmxlc1wiPlxuXHRcdFx0PGgyPlZhcmlhYmxlczwvaDI+XG5cdFx0XHQ8ZGl2IGNsYXNzXCJyb3dcIiBkb2pvQXR0YWNoUG9pbnQ9XCJ2Um93XCI+XG5cdFx0XHRcdDxhIGhyZWY9XCIjXCIgZG9qb0F0dGFjaFBvaW50PVwidkxpbmtcIj52YXJpYWJsZTwvYT48c3Bhbj4gLSA8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJ2RGVzY1wiPjwvc3Bhbj48L3NwYW4+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwic2lnbmF0dXJlXCI+XG5cdFx0XHQ8aDI+U2lnbmF0dXJlPC9oMj5cblx0XHRcdDxkaXYgY2xhc3M9XCJzb3VyY2VcIj5cblx0XHRcdFx0PHNwYW4gY2xhc3M9XCJyZXR1cm5cIiBkb2pvQXR0YWNoUG9pbnQ9XCJzVHlwZVwiPnJldHVyblR5cGU8L3NwYW4+IFxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZ1bmN0aW9uXCIgZG9qb0F0dGFjaFBvaW50PVwic05hbWVcIj5mb288L3NwYW4+XG5cdFx0XHRcdCg8c3BhbiBjbGFzcz1cInBhcmFtc1wiIGRvam9BdHRhY2hQb2ludD1cInNQYXJhbXNcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInR5cGVcIiBkb2pvQXR0YWNoUG9pbnQ9XCJzUFR5cGVcIj50eXBlIDwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm5hbWVcIiBkb2pvQXR0YWNoUG9pbnQ9XCJzUE5hbWVcIj5wYXJhbU5hbWU8L3NwYW4+XG5cdFx0XHRcdDwvc3Bhbj4pXG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdFxuXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInJlc3VsdFwiIGNsYXNzPVwicmVzdWx0XCI+XG5cdFx0PGgxPlNlYXJjaCBSZXN1bHRzOiA8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJjb3VudFwiPjA8L3NwYW4+IG1hdGNoZXM8L2gxPlxuXHRcdDxkaXYgY2xhc3M9XCJyb3dcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyb3dcIj5cblx0XHRcdDxhIGhyZWY9XCIjXCIgZG9qb0F0dGFjaFBvaW50PVwiZm5MaW5rXCI+ZG9qby5mbkxpbms8L2E+XG5cdFx0XHQ8c3Bhbj4gLSA8c3BhbiBjbGFzcz1cInN1bW1hcnlcIiBkb2pvQXR0YWNoUG9pbnQ9XCJzdW1tYXJ5XCI+c3VtbWFyeTwvc3Bhbj48L3NwYW4+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwicGFja2FnXCIgY2xhc3M9XCJwYWNrYWdlXCI+XG5cdFx0PGgxPlBhY2thZ2U6IFxuXHRcdFx0PHNwYW4gY2xhc3M9XCJwa2dcIiBkb2pvQXR0YWNoUG9pbnQ9XCJwa2dcIj5kb2pvLnBhY2thZ2U8L3NwYW4+IFxuXHRcdFx0PHNwYW4gY2xhc3M9XCJlZGl0XCIgZG9qb0F0dGFjaFBvaW50PVwiZWRpdFwiPltlZGl0XTwvc3Bhbj4gXG5cdFx0XHQ8c3BhbiBjbGFzcz1cInNhdmVcIiBkb2pvQXR0YWNoUG9pbnQ9XCJzYXZlXCI+W3NhdmVdPC9zcGFuPlxuXHRcdDwvaDE+XG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJwa2dEZXNjcmlwdGlvblwiIGNsYXNzPVwiZGVzY3JpcHRpb25cIj5EZXNjcmlwdGlvbjwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJtZXRob2RzXCIgZG9qb0F0dGFjaFBvaW50PVwibWV0aG9kc1wiPlxuXHRcdFx0PGgyPk1ldGhvZHM8L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiIGRvam9BdHRhY2hQb2ludD1cIm1Sb3dcIj5cblx0XHRcdFx0PGEgaHJlZj1cIiNcIiBkb2pvQXR0YWNoUG9pbnQ9XCJtTGlua1wiPm1ldGhvZDwvYT5cblx0XHRcdFx0PHNwYW4+IC0gPHNwYW4gY2xhc3M9XCJkZXNjcmlwdGlvblwiIGRvam9BdHRhY2hQb2ludD1cIm1EZXNjXCI+PC9zcGFuPjwvc3Bhbj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJyZXF1aXJlc1wiIGRvam9BdHRhY2hQb2ludD1cInJlcXVpcmVzXCI+XG5cdFx0XHQ8aDI+UmVxdWlyZXM8L2gyPlxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiIGRvam9BdHRhY2hQb2ludD1cInJSb3dcIj5cblx0XHRcdFx0PGgzIGRvam9BdHRhY2hQb2ludD1cInJIM1wiPkVudmlyb25tZW50PC9oMz5cblx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyUm93MlwiPjxhIGhyZWY9XCIjXCIgZG9qb0F0dGFjaFBvaW50PVwickxpbmtcIiBjbGFzcz1cInBhY2thZ2VcIj5yZXF1aXJlPC9hPjwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9Eb2NQYW5lIHsgcGFkZGluZzoxZW07IGZvbnQ6IDFlbSBHZW9yZ2lhLFRpbWVzLFwiVGltZXMgTmV3IFJvbWFuXCIsc2VyaWY7IH1cblxuLmRvam9Eb2NQYW5lIC5jb250YWluZXJ7IH1cblxuLmRvam9Eb2NQYW5lIC5kaWFsb2d7IH1cbi5kb2pvRG9jUGFuZSAuZGlhbG9nIC5jb250YWluZXJ7IHBhZGRpbmc6IDAuNWVtOyBiYWNrZ3JvdW5kOiAjZmZmOyBib3JkZXI6IDJweCBzb2xpZCAjMzMzOyB9XG4uZG9qb0RvY1BhbmUgLmRpYWxvZyAuZG9jRGlhbG9neyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgd2lkdGg6IDIwZW07IH1cbi5kb2pvRG9jUGFuZSAuZGlhbG9nIC5kb2NEaWFsb2cgaDJ7IG1hcmdpbi10b3A6IDA7IHBhZGRpbmctdG9wOiAwOyB9XG4uZG9qb0RvY1BhbmUgLmRpYWxvZyAuZG9jRGlhbG9nIGlucHV0IHsgZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tcmlnaHQ6IDFlbTsgfVxuLmRvam9Eb2NQYW5lIC5kaWFsb2cgLmRvY0RpYWxvZyBweyBjbGVhcjogYm90aDsgfVxuI2Rvam9Eb2NVc2VyTmFtZSwgI2Rvam9Eb2NQYXNzd29yZCB7IHdpZHRoOiAxMGVtOyB9XG5cbi5kb2pvRG9jUGFuZSAubmF2eyB9XG4uZG9qb0RvY1BhbmUgLm5hdiBzcGFueyB9XG5cbi5kb2pvRG9jUGFuZSAuZGV0YWlseyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCBoMXsgfVxuLmRvam9Eb2NQYW5lIC5kZXRhaWwgaDEgc3Bhbi5mbnsgfVxuLmRvam9Eb2NQYW5lIC5kZXRhaWwgLmRlc2NyaXB0aW9ueyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCAucGFyYW1zeyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCAucGFyYW1zIC5yb3d7IH1cbi5kb2pvRG9jUGFuZSAuZGV0YWlsIC5wYXJhbXMgLnJvdyBzcGFueyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCAudmFyaWFibGVzeyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCAudmFyaWFibGVzIC5yb3d7IH1cbi5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmV7IH1cbi5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmUgLnNvdXJjZXsgd2hpdGUtc3BhY2U6IHByZTsgZm9udDogMC44ZW0gTW9uYWNvLCBDb3VyaWVyLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsgfVxuLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZSAuc291cmNlIC5yZXR1cm57IGNvbG9yOiMzNjk7IH1cbi5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmUgLnNvdXJjZSAuZnVuY3Rpb257IGNvbG9yOiAjOTg1NDNGOyBmb250LXdlaWdodDogYm9sZDsgfVxuLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZSAuc291cmNlIC5wYXJhbXN7IH1cbi5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmUgLnNvdXJjZSAucGFyYW1zIC50eXBleyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjZDE3NTc1OyB9XG4uZG9qb0RvY1BhbmUgLmRldGFpbCAuc2lnbmF0dXJlIC5zb3VyY2UgLnBhcmFtcyAubmFtZXsgY29sb3I6ICNkMTQwNDA7IH1cblxuLmRvam9Eb2NQYW5lIC5yZXN1bHR7IH1cbi5kb2pvRG9jUGFuZSAucmVzdWx0IGgxeyB9XG4uZG9qb0RvY1BhbmUgLnJlc3VsdCAucm93eyB9XG4uZG9qb0RvY1BhbmUgLnJlc3VsdCAucm93IC5zdW1tYXJ5eyB9XG5cbi5kb2pvRG9jUGFuZSAucGFja2FnZXsgfVxuLmRvam9Eb2NQYW5lIC5wYWNrYWdlIGgxeyB9XG4uZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJvd3sgfVxuLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5yb3cgLnN1bW1hcnl7IH1cbi5kb2pvRG9jUGFuZSAucGFja2FnZSAuZGVzY3JpcHRpb257IH1cbi5kb2pvRG9jUGFuZSAucGFja2FnZSAubWV0aG9kc3sgfVxuLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5tZXRob2RzIGgyeyB9XG4uZG9qb0RvY1BhbmUgLnBhY2thZ2UgLm1ldGhvZHMgLnJvd3sgfVxuLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5tZXRob2RzIC5yb3cgLmRlc2NyaXB0aW9ueyB9XG4uZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzeyB9XG4uZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzIGgyeyB9XG4uZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzIC5yb3d7IH1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9Eb2NQYW5lLmNzcyIpLCBpc0NvbnRhaW5lcjp0cnVlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5yZXF1aXJlcyA9IGRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMucmVxdWlyZXMpOworCXRoaXMuclJvdy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXRoaXMuclJvdzIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLm1ldGhvZHMgPSBkb2pvLmh0bWwucmVtb3ZlTm9kZSh0aGlzLm1ldGhvZHMpOworCXRoaXMubVJvdy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXRoaXMuZGlhbG9nID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJkaWFsb2ciLCB7fSwgdGhpcy5kaWFsb2cpOworCXRoaXMuZGlhbG9nLnNldENsb3NlQ29udHJvbCh0aGlzLmNhbmNlbCk7CisJZG9qby5odG1sLnNldE9wYWNpdHkodGhpcy5kaWFsb2dCZywgMC44KTsKKwlkb2pvLmh0bWwuc2V0T3BhY2l0eSh0aGlzLmRpYWxvZ0ZnLCAxKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5lZGl0LCAib25jbGljayIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoKSB7CisJCWlmICghdGhpcy5faXNMb2dnZWRJbikgeworCQkJdGhpcy5kaWFsb2cuc2hvdygpOworCQl9CisJfSkpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmxvZ0luLCAib25jbGljayIsIHRoaXMsICJfbG9nSW4iKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5zYXZlLCAib25jbGljayIsIHRoaXMsICJfc2F2ZSIpOworCWRvam8uZXZlbnQuY29ubmVjdChkb2pvLmRvY3MsICJsb2dJblN1Y2Nlc3MiLCB0aGlzLCAiX2xvZ2dlZEluIik7CisJdGhpcy5ob21lU2F2ZSA9IHRoaXMuY29udGFpbmVyTm9kZS5jbG9uZU5vZGUodHJ1ZSk7CisJdGhpcy5kZXRhaWxTYXZlID0gZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kZXRhaWwpOworCXRoaXMucmVzdWx0U2F2ZSA9IGRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMucmVzdWx0KTsKKwl0aGlzLnBhY2thZ2VTYXZlID0gZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5wYWNrYWcpOworCXRoaXMucmVzdWx0cyA9IGRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMucmVzdWx0cyk7CisJdGhpcy5yb3dQYXJlbnQgPSB0aGlzLnJvdy5wYXJlbnROb2RlOworCXRoaXMucm93U2F2ZSA9IGRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMucm93KTsKKwl0aGlzLnZQYXJlbnQgPSB0aGlzLnZSb3cucGFyZW50Tm9kZTsKKwl0aGlzLnZTYXZlID0gZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy52Um93KTsKKwl0aGlzLnBQYXJlbnQgPSB0aGlzLnBSb3cucGFyZW50Tm9kZTsKKwl0aGlzLnBTYXZlID0gZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5wUm93KTsKKwl0aGlzLnNQVHlwZVNhdmUgPSBkb2pvLmh0bWwucmVtb3ZlTm9kZSh0aGlzLnNQVHlwZSk7CisJdGhpcy5zUE5hbWVTYXZlID0gZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5zUE5hbWUpOworCXRoaXMubmF2U2F2ZSA9IGRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMubmF2KTsKK30sIF9sb2dJbjpmdW5jdGlvbiAoKSB7CisJZG9qby5kb2NzLnNldFVzZXJOYW1lKHRoaXMudXNlck5hbWUudmFsdWUpOworCWRvam8uZG9jcy5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkLnZhbHVlKTsKK30sIF9sb2dnZWRJbjpmdW5jdGlvbiAoKSB7CisJdGhpcy5faXNMb2dnZWRJbiA9IHRydWU7CisJdGhpcy5kaWFsb2cuaGlkZSgpOworCXRoaXMucGtnRWRpdG9yID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJlZGl0b3IyIiwge3Rvb2xiYXJBbHdheXNWaXNpYmxlOnRydWV9LCB0aGlzLnBrZ0Rlc2NyaXB0aW9uKTsKK30sIF9zYXZlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5wa2dFZGl0b3IpIHsKKwkJZG9qby5kb2NzLnNhdmVQYWNrYWdlKHRoaXMuX3BrZ1BhdGgsIHtkZXNjcmlwdGlvbjp0aGlzLnBrZ0VkaXRvci5nZXRFZGl0b3JDb250ZW50KCl9KTsKKwl9Cit9LCBvbkRvY1NlbGVjdEZ1bmN0aW9uOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJZG9qby5kZWJ1Zygib25Eb2NTZWxlY3RGdW5jdGlvbigpIik7CisJZm9yICh2YXIga2V5IGluIG1lc3NhZ2UpIHsKKwkJZG9qby5kZWJ1ZyhrZXkgKyAiOiAiICsgZG9qby5qc29uLnNlcmlhbGl6ZShtZXNzYWdlW2tleV0pKTsKKwl9CisJdmFyIG1ldGEgPSBtZXNzYWdlLm1ldGE7CisJaWYgKG1ldGEpIHsKKwkJdmFyIHZhcmlhYmxlcyA9IG1ldGEudmFyaWFibGVzOworCQl2YXIgdGhpc192YXJpYWJsZXMgPSBtZXRhLnRoaXNfdmFyaWFibGVzOworCQl2YXIgY2hpbGRfdmFyaWFibGVzID0gbWV0YS5jaGlsZF92YXJpYWJsZXM7CisJCXZhciBwYXJhbWV0ZXJzID0gbWV0YS5wYXJhbWV0ZXJzOworCX0KKwl2YXIgZG9jID0gbWVzc2FnZS5kb2M7CisJZG9qby5kZWJ1Zyhkb2pvLmpzb24uc2VyaWFsaXplKGRvYykpOworCXZhciBhcHBlbmRzID0gdGhpcy5fYXBwZW5kczsKKwlkb2pvLmh0bWwucmVtb3ZlQ2hpbGRyZW4odGhpcy5kb21Ob2RlKTsKKwl0aGlzLmZuLmlubmVySFRNTCA9IG1lc3NhZ2UubmFtZTsKKwl0aGlzLnZhcmlhYmxlcy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwl2YXIgYWxsID0gW107CisJaWYgKHZhcmlhYmxlcykgeworCQlhbGwgPSB2YXJpYWJsZXM7CisJfQorCWlmICh0aGlzX3ZhcmlhYmxlcykgeworCQlhbGwgPSBhbGwuY29uY2F0KHRoaXNfdmFyaWFibGVzKTsKKwl9CisJaWYgKGNoaWxkX3ZhcmlhYmxlcykgeworCQlhbGwgPSBhbGwuY29uY2F0KGNoaWxkX3ZhcmlhYmxlcyk7CisJfQorCWlmICghYWxsLmxlbmd0aCkgeworCQl0aGlzLnZhcmlhYmxlcy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCX0gZWxzZSB7CisJCWZvciAodmFyIGkgPSAwLCBvbmU7IG9uZSA9IGFsbFtpXTsgaSsrKSB7CisJCQl0aGlzLnZMaW5rLmlubmVySFRNTCA9IG9uZTsKKwkJCXRoaXMudkRlc2MucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJYXBwZW5kcy5wdXNoKHRoaXMudlBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnZTYXZlLmNsb25lTm9kZSh0cnVlKSkpOworCQl9CisJfQorCXRoaXMuc1BhcmFtcy5pbm5lckhUTUwgPSAiIjsKKwl2YXIgZmlyc3QgPSB0cnVlOworCWZvciAodmFyIHBhcmFtIGluIHBhcmFtZXRlcnMpIHsKKwkJdmFyIHBhcmFtVHlwZSA9IHBhcmFtZXRlcnNbcGFyYW1dLnR5cGU7CisJCXZhciBwYXJhbVN1bW1hcnkgPSBwYXJhbWV0ZXJzW3BhcmFtXS5zdW1tYXJ5OworCQl2YXIgcGFyYW1OYW1lID0gcGFyYW07CisJCXRoaXMucGFyYW1ldGVycy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwkJdGhpcy5wTGluay5pbm5lckhUTUwgPSBwYXJhbU5hbWU7CisJCXRoaXMucE9wdC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQlpZiAocGFyYW1ldGVyc1twYXJhbV0ub3B0KSB7CisJCQl0aGlzLnBPcHQuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOworCQl9CisJCXRoaXMucFR5cGUucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQlpZiAocGFyYW1ldGVyc1twYXJhbV1bMF0pIHsKKwkJCXRoaXMucFR5cGUucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisJCQl0aGlzLnBUeXBlLmlubmVySFRNTCA9IHBhcmFtVHlwZTsKKwkJfQorCQl0aGlzLnBEZXNjLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJaWYgKHBhcmFtU3VtbWFyeSkgeworCQkJdGhpcy5wRGVzYy5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKwkJCXRoaXMucERlc2MuaW5uZXJIVE1MID0gcGFyYW1TdW1tYXJ5OworCQl9CisJCWFwcGVuZHMucHVzaCh0aGlzLnBQYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5wU2F2ZS5jbG9uZU5vZGUodHJ1ZSkpKTsKKwkJaWYgKCFmaXJzdCkgeworCQkJdGhpcy5zUGFyYW1zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIsICIpKTsKKwkJfQorCQlmaXJzdCA9IGZhbHNlOworCQlpZiAocGFyYW1UeXBlKSB7CisJCQlkb2pvLmRlYnVnKHRoaXMuc1BUeXBlU2F2ZSk7CisJCQl0aGlzLnNQVHlwZVNhdmUuaW5uZXJIVE1MID0gcGFyYW1UeXBlOworCQkJdGhpcy5zUGFyYW1zLmFwcGVuZENoaWxkKHRoaXMuc1BUeXBlU2F2ZS5jbG9uZU5vZGUodHJ1ZSkpOworCQkJdGhpcy5zUGFyYW1zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgIikpOworCQl9CisJCWRvam8uZGVidWcodGhpcy5zUE5hbWVTYXZlKTsKKwkJdGhpcy5zUE5hbWVTYXZlLmlubmVySFRNTCA9IHBhcmFtTmFtZTsKKwkJdGhpcy5zUGFyYW1zLmFwcGVuZENoaWxkKHRoaXMuc1BOYW1lU2F2ZS5jbG9uZU5vZGUodHJ1ZSkpOworCX0KKwlpZiAobWVzc2FnZS5yZXR1cm5zKSB7CisJCXRoaXMuc1R5cGUuaW5uZXJIVE1MID0gbWVzc2FnZS5yZXR1cm5zOworCX0gZWxzZSB7CisJCXRoaXMuc1R5cGUuaW5uZXJIVE1MID0gInZvaWQiOworCX0KKwl0aGlzLnNOYW1lLmlubmVySFRNTCA9IG1lc3NhZ2UubmFtZTsKKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5uYXZTYXZlKTsKKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kZXRhaWxTYXZlLmNsb25lTm9kZSh0cnVlKSk7CisJZm9yICh2YXIgaSA9IDAsIGFwcGVuZDsgYXBwZW5kID0gYXBwZW5kc1tpXTsgaSsrKSB7CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGFwcGVuZCk7CisJfQorfSwgb25Qa2dSZXN1bHQ6ZnVuY3Rpb24gKHJlc3VsdHMpIHsKKwlpZiAodGhpcy5wa2dFZGl0b3IpIHsKKwkJdGhpcy5wa2dFZGl0b3IuY2xvc2UodHJ1ZSk7CisJCWRvam8uZGVidWcodGhpcy5wa2dEZXNjcmlwdGlvbik7CisJfQorCXZhciBtZXRob2RzID0gcmVzdWx0cy5tZXRob2RzOworCXZhciByZXF1aXJlcyA9IHJlc3VsdHMucmVxdWlyZXM7CisJdmFyIGRlc2NyaXB0aW9uID0gcmVzdWx0cy5kZXNjcmlwdGlvbjsKKwl0aGlzLl9wa2dQYXRoID0gcmVzdWx0cy5wYXRoOworCXZhciByZXF1aXJlTGlua3MgPSBbXTsKKwl2YXIgYXBwZW5kcyA9IHRoaXMuX2FwcGVuZHM7CisJd2hpbGUgKGFwcGVuZHMubGVuZ3RoKSB7CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGFwcGVuZHMuc2hpZnQoKSk7CisJfQorCWRvam8uaHRtbC5yZW1vdmVDaGlsZHJlbih0aGlzLmRvbU5vZGUpOworCXRoaXMucGtnLmlubmVySFRNTCA9IHJlc3VsdHMucGtnOworCXZhciBoYXNSZXF1aXJlcyA9IGZhbHNlOworCWZvciAodmFyIGVudiBpbiByZXF1aXJlcykgeworCQloYXNSZXF1aXJlcyA9IHRydWU7CisJCXRoaXMuckgzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCWlmIChlbnYgIT0gImNvbW1vbiIpIHsKKwkJCXRoaXMuckgzLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJCXRoaXMuckgzLmlubmVySFRNTCA9IGVudjsKKwkJfQorCQlmb3IgKHZhciBpID0gMCwgcmVxdWlyZTsgcmVxdWlyZSA9IHJlcXVpcmVzW2Vudl1baV07IGkrKykgeworCQkJcmVxdWlyZUxpbmtzLnB1c2goe25hbWU6cmVxdWlyZX0pOworCQkJdGhpcy5yTGluay5pbm5lckhUTUwgPSByZXF1aXJlOworCQkJdGhpcy5yTGluay5ocmVmID0gIiMiICsgcmVxdWlyZTsKKwkJCXZhciByUm93MiA9IHRoaXMuclJvdzIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5yUm93Mi5jbG9uZU5vZGUodHJ1ZSksIHRoaXMuclJvdzIpOworCQkJclJvdzIuc3R5bGUuZGlzcGxheSA9ICIiOworCQkJYXBwZW5kcy5wdXNoKHJSb3cyKTsKKwkJfQorCQl2YXIgclJvdyA9IHRoaXMuclJvdy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJSb3cuY2xvbmVOb2RlKHRydWUpLCB0aGlzLnJSb3cpOworCQlyUm93LnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJYXBwZW5kcy5wdXNoKHJSb3cpOworCX0KKwlpZiAoaGFzUmVxdWlyZXMpIHsKKwkJYXBwZW5kcy5wdXNoKHRoaXMucGFja2FnZVNhdmUuYXBwZW5kQ2hpbGQodGhpcy5yZXF1aXJlcy5jbG9uZU5vZGUodHJ1ZSkpKTsKKwl9CisJaWYgKHJlc3VsdHMuc2l6ZSkgeworCQlmb3IgKHZhciBpID0gMCwgbWV0aG9kOyBtZXRob2QgPSBtZXRob2RzW2ldOyBpKyspIHsKKwkJCXRoaXMubUxpbmsuaW5uZXJIVE1MID0gbWV0aG9kLm5hbWU7CisJCQl0aGlzLm1MaW5rLmhyZWYgPSAiIyIgKyBtZXRob2QubmFtZTsKKwkJCXRoaXMubURlc2MucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJaWYgKG1ldGhvZC5zdW1tYXJ5KSB7CisJCQkJdGhpcy5tRGVzYy5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKwkJCQl0aGlzLm1EZXNjLmlubmVySFRNTCA9IG1ldGhvZC5zdW1tYXJ5OworCQkJfQorCQkJdmFyIG1Sb3cgPSB0aGlzLm1Sb3cucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5tUm93LmNsb25lTm9kZSh0cnVlKSwgdGhpcy5tUm93KTsKKwkJCW1Sb3cuc3R5bGUuZGlzcGxheSA9ICIiOworCQkJYXBwZW5kcy5wdXNoKG1Sb3cpOworCQl9CisJCWFwcGVuZHMucHVzaCh0aGlzLnBhY2thZ2VTYXZlLmFwcGVuZENoaWxkKHRoaXMubWV0aG9kcy5jbG9uZU5vZGUodHJ1ZSkpKTsKKwl9CisJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMucGFja2FnZVNhdmUpOworCXRoaXMucGtnRGVzY3JpcHRpb24uaW5uZXJIVE1MID0gZGVzY3JpcHRpb247CisJZnVuY3Rpb24gbWFrZVNlbGVjdChmT3JQLCB4KSB7CisJCXJldHVybiBmdW5jdGlvbiAoZSkgeworCQkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCIvZG9jcy8iICsgZk9yUCArICIvc2VsZWN0IiwgeCk7CisJCX07CisJfQorCXZhciBhcyA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOworCWZvciAodmFyIGkgPSAwLCBhOyBhID0gYXNbaV07IGkrKykgeworCQlpZiAoYS5jbGFzc05hbWUgPT0gImRvY01MaW5rIikgeworCQkJZG9qby5ldmVudC5jb25uZWN0KGEsICJvbmNsaWNrIiwgbWFrZVNlbGVjdCgiZnVuY3Rpb24iLCBtZXRob2RzW2ldKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYS5jbGFzc05hbWUgPT0gImRvY1JMaW5rIikgeworCQkJCWRvam8uZXZlbnQuY29ubmVjdChhLCAib25jbGljayIsIG1ha2VTZWxlY3QoInBhY2thZ2UiLCByZXF1aXJlTGlua3NbaV0pKTsKKwkJCX0KKwkJfQorCX0KK30sIG9uRG9jUmVzdWx0czpmdW5jdGlvbiAoZm5zKSB7CisJZG9qby5kZWJ1Zygib25Eb2NSZXN1bHRzKCk6IGNhbGxlZCIpOworCWlmIChmbnMubGVuZ3RoID09IDEpIHsKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCIvZG9jcy9mdW5jdGlvbi9zZWxlY3QiLCBmbnNbMF0pOworCQlyZXR1cm47CisJfQorCWRvam8uaHRtbC5yZW1vdmVDaGlsZHJlbih0aGlzLmRvbU5vZGUpOworCXRoaXMuY291bnQuaW5uZXJIVE1MID0gZm5zLmxlbmd0aDsKKwl2YXIgYXBwZW5kcyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBmbjsgZm4gPSBmbnNbaV07IGkrKykgeworCQl0aGlzLmZuTGluay5pbm5lckhUTUwgPSBmbi5uYW1lOworCQl0aGlzLmZuTGluay5ocmVmID0gIiMiICsgZm4ubmFtZTsKKwkJaWYgKGZuLmlkKSB7CisJCQl0aGlzLmZuTGluay5ocmVmID0gdGhpcy5mbkxpbmsuaHJlZiArICIsIiArIGZuLmlkOworCQl9CisJCXRoaXMuc3VtbWFyeS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCWlmIChmbi5zdW1tYXJ5KSB7CisJCQl0aGlzLnN1bW1hcnkucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisJCQl0aGlzLnN1bW1hcnkuaW5uZXJIVE1MID0gZm4uc3VtbWFyeTsKKwkJfQorCQlhcHBlbmRzLnB1c2godGhpcy5yb3dQYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5yb3dTYXZlLmNsb25lTm9kZSh0cnVlKSkpOworCX0KKwlmdW5jdGlvbiBtYWtlU2VsZWN0KHgpIHsKKwkJcmV0dXJuIGZ1bmN0aW9uIChlKSB7CisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goIi9kb2NzL2Z1bmN0aW9uL3NlbGVjdCIsIHgpOworCQl9OworCX0KKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5yZXN1bHRTYXZlLmNsb25lTm9kZSh0cnVlKSk7CisJdmFyIGFzID0gdGhpcy5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7CisJZm9yICh2YXIgaSA9IDAsIGE7IGEgPSBhc1tpXTsgaSsrKSB7CisJCWRvam8uZXZlbnQuY29ubmVjdChhLCAib25jbGljayIsIG1ha2VTZWxlY3QoZm5zW2ldKSk7CisJfQorCWZvciAodmFyIGkgPSAwLCBhcHBlbmQ7IGFwcGVuZCA9IGFwcGVuZHNbaV07IGkrKykgeworCQl0aGlzLnJvd1BhcmVudC5yZW1vdmVDaGlsZChhcHBlbmQpOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Eb21XaWRnZXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0RvbVdpZGdldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIyZDIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Eb21XaWRnZXQuanMKQEAgLTAsMCArMSw1MDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRvbVdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZG9tIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLnhtbC5QYXJzZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLnVyaS4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5leHRyYXMiKTsKK2Rvam8ud2lkZ2V0Ll9jc3NGaWxlcyA9IHt9OworZG9qby53aWRnZXQuX2Nzc1N0cmluZ3MgPSB7fTsKK2Rvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlID0ge307Citkb2pvLndpZGdldC5kZWZhdWx0U3RyaW5ncyA9IHtkb2pvUm9vdDpkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpLCBkb2pvV2lkZ2V0TW9kdWxlVXJpOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiKSwgYmFzZVNjcmlwdFVyaTpkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpfTsKK2Rvam8ud2lkZ2V0LmZpbGxGcm9tVGVtcGxhdGVDYWNoZSA9IGZ1bmN0aW9uIChvYmosIHRlbXBsYXRlUGF0aCwgdGVtcGxhdGVTdHJpbmcsIGF2b2lkQ2FjaGUpIHsKKwl2YXIgdHBhdGggPSB0ZW1wbGF0ZVBhdGggfHwgb2JqLnRlbXBsYXRlUGF0aDsKKwl2YXIgdG1wbHRzID0gZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGU7CisJaWYgKCF0cGF0aCAmJiAhb2JqWyJ3aWRnZXRUeXBlIl0pIHsKKwkJZG8geworCQkJdmFyIGR1bW15TmFtZSA9ICJfX2R1bW15VGVtcGxhdGVfXyIgKyBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZS5kdW1teUNvdW50Kys7CisJCX0gd2hpbGUgKHRtcGx0c1tkdW1teU5hbWVdKTsKKwkJb2JqLndpZGdldFR5cGUgPSBkdW1teU5hbWU7CisJfQorCXZhciB3dCA9IHRwYXRoID8gdHBhdGgudG9TdHJpbmcoKSA6IG9iai53aWRnZXRUeXBlOworCXZhciB0cyA9IHRtcGx0c1t3dF07CisJaWYgKCF0cykgeworCQl0bXBsdHNbd3RdID0geyJzdHJpbmciOm51bGwsICJub2RlIjpudWxsfTsKKwkJaWYgKGF2b2lkQ2FjaGUpIHsKKwkJCXRzID0ge307CisJCX0gZWxzZSB7CisJCQl0cyA9IHRtcGx0c1t3dF07CisJCX0KKwl9CisJaWYgKCghb2JqLnRlbXBsYXRlU3RyaW5nKSAmJiAoIWF2b2lkQ2FjaGUpKSB7CisJCW9iai50ZW1wbGF0ZVN0cmluZyA9IHRlbXBsYXRlU3RyaW5nIHx8IHRzWyJzdHJpbmciXTsKKwl9CisJaWYgKG9iai50ZW1wbGF0ZVN0cmluZykgeworCQlvYmoudGVtcGxhdGVTdHJpbmcgPSB0aGlzLl9zYW5pdGl6ZVRlbXBsYXRlU3RyaW5nKG9iai50ZW1wbGF0ZVN0cmluZyk7CisJfQorCWlmICgoIW9iai50ZW1wbGF0ZU5vZGUpICYmICghYXZvaWRDYWNoZSkpIHsKKwkJb2JqLnRlbXBsYXRlTm9kZSA9IHRzWyJub2RlIl07CisJfQorCWlmICgoIW9iai50ZW1wbGF0ZU5vZGUpICYmICghb2JqLnRlbXBsYXRlU3RyaW5nKSAmJiAodHBhdGgpKSB7CisJCXZhciB0c3RyaW5nID0gdGhpcy5fc2FuaXRpemVUZW1wbGF0ZVN0cmluZyhkb2pvLmhvc3RlbnYuZ2V0VGV4dCh0cGF0aCkpOworCQlvYmoudGVtcGxhdGVTdHJpbmcgPSB0c3RyaW5nOworCQlpZiAoIWF2b2lkQ2FjaGUpIHsKKwkJCXRtcGx0c1t3dF1bInN0cmluZyJdID0gdHN0cmluZzsKKwkJfQorCX0KKwlpZiAoKCF0c1sic3RyaW5nIl0pICYmICghYXZvaWRDYWNoZSkpIHsKKwkJdHMuc3RyaW5nID0gb2JqLnRlbXBsYXRlU3RyaW5nOworCX0KK307Citkb2pvLndpZGdldC5fc2FuaXRpemVUZW1wbGF0ZVN0cmluZyA9IGZ1bmN0aW9uICh0U3RyaW5nKSB7CisJaWYgKHRTdHJpbmcpIHsKKwkJdFN0cmluZyA9IHRTdHJpbmcucmVwbGFjZSgvXlxzKjxcP3htbChccykrdmVyc2lvbj1bXCdcIl0oXGQpKi4oXGQpKltcJ1wiXShccykqXD8+L2ltLCAiIik7CisJCXZhciBtYXRjaGVzID0gdFN0cmluZy5tYXRjaCgvPGJvZHlbXj5dKj5ccyooW1xzXFNdKylccyo8XC9ib2R5Pi9pbSk7CisJCWlmIChtYXRjaGVzKSB7CisJCQl0U3RyaW5nID0gbWF0Y2hlc1sxXTsKKwkJfQorCX0gZWxzZSB7CisJCXRTdHJpbmcgPSAiIjsKKwl9CisJcmV0dXJuIHRTdHJpbmc7Cit9OworZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGUuZHVtbXlDb3VudCA9IDA7Citkb2pvLndpZGdldC5hdHRhY2hQcm9wZXJ0aWVzID0gWyJkb2pvQXR0YWNoUG9pbnQiLCAiaWQiXTsKK2Rvam8ud2lkZ2V0LmV2ZW50QXR0YWNoUHJvcGVydHkgPSAiZG9qb0F0dGFjaEV2ZW50IjsKK2Rvam8ud2lkZ2V0Lm9uQnVpbGRQcm9wZXJ0eSA9ICJkb2pvT25CdWlsZCI7Citkb2pvLndpZGdldC53YWlOYW1lcyA9IFsid2FpUm9sZSIsICJ3YWlTdGF0ZSJdOworZG9qby53aWRnZXQud2FpID0ge3dhaVJvbGU6e25hbWU6IndhaVJvbGUiLCAibmFtZXNwYWNlIjoiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyIiwgYWxpYXM6IngyIiwgcHJlZml4OiJ3YWlyb2xlOiJ9LCB3YWlTdGF0ZTp7bmFtZToid2FpU3RhdGUiLCAibmFtZXNwYWNlIjoiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNy9hYWEiLCBhbGlhczoiYWFhIiwgcHJlZml4OiIifSwgc2V0QXR0cjpmdW5jdGlvbiAobm9kZSwgbnMsIGF0dHIsIHZhbHVlKSB7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUodGhpc1tuc10uYWxpYXMgKyAiOiIgKyBhdHRyLCB0aGlzW25zXS5wcmVmaXggKyB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJbm9kZS5zZXRBdHRyaWJ1dGVOUyh0aGlzW25zXVsibmFtZXNwYWNlIl0sIGF0dHIsIHRoaXNbbnNdLnByZWZpeCArIHZhbHVlKTsKKwl9Cit9LCBnZXRBdHRyOmZ1bmN0aW9uIChub2RlLCBucywgYXR0cikgeworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZSh0aGlzW25zXS5hbGlhcyArICI6IiArIGF0dHIpOworCX0gZWxzZSB7CisJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZU5TKHRoaXNbbnNdWyJuYW1lc3BhY2UiXSwgYXR0cik7CisJfQorfSwgcmVtb3ZlQXR0cjpmdW5jdGlvbiAobm9kZSwgbnMsIGF0dHIpIHsKKwl2YXIgc3VjY2VzcyA9IHRydWU7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJc3VjY2VzcyA9IG5vZGUucmVtb3ZlQXR0cmlidXRlKHRoaXNbbnNdLmFsaWFzICsgIjoiICsgYXR0cik7CisJfSBlbHNlIHsKKwkJbm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyh0aGlzW25zXVsibmFtZXNwYWNlIl0sIGF0dHIpOworCX0KKwlyZXR1cm4gc3VjY2VzczsKK319OworZG9qby53aWRnZXQuYXR0YWNoVGVtcGxhdGVOb2RlcyA9IGZ1bmN0aW9uIChyb290Tm9kZSwgdGFyZ2V0T2JqLCBldmVudHMpIHsKKwl2YXIgZWxlbWVudE5vZGVUeXBlID0gZG9qby5kb20uRUxFTUVOVF9OT0RFOworCWZ1bmN0aW9uIHRyaW0oc3RyKSB7CisJCXJldHVybiBzdHIucmVwbGFjZSgvXlxzK3xccyskL2csICIiKTsKKwl9CisJaWYgKCFyb290Tm9kZSkgeworCQlyb290Tm9kZSA9IHRhcmdldE9iai5kb21Ob2RlOworCX0KKwlpZiAocm9vdE5vZGUubm9kZVR5cGUgIT0gZWxlbWVudE5vZGVUeXBlKSB7CisJCXJldHVybjsKKwl9CisJdmFyIG5vZGVzID0gcm9vdE5vZGUuYWxsIHx8IHJvb3ROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJdmFyIF90aGlzID0gdGFyZ2V0T2JqOworCWZvciAodmFyIHggPSAtMTsgeCA8IG5vZGVzLmxlbmd0aDsgeCsrKSB7CisJCXZhciBiYXNlTm9kZSA9ICh4ID09IC0xKSA/IHJvb3ROb2RlIDogbm9kZXNbeF07CisJCXZhciBhdHRhY2hQb2ludCA9IFtdOworCQlpZiAoIXRhcmdldE9iai53aWRnZXRzSW5UZW1wbGF0ZSB8fCAhYmFzZU5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvVHlwZSIpKSB7CisJCQlmb3IgKHZhciB5ID0gMDsgeSA8IHRoaXMuYXR0YWNoUHJvcGVydGllcy5sZW5ndGg7IHkrKykgeworCQkJCXZhciB0bXBBdHRhY2hQb2ludCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZSh0aGlzLmF0dGFjaFByb3BlcnRpZXNbeV0pOworCQkJCWlmICh0bXBBdHRhY2hQb2ludCkgeworCQkJCQlhdHRhY2hQb2ludCA9IHRtcEF0dGFjaFBvaW50LnNwbGl0KCI7Iik7CisJCQkJCWZvciAodmFyIHogPSAwOyB6IDwgYXR0YWNoUG9pbnQubGVuZ3RoOyB6KyspIHsKKwkJCQkJCWlmIChkb2pvLmxhbmcuaXNBcnJheSh0YXJnZXRPYmpbYXR0YWNoUG9pbnRbel1dKSkgeworCQkJCQkJCXRhcmdldE9ialthdHRhY2hQb2ludFt6XV0ucHVzaChiYXNlTm9kZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRhcmdldE9ialthdHRhY2hQb2ludFt6XV0gPSBiYXNlTm9kZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl2YXIgYXR0YWNoRXZlbnQgPSBiYXNlTm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5ldmVudEF0dGFjaFByb3BlcnR5KTsKKwkJCWlmIChhdHRhY2hFdmVudCkgeworCQkJCXZhciBldnRzID0gYXR0YWNoRXZlbnQuc3BsaXQoIjsiKTsKKwkJCQlmb3IgKHZhciB5ID0gMDsgeSA8IGV2dHMubGVuZ3RoOyB5KyspIHsKKwkJCQkJaWYgKCghZXZ0c1t5XSkgfHwgKCFldnRzW3ldLmxlbmd0aCkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXZhciB0aGlzRnVuYyA9IG51bGw7CisJCQkJCXZhciB0ZXZ0ID0gdHJpbShldnRzW3ldKTsKKwkJCQkJaWYgKGV2dHNbeV0uaW5kZXhPZigiOiIpID49IDApIHsKKwkJCQkJCXZhciBmdW5jTmFtZUFyciA9IHRldnQuc3BsaXQoIjoiKTsKKwkJCQkJCXRldnQgPSB0cmltKGZ1bmNOYW1lQXJyWzBdKTsKKwkJCQkJCXRoaXNGdW5jID0gdHJpbShmdW5jTmFtZUFyclsxXSk7CisJCQkJCX0KKwkJCQkJaWYgKCF0aGlzRnVuYykgeworCQkJCQkJdGhpc0Z1bmMgPSB0ZXZ0OworCQkJCQl9CisJCQkJCXZhciB0ZiA9IGZ1bmN0aW9uICgpIHsKKwkJCQkJCXZhciBudGYgPSBuZXcgU3RyaW5nKHRoaXNGdW5jKTsKKwkJCQkJCXJldHVybiBmdW5jdGlvbiAoZXZ0KSB7CisJCQkJCQkJaWYgKF90aGlzW250Zl0pIHsKKwkJCQkJCQkJX3RoaXNbbnRmXShkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LCB0aGlzKSk7CisJCQkJCQkJfQorCQkJCQkJfTsKKwkJCQkJfSgpOworCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoYmFzZU5vZGUsIHRldnQsIHRmLCBmYWxzZSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQkJZm9yICh2YXIgeSA9IDA7IHkgPCBldmVudHMubGVuZ3RoOyB5KyspIHsKKwkJCQl2YXIgZXZ0VmFsID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlKGV2ZW50c1t5XSk7CisJCQkJaWYgKChldnRWYWwpICYmIChldnRWYWwubGVuZ3RoKSkgeworCQkJCQl2YXIgdGhpc0Z1bmMgPSBudWxsOworCQkJCQl2YXIgZG9tRXZ0ID0gZXZlbnRzW3ldLnN1YnN0cig0KTsKKwkJCQkJdGhpc0Z1bmMgPSB0cmltKGV2dFZhbCk7CisJCQkJCXZhciBmdW5jcyA9IFt0aGlzRnVuY107CisJCQkJCWlmICh0aGlzRnVuYy5pbmRleE9mKCI7IikgPj0gMCkgeworCQkJCQkJZnVuY3MgPSBkb2pvLmxhbmcubWFwKHRoaXNGdW5jLnNwbGl0KCI7IiksIHRyaW0pOworCQkJCQl9CisJCQkJCWZvciAodmFyIHogPSAwOyB6IDwgZnVuY3MubGVuZ3RoOyB6KyspIHsKKwkJCQkJCWlmICghZnVuY3Nbel0ubGVuZ3RoKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQl2YXIgdGYgPSBmdW5jdGlvbiAoKSB7CisJCQkJCQkJdmFyIG50ZiA9IG5ldyBTdHJpbmcoZnVuY3Nbel0pOworCQkJCQkJCXJldHVybiBmdW5jdGlvbiAoZXZ0KSB7CisJCQkJCQkJCWlmIChfdGhpc1tudGZdKSB7CisJCQkJCQkJCQlfdGhpc1tudGZdKGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudChldnQsIHRoaXMpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX07CisJCQkJCQl9KCk7CisJCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoYmFzZU5vZGUsIGRvbUV2dCwgdGYsIGZhbHNlLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl2YXIgdG1wbHRQb2ludCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZSh0aGlzLnRlbXBsYXRlUHJvcGVydHkpOworCQlpZiAodG1wbHRQb2ludCkgeworCQkJdGFyZ2V0T2JqW3RtcGx0UG9pbnRdID0gYmFzZU5vZGU7CisJCX0KKwkJZG9qby5sYW5nLmZvckVhY2goZG9qby53aWRnZXQud2FpTmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7CisJCQl2YXIgd2FpID0gZG9qby53aWRnZXQud2FpW25hbWVdOworCQkJdmFyIHZhbCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZSh3YWkubmFtZSk7CisJCQlpZiAodmFsKSB7CisJCQkJaWYgKHZhbC5pbmRleE9mKCItIikgPT0gLTEpIHsKKwkJCQkJZG9qby53aWRnZXQud2FpLnNldEF0dHIoYmFzZU5vZGUsIHdhaS5uYW1lLCAicm9sZSIsIHZhbCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFyIHN0YXRlUGFpciA9IHZhbC5zcGxpdCgiLSIpOworCQkJCQlkb2pvLndpZGdldC53YWkuc2V0QXR0cihiYXNlTm9kZSwgd2FpLm5hbWUsIHN0YXRlUGFpclswXSwgc3RhdGVQYWlyWzFdKTsKKwkJCQl9CisJCQl9CisJCX0sIHRoaXMpOworCQl2YXIgb25CdWlsZCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZSh0aGlzLm9uQnVpbGRQcm9wZXJ0eSk7CisJCWlmIChvbkJ1aWxkKSB7CisJCQlldmFsKCJ2YXIgbm9kZSA9IGJhc2VOb2RlOyB2YXIgd2lkZ2V0ID0gdGFyZ2V0T2JqOyAiICsgb25CdWlsZCk7CisJCX0KKwl9Cit9OworZG9qby53aWRnZXQuZ2V0RG9qb0V2ZW50c0Zyb21TdHIgPSBmdW5jdGlvbiAoc3RyKSB7CisJdmFyIHJlID0gLyhkb2pvT24oW2Etel0rKShccz8pKT0vZ2k7CisJdmFyIGV2dHMgPSBzdHIgPyBzdHIubWF0Y2gocmUpIHx8IFtdIDogW107CisJdmFyIHJldCA9IFtdOworCXZhciBsZW0gPSB7fTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGV2dHMubGVuZ3RoOyB4KyspIHsKKwkJaWYgKGV2dHNbeF0ubGVuZ3RoIDwgMSkgeworCQkJY29udGludWU7CisJCX0KKwkJdmFyIGNtID0gZXZ0c1t4XS5yZXBsYWNlKC9ccy8sICIiKTsKKwkJY20gPSAoY20uc2xpY2UoMCwgY20ubGVuZ3RoIC0gMSkpOworCQlpZiAoIWxlbVtjbV0pIHsKKwkJCWxlbVtjbV0gPSB0cnVlOworCQkJcmV0LnB1c2goY20pOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9OworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5Eb21XaWRnZXQiLCBkb2pvLndpZGdldC5XaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwlpZiAoKGFyZ3VtZW50cy5sZW5ndGggPiAwKSAmJiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PSAib2JqZWN0IikpIHsKKwkJdGhpcy5jcmVhdGUoYXJndW1lbnRzWzBdKTsKKwl9Cit9LCB7dGVtcGxhdGVOb2RlOm51bGwsIHRlbXBsYXRlU3RyaW5nOm51bGwsIHRlbXBsYXRlQ3NzU3RyaW5nOm51bGwsIHByZXZlbnRDbG9iYmVyOmZhbHNlLCBkb21Ob2RlOm51bGwsIGNvbnRhaW5lck5vZGU6bnVsbCwgd2lkZ2V0c0luVGVtcGxhdGU6ZmFsc2UsIGFkZENoaWxkOmZ1bmN0aW9uICh3aWRnZXQsIG92ZXJyaWRlQ29udGFpbmVyTm9kZSwgcG9zLCByZWYsIGluc2VydEluZGV4KSB7CisJaWYgKCF0aGlzLmlzQ29udGFpbmVyKSB7CisJCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LkRvbVdpZGdldC5hZGRDaGlsZCgpIGF0dGVtcHRlZCBvbiBub24tY29udGFpbmVyIHdpZGdldCIpOworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCQlpZiAoaW5zZXJ0SW5kZXggPT0gdW5kZWZpbmVkKSB7CisJCQlpbnNlcnRJbmRleCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOworCQl9CisJCXRoaXMuYWRkV2lkZ2V0QXNEaXJlY3RDaGlsZCh3aWRnZXQsIG92ZXJyaWRlQ29udGFpbmVyTm9kZSwgcG9zLCByZWYsIGluc2VydEluZGV4KTsKKwkJdGhpcy5yZWdpc3RlckNoaWxkKHdpZGdldCwgaW5zZXJ0SW5kZXgpOworCX0KKwlyZXR1cm4gd2lkZ2V0OworfSwgYWRkV2lkZ2V0QXNEaXJlY3RDaGlsZDpmdW5jdGlvbiAod2lkZ2V0LCBvdmVycmlkZUNvbnRhaW5lck5vZGUsIHBvcywgcmVmLCBpbnNlcnRJbmRleCkgeworCWlmICgoIXRoaXMuY29udGFpbmVyTm9kZSkgJiYgKCFvdmVycmlkZUNvbnRhaW5lck5vZGUpKSB7CisJCXRoaXMuY29udGFpbmVyTm9kZSA9IHRoaXMuZG9tTm9kZTsKKwl9CisJdmFyIGNuID0gKG92ZXJyaWRlQ29udGFpbmVyTm9kZSkgPyBvdmVycmlkZUNvbnRhaW5lck5vZGUgOiB0aGlzLmNvbnRhaW5lck5vZGU7CisJaWYgKCFwb3MpIHsKKwkJcG9zID0gImFmdGVyIjsKKwl9CisJaWYgKCFyZWYpIHsKKwkJaWYgKCFjbikgeworCQkJY24gPSBkb2pvLmJvZHkoKTsKKwkJfQorCQlyZWYgPSBjbi5sYXN0Q2hpbGQ7CisJfQorCWlmICghaW5zZXJ0SW5kZXgpIHsKKwkJaW5zZXJ0SW5kZXggPSAwOworCX0KKwl3aWRnZXQuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoImRvam9pbnNlcnRpb25pbmRleCIsIGluc2VydEluZGV4KTsKKwlpZiAoIXJlZikgeworCQljbi5hcHBlbmRDaGlsZCh3aWRnZXQuZG9tTm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKHBvcyA9PSAiaW5zZXJ0QXRJbmRleCIpIHsKKwkJCWRvam8uZG9tLmluc2VydEF0SW5kZXgod2lkZ2V0LmRvbU5vZGUsIHJlZi5wYXJlbnROb2RlLCBpbnNlcnRJbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHBvcyA9PSAiYWZ0ZXIiKSAmJiAocmVmID09PSBjbi5sYXN0Q2hpbGQpKSB7CisJCQkJY24uYXBwZW5kQ2hpbGQod2lkZ2V0LmRvbU5vZGUpOworCQkJfSBlbHNlIHsKKwkJCQlkb2pvLmRvbS5pbnNlcnRBdFBvc2l0aW9uKHdpZGdldC5kb21Ob2RlLCBjbiwgcG9zKTsKKwkJCX0KKwkJfQorCX0KK30sIHJlZ2lzdGVyQ2hpbGQ6ZnVuY3Rpb24gKHdpZGdldCwgaW5zZXJ0aW9uSW5kZXgpIHsKKwl3aWRnZXQuZG9qb0luc2VydGlvbkluZGV4ID0gaW5zZXJ0aW9uSW5kZXg7CisJdmFyIGlkeCA9IC0xOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5jaGlsZHJlbltpXS5kb2pvSW5zZXJ0aW9uSW5kZXggPD0gaW5zZXJ0aW9uSW5kZXgpIHsKKwkJCWlkeCA9IGk7CisJCX0KKwl9CisJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaWR4ICsgMSwgMCwgd2lkZ2V0KTsKKwl3aWRnZXQucGFyZW50ID0gdGhpczsKKwl3aWRnZXQuYWRkZWRUbyh0aGlzLCBpZHggKyAxKTsKKwlkZWxldGUgZG9qby53aWRnZXQubWFuYWdlci50b3BXaWRnZXRzW3dpZGdldC53aWRnZXRJZF07Cit9LCByZW1vdmVDaGlsZDpmdW5jdGlvbiAod2lkZ2V0KSB7CisJZG9qby5kb20ucmVtb3ZlTm9kZSh3aWRnZXQuZG9tTm9kZSk7CisJcmV0dXJuIGRvam8ud2lkZ2V0LkRvbVdpZGdldC5zdXBlcmNsYXNzLnJlbW92ZUNoaWxkLmNhbGwodGhpcywgd2lkZ2V0KTsKK30sIGdldEZyYWdOb2RlUmVmOmZ1bmN0aW9uIChmcmFnKSB7CisJaWYgKCFmcmFnKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAoIWZyYWdbdGhpcy5nZXROYW1lc3BhY2VkVHlwZSgpXSkgeworCQlkb2pvLnJhaXNlKCJFcnJvcjogbm8gZnJhZyBmb3Igd2lkZ2V0IHR5cGUgIiArIHRoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKSArICIsIGlkICIgKyB0aGlzLndpZGdldElkICsgIiAobWF5YmUgYSB3aWRnZXQgaGFzIHNldCBpdCdzIHR5cGUgaW5jb3JyZWN0bHkpIik7CisJfQorCXJldHVybiBmcmFnW3RoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKV1bIm5vZGVSZWYiXTsKK30sIHBvc3RJbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzLCBmcmFnLCBwYXJlbnRDb21wKSB7CisJdmFyIHNvdXJjZU5vZGVSZWYgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCWlmIChwYXJlbnRDb21wICYmIChwYXJlbnRDb21wLnNuYXJmQ2hpbGREb21PdXRwdXQgfHwgIXNvdXJjZU5vZGVSZWYpKSB7CisJCXBhcmVudENvbXAuYWRkV2lkZ2V0QXNEaXJlY3RDaGlsZCh0aGlzLCAiIiwgImluc2VydEF0SW5kZXgiLCAiIiwgYXJnc1siZG9qb2luc2VydGlvbmluZGV4Il0sIHNvdXJjZU5vZGVSZWYpOworCX0gZWxzZSB7CisJCWlmIChzb3VyY2VOb2RlUmVmKSB7CisJCQlpZiAodGhpcy5kb21Ob2RlICYmICh0aGlzLmRvbU5vZGUgIT09IHNvdXJjZU5vZGVSZWYpKSB7CisJCQkJdGhpcy5fc291cmNlTm9kZVJlZiA9IGRvam8uZG9tLnJlcGxhY2VOb2RlKHNvdXJjZU5vZGVSZWYsIHRoaXMuZG9tTm9kZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKHBhcmVudENvbXApIHsKKwkJcGFyZW50Q29tcC5yZWdpc3RlckNoaWxkKHRoaXMsIGFyZ3MuZG9qb2luc2VydGlvbmluZGV4KTsKKwl9IGVsc2UgeworCQlkb2pvLndpZGdldC5tYW5hZ2VyLnRvcFdpZGdldHNbdGhpcy53aWRnZXRJZF0gPSB0aGlzOworCX0KKwlpZiAodGhpcy53aWRnZXRzSW5UZW1wbGF0ZSkgeworCQl2YXIgcGFyc2VyID0gbmV3IGRvam8ueG1sLlBhcnNlKCk7CisJCXZhciBzdWJDb250YWluZXJOb2RlOworCQl2YXIgc3Vibm9kZXMgPSB0aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJub2Rlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHN1Ym5vZGVzW2ldLmdldEF0dHJpYnV0ZSgiZG9qb0F0dGFjaFBvaW50IikgPT0gInN1YkNvbnRhaW5lcldpZGdldCIpIHsKKwkJCQlzdWJDb250YWluZXJOb2RlID0gc3Vibm9kZXNbaV07CisJCQl9CisJCQlpZiAoc3Vibm9kZXNbaV0uZ2V0QXR0cmlidXRlKCJkb2pvVHlwZSIpKSB7CisJCQkJc3Vibm9kZXNbaV0uc2V0QXR0cmlidXRlKCJpc1N1YldpZGdldCIsIHRydWUpOworCQkJfQorCQl9CisJCWlmICh0aGlzLmlzQ29udGFpbmVyICYmICF0aGlzLmNvbnRhaW5lck5vZGUpIHsKKwkJCWlmIChzdWJDb250YWluZXJOb2RlKSB7CisJCQkJdmFyIHNyYyA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJCQkJaWYgKHNyYykgeworCQkJCQlkb2pvLmRvbS5tb3ZlQ2hpbGRyZW4oc3JjLCBzdWJDb250YWluZXJOb2RlKTsKKwkJCQkJZnJhZ1siZG9qb0RvbnRGb2xsb3ciXSA9IHRydWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkb2pvLmRlYnVnKCJObyBzdWJDb250YWluZXJXaWRnZXQgbm9kZSBjYW4gYmUgZm91bmQgaW4gdGVtcGxhdGUgZmlsZSBmb3Igd2lkZ2V0ICIgKyB0aGlzKTsKKwkJCX0KKwkJfQorCQl2YXIgdGVtcGxhdGVmcmFnID0gcGFyc2VyLnBhcnNlRWxlbWVudCh0aGlzLmRvbU5vZGUsIG51bGwsIHRydWUpOworCQlkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKHRlbXBsYXRlZnJhZywgdGhpcyk7CisJCXZhciBzdWJ3aWRnZXRzID0gW107CisJCXZhciBzdGFjayA9IFt0aGlzXTsKKwkJdmFyIHc7CisJCXdoaWxlICgodyA9IHN0YWNrLnBvcCgpKSkgeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB3LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIGN3aWRnZXQgPSB3LmNoaWxkcmVuW2ldOworCQkJCWlmIChjd2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzIHx8ICFjd2lkZ2V0LmV4dHJhQXJnc1siaXNzdWJ3aWRnZXQiXSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc3Vid2lkZ2V0cy5wdXNoKGN3aWRnZXQpOworCQkJCWlmIChjd2lkZ2V0LmlzQ29udGFpbmVyKSB7CisJCQkJCXN0YWNrLnB1c2goY3dpZGdldCk7CisJCQkJfQorCQkJfQorCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc3Vid2lkZ2V0cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHdpZGdldCA9IHN1YndpZGdldHNbaV07CisJCQlpZiAod2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzKSB7CisJCQkJZG9qby5kZWJ1ZygiVGhpcyBzaG91bGQgbm90IGhhcHBlbjogd2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzIGlzIGFscmVhZHkgdHJ1ZSEiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl3aWRnZXQuX3Byb2Nlc3NlZFN1YldpZGdldHMgPSB0cnVlOworCQkJaWYgKHdpZGdldC5leHRyYUFyZ3NbImRvam9hdHRhY2hldmVudCJdKSB7CisJCQkJdmFyIGV2dHMgPSB3aWRnZXQuZXh0cmFBcmdzWyJkb2pvYXR0YWNoZXZlbnQiXS5zcGxpdCgiOyIpOworCQkJCWZvciAodmFyIGogPSAwOyBqIDwgZXZ0cy5sZW5ndGg7IGorKykgeworCQkJCQl2YXIgdGhpc0Z1bmMgPSBudWxsOworCQkJCQl2YXIgdGV2dCA9IGRvam8uc3RyaW5nLnRyaW0oZXZ0c1tqXSk7CisJCQkJCWlmICh0ZXZ0LmluZGV4T2YoIjoiKSA+PSAwKSB7CisJCQkJCQl2YXIgZnVuY05hbWVBcnIgPSB0ZXZ0LnNwbGl0KCI6Iik7CisJCQkJCQl0ZXZ0ID0gZG9qby5zdHJpbmcudHJpbShmdW5jTmFtZUFyclswXSk7CisJCQkJCQl0aGlzRnVuYyA9IGRvam8uc3RyaW5nLnRyaW0oZnVuY05hbWVBcnJbMV0pOworCQkJCQl9CisJCQkJCWlmICghdGhpc0Z1bmMpIHsKKwkJCQkJCXRoaXNGdW5jID0gdGV2dDsKKwkJCQkJfQorCQkJCQlpZiAoZG9qby5sYW5nLmlzRnVuY3Rpb24od2lkZ2V0W3RldnRdKSkgeworCQkJCQkJZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajp3aWRnZXQsIHNyY0Z1bmM6dGV2dCwgdGFyZ2V0T2JqOnRoaXMsIHRhcmdldEZ1bmM6dGhpc0Z1bmN9KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWFsZXJ0KHRldnQgKyAiIGlzIG5vdCBhIGZ1bmN0aW9uIGluIHdpZGdldCAiICsgd2lkZ2V0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICh3aWRnZXQuZXh0cmFBcmdzWyJkb2pvYXR0YWNocG9pbnQiXSkgeworCQkJCXRoaXNbd2lkZ2V0LmV4dHJhQXJnc1siZG9qb2F0dGFjaHBvaW50Il1dID0gd2lkZ2V0OworCQkJfQorCQl9CisJfQorCWlmICh0aGlzLmlzQ29udGFpbmVyICYmICFmcmFnWyJkb2pvRG9udEZvbGxvdyJdKSB7CisJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZywgdGhpcyk7CisJfQorfSwgYnVpbGRSZW5kZXJpbmc6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwl2YXIgdHMgPSBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVt0aGlzLndpZGdldFR5cGVdOworCWlmIChhcmdzWyJ0ZW1wbGF0ZWNzc3BhdGgiXSkgeworCQlhcmdzWyJ0ZW1wbGF0ZUNzc1BhdGgiXSA9IGFyZ3NbInRlbXBsYXRlY3NzcGF0aCJdOworCX0KKwl2YXIgY3BhdGggPSBhcmdzWyJ0ZW1wbGF0ZUNzc1BhdGgiXSB8fCB0aGlzLnRlbXBsYXRlQ3NzUGF0aDsKKwlpZiAoY3BhdGggJiYgIWRvam8ud2lkZ2V0Ll9jc3NGaWxlc1tjcGF0aC50b1N0cmluZygpXSkgeworCQlpZiAoKCF0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nKSAmJiAoY3BhdGgpKSB7CisJCQl0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nID0gZG9qby5ob3N0ZW52LmdldFRleHQoY3BhdGgpOworCQkJdGhpcy50ZW1wbGF0ZUNzc1BhdGggPSBudWxsOworCQl9CisJCWRvam8ud2lkZ2V0Ll9jc3NGaWxlc1tjcGF0aC50b1N0cmluZygpXSA9IHRydWU7CisJfQorCWlmICgodGhpc1sidGVtcGxhdGVDc3NTdHJpbmciXSkgJiYgKCFkb2pvLndpZGdldC5fY3NzU3RyaW5nc1t0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nXSkpIHsKKwkJZG9qby5odG1sLmluc2VydENzc1RleHQodGhpcy50ZW1wbGF0ZUNzc1N0cmluZywgbnVsbCwgY3BhdGgpOworCQlkb2pvLndpZGdldC5fY3NzU3RyaW5nc1t0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nXSA9IHRydWU7CisJfQorCWlmICgoIXRoaXMucHJldmVudENsb2JiZXIpICYmICgodGhpcy50ZW1wbGF0ZVBhdGgpIHx8ICh0aGlzLnRlbXBsYXRlTm9kZSkgfHwgKCh0aGlzWyJ0ZW1wbGF0ZVN0cmluZyJdKSAmJiAodGhpcy50ZW1wbGF0ZVN0cmluZy5sZW5ndGgpKSB8fCAoKHR5cGVvZiB0cyAhPSAidW5kZWZpbmVkIikgJiYgKCh0c1sic3RyaW5nIl0pIHx8ICh0c1sibm9kZSJdKSkpKSkgeworCQl0aGlzLmJ1aWxkRnJvbVRlbXBsYXRlKGFyZ3MsIGZyYWcpOworCX0gZWxzZSB7CisJCXRoaXMuZG9tTm9kZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJfQorCXRoaXMuZmlsbEluVGVtcGxhdGUoYXJncywgZnJhZyk7Cit9LCBidWlsZEZyb21UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXZhciBhdm9pZENhY2hlID0gZmFsc2U7CisJaWYgKGFyZ3NbInRlbXBsYXRlcGF0aCJdKSB7CisJCWFyZ3NbInRlbXBsYXRlUGF0aCJdID0gYXJnc1sidGVtcGxhdGVwYXRoIl07CisJfQorCWRvam8ud2lkZ2V0LmZpbGxGcm9tVGVtcGxhdGVDYWNoZSh0aGlzLCBhcmdzWyJ0ZW1wbGF0ZVBhdGgiXSwgbnVsbCwgYXZvaWRDYWNoZSk7CisJdmFyIHRzID0gZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbdGhpcy50ZW1wbGF0ZVBhdGggPyB0aGlzLnRlbXBsYXRlUGF0aC50b1N0cmluZygpIDogdGhpcy53aWRnZXRUeXBlXTsKKwlpZiAoKHRzKSAmJiAoIWF2b2lkQ2FjaGUpKSB7CisJCWlmICghdGhpcy50ZW1wbGF0ZVN0cmluZy5sZW5ndGgpIHsKKwkJCXRoaXMudGVtcGxhdGVTdHJpbmcgPSB0c1sic3RyaW5nIl07CisJCX0KKwkJaWYgKCF0aGlzLnRlbXBsYXRlTm9kZSkgeworCQkJdGhpcy50ZW1wbGF0ZU5vZGUgPSB0c1sibm9kZSJdOworCQl9CisJfQorCXZhciBtYXRjaGVzID0gZmFsc2U7CisJdmFyIG5vZGUgPSBudWxsOworCXZhciB0c3RyID0gdGhpcy50ZW1wbGF0ZVN0cmluZzsKKwlpZiAoKCF0aGlzLnRlbXBsYXRlTm9kZSkgJiYgKHRoaXMudGVtcGxhdGVTdHJpbmcpKSB7CisJCW1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlU3RyaW5nLm1hdGNoKC9cJFx7KFteXH1dKylcfS9nKTsKKwkJaWYgKG1hdGNoZXMpIHsKKwkJCXZhciBoYXNoID0gdGhpcy5zdHJpbmdzIHx8IHt9OworCQkJZm9yICh2YXIga2V5IGluIGRvam8ud2lkZ2V0LmRlZmF1bHRTdHJpbmdzKSB7CisJCQkJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChoYXNoW2tleV0pKSB7CisJCQkJCWhhc2hba2V5XSA9IGRvam8ud2lkZ2V0LmRlZmF1bHRTdHJpbmdzW2tleV07CisJCQkJfQorCQkJfQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIGtleSA9IG1hdGNoZXNbaV07CisJCQkJa2V5ID0ga2V5LnN1YnN0cmluZygyLCBrZXkubGVuZ3RoIC0gMSk7CisJCQkJdmFyIGt2YWwgPSAoa2V5LnN1YnN0cmluZygwLCA1KSA9PSAidGhpcy4iKSA/IGRvam8ubGFuZy5nZXRPYmpQYXRoVmFsdWUoa2V5LnN1YnN0cmluZyg1KSwgdGhpcykgOiBoYXNoW2tleV07CisJCQkJdmFyIHZhbHVlOworCQkJCWlmICgoa3ZhbCkgfHwgKGRvam8ubGFuZy5pc1N0cmluZyhrdmFsKSkpIHsKKwkJCQkJdmFsdWUgPSBuZXcgU3RyaW5nKChkb2pvLmxhbmcuaXNGdW5jdGlvbihrdmFsKSkgPyBrdmFsLmNhbGwodGhpcywga2V5LCB0aGlzLnRlbXBsYXRlU3RyaW5nKSA6IGt2YWwpOworCQkJCQl3aGlsZSAodmFsdWUuaW5kZXhPZigiXCIiKSA+IC0xKSB7CisJCQkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIlwiIiwgIiZxdW90OyIpOworCQkJCQl9CisJCQkJCXRzdHIgPSB0c3RyLnJlcGxhY2UobWF0Y2hlc1tpXSwgdmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMudGVtcGxhdGVOb2RlID0gdGhpcy5jcmVhdGVOb2Rlc0Zyb21UZXh0KHRoaXMudGVtcGxhdGVTdHJpbmcsIHRydWUpWzBdOworCQkJaWYgKCFhdm9pZENhY2hlKSB7CisJCQkJdHMubm9kZSA9IHRoaXMudGVtcGxhdGVOb2RlOworCQkJfQorCQl9CisJfQorCWlmICgoIXRoaXMudGVtcGxhdGVOb2RlKSAmJiAoIW1hdGNoZXMpKSB7CisJCWRvam8uZGVidWcoIkRvbVdpZGdldC5idWlsZEZyb21UZW1wbGF0ZTogY291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSIpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKCFtYXRjaGVzKSB7CisJCQlub2RlID0gdGhpcy50ZW1wbGF0ZU5vZGUuY2xvbmVOb2RlKHRydWUpOworCQkJaWYgKCFub2RlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJbm9kZSA9IHRoaXMuY3JlYXRlTm9kZXNGcm9tVGV4dCh0c3RyLCB0cnVlKVswXTsKKwkJfQorCX0KKwl0aGlzLmRvbU5vZGUgPSBub2RlOworCXRoaXMuYXR0YWNoVGVtcGxhdGVOb2RlcygpOworCWlmICh0aGlzLmlzQ29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyTm9kZSkgeworCQl2YXIgc3JjID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwkJaWYgKHNyYykgeworCQkJZG9qby5kb20ubW92ZUNoaWxkcmVuKHNyYywgdGhpcy5jb250YWluZXJOb2RlKTsKKwkJfQorCX0KK30sIGF0dGFjaFRlbXBsYXRlTm9kZXM6ZnVuY3Rpb24gKGJhc2VOb2RlLCB0YXJnZXRPYmopIHsKKwlpZiAoIWJhc2VOb2RlKSB7CisJCWJhc2VOb2RlID0gdGhpcy5kb21Ob2RlOworCX0KKwlpZiAoIXRhcmdldE9iaikgeworCQl0YXJnZXRPYmogPSB0aGlzOworCX0KKwlyZXR1cm4gZG9qby53aWRnZXQuYXR0YWNoVGVtcGxhdGVOb2RlcyhiYXNlTm9kZSwgdGFyZ2V0T2JqLCBkb2pvLndpZGdldC5nZXREb2pvRXZlbnRzRnJvbVN0cih0aGlzLnRlbXBsYXRlU3RyaW5nKSk7Cit9LCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7Cit9LCBkZXN0cm95UmVuZGVyaW5nOmZ1bmN0aW9uICgpIHsKKwl0cnkgeworCQlkb2pvLmRvbS5kZXN0cm95Tm9kZSh0aGlzLmRvbU5vZGUpOworCQlkZWxldGUgdGhpcy5kb21Ob2RlOworCX0KKwljYXRjaCAoZSkgeworCX0KKwlpZiAodGhpcy5fc291cmNlTm9kZVJlZikgeworCQl0cnkgeworCQkJZG9qby5kb20uZGVzdHJveU5vZGUodGhpcy5fc291cmNlTm9kZVJlZik7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCX0KK30sIGNyZWF0ZU5vZGVzRnJvbVRleHQ6ZnVuY3Rpb24gKCkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuRG9tV2lkZ2V0LmNyZWF0ZU5vZGVzRnJvbVRleHQiKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ecm9wZG93bkNvbnRhaW5lci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRHJvcGRvd25Db250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0NzU0NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRHJvcGRvd25Db250YWluZXIuanMKQEAgLTAsMCArMSw2NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5kaXNwbGF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5pZnJhbWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnV0aWwiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7aW5wdXRXaWR0aDoiN2VtIiwgaWQ6IiIsIGlucHV0SWQ6IiIsIGlucHV0TmFtZToiIiwgaWNvblVSTDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvY29tYm9fYm94X2Fycm93LnBuZyIpLCBjb3B5Q2xhc3NlczpmYWxzZSwgaWNvbkFsdDoiIiwgY29udGFpbmVyVG9nZ2xlOiJwbGFpbiIsIGNvbnRhaW5lclRvZ2dsZUR1cmF0aW9uOjE1MCwgdGVtcGxhdGVTdHJpbmc6IjxzcGFuIHN0eWxlPVwid2hpdGUtc3BhY2U6bm93cmFwXCI+PGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiXCIgdmFsdWU9XCJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJ2YWx1ZU5vZGVcIiAvPjxpbnB1dCBuYW1lPVwiXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiIHN0eWxlPVwidmVydGljYWwtYWxpZ246bWlkZGxlO1wiIGRvam9BdHRhY2hQb2ludD1cImlucHV0Tm9kZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+IDxpbWcgc3JjPVwiJHt0aGlzLmljb25VUkx9XCIgYWx0PVwiJHt0aGlzLmljb25BbHR9XCIgZG9qb0F0dGFjaEV2ZW50PVwib25jbGljazpvbkljb25DbGlja1wiIGRvam9BdHRhY2hQb2ludD1cImJ1dHRvbk5vZGVcIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOm1pZGRsZTsgY3Vyc29yOnBvaW50ZXI7IGN1cnNvcjpoYW5kXCIgLz48L3NwYW4+IiwgdGVtcGxhdGVDc3NQYXRoOiIiLCBpc0NvbnRhaW5lcjp0cnVlLCBhdHRhY2hUZW1wbGF0ZU5vZGVzOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lci5zdXBlcmNsYXNzLmF0dGFjaFRlbXBsYXRlTm9kZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLnBvcHVwID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJQb3B1cENvbnRhaW5lciIsIHt0b2dnbGU6dGhpcy5jb250YWluZXJUb2dnbGUsIHRvZ2dsZUR1cmF0aW9uOnRoaXMuY29udGFpbmVyVG9nZ2xlRHVyYXRpb259KTsKKwl0aGlzLmNvbnRhaW5lck5vZGUgPSB0aGlzLnBvcHVwLmRvbU5vZGU7Cit9LCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwLmRvbU5vZGUpOworCWlmICh0aGlzLmlkKSB7CisJCXRoaXMuZG9tTm9kZS5pZCA9IHRoaXMuaWQ7CisJfQorCWlmICh0aGlzLmlucHV0SWQpIHsKKwkJdGhpcy5pbnB1dE5vZGUuaWQgPSB0aGlzLmlucHV0SWQ7CisJfQorCWlmICh0aGlzLmlucHV0TmFtZSkgeworCQl0aGlzLmlucHV0Tm9kZS5uYW1lID0gdGhpcy5pbnB1dE5hbWU7CisJfQorCXRoaXMuaW5wdXROb2RlLnN0eWxlLndpZHRoID0gdGhpcy5pbnB1dFdpZHRoOworCXRoaXMuaW5wdXROb2RlLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDsKKwlpZiAodGhpcy5jb3B5Q2xhc3NlcykgeworCQl0aGlzLmlucHV0Tm9kZS5zdHlsZSA9ICIiOworCQl0aGlzLmlucHV0Tm9kZS5jbGFzc05hbWUgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpLmNsYXNzTmFtZTsKKwl9CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuaW5wdXROb2RlLCAib25jaGFuZ2UiLCB0aGlzLCAib25JbnB1dENoYW5nZSIpOworfSwgb25JY29uQ2xpY2s6ZnVuY3Rpb24gKGV2dCkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCF0aGlzLnBvcHVwLmlzU2hvd2luZ05vdykgeworCQl0aGlzLnBvcHVwLm9wZW4odGhpcy5pbnB1dE5vZGUsIHRoaXMsIHRoaXMuYnV0dG9uTm9kZSk7CisJfSBlbHNlIHsKKwkJdGhpcy5wb3B1cC5jbG9zZSgpOworCX0KK30sIGhpZGVDb250YWluZXI6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLnBvcHVwLmlzU2hvd2luZ05vdykgeworCQl0aGlzLnBvcHVwLmNsb3NlKCk7CisJfQorfSwgb25JbnB1dENoYW5nZTpmdW5jdGlvbiAoKSB7Cit9LCBlbmFibGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuaW5wdXROb2RlLmRpc2FibGVkID0gZmFsc2U7CisJZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIuc3VwZXJjbGFzcy5lbmFibGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGRpc2FibGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuaW5wdXROb2RlLmRpc2FibGVkID0gdHJ1ZTsKKwlkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lci5zdXBlcmNsYXNzLmRpc2FibGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ecm9wZG93bkRhdGVQaWNrZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Ryb3Bkb3duRGF0ZVBpY2tlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ1MWU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ecm9wZG93bkRhdGVQaWNrZXIuanMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkRhdGVQaWNrZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5mb3JtYXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLnNlcmlhbGl6ZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pMThuLmNvbW1vbiIpOworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uKCJkb2pvLndpZGdldCIsICJEcm9wZG93bkRhdGVQaWNrZXIiLCBudWxsLCAiUk9PVCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIiLCBkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lciwge2ljb25VUkw6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2RhdGVJY29uLmdpZiIpLCBmb3JtYXRMZW5ndGg6InNob3J0IiwgZGlzcGxheUZvcm1hdDoiIiwgc2F2ZUZvcm1hdDoiIiwgdmFsdWU6IiIsIG5hbWU6IiIsIGRpc3BsYXlXZWVrczo2LCBhZGp1c3RXZWVrczpmYWxzZSwgc3RhcnREYXRlOiIxNDkyLTEwLTEyIiwgZW5kRGF0ZToiMjk0MS0xMC0xMiIsIHdlZWtTdGFydHNPbjoiIiwgc3RhdGljRGlzcGxheTpmYWxzZSwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCXZhciBtZXNzYWdlcyA9IGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oImRvam8ud2lkZ2V0IiwgIkRyb3Bkb3duRGF0ZVBpY2tlciIsIHRoaXMubGFuZyk7CisJdGhpcy5pY29uQWx0ID0gbWVzc2FnZXMuc2VsZWN0RGF0ZTsKKwlpZiAodHlwZW9mICh0aGlzLnZhbHVlKSA9PSAic3RyaW5nIiAmJiB0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gInRvZGF5IikgeworCQl0aGlzLnZhbHVlID0gbmV3IERhdGUoKTsKKwl9CisJaWYgKHRoaXMudmFsdWUgJiYgaXNOYU4odGhpcy52YWx1ZSkpIHsKKwkJdmFyIG9yaWcgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KHRoaXMudmFsdWUpOworCQlpZiAoIXRoaXMudmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSBuZXcgRGF0ZShvcmlnKTsKKwkJCWRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIiwgImRhdGUgYXR0cmlidXRlcyBtdXN0IGJlIHBhc3NlZCBpbiBSZmMzMzM5IGZvcm1hdCIsICIwLjUiKTsKKwkJfQorCX0KKwlpZiAodGhpcy52YWx1ZSAmJiAhaXNOYU4odGhpcy52YWx1ZSkpIHsKKwkJdGhpcy52YWx1ZSA9IG5ldyBEYXRlKHRoaXMudmFsdWUpOworCX0KK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuY2FsbCh0aGlzLCBhcmdzLCBmcmFnKTsKKwl2YXIgZHBBcmdzID0ge3dpZGdldENvbnRhaW5lcklkOnRoaXMud2lkZ2V0SWQsIGxhbmc6dGhpcy5sYW5nLCB2YWx1ZTp0aGlzLnZhbHVlLCBzdGFydERhdGU6dGhpcy5zdGFydERhdGUsIGVuZERhdGU6dGhpcy5lbmREYXRlLCBkaXNwbGF5V2Vla3M6dGhpcy5kaXNwbGF5V2Vla3MsIHdlZWtTdGFydHNPbjp0aGlzLndlZWtTdGFydHNPbiwgYWRqdXN0V2Vla3M6dGhpcy5hZGp1c3RXZWVrcywgc3RhdGljRGlzcGxheTp0aGlzLnN0YXRpY0Rpc3BsYXl9OworCXRoaXMuZGF0ZVBpY2tlciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRGF0ZVBpY2tlciIsIGRwQXJncywgdGhpcy5jb250YWluZXJOb2RlLCAiY2hpbGQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5kYXRlUGlja2VyLCAib25WYWx1ZUNoYW5nZWQiLCB0aGlzLCAiX3VwZGF0ZVRleHQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5pbnB1dE5vZGUsICJvbkNoYW5nZSIsIHRoaXMsICJfdXBkYXRlVGV4dCIpOworCWlmICh0aGlzLnZhbHVlKSB7CisJCXRoaXMuX3VwZGF0ZVRleHQoKTsKKwl9CisJdGhpcy5jb250YWluZXJOb2RlLmV4cGxvZGVDbGFzc05hbWUgPSAiY2FsZW5kYXJCb2R5Q29udGFpbmVyIjsKKwl0aGlzLnZhbHVlTm9kZS5uYW1lID0gdGhpcy5uYW1lOworfSwgZ2V0VmFsdWU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnZhbHVlTm9kZS52YWx1ZTsKK30sIGdldERhdGU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmRhdGVQaWNrZXIudmFsdWU7Cit9LCBzZXRWYWx1ZTpmdW5jdGlvbiAocmZjRGF0ZSkgeworCXRoaXMuc2V0RGF0ZShyZmNEYXRlKTsKK30sIHNldERhdGU6ZnVuY3Rpb24gKGRhdGVPYmopIHsKKwl0aGlzLmRhdGVQaWNrZXIuc2V0RGF0ZShkYXRlT2JqKTsKKwl0aGlzLl9zeW5jVmFsdWVOb2RlKCk7Cit9LCBfdXBkYXRlVGV4dDpmdW5jdGlvbiAoKSB7CisJdGhpcy5pbnB1dE5vZGUudmFsdWUgPSB0aGlzLmRhdGVQaWNrZXIudmFsdWUgPyBkb2pvLmRhdGUuZm9ybWF0KHRoaXMuZGF0ZVBpY2tlci52YWx1ZSwge2Zvcm1hdExlbmd0aDp0aGlzLmZvcm1hdExlbmd0aCwgZGF0ZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0LCBzZWxlY3RvcjoiZGF0ZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSkgOiAiIjsKKwlpZiAodGhpcy52YWx1ZSA8IHRoaXMuZGF0ZVBpY2tlci5zdGFydERhdGUgfHwgdGhpcy52YWx1ZSA+IHRoaXMuZGF0ZVBpY2tlci5lbmREYXRlKSB7CisJCXRoaXMuaW5wdXROb2RlLnZhbHVlID0gIiI7CisJfQorCXRoaXMuX3N5bmNWYWx1ZU5vZGUoKTsKKwl0aGlzLm9uVmFsdWVDaGFuZ2VkKHRoaXMuZ2V0RGF0ZSgpKTsKKwl0aGlzLmhpZGVDb250YWluZXIoKTsKK30sIG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uIChkYXRlT2JqKSB7Cit9LCBvbklucHV0Q2hhbmdlOmZ1bmN0aW9uICgpIHsKKwl2YXIgaW5wdXQgPSBkb2pvLnN0cmluZy50cmltKHRoaXMuaW5wdXROb2RlLnZhbHVlKTsKKwlpZiAoaW5wdXQpIHsKKwkJdmFyIGlucHV0RGF0ZSA9IGRvam8uZGF0ZS5wYXJzZShpbnB1dCwge2Zvcm1hdExlbmd0aDp0aGlzLmZvcm1hdExlbmd0aCwgZGF0ZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0LCBzZWxlY3RvcjoiZGF0ZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisJCWlmICghdGhpcy5kYXRlUGlja2VyLl9pc0Rpc2FibGVkRGF0ZShpbnB1dERhdGUpKSB7CisJCQl0aGlzLnNldERhdGUoaW5wdXREYXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbnB1dCA9PSAiIikgeworCQkJdGhpcy5kYXRlUGlja2VyLnNldERhdGUoIiIpOworCQl9CisJCXRoaXMudmFsdWVOb2RlLnZhbHVlID0gaW5wdXQ7CisJfQorCWlmIChpbnB1dCkgeworCQl0aGlzLl91cGRhdGVUZXh0KCk7CisJfQorfSwgX3N5bmNWYWx1ZU5vZGU6ZnVuY3Rpb24gKCkgeworCXZhciBkYXRlID0gdGhpcy5kYXRlUGlja2VyLnZhbHVlOworCXZhciB2YWx1ZSA9ICIiOworCXN3aXRjaCAodGhpcy5zYXZlRm9ybWF0LnRvTG93ZXJDYXNlKCkpIHsKKwkgIGNhc2UgInJmYyI6CisJICBjYXNlICJpc28iOgorCSAgY2FzZSAiIjoKKwkJdmFsdWUgPSBkb2pvLmRhdGUudG9SZmMzMzM5KGRhdGUsICJkYXRlT25seSIpOworCQlicmVhazsKKwkgIGNhc2UgInBvc2l4IjoKKwkgIGNhc2UgInVuaXgiOgorCQl2YWx1ZSA9IE51bWJlcihkYXRlKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlpZiAoZGF0ZSkgeworCQkJdmFsdWUgPSBkb2pvLmRhdGUuZm9ybWF0KGRhdGUsIHtkYXRlUGF0dGVybjp0aGlzLnNhdmVGb3JtYXQsIHNlbGVjdG9yOiJkYXRlT25seSIsIGxvY2FsZTp0aGlzLmxhbmd9KTsKKwkJfQorCX0KKwl0aGlzLnZhbHVlTm9kZS52YWx1ZSA9IHZhbHVlOworfSwgZGVzdHJveTpmdW5jdGlvbiAoZmluYWxpemUpIHsKKwl0aGlzLmRhdGVQaWNrZXIuZGVzdHJveShmaW5hbGl6ZSk7CisJZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Ryb3Bkb3duVGltZVBpY2tlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRHJvcGRvd25UaW1lUGlja2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDFjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Ryb3Bkb3duVGltZVBpY2tlci5qcwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVGltZVBpY2tlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLmZvcm1hdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGUuc2VyaWFsaXplIik7Citkb2pvLnJlcXVpcmUoImRvam8uaTE4bi5jb21tb24iKTsKK2Rvam8ucmVxdWlyZUxvY2FsaXphdGlvbigiZG9qby53aWRnZXQiLCAiRHJvcGRvd25UaW1lUGlja2VyIiwgbnVsbCwgIlJPT1QiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIiwgZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIsIHtpY29uVVJMOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy90aW1lSWNvbi5naWYiKSwgZm9ybWF0TGVuZ3RoOiJzaG9ydCIsIGRpc3BsYXlGb3JtYXQ6IiIsIHRpbWVGb3JtYXQ6IiIsIHNhdmVGb3JtYXQ6IiIsIHZhbHVlOiIiLCBuYW1lOiIiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdmFyIG1lc3NhZ2VzID0gZG9qby5pMThuLmdldExvY2FsaXphdGlvbigiZG9qby53aWRnZXQiLCAiRHJvcGRvd25UaW1lUGlja2VyIiwgdGhpcy5sYW5nKTsKKwl0aGlzLmljb25BbHQgPSBtZXNzYWdlcy5zZWxlY3RUaW1lOworCWlmICh0eXBlb2YgKHRoaXMudmFsdWUpID09ICJzdHJpbmciICYmIHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKSA9PSAidG9kYXkiKSB7CisJCXRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpOworCX0KKwlpZiAodGhpcy52YWx1ZSAmJiBpc05hTih0aGlzLnZhbHVlKSkgeworCQl2YXIgb3JpZyA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy52YWx1ZSk7CisJCWlmICghdGhpcy52YWx1ZSkgeworCQkJdmFyIGQgPSBkb2pvLmRhdGUuZm9ybWF0KG5ldyBEYXRlKCksIHtzZWxlY3RvcjoiZGF0ZU9ubHkiLCBkYXRlUGF0dGVybjoieXl5eS1NTS1kZCJ9KTsKKwkJCXZhciBjID0gb3JpZy5zcGxpdCgiOiIpOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjLmxlbmd0aDsgKytpKSB7CisJCQkJaWYgKGNbaV0ubGVuZ3RoID09IDEpIHsKKwkJCQkJY1tpXSA9ICIwIiArIGNbaV07CisJCQkJfQorCQkJfQorCQkJb3JpZyA9IGMuam9pbigiOiIpOworCQkJdGhpcy52YWx1ZSA9IGRvam8uZGF0ZS5mcm9tUmZjMzMzOShkICsgIlQiICsgb3JpZyk7CisJCQlkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsICJ0aW1lIGF0dHJpYnV0ZXMgbXVzdCBiZSBwYXNzZWQgaW4gUmZjMzMzOSBmb3JtYXQiLCAiMC41Iik7CisJCX0KKwl9CisJaWYgKHRoaXMudmFsdWUgJiYgIWlzTmFOKHRoaXMudmFsdWUpKSB7CisJCXRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTsKKwl9Cit9LCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl2YXIgdmFsdWUgPSAiIjsKKwlpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKwkJdmFsdWUgPSB0aGlzLnZhbHVlOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnZhbHVlKSB7CisJCQl2YXIgb3JpZyA9IHRoaXMudmFsdWU7CisJCQl2YXIgZCA9IGRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoKSwge3NlbGVjdG9yOiJkYXRlT25seSIsIGRhdGVQYXR0ZXJuOiJ5eXl5LU1NLWRkIn0pOworCQkJdmFyIGMgPSBvcmlnLnNwbGl0KCI6Iik7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyArK2kpIHsKKwkJCQlpZiAoY1tpXS5sZW5ndGggPT0gMSkgeworCQkJCQljW2ldID0gIjAiICsgY1tpXTsKKwkJCQl9CisJCQl9CisJCQlvcmlnID0gYy5qb2luKCI6Iik7CisJCQl2YWx1ZSA9IGRvam8uZGF0ZS5mcm9tUmZjMzMzOShkICsgIlQiICsgb3JpZyk7CisJCX0KKwl9CisJdmFyIHRwQXJncyA9IHt3aWRnZXRDb250YWluZXJJZDp0aGlzLndpZGdldElkLCBsYW5nOnRoaXMubGFuZywgdmFsdWU6dmFsdWV9OworCXRoaXMudGltZVBpY2tlciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVGltZVBpY2tlciIsIHRwQXJncywgdGhpcy5jb250YWluZXJOb2RlLCAiY2hpbGQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy50aW1lUGlja2VyLCAib25WYWx1ZUNoYW5nZWQiLCB0aGlzLCAiX3VwZGF0ZVRleHQiKTsKKwlpZiAodGhpcy52YWx1ZSkgeworCQl0aGlzLl91cGRhdGVUZXh0KCk7CisJfQorCXRoaXMuY29udGFpbmVyTm9kZS5zdHlsZS56SW5kZXggPSB0aGlzLnpJbmRleDsKKwl0aGlzLmNvbnRhaW5lck5vZGUuZXhwbG9kZUNsYXNzTmFtZSA9ICJ0aW1lQ29udGFpbmVyIjsKKwl0aGlzLnZhbHVlTm9kZS5uYW1lID0gdGhpcy5uYW1lOworfSwgZ2V0VmFsdWU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnZhbHVlTm9kZS52YWx1ZTsKK30sIGdldFRpbWU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnRpbWVQaWNrZXIuc3RvcmVkVGltZTsKK30sIHNldFZhbHVlOmZ1bmN0aW9uIChyZmNEYXRlKSB7CisJdGhpcy5zZXRUaW1lKHJmY0RhdGUpOworfSwgc2V0VGltZTpmdW5jdGlvbiAoZGF0ZU9iaikgeworCXZhciB2YWx1ZSA9ICIiOworCWlmIChkYXRlT2JqIGluc3RhbmNlb2YgRGF0ZSkgeworCQl2YWx1ZSA9IGRhdGVPYmo7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMudmFsdWUpIHsKKwkJCXZhciBvcmlnID0gdGhpcy52YWx1ZTsKKwkJCXZhciBkID0gZG9qby5kYXRlLmZvcm1hdChuZXcgRGF0ZSgpLCB7c2VsZWN0b3I6ImRhdGVPbmx5IiwgZGF0ZVBhdHRlcm46Inl5eXktTU0tZGQifSk7CisJCQl2YXIgYyA9IG9yaWcuc3BsaXQoIjoiKTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7ICsraSkgeworCQkJCWlmIChjW2ldLmxlbmd0aCA9PSAxKSB7CisJCQkJCWNbaV0gPSAiMCIgKyBjW2ldOworCQkJCX0KKwkJCX0KKwkJCW9yaWcgPSBjLmpvaW4oIjoiKTsKKwkJCXZhbHVlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KGQgKyAiVCIgKyBvcmlnKTsKKwkJfQorCX0KKwl0aGlzLnRpbWVQaWNrZXIuc2V0VGltZSh2YWx1ZSk7CisJdGhpcy5fc3luY1ZhbHVlTm9kZSgpOworfSwgX3VwZGF0ZVRleHQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRUaW1lLmFueVRpbWUpIHsKKwkJdGhpcy5pbnB1dE5vZGUudmFsdWUgPSAiIjsKKwl9IGVsc2UgeworCQlpZiAodGhpcy50aW1lRm9ybWF0KSB7CisJCQlkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsICJNdXN0IHVzZSBkaXNwbGF5Rm9ybWF0IGF0dHJpYnV0ZSBpbnN0ZWFkIG9mIHRpbWVGb3JtYXQuICBTZWUgZG9qby5kYXRlLmZvcm1hdCBmb3Igc3BlY2lmaWNhdGlvbi4iLCAiMC41Iik7CisJCQl0aGlzLmlucHV0Tm9kZS52YWx1ZSA9IGRvam8uZGF0ZS5zdHJmdGltZSh0aGlzLnRpbWVQaWNrZXIudGltZSwgdGhpcy50aW1lRm9ybWF0LCB0aGlzLmxhbmcpOworCQl9IGVsc2UgeworCQkJdGhpcy5pbnB1dE5vZGUudmFsdWUgPSBkb2pvLmRhdGUuZm9ybWF0KHRoaXMudGltZVBpY2tlci50aW1lLCB7Zm9ybWF0TGVuZ3RoOnRoaXMuZm9ybWF0TGVuZ3RoLCB0aW1lUGF0dGVybjp0aGlzLmRpc3BsYXlGb3JtYXQsIHNlbGVjdG9yOiJ0aW1lT25seSIsIGxvY2FsZTp0aGlzLmxhbmd9KTsKKwkJfQorCX0KKwl0aGlzLl9zeW5jVmFsdWVOb2RlKCk7CisJdGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLmdldFRpbWUoKSk7CisJdGhpcy5oaWRlQ29udGFpbmVyKCk7Cit9LCBvblZhbHVlQ2hhbmdlZDpmdW5jdGlvbiAoZGF0ZU9iaikgeworfSwgb25JbnB1dENoYW5nZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZGF0ZUZvcm1hdCkgeworCQlkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsICJDYW5ub3QgcGFyc2UgdXNlciBpbnB1dC4gIE11c3QgdXNlIGRpc3BsYXlGb3JtYXQgYXR0cmlidXRlIGluc3RlYWQgb2YgZGF0ZUZvcm1hdC4gIFNlZSBkb2pvLmRhdGUuZm9ybWF0IGZvciBzcGVjaWZpY2F0aW9uLiIsICIwLjUiKTsKKwl9IGVsc2UgeworCQl2YXIgaW5wdXQgPSBkb2pvLnN0cmluZy50cmltKHRoaXMuaW5wdXROb2RlLnZhbHVlKTsKKwkJaWYgKGlucHV0KSB7CisJCQl2YXIgaW5wdXRUaW1lID0gZG9qby5kYXRlLnBhcnNlKGlucHV0LCB7Zm9ybWF0TGVuZ3RoOnRoaXMuZm9ybWF0TGVuZ3RoLCB0aW1lUGF0dGVybjp0aGlzLmRpc3BsYXlGb3JtYXQsIHNlbGVjdG9yOiJ0aW1lT25seSIsIGxvY2FsZTp0aGlzLmxhbmd9KTsKKwkJCWlmIChpbnB1dFRpbWUpIHsKKwkJCQl0aGlzLnNldFRpbWUoaW5wdXRUaW1lKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMudmFsdWVOb2RlLnZhbHVlID0gaW5wdXQ7CisJCX0KKwl9CisJaWYgKGlucHV0KSB7CisJCXRoaXMuX3VwZGF0ZVRleHQoKTsKKwl9Cit9LCBfc3luY1ZhbHVlTm9kZTpmdW5jdGlvbiAoKSB7CisJdmFyIHRpbWUgPSB0aGlzLnRpbWVQaWNrZXIudGltZTsKKwl2YXIgdmFsdWU7CisJc3dpdGNoICh0aGlzLnNhdmVGb3JtYXQudG9Mb3dlckNhc2UoKSkgeworCSAgY2FzZSAicmZjIjoKKwkgIGNhc2UgImlzbyI6CisJICBjYXNlICIiOgorCQl2YWx1ZSA9IGRvam8uZGF0ZS50b1JmYzMzMzkodGltZSwgInRpbWVPbmx5Iik7CisJCWJyZWFrOworCSAgY2FzZSAicG9zaXgiOgorCSAgY2FzZSAidW5peCI6CisJCXZhbHVlID0gTnVtYmVyKHRpbWUpOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXZhbHVlID0gZG9qby5kYXRlLmZvcm1hdCh0aW1lLCB7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LCBzZWxlY3RvcjoidGltZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisJfQorCXRoaXMudmFsdWVOb2RlLnZhbHVlID0gdmFsdWU7Cit9LCBkZXN0cm95OmZ1bmN0aW9uIChmaW5hbGl6ZSkgeworCXRoaXMudGltZVBpY2tlci5kZXN0cm95KGZpbmFsaXplKTsKKwlkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2MjBlYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yLmpzCkBAIC0wLDAgKzEsMzkwIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IiKTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRWRpdG9yIiwgImlzIHJlcGxhY2VkIGJ5IGRvam8ud2lkZ2V0LkVkaXRvcjIiLCAiMC41Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRvb2xiYXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUmljaFRleHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29sb3JQYWxldHRlIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nLmV4dHJhcyIpOworZG9qby53aWRnZXQudGFncy5hZGRQYXJzZVRyZWVIYW5kbGVyKCJkb2pvOkVkaXRvciIpOworZG9qby53aWRnZXQuRWRpdG9yID0gZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQuY2FsbCh0aGlzKTsKKwl0aGlzLmNvbnRlbnRGaWx0ZXJzID0gW107CisJdGhpcy5fdG9vbGJhcnMgPSBbXTsKK307Citkb2pvLmluaGVyaXRzKGRvam8ud2lkZ2V0LkVkaXRvciwgZG9qby53aWRnZXQuSHRtbFdpZGdldCk7Citkb2pvLndpZGdldC5FZGl0b3IuaXRlbUdyb3VwcyA9IHt0ZXh0R3JvdXA6WyJib2xkIiwgIml0YWxpYyIsICJ1bmRlcmxpbmUiLCAic3RyaWtldGhyb3VnaCJdLCBibG9ja0dyb3VwOlsiZm9ybWF0QmxvY2siLCAiZm9udE5hbWUiLCAiZm9udFNpemUiXSwganVzdGlmeUdyb3VwOlsianVzdGlmeWxlZnQiLCAianVzdGlmeWNlbnRlciIsICJqdXN0aWZ5cmlnaHQiXSwgY29tbWFuZEdyb3VwOlsic2F2ZSIsICJjYW5jZWwiXSwgY29sb3JHcm91cDpbImZvcmVjb2xvciIsICJoaWxpdGVjb2xvciJdLCBsaXN0R3JvdXA6WyJpbnNlcnRvcmRlcmVkbGlzdCIsICJpbnNlcnR1bm9yZGVyZWRsaXN0Il0sIGluZGVudEdyb3VwOlsib3V0ZGVudCIsICJpbmRlbnQiXSwgbGlua0dyb3VwOlsiY3JlYXRlbGluayIsICJpbnNlcnRpbWFnZSIsICJpbnNlcnRob3Jpem9udGFscnVsZSJdfTsKK2Rvam8ud2lkZ2V0LkVkaXRvci5mb3JtYXRCbG9ja1ZhbHVlcyA9IHsiTm9ybWFsIjoicCIsICJNYWluIGhlYWRpbmciOiJoMiIsICJTdWIgaGVhZGluZyI6ImgzIiwgIlN1YiBzdWIgaGVhZGluZyI6Img0IiwgIlByZWZvcm1hdHRlZCI6InByZSJ9OworZG9qby53aWRnZXQuRWRpdG9yLmZvbnROYW1lVmFsdWVzID0geyJBcmlhbCI6IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiLCAiVmVyZGFuYSI6IlZlcmRhbmEsIHNhbnMtc2VyaWYiLCAiVGltZXMgTmV3IFJvbWFuIjoiVGltZXMgTmV3IFJvbWFuLCBzZXJpZiIsICJDb3VyaWVyIjoiQ291cmllciBOZXcsIG1vbm9zcGFjZSJ9OworZG9qby53aWRnZXQuRWRpdG9yLmZvbnRTaXplVmFsdWVzID0geyIxICg4IHB0KSI6IjEiLCAiMiAoMTAgcHQpIjoiMiIsICIzICgxMiBwdCkiOiIzIiwgIjQgKDE0IHB0KSI6IjQiLCAiNSAoMTggcHQpIjoiNSIsICI2ICgyNCBwdCkiOiI2IiwgIjcgKDM2IHB0KSI6IjcifTsKK2Rvam8ud2lkZ2V0LkVkaXRvci5kZWZhdWx0SXRlbXMgPSBbImNvbW1hbmRHcm91cCIsICJ8IiwgImJsb2NrR3JvdXAiLCAifCIsICJ0ZXh0R3JvdXAiLCAifCIsICJjb2xvckdyb3VwIiwgInwiLCAianVzdGlmeUdyb3VwIiwgInwiLCAibGlzdEdyb3VwIiwgImluZGVudEdyb3VwIiwgInwiLCAibGlua0dyb3VwIl07Citkb2pvLndpZGdldC5FZGl0b3Iuc3VwcG9ydGVkQ29tbWFuZHMgPSBbInNhdmUiLCAiY2FuY2VsIiwgInwiLCAiLSIsICIvIiwgIiAiXTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby53aWRnZXQuRWRpdG9yLCB7d2lkZ2V0VHlwZToiRWRpdG9yIiwgc2F2ZVVybDoiIiwgc2F2ZU1ldGhvZDoicG9zdCIsIHNhdmVBcmdOYW1lOiJlZGl0b3JDb250ZW50IiwgY2xvc2VPblNhdmU6ZmFsc2UsIGl0ZW1zOmRvam8ud2lkZ2V0LkVkaXRvci5kZWZhdWx0SXRlbXMsIGZvcm1hdEJsb2NrSXRlbXM6ZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8ud2lkZ2V0LkVkaXRvci5mb3JtYXRCbG9ja1ZhbHVlcyksIGZvbnROYW1lSXRlbXM6ZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8ud2lkZ2V0LkVkaXRvci5mb250TmFtZVZhbHVlcyksIGZvbnRTaXplSXRlbXM6ZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRvam8ud2lkZ2V0LkVkaXRvci5mb250U2l6ZVZhbHVlcyksIGdldEl0ZW1Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChuYW1lKSB7CisJdmFyIHByb3BzID0ge307CisJc3dpdGNoIChuYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkgIGNhc2UgImJvbGQiOgorCSAgY2FzZSAiaXRhbGljIjoKKwkgIGNhc2UgInVuZGVybGluZSI6CisJICBjYXNlICJzdHJpa2V0aHJvdWdoIjoKKwkJcHJvcHMudG9nZ2xlSXRlbSA9IHRydWU7CisJCWJyZWFrOworCSAgY2FzZSAianVzdGlmeWdyb3VwIjoKKwkJcHJvcHMuZGVmYXVsdEJ1dHRvbiA9ICJqdXN0aWZ5bGVmdCI7CisJCXByb3BzLnByZXZlbnREZXNlbGVjdCA9IHRydWU7CisJCXByb3BzLmJ1dHRvbkdyb3VwID0gdHJ1ZTsKKwkJYnJlYWs7CisJICBjYXNlICJsaXN0Z3JvdXAiOgorCQlwcm9wcy5idXR0b25Hcm91cCA9IHRydWU7CisJCWJyZWFrOworCSAgY2FzZSAic2F2ZSI6CisJICBjYXNlICJjYW5jZWwiOgorCQlwcm9wcy5sYWJlbCA9IGRvam8uc3RyaW5nLmNhcGl0YWxpemUobmFtZSk7CisJCWJyZWFrOworCSAgY2FzZSAiZm9yZWNvbG9yIjoKKwkgIGNhc2UgImhpbGl0ZWNvbG9yIjoKKwkJcHJvcHMubmFtZSA9IG5hbWU7CisJCXByb3BzLnRvZ2dsZUl0ZW0gPSB0cnVlOworCQlwcm9wcy5pY29uID0gdGhpcy5nZXRDb21tYW5kSW1hZ2UobmFtZSk7CisJCWJyZWFrOworCSAgY2FzZSAiZm9ybWF0YmxvY2siOgorCQlwcm9wcy5uYW1lID0gImZvcm1hdEJsb2NrIjsKKwkJcHJvcHMudmFsdWVzID0gdGhpcy5mb3JtYXRCbG9ja0l0ZW1zOworCQlicmVhazsKKwkgIGNhc2UgImZvbnRuYW1lIjoKKwkJcHJvcHMubmFtZSA9ICJmb250TmFtZSI7CisJCXByb3BzLnZhbHVlcyA9IHRoaXMuZm9udE5hbWVJdGVtczsKKwkgIGNhc2UgImZvbnRzaXplIjoKKwkJcHJvcHMubmFtZSA9ICJmb250U2l6ZSI7CisJCXByb3BzLnZhbHVlcyA9IHRoaXMuZm9udFNpemVJdGVtczsKKwl9CisJcmV0dXJuIHByb3BzOworfSwgdmFsaWRhdGVJdGVtczp0cnVlLCBmb2N1c09uTG9hZDp0cnVlLCBtaW5IZWlnaHQ6IjFlbSIsIF9yaWNoVGV4dDpudWxsLCBfcmljaFRleHRUeXBlOiJSaWNoVGV4dCIsIF90b29sYmFyQ29udGFpbmVyOm51bGwsIF90b29sYmFyQ29udGFpbmVyVHlwZToiVG9vbGJhckNvbnRhaW5lciIsIF90b29sYmFyczpbXSwgX3Rvb2xiYXJUeXBlOiJUb29sYmFyIiwgX3Rvb2xiYXJJdGVtVHlwZToiVG9vbGJhckl0ZW0iLCBidWlsZFJlbmRlcmluZzpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXZhciBub2RlID0gZnJhZ1siZG9qbzoiICsgdGhpcy53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCldWyJub2RlUmVmIl07CisJdmFyIHRydCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCh0aGlzLl9yaWNoVGV4dFR5cGUsIHtmb2N1c09uTG9hZDp0aGlzLmZvY3VzT25Mb2FkLCBtaW5IZWlnaHQ6dGhpcy5taW5IZWlnaHR9LCBub2RlKTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworCQlfdGhpcy5zZXRSaWNoVGV4dCh0cnQpOworCQlfdGhpcy5pbml0VG9vbGJhcigpOworCQlfdGhpcy5maWxsSW5UZW1wbGF0ZShhcmdzLCBmcmFnKTsKKwl9LCAwKTsKK30sIHNldFJpY2hUZXh0OmZ1bmN0aW9uIChyaWNoVGV4dCkgeworCWlmICh0aGlzLl9yaWNoVGV4dCAmJiB0aGlzLl9yaWNoVGV4dCA9PSByaWNoVGV4dCkgeworCQlkb2pvLmRlYnVnKCJBbHJlYWR5IHNldCB0aGUgcmljaFRleHQgdG8gdGhpcyByaWNoVGV4dCEiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGhpcy5fcmljaFRleHQgJiYgIXRoaXMuX3JpY2hUZXh0LmlzQ2xvc2VkKSB7CisJCWRvam8uZGVidWcoIllvdSBhcmUgc3dpdGNoaW5nIHJpY2hUZXh0cyB5ZXQgeW91IGhhdmVuJ3QgY2xvc2VkIHRoZSBjdXJyZW50IG9uZS4gTG9zaW5nIHJlZmVyZW5jZSEiKTsKKwl9CisJdGhpcy5fcmljaFRleHQgPSByaWNoVGV4dDsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fcmljaFRleHQsICJjbG9zZSIsIHRoaXMsICJvbkNsb3NlIik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX3JpY2hUZXh0LCAib25Mb2FkIiwgdGhpcywgIm9uTG9hZCIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9yaWNoVGV4dCwgIm9uRGlzcGxheUNoYW5nZWQiLCB0aGlzLCAidXBkYXRlVG9vbGJhciIpOworCWlmICh0aGlzLl90b29sYmFyQ29udGFpbmVyKSB7CisJCXRoaXMuX3Rvb2xiYXJDb250YWluZXIuZW5hYmxlKCk7CisJCXRoaXMudXBkYXRlVG9vbGJhcih0cnVlKTsKKwl9Cit9LCBpbml0VG9vbGJhcjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX3Rvb2xiYXJDb250YWluZXIpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl90b29sYmFyQ29udGFpbmVyID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KHRoaXMuX3Rvb2xiYXJDb250YWluZXJUeXBlKTsKKwl2YXIgdGIgPSB0aGlzLmFkZFRvb2xiYXIoKTsKKwl2YXIgbGFzdCA9IHRydWU7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLml0ZW1zW2ldID09ICJcbiIpIHsKKwkJCXRiID0gdGhpcy5hZGRUb29sYmFyKCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHRoaXMuaXRlbXNbaV0gPT0gInwiKSAmJiAoIWxhc3QpKSB7CisJCQkJbGFzdCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWxhc3QgPSB0aGlzLmFkZEl0ZW0odGhpcy5pdGVtc1tpXSwgdGIpOworCQkJfQorCQl9CisJfQorCXRoaXMuaW5zZXJ0VG9vbGJhcih0aGlzLl90b29sYmFyQ29udGFpbmVyLmRvbU5vZGUsIHRoaXMuX3JpY2hUZXh0LmRvbU5vZGUpOworfSwgaW5zZXJ0VG9vbGJhcjpmdW5jdGlvbiAodGJOb2RlLCByaWNoVGV4dE5vZGUpIHsKKwlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRiTm9kZSwgcmljaFRleHROb2RlKTsKK30sIGFkZFRvb2xiYXI6ZnVuY3Rpb24gKHRvb2xiYXIpIHsKKwl0aGlzLmluaXRUb29sYmFyKCk7CisJaWYgKCEodG9vbGJhciBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXIpKSB7CisJCXRvb2xiYXIgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQodGhpcy5fdG9vbGJhclR5cGUpOworCX0KKwl0aGlzLl90b29sYmFyQ29udGFpbmVyLmFkZENoaWxkKHRvb2xiYXIpOworCXRoaXMuX3Rvb2xiYXJzLnB1c2godG9vbGJhcik7CisJcmV0dXJuIHRvb2xiYXI7Cit9LCBhZGRJdGVtOmZ1bmN0aW9uIChpdGVtLCB0YiwgZG9udFZhbGlkYXRlKSB7CisJaWYgKCF0YikgeworCQl0YiA9IHRoaXMuX3Rvb2xiYXJzWzBdOworCX0KKwl2YXIgY21kID0gKChpdGVtKSAmJiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChpdGVtWyJnZXRWYWx1ZSJdKSkpID8gY21kID0gaXRlbVsiZ2V0VmFsdWUiXSgpIDogaXRlbTsKKwl2YXIgZ3JvdXBzID0gZG9qby53aWRnZXQuRWRpdG9yLml0ZW1Hcm91cHM7CisJaWYgKGl0ZW0gaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQl0Yi5hZGRDaGlsZChpdGVtKTsKKwl9IGVsc2UgeworCQlpZiAoZ3JvdXBzW2NtZF0pIHsKKwkJCXZhciBncm91cCA9IGdyb3Vwc1tjbWRdOworCQkJdmFyIHdvcmtlZCA9IHRydWU7CisJCQlpZiAoY21kID09ICJqdXN0aWZ5R3JvdXAiIHx8IGNtZCA9PSAibGlzdEdyb3VwIikgeworCQkJCXZhciBidG5Hcm91cCA9IFtjbWRdOworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKGRvbnRWYWxpZGF0ZSB8fCB0aGlzLmlzU3VwcG9ydGVkQ29tbWFuZChncm91cFtpXSkpIHsKKwkJCQkJCWJ0bkdyb3VwLnB1c2godGhpcy5nZXRDb21tYW5kSW1hZ2UoZ3JvdXBbaV0pKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXdvcmtlZCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChidG5Hcm91cC5sZW5ndGgpIHsKKwkJCQkJdmFyIGJ0biA9IHRiLmFkZENoaWxkKGJ0bkdyb3VwLCBudWxsLCB0aGlzLmdldEl0ZW1Qcm9wZXJ0aWVzKGNtZCkpOworCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3QoYnRuLCAib25DbGljayIsIHRoaXMsICJfYWN0aW9uIik7CisJCQkJCWRvam8uZXZlbnQuY29ubmVjdChidG4sICJvbkNoYW5nZVNlbGVjdCIsIHRoaXMsICJfYWN0aW9uIik7CisJCQkJfQorCQkJCXJldHVybiB3b3JrZWQ7CisJCQl9IGVsc2UgeworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKCF0aGlzLmFkZEl0ZW0oZ3JvdXBbaV0sIHRiKSkgeworCQkJCQkJd29ya2VkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHdvcmtlZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoIWRvbnRWYWxpZGF0ZSkgJiYgKCF0aGlzLmlzU3VwcG9ydGVkQ29tbWFuZChjbWQpKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChkb250VmFsaWRhdGUgfHwgdGhpcy5pc1N1cHBvcnRlZENvbW1hbmQoY21kKSkgeworCQkJCWNtZCA9IGNtZC50b0xvd2VyQ2FzZSgpOworCQkJCWlmIChjbWQgPT0gImZvcm1hdGJsb2NrIikgeworCQkJCQl2YXIgc2VsZWN0ID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyU2VsZWN0Iiwge25hbWU6ImZvcm1hdEJsb2NrIiwgdmFsdWVzOnRoaXMuZm9ybWF0QmxvY2tJdGVtc30pOworCQkJCQl0Yi5hZGRDaGlsZChzZWxlY3QpOworCQkJCQl2YXIgX3RoaXMgPSB0aGlzOworCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3Qoc2VsZWN0LCAib25TZXRWYWx1ZSIsIGZ1bmN0aW9uIChpdGVtLCB2YWx1ZSkgeworCQkJCQkJX3RoaXMub25BY3Rpb24oImZvcm1hdEJsb2NrIiwgdmFsdWUpOworCQkJCQl9KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY21kID09ICJmb250bmFtZSIpIHsKKwkJCQkJCXZhciBzZWxlY3QgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRvb2xiYXJTZWxlY3QiLCB7bmFtZToiZm9udE5hbWUiLCB2YWx1ZXM6dGhpcy5mb250TmFtZUl0ZW1zfSk7CisJCQkJCQl0Yi5hZGRDaGlsZChzZWxlY3QpOworCQkJCQkJZG9qby5ldmVudC5jb25uZWN0KHNlbGVjdCwgIm9uU2V0VmFsdWUiLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKGl0ZW0sIHZhbHVlKSB7CisJCQkJCQkJdGhpcy5vbkFjdGlvbigiZm9udE5hbWUiLCB2YWx1ZSk7CisJCQkJCQl9KSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoY21kID09ICJmb250c2l6ZSIpIHsKKwkJCQkJCQl2YXIgc2VsZWN0ID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyU2VsZWN0Iiwge25hbWU6ImZvbnRTaXplIiwgdmFsdWVzOnRoaXMuZm9udFNpemVJdGVtc30pOworCQkJCQkJCXRiLmFkZENoaWxkKHNlbGVjdCk7CisJCQkJCQkJZG9qby5ldmVudC5jb25uZWN0KHNlbGVjdCwgIm9uU2V0VmFsdWUiLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKGl0ZW0sIHZhbHVlKSB7CisJCQkJCQkJCXRoaXMub25BY3Rpb24oImZvbnRTaXplIiwgdmFsdWUpOworCQkJCQkJCX0pKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKGRvam8ubGFuZy5pbkFycmF5KGNtZCwgWyJmb3JlY29sb3IiLCAiaGlsaXRlY29sb3IiXSkpIHsKKwkJCQkJCQkJdmFyIGJ0biA9IHRiLmFkZENoaWxkKGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVG9vbGJhckNvbG9yRGlhbG9nIiwgdGhpcy5nZXRJdGVtUHJvcGVydGllcyhjbWQpKSk7CisJCQkJCQkJCWRvam8uZXZlbnQuY29ubmVjdChidG4sICJvblNldFZhbHVlIiwgdGhpcywgIl9zZXRWYWx1ZSIpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXZhciBidG4gPSB0Yi5hZGRDaGlsZCh0aGlzLmdldENvbW1hbmRJbWFnZShjbWQpLCBudWxsLCB0aGlzLmdldEl0ZW1Qcm9wZXJ0aWVzKGNtZCkpOworCQkJCQkJCQlpZiAoY21kID09ICJzYXZlIikgeworCQkJCQkJCQkJZG9qby5ldmVudC5jb25uZWN0KGJ0biwgIm9uQ2xpY2siLCB0aGlzLCAiX3NhdmUiKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmIChjbWQgPT0gImNhbmNlbCIpIHsKKwkJCQkJCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3QoYnRuLCAib25DbGljayIsIHRoaXMsICJfY2xvc2UiKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJZG9qby5ldmVudC5jb25uZWN0KGJ0biwgIm9uQ2xpY2siLCB0aGlzLCAiX2FjdGlvbiIpOworCQkJCQkJCQkJCWRvam8uZXZlbnQuY29ubmVjdChidG4sICJvbkNoYW5nZVNlbGVjdCIsIHRoaXMsICJfYWN0aW9uIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9LCBlbmFibGVUb29sYmFyOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fdG9vbGJhckNvbnRhaW5lcikgeworCQl0aGlzLl90b29sYmFyQ29udGFpbmVyLmRvbU5vZGUuc3R5bGUuZGlzcGxheSA9ICIiOworCQl0aGlzLl90b29sYmFyQ29udGFpbmVyLmVuYWJsZSgpOworCX0KK30sIGRpc2FibGVUb29sYmFyOmZ1bmN0aW9uIChoaWRlKSB7CisJaWYgKGhpZGUpIHsKKwkJaWYgKHRoaXMuX3Rvb2xiYXJDb250YWluZXIpIHsKKwkJCXRoaXMuX3Rvb2xiYXJDb250YWluZXIuZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuX3Rvb2xiYXJDb250YWluZXIpIHsKKwkJCXRoaXMuX3Rvb2xiYXJDb250YWluZXIuZGlzYWJsZSgpOworCQl9CisJfQorfSwgX3VwZGF0ZVRvb2xiYXJMYXN0UmFuOm51bGwsIF91cGRhdGVUb29sYmFyVGltZXI6bnVsbCwgX3VwZGF0ZVRvb2xiYXJGcmVxdWVuY3k6NTAwLCB1cGRhdGVUb29sYmFyOmZ1bmN0aW9uIChmb3JjZSkgeworCWlmICghdGhpcy5fdG9vbGJhckNvbnRhaW5lcikgeworCQlyZXR1cm47CisJfQorCXZhciBkaWZmID0gbmV3IERhdGUoKSAtIHRoaXMuX3VwZGF0ZVRvb2xiYXJMYXN0UmFuOworCWlmICghZm9yY2UgJiYgdGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW4gJiYgKGRpZmYgPCB0aGlzLl91cGRhdGVUb29sYmFyRnJlcXVlbmN5KSkgeworCQljbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVG9vbGJhclRpbWVyKTsKKwkJdmFyIF90aGlzID0gdGhpczsKKwkJdGhpcy5fdXBkYXRlVG9vbGJhclRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisJCQlfdGhpcy51cGRhdGVUb29sYmFyKCk7CisJCX0sIHRoaXMuX3VwZGF0ZVRvb2xiYXJGcmVxdWVuY3kgLyAyKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXRoaXMuX3VwZGF0ZVRvb2xiYXJMYXN0UmFuID0gbmV3IERhdGUoKTsKKwl9CisJdmFyIGl0ZW1zID0gdGhpcy5fdG9vbGJhckNvbnRhaW5lci5nZXRJdGVtcygpOworCWZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGl0ZW0gPSBpdGVtc1tpXTsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFyU2VwYXJhdG9yKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgY21kID0gaXRlbS5fbmFtZTsKKwkJaWYgKGNtZCA9PSAic2F2ZSIgfHwgY21kID09ICJjYW5jZWwiKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjbWQgPT0gImp1c3RpZnlHcm91cCIpIHsKKwkJCQl0cnkgeworCQkJCQlpZiAoIXRoaXMuX3JpY2hUZXh0LnF1ZXJ5Q29tbWFuZEVuYWJsZWQoImp1c3RpZnlsZWZ0IikpIHsKKwkJCQkJCWl0ZW0uZGlzYWJsZShmYWxzZSwgdHJ1ZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpdGVtLmVuYWJsZShmYWxzZSwgdHJ1ZSk7CisJCQkJCQl2YXIgaml0ZW1zID0gaXRlbS5nZXRJdGVtcygpOworCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBqaXRlbXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQl2YXIgbmFtZSA9IGppdGVtc1tqXS5fbmFtZTsKKwkJCQkJCQl2YXIgdmFsdWUgPSB0aGlzLl9yaWNoVGV4dC5xdWVyeUNvbW1hbmRWYWx1ZShuYW1lKTsKKwkJCQkJCQlpZiAodHlwZW9mIHZhbHVlID09ICJib29sZWFuIiAmJiB2YWx1ZSkgeworCQkJCQkJCQl2YWx1ZSA9IG5hbWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmICh0eXBlb2YgdmFsdWUgPT0gInN0cmluZyIpIHsKKwkJCQkJCQkJCXZhbHVlID0gImp1c3RpZnkiICsgdmFsdWU7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoIXZhbHVlKSB7CisJCQkJCQkJdmFsdWUgPSAianVzdGlmeWxlZnQiOworCQkJCQkJfQorCQkJCQkJaXRlbS5zZXRWYWx1ZSh2YWx1ZSwgZmFsc2UsIHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChlcnIpIHsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjbWQgPT0gImxpc3RHcm91cCIpIHsKKwkJCQkJdmFyIGxpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKKwkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBsaXRlbXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCXRoaXMudXBkYXRlSXRlbShsaXRlbXNbal0pOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy51cGRhdGVJdGVtKGl0ZW0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30sIHVwZGF0ZUl0ZW06ZnVuY3Rpb24gKGl0ZW0pIHsKKwl0cnkgeworCQl2YXIgY21kID0gaXRlbS5fbmFtZTsKKwkJdmFyIGVuYWJsZWQgPSB0aGlzLl9yaWNoVGV4dC5xdWVyeUNvbW1hbmRFbmFibGVkKGNtZCk7CisJCWl0ZW0uc2V0RW5hYmxlZChlbmFibGVkLCBmYWxzZSwgdHJ1ZSk7CisJCXZhciBhY3RpdmUgPSB0aGlzLl9yaWNoVGV4dC5xdWVyeUNvbW1hbmRTdGF0ZShjbWQpOworCQlpZiAoYWN0aXZlICYmIGNtZCA9PSAidW5kZXJsaW5lIikgeworCQkJYWN0aXZlID0gIXRoaXMuX3JpY2hUZXh0LnF1ZXJ5Q29tbWFuZEVuYWJsZWQoInVubGluayIpOworCQl9CisJCWl0ZW0uc2V0U2VsZWN0ZWQoYWN0aXZlLCBmYWxzZSwgdHJ1ZSk7CisJCXJldHVybiB0cnVlOworCX0KKwljYXRjaCAoZXJyKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9LCBzdXBwb3J0ZWRDb21tYW5kczpkb2pvLndpZGdldC5FZGl0b3Iuc3VwcG9ydGVkQ29tbWFuZHMuY29uY2F0KCksIGlzU3VwcG9ydGVkQ29tbWFuZDpmdW5jdGlvbiAoY21kKSB7CisJdmFyIHllcyA9IGRvam8ubGFuZy5pbkFycmF5KGNtZCwgdGhpcy5zdXBwb3J0ZWRDb21tYW5kcyk7CisJaWYgKCF5ZXMpIHsKKwkJdHJ5IHsKKwkJCXZhciByaWNoVGV4dCA9IHRoaXMuX3JpY2hUZXh0IHx8IGRvam8ud2lkZ2V0Lkh0bWxSaWNoVGV4dC5wcm90b3R5cGU7CisJCQl5ZXMgPSByaWNoVGV4dC5xdWVyeUNvbW1hbmRBdmFpbGFibGUoY21kKTsKKwkJfQorCQljYXRjaCAoRSkgeworCQl9CisJfQorCXJldHVybiB5ZXM7Cit9LCBnZXRDb21tYW5kSW1hZ2U6ZnVuY3Rpb24gKGNtZCkgeworCWlmIChjbWQgPT0gInwiKSB7CisJCXJldHVybiBjbWQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2J1dHRvbnMvIiArIGNtZCArICIuZ2lmIik7CisJfQorfSwgX2FjdGlvbjpmdW5jdGlvbiAoZSkgeworCXRoaXMuX2ZpcmUoIm9uQWN0aW9uIiwgZS5nZXRWYWx1ZSgpKTsKK30sIF9zZXRWYWx1ZTpmdW5jdGlvbiAoYSwgYikgeworCXRoaXMuX2ZpcmUoIm9uQWN0aW9uIiwgYS5nZXRWYWx1ZSgpLCBiKTsKK30sIF9zYXZlOmZ1bmN0aW9uIChlKSB7CisJaWYgKCF0aGlzLl9yaWNoVGV4dC5pc0Nsb3NlZCkgeworCQlpZiAodGhpcy5zYXZlVXJsLmxlbmd0aCkgeworCQkJdmFyIGNvbnRlbnQgPSB7fTsKKwkJCWNvbnRlbnRbdGhpcy5zYXZlQXJnTmFtZV0gPSB0aGlzLmdldEh0bWwoKTsKKwkJCWRvam8uaW8uYmluZCh7bWV0aG9kOnRoaXMuc2F2ZU1ldGhvZCwgdXJsOnRoaXMuc2F2ZVVybCwgY29udGVudDpjb250ZW50fSk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmRlYnVnKCJwbGVhc2Ugc2V0IGEgc2F2ZVVybCBmb3IgdGhlIGVkaXRvciIpOworCQl9CisJCWlmICh0aGlzLmNsb3NlT25TYXZlKSB7CisJCQl0aGlzLl9yaWNoVGV4dC5jbG9zZShlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpID09ICJzYXZlIik7CisJCX0KKwl9Cit9LCBfY2xvc2U6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIXRoaXMuX3JpY2hUZXh0LmlzQ2xvc2VkKSB7CisJCXRoaXMuX3JpY2hUZXh0LmNsb3NlKGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgPT0gInNhdmUiKTsKKwl9Cit9LCBvbkFjdGlvbjpmdW5jdGlvbiAoY21kLCB2YWx1ZSkgeworCXN3aXRjaCAoY21kKSB7CisJICBjYXNlICJjcmVhdGVsaW5rIjoKKwkJaWYgKCEodmFsdWUgPSBwcm9tcHQoIlBsZWFzZSBlbnRlciB0aGUgVVJMIG9mIHRoZSBsaW5rOiIsICJodHRwOi8vIikpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJICBjYXNlICJpbnNlcnRpbWFnZSI6CisJCWlmICghKHZhbHVlID0gcHJvbXB0KCJQbGVhc2UgZW50ZXIgdGhlIFVSTCBvZiB0aGUgaW1hZ2U6IiwgImh0dHA6Ly8iKSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwl9CisJdGhpcy5fcmljaFRleHQuZXhlY0NvbW1hbmQoY21kLCB2YWx1ZSk7Cit9LCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworfSwgX2ZpcmU6ZnVuY3Rpb24gKGV2ZW50TmFtZSkgeworCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzW2V2ZW50TmFtZV0pKSB7CisJCXZhciBhcmdzID0gW107CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKwkJCWFyZ3MucHVzaCh0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCQl9CisJCX0KKwkJdGhpc1tldmVudE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpOworCX0KK30sIGdldEh0bWw6ZnVuY3Rpb24gKCkgeworCXRoaXMuX3JpY2hUZXh0LmNvbnRlbnRGaWx0ZXJzID0gdGhpcy5fcmljaFRleHQuY29udGVudEZpbHRlcnMuY29uY2F0KHRoaXMuY29udGVudEZpbHRlcnMpOworCXJldHVybiB0aGlzLl9yaWNoVGV4dC5nZXRFZGl0b3JDb250ZW50KCk7Cit9LCBnZXRFZGl0b3JDb250ZW50OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5nZXRIdG1sKCk7Cit9LCBvbkNsb3NlOmZ1bmN0aW9uIChzYXZlLCBoaWRlKSB7CisJdGhpcy5kaXNhYmxlVG9vbGJhcihoaWRlKTsKKwlpZiAoc2F2ZSkgeworCQl0aGlzLl9maXJlKCJvblNhdmUiKTsKKwl9IGVsc2UgeworCQl0aGlzLl9maXJlKCJvbkNhbmNlbCIpOworCX0KK30sIG9uTG9hZDpmdW5jdGlvbiAoKSB7Cit9LCBvblNhdmU6ZnVuY3Rpb24gKCkgeworfSwgb25DYW5jZWw6ZnVuY3Rpb24gKCkgeworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0ZWNkNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMi5qcwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUmljaFRleHQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuY2FjaGUiKTsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyID0gbmV3IGRvam8ud2lkZ2V0LkhhbmRsZXJNYW5hZ2VyOworZG9qby5sYW5nLm1peGluKGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLCB7X2N1cnJlbnRJbnN0YW5jZTpudWxsLCBjb21tYW5kU3RhdGU6e0Rpc2FibGVkOjAsIExhdGNoZWQ6MSwgRW5hYmxlZDoyfSwgZ2V0Q3VycmVudEluc3RhbmNlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fY3VycmVudEluc3RhbmNlOworfSwgc2V0Q3VycmVudEluc3RhbmNlOmZ1bmN0aW9uIChpbnN0KSB7CisJdGhpcy5fY3VycmVudEluc3RhbmNlID0gaW5zdDsKK30sIGdldENvbW1hbmQ6ZnVuY3Rpb24gKGVkaXRvciwgbmFtZSkgeworCXZhciBvQ29tbWFuZDsKKwluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7CisJCW9Db21tYW5kID0gdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldKGVkaXRvciwgbmFtZSk7CisJCWlmIChvQ29tbWFuZCkgeworCQkJcmV0dXJuIG9Db21tYW5kOworCQl9CisJfQorCXN3aXRjaCAobmFtZSkgeworCSAgY2FzZSAiaHRtbHRvZ2dsZSI6CisJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZChlZGl0b3IsIG5hbWUpOworCQlicmVhazsKKwkgIGNhc2UgImZvcm1hdGJsb2NrIjoKKwkJb0NvbW1hbmQgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMkZvcm1hdEJsb2NrQ29tbWFuZChlZGl0b3IsIG5hbWUpOworCQlicmVhazsKKwkgIGNhc2UgImFuY2hvciI6CisJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kKGVkaXRvciwgbmFtZSk7CisJCWJyZWFrOworCSAgY2FzZSAiY3JlYXRlbGluayI6CisJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kKGVkaXRvciwgbmFtZSwge2NvbnRlbnRGaWxlOiJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNyZWF0ZUxpbmtEaWFsb2ciLCBjb250ZW50Q2xhc3M6IkVkaXRvcjJDcmVhdGVMaW5rRGlhbG9nIiwgdGl0bGU6Ikluc2VydC9FZGl0IExpbmsiLCB3aWR0aDoiMzAwcHgiLCBoZWlnaHQ6IjIwMHB4In0pOworCQlicmVhazsKKwkgIGNhc2UgImluc2VydGltYWdlIjoKKwkJb0NvbW1hbmQgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQoZWRpdG9yLCBuYW1lLCB7Y29udGVudEZpbGU6ImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uSW5zZXJ0SW1hZ2VEaWFsb2ciLCBjb250ZW50Q2xhc3M6IkVkaXRvcjJJbnNlcnRJbWFnZURpYWxvZyIsIHRpdGxlOiJJbnNlcnQvRWRpdCBJbWFnZSIsIHdpZHRoOiI0MDBweCIsIGhlaWdodDoiMjcwcHgifSk7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJdmFyIGN1cnRJbnN0ID0gdGhpcy5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJaWYgKChjdXJ0SW5zdCAmJiBjdXJ0SW5zdC5xdWVyeUNvbW1hbmRBdmFpbGFibGUobmFtZSkpIHx8ICghY3VydEluc3QgJiYgZG9qby53aWRnZXQuRWRpdG9yMi5wcm90b3R5cGUucXVlcnlDb21tYW5kQXZhaWxhYmxlKG5hbWUpKSkgeworCQkJb0NvbW1hbmQgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMkJyb3dzZXJDb21tYW5kKGVkaXRvciwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDb21tYW5kOiBVbmtub3duIGNvbW1hbmQgIiArIG5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXJldHVybiBvQ29tbWFuZDsKK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCXRoaXMuX2N1cnJlbnRJbnN0YW5jZSA9IG51bGw7CisJZG9qby53aWRnZXQuSGFuZGxlck1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK319KTsKK2Rvam8uYWRkT25VbmxvYWQoZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIsICJkZXN0cm95Iik7Citkb2pvLmxhbmcuZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQiLCBudWxsLCBmdW5jdGlvbiAoZWRpdG9yLCBuYW1lKSB7CisJdGhpcy5fZWRpdG9yID0gZWRpdG9yOworCXRoaXMuX3VwZGF0ZVRpbWUgPSAwOworCXRoaXMuX25hbWUgPSBuYW1lOworfSwge190ZXh0OiJVbmtub3duIiwgZXhlY3V0ZTpmdW5jdGlvbiAocGFyYSkgeworCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQuZXhlY3V0ZSIpOworfSwgZ2V0VGV4dDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX3RleHQ7Cit9LCBnZXRTdGF0ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5FbmFibGVkOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7Cit9fSk7Citkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmROYW1lcyA9IHsiYm9sZCI6IkJvbGQiLCAiY29weSI6IkNvcHkiLCAiY3V0IjoiQ3V0IiwgIkRlbGV0ZSI6IkRlbGV0ZSIsICJpbmRlbnQiOiJJbmRlbnQiLCAiaW5zZXJ0aG9yaXpvbnRhbHJ1bGUiOiJIb3JpemVudGFsIFJ1bGUiLCAiaW5zZXJ0b3JkZXJlZGxpc3QiOiJOdW1iZXJlZCBMaXN0IiwgImluc2VydHVub3JkZXJlZGxpc3QiOiJCdWxsZXQgTGlzdCIsICJpdGFsaWMiOiJJdGFsaWMiLCAianVzdGlmeWNlbnRlciI6IkFsaWduIENlbnRlciIsICJqdXN0aWZ5ZnVsbCI6Ikp1c3RpZnkiLCAianVzdGlmeWxlZnQiOiJBbGlnbiBMZWZ0IiwgImp1c3RpZnlyaWdodCI6IkFsaWduIFJpZ2h0IiwgIm91dGRlbnQiOiJPdXRkZW50IiwgInBhc3RlIjoiUGFzdGUiLCAicmVkbyI6IlJlZG8iLCAicmVtb3ZlZm9ybWF0IjoiUmVtb3ZlIEZvcm1hdCIsICJzZWxlY3RhbGwiOiJTZWxlY3QgQWxsIiwgInN0cmlrZXRocm91Z2giOiJTdHJpa2V0aHJvdWdoIiwgInN1YnNjcmlwdCI6IlN1YnNjcmlwdCIsICJzdXBlcnNjcmlwdCI6IlN1cGVyc2NyaXB0IiwgInVuZGVybGluZSI6IlVuZGVybGluZSIsICJ1bmRvIjoiVW5kbyIsICJ1bmxpbmsiOiJSZW1vdmUgTGluayIsICJjcmVhdGVsaW5rIjoiQ3JlYXRlIExpbmsiLCAiaW5zZXJ0aW1hZ2UiOiJJbnNlcnQgSW1hZ2UiLCAiaHRtbHRvZ2dsZSI6IkhUTUwgU291cmNlIiwgImZvcmVjb2xvciI6IkZvcmVncm91bmQgQ29sb3IiLCAiaGlsaXRlY29sb3IiOiJCYWNrZ3JvdW5kIENvbG9yIiwgInBsYWluZm9ybWF0YmxvY2siOiJQYXJhZ3JhcGggU3R5bGUiLCAiZm9ybWF0YmxvY2siOiJQYXJhZ3JhcGggU3R5bGUiLCAiZm9udHNpemUiOiJGb250IFNpemUiLCAiZm9udG5hbWUiOiJGb250IE5hbWUifTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQiLCBkb2pvLndpZGdldC5FZGl0b3IyQ29tbWFuZCwgZnVuY3Rpb24gKGVkaXRvciwgbmFtZSkgeworCXZhciB0ZXh0ID0gZG9qby53aWRnZXQuRWRpdG9yMkJyb3dzZXJDb21tYW5kTmFtZXNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKKwlpZiAodGV4dCkgeworCQl0aGlzLl90ZXh0ID0gdGV4dDsKKwl9Cit9LCB7ZXhlY3V0ZTpmdW5jdGlvbiAocGFyYSkgeworCXRoaXMuX2VkaXRvci5leGVjQ29tbWFuZCh0aGlzLl9uYW1lLCBwYXJhKTsKK30sIGdldFN0YXRlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fZWRpdG9yLl9sYXN0U3RhdGVUaW1lc3RhbXAgPiB0aGlzLl91cGRhdGVUaW1lIHx8IHRoaXMuX3N0YXRlID09IHVuZGVmaW5lZCkgeworCQl0aGlzLl91cGRhdGVUaW1lID0gdGhpcy5fZWRpdG9yLl9sYXN0U3RhdGVUaW1lc3RhbXA7CisJCXRyeSB7CisJCQlpZiAodGhpcy5fZWRpdG9yLnF1ZXJ5Q29tbWFuZEVuYWJsZWQodGhpcy5fbmFtZSkpIHsKKwkJCQlpZiAodGhpcy5fZWRpdG9yLnF1ZXJ5Q29tbWFuZFN0YXRlKHRoaXMuX25hbWUpKSB7CisJCQkJCXRoaXMuX3N0YXRlID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkxhdGNoZWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5fc3RhdGUgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRW5hYmxlZDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRoaXMuX3N0YXRlID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkRpc2FibGVkOworCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCQl0aGlzLl9zdGF0ZSA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5FbmFibGVkOworCQl9CisJfQorCXJldHVybiB0aGlzLl9zdGF0ZTsKK30sIGdldFZhbHVlOmZ1bmN0aW9uICgpIHsKKwl0cnkgeworCQlyZXR1cm4gdGhpcy5fZWRpdG9yLnF1ZXJ5Q29tbWFuZFZhbHVlKHRoaXMuX25hbWUpOworCX0KKwljYXRjaCAoZSkgeworCX0KK319KTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyRm9ybWF0QmxvY2tDb21tYW5kIiwgZG9qby53aWRnZXQuRWRpdG9yMkJyb3dzZXJDb21tYW5kLCB7fSk7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nIiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZUJhc2UsIGRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZV0sIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVcIj5cblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiU3RhcnRPdXRlclwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCJcdHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiU3RhcnRcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJ0aXRsZUJhclwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFyXCIgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG5cdCAgXHQ8aW1nIGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFySWNvblwiICBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb25cIj5cblx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cImNsb3NlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpoaWRlXCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lQ2xvc2VJY29uXCI+PC9kaXY+XG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXN0b3JlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpyZXN0b3JlV2luZG93XCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lUmVzdG9yZUljb25cIj48L2Rpdj5cblx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cIm1heGltaXplQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazptYXhpbWl6ZVdpbmRvd1wiXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvblwiPjwvZGl2PlxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwibWluaW1pemVBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOm1pbmltaXplV2luZG93XCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uXCI+PC9kaXY+XG5cdCAgXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyVGV4dFwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dFwiPiR7dGhpcy50aXRsZX08L2Rpdj5cblx0PC9kaXY+XG5cblx0PGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsaWVudFwiPjwvZGl2PlxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJFbmRcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiRW5kT3V0ZXJcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXNpemVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxuPC9kaXY+XG4iLCBtb2RhbDp0cnVlLCB3aWR0aDoiIiwgaGVpZ2h0OiIiLCB3aW5kb3dTdGF0ZToibWluaW1pemVkIiwgZGlzcGxheUNsb3NlQWN0aW9uOnRydWUsIGNvbnRlbnRGaWxlOiIiLCBjb250ZW50Q2xhc3M6IiIsIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdGhpcy5maWxsSW5GbG9hdGluZ1BhbmVUZW1wbGF0ZShhcmdzLCBmcmFnKTsKKwlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuY2FsbCh0aGlzLCBhcmdzLCBmcmFnKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmNvbnRlbnRGaWxlKSB7CisJCWRvam8ucmVxdWlyZSh0aGlzLmNvbnRlbnRGaWxlKTsKKwl9CisJaWYgKHRoaXMubW9kYWwpIHsKKwkJZG9qby53aWRnZXQuTW9kYWxEaWFsb2dCYXNlLnByb3RvdHlwZS5wb3N0Q3JlYXRlLmNhbGwodGhpcyk7CisJfSBlbHNlIHsKKwkJd2l0aCAodGhpcy5kb21Ob2RlLnN0eWxlKSB7CisJCQl6SW5kZXggPSA5OTk7CisJCQlkaXNwbGF5ID0gIm5vbmUiOworCQl9CisJfQorCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZUJhc2UucHJvdG90eXBlLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5jYWxsKHRoaXMpOworCWlmICh0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB7CisJCXdpdGggKHRoaXMuZG9tTm9kZS5zdHlsZSkgeworCQkJd2lkdGggPSB0aGlzLndpZHRoOworCQkJaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisJCX0KKwl9Cit9LCBjcmVhdGVDb250ZW50OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuY29udGVudFdpZGdldCAmJiB0aGlzLmNvbnRlbnRDbGFzcykgeworCQl0aGlzLmNvbnRlbnRXaWRnZXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQodGhpcy5jb250ZW50Q2xhc3MpOworCQl0aGlzLmFkZENoaWxkKHRoaXMuY29udGVudFdpZGdldCk7CisJfQorfSwgc2hvdzpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmNvbnRlbnRXaWRnZXQpIHsKKwkJZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZy5zdXBlcmNsYXNzLnNob3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJdGhpcy5jcmVhdGVDb250ZW50KCk7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7CisJfQorCWlmICghdGhpcy5jb250ZW50V2lkZ2V0IHx8ICF0aGlzLmNvbnRlbnRXaWRnZXQubG9hZENvbnRlbnQoKSkgeworCQlyZXR1cm47CisJfQorCXRoaXMuc2hvd0Zsb2F0aW5nUGFuZSgpOworCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5zaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJaWYgKHRoaXMubW9kYWwpIHsKKwkJdGhpcy5zaG93TW9kYWxEaWFsb2coKTsKKwl9CisJaWYgKHRoaXMubW9kYWwpIHsKKwkJdGhpcy5iZy5zdHlsZS56SW5kZXggPSB0aGlzLmRvbU5vZGUuc3R5bGUuekluZGV4IC0gMTsKKwl9Cit9LCBvblNob3c6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5vblNob3cuY2FsbCh0aGlzKTsKKwl0aGlzLm9uRmxvYXRpbmdQYW5lU2hvdygpOworfSwgY2xvc2VXaW5kb3c6ZnVuY3Rpb24gKCkgeworCXRoaXMuaGlkZSgpOworCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5jbG9zZVdpbmRvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgaGlkZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMubW9kYWwpIHsKKwkJdGhpcy5oaWRlTW9kYWxEaWFsb2coKTsKKwl9CisJZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZy5zdXBlcmNsYXNzLmhpZGUuY2FsbCh0aGlzKTsKK30sIGNoZWNrU2l6ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nKCkpIHsKKwkJaWYgKHRoaXMubW9kYWwpIHsKKwkJCXRoaXMuX3NpemVCYWNrZ3JvdW5kKCk7CisJCX0KKwkJdGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7CisJCXRoaXMub25SZXNpemVkKCk7CisJfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt3aWRnZXRzSW5UZW1wbGF0ZTp0cnVlLCBsb2FkQ29udGVudDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRydWU7Cit9LCBjYW5jZWw6ZnVuY3Rpb24gKCkgeworCXRoaXMucGFyZW50LmhpZGUoKTsKK319KTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29tbWFuZCIsIGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZCwgZnVuY3Rpb24gKGVkaXRvciwgbmFtZSwgZGlhbG9nUGFyYXMpIHsKKwl0aGlzLmRpYWxvZ1BhcmFzID0gZGlhbG9nUGFyYXM7Cit9LCB7ZXhlY3V0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmRpYWxvZykgeworCQlpZiAoIXRoaXMuZGlhbG9nUGFyYXMuY29udGVudEZpbGUgfHwgIXRoaXMuZGlhbG9nUGFyYXMuY29udGVudENsYXNzKSB7CisJCQlhbGVydCgiY29udGVudEZpbGUgYW5kIGNvbnRlbnRDbGFzcyBzaG91bGQgYmUgc2V0IGZvciBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29tbWFuZC5kaWFsb2dQYXJhcyEiKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLmRpYWxvZyA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMkRpYWxvZyIsIHRoaXMuZGlhbG9nUGFyYXMpOworCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZy5kb21Ob2RlKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJkZXN0cm95IiwgdGhpcy5kaWFsb2csICJkZXN0cm95Iik7CisJfQorCXRoaXMuZGlhbG9nLnNob3coKTsKK30sIGdldFRleHQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmRpYWxvZ1BhcmFzLnRpdGxlIHx8IGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kLnN1cGVyY2xhc3MuZ2V0VGV4dC5jYWxsKHRoaXMpOworfX0pOworZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHMgPSB7fTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRWRpdG9yMiIsIGRvam8ud2lkZ2V0LlJpY2hUZXh0LCBmdW5jdGlvbiAoKSB7CisJdGhpcy5fbG9hZGVkQ29tbWFuZHMgPSB7fTsKK30sIHt0b29sYmFyQWx3YXlzVmlzaWJsZTpmYWxzZSwgdG9vbGJhcldpZGdldDpudWxsLCBzY3JvbGxJbnRlcnZhbDpudWxsLCB0b29sYmFyVGVtcGxhdGVQYXRoOmRvam8udXJpLmNhY2hlLnNldChkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3JUb29sYmFyT25lbGluZS5odG1sIiksICI8ZGl2IGNsYXNzPVwiRWRpdG9yVG9vbGJhckRvbU5vZGUgRWRpdG9yVG9vbGJhclNtYWxsQmdcIj5cblx0PHRhYmxlIGNlbGxwYWRkaW5nPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHQ8dGJvZHk+XG5cdFx0XHQ8dHIgdmFsaWduPVwidG9wXCIgYWxpZ249XCJsZWZ0XCI+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJodG1sdG9nZ2xlXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvblwiIFxuXHRcdFx0XHRcdFx0c3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOiBub25lOyB3aWR0aDogMzBweDtcIiA+Jmx0O2gmZ3Q7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImNvcHlcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Db3B5XCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInBhc3RlXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUGFzdGVcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwidW5kb1wiPlxuXHRcdFx0XHRcdFx0PCEtLSBGSVhNRTogc2hvdWxkIHdlIGhhdmUgdGhlIHRleHQgXCJ1bmRvXCIgaGVyZT8gLS0+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fVW5kb1wiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJyZWRvXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUmVkb1wiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIlx0c3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiY3JlYXRlbGlua1wiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0xpbmtcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0aW1hZ2VcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JbWFnZVwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpbnNlcnRob3Jpem9udGFscnVsZVwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0hvcml6b250YWxMaW5lIFwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJib2xkXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQm9sZFwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpdGFsaWNcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JdGFsaWNcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwidW5kZXJsaW5lXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fVW5kZXJsaW5lXCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInN0cmlrZXRocm91Z2hcIj5cblx0XHRcdFx0XHRcdDxzcGFuIFxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU3RyaWtlVGhyb3VnaFwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIiBcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0dW5vcmRlcmVkbGlzdFwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CdWxsZXRlZExpc3RcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0b3JkZXJlZGxpc3RcIj5cblx0XHRcdFx0XHRcdDxzcGFuIFxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fTnVtYmVyZWRMaXN0XCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGlzU3BhY2VyPVwidHJ1ZVwiPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NlcFwiIHN0eWxlPVwid2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7XCI+PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImluZGVudFwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0luZGVudFwiIFxuXHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJvdXRkZW50XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fT3V0ZGVudFwiIFxuXHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIiBzdHlsZT1cIndpZHRoOiA1cHg7IG1pbi13aWR0aDogNXB4O1wiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJmb3JlY29sb3JcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9UZXh0Q29sb3JcIiBcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaGlsaXRlY29sb3JcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CYWNrZ3JvdW5kQ29sb3JcIiBcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQgaXNTcGFjZXI9XCJ0cnVlXCI+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwXCIgc3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeWxlZnRcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9MZWZ0SnVzdGlmeVwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJqdXN0aWZ5Y2VudGVyXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQ2VudGVySnVzdGlmeVwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJqdXN0aWZ5cmlnaHRcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9SaWdodEp1c3RpZnlcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeWZ1bGxcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CbG9ja0p1c3RpZnlcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8L3RkPlx0XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwiZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJwbGFpbmZvcm1hdGJsb2NrXCI+XG5cdFx0XHRcdFx0XHQ8IS0tIEZJWE1FOiB1c2luZyBcInBcIiBoZXJlIGluc2VydHMgYSBwYXJhZ3JhcGggaW4gbW9zdCBjYXNlcyEgLS0+XG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiXCI+LS0gZm9ybWF0IC0tPC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicFwiPk5vcm1hbDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInByZVwiPkZpeGVkIEZvbnQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJoMVwiPk1haW4gSGVhZGluZzwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImgyXCI+U2VjdGlvbiBIZWFkaW5nPC9vcHRpb24+XG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiaDNcIj5TdWItSGVhZGluZzwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0PCEtLSA8b3B0aW9uIHZhbHVlPVwiYmxvY2txdW90ZVwiPkJsb2NrIFF1b3RlPC9vcHRpb24+IC0tPlxuXHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+PCEtLSB1bmNvbW1lbnQgdG8gZW5hYmxlIHNhdmUgYnV0dG9uIC0tPlxuXHRcdFx0XHRcdDwhLS0gc2F2ZSAtLT5cblx0XHRcdFx0XHQ8IS0tc3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJzYXZlXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2F2ZVwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4tLT5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIHdpZHRoPVwiKlwiPiZuYnNwOzwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdDwvdGJvZHk+XG5cdDwvdGFibGU+XG48L2Rpdj5cbiIpLCB0b29sYmFyVGVtcGxhdGVDc3NQYXRoOm51bGwsIHRvb2xiYXJQbGFjZUhvbGRlcjoiIiwgX2luU291cmNlTW9kZTpmYWxzZSwgX2h0bWxFZGl0Tm9kZTpudWxsLCB0b29sYmFyR3JvdXA6IiIsIHNoYXJlVG9vbGJhcjpmYWxzZSwgY29udGV4dE1lbnVHcm91cFNldDoiIiwgZWRpdG9yT25Mb2FkOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LkVkaXRvcjI6OnByZUxvYWRpbmdUb29sYmFyIiwgdGhpcyk7CisJaWYgKHRoaXMudG9vbGJhckFsd2F5c1Zpc2libGUpIHsKKwkJZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkFsd2F5c1Nob3dUb29sYmFyIik7CisJfQorCWlmICh0aGlzLnRvb2xiYXJXaWRnZXQpIHsKKwkJdGhpcy50b29sYmFyV2lkZ2V0LnNob3coKTsKKwkJZG9qby5odG1sLmluc2VydEJlZm9yZSh0aGlzLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSwgdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnNoYXJlVG9vbGJhcikgeworCQkJZG9qby5kZXByZWNhdGVkKCJFZGl0b3IyOnNoYXJlVG9vbGJhciBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRvb2xiYXJHcm91cCIsICIwLjUiKTsKKwkJCXRoaXMudG9vbGJhckdyb3VwID0gImRlZmF1bHREb2pvVG9vbGJhckdyb3VwIjsKKwkJfQorCQlpZiAodGhpcy50b29sYmFyR3JvdXApIHsKKwkJCWlmIChkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckdyb3Vwc1t0aGlzLnRvb2xiYXJHcm91cF0pIHsKKwkJCQl0aGlzLnRvb2xiYXJXaWRnZXQgPSBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckdyb3Vwc1t0aGlzLnRvb2xiYXJHcm91cF07CisJCQl9CisJCX0KKwkJaWYgKCF0aGlzLnRvb2xiYXJXaWRnZXQpIHsKKwkJCXZhciB0Yk9wdHMgPSB7c2hhcmVHcm91cDp0aGlzLnRvb2xiYXJHcm91cCwgcGFyZW50OnRoaXN9OworCQkJdGJPcHRzLnRlbXBsYXRlU3RyaW5nID0gZG9qby51cmkuY2FjaGUuZ2V0KHRoaXMudG9vbGJhclRlbXBsYXRlUGF0aCk7CisJCQlpZiAodGhpcy50b29sYmFyVGVtcGxhdGVDc3NQYXRoKSB7CisJCQkJdGJPcHRzLnRlbXBsYXRlQ3NzUGF0aCA9IHRoaXMudG9vbGJhclRlbXBsYXRlQ3NzUGF0aDsKKwkJCQl0Yk9wdHMudGVtcGxhdGVDc3NTdHJpbmcgPSBkb2pvLnVyaS5jYWNoZS5nZXQodGhpcy50b29sYmFyVGVtcGxhdGVDc3NQYXRoKTsKKwkJCX0KKwkJCWlmICh0aGlzLnRvb2xiYXJQbGFjZUhvbGRlcikgeworCQkJCXRoaXMudG9vbGJhcldpZGdldCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMlRvb2xiYXIiLCB0Yk9wdHMsIGRvam8uYnlJZCh0aGlzLnRvb2xiYXJQbGFjZUhvbGRlciksICJhZnRlciIpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnRvb2xiYXJXaWRnZXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJUb29sYmFyIiwgdGJPcHRzLCB0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCwgImJlZm9yZSIpOworCQkJfQorCQkJaWYgKHRoaXMudG9vbGJhckdyb3VwKSB7CisJCQkJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHNbdGhpcy50b29sYmFyR3JvdXBdID0gdGhpcy50b29sYmFyV2lkZ2V0OworCQkJfQorCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJjbG9zZSIsIHRoaXMudG9vbGJhcldpZGdldCwgImhpZGUiKTsKKwkJCXRoaXMudG9vbGJhckxvYWRlZCgpOworCQl9CisJfQorCWRvam8uZXZlbnQudG9waWMucmVnaXN0ZXJQdWJsaXNoZXIoIkVkaXRvcjIuY2xvYmJlckZvY3VzIiwgdGhpcywgImNsb2JiZXJGb2N1cyIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJFZGl0b3IyLmNsb2JiZXJGb2N1cyIsIHRoaXMsICJzZXRCbHVyIik7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkb2pvLndpZGdldC5FZGl0b3IyOjpvbkxvYWQiLCB0aGlzKTsKK30sIHRvb2xiYXJMb2FkZWQ6ZnVuY3Rpb24gKCkgeworfSwgcmVnaXN0ZXJMb2FkZWRQbHVnaW46ZnVuY3Rpb24gKG9iaikgeworCWlmICghdGhpcy5sb2FkZWRQbHVnaW5zKSB7CisJCXRoaXMubG9hZGVkUGx1Z2lucyA9IFtdOworCX0KKwl0aGlzLmxvYWRlZFBsdWdpbnMucHVzaChvYmopOworfSwgdW5yZWdpc3RlckxvYWRlZFBsdWdpbjpmdW5jdGlvbiAob2JqKSB7CisJZm9yICh2YXIgaSBpbiB0aGlzLmxvYWRlZFBsdWdpbnMpIHsKKwkJaWYgKHRoaXMubG9hZGVkUGx1Z2luc1tpXSA9PT0gb2JqKSB7CisJCQlkZWxldGUgdGhpcy5sb2FkZWRQbHVnaW5zW2ldOworCQkJcmV0dXJuOworCQl9CisJfQorCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LkVkaXRvcjIudW5yZWdpc3RlckxvYWRlZFBsdWdpbjogdW5rbm93IHBsdWdpbiBvYmplY3Q6ICIgKyBvYmopOworfSwgZXhlY0NvbW1hbmQ6ZnVuY3Rpb24gKGNvbW1hbmQsIGFyZ3VtZW50KSB7CisJc3dpdGNoIChjb21tYW5kLnRvTG93ZXJDYXNlKCkpIHsKKwkgIGNhc2UgImh0bWx0b2dnbGUiOgorCQl0aGlzLnRvZ2dsZUh0bWxFZGl0aW5nKCk7CisJCWJyZWFrOworCSAgZGVmYXVsdDoKKwkJZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLmV4ZWNDb21tYW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorfSwgcXVlcnlDb21tYW5kRW5hYmxlZDpmdW5jdGlvbiAoY29tbWFuZCwgYXJndW1lbnQpIHsKKwlzd2l0Y2ggKGNvbW1hbmQudG9Mb3dlckNhc2UoKSkgeworCSAgY2FzZSAiaHRtbHRvZ2dsZSI6CisJCXJldHVybiB0cnVlOworCSAgZGVmYXVsdDoKKwkJaWYgKHRoaXMuX2luU291cmNlTW9kZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBkb2pvLndpZGdldC5FZGl0b3IyLnN1cGVyY2xhc3MucXVlcnlDb21tYW5kRW5hYmxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KK30sIHF1ZXJ5Q29tbWFuZFN0YXRlOmZ1bmN0aW9uIChjb21tYW5kLCBhcmd1bWVudCkgeworCXN3aXRjaCAoY29tbWFuZC50b0xvd2VyQ2FzZSgpKSB7CisJICBjYXNlICJodG1sdG9nZ2xlIjoKKwkJcmV0dXJuIHRoaXMuX2luU291cmNlTW9kZTsKKwkgIGRlZmF1bHQ6CisJCXJldHVybiBkb2pvLndpZGdldC5FZGl0b3IyLnN1cGVyY2xhc3MucXVlcnlDb21tYW5kU3RhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9Cit9LCBvbkNsaWNrOmZ1bmN0aW9uIChlKSB7CisJZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLm9uQ2xpY2suY2FsbCh0aGlzLCBlKTsKKwlpZiAoZG9qby53aWRnZXQuUG9wdXBNYW5hZ2VyKSB7CisJCWlmICghZSkgeworCQkJZSA9IHRoaXMud2luZG93LmV2ZW50OworCQl9CisJCWRvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5vbkNsaWNrKGUpOworCX0KK30sIGNsb2JiZXJGb2N1czpmdW5jdGlvbiAoKSB7Cit9LCB0b2dnbGVIdG1sRWRpdGluZzpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMgPT09IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpKSB7CisJCWlmICghdGhpcy5faW5Tb3VyY2VNb2RlKSB7CisJCQl2YXIgaHRtbCA9IHRoaXMuZ2V0RWRpdG9yQ29udGVudCgpOworCQkJdGhpcy5faW5Tb3VyY2VNb2RlID0gdHJ1ZTsKKwkJCWlmICghdGhpcy5faHRtbEVkaXROb2RlKSB7CisJCQkJdGhpcy5faHRtbEVkaXROb2RlID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworCQkJCWRvam8uaHRtbC5pbnNlcnRBZnRlcih0aGlzLl9odG1sRWRpdE5vZGUsIHRoaXMuZWRpdG9yT2JqZWN0KTsKKwkJCX0KKwkJCXRoaXMuX2h0bWxFZGl0Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQl0aGlzLl9odG1sRWRpdE5vZGUuc3R5bGUud2lkdGggPSAiMTAwJSI7CisJCQl0aGlzLl9odG1sRWRpdE5vZGUuc3R5bGUuaGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmVkaXROb2RlKS5oZWlnaHQgKyAicHgiOworCQkJdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlID0gaHRtbDsKKwkJCXdpdGggKHRoaXMuZWRpdG9yT2JqZWN0LnN0eWxlKSB7CisJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCWxlZnQgPSAiLTIwMDBweCI7CisJCQkJdG9wID0gIi0yMDAwcHgiOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5faW5Tb3VyY2VNb2RlID0gZmFsc2U7CisJCQl0aGlzLl9odG1sRWRpdE5vZGUuYmx1cigpOworCQkJd2l0aCAodGhpcy5lZGl0b3JPYmplY3Quc3R5bGUpIHsKKwkJCQlwb3NpdGlvbiA9ICIiOworCQkJCWxlZnQgPSAiIjsKKwkJCQl0b3AgPSAiIjsKKwkJCX0KKwkJCXZhciBodG1sID0gdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlOworCQkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgInJlcGxhY2VFZGl0b3JDb250ZW50IiwgMSwgaHRtbCk7CisJCQl0aGlzLl9odG1sRWRpdE5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJCXRoaXMuZm9jdXMoKTsKKwkJfQorCQl0aGlzLm9uRGlzcGxheUNoYW5nZWQobnVsbCwgdHJ1ZSk7CisJfQorfSwgc2V0Rm9jdXM6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKSA9PT0gdGhpcykgeworCQlyZXR1cm47CisJfQorCXRoaXMuY2xvYmJlckZvY3VzKCk7CisJZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuc2V0Q3VycmVudEluc3RhbmNlKHRoaXMpOworfSwgc2V0Qmx1cjpmdW5jdGlvbiAoKSB7Cit9LCBzYXZlU2VsZWN0aW9uOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9ib29rbWFyayA9IG51bGw7CisJdGhpcy5fYm9va21hcmsgPSBkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csIGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0Qm9va21hcmspOworfSwgcmVzdG9yZVNlbGVjdGlvbjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2Jvb2ttYXJrKSB7CisJCXRoaXMuZm9jdXMoKTsKKwkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAibW92ZVRvQm9va21hcmsiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5fYm9va21hcmtdKTsKKwkJdGhpcy5fYm9va21hcmsgPSBudWxsOworCX0gZWxzZSB7CisJCWRvam8uZGVidWcoInJlc3RvcmVTZWxlY3Rpb246IG5vIHNhdmVkIHNlbGVjdGlvbiBpcyBmb3VuZCEiKTsKKwl9Cit9LCBfdXBkYXRlVG9vbGJhckxhc3RSYW46bnVsbCwgX3VwZGF0ZVRvb2xiYXJUaW1lcjpudWxsLCBfdXBkYXRlVG9vbGJhckZyZXF1ZW5jeTo1MDAsIHVwZGF0ZVRvb2xiYXI6ZnVuY3Rpb24gKGZvcmNlKSB7CisJaWYgKCghdGhpcy5pc0xvYWRlZCkgfHwgKCF0aGlzLnRvb2xiYXJXaWRnZXQpKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGRpZmYgPSBuZXcgRGF0ZSgpIC0gdGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW47CisJaWYgKCghZm9yY2UpICYmICh0aGlzLl91cGRhdGVUb29sYmFyTGFzdFJhbikgJiYgKChkaWZmIDwgdGhpcy5fdXBkYXRlVG9vbGJhckZyZXF1ZW5jeSkpKSB7CisJCWNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVUb29sYmFyVGltZXIpOworCQl2YXIgX3RoaXMgPSB0aGlzOworCQl0aGlzLl91cGRhdGVUb29sYmFyVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKwkJCV90aGlzLnVwZGF0ZVRvb2xiYXIoKTsKKwkJfSwgdGhpcy5fdXBkYXRlVG9vbGJhckZyZXF1ZW5jeSAvIDIpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJdGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW4gPSBuZXcgRGF0ZSgpOworCX0KKwlpZiAoZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT09IHRoaXMpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLnRvb2xiYXJXaWRnZXQudXBkYXRlKCk7Cit9LCBkZXN0cm95OmZ1bmN0aW9uIChmaW5hbGl6ZSkgeworCXRoaXMuX2h0bWxFZGl0Tm9kZSA9IG51bGw7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMsICJjbG9zZSIsIHRoaXMudG9vbGJhcldpZGdldCwgImhpZGUiKTsKKwlpZiAoIWZpbmFsaXplKSB7CisJCXRoaXMudG9vbGJhcldpZGdldC5kZXN0cm95KCk7CisJfQorCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7Cit9LCBfbGFzdFN0YXRlVGltZXN0YW1wOjAsIG9uRGlzcGxheUNoYW5nZWQ6ZnVuY3Rpb24gKGUsIGZvcmNlVXBkYXRlKSB7CisJdGhpcy5fbGFzdFN0YXRlVGltZXN0YW1wID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwlkb2pvLndpZGdldC5FZGl0b3IyLnN1cGVyY2xhc3Mub25EaXNwbGF5Q2hhbmdlZC5jYWxsKHRoaXMsIGUpOworCXRoaXMudXBkYXRlVG9vbGJhcihmb3JjZVVwZGF0ZSk7Cit9LCBvbkxvYWQ6ZnVuY3Rpb24gKCkgeworCXRyeSB7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkxvYWQuY2FsbCh0aGlzKTsKKwl9CisJY2F0Y2ggKGUpIHsKKwkJZG9qby5kZWJ1ZyhlKTsKKwl9CisJdGhpcy5lZGl0b3JPbkxvYWQoKTsKK30sIG9uRm9jdXM6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkZvY3VzLmNhbGwodGhpcyk7CisJdGhpcy5zZXRGb2N1cygpOworfSwgZ2V0RWRpdG9yQ29udGVudDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2luU291cmNlTW9kZSkgeworCQlyZXR1cm4gdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlOworCX0KKwlyZXR1cm4gZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLmdldEVkaXRvckNvbnRlbnQuY2FsbCh0aGlzKTsKK30sIHJlcGxhY2VFZGl0b3JDb250ZW50OmZ1bmN0aW9uIChodG1sKSB7CisJaWYgKHRoaXMuX2luU291cmNlTW9kZSkgeworCQl0aGlzLl9odG1sRWRpdE5vZGUudmFsdWUgPSBodG1sOworCQlyZXR1cm47CisJfQorCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5yZXBsYWNlRWRpdG9yQ29udGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZ2V0Q29tbWFuZDpmdW5jdGlvbiAobmFtZSkgeworCWlmICh0aGlzLl9sb2FkZWRDb21tYW5kc1tuYW1lXSkgeworCQlyZXR1cm4gdGhpcy5fbG9hZGVkQ29tbWFuZHNbbmFtZV07CisJfQorCXZhciBjbWQgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDb21tYW5kKHRoaXMsIG5hbWUpOworCXRoaXMuX2xvYWRlZENvbW1hbmRzW25hbWVdID0gY21kOworCXJldHVybiBjbWQ7Cit9LCBzaG9ydGN1dHM6W1siYm9sZCJdLCBbIml0YWxpYyJdLCBbInVuZGVybGluZSJdLCBbInNlbGVjdGFsbCIsICJhIl0sIFsiaW5zZXJ0dW5vcmRlcmVkbGlzdCIsICJcXCJdXSwgc2V0dXBEZWZhdWx0U2hvcnRjdXRzOmZ1bmN0aW9uICgpIHsKKwl2YXIgZXhlYyA9IGZ1bmN0aW9uIChjbWQpIHsKKwkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJCWNtZC5leGVjdXRlKCk7CisJCX07CisJfTsKKwl2YXIgc2VsZiA9IHRoaXM7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5zaG9ydGN1dHMsIGZ1bmN0aW9uIChpdGVtKSB7CisJCXZhciBjbWQgPSBzZWxmLmdldENvbW1hbmQoaXRlbVswXSk7CisJCWlmIChjbWQpIHsKKwkJCXNlbGYuYWRkS2V5SGFuZGxlcihpdGVtWzFdID8gaXRlbVsxXSA6IGl0ZW1bMF0uY2hhckF0KDApLCBpdGVtWzJdID09IHVuZGVmaW5lZCA/IHNlbGYuS0VZX0NUUkwgOiBpdGVtWzJdLCBleGVjKGNtZCkpOworCQl9CisJfSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9BbHdheXNTaG93VG9vbGJhci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9BbHdheXNTaG93VG9vbGJhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI3MDdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0Fsd2F5c1Nob3dUb29sYmFyLmpzCkBAIC0wLDAgKzEsMTE4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkFsd2F5c1Nob3dUb29sYmFyIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiZG9qby53aWRnZXQuRWRpdG9yMjo6b25Mb2FkIiwgZnVuY3Rpb24gKGVkaXRvcikgeworCWlmIChlZGl0b3IudG9vbGJhckFsd2F5c1Zpc2libGUpIHsKKwkJdmFyIHAgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5BbHdheXNTaG93VG9vbGJhcihlZGl0b3IpOworCX0KK30pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkFsd2F5c1Nob3dUb29sYmFyIiwgbnVsbCwgZnVuY3Rpb24gKGVkaXRvcikgeworCXRoaXMuZWRpdG9yID0gZWRpdG9yOworCXRoaXMuZWRpdG9yLnJlZ2lzdGVyTG9hZGVkUGx1Z2luKHRoaXMpOworCXRoaXMuc2V0dXAoKTsKK30sIHtfc2Nyb2xsU2V0VXA6ZmFsc2UsIF9maXhFbmFibGVkOmZhbHNlLCBfc2Nyb2xsVGhyZXNob2xkOmZhbHNlLCBfaGFuZGxlU2Nyb2xsOnRydWUsIHNldHVwOmZ1bmN0aW9uICgpIHsKKwl2YXIgdGRuID0gdGhpcy5lZGl0b3IudG9vbGJhcldpZGdldDsKKwlpZiAoIXRkbi50YkJnSWZyYW1lKSB7CisJCXRkbi50YkJnSWZyYW1lID0gbmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKHRkbi5kb21Ob2RlKTsKKwkJdGRuLnRiQmdJZnJhbWUub25SZXNpemVkKCk7CisJfQorCXRoaXMuc2Nyb2xsSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChkb2pvLmxhbmcuaGl0Y2godGhpcywgImdsb2JhbE9uU2Nyb2xsSGFuZGxlciIpLCAxMDApOworCWRvam8uZXZlbnQuY29ubmVjdCgiYmVmb3JlIiwgdGhpcy5lZGl0b3IudG9vbGJhcldpZGdldCwgImRlc3Ryb3kiLCB0aGlzLCAiZGVzdHJveSIpOworfSwgZ2xvYmFsT25TY3JvbGxIYW5kbGVyOmZ1bmN0aW9uICgpIHsKKwl2YXIgaXNJRSA9IGRvam8ucmVuZGVyLmh0bWwuaWU7CisJaWYgKCF0aGlzLl9oYW5kbGVTY3JvbGwpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgZGggPSBkb2pvLmh0bWw7CisJdmFyIHRkbiA9IHRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQuZG9tTm9kZTsKKwl2YXIgZGIgPSBkb2pvLmJvZHkoKTsKKwlpZiAoIXRoaXMuX3Njcm9sbFNldFVwKSB7CisJCXRoaXMuX3Njcm9sbFNldFVwID0gdHJ1ZTsKKwkJdmFyIGVkaXRvcldpZHRoID0gZGguZ2V0TWFyZ2luQm94KHRoaXMuZWRpdG9yLmRvbU5vZGUpLndpZHRoOworCQl0aGlzLl9zY3JvbGxUaHJlc2hvbGQgPSBkaC5hYnModGRuLCB0cnVlKS55OworCQlpZiAoKGlzSUUpICYmIChkYikgJiYgKGRoLmdldFN0eWxlKGRiLCAiYmFja2dyb3VuZC1pbWFnZSIpID09ICJub25lIikpIHsKKwkJCXdpdGggKGRiLnN0eWxlKSB7CisJCQkJYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2JsYW5rLmdpZiIpICsgIikiOworCQkJCWJhY2tncm91bmRBdHRhY2htZW50ID0gImZpeGVkIjsKKwkJCX0KKwkJfQorCX0KKwl2YXIgc2Nyb2xsUG9zID0gKHdpbmRvd1sicGFnZVlPZmZzZXQiXSkgPyB3aW5kb3dbInBhZ2VZT2Zmc2V0Il0gOiAoZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdIHx8IGRvY3VtZW50WyJib2R5Il0pLnNjcm9sbFRvcDsKKwlpZiAoc2Nyb2xsUG9zID4gdGhpcy5fc2Nyb2xsVGhyZXNob2xkKSB7CisJCWlmICghdGhpcy5fZml4RW5hYmxlZCkgeworCQkJdmFyIHRkbmJveCA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGRuKTsKKwkJCXRoaXMuZWRpdG9yLmVkaXRvck9iamVjdC5zdHlsZS5tYXJnaW5Ub3AgPSB0ZG5ib3guaGVpZ2h0ICsgInB4IjsKKwkJCWlmIChpc0lFKSB7CisJCQkJdGRuLnN0eWxlLmxlZnQgPSBkb2pvLmh0bWwuYWJzKHRkbiwgZG9qby5odG1sLmJveFNpemluZy5NQVJHSU5fQk9YKS54OworCQkJCWlmICh0ZG4ucHJldmlvdXNTaWJsaW5nKSB7CisJCQkJCXRoaXMuX0lFT3JpZ2luYWxQb3MgPSBbImFmdGVyIiwgdGRuLnByZXZpb3VzU2libGluZ107CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRkbi5uZXh0U2libGluZykgeworCQkJCQkJdGhpcy5fSUVPcmlnaW5hbFBvcyA9IFsiYmVmb3JlIiwgdGRuLm5leHRTaWJsaW5nXTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMuX0lFT3JpZ2luYWxQb3MgPSBbIiIsIHRkbi5wYXJlbnROb2RlXTsKKwkJCQkJfQorCQkJCX0KKwkJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0ZG4pOworCQkJCWRvam8uaHRtbC5hZGRDbGFzcyh0ZG4sICJJRUZpeGVkVG9vbGJhciIpOworCQkJfSBlbHNlIHsKKwkJCQl3aXRoICh0ZG4uc3R5bGUpIHsKKwkJCQkJcG9zaXRpb24gPSAiZml4ZWQiOworCQkJCQl0b3AgPSAiMHB4IjsKKwkJCQl9CisJCQl9CisJCQl0ZG4uc3R5bGUud2lkdGggPSB0ZG5ib3gud2lkdGggKyAicHgiOworCQkJdGRuLnN0eWxlLnpJbmRleCA9IDEwMDA7CisJCQl0aGlzLl9maXhFbmFibGVkID0gdHJ1ZTsKKwkJfQorCQlpZiAoIWRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSB7CisJCQl2YXIgZUhlaWdodCA9ICh0aGlzLmhlaWdodCkgPyBwYXJzZUludCh0aGlzLmVkaXRvci5oZWlnaHQpIDogdGhpcy5lZGl0b3IuX2xhc3RIZWlnaHQ7CisJCQlpZiAoc2Nyb2xsUG9zID4gKHRoaXMuX3Njcm9sbFRocmVzaG9sZCArIGVIZWlnaHQpKSB7CisJCQkJdGRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl9IGVsc2UgeworCQkJCXRkbi5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGhpcy5fZml4RW5hYmxlZCkgeworCQkJKHRoaXMuZWRpdG9yLm9iamVjdCB8fCB0aGlzLmVkaXRvci5pZnJhbWUpLnN0eWxlLm1hcmdpblRvcCA9IG51bGw7CisJCQl3aXRoICh0ZG4uc3R5bGUpIHsKKwkJCQlwb3NpdGlvbiA9ICIiOworCQkJCXRvcCA9ICIiOworCQkJCXpJbmRleCA9ICIiOworCQkJCWRpc3BsYXkgPSAiIjsKKwkJCX0KKwkJCWlmIChpc0lFKSB7CisJCQkJdGRuLnN0eWxlLmxlZnQgPSAiIjsKKwkJCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGRuLCAiSUVGaXhlZFRvb2xiYXIiKTsKKwkJCQlpZiAodGhpcy5fSUVPcmlnaW5hbFBvcykgeworCQkJCQlkb2pvLmh0bWwuaW5zZXJ0QXRQb3NpdGlvbih0ZG4sIHRoaXMuX0lFT3JpZ2luYWxQb3NbMV0sIHRoaXMuX0lFT3JpZ2luYWxQb3NbMF0pOworCQkJCQl0aGlzLl9JRU9yaWdpbmFsUG9zID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRkbiwgdGhpcy5lZGl0b3Iub2JqZWN0IHx8IHRoaXMuZWRpdG9yLmlmcmFtZSk7CisJCQkJfQorCQkJfQorCQkJdGRuLnN0eWxlLndpZHRoID0gIiI7CisJCQl0aGlzLl9maXhFbmFibGVkID0gZmFsc2U7CisJCX0KKwl9Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9JRU9yaWdpbmFsUG9zID0gbnVsbDsKKwl0aGlzLl9oYW5kbGVTY3JvbGwgPSBmYWxzZTsKKwljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWwpOworCXRoaXMuZWRpdG9yLnVucmVnaXN0ZXJMb2FkZWRQbHVnaW4odGhpcyk7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSwgIklFRml4ZWRUb29sYmFyIik7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vQ29udGV4dE1lbnUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vQ29udGV4dE1lbnUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZTE3MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9Db250ZXh0TWVudS5qcwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5Db250ZXh0TWVudSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5NZW51MiIpOworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoImRvam8ud2lkZ2V0LkVkaXRvcjI6Om9uTG9hZCIsIGZ1bmN0aW9uIChlZGl0b3IpIHsKKwlkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNvbnRleHRNZW51TWFuYWdlci5nZXRDb250ZXh0TWVudShlZGl0b3IpOworfSk7Citkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNvbnRleHRNZW51TWFuYWdlciA9IHttZW51R3JvdXBzOlsiR2VuZXJpYyIsICJMaW5rIiwgIkFuY2hvciIsICJJbWFnZSIsICJMaXN0IiwgIlRhYmxlIl0sIF9jb250ZXh0TWVudUdyb3VwU2V0czp7fSwgX3JlZ2lzdGVyZWRHcm91cHM6e30sIF9tZW51czp7fSwgcmVnaXN0ZXJHcm91cDpmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikgeworCWlmICh0aGlzLl9yZWdpc3RlcmVkR3JvdXBzW25hbWVdKSB7CisJCWFsZXJ0KCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNvbnRleHRNZW51TWFuYWdlci5yZWdpc3Rlckdyb3VwOiBtZW51IGdyb3VwICIgKyBuYW1lICsgImlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gSWdub3JlZC4iKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9yZWdpc3RlcmVkR3JvdXBzW25hbWVdID0gaGFuZGxlcjsKK30sIHJlbW92ZUdyb3VwOmZ1bmN0aW9uIChuYW1lKSB7CisJZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRHcm91cHNbbmFtZV07Cit9LCBnZXRHcm91cDpmdW5jdGlvbiAobmFtZSwgY29udGV4dG1lbnVwbHVnaW4pIHsKKwlpZiAodGhpcy5fcmVnaXN0ZXJlZEdyb3Vwc1tuYW1lXSkgeworCQl2YXIgaXRlbSA9IHRoaXMuX3JlZ2lzdGVyZWRHcm91cHNbbmFtZV0obmFtZSwgY29udGV4dG1lbnVwbHVnaW4pOworCQlpZiAoaXRlbSkgeworCQkJcmV0dXJuIGl0ZW07CisJCX0KKwl9CisJc3dpdGNoIChuYW1lKSB7CisJICBjYXNlICJHZW5lcmljIjoKKwkgIGNhc2UgIkxpbmsiOgorCSAgY2FzZSAiSW1hZ2UiOgorCQlyZXR1cm4gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW5bbmFtZSArICJDb250ZXh0TWVudUdyb3VwIl0oY29udGV4dG1lbnVwbHVnaW4pOworCSAgY2FzZSAiQW5jaG9yIjoKKwkgIGNhc2UgIkxpc3QiOgorCX0KK30sIHJlZ2lzdGVyR3JvdXBTZXQ6ZnVuY3Rpb24gKG5hbWUsIHNldCkgeworCXRoaXMuX2NvbnRleHRNZW51R3JvdXBTZXRzW25hbWVdID0gc2V0OworfSwgcmVtb3ZlR3JvdXBTZXQ6ZnVuY3Rpb24gKG5hbWUpIHsKKwl2YXIgc2V0ID0gdGhpcy5fY29udGV4dE1lbnVHcm91cFNldHNbbmFtZV07CisJZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51R3JvdXBTZXRzW25hbWVdOworCXJldHVybiBzZXQ7Cit9LCBnZXRDb250ZXh0TWVudTpmdW5jdGlvbiAoZWRpdG9yKSB7CisJdmFyIHNldCA9IGVkaXRvci5jb250ZXh0TWVudUdyb3VwU2V0IHx8ICJkZWZhdWx0RG9qb0VkaXRvcjJNZW51R3JvdXBTZXQiOworCWlmICh0aGlzLl9tZW51c1tzZXRdKSB7CisJCXRoaXMuX21lbnVzW3NldF0uYmluZEVkaXRvcihlZGl0b3IpOworCQlyZXR1cm4gdGhpcy5fbWVudXNbc2V0XTsKKwl9CisJdmFyIGdzID0gKGVkaXRvci5jb250ZXh0TWVudUdyb3VwU2V0ICYmIHRoaXMuX2NvbnRleHRNZW51R3JvdXBTZXRzW2VkaXRvci5jb250ZXh0TWVudUdyb3VwU2V0XSkgfHwgdGhpcy5tZW51R3JvdXBzOworCXZhciBtZW51ID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uQ29udGV4dE1lbnUoZWRpdG9yLCBncyk7CisJdGhpcy5fbWVudXNbc2V0XSA9IG1lbnU7CisJcmV0dXJuIG1lbnU7Cit9fTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5Db250ZXh0TWVudSIsIG51bGwsIGZ1bmN0aW9uIChlZGl0b3IsIGdzKSB7CisJdGhpcy5ncm91cHMgPSBbXTsKKwl0aGlzLnNlcGFyYXRvcnMgPSBbXTsKKwl0aGlzLmVkaXRvciA9IGVkaXRvcjsKKwl0aGlzLmVkaXRvci5yZWdpc3RlckxvYWRlZFBsdWdpbih0aGlzKTsKKwl0aGlzLmNvbnRleHRNZW51ID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJQb3B1cE1lbnUyIiwge30pOworCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuY29udGV4dE1lbnUuZG9tTm9kZSk7CisJdGhpcy5iaW5kRWRpdG9yKHRoaXMuZWRpdG9yKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5jb250ZXh0TWVudSwgImFib3V0VG9TaG93IiwgdGhpcywgImFib3V0VG9TaG93Iik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZWRpdG9yLCAiZGVzdHJveSIsIHRoaXMsICJkZXN0cm95Iik7CisJdGhpcy5zZXR1cChncyk7Cit9LCB7YmluZEVkaXRvcjpmdW5jdGlvbiAoZWRpdG9yKSB7CisJdGhpcy5jb250ZXh0TWVudS5iaW5kRG9tTm9kZShlZGl0b3IuZG9jdW1lbnQuYm9keSk7Cit9LCBzZXR1cDpmdW5jdGlvbiAoZ3MpIHsKKwlmb3IgKHZhciBpIGluIGdzKSB7CisJCXZhciBnID0gZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5Db250ZXh0TWVudU1hbmFnZXIuZ2V0R3JvdXAoZ3NbaV0sIHRoaXMpOworCQlpZiAoZykgeworCQkJdGhpcy5ncm91cHMucHVzaChnKTsKKwkJfQorCX0KK30sIGFib3V0VG9TaG93OmZ1bmN0aW9uICgpIHsKKwl2YXIgZmlyc3QgPSB0cnVlOworCWZvciAodmFyIGkgaW4gdGhpcy5ncm91cHMpIHsKKwkJaWYgKGkgPiAwICYmIHRoaXMuc2VwYXJhdG9ycy5sZW5ndGggIT0gdGhpcy5ncm91cHMubGVuZ3RoIC0gMSkgeworCQkJdGhpcy5zZXBhcmF0b3JzLnB1c2goZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJNZW51U2VwYXJhdG9yMiIsIHt9KSk7CisJCQl0aGlzLmNvbnRleHRNZW51LmFkZENoaWxkKHRoaXMuc2VwYXJhdG9yc1t0aGlzLnNlcGFyYXRvcnMubGVuZ3RoIC0gMV0pOworCQl9CisJCWlmICh0aGlzLmdyb3Vwc1tpXS5yZWZyZXNoKCkpIHsKKwkJCWlmIChpID4gMCkgeworCQkJCWlmIChmaXJzdCkgeworCQkJCQl0aGlzLnNlcGFyYXRvcnNbaSAtIDFdLmhpZGUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnNlcGFyYXRvcnNbaSAtIDFdLnNob3coKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlyc3QpIHsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJdGhpcy5zZXBhcmF0b3JzW2kgLSAxXS5oaWRlKCk7CisJCQl9CisJCX0KKwl9Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwl0aGlzLmVkaXRvci51bnJlZ2lzdGVyTG9hZGVkUGx1Z2luKHRoaXMpOworCWRlbGV0ZSB0aGlzLmdyb3VwczsKKwlkZWxldGUgdGhpcy5zZXBhcmF0b3JzOworCXRoaXMuY29udGV4dE1lbnUuZGVzdHJveSgpOworCWRlbGV0ZSB0aGlzLmNvbnRleHRNZW51OworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyQ29udGV4dE1lbnVJdGVtIiwgZG9qby53aWRnZXQuTWVudUl0ZW0yLCB7Y29tbWFuZDoiIiwgYnVpbGRSZW5kZXJpbmc6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJdGhpcy5jYXB0aW9uID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuY29tbWFuZCkuZ2V0VGV4dCgpOworCWRvam8ud2lkZ2V0LkVkaXRvcjJDb250ZXh0TWVudUl0ZW0uc3VwZXJjbGFzcy5idWlsZFJlbmRlcmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgb25DbGljazpmdW5jdGlvbiAoKSB7CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwlpZiAoY3VySW5zdCkgeworCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5jb21tYW5kKTsKKwkJaWYgKF9jb21tYW5kKSB7CisJCQlfY29tbWFuZC5leGVjdXRlKCk7CisJCX0KKwl9Cit9LCByZWZyZXNoOmZ1bmN0aW9uICgpIHsKKwl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCWlmIChjdXJJbnN0KSB7CisJCXZhciBfY29tbWFuZCA9IGN1ckluc3QuZ2V0Q29tbWFuZCh0aGlzLmNvbW1hbmQpOworCQlpZiAoX2NvbW1hbmQpIHsKKwkJCWlmIChfY29tbWFuZC5nZXRTdGF0ZSgpID09IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCkgeworCQkJCXRoaXMuZGlzYWJsZSgpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5lbmFibGUoKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KK30sIGhpZGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworfSwgc2hvdzpmdW5jdGlvbiAoKSB7CisJdGhpcy5kb21Ob2RlLnN0eWxlLmRpc3BsYXkgPSAiIjsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVDb250ZXh0TWVudUdyb3VwIiwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHRtZW51cGx1Z2luKSB7CisJdGhpcy5jb250ZXh0TWVudSA9IGNvbnRleHRtZW51cGx1Z2luLmNvbnRleHRNZW51OworCXRoaXMuaXRlbXMgPSBbXTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoY29udGV4dG1lbnVwbHVnaW4sICJkZXN0cm95IiwgdGhpcywgImRlc3Ryb3kiKTsKK30sIHtyZWZyZXNoOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaXRlbXMubGVuZ3RoKSB7CisJCXRoaXMuY3JlYXRlSXRlbXMoKTsKKwkJZm9yICh2YXIgaSBpbiB0aGlzLml0ZW1zKSB7CisJCQl0aGlzLmNvbnRleHRNZW51LmFkZENoaWxkKHRoaXMuaXRlbXNbaV0pOworCQl9CisJfQorCXJldHVybiB0aGlzLmNoZWNrVmlzaWJpbGl0eSgpOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy5jb250ZXh0bWVudSA9IG51bGw7CisJZGVsZXRlIHRoaXMuaXRlbXM7CisJZGVsZXRlIHRoaXMuY29udGV4dE1lbnU7Cit9LCBjcmVhdGVJdGVtczpmdW5jdGlvbiAoKSB7Cit9LCBjaGVja1Zpc2liaWxpdHk6ZnVuY3Rpb24gKCkgeworCXZhciBzaG93ID0gZmFsc2U7CisJZm9yICh2YXIgaSBpbiB0aGlzLml0ZW1zKSB7CisJCXNob3cgPSBzaG93IHx8IHRoaXMuaXRlbXNbaV0ucmVmcmVzaCgpOworCX0KKwl2YXIgYWN0aW9uID0gc2hvdyA/ICJzaG93IiA6ICJoaWRlIjsKKwlmb3IgKHZhciBpIGluIHRoaXMuaXRlbXMpIHsKKwkJdGhpcy5pdGVtc1tpXVthY3Rpb25dKCk7CisJfQorCXJldHVybiBzaG93OworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkdlbmVyaWNDb250ZXh0TWVudUdyb3VwIiwgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVDb250ZXh0TWVudUdyb3VwLCB7Y3JlYXRlSXRlbXM6ZnVuY3Rpb24gKCkgeworCXRoaXMuaXRlbXMucHVzaChkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJDb250ZXh0TWVudUl0ZW0iLCB7Y29tbWFuZDoiY3V0IiwgaWNvbkNsYXNzOiJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0N1dCJ9KSk7CisJdGhpcy5pdGVtcy5wdXNoKGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMkNvbnRleHRNZW51SXRlbSIsIHtjb21tYW5kOiJjb3B5IiwgaWNvbkNsYXNzOiJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0NvcHkifSkpOworCXRoaXMuaXRlbXMucHVzaChkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJDb250ZXh0TWVudUl0ZW0iLCB7Y29tbWFuZDoicGFzdGUiLCBpY29uQ2xhc3M6ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUGFzdGUifSkpOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkxpbmtDb250ZXh0TWVudUdyb3VwIiwgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVDb250ZXh0TWVudUdyb3VwLCB7Y3JlYXRlSXRlbXM6ZnVuY3Rpb24gKCkgeworCXRoaXMuaXRlbXMucHVzaChkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJDb250ZXh0TWVudUl0ZW0iLCB7Y29tbWFuZDoiY3JlYXRlbGluayIsIGljb25DbGFzczoiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9MaW5rIn0pKTsKKwl0aGlzLml0ZW1zLnB1c2goZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJFZGl0b3IyQ29udGV4dE1lbnVJdGVtIiwge2NvbW1hbmQ6InVubGluayIsIGljb25DbGFzczoiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9VbkxpbmsifSkpOworfSwgY2hlY2tWaXNpYmlsaXR5OmZ1bmN0aW9uICgpIHsKKwl2YXIgc2hvdyA9IHRoaXMuaXRlbXNbMV0ucmVmcmVzaCgpOworCWlmIChzaG93KSB7CisJCXRoaXMuaXRlbXNbMF0ucmVmcmVzaCgpOworCQlmb3IgKHZhciBpIGluIHRoaXMuaXRlbXMpIHsKKwkJCXRoaXMuaXRlbXNbaV0uc2hvdygpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICh2YXIgaSBpbiB0aGlzLml0ZW1zKSB7CisJCQl0aGlzLml0ZW1zW2ldLmhpZGUoKTsKKwkJfQorCX0KKwlyZXR1cm4gc2hvdzsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5JbWFnZUNvbnRleHRNZW51R3JvdXAiLCBkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlNpbXBsZUNvbnRleHRNZW51R3JvdXAsIHtjcmVhdGVJdGVtczpmdW5jdGlvbiAoKSB7CisJdGhpcy5pdGVtcy5wdXNoKGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMkNvbnRleHRNZW51SXRlbSIsIHtjb21tYW5kOiJpbnNlcnRpbWFnZSIsIGljb25DbGFzczoiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JbWFnZSJ9KSk7Cit9LCBjaGVja1Zpc2liaWxpdHk6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJdmFyIGltZyA9IGRvam8ud2l0aEdsb2JhbChjdXJJbnN0LndpbmRvdywgImdldFNlbGVjdGVkRWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24pOworCWlmIChpbWcgJiYgaW1nLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiaW1nIikgeworCQl0aGlzLml0ZW1zWzBdLnNob3coKTsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJdGhpcy5pdGVtc1swXS5oaWRlKCk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9DcmVhdGVMaW5rRGlhbG9nLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0NyZWF0ZUxpbmtEaWFsb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9DcmVhdGVMaW5rRGlhbG9nLmpzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uQ3JlYXRlTGlua0RpYWxvZyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyQ3JlYXRlTGlua0RpYWxvZyIsIGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb250ZW50LCB7dGVtcGxhdGVTdHJpbmc6Ijx0YWJsZT5cbjx0cj48dGQ+VVJMPC90ZD48dGQ+IDxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cImxpbmtfaHJlZlwiIG5hbWU9XCJkb2pvX2NyZWF0ZUxpbmtfaHJlZlwiLz48L3RkPjwvdHI+XG48dHI+PHRkPlRhcmdldCA8L3RkPjx0ZD48c2VsZWN0IGRvam9BdHRhY2hQb2ludD1cImxpbmtfdGFyZ2V0XCI+XG5cdDxvcHRpb24gdmFsdWU9XCJcIj5TZWxmPC9vcHRpb24+XG5cdDxvcHRpb24gdmFsdWU9XCJfYmxhbmtcIj5OZXcgV2luZG93PC9vcHRpb24+XG5cdDxvcHRpb24gdmFsdWU9XCJfdG9wXCI+VG9wIFdpbmRvdzwvb3B0aW9uPlxuXHQ8L3NlbGVjdD48L3RkPjwvdHI+XG48dHI+PHRkPkNsYXNzIDwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cImxpbmtfY2xhc3NcIiAvPjwvdGQ+PC90cj5cbjx0cj48dGQgY29sc3Bhbj1cIjJcIj5cblx0PHRhYmxlPjx0cj5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOm9rJz5PSzwvYnV0dG9uPjwvdGQ+XG5cdDx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpjYW5jZWwnPkNhbmNlbDwvYnV0dG9uPjwvdGQ+XG5cdDwvdHI+PC90YWJsZT5cblx0PC90ZD48L3RyPlxuPC90YWJsZT5cbiIsIGVkaXRhYmxlQXR0cmlidXRlczpbImhyZWYiLCAidGFyZ2V0IiwgImNsYXNzIl0sIGxvYWRDb250ZW50OmZ1bmN0aW9uICgpIHsKKwl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCWN1ckluc3Quc2F2ZVNlbGVjdGlvbigpOworCXRoaXMubGlua05vZGUgPSBkb2pvLndpdGhHbG9iYWwoY3VySW5zdC53aW5kb3csICJnZXRBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbImEiXSk7CisJdmFyIGxpbmtBdHRyaWJ1dGVzID0ge307CisJdGhpcy5leHRyYUF0dHJpYlRleHQgPSAiIjsKKwlpZiAodGhpcy5saW5rTm9kZSkgeworCQl2YXIgYXR0cnMgPSB0aGlzLmxpbmtOb2RlLmF0dHJpYnV0ZXM7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChkb2pvLmxhbmcuZmluZCh0aGlzLmVkaXRhYmxlQXR0cmlidXRlcywgYXR0cnNbaV0ubmFtZS50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7CisJCQkJbGlua0F0dHJpYnV0ZXNbYXR0cnNbaV0ubmFtZV0gPSBhdHRyc1tpXS52YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGF0dHJzW2ldLnNwZWNpZmllZCA9PSB1bmRlZmluZWQgfHwgYXR0cnNbaV0uc3BlY2lmaWVkKSB7CisJCQkJCXRoaXMuZXh0cmFBdHRyaWJUZXh0ICs9IGF0dHJzW2ldLm5hbWUgKyAiPVwiIiArIGF0dHJzW2ldLnZhbHVlICsgIlwiICI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdmFyIGh0bWwgPSBkb2pvLndpdGhHbG9iYWwoY3VySW5zdC53aW5kb3csICJnZXRTZWxlY3RlZFRleHQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uKTsKKwkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCA9PSAwKSB7CisJCQlhbGVydCgiUGxlYXNlIHNlbGVjdCBzb21lIHRleHQgdG8gY3JlYXRlIGEgbGluay4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWRpdGFibGVBdHRyaWJ1dGVzLmxlbmd0aDsgKytpKSB7CisJCW5hbWUgPSB0aGlzLmVkaXRhYmxlQXR0cmlidXRlc1tpXTsKKwkJdGhpc1sibGlua18iICsgbmFtZV0udmFsdWUgPSAobGlua0F0dHJpYnV0ZXNbbmFtZV0gPT0gdW5kZWZpbmVkKSA/ICIiIDogbGlua0F0dHJpYnV0ZXNbbmFtZV07CisJfQorCXJldHVybiB0cnVlOworfSwgb2s6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJY3VySW5zdC5yZXN0b3JlU2VsZWN0aW9uKCk7CisJaWYgKCF0aGlzLmxpbmtOb2RlKSB7CisJCXZhciBodG1sID0gZG9qby53aXRoR2xvYmFsKGN1ckluc3Qud2luZG93LCAiZ2V0U2VsZWN0ZWRIdG1sIiwgZG9qby5odG1sLnNlbGVjdGlvbik7CisJfSBlbHNlIHsKKwkJdmFyIGh0bWwgPSB0aGlzLmxpbmtOb2RlLmlubmVySFRNTDsKKwkJZG9qby53aXRoR2xvYmFsKGN1ckluc3Qud2luZG93LCAic2VsZWN0RWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFt0aGlzLmxpbmtOb2RlXSk7CisJfQorCXZhciBhdHRzdHIgPSAiIjsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWRpdGFibGVBdHRyaWJ1dGVzLmxlbmd0aDsgKytpKSB7CisJCW5hbWUgPSB0aGlzLmVkaXRhYmxlQXR0cmlidXRlc1tpXTsKKwkJdmFyIHZhbHVlID0gdGhpc1sibGlua18iICsgbmFtZV0udmFsdWU7CisJCWlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CisJCQlhdHRzdHIgKz0gbmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIgIjsKKwkJfQorCX0KKwljdXJJbnN0LmV4ZWNDb21tYW5kKCJpbnNlcnRodG1sIiwgIjxhICIgKyBhdHRzdHIgKyB0aGlzLmV4dHJhQXR0cmliVGV4dCArICI+IiArIGh0bWwgKyAiPC9hPiIpOworCXRoaXMuY2FuY2VsKCk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9GaW5kUmVwbGFjZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9GaW5kUmVwbGFjZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEyN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0ZpbmRSZXBsYWNlLmpzCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uRmluZFJlcGxhY2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRWRpdG9yMiIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkZpbmRDb21tYW5kIiwgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQsIHtTZWFyY2hPcHRpb246e0Nhc2VTZW5zaXRpdmU6NCwgU2VhcmNoQmFja3dhcmRzOjY0LCBXaG9sZVdvcmQ6MiwgV3JhcFNlYXJjaDoxMjh9LCBmaW5kOmZ1bmN0aW9uICh0ZXh0LCBvcHRpb24pIHsKKwl0aGlzLl9lZGl0b3IuZm9jdXMoKTsKKwlpZiAod2luZG93LmZpbmQpIHsKKwkJdGhpcy5fZWRpdG9yLndpbmRvdy5maW5kKHRleHQsIG9wdGlvbiAmIHRoaXMuU2VhcmNoT3B0aW9uLkNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2UsIG9wdGlvbiAmIHRoaXMuU2VhcmNoT3B0aW9uLlNlYXJjaEJhY2t3YXJkcyA/IHRydWUgOiBmYWxzZSwgb3B0aW9uICYgdGhpcy5TZWFyY2hPcHRpb24uV3JhcFNlYXJjaCA/IHRydWUgOiBmYWxzZSwgb3B0aW9uICYgdGhpcy5TZWFyY2hPcHRpb24uV2hvbGVXb3JkID8gdHJ1ZSA6IGZhbHNlKTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5ib2R5KCkuY3JlYXRlVGV4dFJhbmdlKSB7CisJCQl2YXIgcmFuZ2UgPSB0aGlzLl9lZGl0b3IuZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJCXZhciBmb3VuZCA9IHJhbmdlLmZpbmRUZXh0KHRleHQsIChvcHRpb24gJiB0aGlzLlNlYXJjaE9wdGlvbi5TZWFyY2hCYWNrd2FyZHMpID8gMSA6IC0xLCBvcHRpb24pOworCQkJaWYgKGZvdW5kKSB7CisJCQkJcmFuZ2Uuc2Nyb2xsSW50b1ZpZXcoKTsKKwkJCQlyYW5nZS5zZWxlY3QoKTsKKwkJCX0gZWxzZSB7CisJCQkJYWxlcnQoIkNhbiBub3QgZmluZCAiICsgdGV4dCArICIgaW4gdGhlIGRvY3VtZW50Iik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhbGVydCgiTm8gaWRlYSBob3cgdG8gc2VhcmNoIGluIHRoaXMgYnJvd3Nlci4gUGxlYXNlIHN1Ym1pdCBwYXRjaCBpZiB5b3Uga25vdy4iKTsKKwkJfQorCX0KK30sIGdldFRleHQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiAiRmluZCI7Cit9fSk7Citkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkZpbmRSZXBsYWNlID0ge2dldENvbW1hbmQ6ZnVuY3Rpb24gKGVkaXRvciwgbmFtZSkgeworCXZhciBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCXZhciBjb21tYW5kOworCWlmIChuYW1lID09ICJmaW5kIikgeworCQljb21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uRmluZENvbW1hbmQoZWRpdG9yLCAiZmluZCIsIHtjb250ZW50RmlsZToiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5GaW5kUmVwbGFjZURpYWxvZyIsIGNvbnRlbnRDbGFzczoiRWRpdG9yMkZpbmREaWFsb2ciLCB0aXRsZToiRmluZCIsIHdpZHRoOiIzNTBweCIsIGhlaWdodDoiMTUwcHgiLCBtb2RhbDpmYWxzZX0pOworCX0gZWxzZSB7CisJCWlmIChuYW1lID09ICJyZXBsYWNlIikgeworCQkJY29tbWFuZCA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29tbWFuZChlZGl0b3IsICJyZXBsYWNlIiwge2NvbnRlbnRGaWxlOiJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkZpbmRSZXBsYWNlRGlhbG9nIiwgY29udGVudENsYXNzOiJFZGl0b3IyUmVwbGFjZURpYWxvZyIsIGhyZWY6ZG9qby51cmkuY2FjaGUuc2V0KGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL3JlcGxhY2UuaHRtbCIpLCAiPHRhYmxlIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbjx0cj48dGQ+RmluZDogPC90ZD48dGQ+IDxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cInJlcGxhY2VfdGV4dFwiIC8+PC90ZD48L3RyPlxuPHRyPjx0ZD5SZXBsYWNlIHdpdGg6IDwvdGQ+PHRkPiA8aW5wdXQgdHlwZT1cInRleHRcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXBsYWNlX3RleHRcIiAvPjwvdGQ+PC90cj5cbjx0cj48dGQgY29sc3Bhbj0nMic+PHRhYmxlPjx0cj48dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRvam9UeXBlPVwiQ2hlY2tCb3hcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXBsYWNlX29wdGlvbl9jYXNlc2Vuc1wiIGlkPVwiZG9qb19yZXBsYWNlX29wdGlvbl9jYXNlc2Vuc1wiIC8+XG5cdFx0PGxhYmVsIGZvcj1cImRvam9fcmVwbGFjZV9vcHRpb25fY2FzZXNlbnNcIj5DYXNlIFNlbnNpdGl2ZTwvbGFiZWw+PC90ZD5cblx0XHRcdDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZG9qb1R5cGU9XCJDaGVja0JveFwiIGRvam9BdHRhY2hQb2ludD1cInJlcGxhY2Vfb3B0aW9uX2JhY2t3YXJkc1wiIGlkPVwiZG9qb19yZXBsYWNlX29wdGlvbl9iYWNrd2FyZHNcIiAvPlxuXHRcdDxsYWJlbCBmb3I9XCJkb2pvX3JlcGxhY2Vfb3B0aW9uX2JhY2t3YXJkc1wiPlNlYXJjaCBCYWNrd2FyZHM8L2xhYmVsPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj5cbjx0cj48dGQgY29sc3Bhbj0yXCI+XG5cdDx0YWJsZT48dHI+XG5cdDx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpyZXBsYWNlJz5SZXBsYWNlPC9idXR0b24+PC90ZD5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOnJlcGxhY2VBbGwnPlJlcGxhY2UgQWxsPC9idXR0b24+PC90ZD5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOmNhbmNlbCc+Q2xvc2U8L2J1dHRvbj48L3RkPlxuXHQ8L3RyPjwvdGFibGU+XG5cdDwvdGQ+PC90cj5cbjwvdGFibGU+XG4iKSwgdGl0bGU6IlJlcGxhY2UiLCB3aWR0aDoiMzUwcHgiLCBoZWlnaHQ6IjIwMHB4IiwgbW9kYWw6ZmFsc2V9KTsKKwkJfQorCX0KKwlyZXR1cm4gY29tbWFuZDsKK30sIGdldFRvb2xiYXJJdGVtOmZ1bmN0aW9uIChuYW1lKSB7CisJdmFyIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJdmFyIGl0ZW07CisJaWYgKG5hbWUgPT0gInJlcGxhY2UiKSB7CisJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24oIlJlcGxhY2UiKTsKKwl9IGVsc2UgeworCQlpZiAobmFtZSA9PSAiZmluZCIpIHsKKwkJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24oIkZpbmQiKTsKKwkJfQorCX0KKwlyZXR1cm4gaXRlbTsKK319OworZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIucmVnaXN0ZXJIYW5kbGVyKGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uRmluZFJlcGxhY2UuZ2V0Q29tbWFuZCk7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLnJlZ2lzdGVySGFuZGxlcihkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkZpbmRSZXBsYWNlLmdldFRvb2xiYXJJdGVtKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0ZpbmRSZXBsYWNlRGlhbG9nLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0ZpbmRSZXBsYWNlRGlhbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTE4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vRmluZFJlcGxhY2VEaWFsb2cuanMKQEAgLTAsMCArMSwzNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5GaW5kUmVwbGFjZURpYWxvZyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyRmluZERpYWxvZyIsIGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb250ZW50LCB7dGVtcGxhdGVTdHJpbmc6Ijx0YWJsZSBzdHlsZT1cIndoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG48dHI+PHRkIGNvbHNwYW49JzInPkZpbmQ6IDxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cImZpbmRfdGV4dFwiIC8+PC90ZD48L3RyPlxuPHRyPjx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZG9qb1R5cGU9XCJDaGVja0JveFwiIGRvam9BdHRhY2hQb2ludD1cImZpbmRfb3B0aW9uX2Nhc2VzZW5zXCIgLz5cblx0XHQ8bGFiZWwgZm9yPVwiZmluZF9vcHRpb25fY2FzZXNlbnNcIj5DYXNlIFNlbnNpdGl2ZTwvbGFiZWw+PC90ZD5cblx0XHRcdDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZG9qb1R5cGU9XCJDaGVja0JveFwiIGRvam9BdHRhY2hQb2ludD1cImZpbmRfb3B0aW9uX2JhY2t3YXJkc1wiIC8+XG5cdFx0PGxhYmVsIGZvcj1cImZpbmRfb3B0aW9uX2JhY2t3YXJkc1wiPlNlYXJjaCBCYWNrd2FyZHM8L2xhYmVsPjwvdGQ+PC90cj5cbjx0cj48dGQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkb2pvVHlwZT1cIkNoZWNrQm94XCIgZG9qb0F0dGFjaFBvaW50PVwiZmluZF9vcHRpb25fd2hvbGV3b3JkXCIgLz5cblx0XHQ8bGFiZWwgZm9yPVwiZmluZF9vcHRpb25fd2hvbGV3b3JkXCI+V2hvbGUgV29yZDwvbGFiZWw+PC90ZD5cbjx0cj48dGQgY29sc3Bhbj1cIjFcIj5cblx0PHRhYmxlPjx0cj5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOmZpbmQnPkZpbmQ8L2J1dHRvbj48L3RkPlxuXHQ8dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6Y2FuY2VsJz5DbG9zZTwvYnV0dG9uPjwvdGQ+XG5cdDwvdHI+PC90YWJsZT5cblx0PC90ZD48L3RyPlxuPC90YWJsZT5cbiIsIGZpbmQ6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJdmFyIGZpbmRjbWQgPSBjdXJJbnN0LmdldENvbW1hbmQoImZpbmQiKTsKKwl2YXIgb3B0aW9uID0gMDsKKwlpZiAodGhpc1siZmluZF9vcHRpb25fY2FzZXNlbnMiXS5jaGVja2VkKSB7CisJCW9wdGlvbiB8PSBmaW5kY21kLlNlYXJjaE9wdGlvbi5DYXNlU2Vuc2l0aXZlOworCX0KKwlpZiAodGhpc1siZmluZF9vcHRpb25fYmFja3dhcmRzIl0uY2hlY2tlZCkgeworCQlvcHRpb24gfD0gZmluZGNtZC5TZWFyY2hPcHRpb24uU2VhcmNoQmFja3dhcmRzOworCX0KKwlpZiAodGhpc1siZmluZF9vcHRpb25fd2hvbGV3b3JkIl0uY2hlY2tlZCkgeworCQlvcHRpb24gfD0gZmluZGNtZC5TZWFyY2hPcHRpb24uV2hvbGVXb3JkOworCX0KKwlmaW5kY21kLmZpbmQodGhpc1siZmluZF90ZXh0Il0udmFsdWUsIG9wdGlvbik7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkVkaXRvcjJSZXBsYWNlRGlhbG9nIiwgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbnRlbnQsIHt0ZW1wbGF0ZVN0cmluZzoiPHRhYmxlIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbjx0cj48dGQ+RmluZDogPC90ZD48dGQ+IDxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cInJlcGxhY2VfdGV4dFwiIC8+PC90ZD48L3RyPlxuPHRyPjx0ZD5SZXBsYWNlIHdpdGg6IDwvdGQ+PHRkPiA8aW5wdXQgdHlwZT1cInRleHRcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXBsYWNlX3RleHRcIiAvPjwvdGQ+PC90cj5cbjx0cj48dGQgY29sc3Bhbj0nMic+PHRhYmxlPjx0cj48dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRvam9UeXBlPVwiQ2hlY2tCb3hcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXBsYWNlX29wdGlvbl9jYXNlc2Vuc1wiIGlkPVwiZG9qb19yZXBsYWNlX29wdGlvbl9jYXNlc2Vuc1wiIC8+XG5cdFx0PGxhYmVsIGZvcj1cImRvam9fcmVwbGFjZV9vcHRpb25fY2FzZXNlbnNcIj5DYXNlIFNlbnNpdGl2ZTwvbGFiZWw+PC90ZD5cblx0XHRcdDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZG9qb1R5cGU9XCJDaGVja0JveFwiIGRvam9BdHRhY2hQb2ludD1cInJlcGxhY2Vfb3B0aW9uX2JhY2t3YXJkc1wiIGlkPVwiZG9qb19yZXBsYWNlX29wdGlvbl9iYWNrd2FyZHNcIiAvPlxuXHRcdDxsYWJlbCBmb3I9XCJkb2pvX3JlcGxhY2Vfb3B0aW9uX2JhY2t3YXJkc1wiPlNlYXJjaCBCYWNrd2FyZHM8L2xhYmVsPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj5cbjx0cj48dGQgY29sc3Bhbj0yXCI+XG5cdDx0YWJsZT48dHI+XG5cdDx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpyZXBsYWNlJz5SZXBsYWNlPC9idXR0b24+PC90ZD5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOnJlcGxhY2VBbGwnPlJlcGxhY2UgQWxsPC9idXR0b24+PC90ZD5cblx0PHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOmNhbmNlbCc+Q2xvc2U8L2J1dHRvbj48L3RkPlxuXHQ8L3RyPjwvdGFibGU+XG5cdDwvdGQ+PC90cj5cbjwvdGFibGU+XG4iLCByZXBsYWNlOmZ1bmN0aW9uICgpIHsKKwlhbGVydCgibm90IGltcGxlbWVudGVkIHlldCIpOworfSwgcmVwbGFjZUFsbDpmdW5jdGlvbiAoKSB7CisJYWxlcnQoIm5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0luc2VydEltYWdlRGlhbG9nLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyUGx1Z2luL0luc2VydEltYWdlRGlhbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWRlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vSW5zZXJ0SW1hZ2VEaWFsb2cuanMKQEAgLTAsMCArMSw1NSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5JbnNlcnRJbWFnZURpYWxvZyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IySW5zZXJ0SW1hZ2VEaWFsb2ciLCBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCwge3RlbXBsYXRlU3RyaW5nOiI8dGFibGUgY2VsbHNwYWNpbmc9XCIxXCIgY2VsbHBhZGRpbmc9XCIxXCIgYm9yZGVyPVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj5cblx0PHRyPlxuXHRcdDx0ZD5cblx0XHRcdDx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIwXCI+XG5cdFx0XHRcdDx0cj5cblx0XHRcdFx0XHQ8dGQgd2lkdGg9XCIxMDAlXCI+XG5cdFx0XHRcdFx0XHQ8c3Bhbj5VUkw8L3NwYW4+XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgbm93cmFwPVwibm93cmFwXCIgcm93c3Bhbj1cIjJcIj5cblx0XHRcdFx0XHRcdDwhLS1pbnB1dCBpZD1cImJ0bkJyb3dzZVwiIG9uY2xpY2s9XCJCcm93c2VTZXJ2ZXIoKTtcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJCcm93c2UgU2VydmVyXCIvLS0+XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZCB2YWxpZ249XCJ0b3BcIj5cblx0XHRcdFx0XHRcdDxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9XCJpbWFnZV9zcmNcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCIgdHlwZT1cInRleHRcIiAvPlxuXHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHQ8L3RhYmxlPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG5cdDx0cj5cblx0XHQ8dGQ+XG5cdFx0XHQ8c3Bhbj5BbHRlcm5hdGl2ZSBUZXh0PC9zcGFuPjxiciAvPlxuXHRcdFx0PGlucHV0IGRvam9BdHRhY2hQb2ludD1cImltYWdlX2FsdFwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIiB0eXBlPVwidGV4dFwiIC8+PGJyIC8+XG5cdFx0PC90ZD5cblx0PC90cj5cblx0PHRyPlxuXHRcdDx0ZCB2YWxpZ249XCJ0b3BcIj5cblx0XHRcdDx0YWJsZT48dHI+PHRkPlxuXHRcdFx0XHRcdFx0PHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBub3dyYXA9XCJub3dyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPldpZHRoPC9zcGFuPiZuYnNwOzwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjNcIiBkb2pvQXR0YWNoUG9pbnQ9XCJpbWFnZV93aWR0aFwiIC8+PC90ZD5cblxuXHRcdFx0XHRcdFx0XHRcdDx0ZCByb3dzcGFuPVwiMlwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLWRpdiBpZD1cImJ0bkxvY2tTaXplc1wiIGNsYXNzPVwiQnRuTG9ja2VkXCIgb25tb3VzZW92ZXI9XCJ0aGlzLmNsYXNzTmFtZSA9IChiTG9ja1JhdGlvID8gJ0J0bkxvY2tlZCcgOiAnQnRuVW5sb2NrZWQnICkgKyAnIEJ0bk92ZXInO1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9ubW91c2VvdXQ9XCJ0aGlzLmNsYXNzTmFtZSA9IChiTG9ja1JhdGlvID8gJ0J0bkxvY2tlZCcgOiAnQnRuVW5sb2NrZWQnICk7XCIgdGl0bGU9XCJMb2NrIFNpemVzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25jbGljaz1cIlN3aXRjaExvY2sodGhpcyk7XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdi0tPlxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIHJvd3NwYW49XCIyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8IS0tZGl2IGlkPVwiYnRuUmVzZXRTaXplXCIgY2xhc3M9XCJCdG5SZXNldFwiIG9ubW91c2VvdmVyPVwidGhpcy5jbGFzc05hbWU9J0J0blJlc2V0IEJ0bk92ZXInO1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9ubW91c2VvdXQ9XCJ0aGlzLmNsYXNzTmFtZT0nQnRuUmVzZXQnO1wiIHRpdGxlPVwiUmVzZXQgU2l6ZVwiIG9uY2xpY2s9XCJSZXNldFNpemVzKCk7XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdi0tPlxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBub3dyYXA9XCJub3dyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPkhlaWdodDwvc3Bhbj4mbmJzcDs8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHNpemU9XCIzXCIgZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VfaGVpZ2h0XCIgLz48L3RkPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHQ8L3RkPjx0ZD5cblxuXHRcdFx0XHRcdFx0PHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXG5cdFx0XHRcdFx0XHRcdFx0PHRkIG5vd3JhcD1cIm5vd3JhcFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gPkhTcGFjZTwvc3Bhbj4mbmJzcDs8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHNpemU9XCIyXCIgZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VfaHNwYWNlXCIvPjwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0XHRcdDx0cj5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgbm93cmFwPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiA+VlNwYWNlPC9zcGFuPiZuYnNwOzwvdGQ+XG5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBzaXplPVwiMlwiIGRvam9BdHRhY2hQb2ludD1cImltYWdlX3ZzcGFjZVwiIC8+PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdDwvdGFibGU+XG5cdFx0XHRcdFx0PC90ZD48L3RyPlxuXHRcdFx0XHRcdDx0cj48dGQgY29sc3Bhbj1cIjJcIj5cblx0XHRcdFx0XHRcdDx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiBib3JkZXI9XCIwXCI+XG5cdFx0XHRcdFx0XHRcdDx0cj5cblx0XHRcdFx0XHRcdFx0XHQ8dGQgbm93cmFwPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj5Cb3JkZXI8L3NwYW4+Jm5ic3A7PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBzaXplPVwiMlwiIHZhbHVlPVwiXCIgZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VfYm9yZGVyXCIgLz48L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBub3dyYXA9XCJub3dyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuID5BbGlnbjwvc3Bhbj4mbmJzcDs8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VfYWxpZ25cIj5cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiXCIgc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiPjwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImFic0JvdHRvbVwiPkFicyBCb3R0b208L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImFic01pZGRsZVwiPkFicyBNaWRkbGU8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImJhc2VsaW5lXCI+QmFzZWxpbmU8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImJvdHRvbVwiPkJvdHRvbTwvb3B0aW9uPlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJtaWRkbGVcIj5NaWRkbGU8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInRleHRUb3BcIj5UZXh0IFRvcDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwidG9wXCI+VG9wPC9vcHRpb24+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8L3RyPjwvdGFibGU+XG5cdFx0PC90ZD5cblx0PC90cj5cblx0PHRyPjx0ZD5cblx0XHQ8dGFibGU+PHRyPlxuXHRcdDx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpvayc+T0s8L2J1dHRvbj48L3RkPlxuXHRcdDx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpjYW5jZWwnPkNhbmNlbDwvYnV0dG9uPjwvdGQ+XG5cdFx0PC90cj48L3RhYmxlPlxuXHQ8L3RkPjwvdHI+XG48L3RhYmxlPlxuIiwgZWRpdGFibGVBdHRyaWJ1dGVzOlsic3JjIiwgImFsdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAiaHNwYWNlIiwgInZzcGFjZSIsICJib3JkZXIiLCAiYWxpZ24iXSwgbG9hZENvbnRlbnQ6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJdGhpcy5pbWFnZU5vZGUgPSBkb2pvLndpdGhHbG9iYWwoY3VySW5zdC53aW5kb3csICJnZXRTZWxlY3RlZEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uKTsKKwlpZiAoIXRoaXMuaW1hZ2VOb2RlKSB7CisJCXRoaXMuaW1hZ2VOb2RlID0gZG9qby53aXRoR2xvYmFsKGN1ckluc3Qud2luZG93LCAiZ2V0QW5jZXN0b3JFbGVtZW50IiwgZG9qby5odG1sLnNlbGVjdGlvbiwgWyJpbWciXSk7CisJfQorCXZhciBpbWFnZUF0dHJpYnV0ZXMgPSB7fTsKKwl0aGlzLmV4dHJhQXR0cmliVGV4dCA9ICIiOworCWlmICh0aGlzLmltYWdlTm9kZSkgeworCQl2YXIgYXR0cnMgPSB0aGlzLmltYWdlTm9kZS5hdHRyaWJ1dGVzOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZG9qby5sYW5nLmZpbmQodGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXMsIGF0dHJzW2ldLm5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkgeworCQkJCWltYWdlQXR0cmlidXRlc1thdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmV4dHJhQXR0cmliVGV4dCArPSBhdHRyc1tpXS5uYW1lICsgIj1cIiIgKyBhdHRyc1tpXS52YWx1ZSArICJcIiAiOworCQkJfQorCQl9CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsKKwkJbmFtZSA9IHRoaXMuZWRpdGFibGVBdHRyaWJ1dGVzW2ldOworCQl0aGlzWyJpbWFnZV8iICsgbmFtZV0udmFsdWUgPSAoaW1hZ2VBdHRyaWJ1dGVzW25hbWVdID09IHVuZGVmaW5lZCkgPyAiIiA6IGltYWdlQXR0cmlidXRlc1tuYW1lXTsKKwl9CisJcmV0dXJuIHRydWU7Cit9LCBvazpmdW5jdGlvbiAoKSB7CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwl2YXIgaW5zZXJ0Y21kID0gY3VySW5zdC5nZXRDb21tYW5kKCJpbnNlcnRodG1sIik7CisJdmFyIG9wdGlvbiA9IDA7CisJdmFyIGF0dHN0ciA9ICIiOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsKKwkJbmFtZSA9IHRoaXMuZWRpdGFibGVBdHRyaWJ1dGVzW2ldOworCQl2YXIgdmFsdWUgPSB0aGlzWyJpbWFnZV8iICsgbmFtZV0udmFsdWU7CisJCWlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CisJCQlhdHRzdHIgKz0gbmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIgIjsKKwkJfQorCX0KKwlpZiAodGhpcy5pbWFnZU5vZGUpIHsKKwkJZG9qby53aXRoR2xvYmFsKGN1ckluc3Qud2luZG93LCAic2VsZWN0RWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFt0aGlzLmltYWdlTm9kZV0pOworCX0KKwlpbnNlcnRjbWQuZXhlY3V0ZSgiPGltZyAiICsgYXR0c3RyICsgdGhpcy5leHRyYUF0dHJpYlRleHQgKyAiLz4iKTsKKwl0aGlzLmNhbmNlbCgpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vSW5zZXJ0VGFibGVEaWFsb2cuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vSW5zZXJ0VGFibGVEaWFsb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhOTA1NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9JbnNlcnRUYWJsZURpYWxvZy5qcwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5JbnNlcnRUYWJsZURpYWxvZyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IySW5zZXJ0VGFibGVEaWFsb2ciLCBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2PlxuPHRhYmxlIGNlbGxTcGFjaW5nPVwiMVwiIGNlbGxQYWRkaW5nPVwiMVwiIHdpZHRoPVwiMTAwJVwiIGJvcmRlcj1cIjBcIj5cblx0PHRyPlxuXHRcdDx0ZCB2YWxpZ249XCJ0b3BcIj5cblx0XHRcdDx0YWJsZSBjZWxsU3BhY2luZz1cIjBcIiBjZWxsUGFkZGluZz1cIjBcIiBib3JkZXI9XCIwXCI+XG5cdFx0XHRcdDx0cj5cblxuXHRcdFx0XHRcdDx0ZD48c3Bhbj5Sb3dzPC9zcGFuPjo8L3RkPlxuXHRcdFx0XHRcdDx0ZD4mbmJzcDs8aW5wdXQgZG9qb0F0dGFjaFBvaW50PVwidGFibGVfcm93c1wiIHR5cGU9XCJ0ZXh0XCIgbWF4TGVuZ3RoPVwiM1wiIHNpemU9XCIyXCIgdmFsdWU9XCIzXCI+PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZD48c3Bhbj5Db2x1bW5zPC9zcGFuPjo8L3RkPlxuXHRcdFx0XHRcdDx0ZD4mbmJzcDs8aW5wdXQgZG9qb0F0dGFjaFBvaW50PVwidGFibGVfY29sc1wiIHR5cGU9XCJ0ZXh0XCIgbWF4TGVuZ3RoPVwiMlwiIHNpemU9XCIyXCIgdmFsdWU9XCIyXCI+PC90ZD5cblx0XHRcdFx0PC90cj5cblxuXHRcdFx0XHQ8dHI+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzwvdGQ+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHRcdDx0cj5cblx0XHRcdFx0XHQ8dGQ+PHNwYW4+Qm9yZGVyIHNpemU8L3NwYW4+OjwvdGQ+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzxJTlBVVCBkb2pvQXR0YWNoUG9pbnQ9XCJ0YWJsZV9ib3JkZXJcIiB0eXBlPVwidGV4dFwiIG1heExlbmd0aD1cIjJcIiBzaXplPVwiMlwiIHZhbHVlPVwiMVwiPjwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZD48c3Bhbj5BbGlnbm1lbnQ8L3NwYW4+OjwvdGQ+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzxzZWxlY3QgZG9qb0F0dGFjaFBvaW50PVwidGFibGVfYWxpZ25cIj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIlwiIHNlbGVjdGVkPiZsdDtOb3Qgc2V0Jmd0Ozwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImNlbnRlclwiPkNlbnRlcjwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicmlnaHRcIj5SaWdodDwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0PC9zZWxlY3Q+PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdDwvdGFibGU+XG5cdFx0PC90ZD5cblx0XHQ8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cblx0XHQ8dGQgYWxpZ249XCJyaWdodFwiIHZhbGlnbj1cInRvcFwiPlxuXHRcdFx0PHRhYmxlIGNlbGxTcGFjaW5nPVwiMFwiIGNlbGxQYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZD48c3Bhbj5XaWR0aDwvc3Bhbj46PC90ZD5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PGlucHV0IGRvam9BdHRhY2hQb2ludD1cInRhYmxlX3dpZHRoXCIgdHlwZT1cInRleHRcIiBtYXhMZW5ndGg9XCI0XCIgc2l6ZT1cIjNcIj48L3RkPlxuXHRcdFx0XHRcdDx0ZD4mbmJzcDs8c2VsZWN0IGRvam9BdHRhY2hQb2ludD1cInRhYmxlX3dpZHRodHlwZVwiPlxuXHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicGVyY2VudFwiIHNlbGVjdGVkPnBlcmNlbnQ8L29wdGlvbj5cblx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInBpeGVsc1wiPnBpeGVsczwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0PC9zZWxlY3Q+PC90ZD5cblxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8dHI+XG5cdFx0XHRcdFx0PHRkPjxzcGFuPkhlaWdodDwvc3Bhbj46PC90ZD5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PElOUFVUIGRvam9BdHRhY2hQb2ludD1cInRhYmxlX2hlaWdodFwiIHR5cGU9XCJ0ZXh0XCIgbWF4TGVuZ3RoPVwiNFwiIHNpemU9XCIzXCI+PC90ZD5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PHNwYW4+cGl4ZWxzPC9zcGFuPjwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHRcdDx0cj5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PC90ZD5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PC90ZD5cblx0XHRcdFx0XHQ8dGQ+Jm5ic3A7PC90ZD5cblx0XHRcdFx0PC90cj5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZCBub3dyYXA+PHNwYW4+Q2VsbCBzcGFjaW5nPC9zcGFuPjo8L3RkPlxuXHRcdFx0XHRcdDx0ZD4mbmJzcDs8aW5wdXQgZG9qb0F0dGFjaFBvaW50PVwidGFibGVfY2VsbHNwYWNpbmdcIiB0eXBlPVwidGV4dFwiIG1heExlbmd0aD1cIjJcIiBzaXplPVwiMlwiIHZhbHVlPVwiMVwiPjwvdGQ+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzwvdGQ+XG5cblx0XHRcdFx0PC90cj5cblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZCBub3dyYXA+PHNwYW4+Q2VsbCBwYWRkaW5nPC9zcGFuPjo8L3RkPlxuXHRcdFx0XHRcdDx0ZD4mbmJzcDs8aW5wdXQgZG9qb0F0dGFjaFBvaW50PVwidGFibGVfY2VsbHBhZGRpbmdcIiB0eXBlPVwidGV4dFwiIG1heExlbmd0aD1cIjJcIiBzaXplPVwiMlwiIHZhbHVlPVwiMVwiPjwvdGQ+XG5cdFx0XHRcdFx0PHRkPiZuYnNwOzwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHQ8L3RhYmxlPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG48L3RhYmxlPlxuPHRhYmxlIGNlbGxTcGFjaW5nPVwiMFwiIGNlbGxQYWRkaW5nPVwiMFwiIHdpZHRoPVwiMTAwJVwiIGJvcmRlcj1cIjBcIj5cblx0PHRyPlxuXHRcdDx0ZCBub3dyYXA+PHNwYW4+Q2FwdGlvbjwvc3Bhbj46PC90ZD5cblx0XHQ8dGQ+Jm5ic3A7PC90ZD5cblx0XHQ8dGQgd2lkdGg9XCIxMDAlXCIgbm93cmFwPiZuYnNwO1xuXHRcdFx0PGlucHV0IGRvam9BdHRhY2hQb2ludD1cInRhYmxlX2NhcHRpb25cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiV0lEVEg6IDkwJVwiPjwvdGQ+XG5cdDwvdHI+XG5cdDx0cj5cblx0XHQ8dGQgbm93cmFwPjxzcGFuPlN1bW1hcnk8L3NwYW4+OjwvdGQ+XG5cdFx0PHRkPiZuYnNwOzwvdGQ+XG5cdFx0PHRkIHdpZHRoPVwiMTAwJVwiIG5vd3JhcD4mbmJzcDtcblx0XHRcdDxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9XCJ0YWJsZV9zdW1tYXJ5XCIgdHlwZT1cInRleHRcIiBzdHlsZT1cIldJRFRIOiA5MCVcIj48L3RkPlxuXHQ8L3RyPlxuPC90YWJsZT5cbjx0YWJsZT48dHI+XG48dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6b2snPk9rPC9idXR0b24+PC90ZD5cbjx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpjYW5jZWwnPkNhbmNlbDwvYnV0dG9uPjwvdGQ+XG48L3RyPjwvdGFibGU+XG48L2Rpdj5cbiIsIGVkaXRhYmxlQXR0cmlidXRlczpbInN1bW1hcnkiLCAiaGVpZ2h0IiwgImNlbGxzcGFjaW5nIiwgImNlbGxwYWRkaW5nIiwgImJvcmRlciIsICJhbGlnbiJdLCBsb2FkQ29udGVudDpmdW5jdGlvbiAoKSB7CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwljdXJJbnN0LnNhdmVTZWxlY3Rpb24oKTsKKwl0aGlzLnRhYmxlTm9kZSA9IGRvam8ud2l0aEdsb2JhbChjdXJJbnN0LndpbmRvdywgImdldFNlbGVjdGVkRWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24pOworCWlmICghdGhpcy50YWJsZU5vZGUgfHwgdGhpcy50YWJsZU5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJ0YWJsZSIpIHsKKwkJdGhpcy50YWJsZU5vZGUgPSBkb2pvLndpdGhHbG9iYWwoY3VySW5zdC53aW5kb3csICJnZXRBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbInRhYmxlIl0pOworCX0KKwl2YXIgdGFibGVBdHRyaWJ1dGVzID0ge307CisJdGhpcy5leHRyYUF0dHJpYlRleHQgPSAiIjsKKwlpZiAodGhpcy50YWJsZU5vZGUpIHsKKwkJdGhpc1sidGFibGVfcm93cyJdLnZhbHVlID0gdGhpcy50YWJsZU5vZGUucm93cy5sZW5ndGg7CisJCXRoaXNbInRhYmxlX3Jvd3MiXS5kaXNhYmxlZCA9IHRydWU7CisJCXRoaXNbInRhYmxlX2NvbHMiXS52YWx1ZSA9IHRoaXMudGFibGVOb2RlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOworCQl0aGlzWyJ0YWJsZV9jb2xzIl0uZGlzYWJsZWQgPSB0cnVlOworCQlpZiAodGhpcy50YWJsZU5vZGUuY2FwdGlvbikgeworCQkJdGhpc1sidGFibGVfY2FwdGlvbiJdLnZhbHVlID0gdGhpcy50YWJsZU5vZGUuY2FwdGlvbi5pbm5lckhUTUw7CisJCX0gZWxzZSB7CisJCQl0aGlzWyJ0YWJsZV9jYXB0aW9uIl0udmFsdWUgPSAiIjsKKwkJfQorCQl2YXIgd2lkdGggPSB0aGlzLnRhYmxlTm9kZS5zdHlsZS53aWR0aCB8fCB0aGlzLnRhYmxlTm9kZS53aWR0aDsKKwkJaWYgKHdpZHRoKSB7CisJCQl0aGlzWyJ0YWJsZV93aWR0aCJdLnZhbHVlID0gcGFyc2VJbnQod2lkdGgpOworCQkJaWYgKHdpZHRoLmluZGV4T2YoIiUiKSA+IC0xKSB7CisJCQkJdGhpc1sidGFibGVfd2lkdGh0eXBlIl0udmFsdWUgPSAicGVyY2VudCI7CisJCQl9IGVsc2UgeworCQkJCXRoaXNbInRhYmxlX3dpZHRodHlwZSJdLnZhbHVlID0gInBpeGVscyI7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzWyJ0YWJsZV93aWR0aCJdLnZhbHVlID0gIjEwMCI7CisJCX0KKwkJdmFyIGhlaWdodCA9IHRoaXMudGFibGVOb2RlLnN0eWxlLmhlaWdodCB8fCB0aGlzLnRhYmxlTm9kZS5oZWlnaHQ7CisJCWlmIChoZWlnaHQpIHsKKwkJCXRoaXNbInRhYmxlX2hlaWdodCJdLnZhbHVlID0gcGFyc2VJbnQod2lkdGgpOworCQl9IGVsc2UgeworCQkJdGhpc1sidGFibGVfaGVpZ2h0Il0udmFsdWUgPSAiIjsKKwkJfQorCQl2YXIgYXR0cnMgPSB0aGlzLnRhYmxlTm9kZS5hdHRyaWJ1dGVzOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZG9qby5sYW5nLmZpbmQodGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXMsIGF0dHJzW2ldLm5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkgeworCQkJCXRhYmxlQXR0cmlidXRlc1thdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmV4dHJhQXR0cmliVGV4dCArPSBhdHRyc1tpXS5uYW1lICsgIj1cIiIgKyBhdHRyc1tpXS52YWx1ZSArICJcIiAiOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdGhpc1sidGFibGVfcm93cyJdLnZhbHVlID0gMzsKKwkJdGhpc1sidGFibGVfcm93cyJdLmRpc2FibGVkID0gZmFsc2U7CisJCXRoaXNbInRhYmxlX2NvbHMiXS52YWx1ZSA9IDI7CisJCXRoaXNbInRhYmxlX2NvbHMiXS5kaXNhYmxlZCA9IGZhbHNlOworCQl0aGlzWyJ0YWJsZV93aWR0aCJdLnZhbHVlID0gMTAwOworCQl0aGlzWyJ0YWJsZV93aWR0aHR5cGUiXS52YWx1ZSA9ICJwZXJjZW50IjsKKwkJdGhpc1sidGFibGVfaGVpZ2h0Il0udmFsdWUgPSAiIjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVkaXRhYmxlQXR0cmlidXRlcy5sZW5ndGg7ICsraSkgeworCQluYW1lID0gdGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXNbaV07CisJCXRoaXNbInRhYmxlXyIgKyBuYW1lXS52YWx1ZSA9ICh0YWJsZUF0dHJpYnV0ZXNbbmFtZV0gPT0gdW5kZWZpbmVkKSA/ICIiIDogdGFibGVBdHRyaWJ1dGVzW25hbWVdOworCQlpZiAobmFtZSA9PSAiaGVpZ2h0IiAmJiB0YWJsZUF0dHJpYnV0ZXNbbmFtZV0gIT0gdW5kZWZpbmVkKSB7CisJCQl0aGlzWyJ0YWJsZV8iICsgbmFtZV0udmFsdWUgPSB0YWJsZUF0dHJpYnV0ZXNbbmFtZV07CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9LCBvazpmdW5jdGlvbiAoKSB7CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwl2YXIgYXJncyA9IHt9OworCWFyZ3NbInJvd3MiXSA9IHRoaXNbInRhYmxlX3Jvd3MiXS52YWx1ZTsKKwlhcmdzWyJjb2xzIl0gPSB0aGlzWyJ0YWJsZV9jb2xzIl0udmFsdWU7CisJYXJnc1siY2FwdGlvbiJdID0gdGhpc1sidGFibGVfY2FwdGlvbiJdLnZhbHVlOworCWFyZ3NbInRhYmxlYXR0cnMiXSA9ICIiOworCWlmICh0aGlzWyJ0YWJsZV93aWR0aHR5cGUiXS52YWx1ZSA9PSAicGVyY2VudCIpIHsKKwkJYXJnc1sidGFibGVhdHRycyJdICs9ICJ3aWR0aD1cIiIgKyB0aGlzWyJ0YWJsZV93aWR0aCJdLnZhbHVlICsgIiVcIiAiOworCX0gZWxzZSB7CisJCWFyZ3NbInRhYmxlYXR0cnMiXSArPSAid2lkdGg9XCIiICsgdGhpc1sidGFibGVfd2lkdGgiXS52YWx1ZSArICJweFwiICI7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0YWJsZUF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsKKwkJdmFyIG5hbWUgPSB0aGlzLmVkaXRhYmxlQXR0cmlidXRlc1tpXTsKKwkJdmFyIHZhbHVlID0gdGhpc1sidGFibGVfIiArIG5hbWVdLnZhbHVlOworCQlpZiAodmFsdWUubGVuZ3RoID4gMCkgeworCQkJYXJnc1sidGFibGVhdHRycyJdICs9IG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiICI7CisJCX0KKwl9CisJaWYgKCFhcmdzWyJ0YWJsZWF0dHJzIl0pIHsKKwkJYXJnc1sidGFibGVhdHRycyJdID0gIiI7CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllICYmICF0aGlzWyJ0YWJsZV9ib3JkZXIiXS52YWx1ZSkgeworCQlhcmdzWyJ0YWJsZWF0dHJzIl0gKz0gImNsYXNzPVwiZG9qb1Nob3dJRVRhYmxlQm9yZGVyc1wiICI7CisJfQorCXZhciBodG1sID0gIjx0YWJsZSAiICsgYXJnc1sidGFibGVhdHRycyJdICsgIj4iOworCWlmIChhcmdzWyJjYXB0aW9uIl0pIHsKKwkJaHRtbCArPSAiPGNhcHRpb24+IiArIGFyZ3NbImNhcHRpb24iXSArICI8L2NhcHRpb24+IjsKKwl9CisJdmFyIG91dGVydGJvZHkgPSAiPHRib2R5PiI7CisJaWYgKHRoaXMudGFibGVOb2RlKSB7CisJCXZhciB0Ym9keSA9IHRoaXMudGFibGVOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdOworCQlvdXRlcnRib2R5ID0gdGJvZHkub3V0ZXJIVE1MOworCQlpZiAoIW91dGVydGJvZHkpIHsKKwkJCXZhciBjbm9kZSA9IHRib2R5LmNsb25lTm9kZSh0cnVlKTsKKwkJCXZhciB0bXBub2RlID0gdGJvZHkub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCXRtcG5vZGUuYXBwZW5kQ2hpbGQoY25vZGUpOworCQkJb3V0ZXJ0Ym9keSA9IHRtcG5vZGUuaW5uZXJIVE1MOworCQl9CisJCWRvam8ud2l0aEdsb2JhbChjdXJJbnN0LndpbmRvdywgInNlbGVjdEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy50YWJsZU5vZGVdKTsKKwl9IGVsc2UgeworCQl2YXIgY29scyA9ICI8dHI+IjsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCArYXJncy5jb2xzOyBpKyspIHsKKwkJCWNvbHMgKz0gIjx0ZD48L3RkPiI7CisJCX0KKwkJY29scyArPSAiPC90cj4iOworCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3Mucm93czsgaSsrKSB7CisJCQlvdXRlcnRib2R5ICs9IGNvbHM7CisJCX0KKwkJb3V0ZXJ0Ym9keSArPSAiPC90Ym9keT4iOworCX0KKwlodG1sICs9IG91dGVydGJvZHkgKyAiPC90YWJsZT4iOworCWN1ckluc3QucmVzdG9yZVNlbGVjdGlvbigpOworCWN1ckluc3QuZXhlY0NvbW1hbmQoImluc2VydGh0bWwiLCBodG1sKTsKKwl0aGlzLmNhbmNlbCgpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vU2ltcGxlU2lnbmFsQ29tbWFuZHMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vU2ltcGxlU2lnbmFsQ29tbWFuZHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjMzE0NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9TaW1wbGVTaWduYWxDb21tYW5kcy5qcwpAQCAtMCwwICsxLDUyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlNpbXBsZVNpZ25hbENvbW1hbmRzIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkVkaXRvcjIiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVTaWduYWxDb21tYW5kIiwgZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQsIGZ1bmN0aW9uIChlZGl0b3IsIG5hbWUpIHsKKwlpZiAoZG9qby53aWRnZXQuRWRpdG9yMi5wcm90b3R5cGVbbmFtZV0gPT0gdW5kZWZpbmVkKSB7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjIucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKCkgeworCQl9OworCX0KK30sIHtleGVjdXRlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9lZGl0b3JbdGhpcy5fbmFtZV0oKTsKK319KTsKK2lmIChkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luWyJTaW1wbGVTaWduYWxDb21tYW5kcyJdKSB7CisJZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpblsiX1NpbXBsZVNpZ25hbENvbW1hbmRzIl0gPSBkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luWyJTaW1wbGVTaWduYWxDb21tYW5kcyJdOworfQorZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVTaWduYWxDb21tYW5kcyA9IHtzaWduYWxzOlsic2F2ZSIsICJpbnNlcnRJbWFnZSJdLCBIYW5kbGVyOmZ1bmN0aW9uIChuYW1lKSB7CisJaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PSAic2F2ZSIpIHsKKwkJcmV0dXJuIG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbigiU2F2ZSIpOworCX0gZWxzZSB7CisJCWlmIChuYW1lLnRvTG93ZXJDYXNlKCkgPT0gImluc2VydGltYWdlIikgeworCQkJcmV0dXJuIG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbigiSW5zZXJ0SW1hZ2UiKTsKKwkJfQorCX0KK30sIGdldENvbW1hbmQ6ZnVuY3Rpb24gKGVkaXRvciwgbmFtZSkgeworCXZhciBzaWduYWw7CisJZG9qby5sYW5nLmV2ZXJ5KHRoaXMuc2lnbmFscywgZnVuY3Rpb24gKHMpIHsKKwkJaWYgKHMudG9Mb3dlckNhc2UoKSA9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJCXNpZ25hbCA9IHM7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSk7CisJaWYgKHNpZ25hbCkgeworCQlyZXR1cm4gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uU2ltcGxlU2lnbmFsQ29tbWFuZChlZGl0b3IsIHNpZ25hbCk7CisJfQorfX07CitpZiAoZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpblsiX1NpbXBsZVNpZ25hbENvbW1hbmRzIl0pIHsKKwlkb2pvLmxhbmcubWl4aW4oZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVTaWduYWxDb21tYW5kcywgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpblsiX1NpbXBsZVNpZ25hbENvbW1hbmRzIl0pOworfQorZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIucmVnaXN0ZXJIYW5kbGVyKGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uU2ltcGxlU2lnbmFsQ29tbWFuZHMsICJnZXRDb21tYW5kIik7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLnJlZ2lzdGVySGFuZGxlcihkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlNpbXBsZVNpZ25hbENvbW1hbmRzLkhhbmRsZXIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vVGFibGVPcGVyYXRpb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vVGFibGVPcGVyYXRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyZGFmZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9UYWJsZU9wZXJhdGlvbi5qcwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5UYWJsZU9wZXJhdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5FZGl0b3IyIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiZG9qby53aWRnZXQuUmljaFRleHQ6OmluaXQiLCBmdW5jdGlvbiAoZWRpdG9yKSB7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJZWRpdG9yLmNvbnRlbnREb21QcmVGaWx0ZXJzLnB1c2goZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5UYWJsZU9wZXJhdGlvbi5zaG93SUVUYWJsZUJvcmRlcik7CisJCWVkaXRvci5jb250ZW50RG9tUG9zdEZpbHRlcnMucHVzaChkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRhYmxlT3BlcmF0aW9uLnJlbW92ZUlFRmFrZUNsYXNzKTsKKwl9CisJZWRpdG9yLmdldENvbW1hbmQoInRvZ2dsZXRhYmxlYm9yZGVyIik7Cit9KTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLmRlbGV0ZVRhYmxlQ29tbWFuZCIsIGRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kLCB7ZXhlY3V0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIHRhYmxlID0gZG9qby53aXRoR2xvYmFsKHRoaXMuX2VkaXRvci53aW5kb3csICJnZXRBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbInRhYmxlIl0pOworCWlmICh0YWJsZSkgeworCQlkb2pvLndpdGhHbG9iYWwodGhpcy5fZWRpdG9yLndpbmRvdywgInNlbGVjdEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGFibGVdKTsKKwkJdGhpcy5fZWRpdG9yLmV4ZWNDb21tYW5kKCJpbnNlcnRodG1sIiwgIiAiKTsKKwl9Cit9LCBnZXRTdGF0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2VkaXRvci5fbGFzdFN0YXRlVGltZXN0YW1wID4gdGhpcy5fdXBkYXRlVGltZSB8fCB0aGlzLl9zdGF0ZSA9PSB1bmRlZmluZWQpIHsKKwkJdGhpcy5fdXBkYXRlVGltZSA9IHRoaXMuX2VkaXRvci5fbGFzdFN0YXRlVGltZXN0YW1wOworCQl2YXIgdGFibGUgPSBkb2pvLndpdGhHbG9iYWwodGhpcy5fZWRpdG9yLndpbmRvdywgImhhc0FuY2VzdG9yRWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFsidGFibGUiXSk7CisJCXRoaXMuX3N0YXRlID0gdGFibGUgPyBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRW5hYmxlZCA6IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZDsKKwl9CisJcmV0dXJuIHRoaXMuX3N0YXRlOworfSwgZ2V0VGV4dDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICJEZWxldGUgVGFibGUiOworfX0pOworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4udG9nZ2xlVGFibGVCb3JkZXJDb21tYW5kIiwgZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zaG93VGFibGVCb3JkZXIgPSBmYWxzZTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZWRpdG9yLCAiZWRpdG9yT25Mb2FkIiwgdGhpcywgImV4ZWN1dGUiKTsKK30sIHtleGVjdXRlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fc2hvd1RhYmxlQm9yZGVyKSB7CisJCXRoaXMuX3Nob3dUYWJsZUJvcmRlciA9IGZhbHNlOworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5tb3opIHsKKwkJCXRoaXMuX2VkaXRvci5yZW1vdmVTdHlsZVNoZWV0KGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvcjIvc2hvd3RhYmxlYm9yZGVyX2dlY2tvLmNzcyIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJdGhpcy5fZWRpdG9yLnJlbW92ZVN0eWxlU2hlZXQoZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvRWRpdG9yMi9zaG93dGFibGVib3JkZXJfaWUuY3NzIikpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5fc2hvd1RhYmxlQm9yZGVyID0gdHJ1ZTsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJCQl0aGlzLl9lZGl0b3IuYWRkU3R5bGVTaGVldChkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3IyL3Nob3d0YWJsZWJvcmRlcl9nZWNrby5jc3MiKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCXRoaXMuX2VkaXRvci5hZGRTdHlsZVNoZWV0KGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvcjIvc2hvd3RhYmxlYm9yZGVyX2llLmNzcyIpKTsKKwkJCX0KKwkJfQorCX0KK30sIGdldFRleHQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiAiVG9nZ2xlIFRhYmxlIEJvcmRlciI7Cit9LCBnZXRTdGF0ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX3Nob3dUYWJsZUJvcmRlciA/IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5MYXRjaGVkIDogZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkVuYWJsZWQ7Cit9fSk7Citkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRhYmxlT3BlcmF0aW9uID0ge2dldENvbW1hbmQ6ZnVuY3Rpb24gKGVkaXRvciwgbmFtZSkgeworCXN3aXRjaCAobmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJICBjYXNlICJ0b2dnbGV0YWJsZWJvcmRlciI6CisJCXJldHVybiBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi50b2dnbGVUYWJsZUJvcmRlckNvbW1hbmQoZWRpdG9yLCBuYW1lKTsKKwkgIGNhc2UgImluc2VydHRhYmxlIjoKKwkJcmV0dXJuIG5ldyBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29tbWFuZChlZGl0b3IsICJpbnNlcnR0YWJsZSIsIHtjb250ZW50RmlsZToiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5JbnNlcnRUYWJsZURpYWxvZyIsIGNvbnRlbnRDbGFzczoiRWRpdG9yMkluc2VydFRhYmxlRGlhbG9nIiwgdGl0bGU6Ikluc2VydC9FZGl0IFRhYmxlIiwgd2lkdGg6IjQ1MHB4IiwgaGVpZ2h0OiIyNTBweCJ9KTsKKwkgIGNhc2UgImRlbGV0ZXRhYmxlIjoKKwkJcmV0dXJuIG5ldyBkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLmRlbGV0ZVRhYmxlQ29tbWFuZChlZGl0b3IsIG5hbWUpOworCX0KK30sIGdldFRvb2xiYXJJdGVtOmZ1bmN0aW9uIChuYW1lKSB7CisJdmFyIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJdmFyIGl0ZW07CisJc3dpdGNoIChuYW1lKSB7CisJICBjYXNlICJpbnNlcnR0YWJsZSI6CisJICBjYXNlICJ0b2dnbGV0YWJsZWJvcmRlciI6CisJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24obmFtZSk7CisJfQorCXJldHVybiBpdGVtOworfSwgZ2V0Q29udGV4dE1lbnVHcm91cDpmdW5jdGlvbiAobmFtZSwgY29udGV4dG1lbnVwbHVnaW4pIHsKKwlyZXR1cm4gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uVGFibGVDb250ZXh0TWVudUdyb3VwKGNvbnRleHRtZW51cGx1Z2luKTsKK30sIHNob3dJRVRhYmxlQm9yZGVyOmZ1bmN0aW9uIChkb20pIHsKKwl2YXIgdGFibGVzID0gZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpOworCWRvam8ubGFuZy5mb3JFYWNoKHRhYmxlcywgZnVuY3Rpb24gKHQpIHsKKwkJZG9qby5odG1sLmFkZENsYXNzKHQsICJkb2pvU2hvd0lFVGFibGVCb3JkZXJzIik7CisJfSk7CisJcmV0dXJuIGRvbTsKK30sIHJlbW92ZUlFRmFrZUNsYXNzOmZ1bmN0aW9uIChkb20pIHsKKwl2YXIgdGFibGVzID0gZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpOworCWRvam8ubGFuZy5mb3JFYWNoKHRhYmxlcywgZnVuY3Rpb24gKHQpIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHQsICJkb2pvU2hvd0lFVGFibGVCb3JkZXJzIik7CisJfSk7CisJcmV0dXJuIGRvbTsKK319OworZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIucmVnaXN0ZXJIYW5kbGVyKGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uVGFibGVPcGVyYXRpb24uZ2V0Q29tbWFuZCk7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLnJlZ2lzdGVySGFuZGxlcihkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRhYmxlT3BlcmF0aW9uLmdldFRvb2xiYXJJdGVtKTsKK2lmIChkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNvbnRleHRNZW51TWFuYWdlcikgeworCWRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uQ29udGV4dE1lbnVNYW5hZ2VyLnJlZ2lzdGVyR3JvdXAoIlRhYmxlIiwgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5UYWJsZU9wZXJhdGlvbi5nZXRDb250ZXh0TWVudUdyb3VwKTsKKwlkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uVGFibGVDb250ZXh0TWVudUdyb3VwIiwgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5TaW1wbGVDb250ZXh0TWVudUdyb3VwLCB7Y3JlYXRlSXRlbXM6ZnVuY3Rpb24gKCkgeworCQl0aGlzLml0ZW1zLnB1c2goZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJFZGl0b3IyQ29udGV4dE1lbnVJdGVtIiwge2NhcHRpb246IkRlbGV0ZSBUYWJsZSIsIGNvbW1hbmQ6ImRlbGV0ZXRhYmxlIn0pKTsKKwkJdGhpcy5pdGVtcy5wdXNoKGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMkNvbnRleHRNZW51SXRlbSIsIHtjYXB0aW9uOiJUYWJsZSBQcm9wZXJ0eSIsIGNvbW1hbmQ6Imluc2VydHRhYmxlIiwgaWNvbkNsYXNzOiJUQl9CdXR0b25fSWNvbiBUQl9CdXR0b25fVGFibGUifSkpOworCX0sIGNoZWNrVmlzaWJpbGl0eTpmdW5jdGlvbiAoKSB7CisJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCXZhciB0YWJsZSA9IGRvam8ud2l0aEdsb2JhbChjdXJJbnN0LndpbmRvdywgImhhc0FuY2VzdG9yRWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFsidGFibGUiXSk7CisJCWlmIChkb2pvLndpdGhHbG9iYWwoY3VySW5zdC53aW5kb3csICJoYXNBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbInRhYmxlIl0pKSB7CisJCQl0aGlzLml0ZW1zWzBdLnNob3coKTsKKwkJCXRoaXMuaXRlbXNbMV0uc2hvdygpOworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQl0aGlzLml0ZW1zWzBdLmhpZGUoKTsKKwkJCXRoaXMuaXRlbXNbMV0uaGlkZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfX0pOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vVG9vbGJhckRuZFN1cHBvcnQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vVG9vbGJhckRuZFN1cHBvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNDFlYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9Ub29sYmFyRG5kU3VwcG9ydC5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRvb2xiYXJEbmRTdXBwb3J0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZG5kLioiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJkb2pvLndpZGdldC5FZGl0b3IyOjpwcmVMb2FkaW5nVG9vbGJhciIsIGZ1bmN0aW9uIChlZGl0b3IpIHsKKwlkb2pvLmRuZC5kcmFnTWFuYWdlci5uZXN0ZWRUYXJnZXRzID0gdHJ1ZTsKKwl2YXIgcCA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRvb2xiYXJEbmRTdXBwb3J0KGVkaXRvcik7Cit9KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5Ub29sYmFyRG5kU3VwcG9ydCIsIG51bGwsIHtsb29rRm9yQ2xhc3M6ImRvam9FZGl0b3JUb29sYmFyRG5kIFRCX1Rvb2xiYXJTZXQgVEJfVG9vbGJhciIsIGluaXRpYWxpemVyOmZ1bmN0aW9uIChlZGl0b3IpIHsKKwl0aGlzLmVkaXRvciA9IGVkaXRvcjsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5lZGl0b3IsICJ0b29sYmFyTG9hZGVkIiwgdGhpcywgInNldHVwIik7CisJdGhpcy5lZGl0b3IucmVnaXN0ZXJMb2FkZWRQbHVnaW4odGhpcyk7Cit9LCBzZXR1cDpmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMuZWRpdG9yLCAidG9vbGJhckxvYWRlZCIsIHRoaXMsICJzZXR1cCIpOworCXZhciB0YncgPSB0aGlzLmVkaXRvci50b29sYmFyV2lkZ2V0OworCWRvam8uZXZlbnQuY29ubmVjdCgiYmVmb3JlIiwgdGJ3LCAiZGVzdHJveSIsIHRoaXMsICJkZXN0cm95Iik7CisJdmFyIG5vZGVzID0gZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzcyh0aGlzLmxvb2tGb3JDbGFzcywgdGJ3LmRvbU5vZGUsIG51bGwsIGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FueSk7CisJaWYgKCFub2RlcykgeworCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLlRvb2xiYXJEbmRTdXBwb3J0OiBObyBkb20gbm9kZSB3aXRoIGNsYXNzIGluICIgKyB0aGlzLmxvb2tGb3JDbGFzcyk7CisJCXJldHVybjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQl2YXIgbm9kZSA9IG5vZGVzW2ldOworCQl2YXIgZHJvcHRhcmdldCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvRVREcm9wVGFyZ2V0Iik7CisJCWlmIChkcm9wdGFyZ2V0KSB7CisJCQkobmV3IGRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0KG5vZGUsIFtkcm9wdGFyZ2V0ICsgdGJ3LndpZGdldElkXSkpLnZlcnRpY2FsID0gdHJ1ZTsKKwkJfQorCQl2YXIgZHJhZ3NvdXJjZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvRVREcmFnU291cmNlIik7CisJCWlmIChkcmFnc291cmNlKSB7CisJCQluZXcgZG9qby5kbmQuSHRtbERyYWdTb3VyY2Uobm9kZSwgZHJhZ3NvdXJjZSArIHRidy53aWRnZXRJZCk7CisJCX0KKwl9Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwl0aGlzLmVkaXRvci51bnJlZ2lzdGVyTG9hZGVkUGx1Z2luKHRoaXMpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJQbHVnaW4vX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyYTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi9fX3BhY2thZ2VfXy5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby53aWRnZXQuRWRpdG9yMiIsICJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhciJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uKiIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0VkaXRvcjJUb29sYmFyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyVG9vbGJhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg4M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9FZGl0b3IyVG9vbGJhci5qcwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5SaWNoVGV4dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db2xvclBhbGV0dGUiKTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5IYW5kbGVyTWFuYWdlciIsIG51bGwsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMgPSBbXTsKK30sIHtyZWdpc3RlckhhbmRsZXI6ZnVuY3Rpb24gKG9iaiwgZnVuYykgeworCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsKKwkJdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLnB1c2goZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIG9ialtmdW5jXS5hcHBseShvYmosIGFyZ3VtZW50cyk7CisJCX0pOworCX0gZWxzZSB7CisJCXRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKG9iaik7CisJfQorfSwgcmVtb3ZlSGFuZGxlcjpmdW5jdGlvbiAoZnVuYykgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChmdW5jID09PSB0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnNbaV0pIHsKKwkJCWRlbGV0ZSB0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnNbaV07CisJCQlyZXR1cm47CisJCX0KKwl9CisJZG9qby5kZWJ1ZygiSGFuZGxlck1hbmFnZXIgaGFuZGxlciAiICsgZnVuYyArICIgaXMgbm90IHJlZ2lzdGVyZWQsIGNhbiBub3QgcmVtb3ZlLiIpOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKKwkJZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVyc1tpXTsKKwl9Cit9fSk7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyID0gbmV3IGRvam8ud2lkZ2V0LkhhbmRsZXJNYW5hZ2VyOworZG9qby5sYW5nLm1peGluKGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFySXRlbU1hbmFnZXIsIHtnZXRUb29sYmFySXRlbTpmdW5jdGlvbiAobmFtZSkgeworCXZhciBpdGVtOworCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKKwkJaXRlbSA9IHRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVyc1tpXShuYW1lKTsKKwkJaWYgKGl0ZW0pIHsKKwkJCXJldHVybiBpdGVtOworCQl9CisJfQorCXN3aXRjaCAobmFtZSkgeworCSAgY2FzZSAiYm9sZCI6CisJICBjYXNlICJjb3B5IjoKKwkgIGNhc2UgImN1dCI6CisJICBjYXNlICJkZWxldGUiOgorCSAgY2FzZSAiaW5kZW50IjoKKwkgIGNhc2UgImluc2VydGhvcml6b250YWxydWxlIjoKKwkgIGNhc2UgImluc2VydG9yZGVyZWRsaXN0IjoKKwkgIGNhc2UgImluc2VydHVub3JkZXJlZGxpc3QiOgorCSAgY2FzZSAiaXRhbGljIjoKKwkgIGNhc2UgImp1c3RpZnljZW50ZXIiOgorCSAgY2FzZSAianVzdGlmeWZ1bGwiOgorCSAgY2FzZSAianVzdGlmeWxlZnQiOgorCSAgY2FzZSAianVzdGlmeXJpZ2h0IjoKKwkgIGNhc2UgIm91dGRlbnQiOgorCSAgY2FzZSAicGFzdGUiOgorCSAgY2FzZSAicmVkbyI6CisJICBjYXNlICJyZW1vdmVmb3JtYXQiOgorCSAgY2FzZSAic2VsZWN0YWxsIjoKKwkgIGNhc2UgInN0cmlrZXRocm91Z2giOgorCSAgY2FzZSAic3Vic2NyaXB0IjoKKwkgIGNhc2UgInN1cGVyc2NyaXB0IjoKKwkgIGNhc2UgInVuZGVybGluZSI6CisJICBjYXNlICJ1bmRvIjoKKwkgIGNhc2UgInVubGluayI6CisJICBjYXNlICJjcmVhdGVsaW5rIjoKKwkgIGNhc2UgImluc2VydGltYWdlIjoKKwkgIGNhc2UgImh0bWx0b2dnbGUiOgorCQlpdGVtID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQnV0dG9uKG5hbWUpOworCQlicmVhazsKKwkgIGNhc2UgImZvcmVjb2xvciI6CisJICBjYXNlICJoaWxpdGVjb2xvciI6CisJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb2xvclBhbGV0dGVCdXR0b24obmFtZSk7CisJCWJyZWFrOworCSAgY2FzZSAicGxhaW5mb3JtYXRibG9jayI6CisJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1BsYWluU2VsZWN0KCJmb3JtYXRibG9jayIpOworCQlicmVhazsKKwkgIGNhc2UgImZvcm1hdGJsb2NrIjoKKwkJaXRlbSA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0KCJmb3JtYXRibG9jayIpOworCQlicmVhazsKKwkgIGNhc2UgImZvbnRzaXplIjoKKwkJaXRlbSA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnRTaXplU2VsZWN0KCJmb250c2l6ZSIpOworCQlicmVhazsKKwkgIGNhc2UgImZvbnRuYW1lIjoKKwkJaXRlbSA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnROYW1lU2VsZWN0KCJmb250bmFtZSIpOworCQlicmVhazsKKwkgIGNhc2UgImluc2VydHRhYmxlIjoKKwkgIGNhc2UgImluc2VydGNlbGwiOgorCSAgY2FzZSAiaW5zZXJ0Y29sIjoKKwkgIGNhc2UgImluc2VydHJvdyI6CisJICBjYXNlICJkZWxldGVjZWxscyI6CisJICBjYXNlICJkZWxldGVjb2xzIjoKKwkgIGNhc2UgImRlbGV0ZXJvd3MiOgorCSAgY2FzZSAibWVyZ2VjZWxscyI6CisJICBjYXNlICJzcGxpdGNlbGwiOgorCQlkb2pvLmRlYnVnKG5hbWUgKyAiIGlzIGltcGxlbWVudGVkIGluIGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uVGFibGVPcGVyYXRpb24sIHBsZWFzZSByZXF1aXJlIGl0IGZpcnN0LiIpOworCQlicmVhazsKKwkgIGNhc2UgImluc2VydGh0bWwiOgorCSAgY2FzZSAiYmxvY2tkaXJsdHIiOgorCSAgY2FzZSAiYmxvY2tkaXJydGwiOgorCSAgY2FzZSAiZGlybHRyIjoKKwkgIGNhc2UgImRpcnJ0bCI6CisJICBjYXNlICJpbmxpbmVkaXJsdHIiOgorCSAgY2FzZSAiaW5saW5lZGlycnRsIjoKKwkJZG9qby5kZWJ1ZygiTm90IHlldCBpbXBsZW1lbnRlZCB0b29sYmFyIGl0ZW06ICIgKyBuYW1lKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLmdldFRvb2xiYXJJdGVtOiBVbmtub3duIHRvb2xiYXIgaXRlbTogIiArIG5hbWUpOworCX0KKwlyZXR1cm4gaXRlbTsKK319KTsKK2Rvam8uYWRkT25VbmxvYWQoZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJJdGVtTWFuYWdlciwgImRlc3Ryb3kiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24iLCBudWxsLCBmdW5jdGlvbiAobmFtZSkgeworCXRoaXMuX25hbWUgPSBuYW1lOworfSwge2NyZWF0ZTpmdW5jdGlvbiAobm9kZSwgdG9vbGJhciwgbm9ob3ZlcikgeworCXRoaXMuX2RvbU5vZGUgPSBub2RlOworCXZhciBjbWQgPSB0b29sYmFyLnBhcmVudC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCWlmIChjbWQpIHsKKwkJdGhpcy5fZG9tTm9kZS50aXRsZSA9IGNtZC5nZXRUZXh0KCk7CisJfQorCXRoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLl9kb21Ob2RlKTsKKwl0aGlzLl9wYXJlbnRUb29sYmFyID0gdG9vbGJhcjsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZG9tTm9kZSwgIm9uY2xpY2siLCB0aGlzLCAib25DbGljayIpOworCWlmICghbm9ob3ZlcikgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZG9tTm9kZSwgIm9ubW91c2VvdmVyIiwgdGhpcywgIm9uTW91c2VPdmVyIik7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCAib25tb3VzZW91dCIsIHRoaXMsICJvbk1vdXNlT3V0Iik7CisJfQorfSwgZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbiAocm9vdG5vZGUpIHsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihyb290bm9kZSk7CisJdmFyIG5vZGVzID0gcm9vdG5vZGUuYWxsIHx8IHJvb3Rub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJZm9yICh2YXIgeCA9IDA7IHggPCBub2Rlcy5sZW5ndGg7IHgrKykgeworCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihub2Rlc1t4XSk7CisJfQorfSwgb25Nb3VzZU92ZXI6ZnVuY3Rpb24gKCkgeworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJaWYgKGN1ckluc3QpIHsKKwkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQlpZiAoX2NvbW1hbmQgJiYgX2NvbW1hbmQuZ2V0U3RhdGUoKSAhPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRGlzYWJsZWQpIHsKKwkJCXRoaXMuaGlnaGxpZ2h0VG9vbGJhckl0ZW0oKTsKKwkJfQorCX0KK30sIG9uTW91c2VPdXQ6ZnVuY3Rpb24gKCkgeworCXRoaXMudW5oaWdobGlnaHRUb29sYmFySXRlbSgpOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fZG9tTm9kZSA9IG51bGw7CisJdGhpcy5fcGFyZW50VG9vbGJhciA9IG51bGw7Cit9LCBvbkNsaWNrOmZ1bmN0aW9uIChlKSB7CisJaWYgKHRoaXMuX2RvbU5vZGUgJiYgIXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQgJiYgdGhpcy5fcGFyZW50VG9vbGJhci5jaGVja0F2YWlsYWJpbGl0eSgpKSB7CisJCWUucHJldmVudERlZmF1bHQoKTsKKwkJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJaWYgKGN1ckluc3QpIHsKKwkJCXZhciBfY29tbWFuZCA9IGN1ckluc3QuZ2V0Q29tbWFuZCh0aGlzLl9uYW1lKTsKKwkJCWlmIChfY29tbWFuZCkgeworCQkJCV9jb21tYW5kLmV4ZWN1dGUoKTsKKwkJCX0KKwkJfQorCX0KK30sIHJlZnJlc2hTdGF0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwl2YXIgZW0gPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlcjsKKwlpZiAoY3VySW5zdCkgeworCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CisJCWlmIChfY29tbWFuZCkgeworCQkJdmFyIHN0YXRlID0gX2NvbW1hbmQuZ2V0U3RhdGUoKTsKKwkJCWlmIChzdGF0ZSAhPSB0aGlzLl9sYXN0U3RhdGUpIHsKKwkJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQkJICBjYXNlIGVtLmNvbW1hbmRTdGF0ZS5MYXRjaGVkOgorCQkJCQl0aGlzLmxhdGNoVG9vbGJhckl0ZW0oKTsKKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlIGVtLmNvbW1hbmRTdGF0ZS5FbmFibGVkOgorCQkJCQl0aGlzLmVuYWJsZVRvb2xiYXJJdGVtKCk7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSBlbS5jb21tYW5kU3RhdGUuRGlzYWJsZWQ6CisJCQkJICBkZWZhdWx0OgorCQkJCQl0aGlzLmRpc2FibGVUb29sYmFySXRlbSgpOworCQkJCX0KKwkJCQl0aGlzLl9sYXN0U3RhdGUgPSBzdGF0ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZW0uY29tbWFuZFN0YXRlLkVuYWJsZWQ7Cit9LCBsYXRjaFRvb2xiYXJJdGVtOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9kb21Ob2RlLmRpc2FibGVkID0gZmFsc2U7CisJdGhpcy5yZW1vdmVUb29sYmFySXRlbVN0eWxlKHRoaXMuX2RvbU5vZGUpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJMYXRjaGVkSXRlbVN0eWxlKTsKK30sIGVuYWJsZVRvb2xiYXJJdGVtOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9kb21Ob2RlLmRpc2FibGVkID0gZmFsc2U7CisJdGhpcy5yZW1vdmVUb29sYmFySXRlbVN0eWxlKHRoaXMuX2RvbU5vZGUpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJFbmFibGVkSXRlbVN0eWxlKTsKK30sIGRpc2FibGVUb29sYmFySXRlbTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fZG9tTm9kZS5kaXNhYmxlZCA9IHRydWU7CisJdGhpcy5yZW1vdmVUb29sYmFySXRlbVN0eWxlKHRoaXMuX2RvbU5vZGUpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJEaXNhYmxlZEl0ZW1TdHlsZSk7Cit9LCBoaWdobGlnaHRUb29sYmFySXRlbTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuX2RvbU5vZGUsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckhpZ2hsaWdodGVkSXRlbVN0eWxlKTsKK30sIHVuaGlnaGxpZ2h0VG9vbGJhckl0ZW06ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZEl0ZW1TdHlsZSk7Cit9LCByZW1vdmVUb29sYmFySXRlbVN0eWxlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5fZG9tTm9kZSwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFyRW5hYmxlZEl0ZW1TdHlsZSk7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuX2RvbU5vZGUsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckxhdGNoZWRJdGVtU3R5bGUpOworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJEaXNhYmxlZEl0ZW1TdHlsZSk7CisJdGhpcy51bmhpZ2hsaWdodFRvb2xiYXJJdGVtKCk7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24iLCBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbiwge29uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLl9kb21Ob2RlICYmICF0aGlzLl9kb21Ob2RlLmRpc2FibGVkICYmIHRoaXMuX3BhcmVudFRvb2xiYXIuY2hlY2tBdmFpbGFiaWxpdHkoKSkgeworCQlpZiAoIXRoaXMuX2Ryb3Bkb3duKSB7CisJCQl0aGlzLl9kcm9wZG93biA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiUG9wdXBDb250YWluZXIiLCB7fSk7CisJCQl0aGlzLl9kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMuX2Ryb3Bkb3duLmRvbU5vZGUpOworCQl9CisJCWlmICh0aGlzLl9kcm9wZG93bi5pc1Nob3dpbmdOb3cpIHsKKwkJCXRoaXMuX2Ryb3Bkb3duLmNsb3NlKCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLm9uRHJvcERvd25TaG93bigpOworCQkJdGhpcy5fZHJvcGRvd24ub3Blbih0aGlzLl9kb21Ob2RlLCBudWxsLCB0aGlzLl9kb21Ob2RlKTsKKwkJfQorCX0KK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCXRoaXMub25Ecm9wRG93bkRlc3Ryb3koKTsKKwlpZiAodGhpcy5fZHJvcGRvd24pIHsKKwkJdGhpcy5fZHJvcGRvd24uZGVzdHJveSgpOworCX0KKwlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckRyb3BEb3duQnV0dG9uLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworfSwgb25Ecm9wRG93blNob3duOmZ1bmN0aW9uICgpIHsKK30sIG9uRHJvcERvd25EZXN0cm95OmZ1bmN0aW9uICgpIHsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb2xvclBhbGV0dGVCdXR0b24iLCBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckRyb3BEb3duQnV0dG9uLCB7b25Ecm9wRG93blNob3duOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuX2NvbG9ycGFsZXR0ZSkgeworCQl0aGlzLl9jb2xvcnBhbGV0dGUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkNvbG9yUGFsZXR0ZSIsIHt9KTsKKwkJdGhpcy5fZHJvcGRvd24uYWRkQ2hpbGQodGhpcy5fY29sb3JwYWxldHRlKTsKKwkJdGhpcy5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuX2Ryb3Bkb3duLmRvbU5vZGUpOworCQl0aGlzLmRpc2FibGVTZWxlY3Rpb24odGhpcy5fY29sb3JwYWxldHRlLmRvbU5vZGUpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fY29sb3JwYWxldHRlLCAib25Db2xvclNlbGVjdCIsIHRoaXMsICJzZXRDb2xvciIpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZHJvcGRvd24sICJvcGVuIiwgdGhpcywgImxhdGNoVG9vbGJhckl0ZW0iKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Ryb3Bkb3duLCAiY2xvc2UiLCB0aGlzLCAiZW5hYmxlVG9vbGJhckl0ZW0iKTsKKwl9Cit9LCBzZXRDb2xvcjpmdW5jdGlvbiAoY29sb3IpIHsKKwl0aGlzLl9kcm9wZG93bi5jbG9zZSgpOworCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJaWYgKGN1ckluc3QpIHsKKwkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQlpZiAoX2NvbW1hbmQpIHsKKwkJCV9jb21tYW5kLmV4ZWN1dGUoY29sb3IpOworCQl9CisJfQorfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3QiLCBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbiwge2NyZWF0ZTpmdW5jdGlvbiAobm9kZSwgdG9vbGJhcikgeworCXRoaXMuX2RvbU5vZGUgPSBub2RlOworCXRoaXMuX3BhcmVudFRvb2xiYXIgPSB0b29sYmFyOworCXRoaXMuX2RvbU5vZGUgPSBub2RlOworCXRoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLl9kb21Ob2RlKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZG9tTm9kZSwgIm9uY2hhbmdlIiwgdGhpcywgIm9uQ2hhbmdlIik7Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9kb21Ob2RlID0gbnVsbDsKK30sIG9uQ2hhbmdlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fcGFyZW50VG9vbGJhci5jaGVja0F2YWlsYWJpbGl0eSgpKSB7CisJCXZhciBzdiA9IHRoaXMuX2RvbU5vZGUudmFsdWUudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJaWYgKGN1ckluc3QpIHsKKwkJCXZhciBfY29tbWFuZCA9IGN1ckluc3QuZ2V0Q29tbWFuZCh0aGlzLl9uYW1lKTsKKwkJCWlmIChfY29tbWFuZCkgeworCQkJCV9jb21tYW5kLmV4ZWN1dGUoc3YpOworCQkJfQorCQl9CisJfQorfSwgcmVmcmVzaFN0YXRlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5fZG9tTm9kZSkgeworCQlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKKwkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJaWYgKGN1ckluc3QpIHsKKwkJCXZhciBfY29tbWFuZCA9IGN1ckluc3QuZ2V0Q29tbWFuZCh0aGlzLl9uYW1lKTsKKwkJCWlmIChfY29tbWFuZCkgeworCQkJCXZhciBmb3JtYXQgPSBfY29tbWFuZC5nZXRWYWx1ZSgpOworCQkJCWlmICghZm9ybWF0KSB7CisJCQkJCWZvcm1hdCA9ICIiOworCQkJCX0KKwkJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLl9kb21Ob2RlLm9wdGlvbnMsIGZ1bmN0aW9uIChpdGVtKSB7CisJCQkJCWlmIChpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkJCWl0ZW0uc2VsZWN0ZWQgPSB0cnVlOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCX0KKwl9Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtIiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJEcm9wRG93bkJ1dHRvbiwge2hyZWY6bnVsbCwgY3JlYXRlOmZ1bmN0aW9uIChub2RlLCB0b29sYmFyKSB7CisJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0uc3VwZXJjbGFzcy5jcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAoIXRoaXMuX2NvbnRlbnRQYW5lKSB7CisJCWRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29udGVudFBhbmUiKTsKKwkJdGhpcy5fY29udGVudFBhbmUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkNvbnRlbnRQYW5lIiwge3ByZWxvYWQ6InRydWUifSk7CisJCXRoaXMuX2NvbnRlbnRQYW5lLmFkZE9uTG9hZCh0aGlzLCAic2V0dXAiKTsKKwkJdGhpcy5fY29udGVudFBhbmUuc2V0VXJsKHRoaXMuaHJlZik7CisJfQorfSwgb25Nb3VzZU92ZXI6ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5fbGFzdFN0YXRlICE9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCkgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3MoZS5jdXJyZW50VGFyZ2V0LCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlKTsKKwl9Cit9LCBvbk1vdXNlT3V0OmZ1bmN0aW9uIChlKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKGUuY3VycmVudFRhcmdldCwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRTZWxlY3RTdHlsZSk7Cit9LCBvbkRyb3BEb3duU2hvd246ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5fZHJvcGRvd24uX19hZGRlZENvbnRlbnRQYWdlKSB7CisJCXRoaXMuX2Ryb3Bkb3duLmFkZENoaWxkKHRoaXMuX2NvbnRlbnRQYW5lKTsKKwkJdGhpcy5fZHJvcGRvd24uX19hZGRlZENvbnRlbnRQYWdlID0gdHJ1ZTsKKwl9Cit9LCBzZXR1cDpmdW5jdGlvbiAoKSB7Cit9LCBvbkNoYW5nZTpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLl9wYXJlbnRUb29sYmFyLmNoZWNrQXZhaWxhYmlsaXR5KCkpIHsKKwkJdmFyIG5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIik7CisJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCWlmIChjdXJJbnN0KSB7CisJCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CisJCQlpZiAoX2NvbW1hbmQpIHsKKwkJCQlfY29tbWFuZC5leGVjdXRlKG5hbWUpOworCQkJfQorCQl9CisJfQorCXRoaXMuX2Ryb3Bkb3duLmNsb3NlKCk7Cit9LCBvbk1vdXNlT3Zlckl0ZW06ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmh0bWwuYWRkQ2xhc3MoZS5jdXJyZW50VGFyZ2V0LCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdEl0ZW1TdHlsZSk7Cit9LCBvbk1vdXNlT3V0SXRlbTpmdW5jdGlvbiAoZSkgeworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyhlLmN1cnJlbnRUYXJnZXQsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckhpZ2hsaWdodGVkU2VsZWN0SXRlbVN0eWxlKTsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1NlbGVjdCIsIGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtLCB7aHJlZjpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9ybWF0QmxvY2suaHRtbCIpLCBzZXR1cDpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1NlbGVjdC5zdXBlcmNsYXNzLnNldHVwLmNhbGwodGhpcyk7CisJdmFyIG5vZGVzID0gdGhpcy5fY29udGVudFBhbmUuZG9tTm9kZS5hbGwgfHwgdGhpcy5fY29udGVudFBhbmUuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCXRoaXMuX2Jsb2NrTmFtZXMgPSB7fTsKKwl0aGlzLl9ibG9ja0Rpc3BsYXlOYW1lcyA9IHt9OworCWZvciAodmFyIHggPSAwOyB4IDwgbm9kZXMubGVuZ3RoOyB4KyspIHsKKwkJdmFyIG5vZGUgPSBub2Rlc1t4XTsKKwkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24obm9kZSk7CisJCXZhciBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoImRyb3BEb3duSXRlbU5hbWUiKTsKKwkJaWYgKG5hbWUpIHsKKwkJCXRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0gPSBub2RlOworCQkJdmFyIGNoaWxkcmVubm9kZXMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOworCQkJdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXNbbmFtZV0gPSBjaGlsZHJlbm5vZGVzW2NoaWxkcmVubm9kZXMubGVuZ3RoIC0gMV0uaW5uZXJIVE1MOworCQl9CisJfQorCWZvciAodmFyIG5hbWUgaW4gdGhpcy5fYmxvY2tOYW1lcykgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fYmxvY2tOYW1lc1tuYW1lXSwgIm9uY2xpY2siLCB0aGlzLCAib25DaGFuZ2UiKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0sICJvbm1vdXNlb3ZlciIsIHRoaXMsICJvbk1vdXNlT3Zlckl0ZW0iKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0sICJvbm1vdXNlb3V0IiwgdGhpcywgIm9uTW91c2VPdXRJdGVtIik7CisJfQorfSwgb25Ecm9wRG93bkRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLl9ibG9ja05hbWVzKSB7CisJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5fYmxvY2tOYW1lcykgeworCQkJZGVsZXRlIHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV07CisJCQlkZWxldGUgdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXNbbmFtZV07CisJCX0KKwl9Cit9LCByZWZyZXNoU3RhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKKwlpZiAodGhpcy5fbGFzdFN0YXRlICE9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCkgeworCQl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQlpZiAoY3VySW5zdCkgeworCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJaWYgKF9jb21tYW5kKSB7CisJCQkJdmFyIGZvcm1hdCA9IF9jb21tYW5kLmdldFZhbHVlKCk7CisJCQkJaWYgKGZvcm1hdCA9PSB0aGlzLl9sYXN0U2VsZWN0ZWRGb3JtYXQgJiYgdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXMpIHsKKwkJCQkJcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKKwkJCQl9CisJCQkJdGhpcy5fbGFzdFNlbGVjdGVkRm9ybWF0ID0gZm9ybWF0OworCQkJCXZhciBsYWJlbCA9IHRoaXMuX2RvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxhYmVsIilbMF07CisJCQkJdmFyIGlzU2V0ID0gZmFsc2U7CisJCQkJaWYgKHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzKSB7CisJCQkJCWZvciAodmFyIG5hbWUgaW4gdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXMpIHsKKwkJCQkJCWlmIChuYW1lID09IGZvcm1hdCkgeworCQkJCQkJCWxhYmVsLmlubmVySFRNTCA9IHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzW25hbWVdOworCQkJCQkJCWlzU2V0ID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIWlzU2V0KSB7CisJCQkJCQlsYWJlbC5pbm5lckhUTUwgPSAiJm5ic3A7IjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdGhpcy5fbGFzdFN0YXRlOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnRTaXplU2VsZWN0IiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0sIHtocmVmOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvcjIvRWRpdG9yVG9vbGJhcl9Gb250U2l6ZS5odG1sIiksIHNldHVwOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0LnN1cGVyY2xhc3Muc2V0dXAuY2FsbCh0aGlzKTsKKwl2YXIgbm9kZXMgPSB0aGlzLl9jb250ZW50UGFuZS5kb21Ob2RlLmFsbCB8fCB0aGlzLl9jb250ZW50UGFuZS5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJdGhpcy5fZm9udHNpemVzID0ge307CisJdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXMgPSB7fTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IG5vZGVzLmxlbmd0aDsgeCsrKSB7CisJCXZhciBub2RlID0gbm9kZXNbeF07CisJCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKG5vZGUpOworCQl2YXIgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIik7CisJCWlmIChuYW1lKSB7CisJCQl0aGlzLl9mb250c2l6ZXNbbmFtZV0gPSBub2RlOworCQkJdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXNbbmFtZV0gPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb250IilbMF0uaW5uZXJIVE1MOworCQl9CisJfQorCWZvciAodmFyIG5hbWUgaW4gdGhpcy5fZm9udHNpemVzKSB7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sICJvbmNsaWNrIiwgdGhpcywgIm9uQ2hhbmdlIik7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sICJvbm1vdXNlb3ZlciIsIHRoaXMsICJvbk1vdXNlT3Zlckl0ZW0iKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2ZvbnRzaXplc1tuYW1lXSwgIm9ubW91c2VvdXQiLCB0aGlzLCAib25Nb3VzZU91dEl0ZW0iKTsKKwl9Cit9LCBvbkRyb3BEb3duRGVzdHJveTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuX2ZvbnRzaXplcykgeworCQlmb3IgKHZhciBuYW1lIGluIHRoaXMuX2ZvbnRzaXplcykgeworCQkJZGVsZXRlIHRoaXMuX2ZvbnRzaXplc1tuYW1lXTsKKwkJCWRlbGV0ZSB0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lc1tuYW1lXTsKKwkJfQorCX0KK30sIHJlZnJlc2hTdGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1NlbGVjdC5zdXBlcmNsYXNzLnJlZnJlc2hTdGF0ZS5jYWxsKHRoaXMpOworCWlmICh0aGlzLl9sYXN0U3RhdGUgIT0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkRpc2FibGVkKSB7CisJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCWlmIChjdXJJbnN0KSB7CisJCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CisJCQlpZiAoX2NvbW1hbmQpIHsKKwkJCQl2YXIgc2l6ZSA9IF9jb21tYW5kLmdldFZhbHVlKCk7CisJCQkJaWYgKHNpemUgPT0gdGhpcy5fbGFzdFNlbGVjdGVkU2l6ZSAmJiB0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lcykgeworCQkJCQlyZXR1cm4gdGhpcy5fbGFzdFN0YXRlOworCQkJCX0KKwkJCQl0aGlzLl9sYXN0U2VsZWN0ZWRTaXplID0gc2l6ZTsKKwkJCQl2YXIgbGFiZWwgPSB0aGlzLl9kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsYWJlbCIpWzBdOworCQkJCXZhciBpc1NldCA9IGZhbHNlOworCQkJCWlmICh0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lcykgeworCQkJCQlmb3IgKHZhciBuYW1lIGluIHRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzKSB7CisJCQkJCQlpZiAobmFtZSA9PSBzaXplKSB7CisJCQkJCQkJbGFiZWwuaW5uZXJIVE1MID0gdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXNbbmFtZV07CisJCQkJCQkJaXNTZXQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICghaXNTZXQpIHsKKwkJCQkJCWxhYmVsLmlubmVySFRNTCA9ICImbmJzcDsiOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiB0aGlzLl9sYXN0U3RhdGU7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udE5hbWVTZWxlY3QiLCBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnRTaXplU2VsZWN0LCB7aHJlZjpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9udE5hbWUuaHRtbCIpfSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAiZmlsbEluVGVtcGxhdGUiLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJdGhpcy5kb21Ob2RlLnN0eWxlLnpvb20gPSAxOworCQl9CisJfSkpOworfSwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGRvam9BdHRhY2hQb2ludD1cImRvbU5vZGVcIiBjbGFzcz1cIkVkaXRvclRvb2xiYXJEb21Ob2RlXCIgdW5zZWxlY3RhYmxlPVwib25cIj5cblx0PHRhYmxlIGNlbGxwYWRkaW5nPVwiM1wiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cblx0XHQ8IS0tXG5cdFx0XHRvdXIgdG9vbGJhciBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZTpcblxuXHRcdFx0Kz09PT09PT0rPT09PT09PSs9PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcblx0XHRcdHwgdyAgIHcgfCBzdHlsZSB8IGNvcHkgIHwgYm8gfCBpdCB8IHVuIHwgbGUgfCBjZSB8IHJpIHxcblx0XHRcdHwgdyB3IHcgfCBzdHlsZSB8PT09PT09PXw9PT09PT09PT09PT09PXw9PT09PT09PT09PT09PXxcblx0XHRcdHwgIHcgdyAgfCBzdHlsZSB8IHBhc3RlIHwgIHVuZG8gfCByZWRvIHwgY2hhbmdlIHN0eWxlIHxcblx0XHRcdCs9PT09PT09Kz09PT09PT0rPT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG5cdFx0LS0+XG5cdFx0PHRib2R5PlxuXHRcdFx0PHRyIHZhbGlnbj1cInRvcFwiPlxuXHRcdFx0XHQ8dGQgcm93c3Bhbj1cIjJcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmlnSWNvblwiIGRvam9BdHRhY2hQb2ludD1cIndpa2lXb3JkQnV0dG9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwid2lraVdvcmRDbGljazsgYnV0dG9uQ2xpY2s7XCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMzBweDsgbWFyZ2luLWxlZnQ6IDVweDtcIj5cblx0XHRcdFx0XHRcdFx0V1xuXHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQgcm93c3Bhbj1cIjJcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmlnSWNvblwiIGRvam9BdHRhY2hQb2ludD1cInN0eWxlRHJvcGRvd25CdXR0b25cIlxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJzdHlsZURyb3Bkb3duQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0PHNwYW4gdW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cImZvbnQtc2l6ZTogMzBweDsgbWFyZ2luLWxlZnQ6IDVweDtcIj5cblx0XHRcdFx0XHRcdFx0U1xuXHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJTdHlsZURyb3Bkb3duQ29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXG5cdFx0XHRcdFx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJzdHlsZURyb3Bkb3duQ29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHQ8dGFibGUgY2VsbHBhZGRpbmc9XCIwXCIgY2VsbHNwYWNpbmc9XCIwXCIgYm9yZGVyPVwiMFwiXG5cdFx0XHRcdFx0XHRcdGhlaWdodD1cIjEwMCVcIiB3aWR0aD1cIjEwMCVcIj5cblx0XHRcdFx0XHRcdFx0PHRyIHZhbGlnbj1cInRvcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCByb3dzcGFuPVwiMlwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBzdHlsZT1cImhlaWdodDogMjQ1cHg7IG92ZXJmbG93OiBhdXRvO1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwibm9ybWFsVGV4dENsaWNrXCI+bm9ybWFsPC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxoMSBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImgxVGV4dENsaWNrXCI+SGVhZGluZyAxPC9oMT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGgyIGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiaDJUZXh0Q2xpY2tcIj5IZWFkaW5nIDI8L2gyPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aDMgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJoM1RleHRDbGlja1wiPkhlYWRpbmcgMzwvaDM+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxoNCBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImg0VGV4dENsaWNrXCI+SGVhZGluZyA0PC9oND5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImJsYWhUZXh0Q2xpY2tcIj5ibGFoPC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJibGFoVGV4dENsaWNrXCI+YmxhaDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiYmxhaFRleHRDbGlja1wiPmJsYWg8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIj5ibGFoPC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCI+YmxhaDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiPmJsYWg8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIj5ibGFoPC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDwhLS1cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeWxlZnRcIiBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9PbkNsaWNrPVwiYnV0dG9uQ2xpY2s7XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5Y2VudGVyXCIgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeXJpZ2h0XCIgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeWZ1bGxcIiBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdC0tPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0XHQ8dHIgdmFsaWduPVwidG9wXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPlxuXHRcdFx0XHRcdFx0XHRcdFx0dGh1ZFxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PCEtLSBjb3B5IC0tPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImNvcHlCdXR0b25cIlxuXHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJjb3B5Q2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGNvcHlcIiBcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj4gY29weVxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHQ8IS0tIFwiZHJvcHBhYmxlXCIgb3B0aW9ucyAtLT5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJib2xkQnV0dG9uXCJcblx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiYm9sZENsaWNrOyBidXR0b25DbGljaztcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBib2xkXCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cIml0YWxpY0J1dHRvblwiXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cIml0YWxpY0NsaWNrOyBidXR0b25DbGljaztcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBpdGFsaWNcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwidW5kZXJsaW5lQnV0dG9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwidW5kZXJsaW5lQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIHVuZGVybGluZVwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJsZWZ0QnV0dG9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwibGVmdENsaWNrOyBidXR0b25DbGljaztcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5bGVmdFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJmdWxsQnV0dG9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiZnVsbENsaWNrOyBidXR0b25DbGljaztcIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5ZnVsbFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyaWdodEJ1dHRvblwiXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInJpZ2h0Q2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGp1c3RpZnlyaWdodFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0XHQ8dHI+XG5cdFx0XHRcdDx0ZD5cblx0XHRcdFx0XHQ8IS0tIHBhc3RlIC0tPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInBhc3RlQnV0dG9uXCJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwicGFzdGVDbGljazsgYnV0dG9uQ2xpY2s7XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBwYXN0ZVwiIHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+IHBhc3RlXG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdDwhLS0gXCJkcm9wcGFibGVcIiBvcHRpb25zIC0tPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInVuZG9CdXR0b25cIlxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJ1bmRvQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiIHVuc2VsZWN0YWJsZT1cIm9uXCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24gdW5kb1wiIHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+IHVuZG9cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwicmVkb0J1dHRvblwiXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInJlZG9DbGljazsgYnV0dG9uQ2xpY2s7XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiByZWRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdDtcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj4gcmVkb1xuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC90ZD5cdFxuXHRcdFx0PC90cj5cblx0XHQ8L3Rib2R5PlxuXHQ8L3RhYmxlPlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLlN0eWxlRHJvcGRvd25Db250YWluZXIge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHotaW5kZXg6IDEwMDA7XG5cdG92ZXJmbG93OiBhdXRvO1xuXHRjdXJzb3I6IGRlZmF1bHQ7XG5cdHdpZHRoOiAyNTBweDtcblx0aGVpZ2h0OiAyNTBweDtcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG5cdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xufVxuXG4uQ29sb3JEcm9wZG93bkNvbnRhaW5lciB7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0ei1pbmRleDogMTAwMDtcblx0b3ZlcmZsb3c6IGF1dG87XG5cdGN1cnNvcjogZGVmYXVsdDtcblx0d2lkdGg6IDI1MHB4O1xuXHRoZWlnaHQ6IDE1MHB4O1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XG59XG5cbi5FZGl0b3JUb29sYmFyRG9tTm9kZSB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChidXR0b25zL2JnLWZhZGUucG5nKTtcblx0YmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggLTUwcHg7XG59XG5cbi5FZGl0b3JUb29sYmFyU21hbGxCZyB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvdG9vbGJhci1iZy5naWYpO1xuXHRiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG5cdGJhY2tncm91bmQtcG9zaXRpb246IDBweCAwcHg7XG59XG5cbi8qXG5ib2R5IHtcblx0YmFja2dyb3VuZDp1cmwoaW1hZ2VzL2JsYW5rLmdpZikgZml4ZWQ7XG59Ki9cblxuLklFRml4ZWRUb29sYmFyIHtcblx0cG9zaXRpb246YWJzb2x1dGU7XG5cdC8qIHRvcDowOyAqL1xuXHR0b3A6IGV4cHJlc3Npb24oZXZhbCgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3ApKTtcbn1cblxuZGl2LmJpZ0ljb24ge1xuXHR3aWR0aDogNDBweDtcblx0aGVpZ2h0OiA0MHB4OyBcblx0LyogYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7ICovXG5cdC8qIGJvcmRlcjogMXB4IHNvbGlkICNhNmE3YTM7ICovXG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBUcmVidWNoZXQsIFRhaG9tYSwgQXJpYWw7XG59XG5cbi5pY29uQ29udGFpbmVyIHtcblx0Zm9udC1mYW1pbHk6IFZlcmRhbmEsIFRyZWJ1Y2hldCwgVGFob21hLCBBcmlhbDtcblx0Zm9udC1zaXplOiAxM3B4O1xuXHRmbG9hdDogbGVmdDtcblx0aGVpZ2h0OiAxOHB4O1xuXHRkaXNwbGF5OiBibG9jaztcblx0LyogYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7ICovXG5cdGN1cnNvcjogcG9pbnRlcjtcblx0cGFkZGluZzogMXB4IDRweCAxcHggMXB4OyAvKiBhbG1vc3QgdGhlIHNhbWUgYXMgYSB0cmFuc3BhcmVudCBib3JkZXIgKi9cblx0Ym9yZGVyOiAwcHg7XG59XG5cbi5kb2pvRTJUQkljb24ge1xuXHRkaXNwbGF5OiBibG9jaztcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRtaW4td2lkdGg6IDE4cHg7XG5cdHdpZHRoOiAxOHB4O1xuXHRoZWlnaHQ6IDE4cHg7XG5cdC8qIGJhY2tncm91bmQtY29sb3I6ICNhNmE3YTM7ICovXG5cdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChidXR0b25zL2FnZ3JlZ2F0ZS5naWYpO1xufVxuXG5cbi5kb2pvRTJUQkljb25bY2xhc3N+PWRvam9FMlRCSWNvbl0ge1xufVxuXG4uVG9vbGJhckJ1dHRvbkxhdGNoZWQge1xuCWJvcmRlcjogIzMxNmFjNSAxcHggc29saWQ7ICFpbXBvcnRhbnQ7XG4JcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xuCWJhY2tncm91bmQtY29sb3I6ICNjMWQyZWU7XG59XG5cbi5Ub29sYmFyQnV0dG9uSGlnaGxpZ2h0ZWQge1xuCWJvcmRlcjogIzMxNmFjNSAxcHggc29saWQ7ICFpbXBvcnRhbnQ7XG4JcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xuCWJhY2tncm91bmQtY29sb3I6ICNkZmYxZmY7XG59XG5cbi5Ub29sYmFyQnV0dG9uRGlzYWJsZWR7XG4JZmlsdGVyOiBncmF5KCkgYWxwaGEob3BhY2l0eT0zMCk7IC8qIElFICovXG4Jb3BhY2l0eTogMC4zMDsgLyogU2FmYXJpLCBPcGVyYSBhbmQgTW96aWxsYSAqL1xufVxuXG4uaGVhZGluZ0NvbnRhaW5lciB7XG5cdHdpZHRoOiAxNTBweDtcblx0aGVpZ2h0OiAzMHB4O1xuXHRtYXJnaW46IDBweDtcblx0LyogcGFkZGluZy1sZWZ0OiA1cHg7ICovXG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGxpbmUtaGVpZ2h0OiAyNXB4O1xuXHRib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XG5cdGJvcmRlci10b3A6IDFweCBzb2xpZCB3aGl0ZTtcbn1cblxuLkVkaXRvclRvb2xiYXJEb21Ob2RlIHNlbGVjdCB7XG5cdGZvbnQtc2l6ZTogMTRweDtcbn1cbiBcbi5kb2pvRTJUQkljb25fU2VwIHsgd2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7IG1heC13aWR0aDogNXB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggMHB4fVxuLmRvam9FMlRCSWNvbl9CYWNrY29sb3IgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMThweCAwcHh9XG4uZG9qb0UyVEJJY29uX0JvbGQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzZweCAwcHh9XG4uZG9qb0UyVEJJY29uX0NhbmNlbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDBweH1cbi5kb2pvRTJUQkljb25fQ29weSB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MnB4IDBweH1cbi5kb2pvRTJUQkljb25fTGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05MHB4IDBweH1cbi5kb2pvRTJUQkljb25fQ3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwOHB4IDBweH1cbi5kb2pvRTJUQkljb25fRGVsZXRlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyNnB4IDBweH1cbi5kb2pvRTJUQkljb25fVGV4dENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IDBweH1cbi5kb2pvRTJUQkljb25fQmFja2dyb3VuZENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MnB4IDBweH1cbi5kb2pvRTJUQkljb25fSW5kZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE4MHB4IDBweH1cbi5kb2pvRTJUQkljb25fSG9yaXpvbnRhbExpbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTk4cHggMHB4fVxuLmRvam9FMlRCSWNvbl9JbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTZweCAwcHh9XG4uZG9qb0UyVEJJY29uX051bWJlcmVkTGlzdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMzRweCAwcHh9XG4uZG9qb0UyVEJJY29uX1RhYmxlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI1MnB4IDBweH1cbi5kb2pvRTJUQkljb25fQnVsbGV0ZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MHB4IDBweH1cbi5kb2pvRTJUQkljb25fSXRhbGljIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4OHB4IDBweH1cbi5kb2pvRTJUQkljb25fQ2VudGVySnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMDZweCAwcHh9XG4uZG9qb0UyVEJJY29uX0Jsb2NrSnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMjRweCAwcHh9XG4uZG9qb0UyVEJJY29uX0xlZnRKdXN0aWZ5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM0MnB4IDBweH1cbi5kb2pvRTJUQkljb25fUmlnaHRKdXN0aWZ5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2MHB4IDBweH1cbi5kb2pvRTJUQkljb25fbGVmdF90b19yaWdodCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAwcHh9XG4uZG9qb0UyVEJJY29uX2xpc3RfYnVsbGV0X2luZGVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zOTZweCAwcHh9XG4uZG9qb0UyVEJJY29uX2xpc3RfYnVsbGV0X291dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDE0cHggMHB4fVxuLmRvam9FMlRCSWNvbl9saXN0X251bV9pbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDMycHggMHB4fVxuLmRvam9FMlRCSWNvbl9saXN0X251bV9vdXRkZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ1MHB4IDBweH1cbi5kb2pvRTJUQkljb25fT3V0ZGVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00NjhweCAwcHh9XG4uZG9qb0UyVEJJY29uX1Bhc3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4NnB4IDBweH1cbi5kb2pvRTJUQkljb25fUmVkbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MDRweCAwcHh9XG5kb2pvRTJUQkljb25fUmVtb3ZlRm9ybWF0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUyMnB4IDBweH1cbi5kb2pvRTJUQkljb25fcmlnaHRfdG9fbGVmdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NDBweCAwcHh9XG4uZG9qb0UyVEJJY29uX1NhdmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTU4cHggMHB4fVxuLmRvam9FMlRCSWNvbl9TcGFjZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NzZweCAwcHh9XG4uZG9qb0UyVEJJY29uX1N0cmlrZVRocm91Z2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk0cHggMHB4fVxuLmRvam9FMlRCSWNvbl9TdWJzY3JpcHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjEycHggMHB4fVxuLmRvam9FMlRCSWNvbl9TdXBlcnNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MzBweCAwcHh9XG4uZG9qb0UyVEJJY29uX1VuZGVybGluZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NDhweCAwcHh9XG4uZG9qb0UyVEJJY29uX1VuZG8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjY2cHggMHB4fVxuLmRvam9FMlRCSWNvbl9XaWtpV29yZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02ODRweCAwcHh9XG5cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3JUb29sYmFyLmNzcyIpLCBUb29sYmFyTGF0Y2hlZEl0ZW1TdHlsZToiVG9vbGJhckJ1dHRvbkxhdGNoZWQiLCBUb29sYmFyRW5hYmxlZEl0ZW1TdHlsZToiVG9vbGJhckJ1dHRvbkVuYWJsZWQiLCBUb29sYmFyRGlzYWJsZWRJdGVtU3R5bGU6IlRvb2xiYXJCdXR0b25EaXNhYmxlZCIsIFRvb2xiYXJIaWdobGlnaHRlZEl0ZW1TdHlsZToiVG9vbGJhckJ1dHRvbkhpZ2hsaWdodGVkIiwgVG9vbGJhckhpZ2hsaWdodGVkU2VsZWN0U3R5bGU6IlRvb2xiYXJTZWxlY3RIaWdobGlnaHRlZCIsIFRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdEl0ZW1TdHlsZToiVG9vbGJhclNlbGVjdEhpZ2hsaWdodGVkSXRlbSIsIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXZhciBub2RlcyA9IGRvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3MoImRvam9FZGl0b3JUb29sYmFySXRlbSIsIHRoaXMuZG9tTm9kZSk7CisJdGhpcy5pdGVtcyA9IHt9OworCWZvciAodmFyIHggPSAwOyB4IDwgbm9kZXMubGVuZ3RoOyB4KyspIHsKKwkJdmFyIG5vZGUgPSBub2Rlc1t4XTsKKwkJdmFyIGl0ZW1uYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoImRvam9FVEl0ZW1OYW1lIik7CisJCWlmIChpdGVtbmFtZSkgeworCQkJdmFyIGl0ZW0gPSBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLmdldFRvb2xiYXJJdGVtKGl0ZW1uYW1lKTsKKwkJCWlmIChpdGVtKSB7CisJCQkJaXRlbS5jcmVhdGUobm9kZSwgdGhpcyk7CisJCQkJdGhpcy5pdGVtc1tpdGVtbmFtZS50b0xvd2VyQ2FzZSgpXSA9IGl0ZW07CisJCQl9IGVsc2UgeworCQkJCW5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJCX0KKwkJfQorCX0KK30sIHVwZGF0ZTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgY21kIGluIHRoaXMuaXRlbXMpIHsKKwkJdGhpcy5pdGVtc1tjbWRdLnJlZnJlc2hTdGF0ZSgpOworCX0KK30sIHNoYXJlR3JvdXA6IiIsIGNoZWNrQXZhaWxhYmlsaXR5OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuc2hhcmVHcm91cCkgeworCQl0aGlzLnBhcmVudC5mb2N1cygpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwlpZiAodGhpcy5zaGFyZUdyb3VwID09IGN1ckluc3QudG9vbGJhckdyb3VwKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpdCBpbiB0aGlzLml0ZW1zKSB7CisJCXRoaXMuaXRlbXNbaXRdLmRlc3Ryb3koKTsKKwkJZGVsZXRlIHRoaXMuaXRlbXNbaXRdOworCX0KKwlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhci5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9GaWx0ZXJpbmdUYWJsZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRmlsdGVyaW5nVGFibGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2OWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRmlsdGVyaW5nVGFibGUuanMKQEAgLTAsMCArMSw3MTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkZpbHRlcmluZ1RhYmxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5mb3JtYXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoIik7Citkb2pvLnJlcXVpcmUoImRvam8uY29sbGVjdGlvbnMuU3RvcmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnV0aWwiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5GaWx0ZXJpbmdUYWJsZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLnN0b3JlID0gbmV3IGRvam8uY29sbGVjdGlvbnMuU3RvcmUoKTsKKwl0aGlzLnZhbHVlRmllbGQgPSAiSWQiOworCXRoaXMubXVsdGlwbGUgPSBmYWxzZTsKKwl0aGlzLm1heFNlbGVjdCA9IDA7CisJdGhpcy5tYXhTb3J0YWJsZSA9IDE7CisJdGhpcy5taW5Sb3dzID0gMDsKKwl0aGlzLmRlZmF1bHREYXRlRm9ybWF0ID0gIiVEIjsKKwl0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwl0aGlzLmFsdGVybmF0ZVJvd3MgPSBmYWxzZTsKKwl0aGlzLmNvbHVtbnMgPSBbXTsKKwl0aGlzLnNvcnRJbmZvcm1hdGlvbiA9IFt7aW5kZXg6MCwgZGlyZWN0aW9uOjB9XTsKKwl0aGlzLmhlYWRDbGFzcyA9ICIiOworCXRoaXMudGJvZHlDbGFzcyA9ICIiOworCXRoaXMuaGVhZGVyQ2xhc3MgPSAiIjsKKwl0aGlzLmhlYWRlclVwQ2xhc3MgPSAic2VsZWN0ZWRVcCI7CisJdGhpcy5oZWFkZXJEb3duQ2xhc3MgPSAic2VsZWN0ZWREb3duIjsKKwl0aGlzLnJvd0NsYXNzID0gIiI7CisJdGhpcy5yb3dBbHRlcm5hdGVDbGFzcyA9ICJhbHQiOworCXRoaXMucm93U2VsZWN0ZWRDbGFzcyA9ICJzZWxlY3RlZCI7CisJdGhpcy5jb2x1bW5TZWxlY3RlZCA9ICJzb3J0ZWQtY29sdW1uIjsKK30sIHtpc0NvbnRhaW5lcjpmYWxzZSwgdGVtcGxhdGVQYXRoOm51bGwsIHRlbXBsYXRlQ3NzUGF0aDpudWxsLCBnZXRUeXBlRnJvbVN0cmluZzpmdW5jdGlvbiAocykgeworCXZhciBwYXJ0cyA9IHMuc3BsaXQoIi4iKSwgaSA9IDAsIG9iaiA9IGRqX2dsb2JhbDsKKwlkbyB7CisJCW9iaiA9IG9ialtwYXJ0c1tpKytdXTsKKwl9IHdoaWxlIChpIDwgcGFydHMubGVuZ3RoICYmIG9iaik7CisJcmV0dXJuIChvYmogIT0gZGpfZ2xvYmFsKSA/IG9iaiA6IG51bGw7Cit9LCBnZXRCeVJvdzpmdW5jdGlvbiAocm93KSB7CisJcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QnlLZXkoZG9qby5odG1sLmdldEF0dHJpYnV0ZShyb3csICJ2YWx1ZSIpKTsKK30sIGdldERhdGFCeVJvdzpmdW5jdGlvbiAocm93KSB7CisJcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RGF0YUJ5S2V5KGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUocm93LCAidmFsdWUiKSk7Cit9LCBnZXRSb3c6ZnVuY3Rpb24gKG9iaikgeworCXZhciByb3dzID0gdGhpcy5kb21Ob2RlLnRCb2RpZXNbMF0ucm93czsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuc3RvcmUuZ2V0RGF0YUJ5S2V5KGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUocm93c1tpXSwgInZhbHVlIikpID09IG9iaikgeworCQkJcmV0dXJuIHJvd3NbaV07CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9LCBnZXRDb2x1bW5JbmRleDpmdW5jdGlvbiAoZmllbGRQYXRoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29sdW1uc1tpXS5nZXRGaWVsZCgpID09IGZpZWxkUGF0aCkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfSwgZ2V0U2VsZWN0ZWREYXRhOmZ1bmN0aW9uICgpIHsKKwl2YXIgZGF0YSA9IHRoaXMuc3RvcmUuZ2V0KCk7CisJdmFyIGEgPSBbXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGRhdGFbaV0uaXNTZWxlY3RlZCkgeworCQkJYS5wdXNoKGRhdGFbaV0uc3JjKTsKKwkJfQorCX0KKwlpZiAodGhpcy5tdWx0aXBsZSkgeworCQlyZXR1cm4gYTsKKwl9IGVsc2UgeworCQlyZXR1cm4gYVswXTsKKwl9Cit9LCBpc1NlbGVjdGVkOmZ1bmN0aW9uIChvYmopIHsKKwl2YXIgZGF0YSA9IHRoaXMuc3RvcmUuZ2V0KCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCWlmIChkYXRhW2ldLnNyYyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30sIGlzVmFsdWVTZWxlY3RlZDpmdW5jdGlvbiAodmFsKSB7CisJdmFyIHYgPSB0aGlzLnN0b3JlLmdldEJ5S2V5KHZhbCk7CisJaWYgKHYpIHsKKwkJcmV0dXJuIHYuaXNTZWxlY3RlZDsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgaXNJbmRleFNlbGVjdGVkOmZ1bmN0aW9uIChpZHgpIHsKKwl2YXIgdiA9IHRoaXMuc3RvcmUuZ2V0QnlJbmRleChpZHgpOworCWlmICh2KSB7CisJCXJldHVybiB2LmlzU2VsZWN0ZWQ7CisJfQorCXJldHVybiBmYWxzZTsKK30sIGlzUm93U2VsZWN0ZWQ6ZnVuY3Rpb24gKHJvdykgeworCXZhciB2ID0gdGhpcy5nZXRCeVJvdyhyb3cpOworCWlmICh2KSB7CisJCXJldHVybiB2LmlzU2VsZWN0ZWQ7CisJfQorCXJldHVybiBmYWxzZTsKK30sIHJlc2V0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLnN0b3JlLmNsZWFyRGF0YSgpOworCXRoaXMuY29sdW1ucyA9IFtdOworCXRoaXMuc29ydEluZm9ybWF0aW9uID0gW3tpbmRleDowLCBkaXJlY3Rpb246MH1dOworCXRoaXMucmVzZXRTZWxlY3Rpb25zKCk7CisJdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7CisJdGhpcy5vblJlc2V0KCk7Cit9LCByZXNldFNlbGVjdGlvbnM6ZnVuY3Rpb24gKCkgeworCXRoaXMuc3RvcmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkgeworCQllbGVtZW50LmlzU2VsZWN0ZWQgPSBmYWxzZTsKKwl9KTsKK30sIG9uUmVzZXQ6ZnVuY3Rpb24gKCkgeworfSwgc2VsZWN0OmZ1bmN0aW9uIChvYmopIHsKKwl2YXIgZGF0YSA9IHRoaXMuc3RvcmUuZ2V0KCk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCWlmIChkYXRhW2ldLnNyYyA9PSBvYmopIHsKKwkJCWRhdGFbaV0uaXNTZWxlY3RlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwl0aGlzLm9uRGF0YVNlbGVjdChvYmopOworfSwgc2VsZWN0QnlWYWx1ZTpmdW5jdGlvbiAodmFsKSB7CisJdGhpcy5zZWxlY3QodGhpcy5zdG9yZS5nZXREYXRhQnlLZXkodmFsKSk7Cit9LCBzZWxlY3RCeUluZGV4OmZ1bmN0aW9uIChpZHgpIHsKKwl0aGlzLnNlbGVjdCh0aGlzLnN0b3JlLmdldERhdGFCeUluZGV4KGlkeCkpOworfSwgc2VsZWN0QnlSb3c6ZnVuY3Rpb24gKHJvdykgeworCXRoaXMuc2VsZWN0KHRoaXMuZ2V0RGF0YUJ5Um93KHJvdykpOworfSwgc2VsZWN0QWxsOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnN0b3JlLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHsKKwkJZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZTsKKwl9KTsKK30sIG9uRGF0YVNlbGVjdDpmdW5jdGlvbiAob2JqKSB7Cit9LCB0b2dnbGVTZWxlY3Rpb246ZnVuY3Rpb24gKG9iaikgeworCXZhciBkYXRhID0gdGhpcy5zdG9yZS5nZXQoKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGRhdGFbaV0uc3JjID09IG9iaikgeworCQkJZGF0YVtpXS5pc1NlbGVjdGVkID0gIWRhdGFbaV0uaXNTZWxlY3RlZDsKKwkJCWJyZWFrOworCQl9CisJfQorCXRoaXMub25EYXRhVG9nZ2xlKG9iaik7Cit9LCB0b2dnbGVTZWxlY3Rpb25CeVZhbHVlOmZ1bmN0aW9uICh2YWwpIHsKKwl0aGlzLnRvZ2dsZVNlbGVjdGlvbih0aGlzLnN0b3JlLmdldERhdGFCeUtleSh2YWwpKTsKK30sIHRvZ2dsZVNlbGVjdGlvbkJ5SW5kZXg6ZnVuY3Rpb24gKGlkeCkgeworCXRoaXMudG9nZ2xlU2VsZWN0aW9uKHRoaXMuc3RvcmUuZ2V0RGF0YUJ5SW5kZXgoaWR4KSk7Cit9LCB0b2dnbGVTZWxlY3Rpb25CeVJvdzpmdW5jdGlvbiAocm93KSB7CisJdGhpcy50b2dnbGVTZWxlY3Rpb24odGhpcy5nZXREYXRhQnlSb3cocm93KSk7Cit9LCB0b2dnbGVBbGw6ZnVuY3Rpb24gKCkgeworCXRoaXMuc3RvcmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkgeworCQllbGVtZW50LmlzU2VsZWN0ZWQgPSAhZWxlbWVudC5pc1NlbGVjdGVkOworCX0pOworfSwgb25EYXRhVG9nZ2xlOmZ1bmN0aW9uIChvYmopIHsKK30sIF9tZXRhOntmaWVsZDpudWxsLCBmb3JtYXQ6bnVsbCwgZmlsdGVyZXI6bnVsbCwgbm9Tb3J0OmZhbHNlLCBzb3J0VHlwZToiU3RyaW5nIiwgZGF0YVR5cGU6U3RyaW5nLCBzb3J0RnVuY3Rpb246bnVsbCwgZmlsdGVyRnVuY3Rpb246bnVsbCwgbGFiZWw6bnVsbCwgYWxpZ246ImxlZnQiLCB2YWxpZ246Im1pZGRsZSIsIGdldEZpZWxkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5maWVsZCB8fCB0aGlzLmxhYmVsOworfSwgZ2V0VHlwZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZGF0YVR5cGU7Cit9fSwgY3JlYXRlTWV0YURhdGE6ZnVuY3Rpb24gKG9iaikgeworCWZvciAodmFyIHAgaW4gdGhpcy5fbWV0YSkgeworCQlpZiAoIW9ialtwXSkgeworCQkJb2JqW3BdID0gdGhpcy5fbWV0YVtwXTsKKwkJfQorCX0KKwlpZiAoIW9iai5sYWJlbCkgeworCQlvYmoubGFiZWwgPSBvYmouZmllbGQ7CisJfQorCWlmICghb2JqLmZpbHRlckZ1bmN0aW9uKSB7CisJCW9iai5maWx0ZXJGdW5jdGlvbiA9IHRoaXMuX2RlZmF1bHRGaWx0ZXI7CisJfQorCXJldHVybiBvYmo7Cit9LCBwYXJzZU1ldGFkYXRhOmZ1bmN0aW9uIChoZWFkKSB7CisJdGhpcy5jb2x1bW5zID0gW107CisJdGhpcy5zb3J0SW5mb3JtYXRpb24gPSBbXTsKKwl2YXIgcm93ID0gaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKVswXTsKKwl2YXIgY2VsbHMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJaWYgKGNlbGxzLmxlbmd0aCA9PSAwKSB7CisJCWNlbGxzID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aCIpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBvID0gdGhpcy5jcmVhdGVNZXRhRGF0YSh7fSk7CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAiYWxpZ24iKSkgeworCQkJby5hbGlnbiA9IGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoY2VsbHNbaV0sICJhbGlnbiIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAidmFsaWduIikpIHsKKwkJCW8udmFsaWduID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgInZhbGlnbiIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAibm9zb3J0IikpIHsKKwkJCW8ubm9Tb3J0ID0gKGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoY2VsbHNbaV0sICJub3NvcnQiKSA9PSAidHJ1ZSIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAic29ydHVzaW5nIikpIHsKKwkJCXZhciB0cmFucyA9IGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoY2VsbHNbaV0sICJzb3J0dXNpbmciKTsKKwkJCXZhciBmID0gdGhpcy5nZXRUeXBlRnJvbVN0cmluZyh0cmFucyk7CisJCQlpZiAoZiAhPSBudWxsICYmIGYgIT0gd2luZG93ICYmIHR5cGVvZiAoZikgPT0gImZ1bmN0aW9uIikgeworCQkJCW8uc29ydEZ1bmN0aW9uID0gZjsKKwkJCX0KKwkJfQorCQlvLmxhYmVsID0gZG9qby5odG1sLnJlbmRlcmVkVGV4dENvbnRlbnQoY2VsbHNbaV0pOworCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShjZWxsc1tpXSwgImZpZWxkIikpIHsKKwkJCW8uZmllbGQgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGNlbGxzW2ldLCAiZmllbGQiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChvLmxhYmVsLmxlbmd0aCA+IDApIHsKKwkJCQlvLmZpZWxkID0gby5sYWJlbDsKKwkJCX0gZWxzZSB7CisJCQkJby5maWVsZCA9ICJmaWVsZCIgKyBpOworCQkJfQorCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAiZm9ybWF0IikpIHsKKwkJCW8uZm9ybWF0ID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgImZvcm1hdCIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAiZGF0YVR5cGUiKSkgeworCQkJdmFyIHNvcnRUeXBlID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgImRhdGFUeXBlIik7CisJCQlpZiAoc29ydFR5cGUudG9Mb3dlckNhc2UoKSA9PSAiaHRtbCIgfHwgc29ydFR5cGUudG9Mb3dlckNhc2UoKSA9PSAibWFya3VwIikgeworCQkJCW8uc29ydFR5cGUgPSAiX19tYXJrdXBfXyI7CisJCQl9IGVsc2UgeworCQkJCXZhciB0eXBlID0gdGhpcy5nZXRUeXBlRnJvbVN0cmluZyhzb3J0VHlwZSk7CisJCQkJaWYgKHR5cGUpIHsKKwkJCQkJby5zb3J0VHlwZSA9IHNvcnRUeXBlOworCQkJCQlvLmRhdGFUeXBlID0gdHlwZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUoY2VsbHNbaV0sICJmaWx0ZXJ1c2luZyIpKSB7CisJCQl2YXIgdHJhbnMgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGNlbGxzW2ldLCAiZmlsdGVydXNpbmciKTsKKwkJCXZhciBmID0gdGhpcy5nZXRUeXBlRnJvbVN0cmluZyh0cmFucyk7CisJCQlpZiAoZiAhPSBudWxsICYmIGYgIT0gd2luZG93ICYmIHR5cGVvZiAoZikgPT0gImZ1bmN0aW9uIikgeworCQkJCW8uZmlsdGVyRnVuY3Rpb24gPSBmOworCQkJfQorCQl9CisJCXRoaXMuY29sdW1ucy5wdXNoKG8pOworCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShjZWxsc1tpXSwgInNvcnQiKSkgeworCQkJdmFyIGluZm8gPSB7aW5kZXg6aSwgZGlyZWN0aW9uOjB9OworCQkJdmFyIGRpciA9IGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoY2VsbHNbaV0sICJzb3J0Iik7CisJCQlpZiAoIWlzTmFOKHBhcnNlSW50KGRpcikpKSB7CisJCQkJZGlyID0gcGFyc2VJbnQoZGlyKTsKKwkJCQlpbmZvLmRpcmVjdGlvbiA9IChkaXIgIT0gMCkgPyAxIDogMDsKKwkJCX0gZWxzZSB7CisJCQkJaW5mby5kaXJlY3Rpb24gPSAoZGlyLnRvTG93ZXJDYXNlKCkgPT0gImRlc2MiKSA/IDEgOiAwOworCQkJfQorCQkJdGhpcy5zb3J0SW5mb3JtYXRpb24ucHVzaChpbmZvKTsKKwkJfQorCX0KKwlpZiAodGhpcy5zb3J0SW5mb3JtYXRpb24ubGVuZ3RoID09IDApIHsKKwkJdGhpcy5zb3J0SW5mb3JtYXRpb24ucHVzaCh7aW5kZXg6MCwgZGlyZWN0aW9uOjB9KTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5zb3J0SW5mb3JtYXRpb24ubGVuZ3RoID4gdGhpcy5tYXhTb3J0YWJsZSkgeworCQkJdGhpcy5zb3J0SW5mb3JtYXRpb24ubGVuZ3RoID0gdGhpcy5tYXhTb3J0YWJsZTsKKwkJfQorCX0KK30sIHBhcnNlRGF0YTpmdW5jdGlvbiAoYm9keSkgeworCWlmIChib2R5LnJvd3MubGVuZ3RoID09IDAgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJdmFyIHNlbGYgPSB0aGlzOworCXRoaXNbIl9fc2VsZWN0ZWRfXyJdID0gW107CisJdmFyIGFyciA9IHRoaXMuc3RvcmUuZ2V0RnJvbUh0bWwodGhpcy5jb2x1bW5zLCBib2R5LCBmdW5jdGlvbiAob2JqLCByb3cpIHsKKwkJaWYgKHR5cGVvZiAob2JqW3NlbGYudmFsdWVGaWVsZF0pID09ICJ1bmRlZmluZWQiIHx8IG9ialtzZWxmLnZhbHVlRmllbGRdID09IG51bGwpIHsKKwkJCW9ialtzZWxmLnZhbHVlRmllbGRdID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShyb3csICJ2YWx1ZSIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKHJvdywgInNlbGVjdGVkIikgPT0gInRydWUiKSB7CisJCQlzZWxmWyJfX3NlbGVjdGVkX18iXS5wdXNoKG9iaik7CisJCX0KKwl9KTsKKwl0aGlzLnN0b3JlLnNldERhdGEoYXJyLCB0cnVlKTsKKwl0aGlzLnJlbmRlcigpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpc1siX19zZWxlY3RlZF9fIl0ubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5zZWxlY3QodGhpc1siX19zZWxlY3RlZF9fIl1baV0pOworCX0KKwl0aGlzLnJlbmRlclNlbGVjdGlvbnMoKTsKKwlkZWxldGUgdGhpc1siX19zZWxlY3RlZF9fIl07CisJdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30sIG9uU2VsZWN0OmZ1bmN0aW9uIChlKSB7CisJdmFyIHJvdyA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoZS50YXJnZXQsICJ0ciIpOworCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKHJvdywgImVtcHR5Um93IikpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgYm9keSA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUocm93LCAidGJvZHkiKTsKKwlpZiAodGhpcy5tdWx0aXBsZSkgeworCQlpZiAoZS5zaGlmdEtleSkgeworCQkJdmFyIHN0YXJ0Um93OworCQkJdmFyIHJvd3MgPSBib2R5LnJvd3M7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAocm93c1tpXSA9PSByb3cpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh0aGlzLmlzUm93U2VsZWN0ZWQocm93c1tpXSkpIHsKKwkJCQkJc3RhcnRSb3cgPSByb3dzW2ldOworCQkJCX0KKwkJCX0KKwkJCWlmICghc3RhcnRSb3cpIHsKKwkJCQlzdGFydFJvdyA9IHJvdzsKKwkJCQlmb3IgKDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChyb3dzW2ldKSkgeworCQkJCQkJcm93ID0gcm93c1tpXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXNldFNlbGVjdGlvbnMoKTsKKwkJCWlmIChzdGFydFJvdyA9PSByb3cpIHsKKwkJCQl0aGlzLnRvZ2dsZVNlbGVjdGlvbkJ5Um93KHJvdyk7CisJCQl9IGVsc2UgeworCQkJCXZhciBkb1NlbGVjdCA9IGZhbHNlOworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAocm93c1tpXSA9PSBzdGFydFJvdykgeworCQkJCQkJZG9TZWxlY3QgPSB0cnVlOworCQkJCQl9CisJCQkJCWlmIChkb1NlbGVjdCkgeworCQkJCQkJdGhpcy5zZWxlY3RCeVJvdyhyb3dzW2ldKTsKKwkJCQkJfQorCQkJCQlpZiAocm93c1tpXSA9PSByb3cpIHsKKwkJCQkJCWRvU2VsZWN0ID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLnRvZ2dsZVNlbGVjdGlvbkJ5Um93KHJvdyk7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLnJlc2V0U2VsZWN0aW9ucygpOworCQl0aGlzLnRvZ2dsZVNlbGVjdGlvbkJ5Um93KHJvdyk7CisJfQorCXRoaXMucmVuZGVyU2VsZWN0aW9ucygpOworfSwgb25Tb3J0OmZ1bmN0aW9uIChlKSB7CisJdmFyIG9sZEluZGV4ID0gdGhpcy5zb3J0SW5kZXg7CisJdmFyIG9sZERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbjsKKwl2YXIgc291cmNlID0gZS50YXJnZXQ7CisJdmFyIHJvdyA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoc291cmNlLCAidHIiKTsKKwl2YXIgY2VsbFRhZyA9ICJ0ZCI7CisJaWYgKHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZShjZWxsVGFnKS5sZW5ndGggPT0gMCkgeworCQljZWxsVGFnID0gInRoIjsKKwl9CisJdmFyIGhlYWRlcnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2VsbFRhZyk7CisJdmFyIGhlYWRlciA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoc291cmNlLCBjZWxsVGFnKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKKwkJZG9qby5odG1sLnNldENsYXNzKGhlYWRlcnNbaV0sIHRoaXMuaGVhZGVyQ2xhc3MpOworCQlpZiAoaGVhZGVyc1tpXSA9PSBoZWFkZXIpIHsKKwkJCWlmICh0aGlzLnNvcnRJbmZvcm1hdGlvblswXS5pbmRleCAhPSBpKSB7CisJCQkJdGhpcy5zb3J0SW5mb3JtYXRpb24udW5zaGlmdCh7aW5kZXg6aSwgZGlyZWN0aW9uOjB9KTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5zb3J0SW5mb3JtYXRpb25bMF0gPSB7aW5kZXg6aSwgZGlyZWN0aW9uOih+dGhpcy5zb3J0SW5mb3JtYXRpb25bMF0uZGlyZWN0aW9uKSAmIDF9OworCQkJfQorCQl9CisJfQorCXRoaXMuc29ydEluZm9ybWF0aW9uLmxlbmd0aCA9IE1hdGgubWluKHRoaXMuc29ydEluZm9ybWF0aW9uLmxlbmd0aCwgdGhpcy5tYXhTb3J0YWJsZSk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNvcnRJbmZvcm1hdGlvbi5sZW5ndGg7IGkrKykgeworCQl2YXIgaWR4ID0gdGhpcy5zb3J0SW5mb3JtYXRpb25baV0uaW5kZXg7CisJCXZhciBkaXIgPSAofnRoaXMuc29ydEluZm9ybWF0aW9uW2ldLmRpcmVjdGlvbikgJiAxOworCQlkb2pvLmh0bWwuc2V0Q2xhc3MoaGVhZGVyc1tpZHhdLCBkaXIgPT0gMCA/IHRoaXMuaGVhZGVyRG93bkNsYXNzIDogdGhpcy5oZWFkZXJVcENsYXNzKTsKKwl9CisJdGhpcy5yZW5kZXIoKTsKK30sIG9uRmlsdGVyOmZ1bmN0aW9uICgpIHsKK30sIF9kZWZhdWx0RmlsdGVyOmZ1bmN0aW9uIChvYmopIHsKKwlyZXR1cm4gdHJ1ZTsKK30sIHNldEZpbHRlcjpmdW5jdGlvbiAoZmllbGQsIGZuKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29sdW1uc1tpXS5nZXRGaWVsZCgpID09IGZpZWxkKSB7CisJCQl0aGlzLmNvbHVtbnNbaV0uZmlsdGVyRnVuY3Rpb24gPSBmbjsKKwkJCWJyZWFrOworCQl9CisJfQorCXRoaXMuYXBwbHlGaWx0ZXJzKCk7Cit9LCBzZXRGaWx0ZXJCeUluZGV4OmZ1bmN0aW9uIChpZHgsIGZuKSB7CisJdGhpcy5jb2x1bW5zW2lkeF0uZmlsdGVyRnVuY3Rpb24gPSBmbjsKKwl0aGlzLmFwcGx5RmlsdGVycygpOworfSwgY2xlYXJGaWx0ZXI6ZnVuY3Rpb24gKGZpZWxkKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29sdW1uc1tpXS5nZXRGaWVsZCgpID09IGZpZWxkKSB7CisJCQl0aGlzLmNvbHVtbnNbaV0uZmlsdGVyRnVuY3Rpb24gPSB0aGlzLl9kZWZhdWx0RmlsdGVyOworCQkJYnJlYWs7CisJCX0KKwl9CisJdGhpcy5hcHBseUZpbHRlcnMoKTsKK30sIGNsZWFyRmlsdGVyQnlJbmRleDpmdW5jdGlvbiAoaWR4KSB7CisJdGhpcy5jb2x1bW5zW2lkeF0uZmlsdGVyRnVuY3Rpb24gPSB0aGlzLl9kZWZhdWx0RmlsdGVyOworCXRoaXMuYXBwbHlGaWx0ZXJzKCk7Cit9LCBjbGVhckZpbHRlcnM6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuY29sdW1uc1tpXS5maWx0ZXJGdW5jdGlvbiA9IHRoaXMuX2RlZmF1bHRGaWx0ZXI7CisJfQorCXZhciByb3dzID0gdGhpcy5kb21Ob2RlLnRCb2RpZXNbMF0ucm93czsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJcm93c1tpXS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCWlmICh0aGlzLmFsdGVybmF0ZVJvd3MpIHsKKwkJCWRvam8uaHRtbFsoKGkgJSAyID09IDEpID8gImFkZENsYXNzIiA6ICJyZW1vdmVDbGFzcyIpXShyb3dzW2ldLCB0aGlzLnJvd0FsdGVybmF0ZUNsYXNzKTsKKwkJfQorCX0KKwl0aGlzLm9uRmlsdGVyKCk7Cit9LCBhcHBseUZpbHRlcnM6ZnVuY3Rpb24gKCkgeworCXZhciBhbHQgPSAwOworCXZhciByb3dzID0gdGhpcy5kb21Ob2RlLnRCb2RpZXNbMF0ucm93czsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGIgPSB0cnVlOworCQl2YXIgcm93ID0gcm93c1tpXTsKKwkJZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHsKKwkJCXZhciB2YWx1ZSA9IHRoaXMuc3RvcmUuZ2V0RmllbGQodGhpcy5nZXREYXRhQnlSb3cocm93KSwgdGhpcy5jb2x1bW5zW2pdLmdldEZpZWxkKCkpOworCQkJaWYgKHRoaXMuY29sdW1uc1tqXS5nZXRUeXBlKCkgPT0gRGF0ZSAmJiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5nZXRZZWFyKSB7CisJCQkJdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7CisJCQl9CisJCQlpZiAoIXRoaXMuY29sdW1uc1tqXS5maWx0ZXJGdW5jdGlvbih2YWx1ZSkpIHsKKwkJCQliID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcm93LnN0eWxlLmRpc3BsYXkgPSAoYiA/ICIiIDogIm5vbmUiKTsKKwkJaWYgKGIgJiYgdGhpcy5hbHRlcm5hdGVSb3dzKSB7CisJCQlkb2pvLmh0bWxbKChhbHQrKyAlIDIgPT0gMSkgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIildKHJvdywgdGhpcy5yb3dBbHRlcm5hdGVDbGFzcyk7CisJCX0KKwl9CisJdGhpcy5vbkZpbHRlcigpOworfSwgY3JlYXRlU29ydGVyOmZ1bmN0aW9uIChpbmZvKSB7CisJdmFyIHNlbGYgPSB0aGlzOworCXZhciBzb3J0RnVuY3Rpb25zID0gW107CisJZnVuY3Rpb24gY3JlYXRlU29ydEZ1bmN0aW9uKGZpZWxkSW5kZXgsIGRpcikgeworCQl2YXIgbWV0YSA9IHNlbGYuY29sdW1uc1tmaWVsZEluZGV4XTsKKwkJdmFyIGZpZWxkID0gbWV0YS5nZXRGaWVsZCgpOworCQlyZXR1cm4gZnVuY3Rpb24gKHJvd0EsIHJvd0IpIHsKKwkJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKHJvd0EsICJlbXB0eVJvdyIpKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShyb3dCLCAiZW1wdHlSb3ciKSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXZhciBhID0gc2VsZi5zdG9yZS5nZXRGaWVsZChzZWxmLmdldERhdGFCeVJvdyhyb3dBKSwgZmllbGQpOworCQkJdmFyIGIgPSBzZWxmLnN0b3JlLmdldEZpZWxkKHNlbGYuZ2V0RGF0YUJ5Um93KHJvd0IpLCBmaWVsZCk7CisJCQl2YXIgcmV0ID0gMDsKKwkJCWlmIChhID4gYikgeworCQkJCXJldCA9IDE7CisJCQl9CisJCQlpZiAoYSA8IGIpIHsKKwkJCQlyZXQgPSAtMTsKKwkJCX0KKwkJCXJldHVybiBkaXIgKiByZXQ7CisJCX07CisJfQorCXZhciBjdXJyZW50ID0gMDsKKwl2YXIgbWF4ID0gTWF0aC5taW4oaW5mby5sZW5ndGgsIHRoaXMubWF4U29ydGFibGUsIHRoaXMuY29sdW1ucy5sZW5ndGgpOworCXdoaWxlIChjdXJyZW50IDwgbWF4KSB7CisJCXZhciBkaXJlY3Rpb24gPSAoaW5mb1tjdXJyZW50XS5kaXJlY3Rpb24gPT0gMCkgPyAxIDogLTE7CisJCXNvcnRGdW5jdGlvbnMucHVzaChjcmVhdGVTb3J0RnVuY3Rpb24oaW5mb1tjdXJyZW50XS5pbmRleCwgZGlyZWN0aW9uKSk7CisJCWN1cnJlbnQrKzsKKwl9CisJcmV0dXJuIGZ1bmN0aW9uIChyb3dBLCByb3dCKSB7CisJCXZhciBpZHggPSAwOworCQl3aGlsZSAoaWR4IDwgc29ydEZ1bmN0aW9ucy5sZW5ndGgpIHsKKwkJCXZhciByZXQgPSBzb3J0RnVuY3Rpb25zW2lkeCsrXShyb3dBLCByb3dCKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfTsKK30sIGNyZWF0ZVJvdzpmdW5jdGlvbiAob2JqKSB7CisJdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24ocm93KTsKKwlpZiAob2JqLmtleSAhPSBudWxsKSB7CisJCXJvdy5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgb2JqLmtleSk7CisJfQorCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7CisJCXZhciBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKKwkJY2VsbC5zZXRBdHRyaWJ1dGUoImFsaWduIiwgdGhpcy5jb2x1bW5zW2pdLmFsaWduKTsKKwkJY2VsbC5zZXRBdHRyaWJ1dGUoInZhbGlnbiIsIHRoaXMuY29sdW1uc1tqXS52YWxpZ24pOworCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihjZWxsKTsKKwkJdmFyIHZhbCA9IHRoaXMuc3RvcmUuZ2V0RmllbGQob2JqLnNyYywgdGhpcy5jb2x1bW5zW2pdLmdldEZpZWxkKCkpOworCQlpZiAodHlwZW9mICh2YWwpID09ICJ1bmRlZmluZWQiKSB7CisJCQl2YWwgPSAiIjsKKwkJfQorCQl0aGlzLmZpbGxDZWxsKGNlbGwsIHRoaXMuY29sdW1uc1tqXSwgdmFsKTsKKwkJcm93LmFwcGVuZENoaWxkKGNlbGwpOworCX0KKwlyZXR1cm4gcm93OworfSwgZmlsbENlbGw6ZnVuY3Rpb24gKGNlbGwsIG1ldGEsIHZhbCkgeworCWlmIChtZXRhLnNvcnRUeXBlID09ICJfX21hcmt1cF9fIikgeworCQljZWxsLmlubmVySFRNTCA9IHZhbDsKKwl9IGVsc2UgeworCQlpZiAobWV0YS5nZXRUeXBlKCkgPT0gRGF0ZSkgeworCQkJdmFsID0gbmV3IERhdGUodmFsKTsKKwkJCWlmICghaXNOYU4odmFsKSkgeworCQkJCXZhciBmb3JtYXQgPSB0aGlzLmRlZmF1bHREYXRlRm9ybWF0OworCQkJCWlmIChtZXRhLmZvcm1hdCkgeworCQkJCQlmb3JtYXQgPSBtZXRhLmZvcm1hdDsKKwkJCQl9CisJCQkJY2VsbC5pbm5lckhUTUwgPSBkb2pvLmRhdGUuc3RyZnRpbWUodmFsLCBmb3JtYXQpOworCQkJfSBlbHNlIHsKKwkJCQljZWxsLmlubmVySFRNTCA9IHZhbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgiTnVtYmVyIG51bWJlciBpbnQgSW50ZWdlciBmbG9hdCBGbG9hdCIuaW5kZXhPZihtZXRhLmdldFR5cGUoKSkgPiAtMSkgeworCQkJCWlmICh2YWwubGVuZ3RoID09IDApIHsKKwkJCQkJdmFsID0gIjAiOworCQkJCX0KKwkJCQl2YXIgbiA9IHBhcnNlRmxvYXQodmFsLCAxMCkgKyAiIjsKKwkJCQlpZiAobi5pbmRleE9mKCIuIikgPiAtMSkgeworCQkJCQluID0gZG9qby5tYXRoLnJvdW5kKHBhcnNlRmxvYXQodmFsLCAxMCksIDIpOworCQkJCX0KKwkJCQljZWxsLmlubmVySFRNTCA9IG47CisJCQl9IGVsc2UgeworCQkJCWNlbGwuaW5uZXJIVE1MID0gdmFsOworCQkJfQorCQl9CisJfQorfSwgcHJlZmlsbDpmdW5jdGlvbiAoKSB7CisJdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7CisJdmFyIGJvZHkgPSB0aGlzLmRvbU5vZGUudEJvZGllc1swXTsKKwl3aGlsZSAoYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJYm9keS5yZW1vdmVDaGlsZChib2R5LmNoaWxkTm9kZXNbMF0pOworCX0KKwlpZiAodGhpcy5taW5Sb3dzID4gMCkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWluUm93czsgaSsrKSB7CisJCQl2YXIgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKKwkJCWlmICh0aGlzLmFsdGVybmF0ZVJvd3MpIHsKKwkJCQlkb2pvLmh0bWxbKChpICUgMiA9PSAxKSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiKV0ocm93LCB0aGlzLnJvd0FsdGVybmF0ZUNsYXNzKTsKKwkJCX0KKwkJCXJvdy5zZXRBdHRyaWJ1dGUoImVtcHR5Um93IiwgInRydWUiKTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7CisJCQkJdmFyIGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOworCQkJCWNlbGwuaW5uZXJIVE1MID0gIiZuYnNwOyI7CisJCQkJcm93LmFwcGVuZENoaWxkKGNlbGwpOworCQkJfQorCQkJYm9keS5hcHBlbmRDaGlsZChyb3cpOworCQl9CisJfQorfSwgaW5pdDpmdW5jdGlvbiAoKSB7CisJdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7CisJdmFyIGhlYWQgPSB0aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIilbMF07CisJaWYgKGhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIikubGVuZ3RoID09IDApIHsKKwkJdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7CisJCQljZWxsLnNldEF0dHJpYnV0ZSgiYWxpZ24iLCB0aGlzLmNvbHVtbnNbaV0uYWxpZ24pOworCQkJY2VsbC5zZXRBdHRyaWJ1dGUoInZhbGlnbiIsIHRoaXMuY29sdW1uc1tpXS52YWxpZ24pOworCQkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24oY2VsbCk7CisJCQljZWxsLmlubmVySFRNTCA9IHRoaXMuY29sdW1uc1tpXS5sYWJlbDsKKwkJCXJvdy5hcHBlbmRDaGlsZChjZWxsKTsKKwkJCWlmICghdGhpcy5jb2x1bW5zW2ldLm5vU29ydCkgeworCQkJCWRvam8uZXZlbnQuY29ubmVjdChjZWxsLCAib25jbGljayIsIHRoaXMsICJvblNvcnQiKTsKKwkJCX0KKwkJfQorCQlkb2pvLmh0bWwucHJlcGVuZENoaWxkKHJvdywgaGVhZCk7CisJfQorCWlmICh0aGlzLnN0b3JlLmdldCgpLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIGlkeCA9IHRoaXMuZG9tTm9kZS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoOworCWlmICghaWR4IHx8IGlkeCA9PSAwIHx8IHRoaXMuZG9tTm9kZS50Qm9kaWVzWzBdLnJvd3NbMF0uZ2V0QXR0cmlidXRlKCJlbXB0eVJvdyIpID09ICJ0cnVlIikgeworCQlpZHggPSAwOworCQl2YXIgYm9keSA9IHRoaXMuZG9tTm9kZS50Qm9kaWVzWzBdOworCQl3aGlsZSAoYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJCWJvZHkucmVtb3ZlQ2hpbGQoYm9keS5jaGlsZE5vZGVzWzBdKTsKKwkJfQorCQl2YXIgZGF0YSA9IHRoaXMuc3RvcmUuZ2V0KCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdmFyIHJvdyA9IHRoaXMuY3JlYXRlUm93KGRhdGFbaV0pOworCQkJYm9keS5hcHBlbmRDaGlsZChyb3cpOworCQkJaWR4Kys7CisJCX0KKwl9CisJaWYgKHRoaXMubWluUm93cyA+IDAgJiYgaWR4IDwgdGhpcy5taW5Sb3dzKSB7CisJCWlkeCA9IHRoaXMubWluUm93cyAtIGlkeDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQkJcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKKwkJCXJvdy5zZXRBdHRyaWJ1dGUoImVtcHR5Um93IiwgInRydWUiKTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7CisJCQkJY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7CisJCQkJY2VsbC5pbm5lckhUTUwgPSAiJm5ic3A7IjsKKwkJCQlyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7CisJCQl9CisJCQlib2R5LmFwcGVuZENoaWxkKHJvdyk7CisJCX0KKwl9CisJdmFyIHJvdyA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKVswXS5yb3dzWzBdOworCXZhciBjZWxsVGFnID0gInRkIjsKKwlpZiAocm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKGNlbGxUYWcpLmxlbmd0aCA9PSAwKSB7CisJCWNlbGxUYWcgPSAidGgiOworCX0KKwl2YXIgaGVhZGVycyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZShjZWxsVGFnKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKKwkJZG9qby5odG1sLnNldENsYXNzKGhlYWRlcnNbaV0sIHRoaXMuaGVhZGVyQ2xhc3MpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc29ydEluZm9ybWF0aW9uLmxlbmd0aDsgaSsrKSB7CisJCXZhciBpZHggPSB0aGlzLnNvcnRJbmZvcm1hdGlvbltpXS5pbmRleDsKKwkJdmFyIGRpciA9ICh+dGhpcy5zb3J0SW5mb3JtYXRpb25baV0uZGlyZWN0aW9uKSAmIDE7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhoZWFkZXJzW2lkeF0sIGRpciA9PSAwID8gdGhpcy5oZWFkZXJEb3duQ2xhc3MgOiB0aGlzLmhlYWRlclVwQ2xhc3MpOworCX0KKwl0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCXJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWQ7Cit9LCByZW5kZXI6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7CisJCXZhciBiID0gdGhpcy5pbml0KCk7CisJCWlmICghYikgeworCQkJdGhpcy5wcmVmaWxsKCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdmFyIHJvd3MgPSBbXTsKKwl2YXIgYm9keSA9IHRoaXMuZG9tTm9kZS50Qm9kaWVzWzBdOworCXZhciBlbXB0eVJvd0lkeCA9IC0xOworCWZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5yb3dzLmxlbmd0aDsgaSsrKSB7CisJCXJvd3MucHVzaChib2R5LnJvd3NbaV0pOworCX0KKwl2YXIgc29ydEZ1bmN0aW9uID0gdGhpcy5jcmVhdGVTb3J0ZXIodGhpcy5zb3J0SW5mb3JtYXRpb24pOworCWlmIChzb3J0RnVuY3Rpb24pIHsKKwkJcm93cy5zb3J0KHNvcnRGdW5jdGlvbik7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5hbHRlcm5hdGVSb3dzKSB7CisJCQlkb2pvLmh0bWxbKChpICUgMiA9PSAxKSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiKV0ocm93c1tpXSwgdGhpcy5yb3dBbHRlcm5hdGVDbGFzcyk7CisJCX0KKwkJZG9qby5odG1sWyh0aGlzLmlzUm93U2VsZWN0ZWQoYm9keS5yb3dzW2ldKSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiKV0oYm9keS5yb3dzW2ldLCB0aGlzLnJvd1NlbGVjdGVkQ2xhc3MpOworCQlib2R5LmFwcGVuZENoaWxkKHJvd3NbaV0pOworCX0KK30sIHJlbmRlclNlbGVjdGlvbnM6ZnVuY3Rpb24gKCkgeworCXZhciBib2R5ID0gdGhpcy5kb21Ob2RlLnRCb2RpZXNbMF07CisJZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5LnJvd3MubGVuZ3RoOyBpKyspIHsKKwkJZG9qby5odG1sWyh0aGlzLmlzUm93U2VsZWN0ZWQoYm9keS5yb3dzW2ldKSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiKV0oYm9keS5yb3dzW2ldLCB0aGlzLnJvd1NlbGVjdGVkQ2xhc3MpOworCX0KK30sIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCXZhciBzZWxmID0gdGhpczsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5zdG9yZSwgIm9uU2V0RGF0YSIsIGZ1bmN0aW9uICgpIHsKKwkJc2VsZi5zdG9yZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7CisJCQllbGVtZW50LmlzU2VsZWN0ZWQgPSBmYWxzZTsKKwkJfSk7CisJCXNlbGYuaXNJbml0aWFsaXplZCA9IGZhbHNlOworCQl2YXIgYm9keSA9IHNlbGYuZG9tTm9kZS50Qm9kaWVzWzBdOworCQlpZiAoYm9keSkgeworCQkJd2hpbGUgKGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CisJCQkJYm9keS5yZW1vdmVDaGlsZChib2R5LmNoaWxkTm9kZXNbMF0pOworCQkJfQorCQl9CisJCXNlbGYucmVuZGVyKCk7CisJfSk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuc3RvcmUsICJvbkNsZWFyRGF0YSIsIGZ1bmN0aW9uICgpIHsKKwkJc2VsZi5pc0luaXRpYWxpemVkID0gZmFsc2U7CisJCXNlbGYucmVuZGVyKCk7CisJfSk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuc3RvcmUsICJvbkFkZERhdGEiLCBmdW5jdGlvbiAoYWRkZWRPYmplY3QpIHsKKwkJdmFyIHJvdyA9IHNlbGYuY3JlYXRlUm93KGFkZGVkT2JqZWN0KTsKKwkJc2VsZi5kb21Ob2RlLnRCb2RpZXNbMF0uYXBwZW5kQ2hpbGQocm93KTsKKwkJc2VsZi5yZW5kZXIoKTsKKwl9KTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5zdG9yZSwgIm9uQWRkRGF0YVJhbmdlIiwgZnVuY3Rpb24gKGFycikgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgeworCQkJYXJyW2ldLmlzU2VsZWN0ZWQgPSBmYWxzZTsKKwkJCXZhciByb3cgPSBzZWxmLmNyZWF0ZVJvdyhhcnJbaV0pOworCQkJc2VsZi5kb21Ob2RlLnRCb2RpZXNbMF0uYXBwZW5kQ2hpbGQocm93KTsKKwkJfQorCQlzZWxmLnJlbmRlcigpOworCX0pOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnN0b3JlLCAib25SZW1vdmVEYXRhIiwgZnVuY3Rpb24gKHJlbW92ZWRPYmplY3QpIHsKKwkJdmFyIHJvd3MgPSBzZWxmLmRvbU5vZGUudEJvZGllc1swXS5yb3dzOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChzZWxmLmdldERhdGFCeVJvdyhyb3dzW2ldKSA9PSByZW1vdmVkT2JqZWN0LnNyYykgeworCQkJCXJvd3NbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyb3dzW2ldKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzZWxmLnJlbmRlcigpOworCX0pOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnN0b3JlLCAib25VcGRhdGVGaWVsZCIsIGZ1bmN0aW9uIChvYmosIGZpZWxkUGF0aCwgdmFsKSB7CisJCXZhciByb3cgPSBzZWxmLmdldFJvdyhvYmopOworCQl2YXIgaWR4ID0gc2VsZi5nZXRDb2x1bW5JbmRleChmaWVsZFBhdGgpOworCQlpZiAocm93ICYmIHJvdy5jZWxsc1tpZHhdICYmIHNlbGYuY29sdW1uc1tpZHhdKSB7CisJCQlzZWxmLmZpbGxDZWxsKHJvdy5jZWxsc1tpZHhdLCBzZWxmLmNvbHVtbnNbaWR4XSwgdmFsKTsKKwkJfQorCX0pOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5zdG9yZS5rZXlGaWVsZCA9IHRoaXMudmFsdWVGaWVsZDsKKwlpZiAodGhpcy5kb21Ob2RlKSB7CisJCWlmICh0aGlzLmRvbU5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAidGFibGUiKSB7CisJCX0KKwkJaWYgKHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKVswXSkgeworCQkJdmFyIGhlYWQgPSB0aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIilbMF07CisJCQlpZiAodGhpcy5oZWFkQ2xhc3MubGVuZ3RoID4gMCkgeworCQkJCWhlYWQuY2xhc3NOYW1lID0gdGhpcy5oZWFkQ2xhc3M7CisJCQl9CisJCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLmRvbU5vZGUpOworCQkJdGhpcy5wYXJzZU1ldGFkYXRhKGhlYWQpOworCQkJdmFyIGhlYWRlciA9ICJ0ZCI7CisJCQlpZiAoaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZShoZWFkZXIpLmxlbmd0aCA9PSAwKSB7CisJCQkJaGVhZGVyID0gInRoIjsKKwkJCX0KKwkJCXZhciBoZWFkZXJzID0gaGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZShoZWFkZXIpOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKCF0aGlzLmNvbHVtbnNbaV0ubm9Tb3J0KSB7CisJCQkJCWRvam8uZXZlbnQuY29ubmVjdChoZWFkZXJzW2ldLCAib25jbGljayIsIHRoaXMsICJvblNvcnQiKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGhlYWQiKSk7CisJCX0KKwkJaWYgKHRoaXMuZG9tTm9kZS50Qm9kaWVzLmxlbmd0aCA8IDEpIHsKKwkJCXZhciBib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKTsKKwkJCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChib2R5KTsKKwkJfSBlbHNlIHsKKwkJCXZhciBib2R5ID0gdGhpcy5kb21Ob2RlLnRCb2RpZXNbMF07CisJCX0KKwkJaWYgKHRoaXMudGJvZHlDbGFzcy5sZW5ndGggPiAwKSB7CisJCQlib2R5LmNsYXNzTmFtZSA9IHRoaXMudGJvZHlDbGFzczsKKwkJfQorCQlkb2pvLmV2ZW50LmNvbm5lY3QoYm9keSwgIm9uY2xpY2siLCB0aGlzLCAib25TZWxlY3QiKTsKKwkJdGhpcy5wYXJzZURhdGEoYm9keSk7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Zpc2hleWVMaXN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9GaXNoZXllTGlzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI1NzFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9GaXNoZXllTGlzdC5qcwpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRmlzaGV5ZUxpc3QiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC51dGlsIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5GaXNoZXllTGlzdCIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLnBvcyA9IHt4Oi0xLCB5Oi0xfTsKKwl0aGlzLkVER0UgPSB7Q0VOVEVSOjAsIExFRlQ6MSwgUklHSFQ6MiwgVE9QOjMsIEJPVFRPTTo0fTsKKwl0aGlzLnRpbWVyU2NhbGUgPSAxOworfSwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiZG9qb0h0bWxGaXNoZXllTGlzdEJhclwiPjwvZGl2PiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZG9qb0h0bWxGaXNoZXllTGlzdEl0ZW1MYWJlbCB7XG5cdGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuXHRib3JkZXI6IDJweCBzb2xpZCAjNjY2O1xuXHRwYWRkaW5nOiAycHg7XG5cdHRleHQtYWxpZ246IGNlbnRlcjtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHRkaXNwbGF5OiBub25lO1xufVxuXG4uZG9qb0h0bWxGaXNoZXllTGlzdEl0ZW1MYWJlbC5zZWxlY3RlZCB7XG5cdGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uZG9qb0h0bWxGaXNoZXllTGlzdEl0ZW1JbWFnZSB7XG5cdGJvcmRlcjogMHB4O1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kb2pvSHRtbEZpc2hleWVMaXN0SXRlbSB7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0ei1pbmRleDogMjtcbn1cblxuLmRvam9IdG1sRmlzaGV5ZUxpc3RCYXIge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvRmlzaGV5ZUxpc3QuY3NzIiksIGlzQ29udGFpbmVyOnRydWUsIHNuYXJmQ2hpbGREb21PdXRwdXQ6dHJ1ZSwgaXRlbVdpZHRoOjQwLCBpdGVtSGVpZ2h0OjQwLCBpdGVtTWF4V2lkdGg6MTUwLCBpdGVtTWF4SGVpZ2h0OjE1MCwgb3JpZW50YXRpb246Imhvcml6b250YWwiLCBjb25zZXJ2YXRpdmVUcmlnZ2VyOmZhbHNlLCBlZmZlY3RVbml0czoyLCBpdGVtUGFkZGluZzoxMCwgYXR0YWNoRWRnZToiY2VudGVyIiwgbGFiZWxFZGdlOiJib3R0b20iLCBlbmFibGVDcmFwcHlTdmdTdXBwb3J0OmZhbHNlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKKwl0aGlzLmlzSG9yaXpvbnRhbCA9ICh0aGlzLm9yaWVudGF0aW9uID09ICJob3Jpem9udGFsIik7CisJdGhpcy5zZWxlY3RlZE5vZGUgPSAtMTsKKwl0aGlzLmlzT3ZlciA9IGZhbHNlOworCXRoaXMuaGl0WDEgPSAtMTsKKwl0aGlzLmhpdFkxID0gLTE7CisJdGhpcy5oaXRYMiA9IC0xOworCXRoaXMuaGl0WTIgPSAtMTsKKwl0aGlzLmFuY2hvckVkZ2UgPSB0aGlzLl90b0VkZ2UodGhpcy5hdHRhY2hFZGdlLCB0aGlzLkVER0UuQ0VOVEVSKTsKKwl0aGlzLmxhYmVsRWRnZSA9IHRoaXMuX3RvRWRnZSh0aGlzLmxhYmVsRWRnZSwgdGhpcy5FREdFLlRPUCk7CisJaWYgKHRoaXMuaXNIb3Jpem9udGFsICYmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLkxFRlQpKSB7CisJCXRoaXMuYW5jaG9yRWRnZSA9IHRoaXMuRURHRS5DRU5URVI7CisJfQorCWlmICh0aGlzLmlzSG9yaXpvbnRhbCAmJiAodGhpcy5hbmNob3JFZGdlID09IHRoaXMuRURHRS5SSUdIVCkpIHsKKwkJdGhpcy5hbmNob3JFZGdlID0gdGhpcy5FREdFLkNFTlRFUjsKKwl9CisJaWYgKCF0aGlzLmlzSG9yaXpvbnRhbCAmJiAodGhpcy5hbmNob3JFZGdlID09IHRoaXMuRURHRS5UT1ApKSB7CisJCXRoaXMuYW5jaG9yRWRnZSA9IHRoaXMuRURHRS5DRU5URVI7CisJfQorCWlmICghdGhpcy5pc0hvcml6b250YWwgJiYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuQk9UVE9NKSkgeworCQl0aGlzLmFuY2hvckVkZ2UgPSB0aGlzLkVER0UuQ0VOVEVSOworCX0KKwlpZiAodGhpcy5sYWJlbEVkZ2UgPT0gdGhpcy5FREdFLkNFTlRFUikgeworCQl0aGlzLmxhYmVsRWRnZSA9IHRoaXMuRURHRS5UT1A7CisJfQorCWlmICh0aGlzLmlzSG9yaXpvbnRhbCAmJiAodGhpcy5sYWJlbEVkZ2UgPT0gdGhpcy5FREdFLkxFRlQpKSB7CisJCXRoaXMubGFiZWxFZGdlID0gdGhpcy5FREdFLlRPUDsKKwl9CisJaWYgKHRoaXMuaXNIb3Jpem9udGFsICYmICh0aGlzLmxhYmVsRWRnZSA9PSB0aGlzLkVER0UuUklHSFQpKSB7CisJCXRoaXMubGFiZWxFZGdlID0gdGhpcy5FREdFLlRPUDsKKwl9CisJaWYgKCF0aGlzLmlzSG9yaXpvbnRhbCAmJiAodGhpcy5sYWJlbEVkZ2UgPT0gdGhpcy5FREdFLlRPUCkpIHsKKwkJdGhpcy5sYWJlbEVkZ2UgPSB0aGlzLkVER0UuTEVGVDsKKwl9CisJaWYgKCF0aGlzLmlzSG9yaXpvbnRhbCAmJiAodGhpcy5sYWJlbEVkZ2UgPT0gdGhpcy5FREdFLkJPVFRPTSkpIHsKKwkJdGhpcy5sYWJlbEVkZ2UgPSB0aGlzLkVER0UuTEVGVDsKKwl9CisJdGhpcy5wcm94aW1pdHlMZWZ0ID0gdGhpcy5pdGVtV2lkdGggKiAodGhpcy5lZmZlY3RVbml0cyAtIDAuNSk7CisJdGhpcy5wcm94aW1pdHlSaWdodCA9IHRoaXMuaXRlbVdpZHRoICogKHRoaXMuZWZmZWN0VW5pdHMgLSAwLjUpOworCXRoaXMucHJveGltaXR5VG9wID0gdGhpcy5pdGVtSGVpZ2h0ICogKHRoaXMuZWZmZWN0VW5pdHMgLSAwLjUpOworCXRoaXMucHJveGltaXR5Qm90dG9tID0gdGhpcy5pdGVtSGVpZ2h0ICogKHRoaXMuZWZmZWN0VW5pdHMgLSAwLjUpOworCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLkxFRlQpIHsKKwkJdGhpcy5wcm94aW1pdHlMZWZ0ID0gMDsKKwl9CisJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuUklHSFQpIHsKKwkJdGhpcy5wcm94aW1pdHlSaWdodCA9IDA7CisJfQorCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLlRPUCkgeworCQl0aGlzLnByb3hpbWl0eVRvcCA9IDA7CisJfQorCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLkJPVFRPTSkgeworCQl0aGlzLnByb3hpbWl0eUJvdHRvbSA9IDA7CisJfQorCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLkNFTlRFUikgeworCQl0aGlzLnByb3hpbWl0eUxlZnQgLz0gMjsKKwkJdGhpcy5wcm94aW1pdHlSaWdodCAvPSAyOworCQl0aGlzLnByb3hpbWl0eVRvcCAvPSAyOworCQl0aGlzLnByb3hpbWl0eUJvdHRvbSAvPSAyOworCX0KK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuX2luaXRpYWxpemVQb3NpdGlvbmluZygpOworCWlmICghdGhpcy5jb25zZXJ2YXRpdmVUcmlnZ2VyKSB7CisJCWRvam8uZXZlbnQuY29ubmVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJvbm1vdXNlbW92ZSIsIHRoaXMsICJfb25Nb3VzZU1vdmUiKTsKKwl9CisJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2VvdXQiLCB0aGlzLCAiX29uQm9keU91dCIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAiYWRkQ2hpbGQiLCB0aGlzLCAiX2luaXRpYWxpemVQb3NpdGlvbmluZyIpOworfSwgX2luaXRpYWxpemVQb3NpdGlvbmluZzpmdW5jdGlvbiAoKSB7CisJdGhpcy5pdGVtQ291bnQgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKKwl0aGlzLmJhcldpZHRoID0gKHRoaXMuaXNIb3Jpem9udGFsID8gdGhpcy5pdGVtQ291bnQgOiAxKSAqIHRoaXMuaXRlbVdpZHRoOworCXRoaXMuYmFySGVpZ2h0ID0gKHRoaXMuaXNIb3Jpem9udGFsID8gMSA6IHRoaXMuaXRlbUNvdW50KSAqIHRoaXMuaXRlbUhlaWdodDsKKwl0aGlzLnRvdGFsV2lkdGggPSB0aGlzLnByb3hpbWl0eUxlZnQgKyB0aGlzLnByb3hpbWl0eVJpZ2h0ICsgdGhpcy5iYXJXaWR0aDsKKwl0aGlzLnRvdGFsSGVpZ2h0ID0gdGhpcy5wcm94aW1pdHlUb3AgKyB0aGlzLnByb3hpbWl0eUJvdHRvbSArIHRoaXMuYmFySGVpZ2h0OworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl0aGlzLmNoaWxkcmVuW2ldLnBvc1ggPSB0aGlzLml0ZW1XaWR0aCAqICh0aGlzLmlzSG9yaXpvbnRhbCA/IGkgOiAwKTsKKwkJdGhpcy5jaGlsZHJlbltpXS5wb3NZID0gdGhpcy5pdGVtSGVpZ2h0ICogKHRoaXMuaXNIb3Jpem9udGFsID8gMCA6IGkpOworCQl0aGlzLmNoaWxkcmVuW2ldLmNlblggPSB0aGlzLmNoaWxkcmVuW2ldLnBvc1ggKyAodGhpcy5pdGVtV2lkdGggLyAyKTsKKwkJdGhpcy5jaGlsZHJlbltpXS5jZW5ZID0gdGhpcy5jaGlsZHJlbltpXS5wb3NZICsgKHRoaXMuaXRlbUhlaWdodCAvIDIpOworCQl2YXIgaXN6ID0gdGhpcy5pc0hvcml6b250YWwgPyB0aGlzLml0ZW1XaWR0aCA6IHRoaXMuaXRlbUhlaWdodDsKKwkJdmFyIHIgPSB0aGlzLmVmZmVjdFVuaXRzICogaXN6OworCQl2YXIgYyA9IHRoaXMuaXNIb3Jpem9udGFsID8gdGhpcy5jaGlsZHJlbltpXS5jZW5YIDogdGhpcy5jaGlsZHJlbltpXS5jZW5ZOworCQl2YXIgbGhzID0gdGhpcy5pc0hvcml6b250YWwgPyB0aGlzLnByb3hpbWl0eUxlZnQgOiB0aGlzLnByb3hpbWl0eVRvcDsKKwkJdmFyIHJocyA9IHRoaXMuaXNIb3Jpem9udGFsID8gdGhpcy5wcm94aW1pdHlSaWdodCA6IHRoaXMucHJveGltaXR5Qm90dG9tOworCQl2YXIgc2l6ID0gdGhpcy5pc0hvcml6b250YWwgPyB0aGlzLmJhcldpZHRoIDogdGhpcy5iYXJIZWlnaHQ7CisJCXZhciByYW5nZV9saHMgPSByOworCQl2YXIgcmFuZ2VfcmhzID0gcjsKKwkJaWYgKHJhbmdlX2xocyA+IGMgKyBsaHMpIHsKKwkJCXJhbmdlX2xocyA9IGMgKyBsaHM7CisJCX0KKwkJaWYgKHJhbmdlX3JocyA+IChzaXogLSBjICsgcmhzKSkgeworCQkJcmFuZ2VfcmhzID0gc2l6IC0gYyArIHJoczsKKwkJfQorCQl0aGlzLmNoaWxkcmVuW2ldLmVmZmVjdFJhbmdlTGVmdCA9IHJhbmdlX2xocyAvIGlzejsKKwkJdGhpcy5jaGlsZHJlbltpXS5lZmZlY3RSYW5nZVJnaHQgPSByYW5nZV9yaHMgLyBpc3o7CisJfQorCXRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCA9IHRoaXMuYmFyV2lkdGggKyAicHgiOworCXRoaXMuZG9tTm9kZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmJhckhlaWdodCArICJweCI7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBpdG0gPSB0aGlzLmNoaWxkcmVuW2ldOworCQl2YXIgZWxtID0gaXRtLmRvbU5vZGU7CisJCWVsbS5zdHlsZS5sZWZ0ID0gaXRtLnBvc1ggKyAicHgiOworCQllbG0uc3R5bGUudG9wID0gaXRtLnBvc1kgKyAicHgiOworCQllbG0uc3R5bGUud2lkdGggPSB0aGlzLml0ZW1XaWR0aCArICJweCI7CisJCWVsbS5zdHlsZS5oZWlnaHQgPSB0aGlzLml0ZW1IZWlnaHQgKyAicHgiOworCQlpZiAoaXRtLnN2Z05vZGUpIHsKKwkJCWl0bS5zdmdOb2RlLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCWl0bS5zdmdOb2RlLnN0eWxlLmxlZnQgPSB0aGlzLml0ZW1QYWRkaW5nICsgIiUiOworCQkJaXRtLnN2Z05vZGUuc3R5bGUudG9wID0gdGhpcy5pdGVtUGFkZGluZyArICIlIjsKKwkJCWl0bS5zdmdOb2RlLnN0eWxlLndpZHRoID0gKDEwMCAtIDIgKiB0aGlzLml0ZW1QYWRkaW5nKSArICIlIjsKKwkJCWl0bS5zdmdOb2RlLnN0eWxlLmhlaWdodCA9ICgxMDAgLSAyICogdGhpcy5pdGVtUGFkZGluZykgKyAiJSI7CisJCQlpdG0uc3ZnTm9kZS5zdHlsZS56SW5kZXggPSAxOworCQkJaXRtLnN2Z05vZGUuc2V0U2l6ZSh0aGlzLml0ZW1XaWR0aCwgdGhpcy5pdGVtSGVpZ2h0KTsKKwkJfSBlbHNlIHsKKwkJCWl0bS5pbWdOb2RlLnN0eWxlLmxlZnQgPSB0aGlzLml0ZW1QYWRkaW5nICsgIiUiOworCQkJaXRtLmltZ05vZGUuc3R5bGUudG9wID0gdGhpcy5pdGVtUGFkZGluZyArICIlIjsKKwkJCWl0bS5pbWdOb2RlLnN0eWxlLndpZHRoID0gKDEwMCAtIDIgKiB0aGlzLml0ZW1QYWRkaW5nKSArICIlIjsKKwkJCWl0bS5pbWdOb2RlLnN0eWxlLmhlaWdodCA9ICgxMDAgLSAyICogdGhpcy5pdGVtUGFkZGluZykgKyAiJSI7CisJCX0KKwl9CisJdGhpcy5fY2FsY0hpdEdyaWQoKTsKK30sIF9vbkJvZHlPdXQ6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoZG9qby5odG1sLm92ZXJFbGVtZW50KGRvam8uYm9keSgpLCBlKSkgeworCQlyZXR1cm47CisJfQorCXRoaXMuX3NldERvcm1hbnQoZSk7Cit9LCBfc2V0RG9ybWFudDpmdW5jdGlvbiAoZSkgeworCWlmICghdGhpcy5pc092ZXIpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmlzT3ZlciA9IGZhbHNlOworCWlmICh0aGlzLmNvbnNlcnZhdGl2ZVRyaWdnZXIpIHsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2Vtb3ZlIiwgdGhpcywgIl9vbk1vdXNlTW92ZSIpOworCX0KKwl0aGlzLl9vbkdyaWRNb3VzZU1vdmUoLTEsIC0xKTsKK30sIF9zZXRBY3RpdmU6ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5pc092ZXIpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmlzT3ZlciA9IHRydWU7CisJaWYgKHRoaXMuY29uc2VydmF0aXZlVHJpZ2dlcikgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiX29uTW91c2VNb3ZlIik7CisJCXRoaXMudGltZXJTY2FsZSA9IDA7CisJCXRoaXMuX29uTW91c2VNb3ZlKGUpOworCQl0aGlzLl9leHBhbmRTbG93bHkoKTsKKwl9Cit9LCBfb25Nb3VzZU1vdmU6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoKGUucGFnZVggPj0gdGhpcy5oaXRYMSkgJiYgKGUucGFnZVggPD0gdGhpcy5oaXRYMikgJiYgKGUucGFnZVkgPj0gdGhpcy5oaXRZMSkgJiYgKGUucGFnZVkgPD0gdGhpcy5oaXRZMikpIHsKKwkJaWYgKCF0aGlzLmlzT3ZlcikgeworCQkJdGhpcy5fc2V0QWN0aXZlKGUpOworCQl9CisJCXRoaXMuX29uR3JpZE1vdXNlTW92ZShlLnBhZ2VYIC0gdGhpcy5oaXRYMSwgZS5wYWdlWSAtIHRoaXMuaGl0WTEpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmlzT3ZlcikgeworCQkJdGhpcy5fc2V0RG9ybWFudChlKTsKKwkJfQorCX0KK30sIG9uUmVzaXplZDpmdW5jdGlvbiAoKSB7CisJdGhpcy5fY2FsY0hpdEdyaWQoKTsKK30sIF9vbkdyaWRNb3VzZU1vdmU6ZnVuY3Rpb24gKHgsIHkpIHsKKwl0aGlzLnBvcyA9IHt4OngsIHk6eX07CisJdGhpcy5fcGFpbnQoKTsKK30sIF9wYWludDpmdW5jdGlvbiAoKSB7CisJdmFyIHggPSB0aGlzLnBvcy54OworCXZhciB5ID0gdGhpcy5wb3MueTsKKwlpZiAodGhpcy5pdGVtQ291bnQgPD0gMCkgeworCQlyZXR1cm47CisJfQorCXZhciBwb3MgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHggOiB5OworCXZhciBwcnggPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMucHJveGltaXR5TGVmdCA6IHRoaXMucHJveGltaXR5VG9wOworCXZhciBzaXogPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMuaXRlbVdpZHRoIDogdGhpcy5pdGVtSGVpZ2h0OworCXZhciBzaW0gPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICgxIC0gdGhpcy50aW1lclNjYWxlKSAqIHRoaXMuaXRlbVdpZHRoICsgdGhpcy50aW1lclNjYWxlICogdGhpcy5pdGVtTWF4V2lkdGggOiAoMSAtIHRoaXMudGltZXJTY2FsZSkgKiB0aGlzLml0ZW1IZWlnaHQgKyB0aGlzLnRpbWVyU2NhbGUgKiB0aGlzLml0ZW1NYXhIZWlnaHQ7CisJdmFyIGNlbiA9ICgocG9zIC0gcHJ4KSAvIHNpeikgLSAwLjU7CisJdmFyIG1heF9vZmZfY2VuID0gKHNpbSAvIHNpeikgLSAwLjU7CisJaWYgKG1heF9vZmZfY2VuID4gdGhpcy5lZmZlY3RVbml0cykgeworCQltYXhfb2ZmX2NlbiA9IHRoaXMuZWZmZWN0VW5pdHM7CisJfQorCXZhciBvZmZfd2VpZ2h0ID0gMDsKKwlpZiAodGhpcy5hbmNob3JFZGdlID09IHRoaXMuRURHRS5CT1RUT00pIHsKKwkJdmFyIGNlbjIgPSAoeSAtIHRoaXMucHJveGltaXR5VG9wKSAvIHRoaXMuaXRlbUhlaWdodDsKKwkJb2ZmX3dlaWdodCA9IChjZW4yID4gMC41KSA/IDEgOiB5IC8gKHRoaXMucHJveGltaXR5VG9wICsgKHRoaXMuaXRlbUhlaWdodCAvIDIpKTsKKwl9CisJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuVE9QKSB7CisJCXZhciBjZW4yID0gKHkgLSB0aGlzLnByb3hpbWl0eVRvcCkgLyB0aGlzLml0ZW1IZWlnaHQ7CisJCW9mZl93ZWlnaHQgPSAoY2VuMiA8IDAuNSkgPyAxIDogKHRoaXMudG90YWxIZWlnaHQgLSB5KSAvICh0aGlzLnByb3hpbWl0eUJvdHRvbSArICh0aGlzLml0ZW1IZWlnaHQgLyAyKSk7CisJfQorCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLlJJR0hUKSB7CisJCXZhciBjZW4yID0gKHggLSB0aGlzLnByb3hpbWl0eUxlZnQpIC8gdGhpcy5pdGVtV2lkdGg7CisJCW9mZl93ZWlnaHQgPSAoY2VuMiA+IDAuNSkgPyAxIDogeCAvICh0aGlzLnByb3hpbWl0eUxlZnQgKyAodGhpcy5pdGVtV2lkdGggLyAyKSk7CisJfQorCWlmICh0aGlzLmFuY2hvckVkZ2UgPT0gdGhpcy5FREdFLkxFRlQpIHsKKwkJdmFyIGNlbjIgPSAoeCAtIHRoaXMucHJveGltaXR5TGVmdCkgLyB0aGlzLml0ZW1XaWR0aDsKKwkJb2ZmX3dlaWdodCA9IChjZW4yIDwgMC41KSA/IDEgOiAodGhpcy50b3RhbFdpZHRoIC0geCkgLyAodGhpcy5wcm94aW1pdHlSaWdodCArICh0aGlzLml0ZW1XaWR0aCAvIDIpKTsKKwl9CisJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuQ0VOVEVSKSB7CisJCWlmICh0aGlzLmlzSG9yaXpvbnRhbCkgeworCQkJb2ZmX3dlaWdodCA9IHkgLyAodGhpcy50b3RhbEhlaWdodCk7CisJCX0gZWxzZSB7CisJCQlvZmZfd2VpZ2h0ID0geCAvICh0aGlzLnRvdGFsV2lkdGgpOworCQl9CisJCWlmIChvZmZfd2VpZ2h0ID4gMC41KSB7CisJCQlvZmZfd2VpZ2h0ID0gMSAtIG9mZl93ZWlnaHQ7CisJCX0KKwkJb2ZmX3dlaWdodCAqPSAyOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbUNvdW50OyBpKyspIHsKKwkJdmFyIHdlaWdodCA9IHRoaXMuX3dlaWdoQXQoY2VuLCBpKTsKKwkJaWYgKHdlaWdodCA8IDApIHsKKwkJCXdlaWdodCA9IDA7CisJCX0KKwkJdGhpcy5fc2V0SXRlbVNpemUoaSwgd2VpZ2h0ICogb2ZmX3dlaWdodCk7CisJfQorCXZhciBtYWluX3AgPSBNYXRoLnJvdW5kKGNlbik7CisJdmFyIG9mZnNldCA9IDA7CisJaWYgKGNlbiA8IDApIHsKKwkJbWFpbl9wID0gMDsKKwl9IGVsc2UgeworCQlpZiAoY2VuID4gdGhpcy5pdGVtQ291bnQgLSAxKSB7CisJCQltYWluX3AgPSB0aGlzLml0ZW1Db3VudCAtIDE7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgPSAoY2VuIC0gbWFpbl9wKSAqICgodGhpcy5pc0hvcml6b250YWwgPyB0aGlzLml0ZW1XaWR0aCA6IHRoaXMuaXRlbUhlaWdodCkgLSB0aGlzLmNoaWxkcmVuW21haW5fcF0uc2l6ZU1haW4pOworCQl9CisJfQorCXRoaXMuX3Bvc2l0aW9uRWxlbWVudHNGcm9tKG1haW5fcCwgb2Zmc2V0KTsKK30sIF93ZWlnaEF0OmZ1bmN0aW9uIChjZW4sIGkpIHsKKwl2YXIgZGlzdCA9IE1hdGguYWJzKGNlbiAtIGkpOworCXZhciBsaW1pdCA9ICgoY2VuIC0gaSkgPiAwKSA/IHRoaXMuY2hpbGRyZW5baV0uZWZmZWN0UmFuZ2VSZ2h0IDogdGhpcy5jaGlsZHJlbltpXS5lZmZlY3RSYW5nZUxlZnQ7CisJcmV0dXJuIChkaXN0ID4gbGltaXQpID8gMCA6ICgxIC0gZGlzdCAvIGxpbWl0KTsKK30sIF9zZXRJdGVtU2l6ZTpmdW5jdGlvbiAocCwgc2NhbGUpIHsKKwlzY2FsZSAqPSB0aGlzLnRpbWVyU2NhbGU7CisJdmFyIHcgPSBNYXRoLnJvdW5kKHRoaXMuaXRlbVdpZHRoICsgKCh0aGlzLml0ZW1NYXhXaWR0aCAtIHRoaXMuaXRlbVdpZHRoKSAqIHNjYWxlKSk7CisJdmFyIGggPSBNYXRoLnJvdW5kKHRoaXMuaXRlbUhlaWdodCArICgodGhpcy5pdGVtTWF4SGVpZ2h0IC0gdGhpcy5pdGVtSGVpZ2h0KSAqIHNjYWxlKSk7CisJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CisJCXRoaXMuY2hpbGRyZW5bcF0uc2l6ZVcgPSB3OworCQl0aGlzLmNoaWxkcmVuW3BdLnNpemVIID0gaDsKKwkJdGhpcy5jaGlsZHJlbltwXS5zaXplTWFpbiA9IHc7CisJCXRoaXMuY2hpbGRyZW5bcF0uc2l6ZU9mZiA9IGg7CisJCXZhciB5ID0gMDsKKwkJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuVE9QKSB7CisJCQl5ID0gKHRoaXMuY2hpbGRyZW5bcF0uY2VuWSAtICh0aGlzLml0ZW1IZWlnaHQgLyAyKSk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5hbmNob3JFZGdlID09IHRoaXMuRURHRS5CT1RUT00pIHsKKwkJCQl5ID0gKHRoaXMuY2hpbGRyZW5bcF0uY2VuWSAtIChoIC0gKHRoaXMuaXRlbUhlaWdodCAvIDIpKSk7CisJCQl9IGVsc2UgeworCQkJCXkgPSAodGhpcy5jaGlsZHJlbltwXS5jZW5ZIC0gKGggLyAyKSk7CisJCQl9CisJCX0KKwkJdGhpcy5jaGlsZHJlbltwXS51c3VhbFggPSBNYXRoLnJvdW5kKHRoaXMuY2hpbGRyZW5bcF0uY2VuWCAtICh3IC8gMikpOworCQl0aGlzLmNoaWxkcmVuW3BdLmRvbU5vZGUuc3R5bGUudG9wID0geSArICJweCI7CisJCXRoaXMuY2hpbGRyZW5bcF0uZG9tTm9kZS5zdHlsZS5sZWZ0ID0gdGhpcy5jaGlsZHJlbltwXS51c3VhbFggKyAicHgiOworCX0gZWxzZSB7CisJCXRoaXMuY2hpbGRyZW5bcF0uc2l6ZVcgPSB3OworCQl0aGlzLmNoaWxkcmVuW3BdLnNpemVIID0gaDsKKwkJdGhpcy5jaGlsZHJlbltwXS5zaXplT2ZmID0gdzsKKwkJdGhpcy5jaGlsZHJlbltwXS5zaXplTWFpbiA9IGg7CisJCXZhciB4ID0gMDsKKwkJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuTEVGVCkgeworCQkJeCA9IHRoaXMuY2hpbGRyZW5bcF0uY2VuWCAtICh0aGlzLml0ZW1XaWR0aCAvIDIpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuYW5jaG9yRWRnZSA9PSB0aGlzLkVER0UuUklHSFQpIHsKKwkJCQl4ID0gdGhpcy5jaGlsZHJlbltwXS5jZW5YIC0gKHcgLSAodGhpcy5pdGVtV2lkdGggLyAyKSk7CisJCQl9IGVsc2UgeworCQkJCXggPSB0aGlzLmNoaWxkcmVuW3BdLmNlblggLSAodyAvIDIpOworCQkJfQorCQl9CisJCXRoaXMuY2hpbGRyZW5bcF0uZG9tTm9kZS5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJCXRoaXMuY2hpbGRyZW5bcF0udXN1YWxZID0gTWF0aC5yb3VuZCh0aGlzLmNoaWxkcmVuW3BdLmNlblkgLSAoaCAvIDIpKTsKKwkJdGhpcy5jaGlsZHJlbltwXS5kb21Ob2RlLnN0eWxlLnRvcCA9IHRoaXMuY2hpbGRyZW5bcF0udXN1YWxZICsgInB4IjsKKwl9CisJdGhpcy5jaGlsZHJlbltwXS5kb21Ob2RlLnN0eWxlLndpZHRoID0gdyArICJweCI7CisJdGhpcy5jaGlsZHJlbltwXS5kb21Ob2RlLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOworCWlmICh0aGlzLmNoaWxkcmVuW3BdLnN2Z05vZGUpIHsKKwkJdGhpcy5jaGlsZHJlbltwXS5zdmdOb2RlLnNldFNpemUodywgaCk7CisJfQorfSwgX3Bvc2l0aW9uRWxlbWVudHNGcm9tOmZ1bmN0aW9uIChwLCBvZmZzZXQpIHsKKwl2YXIgcG9zID0gMDsKKwlpZiAodGhpcy5pc0hvcml6b250YWwpIHsKKwkJcG9zID0gTWF0aC5yb3VuZCh0aGlzLmNoaWxkcmVuW3BdLnVzdWFsWCArIG9mZnNldCk7CisJCXRoaXMuY2hpbGRyZW5bcF0uZG9tTm9kZS5zdHlsZS5sZWZ0ID0gcG9zICsgInB4IjsKKwl9IGVsc2UgeworCQlwb3MgPSBNYXRoLnJvdW5kKHRoaXMuY2hpbGRyZW5bcF0udXN1YWxZICsgb2Zmc2V0KTsKKwkJdGhpcy5jaGlsZHJlbltwXS5kb21Ob2RlLnN0eWxlLnRvcCA9IHBvcyArICJweCI7CisJfQorCXRoaXMuX3Bvc2l0aW9uTGFiZWwodGhpcy5jaGlsZHJlbltwXSk7CisJdmFyIGJwb3MgPSBwb3M7CisJZm9yICh2YXIgaSA9IHAgLSAxOyBpID49IDA7IGktLSkgeworCQlicG9zIC09IHRoaXMuY2hpbGRyZW5baV0uc2l6ZU1haW47CisJCWlmICh0aGlzLmlzSG9yaXpvbnRhbCkgeworCQkJdGhpcy5jaGlsZHJlbltpXS5kb21Ob2RlLnN0eWxlLmxlZnQgPSBicG9zICsgInB4IjsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY2hpbGRyZW5baV0uZG9tTm9kZS5zdHlsZS50b3AgPSBicG9zICsgInB4IjsKKwkJfQorCQl0aGlzLl9wb3NpdGlvbkxhYmVsKHRoaXMuY2hpbGRyZW5baV0pOworCX0KKwl2YXIgYXBvcyA9IHBvczsKKwlmb3IgKHZhciBpID0gcCArIDE7IGkgPCB0aGlzLml0ZW1Db3VudDsgaSsrKSB7CisJCWFwb3MgKz0gdGhpcy5jaGlsZHJlbltpIC0gMV0uc2l6ZU1haW47CisJCWlmICh0aGlzLmlzSG9yaXpvbnRhbCkgeworCQkJdGhpcy5jaGlsZHJlbltpXS5kb21Ob2RlLnN0eWxlLmxlZnQgPSBhcG9zICsgInB4IjsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY2hpbGRyZW5baV0uZG9tTm9kZS5zdHlsZS50b3AgPSBhcG9zICsgInB4IjsKKwkJfQorCQl0aGlzLl9wb3NpdGlvbkxhYmVsKHRoaXMuY2hpbGRyZW5baV0pOworCX0KK30sIF9wb3NpdGlvbkxhYmVsOmZ1bmN0aW9uIChpdG0pIHsKKwl2YXIgeCA9IDA7CisJdmFyIHkgPSAwOworCXZhciBtYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3goaXRtLmxibE5vZGUpOworCWlmICh0aGlzLmxhYmVsRWRnZSA9PSB0aGlzLkVER0UuVE9QKSB7CisJCXggPSBNYXRoLnJvdW5kKChpdG0uc2l6ZVcgLyAyKSAtIChtYi53aWR0aCAvIDIpKTsKKwkJeSA9IC1tYi5oZWlnaHQ7CisJfQorCWlmICh0aGlzLmxhYmVsRWRnZSA9PSB0aGlzLkVER0UuQk9UVE9NKSB7CisJCXggPSBNYXRoLnJvdW5kKChpdG0uc2l6ZVcgLyAyKSAtIChtYi53aWR0aCAvIDIpKTsKKwkJeSA9IGl0bS5zaXplSDsKKwl9CisJaWYgKHRoaXMubGFiZWxFZGdlID09IHRoaXMuRURHRS5MRUZUKSB7CisJCXggPSAtbWIud2lkdGg7CisJCXkgPSBNYXRoLnJvdW5kKChpdG0uc2l6ZUggLyAyKSAtIChtYi5oZWlnaHQgLyAyKSk7CisJfQorCWlmICh0aGlzLmxhYmVsRWRnZSA9PSB0aGlzLkVER0UuUklHSFQpIHsKKwkJeCA9IGl0bS5zaXplVzsKKwkJeSA9IE1hdGgucm91bmQoKGl0bS5zaXplSCAvIDIpIC0gKG1iLmhlaWdodCAvIDIpKTsKKwl9CisJaXRtLmxibE5vZGUuc3R5bGUubGVmdCA9IHggKyAicHgiOworCWl0bS5sYmxOb2RlLnN0eWxlLnRvcCA9IHkgKyAicHgiOworfSwgX2NhbGNIaXRHcmlkOmZ1bmN0aW9uICgpIHsKKwl2YXIgcG9zID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLCB0cnVlKTsKKwl0aGlzLmhpdFgxID0gcG9zLnggLSB0aGlzLnByb3hpbWl0eUxlZnQ7CisJdGhpcy5oaXRZMSA9IHBvcy55IC0gdGhpcy5wcm94aW1pdHlUb3A7CisJdGhpcy5oaXRYMiA9IHRoaXMuaGl0WDEgKyB0aGlzLnRvdGFsV2lkdGg7CisJdGhpcy5oaXRZMiA9IHRoaXMuaGl0WTEgKyB0aGlzLnRvdGFsSGVpZ2h0OworfSwgX3RvRWRnZTpmdW5jdGlvbiAoaW5wLCBkZWYpIHsKKwlyZXR1cm4gdGhpcy5FREdFW2lucC50b1VwcGVyQ2FzZSgpXSB8fCBkZWY7Cit9LCBfZXhwYW5kU2xvd2x5OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaXNPdmVyKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy50aW1lclNjYWxlICs9IDAuMjsKKwl0aGlzLl9wYWludCgpOworCWlmICh0aGlzLnRpbWVyU2NhbGUgPCAxKSB7CisJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJfZXhwYW5kU2xvd2x5IiwgMTApOworCX0KK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCWRvam8uZXZlbnQuZGlzY29ubmVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJvbm1vdXNlb3V0IiwgdGhpcywgIl9vbkJvZHlPdXQiKTsKKwlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiX29uTW91c2VNb3ZlIik7CisJZG9qby53aWRnZXQuRmlzaGV5ZUxpc3Quc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkZpc2hleWVMaXN0SXRlbSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtpY29uU3JjOiIiLCBzdmdTcmM6IiIsIGNhcHRpb246IiIsIGlkOiIiLCBfYmxhbmtJbWdQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9ibGFuay5naWYiKSwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgY2xhc3M9XCJkb2pvSHRtbEZpc2hleWVMaXN0SXRlbVwiPiIgKyAiICA8aW1nIGNsYXNzPVwiZG9qb0h0bWxGaXNoZXllTGlzdEl0ZW1JbWFnZVwiIGRvam9BdHRhY2hQb2ludD1cImltZ05vZGVcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbk1vdXNlT3Zlcjtvbk1vdXNlT3V0O29uQ2xpY2tcIj4iICsgIiAgPGRpdiBjbGFzcz1cImRvam9IdG1sRmlzaGV5ZUxpc3RJdGVtTGFiZWxcIiBkb2pvQXR0YWNoUG9pbnQ9XCJsYmxOb2RlXCI+PC9kaXY+IiArICI8L2Rpdj4iLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuc3ZnU3JjICE9ICIiKSB7CisJCXRoaXMuc3ZnTm9kZSA9IHRoaXMuX2NyZWF0ZVN2Z05vZGUodGhpcy5zdmdTcmMpOworCQl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5zdmdOb2RlKTsKKwkJdGhpcy5pbWdOb2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJfSBlbHNlIHsKKwkJaWYgKCh0aGlzLmljb25TcmMudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcodGhpcy5pY29uU3JjLmxlbmd0aCAtIDQpID09ICIucG5nIikgJiYgKGRvam8ucmVuZGVyLmh0bWwuaWUpICYmICghZG9qby5yZW5kZXIuaHRtbC5pZTcwKSkgeworCQkJaWYgKGRvam8uZG9tLmhhc1BhcmVudCh0aGlzLmltZ05vZGUpICYmIHRoaXMuaWQgIT0gIiIpIHsKKwkJCQl2YXIgcGFyZW50ID0gdGhpcy5pbWdOb2RlLnBhcmVudE5vZGU7CisJCQkJcGFyZW50LnNldEF0dHJpYnV0ZSgiaWQiLCB0aGlzLmlkKTsKKwkJCX0KKwkJCXRoaXMuaW1nTm9kZS5zdHlsZS5maWx0ZXIgPSAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhSW1hZ2VMb2FkZXIoc3JjPSciICsgdGhpcy5pY29uU3JjICsgIicsIHNpemluZ01ldGhvZD0nc2NhbGUnKSI7CisJCQl0aGlzLmltZ05vZGUuc3JjID0gdGhpcy5fYmxhbmtJbWdQYXRoLnRvU3RyaW5nKCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9qby5kb20uaGFzUGFyZW50KHRoaXMuaW1nTm9kZSkgJiYgdGhpcy5pZCAhPSAiIikgeworCQkJCXZhciBwYXJlbnQgPSB0aGlzLmltZ05vZGUucGFyZW50Tm9kZTsKKwkJCQlwYXJlbnQuc2V0QXR0cmlidXRlKCJpZCIsIHRoaXMuaWQpOworCQkJfQorCQkJdGhpcy5pbWdOb2RlLnNyYyA9IHRoaXMuaWNvblNyYzsKKwkJfQorCX0KKwlpZiAodGhpcy5sYmxOb2RlKSB7CisJCXRoaXMubGJsTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNhcHRpb24pKTsKKwl9CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKK30sIF9jcmVhdGVTdmdOb2RlOmZ1bmN0aW9uIChzcmMpIHsKKwl2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZW1iZWQiKTsKKwllbG0uc3JjID0gc3JjOworCWVsbS50eXBlID0gImltYWdlL3N2Zyt4bWwiOworCWVsbS5zdHlsZS53aWR0aCA9ICIxcHgiOworCWVsbS5zdHlsZS5oZWlnaHQgPSAiMXB4IjsKKwllbG0ubG9hZGVkID0gMDsKKwllbG0uc2V0U2l6ZU9uTG9hZCA9IGZhbHNlOworCWVsbS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuc3ZnUm9vdCA9IHRoaXMuZ2V0U1ZHRG9jdW1lbnQoKS5yb290RWxlbWVudDsKKwkJdGhpcy5zdmdEb2MgPSB0aGlzLmdldFNWR0RvY3VtZW50KCkuZG9jdW1lbnRFbGVtZW50OworCQl0aGlzLnplcm9XaWR0aCA9IHRoaXMuc3ZnUm9vdC53aWR0aC5iYXNlVmFsLnZhbHVlOworCQl0aGlzLnplcm9IZWlnaHQgPSB0aGlzLnN2Z1Jvb3QuaGVpZ2h0LmJhc2VWYWwudmFsdWU7CisJCXRoaXMubG9hZGVkID0gdHJ1ZTsKKwkJaWYgKHRoaXMuc2V0U2l6ZU9uTG9hZCkgeworCQkJdGhpcy5zZXRTaXplKHRoaXMuc2V0V2lkdGgsIHRoaXMuc2V0SGVpZ2h0KTsKKwkJfQorCX07CisJZWxtLnNldFNpemUgPSBmdW5jdGlvbiAodywgaCkgeworCQlpZiAoIXRoaXMubG9hZGVkKSB7CisJCQl0aGlzLnNldFdpZHRoID0gdzsKKwkJCXRoaXMuc2V0SGVpZ2h0ID0gaDsKKwkJCXRoaXMuc2V0U2l6ZU9uTG9hZCA9IHRydWU7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5zdHlsZS53aWR0aCA9IHcgKyAicHgiOworCQl0aGlzLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOworCQl0aGlzLnN2Z1Jvb3Qud2lkdGguYmFzZVZhbC52YWx1ZSA9IHc7CisJCXRoaXMuc3ZnUm9vdC5oZWlnaHQuYmFzZVZhbC52YWx1ZSA9IGg7CisJCXZhciBzY2FsZV94ID0gdyAvIHRoaXMuemVyb1dpZHRoOworCQl2YXIgc2NhbGVfeSA9IGggLyB0aGlzLnplcm9IZWlnaHQ7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdmdEb2MuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHRoaXMuc3ZnRG9jLmNoaWxkTm9kZXNbaV0uc2V0QXR0cmlidXRlKSB7CisJCQkJdGhpcy5zdmdEb2MuY2hpbGROb2Rlc1tpXS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJzY2FsZSgiICsgc2NhbGVfeCArICIsIiArIHNjYWxlX3kgKyAiKSIpOworCQkJfQorCQl9CisJfTsKKwlyZXR1cm4gZWxtOworfSwgb25Nb3VzZU92ZXI6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIXRoaXMucGFyZW50LmlzT3ZlcikgeworCQl0aGlzLnBhcmVudC5fc2V0QWN0aXZlKGUpOworCX0KKwlpZiAodGhpcy5jYXB0aW9uICE9ICIiKSB7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmxibE5vZGUsICJzZWxlY3RlZCIpOworCQl0aGlzLnBhcmVudC5fcG9zaXRpb25MYWJlbCh0aGlzKTsKKwl9Cit9LCBvbk1vdXNlT3V0OmZ1bmN0aW9uIChlKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMubGJsTm9kZSwgInNlbGVjdGVkIik7Cit9LCBvbkNsaWNrOmZ1bmN0aW9uIChlKSB7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRmxvYXRpbmdQYW5lLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9GbG9hdGluZ1BhbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5OWIyZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRmxvYXRpbmdQYW5lLmpzCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5NYW5hZ2VyIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmlmcmFtZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LnNoYWRvdyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db250ZW50UGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRGlhbG9nIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlJlc2l6ZUhhbmRsZSIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlIiwgbnVsbCwge3RpdGxlOiIiLCBpY29uU3JjOiIiLCBoYXNTaGFkb3c6ZmFsc2UsIGNvbnN0cmFpblRvQ29udGFpbmVyOmZhbHNlLCB0YXNrQmFySWQ6IiIsIHJlc2l6YWJsZTp0cnVlLCB0aXRsZUJhckRpc3BsYXk6dHJ1ZSwgd2luZG93U3RhdGU6Im5vcm1hbCIsIGRpc3BsYXlDbG9zZUFjdGlvbjpmYWxzZSwgZGlzcGxheU1pbmltaXplQWN0aW9uOmZhbHNlLCBkaXNwbGF5TWF4aW1pemVBY3Rpb246ZmFsc2UsIF9tYXhfdGFza0JhckNvbm5lY3RBdHRlbXB0czo1LCBfdGFza0JhckNvbm5lY3RBdHRlbXB0czowLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbk1vdXNlRG93blwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVwiPlxuXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyXCIgY2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lVGl0bGVCYXJcIiAgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cblx0ICBcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwidGl0bGVCYXJJY29uXCIgIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFySWNvblwiPlxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY2xvc2VBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOmNsb3NlV2luZG93XCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lQ2xvc2VJY29uXCI+PC9kaXY+XG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXN0b3JlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpyZXN0b3JlV2luZG93XCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lUmVzdG9yZUljb25cIj48L2Rpdj5cblx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cIm1heGltaXplQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazptYXhpbWl6ZVdpbmRvd1wiXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvblwiPjwvZGl2PlxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwibWluaW1pemVBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOm1pbmltaXplV2luZG93XCJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uXCI+PC9kaXY+XG5cdCAgXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyVGV4dFwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dFwiPiR7dGhpcy50aXRsZX08L2Rpdj5cblx0PC9kaXY+XG5cblx0PGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsaWVudFwiPjwvZGl2PlxuXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwicmVzaXplQmFyXCIgY2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lUmVzaXplYmFyXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48L2Rpdj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6IlxuLyoqKioqKioqKiogT3V0ZXIgV2luZG93ICoqKioqKioqKioqKioqKi9cblxuLmRvam9GbG9hdGluZ1BhbmUge1xuXHQvKiBlc3NlbnRpYWwgY3NzICovXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0b3ZlcmZsb3c6IHZpc2libGU7XHRcdC8qIHNvIGRyb3Agc2hhZG93IGlzIGRpc3BsYXllZCAqL1xuXHR6LWluZGV4OiAxMDtcblxuXHQvKiBzdHlsaW5nIGNzcyAqL1xuXHRib3JkZXI6IDFweCBzb2xpZDtcblx0Ym9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7XG5cdGJhY2tncm91bmQtY29sb3I6IFRocmVlREZhY2U7XG59XG5cblxuLyoqKioqKioqKiogVGl0bGUgQmFyICoqKioqKioqKioqKioqKiovXG5cbi5kb2pvRmxvYXRpbmdQYW5lVGl0bGVCYXIge1xuXHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuXHRtYXJnaW46IDJweCAycHggMnB4IDJweDtcblx0ei1pbmRleDogMTA7XG5cdGJhY2tncm91bmQtY29sb3I6ICM3NTk2YzY7XG5cdGN1cnNvcjogZGVmYXVsdDtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0Ym9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7XG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi5kb2pvRmxvYXRpbmdQYW5lVGl0bGVUZXh0IHtcblx0ZmxvYXQ6IGxlZnQ7XG5cdHBhZGRpbmc6IDJweCA0cHggMnB4IDJweDtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0Y29sb3I6IENhcHRpb25UZXh0O1xuXHRmb250OiBzbWFsbC1jYXB0aW9uO1xufVxuXG4uZG9qb1RpdGxlQmFySWNvbiB7XG5cdGZsb2F0OiBsZWZ0O1xuXHRoZWlnaHQ6IDIycHg7XG5cdHdpZHRoOiAyMnB4O1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRtYXJnaW4tcmlnaHQ6IDVweDtcblx0bWFyZ2luLWxlZnQ6IDVweDtcbn1cblxuLmRvam9GbG9hdGluZ1BhbmVBY3Rpb25ze1xuXHRmbG9hdDogcmlnaHQ7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0cmlnaHQ6IDJweDtcblx0dG9wOiAycHg7XG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cblxuLmRvam9GbG9hdGluZ1BhbmVBY3Rpb25JdGVtIHtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0bWFyZ2luLXJpZ2h0OiAxcHg7XG5cdGhlaWdodDogMjJweDtcblx0d2lkdGg6IDIycHg7XG59XG5cblxuLmRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb24ge1xuXHQvKiBlc3NlbnRpYWwgY3NzICovXG5cdGZsb2F0OiBsZWZ0O1xuXG5cdC8qIHN0eWxpbmcgY3NzICovXG5cdG1hcmdpbi1sZWZ0OiAycHg7XG5cdG1hcmdpbi1yaWdodDogNHB4O1xuXHRoZWlnaHQ6IDIycHg7XG59XG5cbi8qIG1pbmltaXplL21heGltaXplIGljb25zIGFyZSBzcGVjaWZpZWQgYnkgQ1NTIG9ubHkgKi9cbi5kb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uLFxuLmRvam9GbG9hdGluZ1BhbmVNYXhpbWl6ZUljb24sXG4uZG9qb0Zsb2F0aW5nUGFuZVJlc3RvcmVJY29uLFxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRoZWlnaHQ6IDIycHg7XG5cdHdpZHRoOiAyMnB4O1xuXHRmbG9hdDogcmlnaHQ7XG59XG4uZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvbiB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZmxvYXRpbmdQYW5lTWluaW1pemUuZ2lmKTtcbn1cbi5kb2pvRmxvYXRpbmdQYW5lTWF4aW1pemVJY29uIHtcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mbG9hdGluZ1BhbmVNYXhpbWl6ZS5naWYpO1xufVxuLmRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbiB7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZmxvYXRpbmdQYW5lUmVzdG9yZS5naWYpO1xufVxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZUNsb3NlLmdpZik7XG59XG5cbi8qIGJhciBhdCBib3R0b20gb2Ygd2luZG93IHRoYXQgaG9sZHMgcmVzaXplIGhhbmRsZSAqL1xuLmRvam9GbG9hdGluZ1BhbmVSZXNpemViYXIge1xuXHR6LWluZGV4OiAxMDtcblx0aGVpZ2h0OiAxM3B4O1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlO1xufVxuXG4vKioqKioqKioqKioqKiBDbGllbnQgQXJlYSAqKioqKioqKioqKioqKiovXG5cbi5kb2pvRmxvYXRpbmdQYW5lQ2xpZW50IHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHR6LWluZGV4OiAxMDtcblx0Ym9yZGVyOiAxcHggc29saWQ7XG5cdGJvcmRlci1jb2xvcjogVGhyZWVEU2hhZG93IFRocmVlREhpZ2hsaWdodCBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93O1xuXHRtYXJnaW46IDJweDtcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcblx0cGFkZGluZzogOHB4O1xuXHRmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBHYXJhbW9uZCwgc2Fucy1zZXJpZjtcblx0Zm9udC1zaXplOiAxMnB4O1xuXHRvdmVyZmxvdzogYXV0bztcbn1cblxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0Zsb2F0aW5nUGFuZS5jc3MiKSwgZmlsbEluRmxvYXRpbmdQYW5lVGVtcGxhdGU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwl2YXIgc291cmNlID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgc291cmNlKTsKKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmRvbU5vZGUpOworCWlmICghdGhpcy5pc1Nob3dpbmcoKSkgeworCQl0aGlzLndpbmRvd1N0YXRlID0gIm1pbmltaXplZCI7CisJfQorCWlmICh0aGlzLmljb25TcmMgPT0gIiIpIHsKKwkJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy50aXRsZUJhckljb24pOworCX0gZWxzZSB7CisJCXRoaXMudGl0bGVCYXJJY29uLnNyYyA9IHRoaXMuaWNvblNyYy50b1N0cmluZygpOworCX0KKwlpZiAodGhpcy50aXRsZUJhckRpc3BsYXkpIHsKKwkJdGhpcy50aXRsZUJhci5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHRoaXMudGl0bGVCYXIpOworCQl0aGlzLnRpdGxlQmFySWNvbi5zdHlsZS5kaXNwbGF5ID0gKHRoaXMuaWNvblNyYyA9PSAiIiA/ICJub25lIiA6ICIiKTsKKwkJdGhpcy5taW5pbWl6ZUFjdGlvbi5zdHlsZS5kaXNwbGF5ID0gKHRoaXMuZGlzcGxheU1pbmltaXplQWN0aW9uID8gIiIgOiAibm9uZSIpOworCQl0aGlzLm1heGltaXplQWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAodGhpcy5kaXNwbGF5TWF4aW1pemVBY3Rpb24gJiYgdGhpcy53aW5kb3dTdGF0ZSAhPSAibWF4aW1pemVkIiA/ICIiIDogIm5vbmUiKTsKKwkJdGhpcy5yZXN0b3JlQWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAodGhpcy5kaXNwbGF5TWF4aW1pemVBY3Rpb24gJiYgdGhpcy53aW5kb3dTdGF0ZSA9PSAibWF4aW1pemVkIiA/ICIiIDogIm5vbmUiKTsKKwkJdGhpcy5jbG9zZUFjdGlvbi5zdHlsZS5kaXNwbGF5ID0gKHRoaXMuZGlzcGxheUNsb3NlQWN0aW9uID8gIiIgOiAibm9uZSIpOworCQl0aGlzLmRyYWcgPSBuZXcgZG9qby5kbmQuSHRtbERyYWdNb3ZlU291cmNlKHRoaXMuZG9tTm9kZSk7CisJCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCQl0aGlzLmRyYWcuY29uc3RyYWluVG8oKTsKKwkJfQorCQl0aGlzLmRyYWcuc2V0RHJhZ0hhbmRsZSh0aGlzLnRpdGxlQmFyKTsKKwkJdmFyIHNlbGYgPSB0aGlzOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiZHJhZ01vdmUiLCBmdW5jdGlvbiAoaW5mbykgeworCQkJaWYgKGluZm8uc291cmNlLmRvbU5vZGUgPT0gc2VsZi5kb21Ob2RlKSB7CisJCQkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJmbG9hdGluZ1BhbmVNb3ZlIiwge3NvdXJjZTpzZWxmfSk7CisJCQl9CisJCX0pOworCX0KKwlpZiAodGhpcy5yZXNpemFibGUpIHsKKwkJdGhpcy5yZXNpemVCYXIuc3R5bGUuZGlzcGxheSA9ICIiOworCQl0aGlzLnJlc2l6ZUhhbmRsZSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiUmVzaXplSGFuZGxlIiwge3RhcmdldEVsbUlkOnRoaXMud2lkZ2V0SWQsIGlkOnRoaXMud2lkZ2V0SWQgKyAiX3Jlc2l6ZSJ9KTsKKwkJdGhpcy5yZXNpemVCYXIuYXBwZW5kQ2hpbGQodGhpcy5yZXNpemVIYW5kbGUuZG9tTm9kZSk7CisJfQorCWlmICh0aGlzLmhhc1NoYWRvdykgeworCQl0aGlzLnNoYWRvdyA9IG5ldyBkb2pvLmxmeC5zaGFkb3codGhpcy5kb21Ob2RlKTsKKwl9CisJdGhpcy5iZ0lmcmFtZSA9IG5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSh0aGlzLmRvbU5vZGUpOworCWlmICh0aGlzLnRhc2tCYXJJZCkgeworCQl0aGlzLl90YXNrQmFyU2V0dXAoKTsKKwl9CisJZG9qby5ib2R5KCkucmVtb3ZlQ2hpbGQodGhpcy5kb21Ob2RlKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLmhvc3RlbnYucG9zdF9sb2FkXykgeworCQl0aGlzLl9zZXRJbml0aWFsV2luZG93U3RhdGUoKTsKKwl9IGVsc2UgeworCQlkb2pvLmFkZE9uTG9hZCh0aGlzLCAiX3NldEluaXRpYWxXaW5kb3dTdGF0ZSIpOworCX0KK30sIG1heGltaXplV2luZG93OmZ1bmN0aW9uIChldnQpIHsKKwl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJdGhpcy5wcmV2aW91cyA9IHt3aWR0aDptYi53aWR0aCB8fCB0aGlzLndpZHRoLCBoZWlnaHQ6bWIuaGVpZ2h0IHx8IHRoaXMuaGVpZ2h0LCBsZWZ0OnRoaXMuZG9tTm9kZS5zdHlsZS5sZWZ0LCB0b3A6dGhpcy5kb21Ob2RlLnN0eWxlLnRvcCwgYm90dG9tOnRoaXMuZG9tTm9kZS5zdHlsZS5ib3R0b20sIHJpZ2h0OnRoaXMuZG9tTm9kZS5zdHlsZS5yaWdodH07CisJaWYgKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93LnRvTG93ZXJDYXNlKCkgIT0gImhpZGRlbiIpIHsKKwkJdGhpcy5wYXJlbnRQcmV2aW91cyA9IHtvdmVyZmxvdzp0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvd307CisJCWRvam8uZGVidWcodGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3cpOworCQl0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCX0KKwl0aGlzLmRvbU5vZGUuc3R5bGUubGVmdCA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLCAicGFkZGluZy1sZWZ0IiwgdHJ1ZSkgKyAicHgiOworCXRoaXMuZG9tTm9kZS5zdHlsZS50b3AgPSBkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSwgInBhZGRpbmctdG9wIiwgdHJ1ZSkgKyAicHgiOworCWlmICgodGhpcy5kb21Ob2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiYm9keSIpKSB7CisJCXZhciB2aWV3cG9ydCA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQl2YXIgcGFkZGluZyA9IGRvam8uaHRtbC5nZXRQYWRkaW5nKGRvam8uYm9keSgpKTsKKwkJdGhpcy5yZXNpemVUbyh2aWV3cG9ydC53aWR0aCAtIHBhZGRpbmcud2lkdGgsIHZpZXdwb3J0LmhlaWdodCAtIHBhZGRpbmcuaGVpZ2h0KTsKKwl9IGVsc2UgeworCQl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlKTsKKwkJdGhpcy5yZXNpemVUbyhjb250ZW50LndpZHRoLCBjb250ZW50LmhlaWdodCk7CisJfQorCXRoaXMubWF4aW1pemVBY3Rpb24uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLnJlc3RvcmVBY3Rpb24uc3R5bGUuZGlzcGxheSA9ICIiOworCWlmICh0aGlzLnJlc2l6ZUhhbmRsZSkgeworCQl0aGlzLnJlc2l6ZUhhbmRsZS5kb21Ob2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJfQorCXRoaXMuZHJhZy5zZXREcmFnSGFuZGxlKG51bGwpOworCXRoaXMud2luZG93U3RhdGUgPSAibWF4aW1pemVkIjsKK30sIG1pbmltaXplV2luZG93OmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLmhpZGUoKTsKKwlmb3IgKHZhciBhdHRyIGluIHRoaXMucGFyZW50UHJldmlvdXMpIHsKKwkJdGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGVbYXR0cl0gPSB0aGlzLnBhcmVudFByZXZpb3VzW2F0dHJdOworCX0KKwl0aGlzLmxhc3RXaW5kb3dTdGF0ZSA9IHRoaXMud2luZG93U3RhdGU7CisJdGhpcy53aW5kb3dTdGF0ZSA9ICJtaW5pbWl6ZWQiOworfSwgcmVzdG9yZVdpbmRvdzpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKHRoaXMud2luZG93U3RhdGUgPT0gIm1pbmltaXplZCIpIHsKKwkJdGhpcy5zaG93KCk7CisJCWlmICh0aGlzLmxhc3RXaW5kb3dTdGF0ZSA9PSAibWF4aW1pemVkIikgeworCQkJdGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCXRoaXMud2luZG93U3RhdGUgPSAibWF4aW1pemVkIjsKKwkJfSBlbHNlIHsKKwkJCXRoaXMud2luZG93U3RhdGUgPSAibm9ybWFsIjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0aGlzLndpbmRvd1N0YXRlID09ICJtYXhpbWl6ZWQiKSB7CisJCQlmb3IgKHZhciBhdHRyIGluIHRoaXMucHJldmlvdXMpIHsKKwkJCQl0aGlzLmRvbU5vZGUuc3R5bGVbYXR0cl0gPSB0aGlzLnByZXZpb3VzW2F0dHJdOworCQkJfQorCQkJZm9yICh2YXIgYXR0ciBpbiB0aGlzLnBhcmVudFByZXZpb3VzKSB7CisJCQkJdGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGVbYXR0cl0gPSB0aGlzLnBhcmVudFByZXZpb3VzW2F0dHJdOworCQkJfQorCQkJdGhpcy5yZXNpemVUbyh0aGlzLnByZXZpb3VzLndpZHRoLCB0aGlzLnByZXZpb3VzLmhlaWdodCk7CisJCQl0aGlzLnByZXZpb3VzID0gbnVsbDsKKwkJCXRoaXMucGFyZW50UHJldmlvdXMgPSBudWxsOworCQkJdGhpcy5yZXN0b3JlQWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl0aGlzLm1heGltaXplQWN0aW9uLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXlNYXhpbWl6ZUFjdGlvbiA/ICIiIDogIm5vbmUiOworCQkJaWYgKHRoaXMucmVzaXplSGFuZGxlKSB7CisJCQkJdGhpcy5yZXNpemVIYW5kbGUuZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQl9CisJCQl0aGlzLmRyYWcuc2V0RHJhZ0hhbmRsZSh0aGlzLnRpdGxlQmFyKTsKKwkJCXRoaXMud2luZG93U3RhdGUgPSAibm9ybWFsIjsKKwkJfSBlbHNlIHsKKwkJfQorCX0KK30sIHRvZ2dsZURpc3BsYXk6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLndpbmRvd1N0YXRlID09ICJtaW5pbWl6ZWQiKSB7CisJCXRoaXMucmVzdG9yZVdpbmRvdygpOworCX0gZWxzZSB7CisJCXRoaXMubWluaW1pemVXaW5kb3coKTsKKwl9Cit9LCBjbG9zZVdpbmRvdzpmdW5jdGlvbiAoZXZ0KSB7CisJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kb21Ob2RlKTsKKwl0aGlzLmRlc3Ryb3koKTsKK30sIG9uTW91c2VEb3duOmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLmJyaW5nVG9Ub3AoKTsKK30sIGJyaW5nVG9Ub3A6ZnVuY3Rpb24gKCkgeworCXZhciBmbG9hdGluZ1BhbmVzID0gZG9qby53aWRnZXQubWFuYWdlci5nZXRXaWRnZXRzQnlUeXBlKHRoaXMud2lkZ2V0VHlwZSk7CisJdmFyIHdpbmRvd3MgPSBbXTsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IGZsb2F0aW5nUGFuZXMubGVuZ3RoOyB4KyspIHsKKwkJaWYgKHRoaXMud2lkZ2V0SWQgIT0gZmxvYXRpbmdQYW5lc1t4XS53aWRnZXRJZCkgeworCQkJd2luZG93cy5wdXNoKGZsb2F0aW5nUGFuZXNbeF0pOworCQl9CisJfQorCXdpbmRvd3Muc29ydChmdW5jdGlvbiAoYSwgYikgeworCQlyZXR1cm4gYS5kb21Ob2RlLnN0eWxlLnpJbmRleCAtIGIuZG9tTm9kZS5zdHlsZS56SW5kZXg7CisJfSk7CisJd2luZG93cy5wdXNoKHRoaXMpOworCXZhciBmbG9hdGluZ1BhbmVTdGFydGluZ1ogPSAxMDA7CisJZm9yICh4ID0gMDsgeCA8IHdpbmRvd3MubGVuZ3RoOyB4KyspIHsKKwkJd2luZG93c1t4XS5kb21Ob2RlLnN0eWxlLnpJbmRleCA9IGZsb2F0aW5nUGFuZVN0YXJ0aW5nWiArIHggKiAyOworCX0KK30sIF9zZXRJbml0aWFsV2luZG93U3RhdGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzU2hvd2luZygpKSB7CisJCXRoaXMud2lkdGggPSAtMTsKKwkJdmFyIG1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCQl0aGlzLnJlc2l6ZVRvKG1iLndpZHRoLCBtYi5oZWlnaHQpOworCX0KKwlpZiAodGhpcy53aW5kb3dTdGF0ZSA9PSAibWF4aW1pemVkIikgeworCQl0aGlzLm1heGltaXplV2luZG93KCk7CisJCXRoaXMuc2hvdygpOworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLndpbmRvd1N0YXRlID09ICJub3JtYWwiKSB7CisJCXRoaXMuc2hvdygpOworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLndpbmRvd1N0YXRlID09ICJtaW5pbWl6ZWQiKSB7CisJCXRoaXMuaGlkZSgpOworCQlyZXR1cm47CisJfQorCXRoaXMud2luZG93U3RhdGUgPSAibWluaW1pemVkIjsKK30sIF90YXNrQmFyU2V0dXA6ZnVuY3Rpb24gKCkgeworCXZhciB0YXNrYmFyID0gZG9qby53aWRnZXQuZ2V0V2lkZ2V0QnlJZCh0aGlzLnRhc2tCYXJJZCk7CisJaWYgKCF0YXNrYmFyKSB7CisJCWlmICh0aGlzLl90YXNrQmFyQ29ubmVjdEF0dGVtcHRzIDwgdGhpcy5fbWF4X3Rhc2tCYXJDb25uZWN0QXR0ZW1wdHMpIHsKKwkJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsIHRoaXMuX3Rhc2tCYXJTZXR1cCwgNTApOworCQkJdGhpcy5fdGFza0JhckNvbm5lY3RBdHRlbXB0cysrOworCQl9IGVsc2UgeworCQkJZG9qby5kZWJ1ZygiVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHRhc2tCYXIiKTsKKwkJfQorCQlyZXR1cm47CisJfQorCXRhc2tiYXIuYWRkQ2hpbGQodGhpcyk7Cit9LCBzaG93RmxvYXRpbmdQYW5lOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmJyaW5nVG9Ub3AoKTsKK30sIG9uRmxvYXRpbmdQYW5lU2hvdzpmdW5jdGlvbiAoKSB7CisJdmFyIG1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCXRoaXMucmVzaXplVG8obWIud2lkdGgsIG1iLmhlaWdodCk7Cit9LCByZXNpemVUbzpmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgeworCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlLCB7d2lkdGg6d2lkdGgsIGhlaWdodDpoZWlnaHR9KTsKKwlkb2pvLndpZGdldC5odG1sLmxheW91dCh0aGlzLmRvbU5vZGUsIFt7ZG9tTm9kZTp0aGlzLnRpdGxlQmFyLCBsYXlvdXRBbGlnbjoidG9wIn0sIHtkb21Ob2RlOnRoaXMucmVzaXplQmFyLCBsYXlvdXRBbGlnbjoiYm90dG9tIn0sIHtkb21Ob2RlOnRoaXMuY29udGFpbmVyTm9kZSwgbGF5b3V0QWxpZ246ImNsaWVudCJ9XSk7CisJZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5jb250YWluZXJOb2RlLCB0aGlzLmNoaWxkcmVuLCAidG9wLWJvdHRvbSIpOworCXRoaXMuYmdJZnJhbWUub25SZXNpemVkKCk7CisJaWYgKHRoaXMuc2hhZG93KSB7CisJCXRoaXMuc2hhZG93LnNpemUod2lkdGgsIGhlaWdodCk7CisJfQorCXRoaXMub25SZXNpemVkKCk7Cit9LCBjaGVja1NpemU6ZnVuY3Rpb24gKCkgeworfSwgZGVzdHJveUZsb2F0aW5nUGFuZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMucmVzaXplSGFuZGxlKSB7CisJCXRoaXMucmVzaXplSGFuZGxlLmRlc3Ryb3koKTsKKwkJdGhpcy5yZXNpemVIYW5kbGUgPSBudWxsOworCX0KK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lIiwgW2Rvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLCBkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlXSwge2ZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdGhpcy5maWxsSW5GbG9hdGluZ1BhbmVUZW1wbGF0ZShhcmdzLCBmcmFnKTsKKwlkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsIGFyZ3MsIGZyYWcpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIHNob3c6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnNob3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLnNob3dGbG9hdGluZ1BhbmUoKTsKK30sIG9uU2hvdzpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3Mub25TaG93LmNhbGwodGhpcyk7CisJdGhpcy5vbkZsb2F0aW5nUGFuZVNob3coKTsKK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCXRoaXMuZGVzdHJveUZsb2F0aW5nUGFuZSgpOworCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUiLCBbZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLCBkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2VdLCB7d2luZG93U3RhdGU6Im1pbmltaXplZCIsIGRpc3BsYXlDbG9zZUFjdGlvbjp0cnVlLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2UucHJvdG90eXBlLnBvc3RDcmVhdGUuY2FsbCh0aGlzKTsKKwlkb2pvLndpZGdldC5Nb2RhbEZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuY2FsbCh0aGlzKTsKK30sIHNob3c6ZnVuY3Rpb24gKCkgeworCXRoaXMuc2hvd01vZGFsRGlhbG9nKCk7CisJZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5zaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5iZy5zdHlsZS56SW5kZXggPSB0aGlzLmRvbU5vZGUuc3R5bGUuekluZGV4IC0gMTsKK30sIGhpZGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuaGlkZU1vZGFsRGlhbG9nKCk7CisJZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5oaWRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBjbG9zZVdpbmRvdzpmdW5jdGlvbiAoKSB7CisJdGhpcy5oaWRlKCk7CisJZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5jbG9zZVdpbmRvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Zvcm0uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0Zvcm0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4ZTM3OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvRm9ybS5qcwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRm9ybSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRm9ybSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtpc0NvbnRhaW5lcjp0cnVlLCB0ZW1wbGF0ZVN0cmluZzoiPGZvcm0gZG9qb0F0dGFjaFBvaW50PSdjb250YWluZXJOb2RlJyBkb2pvQXR0YWNoRXZlbnQ9J29uU3VibWl0Om9uU3VibWl0Jz48L2Zvcm0+IiwgZm9ybUVsZW1lbnRzOltdLCBpZ25vcmVOdWxsVmFsdWVzOmZhbHNlLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZm9yICh2YXIga2V5IGluIGFyZ3MpIHsKKwkJaWYgKGtleSA9PSAiZG9qb3R5cGUiKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShrZXkpOworCQlhdHRyLm5vZGVWYWx1ZSA9IGFyZ3Nba2V5XTsKKwkJdGhpcy5jb250YWluZXJOb2RlLnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7CisJfQorfSwgX2NyZWF0ZVJlcGVhdGVyczpmdW5jdGlvbiAob2JqLCB3aWRnZXQpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHdpZGdldC5jaGlsZHJlbi5sZW5ndGg7ICsraSkgeworCQlpZiAod2lkZ2V0LmNoaWxkcmVuW2ldLndpZGdldFR5cGUgPT0gIlJlcGVhdGVyQ29udGFpbmVyIikgeworCQkJdmFyIHJJbmRleCA9IHdpZGdldC5jaGlsZHJlbltpXS5pbmRleDsKKwkJCXZhciBySW5kZXhQb3MgPSBySW5kZXguaW5kZXhPZigiJXtpbmRleH0iKTsKKwkJCXJJbmRleCA9IHJJbmRleC5zdWJzdHIoMCwgckluZGV4UG9zIC0gMSk7CisJCQl2YXIgbXlPYmogPSB0aGlzLl9nZXRPYmplY3Qob2JqLCBySW5kZXgpOworCQkJaWYgKHR5cGVvZiAobXlPYmopID09ICJvYmplY3QiICYmIG15T2JqLmxlbmd0aCA9PSAwKSB7CisJCQkJbXlPYmogPSBuZXcgQXJyYXkoKTsKKwkJCX0KKwkJCXZhciByb3dDb3VudCA9IHdpZGdldC5jaGlsZHJlbltpXS5nZXRSb3dDb3VudCgpOworCQkJZm9yICh2YXIgaiA9IDAsIGxlbiA9IHJvd0NvdW50OyBqIDwgbGVuOyArK2opIHsKKwkJCQl3aWRnZXQuY2hpbGRyZW5baV0uZGVsZXRlUm93KDApOworCQkJfQorCQkJZm9yICh2YXIgaiA9IDA7IGogPCBteU9iai5sZW5ndGg7IGorKykgeworCQkJCXdpZGdldC5jaGlsZHJlbltpXS5hZGRSb3coZmFsc2UpOworCQkJfQorCQl9CisJCWlmICh3aWRnZXQuY2hpbGRyZW5baV0uaXNDb250YWluZXIpIHsKKwkJCXRoaXMuX2NyZWF0ZVJlcGVhdGVycyhvYmosIHdpZGdldC5jaGlsZHJlbltpXSk7CisJCX0KKwl9Cit9LCBfY3JlYXRlRm9ybUVsZW1lbnRzOmZ1bmN0aW9uICgpIHsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpIHsKKwkJdGhpcy5mb3JtRWxlbWVudHMgPSBbXTsKKwkJdmFyIGVsZW1zID0gWyJJTlBVVCIsICJTRUxFQ1QiLCAiVEVYVEFSRUEiXTsKKwkJZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtcy5sZW5ndGg7IGsrKykgeworCQkJdmFyIGxpc3QgPSB0aGlzLmNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWxlbXNba10pOworCQkJZm9yICh2YXIgaiA9IDAsIGxlbjIgPSBsaXN0Lmxlbmd0aDsgaiA8IGxlbjI7IGorKykgeworCQkJCXRoaXMuZm9ybUVsZW1lbnRzLnB1c2gobGlzdFtqXSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMuY29udGFpbmVyTm9kZS5lbGVtZW50czsKKwl9Cit9LCBvblN1Ym1pdDpmdW5jdGlvbiAoZSkgeworCWUucHJldmVudERlZmF1bHQoKTsKK30sIHN1Ym1pdDpmdW5jdGlvbiAoKSB7CisJdGhpcy5jb250YWluZXJOb2RlLnN1Ym1pdCgpOworfSwgX2dldEZvcm1FbGVtZW50OmZ1bmN0aW9uIChuYW1lKSB7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuZm9ybUVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisJCQl2YXIgZWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnRzW2ldOworCQkJaWYgKGVsZW1lbnQubmFtZSA9PSBuYW1lKSB7CisJCQkJcmV0dXJuIGVsZW1lbnQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl2YXIgZWxlbSA9IHRoaXMuZm9ybUVsZW1lbnRzW25hbWVdOworCQlpZiAodHlwZW9mIChlbGVtKSAhPSAidW5kZWZpbmVkIikgeworCQkJcmV0dXJuIGVsZW07CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9LCBfZ2V0T2JqZWN0OmZ1bmN0aW9uIChvYmosIHNlYXJjaFN0cmluZykgeworCXZhciBuYW1lUGF0aCA9IFtdOworCW5hbWVQYXRoID0gc2VhcmNoU3RyaW5nLnNwbGl0KCIuIik7CisJdmFyIG15T2JqID0gb2JqOworCXZhciBuYW1lID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CisJZm9yICh2YXIgaiA9IDAsIGxlbiA9IG5hbWVQYXRoLmxlbmd0aDsgaiA8IGxlbjsgKytqKSB7CisJCXZhciBwID0gbmFtZVBhdGhbal07CisJCWlmICh0eXBlb2YgKG15T2JqW3BdKSA9PSAidW5kZWZpbmVkIikgeworCQkJbXlPYmpbcF0gPSB7fTsKKwkJfQorCQlteU9iaiA9IG15T2JqW3BdOworCX0KKwlyZXR1cm4gbXlPYmo7Cit9LCBfc2V0VG9Db250YWluZXJzOmZ1bmN0aW9uIChvYmosIHdpZGdldCkgeworCWZvciAodmFyIGkgPSAwLCBsZW4gPSB3aWRnZXQuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKwkJdmFyIGN1cnJlbnRXaWRnZXQgPSB3aWRnZXQuY2hpbGRyZW5baV07CisJCWlmIChjdXJyZW50V2lkZ2V0LndpZGdldFR5cGUgPT0gIlJlcGVhdGVyIikgeworCQkJZm9yICh2YXIgaiA9IDAsIGxlbiA9IGN1cnJlbnRXaWRnZXQuZ2V0Um93Q291bnQoKTsgaiA8IGxlbjsgKytqKSB7CisJCQkJY3VycmVudFdpZGdldC5faW5pdFJvdyhqKTsKKwkJCX0KKwkJfQorCQlpZiAoY3VycmVudFdpZGdldC5pc0NvbnRhaW5lcikgeworCQkJdGhpcy5fc2V0VG9Db250YWluZXJzKG9iaiwgY3VycmVudFdpZGdldCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKGN1cnJlbnRXaWRnZXQud2lkZ2V0VHlwZSkgeworCQkgIGNhc2UgIkNoZWNrYm94IjoKKwkJCWN1cnJlbnRXaWRnZXQuc2V0VmFsdWUoY3VycmVudFdpZGdldC5pbnB1dE5vZGUuY2hlY2tlZCk7CisJCQlicmVhazsKKwkJICBjYXNlICJEcm9wZG93bkRhdGVQaWNrZXIiOgorCQkJY3VycmVudFdpZGdldC5zZXRWYWx1ZShjdXJyZW50V2lkZ2V0LmdldFZhbHVlKCkpOworCQkJYnJlYWs7CisJCSAgY2FzZSAiU2VsZWN0IjoKKwkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCSAgY2FzZSAiQ29tYm9Cb3giOgorCQkJY29udGludWU7CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9LCBzZXRWYWx1ZXM6ZnVuY3Rpb24gKG9iaikgeworCXRoaXMuX2NyZWF0ZUZvcm1FbGVtZW50cygpOworCXRoaXMuX2NyZWF0ZVJlcGVhdGVycyhvYmosIHRoaXMpOworCWZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmZvcm1FbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworCQl2YXIgZWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnRzW2ldOworCQlpZiAoZWxlbWVudC5uYW1lID09ICIiKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgbmFtZVBhdGggPSBuZXcgQXJyYXkoKTsKKwkJbmFtZVBhdGggPSBlbGVtZW50Lm5hbWUuc3BsaXQoIi4iKTsKKwkJdmFyIG15T2JqID0gb2JqOworCQl2YXIgbmFtZSA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOworCQlmb3IgKHZhciBqID0gMSwgbGVuMiA9IG5hbWVQYXRoLmxlbmd0aDsgaiA8IGxlbjI7ICsraikgeworCQkJdmFyIHAgPSBuYW1lUGF0aFtqIC0gMV07CisJCQlpZiAodHlwZW9mIChteU9ialtwXSkgPT0gInVuZGVmaW5lZCIpIHsKKwkJCQlteU9iaiA9IHVuZGVmaW5lZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW15T2JqID0gbXlPYmpbcF07CisJCX0KKwkJaWYgKHR5cGVvZiAobXlPYmopID09ICJ1bmRlZmluZWQiKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodHlwZW9mIChteU9ialtuYW1lXSkgPT0gInVuZGVmaW5lZCIgJiYgdGhpcy5pZ25vcmVOdWxsVmFsdWVzKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTsKKwkJaWYgKHR5cGUgPT0gImhpZGRlbiIgfHwgdHlwZSA9PSAidGV4dCIgfHwgdHlwZSA9PSAidGV4dGFyZWEiIHx8IHR5cGUgPT0gInBhc3N3b3JkIikgeworCQkJdHlwZSA9ICJ0ZXh0IjsKKwkJfQorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJICBjYXNlICJjaGVja2JveCI6CisJCQllbGVtZW50LmNoZWNrZWQgPSBmYWxzZTsKKwkJCWlmICh0eXBlb2YgKG15T2JqW25hbWVdKSA9PSAidW5kZWZpbmVkIikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yICh2YXIgaiA9IDAsIGxlbjIgPSBteU9ialtuYW1lXS5sZW5ndGg7IGogPCBsZW4yOyArK2opIHsKKwkJCQlpZiAoZWxlbWVudC52YWx1ZSA9PSBteU9ialtuYW1lXVtqXSkgeworCQkJCQllbGVtZW50LmNoZWNrZWQgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkgIGNhc2UgInJhZGlvIjoKKwkJCWVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlOworCQkJaWYgKHR5cGVvZiAobXlPYmpbbmFtZV0pID09ICJ1bmRlZmluZWQiKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobXlPYmpbbmFtZV0gPT0gZWxlbWVudC52YWx1ZSkgeworCQkJCWVsZW1lbnQuY2hlY2tlZCA9IHRydWU7CisJCQl9CisJCQlicmVhazsKKwkJICBjYXNlICJzZWxlY3QtbXVsdGlwbGUiOgorCQkJZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gLTE7CisJCQlmb3IgKHZhciBqID0gMCwgbGVuMiA9IGVsZW1lbnQub3B0aW9ucy5sZW5ndGg7IGogPCBsZW4yOyArK2opIHsKKwkJCQlmb3IgKHZhciBrID0gMCwgbGVuMyA9IG15T2JqW25hbWVdLmxlbmd0aDsgayA8IGxlbjM7ICsraykgeworCQkJCQlpZiAoZWxlbWVudC5vcHRpb25zW2pdLnZhbHVlID09IG15T2JqW25hbWVdW2tdKSB7CisJCQkJCQllbGVtZW50Lm9wdGlvbnNbal0uc2VsZWN0ZWQgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCSAgY2FzZSAic2VsZWN0LW9uZSI6CisJCQllbGVtZW50LnNlbGVjdGVkSW5kZXggPSAiMCI7CisJCQlmb3IgKHZhciBqID0gMCwgbGVuMiA9IGVsZW1lbnQub3B0aW9ucy5sZW5ndGg7IGogPCBsZW4yOyArK2opIHsKKwkJCQlpZiAoZWxlbWVudC5vcHRpb25zW2pdLnZhbHVlID09IG15T2JqW25hbWVdKSB7CisJCQkJCWVsZW1lbnQub3B0aW9uc1tqXS5zZWxlY3RlZCA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJICBjYXNlICJ0ZXh0IjoKKwkJCXZhciB2YWx1ZSA9ICIiOworCQkJaWYgKHR5cGVvZiAobXlPYmpbbmFtZV0pICE9ICJ1bmRlZmluZWQiKSB7CisJCQkJdmFsdWUgPSBteU9ialtuYW1lXTsKKwkJCX0KKwkJCWVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlkb2pvLmRlYnVnKCJOb3Qgc3VwcG9ydGVkIHR5cGUgKCIgKyB0eXBlICsgIikiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRoaXMuX3NldFRvQ29udGFpbmVycyhvYmosIHRoaXMpOworfSwgZ2V0VmFsdWVzOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9jcmVhdGVGb3JtRWxlbWVudHMoKTsKKwl2YXIgb2JqID0ge307CisJZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuZm9ybUVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisJCXZhciBlbG0gPSB0aGlzLmZvcm1FbGVtZW50c1tpXTsKKwkJdmFyIG5hbWVQYXRoID0gW107CisJCWlmIChlbG0ubmFtZSA9PSAiIikgeworCQkJY29udGludWU7CisJCX0KKwkJbmFtZVBhdGggPSBlbG0ubmFtZS5zcGxpdCgiLiIpOworCQl2YXIgbXlPYmogPSBvYmo7CisJCXZhciBuYW1lID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CisJCWZvciAodmFyIGogPSAxLCBsZW4yID0gbmFtZVBhdGgubGVuZ3RoOyBqIDwgbGVuMjsgKytqKSB7CisJCQl2YXIgbmFtZUluZGV4ID0gbnVsbDsKKwkJCXZhciBwID0gbmFtZVBhdGhbaiAtIDFdOworCQkJdmFyIG5hbWVBID0gcC5zcGxpdCgiWyIpOworCQkJaWYgKG5hbWVBLmxlbmd0aCA+IDEpIHsKKwkJCQlpZiAodHlwZW9mIChteU9ialtuYW1lQVswXV0pID09ICJ1bmRlZmluZWQiKSB7CisJCQkJCW15T2JqW25hbWVBWzBdXSA9IFtdOworCQkJCX0KKwkJCQluYW1lSW5kZXggPSBwYXJzZUludChuYW1lQVsxXSk7CisJCQkJaWYgKHR5cGVvZiAobXlPYmpbbmFtZUFbMF1dW25hbWVJbmRleF0pID09ICJ1bmRlZmluZWQiKSB7CisJCQkJCW15T2JqW25hbWVBWzBdXVtuYW1lSW5kZXhdID0ge307CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodHlwZW9mIChteU9ialtuYW1lQVswXV0pID09ICJ1bmRlZmluZWQiKSB7CisJCQkJCW15T2JqW25hbWVBWzBdXSA9IHt9OworCQkJCX0KKwkJCX0KKwkJCWlmIChuYW1lQS5sZW5ndGggPT0gMSkgeworCQkJCW15T2JqID0gbXlPYmpbbmFtZUFbMF1dOworCQkJfSBlbHNlIHsKKwkJCQlteU9iaiA9IG15T2JqW25hbWVBWzBdXVtuYW1lSW5kZXhdOworCQkJfQorCQl9CisJCWlmICgoZWxtLnR5cGUgIT0gInNlbGVjdC1tdWx0aXBsZSIgJiYgZWxtLnR5cGUgIT0gImNoZWNrYm94IiAmJiBlbG0udHlwZSAhPSAicmFkaW8iKSB8fCAoZWxtLnR5cGUgPT0gInJhZGlvIiAmJiBlbG0uY2hlY2tlZCkpIHsKKwkJCWlmIChuYW1lID09IG5hbWUuc3BsaXQoIlsiKVswXSkgeworCQkJCW15T2JqW25hbWVdID0gZWxtLnZhbHVlOworCQkJfSBlbHNlIHsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChlbG0udHlwZSA9PSAiY2hlY2tib3giICYmIGVsbS5jaGVja2VkKSB7CisJCQkJaWYgKHR5cGVvZiAobXlPYmpbbmFtZV0pID09ICJ1bmRlZmluZWQiKSB7CisJCQkJCW15T2JqW25hbWVdID0gW107CisJCQkJfQorCQkJCW15T2JqW25hbWVdLnB1c2goZWxtLnZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGVsbS50eXBlID09ICJzZWxlY3QtbXVsdGlwbGUiKSB7CisJCQkJCWlmICh0eXBlb2YgKG15T2JqW25hbWVdKSA9PSAidW5kZWZpbmVkIikgeworCQkJCQkJbXlPYmpbbmFtZV0gPSBbXTsKKwkJCQkJfQorCQkJCQlmb3IgKHZhciBqZHggPSAwLCBsZW4zID0gZWxtLm9wdGlvbnMubGVuZ3RoOyBqZHggPCBsZW4zOyArK2pkeCkgeworCQkJCQkJaWYgKGVsbS5vcHRpb25zW2pkeF0uc2VsZWN0ZWQpIHsKKwkJCQkJCQlteU9ialtuYW1lXS5wdXNoKGVsbS5vcHRpb25zW2pkeF0udmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCW5hbWUgPSB1bmRlZmluZWQ7CisJfQorCXJldHVybiBvYmo7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvR29vZ2xlTWFwLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Hb29nbGVNYXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvR29vZ2xlTWFwLmpzCkBAIC0wLDAgKzEsMTY5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Hb29nbGVNYXAiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubWF0aCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLlVyaSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7CisoZnVuY3Rpb24gKCkgeworCXZhciBna2V5ID0gZGpDb25maWdbImdNYXBLZXkiXSB8fCBkakNvbmZpZ1siZ29vZ2xlTWFwS2V5Il07CisJdmFyIHVyaSA9IG5ldyBkb2pvLnVyaS5Vcmkod2luZG93LmxvY2F0aW9uLmhyZWYpOworCWlmICh1cmkuaG9zdCA9PSAid3d3LmRvam90b29sa2l0Lm9yZyIpIHsKKwkJZ2tleSA9ICJBQlFJQUFBQUNVTmRndl83RkdPbVVzbGJtOWw2X2hScWpwN3JpMm1OaU9FWXFldEQzeG5GSHB0NXJCU2pzekRkMXNkdWZQeVFLVVR5Q2ZfWXhvSXh2dyI7CisJfSBlbHNlIHsKKwkJaWYgKHVyaS5ob3N0ID09ICJibG9nLmRvam90b29sa2l0Lm9yZyIpIHsKKwkJCWdrZXkgPSAiQUJRSUFBQUFDVU5kZ3ZfN0ZHT21Vc2xibTlsNl9oU2tlcDZBdjF4YU1oVm4zeUNMa29ySmVYZUxBUlE2ZmFtbUlfUDNxU0dsZVRKaG9JNV8xSm1QX1EiOworCQl9IGVsc2UgeworCQkJaWYgKHVyaS5ob3N0ID09ICJhcmNoaXZlLmRvam90b29sa2l0Lm9yZyIpIHsKKwkJCQlna2V5ID0gIkFCUUlBQUFBQ1VOZGd2XzdGR09tVXNsYm05bDZfaFRhUXBEdDBkeUdMSUhiWE1QVHpnMWtXZUFmd1JUd1pOeXJVZmJmeFlFOXlJdlJpdkVqY1hvRFRnIjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHVyaS5ob3N0ID09ICJkb2pvdG9vbGtpdC5vcmciKSB7CisJCQkJCWdrZXkgPSAiQUJRSUFBQUFDVU5kZ3ZfN0ZHT21Vc2xibTlsNl9oU2FPYU9fVGdKNWMzbXRRRm5rNUpPMnpENWRaQlJaay1pZXFWczdCT1JSRVlOekFFUm1jSm9FalEiOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoIWRvam8uaG9zdGVudi5wb3N0X2xvYWRfKSB7CisJCWlmICghZ2tleSB8fCBna2V5ID09ICIiKSB7CisJCQlkb2pvLnJhaXNlKCJkb2pvLndpZGdldC5Hb29nbGVNYXA6IFRoZSBHb29nbGUgTWFwIHdpZGdldCByZXF1aXJlcyBhIHByb3BlciBBUEkga2V5IGluIG9yZGVyIHRvIGJlIHVzZWQuIik7CisJCX0KKwkJdmFyIHRhZyA9ICI8c2NyIiArICJpcHQgc3JjPSdodHRwOi8vbWFwcy5nb29nbGUuY29tL21hcHM/ZmlsZT1hcGkmYW1wO3Y9MiZhbXA7a2V5PSIgKyBna2V5ICsgIic+PC9zY3JpIiArICJwdD4iOworCQlpZiAoIWRqX2dsb2JhbFsiR01hcDIiXSkgeworCQkJZG9jdW1lbnQud3JpdGUodGFnKTsKKwkJfQorCX0gZWxzZSB7CisJCWRvam8uZGVidWcoIkNhbm5vdCBpbml0aWFsaXplIEdvb2dsZSBNYXAgc3lzdGVtIGFmdGVyIHRoZSBwYWdlIGhhcyBiZWVuIGxvYWRlZCEgUGxlYXNlIGVpdGhlciBtYW51YWxseSBpbmNsdWRlIHRoZSBzY3JpcHQgYmxvY2sgcHJvdmlkZWQgYnkgR29vZ2xlIGluIHlvdXIgcGFnZSBvciByZXF1aXJlKCkgdGhlIEdvb2dsZU1hcCB3aWRnZXQgYmVmb3JlIG9ubG9hZCBoYXMgZmlyZWQuIik7CisJfQorfSkoKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuR29vZ2xlTWFwIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMubWFwID0gbnVsbDsKKwl0aGlzLmdlb2NvZGVyID0gbnVsbDsKKwl0aGlzLmRhdGEgPSBbXTsKKwl0aGlzLmRhdGFzcmMgPSAiIjsKKwl0aGlzLmNvbnRyb2xzID0gWyJsYXJnZW1hcCIsICJzY2FsZSIsICJtYXB0eXBlIl07Cit9LCB7dGVtcGxhdGVQYXRoOm51bGwsIHRlbXBsYXRlQ3NzUGF0aDpudWxsLCBpc0NvbnRhaW5lcjpmYWxzZSwgX2RlZmF1bHRQb2ludDp7bGF0OjM5LjEwNjYyLCBsbmc6LTk0LjU3ODIwOX0sIHNldENvbnRyb2xzOmZ1bmN0aW9uICgpIHsKKwl2YXIgbWV0aG9kbWFwID0ge2xhcmdlbWFwOkdMYXJnZU1hcENvbnRyb2wsIHNtYWxsbWFwOkdTbWFsbE1hcENvbnRyb2wsIHNtYWxsem9vbTpHU21hbGxab29tQ29udHJvbCwgc2NhbGU6R1NjYWxlQ29udHJvbCwgbWFwdHlwZTpHTWFwVHlwZUNvbnRyb2wsIG92ZXJ2aWV3OkdPdmVydmlld01hcENvbnRyb2x9OworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250cm9scy5sZW5ndGg7IGkrKykgeworCQl0aGlzLm1hcC5hZGRDb250cm9sKG5ldyAobWV0aG9kbWFwW3RoaXMuY29udHJvbHNbaV0udG9Mb3dlckNhc2UoKV0pKCkpOworCX0KK30sIGZpbmRDZW50ZXI6ZnVuY3Rpb24gKGJvdW5kcykgeworCWlmICh0aGlzLmRhdGEubGVuZ3RoID09IDEpIHsKKwkJcmV0dXJuIChuZXcgR0xhdExuZyh0aGlzLmRhdGFbMF0ubGF0LCB0aGlzLmRhdGFbMF0ubG5nKSk7CisJfQorCXZhciBjbGF0ID0gKGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQoKSArIGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sYXQoKSkgLyAyOworCXZhciBjbG5nID0gKGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sbmcoKSArIGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcoKSkgLyAyOworCXJldHVybiAobmV3IEdMYXRMbmcoY2xhdCwgY2xuZykpOworfSwgY3JlYXRlUGlucG9pbnQ6ZnVuY3Rpb24gKHB0LCBvdmVybGF5KSB7CisJdmFyIG0gPSBuZXcgR01hcmtlcihwdCk7CisJaWYgKG92ZXJsYXkpIHsKKwkJR0V2ZW50LmFkZExpc3RlbmVyKG0sICJjbGljayIsIGZ1bmN0aW9uICgpIHsKKwkJCW0ub3BlbkluZm9XaW5kb3dIdG1sKCI8ZGl2PiIgKyBvdmVybGF5ICsgIjwvZGl2PiIpOworCQl9KTsKKwl9CisJcmV0dXJuIG07Cit9LCBwbG90OmZ1bmN0aW9uIChvYmopIHsKKwl2YXIgcCA9IG5ldyBHTGF0TG5nKG9iai5sYXQsIG9iai5sbmcpOworCXZhciBkID0gb2JqLmRlc2NyaXB0aW9uIHx8IG51bGw7CisJdmFyIG0gPSB0aGlzLmNyZWF0ZVBpbnBvaW50KHAsIGQpOworCXRoaXMubWFwLmFkZE92ZXJsYXkobSk7Cit9LCBwbG90QWRkcmVzczpmdW5jdGlvbiAoYWRkcmVzcykgeworCXZhciBzZWxmID0gdGhpczsKKwl0aGlzLmdlb2NvZGVyLmdldExvY2F0aW9ucyhhZGRyZXNzLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKKwkJaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5TdGF0dXMuY29kZSAhPSAyMDApIHsKKwkJCWFsZXJ0KCJUaGUgYWRkcmVzcyBcIiIgKyBhZGRyZXNzICsgIlwiIHdhcyBub3QgZm91bmQuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIG9iaiA9IHtsYXQ6cmVzcG9uc2UuUGxhY2VtYXJrWzBdLlBvaW50LmNvb3JkaW5hdGVzWzFdLCBsbmc6cmVzcG9uc2UuUGxhY2VtYXJrWzBdLlBvaW50LmNvb3JkaW5hdGVzWzBdLCBkZXNjcmlwdGlvbjpyZXNwb25zZS5QbGFjZW1hcmtbMF0uYWRkcmVzc307CisJCXNlbGYuZGF0YS5wdXNoKG9iaik7CisJCXNlbGYucmVuZGVyKCk7CisJfSk7Cit9LCBwYXJzZTpmdW5jdGlvbiAodGFibGUpIHsKKwl0aGlzLmRhdGEgPSBbXTsKKwl2YXIgaCA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aGVhZCIpWzBdOworCWlmICghaCkgeworCQlyZXR1cm47CisJfQorCXZhciBhID0gW107CisJdmFyIGNvbHMgPSBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCWlmIChjb2xzLmxlbmd0aCA9PSAwKSB7CisJCWNvbHMgPSBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aCIpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGMgPSBjb2xzW2ldLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpOworCQlpZiAoYyA9PSAibG9uZyIpIHsKKwkJCWMgPSAibG5nIjsKKwkJfQorCQlhLnB1c2goYyk7CisJfQorCXZhciBiID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF07CisJaWYgKCFiKSB7CisJCXJldHVybjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBiLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKCEoYi5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lICYmIGIuY2hpbGROb2Rlc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ciIpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgY2VsbHMgPSBiLmNoaWxkTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCXZhciBvID0ge307CisJCWZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgeworCQkJdmFyIGNvbCA9IGFbal07CisJCQlpZiAoY29sID09ICJsYXQiIHx8IGNvbCA9PSAibG5nIikgeworCQkJCW9bY29sXSA9IHBhcnNlRmxvYXQoY2VsbHNbal0uaW5uZXJIVE1MKTsKKwkJCX0gZWxzZSB7CisJCQkJb1tjb2xdID0gY2VsbHNbal0uaW5uZXJIVE1MOworCQkJfQorCQl9CisJCXRoaXMuZGF0YS5wdXNoKG8pOworCX0KK30sIHJlbmRlcjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZGF0YS5sZW5ndGggPT0gMCkgeworCQl0aGlzLm1hcC5zZXRDZW50ZXIobmV3IEdMYXRMbmcodGhpcy5fZGVmYXVsdFBvaW50LmxhdCwgdGhpcy5fZGVmYXVsdFBvaW50LmxuZyksIDQpOworCQlyZXR1cm47CisJfQorCXRoaXMubWFwLmNsZWFyT3ZlcmxheXMoKTsKKwl2YXIgYm91bmRzID0gbmV3IEdMYXRMbmdCb3VuZHMoKTsKKwl2YXIgZCA9IHRoaXMuZGF0YTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGQubGVuZ3RoOyBpKyspIHsKKwkJYm91bmRzLmV4dGVuZChuZXcgR0xhdExuZyhkW2ldLmxhdCwgZFtpXS5sbmcpKTsKKwl9CisJdmFyIHpvb20gPSBNYXRoLm1pbigodGhpcy5tYXAuZ2V0Qm91bmRzWm9vbUxldmVsKGJvdW5kcykgLSAxKSwgMTQpOworCXRoaXMubWFwLnNldENlbnRlcih0aGlzLmZpbmRDZW50ZXIoYm91bmRzKSwgem9vbSk7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5wbG90KHRoaXMuZGF0YVtpXSk7CisJfQorfSwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLmRhdGFzcmMpIHsKKwkJdGhpcy5wYXJzZShkb2pvLmJ5SWQodGhpcy5kYXRhc3JjKSk7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXSkgeworCQkJdGhpcy5wYXJzZSh0aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhYmxlIilbMF0pOworCQl9CisJfQorfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJd2hpbGUgKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzWzBdKTsKKwl9CisJaWYgKHRoaXMuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbiAhPSAiYWJzb2x1dGUiKSB7CisJCXRoaXMuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJfQorCXRoaXMubWFwID0gbmV3IEdNYXAyKHRoaXMuZG9tTm9kZSk7CisJdHJ5IHsKKwkJdGhpcy5nZW9jb2RlciA9IG5ldyBHQ2xpZW50R2VvY29kZXIoKTsKKwl9CisJY2F0Y2ggKGV4KSB7CisJfQorCXRoaXMucmVuZGVyKCk7CisJdGhpcy5zZXRDb250cm9scygpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0h0bWxXaWRnZXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0h0bWxXaWRnZXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkZmZkNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvSHRtbFdpZGdldC5qcwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Eb21XaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnV0aWwiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmRpc3BsYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZXh0cmFzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LnRvZ2dsZSIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0IiwgZG9qby53aWRnZXQuRG9tV2lkZ2V0LCB7dGVtcGxhdGVDc3NQYXRoOm51bGwsIHRlbXBsYXRlUGF0aDpudWxsLCBsYW5nOiIiLCB0b2dnbGU6InBsYWluIiwgdG9nZ2xlRHVyYXRpb246MTUwLCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7Cit9LCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJaWYgKHRoaXMubGFuZyA9PT0gIiIpIHsKKwkJdGhpcy5sYW5nID0gbnVsbDsKKwl9CisJdGhpcy50b2dnbGVPYmogPSBkb2pvLmxmeC50b2dnbGVbdGhpcy50b2dnbGUudG9Mb3dlckNhc2UoKV0gfHwgZG9qby5sZngudG9nZ2xlLnBsYWluOworfSwgY3JlYXRlTm9kZXNGcm9tVGV4dDpmdW5jdGlvbiAodHh0LCB3cmFwKSB7CisJcmV0dXJuIGRvam8uaHRtbC5jcmVhdGVOb2Rlc0Zyb21UZXh0KHR4dCwgd3JhcCk7Cit9LCBkZXN0cm95UmVuZGVyaW5nOmZ1bmN0aW9uIChmaW5hbGl6ZSkgeworCXRyeSB7CisJCWlmICh0aGlzLmJnSWZyYW1lKSB7CisJCQl0aGlzLmJnSWZyYW1lLnJlbW92ZSgpOworCQkJZGVsZXRlIHRoaXMuYmdJZnJhbWU7CisJCX0KKwkJaWYgKCFmaW5hbGl6ZSAmJiB0aGlzLmRvbU5vZGUpIHsKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5jbGVhbih0aGlzLmRvbU5vZGUpOworCQl9CisJCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQuc3VwZXJjbGFzcy5kZXN0cm95UmVuZGVyaW5nLmNhbGwodGhpcyk7CisJfQorCWNhdGNoIChlKSB7CisJfQorfSwgaXNTaG93aW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby5odG1sLmlzU2hvd2luZyh0aGlzLmRvbU5vZGUpOworfSwgdG9nZ2xlU2hvd2luZzpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nKCkpIHsKKwkJdGhpcy5oaWRlKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5zaG93KCk7CisJfQorfSwgc2hvdzpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nKCkpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3MgPSB0cnVlOworCXRoaXMudG9nZ2xlT2JqLnNob3codGhpcy5kb21Ob2RlLCB0aGlzLnRvZ2dsZUR1cmF0aW9uLCBudWxsLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGhpcy5vblNob3cpLCB0aGlzLmV4cGxvZGVTcmMpOworfSwgb25TaG93OmZ1bmN0aW9uICgpIHsKKwl0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKKwl0aGlzLmNoZWNrU2l6ZSgpOworfSwgaGlkZTpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmlzU2hvd2luZygpKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5hbmltYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKKwl0aGlzLnRvZ2dsZU9iai5oaWRlKHRoaXMuZG9tTm9kZSwgdGhpcy50b2dnbGVEdXJhdGlvbiwgbnVsbCwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMub25IaWRlKSwgdGhpcy5leHBsb2RlU3JjKTsKK30sIG9uSGlkZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5hbmltYXRpb25JblByb2dyZXNzID0gZmFsc2U7Cit9LCBfaXNSZXNpemVkOmZ1bmN0aW9uICh3LCBoKSB7CisJaWYgKCF0aGlzLmlzU2hvd2luZygpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIHdoID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCXZhciB3aWR0aCA9IHcgfHwgd2gud2lkdGg7CisJdmFyIGhlaWdodCA9IGggfHwgd2guaGVpZ2h0OworCWlmICh0aGlzLndpZHRoID09IHdpZHRoICYmIHRoaXMuaGVpZ2h0ID09IGhlaWdodCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMud2lkdGggPSB3aWR0aDsKKwl0aGlzLmhlaWdodCA9IGhlaWdodDsKKwlyZXR1cm4gdHJ1ZTsKK30sIGNoZWNrU2l6ZTpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLl9pc1Jlc2l6ZWQoKSkgeworCQlyZXR1cm47CisJfQorCXRoaXMub25SZXNpemVkKCk7Cit9LCByZXNpemVUbzpmdW5jdGlvbiAodywgaCkgeworCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlLCB7d2lkdGg6dywgaGVpZ2h0Omh9KTsKKwlpZiAodGhpcy5pc1Nob3dpbmcoKSkgeworCQl0aGlzLm9uUmVzaXplZCgpOworCX0KK30sIHJlc2l6ZVNvb246ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzU2hvd2luZygpKSB7CisJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsIHRoaXMub25SZXNpemVkLCAwKTsKKwl9Cit9LCBvblJlc2l6ZWQ6ZnVuY3Rpb24gKCkgeworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgeworCQlpZiAoY2hpbGQuY2hlY2tTaXplKSB7CisJCQljaGlsZC5jaGVja1NpemUoKTsKKwkJfQorCX0pOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0lubGluZUVkaXRCb3guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0lubGluZUVkaXRCb3guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0YjUwMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvSW5saW5lRWRpdEJveC5qcwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuSW5saW5lRWRpdEJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZ2Z4LmNvbG9yIik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuSW5saW5lRWRpdEJveCIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmhpc3RvcnkgPSBbXTsKK30sIHt0ZW1wbGF0ZVN0cmluZzoiPGZvcm0gY2xhc3M9XCJpbmxpbmVFZGl0Qm94XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgZG9qb0F0dGFjaFBvaW50PVwiZm9ybVwiIGRvam9BdHRhY2hFdmVudD1cIm9uU3VibWl0OnNhdmVFZGl0OyBvblJlc2V0OmNhbmNlbEVkaXQ7IG9uS2V5VXA6IGNoZWNrRm9yVmFsdWVDaGFuZ2U7XCI+XG5cdDxpbnB1dCB0eXBlPVwidGV4dFwiIGRvam9BdHRhY2hQb2ludD1cInRleHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cblx0PHRleHRhcmVhIGRvam9BdHRhY2hQb2ludD1cInRleHRhcmVhXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvdGV4dGFyZWE+XG5cdDxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJTYXZlXCIgZG9qb0F0dGFjaFBvaW50PVwic3VibWl0QnV0dG9uXCIgLz5cblx0PGlucHV0IHR5cGU9XCJyZXNldFwiIHZhbHVlPVwiQ2FuY2VsXCIgZG9qb0F0dGFjaFBvaW50PVwiY2FuY2VsQnV0dG9uXCIgLz5cbjwvZm9ybT5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZWRpdExhYmVsIHtcblx0Zm9udC1zaXplIDogc21hbGw7XG5cdHBhZGRpbmcgOiAwIDVweDtcblx0ZGlzcGxheSA6IG5vbmU7XG59XG5cbi5lZGl0YWJsZVJlZ2lvbkRpc2FibGVkIHtcblx0Y3Vyc29yIDogcG9pbnRlcjtcblx0X2N1cnNvciA6IGhhbmQ7XG59XG5cbi5lZGl0YWJsZVJlZ2lvbiB7XG5cdGJhY2tncm91bmQtY29sb3IgOiAjZmZjICFpbXBvcnRhbnQ7XG5cdGN1cnNvciA6IHBvaW50ZXI7XG5cdF9jdXJzb3IgOiBoYW5kO1xufVxuXG4uZWRpdGFibGVSZWdpb24gLmVkaXRMYWJlbCB7XG5cdGRpc3BsYXkgOiBpbmxpbmU7XG59XG5cbi5lZGl0YWJsZVRleHRhcmVhUmVnaW9uIC5lZGl0TGFiZWwge1xuXHRkaXNwbGF5IDogYmxvY2s7XG59XG5cbi5pbmxpbmVFZGl0Qm94IHtcblx0LypiYWNrZ3JvdW5kLWNvbG9yIDogI2ZmYzsqL1xuXHRkaXNwbGF5IDogaW5saW5lO1xufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0lubGluZUVkaXRCb3guY3NzIiksIG1vZGU6InRleHQiLCBuYW1lOiIiLCBtaW5XaWR0aDoxMDAsIG1pbkhlaWdodDoyMDAsIGVkaXRpbmc6ZmFsc2UsIHZhbHVlOiIiLCB0ZXh0VmFsdWU6IiIsIGRlZmF1bHRUZXh0OiIiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy50ZXh0VmFsdWUpIHsKKwkJZG9qby5kZXByZWNhdGVkKCJJbmxpbmVFZGl0Qm94OiBVc2UgdmFsdWUgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGV4dFZhbHVlOyB3aWxsIGJlIHJlbW92ZWQgaW4gMC41Iik7CisJCXRoaXMudmFsdWUgPSB0aGlzLnRleHRWYWx1ZTsKKwl9CisJaWYgKHRoaXMuZGVmYXVsdFRleHQpIHsKKwkJZG9qby5kZXByZWNhdGVkKCJJbmxpbmVFZGl0Qm94OiBVc2UgdmFsdWUgcGFyYW1ldGVyIGluc3RlYWQgb2YgZGVmYXVsdFRleHQ7IHdpbGwgYmUgcmVtb3ZlZCBpbiAwLjUiKTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFRleHQ7CisJfQorfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXRoaXMuZWRpdGFibGUgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCWRvam8uaHRtbC5pbnNlcnRBZnRlcih0aGlzLmVkaXRhYmxlLCB0aGlzLmZvcm0pOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmVkaXRhYmxlLCAib25tb3VzZW92ZXIiLCB0aGlzLCAib25Nb3VzZU92ZXIiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5lZGl0YWJsZSwgIm9ubW91c2VvdXQiLCB0aGlzLCAib25Nb3VzZU91dCIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmVkaXRhYmxlLCAib25jbGljayIsIHRoaXMsICJfYmVnaW5FZGl0Iik7CisJaWYgKHRoaXMudmFsdWUpIHsKKwkJdGhpcy5lZGl0YWJsZS5pbm5lckhUTUwgPSB0aGlzLnZhbHVlOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJdGhpcy52YWx1ZSA9IGRvam8uc3RyaW5nLnRyaW0odGhpcy5lZGl0YWJsZS5pbm5lckhUTUwpOworCQl0aGlzLmVkaXRhYmxlLmlubmVySFRNTCA9IHRoaXMudmFsdWU7CisJfQorfSwgb25Nb3VzZU92ZXI6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5lZGl0aW5nKSB7CisJCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5lZGl0YWJsZSwgImVkaXRhYmxlUmVnaW9uRGlzYWJsZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmVkaXRhYmxlLCAiZWRpdGFibGVSZWdpb24iKTsKKwkJCWlmICh0aGlzLm1vZGUgPT0gInRleHRhcmVhIikgeworCQkJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmVkaXRhYmxlLCAiZWRpdGFibGVUZXh0YXJlYVJlZ2lvbiIpOworCQkJfQorCQl9CisJfQorfSwgb25Nb3VzZU91dDpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmVkaXRpbmcpIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZWRpdGFibGUsICJlZGl0YWJsZVJlZ2lvbiIpOworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5lZGl0YWJsZSwgImVkaXRhYmxlVGV4dGFyZWFSZWdpb24iKTsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZWRpdGFibGUsICJlZGl0YWJsZVJlZ2lvbkRpc2FibGVkIik7CisJfQorfSwgX2JlZ2luRWRpdDpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLmVkaXRpbmcgfHwgdGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCXRoaXMub25Nb3VzZU91dCgpOworCXRoaXMuZWRpdGluZyA9IHRydWU7CisJdmFyIGVlID0gdGhpc1t0aGlzLm1vZGUudG9Mb3dlckNhc2UoKV07CisJZWUudmFsdWUgPSBkb2pvLnN0cmluZy50cmltKHRoaXMudmFsdWUpOworCWVlLnN0eWxlLmZvbnRTaXplID0gZG9qby5odG1sLmdldFN0eWxlKHRoaXMuZWRpdGFibGUsICJmb250LXNpemUiKTsKKwllZS5zdHlsZS5mb250V2VpZ2h0ID0gZG9qby5odG1sLmdldFN0eWxlKHRoaXMuZWRpdGFibGUsICJmb250LXdlaWdodCIpOworCWVlLnN0eWxlLmZvbnRTdHlsZSA9IGRvam8uaHRtbC5nZXRTdHlsZSh0aGlzLmVkaXRhYmxlLCAiZm9udC1zdHlsZSIpOworCXZhciBiYiA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3godGhpcy5lZGl0YWJsZSk7CisJZWUuc3R5bGUud2lkdGggPSBNYXRoLm1heChiYi53aWR0aCwgdGhpcy5taW5XaWR0aCkgKyAicHgiOworCWlmICh0aGlzLm1vZGUudG9Mb3dlckNhc2UoKSA9PSAidGV4dGFyZWEiKSB7CisJCWVlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCQllZS5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heChiYi5oZWlnaHQsIHRoaXMubWluSGVpZ2h0KSArICJweCI7CisJfSBlbHNlIHsKKwkJZWUuc3R5bGUuZGlzcGxheSA9ICIiOworCX0KKwl0aGlzLmZvcm0uc3R5bGUuZGlzcGxheSA9ICIiOworCXRoaXMuZWRpdGFibGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwllZS5mb2N1cygpOworCWVlLnNlbGVjdCgpOworCXRoaXMuc3VibWl0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKK30sIHNhdmVFZGl0OmZ1bmN0aW9uIChlKSB7CisJZS5wcmV2ZW50RGVmYXVsdCgpOworCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJdmFyIGVlID0gdGhpc1t0aGlzLm1vZGUudG9Mb3dlckNhc2UoKV07CisJaWYgKCh0aGlzLnZhbHVlICE9IGVlLnZhbHVlKSAmJiAoZG9qby5zdHJpbmcudHJpbShlZS52YWx1ZSkgIT0gIiIpKSB7CisJCXRoaXMuZG9GYWRlID0gdHJ1ZTsKKwkJdGhpcy5oaXN0b3J5LnB1c2godGhpcy52YWx1ZSk7CisJCXRoaXMub25TYXZlKGVlLnZhbHVlLCB0aGlzLnZhbHVlLCB0aGlzLm5hbWUpOworCQl0aGlzLnZhbHVlID0gZWUudmFsdWU7CisJCXRoaXMuZWRpdGFibGUuaW5uZXJIVE1MID0gIiI7CisJCXZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMudmFsdWUpOworCQl0aGlzLmVkaXRhYmxlLmFwcGVuZENoaWxkKHRleHROb2RlKTsKKwl9IGVsc2UgeworCQl0aGlzLmRvRmFkZSA9IGZhbHNlOworCX0KKwl0aGlzLl9maW5pc2hFZGl0KGUpOworfSwgX3N0b3BFZGl0aW5nOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmVkaXRpbmcgPSBmYWxzZTsKKwl0aGlzLmZvcm0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLmVkaXRhYmxlLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwlyZXR1cm4gdHJ1ZTsKK30sIGNhbmNlbEVkaXQ6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLl9zdG9wRWRpdGluZygpOworCXRoaXMub25DYW5jZWwoKTsKKwlyZXR1cm4gdHJ1ZTsKK30sIF9maW5pc2hFZGl0OmZ1bmN0aW9uIChlKSB7CisJdGhpcy5fc3RvcEVkaXRpbmcoKTsKKwlpZiAodGhpcy5kb0ZhZGUpIHsKKwkJZG9qby5sZnguaGlnaGxpZ2h0KHRoaXMuZWRpdGFibGUsIGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoIiNmZmMiKSwgNzAwKS5wbGF5KDMwMCk7CisJfQorCXRoaXMuZG9GYWRlID0gZmFsc2U7Cit9LCBzZXRUZXh0OmZ1bmN0aW9uICh0eHQpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoInNldFRleHQoKSBpcyBkZXByZWNhdGVkLCBjYWxsIHNldFZhbHVlKCkgaW5zdGVhZCwgd2lsbCBiZSByZW1vdmVkIGluIDAuNSIpOworCXRoaXMuc2V0VmFsdWUodHh0KTsKK30sIHNldFZhbHVlOmZ1bmN0aW9uICh0eHQpIHsKKwl0eHQgPSAiIiArIHR4dDsKKwl2YXIgdHQgPSBkb2pvLnN0cmluZy50cmltKHR4dCk7CisJdGhpcy52YWx1ZSA9IHR0OworCXRoaXMuZWRpdGFibGUuaW5uZXJIVE1MID0gdHQ7Cit9LCB1bmRvOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IDApIHsKKwkJdmFyIGN1clZhbHVlID0gdGhpcy52YWx1ZTsKKwkJdmFyIHZhbHVlID0gdGhpcy5oaXN0b3J5LnBvcCgpOworCQl0aGlzLmVkaXRhYmxlLmlubmVySFRNTCA9IHZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMub25VbmRvKHZhbHVlKTsKKwkJdGhpcy5vblNhdmUodmFsdWUsIGN1clZhbHVlLCB0aGlzLm5hbWUpOworCX0KK30sIG9uQ2hhbmdlOmZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHsKK30sIG9uU2F2ZTpmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlLCBuYW1lKSB7Cit9LCBvbkNhbmNlbDpmdW5jdGlvbiAoKSB7Cit9LCBjaGVja0ZvclZhbHVlQ2hhbmdlOmZ1bmN0aW9uICgpIHsKKwl2YXIgZWUgPSB0aGlzW3RoaXMubW9kZS50b0xvd2VyQ2FzZSgpXTsKKwlpZiAoKHRoaXMudmFsdWUgIT0gZWUudmFsdWUpICYmIChkb2pvLnN0cmluZy50cmltKGVlLnZhbHVlKSAhPSAiIikpIHsKKwkJdGhpcy5zdWJtaXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKKwl9CisJdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlLCBlZS52YWx1ZSk7Cit9LCBkaXNhYmxlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CisJdGhpcy5jYW5jZWxCdXR0b24uZGlzYWJsZWQgPSB0cnVlOworCXZhciBlZSA9IHRoaXNbdGhpcy5tb2RlLnRvTG93ZXJDYXNlKCldOworCWVlLmRpc2FibGVkID0gdHJ1ZTsKKwlkb2pvLndpZGdldC5JbmxpbmVFZGl0Qm94LnN1cGVyY2xhc3MuZGlzYWJsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZW5hYmxlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmNoZWNrRm9yVmFsdWVDaGFuZ2UoKTsKKwl0aGlzLmNhbmNlbEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOworCXZhciBlZSA9IHRoaXNbdGhpcy5tb2RlLnRvTG93ZXJDYXNlKCldOworCWVlLmRpc2FibGVkID0gZmFsc2U7CisJZG9qby53aWRnZXQuSW5saW5lRWRpdEJveC5zdXBlcmNsYXNzLmVuYWJsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0ludGVnZXJUZXh0Ym94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9JbnRlZ2VyVGV4dGJveC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQyZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9JbnRlZ2VyVGV4dGJveC5qcwpAQCAtMCwwICsxLDQyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLmNvbW1vbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveCIsIGRvam8ud2lkZ2V0LlZhbGlkYXRpb25UZXh0Ym94LCB7bWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChsb2NhbFByb3BlcnRpZXMsIGZyYWcpIHsKKwlkb2pvLndpZGdldC5JbnRlZ2VyVGV4dGJveC5zdXBlcmNsYXNzLm1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICgobG9jYWxQcm9wZXJ0aWVzLnNpZ25lZCA9PSAidHJ1ZSIpIHx8IChsb2NhbFByb3BlcnRpZXMuc2lnbmVkID09ICJhbHdheXMiKSkgeworCQl0aGlzLmZsYWdzLnNpZ25lZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKChsb2NhbFByb3BlcnRpZXMuc2lnbmVkID09ICJmYWxzZSIpIHx8IChsb2NhbFByb3BlcnRpZXMuc2lnbmVkID09ICJuZXZlciIpKSB7CisJCQl0aGlzLmZsYWdzLnNpZ25lZCA9IGZhbHNlOworCQkJdGhpcy5mbGFncy5taW4gPSAwOworCQl9IGVsc2UgeworCQkJdGhpcy5mbGFncy5zaWduZWQgPSBbdHJ1ZSwgZmFsc2VdOworCQl9CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuc2VwYXJhdG9yKSB7CisJCXRoaXMuZmxhZ3Muc2VwYXJhdG9yID0gbG9jYWxQcm9wZXJ0aWVzLnNlcGFyYXRvcjsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5taW4pIHsKKwkJdGhpcy5mbGFncy5taW4gPSBwYXJzZUludChsb2NhbFByb3BlcnRpZXMubWluKTsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5tYXgpIHsKKwkJdGhpcy5mbGFncy5tYXggPSBwYXJzZUludChsb2NhbFByb3BlcnRpZXMubWF4KTsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc0ludGVnZXIodGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK30sIGlzSW5SYW5nZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNJblJhbmdlKHRoaXMudGV4dGJveC52YWx1ZSwgdGhpcy5mbGFncyk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvSW50ZXJuZXRUZXh0Ym94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9JbnRlcm5ldFRleHRib3guanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwNjBlYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvSW50ZXJuZXRUZXh0Ym94LmpzCkBAIC0wLDAgKzEsNzggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkludGVybmV0VGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnZhbGlkYXRlLndlYiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5JcEFkZHJlc3NUZXh0Ym94IiwgZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3gsIHttaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKGxvY2FsUHJvcGVydGllcykgeworCWRvam8ud2lkZ2V0LklwQWRkcmVzc1RleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93ZG90dGVkZGVjaW1hbCkgeworCQl0aGlzLmZsYWdzLmFsbG93RG90dGVkRGVjaW1hbCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3dkb3R0ZWRkZWNpbWFsID09ICJ0cnVlIik7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuYWxsb3dkb3R0ZWRoZXgpIHsKKwkJdGhpcy5mbGFncy5hbGxvd0RvdHRlZEhleCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3dkb3R0ZWRoZXggPT0gInRydWUiKTsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5hbGxvd2RvdHRlZG9jdGFsKSB7CisJCXRoaXMuZmxhZ3MuYWxsb3dEb3R0ZWRPY3RhbCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3dkb3R0ZWRvY3RhbCA9PSAidHJ1ZSIpOworCX0KKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93ZGVjaW1hbCkgeworCQl0aGlzLmZsYWdzLmFsbG93RGVjaW1hbCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3dkZWNpbWFsID09ICJ0cnVlIik7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuYWxsb3doZXgpIHsKKwkJdGhpcy5mbGFncy5hbGxvd0hleCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3doZXggPT0gInRydWUiKTsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5hbGxvd2lwdjYpIHsKKwkJdGhpcy5mbGFncy5hbGxvd0lQdjYgPSAobG9jYWxQcm9wZXJ0aWVzLmFsbG93aXB2NiA9PSAidHJ1ZSIpOworCX0KKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93aHlicmlkKSB7CisJCXRoaXMuZmxhZ3MuYWxsb3dIeWJyaWQgPSAobG9jYWxQcm9wZXJ0aWVzLmFsbG93aHlicmlkID09ICJ0cnVlIik7CisJfQorfSwgaXNWYWxpZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNJcEFkZHJlc3ModGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVXJsVGV4dGJveCIsIGRvam8ud2lkZ2V0LklwQWRkcmVzc1RleHRib3gsIHttaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKGxvY2FsUHJvcGVydGllcykgeworCWRvam8ud2lkZ2V0LlVybFRleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLnNjaGVtZSkgeworCQl0aGlzLmZsYWdzLnNjaGVtZSA9IChsb2NhbFByb3BlcnRpZXMuc2NoZW1lID09ICJ0cnVlIik7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuYWxsb3dpcCkgeworCQl0aGlzLmZsYWdzLmFsbG93SVAgPSAobG9jYWxQcm9wZXJ0aWVzLmFsbG93aXAgPT0gInRydWUiKTsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5hbGxvd2xvY2FsKSB7CisJCXRoaXMuZmxhZ3MuYWxsb3dMb2NhbCA9IChsb2NhbFByb3BlcnRpZXMuYWxsb3dsb2NhbCA9PSAidHJ1ZSIpOworCX0KKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93Y2MpIHsKKwkJdGhpcy5mbGFncy5hbGxvd0NDID0gKGxvY2FsUHJvcGVydGllcy5hbGxvd2NjID09ICJ0cnVlIik7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuYWxsb3dnZW5lcmljKSB7CisJCXRoaXMuZmxhZ3MuYWxsb3dHZW5lcmljID0gKGxvY2FsUHJvcGVydGllcy5hbGxvd2dlbmVyaWMgPT0gInRydWUiKTsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc1VybCh0aGlzLnRleHRib3gudmFsdWUsIHRoaXMuZmxhZ3MpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FbWFpbFRleHRib3giLCBkb2pvLndpZGdldC5VcmxUZXh0Ym94LCB7bWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChsb2NhbFByb3BlcnRpZXMpIHsKKwlkb2pvLndpZGdldC5FbWFpbFRleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93Y3J1ZnQpIHsKKwkJdGhpcy5mbGFncy5hbGxvd0NydWZ0ID0gKGxvY2FsUHJvcGVydGllcy5hbGxvd2NydWZ0ID09ICJ0cnVlIik7CisJfQorfSwgaXNWYWxpZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8udmFsaWRhdGUuaXNFbWFpbEFkZHJlc3ModGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRW1haWxMaXN0VGV4dGJveCIsIGRvam8ud2lkZ2V0LkVtYWlsVGV4dGJveCwge21peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzKSB7CisJZG9qby53aWRnZXQuRW1haWxMaXN0VGV4dGJveC5zdXBlcmNsYXNzLm1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmIChsb2NhbFByb3BlcnRpZXMubGlzdHNlcGFyYXRvcikgeworCQl0aGlzLmZsYWdzLmxpc3RTZXBhcmF0b3IgPSBsb2NhbFByb3BlcnRpZXMubGlzdHNlcGFyYXRvcjsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc0VtYWlsQWRkcmVzc0xpc3QodGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9MYXlvdXRDb250YWluZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0xheW91dENvbnRhaW5lci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE3MzIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9MYXlvdXRDb250YWluZXIuanMKQEAgLTAsMCArMSwzNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuTGF5b3V0Q29udGFpbmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuTGF5b3V0Q29udGFpbmVyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge2lzQ29udGFpbmVyOnRydWUsIGxheW91dENoaWxkUHJpb3JpdHk6InRvcC1ib3R0b20iLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5odG1sLmxheW91dCh0aGlzLmRvbU5vZGUsIHRoaXMuY2hpbGRyZW4sIHRoaXMubGF5b3V0Q2hpbGRQcmlvcml0eSk7Cit9LCBhZGRDaGlsZDpmdW5jdGlvbiAoY2hpbGQsIG92ZXJyaWRlQ29udGFpbmVyTm9kZSwgcG9zLCByZWYsIGluc2VydEluZGV4KSB7CisJZG9qby53aWRnZXQuTGF5b3V0Q29udGFpbmVyLnN1cGVyY2xhc3MuYWRkQ2hpbGQuY2FsbCh0aGlzLCBjaGlsZCwgb3ZlcnJpZGVDb250YWluZXJOb2RlLCBwb3MsIHJlZiwgaW5zZXJ0SW5kZXgpOworCWRvam8ud2lkZ2V0Lmh0bWwubGF5b3V0KHRoaXMuZG9tTm9kZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5sYXlvdXRDaGlsZFByaW9yaXR5KTsKK30sIHJlbW92ZUNoaWxkOmZ1bmN0aW9uIChwYW5lKSB7CisJZG9qby53aWRnZXQuTGF5b3V0Q29udGFpbmVyLnN1cGVyY2xhc3MucmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLCBwYW5lKTsKKwlkb2pvLndpZGdldC5odG1sLmxheW91dCh0aGlzLmRvbU5vZGUsIHRoaXMuY2hpbGRyZW4sIHRoaXMubGF5b3V0Q2hpbGRQcmlvcml0eSk7Cit9LCBvblJlc2l6ZWQ6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0Lmh0bWwubGF5b3V0KHRoaXMuZG9tTm9kZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5sYXlvdXRDaGlsZFByaW9yaXR5KTsKK30sIHNob3c6ZnVuY3Rpb24gKCkgeworCXRoaXMuZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJdGhpcy5jaGVja1NpemUoKTsKKwl0aGlzLmRvbU5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLmRvbU5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICIiOworCWRvam8ud2lkZ2V0LkxheW91dENvbnRhaW5lci5zdXBlcmNsYXNzLnNob3cuY2FsbCh0aGlzKTsKK319KTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby53aWRnZXQuV2lkZ2V0LCB7bGF5b3V0QWxpZ246Im5vbmUifSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvTGlua1BhbmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0xpbmtQYW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmNhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L0xpbmtQYW5lLmpzCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkxpbmtQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29udGVudFBhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkxpbmtQYW5lIiwgZG9qby53aWRnZXQuQ29udGVudFBhbmUsIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9MaW5rUGFuZVwiPjwvZGl2PiIsIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJdGhpcy5sYWJlbCArPSBzb3VyY2UuaW5uZXJIVE1MOworCXZhciBzb3VyY2UgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCWRvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLCBzb3VyY2UpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L01hbmFnZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L01hbmFnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjY2JiNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvTWFuYWdlci5qcwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuTWFuYWdlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuYXJyYXkiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLndpZGdldC5tYW5hZ2VyID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLndpZGdldHMgPSBbXTsKKwl0aGlzLndpZGdldElkcyA9IFtdOworCXRoaXMudG9wV2lkZ2V0cyA9IHt9OworCXZhciB3aWRnZXRUeXBlQ3RyID0ge307CisJdmFyIHJlbmRlclByZWZpeENhY2hlID0gW107CisJdGhpcy5nZXRVbmlxdWVJZCA9IGZ1bmN0aW9uICh3aWRnZXRUeXBlKSB7CisJCXZhciB3aWRnZXRJZDsKKwkJZG8geworCQkJd2lkZ2V0SWQgPSB3aWRnZXRUeXBlICsgIl8iICsgKHdpZGdldFR5cGVDdHJbd2lkZ2V0VHlwZV0gIT0gdW5kZWZpbmVkID8gKyt3aWRnZXRUeXBlQ3RyW3dpZGdldFR5cGVdIDogd2lkZ2V0VHlwZUN0clt3aWRnZXRUeXBlXSA9IDApOworCQl9IHdoaWxlICh0aGlzLmdldFdpZGdldEJ5SWQod2lkZ2V0SWQpKTsKKwkJcmV0dXJuIHdpZGdldElkOworCX07CisJdGhpcy5hZGQgPSBmdW5jdGlvbiAod2lkZ2V0KSB7CisJCXRoaXMud2lkZ2V0cy5wdXNoKHdpZGdldCk7CisJCWlmICghd2lkZ2V0LmV4dHJhQXJnc1siaWQiXSkgeworCQkJd2lkZ2V0LmV4dHJhQXJnc1siaWQiXSA9IHdpZGdldC5leHRyYUFyZ3NbIklEIl07CisJCX0KKwkJaWYgKHdpZGdldC53aWRnZXRJZCA9PSAiIikgeworCQkJaWYgKHdpZGdldFsiaWQiXSkgeworCQkJCXdpZGdldC53aWRnZXRJZCA9IHdpZGdldFsiaWQiXTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHdpZGdldC5leHRyYUFyZ3NbImlkIl0pIHsKKwkJCQkJd2lkZ2V0LndpZGdldElkID0gd2lkZ2V0LmV4dHJhQXJnc1siaWQiXTsKKwkJCQl9IGVsc2UgeworCQkJCQl3aWRnZXQud2lkZ2V0SWQgPSB0aGlzLmdldFVuaXF1ZUlkKHdpZGdldC5ucyArICJfIiArIHdpZGdldC53aWRnZXRUeXBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHRoaXMud2lkZ2V0SWRzW3dpZGdldC53aWRnZXRJZF0pIHsKKwkJCWRvam8uZGVidWcoIndpZGdldCBJRCBjb2xsaXNpb24gb24gSUQ6ICIgKyB3aWRnZXQud2lkZ2V0SWQpOworCQl9CisJCXRoaXMud2lkZ2V0SWRzW3dpZGdldC53aWRnZXRJZF0gPSB3aWRnZXQ7CisJfTsKKwl0aGlzLmRlc3Ryb3lBbGwgPSBmdW5jdGlvbiAoKSB7CisJCWZvciAodmFyIHggPSB0aGlzLndpZGdldHMubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsKKwkJCXRyeSB7CisJCQkJdGhpcy53aWRnZXRzW3hdLmRlc3Ryb3kodHJ1ZSk7CisJCQkJZGVsZXRlIHRoaXMud2lkZ2V0c1t4XTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0KKwl9OworCXRoaXMucmVtb3ZlID0gZnVuY3Rpb24gKHdpZGdldEluZGV4KSB7CisJCWlmIChkb2pvLmxhbmcuaXNOdW1iZXIod2lkZ2V0SW5kZXgpKSB7CisJCQl2YXIgdHcgPSB0aGlzLndpZGdldHNbd2lkZ2V0SW5kZXhdLndpZGdldElkOworCQkJZGVsZXRlIHRoaXMudG9wV2lkZ2V0c1t0d107CisJCQlkZWxldGUgdGhpcy53aWRnZXRJZHNbdHddOworCQkJdGhpcy53aWRnZXRzLnNwbGljZSh3aWRnZXRJbmRleCwgMSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnJlbW92ZUJ5SWQod2lkZ2V0SW5kZXgpOworCQl9CisJfTsKKwl0aGlzLnJlbW92ZUJ5SWQgPSBmdW5jdGlvbiAoaWQpIHsKKwkJaWYgKCFkb2pvLmxhbmcuaXNTdHJpbmcoaWQpKSB7CisJCQlpZCA9IGlkWyJ3aWRnZXRJZCJdOworCQkJaWYgKCFpZCkgeworCQkJCWRvam8uZGVidWcoImludmFsaWQgd2lkZ2V0IG9yIGlkIHBhc3NlZCB0byByZW1vdmVCeUlkIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy53aWRnZXRzW2ldLndpZGdldElkID09IGlkKSB7CisJCQkJdGhpcy5yZW1vdmUoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9OworCXRoaXMuZ2V0V2lkZ2V0QnlJZCA9IGZ1bmN0aW9uIChpZCkgeworCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGlkKSkgeworCQkJcmV0dXJuIHRoaXMud2lkZ2V0SWRzW2lkXTsKKwkJfQorCQlyZXR1cm4gaWQ7CisJfTsKKwl0aGlzLmdldFdpZGdldHNCeVR5cGUgPSBmdW5jdGlvbiAodHlwZSkgeworCQl2YXIgbHQgPSB0eXBlLnRvTG93ZXJDYXNlKCk7CisJCXZhciBnZXRUeXBlID0gKHR5cGUuaW5kZXhPZigiOiIpIDwgMCA/IGZ1bmN0aW9uICh4KSB7CisJCQlyZXR1cm4geC53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCk7CisJCX0gOiBmdW5jdGlvbiAoeCkgeworCQkJcmV0dXJuIHguZ2V0TmFtZXNwYWNlZFR5cGUoKTsKKwkJfSk7CisJCXZhciByZXQgPSBbXTsKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy53aWRnZXRzLCBmdW5jdGlvbiAoeCkgeworCQkJaWYgKGdldFR5cGUoeCkgPT0gbHQpIHsKKwkJCQlyZXQucHVzaCh4KTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiByZXQ7CisJfTsKKwl0aGlzLmdldFdpZGdldHNCeUZpbHRlciA9IGZ1bmN0aW9uICh1bmFyeUZ1bmMsIG9ubHlPbmUpIHsKKwkJdmFyIHJldCA9IFtdOworCQlkb2pvLmxhbmcuZXZlcnkodGhpcy53aWRnZXRzLCBmdW5jdGlvbiAoeCkgeworCQkJaWYgKHVuYXJ5RnVuYyh4KSkgeworCQkJCXJldC5wdXNoKHgpOworCQkJCWlmIChvbmx5T25lKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSk7CisJCXJldHVybiAob25seU9uZSA/IHJldFswXSA6IHJldCk7CisJfTsKKwl0aGlzLmdldEFsbFdpZGdldHMgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiB0aGlzLndpZGdldHMuY29uY2F0KCk7CisJfTsKKwl0aGlzLmdldFdpZGdldEJ5Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciB3ID0gdGhpcy5nZXRBbGxXaWRnZXRzKCk7CisJCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHdbaV0uZG9tTm9kZSA9PSBub2RlKSB7CisJCQkJcmV0dXJuIHdbaV07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfTsKKwl0aGlzLmJ5SWQgPSB0aGlzLmdldFdpZGdldEJ5SWQ7CisJdGhpcy5ieVR5cGUgPSB0aGlzLmdldFdpZGdldHNCeVR5cGU7CisJdGhpcy5ieUZpbHRlciA9IHRoaXMuZ2V0V2lkZ2V0c0J5RmlsdGVyOworCXRoaXMuYnlOb2RlID0gdGhpcy5nZXRXaWRnZXRCeU5vZGU7CisJdmFyIGtub3duV2lkZ2V0SW1wbGVtZW50YXRpb25zID0ge307CisJdmFyIHdpZGdldFBhY2thZ2VzID0gWyJkb2pvLndpZGdldCJdOworCWZvciAodmFyIGkgPSAwOyBpIDwgd2lkZ2V0UGFja2FnZXMubGVuZ3RoOyBpKyspIHsKKwkJd2lkZ2V0UGFja2FnZXNbd2lkZ2V0UGFja2FnZXNbaV1dID0gdHJ1ZTsKKwl9CisJdGhpcy5yZWdpc3RlcldpZGdldFBhY2thZ2UgPSBmdW5jdGlvbiAocG5hbWUpIHsKKwkJaWYgKCF3aWRnZXRQYWNrYWdlc1twbmFtZV0pIHsKKwkJCXdpZGdldFBhY2thZ2VzW3BuYW1lXSA9IHRydWU7CisJCQl3aWRnZXRQYWNrYWdlcy5wdXNoKHBuYW1lKTsKKwkJfQorCX07CisJdGhpcy5nZXRXaWRnZXRQYWNrYWdlTGlzdCA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIGRvam8ubGFuZy5tYXAod2lkZ2V0UGFja2FnZXMsIGZ1bmN0aW9uIChlbHQpIHsKKwkJCXJldHVybiAoZWx0ICE9PSB0cnVlID8gZWx0IDogdW5kZWZpbmVkKTsKKwkJfSk7CisJfTsKKwl0aGlzLmdldEltcGxlbWVudGF0aW9uID0gZnVuY3Rpb24gKHdpZGdldE5hbWUsIGN0b3JPYmplY3QsIG1peGlucywgbnMpIHsKKwkJdmFyIGltcGwgPSB0aGlzLmdldEltcGxlbWVudGF0aW9uTmFtZSh3aWRnZXROYW1lLCBucyk7CisJCWlmIChpbXBsKSB7CisJCQl2YXIgcmV0ID0gY3Rvck9iamVjdCA/IG5ldyBpbXBsKGN0b3JPYmplY3QpIDogbmV3IGltcGwoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9OworCWZ1bmN0aW9uIGJ1aWxkUHJlZml4Q2FjaGUoKSB7CisJCWZvciAodmFyIHJlbmRlcmVyIGluIGRvam8ucmVuZGVyKSB7CisJCQlpZiAoZG9qby5yZW5kZXJbcmVuZGVyZXJdWyJjYXBhYmxlIl0gPT09IHRydWUpIHsKKwkJCQl2YXIgcHJlZml4ZXMgPSBkb2pvLnJlbmRlcltyZW5kZXJlcl0ucHJlZml4ZXM7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgeworCQkJCQlyZW5kZXJQcmVmaXhDYWNoZS5wdXNoKHByZWZpeGVzW2ldLnRvTG93ZXJDYXNlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl2YXIgZmluZEltcGxlbWVudGF0aW9uSW5Nb2R1bGUgPSBmdW5jdGlvbiAobG93ZXJDYXNlV2lkZ2V0TmFtZSwgbW9kdWxlKSB7CisJCWlmICghbW9kdWxlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKHZhciBpID0gMCwgbCA9IHJlbmRlclByZWZpeENhY2hlLmxlbmd0aCwgd2lkZ2V0TW9kdWxlOyBpIDw9IGw7IGkrKykgeworCQkJd2lkZ2V0TW9kdWxlID0gKGkgPCBsID8gbW9kdWxlW3JlbmRlclByZWZpeENhY2hlW2ldXSA6IG1vZHVsZSk7CisJCQlpZiAoIXdpZGdldE1vZHVsZSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yICh2YXIgbmFtZSBpbiB3aWRnZXRNb2R1bGUpIHsKKwkJCQlpZiAobmFtZS50b0xvd2VyQ2FzZSgpID09IGxvd2VyQ2FzZVdpZGdldE5hbWUpIHsKKwkJCQkJcmV0dXJuIHdpZGdldE1vZHVsZVtuYW1lXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfTsKKwl2YXIgZmluZEltcGxlbWVudGF0aW9uID0gZnVuY3Rpb24gKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG1vZHVsZU5hbWUpIHsKKwkJdmFyIG1vZHVsZSA9IGRvam8uZXZhbE9ialBhdGgobW9kdWxlTmFtZSwgZmFsc2UpOworCQlyZXR1cm4gKG1vZHVsZSA/IGZpbmRJbXBsZW1lbnRhdGlvbkluTW9kdWxlKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG1vZHVsZSkgOiBudWxsKTsKKwl9OworCXRoaXMuZ2V0SW1wbGVtZW50YXRpb25OYW1lID0gZnVuY3Rpb24gKHdpZGdldE5hbWUsIG5zKSB7CisJCXZhciBsb3dlckNhc2VXaWRnZXROYW1lID0gd2lkZ2V0TmFtZS50b0xvd2VyQ2FzZSgpOworCQlucyA9IG5zIHx8ICJkb2pvIjsKKwkJdmFyIGltcHMgPSBrbm93bldpZGdldEltcGxlbWVudGF0aW9uc1tuc10gfHwgKGtub3duV2lkZ2V0SW1wbGVtZW50YXRpb25zW25zXSA9IHt9KTsKKwkJdmFyIGltcGwgPSBpbXBzW2xvd2VyQ2FzZVdpZGdldE5hbWVdOworCQlpZiAoaW1wbCkgeworCQkJcmV0dXJuIGltcGw7CisJCX0KKwkJaWYgKCFyZW5kZXJQcmVmaXhDYWNoZS5sZW5ndGgpIHsKKwkJCWJ1aWxkUHJlZml4Q2FjaGUoKTsKKwkJfQorCQl2YXIgbnNPYmogPSBkb2pvLm5zLmdldChucyk7CisJCWlmICghbnNPYmopIHsKKwkJCWRvam8ubnMucmVnaXN0ZXIobnMsIG5zICsgIi53aWRnZXQiKTsKKwkJCW5zT2JqID0gZG9qby5ucy5nZXQobnMpOworCQl9CisJCWlmIChuc09iaikgeworCQkJbnNPYmoucmVzb2x2ZSh3aWRnZXROYW1lKTsKKwkJfQorCQlpbXBsID0gZmluZEltcGxlbWVudGF0aW9uKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG5zT2JqLm1vZHVsZSk7CisJCWlmIChpbXBsKSB7CisJCQlyZXR1cm4gKGltcHNbbG93ZXJDYXNlV2lkZ2V0TmFtZV0gPSBpbXBsKTsKKwkJfQorCQluc09iaiA9IGRvam8ubnMucmVxdWlyZShucyk7CisJCWlmICgobnNPYmopICYmIChuc09iai5yZXNvbHZlcikpIHsKKwkJCW5zT2JqLnJlc29sdmUod2lkZ2V0TmFtZSk7CisJCQlpbXBsID0gZmluZEltcGxlbWVudGF0aW9uKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG5zT2JqLm1vZHVsZSk7CisJCQlpZiAoaW1wbCkgeworCQkJCXJldHVybiAoaW1wc1tsb3dlckNhc2VXaWRnZXROYW1lXSA9IGltcGwpOworCQkJfQorCQl9CisJCWRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuTWFuYWdlci5nZXRJbXBsZW1lbnRhdGlvbk5hbWUiLCAiQ291bGQgbm90IGxvY2F0ZSB3aWRnZXQgaW1wbGVtZW50YXRpb24gZm9yIFwiIiArIHdpZGdldE5hbWUgKyAiXCIgaW4gXCIiICsgbnNPYmoubW9kdWxlICsgIlwiIHJlZ2lzdGVyZWQgdG8gbmFtZXNwYWNlIFwiIiArIG5zT2JqLm5hbWUgKyAiXCIuICIgKyAiRGV2ZWxvcGVycyBtdXN0IHNwZWNpZnkgY29ycmVjdCBuYW1lc3BhY2VzIGZvciBhbGwgbm9uLURvam8gd2lkZ2V0cyIsICIwLjUiKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB3aWRnZXRQYWNrYWdlcy5sZW5ndGg7IGkrKykgeworCQkJaW1wbCA9IGZpbmRJbXBsZW1lbnRhdGlvbihsb3dlckNhc2VXaWRnZXROYW1lLCB3aWRnZXRQYWNrYWdlc1tpXSk7CisJCQlpZiAoaW1wbCkgeworCQkJCXJldHVybiAoaW1wc1tsb3dlckNhc2VXaWRnZXROYW1lXSA9IGltcGwpOworCQkJfQorCQl9CisJCXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGxvY2F0ZSB3aWRnZXQgaW1wbGVtZW50YXRpb24gZm9yIFwiIiArIHdpZGdldE5hbWUgKyAiXCIgaW4gXCIiICsgbnNPYmoubW9kdWxlICsgIlwiIHJlZ2lzdGVyZWQgdG8gbmFtZXNwYWNlIFwiIiArIG5zT2JqLm5hbWUgKyAiXCIiKTsKKwl9OworCXRoaXMucmVzaXppbmcgPSBmYWxzZTsKKwl0aGlzLm9uV2luZG93UmVzaXplZCA9IGZ1bmN0aW9uICgpIHsKKwkJaWYgKHRoaXMucmVzaXppbmcpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0cnkgeworCQkJdGhpcy5yZXNpemluZyA9IHRydWU7CisJCQlmb3IgKHZhciBpZCBpbiB0aGlzLnRvcFdpZGdldHMpIHsKKwkJCQl2YXIgY2hpbGQgPSB0aGlzLnRvcFdpZGdldHNbaWRdOworCQkJCWlmIChjaGlsZC5jaGVja1NpemUpIHsKKwkJCQkJY2hpbGQuY2hlY2tTaXplKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJZmluYWxseSB7CisJCQl0aGlzLnJlc2l6aW5nID0gZmFsc2U7CisJCX0KKwl9OworCWlmICh0eXBlb2Ygd2luZG93ICE9ICJ1bmRlZmluZWQiKSB7CisJCWRvam8uYWRkT25Mb2FkKHRoaXMsICJvbldpbmRvd1Jlc2l6ZWQiKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHdpbmRvdywgIm9ucmVzaXplIiwgdGhpcywgIm9uV2luZG93UmVzaXplZCIpOworCX0KK307CisoZnVuY3Rpb24gKCkgeworCXZhciBkdyA9IGRvam8ud2lkZ2V0OworCXZhciBkd20gPSBkdy5tYW5hZ2VyOworCXZhciBoID0gZG9qby5sYW5nLmN1cnJ5KGRvam8ubGFuZywgImhpdGNoIiwgZHdtKTsKKwl2YXIgZyA9IGZ1bmN0aW9uIChvbGROYW1lLCBuZXdOYW1lKSB7CisJCWR3WyhuZXdOYW1lIHx8IG9sZE5hbWUpXSA9IGgob2xkTmFtZSk7CisJfTsKKwlnKCJhZGQiLCAiYWRkV2lkZ2V0Iik7CisJZygiZGVzdHJveUFsbCIsICJkZXN0cm95QWxsV2lkZ2V0cyIpOworCWcoInJlbW92ZSIsICJyZW1vdmVXaWRnZXQiKTsKKwlnKCJyZW1vdmVCeUlkIiwgInJlbW92ZVdpZGdldEJ5SWQiKTsKKwlnKCJnZXRXaWRnZXRCeUlkIik7CisJZygiZ2V0V2lkZ2V0QnlJZCIsICJieUlkIik7CisJZygiZ2V0V2lkZ2V0c0J5VHlwZSIpOworCWcoImdldFdpZGdldHNCeUZpbHRlciIpOworCWcoImdldFdpZGdldHNCeVR5cGUiLCAiYnlUeXBlIik7CisJZygiZ2V0V2lkZ2V0c0J5RmlsdGVyIiwgImJ5RmlsdGVyIik7CisJZygiZ2V0V2lkZ2V0QnlOb2RlIiwgImJ5Tm9kZSIpOworCWR3LmFsbCA9IGZ1bmN0aW9uIChuKSB7CisJCXZhciB3aWRnZXRzID0gZHdtLmdldEFsbFdpZGdldHMuYXBwbHkoZHdtLCBhcmd1bWVudHMpOworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHsKKwkJCXJldHVybiB3aWRnZXRzW25dOworCQl9CisJCXJldHVybiB3aWRnZXRzOworCX07CisJZygicmVnaXN0ZXJXaWRnZXRQYWNrYWdlIik7CisJZygiZ2V0SW1wbGVtZW50YXRpb24iLCAiZ2V0V2lkZ2V0SW1wbGVtZW50YXRpb24iKTsKKwlnKCJnZXRJbXBsZW1lbnRhdGlvbk5hbWUiLCAiZ2V0V2lkZ2V0SW1wbGVtZW50YXRpb25OYW1lIik7CisJZHcud2lkZ2V0cyA9IGR3bS53aWRnZXRzOworCWR3LndpZGdldElkcyA9IGR3bS53aWRnZXRJZHM7CisJZHcucm9vdCA9IGR3bS5yb290OworfSkoKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9NZW51Mi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvTWVudTIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NmEwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvTWVudTIuanMKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lk1lbnUyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0Lk1lbnVCYXNlIiwgbnVsbCwgZnVuY3Rpb24gKCkgeworCXRoaXMuZXZlbnROYW1lcyA9IHtvcGVuOiIifTsKK30sIHtpc0NvbnRhaW5lcjp0cnVlLCBpc01lbnU6dHJ1ZSwgZXZlbnROYW1pbmc6ImRlZmF1bHQiLCB0ZW1wbGF0ZUNzc1N0cmluZzoiXG4uZG9qb1BvcHVwTWVudTIge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGJvcmRlcjogMXB4IHNvbGlkICM3Mjk4ZDA7XG5cdGJhY2tncm91bmQ6Izg1YWVlYyB1cmwoaW1hZ2VzL3NvcmlhTWVudUJnLmdpZikgcmVwZWF0LXggYm90dG9tIGxlZnQgIWltcG9ydGFudDtcblx0cGFkZGluZzogMXB4O1xuXHRtYXJnaW4tdG9wOiAxcHg7XG5cdG1hcmdpbi1ib3R0b206IDFweDtcbn1cblxuLmRvam9NZW51SXRlbTJ7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdGZvbnQ6IG1lbnU7XG5cdG1hcmdpbjogMDtcbn1cblxuLmRvam9NZW51SXRlbTJIb3ZlciB7XG5cdGJhY2tncm91bmQtY29sb3I6ICNEMkU0RkQ7XG5cdGN1cnNvcjpwb2ludGVyO1xuXHRjdXJzb3I6aGFuZDtcbn1cblxuLmRvam9NZW51SXRlbTJJY29uIHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xuXHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHR3aWR0aDogMTZweDtcblx0aGVpZ2h0OiAxNnB4O1xuXHRwYWRkaW5nLXJpZ2h0OiAzcHg7XG59XG5cbi5kb2pvTWVudUl0ZW0yTGFiZWwge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8qIG1haW4gbGFiZWwgdGV4dCAqL1xuLmRvam9NZW51SXRlbTJMYWJlbCB7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRvam9NZW51SXRlbTJBY2NlbCB7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0cGFkZGluZy1sZWZ0OiAzcHg7XG59XG5cbi5kb2pvTWVudUl0ZW0yRGlzYWJsZWQgLmRvam9NZW51SXRlbTJMYWJlbCxcbi5kb2pvTWVudUl0ZW0yRGlzYWJsZWQgLmRvam9NZW51SXRlbTJBY2NlbCB7XG5cdGNvbG9yOiAjNjA3YTllO1xufVxuXG4uZG9qb01lbnVJdGVtMlN1Ym1lbnUge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG5cdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvc3VibWVudV9vZmYuZ2lmKTtcblx0d2lkdGg6IDVweDtcblx0aGVpZ2h0OiA5cHg7XG5cdHBhZGRpbmctbGVmdDogM3B4O1xufVxuLmRvam9NZW51SXRlbTJIb3ZlciAuZG9qb01lbnVJdGVtMlN1Ym1lbnUge1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3N1Ym1lbnVfb24uZ2lmKTtcbn1cblxuLmRvam9NZW51SXRlbTJEaXNhYmxlZCAuZG9qb01lbnVJdGVtMlN1Ym1lbnUge1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3N1Ym1lbnVfZGlzYWJsZWQuZ2lmKTtcbn1cblxuLmRvam9NZW51U2VwYXJhdG9yMiB7XG5cdGZvbnQtc2l6ZTogMXB4O1xuXHRtYXJnaW46IDA7XG59XG5cbi5kb2pvTWVudVNlcGFyYXRvcjJUb3Age1xuXHRoZWlnaHQ6IDUwJTtcblx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3YTk4YzQ7XG5cdG1hcmdpbjogMHB4IDJweDtcblx0Zm9udC1zaXplOiAxcHg7XG59XG5cbi5kb2pvTWVudVNlcGFyYXRvcjJCb3R0b20ge1xuXHRoZWlnaHQ6IDUwJTtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNjOWRlZmY7XG5cdG1hcmdpbjogMHB4IDJweDtcblx0Zm9udC1zaXplOiAxcHg7XG59XG5cbi5kb2pvTWVudUJhcjIge1xuXHRiYWNrZ3JvdW5kOiM4NWFlZWMgdXJsKGltYWdlcy9zb3JpYUJhckJnLmdpZikgcmVwZWF0LXggdG9wIGxlZnQ7XG5cdC8qYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOWZlYzsqL1xuXHRwYWRkaW5nOiAxcHg7XG59XG5cbi5kb2pvTWVudUJhcjIgLmRvam9NZW51SXRlbTIge1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRmb250OiBtZW51O1xuXHRtYXJnaW46IDA7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0ei1pbmRleDogMTtcblx0cGFkZGluZzogM3B4IDhweDtcblx0ZGlzcGxheTogaW5saW5lOy8qIG5lZWRlZCBpbiBraHRtbCB0byBkaXNwbGF5IGNvcnJlY3RseSAqL1xuXHRkaXNwbGF5OiAtbW96LWlubGluZS1ib3g7LyogbmVlZGVkIGluIGZpcmVmb3ggKi9cblx0Y3Vyc29yOnBvaW50ZXI7XG5cdGN1cnNvcjpoYW5kO1xufVxuXG4uZG9qb01lbnVCYXIyIC5kb2pvTWVudUl0ZW0ySG92ZXIge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiNkMmU0ZmQ7XG59XG5cbi5kb2pvTWVudUJhcjIgLmRvam9NZW51SXRlbTJEaXNhYmxlZCBzcGFuIHtcblx0Y29sb3I6ICM0ZjY1ODI7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvTWVudTIuY3NzIiksIHN1Ym1lbnVEZWxheTo1MDAsIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwlpZiAodGhpcy5ldmVudE5hbWluZyA9PSAiZGVmYXVsdCIpIHsKKwkJZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMuZXZlbnROYW1lcykgeworCQkJdGhpcy5ldmVudE5hbWVzW2V2ZW50TmFtZV0gPSB0aGlzLndpZGdldElkICsgIi8iICsgZXZlbnROYW1lOworCQl9CisJfQorfSwgX21vdmVUb05leHQ6ZnVuY3Rpb24gKGV2dCkgeworCXRoaXMuX2hpZ2hsaWdodE9wdGlvbigxKTsKKwlyZXR1cm4gdHJ1ZTsKK30sIF9tb3ZlVG9QcmV2aW91czpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5faGlnaGxpZ2h0T3B0aW9uKC0xKTsKKwlyZXR1cm4gdHJ1ZTsKK30sIF9tb3ZlVG9QYXJlbnRNZW51OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uICYmIHRoaXMucGFyZW50TWVudSkgeworCQlpZiAoZXZ0Ll9tZW51MlVwS2V5UHJvY2Vzc2VkKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5vblVuaG92ZXIoKTsKKwkJCXRoaXMuY2xvc2VTdWJtZW51KCk7CisJCQlldnQuX21lbnUyVXBLZXlQcm9jZXNzZWQgPSB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30sIF9tb3ZlVG9DaGlsZE1lbnU6ZnVuY3Rpb24gKGV2dCkgeworCWlmICh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24gJiYgdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLnN1Ym1lbnVJZCkgeworCQl0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24uX29uQ2xpY2sodHJ1ZSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBfc2VsZWN0Q3VycmVudEl0ZW06ZnVuY3Rpb24gKGV2dCkgeworCWlmICh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pIHsKKwkJdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLl9vbkNsaWNrKCk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBwcm9jZXNzS2V5OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSB8fCAhZXZ0LmtleSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBydmFsID0gZmFsc2U7CisJc3dpdGNoIChldnQua2V5KSB7CisJICBjYXNlIGV2dC5LRVlfRE9XTl9BUlJPVzoKKwkJcnZhbCA9IHRoaXMuX21vdmVUb05leHQoZXZ0KTsKKwkJYnJlYWs7CisJICBjYXNlIGV2dC5LRVlfVVBfQVJST1c6CisJCXJ2YWwgPSB0aGlzLl9tb3ZlVG9QcmV2aW91cyhldnQpOworCQlicmVhazsKKwkgIGNhc2UgZXZ0LktFWV9SSUdIVF9BUlJPVzoKKwkJcnZhbCA9IHRoaXMuX21vdmVUb0NoaWxkTWVudShldnQpOworCQlicmVhazsKKwkgIGNhc2UgZXZ0LktFWV9MRUZUX0FSUk9XOgorCQlydmFsID0gdGhpcy5fbW92ZVRvUGFyZW50TWVudShldnQpOworCQlicmVhazsKKwkgIGNhc2UgIiAiOgorCSAgY2FzZSBldnQuS0VZX0VOVEVSOgorCQlpZiAocnZhbCA9IHRoaXMuX3NlbGVjdEN1cnJlbnRJdGVtKGV2dCkpIHsKKwkJCWJyZWFrOworCQl9CisJICBjYXNlIGV2dC5LRVlfRVNDQVBFOgorCSAgY2FzZSBldnQuS0VZX1RBQjoKKwkJdGhpcy5jbG9zZSh0cnVlKTsKKwkJcnZhbCA9IHRydWU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcnZhbDsKK30sIF9maW5kVmFsaWRJdGVtOmZ1bmN0aW9uIChkaXIsIGN1ckl0ZW0pIHsKKwlpZiAoY3VySXRlbSkgeworCQljdXJJdGVtID0gZGlyID4gMCA/IGN1ckl0ZW0uZ2V0TmV4dFNpYmxpbmcoKSA6IGN1ckl0ZW0uZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgeworCQlpZiAoIWN1ckl0ZW0pIHsKKwkJCWN1ckl0ZW0gPSBkaXIgPiAwID8gdGhpcy5jaGlsZHJlblswXSA6IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTsKKwkJfQorCQlpZiAoY3VySXRlbS5vbkhvdmVyICYmIGN1ckl0ZW0uaXNTaG93aW5nKCkpIHsKKwkJCXJldHVybiBjdXJJdGVtOworCQl9CisJCWN1ckl0ZW0gPSBkaXIgPiAwID8gY3VySXRlbS5nZXROZXh0U2libGluZygpIDogY3VySXRlbS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKKwl9Cit9LCBfaGlnaGxpZ2h0T3B0aW9uOmZ1bmN0aW9uIChkaXIpIHsKKwl2YXIgaXRlbTsKKwlpZiAoKCF0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pKSB7CisJCWl0ZW0gPSB0aGlzLl9maW5kVmFsaWRJdGVtKGRpcik7CisJfSBlbHNlIHsKKwkJaXRlbSA9IHRoaXMuX2ZpbmRWYWxpZEl0ZW0oZGlyLCB0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pOworCX0KKwlpZiAoaXRlbSkgeworCQlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKSB7CisJCQl0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24ub25VbmhvdmVyKCk7CisJCX0KKwkJaXRlbS5vbkhvdmVyKCk7CisJCWRvam8uaHRtbC5zY3JvbGxJbnRvVmlldyhpdGVtLmRvbU5vZGUpOworCQl0cnkgeworCQkJdmFyIG5vZGUgPSBkb2pvLmh0bWwuZ2V0RWxlbWVudHNCeUNsYXNzKCJkb2pvTWVudUl0ZW0yTGFiZWwiLCBpdGVtLmRvbU5vZGUpWzBdOworCQkJbm9kZS5mb2N1cygpOworCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwl9Cit9LCBvbkl0ZW1DbGljazpmdW5jdGlvbiAoaXRlbSkgeworfSwgY2xvc2VTdWJtZW51OmZ1bmN0aW9uIChmb3JjZSkgeworCWlmICh0aGlzLmN1cnJlbnRTdWJtZW51ID09IG51bGwpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmN1cnJlbnRTdWJtZW51LmNsb3NlKGZvcmNlKTsKKwl0aGlzLmN1cnJlbnRTdWJtZW51ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRTdWJtZW51VHJpZ2dlci5pc19vcGVuID0gZmFsc2U7CisJdGhpcy5jdXJyZW50U3VibWVudVRyaWdnZXIuX2Nsb3NlZFN1Ym1lbnUoZm9yY2UpOworCXRoaXMuY3VycmVudFN1Ym1lbnVUcmlnZ2VyID0gbnVsbDsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuUG9wdXBNZW51MiIsIFtkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UsIGRvam8ud2lkZ2V0Lk1lbnVCYXNlXSwgZnVuY3Rpb24gKCkgeworCXRoaXMudGFyZ2V0Tm9kZUlkcyA9IFtdOworfSwge3RlbXBsYXRlU3RyaW5nOiI8dGFibGUgY2xhc3M9XCJkb2pvUG9wdXBNZW51MlwiIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBhYnNvbHV0ZTtcIj4iICsgIjx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCI+PC90Ym9keT4iICsgIjwvdGFibGU+Iiwgc3VibWVudU92ZXJsYXA6NSwgY29udGV4dE1lbnVGb3JXaW5kb3c6ZmFsc2UsIHBhcmVudE1lbnU6bnVsbCwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuY29udGV4dE1lbnVGb3JXaW5kb3cpIHsKKwkJdmFyIGRvYyA9IGRvam8uYm9keSgpOworCQl0aGlzLmJpbmREb21Ob2RlKGRvYyk7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMudGFyZ2V0Tm9kZUlkcy5sZW5ndGggPiAwKSB7CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnRhcmdldE5vZGVJZHMsIHRoaXMuYmluZERvbU5vZGUsIHRoaXMpOworCQl9CisJfQorCXRoaXMuX3N1YnNjcmliZVN1Yml0ZW1zT25PcGVuKCk7Cit9LCBfc3Vic2NyaWJlU3ViaXRlbXNPbk9wZW46ZnVuY3Rpb24gKCkgeworCXZhciBzdWJJdGVtcyA9IHRoaXMuZ2V0Q2hpbGRyZW5PZlR5cGUoZG9qby53aWRnZXQuTWVudUl0ZW0yKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHN1Ykl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuZXZlbnROYW1lcy5vcGVuLCBzdWJJdGVtc1tpXSwgIm1lbnVPcGVuIik7CisJfQorfSwgZ2V0VG9wT3BlbkV2ZW50OmZ1bmN0aW9uICgpIHsKKwl2YXIgbWVudSA9IHRoaXM7CisJd2hpbGUgKG1lbnUucGFyZW50TWVudSkgeworCQltZW51ID0gbWVudS5wYXJlbnRNZW51OworCX0KKwlyZXR1cm4gbWVudS5vcGVuRXZlbnQ7Cit9LCBiaW5kRG9tTm9kZTpmdW5jdGlvbiAobm9kZSkgeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpbiA9IGRvam8uaHRtbC5nZXRFbGVtZW50V2luZG93KG5vZGUpOworCWlmIChkb2pvLmh0bWwuaXNUYWcobm9kZSwgImlmcmFtZSIpID09ICJpZnJhbWUiKSB7CisJCXdpbiA9IGRvam8uaHRtbC5pZnJhbWVDb250ZW50V2luZG93KG5vZGUpOworCQlub2RlID0gZG9qby53aXRoR2xvYmFsKHdpbiwgZG9qby5ib2R5KTsKKwl9CisJZG9qby53aWRnZXQuTWVudTIuT3BlcmFBbmRLb25xRml4ZXIuZml4Tm9kZShub2RlKTsKKwlkb2pvLmV2ZW50Lmt3Q29ubmVjdCh7c3JjT2JqOm5vZGUsIHNyY0Z1bmM6Im9uY29udGV4dG1lbnUiLCB0YXJnZXRPYmo6dGhpcywgdGFyZ2V0RnVuYzoib25PcGVuIiwgb25jZTp0cnVlfSk7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96ICYmIHdpbi5kb2N1bWVudC5kZXNpZ25Nb2RlLnRvTG93ZXJDYXNlKCkgPT0gIm9uIikgeworCQlkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIobm9kZSwgImNvbnRleHRtZW51IiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvbk9wZW4iKSk7CisJfQorCWRvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5yZWdpc3Rlcldpbih3aW4pOworfSwgdW5CaW5kRG9tTm9kZTpmdW5jdGlvbiAobm9kZU5hbWUpIHsKKwl2YXIgbm9kZSA9IGRvam8uYnlJZChub2RlTmFtZSk7CisJZG9qby5ldmVudC5rd0Rpc2Nvbm5lY3Qoe3NyY09iajpub2RlLCBzcmNGdW5jOiJvbmNvbnRleHRtZW51IiwgdGFyZ2V0T2JqOnRoaXMsIHRhcmdldEZ1bmM6Im9uT3BlbiIsIG9uY2U6dHJ1ZX0pOworCWRvam8ud2lkZ2V0Lk1lbnUyLk9wZXJhQW5kS29ucUZpeGVyLmNsZWFuTm9kZShub2RlKTsKK30sIF9vcGVuQXNTdWJtZW51OmZ1bmN0aW9uIChwYXJlbnQsIGV4cGxvZGVTcmMsIG9yaWVudCkgeworCWlmICh0aGlzLmlzU2hvd2luZ05vdykgeworCQlyZXR1cm47CisJfQorCXRoaXMucGFyZW50TWVudSA9IHBhcmVudDsKKwl0aGlzLm9wZW4oZXhwbG9kZVNyYywgcGFyZW50LCBleHBsb2RlU3JjLCBvcmllbnQpOworfSwgY2xvc2U6ZnVuY3Rpb24gKGZvcmNlKSB7CisJaWYgKHRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcykgeworCQlkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UucHJvdG90eXBlLmNsb3NlLmNhbGwodGhpcywgZm9yY2UpOworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pIHsKKwkJdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm9uVW5ob3ZlcigpOworCX0KKwlkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UucHJvdG90eXBlLmNsb3NlLmNhbGwodGhpcywgZm9yY2UpOworCXRoaXMucGFyZW50TWVudSA9IG51bGw7Cit9LCBjbG9zZUFsbDpmdW5jdGlvbiAoZm9yY2UpIHsKKwlpZiAodGhpcy5wYXJlbnRNZW51KSB7CisJCXRoaXMucGFyZW50TWVudS5jbG9zZUFsbChmb3JjZSk7CisJfSBlbHNlIHsKKwkJdGhpcy5jbG9zZShmb3JjZSk7CisJfQorfSwgX29wZW5TdWJtZW51OmZ1bmN0aW9uIChzdWJtZW51LCBmcm9tX2l0ZW0pIHsKKwlzdWJtZW51Ll9vcGVuQXNTdWJtZW51KHRoaXMsIGZyb21faXRlbS5hcnJvdywgeyJUUiI6IlRMIiwgIlRMIjoiVFIifSk7CisJdGhpcy5jdXJyZW50U3VibWVudSA9IHN1Ym1lbnU7CisJdGhpcy5jdXJyZW50U3VibWVudVRyaWdnZXIgPSBmcm9tX2l0ZW07CisJdGhpcy5jdXJyZW50U3VibWVudVRyaWdnZXIuaXNfb3BlbiA9IHRydWU7Cit9LCBmb2N1czpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuY3VycmVudFN1Ym1lbnVUcmlnZ2VyKSB7CisJCWlmICh0aGlzLmN1cnJlbnRTdWJtZW51VHJpZ2dlci5jYXB0aW9uKSB7CisJCQl0cnkgeworCQkJCXRoaXMuY3VycmVudFN1Ym1lbnVUcmlnZ2VyLmNhcHRpb24uZm9jdXMoKTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCXRoaXMuY3VycmVudFN1Ym1lbnVUcmlnZ2VyLmRvbU5vZGUuZm9jdXMoKTsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQl9CisJCX0KKwl9Cit9LCBvbk9wZW46ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLm9wZW5FdmVudCA9IGU7CisJaWYgKGVbInRhcmdldCJdKSB7CisJCXRoaXMub3BlbmVkRm9yV2luZG93ID0gZG9qby5odG1sLmdldEVsZW1lbnRXaW5kb3coZS50YXJnZXQpOworCX0gZWxzZSB7CisJCXRoaXMub3BlbmVkRm9yV2luZG93ID0gbnVsbDsKKwl9CisJdmFyIHggPSBlLnBhZ2VYLCB5ID0gZS5wYWdlWTsKKwl2YXIgd2luID0gZG9qby5odG1sLmdldEVsZW1lbnRXaW5kb3coZS50YXJnZXQpOworCXZhciBpZnJhbWUgPSB3aW4uX2ZyYW1lRWxlbWVudCB8fCB3aW4uZnJhbWVFbGVtZW50OworCWlmIChpZnJhbWUpIHsKKwkJdmFyIGNvb2QgPSBkb2pvLmh0bWwuYWJzKGlmcmFtZSwgdHJ1ZSk7CisJCXggKz0gY29vZC54IC0gZG9qby53aXRoR2xvYmFsKHdpbiwgZG9qby5odG1sLmdldFNjcm9sbCkubGVmdDsKKwkJeSArPSBjb29kLnkgLSBkb2pvLndpdGhHbG9iYWwod2luLCBkb2pvLmh0bWwuZ2V0U2Nyb2xsKS50b3A7CisJfQorCXRoaXMub3Blbih4LCB5LCBudWxsLCBbeCwgeV0pOworCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0Lk1lbnVJdGVtMiIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmV2ZW50TmFtZXMgPSB7ZW5nYWdlOiIifTsKK30sIHt0ZW1wbGF0ZVN0cmluZzoiPHRyIGNsYXNzPVwiZG9qb01lbnVJdGVtMlwiIGRvam9BdHRhY2hFdmVudD1cIm9uTW91c2VPdmVyOiBvbkhvdmVyOyBvbk1vdXNlT3V0OiBvblVuaG92ZXI7IG9uQ2xpY2s6IF9vbkNsaWNrOyBvbktleTpvbktleTtcIj4iICsgIjx0ZD48ZGl2IGNsYXNzPVwiJHt0aGlzLmljb25DbGFzc31cIiBzdHlsZT1cIiR7dGhpcy5pY29uU3R5bGV9XCI+PC9kaXY+PC90ZD4iICsgIjx0ZCB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJkb2pvTWVudUl0ZW0yTGFiZWxcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjYXB0aW9uXCI+JHt0aGlzLmNhcHRpb259PC90ZD4iICsgIjx0ZCBjbGFzcz1cImRvam9NZW51SXRlbTJBY2NlbFwiPiR7dGhpcy5hY2NlbEtleX08L3RkPiIgKyAiPHRkPjxkaXYgY2xhc3M9XCJkb2pvTWVudUl0ZW0yU3VibWVudVwiIHN0eWxlPVwiZGlzcGxheToke3RoaXMuYXJyb3dEaXNwbGF5fTtcIiBkb2pvQXR0YWNoUG9pbnQ9XCJhcnJvd1wiPjwvZGl2PjwvdGQ+IiArICI8L3RyPiIsIGlzX2hvdmVyaW5nOmZhbHNlLCBob3Zlcl90aW1lcjpudWxsLCBpc19vcGVuOmZhbHNlLCB0b3BQb3NpdGlvbjowLCBjYXB0aW9uOiJVbnRpdGxlZCIsIGFjY2VsS2V5OiIiLCBpY29uU3JjOiIiLCBkaXNhYmxlZENsYXNzOiJkb2pvTWVudUl0ZW0yRGlzYWJsZWQiLCBpY29uQ2xhc3M6ImRvam9NZW51SXRlbTJJY29uIiwgc3VibWVudUlkOiIiLCBldmVudE5hbWluZzoiZGVmYXVsdCIsIGhpZ2hsaWdodENsYXNzOiJkb2pvTWVudUl0ZW0ySG92ZXIiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmljb25TdHlsZSA9ICIiOworCWlmICh0aGlzLmljb25TcmMpIHsKKwkJaWYgKCh0aGlzLmljb25TcmMudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcodGhpcy5pY29uU3JjLmxlbmd0aCAtIDQpID09ICIucG5nIikgJiYgKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApKSB7CisJCQl0aGlzLmljb25TdHlsZSA9ICJmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIiArIHRoaXMuaWNvblNyYyArICInLCBzaXppbmdNZXRob2Q9J2ltYWdlJykiOworCQl9IGVsc2UgeworCQkJdGhpcy5pY29uU3R5bGUgPSAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCIgKyB0aGlzLmljb25TcmMgKyAiKSI7CisJCX0KKwl9CisJdGhpcy5hcnJvd0Rpc3BsYXkgPSB0aGlzLnN1Ym1lbnVJZCA/ICJibG9jayIgOiAibm9uZSI7CisJZG9qby53aWRnZXQuTWVudUl0ZW0yLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuZG9tTm9kZSk7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJdGhpcy5zZXREaXNhYmxlZCh0cnVlKTsKKwl9CisJaWYgKHRoaXMuZXZlbnROYW1pbmcgPT0gImRlZmF1bHQiKSB7CisJCWZvciAodmFyIGV2ZW50TmFtZSBpbiB0aGlzLmV2ZW50TmFtZXMpIHsKKwkJCXRoaXMuZXZlbnROYW1lc1tldmVudE5hbWVdID0gdGhpcy53aWRnZXRJZCArICIvIiArIGV2ZW50TmFtZTsKKwkJfQorCX0KK30sIG9uSG92ZXI6ZnVuY3Rpb24gKCkgeworCXRoaXMub25VbmhvdmVyKCk7CisJaWYgKHRoaXMuaXNfaG92ZXJpbmcpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGhpcy5pc19vcGVuKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMucGFyZW50Ll9oaWdobGlnaHRlZF9vcHRpb24pIHsKKwkJdGhpcy5wYXJlbnQuX2hpZ2hsaWdodGVkX29wdGlvbi5vblVuaG92ZXIoKTsKKwl9CisJdGhpcy5wYXJlbnQuY2xvc2VTdWJtZW51KCk7CisJdGhpcy5wYXJlbnQuX2hpZ2hsaWdodGVkX29wdGlvbiA9IHRoaXM7CisJZG9qby53aWRnZXQuUG9wdXBNYW5hZ2VyLnNldEZvY3VzZWRNZW51KHRoaXMucGFyZW50KTsKKwl0aGlzLl9oaWdobGlnaHRJdGVtKCk7CisJaWYgKHRoaXMuaXNfaG92ZXJpbmcpIHsKKwkJdGhpcy5fc3RvcFN1Ym1lbnVUaW1lcigpOworCX0KKwl0aGlzLmlzX2hvdmVyaW5nID0gdHJ1ZTsKKwl0aGlzLl9zdGFydFN1Ym1lbnVUaW1lcigpOworfSwgb25VbmhvdmVyOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaXNfb3BlbikgeworCQl0aGlzLl91bmhpZ2hsaWdodEl0ZW0oKTsKKwl9CisJdGhpcy5pc19ob3ZlcmluZyA9IGZhbHNlOworCXRoaXMucGFyZW50Ll9oaWdobGlnaHRlZF9vcHRpb24gPSBudWxsOworCWlmICh0aGlzLnBhcmVudC5wYXJlbnRNZW51KSB7CisJCWRvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5zZXRGb2N1c2VkTWVudSh0aGlzLnBhcmVudC5wYXJlbnRNZW51KTsKKwl9CisJdGhpcy5fc3RvcFN1Ym1lbnVUaW1lcigpOworfSwgX29uQ2xpY2s6ZnVuY3Rpb24gKGZvY3VzKSB7CisJdmFyIGRpc3BsYXlpbmdTdWJNZW51ID0gZmFsc2U7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodGhpcy5zdWJtZW51SWQpIHsKKwkJaWYgKCF0aGlzLmlzX29wZW4pIHsKKwkJCXRoaXMuX3N0b3BTdWJtZW51VGltZXIoKTsKKwkJCXRoaXMuX29wZW5TdWJtZW51KCk7CisJCX0KKwkJZGlzcGxheWluZ1N1Yk1lbnUgPSB0cnVlOworCX0gZWxzZSB7CisJCXRoaXMub25VbmhvdmVyKCk7CisJCXRoaXMucGFyZW50LmNsb3NlQWxsKHRydWUpOworCX0KKwl0aGlzLm9uQ2xpY2soKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmVuZ2FnZSwgdGhpcyk7CisJaWYgKGRpc3BsYXlpbmdTdWJNZW51ICYmIGZvY3VzKSB7CisJCWRvam8ud2lkZ2V0LmdldFdpZGdldEJ5SWQodGhpcy5zdWJtZW51SWQpLl9oaWdobGlnaHRPcHRpb24oMSk7CisJfQorCXJldHVybjsKK30sIG9uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMucGFyZW50Lm9uSXRlbUNsaWNrKHRoaXMpOworfSwgX2hpZ2hsaWdodEl0ZW06ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsIHRoaXMuaGlnaGxpZ2h0Q2xhc3MpOworfSwgX3VuaGlnaGxpZ2h0SXRlbTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgdGhpcy5oaWdobGlnaHRDbGFzcyk7Cit9LCBfc3RhcnRTdWJtZW51VGltZXI6ZnVuY3Rpb24gKCkgeworCXRoaXMuX3N0b3BTdWJtZW51VGltZXIoKTsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCXZhciBzZWxmID0gdGhpczsKKwl2YXIgY2xvc3VyZSA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJCXNlbGYuX29wZW5TdWJtZW51KCk7CisJCX07CisJfSgpOworCXRoaXMuaG92ZXJfdGltZXIgPSBkb2pvLmxhbmcuc2V0VGltZW91dChjbG9zdXJlLCB0aGlzLnBhcmVudC5zdWJtZW51RGVsYXkpOworfSwgX3N0b3BTdWJtZW51VGltZXI6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmhvdmVyX3RpbWVyKSB7CisJCWRvam8ubGFuZy5jbGVhclRpbWVvdXQodGhpcy5ob3Zlcl90aW1lcik7CisJCXRoaXMuaG92ZXJfdGltZXIgPSBudWxsOworCX0KK30sIF9vcGVuU3VibWVudTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLnBhcmVudC5jbG9zZVN1Ym1lbnUoKTsKKwl2YXIgc3VibWVudSA9IGRvam8ud2lkZ2V0LmdldFdpZGdldEJ5SWQodGhpcy5zdWJtZW51SWQpOworCWlmIChzdWJtZW51KSB7CisJCXRoaXMucGFyZW50Ll9vcGVuU3VibWVudShzdWJtZW51LCB0aGlzKTsKKwl9Cit9LCBfY2xvc2VkU3VibWVudTpmdW5jdGlvbiAoKSB7CisJdGhpcy5vblVuaG92ZXIoKTsKK30sIHNldERpc2FibGVkOmZ1bmN0aW9uICh2YWx1ZSkgeworCXRoaXMuZGlzYWJsZWQgPSB2YWx1ZTsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzLmRpc2FibGVkQ2xhc3MpOworCX0gZWxzZSB7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRvbU5vZGUsIHRoaXMuZGlzYWJsZWRDbGFzcyk7CisJfQorfSwgZW5hYmxlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnNldERpc2FibGVkKGZhbHNlKTsKK30sIGRpc2FibGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuc2V0RGlzYWJsZWQodHJ1ZSk7Cit9LCBtZW51T3BlbjpmdW5jdGlvbiAobWVzc2FnZSkgeworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5NZW51U2VwYXJhdG9yMiIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPHRyIGNsYXNzPVwiZG9qb01lbnVTZXBhcmF0b3IyXCI+PHRkIGNvbHNwYW49ND4iICsgIjxkaXYgY2xhc3M9XCJkb2pvTWVudVNlcGFyYXRvcjJUb3BcIj48L2Rpdj4iICsgIjxkaXYgY2xhc3M9XCJkb2pvTWVudVNlcGFyYXRvcjJCb3R0b21cIj48L2Rpdj4iICsgIjwvdGQ+PC90cj4iLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLmRvbU5vZGUpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5NZW51QmFyMiIsIFtkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBkb2pvLndpZGdldC5NZW51QmFzZV0sIHttZW51T3ZlcmxhcDoyLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9NZW51QmFyMlwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIiB0YWJJbmRleD1cIjBcIj48L2Rpdj4iLCBjbG9zZTpmdW5jdGlvbiAoZm9yY2UpIHsKKwlpZiAodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKSB7CisJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5vblVuaG92ZXIoKTsKKwl9CisJdGhpcy5jbG9zZVN1Ym1lbnUoZm9yY2UpOworfSwgY2xvc2VBbGw6ZnVuY3Rpb24gKGZvcmNlKSB7CisJdGhpcy5jbG9zZShmb3JjZSk7Cit9LCBwcm9jZXNzS2V5OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBydmFsID0gZmFsc2U7CisJc3dpdGNoIChldnQua2V5KSB7CisJICBjYXNlIGV2dC5LRVlfRE9XTl9BUlJPVzoKKwkJcnZhbCA9IHRoaXMuX21vdmVUb0NoaWxkTWVudShldnQpOworCQlicmVhazsKKwkgIGNhc2UgZXZ0LktFWV9VUF9BUlJPVzoKKwkJcnZhbCA9IHRoaXMuX21vdmVUb1BhcmVudE1lbnUoZXZ0KTsKKwkJYnJlYWs7CisJICBjYXNlIGV2dC5LRVlfUklHSFRfQVJST1c6CisJCXJ2YWwgPSB0aGlzLl9tb3ZlVG9OZXh0KGV2dCk7CisJCWJyZWFrOworCSAgY2FzZSBldnQuS0VZX0xFRlRfQVJST1c6CisJCXJ2YWwgPSB0aGlzLl9tb3ZlVG9QcmV2aW91cyhldnQpOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXJ2YWwgPSBkb2pvLndpZGdldC5NZW51QmFyMi5zdXBlcmNsYXNzLnByb2Nlc3NLZXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBydmFsOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuTWVudUJhcjIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5pc1Nob3dpbmdOb3cgPSB0cnVlOworfSwgX29wZW5TdWJtZW51OmZ1bmN0aW9uIChzdWJtZW51LCBmcm9tX2l0ZW0pIHsKKwlzdWJtZW51Ll9vcGVuQXNTdWJtZW51KHRoaXMsIGZyb21faXRlbS5kb21Ob2RlLCB7IkJMIjoiVEwiLCAiVEwiOiJCTCJ9KTsKKwl0aGlzLmN1cnJlbnRTdWJtZW51ID0gc3VibWVudTsKKwl0aGlzLmN1cnJlbnRTdWJtZW51VHJpZ2dlciA9IGZyb21faXRlbTsKKwl0aGlzLmN1cnJlbnRTdWJtZW51VHJpZ2dlci5pc19vcGVuID0gdHJ1ZTsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuTWVudUJhckl0ZW0yIiwgZG9qby53aWRnZXQuTWVudUl0ZW0yLCB7dGVtcGxhdGVTdHJpbmc6IjxzcGFuIGNsYXNzPVwiZG9qb01lbnVJdGVtMlwiIGRvam9BdHRhY2hFdmVudD1cIm9uTW91c2VPdmVyOiBvbkhvdmVyOyBvbk1vdXNlT3V0OiBvblVuaG92ZXI7IG9uQ2xpY2s6IF9vbkNsaWNrO1wiPiR7dGhpcy5jYXB0aW9ufTwvc3Bhbj4ifSk7Citkb2pvLndpZGdldC5NZW51Mi5PcGVyYUFuZEtvbnFGaXhlciA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdmFyIGltcGxlbWVudCA9IHRydWU7CisJdmFyIGRlbGZ1bmMgPSBmYWxzZTsKKwlpZiAoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGRvam8uZG9jKCkub25jb250ZXh0bWVudSkpIHsKKwkJZG9qby5kb2MoKS5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKCkgeworCQkJaW1wbGVtZW50ID0gZmFsc2U7CisJCQlkZWxmdW5jID0gdHJ1ZTsKKwkJfTsKKwl9CisJaWYgKGRvam8uZG9jKCkuY3JlYXRlRXZlbnQpIHsKKwkJdHJ5IHsKKwkJCXZhciBlID0gZG9qby5kb2MoKS5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTsKKwkJCWUuaW5pdE1vdXNlRXZlbnQoImNvbnRleHRtZW51IiwgMSwgMSwgZG9qby5nbG9iYWwoKSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgbnVsbCk7CisJCQlkb2pvLmRvYygpLmRpc3BhdGNoRXZlbnQoZSk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCX0gZWxzZSB7CisJCWltcGxlbWVudCA9IGZhbHNlOworCX0KKwlpZiAoZGVsZnVuYykgeworCQlkZWxldGUgZG9qby5kb2MoKS5vbmNvbnRleHRtZW51OworCX0KKwl0aGlzLmZpeE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeworCQlpZiAoaW1wbGVtZW50KSB7CisJCQlpZiAoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKG5vZGUub25jb250ZXh0bWVudSkpIHsKKwkJCQlub2RlLm9uY29udGV4dG1lbnUgPSBmdW5jdGlvbiAoZSkgeworCQkJCX07CisJCQl9CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkgeworCQkJCW5vZGUuX21lbnVmaXhlcl9vcGVyYSA9IGZ1bmN0aW9uIChlKSB7CisJCQkJCWlmIChlLmN0cmxLZXkpIHsKKwkJCQkJCXRoaXMub25jb250ZXh0bWVudShlKTsKKwkJCQkJfQorCQkJCX07CisJCQkJZG9qby5ldmVudC5jb25uZWN0KG5vZGUsICJvbmNsaWNrIiwgbm9kZSwgIl9tZW51Zml4ZXJfb3BlcmEiKTsKKwkJCX0gZWxzZSB7CisJCQkJbm9kZS5fbWVudWZpeGVyX2tvbnEgPSBmdW5jdGlvbiAoZSkgeworCQkJCQlpZiAoZS5idXR0b24gPT0gMikgeworCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJdGhpcy5vbmNvbnRleHRtZW51KGUpOworCQkJCQl9CisJCQkJfTsKKwkJCQlkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwgIm9ubW91c2Vkb3duIiwgbm9kZSwgIl9tZW51Zml4ZXJfa29ucSIpOworCQkJfQorCQl9CisJfTsKKwl0aGlzLmNsZWFuTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJCWlmIChpbXBsZW1lbnQpIHsKKwkJCWlmIChub2RlLl9tZW51Zml4ZXJfb3BlcmEpIHsKKwkJCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3Qobm9kZSwgIm9uY2xpY2siLCBub2RlLCAiX21lbnVmaXhlcl9vcGVyYSIpOworCQkJCWRlbGV0ZSBub2RlLl9tZW51Zml4ZXJfb3BlcmE7CisJCQl9IGVsc2UgeworCQkJCWlmIChub2RlLl9tZW51Zml4ZXJfa29ucSkgeworCQkJCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3Qobm9kZSwgIm9ubW91c2Vkb3duIiwgbm9kZSwgIl9tZW51Zml4ZXJfa29ucSIpOworCQkJCQlkZWxldGUgbm9kZS5fbWVudWZpeGVyX2tvbnE7CisJCQkJfQorCQkJfQorCQkJaWYgKG5vZGUub25jb250ZXh0bWVudSkgeworCQkJCWRlbGV0ZSBub2RlLm9uY29udGV4dG1lbnU7CisJCQl9CisJCX0KKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Nb250aGx5Q2FsZW5kYXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L01vbnRobHlDYWxlbmRhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ3ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Nb250aGx5Q2FsZW5kYXIuanMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lk1vbnRobHlDYWxlbmRhciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRhdGUuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5mb3JtYXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5EYXRlUGlja2VyIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8ud2lkZ2V0Lk1vbnRobHlDYWxlbmRhciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Nb250aGx5Q2FsZW5kYXIiLCBkb2pvLndpZGdldC5EYXRlUGlja2VyLCB7ZGF5V2lkdGg6IndpZGUiLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRhdGVQaWNrZXJDb250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJkYXRlUGlja2VyQ29udGFpbmVyTm9kZVwiPlxuXHQ8aDMgY2xhc3M9XCJtb250aExhYmVsXCI+XG5cdDwhLS1cblx0PHNwYW4gXG5cdFx0ZG9qb0F0dGFjaFBvaW50PVwiZGVjcmVhc2VXZWVrTm9kZVwiIFxuXHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50V2VlaztcIiBcblx0XHRjbGFzcz1cImluY3JlbWVudENvbnRyb2xcIj5cblx0XHQ8aW1nIHNyYz1cIiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvZGVjcmVtZW50V2Vlay5naWZcIiBhbHQ9XCImdWFycjtcIiAvPlxuXHQ8L3NwYW4+XG5cdC0tPlxuXHQ8c3BhbiBcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkZWNyZWFzZU1vbnRoTm9kZVwiIFxuXHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7XCIgY2xhc3M9XCJpbmNyZW1lbnRDb250cm9sXCI+XG5cdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2RlY3JlbWVudE1vbnRoLmdpZlwiIFxuXHRcdFx0YWx0PVwiJnVhcnI7XCIgZG9qb0F0dGFjaFBvaW50PVwiZGVjcmVtZW50TW9udGhJbWFnZU5vZGVcIj5cblx0PC9zcGFuPlxuXHQ8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJtb250aExhYmVsTm9kZVwiIGNsYXNzPVwibW9udGhcIj5KdWx5PC9zcGFuPlxuXHQ8c3BhbiBcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJpbmNyZWFzZU1vbnRoTm9kZVwiIFxuXHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7XCIgY2xhc3M9XCJpbmNyZW1lbnRDb250cm9sXCI+XG5cdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2luY3JlbWVudE1vbnRoLmdpZlwiIFxuXHRcdFx0YWx0PVwiJmRhcnI7XCIgIGRvam9BdHRhY2hQb2ludD1cImluY3JlbWVudE1vbnRoSW1hZ2VOb2RlXCI+XG5cdDwvc3Bhbj5cblx0PCEtLVxuXHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cImluY3JlYXNlV2Vla05vZGVcIiBcblx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50V2VlaztcIiBcblx0XHRcdGNsYXNzPVwiaW5jcmVtZW50Q29udHJvbFwiPlxuXHRcdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2luY3JlbWVudFdlZWsuZ2lmXCIgXG5cdFx0XHRhbHQ9XCImZGFycjtcIiAvPlxuXHRcdDwvc3Bhbj5cblx0LS0+XG5cdDwvaDM+XG5cdDx0YWJsZSBjbGFzcz1cImNhbGVuZGFyQ29udGFpbmVyXCI+XG5cdFx0PHRoZWFkPlxuXHRcdFx0PHRyIGRvam9BdHRhY2hQb2ludD1cImRheUxhYmVsc1Jvd1wiPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90aGVhZD5cblx0XHQ8dGJvZHkgZG9qb0F0dGFjaFBvaW50PVwiY2FsZW5kYXJEYXRlc0NvbnRhaW5lck5vZGVcIiBcblx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uU2V0RGF0ZTtcIj5cblx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhclJvdzBcIj5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdFx0PHRyIGRvam9BdHRhY2hQb2ludD1cImNhbGVuZGFyUm93MVwiPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0XHQ8dHIgZG9qb0F0dGFjaFBvaW50PVwiY2FsZW5kYXJSb3cyXCI+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0PC90cj5cblx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhclJvdzNcIj5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdFx0PHRyIGRvam9BdHRhY2hQb2ludD1cImNhbGVuZGFyUm93NFwiPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0XHQ8dHIgZG9qb0F0dGFjaFBvaW50PVwiY2FsZW5kYXJSb3c1XCI+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZD48L3RkPlxuXHRcdFx0PC90cj5cblx0XHQ8L3Rib2R5PlxuXHQ8L3RhYmxlPlxuXHQ8aDMgY2xhc3M9XCJ5ZWFyTGFiZWxcIj5cblx0XHQ8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJwcmV2aW91c1llYXJMYWJlbE5vZGVcIlxuXHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRZZWFyO1wiIGNsYXNzPVwicHJldmlvdXNZZWFyXCI+PC9zcGFuPlxuXHRcdDxzcGFuIGNsYXNzPVwic2VsZWN0ZWRZZWFyXCIgZG9qb0F0dGFjaFBvaW50PVwiY3VycmVudFllYXJMYWJlbE5vZGVcIj48L3NwYW4+XG5cdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwibmV4dFllYXJMYWJlbE5vZGVcIiBcblx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50WWVhcjtcIiBjbGFzcz1cIm5leHRZZWFyXCI+PC9zcGFuPlxuXHQ8L2gzPlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRhdGVQaWNrZXJDb250YWluZXIge1xuXHRtYXJnaW46MC41ZW0gMmVtIDAuNWVtIDA7XG5cdC8qd2lkdGg6MTBlbTsqL1xuXHRmbG9hdDpsZWZ0O1xufVxuXG4ucHJldmlvdXNNb250aCB7XG5cdGJhY2tncm91bmQtY29sb3I6I2JiYmJiYjtcbn1cblxuLmN1cnJlbnRNb250aCB7XG5cdGJhY2tncm91bmQtY29sb3I6IzhmOGY4Zjtcbn1cblxuLm5leHRNb250aCB7XG5cdGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTtcbn1cblxuLmN1cnJlbnREYXRlIHtcblx0dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcblx0Zm9udC1zdHlsZTppdGFsaWM7XG59XG5cbi5zZWxlY3RlZEl0ZW0ge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiMzYTNhM2E7XG5cdGNvbG9yOiNmZmZmZmY7XG59XG5cbi5jYWxlbmRhckNvbnRhaW5lciB7XG5cdGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcblx0Ym9yZGVyLXNwYWNpbmc6MDtcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZTZlNjtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0dGV4dC1hbGlnbjogcmlnaHQ7XG59XG5cbi5jYWxlbmRhckNvbnRhaW5lciB0aGVhZHtcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZTZlNjtcbn1cblxuLmNhbGVuZGFyQ29udGFpbmVyIHRib2R5ICogdGQge1xuCQloZWlnaHQ6IDEwMHB4O1xuCQlib3JkZXI6IDFweCBzb2xpZCBncmF5O1xufVxuXG4uY2FsZW5kYXJDb250YWluZXIgdGQge1xuCQl3aWR0aDogMTAwcHg7XG4JCXBhZGRpbmc6IDJweDtcblx0dmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxuLm1vbnRoTGFiZWwge1xuXHRmb250LXNpemU6MC45ZW07XG5cdGZvbnQtd2VpZ2h0OjQwMDtcblx0bWFyZ2luOjA7XG5cdHRleHQtYWxpZ246Y2VudGVyO1xufVxuXG4ubW9udGhMYWJlbCAubW9udGgge1xuXHRwYWRkaW5nOjAgMC40ZW0gMCAwLjRlbTtcbn1cblxuLnllYXJMYWJlbCB7XG5cdGZvbnQtc2l6ZTowLjllbTtcblx0Zm9udC13ZWlnaHQ6NDAwO1xuXHRtYXJnaW46MC4yNWVtIDAgMCAwO1xuXHR0ZXh0LWFsaWduOnJpZ2h0O1xuXHRjb2xvcjojYTNhM2EzO1xufVxuXG4ueWVhckxhYmVsIC5zZWxlY3RlZFllYXIge1xuXHRjb2xvcjojMDAwO1xuXHRwYWRkaW5nOjAgMC4yZW07XG59XG5cbi5uZXh0WWVhciwgLnByZXZpb3VzWWVhciB7XG5cdGN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kO1xufVxuXG4uaW5jcmVtZW50Q29udHJvbCB7XG5cdGN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kO1xuXHR3aWR0aDoxZW07XG59XG5cbi5kb2pvTW9udGhseUNhbGVuZGFyRXZlbnQge1xuXHRmb250LXNpemU6MC43ZW07XG5cdG92ZXJmbG93OiBoaWRkZW47XG5cdGZvbnQtY29sb3I6IGdyZXk7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdHRleHQtYWxpZ246IGxlZnQ7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvTW9udGhseUNhbGVuZGFyLmNzcyIpLCBpbml0aWFsaXplcjpmdW5jdGlvbiAoKSB7CisJdGhpcy5pQ2FsZW5kYXJzID0gW107Cit9LCBhZGRDYWxlbmRhcjpmdW5jdGlvbiAoY2FsKSB7CisJZG9qby5kZWJ1ZygiQWRkaW5nIENhbGVuZGFyIik7CisJdGhpcy5pQ2FsZW5kYXJzLnB1c2goY2FsKTsKKwlkb2pvLmRlYnVnKCJTdGFydGluZyBpbml0Iik7CisJdGhpcy5pbml0VUkoKTsKKwlkb2pvLmRlYnVnKCJkb25lIGluaXQiKTsKK30sIGNyZWF0ZURheUNvbnRlbnRzOmZ1bmN0aW9uIChub2RlLCBteWRhdGUpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2hpbGRyZW4obm9kZSk7CisJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShteWRhdGUuZ2V0RGF0ZSgpKSk7CisJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmlDYWxlbmRhcnMubGVuZ3RoOyB4KyspIHsKKwkJdmFyIGV2dHMgPSB0aGlzLmlDYWxlbmRhcnNbeF0uZ2V0RXZlbnRzKG15ZGF0ZSk7CisJCWlmICgoZG9qby5sYW5nLmlzQXJyYXkoZXZ0cykpICYmIChldnRzLmxlbmd0aCA+IDApKSB7CisJCQlmb3IgKHZhciB5ID0gMDsgeSA8IGV2dHMubGVuZ3RoOyB5KyspIHsKKwkJCQl2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQlkb2pvLmh0bWwuYWRkQ2xhc3MoZWwsICJkb2pvTW9udGhseUNhbGVuZGFyRXZlbnQiKTsKKwkJCQllbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShldnRzW3ldLnN1bW1hcnkudmFsdWUpKTsKKwkJCQllbC53aWR0aCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpLndpZHRoOworCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZWwpOworCQkJfQorCQl9CisJfQorfSwgaW5pdFVJOmZ1bmN0aW9uICgpIHsKKwl2YXIgZGF5TGFiZWxzID0gZG9qby5kYXRlLmdldE5hbWVzKCJkYXlzIiwgdGhpcy5kYXlXaWR0aCwgInN0YW5kQWxvbmUiLCB0aGlzLmxhbmcpOworCXZhciBkYXlMYWJlbE5vZGVzID0gdGhpcy5kYXlMYWJlbHNSb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJZm9yICh2YXIgaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJZGF5TGFiZWxOb2Rlcy5pdGVtKGkpLmlubmVySFRNTCA9IGRheUxhYmVsc1tpXTsKKwl9CisJdGhpcy5zZWxlY3RlZElzVXNlZCA9IGZhbHNlOworCXRoaXMuY3VycmVudElzVXNlZCA9IGZhbHNlOworCXZhciBjdXJyZW50Q2xhc3NOYW1lID0gIiI7CisJdmFyIHByZXZpb3VzRGF0ZSA9IG5ldyBEYXRlKCk7CisJdmFyIGNhbGVuZGFyTm9kZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCXZhciBjdXJyZW50Q2FsZW5kYXJOb2RlOworCXByZXZpb3VzRGF0ZS5zZXRIb3Vycyg4KTsKKwl2YXIgbmV4dERhdGUgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0U2F0dXJkYXkueWVhciwgdGhpcy5maXJzdFNhdHVyZGF5Lm1vbnRoLCB0aGlzLmZpcnN0U2F0dXJkYXkuZGF0ZSwgOCk7CisJdmFyIGxhc3REYXkgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0U2F0dXJkYXkueWVhciwgdGhpcy5maXJzdFNhdHVyZGF5Lm1vbnRoLCB0aGlzLmZpcnN0U2F0dXJkYXkuZGF0ZSArIDQyLCA4KTsKKwlpZiAodGhpcy5pQ2FsZW5kYXJzLmxlbmd0aCA+IDApIHsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmlDYWxlbmRhcnMubGVuZ3RoOyB4KyspIHsKKwkJCXRoaXMuaUNhbGVuZGFyc1t4XS5wcmVDb21wdXRlUmVjdXJyaW5nRXZlbnRzKGxhc3REYXkpOworCQl9CisJfQorCWlmICh0aGlzLmZpcnN0U2F0dXJkYXkuZGF0ZSA8IDcpIHsKKwkJdmFyIGRheUluV2VlayA9IDY7CisJCWZvciAodmFyIGkgPSB0aGlzLmZpcnN0U2F0dXJkYXkuZGF0ZTsgaSA+IDA7IGktLSkgeworCQkJY3VycmVudENhbGVuZGFyTm9kZSA9IGNhbGVuZGFyTm9kZXMuaXRlbShkYXlJbldlZWspOworCQkJdGhpcy5jcmVhdGVEYXlDb250ZW50cyhjdXJyZW50Q2FsZW5kYXJOb2RlLCBuZXh0RGF0ZSk7CisJCQlkb2pvLmh0bWwuc2V0Q2xhc3MoY3VycmVudENhbGVuZGFyTm9kZSwgdGhpcy5nZXREYXRlQ2xhc3NOYW1lKG5leHREYXRlLCAiY3VycmVudCIpKTsKKwkJCWRheUluV2Vlay0tOworCQkJcHJldmlvdXNEYXRlID0gbmV4dERhdGU7CisJCQluZXh0RGF0ZSA9IHRoaXMuaW5jcmVtZW50RGF0ZShuZXh0RGF0ZSwgZmFsc2UpOworCQl9CisJCWZvciAodmFyIGkgPSBkYXlJbldlZWs7IGkgPiAtMTsgaS0tKSB7CisJCQljdXJyZW50Q2FsZW5kYXJOb2RlID0gY2FsZW5kYXJOb2Rlcy5pdGVtKGkpOworCQkJdGhpcy5jcmVhdGVEYXlDb250ZW50cyhjdXJyZW50Q2FsZW5kYXJOb2RlLCBuZXh0RGF0ZSk7CisJCQlkb2pvLmh0bWwuc2V0Q2xhc3MoY3VycmVudENhbGVuZGFyTm9kZSwgdGhpcy5nZXREYXRlQ2xhc3NOYW1lKG5leHREYXRlLCAicHJldmlvdXMiKSk7CisJCQlwcmV2aW91c0RhdGUgPSBuZXh0RGF0ZTsKKwkJCW5leHREYXRlID0gdGhpcy5pbmNyZW1lbnREYXRlKG5leHREYXRlLCBmYWxzZSk7CisJCX0KKwl9IGVsc2UgeworCQluZXh0RGF0ZS5zZXREYXRlKDEpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IDc7IGkrKykgeworCQkJY3VycmVudENhbGVuZGFyTm9kZSA9IGNhbGVuZGFyTm9kZXMuaXRlbShpKTsKKwkJCXRoaXMuY3JlYXRlRGF5Q29udGVudHMoY3VycmVudENhbGVuZGFyTm9kZSwgbmV4dERhdGUpOworCQkJZG9qby5odG1sLnNldENsYXNzKGN1cnJlbnRDYWxlbmRhck5vZGUsIHRoaXMuZ2V0RGF0ZUNsYXNzTmFtZShuZXh0RGF0ZSwgImN1cnJlbnQiKSk7CisJCQlwcmV2aW91c0RhdGUgPSBuZXh0RGF0ZTsKKwkJCW5leHREYXRlID0gdGhpcy5pbmNyZW1lbnREYXRlKG5leHREYXRlLCB0cnVlKTsKKwkJfQorCX0KKwlwcmV2aW91c0RhdGUuc2V0RGF0ZSh0aGlzLmZpcnN0U2F0dXJkYXkuZGF0ZSk7CisJcHJldmlvdXNEYXRlLnNldE1vbnRoKHRoaXMuZmlyc3RTYXR1cmRheS5tb250aCk7CisJcHJldmlvdXNEYXRlLnNldEZ1bGxZZWFyKHRoaXMuZmlyc3RTYXR1cmRheS55ZWFyKTsKKwluZXh0RGF0ZSA9IHRoaXMuaW5jcmVtZW50RGF0ZShwcmV2aW91c0RhdGUsIHRydWUpOworCXZhciBjb3VudCA9IDc7CisJY3VycmVudENhbGVuZGFyTm9kZSA9IGNhbGVuZGFyTm9kZXMuaXRlbShjb3VudCk7CisJd2hpbGUgKChuZXh0RGF0ZS5nZXRNb250aCgpID09IHByZXZpb3VzRGF0ZS5nZXRNb250aCgpKSAmJiAoY291bnQgPCA0MikpIHsKKwkJdGhpcy5jcmVhdGVEYXlDb250ZW50cyhjdXJyZW50Q2FsZW5kYXJOb2RlLCBuZXh0RGF0ZSk7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhjdXJyZW50Q2FsZW5kYXJOb2RlLCB0aGlzLmdldERhdGVDbGFzc05hbWUobmV4dERhdGUsICJjdXJyZW50IikpOworCQljdXJyZW50Q2FsZW5kYXJOb2RlID0gY2FsZW5kYXJOb2Rlcy5pdGVtKCsrY291bnQpOworCQlwcmV2aW91c0RhdGUgPSBuZXh0RGF0ZTsKKwkJbmV4dERhdGUgPSB0aGlzLmluY3JlbWVudERhdGUobmV4dERhdGUsIHRydWUpOworCX0KKwl3aGlsZSAoY291bnQgPCA0MikgeworCQl0aGlzLmNyZWF0ZURheUNvbnRlbnRzKGN1cnJlbnRDYWxlbmRhck5vZGUsIG5leHREYXRlKTsKKwkJZG9qby5odG1sLnNldENsYXNzKGN1cnJlbnRDYWxlbmRhck5vZGUsIHRoaXMuZ2V0RGF0ZUNsYXNzTmFtZShuZXh0RGF0ZSwgIm5leHQiKSk7CisJCWN1cnJlbnRDYWxlbmRhck5vZGUgPSBjYWxlbmRhck5vZGVzLml0ZW0oKytjb3VudCk7CisJCXByZXZpb3VzRGF0ZSA9IG5leHREYXRlOworCQluZXh0RGF0ZSA9IHRoaXMuaW5jcmVtZW50RGF0ZShuZXh0RGF0ZSwgdHJ1ZSk7CisJfQorCXRoaXMuc2V0TW9udGhMYWJlbCh0aGlzLmZpcnN0U2F0dXJkYXkubW9udGgpOworCXRoaXMuc2V0WWVhckxhYmVscyh0aGlzLmZpcnN0U2F0dXJkYXkueWVhcik7Cit9fSk7Citkb2pvLndpZGdldC5Nb250aGx5Q2FsZW5kYXIudXRpbCA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy50b1JmY0RhdGUgPSBmdW5jdGlvbiAoanNEYXRlKSB7CisJCWlmICghanNEYXRlKSB7CisJCQlqc0RhdGUgPSB0aGlzLnRvZGF5OworCQl9CisJCXZhciB5ZWFyID0ganNEYXRlLmdldEZ1bGxZZWFyKCk7CisJCXZhciBtb250aCA9IGpzRGF0ZS5nZXRNb250aCgpICsgMTsKKwkJaWYgKG1vbnRoIDwgMTApIHsKKwkJCW1vbnRoID0gIjAiICsgbW9udGgudG9TdHJpbmcoKTsKKwkJfQorCQl2YXIgZGF0ZSA9IGpzRGF0ZS5nZXREYXRlKCk7CisJCWlmIChkYXRlIDwgMTApIHsKKwkJCWRhdGUgPSAiMCIgKyBkYXRlLnRvU3RyaW5nKCk7CisJCX0KKwkJcmV0dXJuIHllYXIgKyAiLSIgKyBtb250aCArICItIiArIGRhdGUgKyAiVDAwOjAwOjAwKzAwOjAwIjsKKwl9OworCXRoaXMuZnJvbVJmY0RhdGUgPSBmdW5jdGlvbiAocmZjRGF0ZSkgeworCQl2YXIgdGVtcERhdGUgPSByZmNEYXRlLnNwbGl0KCItIik7CisJCWlmICh0ZW1wRGF0ZS5sZW5ndGggPCAzKSB7CisJCQlyZXR1cm4gbmV3IERhdGUoKTsKKwkJfQorCQlyZXR1cm4gbmV3IERhdGUocGFyc2VJbnQodGVtcERhdGVbMF0pLCAocGFyc2VJbnQodGVtcERhdGVbMV0sIDEwKSAtIDEpLCBwYXJzZUludCh0ZW1wRGF0ZVsyXS5zdWJzdHIoMCwgMiksIDEwKSk7CisJfTsKKwl0aGlzLmluaXRGaXJzdFNhdHVyZGF5ID0gZnVuY3Rpb24gKG1vbnRoLCB5ZWFyKSB7CisJCWlmICghbW9udGgpIHsKKwkJCW1vbnRoID0gdGhpcy5kYXRlLmdldE1vbnRoKCk7CisJCX0KKwkJaWYgKCF5ZWFyKSB7CisJCQl5ZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7CisJCX0KKwkJdmFyIGZpcnN0T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTsKKwkJcmV0dXJuIHt5ZWFyOnllYXIsIG1vbnRoOm1vbnRoLCBkYXRlOjcgLSBmaXJzdE9mTW9udGguZ2V0RGF5KCl9OworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1BhZ2VDb250YWluZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1BhZ2VDb250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYWNhNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUGFnZUNvbnRhaW5lci5qcwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7aXNDb250YWluZXI6dHJ1ZSwgZG9MYXlvdXQ6dHJ1ZSwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgZG9qb0F0dGFjaFBvaW50PSdjb250YWluZXJOb2RlJz48L2Rpdj4iLCBzZWxlY3RlZENoaWxkOiIiLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXZhciBzb3VyY2UgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCWRvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLCBzb3VyY2UpOworCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkgeworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNoaWxkcmVuLCB0aGlzLl9zZXR1cENoaWxkLCB0aGlzKTsKKwkJdmFyIGluaXRpYWxDaGlsZDsKKwkJaWYgKHRoaXMuc2VsZWN0ZWRDaGlsZCkgeworCQkJdGhpcy5zZWxlY3RDaGlsZCh0aGlzLnNlbGVjdGVkQ2hpbGQpOworCQl9IGVsc2UgeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHRoaXMuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHsKKwkJCQkJdGhpcy5zZWxlY3RDaGlsZCh0aGlzLmNoaWxkcmVuW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCF0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpIHsKKwkJCQl0aGlzLnNlbGVjdENoaWxkKHRoaXMuY2hpbGRyZW5bMF0pOworCQkJfQorCQl9CisJfQorfSwgYWRkQ2hpbGQ6ZnVuY3Rpb24gKGNoaWxkKSB7CisJZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lci5zdXBlcmNsYXNzLmFkZENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc2V0dXBDaGlsZChjaGlsZCk7CisJdGhpcy5vblJlc2l6ZWQoKTsKKwlpZiAoIXRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCkgeworCQl0aGlzLnNlbGVjdENoaWxkKGNoaWxkKTsKKwl9Cit9LCBfc2V0dXBDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCXBhZ2UuaGlkZSgpOworCXBhZ2UuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMud2lkZ2V0SWQgKyAiLWFkZENoaWxkIiwgcGFnZSk7Cit9LCByZW1vdmVDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5yZW1vdmVDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICh0aGlzLl9iZWluZ0Rlc3Ryb3llZCkgeworCQlyZXR1cm47CisJfQorCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLndpZGdldElkICsgIi1yZW1vdmVDaGlsZCIsIHBhZ2UpOworCXRoaXMub25SZXNpemVkKCk7CisJaWYgKHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCA9PT0gcGFnZSkgeworCQl0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQgPSB1bmRlZmluZWQ7CisJCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKKwkJCXRoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlblswXSwgdHJ1ZSk7CisJCX0KKwl9Cit9LCBzZWxlY3RDaGlsZDpmdW5jdGlvbiAocGFnZSwgY2FsbGluZ1dpZGdldCkgeworCXBhZ2UgPSBkb2pvLndpZGdldC5ieUlkKHBhZ2UpOworCXRoaXMuY29ycmVzcG9uZGluZ1BhZ2VCdXR0b24gPSBjYWxsaW5nV2lkZ2V0OworCWlmICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpIHsKKwkJdGhpcy5faGlkZUNoaWxkKHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCk7CisJfQorCXRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCA9IHBhZ2U7CisJdGhpcy5zZWxlY3RlZENoaWxkID0gcGFnZS53aWRnZXRJZDsKKwl0aGlzLl9zaG93Q2hpbGQocGFnZSk7CisJcGFnZS5pc0ZpcnN0Q2hpbGQgPSAocGFnZSA9PSB0aGlzLmNoaWxkcmVuWzBdKTsKKwlwYWdlLmlzTGFzdENoaWxkID0gKHBhZ2UgPT0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy53aWRnZXRJZCArICItc2VsZWN0Q2hpbGQiLCBwYWdlKTsKK30sIGZvcndhcmQ6ZnVuY3Rpb24gKCkgeworCXZhciBpbmRleCA9IGRvam8ubGFuZy5maW5kKHRoaXMuY2hpbGRyZW4sIHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCk7CisJdGhpcy5zZWxlY3RDaGlsZCh0aGlzLmNoaWxkcmVuW2luZGV4ICsgMV0pOworfSwgYmFjazpmdW5jdGlvbiAoKSB7CisJdmFyIGluZGV4ID0gZG9qby5sYW5nLmZpbmQodGhpcy5jaGlsZHJlbiwgdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KTsKKwl0aGlzLnNlbGVjdENoaWxkKHRoaXMuY2hpbGRyZW5baW5kZXggLSAxXSk7Cit9LCBvblJlc2l6ZWQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmRvTGF5b3V0ICYmIHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCkgeworCQl3aXRoICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQuZG9tTm9kZS5zdHlsZSkgeworCQkJdG9wID0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5jb250YWluZXJOb2RlLCAicGFkZGluZy10b3AiLCB0cnVlKTsKKwkJCWxlZnQgPSBkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmNvbnRhaW5lck5vZGUsICJwYWRkaW5nLWxlZnQiLCB0cnVlKTsKKwkJfQorCQl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29udGFpbmVyTm9kZSk7CisJCXRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldC5yZXNpemVUbyhjb250ZW50LndpZHRoLCBjb250ZW50LmhlaWdodCk7CisJfQorfSwgX3Nob3dDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCWlmICh0aGlzLmRvTGF5b3V0KSB7CisJCXZhciBjb250ZW50ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5jb250YWluZXJOb2RlKTsKKwkJcGFnZS5yZXNpemVUbyhjb250ZW50LndpZHRoLCBjb250ZW50LmhlaWdodCk7CisJfQorCXBhZ2Uuc2VsZWN0ZWQgPSB0cnVlOworCXBhZ2Uuc2hvdygpOworfSwgX2hpZGVDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCXBhZ2Uuc2VsZWN0ZWQgPSBmYWxzZTsKKwlwYWdlLmhpZGUoKTsKK30sIGNsb3NlQ2hpbGQ6ZnVuY3Rpb24gKHBhZ2UpIHsKKwl2YXIgcmVtb3ZlID0gcGFnZS5vbkNsb3NlKHRoaXMsIHBhZ2UpOworCWlmIChyZW1vdmUpIHsKKwkJdGhpcy5yZW1vdmVDaGlsZChwYWdlKTsKKwkJcGFnZS5kZXN0cm95KCk7CisJfQorfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fYmVpbmdEZXN0cm95ZWQgPSB0cnVlOworCWRvam8uZXZlbnQudG9waWMuZGVzdHJveSh0aGlzLndpZGdldElkICsgIi1hZGRDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMuZGVzdHJveSh0aGlzLndpZGdldElkICsgIi1yZW1vdmVDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMuZGVzdHJveSh0aGlzLndpZGdldElkICsgIi1zZWxlY3RDaGlsZCIpOworCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBhZ2VDb250cm9sbGVyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge3RlbXBsYXRlU3RyaW5nOiI8c3BhbiB3YWlyb2xlPSd0YWJsaXN0JyBkb2pvQXR0YWNoRXZlbnQ9J29uS2V5Jz48L3NwYW4+IiwgaXNDb250YWluZXI6dHJ1ZSwgY29udGFpbmVySWQ6IiIsIGJ1dHRvbldpZGdldDoiUGFnZUJ1dHRvbiIsICJjbGFzcyI6ImRvam9QYWdlQ29udHJvbGxlciIsIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzWyJjbGFzcyJdKTsKKwlkb2pvLndpZGdldC53YWkuc2V0QXR0cih0aGlzLmRvbU5vZGUsICJ3YWlSb2xlIiwgInJvbGUiLCAidGFibGlzdCIpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5wYW5lMmJ1dHRvbiA9IHt9OworCXZhciBjb250YWluZXIgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuY29udGFpbmVySWQpOworCWlmIChjb250YWluZXIpIHsKKwkJZG9qby5sYW5nLmZvckVhY2goY29udGFpbmVyLmNoaWxkcmVuLCB0aGlzLm9uQWRkQ2hpbGQsIHRoaXMpOworCX0KKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkICsgIi1hZGRDaGlsZCIsIHRoaXMsICJvbkFkZENoaWxkIik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCArICItcmVtb3ZlQ2hpbGQiLCB0aGlzLCAib25SZW1vdmVDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuY29udGFpbmVySWQgKyAiLXNlbGVjdENoaWxkIiwgdGhpcywgIm9uU2VsZWN0Q2hpbGQiKTsKK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCArICItYWRkQ2hpbGQiLCB0aGlzLCAib25BZGRDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCArICItcmVtb3ZlQ2hpbGQiLCB0aGlzLCAib25SZW1vdmVDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCArICItc2VsZWN0Q2hpbGQiLCB0aGlzLCAib25TZWxlY3RDaGlsZCIpOworCWRvam8ud2lkZ2V0LlBhZ2VDb250cm9sbGVyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgb25BZGRDaGlsZDpmdW5jdGlvbiAocGFnZSkgeworCXZhciBidXR0b24gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQodGhpcy5idXR0b25XaWRnZXQsIHtsYWJlbDpwYWdlLmxhYmVsLCBjbG9zZUJ1dHRvbjpwYWdlLmNsb3NhYmxlfSk7CisJdGhpcy5hZGRDaGlsZChidXR0b24pOworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChidXR0b24uZG9tTm9kZSk7CisJdGhpcy5wYW5lMmJ1dHRvbltwYWdlXSA9IGJ1dHRvbjsKKwlwYWdlLmNvbnRyb2xCdXR0b24gPSBidXR0b247CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYnV0dG9uLCAib25DbGljayIsIGZ1bmN0aW9uICgpIHsKKwkJX3RoaXMub25CdXR0b25DbGljayhwYWdlKTsKKwl9KTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoYnV0dG9uLCAib25DbG9zZUJ1dHRvbkNsaWNrIiwgZnVuY3Rpb24gKCkgeworCQlfdGhpcy5vbkNsb3NlQnV0dG9uQ2xpY2socGFnZSk7CisJfSk7Cit9LCBvblJlbW92ZUNoaWxkOmZ1bmN0aW9uIChwYWdlKSB7CisJaWYgKHRoaXMuX2N1cnJlbnRDaGlsZCA9PSBwYWdlKSB7CisJCXRoaXMuX2N1cnJlbnRDaGlsZCA9IG51bGw7CisJfQorCXZhciBidXR0b24gPSB0aGlzLnBhbmUyYnV0dG9uW3BhZ2VdOworCWlmIChidXR0b24pIHsKKwkJYnV0dG9uLmRlc3Ryb3koKTsKKwl9CisJdGhpcy5wYW5lMmJ1dHRvbltwYWdlXSA9IG51bGw7Cit9LCBvblNlbGVjdENoaWxkOmZ1bmN0aW9uIChwYWdlKSB7CisJaWYgKHRoaXMuX2N1cnJlbnRDaGlsZCkgeworCQl2YXIgb2xkQnV0dG9uID0gdGhpcy5wYW5lMmJ1dHRvblt0aGlzLl9jdXJyZW50Q2hpbGRdOworCQlvbGRCdXR0b24uY2xlYXJTZWxlY3RlZCgpOworCX0KKwl2YXIgbmV3QnV0dG9uID0gdGhpcy5wYW5lMmJ1dHRvbltwYWdlXTsKKwluZXdCdXR0b24uc2V0U2VsZWN0ZWQoKTsKKwl0aGlzLl9jdXJyZW50Q2hpbGQgPSBwYWdlOworfSwgb25CdXR0b25DbGljazpmdW5jdGlvbiAocGFnZSkgeworCXZhciBjb250YWluZXIgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuY29udGFpbmVySWQpOworCWNvbnRhaW5lci5zZWxlY3RDaGlsZChwYWdlLCBmYWxzZSwgdGhpcyk7Cit9LCBvbkNsb3NlQnV0dG9uQ2xpY2s6ZnVuY3Rpb24gKHBhZ2UpIHsKKwl2YXIgY29udGFpbmVyID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLmNvbnRhaW5lcklkKTsKKwljb250YWluZXIuY2xvc2VDaGlsZChwYWdlKTsKK30sIG9uS2V5OmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoKGV2dC5rZXlDb2RlID09IGV2dC5LRVlfUklHSFRfQVJST1cpIHx8IChldnQua2V5Q29kZSA9PSBldnQuS0VZX0xFRlRfQVJST1cpKSB7CisJCXZhciBjdXJyZW50ID0gMDsKKwkJdmFyIG5leHQgPSBudWxsOworCQl2YXIgY3VycmVudCA9IGRvam8ubGFuZy5maW5kKHRoaXMuY2hpbGRyZW4sIHRoaXMucGFuZTJidXR0b25bdGhpcy5fY3VycmVudENoaWxkXSk7CisJCWlmIChldnQua2V5Q29kZSA9PSBldnQuS0VZX1JJR0hUX0FSUk9XKSB7CisJCQluZXh0ID0gdGhpcy5jaGlsZHJlblsoY3VycmVudCArIDEpICUgdGhpcy5jaGlsZHJlbi5sZW5ndGhdOworCQl9IGVsc2UgeworCQkJbmV4dCA9IHRoaXMuY2hpbGRyZW5bKGN1cnJlbnQgKyAodGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKSkgJSB0aGlzLmNoaWxkcmVuLmxlbmd0aF07CisJCX0KKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQluZXh0Lm9uQ2xpY2soKTsKKwl9Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBhZ2VCdXR0b24iLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGVtcGxhdGVTdHJpbmc6IjxzcGFuIGNsYXNzPSdpdGVtJz4iICsgIjxzcGFuIGRvam9BdHRhY2hFdmVudD0nb25DbGljaycgZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIGNsYXNzPSdzZWxlY3RCdXR0b24nPiR7dGhpcy5sYWJlbH08L3NwYW4+IiArICI8c3BhbiBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6b25DbG9zZUJ1dHRvbkNsaWNrJyBjbGFzcz0nY2xvc2VCdXR0b24nPltYXTwvc3Bhbj4iICsgIjwvc3Bhbj4iLCBsYWJlbDoiZm9vIiwgY2xvc2VCdXR0b246ZmFsc2UsIG9uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMuZm9jdXMoKTsKK30sIG9uQ2xvc2VCdXR0b25Nb3VzZU92ZXI6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmNsb3NlQnV0dG9uTm9kZSwgImNsb3NlSG92ZXIiKTsKK30sIG9uQ2xvc2VCdXR0b25Nb3VzZU91dDpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuY2xvc2VCdXR0b25Ob2RlLCAiY2xvc2VIb3ZlciIpOworfSwgb25DbG9zZUJ1dHRvbkNsaWNrOmZ1bmN0aW9uIChldnQpIHsKK30sIHNldFNlbGVjdGVkOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAiY3VycmVudCIpOworCXRoaXMudGl0bGVOb2RlLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCAiMCIpOworfSwgY2xlYXJTZWxlY3RlZDpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgImN1cnJlbnQiKTsKKwl0aGlzLnRpdGxlTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwgIi0xIik7Cit9LCBmb2N1czpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMudGl0bGVOb2RlLmZvY3VzKSB7CisJCXRoaXMudGl0bGVOb2RlLmZvY3VzKCk7CisJfQorfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5XaWRnZXQsIHtsYWJlbDoiIiwgc2VsZWN0ZWQ6ZmFsc2UsIGNsb3NhYmxlOmZhbHNlLCBvbkNsb3NlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdHJ1ZTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9QYXJzZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0Y2RiYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUGFyc2UuanMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlBhcnNlIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lk1hbmFnZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kb20iKTsKK2Rvam8ud2lkZ2V0LlBhcnNlID0gZnVuY3Rpb24gKGZyYWdtZW50KSB7CisJdGhpcy5wcm9wZXJ0eVNldHNMaXN0ID0gW107CisJdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OworCXRoaXMuY3JlYXRlQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChmcmFnLCBwYXJlbnRDb21wKSB7CisJCXZhciBjb21wcyA9IFtdOworCQl2YXIgYnVpbHQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWlmIChmcmFnICYmIGZyYWcudGFnTmFtZSAmJiAoZnJhZyAhPSBmcmFnLm5vZGVSZWYpKSB7CisJCQkJdmFyIGRqVGFncyA9IGRvam8ud2lkZ2V0LnRhZ3M7CisJCQkJdmFyIHRuYSA9IFN0cmluZyhmcmFnLnRhZ05hbWUpLnNwbGl0KCI7Iik7CisJCQkJZm9yICh2YXIgeCA9IDA7IHggPCB0bmEubGVuZ3RoOyB4KyspIHsKKwkJCQkJdmFyIGx0biA9IHRuYVt4XS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpLnRvTG93ZXJDYXNlKCk7CisJCQkJCWZyYWcudGFnTmFtZSA9IGx0bjsKKwkJCQkJdmFyIHJldDsKKwkJCQkJaWYgKGRqVGFnc1tsdG5dKSB7CisJCQkJCQlidWlsdCA9IHRydWU7CisJCQkJCQlyZXQgPSBkalRhZ3NbbHRuXShmcmFnLCB0aGlzLCBwYXJlbnRDb21wLCBmcmFnLmluZGV4KTsKKwkJCQkJCWNvbXBzLnB1c2gocmV0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChsdG4uaW5kZXhPZigiOiIpID09IC0xKSB7CisJCQkJCQkJbHRuID0gImRvam86IiArIGx0bjsKKwkJCQkJCX0KKwkJCQkJCXJldCA9IGRvam8ud2lkZ2V0LmJ1aWxkV2lkZ2V0RnJvbVBhcnNlVHJlZShsdG4sIGZyYWcsIHRoaXMsIHBhcmVudENvbXAsIGZyYWcuaW5kZXgpOworCQkJCQkJaWYgKHJldCkgeworCQkJCQkJCWJ1aWx0ID0gdHJ1ZTsKKwkJCQkJCQljb21wcy5wdXNoKHJldCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LlBhcnNlOiBlcnJvcjoiLCBlKTsKKwkJfQorCQlpZiAoIWJ1aWx0KSB7CisJCQljb21wcyA9IGNvbXBzLmNvbmNhdCh0aGlzLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZywgcGFyZW50Q29tcCkpOworCQl9CisJCXJldHVybiBjb21wczsKKwl9OworCXRoaXMuY3JlYXRlU3ViQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChmcmFnbWVudCwgcGFyZW50Q29tcCkgeworCQl2YXIgZnJhZywgY29tcHMgPSBbXTsKKwkJZm9yICh2YXIgaXRlbSBpbiBmcmFnbWVudCkgeworCQkJZnJhZyA9IGZyYWdtZW50W2l0ZW1dOworCQkJaWYgKGZyYWcgJiYgdHlwZW9mIGZyYWcgPT0gIm9iamVjdCIgJiYgKGZyYWcgIT0gZnJhZ21lbnQubm9kZVJlZikgJiYgKGZyYWcgIT0gZnJhZ21lbnQudGFnTmFtZSkgJiYgKCFkb2pvLmRvbS5pc05vZGUoZnJhZykpKSB7CisJCQkJY29tcHMgPSBjb21wcy5jb25jYXQodGhpcy5jcmVhdGVDb21wb25lbnRzKGZyYWcsIHBhcmVudENvbXApKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tcHM7CisJfTsKKwl0aGlzLnBhcnNlUHJvcGVydHlTZXRzID0gZnVuY3Rpb24gKGZyYWdtZW50KSB7CisJCXJldHVybiBbXTsKKwl9OworCXRoaXMucGFyc2VQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGZyYWdtZW50KSB7CisJCXZhciBwcm9wZXJ0aWVzID0ge307CisJCWZvciAodmFyIGl0ZW0gaW4gZnJhZ21lbnQpIHsKKwkJCWlmICgoZnJhZ21lbnRbaXRlbV0gPT0gZnJhZ21lbnQudGFnTmFtZSkgfHwgKGZyYWdtZW50W2l0ZW1dID09IGZyYWdtZW50Lm5vZGVSZWYpKSB7CisJCQl9IGVsc2UgeworCQkJCXZhciBmcmFnID0gZnJhZ21lbnRbaXRlbV07CisJCQkJaWYgKGZyYWcudGFnTmFtZSAmJiBkb2pvLndpZGdldC50YWdzW2ZyYWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkgeworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChmcmFnWzBdICYmIGZyYWdbMF0udmFsdWUgIT0gIiIgJiYgZnJhZ1swXS52YWx1ZSAhPSBudWxsKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWlmIChpdGVtLnRvTG93ZXJDYXNlKCkgPT0gImRhdGFwcm92aWRlciIpIHsKKwkJCQkJCQkJdmFyIF90aGlzID0gdGhpczsKKwkJCQkJCQkJdGhpcy5nZXREYXRhUHJvdmlkZXIoX3RoaXMsIGZyYWdbMF0udmFsdWUpOworCQkJCQkJCQlwcm9wZXJ0aWVzLmRhdGFQcm92aWRlciA9IHRoaXMuZGF0YVByb3ZpZGVyOworCQkJCQkJCX0KKwkJCQkJCQlwcm9wZXJ0aWVzW2l0ZW1dID0gZnJhZ1swXS52YWx1ZTsKKwkJCQkJCQl2YXIgbmVzdGVkUHJvcGVydGllcyA9IHRoaXMucGFyc2VQcm9wZXJ0aWVzKGZyYWcpOworCQkJCQkJCWZvciAodmFyIHByb3BlcnR5IGluIG5lc3RlZFByb3BlcnRpZXMpIHsKKwkJCQkJCQkJcHJvcGVydGllc1twcm9wZXJ0eV0gPSBuZXN0ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQljYXRjaCAoZSkgeworCQkJCQkJCWRvam8uZGVidWcoZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJc3dpdGNoIChpdGVtLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkgIGNhc2UgImNoZWNrZWQiOgorCQkJCSAgY2FzZSAiZGlzYWJsZWQiOgorCQkJCQlpZiAodHlwZW9mIHByb3BlcnRpZXNbaXRlbV0gIT0gImJvb2xlYW4iKSB7CisJCQkJCQlwcm9wZXJ0aWVzW2l0ZW1dID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfTsKKwl0aGlzLmdldERhdGFQcm92aWRlciA9IGZ1bmN0aW9uIChvYmpSZWYsIGRhdGFVcmwpIHsKKwkJZG9qby5pby5iaW5kKHt1cmw6ZGF0YVVybCwgbG9hZDpmdW5jdGlvbiAodHlwZSwgZXZhbGRPYmopIHsKKwkJCWlmICh0eXBlID09ICJsb2FkIikgeworCQkJCW9ialJlZi5kYXRhUHJvdmlkZXIgPSBldmFsZE9iajsKKwkJCX0KKwkJfSwgbWltZXR5cGU6InRleHQvamF2YXNjcmlwdCIsIHN5bmM6dHJ1ZX0pOworCX07CisJdGhpcy5nZXRQcm9wZXJ0eVNldEJ5SWQgPSBmdW5jdGlvbiAocHJvcGVydHlTZXRJZCkgeworCQlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMucHJvcGVydHlTZXRzTGlzdC5sZW5ndGg7IHgrKykgeworCQkJaWYgKHByb3BlcnR5U2V0SWQgPT0gdGhpcy5wcm9wZXJ0eVNldHNMaXN0W3hdWyJpZCJdWzBdLnZhbHVlKSB7CisJCQkJcmV0dXJuIHRoaXMucHJvcGVydHlTZXRzTGlzdFt4XTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gIiI7CisJfTsKKwl0aGlzLmdldFByb3BlcnR5U2V0c0J5VHlwZSA9IGZ1bmN0aW9uIChjb21wb25lbnRUeXBlKSB7CisJCXZhciBwcm9wZXJ0eVNldHMgPSBbXTsKKwkJZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLnByb3BlcnR5U2V0c0xpc3QubGVuZ3RoOyB4KyspIHsKKwkJCXZhciBjcGwgPSB0aGlzLnByb3BlcnR5U2V0c0xpc3RbeF07CisJCQl2YXIgY3BjYyA9IGNwbC5jb21wb25lbnRDbGFzcyB8fCBjcGwuY29tcG9uZW50VHlwZSB8fCBudWxsOworCQkJdmFyIHByb3BlcnR5U2V0SWQgPSB0aGlzLnByb3BlcnR5U2V0c0xpc3RbeF1bImlkIl1bMF0udmFsdWU7CisJCQlpZiAoY3BjYyAmJiAocHJvcGVydHlTZXRJZCA9PSBjcGNjWzBdLnZhbHVlKSkgeworCQkJCXByb3BlcnR5U2V0cy5wdXNoKGNwbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb3BlcnR5U2V0czsKKwl9OworCXRoaXMuZ2V0UHJvcGVydHlTZXRzID0gZnVuY3Rpb24gKGZyYWdtZW50KSB7CisJCXZhciBwcGwgPSAiZG9qbzpwcm9wZXJ0eXByb3ZpZGVybGlzdCI7CisJCXZhciBwcm9wZXJ0eVNldHMgPSBbXTsKKwkJdmFyIHRhZ25hbWUgPSBmcmFnbWVudC50YWdOYW1lOworCQlpZiAoZnJhZ21lbnRbcHBsXSkgeworCQkJdmFyIHByb3BlcnR5UHJvdmlkZXJJZHMgPSBmcmFnbWVudFtwcGxdLnZhbHVlLnNwbGl0KCIgIik7CisJCQlmb3IgKHZhciBwcm9wZXJ0eVNldElkIGluIHByb3BlcnR5UHJvdmlkZXJJZHMpIHsKKwkJCQlpZiAoKHByb3BlcnR5U2V0SWQuaW5kZXhPZigiLi4iKSA9PSAtMSkgJiYgKHByb3BlcnR5U2V0SWQuaW5kZXhPZigiOi8vIikgPT0gLTEpKSB7CisJCQkJCXZhciBwcm9wZXJ0eVNldCA9IHRoaXMuZ2V0UHJvcGVydHlTZXRCeUlkKHByb3BlcnR5U2V0SWQpOworCQkJCQlpZiAocHJvcGVydHlTZXQgIT0gIiIpIHsKKwkJCQkJCXByb3BlcnR5U2V0cy5wdXNoKHByb3BlcnR5U2V0KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmdldFByb3BlcnR5U2V0c0J5VHlwZSh0YWduYW1lKS5jb25jYXQocHJvcGVydHlTZXRzKTsKKwl9OworCXRoaXMuY3JlYXRlQ29tcG9uZW50RnJvbVNjcmlwdCA9IGZ1bmN0aW9uIChub2RlUmVmLCBjb21wb25lbnROYW1lLCBwcm9wZXJ0aWVzLCBucykgeworCQlwcm9wZXJ0aWVzLmZhc3RNaXhJbiA9IHRydWU7CisJCXZhciBsdG4gPSAobnMgfHwgImRvam8iKSArICI6IiArIGNvbXBvbmVudE5hbWUudG9Mb3dlckNhc2UoKTsKKwkJaWYgKGRvam8ud2lkZ2V0LnRhZ3NbbHRuXSkgeworCQkJcmV0dXJuIFtkb2pvLndpZGdldC50YWdzW2x0bl0ocHJvcGVydGllcywgdGhpcywgbnVsbCwgbnVsbCwgcHJvcGVydGllcyldOworCQl9CisJCXJldHVybiBbZG9qby53aWRnZXQuYnVpbGRXaWRnZXRGcm9tUGFyc2VUcmVlKGx0biwgcHJvcGVydGllcywgdGhpcywgbnVsbCwgbnVsbCwgcHJvcGVydGllcyldOworCX07Cit9OworZG9qby53aWRnZXQuX3BhcnNlcl9jb2xsZWN0aW9uID0geyJkb2pvIjpuZXcgZG9qby53aWRnZXQuUGFyc2UoKX07Citkb2pvLndpZGdldC5nZXRQYXJzZXIgPSBmdW5jdGlvbiAobmFtZSkgeworCWlmICghbmFtZSkgeworCQluYW1lID0gImRvam8iOworCX0KKwlpZiAoIXRoaXMuX3BhcnNlcl9jb2xsZWN0aW9uW25hbWVdKSB7CisJCXRoaXMuX3BhcnNlcl9jb2xsZWN0aW9uW25hbWVdID0gbmV3IGRvam8ud2lkZ2V0LlBhcnNlKCk7CisJfQorCXJldHVybiB0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXTsKK307Citkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQgPSBmdW5jdGlvbiAobmFtZSwgcHJvcHMsIHJlZk5vZGUsIHBvc2l0aW9uKSB7CisJdmFyIGlzTm9kZSA9IGZhbHNlOworCXZhciBpc05hbWVTdHIgPSAodHlwZW9mIG5hbWUgPT0gInN0cmluZyIpOworCWlmIChpc05hbWVTdHIpIHsKKwkJdmFyIHBvcyA9IG5hbWUuaW5kZXhPZigiOiIpOworCQl2YXIgbnMgPSAocG9zID4gLTEpID8gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKSA6ICJkb2pvIjsKKwkJaWYgKHBvcyA+IC0xKSB7CisJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7CisJCX0KKwkJdmFyIGxvd2VyQ2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCXZhciBuYW1lc3BhY2VkTmFtZSA9IG5zICsgIjoiICsgbG93ZXJDYXNlTmFtZTsKKwkJaXNOb2RlID0gKGRvam8uYnlJZChuYW1lKSAmJiAhZG9qby53aWRnZXQudGFnc1tuYW1lc3BhY2VkTmFtZV0pOworCX0KKwlpZiAoKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgJiYgKGlzTm9kZSB8fCAhaXNOYW1lU3RyKSkgeworCQl2YXIgeHAgPSBuZXcgZG9qby54bWwuUGFyc2UoKTsKKwkJdmFyIHRuID0gaXNOb2RlID8gZG9qby5ieUlkKG5hbWUpIDogbmFtZTsKKwkJcmV0dXJuIGRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoeHAucGFyc2VFbGVtZW50KHRuLCBudWxsLCB0cnVlKSlbMF07CisJfQorCWZ1bmN0aW9uIGZyb21TY3JpcHQocGxhY2VLZWVwZXJOb2RlLCBuYW1lLCBwcm9wcywgbnMpIHsKKwkJcHJvcHNbbmFtZXNwYWNlZE5hbWVdID0ge2Rvam90eXBlOlt7dmFsdWU6bG93ZXJDYXNlTmFtZX1dLCBub2RlUmVmOnBsYWNlS2VlcGVyTm9kZSwgZmFzdE1peEluOnRydWV9OworCQlwcm9wcy5ucyA9IG5zOworCQlyZXR1cm4gZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlQ29tcG9uZW50RnJvbVNjcmlwdChwbGFjZUtlZXBlck5vZGUsIG5hbWUsIHByb3BzLCBucyk7CisJfQorCXByb3BzID0gcHJvcHMgfHwge307CisJdmFyIG5vdFJlZiA9IGZhbHNlOworCXZhciB0biA9IG51bGw7CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sLmNhcGFibGU7CisJaWYgKGgpIHsKKwkJdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisJfQorCWlmICghcmVmTm9kZSkgeworCQlub3RSZWYgPSB0cnVlOworCQlyZWZOb2RlID0gdG47CisJCWlmIChoKSB7CisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChyZWZOb2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwb3NpdGlvbikgeworCQkJZG9qby5kb20uaW5zZXJ0QXRQb3NpdGlvbih0biwgcmVmTm9kZSwgcG9zaXRpb24pOworCQl9IGVsc2UgeworCQkJdG4gPSByZWZOb2RlOworCQl9CisJfQorCXZhciB3aWRnZXRBcnJheSA9IGZyb21TY3JpcHQodG4sIG5hbWUudG9Mb3dlckNhc2UoKSwgcHJvcHMsIG5zKTsKKwlpZiAoKCF3aWRnZXRBcnJheSkgfHwgKCF3aWRnZXRBcnJheVswXSkgfHwgKHR5cGVvZiB3aWRnZXRBcnJheVswXS53aWRnZXRUeXBlID09ICJ1bmRlZmluZWQiKSkgeworCQl0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZVdpZGdldDogQ3JlYXRpb24gb2YgXCIiICsgbmFtZSArICJcIiB3aWRnZXQgZmFpbGVkLiIpOworCX0KKwl0cnkgeworCQlpZiAobm90UmVmICYmIHdpZGdldEFycmF5WzBdLmRvbU5vZGUucGFyZW50Tm9kZSkgeworCQkJd2lkZ2V0QXJyYXlbMF0uZG9tTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdpZGdldEFycmF5WzBdLmRvbU5vZGUpOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJCWRvam8uZGVidWcoZSk7CisJfQorCXJldHVybiB3aWRnZXRBcnJheVswXTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUG9wdXBDb250YWluZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1BvcHVwQ29udGFpbmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWIzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1BvcHVwQ29udGFpbmVyLmpzCkBAIC0wLDAgKzEsMjk3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5pZnJhbWUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UiLCBudWxsLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoID0gW107Cit9LCB7aXNTaG93aW5nTm93OmZhbHNlLCBjdXJyZW50U3VicG9wdXA6bnVsbCwgYmVnaW5aSW5kZXg6MTAwMCwgcGFyZW50UG9wdXA6bnVsbCwgcGFyZW50Om51bGwsIHBvcHVwSW5kZXg6MCwgYXJvdW5kQm94OmRvam8uaHRtbC5ib3hTaXppbmcuQk9SREVSX0JPWCwgb3BlbmVkRm9yV2luZG93Om51bGwsIHByb2Nlc3NLZXk6ZnVuY3Rpb24gKGV2dCkgeworCXJldHVybiBmYWxzZTsKK30sIGFwcGx5UG9wdXBCYXNpY1N0eWxlOmZ1bmN0aW9uICgpIHsKKwl3aXRoICh0aGlzLmRvbU5vZGUuc3R5bGUpIHsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCX0KK30sIGFib3V0VG9TaG93OmZ1bmN0aW9uICgpIHsKK30sIG9wZW46ZnVuY3Rpb24gKHgsIHksIHBhcmVudCwgZXhwbG9kZVNyYywgb3JpZW50LCBwYWRkaW5nKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nTm93KSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcykgeworCQl0aGlzLnF1ZXVlT25BbmltYXRpb25GaW5pc2gucHVzaCh0aGlzLm9wZW4sIGFyZ3VtZW50cyk7CisJCXJldHVybjsKKwl9CisJdGhpcy5hYm91dFRvU2hvdygpOworCXZhciBhcm91bmQgPSBmYWxzZSwgbm9kZSwgYXJvdW5kT3JpZW50OworCWlmICh0eXBlb2YgeCA9PSAib2JqZWN0IikgeworCQlub2RlID0geDsKKwkJYXJvdW5kT3JpZW50ID0gZXhwbG9kZVNyYzsKKwkJZXhwbG9kZVNyYyA9IHBhcmVudDsKKwkJcGFyZW50ID0geTsKKwkJYXJvdW5kID0gdHJ1ZTsKKwl9CisJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKKwlleHBsb2RlU3JjID0gZXhwbG9kZVNyYyB8fCBwYXJlbnRbImRvbU5vZGUiXSB8fCBbXTsKKwl2YXIgcGFyZW50UG9wdXAgPSBudWxsOworCXRoaXMuaXNUb3BMZXZlbCA9IHRydWU7CisJd2hpbGUgKHBhcmVudCkgeworCQlpZiAocGFyZW50ICE9PSB0aGlzICYmIChwYXJlbnQuc2V0T3BlbmVkU3VicG9wdXAgIT0gdW5kZWZpbmVkICYmIHBhcmVudC5hcHBseVBvcHVwQmFzaWNTdHlsZSAhPSB1bmRlZmluZWQpKSB7CisJCQlwYXJlbnRQb3B1cCA9IHBhcmVudDsKKwkJCXRoaXMuaXNUb3BMZXZlbCA9IGZhbHNlOworCQkJcGFyZW50UG9wdXAuc2V0T3BlbmVkU3VicG9wdXAodGhpcyk7CisJCQlicmVhazsKKwkJfQorCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50OworCX0KKwl0aGlzLnBhcmVudFBvcHVwID0gcGFyZW50UG9wdXA7CisJdGhpcy5wb3B1cEluZGV4ID0gcGFyZW50UG9wdXAgPyBwYXJlbnRQb3B1cC5wb3B1cEluZGV4ICsgMSA6IDE7CisJaWYgKHRoaXMuaXNUb3BMZXZlbCkgeworCQl2YXIgYnV0dG9uID0gZG9qby5odG1sLmlzTm9kZShleHBsb2RlU3JjKSA/IGV4cGxvZGVTcmMgOiBudWxsOworCQlkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIub3BlbmVkKHRoaXMsIGJ1dHRvbik7CisJfQorCWlmICh0aGlzLmlzVG9wTGV2ZWwgJiYgIWRvam8ud2l0aEdsb2JhbCh0aGlzLm9wZW5lZEZvcldpbmRvdyB8fCBkb2pvLmdsb2JhbCgpLCBkb2pvLmh0bWwuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSkgeworCQl0aGlzLl9ib29rbWFyayA9IGRvam8ud2l0aEdsb2JhbCh0aGlzLm9wZW5lZEZvcldpbmRvdyB8fCBkb2pvLmdsb2JhbCgpLCBkb2pvLmh0bWwuc2VsZWN0aW9uLmdldEJvb2ttYXJrKTsKKwl9IGVsc2UgeworCQl0aGlzLl9ib29rbWFyayA9IG51bGw7CisJfQorCWlmIChleHBsb2RlU3JjIGluc3RhbmNlb2YgQXJyYXkpIHsKKwkJZXhwbG9kZVNyYyA9IHtsZWZ0OmV4cGxvZGVTcmNbMF0sIHRvcDpleHBsb2RlU3JjWzFdLCB3aWR0aDowLCBoZWlnaHQ6MH07CisJfQorCXdpdGggKHRoaXMuZG9tTm9kZS5zdHlsZSkgeworCQlkaXNwbGF5ID0gIiI7CisJCXpJbmRleCA9IHRoaXMuYmVnaW5aSW5kZXggKyB0aGlzLnBvcHVwSW5kZXg7CisJfQorCWlmIChhcm91bmQpIHsKKwkJdGhpcy5tb3ZlKG5vZGUsIHBhZGRpbmcsIGFyb3VuZE9yaWVudCk7CisJfSBlbHNlIHsKKwkJdGhpcy5tb3ZlKHgsIHksIHBhZGRpbmcsIG9yaWVudCk7CisJfQorCXRoaXMuZG9tTm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXRoaXMuZXhwbG9kZVNyYyA9IGV4cGxvZGVTcmM7CisJdGhpcy5zaG93KCk7CisJdGhpcy5pc1Nob3dpbmdOb3cgPSB0cnVlOworfSwgbW92ZTpmdW5jdGlvbiAoeCwgeSwgcGFkZGluZywgb3JpZW50KSB7CisJdmFyIGFyb3VuZCA9ICh0eXBlb2YgeCA9PSAib2JqZWN0Iik7CisJaWYgKGFyb3VuZCkgeworCQl2YXIgYXJvdW5kT3JpZW50ID0gcGFkZGluZzsKKwkJdmFyIG5vZGUgPSB4OworCQlwYWRkaW5nID0geTsKKwkJaWYgKCFhcm91bmRPcmllbnQpIHsKKwkJCWFyb3VuZE9yaWVudCA9IHsiQkwiOiJUTCIsICJUTCI6IkJMIn07CisJCX0KKwkJZG9qby5odG1sLnBsYWNlT25TY3JlZW5Bcm91bmRFbGVtZW50KHRoaXMuZG9tTm9kZSwgbm9kZSwgcGFkZGluZywgdGhpcy5hcm91bmRCb3gsIGFyb3VuZE9yaWVudCk7CisJfSBlbHNlIHsKKwkJaWYgKCFvcmllbnQpIHsKKwkJCW9yaWVudCA9ICJUTCxUUixCTCxCUiI7CisJCX0KKwkJZG9qby5odG1sLnBsYWNlT25TY3JlZW4odGhpcy5kb21Ob2RlLCB4LCB5LCBwYWRkaW5nLCB0cnVlLCBvcmllbnQpOworCX0KK30sIGNsb3NlOmZ1bmN0aW9uIChmb3JjZSkgeworCWlmIChmb3JjZSkgeworCQl0aGlzLmRvbU5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl9CisJaWYgKHRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcykgeworCQl0aGlzLnF1ZXVlT25BbmltYXRpb25GaW5pc2gucHVzaCh0aGlzLmNsb3NlLCBbXSk7CisJCXJldHVybjsKKwl9CisJdGhpcy5jbG9zZVN1YnBvcHVwKGZvcmNlKTsKKwl0aGlzLmhpZGUoKTsKKwlpZiAodGhpcy5iZ0lmcmFtZSkgeworCQl0aGlzLmJnSWZyYW1lLmhpZGUoKTsKKwkJdGhpcy5iZ0lmcmFtZS5zaXplKHtsZWZ0OjAsIHRvcDowLCB3aWR0aDowLCBoZWlnaHQ6MH0pOworCX0KKwlpZiAodGhpcy5pc1RvcExldmVsKSB7CisJCWRvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5jbG9zZWQodGhpcyk7CisJfQorCXRoaXMuaXNTaG93aW5nTm93ID0gZmFsc2U7CisJaWYgKHRoaXMucGFyZW50KSB7CisJCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJCXRyeSB7CisJCQkJaWYgKHRoaXMucGFyZW50WyJmb2N1cyJdKSB7CisJCQkJCXRoaXMucGFyZW50LmZvY3VzKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5wYXJlbnQuZG9tTm9kZS5mb2N1cygpOworCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQkJZG9qby5kZWJ1ZygiTm8gaWRlYSBob3cgdG8gZm9jdXMgdG8gcGFyZW50IiwgZSk7CisJCQl9CisJCX0pLCAxMCk7CisJfQorCWlmICh0aGlzLl9ib29rbWFyayAmJiBkb2pvLndpdGhHbG9iYWwodGhpcy5vcGVuZWRGb3JXaW5kb3cgfHwgZG9qby5nbG9iYWwoKSwgZG9qby5odG1sLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCkpIHsKKwkJaWYgKHRoaXMub3BlbmVkRm9yV2luZG93KSB7CisJCQl0aGlzLm9wZW5lZEZvcldpbmRvdy5mb2N1cygpOworCQl9CisJCXRyeSB7CisJCQlkb2pvLndpdGhHbG9iYWwodGhpcy5vcGVuZWRGb3JXaW5kb3cgfHwgZG9qby5nbG9iYWwoKSwgIm1vdmVUb0Jvb2ttYXJrIiwgZG9qby5odG1sLnNlbGVjdGlvbiwgW3RoaXMuX2Jvb2ttYXJrXSk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCX0KKwl0aGlzLl9ib29rbWFyayA9IG51bGw7Cit9LCBjbG9zZUFsbDpmdW5jdGlvbiAoZm9yY2UpIHsKKwlpZiAodGhpcy5wYXJlbnRQb3B1cCkgeworCQl0aGlzLnBhcmVudFBvcHVwLmNsb3NlQWxsKGZvcmNlKTsKKwl9IGVsc2UgeworCQl0aGlzLmNsb3NlKGZvcmNlKTsKKwl9Cit9LCBzZXRPcGVuZWRTdWJwb3B1cDpmdW5jdGlvbiAocG9wdXApIHsKKwl0aGlzLmN1cnJlbnRTdWJwb3B1cCA9IHBvcHVwOworfSwgY2xvc2VTdWJwb3B1cDpmdW5jdGlvbiAoZm9yY2UpIHsKKwlpZiAodGhpcy5jdXJyZW50U3VicG9wdXAgPT0gbnVsbCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuY3VycmVudFN1YnBvcHVwLmNsb3NlKGZvcmNlKTsKKwl0aGlzLmN1cnJlbnRTdWJwb3B1cCA9IG51bGw7Cit9LCBvblNob3c6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyLnN1cGVyY2xhc3Mub25TaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5vcGVuZWRTaXplID0ge3c6dGhpcy5kb21Ob2RlLnN0eWxlLndpZHRoLCBoOnRoaXMuZG9tTm9kZS5zdHlsZS5oZWlnaHR9OworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWlmICghdGhpcy5iZ0lmcmFtZSkgeworCQkJdGhpcy5iZ0lmcmFtZSA9IG5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSgpOworCQkJdGhpcy5iZ0lmcmFtZS5zZXRaSW5kZXgodGhpcy5kb21Ob2RlKTsKKwkJfQorCQl0aGlzLmJnSWZyYW1lLnNpemUodGhpcy5kb21Ob2RlKTsKKwkJdGhpcy5iZ0lmcmFtZS5zaG93KCk7CisJfQorCXRoaXMucHJvY2Vzc1F1ZXVlKCk7Cit9LCBwcm9jZXNzUXVldWU6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoLmxlbmd0aCkgeworCQlyZXR1cm47CisJfQorCXZhciBmdW5jID0gdGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoLnNoaWZ0KCk7CisJdmFyIGFyZ3MgPSB0aGlzLnF1ZXVlT25BbmltYXRpb25GaW5pc2guc2hpZnQoKTsKKwlmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpOworfSwgb25IaWRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnByb3RvdHlwZS5vbkhpZGUuY2FsbCh0aGlzKTsKKwlpZiAodGhpcy5vcGVuZWRTaXplKSB7CisJCXdpdGggKHRoaXMuZG9tTm9kZS5zdHlsZSkgeworCQkJd2lkdGggPSB0aGlzLm9wZW5lZFNpemUudzsKKwkJCWhlaWdodCA9IHRoaXMub3BlbmVkU2l6ZS5oOworCQl9CisJfQorCXRoaXMucHJvY2Vzc1F1ZXVlKCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyIiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyQmFzZV0sIHtpc0NvbnRhaW5lcjp0cnVlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5hcHBseVBvcHVwQmFzaWNTdHlsZSgpOworCWRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK319KTsKK2Rvam8ud2lkZ2V0LlBvcHVwTWFuYWdlciA9IG5ldyBmdW5jdGlvbiAoKSB7CisJdGhpcy5jdXJyZW50TWVudSA9IG51bGw7CisJdGhpcy5jdXJyZW50QnV0dG9uID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRGb2N1c01lbnUgPSBudWxsOworCXRoaXMuZm9jdXNOb2RlID0gbnVsbDsKKwl0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzID0gW107CisJdGhpcy5yZWdpc3RlcldpbiA9IGZ1bmN0aW9uICh3aW4pIHsKKwkJaWYgKCF3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkKSB7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3Qod2luLmRvY3VtZW50LCAib25tb3VzZWRvd24iLCB0aGlzLCAib25DbGljayIpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHdpbiwgIm9uc2Nyb2xsIiwgdGhpcywgIm9uQ2xpY2siKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh3aW4uZG9jdW1lbnQsICJvbmtleSIsIHRoaXMsICJvbktleSIpOworCQkJd2luLl9fUG9wdXBNYW5hZ2VyUmVnaXN0ZXJlZCA9IHRydWU7CisJCQl0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzLnB1c2god2luKTsKKwkJfQorCX07CisJdGhpcy5yZWdpc3RlckFsbFdpbmRvd3MgPSBmdW5jdGlvbiAodGFyZ2V0V2luZG93KSB7CisJCWlmICghdGFyZ2V0V2luZG93KSB7CisJCQl0YXJnZXRXaW5kb3cgPSBkb2pvLmh0bWwuZ2V0RG9jdW1lbnRXaW5kb3cod2luZG93LnRvcCAmJiB3aW5kb3cudG9wLmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudCk7CisJCX0KKwkJdGhpcy5yZWdpc3Rlcldpbih0YXJnZXRXaW5kb3cpOworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldFdpbmRvdy5mcmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJdmFyIHdpbiA9IGRvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyh0YXJnZXRXaW5kb3cuZnJhbWVzW2ldLmRvY3VtZW50KTsKKwkJCQlpZiAod2luKSB7CisJCQkJCXRoaXMucmVnaXN0ZXJBbGxXaW5kb3dzKHdpbik7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCX0KKwkJfQorCX07CisJdGhpcy51blJlZ2lzdGVyV2luID0gZnVuY3Rpb24gKHdpbikgeworCQlpZiAod2luLl9fUG9wdXBNYW5hZ2VyUmVnaXN0ZXJlZCkgeworCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbi5kb2N1bWVudCwgIm9ubW91c2Vkb3duIiwgdGhpcywgIm9uQ2xpY2siKTsKKwkJCWRvam8uZXZlbnQuZGlzY29ubmVjdCh3aW4sICJvbnNjcm9sbCIsIHRoaXMsICJvbkNsaWNrIik7CisJCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3Qod2luLmRvY3VtZW50LCAib25rZXkiLCB0aGlzLCAib25LZXkiKTsKKwkJCXdpbi5fX1BvcHVwTWFuYWdlclJlZ2lzdGVyZWQgPSBmYWxzZTsKKwkJfQorCX07CisJdGhpcy51blJlZ2lzdGVyQWxsV2luZG93cyA9IGZ1bmN0aW9uICgpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzLmxlbmd0aDsgKytpKSB7CisJCQl0aGlzLnVuUmVnaXN0ZXJXaW4odGhpcy5yZWdpc3RlcmVkV2luZG93c1tpXSk7CisJCX0KKwkJdGhpcy5yZWdpc3RlcmVkV2luZG93cyA9IFtdOworCX07CisJZG9qby5hZGRPbkxvYWQodGhpcywgInJlZ2lzdGVyQWxsV2luZG93cyIpOworCWRvam8uYWRkT25VbmxvYWQodGhpcywgInVuUmVnaXN0ZXJBbGxXaW5kb3dzIik7CisJdGhpcy5jbG9zZWQgPSBmdW5jdGlvbiAobWVudSkgeworCQlpZiAodGhpcy5jdXJyZW50TWVudSA9PSBtZW51KSB7CisJCQl0aGlzLmN1cnJlbnRNZW51ID0gbnVsbDsKKwkJCXRoaXMuY3VycmVudEJ1dHRvbiA9IG51bGw7CisJCQl0aGlzLmN1cnJlbnRGb2N1c01lbnUgPSBudWxsOworCQl9CisJfTsKKwl0aGlzLm9wZW5lZCA9IGZ1bmN0aW9uIChtZW51LCBidXR0b24pIHsKKwkJaWYgKG1lbnUgPT0gdGhpcy5jdXJyZW50TWVudSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLmN1cnJlbnRNZW51KSB7CisJCQl0aGlzLmN1cnJlbnRNZW51LmNsb3NlKCk7CisJCX0KKwkJdGhpcy5jdXJyZW50TWVudSA9IG1lbnU7CisJCXRoaXMuY3VycmVudEZvY3VzTWVudSA9IG1lbnU7CisJCXRoaXMuY3VycmVudEJ1dHRvbiA9IGJ1dHRvbjsKKwl9OworCXRoaXMuc2V0Rm9jdXNlZE1lbnUgPSBmdW5jdGlvbiAobWVudSkgeworCQl0aGlzLmN1cnJlbnRGb2N1c01lbnUgPSBtZW51OworCX07CisJdGhpcy5vbktleSA9IGZ1bmN0aW9uIChlKSB7CisJCWlmICghZS5rZXkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXRoaXMuY3VycmVudE1lbnUgfHwgIXRoaXMuY3VycmVudE1lbnUuaXNTaG93aW5nTm93KSB7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIG0gPSB0aGlzLmN1cnJlbnRGb2N1c01lbnU7CisJCXdoaWxlIChtKSB7CisJCQlpZiAobS5wcm9jZXNzS2V5KGUpKSB7CisJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQltID0gbS5wYXJlbnRQb3B1cCB8fCBtLnBhcmVudE1lbnU7CisJCX0KKwl9LCB0aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbiAoZSkgeworCQlpZiAoIXRoaXMuY3VycmVudE1lbnUpIHsKKwkJCXJldHVybjsKKwkJfQorCQl2YXIgc2Nyb2xsb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwkJdmFyIG0gPSB0aGlzLmN1cnJlbnRNZW51OworCQl3aGlsZSAobSkgeworCQkJaWYgKGRvam8uaHRtbC5vdmVyRWxlbWVudChtLmRvbU5vZGUsIGUpIHx8IGRvam8uaHRtbC5pc0Rlc2NlbmRhbnRPZihlLnRhcmdldCwgbS5kb21Ob2RlKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCW0gPSBtLmN1cnJlbnRTdWJwb3B1cDsKKwkJfQorCQlpZiAodGhpcy5jdXJyZW50QnV0dG9uICYmIGRvam8uaHRtbC5vdmVyRWxlbWVudCh0aGlzLmN1cnJlbnRCdXR0b24sIGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5jdXJyZW50TWVudS5jbG9zZUFsbCh0cnVlKTsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Qcm9ncmVzc0Jhci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUHJvZ3Jlc3NCYXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMWUzMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUHJvZ3Jlc3NCYXIuanMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlByb2dyZXNzQmFyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHJpbmcuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlByb2dyZXNzQmFyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge3Byb2dyZXNzVmFsdWU6MCwgbWF4UHJvZ3Jlc3NWYWx1ZToxMDAsIHdpZHRoOjMwMCwgaGVpZ2h0OjMwLCBmcm9udFBlcmNlbnRDbGFzczoiZnJvbnRQZXJjZW50IiwgYmFja1BlcmNlbnRDbGFzczoiYmFja1BlcmNlbnQiLCBmcm9udEJhckNsYXNzOiJmcm9udEJhciIsIGJhY2tCYXJDbGFzczoiYmFja0JhciIsIGhhc1RleHQ6ZmFsc2UsIGlzVmVydGljYWw6ZmFsc2UsIHNob3dPbmx5SW50ZWdlcnM6ZmFsc2UsIGRhdGFTb3VyY2U6IiIsIHBvbGxJbnRlcnZhbDozMDAwLCBkdXJhdGlvbjoxMDAwLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCIgc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW5cIj5cblx0PGRpdiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6bm9uZTt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyXCIgZG9qb0F0dGFjaFBvaW50PVwiYmFja1BlcmNlbnRMYWJlbFwiIGNsYXNzPVwiZG9qb0JhY2tQZXJjZW50TGFiZWxcIj48L2Rpdj5cblx0PGRpdiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlO2hlaWdodDoxMDAlXCIgZG9qb0F0dGFjaFBvaW50PVwiaW50ZXJuYWxQcm9ncmVzc1wiPlxuXHQ8ZGl2IHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpub25lO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJmcm9udFBlcmNlbnRMYWJlbFwiIGNsYXNzPVwiZG9qb0Zyb250UGVyY2VudExhYmVsXCI+PC9kaXY+PC9kaXY+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuYmFja0Jhcntcblx0Ym9yZGVyOjFweCBzb2xpZCAjODRhM2QxO1xufVxuLmZyb250QmFye1xuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9iYXIuZ2lmXCIpIHJlcGVhdCBib3R0b20gbGVmdDtcblx0YmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDtcbn1cbi5oLWZyb250QmFye1xuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9oLWJhci5naWZcIikgcmVwZWF0IGJvdHRvbSBsZWZ0O1xuXHRiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkO1xufVxuLnNpbXBsZUZyb250QmFye1xuXHRiYWNrZ3JvdW5kOiByZWQ7XG59XG4uZnJvbnRQZXJjZW50LC5iYWNrUGVyY2VudHtcblx0Zm9udDpib2xkIDEzcHggaGVsdmV0aWNhO1xufVxuLmJhY2tQZXJjZW50e1xuXHRjb2xvcjojMjkzYTRiO1xufVxuLmZyb250UGVyY2VudHtcblx0Y29sb3I6I2ZmZjtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9Qcm9ncmVzc0Jhci5jc3MiKSwgY29udGFpbmVyTm9kZTpudWxsLCBpbnRlcm5hbFByb2dyZXNzOm51bGwsIF9waXhlbFVuaXRSYXRpbzowLCBfcGl4ZWxQZXJjZW50UmF0aW86MCwgX3VuaXRQZXJjZW50UmF0aW86MCwgX3VuaXRQaXhlbFJhdGlvOjAsIF9mbG9hdERpbWVuc2lvbjowLCBfaW50RGltZW5zaW9uOjAsIF9wcm9ncmVzc1BlcmNlbnRWYWx1ZToiMCUiLCBfZmxvYXRNYXhQcm9ncmVzc1ZhbHVlOjAsIF9kaW1lbnNpb246IndpZHRoIiwgX3BpeGVsVmFsdWU6MCwgX29JbnRlcnZhbDpudWxsLCBfYW5pbWF0aW9uOm51bGwsIF9hbmltYXRpb25TdG9wcGVkOnRydWUsIF9wcm9ncmVzc1ZhbHVlQmFrOmZhbHNlLCBfaGFzVGV4dEJhazpmYWxzZSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwl0aGlzLmludGVybmFsUHJvZ3Jlc3MuY2xhc3NOYW1lID0gdGhpcy5mcm9udEJhckNsYXNzOworCXRoaXMuY29udGFpbmVyTm9kZS5jbGFzc05hbWUgPSB0aGlzLmJhY2tCYXJDbGFzczsKKwlpZiAodGhpcy5pc1ZlcnRpY2FsKSB7CisJCXRoaXMuaW50ZXJuYWxQcm9ncmVzcy5zdHlsZS5ib3R0b20gPSAiMHB4IjsKKwkJdGhpcy5pbnRlcm5hbFByb2dyZXNzLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJdGhpcy5fZGltZW5zaW9uID0gImhlaWdodCI7CisJfSBlbHNlIHsKKwkJdGhpcy5pbnRlcm5hbFByb2dyZXNzLnN0eWxlLnRvcCA9ICIwcHgiOworCQl0aGlzLmludGVybmFsUHJvZ3Jlc3Muc3R5bGUubGVmdCA9ICIwcHgiOworCQl0aGlzLl9kaW1lbnNpb24gPSAid2lkdGgiOworCX0KKwl0aGlzLmZyb250UGVyY2VudExhYmVsLmNsYXNzTmFtZSA9IHRoaXMuZnJvbnRQZXJjZW50Q2xhc3M7CisJdGhpcy5iYWNrUGVyY2VudExhYmVsLmNsYXNzTmFtZSA9IHRoaXMuYmFja1BlcmNlbnRDbGFzczsKKwl0aGlzLnByb2dyZXNzVmFsdWUgPSAiIiArIHRoaXMucHJvZ3Jlc3NWYWx1ZTsKKwl0aGlzLmRvbU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyAicHgiOworCXRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyAicHgiOworCXRoaXMuX2ludERpbWVuc2lvbiA9IHBhcnNlSW50KCIwIiArIGV2YWwoInRoaXMuIiArIHRoaXMuX2RpbWVuc2lvbikpOworCXRoaXMuX2Zsb2F0RGltZW5zaW9uID0gcGFyc2VGbG9hdCgiMCIgKyBldmFsKCJ0aGlzLiIgKyB0aGlzLl9kaW1lbnNpb24pKTsKKwl0aGlzLl9waXhlbFBlcmNlbnRSYXRpbyA9IHRoaXMuX2Zsb2F0RGltZW5zaW9uIC8gMTAwOworCXRoaXMuc2V0TWF4UHJvZ3Jlc3NWYWx1ZSh0aGlzLm1heFByb2dyZXNzVmFsdWUsIHRydWUpOworCXRoaXMuc2V0UHJvZ3Jlc3NWYWx1ZShkb2pvLnN0cmluZy50cmltKHRoaXMucHJvZ3Jlc3NWYWx1ZSksIHRydWUpOworCWRvam8uZGVidWcoImZsb2F0IGRpbWVuc2lvbjogIiArIHRoaXMuX2Zsb2F0RGltZW5zaW9uKTsKKwlkb2pvLmRlYnVnKCJ0aGlzLl91bml0UGl4ZWxSYXRpbzogIiArIHRoaXMuX3VuaXRQaXhlbFJhdGlvKTsKKwl0aGlzLnNob3dUZXh0KHRoaXMuaGFzVGV4dCk7Cit9LCBzaG93VGV4dDpmdW5jdGlvbiAodmlzaWJsZSkgeworCWlmICh2aXNpYmxlKSB7CisJCXRoaXMuYmFja1BlcmNlbnRMYWJlbC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwkJdGhpcy5mcm9udFBlcmNlbnRMYWJlbC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwl9IGVsc2UgeworCQl0aGlzLmJhY2tQZXJjZW50TGFiZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJdGhpcy5mcm9udFBlcmNlbnRMYWJlbC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCX0KKwl0aGlzLmhhc1RleHQgPSB2aXNpYmxlOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXRoaXMucmVuZGVyKCk7Cit9LCBfYmFja3VwVmFsdWVzOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9wcm9ncmVzc1ZhbHVlQmFrID0gdGhpcy5wcm9ncmVzc1ZhbHVlOworCXRoaXMuX2hhc1RleHRCYWsgPSB0aGlzLmhhc1RleHQ7Cit9LCBfcmVzdG9yZVZhbHVlczpmdW5jdGlvbiAoKSB7CisJdGhpcy5zZXRQcm9ncmVzc1ZhbHVlKHRoaXMuX3Byb2dyZXNzVmFsdWVCYWspOworCXRoaXMuc2hvd1RleHQodGhpcy5faGFzVGV4dEJhayk7Cit9LCBfc2V0dXBBbmltYXRpb246ZnVuY3Rpb24gKCkgeworCXZhciBfc2VsZiA9IHRoaXM7CisJZG9qby5kZWJ1ZygiaW50ZXJuYWxQcm9ncmVzcyB3aWR0aDogIiArIHRoaXMuaW50ZXJuYWxQcm9ncmVzcy5zdHlsZS53aWR0aCk7CisJdGhpcy5fYW5pbWF0aW9uID0gZG9qby5sZnguaHRtbC5zbGlkZVRvKHRoaXMuaW50ZXJuYWxQcm9ncmVzcywge3RvcDowLCBsZWZ0OnBhcnNlSW50KHRoaXMud2lkdGgpIC0gcGFyc2VJbnQodGhpcy5pbnRlcm5hbFByb2dyZXNzLnN0eWxlLndpZHRoKX0sIHBhcnNlSW50KHRoaXMuZHVyYXRpb24pLCBudWxsLCBmdW5jdGlvbiAoKSB7CisJCXZhciBfYmFja0FuaW0gPSBkb2pvLmxmeC5odG1sLnNsaWRlVG8oX3NlbGYuaW50ZXJuYWxQcm9ncmVzcywge3RvcDowLCBsZWZ0OjB9LCBwYXJzZUludChfc2VsZi5kdXJhdGlvbikpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QoX2JhY2tBbmltLCAib25FbmQiLCBmdW5jdGlvbiAoKSB7CisJCQlpZiAoIV9zZWxmLl9hbmltYXRpb25TdG9wcGVkKSB7CisJCQkJX3NlbGYuX2FuaW1hdGlvbi5wbGF5KCk7CisJCQl9CisJCX0pOworCQlpZiAoIV9zZWxmLl9hbmltYXRpb25TdG9wcGVkKSB7CisJCQlfYmFja0FuaW0ucGxheSgpOworCQl9CisJCV9iYWNrQW5pbSA9IG51bGw7CisJfSk7Cit9LCBnZXRNYXhQcm9ncmVzc1ZhbHVlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5tYXhQcm9ncmVzc1ZhbHVlOworfSwgc2V0TWF4UHJvZ3Jlc3NWYWx1ZTpmdW5jdGlvbiAobWF4VmFsdWUsIG5vUmVuZGVyKSB7CisJaWYgKCF0aGlzLl9hbmltYXRpb25TdG9wcGVkKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5tYXhQcm9ncmVzc1ZhbHVlID0gbWF4VmFsdWU7CisJdGhpcy5fZmxvYXRNYXhQcm9ncmVzc1ZhbHVlID0gcGFyc2VGbG9hdCgiMCIgKyB0aGlzLm1heFByb2dyZXNzVmFsdWUpOworCXRoaXMuX3BpeGVsVW5pdFJhdGlvID0gdGhpcy5fZmxvYXREaW1lbnNpb24gLyB0aGlzLm1heFByb2dyZXNzVmFsdWU7CisJdGhpcy5fdW5pdFBlcmNlbnRSYXRpbyA9IHRoaXMuX2Zsb2F0TWF4UHJvZ3Jlc3NWYWx1ZSAvIDEwMDsKKwl0aGlzLl91bml0UGl4ZWxSYXRpbyA9IHRoaXMuX2Zsb2F0TWF4UHJvZ3Jlc3NWYWx1ZSAvIHRoaXMuX2Zsb2F0RGltZW5zaW9uOworCXRoaXMuc2V0UHJvZ3Jlc3NWYWx1ZSh0aGlzLnByb2dyZXNzVmFsdWUsIHRydWUpOworCWlmICghbm9SZW5kZXIpIHsKKwkJdGhpcy5yZW5kZXIoKTsKKwl9Cit9LCBzZXRQcm9ncmVzc1ZhbHVlOmZ1bmN0aW9uICh2YWx1ZSwgbm9SZW5kZXIpIHsKKwlpZiAoIXRoaXMuX2FuaW1hdGlvblN0b3BwZWQpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9wcm9ncmVzc1BlcmNlbnRWYWx1ZSA9ICIwJSI7CisJdmFyIF92YWx1ZSA9IGRvam8uc3RyaW5nLnRyaW0oIiIgKyB2YWx1ZSk7CisJdmFyIF9mbG9hdFZhbHVlID0gcGFyc2VGbG9hdCgiMCIgKyBfdmFsdWUpOworCXZhciBfaW50VmFsdWUgPSBwYXJzZUludCgiMCIgKyBfdmFsdWUpOworCXZhciBfcGl4ZWxWYWx1ZSA9IDA7CisJaWYgKGRvam8uc3RyaW5nLmVuZHNXaXRoKF92YWx1ZSwgIiUiLCBmYWxzZSkpIHsKKwkJdGhpcy5fcHJvZ3Jlc3NQZXJjZW50VmFsdWUgPSBNYXRoLm1pbihfZmxvYXRWYWx1ZS50b0ZpeGVkKDEpLCAxMDApICsgIiUiOworCQlfdmFsdWUgPSBNYXRoLm1pbigoX2Zsb2F0VmFsdWUpICogdGhpcy5fdW5pdFBlcmNlbnRSYXRpbywgdGhpcy5tYXhQcm9ncmVzc1ZhbHVlKTsKKwkJX3BpeGVsVmFsdWUgPSBNYXRoLm1pbigoX2Zsb2F0VmFsdWUpICogdGhpcy5fcGl4ZWxQZXJjZW50UmF0aW8sIGV2YWwoInRoaXMuIiArIHRoaXMuX2RpbWVuc2lvbikpOworCX0gZWxzZSB7CisJCXRoaXMucHJvZ3Jlc3NWYWx1ZSA9IE1hdGgubWluKF9mbG9hdFZhbHVlLCB0aGlzLm1heFByb2dyZXNzVmFsdWUpOworCQl0aGlzLl9wcm9ncmVzc1BlcmNlbnRWYWx1ZSA9IE1hdGgubWluKChfZmxvYXRWYWx1ZSAvIHRoaXMuX3VuaXRQZXJjZW50UmF0aW8pLnRvRml4ZWQoMSksIDEwMCkgKyAiJSI7CisJCV9waXhlbFZhbHVlID0gTWF0aC5taW4oX2Zsb2F0VmFsdWUgLyB0aGlzLl91bml0UGl4ZWxSYXRpbywgZXZhbCgidGhpcy4iICsgdGhpcy5fZGltZW5zaW9uKSk7CisJfQorCXRoaXMucHJvZ3Jlc3NWYWx1ZSA9IGRvam8uc3RyaW5nLnRyaW0oX3ZhbHVlKTsKKwl0aGlzLl9waXhlbFZhbHVlID0gX3BpeGVsVmFsdWU7CisJaWYgKCFub1JlbmRlcikgeworCQl0aGlzLnJlbmRlcigpOworCX0KK30sIGdldFByb2dyZXNzVmFsdWU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnByb2dyZXNzVmFsdWU7Cit9LCBnZXRQcm9ncmVzc1BlcmNlbnRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX3Byb2dyZXNzUGVyY2VudFZhbHVlOworfSwgc2V0RGF0YVNvdXJjZTpmdW5jdGlvbiAoZGF0YVNvdXJjZSkgeworCXRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7Cit9LCBzZXRQb2xsSW50ZXJ2YWw6ZnVuY3Rpb24gKHBvbGxJbnRlcnZhbCkgeworCXRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsOworfSwgc3RhcnQ6ZnVuY3Rpb24gKCkgeworCXZhciBfc2hvd0Z1bmN0aW9uID0gZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMuX3Nob3dSZW1vdGVQcm9ncmVzcyk7CisJdGhpcy5fb0ludGVydmFsID0gc2V0SW50ZXJ2YWwoX3Nob3dGdW5jdGlvbiwgdGhpcy5wb2xsSW50ZXJ2YWwpOworfSwgc3RhcnRBbmltYXRpb246ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLl9hbmltYXRpb25TdG9wcGVkKSB7CisJCXRoaXMuX2JhY2t1cFZhbHVlcygpOworCQl0aGlzLnNldFByb2dyZXNzVmFsdWUoIjEwJSIpOworCQl0aGlzLl9hbmltYXRpb25TdG9wcGVkID0gZmFsc2U7CisJCXRoaXMuX3NldHVwQW5pbWF0aW9uKCk7CisJCXRoaXMuc2hvd1RleHQoZmFsc2UpOworCQl0aGlzLmludGVybmFsUHJvZ3Jlc3Muc3R5bGUuaGVpZ2h0ID0gIjEwNSUiOworCQl0aGlzLl9hbmltYXRpb24ucGxheSgpOworCX0KK30sIHN0b3BBbmltYXRpb246ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLl9hbmltYXRpb24pIHsKKwkJdGhpcy5fYW5pbWF0aW9uU3RvcHBlZCA9IHRydWU7CisJCXRoaXMuX2FuaW1hdGlvbi5zdG9wKCk7CisJCXRoaXMuaW50ZXJuYWxQcm9ncmVzcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CisJCXRoaXMuaW50ZXJuYWxQcm9ncmVzcy5zdHlsZS5sZWZ0ID0gIjBweCI7CisJCXRoaXMuX3Jlc3RvcmVWYWx1ZXMoKTsKKwkJdGhpcy5fc2V0TGFiZWxQb3NpdGlvbigpOworCX0KK30sIF9zaG93UmVtb3RlUHJvZ3Jlc3M6ZnVuY3Rpb24gKCkgeworCXZhciBfc2VsZiA9IHRoaXM7CisJaWYgKCh0aGlzLmdldE1heFByb2dyZXNzVmFsdWUoKSA9PSB0aGlzLmdldFByb2dyZXNzVmFsdWUoKSkgJiYgdGhpcy5fb0ludGVydmFsKSB7CisJCWNsZWFySW50ZXJ2YWwodGhpcy5fb0ludGVydmFsKTsKKwkJdGhpcy5fb0ludGVydmFsID0gbnVsbDsKKwkJdGhpcy5zZXRQcm9ncmVzc1ZhbHVlKCIxMDAlIik7CisJCXJldHVybjsKKwl9CisJdmFyIGJBcmdzID0ge3VybDpfc2VsZi5kYXRhU291cmNlLCBtZXRob2Q6IlBPU1QiLCBtaW1ldHlwZToidGV4dC9qc29uIiwgZXJyb3I6ZnVuY3Rpb24gKHR5cGUsIGVycm9yT2JqKSB7CisJCWRvam8uZGVidWcoIltQcm9ncmVzc0Jhcl0gc2hvd1JlbW90ZVByb2dyZXNzIGVycm9yIik7CisJfSwgbG9hZDpmdW5jdGlvbiAodHlwZSwgZGF0YSwgZXZ0KSB7CisJCV9zZWxmLnNldFByb2dyZXNzVmFsdWUoKF9zZWxmLl9vSW50ZXJ2YWwgPyBkYXRhWyJwcm9ncmVzcyJdIDogIjEwMCUiKSk7CisJfX07CisJZG9qby5pby5iaW5kKGJBcmdzKTsKK30sIHJlbmRlcjpmdW5jdGlvbiAoKSB7CisJdGhpcy5fc2V0UGVyY2VudExhYmVsKGRvam8uc3RyaW5nLnRyaW0odGhpcy5fcHJvZ3Jlc3NQZXJjZW50VmFsdWUpKTsKKwl0aGlzLl9zZXRQaXhlbFZhbHVlKHRoaXMuX3BpeGVsVmFsdWUpOworCXRoaXMuX3NldExhYmVsUG9zaXRpb24oKTsKK30sIF9zZXRMYWJlbFBvc2l0aW9uOmZ1bmN0aW9uICgpIHsKKwl2YXIgX3dpZHRoRnJvbnQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmZyb250UGVyY2VudExhYmVsKS53aWR0aDsKKwl2YXIgX2hlaWdodEZyb250ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5mcm9udFBlcmNlbnRMYWJlbCkuaGVpZ2h0OworCXZhciBfd2lkdGhCYWNrID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5iYWNrUGVyY2VudExhYmVsKS53aWR0aDsKKwl2YXIgX2hlaWdodEJhY2sgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmJhY2tQZXJjZW50TGFiZWwpLmhlaWdodDsKKwl2YXIgX2xlZnRGcm9udCA9IChwYXJzZUludCh0aGlzLndpZHRoKSAtIF93aWR0aEZyb250KSAvIDIgKyAicHgiOworCXZhciBfYm90dG9tRnJvbnQgPSAocGFyc2VJbnQodGhpcy5oZWlnaHQpIC0gcGFyc2VJbnQoX2hlaWdodEZyb250KSkgLyAyICsgInB4IjsKKwl2YXIgX2xlZnRCYWNrID0gKHBhcnNlSW50KHRoaXMud2lkdGgpIC0gX3dpZHRoQmFjaykgLyAyICsgInB4IjsKKwl2YXIgX2JvdHRvbUJhY2sgPSAocGFyc2VJbnQodGhpcy5oZWlnaHQpIC0gcGFyc2VJbnQoX2hlaWdodEJhY2spKSAvIDIgKyAicHgiOworCXRoaXMuZnJvbnRQZXJjZW50TGFiZWwuc3R5bGUubGVmdCA9IF9sZWZ0RnJvbnQ7CisJdGhpcy5iYWNrUGVyY2VudExhYmVsLnN0eWxlLmxlZnQgPSBfbGVmdEJhY2s7CisJdGhpcy5mcm9udFBlcmNlbnRMYWJlbC5zdHlsZS5ib3R0b20gPSBfYm90dG9tRnJvbnQ7CisJdGhpcy5iYWNrUGVyY2VudExhYmVsLnN0eWxlLmJvdHRvbSA9IF9ib3R0b21CYWNrOworfSwgX3NldFBlcmNlbnRMYWJlbDpmdW5jdGlvbiAocGVyY2VudFZhbHVlKSB7CisJZG9qby5kb20ucmVtb3ZlQ2hpbGRyZW4odGhpcy5mcm9udFBlcmNlbnRMYWJlbCk7CisJZG9qby5kb20ucmVtb3ZlQ2hpbGRyZW4odGhpcy5iYWNrUGVyY2VudExhYmVsKTsKKwl2YXIgX3BlcmNlbnRWYWx1ZSA9IHRoaXMuc2hvd09ubHlJbnRlZ2VycyA9PSBmYWxzZSA/IHBlcmNlbnRWYWx1ZSA6IHBhcnNlSW50KHBlcmNlbnRWYWx1ZSkgKyAiJSI7CisJdGhpcy5mcm9udFBlcmNlbnRMYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShfcGVyY2VudFZhbHVlKSk7CisJdGhpcy5iYWNrUGVyY2VudExhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKF9wZXJjZW50VmFsdWUpKTsKK30sIF9zZXRQaXhlbFZhbHVlOmZ1bmN0aW9uICh2YWx1ZSkgeworCWV2YWwoInRoaXMuaW50ZXJuYWxQcm9ncmVzcy5zdHlsZS4iICsgdGhpcy5fZGltZW5zaW9uICsgIiA9ICIgKyB2YWx1ZSArICIgKyAncHgnIik7CisJdGhpcy5vbkNoYW5nZSgpOworfSwgb25DaGFuZ2U6ZnVuY3Rpb24gKCkgeworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JhZGlvR3JvdXAuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JhZGlvR3JvdXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4N2E1YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmFkaW9Hcm91cC5qcwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUmFkaW9Hcm91cCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuYnJvd3NlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5SYWRpb0dyb3VwIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKKwl0aGlzLml0ZW1zID0gW107CisJdGhpcy5zZWxlY3RlZCA9IFtdOworCXRoaXMuZ3JvdXBDc3NDbGFzcyA9ICJyYWRpb0dyb3VwIjsKKwl0aGlzLnNlbGVjdGVkQ3NzQ2xhc3MgPSAic2VsZWN0ZWQiOworCXRoaXMuaXRlbUNvbnRlbnRDc3NDbGFzcyA9ICJpdGVtQ29udGVudCI7Cit9LCB7aXNDb250YWluZXI6ZmFsc2UsIHRlbXBsYXRlUGF0aDpudWxsLCB0ZW1wbGF0ZUNzc1BhdGg6bnVsbCwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fcGFyc2VTdHJ1Y3R1cmUoKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzLmdyb3VwQ3NzQ2xhc3MpOworCXRoaXMuX3NldHVwQ2hpbGRyZW4oKTsKKwlkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIodGhpcy5kb21Ob2RlLCAib25jbGljayIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25TZWxlY3QiKSk7CisJaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB7CisJCXRoaXMuX3NlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pOworCX0KK30sIF9wYXJzZVN0cnVjdHVyZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZG9tTm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gInVsIiAmJiB0aGlzLmRvbU5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJvbCIpIHsKKwkJZG9qby5yYWlzZSgiUmFkaW9Hcm91cDogRXhwZWN0ZWQgdWwgb3Igb2wgY29udGVudC4iKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLml0ZW1zID0gW107CisJdmFyIG5sID0gdGhpcy5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaSIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbmwubGVuZ3RoOyBpKyspIHsKKwkJaWYgKG5sW2ldLnBhcmVudE5vZGUgPT0gdGhpcy5kb21Ob2RlKSB7CisJCQl0aGlzLml0ZW1zLnB1c2gobmxbaV0pOworCQl9CisJfQorfSwgYWRkOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKG5vZGUucGFyZW50Tm9kZSAhPSB0aGlzLmRvbU5vZGUpIHsKKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwl0aGlzLml0ZW1zLnB1c2gobm9kZSk7CisJdGhpcy5fc2V0dXAobm9kZSk7Cit9LCByZW1vdmU6ZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgaWR4ID0gLTE7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLml0ZW1zW2ldID09IG5vZGUpIHsKKwkJCWlkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaWR4IDwgMCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuaXRlbXMuc3BsaWNlKGlkeCwgMSk7CisJbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOworfSwgY2xlYXI6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykgeworCQl0aGlzLmRvbU5vZGUucmVtb3ZlQ2hpbGQodGhpcy5pdGVtc1tpXSk7CisJfQorCXRoaXMuaXRlbXMgPSBbXTsKK30sIGNsZWFyU2VsZWN0aW9uczpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLml0ZW1zW2ldLCB0aGlzLnNlbGVjdGVkQ3NzQ2xhc3MpOworCX0KKwl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7Cit9LCBfc2V0dXA6ZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihzcGFuKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3Moc3BhbiwgdGhpcy5pdGVtQ29udGVudENzc0NsYXNzKTsKKwlkb2pvLmRvbS5tb3ZlQ2hpbGRyZW4obm9kZSwgc3Bhbik7CisJbm9kZS5hcHBlbmRDaGlsZChzcGFuKTsKKwlpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPiAwKSB7CisJCXZhciB1aWQgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKG5vZGUsICJpZCIpOworCQlpZiAodWlkICYmIHVpZCA9PSB0aGlzLnNlbGVjdGVkKSB7CisJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG5vZGU7CisJCX0KKwl9CisJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKG5vZGUsICJvbmNsaWNrIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvbkl0ZW1TZWxlY3QiKSk7CisJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUobm9kZSwgIm9uaXRlbXNlbGVjdCIpKSB7CisJCXZhciB0biA9IGRvam8ubGFuZy5uYW1lQW5vbkZ1bmMobmV3IEZ1bmN0aW9uKGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUobm9kZSwgIm9uaXRlbXNlbGVjdCIpKSwgdGhpcyk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcihub2RlLCAib25jbGljayIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCB0bikpOworCX0KK30sIF9zZXR1cENoaWxkcmVuOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5fc2V0dXAodGhpcy5pdGVtc1tpXSk7CisJfQorfSwgX3NlbGVjdEl0ZW06ZnVuY3Rpb24gKG5vZGUsIGV2ZW50LCBub2ZpcmUpIHsKKwlpZiAodGhpcy5zZWxlY3RlZEl0ZW0pIHsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuc2VsZWN0ZWRJdGVtLCB0aGlzLnNlbGVjdGVkQ3NzQ2xhc3MpOworCX0KKwl0aGlzLnNlbGVjdGVkSXRlbSA9IG5vZGU7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuc2VsZWN0ZWRJdGVtLCB0aGlzLnNlbGVjdGVkQ3NzQ2xhc3MpOworCWlmICghZGpfdW5kZWYoImN1cnJlbnRUYXJnZXQiLCBldmVudCkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIW5vZmlyZSkgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJdGhpcy5zZWxlY3RlZEl0ZW0uZmlyZUV2ZW50KCJvbmNsaWNrIik7CisJCX0gZWxzZSB7CisJCQl2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpOworCQkJZS5pbml0RXZlbnQoImNsaWNrIiwgdHJ1ZSwgZmFsc2UpOworCQkJdGhpcy5zZWxlY3RlZEl0ZW0uZGlzcGF0Y2hFdmVudChlKTsKKwkJfQorCX0KK30sIGdldFZhbHVlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW07Cit9LCBvblNlbGVjdDpmdW5jdGlvbiAoZSkgeworfSwgb25JdGVtU2VsZWN0OmZ1bmN0aW9uIChlKSB7CisJaWYgKCFkal91bmRlZigiY3VycmVudFRhcmdldCIsIGUpKSB7CisJCXRoaXMuX3NlbGVjdEl0ZW0oZS5jdXJyZW50VGFyZ2V0LCBlKTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmVhbE51bWJlclRleHRib3guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JlYWxOdW1iZXJUZXh0Ym94LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTBjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JlYWxOdW1iZXJUZXh0Ym94LmpzCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlJlYWxOdW1iZXJUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkludGVnZXJUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8udmFsaWRhdGUuY29tbW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJlYWxOdW1iZXJUZXh0Ym94IiwgZG9qby53aWRnZXQuSW50ZWdlclRleHRib3gsIHttaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKGxvY2FsUHJvcGVydGllcywgZnJhZykgeworCWRvam8ud2lkZ2V0LlJlYWxOdW1iZXJUZXh0Ym94LnN1cGVyY2xhc3MubWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJaWYgKGxvY2FsUHJvcGVydGllcy5wbGFjZXMpIHsKKwkJdGhpcy5mbGFncy5wbGFjZXMgPSBOdW1iZXIobG9jYWxQcm9wZXJ0aWVzLnBsYWNlcyk7CisJfQorCWlmICgobG9jYWxQcm9wZXJ0aWVzLmV4cG9uZW50ID09ICJ0cnVlIikgfHwgKGxvY2FsUHJvcGVydGllcy5leHBvbmVudCA9PSAiYWx3YXlzIikpIHsKKwkJdGhpcy5mbGFncy5leHBvbmVudCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKChsb2NhbFByb3BlcnRpZXMuZXhwb25lbnQgPT0gImZhbHNlIikgfHwgKGxvY2FsUHJvcGVydGllcy5leHBvbmVudCA9PSAibmV2ZXIiKSkgeworCQkJdGhpcy5mbGFncy5leHBvbmVudCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJdGhpcy5mbGFncy5leHBvbmVudCA9IFt0cnVlLCBmYWxzZV07CisJCX0KKwl9CisJaWYgKChsb2NhbFByb3BlcnRpZXMuZXNpZ25lZCA9PSAidHJ1ZSIpIHx8IChsb2NhbFByb3BlcnRpZXMuZXNpZ25lZCA9PSAiYWx3YXlzIikpIHsKKwkJdGhpcy5mbGFncy5lU2lnbmVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAoKGxvY2FsUHJvcGVydGllcy5lc2lnbmVkID09ICJmYWxzZSIpIHx8IChsb2NhbFByb3BlcnRpZXMuZXNpZ25lZCA9PSAibmV2ZXIiKSkgeworCQkJdGhpcy5mbGFncy5lU2lnbmVkID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl0aGlzLmZsYWdzLmVTaWduZWQgPSBbdHJ1ZSwgZmFsc2VdOworCQl9CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMubWluKSB7CisJCXRoaXMuZmxhZ3MubWluID0gcGFyc2VGbG9hdChsb2NhbFByb3BlcnRpZXMubWluKTsKKwl9CisJaWYgKGxvY2FsUHJvcGVydGllcy5tYXgpIHsKKwkJdGhpcy5mbGFncy5tYXggPSBwYXJzZUZsb2F0KGxvY2FsUHJvcGVydGllcy5tYXgpOworCX0KK30sIGlzVmFsaWQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLnZhbGlkYXRlLmlzUmVhbE51bWJlcih0aGlzLnRleHRib3gudmFsdWUsIHRoaXMuZmxhZ3MpOworfSwgaXNJblJhbmdlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS5pc0luUmFuZ2UodGhpcy50ZXh0Ym94LnZhbHVlLCB0aGlzLmZsYWdzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SZWdleHBUZXh0Ym94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SZWdleHBUZXh0Ym94LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTlhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JlZ2V4cFRleHRib3guanMKQEAgLTAsMCArMSwyNyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUmVnZXhwVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5SZWdleHBUZXh0Ym94IiwgZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3gsIHttaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKGxvY2FsUHJvcGVydGllcywgZnJhZykgeworCWRvam8ud2lkZ2V0LlJlZ2V4cFRleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLnJlZ2V4cCkgeworCQl0aGlzLmZsYWdzLnJlZ2V4cCA9IGxvY2FsUHJvcGVydGllcy5yZWdleHA7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuZmxhZ3MpIHsKKwkJdGhpcy5mbGFncy5mbGFncyA9IGxvY2FsUHJvcGVydGllcy5mbGFnczsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwl2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCh0aGlzLmZsYWdzLnJlZ2V4cCwgdGhpcy5mbGFncy5mbGFncyk7CisJcmV0dXJuIHJlZ2V4cC50ZXN0KHRoaXMudGV4dGJveC52YWx1ZSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmVtb3RlVGFiQ29udHJvbGxlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmVtb3RlVGFiQ29udHJvbGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzBjOTNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SZW1vdGVUYWJDb250cm9sbGVyLmpzCkBAIC0wLDAgKzEsMjggQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlJlbW90ZVRhYkNvbnRyb2xsZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UYWJDb250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LlJlbW90ZVRhYkNvbnRyb2xsZXIgaXMgc2xhdGVkIGZvciByZW1vdmFsIGluIDAuNTsgdXNlIFBhZ2VDb250cm9sbGVyIG9yIFRhYkNvbnRyb2xsZXIgaW5zdGVhZC4iLCAiMC41Iik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJlbW90ZVRhYkNvbnRyb2xsZXIiLCBkb2pvLndpZGdldC5UYWJDb250cm9sbGVyLCB7dGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvUmVtb3RlVGFiQ29udHJvbGxlciB7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRvam9SZW1vdGVUYWIge1xuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xuXHRmbG9hdCA6IGxlZnQ7XG5cdHBhZGRpbmctbGVmdCA6IDlweDtcblx0Ym9yZGVyLWJvdHRvbSA6IDFweCBzb2xpZCAjNjI5MGQyO1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHR6LWluZGV4OiAzO1xufVxuXG4uZG9qb1JlbW90ZVRhYiBkaXYge1xuXHRkaXNwbGF5IDogYmxvY2s7XG5cdHBhZGRpbmcgOiA0cHggMTVweCA0cHggNnB4O1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDtcblx0Y29sb3IgOiAjMzMzO1xuXHRmb250LXNpemUgOiA5MCU7XG59XG5cbi5kb2pvUmVtb3RlVGFiUGFuZUNsb3NlIHtcblx0cG9zaXRpb24gOiBhYnNvbHV0ZTtcblx0Ym90dG9tIDogMHB4O1xuXHRyaWdodCA6IDZweDtcblx0aGVpZ2h0IDogMTJweDtcblx0d2lkdGggOiAxMnB4O1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfY2xvc2UuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wO1xufVxuXG4uZG9qb1JlbW90ZVRhYlBhbmVDbG9zZUhvdmVyIHtcblx0YmFja2dyb3VuZC1pbWFnZSA6IHVybChpbWFnZXMvdGFiX2Nsb3NlX2guZ2lmKTtcbn1cblxuLmRvam9SZW1vdGVUYWJDbG9zZSB7XG5cdGRpc3BsYXkgOiBpbmxpbmUtYmxvY2s7XG5cdGhlaWdodCA6IDEycHg7XG5cdHdpZHRoIDogMTJweDtcblx0cGFkZGluZyA6IDAgMTJweCAwIDA7XG5cdG1hcmdpbiA6IDAgLTEwcHggMCAxMHB4O1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfY2xvc2UuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wO1xuXHRjdXJzb3IgOiBkZWZhdWx0O1xufVxuXG4uZG9qb1JlbW90ZVRhYkNsb3NlSG92ZXIge1xuXHRiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGltYWdlcy90YWJfY2xvc2VfaC5naWYpO1xufVxuXG4uZG9qb1JlbW90ZVRhYi5jdXJyZW50IHtcblx0cGFkZGluZy1ib3R0b20gOiAxcHg7XG5cdGJvcmRlci1ib3R0b20gOiAwO1xuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uIDogMCAtMTUwcHg7XG59XG5cbi5kb2pvUmVtb3RlVGFiLmN1cnJlbnQgZGl2IHtcblx0cGFkZGluZy1ib3R0b20gOiA1cHg7XG5cdG1hcmdpbi1ib3R0b20gOiAtMXB4O1xuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uIDogMTAwJSAtMTUwcHg7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvUmVtb3RlVGFiQ29udHJvbC5jc3MiKSwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiZG9tTm9kZVwiIHdhaXJvbGU9XCJ0YWJsaXN0XCI+PC9kaXY+IiwgImNsYXNzIjoiZG9qb1JlbW90ZVRhYkNvbnRyb2xsZXIiLCB0YWJDb250YWluZXI6IiIsIHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKCkgeworCXRoaXMuY29udGFpbmVySWQgPSB0aGlzLnRhYkNvbnRhaW5lcjsKKwlkb2pvLndpZGdldC5SZW1vdGVUYWJDb250cm9sbGVyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsIHRoaXNbImNsYXNzIl0pOworCWlmICh0aGlzLnRhYkNvbnRhaW5lcikgeworCQlkb2pvLmFkZE9uTG9hZChkb2pvLmxhbmcuaGl0Y2godGhpcywgInNldHVwVGFicyIpKTsKKwl9CisJZG9qby53aWRnZXQuUmVtb3RlVGFiQ29udHJvbGxlci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmVwZWF0ZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JlcGVhdGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGIyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JlcGVhdGVyLmpzCkBAIC0wLDAgKzEsMTI4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5SZXBlYXRlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uc3RyaW5nIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8ud2lkZ2V0LlJlcGVhdGVyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJlcGVhdGVyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge25hbWU6IiIsIHJvd1RlbXBsYXRlOiIiLCBteU9iamVjdDpudWxsLCBwYXR0ZXJuOiIiLCB1c2VEbmQ6ZmFsc2UsIGlzQ29udGFpbmVyOnRydWUsIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwl2YXIgbm9kZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoImRvam90eXBlIik7CisJdGhpcy5zZXRSb3coZG9qby5zdHJpbmcudHJpbShub2RlLmlubmVySFRNTCksIHt9KTsKKwlub2RlLmlubmVySFRNTCA9ICIiOworCWZyYWcgPSBudWxsOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLnVzZURuZCkgeworCQlkb2pvLnJlcXVpcmUoImRvam8uZG5kLioiKTsKKwkJdmFyIGRuZCA9IG5ldyBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldCh0aGlzLmRvbU5vZGUsIFt0aGlzLndpZGdldElkXSk7CisJfQorfSwgX3JlSW5kZXhSb3dzOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5kb21Ob2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKwkJdmFyIGVsZW1zID0gWyJJTlBVVCIsICJTRUxFQ1QiLCAiVEVYVEFSRUEiXTsKKwkJZm9yICh2YXIgayA9IDA7IGsgPCBlbGVtcy5sZW5ndGg7IGsrKykgeworCQkJdmFyIGxpc3QgPSB0aGlzLmRvbU5vZGUuY2hpbGROb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtc1trXSk7CisJCQlmb3IgKHZhciBqID0gMCwgbGVuMiA9IGxpc3QubGVuZ3RoOyBqIDwgbGVuMjsgaisrKSB7CisJCQkJdmFyIG5hbWUgPSBsaXN0W2pdLm5hbWU7CisJCQkJdmFyIGluZGV4ID0gZG9qby5zdHJpbmcuZXNjYXBlKCJyZWdleHAiLCB0aGlzLnBhdHRlcm4pOworCQkJCWluZGV4ID0gaW5kZXgucmVwbGFjZSgvKCVcXFx7aW5kZXhcXFx9KS9nLCAiJXtpbmRleH0iKTsKKwkJCQl2YXIgbmFtZVJlZ2V4cCA9IGRvam8uc3RyaW5nLnN1YnN0aXR1dGVQYXJhbXMoaW5kZXgsIHsiaW5kZXgiOiJbMC05XSoifSk7CisJCQkJdmFyIG5ld05hbWUgPSBkb2pvLnN0cmluZy5zdWJzdGl0dXRlUGFyYW1zKHRoaXMucGF0dGVybiwgeyJpbmRleCI6IiIgKyBpfSk7CisJCQkJdmFyIHJlID0gbmV3IFJlZ0V4cChuYW1lUmVnZXhwLCAiZyIpOworCQkJCWxpc3Rbal0ubmFtZSA9IG5hbWUucmVwbGFjZShyZSwgbmV3TmFtZSk7CisJCQl9CisJCX0KKwl9Cit9LCBvbkRlbGV0ZVJvdzpmdW5jdGlvbiAoZSkgeworCXZhciBpbmRleCA9IGRvam8uc3RyaW5nLmVzY2FwZSgicmVnZXhwIiwgdGhpcy5wYXR0ZXJuKTsKKwlpbmRleCA9IGluZGV4LnJlcGxhY2UoLyVcXFx7aW5kZXhcXFx9L2csICIle2luZGV4fSIpOworCXZhciBuYW1lUmVnZXhwID0gZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcyhpbmRleCwgeyJpbmRleCI6IihbMC05XSopIn0pOworCXZhciByZSA9IG5ldyBSZWdFeHAobmFtZVJlZ2V4cCwgImciKTsKKwl0aGlzLmRlbGV0ZVJvdyhyZS5leGVjKGUudGFyZ2V0Lm5hbWUpWzFdKTsKK30sIGhhc1Jvd3M6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmRvbU5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBnZXRSb3dDb3VudDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsKK30sIGRlbGV0ZVJvdzpmdW5jdGlvbiAoaWR4KSB7CisJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzW2lkeF0pOworCXRoaXMuX3JlSW5kZXhSb3dzKCk7Cit9LCBfY2hhbmdlUm93UG9zaXRpb246ZnVuY3Rpb24gKGUpIHsKKwlpZiAoZS5kcmFnU3RhdHVzID09ICJkcm9wRmFpbHVyZSIpIHsKKwkJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKGVbImRyYWdTb3VyY2UiXS5kb21Ob2RlKTsKKwl9IGVsc2UgeworCQlpZiAoZS5kcmFnU3RhdHVzID09ICJkcm9wU3VjY2VzcyIpIHsKKwkJfQorCX0KKwl0aGlzLl9yZUluZGV4Um93cygpOworfSwgc2V0Um93OmZ1bmN0aW9uICh0ZW1wbGF0ZSwgbXlPYmplY3QpIHsKKwl0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoL1wlXHsoaW5kZXgpXH0vZywgIjAiKTsKKwl0aGlzLnJvd1RlbXBsYXRlID0gdGVtcGxhdGU7CisJdGhpcy5teU9iamVjdCA9IG15T2JqZWN0OworfSwgZ2V0Um93OmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5yb3dUZW1wbGF0ZTsKK30sIF9pbml0Um93OmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKHR5cGVvZiAobm9kZSkgPT0gIm51bWJlciIpIHsKKwkJbm9kZSA9IHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzW25vZGVdOworCX0KKwl2YXIgZWxlbXMgPSBbIklOUFVUIiwgIlNFTEVDVCIsICJJTUciXTsKKwlmb3IgKHZhciBrID0gMDsgayA8IGVsZW1zLmxlbmd0aDsgaysrKSB7CisJCXZhciBsaXN0ID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtc1trXSk7CisJCWZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisJCQl2YXIgY2hpbGQgPSBsaXN0W2ldOworCQkJaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjaGlsZC5nZXRBdHRyaWJ1dGUoInJvd0Z1bmN0aW9uIikgIT0gbnVsbCkgeworCQkJCWlmICh0eXBlb2YgKHRoaXMubXlPYmplY3RbY2hpbGQuZ2V0QXR0cmlidXRlKCJyb3dGdW5jdGlvbiIpXSkgPT0gInVuZGVmaW5lZCIpIHsKKwkJCQkJZG9qby5kZWJ1ZygiRnVuY3Rpb24gIiArIGNoaWxkLmdldEF0dHJpYnV0ZSgicm93RnVuY3Rpb24iKSArICIgbm90IGZvdW5kIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5teU9iamVjdFtjaGlsZC5nZXRBdHRyaWJ1dGUoInJvd0Z1bmN0aW9uIildKGNoaWxkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjaGlsZC5nZXRBdHRyaWJ1dGUoInJvd0FjdGlvbiIpICE9IG51bGwpIHsKKwkJCQkJaWYgKGNoaWxkLmdldEF0dHJpYnV0ZSgicm93QWN0aW9uIikgPT0gImRlbGV0ZSIpIHsKKwkJCQkJCWNoaWxkLm5hbWUgPSBkb2pvLnN0cmluZy5zdWJzdGl0dXRlUGFyYW1zKHRoaXMucGF0dGVybiwgeyJpbmRleCI6IiIgKyAodGhpcy5nZXRSb3dDb3VudCgpIC0gMSl9KTsKKwkJCQkJCWRvam8uZXZlbnQuY29ubmVjdChjaGlsZCwgIm9uY2xpY2siLCB0aGlzLCAib25EZWxldGVSb3ciKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30sIG9uQWRkUm93OmZ1bmN0aW9uIChlKSB7Cit9LCBhZGRSb3c6ZnVuY3Rpb24gKGRvSW5pdCkgeworCWlmICh0eXBlb2YgKGRvSW5pdCkgPT0gInVuZGVmaW5lZCIpIHsKKwkJZG9Jbml0ID0gdHJ1ZTsKKwl9CisJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisJbm9kZS5pbm5lckhUTUwgPSB0aGlzLmdldFJvdygpOworCWlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpIHsKKwkJbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKKwl9CisJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKG5vZGUpOworCXZhciBwYXJzZXIgPSBuZXcgZG9qby54bWwuUGFyc2UoKTsKKwl2YXIgZnJhZyA9IHBhcnNlci5wYXJzZUVsZW1lbnQobm9kZSwgbnVsbCwgdHJ1ZSk7CisJZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlU3ViQ29tcG9uZW50cyhmcmFnLCB0aGlzKTsKKwl0aGlzLl9yZUluZGV4Um93cygpOworCWlmIChkb0luaXQpIHsKKwkJdGhpcy5faW5pdFJvdyhub2RlKTsKKwl9CisJaWYgKHRoaXMudXNlRG5kKSB7CisJCW5vZGUgPSBuZXcgZG9qby5kbmQuSHRtbERyYWdTb3VyY2Uobm9kZSwgdGhpcy53aWRnZXRJZCk7CisJCWRvam8uZXZlbnQuY29ubmVjdChub2RlLCAib25EcmFnRW5kIiwgdGhpcywgIl9jaGFuZ2VSb3dQb3NpdGlvbiIpOworCX0KKwl0aGlzLm9uQWRkUm93KG5vZGUpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Jlc2l6YWJsZVRleHRhcmVhLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SZXNpemFibGVUZXh0YXJlYS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RkMTNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SZXNpemFibGVUZXh0YXJlYS5qcwpAQCAtMCwwICsxLDM1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5SZXNpemFibGVUZXh0YXJlYSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkxheW91dENvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5SZXNpemVIYW5kbGUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuUmVzaXphYmxlVGV4dGFyZWEiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGVtcGxhdGVTdHJpbmc6IjxkaXY+XG5cdDxkaXYgc3R5bGU9XCJib3JkZXI6IDJweCBzb2xpZCBibGFjazsgd2lkdGg6IDkwJTsgaGVpZ2h0OiAyMDBweDtcIlxuXHRcdGRvam9BdHRhY2hQb2ludD1cInJvb3RMYXlvdXROb2RlXCI+XG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJ0ZXh0QXJlYUNvbnRhaW5lck5vZGVcIiBcblx0XHRcdHN0eWxlPVwiYm9yZGVyOiAwcHg7IG1hcmdpbjogMHB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwic3RhdHVzQmFyQ29udGFpbmVyTm9kZVwiIGNsYXNzPVwic3RhdHVzQmFyXCI+XG5cdFx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInN0YXR1c0xhYmVsTm9kZVwiIFxuXHRcdFx0XHRjbGFzcz1cInN0YXR1c1BhbmVsXCJcblx0XHRcdFx0c3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAwcHg7IHotaW5kZXg6IDE7XCI+ZHJhZyB0byByZXNpemU8L2Rpdj5cblx0XHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwicmVzaXplSGFuZGxlTm9kZVwiPjwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6ImRpdi5zdGF0dXNCYXIge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlO1xuXHRoZWlnaHQ6IDI4cHg7XG5cdHBhZGRpbmc6IDFweDtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0Zm9udC1zaXplOiAxMnB4O1xufVxuXG5kaXYuc3RhdHVzUGFuZWwge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlO1xuXHRib3JkZXI6IDFweCBzb2xpZDtcblx0Ym9yZGVyLWNvbG9yOiBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0IFRocmVlREhpZ2hsaWdodCBUaHJlZURTaGFkb3c7XG5cdG1hcmdpbjogMXB4O1xuXHRwYWRkaW5nOiAycHggNnB4O1xufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL1Jlc2l6YWJsZVRleHRhcmVhLmNzcyIpLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXRoaXMudGV4dEFyZWFOb2RlID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKS5jbG9uZU5vZGUodHJ1ZSk7CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKKwl0aGlzLnJvb3RMYXlvdXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkxheW91dENvbnRhaW5lciIsIHttaW5IZWlnaHQ6NTAsIG1pbldpZHRoOjEwMH0sIHRoaXMucm9vdExheW91dE5vZGUpOworCXRoaXMudGV4dEFyZWFDb250YWluZXIgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkxheW91dENvbnRhaW5lciIsIHtsYXlvdXRBbGlnbjoiY2xpZW50In0sIHRoaXMudGV4dEFyZWFDb250YWluZXJOb2RlKTsKKwl0aGlzLnJvb3RMYXlvdXQuYWRkQ2hpbGQodGhpcy50ZXh0QXJlYUNvbnRhaW5lcik7CisJdGhpcy50ZXh0QXJlYUNvbnRhaW5lci5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMudGV4dEFyZWFOb2RlKTsKKwl3aXRoICh0aGlzLnRleHRBcmVhTm9kZS5zdHlsZSkgeworCQl3aWR0aCA9ICIxMDAlIjsKKwkJaGVpZ2h0ID0gIjEwMCUiOworCX0KKwl0aGlzLnN0YXR1c0JhciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiTGF5b3V0Q29udGFpbmVyIiwge2xheW91dEFsaWduOiJib3R0b20iLCBtaW5IZWlnaHQ6Mjh9LCB0aGlzLnN0YXR1c0JhckNvbnRhaW5lck5vZGUpOworCXRoaXMucm9vdExheW91dC5hZGRDaGlsZCh0aGlzLnN0YXR1c0Jhcik7CisJdGhpcy5zdGF0dXNMYWJlbCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiTGF5b3V0Q29udGFpbmVyIiwge2xheW91dEFsaWduOiJjbGllbnQiLCBtaW5XaWR0aDo1MH0sIHRoaXMuc3RhdHVzTGFiZWxOb2RlKTsKKwl0aGlzLnN0YXR1c0Jhci5hZGRDaGlsZCh0aGlzLnN0YXR1c0xhYmVsKTsKKwl0aGlzLnJlc2l6ZUhhbmRsZSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiUmVzaXplSGFuZGxlIiwge3RhcmdldEVsbUlkOnRoaXMucm9vdExheW91dC53aWRnZXRJZH0sIHRoaXMucmVzaXplSGFuZGxlTm9kZSk7CisJdGhpcy5zdGF0dXNCYXIuYWRkQ2hpbGQodGhpcy5yZXNpemVIYW5kbGUpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Jlc2l6ZUhhbmRsZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUmVzaXplSGFuZGxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWUwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Jlc2l6ZUhhbmRsZS5qcwpAQCAtMCwwICsxLDY4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5SZXNpemVIYW5kbGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5SZXNpemVIYW5kbGUiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGFyZ2V0RWxtSWQ6IiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZG9qb0h0bWxSZXNpemVIYW5kbGUge1xuXHRmbG9hdDogcmlnaHQ7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0cmlnaHQ6IDJweDtcblx0Ym90dG9tOiAycHg7XG5cdHdpZHRoOiAxM3B4O1xuXHRoZWlnaHQ6IDEzcHg7XG5cdHotaW5kZXg6IDIwO1xuXHRjdXJzb3I6IG53LXJlc2l6ZTtcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGdyYWJDb3JuZXIuZ2lmKTtcblx0bGluZS1oZWlnaHQ6IDBweDtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9SZXNpemVIYW5kbGUuY3NzIiksIHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiZG9qb0h0bWxSZXNpemVIYW5kbGVcIj48ZGl2PjwvZGl2PjwvZGl2PiIsIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbU5vZGUsICJvbm1vdXNlZG93biIsIHRoaXMsICJfYmVnaW5TaXppbmciKTsKK30sIF9iZWdpblNpemluZzpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLl9pc1NpemluZykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMudGFyZ2V0V2lkZ2V0ID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLnRhcmdldEVsbUlkKTsKKwl0aGlzLnRhcmdldERvbU5vZGUgPSB0aGlzLnRhcmdldFdpZGdldCA/IHRoaXMudGFyZ2V0V2lkZ2V0LmRvbU5vZGUgOiBkb2pvLmJ5SWQodGhpcy50YXJnZXRFbG1JZCk7CisJaWYgKCF0aGlzLnRhcmdldERvbU5vZGUpIHsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9pc1NpemluZyA9IHRydWU7CisJdGhpcy5zdGFydFBvaW50ID0geyJ4IjplLmNsaWVudFgsICJ5IjplLmNsaWVudFl9OworCXZhciBtYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy50YXJnZXREb21Ob2RlKTsKKwl0aGlzLnN0YXJ0U2l6ZSA9IHsidyI6bWIud2lkdGgsICJoIjptYi5oZWlnaHR9OworCWRvam8uZXZlbnQua3dDb25uZWN0KHtzcmNPYmo6ZG9qby5ib2R5KCksIHNyY0Z1bmM6Im9ubW91c2Vtb3ZlIiwgdGFyZ2V0T2JqOnRoaXMsIHRhcmdldEZ1bmM6Il9jaGFuZ2VTaXppbmciLCByYXRlOjI1fSk7CisJZG9qby5ldmVudC5jb25uZWN0KGRvam8uYm9keSgpLCAib25tb3VzZXVwIiwgdGhpcywgIl9lbmRTaXppbmciKTsKKwllLnByZXZlbnREZWZhdWx0KCk7Cit9LCBfY2hhbmdlU2l6aW5nOmZ1bmN0aW9uIChlKSB7CisJdHJ5IHsKKwkJaWYgKCFlLmNsaWVudFggfHwgIWUuY2xpZW50WSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJCXJldHVybjsKKwl9CisJdmFyIGR4ID0gdGhpcy5zdGFydFBvaW50LnggLSBlLmNsaWVudFg7CisJdmFyIGR5ID0gdGhpcy5zdGFydFBvaW50LnkgLSBlLmNsaWVudFk7CisJdmFyIG5ld1cgPSB0aGlzLnN0YXJ0U2l6ZS53IC0gZHg7CisJdmFyIG5ld0ggPSB0aGlzLnN0YXJ0U2l6ZS5oIC0gZHk7CisJaWYgKHRoaXMubWluU2l6ZSkgeworCQl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMudGFyZ2V0RG9tTm9kZSk7CisJCWlmIChuZXdXIDwgdGhpcy5taW5TaXplLncpIHsKKwkJCW5ld1cgPSBtYi53aWR0aDsKKwkJfQorCQlpZiAobmV3SCA8IHRoaXMubWluU2l6ZS5oKSB7CisJCQluZXdIID0gbWIuaGVpZ2h0OworCQl9CisJfQorCWlmICh0aGlzLnRhcmdldFdpZGdldCkgeworCQl0aGlzLnRhcmdldFdpZGdldC5yZXNpemVUbyhuZXdXLCBuZXdIKTsKKwl9IGVsc2UgeworCQlkb2pvLmh0bWwuc2V0TWFyZ2luQm94KHRoaXMudGFyZ2V0RG9tTm9kZSwge3dpZHRoOm5ld1csIGhlaWdodDpuZXdIfSk7CisJfQorCWUucHJldmVudERlZmF1bHQoKTsKK30sIF9lbmRTaXppbmc6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9qby5ib2R5KCksICJvbm1vdXNlbW92ZSIsIHRoaXMsICJfY2hhbmdlU2l6aW5nIik7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvam8uYm9keSgpLCAib25tb3VzZXVwIiwgdGhpcywgIl9lbmRTaXppbmciKTsKKwl0aGlzLl9pc1NpemluZyA9IGZhbHNlOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1JpY2hUZXh0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SaWNoVGV4dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA4NTdjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9SaWNoVGV4dC5qcwpAQCAtMCwwICsxLDExNjcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlJpY2hUZXh0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZy5leHRyYXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuVXJpIik7Citkb2pvLnJlcXVpcmUoImRvam8uRGVmZXJyZWQiKTsKK2lmICghZGpDb25maWdbInVzZVhEb21haW4iXSB8fCBkakNvbmZpZ1siYWxsb3dYZFJpY2hUZXh0U2F2ZSJdKSB7CisJaWYgKGRvam8uaG9zdGVudi5wb3N0X2xvYWRfKSB7CisJCShmdW5jdGlvbiAoKSB7CisJCQl2YXIgc2F2ZXRleHRhcmVhID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworCQkJc2F2ZXRleHRhcmVhLmlkID0gImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCI7CisJCQlzYXZldGV4dGFyZWEuc3R5bGUgPSAiZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTAwcHg7bGVmdDotMTAwcHg7aGVpZ2h0OjNweDt3aWR0aDozcHg7b3ZlcmZsb3c6aGlkZGVuOyI7CisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChzYXZldGV4dGFyZWEpOworCQl9KSgpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlkb2pvLmRvYygpLndyaXRlKCI8dGV4dGFyZWEgaWQ9XCJkb2pvLndpZGdldC5SaWNoVGV4dC5zYXZlZENvbnRlbnRcIiAiICsgInN0eWxlPVwiZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTAwcHg7bGVmdDotMTAwcHg7aGVpZ2h0OjNweDt3aWR0aDozcHg7b3ZlcmZsb3c6aGlkZGVuO1wiPjwvdGV4dGFyZWE+Iik7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJfQorCX0KK30KK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuUmljaFRleHQiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbiAoKSB7CisJdGhpcy5jb250ZW50UHJlRmlsdGVycyA9IFtdOworCXRoaXMuY29udGVudFBvc3RGaWx0ZXJzID0gW107CisJdGhpcy5jb250ZW50RG9tUHJlRmlsdGVycyA9IFtdOworCXRoaXMuY29udGVudERvbVBvc3RGaWx0ZXJzID0gW107CisJdGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzID0gW107CisJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJCXRoaXMuY29udGVudFByZUZpbHRlcnMucHVzaCh0aGlzLl9maXhDb250ZW50Rm9yTW96KTsKKwl9CisJdGhpcy5fa2V5SGFuZGxlcnMgPSB7fTsKKwlpZiAoZG9qby5EZWZlcnJlZCkgeworCQl0aGlzLm9uTG9hZERlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwl9Cit9LCB7aW5oZXJpdFdpZHRoOmZhbHNlLCBmb2N1c09uTG9hZDpmYWxzZSwgc2F2ZU5hbWU6IiIsIHN0eWxlU2hlZXRzOiIiLCBfY29udGVudDoiIiwgaGVpZ2h0OiIiLCBtaW5IZWlnaHQ6IjFlbSIsIGlzQ2xvc2VkOnRydWUsIGlzTG9hZGVkOmZhbHNlLCB1c2VBY3RpdmVYOmZhbHNlLCByZWxhdGl2ZUltYWdlVXJsczpmYWxzZSwgX1NFUEFSQVRPUjoiQEAqKiUlX19SSUNIVEVYVEJPVU5EUllfXyUlKipAQCIsIG9uTG9hZERlZmVycmVkOm51bGwsIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LlJpY2hUZXh0Ojppbml0IiwgdGhpcyk7CisJdGhpcy5vcGVuKCk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJvbktleVByZXNzZWQiLCB0aGlzLCAiYWZ0ZXJLZXlQcmVzcyIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAib25LZXlQcmVzcyIsIHRoaXMsICJrZXlQcmVzcyIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAib25LZXlEb3duIiwgdGhpcywgImtleURvd24iKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywgIm9uS2V5VXAiLCB0aGlzLCAia2V5VXAiKTsKKwl0aGlzLnNldHVwRGVmYXVsdFNob3J0Y3V0cygpOworfSwgc2V0dXBEZWZhdWx0U2hvcnRjdXRzOmZ1bmN0aW9uICgpIHsKKwl2YXIgY3RybCA9IHRoaXMuS0VZX0NUUkw7CisJdmFyIGV4ZWMgPSBmdW5jdGlvbiAoY21kLCBhcmcpIHsKKwkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT0gMSA/IGZ1bmN0aW9uICgpIHsKKwkJCXRoaXMuZXhlY0NvbW1hbmQoY21kKTsKKwkJfSA6IGZ1bmN0aW9uICgpIHsKKwkJCXRoaXMuZXhlY0NvbW1hbmQoY21kLCBhcmcpOworCQl9OworCX07CisJdGhpcy5hZGRLZXlIYW5kbGVyKCJiIiwgY3RybCwgZXhlYygiYm9sZCIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoImkiLCBjdHJsLCBleGVjKCJpdGFsaWMiKSk7CisJdGhpcy5hZGRLZXlIYW5kbGVyKCJ1IiwgY3RybCwgZXhlYygidW5kZXJsaW5lIikpOworCXRoaXMuYWRkS2V5SGFuZGxlcigiYSIsIGN0cmwsIGV4ZWMoInNlbGVjdGFsbCIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoInMiLCBjdHJsLCBmdW5jdGlvbiAoKSB7CisJCXRoaXMuc2F2ZSh0cnVlKTsKKwl9KTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoIjEiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoMSIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoIjIiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoMiIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoIjMiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoMyIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoIjQiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoNCIpKTsKKwl0aGlzLmFkZEtleUhhbmRsZXIoIlxcIiwgY3RybCwgZXhlYygiaW5zZXJ0dW5vcmRlcmVkbGlzdCIpKTsKKwlpZiAoIWRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJdGhpcy5hZGRLZXlIYW5kbGVyKCJaIiwgY3RybCwgZXhlYygicmVkbyIpKTsKKwl9Cit9LCBldmVudHM6WyJvbkJsdXIiLCAib25Gb2N1cyIsICJvbktleVByZXNzIiwgIm9uS2V5RG93biIsICJvbktleVVwIiwgIm9uQ2xpY2siXSwgb3BlbjpmdW5jdGlvbiAoZWxlbWVudCkgeworCWlmICh0aGlzLm9uTG9hZERlZmVycmVkLmZpcmVkID49IDApIHsKKwkJdGhpcy5vbkxvYWREZWZlcnJlZCA9IG5ldyBkb2pvLkRlZmVycmVkKCk7CisJfQorCXZhciBoID0gZG9qby5yZW5kZXIuaHRtbDsKKwlpZiAoIXRoaXMuaXNDbG9zZWQpIHsKKwkJdGhpcy5jbG9zZSgpOworCX0KKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LlJpY2hUZXh0OjpvcGVuIiwgdGhpcyk7CisJdGhpcy5fY29udGVudCA9ICIiOworCWlmICgoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSAmJiAoZWxlbWVudFsibm9kZU5hbWUiXSkpIHsKKwkJdGhpcy5kb21Ob2RlID0gZWxlbWVudDsKKwl9CisJaWYgKCh0aGlzLmRvbU5vZGVbIm5vZGVOYW1lIl0pICYmICh0aGlzLmRvbU5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAidGV4dGFyZWEiKSkgeworCQl0aGlzLnRleHRhcmVhID0gdGhpcy5kb21Ob2RlOworCQl2YXIgaHRtbCA9IHRoaXMuX3ByZUZpbHRlckNvbnRlbnQodGhpcy50ZXh0YXJlYS52YWx1ZSk7CisJCXRoaXMuZG9tTm9kZSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWRvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLCB0aGlzLnRleHRhcmVhKTsKKwkJdmFyIHRtcEZ1bmMgPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQkJd2l0aCAodGhpcy50ZXh0YXJlYS5zdHlsZSkgeworCQkJCWRpc3BsYXkgPSAiYmxvY2siOworCQkJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCQlsZWZ0ID0gdG9wID0gIi0xMDAwcHgiOworCQkJCWlmIChoLmllKSB7CisJCQkJCXRoaXMuX19vdmVyZmxvdyA9IG92ZXJmbG93OworCQkJCQlvdmVyZmxvdyA9ICJoaWRkZW4iOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWlmIChoLmllKSB7CisJCQlzZXRUaW1lb3V0KHRtcEZ1bmMsIDEwKTsKKwkJfSBlbHNlIHsKKwkJCXRtcEZ1bmMoKTsKKwkJfQorCQlpZiAoIWguc2FmYXJpKSB7CisJCQlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tTm9kZSwgdGhpcy50ZXh0YXJlYSk7CisJCX0KKwkJaWYgKHRoaXMudGV4dGFyZWEuZm9ybSkgeworCQkJZG9qby5ldmVudC5jb25uZWN0KCJiZWZvcmUiLCB0aGlzLnRleHRhcmVhLmZvcm0sICJvbnN1Ym1pdCIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoKSB7CisJCQkJdGhpcy50ZXh0YXJlYS52YWx1ZSA9IHRoaXMuZ2V0RWRpdG9yQ29udGVudCgpOworCQkJfSkpOworCQl9CisJCXZhciBlZGl0b3IgPSB0aGlzOworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywgInBvc3RDcmVhdGUiLCBmdW5jdGlvbiAoKSB7CisJCQlkb2pvLmh0bWwuaW5zZXJ0QWZ0ZXIoZWRpdG9yLnRleHRhcmVhLCBlZGl0b3IuZG9tTm9kZSk7CisJCX0pOworCX0gZWxzZSB7CisJCXZhciBodG1sID0gdGhpcy5fcHJlRmlsdGVyQ29udGVudChkb2pvLnN0cmluZy50cmltKHRoaXMuZG9tTm9kZS5pbm5lckhUTUwpKTsKKwl9CisJaWYgKGh0bWwgPT0gIiIpIHsKKwkJaHRtbCA9ICImbmJzcDsiOworCX0KKwl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuZG9tTm9kZSk7CisJdGhpcy5fb2xkSGVpZ2h0ID0gY29udGVudC5oZWlnaHQ7CisJdGhpcy5fb2xkV2lkdGggPSBjb250ZW50LndpZHRoOworCXRoaXMuX2ZpcnN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4gPSB0aGlzLl9nZXRDb250cmlidXRpbmdNYXJnaW4odGhpcy5kb21Ob2RlLCAidG9wIik7CisJdGhpcy5fbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luID0gdGhpcy5fZ2V0Q29udHJpYnV0aW5nTWFyZ2luKHRoaXMuZG9tTm9kZSwgImJvdHRvbSIpOworCXRoaXMuc2F2ZWRDb250ZW50ID0gaHRtbDsKKwl0aGlzLmRvbU5vZGUuaW5uZXJIVE1MID0gIiI7CisJdGhpcy5lZGl0aW5nQXJlYSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMuZWRpdGluZ0FyZWEpOworCWlmICgodGhpcy5kb21Ob2RlWyJub2RlTmFtZSJdKSAmJiAodGhpcy5kb21Ob2RlLm5vZGVOYW1lID09ICJMSSIpKSB7CisJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSAiIDxicj4iOworCX0KKwlpZiAodGhpcy5zYXZlTmFtZSAhPSAiIiAmJiAoIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gfHwgZGpDb25maWdbImFsbG93WGRSaWNoVGV4dFNhdmUiXSkpIHsKKwkJdmFyIHNhdmVUZXh0YXJlYSA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudEJ5SWQoImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCIpOworCQlpZiAoc2F2ZVRleHRhcmVhLnZhbHVlICE9ICIiKSB7CisJCQl2YXIgZGF0YXMgPSBzYXZlVGV4dGFyZWEudmFsdWUuc3BsaXQodGhpcy5fU0VQQVJBVE9SKTsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YXIgZGF0YSA9IGRhdGFzW2ldLnNwbGl0KCI6Iik7CisJCQkJaWYgKGRhdGFbMF0gPT0gdGhpcy5zYXZlTmFtZSkgeworCQkJCQlodG1sID0gZGF0YVsxXTsKKwkJCQkJZGF0YXMuc3BsaWNlKGksIDEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZG9qby5ldmVudC5jb25uZWN0KCJiZWZvcmUiLCB3aW5kb3csICJvbnVubG9hZCIsIHRoaXMsICJfc2F2ZUNvbnRlbnQiKTsKKwl9CisJaWYgKGguaWU3MCAmJiB0aGlzLnVzZUFjdGl2ZVgpIHsKKwkJZG9qby5kZWJ1ZygiYWN0aXZlWCBpbiBpZTcwIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCB1c2VBY3RpdmVYIGlzIGlnbm9yZWQgZm9yIG5vdy4iKTsKKwkJdGhpcy51c2VBY3RpdmVYID0gZmFsc2U7CisJfQorCWlmICh0aGlzLnVzZUFjdGl2ZVggJiYgaC5pZSkgeworCQl2YXIgc2VsZiA9IHRoaXM7CisJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworCQkJc2VsZi5fZHJhd09iamVjdChodG1sKTsKKwkJfSwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKGguaWUgfHwgdGhpcy5fc2FmYXJpSXNMZW9wYXJkKCkgfHwgaC5vcGVyYSkgeworCQkJdGhpcy5pZnJhbWUgPSBkb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOworCQkJdGhpcy5pZnJhbWUuc3JjID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7CisJCQl0aGlzLmVkaXRvck9iamVjdCA9IHRoaXMuaWZyYW1lOworCQkJd2l0aCAodGhpcy5pZnJhbWUuc3R5bGUpIHsKKwkJCQlib3JkZXIgPSAiMCI7CisJCQkJd2lkdGggPSAiMTAwJSI7CisJCQl9CisJCQl0aGlzLmlmcmFtZS5mcmFtZUJvcmRlciA9IDA7CisJCQl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwkJCXRoaXMud2luZG93ID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzsKKwkJCXRoaXMuZG9jdW1lbnQgPSB0aGlzLndpbmRvdy5kb2N1bWVudDsKKwkJCXRoaXMuZG9jdW1lbnQub3BlbigpOworCQkJdGhpcy5kb2N1bWVudC53cml0ZSgiPGh0bWw+PGhlYWQ+PHN0eWxlPmJvZHl7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO292ZXJmbG93OmhpZGRlbjt9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48L2Rpdj48L2JvZHk+PC9odG1sPiIpOworCQkJdGhpcy5kb2N1bWVudC5jbG9zZSgpOworCQkJdGhpcy5lZGl0Tm9kZSA9IHRoaXMuZG9jdW1lbnQuYm9keS5maXJzdENoaWxkOworCQkJdGhpcy5lZGl0Tm9kZS5jb250ZW50RWRpdGFibGUgPSB0cnVlOworCQkJd2l0aCAodGhpcy5pZnJhbWUuc3R5bGUpIHsKKwkJCQlpZiAoaC5pZTcwKSB7CisJCQkJCWlmICh0aGlzLmhlaWdodCkgeworCQkJCQkJaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMubWluSGVpZ2h0KSB7CisJCQkJCQltaW5IZWlnaHQgPSB0aGlzLm1pbkhlaWdodDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWhlaWdodCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQgOiB0aGlzLm1pbkhlaWdodDsKKwkJCQl9CisJCQl9CisJCQl2YXIgZm9ybWF0cyA9IFsicCIsICJwcmUiLCAiYWRkcmVzcyIsICJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiIsICJvbCIsICJkaXYiLCAidWwiXTsKKwkJCXZhciBsb2NhbGh0bWwgPSAiIjsKKwkJCWZvciAodmFyIGkgaW4gZm9ybWF0cykgeworCQkJCWlmIChmb3JtYXRzW2ldLmNoYXJBdCgxKSAhPSAibCIpIHsKKwkJCQkJbG9jYWxodG1sICs9ICI8IiArIGZvcm1hdHNbaV0gKyAiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC8iICsgZm9ybWF0c1tpXSArICI+IjsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbGh0bWwgKz0gIjwiICsgZm9ybWF0c1tpXSArICI+PGxpPmNvbnRlbnQ8L2xpPjwvIiArIGZvcm1hdHNbaV0gKyAiPiI7CisJCQkJfQorCQkJfQorCQkJd2l0aCAodGhpcy5lZGl0Tm9kZS5zdHlsZSkgeworCQkJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCQlsZWZ0ID0gIi0yMDAwcHgiOworCQkJCXRvcCA9ICItMjAwMHB4IjsKKwkJCX0KKwkJCXRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MID0gbG9jYWxodG1sOworCQkJdmFyIG5vZGUgPSB0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQ7CisJCQl3aGlsZSAobm9kZSkgeworCQkJCWRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywgInNlbGVjdEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbbm9kZS5maXJzdENoaWxkXSk7CisJCQkJdmFyIG5hdGl2ZW5hbWUgPSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKwkJCQl0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tuYXRpdmVuYW1lXSA9IHRoaXMucXVlcnlDb21tYW5kVmFsdWUoImZvcm1hdGJsb2NrIik7CisJCQkJdGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbdGhpcy5fbG9jYWwyTmF0aXZlRm9ybWF0TmFtZXNbbmF0aXZlbmFtZV1dID0gbmF0aXZlbmFtZTsKKwkJCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwkJCX0KKwkJCXdpdGggKHRoaXMuZWRpdE5vZGUuc3R5bGUpIHsKKwkJCQlwb3NpdGlvbiA9ICIiOworCQkJCWxlZnQgPSAiIjsKKwkJCQl0b3AgPSAiIjsKKwkJCX0KKwkJCXRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MID0gaHRtbDsKKwkJCWlmICh0aGlzLmhlaWdodCkgeworCQkJCXRoaXMuZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1kgPSAic2Nyb2xsIjsKKwkJCX0KKwkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZXZlbnRzLCBmdW5jdGlvbiAoZSkgeworCQkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmVkaXROb2RlLCBlLnRvTG93ZXJDYXNlKCksIHRoaXMsIGUpOworCQkJfSwgdGhpcyk7CisJCQl0aGlzLm9uTG9hZCgpOworCQl9IGVsc2UgeworCQkJdGhpcy5fZHJhd0lmcmFtZShodG1sKTsKKwkJCXRoaXMuZWRpdG9yT2JqZWN0ID0gdGhpcy5pZnJhbWU7CisJCX0KKwl9CisJaWYgKHRoaXMuZG9tTm9kZS5ub2RlTmFtZSA9PSAiTEkiKSB7CisJCXRoaXMuZG9tTm9kZS5sYXN0Q2hpbGQuc3R5bGUubWFyZ2luVG9wID0gIi0xLjJlbSI7CisJfQorCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsICJSaWNoVGV4dEVkaXRhYmxlIik7CisJdGhpcy5pc0Nsb3NlZCA9IGZhbHNlOworfSwgX2hhc0NvbGxhcHNlYWJsZU1hcmdpbjpmdW5jdGlvbiAoZWxlbWVudCwgc2lkZSkgeworCWlmIChkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAiYm9yZGVyLSIgKyBzaWRlICsgIi13aWR0aCIsIGZhbHNlKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKGVsZW1lbnQsICJwYWRkaW5nLSIgKyBzaWRlLCBmYWxzZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorfSwgX2dldENvbnRyaWJ1dGluZ01hcmdpbjpmdW5jdGlvbiAoZWxlbWVudCwgdG9wT3JCb3R0b20pIHsKKwlpZiAodG9wT3JCb3R0b20gPT0gInRvcCIpIHsKKwkJdmFyIHNpYmxpbmdBdHRyID0gInByZXZpb3VzU2libGluZyI7CisJCXZhciBjaGlsZFNpYmxpbmdBdHRyID0gIm5leHRTaWJsaW5nIjsKKwkJdmFyIGNoaWxkQXR0ciA9ICJmaXJzdENoaWxkIjsKKwkJdmFyIG1hcmdpblByb3AgPSAibWFyZ2luLXRvcCI7CisJCXZhciBzaWJsaW5nTWFyZ2luUHJvcCA9ICJtYXJnaW4tYm90dG9tIjsKKwl9IGVsc2UgeworCQl2YXIgc2libGluZ0F0dHIgPSAibmV4dFNpYmxpbmciOworCQl2YXIgY2hpbGRTaWJsaW5nQXR0ciA9ICJwcmV2aW91c1NpYmxpbmciOworCQl2YXIgY2hpbGRBdHRyID0gImxhc3RDaGlsZCI7CisJCXZhciBtYXJnaW5Qcm9wID0gIm1hcmdpbi1ib3R0b20iOworCQl2YXIgc2libGluZ01hcmdpblByb3AgPSAibWFyZ2luLXRvcCI7CisJfQorCXZhciBlbGVtZW50TWFyZ2luID0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUoZWxlbWVudCwgbWFyZ2luUHJvcCwgZmFsc2UpOworCWZ1bmN0aW9uIGlzU2lnbmlmaWNhbnROb2RlKGVsZW1lbnQpIHsKKwkJcmV0dXJuICEoZWxlbWVudC5ub2RlVHlwZSA9PSAzICYmIGRvam8uc3RyaW5nLmlzQmxhbmsoZWxlbWVudC5kYXRhKSkgJiYgZG9qby5odG1sLmdldFN0eWxlKGVsZW1lbnQsICJkaXNwbGF5IikgIT0gIm5vbmUiICYmICFkb2pvLmh0bWwuaXNQb3NpdGlvbkFic29sdXRlKGVsZW1lbnQpOworCX0KKwl2YXIgY2hpbGRNYXJnaW4gPSAwOworCXZhciBjaGlsZCA9IGVsZW1lbnRbY2hpbGRBdHRyXTsKKwl3aGlsZSAoY2hpbGQpIHsKKwkJd2hpbGUgKCghaXNTaWduaWZpY2FudE5vZGUoY2hpbGQpKSAmJiBjaGlsZFtjaGlsZFNpYmxpbmdBdHRyXSkgeworCQkJY2hpbGQgPSBjaGlsZFtjaGlsZFNpYmxpbmdBdHRyXTsKKwkJfQorCQljaGlsZE1hcmdpbiA9IE1hdGgubWF4KGNoaWxkTWFyZ2luLCBkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShjaGlsZCwgbWFyZ2luUHJvcCwgZmFsc2UpKTsKKwkJaWYgKCF0aGlzLl9oYXNDb2xsYXBzZWFibGVNYXJnaW4oY2hpbGQsIHRvcE9yQm90dG9tKSkgeworCQkJYnJlYWs7CisJCX0KKwkJY2hpbGQgPSBjaGlsZFtjaGlsZEF0dHJdOworCX0KKwlpZiAoIXRoaXMuX2hhc0NvbGxhcHNlYWJsZU1hcmdpbihlbGVtZW50LCB0b3BPckJvdHRvbSkpIHsKKwkJcmV0dXJuIHBhcnNlSW50KGNoaWxkTWFyZ2luKTsKKwl9CisJdmFyIGNvbnRleHRNYXJnaW4gPSAwOworCXZhciBzaWJsaW5nID0gZWxlbWVudFtzaWJsaW5nQXR0cl07CisJd2hpbGUgKHNpYmxpbmcpIHsKKwkJaWYgKGlzU2lnbmlmaWNhbnROb2RlKHNpYmxpbmcpKSB7CisJCQljb250ZXh0TWFyZ2luID0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUoc2libGluZywgc2libGluZ01hcmdpblByb3AsIGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisJCXNpYmxpbmcgPSBzaWJsaW5nW3NpYmxpbmdBdHRyXTsKKwl9CisJaWYgKCFzaWJsaW5nKSB7CisJCWNvbnRleHRNYXJnaW4gPSBkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LnBhcmVudE5vZGUsIG1hcmdpblByb3AsIGZhbHNlKTsKKwl9CisJaWYgKGNoaWxkTWFyZ2luID4gZWxlbWVudE1hcmdpbikgeworCQlyZXR1cm4gcGFyc2VJbnQoTWF0aC5tYXgoKGNoaWxkTWFyZ2luIC0gZWxlbWVudE1hcmdpbikgLSBjb250ZXh0TWFyZ2luLCAwKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfSwgX2RyYXdJZnJhbWU6ZnVuY3Rpb24gKGh0bWwpIHsKKwl2YXIgb2xkTW96ID0gQm9vbGVhbihkb2pvLnJlbmRlci5odG1sLm1veiAmJiAodHlwZW9mIHdpbmRvdy5YTUwgPT0gInVuZGVmaW5lZCIpKTsKKwlpZiAoIXRoaXMuaWZyYW1lKSB7CisJCXZhciBjdXJyZW50RG9tYWluID0gKG5ldyBkb2pvLnVyaS5VcmkoZG9qby5kb2MoKS5sb2NhdGlvbikpLmhvc3Q7CisJCXRoaXMuaWZyYW1lID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKKwkJd2l0aCAodGhpcy5pZnJhbWUpIHsKKwkJCXN0eWxlLmJvcmRlciA9ICJub25lIjsKKwkJCXN0eWxlLmxpbmVIZWlnaHQgPSAiMCI7CisJCQlzdHlsZS52ZXJ0aWNhbEFsaWduID0gImJvdHRvbSI7CisJCQlzY3JvbGxpbmcgPSB0aGlzLmhlaWdodCA/ICJhdXRvIiA6ICJubyI7CisJCX0KKwl9CisJaWYgKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gJiYgIWRqQ29uZmlnWyJkb2pvUmljaFRleHRGcmFtZVVybCJdKSB7CisJCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LlJpY2hUZXh0OiBXaGVuIHVzaW5nIGNyb3NzLWRvbWFpbiBEb2pvIGJ1aWxkcywiICsgIiBwbGVhc2Ugc2F2ZSBzcmMvd2lkZ2V0L3RlbXBsYXRlcy9yaWNodGV4dGZyYW1lLmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvUmljaFRleHRGcmFtZVVybCIgKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIHJpY2h0ZXh0ZnJhbWUuaHRtbCIpOworCX0KKwl0aGlzLmlmcmFtZS5zcmMgPSAoZGpDb25maWdbImRvam9SaWNoVGV4dEZyYW1lVXJsIl0gfHwgZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvcmljaHRleHRmcmFtZS5odG1sIikpICsgKChkb2pvLmRvYygpLmRvbWFpbiAhPSBjdXJyZW50RG9tYWluKSA/ICgiIyIgKyBkb2pvLmRvYygpLmRvbWFpbikgOiAiIik7CisJdGhpcy5pZnJhbWUud2lkdGggPSB0aGlzLmluaGVyaXRXaWR0aCA/IHRoaXMuX29sZFdpZHRoIDogIjEwMCUiOworCWlmICh0aGlzLmhlaWdodCkgeworCQl0aGlzLmlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodDsKKwl9IGVsc2UgeworCQl2YXIgaGVpZ2h0ID0gdGhpcy5fb2xkSGVpZ2h0OworCQlpZiAodGhpcy5faGFzQ29sbGFwc2VhYmxlTWFyZ2luKHRoaXMuZG9tTm9kZSwgInRvcCIpKSB7CisJCQloZWlnaHQgKz0gdGhpcy5fZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbjsKKwkJfQorCQlpZiAodGhpcy5faGFzQ29sbGFwc2VhYmxlTWFyZ2luKHRoaXMuZG9tTm9kZSwgImJvdHRvbSIpKSB7CisJCQloZWlnaHQgKz0gdGhpcy5fbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luOworCQl9CisJCXRoaXMuaWZyYW1lLmhlaWdodCA9IGhlaWdodDsKKwl9CisJdmFyIHRtcENvbnRlbnQgPSBkb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXRtcENvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDsKKwl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRtcENvbnRlbnQpOworCWlmICh0aGlzLnJlbGF0aXZlSW1hZ2VVcmxzKSB7CisJCXZhciBpbWdzID0gdG1wQ29udGVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIik7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgaW1ncy5sZW5ndGg7IGkrKykgeworCQkJaW1nc1tpXS5zcmMgPSAobmV3IGRvam8udXJpLlVyaShkb2pvLmdsb2JhbCgpLmxvY2F0aW9uLCBpbWdzW2ldLnNyYykpLnRvU3RyaW5nKCk7CisJCX0KKwkJaHRtbCA9IHRtcENvbnRlbnQuaW5uZXJIVE1MOworCX0KKwl2YXIgZmlyc3RDaGlsZCA9IGRvam8uaHRtbC5maXJzdEVsZW1lbnQodG1wQ29udGVudCk7CisJdmFyIGxhc3RDaGlsZCA9IGRvam8uaHRtbC5sYXN0RWxlbWVudCh0bXBDb250ZW50KTsKKwlpZiAoZmlyc3RDaGlsZCkgeworCQlmaXJzdENoaWxkLnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuX2ZpcnN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4gKyAicHgiOworCX0KKwlpZiAobGFzdENoaWxkKSB7CisJCWxhc3RDaGlsZC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLl9sYXN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4gKyAicHgiOworCX0KKwl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpIHsKKwkJdGhpcy5pZnJhbWUuc3JjID0gdGhpcy5pZnJhbWUuc3JjOworCX0KKwl2YXIgX2lmcmFtZUluaXRpYWxpemVkID0gZmFsc2U7CisJdmFyIGlmckZ1bmMgPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQlpZiAoIV9pZnJhbWVJbml0aWFsaXplZCkgeworCQkJX2lmcmFtZUluaXRpYWxpemVkID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXRoaXMuZWRpdE5vZGUpIHsKKwkJCWlmICh0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7CisJCQkJdGhpcy53aW5kb3cgPSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93OworCQkJCXRoaXMuZG9jdW1lbnQgPSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5pZnJhbWUuY29udGVudERvY3VtZW50KSB7CisJCQkJCXRoaXMud2luZG93ID0gdGhpcy5pZnJhbWUuY29udGVudERvY3VtZW50LndpbmRvdzsKKwkJCQkJdGhpcy5kb2N1bWVudCA9IHRoaXMuaWZyYW1lLmNvbnRlbnREb2N1bWVudDsKKwkJCQl9CisJCQl9CisJCQl2YXIgZ2V0U3R5bGUgPSAoZnVuY3Rpb24gKGRvbU5vZGUpIHsKKwkJCQlyZXR1cm4gZnVuY3Rpb24gKHN0eWxlKSB7CisJCQkJCXJldHVybiBkb2pvLmh0bWwuZ2V0U3R5bGUoZG9tTm9kZSwgc3R5bGUpOworCQkJCX07CisJCQl9KSh0aGlzLmRvbU5vZGUpOworCQkJdmFyIGZvbnQgPSBnZXRTdHlsZSgiZm9udC13ZWlnaHQiKSArICIgIiArIGdldFN0eWxlKCJmb250LXNpemUiKSArICIgIiArIGdldFN0eWxlKCJmb250LWZhbWlseSIpOworCQkJdmFyIGxpbmVIZWlnaHQgPSAiMS4wIjsKKwkJCXZhciBsaW5lSGVpZ2h0U3R5bGUgPSBkb2pvLmh0bWwuZ2V0VW5pdFZhbHVlKHRoaXMuZG9tTm9kZSwgImxpbmUtaGVpZ2h0Iik7CisJCQlpZiAobGluZUhlaWdodFN0eWxlLnZhbHVlICYmIGxpbmVIZWlnaHRTdHlsZS51bml0cyA9PSAiIikgeworCQkJCWxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0U3R5bGUudmFsdWU7CisJCQl9CisJCQlkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCgiYm9keSxodG1se2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7cGFkZGluZzowO21hcmdpbjowO30iICsgImJvZHl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7IiArICgoKHRoaXMuaGVpZ2h0KSB8fCAoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkpID8gIiIgOiAicG9zaXRpb246Zml4ZWQ7IikgKyAiZm9udDoiICsgZm9udCArICI7IiArICJtaW4taGVpZ2h0OiIgKyB0aGlzLm1pbkhlaWdodCArICI7IiArICJsaW5lLWhlaWdodDoiICsgbGluZUhlaWdodCArICJ9IiArICJwe21hcmdpbjogMWVtIDAgIWltcG9ydGFudDt9IiArICJib2R5ID4gKjpmaXJzdC1jaGlsZHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7bWFyZ2luLXRvcDoiICsgdGhpcy5fZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbiArICJweCAhaW1wb3J0YW50O30iICsgImJvZHkgPiAqOmxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206IiArIHRoaXMuX2xhc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbiArICJweCAhaW1wb3J0YW50O30iICsgImxpID4gdWw6LW1vei1maXJzdC1ub2RlLCBsaSA+IG9sOi1tb3otZmlyc3Qtbm9kZXtwYWRkaW5nLXRvcDoxLjJlbTt9XG4iICsgImxpe21pbi1oZWlnaHQ6MS4yZW07fSIgKyAiIiwgdGhpcy5kb2N1bWVudCk7CisJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZSh0bXBDb250ZW50KTsKKwkJCXRoaXMuZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBodG1sOworCQkJaWYgKG9sZE1veiB8fCBkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkgeworCQkJCXRoaXMuZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CisJCQl9CisJCQl0aGlzLm9uTG9hZCgpOworCQl9IGVsc2UgeworCQkJZG9qby5odG1sLnJlbW92ZU5vZGUodG1wQ29udGVudCk7CisJCQl0aGlzLmVkaXROb2RlLmlubmVySFRNTCA9IGh0bWw7CisJCQl0aGlzLm9uRGlzcGxheUNoYW5nZWQoKTsKKwkJfQorCX0pOworCWlmICh0aGlzLmVkaXROb2RlKSB7CisJCWlmckZ1bmMoKTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5tb3opIHsKKwkJCXRoaXMuaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKKwkJCQlzZXRUaW1lb3V0KGlmckZ1bmMsIDI1MCk7CisJCQl9OworCQl9IGVsc2UgeworCQkJdGhpcy5pZnJhbWUub25sb2FkID0gaWZyRnVuYzsKKwkJfQorCX0KK30sIF9hcHBseUVkaXRpbmdBcmVhU3R5bGVTaGVldHM6ZnVuY3Rpb24gKCkgeworCXZhciBmaWxlcyA9IFtdOworCWlmICh0aGlzLnN0eWxlU2hlZXRzKSB7CisJCWZpbGVzID0gdGhpcy5zdHlsZVNoZWV0cy5zcGxpdCgiOyIpOworCQl0aGlzLnN0eWxlU2hlZXRzID0gIiI7CisJfQorCWZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cyk7CisJdGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzID0gW107CisJaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHVybCA9IGZpbGVzW2ldOworCQkJaWYgKHVybCkgeworCQkJCXRoaXMuYWRkU3R5bGVTaGVldChkb2pvLnVyaS5kb2pvVXJpKHVybCkpOworCQkJfQorCQl9CisJfQorfSwgYWRkU3R5bGVTaGVldDpmdW5jdGlvbiAodXJpKSB7CisJdmFyIHVybCA9IHVyaS50b1N0cmluZygpOworCWlmIChkb2pvLmxhbmcuZmluZCh0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHMsIHVybCkgPiAtMSkgeworCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5SaWNoVGV4dC5hZGRTdHlsZVNoZWV0OiBTdHlsZSBzaGVldCAiICsgdXJsICsgIiBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGVkaXRpbmcgYXJlYSEiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXJsLmNoYXJBdCgwKSA9PSAiLiIgfHwgKHVybC5jaGFyQXQoMCkgIT0gIi8iICYmICF1cmkuaG9zdCkpIHsKKwkJdXJsID0gKG5ldyBkb2pvLnVyaS5VcmkoZG9qby5nbG9iYWwoKS5sb2NhdGlvbiwgdXJsKSkudG9TdHJpbmcoKTsKKwl9CisJdGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzLnB1c2godXJsKTsKKwlpZiAodGhpcy5kb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KSB7CisJCXRoaXMuZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCh1cmwpOworCX0gZWxzZSB7CisJCXZhciBoZWFkID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCQl2YXIgc3R5bGVzaGVldCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOworCQl3aXRoIChzdHlsZXNoZWV0KSB7CisJCQlyZWwgPSAic3R5bGVzaGVldCI7CisJCQl0eXBlID0gInRleHQvY3NzIjsKKwkJCWhyZWYgPSB1cmw7CisJCX0KKwkJaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTsKKwl9Cit9LCByZW1vdmVTdHlsZVNoZWV0OmZ1bmN0aW9uICh1cmkpIHsKKwl2YXIgdXJsID0gdXJpLnRvU3RyaW5nKCk7CisJaWYgKHVybC5jaGFyQXQoMCkgPT0gIi4iIHx8ICh1cmwuY2hhckF0KDApICE9ICIvIiAmJiAhdXJpLmhvc3QpKSB7CisJCXVybCA9IChuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24sIHVybCkpLnRvU3RyaW5nKCk7CisJfQorCXZhciBpbmRleCA9IGRvam8ubGFuZy5maW5kKHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cywgdXJsKTsKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuUmljaFRleHQucmVtb3ZlU3R5bGVTaGVldDogU3R5bGUgc2hlZXQgIiArIHVybCArICIgaXMgbm90IGFwcGxpZWQgdG8gdGhlIGVkaXRpbmcgYXJlYSBzbyBpdCBjYW4gbm90IGJlIHJlbW92ZWQhIik7CisJCXJldHVybjsKKwl9CisJZGVsZXRlIHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0c1tpbmRleF07CisJdmFyIGxpbmtzID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGxpbmtzW2ldLmhyZWYgPT0gdXJsKSB7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCWxpbmtzW2ldLmhyZWYgPSAiIjsKKwkJCX0KKwkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGxpbmtzW2ldKTsKKwkJCWJyZWFrOworCQl9CisJfQorfSwgX2RyYXdPYmplY3Q6ZnVuY3Rpb24gKGh0bWwpIHsKKwl0aGlzLm9iamVjdCA9IGRvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQoZG9qby5kb2MoKSwgIm9iamVjdCIpOworCXdpdGggKHRoaXMub2JqZWN0KSB7CisJCWNsYXNzaWQgPSAiY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMUQxLThEMDMtMDBBMEM5NTlCQzBBIjsKKwkJd2lkdGggPSB0aGlzLmluaGVyaXRXaWR0aCA/IHRoaXMuX29sZFdpZHRoIDogIjEwMCUiOworCQlzdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0IDogKHRoaXMuX29sZEhlaWdodCArICJweCIpOworCQlTY3JvbGxiYXJzID0gdGhpcy5oZWlnaHQgPyB0cnVlIDogZmFsc2U7CisJCUFwcGVhcmFuY2UgPSB0aGlzLl9hY3RpdmVYLmFwcGVhcmFuY2UuZmxhdDsKKwl9CisJdGhpcy5lZGl0b3JPYmplY3QgPSB0aGlzLm9iamVjdDsKKwl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMub2JqZWN0KTsKKwl0aGlzLm9iamVjdC5hdHRhY2hFdmVudCgiRG9jdW1lbnRDb21wbGV0ZSIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25Mb2FkIikpOworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZXZlbnRzLCBmdW5jdGlvbiAoZSkgeworCQl0aGlzLm9iamVjdC5hdHRhY2hFdmVudChlLnRvTG93ZXJDYXNlKCksIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBlKSk7CisJfSwgdGhpcyk7CisJdGhpcy5vYmplY3QuRG9jdW1lbnRIVE1MID0gIjwhZG9jdHlwZSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGRcIj4iICsgIjxodG1sPjx0aXRsZT48L3RpdGxlPiIgKyAiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiIgKyAiCWJvZHksaHRtbCB7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDsgfSIgKyAodGhpcy5oZWlnaHQgPyAiIiA6ICIJYm9keSwgIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIpICsgIjwvc3R5bGU+IiArICI8Ym9keT48ZGl2PiIgKyBodG1sICsgIjxkaXY+PC9ib2R5PjwvaHRtbD4iOworCXRoaXMuX2NhY2hlTG9jYWxCbG9ja0Zvcm1hdE5hbWVzKCk7Cit9LCBfbG9jYWwyTmF0aXZlRm9ybWF0TmFtZXM6e30sIF9uYXRpdmUyTG9jYWxGb3JtYXROYW1lczp7fSwgX2NhY2hlTG9jYWxCbG9ja0Zvcm1hdE5hbWVzOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuX25hdGl2ZTJMb2NhbEZvcm1hdE5hbWVzWyJwIl0pIHsKKwkJdmFyIG9iaiA9IHRoaXMub2JqZWN0OworCQl2YXIgZXJyb3IgPSBmYWxzZTsKKwkJaWYgKCFvYmopIHsKKwkJCXRyeSB7CisJCQkJb2JqID0gZG9qby5odG1sLmNyZWF0ZUV4dGVybmFsRWxlbWVudChkb2pvLmRvYygpLCAib2JqZWN0Iik7CisJCQkJb2JqLmNsYXNzaWQgPSAiY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMUQxLThEMDMtMDBBMEM5NTlCQzBBIjsKKwkJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChvYmopOworCQkJCW9iai5Eb2N1bWVudEhUTUwgPSAiPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+IjsKKwkJCX0KKwkJCWNhdGNoIChlKSB7CisJCQkJZXJyb3IgPSB0cnVlOworCQkJfQorCQl9CisJCXRyeSB7CisJCQl2YXIgb05hbWVzUGFybSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJERUdldEJsb2NrRm10TmFtZXNQYXJhbS5ERUdldEJsb2NrRm10TmFtZXNQYXJhbSIpOworCQkJb2JqLkV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFsiZ2V0YmxvY2tmb3JtYXRuYW1lcyJdLCAwLCBvTmFtZXNQYXJtKTsKKwkJCXZhciB2Yk5hbWVzQXJyYXkgPSBuZXcgVkJBcnJheShvTmFtZXNQYXJtLk5hbWVzKTsKKwkJCXZhciBsb2NhbEZvcm1hdHMgPSB2Yk5hbWVzQXJyYXkudG9BcnJheSgpOworCQkJdmFyIG5hdGl2ZUZvcm1hdHMgPSBbInAiLCAicHJlIiwgImFkZHJlc3MiLCAiaDEiLCAiaDIiLCAiaDMiLCAiaDQiLCAiaDUiLCAiaDYiLCAib2wiLCAidWwiLCAiIiwgIiIsICIiLCAiIiwgImRpdiJdOworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuYXRpdmVGb3JtYXRzLmxlbmd0aDsgKytpKSB7CisJCQkJaWYgKG5hdGl2ZUZvcm1hdHNbaV0ubGVuZ3RoID4gMCkgeworCQkJCQl0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tsb2NhbEZvcm1hdHNbaV1dID0gbmF0aXZlRm9ybWF0c1tpXTsKKwkJCQkJdGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbbmF0aXZlRm9ybWF0c1tpXV0gPSBsb2NhbEZvcm1hdHNbaV07CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCQllcnJvciA9IHRydWU7CisJCX0KKwkJaWYgKG9iaiAmJiAhdGhpcy5vYmplY3QpIHsKKwkJCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKG9iaik7CisJCX0KKwl9CisJcmV0dXJuICFlcnJvcjsKK30sIF9pc1Jlc2l6ZWQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiBmYWxzZTsKK30sIG9uTG9hZDpmdW5jdGlvbiAoZSkgeworCXRoaXMuaXNMb2FkZWQgPSB0cnVlOworCWlmICh0aGlzLm9iamVjdCkgeworCQl0aGlzLmRvY3VtZW50ID0gdGhpcy5vYmplY3QuRE9NOworCQl0aGlzLndpbmRvdyA9IHRoaXMuZG9jdW1lbnQucGFyZW50V2luZG93OworCQl0aGlzLmVkaXROb2RlID0gdGhpcy5kb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQ7CisJCXRoaXMuZWRpdGluZ0FyZWEuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodCA6IHRoaXMubWluSGVpZ2h0OworCQlpZiAoIXRoaXMuaGVpZ2h0KSB7CisJCQl0aGlzLmNvbm5lY3QodGhpcywgIm9uRGlzcGxheUNoYW5nZWQiLCAiX3VwZGF0ZUhlaWdodCIpOworCQl9CisJCXRoaXMud2luZG93Ll9mcmFtZUVsZW1lbnQgPSB0aGlzLm9iamVjdDsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5pZnJhbWUgJiYgIWRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCXRoaXMuZWRpdE5vZGUgPSB0aGlzLmRvY3VtZW50LmJvZHk7CisJCQlpZiAoIXRoaXMuaGVpZ2h0KSB7CisJCQkJdGhpcy5jb25uZWN0KHRoaXMsICJvbkRpc3BsYXlDaGFuZ2VkIiwgIl91cGRhdGVIZWlnaHQiKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZCgidXNlQ1NTIiwgZmFsc2UsIHRydWUpOworCQkJCXRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsIGZhbHNlLCBmYWxzZSk7CisJCQl9CisJCQljYXRjaCAoZTIpIHsKKwkJCX0KKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkgeworCQkJCXRoaXMuY29ubmVjdCh0aGlzLmVkaXROb2RlLCAib25ibHVyIiwgIm9uQmx1ciIpOworCQkJCXRoaXMuY29ubmVjdCh0aGlzLmVkaXROb2RlLCAib25mb2N1cyIsICJvbkZvY3VzIik7CisJCQkJdGhpcy5jb25uZWN0KHRoaXMuZWRpdE5vZGUsICJvbmNsaWNrIiwgIm9uRm9jdXMiKTsKKwkJCQl0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvbkRpc3BsYXlDaGFuZ2VkIiksIDc1MCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkb2pvLnJlbmRlci5odG1sLm1vemlsbGEgfHwgZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkgeworCQkJCQl2YXIgZG9jID0gdGhpcy5kb2N1bWVudDsKKwkJCQkJdmFyIGFkZExpc3RlbmVyID0gZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyOworCQkJCQl2YXIgc2VsZiA9IHRoaXM7CisJCQkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZXZlbnRzLCBmdW5jdGlvbiAoZSkgeworCQkJCQkJdmFyIGwgPSBhZGRMaXN0ZW5lcihzZWxmLmRvY3VtZW50LCBlLnN1YnN0cigyKS50b0xvd2VyQ2FzZSgpLCBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgZSkpOworCQkJCQkJaWYgKGUgPT0gIm9uQmx1ciIpIHsKKwkJCQkJCQl2YXIgdW5CbHVyID0ge3VuQmx1cjpmdW5jdGlvbiAoZSkgeworCQkJCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIucmVtb3ZlTGlzdGVuZXIoZG9jLCAiYmx1ciIsIGwpOworCQkJCQkJCX19OworCQkJCQkJCWRvam8uZXZlbnQuY29ubmVjdCgiYmVmb3JlIiwgc2VsZiwgImNsb3NlIiwgdW5CbHVyLCAidW5CbHVyIik7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJaWYgKCF0aGlzLmhlaWdodCkgeworCQkJCQl0aGlzLmNvbm5lY3QodGhpcywgIm9uRGlzcGxheUNoYW5nZWQiLCAiX3VwZGF0ZUhlaWdodCIpOworCQkJCX0KKwkJCQl0aGlzLmVkaXROb2RlLnN0eWxlLnpvb20gPSAxOworCQkJfQorCQl9CisJfQorCXRoaXMuX2FwcGx5RWRpdGluZ0FyZWFTdHlsZVNoZWV0cygpOworCWlmICh0aGlzLmZvY3VzT25Mb2FkKSB7CisJCXRoaXMuZm9jdXMoKTsKKwl9CisJdGhpcy5vbkRpc3BsYXlDaGFuZ2VkKGUpOworCWlmICh0aGlzLm9uTG9hZERlZmVycmVkKSB7CisJCXRoaXMub25Mb2FkRGVmZXJyZWQuY2FsbGJhY2sodHJ1ZSk7CisJfQorfSwgb25LZXlEb3duOmZ1bmN0aW9uIChlKSB7CisJaWYgKCghZSkgJiYgKHRoaXMub2JqZWN0KSkgeworCQllID0gZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KHRoaXMud2luZG93LmV2ZW50KTsKKwl9CisJaWYgKChkb2pvLnJlbmRlci5odG1sLmllKSAmJiAoZS5rZXlDb2RlID09IGUuS0VZX1RBQikpIHsKKwkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQllLnN0b3BQcm9wYWdhdGlvbigpOworCQl0aGlzLmV4ZWNDb21tYW5kKChlLnNoaWZ0S2V5ID8gIm91dGRlbnQiIDogImluZGVudCIpKTsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJaWYgKCg2NSA8PSBlLmtleUNvZGUpICYmIChlLmtleUNvZGUgPD0gOTApKSB7CisJCQkJZS5jaGFyQ29kZSA9IGUua2V5Q29kZTsKKwkJCQl0aGlzLm9uS2V5UHJlc3MoZSk7CisJCQl9CisJCX0KKwl9Cit9LCBvbktleVVwOmZ1bmN0aW9uIChlKSB7CisJcmV0dXJuOworfSwgS0VZX0NUUkw6MSwgb25LZXlQcmVzczpmdW5jdGlvbiAoZSkgeworCWlmICgoIWUpICYmICh0aGlzLm9iamVjdCkpIHsKKwkJZSA9IGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudCh0aGlzLndpbmRvdy5ldmVudCk7CisJfQorCXZhciBtb2RpZmllcnMgPSBlLmN0cmxLZXkgPyB0aGlzLktFWV9DVFJMIDogMDsKKwlpZiAodGhpcy5fa2V5SGFuZGxlcnNbZS5rZXldKSB7CisJCXZhciBoYW5kbGVycyA9IHRoaXMuX2tleUhhbmRsZXJzW2Uua2V5XSwgaSA9IDAsIGhhbmRsZXI7CisJCXdoaWxlIChoYW5kbGVyID0gaGFuZGxlcnNbaSsrXSkgeworCQkJaWYgKG1vZGlmaWVycyA9PSBoYW5kbGVyLm1vZGlmaWVycykgeworCQkJCWUucHJldmVudERlZmF1bHQoKTsKKwkJCQloYW5kbGVyLmhhbmRsZXIuY2FsbCh0aGlzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCB0aGlzLm9uS2V5UHJlc3NlZCwgMSwgZSk7Cit9LCBhZGRLZXlIYW5kbGVyOmZ1bmN0aW9uIChrZXksIG1vZGlmaWVycywgaGFuZGxlcikgeworCWlmICghKHRoaXMuX2tleUhhbmRsZXJzW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHsKKwkJdGhpcy5fa2V5SGFuZGxlcnNba2V5XSA9IFtdOworCX0KKwl0aGlzLl9rZXlIYW5kbGVyc1trZXldLnB1c2goe21vZGlmaWVyczptb2RpZmllcnMgfHwgMCwgaGFuZGxlcjpoYW5kbGVyfSk7Cit9LCBvbktleVByZXNzZWQ6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLm9uRGlzcGxheUNoYW5nZWQoKTsKK30sIG9uQ2xpY2s6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLm9uRGlzcGxheUNoYW5nZWQoZSk7Cit9LCBvbkJsdXI6ZnVuY3Rpb24gKGUpIHsKK30sIF9pbml0aWFsRm9jdXM6dHJ1ZSwgb25Gb2N1czpmdW5jdGlvbiAoZSkgeworCWlmICgoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKSAmJiAodGhpcy5faW5pdGlhbEZvY3VzKSkgeworCQl0aGlzLl9pbml0aWFsRm9jdXMgPSBmYWxzZTsKKwkJaWYgKGRvam8uc3RyaW5nLnRyaW0odGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwpID09ICImbmJzcDsiKSB7CisJCQl0aGlzLnBsYWNlQ3Vyc29yQXRTdGFydCgpOworCQl9CisJfQorfSwgYmx1cjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaWZyYW1lKSB7CisJCXRoaXMud2luZG93LmJsdXIoKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy5vYmplY3QpIHsKKwkJCXRoaXMuZG9jdW1lbnQuYm9keS5ibHVyKCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5lZGl0Tm9kZSkgeworCQkJCXRoaXMuZWRpdE5vZGUuYmx1cigpOworCQkJfQorCQl9CisJfQorfSwgZm9jdXM6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlmcmFtZSAmJiAhZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQl0aGlzLndpbmRvdy5mb2N1cygpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLm9iamVjdCkgeworCQkJdGhpcy5kb2N1bWVudC5mb2N1cygpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuZWRpdE5vZGUgJiYgdGhpcy5lZGl0Tm9kZS5mb2N1cykgeworCQkJCXRoaXMuZWRpdE5vZGUuZm9jdXMoKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9qby5kZWJ1ZygiSGF2ZSBubyBpZGVhIGhvdyB0byBmb2N1cyBpbnRvIHRoZSBlZGl0b3IhIik7CisJCQl9CisJCX0KKwl9Cit9LCBvbkRpc3BsYXlDaGFuZ2VkOmZ1bmN0aW9uIChlKSB7Cit9LCBfYWN0aXZlWDp7Y29tbWFuZDp7Ym9sZDo1MDAwLCBpdGFsaWM6NTAyMywgdW5kZXJsaW5lOjUwNDgsIGp1c3RpZnljZW50ZXI6NTAyNCwganVzdGlmeWxlZnQ6NTAyNSwganVzdGlmeXJpZ2h0OjUwMjYsIGN1dDo1MDAzLCBjb3B5OjUwMDIsIHBhc3RlOjUwMzIsICJkZWxldGUiOjUwMDQsIHVuZG86NTA0OSwgcmVkbzo1MDMzLCByZW1vdmVmb3JtYXQ6NTAzNCwgc2VsZWN0YWxsOjUwMzUsIHVubGluazo1MDUwLCBpbmRlbnQ6NTAxOCwgb3V0ZGVudDo1MDMxLCBpbnNlcnRvcmRlcmVkbGlzdDo1MDMwLCBpbnNlcnR1bm9yZGVyZWRsaXN0OjUwNTEsIGluc2VydHRhYmxlOjUwMjIsIGluc2VydGNlbGw6NTAxOSwgaW5zZXJ0Y29sOjUwMjAsIGluc2VydHJvdzo1MDIxLCBkZWxldGVjZWxsczo1MDA1LCBkZWxldGVjb2xzOjUwMDYsIGRlbGV0ZXJvd3M6NTAwNywgbWVyZ2VjZWxsczo1MDI5LCBzcGxpdGNlbGw6NTA0Nywgc2V0YmxvY2tmb3JtYXQ6NTA0MywgZ2V0YmxvY2tmb3JtYXQ6NTAxMSwgZ2V0YmxvY2tmb3JtYXRuYW1lczo1MDEyLCBzZXRmb250bmFtZTo1MDQ0LCBnZXRmb250bmFtZTo1MDEzLCBzZXRmb250c2l6ZTo1MDQ1LCBnZXRmb250c2l6ZTo1MDE0LCBzZXRiYWNrY29sb3I6NTA0MiwgZ2V0YmFja2NvbG9yOjUwMTAsIHNldGZvcmVjb2xvcjo1MDQ2LCBnZXRmb3JlY29sb3I6NTAxNSwgZmluZHRleHQ6NTAwOCwgZm9udDo1MDA5LCBoeXBlcmxpbms6NTAxNiwgaW1hZ2U6NTAxNywgbG9ja2VsZW1lbnQ6NTAyNywgbWFrZWFic29sdXRlOjUwMjgsIHNlbmRiYWNrd2FyZDo1MDM2LCBicmluZ2ZvcndhcmQ6NTAzNywgc2VuZGJlbG93dGV4dDo1MDM4LCBicmluZ2Fib3ZldGV4dDo1MDM5LCBzZW5kdG9iYWNrOjUwNDAsIGJyaW5ndG9mcm9udDo1MDQxLCBwcm9wZXJ0aWVzOjUwNTJ9LCB1aTp7ImRlZmF1bHQiOjAsIHByb21wdDoxLCBub3Byb21wdDoyfSwgc3RhdHVzOntub3RzdXBwb3J0ZWQ6MCwgZGlzYWJsZWQ6MSwgZW5hYmxlZDozLCBsYXRjaGVkOjcsIG5pbmNoZWQ6MTF9LCBhcHBlYXJhbmNlOntmbGF0OjAsIGluc2V0OjF9LCBzdGF0ZTp7dW5jaGVja2VkOjAsIGNoZWNrZWQ6MSwgZ3JheToyfX0sIF9ub3JtYWxpemVDb21tYW5kOmZ1bmN0aW9uIChjbWQpIHsKKwl2YXIgZHJoID0gZG9qby5yZW5kZXIuaHRtbDsKKwl2YXIgY29tbWFuZCA9IGNtZC50b0xvd2VyQ2FzZSgpOworCWlmIChjb21tYW5kID09ICJmb3JtYXRibG9jayIpIHsKKwkJaWYgKGRyaC5zYWZhcmkpIHsKKwkJCWNvbW1hbmQgPSAiaGVhZGluZyI7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGhpcy5vYmplY3QpIHsKKwkJCXN3aXRjaCAoY29tbWFuZCkgeworCQkJICBjYXNlICJjcmVhdGVsaW5rIjoKKwkJCQljb21tYW5kID0gImh5cGVybGluayI7CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImluc2VydGltYWdlIjoKKwkJCQljb21tYW5kID0gImltYWdlIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjb21tYW5kID09ICJoaWxpdGVjb2xvciIgJiYgIWRyaC5tb3ppbGxhKSB7CisJCQkJY29tbWFuZCA9ICJiYWNrY29sb3IiOworCQkJfQorCQl9CisJfQorCXJldHVybiBjb21tYW5kOworfSwgX3NhZmFyaUlzTGVvcGFyZDpmdW5jdGlvbiAoKSB7CisJdmFyIGd0NDIwID0gZmFsc2U7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSB7CisJCXZhciB0bXAgPSBkb2pvLnJlbmRlci5odG1sLlVBLnNwbGl0KCJBcHBsZVdlYktpdC8iKVsxXTsKKwkJdmFyIHZlciA9IHBhcnNlRmxvYXQodG1wLnNwbGl0KCIgIilbMF0pOworCQlpZiAodmVyID49IDQyMCkgeworCQkJZ3Q0MjAgPSB0cnVlOworCQl9CisJfQorCXJldHVybiBndDQyMDsKK30sIHF1ZXJ5Q29tbWFuZEF2YWlsYWJsZTpmdW5jdGlvbiAoY29tbWFuZCkgeworCXZhciBpZSA9IDE7CisJdmFyIG1vemlsbGEgPSAxIDw8IDE7CisJdmFyIHNhZmFyaSA9IDEgPDwgMjsKKwl2YXIgb3BlcmEgPSAxIDw8IDM7CisJdmFyIHNhZmFyaTQyMCA9IDEgPDwgNDsKKwl2YXIgZ3Q0MjAgPSB0aGlzLl9zYWZhcmlJc0xlb3BhcmQoKTsKKwlmdW5jdGlvbiBpc1N1cHBvcnRlZEJ5KGJyb3dzZXJzKSB7CisJCXJldHVybiB7aWU6Qm9vbGVhbihicm93c2VycyAmIGllKSwgbW96aWxsYTpCb29sZWFuKGJyb3dzZXJzICYgbW96aWxsYSksIHNhZmFyaTpCb29sZWFuKGJyb3dzZXJzICYgc2FmYXJpKSwgc2FmYXJpNDIwOkJvb2xlYW4oYnJvd3NlcnMgJiBzYWZhcmk0MjApLCBvcGVyYTpCb29sZWFuKGJyb3dzZXJzICYgb3BlcmEpfTsKKwl9CisJdmFyIHN1cHBvcnRlZEJ5ID0gbnVsbDsKKwlzd2l0Y2ggKGNvbW1hbmQudG9Mb3dlckNhc2UoKSkgeworCSAgY2FzZSAiYm9sZCI6CisJICBjYXNlICJpdGFsaWMiOgorCSAgY2FzZSAidW5kZXJsaW5lIjoKKwkgIGNhc2UgInN1YnNjcmlwdCI6CisJICBjYXNlICJzdXBlcnNjcmlwdCI6CisJICBjYXNlICJmb250bmFtZSI6CisJICBjYXNlICJmb250c2l6ZSI6CisJICBjYXNlICJmb3JlY29sb3IiOgorCSAgY2FzZSAiaGlsaXRlY29sb3IiOgorCSAgY2FzZSAianVzdGlmeWNlbnRlciI6CisJICBjYXNlICJqdXN0aWZ5ZnVsbCI6CisJICBjYXNlICJqdXN0aWZ5bGVmdCI6CisJICBjYXNlICJqdXN0aWZ5cmlnaHQiOgorCSAgY2FzZSAiZGVsZXRlIjoKKwkgIGNhc2UgInNlbGVjdGFsbCI6CisJCXN1cHBvcnRlZEJ5ID0gaXNTdXBwb3J0ZWRCeShtb3ppbGxhIHwgaWUgfCBzYWZhcmkgfCBvcGVyYSk7CisJCWJyZWFrOworCSAgY2FzZSAiY3JlYXRlbGluayI6CisJICBjYXNlICJ1bmxpbmsiOgorCSAgY2FzZSAicmVtb3ZlZm9ybWF0IjoKKwkgIGNhc2UgImluc2VydGhvcml6b250YWxydWxlIjoKKwkgIGNhc2UgImluc2VydGltYWdlIjoKKwkgIGNhc2UgImluc2VydG9yZGVyZWRsaXN0IjoKKwkgIGNhc2UgImluc2VydHVub3JkZXJlZGxpc3QiOgorCSAgY2FzZSAiaW5kZW50IjoKKwkgIGNhc2UgIm91dGRlbnQiOgorCSAgY2FzZSAiZm9ybWF0YmxvY2siOgorCSAgY2FzZSAiaW5zZXJ0aHRtbCI6CisJICBjYXNlICJ1bmRvIjoKKwkgIGNhc2UgInJlZG8iOgorCSAgY2FzZSAic3RyaWtldGhyb3VnaCI6CisJCXN1cHBvcnRlZEJ5ID0gaXNTdXBwb3J0ZWRCeShtb3ppbGxhIHwgaWUgfCBvcGVyYSB8IHNhZmFyaTQyMCk7CisJCWJyZWFrOworCSAgY2FzZSAiYmxvY2tkaXJsdHIiOgorCSAgY2FzZSAiYmxvY2tkaXJydGwiOgorCSAgY2FzZSAiZGlybHRyIjoKKwkgIGNhc2UgImRpcnJ0bCI6CisJICBjYXNlICJpbmxpbmVkaXJsdHIiOgorCSAgY2FzZSAiaW5saW5lZGlycnRsIjoKKwkJc3VwcG9ydGVkQnkgPSBpc1N1cHBvcnRlZEJ5KGllKTsKKwkJYnJlYWs7CisJICBjYXNlICJjdXQiOgorCSAgY2FzZSAiY29weSI6CisJICBjYXNlICJwYXN0ZSI6CisJCXN1cHBvcnRlZEJ5ID0gaXNTdXBwb3J0ZWRCeShpZSB8IG1vemlsbGEgfCBzYWZhcmk0MjApOworCQlicmVhazsKKwkgIGNhc2UgImluc2VydHRhYmxlIjoKKwkJc3VwcG9ydGVkQnkgPSBpc1N1cHBvcnRlZEJ5KG1vemlsbGEgfCAodGhpcy5vYmplY3QgPyBpZSA6IDApKTsKKwkJYnJlYWs7CisJICBjYXNlICJpbnNlcnRjZWxsIjoKKwkgIGNhc2UgImluc2VydGNvbCI6CisJICBjYXNlICJpbnNlcnRyb3ciOgorCSAgY2FzZSAiZGVsZXRlY2VsbHMiOgorCSAgY2FzZSAiZGVsZXRlY29scyI6CisJICBjYXNlICJkZWxldGVyb3dzIjoKKwkgIGNhc2UgIm1lcmdlY2VsbHMiOgorCSAgY2FzZSAic3BsaXRjZWxsIjoKKwkJc3VwcG9ydGVkQnkgPSBpc1N1cHBvcnRlZEJ5KHRoaXMub2JqZWN0ID8gaWUgOiAwKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiAoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiBzdXBwb3J0ZWRCeS5pZSkgfHwgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSAmJiBzdXBwb3J0ZWRCeS5tb3ppbGxhKSB8fCAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkgJiYgc3VwcG9ydGVkQnkuc2FmYXJpKSB8fCAoZ3Q0MjAgJiYgc3VwcG9ydGVkQnkuc2FmYXJpNDIwKSB8fCAoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSAmJiBzdXBwb3J0ZWRCeS5vcGVyYSk7Cit9LCBleGVjQ29tbWFuZDpmdW5jdGlvbiAoY29tbWFuZCwgYXJndW1lbnQpIHsKKwl2YXIgcmV0dXJuVmFsdWU7CisJdGhpcy5mb2N1cygpOworCWNvbW1hbmQgPSB0aGlzLl9ub3JtYWxpemVDb21tYW5kKGNvbW1hbmQpOworCWlmIChhcmd1bWVudCAhPSB1bmRlZmluZWQpIHsKKwkJaWYgKGNvbW1hbmQgPT0gImhlYWRpbmciKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoInVuaW1wbGVtZW50ZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb21tYW5kID09ICJmb3JtYXRibG9jayIpIHsKKwkJCQlpZiAodGhpcy5vYmplY3QpIHsKKwkJCQkJYXJndW1lbnQgPSB0aGlzLl9uYXRpdmUyTG9jYWxGb3JtYXROYW1lc1thcmd1bWVudF07CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJCQkJCWFyZ3VtZW50ID0gIjwiICsgYXJndW1lbnQgKyAiPiI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHRoaXMub2JqZWN0KSB7CisJCXN3aXRjaCAoY29tbWFuZCkgeworCQkgIGNhc2UgImhpbGl0ZWNvbG9yIjoKKwkJCWNvbW1hbmQgPSAic2V0YmFja2NvbG9yIjsKKwkJCWJyZWFrOworCQkgIGNhc2UgImZvcmVjb2xvciI6CisJCSAgY2FzZSAiYmFja2NvbG9yIjoKKwkJICBjYXNlICJmb250c2l6ZSI6CisJCSAgY2FzZSAiZm9udG5hbWUiOgorCQkJY29tbWFuZCA9ICJzZXQiICsgY29tbWFuZDsKKwkJCWJyZWFrOworCQkgIGNhc2UgImZvcm1hdGJsb2NrIjoKKwkJCWNvbW1hbmQgPSAic2V0YmxvY2tmb3JtYXQiOworCQl9CisJCWlmIChjb21tYW5kID09ICJzdHJpa2V0aHJvdWdoIikgeworCQkJY29tbWFuZCA9ICJpbnNlcnRodG1sIjsKKwkJCXZhciByYW5nZSA9IHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQlpZiAoIXJhbmdlLmh0bWxUZXh0KSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYXJndW1lbnQgPSByYW5nZS5odG1sVGV4dC5zdHJpa2UoKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb21tYW5kID09ICJpbnNlcnRob3Jpem9udGFscnVsZSIpIHsKKwkJCQljb21tYW5kID0gImluc2VydGh0bWwiOworCQkJCWFyZ3VtZW50ID0gIjxocj4iOworCQkJfQorCQl9CisJCWlmIChjb21tYW5kID09ICJpbnNlcnRodG1sIikgeworCQkJdmFyIHJhbmdlID0gdGhpcy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKKwkJCWlmICh0aGlzLmRvY3VtZW50LnNlbGVjdGlvbi50eXBlLnRvVXBwZXJDYXNlKCkgPT0gIkNPTlRST0wiKSB7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykgeworCQkJCQlyYW5nZS5pdGVtKGkpLm91dGVySFRNTCA9IGFyZ3VtZW50OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmFuZ2UucGFzdGVIVE1MKGFyZ3VtZW50KTsKKwkJCQlyYW5nZS5zZWxlY3QoKTsKKwkJCX0KKwkJCXJldHVyblZhbHVlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKwkJCQlyZXR1cm5WYWx1ZSA9IHRoaXMub2JqZWN0LkV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFtjb21tYW5kXSwgdGhpcy5fYWN0aXZlWC51aS5ub3Byb21wdCk7CisJCQl9IGVsc2UgeworCQkJCXJldHVyblZhbHVlID0gdGhpcy5vYmplY3QuRXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdLCB0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0LCBhcmd1bWVudCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29tbWFuZCA9PSAiaW5zZXJ0aHRtbCIpIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQkJdmFyIGluc2VydFJhbmdlID0gdGhpcy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKKwkJCQlpbnNlcnRSYW5nZS5wYXN0ZUhUTUwoYXJndW1lbnQpOworCQkJCWluc2VydFJhbmdlLnNlbGVjdCgpOworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgYXJndW1lbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChjb21tYW5kID09ICJ1bmxpbmsiKSAmJiAodGhpcy5xdWVyeUNvbW1hbmRFbmFibGVkKCJ1bmxpbmsiKSkgJiYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkpIHsKKwkJCQl2YXIgc2VsZWN0aW9uID0gdGhpcy53aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CisJCQkJdmFyIHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CisJCQkJdmFyIHNlbGVjdGlvblN0YXJ0Q29udGFpbmVyID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXI7CisJCQkJdmFyIHNlbGVjdGlvblN0YXJ0T2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ7CisJCQkJdmFyIHNlbGVjdGlvbkVuZENvbnRhaW5lciA9IHNlbGVjdGlvblJhbmdlLmVuZENvbnRhaW5lcjsKKwkJCQl2YXIgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0OworCQkJCXZhciBhID0gZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiZ2V0QW5jZXN0b3JFbGVtZW50IiwgZG9qby5odG1sLnNlbGVjdGlvbiwgWyJhIl0pOworCQkJCWRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywgInNlbGVjdEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbYV0pOworCQkJCXJldHVyblZhbHVlID0gdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZCgidW5saW5rIiwgZmFsc2UsIG51bGwpOworCQkJCXZhciBzZWxlY3Rpb25SYW5nZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKwkJCQlzZWxlY3Rpb25SYW5nZS5zZXRTdGFydChzZWxlY3Rpb25TdGFydENvbnRhaW5lciwgc2VsZWN0aW9uU3RhcnRPZmZzZXQpOworCQkJCXNlbGVjdGlvblJhbmdlLnNldEVuZChzZWxlY3Rpb25FbmRDb250YWluZXIsIHNlbGVjdGlvbkVuZE9mZnNldCk7CisJCQkJc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOworCQkJCXNlbGVjdGlvbi5hZGRSYW5nZShzZWxlY3Rpb25SYW5nZSk7CisJCQkJcmV0dXJuIHJldHVyblZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGNvbW1hbmQgPT0gImhpbGl0ZWNvbG9yIikgJiYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkpIHsKKwkJCQkJdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZCgidXNlQ1NTIiwgZmFsc2UsIGZhbHNlKTsKKwkJCQkJcmV0dXJuVmFsdWUgPSB0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBhcmd1bWVudCk7CisJCQkJCXRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInVzZUNTUyIsIGZhbHNlLCB0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGRvam8ucmVuZGVyLmh0bWwuaWUpICYmICgoY29tbWFuZCA9PSAiYmFja2NvbG9yIikgfHwgKGNvbW1hbmQgPT0gImZvcmVjb2xvciIpKSkgeworCQkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50IDogbnVsbDsKKwkJCQkJCXJldHVyblZhbHVlID0gdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgYXJndW1lbnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50IDogbnVsbDsKKwkJCQkJCWlmIChhcmd1bWVudCB8fCBjb21tYW5kICE9ICJjcmVhdGVsaW5rIikgeworCQkJCQkJCXJldHVyblZhbHVlID0gdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgYXJndW1lbnQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXRoaXMub25EaXNwbGF5Q2hhbmdlZCgpOworCXJldHVybiByZXR1cm5WYWx1ZTsKK30sIHF1ZXJ5Q29tbWFuZEVuYWJsZWQ6ZnVuY3Rpb24gKGNvbW1hbmQpIHsKKwljb21tYW5kID0gdGhpcy5fbm9ybWFsaXplQ29tbWFuZChjb21tYW5kKTsKKwlpZiAodGhpcy5vYmplY3QpIHsKKwkJc3dpdGNoIChjb21tYW5kKSB7CisJCSAgY2FzZSAiaGlsaXRlY29sb3IiOgorCQkJY29tbWFuZCA9ICJzZXRiYWNrY29sb3IiOworCQkJYnJlYWs7CisJCSAgY2FzZSAiZm9yZWNvbG9yIjoKKwkJICBjYXNlICJiYWNrY29sb3IiOgorCQkgIGNhc2UgImZvbnRzaXplIjoKKwkJICBjYXNlICJmb250bmFtZSI6CisJCQljb21tYW5kID0gInNldCIgKyBjb21tYW5kOworCQkJYnJlYWs7CisJCSAgY2FzZSAiZm9ybWF0YmxvY2siOgorCQkJY29tbWFuZCA9ICJzZXRibG9ja2Zvcm1hdCI7CisJCQlicmVhazsKKwkJICBjYXNlICJzdHJpa2V0aHJvdWdoIjoKKwkJCWNvbW1hbmQgPSAiYm9sZCI7CisJCQlicmVhazsKKwkJICBjYXNlICJpbnNlcnRob3Jpem9udGFscnVsZSI6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAodHlwZW9mIHRoaXMuX2FjdGl2ZVguY29tbWFuZFtjb21tYW5kXSA9PSAidW5kZWZpbmVkIikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXZhciBzdGF0dXMgPSB0aGlzLm9iamVjdC5RdWVyeVN0YXR1cyh0aGlzLl9hY3RpdmVYLmNvbW1hbmRbY29tbWFuZF0pOworCQlyZXR1cm4gKChzdGF0dXMgIT0gdGhpcy5fYWN0aXZlWC5zdGF0dXMubm90c3VwcG9ydGVkKSAmJiAoc3RhdHVzICE9IHRoaXMuX2FjdGl2ZVguc3RhdHVzLmRpc2FibGVkKSk7CisJfSBlbHNlIHsKKwkJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkgeworCQkJaWYgKGNvbW1hbmQgPT0gInVubGluayIpIHsKKwkJCQlyZXR1cm4gZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiaGFzQW5jZXN0b3JFbGVtZW50IiwgZG9qby5odG1sLnNlbGVjdGlvbiwgWyJhIl0pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29tbWFuZCA9PSAiaW5zZXJ0dGFibGUiKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQl2YXIgZWxlbSA9IChkb2pvLnJlbmRlci5odG1sLmllKSA/IHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkgOiB0aGlzLmRvY3VtZW50OworCQlyZXR1cm4gZWxlbS5xdWVyeUNvbW1hbmRFbmFibGVkKGNvbW1hbmQpOworCX0KK30sIHF1ZXJ5Q29tbWFuZFN0YXRlOmZ1bmN0aW9uIChjb21tYW5kKSB7CisJY29tbWFuZCA9IHRoaXMuX25vcm1hbGl6ZUNvbW1hbmQoY29tbWFuZCk7CisJaWYgKHRoaXMub2JqZWN0KSB7CisJCWlmIChjb21tYW5kID09ICJmb3JlY29sb3IiKSB7CisJCQljb21tYW5kID0gInNldGZvcmVjb2xvciI7CisJCX0gZWxzZSB7CisJCQlpZiAoY29tbWFuZCA9PSAiYmFja2NvbG9yIikgeworCQkJCWNvbW1hbmQgPSAic2V0YmFja2NvbG9yIjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbW1hbmQgPT0gInN0cmlrZXRocm91Z2giKSB7CisJCQkJCXJldHVybiBkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJoYXNBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbInN0cmlrZSJdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29tbWFuZCA9PSAiaW5zZXJ0aG9yaXpvbnRhbHJ1bGUiKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHR5cGVvZiB0aGlzLl9hY3RpdmVYLmNvbW1hbmRbY29tbWFuZF0gPT0gInVuZGVmaW5lZCIpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXZhciBzdGF0dXMgPSB0aGlzLm9iamVjdC5RdWVyeVN0YXR1cyh0aGlzLl9hY3RpdmVYLmNvbW1hbmRbY29tbWFuZF0pOworCQlyZXR1cm4gKChzdGF0dXMgPT0gdGhpcy5fYWN0aXZlWC5zdGF0dXMubGF0Y2hlZCkgfHwgKHN0YXR1cyA9PSB0aGlzLl9hY3RpdmVYLnN0YXR1cy5uaW5jaGVkKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMuZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7CisJfQorfSwgcXVlcnlDb21tYW5kVmFsdWU6ZnVuY3Rpb24gKGNvbW1hbmQpIHsKKwljb21tYW5kID0gdGhpcy5fbm9ybWFsaXplQ29tbWFuZChjb21tYW5kKTsKKwlpZiAodGhpcy5vYmplY3QpIHsKKwkJc3dpdGNoIChjb21tYW5kKSB7CisJCSAgY2FzZSAiZm9yZWNvbG9yIjoKKwkJICBjYXNlICJiYWNrY29sb3IiOgorCQkgIGNhc2UgImZvbnRzaXplIjoKKwkJICBjYXNlICJmb250bmFtZSI6CisJCQljb21tYW5kID0gImdldCIgKyBjb21tYW5kOworCQkJcmV0dXJuIHRoaXMub2JqZWN0LmV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFtjb21tYW5kXSwgdGhpcy5fYWN0aXZlWC51aS5ub3Byb21wdCk7CisJCSAgY2FzZSAiZm9ybWF0YmxvY2siOgorCQkJdmFyIHJldHZhbHVlID0gdGhpcy5vYmplY3QuZXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kWyJnZXRibG9ja2Zvcm1hdCJdLCB0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0KTsKKwkJCWlmIChyZXR2YWx1ZSkgeworCQkJCXJldHVybiB0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tyZXR2YWx1ZV07CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiBjb21tYW5kID09ICJmb3JtYXRibG9jayIpIHsKKwkJCXJldHVybiB0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1t0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpXSB8fCB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpOworCQl9CisJCXJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpOworCX0KK30sIHBsYWNlQ3Vyc29yQXRTdGFydDpmdW5jdGlvbiAoKSB7CisJdGhpcy5mb2N1cygpOworCWlmIChkb2pvLnJlbmRlci5odG1sLm1veiAmJiB0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQgJiYgdGhpcy5lZGl0Tm9kZS5maXJzdENoaWxkLm5vZGVUeXBlICE9IGRvam8uZG9tLlRFWFRfTk9ERSkgeworCQlkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJzZWxlY3RFbGVtZW50Q2hpbGRyZW4iLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5lZGl0Tm9kZS5maXJzdENoaWxkXSk7CisJfSBlbHNlIHsKKwkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAic2VsZWN0RWxlbWVudENoaWxkcmVuIiwgZG9qby5odG1sLnNlbGVjdGlvbiwgW3RoaXMuZWRpdE5vZGVdKTsKKwl9CisJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiY29sbGFwc2UiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdHJ1ZV0pOworfSwgcGxhY2VDdXJzb3JBdEVuZDpmdW5jdGlvbiAoKSB7CisJdGhpcy5mb2N1cygpOworCWlmIChkb2pvLnJlbmRlci5odG1sLm1veiAmJiB0aGlzLmVkaXROb2RlLmxhc3RDaGlsZCAmJiB0aGlzLmVkaXROb2RlLmxhc3RDaGlsZC5ub2RlVHlwZSAhPSBkb2pvLmRvbS5URVhUX05PREUpIHsKKwkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAic2VsZWN0RWxlbWVudENoaWxkcmVuIiwgZG9qby5odG1sLnNlbGVjdGlvbiwgW3RoaXMuZWRpdE5vZGUubGFzdENoaWxkXSk7CisJfSBlbHNlIHsKKwkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAic2VsZWN0RWxlbWVudENoaWxkcmVuIiwgZG9qby5odG1sLnNlbGVjdGlvbiwgW3RoaXMuZWRpdE5vZGVdKTsKKwl9CisJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiY29sbGFwc2UiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbZmFsc2VdKTsKK30sIHJlcGxhY2VFZGl0b3JDb250ZW50OmZ1bmN0aW9uIChodG1sKSB7CisJaHRtbCA9IHRoaXMuX3ByZUZpbHRlckNvbnRlbnQoaHRtbCk7CisJaWYgKHRoaXMuaXNDbG9zZWQpIHsKKwkJdGhpcy5kb21Ob2RlLmlubmVySFRNTCA9IGh0bWw7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMud2luZG93ICYmIHRoaXMud2luZG93LmdldFNlbGVjdGlvbiAmJiAhZG9qby5yZW5kZXIuaHRtbC5tb3opIHsKKwkJCXRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MID0gaHRtbDsKKwkJfSBlbHNlIHsKKwkJCWlmICgodGhpcy53aW5kb3cgJiYgdGhpcy53aW5kb3cuZ2V0U2VsZWN0aW9uKSB8fCAodGhpcy5kb2N1bWVudCAmJiB0aGlzLmRvY3VtZW50LnNlbGVjdGlvbikpIHsKKwkJCQl0aGlzLmV4ZWNDb21tYW5kKCJzZWxlY3RhbGwiKTsKKwkJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5tb3ogJiYgIWh0bWwpIHsKKwkJCQkJaHRtbCA9ICImbmJzcDsiOworCQkJCX0KKwkJCQl0aGlzLmV4ZWNDb21tYW5kKCJpbnNlcnRodG1sIiwgaHRtbCk7CisJCQl9CisJCX0KKwl9Cit9LCBfcHJlRmlsdGVyQ29udGVudDpmdW5jdGlvbiAoaHRtbCkgeworCXZhciBlYyA9IGh0bWw7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5jb250ZW50UHJlRmlsdGVycywgZnVuY3Rpb24gKGVmKSB7CisJCWVjID0gZWYoZWMpOworCX0pOworCWlmICh0aGlzLmNvbnRlbnREb21QcmVGaWx0ZXJzLmxlbmd0aCA+IDApIHsKKwkJdmFyIGRvbSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCWRvbS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChkb20pOworCQlkb20uaW5uZXJIVE1MID0gZWM7CisJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuY29udGVudERvbVByZUZpbHRlcnMsIGZ1bmN0aW9uIChlZikgeworCQkJZG9tID0gZWYoZG9tKTsKKwkJfSk7CisJCWVjID0gZG9tLmlubmVySFRNTDsKKwkJZG9qby5ib2R5KCkucmVtb3ZlQ2hpbGQoZG9tKTsKKwl9CisJcmV0dXJuIGVjOworfSwgX3Bvc3RGaWx0ZXJDb250ZW50OmZ1bmN0aW9uIChodG1sKSB7CisJdmFyIGVjID0gaHRtbDsKKwlpZiAodGhpcy5jb250ZW50RG9tUG9zdEZpbHRlcnMubGVuZ3RoID4gMCkgeworCQl2YXIgZG9tID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJZG9tLmlubmVySFRNTCA9IGVjOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnREb21Qb3N0RmlsdGVycywgZnVuY3Rpb24gKGVmKSB7CisJCQlkb20gPSBlZihkb20pOworCQl9KTsKKwkJZWMgPSBkb20uaW5uZXJIVE1MOworCX0KKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnRQb3N0RmlsdGVycywgZnVuY3Rpb24gKGVmKSB7CisJCWVjID0gZWYoZWMpOworCX0pOworCXJldHVybiBlYzsKK30sIF9sYXN0SGVpZ2h0OjAsIF91cGRhdGVIZWlnaHQ6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5pc0xvYWRlZCkgeworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLmhlaWdodCkgeworCQlyZXR1cm47CisJfQorCXZhciBoZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZWRpdE5vZGUpLmhlaWdodDsKKwlpZiAoIWhlaWdodCkgeworCQloZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9jdW1lbnQuYm9keSkuaGVpZ2h0OworCX0KKwlpZiAoaGVpZ2h0ID09IDApIHsKKwkJZG9qby5kZWJ1ZygiQ2FuIG5vdCBmaWd1cmUgb3V0IHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRpbmcgYXJlYSEiKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLl9sYXN0SGVpZ2h0ID0gaGVpZ2h0OworCXRoaXMuZWRpdG9yT2JqZWN0LnN0eWxlLmhlaWdodCA9IHRoaXMuX2xhc3RIZWlnaHQgKyAicHgiOworCXRoaXMud2luZG93LnNjcm9sbFRvKDAsIDApOworfSwgX3NhdmVDb250ZW50OmZ1bmN0aW9uIChlKSB7CisJdmFyIHNhdmVUZXh0YXJlYSA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudEJ5SWQoImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCIpOworCXNhdmVUZXh0YXJlYS52YWx1ZSArPSB0aGlzLl9TRVBBUkFUT1IgKyB0aGlzLnNhdmVOYW1lICsgIjoiICsgdGhpcy5nZXRFZGl0b3JDb250ZW50KCk7Cit9LCBnZXRFZGl0b3JDb250ZW50OmZ1bmN0aW9uICgpIHsKKwl2YXIgZWMgPSAiIjsKKwl0cnkgeworCQllYyA9ICh0aGlzLl9jb250ZW50Lmxlbmd0aCA+IDApID8gdGhpcy5fY29udGVudCA6IHRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MOworCQlpZiAoZG9qby5zdHJpbmcudHJpbShlYykgPT0gIiZuYnNwOyIpIHsKKwkJCWVjID0gIiI7CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgIXRoaXMub2JqZWN0KSB7CisJCXZhciByZSA9IG5ldyBSZWdFeHAoIig/OjxwPiZuYnNwOzwvcD5bXG5ccl0qKSskIiwgImkiKTsKKwkJZWMgPSBlYy5yZXBsYWNlKHJlLCAiIik7CisJfQorCWVjID0gdGhpcy5fcG9zdEZpbHRlckNvbnRlbnQoZWMpOworCWlmICh0aGlzLnJlbGF0aXZlSW1hZ2VVcmxzKSB7CisJCXZhciBzaXRlQmFzZSA9IGRvam8uZ2xvYmFsKCkubG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgZG9qby5nbG9iYWwoKS5sb2NhdGlvbi5ob3N0OworCQl2YXIgcGF0aEJhc2UgPSBkb2pvLmdsb2JhbCgpLmxvY2F0aW9uLnBhdGhuYW1lOworCQlpZiAocGF0aEJhc2UubWF0Y2goL1wvJC8pKSB7CisJCX0gZWxzZSB7CisJCQl2YXIgcGF0aFBhcnRzID0gcGF0aEJhc2Uuc3BsaXQoIi8iKTsKKwkJCWlmIChwYXRoUGFydHMubGVuZ3RoKSB7CisJCQkJcGF0aFBhcnRzLnBvcCgpOworCQkJfQorCQkJcGF0aEJhc2UgPSBwYXRoUGFydHMuam9pbigiLyIpICsgIi8iOworCQl9CisJCXZhciBzYW1lU2l0ZSA9IG5ldyBSZWdFeHAoIig8aW1nW14+XSogc3JjPVtcIiddKSgiICsgc2l0ZUJhc2UgKyAiKCIgKyBwYXRoQmFzZSArICIpPykiLCAiaWciKTsKKwkJZWMgPSBlYy5yZXBsYWNlKHNhbWVTaXRlLCAiJDEiKTsKKwl9CisJcmV0dXJuIGVjOworfSwgY2xvc2U6ZnVuY3Rpb24gKHNhdmUsIGZvcmNlKSB7CisJaWYgKHRoaXMuaXNDbG9zZWQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CisJCXNhdmUgPSB0cnVlOworCX0KKwl0aGlzLl9jb250ZW50ID0gdGhpcy5fcG9zdEZpbHRlckNvbnRlbnQodGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwpOworCXZhciBjaGFuZ2VkID0gKHRoaXMuc2F2ZWRDb250ZW50ICE9IHRoaXMuX2NvbnRlbnQpOworCWlmICh0aGlzLmludGVydmFsKSB7CisJCWNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLmllICYmICF0aGlzLm9iamVjdCkgeworCQlkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4odGhpcy5lZGl0Tm9kZSk7CisJfQorCWlmICh0aGlzLmlmcmFtZSkgeworCQlkZWxldGUgdGhpcy5pZnJhbWU7CisJfQorCWlmICh0aGlzLnRleHRhcmVhKSB7CisJCXdpdGggKHRoaXMudGV4dGFyZWEuc3R5bGUpIHsKKwkJCXBvc2l0aW9uID0gIiI7CisJCQlsZWZ0ID0gdG9wID0gIiI7CisJCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQkJCW92ZXJmbG93ID0gdGhpcy5fX292ZXJmbG93OworCQkJCXRoaXMuX19vdmVyZmxvdyA9IG51bGw7CisJCQl9CisJCX0KKwkJaWYgKHNhdmUpIHsKKwkJCXRoaXMudGV4dGFyZWEudmFsdWUgPSB0aGlzLl9jb250ZW50OworCQl9IGVsc2UgeworCQkJdGhpcy50ZXh0YXJlYS52YWx1ZSA9IHRoaXMuc2F2ZWRDb250ZW50OworCQl9CisJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZG9tTm9kZSk7CisJCXRoaXMuZG9tTm9kZSA9IHRoaXMudGV4dGFyZWE7CisJfSBlbHNlIHsKKwkJaWYgKHNhdmUpIHsKKwkJCWlmIChkb2pvLnJlbmRlci5odG1sLm1veikgeworCQkJCXZhciBuYyA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCQkJCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChuYyk7CisJCQkJbmMuaW5uZXJIVE1MID0gdGhpcy5lZGl0Tm9kZS5pbm5lckhUTUw7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSB0aGlzLl9jb250ZW50OworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5kb21Ob2RlLmlubmVySFRNTCA9IHRoaXMuc2F2ZWRDb250ZW50OworCQl9CisJfQorCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRvbU5vZGUsICJSaWNoVGV4dEVkaXRhYmxlIik7CisJdGhpcy5pc0Nsb3NlZCA9IHRydWU7CisJdGhpcy5pc0xvYWRlZCA9IGZhbHNlOworCWRlbGV0ZSB0aGlzLmVkaXROb2RlOworCWlmICh0aGlzLndpbmRvdy5fZnJhbWVFbGVtZW50KSB7CisJCXRoaXMud2luZG93Ll9mcmFtZUVsZW1lbnQgPSBudWxsOworCX0KKwl0aGlzLndpbmRvdyA9IG51bGw7CisJdGhpcy5kb2N1bWVudCA9IG51bGw7CisJdGhpcy5vYmplY3QgPSBudWxsOworCXRoaXMuZWRpdGluZ0FyZWEgPSBudWxsOworCXRoaXMuZWRpdG9yT2JqZWN0ID0gbnVsbDsKKwlyZXR1cm4gY2hhbmdlZDsKK30sIGRlc3Ryb3lSZW5kZXJpbmc6ZnVuY3Rpb24gKCkgeworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy5kZXN0cm95UmVuZGVyaW5nKCk7CisJaWYgKCF0aGlzLmlzQ2xvc2VkKSB7CisJCXRoaXMuY2xvc2UoZmFsc2UpOworCX0KKwlkb2pvLndpZGdldC5SaWNoVGV4dC5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK30sIGNvbm5lY3Q6ZnVuY3Rpb24gKHRhcmdldE9iaiwgdGFyZ2V0RnVuYywgdGhpc0Z1bmMpIHsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGFyZ2V0T2JqLCB0YXJnZXRGdW5jLCB0aGlzLCB0aGlzRnVuYyk7Cit9LCBkaXNjb25uZWN0OmZ1bmN0aW9uICh0YXJnZXRPYmosIHRhcmdldEZ1bmMsIHRoaXNGdW5jKSB7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KHRhcmdldE9iaiwgdGFyZ2V0RnVuYywgdGhpcywgdGhpc0Z1bmMpOworfSwgZGlzY29ubmVjdEFsbFdpdGhSb290OmZ1bmN0aW9uICh0YXJnZXRPYmopIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImRpc2Nvbm5lY3RBbGxXaXRoUm9vdCIsICJpcyBkZXByZWNhdGVkLiBObyBuZWVkIHRvIGRpc2Nvbm5lY3QgbWFudWFsbHkiLCAiMC41Iik7Cit9LCBfZml4Q29udGVudEZvck1vejpmdW5jdGlvbiAoaHRtbCkgeworCWh0bWwgPSBodG1sLnJlcGxhY2UoLzxzdHJvbmcoWyBcPl0pL2dpLCAiPGIkMSIpOworCWh0bWwgPSBodG1sLnJlcGxhY2UoLzxcL3N0cm9uZz4vZ2ksICI8L2I+Iik7CisJaHRtbCA9IGh0bWwucmVwbGFjZSgvPGVtKFsgXD5dKS9naSwgIjxpJDEiKTsKKwlodG1sID0gaHRtbC5yZXBsYWNlKC88XC9lbT4vZ2ksICI8L2k+Iik7CisJcmV0dXJuIGh0bWw7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUm91bmRlZC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvUm91bmRlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVmYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Sb3VuZGVkLmpzCkBAIC0wLDAgKzEsNTI5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Sb3VuZGVkIik7Citkb2pvLndpZGdldC50YWdzLmFkZFBhcnNlVHJlZUhhbmRsZXIoImRvam86cm91bmRlZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5jb2xvciIpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLndpZGdldC5Sb3VuZGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDAuNTsgeW91IGNhbiBub3cgYXBwbHkgcm91bmRlZCBjb3JuZXJzIHRvIGFueSBibG9jayBlbGVtZW50IHVzaW5nIGRvam8ubGZ4LnJvdW5kZWQuIiwgIjAuNSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Sb3VuZGVkIiwgZG9qby53aWRnZXQuQ29udGVudFBhbmUsIHtpc1NhZmFyaTpkb2pvLnJlbmRlci5odG1sLnNhZmFyaSwgYm94TWFyZ2luOiI1MHB4IiwgcmFkaXVzOjE0LCBkb21Ob2RlOiIiLCBjb3JuZXJzOiJUUixUTCxCUixCTCIsIGFudGlBbGlhczp0cnVlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWRvam8ud2lkZ2V0LlJvdW5kZWQuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsIGFyZ3MsIGZyYWcpOworCWRvam8uaHRtbC5pbnNlcnRDc3NGaWxlKHRoaXMudGVtcGxhdGVDc3NQYXRoKTsKKwlpZiAodGhpcy5kb21Ob2RlLnN0eWxlLmhlaWdodCA8PSAwKSB7CisJCXZhciBtaW5IZWlnaHQgPSAodGhpcy5yYWRpdXMgKiAxKSArIHRoaXMuZG9tTm9kZS5jbGllbnRIZWlnaHQ7CisJCXRoaXMuZG9tTm9kZS5zdHlsZS5oZWlnaHQgPSBtaW5IZWlnaHQgKyAicHgiOworCX0KKwlpZiAodGhpcy5kb21Ob2RlLnN0eWxlLndpZHRoIDw9IDApIHsKKwkJdmFyIG1pbldpZHRoID0gKHRoaXMucmFkaXVzICogMSkgKyB0aGlzLmRvbU5vZGUuY2xpZW50V2lkdGg7CisJCXRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCA9IG1pbldpZHRoICsgInB4IjsKKwl9CisJdmFyIGNvcm5lcnNBdmFpbGFibGUgPSBbIlRSIiwgIlRMIiwgIkJSIiwgIkJMIl07CisJdmFyIGNvcm5lcnNQYXNzZWQgPSB0aGlzLmNvcm5lcnMuc3BsaXQoIiwiKTsKKwl0aGlzLnNldHRpbmdzID0ge2FudGlBbGlhczp0aGlzLmFudGlBbGlhc307CisJdmFyIHNldENvcm5lciA9IGZ1bmN0aW9uIChjdXJyZW50Q29ybmVyKSB7CisJCXZhciB2YWwgPSBjdXJyZW50Q29ybmVyLnRvTG93ZXJDYXNlKCk7CisJCWlmIChkb2pvLmxhbmcuaW5BcnJheShjb3JuZXJzUGFzc2VkLCBjdXJyZW50Q29ybmVyKSkgeworCQkJdGhpcy5zZXR0aW5nc1t2YWxdID0ge3JhZGl1czp0aGlzLnJhZGl1cywgZW5hYmxlZDp0cnVlfTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2V0dGluZ3NbdmFsXSA9IHtyYWRpdXM6MH07CisJCX0KKwl9OworCWRvam8ubGFuZy5mb3JFYWNoKGNvcm5lcnNBdmFpbGFibGUsIHNldENvcm5lciwgdGhpcyk7CisJdGhpcy5kb21Ob2RlLnN0eWxlLm1hcmdpbiA9IHRoaXMuYm94TWFyZ2luOworCXRoaXMuY3VydnlDb3JuZXJzKHRoaXMuc2V0dGluZ3MpOworCXRoaXMuYXBwbHlDb3JuZXJzKCk7Cit9LCBjdXJ2eUNvcm5lcnM6ZnVuY3Rpb24gKHNldHRpbmdzKSB7CisJdGhpcy5ib3ggPSB0aGlzLmRvbU5vZGU7CisJdGhpcy50b3BDb250YWluZXIgPSBudWxsOworCXRoaXMuYm90dG9tQ29udGFpbmVyID0gbnVsbDsKKwl0aGlzLm1hc3RlckNvcm5lcnMgPSBbXTsKKwl2YXIgYm94SGVpZ2h0ID0gZG9qby5odG1sLmdldFN0eWxlKHRoaXMuYm94LCAiaGVpZ2h0Iik7CisJaWYgKGJveEhlaWdodCA9PSAiIikgeworCQlib3hIZWlnaHQgPSAiMHB4IjsKKwl9CisJdmFyIGJveFdpZHRoID0gZG9qby5odG1sLmdldFN0eWxlKHRoaXMuYm94LCAid2lkdGgiKTsKKwl2YXIgYm9yZGVyV2lkdGggPSBkb2pvLmh0bWwuZ2V0U3R5bGUodGhpcy5ib3gsICJib3JkZXJUb3BXaWR0aCIpOworCWlmIChib3JkZXJXaWR0aCA9PSAiIikgeworCQlib3JkZXJXaWR0aCA9ICIwcHgiOworCX0KKwl2YXIgYm9yZGVyQ29sb3VyID0gZG9qby5odG1sLmdldFN0eWxlKHRoaXMuYm94LCAiYm9yZGVyVG9wQ29sb3IiKTsKKwlpZiAoYm9yZGVyV2lkdGggPiAwKSB7CisJCXRoaXMuYW50aUFsaWFzID0gdHJ1ZTsKKwl9CisJdmFyIGJveENvbG91ciA9IGRvam8uaHRtbC5nZXRTdHlsZSh0aGlzLmJveCwgImJhY2tncm91bmRDb2xvciIpOworCXZhciBiYWNrZ3JvdW5kSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUodGhpcy5ib3gsICJiYWNrZ3JvdW5kSW1hZ2UiKTsKKwl2YXIgYm94UG9zaXRpb24gPSBkb2pvLmh0bWwuZ2V0U3R5bGUodGhpcy5ib3gsICJwb3NpdGlvbiIpOworCXRoaXMuYm94SGVpZ2h0ID0gcGFyc2VJbnQoKChib3hIZWlnaHQgIT0gIiIgJiYgYm94SGVpZ2h0ICE9ICJhdXRvIiAmJiBib3hIZWlnaHQuaW5kZXhPZigiJSIpID09IC0xKSA/IGJveEhlaWdodC5zdWJzdHJpbmcoMCwgYm94SGVpZ2h0LmluZGV4T2YoInB4IikpIDogdGhpcy5ib3guc2Nyb2xsSGVpZ2h0KSk7CisJdGhpcy5ib3hXaWR0aCA9IHBhcnNlSW50KCgoYm94V2lkdGggIT0gIiIgJiYgYm94V2lkdGggIT0gImF1dG8iICYmIGJveFdpZHRoLmluZGV4T2YoIiUiKSA9PSAtMSkgPyBib3hXaWR0aC5zdWJzdHJpbmcoMCwgYm94V2lkdGguaW5kZXhPZigicHgiKSkgOiB0aGlzLmJveC5zY3JvbGxXaWR0aCkpOworCXRoaXMuYm9yZGVyV2lkdGggPSBwYXJzZUludCgoKGJvcmRlcldpZHRoICE9ICIiICYmIGJvcmRlcldpZHRoLmluZGV4T2YoInB4IikgIT09IC0xKSA/IGJvcmRlcldpZHRoLnNsaWNlKDAsIGJvcmRlcldpZHRoLmluZGV4T2YoInB4IikpIDogMCkpOworCXZhciB0ZXN0ID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGJveENvbG91cik7CisJdGhpcy5ib3hDb2xvdXIgPSAoKGJveENvbG91ciAhPSAiIiAmJiBib3hDb2xvdXIgIT0gInRyYW5zcGFyZW50IikgPyAoKGJveENvbG91ci5zdWJzdHIoMCwgMykgPT0gInJnYiIpID8gdGhpcy5yZ2IySGV4KGJveENvbG91cikgOiBib3hDb2xvdXIpIDogIiNmZmZmZmYiKTsKKwl0aGlzLmJvcmRlckNvbG91ciA9ICgoYm9yZGVyQ29sb3VyICE9ICIiICYmIGJvcmRlckNvbG91ciAhPSAidHJhbnNwYXJlbnQiICYmIHRoaXMuYm9yZGVyV2lkdGggPiAwKSA/ICgoYm9yZGVyQ29sb3VyLnN1YnN0cigwLCAzKSA9PSAicmdiIikgPyB0aGlzLnJnYjJIZXgoYm9yZGVyQ29sb3VyKSA6IGJvcmRlckNvbG91cikgOiB0aGlzLmJveENvbG91cik7CisJdGhpcy5ib3JkZXJTdHJpbmcgPSB0aGlzLmJvcmRlcldpZHRoICsgInB4IiArICIgc29saWQgIiArIHRoaXMuYm9yZGVyQ29sb3VyOworCXRoaXMuYmFja2dyb3VuZEltYWdlID0gKChiYWNrZ3JvdW5kSW1hZ2UgIT0gIm5vbmUiKSA/IGJhY2tncm91bmRJbWFnZSA6ICIiKTsKKwlpZiAoYm94UG9zaXRpb24gIT0gImFic29sdXRlIikgeworCQl0aGlzLmJveC5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJfQorCXRoaXMuYXBwbHlDb3JuZXJzID0gZnVuY3Rpb24gKCkgeworCQlmb3IgKHZhciB0ID0gMDsgdCA8IDI7IHQrKykgeworCQkJc3dpdGNoICh0KSB7CisJCQkgIGNhc2UgMDoKKwkJCQlpZiAodGhpcy5zZXR0aW5ncy50bC5lbmFibGVkIHx8IHRoaXMuc2V0dGluZ3MudHIuZW5hYmxlZCkgeworCQkJCQl2YXIgbmV3TWFpbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpOworCQkJCQl3aXRoIChuZXdNYWluQ29udGFpbmVyLnN0eWxlKSB7CisJCQkJCQl3aWR0aCA9ICIxMDAlIjsKKwkJCQkJCWZvbnRTaXplID0gIjFweCI7CisJCQkJCQlvdmVyZmxvdyA9ICJoaWRkZW4iOworCQkJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCQkJcGFkZGluZ0xlZnQgPSB0aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJCXBhZGRpbmdSaWdodCA9IHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJdmFyIHRvcE1heFJhZGl1cyA9IE1hdGgubWF4KHRoaXMuc2V0dGluZ3MudGwgPyB0aGlzLnNldHRpbmdzLnRsLnJhZGl1cyA6IDAsIHRoaXMuc2V0dGluZ3MudHIgPyB0aGlzLnNldHRpbmdzLnRyLnJhZGl1cyA6IDApOworCQkJCQkJaGVpZ2h0ID0gdG9wTWF4UmFkaXVzICsgInB4IjsKKwkJCQkJCXRvcCA9IDAgLSB0b3BNYXhSYWRpdXMgKyAicHgiOworCQkJCQkJbGVmdCA9IDAgLSB0aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJfQorCQkJCQl0aGlzLnRvcENvbnRhaW5lciA9IHRoaXMuYm94LmFwcGVuZENoaWxkKG5ld01haW5Db250YWluZXIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgY2FzZSAxOgorCQkJCWlmICh0aGlzLnNldHRpbmdzLmJsLmVuYWJsZWQgfHwgdGhpcy5zZXR0aW5ncy5ici5lbmFibGVkKSB7CisJCQkJCXZhciBuZXdNYWluQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CisJCQkJCXdpdGggKG5ld01haW5Db250YWluZXIuc3R5bGUpIHsKKwkJCQkJCXdpZHRoID0gIjEwMCUiOworCQkJCQkJZm9udFNpemUgPSAiMXB4IjsKKwkJCQkJCW92ZXJmbG93ID0gImhpZGRlbiI7CisJCQkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJCQlwYWRkaW5nTGVmdCA9IHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJcGFkZGluZ1JpZ2h0ID0gdGhpcy5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCQl2YXIgYm90TWF4UmFkaXVzID0gTWF0aC5tYXgodGhpcy5zZXR0aW5ncy5ibCA/IHRoaXMuc2V0dGluZ3MuYmwucmFkaXVzIDogMCwgdGhpcy5zZXR0aW5ncy5iciA/IHRoaXMuc2V0dGluZ3MuYnIucmFkaXVzIDogMCk7CisJCQkJCQloZWlnaHQgPSBib3RNYXhSYWRpdXMgKyAicHgiOworCQkJCQkJYm90dG9tID0gMCAtIGJvdE1heFJhZGl1cyArICJweCI7CisJCQkJCQlsZWZ0ID0gMCAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQl9CisJCQkJCXRoaXMuYm90dG9tQ29udGFpbmVyID0gdGhpcy5ib3guYXBwZW5kQ2hpbGQobmV3TWFpbkNvbnRhaW5lcik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh0aGlzLnRvcENvbnRhaW5lcikgeworCQkJdGhpcy5ib3guc3R5bGUuYm9yZGVyVG9wV2lkdGggPSAiMHB4IjsKKwkJfQorCQlpZiAodGhpcy5ib3R0b21Db250YWluZXIpIHsKKwkJCXRoaXMuYm94LnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoID0gIjBweCI7CisJCX0KKwkJdmFyIGNvcm5lcnMgPSBbInRyIiwgInRsIiwgImJyIiwgImJsIl07CisJCWZvciAodmFyIGkgaW4gY29ybmVycykgeworCQkJdmFyIGNjID0gY29ybmVyc1tpXTsKKwkJCWlmICghdGhpcy5zZXR0aW5nc1tjY10pIHsKKwkJCQlpZiAoKChjYyA9PSAidHIiIHx8IGNjID09ICJ0bCIpICYmIHRoaXMudG9wQ29udGFpbmVyICE9IG51bGwpIHx8ICgoY2MgPT0gImJyIiB8fCBjYyA9PSAiYmwiKSAmJiB0aGlzLmJvdHRvbUNvbnRhaW5lciAhPSBudWxsKSkgeworCQkJCQl2YXIgbmV3Q29ybmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CisJCQkJCW5ld0Nvcm5lci5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisJCQkJCW5ld0Nvcm5lci5zdHlsZS5mb250U2l6ZSA9ICIxcHgiOworCQkJCQluZXdDb3JuZXIuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQkJaWYgKHRoaXMuYmFja2dyb3VuZEltYWdlID09ICIiKSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5ib3hDb2xvdXI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gdGhpcy5iYWNrZ3JvdW5kSW1hZ2U7CisJCQkJCX0KKwkJCQkJc3dpdGNoIChjYykgeworCQkJCQkgIGNhc2UgInRsIjoKKwkJCQkJCXdpdGggKG5ld0Nvcm5lci5zdHlsZSkgeworCQkJCQkJCWhlaWdodCA9IHRvcE1heFJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJCW1hcmdpblJpZ2h0ID0gdGhpcy5zZXR0aW5ncy50ci5yYWRpdXMgLSAodGhpcy5ib3JkZXJXaWR0aCAqIDIpICsgInB4IjsKKwkJCQkJCQlib3JkZXJMZWZ0ID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJYm9yZGVyVG9wID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJbGVmdCA9IC10aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgInRyIjoKKwkJCQkJCXdpdGggKG5ld0Nvcm5lci5zdHlsZSkgeworCQkJCQkJCWhlaWdodCA9IHRvcE1heFJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJCW1hcmdpbkxlZnQgPSB0aGlzLnNldHRpbmdzLnRsLnJhZGl1cyAtICh0aGlzLmJvcmRlcldpZHRoICogMikgKyAicHgiOworCQkJCQkJCWJvcmRlclJpZ2h0ID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJYm9yZGVyVG9wID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJYmFja2dyb3VuZFBvc2l0aW9uID0gIi0iICsgdGhpcy5ib3hXaWR0aCArICJweCAwcHgiOworCQkJCQkJCWxlZnQgPSB0aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgImJsIjoKKwkJCQkJCXdpdGggKG5ld0Nvcm5lci5zdHlsZSkgeworCQkJCQkJCWhlaWdodCA9IGJvdE1heFJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJCW1hcmdpblJpZ2h0ID0gdGhpcy5zZXR0aW5ncy5ici5yYWRpdXMgLSAodGhpcy5ib3JkZXJXaWR0aCAqIDIpICsgInB4IjsKKwkJCQkJCQlib3JkZXJMZWZ0ID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJYm9yZGVyQm90dG9tID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJbGVmdCA9IC10aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQkgIGNhc2UgImJyIjoKKwkJCQkJCXdpdGggKG5ld0Nvcm5lci5zdHlsZSkgeworCQkJCQkJCWhlaWdodCA9IGJvdE1heFJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJCW1hcmdpbkxlZnQgPSB0aGlzLnNldHRpbmdzLmJsLnJhZGl1cyAtICh0aGlzLmJvcmRlcldpZHRoICogMikgKyAicHgiOworCQkJCQkJCWJvcmRlclJpZ2h0ID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJYm9yZGVyQm90dG9tID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCQkJbGVmdCA9IHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLm1hc3RlckNvcm5lcnNbdGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzXSkgeworCQkJCQl2YXIgbmV3Q29ybmVyID0gdGhpcy5tYXN0ZXJDb3JuZXJzW3RoaXMuc2V0dGluZ3NbY2NdLnJhZGl1c10uY2xvbmVOb2RlKHRydWUpOworCQkJCX0gZWxzZSB7CisJCQkJCXZhciBuZXdDb3JuZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKKwkJCQkJd2l0aCAobmV3Q29ybmVyLnN0eWxlKSB7CisJCQkJCQloZWlnaHQgPSB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMgKyAicHgiOworCQkJCQkJd2lkdGggPSB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMgKyAicHgiOworCQkJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCQkJZm9udFNpemUgPSAiMXB4IjsKKwkJCQkJCW92ZXJmbG93ID0gImhpZGRlbiI7CisJCQkJCX0KKwkJCQkJdmFyIGJvcmRlclJhZGl1cyA9IHBhcnNlSW50KHRoaXMuc2V0dGluZ3NbY2NdLnJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGgpOworCQkJCQlmb3IgKHZhciBpbnR4ID0gMCwgaiA9IHRoaXMuc2V0dGluZ3NbY2NdLnJhZGl1czsgaW50eCA8IGo7IGludHgrKykgeworCQkJCQkJaWYgKChpbnR4ICsgMSkgPj0gYm9yZGVyUmFkaXVzKSB7CisJCQkJCQkJdmFyIHkxID0gLTE7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZhciB5MSA9IChNYXRoLmZsb29yKE1hdGguc3FydChNYXRoLnBvdyhib3JkZXJSYWRpdXMsIDIpIC0gTWF0aC5wb3coKGludHggKyAxKSwgMikpKSAtIDEpOworCQkJCQkJfQorCQkJCQkJaWYgKGJvcmRlclJhZGl1cyAhPSBqKSB7CisJCQkJCQkJaWYgKChpbnR4KSA+PSBib3JkZXJSYWRpdXMpIHsKKwkJCQkJCQkJdmFyIHkyID0gLTE7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdmFyIHkyID0gTWF0aC5jZWlsKE1hdGguc3FydChNYXRoLnBvdyhib3JkZXJSYWRpdXMsIDIpIC0gTWF0aC5wb3coaW50eCwgMikpKTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKChpbnR4ICsgMSkgPj0gaikgeworCQkJCQkJCQl2YXIgeTMgPSAtMTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl2YXIgeTMgPSAoTWF0aC5mbG9vcihNYXRoLnNxcnQoTWF0aC5wb3coaiwgMikgLSBNYXRoLnBvdygoaW50eCArIDEpLCAyKSkpIC0gMSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKChpbnR4KSA+PSBqKSB7CisJCQkJCQkJdmFyIHk0ID0gLTE7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZhciB5NCA9IE1hdGguY2VpbChNYXRoLnNxcnQoTWF0aC5wb3coaiwgMikgLSBNYXRoLnBvdyhpbnR4LCAyKSkpOworCQkJCQkJfQorCQkJCQkJaWYgKHkxID4gLTEpIHsKKwkJCQkJCQl0aGlzLmRyYXdQaXhlbChpbnR4LCAwLCB0aGlzLmJveENvbG91ciwgMTAwLCAoeTEgKyAxKSwgbmV3Q29ybmVyLCAtMSwgdGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChib3JkZXJSYWRpdXMgIT0gaikgeworCQkJCQkJCWlmICh0aGlzLmFudGlBbGlhcykgeworCQkJCQkJCQlmb3IgKHZhciBpbnR5ID0gKHkxICsgMSk7IGludHkgPCB5MjsgaW50eSsrKSB7CisJCQkJCQkJCQlpZiAodGhpcy5iYWNrZ3JvdW5kSW1hZ2UgIT0gIiIpIHsKKwkJCQkJCQkJCQl2YXIgYm9yZGVyRnJhY3QgPSAodGhpcy5waXhlbEZyYWN0aW9uKGludHgsIGludHksIGJvcmRlclJhZGl1cykgKiAxMDApOworCQkJCQkJCQkJCWlmIChib3JkZXJGcmFjdCA8IDMwKSB7CisJCQkJCQkJCQkJCXRoaXMuZHJhd1BpeGVsKGludHgsIGludHksIHRoaXMuYm9yZGVyQ29sb3VyLCAxMDAsIDEsIG5ld0Nvcm5lciwgMCwgdGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzKTsKKwkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQl0aGlzLmRyYXdQaXhlbChpbnR4LCBpbnR5LCB0aGlzLmJvcmRlckNvbG91ciwgMTAwLCAxLCBuZXdDb3JuZXIsIC0xLCB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJdmFyIHBpeGVsY29sb3VyID0gZG9qby5nZnguY29sb3IuYmxlbmQodGhpcy5ib3hDb2xvdXIsIHRoaXMuYm9yZGVyQ29sb3VyLCB0aGlzLnBpeGVsRnJhY3Rpb24oaW50eCwgaW50eSwgYm9yZGVyUmFkaXVzKSk7CisJCQkJCQkJCQkJdGhpcy5kcmF3UGl4ZWwoaW50eCwgaW50eSwgcGl4ZWxjb2xvdXIsIDEwMCwgMSwgbmV3Q29ybmVyLCAwLCB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmICh5MyA+PSB5MikgeworCQkJCQkJCQlpZiAoeTEgPT0gLTEpIHsKKwkJCQkJCQkJCXkxID0gMDsKKwkJCQkJCQkJfQorCQkJCQkJCQl0aGlzLmRyYXdQaXhlbChpbnR4LCB5MiwgdGhpcy5ib3JkZXJDb2xvdXIsIDEwMCwgKHkzIC0geTIgKyAxKSwgbmV3Q29ybmVyLCAwLCB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMpOworCQkJCQkJCX0KKwkJCQkJCQl2YXIgb3V0c2lkZUNvbG91ciA9IHRoaXMuYm9yZGVyQ29sb3VyOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl2YXIgb3V0c2lkZUNvbG91ciA9IHRoaXMuYm94Q29sb3VyOworCQkJCQkJCXZhciB5MyA9IHkxOworCQkJCQkJfQorCQkJCQkJaWYgKHRoaXMuYW50aUFsaWFzKSB7CisJCQkJCQkJZm9yICh2YXIgaW50eSA9ICh5MyArIDEpOyBpbnR5IDwgeTQ7IGludHkrKykgeworCQkJCQkJCQl0aGlzLmRyYXdQaXhlbChpbnR4LCBpbnR5LCBvdXRzaWRlQ29sb3VyLCAodGhpcy5waXhlbEZyYWN0aW9uKGludHgsIGludHksIGopICogMTAwKSwgMSwgbmV3Q29ybmVyLCAoKHRoaXMuYm9yZGVyV2lkdGggPiAwKSA/IDAgOiAtMSksIHRoaXMuc2V0dGluZ3NbY2NdLnJhZGl1cyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCXRoaXMubWFzdGVyQ29ybmVyc1t0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXNdID0gbmV3Q29ybmVyLmNsb25lTm9kZSh0cnVlKTsKKwkJCQl9CisJCQkJaWYgKGNjICE9ICJiciIpIHsKKwkJCQkJZm9yICh2YXIgdCA9IDAsIGsgPSBuZXdDb3JuZXIuY2hpbGROb2Rlcy5sZW5ndGg7IHQgPCBrOyB0KyspIHsKKwkJCQkJCXZhciBwaXhlbEJhciA9IG5ld0Nvcm5lci5jaGlsZE5vZGVzW3RdOworCQkJCQkJdmFyIHBpeGVsQmFyVG9wID0gcGFyc2VJbnQocGl4ZWxCYXIuc3R5bGUudG9wLnN1YnN0cmluZygwLCBwaXhlbEJhci5zdHlsZS50b3AuaW5kZXhPZigicHgiKSkpOworCQkJCQkJdmFyIHBpeGVsQmFyTGVmdCA9IHBhcnNlSW50KHBpeGVsQmFyLnN0eWxlLmxlZnQuc3Vic3RyaW5nKDAsIHBpeGVsQmFyLnN0eWxlLmxlZnQuaW5kZXhPZigicHgiKSkpOworCQkJCQkJdmFyIHBpeGVsQmFySGVpZ2h0ID0gcGFyc2VJbnQocGl4ZWxCYXIuc3R5bGUuaGVpZ2h0LnN1YnN0cmluZygwLCBwaXhlbEJhci5zdHlsZS5oZWlnaHQuaW5kZXhPZigicHgiKSkpOworCQkJCQkJaWYgKGNjID09ICJ0bCIgfHwgY2MgPT0gImJsIikgeworCQkJCQkJCXBpeGVsQmFyLnN0eWxlLmxlZnQgPSB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMgLSBwaXhlbEJhckxlZnQgLSAxICsgInB4IjsKKwkJCQkJCX0KKwkJCQkJCWlmIChjYyA9PSAidHIiIHx8IGNjID09ICJ0bCIpIHsKKwkJCQkJCQlwaXhlbEJhci5zdHlsZS50b3AgPSB0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMgLSBwaXhlbEJhckhlaWdodCAtIHBpeGVsQmFyVG9wICsgInB4IjsKKwkJCQkJCX0KKwkJCQkJCXZhciB2YWx1ZTsKKwkJCQkJCXN3aXRjaCAoY2MpIHsKKwkJCQkJCSAgY2FzZSAidHIiOgorCQkJCQkJCXZhbHVlID0gKC0xICogKE1hdGguYWJzKCh0aGlzLmJveFdpZHRoIC0gdGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzICsgdGhpcy5ib3JkZXJXaWR0aCkgKyBwaXhlbEJhckxlZnQpIC0gKE1hdGguYWJzKHRoaXMuc2V0dGluZ3NbY2NdLnJhZGl1cyAtIHBpeGVsQmFySGVpZ2h0IC0gcGl4ZWxCYXJUb3AgLSB0aGlzLmJvcmRlcldpZHRoKSkpKTsKKwkJCQkJCQlwaXhlbEJhci5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSB2YWx1ZSArICJweCI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGNhc2UgInRsIjoKKwkJCQkJCQl2YWx1ZSA9ICgtMSAqIChNYXRoLmFicygodGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzIC0gcGl4ZWxCYXJMZWZ0IC0gMSkgLSB0aGlzLmJvcmRlcldpZHRoKSAtIChNYXRoLmFicyh0aGlzLnNldHRpbmdzW2NjXS5yYWRpdXMgLSBwaXhlbEJhckhlaWdodCAtIHBpeGVsQmFyVG9wIC0gdGhpcy5ib3JkZXJXaWR0aCkpKSk7CisJCQkJCQkJcGl4ZWxCYXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gdmFsdWUgKyAicHgiOworCQkJCQkJCWJyZWFrOworCQkJCQkJICBjYXNlICJibCI6CisJCQkJCQkJdmFsdWUgPSAoLTEgKiAoTWF0aC5hYnMoKHRoaXMuc2V0dGluZ3NbY2NdLnJhZGl1cyAtIHBpeGVsQmFyTGVmdCAtIDEpIC0gdGhpcy5ib3JkZXJXaWR0aCkgLSAoTWF0aC5hYnMoKHRoaXMuYm94SGVpZ2h0ICsgdGhpcy5zZXR0aW5nc1tjY10ucmFkaXVzICsgcGl4ZWxCYXJUb3ApIC0gdGhpcy5ib3JkZXJXaWR0aCkpKSk7CisJCQkJCQkJcGl4ZWxCYXIuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gdmFsdWUgKyAicHgiOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKG5ld0Nvcm5lcikgeworCQkJCXN3aXRjaCAoY2MpIHsKKwkJCQkgIGNhc2UgInRsIjoKKwkJCQkJaWYgKG5ld0Nvcm5lci5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiKSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUudG9wID0gIjBweCI7CisJCQkJCX0KKwkJCQkJaWYgKG5ld0Nvcm5lci5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiKSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUubGVmdCA9ICIwcHgiOworCQkJCQl9CisJCQkJCWlmICh0aGlzLnRvcENvbnRhaW5lcikgeworCQkJCQkJdGhpcy50b3BDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3Q29ybmVyKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgInRyIjoKKwkJCQkJaWYgKG5ld0Nvcm5lci5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiKSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUudG9wID0gIjBweCI7CisJCQkJCX0KKwkJCQkJaWYgKG5ld0Nvcm5lci5zdHlsZS5wb3NpdGlvbiA9PSAiYWJzb2x1dGUiKSB7CisJCQkJCQluZXdDb3JuZXIuc3R5bGUucmlnaHQgPSAiMHB4IjsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy50b3BDb250YWluZXIpIHsKKwkJCQkJCXRoaXMudG9wQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0Nvcm5lcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJibCI6CisJCQkJCWlmIChuZXdDb3JuZXIuc3R5bGUucG9zaXRpb24gPT0gImFic29sdXRlIikgeworCQkJCQkJbmV3Q29ybmVyLnN0eWxlLmJvdHRvbSA9ICIwcHgiOworCQkJCQl9CisJCQkJCWlmIChuZXdDb3JuZXIuc3R5bGUucG9zaXRpb24gPT0gImFic29sdXRlIikgeworCQkJCQkJbmV3Q29ybmVyLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5ib3R0b21Db250YWluZXIpIHsKKwkJCQkJCXRoaXMuYm90dG9tQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0Nvcm5lcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJiciI6CisJCQkJCWlmIChuZXdDb3JuZXIuc3R5bGUucG9zaXRpb24gPT0gImFic29sdXRlIikgeworCQkJCQkJbmV3Q29ybmVyLnN0eWxlLmJvdHRvbSA9ICIwcHgiOworCQkJCQl9CisJCQkJCWlmIChuZXdDb3JuZXIuc3R5bGUucG9zaXRpb24gPT0gImFic29sdXRlIikgeworCQkJCQkJbmV3Q29ybmVyLnN0eWxlLnJpZ2h0ID0gIjBweCI7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuYm90dG9tQ29udGFpbmVyKSB7CisJCQkJCQl0aGlzLmJvdHRvbUNvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdDb3JuZXIpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQl2YXIgcmFkaXVzRGlmZiA9IFtdOworCQlyYWRpdXNEaWZmWyJ0Il0gPSB0aGlzLnNldHRpbmdzLnRsLmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5ncy50ci5lbmFibGVkID8gTWF0aC5hYnModGhpcy5zZXR0aW5ncy50bC5yYWRpdXMgLSB0aGlzLnNldHRpbmdzLnRyLnJhZGl1cykgOiAwOworCQlyYWRpdXNEaWZmWyJiIl0gPSB0aGlzLnNldHRpbmdzLmJsLmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5ncy5ici5lbmFibGVkID8gTWF0aC5hYnModGhpcy5zZXR0aW5ncy5ibC5yYWRpdXMgLSB0aGlzLnNldHRpbmdzLmJyLnJhZGl1cykgOiAwOworCQlmb3IgKHZhciB6IGluIHJhZGl1c0RpZmYpIHsKKwkJCWlmIChyYWRpdXNEaWZmW3pdKSB7CisJCQkJdmFyIHNtYWxsZXJDb3JuZXJUeXBlID0gKCh0aGlzLnNldHRpbmdzW3ogKyAibCJdLnJhZGl1cyA8IHRoaXMuc2V0dGluZ3NbeiArICJyIl0ucmFkaXVzKSA/IHogKyAibCIgOiB6ICsgInIiKTsKKwkJCQl2YXIgbmV3RmlsbGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CisJCQkJd2l0aCAobmV3RmlsbGVyLnN0eWxlKSB7CisJCQkJCWhlaWdodCA9IHJhZGl1c0RpZmZbel0gKyAicHgiOworCQkJCQl3aWR0aCA9IHRoaXMuc2V0dGluZ3Nbc21hbGxlckNvcm5lclR5cGVdLnJhZGl1cyArICJweCI7CisJCQkJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCQkJZm9udFNpemUgPSAiMXB4IjsKKwkJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQkJYmFja2dyb3VuZENvbG9yID0gdGhpcy5ib3hDb2xvdXI7CisJCQkJfQorCQkJCXN3aXRjaCAoc21hbGxlckNvcm5lclR5cGUpIHsKKwkJCQkgIGNhc2UgInRsIjoKKwkJCQkJd2l0aCAobmV3RmlsbGVyLnN0eWxlKSB7CisJCQkJCQlib3R0b20gPSAiMHB4IjsKKwkJCQkJCWxlZnQgPSAiMHB4IjsKKwkJCQkJCWJvcmRlckxlZnQgPSB0aGlzLmJvcmRlclN0cmluZzsKKwkJCQkJfQorCQkJCQl0aGlzLnRvcENvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdGaWxsZXIpOworCQkJCQlicmVhazsKKwkJCQkgIGNhc2UgInRyIjoKKwkJCQkJd2l0aCAobmV3RmlsbGVyLnN0eWxlKSB7CisJCQkJCQlib3R0b20gPSAiMHB4IjsKKwkJCQkJCXJpZ2h0ID0gIjBweCI7CisJCQkJCQlib3JkZXJSaWdodCA9IHRoaXMuYm9yZGVyU3RyaW5nOworCQkJCQl9CisJCQkJCXRoaXMudG9wQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0ZpbGxlcik7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiYmwiOgorCQkJCQl3aXRoIChuZXdGaWxsZXIuc3R5bGUpIHsKKwkJCQkJCXRvcCA9ICIwcHgiOworCQkJCQkJbGVmdCA9ICIwcHgiOworCQkJCQkJYm9yZGVyTGVmdCA9IHRoaXMuYm9yZGVyU3RyaW5nOworCQkJCQl9CisJCQkJCXRoaXMuYm90dG9tQ29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0ZpbGxlcik7CisJCQkJCWJyZWFrOworCQkJCSAgY2FzZSAiYnIiOgorCQkJCQl3aXRoIChuZXdGaWxsZXIuc3R5bGUpIHsKKwkJCQkJCXRvcCA9ICIwcHgiOworCQkJCQkJcmlnaHQgPSAiMHB4IjsKKwkJCQkJCWJvcmRlclJpZ2h0ID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCX0KKwkJCQkJdGhpcy5ib3R0b21Db250YWluZXIuYXBwZW5kQ2hpbGQobmV3RmlsbGVyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJdmFyIG5ld0ZpbGxlckJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpOworCQkJd2l0aCAobmV3RmlsbGVyQmFyLnN0eWxlKSB7CisJCQkJcG9zaXRpb24gPSAicmVsYXRpdmUiOworCQkJCWZvbnRTaXplID0gIjFweCI7CisJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQliYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJveENvbG91cjsKKwkJCX0KKwkJCXN3aXRjaCAoeikgeworCQkJICBjYXNlICJ0IjoKKwkJCQlpZiAodGhpcy50b3BDb250YWluZXIpIHsKKwkJCQkJd2l0aCAobmV3RmlsbGVyQmFyLnN0eWxlKSB7CisJCQkJCQloZWlnaHQgPSB0b3BNYXhSYWRpdXMgLSB0aGlzLmJvcmRlcldpZHRoICsgInB4IjsKKwkJCQkJCW1hcmdpbkxlZnQgPSB0aGlzLnNldHRpbmdzLnRsLnJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJbWFyZ2luUmlnaHQgPSB0aGlzLnNldHRpbmdzLnRyLnJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJYm9yZGVyVG9wID0gdGhpcy5ib3JkZXJTdHJpbmc7CisJCQkJCX0KKwkJCQkJdGhpcy50b3BDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RmlsbGVyQmFyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgIGNhc2UgImIiOgorCQkJCWlmICh0aGlzLmJvdHRvbUNvbnRhaW5lcikgeworCQkJCQl3aXRoIChuZXdGaWxsZXJCYXIuc3R5bGUpIHsKKwkJCQkJCWhlaWdodCA9IGJvdE1heFJhZGl1cyAtIHRoaXMuYm9yZGVyV2lkdGggKyAicHgiOworCQkJCQkJbWFyZ2luTGVmdCA9IHRoaXMuc2V0dGluZ3MuYmwucmFkaXVzIC0gdGhpcy5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCQltYXJnaW5SaWdodCA9IHRoaXMuc2V0dGluZ3MuYnIucmFkaXVzIC0gdGhpcy5ib3JkZXJXaWR0aCArICJweCI7CisJCQkJCQlib3JkZXJCb3R0b20gPSB0aGlzLmJvcmRlclN0cmluZzsKKwkJCQkJfQorCQkJCQl0aGlzLmJvdHRvbUNvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdGaWxsZXJCYXIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX07CisJdGhpcy5kcmF3UGl4ZWwgPSBmdW5jdGlvbiAoaW50eCwgaW50eSwgY29sb3VyLCB0cmFuc0Ftb3VudCwgaGVpZ2h0LCBuZXdDb3JuZXIsIGltYWdlLCBjb3JuZXJSYWRpdXMpIHsKKwkJdmFyIHBpeGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CisJCXBpeGVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7CisJCXBpeGVsLnN0eWxlLndpZHRoID0gIjFweCI7CisJCXBpeGVsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJcGl4ZWwuc3R5bGUuZm9udFNpemUgPSAiMXB4IjsKKwkJcGl4ZWwuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJaWYgKGltYWdlID09IC0xICYmIHRoaXMuYmFja2dyb3VuZEltYWdlICE9ICIiKSB7CisJCQlwaXhlbC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSB0aGlzLmJhY2tncm91bmRJbWFnZTsKKwkJCXBpeGVsLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICItIiArICh0aGlzLmJveFdpZHRoIC0gKGNvcm5lclJhZGl1cyAtIGludHgpICsgdGhpcy5ib3JkZXJXaWR0aCkgKyAicHggLSIgKyAoKHRoaXMuYm94SGVpZ2h0ICsgY29ybmVyUmFkaXVzICsgaW50eSkgLSB0aGlzLmJvcmRlcldpZHRoKSArICJweCI7CisJCX0gZWxzZSB7CisJCQlwaXhlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvdXI7CisJCX0KKwkJaWYgKHRyYW5zQW1vdW50ICE9IDEwMCkgeworCQkJZG9qby5odG1sLnNldE9wYWNpdHkocGl4ZWwsIHRyYW5zQW1vdW50KTsKKwkJfQorCQlwaXhlbC5zdHlsZS50b3AgPSBpbnR5ICsgInB4IjsKKwkJcGl4ZWwuc3R5bGUubGVmdCA9IGludHggKyAicHgiOworCQluZXdDb3JuZXIuYXBwZW5kQ2hpbGQocGl4ZWwpOworCX07Cit9LCBwaXhlbEZyYWN0aW9uOmZ1bmN0aW9uICh4LCB5LCByKSB7CisJdmFyIHBpeGVsZnJhY3Rpb24gPSAwOworCXZhciB4dmFsdWVzID0gW107CisJdmFyIHl2YWx1ZXMgPSBbXTsKKwl2YXIgcG9pbnQgPSAwOworCXZhciB3aGF0c2lkZXMgPSAiIjsKKwl2YXIgaW50ZXJzZWN0ID0gTWF0aC5zcXJ0KChNYXRoLnBvdyhyLCAyKSAtIE1hdGgucG93KHgsIDIpKSk7CisJaWYgKChpbnRlcnNlY3QgPj0geSkgJiYgKGludGVyc2VjdCA8ICh5ICsgMSkpKSB7CisJCXdoYXRzaWRlcyA9ICJMZWZ0IjsKKwkJeHZhbHVlc1twb2ludF0gPSAwOworCQl5dmFsdWVzW3BvaW50XSA9IGludGVyc2VjdCAtIHk7CisJCXBvaW50ID0gcG9pbnQgKyAxOworCX0KKwl2YXIgaW50ZXJzZWN0ID0gTWF0aC5zcXJ0KChNYXRoLnBvdyhyLCAyKSAtIE1hdGgucG93KHkgKyAxLCAyKSkpOworCWlmICgoaW50ZXJzZWN0ID49IHgpICYmIChpbnRlcnNlY3QgPCAoeCArIDEpKSkgeworCQl3aGF0c2lkZXMgPSB3aGF0c2lkZXMgKyAiVG9wIjsKKwkJeHZhbHVlc1twb2ludF0gPSBpbnRlcnNlY3QgLSB4OworCQl5dmFsdWVzW3BvaW50XSA9IDE7CisJCXBvaW50ID0gcG9pbnQgKyAxOworCX0KKwl2YXIgaW50ZXJzZWN0ID0gTWF0aC5zcXJ0KChNYXRoLnBvdyhyLCAyKSAtIE1hdGgucG93KHggKyAxLCAyKSkpOworCWlmICgoaW50ZXJzZWN0ID49IHkpICYmIChpbnRlcnNlY3QgPCAoeSArIDEpKSkgeworCQl3aGF0c2lkZXMgPSB3aGF0c2lkZXMgKyAiUmlnaHQiOworCQl4dmFsdWVzW3BvaW50XSA9IDE7CisJCXl2YWx1ZXNbcG9pbnRdID0gaW50ZXJzZWN0IC0geTsKKwkJcG9pbnQgPSBwb2ludCArIDE7CisJfQorCXZhciBpbnRlcnNlY3QgPSBNYXRoLnNxcnQoKE1hdGgucG93KHIsIDIpIC0gTWF0aC5wb3coeSwgMikpKTsKKwlpZiAoKGludGVyc2VjdCA+PSB4KSAmJiAoaW50ZXJzZWN0IDwgKHggKyAxKSkpIHsKKwkJd2hhdHNpZGVzID0gd2hhdHNpZGVzICsgIkJvdHRvbSI7CisJCXh2YWx1ZXNbcG9pbnRdID0gaW50ZXJzZWN0IC0geDsKKwkJeXZhbHVlc1twb2ludF0gPSAwOworCX0KKwlzd2l0Y2ggKHdoYXRzaWRlcykgeworCSAgY2FzZSAiTGVmdFJpZ2h0IjoKKwkJcGl4ZWxmcmFjdGlvbiA9IE1hdGgubWluKHl2YWx1ZXNbMF0sIHl2YWx1ZXNbMV0pICsgKChNYXRoLm1heCh5dmFsdWVzWzBdLCB5dmFsdWVzWzFdKSAtIE1hdGgubWluKHl2YWx1ZXNbMF0sIHl2YWx1ZXNbMV0pKSAvIDIpOworCQlicmVhazsKKwkgIGNhc2UgIlRvcFJpZ2h0IjoKKwkJcGl4ZWxmcmFjdGlvbiA9IDEgLSAoKCgxIC0geHZhbHVlc1swXSkgKiAoMSAtIHl2YWx1ZXNbMV0pKSAvIDIpOworCQlicmVhazsKKwkgIGNhc2UgIlRvcEJvdHRvbSI6CisJCXBpeGVsZnJhY3Rpb24gPSBNYXRoLm1pbih4dmFsdWVzWzBdLCB4dmFsdWVzWzFdKSArICgoTWF0aC5tYXgoeHZhbHVlc1swXSwgeHZhbHVlc1sxXSkgLSBNYXRoLm1pbih4dmFsdWVzWzBdLCB4dmFsdWVzWzFdKSkgLyAyKTsKKwkJYnJlYWs7CisJICBjYXNlICJMZWZ0Qm90dG9tIjoKKwkJcGl4ZWxmcmFjdGlvbiA9ICh5dmFsdWVzWzBdICogeHZhbHVlc1sxXSkgLyAyOworCQlicmVhazsKKwkgIGRlZmF1bHQ6CisJCXBpeGVsZnJhY3Rpb24gPSAxOworCX0KKwlyZXR1cm4gcGl4ZWxmcmFjdGlvbjsKK30sIHJnYjJIZXg6ZnVuY3Rpb24gKHJnYkNvbG91cikgeworCXRyeSB7CisJCXZhciByZ2JBcnJheSA9IHRoaXMucmdiMkFycmF5KHJnYkNvbG91cik7CisJCXZhciByZWQgPSBwYXJzZUludChyZ2JBcnJheVswXSk7CisJCXZhciBncmVlbiA9IHBhcnNlSW50KHJnYkFycmF5WzFdKTsKKwkJdmFyIGJsdWUgPSBwYXJzZUludChyZ2JBcnJheVsyXSk7CisJCXZhciBoZXhDb2xvdXIgPSAiIyIgKyB0aGlzLmludFRvSGV4KHJlZCkgKyB0aGlzLmludFRvSGV4KGdyZWVuKSArIHRoaXMuaW50VG9IZXgoYmx1ZSk7CisJfQorCWNhdGNoIChlKSB7CisJCWFsZXJ0KCJUaGVyZSB3YXMgYW4gZXJyb3IgY29udmVydGluZyB0aGUgUkdCIHZhbHVlIHRvIEhleGFkZWNpbWFsIGluIGZ1bmN0aW9uIHJnYjJIZXgiKTsKKwl9CisJcmV0dXJuIGhleENvbG91cjsKK30sIGludFRvSGV4OmZ1bmN0aW9uIChzdHJOdW0pIHsKKwl2YXIgYmFzZSA9IHN0ck51bSAvIDE2OworCXZhciByZW0gPSBzdHJOdW0gJSAxNjsKKwl2YXIgYmFzZSA9IGJhc2UgLSAocmVtIC8gMTYpOworCXZhciBiYXNlUyA9IHRoaXMubWFrZUhleChiYXNlKTsKKwl2YXIgcmVtUyA9IHRoaXMubWFrZUhleChyZW0pOworCXJldHVybiBiYXNlUyArICIiICsgcmVtUzsKK30sIG1ha2VIZXg6ZnVuY3Rpb24gKHgpIHsKKwlpZiAoKHggPj0gMCkgJiYgKHggPD0gOSkpIHsKKwkJcmV0dXJuIHg7CisJfSBlbHNlIHsKKwkJc3dpdGNoICh4KSB7CisJCSAgY2FzZSAxMDoKKwkJCXJldHVybiAiQSI7CisJCSAgY2FzZSAxMToKKwkJCXJldHVybiAiQiI7CisJCSAgY2FzZSAxMjoKKwkJCXJldHVybiAiQyI7CisJCSAgY2FzZSAxMzoKKwkJCXJldHVybiAiRCI7CisJCSAgY2FzZSAxNDoKKwkJCXJldHVybiAiRSI7CisJCSAgY2FzZSAxNToKKwkJCXJldHVybiAiRiI7CisJCX0KKwl9Cit9LCByZ2IyQXJyYXk6ZnVuY3Rpb24gKHJnYkNvbG91cikgeworCXZhciByZ2JWYWx1ZXMgPSByZ2JDb2xvdXIuc3Vic3RyaW5nKDQsIHJnYkNvbG91ci5pbmRleE9mKCIpIikpOworCXZhciByZ2JBcnJheSA9IHJnYlZhbHVlcy5zcGxpdCgiLCAiKTsKKwlyZXR1cm4gcmdiQXJyYXk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2VsZWN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TZWxlY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwZTI1OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2VsZWN0LmpzCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNlbGVjdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db21ib0JveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5TZWxlY3QiLCBkb2pvLndpZGdldC5Db21ib0JveCwge2ZvcmNlVmFsaWRPcHRpb246dHJ1ZSwgc2V0VmFsdWU6ZnVuY3Rpb24gKHZhbHVlKSB7CisJdGhpcy5jb21ib0JveFZhbHVlLnZhbHVlID0gdmFsdWU7CisJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLnNldFN0YXRlKHRoaXMud2lkZ2V0SWQsIHRoaXMuZ2V0U3RhdGUoKSwgdHJ1ZSk7CisJdGhpcy5vblZhbHVlQ2hhbmdlZCh2YWx1ZSk7Cit9LCBzZXRMYWJlbDpmdW5jdGlvbiAodmFsdWUpIHsKKwl0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWUgPSB2YWx1ZTsKKwlpZiAodGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlICE9IHZhbHVlKSB7CisJCXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSA9IHZhbHVlOworCX0KK30sIGdldExhYmVsOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLnZhbHVlOworfSwgZ2V0U3RhdGU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB7dmFsdWU6dGhpcy5nZXRWYWx1ZSgpLCBsYWJlbDp0aGlzLmdldExhYmVsKCl9OworfSwgb25LZXlVcDpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5zZXRMYWJlbCh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUpOworfSwgc2V0U3RhdGU6ZnVuY3Rpb24gKHN0YXRlKSB7CisJdGhpcy5zZXRWYWx1ZShzdGF0ZS52YWx1ZSk7CisJdGhpcy5zZXRMYWJlbChzdGF0ZS5sYWJlbCk7Cit9LCBzZXRBbGxWYWx1ZXM6ZnVuY3Rpb24gKHZhbHVlMSwgdmFsdWUyKSB7CisJdGhpcy5zZXRMYWJlbCh2YWx1ZTEpOworCXRoaXMuc2V0VmFsdWUodmFsdWUyKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TaG93LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TaG93LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjcxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Nob3cuanMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNob3ciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8udXJpLlVyaSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sZnguKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGguY3VydmVzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmZ1bmMiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuU2hvdyIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9zbGlkZXMgPSBbXTsKK30sIHtpc0NvbnRhaW5lcjp0cnVlLCBfc2xpZGU6LTEsIGJvZHk6bnVsbCwgbmF2Om51bGwsIGhpZGVyOm51bGwsIHNlbGVjdDpudWxsLCBvcHRpb246bnVsbCwgaW5OYXY6ZmFsc2UsIGRlYnVnUGFuZTpudWxsLCBub0NsaWNrOmZhbHNlLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9TaG93XCI+XG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY29udGVudE5vZGVcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImRvam9TaG93TmF2XCIgZG9qb0F0dGFjaFBvaW50PVwibmF2XCI+XG5cdFx0PGRpdiBjbGFzcz1cImRvam9TaG93SGlkZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJoaWRlclwiPjwvZGl2PlxuXHRcdDxzcGFuIHVuc2VsZWN0YWJsZT1cIm9uXCIgc3R5bGU9XCJjdXJzb3I6IGRlZmF1bHQ7XCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpwcmV2aW91c1NsaWRlXCI+Jmx0Ozwvc3Bhbj5cblx0XHQ8c2VsZWN0IGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6Z290b1NsaWRlQnlFdmVudFwiIGRvam9BdHRhY2hQb2ludD1cInNlbGVjdFwiPlxuXHRcdFx0PG9wdGlvbiBkb2pvQXR0YWNoUG9pbnQ9XCJvcHRpb25cIj5UaXRsZTwvb3B0aW9uPlxuXHRcdDwvc2VsZWN0PlxuXHRcdDxzcGFuIHVuc2VsZWN0YWJsZT1cIm9uXCIgc3R5bGU9XCJjdXJzb3I6IGRlZmF1bHQ7XCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpuZXh0U2xpZGVcIj4mZ3Q7PC9zcGFuPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6IkBtZWRpYSBzY3JlZW4ge1xuXHRodG1sLCBib2R5IHtcblx0XHRtYXJnaW46IDBweDtcblx0XHRwYWRkaW5nOiAwcHg7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cblx0aDEge1xuXHRcdGZvbnQtc2l6ZTogNTBweDtcblx0fVxuXHRwLCBsaSB7XG5cdFx0Zm9udC1zaXplOiAzMHB4O1xuXHR9XG5cdC5kb2pvU2hvd05hdiB7XG5cdFx0YmFja2dyb3VuZDogIzM2OTtcblx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRoZWlnaHQ6IDVweDtcblx0XHRib3R0b206IDBweDtcblx0XHRsZWZ0OiAwcHg7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHR9XG5cdC5kb2pvU2hvd05hdiBpbnB1dCB7XG5cdFx0bWFyZ2luOiAwcHg7XG5cdH1cblx0LmRvam9TaG93SGlkZXIge1xuXHRcdGhlaWdodDogNXB4O1xuXHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0d2lkdGg6IDEwMCU7XG5cdH1cblx0LmRvam9TaG93UHJpbnQge1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRsZWZ0OiA1cHg7XG5cdFx0dG9wOiAwcHg7XG5cdH1cblx0LmRvam9TaG93IHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG59XG5AbWVkaWEgcHJpbnQge1xuXHQuZG9qb1Nob3cge1xuXHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0fVxuXHQuZG9qb1Nob3dQcmludCB7XG5cdFx0ZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcblx0fVxuXHQuZG9qb1Nob3dQcmludFNsaWRlIHtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjYWFhO1xuXHRcdHBhZGRpbmc6IDEwcHg7XG5cdFx0bWFyZ2luLWJvdHRvbTogMTVweDtcblx0fVxuXHQuZG9qb1Nob3dQcmludFNsaWRlLCB1bCB7XG5cdHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDtcblx0fVxuXHRoMSB7XG5cdFx0bWFyZ2luLXRvcDogMDtcblx0XHRwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDtcblx0fVxufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL1Nob3cuY3NzIiksIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJaWYgKGFyZ3MuZGVidWdQYW5lKSB7CisJCXZhciBkcCA9IHRoaXMuZGVidWdQYW5lID0gZG9qby53aWRnZXQuYnlJZChhcmdzLmRlYnVnUGFuZSk7CisJCWRwLmhpZGUoKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KGRwLCAiY2xvc2VXaW5kb3ciLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQkJdGhpcy5kZWJ1Z1BhbmUgPSBmYWxzZTsKKwkJfSkpOworCX0KKwl2YXIgc291cmNlID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwl0aGlzLnNvdXJjZU5vZGUgPSBkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChzb3VyY2UuY2xvbmVOb2RlKHRydWUpKTsKKwlmb3IgKHZhciBpID0gMCwgY2hpbGQ7IGNoaWxkID0gdGhpcy5zb3VyY2VOb2RlLmNoaWxkTm9kZXNbaV07IGkrKykgeworCQlpZiAoY2hpbGQudGFnTmFtZSAmJiBjaGlsZC5nZXRBdHRyaWJ1dGUoImRvam90eXBlIikudG9Mb3dlckNhc2UoKSA9PSAic2hvd3NsaWRlIikgeworCQkJY2hpbGQuY2xhc3NOYW1lID0gImRvam9TaG93UHJpbnRTbGlkZSI7CisJCQljaGlsZC5pbm5lckhUTUwgPSAiPGgxPiIgKyBjaGlsZC50aXRsZSArICI8L2gxPiIgKyBjaGlsZC5pbm5lckhUTUw7CisJCX0KKwl9CisJdGhpcy5zb3VyY2VOb2RlLmNsYXNzTmFtZSA9ICJkb2pvU2hvd1ByaW50IjsKKwl0aGlzLnNvdXJjZU5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQsICJvbmNsaWNrIiwgdGhpcywgImdvdG9TbGlkZUJ5RXZlbnQiKTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQsICJvbmtleWRvd24iLCB0aGlzLCAiZ290b1NsaWRlQnlFdmVudCIpOworCX0gZWxzZSB7CisJCWRvam8uZXZlbnQuY29ubmVjdChkb2N1bWVudCwgIm9ua2V5cHJlc3MiLCB0aGlzLCAiZ290b1NsaWRlQnlFdmVudCIpOworCX0KKwlkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib25yZXNpemUiLCB0aGlzLCAicmVzaXplV2luZG93Iik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMubmF2LCAib25tb3VzZW1vdmUiLCB0aGlzLCAicG9wVXBOYXYiKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuX3NsaWRlcyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBjaGlsZDsgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOyBpKyspIHsKKwkJaWYgKGNoaWxkLndpZGdldFR5cGUgPT0gIlNob3dTbGlkZSIpIHsKKwkJCXRoaXMuX3NsaWRlcy5wdXNoKGNoaWxkKTsKKwkJCXRoaXMub3B0aW9uLnRleHQgPSBjaGlsZC50aXRsZSArICIgKCIgKyAoaSArIDEpICsgIikiOworCQkJdGhpcy5vcHRpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5vcHRpb24uY2xvbmVOb2RlKHRydWUpLCB0aGlzLm9wdGlvbik7CisJCX0KKwl9CisJdGhpcy5vcHRpb24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9wdGlvbik7CisJdGhpcy5kb21Ob2RlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCXRoaXMucmVzaXplV2luZG93KCk7CisJdGhpcy5nb3RvU2xpZGUoMCwgdHJ1ZSk7CisJZG9qby5hZGRPbkxvYWQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJdmFyIHRoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CisJCWlmICh0aC5sZW5ndGgpIHsKKwkJCXZhciBwYXJ0cyA9ICgiIiArIHdpbmRvdy5sb2NhdGlvbikuc3BsaXQodGhpcy53aWRnZXRJZCArICJfU2xpZGVOb18iKTsKKwkJCWlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CisJCQkJc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQkJCQl0aGlzLmdvdG9TbGlkZShwYXJzZUludChwYXJ0c1sxXSksIHRydWUpOworCQkJCX0pLCAzMDApOworCQkJfQorCQl9CisJfSkpOworfSwgZ290b1NsaWRlOmZ1bmN0aW9uIChzbGlkZSwgcHJldmVudFNldEhhc2gpIHsKKwlpZiAoc2xpZGUgPT0gdGhpcy5fc2xpZGUpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXRoaXMuX3NsaWRlc1tzbGlkZV0pIHsKKwkJZm9yICh2YXIgaSA9IDAsIGNoaWxkOyBjaGlsZCA9IHRoaXMuX3NsaWRlc1tpXTsgaSsrKSB7CisJCQlpZiAoY2hpbGQudGl0bGUgPT0gc2xpZGUpIHsKKwkJCQlzbGlkZSA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCF0aGlzLl9zbGlkZXNbc2xpZGVdKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMuZGVidWdQYW5lKSB7CisJCWlmICh0aGlzLl9zbGlkZXNbc2xpZGVdLmRlYnVnKSB7CisJCQl0aGlzLmRlYnVnUGFuZS5zaG93KCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmRlYnVnUGFuZS5oaWRlKCk7CisJCX0KKwl9CisJaWYgKHRoaXMuX3NsaWRlICE9IC0xKSB7CisJCXdoaWxlICh0aGlzLl9zbGlkZXNbdGhpcy5fc2xpZGVdLnByZXZpb3VzQWN0aW9uKCkpIHsKKwkJfQorCX0KKwlpZiAoIXByZXZlbnRTZXRIYXNoKSB7CisJCXdpbmRvdy5sb2NhdGlvbi5ocmVmID0gIiMiICsgdGhpcy53aWRnZXRJZCArICJfU2xpZGVOb18iICsgc2xpZGU7CisJfQorCWlmICh0aGlzLl9zbGlkZXNbdGhpcy5fc2xpZGVdKSB7CisJCXRoaXMuX3NsaWRlc1t0aGlzLl9zbGlkZV0uaGlkZSgpOworCX0KKwl0aGlzLl9zbGlkZSA9IHNsaWRlOworCXRoaXMuc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBzbGlkZTsKKwl2YXIgY24gPSB0aGlzLmNvbnRlbnROb2RlOworCXdoaWxlIChjbi5maXJzdENoaWxkKSB7CisJCWNuLnJlbW92ZUNoaWxkKGNuLmZpcnN0Q2hpbGQpOworCX0KKwljbi5hcHBlbmRDaGlsZCh0aGlzLl9zbGlkZXNbc2xpZGVdLmRvbU5vZGUpOworCXRoaXMuX3NsaWRlc1tzbGlkZV0uc2hvdygpOworfSwgZ290b1NsaWRlQnlFdmVudDpmdW5jdGlvbiAoZXZlbnQpIHsKKwl2YXIgbm9kZSA9IGV2ZW50LnRhcmdldDsKKwl2YXIgdHlwZSA9IGV2ZW50LnR5cGU7CisJaWYgKHR5cGUgPT0gImNsaWNrIikgeworCQlpZiAobm9kZS50YWdOYW1lID09ICJPUFRJT04iICYmIG5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLnNlbGVjdCkgeworCQkJdGhpcy5nb3RvU2xpZGUobm9kZS5pbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAobm9kZSA9PSB0aGlzLnNlbGVjdCkgeworCQkJCXRoaXMuZ290b1NsaWRlKG5vZGUuc2VsZWN0ZWRJbmRleCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMubmV4dFNsaWRlKGV2ZW50KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmICh0eXBlID09ICJrZXlkb3duIiB8fCB0eXBlID09ICJrZXlwcmVzcyIpIHsKKwkJCXZhciBrZXkgPSBldmVudC5rZXlDb2RlOworCQkJdmFyIGNoID0gZXZlbnQuY2hhckNvZGU7CisJCQlpZiAoa2V5ID09IDYzMjM0IHx8IGtleSA9PSAzNykgeworCQkJCXRoaXMucHJldmlvdXNTbGlkZShldmVudCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChrZXkgPT0gNjMyMzUgfHwga2V5ID09IDM5IHx8IGNoID09IDMyKSB7CisJCQkJCXRoaXMubmV4dFNsaWRlKGV2ZW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9LCBuZXh0U2xpZGU6ZnVuY3Rpb24gKGV2ZW50KSB7CisJaWYgKCF0aGlzLnN0b3BFdmVudChldmVudCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoIXRoaXMuX3NsaWRlc1t0aGlzLl9zbGlkZV0ubmV4dEFjdGlvbihldmVudCkpIHsKKwkJaWYgKCh0aGlzLl9zbGlkZSArIDEpICE9IHRoaXMuX3NsaWRlcy5sZW5ndGgpIHsKKwkJCXRoaXMuZ290b1NsaWRlKHRoaXMuX3NsaWRlICsgMSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfSwgcHJldmlvdXNTbGlkZTpmdW5jdGlvbiAoZXZlbnQpIHsKKwlpZiAoIXRoaXMuc3RvcEV2ZW50KGV2ZW50KSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghdGhpcy5fc2xpZGVzW3RoaXMuX3NsaWRlXS5wcmV2aW91c0FjdGlvbihldmVudCkpIHsKKwkJaWYgKCh0aGlzLl9zbGlkZSAtIDEpICE9IC0xKSB7CisJCQl0aGlzLmdvdG9TbGlkZSh0aGlzLl9zbGlkZSAtIDEpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30sIHN0b3BFdmVudDpmdW5jdGlvbiAoZXYpIHsKKwlpZiAoIWV2KSB7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoZXYudHlwZSA9PSAiY2xpY2siICYmICh0aGlzLl9zbGlkZXNbdGhpcy5fc2xpZGVdLm5vQ2xpY2sgfHwgdGhpcy5ub0NsaWNrKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciB0YXJnZXQgPSBldi50YXJnZXQ7CisJd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7CisJCWlmICh0YXJnZXQgPT0gdGhpcy5kb21Ob2RlKSB7CisJCQl0YXJnZXQgPSBldi50YXJnZXQ7CisJCQlicmVhazsKKwkJfQorCQl0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTsKKwl9CisJaWYgKCFkb2pvLmRvbS5pc0Rlc2NlbmRhbnRPZih0YXJnZXQsIHRoaXMubmF2KSkgeworCQl3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPSB0aGlzLmRvbU5vZGUpIHsKKwkJCWlmICh0YXJnZXQudGFnTmFtZSA9PSAiQSIgfHwgdGFyZ2V0LnRhZ05hbWUgPT0gIklOUFVUIiB8fCB0YXJnZXQudGFnTmFtZSA9PSAiVEVYVEFSRUEiIHx8IHRhcmdldC50YWdOYW1lID09ICJTRUxFQ1QiKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKHR5cGVvZiB0YXJnZXQub25jbGljayA9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiB0YXJnZXQub25rZXlwcmVzcyA9PSAiZnVuY3Rpb24iKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CisJCX0KKwl9CisJaWYgKHdpbmRvdy5ldmVudCkgeworCQlldi5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQlldi5jYW5jZWxCdWJibGUgPSB0cnVlOworCX0gZWxzZSB7CisJCWV2LnByZXZlbnREZWZhdWx0KCk7CisJCWV2LnN0b3BQcm9wYWdhdGlvbigpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIHBvcFVwTmF2OmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaW5OYXYpIHsKKwkJZG9qby5sZngucHJvcGVydHlBbmltYXRpb24odGhpcy5uYXYsIHsiaGVpZ2h0Ijp7c3RhcnQ6NSwgZW5kOjMwfX0sIDI1MCkucGxheSgpOworCX0KKwljbGVhclRpbWVvdXQodGhpcy5pbk5hdik7CisJdGhpcy5pbk5hdiA9IHNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsICJoaWRlTmF2IiksIDIwMDApOworfSwgaGlkZU5hdjpmdW5jdGlvbiAoKSB7CisJY2xlYXJUaW1lb3V0KHRoaXMuaW5OYXYpOworCXRoaXMuaW5OYXYgPSBmYWxzZTsKKwlkb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbih0aGlzLm5hdiwgeyJoZWlnaHQiOntzdGFydDozMCwgZW5kOjV9fSwgMjUwKS5wbGF5KCk7Cit9LCByZXNpemVXaW5kb3c6ZnVuY3Rpb24gKGV2KSB7CisJZG9qby5ib2R5KCkuc3R5bGUuaGVpZ2h0ID0gImF1dG8iOworCXZhciBoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCB8fCBkb2pvLmJvZHkoKS5zY3JvbGxIZWlnaHQsIGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpLmhlaWdodCk7CisJZG9qby5ib2R5KCkuc3R5bGUuaGVpZ2h0ID0gaCArICJweCI7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2hvd0FjdGlvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2hvd0FjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIzMWIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TaG93QWN0aW9uLmpzCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNob3dBY3Rpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5TaG93QWN0aW9uIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge29uOiIiLCBhY3Rpb246ImZhZGUiLCBkdXJhdGlvbjozNTAsIGZyb206IiIsIHRvOiIiLCBhdXRvOiJmYWxzZSIsIHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLnJlbmRlci5odG1sLm9wZXJhKSB7CisJCXRoaXMuYWN0aW9uID0gdGhpcy5hY3Rpb24uc3BsaXQoIi8iKS5wb3AoKTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2hvd1NsaWRlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TaG93U2xpZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3YTg3OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2hvd1NsaWRlLmpzCkBAIC0wLDAgKzEsMjAxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5TaG93U2xpZGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sZnguaHRtbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmdmeC5jb2xvciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5TaG93U2xpZGUiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGl0bGU6IiIsIF9hY3Rpb246LTEsIGlzQ29udGFpbmVyOnRydWUsIF9jb21wb25lbnRzOnt9LCBfYWN0aW9uczpbXSwgZ290b0FjdGlvbjpmdW5jdGlvbiAoYWN0aW9uKSB7CisJdGhpcy5fYWN0aW9uID0gYWN0aW9uOworfSwgX25leHRBY3Rpb246ZnVuY3Rpb24gKGV2ZW50KSB7CisJaWYgKCh0aGlzLl9hY3Rpb24gKyAxKSAhPSB0aGlzLl9hY3Rpb25zLmxlbmd0aCkgeworCQkrK3RoaXMuX2FjdGlvbjsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30sIF9wcmV2aW91c0FjdGlvbjpmdW5jdGlvbiAoZXZlbnQpIHsKKwlpZiAoKHRoaXMuX2FjdGlvbiAtIDEpICE9IC0xKSB7CisJCS0tdGhpcy5fYWN0aW9uOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgaHRtbFRpdGxlOm51bGwsIGRlYnVnOmZhbHNlLCBub0NsaWNrOmZhbHNlLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9TaG93U2xpZGVcIj5cblx0PGRpdiBjbGFzcz1cImRvam9TaG93U2xpZGVUaXRsZVwiPlxuXHRcdDxoMSBkb2pvQXR0YWNoUG9pbnQ9XCJodG1sVGl0bGVcIj5UaXRsZTwvaDE+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiZG9qb1Nob3dTbGlkZUJvZHlcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCI+PC9kaXY+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZG9qb1Nob3dTbGlkZVRpdGxlIHtcblx0aGVpZ2h0OiAxMDBweDtcblx0YmFja2dyb3VuZDogIzM2OTtcbn1cbi5kb2pvU2hvd1NsaWRlVGl0bGUgaDEge1xuXHRtYXJnaW4tdG9wOiAwO1xuXHRsaW5lLWhlaWdodDogMTAwcHg7XG5cdG1hcmdpbi1sZWZ0OiAzMHB4O1xufVxuLmRvam9TaG93U2xpZGVCb2R5IHtcblx0bWFyZ2luOiAxNXB4O1xufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL1Nob3dTbGlkZS5jc3MiKSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5odG1sVGl0bGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTsKKwl2YXIgYWN0aW9ucyA9IHRoaXMuZ2V0Q2hpbGRyZW5PZlR5cGUoIlNob3dBY3Rpb24iLCBmYWxzZSk7CisJdmFyIGF0eXBlcyA9IHt9OworCWRvam8ubGFuZy5mb3JFYWNoKGFjdGlvbnMsIGZ1bmN0aW9uIChhY3QpIHsKKwkJYXR5cGVzW2FjdC5vbl0gPSB0cnVlOworCX0pOworCXRoaXMuX2NvbXBvbmVudHMgPSB7fTsKKwl2YXIgY24gPSB0aGlzLmNvbnRhaW5lck5vZGU7CisJdmFyIG5vZGVzID0gZG9qby5yZW5kZXIuaHRtbC5pZSA/IGNuLmFsbCA6IGNuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciBhcyA9IG5vZGUuZ2V0QXR0cmlidXRlKCJhcyIpOworCQlpZiAoYXMpIHsKKwkJCWlmICghdGhpcy5fY29tcG9uZW50c1thc10pIHsKKwkJCQl0aGlzLl9jb21wb25lbnRzW2FzXSA9IFtdOworCQkJfQorCQkJdGhpcy5fY29tcG9uZW50c1thc10ucHVzaChub2RlKTsKKwkJCWlmICghYXR5cGVzW2FzXSkgeworCQkJCXZhciB0bXBBY3Rpb24gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlNob3dBY3Rpb24iLCB7b246YXN9KTsKKwkJCQl0aGlzLmFkZENoaWxkKHRtcEFjdGlvbik7CisJCQkJYXR5cGVzW2FzXSA9IHRydWU7CisJCQl9CisJCX0KKwl9LCB0aGlzKTsKKwl0aGlzLl9hY3Rpb25zID0gW107CisJYWN0aW9ucyA9IHRoaXMuZ2V0Q2hpbGRyZW5PZlR5cGUoIlNob3dBY3Rpb24iLCBmYWxzZSk7CisJZG9qby5sYW5nLmZvckVhY2goYWN0aW9ucywgZnVuY3Rpb24gKGNoaWxkKSB7CisJCXRoaXMuX2FjdGlvbnMucHVzaChjaGlsZCk7CisJCXZhciBjb21wb25lbnRzID0gdGhpcy5fY29tcG9uZW50c1tjaGlsZC5vbl07CisJCWZvciAodmFyIGogPSAwLCBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbal07IGorKykgeworCQkJaWYgKGNoaWxkWyJhY3Rpb24iXSAmJiAoKGNoaWxkLmFjdGlvbiAhPSAicmVtb3ZlIikgJiYgKGNoaWxkLmFjdGlvbiAhPSAiZmFkZW91dCIpICYmIChjaGlsZC5hY3Rpb24gIT0gIndpcGVvdXQiKSkpIHsKKwkJCQl0aGlzLmhpZGVDb21wb25lbnQoY29tcG9uZW50KTsKKwkJCX0KKwkJfQorCX0sIHRoaXMpOworfSwgcHJldmlvdXNBY3Rpb246ZnVuY3Rpb24gKGV2ZW50KSB7CisJaWYgKCF0aGlzLnBhcmVudC5zdG9wRXZlbnQoZXZlbnQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIGFjdGlvbiA9IHRoaXMuX2FjdGlvbnNbdGhpcy5fYWN0aW9uXTsKKwlpZiAoIWFjdGlvbikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBvbiA9IGFjdGlvbi5vbjsKKwl3aGlsZSAoYWN0aW9uLm9uID09IG9uKSB7CisJCXZhciBjb21wb25lbnRzID0gdGhpcy5fY29tcG9uZW50c1tvbl07CisJCWZvciAodmFyIGkgPSAwLCBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07IGkrKykgeworCQkJaWYgKChhY3Rpb24uYWN0aW9uID09ICJyZW1vdmUiKSB8fCAoYWN0aW9uLmFjdGlvbiA9PSAiZmFkZW91dCIpIHx8IChhY3Rpb24uYWN0aW9uID09ICJ3aXBlb3V0IikpIHsKKwkJCQlpZiAoY29tcG9uZW50LnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKSB7CisJCQkJCWNvbXBvbmVudC5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQkJCWNvbXBvbmVudC5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOworCQkJCQl2YXIgZXhpdHMgPSB0cnVlOworCQkJCX0KKwkJCQlkb2pvLmh0bWwuc2V0T3BhY2l0eShjb21wb25lbnQsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYWN0aW9uLmFjdGlvbikgeworCQkJCQl0aGlzLmhpZGVDb21wb25lbnQoY29tcG9uZW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLS10aGlzLl9hY3Rpb247CisJCWlmIChleGl0cykgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGFjdGlvbi5hdXRvID09ICJ0cnVlIikgeworCQkJb24gPSB0aGlzLl9hY3Rpb25zW3RoaXMuX2FjdGlvbl0ub247CisJCX0KKwkJYWN0aW9uID0gdGhpcy5fYWN0aW9uc1t0aGlzLl9hY3Rpb25dOworCQlpZiAoIWFjdGlvbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfSwgaGlkZUNvbXBvbmVudDpmdW5jdGlvbiAoY29tcG9uZW50KSB7CisJY29tcG9uZW50LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKKwljb21wb25lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInRyYW5zcGFyZW50IjsKKwl2YXIgcGFyZW50ID0gY29tcG9uZW50LnBhcmVudE5vZGU7CisJaWYgKChwYXJlbnQpICYmIChwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJsaSIpKSB7CisJCXBhcmVudC5vbGRUeXBlID0gcGFyZW50LnN0eWxlLmxpc3RTdHlsZVR5cGU7CisJCXBhcmVudC5zdHlsZS5saXN0U3R5bGVUeXBlID0gIm5vbmUiOworCX0KK30sIG5leHRBY3Rpb246ZnVuY3Rpb24gKGV2ZW50KSB7CisJaWYgKCF0aGlzLnBhcmVudC5zdG9wRXZlbnQoZXZlbnQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKCF0aGlzLl9uZXh0QWN0aW9uKHRoaXMpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIGFjdGlvbiA9IHRoaXMuX2FjdGlvbnNbdGhpcy5fYWN0aW9uXTsKKwlpZiAoIWFjdGlvbikgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciB0bXBBY3Rpb24gPSBhY3Rpb25bImFjdGlvbiJdOworCXZhciBjb21wb25lbnRzID0gdGhpcy5fY29tcG9uZW50c1thY3Rpb24ub25dOworCWZvciAodmFyIGkgPSAwLCBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07IGkrKykgeworCQlpZiAodG1wQWN0aW9uKSB7CisJCQl2YXIgZHVyYXRpb24gPSBhY3Rpb24uZHVyYXRpb24gfHwgMTAwMDsKKwkJCWlmICgodG1wQWN0aW9uID09ICJmYWRlIikgfHwgKHRtcEFjdGlvbiA9PSAiZmFkZUluIikpIHsKKwkJCQlkb2pvLmh0bWwuc2V0T3BhY2l0eShjb21wb25lbnQsIDApOworCQkJCWRvam8ubGZ4Lmh0bWwuZmFkZVNob3coY29tcG9uZW50LCBkdXJhdGlvbikucGxheSh0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRtcEFjdGlvbiA9PSAiZmFkZW91dCIpIHsKKwkJCQkJZG9qby5sZnguaHRtbC5mYWRlSGlkZShjb21wb25lbnQsIGR1cmF0aW9uKS5wbGF5KHRydWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0bXBBY3Rpb24gPT0gImZseSIpIHsKKwkJCQkJCXZhciB3aWR0aCA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3goY29tcG9uZW50KS53aWR0aDsKKwkJCQkJCXZhciBwb3NpdGlvbiA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKGNvbXBvbmVudCk7CisJCQkJCQljb21wb25lbnQuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOworCQkJCQkJY29tcG9uZW50LnN0eWxlLmxlZnQgPSAtKHdpZHRoICsgcG9zaXRpb24ueCkgKyAicHgiOworCQkJCQkJZG9qby5sZnguaHRtbC5zbGlkZUJ5KGNvbXBvbmVudCwge3RvcDowLCBsZWZ0Oih3aWR0aCArIHBvc2l0aW9uLngpfSwgZHVyYXRpb24sIC0xLCB0aGlzLmNhbGxXaXRoKS5wbGF5KHRydWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKCh0bXBBY3Rpb24gPT0gIndpcGUiKSB8fCAodG1wQWN0aW9uID09ICJ3aXBlaW4iKSkgeworCQkJCQkJCWRvam8ubGZ4Lmh0bWwud2lwZUluKGNvbXBvbmVudCwgZHVyYXRpb24pLnBsYXkoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHRtcEFjdGlvbiA9PSAid2lwZW91dCIpIHsKKwkJCQkJCQkJZG9qby5sZnguaHRtbC53aXBlT3V0KGNvbXBvbmVudCwgZHVyYXRpb24pLnBsYXkoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAodG1wQWN0aW9uID09ICJjb2xvciIpIHsKKwkJCQkJCQkJCXZhciBmcm9tID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGFjdGlvbi5mcm9tKS50b1JnYigpOworCQkJCQkJCQkJdmFyIHRvID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGFjdGlvbi50bykudG9SZ2IoKTsKKwkJCQkJCQkJCXZhciBhbmltID0gbmV3IGRvam8uYW5pbWF0aW9uLkFuaW1hdGlvbihuZXcgZG9qby5tYXRoLmN1cnZlcy5MaW5lKGZyb20sIHRvKSwgZHVyYXRpb24sIDApOworCQkJCQkJCQkJdmFyIG5vZGUgPSBjb21wb25lbnQ7CisJCQkJCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uQW5pbWF0ZSIsIGZ1bmN0aW9uIChlKSB7CisJCQkJCQkJCQkJbm9kZS5zdHlsZS5jb2xvciA9ICJyZ2IoIiArIGUuY29vcmRzQXNJbnRzKCkuam9pbigiLCIpICsgIikiOworCQkJCQkJCQkJfSk7CisJCQkJCQkJCQlhbmltLnBsYXkodHJ1ZSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAodG1wQWN0aW9uID09ICJiZ2NvbG9yIikgeworCQkJCQkJCQkJCWRvam8ubGZ4Lmh0bWwudW5oaWdobGlnaHQoY29tcG9uZW50LCBhY3Rpb24udG8sIGR1cmF0aW9uKS5wbGF5KCk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWlmICh0bXBBY3Rpb24gPT0gInJlbW92ZSIpIHsKKwkJCQkJCQkJCQkJY29tcG9uZW50LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHRtcEFjdGlvbiA9PSAiaGlkZSIpIHsKKwkJCQljb21wb25lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKKwkJCX0KKwkJfQorCX0KKwlhY3Rpb24gPSB0aGlzLl9hY3Rpb25zW3RoaXMuX2FjdGlvbiArIDFdOworCWlmIChhY3Rpb24gJiYgYWN0aW9uLmF1dG8gPT0gInRydWUiKSB7CisJCXRoaXMubmV4dEFjdGlvbigpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIGNhbGxXaXRoOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKCFub2RlKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGRvam8ubGFuZy5pc0FycmF5KG5vZGUpKSB7CisJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGUsIGFyZ3VtZW50cy5jYWxsZWUpOworCQlyZXR1cm47CisJfQorCXZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7CisJaWYgKChwYXJlbnQpICYmIChwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJsaSIpKSB7CisJCXBhcmVudC5zdHlsZS5saXN0U3R5bGVUeXBlID0gcGFyZW50Lm9sZFR5cGU7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NsaWRlU2hvdy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU2xpZGVTaG93LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmJhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NsaWRlU2hvdy5qcwpAQCAtMCwwICsxLDc3IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5TbGlkZVNob3ciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sZnguKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5TbGlkZVNob3ciLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGVtcGxhdGVTdHJpbmc6IjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmc6IDNweDtcIj5cblx0XHQ8ZGl2PlxuXHRcdFx0PGlucHV0IHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cInBhdXNlXCIgXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1cInN0YXJ0U3RvcEJ1dHRvblwiXG5cdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IHRvZ2dsZVBhdXNlZDtcIj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogJHt0aGlzLndpZHRofTsgaGVpZ2h0OiAke3RoaXMuaGVpZ2h0fTtcIlxuXHRcdFx0ZG9qb0F0dGFjaFBvaW50PVwiaW1hZ2VzQ29udGFpbmVyXCJcblx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IHRvZ2dsZVBhdXNlZDtcIj5cblx0XHRcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwiaW1nMVwiIGNsYXNzPVwic2xpZGVTaG93SW1nXCIgXG5cdFx0XHRcdHN0eWxlPVwiei1pbmRleDogMTsgd2lkdGg6ICR7dGhpcy53aWR0aH07IGhlaWdodDogJHt0aGlzLmhlaWdodH07XCIgIC8+XG5cdFx0XHQ8aW1nIGRvam9BdHRhY2hQb2ludD1cImltZzJcIiBjbGFzcz1cInNsaWRlU2hvd0ltZ1wiIFxuXHRcdFx0XHRzdHlsZT1cInotaW5kZXg6IDA7IHdpZHRoOiAke3RoaXMud2lkdGh9OyBoZWlnaHQ6ICR7dGhpcy5oZWlnaHR9O1wiIC8+XG5cdFx0PC9kaXY+XHRcbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5zbGlkZVNob3dJbWcge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdGxlZnQ6IDBweDtcblx0dG9wOiAwcHg7IFxuXHRib3JkZXI6IDJweCBzb2xpZCAjNGQ0ZDRkO1xuXHRwYWRkaW5nOiAwcHg7XG5cdG1hcmdpbjogMHB4O1xufVxuXG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvU2xpZGVTaG93LmNzcyIpLCBpbWdVcmxzOltdLCBpbWdVcmxCYXNlOiIiLCBkZWxheTo0MDAwLCB0cmFuc2l0aW9uSW50ZXJ2YWw6MjAwMCwgaW1nV2lkdGg6ODAwLCBpbWdIZWlnaHQ6NjAwLCBwcmV2ZW50Q2FjaGU6ZmFsc2UsIHN0b3BwZWQ6ZmFsc2UsIF91cmxzSWR4OjAsIF9iYWNrZ3JvdW5kOiJpbWcyIiwgX2ZvcmVncm91bmQ6ImltZzEiLCBmYWRlQW5pbTpudWxsLCBzdGFydFN0b3BCdXR0b246bnVsbCwgaW1nMTpudWxsLCBpbWcyOm51bGwsIHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKCkgeworCXRoaXMud2lkdGggPSB0aGlzLmltZ1dpZHRoICsgInB4IjsKKwl0aGlzLmhlaWdodCA9IHRoaXMuaW1nSGVpZ2h0ICsgInB4IjsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkgJiYgdGhpcy5pbWdVcmxzLmxlbmd0aCA9PSAyKSB7CisJCXRoaXMucHJldmVudENhY2hlID0gdHJ1ZTsKKwl9CisJZG9qby5odG1sLnNldE9wYWNpdHkodGhpcy5pbWcxLCAwLjk5OTkpOworCWRvam8uaHRtbC5zZXRPcGFjaXR5KHRoaXMuaW1nMiwgMC45OTk5KTsKKwlpZiAodGhpcy5pbWdVcmxzLmxlbmd0aCA+IDEpIHsKKwkJdGhpcy5pbWcyLnNyYyA9IHRoaXMuaW1nVXJsQmFzZSArIHRoaXMuaW1nVXJsc1t0aGlzLl91cmxzSWR4KytdICsgdGhpcy5fZ2V0VXJsU3VmZml4KCk7CisJCXRoaXMuX2VuZFRyYW5zaXRpb24oKTsKKwl9IGVsc2UgeworCQl0aGlzLmltZzEuc3JjID0gdGhpcy5pbWdVcmxCYXNlICsgdGhpcy5pbWdVcmxzW3RoaXMuX3VybHNJZHgrK10gKyB0aGlzLl9nZXRVcmxTdWZmaXgoKTsKKwl9Cit9LCBfZ2V0VXJsU3VmZml4OmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5wcmV2ZW50Q2FjaGUpIHsKKwkJcmV0dXJuICI/dHM9IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICIiOworCX0KK30sIHRvZ2dsZVBhdXNlZDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuc3RvcHBlZCkgeworCQl0aGlzLnN0b3BwZWQgPSBmYWxzZTsKKwkJdGhpcy5fYmFja2dyb3VuZEltYWdlTG9hZGVkKCk7CisJCXRoaXMuc3RhcnRTdG9wQnV0dG9uLnZhbHVlID0gInBhdXNlIjsKKwl9IGVsc2UgeworCQl0aGlzLnN0b3BwZWQgPSB0cnVlOworCQl0aGlzLnN0YXJ0U3RvcEJ1dHRvbi52YWx1ZSA9ICJwbGF5IjsKKwl9Cit9LCBfYmFja2dyb3VuZEltYWdlTG9hZGVkOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5zdG9wcGVkKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHRoaXMuZmFkZUFuaW0pIHsKKwkJdGhpcy5mYWRlQW5pbS5zdG9wKCk7CisJfQorCXRoaXMuZmFkZUFuaW0gPSBkb2pvLmxmeC5mYWRlT3V0KHRoaXNbdGhpcy5fZm9yZWdyb3VuZF0sIHRoaXMudHJhbnNpdGlvbkludGVydmFsLCBudWxsKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5mYWRlQW5pbSwgIm9uRW5kIiwgdGhpcywgIl9lbmRUcmFuc2l0aW9uIik7CisJdGhpcy5mYWRlQW5pbS5wbGF5KCk7Cit9LCBfZW5kVHJhbnNpdGlvbjpmdW5jdGlvbiAoKSB7CisJd2l0aCAodGhpc1t0aGlzLl9iYWNrZ3JvdW5kXS5zdHlsZSkgeworCQl6SW5kZXggPSBwYXJzZUludCh6SW5kZXgpICsgMTsKKwl9CisJd2l0aCAodGhpc1t0aGlzLl9mb3JlZ3JvdW5kXS5zdHlsZSkgeworCQl6SW5kZXggPSBwYXJzZUludCh6SW5kZXgpIC0gMTsKKwl9CisJdmFyIHRtcCA9IHRoaXMuX2ZvcmVncm91bmQ7CisJdGhpcy5fZm9yZWdyb3VuZCA9IHRoaXMuX2JhY2tncm91bmQ7CisJdGhpcy5fYmFja2dyb3VuZCA9IHRtcDsKKwl0aGlzLl9sb2FkTmV4dEltYWdlKCk7Cit9LCBfbG9hZE5leHRJbWFnZTpmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajp0aGlzW3RoaXMuX2JhY2tncm91bmRdLCBzcmNGdW5jOiJvbmxvYWQiLCBhZHZpY2VPYmo6dGhpcywgYWR2aWNlRnVuYzoiX2JhY2tncm91bmRJbWFnZUxvYWRlZCIsIG9uY2U6dHJ1ZSwgZGVsYXk6dGhpcy5kZWxheX0pOworCWRvam8uaHRtbC5zZXRPcGFjaXR5KHRoaXNbdGhpcy5fYmFja2dyb3VuZF0sIDEpOworCXRoaXNbdGhpcy5fYmFja2dyb3VuZF0uc3JjID0gdGhpcy5pbWdVcmxCYXNlICsgdGhpcy5pbWdVcmxzW3RoaXMuX3VybHNJZHgrK107CisJaWYgKHRoaXMuX3VybHNJZHggPiAodGhpcy5pbWdVcmxzLmxlbmd0aCAtIDEpKSB7CisJCXRoaXMuX3VybHNJZHggPSAwOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TbGlkZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NsaWRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJmOWNjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TbGlkZXIuanMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNsaWRlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kbmQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwubGF5b3V0Iik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlNsaWRlciIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHttaW5pbXVtWDowLCBtaW5pbXVtWTowLCBtYXhpbXVtWDoxMCwgbWF4aW11bVk6MTAsIHNuYXBWYWx1ZXNYOjAsIHNuYXBWYWx1ZXNZOjAsIF9zbmFwVG9HcmlkOnRydWUsIGlzRW5hYmxlWDp0cnVlLCBpc0VuYWJsZVk6dHJ1ZSwgX3ZhbHVlU2l6ZVg6MCwgX3ZhbHVlU2l6ZVk6MCwgX21pblg6MCwgX21pblk6MCwgX2NvbnN0cmFpbnRXaWR0aDowLCBfY29uc3RyYWludEhlaWdodDowLCBfY2xpcExlZnQ6MCwgX2NsaXBSaWdodDowLCBfY2xpcFRvcDowLCBfY2xpcEJvdHRvbTowLCBfY2xpcFhkZWx0YTowLCBfY2xpcFlkZWx0YTowLCBpbml0aWFsVmFsdWVYOjAsIGluaXRpYWxWYWx1ZVk6MCwgZmxpcFg6ZmFsc2UsIGZsaXBZOmZhbHNlLCBjbGlja1NlbGVjdDp0cnVlLCBhY3RpdmVEcmFnOmZhbHNlLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLnNsaWRlck1haW4ge1xuICBib3JkZXI6IDBweCAhaW1wb3J0YW50O1xuICBib3JkZXItc3BhY2luZzogMHB4ICFpbXBvcnRhbnQ7XG4gIGxpbmUtaGVpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IC1tb3otaW5saW5lLXRhYmxlICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICAtbW96LXVzZXItZm9jdXM6IG5vcm1hbCAhaW1wb3J0YW50O1xufVxuXG4uc2xpZGVyQ29tcG9uZW50IHtcbiAgYm9yZGVyOiAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgbWFyZ2luOiAwcHg7XG59XG5cbi5zbGlkZXJIYW5kbGUgeyBcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgei1pbmRleDogMTAwMDtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG59XG5cbi5zbGlkZXJPdXRzZXRCdXR0b24geyBcbiAgYm9yZGVyLXN0eWxlOiBvdXRzZXQ7XG4gIGJvcmRlci13aWR0aDogMHB4IDFweCAxcHggMHB4O1xuICBib3JkZXItY29sb3I6IGJsYWNrO1xufVxuXG4uc2xpZGVySW5zZXRCdXR0b24geyBcbiAgYm9yZGVyLXN0eWxlOiBpbnNldDtcbiAgYm9yZGVyLXdpZHRoOiAxcHggMHB4IDBweCAxcHg7XG4gIGJvcmRlci1jb2xvcjogYmxhY2s7XG59XG5cbi5zbGlkZXJCdXR0b25ZIHtcbiAgbWFyZ2luOiAwcHg7XG4gIHBhZGRpbmc6IDBweDtcbiAgei1pbmRleDogOTAwO1xufVxuXG4uc2xpZGVyQnV0dG9uWCB7XG4gIG1hcmdpbjogMHB4O1xuICBwYWRkaW5nOiAwcHg7XG4gIHotaW5kZXg6IDkwMDtcbn1cblxuLnNsaWRlckJhY2tncm91bmQgeyBcbiAgei1pbmRleDogMDtcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XG59XG5cbi5zbGlkZXJQcm9ncmVzc0JhY2tncm91bmQgeyBcbiAgei1pbmRleDogODAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgY2xpcDogcmVjdCgwcHgsMHB4LDBweCwwcHgpO1xufVxuXG4uc2xpZGVyQmFja2dyb3VuZFNpemVPbmx5IHsgXG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvU2xpZGVyLmNzcyIpLCB0ZW1wbGF0ZVN0cmluZzoiPHRhYmxlIF89XCJ3ZWlyZCBlbmQgdGFnIGZvcm1hdHRpbmcgaXMgdG8gcHJldmVudCB3aGl0ZXNwYWNlIGZyb20gYmVjb21pbmcgJm5ic3A7XCIgXG5cdGNsYXNzPVwic2xpZGVyTWFpblwiIFxuXHRkb2pvQXR0YWNoUG9pbnQ9XCJmb2N1c05vZGVcIiBcblx0ZG9qb0F0dGFjaEV2ZW50PVwib25tb3VzZWRvd246X3NldEZvY3VzOyBvbmtleTpfaGFuZGxlS2V5RXZlbnRzOyBvbmtleXVwOl9idXR0b25SZWxlYXNlZDsgb25tb3VzZXVwOl9idXR0b25SZWxlYXNlZDsgb25tb3VzZXdoZWVsOl9tb3VzZVdoZWVsZWQ7XCJcblx0dGFiaW5kZXg9XCIwXCIgY29scz0zIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT1cIlwiPlxuXHQ8dHIgdmFsaWduPW1pZGRsZSBhbGlnbj1jZW50ZXI+XG5cdFx0PHRkIGNsYXNzPVwic2xpZGVyQ29tcG9uZW50XCIgY29sc3Bhbj0zIGRvam9BdHRhY2hQb2ludD10b3BCb3JkZXJOb2RlIHN0eWxlPVwiXCJcblx0XHRcdD48aW1nIGNsYXNzPVwic2xpZGVyT3V0c2V0QnV0dG9uIHNsaWRlckJ1dHRvbllcIlxuXHRcdFx0XHRkb2pvQXR0YWNoUG9pbnQ9dG9wQnV0dG9uTm9kZSBcblx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25tb3VzZWRvd246X3RvcEJ1dHRvblByZXNzZWQ7IG9ubW91c2Vtb3ZlOl9kaXNjYXJkRXZlbnQ7IG9uZGJsY2xpY2s6X3RvcEJ1dHRvbkRvdWJsZUNsaWNrZWQ7XCJcblx0XHRcdFx0c3JjPVwiJHt0aGlzLnRvcEJ1dHRvblNyY31cIiBcblx0XHRcdFx0c3R5bGU9XCIke3RoaXMuYnV0dG9uU3R5bGVZfVwiXG5cdFx0PjwvdGQ+XG5cdDwvdHI+XG5cdDx0ciB2YWxpZ249bWlkZGxlIGFsaWduPWNlbnRlcj5cblx0XHQ8dGQgY2xhc3M9XCJzbGlkZXJDb21wb25lbnRcIiBkb2pvQXR0YWNoUG9pbnQ9bGVmdEJvcmRlck5vZGUgc3R5bGU9XCJcIlxuXHRcdFx0PjxpbWcgY2xhc3M9XCJzbGlkZXJPdXRzZXRCdXR0b24gc2xpZGVyQnV0dG9uWFwiXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1sZWZ0QnV0dG9uTm9kZVxuXHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbm1vdXNlZG93bjpfbGVmdEJ1dHRvblByZXNzZWQ7IG9ubW91c2Vtb3ZlOl9kaXNjYXJkRXZlbnQ7IG9uZGJsY2xpY2s6X2xlZnRCdXR0b25Eb3VibGVDbGlja2VkO1wiXG5cdFx0XHRcdHNyYz1cIiR7dGhpcy5sZWZ0QnV0dG9uU3JjfVwiIFxuXHRcdFx0XHRzdHlsZT1cIiR7dGhpcy5idXR0b25TdHlsZVh9XCJcblx0XHQ+PC90ZD5cblx0XHQ8dGQgZG9qb0F0dGFjaFBvaW50PWNvbnN0cmFpbmluZ0NvbnRhaW5lck5vZGUgXG5cdFx0XHRjbGFzcz1cInNsaWRlckNvbXBvbmVudCBzbGlkZXJCYWNrZ3JvdW5kXCJcblx0XHRcdHN0eWxlPVwiJHt0aGlzLmJhY2tncm91bmRTdHlsZX1cIlxuXHRcdFx0PjxpbWcgc3JjPVwiJHt0aGlzLmhhbmRsZVNyY31cIiBcblx0XHRcdFx0Y2xhc3M9c2xpZGVySGFuZGxlXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1zbGlkZXJIYW5kbGVOb2RlXG5cdFx0XHRcdHN0eWxlPVwiJHt0aGlzLmhhbmRsZVN0eWxlfVwiXG5cdFx0XHQ+PGltZyBzcmM9XCIke3RoaXMucHJvZ3Jlc3NCYWNrZ3JvdW5kU3JjfVwiXG5cdFx0XHRcdGNsYXNzPVwic2xpZGVyQmFja2dyb3VuZFNpemVPbmx5IHNsaWRlclByb2dyZXNzQmFja2dyb3VuZFwiXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1wcm9ncmVzc0JhY2tncm91bmROb2RlXG5cdFx0XHRcdHN0eWxlPVwiJHt0aGlzLmJhY2tncm91bmRTaXplfVwiXG5cdFx0XHQ+PGltZyBzcmM9XCIke3RoaXMuYmFja2dyb3VuZFNyY31cIiBcblx0XHRcdFx0Y2xhc3M9c2xpZGVyQmFja2dyb3VuZFNpemVPbmx5XG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1zbGlkZXJCYWNrZ3JvdW5kTm9kZVxuXHRcdFx0XHRzdHlsZT1cIiR7dGhpcy5iYWNrZ3JvdW5kU2l6ZX1cIlxuXHRcdD48L3RkPlxuXHRcdDx0ZCBjbGFzcz1cInNsaWRlckNvbXBvbmVudFwiIGRvam9BdHRhY2hQb2ludD1yaWdodEJvcmRlck5vZGUgc3R5bGU9XCJcIlxuXHRcdFx0PjxpbWcgY2xhc3M9XCJzbGlkZXJPdXRzZXRCdXR0b24gc2xpZGVyQnV0dG9uWFwiXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1yaWdodEJ1dHRvbk5vZGVcblx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25tb3VzZWRvd246X3JpZ2h0QnV0dG9uUHJlc3NlZDsgb25tb3VzZW1vdmU6X2Rpc2NhcmRFdmVudDsgb25kYmxjbGljazpfcmlnaHRCdXR0b25Eb3VibGVDbGlja2VkO1wiXG5cdFx0XHRcdHNyYz1cIiR7dGhpcy5yaWdodEJ1dHRvblNyY31cIiBcblx0XHRcdFx0c3R5bGU9XCIke3RoaXMuYnV0dG9uU3R5bGVYfVwiXG5cdFx0PjwvdGQ+XG5cdDwvdHI+XG5cdDx0ciB2YWxpZ249bWlkZGxlIGFsaWduPWNlbnRlcj5cblx0XHQ8dGQgY2xhc3M9XCJzbGlkZXJDb21wb25lbnRcIiBjb2xzcGFuPTMgZG9qb0F0dGFjaFBvaW50PWJvdHRvbUJvcmRlck5vZGUgc3R5bGU9XCJcIlxuXHRcdFx0PjxpbWcgY2xhc3M9XCJzbGlkZXJPdXRzZXRCdXR0b24gc2xpZGVyQnV0dG9uWVwiXG5cdFx0XHRcdGRvam9BdHRhY2hQb2ludD1ib3R0b21CdXR0b25Ob2RlIFxuXHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbm1vdXNlZG93bjpfYm90dG9tQnV0dG9uUHJlc3NlZDsgb25tb3VzZW1vdmU6X2Rpc2NhcmRFdmVudDsgb25kYmxjbGljazpfYm90dG9tQnV0dG9uRG91YmxlQ2xpY2tlZDtcIlxuXHRcdFx0XHRzcmM9XCIke3RoaXMuYm90dG9tQnV0dG9uU3JjfVwiIFxuXHRcdFx0XHRzdHlsZT1cIiR7dGhpcy5idXR0b25TdHlsZVl9XCJcblx0XHQ+PC90ZD5cblx0PC90cj5cbjwvdGFibGU+XG4iLCBfaXNEcmFnSW5Qcm9ncmVzczpmYWxzZSwgYm90dG9tQnV0dG9uU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfZG93bl9hcnJvdy5wbmciKSwgdG9wQnV0dG9uU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfdXBfYXJyb3cucG5nIiksIGxlZnRCdXR0b25TcmM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlcl9sZWZ0X2Fycm93LnBuZyIpLCByaWdodEJ1dHRvblNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvc2xpZGVyX3JpZ2h0X2Fycm93LnBuZyIpLCBiYWNrZ3JvdW5kU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9ibGFuay5naWYiKSwgcHJvZ3Jlc3NCYWNrZ3JvdW5kU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9ibGFuay5naWYiKSwgYmFja2dyb3VuZFNpemU6IndpZHRoOjIwMHB4O2hlaWdodDoyMDBweDsiLCBiYWNrZ3JvdW5kU3R5bGU6IiIsIGJ1dHRvblN0eWxlWDoiIiwgYnV0dG9uU3R5bGVZOiIiLCBoYW5kbGVTdHlsZToiIiwgaGFuZGxlU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLnBuZyIpLCBzaG93QnV0dG9uczp0cnVlLCBfZXZlbnRDb3VudDowLCBfdHlwYW1hdGljVGltZXI6bnVsbCwgX3R5cGFtYXRpY0Z1bmN0aW9uOm51bGwsIGRlZmF1bHRUaW1lb3V0OjUwMCwgdGltZW91dENoYW5nZVJhdGU6MC45LCBfY3VycmVudFRpbWVvdXQ6dGhpcy5kZWZhdWx0VGltZW91dCwgX2hhbmRsZUtleUV2ZW50czpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKCFldnQua2V5KSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFldnQuY3RybEtleSAmJiAhZXZ0LmFsdEtleSkgeworCQlzd2l0Y2ggKGV2dC5rZXkpIHsKKwkJICBjYXNlIGV2dC5LRVlfTEVGVF9BUlJPVzoKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCXRoaXMuX2xlZnRCdXR0b25QcmVzc2VkKGV2dCk7CisJCQlyZXR1cm47CisJCSAgY2FzZSBldnQuS0VZX1JJR0hUX0FSUk9XOgorCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJdGhpcy5fcmlnaHRCdXR0b25QcmVzc2VkKGV2dCk7CisJCQlyZXR1cm47CisJCSAgY2FzZSBldnQuS0VZX0RPV05fQVJST1c6CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQl0aGlzLl9ib3R0b21CdXR0b25QcmVzc2VkKGV2dCk7CisJCQlyZXR1cm47CisJCSAgY2FzZSBldnQuS0VZX1VQX0FSUk9XOgorCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJdGhpcy5fdG9wQnV0dG9uUHJlc3NlZChldnQpOworCQkJcmV0dXJuOworCQl9CisJfQorCXRoaXMuX2V2ZW50Q291bnQrKzsKK30sIF9wcmVzc0J1dHRvbjpmdW5jdGlvbiAoYnV0dG9uTm9kZSkgeworCWJ1dHRvbk5vZGUuY2xhc3NOYW1lID0gYnV0dG9uTm9kZS5jbGFzc05hbWUucmVwbGFjZSgiT3V0c2V0IiwgIkluc2V0Iik7Cit9LCBfcmVsZWFzZUJ1dHRvbjpmdW5jdGlvbiAoYnV0dG9uTm9kZSkgeworCWJ1dHRvbk5vZGUuY2xhc3NOYW1lID0gYnV0dG9uTm9kZS5jbGFzc05hbWUucmVwbGFjZSgiSW5zZXQiLCAiT3V0c2V0Iik7Cit9LCBfYnV0dG9uUHJlc3NlZDpmdW5jdGlvbiAoZXZ0LCBidXR0b25Ob2RlKSB7CisJdGhpcy5fc2V0Rm9jdXMoKTsKKwlpZiAodHlwZW9mIGV2dCA9PSAib2JqZWN0IikgeworCQlpZiAodGhpcy5fdHlwYW1hdGljVGltZXIgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuX3R5cGFtYXRpY05vZGUgPT0gYnV0dG9uTm9kZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWNsZWFyVGltZW91dCh0aGlzLl90eXBhbWF0aWNUaW1lcik7CisJCX0KKwkJdGhpcy5fYnV0dG9uUmVsZWFzZWQobnVsbCk7CisJCXRoaXMuX2V2ZW50Q291bnQrKzsKKwkJdGhpcy5fdHlwYW1hdGljVGltZXIgPSBudWxsOworCQl0aGlzLl9jdXJyZW50VGltZW91dCA9IHRoaXMuZGVmYXVsdFRpbWVvdXQ7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwl9IGVsc2UgeworCQlpZiAoZXZ0ICE9IHRoaXMuX2V2ZW50Q291bnQpIHsKKwkJCXRoaXMuX2J1dHRvblJlbGVhc2VkKG51bGwpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCWlmIChidXR0b25Ob2RlID09IHRoaXMubGVmdEJ1dHRvbk5vZGUgJiYgdGhpcy5pc0VuYWJsZVgpIHsKKwkJdGhpcy5fc25hcFgoZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5zbGlkZXJIYW5kbGVOb2RlLCAibGVmdCIpIC0gdGhpcy5fdmFsdWVTaXplWCk7CisJfSBlbHNlIHsKKwkJaWYgKGJ1dHRvbk5vZGUgPT0gdGhpcy5yaWdodEJ1dHRvbk5vZGUgJiYgdGhpcy5pc0VuYWJsZVgpIHsKKwkJCXRoaXMuX3NuYXBYKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuc2xpZGVySGFuZGxlTm9kZSwgImxlZnQiKSArIHRoaXMuX3ZhbHVlU2l6ZVgpOworCQl9IGVsc2UgeworCQkJaWYgKGJ1dHRvbk5vZGUgPT0gdGhpcy50b3BCdXR0b25Ob2RlICYmIHRoaXMuaXNFbmFibGVZKSB7CisJCQkJdGhpcy5fc25hcFkoZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5zbGlkZXJIYW5kbGVOb2RlLCAidG9wIikgLSB0aGlzLl92YWx1ZVNpemVZKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJ1dHRvbk5vZGUgPT0gdGhpcy5ib3R0b21CdXR0b25Ob2RlICYmIHRoaXMuaXNFbmFibGVZKSB7CisJCQkJCXRoaXMuX3NuYXBZKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuc2xpZGVySGFuZGxlTm9kZSwgInRvcCIpICsgdGhpcy5fdmFsdWVTaXplWSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl0aGlzLl9wcmVzc0J1dHRvbihidXR0b25Ob2RlKTsKKwl0aGlzLm5vdGlmeUxpc3RlbmVycygpOworCXRoaXMuX3R5cGFtYXRpY05vZGUgPSBidXR0b25Ob2RlOworCXRoaXMuX3R5cGFtYXRpY1RpbWVyID0gZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIl9idXR0b25QcmVzc2VkIiwgdGhpcy5fY3VycmVudFRpbWVvdXQsIHRoaXMuX2V2ZW50Q291bnQsIGJ1dHRvbk5vZGUpOworCXRoaXMuX2N1cnJlbnRUaW1lb3V0ID0gTWF0aC5yb3VuZCh0aGlzLl9jdXJyZW50VGltZW91dCAqIHRoaXMudGltZW91dENoYW5nZVJhdGUpOworCXJldHVybiBmYWxzZTsKK30sIF9ib3R0b21CdXR0b25QcmVzc2VkOmZ1bmN0aW9uIChldnQpIHsKKwlyZXR1cm4gdGhpcy5fYnV0dG9uUHJlc3NlZChldnQsIHRoaXMuYm90dG9tQnV0dG9uTm9kZSk7Cit9LCBfYm90dG9tQnV0dG9uRG91YmxlQ2xpY2tlZDpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHJjID0gdGhpcy5fYm90dG9tQnV0dG9uUHJlc3NlZChldnQpOworCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJfYnV0dG9uUmVsZWFzZWQiLCA1MCwgbnVsbCk7CisJcmV0dXJuIHJjOworfSwgX3RvcEJ1dHRvblByZXNzZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXJldHVybiB0aGlzLl9idXR0b25QcmVzc2VkKGV2dCwgdGhpcy50b3BCdXR0b25Ob2RlKTsKK30sIF90b3BCdXR0b25Eb3VibGVDbGlja2VkOmZ1bmN0aW9uIChldnQpIHsKKwl2YXIgcmMgPSB0aGlzLl90b3BCdXR0b25QcmVzc2VkKGV2dCk7CisJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIl9idXR0b25SZWxlYXNlZCIsIDUwLCBudWxsKTsKKwlyZXR1cm4gcmM7Cit9LCBfbGVmdEJ1dHRvblByZXNzZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXJldHVybiB0aGlzLl9idXR0b25QcmVzc2VkKGV2dCwgdGhpcy5sZWZ0QnV0dG9uTm9kZSk7Cit9LCBfbGVmdEJ1dHRvbkRvdWJsZUNsaWNrZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXZhciByYyA9IHRoaXMuX2xlZnRCdXR0b25QcmVzc2VkKGV2dCk7CisJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIl9idXR0b25SZWxlYXNlZCIsIDUwLCBudWxsKTsKKwlyZXR1cm4gcmM7Cit9LCBfcmlnaHRCdXR0b25QcmVzc2VkOmZ1bmN0aW9uIChldnQpIHsKKwlyZXR1cm4gdGhpcy5fYnV0dG9uUHJlc3NlZChldnQsIHRoaXMucmlnaHRCdXR0b25Ob2RlKTsKK30sIF9yaWdodEJ1dHRvbkRvdWJsZUNsaWNrZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXZhciByYyA9IHRoaXMuX3JpZ2h0QnV0dG9uUHJlc3NlZChldnQpOworCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJfYnV0dG9uUmVsZWFzZWQiLCA1MCwgbnVsbCk7CisJcmV0dXJuIHJjOworfSwgX2J1dHRvblJlbGVhc2VkOmZ1bmN0aW9uIChldnQpIHsKKwlpZiAodHlwZW9mIGV2dCA9PSAib2JqZWN0IiAmJiBldnQgIT0gbnVsbCAmJiB0eXBlb2YgZXZ0LmtleUNvZGUgIT0gInVuZGVmaW5lZCIgJiYgZXZ0LmtleUNvZGUgIT0gbnVsbCkgeworCQl2YXIga2V5Q29kZSA9IGV2dC5rZXlDb2RlOworCQlzd2l0Y2ggKGtleUNvZGUpIHsKKwkJICBjYXNlIGV2dC5LRVlfTEVGVF9BUlJPVzoKKwkJICBjYXNlIGV2dC5LRVlfUklHSFRfQVJST1c6CisJCSAgY2FzZSBldnQuS0VZX0RPV05fQVJST1c6CisJCSAgY2FzZSBldnQuS0VZX1VQX0FSUk9XOgorCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJdGhpcy5fcmVsZWFzZUJ1dHRvbih0aGlzLnRvcEJ1dHRvbk5vZGUpOworCXRoaXMuX3JlbGVhc2VCdXR0b24odGhpcy5ib3R0b21CdXR0b25Ob2RlKTsKKwl0aGlzLl9yZWxlYXNlQnV0dG9uKHRoaXMubGVmdEJ1dHRvbk5vZGUpOworCXRoaXMuX3JlbGVhc2VCdXR0b24odGhpcy5yaWdodEJ1dHRvbk5vZGUpOworCXRoaXMuX2V2ZW50Q291bnQrKzsKKwlpZiAodGhpcy5fdHlwYW1hdGljVGltZXIgIT0gbnVsbCkgeworCQljbGVhclRpbWVvdXQodGhpcy5fdHlwYW1hdGljVGltZXIpOworCX0KKwl0aGlzLl90eXBhbWF0aWNUaW1lciA9IG51bGw7CisJdGhpcy5fY3VycmVudFRpbWVvdXQgPSB0aGlzLmRlZmF1bHRUaW1lb3V0OworfSwgX21vdXNlV2hlZWxlZDpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHNjcm9sbEFtb3VudCA9IDA7CisJaWYgKHR5cGVvZiBldnQud2hlZWxEZWx0YSA9PSAibnVtYmVyIikgeworCQlzY3JvbGxBbW91bnQgPSBldnQud2hlZWxEZWx0YTsKKwl9IGVsc2UgeworCQlpZiAodHlwZW9mIGV2dC5kZXRhaWwgPT0gIm51bWJlciIpIHsKKwkJCXNjcm9sbEFtb3VudCA9IC1ldnQuZGV0YWlsOworCQl9CisJfQorCWlmICh0aGlzLmlzRW5hYmxlWSkgeworCQlpZiAoc2Nyb2xsQW1vdW50ID4gMCkgeworCQkJdGhpcy5fdG9wQnV0dG9uUHJlc3NlZChldnQpOworCQkJdGhpcy5fYnV0dG9uUmVsZWFzZWQoZXZ0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzY3JvbGxBbW91bnQgPCAwKSB7CisJCQkJdGhpcy5fYm90dG9tQnV0dG9uUHJlc3NlZChldnQpOworCQkJCXRoaXMuX2J1dHRvblJlbGVhc2VkKGV2dCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGhpcy5pc0VuYWJsZVgpIHsKKwkJCWlmIChzY3JvbGxBbW91bnQgPiAwKSB7CisJCQkJdGhpcy5fcmlnaHRCdXR0b25QcmVzc2VkKGV2dCk7CisJCQkJdGhpcy5fYnV0dG9uUmVsZWFzZWQoZXZ0KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNjcm9sbEFtb3VudCA8IDApIHsKKwkJCQkJdGhpcy5fbGVmdEJ1dHRvblByZXNzZWQoZXZ0KTsKKwkJCQkJdGhpcy5fYnV0dG9uUmVsZWFzZWQoZXZ0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9LCBfZGlzY2FyZEV2ZW50OmZ1bmN0aW9uIChldnQpIHsKKwlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Cit9LCBfc2V0Rm9jdXM6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmZvY3VzTm9kZS5mb2N1cykgeworCQl0aGlzLmZvY3VzTm9kZS5mb2N1cygpOworCX0KK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisJdmFyIHBhZGRpbmcgPSB0aGlzLmRvbU5vZGUuc3R5bGUucGFkZGluZzsKKwlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKHBhZGRpbmcpICYmIHBhZGRpbmcgIT0gIiIgJiYgcGFkZGluZyAhPSAiMHB4IiAmJiBwYWRkaW5nICE9ICIwcHggMHB4IDBweCAwcHgiKSB7CisJCXRoaXMudG9wQm9yZGVyTm9kZS5zdHlsZS5wYWRkaW5nID0gdGhpcy5ib3R0b21Cb3JkZXJOb2RlLnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nOworCQl0aGlzLnRvcEJvcmRlck5vZGUuc3R5bGUucGFkZGluZ0JvdHRvbSA9ICIwcHgiOworCQl0aGlzLmJvdHRvbUJvcmRlck5vZGUuc3R5bGUucGFkZGluZ1RvcCA9ICIwcHgiOworCQl0aGlzLnJpZ2h0Qm9yZGVyTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLmRvbU5vZGUuc3R5bGUucGFkZGluZ1JpZ2h0OworCQl0aGlzLmxlZnRCb3JkZXJOb2RlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gdGhpcy5kb21Ob2RlLnN0eWxlLnBhZGRpbmdMZWZ0OworCQl0aGlzLmRvbU5vZGUuc3R5bGUucGFkZGluZyA9ICIwcHggMHB4IDBweCAwcHgiOworCX0KKwl2YXIgYm9yZGVyV2lkdGggPSB0aGlzLmRvbU5vZGUuc3R5bGUuYm9yZGVyV2lkdGg7CisJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhib3JkZXJXaWR0aCkgJiYgYm9yZGVyV2lkdGggIT0gIiIgJiYgYm9yZGVyV2lkdGggIT0gIjBweCIgJiYgYm9yZGVyV2lkdGggIT0gIjBweCAwcHggMHB4IDBweCIpIHsKKwkJdGhpcy50b3BCb3JkZXJOb2RlLnN0eWxlLmJvcmRlclN0eWxlID0gdGhpcy5yaWdodEJvcmRlck5vZGUuc3R5bGUuYm9yZGVyU3R5bGUgPSB0aGlzLmJvdHRvbUJvcmRlck5vZGUuc3R5bGUuYm9yZGVyU3R5bGUgPSB0aGlzLmxlZnRCb3JkZXJOb2RlLnN0eWxlLmJvcmRlclN0eWxlID0gdGhpcy5kb21Ob2RlLnN0eWxlLmJvcmRlclN0eWxlOworCQl0aGlzLnRvcEJvcmRlck5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnJpZ2h0Qm9yZGVyTm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuYm90dG9tQm9yZGVyTm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMubGVmdEJvcmRlck5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLmRvbU5vZGUuc3R5bGUuYm9yZGVyQ29sb3I7CisJCXRoaXMudG9wQm9yZGVyTm9kZS5zdHlsZS5ib3JkZXJXaWR0aCA9IHRoaXMuYm90dG9tQm9yZGVyTm9kZS5zdHlsZS5ib3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoOworCQl0aGlzLnRvcEJvcmRlck5vZGUuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGggPSAiMHB4IjsKKwkJdGhpcy5ib3R0b21Cb3JkZXJOb2RlLnN0eWxlLmJvcmRlclRvcFdpZHRoID0gIjBweCI7CisJCXRoaXMucmlnaHRCb3JkZXJOb2RlLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSB0aGlzLmRvbU5vZGUuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aDsKKwkJdGhpcy5sZWZ0Qm9yZGVyTm9kZS5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSB0aGlzLmRvbU5vZGUuc3R5bGUuYm9yZGVyTGVmdFdpZHRoOworCQl0aGlzLmRvbU5vZGUuc3R5bGUuYm9yZGVyV2lkdGggPSAiMHB4IDBweCAwcHggMHB4IjsKKwl9CisJdGhpcy5faGFuZGxlTW92ZSA9IG5ldyBkb2pvLndpZGdldC5fU2xpZGVyRHJhZ01vdmVTb3VyY2UodGhpcy5zbGlkZXJIYW5kbGVOb2RlKTsKKwl0aGlzLl9oYW5kbGVNb3ZlLnNldFBhcmVudCh0aGlzKTsKKwlpZiAodGhpcy5jbGlja1NlbGVjdCkgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXJOb2RlLCAib25tb3VzZWRvd24iLCB0aGlzLCAiX29uQ2xpY2siKTsKKwl9CisJaWYgKHRoaXMuaXNFbmFibGVYKSB7CisJCXRoaXMuc2V0VmFsdWVYKCFpc05hTih0aGlzLmluaXRpYWxWYWx1ZVgpID8gdGhpcy5pbml0aWFsVmFsdWVYIDogKCFpc05hTih0aGlzLm1pbmltdW1YKSA/IHRoaXMubWluaW11bVggOiAwKSk7CisJfQorCWlmICghdGhpcy5pc0VuYWJsZVggfHwgIXRoaXMuc2hvd0J1dHRvbnMpIHsKKwkJdGhpcy5yaWdodEJ1dHRvbk5vZGUuc3R5bGUud2lkdGggPSAiMXB4IjsKKwkJdGhpcy5yaWdodEJ1dHRvbk5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQl0aGlzLmxlZnRCdXR0b25Ob2RlLnN0eWxlLndpZHRoID0gIjFweCI7CisJCXRoaXMubGVmdEJ1dHRvbk5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCX0KKwlpZiAodGhpcy5pc0VuYWJsZVkpIHsKKwkJdGhpcy5zZXRWYWx1ZVkoIWlzTmFOKHRoaXMuaW5pdGlhbFZhbHVlWSkgPyB0aGlzLmluaXRpYWxWYWx1ZVkgOiAoIWlzTmFOKHRoaXMubWluaW11bVkpID8gdGhpcy5taW5pbXVtWSA6IDApKTsKKwl9CisJaWYgKCF0aGlzLmlzRW5hYmxlWSB8fCAhdGhpcy5zaG93QnV0dG9ucykgeworCQl0aGlzLmJvdHRvbUJ1dHRvbk5vZGUuc3R5bGUud2lkdGggPSAiMXB4IjsKKwkJdGhpcy5ib3R0b21CdXR0b25Ob2RlLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKKwkJdGhpcy50b3BCdXR0b25Ob2RlLnN0eWxlLndpZHRoID0gIjFweCI7CisJCXRoaXMudG9wQnV0dG9uTm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CisJfQorCWlmICh0aGlzLmZvY3VzTm9kZS5hZGRFdmVudExpc3RlbmVyKSB7CisJCXRoaXMuZm9jdXNOb2RlLmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJfbW91c2VXaGVlbGVkIiksIGZhbHNlKTsKKwl9Cit9LCBfc25hcFg6ZnVuY3Rpb24gKHgpIHsKKwlpZiAoeCA8IDApIHsKKwkJeCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHggPiB0aGlzLl9jb25zdHJhaW50V2lkdGgpIHsKKwkJCXggPSB0aGlzLl9jb25zdHJhaW50V2lkdGg7CisJCX0gZWxzZSB7CisJCQl2YXIgc2VsZWN0ZWRWYWx1ZSA9IE1hdGgucm91bmQoeCAvIHRoaXMuX3ZhbHVlU2l6ZVgpOworCQkJeCA9IE1hdGgucm91bmQoc2VsZWN0ZWRWYWx1ZSAqIHRoaXMuX3ZhbHVlU2l6ZVgpOworCQl9CisJfQorCXRoaXMuc2xpZGVySGFuZGxlTm9kZS5zdHlsZS5sZWZ0ID0geCArICJweCI7CisJaWYgKHRoaXMuZmxpcFgpIHsKKwkJdGhpcy5fY2xpcExlZnQgPSB4ICsgdGhpcy5fY2xpcFhkZWx0YTsKKwl9IGVsc2UgeworCQl0aGlzLl9jbGlwUmlnaHQgPSB4ICsgdGhpcy5fY2xpcFhkZWx0YTsKKwl9CisJdGhpcy5wcm9ncmVzc0JhY2tncm91bmROb2RlLnN0eWxlLmNsaXAgPSAicmVjdCgiICsgdGhpcy5fY2xpcFRvcCArICJweCwiICsgdGhpcy5fY2xpcFJpZ2h0ICsgInB4LCIgKyB0aGlzLl9jbGlwQm90dG9tICsgInB4LCIgKyB0aGlzLl9jbGlwTGVmdCArICJweCkiOworfSwgX2NhbGNfdmFsdWVTaXplWDpmdW5jdGlvbiAoKSB7CisJdmFyIGNvbnN0cmFpbmluZ0N0ckJveCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyTm9kZSk7CisJdmFyIHNsaWRlckhhbmRsZUJveCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuc2xpZGVySGFuZGxlTm9kZSk7CisJaWYgKGlzTmFOKGNvbnN0cmFpbmluZ0N0ckJveC53aWR0aCkgfHwgaXNOYU4oc2xpZGVySGFuZGxlQm94LndpZHRoKSB8fCBjb25zdHJhaW5pbmdDdHJCb3gud2lkdGggPD0gMCB8fCBzbGlkZXJIYW5kbGVCb3gud2lkdGggPD0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMuX2NvbnN0cmFpbnRXaWR0aCA9IGNvbnN0cmFpbmluZ0N0ckJveC53aWR0aCArIGRvam8uaHRtbC5nZXRQYWRkaW5nKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyTm9kZSkud2lkdGggLSBzbGlkZXJIYW5kbGVCb3gud2lkdGg7CisJaWYgKHRoaXMuZmxpcFgpIHsKKwkJdGhpcy5fY2xpcExlZnQgPSB0aGlzLl9jbGlwUmlnaHQgPSBjb25zdHJhaW5pbmdDdHJCb3gud2lkdGg7CisJfSBlbHNlIHsKKwkJdGhpcy5fY2xpcExlZnQgPSB0aGlzLl9jbGlwUmlnaHQgPSAwOworCX0KKwl0aGlzLl9jbGlwWGRlbHRhID0gc2xpZGVySGFuZGxlQm94LndpZHRoID4+IDE7CisJaWYgKCF0aGlzLmlzRW5hYmxlWSkgeworCQl0aGlzLl9jbGlwVG9wID0gMDsKKwkJdGhpcy5fY2xpcEJvdHRvbSA9IGNvbnN0cmFpbmluZ0N0ckJveC5oZWlnaHQ7CisJfQorCWlmICh0aGlzLl9jb25zdHJhaW50V2lkdGggPD0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0aGlzLnNuYXBWYWx1ZXNYID09IDApIHsKKwkJdGhpcy5zbmFwVmFsdWVzWCA9IHRoaXMuX2NvbnN0cmFpbnRXaWR0aCArIDE7CisJfQorCXRoaXMuX3ZhbHVlU2l6ZVggPSB0aGlzLl9jb25zdHJhaW50V2lkdGggLyAodGhpcy5zbmFwVmFsdWVzWCAtIDEpOworCXJldHVybiB0cnVlOworfSwgc2V0VmFsdWVYOmZ1bmN0aW9uICh2YWx1ZSkgeworCWlmICgwID09IHRoaXMuX3ZhbHVlU2l6ZVgpIHsKKwkJaWYgKHRoaXMuX2NhbGNfdmFsdWVTaXplWCgpID09IGZhbHNlKSB7CisJCQlkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCAic2V0VmFsdWVYIiwgMTAwLCB2YWx1ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGlzTmFOKHZhbHVlKSkgeworCQl2YWx1ZSA9IDA7CisJfQorCWlmICh2YWx1ZSA+IHRoaXMubWF4aW11bVgpIHsKKwkJdmFsdWUgPSB0aGlzLm1heGltdW1YOworCX0gZWxzZSB7CisJCWlmICh2YWx1ZSA8IHRoaXMubWluaW11bVgpIHsKKwkJCXZhbHVlID0gdGhpcy5taW5pbXVtWDsKKwkJfQorCX0KKwl2YXIgcGl4ZWxQZXJjZW50ID0gKHZhbHVlIC0gdGhpcy5taW5pbXVtWCkgLyAodGhpcy5tYXhpbXVtWCAtIHRoaXMubWluaW11bVgpOworCWlmICh0aGlzLmZsaXBYKSB7CisJCXBpeGVsUGVyY2VudCA9IDEgLSBwaXhlbFBlcmNlbnQ7CisJfQorCXRoaXMuX3NuYXBYKHBpeGVsUGVyY2VudCAqIHRoaXMuX2NvbnN0cmFpbnRXaWR0aCk7CisJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKK30sIGdldFZhbHVlWDpmdW5jdGlvbiAoKSB7CisJdmFyIHBpeGVsUGVyY2VudCA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuc2xpZGVySGFuZGxlTm9kZSwgImxlZnQiKSAvIHRoaXMuX2NvbnN0cmFpbnRXaWR0aDsKKwlpZiAodGhpcy5mbGlwWCkgeworCQlwaXhlbFBlcmNlbnQgPSAxIC0gcGl4ZWxQZXJjZW50OworCX0KKwlyZXR1cm4gTWF0aC5yb3VuZChwaXhlbFBlcmNlbnQgKiAodGhpcy5zbmFwVmFsdWVzWCAtIDEpKSAqICgodGhpcy5tYXhpbXVtWCAtIHRoaXMubWluaW11bVgpIC8gKHRoaXMuc25hcFZhbHVlc1ggLSAxKSkgKyB0aGlzLm1pbmltdW1YOworfSwgX3NuYXBZOmZ1bmN0aW9uICh5KSB7CisJaWYgKHkgPCAwKSB7CisJCXkgPSAwOworCX0gZWxzZSB7CisJCWlmICh5ID4gdGhpcy5fY29uc3RyYWludEhlaWdodCkgeworCQkJeSA9IHRoaXMuX2NvbnN0cmFpbnRIZWlnaHQ7CisJCX0gZWxzZSB7CisJCQl2YXIgc2VsZWN0ZWRWYWx1ZSA9IE1hdGgucm91bmQoeSAvIHRoaXMuX3ZhbHVlU2l6ZVkpOworCQkJeSA9IE1hdGgucm91bmQoc2VsZWN0ZWRWYWx1ZSAqIHRoaXMuX3ZhbHVlU2l6ZVkpOworCQl9CisJfQorCXRoaXMuc2xpZGVySGFuZGxlTm9kZS5zdHlsZS50b3AgPSB5ICsgInB4IjsKKwlpZiAodGhpcy5mbGlwWSkgeworCQl0aGlzLl9jbGlwVG9wID0geSArIHRoaXMuX2NsaXBZZGVsdGE7CisJfSBlbHNlIHsKKwkJdGhpcy5fY2xpcEJvdHRvbSA9IHkgKyB0aGlzLl9jbGlwWWRlbHRhOworCX0KKwl0aGlzLnByb2dyZXNzQmFja2dyb3VuZE5vZGUuc3R5bGUuY2xpcCA9ICJyZWN0KCIgKyB0aGlzLl9jbGlwVG9wICsgInB4LCIgKyB0aGlzLl9jbGlwUmlnaHQgKyAicHgsIiArIHRoaXMuX2NsaXBCb3R0b20gKyAicHgsIiArIHRoaXMuX2NsaXBMZWZ0ICsgInB4KSI7Cit9LCBfY2FsY192YWx1ZVNpemVZOmZ1bmN0aW9uICgpIHsKKwl2YXIgY29uc3RyYWluaW5nQ3RyQm94ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5jb25zdHJhaW5pbmdDb250YWluZXJOb2RlKTsKKwl2YXIgc2xpZGVySGFuZGxlQm94ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5zbGlkZXJIYW5kbGVOb2RlKTsKKwlpZiAoaXNOYU4oY29uc3RyYWluaW5nQ3RyQm94LmhlaWdodCkgfHwgaXNOYU4oc2xpZGVySGFuZGxlQm94LmhlaWdodCkgfHwgY29uc3RyYWluaW5nQ3RyQm94LmhlaWdodCA8PSAwIHx8IHNsaWRlckhhbmRsZUJveC5oZWlnaHQgPD0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXRoaXMuX2NvbnN0cmFpbnRIZWlnaHQgPSBjb25zdHJhaW5pbmdDdHJCb3guaGVpZ2h0ICsgZG9qby5odG1sLmdldFBhZGRpbmcodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXJOb2RlKS5oZWlnaHQgLSBzbGlkZXJIYW5kbGVCb3guaGVpZ2h0OworCWlmICh0aGlzLmZsaXBZKSB7CisJCXRoaXMuX2NsaXBUb3AgPSB0aGlzLl9jbGlwQm90dG9tID0gY29uc3RyYWluaW5nQ3RyQm94LmhlaWdodDsKKwl9IGVsc2UgeworCQl0aGlzLl9jbGlwVG9wID0gdGhpcy5fY2xpcEJvdHRvbSA9IDA7CisJfQorCXRoaXMuX2NsaXBZZGVsdGEgPSBzbGlkZXJIYW5kbGVCb3guaGVpZ2h0ID4+IDE7CisJaWYgKCF0aGlzLmlzRW5hYmxlWCkgeworCQl0aGlzLl9jbGlwTGVmdCA9IDA7CisJCXRoaXMuX2NsaXBSaWdodCA9IGNvbnN0cmFpbmluZ0N0ckJveC53aWR0aDsKKwl9CisJaWYgKHRoaXMuX2NvbnN0cmFpbnRIZWlnaHQgPD0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICh0aGlzLnNuYXBWYWx1ZXNZID09IDApIHsKKwkJdGhpcy5zbmFwVmFsdWVzWSA9IHRoaXMuX2NvbnN0cmFpbnRIZWlnaHQgKyAxOworCX0KKwl0aGlzLl92YWx1ZVNpemVZID0gdGhpcy5fY29uc3RyYWludEhlaWdodCAvICh0aGlzLnNuYXBWYWx1ZXNZIC0gMSk7CisJcmV0dXJuIHRydWU7Cit9LCBzZXRWYWx1ZVk6ZnVuY3Rpb24gKHZhbHVlKSB7CisJaWYgKDAgPT0gdGhpcy5fdmFsdWVTaXplWSkgeworCQlpZiAodGhpcy5fY2FsY192YWx1ZVNpemVZKCkgPT0gZmFsc2UpIHsKKwkJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJzZXRWYWx1ZVkiLCAxMDAsIHZhbHVlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoaXNOYU4odmFsdWUpKSB7CisJCXZhbHVlID0gMDsKKwl9CisJaWYgKHZhbHVlID4gdGhpcy5tYXhpbXVtWSkgeworCQl2YWx1ZSA9IHRoaXMubWF4aW11bVk7CisJfSBlbHNlIHsKKwkJaWYgKHZhbHVlIDwgdGhpcy5taW5pbXVtWSkgeworCQkJdmFsdWUgPSB0aGlzLm1pbmltdW1ZOworCQl9CisJfQorCXZhciBwaXhlbFBlcmNlbnQgPSAodmFsdWUgLSB0aGlzLm1pbmltdW1ZKSAvICh0aGlzLm1heGltdW1ZIC0gdGhpcy5taW5pbXVtWSk7CisJaWYgKHRoaXMuZmxpcFkpIHsKKwkJcGl4ZWxQZXJjZW50ID0gMSAtIHBpeGVsUGVyY2VudDsKKwl9CisJdGhpcy5fc25hcFkocGl4ZWxQZXJjZW50ICogdGhpcy5fY29uc3RyYWludEhlaWdodCk7CisJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKK30sIGdldFZhbHVlWTpmdW5jdGlvbiAoKSB7CisJdmFyIHBpeGVsUGVyY2VudCA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuc2xpZGVySGFuZGxlTm9kZSwgInRvcCIpIC8gdGhpcy5fY29uc3RyYWludEhlaWdodDsKKwlpZiAodGhpcy5mbGlwWSkgeworCQlwaXhlbFBlcmNlbnQgPSAxIC0gcGl4ZWxQZXJjZW50OworCX0KKwlyZXR1cm4gTWF0aC5yb3VuZChwaXhlbFBlcmNlbnQgKiAodGhpcy5zbmFwVmFsdWVzWSAtIDEpKSAqICgodGhpcy5tYXhpbXVtWSAtIHRoaXMubWluaW11bVkpIC8gKHRoaXMuc25hcFZhbHVlc1kgLSAxKSkgKyB0aGlzLm1pbmltdW1ZOworfSwgX29uQ2xpY2s6ZnVuY3Rpb24gKGV2dCkgeworCWlmICh0aGlzLl9pc0RyYWdJblByb2dyZXNzKSB7CisJCXJldHVybjsKKwl9CisJdmFyIHBhcmVudCA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyTm9kZSwgdHJ1ZSwgZG9qby5odG1sLmJveFNpemluZy5NQVJHSU5fQk9YKTsKKwl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuX2hhbmRsZU1vdmUuZG9tTm9kZSk7CisJaWYgKHRoaXMuaXNFbmFibGVYKSB7CisJCXZhciB4ID0gZXZ0LnBhZ2VYIC0gcGFyZW50LnggLSAoY29udGVudC53aWR0aCA+PiAxKTsKKwkJdGhpcy5fc25hcFgoeCk7CisJfQorCWlmICh0aGlzLmlzRW5hYmxlWSkgeworCQl2YXIgeSA9IGV2dC5wYWdlWSAtIHBhcmVudC55IC0gKGNvbnRlbnQuaGVpZ2h0ID4+IDEpOworCQl0aGlzLl9zbmFwWSh5KTsKKwl9CisJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoKTsKK30sIG5vdGlmeUxpc3RlbmVyczpmdW5jdGlvbiAoKSB7CisJdGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLmdldFZhbHVlWCgpLCB0aGlzLmdldFZhbHVlWSgpKTsKK30sIG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uICh4LCB5KSB7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlNsaWRlckhvcml6b250YWwiLCBkb2pvLndpZGdldC5TbGlkZXIsIHtpc0VuYWJsZVg6dHJ1ZSwgaXNFbmFibGVZOmZhbHNlLCBpbml0aWFsVmFsdWU6IiIsIHNuYXBWYWx1ZXM6IiIsIG1pbmltdW06IiIsIG1heGltdW06IiIsIGJ1dHRvblN0eWxlOiIiLCBiYWNrZ3JvdW5kU2l6ZToiaGVpZ2h0OjEwcHg7d2lkdGg6MjAwcHg7IiwgYmFja2dyb3VuZFNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLmdpZiIpLCBmbGlwOmZhbHNlLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5TbGlkZXJIb3Jpem9udGFsLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICghaXNOYU4ocGFyc2VGbG9hdCh0aGlzLmluaXRpYWxWYWx1ZSkpKSB7CisJCXRoaXMuaW5pdGlhbFZhbHVlWCA9IHBhcnNlRmxvYXQodGhpcy5pbml0aWFsVmFsdWUpOworCX0KKwlpZiAoIWlzTmFOKHBhcnNlRmxvYXQodGhpcy5taW5pbXVtKSkpIHsKKwkJdGhpcy5taW5pbXVtWCA9IHBhcnNlRmxvYXQodGhpcy5taW5pbXVtKTsKKwl9CisJaWYgKCFpc05hTihwYXJzZUZsb2F0KHRoaXMubWF4aW11bSkpKSB7CisJCXRoaXMubWF4aW11bVggPSBwYXJzZUZsb2F0KHRoaXMubWF4aW11bSk7CisJfQorCWlmICghaXNOYU4ocGFyc2VJbnQodGhpcy5zbmFwVmFsdWVzKSkpIHsKKwkJdGhpcy5zbmFwVmFsdWVzWCA9IHBhcnNlSW50KHRoaXMuc25hcFZhbHVlcyk7CisJfQorCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodGhpcy5idXR0b25TdHlsZSkgJiYgdGhpcy5idXR0b25TdHlsZSAhPSAiIikgeworCQl0aGlzLmJ1dHRvblN0eWxlWCA9IHRoaXMuYnV0dG9uU3R5bGU7CisJfQorCWlmIChkb2pvLmxhbmcuaXNCb29sZWFuKHRoaXMuZmxpcCkpIHsKKwkJdGhpcy5mbGlwWCA9IHRoaXMuZmxpcDsKKwl9Cit9LCBub3RpZnlMaXN0ZW5lcnM6ZnVuY3Rpb24gKCkgeworCXRoaXMub25WYWx1ZUNoYW5nZWQodGhpcy5nZXRWYWx1ZVgoKSk7Cit9LCBnZXRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZ2V0VmFsdWVYKCk7Cit9LCBzZXRWYWx1ZTpmdW5jdGlvbiAodmFsdWUpIHsKKwl0aGlzLnNldFZhbHVlWCh2YWx1ZSk7Cit9LCBvblZhbHVlQ2hhbmdlZDpmdW5jdGlvbiAodmFsdWUpIHsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuU2xpZGVyVmVydGljYWwiLCBkb2pvLndpZGdldC5TbGlkZXIsIHtpc0VuYWJsZVg6ZmFsc2UsIGlzRW5hYmxlWTp0cnVlLCBpbml0aWFsVmFsdWU6IiIsIHNuYXBWYWx1ZXM6IiIsIG1pbmltdW06IiIsIG1heGltdW06IiIsIGJ1dHRvblN0eWxlOiIiLCBiYWNrZ3JvdW5kU2l6ZToid2lkdGg6MTBweDtoZWlnaHQ6MjAwcHg7IiwgYmFja2dyb3VuZFNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLXZlcnQuZ2lmIiksIGZsaXA6ZmFsc2UsIHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LlNsaWRlclZlcnRpY2FsLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmICghaXNOYU4ocGFyc2VGbG9hdCh0aGlzLmluaXRpYWxWYWx1ZSkpKSB7CisJCXRoaXMuaW5pdGlhbFZhbHVlWSA9IHBhcnNlRmxvYXQodGhpcy5pbml0aWFsVmFsdWUpOworCX0KKwlpZiAoIWlzTmFOKHBhcnNlRmxvYXQodGhpcy5taW5pbXVtKSkpIHsKKwkJdGhpcy5taW5pbXVtWSA9IHBhcnNlRmxvYXQodGhpcy5taW5pbXVtKTsKKwl9CisJaWYgKCFpc05hTihwYXJzZUZsb2F0KHRoaXMubWF4aW11bSkpKSB7CisJCXRoaXMubWF4aW11bVkgPSBwYXJzZUZsb2F0KHRoaXMubWF4aW11bSk7CisJfQorCWlmICghaXNOYU4ocGFyc2VJbnQodGhpcy5zbmFwVmFsdWVzKSkpIHsKKwkJdGhpcy5zbmFwVmFsdWVzWSA9IHBhcnNlSW50KHRoaXMuc25hcFZhbHVlcyk7CisJfQorCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodGhpcy5idXR0b25TdHlsZSkgJiYgdGhpcy5idXR0b25TdHlsZSAhPSAiIikgeworCQl0aGlzLmJ1dHRvblN0eWxlWSA9IHRoaXMuYnV0dG9uU3R5bGU7CisJfQorCWlmIChkb2pvLmxhbmcuaXNCb29sZWFuKHRoaXMuZmxpcCkpIHsKKwkJdGhpcy5mbGlwWSA9IHRoaXMuZmxpcDsKKwl9Cit9LCBub3RpZnlMaXN0ZW5lcnM6ZnVuY3Rpb24gKCkgeworCXRoaXMub25WYWx1ZUNoYW5nZWQodGhpcy5nZXRWYWx1ZVkoKSk7Cit9LCBnZXRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZ2V0VmFsdWVZKCk7Cit9LCBzZXRWYWx1ZTpmdW5jdGlvbiAodmFsdWUpIHsKKwl0aGlzLnNldFZhbHVlWSh2YWx1ZSk7Cit9LCBvblZhbHVlQ2hhbmdlZDpmdW5jdGlvbiAodmFsdWUpIHsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuX1NsaWRlckRyYWdNb3ZlU291cmNlIiwgZG9qby5kbmQuSHRtbERyYWdNb3ZlU291cmNlLCB7c2xpZGVyOm51bGwsIG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLnNsaWRlci5faXNEcmFnSW5Qcm9ncmVzcyA9IHRydWU7CisJdmFyIGRyYWdPYmogPSB0aGlzLmNyZWF0ZURyYWdNb3ZlT2JqZWN0KCk7CisJdGhpcy5zbGlkZXIubm90aWZ5TGlzdGVuZXJzKCk7CisJcmV0dXJuIGRyYWdPYmo7Cit9LCBvbkRyYWdFbmQ6ZnVuY3Rpb24gKGV2dCkgeworCXRoaXMuc2xpZGVyLl9pc0RyYWdJblByb2dyZXNzID0gZmFsc2U7CisJdGhpcy5zbGlkZXIubm90aWZ5TGlzdGVuZXJzKCk7Cit9LCBjcmVhdGVEcmFnTW92ZU9iamVjdDpmdW5jdGlvbiAoKSB7CisJdmFyIGRyYWdPYmogPSBuZXcgZG9qby53aWRnZXQuX1NsaWRlckRyYWdNb3ZlT2JqZWN0KHRoaXMuZHJhZ09iamVjdCwgdGhpcy50eXBlKTsKKwlkcmFnT2JqLnNsaWRlciA9IHRoaXMuc2xpZGVyOworCWlmICh0aGlzLmRyYWdDbGFzcykgeworCQlkcmFnT2JqLmRyYWdDbGFzcyA9IHRoaXMuZHJhZ0NsYXNzOworCX0KKwlyZXR1cm4gZHJhZ09iajsKK30sIHNldFBhcmVudDpmdW5jdGlvbiAoc2xpZGVyKSB7CisJdGhpcy5zbGlkZXIgPSBzbGlkZXI7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0Ll9TbGlkZXJEcmFnTW92ZU9iamVjdCIsIGRvam8uZG5kLkh0bWxEcmFnTW92ZU9iamVjdCwge3NsaWRlcjpudWxsLCBvbkRyYWdNb3ZlOmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLnVwZGF0ZURyYWdPZmZzZXQoKTsKKwlpZiAodGhpcy5zbGlkZXIuaXNFbmFibGVYKSB7CisJCXZhciB4ID0gdGhpcy5kcmFnT2Zmc2V0LnggKyBldnQucGFnZVg7CisJCXRoaXMuc2xpZGVyLl9zbmFwWCh4KTsKKwl9CisJaWYgKHRoaXMuc2xpZGVyLmlzRW5hYmxlWSkgeworCQl2YXIgeSA9IHRoaXMuZHJhZ09mZnNldC55ICsgZXZ0LnBhZ2VZOworCQl0aGlzLnNsaWRlci5fc25hcFkoeSk7CisJfQorCWlmICh0aGlzLnNsaWRlci5hY3RpdmVEcmFnKSB7CisJCXRoaXMuc2xpZGVyLm5vdGlmeUxpc3RlbmVycygpOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Tb3J0YWJsZVRhYmxlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Tb3J0YWJsZVRhYmxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmFjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NvcnRhYmxlVGFibGUuanMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNvcnRhYmxlVGFibGUiKTsKK2Rvam8uZGVwcmVjYXRlZCgiU29ydGFibGVUYWJsZSB3aWxsIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgRmlsdGVyaW5nVGFibGUuIiwgIjAuNSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5mb3JtYXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwudXRpbCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Tb3J0YWJsZVRhYmxlIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMuc2VsZWN0ZWQgPSBbXTsKKwl0aGlzLmNvbHVtbnMgPSBbXTsKK30sIHtlbmFibGVNdWx0aXBsZVNlbGVjdDpmYWxzZSwgbWF4aW11bU51bWJlck9mU2VsZWN0aW9uczowLCBlbmFibGVBbHRlcm5hdGVSb3dzOmZhbHNlLCBtaW5Sb3dzOjAsIGRlZmF1bHREYXRlRm9ybWF0OiIlRCIsIHNvcnRJbmRleDowLCBzb3J0RGlyZWN0aW9uOjAsIHZhbHVlRmllbGQ6IklkIiwgaGVhZENsYXNzOiIiLCB0Ym9keUNsYXNzOiIiLCBoZWFkZXJDbGFzczoiIiwgaGVhZGVyU29ydFVwQ2xhc3M6InNlbGVjdGVkIiwgaGVhZGVyU29ydERvd25DbGFzczoic2VsZWN0ZWQiLCByb3dDbGFzczoiIiwgcm93QWx0ZXJuYXRlQ2xhc3M6ImFsdCIsIHJvd1NlbGVjdGVkQ2xhc3M6InNlbGVjdGVkIiwgY29sdW1uU2VsZWN0ZWQ6InNvcnRlZC1jb2x1bW4iLCBpc0NvbnRhaW5lcjpmYWxzZSwgdGVtcGxhdGVQYXRoOm51bGwsIHRlbXBsYXRlQ3NzUGF0aDpudWxsLCBnZXRUeXBlRnJvbVN0cmluZzpmdW5jdGlvbiAocykgeworCXZhciBwYXJ0cyA9IHMuc3BsaXQoIi4iKSwgaSA9IDAsIG9iaiA9IGRqX2dsb2JhbDsKKwlkbyB7CisJCW9iaiA9IG9ialtwYXJ0c1tpKytdXTsKKwl9IHdoaWxlIChpIDwgcGFydHMubGVuZ3RoICYmIG9iaik7CisJcmV0dXJuIChvYmogIT0gZGpfZ2xvYmFsKSA/IG9iaiA6IG51bGw7Cit9LCBjb21wYXJlOmZ1bmN0aW9uIChvMSwgbzIpIHsKKwlmb3IgKHZhciBwIGluIG8xKSB7CisJCWlmICghKHAgaW4gbzIpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKG8xW3BdLnZhbHVlT2YoKSAhPSBvMltwXS52YWx1ZU9mKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIGlzU2VsZWN0ZWQ6ZnVuY3Rpb24gKG8pIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29tcGFyZSh0aGlzLnNlbGVjdGVkW2ldLCBvKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfSwgcmVtb3ZlRnJvbVNlbGVjdGVkOmZ1bmN0aW9uIChvKSB7CisJdmFyIGlkeCA9IC0xOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZC5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5jb21wYXJlKHRoaXMuc2VsZWN0ZWRbaV0sIG8pKSB7CisJCQlpZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGlkeCA+PSAwKSB7CisJCXRoaXMuc2VsZWN0ZWQuc3BsaWNlKGlkeCwgMSk7CisJfQorfSwgZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5zZWxlY3RlZDsKK30sIGdldFZhbHVlOmZ1bmN0aW9uICgpIHsKKwl2YXIgYSA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZC5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5zZWxlY3RlZFtpXVt0aGlzLnZhbHVlRmllbGRdKSB7CisJCQlhLnB1c2godGhpcy5zZWxlY3RlZFtpXVt0aGlzLnZhbHVlRmllbGRdKTsKKwkJfQorCX0KKwlyZXR1cm4gYS5qb2luKCk7Cit9LCByZXNldDpmdW5jdGlvbiAoKSB7CisJdGhpcy5jb2x1bW5zID0gW107CisJdGhpcy5kYXRhID0gW107CisJdGhpcy5yZXNldFNlbGVjdGlvbnModGhpcy5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdKTsKK30sIHJlc2V0U2VsZWN0aW9uczpmdW5jdGlvbiAoYm9keSkgeworCXRoaXMuc2VsZWN0ZWQgPSBbXTsKKwl2YXIgaWR4ID0gMDsKKwl2YXIgcm93cyA9IGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7CisJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChyb3dzW2ldLnBhcmVudE5vZGUgPT0gYm9keSkgeworCQkJcm93c1tpXS5yZW1vdmVBdHRyaWJ1dGUoInNlbGVjdGVkIik7CisJCQlpZiAodGhpcy5lbmFibGVBbHRlcm5hdGVSb3dzICYmIGlkeCAlIDIgPT0gMSkgeworCQkJCXJvd3NbaV0uY2xhc3NOYW1lID0gdGhpcy5yb3dBbHRlcm5hdGVDbGFzczsKKwkJCX0gZWxzZSB7CisJCQkJcm93c1tpXS5jbGFzc05hbWUgPSAiIjsKKwkJCX0KKwkJCWlkeCsrOworCQl9CisJfQorfSwgZ2V0T2JqZWN0RnJvbVJvdzpmdW5jdGlvbiAocm93KSB7CisJdmFyIGNlbGxzID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCXZhciBvID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29sdW1uc1tpXS5zb3J0VHlwZSA9PSAiX19tYXJrdXBfXyIpIHsKKwkJCW9bdGhpcy5jb2x1bW5zW2ldLmdldEZpZWxkKCldID0gY2VsbHNbaV0uaW5uZXJIVE1MOworCQl9IGVsc2UgeworCQkJdmFyIHRleHQgPSBkb2pvLmh0bWwucmVuZGVyZWRUZXh0Q29udGVudChjZWxsc1tpXSk7CisJCQl2YXIgdmFsID0gdGV4dDsKKwkJCWlmICh0aGlzLmNvbHVtbnNbaV0uZ2V0VHlwZSgpICE9IFN0cmluZykgeworCQkJCXZhciB2YWwgPSBuZXcgKHRoaXMuY29sdW1uc1tpXS5nZXRUeXBlKCkpKHRleHQpOworCQkJfQorCQkJb1t0aGlzLmNvbHVtbnNbaV0uZ2V0RmllbGQoKV0gPSB2YWw7CisJCX0KKwl9CisJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUocm93LCAidmFsdWUiKSkgeworCQlvW3RoaXMudmFsdWVGaWVsZF0gPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKHJvdywgInZhbHVlIik7CisJfQorCXJldHVybiBvOworfSwgc2V0U2VsZWN0aW9uQnlSb3c6ZnVuY3Rpb24gKHJvdykgeworCXZhciBvID0gdGhpcy5nZXRPYmplY3RGcm9tUm93KHJvdyk7CisJdmFyIGIgPSBmYWxzZTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY29tcGFyZSh0aGlzLnNlbGVjdGVkW2ldLCBvKSkgeworCQkJYiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWIpIHsKKwkJdGhpcy5zZWxlY3RlZC5wdXNoKG8pOworCX0KK30sIHBhcnNlQ29sdW1uczpmdW5jdGlvbiAobm9kZSkgeworCXRoaXMucmVzZXQoKTsKKwl2YXIgcm93ID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKVswXTsKKwl2YXIgY2VsbHMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJaWYgKGNlbGxzLmxlbmd0aCA9PSAwKSB7CisJCWNlbGxzID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aCIpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBvID0ge2ZpZWxkOm51bGwsIGZvcm1hdDpudWxsLCBub1NvcnQ6ZmFsc2UsIHNvcnRUeXBlOiJTdHJpbmciLCBkYXRhVHlwZTpTdHJpbmcsIHNvcnRGdW5jdGlvbjpudWxsLCBsYWJlbDpudWxsLCBhbGlnbjoibGVmdCIsIHZhbGlnbjoibWlkZGxlIiwgZ2V0RmllbGQ6ZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIHRoaXMuZmllbGQgfHwgdGhpcy5sYWJlbDsKKwkJfSwgZ2V0VHlwZTpmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKKwkJfX07CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAiYWxpZ24iKSkgeworCQkJby5hbGlnbiA9IGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoY2VsbHNbaV0sICJhbGlnbiIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAidmFsaWduIikpIHsKKwkJCW8udmFsaWduID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgInZhbGlnbiIpOworCQl9CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAibm9zb3J0IikpIHsKKwkJCW8ubm9Tb3J0ID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgIm5vc29ydCIpID09ICJ0cnVlIjsKKwkJfQorCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShjZWxsc1tpXSwgInNvcnR1c2luZyIpKSB7CisJCQl2YXIgdHJhbnMgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGNlbGxzW2ldLCAic29ydHVzaW5nIik7CisJCQl2YXIgZiA9IHRoaXMuZ2V0VHlwZUZyb21TdHJpbmcodHJhbnMpOworCQkJaWYgKGYgIT0gbnVsbCAmJiBmICE9IHdpbmRvdyAmJiB0eXBlb2YgKGYpID09ICJmdW5jdGlvbiIpIHsKKwkJCQlvLnNvcnRGdW5jdGlvbiA9IGY7CisJCQl9CisJCX0KKwkJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUoY2VsbHNbaV0sICJmaWVsZCIpKSB7CisJCQlvLmZpZWxkID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgImZpZWxkIik7CisJCX0KKwkJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUoY2VsbHNbaV0sICJmb3JtYXQiKSkgeworCQkJby5mb3JtYXQgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGNlbGxzW2ldLCAiZm9ybWF0Iik7CisJCX0KKwkJaWYgKGRvam8uaHRtbC5oYXNBdHRyaWJ1dGUoY2VsbHNbaV0sICJkYXRhVHlwZSIpKSB7CisJCQl2YXIgc29ydFR5cGUgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKGNlbGxzW2ldLCAiZGF0YVR5cGUiKTsKKwkJCWlmIChzb3J0VHlwZS50b0xvd2VyQ2FzZSgpID09ICJodG1sIiB8fCBzb3J0VHlwZS50b0xvd2VyQ2FzZSgpID09ICJtYXJrdXAiKSB7CisJCQkJby5zb3J0VHlwZSA9ICJfX21hcmt1cF9fIjsKKwkJCQlvLm5vU29ydCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCXZhciB0eXBlID0gdGhpcy5nZXRUeXBlRnJvbVN0cmluZyhzb3J0VHlwZSk7CisJCQkJaWYgKHR5cGUpIHsKKwkJCQkJby5zb3J0VHlwZSA9IHNvcnRUeXBlOworCQkJCQlvLmRhdGFUeXBlID0gdHlwZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJby5sYWJlbCA9IGRvam8uaHRtbC5yZW5kZXJlZFRleHRDb250ZW50KGNlbGxzW2ldKTsKKwkJdGhpcy5jb2x1bW5zLnB1c2gobyk7CisJCWlmIChkb2pvLmh0bWwuaGFzQXR0cmlidXRlKGNlbGxzW2ldLCAic29ydCIpKSB7CisJCQl0aGlzLnNvcnRJbmRleCA9IGk7CisJCQl2YXIgZGlyID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShjZWxsc1tpXSwgInNvcnQiKTsKKwkJCWlmICghaXNOYU4ocGFyc2VJbnQoZGlyKSkpIHsKKwkJCQlkaXIgPSBwYXJzZUludChkaXIpOworCQkJCXRoaXMuc29ydERpcmVjdGlvbiA9IChkaXIgIT0gMCkgPyAxIDogMDsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5zb3J0RGlyZWN0aW9uID0gKGRpci50b0xvd2VyQ2FzZSgpID09ICJkZXNjIikgPyAxIDogMDsKKwkJCX0KKwkJfQorCX0KK30sIHBhcnNlRGF0YTpmdW5jdGlvbiAoZGF0YSkgeworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMuc2VsZWN0ZWQgPSBbXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJdmFyIG8gPSB7fTsKKwkJZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHsKKwkJCXZhciBmaWVsZCA9IHRoaXMuY29sdW1uc1tqXS5nZXRGaWVsZCgpOworCQkJaWYgKHRoaXMuY29sdW1uc1tqXS5zb3J0VHlwZSA9PSAiX19tYXJrdXBfXyIpIHsKKwkJCQlvW2ZpZWxkXSA9IFN0cmluZyhkYXRhW2ldW2ZpZWxkXSk7CisJCQl9IGVsc2UgeworCQkJCXZhciB0eXBlID0gdGhpcy5jb2x1bW5zW2pdLmdldFR5cGUoKTsKKwkJCQl2YXIgdmFsID0gZGF0YVtpXVtmaWVsZF07CisJCQkJdmFyIHQgPSB0aGlzLmNvbHVtbnNbal0uc29ydFR5cGUudG9Mb3dlckNhc2UoKTsKKwkJCQlpZiAodHlwZSA9PSBTdHJpbmcpIHsKKwkJCQkJb1tmaWVsZF0gPSB2YWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHZhbCAhPSBudWxsKSB7CisJCQkJCQlvW2ZpZWxkXSA9IG5ldyB0eXBlKHZhbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlvW2ZpZWxkXSA9IG5ldyB0eXBlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGRhdGFbaV1bdGhpcy52YWx1ZUZpZWxkXSAmJiAhb1t0aGlzLnZhbHVlRmllbGRdKSB7CisJCQlvW3RoaXMudmFsdWVGaWVsZF0gPSBkYXRhW2ldW3RoaXMudmFsdWVGaWVsZF07CisJCX0KKwkJdGhpcy5kYXRhLnB1c2gobyk7CisJfQorfSwgcGFyc2VEYXRhRnJvbVRhYmxlOmZ1bmN0aW9uICh0Ym9keSkgeworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMuc2VsZWN0ZWQgPSBbXTsKKwl2YXIgcm93cyA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworCQlpZiAoZG9qby5odG1sLmdldEF0dHJpYnV0ZShyb3dzW2ldLCAiaWdub3JlSWZQYXJzZWQiKSA9PSAidHJ1ZSIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhciBvID0ge307CisJCXZhciBjZWxscyA9IHJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7CisJCQl2YXIgZmllbGQgPSB0aGlzLmNvbHVtbnNbal0uZ2V0RmllbGQoKTsKKwkJCWlmICh0aGlzLmNvbHVtbnNbal0uc29ydFR5cGUgPT0gIl9fbWFya3VwX18iKSB7CisJCQkJb1tmaWVsZF0gPSBjZWxsc1tqXS5pbm5lckhUTUw7CisJCQl9IGVsc2UgeworCQkJCXZhciB0eXBlID0gdGhpcy5jb2x1bW5zW2pdLmdldFR5cGUoKTsKKwkJCQl2YXIgdmFsID0gZG9qby5odG1sLnJlbmRlcmVkVGV4dENvbnRlbnQoY2VsbHNbal0pOworCQkJCWlmICh0eXBlID09IFN0cmluZykgeworCQkJCQlvW2ZpZWxkXSA9IHZhbDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodmFsICE9IG51bGwpIHsKKwkJCQkJCW9bZmllbGRdID0gbmV3IHR5cGUodmFsKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW9bZmllbGRdID0gbmV3IHR5cGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShyb3dzW2ldLCAidmFsdWUiKSAmJiAhb1t0aGlzLnZhbHVlRmllbGRdKSB7CisJCQlvW3RoaXMudmFsdWVGaWVsZF0gPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKHJvd3NbaV0sICJ2YWx1ZSIpOworCQl9CisJCXRoaXMuZGF0YS5wdXNoKG8pOworCQlpZiAoZG9qby5odG1sLmdldEF0dHJpYnV0ZShyb3dzW2ldLCAic2VsZWN0ZWQiKSA9PSAidHJ1ZSIpIHsKKwkJCXRoaXMuc2VsZWN0ZWQucHVzaChvKTsKKwkJfQorCX0KK30sIHNob3dTZWxlY3Rpb25zOmZ1bmN0aW9uICgpIHsKKwl2YXIgYm9keSA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXTsKKwl2YXIgcm93cyA9IGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7CisJdmFyIGlkeCA9IDA7CisJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChyb3dzW2ldLnBhcmVudE5vZGUgPT0gYm9keSkgeworCQkJaWYgKGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUocm93c1tpXSwgInNlbGVjdGVkIikgPT0gInRydWUiKSB7CisJCQkJcm93c1tpXS5jbGFzc05hbWUgPSB0aGlzLnJvd1NlbGVjdGVkQ2xhc3M7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLmVuYWJsZUFsdGVybmF0ZVJvd3MgJiYgaWR4ICUgMiA9PSAxKSB7CisJCQkJCXJvd3NbaV0uY2xhc3NOYW1lID0gdGhpcy5yb3dBbHRlcm5hdGVDbGFzczsKKwkJCQl9IGVsc2UgeworCQkJCQlyb3dzW2ldLmNsYXNzTmFtZSA9ICIiOworCQkJCX0KKwkJCX0KKwkJCWlkeCsrOworCQl9CisJfQorfSwgcmVuZGVyOmZ1bmN0aW9uIChiRG9udFByZXNlcnZlKSB7CisJdmFyIGRhdGEgPSBbXTsKKwl2YXIgYm9keSA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXTsKKwlpZiAoIWJEb250UHJlc2VydmUpIHsKKwkJdGhpcy5wYXJzZURhdGFGcm9tVGFibGUoYm9keSk7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7CisJCWRhdGEucHVzaCh0aGlzLmRhdGFbaV0pOworCX0KKwl2YXIgY29sID0gdGhpcy5jb2x1bW5zW3RoaXMuc29ydEluZGV4XTsKKwlpZiAoIWNvbC5ub1NvcnQpIHsKKwkJdmFyIGZpZWxkID0gY29sLmdldEZpZWxkKCk7CisJCWlmIChjb2wuc29ydEZ1bmN0aW9uKSB7CisJCQl2YXIgc29ydCA9IGNvbC5zb3J0RnVuY3Rpb247CisJCX0gZWxzZSB7CisJCQl2YXIgc29ydCA9IGZ1bmN0aW9uIChhLCBiKSB7CisJCQkJaWYgKGFbZmllbGRdID4gYltmaWVsZF0pIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWlmIChhW2ZpZWxkXSA8IGJbZmllbGRdKSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9OworCQl9CisJCWRhdGEuc29ydChzb3J0KTsKKwkJaWYgKHRoaXMuc29ydERpcmVjdGlvbiAhPSAwKSB7CisJCQlkYXRhLnJldmVyc2UoKTsKKwkJfQorCX0KKwl3aGlsZSAoYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJYm9keS5yZW1vdmVDaGlsZChib2R5LmNoaWxkTm9kZXNbMF0pOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKKwkJdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7CisJCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHJvdyk7CisJCWlmIChkYXRhW2ldW3RoaXMudmFsdWVGaWVsZF0pIHsKKwkJCXJvdy5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgZGF0YVtpXVt0aGlzLnZhbHVlRmllbGRdKTsKKwkJfQorCQlpZiAodGhpcy5pc1NlbGVjdGVkKGRhdGFbaV0pKSB7CisJCQlyb3cuY2xhc3NOYW1lID0gdGhpcy5yb3dTZWxlY3RlZENsYXNzOworCQkJcm93LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCAidHJ1ZSIpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuZW5hYmxlQWx0ZXJuYXRlUm93cyAmJiBpICUgMiA9PSAxKSB7CisJCQkJcm93LmNsYXNzTmFtZSA9IHRoaXMucm93QWx0ZXJuYXRlQ2xhc3M7CisJCQl9CisJCX0KKwkJZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHsKKwkJCXZhciBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKKwkJCWNlbGwuc2V0QXR0cmlidXRlKCJhbGlnbiIsIHRoaXMuY29sdW1uc1tqXS5hbGlnbik7CisJCQljZWxsLnNldEF0dHJpYnV0ZSgidmFsaWduIiwgdGhpcy5jb2x1bW5zW2pdLnZhbGlnbik7CisJCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihjZWxsKTsKKwkJCWlmICh0aGlzLnNvcnRJbmRleCA9PSBqKSB7CisJCQkJY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNvbHVtblNlbGVjdGVkOworCQkJfQorCQkJaWYgKHRoaXMuY29sdW1uc1tqXS5zb3J0VHlwZSA9PSAiX19tYXJrdXBfXyIpIHsKKwkJCQljZWxsLmlubmVySFRNTCA9IGRhdGFbaV1bdGhpcy5jb2x1bW5zW2pdLmdldEZpZWxkKCldOworCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgY2VsbC5jaGlsZE5vZGVzLmxlbmd0aDsgaysrKSB7CisJCQkJCXZhciBub2RlID0gY2VsbC5jaGlsZE5vZGVzW2tdOworCQkJCQlpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IGRvam8uaHRtbC5FTEVNRU5UX05PREUpIHsKKwkJCQkJCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKG5vZGUpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5jb2x1bW5zW2pdLmdldFR5cGUoKSA9PSBEYXRlKSB7CisJCQkJCXZhciBmb3JtYXQgPSB0aGlzLmRlZmF1bHREYXRlRm9ybWF0OworCQkJCQlpZiAodGhpcy5jb2x1bW5zW2pdLmZvcm1hdCkgeworCQkJCQkJZm9ybWF0ID0gdGhpcy5jb2x1bW5zW2pdLmZvcm1hdDsKKwkJCQkJfQorCQkJCQljZWxsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRvam8uZGF0ZS5zdHJmdGltZShkYXRhW2ldW3RoaXMuY29sdW1uc1tqXS5nZXRGaWVsZCgpXSwgZm9ybWF0KSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWNlbGwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YVtpXVt0aGlzLmNvbHVtbnNbal0uZ2V0RmllbGQoKV0pKTsKKwkJCQl9CisJCQl9CisJCQlyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7CisJCX0KKwkJYm9keS5hcHBlbmRDaGlsZChyb3cpOworCQlkb2pvLmV2ZW50LmNvbm5lY3Qocm93LCAib25jbGljayIsIHRoaXMsICJvblVJU2VsZWN0Iik7CisJfQorCXZhciBtaW5Sb3dzID0gcGFyc2VJbnQodGhpcy5taW5Sb3dzKTsKKwlpZiAoIWlzTmFOKG1pblJvd3MpICYmIG1pblJvd3MgPiAwICYmIGRhdGEubGVuZ3RoIDwgbWluUm93cykgeworCQl2YXIgbW9kID0gMDsKKwkJaWYgKGRhdGEubGVuZ3RoICUgMiA9PSAwKSB7CisJCQltb2QgPSAxOworCQl9CisJCXZhciBuUm93cyA9IG1pblJvd3MgLSBkYXRhLmxlbmd0aDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7CisJCQl2YXIgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKKwkJCXJvdy5zZXRBdHRyaWJ1dGUoImlnbm9yZUlmUGFyc2VkIiwgInRydWUiKTsKKwkJCWlmICh0aGlzLmVuYWJsZUFsdGVybmF0ZVJvd3MgJiYgaSAlIDIgPT0gbW9kKSB7CisJCQkJcm93LmNsYXNzTmFtZSA9IHRoaXMucm93QWx0ZXJuYXRlQ2xhc3M7CisJCQl9CisJCQlmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGorKykgeworCQkJCXZhciBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKKwkJCQljZWxsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJceGEwIikpOworCQkJCXJvdy5hcHBlbmRDaGlsZChjZWxsKTsKKwkJCX0KKwkJCWJvZHkuYXBwZW5kQ2hpbGQocm93KTsKKwkJfQorCX0KK30sIG9uU2VsZWN0OmZ1bmN0aW9uIChlKSB7Cit9LCBvblVJU2VsZWN0OmZ1bmN0aW9uIChlKSB7CisJdmFyIHJvdyA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoZS50YXJnZXQsICJ0ciIpOworCXZhciBib2R5ID0gZG9qby5odG1sLmdldFBhcmVudEJ5VHlwZShyb3csICJ0Ym9keSIpOworCWlmICh0aGlzLmVuYWJsZU11bHRpcGxlU2VsZWN0KSB7CisJCWlmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7CisJCQlpZiAodGhpcy5pc1NlbGVjdGVkKHRoaXMuZ2V0T2JqZWN0RnJvbVJvdyhyb3cpKSkgeworCQkJCXRoaXMucmVtb3ZlRnJvbVNlbGVjdGVkKHRoaXMuZ2V0T2JqZWN0RnJvbVJvdyhyb3cpKTsKKwkJCQlyb3cucmVtb3ZlQXR0cmlidXRlKCJzZWxlY3RlZCIpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnNldFNlbGVjdGlvbkJ5Um93KHJvdyk7CisJCQkJcm93LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCAidHJ1ZSIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGUuc2hpZnRLZXkpIHsKKwkJCQl2YXIgc3RhcnRSb3c7CisJCQkJdmFyIHJvd3MgPSBib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAocm93c1tpXS5wYXJlbnROb2RlID09IGJvZHkpIHsKKwkJCQkJCWlmIChyb3dzW2ldID09IHJvdykgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUocm93c1tpXSwgInNlbGVjdGVkIikgPT0gInRydWUiKSB7CisJCQkJCQkJc3RhcnRSb3cgPSByb3dzW2ldOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICghc3RhcnRSb3cpIHsKKwkJCQkJc3RhcnRSb3cgPSByb3c7CisJCQkJCWZvciAoOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworCQkJCQkJaWYgKGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUocm93c1tpXSwgInNlbGVjdGVkIikgPT0gInRydWUiKSB7CisJCQkJCQkJcm93ID0gcm93c1tpXTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLnJlc2V0U2VsZWN0aW9ucyhib2R5KTsKKwkJCQlpZiAoc3RhcnRSb3cgPT0gcm93KSB7CisJCQkJCXJvdy5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgInRydWUiKTsKKwkJCQkJdGhpcy5zZXRTZWxlY3Rpb25CeVJvdyhyb3cpOworCQkJCX0gZWxzZSB7CisJCQkJCXZhciBkb1NlbGVjdCA9IGZhbHNlOworCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChyb3dzW2ldLnBhcmVudE5vZGUgPT0gYm9keSkgeworCQkJCQkJCXJvd3NbaV0ucmVtb3ZlQXR0cmlidXRlKCJzZWxlY3RlZCIpOworCQkJCQkJCWlmIChyb3dzW2ldID09IHN0YXJ0Um93KSB7CisJCQkJCQkJCWRvU2VsZWN0ID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGRvU2VsZWN0KSB7CisJCQkJCQkJCXRoaXMuc2V0U2VsZWN0aW9uQnlSb3cocm93c1tpXSk7CisJCQkJCQkJCXJvd3NbaV0uc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsICJ0cnVlIik7CisJCQkJCQkJfQorCQkJCQkJCWlmIChyb3dzW2ldID09IHJvdykgeworCQkJCQkJCQlkb1NlbGVjdCA9IGZhbHNlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5yZXNldFNlbGVjdGlvbnMoYm9keSk7CisJCQkJcm93LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCAidHJ1ZSIpOworCQkJCXRoaXMuc2V0U2VsZWN0aW9uQnlSb3cocm93KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXRoaXMucmVzZXRTZWxlY3Rpb25zKGJvZHkpOworCQlyb3cuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsICJ0cnVlIik7CisJCXRoaXMuc2V0U2VsZWN0aW9uQnlSb3cocm93KTsKKwl9CisJdGhpcy5zaG93U2VsZWN0aW9ucygpOworCXRoaXMub25TZWxlY3QoZSk7CisJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwllLnByZXZlbnREZWZhdWx0KCk7Cit9LCBvbkhlYWRlckNsaWNrOmZ1bmN0aW9uIChlKSB7CisJdmFyIG9sZEluZGV4ID0gdGhpcy5zb3J0SW5kZXg7CisJdmFyIG9sZERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbjsKKwl2YXIgc291cmNlID0gZS50YXJnZXQ7CisJdmFyIHJvdyA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoc291cmNlLCAidHIiKTsKKwl2YXIgY2VsbFRhZyA9ICJ0ZCI7CisJaWYgKHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZShjZWxsVGFnKS5sZW5ndGggPT0gMCkgeworCQljZWxsVGFnID0gInRoIjsKKwl9CisJdmFyIGhlYWRlcnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2VsbFRhZyk7CisJdmFyIGhlYWRlciA9IGRvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGUoc291cmNlLCBjZWxsVGFnKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGhlYWRlcnNbaV0gPT0gaGVhZGVyKSB7CisJCQlpZiAoaSAhPSBvbGRJbmRleCkgeworCQkJCXRoaXMuc29ydEluZGV4ID0gaTsKKwkJCQl0aGlzLnNvcnREaXJlY3Rpb24gPSAwOworCQkJCWhlYWRlcnNbaV0uY2xhc3NOYW1lID0gdGhpcy5oZWFkZXJTb3J0RG93bkNsYXNzOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnNvcnREaXJlY3Rpb24gPSAob2xkRGlyZWN0aW9uID09IDApID8gMSA6IDA7CisJCQkJaWYgKHRoaXMuc29ydERpcmVjdGlvbiA9PSAwKSB7CisJCQkJCWhlYWRlcnNbaV0uY2xhc3NOYW1lID0gdGhpcy5oZWFkZXJTb3J0RG93bkNsYXNzOworCQkJCX0gZWxzZSB7CisJCQkJCWhlYWRlcnNbaV0uY2xhc3NOYW1lID0gdGhpcy5oZWFkZXJTb3J0VXBDbGFzczsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQloZWFkZXJzW2ldLmNsYXNzTmFtZSA9IHRoaXMuaGVhZGVyQ2xhc3M7CisJCX0KKwl9CisJdGhpcy5yZW5kZXIoKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXZhciB0aGVhZCA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKVswXTsKKwlpZiAodGhpcy5oZWFkQ2xhc3MubGVuZ3RoID4gMCkgeworCQl0aGVhZC5jbGFzc05hbWUgPSB0aGlzLmhlYWRDbGFzczsKKwl9CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKKwl0aGlzLnBhcnNlQ29sdW1ucyh0aGVhZCk7CisJdmFyIGhlYWRlciA9ICJ0ZCI7CisJaWYgKHRoZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKGhlYWRlcikubGVuZ3RoID09IDApIHsKKwkJaGVhZGVyID0gInRoIjsKKwl9CisJdmFyIGhlYWRlcnMgPSB0aGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZShoZWFkZXIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgeworCQlpZiAoIXRoaXMuY29sdW1uc1tpXS5ub1NvcnQpIHsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChoZWFkZXJzW2ldLCAib25jbGljayIsIHRoaXMsICJvbkhlYWRlckNsaWNrIik7CisJCX0KKwkJaWYgKHRoaXMuc29ydEluZGV4ID09IGkpIHsKKwkJCWlmICh0aGlzLnNvcnREaXJlY3Rpb24gPT0gMCkgeworCQkJCWhlYWRlcnNbaV0uY2xhc3NOYW1lID0gdGhpcy5oZWFkZXJTb3J0RG93bkNsYXNzOworCQkJfSBlbHNlIHsKKwkJCQloZWFkZXJzW2ldLmNsYXNzTmFtZSA9IHRoaXMuaGVhZGVyU29ydFVwQ2xhc3M7CisJCQl9CisJCX0KKwl9CisJdmFyIHRib2R5ID0gdGhpcy5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdOworCWlmICh0aGlzLnRib2R5Q2xhc3MubGVuZ3RoID4gMCkgeworCQl0Ym9keS5jbGFzc05hbWUgPSB0aGlzLnRib2R5Q2xhc3M7CisJfQorCXRoaXMucGFyc2VEYXRhRnJvbVRhYmxlKHRib2R5KTsKKwl0aGlzLnJlbmRlcih0cnVlKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TcGlubmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TcGlubmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2NlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NwaW5uZXIuanMKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNwaW5uZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkludGVnZXJUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlJlYWxOdW1iZXJUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkRhdGVUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LlNwaW5uZXIiLCBudWxsLCB7X3R5cGFtYXRpY1RpbWVyOm51bGwsIF90eXBhbWF0aWNGdW5jdGlvbjpudWxsLCBfY3VycmVudFRpbWVvdXQ6dGhpcy5kZWZhdWx0VGltZW91dCwgX2V2ZW50Q291bnQ6MCwgZGVmYXVsdFRpbWVvdXQ6NTAwLCB0aW1lb3V0Q2hhbmdlUmF0ZTowLjksIHRlbXBsYXRlU3RyaW5nOiI8c3BhbiBfPVwid2VpcmQgZW5kIHRhZyBmb3JtYXR0aW5nIGlzIHRvIHByZXZlbnQgd2hpdGVzcGFjZSBmcm9tIGJlY29taW5nICZuYnNwO1wiXG5cdHN0eWxlPSdmbG9hdDoke3RoaXMuaHRtbGZsb2F0fTsnXG5cdD48dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPVwiZG9qb1NwaW5uZXJcIj5cblx0XHQ8dHI+XG5cdFx0XHQ8dGRcblx0XHRcdFx0PjxpbnB1dFxuXHRcdFx0XHRcdGRvam9BdHRhY2hQb2ludD0ndGV4dGJveCcgdHlwZT0nJHt0aGlzLnR5cGV9J1xuXHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD0nb25ibHVyO29uZm9jdXM7b25rZXk6X2hhbmRsZUtleUV2ZW50cztvbktleVVwOl9vblNwaW5uZXJLZXlVcDtvbnJlc2l6ZTpfcmVzaXplJ1xuXHRcdFx0XHRcdGlkPScke3RoaXMud2lkZ2V0SWR9JyBuYW1lPScke3RoaXMubmFtZX0nIHNpemU9JyR7dGhpcy5zaXplfScgbWF4bGVuZ3RoPScke3RoaXMubWF4bGVuZ3RofSdcblx0XHRcdFx0XHR2YWx1ZT0nJHt0aGlzLnZhbHVlfScgY2xhc3M9JyR7dGhpcy5jbGFzc05hbWV9JyBhdXRvY29tcGxldGU9XCJvZmZcIlxuXHRcdFx0PjwvdGQ+XG5cdFx0XHQ8dGRcblx0XHRcdFx0PjxpbWcgZG9qb0F0dGFjaFBvaW50PVwidXBBcnJvd05vZGVcIlxuXHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uRGJsQ2xpY2s6IF91cEFycm93RG91YmxlQ2xpY2tlZDsgIG9uTW91c2VEb3duOiBfdXBBcnJvd1ByZXNzZWQ7IG9uTW91c2VVcDogX2Fycm93UmVsZWFzZWQ7IG9uTW91c2VPdXQ6IF9hcnJvd1JlbGVhc2VkOyBvbk1vdXNlTW92ZTogX2Rpc2NhcmRFdmVudDtcIlxuXHRcdFx0XHRcdHNyYz1cIiR7dGhpcy5pbmNyZW1lbnRTcmN9XCIgc3R5bGU9XCJ3aWR0aDogJHt0aGlzLmJ1dHRvblNpemUud2lkdGh9cHg7IGhlaWdodDogJHt0aGlzLmJ1dHRvblNpemUuaGVpZ2h0fXB4O1wiXG5cdFx0XHRcdD48aW1nIGRvam9BdHRhY2hQb2ludD1cImRvd25BcnJvd05vZGVcIlxuXHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uRGJsQ2xpY2s6IF9kb3duQXJyb3dEb3VibGVDbGlja2VkOyAgb25Nb3VzZURvd246IF9kb3duQXJyb3dQcmVzc2VkOyBvbk1vdXNlVXA6IF9hcnJvd1JlbGVhc2VkOyBvbk1vdXNlT3V0OiBfYXJyb3dSZWxlYXNlZDsgb25Nb3VzZU1vdmU6IF9kaXNjYXJkRXZlbnQ7XCJcblx0XHRcdFx0XHRzcmM9XCIke3RoaXMuZGVjcmVtZW50U3JjfVwiIHN0eWxlPVwid2lkdGg6ICR7dGhpcy5idXR0b25TaXplLndpZHRofXB4OyBoZWlnaHQ6ICR7dGhpcy5idXR0b25TaXplLmhlaWdodH1weDtcIlxuXHRcdFx0PjwvdGQ+XG5cdFx0PC90cj5cblx0PC90YWJsZVxuXHQ+PHNwYW4gZG9qb0F0dGFjaFBvaW50PSdpbnZhbGlkU3BhbicgY2xhc3M9JyR7dGhpcy5pbnZhbGlkQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMuaW52YWxpZE1lc3NhZ2V9PC9zcGFuXG5cdD48c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J21pc3NpbmdTcGFuJyBjbGFzcz0nJHt0aGlzLm1pc3NpbmdDbGFzc30nPiR7dGhpcy5tZXNzYWdlcy5taXNzaW5nTWVzc2FnZX08L3NwYW5cblx0PjxzcGFuIGRvam9BdHRhY2hQb2ludD0ncmFuZ2VTcGFuJyBjbGFzcz0nJHt0aGlzLnJhbmdlQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMucmFuZ2VNZXNzYWdlfTwvc3BhblxuPjwvc3Bhbj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIvKiBpbmxpbmUgdGhlIHRhYmxlIGhvbGRpbmcgdGhlIDxpbnB1dD4gYW5kIGJ1dHRvbnMgKG1ldGhvZCB2YXJpZXMgYnkgYnJvd3NlcikgKi9cbi5pZSAuZG9qb1NwaW5uZXIsIC5zYWZhcmkgLmRvam9TcGlubmVyIHtcblx0ZGlzcGxheTogaW5saW5lO1xufVxuXG4ubW96IC5kb2pvU3Bpbm5lciB7XG5cdGRpc3BsYXk6IC1tb3otaW5saW5lLWJveDtcbn1cblxuLm9wZXJhIC5kb2pvU3Bpbm5lciB7XG5cdGRpc3BsYXk6IGlubGluZS10YWJsZTtcbn1cblxuLyogZ2VuZXJpYyBzdHVmZiBmb3IgdGhlIHRhYmxlICovXG4uZG9qb1NwaW5uZXIgdGQge1xuXHRwYWRkaW5nOjBweDtcblx0bWFyZ2luOjBweDtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbnRhYmxlLmRvam9TcGlubmVyIHtcblx0Ym9yZGVyOjBweDtcblx0Ym9yZGVyLXNwYWNpbmc6MHB4O1xuXHRsaW5lLWhlaWdodDowcHg7XG5cdHBhZGRpbmc6MHB4O1xuXHRtYXJnaW46IDBweDtcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLyogdGhlIGJ1dHRvbnMgKi9cbi5kb2pvU3Bpbm5lciBpbWcge1xuXHRkaXNwbGF5OiBibG9jaztcblx0Ym9yZGVyLXdpZHRoOjBweCAxcHggMXB4IDBweDtcblx0Ym9yZGVyLXN0eWxlOm91dHNldDtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9TcGlubmVyLmNzcyIpLCBpbmNyZW1lbnRTcmM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL3NwaW5uZXJJbmNyZW1lbnQuZ2lmIiksIGRlY3JlbWVudFNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvc3Bpbm5lckRlY3JlbWVudC5naWYiKSwgX2hhbmRsZUtleUV2ZW50czpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKCFldnQua2V5KSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFldnQuY3RybEtleSAmJiAhZXZ0LmFsdEtleSkgeworCQlzd2l0Y2ggKGV2dC5rZXkpIHsKKwkJICBjYXNlIGV2dC5LRVlfRE9XTl9BUlJPVzoKKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCXRoaXMuX2Rvd25BcnJvd1ByZXNzZWQoZXZ0KTsKKwkJCXJldHVybjsKKwkJICBjYXNlIGV2dC5LRVlfVVBfQVJST1c6CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQl0aGlzLl91cEFycm93UHJlc3NlZChldnQpOworCQkJcmV0dXJuOworCQl9CisJfQorCXRoaXMuX2V2ZW50Q291bnQrKzsKK30sIF9vblNwaW5uZXJLZXlVcDpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5fYXJyb3dSZWxlYXNlZChldnQpOworCXRoaXMub25rZXl1cChldnQpOworfSwgX3Jlc2l6ZTpmdW5jdGlvbiAoKSB7CisJdmFyIGlucHV0U2l6ZSA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3godGhpcy50ZXh0Ym94KTsKKwl0aGlzLmJ1dHRvblNpemUgPSB7d2lkdGg6aW5wdXRTaXplLmhlaWdodCAvIDIsIGhlaWdodDppbnB1dFNpemUuaGVpZ2h0IC8gMn07CisJaWYgKHRoaXMudXBBcnJvd05vZGUpIHsKKwkJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLnVwQXJyb3dOb2RlLCB0aGlzLmJ1dHRvblNpemUpOworCQlkb2pvLmh0bWwuc2V0TWFyZ2luQm94KHRoaXMuZG93bkFycm93Tm9kZSwgdGhpcy5idXR0b25TaXplKTsKKwl9Cit9LCBfcHJlc3NCdXR0b246ZnVuY3Rpb24gKG5vZGUpIHsKKwlub2RlLnN0eWxlLmJvcmRlcldpZHRoID0gIjFweCAwcHggMHB4IDFweCI7CisJbm9kZS5zdHlsZS5ib3JkZXJTdHlsZSA9ICJpbnNldCI7Cit9LCBfcmVsZWFzZUJ1dHRvbjpmdW5jdGlvbiAobm9kZSkgeworCW5vZGUuc3R5bGUuYm9yZGVyV2lkdGggPSAiMHB4IDFweCAxcHggMHB4IjsKKwlub2RlLnN0eWxlLmJvcmRlclN0eWxlID0gIm91dHNldCI7Cit9LCBfYXJyb3dQcmVzc2VkOmZ1bmN0aW9uIChldnQsIGRpcmVjdGlvbikgeworCXZhciBub2RlUHJlc3NlZCA9IChkaXJlY3Rpb24gPT0gLTEpID8gdGhpcy5kb3duQXJyb3dOb2RlIDogdGhpcy51cEFycm93Tm9kZTsKKwl2YXIgbm9kZVJlbGVhc2VkID0gKGRpcmVjdGlvbiA9PSArMSkgPyB0aGlzLmRvd25BcnJvd05vZGUgOiB0aGlzLnVwQXJyb3dOb2RlOworCWlmICh0eXBlb2YgZXZ0ICE9ICJudW1iZXIiKSB7CisJCWlmICh0aGlzLl90eXBhbWF0aWNUaW1lciAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5fdHlwYW1hdGljTm9kZSA9PSBub2RlUHJlc3NlZCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRvam8ubGFuZy5jbGVhclRpbWVvdXQodGhpcy5fdHlwYW1hdGljVGltZXIpOworCQl9CisJCXRoaXMuX3JlbGVhc2VCdXR0b24obm9kZVJlbGVhc2VkKTsKKwkJdGhpcy5fZXZlbnRDb3VudCsrOworCQl0aGlzLl90eXBhbWF0aWNUaW1lciA9IG51bGw7CisJCXRoaXMuX2N1cnJlbnRUaW1lb3V0ID0gdGhpcy5kZWZhdWx0VGltZW91dDsKKwl9IGVsc2UgeworCQlpZiAoZXZ0ICE9IHRoaXMuX2V2ZW50Q291bnQpIHsKKwkJCXRoaXMuX3JlbGVhc2VCdXR0b24obm9kZVByZXNzZWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCXRoaXMuX3ByZXNzQnV0dG9uKG5vZGVQcmVzc2VkKTsKKwl0aGlzLl9zZXRDdXJzb3JYKHRoaXMuYWRqdXN0VmFsdWUoZGlyZWN0aW9uLCB0aGlzLl9nZXRDdXJzb3JYKCkpKTsKKwl0aGlzLl90eXBhbWF0aWNOb2RlID0gbm9kZVByZXNzZWQ7CisJdGhpcy5fdHlwYW1hdGljVGltZXIgPSBkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCAiX2Fycm93UHJlc3NlZCIsIHRoaXMuX2N1cnJlbnRUaW1lb3V0LCB0aGlzLl9ldmVudENvdW50LCBkaXJlY3Rpb24pOworCXRoaXMuX2N1cnJlbnRUaW1lb3V0ID0gTWF0aC5yb3VuZCh0aGlzLl9jdXJyZW50VGltZW91dCAqIHRoaXMudGltZW91dENoYW5nZVJhdGUpOworfSwgX2Rvd25BcnJvd1ByZXNzZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXJldHVybiB0aGlzLl9hcnJvd1ByZXNzZWQoZXZ0LCAtMSk7Cit9LCBfZG93bkFycm93RG91YmxlQ2xpY2tlZDpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHJjID0gdGhpcy5fZG93bkFycm93UHJlc3NlZChldnQpOworCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsICJfYXJyb3dSZWxlYXNlZCIsIDUwLCBudWxsKTsKKwlyZXR1cm4gcmM7Cit9LCBfdXBBcnJvd1ByZXNzZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXJldHVybiB0aGlzLl9hcnJvd1ByZXNzZWQoZXZ0LCArMSk7Cit9LCBfdXBBcnJvd0RvdWJsZUNsaWNrZWQ6ZnVuY3Rpb24gKGV2dCkgeworCXZhciByYyA9IHRoaXMuX3VwQXJyb3dQcmVzc2VkKGV2dCk7CisJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIl9hcnJvd1JlbGVhc2VkIiwgNTAsIG51bGwpOworCXJldHVybiByYzsKK30sIF9hcnJvd1JlbGVhc2VkOmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLnRleHRib3guZm9jdXMoKTsKKwlpZiAoZXZ0ICE9IG51bGwgJiYgdHlwZW9mIGV2dCA9PSAib2JqZWN0IiAmJiBldnQua2V5Q29kZSAmJiBldnQua2V5Q29kZSAhPSBudWxsKSB7CisJCXZhciBrZXlDb2RlID0gZXZ0LmtleUNvZGU7CisJCXZhciBrID0gZG9qby5ldmVudC5icm93c2VyLmtleXM7CisJCXN3aXRjaCAoa2V5Q29kZSkgeworCQkgIGNhc2Ugay5LRVlfRE9XTl9BUlJPVzoKKwkJICBjYXNlIGsuS0VZX1VQX0FSUk9XOgorCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJdGhpcy5fcmVsZWFzZUJ1dHRvbih0aGlzLnVwQXJyb3dOb2RlKTsKKwl0aGlzLl9yZWxlYXNlQnV0dG9uKHRoaXMuZG93bkFycm93Tm9kZSk7CisJdGhpcy5fZXZlbnRDb3VudCsrOworCWlmICh0aGlzLl90eXBhbWF0aWNUaW1lciAhPSBudWxsKSB7CisJCWRvam8ubGFuZy5jbGVhclRpbWVvdXQodGhpcy5fdHlwYW1hdGljVGltZXIpOworCX0KKwl0aGlzLl90eXBhbWF0aWNUaW1lciA9IG51bGw7CisJdGhpcy5fY3VycmVudFRpbWVvdXQgPSB0aGlzLmRlZmF1bHRUaW1lb3V0OworfSwgX21vdXNlV2hlZWxlZDpmdW5jdGlvbiAoZXZ0KSB7CisJdmFyIHNjcm9sbEFtb3VudCA9IDA7CisJaWYgKHR5cGVvZiBldnQud2hlZWxEZWx0YSA9PSAibnVtYmVyIikgeworCQlzY3JvbGxBbW91bnQgPSBldnQud2hlZWxEZWx0YTsKKwl9IGVsc2UgeworCQlpZiAodHlwZW9mIGV2dC5kZXRhaWwgPT0gIm51bWJlciIpIHsKKwkJCXNjcm9sbEFtb3VudCA9IC1ldnQuZGV0YWlsOworCQl9CisJfQorCWlmIChzY3JvbGxBbW91bnQgPiAwKSB7CisJCXRoaXMuX3VwQXJyb3dQcmVzc2VkKGV2dCk7CisJCXRoaXMuX2Fycm93UmVsZWFzZWQoZXZ0KTsKKwl9IGVsc2UgeworCQlpZiAoc2Nyb2xsQW1vdW50IDwgMCkgeworCQkJdGhpcy5fZG93bkFycm93UHJlc3NlZChldnQpOworCQkJdGhpcy5fYXJyb3dSZWxlYXNlZChldnQpOworCQl9CisJfQorfSwgX2Rpc2NhcmRFdmVudDpmdW5jdGlvbiAoZXZ0KSB7CisJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworfSwgX2dldEN1cnNvclg6ZnVuY3Rpb24gKCkgeworCXZhciB4ID0gLTE7CisJdHJ5IHsKKwkJdGhpcy50ZXh0Ym94LmZvY3VzKCk7CisJCWlmICh0eXBlb2YgdGhpcy50ZXh0Ym94LnNlbGVjdGlvbkVuZCA9PSAibnVtYmVyIikgeworCQkJeCA9IHRoaXMudGV4dGJveC5zZWxlY3Rpb25FbmQ7CisJCX0gZWxzZSB7CisJCQlpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSkgeworCQkJCXZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpOworCQkJCWlmIChyYW5nZS5wYXJlbnRFbGVtZW50KCkgPT0gdGhpcy50ZXh0Ym94KSB7CisJCQkJCXJhbmdlLm1vdmVTdGFydCgidGV4dGVkaXQiLCAtMSk7CisJCQkJCXggPSByYW5nZS50ZXh0Lmxlbmd0aDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJY2F0Y2ggKGUpIHsKKwl9CisJcmV0dXJuIHg7Cit9LCBfc2V0Q3Vyc29yWDpmdW5jdGlvbiAoeCkgeworCXRyeSB7CisJCXRoaXMudGV4dGJveC5mb2N1cygpOworCQlpZiAoIXgpIHsKKwkJCXggPSAwOworCQl9CisJCWlmICh0eXBlb2YgdGhpcy50ZXh0Ym94LnNlbGVjdGlvbkVuZCA9PSAibnVtYmVyIikgeworCQkJdGhpcy50ZXh0Ym94LnNlbGVjdGlvbkVuZCA9IHg7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy50ZXh0Ym94LmNyZWF0ZVRleHRSYW5nZSkgeworCQkJCXZhciByYW5nZSA9IHRoaXMudGV4dGJveC5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJCQlyYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJCQlyYW5nZS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLCB4KTsKKwkJCQlyYW5nZS5tb3ZlU3RhcnQoImNoYXJhY3RlciIsIHgpOworCQkJCXJhbmdlLnNlbGVjdCgpOworCQkJfQorCQl9CisJfQorCWNhdGNoIChlKSB7CisJfQorfSwgX3NwaW5uZXJQb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdmFyIGlucHV0Tm9kZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJdmFyIGlucHV0U2l6ZSA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3goaW5wdXROb2RlKTsKKwl0aGlzLmJ1dHRvblNpemUgPSB7d2lkdGg6aW5wdXRTaXplLmhlaWdodCAvIDIgLSAxLCBoZWlnaHQ6aW5wdXRTaXplLmhlaWdodCAvIDIgLSAxfTsKK30sIF9zcGlubmVyUG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcikgeworCQl0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIl9tb3VzZVdoZWVsZWQiKSwgZmFsc2UpOworCX0gZWxzZSB7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnRleHRib3gsICJvbm1vdXNld2hlZWwiLCB0aGlzLCAiX21vdXNlV2hlZWxlZCIpOworCX0KK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuSW50ZWdlclNwaW5uZXIiLCBbZG9qby53aWRnZXQuSW50ZWdlclRleHRib3gsIGRvam8ud2lkZ2V0LlNwaW5uZXJdLCB7ZGVsdGE6IjEiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuSW50ZWdlclNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RNaXhJblByb3BlcnRpZXMoYXJncywgZnJhZyk7Cit9LCBwb3N0Q3JlYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuSW50ZWdlclNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RDcmVhdGUoYXJncywgZnJhZyk7Cit9LCBhZGp1c3RWYWx1ZTpmdW5jdGlvbiAoZGlyZWN0aW9uLCB4KSB7CisJdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKS5yZXBsYWNlKC9bXlwtK1xkXS9nLCAiIik7CisJaWYgKHZhbC5sZW5ndGggPT0gMCkgeworCQlyZXR1cm47CisJfQorCXZhciBudW0gPSBNYXRoLm1pbihNYXRoLm1heCgocGFyc2VJbnQodmFsKSArIChwYXJzZUludCh0aGlzLmRlbHRhKSAqIGRpcmVjdGlvbikpLCAodGhpcy5mbGFncy5taW4gPyB0aGlzLmZsYWdzLm1pbiA6IC1JbmZpbml0eSkpLCAodGhpcy5mbGFncy5tYXggPyB0aGlzLmZsYWdzLm1heCA6ICtJbmZpbml0eSkpOworCXZhbCA9IG51bS50b1N0cmluZygpOworCWlmIChudW0gPj0gMCkgeworCQl2YWwgPSAoKHRoaXMuZmxhZ3Muc2lnbmVkID09IHRydWUpID8gIisiIDogIiAiKSArIHZhbDsKKwl9CisJaWYgKHRoaXMuZmxhZ3Muc2VwYXJhdG9yLmxlbmd0aCA+IDApIHsKKwkJZm9yICh2YXIgaSA9IHZhbC5sZW5ndGggLSAzOyBpID4gMTsgaSAtPSAzKSB7CisJCQl2YWwgPSB2YWwuc3Vic3RyKDAsIGkpICsgdGhpcy5mbGFncy5zZXBhcmF0b3IgKyB2YWwuc3Vic3RyKGkpOworCQl9CisJfQorCWlmICh2YWwuc3Vic3RyKDAsIDEpID09ICIgIikgeworCQl2YWwgPSB2YWwuc3Vic3RyKDEpOworCX0KKwl0aGlzLnNldFZhbHVlKHZhbCk7CisJcmV0dXJuIHZhbC5sZW5ndGg7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJlYWxOdW1iZXJTcGlubmVyIiwgW2Rvam8ud2lkZ2V0LlJlYWxOdW1iZXJUZXh0Ym94LCBkb2pvLndpZGdldC5TcGlubmVyXSwgZnVuY3Rpb24gKCkgeworCWRvam8uZXhwZXJpbWVudGFsKCJkb2pvLndpZGdldC5SZWFsTnVtYmVyU3Bpbm5lciIpOworfSwge2RlbHRhOiIxZTEiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuUmVhbE51bWJlclNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RNaXhJblByb3BlcnRpZXMoYXJncywgZnJhZyk7Cit9LCBwb3N0Q3JlYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuUmVhbE51bWJlclNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RDcmVhdGUoYXJncywgZnJhZyk7Cit9LCBhZGp1c3RWYWx1ZTpmdW5jdGlvbiAoZGlyZWN0aW9uLCB4KSB7CisJdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKS5yZXBsYWNlKC9bXlwtK1wuZUVcZF0vZywgIiIpOworCWlmICghdmFsLmxlbmd0aCkgeworCQlyZXR1cm47CisJfQorCXZhciBudW0gPSBwYXJzZUZsb2F0KHZhbCk7CisJaWYgKGlzTmFOKG51bSkpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgZGVsdGEgPSB0aGlzLmRlbHRhLnNwbGl0KC9bZUVdLyk7CisJaWYgKCFkZWx0YS5sZW5ndGgpIHsKKwkJZGVsdGEgPSBbMSwgMV07CisJfSBlbHNlIHsKKwkJZGVsdGFbMF0gPSBwYXJzZUZsb2F0KGRlbHRhWzBdLnJlcGxhY2UoL1teXC0rXC5cZF0vZywgIiIpKTsKKwkJaWYgKGlzTmFOKGRlbHRhWzBdKSkgeworCQkJZGVsdGFbMF0gPSAxOworCQl9CisJCWlmIChkZWx0YS5sZW5ndGggPiAxKSB7CisJCQlkZWx0YVsxXSA9IHBhcnNlSW50KGRlbHRhWzFdKTsKKwkJfQorCQlpZiAoaXNOYU4oZGVsdGFbMV0pKSB7CisJCQlkZWx0YVsxXSA9IDE7CisJCX0KKwl9CisJdmFsID0gdGhpcy5nZXRWYWx1ZSgpLnNwbGl0KC9bZUVdLyk7CisJaWYgKCF2YWwubGVuZ3RoKSB7CisJCXJldHVybjsKKwl9CisJdmFyIG51bUJhc2UgPSBwYXJzZUZsb2F0KHZhbFswXS5yZXBsYWNlKC9bXlwtK1wuXGRdL2csICIiKSk7CisJaWYgKHZhbC5sZW5ndGggPT0gMSkgeworCQl2YXIgbnVtRXhwID0gMDsKKwl9IGVsc2UgeworCQl2YXIgbnVtRXhwID0gcGFyc2VJbnQodmFsWzFdLnJlcGxhY2UoL1teXC0rXGRdL2csICIiKSk7CisJfQorCWlmICh4IDw9IHZhbFswXS5sZW5ndGgpIHsKKwkJeCA9IDA7CisJCW51bUJhc2UgKz0gZGVsdGFbMF0gKiBkaXJlY3Rpb247CisJfSBlbHNlIHsKKwkJeCA9IE51bWJlci5NQVhfVkFMVUU7CisJCW51bUV4cCArPSBkZWx0YVsxXSAqIGRpcmVjdGlvbjsKKwkJaWYgKHRoaXMuZmxhZ3MuZVNpZ25lZCA9PSBmYWxzZSAmJiBudW1FeHAgPCAwKSB7CisJCQludW1FeHAgPSAwOworCQl9CisJfQorCW51bSA9IE1hdGgubWluKE1hdGgubWF4KChudW1CYXNlICogTWF0aC5wb3coMTAsIG51bUV4cCkpLCAodGhpcy5mbGFncy5taW4gPyB0aGlzLmZsYWdzLm1pbiA6IC1JbmZpbml0eSkpLCAodGhpcy5mbGFncy5tYXggPyB0aGlzLmZsYWdzLm1heCA6ICtJbmZpbml0eSkpOworCWlmICgodGhpcy5mbGFncy5leHBvbmVudCA9PSB0cnVlIHx8ICh0aGlzLmZsYWdzLmV4cG9uZW50ICE9IGZhbHNlICYmIHggIT0gMCkpICYmIG51bS50b0V4cG9uZW50aWFsKSB7CisJCWlmIChpc05hTih0aGlzLmZsYWdzLnBsYWNlcykgfHwgdGhpcy5mbGFncy5wbGFjZXMgPT0gSW5maW5pdHkpIHsKKwkJCXZhbCA9IG51bS50b0V4cG9uZW50aWFsKCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBudW0udG9FeHBvbmVudGlhbCh0aGlzLmZsYWdzLnBsYWNlcyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobnVtLnRvRml4ZWQgJiYgbnVtLnRvUHJlY2lzaW9uKSB7CisJCQlpZiAoaXNOYU4odGhpcy5mbGFncy5wbGFjZXMpIHx8IHRoaXMuZmxhZ3MucGxhY2VzID09IEluZmluaXR5KSB7CisJCQkJdmFsID0gbnVtLnRvUHJlY2lzaW9uKCgxIC8gMykudG9TdHJpbmcoKS5sZW5ndGggLSAxKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsID0gbnVtLnRvRml4ZWQodGhpcy5mbGFncy5wbGFjZXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFsID0gbnVtLnRvU3RyaW5nKCk7CisJCX0KKwl9CisJaWYgKG51bSA+PSAwKSB7CisJCWlmICh0aGlzLmZsYWdzLnNpZ25lZCA9PSB0cnVlKSB7CisJCQl2YWwgPSAiKyIgKyB2YWw7CisJCX0KKwl9CisJdmFsID0gdmFsLnNwbGl0KC9bZUVdLyk7CisJaWYgKHRoaXMuZmxhZ3Muc2VwYXJhdG9yLmxlbmd0aCA+IDApIHsKKwkJaWYgKG51bSA+PSAwICYmIHZhbFswXS5zdWJzdHIoMCwgMSkgIT0gIisiKSB7CisJCQl2YWxbMF0gPSAiICIgKyB2YWxbMF07CisJCX0KKwkJdmFyIGkgPSB2YWxbMF0ubGFzdEluZGV4T2YoIi4iKTsKKwkJaWYgKGkgPj0gMCkgeworCQkJaSAtPSAzOworCQl9IGVsc2UgeworCQkJaSA9IHZhbFswXS5sZW5ndGggLSAzOworCQl9CisJCWZvciAoOyBpID4gMTsgaSAtPSAzKSB7CisJCQl2YWxbMF0gPSB2YWxbMF0uc3Vic3RyKDAsIGkpICsgdGhpcy5mbGFncy5zZXBhcmF0b3IgKyB2YWxbMF0uc3Vic3RyKGkpOworCQl9CisJCWlmICh2YWxbMF0uc3Vic3RyKDAsIDEpID09ICIgIikgeworCQkJdmFsWzBdID0gdmFsWzBdLnN1YnN0cigxKTsKKwkJfQorCX0KKwlpZiAodmFsLmxlbmd0aCA+IDEpIHsKKwkJaWYgKCh0aGlzLmZsYWdzLmVTaWduZWQgPT0gdHJ1ZSkgJiYgKHZhbFsxXS5zdWJzdHIoMCwgMSkgIT0gIisiKSkgeworCQkJdmFsWzFdID0gIisiICsgdmFsWzFdOworCQl9IGVsc2UgeworCQkJaWYgKCghdGhpcy5mbGFncy5lU2lnbmVkKSAmJiAodmFsWzFdLnN1YnN0cigwLCAxKSA9PSAiKyIpKSB7CisJCQkJdmFsWzFdID0gdmFsWzFdLnN1YnN0cigxKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCghdGhpcy5mbGFncy5lU2lnbmVkKSAmJiAodmFsWzFdLnN1YnN0cigwLCAxKSA9PSAiLSIpICYmIChudW0udG9GaXhlZCAmJiBudW0udG9QcmVjaXNpb24pKSB7CisJCQkJCWlmIChpc05hTih0aGlzLmZsYWdzLnBsYWNlcykpIHsKKwkJCQkJCXZhbFswXSA9IG51bS50b1ByZWNpc2lvbigoMSAvIDMpLnRvU3RyaW5nKCkubGVuZ3RoIC0gMSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YWxbMF0gPSBudW0udG9GaXhlZCh0aGlzLmZsYWdzLnBsYWNlcykudG9TdHJpbmcoKTsKKwkJCQkJfQorCQkJCQl2YWxbMV0gPSAiMCI7CisJCQkJfQorCQkJfQorCQl9CisJCXZhbFswXSArPSAiZSIgKyB2YWxbMV07CisJfQorCXRoaXMuc2V0VmFsdWUodmFsWzBdKTsKKwlpZiAoeCA+IHZhbFswXS5sZW5ndGgpIHsKKwkJeCA9IHZhbFswXS5sZW5ndGg7CisJfQorCXJldHVybiB4OworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UaW1lU3Bpbm5lciIsIFtkb2pvLndpZGdldC5UaW1lVGV4dGJveCwgZG9qby53aWRnZXQuU3Bpbm5lcl0sIGZ1bmN0aW9uICgpIHsKKwlkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby53aWRnZXQuVGltZVNwaW5uZXIiKTsKK30sIHtwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVGltZVNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RNaXhJblByb3BlcnRpZXMoYXJncywgZnJhZyk7Cit9LCBwb3N0Q3JlYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVGltZVNwaW5uZXIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5fc3Bpbm5lclBvc3RDcmVhdGUoYXJncywgZnJhZyk7Cit9LCBhZGp1c3RWYWx1ZTpmdW5jdGlvbiAoZGlyZWN0aW9uLCB4KSB7CisJdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWUoKTsKKwl2YXIgZm9ybWF0ID0gKHRoaXMuZmxhZ3MuZm9ybWF0ICYmIHRoaXMuZmxhZ3MuZm9ybWF0LnNlYXJjaCgvW0hobXN0XS8pID49IDApID8gdGhpcy5mbGFncy5mb3JtYXQgOiAiaGg6bW06c3MgdCI7CisJaWYgKGRpcmVjdGlvbiA9PSAwIHx8ICF2YWwubGVuZ3RoIHx8ICF0aGlzLmlzVmFsaWQoKSkgeworCQlyZXR1cm47CisJfQorCWlmICghdGhpcy5mbGFncy5hbVN5bWJvbCkgeworCQl0aGlzLmZsYWdzLmFtU3ltYm9sID0gIkFNIjsKKwl9CisJaWYgKCF0aGlzLmZsYWdzLnBtU3ltYm9sKSB7CisJCXRoaXMuZmxhZ3MucG1TeW1ib2wgPSAiUE0iOworCX0KKwl2YXIgcmUgPSBkb2pvLnJlZ2V4cC50aW1lKHRoaXMuZmxhZ3MpOworCXZhciBxdWFsaWZpZXJzID0gZm9ybWF0LnJlcGxhY2UoL0gvZywgImgiKS5yZXBsYWNlKC9bXmhtc3RdL2csICIiKS5yZXBsYWNlKC8oW2htc3RdKVwxL2csICIkMSIpOworCXZhciBob3VyUG9zID0gcXVhbGlmaWVycy5pbmRleE9mKCJoIikgKyAxOworCXZhciBtaW5Qb3MgPSBxdWFsaWZpZXJzLmluZGV4T2YoIm0iKSArIDE7CisJdmFyIHNlY1BvcyA9IHF1YWxpZmllcnMuaW5kZXhPZigicyIpICsgMTsKKwl2YXIgYW1wbVBvcyA9IHF1YWxpZmllcnMuaW5kZXhPZigidCIpICsgMTsKKwl2YXIgY3Vyc29yRm9ybWF0ID0gZm9ybWF0OworCXZhciBhbXBtID0gIiI7CisJaWYgKGFtcG1Qb3MgPiAwKSB7CisJCWFtcG0gPSB2YWwucmVwbGFjZShuZXcgUmVnRXhwKHJlKSwgIiQiICsgYW1wbVBvcyk7CisJCWN1cnNvckZvcm1hdCA9IGN1cnNvckZvcm1hdC5yZXBsYWNlKC90Ky8sIGFtcG0ucmVwbGFjZSgvLi9nLCAidCIpKTsKKwl9CisJdmFyIGhvdXIgPSAwOworCXZhciBkZWx0YUhvdXIgPSAxOworCWlmIChob3VyUG9zID4gMCkgeworCQlob3VyID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cChyZSksICIkIiArIGhvdXJQb3MpOworCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKHRoaXMuZGVsdGEpKSB7CisJCQlkZWx0YUhvdXIgPSB0aGlzLmRlbHRhLnJlcGxhY2UobmV3IFJlZ0V4cChyZSksICIkIiArIGhvdXJQb3MpOworCQl9CisJCWlmIChpc05hTihkZWx0YUhvdXIpKSB7CisJCQlkZWx0YUhvdXIgPSAxOworCQl9IGVsc2UgeworCQkJZGVsdGFIb3VyID0gcGFyc2VJbnQoZGVsdGFIb3VyKTsKKwkJfQorCQlpZiAoaG91ci5sZW5ndGggPT0gMikgeworCQkJY3Vyc29yRm9ybWF0ID0gY3Vyc29yRm9ybWF0LnJlcGxhY2UoLyhbSGhdKSsvLCAiJDEkMSIpOworCQl9IGVsc2UgeworCQkJY3Vyc29yRm9ybWF0ID0gY3Vyc29yRm9ybWF0LnJlcGxhY2UoLyhbSGhdKSsvLCAiJDEiKTsKKwkJfQorCQlpZiAoaXNOYU4oaG91cikpIHsKKwkJCWhvdXIgPSAwOworCQl9IGVsc2UgeworCQkJaG91ciA9IHBhcnNlSW50KGhvdXIucmVwbGFjZSgvXjAoXGQpLywgIiQxIikpOworCQl9CisJfQorCXZhciBtaW4gPSAwOworCXZhciBkZWx0YU1pbiA9IDE7CisJaWYgKG1pblBvcyA+IDApIHsKKwkJbWluID0gdmFsLnJlcGxhY2UobmV3IFJlZ0V4cChyZSksICIkIiArIG1pblBvcyk7CisJCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcodGhpcy5kZWx0YSkpIHsKKwkJCWRlbHRhTWluID0gdGhpcy5kZWx0YS5yZXBsYWNlKG5ldyBSZWdFeHAocmUpLCAiJCIgKyBtaW5Qb3MpOworCQl9CisJCWlmIChpc05hTihkZWx0YU1pbikpIHsKKwkJCWRlbHRhTWluID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRlbHRhTWluID0gcGFyc2VJbnQoZGVsdGFNaW4pOworCQl9CisJCWN1cnNvckZvcm1hdCA9IGN1cnNvckZvcm1hdC5yZXBsYWNlKC9tKy8sIG1pbi5yZXBsYWNlKC8uL2csICJtIikpOworCQlpZiAoaXNOYU4obWluKSkgeworCQkJbWluID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1pbiA9IHBhcnNlSW50KG1pbi5yZXBsYWNlKC9eMChcZCkvLCAiJDEiKSk7CisJCX0KKwl9CisJdmFyIHNlYyA9IDA7CisJdmFyIGRlbHRhU2VjID0gMTsKKwlpZiAoc2VjUG9zID4gMCkgeworCQlzZWMgPSB2YWwucmVwbGFjZShuZXcgUmVnRXhwKHJlKSwgIiQiICsgc2VjUG9zKTsKKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyh0aGlzLmRlbHRhKSkgeworCQkJZGVsdGFTZWMgPSB0aGlzLmRlbHRhLnJlcGxhY2UobmV3IFJlZ0V4cChyZSksICIkIiArIHNlY1Bvcyk7CisJCX0KKwkJaWYgKGlzTmFOKGRlbHRhU2VjKSkgeworCQkJZGVsdGFTZWMgPSAxOworCQl9IGVsc2UgeworCQkJZGVsdGFTZWMgPSBwYXJzZUludChkZWx0YVNlYyk7CisJCX0KKwkJY3Vyc29yRm9ybWF0ID0gY3Vyc29yRm9ybWF0LnJlcGxhY2UoL3MrLywgc2VjLnJlcGxhY2UoLy4vZywgInMiKSk7CisJCWlmIChpc05hTihzZWMpKSB7CisJCQlzZWMgPSAwOworCQl9IGVsc2UgeworCQkJc2VjID0gcGFyc2VJbnQoc2VjLnJlcGxhY2UoL14wKFxkKS8sICIkMSIpKTsKKwkJfQorCX0KKwlpZiAoaXNOYU4oeCkgfHwgeCA+PSBjdXJzb3JGb3JtYXQubGVuZ3RoKSB7CisJCXggPSBjdXJzb3JGb3JtYXQubGVuZ3RoIC0gMTsKKwl9CisJdmFyIGN1cnNvclRva2VuID0gY3Vyc29yRm9ybWF0LmNoYXJBdCh4KTsKKwlzd2l0Y2ggKGN1cnNvclRva2VuKSB7CisJICBjYXNlICJ0IjoKKwkJaWYgKGFtcG0gPT0gdGhpcy5mbGFncy5hbVN5bWJvbCkgeworCQkJYW1wbSA9IHRoaXMuZmxhZ3MucG1TeW1ib2w7CisJCX0gZWxzZSB7CisJCQlpZiAoYW1wbSA9PSB0aGlzLmZsYWdzLnBtU3ltYm9sKSB7CisJCQkJYW1wbSA9IHRoaXMuZmxhZ3MuYW1TeW1ib2w7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlpZiAoaG91ciA+PSAxICYmIGhvdXIgPCAxMiAmJiBhbXBtID09IHRoaXMuZmxhZ3MucG1TeW1ib2wpIHsKKwkJCWhvdXIgKz0gMTI7CisJCX0KKwkJaWYgKGhvdXIgPT0gMTIgJiYgYW1wbSA9PSB0aGlzLmZsYWdzLmFtU3ltYm9sKSB7CisJCQlob3VyID0gMDsKKwkJfQorCQlzd2l0Y2ggKGN1cnNvclRva2VuKSB7CisJCSAgY2FzZSAicyI6CisJCQlzZWMgKz0gZGVsdGFTZWMgKiBkaXJlY3Rpb247CisJCQl3aGlsZSAoc2VjIDwgMCkgeworCQkJCW1pbi0tOworCQkJCXNlYyArPSA2MDsKKwkJCX0KKwkJCXdoaWxlIChzZWMgPj0gNjApIHsKKwkJCQltaW4rKzsKKwkJCQlzZWMgLT0gNjA7CisJCQl9CisJCSAgY2FzZSAibSI6CisJCQlpZiAoY3Vyc29yVG9rZW4gPT0gIm0iKSB7CisJCQkJbWluICs9IGRlbHRhTWluICogZGlyZWN0aW9uOworCQkJfQorCQkJd2hpbGUgKG1pbiA8IDApIHsKKwkJCQlob3VyLS07CisJCQkJbWluICs9IDYwOworCQkJfQorCQkJd2hpbGUgKG1pbiA+PSA2MCkgeworCQkJCWhvdXIrKzsKKwkJCQltaW4gLT0gNjA7CisJCQl9CisJCSAgY2FzZSAiaCI6CisJCSAgY2FzZSAiSCI6CisJCQlpZiAoY3Vyc29yVG9rZW4gPT0gImgiIHx8IGN1cnNvclRva2VuID09ICJIIikgeworCQkJCWhvdXIgKz0gZGVsdGFIb3VyICogZGlyZWN0aW9uOworCQkJfQorCQkJd2hpbGUgKGhvdXIgPCAwKSB7CisJCQkJaG91ciArPSAyNDsKKwkJCX0KKwkJCXdoaWxlIChob3VyID49IDI0KSB7CisJCQkJaG91ciAtPSAyNDsKKwkJCX0KKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGhvdXIgPj0gMTIpIHsKKwkJCWFtcG0gPSB0aGlzLmZsYWdzLnBtU3ltYm9sOworCQkJaWYgKGZvcm1hdC5pbmRleE9mKCJoIikgPj0gMCAmJiBob3VyID49IDEzKSB7CisJCQkJaG91ciAtPSAxMjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFtcG0gPSB0aGlzLmZsYWdzLmFtU3ltYm9sOworCQkJaWYgKGZvcm1hdC5pbmRleE9mKCJoIikgPj0gMCAmJiBob3VyID09IDApIHsKKwkJCQlob3VyID0gMTI7CisJCQl9CisJCX0KKwl9CisJY3Vyc29yRm9ybWF0ID0gZm9ybWF0OworCWlmIChob3VyID49IDAgJiYgaG91ciA8IDEwICYmIGZvcm1hdC5zZWFyY2goL1toSF17Mn0vKSA+PSAwKSB7CisJCWhvdXIgPSAiMCIgKyBob3VyLnRvU3RyaW5nKCk7CisJfQorCWlmIChob3VyID49IDEwICYmIGN1cnNvckZvcm1hdC5zZWFyY2goL1toSF17Mn0vKSA8IDApIHsKKwkJY3Vyc29yRm9ybWF0ID0gY3Vyc29yRm9ybWF0LnJlcGxhY2UoLyhofEgpLywgIiQxJDEiKTsKKwl9CisJaWYgKG1pbiA+PSAwICYmIG1pbiA8IDEwICYmIGN1cnNvckZvcm1hdC5zZWFyY2goL21tLykgPj0gMCkgeworCQltaW4gPSAiMCIgKyBtaW4udG9TdHJpbmcoKTsKKwl9CisJaWYgKG1pbiA+PSAxMCAmJiBjdXJzb3JGb3JtYXQuc2VhcmNoKC9tbS8pIDwgMCkgeworCQljdXJzb3JGb3JtYXQgPSBjdXJzb3JGb3JtYXQucmVwbGFjZSgvbS8sICIkMSQxIik7CisJfQorCWlmIChzZWMgPj0gMCAmJiBzZWMgPCAxMCAmJiBjdXJzb3JGb3JtYXQuc2VhcmNoKC9zcy8pID49IDApIHsKKwkJc2VjID0gIjAiICsgc2VjLnRvU3RyaW5nKCk7CisJfQorCWlmIChzZWMgPj0gMTAgJiYgY3Vyc29yRm9ybWF0LnNlYXJjaCgvc3MvKSA8IDApIHsKKwkJY3Vyc29yRm9ybWF0ID0gY3Vyc29yRm9ybWF0LnJlcGxhY2UoL3MvLCAiJDEkMSIpOworCX0KKwl4ID0gY3Vyc29yRm9ybWF0LmluZGV4T2YoY3Vyc29yVG9rZW4pOworCWlmICh4ID09IC0xKSB7CisJCXggPSBmb3JtYXQubGVuZ3RoOworCX0KKwlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvW2hIXSsvLCBob3VyKTsKKwlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvbSsvLCBtaW4pOworCWZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9zKy8sIHNlYyk7CisJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL3QvLCBhbXBtKTsKKwl0aGlzLnNldFZhbHVlKGZvcm1hdCk7CisJaWYgKHggPiBmb3JtYXQubGVuZ3RoKSB7CisJCXggPSBmb3JtYXQubGVuZ3RoOworCX0KKwlyZXR1cm4geDsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9TcGxpdENvbnRhaW5lci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU3BsaXRDb250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU3BsaXRDb250YWluZXIuanMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNwbGl0Q29udGFpbmVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29udGVudFBhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uY29va2llIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlNwbGl0Q29udGFpbmVyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMuc2l6ZXJzID0gW107Cit9LCB7aXNDb250YWluZXI6dHJ1ZSwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvU3BsaXRDb250YWluZXJ7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0ZGlzcGxheTogYmxvY2s7XG59XG5cbi5kb2pvU3BsaXRQYW5le1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kb2pvU3BsaXRDb250YWluZXJTaXplckgsXG4uZG9qb1NwbGl0Q29udGFpbmVyU2l6ZXJWIHtcblx0Zm9udC1zaXplOiAxcHg7XG5cdGN1cnNvcjogbW92ZTtcblx0Y3Vyc29yOiB3LXJlc2l6ZTtcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcblx0Ym9yZGVyOiAxcHggc29saWQ7XG5cdGJvcmRlci1jb2xvcjogVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdyBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0O1xuXHRtYXJnaW46IDA7XG59XG5cbi5kb2pvU3BsaXRDb250YWluZXJTaXplclYge1xuXHRjdXJzb3I6IG4tcmVzaXplO1xufVxuXG4uZG9qb1NwbGl0Q29udGFpbmVyVmlydHVhbFNpemVySCxcbi5kb2pvU3BsaXRDb250YWluZXJWaXJ0dWFsU2l6ZXJWIHtcblx0Zm9udC1zaXplOiAxcHg7XG5cdGN1cnNvcjogbW92ZTtcblx0Y3Vyc29yOiB3LXJlc2l6ZTtcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVEU2hhZG93O1xuXHQtbW96LW9wYWNpdHk6IDAuNTtcblx0b3BhY2l0eTogMC41O1xuXHRmaWx0ZXI6IEFscGhhKE9wYWNpdHk9NTApO1xuXHRtYXJnaW46IDA7XG59XG5cbi5kb2pvU3BsaXRDb250YWluZXJWaXJ0dWFsU2l6ZXJWIHtcblx0Y3Vyc29yOiBuLXJlc2l6ZTtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9TcGxpdENvbnRhaW5lci5jc3MiKSwgYWN0aXZlU2l6aW5nOmZhbHNlLCBzaXplcldpZHRoOjE1LCBvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsIHBlcnNpc3Q6dHJ1ZSwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuU3BsaXRDb250YWluZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5pc0hvcml6b250YWwgPSAodGhpcy5vcmllbnRhdGlvbiA9PSAiaG9yaXpvbnRhbCIpOworfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LlNwbGl0Q29udGFpbmVyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG9qb1NwbGl0Q29udGFpbmVyIik7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJCXRoaXMuZG9tTm9kZS5zdHlsZS5vdmVyZmxvdyA9ICItbW96LXNjcm9sbGJhcnMtbm9uZSI7CisJfQorCXZhciBjb250ZW50ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5kb21Ob2RlKTsKKwl0aGlzLnBhbmVXaWR0aCA9IGNvbnRlbnQud2lkdGg7CisJdGhpcy5wYW5lSGVpZ2h0ID0gY29udGVudC5oZWlnaHQ7Cit9LCBvblJlc2l6ZWQ6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuZG9tTm9kZSk7CisJdGhpcy5wYW5lV2lkdGggPSBjb250ZW50LndpZHRoOworCXRoaXMucGFuZUhlaWdodCA9IGNvbnRlbnQuaGVpZ2h0OworCXRoaXMuX2xheW91dFBhbmVscygpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZ21lbnQsIHBhcmVudENvbXApIHsKKwlkb2pvLndpZGdldC5TcGxpdENvbnRhaW5lci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJd2l0aCAodGhpcy5jaGlsZHJlbltpXS5kb21Ob2RlLnN0eWxlKSB7CisJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCX0KKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY2hpbGRyZW5baV0uZG9tTm9kZSwgImRvam9TcGxpdFBhbmUiKTsKKwkJaWYgKGkgPT0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKSB7CisJCQlicmVhazsKKwkJfQorCQl0aGlzLl9hZGRTaXplcigpOworCX0KKwlpZiAodHlwZW9mIHRoaXMuc2l6ZXJXaWR0aCA9PSAib2JqZWN0IikgeworCQl0cnkgeworCQkJdGhpcy5zaXplcldpZHRoID0gcGFyc2VJbnQodGhpcy5zaXplcldpZHRoLnRvU3RyaW5nKCkpOworCQl9CisJCWNhdGNoIChlKSB7CisJCQl0aGlzLnNpemVyV2lkdGggPSAxNTsKKwkJfQorCX0KKwl0aGlzLnZpcnR1YWxTaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXRoaXMudmlydHVhbFNpemVyLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwl0aGlzLnZpcnR1YWxTaXplci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXRoaXMudmlydHVhbFNpemVyLnN0eWxlLnpJbmRleCA9IDEwOworCXRoaXMudmlydHVhbFNpemVyLmNsYXNzTmFtZSA9IHRoaXMuaXNIb3Jpem9udGFsID8gImRvam9TcGxpdENvbnRhaW5lclZpcnR1YWxTaXplckgiIDogImRvam9TcGxpdENvbnRhaW5lclZpcnR1YWxTaXplclYiOworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnZpcnR1YWxTaXplcik7CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy52aXJ0dWFsU2l6ZXIpOworCWlmICh0aGlzLnBlcnNpc3QpIHsKKwkJdGhpcy5fcmVzdG9yZVN0YXRlKCk7CisJfQorCXRoaXMucmVzaXplU29vbigpOworfSwgX2luamVjdENoaWxkOmZ1bmN0aW9uIChjaGlsZCkgeworCXdpdGggKGNoaWxkLmRvbU5vZGUuc3R5bGUpIHsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCX0KKwlkb2pvLmh0bWwuYWRkQ2xhc3MoY2hpbGQuZG9tTm9kZSwgImRvam9TcGxpdFBhbmUiKTsKK30sIF9hZGRTaXplcjpmdW5jdGlvbiAoKSB7CisJdmFyIGkgPSB0aGlzLnNpemVycy5sZW5ndGg7CisJdGhpcy5zaXplcnNbaV0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl0aGlzLnNpemVyc1tpXS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdGhpcy5zaXplcnNbaV0uY2xhc3NOYW1lID0gdGhpcy5pc0hvcml6b250YWwgPyAiZG9qb1NwbGl0Q29udGFpbmVyU2l6ZXJIIiA6ICJkb2pvU3BsaXRDb250YWluZXJTaXplclYiOworCXZhciBzZWxmID0gdGhpczsKKwl2YXIgaGFuZGxlciA9IChmdW5jdGlvbiAoKSB7CisJCXZhciBzaXplcl9pID0gaTsKKwkJcmV0dXJuIGZ1bmN0aW9uIChlKSB7CisJCQlzZWxmLmJlZ2luU2l6aW5nKGUsIHNpemVyX2kpOworCQl9OworCX0pKCk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuc2l6ZXJzW2ldLCAib25tb3VzZWRvd24iLCBoYW5kbGVyKTsKKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5zaXplcnNbaV0pOworCWRvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuc2l6ZXJzW2ldKTsKK30sIHJlbW92ZUNoaWxkOmZ1bmN0aW9uICh3aWRnZXQpIHsKKwlpZiAodGhpcy5zaXplcnMubGVuZ3RoID4gMCkgeworCQlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyB4KyspIHsKKwkJCWlmICh0aGlzLmNoaWxkcmVuW3hdID09PSB3aWRnZXQpIHsKKwkJCQl2YXIgaSA9IHRoaXMuc2l6ZXJzLmxlbmd0aCAtIDE7CisJCQkJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKHRoaXMuc2l6ZXJzW2ldKTsKKwkJCQl0aGlzLnNpemVycy5sZW5ndGggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWRvam8ud2lkZ2V0LlNwbGl0Q29udGFpbmVyLnN1cGVyY2xhc3MucmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLCB3aWRnZXQsIGFyZ3VtZW50cyk7CisJdGhpcy5vblJlc2l6ZWQoKTsKK30sIGFkZENoaWxkOmZ1bmN0aW9uICh3aWRnZXQpIHsKKwlkb2pvLndpZGdldC5TcGxpdENvbnRhaW5lci5zdXBlcmNsYXNzLmFkZENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5faW5qZWN0Q2hpbGQod2lkZ2V0KTsKKwlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7CisJCXRoaXMuX2FkZFNpemVyKCk7CisJfQorCXRoaXMuX2xheW91dFBhbmVscygpOworfSwgX2xheW91dFBhbmVsczpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDApIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgc3BhY2UgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMucGFuZVdpZHRoIDogdGhpcy5wYW5lSGVpZ2h0OworCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKKwkJc3BhY2UgLT0gdGhpcy5zaXplcldpZHRoICogKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMSk7CisJfQorCXZhciBvdXRfb2YgPSAwOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQlvdXRfb2YgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplU2hhcmU7CisJfQorCXZhciBwaXhfcGVyX3VuaXQgPSBzcGFjZSAvIG91dF9vZjsKKwl2YXIgdG90YWxfc2l6ZSA9IDA7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgeworCQl2YXIgc2l6ZSA9IE1hdGgucm91bmQocGl4X3Blcl91bml0ICogdGhpcy5jaGlsZHJlbltpXS5zaXplU2hhcmUpOworCQl0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWwgPSBzaXplOworCQl0b3RhbF9zaXplICs9IHNpemU7CisJfQorCXRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXS5zaXplQWN0dWFsID0gc3BhY2UgLSB0b3RhbF9zaXplOworCXRoaXMuX2NoZWNrU2l6ZXMoKTsKKwl2YXIgcG9zID0gMDsKKwl2YXIgc2l6ZSA9IHRoaXMuY2hpbGRyZW5bMF0uc2l6ZUFjdHVhbDsKKwl0aGlzLl9tb3ZlUGFuZWwodGhpcy5jaGlsZHJlblswXSwgcG9zLCBzaXplKTsKKwl0aGlzLmNoaWxkcmVuWzBdLnBvc2l0aW9uID0gcG9zOworCXBvcyArPSBzaXplOworCWZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl0aGlzLl9tb3ZlU2xpZGVyKHRoaXMuc2l6ZXJzW2kgLSAxXSwgcG9zLCB0aGlzLnNpemVyV2lkdGgpOworCQl0aGlzLnNpemVyc1tpIC0gMV0ucG9zaXRpb24gPSBwb3M7CisJCXBvcyArPSB0aGlzLnNpemVyV2lkdGg7CisJCXNpemUgPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWw7CisJCXRoaXMuX21vdmVQYW5lbCh0aGlzLmNoaWxkcmVuW2ldLCBwb3MsIHNpemUpOworCQl0aGlzLmNoaWxkcmVuW2ldLnBvc2l0aW9uID0gcG9zOworCQlwb3MgKz0gc2l6ZTsKKwl9Cit9LCBfbW92ZVBhbmVsOmZ1bmN0aW9uIChwYW5lbCwgcG9zLCBzaXplKSB7CisJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CisJCXBhbmVsLmRvbU5vZGUuc3R5bGUubGVmdCA9IHBvcyArICJweCI7CisJCXBhbmVsLmRvbU5vZGUuc3R5bGUudG9wID0gMDsKKwkJcGFuZWwucmVzaXplVG8oc2l6ZSwgdGhpcy5wYW5lSGVpZ2h0KTsKKwl9IGVsc2UgeworCQlwYW5lbC5kb21Ob2RlLnN0eWxlLmxlZnQgPSAwOworCQlwYW5lbC5kb21Ob2RlLnN0eWxlLnRvcCA9IHBvcyArICJweCI7CisJCXBhbmVsLnJlc2l6ZVRvKHRoaXMucGFuZVdpZHRoLCBzaXplKTsKKwl9Cit9LCBfbW92ZVNsaWRlcjpmdW5jdGlvbiAoc2xpZGVyLCBwb3MsIHNpemUpIHsKKwlpZiAodGhpcy5pc0hvcml6b250YWwpIHsKKwkJc2xpZGVyLnN0eWxlLmxlZnQgPSBwb3MgKyAicHgiOworCQlzbGlkZXIuc3R5bGUudG9wID0gMDsKKwkJZG9qby5odG1sLnNldE1hcmdpbkJveChzbGlkZXIsIHt3aWR0aDpzaXplLCBoZWlnaHQ6dGhpcy5wYW5lSGVpZ2h0fSk7CisJfSBlbHNlIHsKKwkJc2xpZGVyLnN0eWxlLmxlZnQgPSAwOworCQlzbGlkZXIuc3R5bGUudG9wID0gcG9zICsgInB4IjsKKwkJZG9qby5odG1sLnNldE1hcmdpbkJveChzbGlkZXIsIHt3aWR0aDp0aGlzLnBhbmVXaWR0aCwgaGVpZ2h0OnNpemV9KTsKKwl9Cit9LCBfZ3Jvd1BhbmU6ZnVuY3Rpb24gKGdyb3d0aCwgcGFuZSkgeworCWlmIChncm93dGggPiAwKSB7CisJCWlmIChwYW5lLnNpemVBY3R1YWwgPiBwYW5lLnNpemVNaW4pIHsKKwkJCWlmICgocGFuZS5zaXplQWN0dWFsIC0gcGFuZS5zaXplTWluKSA+IGdyb3d0aCkgeworCQkJCXBhbmUuc2l6ZUFjdHVhbCA9IHBhbmUuc2l6ZUFjdHVhbCAtIGdyb3d0aDsKKwkJCQlncm93dGggPSAwOworCQkJfSBlbHNlIHsKKwkJCQlncm93dGggLT0gcGFuZS5zaXplQWN0dWFsIC0gcGFuZS5zaXplTWluOworCQkJCXBhbmUuc2l6ZUFjdHVhbCA9IHBhbmUuc2l6ZU1pbjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZ3Jvd3RoOworfSwgX2NoZWNrU2l6ZXM6ZnVuY3Rpb24gKCkgeworCXZhciB0b3RhbF9taW5fc2l6ZSA9IDA7CisJdmFyIHRvdGFsX3NpemUgPSAwOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl0b3RhbF9zaXplICs9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZUFjdHVhbDsKKwkJdG90YWxfbWluX3NpemUgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplTWluOworCX0KKwlpZiAodG90YWxfbWluX3NpemUgPD0gdG90YWxfc2l6ZSkgeworCQl2YXIgZ3Jvd3RoID0gMDsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5jaGlsZHJlbltpXS5zaXplQWN0dWFsIDwgdGhpcy5jaGlsZHJlbltpXS5zaXplTWluKSB7CisJCQkJZ3Jvd3RoICs9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZU1pbiAtIHRoaXMuY2hpbGRyZW5baV0uc2l6ZUFjdHVhbDsKKwkJCQl0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWwgPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVNaW47CisJCQl9CisJCX0KKwkJaWYgKGdyb3d0aCA+IDApIHsKKwkJCWlmICh0aGlzLmlzRHJhZ2dpbmdMZWZ0KSB7CisJCQkJZm9yICh2YXIgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQkJZ3Jvd3RoID0gdGhpcy5fZ3Jvd1BhbmUoZ3Jvd3RoLCB0aGlzLmNoaWxkcmVuW2ldKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCQlncm93dGggPSB0aGlzLl9ncm93UGFuZShncm93dGgsIHRoaXMuY2hpbGRyZW5baV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJdGhpcy5jaGlsZHJlbltpXS5zaXplQWN0dWFsID0gTWF0aC5yb3VuZCh0b3RhbF9zaXplICogKHRoaXMuY2hpbGRyZW5baV0uc2l6ZU1pbiAvIHRvdGFsX21pbl9zaXplKSk7CisJCX0KKwl9Cit9LCBiZWdpblNpemluZzpmdW5jdGlvbiAoZSwgaSkgeworCXRoaXMucGFuZUJlZm9yZSA9IHRoaXMuY2hpbGRyZW5baV07CisJdGhpcy5wYW5lQWZ0ZXIgPSB0aGlzLmNoaWxkcmVuW2kgKyAxXTsKKwl0aGlzLmlzU2l6aW5nID0gdHJ1ZTsKKwl0aGlzLnNpemluZ1NwbGl0dGVyID0gdGhpcy5zaXplcnNbaV07CisJdGhpcy5vcmlnaW5Qb3MgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmNoaWxkcmVuWzBdLmRvbU5vZGUsIHRydWUsIGRvam8uaHRtbC5ib3hTaXppbmcuTUFSR0lOX0JPWCk7CisJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CisJCXZhciBjbGllbnQgPSAoZS5sYXllclggPyBlLmxheWVyWCA6IGUub2Zmc2V0WCk7CisJCXZhciBzY3JlZW4gPSBlLnBhZ2VYOworCQl0aGlzLm9yaWdpblBvcyA9IHRoaXMub3JpZ2luUG9zLng7CisJfSBlbHNlIHsKKwkJdmFyIGNsaWVudCA9IChlLmxheWVyWSA/IGUubGF5ZXJZIDogZS5vZmZzZXRZKTsKKwkJdmFyIHNjcmVlbiA9IGUucGFnZVk7CisJCXRoaXMub3JpZ2luUG9zID0gdGhpcy5vcmlnaW5Qb3MueTsKKwl9CisJdGhpcy5zdGFydFBvaW50ID0gdGhpcy5sYXN0UG9pbnQgPSBzY3JlZW47CisJdGhpcy5zY3JlZW5Ub0NsaWVudE9mZnNldCA9IHNjcmVlbiAtIGNsaWVudDsKKwl0aGlzLmRyYWdPZmZzZXQgPSB0aGlzLmxhc3RQb2ludCAtIHRoaXMucGFuZUJlZm9yZS5zaXplQWN0dWFsIC0gdGhpcy5vcmlnaW5Qb3MgLSB0aGlzLnBhbmVCZWZvcmUucG9zaXRpb247CisJaWYgKCF0aGlzLmFjdGl2ZVNpemluZykgeworCQl0aGlzLl9zaG93U2l6aW5nTGluZSgpOworCX0KKwlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiY2hhbmdlU2l6aW5nIik7CisJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2V1cCIsIHRoaXMsICJlbmRTaXppbmciKTsKKwlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworfSwgY2hhbmdlU2l6aW5nOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5sYXN0UG9pbnQgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IGUucGFnZVggOiBlLnBhZ2VZOworCWlmICh0aGlzLmFjdGl2ZVNpemluZykgeworCQl0aGlzLm1vdmVQb2ludCgpOworCQl0aGlzLl91cGRhdGVTaXplKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5tb3ZlUG9pbnQoKTsKKwkJdGhpcy5fbW92ZVNpemluZ0xpbmUoKTsKKwl9CisJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChlKTsKK30sIGVuZFNpemluZzpmdW5jdGlvbiAoZSkgeworCWlmICghdGhpcy5hY3RpdmVTaXppbmcpIHsKKwkJdGhpcy5faGlkZVNpemluZ0xpbmUoKTsKKwl9CisJdGhpcy5fdXBkYXRlU2l6ZSgpOworCXRoaXMuaXNTaXppbmcgPSBmYWxzZTsKKwlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiY2hhbmdlU2l6aW5nIik7CisJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2V1cCIsIHRoaXMsICJlbmRTaXppbmciKTsKKwlpZiAodGhpcy5wZXJzaXN0KSB7CisJCXRoaXMuX3NhdmVTdGF0ZSh0aGlzKTsKKwl9Cit9LCBtb3ZlUG9pbnQ6ZnVuY3Rpb24gKCkgeworCXZhciBwID0gdGhpcy5sYXN0UG9pbnQgLSB0aGlzLnNjcmVlblRvQ2xpZW50T2Zmc2V0OworCXZhciBhID0gcCAtIHRoaXMuZHJhZ09mZnNldDsKKwlhID0gdGhpcy5sZWdhbGlzZVNwbGl0UG9pbnQoYSk7CisJcCA9IGEgKyB0aGlzLmRyYWdPZmZzZXQ7CisJdGhpcy5sYXN0UG9pbnQgPSBwICsgdGhpcy5zY3JlZW5Ub0NsaWVudE9mZnNldDsKK30sIGxlZ2FsaXNlU3BsaXRQb2ludDpmdW5jdGlvbiAoYSkgeworCWEgKz0gdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbjsKKwl0aGlzLmlzRHJhZ2dpbmdMZWZ0ID0gKGEgPiAwKSA/IHRydWUgOiBmYWxzZTsKKwlpZiAoIXRoaXMuYWN0aXZlU2l6aW5nKSB7CisJCWlmIChhIDwgdGhpcy5wYW5lQmVmb3JlLnBvc2l0aW9uICsgdGhpcy5wYW5lQmVmb3JlLnNpemVNaW4pIHsKKwkJCWEgPSB0aGlzLnBhbmVCZWZvcmUucG9zaXRpb24gKyB0aGlzLnBhbmVCZWZvcmUuc2l6ZU1pbjsKKwkJfQorCQlpZiAoYSA+IHRoaXMucGFuZUFmdGVyLnBvc2l0aW9uICsgKHRoaXMucGFuZUFmdGVyLnNpemVBY3R1YWwgLSAodGhpcy5zaXplcldpZHRoICsgdGhpcy5wYW5lQWZ0ZXIuc2l6ZU1pbikpKSB7CisJCQlhID0gdGhpcy5wYW5lQWZ0ZXIucG9zaXRpb24gKyAodGhpcy5wYW5lQWZ0ZXIuc2l6ZUFjdHVhbCAtICh0aGlzLnNpemVyV2lkdGggKyB0aGlzLnBhbmVBZnRlci5zaXplTWluKSk7CisJCX0KKwl9CisJYSAtPSB0aGlzLnNpemluZ1NwbGl0dGVyLnBvc2l0aW9uOworCXRoaXMuX2NoZWNrU2l6ZXMoKTsKKwlyZXR1cm4gYTsKK30sIF91cGRhdGVTaXplOmZ1bmN0aW9uICgpIHsKKwl2YXIgcG9zID0gdGhpcy5sYXN0UG9pbnQgLSB0aGlzLmRyYWdPZmZzZXQgLSB0aGlzLm9yaWdpblBvczsKKwl2YXIgc3RhcnRfcmVnaW9uID0gdGhpcy5wYW5lQmVmb3JlLnBvc2l0aW9uOworCXZhciBlbmRfcmVnaW9uID0gdGhpcy5wYW5lQWZ0ZXIucG9zaXRpb24gKyB0aGlzLnBhbmVBZnRlci5zaXplQWN0dWFsOworCXRoaXMucGFuZUJlZm9yZS5zaXplQWN0dWFsID0gcG9zIC0gc3RhcnRfcmVnaW9uOworCXRoaXMucGFuZUFmdGVyLnBvc2l0aW9uID0gcG9zICsgdGhpcy5zaXplcldpZHRoOworCXRoaXMucGFuZUFmdGVyLnNpemVBY3R1YWwgPSBlbmRfcmVnaW9uIC0gdGhpcy5wYW5lQWZ0ZXIucG9zaXRpb247CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuY2hpbGRyZW5baV0uc2l6ZVNoYXJlID0gdGhpcy5jaGlsZHJlbltpXS5zaXplQWN0dWFsOworCX0KKwl0aGlzLl9sYXlvdXRQYW5lbHMoKTsKK30sIF9zaG93U2l6aW5nTGluZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5fbW92ZVNpemluZ0xpbmUoKTsKKwlpZiAodGhpcy5pc0hvcml6b250YWwpIHsKKwkJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLnZpcnR1YWxTaXplciwge3dpZHRoOnRoaXMuc2l6ZXJXaWR0aCwgaGVpZ2h0OnRoaXMucGFuZUhlaWdodH0pOworCX0gZWxzZSB7CisJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3godGhpcy52aXJ0dWFsU2l6ZXIsIHt3aWR0aDp0aGlzLnBhbmVXaWR0aCwgaGVpZ2h0OnRoaXMuc2l6ZXJXaWR0aH0pOworCX0KKwl0aGlzLnZpcnR1YWxTaXplci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKK30sIF9oaWRlU2l6aW5nTGluZTpmdW5jdGlvbiAoKSB7CisJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKK30sIF9tb3ZlU2l6aW5nTGluZTpmdW5jdGlvbiAoKSB7CisJdmFyIHBvcyA9IHRoaXMubGFzdFBvaW50IC0gdGhpcy5zdGFydFBvaW50ICsgdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbjsKKwlpZiAodGhpcy5pc0hvcml6b250YWwpIHsKKwkJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUubGVmdCA9IHBvcyArICJweCI7CisJfSBlbHNlIHsKKwkJdmFyIHBvcyA9ICh0aGlzLmxhc3RQb2ludCAtIHRoaXMuc3RhcnRQb2ludCkgKyB0aGlzLnNpemluZ1NwbGl0dGVyLnBvc2l0aW9uOworCQl0aGlzLnZpcnR1YWxTaXplci5zdHlsZS50b3AgPSBwb3MgKyAicHgiOworCX0KK30sIF9nZXRDb29raWVOYW1lOmZ1bmN0aW9uIChpKSB7CisJcmV0dXJuIHRoaXMud2lkZ2V0SWQgKyAiXyIgKyBpOworfSwgX3Jlc3RvcmVTdGF0ZTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjb29raWVOYW1lID0gdGhpcy5fZ2V0Q29va2llTmFtZShpKTsKKwkJdmFyIGNvb2tpZVZhbHVlID0gZG9qby5pby5jb29raWUuZ2V0Q29va2llKGNvb2tpZU5hbWUpOworCQlpZiAoY29va2llVmFsdWUgIT0gbnVsbCkgeworCQkJdmFyIHBvcyA9IHBhcnNlSW50KGNvb2tpZVZhbHVlKTsKKwkJCWlmICh0eXBlb2YgcG9zID09ICJudW1iZXIiKSB7CisJCQkJdGhpcy5jaGlsZHJlbltpXS5zaXplU2hhcmUgPSBwb3M7CisJCQl9CisJCX0KKwl9Cit9LCBfc2F2ZVN0YXRlOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNvb2tpZU5hbWUgPSB0aGlzLl9nZXRDb29raWVOYW1lKGkpOworCQlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUoY29va2llTmFtZSwgdGhpcy5jaGlsZHJlbltpXS5zaXplU2hhcmUsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworCX0KK319KTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby53aWRnZXQuV2lkZ2V0LCB7c2l6ZU1pbjoxMCwgc2l6ZVNoYXJlOjEwfSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlNwbGl0Q29udGFpbmVyUGFuZWwiLCBkb2pvLndpZGdldC5Db250ZW50UGFuZSwge30pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NwbGl0UGFuZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU3BsaXRQYW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDk0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1NwbGl0UGFuZS5qcwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5TcGxpdFBhbmUiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuU3BsaXRQYW5lUGFuZWwiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5TcGxpdFBhbmUiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5TcGxpdFBhbmVQYW5lbCIpOworCisvLworLy8gVE9ETworLy8gbWFrZSBpdCBwcmV0dGllcgorLy8gYWN0aXZlIGRyYWdnaW5nIHVwd2FyZHMgZG9lc24ndCBhbHdheXMgc2hpZnQgb3RoZXIgYmFycyAoZGlyZWN0aW9uIGNhbGN1bGF0aW9uIGlzIHdyb25nIGluIHRoaXMgY2FzZSkKKy8vCisKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5MYXlvdXRQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkNvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworCitkb2pvLndpZGdldC5odG1sLlNwbGl0UGFuZSA9IGZ1bmN0aW9uKCl7CisKKwlkb2pvLndpZGdldC5odG1sLkNvbnRhaW5lci5jYWxsKHRoaXMpOworCisJdGhpcy5zaXplcnMgPSBbXTsKK30KKworZG9qby5pbmhlcml0cyhkb2pvLndpZGdldC5odG1sLlNwbGl0UGFuZSwgZG9qby53aWRnZXQuaHRtbC5Db250YWluZXIpOworCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8ud2lkZ2V0Lmh0bWwuU3BsaXRQYW5lLCB7CisJd2lkZ2V0VHlwZTogIlNwbGl0UGFuZSIsCisJdmlydHVhbFNpemVyOiBudWxsLAorCWlzSG9yaXpvbnRhbDogMCwKKwlwYW5lQmVmb3JlOiBudWxsLAorCXBhbmVBZnRlcjogbnVsbCwKKwlpc1NpemluZzogZmFsc2UsCisJZHJhZ09mZnNldDogbnVsbCwKKwlzdGFydFBvaW50OiBudWxsLAorCWxhc3RQb2ludDogbnVsbCwKKwlzaXppbmdTcGxpdHRlcjogbnVsbCwKKwlpc0FjdGl2ZVJlc2l6ZTogMCwKKwlvZmZzZXRYOiAwLAorCW9mZnNldFk6IDAsCisJaXNEcmFnZ2luZ0xlZnQ6IDAsCisJdGVtcGxhdGVDc3NQYXRoOiBkb2pvLnVyaS5kb2pvVXJpKCJzcmMvd2lkZ2V0L3RlbXBsYXRlcy9IdG1sU3BsaXRQYW5lLmNzcyIpLAorCW9yaWdpblBvczogbnVsbCwKKworCWFjdGl2ZVNpemluZzogJycsCisJc2l6ZXJXaWR0aDogMTUsCisJb3JpZW50YXRpb246ICdob3Jpem9udGFsJywKKworCWRlYnVnTmFtZTogJycsCisKKwlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oKXsKKworCQlkb2pvLnN0eWxlLmluc2VydENzc0ZpbGUodGhpcy50ZW1wbGF0ZUNzc1BhdGgsIG51bGwsIHRydWUpOworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG9qb0h0bWxTcGxpdFBhbmUiKTsKKwkJdGhpcy5kb21Ob2RlLnN0eWxlLm92ZXJmbG93PSdoaWRkZW4nOwkvLyB3b3JrYXJvdW5kIGZpcmVmb3ggYnVnCisKKwkJdGhpcy5wYW5lV2lkdGggPSBkb2pvLnN0eWxlLmdldENvbnRlbnRXaWR0aCh0aGlzLmRvbU5vZGUpOworCQl0aGlzLnBhbmVIZWlnaHQgPSBkb2pvLnN0eWxlLmdldENvbnRlbnRIZWlnaHQodGhpcy5kb21Ob2RlKTsKKworCQl0aGlzLmlzSG9yaXpvbnRhbCA9ICh0aGlzLm9yaWVudGF0aW9uID09ICdob3Jpem9udGFsJykgPyAxIDogMDsKKwkJdGhpcy5pc0FjdGl2ZVJlc2l6ZSA9ICh0aGlzLmFjdGl2ZVNpemluZyA9PSAnMScpID8gMSA6IDA7CisKKwkJLy9kb2pvLmRlYnVnKCJmaWxsSW5UZW1wbGF0ZSBmb3IgIit0aGlzLmRlYnVnTmFtZSk7CisJfSwKKworCW9uUmVzaXplZDogZnVuY3Rpb24oZSl7CisJCXRoaXMucGFuZVdpZHRoID0gZG9qby5zdHlsZS5nZXRDb250ZW50V2lkdGgodGhpcy5kb21Ob2RlKTsKKwkJdGhpcy5wYW5lSGVpZ2h0ID0gZG9qby5zdHlsZS5nZXRDb250ZW50SGVpZ2h0KHRoaXMuZG9tTm9kZSk7CisJCXRoaXMubGF5b3V0UGFuZWxzKCk7CisJCXRoaXMubm90aWZ5Q2hpbGRyZW5PZlJlc2l6ZSgpOwkvLyBub3RpZnkgY2hpbGRyZW4gdGhleSd2ZSBiZWVuIG1vdmVkL3Jlc2l6ZWQKKwl9LAorCisJcG9zdENyZWF0ZTogZnVuY3Rpb24oYXJncywgZnJhZ21lbnQsIHBhcmVudENvbXApeworCisJCS8vIGRvam8uZGVidWcoInBvc3QgY3JlYXRlIGZvciAiK3RoaXMuZGVidWdOYW1lKTsKKworCQkvLyBhdHRhY2ggdGhlIGNoaWxkcmVuCisKKwkJZm9yKHZhciBpPTA7IGk8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7CisJCQl3aXRoKHRoaXMuY2hpbGRyZW5baV0uZG9tTm9kZS5zdHlsZSl7CisJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJfQorCQkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY2hpbGRyZW5baV0uZG9tTm9kZSwgCisJCQkJImRvam9IdG1sU3BsaXR0ZXJQYW5lUGFuZWwiKTsKKwkJfQorCisJCS8vIGNyZWF0ZSB0aGUgZHJhZ2dlcnMKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xOyBpKyspeworCisJCQkvLyBpIHN0aWxsIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBjbG9zdXJlIGJsYWNrIG1hZ2ljIDopIFtDSF0KKwkJCXZhciBzZWxmID0gdGhpczsKKwkJCXZhciBoYW5kbGVyID0gKGZ1bmN0aW9uKCl7IHZhciBzaXplcl9pID0gaTsgcmV0dXJuIGZ1bmN0aW9uKGUpeyBzZWxmLmJlZ2luU2l6aW5nKGUsIHNpemVyX2kpOyB9IH0pKCk7CisKKwkJCXRoaXMuc2l6ZXJzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQl0aGlzLnNpemVyc1tpXS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQl0aGlzLnNpemVyc1tpXS5vbm1vdXNlZG93biA9IGhhbmRsZXI7CisJCQl0aGlzLnNpemVyc1tpXS5jbGFzc05hbWUgPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICdkb2pvSHRtbFNwbGl0UGFuZVNpemVySCcgOiAnZG9qb0h0bWxTcGxpdFBhbmVTaXplclYnOworCQkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMuc2l6ZXJzW2ldKTsKKworCQkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5zaXplcnNbaV0pOworCisJCX0KKworCQkvLyBjcmVhdGUgdGhlIGZha2UgZHJhZ2dlcgorCisJCXRoaXMudmlydHVhbFNpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCXRoaXMudmlydHVhbFNpemVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwkJLy90aGlzLnZpcnR1YWxTaXplci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnbGltZSc7CisJCXRoaXMudmlydHVhbFNpemVyLnN0eWxlLnpJbmRleCA9IDEwOworCQl0aGlzLnZpcnR1YWxTaXplci5jbGFzc05hbWUgPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICdkb2pvSHRtbFNwbGl0UGFuZVZpcnR1YWxTaXplckgnIDogJ2Rvam9IdG1sU3BsaXRQYW5lVmlydHVhbFNpemVyVic7CisJCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnZpcnR1YWxTaXplcik7CisKKwkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy52aXJ0dWFsU2l6ZXIpOworCisJCS8vCisJCS8vIHNpemUgdGhlIHBhbmVscyBvbmNlIHRoZSBicm93c2VyIGhhcyBjYXVnaHQgdXAKKwkJLy8KKwkJdGhpcy5yZXNpemVTb29uKCk7CisJfSwKKworCWxheW91dFBhbmVsczogZnVuY3Rpb24oKXsKKworCQkvLworCQkvLyBjYWxjdWxhdGUgc3BhY2UKKwkJLy8KKworCQl2YXIgc3BhY2UgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMucGFuZVdpZHRoIDogdGhpcy5wYW5lSGVpZ2h0OworCisJCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpeworCisJCQlzcGFjZSAtPSB0aGlzLnNpemVyV2lkdGggKiAodGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKTsKKwkJfQorCisKKwkJLy8KKwkJLy8gY2FsY3VsYXRlIHRvdGFsIG9mIFNpemVTaGFyZSB2YWx1ZXMKKwkJLy8KKworCQl2YXIgb3V0X29mID0gMDsKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKworCQkJb3V0X29mICs9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZVNoYXJlOworCQl9CisKKworCQkvLworCQkvLyB3b3JrIG91dCBhY3R1YWwgcGl4ZWxzIHBlciBzaXplc2hhcmUgdW5pdAorCQkvLworCisJCXZhciBwaXhfcGVyX3VuaXQgPSBzcGFjZSAvIG91dF9vZjsKKworCisJCS8vCisJCS8vIHNldCB0aGUgU2l6ZUFjdHVhbCBtZW1iZXIgb2YgZWFjaCBwYW5lCisJCS8vCisKKwkJdmFyIHRvdGFsX3NpemUgPSAwOworCisJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7IGkrKyl7CisKKwkJCXZhciBzaXplID0gTWF0aC5yb3VuZChwaXhfcGVyX3VuaXQgKiB0aGlzLmNoaWxkcmVuW2ldLnNpemVTaGFyZSk7CisJCQl0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWwgPSBzaXplOworCQkJdG90YWxfc2l6ZSArPSBzaXplOworCQl9CisJCXRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGgtMV0uc2l6ZUFjdHVhbCA9IHNwYWNlIC0gdG90YWxfc2l6ZTsKKworCQkvLworCQkvLyBtYWtlIHN1cmUgdGhlIHNpemVzIGFyZSBvaworCQkvLworCisJCXRoaXMuY2hlY2tTaXplcygpOworCisKKwkJLy8KKwkJLy8gbm93IGxvb3AsIHBvc2l0aW9uaW5nIGVhY2ggcGFuZQorCQkvLworCisJCXZhciBwb3MgPSAwOworCQl2YXIgc2l6ZSA9IHRoaXMuY2hpbGRyZW5bMF0uc2l6ZUFjdHVhbDsKKwkJdGhpcy5tb3ZlUGFuZWwodGhpcy5jaGlsZHJlblswXS5kb21Ob2RlLCBwb3MsIHNpemUpOworCQl0aGlzLmNoaWxkcmVuWzBdLnBvc2l0aW9uID0gcG9zOworCQlwb3MgKz0gc2l6ZTsKKworCQlmb3IodmFyIGk9MTsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKworCQkJLy8gZmlyc3Qgd2UgcG9zaXRpb24gdGhlIHNpemluZyBoYW5kbGUgYmVmb3JlIHRoaXMgcGFuZQorCQkJdGhpcy5tb3ZlUGFuZWwodGhpcy5zaXplcnNbaS0xXSwgcG9zLCB0aGlzLnNpemVyV2lkdGgpOworCQkJdGhpcy5zaXplcnNbaS0xXS5wb3NpdGlvbiA9IHBvczsKKwkJCXBvcyArPSB0aGlzLnNpemVyV2lkdGg7CisKKwkJCXNpemUgPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWw7CisJCQl0aGlzLm1vdmVQYW5lbCh0aGlzLmNoaWxkcmVuW2ldLmRvbU5vZGUsIHBvcywgc2l6ZSk7CisJCQl0aGlzLmNoaWxkcmVuW2ldLnBvc2l0aW9uID0gcG9zOworCQkJcG9zICs9IHNpemU7CisJCX0KKwkJCisJCS8vCisJCS8vIGlmIGNoaWxkcmVuIGFyZSB3aWRnZXRzLCB0aGVuIGxldCB0aGVtIHJlc2l6ZSB0aGVtc2VsdmVzIChpZiB0aGV5IHdhbnQgdG8pCisJCS8vCisJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspeworCQkJdGhpcy5jaGlsZHJlbltpXS5vblJlc2l6ZWQoKTsKKwkJfQorCX0sCisKKwltb3ZlUGFuZWw6IGZ1bmN0aW9uKHBhbmVsLCBwb3MsIHNpemUpeworCQlpZiAodGhpcy5pc0hvcml6b250YWwpeworCQkJcGFuZWwuc3R5bGUubGVmdCA9IHBvcyArICdweCc7CisJCQlwYW5lbC5zdHlsZS50b3AgPSAwOworCisJCQlkb2pvLnN0eWxlLnNldE91dGVyV2lkdGgocGFuZWwsIHNpemUpOworCQkJZG9qby5zdHlsZS5zZXRPdXRlckhlaWdodChwYW5lbCwgdGhpcy5wYW5lSGVpZ2h0KTsKKwkJfWVsc2V7CisJCQlwYW5lbC5zdHlsZS5sZWZ0ID0gMDsKKwkJCXBhbmVsLnN0eWxlLnRvcCA9IHBvcyArICdweCc7CisKKwkJCWRvam8uc3R5bGUuc2V0T3V0ZXJXaWR0aChwYW5lbCwgdGhpcy5wYW5lV2lkdGgpOworCQkJZG9qby5zdHlsZS5zZXRPdXRlckhlaWdodChwYW5lbCwgc2l6ZSk7CisJCX0KKwl9LAorCisJZ3Jvd1BhbmU6IGZ1bmN0aW9uKGdyb3d0aCwgcGFuZSl7CisKKwkJaWYgKGdyb3d0aCA+IDApeworCQkJaWYgKHBhbmUuc2l6ZUFjdHVhbCA+IHBhbmUuc2l6ZU1pbil7CisJCQkJaWYgKChwYW5lLnNpemVBY3R1YWwgLSBwYW5lLnNpemVNaW4pID4gZ3Jvd3RoKXsKKworCQkJCQkvLyBzdGljayBhbGwgdGhlIGdyb3d0aCBpbiB0aGlzIHBhbmUKKwkJCQkJcGFuZS5zaXplQWN0dWFsID0gcGFuZS5zaXplQWN0dWFsIC0gZ3Jvd3RoOworCQkJCQlncm93dGggPSAwOworCQkJCX1lbHNleworCQkJCQkvLyBwdXQgYXMgbXVjaCBncm93dGggaW4gaGVyZSBhcyB3ZSBjYW4KKwkJCQkJZ3Jvd3RoIC09IHBhbmUuc2l6ZUFjdHVhbCAtIHBhbmUuc2l6ZU1pbjsKKwkJCQkJcGFuZS5zaXplQWN0dWFsID0gcGFuZS5zaXplTWluOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3Jvd3RoOworCX0sCisKKwljaGVja1NpemVzOiBmdW5jdGlvbigpeworCisJCXZhciB0b3RhbF9taW5fc2l6ZSA9IDA7CisJCXZhciB0b3RhbF9zaXplID0gMDsKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKworCQkJdG90YWxfc2l6ZSArPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWw7CisJCQl0b3RhbF9taW5fc2l6ZSArPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVNaW47CisJCX0KKworCQkvLyBvbmx5IG1ha2UgYWRqdXN0bWVudHMgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCB0aGUgbWluaW11bXMKKworCQlpZiAodG90YWxfbWluX3NpemUgPD0gdG90YWxfc2l6ZSl7CisKKwkJCXZhciBncm93dGggPSAwOworCisJCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKworCQkJCWlmICh0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWwgPCB0aGlzLmNoaWxkcmVuW2ldLnNpemVNaW4peworCisJCQkJCWdyb3d0aCArPSB0aGlzLmNoaWxkcmVuW2ldLnNpemVNaW4gLSB0aGlzLmNoaWxkcmVuW2ldLnNpemVBY3R1YWw7CisJCQkJCXRoaXMuY2hpbGRyZW5baV0uc2l6ZUFjdHVhbCA9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZU1pbjsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChncm93dGggPiAwKXsKKwkJCQlpZiAodGhpcy5pc0RyYWdnaW5nTGVmdCl7CisJCQkJCWZvcih2YXIgaT10aGlzLmNoaWxkcmVuLmxlbmd0aC0xOyBpPj0wOyBpLS0peworCQkJCQkJZ3Jvd3RoID0gdGhpcy5ncm93UGFuZShncm93dGgsIHRoaXMuY2hpbGRyZW5baV0pOworCQkJCQl9CisJCQkJfWVsc2V7CisJCQkJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspeworCQkJCQkJZ3Jvd3RoID0gdGhpcy5ncm93UGFuZShncm93dGgsIHRoaXMuY2hpbGRyZW5baV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9ZWxzZXsKKworCQkJZm9yKHZhciBpPTA7IGk8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7CisJCQkJdGhpcy5jaGlsZHJlbltpXS5zaXplQWN0dWFsID0gTWF0aC5yb3VuZCh0b3RhbF9zaXplICogKHRoaXMuY2hpbGRyZW5baV0uc2l6ZU1pbiAvIHRvdGFsX21pbl9zaXplKSk7CisJCQl9CisJCX0KKwl9LAorCisJYmVnaW5TaXppbmc6IGZ1bmN0aW9uKGUsIGkpeworCQl2YXIgY2xpZW50WCA9IHdpbmRvdy5ldmVudCA/IHdpbmRvdy5ldmVudC5vZmZzZXRYIDogZS5sYXllclg7CisJCXZhciBjbGllbnRZID0gd2luZG93LmV2ZW50ID8gd2luZG93LmV2ZW50Lm9mZnNldFkgOiBlLmxheWVyWTsKKwkJdmFyIHNjcmVlblggPSB3aW5kb3cuZXZlbnQgPyB3aW5kb3cuZXZlbnQuY2xpZW50WCA6IGUucGFnZVg7CisJCXZhciBzY3JlZW5ZID0gd2luZG93LmV2ZW50ID8gd2luZG93LmV2ZW50LmNsaWVudFkgOiBlLnBhZ2VZOworCisJCXRoaXMucGFuZUJlZm9yZSA9IHRoaXMuY2hpbGRyZW5baV07CisJCXRoaXMucGFuZUFmdGVyID0gdGhpcy5jaGlsZHJlbltpKzFdOworCisJCXRoaXMuaXNTaXppbmcgPSB0cnVlOworCQl0aGlzLnNpemluZ1NwbGl0dGVyID0gdGhpcy5zaXplcnNbaV07CisJCXRoaXMub3JpZ2luUG9zID0gZG9qby5zdHlsZS5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgdHJ1ZSk7CisJCXRoaXMuZHJhZ09mZnNldCA9IHsneCc6Y2xpZW50WCwgJ3knOmNsaWVudFl9OworCQl0aGlzLnN0YXJ0UG9pbnQgID0geyd4JzpzY3JlZW5YLCAneSc6c2NyZWVuWX07CisJCXRoaXMubGFzdFBvaW50ICA9IHsneCc6c2NyZWVuWCwgJ3knOnNjcmVlbll9OworCisJCXRoaXMub2Zmc2V0WCA9IHNjcmVlblggLSBjbGllbnRYOworCQl0aGlzLm9mZnNldFkgPSBzY3JlZW5ZIC0gY2xpZW50WTsKKworCQlpZiAoIXRoaXMuaXNBY3RpdmVSZXNpemUpeworCQkJdGhpcy5zaG93U2l6aW5nTGluZSgpOworCQl9CisJCQorCQkvLworCQkvLyBhdHRhY2ggbW91c2UgZXZlbnRzCisJCS8vCisKKwkJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2Vtb3ZlIiwgdGhpcywgImNoYW5nZVNpemluZyIpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZXVwIiwgdGhpcywgImVuZFNpemluZyIpOworCX0sCisKKwljaGFuZ2VTaXppbmc6IGZ1bmN0aW9uKGUpeworCisJCS8vIEZJWE1FOiBpcyB0aGlzIGZpeGVkIGluIGNvbm5lY3QoKT8KKwkJdmFyIHNjcmVlblggPSB3aW5kb3cuZXZlbnQgPyB3aW5kb3cuZXZlbnQuY2xpZW50WCA6IGUucGFnZVg7CisJCXZhciBzY3JlZW5ZID0gd2luZG93LmV2ZW50ID8gd2luZG93LmV2ZW50LmNsaWVudFkgOiBlLnBhZ2VZOworCisJCWlmICh0aGlzLmlzQWN0aXZlUmVzaXplKXsKKwkJCXRoaXMubGFzdFBvaW50ID0geyd4JzpzY3JlZW5YLCAneSc6c2NyZWVuWX07CisJCQl0aGlzLm1vdmVQb2ludCgpOworCQkJdGhpcy51cGRhdGVTaXplKCk7CisJCX1lbHNleworCQkJdGhpcy5sYXN0UG9pbnQgPSB7J3gnOnNjcmVlblgsICd5JzpzY3JlZW5ZfTsKKwkJCXRoaXMubW92ZVBvaW50KCk7CisJCQl0aGlzLm1vdmVTaXppbmdMaW5lKCk7CisJCX0KKwl9LAorCisJZW5kU2l6aW5nOiBmdW5jdGlvbihlKXsKKworCQlpZiAoIXRoaXMuaXNBY3RpdmVSZXNpemUpeworCQkJdGhpcy5oaWRlU2l6aW5nTGluZSgpOworCQl9CisKKwkJdGhpcy51cGRhdGVTaXplKCk7CisKKwkJdGhpcy5pc1NpemluZyA9IGZhbHNlOworCisJCWRvam8uZXZlbnQuZGlzY29ubmVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJvbm1vdXNlbW92ZSIsIHRoaXMsICJjaGFuZ2VTaXppbmciKTsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ubW91c2V1cCIsIHRoaXMsICJlbmRTaXppbmciKTsKKwl9LAorCisJbW92ZVBvaW50OiBmdW5jdGlvbigpeworCisJCS8vIG1ha2Ugc3VyZSBGTGFzdFBvaW50IGlzIGEgbGVnYWwgcG9pbnQgdG8gZHJhZyB0bworCQlwID0gdGhpcy5zY3JlZW5Ub01haW5DbGllbnQodGhpcy5sYXN0UG9pbnQpOworCisJCWlmICh0aGlzLmlzSG9yaXpvbnRhbCl7CisKKwkJCXZhciBhID0gcC54IC0gdGhpcy5kcmFnT2Zmc2V0Lng7CisJCQlhID0gdGhpcy5sZWdhbGlzZVNwbGl0UG9pbnQoYSk7CisJCQlwLnggPSBhICsgdGhpcy5kcmFnT2Zmc2V0Lng7CisJCX1lbHNleworCQkJdmFyIGEgPSBwLnkgLSB0aGlzLmRyYWdPZmZzZXQueTsKKwkJCWEgPSB0aGlzLmxlZ2FsaXNlU3BsaXRQb2ludChhKTsKKwkJCXAueSA9IGEgKyB0aGlzLmRyYWdPZmZzZXQueTsKKwkJfQorCisJCXRoaXMubGFzdFBvaW50ID0gdGhpcy5tYWluQ2xpZW50VG9TY3JlZW4ocCk7CisJfSwKKworCXNjcmVlblRvQ2xpZW50OiBmdW5jdGlvbihwdCl7CisKKwkJcHQueCAtPSAodGhpcy5vZmZzZXRYICsgdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbik7CisJCXB0LnkgLT0gKHRoaXMub2Zmc2V0WSArIHRoaXMuc2l6aW5nU3BsaXR0ZXIucG9zaXRpb24pOworCisJCXJldHVybiBwdDsKKwl9LAorCisJY2xpZW50VG9TY3JlZW46IGZ1bmN0aW9uKHB0KXsKKworCQlwdC54ICs9ICh0aGlzLm9mZnNldFggKyB0aGlzLnNpemluZ1NwbGl0dGVyLnBvc2l0aW9uKTsKKwkJcHQueSArPSAodGhpcy5vZmZzZXRZICsgdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbik7CisKKwkJcmV0dXJuIHB0OworCX0sCisKKwlzY3JlZW5Ub01haW5DbGllbnQ6IGZ1bmN0aW9uKHB0KXsKKworCQlwdC54IC09IHRoaXMub2Zmc2V0WDsKKwkJcHQueSAtPSB0aGlzLm9mZnNldFk7CisKKwkJcmV0dXJuIHB0OworCX0sCisKKwltYWluQ2xpZW50VG9TY3JlZW46IGZ1bmN0aW9uKHB0KXsKKworCQlwdC54ICs9IHRoaXMub2Zmc2V0WDsKKwkJcHQueSArPSB0aGlzLm9mZnNldFk7CisKKwkJcmV0dXJuIHB0OworCX0sCisKKwlsZWdhbGlzZVNwbGl0UG9pbnQ6IGZ1bmN0aW9uKGEpeworCisJCWEgKz0gdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbjsKKworCQl0aGlzLmlzRHJhZ2dpbmdMZWZ0ID0gKGEgPiAwKSA/IDEgOiAwOworCisJCWlmICghdGhpcy5pc0FjdGl2ZVJlc2l6ZSl7CisKKwkJCWlmIChhIDwgdGhpcy5wYW5lQmVmb3JlLnBvc2l0aW9uICsgdGhpcy5wYW5lQmVmb3JlLnNpemVNaW4peworCisJCQkJYSA9IHRoaXMucGFuZUJlZm9yZS5wb3NpdGlvbiArIHRoaXMucGFuZUJlZm9yZS5zaXplTWluOworCQkJfQorCisJCQlpZiAoYSA+IHRoaXMucGFuZUFmdGVyLnBvc2l0aW9uICsgKHRoaXMucGFuZUFmdGVyLnNpemVBY3R1YWwgLSAodGhpcy5zaXplcldpZHRoICsgdGhpcy5wYW5lQWZ0ZXIuc2l6ZU1pbikpKXsKKworCQkJCWEgPSB0aGlzLnBhbmVBZnRlci5wb3NpdGlvbiArICh0aGlzLnBhbmVBZnRlci5zaXplQWN0dWFsIC0gKHRoaXMuc2l6ZXJXaWR0aCArIHRoaXMucGFuZUFmdGVyLnNpemVNaW4pKTsKKwkJCX0KKwkJfQorCisJCWEgLT0gdGhpcy5zaXppbmdTcGxpdHRlci5wb3NpdGlvbjsKKworCQl0aGlzLmNoZWNrU2l6ZXMoKTsKKworCQlyZXR1cm4gYTsKKwl9LAorCisJdXBkYXRlU2l6ZTogZnVuY3Rpb24oKXsKKworCQl2YXIgcCA9IHRoaXMuY2xpZW50VG9TY3JlZW4odGhpcy5sYXN0UG9pbnQpOworCQl2YXIgcCA9IHRoaXMuc2NyZWVuVG9DbGllbnQodGhpcy5sYXN0UG9pbnQpOworCisJCXZhciBwb3MgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHAueCAtICh0aGlzLmRyYWdPZmZzZXQueCArIHRoaXMub3JpZ2luUG9zLngpIDogcC55IC0gKHRoaXMuZHJhZ09mZnNldC55ICsgdGhpcy5vcmlnaW5Qb3MueSk7CisKKwkJdmFyIHN0YXJ0X3JlZ2lvbiA9IHRoaXMucGFuZUJlZm9yZS5wb3NpdGlvbjsKKwkJdmFyIGVuZF9yZWdpb24gICA9IHRoaXMucGFuZUFmdGVyLnBvc2l0aW9uICsgdGhpcy5wYW5lQWZ0ZXIuc2l6ZUFjdHVhbDsKKworCQl0aGlzLnBhbmVCZWZvcmUuc2l6ZUFjdHVhbCA9IHBvcyAtIHN0YXJ0X3JlZ2lvbjsKKwkJdGhpcy5wYW5lQWZ0ZXIucG9zaXRpb24gICAgPSBwb3MgKyB0aGlzLnNpemVyV2lkdGg7CisJCXRoaXMucGFuZUFmdGVyLnNpemVBY3R1YWwgID0gZW5kX3JlZ2lvbiAtIHRoaXMucGFuZUFmdGVyLnBvc2l0aW9uOworCisJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspeworCisJCQl0aGlzLmNoaWxkcmVuW2ldLnNpemVTaGFyZSA9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZUFjdHVhbDsKKwkJfQorCisJCXRoaXMubGF5b3V0UGFuZWxzKCk7CisJfSwKKworCXNob3dTaXppbmdMaW5lOiBmdW5jdGlvbigpeworCisJCXRoaXMubW92ZVNpemluZ0xpbmUoKTsKKworCQlpZiAodGhpcy5pc0hvcml6b250YWwpeworCQkJZG9qby5zdHlsZS5zZXRPdXRlcldpZHRoKHRoaXMudmlydHVhbFNpemVyLCB0aGlzLnNpemVyV2lkdGgpOworCQkJZG9qby5zdHlsZS5zZXRPdXRlckhlaWdodCh0aGlzLnZpcnR1YWxTaXplciwgdGhpcy5wYW5lSGVpZ2h0KTsKKwkJfWVsc2V7CisJCQlkb2pvLnN0eWxlLnNldE91dGVyV2lkdGgodGhpcy52aXJ0dWFsU2l6ZXIsIHRoaXMucGFuZVdpZHRoKTsKKwkJCWRvam8uc3R5bGUuc2V0T3V0ZXJIZWlnaHQodGhpcy52aXJ0dWFsU2l6ZXIsIHRoaXMuc2l6ZXJXaWR0aCk7CisJCX0KKworCQl0aGlzLnZpcnR1YWxTaXplci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKKwl9LAorCisJaGlkZVNpemluZ0xpbmU6IGZ1bmN0aW9uKCl7CisKKwkJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwl9LAorCisJbW92ZVNpemluZ0xpbmU6IGZ1bmN0aW9uKCl7CisKKwkJdmFyIG9yaWdpbiA9IHsneCc6MCwgJ3knOjB9OworCisJCWlmICh0aGlzLmlzSG9yaXpvbnRhbCl7CisJCQlvcmlnaW4ueCArPSAodGhpcy5sYXN0UG9pbnQueCAtIHRoaXMuc3RhcnRQb2ludC54KSArIHRoaXMuc2l6aW5nU3BsaXR0ZXIucG9zaXRpb247CisJCX1lbHNleworCQkJb3JpZ2luLnkgKz0gKHRoaXMubGFzdFBvaW50LnkgLSB0aGlzLnN0YXJ0UG9pbnQueSkgKyB0aGlzLnNpemluZ1NwbGl0dGVyLnBvc2l0aW9uOworCQl9CisKKwkJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUubGVmdCA9IG9yaWdpbi54ICsgJ3B4JzsKKwkJdGhpcy52aXJ0dWFsU2l6ZXIuc3R5bGUudG9wID0gb3JpZ2luLnkgKyAncHgnOworCX0KK30pOworCisvLyBUaGVzZSBhcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGNoaWxkcmVuIG9mIGEgU3BsaXRQYW5lLgorLy8gU2luY2UgYW55IHdpZGdldCBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgU3BsaXRQYW5lIGNoaWxkLCBtaXggdGhlbQorLy8gaW50byB0aGUgYmFzZSB3aWRnZXQgY2xhc3MuICAoVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGVmZmVjdGl2ZS4pCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8ud2lkZ2V0LldpZGdldCwgeworCXNpemVNaW46IDEwLAorCXNpemVTaGFyZTogMTAKK30pOworCisvLyBEZXByZWNhdGVkIGNsYXNzIGZvciBzcGxpdCBwYW5lIGNoaWxkcmVuLgorLy8gQWN0dWFsbHkgYW55IHdpZGdldCBjYW4gYmUgdGhlIGNoaWxkIG9mIGEgc3BsaXQgcGFuZQorZG9qby53aWRnZXQuaHRtbC5TcGxpdFBhbmVQYW5lbCA9IGZ1bmN0aW9uKCl7CisJZG9qby53aWRnZXQuaHRtbC5MYXlvdXRQYW5lLmNhbGwodGhpcyk7Cit9Citkb2pvLmluaGVyaXRzKGRvam8ud2lkZ2V0Lmh0bWwuU3BsaXRQYW5lUGFuZWwsIGRvam8ud2lkZ2V0Lmh0bWwuTGF5b3V0UGFuZSk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ud2lkZ2V0Lmh0bWwuU3BsaXRQYW5lUGFuZWwsIHsKKwl3aWRnZXRUeXBlOiAiU3BsaXRQYW5lUGFuZWwiCit9KTsKKworZG9qby53aWRnZXQudGFncy5hZGRQYXJzZVRyZWVIYW5kbGVyKCJkb2pvOlNwbGl0UGFuZSIpOworZG9qby53aWRnZXQudGFncy5hZGRQYXJzZVRyZWVIYW5kbGVyKCJkb2pvOlNwbGl0UGFuZVBhbmVsIik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1N2Z0J1dHRvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU3ZnQnV0dG9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDcwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1N2Z0J1dHRvbi5qcwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuU3ZnQnV0dG9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby53aWRnZXQuU3ZnQnV0dG9uIik7Citkb2pvLndpZGdldC5TdmdCdXR0b24gPSBmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuRG9tQnV0dG9uLmNhbGwodGhpcyk7CisJZG9qby53aWRnZXQuU3ZnV2lkZ2V0LmNhbGwodGhpcyk7CisJdGhpcy5vbkZvbyA9IGZ1bmN0aW9uICgpIHsKKwkJYWxlcnQoImJhciIpOworCX07CisJdGhpcy5sYWJlbCA9ICJodXp6YWghIjsKKwl0aGlzLnNldExhYmVsID0gZnVuY3Rpb24gKHgsIHksIHRleHRTaXplLCBsYWJlbCwgc2hhcGUpIHsKKwkJdmFyIGNvb3JkcyA9IGRvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUuY29vcmRpbmF0ZXMoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSk7CisJCXZhciB0ZXh0U3RyaW5nID0gIiI7CisJCXN3aXRjaCAoc2hhcGUpIHsKKwkJICBjYXNlICJlbGxpcHNlIjoKKwkJCXRleHRTdHJpbmcgPSAiPHRleHQgeD0nIiArIGNvb3Jkc1s2XSArICInIHk9JyIgKyBjb29yZHNbN10gKyAiJz4iICsgbGFiZWwgKyAiPC90ZXh0PiI7CisJCQlicmVhazsKKwkJICBjYXNlICJyZWN0YW5nbGUiOgorCQkJdGV4dFN0cmluZyA9ICIiOworCQkJYnJlYWs7CisJCSAgY2FzZSAiY2lyY2xlIjoKKwkJCXRleHRTdHJpbmcgPSAiIjsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiB0ZXh0U3RyaW5nOworCX07CisJdGhpcy5maWxsSW5UZW1wbGF0ZSA9IGZ1bmN0aW9uICh4LCB5LCB0ZXh0U2l6ZSwgbGFiZWwsIHNoYXBlKSB7CisJCXRoaXMudGV4dFNpemUgPSB0ZXh0U2l6ZSB8fCAxMjsKKwkJdGhpcy5sYWJlbCA9IGxhYmVsOworCQl2YXIgdGV4dFdpZHRoID0gdGhpcy5sYWJlbC5sZW5ndGggKiB0aGlzLnRleHRTaXplOworCX07Cit9OworZG9qby5pbmhlcml0cyhkb2pvLndpZGdldC5TdmdCdXR0b24sIGRvam8ud2lkZ2V0LkRvbUJ1dHRvbik7Citkb2pvLndpZGdldC5TdmdCdXR0b24ucHJvdG90eXBlLnNoYXBlU3RyaW5nID0gZnVuY3Rpb24gKHgsIHksIHRleHRTaXplLCBsYWJlbCwgc2hhcGUpIHsKKwlzd2l0Y2ggKHNoYXBlKSB7CisJICBjYXNlICJlbGxpcHNlIjoKKwkJdmFyIGNvb3JkcyA9IGRvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUuY29vcmRpbmF0ZXMoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSk7CisJCXJldHVybiAiPGVsbGlwc2UgY3g9JyIgKyBjb29yZHNbNF0gKyAiJyBjeT0nIiArIGNvb3Jkc1s1XSArICInIHJ4PSciICsgY29vcmRzWzJdICsgIicgcnk9JyIgKyBjb29yZHNbM10gKyAiJy8+IjsKKwkJYnJlYWs7CisJICBjYXNlICJyZWN0IjoKKwkJcmV0dXJuICIiOworCQlicmVhazsKKwkgIGNhc2UgImNpcmNsZSI6CisJCXJldHVybiAiIjsKKwkJYnJlYWs7CisJfQorfTsKK2Rvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUuY29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSkgeworCXN3aXRjaCAoc2hhcGUpIHsKKwkgIGNhc2UgImVsbGlwc2UiOgorCQl2YXIgYnV0dG9uV2lkdGggPSBsYWJlbC5sZW5ndGggKiB0ZXh0U2l6ZTsKKwkJdmFyIGJ1dHRvbkhlaWdodCA9IHRleHRTaXplICogMi41OworCQl2YXIgcnggPSBidXR0b25XaWR0aCAvIDI7CisJCXZhciByeSA9IGJ1dHRvbkhlaWdodCAvIDI7CisJCXZhciBjeCA9IHJ4ICsgeDsKKwkJdmFyIGN5ID0gcnkgKyB5OworCQl2YXIgdGV4dFggPSBjeCAtIHJ4ICogdGV4dFNpemUgLyAyNTsKKwkJdmFyIHRleHRZID0gY3kgKiAxLjE7CisJCXJldHVybiBbYnV0dG9uV2lkdGgsIGJ1dHRvbkhlaWdodCwgcngsIHJ5LCBjeCwgY3ksIHRleHRYLCB0ZXh0WV07CisJCWJyZWFrOworCSAgY2FzZSAicmVjdGFuZ2xlIjoKKwkJcmV0dXJuICIiOworCQlicmVhazsKKwkgIGNhc2UgImNpcmNsZSI6CisJCXJldHVybiAiIjsKKwkJYnJlYWs7CisJfQorfTsKK2Rvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUubGFiZWxTdHJpbmcgPSBmdW5jdGlvbiAoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSkgeworCXZhciB0ZXh0U3RyaW5nID0gIiI7CisJdmFyIGNvb3JkcyA9IGRvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUuY29vcmRpbmF0ZXMoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSk7CisJc3dpdGNoIChzaGFwZSkgeworCSAgY2FzZSAiZWxsaXBzZSI6CisJCXRleHRTdHJpbmcgPSAiPHRleHQgeD0nIiArIGNvb3Jkc1s2XSArICInIHk9JyIgKyBjb29yZHNbN10gKyAiJz4iICsgbGFiZWwgKyAiPC90ZXh0PiI7CisJCWJyZWFrOworCSAgY2FzZSAicmVjdGFuZ2xlIjoKKwkJdGV4dFN0cmluZyA9ICIiOworCQlicmVhazsKKwkgIGNhc2UgImNpcmNsZSI6CisJCXRleHRTdHJpbmcgPSAiIjsKKwkJYnJlYWs7CisJfQorCXJldHVybiB0ZXh0U3RyaW5nOworfTsKK2Rvam8ud2lkZ2V0LlN2Z0J1dHRvbi5wcm90b3R5cGUudGVtcGxhdGVTdHJpbmcgPSBmdW5jdGlvbiAoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSkgeworCXJldHVybiAiPGcgY2xhc3M9J2Rvam9CdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazsgb25Nb3VzZU1vdmU6IG9uRm9vOycgZG9qb0F0dGFjaFBvaW50PSdsYWJlbE5vZGUnPiIgKyBkb2pvLndpZGdldHMuU1ZHQnV0dG9uLnByb3RvdHlwZS5zaGFwZVN0cmluZyh4LCB5LCB0ZXh0U2l6ZSwgbGFiZWwsIHNoYXBlKSArIGRvam8ud2lkZ2V0LlNWR0J1dHRvbi5wcm90b3R5cGUubGFiZWxTdHJpbmcoeCwgeSwgdGV4dFNpemUsIGxhYmVsLCBzaGFwZSkgKyAiPC9nPiI7Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1N2Z1dpZGdldC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvU3ZnV2lkZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDM0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1N2Z1dpZGdldC5qcwpAQCAtMCwwICsxLDcxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Eb21XaWRnZXQiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuU3ZnV2lkZ2V0Iik7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlNWR1dpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8ud2lkZ2V0LlN2Z1dpZGdldCIpOworZG9qby53aWRnZXQuZGVjbGFyZSgiZG9qby53aWRnZXQuU3ZnV2lkZ2V0IiwgZG9qby53aWRnZXQuRG9tV2lkZ2V0LCB7Y3JlYXRlTm9kZXNGcm9tVGV4dDpmdW5jdGlvbiAodHh0LCB3cmFwKSB7CisJcmV0dXJuIGRvam8uc3ZnLmNyZWF0ZU5vZGVzRnJvbVRleHQodHh0LCB3cmFwKTsKK319KTsKK2Rvam8ud2lkZ2V0LlNWR1dpZGdldCA9IGRvam8ud2lkZ2V0LlN2Z1dpZGdldDsKK3RyeSB7CisJKGZ1bmN0aW9uICgpIHsKKwkJdmFyIHRmID0gZnVuY3Rpb24gKCkgeworCQkJdmFyIHJ3ID0gbmV3IGZ1bmN0aW9uICgpIHsKKwkJCQlkb2pvLndpZGdldC5TdmdXaWRnZXQuY2FsbCh0aGlzKTsKKwkJCQl0aGlzLmJ1aWxkUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgeworCQkJCQlyZXR1cm47CisJCQkJfTsKKwkJCQl0aGlzLmRlc3Ryb3lSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7CisJCQkJCXJldHVybjsKKwkJCQl9OworCQkJCXRoaXMucG9zdEluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7CisJCQkJCXJldHVybjsKKwkJCQl9OworCQkJCXRoaXMud2lkZ2V0VHlwZSA9ICJTVkdSb290V2lkZ2V0IjsKKwkJCQl0aGlzLmRvbU5vZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisJCQl9OworCQkJdmFyIHdtID0gZG9qby53aWRnZXQubWFuYWdlcjsKKwkJCXdtLnJvb3QgPSBydzsKKwkJCXdtLmFkZChydyk7CisJCQl3bS5nZXRXaWRnZXRGcm9tTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisJCQkJdmFyIGZpbHRlciA9IGZ1bmN0aW9uICh4KSB7CisJCQkJCWlmICh4LmRvbU5vZGUgPT0gbm9kZSkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9OworCQkJCXZhciB3aWRnZXRzID0gW107CisJCQkJd2hpbGUgKChub2RlKSAmJiAod2lkZ2V0cy5sZW5ndGggPCAxKSkgeworCQkJCQl3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzQnlGaWx0ZXIoZmlsdGVyKTsKKwkJCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwkJCQl9CisJCQkJaWYgKHdpZGdldHMubGVuZ3RoID4gMCkgeworCQkJCQlyZXR1cm4gd2lkZ2V0c1swXTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9OworCQkJd20uZ2V0V2lkZ2V0RnJvbUV2ZW50ID0gZnVuY3Rpb24gKGRvbUV2dCkgeworCQkJCXJldHVybiB0aGlzLmdldFdpZGdldEZyb21Ob2RlKGRvbUV2dC50YXJnZXQpOworCQkJfTsKKwkJCXdtLmdldFdpZGdldEZyb21QcmltaXRpdmUgPSB3bS5nZXRXaWRnZXRGcm9tTm9kZTsKKwkJfTsKKwkJZG9qby5ldmVudC5jb25uZWN0KGRvam8uaG9zdGVudiwgImxvYWRlZCIsIHRmKTsKKwl9KSgpOworfQorY2F0Y2ggKGUpIHsKKwlhbGVydChlKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Td3RXaWRnZXQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1N3dFdpZGdldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE2MzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Td3RXaWRnZXQuanMKQEAgLTAsMCArMSw1NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuU3d0V2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXhwZXJpbWVudGFsIik7Citkb2pvLmV4cGVyaW1lbnRhbCgiZG9qby53aWRnZXQuU3d0V2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5XaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZXh0cmFzIik7Cit0cnkgeworCWltcG9ydFBhY2thZ2UoUGFja2FnZXMub3JnLmVjbGlwc2Uuc3d0LndpZGdldHMpOworCWRvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuU3d0V2lkZ2V0IiwgZG9qby53aWRnZXQuV2lkZ2V0LCBmdW5jdGlvbiAoKSB7CisJCWlmICgoYXJndW1lbnRzLmxlbmd0aCA+IDApICYmICh0eXBlb2YgYXJndW1lbnRzWzBdID09ICJvYmplY3QiKSkgeworCQkJdGhpcy5jcmVhdGUoYXJndW1lbnRzWzBdKTsKKwkJfQorCX0sIHtkaXNwbGF5Om51bGwsIHNoZWxsOm51bGwsIHNob3c6ZnVuY3Rpb24gKCkgeworCX0sIGhpZGU6ZnVuY3Rpb24gKCkgeworCX0sIGFkZENoaWxkOmZ1bmN0aW9uICgpIHsKKwl9LCByZWdpc3RlckNoaWxkOmZ1bmN0aW9uICgpIHsKKwl9LCBhZGRXaWRnZXRBc0RpcmVjdENoaWxkOmZ1bmN0aW9uICgpIHsKKwl9LCByZW1vdmVDaGlsZDpmdW5jdGlvbiAoKSB7CisJfSwgZGVzdHJveVJlbmRlcmluZzpmdW5jdGlvbiAoKSB7CisJfSwgcG9zdEluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCX19KTsKKwlkb2pvLndpZGdldC5Td3RXaWRnZXQucHJvdG90eXBlLmRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOworCWRvam8ud2lkZ2V0LlN3dFdpZGdldC5wcm90b3R5cGUuc2hlbGwgPSBuZXcgU2hlbGwoZG9qby53aWRnZXQuU3d0V2lkZ2V0LnByb3RvdHlwZS5kaXNwbGF5KTsKKwlkb2pvLndpZGdldC5tYW5hZ2VyLnN0YXJ0U2hlbGwgPSBmdW5jdGlvbiAoKSB7CisJCXZhciBzaCA9IGRvam8ud2lkZ2V0LlN3dFdpZGdldC5wcm90b3R5cGUuc2hlbGw7CisJCXZhciBkID0gZG9qby53aWRnZXQuU3d0V2lkZ2V0LnByb3RvdHlwZS5kaXNwbGF5OworCQlzaC5vcGVuKCk7CisJCXdoaWxlICghc2guaXNEaXNwb3NlZCgpKSB7CisJCQlkb2pvLndpZGdldC5tYW5hZ2VyLmRvTmV4dCgpOworCQkJaWYgKCFkLnJlYWRBbmREaXNwYXRjaCgpKSB7CisJCQkJZC5zbGVlcCgpOworCQkJfQorCQl9CisJCWQuZGlzcG9zZSgpOworCX07Cit9CitjYXRjaCAoZSkgeworCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LlN3dFdpZGdldCBub3QgbG9hZGVkLiBTV1QgY2xhc3NlcyBub3QgYXZhaWxhYmxlIik7Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGFiQ29udGFpbmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UYWJDb250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5YmM1NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGFiQ29udGFpbmVyLmpzCkBAIC0wLDAgKzEsODkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVGFiQ29udGFpbmVyIiwgZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lciwge2xhYmVsUG9zaXRpb246InRvcCIsIGNsb3NlQnV0dG9uOiJub25lIiwgdGVtcGxhdGVTdHJpbmc6bnVsbCwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgaWQ9XCIke3RoaXMud2lkZ2V0SWR9XCIgY2xhc3M9XCJkb2pvVGFiQ29udGFpbmVyXCI+XG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwidGFibGlzdE5vZGVcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImRvam9UYWJQYW5lV3JhcHBlclwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbktleVwiIHdhaVJvbGU9XCJ0YWJwYW5lbFwiPjwvZGl2PlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9UYWJDb250YWluZXIge1xuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xufVxuXG4uZG9qb1RhYlBhbmVXcmFwcGVyIHtcblx0Ym9yZGVyIDogMXB4IHNvbGlkICM2MjkwZDI7XG5cdF96b29tOiAxOyAvKiBmb3JjZSBJRTYgbGF5b3V0IG1vZGUgc28gdG9wIGJvcmRlciBkb2VzbnQgZGlzYXBwZWFyICovXG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRjbGVhcjogYm90aDtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRvam9UYWJMYWJlbHMtdG9wIHtcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcblx0dG9wIDogMHB4O1xuXHRsZWZ0IDogMHB4O1xuXHRvdmVyZmxvdyA6IHZpc2libGU7XG5cdG1hcmdpbi1ib3R0b20gOiAtMXB4O1xuXHR3aWR0aCA6IDEwMCU7XG5cdHotaW5kZXg6IDI7XHQvKiBzbyB0aGUgYm90dG9tIG9mIHRoZSB0YWIgbGFiZWwgd2lsbCBjb3ZlciB1cCB0aGUgYm9yZGVyIG9mIGRvam9UYWJQYW5lV3JhcHBlciAqL1xufVxuXG4uZG9qb1RhYk5vTGF5b3V0LmRvam9UYWJMYWJlbHMtdG9wIC5kb2pvVGFiIHtcblx0bWFyZ2luLWJvdHRvbTogLTFweDtcblx0X21hcmdpbi1ib3R0b206IDBweDsgLyogSUUgZmlsdGVyIHNvIHRvcCBib3JkZXIgbGluZXMgdXAgY29ycmVjdGx5ICovXG59XG5cbi5kb2pvVGFiIHtcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcblx0ZmxvYXQgOiBsZWZ0O1xuXHRwYWRkaW5nLWxlZnQgOiA5cHg7XG5cdGJvcmRlci1ib3R0b20gOiAxcHggc29saWQgIzYyOTBkMjtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2xlZnQuZ2lmKSBuby1yZXBlYXQgbGVmdCB0b3A7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0ei1pbmRleDogMztcbn1cblxuLmRvam9UYWIgZGl2IHtcblx0ZGlzcGxheSA6IGJsb2NrO1xuXHRwYWRkaW5nIDogNHB4IDE1cHggNHB4IDZweDtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX3RvcF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCB0b3A7XG5cdGNvbG9yIDogIzMzMztcblx0Zm9udC1zaXplIDogOTAlO1xufVxuXG4uZG9qb1RhYiAuY2xvc2Uge1xuXHRkaXNwbGF5IDogaW5saW5lLWJsb2NrO1xuXHRoZWlnaHQgOiAxMnB4O1xuXHR3aWR0aCA6IDEycHg7XG5cdHBhZGRpbmcgOiAwIDEycHggMCAwO1xuXHRtYXJnaW4gOiAwIC0xMHB4IDAgMTBweDtcblx0Y3Vyc29yIDogZGVmYXVsdDtcblx0Zm9udC1zaXplOiBzbWFsbDtcbn1cblxuLmRvam9UYWIgLmNsb3NlSW1hZ2Uge1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfY2xvc2UuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wO1xufVxuXG4uZG9qb1RhYiAuY2xvc2VIb3ZlciB7XG5cdGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoaW1hZ2VzL3RhYl9jbG9zZV9oLmdpZik7XG59XG5cbi5kb2pvVGFiLmN1cnJlbnQge1xuXHRwYWRkaW5nLWJvdHRvbSA6IDFweDtcblx0Ym9yZGVyLWJvdHRvbSA6IDA7XG5cdGJhY2tncm91bmQtcG9zaXRpb24gOiAwIC0xNTBweDtcbn1cblxuLmRvam9UYWIuY3VycmVudCBkaXYge1xuXHRwYWRkaW5nLWJvdHRvbSA6IDVweDtcblx0bWFyZ2luLWJvdHRvbSA6IC0xcHg7XG5cdGJhY2tncm91bmQtcG9zaXRpb24gOiAxMDAlIC0xNTBweDtcbn1cblxuLyogYm90dG9tIHRhYnMgKi9cblxuLmRvam9UYWJMYWJlbHMtYm90dG9tIHtcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcblx0Ym90dG9tIDogMHB4O1xuXHRsZWZ0IDogMHB4O1xuXHRvdmVyZmxvdyA6IHZpc2libGU7XG5cdG1hcmdpbi10b3AgOiAtMXB4O1xuXHR3aWR0aCA6IDEwMCU7XG5cdHotaW5kZXg6IDI7XG59XG5cbi5kb2pvVGFiTm9MYXlvdXQuZG9qb1RhYkxhYmVscy1ib3R0b20ge1xuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xufVxuXG4uZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIge1xuXHRib3JkZXItdG9wIDogIDFweCBzb2xpZCAjNjI5MGQyO1xuXHRib3JkZXItYm90dG9tIDogMDtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9sZWZ0LmdpZikgbm8tcmVwZWF0IGxlZnQgYm90dG9tO1xufVxuXG4uZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIgZGl2IHtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207XG59XG5cbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYi5jdXJyZW50IHtcblx0Ym9yZGVyLXRvcCA6IDA7XG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9ib3RfbGVmdF9jdXJyLmdpZikgbm8tcmVwZWF0IGxlZnQgYm90dG9tO1xufVxuXG4uZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIuY3VycmVudCBkaXYge1xuXHRwYWRkaW5nLXRvcCA6IDRweDtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodF9jdXJyLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTtcbn1cblxuLyogcmlnaHQtaCB0YWJzICovXG5cbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWgge1xuXHRvdmVyZmxvdyA6IHZpc2libGU7XG5cdG1hcmdpbi1sZWZ0IDogLTFweDtcblx0ei1pbmRleDogMjtcbn1cblxuLmRvam9UYWJMYWJlbHMtcmlnaHQtaCAuZG9qb1RhYiB7XG5cdHBhZGRpbmctbGVmdCA6IDA7XG5cdGJvcmRlci1sZWZ0IDogIDFweCBzb2xpZCAjNjI5MGQyO1xuXHRib3JkZXItYm90dG9tIDogMDtcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207XG5cdGZsb2F0IDogbm9uZTtcbn1cblxuLmRvam9UYWJMYWJlbHMtcmlnaHQtaCAuZG9qb1RhYiBkaXYge1xuXHRwYWRkaW5nIDogNHB4IDE1cHggNHB4IDE1cHg7XG59XG5cbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWggLmRvam9UYWIuY3VycmVudCB7XG5cdGJvcmRlci1sZWZ0IDogIDA7XG5cdGJvcmRlci1ib3R0b20gOiAgMXB4IHNvbGlkICM2MjkwZDI7XG59XG5cbi8qIGxlZnQtaCB0YWJzICovXG5cbi5kb2pvVGFiTGFiZWxzLWxlZnQtaCB7XG5cdG92ZXJmbG93IDogdmlzaWJsZTtcblx0bWFyZ2luLXJpZ2h0IDogLTFweDtcblx0ei1pbmRleDogMjtcbn1cblxuLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiIHtcblx0Ym9yZGVyLXJpZ2h0IDogIDFweCBzb2xpZCAjNjI5MGQyO1xuXHRib3JkZXItYm90dG9tIDogMDtcblx0ZmxvYXQgOiBub25lO1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX2xlZnQuZ2lmKSBuby1yZXBlYXQgbGVmdCB0b3A7XG59XG5cbi5kb2pvVGFiTGFiZWxzLWxlZnQtaCAuZG9qb1RhYi5jdXJyZW50IHtcblx0Ym9yZGVyLXJpZ2h0IDogMDtcblx0Ym9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjtcblx0cGFkZGluZy1ib3R0b20gOiAwO1xuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX2xlZnQuZ2lmKSBuby1yZXBlYXQgMCAtMTUwcHg7XG59XG5cbi5kb2pvVGFiTGFiZWxzLWxlZnQtaCAuZG9qb1RhYiBkaXYge1xuXHRiYWNrZ3JvdW5kIDogMDtcblx0Ym9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9UYWJDb250YWluZXIuY3NzIiksIHNlbGVjdGVkVGFiOiIiLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5zZWxlY3RlZFRhYikgeworCQlkb2pvLmRlcHJlY2F0ZWQoInNlbGVjdGVkVGFiIGRlcHJlY2F0ZWQsIHVzZSBzZWxlY3RlZENoaWxkIGluc3RlYWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiIsICIwLjUiKTsKKwkJdGhpcy5zZWxlY3RlZENoaWxkID0gdGhpcy5zZWxlY3RlZFRhYjsKKwl9CisJaWYgKHRoaXMuY2xvc2VCdXR0b24gIT0gIm5vbmUiKSB7CisJCWRvam8uZGVwcmVjYXRlZCgiY2xvc2VCdXR0b24gZGVwcmVjYXRlZCwgdXNlIGNsb3NhYmxlPSd0cnVlJyBvbiBlYWNoIGNoaWxkIGluc3RlYWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiIsICIwLjUiKTsKKwl9CisJZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMudGFibGlzdCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVGFiQ29udHJvbGxlciIsIHtpZDp0aGlzLndpZGdldElkICsgIl90YWJsaXN0IiwgbGFiZWxQb3NpdGlvbjp0aGlzLmxhYmVsUG9zaXRpb24sIGRvTGF5b3V0OnRoaXMuZG9MYXlvdXQsIGNvbnRhaW5lcklkOnRoaXMud2lkZ2V0SWR9LCB0aGlzLnRhYmxpc3ROb2RlKTsKKwlkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLm9uUmVzaXplZCgpOworfSwgX3NldHVwQ2hpbGQ6ZnVuY3Rpb24gKHRhYikgeworCWlmICh0aGlzLmNsb3NlQnV0dG9uID09ICJ0YWIiIHx8IHRoaXMuY2xvc2VCdXR0b24gPT0gInBhbmUiKSB7CisJCXRhYi5jbG9zYWJsZSA9IHRydWU7CisJfQorCWRvam8uaHRtbC5hZGRDbGFzcyh0YWIuZG9tTm9kZSwgImRvam9UYWJQYW5lIik7CisJZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLnN1cGVyY2xhc3MuX3NldHVwQ2hpbGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIG9uUmVzaXplZDpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmRvTGF5b3V0KSB7CisJCXJldHVybjsKKwl9CisJdmFyIGxhYmVsQWxpZ24gPSB0aGlzLmxhYmVsUG9zaXRpb24ucmVwbGFjZSgvLWgvLCAiIik7CisJdmFyIGNoaWxkcmVuID0gW3tkb21Ob2RlOnRoaXMudGFibGlzdC5kb21Ob2RlLCBsYXlvdXRBbGlnbjpsYWJlbEFsaWdufSwge2RvbU5vZGU6dGhpcy5jb250YWluZXJOb2RlLCBsYXlvdXRBbGlnbjoiY2xpZW50In1dOworCWRvam8ud2lkZ2V0Lmh0bWwubGF5b3V0KHRoaXMuZG9tTm9kZSwgY2hpbGRyZW4pOworCWlmICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpIHsKKwkJdmFyIGNvbnRhaW5lclNpemUgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmNvbnRhaW5lck5vZGUpOworCQl0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQucmVzaXplVG8oY29udGFpbmVyU2l6ZS53aWR0aCwgY29udGFpbmVyU2l6ZS5oZWlnaHQpOworCX0KK30sIHNlbGVjdFRhYjpmdW5jdGlvbiAodGFiLCBjYWxsaW5nV2lkZ2V0KSB7CisJZG9qby5kZXByZWNhdGVkKCJ1c2Ugc2VsZWN0Q2hpbGQoKSByYXRoZXIgdGhhbiBzZWxlY3RUYWIoKSwgc2VsZWN0VGFiKCkgd2lsbCBiZSByZW1vdmVkIGluIiwgIjAuNSIpOworCXRoaXMuc2VsZWN0Q2hpbGQodGFiLCBjYWxsaW5nV2lkZ2V0KTsKK30sIG9uS2V5OmZ1bmN0aW9uIChlKSB7CisJaWYgKGUua2V5Q29kZSA9PSBlLktFWV9VUF9BUlJPVyAmJiBlLmN0cmxLZXkpIHsKKwkJdmFyIGJ1dHRvbiA9IHRoaXMuY29ycmVzcG9uZGluZ1RhYkJ1dHRvbiB8fCB0aGlzLnNlbGVjdGVkVGFiV2lkZ2V0LnRhYkJ1dHRvbjsKKwkJYnV0dG9uLmZvY3VzKCk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJfSBlbHNlIHsKKwkJaWYgKGUua2V5Q29kZSA9PSBlLktFWV9ERUxFVEUgJiYgZS5hbHRLZXkpIHsKKwkJCWlmICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQuY2xvc2FibGUpIHsKKwkJCQl0aGlzLmNsb3NlQ2hpbGQodGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KTsKKwkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworCQkJfQorCQl9CisJfQorfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJdGhpcy50YWJsaXN0LmRlc3Ryb3koKTsKKwlkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRhYkNvbnRyb2xsZXIiLCBkb2pvLndpZGdldC5QYWdlQ29udHJvbGxlciwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2IHdhaXJvbGU9J3RhYmxpc3QnIGRvam9BdHRhY2hFdmVudD0nb25LZXknPjwvZGl2PiIsIGxhYmVsUG9zaXRpb246InRvcCIsIGRvTGF5b3V0OnRydWUsICJjbGFzcyI6IiIsIGJ1dHRvbldpZGdldDoiVGFiQnV0dG9uIiwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzWyJjbGFzcyJdKSB7CisJCXRoaXNbImNsYXNzIl0gPSAiZG9qb1RhYkxhYmVscy0iICsgdGhpcy5sYWJlbFBvc2l0aW9uICsgKHRoaXMuZG9MYXlvdXQgPyAiIiA6ICIgZG9qb1RhYk5vTGF5b3V0Iik7CisJfQorCWRvam8ud2lkZ2V0LlRhYkNvbnRyb2xsZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRhYkJ1dHRvbiIsIGRvam8ud2lkZ2V0LlBhZ2VCdXR0b24sIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz0nZG9qb1RhYicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrJz4iICsgIjxkaXYgZG9qb0F0dGFjaFBvaW50PSdpbm5lckRpdic+IiArICI8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J3RpdGxlTm9kZScgdGFiSW5kZXg9Jy0xJyB3YWlSb2xlPSd0YWInPiR7dGhpcy5sYWJlbH08L3NwYW4+IiArICI8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J2Nsb3NlQnV0dG9uTm9kZScgY2xhc3M9J2Nsb3NlIGNsb3NlSW1hZ2UnIHN0eWxlPScke3RoaXMuY2xvc2VCdXR0b25TdHlsZX0nIiArICIJZG9qb0F0dGFjaEV2ZW50PSdvbk1vdXNlT3ZlcjpvbkNsb3NlQnV0dG9uTW91c2VPdmVyOyBvbk1vdXNlT3V0Om9uQ2xvc2VCdXR0b25Nb3VzZU91dDsgb25DbGljazpvbkNsb3NlQnV0dG9uQ2xpY2snPjwvc3Bhbj4iICsgIjwvZGl2PiIgKyAiPC9kaXY+IiwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoKSB7CisJdGhpcy5jbG9zZUJ1dHRvblN0eWxlID0gdGhpcy5jbG9zZUJ1dHRvbiA/ICIiIDogImRpc3BsYXk6IG5vbmUiOworCWRvam8ud2lkZ2V0LlRhYkJ1dHRvbi5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnRpdGxlTm9kZSk7CisJZG9qby53aWRnZXQuVGFiQnV0dG9uLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIG9uQ2xvc2VCdXR0b25DbGljazpmdW5jdGlvbiAoZXZ0KSB7CisJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworCWRvam8ud2lkZ2V0LlRhYkJ1dHRvbi5zdXBlcmNsYXNzLm9uQ2xvc2VCdXR0b25DbGljay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5hMTF5LlRhYkJ1dHRvbiIsIGRvam8ud2lkZ2V0LlRhYkJ1dHRvbiwge2ltZ1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9jbG9zZS5naWYiKSwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgY2xhc3M9J2Rvam9UYWInIGRvam9BdHRhY2hFdmVudD0nb25DbGljaztvbktleSc+IiArICI8ZGl2IGRvam9BdHRhY2hQb2ludD0naW5uZXJEaXYnPiIgKyAiPHNwYW4gZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIHRhYkluZGV4PSctMScgd2FpUm9sZT0ndGFiJz4ke3RoaXMubGFiZWx9PC9zcGFuPiIgKyAiPGltZyBjbGFzcz0nY2xvc2UnIHNyYz0nJHt0aGlzLmltZ1BhdGh9JyBhbHQ9J1t4XScgc3R5bGU9JyR7dGhpcy5jbG9zZUJ1dHRvblN0eWxlfSciICsgIglkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6b25DbG9zZUJ1dHRvbkNsaWNrJz4iICsgIjwvZGl2PiIgKyAiPC9kaXY+In0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Rhc2tCYXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Rhc2tCYXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1OGMzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGFza0Jhci5qcwpAQCAtMCwwICsxLDQ5IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UYXNrQmFyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVGFza0Jhckl0ZW0iLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7aWNvblNyYzoiIiwgY2FwdGlvbjoiVW50aXRsZWQiLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9UYXNrQmFySXRlbVwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2tcIj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvVGFza0Jhckl0ZW0ge1xuXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdGJhY2tncm91bmQtY29sb3I6IFRocmVlREZhY2U7XG5cdGJvcmRlcjogb3V0c2V0IDJweDtcblx0bWFyZ2luLXJpZ2h0OiA1cHg7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0aGVpZ2h0OiAzNXB4O1xuXHR3aWR0aDogMTAwcHg7XG5cdGZvbnQtc2l6ZTogMTBwdDtcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRmbG9hdDogbGVmdDtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRvam9UYXNrQmFySXRlbSBpbWcge1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRtYXJnaW4tcmlnaHQ6IDVweDtcblx0bWFyZ2luLWxlZnQ6IDVweDtcdFxuXHRoZWlnaHQ6IDMycHg7XG5cdHdpZHRoOiAzMnB4O1xufVxuXG4uZG9qb1Rhc2tCYXJJdGVtIGEge1xuXHQgY29sb3I6IGJsYWNrO1xuXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cblxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL1Rhc2tCYXIuY3NzIiksIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5pY29uU3JjKSB7CisJCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKwkJaW1nLnNyYyA9IHRoaXMuaWNvblNyYzsKKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKGltZyk7CisJfQorCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNhcHRpb24pKTsKKwlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLmRvbU5vZGUpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy53aW5kb3cgPSBkb2pvLndpZGdldC5nZXRXaWRnZXRCeUlkKHRoaXMud2luZG93SWQpOworCXRoaXMud2luZG93LmV4cGxvZGVTcmMgPSB0aGlzLmRvbU5vZGU7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMud2luZG93LCAiZGVzdHJveSIsIHRoaXMsICJkZXN0cm95Iik7Cit9LCBvbkNsaWNrOmZ1bmN0aW9uICgpIHsKKwl0aGlzLndpbmRvdy50b2dnbGVEaXNwbGF5KCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRhc2tCYXIiLCBkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLl9hZGRDaGlsZFN0YWNrID0gW107Cit9LCB7cmVzaXphYmxlOmZhbHNlLCB0aXRsZUJhckRpc3BsYXk6ZmFsc2UsIGFkZENoaWxkOmZ1bmN0aW9uIChjaGlsZCkgeworCWlmICghdGhpcy5jb250YWluZXJOb2RlKSB7CisJCXRoaXMuX2FkZENoaWxkU3RhY2sucHVzaChjaGlsZCk7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuX2FkZENoaWxkU3RhY2subGVuZ3RoID4gMCkgeworCQkJdmFyIG9hcnIgPSB0aGlzLl9hZGRDaGlsZFN0YWNrOworCQkJdGhpcy5fYWRkQ2hpbGRTdGFjayA9IFtdOworCQkJZG9qby5sYW5nLmZvckVhY2gob2FyciwgdGhpcy5hZGRDaGlsZCwgdGhpcyk7CisJCX0KKwl9CisJdmFyIHRiaSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVGFza0Jhckl0ZW0iLCB7d2luZG93SWQ6Y2hpbGQud2lkZ2V0SWQsIGNhcHRpb246Y2hpbGQudGl0bGUsIGljb25TcmM6Y2hpbGQuaWNvblNyY30pOworCWRvam8ud2lkZ2V0LlRhc2tCYXIuc3VwZXJjbGFzcy5hZGRDaGlsZC5jYWxsKHRoaXMsIHRiaSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGV4dGJveC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGV4dGJveC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M5MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UZXh0Ym94LmpzCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRleHRib3giKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lk1hbmFnZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUGFyc2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby54bWwuUGFyc2UiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pMThuLmNvbW1vbiIpOworZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uKCJkb2pvLndpZGdldCIsICJ2YWxpZGF0ZSIsIG51bGwsICJ6aC1jbixqYSxST09ULGZyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRleHRib3giLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7Y2xhc3NOYW1lOiIiLCBuYW1lOiIiLCB2YWx1ZToiIiwgdHlwZToiIiwgdHJpbTpmYWxzZSwgdXBwZXJjYXNlOmZhbHNlLCBsb3dlcmNhc2U6ZmFsc2UsIHVjRmlyc3Q6ZmFsc2UsIGRpZ2l0OmZhbHNlLCBodG1sZmxvYXQ6Im5vbmUiLCB0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gc3R5bGU9J2Zsb2F0OiR7dGhpcy5odG1sZmxvYXR9Oyc+XG5cdDxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9J3RleHRib3gnIGRvam9BdHRhY2hFdmVudD0nb25ibHVyO29uZm9jdXMnXG5cdFx0aWQ9JyR7dGhpcy53aWRnZXRJZH0nIG5hbWU9JyR7dGhpcy5uYW1lfSdcblx0XHRjbGFzcz0nJHt0aGlzLmNsYXNzTmFtZX0nIHR5cGU9JyR7dGhpcy50eXBlfScgPlxuPC9zcGFuPlxuIiwgdGV4dGJveDpudWxsLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy50ZXh0Ym94LnZhbHVlID0gdGhpcy52YWx1ZTsKK30sIGZpbHRlcjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMudHJpbSkgeworCQl0aGlzLnRleHRib3gudmFsdWUgPSB0aGlzLnRleHRib3gudmFsdWUucmVwbGFjZSgvKF5ccyp8XHMqJCkvZywgIiIpOworCX0KKwlpZiAodGhpcy51cHBlcmNhc2UpIHsKKwkJdGhpcy50ZXh0Ym94LnZhbHVlID0gdGhpcy50ZXh0Ym94LnZhbHVlLnRvVXBwZXJDYXNlKCk7CisJfQorCWlmICh0aGlzLmxvd2VyY2FzZSkgeworCQl0aGlzLnRleHRib3gudmFsdWUgPSB0aGlzLnRleHRib3gudmFsdWUudG9Mb3dlckNhc2UoKTsKKwl9CisJaWYgKHRoaXMudWNGaXJzdCkgeworCQl0aGlzLnRleHRib3gudmFsdWUgPSB0aGlzLnRleHRib3gudmFsdWUucmVwbGFjZSgvXGJcdytcYi9nLCBmdW5jdGlvbiAod29yZCkgeworCQkJcmV0dXJuIHdvcmQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOworCQl9KTsKKwl9CisJaWYgKHRoaXMuZGlnaXQpIHsKKwkJdGhpcy50ZXh0Ym94LnZhbHVlID0gdGhpcy50ZXh0Ym94LnZhbHVlLnJlcGxhY2UoL1xEL2csICIiKTsKKwl9Cit9LCBvbmZvY3VzOmZ1bmN0aW9uICgpIHsKK30sIG9uYmx1cjpmdW5jdGlvbiAoKSB7CisJdGhpcy5maWx0ZXIoKTsKK30sIG1peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVGV4dGJveC5zdXBlcmNsYXNzLm1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWlmIChsb2NhbFByb3BlcnRpZXNbImNsYXNzIl0pIHsKKwkJdGhpcy5jbGFzc05hbWUgPSBsb2NhbFByb3BlcnRpZXNbImNsYXNzIl07CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RpbWVQaWNrZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RpbWVQaWNrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4MDc2NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGltZVBpY2tlci5qcwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVGltZVBpY2tlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZGF0ZS5zZXJpYWxpemUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kYXRlLmZvcm1hdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZUxvY2FsaXphdGlvbigiZG9qby5pMThuLmNhbGVuZGFyIiwgImdyZWdvcmlhbiIsIG51bGwsICJrbyx6aC1jbix6aCxzdixqYSxlbix6aC10dyxpdCxodSxubCxmaSx6aC1oayxmcixwdCxST09ULGVzLGRlLHB0LWJyIik7Citkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb24oImRvam8ud2lkZ2V0IiwgIlRpbWVQaWNrZXIiLCBudWxsLCAiUk9PVCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UaW1lUGlja2VyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMudGltZSA9ICIiOworCXRoaXMudXNlRGVmYXVsdFRpbWUgPSBmYWxzZTsKKwl0aGlzLnVzZURlZmF1bHRNaW51dGVzID0gZmFsc2U7CisJdGhpcy5zdG9yZWRUaW1lID0gIiI7CisJdGhpcy5jdXJyZW50VGltZSA9IHt9OworCXRoaXMuY2xhc3NOYW1lcyA9IHtzZWxlY3RlZFRpbWU6InNlbGVjdGVkSXRlbSJ9OworCXRoaXMuYW55ID0gImFueSI7CisJdGhpcy5zZWxlY3RlZFRpbWUgPSB7aG91cjoiIiwgbWludXRlOiIiLCBhbVBtOiIiLCBhbnlUaW1lOmZhbHNlfTsKKwl0aGlzLmhvdXJJbmRleE1hcCA9IFsiIiwgMiwgNCwgNiwgOCwgMTAsIDEsIDMsIDUsIDcsIDksIDExLCAwXTsKKwl0aGlzLm1pbnV0ZUluZGV4TWFwID0gWzAsIDIsIDQsIDYsIDgsIDEwLCAxLCAzLCA1LCA3LCA5LCAxMV07Cit9LCB7aXNDb250YWluZXI6ZmFsc2UsIHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwidGltZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInRpbWVQaWNrZXJDb250YWluZXJOb2RlXCI+XG5cdDx0YWJsZSBjbGFzcz1cInRpbWVDb250YWluZXJcIiBjZWxsc3BhY2luZz1cIjBcIiA+XG5cdFx0PHRoZWFkPlxuXHRcdFx0PHRyPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJ0aW1lQ29ybmVyIGNvcm5lclRvcExlZnRcIiB2YWxpZ249XCJ0b3BcIj4mbmJzcDs8L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJ0aW1lTGFiZWxDb250YWluZXIgaG91clNlbGVjdG9yXCI+JHt0aGlzLmNhbGVuZGFyLmZpZWxkLWhvdXJ9PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZUxhYmVsQ29udGFpbmVyIG1pbnV0ZXNIZWFkaW5nXCI+JHt0aGlzLmNhbGVuZGFyLmZpZWxkLW1pbnV0ZX08L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJ0aW1lQ29ybmVyIGNvcm5lclRvcFJpZ2h0XCIgdmFsaWduPVwidG9wXCI+Jm5ic3A7PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90aGVhZD5cblx0XHQ8dGJvZHk+XG5cdFx0XHQ8dHI+XG5cdFx0XHRcdDx0ZCB2YWxpZ249XCJ0b3BcIiBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiaG91cnNcIj5cblx0XHRcdFx0XHQ8dGFibGUgYWxpZ249XCJjZW50ZXJcIj5cblx0XHRcdFx0XHRcdDx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9XCJob3VyQ29udGFpbmVyTm9kZVwiICBcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZEhvdXI7XCI+XG5cdFx0XHRcdFx0XHRcdDx0cj5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTI8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD42PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xPC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+NzwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0XHRcdDx0cj5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MjwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjg8L3RkPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0XHQ8dHI+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjM8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD45PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD40PC90ZD5cblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTA8L3RkPlxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHRcdFx0XHQ8dHI+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjU8L3RkPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xMTwvdGQ+XG5cdFx0XHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0XHRcdDwvdGFibGU+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCB2YWxpZ249XCJ0b3BcIiBjbGFzcz1cIm1pbnV0ZXNcIiBjb2xzcGFuPVwiMlwiPlxuXHRcdFx0XHRcdDx0YWJsZSBhbGlnbj1cImNlbnRlclwiPlxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cIm1pbnV0ZUNvbnRhaW5lck5vZGVcIiBcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZE1pbnV0ZTtcIj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4wMDwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjMwPC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4wNTwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjM1PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xMDwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjQwPC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xNTwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjQ1PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4yMDwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjUwPC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4yNTwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkPjU1PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0XHQ8dHI+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNvcm5lckJvdHRvbUxlZnRcIj4mbmJzcDs8L3RkPlxuXHRcdFx0XHQ8dGQgdmFsaWduPVwidG9wXCIgY2xhc3M9XCJ0aW1lT3B0aW9uc1wiPlxuXHRcdFx0XHRcdDx0YWJsZSBjbGFzcz1cImFtUG1Db250YWluZXJcIj5cblx0XHRcdFx0XHRcdDx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9XCJhbVBtQ29udGFpbmVyTm9kZVwiIFxuXHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkQW1QbTtcIj5cblx0XHRcdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBpZD1cImFtXCI+JHt0aGlzLmNhbGVuZGFyLmFtfTwvdGQ+XG5cdFx0XHRcdFx0XHRcdFx0PHRkIGlkPVwicG1cIj4ke3RoaXMuY2FsZW5kYXIucG19PC90ZD5cblx0XHRcdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZU9wdGlvbnNcIj5cblx0XHRcdFx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cImFueVRpbWVDb250YWluZXJOb2RlXCIgXG5cdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkQW55VGltZTtcIiBcblx0XHRcdFx0XHRcdGNsYXNzPVwiYW55VGltZUNvbnRhaW5lclwiPiR7dGhpcy53aWRnZXRTdHJpbmdzLmFueX08L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwiY29ybmVyQm90dG9tUmlnaHRcIj4mbmJzcDs8L3RkPlxuXHRcdFx0PC90cj5cblx0XHQ8L3Rib2R5PlxuXHQ8L3RhYmxlPlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLypUaW1lIFBpY2tlciAqL1xuLnRpbWVQaWNrZXJDb250YWluZXIge1xuXHR3aWR0aDoxMjJweDtcblx0Zm9udC1mYW1pbHk6VGFob21hLCBNeXJpYWQsIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XG5cdGZvbnQtc2l6ZToxNnB4O1xufVxuXG4udGltZUNvbnRhaW5lciB7XG5cdGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcblx0Ym9yZGVyLXNwYWNpbmc6MDtcbn1cblxuLnRpbWVDb250YWluZXIgdGhlYWQge1xuXHRjb2xvcjojMjkzYTRiO1xuXHRmb250LXNpemU6MC45ZW07XG5cdGZvbnQtd2VpZ2h0OjcwMDtcbn1cblxuLnRpbWVDb250YWluZXIgdGhlYWQgdGQge1xuXHRwYWRkaW5nOjAuMjVlbTtcblx0Zm9udC1zaXplOjAuODBlbTtcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzY3ODJBODtcbn1cblxuLnRpbWVDb3JuZXIge1xuXHR3aWR0aDoxMHB4O1xufVxuXG4uY29ybmVyVG9wTGVmdCB7XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEN1cnZlVEwucG5nXCIpIHRvcCBsZWZ0IG5vLXJlcGVhdDtcbn1cblxuLmNvcm5lclRvcFJpZ2h0IHtcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUUi5wbmdcIikgdG9wIHJpZ2h0IG5vLXJlcGVhdDtcbn1cblxuLnRpbWVMYWJlbENvbnRhaW5lciB7XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcE1vbnRoQmcucG5nXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xufVxuXG4uaG91cnMsIC5taW51dGVzLCAudGltZUJvcmRlciB7XG5cdGJhY2tncm91bmQ6ICM3NTkxYmMgdXJsKFwiaW1hZ2VzL2RwQmcuZ2lmXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xuXG59XG5cbi5ob3VycyB0ZCwgLm1pbnV0ZXMgdGQge1xuXHRwYWRkaW5nOjAuMmVtO1xuXHR0ZXh0LWFsaWduOmNlbnRlcjtcblx0Zm9udC1zaXplOjAuN2VtO1xuXHRmb250LXdlaWdodDpib2xkO1xuXHRjdXJzb3I6cG9pbnRlcjtcblx0Y3Vyc29yOmhhbmQ7XG5cdGNvbG9yOiNmZmY7XG59XG5cbi5taW51dGVzIHtcblx0Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNmNWQxZGI7XG59XG5cbi5ob3VycyB7XG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgIzY3ODJBODtcbn1cblxuLmhvdXJTZWxlY3RvciB7XG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgIzY3ODJBODtcblx0cGFkZGluZzo1cHg7XG5cdHBhZGRpbmctcmlnaHQ6MTBweDtcbn1cblxuLm1pbnV0ZXNTZWxlY3RvciB7XG5cdHBhZGRpbmc6NXB4O1xuXHRib3JkZXItbGVmdDoxcHggc29saWQgI2Y1YzdkNDtcblx0dGV4dC1hbGlnbjpjZW50ZXI7XG59XG5cbi5taW51dGVzSGVhZGluZyB7XG5cdHBhZGRpbmctbGVmdDo5cHggIWltcG9ydGFudDtcbn1cblxuLnRpbWVPcHRpb25zIHtcblx0YmFja2dyb3VuZC1jb2xvcjojRjlDOUQ3O1xufVxuXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tTGVmdCwgLnRpbWVDb250YWluZXIgLmNvcm5lckJvdHRvbVJpZ2h0LCAudGltZUNvbnRhaW5lciAudGltZU9wdGlvbnMge1xuXHRib3JkZXItdG9wOjFweCBzb2xpZCAjNjc4MkE4O1xufVxuXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tTGVmdCB7XG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEN1cnZlQkwucG5nXCIpIGJvdHRvbSBsZWZ0IG5vLXJlcGVhdCAhaW1wb3J0YW50O1xuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcblx0cGFkZGluZzowO1xuXHRtYXJnaW46MDtcbn1cblxuLnRpbWVDb250YWluZXIgLmNvcm5lckJvdHRvbVJpZ2h0IHtcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCUi5wbmdcIikgYm90dG9tIHJpZ2h0IG5vLXJlcGVhdCAhaW1wb3J0YW50O1xuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcblx0cGFkZGluZzowO1xuXHRtYXJnaW46MDtcbn1cblxuLnRpbWVPcHRpb25zIHtcblx0Y29sb3I6I2ZmZjtcblx0YmFja2dyb3VuZDp1cmwoXCJpbWFnZXMvZHBZZWFyQmcucG5nXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xuXG59XG5cbi5zZWxlY3RlZEl0ZW0ge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7XG5cdGNvbG9yOiM2NzgyYTggIWltcG9ydGFudDtcbn1cblxuLnRpbWVPcHRpb25zIC5zZWxlY3RlZEl0ZW0ge1xuXHRjb2xvcjojZmZmICFpbXBvcnRhbnQ7XG5cdGJhY2tncm91bmQtY29sb3I6IzllYzNmYiAhaW1wb3J0YW50O1xufVxuXG4uYW55VGltZUNvbnRhaW5lciB7XG5cdHRleHQtYWxpZ246Y2VudGVyO1xuXHRmb250LXdlaWdodDpib2xkO1xuXHRmb250LXNpemU6MC43ZW07XG5cdHBhZGRpbmc6MC4xZW07XG5cdGN1cnNvcjpwb2ludGVyO1xuXHRjdXJzb3I6aGFuZDtcblx0Y29sb3I6I2ZmZiAhaW1wb3J0YW50O1xufVxuXG4uYW1QbUNvbnRhaW5lciB7XG5cdHdpZHRoOjEwMCU7XG59XG5cbi5hbVBtQ29udGFpbmVyIHRkIHtcblx0dGV4dC1hbGlnbjpjZW50ZXI7XG5cdGZvbnQtc2l6ZTowLjdlbTtcblx0Zm9udC13ZWlnaHQ6Ym9sZDtcblx0Y3Vyc29yOnBvaW50ZXI7XG5cdGN1cnNvcjpoYW5kO1xuXHRjb2xvcjojZmZmO1xufVxuXG5cblxuLyoudGltZVBpY2tlckNvbnRhaW5lciB7XG5cdG1hcmdpbjoxLjc1ZW0gMCAwLjVlbSAwO1xuXHR3aWR0aDoxMGVtO1xuXHRmbG9hdDpsZWZ0O1xufVxuXG4udGltZUNvbnRhaW5lciB7XG5cdGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtcblx0Ym9yZGVyLXNwYWNpbmc6MDtcbn1cblxuLnRpbWVDb250YWluZXIgdGhlYWQgdGR7XG5cdGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNmU2ZTY7XG5cdHBhZGRpbmc6MCAwLjRlbSAwLjJlbSAwLjRlbTtcbn1cblxuLnRpbWVDb250YWluZXIgdGQge1xuXHRmb250LXNpemU6MC45ZW07XG5cdHBhZGRpbmc6MCAwLjI1ZW0gMCAwLjI1ZW07XG5cdHRleHQtYWxpZ246bGVmdDtcblx0Y3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7XG59XG5cbi50aW1lQ29udGFpbmVyIHRkLm1pbnV0ZXNIZWFkaW5nIHtcblx0Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlNmU2ZTY7XG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgI2U2ZTZlNjtcdFxufVxuXG4udGltZUNvbnRhaW5lciAubWludXRlcyB7XG5cdGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTZlNmU2O1xuXHRib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNlNmU2ZTY7XG59XG5cbi5zZWxlY3RlZEl0ZW0ge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiMzYTNhM2E7XG5cdGNvbG9yOiNmZmZmZmY7XG59Ki9cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9UaW1lUGlja2VyLmNzcyIpLCBwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChsb2NhbFByb3BlcnRpZXMsIGZyYWcpIHsKKwlkb2pvLndpZGdldC5UaW1lUGlja2VyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCXRoaXMuY2FsZW5kYXIgPSBkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCAiZ3JlZ29yaWFuIiwgdGhpcy5sYW5nKTsKKwl0aGlzLndpZGdldFN0cmluZ3MgPSBkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKCJkb2pvLndpZGdldCIsICJUaW1lUGlja2VyIiwgdGhpcy5sYW5nKTsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisJaWYgKGFyZ3MudmFsdWUpIHsKKwkJaWYgKGFyZ3MudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7CisJCQl0aGlzLnN0b3JlZFRpbWUgPSBkb2pvLmRhdGUudG9SZmMzMzM5KGFyZ3MudmFsdWUpOworCQl9IGVsc2UgeworCQkJdGhpcy5zdG9yZWRUaW1lID0gYXJncy52YWx1ZTsKKwkJfQorCX0KKwl0aGlzLmluaXREYXRhKCk7CisJdGhpcy5pbml0VUkoKTsKK30sIGluaXREYXRhOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5zdG9yZWRUaW1lLmluZGV4T2YoIlQiKSAhPSAtMSAmJiB0aGlzLnN0b3JlZFRpbWUuc3BsaXQoIlQiKVsxXSAmJiB0aGlzLnN0b3JlZFRpbWUgIT0gIiAiICYmIHRoaXMuc3RvcmVkVGltZS5zcGxpdCgiVCIpWzFdICE9ICJhbnkiKSB7CisJCXRoaXMudGltZSA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC5mcm9tUmZjRGF0ZVRpbWUodGhpcy5zdG9yZWRUaW1lLCB0aGlzLnVzZURlZmF1bHRNaW51dGVzLCB0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy51c2VEZWZhdWx0VGltZSkgeworCQkJdGhpcy50aW1lID0gZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsLmZyb21SZmNEYXRlVGltZSgiIiwgdGhpcy51c2VEZWZhdWx0TWludXRlcywgdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lID0gdHJ1ZTsKKwkJCXRoaXMudGltZSA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC5mcm9tUmZjRGF0ZVRpbWUoIiIsIDAsIDEpOworCQl9CisJfQorfSwgaW5pdFVJOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgJiYgdGhpcy50aW1lKSB7CisJCXZhciBhbVBtSG91ciA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC50b0FtUG1Ib3VyKHRoaXMudGltZS5nZXRIb3VycygpKTsKKwkJdmFyIGhvdXIgPSBhbVBtSG91clswXTsKKwkJdmFyIGlzQW0gPSBhbVBtSG91clsxXTsKKwkJdmFyIG1pbnV0ZSA9IHRoaXMudGltZS5nZXRNaW51dGVzKCk7CisJCXZhciBtaW51dGVJbmRleCA9IHBhcnNlSW50KG1pbnV0ZSAvIDUpOworCQl0aGlzLm9uU2V0U2VsZWN0ZWRIb3VyKHRoaXMuaG91ckluZGV4TWFwW2hvdXJdKTsKKwkJdGhpcy5vblNldFNlbGVjdGVkTWludXRlKHRoaXMubWludXRlSW5kZXhNYXBbbWludXRlSW5kZXhdKTsKKwkJdGhpcy5vblNldFNlbGVjdGVkQW1QbShpc0FtKTsKKwl9IGVsc2UgeworCQl0aGlzLm9uU2V0U2VsZWN0ZWRBbnlUaW1lKCk7CisJfQorfSwgc2V0VGltZTpmdW5jdGlvbiAoZGF0ZSkgeworCWlmIChkYXRlKSB7CisJCXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgPSBmYWxzZTsKKwkJdGhpcy5zZXREYXRlVGltZShkb2pvLmRhdGUudG9SZmMzMzM5KGRhdGUpKTsKKwl9IGVsc2UgeworCQl0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lID0gdHJ1ZTsKKwl9CisJdGhpcy5pbml0RGF0YSgpOworCXRoaXMuaW5pdFVJKCk7Cit9LCBzZXREYXRlVGltZTpmdW5jdGlvbiAocmZjRGF0ZSkgeworCXRoaXMuc3RvcmVkVGltZSA9IHJmY0RhdGU7Cit9LCBvbkNsZWFyU2VsZWN0ZWRIb3VyOmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLmNsZWFyU2VsZWN0ZWRIb3VyKCk7Cit9LCBvbkNsZWFyU2VsZWN0ZWRNaW51dGU6ZnVuY3Rpb24gKGV2dCkgeworCXRoaXMuY2xlYXJTZWxlY3RlZE1pbnV0ZSgpOworfSwgb25DbGVhclNlbGVjdGVkQW1QbTpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5jbGVhclNlbGVjdGVkQW1QbSgpOworfSwgb25DbGVhclNlbGVjdGVkQW55VGltZTpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5jbGVhclNlbGVjdGVkQW55VGltZSgpOworCWlmICh0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lKSB7CisJCXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgPSBmYWxzZTsKKwkJdGhpcy50aW1lID0gZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsLmZyb21SZmNEYXRlVGltZSgiIiwgdGhpcy51c2VEZWZhdWx0TWludXRlcyk7CisJCXRoaXMuaW5pdFVJKCk7CisJfQorfSwgY2xlYXJTZWxlY3RlZEhvdXI6ZnVuY3Rpb24gKCkgeworCXZhciBob3VyTm9kZXMgPSB0aGlzLmhvdXJDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgaG91ck5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhob3VyTm9kZXMuaXRlbShpKSwgIiIpOworCX0KK30sIGNsZWFyU2VsZWN0ZWRNaW51dGU6ZnVuY3Rpb24gKCkgeworCXZhciBtaW51dGVOb2RlcyA9IHRoaXMubWludXRlQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IG1pbnV0ZU5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhtaW51dGVOb2Rlcy5pdGVtKGkpLCAiIik7CisJfQorfSwgY2xlYXJTZWxlY3RlZEFtUG06ZnVuY3Rpb24gKCkgeworCXZhciBhbVBtTm9kZXMgPSB0aGlzLmFtUG1Db250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgYW1QbU5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhhbVBtTm9kZXMuaXRlbShpKSwgIiIpOworCX0KK30sIGNsZWFyU2VsZWN0ZWRBbnlUaW1lOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5hbnlUaW1lQ29udGFpbmVyTm9kZSwgImFueVRpbWVDb250YWluZXIiKTsKK30sIG9uU2V0U2VsZWN0ZWRIb3VyOmZ1bmN0aW9uIChldnQpIHsKKwl0aGlzLm9uQ2xlYXJTZWxlY3RlZEFueVRpbWUoKTsKKwl0aGlzLm9uQ2xlYXJTZWxlY3RlZEhvdXIoKTsKKwl0aGlzLnNldFNlbGVjdGVkSG91cihldnQpOworCXRoaXMub25TZXRUaW1lKCk7Cit9LCBzZXRTZWxlY3RlZEhvdXI6ZnVuY3Rpb24gKGV2dCkgeworCWlmIChldnQgJiYgZXZ0LnRhcmdldCkgeworCQlpZiAoZXZ0LnRhcmdldC5ub2RlVHlwZSA9PSBkb2pvLmRvbS5FTEVNRU5UX05PREUpIHsKKwkJCXZhciBldmVudFRhcmdldCA9IGV2dC50YXJnZXQ7CisJCX0gZWxzZSB7CisJCQl2YXIgZXZlbnRUYXJnZXQgPSBldnQudGFyZ2V0LnBhcmVudE5vZGU7CisJCX0KKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQlkb2pvLmh0bWwuc2V0Q2xhc3MoZXZlbnRUYXJnZXQsIHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZFRpbWUpOworCQl0aGlzLnNlbGVjdGVkVGltZVsiaG91ciJdID0gZXZlbnRUYXJnZXQuaW5uZXJIVE1MOworCX0gZWxzZSB7CisJCWlmICghaXNOYU4oZXZ0KSkgeworCQkJdmFyIGhvdXJOb2RlcyA9IHRoaXMuaG91ckNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCQlpZiAoaG91ck5vZGVzLml0ZW0oZXZ0KSkgeworCQkJCWRvam8uaHRtbC5zZXRDbGFzcyhob3VyTm9kZXMuaXRlbShldnQpLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKKwkJCQl0aGlzLnNlbGVjdGVkVGltZVsiaG91ciJdID0gaG91ck5vZGVzLml0ZW0oZXZ0KS5pbm5lckhUTUw7CisJCQl9CisJCX0KKwl9CisJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IGZhbHNlOworfSwgb25TZXRTZWxlY3RlZE1pbnV0ZTpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5vbkNsZWFyU2VsZWN0ZWRBbnlUaW1lKCk7CisJdGhpcy5vbkNsZWFyU2VsZWN0ZWRNaW51dGUoKTsKKwl0aGlzLnNldFNlbGVjdGVkTWludXRlKGV2dCk7CisJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IGZhbHNlOworCXRoaXMub25TZXRUaW1lKCk7Cit9LCBzZXRTZWxlY3RlZE1pbnV0ZTpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKGV2dCAmJiBldnQudGFyZ2V0KSB7CisJCWlmIChldnQudGFyZ2V0Lm5vZGVUeXBlID09IGRvam8uZG9tLkVMRU1FTlRfTk9ERSkgeworCQkJdmFyIGV2ZW50VGFyZ2V0ID0gZXZ0LnRhcmdldDsKKwkJfSBlbHNlIHsKKwkJCXZhciBldmVudFRhcmdldCA9IGV2dC50YXJnZXQucGFyZW50Tm9kZTsKKwkJfQorCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhldmVudFRhcmdldCwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7CisJCXRoaXMuc2VsZWN0ZWRUaW1lWyJtaW51dGUiXSA9IGV2ZW50VGFyZ2V0LmlubmVySFRNTDsKKwl9IGVsc2UgeworCQlpZiAoIWlzTmFOKGV2dCkpIHsKKwkJCXZhciBtaW51dGVOb2RlcyA9IHRoaXMubWludXRlQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKwkJCWlmIChtaW51dGVOb2Rlcy5pdGVtKGV2dCkpIHsKKwkJCQlkb2pvLmh0bWwuc2V0Q2xhc3MobWludXRlTm9kZXMuaXRlbShldnQpLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKKwkJCQl0aGlzLnNlbGVjdGVkVGltZVsibWludXRlIl0gPSBtaW51dGVOb2Rlcy5pdGVtKGV2dCkuaW5uZXJIVE1MOworCQkJfQorCQl9CisJfQorfSwgb25TZXRTZWxlY3RlZEFtUG06ZnVuY3Rpb24gKGV2dCkgeworCXRoaXMub25DbGVhclNlbGVjdGVkQW55VGltZSgpOworCXRoaXMub25DbGVhclNlbGVjdGVkQW1QbSgpOworCXRoaXMuc2V0U2VsZWN0ZWRBbVBtKGV2dCk7CisJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IGZhbHNlOworCXRoaXMub25TZXRUaW1lKCk7Cit9LCBzZXRTZWxlY3RlZEFtUG06ZnVuY3Rpb24gKGV2dCkgeworCXZhciBldmVudFRhcmdldCA9IGV2dC50YXJnZXQ7CisJaWYgKGV2dCAmJiBldmVudFRhcmdldCkgeworCQlpZiAoZXZlbnRUYXJnZXQubm9kZVR5cGUgIT0gZG9qby5kb20uRUxFTUVOVF9OT0RFKSB7CisJCQlldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0LnBhcmVudE5vZGU7CisJCX0KKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQl0aGlzLnNlbGVjdGVkVGltZS5hbVBtID0gZXZlbnRUYXJnZXQuaWQ7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhldmVudFRhcmdldCwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7CisJfSBlbHNlIHsKKwkJZXZ0ID0gZXZ0ID8gMCA6IDE7CisJCXZhciBhbVBtTm9kZXMgPSB0aGlzLmFtUG1Db250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQlpZiAoYW1QbU5vZGVzLml0ZW0oZXZ0KSkgeworCQkJdGhpcy5zZWxlY3RlZFRpbWUuYW1QbSA9IGFtUG1Ob2Rlcy5pdGVtKGV2dCkuaWQ7CisJCQlkb2pvLmh0bWwuc2V0Q2xhc3MoYW1QbU5vZGVzLml0ZW0oZXZ0KSwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7CisJCX0KKwl9Cit9LCBvblNldFNlbGVjdGVkQW55VGltZTpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5vbkNsZWFyU2VsZWN0ZWRIb3VyKCk7CisJdGhpcy5vbkNsZWFyU2VsZWN0ZWRNaW51dGUoKTsKKwl0aGlzLm9uQ2xlYXJTZWxlY3RlZEFtUG0oKTsKKwl0aGlzLnNldFNlbGVjdGVkQW55VGltZSgpOworCXRoaXMub25TZXRUaW1lKCk7Cit9LCBzZXRTZWxlY3RlZEFueVRpbWU6ZnVuY3Rpb24gKGV2dCkgeworCXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgPSB0cnVlOworCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmFueVRpbWVDb250YWluZXJOb2RlLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lICsgIiAiICsgImFueVRpbWVDb250YWluZXIiKTsKK30sIG9uQ2xpY2s6ZnVuY3Rpb24gKGV2dCkgeworCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK30sIG9uU2V0VGltZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUpIHsKKwkJdGhpcy50aW1lID0gbmV3IERhdGUoKTsKKwkJdmFyIHRlbXBEYXRlVGltZSA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC50b1JmY0RhdGVUaW1lKHRoaXMudGltZSk7CisJCXRoaXMuc2V0RGF0ZVRpbWUodGVtcERhdGVUaW1lLnNwbGl0KCJUIilbMF0pOworCX0gZWxzZSB7CisJCXZhciBob3VyID0gMTI7CisJCXZhciBtaW51dGUgPSAwOworCQl2YXIgaXNBbSA9IGZhbHNlOworCQlpZiAodGhpcy5zZWxlY3RlZFRpbWVbImhvdXIiXSkgeworCQkJaG91ciA9IHBhcnNlSW50KHRoaXMuc2VsZWN0ZWRUaW1lWyJob3VyIl0sIDEwKTsKKwkJfQorCQlpZiAodGhpcy5zZWxlY3RlZFRpbWVbIm1pbnV0ZSJdKSB7CisJCQltaW51dGUgPSBwYXJzZUludCh0aGlzLnNlbGVjdGVkVGltZVsibWludXRlIl0sIDEwKTsKKwkJfQorCQlpZiAodGhpcy5zZWxlY3RlZFRpbWVbImFtUG0iXSkgeworCQkJaXNBbSA9ICh0aGlzLnNlbGVjdGVkVGltZVsiYW1QbSJdLnRvTG93ZXJDYXNlKCkgPT0gImFtIik7CisJCX0KKwkJdGhpcy50aW1lID0gbmV3IERhdGUoKTsKKwkJdGhpcy50aW1lLnNldEhvdXJzKGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC5mcm9tQW1QbUhvdXIoaG91ciwgaXNBbSkpOworCQl0aGlzLnRpbWUuc2V0TWludXRlcyhtaW51dGUpOworCQl0aGlzLnNldERhdGVUaW1lKGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC50b1JmY0RhdGVUaW1lKHRoaXMudGltZSkpOworCX0KKwl0aGlzLm9uVmFsdWVDaGFuZ2VkKHRoaXMudGltZSk7Cit9LCBvblZhbHVlQ2hhbmdlZDpmdW5jdGlvbiAoZGF0ZSkgeworfX0pOworZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl0aGlzLnRvUmZjRGF0ZVRpbWUgPSBmdW5jdGlvbiAoanNEYXRlKSB7CisJCWlmICghanNEYXRlKSB7CisJCQlqc0RhdGUgPSBuZXcgRGF0ZSgpOworCQl9CisJCWpzRGF0ZS5zZXRTZWNvbmRzKDApOworCQlyZXR1cm4gZG9qby5kYXRlLnN0cmZ0aW1lKGpzRGF0ZSwgIiVZLSVtLSVkVCVIOiVNOjAwJXoiKTsKKwl9OworCXRoaXMuZnJvbVJmY0RhdGVUaW1lID0gZnVuY3Rpb24gKHJmY0RhdGUsIHVzZURlZmF1bHRNaW51dGVzLCBpc0FueVRpbWUpIHsKKwkJdmFyIHRlbXBEYXRlID0gbmV3IERhdGUoKTsKKwkJaWYgKCFyZmNEYXRlIHx8IHJmY0RhdGUuaW5kZXhPZigiVCIpID09IC0xKSB7CisJCQlpZiAodXNlRGVmYXVsdE1pbnV0ZXMpIHsKKwkJCQl0ZW1wRGF0ZS5zZXRNaW51dGVzKE1hdGguZmxvb3IodGVtcERhdGUuZ2V0TWludXRlcygpIC8gNSkgKiA1KTsKKwkJCX0gZWxzZSB7CisJCQkJdGVtcERhdGUuc2V0TWludXRlcygwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhciB0ZW1wVGltZSA9IHJmY0RhdGUuc3BsaXQoIlQiKVsxXS5zcGxpdCgiOiIpOworCQkJdmFyIHRlbXBEYXRlID0gbmV3IERhdGUoKTsKKwkJCXRlbXBEYXRlLnNldEhvdXJzKHRlbXBUaW1lWzBdKTsKKwkJCXRlbXBEYXRlLnNldE1pbnV0ZXModGVtcFRpbWVbMV0pOworCQl9CisJCXJldHVybiB0ZW1wRGF0ZTsKKwl9OworCXRoaXMudG9BbVBtSG91ciA9IGZ1bmN0aW9uIChob3VyKSB7CisJCXZhciBhbVBtSG91ciA9IGhvdXI7CisJCXZhciBpc0FtID0gdHJ1ZTsKKwkJaWYgKGFtUG1Ib3VyID09IDApIHsKKwkJCWFtUG1Ib3VyID0gMTI7CisJCX0gZWxzZSB7CisJCQlpZiAoYW1QbUhvdXIgPiAxMikgeworCQkJCWFtUG1Ib3VyID0gYW1QbUhvdXIgLSAxMjsKKwkJCQlpc0FtID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWlmIChhbVBtSG91ciA9PSAxMikgeworCQkJCQlpc0FtID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBbYW1QbUhvdXIsIGlzQW1dOworCX07CisJdGhpcy5mcm9tQW1QbUhvdXIgPSBmdW5jdGlvbiAoYW1QbUhvdXIsIGlzQW0pIHsKKwkJdmFyIGhvdXIgPSBwYXJzZUludChhbVBtSG91ciwgMTApOworCQlpZiAoaXNBbSAmJiBob3VyID09IDEyKSB7CisJCQlob3VyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghaXNBbSAmJiBob3VyIDwgMTIpIHsKKwkJCQlob3VyID0gaG91ciArIDEyOworCQkJfQorCQl9CisJCXJldHVybiBob3VyOworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RpdGxlUGFuZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVGl0bGVQYW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTAwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RpdGxlUGFuZS5qcwpAQCAtMCwwICsxLDQzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UaXRsZVBhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db250ZW50UGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sZnguKiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UaXRsZVBhbmUiLCBkb2pvLndpZGdldC5Db250ZW50UGFuZSwge2xhYmVsTm9kZUNsYXNzOiIiLCBjb250YWluZXJOb2RlQ2xhc3M6IiIsIGxhYmVsOiIiLCBvcGVuOnRydWUsIHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGRvam9BdHRhY2hQb2ludD1cImRvbU5vZGVcIj5cbjxkaXYgZG9qb0F0dGFjaFBvaW50PVwibGFiZWxOb2RlXCIgZG9qb0F0dGFjaEV2ZW50PVwib25jbGljazogb25MYWJlbENsaWNrXCI+PC9kaXY+XG48ZGl2IGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIj48L2Rpdj5cbjwvZGl2PlxuIiwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMubGFiZWwpIHsKKwkJdGhpcy5sYWJlbE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5sYWJlbCkpOworCX0KKwlpZiAodGhpcy5sYWJlbE5vZGVDbGFzcykgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5sYWJlbE5vZGUsIHRoaXMubGFiZWxOb2RlQ2xhc3MpOworCX0KKwlpZiAodGhpcy5jb250YWluZXJOb2RlQ2xhc3MpIHsKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy5jb250YWluZXJOb2RlQ2xhc3MpOworCX0KKwlpZiAoIXRoaXMub3BlbikgeworCQlkb2pvLmh0bWwuaGlkZSh0aGlzLmNvbnRhaW5lck5vZGUpOworCX0KKwlkb2pvLndpZGdldC5UaXRsZVBhbmUuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBvbkxhYmVsQ2xpY2s6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLm9wZW4pIHsKKwkJZG9qby5sZngud2lwZU91dCh0aGlzLmNvbnRhaW5lck5vZGUsIDI1MCkucGxheSgpOworCQl0aGlzLm9wZW4gPSBmYWxzZTsKKwl9IGVsc2UgeworCQlkb2pvLmxmeC53aXBlSW4odGhpcy5jb250YWluZXJOb2RlLCAyNTApLnBsYXkoKTsKKwkJdGhpcy5vcGVuID0gdHJ1ZTsKKwl9Cit9LCBzZXRMYWJlbDpmdW5jdGlvbiAobGFiZWwpIHsKKwl0aGlzLmxhYmVsTm9kZS5pbm5lckhUTUwgPSBsYWJlbDsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub2FzdGVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub2FzdGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTNjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RvYXN0ZXIuanMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRvYXN0ZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxmeC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5pZnJhbWUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVG9hc3RlciIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJjbGlwTm9kZVwiPjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6b25TZWxlY3RcIj48ZGl2IGRvam9BdHRhY2hQb2ludD1cImNvbnRlbnROb2RlXCI+PC9kaXY+PC9kaXY+PC9kaXY+IiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvVG9hc3RlckNsaXAge1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kb2pvVG9hc3RlckNvbnRhaW5lciB7XG5cdGRpc3BsYXk6IGJsb2NrO1xuXHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdHdpZHRoOiAxNy41ZW07XG5cdHotaW5kZXg6IDUwMDA7XG5cdG1hcmdpbjogMHB4O1xuXHRmb250OjAuNzVlbSBUYWhvbWEsIEhlbHZldGljYSwgVmVyZGFuYSwgQXJpYWw7XG59XG5cbi5kb2pvVG9hc3RlckNvbnRlbnR7XG5cdHBhZGRpbmc6MWVtO1xuXHRwYWRkaW5nLXRvcDowLjI1ZW07XG5cdGJhY2tncm91bmQ6IzczYzc0YTtcbn1cblxuLmRvam9Ub2FzdGVyTWVzc2FnZXsgXG5cdGNvbG9yOiNmZmY7XG59XG4uZG9qb1RvYXN0ZXJXYXJuaW5neyB9XG4uZG9qb1RvYXN0ZXJFcnJvcixcbi5kb2pvVG9hc3RlckZhdGFse1xuXHRmb250LXdlaWdodDpib2xkO1xuXHRjb2xvcjojZmZmO1xufVxuXG5cbi5kb2pvVG9hc3Rlcldhcm5pbmcgLmRvam9Ub2FzdGVyQ29udGVudHtcblx0cGFkZGluZzoxZW07XG5cdHBhZGRpbmctdG9wOjAuMjVlbTtcblx0YmFja2dyb3VuZDojZDRkOTQzO1xufSBcblxuLmRvam9Ub2FzdGVyRXJyb3IgLmRvam9Ub2FzdGVyQ29udGVudHtcblx0cGFkZGluZzoxZW07XG5cdHBhZGRpbmctdG9wOjAuMjVlbTtcblx0YmFja2dyb3VuZDojYzQ2NjAwO1xufSBcbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9Ub2FzdGVyLmNzcyIpLCBtZXNzYWdlVG9waWM6IiIsIG1lc3NhZ2VUeXBlczp7TUVTU0FHRToiTUVTU0FHRSIsIFdBUk5JTkc6IldBUk5JTkciLCBFUlJPUjoiRVJST1IiLCBGQVRBTDoiRkFUQUwifSwgZGVmYXVsdFR5cGU6Ik1FU1NBR0UiLCBjbGlwQ3NzQ2xhc3M6ImRvam9Ub2FzdGVyQ2xpcCIsIGNvbnRhaW5lckNzc0NsYXNzOiJkb2pvVG9hc3RlckNvbnRhaW5lciIsIGNvbnRlbnRDc3NDbGFzczoiZG9qb1RvYXN0ZXJDb250ZW50IiwgbWVzc2FnZUNzc0NsYXNzOiJkb2pvVG9hc3Rlck1lc3NhZ2UiLCB3YXJuaW5nQ3NzQ2xhc3M6ImRvam9Ub2FzdGVyV2FybmluZyIsIGVycm9yQ3NzQ2xhc3M6ImRvam9Ub2FzdGVyRXJyb3IiLCBmYXRhbENzc0NsYXNzOiJkb2pvVG9hc3RlckZhdGFsIiwgcG9zaXRpb25EaXJlY3Rpb246ImJyLXVwIiwgcG9zaXRpb25EaXJlY3Rpb25UeXBlczpbImJyLXVwIiwgImJyLWxlZnQiLCAiYmwtdXAiLCAiYmwtcmlnaHQiLCAidHItZG93biIsICJ0ci1sZWZ0IiwgInRsLWRvd24iLCAidGwtcmlnaHQiXSwgc2hvd0RlbGF5OjIwMDAsIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuaGlkZSgpOworCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmNsaXBOb2RlLCB0aGlzLmNsaXBDc3NDbGFzcyk7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy5jb250YWluZXJDc3NDbGFzcyk7CisJZG9qby5odG1sLnNldENsYXNzKHRoaXMuY29udGVudE5vZGUsIHRoaXMuY29udGVudENzc0NsYXNzKTsKKwlpZiAodGhpcy5tZXNzYWdlVG9waWMpIHsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodGhpcy5tZXNzYWdlVG9waWMsIHRoaXMsICJfaGFuZGxlTWVzc2FnZSIpOworCX0KKwlpZiAoIXRoaXMucG9zaXRpb25EaXJlY3Rpb24gfHwgIWRvam8ubGFuZy5pbkFycmF5KHRoaXMucG9zaXRpb25EaXJlY3Rpb25UeXBlcywgdGhpcy5wb3NpdGlvbkRpcmVjdGlvbikpIHsKKwkJdGhpcy5wb3NpdGlvbkRpcmVjdGlvbiA9IHRoaXMucG9zaXRpb25EaXJlY3Rpb25UeXBlcy5CUlU7CisJfQorfSwgX2hhbmRsZU1lc3NhZ2U6ZnVuY3Rpb24gKG1zZykgeworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcobXNnKSkgeworCQl0aGlzLnNldENvbnRlbnQobXNnKTsKKwl9IGVsc2UgeworCQl0aGlzLnNldENvbnRlbnQobXNnWyJtZXNzYWdlIl0sIG1zZ1sidHlwZSJdLCBtc2dbImRlbGF5Il0pOworCX0KK30sIHNldENvbnRlbnQ6ZnVuY3Rpb24gKG1zZywgbWVzc2FnZVR5cGUsIGRlbGF5KSB7CisJdmFyIGRlbGF5ID0gZGVsYXkgfHwgdGhpcy5zaG93RGVsYXk7CisJaWYgKHRoaXMuc2xpZGVBbmltICYmIHRoaXMuc2xpZGVBbmltLnN0YXR1cygpID09ICJwbGF5aW5nIikgeworCQlkb2pvLmxhbmcuc2V0VGltZW91dCg1MCwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJCXRoaXMuc2V0Q29udGVudChtc2csIG1lc3NhZ2VUeXBlKTsKKwkJfSkpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuc2xpZGVBbmltKSB7CisJCQl0aGlzLnNsaWRlQW5pbS5zdG9wKCk7CisJCQlpZiAodGhpcy5mYWRlQW5pbSkgeworCQkJCXRoaXMuZmFkZUFuaW0uc3RvcCgpOworCQkJfQorCQl9CisJfQorCWlmICghbXNnKSB7CisJCWRvam8uZGVidWcodGhpcy53aWRnZXRJZCArICIuc2V0Q29udGVudCgpIGluY29taW5nIGNvbnRlbnQgd2FzIG51bGwsIGlnbm9yaW5nLiIpOworCQlyZXR1cm47CisJfQorCWlmICghdGhpcy5wb3NpdGlvbkRpcmVjdGlvbiB8fCAhZG9qby5sYW5nLmluQXJyYXkodGhpcy5wb3NpdGlvbkRpcmVjdGlvblR5cGVzLCB0aGlzLnBvc2l0aW9uRGlyZWN0aW9uKSkgeworCQlkb2pvLnJhaXNlKHRoaXMud2lkZ2V0SWQgKyAiLnBvc2l0aW9uRGlyZWN0aW9uIGlzIGFuIGludmFsaWQgdmFsdWU6ICIgKyB0aGlzLnBvc2l0aW9uRGlyZWN0aW9uKTsKKwl9CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy5tZXNzYWdlQ3NzQ2xhc3MpOworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRhaW5lck5vZGUsIHRoaXMud2FybmluZ0Nzc0NsYXNzKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5jb250YWluZXJOb2RlLCB0aGlzLmVycm9yQ3NzQ2xhc3MpOworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRhaW5lck5vZGUsIHRoaXMuZmF0YWxDc3NDbGFzcyk7CisJZG9qby5odG1sLmNsZWFyT3BhY2l0eSh0aGlzLmNvbnRhaW5lck5vZGUpOworCWlmIChtc2cgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIG1zZyA9PSAic3RyaW5nIikgeworCQl0aGlzLmNvbnRlbnROb2RlLmlubmVySFRNTCA9IG1zZzsKKwl9IGVsc2UgeworCQlpZiAoZG9qby5odG1sLmlzTm9kZShtc2cpKSB7CisJCQl0aGlzLmNvbnRlbnROb2RlLmlubmVySFRNTCA9IGRvam8uaHRtbC5nZXRDb250ZW50QXNTdHJpbmcobXNnKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8ucmFpc2UoIlRvYXN0ZXIuc2V0Q29udGVudCgpOiBtc2cgaXMgb2YgdW5rbm93biB0eXBlOiIgKyBtc2cpOworCQl9CisJfQorCXN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKwkgIGNhc2UgdGhpcy5tZXNzYWdlVHlwZXMuV0FSTklORzoKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy53YXJuaW5nQ3NzQ2xhc3MpOworCQlicmVhazsKKwkgIGNhc2UgdGhpcy5tZXNzYWdlVHlwZXMuRVJST1I6CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmNvbnRhaW5lck5vZGUsIHRoaXMuZXJyb3JDc3NDbGFzcyk7CisJCWJyZWFrOworCSAgY2FzZSB0aGlzLm1lc3NhZ2VUeXBlcy5GQVRBTDoKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy5mYXRhbENzc0NsYXNzKTsKKwkJYnJlYWs7CisJICBjYXNlIHRoaXMubWVzc2FnZVR5cGVzLk1FU1NBR0U6CisJICBkZWZhdWx0OgorCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5jb250YWluZXJOb2RlLCB0aGlzLm1lc3NhZ2VDc3NDbGFzcyk7CisJCWJyZWFrOworCX0KKwl0aGlzLnNob3coKTsKKwl2YXIgbm9kZVNpemUgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuY29udGFpbmVyTm9kZSk7CisJaWYgKHRoaXMucG9zaXRpb25EaXJlY3Rpb24uaW5kZXhPZigiLXVwIikgPj0gMCkgeworCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUubGVmdCA9IDAgKyAicHgiOworCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUudG9wID0gbm9kZVNpemUuaGVpZ2h0ICsgMTAgKyAicHgiOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnBvc2l0aW9uRGlyZWN0aW9uLmluZGV4T2YoIi1sZWZ0IikgPj0gMCkgeworCQkJdGhpcy5jb250YWluZXJOb2RlLnN0eWxlLmxlZnQgPSBub2RlU2l6ZS53aWR0aCArIDEwICsgInB4IjsKKwkJCXRoaXMuY29udGFpbmVyTm9kZS5zdHlsZS50b3AgPSAwICsgInB4IjsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLnBvc2l0aW9uRGlyZWN0aW9uLmluZGV4T2YoIi1yaWdodCIpID49IDApIHsKKwkJCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUubGVmdCA9IDAgLSBub2RlU2l6ZS53aWR0aCAtIDEwICsgInB4IjsKKwkJCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUudG9wID0gMCArICJweCI7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLnBvc2l0aW9uRGlyZWN0aW9uLmluZGV4T2YoIi1kb3duIikgPj0gMCkgeworCQkJCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUubGVmdCA9IDAgKyAicHgiOworCQkJCQl0aGlzLmNvbnRhaW5lck5vZGUuc3R5bGUudG9wID0gMCAtIG5vZGVTaXplLmhlaWdodCAtIDEwICsgInB4IjsKKwkJCQl9IGVsc2UgeworCQkJCQlkb2pvLnJhaXNlKHRoaXMud2lkZ2V0SWQgKyAiLnBvc2l0aW9uRGlyZWN0aW9uIGlzIGFuIGludmFsaWQgdmFsdWU6ICIgKyB0aGlzLnBvc2l0aW9uRGlyZWN0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJdGhpcy5zbGlkZUFuaW0gPSBkb2pvLmxmeC5odG1sLnNsaWRlVG8odGhpcy5jb250YWluZXJOb2RlLCB7dG9wOjAsIGxlZnQ6MH0sIDQ1MCwgbnVsbCwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uIChub2RlcywgYW5pbSkgeworCQlkb2pvLmxhbmcuc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKGV2dCkgeworCQkJaWYgKHRoaXMuYmdJZnJhbWUpIHsKKwkJCQl0aGlzLmJnSWZyYW1lLmhpZGUoKTsKKwkJCX0KKwkJCXRoaXMuZmFkZUFuaW0gPSBkb2pvLmxmeC5odG1sLmZhZGVPdXQodGhpcy5jb250YWluZXJOb2RlLCAxMDAwLCBudWxsLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKGV2dCkgeworCQkJCXRoaXMuaGlkZSgpOworCQkJfSkpLnBsYXkoKTsKKwkJfSksIGRlbGF5KTsKKwl9KSkucGxheSgpOworfSwgX3BsYWNlQ2xpcDpmdW5jdGlvbiAoKSB7CisJdmFyIHNjcm9sbCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKTsKKwl2YXIgdmlldyA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCXZhciBub2RlU2l6ZSA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5jb250YWluZXJOb2RlKTsKKwl0aGlzLmNsaXBOb2RlLnN0eWxlLmhlaWdodCA9IG5vZGVTaXplLmhlaWdodCArICJweCI7CisJdGhpcy5jbGlwTm9kZS5zdHlsZS53aWR0aCA9IG5vZGVTaXplLndpZHRoICsgInB4IjsKKwlpZiAodGhpcy5wb3NpdGlvbkRpcmVjdGlvbi5tYXRjaCgvXnQvKSkgeworCQl0aGlzLmNsaXBOb2RlLnN0eWxlLnRvcCA9IHNjcm9sbC50b3AgKyAicHgiOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnBvc2l0aW9uRGlyZWN0aW9uLm1hdGNoKC9eYi8pKSB7CisJCQl0aGlzLmNsaXBOb2RlLnN0eWxlLnRvcCA9ICh2aWV3LmhlaWdodCAtIG5vZGVTaXplLmhlaWdodCAtIDIgKyBzY3JvbGwudG9wKSArICJweCI7CisJCX0KKwl9CisJaWYgKHRoaXMucG9zaXRpb25EaXJlY3Rpb24ubWF0Y2goL15bdGJdci0vKSkgeworCQl0aGlzLmNsaXBOb2RlLnN0eWxlLmxlZnQgPSAodmlldy53aWR0aCAtIG5vZGVTaXplLndpZHRoIC0gMSAtIHNjcm9sbC5sZWZ0KSArICJweCI7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMucG9zaXRpb25EaXJlY3Rpb24ubWF0Y2goL15bdGJdbC0vKSkgeworCQkJdGhpcy5jbGlwTm9kZS5zdHlsZS5sZWZ0ID0gMCArICJweCI7CisJCX0KKwl9CisJdGhpcy5jbGlwTm9kZS5zdHlsZS5jbGlwID0gInJlY3QoMHB4LCAiICsgbm9kZVNpemUud2lkdGggKyAicHgsICIgKyBub2RlU2l6ZS5oZWlnaHQgKyAicHgsIDBweCkiOworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWlmICghdGhpcy5iZ0lmcmFtZSkgeworCQkJdGhpcy5iZ0lmcmFtZSA9IG5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSh0aGlzLmNvbnRhaW5lck5vZGUpOworCQkJdGhpcy5iZ0lmcmFtZS5zZXRaSW5kZXgodGhpcy5jb250YWluZXJOb2RlKTsKKwkJfQorCQl0aGlzLmJnSWZyYW1lLm9uUmVzaXplZCgpOworCQl0aGlzLmJnSWZyYW1lLnNob3coKTsKKwl9Cit9LCBvblNlbGVjdDpmdW5jdGlvbiAoZSkgeworfSwgc2hvdzpmdW5jdGlvbiAoKSB7CisJZG9qby53aWRnZXQuVG9hc3Rlci5zdXBlcmNsYXNzLnNob3cuY2FsbCh0aGlzKTsKKwl0aGlzLl9wbGFjZUNsaXAoKTsKKwlpZiAoIXRoaXMuX3Njcm9sbENvbm5lY3RlZCkgeworCQl0aGlzLl9zY3JvbGxDb25uZWN0ZWQgPSB0cnVlOworCQlkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib25zY3JvbGwiLCB0aGlzLCAiX3BsYWNlQ2xpcCIpOworCX0KK30sIGhpZGU6ZnVuY3Rpb24gKCkgeworCWRvam8ud2lkZ2V0LlRvYXN0ZXIuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7CisJaWYgKHRoaXMuX3Njcm9sbENvbm5lY3RlZCkgeworCQl0aGlzLl9zY3JvbGxDb25uZWN0ZWQgPSBmYWxzZTsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbmRvdywgIm9uc2Nyb2xsIiwgdGhpcywgIl9wbGFjZUNsaXAiKTsKKwl9CisJZG9qby5odG1sLnNldE9wYWNpdHkodGhpcy5jb250YWluZXJOb2RlLCAxKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub2dnbGVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub2dnbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjA4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RvZ2dsZXIuanMKQEAgLTAsMCArMSwyNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVG9nZ2xlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub2dnbGVyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge3RhcmdldElkOiIiLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZG9tTm9kZSwgIm9uY2xpY2siLCB0aGlzLCAib25DbGljayIpOworfSwgb25DbGljazpmdW5jdGlvbiAoKSB7CisJdmFyIHBhbmUgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMudGFyZ2V0SWQpOworCWlmICghcGFuZSkgeworCQlyZXR1cm47CisJfQorCXBhbmUuZXhwbG9kZVNyYyA9IHRoaXMuZG9tTm9kZTsKKwlwYW5lLnRvZ2dsZVNob3dpbmcoKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub29sYmFyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub29sYmFyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGY0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Rvb2xiYXIuanMKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRvb2xiYXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuc3R5bGUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVG9vbGJhckNvbnRhaW5lciIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtpc0NvbnRhaW5lcjp0cnVlLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cInRvb2xiYXJDb250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCI+PC9kaXY+IiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii50b29sYmFyQ29udGFpbmVyIHtcblx0Ym9yZGVyLWJvdHRvbSA6IDA7XG5cdGJhY2tncm91bmQtY29sb3IgOiAjZGVmO1xuXHRjb2xvciA6IEJ1dHRvblRleHQ7XG5cdGZvbnQgOiBNZW51O1xuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3Rvb2xiYXItYmcuZ2lmKTtcbn1cblxuLnRvb2xiYXIge1xuXHRwYWRkaW5nIDogMnB4IDRweDtcblx0bWluLWhlaWdodCA6IDI2cHg7XG5cdF9oZWlnaHQgOiAyNnB4O1xufVxuXG4udG9vbGJhckl0ZW0ge1xuXHRmbG9hdCA6IGxlZnQ7XG5cdHBhZGRpbmcgOiAxcHggMnB4O1xuXHRtYXJnaW4gOiAwIDJweCAxcHggMDtcblx0Y3Vyc29yIDogcG9pbnRlcjtcbn1cblxuLnRvb2xiYXJJdGVtLnNlbGVjdGVkLCAudG9vbGJhckl0ZW0uZG93biB7XG5cdG1hcmdpbiA6IDFweCAxcHggMCAxcHg7XG5cdHBhZGRpbmcgOiAwcHggMXB4O1xuXHRib3JkZXIgOiAxcHggc29saWQgI2JiZjtcblx0YmFja2dyb3VuZC1jb2xvciA6ICNmYWZhZmY7XG59XG5cbi50b29sYmFyQnV0dG9uIGltZyB7XG5cdHZlcnRpY2FsLWFsaWduIDogYm90dG9tO1xufVxuXG4udG9vbGJhckJ1dHRvbiBzcGFuIHtcblx0bGluZS1oZWlnaHQgOiAxNnB4O1xuXHR2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTtcbn1cblxuLnRvb2xiYXJCdXR0b24uaG92ZXIge1xuXHRwYWRkaW5nIDogMHB4IDFweDtcblx0Ym9yZGVyIDogMXB4IHNvbGlkICM5OWM7XG59XG5cbi50b29sYmFySXRlbS5kaXNhYmxlZCB7XG5cdG9wYWNpdHkgOiAwLjM7XG5cdGZpbHRlciA6IGFscGhhKG9wYWNpdHk9MzApO1xuXHRjdXJzb3IgOiBkZWZhdWx0O1xufVxuXG4udG9vbGJhclNlcGFyYXRvciB7XG5cdGN1cnNvciA6IGRlZmF1bHQ7XG59XG5cbi50b29sYmFyRmxleGlibGVTcGFjZSB7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvVG9vbGJhci5jc3MiKSwgZ2V0SXRlbTpmdW5jdGlvbiAobmFtZSkgeworCWlmIChuYW1lIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0pIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFyKSB7CisJCQl2YXIgaXRlbSA9IGNoaWxkLmdldEl0ZW0obmFtZSk7CisJCQlpZiAoaXRlbSkgeworCQkJCXJldHVybiBpdGVtOworCQkJfQorCQl9CisJfQorCXJldHVybiBudWxsOworfSwgZ2V0SXRlbXM6ZnVuY3Rpb24gKCkgeworCXZhciBpdGVtcyA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFyKSB7CisJCQlpdGVtcyA9IGl0ZW1zLmNvbmNhdChjaGlsZC5nZXRJdGVtcygpKTsKKwkJfQorCX0KKwlyZXR1cm4gaXRlbXM7Cit9LCBlbmFibGU6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFyKSB7CisJCQljaGlsZC5lbmFibGUuYXBwbHkoY2hpbGQsIGFyZ3VtZW50cyk7CisJCX0KKwl9Cit9LCBkaXNhYmxlOmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhcikgeworCQkJY2hpbGQuZGlzYWJsZS5hcHBseShjaGlsZCwgYXJndW1lbnRzKTsKKwkJfQorCX0KK30sIHNlbGVjdDpmdW5jdGlvbiAobmFtZSkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFyKSB7CisJCQljaGlsZC5zZWxlY3QoYXJndW1lbnRzKTsKKwkJfQorCX0KK30sIGRlc2VsZWN0OmZ1bmN0aW9uIChuYW1lKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CisJCWlmIChjaGlsZCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXIpIHsKKwkJCWNoaWxkLmRlc2VsZWN0KGFyZ3VtZW50cyk7CisJCX0KKwl9Cit9LCBnZXRJdGVtc1N0YXRlOmZ1bmN0aW9uICgpIHsKKwl2YXIgdmFsdWVzID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CisJCWlmIChjaGlsZCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXIpIHsKKwkJCWRvam8ubGFuZy5taXhpbih2YWx1ZXMsIGNoaWxkLmdldEl0ZW1zU3RhdGUoKSk7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlczsKK30sIGdldEl0ZW1zQWN0aXZlU3RhdGU6ZnVuY3Rpb24gKCkgeworCXZhciB2YWx1ZXMgPSB7fTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhcikgeworCQkJZG9qby5sYW5nLm1peGluKHZhbHVlcywgY2hpbGQuZ2V0SXRlbXNBY3RpdmVTdGF0ZSgpKTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWVzOworfSwgZ2V0SXRlbXNTZWxlY3RlZFN0YXRlOmZ1bmN0aW9uICgpIHsKKwl2YXIgdmFsdWVzID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CisJCWlmIChjaGlsZCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXIpIHsKKwkJCWRvam8ubGFuZy5taXhpbih2YWx1ZXMsIGNoaWxkLmdldEl0ZW1zU2VsZWN0ZWRTdGF0ZSgpKTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWVzOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFyIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge2lzQ29udGFpbmVyOnRydWUsIHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwidG9vbGJhclwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIiB1bnNlbGVjdGFibGU9XCJvblwiIGRvam9Pbk1vdXNlb3Zlcj1cIl9vbm1vdXNlb3ZlclwiIGRvam9Pbk1vdXNlb3V0PVwiX29ubW91c2VvdXRcIiBkb2pvT25DbGljaz1cIl9vbmNsaWNrXCIgZG9qb09uTW91c2Vkb3duPVwiX29ubW91c2Vkb3duXCIgZG9qb09uTW91c2V1cD1cIl9vbm1vdXNldXBcIj48L2Rpdj4iLCBfZ2V0SXRlbTpmdW5jdGlvbiAobm9kZSkgeworCXZhciBzdGFydCA9IG5ldyBEYXRlKCk7CisJdmFyIHdpZGdldCA9IG51bGw7CisJd2hpbGUgKG5vZGUgJiYgbm9kZSAhPSB0aGlzLmRvbU5vZGUpIHsKKwkJaWYgKGRvam8uaHRtbC5oYXNDbGFzcyhub2RlLCAidG9vbGJhckl0ZW0iKSkgeworCQkJdmFyIHdpZGdldHMgPSBkb2pvLndpZGdldC5tYW5hZ2VyLmdldFdpZGdldHNCeUZpbHRlcihmdW5jdGlvbiAodykgeworCQkJCXJldHVybiB3LmRvbU5vZGUgPT0gbm9kZTsKKwkJCX0pOworCQkJaWYgKHdpZGdldHMubGVuZ3RoID09IDEpIHsKKwkJCQl3aWRnZXQgPSB3aWRnZXRzWzBdOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAod2lkZ2V0cy5sZW5ndGggPiAxKSB7CisJCQkJCWRvam8ucmFpc2UoIlRvb2xiYXIuX2dldEl0ZW06IE1vcmUgdGhhbiBvbmUgd2lkZ2V0IG1hdGNoZXMgdGhlIG5vZGUiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwl9CisJcmV0dXJuIHdpZGdldDsKK30sIF9vbm1vdXNlb3ZlcjpmdW5jdGlvbiAoZSkgeworCXZhciB3aWRnZXQgPSB0aGlzLl9nZXRJdGVtKGUudGFyZ2V0KTsKKwlpZiAod2lkZ2V0ICYmIHdpZGdldC5fb25tb3VzZW92ZXIpIHsKKwkJd2lkZ2V0Ll9vbm1vdXNlb3ZlcihlKTsKKwl9Cit9LCBfb25tb3VzZW91dDpmdW5jdGlvbiAoZSkgeworCXZhciB3aWRnZXQgPSB0aGlzLl9nZXRJdGVtKGUudGFyZ2V0KTsKKwlpZiAod2lkZ2V0ICYmIHdpZGdldC5fb25tb3VzZW91dCkgeworCQl3aWRnZXQuX29ubW91c2VvdXQoZSk7CisJfQorfSwgX29uY2xpY2s6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgd2lkZ2V0ID0gdGhpcy5fZ2V0SXRlbShlLnRhcmdldCk7CisJaWYgKHdpZGdldCAmJiB3aWRnZXQuX29uY2xpY2spIHsKKwkJd2lkZ2V0Ll9vbmNsaWNrKGUpOworCX0KK30sIF9vbm1vdXNlZG93bjpmdW5jdGlvbiAoZSkgeworCXZhciB3aWRnZXQgPSB0aGlzLl9nZXRJdGVtKGUudGFyZ2V0KTsKKwlpZiAod2lkZ2V0ICYmIHdpZGdldC5fb25tb3VzZWRvd24pIHsKKwkJd2lkZ2V0Ll9vbm1vdXNlZG93bihlKTsKKwl9Cit9LCBfb25tb3VzZXVwOmZ1bmN0aW9uIChlKSB7CisJdmFyIHdpZGdldCA9IHRoaXMuX2dldEl0ZW0oZS50YXJnZXQpOworCWlmICh3aWRnZXQgJiYgd2lkZ2V0Ll9vbm1vdXNldXApIHsKKwkJd2lkZ2V0Ll9vbm1vdXNldXAoZSk7CisJfQorfSwgYWRkQ2hpbGQ6ZnVuY3Rpb24gKGl0ZW0sIHBvcywgcHJvcHMpIHsKKwl2YXIgd2lkZ2V0ID0gZG9qby53aWRnZXQuVG9vbGJhckl0ZW0ubWFrZShpdGVtLCBudWxsLCBwcm9wcyk7CisJdmFyIHJldCA9IGRvam8ud2lkZ2V0LlRvb2xiYXIuc3VwZXJjbGFzcy5hZGRDaGlsZC5jYWxsKHRoaXMsIHdpZGdldCwgbnVsbCwgcG9zLCBudWxsKTsKKwlyZXR1cm4gcmV0OworfSwgcHVzaDpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5hZGRDaGlsZChhcmd1bWVudHNbaV0pOworCX0KK30sIGdldEl0ZW06ZnVuY3Rpb24gKG5hbWUpIHsKKwlpZiAobmFtZSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXJJdGVtKSB7CisJCXJldHVybiBuYW1lOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0gJiYgY2hpbGQuX25hbWUgPT0gbmFtZSkgeworCQkJcmV0dXJuIGNoaWxkOworCQl9CisJfQorCXJldHVybiBudWxsOworfSwgZ2V0SXRlbXM6ZnVuY3Rpb24gKCkgeworCXZhciBpdGVtcyA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQkJaXRlbXMucHVzaChjaGlsZCk7CisJCX0KKwl9CisJcmV0dXJuIGl0ZW1zOworfSwgZ2V0SXRlbXNTdGF0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIHZhbHVlcyA9IHt9OworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQkJdmFsdWVzW2NoaWxkLl9uYW1lXSA9IHtzZWxlY3RlZDpjaGlsZC5fc2VsZWN0ZWQsIGVuYWJsZWQ6IWNoaWxkLmRpc2FibGVkfTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWVzOworfSwgZ2V0SXRlbXNBY3RpdmVTdGF0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIHZhbHVlcyA9IHRoaXMuZ2V0SXRlbXNTdGF0ZSgpOworCWZvciAodmFyIGl0ZW0gaW4gdmFsdWVzKSB7CisJCXZhbHVlc1tpdGVtXSA9IHZhbHVlc1tpdGVtXS5lbmFibGVkOworCX0KKwlyZXR1cm4gdmFsdWVzOworfSwgZ2V0SXRlbXNTZWxlY3RlZFN0YXRlOmZ1bmN0aW9uICgpIHsKKwl2YXIgdmFsdWVzID0gdGhpcy5nZXRJdGVtc1N0YXRlKCk7CisJZm9yICh2YXIgaXRlbSBpbiB2YWx1ZXMpIHsKKwkJdmFsdWVzW2l0ZW1dID0gdmFsdWVzW2l0ZW1dLnNlbGVjdGVkOworCX0KKwlyZXR1cm4gdmFsdWVzOworfSwgZW5hYmxlOmZ1bmN0aW9uICgpIHsKKwl2YXIgaXRlbXMgPSBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzIDogdGhpcy5jaGlsZHJlbjsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjaGlsZCA9IHRoaXMuZ2V0SXRlbShpdGVtc1tpXSk7CisJCWlmIChjaGlsZCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXJJdGVtKSB7CisJCQljaGlsZC5lbmFibGUoZmFsc2UsIHRydWUpOworCQl9CisJfQorfSwgZGlzYWJsZTpmdW5jdGlvbiAoKSB7CisJdmFyIGl0ZW1zID0gYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50cyA6IHRoaXMuY2hpbGRyZW47CisJZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmdldEl0ZW0oaXRlbXNbaV0pOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQkJY2hpbGQuZGlzYWJsZSgpOworCQl9CisJfQorfSwgc2VsZWN0OmZ1bmN0aW9uICgpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQl2YXIgbmFtZSA9IGFyZ3VtZW50c1tpXTsKKwkJdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7CisJCWlmIChpdGVtKSB7CisJCQlpdGVtLnNlbGVjdCgpOworCQl9CisJfQorfSwgZGVzZWxlY3Q6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBuYW1lID0gYXJndW1lbnRzW2ldOworCQl2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTsKKwkJaWYgKGl0ZW0pIHsKKwkJCWl0ZW0uZGlzYWJsZSgpOworCQl9CisJfQorfSwgc2V0VmFsdWU6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArPSAyKSB7CisJCXZhciBuYW1lID0gYXJndW1lbnRzW2ldLCB2YWx1ZSA9IGFyZ3VtZW50c1tpICsgMV07CisJCXZhciBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpOworCQlpZiAoaXRlbSkgeworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQkJCWl0ZW0uc2V0VmFsdWUodmFsdWUpOworCQkJfQorCQl9CisJfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFySXRlbSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gdW5zZWxlY3RhYmxlPVwib25cIiBjbGFzcz1cInRvb2xiYXJJdGVtXCI+PC9zcGFuPiIsIF9uYW1lOm51bGwsIGdldE5hbWU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9uYW1lOworfSwgc2V0TmFtZTpmdW5jdGlvbiAodmFsdWUpIHsKKwlyZXR1cm4gKHRoaXMuX25hbWUgPSB2YWx1ZSk7Cit9LCBnZXRWYWx1ZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOworfSwgc2V0VmFsdWU6ZnVuY3Rpb24gKHZhbHVlKSB7CisJcmV0dXJuIHRoaXMuc2V0TmFtZSh2YWx1ZSk7Cit9LCBfc2VsZWN0ZWQ6ZmFsc2UsIGlzU2VsZWN0ZWQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9zZWxlY3RlZDsKK30sIHNldFNlbGVjdGVkOmZ1bmN0aW9uIChpcywgZm9yY2UsIHByZXZlbnRFdmVudCkgeworCWlmICghdGhpcy5fdG9nZ2xlSXRlbSAmJiAhZm9yY2UpIHsKKwkJcmV0dXJuOworCX0KKwlpcyA9IEJvb2xlYW4oaXMpOworCWlmIChmb3JjZSB8fCAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9zZWxlY3RlZCAhPSBpcykgeworCQl0aGlzLl9zZWxlY3RlZCA9IGlzOworCQl0aGlzLnVwZGF0ZSgpOworCQlpZiAoIXByZXZlbnRFdmVudCkgeworCQkJdGhpcy5fZmlyZUV2ZW50KGlzID8gIm9uU2VsZWN0IiA6ICJvbkRlc2VsZWN0Iik7CisJCQl0aGlzLl9maXJlRXZlbnQoIm9uQ2hhbmdlU2VsZWN0Iik7CisJCX0KKwl9Cit9LCBzZWxlY3Q6ZnVuY3Rpb24gKGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlyZXR1cm4gdGhpcy5zZXRTZWxlY3RlZCh0cnVlLCBmb3JjZSwgcHJldmVudEV2ZW50KTsKK30sIGRlc2VsZWN0OmZ1bmN0aW9uIChmb3JjZSwgcHJldmVudEV2ZW50KSB7CisJcmV0dXJuIHRoaXMuc2V0U2VsZWN0ZWQoZmFsc2UsIGZvcmNlLCBwcmV2ZW50RXZlbnQpOworfSwgX3RvZ2dsZUl0ZW06ZmFsc2UsIGlzVG9nZ2xlSXRlbTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX3RvZ2dsZUl0ZW07Cit9LCBzZXRUb2dnbGVJdGVtOmZ1bmN0aW9uICh2YWx1ZSkgeworCXRoaXMuX3RvZ2dsZUl0ZW0gPSBCb29sZWFuKHZhbHVlKTsKK30sIHRvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uIChmb3JjZSkgeworCXJldHVybiB0aGlzLnNldFNlbGVjdGVkKCF0aGlzLl9zZWxlY3RlZCwgZm9yY2UpOworfSwgaXNFbmFibGVkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIXRoaXMuZGlzYWJsZWQ7Cit9LCBzZXRFbmFibGVkOmZ1bmN0aW9uIChpcywgZm9yY2UsIHByZXZlbnRFdmVudCkgeworCWlzID0gQm9vbGVhbihpcyk7CisJaWYgKGZvcmNlIHx8IHRoaXMuZGlzYWJsZWQgPT0gaXMpIHsKKwkJdGhpcy5kaXNhYmxlZCA9ICFpczsKKwkJdGhpcy51cGRhdGUoKTsKKwkJaWYgKCFwcmV2ZW50RXZlbnQpIHsKKwkJCXRoaXMuX2ZpcmVFdmVudCh0aGlzLmRpc2FibGVkID8gIm9uRGlzYWJsZSIgOiAib25FbmFibGUiKTsKKwkJCXRoaXMuX2ZpcmVFdmVudCgib25DaGFuZ2VFbmFibGVkIik7CisJCX0KKwl9CisJcmV0dXJuICF0aGlzLmRpc2FibGVkOworfSwgZW5hYmxlOmZ1bmN0aW9uIChmb3JjZSwgcHJldmVudEV2ZW50KSB7CisJcmV0dXJuIHRoaXMuc2V0RW5hYmxlZCh0cnVlLCBmb3JjZSwgcHJldmVudEV2ZW50KTsKK30sIGRpc2FibGU6ZnVuY3Rpb24gKGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlyZXR1cm4gdGhpcy5zZXRFbmFibGVkKGZhbHNlLCBmb3JjZSwgcHJldmVudEV2ZW50KTsKK30sIHRvZ2dsZUVuYWJsZWQ6ZnVuY3Rpb24gKGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlyZXR1cm4gdGhpcy5zZXRFbmFibGVkKHRoaXMuZGlzYWJsZWQsIGZvcmNlLCBwcmV2ZW50RXZlbnQpOworfSwgX2ljb246bnVsbCwgZ2V0SWNvbjpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMuX2ljb247Cit9LCBzZXRJY29uOmZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciBpY29uID0gZG9qby53aWRnZXQuSWNvbi5tYWtlKHZhbHVlKTsKKwlpZiAodGhpcy5faWNvbikgeworCQl0aGlzLl9pY29uLnNldEljb24oaWNvbik7CisJfSBlbHNlIHsKKwkJdGhpcy5faWNvbiA9IGljb247CisJfQorCXZhciBpY29uTm9kZSA9IHRoaXMuX2ljb24uZ2V0Tm9kZSgpOworCWlmIChpY29uTm9kZS5wYXJlbnROb2RlICE9IHRoaXMuZG9tTm9kZSkgeworCQlpZiAodGhpcy5kb21Ob2RlLmhhc0NoaWxkTm9kZXMoKSkgeworCQkJdGhpcy5kb21Ob2RlLmluc2VydEJlZm9yZShpY29uTm9kZSwgdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQpOworCQl9IGVsc2UgeworCQkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKGljb25Ob2RlKTsKKwkJfQorCX0KKwlyZXR1cm4gdGhpcy5faWNvbjsKK30sIF9sYWJlbDoiIiwgZ2V0TGFiZWw6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLl9sYWJlbDsKK30sIHNldExhYmVsOmZ1bmN0aW9uICh2YWx1ZSkgeworCXZhciByZXQgPSAodGhpcy5fbGFiZWwgPSB2YWx1ZSk7CisJaWYgKCF0aGlzLmxhYmVsTm9kZSkgeworCQl0aGlzLmxhYmVsTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMubGFiZWxOb2RlKTsKKwl9CisJdGhpcy5sYWJlbE5vZGUuaW5uZXJIVE1MID0gIiI7CisJdGhpcy5sYWJlbE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5fbGFiZWwpKTsKKwl0aGlzLnVwZGF0ZSgpOworCXJldHVybiByZXQ7Cit9LCB1cGRhdGU6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmRpc2FibGVkKSB7CisJCXRoaXMuX3NlbGVjdGVkID0gZmFsc2U7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsICJkaXNhYmxlZCIpOworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG93biIpOworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCAiaG92ZXIiKTsKKwl9IGVsc2UgeworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCAiZGlzYWJsZWQiKTsKKwkJaWYgKHRoaXMuX3NlbGVjdGVkKSB7CisJCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAic2VsZWN0ZWQiKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRvbU5vZGUsICJzZWxlY3RlZCIpOworCQl9CisJfQorCXRoaXMuX3VwZGF0ZUljb24oKTsKK30sIF91cGRhdGVJY29uOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5faWNvbikgeworCQlpZiAodGhpcy5kaXNhYmxlZCkgeworCQkJdGhpcy5faWNvbi5kaXNhYmxlKCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5fY3NzSG92ZXIpIHsKKwkJCQl0aGlzLl9pY29uLmhvdmVyKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLl9zZWxlY3RlZCkgeworCQkJCQl0aGlzLl9pY29uLnNlbGVjdCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuX2ljb24uZW5hYmxlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfSwgX2ZpcmVFdmVudDpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKHR5cGVvZiB0aGlzW2V2dF0gPT0gImZ1bmN0aW9uIikgeworCQl2YXIgYXJncyA9IFt0aGlzXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworCQl9CisJCXRoaXNbZXZ0XS5hcHBseSh0aGlzLCBhcmdzKTsKKwl9Cit9LCBfb25tb3VzZW92ZXI6ZnVuY3Rpb24gKGUpIHsKKwlpZiAodGhpcy5kaXNhYmxlZCkgeworCQlyZXR1cm47CisJfQorCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsICJob3ZlciIpOworCXRoaXMuX2ZpcmVFdmVudCgib25Nb3VzZU92ZXIiKTsKK30sIF9vbm1vdXNlb3V0OmZ1bmN0aW9uIChlKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgImhvdmVyIik7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgImRvd24iKTsKKwlpZiAoIXRoaXMuX3NlbGVjdGVkKSB7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRvbU5vZGUsICJzZWxlY3RlZCIpOworCX0KKwl0aGlzLl9maXJlRXZlbnQoIm9uTW91c2VPdXQiKTsKK30sIF9vbmNsaWNrOmZ1bmN0aW9uIChlKSB7CisJaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLl90b2dnbGVJdGVtKSB7CisJCXRoaXMuX2ZpcmVFdmVudCgib25DbGljayIpOworCX0KK30sIF9vbm1vdXNlZG93bjpmdW5jdGlvbiAoZSkgeworCWlmIChlLnByZXZlbnREZWZhdWx0KSB7CisJCWUucHJldmVudERlZmF1bHQoKTsKKwl9CisJaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG93biIpOworCWlmICh0aGlzLl90b2dnbGVJdGVtKSB7CisJCWlmICh0aGlzLnBhcmVudC5wcmV2ZW50RGVzZWxlY3QgJiYgdGhpcy5fc2VsZWN0ZWQpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnRvZ2dsZVNlbGVjdGVkKCk7CisJfQorCXRoaXMuX2ZpcmVFdmVudCgib25Nb3VzZURvd24iKTsKK30sIF9vbm1vdXNldXA6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCAiZG93biIpOworCXRoaXMuX2ZpcmVFdmVudCgib25Nb3VzZVVwIik7Cit9LCBvbkNsaWNrOmZ1bmN0aW9uICgpIHsKK30sIG9uTW91c2VPdmVyOmZ1bmN0aW9uICgpIHsKK30sIG9uTW91c2VPdXQ6ZnVuY3Rpb24gKCkgeworfSwgb25Nb3VzZURvd246ZnVuY3Rpb24gKCkgeworfSwgb25Nb3VzZVVwOmZ1bmN0aW9uICgpIHsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJaWYgKGFyZ3MubmFtZSkgeworCQl0aGlzLl9uYW1lID0gYXJncy5uYW1lOworCX0KKwlpZiAoYXJncy5zZWxlY3RlZCkgeworCQl0aGlzLnNlbGVjdCgpOworCX0KKwlpZiAoYXJncy5kaXNhYmxlZCkgeworCQl0aGlzLmRpc2FibGUoKTsKKwl9CisJaWYgKGFyZ3MubGFiZWwpIHsKKwkJdGhpcy5zZXRMYWJlbChhcmdzLmxhYmVsKTsKKwl9CisJaWYgKGFyZ3MuaWNvbikgeworCQl0aGlzLnNldEljb24oYXJncy5pY29uKTsKKwl9CisJaWYgKGFyZ3MudG9nZ2xlaXRlbSB8fCBhcmdzLnRvZ2dsZUl0ZW0pIHsKKwkJdGhpcy5zZXRUb2dnbGVJdGVtKHRydWUpOworCX0KK319KTsKK2Rvam8ud2lkZ2V0LlRvb2xiYXJJdGVtLm1ha2UgPSBmdW5jdGlvbiAod2gsIHdoSXNUeXBlLCBwcm9wcykgeworCXZhciBpdGVtID0gbnVsbDsKKwlpZiAod2ggaW5zdGFuY2VvZiBBcnJheSkgeworCQlpdGVtID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyQnV0dG9uR3JvdXAiLCBwcm9wcyk7CisJCWl0ZW0uc2V0TmFtZSh3aFswXSk7CisJCWZvciAodmFyIGkgPSAxOyBpIDwgd2gubGVuZ3RoOyBpKyspIHsKKwkJCWl0ZW0uYWRkQ2hpbGQod2hbaV0pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHdoIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0pIHsKKwkJCWl0ZW0gPSB3aDsKKwkJfSBlbHNlIHsKKwkJCWlmICh3aCBpbnN0YW5jZW9mIGRvam8udXJpLlVyaSkgeworCQkJCWl0ZW0gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRvb2xiYXJCdXR0b24iLCBkb2pvLmxhbmcubWl4aW4ocHJvcHMgfHwge30sIHtpY29uOm5ldyBkb2pvLndpZGdldC5JY29uKHdoLnRvU3RyaW5nKCkpfSkpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAod2hJc1R5cGUpIHsKKwkJCQkJaXRlbSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCh3aCwgcHJvcHMpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0eXBlb2Ygd2ggPT0gInN0cmluZyIgfHwgd2ggaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQkJCXN3aXRjaCAod2guY2hhckF0KDApKSB7CisJCQkJCQkgIGNhc2UgInwiOgorCQkJCQkJICBjYXNlICItIjoKKwkJCQkJCSAgY2FzZSAiLyI6CisJCQkJCQkJaXRlbSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVG9vbGJhclNlcGFyYXRvciIsIHByb3BzKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCSAgY2FzZSAiICI6CisJCQkJCQkJaWYgKHdoLmxlbmd0aCA9PSAxKSB7CisJCQkJCQkJCWl0ZW0gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRvb2xiYXJTcGFjZSIsIHByb3BzKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpdGVtID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyRmxleGlibGVTcGFjZSIsIHByb3BzKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGRlZmF1bHQ6CisJCQkJCQkJaWYgKC9cLihnaWZ8anBnfGpwZWd8cG5nKSQvaS50ZXN0KHdoKSkgeworCQkJCQkJCQlpdGVtID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyQnV0dG9uIiwgZG9qby5sYW5nLm1peGluKHByb3BzIHx8IHt9LCB7aWNvbjpuZXcgZG9qby53aWRnZXQuSWNvbih3aC50b1N0cmluZygpKX0pKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpdGVtID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUb29sYmFyQnV0dG9uIiwgZG9qby5sYW5nLm1peGluKHByb3BzIHx8IHt9LCB7bGFiZWw6d2gudG9TdHJpbmcoKX0pKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAod2ggJiYgd2gudGFnTmFtZSAmJiAvXmltZyQvaS50ZXN0KHdoLnRhZ05hbWUpKSB7CisJCQkJCQkJaXRlbSA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVG9vbGJhckJ1dHRvbiIsIGRvam8ubGFuZy5taXhpbihwcm9wcyB8fCB7fSwge2ljb246d2h9KSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWl0ZW0gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRvb2xiYXJCdXR0b24iLCBkb2pvLmxhbmcubWl4aW4ocHJvcHMgfHwge30sIHtsYWJlbDp3aC50b1N0cmluZygpfSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBpdGVtOworfTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVG9vbGJhckJ1dHRvbkdyb3VwIiwgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0sIHtpc0NvbnRhaW5lcjp0cnVlLCB0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gdW5zZWxlY3RhYmxlPVwib25cIiBjbGFzcz1cInRvb2xiYXJCdXR0b25Hcm91cFwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIj48L3NwYW4+IiwgZGVmYXVsdEJ1dHRvbjoiIiwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuX2luamVjdENoaWxkKHRoaXMuY2hpbGRyZW5baV0pOworCX0KK30sIGFkZENoaWxkOmZ1bmN0aW9uIChpdGVtLCBwb3MsIHByb3BzKSB7CisJdmFyIHdpZGdldCA9IGRvam8ud2lkZ2V0LlRvb2xiYXJJdGVtLm1ha2UoaXRlbSwgbnVsbCwgZG9qby5sYW5nLm1peGluKHByb3BzIHx8IHt9LCB7dG9nZ2xlSXRlbTp0cnVlfSkpOworCXZhciByZXQgPSBkb2pvLndpZGdldC5Ub29sYmFyQnV0dG9uR3JvdXAuc3VwZXJjbGFzcy5hZGRDaGlsZC5jYWxsKHRoaXMsIHdpZGdldCwgbnVsbCwgcG9zLCBudWxsKTsKKwl0aGlzLl9pbmplY3RDaGlsZCh3aWRnZXQpOworCXJldHVybiByZXQ7Cit9LCBfaW5qZWN0Q2hpbGQ6ZnVuY3Rpb24gKHdpZGdldCkgeworCWRvam8uZXZlbnQuY29ubmVjdCh3aWRnZXQsICJvblNlbGVjdCIsIHRoaXMsICJvbkNoaWxkU2VsZWN0ZWQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3Qod2lkZ2V0LCAib25EZXNlbGVjdCIsIHRoaXMsICJvbkNoaWxkRGVTZWxlY3RlZCIpOworCWlmICh3aWRnZXQuX25hbWUgPT0gdGhpcy5kZWZhdWx0QnV0dG9uIHx8ICh0eXBlb2YgdGhpcy5kZWZhdWx0QnV0dG9uID09ICJudW1iZXIiICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMSA9PSB0aGlzLmRlZmF1bHRCdXR0b24pKSB7CisJCXdpZGdldC5zZWxlY3QoZmFsc2UsIHRydWUpOworCX0KK30sIGdldEl0ZW06ZnVuY3Rpb24gKG5hbWUpIHsKKwlpZiAobmFtZSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRvb2xiYXJJdGVtKSB7CisJCXJldHVybiBuYW1lOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0gJiYgY2hpbGQuX25hbWUgPT0gbmFtZSkgeworCQkJcmV0dXJuIGNoaWxkOworCQl9CisJfQorCXJldHVybiBudWxsOworfSwgZ2V0SXRlbXM6ZnVuY3Rpb24gKCkgeworCXZhciBpdGVtcyA9IFtdOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5Ub29sYmFySXRlbSkgeworCQkJaXRlbXMucHVzaChjaGlsZCk7CisJCX0KKwl9CisJcmV0dXJuIGl0ZW1zOworfSwgb25DaGlsZFNlbGVjdGVkOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5zZWxlY3QoZS5fbmFtZSk7Cit9LCBvbkNoaWxkRGVTZWxlY3RlZDpmdW5jdGlvbiAoZSkgeworCXRoaXMuX2ZpcmVFdmVudCgib25DaGFuZ2VTZWxlY3QiLCB0aGlzLl92YWx1ZSk7Cit9LCBlbmFibGU6ZnVuY3Rpb24gKGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0pIHsKKwkJCWNoaWxkLmVuYWJsZShmb3JjZSwgcHJldmVudEV2ZW50KTsKKwkJCWlmIChjaGlsZC5fbmFtZSA9PSB0aGlzLl92YWx1ZSkgeworCQkJCWNoaWxkLnNlbGVjdChmb3JjZSwgcHJldmVudEV2ZW50KTsKKwkJCX0KKwkJfQorCX0KK30sIGRpc2FibGU6ZnVuY3Rpb24gKGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0pIHsKKwkJCWNoaWxkLmRpc2FibGUoZm9yY2UsIHByZXZlbnRFdmVudCk7CisJCX0KKwl9Cit9LCBfdmFsdWU6IiIsIGdldFZhbHVlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5fdmFsdWU7Cit9LCBzZWxlY3Q6ZnVuY3Rpb24gKG5hbWUsIGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0pIHsKKwkJCWlmIChjaGlsZC5fbmFtZSA9PSBuYW1lKSB7CisJCQkJY2hpbGQuc2VsZWN0KGZvcmNlLCBwcmV2ZW50RXZlbnQpOworCQkJCXRoaXMuX3ZhbHVlID0gbmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJY2hpbGQuZGVzZWxlY3QodHJ1ZSwgdHJ1ZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKCFwcmV2ZW50RXZlbnQpIHsKKwkJdGhpcy5fZmlyZUV2ZW50KCJvblNlbGVjdCIsIHRoaXMuX3ZhbHVlKTsKKwkJdGhpcy5fZmlyZUV2ZW50KCJvbkNoYW5nZVNlbGVjdCIsIHRoaXMuX3ZhbHVlKTsKKwl9Cit9LCBzZXRWYWx1ZTp0aGlzLnNlbGVjdCwgcHJldmVudERlc2VsZWN0OmZhbHNlfSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRvb2xiYXJCdXR0b24iLCBkb2pvLndpZGdldC5Ub29sYmFySXRlbSwge2ZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVG9vbGJhckJ1dHRvbi5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgInRvb2xiYXJCdXR0b24iKTsKKwlpZiAodGhpcy5faWNvbikgeworCQl0aGlzLnNldEljb24odGhpcy5faWNvbik7CisJfQorCWlmICh0aGlzLl9sYWJlbCkgeworCQl0aGlzLnNldExhYmVsKHRoaXMuX2xhYmVsKTsKKwl9CisJaWYgKCF0aGlzLl9uYW1lKSB7CisJCWlmICh0aGlzLl9sYWJlbCkgeworCQkJdGhpcy5zZXROYW1lKHRoaXMuX2xhYmVsKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLl9pY29uKSB7CisJCQkJdmFyIHNyYyA9IHRoaXMuX2ljb24uZ2V0U3JjKCJlbmFibGVkIikubWF0Y2goL1tcL15dKFteXC5cL10rKVwuKGdpZnxqcGd8anBlZ3xwbmcpJC9pKTsKKwkJCQlpZiAoc3JjKSB7CisJCQkJCXRoaXMuc2V0TmFtZShzcmNbMV0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5fbmFtZSA9IHRoaXMuX3dpZGdldElkOworCQkJfQorCQl9CisJfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFyRGlhbG9nIiwgZG9qby53aWRnZXQuVG9vbGJhckJ1dHRvbiwge2ZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVG9vbGJhckRpYWxvZy5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJvblNlbGVjdCIsIHRoaXMsICJzaG93RGlhbG9nIik7CisJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJvbkRlc2VsZWN0IiwgdGhpcywgImhpZGVEaWFsb2ciKTsKK30sIHNob3dEaWFsb2c6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmxhbmcuc2V0VGltZW91dChkb2pvLmV2ZW50LmNvbm5lY3QsIDEsIGRvY3VtZW50LCAib25tb3VzZWRvd24iLCB0aGlzLCAiZGVzZWxlY3QiKTsKK30sIGhpZGVEaWFsb2c6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQsICJvbm1vdXNlZG93biIsIHRoaXMsICJkZXNlbGVjdCIpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFyTWVudSIsIGRvam8ud2lkZ2V0LlRvb2xiYXJEaWFsb2csIHt9KTsKK2Rvam8ud2lkZ2V0LlRvb2xiYXJNZW51SXRlbSA9IGZ1bmN0aW9uICgpIHsKK307Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRvb2xiYXJTZXBhcmF0b3IiLCBkb2pvLndpZGdldC5Ub29sYmFySXRlbSwge3RlbXBsYXRlU3RyaW5nOiI8c3BhbiB1bnNlbGVjdGFibGU9XCJvblwiIGNsYXNzPVwidG9vbGJhckl0ZW0gdG9vbGJhclNlcGFyYXRvclwiPjwvc3Bhbj4iLCBkZWZhdWx0SWNvblBhdGg6bmV3IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2J1dHRvbnMvc2VwLmdpZiIpLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZywgc2tpcCkgeworCWRvam8ud2lkZ2V0LlRvb2xiYXJTZXBhcmF0b3Iuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsIGFyZ3MsIGZyYWcpOworCXRoaXMuX25hbWUgPSB0aGlzLndpZGdldElkOworCWlmICghc2tpcCkgeworCQlpZiAoIXRoaXMuX2ljb24pIHsKKwkJCXRoaXMuc2V0SWNvbih0aGlzLmRlZmF1bHRJY29uUGF0aCk7CisJCX0KKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMuX2ljb24uZ2V0Tm9kZSgpKTsKKwl9Cit9LCBfb25tb3VzZW92ZXI6bnVsbCwgX29ubW91c2VvdXQ6bnVsbCwgX29uY2xpY2s6bnVsbCwgX29ubW91c2Vkb3duOm51bGwsIF9vbm1vdXNldXA6bnVsbH0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFyU3BhY2UiLCBkb2pvLndpZGdldC5Ub29sYmFyU2VwYXJhdG9yLCB7ZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcsIHNraXApIHsKKwlkb2pvLndpZGdldC5Ub29sYmFyU3BhY2Uuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsIGFyZ3MsIGZyYWcsIHRydWUpOworCWlmICghc2tpcCkgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAidG9vbGJhclNwYWNlIik7CisJfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sYmFyU2VsZWN0IiwgZG9qby53aWRnZXQuVG9vbGJhckl0ZW0sIHt0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gY2xhc3M9XCJ0b29sYmFySXRlbSB0b29sYmFyU2VsZWN0XCIgdW5zZWxlY3RhYmxlPVwib25cIj48c2VsZWN0IGRvam9BdHRhY2hQb2ludD1cInNlbGVjdEJveFwiIGRvam9PbkNoYW5nZT1cImNoYW5nZWRcIj48L3NlbGVjdD48L3NwYW4+IiwgZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwlkb2pvLndpZGdldC5Ub29sYmFyU2VsZWN0LnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuY2FsbCh0aGlzLCBhcmdzLCBmcmFnLCB0cnVlKTsKKwl2YXIga2V5cyA9IGFyZ3MudmFsdWVzOworCXZhciBpID0gMDsKKwlmb3IgKHZhciB2YWwgaW4ga2V5cykgeworCQl2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CisJCW9wdC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwga2V5c1t2YWxdKTsKKwkJb3B0LmlubmVySFRNTCA9IHZhbDsKKwkJdGhpcy5zZWxlY3RCb3guYXBwZW5kQ2hpbGQob3B0KTsKKwl9Cit9LCBjaGFuZ2VkOmZ1bmN0aW9uIChlKSB7CisJdGhpcy5fZmlyZUV2ZW50KCJvblNldFZhbHVlIiwgdGhpcy5zZWxlY3RCb3gudmFsdWUpOworfSwgc2V0RW5hYmxlZDpmdW5jdGlvbiAoaXMsIGZvcmNlLCBwcmV2ZW50RXZlbnQpIHsKKwl2YXIgcmV0ID0gZG9qby53aWRnZXQuVG9vbGJhclNlbGVjdC5zdXBlcmNsYXNzLnNldEVuYWJsZWQuY2FsbCh0aGlzLCBpcywgZm9yY2UsIHByZXZlbnRFdmVudCk7CisJdGhpcy5zZWxlY3RCb3guZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkOworCXJldHVybiByZXQ7Cit9LCBfb25tb3VzZW92ZXI6bnVsbCwgX29ubW91c2VvdXQ6bnVsbCwgX29uY2xpY2s6bnVsbCwgX29ubW91c2Vkb3duOm51bGwsIF9vbm1vdXNldXA6bnVsbH0pOworZG9qby53aWRnZXQuSWNvbiA9IGZ1bmN0aW9uIChlbmFibGVkLCBkaXNhYmxlZCwgaG92ZXJlZCwgc2VsZWN0ZWQpIHsKKwlpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKKwkJdGhyb3cgbmV3IEVycm9yKCJJY29uIG11c3QgaGF2ZSBhdCBsZWFzdCBhbiBlbmFibGVkIHN0YXRlIik7CisJfQorCXZhciBzdGF0ZXMgPSBbImVuYWJsZWQiLCAiZGlzYWJsZWQiLCAiaG92ZXJlZCIsICJzZWxlY3RlZCJdOworCXZhciBjdXJyZW50U3RhdGUgPSAiZW5hYmxlZCI7CisJdmFyIGRvbU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKwl0aGlzLmdldFN0YXRlID0gZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gY3VycmVudFN0YXRlOworCX07CisJdGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCQlpZiAoZG9qby5sYW5nLmluQXJyYXkoc3RhdGVzLCB2YWx1ZSkpIHsKKwkJCWlmICh0aGlzW3ZhbHVlXSkgeworCQkJCWN1cnJlbnRTdGF0ZSA9IHZhbHVlOworCQkJCXZhciBpbWcgPSB0aGlzW2N1cnJlbnRTdGF0ZV07CisJCQkJaWYgKChkb2pvLnJlbmRlci5odG1sLmllNTUgfHwgZG9qby5yZW5kZXIuaHRtbC5pZTYwKSAmJiBpbWcuc3JjICYmIGltZy5zcmMubWF0Y2goL1suXXBuZyQvaSkpIHsKKwkJCQkJZG9tTm9kZS53aWR0aCA9IGltZy53aWR0aCB8fCBpbWcub2Zmc2V0V2lkdGg7CisJCQkJCWRvbU5vZGUuaGVpZ2h0ID0gaW1nLmhlaWdodCB8fCBpbWcub2Zmc2V0SGVpZ2h0OworCQkJCQlkb21Ob2RlLnNldEF0dHJpYnV0ZSgic3JjIiwgZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2JsYW5rLmdpZiIpLnVyaSk7CisJCQkJCWRvbU5vZGUuc3R5bGUuZmlsdGVyID0gInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIiArIGltZy5zcmMgKyAiJyxzaXppbmdNZXRob2Q9J2ltYWdlJykiOworCQkJCX0gZWxzZSB7CisJCQkJCWRvbU5vZGUuc2V0QXR0cmlidXRlKCJzcmMiLCBpbWcuc3JjKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RhdGUgc2V0IG9uIEljb24gKHN0YXRlOiAiICsgdmFsdWUgKyAiKSIpOworCQl9CisJfTsKKwl0aGlzLnNldFNyYyA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUpIHsKKwkJaWYgKC9eaW1nJC9pLnRlc3QodmFsdWUudGFnTmFtZSkpIHsKKwkJCXRoaXNbc3RhdGVdID0gdmFsdWU7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgZG9qby51cmkuVXJpKSB7CisJCQkJdGhpc1tzdGF0ZV0gPSBuZXcgSW1hZ2UoKTsKKwkJCQl0aGlzW3N0YXRlXS5zcmMgPSB2YWx1ZS50b1N0cmluZygpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzW3N0YXRlXTsKKwl9OworCXRoaXMuc2V0SWNvbiA9IGZ1bmN0aW9uIChpY29uKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaWNvbltzdGF0ZXNbaV1dKSB7CisJCQkJdGhpcy5zZXRTcmMoc3RhdGVzW2ldLCBpY29uW3N0YXRlc1tpXV0pOworCQkJfQorCQl9CisJCXRoaXMudXBkYXRlKCk7CisJfTsKKwl0aGlzLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5zZXRTdGF0ZSgiZW5hYmxlZCIpOworCX07CisJdGhpcy5kaXNhYmxlID0gZnVuY3Rpb24gKCkgeworCQl0aGlzLnNldFN0YXRlKCJkaXNhYmxlZCIpOworCX07CisJdGhpcy5ob3ZlciA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5zZXRTdGF0ZSgiaG92ZXJlZCIpOworCX07CisJdGhpcy5zZWxlY3QgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuc2V0U3RhdGUoInNlbGVjdGVkIik7CisJfTsKKwl0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiB7d2lkdGg6ZG9tTm9kZS53aWR0aCB8fCBkb21Ob2RlLm9mZnNldFdpZHRoLCBoZWlnaHQ6ZG9tTm9kZS5oZWlnaHQgfHwgZG9tTm9kZS5vZmZzZXRIZWlnaHR9OworCX07CisJdGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKHcsIGgpIHsKKwkJZG9tTm9kZS53aWR0aCA9IHc7CisJCWRvbU5vZGUuaGVpZ2h0ID0gaDsKKwkJcmV0dXJuIHt3aWR0aDp3LCBoZWlnaHQ6aH07CisJfTsKKwl0aGlzLmdldE5vZGUgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiBkb21Ob2RlOworCX07CisJdGhpcy5nZXRTcmMgPSBmdW5jdGlvbiAoc3RhdGUpIHsKKwkJaWYgKHN0YXRlKSB7CisJCQlyZXR1cm4gdGhpc1tzdGF0ZV0uc3JjOworCQl9CisJCXJldHVybiBkb21Ob2RlLnNyYyB8fCAiIjsKKwl9OworCXRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkgeworCQl0aGlzLnNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7CisJfTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykgeworCQl2YXIgYXJnID0gYXJndW1lbnRzW2ldOworCQl2YXIgc3RhdGUgPSBzdGF0ZXNbaV07CisJCXRoaXNbc3RhdGVdID0gbnVsbDsKKwkJaWYgKCFhcmcpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRoaXMuc2V0U3JjKHN0YXRlLCBhcmcpOworCX0KKwl0aGlzLmVuYWJsZSgpOworfTsKK2Rvam8ud2lkZ2V0Lkljb24ubWFrZSA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0Lkljb24pIHsKKwkJCXJldHVybiBhcmd1bWVudHNbaV07CisJCX0KKwl9CisJcmV0dXJuIG5ldyBkb2pvLndpZGdldC5JY29uKGEsIGIsIGMsIGQpOworfTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVG9vbGJhckNvbG9yRGlhbG9nIiwgZG9qby53aWRnZXQuVG9vbGJhckRpYWxvZywge3BhbGV0dGU6Ijd4MTAiLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWRvam8ud2lkZ2V0LlRvb2xiYXJDb2xvckRpYWxvZy5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJdGhpcy5kaWFsb2cgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkNvbG9yUGFsZXR0ZSIsIHtwYWxldHRlOnRoaXMucGFsZXR0ZX0pOworCXRoaXMuZGlhbG9nLmRvbU5vZGUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRpYWxvZywgIm9uQ29sb3JTZWxlY3QiLCB0aGlzLCAiX3NldFZhbHVlIik7Cit9LCBfc2V0VmFsdWU6ZnVuY3Rpb24gKGNvbG9yKSB7CisJdGhpcy5fdmFsdWUgPSBjb2xvcjsKKwl0aGlzLl9maXJlRXZlbnQoIm9uU2V0VmFsdWUiLCBjb2xvcik7Cit9LCBzaG93RGlhbG9nOmZ1bmN0aW9uIChlKSB7CisJZG9qby53aWRnZXQuVG9vbGJhckNvbG9yRGlhbG9nLnN1cGVyY2xhc3Muc2hvd0RpYWxvZy5jYWxsKHRoaXMsIGUpOworCXZhciBhYnMgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRvbU5vZGUsIHRydWUpOworCXZhciB5ID0gYWJzLnkgKyBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9tTm9kZSkuaGVpZ2h0OworCXRoaXMuZGlhbG9nLnNob3dBdChhYnMueCwgeSk7Cit9LCBoaWRlRGlhbG9nOmZ1bmN0aW9uIChlKSB7CisJZG9qby53aWRnZXQuVG9vbGJhckNvbG9yRGlhbG9nLnN1cGVyY2xhc3MuaGlkZURpYWxvZy5jYWxsKHRoaXMsIGUpOworCXRoaXMuZGlhbG9nLmhpZGUoKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub29sdGlwLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Ub29sdGlwLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NThlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1Rvb2x0aXAuanMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRvb2x0aXAiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29udGVudFBhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuUG9wdXBDb250YWluZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby51cmkuVXJpIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwudXRpbCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5Ub29sdGlwIiwgW2Rvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLCBkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2VdLCB7Y2FwdGlvbjoiIiwgc2hvd0RlbGF5OjUwMCwgaGlkZURlbGF5OjEwMCwgY29ubmVjdElkOiIiLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9Ub29sdGlwIHtcblx0Ym9yZGVyOiBzb2xpZCBibGFjayAxcHg7XG5cdGJhY2tncm91bmQ6IGJlaWdlO1xuXHRjb2xvcjogYmxhY2s7XG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0Zm9udC1zaXplOiBzbWFsbDtcblx0cGFkZGluZzogMnB4IDJweCAycHggMnB4O1xuXHR6LWluZGV4OiAxMDtcblx0ZGlzcGxheTogYmxvY2s7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvVG9vbHRpcFRlbXBsYXRlLmNzcyIpLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLmNhcHRpb24gIT0gIiIpIHsKKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY2FwdGlvbikpOworCX0KKwl0aGlzLl9jb25uZWN0Tm9kZSA9IGRvam8uYnlJZCh0aGlzLmNvbm5lY3RJZCk7CisJZG9qby53aWRnZXQuVG9vbHRpcC5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJdGhpcy5hZGRPbkxvYWQodGhpcywgIl9sb2FkZWRDb250ZW50Iik7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgImRvam9Ub29sdGlwIik7CisJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisJdGhpcy5hcHBseVBvcHVwQmFzaWNTdHlsZSgpOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9jb25uZWN0Tm9kZSwgIm9ubW91c2VvdmVyIiwgdGhpcywgIl9vbk1vdXNlT3ZlciIpOworCWRvam8ud2lkZ2V0LlRvb2x0aXAuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7Cit9LCBfb25Nb3VzZU92ZXI6ZnVuY3Rpb24gKGUpIHsKKwl0aGlzLl9tb3VzZSA9IHt4OmUucGFnZVgsIHk6ZS5wYWdlWX07CisJaWYgKCF0aGlzLl90cmFja2luZykgeworCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiX29uTW91c2VNb3ZlIik7CisJCXRoaXMuX3RyYWNraW5nID0gdHJ1ZTsKKwl9CisJdGhpcy5fb25Ib3ZlcihlKTsKK30sIF9vbk1vdXNlTW92ZTpmdW5jdGlvbiAoZSkgeworCXRoaXMuX21vdXNlID0ge3g6ZS5wYWdlWCwgeTplLnBhZ2VZfTsKKwlpZiAoZG9qby5odG1sLm92ZXJFbGVtZW50KHRoaXMuX2Nvbm5lY3ROb2RlLCBlKSB8fCBkb2pvLmh0bWwub3ZlckVsZW1lbnQodGhpcy5kb21Ob2RlLCBlKSkgeworCQl0aGlzLl9vbkhvdmVyKGUpOworCX0gZWxzZSB7CisJCXRoaXMuX29uVW5Ib3ZlcihlKTsKKwl9Cit9LCBfb25Ib3ZlcjpmdW5jdGlvbiAoZSkgeworCWlmICh0aGlzLl9ob3ZlcikgeworCQlyZXR1cm47CisJfQorCXRoaXMuX2hvdmVyID0gdHJ1ZTsKKwlpZiAodGhpcy5faGlkZVRpbWVyKSB7CisJCWNsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZXIpOworCQlkZWxldGUgdGhpcy5faGlkZVRpbWVyOworCX0KKwlpZiAoIXRoaXMuaXNTaG93aW5nTm93ICYmICF0aGlzLl9zaG93VGltZXIpIHsKKwkJdGhpcy5fc2hvd1RpbWVyID0gc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9wZW4iKSwgdGhpcy5zaG93RGVsYXkpOworCX0KK30sIF9vblVuSG92ZXI6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIXRoaXMuX2hvdmVyKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5faG92ZXIgPSBmYWxzZTsKKwlpZiAodGhpcy5fc2hvd1RpbWVyKSB7CisJCWNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZXIpOworCQlkZWxldGUgdGhpcy5fc2hvd1RpbWVyOworCX0KKwlpZiAodGhpcy5pc1Nob3dpbmdOb3cgJiYgIXRoaXMuX2hpZGVUaW1lcikgeworCQl0aGlzLl9oaWRlVGltZXIgPSBzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiY2xvc2UiKSwgdGhpcy5oaWRlRGVsYXkpOworCX0KKwlpZiAoIXRoaXMuaXNTaG93aW5nTm93KSB7CisJCWRvam8uZXZlbnQuZGlzY29ubmVjdChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJvbm1vdXNlbW92ZSIsIHRoaXMsICJfb25Nb3VzZU1vdmUiKTsKKwkJdGhpcy5fdHJhY2tpbmcgPSBmYWxzZTsKKwl9Cit9LCBvcGVuOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5pc1Nob3dpbmdOb3cpIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UucHJvdG90eXBlLm9wZW4uY2FsbCh0aGlzLCB0aGlzLl9tb3VzZS54LCB0aGlzLl9tb3VzZS55LCBudWxsLCBbdGhpcy5fbW91c2UueCwgdGhpcy5fbW91c2UueV0sICJUTCxUUixCTCxCUiIsIFsxMCwgMTVdKTsKK30sIGNsb3NlOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5pc1Nob3dpbmdOb3cpIHsKKwkJaWYgKHRoaXMuX3Nob3dUaW1lcikgeworCQkJY2xlYXJUaW1lb3V0KHRoaXMuX3Nob3dUaW1lcik7CisJCQlkZWxldGUgdGhpcy5fc2hvd1RpbWVyOworCQl9CisJCWlmICh0aGlzLl9oaWRlVGltZXIpIHsKKwkJCWNsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZXIpOworCQkJZGVsZXRlIHRoaXMuX2hpZGVUaW1lcjsKKwkJfQorCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAiX29uTW91c2VNb3ZlIik7CisJCXRoaXMuX3RyYWNraW5nID0gZmFsc2U7CisJCWRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyQmFzZS5wcm90b3R5cGUuY2xvc2UuY2FsbCh0aGlzKTsKKwl9Cit9LCBfcG9zaXRpb246ZnVuY3Rpb24gKCkgeworCXRoaXMubW92ZSh0aGlzLl9tb3VzZS54LCB0aGlzLl9tb3VzZS55LCBbMTAsIDE1XSwgIlRMLFRSLEJMLEJSIik7Cit9LCBfbG9hZGVkQ29udGVudDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaXNTaG93aW5nTm93KSB7CisJCXRoaXMuX3Bvc2l0aW9uKCk7CisJfQorfSwgY2hlY2tTaXplOmZ1bmN0aW9uICgpIHsKK30sIHVuaW5pdGlhbGl6ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5jbG9zZSgpOworCWRvam8uZXZlbnQuZGlzY29ubmVjdCh0aGlzLl9jb25uZWN0Tm9kZSwgIm9ubW91c2VvdmVyIiwgdGhpcywgIl9vbk1vdXNlT3ZlciIpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzYjZkYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZS5qcwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlTm9kZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuY29tbW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmV2ZW50TmFtZXMgPSB7fTsKKwl0aGlzLnRyZWUgPSB0aGlzOworCXRoaXMuRE5EQWNjZXB0VHlwZXMgPSBbXTsKKwl0aGlzLmFjdGlvbnNEaXNhYmxlZCA9IFtdOworfSwge3dpZGdldFR5cGU6IlRyZWUiLCBldmVudE5hbWVzRGVmYXVsdDp7Y3JlYXRlRE9NTm9kZToiY3JlYXRlRE9NTm9kZSIsIHRyZWVDcmVhdGU6InRyZWVDcmVhdGUiLCB0cmVlRGVzdHJveToidHJlZURlc3Ryb3kiLCB0cmVlQ2xpY2s6InRyZWVDbGljayIsIGljb25DbGljazoiaWNvbkNsaWNrIiwgdGl0bGVDbGljazoidGl0bGVDbGljayIsIG1vdmVGcm9tOiJtb3ZlRnJvbSIsIG1vdmVUbzoibW92ZVRvIiwgYWRkQ2hpbGQ6ImFkZENoaWxkIiwgcmVtb3ZlTm9kZToicmVtb3ZlTm9kZSIsIGV4cGFuZDoiZXhwYW5kIiwgY29sbGFwc2U6ImNvbGxhcHNlIn0sIGlzQ29udGFpbmVyOnRydWUsIERORE1vZGU6Im9mZiIsIGxvY2tMZXZlbDowLCBzdHJpY3RGb2xkZXJzOnRydWUsIERORE1vZGVzOntCRVRXRUVOOjEsIE9OVE86Mn0sIEROREFjY2VwdFR5cGVzOiIiLCB0ZW1wbGF0ZUNzc1N0cmluZzoiXG4uZG9qb1RyZWUge1xuXHRmb250OiBjYXB0aW9uO1xuXHRmb250LXNpemU6IDExcHg7XG5cdGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cdG92ZXJmbG93OiBhdXRvO1xufVxuXG5cbi5kb2pvVHJlZU5vZGVMYWJlbFRpdGxlIHtcblx0cGFkZGluZy1sZWZ0OiAycHg7XG5cdGNvbG9yOiBXaW5kb3dUZXh0O1xufVxuXG4uZG9qb1RyZWVOb2RlTGFiZWwge1xuXHRjdXJzb3I6aGFuZDtcblx0Y3Vyc29yOnBvaW50ZXI7XG59XG5cbi5kb2pvVHJlZU5vZGVMYWJlbFRpdGxlOmhvdmVyIHtcblx0dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi5kb2pvVHJlZU5vZGVMYWJlbFNlbGVjdGVkIHtcblx0YmFja2dyb3VuZC1jb2xvcjogSGlnaGxpZ2h0O1xuXHRjb2xvcjogSGlnaGxpZ2h0VGV4dDtcbn1cblxuLmRvam9UcmVlIGRpdiB7XG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5kb2pvVHJlZSBpbWcsIC5kb2pvVHJlZU5vZGVMYWJlbCBpbWcge1xuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvVHJlZS5jc3MiKSwgdGVtcGxhdGVTdHJpbmc6IjxkaXYgY2xhc3M9XCJkb2pvVHJlZVwiPjwvZGl2PiIsIGlzRXhwYW5kZWQ6dHJ1ZSwgaXNUcmVlOnRydWUsIG9iamVjdElkOiIiLCBjb250cm9sbGVyOiIiLCBzZWxlY3RvcjoiIiwgbWVudToiIiwgZXhwYW5kTGV2ZWw6IiIsIGJsYW5rSWNvblNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ibGFuay5naWYiKSwgZ3JpZEljb25TcmNUOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfdC5naWYiKSwgZ3JpZEljb25TcmNMOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfbC5naWYiKSwgZ3JpZEljb25TcmNWOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfdi5naWYiKSwgZ3JpZEljb25TcmNQOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfcC5naWYiKSwgZ3JpZEljb25TcmNDOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfYy5naWYiKSwgZ3JpZEljb25TcmNYOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfeC5naWYiKSwgZ3JpZEljb25TcmNZOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfeS5naWYiKSwgZ3JpZEljb25TcmNaOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfei5naWYiKSwgZXhwYW5kSWNvblNyY1BsdXM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZXhwYW5kX3BsdXMuZ2lmIiksIGV4cGFuZEljb25TcmNNaW51czpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfbWludXMuZ2lmIiksIGV4cGFuZEljb25TcmNMb2FkaW5nOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2xvYWRpbmcuZ2lmIiksIGljb25XaWR0aDoxOCwgaWNvbkhlaWdodDoxOCwgc2hvd0dyaWQ6dHJ1ZSwgc2hvd1Jvb3RHcmlkOnRydWUsIGFjdGlvbklzRGlzYWJsZWQ6ZnVuY3Rpb24gKGFjdGlvbikgeworCXZhciBfdGhpcyA9IHRoaXM7CisJcmV0dXJuIGRvam8ubGFuZy5pbkFycmF5KF90aGlzLmFjdGlvbnNEaXNhYmxlZCwgYWN0aW9uKTsKK30sIGFjdGlvbnM6e0FERENISUxEOiJBRERDSElMRCJ9LCBnZXRJbmZvOmZ1bmN0aW9uICgpIHsKKwl2YXIgaW5mbyA9IHt3aWRnZXRJZDp0aGlzLndpZGdldElkLCBvYmplY3RJZDp0aGlzLm9iamVjdElkfTsKKwlyZXR1cm4gaW5mbzsKK30sIGluaXRpYWxpemVDb250cm9sbGVyOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5jb250cm9sbGVyICE9ICJvZmYiKSB7CisJCWlmICh0aGlzLmNvbnRyb2xsZXIpIHsKKwkJCXRoaXMuY29udHJvbGxlciA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5jb250cm9sbGVyKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlciIpOworCQkJdGhpcy5jb250cm9sbGVyID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUcmVlQmFzaWNDb250cm9sbGVyIiwge0RORENvbnRyb2xsZXI6KHRoaXMuRE5ETW9kZSA/ICJjcmVhdGUiIDogIiIpLCBkaWVXaXRoVHJlZTp0cnVlfSk7CisJCX0KKwkJdGhpcy5jb250cm9sbGVyLmxpc3RlblRyZWUodGhpcyk7CisJfSBlbHNlIHsKKwkJdGhpcy5jb250cm9sbGVyID0gbnVsbDsKKwl9Cit9LCBpbml0aWFsaXplU2VsZWN0b3I6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLnNlbGVjdG9yICE9ICJvZmYiKSB7CisJCWlmICh0aGlzLnNlbGVjdG9yKSB7CisJCQl0aGlzLnNlbGVjdG9yID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLnNlbGVjdG9yKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yIik7CisJCQl0aGlzLnNlbGVjdG9yID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUcmVlU2VsZWN0b3IiLCB7ZGllV2l0aFRyZWU6dHJ1ZX0pOworCQl9CisJCXRoaXMuc2VsZWN0b3IubGlzdGVuVHJlZSh0aGlzKTsKKwl9IGVsc2UgeworCQl0aGlzLnNlbGVjdG9yID0gbnVsbDsKKwl9Cit9LCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlmb3IgKG5hbWUgaW4gdGhpcy5ldmVudE5hbWVzRGVmYXVsdCkgeworCQlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKHRoaXMuZXZlbnROYW1lc1tuYW1lXSkpIHsKKwkJCXRoaXMuZXZlbnROYW1lc1tuYW1lXSA9IHRoaXMud2lkZ2V0SWQgKyAiLyIgKyB0aGlzLmV2ZW50TmFtZXNEZWZhdWx0W25hbWVdOworCQl9CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hY3Rpb25zRGlzYWJsZWQubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5hY3Rpb25zRGlzYWJsZWRbaV0gPSB0aGlzLmFjdGlvbnNEaXNhYmxlZFtpXS50b1VwcGVyQ2FzZSgpOworCX0KKwlpZiAodGhpcy5ETkRNb2RlID09ICJvZmYiKSB7CisJCXRoaXMuRE5ETW9kZSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuRE5ETW9kZSA9PSAiYmV0d2VlbiIpIHsKKwkJCXRoaXMuRE5ETW9kZSA9IHRoaXMuRE5ETW9kZXMuT05UTyB8IHRoaXMuRE5ETW9kZXMuQkVUV0VFTjsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLkRORE1vZGUgPT0gIm9udG8iKSB7CisJCQkJdGhpcy5ETkRNb2RlID0gdGhpcy5ETkRNb2Rlcy5PTlRPOworCQkJfQorCQl9CisJfQorCXRoaXMuZXhwYW5kTGV2ZWwgPSBwYXJzZUludCh0aGlzLmV4cGFuZExldmVsKTsKKwl0aGlzLmluaXRpYWxpemVTZWxlY3RvcigpOworCXRoaXMuaW5pdGlhbGl6ZUNvbnRyb2xsZXIoKTsKKwlpZiAodGhpcy5tZW51KSB7CisJCXRoaXMubWVudSA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5tZW51KTsKKwkJdGhpcy5tZW51Lmxpc3RlblRyZWUodGhpcyk7CisJfQorCXRoaXMuY29udGFpbmVyTm9kZSA9IHRoaXMuZG9tTm9kZTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuY3JlYXRlRE9NTm9kZSgpOworfSwgY3JlYXRlRE9NTm9kZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5jaGlsZHJlbltpXS5wYXJlbnQgPSB0aGlzOworCQl2YXIgbm9kZSA9IHRoaXMuY2hpbGRyZW5baV0uY3JlYXRlRE9NTm9kZSh0aGlzLCAwKTsKKwkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwlpZiAoIXRoaXMuc2hvd1Jvb3RHcmlkKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJdGhpcy5jaGlsZHJlbltpXS5leHBhbmQoKTsKKwkJfQorCX0KKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLnRyZWVDcmVhdGUsIHtzb3VyY2U6dGhpc30pOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LCB7c291cmNlOnRoaXN9KTsKKwlyZXR1cm4gZG9qby53aWRnZXQuSHRtbFdpZGdldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgYWRkQ2hpbGQ6ZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkgeworCXZhciBtZXNzYWdlID0ge2NoaWxkOmNoaWxkLCBpbmRleDppbmRleCwgcGFyZW50OnRoaXMsIGRvbU5vZGVJbml0aWFsaXplZDpjaGlsZC5kb21Ob2RlSW5pdGlhbGl6ZWR9OworCXRoaXMuZG9BZGRDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCwgbWVzc2FnZSk7Cit9LCBkb0FkZENoaWxkOmZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHsKKwlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGluZGV4KSkgeworCQlpbmRleCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOworCX0KKwlpZiAoIWNoaWxkLmlzVHJlZU5vZGUpIHsKKwkJZG9qby5yYWlzZSgiWW91IGNhbiBvbmx5IGFkZCBUcmVlTm9kZSB3aWRnZXRzIHRvIGEgIiArIHRoaXMud2lkZ2V0VHlwZSArICIgd2lkZ2V0ISIpOworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLmlzVHJlZU5vZGUpIHsKKwkJaWYgKCF0aGlzLmlzRm9sZGVyKSB7CisJCQl0aGlzLnNldEZvbGRlcigpOworCQl9CisJfQorCXZhciBfdGhpcyA9IHRoaXM7CisJZG9qby5sYW5nLmZvckVhY2goY2hpbGQuZ2V0RGVzY2VuZGFudHMoKSwgZnVuY3Rpb24gKGVsZW0pIHsKKwkJZWxlbS50cmVlID0gX3RoaXMudHJlZTsKKwl9KTsKKwljaGlsZC5wYXJlbnQgPSB0aGlzOworCWlmICh0aGlzLmlzVHJlZU5vZGUpIHsKKwkJdGhpcy5zdGF0ZSA9IHRoaXMubG9hZFN0YXRlcy5MT0FERUQ7CisJfQorCWlmIChpbmRleCA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CisJCWRvam8uaHRtbC5pbnNlcnRCZWZvcmUoY2hpbGQuZG9tTm9kZSwgdGhpcy5jaGlsZHJlbltpbmRleF0uZG9tTm9kZSk7CisJfSBlbHNlIHsKKwkJdGhpcy5jb250YWluZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmRvbU5vZGUpOworCQlpZiAodGhpcy5pc0V4cGFuZGVkICYmIHRoaXMuaXNUcmVlTm9kZSkgeworCQkJdGhpcy5zaG93Q2hpbGRyZW4oKTsKKwkJfQorCX0KKwl0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgY2hpbGQpOworCWlmIChjaGlsZC5kb21Ob2RlSW5pdGlhbGl6ZWQpIHsKKwkJdmFyIGQgPSB0aGlzLmlzVHJlZU5vZGUgPyB0aGlzLmRlcHRoIDogLTE7CisJCWNoaWxkLmFkanVzdERlcHRoKGQgLSBjaGlsZC5kZXB0aCArIDEpOworCQljaGlsZC51cGRhdGVJY29uVHJlZSgpOworCX0gZWxzZSB7CisJCWNoaWxkLmRlcHRoID0gdGhpcy5pc1RyZWVOb2RlID8gdGhpcy5kZXB0aCArIDEgOiAwOworCQljaGlsZC5jcmVhdGVET01Ob2RlKGNoaWxkLnRyZWUsIGNoaWxkLmRlcHRoKTsKKwl9CisJdmFyIHByZXZTaWJsaW5nID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisJaWYgKGNoaWxkLmlzTGFzdENoaWxkKCkgJiYgcHJldlNpYmxpbmcpIHsKKwkJcHJldlNpYmxpbmcudXBkYXRlRXhwYW5kR3JpZENvbHVtbigpOworCX0KK30sIG1ha2VCbGFua0ltZzpmdW5jdGlvbiAoKSB7CisJdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOworCWltZy5zdHlsZS53aWR0aCA9IHRoaXMuaWNvbldpZHRoICsgInB4IjsKKwlpbWcuc3R5bGUuaGVpZ2h0ID0gdGhpcy5pY29uSGVpZ2h0ICsgInB4IjsKKwlpbWcuc3JjID0gdGhpcy5ibGFua0ljb25TcmM7CisJaW1nLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAibWlkZGxlIjsKKwlyZXR1cm4gaW1nOworfSwgdXBkYXRlSWNvblRyZWU6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5pc1RyZWUpIHsKKwkJdGhpcy51cGRhdGVJY29ucygpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5jaGlsZHJlbltpXS51cGRhdGVJY29uVHJlZSgpOworCX0KK30sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIlsiICsgdGhpcy53aWRnZXRUeXBlICsgIiBJRDoiICsgdGhpcy53aWRnZXRJZCArICJdIjsKK30sIG1vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJdmFyIG9sZFBhcmVudCA9IGNoaWxkLnBhcmVudDsKKwl2YXIgb2xkVHJlZSA9IGNoaWxkLnRyZWU7CisJdGhpcy5kb01vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl2YXIgbmV3UGFyZW50ID0gY2hpbGQucGFyZW50OworCXZhciBuZXdUcmVlID0gY2hpbGQudHJlZTsKKwl2YXIgbWVzc2FnZSA9IHtvbGRQYXJlbnQ6b2xkUGFyZW50LCBvbGRUcmVlOm9sZFRyZWUsIG5ld1BhcmVudDpuZXdQYXJlbnQsIG5ld1RyZWU6bmV3VHJlZSwgY2hpbGQ6Y2hpbGR9OworCWRvam8uZXZlbnQudG9waWMucHVibGlzaChvbGRUcmVlLmV2ZW50TmFtZXMubW92ZUZyb20sIG1lc3NhZ2UpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaChuZXdUcmVlLmV2ZW50TmFtZXMubW92ZVRvLCBtZXNzYWdlKTsKK30sIGRvTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpIHsKKwljaGlsZC5wYXJlbnQuZG9SZW1vdmVOb2RlKGNoaWxkKTsKKwluZXdQYXJlbnQuZG9BZGRDaGlsZChjaGlsZCwgaW5kZXgpOworfSwgcmVtb3ZlTm9kZTpmdW5jdGlvbiAoY2hpbGQpIHsKKwlpZiAoIWNoaWxkLnBhcmVudCkgeworCQlyZXR1cm47CisJfQorCXZhciBvbGRUcmVlID0gY2hpbGQudHJlZTsKKwl2YXIgb2xkUGFyZW50ID0gY2hpbGQucGFyZW50OworCXZhciByZW1vdmVkQ2hpbGQgPSB0aGlzLmRvUmVtb3ZlTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLCB7Y2hpbGQ6cmVtb3ZlZENoaWxkLCB0cmVlOm9sZFRyZWUsIHBhcmVudDpvbGRQYXJlbnR9KTsKKwlyZXR1cm4gcmVtb3ZlZENoaWxkOworfSwgZG9SZW1vdmVOb2RlOmZ1bmN0aW9uIChjaGlsZCkgeworCWlmICghY2hpbGQucGFyZW50KSB7CisJCXJldHVybjsKKwl9CisJdmFyIHBhcmVudCA9IGNoaWxkLnBhcmVudDsKKwl2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW47CisJdmFyIGluZGV4ID0gY2hpbGQuZ2V0UGFyZW50SW5kZXgoKTsKKwlpZiAoaW5kZXggPCAwKSB7CisJCWRvam8ucmFpc2UoIkNvdWxkbid0IGZpbmQgbm9kZSAiICsgY2hpbGQgKyAiIGZvciByZW1vdmFsIik7CisJfQorCWNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7CisJZG9qby5odG1sLnJlbW92ZU5vZGUoY2hpbGQuZG9tTm9kZSk7CisJaWYgKHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT0gMCAmJiAhcGFyZW50LmlzVHJlZSkgeworCQlwYXJlbnQuY29udGFpbmVyTm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCX0KKwlpZiAoaW5kZXggPT0gY2hpbGRyZW4ubGVuZ3RoICYmIGluZGV4ID4gMCkgeworCQljaGlsZHJlbltpbmRleCAtIDFdLnVwZGF0ZUV4cGFuZEdyaWRDb2x1bW4oKTsKKwl9CisJaWYgKHBhcmVudCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRyZWUgJiYgaW5kZXggPT0gMCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7CisJCWNoaWxkcmVuWzBdLnVwZGF0ZUV4cGFuZEdyaWQoKTsKKwl9CisJY2hpbGQucGFyZW50ID0gY2hpbGQudHJlZSA9IG51bGw7CisJcmV0dXJuIGNoaWxkOworfSwgbWFya0xvYWRpbmc6ZnVuY3Rpb24gKCkgeworfSwgdW5NYXJrTG9hZGluZzpmdW5jdGlvbiAoKSB7Cit9LCBsb2NrOmZ1bmN0aW9uICgpIHsKKwkhdGhpcy5sb2NrTGV2ZWwgJiYgdGhpcy5tYXJrTG9hZGluZygpOworCXRoaXMubG9ja0xldmVsKys7Cit9LCB1bmxvY2s6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5sb2NrTGV2ZWwpIHsKKwkJZG9qby5yYWlzZSgidW5sb2NrOiBub3QgbG9ja2VkIik7CisJfQorCXRoaXMubG9ja0xldmVsLS07CisJIXRoaXMubG9ja0xldmVsICYmIHRoaXMudW5NYXJrTG9hZGluZygpOworfSwgaXNMb2NrZWQ6ZnVuY3Rpb24gKCkgeworCXZhciBub2RlID0gdGhpczsKKwl3aGlsZSAodHJ1ZSkgeworCQlpZiAobm9kZS5sb2NrTGV2ZWwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChub2RlIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVHJlZSkgeworCQkJYnJlYWs7CisJCX0KKwkJbm9kZSA9IG5vZGUucGFyZW50OworCX0KKwlyZXR1cm4gZmFsc2U7Cit9LCBmbHVzaExvY2s6ZnVuY3Rpb24gKCkgeworCXRoaXMubG9ja0xldmVsID0gMDsKKwl0aGlzLnVuTWFya0xvYWRpbmcoKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQmFzaWNDb250cm9sbGVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQmFzaWNDb250cm9sbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzlkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVCYXNpY0NvbnRyb2xsZXIuanMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlciIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt3aWRnZXRUeXBlOiJUcmVlQmFzaWNDb250cm9sbGVyIiwgRE5EQ29udHJvbGxlcjoiIiwgZGllV2l0aFRyZWU6ZmFsc2UsIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwlpZiAodGhpcy5ETkRDb250cm9sbGVyID09ICJjcmVhdGUiKSB7CisJCWRvam8ucmVxdWlyZSgiZG9qby5kbmQuVHJlZURyYWdBbmREcm9wIik7CisJCXRoaXMuRE5EQ29udHJvbGxlciA9IG5ldyBkb2pvLmRuZC5UcmVlRE5EQ29udHJvbGxlcih0aGlzKTsKKwl9Cit9LCBsaXN0ZW5UcmVlOmZ1bmN0aW9uICh0cmVlKSB7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHRoaXMsICJvbkNyZWF0ZURPTU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZUNsaWNrLCB0aGlzLCAib25UcmVlQ2xpY2siKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZUNyZWF0ZSwgdGhpcywgIm9uVHJlZUNyZWF0ZSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwlpZiAodGhpcy5ETkRDb250cm9sbGVyKSB7CisJCXRoaXMuRE5EQ29udHJvbGxlci5saXN0ZW5UcmVlKHRyZWUpOworCX0KK30sIHVubGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHRoaXMsICJvbkNyZWF0ZURPTU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ2xpY2ssIHRoaXMsICJvblRyZWVDbGljayIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVDcmVhdGUsIHRoaXMsICJvblRyZWVDcmVhdGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKK30sIG9uVHJlZURlc3Ryb3k6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl2YXIgdHJlZSA9IG1lc3NhZ2Uuc291cmNlOworCXRoaXMudW5saXN0ZW5UcmVlKHRyZWUpOworCWlmICh0aGlzLmRpZVdpdGhUcmVlKSB7CisJCXRoaXMuZGVzdHJveSgpOworCX0KK30sIG9uQ3JlYXRlRE9NTm9kZTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisJaWYgKG5vZGUuZXhwYW5kTGV2ZWwgPiAwKSB7CisJCXRoaXMuZXhwYW5kVG9MZXZlbChub2RlLCBub2RlLmV4cGFuZExldmVsKTsKKwl9Cit9LCBvblRyZWVDcmVhdGU6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl2YXIgdHJlZSA9IG1lc3NhZ2Uuc291cmNlOworCXZhciBfdGhpcyA9IHRoaXM7CisJaWYgKHRyZWUuZXhwYW5kTGV2ZWwpIHsKKwkJZG9qby5sYW5nLmZvckVhY2godHJlZS5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7CisJCQlfdGhpcy5leHBhbmRUb0xldmVsKGNoaWxkLCB0cmVlLmV4cGFuZExldmVsIC0gMSk7CisJCX0pOworCX0KK30sIGV4cGFuZFRvTGV2ZWw6ZnVuY3Rpb24gKG5vZGUsIGxldmVsKSB7CisJaWYgKGxldmVsID09IDApIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAobm9kZSwgZXhwYW5kTGV2ZWwpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwkJdGhpcy5leHBhbmRMZXZlbCA9IGV4cGFuZExldmVsOworCQl0aGlzLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCXZhciBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07CisJCQkJX3RoaXMuZXhwYW5kVG9MZXZlbChjaGlsZCwgdGhpcy5leHBhbmRMZXZlbCk7CisJCQl9CisJCX07CisJfTsKKwl2YXIgaCA9IG5ldyBoYW5kbGVyKG5vZGUsIGxldmVsIC0gMSk7CisJdGhpcy5leHBhbmQobm9kZSwgZmFsc2UsIGgsIGgucHJvY2Vzcyk7Cit9LCBvblRyZWVDbGljazpmdW5jdGlvbiAobWVzc2FnZSkgeworCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisJaWYgKG5vZGUuaXNMb2NrZWQoKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChub2RlLmlzRXhwYW5kZWQpIHsKKwkJdGhpcy5jb2xsYXBzZShub2RlKTsKKwl9IGVsc2UgeworCQl0aGlzLmV4cGFuZChub2RlKTsKKwl9Cit9LCBleHBhbmQ6ZnVuY3Rpb24gKG5vZGUsIHN5bmMsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisJbm9kZS5leHBhbmQoKTsKKwlpZiAoY2FsbEZ1bmMpIHsKKwkJY2FsbEZ1bmMuYXBwbHkoY2FsbE9iaiwgW25vZGVdKTsKKwl9Cit9LCBjb2xsYXBzZTpmdW5jdGlvbiAobm9kZSkgeworCW5vZGUuY29sbGFwc2UoKTsKK30sIGNhbk1vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQpIHsKKwlpZiAoY2hpbGQuYWN0aW9uSXNEaXNhYmxlZChjaGlsZC5hY3Rpb25zLk1PVkUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGNoaWxkLnBhcmVudCAhPT0gbmV3UGFyZW50ICYmIG5ld1BhcmVudC5hY3Rpb25Jc0Rpc2FibGVkKG5ld1BhcmVudC5hY3Rpb25zLkFERENISUxEKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBub2RlID0gbmV3UGFyZW50OworCXdoaWxlIChub2RlLmlzVHJlZU5vZGUpIHsKKwkJaWYgKG5vZGUgPT09IGNoaWxkKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbm9kZSA9IG5vZGUucGFyZW50OworCX0KKwlyZXR1cm4gdHJ1ZTsKK30sIG1vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJaWYgKCF0aGlzLmNhbk1vdmUoY2hpbGQsIG5ld1BhcmVudCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl2YXIgcmVzdWx0ID0gdGhpcy5kb01vdmUoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpOworCWlmICghcmVzdWx0KSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChuZXdQYXJlbnQuaXNUcmVlTm9kZSkgeworCQl0aGlzLmV4cGFuZChuZXdQYXJlbnQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgZG9Nb3ZlOmZ1bmN0aW9uIChjaGlsZCwgbmV3UGFyZW50LCBpbmRleCkgeworCWNoaWxkLnRyZWUubW92ZShjaGlsZCwgbmV3UGFyZW50LCBpbmRleCk7CisJcmV0dXJuIHRydWU7Cit9LCBjYW5SZW1vdmVOb2RlOmZ1bmN0aW9uIChjaGlsZCkgeworCWlmIChjaGlsZC5hY3Rpb25Jc0Rpc2FibGVkKGNoaWxkLmFjdGlvbnMuUkVNT1ZFKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfSwgcmVtb3ZlTm9kZTpmdW5jdGlvbiAobm9kZSwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwlpZiAoIXRoaXMuY2FuUmVtb3ZlTm9kZShub2RlKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0aGlzLmRvUmVtb3ZlTm9kZShub2RlLCBjYWxsT2JqLCBjYWxsRnVuYyk7Cit9LCBkb1JlbW92ZU5vZGU6ZnVuY3Rpb24gKG5vZGUsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisJbm9kZS50cmVlLnJlbW92ZU5vZGUobm9kZSk7CisJaWYgKGNhbGxGdW5jKSB7CisJCWNhbGxGdW5jLmFwcGx5KGRvam8ubGFuZy5pc1VuZGVmaW5lZChjYWxsT2JqKSA/IHRoaXMgOiBjYWxsT2JqLCBbbm9kZV0pOworCX0KK30sIGNhbkNyZWF0ZUNoaWxkOmZ1bmN0aW9uIChwYXJlbnQsIGluZGV4LCBkYXRhKSB7CisJaWYgKHBhcmVudC5hY3Rpb25Jc0Rpc2FibGVkKHBhcmVudC5hY3Rpb25zLkFERENISUxEKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfSwgY3JlYXRlQ2hpbGQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIGRhdGEsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisJaWYgKCF0aGlzLmNhbkNyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRoaXMuZG9DcmVhdGVDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZG9DcmVhdGVDaGlsZDpmdW5jdGlvbiAocGFyZW50LCBpbmRleCwgZGF0YSwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwl2YXIgd2lkZ2V0VHlwZSA9IGRhdGEud2lkZ2V0VHlwZSA/IGRhdGEud2lkZ2V0VHlwZSA6ICJUcmVlTm9kZSI7CisJdmFyIG5ld0NoaWxkID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KHdpZGdldFR5cGUsIGRhdGEpOworCXBhcmVudC5hZGRDaGlsZChuZXdDaGlsZCwgaW5kZXgpOworCXRoaXMuZXhwYW5kKHBhcmVudCk7CisJaWYgKGNhbGxGdW5jKSB7CisJCWNhbGxGdW5jLmFwcGx5KGNhbGxPYmosIFtuZXdDaGlsZF0pOworCX0KKwlyZXR1cm4gbmV3Q2hpbGQ7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUJhc2ljQ29udHJvbGxlclYzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQmFzaWNDb250cm9sbGVyVjMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZDE5OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUJhc2ljQ29udHJvbGxlclYzLmpzCkBAIC0wLDAgKzEsNDYxIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZUNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlTm9kZVYzIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVWMyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMiLCBbZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZG9qby53aWRnZXQuVHJlZUNvbW1vbl0sIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmxpc3RlbmVkVHJlZXMgPSB7fTsKK30sIHtsaXN0ZW5UcmVlRXZlbnRzOlsiYWZ0ZXJTZXRGb2xkZXIiLCAiYWZ0ZXJUcmVlQ3JlYXRlIiwgImJlZm9yZVRyZWVEZXN0cm95Il0sIGxpc3Rlbk5vZGVGaWx0ZXI6ZnVuY3Rpb24gKGVsZW0pIHsKKwlyZXR1cm4gZWxlbSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LldpZGdldDsKK30sIGVkaXRvcjpudWxsLCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzKSB7CisJaWYgKGFyZ3MuZWRpdG9yKSB7CisJCXRoaXMuZWRpdG9yID0gZG9qby53aWRnZXQuYnlJZChhcmdzLmVkaXRvcik7CisJCXRoaXMuZWRpdG9yLmNvbnRyb2xsZXIgPSB0aGlzOworCX0KK30sIGdldEluZm86ZnVuY3Rpb24gKGVsZW0pIHsKKwlyZXR1cm4gZWxlbS5nZXRJbmZvKCk7Cit9LCBvbkJlZm9yZVRyZWVEZXN0cm95OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdGhpcy51bmxpc3RlblRyZWUobWVzc2FnZS5zb3VyY2UpOworfSwgb25BZnRlclNldEZvbGRlcjpmdW5jdGlvbiAobWVzc2FnZSkgeworCWlmIChtZXNzYWdlLnNvdXJjZS5leHBhbmRMZXZlbCA+IDApIHsKKwkJdGhpcy5leHBhbmRUb0xldmVsKG1lc3NhZ2Uuc291cmNlLCBtZXNzYWdlLnNvdXJjZS5leHBhbmRMZXZlbCk7CisJfQorCWlmIChtZXNzYWdlLnNvdXJjZS5sb2FkTGV2ZWwgPiAwKSB7CisJCXRoaXMubG9hZFRvTGV2ZWwobWVzc2FnZS5zb3VyY2UsIG1lc3NhZ2Uuc291cmNlLmxvYWRMZXZlbCk7CisJfQorfSwgX2ZvY3VzTmV4dFZpc2libGU6ZnVuY3Rpb24gKG5vZGVXaWRnZXQpIHsKKwlpZiAobm9kZVdpZGdldC5pc0ZvbGRlciAmJiBub2RlV2lkZ2V0LmlzRXhwYW5kZWQgJiYgbm9kZVdpZGdldC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CisJCXJldHVybldpZGdldCA9IG5vZGVXaWRnZXQuY2hpbGRyZW5bMF07CisJfSBlbHNlIHsKKwkJd2hpbGUgKG5vZGVXaWRnZXQuaXNUcmVlTm9kZSAmJiBub2RlV2lkZ2V0LmlzTGFzdENoaWxkKCkpIHsKKwkJCW5vZGVXaWRnZXQgPSBub2RlV2lkZ2V0LnBhcmVudDsKKwkJfQorCQlpZiAobm9kZVdpZGdldC5pc1RyZWVOb2RlKSB7CisJCQl2YXIgcmV0dXJuV2lkZ2V0ID0gbm9kZVdpZGdldC5wYXJlbnQuY2hpbGRyZW5bbm9kZVdpZGdldC5nZXRQYXJlbnRJbmRleCgpICsgMV07CisJCX0KKwl9CisJaWYgKHJldHVybldpZGdldCAmJiByZXR1cm5XaWRnZXQuaXNUcmVlTm9kZSkgeworCQl0aGlzLl9mb2N1c0xhYmVsKHJldHVybldpZGdldCk7CisJCXJldHVybiByZXR1cm5XaWRnZXQ7CisJfQorfSwgX2ZvY3VzUHJldmlvdXNWaXNpYmxlOmZ1bmN0aW9uIChub2RlV2lkZ2V0KSB7CisJdmFyIHJldHVybldpZGdldCA9IG5vZGVXaWRnZXQ7CisJaWYgKCFub2RlV2lkZ2V0LmlzRmlyc3RDaGlsZCgpKSB7CisJCXZhciBwcmV2aW91c1NpYmxpbmcgPSBub2RlV2lkZ2V0LnBhcmVudC5jaGlsZHJlbltub2RlV2lkZ2V0LmdldFBhcmVudEluZGV4KCkgLSAxXTsKKwkJbm9kZVdpZGdldCA9IHByZXZpb3VzU2libGluZzsKKwkJd2hpbGUgKG5vZGVXaWRnZXQuaXNGb2xkZXIgJiYgbm9kZVdpZGdldC5pc0V4cGFuZGVkICYmIG5vZGVXaWRnZXQuY2hpbGRyZW4ubGVuZ3RoID4gMCkgeworCQkJcmV0dXJuV2lkZ2V0ID0gbm9kZVdpZGdldDsKKwkJCW5vZGVXaWRnZXQgPSBub2RlV2lkZ2V0LmNoaWxkcmVuW25vZGVXaWRnZXQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CisJCX0KKwl9IGVsc2UgeworCQlub2RlV2lkZ2V0ID0gbm9kZVdpZGdldC5wYXJlbnQ7CisJfQorCWlmIChub2RlV2lkZ2V0ICYmIG5vZGVXaWRnZXQuaXNUcmVlTm9kZSkgeworCQlyZXR1cm5XaWRnZXQgPSBub2RlV2lkZ2V0OworCX0KKwlpZiAocmV0dXJuV2lkZ2V0ICYmIHJldHVybldpZGdldC5pc1RyZWVOb2RlKSB7CisJCXRoaXMuX2ZvY3VzTGFiZWwocmV0dXJuV2lkZ2V0KTsKKwkJcmV0dXJuIHJldHVybldpZGdldDsKKwl9Cit9LCBfZm9jdXNab29tSW46ZnVuY3Rpb24gKG5vZGVXaWRnZXQpIHsKKwl2YXIgcmV0dXJuV2lkZ2V0ID0gbm9kZVdpZGdldDsKKwlpZiAobm9kZVdpZGdldC5pc0ZvbGRlciAmJiAhbm9kZVdpZGdldC5pc0V4cGFuZGVkKSB7CisJCXRoaXMuZXhwYW5kKG5vZGVXaWRnZXQpOworCX0gZWxzZSB7CisJCWlmIChub2RlV2lkZ2V0LmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKKwkJCW5vZGVXaWRnZXQgPSBub2RlV2lkZ2V0LmNoaWxkcmVuWzBdOworCQl9CisJfQorCWlmIChub2RlV2lkZ2V0ICYmIG5vZGVXaWRnZXQuaXNUcmVlTm9kZSkgeworCQlyZXR1cm5XaWRnZXQgPSBub2RlV2lkZ2V0OworCX0KKwlpZiAocmV0dXJuV2lkZ2V0ICYmIHJldHVybldpZGdldC5pc1RyZWVOb2RlKSB7CisJCXRoaXMuX2ZvY3VzTGFiZWwocmV0dXJuV2lkZ2V0KTsKKwkJcmV0dXJuIHJldHVybldpZGdldDsKKwl9Cit9LCBfZm9jdXNab29tT3V0OmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIHJldHVybldpZGdldCA9IG5vZGU7CisJaWYgKG5vZGUuaXNGb2xkZXIgJiYgbm9kZS5pc0V4cGFuZGVkKSB7CisJCXRoaXMuY29sbGFwc2Uobm9kZSk7CisJfSBlbHNlIHsKKwkJbm9kZSA9IG5vZGUucGFyZW50OworCX0KKwlpZiAobm9kZSAmJiBub2RlLmlzVHJlZU5vZGUpIHsKKwkJcmV0dXJuV2lkZ2V0ID0gbm9kZTsKKwl9CisJaWYgKHJldHVybldpZGdldCAmJiByZXR1cm5XaWRnZXQuaXNUcmVlTm9kZSkgeworCQl0aGlzLl9mb2N1c0xhYmVsKHJldHVybldpZGdldCk7CisJCXJldHVybiByZXR1cm5XaWRnZXQ7CisJfQorfSwgb25Gb2N1c05vZGU6ZnVuY3Rpb24gKGUpIHsKKwl2YXIgbm9kZSA9IHRoaXMuZG9tRWxlbWVudDJUcmVlTm9kZShlLnRhcmdldCk7CisJaWYgKG5vZGUpIHsKKwkJbm9kZS52aWV3Rm9jdXMoKTsKKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChlKTsKKwl9Cit9LCBvbkJsdXJOb2RlOmZ1bmN0aW9uIChlKSB7CisJdmFyIG5vZGUgPSB0aGlzLmRvbUVsZW1lbnQyVHJlZU5vZGUoZS50YXJnZXQpOworCWlmICghbm9kZSkgeworCQlyZXR1cm47CisJfQorCXZhciBsYWJlbE5vZGUgPSBub2RlLmxhYmVsTm9kZTsKKwlsYWJlbE5vZGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpOworCW5vZGUudmlld1VuZm9jdXMoKTsKKwlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworCW5vZGUudHJlZS5kb21Ob2RlLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCAiMCIpOworfSwgX2ZvY3VzTGFiZWw6ZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgbGFzdEZvY3VzZWQgPSBub2RlLnRyZWUubGFzdEZvY3VzZWQ7CisJdmFyIGxhYmVsTm9kZTsKKwlpZiAobGFzdEZvY3VzZWQgJiYgbGFzdEZvY3VzZWQubGFiZWxOb2RlKSB7CisJCWxhYmVsTm9kZSA9IGxhc3RGb2N1c2VkLmxhYmVsTm9kZTsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KGxhYmVsTm9kZSwgIm9uYmx1ciIsIHRoaXMsICJvbkJsdXJOb2RlIik7CisJCWxhYmVsTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwgIi0xIik7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyhsYWJlbE5vZGUsICJUcmVlTGFiZWxGb2N1c2VkIik7CisJfQorCWxhYmVsTm9kZSA9IG5vZGUubGFiZWxOb2RlOworCWxhYmVsTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwgIjAiKTsKKwlub2RlLnRyZWUubGFzdEZvY3VzZWQgPSBub2RlOworCWRvam8uaHRtbC5hZGRDbGFzcyhsYWJlbE5vZGUsICJUcmVlTGFiZWxGb2N1c2VkIik7CisJZG9qby5ldmVudC5jb25uZWN0T25jZShsYWJlbE5vZGUsICJvbmJsdXIiLCB0aGlzLCAib25CbHVyTm9kZSIpOworCWRvam8uZXZlbnQuY29ubmVjdE9uY2UobGFiZWxOb2RlLCAib25mb2N1cyIsIHRoaXMsICJvbkZvY3VzTm9kZSIpOworCWxhYmVsTm9kZS5mb2N1cygpOworfSwgb25LZXk6ZnVuY3Rpb24gKGUpIHsKKwlpZiAoIWUua2V5IHx8IGUuY3Rya0tleSB8fCBlLmFsdEtleSkgeworCQlyZXR1cm47CisJfQorCXZhciBub2RlV2lkZ2V0ID0gdGhpcy5kb21FbGVtZW50MlRyZWVOb2RlKGUudGFyZ2V0KTsKKwlpZiAoIW5vZGVXaWRnZXQpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgdHJlZVdpZGdldCA9IG5vZGVXaWRnZXQudHJlZTsKKwlpZiAodHJlZVdpZGdldC5sYXN0Rm9jdXNlZCAmJiB0cmVlV2lkZ2V0Lmxhc3RGb2N1c2VkLmxhYmVsTm9kZSkgeworCQlub2RlV2lkZ2V0ID0gdHJlZVdpZGdldC5sYXN0Rm9jdXNlZDsKKwl9CisJc3dpdGNoIChlLmtleSkgeworCSAgY2FzZSBlLktFWV9UQUI6CisJCWlmIChlLnNoaWZ0S2V5KSB7CisJCQl0cmVlV2lkZ2V0LmRvbU5vZGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpOworCQl9CisJCWJyZWFrOworCSAgY2FzZSBlLktFWV9SSUdIVF9BUlJPVzoKKwkJdGhpcy5fZm9jdXNab29tSW4obm9kZVdpZGdldCk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCWJyZWFrOworCSAgY2FzZSBlLktFWV9MRUZUX0FSUk9XOgorCQl0aGlzLl9mb2N1c1pvb21PdXQobm9kZVdpZGdldCk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCWJyZWFrOworCSAgY2FzZSBlLktFWV9VUF9BUlJPVzoKKwkJdGhpcy5fZm9jdXNQcmV2aW91c1Zpc2libGUobm9kZVdpZGdldCk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCWJyZWFrOworCSAgY2FzZSBlLktFWV9ET1dOX0FSUk9XOgorCQl0aGlzLl9mb2N1c05leHRWaXNpYmxlKG5vZGVXaWRnZXQpOworCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworCQlicmVhazsKKwl9Cit9LCBvbkZvY3VzVHJlZTpmdW5jdGlvbiAoZSkgeworCWlmICghZS5jdXJyZW50VGFyZ2V0KSB7CisJCXJldHVybjsKKwl9CisJdHJ5IHsKKwkJdmFyIHRyZWVXaWRnZXQgPSB0aGlzLmdldFdpZGdldEJ5Tm9kZShlLmN1cnJlbnRUYXJnZXQpOworCQlpZiAoIXRyZWVXaWRnZXQgfHwgIXRyZWVXaWRnZXQuaXNUcmVlKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIG5vZGVXaWRnZXQgPSB0aGlzLmdldFdpZGdldEJ5Tm9kZSh0cmVlV2lkZ2V0LmRvbU5vZGUuZmlyc3RDaGlsZCk7CisJCWlmIChub2RlV2lkZ2V0ICYmIG5vZGVXaWRnZXQuaXNUcmVlTm9kZSkgeworCQkJaWYgKHRyZWVXaWRnZXQubGFzdEZvY3VzZWQgJiYgdHJlZVdpZGdldC5sYXN0Rm9jdXNlZC5pc1RyZWVOb2RlKSB7CisJCQkJbm9kZVdpZGdldCA9IHRyZWVXaWRnZXQubGFzdEZvY3VzZWQ7CisJCQl9CisJCQl0aGlzLl9mb2N1c0xhYmVsKG5vZGVXaWRnZXQpOworCQl9CisJfQorCWNhdGNoIChlKSB7CisJfQorfSwgb25BZnRlclRyZWVDcmVhdGU6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl2YXIgdHJlZSA9IG1lc3NhZ2Uuc291cmNlOworCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcih0cmVlLmRvbU5vZGUsICJvbktleSIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCB0aGlzLm9uS2V5KSk7CisJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKHRyZWUuZG9tTm9kZSwgIm9ubW91c2Vkb3duIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMub25UcmVlTW91c2VEb3duKSk7CisJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKHRyZWUuZG9tTm9kZSwgIm9uY2xpY2siLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGhpcy5vblRyZWVDbGljaykpOworCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcih0cmVlLmRvbU5vZGUsICJvbmZvY3VzIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMub25Gb2N1c1RyZWUpKTsKKwl0cmVlLmRvbU5vZGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICIwIik7CisJaWYgKHRyZWUuZXhwYW5kTGV2ZWwpIHsKKwkJdGhpcy5leHBhbmRUb0xldmVsKHRyZWUsIHRyZWUuZXhwYW5kTGV2ZWwpOworCX0KKwlpZiAodHJlZS5sb2FkTGV2ZWwpIHsKKwkJdGhpcy5sb2FkVG9MZXZlbCh0cmVlLCB0cmVlLmxvYWRMZXZlbCk7CisJfQorfSwgb25UcmVlTW91c2VEb3duOmZ1bmN0aW9uIChlKSB7Cit9LCBvblRyZWVDbGljazpmdW5jdGlvbiAoZSkgeworCXZhciBkb21FbGVtZW50ID0gZS50YXJnZXQ7CisJdmFyIG5vZGUgPSB0aGlzLmRvbUVsZW1lbnQyVHJlZU5vZGUoZG9tRWxlbWVudCk7CisJaWYgKCFub2RlIHx8ICFub2RlLmlzVHJlZU5vZGUpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgY2hlY2tFeHBhbmRDbGljayA9IGZ1bmN0aW9uIChlbCkgeworCQlyZXR1cm4gZWwgPT09IG5vZGUuZXhwYW5kTm9kZTsKKwl9OworCWlmICh0aGlzLmNoZWNrUGF0aENvbmRpdGlvbihkb21FbGVtZW50LCBjaGVja0V4cGFuZENsaWNrKSkgeworCQl0aGlzLnByb2Nlc3NFeHBhbmRDbGljayhub2RlKTsKKwl9CisJdGhpcy5fZm9jdXNMYWJlbChub2RlKTsKK30sIHByb2Nlc3NFeHBhbmRDbGljazpmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlLmlzRXhwYW5kZWQpIHsKKwkJdGhpcy5jb2xsYXBzZShub2RlKTsKKwl9IGVsc2UgeworCQl0aGlzLmV4cGFuZChub2RlKTsKKwl9Cit9LCBiYXRjaEV4cGFuZFRpbWVvdXQ6MjAsIGV4cGFuZEFsbDpmdW5jdGlvbiAobm9kZU9yVHJlZSkgeworCXJldHVybiB0aGlzLmV4cGFuZFRvTGV2ZWwobm9kZU9yVHJlZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKK30sIGNvbGxhcHNlQWxsOmZ1bmN0aW9uIChub2RlT3JUcmVlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgZmlsdGVyID0gZnVuY3Rpb24gKGVsZW0pIHsKKwkJcmV0dXJuIChlbGVtIGluc3RhbmNlb2YgZG9qby53aWRnZXQuV2lkZ2V0KSAmJiBlbGVtLmlzRm9sZGVyICYmIGVsZW0uaXNFeHBhbmRlZDsKKwl9OworCWlmIChub2RlT3JUcmVlLmlzVHJlZU5vZGUpIHsKKwkJdGhpcy5wcm9jZXNzRGVzY2VuZGFudHMobm9kZU9yVHJlZSwgZmlsdGVyLCB0aGlzLmNvbGxhcHNlKTsKKwl9IGVsc2UgeworCQlpZiAobm9kZU9yVHJlZS5pc1RyZWUpIHsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVPclRyZWUuY2hpbGRyZW4sIGZ1bmN0aW9uIChjKSB7CisJCQkJX3RoaXMucHJvY2Vzc0Rlc2NlbmRhbnRzKGMsIGZpbHRlciwgX3RoaXMuY29sbGFwc2UpOworCQkJfSk7CisJCX0KKwl9Cit9LCBleHBhbmRUb05vZGU6ZnVuY3Rpb24gKG5vZGUsIHdpdGhTZWxlY3RlZCkgeworCW4gPSB3aXRoU2VsZWN0ZWQgPyBub2RlIDogbm9kZS5wYXJlbnQ7CisJcyA9IFtdOworCXdoaWxlICghbi5pc0V4cGFuZGVkKSB7CisJCXMucHVzaChuKTsKKwkJbiA9IG4ucGFyZW50OworCX0KKwlkb2pvLmxhbmcuZm9yRWFjaChzLCBmdW5jdGlvbiAobikgeworCQluLmV4cGFuZCgpOworCX0pOworfSwgZXhwYW5kVG9MZXZlbDpmdW5jdGlvbiAobm9kZU9yVHJlZSwgbGV2ZWwpIHsKKwlkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVUaW1lb3V0SXRlcmF0b3IiKTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBmaWx0ZXJGdW5jID0gZnVuY3Rpb24gKGVsZW0pIHsKKwkJdmFyIHJlcyA9IGVsZW0uaXNGb2xkZXIgfHwgZWxlbS5jaGlsZHJlbiAmJiBlbGVtLmNoaWxkcmVuLmxlbmd0aDsKKwkJcmV0dXJuIHJlczsKKwl9OworCXZhciBjYWxsRnVuYyA9IGZ1bmN0aW9uIChub2RlLCBpdGVyYXRvcikgeworCQlfdGhpcy5leHBhbmQobm9kZSwgdHJ1ZSk7CisJCWl0ZXJhdG9yLmZvcndhcmQoKTsKKwl9OworCXZhciBpdGVyYXRvciA9IG5ldyBkb2pvLndpZGdldC5UcmVlVGltZW91dEl0ZXJhdG9yKG5vZGVPclRyZWUsIGNhbGxGdW5jLCB0aGlzKTsKKwlpdGVyYXRvci5zZXRGaWx0ZXIoZmlsdGVyRnVuYyk7CisJaXRlcmF0b3IudGltZW91dCA9IHRoaXMuYmF0Y2hFeHBhbmRUaW1lb3V0OworCWl0ZXJhdG9yLnNldE1heExldmVsKG5vZGVPclRyZWUuaXNUcmVlTm9kZSA/IGxldmVsIC0gMSA6IGxldmVsKTsKKwlyZXR1cm4gaXRlcmF0b3Iuc3RhcnQobm9kZU9yVHJlZS5pc1RyZWVOb2RlKTsKK30sIGdldFdpZGdldEJ5Tm9kZTpmdW5jdGlvbiAobm9kZSkgeworCXZhciB3aWRnZXRJZDsKKwl2YXIgbmV3Tm9kZSA9IG5vZGU7CisJd2hpbGUgKCEod2lkZ2V0SWQgPSBuZXdOb2RlLndpZGdldElkKSkgeworCQluZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlOworCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAod2lkZ2V0SWQpIHsKKwkJcmV0dXJuIGRvam8ud2lkZ2V0LmJ5SWQod2lkZ2V0SWQpOworCX0gZWxzZSB7CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGRvam8ud2lkZ2V0Lm1hbmFnZXIuYnlOb2RlKG5vZGUpOworCQl9CisJfQorfSwgZXhwYW5kOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKG5vZGUuaXNGb2xkZXIpIHsKKwkJbm9kZS5leHBhbmQoKTsKKwl9Cit9LCBjb2xsYXBzZTpmdW5jdGlvbiAobm9kZSkgeworCWlmIChub2RlLmlzRm9sZGVyKSB7CisJCW5vZGUuY29sbGFwc2UoKTsKKwl9Cit9LCBjYW5FZGl0TGFiZWw6ZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAobm9kZS5hY3Rpb25Jc0Rpc2FibGVkTm93KG5vZGUuYWN0aW9ucy5FRElUKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfSwgZWRpdExhYmVsU3RhcnQ6ZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAoIXRoaXMuY2FuRWRpdExhYmVsKG5vZGUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKCF0aGlzLmVkaXRvci5pc0Nsb3NlZCgpKSB7CisJCXRoaXMuZWRpdExhYmVsRmluaXNoKHRoaXMuZWRpdG9yLnNhdmVPbkJsdXIpOworCX0KKwl0aGlzLmRvRWRpdExhYmVsU3RhcnQobm9kZSk7Cit9LCBlZGl0TGFiZWxGaW5pc2g6ZnVuY3Rpb24gKHNhdmUpIHsKKwl0aGlzLmRvRWRpdExhYmVsRmluaXNoKHNhdmUpOworfSwgZG9FZGl0TGFiZWxTdGFydDpmdW5jdGlvbiAobm9kZSkgeworCWlmICghdGhpcy5lZGl0b3IpIHsKKwkJZG9qby5yYWlzZSh0aGlzLndpZGdldFR5cGUgKyAiOiBubyBlZGl0b3Igc3BlY2lmaWVkIik7CisJfQorCXRoaXMuZWRpdG9yLm9wZW4obm9kZSk7Cit9LCBkb0VkaXRMYWJlbEZpbmlzaDpmdW5jdGlvbiAoc2F2ZSwgc2VydmVyX2RhdGEpIHsKKwlpZiAoIXRoaXMuZWRpdG9yKSB7CisJCWRvam8ucmFpc2UodGhpcy53aWRnZXRUeXBlICsgIjogbm8gZWRpdG9yIHNwZWNpZmllZCIpOworCX0KKwl2YXIgbm9kZSA9IHRoaXMuZWRpdG9yLm5vZGU7CisJdmFyIGVkaXRvclRpdGxlID0gdGhpcy5lZGl0b3IuZ2V0Q29udGVudHMoKTsKKwl0aGlzLmVkaXRvci5jbG9zZShzYXZlKTsKKwlpZiAoc2F2ZSkgeworCQl2YXIgZGF0YSA9IHt0aXRsZTplZGl0b3JUaXRsZX07CisJCWlmIChzZXJ2ZXJfZGF0YSkgeworCQkJZG9qby5sYW5nLm1peGluKGRhdGEsIHNlcnZlcl9kYXRhKTsKKwkJfQorCQlpZiAobm9kZS5pc1BoYW50b20pIHsKKwkJCXZhciBwYXJlbnQgPSBub2RlLnBhcmVudDsKKwkJCXZhciBpbmRleCA9IG5vZGUuZ2V0UGFyZW50SW5kZXgoKTsKKwkJCW5vZGUuZGVzdHJveSgpOworCQkJZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzLnByb3RvdHlwZS5kb0NyZWF0ZUNoaWxkLmNhbGwodGhpcywgcGFyZW50LCBpbmRleCwgZGF0YSk7CisJCX0gZWxzZSB7CisJCQl2YXIgdGl0bGUgPSBzZXJ2ZXJfZGF0YSAmJiBzZXJ2ZXJfZGF0YS50aXRsZSA/IHNlcnZlcl9kYXRhLnRpdGxlIDogZWRpdG9yVGl0bGU7CisJCQlub2RlLnNldFRpdGxlKHRpdGxlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChub2RlLmlzUGhhbnRvbSkgeworCQkJbm9kZS5kZXN0cm95KCk7CisJCX0KKwl9Cit9LCBtYWtlRGVmYXVsdE5vZGU6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgpIHsKKwl2YXIgZGF0YSA9IHt0aXRsZTpwYXJlbnQudHJlZS5kZWZhdWx0Q2hpbGRUaXRsZX07CisJcmV0dXJuIGRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMy5wcm90b3R5cGUuZG9DcmVhdGVDaGlsZC5jYWxsKHRoaXMsIHBhcmVudCwgaW5kZXgsIGRhdGEpOworfSwgcnVuU3RhZ2VzOmZ1bmN0aW9uIChjaGVjaywgcHJlcGFyZSwgbWFrZSwgZmluYWxpemUsIGV4cG9zZSwgYXJncykgeworCWlmIChjaGVjayAmJiAhY2hlY2suYXBwbHkodGhpcywgYXJncykpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAocHJlcGFyZSAmJiAhcHJlcGFyZS5hcHBseSh0aGlzLCBhcmdzKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciByZXN1bHQgPSBtYWtlLmFwcGx5KHRoaXMsIGFyZ3MpOworCWlmIChmaW5hbGl6ZSkgeworCQlmaW5hbGl6ZS5hcHBseSh0aGlzLCBhcmdzKTsKKwl9CisJaWYgKCFyZXN1bHQpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKGV4cG9zZSkgeworCQlleHBvc2UuYXBwbHkodGhpcywgYXJncyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9fSk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMywge2NyZWF0ZUFuZEVkaXQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgpIHsKKwl2YXIgZGF0YSA9IHt0aXRsZTpwYXJlbnQudHJlZS5kZWZhdWx0Q2hpbGRUaXRsZX07CisJaWYgKCF0aGlzLmNhbkNyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIGNoaWxkID0gdGhpcy5kb0NyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpOworCWlmICghY2hpbGQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl0aGlzLmV4cG9zZUNyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpOworCWNoaWxkLmlzUGhhbnRvbSA9IHRydWU7CisJaWYgKCF0aGlzLmVkaXRvci5pc0Nsb3NlZCgpKSB7CisJCXRoaXMuZWRpdExhYmVsRmluaXNoKHRoaXMuZWRpdG9yLnNhdmVPbkJsdXIpOworCX0KKwl0aGlzLmRvRWRpdExhYmVsU3RhcnQoY2hpbGQpOworfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMsIHtjYW5DbG9uZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgsIGRlZXApIHsKKwlyZXR1cm4gdHJ1ZTsKK30sIGNsb25lOmZ1bmN0aW9uIChjaGlsZCwgbmV3UGFyZW50LCBpbmRleCwgZGVlcCkgeworCXJldHVybiB0aGlzLnJ1blN0YWdlcyh0aGlzLmNhbkNsb25lLCB0aGlzLnByZXBhcmVDbG9uZSwgdGhpcy5kb0Nsb25lLCB0aGlzLmZpbmFsaXplQ2xvbmUsIHRoaXMuZXhwb3NlQ2xvbmUsIGFyZ3VtZW50cyk7Cit9LCBleHBvc2VDbG9uZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCkgeworCWlmIChuZXdQYXJlbnQuaXNUcmVlTm9kZSkgeworCQl0aGlzLmV4cGFuZChuZXdQYXJlbnQpOworCX0KK30sIGRvQ2xvbmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4LCBkZWVwKSB7CisJdmFyIGNsb25lZCA9IGNoaWxkLmNsb25lKGRlZXApOworCW5ld1BhcmVudC5hZGRDaGlsZChjbG9uZWQsIGluZGV4KTsKKwlyZXR1cm4gY2xvbmVkOworfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMsIHtjYW5EZXRhY2g6ZnVuY3Rpb24gKGNoaWxkKSB7CisJaWYgKGNoaWxkLmFjdGlvbklzRGlzYWJsZWROb3coY2hpbGQuYWN0aW9ucy5ERVRBQ0gpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9LCBkZXRhY2g6ZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gdGhpcy5ydW5TdGFnZXModGhpcy5jYW5EZXRhY2gsIHRoaXMucHJlcGFyZURldGFjaCwgdGhpcy5kb0RldGFjaCwgdGhpcy5maW5hbGl6ZURldGFjaCwgdGhpcy5leHBvc2VEZXRhY2gsIGFyZ3VtZW50cyk7Cit9LCBkb0RldGFjaDpmdW5jdGlvbiAobm9kZSwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwlub2RlLmRldGFjaCgpOworfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMsIHtjYW5EZXN0cm95Q2hpbGQ6ZnVuY3Rpb24gKGNoaWxkKSB7CisJaWYgKGNoaWxkLnBhcmVudCAmJiAhdGhpcy5jYW5EZXRhY2goY2hpbGQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9LCBkZXN0cm95Q2hpbGQ6ZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gdGhpcy5ydW5TdGFnZXModGhpcy5jYW5EZXN0cm95Q2hpbGQsIHRoaXMucHJlcGFyZURlc3Ryb3lDaGlsZCwgdGhpcy5kb0Rlc3Ryb3lDaGlsZCwgdGhpcy5maW5hbGl6ZURlc3Ryb3lDaGlsZCwgdGhpcy5leHBvc2VEZXN0cm95Q2hpbGQsIGFyZ3VtZW50cyk7Cit9LCBkb0Rlc3Ryb3lDaGlsZDpmdW5jdGlvbiAobm9kZSkgeworCW5vZGUuZGVzdHJveSgpOworfX0pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyVjMsIHtjYW5Nb3ZlTm90QU5vZGU6ZnVuY3Rpb24gKGNoaWxkLCBwYXJlbnQpIHsKKwlpZiAoY2hpbGQudHJlZUNhbk1vdmUpIHsKKwkJcmV0dXJuIGNoaWxkLnRyZWVDYW5Nb3ZlKHBhcmVudCk7CisJfQorCXJldHVybiB0cnVlOworfSwgY2FuTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCkgeworCWlmICghY2hpbGQuaXNUcmVlTm9kZSkgeworCQlyZXR1cm4gdGhpcy5jYW5Nb3ZlTm90QU5vZGUoY2hpbGQsIG5ld1BhcmVudCk7CisJfQorCWlmIChjaGlsZC5hY3Rpb25Jc0Rpc2FibGVkTm93KGNoaWxkLmFjdGlvbnMuTU9WRSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoY2hpbGQucGFyZW50ICE9PSBuZXdQYXJlbnQgJiYgbmV3UGFyZW50LmFjdGlvbklzRGlzYWJsZWROb3cobmV3UGFyZW50LmFjdGlvbnMuQUREQ0hJTEQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIG5vZGUgPSBuZXdQYXJlbnQ7CisJd2hpbGUgKG5vZGUuaXNUcmVlTm9kZSkgeworCQlpZiAobm9kZSA9PT0gY2hpbGQpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnQ7CisJfQorCXJldHVybiB0cnVlOworfSwgbW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpIHsKKwlyZXR1cm4gdGhpcy5ydW5TdGFnZXModGhpcy5jYW5Nb3ZlLCB0aGlzLnByZXBhcmVNb3ZlLCB0aGlzLmRvTW92ZSwgdGhpcy5maW5hbGl6ZU1vdmUsIHRoaXMuZXhwb3NlTW92ZSwgYXJndW1lbnRzKTsKK30sIGRvTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpIHsKKwljaGlsZC50cmVlLm1vdmUoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpOworCXJldHVybiB0cnVlOworfSwgZXhwb3NlTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCkgeworCWlmIChuZXdQYXJlbnQuaXNUcmVlTm9kZSkgeworCQl0aGlzLmV4cGFuZChuZXdQYXJlbnQpOworCX0KK319KTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzLCB7Y2FuQ3JlYXRlQ2hpbGQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIGRhdGEpIHsKKwlpZiAocGFyZW50LmFjdGlvbklzRGlzYWJsZWROb3cocGFyZW50LmFjdGlvbnMuQUREQ0hJTEQpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9LCBjcmVhdGVDaGlsZDpmdW5jdGlvbiAocGFyZW50LCBpbmRleCwgZGF0YSkgeworCWlmICghZGF0YSkgeworCQlkYXRhID0ge3RpdGxlOnBhcmVudC50cmVlLmRlZmF1bHRDaGlsZFRpdGxlfTsKKwl9CisJcmV0dXJuIHRoaXMucnVuU3RhZ2VzKHRoaXMuY2FuQ3JlYXRlQ2hpbGQsIHRoaXMucHJlcGFyZUNyZWF0ZUNoaWxkLCB0aGlzLmRvQ3JlYXRlQ2hpbGQsIHRoaXMuZmluYWxpemVDcmVhdGVDaGlsZCwgdGhpcy5leHBvc2VDcmVhdGVDaGlsZCwgW3BhcmVudCwgaW5kZXgsIGRhdGFdKTsKK30sIHByZXBhcmVDcmVhdGVDaGlsZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRydWU7Cit9LCBmaW5hbGl6ZUNyZWF0ZUNoaWxkOmZ1bmN0aW9uICgpIHsKK30sIGRvQ3JlYXRlQ2hpbGQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIGRhdGEpIHsKKwl2YXIgbmV3Q2hpbGQgPSBwYXJlbnQudHJlZS5jcmVhdGVOb2RlKGRhdGEpOworCXBhcmVudC5hZGRDaGlsZChuZXdDaGlsZCwgaW5kZXgpOworCXJldHVybiBuZXdDaGlsZDsKK30sIGV4cG9zZUNyZWF0ZUNoaWxkOmZ1bmN0aW9uIChwYXJlbnQpIHsKKwlyZXR1cm4gdGhpcy5leHBhbmQocGFyZW50KTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQ29tbW9uLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQ29tbW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmY3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVDb21tb24uanMKQEAgLTAsMCArMSw4MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LlRyZWVDb21tb24iLCBudWxsLCB7bGlzdGVuVHJlZUV2ZW50czpbXSwgbGlzdGVuZWRUcmVlczp7fSwgbGlzdGVuTm9kZUZpbHRlcjpudWxsLCBsaXN0ZW5UcmVlOmZ1bmN0aW9uICh0cmVlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlpZiAodGhpcy5saXN0ZW5lZFRyZWVzW3RyZWUud2lkZ2V0SWRdKSB7CisJCXJldHVybjsKKwl9CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5saXN0ZW5UcmVlRXZlbnRzLCBmdW5jdGlvbiAoZXZlbnQpIHsKKwkJdmFyIGV2ZW50SGFuZGxlciA9ICJvbiIgKyBldmVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGV2ZW50LnN1YnN0cigxKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzW2V2ZW50XSwgX3RoaXMsIGV2ZW50SGFuZGxlcik7CisJfSk7CisJdmFyIGZpbHRlcjsKKwlpZiAodGhpcy5saXN0ZW5Ob2RlRmlsdGVyKSB7CisJCXRoaXMucHJvY2Vzc0Rlc2NlbmRhbnRzKHRyZWUsIHRoaXMubGlzdGVuTm9kZUZpbHRlciwgdGhpcy5saXN0ZW5Ob2RlLCB0cnVlKTsKKwl9CisJdGhpcy5saXN0ZW5lZFRyZWVzW3RyZWUud2lkZ2V0SWRdID0gdHJ1ZTsKK30sIGxpc3Rlbk5vZGU6ZnVuY3Rpb24gKCkgeworfSwgdW5saXN0ZW5Ob2RlOmZ1bmN0aW9uICgpIHsKK30sIHVubGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSwgbm9kZUZpbHRlcikgeworCXZhciBfdGhpcyA9IHRoaXM7CisJaWYgKCF0aGlzLmxpc3RlbmVkVHJlZXNbdHJlZS53aWRnZXRJZF0pIHsKKwkJcmV0dXJuOworCX0KKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmxpc3RlblRyZWVFdmVudHMsIGZ1bmN0aW9uIChldmVudCkgeworCQl2YXIgZXZlbnRIYW5kbGVyID0gIm9uIiArIGV2ZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc3Vic3RyKDEpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lc1tldmVudF0sIF90aGlzLCBldmVudEhhbmRsZXIpOworCX0pOworCWlmICh0aGlzLmxpc3Rlbk5vZGVGaWx0ZXIpIHsKKwkJdGhpcy5wcm9jZXNzRGVzY2VuZGFudHModHJlZSwgdGhpcy5saXN0ZW5Ob2RlRmlsdGVyLCB0aGlzLnVubGlzdGVuTm9kZSwgdHJ1ZSk7CisJfQorCWRlbGV0ZSB0aGlzLmxpc3RlbmVkVHJlZXNbdHJlZS53aWRnZXRJZF07Cit9LCBjaGVja1BhdGhDb25kaXRpb246ZnVuY3Rpb24gKGRvbUVsZW1lbnQsIGNvbmRpdGlvbikgeworCXdoaWxlIChkb21FbGVtZW50ICYmICFkb21FbGVtZW50LndpZGdldElkKSB7CisJCWlmIChjb25kaXRpb24uY2FsbChudWxsLCBkb21FbGVtZW50KSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQucGFyZW50Tm9kZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfSwgZG9tRWxlbWVudDJUcmVlTm9kZTpmdW5jdGlvbiAoZG9tRWxlbWVudCkgeworCXdoaWxlIChkb21FbGVtZW50ICYmICFkb21FbGVtZW50LndpZGdldElkKSB7CisJCWRvbUVsZW1lbnQgPSBkb21FbGVtZW50LnBhcmVudE5vZGU7CisJfQorCWlmICghZG9tRWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJdmFyIHdpZGdldCA9IGRvam8ud2lkZ2V0LmJ5SWQoZG9tRWxlbWVudC53aWRnZXRJZCk7CisJaWYgKCF3aWRnZXQuaXNUcmVlTm9kZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIHdpZGdldDsKK30sIHByb2Nlc3NEZXNjZW5kYW50czpmdW5jdGlvbiAoZWxlbSwgZmlsdGVyLCBmdW5jLCBza2lwRmlyc3QpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCWlmICghc2tpcEZpcnN0KSB7CisJCWlmICghZmlsdGVyLmNhbGwoX3RoaXMsIGVsZW0pKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZnVuYy5jYWxsKF90aGlzLCBlbGVtKTsKKwl9CisJdmFyIHN0YWNrID0gW2VsZW1dOworCXdoaWxlIChlbGVtID0gc3RhY2sucG9wKCkpIHsKKwkJZG9qby5sYW5nLmZvckVhY2goZWxlbS5jaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW0pIHsKKwkJCWlmIChmaWx0ZXIuY2FsbChfdGhpcywgZWxlbSkpIHsKKwkJCQlmdW5jLmNhbGwoX3RoaXMsIGVsZW0pOworCQkJCXN0YWNrLnB1c2goZWxlbSk7CisJCQl9CisJCX0pOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQ29udGV4dE1lbnUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVDb250ZXh0TWVudS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBlODYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQ29udGV4dE1lbnUuanMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lk1lbnUyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudSIsIGRvam8ud2lkZ2V0LlBvcHVwTWVudTIsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmxpc3RlbmVkVHJlZXMgPSBbXTsKK30sIHtvcGVuOmZ1bmN0aW9uICh4LCB5LCBwYXJlbnRNZW51LCBleHBsb2RlU3JjKSB7CisJdmFyIHJlc3VsdCA9IGRvam8ud2lkZ2V0LlBvcHVwTWVudTIucHJvdG90eXBlLm9wZW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLm9wZW4sIHttZW51OnRoaXN9KTsKKwlyZXR1cm4gcmVzdWx0OworfSwgbGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCXZhciBub2RlcyA9IHRyZWUuZ2V0RGVzY2VuZGFudHMoKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmICghbm9kZXNbaV0uaXNUcmVlTm9kZSkgeworCQkJY29udGludWU7CisJCX0KKwkJdGhpcy5iaW5kRG9tTm9kZShub2Rlc1tpXS5sYWJlbE5vZGUpOworCX0KKwl2YXIgX3RoaXMgPSB0aGlzOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jcmVhdGVET01Ob2RlLCB0aGlzLCAib25DcmVhdGVET01Ob2RlIik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLm1vdmVGcm9tLCB0aGlzLCAib25Nb3ZlRnJvbSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLCB0aGlzLCAib25SZW1vdmVOb2RlIik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmFkZENoaWxkLCB0aGlzLCAib25BZGRDaGlsZCIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwl0aGlzLmxpc3RlbmVkVHJlZXMucHVzaCh0cmVlKTsKK30sIHVubGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHRoaXMsICJvbkNyZWF0ZURPTU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgdGhpcywgIm9uTW92ZUZyb20iKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUsIHRoaXMsICJvblJlbW92ZU5vZGUiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCwgdGhpcywgIm9uQWRkQ2hpbGQiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlzdGVuZWRUcmVlcy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5saXN0ZW5lZFRyZWVzW2ldID09PSB0cmVlKSB7CisJCQl0aGlzLmxpc3RlbmVkVHJlZXMuc3BsaWNlKGksIDEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9LCBvblRyZWVEZXN0cm95OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdGhpcy51bmxpc3RlblRyZWUobWVzc2FnZS5zb3VyY2UpOworfSwgYmluZFRyZWVOb2RlOmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlLmdldERlc2NlbmRhbnRzKCksIGZ1bmN0aW9uIChlKSB7CisJCV90aGlzLmJpbmREb21Ob2RlKGUubGFiZWxOb2RlKTsKKwl9KTsKK30sIHVuQmluZFRyZWVOb2RlOmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlLmdldERlc2NlbmRhbnRzKCksIGZ1bmN0aW9uIChlKSB7CisJCV90aGlzLnVuQmluZERvbU5vZGUoZS5sYWJlbE5vZGUpOworCX0pOworfSwgb25DcmVhdGVET01Ob2RlOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdGhpcy5iaW5kVHJlZU5vZGUobWVzc2FnZS5zb3VyY2UpOworfSwgb25Nb3ZlRnJvbTpmdW5jdGlvbiAobWVzc2FnZSkgeworCWlmICghZG9qby5sYW5nLmluQXJyYXkodGhpcy5saXN0ZW5lZFRyZWVzLCBtZXNzYWdlLm5ld1RyZWUpKSB7CisJCXRoaXMudW5CaW5kVHJlZU5vZGUobWVzc2FnZS5jaGlsZCk7CisJfQorfSwgb25Nb3ZlVG86ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwlpZiAoZG9qby5sYW5nLmluQXJyYXkodGhpcy5saXN0ZW5lZFRyZWVzLCBtZXNzYWdlLm5ld1RyZWUpKSB7CisJCXRoaXMuYmluZFRyZWVOb2RlKG1lc3NhZ2UuY2hpbGQpOworCX0KK30sIG9uUmVtb3ZlTm9kZTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXRoaXMudW5CaW5kVHJlZU5vZGUobWVzc2FnZS5jaGlsZCk7Cit9LCBvbkFkZENoaWxkOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJaWYgKG1lc3NhZ2UuZG9tTm9kZUluaXRpYWxpemVkKSB7CisJCXRoaXMuYmluZFRyZWVOb2RlKG1lc3NhZ2UuY2hpbGQpOworCX0KK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZU1lbnVJdGVtIiwgZG9qby53aWRnZXQuTWVudUl0ZW0yLCB7dHJlZUFjdGlvbnM6IiIsIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwl0aGlzLnRyZWVBY3Rpb25zID0gdGhpcy50cmVlQWN0aW9ucy5zcGxpdCgiLCIpOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmVlQWN0aW9ucy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnRyZWVBY3Rpb25zW2ldID0gdGhpcy50cmVlQWN0aW9uc1tpXS50b1VwcGVyQ2FzZSgpOworCX0KK30sIGdldFRyZWVOb2RlOmZ1bmN0aW9uICgpIHsKKwl2YXIgbWVudSA9IHRoaXM7CisJd2hpbGUgKCEobWVudSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudSkpIHsKKwkJbWVudSA9IG1lbnUucGFyZW50OworCX0KKwl2YXIgc291cmNlID0gbWVudS5nZXRUb3BPcGVuRXZlbnQoKS50YXJnZXQ7CisJd2hpbGUgKCFzb3VyY2UuZ2V0QXR0cmlidXRlKCJ0cmVlTm9kZSIpICYmIHNvdXJjZS50YWdOYW1lICE9ICJib2R5IikgeworCQlzb3VyY2UgPSBzb3VyY2UucGFyZW50Tm9kZTsKKwl9CisJaWYgKHNvdXJjZS50YWdOYW1lID09ICJib2R5IikgeworCQlkb2pvLnJhaXNlKCJ0cmVlTm9kZSBub3QgZGV0ZWN0ZWQiKTsKKwl9CisJdmFyIHRyZWVOb2RlID0gZG9qby53aWRnZXQubWFuYWdlci5nZXRXaWRnZXRCeUlkKHNvdXJjZS5nZXRBdHRyaWJ1dGUoInRyZWVOb2RlIikpOworCXJldHVybiB0cmVlTm9kZTsKK30sIG1lbnVPcGVuOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdmFyIHRyZWVOb2RlID0gdGhpcy5nZXRUcmVlTm9kZSgpOworCXRoaXMuc2V0RGlzYWJsZWQoZmFsc2UpOworCXZhciBfdGhpcyA9IHRoaXM7CisJZG9qby5sYW5nLmZvckVhY2goX3RoaXMudHJlZUFjdGlvbnMsIGZ1bmN0aW9uIChhY3Rpb24pIHsKKwkJX3RoaXMuc2V0RGlzYWJsZWQodHJlZU5vZGUuYWN0aW9uSXNEaXNhYmxlZChhY3Rpb24pKTsKKwl9KTsKK30sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIlsiICsgdGhpcy53aWRnZXRUeXBlICsgIiBub2RlICIgKyB0aGlzLmdldFRyZWVOb2RlKCkgKyAiXSI7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUNvbnRleHRNZW51VjMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVDb250ZXh0TWVudVYzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTI1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVDb250ZXh0TWVudVYzLmpzCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudVYzIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5NZW51MiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlQ29tbW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudVYzIiwgW2Rvam8ud2lkZ2V0LlBvcHVwTWVudTIsIGRvam8ud2lkZ2V0LlRyZWVDb21tb25dLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5saXN0ZW5lZFRyZWVzID0ge307Cit9LCB7bGlzdGVuVHJlZUV2ZW50czpbImFmdGVyVHJlZUNyZWF0ZSIsICJiZWZvcmVUcmVlRGVzdHJveSJdLCBsaXN0ZW5Ob2RlRmlsdGVyOmZ1bmN0aW9uIChlbGVtKSB7CisJcmV0dXJuIGVsZW0gaW5zdGFuY2VvZiBkb2pvLndpZGdldC5XaWRnZXQ7Cit9LCBvbkFmdGVyVHJlZUNyZWF0ZTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXZhciB0cmVlID0gbWVzc2FnZS5zb3VyY2U7CisJdGhpcy5iaW5kRG9tTm9kZSh0cmVlLmRvbU5vZGUpOworfSwgb25CZWZvcmVUcmVlRGVzdHJveTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXRoaXMudW5CaW5kRG9tTm9kZShtZXNzYWdlLnNvdXJjZS5kb21Ob2RlKTsKK30sIGdldFRyZWVOb2RlOmZ1bmN0aW9uICgpIHsKKwl2YXIgc291cmNlID0gdGhpcy5nZXRUb3BPcGVuRXZlbnQoKS50YXJnZXQ7CisJdmFyIHRyZWVOb2RlID0gdGhpcy5kb21FbGVtZW50MlRyZWVOb2RlKHNvdXJjZSk7CisJcmV0dXJuIHRyZWVOb2RlOworfSwgb3BlbjpmdW5jdGlvbiAoKSB7CisJdmFyIHJlc3VsdCA9IGRvam8ud2lkZ2V0LlBvcHVwTWVudTIucHJvdG90eXBlLm9wZW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMuY2hpbGRyZW5baV0ubWVudU9wZW4pIHsKKwkJCXRoaXMuY2hpbGRyZW5baV0ubWVudU9wZW4odGhpcy5nZXRUcmVlTm9kZSgpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgY2xvc2U6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpcy5jaGlsZHJlbltpXS5tZW51Q2xvc2UpIHsKKwkJCXRoaXMuY2hpbGRyZW5baV0ubWVudUNsb3NlKHRoaXMuZ2V0VHJlZU5vZGUoKSk7CisJCX0KKwl9CisJdmFyIHJlc3VsdCA9IGRvam8ud2lkZ2V0LlBvcHVwTWVudTIucHJvdG90eXBlLmNsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJcmV0dXJuIHJlc3VsdDsKK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZU1lbnVJdGVtVjMiLCBbZG9qby53aWRnZXQuTWVudUl0ZW0yLCBkb2pvLndpZGdldC5UcmVlQ29tbW9uXSwgZnVuY3Rpb24gKCkgeworCXRoaXMudHJlZUFjdGlvbnMgPSBbXTsKK30sIHt0cmVlQWN0aW9uczoiIiwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmVlQWN0aW9ucy5sZW5ndGg7IGkrKykgeworCQl0aGlzLnRyZWVBY3Rpb25zW2ldID0gdGhpcy50cmVlQWN0aW9uc1tpXS50b1VwcGVyQ2FzZSgpOworCX0KK30sIGdldFRyZWVOb2RlOmZ1bmN0aW9uICgpIHsKKwl2YXIgbWVudSA9IHRoaXM7CisJd2hpbGUgKCEobWVudSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LlRyZWVDb250ZXh0TWVudVYzKSkgeworCQltZW51ID0gbWVudS5wYXJlbnQ7CisJfQorCXZhciB0cmVlTm9kZSA9IG1lbnUuZ2V0VHJlZU5vZGUoKTsKKwlyZXR1cm4gdHJlZU5vZGU7Cit9LCBtZW51T3BlbjpmdW5jdGlvbiAodHJlZU5vZGUpIHsKKwl0cmVlTm9kZS52aWV3RW1waGFzaXplKCk7CisJdGhpcy5zZXREaXNhYmxlZChmYWxzZSk7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaChfdGhpcy50cmVlQWN0aW9ucywgZnVuY3Rpb24gKGFjdGlvbikgeworCQlfdGhpcy5zZXREaXNhYmxlZCh0cmVlTm9kZS5hY3Rpb25Jc0Rpc2FibGVkTm93KGFjdGlvbikpOworCX0pOworfSwgbWVudUNsb3NlOmZ1bmN0aW9uICh0cmVlTm9kZSkgeworCXRyZWVOb2RlLnZpZXdVbmVtcGhhc2l6ZSgpOworfSwgdG9TdHJpbmc6ZnVuY3Rpb24gKCkgeworCXJldHVybiAiWyIgKyB0aGlzLndpZGdldFR5cGUgKyAiIG5vZGUgIiArIHRoaXMuZ2V0VHJlZU5vZGUoKSArICJdIjsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlQ29udHJvbGxlckV4dGVuc2lvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUNvbnRyb2xsZXJFeHRlbnNpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllZGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUNvbnRyb2xsZXJFeHRlbnNpb24uanMKQEAgLTAsMCArMSw2MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUNvbnRyb2xsZXJFeHRlbnNpb24iKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuVHJlZUNvbnRyb2xsZXJFeHRlbnNpb24iLCBudWxsLCB7c2F2ZUV4cGFuZGVkSW5kaWNlczpmdW5jdGlvbiAobm9kZSwgZmllbGQpIHsKKwl2YXIgb2JqID0ge307CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCWlmIChub2RlLmNoaWxkcmVuW2ldLmlzRXhwYW5kZWQpIHsKKwkJCXZhciBrZXkgPSBkb2pvLmxhbmcuaXNVbmRlZmluZWQoZmllbGQpID8gaSA6IG5vZGUuY2hpbGRyZW5baV1bZmllbGRdOworCQkJb2JqW2tleV0gPSB0aGlzLnNhdmVFeHBhbmRlZEluZGljZXMobm9kZS5jaGlsZHJlbltpXSwgZmllbGQpOworCQl9CisJfQorCXJldHVybiBvYmo7Cit9LCByZXN0b3JlRXhwYW5kZWRJbmRpY2VzOmZ1bmN0aW9uIChub2RlLCBzYXZlZEluZGljZXMsIGZpZWxkKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChub2RlLCBzYXZlZEluZGljZXMpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwkJdGhpcy5zYXZlZEluZGljZXMgPSBzYXZlZEluZGljZXM7CisJCXRoaXMucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHsKKwkJCV90aGlzLnJlc3RvcmVFeHBhbmRlZEluZGljZXModGhpcy5ub2RlLCB0aGlzLnNhdmVkSW5kaWNlcywgZmllbGQpOworCQl9OworCX07CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXZhciBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07CisJCXZhciBmb3VuZCA9IGZhbHNlOworCQl2YXIga2V5ID0gLTE7CisJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoZmllbGQpICYmIHNhdmVkSW5kaWNlc1tpXSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJa2V5ID0gaTsKKwkJfQorCQlpZiAoZmllbGQpIHsKKwkJCWZvciAodmFyIGtleSBpbiBzYXZlZEluZGljZXMpIHsKKwkJCQlpZiAoa2V5ID09IGNoaWxkW2ZpZWxkXSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZm91bmQpIHsKKwkJCXZhciBoID0gbmV3IGhhbmRsZXIoY2hpbGQsIHNhdmVkSW5kaWNlc1trZXldKTsKKwkJCV90aGlzLmV4cGFuZChjaGlsZCwgZmFsc2UsIGgsIGgucHJvY2Vzcyk7CisJCX0gZWxzZSB7CisJCQlpZiAoY2hpbGQuaXNFeHBhbmRlZCkgeworCQkJCWRvam8ubGFuZy5mb3JFYWNoKGNoaWxkLmdldERlc2NlbmRhbnRzKCksIGZ1bmN0aW9uIChlbGVtKSB7CisJCQkJCV90aGlzLmNvbGxhcHNlKGVsZW0pOworCQkJCX0pOworCQkJfQorCQl9CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVEZW1vLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRGVtby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI5YWFhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRGVtby5qcwpAQCAtMCwwICsxLDg1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlRGVtbyIpOworZG9qby5yZXF1aXJlKCJkb2pvLkRlZmVycmVkIik7Citkb2pvLndpZGdldC5UcmVlRGVtbyA9IHtyZXBvcnRJZkRlZmVyZWQ6ZnVuY3Rpb24gKHJlcykgeworCWlmIChyZXMgaW5zdGFuY2VvZiBkb2pvLkRlZmVycmVkKSB7CisJCXJlcy5hZGRDYWxsYmFja3MoZnVuY3Rpb24gKHJlcykgeworCQkJcmV0dXJuIHJlczsKKwkJfSwgZnVuY3Rpb24gKGVycikgeworCQkJZG9qby5kZWJ1ZygiRXJyb3IiKTsKKwkJCWRvam8uZGVidWdTaGFsbG93KGVycik7CisJCX0pOworCX0KK30sIHJlc2V0UmFuZG9tQ2hpbGRyZW46ZnVuY3Rpb24gKG1heENvdW50KSB7CisJdGhpcy5yYW5kb21DaGlsZHJlbk1heENvdW50ID0gbWF4Q291bnQ7CisJdGhpcy5yYW5kb21DaGlsZHJlbkNvdW50ID0gMDsKKwl0aGlzLnJhbmRvbUNoaWxkcmVuRGVwdGggPSAwOworfSwgbWFrZVJhbmRvbUNoaWxkcmVuOmZ1bmN0aW9uICh0aXRsZSkgeworCXRoaXMucmFuZG9tQ2hpbGRyZW5EZXB0aCsrOworCXZhciBjaGlsZHJlbiA9IFtdOworCWZvciAodmFyIGkgPSAxOyBpIDw9IDU7IGkrKykgeworCQl2YXIgdCA9IHRpdGxlICsgKHRoaXMucmFuZG9tQ2hpbGRyZW5EZXB0aCA9PSAxID8gIiIgOiAiLiIpICsgaTsKKwkJdmFyIG5vZGUgPSB7dGl0bGU6dH07CisJCWNoaWxkcmVuLnB1c2gobm9kZSk7CisJCXRoaXMucmFuZG9tQ2hpbGRyZW5Db3VudCsrOworCQlpZiAodGhpcy5yYW5kb21DaGlsZHJlbkNvdW50ID49IHRoaXMucmFuZG9tQ2hpbGRyZW5NYXhDb3VudCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJdmFyIGkgPSAxOworCXZhciBfdGhpcyA9IHRoaXM7CisJZG9qby5sYW5nLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgeworCQl2YXIgdCA9IHRpdGxlICsgKF90aGlzLnJhbmRvbUNoaWxkcmVuRGVwdGggPT0gMSA/ICIiIDogIi4iKSArIGk7CisJCWkrKzsKKwkJaWYgKF90aGlzLnJhbmRvbUNoaWxkcmVuQ291bnQgPCBfdGhpcy5yYW5kb21DaGlsZHJlbk1heENvdW50ICYmIChfdGhpcy5yYW5kb21DaGlsZHJlbkRlcHRoID09IDEgJiYgY2hpbGQgPT09IGNoaWxkcmVuWzBdIHx8IF90aGlzLnJhbmRvbUNoaWxkcmVuRGVwdGggPCA1ICYmIE1hdGgucmFuZG9tKCkgPiAwLjMpKSB7CisJCQljaGlsZC5jaGlsZHJlbiA9IF90aGlzLm1ha2VSYW5kb21DaGlsZHJlbih0KTsKKwkJfQorCX0pOworCXRoaXMucmFuZG9tQ2hpbGRyZW5EZXB0aC0tOworCXJldHVybiBjaGlsZHJlbjsKK30sIGJpbmREZW1vTWVudTpmdW5jdGlvbiAoY29udHJvbGxlcikgeworCXZhciBfdCA9IHRoaXM7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoInRyZWVDb250ZXh0TWVudURlc3Ryb3kvZW5nYWdlIiwgZnVuY3Rpb24gKG1lbnVJdGVtKSB7CisJCXZhciBub2RlID0gbWVudUl0ZW0uZ2V0VHJlZU5vZGUoKTsKKwkJX3QucmVwb3J0SWZEZWZlcmVkKGNvbnRyb2xsZXIuZGVzdHJveUNoaWxkKG5vZGUpKTsKKwl9KTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgidHJlZUNvbnRleHRNZW51UmVmcmVzaC9lbmdhZ2UiLCBmdW5jdGlvbiAobWVudUl0ZW0pIHsKKwkJdmFyIG5vZGUgPSBtZW51SXRlbS5nZXRUcmVlTm9kZSgpOworCQlfdC5yZXBvcnRJZkRlZmVyZWQoY29udHJvbGxlci5yZWZyZXNoQ2hpbGRyZW4obm9kZSkpOworCX0pOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJ0cmVlQ29udGV4dE1lbnVDcmVhdGUvZW5nYWdlIiwgZnVuY3Rpb24gKG1lbnVJdGVtKSB7CisJCXZhciBub2RlID0gbWVudUl0ZW0uZ2V0VHJlZU5vZGUoKTsKKwkJdmFyIGQgPSBjb250cm9sbGVyLmNyZWF0ZUFuZEVkaXQobm9kZSwgMCk7CisJCV90LnJlcG9ydElmRGVmZXJlZChkKTsKKwl9KTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgidHJlZUNvbnRleHRNZW51VXAvZW5nYWdlIiwgZnVuY3Rpb24gKG1lbnVJdGVtKSB7CisJCXZhciBub2RlID0gbWVudUl0ZW0uZ2V0VHJlZU5vZGUoKTsKKwkJaWYgKG5vZGUuaXNGaXJzdENoaWxkKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlfdC5yZXBvcnRJZkRlZmVyZWQoY29udHJvbGxlci5tb3ZlKG5vZGUsIG5vZGUucGFyZW50LCBub2RlLmdldFBhcmVudEluZGV4KCkgLSAxKSk7CisJfSk7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoInRyZWVDb250ZXh0TWVudURvd24vZW5nYWdlIiwgZnVuY3Rpb24gKG1lbnVJdGVtKSB7CisJCXZhciBub2RlID0gbWVudUl0ZW0uZ2V0VHJlZU5vZGUoKTsKKwkJaWYgKG5vZGUuaXNMYXN0Q2hpbGQoKSkgeworCQkJcmV0dXJuOworCQl9CisJCV90LnJlcG9ydElmRGVmZXJlZChjb250cm9sbGVyLm1vdmUobm9kZSwgbm9kZS5wYXJlbnQsIG5vZGUuZ2V0UGFyZW50SW5kZXgoKSArIDEpKTsKKwl9KTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgidHJlZUNvbnRleHRNZW51RWRpdC9lbmdhZ2UiLCBmdW5jdGlvbiAobWVudUl0ZW0pIHsKKwkJdmFyIG5vZGUgPSBtZW51SXRlbS5nZXRUcmVlTm9kZSgpOworCQlfdC5yZXBvcnRJZkRlZmVyZWQoY29udHJvbGxlci5lZGl0TGFiZWxTdGFydChub2RlKSk7CisJfSk7Cit9fTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRGVzZWxlY3RPbkRibHNlbGVjdC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURlc2VsZWN0T25EYmxzZWxlY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0ODU0NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURlc2VsZWN0T25EYmxzZWxlY3QuanMKQEAgLTAsMCArMSwyMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZURlc2VsZWN0T25EYmxzZWxlY3QiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlU2VsZWN0b3JWMyIpOworZG9qby5kZXByZWNhdGVkKCJEb2VzIGFueW9uZSBzdGlsbCBuZWVkIHRoaXMgZXh0ZW5zaW9uPyAoVHJlZURlc2VsZWN0T25EYmxzZWxlY3QpIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVEZXNlbGVjdE9uRGJsc2VsZWN0IiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXRdLCB7c2VsZWN0b3I6IiIsIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCXRoaXMuc2VsZWN0b3IgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuc2VsZWN0b3IpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuc2VsZWN0b3IuZXZlbnROYW1lcy5kYmxzZWxlY3QsIHRoaXMsICJvbkRibHNlbGVjdCIpOworfSwgb25EYmxzZWxlY3Q6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnNlbGVjdG9yLmRlc2VsZWN0KG1lc3NhZ2Uubm9kZSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURpc2FibGVXcmFwRXh0ZW5zaW9uLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRGlzYWJsZVdyYXBFeHRlbnNpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkZTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURpc2FibGVXcmFwRXh0ZW5zaW9uLmpzCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVEaXNhYmxlV3JhcEV4dGVuc2lvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVFeHRlbnNpb24iKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZURpc2FibGVXcmFwRXh0ZW5zaW9uIiwgZG9qby53aWRnZXQuVHJlZUV4dGVuc2lvbiwge3RlbXBsYXRlQ3NzU3RyaW5nOiJcbi8qIENTUyBmb3IgVHJlZURpc2FibGVXcmFwRXh0ZW5zaW9uICovXG5cbi5UcmVlRGlzYWJsZVdyYXAge1xuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLlRyZWVJRURpc2FibGVXcmFwIHtcblx0d2lkdGg6IGV4cHJlc3Npb24oIDUgKyBmaXJzdENoaWxkLm9mZnNldFdpZHRoICk7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvVHJlZURpc2FibGVXcmFwLmNzcyIpLCBsaXN0ZW5UcmVlOmZ1bmN0aW9uICh0cmVlKSB7CisJdmFyIHdyYXBwaW5nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdmFyIGNsYXp6ID0gdHJlZS5jbGFzc1ByZWZpeCArICJEaXNhYmxlV3JhcCI7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJY2xhenogPSBjbGF6eiArICIgIiArIHRyZWUuY2xhc3NQcmVmaXggKyAiSUVEaXNhYmxlV3JhcCI7CisJfQorCWRvam8uaHRtbC5zZXRDbGFzcyh3cmFwcGluZ0RpdiwgY2xhenopOworCXZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CisJd3JhcHBpbmdEaXYuYXBwZW5kQ2hpbGQodGFibGUpOworCXZhciB0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5Iik7CisJdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpOworCXZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7CisJdGJvZHkuYXBwZW5kQ2hpbGQodHIpOworCXZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7CisJdHIuYXBwZW5kQ2hpbGQodGQpOworCWlmICh0cmVlLmRvbU5vZGUucGFyZW50Tm9kZSkgeworCQl0cmVlLmRvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBpbmdEaXYsIHRyZWUuZG9tTm9kZSk7CisJfQorCXRkLmFwcGVuZENoaWxkKHRyZWUuZG9tTm9kZSk7CisJdHJlZS5kb21Ob2RlID0gd3JhcHBpbmdEaXY7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURuZENvbnRyb2xsZXJWMy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURuZENvbnRyb2xsZXJWMy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDlmNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRG5kQ29udHJvbGxlclYzLmpzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVEbmRDb250cm9sbGVyVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5kbmQuVHJlZURyYWdBbmREcm9wVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5leHBlcmltZW50YWwiKTsKK2Rvam8uZXhwZXJpbWVudGFsKCJUcmVlIGRyYWcnbidkcm9wJyBoYXMgbG90cyBvZiBwcm9ibGVtcy9idWdzLCBpdCByZXF1aXJlcyBkb2pvIGRyYWcnbidkcm9wIG92ZXJoYXVsIHRvIHdvcmssIHByb2JhYmx5IGluIDAuNSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlRG5kQ29udHJvbGxlclYzIiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LlRyZWVDb21tb25dLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5kcmFnU291cmNlcyA9IHt9OworCXRoaXMuZHJvcFRhcmdldHMgPSB7fTsKKwl0aGlzLmxpc3RlbmVkVHJlZXMgPSB7fTsKK30sIHtsaXN0ZW5UcmVlRXZlbnRzOlsiYWZ0ZXJDaGFuZ2VUcmVlIiwgImJlZm9yZVRyZWVEZXN0cm95IiwgImFmdGVyQWRkQ2hpbGQiXSwgbGlzdGVuTm9kZUZpbHRlcjpmdW5jdGlvbiAoZWxlbSkgeworCXJldHVybiBlbGVtIGluc3RhbmNlb2YgZG9qby53aWRnZXQuV2lkZ2V0OworfSwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoYXJncykgeworCXRoaXMudHJlZUNvbnRyb2xsZXIgPSBkb2pvLmxhbmcuaXNTdHJpbmcoYXJncy5jb250cm9sbGVyKSA/IGRvam8ud2lkZ2V0LmJ5SWQoYXJncy5jb250cm9sbGVyKSA6IGFyZ3MuY29udHJvbGxlcjsKKwlpZiAoIXRoaXMudHJlZUNvbnRyb2xsZXIpIHsKKwkJZG9qby5yYWlzZSgidHJlZUNvbnRyb2xsZXIgbXVzdCBiZSBkZWNsYXJlZCIpOworCX0KK30sIG9uQmVmb3JlVHJlZURlc3Ryb3k6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnVubGlzdGVuVHJlZShtZXNzYWdlLnNvdXJjZSk7Cit9LCBvbkFmdGVyQWRkQ2hpbGQ6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLmxpc3Rlbk5vZGUobWVzc2FnZS5jaGlsZCk7Cit9LCBvbkFmdGVyQ2hhbmdlVHJlZTpmdW5jdGlvbiAobWVzc2FnZSkgeworCWlmICghbWVzc2FnZS5vbGRUcmVlKSB7CisJCXJldHVybjsKKwl9CisJaWYgKCFtZXNzYWdlLm5ld1RyZWUgfHwgIXRoaXMubGlzdGVuZWRUcmVlc1ttZXNzYWdlLm5ld1RyZWUud2lkZ2V0SWRdKSB7CisJCXRoaXMucHJvY2Vzc0Rlc2NlbmRhbnRzKG1lc3NhZ2Uubm9kZSwgdGhpcy5saXN0ZW5Ob2RlRmlsdGVyLCB0aGlzLnVubGlzdGVuTm9kZSk7CisJfQorCWlmICghdGhpcy5saXN0ZW5lZFRyZWVzW21lc3NhZ2Uub2xkVHJlZS53aWRnZXRJZF0pIHsKKwkJdGhpcy5wcm9jZXNzRGVzY2VuZGFudHMobWVzc2FnZS5ub2RlLCB0aGlzLmxpc3Rlbk5vZGVGaWx0ZXIsIHRoaXMubGlzdGVuTm9kZSk7CisJfQorfSwgbGlzdGVuTm9kZTpmdW5jdGlvbiAobm9kZSkgeworCWlmICghbm9kZS50cmVlLkRuZE1vZGUpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGhpcy5kcmFnU291cmNlc1tub2RlLndpZGdldElkXSB8fCB0aGlzLmRyb3BUYXJnZXRzW25vZGUud2lkZ2V0SWRdKSB7CisJCXJldHVybjsKKwl9CisJdmFyIHNvdXJjZSA9IG51bGw7CisJdmFyIHRhcmdldCA9IG51bGw7CisJaWYgKCFub2RlLmFjdGlvbklzRGlzYWJsZWQobm9kZS5hY3Rpb25zLk1PVkUpKSB7CisJCXZhciBzb3VyY2UgPSB0aGlzLm1ha2VEcmFnU291cmNlKG5vZGUpOworCQl0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdID0gc291cmNlOworCX0KKwl2YXIgdGFyZ2V0ID0gdGhpcy5tYWtlRHJvcFRhcmdldChub2RlKTsKKwl0aGlzLmRyb3BUYXJnZXRzW25vZGUud2lkZ2V0SWRdID0gdGFyZ2V0OworfSwgbWFrZURyYWdTb3VyY2U6ZnVuY3Rpb24gKG5vZGUpIHsKKwlyZXR1cm4gbmV3IGRvam8uZG5kLlRyZWVEcmFnU291cmNlVjMobm9kZS5jb250ZW50Tm9kZSwgdGhpcywgbm9kZS50cmVlLndpZGdldElkLCBub2RlKTsKK30sIG1ha2VEcm9wVGFyZ2V0OmZ1bmN0aW9uIChub2RlKSB7CisJcmV0dXJuIG5ldyBkb2pvLmRuZC5UcmVlRHJvcFRhcmdldFYzKG5vZGUuY29udGVudE5vZGUsIHRoaXMudHJlZUNvbnRyb2xsZXIsIG5vZGUudHJlZS5EbmRBY2NlcHRUeXBlcywgbm9kZSk7Cit9LCB1bmxpc3Rlbk5vZGU6ZnVuY3Rpb24gKG5vZGUpIHsKKwlpZiAodGhpcy5kcmFnU291cmNlc1tub2RlLndpZGdldElkXSkgeworCQlkb2pvLmRuZC5kcmFnTWFuYWdlci51bnJlZ2lzdGVyRHJhZ1NvdXJjZSh0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdKTsKKwkJZGVsZXRlIHRoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF07CisJfQorCWlmICh0aGlzLmRyb3BUYXJnZXRzW25vZGUud2lkZ2V0SWRdKSB7CisJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcm9wVGFyZ2V0KHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0pOworCQlkZWxldGUgdGhpcy5kcm9wVGFyZ2V0c1tub2RlLndpZGdldElkXTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZURvY0ljb25FeHRlbnNpb24uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVEb2NJY29uRXh0ZW5zaW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTg4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVEb2NJY29uRXh0ZW5zaW9uLmpzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVEb2NJY29uRXh0ZW5zaW9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZUV4dGVuc2lvbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlRG9jSWNvbkV4dGVuc2lvbiIsIFtkb2pvLndpZGdldC5UcmVlRXh0ZW5zaW9uXSwge3RlbXBsYXRlQ3NzU3RyaW5nOiJcbi8qIENTUyBmb3IgVHJlZURvY0ljb25FeHRlbnNpb24gKi9cblxuXG4vKiBsb25nIHZlcnRpY2FsIGxpbmUgdW5kZXIgZG9jSWNvbiwgY29ubmVjdGluZyB3LyBjaGlsZHJlbiAqL1xuLlRyZWVTdGF0ZUNoaWxkcmVuWWVzLUV4cGFuZE9wZW4gLlRyZWVJY29uQ29udGVudCB7XG4JYmFja2dyb3VuZC1pbWFnZSA6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvaV9sb25nLmdpZicpO1xuCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0O1xuCWJhY2tncm91bmQtcG9zaXRpb246IDE4cHggOXB4O1xufVxuXG4vKiBjbG9zZSBoYXMgaGlnaGVyIHByaW9yaXR5ICovXG4uVHJlZVN0YXRlQ2hpbGRyZW5ZZXMtRXhwYW5kQ2xvc2VkIC5UcmVlSWNvbkNvbnRlbnQge1xuCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoKTtcbn1cblxuLyogaGlnaGVyIHByaW90aXR5OiBzYW1lIGxlbmd0aCBhbmQgYXBwZWFyIGFmdGVyIGJhY2tncm91bmQtZGVmaW5pdGlvbiAqL1xuLlRyZWVTdGF0ZUNoaWxkcmVuTm8tRXhwYW5kTGVhZiAuVHJlZUljb25Db250ZW50IHtcbgliYWNrZ3JvdW5kLWltYWdlIDogdXJsKCk7XG59XG5cbi5UcmVlU3RhdGVDaGlsZHJlbk5vLUV4cGFuZENsb3NlZCAuVHJlZUljb25Db250ZW50IHtcbgliYWNrZ3JvdW5kLWltYWdlIDogdXJsKCk7XG59XG5cbi5UcmVlU3RhdGVDaGlsZHJlbk5vLUV4cGFuZE9wZW4gLlRyZWVJY29uQ29udGVudCB7XG4JYmFja2dyb3VuZC1pbWFnZSA6IHVybCgpO1xufVxuXG5cbi8qIGhpZ2hlc3QgcHJpb3JpdHkgKi9cbi5UcmVlSWNvbkRvY3VtZW50IHtcbgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2RvY3VtZW50LmdpZicpO1xufVxuXG4uVHJlZUV4cGFuZE9wZW4gLlRyZWVJY29uRm9sZGVyIHtcbgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL29wZW4uZ2lmJyk7XG59XG5cbi5UcmVlRXhwYW5kQ2xvc2VkIC5UcmVlSWNvbkZvbGRlciB7XG4JYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9jbG9zZWQuZ2lmJyk7XG59XG5cbi8qIGdlbmVyaWMgY2xhc3MgZm9yIGRvY0ljb24gKi9cbi5UcmVlSWNvbiB7XG4Jd2lkdGg6IDE4cHg7XG4JaGVpZ2h0OiAxOHB4O1xuCWZsb2F0OiBsZWZ0O1xuCWRpc3BsYXk6IGlubGluZTtcbgliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDtcbn1cblxuZGl2LlRyZWVDb250ZW50IHtcbgltYXJnaW4tbGVmdDogMzZweDtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9UcmVlRG9jSWNvbi5jc3MiKSwgbGlzdGVuVHJlZUV2ZW50czpbImFmdGVyQ2hhbmdlVHJlZSIsICJhZnRlclNldEZvbGRlciIsICJhZnRlclVuc2V0Rm9sZGVyIl0sIGxpc3Rlbk5vZGVGaWx0ZXI6ZnVuY3Rpb24gKGVsZW0pIHsKKwlyZXR1cm4gZWxlbSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LldpZGdldDsKK30sIGdldG5vZGVEb2NUeXBlOmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIG5vZGVEb2NUeXBlID0gbm9kZS5nZXRub2RlRG9jVHlwZSgpOworCWlmICghbm9kZURvY1R5cGUpIHsKKwkJbm9kZURvY1R5cGUgPSBub2RlLmlzRm9sZGVyID8gIkZvbGRlciIgOiAiRG9jdW1lbnQiOworCX0KKwlyZXR1cm4gbm9kZURvY1R5cGU7Cit9LCBzZXRub2RlRG9jVHlwZUNsYXNzOmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIHJlZyA9IG5ldyBSZWdFeHAoIihefFxccykiICsgbm9kZS50cmVlLmNsYXNzUHJlZml4ICsgIkljb25cXHcrIiwgImciKTsKKwl2YXIgY2xhenogPSBkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZS5pY29uTm9kZSkucmVwbGFjZShyZWcsICIiKSArICIgIiArIG5vZGUudHJlZS5jbGFzc1ByZWZpeCArICJJY29uIiArIHRoaXMuZ2V0bm9kZURvY1R5cGUobm9kZSk7CisJZG9qby5odG1sLnNldENsYXNzKG5vZGUuaWNvbk5vZGUsIGNsYXp6KTsKK30sIG9uQWZ0ZXJTZXRGb2xkZXI6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwlpZiAobWVzc2FnZS5zb3VyY2UuaWNvbk5vZGUpIHsKKwkJdGhpcy5zZXRub2RlRG9jVHlwZUNsYXNzKG1lc3NhZ2Uuc291cmNlKTsKKwl9Cit9LCBvbkFmdGVyVW5zZXRGb2xkZXI6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnNldG5vZGVEb2NUeXBlQ2xhc3MobWVzc2FnZS5zb3VyY2UpOworfSwgbGlzdGVuTm9kZTpmdW5jdGlvbiAobm9kZSkgeworCW5vZGUuY29udGVudEljb25Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdmFyIGNsYXp6ID0gbm9kZS50cmVlLmNsYXNzUHJlZml4ICsgIkljb25Db250ZW50IjsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQljbGF6eiA9IGNsYXp6ICsgIiAiICsgbm9kZS50cmVlLmNsYXNzUHJlZml4ICsgIklFSWNvbkNvbnRlbnQiOworCX0KKwlkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZS5jb250ZW50SWNvbk5vZGUsIGNsYXp6KTsKKwlub2RlLmNvbnRlbnROb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5vZGUuY29udGVudEljb25Ob2RlLCBub2RlLmV4cGFuZE5vZGUpOworCW5vZGUuaWNvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZS5pY29uTm9kZSwgbm9kZS50cmVlLmNsYXNzUHJlZml4ICsgIkljb24iICsgIiAiICsgbm9kZS50cmVlLmNsYXNzUHJlZml4ICsgIkljb24iICsgdGhpcy5nZXRub2RlRG9jVHlwZShub2RlKSk7CisJbm9kZS5jb250ZW50SWNvbk5vZGUuYXBwZW5kQ2hpbGQobm9kZS5leHBhbmROb2RlKTsKKwlub2RlLmNvbnRlbnRJY29uTm9kZS5hcHBlbmRDaGlsZChub2RlLmljb25Ob2RlKTsKKwlkb2pvLmRvbS5yZW1vdmVOb2RlKG5vZGUuY29udGVudE5vZGUpOworCW5vZGUuY29udGVudEljb25Ob2RlLmFwcGVuZENoaWxkKG5vZGUuY29udGVudE5vZGUpOworfSwgb25BZnRlckNoYW5nZVRyZWU6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCWlmICghbWVzc2FnZS5vbGRUcmVlIHx8ICF0aGlzLmxpc3RlbmVkVHJlZXNbbWVzc2FnZS5vbGRUcmVlLndpZGdldElkXSkgeworCQl0aGlzLnByb2Nlc3NEZXNjZW5kYW50cyhtZXNzYWdlLm5vZGUsIHRoaXMubGlzdGVuTm9kZUZpbHRlciwgdGhpcy5saXN0ZW5Ob2RlKTsKKwl9Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUVkaXRvci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUVkaXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRlNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRWRpdG9yLmpzCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5SaWNoVGV4dCIpOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlRWRpdG9yIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVFZGl0b3IiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7c2luZ2xlTGluZU1vZGU6ZmFsc2UsIHNhdmVPbkJsdXI6dHJ1ZSwgc3luYzpmYWxzZSwgc2VsZWN0T25PcGVuOnRydWUsIGNvbnRyb2xsZXI6bnVsbCwgbm9kZTpudWxsLCByaWNoVGV4dFBhcmFtczp7c3R5bGVTaGVldHM6InNyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWVFZGl0b3IuY3NzIn0sIGdldENvbnRlbnRzOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5yaWNoVGV4dC5nZXRFZGl0b3JDb250ZW50KCk7Cit9LCBvcGVuOmZ1bmN0aW9uIChub2RlKSB7CisJaWYgKCF0aGlzLnJpY2hUZXh0KSB7CisJCXRoaXMucmljaFRleHQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlJpY2hUZXh0IiwgdGhpcy5yaWNoVGV4dFBhcmFtcywgbm9kZS5sYWJlbE5vZGUpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QoImFyb3VuZCIsIHRoaXMucmljaFRleHQsICJvbktleURvd24iLCB0aGlzLCAicmljaFRleHRfb25LZXlEb3duIik7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnJpY2hUZXh0LCAib25CbHVyIiwgdGhpcywgInJpY2hUZXh0X29uQmx1ciIpOworCQl2YXIgc2VsZiA9IHRoaXM7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnJpY2hUZXh0LCAib25Mb2FkIiwgZnVuY3Rpb24gKCkgeworCQkJaWYgKHNlbGYuc2VsZWN0T25PcGVuKSB7CisJCQkJc2VsZi5yaWNoVGV4dC5leGVjQ29tbWFuZCgic2VsZWN0YWxsIik7CisJCQl9CisJCX0pOworCX0gZWxzZSB7CisJCXRoaXMucmljaFRleHQub3Blbihub2RlLmxhYmVsTm9kZSk7CisJfQorCXRoaXMubm9kZSA9IG5vZGU7Cit9LCBjbG9zZTpmdW5jdGlvbiAoc2F2ZSkgeworCXRoaXMucmljaFRleHQuY2xvc2Uoc2F2ZSk7CisJdGhpcy5ub2RlID0gbnVsbDsKK30sIGlzQ2xvc2VkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIXRoaXMucmljaFRleHQgfHwgdGhpcy5yaWNoVGV4dC5pc0Nsb3NlZDsKK30sIGV4ZWNDb21tYW5kOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnJpY2hUZXh0LmV4ZWNDb21tYW5kLmFwcGx5KHRoaXMucmljaFRleHQsIGFyZ3VtZW50cyk7Cit9LCByaWNoVGV4dF9vbktleURvd246ZnVuY3Rpb24gKGludm9jYXRpb24pIHsKKwl2YXIgZSA9IGludm9jYXRpb24uYXJnc1swXTsKKwlpZiAoKCFlKSAmJiAodGhpcy5vYmplY3QpKSB7CisJCWUgPSBkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQodGhpcy5lZGl0b3Iud2luZG93LmV2ZW50KTsKKwl9CisJc3dpdGNoIChlLmtleUNvZGUpIHsKKwkgIGNhc2UgZS5LRVlfRVNDQVBFOgorCQl0aGlzLmZpbmlzaChmYWxzZSk7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCWJyZWFrOworCSAgY2FzZSBlLktFWV9FTlRFUjoKKwkJaWYgKGUuY3RybEtleSAmJiAhdGhpcy5zaW5nbGVMaW5lTW9kZSkgeworCQkJdGhpcy5leGVjQ29tbWFuZCgiaW5zZXJ0aHRtbCIsICI8YnIvPiIpOworCQl9IGVsc2UgeworCQkJdGhpcy5maW5pc2godHJ1ZSk7CisJCX0KKwkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChlKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlyZXR1cm4gaW52b2NhdGlvbi5wcm9jZWVkKCk7CisJfQorfSwgcmljaFRleHRfb25CbHVyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmZpbmlzaCh0aGlzLnNhdmVPbkJsdXIpOworfSwgZmluaXNoOmZ1bmN0aW9uIChzYXZlKSB7CisJcmV0dXJuIHRoaXMuY29udHJvbGxlci5lZGl0TGFiZWxGaW5pc2goc2F2ZSwgdGhpcy5zeW5jKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRW1waGFzZU9uU2VsZWN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRW1waGFzZU9uU2VsZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVFbXBoYXNlT25TZWxlY3QuanMKQEAgLTAsMCArMSw0MyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVFbXBoYXNlT25TZWxlY3QiKTsKKworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvclYzIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKKworLy8gc2VsZWN0b3IgZXh0ZW5zaW9uIHRvIGVtcGhhc2Ugbm9kZQorCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LlRyZWVFbXBoYXNlT25TZWxlY3QiLAorCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsCit7CisJc2VsZWN0b3I6ICIiLAorCQorCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgeworCQl0aGlzLnNlbGVjdG9yID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLnNlbGVjdG9yKTsKKwkJCisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuc2VsZWN0b3IuZXZlbnROYW1lcy5zZWxlY3QsIHRoaXMsICJvblNlbGVjdCIpOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLnNlbGVjdG9yLmV2ZW50TmFtZXMuZGVzZWxlY3QsIHRoaXMsICJvbkRlc2VsZWN0Iik7CQorCX0sCisKKwkKKwlvblNlbGVjdDogZnVuY3Rpb24obWVzc2FnZSkgeworCQltZXNzYWdlLm5vZGUudmlld0VtcGhhc2UoKQkJCisJfSwKKwkKKwlvbkRlc2VsZWN0OiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCW1lc3NhZ2Uubm9kZS52aWV3VW5lbXBoYXNlKCkKKwl9CisJCisKK30pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRW1waGFzaXplT25TZWxlY3QuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVFbXBoYXNpemVPblNlbGVjdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMyMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRW1waGFzaXplT25TZWxlY3QuanMKQEAgLTAsMCArMSwyNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUVtcGhhc2l6ZU9uU2VsZWN0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlRW1waGFzaXplT25TZWxlY3QiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7c2VsZWN0b3I6IiIsIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCXRoaXMuc2VsZWN0b3IgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuc2VsZWN0b3IpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuc2VsZWN0b3IuZXZlbnROYW1lcy5zZWxlY3QsIHRoaXMsICJvblNlbGVjdCIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuc2VsZWN0b3IuZXZlbnROYW1lcy5kZXNlbGVjdCwgdGhpcywgIm9uRGVzZWxlY3QiKTsKK30sIG9uU2VsZWN0OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJbWVzc2FnZS5ub2RlLnZpZXdFbXBoYXNpemUoKTsKK30sIG9uRGVzZWxlY3Q6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwltZXNzYWdlLm5vZGUudmlld1VuZW1waGFzaXplKCk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUV4cGFuZE9uU2VsZWN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRXhwYW5kT25TZWxlY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5ZjUxOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUV4cGFuZE9uU2VsZWN0LmpzCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlRXhwYW5kT25TZWxlY3QiKTsKKworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvclYzIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5zZWxlY3Rpb24iKTsKKworLyoqCisgKiB3aGVuIGEgbm9kZSBpcyBzZWxlY3RlZCwgZXhwYW5kcyB0cmVlIHRvIG1ha2UgaXQgdmlzaWJsZQorICogdXNlZnVsIGZvciBwcm9ncmFtIGV4cGFuc2lvbgorICovCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LlRyZWVFeHBhbmRPblNlbGVjdCIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKK3sKKwlzZWxlY3RvcjogIiIsCisJY29udHJvbGxlcjogIiIsCisJCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCXRoaXMuc2VsZWN0b3IgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuc2VsZWN0b3IpOworCQl0aGlzLmNvbnRyb2xsZXIgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuY29udHJvbGxlcik7CisJCQorCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLnNlbGVjdG9yLmV2ZW50TmFtZXMuc2VsZWN0LCB0aGlzLCAib25TZWxlY3QiKTsJCisJfSwKKworCQorCW9uU2VsZWN0OiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCXRoaXMuY29udHJvbGxlci5leHBhbmRUb05vZGUobWVzc2FnZS5ub2RlKQorCX0KKwkKKwkKKworfSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVFeHBhbmRUb05vZGVPblNlbGVjdC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUV4cGFuZFRvTm9kZU9uU2VsZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTA0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVFeHBhbmRUb05vZGVPblNlbGVjdC5qcwpAQCAtMCwwICsxLDIyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlRXhwYW5kVG9Ob2RlT25TZWxlY3QiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlRXhwYW5kVG9Ob2RlT25TZWxlY3QiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7c2VsZWN0b3I6IiIsIGNvbnRyb2xsZXI6IiIsIHdpdGhTZWxlY3RlZDpmYWxzZSwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5zZWxlY3RvciA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5zZWxlY3Rvcik7CisJdGhpcy5jb250cm9sbGVyID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLmNvbnRyb2xsZXIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuc2VsZWN0b3IuZXZlbnROYW1lcy5zZWxlY3QsIHRoaXMsICJvblNlbGVjdCIpOworfSwgb25TZWxlY3RFdmVudDpmdW5jdGlvbiAobWVzc2FnZSkgeworCXRoaXMuY29udHJvbGxlci5leHBhbmRUb05vZGUobWVzc2FnZS5ub2RlLCB0aGlzLndpdGhTZWxlY3RlZCk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUV4dGVuc2lvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUV4dGVuc2lvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTNlMmMxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlRXh0ZW5zaW9uLmpzCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVFeHRlbnNpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlQ29tbW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVFeHRlbnNpb24iLCBbZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZG9qby53aWRnZXQuVHJlZUNvbW1vbl0sIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmxpc3RlbmVkVHJlZXMgPSB7fTsKK30sIHt9KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlTGlua0V4dGVuc2lvbi5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUxpbmtFeHRlbnNpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwOTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZUxpbmtFeHRlbnNpb24uanMKQEAgLTAsMCArMSw0NiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUxpbmtFeHRlbnNpb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlRXh0ZW5zaW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVMaW5rRXh0ZW5zaW9uIiwgZG9qby53aWRnZXQuVHJlZUV4dGVuc2lvbiwgZnVuY3Rpb24gKCkgeworCXRoaXMucGFyYW1zID0ge307Cit9LCB7bGlzdGVuVHJlZUV2ZW50czpbImFmdGVyQ2hhbmdlVHJlZSJdLCBsaXN0ZW5UcmVlOmZ1bmN0aW9uICh0cmVlKSB7CisJZG9qby53aWRnZXQuVHJlZUNvbW1vbi5wcm90b3R5cGUubGlzdGVuVHJlZS5jYWxsKHRoaXMsIHRyZWUpOworCXZhciBsYWJlbE5vZGUgPSB0cmVlLmxhYmVsTm9kZVRlbXBsYXRlOworCXZhciBuZXdMYWJlbCA9IHRoaXMubWFrZUFMYWJlbCgpOworCWRvam8uaHRtbC5zZXRDbGFzcyhuZXdMYWJlbCwgZG9qby5odG1sLmdldENsYXNzKGxhYmVsTm9kZSkpOworCWxhYmVsTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdMYWJlbCwgbGFiZWxOb2RlKTsKK30sIG1ha2VBTGFiZWw6ZnVuY3Rpb24gKCkgeworCXZhciBuZXdMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKwlmb3IgKHZhciBrZXkgaW4gdGhpcy5wYXJhbXMpIHsKKwkJaWYgKGtleSBpbiB7fSkgeworCQkJY29udGludWU7CisJCX0KKwkJbmV3TGFiZWwuc2V0QXR0cmlidXRlKGtleSwgdGhpcy5wYXJhbXNba2V5XSk7CisJfQorCXJldHVybiBuZXdMYWJlbDsKK30sIG9uQWZ0ZXJDaGFuZ2VUcmVlOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlpZiAoIW1lc3NhZ2Uub2xkVHJlZSkgeworCQl0aGlzLmxpc3Rlbk5vZGUobWVzc2FnZS5ub2RlKTsKKwl9Cit9LCBsaXN0ZW5Ob2RlOmZ1bmN0aW9uIChub2RlKSB7CisJZm9yICh2YXIga2V5IGluIG5vZGUub2JqZWN0KSB7CisJCWlmIChrZXkgaW4ge30pIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5vZGUubGFiZWxOb2RlLnNldEF0dHJpYnV0ZShrZXksIG5vZGUub2JqZWN0W2tleV0pOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlTG9hZGluZ0NvbnRyb2xsZXIuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVMb2FkaW5nQ29udHJvbGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAyY2NjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlTG9hZGluZ0NvbnRyb2xsZXIuanMKQEAgLTAsMCArMSw5NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUxvYWRpbmdDb250cm9sbGVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXIiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZUxvYWRpbmdDb250cm9sbGVyIiwgZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlciwge1JQQ1VybDoiIiwgUlBDQWN0aW9uUGFyYW06ImFjdGlvbiIsIFJQQ0Vycm9ySGFuZGxlcjpmdW5jdGlvbiAodHlwZSwgb2JqLCBldnQpIHsKKwlhbGVydCgiUlBDIEVycm9yOiAiICsgKG9iai5tZXNzYWdlIHx8ICJubyBtZXNzYWdlIikpOworfSwgcHJldmVudENhY2hlOnRydWUsIGdldFJQQ1VybDpmdW5jdGlvbiAoYWN0aW9uKSB7CisJaWYgKHRoaXMuUlBDVXJsID09ICJsb2NhbCIpIHsKKwkJdmFyIGRpciA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7CisJCXZhciBsb2NhbFVybCA9IGRpciArICIvIiArIGFjdGlvbjsKKwkJcmV0dXJuIGxvY2FsVXJsOworCX0KKwlpZiAoIXRoaXMuUlBDVXJsKSB7CisJCWRvam8ucmFpc2UoIkVtcHR5IFJQQ1VybDogY2FuJ3QgbG9hZCIpOworCX0KKwlyZXR1cm4gdGhpcy5SUENVcmwgKyAodGhpcy5SUENVcmwuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpICsgdGhpcy5SUENBY3Rpb25QYXJhbSArICI9IiArIGFjdGlvbjsKK30sIGxvYWRQcm9jZXNzUmVzcG9uc2U6ZnVuY3Rpb24gKG5vZGUsIHJlc3VsdCwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwlpZiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXN1bHQuZXJyb3IpKSB7CisJCXRoaXMuUlBDRXJyb3JIYW5kbGVyKCJzZXJ2ZXIiLCByZXN1bHQuZXJyb3IpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBuZXdDaGlsZHJlbiA9IHJlc3VsdDsKKwlpZiAoIWRvam8ubGFuZy5pc0FycmF5KG5ld0NoaWxkcmVuKSkgeworCQlkb2pvLnJhaXNlKCJsb2FkUHJvY2Vzc1Jlc3BvbnNlOiBOb3QgYXJyYXkgbG9hZGVkOiAiICsgbmV3Q2hpbGRyZW4pOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCW5ld0NoaWxkcmVuW2ldID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KG5vZGUud2lkZ2V0VHlwZSwgbmV3Q2hpbGRyZW5baV0pOworCQlub2RlLmFkZENoaWxkKG5ld0NoaWxkcmVuW2ldKTsKKwl9CisJbm9kZS5zdGF0ZSA9IG5vZGUubG9hZFN0YXRlcy5MT0FERUQ7CisJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGNhbGxGdW5jKSkgeworCQljYWxsRnVuYy5hcHBseShkb2pvLmxhbmcuaXNVbmRlZmluZWQoY2FsbE9iaikgPyB0aGlzIDogY2FsbE9iaiwgW25vZGUsIG5ld0NoaWxkcmVuXSk7CisJfQorfSwgZ2V0SW5mbzpmdW5jdGlvbiAob2JqKSB7CisJcmV0dXJuIG9iai5nZXRJbmZvKCk7Cit9LCBydW5SUEM6ZnVuY3Rpb24gKGt3KSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgaGFuZGxlID0gZnVuY3Rpb24gKHR5cGUsIGRhdGEsIGV2dCkgeworCQlpZiAoa3cubG9jaykgeworCQkJZG9qby5sYW5nLmZvckVhY2goa3cubG9jaywgZnVuY3Rpb24gKHQpIHsKKwkJCQl0LnVubG9jaygpOworCQkJfSk7CisJCX0KKwkJaWYgKHR5cGUgPT0gImxvYWQiKSB7CisJCQlrdy5sb2FkLmNhbGwodGhpcywgZGF0YSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLlJQQ0Vycm9ySGFuZGxlcih0eXBlLCBkYXRhLCBldnQpOworCQl9CisJfTsKKwlpZiAoa3cubG9jaykgeworCQlkb2pvLmxhbmcuZm9yRWFjaChrdy5sb2NrLCBmdW5jdGlvbiAodCkgeworCQkJdC5sb2NrKCk7CisJCX0pOworCX0KKwlkb2pvLmlvLmJpbmQoe3VybDprdy51cmwsIGhhbmRsZTpkb2pvLmxhbmcuaGl0Y2godGhpcywgaGFuZGxlKSwgbWltZXR5cGU6InRleHQvanNvbiIsIHByZXZlbnRDYWNoZTpfdGhpcy5wcmV2ZW50Q2FjaGUsIHN5bmM6a3cuc3luYywgY29udGVudDp7ZGF0YTpkb2pvLmpzb24uc2VyaWFsaXplKGt3LnBhcmFtcyl9fSk7Cit9LCBsb2FkUmVtb3RlOmZ1bmN0aW9uIChub2RlLCBzeW5jLCBjYWxsT2JqLCBjYWxsRnVuYykgeworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIHBhcmFtcyA9IHtub2RlOnRoaXMuZ2V0SW5mbyhub2RlKSwgdHJlZTp0aGlzLmdldEluZm8obm9kZS50cmVlKX07CisJdGhpcy5ydW5SUEMoe3VybDp0aGlzLmdldFJQQ1VybCgiZ2V0Q2hpbGRyZW4iKSwgbG9hZDpmdW5jdGlvbiAocmVzdWx0KSB7CisJCV90aGlzLmxvYWRQcm9jZXNzUmVzcG9uc2Uobm9kZSwgcmVzdWx0LCBjYWxsT2JqLCBjYWxsRnVuYyk7CisJfSwgc3luYzpzeW5jLCBsb2NrOltub2RlXSwgcGFyYW1zOnBhcmFtc30pOworfSwgZXhwYW5kOmZ1bmN0aW9uIChub2RlLCBzeW5jLCBjYWxsT2JqLCBjYWxsRnVuYykgeworCWlmIChub2RlLnN0YXRlID09IG5vZGUubG9hZFN0YXRlcy5VTkNIRUNLRUQgJiYgbm9kZS5pc0ZvbGRlcikgeworCQl0aGlzLmxvYWRSZW1vdGUobm9kZSwgc3luYywgdGhpcywgZnVuY3Rpb24gKG5vZGUsIG5ld0NoaWxkcmVuKSB7CisJCQl0aGlzLmV4cGFuZChub2RlLCBzeW5jLCBjYWxsT2JqLCBjYWxsRnVuYyk7CisJCX0pOworCQlyZXR1cm47CisJfQorCWRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXIucHJvdG90eXBlLmV4cGFuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZG9Nb3ZlOmZ1bmN0aW9uIChjaGlsZCwgbmV3UGFyZW50LCBpbmRleCkgeworCWlmIChuZXdQYXJlbnQuaXNUcmVlTm9kZSAmJiBuZXdQYXJlbnQuc3RhdGUgPT0gbmV3UGFyZW50LmxvYWRTdGF0ZXMuVU5DSEVDS0VEKSB7CisJCXRoaXMubG9hZFJlbW90ZShuZXdQYXJlbnQsIHRydWUpOworCX0KKwlyZXR1cm4gZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlci5wcm90b3R5cGUuZG9Nb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBkb0NyZWF0ZUNoaWxkOmZ1bmN0aW9uIChwYXJlbnQsIGluZGV4LCBkYXRhLCBjYWxsT2JqLCBjYWxsRnVuYykgeworCWlmIChwYXJlbnQuc3RhdGUgPT0gcGFyZW50LmxvYWRTdGF0ZXMuVU5DSEVDS0VEKSB7CisJCXRoaXMubG9hZFJlbW90ZShwYXJlbnQsIHRydWUpOworCX0KKwlyZXR1cm4gZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlci5wcm90b3R5cGUuZG9DcmVhdGVDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVMb2FkaW5nQ29udHJvbGxlclYzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlTG9hZGluZ0NvbnRyb2xsZXJWMy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI0ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlTG9hZGluZ0NvbnRyb2xsZXJWMy5qcwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZUxvYWRpbmdDb250cm9sbGVyVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmpzb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uRGVmZXJyZWQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5EZWZlcnJlZExpc3QiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby5FcnJvciIsIEVycm9yLCBmdW5jdGlvbiAobWVzc2FnZSwgZXh0cmEpIHsKKwl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCXRoaXMuZXh0cmEgPSBleHRyYTsKKwl0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjazsKK30pOworZG9qby5kZWNsYXJlKCJkb2pvLkNvbW11bmljYXRpb25FcnJvciIsIGRvam8uRXJyb3IsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLm5hbWUgPSAiQ29tbXVuaWNhdGlvbkVycm9yIjsKK30pOworZG9qby5kZWNsYXJlKCJkb2pvLkxvY2tlZEVycm9yIiwgZG9qby5FcnJvciwgZnVuY3Rpb24gKCkgeworCXRoaXMubmFtZSA9ICJMb2NrZWRFcnJvciI7Cit9KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5Gb3JtYXRFcnJvciIsIGRvam8uRXJyb3IsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLm5hbWUgPSAiRm9ybWF0RXJyb3IiOworfSk7Citkb2pvLmRlY2xhcmUoImRvam8uUnBjRXJyb3IiLCBkb2pvLkVycm9yLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5uYW1lID0gIlJwY0Vycm9yIjsKK30pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXJWMyIsIGRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMywge1JwY1VybDoiIiwgUnBjQWN0aW9uUGFyYW06ImFjdGlvbiIsIHByZXZlbnRDYWNoZTp0cnVlLCBjaGVja1ZhbGlkUnBjUmVzcG9uc2U6ZnVuY3Rpb24gKHR5cGUsIG9iaikgeworCWlmICh0eXBlICE9ICJsb2FkIikgeworCQl2YXIgZXh0cmEgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWRvam8ubGFuZy5taXhpbihleHRyYSwgYXJndW1lbnRzW2ldKTsKKwkJfQorCQlyZXR1cm4gbmV3IGRvam8uQ29tbXVuaWNhdGlvbkVycm9yKG9iaiwgZXh0cmEpOworCX0KKwlpZiAodHlwZW9mIG9iaiAhPSAib2JqZWN0IikgeworCQlyZXR1cm4gbmV3IGRvam8uRm9ybWF0RXJyb3IoIldyb25nIHNlcnZlciBhbnN3ZXIgZm9ybWF0ICIgKyAob2JqICYmIG9iai50b1NvdXJjZSA/IG9iai50b1NvdXJjZSgpIDogb2JqKSArICIgdHlwZSAiICsgKHR5cGVvZiBvYmopLCBvYmopOworCX0KKwlpZiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChvYmouZXJyb3IpKSB7CisJCXJldHVybiBuZXcgZG9qby5ScGNFcnJvcihvYmouZXJyb3IsIG9iaik7CisJfQorCXJldHVybiBmYWxzZTsKK30sIGdldERlZmVycmVkQmluZEhhbmRsZXI6ZnVuY3Rpb24gKGRlZmVycmVkKSB7CisJcmV0dXJuIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAodHlwZSwgb2JqKSB7CisJCXZhciBlcnJvciA9IHRoaXMuY2hlY2tWYWxpZFJwY1Jlc3BvbnNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCWlmIChlcnJvcikgeworCQkJZGVmZXJyZWQuZXJyYmFjayhlcnJvcik7CisJCQlyZXR1cm47CisJCX0KKwkJZGVmZXJyZWQuY2FsbGJhY2sob2JqKTsKKwl9KTsKK30sIGdldFJwY1VybDpmdW5jdGlvbiAoYWN0aW9uKSB7CisJaWYgKHRoaXMuUnBjVXJsID09ICJsb2NhbCIpIHsKKwkJdmFyIGRpciA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3Vic3RyKDAsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7CisJCXZhciBsb2NhbFVybCA9IGRpciArICIvbG9jYWwvIiArIGFjdGlvbjsKKwkJcmV0dXJuIGxvY2FsVXJsOworCX0KKwlpZiAoIXRoaXMuUnBjVXJsKSB7CisJCWRvam8ucmFpc2UoIkVtcHR5IFJwY1VybDogY2FuJ3QgbG9hZCIpOworCX0KKwl2YXIgdXJsID0gdGhpcy5ScGNVcmw7CisJaWYgKHVybC5pbmRleE9mKCIvIikgIT0gMCkgeworCQl2YXIgcHJvdG9jb2wgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoLzpcL1wvLiovLCAiIik7CisJCXZhciBwcmVmaXggPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnN1YnN0cmluZyhwcm90b2NvbC5sZW5ndGggKyAzKTsKKwkJaWYgKHByZWZpeC5sYXN0SW5kZXhPZigiLyIpICE9IHByZWZpeC5sZW5ndGggLSAxKSB7CisJCQlwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXC9bXlwvXSskLywgIi8iKTsKKwkJfQorCQlpZiAocHJlZml4Lmxhc3RJbmRleE9mKCIvIikgIT0gcHJlZml4Lmxlbmd0aCAtIDEpIHsKKwkJCXByZWZpeCA9IHByZWZpeCArICIvIjsKKwkJfQorCQl1cmwgPSBwcm90b2NvbCArICI6Ly8iICsgcHJlZml4ICsgdXJsOworCX0KKwlyZXR1cm4gdXJsICsgKHVybC5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyB0aGlzLlJwY0FjdGlvblBhcmFtICsgIj0iICsgYWN0aW9uOworfSwgbG9hZFByb2Nlc3NSZXNwb25zZTpmdW5jdGlvbiAobm9kZSwgcmVzdWx0KSB7CisJaWYgKCFkb2pvLmxhbmcuaXNBcnJheShyZXN1bHQpKSB7CisJCXRocm93IG5ldyBkb2pvLkZvcm1hdEVycm9yKCJsb2FkUHJvY2Vzc1Jlc3BvbnNlOiBOb3QgYXJyYXkgbG9hZGVkOiAiICsgcmVzdWx0KTsKKwl9CisJbm9kZS5zZXRDaGlsZHJlbihyZXN1bHQpOworfSwgcnVuUnBjOmZ1bmN0aW9uIChrdykgeworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIGRlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwlkb2pvLmlvLmJpbmQoe3VybDprdy51cmwsIGhhbmRsZTp0aGlzLmdldERlZmVycmVkQmluZEhhbmRsZXIoZGVmZXJyZWQpLCBtaW1ldHlwZToidGV4dC9qYXZhc2NyaXB0IiwgcHJldmVudENhY2hlOnRoaXMucHJldmVudENhY2hlLCBzeW5jOmt3LnN5bmMsIGNvbnRlbnQ6e2RhdGE6ZG9qby5qc29uLnNlcmlhbGl6ZShrdy5wYXJhbXMpfX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIGxvYWRSZW1vdGU6ZnVuY3Rpb24gKG5vZGUsIHN5bmMpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBwYXJhbXMgPSB7bm9kZTp0aGlzLmdldEluZm8obm9kZSksIHRyZWU6dGhpcy5nZXRJbmZvKG5vZGUudHJlZSl9OworCXZhciBkZWZlcnJlZCA9IHRoaXMucnVuUnBjKHt1cmw6dGhpcy5nZXRScGNVcmwoImdldENoaWxkcmVuIiksIHN5bmM6c3luYywgcGFyYW1zOnBhcmFtc30pOworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uIChyZXMpIHsKKwkJcmV0dXJuIF90aGlzLmxvYWRQcm9jZXNzUmVzcG9uc2Uobm9kZSwgcmVzKTsKKwl9KTsKKwlyZXR1cm4gZGVmZXJyZWQ7Cit9LCBiYXRjaEV4cGFuZFRpbWVvdXQ6MCwgcmVjdXJzZVRvTGV2ZWw6ZnVuY3Rpb24gKHdpZGdldCwgbGV2ZWwsIGNhbGxGdW5jLCBjYWxsT2JqLCBza2lwRmlyc3QsIHN5bmMpIHsKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlyZXR1cm47CisJfQorCWlmICghc2tpcEZpcnN0KSB7CisJCXZhciBkZWZlcnJlZCA9IGNhbGxGdW5jLmNhbGwoY2FsbE9iaiwgd2lkZ2V0LCBzeW5jKTsKKwl9IGVsc2UgeworCQl2YXIgZGVmZXJyZWQgPSBkb2pvLkRlZmVycmVkLnByb3RvdHlwZS5tYWtlQ2FsbGVkKCk7CisJfQorCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIHJlY3Vyc2VPbkV4cGFuZCA9IGZ1bmN0aW9uICgpIHsKKwkJdmFyIGNoaWxkcmVuID0gd2lkZ2V0LmNoaWxkcmVuOworCQl2YXIgZGVmZXJyZWRzID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCWRlZmVycmVkcy5wdXNoKF90aGlzLnJlY3Vyc2VUb0xldmVsKGNoaWxkcmVuW2ldLCBsZXZlbCAtIDEsIGNhbGxGdW5jLCBjYWxsT2JqLCBzeW5jKSk7CisJCX0KKwkJcmV0dXJuIG5ldyBkb2pvLkRlZmVycmVkTGlzdChkZWZlcnJlZHMpOworCX07CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2socmVjdXJzZU9uRXhwYW5kKTsKKwlyZXR1cm4gZGVmZXJyZWQ7Cit9LCBleHBhbmRUb0xldmVsOmZ1bmN0aW9uIChub2RlT3JUcmVlLCBsZXZlbCwgc3luYykgeworCXJldHVybiB0aGlzLnJlY3Vyc2VUb0xldmVsKG5vZGVPclRyZWUsIG5vZGVPclRyZWUuaXNUcmVlID8gbGV2ZWwgKyAxIDogbGV2ZWwsIHRoaXMuZXhwYW5kLCB0aGlzLCBub2RlT3JUcmVlLmlzVHJlZSwgc3luYyk7Cit9LCBsb2FkVG9MZXZlbDpmdW5jdGlvbiAobm9kZU9yVHJlZSwgbGV2ZWwsIHN5bmMpIHsKKwlyZXR1cm4gdGhpcy5yZWN1cnNlVG9MZXZlbChub2RlT3JUcmVlLCBub2RlT3JUcmVlLmlzVHJlZSA/IGxldmVsICsgMSA6IGxldmVsLCB0aGlzLmxvYWRJZk5lZWRlZCwgdGhpcywgbm9kZU9yVHJlZS5pc1RyZWUsIHN5bmMpOworfSwgbG9hZEFsbDpmdW5jdGlvbiAobm9kZU9yVHJlZSwgc3luYykgeworCXJldHVybiB0aGlzLmxvYWRUb0xldmVsKG5vZGVPclRyZWUsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgc3luYyk7Cit9LCBleHBhbmQ6ZnVuY3Rpb24gKG5vZGUsIHN5bmMpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBkZWZlcnJlZCA9IHRoaXMuc3RhcnRQcm9jZXNzaW5nKG5vZGUpOworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIF90aGlzLmxvYWRJZk5lZWRlZChub2RlLCBzeW5jKTsKKwl9KTsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAocmVzKSB7CisJCWRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMy5wcm90b3R5cGUuZXhwYW5kKG5vZGUpOworCQlyZXR1cm4gcmVzOworCX0pOworCWRlZmVycmVkLmFkZEJvdGgoZnVuY3Rpb24gKHJlcykgeworCQlfdGhpcy5maW5pc2hQcm9jZXNzaW5nKG5vZGUpOworCQlyZXR1cm4gcmVzOworCX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIGxvYWRJZk5lZWRlZDpmdW5jdGlvbiAobm9kZSwgc3luYykgeworCXZhciBkZWZlcnJlZDsKKwlpZiAobm9kZS5zdGF0ZSA9PSBub2RlLmxvYWRTdGF0ZXMuVU5DSEVDS0VEICYmIG5vZGUuaXNGb2xkZXIgJiYgIW5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7CisJCWRlZmVycmVkID0gdGhpcy5sb2FkUmVtb3RlKG5vZGUsIHN5bmMpOworCX0gZWxzZSB7CisJCWRlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwkJZGVmZXJyZWQuY2FsbGJhY2soKTsKKwl9CisJcmV0dXJuIGRlZmVycmVkOworfSwgcnVuU3RhZ2VzOmZ1bmN0aW9uIChjaGVjaywgcHJlcGFyZSwgbWFrZSwgZmluYWxpemUsIGV4cG9zZSwgYXJncykgeworCXZhciBfdGhpcyA9IHRoaXM7CisJaWYgKGNoZWNrICYmICFjaGVjay5hcHBseSh0aGlzLCBhcmdzKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZhciBkZWZlcnJlZCA9IGRvam8uRGVmZXJyZWQucHJvdG90eXBlLm1ha2VDYWxsZWQoKTsKKwlpZiAocHJlcGFyZSkgeworCQlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gcHJlcGFyZS5hcHBseShfdGhpcywgYXJncyk7CisJCX0pOworCX0KKwlpZiAobWFrZSkgeworCQlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCQl2YXIgcmVzID0gbWFrZS5hcHBseShfdGhpcywgYXJncyk7CisJCQlyZXR1cm4gcmVzOworCQl9KTsKKwl9CisJaWYgKGZpbmFsaXplKSB7CisJCWRlZmVycmVkLmFkZEJvdGgoZnVuY3Rpb24gKHJlcykgeworCQkJZmluYWxpemUuYXBwbHkoX3RoaXMsIGFyZ3MpOworCQkJcmV0dXJuIHJlczsKKwkJfSk7CisJfQorCWlmIChleHBvc2UpIHsKKwkJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKHJlcykgeworCQkJZXhwb3NlLmFwcGx5KF90aGlzLCBhcmdzKTsKKwkJCXJldHVybiByZXM7CisJCX0pOworCX0KKwlyZXR1cm4gZGVmZXJyZWQ7Cit9LCBzdGFydFByb2Nlc3Npbmc6ZnVuY3Rpb24gKG5vZGVzQXJyYXkpIHsKKwl2YXIgZGVmZXJyZWQgPSBuZXcgZG9qby5EZWZlcnJlZCgpOworCXZhciBub2RlcyA9IGRvam8ubGFuZy5pc0FycmF5KG5vZGVzQXJyYXkpID8gbm9kZXNBcnJheSA6IGFyZ3VtZW50czsKKwlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChub2Rlc1tpXS5pc0xvY2tlZCgpKSB7CisJCQlkZWZlcnJlZC5lcnJiYWNrKG5ldyBkb2pvLkxvY2tlZEVycm9yKCJpdGVtIGxvY2tlZCAiICsgbm9kZXNbaV0sIG5vZGVzW2ldKSk7CisJCQlyZXR1cm4gZGVmZXJyZWQ7CisJCX0KKwkJaWYgKG5vZGVzW2ldLmlzVHJlZU5vZGUpIHsKKwkJCW5vZGVzW2ldLm1hcmtQcm9jZXNzaW5nKCk7CisJCX0KKwkJbm9kZXNbaV0ubG9jaygpOworCX0KKwlkZWZlcnJlZC5jYWxsYmFjaygpOworCXJldHVybiBkZWZlcnJlZDsKK30sIGZpbmlzaFByb2Nlc3Npbmc6ZnVuY3Rpb24gKG5vZGVzQXJyYXkpIHsKKwl2YXIgbm9kZXMgPSBkb2pvLmxhbmcuaXNBcnJheShub2Rlc0FycmF5KSA/IG5vZGVzQXJyYXkgOiBhcmd1bWVudHM7CisJZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQlpZiAoIW5vZGVzW2ldLmhhc0xvY2soKSkgeworCQkJY29udGludWU7CisJCX0KKwkJbm9kZXNbaV0udW5sb2NrKCk7CisJCWlmIChub2Rlc1tpXS5pc1RyZWVOb2RlKSB7CisJCQlub2Rlc1tpXS51bm1hcmtQcm9jZXNzaW5nKCk7CisJCX0KKwl9Cit9LCByZWZyZXNoQ2hpbGRyZW46ZnVuY3Rpb24gKG5vZGVPclRyZWUsIHN5bmMpIHsKKwlyZXR1cm4gdGhpcy5ydW5TdGFnZXMobnVsbCwgdGhpcy5wcmVwYXJlUmVmcmVzaENoaWxkcmVuLCB0aGlzLmRvUmVmcmVzaENoaWxkcmVuLCB0aGlzLmZpbmFsaXplUmVmcmVzaENoaWxkcmVuLCB0aGlzLmV4cG9zZVJlZnJlc2hDaGlsZHJlbiwgYXJndW1lbnRzKTsKK30sIHByZXBhcmVSZWZyZXNoQ2hpbGRyZW46ZnVuY3Rpb24gKG5vZGVPclRyZWUsIHN5bmMpIHsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnN0YXJ0UHJvY2Vzc2luZyhub2RlT3JUcmVlKTsKKwlub2RlT3JUcmVlLmRlc3Ryb3lDaGlsZHJlbigpOworCW5vZGVPclRyZWUuc3RhdGUgPSBub2RlT3JUcmVlLmxvYWRTdGF0ZXMuVU5DSEVDS0VEOworCXJldHVybiBkZWZlcnJlZDsKK30sIGRvUmVmcmVzaENoaWxkcmVuOmZ1bmN0aW9uIChub2RlT3JUcmVlLCBzeW5jKSB7CisJcmV0dXJuIHRoaXMubG9hZFJlbW90ZShub2RlT3JUcmVlLCBzeW5jKTsKK30sIGZpbmFsaXplUmVmcmVzaENoaWxkcmVuOmZ1bmN0aW9uIChub2RlT3JUcmVlLCBzeW5jKSB7CisJdGhpcy5maW5pc2hQcm9jZXNzaW5nKG5vZGVPclRyZWUpOworfSwgZXhwb3NlUmVmcmVzaENoaWxkcmVuOmZ1bmN0aW9uIChub2RlT3JUcmVlLCBzeW5jKSB7CisJbm9kZU9yVHJlZS5leHBhbmQoKTsKK30sIG1vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJcmV0dXJuIHRoaXMucnVuU3RhZ2VzKHRoaXMuY2FuTW92ZSwgdGhpcy5wcmVwYXJlTW92ZSwgdGhpcy5kb01vdmUsIHRoaXMuZmluYWxpemVNb3ZlLCB0aGlzLmV4cG9zZU1vdmUsIGFyZ3VtZW50cyk7Cit9LCBkb01vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJY2hpbGQudHJlZS5tb3ZlKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KTsKKwlyZXR1cm4gdHJ1ZTsKK30sIHByZXBhcmVNb3ZlOmZ1bmN0aW9uIChjaGlsZCwgbmV3UGFyZW50LCBpbmRleCwgc3luYykgeworCXZhciBkZWZlcnJlZCA9IHRoaXMuc3RhcnRQcm9jZXNzaW5nKG5ld1BhcmVudCk7CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMubG9hZElmTmVlZGVkKG5ld1BhcmVudCwgc3luYyk7CisJfSkpOworCXJldHVybiBkZWZlcnJlZDsKK30sIGZpbmFsaXplTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCkgeworCXRoaXMuZmluaXNoUHJvY2Vzc2luZyhuZXdQYXJlbnQpOworfSwgcHJlcGFyZUNyZWF0ZUNoaWxkOmZ1bmN0aW9uIChwYXJlbnQsIGluZGV4LCBkYXRhLCBzeW5jKSB7CisJdmFyIGRlZmVycmVkID0gdGhpcy5zdGFydFByb2Nlc3NpbmcocGFyZW50KTsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gdGhpcy5sb2FkSWZOZWVkZWQocGFyZW50LCBzeW5jKTsKKwl9KSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgZmluYWxpemVDcmVhdGVDaGlsZDpmdW5jdGlvbiAocGFyZW50KSB7CisJdGhpcy5maW5pc2hQcm9jZXNzaW5nKHBhcmVudCk7Cit9LCBwcmVwYXJlQ2xvbmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4LCBkZWVwLCBzeW5jKSB7CisJdmFyIGRlZmVycmVkID0gdGhpcy5zdGFydFByb2Nlc3NpbmcoY2hpbGQsIG5ld1BhcmVudCk7CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMubG9hZElmTmVlZGVkKG5ld1BhcmVudCwgc3luYyk7CisJfSkpOworCXJldHVybiBkZWZlcnJlZDsKK30sIGZpbmFsaXplQ2xvbmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQpIHsKKwl0aGlzLmZpbmlzaFByb2Nlc3NpbmcoY2hpbGQsIG5ld1BhcmVudCk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZU5vZGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVOb2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTg0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVOb2RlLmpzCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlTm9kZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVOb2RlIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZnVuY3Rpb24gKCkgeworCXRoaXMuYWN0aW9uc0Rpc2FibGVkID0gW107Cit9LCB7d2lkZ2V0VHlwZToiVHJlZU5vZGUiLCBsb2FkU3RhdGVzOntVTkNIRUNLRUQ6IlVOQ0hFQ0tFRCIsIExPQURJTkc6IkxPQURJTkciLCBMT0FERUQ6IkxPQURFRCJ9LCBhY3Rpb25zOntNT1ZFOiJNT1ZFIiwgUkVNT1ZFOiJSRU1PVkUiLCBFRElUOiJFRElUIiwgQUREQ0hJTEQ6IkFERENISUxEIn0sIGlzQ29udGFpbmVyOnRydWUsIGxvY2tMZXZlbDowLCB0ZW1wbGF0ZVN0cmluZzooIjxkaXYgY2xhc3M9XCJkb2pvVHJlZU5vZGVcIj4gIiArICI8c3BhbiB0cmVlTm9kZT1cIiR7dGhpcy53aWRnZXRJZH1cIiBjbGFzcz1cImRvam9UcmVlTm9kZUxhYmVsXCIgZG9qb0F0dGFjaFBvaW50PVwibGFiZWxOb2RlXCI+ICIgKyAiXHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cInRpdGxlTm9kZVwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uVGl0bGVDbGlja1wiIGNsYXNzPVwiZG9qb1RyZWVOb2RlTGFiZWxUaXRsZVwiPiR7dGhpcy50aXRsZX08L3NwYW4+ICIgKyAiPC9zcGFuPiAiICsgIjxzcGFuIGNsYXNzPVwiZG9qb1RyZWVOb2RlQWZ0ZXJMYWJlbFwiIGRvam9BdHRhY2hQb2ludD1cImFmdGVyTGFiZWxOb2RlXCI+JHt0aGlzLmFmdGVyTGFiZWx9PC9zcGFuPiAiICsgIjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9kaXY+ICIgKyAiPC9kaXY+IikucmVwbGFjZSgvKD58PClccysvZywgIiQxIiksIGNoaWxkSWNvblNyYzoiIiwgY2hpbGRJY29uRm9sZGVyU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL2Nsb3NlZC5naWYiKSwgY2hpbGRJY29uRG9jdW1lbnRTcmM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvZG9jdW1lbnQuZ2lmIiksIGNoaWxkSWNvbjpudWxsLCBpc1RyZWVOb2RlOnRydWUsIG9iamVjdElkOiIiLCBhZnRlckxhYmVsOiIiLCBhZnRlckxhYmVsTm9kZTpudWxsLCBleHBhbmRJY29uOm51bGwsIHRpdGxlOiIiLCBvYmplY3Q6IiIsIGlzRm9sZGVyOmZhbHNlLCBsYWJlbE5vZGU6bnVsbCwgdGl0bGVOb2RlOm51bGwsIGltZ3M6bnVsbCwgZXhwYW5kTGV2ZWw6IiIsIHRyZWU6bnVsbCwgZGVwdGg6MCwgaXNFeHBhbmRlZDpmYWxzZSwgc3RhdGU6bnVsbCwgZG9tTm9kZUluaXRpYWxpemVkOmZhbHNlLCBpc0ZpcnN0Q2hpbGQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmdldFBhcmVudEluZGV4KCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKK30sIGlzTGFzdENoaWxkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy5nZXRQYXJlbnRJbmRleCgpID09IHRoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEgPyB0cnVlIDogZmFsc2U7Cit9LCBsb2NrOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlLmxvY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIHVubG9jazpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMudHJlZS51bmxvY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGlzTG9ja2VkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlLmlzTG9ja2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBjbGVhbkxvY2s6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnRyZWUuY2xlYW5Mb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBhY3Rpb25Jc0Rpc2FibGVkOmZ1bmN0aW9uIChhY3Rpb24pIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBkaXNhYmxlZCA9IGZhbHNlOworCWlmICh0aGlzLnRyZWUuc3RyaWN0Rm9sZGVycyAmJiBhY3Rpb24gPT0gdGhpcy5hY3Rpb25zLkFERENISUxEICYmICF0aGlzLmlzRm9sZGVyKSB7CisJCWRpc2FibGVkID0gdHJ1ZTsKKwl9CisJaWYgKGRvam8ubGFuZy5pbkFycmF5KF90aGlzLmFjdGlvbnNEaXNhYmxlZCwgYWN0aW9uKSkgeworCQlkaXNhYmxlZCA9IHRydWU7CisJfQorCWlmICh0aGlzLmlzTG9ja2VkKCkpIHsKKwkJZGlzYWJsZWQgPSB0cnVlOworCX0KKwlyZXR1cm4gZGlzYWJsZWQ7Cit9LCBnZXRJbmZvOmZ1bmN0aW9uICgpIHsKKwl2YXIgaW5mbyA9IHt3aWRnZXRJZDp0aGlzLndpZGdldElkLCBvYmplY3RJZDp0aGlzLm9iamVjdElkLCBpbmRleDp0aGlzLmdldFBhcmVudEluZGV4KCksIGlzRm9sZGVyOnRoaXMuaXNGb2xkZXJ9OworCXJldHVybiBpbmZvOworfSwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCXRoaXMuc3RhdGUgPSB0aGlzLmxvYWRTdGF0ZXMuVU5DSEVDS0VEOworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hY3Rpb25zRGlzYWJsZWQubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5hY3Rpb25zRGlzYWJsZWRbaV0gPSB0aGlzLmFjdGlvbnNEaXNhYmxlZFtpXS50b1VwcGVyQ2FzZSgpOworCX0KKwl0aGlzLmV4cGFuZExldmVsID0gcGFyc2VJbnQodGhpcy5leHBhbmRMZXZlbCk7Cit9LCBhZGp1c3REZXB0aDpmdW5jdGlvbiAoZGVwdGhEaWZmKSB7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuY2hpbGRyZW5baV0uYWRqdXN0RGVwdGgoZGVwdGhEaWZmKTsKKwl9CisJdGhpcy5kZXB0aCArPSBkZXB0aERpZmY7CisJaWYgKGRlcHRoRGlmZiA+IDApIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aERpZmY7IGkrKykgeworCQkJdmFyIGltZyA9IHRoaXMudHJlZS5tYWtlQmxhbmtJbWcoKTsKKwkJCXRoaXMuaW1ncy51bnNoaWZ0KGltZyk7CisJCQlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuaW1nc1swXSwgdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQpOworCQl9CisJfQorCWlmIChkZXB0aERpZmYgPCAwKSB7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgLWRlcHRoRGlmZjsgaSsrKSB7CisJCQl0aGlzLmltZ3Muc2hpZnQoKTsKKwkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZG9tTm9kZS5maXJzdENoaWxkKTsKKwkJfQorCX0KK30sIG1hcmtMb2FkaW5nOmZ1bmN0aW9uICgpIHsKKwl0aGlzLl9tYXJrTG9hZGluZ1NhdmVkSWNvbiA9IHRoaXMuZXhwYW5kSWNvbi5zcmM7CisJdGhpcy5leHBhbmRJY29uLnNyYyA9IHRoaXMudHJlZS5leHBhbmRJY29uU3JjTG9hZGluZzsKK30sIHVuTWFya0xvYWRpbmc6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5fbWFya0xvYWRpbmdTYXZlZEljb24pIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgaW0gPSBuZXcgSW1hZ2UoKTsKKwlpbS5zcmMgPSB0aGlzLnRyZWUuZXhwYW5kSWNvblNyY0xvYWRpbmc7CisJaWYgKHRoaXMuZXhwYW5kSWNvbi5zcmMgPT0gaW0uc3JjKSB7CisJCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLl9tYXJrTG9hZGluZ1NhdmVkSWNvbjsKKwl9CisJdGhpcy5fbWFya0xvYWRpbmdTYXZlZEljb24gPSBudWxsOworfSwgc2V0Rm9sZGVyOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5leHBhbmRJY29uLCAib25jbGljayIsIHRoaXMsICJvblRyZWVDbGljayIpOworCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLnRyZWUuZXhwYW5kSWNvblNyY01pbnVzIDogdGhpcy50cmVlLmV4cGFuZEljb25TcmNQbHVzOworCXRoaXMuaXNGb2xkZXIgPSB0cnVlOworfSwgY3JlYXRlRE9NTm9kZTpmdW5jdGlvbiAodHJlZSwgZGVwdGgpIHsKKwl0aGlzLnRyZWUgPSB0cmVlOworCXRoaXMuZGVwdGggPSBkZXB0aDsKKwl0aGlzLmltZ3MgPSBbXTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGVwdGggKyAxOyBpKyspIHsKKwkJdmFyIGltZyA9IHRoaXMudHJlZS5tYWtlQmxhbmtJbWcoKTsKKwkJdGhpcy5kb21Ob2RlLmluc2VydEJlZm9yZShpbWcsIHRoaXMubGFiZWxOb2RlKTsKKwkJdGhpcy5pbWdzLnB1c2goaW1nKTsKKwl9CisJdGhpcy5leHBhbmRJY29uID0gdGhpcy5pbWdzW3RoaXMuaW1ncy5sZW5ndGggLSAxXTsKKwl0aGlzLmNoaWxkSWNvbiA9IHRoaXMudHJlZS5tYWtlQmxhbmtJbWcoKTsKKwl0aGlzLmltZ3MucHVzaCh0aGlzLmNoaWxkSWNvbik7CisJZG9qby5odG1sLmluc2VydEJlZm9yZSh0aGlzLmNoaWxkSWNvbiwgdGhpcy50aXRsZU5vZGUpOworCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCB8fCB0aGlzLmlzRm9sZGVyKSB7CisJCXRoaXMuc2V0Rm9sZGVyKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5zdGF0ZSA9IHRoaXMubG9hZFN0YXRlcy5MT0FERUQ7CisJfQorCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmNoaWxkSWNvbiwgIm9uY2xpY2siLCB0aGlzLCAib25JY29uQ2xpY2siKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5jaGlsZHJlbltpXS5wYXJlbnQgPSB0aGlzOworCQl2YXIgbm9kZSA9IHRoaXMuY2hpbGRyZW5baV0uY3JlYXRlRE9NTm9kZSh0aGlzLnRyZWUsIHRoaXMuZGVwdGggKyAxKTsKKwkJdGhpcy5jb250YWluZXJOb2RlLmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsKKwkJdGhpcy5zdGF0ZSA9IHRoaXMubG9hZFN0YXRlcy5MT0FERUQ7CisJfQorCXRoaXMudXBkYXRlSWNvbnMoKTsKKwl0aGlzLmRvbU5vZGVJbml0aWFsaXplZCA9IHRydWU7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHtzb3VyY2U6dGhpc30pOworCXJldHVybiB0aGlzLmRvbU5vZGU7Cit9LCBvblRyZWVDbGljazpmdW5jdGlvbiAoZSkgeworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy50cmVlQ2xpY2ssIHtzb3VyY2U6dGhpcywgZXZlbnQ6ZX0pOworfSwgb25JY29uQ2xpY2s6ZnVuY3Rpb24gKGUpIHsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuaWNvbkNsaWNrLCB7c291cmNlOnRoaXMsIGV2ZW50OmV9KTsKK30sIG9uVGl0bGVDbGljazpmdW5jdGlvbiAoZSkgeworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy50aXRsZUNsaWNrLCB7c291cmNlOnRoaXMsIGV2ZW50OmV9KTsKK30sIG1hcmtTZWxlY3RlZDpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMudGl0bGVOb2RlLCAiZG9qb1RyZWVOb2RlTGFiZWxTZWxlY3RlZCIpOworfSwgdW5NYXJrU2VsZWN0ZWQ6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLnRpdGxlTm9kZSwgImRvam9UcmVlTm9kZUxhYmVsU2VsZWN0ZWQiKTsKK30sIHVwZGF0ZUV4cGFuZEljb246ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzRm9sZGVyKSB7CisJCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLnRyZWUuZXhwYW5kSWNvblNyY01pbnVzIDogdGhpcy50cmVlLmV4cGFuZEljb25TcmNQbHVzOworCX0gZWxzZSB7CisJCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLnRyZWUuYmxhbmtJY29uU3JjOworCX0KK30sIHVwZGF0ZUV4cGFuZEdyaWQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLnRyZWUuc2hvd0dyaWQpIHsKKwkJaWYgKHRoaXMuZGVwdGgpIHsKKwkJCXRoaXMuc2V0R3JpZEltYWdlKC0yLCB0aGlzLmlzTGFzdENoaWxkKCkgPyB0aGlzLnRyZWUuZ3JpZEljb25TcmNMIDogdGhpcy50cmVlLmdyaWRJY29uU3JjVCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5pc0ZpcnN0Q2hpbGQoKSkgeworCQkJCXRoaXMuc2V0R3JpZEltYWdlKC0yLCB0aGlzLmlzTGFzdENoaWxkKCkgPyB0aGlzLnRyZWUuZ3JpZEljb25TcmNYIDogdGhpcy50cmVlLmdyaWRJY29uU3JjWSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuc2V0R3JpZEltYWdlKC0yLCB0aGlzLmlzTGFzdENoaWxkKCkgPyB0aGlzLnRyZWUuZ3JpZEljb25TcmNMIDogdGhpcy50cmVlLmdyaWRJY29uU3JjVCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLnNldEdyaWRJbWFnZSgtMiwgdGhpcy50cmVlLmJsYW5rSWNvblNyYyk7CisJfQorfSwgdXBkYXRlQ2hpbGRHcmlkOmZ1bmN0aW9uICgpIHsKKwlpZiAoKHRoaXMuZGVwdGggfHwgdGhpcy50cmVlLnNob3dSb290R3JpZCkgJiYgdGhpcy50cmVlLnNob3dHcmlkKSB7CisJCXRoaXMuc2V0R3JpZEltYWdlKC0xLCAodGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgdGhpcy5pc0V4cGFuZGVkKSA/IHRoaXMudHJlZS5ncmlkSWNvblNyY1AgOiB0aGlzLnRyZWUuZ3JpZEljb25TcmNDKTsKKwl9IGVsc2UgeworCQlpZiAodGhpcy50cmVlLnNob3dHcmlkICYmICF0aGlzLnRyZWUuc2hvd1Jvb3RHcmlkKSB7CisJCQl0aGlzLnNldEdyaWRJbWFnZSgtMSwgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHRoaXMuaXNFeHBhbmRlZCkgPyB0aGlzLnRyZWUuZ3JpZEljb25TcmNaIDogdGhpcy50cmVlLmJsYW5rSWNvblNyYyk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldEdyaWRJbWFnZSgtMSwgdGhpcy50cmVlLmJsYW5rSWNvblNyYyk7CisJCX0KKwl9Cit9LCB1cGRhdGVQYXJlbnRHcmlkOmZ1bmN0aW9uICgpIHsKKwl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlcHRoOyBpKyspIHsKKwkJdmFyIGlkeCA9IHRoaXMuaW1ncy5sZW5ndGggLSAoMyArIGkpOworCQl2YXIgaW1nID0gKHRoaXMudHJlZS5zaG93R3JpZCAmJiAhcGFyZW50LmlzTGFzdENoaWxkKCkpID8gdGhpcy50cmVlLmdyaWRJY29uU3JjViA6IHRoaXMudHJlZS5ibGFua0ljb25TcmM7CisJCXRoaXMuc2V0R3JpZEltYWdlKGlkeCwgaW1nKTsKKwkJcGFyZW50ID0gcGFyZW50LnBhcmVudDsKKwl9Cit9LCB1cGRhdGVFeHBhbmRHcmlkQ29sdW1uOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMudHJlZS5zaG93R3JpZCkgeworCQlyZXR1cm47CisJfQorCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIGljb24gPSB0aGlzLmlzTGFzdENoaWxkKCkgPyB0aGlzLnRyZWUuYmxhbmtJY29uU3JjIDogdGhpcy50cmVlLmdyaWRJY29uU3JjVjsKKwlkb2pvLmxhbmcuZm9yRWFjaChfdGhpcy5nZXREZXNjZW5kYW50cygpLCBmdW5jdGlvbiAobm9kZSkgeworCQlub2RlLnNldEdyaWRJbWFnZShfdGhpcy5kZXB0aCwgaWNvbik7CisJfSk7CisJdGhpcy51cGRhdGVFeHBhbmRHcmlkKCk7Cit9LCB1cGRhdGVJY29uczpmdW5jdGlvbiAoKSB7CisJdGhpcy5pbWdzWzBdLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnRyZWUuc2hvd1Jvb3RHcmlkID8gImlubGluZSIgOiAibm9uZSI7CisJdGhpcy5idWlsZENoaWxkSWNvbigpOworCXRoaXMudXBkYXRlRXhwYW5kR3JpZCgpOworCXRoaXMudXBkYXRlQ2hpbGRHcmlkKCk7CisJdGhpcy51cGRhdGVQYXJlbnRHcmlkKCk7CisJZG9qby5wcm9maWxlLnN0b3AoInVwZGF0ZUljb25zIik7Cit9LCBidWlsZENoaWxkSWNvbjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuY2hpbGRJY29uU3JjKSB7CisJCXRoaXMuY2hpbGRJY29uLnNyYyA9IHRoaXMuY2hpbGRJY29uU3JjOworCX0KKwl0aGlzLmNoaWxkSWNvbi5zdHlsZS5kaXNwbGF5ID0gdGhpcy5jaGlsZEljb25TcmMgPyAiaW5saW5lIiA6ICJub25lIjsKK30sIHNldEdyaWRJbWFnZTpmdW5jdGlvbiAoaWR4LCBzcmMpIHsKKwlpZiAoaWR4IDwgMCkgeworCQlpZHggPSB0aGlzLmltZ3MubGVuZ3RoICsgaWR4OworCX0KKwl0aGlzLmltZ3NbaWR4XS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBzcmMgKyAiKSI7Cit9LCB1cGRhdGVJY29uVHJlZTpmdW5jdGlvbiAoKSB7CisJdGhpcy50cmVlLnVwZGF0ZUljb25UcmVlLmNhbGwodGhpcyk7Cit9LCBleHBhbmQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzRXhwYW5kZWQpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsKKwkJdGhpcy5zaG93Q2hpbGRyZW4oKTsKKwl9CisJdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTsKKwl0aGlzLnVwZGF0ZUV4cGFuZEljb24oKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuZXhwYW5kLCB7c291cmNlOnRoaXN9KTsKK30sIGNvbGxhcHNlOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMuaXNFeHBhbmRlZCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuaGlkZUNoaWxkcmVuKCk7CisJdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7CisJdGhpcy51cGRhdGVFeHBhbmRJY29uKCk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLCB7c291cmNlOnRoaXN9KTsKK30sIGhpZGVDaGlsZHJlbjpmdW5jdGlvbiAoKSB7CisJdGhpcy50cmVlLnRvZ2dsZU9iai5oaWRlKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy50b2dnbGVEdXJhdGlvbiwgdGhpcy5leHBsb2RlU3JjLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9uSGlkZSIpKTsKKwlpZiAoZG9qby5leGlzdHMoZG9qbywgImRuZC5kcmFnTWFuYWdlci5kcmFnT2JqZWN0cyIpICYmIGRvam8uZG5kLmRyYWdNYW5hZ2VyLmRyYWdPYmplY3RzLmxlbmd0aCkgeworCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5jYWNoZVRhcmdldExvY2F0aW9ucygpOworCX0KK30sIHNob3dDaGlsZHJlbjpmdW5jdGlvbiAoKSB7CisJdGhpcy50cmVlLnRvZ2dsZU9iai5zaG93KHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy50b2dnbGVEdXJhdGlvbiwgdGhpcy5leHBsb2RlU3JjLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9uU2hvdyIpKTsKKwlpZiAoZG9qby5leGlzdHMoZG9qbywgImRuZC5kcmFnTWFuYWdlci5kcmFnT2JqZWN0cyIpICYmIGRvam8uZG5kLmRyYWdNYW5hZ2VyLmRyYWdPYmplY3RzLmxlbmd0aCkgeworCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5jYWNoZVRhcmdldExvY2F0aW9ucygpOworCX0KK30sIGFkZENoaWxkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlLmFkZENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBkb0FkZENoaWxkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlLmRvQWRkQ2hpbGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30sIGVkaXQ6ZnVuY3Rpb24gKHByb3BzKSB7CisJZG9qby5sYW5nLm1peGluKHRoaXMsIHByb3BzKTsKKwlpZiAocHJvcHMudGl0bGUpIHsKKwkJdGhpcy50aXRsZU5vZGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTsKKwl9CisJaWYgKHByb3BzLmFmdGVyTGFiZWwpIHsKKwkJdGhpcy5hZnRlckxhYmVsTm9kZS5pbm5lckhUTUwgPSB0aGlzLmFmdGVyTGFiZWw7CisJfQorCWlmIChwcm9wcy5jaGlsZEljb25TcmMpIHsKKwkJdGhpcy5idWlsZENoaWxkSWNvbigpOworCX0KK30sIHJlbW92ZU5vZGU6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnRyZWUucmVtb3ZlTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgZG9SZW1vdmVOb2RlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50cmVlLmRvUmVtb3ZlTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfSwgdG9TdHJpbmc6ZnVuY3Rpb24gKCkgeworCXJldHVybiAiWyIgKyB0aGlzLndpZGdldFR5cGUgKyAiIFRyZWU6IiArIHRoaXMudHJlZSArICIgSUQ6IiArIHRoaXMud2lkZ2V0SWQgKyAiIFRpdGxlOiIgKyB0aGlzLnRpdGxlICsgIl0iOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVOb2RlVjMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVOb2RlVjMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzNzZkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZU5vZGVWMy5qcwpAQCAtMCwwICsxLDMxMCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZU5vZGVWMyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmh0bWwuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVXaXRoTm9kZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlTm9kZVYzIiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LlRyZWVXaXRoTm9kZV0sIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmFjdGlvbnNEaXNhYmxlZCA9IFtdOworCXRoaXMub2JqZWN0ID0ge307Cit9LCB7dHJ5TGF6eUluaXQ6dHJ1ZSwgYWN0aW9uczp7TU9WRToiTU9WRSIsIERFVEFDSDoiREVUQUNIIiwgRURJVDoiRURJVCIsIEFERENISUxEOiJBRERDSElMRCIsIFNFTEVDVDoiU0VMRUNUIn0sIGxhYmVsQ2xhc3M6IiIsIGNvbnRlbnRDbGFzczoiIiwgZXhwYW5kTm9kZTpudWxsLCBsYWJlbE5vZGU6bnVsbCwgbm9kZURvY1R5cGU6IiIsIHNlbGVjdGVkOmZhbHNlLCBnZXRub2RlRG9jVHlwZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMubm9kZURvY1R5cGU7Cit9LCBjbG9uZVByb3BlcnRpZXM6WyJhY3Rpb25zRGlzYWJsZWQiLCAidHJ5TGF6eUluaXQiLCAibm9kZURvY1R5cGUiLCAib2JqZWN0SWQiLCAib2JqZWN0IiwgInRpdGxlIiwgImlzRm9sZGVyIiwgImlzRXhwYW5kZWQiLCAic3RhdGUiXSwgY2xvbmU6ZnVuY3Rpb24gKGRlZXApIHsKKwl2YXIgcmV0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2xvbmVQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CisJCXZhciBwcm9wID0gdGhpcy5jbG9uZVByb3BlcnRpZXNbaV07CisJCXJldFtwcm9wXSA9IGRvam8ubGFuZy5zaGFsbG93Q29weSh0aGlzW3Byb3BdLCB0cnVlKTsKKwl9CisJaWYgKHRoaXMudHJlZS51bnNldEZvbGRlck9uRW1wdHkgJiYgIWRlZXAgJiYgdGhpcy5pc0ZvbGRlcikgeworCQlyZXQuaXNGb2xkZXIgPSBmYWxzZTsKKwl9CisJcmV0LnRvZ2dsZU9iaiA9IHRoaXMudG9nZ2xlT2JqOworCWRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkKHJldCk7CisJcmV0LnRyZWUgPSB0aGlzLnRyZWU7CisJcmV0LmJ1aWxkUmVuZGVyaW5nKHt9LCB7fSk7CisJcmV0LmluaXRpYWxpemUoe30sIHt9KTsKKwlpZiAoZGVlcCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07CisJCQlpZiAoY2hpbGQuY2xvbmUpIHsKKwkJCQlyZXQuY2hpbGRyZW4ucHVzaChjaGlsZC5jbG9uZShkZWVwKSk7CisJCQl9IGVsc2UgeworCQkJCXJldC5jaGlsZHJlbi5wdXNoKGRvam8ubGFuZy5zaGFsbG93Q29weShjaGlsZCwgZGVlcCkpOworCQkJfQorCQl9CisJCXJldC5zZXRDaGlsZHJlbigpOworCX0KKwlyZXR1cm4gcmV0OworfSwgbWFya1Byb2Nlc3Npbmc6ZnVuY3Rpb24gKCkgeworCXRoaXMubWFya1Byb2Nlc3NpbmdTYXZlZENsYXNzID0gZG9qby5odG1sLmdldENsYXNzKHRoaXMuZXhwYW5kTm9kZSk7CisJZG9qby5odG1sLnNldENsYXNzKHRoaXMuZXhwYW5kTm9kZSwgdGhpcy50cmVlLmNsYXNzUHJlZml4ICsgIkV4cGFuZExvYWRpbmciKTsKK30sIHVubWFya1Byb2Nlc3Npbmc6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmV4cGFuZE5vZGUsIHRoaXMubWFya1Byb2Nlc3NpbmdTYXZlZENsYXNzKTsKK30sIGJ1aWxkUmVuZGVyaW5nOmZ1bmN0aW9uIChhcmdzLCBmcmFnbWVudCwgcGFyZW50KSB7CisJaWYgKGFyZ3MudHJlZSkgeworCQl0aGlzLnRyZWUgPSBkb2pvLmxhbmcuaXNTdHJpbmcoYXJncy50cmVlKSA/IGRvam8ud2lkZ2V0Lm1hbmFnZXIuZ2V0V2lkZ2V0QnlJZChhcmdzLnRyZWUpIDogYXJncy50cmVlOworCX0gZWxzZSB7CisJCWlmIChwYXJlbnQgJiYgcGFyZW50LnRyZWUpIHsKKwkJCXRoaXMudHJlZSA9IHBhcmVudC50cmVlOworCQl9CisJfQorCWlmICghdGhpcy50cmVlKSB7CisJCWRvam8ucmFpc2UoIkNhbid0IGV2YWx1YXRlIHRyZWUgZnJvbSBhcmd1bWVudHMgb3IgcGFyZW50Iik7CisJfQorCXRoaXMuZG9tTm9kZSA9IHRoaXMudHJlZS5ub2RlVGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpOworCXRoaXMuZXhwYW5kTm9kZSA9IHRoaXMuZG9tTm9kZS5maXJzdENoaWxkOworCXRoaXMuY29udGVudE5vZGUgPSB0aGlzLmRvbU5vZGUuY2hpbGROb2Rlc1sxXTsKKwl0aGlzLmxhYmVsTm9kZSA9IHRoaXMuY29udGVudE5vZGUuZmlyc3RDaGlsZDsKKwlpZiAodGhpcy5sYWJlbENsYXNzKSB7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmxhYmVsTm9kZSwgdGhpcy5sYWJlbENsYXNzKTsKKwl9CisJaWYgKHRoaXMuY29udGVudENsYXNzKSB7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmNvbnRlbnROb2RlLCB0aGlzLmNvbnRlbnRDbGFzcyk7CisJfQorCXRoaXMuZG9tTm9kZS53aWRnZXRJZCA9IHRoaXMud2lkZ2V0SWQ7CisJdGhpcy5sYWJlbE5vZGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTsKK30sIGlzVHJlZU5vZGU6dHJ1ZSwgb2JqZWN0Ont9LCB0aXRsZToiIiwgaXNGb2xkZXI6bnVsbCwgY29udGVudE5vZGU6bnVsbCwgZXhwYW5kQ2xhc3M6IiIsIGlzRXhwYW5kZWQ6ZmFsc2UsIGNvbnRhaW5lck5vZGU6bnVsbCwgZ2V0SW5mbzpmdW5jdGlvbiAoKSB7CisJdmFyIGluZm8gPSB7d2lkZ2V0SWQ6dGhpcy53aWRnZXRJZCwgb2JqZWN0SWQ6dGhpcy5vYmplY3RJZCwgaW5kZXg6dGhpcy5nZXRQYXJlbnRJbmRleCgpfTsKKwlyZXR1cm4gaW5mbzsKK30sIHNldEZvbGRlcjpmdW5jdGlvbiAoKSB7CisJdGhpcy5pc0ZvbGRlciA9IHRydWU7CisJdGhpcy52aWV3U2V0RXhwYW5kKCk7CisJaWYgKCF0aGlzLmNvbnRhaW5lck5vZGUpIHsKKwkJdGhpcy52aWV3QWRkQ29udGFpbmVyKCk7CisJfQorCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZnRlclNldEZvbGRlciwge3NvdXJjZTp0aGlzfSk7Cit9LCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzLCBmcmFnLCBwYXJlbnQpIHsKKwlpZiAoYXJncy5pc0ZvbGRlcikgeworCQl0aGlzLmlzRm9sZGVyID0gdHJ1ZTsKKwl9CisJaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIHx8IHRoaXMuaXNGb2xkZXIpIHsKKwkJdGhpcy5zZXRGb2xkZXIoKTsKKwl9IGVsc2UgeworCQl0aGlzLnZpZXdTZXRFeHBhbmQoKTsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFjdGlvbnNEaXNhYmxlZC5sZW5ndGg7IGkrKykgeworCQl0aGlzLmFjdGlvbnNEaXNhYmxlZFtpXSA9IHRoaXMuYWN0aW9uc0Rpc2FibGVkW2ldLnRvVXBwZXJDYXNlKCk7CisJfQorCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZnRlckNoYW5nZVRyZWUsIHtvbGRUcmVlOm51bGwsIG5ld1RyZWU6dGhpcy50cmVlLCBub2RlOnRoaXN9KTsKK30sIHVuc2V0Rm9sZGVyOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmlzRm9sZGVyID0gZmFsc2U7CisJdGhpcy52aWV3U2V0RXhwYW5kKCk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmFmdGVyVW5zZXRGb2xkZXIsIHtzb3VyY2U6dGhpc30pOworfSwgaW5zZXJ0Tm9kZTpmdW5jdGlvbiAocGFyZW50LCBpbmRleCkgeworCWlmICghaW5kZXgpIHsKKwkJaW5kZXggPSAwOworCX0KKwlpZiAoaW5kZXggPT0gMCkgeworCQlkb2pvLmh0bWwucHJlcGVuZENoaWxkKHRoaXMuZG9tTm9kZSwgcGFyZW50LmNvbnRhaW5lck5vZGUpOworCX0gZWxzZSB7CisJCWRvam8uaHRtbC5pbnNlcnRBZnRlcih0aGlzLmRvbU5vZGUsIHBhcmVudC5jaGlsZHJlbltpbmRleCAtIDFdLmRvbU5vZGUpOworCX0KK30sIHVwZGF0ZVRyZWU6ZnVuY3Rpb24gKG5ld1RyZWUpIHsKKwlpZiAodGhpcy50cmVlID09PSBuZXdUcmVlKSB7CisJCXJldHVybjsKKwl9CisJdmFyIG9sZFRyZWUgPSB0aGlzLnRyZWU7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5nZXREZXNjZW5kYW50cygpLCBmdW5jdGlvbiAoZWxlbSkgeworCQllbGVtLnRyZWUgPSBuZXdUcmVlOworCX0pOworCWlmIChvbGRUcmVlLmNsYXNzUHJlZml4ICE9IG5ld1RyZWUuY2xhc3NQcmVmaXgpIHsKKwkJdmFyIHN0YWNrID0gW3RoaXMuZG9tTm9kZV07CisJCXZhciBlbGVtOworCQl2YXIgcmVnID0gbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBvbGRUcmVlLmNsYXNzUHJlZml4LCAiZyIpOworCQl3aGlsZSAoZWxlbSA9IHN0YWNrLnBvcCgpKSB7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJCXZhciBjaGlsZE5vZGUgPSBlbGVtLmNoaWxkTm9kZXNbaV07CisJCQkJaWYgKGNoaWxkTm9kZS5ub2RlRG9jVHlwZSAhPSAxKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlkb2pvLmh0bWwuc2V0Q2xhc3MoY2hpbGROb2RlLCBkb2pvLmh0bWwuZ2V0Q2xhc3MoY2hpbGROb2RlKS5yZXBsYWNlKHJlZywgIiQxIiArIG5ld1RyZWUuY2xhc3NQcmVmaXgpKTsKKwkJCQlzdGFjay5wdXNoKGNoaWxkTm9kZSk7CisJCQl9CisJCX0KKwl9CisJdmFyIG1lc3NhZ2UgPSB7b2xkVHJlZTpvbGRUcmVlLCBuZXdUcmVlOm5ld1RyZWUsIG5vZGU6dGhpc307CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmFmdGVyQ2hhbmdlVHJlZSwgbWVzc2FnZSk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKG5ld1RyZWUuZXZlbnROYW1lcy5hZnRlckNoYW5nZVRyZWUsIG1lc3NhZ2UpOworfSwgYWRkZWRUbzpmdW5jdGlvbiAocGFyZW50LCBpbmRleCwgZG9udFB1Ymxpc2hFdmVudCkgeworCWlmICh0aGlzLnRyZWUgIT09IHBhcmVudC50cmVlKSB7CisJCXRoaXMudXBkYXRlVHJlZShwYXJlbnQudHJlZSk7CisJfQorCWlmIChwYXJlbnQuaXNUcmVlTm9kZSkgeworCQlpZiAoIXBhcmVudC5pc0ZvbGRlcikgeworCQkJcGFyZW50LnNldEZvbGRlcigpOworCQkJcGFyZW50LnN0YXRlID0gcGFyZW50LmxvYWRTdGF0ZXMuTE9BREVEOworCQl9CisJfQorCXZhciBzaWJsaW5nc0NvdW50ID0gcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsKKwl0aGlzLmluc2VydE5vZGUocGFyZW50LCBpbmRleCk7CisJdGhpcy52aWV3QWRkTGF5b3V0KCk7CisJaWYgKHNpYmxpbmdzQ291bnQgPiAxKSB7CisJCWlmIChpbmRleCA9PSAwICYmIHBhcmVudC5jaGlsZHJlblsxXSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LldpZGdldCkgeworCQkJcGFyZW50LmNoaWxkcmVuWzFdLnZpZXdVcGRhdGVMYXlvdXQoKTsKKwkJfQorCQlpZiAoaW5kZXggPT0gc2libGluZ3NDb3VudCAtIDEgJiYgcGFyZW50LmNoaWxkcmVuW3NpYmxpbmdzQ291bnQgLSAyXSBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LldpZGdldCkgeworCQkJcGFyZW50LmNoaWxkcmVuW3NpYmxpbmdzQ291bnQgLSAyXS52aWV3VXBkYXRlTGF5b3V0KCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGFyZW50LmlzVHJlZU5vZGUpIHsKKwkJCXBhcmVudC52aWV3U2V0SGFzQ2hpbGRyZW4oKTsKKwkJfQorCX0KKwlpZiAoIWRvbnRQdWJsaXNoRXZlbnQpIHsKKwkJdmFyIG1lc3NhZ2UgPSB7Y2hpbGQ6dGhpcywgaW5kZXg6aW5kZXgsIHBhcmVudDpwYXJlbnR9OworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuYWZ0ZXJBZGRDaGlsZCwgbWVzc2FnZSk7CisJfQorfSwgY3JlYXRlU2ltcGxlOmZ1bmN0aW9uIChhcmdzLCBwYXJlbnQpIHsKKwlpZiAoYXJncy50cmVlKSB7CisJCXZhciB0cmVlID0gYXJncy50cmVlOworCX0gZWxzZSB7CisJCWlmIChwYXJlbnQpIHsKKwkJCXZhciB0cmVlID0gcGFyZW50LnRyZWU7CisJCX0gZWxzZSB7CisJCQlkb2pvLnJhaXNlKCJjcmVhdGVTaW1wbGU6IGNhbid0IGV2YWx1YXRlIHRyZWUiKTsKKwkJfQorCX0KKwl0cmVlID0gZG9qby53aWRnZXQuYnlJZCh0cmVlKTsKKwl2YXIgdHJlZU5vZGUgPSBuZXcgdHJlZS5kZWZhdWx0Q2hpbGRXaWRnZXQoKTsKKwlmb3IgKHZhciB4IGluIGFyZ3MpIHsKKwkJdHJlZU5vZGVbeF0gPSBhcmdzW3hdOworCX0KKwl0cmVlTm9kZS50b2dnbGVPYmogPSBkb2pvLmxmeC50b2dnbGVbdHJlZU5vZGUudG9nZ2xlLnRvTG93ZXJDYXNlKCldIHx8IGRvam8ubGZ4LnRvZ2dsZS5wbGFpbjsKKwlkb2pvLndpZGdldC5tYW5hZ2VyLmFkZCh0cmVlTm9kZSk7CisJdHJlZU5vZGUuYnVpbGRSZW5kZXJpbmcoYXJncywge30sIHBhcmVudCk7CisJdHJlZU5vZGUuaW5pdGlhbGl6ZShhcmdzLCB7fSwgcGFyZW50KTsKKwlpZiAodHJlZU5vZGUucGFyZW50KSB7CisJCWRlbGV0ZSBkb2pvLndpZGdldC5tYW5hZ2VyLnRvcFdpZGdldHNbdHJlZU5vZGUud2lkZ2V0SWRdOworCX0KKwlyZXR1cm4gdHJlZU5vZGU7Cit9LCB2aWV3VXBkYXRlTGF5b3V0OmZ1bmN0aW9uICgpIHsKKwl0aGlzLnZpZXdSZW1vdmVMYXlvdXQoKTsKKwl0aGlzLnZpZXdBZGRMYXlvdXQoKTsKK30sIHZpZXdBZGRDb250YWluZXI6ZnVuY3Rpb24gKCkgeworCXRoaXMuY29udGFpbmVyTm9kZSA9IHRoaXMudHJlZS5jb250YWluZXJOb2RlVGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpOworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lck5vZGUpOworfSwgdmlld0FkZExheW91dDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMucGFyZW50WyJpc1RyZWUiXSkgeworCQlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5kb21Ob2RlLCBkb2pvLmh0bWwuZ2V0Q2xhc3ModGhpcy5kb21Ob2RlKSArICIgIiArIHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJJc1Jvb3QiKTsKKwl9CisJaWYgKHRoaXMuaXNMYXN0Q2hpbGQoKSkgeworCQlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5kb21Ob2RlLCBkb2pvLmh0bWwuZ2V0Q2xhc3ModGhpcy5kb21Ob2RlKSArICIgIiArIHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJJc0xhc3QiKTsKKwl9Cit9LCB2aWV3UmVtb3ZlTGF5b3V0OmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzLnRyZWUuY2xhc3NQcmVmaXggKyAiSXNSb290Iik7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZG9tTm9kZSwgdGhpcy50cmVlLmNsYXNzUHJlZml4ICsgIklzTGFzdCIpOworfSwgdmlld0dldEV4cGFuZENsYXNzOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5pc0ZvbGRlcikgeworCQlyZXR1cm4gdGhpcy5pc0V4cGFuZGVkID8gIkV4cGFuZE9wZW4iIDogIkV4cGFuZENsb3NlZCI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJFeHBhbmRMZWFmIjsKKwl9Cit9LCB2aWV3U2V0RXhwYW5kOmZ1bmN0aW9uICgpIHsKKwl2YXIgZXhwYW5kID0gdGhpcy50cmVlLmNsYXNzUHJlZml4ICsgdGhpcy52aWV3R2V0RXhwYW5kQ2xhc3MoKTsKKwl2YXIgcmVnID0gbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyB0aGlzLnRyZWUuY2xhc3NQcmVmaXggKyAiRXhwYW5kXFx3KyIsICJnIik7CisJZG9qby5odG1sLnNldENsYXNzKHRoaXMuZG9tTm9kZSwgZG9qby5odG1sLmdldENsYXNzKHRoaXMuZG9tTm9kZSkucmVwbGFjZShyZWcsICIiKSArICIgIiArIGV4cGFuZCk7CisJdGhpcy52aWV3U2V0SGFzQ2hpbGRyZW5BbmRFeHBhbmQoKTsKK30sIHZpZXdHZXRDaGlsZHJlbkNsYXNzOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIkNoaWxkcmVuIiArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA/ICJZZXMiIDogIk5vIik7Cit9LCB2aWV3U2V0SGFzQ2hpbGRyZW46ZnVuY3Rpb24gKCkgeworCXZhciBjbGF6eiA9IHRoaXMudHJlZS5jbGFzc1ByZWZpeCArIHRoaXMudmlld0dldENoaWxkcmVuQ2xhc3MoKTsKKwl2YXIgcmVnID0gbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyB0aGlzLnRyZWUuY2xhc3NQcmVmaXggKyAiQ2hpbGRyZW5cXHcrIiwgImciKTsKKwlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5kb21Ob2RlLCBkb2pvLmh0bWwuZ2V0Q2xhc3ModGhpcy5kb21Ob2RlKS5yZXBsYWNlKHJlZywgIiIpICsgIiAiICsgY2xhenopOworCXRoaXMudmlld1NldEhhc0NoaWxkcmVuQW5kRXhwYW5kKCk7Cit9LCB2aWV3U2V0SGFzQ2hpbGRyZW5BbmRFeHBhbmQ6ZnVuY3Rpb24gKCkgeworCXZhciBjbGF6eiA9IHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJTdGF0ZSIgKyB0aGlzLnZpZXdHZXRDaGlsZHJlbkNsYXNzKCkgKyAiLSIgKyB0aGlzLnZpZXdHZXRFeHBhbmRDbGFzcygpOworCXZhciByZWcgPSBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJTdGF0ZVtcXHctXSsiLCAiZyIpOworCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmRvbU5vZGUsIGRvam8uaHRtbC5nZXRDbGFzcyh0aGlzLmRvbU5vZGUpLnJlcGxhY2UocmVnLCAiIikgKyAiICIgKyBjbGF6eik7Cit9LCB2aWV3VW5mb2N1czpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMubGFiZWxOb2RlLCB0aGlzLnRyZWUuY2xhc3NQcmVmaXggKyAiTGFiZWxGb2N1c2VkIik7Cit9LCB2aWV3Rm9jdXM6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmxhYmVsTm9kZSwgdGhpcy50cmVlLmNsYXNzUHJlZml4ICsgIkxhYmVsRm9jdXNlZCIpOworfSwgdmlld0VtcGhhc2l6ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmNsZWFyU2VsZWN0aW9uKHRoaXMubGFiZWxOb2RlKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5sYWJlbE5vZGUsIHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJOb2RlRW1waGFzaXplZCIpOworfSwgdmlld1VuZW1waGFzaXplOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5sYWJlbE5vZGUsIHRoaXMudHJlZS5jbGFzc1ByZWZpeCArICJOb2RlRW1waGFzaXplZCIpOworfSwgZGV0YWNoOmZ1bmN0aW9uICgpIHsKKwlpZiAoIXRoaXMucGFyZW50KSB7CisJCXJldHVybjsKKwl9CisJdmFyIHBhcmVudCA9IHRoaXMucGFyZW50OworCXZhciBpbmRleCA9IHRoaXMuZ2V0UGFyZW50SW5kZXgoKTsKKwl0aGlzLmRvRGV0YWNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmFmdGVyRGV0YWNoLCB7Y2hpbGQ6dGhpcywgcGFyZW50OnBhcmVudCwgaW5kZXg6aW5kZXh9KTsKK30sIGRvRGV0YWNoOmZ1bmN0aW9uICgpIHsKKwl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CisJaWYgKCFwYXJlbnQpIHsKKwkJcmV0dXJuOworCX0KKwl2YXIgaW5kZXggPSB0aGlzLmdldFBhcmVudEluZGV4KCk7CisJdGhpcy52aWV3UmVtb3ZlTGF5b3V0KCk7CisJZG9qby53aWRnZXQuRG9tV2lkZ2V0LnByb3RvdHlwZS5yZW1vdmVDaGlsZC5jYWxsKHBhcmVudCwgdGhpcyk7CisJdmFyIHNpYmxpbmdzQ291bnQgPSBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoOworCWlmIChzaWJsaW5nc0NvdW50ID4gMCkgeworCQlpZiAoaW5kZXggPT0gMCkgeworCQkJcGFyZW50LmNoaWxkcmVuWzBdLnZpZXdVcGRhdGVMYXlvdXQoKTsKKwkJfQorCQlpZiAoaW5kZXggPT0gc2libGluZ3NDb3VudCkgeworCQkJcGFyZW50LmNoaWxkcmVuW3NpYmxpbmdzQ291bnQgLSAxXS52aWV3VXBkYXRlTGF5b3V0KCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGFyZW50LmlzVHJlZU5vZGUpIHsKKwkJCXBhcmVudC52aWV3U2V0SGFzQ2hpbGRyZW4oKTsKKwkJfQorCX0KKwlpZiAodGhpcy50cmVlLnVuc2V0Rm9sZGVyT25FbXB0eSAmJiAhcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQuaXNUcmVlTm9kZSkgeworCQlwYXJlbnQudW5zZXRGb2xkZXIoKTsKKwl9CisJdGhpcy5wYXJlbnQgPSBudWxsOworfSwgZGVzdHJveTpmdW5jdGlvbiAoKSB7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmJlZm9yZU5vZGVEZXN0cm95LCB7c291cmNlOnRoaXN9KTsKKwl0aGlzLmRldGFjaCgpOworCXJldHVybiBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBleHBhbmQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzRXhwYW5kZWQpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGhpcy50cnlMYXp5SW5pdCkgeworCQl0aGlzLnNldENoaWxkcmVuKCk7CisJCXRoaXMudHJ5TGF6eUluaXQgPSBmYWxzZTsKKwl9CisJdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTsKKwl0aGlzLnZpZXdTZXRFeHBhbmQoKTsKKwl0aGlzLnNob3dDaGlsZHJlbigpOworfSwgY29sbGFwc2U6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5pc0V4cGFuZGVkKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7CisJdGhpcy5oaWRlQ2hpbGRyZW4oKTsKK30sIGhpZGVDaGlsZHJlbjpmdW5jdGlvbiAoKSB7CisJdGhpcy50cmVlLnRvZ2dsZU9iai5oaWRlKHRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy50cmVlLnRvZ2dsZUR1cmF0aW9uLCB0aGlzLmV4cGxvZGVTcmMsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25IaWRlQ2hpbGRyZW4iKSk7Cit9LCBzaG93Q2hpbGRyZW46ZnVuY3Rpb24gKCkgeworCXRoaXMudHJlZS50b2dnbGVPYmouc2hvdyh0aGlzLmNvbnRhaW5lck5vZGUsIHRoaXMudHJlZS50b2dnbGVEdXJhdGlvbiwgdGhpcy5leHBsb2RlU3JjLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9uU2hvd0NoaWxkcmVuIikpOworfSwgb25TaG93Q2hpbGRyZW46ZnVuY3Rpb24gKCkgeworCXRoaXMub25TaG93KCk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmFmdGVyRXhwYW5kLCB7c291cmNlOnRoaXN9KTsKK30sIG9uSGlkZUNoaWxkcmVuOmZ1bmN0aW9uICgpIHsKKwl0aGlzLnZpZXdTZXRFeHBhbmQoKTsKKwl0aGlzLm9uSGlkZSgpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZnRlckNvbGxhcHNlLCB7c291cmNlOnRoaXN9KTsKK30sIHNldFRpdGxlOmZ1bmN0aW9uICh0aXRsZSkgeworCXZhciBvbGRUaXRsZSA9IHRoaXMudGl0bGU7CisJdGhpcy5sYWJlbE5vZGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZSA9IHRpdGxlOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZnRlclNldFRpdGxlLCB7c291cmNlOnRoaXMsIG9sZFRpdGxlOm9sZFRpdGxlfSk7Cit9LCB0b1N0cmluZzpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICJbIiArIHRoaXMud2lkZ2V0VHlwZSArICIsICIgKyB0aGlzLnRpdGxlICsgIl0iOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVSUENDb250cm9sbGVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlUlBDQ29udHJvbGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRmNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlUlBDQ29udHJvbGxlci5qcwpAQCAtMCwwICsxLDcyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlUlBDQ29udHJvbGxlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLnJlcXVpcmUoImRvam8uaW8uKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZVJQQ0NvbnRyb2xsZXIiLCBkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXIsIHtkb01vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJdmFyIHBhcmFtcyA9IHtjaGlsZDp0aGlzLmdldEluZm8oY2hpbGQpLCBjaGlsZFRyZWU6dGhpcy5nZXRJbmZvKGNoaWxkLnRyZWUpLCBuZXdQYXJlbnQ6dGhpcy5nZXRJbmZvKG5ld1BhcmVudCksIG5ld1BhcmVudFRyZWU6dGhpcy5nZXRJbmZvKG5ld1BhcmVudC50cmVlKSwgbmV3SW5kZXg6aW5kZXh9OworCXZhciBzdWNjZXNzOworCXRoaXMucnVuUlBDKHt1cmw6dGhpcy5nZXRSUENVcmwoIm1vdmUiKSwgbG9hZDpmdW5jdGlvbiAocmVzcG9uc2UpIHsKKwkJc3VjY2VzcyA9IHRoaXMuZG9Nb3ZlUHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlLCBjaGlsZCwgbmV3UGFyZW50LCBpbmRleCk7CisJfSwgc3luYzp0cnVlLCBsb2NrOltjaGlsZCwgbmV3UGFyZW50XSwgcGFyYW1zOnBhcmFtc30pOworCXJldHVybiBzdWNjZXNzOworfSwgZG9Nb3ZlUHJvY2Vzc1Jlc3BvbnNlOmZ1bmN0aW9uIChyZXNwb25zZSwgY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpIHsKKwlpZiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXNwb25zZS5lcnJvcikpIHsKKwkJdGhpcy5SUENFcnJvckhhbmRsZXIoInNlcnZlciIsIHJlc3BvbnNlLmVycm9yKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl2YXIgYXJncyA9IFtjaGlsZCwgbmV3UGFyZW50LCBpbmRleF07CisJcmV0dXJuIGRvam8ud2lkZ2V0LlRyZWVMb2FkaW5nQ29udHJvbGxlci5wcm90b3R5cGUuZG9Nb3ZlLmFwcGx5KHRoaXMsIGFyZ3MpOworfSwgZG9SZW1vdmVOb2RlOmZ1bmN0aW9uIChub2RlLCBjYWxsT2JqLCBjYWxsRnVuYykgeworCXZhciBwYXJhbXMgPSB7bm9kZTp0aGlzLmdldEluZm8obm9kZSksIHRyZWU6dGhpcy5nZXRJbmZvKG5vZGUudHJlZSl9OworCXRoaXMucnVuUlBDKHt1cmw6dGhpcy5nZXRSUENVcmwoInJlbW92ZU5vZGUiKSwgbG9hZDpmdW5jdGlvbiAocmVzcG9uc2UpIHsKKwkJdGhpcy5kb1JlbW92ZU5vZGVQcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UsIG5vZGUsIGNhbGxPYmosIGNhbGxGdW5jKTsKKwl9LCBwYXJhbXM6cGFyYW1zLCBsb2NrOltub2RlXX0pOworfSwgZG9SZW1vdmVOb2RlUHJvY2Vzc1Jlc3BvbnNlOmZ1bmN0aW9uIChyZXNwb25zZSwgbm9kZSwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwlpZiAoIWRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXNwb25zZS5lcnJvcikpIHsKKwkJdGhpcy5SUENFcnJvckhhbmRsZXIoInNlcnZlciIsIHJlc3BvbnNlLmVycm9yKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoIXJlc3BvbnNlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHJlc3BvbnNlID09IHRydWUpIHsKKwkJdmFyIGFyZ3MgPSBbbm9kZSwgY2FsbE9iaiwgY2FsbEZ1bmNdOworCQlkb2pvLndpZGdldC5UcmVlTG9hZGluZ0NvbnRyb2xsZXIucHJvdG90eXBlLmRvUmVtb3ZlTm9kZS5hcHBseSh0aGlzLCBhcmdzKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChkb2pvLmxhbmcuaXNPYmplY3QocmVzcG9uc2UpKSB7CisJCQlkb2pvLnJhaXNlKHJlc3BvbnNlLmVycm9yKTsKKwkJfSBlbHNlIHsKKwkJCWRvam8ucmFpc2UoIkludmFsaWQgcmVzcG9uc2UgIiArIHJlc3BvbnNlKTsKKwkJfQorCX0KK30sIGRvQ3JlYXRlQ2hpbGQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIG91dHB1dCwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwl2YXIgcGFyYW1zID0ge3RyZWU6dGhpcy5nZXRJbmZvKHBhcmVudC50cmVlKSwgcGFyZW50OnRoaXMuZ2V0SW5mbyhwYXJlbnQpLCBpbmRleDppbmRleCwgZGF0YTpvdXRwdXR9OworCXRoaXMucnVuUlBDKHt1cmw6dGhpcy5nZXRSUENVcmwoImNyZWF0ZUNoaWxkIiksIGxvYWQ6ZnVuY3Rpb24gKHJlc3BvbnNlKSB7CisJCXRoaXMuZG9DcmVhdGVDaGlsZFByb2Nlc3NSZXNwb25zZShyZXNwb25zZSwgcGFyZW50LCBpbmRleCwgY2FsbE9iaiwgY2FsbEZ1bmMpOworCX0sIHBhcmFtczpwYXJhbXMsIGxvY2s6W3BhcmVudF19KTsKK30sIGRvQ3JlYXRlQ2hpbGRQcm9jZXNzUmVzcG9uc2U6ZnVuY3Rpb24gKHJlc3BvbnNlLCBwYXJlbnQsIGluZGV4LCBjYWxsT2JqLCBjYWxsRnVuYykgeworCWlmICghZG9qby5sYW5nLmlzVW5kZWZpbmVkKHJlc3BvbnNlLmVycm9yKSkgeworCQl0aGlzLlJQQ0Vycm9ySGFuZGxlcigic2VydmVyIiwgcmVzcG9uc2UuZXJyb3IpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmICghZG9qby5sYW5nLmlzT2JqZWN0KHJlc3BvbnNlKSkgeworCQlkb2pvLnJhaXNlKCJJbnZhbGlkIHJlc3VsdCAiICsgcmVzcG9uc2UpOworCX0KKwl2YXIgYXJncyA9IFtwYXJlbnQsIGluZGV4LCByZXNwb25zZSwgY2FsbE9iaiwgY2FsbEZ1bmNdOworCWRvam8ud2lkZ2V0LlRyZWVMb2FkaW5nQ29udHJvbGxlci5wcm90b3R5cGUuZG9DcmVhdGVDaGlsZC5hcHBseSh0aGlzLCBhcmdzKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlUnBjQ29udHJvbGxlclYzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlUnBjQ29udHJvbGxlclYzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTM3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVScGNDb250cm9sbGVyVjMuanMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVScGNDb250cm9sbGVyVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8uanNvbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZUxvYWRpbmdDb250cm9sbGVyVjMiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZVJwY0NvbnRyb2xsZXJWMyIsIGRvam8ud2lkZ2V0LlRyZWVMb2FkaW5nQ29udHJvbGxlclYzLCB7ZXh0cmFScGNPbkVkaXQ6ZmFsc2UsIGRvTW92ZTpmdW5jdGlvbiAoY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgsIHN5bmMpIHsKKwl2YXIgcGFyYW1zID0ge2NoaWxkOnRoaXMuZ2V0SW5mbyhjaGlsZCksIGNoaWxkVHJlZTp0aGlzLmdldEluZm8oY2hpbGQudHJlZSksIG9sZFBhcmVudDp0aGlzLmdldEluZm8oY2hpbGQucGFyZW50KSwgb2xkUGFyZW50VHJlZTp0aGlzLmdldEluZm8oY2hpbGQucGFyZW50LnRyZWUpLCBuZXdQYXJlbnQ6dGhpcy5nZXRJbmZvKG5ld1BhcmVudCksIG5ld1BhcmVudFRyZWU6dGhpcy5nZXRJbmZvKG5ld1BhcmVudC50cmVlKSwgbmV3SW5kZXg6aW5kZXh9OworCXZhciBkZWZlcnJlZCA9IHRoaXMucnVuUnBjKHt1cmw6dGhpcy5nZXRScGNVcmwoIm1vdmUiKSwgc3luYzpzeW5jLCBwYXJhbXM6cGFyYW1zfSk7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgYXJncyA9IGFyZ3VtZW50czsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCWRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMy5wcm90b3R5cGUuZG9Nb3ZlLmFwcGx5KF90aGlzLCBhcmdzKTsKKwl9KTsKKwlyZXR1cm4gZGVmZXJyZWQ7Cit9LCBwcmVwYXJlRGV0YWNoOmZ1bmN0aW9uIChub2RlLCBzeW5jKSB7CisJdmFyIGRlZmVycmVkID0gdGhpcy5zdGFydFByb2Nlc3Npbmcobm9kZSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgZmluYWxpemVEZXRhY2g6ZnVuY3Rpb24gKG5vZGUpIHsKKwl0aGlzLmZpbmlzaFByb2Nlc3Npbmcobm9kZSk7Cit9LCBkb0RldGFjaDpmdW5jdGlvbiAobm9kZSwgc3luYykgeworCXZhciBwYXJhbXMgPSB7bm9kZTp0aGlzLmdldEluZm8obm9kZSksIHRyZWU6dGhpcy5nZXRJbmZvKG5vZGUudHJlZSl9OworCXZhciBkZWZlcnJlZCA9IHRoaXMucnVuUnBjKHt1cmw6dGhpcy5nZXRScGNVcmwoImRldGFjaCIpLCBzeW5jOnN5bmMsIHBhcmFtczpwYXJhbXN9KTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBhcmdzID0gYXJndW1lbnRzOworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uICgpIHsKKwkJZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzLnByb3RvdHlwZS5kb0RldGFjaC5hcHBseShfdGhpcywgYXJncyk7CisJfSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgcmVxdWVzdEVkaXRDb25maXJtYXRpb246ZnVuY3Rpb24gKG5vZGUsIGFjdGlvbiwgc3luYykgeworCWlmICghdGhpcy5leHRyYVJwY09uRWRpdCkgeworCQlyZXR1cm4gZG9qby5EZWZlcnJlZC5wcm90b3R5cGUubWFrZUNhbGxlZCgpOworCX0KKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBkZWZlcnJlZCA9IHRoaXMuc3RhcnRQcm9jZXNzaW5nKG5vZGUpOworCXZhciBwYXJhbXMgPSB7bm9kZTp0aGlzLmdldEluZm8obm9kZSksIHRyZWU6dGhpcy5nZXRJbmZvKG5vZGUudHJlZSl9OworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIF90aGlzLnJ1blJwYyh7dXJsOl90aGlzLmdldFJwY1VybChhY3Rpb24pLCBzeW5jOnN5bmMsIHBhcmFtczpwYXJhbXN9KTsKKwl9KTsKKwlkZWZlcnJlZC5hZGRCb3RoKGZ1bmN0aW9uIChyKSB7CisJCV90aGlzLmZpbmlzaFByb2Nlc3Npbmcobm9kZSk7CisJCXJldHVybiByOworCX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIGVkaXRMYWJlbFNhdmU6ZnVuY3Rpb24gKG5vZGUsIG5ld0NvbnRlbnQsIHN5bmMpIHsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnN0YXJ0UHJvY2Vzc2luZyhub2RlKTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBwYXJhbXMgPSB7bm9kZTp0aGlzLmdldEluZm8obm9kZSksIHRyZWU6dGhpcy5nZXRJbmZvKG5vZGUudHJlZSksIG5ld0NvbnRlbnQ6bmV3Q29udGVudH07CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKCkgeworCQlyZXR1cm4gX3RoaXMucnVuUnBjKHt1cmw6X3RoaXMuZ2V0UnBjVXJsKCJlZGl0TGFiZWxTYXZlIiksIHN5bmM6c3luYywgcGFyYW1zOnBhcmFtc30pOworCX0pOworCWRlZmVycmVkLmFkZEJvdGgoZnVuY3Rpb24gKHIpIHsKKwkJX3RoaXMuZmluaXNoUHJvY2Vzc2luZyhub2RlKTsKKwkJcmV0dXJuIHI7CisJfSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgZWRpdExhYmVsU3RhcnQ6ZnVuY3Rpb24gKG5vZGUsIHN5bmMpIHsKKwlpZiAoIXRoaXMuY2FuRWRpdExhYmVsKG5vZGUpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIF90aGlzID0gdGhpczsKKwlpZiAoIXRoaXMuZWRpdG9yLmlzQ2xvc2VkKCkpIHsKKwkJdmFyIGRlZmVycmVkID0gdGhpcy5lZGl0TGFiZWxGaW5pc2godGhpcy5lZGl0b3Iuc2F2ZU9uQmx1ciwgc3luYyk7CisJCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uICgpIHsKKwkJCXJldHVybiBfdGhpcy5lZGl0TGFiZWxTdGFydChub2RlLCBzeW5jKTsKKwkJfSk7CisJCXJldHVybiBkZWZlcnJlZDsKKwl9CisJdmFyIGRlZmVycmVkID0gdGhpcy5yZXF1ZXN0RWRpdENvbmZpcm1hdGlvbihub2RlLCAiZWRpdExhYmVsU3RhcnQiLCBzeW5jKTsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCV90aGlzLmRvRWRpdExhYmVsU3RhcnQobm9kZSk7CisJfSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgZWRpdExhYmVsRmluaXNoOmZ1bmN0aW9uIChzYXZlLCBzeW5jKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgbm9kZSA9IHRoaXMuZWRpdG9yLm5vZGU7CisJdmFyIGRlZmVycmVkID0gZG9qby5EZWZlcnJlZC5wcm90b3R5cGUubWFrZUNhbGxlZCgpOworCWlmICghc2F2ZSAmJiAhbm9kZS5pc1BoYW50b20pIHsKKwkJZGVmZXJyZWQgPSB0aGlzLnJlcXVlc3RFZGl0Q29uZmlybWF0aW9uKHRoaXMuZWRpdG9yLm5vZGUsICJlZGl0TGFiZWxGaW5pc2hDYW5jZWwiLCBzeW5jKTsKKwl9CisJaWYgKHNhdmUpIHsKKwkJaWYgKG5vZGUuaXNQaGFudG9tKSB7CisJCQlkZWZlcnJlZCA9IHRoaXMuc2VuZENyZWF0ZUNoaWxkUmVxdWVzdChub2RlLnBhcmVudCwgbm9kZS5nZXRQYXJlbnRJbmRleCgpLCB7dGl0bGU6dGhpcy5lZGl0b3IuZ2V0Q29udGVudHMoKX0sIHN5bmMpOworCQl9IGVsc2UgeworCQkJZGVmZXJyZWQgPSB0aGlzLmVkaXRMYWJlbFNhdmUobm9kZSwgdGhpcy5lZGl0b3IuZ2V0Q29udGVudHMoKSwgc3luYyk7CisJCX0KKwl9CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKHNlcnZlcl9kYXRhKSB7CisJCV90aGlzLmRvRWRpdExhYmVsRmluaXNoKHNhdmUsIHNlcnZlcl9kYXRhKTsKKwl9KTsKKwlkZWZlcnJlZC5hZGRFcnJiYWNrKGZ1bmN0aW9uIChyKSB7CisJCV90aGlzLmRvRWRpdExhYmVsRmluaXNoKGZhbHNlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIGNyZWF0ZUFuZEVkaXQ6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIHN5bmMpIHsKKwl2YXIgZGF0YSA9IHt0aXRsZTpwYXJlbnQudHJlZS5kZWZhdWx0Q2hpbGRUaXRsZX07CisJaWYgKCF0aGlzLmNhbkNyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKCF0aGlzLmVkaXRvci5pc0Nsb3NlZCgpKSB7CisJCXZhciBkZWZlcnJlZCA9IHRoaXMuZWRpdExhYmVsRmluaXNoKHRoaXMuZWRpdG9yLnNhdmVPbkJsdXIsIHN5bmMpOworCQlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCQlyZXR1cm4gX3RoaXMuY3JlYXRlQW5kRWRpdChwYXJlbnQsIGluZGV4LCBzeW5jKTsKKwkJfSk7CisJCXJldHVybiBkZWZlcnJlZDsKKwl9CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnByZXBhcmVDcmVhdGVDaGlsZChwYXJlbnQsIGluZGV4LCBkYXRhLCBzeW5jKTsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCXZhciBjaGlsZCA9IF90aGlzLm1ha2VEZWZhdWx0Tm9kZShwYXJlbnQsIGluZGV4KTsKKwkJY2hpbGQuaXNQaGFudG9tID0gdHJ1ZTsKKwkJcmV0dXJuIGNoaWxkOworCX0pOworCWRlZmVycmVkLmFkZEJvdGgoZnVuY3Rpb24gKHIpIHsKKwkJX3RoaXMuZmluYWxpemVDcmVhdGVDaGlsZChwYXJlbnQsIGluZGV4LCBkYXRhLCBzeW5jKTsKKwkJcmV0dXJuIHI7CisJfSk7CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKGNoaWxkKSB7CisJCXZhciBkID0gX3RoaXMuZXhwb3NlQ3JlYXRlQ2hpbGQocGFyZW50LCBpbmRleCwgZGF0YSwgc3luYyk7CisJCWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIGNoaWxkOworCQl9KTsKKwkJcmV0dXJuIGQ7CisJfSk7CisJZGVmZXJyZWQuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKGNoaWxkKSB7CisJCV90aGlzLmRvRWRpdExhYmVsU3RhcnQoY2hpbGQpOworCQlyZXR1cm4gY2hpbGQ7CisJfSk7CisJcmV0dXJuIGRlZmVycmVkOworfSwgcHJlcGFyZURlc3Ryb3lDaGlsZDpmdW5jdGlvbiAobm9kZSwgc3luYykgeworCXZhciBkZWZlcnJlZCA9IHRoaXMuc3RhcnRQcm9jZXNzaW5nKG5vZGUpOworCXJldHVybiBkZWZlcnJlZDsKK30sIGZpbmFsaXplRGVzdHJveUNoaWxkOmZ1bmN0aW9uIChub2RlKSB7CisJdGhpcy5maW5pc2hQcm9jZXNzaW5nKG5vZGUpOworfSwgZG9EZXN0cm95Q2hpbGQ6ZnVuY3Rpb24gKG5vZGUsIHN5bmMpIHsKKwl2YXIgcGFyYW1zID0ge25vZGU6dGhpcy5nZXRJbmZvKG5vZGUpLCB0cmVlOnRoaXMuZ2V0SW5mbyhub2RlLnRyZWUpfTsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnJ1blJwYyh7dXJsOnRoaXMuZ2V0UnBjVXJsKCJkZXN0cm95Q2hpbGQiKSwgc3luYzpzeW5jLCBwYXJhbXM6cGFyYW1zfSk7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgYXJncyA9IGFyZ3VtZW50czsKKwlkZWZlcnJlZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7CisJCWRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXJWMy5wcm90b3R5cGUuZG9EZXN0cm95Q2hpbGQuYXBwbHkoX3RoaXMsIGFyZ3MpOworCX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIHNlbmRDcmVhdGVDaGlsZFJlcXVlc3Q6ZnVuY3Rpb24gKHBhcmVudCwgaW5kZXgsIGRhdGEsIHN5bmMpIHsKKwl2YXIgcGFyYW1zID0ge3RyZWU6dGhpcy5nZXRJbmZvKHBhcmVudC50cmVlKSwgcGFyZW50OnRoaXMuZ2V0SW5mbyhwYXJlbnQpLCBpbmRleDppbmRleCwgZGF0YTpkYXRhfTsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnJ1blJwYyh7dXJsOnRoaXMuZ2V0UnBjVXJsKCJjcmVhdGVDaGlsZCIpLCBzeW5jOnN5bmMsIHBhcmFtczpwYXJhbXN9KTsKKwlyZXR1cm4gZGVmZXJyZWQ7Cit9LCBkb0NyZWF0ZUNoaWxkOmZ1bmN0aW9uIChwYXJlbnQsIGluZGV4LCBkYXRhLCBzeW5jKSB7CisJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChkYXRhLnRpdGxlKSkgeworCQlkYXRhLnRpdGxlID0gcGFyZW50LnRyZWUuZGVmYXVsdENoaWxkVGl0bGU7CisJfQorCXZhciBkZWZlcnJlZCA9IHRoaXMuc2VuZENyZWF0ZUNoaWxkUmVxdWVzdChwYXJlbnQsIGluZGV4LCBkYXRhLCBzeW5jKTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBhcmdzID0gYXJndW1lbnRzOworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uIChzZXJ2ZXJfZGF0YSkgeworCQlkb2pvLmxhbmcubWl4aW4oZGF0YSwgc2VydmVyX2RhdGEpOworCQlyZXR1cm4gZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzLnByb3RvdHlwZS5kb0NyZWF0ZUNoaWxkLmNhbGwoX3RoaXMsIHBhcmVudCwgaW5kZXgsIGRhdGEpOworCX0pOworCXJldHVybiBkZWZlcnJlZDsKK30sIGRvQ2xvbmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4LCBkZWVwLCBzeW5jKSB7CisJdmFyIHBhcmFtcyA9IHtjaGlsZDp0aGlzLmdldEluZm8oY2hpbGQpLCBvbGRQYXJlbnQ6dGhpcy5nZXRJbmZvKGNoaWxkLnBhcmVudCksIG9sZFBhcmVudFRyZWU6dGhpcy5nZXRJbmZvKGNoaWxkLnBhcmVudC50cmVlKSwgbmV3UGFyZW50OnRoaXMuZ2V0SW5mbyhuZXdQYXJlbnQpLCBuZXdQYXJlbnRUcmVlOnRoaXMuZ2V0SW5mbyhuZXdQYXJlbnQudHJlZSksIGluZGV4OmluZGV4LCBkZWVwOmRlZXAgPyB0cnVlIDogZmFsc2UsIHRyZWU6dGhpcy5nZXRJbmZvKGNoaWxkLnRyZWUpfTsKKwl2YXIgZGVmZXJyZWQgPSB0aGlzLnJ1blJwYyh7dXJsOnRoaXMuZ2V0UnBjVXJsKCJjbG9uZSIpLCBzeW5jOnN5bmMsIHBhcmFtczpwYXJhbXN9KTsKKwl2YXIgX3RoaXMgPSB0aGlzOworCXZhciBhcmdzID0gYXJndW1lbnRzOworCWRlZmVycmVkLmFkZENhbGxiYWNrKGZ1bmN0aW9uICgpIHsKKwkJZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlclYzLnByb3RvdHlwZS5kb0Nsb25lLmFwcGx5KF90aGlzLCBhcmdzKTsKKwl9KTsKKwlyZXR1cm4gZGVmZXJyZWQ7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZVNlbGVjdG9yLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlU2VsZWN0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5MjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZVNlbGVjdG9yLmpzCkBAIC0wLDAgKzEsMTAyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlU2VsZWN0b3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlU2VsZWN0b3IiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbiAoKSB7CisJdGhpcy5ldmVudE5hbWVzID0ge307CisJdGhpcy5saXN0ZW5lZFRyZWVzID0gW107Cit9LCB7d2lkZ2V0VHlwZToiVHJlZVNlbGVjdG9yIiwgc2VsZWN0ZWROb2RlOm51bGwsIGRpZVdpdGhUcmVlOmZhbHNlLCBldmVudE5hbWVzRGVmYXVsdDp7c2VsZWN0OiJzZWxlY3QiLCBkZXN0cm95OiJkZXN0cm95IiwgZGVzZWxlY3Q6ImRlc2VsZWN0IiwgZGJsc2VsZWN0OiJkYmxzZWxlY3QifSwgaW5pdGlhbGl6ZTpmdW5jdGlvbiAoKSB7CisJZm9yICh2YXIgbmFtZSBpbiB0aGlzLmV2ZW50TmFtZXNEZWZhdWx0KSB7CisJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQodGhpcy5ldmVudE5hbWVzW25hbWVdKSkgeworCQkJdGhpcy5ldmVudE5hbWVzW25hbWVdID0gdGhpcy53aWRnZXRJZCArICIvIiArIHRoaXMuZXZlbnROYW1lc0RlZmF1bHRbbmFtZV07CisJCX0KKwl9Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmRlc3Ryb3ksIHtzb3VyY2U6dGhpc30pOworCXJldHVybiBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBsaXN0ZW5UcmVlOmZ1bmN0aW9uICh0cmVlKSB7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRpdGxlQ2xpY2ssIHRoaXMsICJzZWxlY3QiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuaWNvbkNsaWNrLCB0aGlzLCAic2VsZWN0Iik7CisJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLCB0aGlzLCAib25Db2xsYXBzZSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgdGhpcywgIm9uTW92ZUZyb20iKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMucmVtb3ZlTm9kZSwgdGhpcywgIm9uUmVtb3ZlTm9kZSIpOworCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwl0aGlzLmxpc3RlbmVkVHJlZXMucHVzaCh0cmVlKTsKK30sIHVubGlzdGVuVHJlZTpmdW5jdGlvbiAodHJlZSkgeworCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRpdGxlQ2xpY2ssIHRoaXMsICJzZWxlY3QiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5pY29uQ2xpY2ssIHRoaXMsICJzZWxlY3QiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jb2xsYXBzZSwgdGhpcywgIm9uQ29sbGFwc2UiKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgdGhpcywgIm9uTW92ZUZyb20iKTsKKwlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLCB0aGlzLCAib25SZW1vdmVOb2RlIik7CisJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZURlc3Ryb3ksIHRoaXMsICJvblRyZWVEZXN0cm95Iik7CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVkVHJlZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKHRoaXMubGlzdGVuZWRUcmVlc1tpXSA9PT0gdHJlZSkgeworCQkJdGhpcy5saXN0ZW5lZFRyZWVzLnNwbGljZShpLCAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorfSwgb25UcmVlRGVzdHJveTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXRoaXMudW5saXN0ZW5UcmVlKG1lc3NhZ2Uuc291cmNlKTsKKwlpZiAodGhpcy5kaWVXaXRoVHJlZSkgeworCQl0aGlzLmRlc3Ryb3koKTsKKwl9Cit9LCBvbkNvbGxhcHNlOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJaWYgKCF0aGlzLnNlbGVjdGVkTm9kZSkgeworCQlyZXR1cm47CisJfQorCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisJdmFyIHBhcmVudCA9IHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudDsKKwl3aGlsZSAocGFyZW50ICE9PSBub2RlICYmIHBhcmVudC5pc1RyZWVOb2RlKSB7CisJCXBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CisJfQorCWlmIChwYXJlbnQuaXNUcmVlTm9kZSkgeworCQl0aGlzLmRlc2VsZWN0KCk7CisJfQorfSwgc2VsZWN0OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdmFyIG5vZGUgPSBtZXNzYWdlLnNvdXJjZTsKKwl2YXIgZSA9IG1lc3NhZ2UuZXZlbnQ7CisJaWYgKHRoaXMuc2VsZWN0ZWROb2RlID09PSBub2RlKSB7CisJCWlmIChlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHsKKwkJCXRoaXMuZGVzZWxlY3QoKTsKKwkJCXJldHVybjsKKwkJfQorCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmRibHNlbGVjdCwge25vZGU6bm9kZX0pOworCQlyZXR1cm47CisJfQorCWlmICh0aGlzLnNlbGVjdGVkTm9kZSkgeworCQl0aGlzLmRlc2VsZWN0KCk7CisJfQorCXRoaXMuZG9TZWxlY3Qobm9kZSk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5zZWxlY3QsIHtub2RlOm5vZGV9KTsKK30sIG9uTW92ZUZyb206ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwlpZiAobWVzc2FnZS5jaGlsZCAhPT0gdGhpcy5zZWxlY3RlZE5vZGUpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMubGlzdGVuZWRUcmVlcywgbWVzc2FnZS5uZXdUcmVlKSkgeworCQl0aGlzLmRlc2VsZWN0KCk7CisJfQorfSwgb25SZW1vdmVOb2RlOmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJaWYgKG1lc3NhZ2UuY2hpbGQgIT09IHRoaXMuc2VsZWN0ZWROb2RlKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5kZXNlbGVjdCgpOworfSwgZG9TZWxlY3Q6ZnVuY3Rpb24gKG5vZGUpIHsKKwlub2RlLm1hcmtTZWxlY3RlZCgpOworCXRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZTsKK30sIGRlc2VsZWN0OmZ1bmN0aW9uICgpIHsKKwl2YXIgbm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlOworCXRoaXMuc2VsZWN0ZWROb2RlID0gbnVsbDsKKwlub2RlLnVuTWFya1NlbGVjdGVkKCk7CisJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5kZXNlbGVjdCwge25vZGU6bm9kZX0pOworfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVTZWxlY3RvclYzLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlU2VsZWN0b3JWMy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjY1ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlU2VsZWN0b3JWMy5qcwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yVjMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlQ29tbW9uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvclYzIiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LlRyZWVDb21tb25dLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5ldmVudE5hbWVzID0ge307CisJdGhpcy5saXN0ZW5lZFRyZWVzID0ge307CisJdGhpcy5zZWxlY3RlZE5vZGVzID0gW107CisJdGhpcy5sYXN0Q2xpY2tlZCA9IHt9OworfSwge2xpc3RlblRyZWVFdmVudHM6WyJhZnRlclRyZWVDcmVhdGUiLCAiYWZ0ZXJDb2xsYXBzZSIsICJhZnRlckNoYW5nZVRyZWUiLCAiYWZ0ZXJEZXRhY2giLCAiYmVmb3JlVHJlZURlc3Ryb3kiXSwgbGlzdGVuTm9kZUZpbHRlcjpmdW5jdGlvbiAoZWxlbSkgeworCXJldHVybiBlbGVtIGluc3RhbmNlb2YgZG9qby53aWRnZXQuV2lkZ2V0OworfSwgYWxsb3dlZE11bHRpOnRydWUsIGRibHNlbGVjdFRpbWVvdXQ6MzAwLCBldmVudE5hbWVzRGVmYXVsdDp7c2VsZWN0OiJzZWxlY3QiLCBkZXNlbGVjdDoiZGVzZWxlY3QiLCBkYmxzZWxlY3Q6ImRibHNlbGVjdCJ9LCBvbkFmdGVyVHJlZUNyZWF0ZTpmdW5jdGlvbiAobWVzc2FnZSkgeworCXZhciB0cmVlID0gbWVzc2FnZS5zb3VyY2U7CisJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKHRyZWUuZG9tTm9kZSwgIm9uY2xpY2siLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGhpcy5vblRyZWVDbGljaykpOworCWlmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcih0cmVlLmRvbU5vZGUsICJvbmRibGNsaWNrIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMub25UcmVlRGJsQ2xpY2spKTsKKwl9CisJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKHRyZWUuZG9tTm9kZSwgIm9uS2V5IiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMub25LZXkpKTsKK30sIG9uS2V5OmZ1bmN0aW9uIChlKSB7CisJaWYgKCFlLmtleSB8fCBlLmN0cmtLZXkgfHwgZS5hbHRLZXkpIHsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKGUua2V5KSB7CisJICBjYXNlIGUuS0VZX0VOVEVSOgorCQl2YXIgbm9kZSA9IHRoaXMuZG9tRWxlbWVudDJUcmVlTm9kZShlLnRhcmdldCk7CisJCWlmIChub2RlKSB7CisJCQl0aGlzLnByb2Nlc3NOb2RlKG5vZGUsIGUpOworCQl9CisJfQorfSwgb25BZnRlckNoYW5nZVRyZWU6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwlpZiAoIW1lc3NhZ2Uub2xkVHJlZSAmJiBtZXNzYWdlLm5vZGUuc2VsZWN0ZWQpIHsKKwkJdGhpcy5zZWxlY3QobWVzc2FnZS5ub2RlKTsKKwl9CisJaWYgKCFtZXNzYWdlLm5ld1RyZWUgfHwgIXRoaXMubGlzdGVuZWRUcmVlc1ttZXNzYWdlLm5ld1RyZWUud2lkZ2V0SWRdKSB7CisJCWlmICh0aGlzLnNlbGVjdGVkTm9kZSAmJiBtZXNzYWdlLm5vZGUuY2hpbGRyZW4pIHsKKwkJCXRoaXMuZGVzZWxlY3RJZkFuY2VzdG9yTWF0Y2gobWVzc2FnZS5ub2RlKTsKKwkJfQorCX0KK30sIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MpIHsKKwlmb3IgKHZhciBuYW1lIGluIHRoaXMuZXZlbnROYW1lc0RlZmF1bHQpIHsKKwkJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZCh0aGlzLmV2ZW50TmFtZXNbbmFtZV0pKSB7CisJCQl0aGlzLmV2ZW50TmFtZXNbbmFtZV0gPSB0aGlzLndpZGdldElkICsgIi8iICsgdGhpcy5ldmVudE5hbWVzRGVmYXVsdFtuYW1lXTsKKwkJfQorCX0KK30sIG9uQmVmb3JlVHJlZURlc3Ryb3k6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLnVubGlzdGVuVHJlZShtZXNzYWdlLnNvdXJjZSk7Cit9LCBvbkFmdGVyQ29sbGFwc2U6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLmRlc2VsZWN0SWZBbmNlc3Rvck1hdGNoKG1lc3NhZ2Uuc291cmNlKTsKK30sIG9uVHJlZURibENsaWNrOmZ1bmN0aW9uIChldmVudCkgeworCXRoaXMub25UcmVlQ2xpY2soZXZlbnQpOworfSwgY2hlY2tTcGVjaWFsRXZlbnQ6ZnVuY3Rpb24gKGV2ZW50KSB7CisJcmV0dXJuIGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmN0cmxLZXk7Cit9LCBvblRyZWVDbGljazpmdW5jdGlvbiAoZXZlbnQpIHsKKwl2YXIgbm9kZSA9IHRoaXMuZG9tRWxlbWVudDJUcmVlTm9kZShldmVudC50YXJnZXQpOworCWlmICghbm9kZSkgeworCQlyZXR1cm47CisJfQorCXZhciBjaGVja0xhYmVsQ2xpY2sgPSBmdW5jdGlvbiAoZG9tRWxlbWVudCkgeworCQlyZXR1cm4gZG9tRWxlbWVudCA9PT0gbm9kZS5sYWJlbE5vZGU7CisJfTsKKwlpZiAodGhpcy5jaGVja1BhdGhDb25kaXRpb24oZXZlbnQudGFyZ2V0LCBjaGVja0xhYmVsQ2xpY2spKSB7CisJCXRoaXMucHJvY2Vzc05vZGUobm9kZSwgZXZlbnQpOworCX0KK30sIHByb2Nlc3NOb2RlOmZ1bmN0aW9uIChub2RlLCBldmVudCkgeworCWlmIChub2RlLmFjdGlvbklzRGlzYWJsZWQobm9kZS5hY3Rpb25zLlNFTEVDVCkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG9qby5sYW5nLmluQXJyYXkodGhpcy5zZWxlY3RlZE5vZGVzLCBub2RlKSkgeworCQlpZiAodGhpcy5jaGVja1NwZWNpYWxFdmVudChldmVudCkpIHsKKwkJCXRoaXMuZGVzZWxlY3Qobm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwkJdmFyIF90aGlzID0gdGhpczsKKwkJdmFyIGkgPSAwOworCQl2YXIgc2VsZWN0ZWROb2RlOworCQl3aGlsZSAodGhpcy5zZWxlY3RlZE5vZGVzLmxlbmd0aCA+IGkpIHsKKwkJCXNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2Rlc1tpXTsKKwkJCWlmIChzZWxlY3RlZE5vZGUgIT09IG5vZGUpIHsKKwkJCQl0aGlzLmRlc2VsZWN0KHNlbGVjdGVkTm9kZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpKys7CisJCX0KKwkJdmFyIHdhc0p1c3RDbGlja2VkID0gdGhpcy5jaGVja1JlY2VudENsaWNrKG5vZGUpOworCQlldmVudE5hbWUgPSB3YXNKdXN0Q2xpY2tlZCA/IHRoaXMuZXZlbnROYW1lcy5kYmxzZWxlY3QgOiB0aGlzLmV2ZW50TmFtZXMuc2VsZWN0OworCQlpZiAod2FzSnVzdENsaWNrZWQpIHsKKwkJCWV2ZW50TmFtZSA9IHRoaXMuZXZlbnROYW1lcy5kYmxzZWxlY3Q7CisJCQl0aGlzLmZvcmdldExhc3RDbGlja2VkKCk7CisJCX0gZWxzZSB7CisJCQlldmVudE5hbWUgPSB0aGlzLmV2ZW50TmFtZXMuc2VsZWN0OworCQkJdGhpcy5zZXRMYXN0Q2xpY2tlZChub2RlKTsKKwkJfQorCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goZXZlbnROYW1lLCB7bm9kZTpub2RlfSk7CisJCXJldHVybjsKKwl9CisJdGhpcy5kZXNlbGVjdElmTm9NdWx0aShldmVudCk7CisJdGhpcy5zZXRMYXN0Q2xpY2tlZChub2RlKTsKKwl0aGlzLnNlbGVjdChub2RlKTsKK30sIGZvcmdldExhc3RDbGlja2VkOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmxhc3RDbGlja2VkID0ge307Cit9LCBzZXRMYXN0Q2xpY2tlZDpmdW5jdGlvbiAobm9kZSkgeworCXRoaXMubGFzdENsaWNrZWQuZGF0ZSA9IG5ldyBEYXRlKCk7CisJdGhpcy5sYXN0Q2xpY2tlZC5ub2RlID0gbm9kZTsKK30sIGNoZWNrUmVjZW50Q2xpY2s6ZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgZGlmZiA9IG5ldyBEYXRlKCkgLSB0aGlzLmxhc3RDbGlja2VkLmRhdGU7CisJaWYgKHRoaXMubGFzdENsaWNrZWQubm9kZSAmJiBkaWZmIDwgdGhpcy5kYmxzZWxlY3RUaW1lb3V0KSB7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9LCBkZXNlbGVjdElmTm9NdWx0aTpmdW5jdGlvbiAoZXZlbnQpIHsKKwlpZiAoIXRoaXMuY2hlY2tTcGVjaWFsRXZlbnQoZXZlbnQpIHx8ICF0aGlzLmFsbG93ZWRNdWx0aSkgeworCQl0aGlzLmRlc2VsZWN0QWxsKCk7CisJfQorfSwgZGVzZWxlY3RJZkFuY2VzdG9yTWF0Y2g6ZnVuY3Rpb24gKGFuY2VzdG9yKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnNlbGVjdGVkTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7CisJCXZhciBzZWxlY3RlZE5vZGUgPSBub2RlOworCQlub2RlID0gbm9kZS5wYXJlbnQ7CisJCXdoaWxlIChub2RlICYmIG5vZGUuaXNUcmVlTm9kZSkgeworCQkJaWYgKG5vZGUgPT09IGFuY2VzdG9yKSB7CisJCQkJX3RoaXMuZGVzZWxlY3Qoc2VsZWN0ZWROb2RlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlub2RlID0gbm9kZS5wYXJlbnQ7CisJCX0KKwl9KTsKK30sIG9uQWZ0ZXJEZXRhY2g6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKwl0aGlzLmRlc2VsZWN0SWZBbmNlc3Rvck1hdGNoKG1lc3NhZ2UuY2hpbGQpOworfSwgc2VsZWN0OmZ1bmN0aW9uIChub2RlKSB7CisJdmFyIGluZGV4ID0gZG9qby5sYW5nLmZpbmQodGhpcy5zZWxlY3RlZE5vZGVzLCBub2RlLCB0cnVlKTsKKwlpZiAoaW5kZXggPj0gMCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuc2VsZWN0ZWROb2Rlcy5wdXNoKG5vZGUpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuc2VsZWN0LCB7bm9kZTpub2RlfSk7Cit9LCBkZXNlbGVjdDpmdW5jdGlvbiAobm9kZSkgeworCXZhciBpbmRleCA9IGRvam8ubGFuZy5maW5kKHRoaXMuc2VsZWN0ZWROb2Rlcywgbm9kZSwgdHJ1ZSk7CisJaWYgKGluZGV4IDwgMCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuc2VsZWN0ZWROb2Rlcy5zcGxpY2UoaW5kZXgsIDEpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuZGVzZWxlY3QsIHtub2RlOm5vZGV9KTsKK30sIGRlc2VsZWN0QWxsOmZ1bmN0aW9uICgpIHsKKwl3aGlsZSAodGhpcy5zZWxlY3RlZE5vZGVzLmxlbmd0aCkgeworCQl0aGlzLmRlc2VsZWN0KHRoaXMuc2VsZWN0ZWROb2Rlc1swXSk7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVUaW1lb3V0SXRlcmF0b3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVUaW1lb3V0SXRlcmF0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjNjliNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZVRpbWVvdXRJdGVyYXRvci5qcwpAQCAtMCwwICsxLDg4IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlVGltZW91dEl0ZXJhdG9yIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmpzb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVDb21tb24iKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuVHJlZVRpbWVvdXRJdGVyYXRvciIsIG51bGwsIGZ1bmN0aW9uIChlbGVtLCBjYWxsRnVuYywgY2FsbE9iaikgeworCXZhciBfdGhpcyA9IHRoaXM7CisJdGhpcy5jdXJyZW50UGFyZW50ID0gZWxlbTsKKwl0aGlzLmNhbGxGdW5jID0gY2FsbEZ1bmM7CisJdGhpcy5jYWxsT2JqID0gY2FsbE9iaiA/IGNhbGxPYmogOiB0aGlzOworCXRoaXMuc3RhY2sgPSBbXTsKK30sIHttYXhTdGFja0RlcHRoOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgc3RhY2s6bnVsbCwgY3VycmVudFBhcmVudDpudWxsLCBjdXJyZW50SW5kZXg6MCwgZmlsdGVyRnVuYzpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRydWU7Cit9LCBmaW5pc2hGdW5jOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30sIHNldEZpbHRlcjpmdW5jdGlvbiAoZnVuYywgb2JqKSB7CisJdGhpcy5maWx0ZXJGdW5jID0gZnVuYzsKKwl0aGlzLmZpbHRlck9iaiA9IG9iajsKK30sIHNldE1heExldmVsOmZ1bmN0aW9uIChsZXZlbCkgeworCXRoaXMubWF4U3RhY2tEZXB0aCA9IGxldmVsIC0gMjsKK30sIGZvcndhcmQ6ZnVuY3Rpb24gKHRpbWVvdXQpIHsKKwl2YXIgX3RoaXMgPSB0aGlzOworCWlmICh0aGlzLnRpbWVvdXQpIHsKKwkJdmFyIHRpZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworCQkJX3RoaXMucHJvY2Vzc05leHQoKTsKKwkJCWNsZWFyVGltZW91dCh0aWQpOworCQl9LCBfdGhpcy50aW1lb3V0KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5wcm9jZXNzTmV4dCgpOworCX0KK30sIHN0YXJ0OmZ1bmN0aW9uIChwcm9jZXNzRmlyc3QpIHsKKwlpZiAocHJvY2Vzc0ZpcnN0KSB7CisJCXJldHVybiB0aGlzLmNhbGxGdW5jLmNhbGwodGhpcy5jYWxsT2JqLCB0aGlzLmN1cnJlbnRQYXJlbnQsIHRoaXMpOworCX0KKwlyZXR1cm4gdGhpcy5wcm9jZXNzTmV4dCgpOworfSwgcHJvY2Vzc05leHQ6ZnVuY3Rpb24gKCkgeworCXZhciBoYW5kbGVyOworCXZhciBfdGhpcyA9IHRoaXM7CisJdmFyIGZvdW5kOworCXZhciBuZXh0OworCWlmICh0aGlzLm1heFN0YWNrRGVwdGggPT0gLTIpIHsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAodHJ1ZSkgeworCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmN1cnJlbnRQYXJlbnQuY2hpbGRyZW47CisJCWlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKKwkJCWRvIHsKKwkJCQluZXh0ID0gY2hpbGRyZW5bdGhpcy5jdXJyZW50SW5kZXhdOworCQkJfSB3aGlsZSAodGhpcy5jdXJyZW50SW5kZXgrKyA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhKGZvdW5kID0gdGhpcy5maWx0ZXJGdW5jLmNhbGwodGhpcy5maWx0ZXJPYmosIG5leHQpKSk7CisJCQlpZiAoZm91bmQpIHsKKwkJCQlpZiAobmV4dC5pc0ZvbGRlciAmJiB0aGlzLnN0YWNrLmxlbmd0aCA8PSB0aGlzLm1heFN0YWNrRGVwdGgpIHsKKwkJCQkJdGhpcy5tb3ZlUGFyZW50KG5leHQsIDApOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5jYWxsRnVuYy5jYWxsKHRoaXMuY2FsbE9iaiwgbmV4dCwgdGhpcyk7CisJCQl9CisJCX0KKwkJaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CisJCQl0aGlzLnBvcFBhcmVudCgpOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiB0aGlzLmZpbmlzaEZ1bmMuY2FsbCh0aGlzLmZpbmlzaE9iaik7Cit9LCBzZXRGaW5pc2g6ZnVuY3Rpb24gKGZ1bmMsIG9iaikgeworCXRoaXMuZmluaXNoRnVuYyA9IGZ1bmM7CisJdGhpcy5maW5pc2hPYmogPSBvYmo7Cit9LCBwb3BQYXJlbnQ6ZnVuY3Rpb24gKCkgeworCXZhciBwID0gdGhpcy5zdGFjay5wb3AoKTsKKwl0aGlzLmN1cnJlbnRQYXJlbnQgPSBwWzBdOworCXRoaXMuY3VycmVudEluZGV4ID0gcFsxXTsKK30sIG1vdmVQYXJlbnQ6ZnVuY3Rpb24gKG5leHRQYXJlbnQsIG5leHRJbmRleCkgeworCXRoaXMuc3RhY2sucHVzaChbdGhpcy5jdXJyZW50UGFyZW50LCB0aGlzLmN1cnJlbnRJbmRleF0pOworCXRoaXMuY3VycmVudFBhcmVudCA9IG5leHRQYXJlbnQ7CisJdGhpcy5jdXJyZW50SW5kZXggPSBuZXh0SW5kZXg7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZVRvZ2dsZU9uU2VsZWN0LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlVG9nZ2xlT25TZWxlY3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMzdmNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVHJlZVRvZ2dsZU9uU2VsZWN0LmpzCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVUb2dnbGVPblNlbGVjdCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVUb2dnbGVPblNlbGVjdCIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHtzZWxlY3RvcjoiIiwgY29udHJvbGxlcjoiIiwgc2VsZWN0RXZlbnQ6InNlbGVjdCIsIGluaXRpYWxpemU6ZnVuY3Rpb24gKCkgeworCXRoaXMuc2VsZWN0b3IgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuc2VsZWN0b3IpOworCXRoaXMuY29udHJvbGxlciA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5jb250cm9sbGVyKTsKKwlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLnNlbGVjdG9yLmV2ZW50TmFtZXNbdGhpcy5zZWxlY3RFdmVudF0sIHRoaXMsICJvblNlbGVjdEV2ZW50Iik7Cit9LCBvblNlbGVjdEV2ZW50OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisJdmFyIG5vZGUgPSBtZXNzYWdlLm5vZGU7CisJbm9kZS5pc0V4cGFuZGVkID8gdGhpcy5jb250cm9sbGVyLmNvbGxhcHNlKG5vZGUpIDogdGhpcy5jb250cm9sbGVyLmV4cGFuZChub2RlKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlVjMuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVWMy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTYwOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlVjMuanMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVWMyIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlV2l0aE5vZGUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVHJlZU5vZGVWMyIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlVjMiLCBbZG9qby53aWRnZXQuSHRtbFdpZGdldCwgZG9qby53aWRnZXQuVHJlZVdpdGhOb2RlXSwgZnVuY3Rpb24gKCkgeworCXRoaXMuZXZlbnROYW1lcyA9IHt9OworCXRoaXMuRG5kQWNjZXB0VHlwZXMgPSBbXTsKKwl0aGlzLmFjdGlvbnNEaXNhYmxlZCA9IFtdOworCXRoaXMubGlzdGVuZXJzID0gW107CisJdGhpcy50cmVlID0gdGhpczsKK30sIHtEbmRNb2RlOiIiLCBkZWZhdWx0Q2hpbGRXaWRnZXQ6bnVsbCwgZGVmYXVsdENoaWxkVGl0bGU6Ik5ldyBOb2RlIiwgZWFnZXJXaWRnZXRJbnN0YW50aWF0aW9uOmZhbHNlLCBldmVudE5hbWVzRGVmYXVsdDp7YWZ0ZXJUcmVlQ3JlYXRlOiJhZnRlclRyZWVDcmVhdGUiLCBiZWZvcmVUcmVlRGVzdHJveToiYmVmb3JlVHJlZURlc3Ryb3kiLCBiZWZvcmVOb2RlRGVzdHJveToiYmVmb3JlTm9kZURlc3Ryb3kiLCBhZnRlckNoYW5nZVRyZWU6ImFmdGVyQ2hhbmdlVHJlZSIsIGFmdGVyU2V0Rm9sZGVyOiJhZnRlclNldEZvbGRlciIsIGFmdGVyVW5zZXRGb2xkZXI6ImFmdGVyVW5zZXRGb2xkZXIiLCBiZWZvcmVNb3ZlRnJvbToiYmVmb3JlTW92ZUZyb20iLCBiZWZvcmVNb3ZlVG86ImJlZm9yZU1vdmVUbyIsIGFmdGVyTW92ZUZyb206ImFmdGVyTW92ZUZyb20iLCBhZnRlck1vdmVUbzoiYWZ0ZXJNb3ZlVG8iLCBhZnRlckFkZENoaWxkOiJhZnRlckFkZENoaWxkIiwgYWZ0ZXJEZXRhY2g6ImFmdGVyRGV0YWNoIiwgYWZ0ZXJFeHBhbmQ6ImFmdGVyRXhwYW5kIiwgYmVmb3JlRXhwYW5kOiJiZWZvcmVFeHBhbmQiLCBhZnRlclNldFRpdGxlOiJhZnRlclNldFRpdGxlIiwgYWZ0ZXJDb2xsYXBzZToiYWZ0ZXJDb2xsYXBzZSIsIGJlZm9yZUNvbGxhcHNlOiJiZWZvcmVDb2xsYXBzZSJ9LCBjbGFzc1ByZWZpeDoiVHJlZSIsIHN0eWxlOiIiLCBhbGxvd0FkZENoaWxkVG9MZWFmOnRydWUsIHVuc2V0Rm9sZGVyT25FbXB0eTp0cnVlLCBEbmRNb2Rlczp7QkVUV0VFTjoxLCBPTlRPOjJ9LCBEbmRBY2NlcHRUeXBlczoiIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii8qIGluZGVudCBmb3IgYWxsIHRyZWUgY2hpbGRyZW4gZXhjZXB0cyByb290ICovXG4uVHJlZU5vZGUge1xuCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2kuZ2lmJyk7XG4JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0O1xuCWJhY2tncm91bmQtcmVwZWF0IDogcmVwZWF0LXk7XG4JbWFyZ2luLWxlZnQ6IDE5cHg7XG4Jem9vbTogMTtcbn1cbi5UcmVlSXNSb290IHtcbgltYXJnaW4tbGVmdDogMDtcbn1cbiBcbi8qIGxlZnQgdmVydGljYWwgbGluZSAoZ3JpZCkgZm9yIGFsbCBub2RlcyAqL1xuLlRyZWVJc0xhc3Qge1xuCWJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvaV9oYWxmLmdpZicpO1xuCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0O1xufVxuIFxuLlRyZWVFeHBhbmRPcGVuIC5UcmVlRXhwYW5kIHtcbgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9taW51cy5naWYnKTtcbn1cbiBcbi8qIGNsb3NlZCBpcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBvcGVuICovXG4uVHJlZUV4cGFuZENsb3NlZCAuVHJlZUV4cGFuZCB7XG4JYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9leHBhbmRfcGx1cy5naWYnKTtcbn1cbiBcbi8qIGhpZ2hlc3QgcHJpb3JpdHkgKi9cbi5UcmVlRXhwYW5kTGVhZiAuVHJlZUV4cGFuZCB7XG4JYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9leHBhbmRfbGVhZi5naWYnKTtcbn1cblxuLyogXG5zaG91bGQgYWx3YXlzIG92ZXJyaWRlIGFueSBleHBhbmQgc2V0dGluZywgYnV0IGRvIG5vdCB0b3VjaCBjaGlsZHJlbi5cbmlmIEkgYWRkIC5UcmVlRXhwYW5kIC5UcmVlRXhwYW5kTG9hZGluZyBzYW1lIHRpbWUgYW5kIHB1dCBpdCB0byB0b3AvYm90dG9tLCB0aGVuIGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgKy0gZm9yIGFsbCBkZXNjZW5kYW50cyBvciBhbHdheXMgZmFpbFxuc28gSSBoYXZlIHRvIHJlbW92ZSBUcmVlRXhwYW5kIGFuZCBwcm9jZXNzIHRoaXMgb25lIHNwZWNpZmljYWxseVxuKi9cblxuLlRyZWVFeHBhbmRMb2FkaW5nICAge1xuCXdpZHRoOiAxOHB4O1xuCWhlaWdodDogMThweDtcbglmbG9hdDogbGVmdDtcbglkaXNwbGF5OiBpbmxpbmU7XG4JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7XG4JYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9leHBhbmRfbG9hZGluZy5naWYnKTtcbn1cbiBcbi5UcmVlQ29udGVudCB7XG4JbWluLWhlaWdodDogMThweDtcbgltaW4td2lkdGg6IDE4cHg7XG4JbWFyZ2luLWxlZnQ6MThweDtcbgljdXJzb3I6IGRlZmF1bHQ7XG4JLyogY2FuJ3QgbWFrZSBpbmxpbmUgLSBtdWx0aWxpbmUgYnVncyAqL1xufVxuXG4uVHJlZUlFQ29udGVudCB7XG5cdGhlaWdodDogMThweDtcbn1cbiBcbi5UcmVlRXhwYW5kIHtcbgl3aWR0aDogMThweDtcbgloZWlnaHQ6IDE4cHg7XG4JZmxvYXQ6IGxlZnQ7XG4JZGlzcGxheTogaW5saW5lO1xuCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0O1xufVxuIFxuLyogc2FtZSBzdHlsZSBhcyBJRSBzZWxlY3Rpb24gKi9cbi5UcmVlTm9kZUVtcGhhc2l6ZWQge1xuCWJhY2tncm91bmQtY29sb3I6IEhpZ2hsaWdodDtcbgljb2xvcjogSGlnaGxpZ2h0VGV4dDtcbn1cbiBcbi5UcmVlQ29udGVudCAuUmljaFRleHRFZGl0YWJsZSwgLlRyZWVDb250ZW50IC5SaWNoVGV4dEVkaXRhYmxlIGlmcmFtZSB7XG4JICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjO1xuCSAgY29sb3I6IGJsYWNrO1xufVxuXG4vKiBkb24ndCB1c2UgOmZvY3VzIGR1ZSB0byBvcGVyYSdzIGxhY2sgb2Ygc3VwcG9ydCBvbiBkaXYncyAqL1xuLlRyZWVMYWJlbEZvY3VzZWQge1xuCSAgb3V0bGluZTogMXB4IGludmVydCBkb3R0ZWQ7XG59XG4iLCB0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvVHJlZVYzLmNzcyIpLCB0ZW1wbGF0ZVN0cmluZzoiPGRpdiBzdHlsZT1cIiR7dGhpcy5zdHlsZX1cIj5cbjwvZGl2PiIsIGlzRXhwYW5kZWQ6dHJ1ZSwgaXNUcmVlOnRydWUsIGNyZWF0ZU5vZGU6ZnVuY3Rpb24gKGRhdGEpIHsKKwlkYXRhLnRyZWUgPSB0aGlzLndpZGdldElkOworCWlmIChkYXRhLndpZGdldE5hbWUpIHsKKwkJcmV0dXJuIGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldChkYXRhLndpZGdldE5hbWUsIGRhdGEpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmRlZmF1bHRDaGlsZFdpZGdldC5wcm90b3R5cGUuY3JlYXRlU2ltcGxlKSB7CisJCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2hpbGRXaWRnZXQucHJvdG90eXBlLmNyZWF0ZVNpbXBsZShkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXZhciBucyA9IHRoaXMuZGVmYXVsdENoaWxkV2lkZ2V0LnByb3RvdHlwZS5uczsKKwkJCXZhciB3dCA9IHRoaXMuZGVmYXVsdENoaWxkV2lkZ2V0LnByb3RvdHlwZS53aWRnZXRUeXBlOworCQkJcmV0dXJuIGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldChucyArICI6IiArIHd0LCBkYXRhKTsKKwkJfQorCX0KK30sIG1ha2VOb2RlVGVtcGxhdGU6ZnVuY3Rpb24gKCkgeworCXZhciBkb21Ob2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZG9qby5odG1sLnNldENsYXNzKGRvbU5vZGUsIHRoaXMuY2xhc3NQcmVmaXggKyAiTm9kZSAiICsgdGhpcy5jbGFzc1ByZWZpeCArICJFeHBhbmRMZWFmICIgKyB0aGlzLmNsYXNzUHJlZml4ICsgIkNoaWxkcmVuTm8iKTsKKwl0aGlzLm5vZGVUZW1wbGF0ZSA9IGRvbU5vZGU7CisJdmFyIGV4cGFuZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl2YXIgY2xhenogPSB0aGlzLmNsYXNzUHJlZml4ICsgIkV4cGFuZCI7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJY2xhenogPSBjbGF6eiArICIgIiArIHRoaXMuY2xhc3NQcmVmaXggKyAiSUVFeHBhbmQiOworCX0KKwlkb2pvLmh0bWwuc2V0Q2xhc3MoZXhwYW5kTm9kZSwgY2xhenopOworCXRoaXMuZXhwYW5kTm9kZVRlbXBsYXRlID0gZXhwYW5kTm9kZTsKKwl2YXIgbGFiZWxOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCWRvam8uaHRtbC5zZXRDbGFzcyhsYWJlbE5vZGUsIHRoaXMuY2xhc3NQcmVmaXggKyAiTGFiZWwiKTsKKwl0aGlzLmxhYmVsTm9kZVRlbXBsYXRlID0gbGFiZWxOb2RlOworCXZhciBjb250ZW50Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXZhciBjbGF6eiA9IHRoaXMuY2xhc3NQcmVmaXggKyAiQ29udGVudCI7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgIWRvam8ucmVuZGVyLmh0bWwuaWU3MCkgeworCQljbGF6eiA9IGNsYXp6ICsgIiAiICsgdGhpcy5jbGFzc1ByZWZpeCArICJJRUNvbnRlbnQiOworCX0KKwlkb2pvLmh0bWwuc2V0Q2xhc3MoY29udGVudE5vZGUsIGNsYXp6KTsKKwl0aGlzLmNvbnRlbnROb2RlVGVtcGxhdGUgPSBjb250ZW50Tm9kZTsKKwlkb21Ob2RlLmFwcGVuZENoaWxkKGV4cGFuZE5vZGUpOworCWRvbU5vZGUuYXBwZW5kQ2hpbGQoY29udGVudE5vZGUpOworCWNvbnRlbnROb2RlLmFwcGVuZENoaWxkKGxhYmVsTm9kZSk7Cit9LCBtYWtlQ29udGFpbmVyTm9kZVRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJZG9qby5odG1sLnNldENsYXNzKGRpdiwgdGhpcy5jbGFzc1ByZWZpeCArICJDb250YWluZXIiKTsKKwl0aGlzLmNvbnRhaW5lck5vZGVUZW1wbGF0ZSA9IGRpdjsKK30sIGFjdGlvbnM6e0FERENISUxEOiJBRERDSElMRCJ9LCBnZXRJbmZvOmZ1bmN0aW9uICgpIHsKKwl2YXIgaW5mbyA9IHt3aWRnZXRJZDp0aGlzLndpZGdldElkLCBvYmplY3RJZDp0aGlzLm9iamVjdElkfTsKKwlyZXR1cm4gaW5mbzsKK30sIGFkanVzdEV2ZW50TmFtZXM6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIG5hbWUgaW4gdGhpcy5ldmVudE5hbWVzRGVmYXVsdCkgeworCQlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKHRoaXMuZXZlbnROYW1lc1tuYW1lXSkpIHsKKwkJCXRoaXMuZXZlbnROYW1lc1tuYW1lXSA9IHRoaXMud2lkZ2V0SWQgKyAiLyIgKyB0aGlzLmV2ZW50TmFtZXNEZWZhdWx0W25hbWVdOworCQl9CisJfQorfSwgYWRqdXN0RG5kTW9kZTpmdW5jdGlvbiAoKSB7CisJdmFyIF90aGlzID0gdGhpczsKKwl2YXIgRG5kTW9kZSA9IDA7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5EbmRNb2RlLnNwbGl0KCI7IiksIGZ1bmN0aW9uIChlbGVtKSB7CisJCXZhciBtb2RlID0gX3RoaXMuRG5kTW9kZXNbZG9qby5zdHJpbmcudHJpbShlbGVtKS50b1VwcGVyQ2FzZSgpXTsKKwkJaWYgKG1vZGUpIHsKKwkJCURuZE1vZGUgPSBEbmRNb2RlIHwgbW9kZTsKKwkJfQorCX0pOworCXRoaXMuRG5kTW9kZSA9IERuZE1vZGU7Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuYmVmb3JlVHJlZURlc3Ryb3ksIHtzb3VyY2U6dGhpc30pOworCXJldHVybiBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzKSB7CisJdGhpcy5kb21Ob2RlLndpZGdldElkID0gdGhpcy53aWRnZXRJZDsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWN0aW9uc0Rpc2FibGVkLmxlbmd0aDsgaSsrKSB7CisJCXRoaXMuYWN0aW9uc0Rpc2FibGVkW2ldID0gdGhpcy5hY3Rpb25zRGlzYWJsZWRbaV0udG9VcHBlckNhc2UoKTsKKwl9CisJaWYgKCFhcmdzLmRlZmF1bHRDaGlsZFdpZGdldCkgeworCQl0aGlzLmRlZmF1bHRDaGlsZFdpZGdldCA9IGRvam8ud2lkZ2V0LlRyZWVOb2RlVjM7CisJfSBlbHNlIHsKKwkJdGhpcy5kZWZhdWx0Q2hpbGRXaWRnZXQgPSBkb2pvLmxhbmcuZ2V0T2JqUGF0aFZhbHVlKGFyZ3MuZGVmYXVsdENoaWxkV2lkZ2V0KTsKKwl9CisJdGhpcy5hZGp1c3RFdmVudE5hbWVzKCk7CisJdGhpcy5hZGp1c3REbmRNb2RlKCk7CisJdGhpcy5tYWtlTm9kZVRlbXBsYXRlKCk7CisJdGhpcy5tYWtlQ29udGFpbmVyTm9kZVRlbXBsYXRlKCk7CisJdGhpcy5jb250YWluZXJOb2RlID0gdGhpcy5kb21Ob2RlOworCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmRvbU5vZGUsIHRoaXMuY2xhc3NQcmVmaXggKyAiQ29udGFpbmVyIik7CisJdmFyIF90aGlzID0gdGhpczsKKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmxpc3RlbmVycywgZnVuY3Rpb24gKGVsZW0pIHsKKwkJdmFyIHQgPSBkb2pvLmxhbmcuaXNTdHJpbmcoZWxlbSkgPyBkb2pvLndpZGdldC5ieUlkKGVsZW0pIDogZWxlbTsKKwkJdC5saXN0ZW5UcmVlKF90aGlzKTsKKwl9KTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuYWZ0ZXJUcmVlQ3JlYXRlLCB7c291cmNlOnRoaXN9KTsKK30sIG1vdmU6ZnVuY3Rpb24gKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJaWYgKCFjaGlsZC5wYXJlbnQpIHsKKwkJZG9qby5yYWlzZSh0aGlzLndpZGdldFR5cGUgKyAiOiBjaGlsZCBjYW4gYmUgbW92ZWQgb25seSB3aGlsZSBpdCdzIGF0dGFjaGVkIik7CisJfQorCXZhciBvbGRQYXJlbnQgPSBjaGlsZC5wYXJlbnQ7CisJdmFyIG9sZFRyZWUgPSBjaGlsZC50cmVlOworCXZhciBvbGRJbmRleCA9IGNoaWxkLmdldFBhcmVudEluZGV4KCk7CisJdmFyIG5ld1RyZWUgPSBuZXdQYXJlbnQudHJlZTsKKwl2YXIgbmV3UGFyZW50ID0gbmV3UGFyZW50OworCXZhciBuZXdJbmRleCA9IGluZGV4OworCXZhciBtZXNzYWdlID0ge29sZFBhcmVudDpvbGRQYXJlbnQsIG9sZFRyZWU6b2xkVHJlZSwgb2xkSW5kZXg6b2xkSW5kZXgsIG5ld1BhcmVudDpuZXdQYXJlbnQsIG5ld1RyZWU6bmV3VHJlZSwgbmV3SW5kZXg6bmV3SW5kZXgsIGNoaWxkOmNoaWxkfTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2gob2xkVHJlZS5ldmVudE5hbWVzLmJlZm9yZU1vdmVGcm9tLCBtZXNzYWdlKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2gobmV3VHJlZS5ldmVudE5hbWVzLmJlZm9yZU1vdmVUbywgbWVzc2FnZSk7CisJdGhpcy5kb01vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2gob2xkVHJlZS5ldmVudE5hbWVzLmFmdGVyTW92ZUZyb20sIG1lc3NhZ2UpOworCWRvam8uZXZlbnQudG9waWMucHVibGlzaChuZXdUcmVlLmV2ZW50TmFtZXMuYWZ0ZXJNb3ZlVG8sIG1lc3NhZ2UpOworfSwgZG9Nb3ZlOmZ1bmN0aW9uIChjaGlsZCwgbmV3UGFyZW50LCBpbmRleCkgeworCWNoaWxkLmRvRGV0YWNoKCk7CisJbmV3UGFyZW50LmRvQWRkQ2hpbGQoY2hpbGQsIGluZGV4KTsKK30sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIlsiICsgdGhpcy53aWRnZXRUeXBlICsgIiBJRDoiICsgdGhpcy53aWRnZXRJZCArICJdIjsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlV2l0aE5vZGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1RyZWVXaXRoTm9kZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EwZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9UcmVlV2l0aE5vZGUuanMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVXaXRoTm9kZSIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5UcmVlV2l0aE5vZGUiLCBudWxsLCBmdW5jdGlvbiAoKSB7Cit9LCB7bG9hZFN0YXRlczp7VU5DSEVDS0VEOiJVTkNIRUNLRUQiLCBMT0FESU5HOiJMT0FESU5HIiwgTE9BREVEOiJMT0FERUQifSwgc3RhdGU6IlVOQ0hFQ0tFRCIsIG9iamVjdElkOiIiLCBpc0NvbnRhaW5lcjp0cnVlLCBsb2NrTGV2ZWw6MCwgbG9jazpmdW5jdGlvbiAoKSB7CisJdGhpcy5sb2NrTGV2ZWwrKzsKK30sIHVubG9jazpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLmxvY2tMZXZlbCkgeworCQlkb2pvLnJhaXNlKHRoaXMud2lkZ2V0VHlwZSArICIgdW5sb2NrOiBub3QgbG9ja2VkIik7CisJfQorCXRoaXMubG9ja0xldmVsLS07Cit9LCBleHBhbmRMZXZlbDowLCBsb2FkTGV2ZWw6MCwgaGFzTG9jazpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMubG9ja0xldmVsID4gMDsKK30sIGlzTG9ja2VkOmZ1bmN0aW9uICgpIHsKKwl2YXIgbm9kZSA9IHRoaXM7CisJd2hpbGUgKHRydWUpIHsKKwkJaWYgKG5vZGUubG9ja0xldmVsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoIW5vZGUucGFyZW50IHx8IG5vZGUuaXNUcmVlKSB7CisJCQlicmVhazsKKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnQ7CisJfQorCXJldHVybiBmYWxzZTsKK30sIGZsdXNoTG9jazpmdW5jdGlvbiAoKSB7CisJdGhpcy5sb2NrTGV2ZWwgPSAwOworfSwgYWN0aW9uSXNEaXNhYmxlZDpmdW5jdGlvbiAoYWN0aW9uKSB7CisJdmFyIGRpc2FibGVkID0gZmFsc2U7CisJaWYgKGRvam8ubGFuZy5pbkFycmF5KHRoaXMuYWN0aW9uc0Rpc2FibGVkLCBhY3Rpb24pKSB7CisJCWRpc2FibGVkID0gdHJ1ZTsKKwl9CisJaWYgKHRoaXMuaXNUcmVlTm9kZSkgeworCQlpZiAoIXRoaXMudHJlZS5hbGxvd0FkZENoaWxkVG9MZWFmICYmIGFjdGlvbiA9PSB0aGlzLmFjdGlvbnMuQUREQ0hJTEQgJiYgIXRoaXMuaXNGb2xkZXIpIHsKKwkJCWRpc2FibGVkID0gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZGlzYWJsZWQ7Cit9LCBhY3Rpb25Jc0Rpc2FibGVkTm93OmZ1bmN0aW9uIChhY3Rpb24pIHsKKwlyZXR1cm4gdGhpcy5hY3Rpb25Jc0Rpc2FibGVkKGFjdGlvbikgfHwgdGhpcy5pc0xvY2tlZCgpOworfSwgc2V0Q2hpbGRyZW46ZnVuY3Rpb24gKGNoaWxkcmVuQXJyYXkpIHsKKwlpZiAodGhpcy5pc1RyZWVOb2RlICYmICF0aGlzLmlzRm9sZGVyKSB7CisJCXRoaXMuc2V0Rm9sZGVyKCk7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuaXNUcmVlTm9kZSkgeworCQkJdGhpcy5zdGF0ZSA9IHRoaXMubG9hZFN0YXRlcy5MT0FERUQ7CisJCX0KKwl9CisJdmFyIGhhZENoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwOworCWlmIChoYWRDaGlsZHJlbiAmJiBjaGlsZHJlbkFycmF5KSB7CisJCXRoaXMuZGVzdHJveUNoaWxkcmVuKCk7CisJfQorCWlmIChjaGlsZHJlbkFycmF5KSB7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbkFycmF5OworCX0KKwl2YXIgaGFzQ2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDA7CisJaWYgKHRoaXMuaXNUcmVlTm9kZSAmJiBoYXNDaGlsZHJlbiAhPSBoYWRDaGlsZHJlbikgeworCQl0aGlzLnZpZXdTZXRIYXNDaGlsZHJlbigpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBkb2pvLndpZGdldC5XaWRnZXQpKSB7CisJCQljaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0gPSB0aGlzLnRyZWUuY3JlYXRlTm9kZShjaGlsZCk7CisJCQl2YXIgY2hpbGRXaWRnZXRDcmVhdGVkID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXZhciBjaGlsZFdpZGdldENyZWF0ZWQgPSBmYWxzZTsKKwkJfQorCQlpZiAoIWNoaWxkLnBhcmVudCkgeworCQkJY2hpbGQucGFyZW50ID0gdGhpczsKKwkJCWlmICh0aGlzLnRyZWUgIT09IGNoaWxkLnRyZWUpIHsKKwkJCQljaGlsZC51cGRhdGVUcmVlKHRoaXMudHJlZSk7CisJCQl9CisJCQljaGlsZC52aWV3QWRkTGF5b3V0KCk7CisJCQl0aGlzLmNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQuZG9tTm9kZSk7CisJCQl2YXIgbWVzc2FnZSA9IHtjaGlsZDpjaGlsZCwgaW5kZXg6aSwgcGFyZW50OnRoaXMsIGNoaWxkV2lkZ2V0Q3JlYXRlZDpjaGlsZFdpZGdldENyZWF0ZWR9OworCQkJZGVsZXRlIGRvam8ud2lkZ2V0Lm1hbmFnZXIudG9wV2lkZ2V0c1tjaGlsZC53aWRnZXRJZF07CisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuYWZ0ZXJBZGRDaGlsZCwgbWVzc2FnZSk7CisJCX0KKwkJaWYgKHRoaXMudHJlZS5lYWdlcldpZGdldEluc3RhbnRpYXRpb24pIHsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgeworCQkJCWNoaWxkLnNldENoaWxkcmVuKCk7CisJCQl9KTsKKwkJfQorCX0KK30sIGRvQWRkQ2hpbGQ6ZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkgeworCXJldHVybiB0aGlzLmFkZENoaWxkKGNoaWxkLCBpbmRleCwgdHJ1ZSk7Cit9LCBhZGRDaGlsZDpmdW5jdGlvbiAoY2hpbGQsIGluZGV4LCBkb250UHVibGlzaEV2ZW50KSB7CisJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChpbmRleCkpIHsKKwkJaW5kZXggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKKwl9CisJaWYgKCFjaGlsZC5pc1RyZWVOb2RlKSB7CisJCWRvam8ucmFpc2UoIllvdSBjYW4gb25seSBhZGQgVHJlZU5vZGUgd2lkZ2V0cyB0byBhICIgKyB0aGlzLndpZGdldFR5cGUgKyAiIHdpZGdldCEiKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgY2hpbGQpOworCWNoaWxkLnBhcmVudCA9IHRoaXM7CisJY2hpbGQuYWRkZWRUbyh0aGlzLCBpbmRleCwgZG9udFB1Ymxpc2hFdmVudCk7CisJZGVsZXRlIGRvam8ud2lkZ2V0Lm1hbmFnZXIudG9wV2lkZ2V0c1tjaGlsZC53aWRnZXRJZF07Cit9LCBvblNob3c6ZnVuY3Rpb24gKCkgeworCXRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlOworfSwgb25IaWRlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Vc1RleHRib3guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1VzVGV4dGJveC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzg5ZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9Vc1RleHRib3guanMKQEAgLTAsMCArMSwzNiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVXNUZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlZhbGlkYXRpb25UZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8udmFsaWRhdGUudXMiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVXNTdGF0ZVRleHRib3giLCBkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCwge21peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzKSB7CisJZG9qby53aWRnZXQuVXNTdGF0ZVRleHRib3guc3VwZXJjbGFzcy5taXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwlpZiAobG9jYWxQcm9wZXJ0aWVzLmFsbG93dGVycml0b3JpZXMpIHsKKwkJdGhpcy5mbGFncy5hbGxvd1RlcnJpdG9yaWVzID0gKGxvY2FsUHJvcGVydGllcy5hbGxvd3RlcnJpdG9yaWVzID09ICJ0cnVlIik7CisJfQorCWlmIChsb2NhbFByb3BlcnRpZXMuYWxsb3dtaWxpdGFyeSkgeworCQl0aGlzLmZsYWdzLmFsbG93TWlsaXRhcnkgPSAobG9jYWxQcm9wZXJ0aWVzLmFsbG93bWlsaXRhcnkgPT0gInRydWUiKTsKKwl9Cit9LCBpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS51cy5pc1N0YXRlKHRoaXMudGV4dGJveC52YWx1ZSwgdGhpcy5mbGFncyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlVzWmlwVGV4dGJveCIsIGRvam8ud2lkZ2V0LlZhbGlkYXRpb25UZXh0Ym94LCB7aXNWYWxpZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIGRvam8udmFsaWRhdGUudXMuaXNaaXBDb2RlKHRoaXMudGV4dGJveC52YWx1ZSk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlVzU29jaWFsU2VjdXJpdHlOdW1iZXJUZXh0Ym94IiwgZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3gsIHtpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS51cy5pc1NvY2lhbFNlY3VyaXR5TnVtYmVyKHRoaXMudGV4dGJveC52YWx1ZSk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlVzUGhvbmVOdW1iZXJUZXh0Ym94IiwgZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3gsIHtpc1ZhbGlkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZG9qby52YWxpZGF0ZS51cy5pc1Bob25lTnVtYmVyKHRoaXMudGV4dGJveC52YWx1ZSk7Cit9fSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvVmFsaWRhdGlvblRleHRib3guanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1ZhbGlkYXRpb25UZXh0Ym94LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzkyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1ZhbGlkYXRpb25UZXh0Ym94LmpzCkBAIC0wLDAgKzEsMTI0IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UZXh0Ym94Iik7Citkb2pvLnJlcXVpcmUoImRvam8uaTE4bi5jb21tb24iKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3giLCBkb2pvLndpZGdldC5UZXh0Ym94LCBmdW5jdGlvbiAoKSB7CisJdGhpcy5mbGFncyA9IHt9OworfSwge3JlcXVpcmVkOmZhbHNlLCByYW5nZUNsYXNzOiJyYW5nZSIsIGludmFsaWRDbGFzczoiaW52YWxpZCIsIG1pc3NpbmdDbGFzczoibWlzc2luZyIsIGNsYXNzUHJlZml4OiJkb2pvVmFsaWRhdGUiLCBzaXplOiIiLCBtYXhsZW5ndGg6IiIsIHByb21wdE1lc3NhZ2U6IiIsIGludmFsaWRNZXNzYWdlOiIiLCBtaXNzaW5nTWVzc2FnZToiIiwgcmFuZ2VNZXNzYWdlOiIiLCBsaXN0ZW5PbktleVByZXNzOnRydWUsIGh0bWxmbG9hdDoibm9uZSIsIGxhc3RDaGVja2VkVmFsdWU6bnVsbCwgdGVtcGxhdGVTdHJpbmc6IjxzcGFuIHN0eWxlPSdmbG9hdDoke3RoaXMuaHRtbGZsb2F0fTsnPlxuXHQ8aW5wdXQgZG9qb0F0dGFjaFBvaW50PSd0ZXh0Ym94JyB0eXBlPScke3RoaXMudHlwZX0nIGRvam9BdHRhY2hFdmVudD0nb25ibHVyO29uZm9jdXM7b25rZXl1cCdcblx0XHRpZD0nJHt0aGlzLndpZGdldElkfScgbmFtZT0nJHt0aGlzLm5hbWV9JyBzaXplPScke3RoaXMuc2l6ZX0nIG1heGxlbmd0aD0nJHt0aGlzLm1heGxlbmd0aH0nXG5cdFx0Y2xhc3M9JyR7dGhpcy5jbGFzc05hbWV9JyBzdHlsZT0nJz5cblx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PSdpbnZhbGlkU3BhbicgY2xhc3M9JyR7dGhpcy5pbnZhbGlkQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMuaW52YWxpZE1lc3NhZ2V9PC9zcGFuPlxuXHQ8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J21pc3NpbmdTcGFuJyBjbGFzcz0nJHt0aGlzLm1pc3NpbmdDbGFzc30nPiR7dGhpcy5tZXNzYWdlcy5taXNzaW5nTWVzc2FnZX08L3NwYW4+XG5cdDxzcGFuIGRvam9BdHRhY2hQb2ludD0ncmFuZ2VTcGFuJyBjbGFzcz0nJHt0aGlzLnJhbmdlQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMucmFuZ2VNZXNzYWdlfTwvc3Bhbj5cbjwvc3Bhbj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZG9qb1ZhbGlkYXRlRW1wdHl7XG5cdGJhY2tncm91bmQtY29sb3I6ICMwMEZGRkY7XG59XG4uZG9qb1ZhbGlkYXRlVmFsaWR7XG5cdGJhY2tncm91bmQtY29sb3I6ICNjZmM7XG59XG4uZG9qb1ZhbGlkYXRlSW52YWxpZHtcblx0YmFja2dyb3VuZC1jb2xvcjogI2ZjYztcbn1cbi5kb2pvVmFsaWRhdGVSYW5nZXtcblx0YmFja2dyb3VuZC1jb2xvcjogI2NjZjtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9WYWxpZGF0ZS5jc3MiKSwgaW52YWxpZFNwYW46bnVsbCwgbWlzc2luZ1NwYW46bnVsbCwgcmFuZ2VTcGFuOm51bGwsIGdldFZhbHVlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcy50ZXh0Ym94LnZhbHVlOworfSwgc2V0VmFsdWU6ZnVuY3Rpb24gKHZhbHVlKSB7CisJdGhpcy50ZXh0Ym94LnZhbHVlID0gdmFsdWU7CisJdGhpcy51cGRhdGUoKTsKK30sIGlzVmFsaWQ6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0cnVlOworfSwgaXNJblJhbmdlOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30sIGlzRW1wdHk6ZnVuY3Rpb24gKCkgeworCXJldHVybiAoL15ccyokLy50ZXN0KHRoaXMudGV4dGJveC52YWx1ZSkpOworfSwgaXNNaXNzaW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gKHRoaXMucmVxdWlyZWQgJiYgdGhpcy5pc0VtcHR5KCkpOworfSwgdXBkYXRlOmZ1bmN0aW9uICgpIHsKKwl0aGlzLmxhc3RDaGVja2VkVmFsdWUgPSB0aGlzLnRleHRib3gudmFsdWU7CisJdGhpcy5taXNzaW5nU3Bhbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXRoaXMuaW52YWxpZFNwYW4uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0aGlzLnJhbmdlU3Bhbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCXZhciBlbXB0eSA9IHRoaXMuaXNFbXB0eSgpOworCXZhciB2YWxpZCA9IHRydWU7CisJaWYgKHRoaXMucHJvbXB0TWVzc2FnZSAhPSB0aGlzLnRleHRib3gudmFsdWUpIHsKKwkJdmFsaWQgPSB0aGlzLmlzVmFsaWQoKTsKKwl9CisJdmFyIG1pc3NpbmcgPSB0aGlzLmlzTWlzc2luZygpOworCWlmIChtaXNzaW5nKSB7CisJCXRoaXMubWlzc2luZ1NwYW4uc3R5bGUuZGlzcGxheSA9ICIiOworCX0gZWxzZSB7CisJCWlmICghZW1wdHkgJiYgIXZhbGlkKSB7CisJCQl0aGlzLmludmFsaWRTcGFuLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJfSBlbHNlIHsKKwkJCWlmICghZW1wdHkgJiYgIXRoaXMuaXNJblJhbmdlKCkpIHsKKwkJCQl0aGlzLnJhbmdlU3Bhbi5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQl9CisJCX0KKwl9CisJdGhpcy5oaWdobGlnaHQoKTsKK30sIHVwZGF0ZUNsYXNzOmZ1bmN0aW9uIChjbGFzc05hbWUpIHsKKwl2YXIgcHJlID0gdGhpcy5jbGFzc1ByZWZpeDsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy50ZXh0Ym94LCBwcmUgKyAiRW1wdHkiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy50ZXh0Ym94LCBwcmUgKyAiVmFsaWQiKTsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy50ZXh0Ym94LCBwcmUgKyAiSW52YWxpZCIpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLnRleHRib3gsIHByZSArIGNsYXNzTmFtZSk7Cit9LCBoaWdobGlnaHQ6ZnVuY3Rpb24gKCkgeworCWlmICh0aGlzLmlzRW1wdHkoKSkgeworCQl0aGlzLnVwZGF0ZUNsYXNzKCJFbXB0eSIpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLmlzVmFsaWQoKSAmJiB0aGlzLmlzSW5SYW5nZSgpKSB7CisJCQl0aGlzLnVwZGF0ZUNsYXNzKCJWYWxpZCIpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMudGV4dGJveC52YWx1ZSAhPSB0aGlzLnByb21wdE1lc3NhZ2UpIHsKKwkJCQl0aGlzLnVwZGF0ZUNsYXNzKCJJbnZhbGlkIik7CisJCQl9IGVsc2UgeworCQkJCXRoaXMudXBkYXRlQ2xhc3MoIkVtcHR5Iik7CisJCQl9CisJCX0KKwl9Cit9LCBvbmZvY3VzOmZ1bmN0aW9uIChldnQpIHsKKwlpZiAoIXRoaXMubGlzdGVuT25LZXlQcmVzcykgeworCQl0aGlzLnVwZGF0ZUNsYXNzKCJFbXB0eSIpOworCX0KK30sIG9uYmx1cjpmdW5jdGlvbiAoZXZ0KSB7CisJdGhpcy5maWx0ZXIoKTsKKwl0aGlzLnVwZGF0ZSgpOworfSwgb25rZXl1cDpmdW5jdGlvbiAoZXZ0KSB7CisJaWYgKHRoaXMubGlzdGVuT25LZXlQcmVzcykgeworCQl0aGlzLnVwZGF0ZSgpOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnRleHRib3gudmFsdWUgIT0gdGhpcy5sYXN0Q2hlY2tlZFZhbHVlKSB7CisJCQl0aGlzLnVwZGF0ZUNsYXNzKCJFbXB0eSIpOworCQl9CisJfQorfSwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAobG9jYWxQcm9wZXJ0aWVzLCBmcmFnKSB7CisJZG9qby53aWRnZXQuVmFsaWRhdGlvblRleHRib3guc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5tZXNzYWdlcyA9IGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oImRvam8ud2lkZ2V0IiwgInZhbGlkYXRlIiwgdGhpcy5sYW5nKTsKKwlkb2pvLmxhbmcuZm9yRWFjaChbImludmFsaWRNZXNzYWdlIiwgIm1pc3NpbmdNZXNzYWdlIiwgInJhbmdlTWVzc2FnZSJdLCBmdW5jdGlvbiAocHJvcCkgeworCQlpZiAodGhpc1twcm9wXSkgeworCQkJdGhpcy5tZXNzYWdlc1twcm9wXSA9IHRoaXNbcHJvcF07CisJCX0KKwl9LCB0aGlzKTsKK30sIGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLndpZGdldC5WYWxpZGF0aW9uVGV4dGJveC5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy50ZXh0Ym94LmlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuaXNWYWxpZC5jYWxsKHRoaXMpOworCX07CisJdGhpcy50ZXh0Ym94LmlzTWlzc2luZyA9IGZ1bmN0aW9uICgpIHsKKwkJdGhpcy5pc01pc3NpbmcuY2FsbCh0aGlzKTsKKwl9OworCXRoaXMudGV4dGJveC5pc0luUmFuZ2UgPSBmdW5jdGlvbiAoKSB7CisJCXRoaXMuaXNJblJhbmdlLmNhbGwodGhpcyk7CisJfTsKKwlkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5pbnZhbGlkU3BhbiwgdGhpcy5pbnZhbGlkQ2xhc3MpOworCXRoaXMudXBkYXRlKCk7CisJdGhpcy5maWx0ZXIoKTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAiaWUiKTsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwubW96KSB7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsICJtb3oiKTsKKwl9CisJaWYgKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpIHsKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgIm9wZXJhIik7CisJfQorCWlmIChkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkgeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCAic2FmYXJpIik7CisJfQorfX0pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1dpZGdldC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvV2lkZ2V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODNlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1dpZGdldC5qcwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5mdW5jIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5hcnJheSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuZXh0cmFzIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLnJlcXVpcmUoImRvam8ubnMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuTWFuYWdlciIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5hMTF5Iik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LldpZGdldCIsIG51bGwsIGZ1bmN0aW9uICgpIHsKKwl0aGlzLmNoaWxkcmVuID0gW107CisJdGhpcy5leHRyYUFyZ3MgPSB7fTsKK30sIHtwYXJlbnQ6bnVsbCwgaXNUb3BMZXZlbDpmYWxzZSwgZGlzYWJsZWQ6ZmFsc2UsIGlzQ29udGFpbmVyOmZhbHNlLCB3aWRnZXRJZDoiIiwgd2lkZ2V0VHlwZToiV2lkZ2V0IiwgbnM6ImRvam8iLCBnZXROYW1lc3BhY2VkVHlwZTpmdW5jdGlvbiAoKSB7CisJcmV0dXJuICh0aGlzLm5zID8gdGhpcy5ucyArICI6IiArIHRoaXMud2lkZ2V0VHlwZSA6IHRoaXMud2lkZ2V0VHlwZSkudG9Mb3dlckNhc2UoKTsKK30sIHRvU3RyaW5nOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gIltXaWRnZXQgIiArIHRoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKSArICIsICIgKyAodGhpcy53aWRnZXRJZCB8fCAiTk8gSUQiKSArICJdIjsKK30sIHJlcHI6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLnRvU3RyaW5nKCk7Cit9LCBlbmFibGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKK30sIGRpc2FibGU6ZnVuY3Rpb24gKCkgeworCXRoaXMuZGlzYWJsZWQgPSB0cnVlOworfSwgb25SZXNpemVkOmZ1bmN0aW9uICgpIHsKKwl0aGlzLm5vdGlmeUNoaWxkcmVuT2ZSZXNpemUoKTsKK30sIG5vdGlmeUNoaWxkcmVuT2ZSZXNpemU6ZnVuY3Rpb24gKCkgeworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQub25SZXNpemVkKSB7CisJCQljaGlsZC5vblJlc2l6ZWQoKTsKKwkJfQorCX0KK30sIGNyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZ21lbnQsIHBhcmVudCwgbnMpIHsKKwlpZiAobnMpIHsKKwkJdGhpcy5ucyA9IG5zOworCX0KKwl0aGlzLnNhdGlzZnlQcm9wZXJ0eVNldHMoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJdGhpcy5taXhJblByb3BlcnRpZXMoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJdGhpcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzKGFyZ3MsIGZyYWdtZW50LCBwYXJlbnQpOworCWRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkKHRoaXMpOworCXRoaXMuYnVpbGRSZW5kZXJpbmcoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJdGhpcy5pbml0aWFsaXplKGFyZ3MsIGZyYWdtZW50LCBwYXJlbnQpOworCXRoaXMucG9zdEluaXRpYWxpemUoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJdGhpcy5wb3N0Q3JlYXRlKGFyZ3MsIGZyYWdtZW50LCBwYXJlbnQpOworCXJldHVybiB0aGlzOworfSwgZGVzdHJveTpmdW5jdGlvbiAoZmluYWxpemUpIHsKKwlpZiAodGhpcy5wYXJlbnQpIHsKKwkJdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CisJfQorCXRoaXMuZGVzdHJveUNoaWxkcmVuKCk7CisJdGhpcy51bmluaXRpYWxpemUoKTsKKwl0aGlzLmRlc3Ryb3lSZW5kZXJpbmcoZmluYWxpemUpOworCWRvam8ud2lkZ2V0Lm1hbmFnZXIucmVtb3ZlQnlJZCh0aGlzLndpZGdldElkKTsKK30sIGRlc3Ryb3lDaGlsZHJlbjpmdW5jdGlvbiAoKSB7CisJdmFyIHdpZGdldDsKKwl2YXIgaSA9IDA7CisJd2hpbGUgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gaSkgeworCQl3aWRnZXQgPSB0aGlzLmNoaWxkcmVuW2ldOworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgZG9qby53aWRnZXQuV2lkZ2V0KSB7CisJCQl0aGlzLnJlbW92ZUNoaWxkKHdpZGdldCk7CisJCQl3aWRnZXQuZGVzdHJveSgpOworCQkJY29udGludWU7CisJCX0KKwkJaSsrOworCX0KK30sIGdldENoaWxkcmVuT2ZUeXBlOmZ1bmN0aW9uICh0eXBlLCByZWN1cnNlKSB7CisJdmFyIHJldCA9IFtdOworCXZhciBpc0Z1bmMgPSBkb2pvLmxhbmcuaXNGdW5jdGlvbih0eXBlKTsKKwlpZiAoIWlzRnVuYykgeworCQl0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworCX0KKwlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyB4KyspIHsKKwkJaWYgKGlzRnVuYykgeworCQkJaWYgKHRoaXMuY2hpbGRyZW5beF0gaW5zdGFuY2VvZiB0eXBlKSB7CisJCQkJcmV0LnB1c2godGhpcy5jaGlsZHJlblt4XSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5jaGlsZHJlblt4XS53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCkgPT0gdHlwZSkgeworCQkJCXJldC5wdXNoKHRoaXMuY2hpbGRyZW5beF0pOworCQkJfQorCQl9CisJCWlmIChyZWN1cnNlKSB7CisJCQlyZXQgPSByZXQuY29uY2F0KHRoaXMuY2hpbGRyZW5beF0uZ2V0Q2hpbGRyZW5PZlR5cGUodHlwZSwgcmVjdXJzZSkpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9LCBnZXREZXNjZW5kYW50czpmdW5jdGlvbiAoKSB7CisJdmFyIHJlc3VsdCA9IFtdOworCXZhciBzdGFjayA9IFt0aGlzXTsKKwl2YXIgZWxlbTsKKwl3aGlsZSAoKGVsZW0gPSBzdGFjay5wb3AoKSkpIHsKKwkJcmVzdWx0LnB1c2goZWxlbSk7CisJCWlmIChlbGVtLmNoaWxkcmVuKSB7CisJCQlkb2pvLmxhbmcuZm9yRWFjaChlbGVtLmNoaWxkcmVuLCBmdW5jdGlvbiAoZWxlbSkgeworCQkJCXN0YWNrLnB1c2goZWxlbSk7CisJCQl9KTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfSwgaXNGaXJzdENoaWxkOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gdGhpcyA9PT0gdGhpcy5wYXJlbnQuY2hpbGRyZW5bMF07Cit9LCBpc0xhc3RDaGlsZDpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMgPT09IHRoaXMucGFyZW50LmNoaWxkcmVuW3RoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDFdOworfSwgc2F0aXNmeVByb3BlcnR5U2V0czpmdW5jdGlvbiAoYXJncykgeworCXJldHVybiBhcmdzOworfSwgbWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uIChhcmdzLCBmcmFnKSB7CisJaWYgKChhcmdzWyJmYXN0TWl4SW4iXSkgfHwgKGZyYWdbImZhc3RNaXhJbiJdKSkgeworCQlmb3IgKHZhciB4IGluIGFyZ3MpIHsKKwkJCXRoaXNbeF0gPSBhcmdzW3hdOworCQl9CisJCXJldHVybjsKKwl9CisJdmFyIHVuZGVmOworCXZhciBsY0FyZ3MgPSBkb2pvLndpZGdldC5sY0FyZ3NDYWNoZVt0aGlzLndpZGdldFR5cGVdOworCWlmIChsY0FyZ3MgPT0gbnVsbCkgeworCQlsY0FyZ3MgPSB7fTsKKwkJZm9yICh2YXIgeSBpbiB0aGlzKSB7CisJCQlsY0FyZ3NbKChuZXcgU3RyaW5nKHkpKS50b0xvd2VyQ2FzZSgpKV0gPSB5OworCQl9CisJCWRvam8ud2lkZ2V0LmxjQXJnc0NhY2hlW3RoaXMud2lkZ2V0VHlwZV0gPSBsY0FyZ3M7CisJfQorCXZhciB2aXNpdGVkID0ge307CisJZm9yICh2YXIgeCBpbiBhcmdzKSB7CisJCWlmICghdGhpc1t4XSkgeworCQkJdmFyIHkgPSBsY0FyZ3NbKG5ldyBTdHJpbmcoeCkpLnRvTG93ZXJDYXNlKCldOworCQkJaWYgKHkpIHsKKwkJCQlhcmdzW3ldID0gYXJnc1t4XTsKKwkJCQl4ID0geTsKKwkJCX0KKwkJfQorCQlpZiAodmlzaXRlZFt4XSkgeworCQkJY29udGludWU7CisJCX0KKwkJdmlzaXRlZFt4XSA9IHRydWU7CisJCWlmICgodHlwZW9mIHRoaXNbeF0pICE9ICh0eXBlb2YgdW5kZWYpKSB7CisJCQlpZiAodHlwZW9mIGFyZ3NbeF0gIT0gInN0cmluZyIpIHsKKwkJCQl0aGlzW3hdID0gYXJnc1t4XTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyh0aGlzW3hdKSkgeworCQkJCQl0aGlzW3hdID0gYXJnc1t4XTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZG9qby5sYW5nLmlzTnVtYmVyKHRoaXNbeF0pKSB7CisJCQkJCQl0aGlzW3hdID0gbmV3IE51bWJlcihhcmdzW3hdKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChkb2pvLmxhbmcuaXNCb29sZWFuKHRoaXNbeF0pKSB7CisJCQkJCQkJdGhpc1t4XSA9IChhcmdzW3hdLnRvTG93ZXJDYXNlKCkgPT0gImZhbHNlIikgPyBmYWxzZSA6IHRydWU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzW3hdKSkgeworCQkJCQkJCQlpZiAoYXJnc1t4XS5zZWFyY2goL1teXHdcLl0rL2kpID09IC0xKSB7CisJCQkJCQkJCQl0aGlzW3hdID0gZG9qby5ldmFsT2JqUGF0aChhcmdzW3hdLCBmYWxzZSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl2YXIgdG4gPSBkb2pvLmxhbmcubmFtZUFub25GdW5jKG5ldyBGdW5jdGlvbihhcmdzW3hdKSwgdGhpcyk7CisJCQkJCQkJCQlkb2pvLmV2ZW50Lmt3Q29ubmVjdCh7c3JjT2JqOnRoaXMsIHNyY0Z1bmM6eCwgYWR2aWNlT2JqOnRoaXMsIGFkdmljZUZ1bmM6dG59KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmIChkb2pvLmxhbmcuaXNBcnJheSh0aGlzW3hdKSkgeworCQkJCQkJCQkJdGhpc1t4XSA9IGFyZ3NbeF0uc3BsaXQoIjsiKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmICh0aGlzW3hdIGluc3RhbmNlb2YgRGF0ZSkgeworCQkJCQkJCQkJCXRoaXNbeF0gPSBuZXcgRGF0ZShOdW1iZXIoYXJnc1t4XSkpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpZiAodHlwZW9mIHRoaXNbeF0gPT0gIm9iamVjdCIpIHsKKwkJCQkJCQkJCQkJaWYgKHRoaXNbeF0gaW5zdGFuY2VvZiBkb2pvLnVyaS5VcmkpIHsKKwkJCQkJCQkJCQkJCXRoaXNbeF0gPSBkb2pvLnVyaS5kb2pvVXJpKGFyZ3NbeF0pOworCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJdmFyIHBhaXJzID0gYXJnc1t4XS5zcGxpdCgiOyIpOworCQkJCQkJCQkJCQkJZm9yICh2YXIgeSA9IDA7IHkgPCBwYWlycy5sZW5ndGg7IHkrKykgeworCQkJCQkJCQkJCQkJCXZhciBzaSA9IHBhaXJzW3ldLmluZGV4T2YoIjoiKTsKKwkJCQkJCQkJCQkJCQlpZiAoKHNpICE9IC0xKSAmJiAocGFpcnNbeV0ubGVuZ3RoID4gc2kpKSB7CisJCQkJCQkJCQkJCQkJCXRoaXNbeF1bcGFpcnNbeV0uc3Vic3RyKDAsIHNpKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpXSA9IHBhaXJzW3ldLnN1YnN0cihzaSArIDEpOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCXRoaXNbeF0gPSBhcmdzW3hdOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuZXh0cmFBcmdzW3gudG9Mb3dlckNhc2UoKV0gPSBhcmdzW3hdOworCQl9CisJfQorfSwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoYXJncywgZnJhZywgcGFyZW50KSB7Cit9LCBpbml0aWFsaXplOmZ1bmN0aW9uIChhcmdzLCBmcmFnLCBwYXJlbnQpIHsKKwlyZXR1cm4gZmFsc2U7Cit9LCBwb3N0SW5pdGlhbGl6ZTpmdW5jdGlvbiAoYXJncywgZnJhZywgcGFyZW50KSB7CisJcmV0dXJuIGZhbHNlOworfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZywgcGFyZW50KSB7CisJcmV0dXJuIGZhbHNlOworfSwgdW5pbml0aWFsaXplOmZ1bmN0aW9uICgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9LCBidWlsZFJlbmRlcmluZzpmdW5jdGlvbiAoYXJncywgZnJhZywgcGFyZW50KSB7CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLndpZGdldC5XaWRnZXQuYnVpbGRSZW5kZXJpbmcsIG9uICIgKyB0aGlzLnRvU3RyaW5nKCkgKyAiLCAiKTsKKwlyZXR1cm4gZmFsc2U7Cit9LCBkZXN0cm95UmVuZGVyaW5nOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LldpZGdldC5kZXN0cm95UmVuZGVyaW5nIik7CisJcmV0dXJuIGZhbHNlOworfSwgYWRkZWRUbzpmdW5jdGlvbiAocGFyZW50KSB7Cit9LCBhZGRDaGlsZDpmdW5jdGlvbiAoY2hpbGQpIHsKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LldpZGdldC5hZGRDaGlsZCIpOworCXJldHVybiBmYWxzZTsKK30sIHJlbW92ZUNoaWxkOmZ1bmN0aW9uICh3aWRnZXQpIHsKKwlmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyB4KyspIHsKKwkJaWYgKHRoaXMuY2hpbGRyZW5beF0gPT09IHdpZGdldCkgeworCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoeCwgMSk7CisJCQl3aWRnZXQucGFyZW50ID0gbnVsbDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB3aWRnZXQ7Cit9LCBnZXRQcmV2aW91c1NpYmxpbmc6ZnVuY3Rpb24gKCkgeworCXZhciBpZHggPSB0aGlzLmdldFBhcmVudEluZGV4KCk7CisJaWYgKGlkeCA8PSAwKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baWR4IC0gMV07Cit9LCBnZXRTaWJsaW5nczpmdW5jdGlvbiAoKSB7CisJcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuOworfSwgZ2V0UGFyZW50SW5kZXg6ZnVuY3Rpb24gKCkgeworCXJldHVybiBkb2pvLmxhbmcuaW5kZXhPZih0aGlzLnBhcmVudC5jaGlsZHJlbiwgdGhpcywgdHJ1ZSk7Cit9LCBnZXROZXh0U2libGluZzpmdW5jdGlvbiAoKSB7CisJdmFyIGlkeCA9IHRoaXMuZ2V0UGFyZW50SW5kZXgoKTsKKwlpZiAoaWR4ID09IHRoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChpZHggPCAwKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baWR4ICsgMV07Cit9fSk7Citkb2pvLndpZGdldC5sY0FyZ3NDYWNoZSA9IHt9OworZG9qby53aWRnZXQudGFncyA9IHt9OworZG9qby53aWRnZXQudGFncy5hZGRQYXJzZVRyZWVIYW5kbGVyID0gZnVuY3Rpb24gKHR5cGUpIHsKKwlkb2pvLmRlcHJlY2F0ZWQoImFkZFBhcnNlVHJlZUhhbmRsZXIiLCAiLiBQYXJzZVRyZWVIYW5kbGVycyBhcmUgbm93IHJlc2VydmVkIGZvciBjb21wb25lbnRzLiBBbnkgdW5maWx0ZXJlZCBEb2pvTUwgdGFnIHdpdGhvdXQgYSBQYXJzZVRyZWVIYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYSB3aWRnZXQiLCAiMC41Iik7Cit9OworZG9qby53aWRnZXQudGFnc1siZG9qbzpwcm9wZXJ0eXNldCJdID0gZnVuY3Rpb24gKGZyYWdtZW50LCB3aWRnZXRQYXJzZXIsIHBhcmVudENvbXApIHsKKwl2YXIgcHJvcGVydGllcyA9IHdpZGdldFBhcnNlci5wYXJzZVByb3BlcnRpZXMoZnJhZ21lbnRbImRvam86cHJvcGVydHlzZXQiXSk7Cit9OworZG9qby53aWRnZXQudGFnc1siZG9qbzpjb25uZWN0Il0gPSBmdW5jdGlvbiAoZnJhZ21lbnQsIHdpZGdldFBhcnNlciwgcGFyZW50Q29tcCkgeworCXZhciBwcm9wZXJ0aWVzID0gd2lkZ2V0UGFyc2VyLnBhcnNlUHJvcGVydGllcyhmcmFnbWVudFsiZG9qbzpjb25uZWN0Il0pOworfTsKK2Rvam8ud2lkZ2V0LmJ1aWxkV2lkZ2V0RnJvbVBhcnNlVHJlZSA9IGZ1bmN0aW9uICh0eXBlLCBmcmFnLCBwYXJzZXIsIHBhcmVudENvbXAsIGluc2VydGlvbkluZGV4LCBsb2NhbFByb3BzKSB7CisJZG9qby5hMTF5LnNldEFjY2Vzc2libGVNb2RlKCk7CisJdmFyIHN0eXBlID0gdHlwZS5zcGxpdCgiOiIpOworCXN0eXBlID0gKHN0eXBlLmxlbmd0aCA9PSAyKSA/IHN0eXBlWzFdIDogdHlwZTsKKwl2YXIgbG9jYWxQcm9wZXJ0aWVzID0gbG9jYWxQcm9wcyB8fCBwYXJzZXIucGFyc2VQcm9wZXJ0aWVzKGZyYWdbZnJhZ1sibnMiXSArICI6IiArIHN0eXBlXSk7CisJdmFyIHR3aWRnZXQgPSBkb2pvLndpZGdldC5tYW5hZ2VyLmdldEltcGxlbWVudGF0aW9uKHN0eXBlLCBudWxsLCBudWxsLCBmcmFnWyJucyJdKTsKKwlpZiAoIXR3aWRnZXQpIHsKKwkJdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgZmluZCBcIiIgKyB0eXBlICsgIlwiIHdpZGdldCIpOworCX0gZWxzZSB7CisJCWlmICghdHdpZGdldC5jcmVhdGUpIHsKKwkJCXRocm93IG5ldyBFcnJvcigiXCIiICsgdHlwZSArICJcIiB3aWRnZXQgb2JqZWN0IGhhcyBubyBcImNyZWF0ZVwiIG1ldGhvZCBhbmQgZG9lcyBub3QgYXBwZWFyIHRvIGltcGxlbWVudCAqV2lkZ2V0Iik7CisJCX0KKwl9CisJbG9jYWxQcm9wZXJ0aWVzWyJkb2pvaW5zZXJ0aW9uaW5kZXgiXSA9IGluc2VydGlvbkluZGV4OworCXZhciByZXQgPSB0d2lkZ2V0LmNyZWF0ZShsb2NhbFByb3BlcnRpZXMsIGZyYWcsIHBhcmVudENvbXAsIGZyYWdbIm5zIl0pOworCXJldHVybiByZXQ7Cit9OworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0ID0gZnVuY3Rpb24gKHdpZGdldENsYXNzLCByZW5kZXJlciwgc3VwZXJjbGFzc2VzLCBpbml0LCBwcm9wcykgeworCWlmIChkb2pvLmxhbmcuaXNTdHJpbmcoYXJndW1lbnRzWzNdKSkgeworCQlkb2pvLndpZGdldC5fZGVmaW5lV2lkZ2V0KGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzNdLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1s0XSwgYXJndW1lbnRzWzJdKTsKKwl9IGVsc2UgeworCQl2YXIgYXJncyA9IFthcmd1bWVudHNbMF1dLCBwID0gMzsKKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhhcmd1bWVudHNbMV0pKSB7CisJCQlhcmdzLnB1c2goYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pOworCQl9IGVsc2UgeworCQkJYXJncy5wdXNoKCIiLCBhcmd1bWVudHNbMV0pOworCQkJcCA9IDI7CisJCX0KKwkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGFyZ3VtZW50c1twXSkpIHsKKwkJCWFyZ3MucHVzaChhcmd1bWVudHNbcF0sIGFyZ3VtZW50c1twICsgMV0pOworCQl9IGVsc2UgeworCQkJYXJncy5wdXNoKG51bGwsIGFyZ3VtZW50c1twXSk7CisJCX0KKwkJZG9qby53aWRnZXQuX2RlZmluZVdpZGdldC5hcHBseSh0aGlzLCBhcmdzKTsKKwl9Cit9OworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0LnJlbmRlcmVycyA9ICJodG1sfHN2Z3x2bWwiOworZG9qby53aWRnZXQuX2RlZmluZVdpZGdldCA9IGZ1bmN0aW9uICh3aWRnZXRDbGFzcywgcmVuZGVyZXIsIHN1cGVyY2xhc3NlcywgaW5pdCwgcHJvcHMpIHsKKwl2YXIgbW9kdWxlID0gd2lkZ2V0Q2xhc3Muc3BsaXQoIi4iKTsKKwl2YXIgdHlwZSA9IG1vZHVsZS5wb3AoKTsKKwl2YXIgcmVneCA9ICJcXC4oIiArIChyZW5kZXJlciA/IHJlbmRlcmVyICsgInwiIDogIiIpICsgZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0LnJlbmRlcmVycyArICIpXFwuIjsKKwl2YXIgciA9IHdpZGdldENsYXNzLnNlYXJjaChuZXcgUmVnRXhwKHJlZ3gpKTsKKwltb2R1bGUgPSAociA8IDAgPyBtb2R1bGUuam9pbigiLiIpIDogd2lkZ2V0Q2xhc3Muc3Vic3RyKDAsIHIpKTsKKwlkb2pvLndpZGdldC5tYW5hZ2VyLnJlZ2lzdGVyV2lkZ2V0UGFja2FnZShtb2R1bGUpOworCXZhciBwb3MgPSBtb2R1bGUuaW5kZXhPZigiLiIpOworCXZhciBuc05hbWUgPSAocG9zID4gLTEpID8gbW9kdWxlLnN1YnN0cmluZygwLCBwb3MpIDogbW9kdWxlOworCXByb3BzID0gKHByb3BzKSB8fCB7fTsKKwlwcm9wcy53aWRnZXRUeXBlID0gdHlwZTsKKwlpZiAoKCFpbml0KSAmJiAocHJvcHNbImNsYXNzQ29uc3RydWN0b3IiXSkpIHsKKwkJaW5pdCA9IHByb3BzLmNsYXNzQ29uc3RydWN0b3I7CisJCWRlbGV0ZSBwcm9wcy5jbGFzc0NvbnN0cnVjdG9yOworCX0KKwlkb2pvLmRlY2xhcmUod2lkZ2V0Q2xhc3MsIHN1cGVyY2xhc3NlcywgaW5pdCwgcHJvcHMpOworfTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9XaXphcmQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L1dpemFyZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ0NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9XaXphcmQuanMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LldpemFyZCIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkxheW91dENvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Db250ZW50UGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV2ZW50LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LldpemFyZENvbnRhaW5lciIsIGRvam8ud2lkZ2V0LkxheW91dENvbnRhaW5lciwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiV2l6YXJkQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwid2l6YXJkTm9kZVwiPlxuCTxkaXYgY2xhc3M9XCJXaXphcmRUZXh0XCIgZG9qb0F0dGFjaFBvaW50PVwid2l6YXJkUGFuZWxDb250YWluZXJOb2RlXCI+XG4JPC9kaXY+XG4JPGRpdiBjbGFzcz1cIldpemFyZEJ1dHRvbkhvbGRlclwiIGRvam9BdHRhY2hQb2ludD1cIndpemFyZENvbnRyb2xDb250YWluZXJOb2RlXCI+XG4JCTxpbnB1dCBjbGFzcz1cIldpemFyZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBkb2pvQXR0YWNoUG9pbnQ9XCJwcmV2aW91c0J1dHRvblwiLz5cbgkJPGlucHV0IGNsYXNzPVwiV2l6YXJkQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGRvam9BdHRhY2hQb2ludD1cIm5leHRCdXR0b25cIi8+XG4JCTxpbnB1dCBjbGFzcz1cIldpemFyZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBkb2pvQXR0YWNoUG9pbnQ9XCJkb25lQnV0dG9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIi8+XG4JCTxpbnB1dCBjbGFzcz1cIldpemFyZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBkb2pvQXR0YWNoUG9pbnQ9XCJjYW5jZWxCdXR0b25cIi8+XG4JPC9kaXY+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuV2l6YXJkQ29udGFpbmVyIHtcblx0YmFja2dyb3VuZDogI0VFRUVFRTtcblx0Ym9yZGVyOiAjNzk4RUM1IDFweCBzb2xpZDtcblx0cGFkZGluZzogMnB4O1xufVxuXG4uV2l6YXJkVGl0bGUge1xuXHRjb2xvcjogIzAwMzM2Njtcblx0cGFkZGluZzogOHB4IDVweCAxNXB4IDJweDtcblx0Zm9udC13ZWlnaHQ6IGJvbGQ7XG5cdGZvbnQtc2l6ZTogeC1zbWFsbDtcblx0Zm9udC1zdHlsZTogbm9ybWFsO1xuXHRmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTtcblx0dGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLldpemFyZFRleHQge1xuXHRjb2xvcjogIzAwMDAzMztcblx0Zm9udC13ZWlnaHQ6IG5vcm1hbDtcblx0Zm9udC1zaXplOiB4eC1zbWFsbDtcblx0Zm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7XG5cdHBhZGRpbmc6IDIgNTA7IHRleHQtYWxpZ246IGp1c3RpZnk7XG59XG5cbi5XaXphcmRMaWdodFRleHQge1xuXHRjb2xvcjogIzY2NjY2Njtcblx0Zm9udC13ZWlnaHQ6IG5vcm1hbDtcblx0Zm9udC1zaXplOiB4eC1zbWFsbDtcblx0Zm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2E7XG5cdHBhZGRpbmc6IDJweCA1MHB4O1xuXHR0ZXh0LWFsaWduOiBqdXN0aWZ5O1xufVxuXG4uV2l6YXJkQnV0dG9uSG9sZGVyIHtcblx0dGV4dC1hbGlnbjogcmlnaHQ7XG5cdHBhZGRpbmc6IDEwcHggNXB4O1xufVxuXG4uV2l6YXJkQnV0dG9uIHtcblx0Y29sb3I6ICNmZmZmZmY7XG5cdGJhY2tncm91bmQ6ICM3OThFQzU7XG5cdGZvbnQtc2l6ZTogeHgtc21hbGw7XG5cdGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xuXHRib3JkZXItcmlnaHQ6ICMwMDAwMDAgMXB4IHNvbGlkO1xuXHRib3JkZXItYm90dG9tOiAjMDAwMDAwIDFweCBzb2xpZDtcblx0Ym9yZGVyLWxlZnQ6ICM2NjY2NjYgMXB4IHNvbGlkO1xuXHRib3JkZXItdG9wOiAjNjY2NjY2IDFweCBzb2xpZDtcblx0cGFkZGluZy1yaWdodDogNHB4O1xuXHRwYWRkaW5nLWxlZnQ6IDRweDtcblx0dGV4dC1kZWNvcmF0aW9uOiBub25lOyBoZWlnaHQ6IDE4cHg7XG59XG5cbi5XaXphcmRCdXR0b246aG92ZXIge1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5XaXphcmRCdXR0b25EaXNhYmxlZCB7XG5cdGNvbG9yOiAjZWVlZWVlO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5O1xuXHRmb250LXNpemU6IHh4LXNtYWxsO1xuXHRGT05ULUZBTUlMWTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcblx0Ym9yZGVyLXJpZ2h0OiAjMDAwMDAwIDFweCBzb2xpZDtcblx0Ym9yZGVyLWJvdHRvbTogIzAwMDAwMCAxcHggc29saWQ7XG5cdGJvcmRlci1sZWZ0OiAjNzk4RUM1IDFweCBzb2xpZDtcblx0Ym9yZGVyLXRvcDogIzc5OEVDNSAxcHggc29saWQ7XG5cdHBhZGRpbmctcmlnaHQ6IDRweDtcblx0cGFkZGluZy1sZWZ0OiA0cHg7XG5cdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0aGVpZ2h0OiAxOHB4O1xufVxuXG5cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9XaXphcmQuY3NzIiksIHNlbGVjdGVkOm51bGwsIG5leHRCdXR0b25MYWJlbDoibmV4dCIsIHByZXZpb3VzQnV0dG9uTGFiZWw6InByZXZpb3VzIiwgY2FuY2VsQnV0dG9uTGFiZWw6ImNhbmNlbCIsIGRvbmVCdXR0b25MYWJlbDoiZG9uZSIsIGNhbmNlbEZ1bmN0aW9uOiIiLCBoaWRlRGlzYWJsZWRCdXR0b25zOmZhbHNlLCBmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLm5leHRCdXR0b24sICJvbmNsaWNrIiwgdGhpcywgIl9vbk5leHRCdXR0b25DbGljayIpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLnByZXZpb3VzQnV0dG9uLCAib25jbGljayIsIHRoaXMsICJfb25QcmV2aW91c0J1dHRvbkNsaWNrIik7CisJaWYgKHRoaXMuY2FuY2VsRnVuY3Rpb24pIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuY2FuY2VsQnV0dG9uLCAib25jbGljayIsIHRoaXMuY2FuY2VsRnVuY3Rpb24pOworCX0gZWxzZSB7CisJCXRoaXMuY2FuY2VsQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJfQorCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbmVCdXR0b24sICJvbmNsaWNrIiwgdGhpcywgImRvbmUiKTsKKwl0aGlzLm5leHRCdXR0b24udmFsdWUgPSB0aGlzLm5leHRCdXR0b25MYWJlbDsKKwl0aGlzLnByZXZpb3VzQnV0dG9uLnZhbHVlID0gdGhpcy5wcmV2aW91c0J1dHRvbkxhYmVsOworCXRoaXMuY2FuY2VsQnV0dG9uLnZhbHVlID0gdGhpcy5jYW5jZWxCdXR0b25MYWJlbDsKKwl0aGlzLmRvbmVCdXR0b24udmFsdWUgPSB0aGlzLmRvbmVCdXR0b25MYWJlbDsKK30sIF9jaGVja0J1dHRvbnM6ZnVuY3Rpb24gKCkgeworCXZhciBsYXN0U3RlcCA9ICF0aGlzLmhhc05leHRQYW5lbCgpOworCXRoaXMubmV4dEJ1dHRvbi5kaXNhYmxlZCA9IGxhc3RTdGVwOworCXRoaXMuX3NldEJ1dHRvbkNsYXNzKHRoaXMubmV4dEJ1dHRvbik7CisJaWYgKHRoaXMuc2VsZWN0ZWQuZG9uZUZ1bmN0aW9uKSB7CisJCXRoaXMuZG9uZUJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCWlmIChsYXN0U3RlcCkgeworCQkJdGhpcy5uZXh0QnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmRvbmVCdXR0b24uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl9CisJdGhpcy5wcmV2aW91c0J1dHRvbi5kaXNhYmxlZCA9ICgoIXRoaXMuaGFzUHJldmlvdXNQYW5lbCgpKSB8fCAoIXRoaXMuc2VsZWN0ZWQuY2FuR29CYWNrKSk7CisJdGhpcy5fc2V0QnV0dG9uQ2xhc3ModGhpcy5wcmV2aW91c0J1dHRvbik7Cit9LCBfc2V0QnV0dG9uQ2xhc3M6ZnVuY3Rpb24gKGJ1dHRvbikgeworCWlmICghdGhpcy5oaWRlRGlzYWJsZWRCdXR0b25zKSB7CisJCWJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCWRvam8uaHRtbC5zZXRDbGFzcyhidXR0b24sIGJ1dHRvbi5kaXNhYmxlZCA/ICJXaXphcmRCdXR0b25EaXNhYmxlZCIgOiAiV2l6YXJkQnV0dG9uIik7CisJfSBlbHNlIHsKKwkJYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSBidXR0b24uZGlzYWJsZWQgPyAibm9uZSIgOiAiIjsKKwl9Cit9LCByZWdpc3RlckNoaWxkOmZ1bmN0aW9uIChwYW5lbCwgaW5zZXJ0aW9uSW5kZXgpIHsKKwlkb2pvLndpZGdldC5XaXphcmRDb250YWluZXIuc3VwZXJjbGFzcy5yZWdpc3RlckNoaWxkLmNhbGwodGhpcywgcGFuZWwsIGluc2VydGlvbkluZGV4KTsKKwl0aGlzLndpemFyZFBhbmVsQ29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChwYW5lbC5kb21Ob2RlKTsKKwlwYW5lbC5oaWRlKCk7CisJaWYgKCF0aGlzLnNlbGVjdGVkKSB7CisJCXRoaXMub25TZWxlY3RlZChwYW5lbCk7CisJfQorCXRoaXMuX2NoZWNrQnV0dG9ucygpOworfSwgb25TZWxlY3RlZDpmdW5jdGlvbiAocGFuZWwpIHsKKwlpZiAodGhpcy5zZWxlY3RlZCkgeworCQlpZiAodGhpcy5zZWxlY3RlZC5fY2hlY2tQYXNzKCkpIHsKKwkJCXRoaXMuc2VsZWN0ZWQuaGlkZSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisJfQorCXBhbmVsLnNob3coKTsKKwl0aGlzLnNlbGVjdGVkID0gcGFuZWw7Cit9LCBnZXRQYW5lbHM6ZnVuY3Rpb24gKCkgeworCXJldHVybiB0aGlzLmdldENoaWxkcmVuT2ZUeXBlKCJXaXphcmRQYW5lIiwgZmFsc2UpOworfSwgc2VsZWN0ZWRJbmRleDpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuc2VsZWN0ZWQpIHsKKwkJcmV0dXJuIGRvam8ubGFuZy5pbmRleE9mKHRoaXMuZ2V0UGFuZWxzKCksIHRoaXMuc2VsZWN0ZWQpOworCX0KKwlyZXR1cm4gLTE7Cit9LCBfb25OZXh0QnV0dG9uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXZhciBzZWxlY3RlZEluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4KCk7CisJaWYgKHNlbGVjdGVkSW5kZXggPiAtMSkgeworCQl2YXIgY2hpbGRQYW5lbHMgPSB0aGlzLmdldFBhbmVscygpOworCQlpZiAoY2hpbGRQYW5lbHNbc2VsZWN0ZWRJbmRleCArIDFdKSB7CisJCQl0aGlzLm9uU2VsZWN0ZWQoY2hpbGRQYW5lbHNbc2VsZWN0ZWRJbmRleCArIDFdKTsKKwkJfQorCX0KKwl0aGlzLl9jaGVja0J1dHRvbnMoKTsKK30sIF9vblByZXZpb3VzQnV0dG9uQ2xpY2s6ZnVuY3Rpb24gKCkgeworCXZhciBzZWxlY3RlZEluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4KCk7CisJaWYgKHNlbGVjdGVkSW5kZXggPiAtMSkgeworCQl2YXIgY2hpbGRQYW5lbHMgPSB0aGlzLmdldFBhbmVscygpOworCQlpZiAoY2hpbGRQYW5lbHNbc2VsZWN0ZWRJbmRleCAtIDFdKSB7CisJCQl0aGlzLm9uU2VsZWN0ZWQoY2hpbGRQYW5lbHNbc2VsZWN0ZWRJbmRleCAtIDFdKTsKKwkJfQorCX0KKwl0aGlzLl9jaGVja0J1dHRvbnMoKTsKK30sIGhhc05leHRQYW5lbDpmdW5jdGlvbiAoKSB7CisJdmFyIHNlbGVjdGVkSW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXgoKTsKKwlyZXR1cm4gKHNlbGVjdGVkSW5kZXggPCAodGhpcy5nZXRQYW5lbHMoKS5sZW5ndGggLSAxKSk7Cit9LCBoYXNQcmV2aW91c1BhbmVsOmZ1bmN0aW9uICgpIHsKKwl2YXIgc2VsZWN0ZWRJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleCgpOworCXJldHVybiAoc2VsZWN0ZWRJbmRleCA+IDApOworfSwgZG9uZTpmdW5jdGlvbiAoKSB7CisJdGhpcy5zZWxlY3RlZC5kb25lKCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LldpemFyZFBhbmUiLCBkb2pvLndpZGdldC5Db250ZW50UGFuZSwge2NhbkdvQmFjazp0cnVlLCBwYXNzRnVuY3Rpb246IiIsIGRvbmVGdW5jdGlvbjoiIiwgcG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbiAoYXJncywgZnJhZykgeworCWlmICh0aGlzLnBhc3NGdW5jdGlvbikgeworCQl0aGlzLnBhc3NGdW5jdGlvbiA9IGRqX2dsb2JhbFt0aGlzLnBhc3NGdW5jdGlvbl07CisJfQorCWlmICh0aGlzLmRvbmVGdW5jdGlvbikgeworCQl0aGlzLmRvbmVGdW5jdGlvbiA9IGRqX2dsb2JhbFt0aGlzLmRvbmVGdW5jdGlvbl07CisJfQorCWRvam8ud2lkZ2V0LldpemFyZFBhbmUuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9LCBfY2hlY2tQYXNzOmZ1bmN0aW9uICgpIHsKKwlpZiAodGhpcy5wYXNzRnVuY3Rpb24gJiYgZG9qby5sYW5nLmlzRnVuY3Rpb24odGhpcy5wYXNzRnVuY3Rpb24pKSB7CisJCXZhciBmYWlsTWVzc2FnZSA9IHRoaXMucGFzc0Z1bmN0aW9uKCk7CisJCWlmIChmYWlsTWVzc2FnZSkgeworCQkJYWxlcnQoZmFpbE1lc3NhZ2UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfSwgZG9uZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZG9uZUZ1bmN0aW9uICYmIGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuZG9uZUZ1bmN0aW9uKSkgeworCQl0aGlzLmRvbmVGdW5jdGlvbigpOworCX0KK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ZYWhvb01hcC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvWWFob29NYXAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1NDFhNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvWWFob29NYXAuanMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LllhaG9vTWFwIik7Citkb2pvLnJlcXVpcmUoImRvam8uZXZlbnQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7CisoZnVuY3Rpb24gKCkgeworCXZhciB5YXBwaWQgPSBkakNvbmZpZ1sieUFwcElkIl0gfHwgZGpDb25maWdbInlhaG9vQXBwSWQiXSB8fCAiZG9qb3Rvb2xraXQiOworCWlmICghZG9qby5ob3N0ZW52LnBvc3RfbG9hZF8pIHsKKwkJaWYgKHlhcHBpZCA9PSAiZG9qb3Rvb2xraXQiKSB7CisJCQlkb2pvLmRlYnVnKCJwbGVhc2UgcHJvdmlkZSBhIHVuaXF1ZSBZYWhvbyBBcHAgSUQgaW4gZGpDb25maWcueWFob29BcHBJZCB3aGVuIHVzaW5nIHRoZSBtYXAgd2lkZ2V0Iik7CisJCX0KKwkJdmFyIHRhZyA9ICI8c2NyIiArICJpcHQgc3JjPSdodHRwOi8vYXBpLm1hcHMueWFob28uY29tL2FqYXh5bWFwP3Y9My4wJmFwcGlkPSIgKyB5YXBwaWQgKyAiJz48L3NjcmkiICsgInB0PiI7CisJCWlmICghZGpfZ2xvYmFsWyJZTWFwIl0pIHsKKwkJCWRvY3VtZW50LndyaXRlKHRhZyk7CisJCX0KKwl9IGVsc2UgeworCQlkb2pvLmRlYnVnKCJjYW5ub3QgaW5pdGlhbGl6ZSBtYXAgc3lzdGVtIGFmdGVyIHRoZSBwYWdlIGhhcyBiZWVuIGxvYWRlZCEgUGxlYXNlIGVpdGhlciBtYW51YWxseSBpbmNsdWRlIHRoZSBzY3JpcHQgYmxvY2sgcHJvdmlkZWQgYnkgWWFob28gaW4geW91ciBwYWdlIG9yIHJlcXVpcmUoKSB0aGUgWWFob29NYXAgd2lkZ2V0IGJlZm9yZSBvbmxvYWQgaGFzIGZpcmVkIik7CisJfQorfSkoKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuWWFob29NYXAiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbiAoKSB7CisJdGhpcy5tYXAgPSBudWxsOworCXRoaXMuZGF0YXNyYyA9ICIiOworCXRoaXMuZGF0YSA9IFtdOworCXRoaXMud2lkdGggPSAwOworCXRoaXMuaGVpZ2h0ID0gMDsKKwl0aGlzLmNvbnRyb2xzID0gWyJ6b29tbG9uZyIsICJtYXB0eXBlIiwgInBhbiJdOworfSwge2lzQ29udGFpbmVyOmZhbHNlLCB0ZW1wbGF0ZVBhdGg6bnVsbCwgdGVtcGxhdGVDc3NQYXRoOm51bGwsIGZpbmRDZW50ZXI6ZnVuY3Rpb24gKGFQdHMpIHsKKwl2YXIgc3RhcnQgPSBuZXcgWUdlb1BvaW50KDM3LCAtOTApOworCWlmIChhUHRzLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBzdGFydDsKKwl9CisJdmFyIG1pbkxhdCwgbWF4TGF0LCBtaW5Mb24sIG1heExvbiwgY0xhdCwgY0xvbjsKKwltaW5MYXQgPSBtYXhMYXQgPSBhUHRzWzBdLkxhdDsKKwltaW5Mb24gPSBtYXhMb24gPSBhUHRzWzBdLkxvbjsKKwlmb3IgKHZhciBpID0gMDsgaSA8IGFQdHMubGVuZ3RoOyBpKyspIHsKKwkJbWluTGF0ID0gTWF0aC5taW4obWluTGF0LCBhUHRzW2ldLkxhdCk7CisJCW1heExhdCA9IE1hdGgubWF4KG1heExhdCwgYVB0c1tpXS5MYXQpOworCQltaW5Mb24gPSBNYXRoLm1pbihtaW5Mb24sIGFQdHNbaV0uTG9uKTsKKwkJbWF4TG9uID0gTWF0aC5tYXgobWF4TG9uLCBhUHRzW2ldLkxvbik7CisJfQorCWNMYXQgPSBkb2pvLm1hdGgucm91bmQoKG1pbkxhdCArIG1heExhdCkgLyAyLCA2KTsKKwljTG9uID0gZG9qby5tYXRoLnJvdW5kKChtaW5Mb24gKyBtYXhMb24pIC8gMiwgNik7CisJcmV0dXJuIG5ldyBZR2VvUG9pbnQoY0xhdCwgY0xvbik7Cit9LCBzZXRDb250cm9sczpmdW5jdGlvbiAoKSB7CisJdmFyIG1ldGhvZG1hcCA9IHttYXB0eXBlOiJhZGRUeXBlQ29udHJvbCIsIHBhbjoiYWRkUGFuQ29udHJvbCIsIHpvb21sb25nOiJhZGRab29tTG9uZyIsIHpvb21zaG9ydDoiYWRkWm9vbVNob3J0In07CisJdmFyIGMgPSB0aGlzLmNvbnRyb2xzOworCWZvciAodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7IGkrKykgeworCQl2YXIgY29udHJvbE1ldGhvZCA9IG1ldGhvZG1hcFtjW2ldLnRvTG93ZXJDYXNlKCldOworCQlpZiAodGhpcy5tYXBbY29udHJvbE1ldGhvZF0pIHsKKwkJCXRoaXMubWFwW2NvbnRyb2xNZXRob2RdKCk7CisJCX0KKwl9Cit9LCBwYXJzZTpmdW5jdGlvbiAodGFibGUpIHsKKwl0aGlzLmRhdGEgPSBbXTsKKwl2YXIgaCA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aGVhZCIpWzBdOworCWlmICghaCkgeworCQlyZXR1cm47CisJfQorCXZhciBhID0gW107CisJdmFyIGNvbHMgPSBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCWlmIChjb2xzLmxlbmd0aCA9PSAwKSB7CisJCWNvbHMgPSBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aCIpOworCX0KKwlmb3IgKHZhciBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKwkJdmFyIGMgPSBjb2xzW2ldLmlubmVySFRNTC50b0xvd2VyQ2FzZSgpOworCQlpZiAoYyA9PSAibG9uZyIpIHsKKwkJCWMgPSAibG5nIjsKKwkJfQorCQlhLnB1c2goYyk7CisJfQorCXZhciBiID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF07CisJaWYgKCFiKSB7CisJCXJldHVybjsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCBiLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKCEoYi5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lICYmIGIuY2hpbGROb2Rlc1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ciIpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YXIgY2VsbHMgPSBiLmNoaWxkTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCXZhciBvID0ge307CisJCWZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgeworCQkJdmFyIGNvbCA9IGFbal07CisJCQlpZiAoY29sID09ICJsYXQiIHx8IGNvbCA9PSAibG5nIikgeworCQkJCW9bY29sXSA9IHBhcnNlRmxvYXQoY2VsbHNbal0uaW5uZXJIVE1MKTsKKwkJCX0gZWxzZSB7CisJCQkJb1tjb2xdID0gY2VsbHNbal0uaW5uZXJIVE1MOworCQkJfQorCQl9CisJCXRoaXMuZGF0YS5wdXNoKG8pOworCX0KK30sIHJlbmRlcjpmdW5jdGlvbiAoKSB7CisJdmFyIHB0cyA9IFtdOworCXZhciBkID0gdGhpcy5kYXRhOworCWZvciAodmFyIGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkrKykgeworCQl2YXIgcHQgPSBuZXcgWUdlb1BvaW50KGRbaV0ubGF0LCBkW2ldLmxuZyk7CisJCXB0cy5wdXNoKHB0KTsKKwkJdmFyIGljb24gPSBkW2ldLmljb24gfHwgbnVsbDsKKwkJaWYgKGljb24pIHsKKwkJCWljb24gPSBuZXcgWUltYWdlKGljb24pOworCQl9CisJCXZhciBtID0gbmV3IFlNYXJrZXIocHQsIGljb24pOworCQlpZiAoZFtpXS5kZXNjcmlwdGlvbikgeworCQkJbS5hZGRBdXRvRXhwYW5kKCI8ZGl2PiIgKyBkW2ldLmRlc2NyaXB0aW9uICsgIjwvZGl2PiIpOworCQl9CisJCXRoaXMubWFwLmFkZE92ZXJsYXkobSk7CisJfQorCXZhciBjID0gdGhpcy5maW5kQ2VudGVyKHB0cyk7CisJdmFyIHogPSB0aGlzLm1hcC5nZXRab29tTGV2ZWwocHRzKTsKKwl0aGlzLm1hcC5kcmF3Wm9vbUFuZENlbnRlcihjLCB6KTsKK30sIGluaXRpYWxpemU6ZnVuY3Rpb24gKGFyZ3MsIGZyYWcpIHsKKwlpZiAoIVlNYXAgfHwgIVlHZW9Qb2ludCkgeworCQlkb2pvLnJhaXNlKCJkb2pvLndpZGdldC5ZYWhvb01hcDogVGhlIFlhaG9vIE1hcCBzY3JpcHQgbXVzdCBiZSBpbmNsdWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyB3aWRnZXQuIik7CisJfQorCWlmICh0aGlzLmRhdGFzcmMpIHsKKwkJdGhpcy5wYXJzZShkb2pvLmJ5SWQodGhpcy5kYXRhc3JjKSk7CisJfSBlbHNlIHsKKwkJaWYgKHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXSkgeworCQkJdGhpcy5wYXJzZSh0aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhYmxlIilbMF0pOworCQl9CisJfQorfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJd2hpbGUgKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJdGhpcy5kb21Ob2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzWzBdKTsKKwl9CisJaWYgKHRoaXMud2lkdGggPiAwICYmIHRoaXMuaGVpZ2h0ID4gMCkgeworCQl0aGlzLm1hcCA9IG5ldyBZTWFwKHRoaXMuZG9tTm9kZSwgWUFIT09fTUFQX1JFRywgbmV3IFlTaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSk7CisJfSBlbHNlIHsKKwkJdGhpcy5tYXAgPSBuZXcgWU1hcCh0aGlzLmRvbU5vZGUpOworCX0KKwl0aGlzLnNldENvbnRyb2xzKCk7CisJdGhpcy5yZW5kZXIoKTsKK319KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYjhjZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwxNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8ueG1sLlBhcnNlIiwgImRvam8ud2lkZ2V0LldpZGdldCIsICJkb2pvLndpZGdldC5QYXJzZSIsICJkb2pvLndpZGdldC5NYW5hZ2VyIl0sIGJyb3dzZXI6WyJkb2pvLndpZGdldC5Eb21XaWRnZXQiLCAiZG9qby53aWRnZXQuSHRtbFdpZGdldCJdLCBkYXNoYm9hcmQ6WyJkb2pvLndpZGdldC5Eb21XaWRnZXQiLCAiZG9qby53aWRnZXQuSHRtbFdpZGdldCJdLCBzdmc6WyJkb2pvLndpZGdldC5TdmdXaWRnZXQiXSwgcmhpbm86WyJkb2pvLndpZGdldC5Td3RXaWRnZXQiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS9EZW1vQ29udGFpbmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL0RlbW9Db250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4NjFmMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS9EZW1vQ29udGFpbmVyLmpzCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LmRlbW9FbmdpbmUuRGVtb0NvbnRhaW5lciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5EZW1vUGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5kZW1vRW5naW5lLlNvdXJjZVBhbmUiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVGFiQ29udGFpbmVyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoIm15LndpZGdldC5kZW1vRW5naW5lLkRlbW9Db250YWluZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGVtcGxhdGVTdHJpbmc6IjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiZG9tTm9kZVwiPlxuXHQ8dGFibGUgd2lkdGg9XCIxMDAlXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCI1XCI+XG5cdFx0PHRib2R5PlxuXHRcdFx0PHRyIGRvam9BdHRhY2hQb2ludD1cImhlYWRlck5vZGVcIj5cblx0XHRcdFx0PHRkIGRvam9BdHRhY2hQb2ludD1cInJldHVybk5vZGVcIiB2YWxpZ249XCJtaWRkbGVcIiB3aWR0aD1cIjElXCI+XG5cdFx0XHRcdFx0PGltZyBkb2pvQXR0YWNoUG9pbnQ9XCJyZXR1cm5JbWFnZU5vZGVcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbmNsaWNrOiByZXR1cm5Ub0RlbW9zXCIvPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQ+XG5cdFx0XHRcdFx0PGgxIGRvam9BdHRhY2hQb2ludD1cImRlbW9OYW1lTm9kZVwiPjwvaDE+XG5cdFx0XHRcdFx0PHAgZG9qb0F0dGFjaFBvaW50PVwic3VtbWFyeU5vZGVcIj48L3A+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZCBkb2pvQXR0YWNoUG9pbnQ9XCJ0YWJDb250cm9sTm9kZVwiIHZhbGlnbj1cIm1pZGRsZVwiIGFsaWduPVwicmlnaHRcIiBub3dyYXA+XG5cdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwic291cmNlQnV0dG9uTm9kZVwiIGRvam9BdHRhY2hFdmVudD1cIm9uY2xpY2s6IHNob3dTb3VyY2VcIj5zb3VyY2U8L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwiZGVtb0J1dHRvbk5vZGVcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbmNsaWNrOiBzaG93RGVtb1wiPmRlbW88L3NwYW4+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdFx0PHRyPlxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjNcIj5cblx0XHRcdFx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRhYk5vZGVcIj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90Ym9keT5cblx0PC90YWJsZT5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kZW1vQ29udGFpbmVye1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRwYWRkaW5nOiAwcHg7XG5cdG1hcmdpbjogMHB4O1xufVxuXG4uZGVtb0NvbnRhaW5lciAucmV0dXJuIHtcblx0Y3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGVtb0NvbnRhaW5lciBzcGFuIHtcblx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kZW1vQ29udGFpbmVyIC5zZWxlY3RlZCB7XG5cdGJvcmRlci1ib3R0b206IDVweCBzb2xpZCAjOTViZmZmO1xufVxuXG4uZGVtb0NvbnRhaW5lciB0YWJsZSB7XG5cdGJhY2tncm91bmQ6ICNmNWY1ZjU7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDEwMCU7XG59XG5cbi5kZW1vQ29udGFpbmVyVGFicyB7XG5cdHdpZHRoOiAxMDAlO1xuXHRoZWlnaHQ6IDQwMHB4O1xufVxuXG4uZGVtb0NvbnRhaW5lclRhYnMgLmRvam9UYWJMYWJlbHMtdG9wIHtcblx0ZGlzcGxheTogbm9uZTtcbn1cblxuLmRlbW9Db250YWluZXJUYWJzIC5kb2pvVGFiUGFuZVdyYXBwZXIge1xuXHRib3JkZXI6IDBweDtcbn1cblxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAiZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0NvbnRhaW5lci5jc3MiKSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgdGhpcy5kb21Ob2RlQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLnRhYk5vZGUsIHRoaXMudGFiQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLnJldHVybkltYWdlTm9kZSwgdGhpcy5yZXR1cm5DbGFzcyk7CisJdGhpcy5yZXR1cm5JbWFnZU5vZGUuc3JjID0gdGhpcy5yZXR1cm5JbWFnZTsKKwl0aGlzLnRhYkNvbnRhaW5lciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVGFiQ29udGFpbmVyIiwge30sIHRoaXMudGFiTm9kZSk7CisJdGhpcy5kZW1vVGFiID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJEZW1vUGFuZSIsIHt9KTsKKwl0aGlzLnRhYkNvbnRhaW5lci5hZGRDaGlsZCh0aGlzLmRlbW9UYWIpOworCXRoaXMuc291cmNlVGFiID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJTb3VyY2VQYW5lIiwge30pOworCXRoaXMudGFiQ29udGFpbmVyLmFkZENoaWxkKHRoaXMuc291cmNlVGFiKTsKKwlkb2pvLmh0bWwuc2V0T3BhY2l0eSh0aGlzLmRvbU5vZGUsIDApOworCWRvam8uaHRtbC5oaWRlKHRoaXMuZG9tTm9kZSk7Cit9LCBsb2FkRGVtbzpmdW5jdGlvbiAodXJsKSB7CisJdGhpcy5kZW1vVGFiLnNldEhyZWYodXJsKTsKKwl0aGlzLnNvdXJjZVRhYi5zZXRIcmVmKHVybCk7CisJdGhpcy5zaG93RGVtbygpOworfSwgc2V0TmFtZTpmdW5jdGlvbiAobmFtZSkgeworCWRvam8uaHRtbC5yZW1vdmVDaGlsZHJlbih0aGlzLmRlbW9OYW1lTm9kZSk7CisJdGhpcy5kZW1vTmFtZU5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOworfSwgc2V0U3VtbWFyeTpmdW5jdGlvbiAoc3VtbWFyeSkgeworCWRvam8uaHRtbC5yZW1vdmVDaGlsZHJlbih0aGlzLnN1bW1hcnlOb2RlKTsKKwl0aGlzLnN1bW1hcnlOb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN1bW1hcnkpKTsKK30sIHNob3dTb3VyY2U6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRlbW9CdXR0b25Ob2RlLCB0aGlzLnNlbGVjdGVkQnV0dG9uQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLnNvdXJjZUJ1dHRvbk5vZGUsIHRoaXMuc2VsZWN0ZWRCdXR0b25DbGFzcyk7CisJdGhpcy50YWJDb250YWluZXIuc2VsZWN0VGFiKHRoaXMuc291cmNlVGFiKTsKK30sIHNob3dEZW1vOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5zb3VyY2VCdXR0b25Ob2RlLCB0aGlzLnNlbGVjdGVkQnV0dG9uQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRlbW9CdXR0b25Ob2RlLCB0aGlzLnNlbGVjdGVkQnV0dG9uQ2xhc3MpOworCXRoaXMudGFiQ29udGFpbmVyLnNlbGVjdFRhYih0aGlzLmRlbW9UYWIpOworfSwgcmV0dXJuVG9EZW1vczpmdW5jdGlvbiAoKSB7CisJZG9qby5kZWJ1ZygiUmV0dXJuIFRvIERlbW9zIik7Cit9LCBzaG93OmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuc2V0T3BhY2l0eSh0aGlzLmRvbU5vZGUsIDEpOworCWRvam8uaHRtbC5zaG93KHRoaXMuZG9tTm9kZSk7CisJdGhpcy50YWJDb250YWluZXIuY2hlY2tTaXplKCk7Cit9fSwgIiIsIGZ1bmN0aW9uICgpIHsKKwlkb2pvLmRlYnVnKCJEZW1vUGFuZSBJbml0Iik7CisJdGhpcy5kb21Ob2RlQ2xhc3MgPSAiZGVtb0NvbnRhaW5lciI7CisJdGhpcy50YWJDb250YWluZXIgPSAiIjsKKwl0aGlzLnNvdXJjZVRhYiA9ICIiOworCXRoaXMuZGVtb1RhYiA9ICIiOworCXRoaXMuaGVhZGVyTm9kZSA9ICIiOworCXRoaXMucmV0dXJuTm9kZSA9ICIiOworCXRoaXMucmV0dXJuSW1hZ2VOb2RlID0gIiI7CisJdGhpcy5yZXR1cm5JbWFnZSA9ICJpbWFnZXMvZG9qb0RlbW9zLmdpZiI7CisJdGhpcy5yZXR1cm5DbGFzcyA9ICJyZXR1cm4iOworCXRoaXMuc3VtbWFyeU5vZGUgPSAiIjsKKwl0aGlzLmRlbW9OYW1lTm9kZSA9ICIiOworCXRoaXMudGFiQ29udHJvbE5vZGUgPSAiIjsKKwl0aGlzLnRhYk5vZGUgPSAiIjsKKwl0aGlzLnRhYkNsYXNzID0gImRlbW9Db250YWluZXJUYWJzIjsKKwl0aGlzLnNvdXJjZUJ1dHRvbk5vZGUgPSAiIjsKKwl0aGlzLmRlbW9CdXR0b25Ob2RlID0gIiI7CisJdGhpcy5zZWxlY3RlZEJ1dHRvbkNsYXNzID0gInNlbGVjdGVkIjsKK30pOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvRGVtb0l0ZW0uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvRGVtb0l0ZW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2NjE5MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS9EZW1vSXRlbS5qcwpAQCAtMCwwICsxLDUyIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5kZW1vRW5naW5lLkRlbW9JdGVtIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJteS53aWRnZXQuZGVtb0VuZ2luZS5EZW1vSXRlbSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkb21Ob2RlXCI+XG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwic3VtbWFyeUJveE5vZGVcIj5cblx0XHQ8dGFibGUgd2lkdGg9XCIxMDAlXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCI+XG5cdFx0XHQ8dGJvZHk+XG5cdFx0XHRcdDx0cj5cblx0XHRcdFx0XHQ8dGQgZG9qb0F0dGFjaFBvaW50PVwic2NyZWVuc2hvdFRkTm9kZVwiIHZhbGlnbj1cInRvcFwiIHdpZHRoPVwiMSVcIj5cblx0XHRcdFx0XHRcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwidGh1bWJuYWlsSW1hZ2VOb2RlXCIgZG9qb0F0dGFjaEV2ZW50PVwib25jbGljazogb25TZWxlY3REZW1vXCIgLz5cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdDx0ZCBkb2pvQXR0YWNoUG9pbnQ9XCJzdW1tYXJ5Q29udGFpbmVyTm9kZVwiIHZhbGlnbj1cInRvcFwiPlxuXHRcdFx0XHRcdFx0PGgxIGRvam9BdHRhY2hQb2ludD1cIm5hbWVOb2RlXCI+XG5cdFx0XHRcdFx0XHQ8L2gxPlxuXHRcdFx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJzdW1tYXJ5Tm9kZVwiPlxuXHRcdFx0XHRcdFx0XHQ8cCBkb2pvQXR0YWNoUG9pbnQ9XCJkZXNjcmlwdGlvbk5vZGVcIj48L3A+XG5cdFx0XHRcdFx0XHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwidmlld0RlbW9MaW5rTm9kZVwiPjxpbWcgZG9qb0F0dGFjaFBvaW50PVwidmlld0RlbW9JbWFnZU5vZGVcIi8gZG9qb0F0dGFjaEV2ZW50PVwib25jbGljazogb25TZWxlY3REZW1vXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0PC90Ym9keT5cblx0XHQ8L3RhYmxlPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuIiwgdGVtcGxhdGVDc3NTdHJpbmc6Ii5kZW1vSXRlbVN1bW1hcnlCb3gge1xuXHRiYWNrZ3JvdW5kOiAjZWZlZmVmO1xuXHRib3JkZXI6MXB4IHNvbGlkICNkYWUzZWU7XG59XG5cbi5kZW1vSXRlbVNjcmVlbnNob3Qge1xuXHRwYWRkaW5nOjAuNjVlbTtcblx0d2lkdGg6MTc1cHg7XG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgI2ZhZmFmYTtcblx0dGV4dC1hbGlnbjpjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmRlbW9JdGVtV3JhcHBlcntcblx0bWFyZ2luLWJvdHRvbToxZW07XG59XG5cbi5kZW1vSXRlbVdyYXBwZXIgYTpsaW5rLCAuZGVtb0l0ZW1XcmFwcGVyIGE6dmlzaXRlZCB7XG5cdGNvbG9yOiNhNjIzOGY7XG5cdHRleHQtZGVjb3JhdGlvbjpub25lO1xufVxuXG4uZGVtb0l0ZW1TdW1tYXJ5Q29udGFpbmVyIHtcblx0Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGQ7XG59XG5cbi5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgaDEge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7XG5cdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2O1xuXHRjb2xvcjojNzM4ZmI5O1xuXHRtYXJnaW46MXB4O1xuXHRwYWRkaW5nOjAuNWVtO1xuXHRmb250LWZhbWlseTpcIkx1Y2lkYSBHcmFuZGVcIiwgXCJUYWhvbWFcIiwgc2VyaWY7XG5cdGZvbnQtc2l6ZToxLjI1ZW07XG5cdGZvbnQtd2VpZ2h0Om5vcm1hbDtcbn1cblxuLmRlbW9JdGVtU3VtbWFyeUNvbnRhaW5lciBoMSAucGFja2FnZVN1bW1hcnkge1xuXHRkaXNwbGF5OmJsb2NrO1xuXHRjb2xvcjojMDAwO1xuXHRmb250LXNpemU6MTBweDtcblx0bWFyZ2luLXRvcDoycHg7XG59XG5cbi5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgLmRlbW9JdGVtU3VtbWFyeXtcblx0cGFkZGluZzoxZW07XG59XG5cbi5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgLmRlbW9JdGVtU3VtbWFyeSBwIHtcblx0Zm9udC1zaXplOjAuODVlbTtcblx0cGFkZGluZzowO1xuXHRtYXJnaW46MDtcbn1cblxuLmRlbW9JdGVtVmlldyB7XG5cdHRleHQtYWxpZ246cmlnaHQ7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgImRlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9JdGVtLmNzcyIpLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzLmRvbU5vZGVDbGFzcyk7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuc3VtbWFyeUJveE5vZGUsIHRoaXMuc3VtbWFyeUJveENsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5zY3JlZW5zaG90VGROb2RlLCB0aGlzLnNjcmVlbnNob3RUZENsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5zdW1tYXJ5Q29udGFpbmVyTm9kZSwgdGhpcy5zdW1tYXJ5Q29udGFpbmVyQ2xhc3MpOworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLnN1bW1hcnlOb2RlLCB0aGlzLnN1bW1hcnlDbGFzcyk7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMudmlld0RlbW9MaW5rTm9kZSwgdGhpcy52aWV3RGVtb0xpbmtDbGFzcyk7CisJdGhpcy5uYW1lTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm5hbWUpKTsKKwl0aGlzLmRlc2NyaXB0aW9uTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmRlc2NyaXB0aW9uKSk7CisJdGhpcy50aHVtYm5haWxJbWFnZU5vZGUuc3JjID0gdGhpcy50aHVtYm5haWw7CisJdGhpcy50aHVtYm5haWxJbWFnZU5vZGUubmFtZSA9IHRoaXMubmFtZTsKKwl0aGlzLnZpZXdEZW1vSW1hZ2VOb2RlLnNyYyA9IHRoaXMudmlld0RlbW9JbWFnZTsKKwl0aGlzLnZpZXdEZW1vSW1hZ2VOb2RlLm5hbWUgPSB0aGlzLm5hbWU7Cit9LCBvblNlbGVjdERlbW86ZnVuY3Rpb24gKCkgeworfX0sICIiLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5kZW1vID0gIiI7CisJdGhpcy5kb21Ob2RlQ2xhc3MgPSAiZGVtb0l0ZW1XcmFwcGVyIjsKKwl0aGlzLnN1bW1hcnlCb3hOb2RlID0gIiI7CisJdGhpcy5zdW1tYXJ5Qm94Q2xhc3MgPSAiZGVtb0l0ZW1TdW1tYXJ5Qm94IjsKKwl0aGlzLm5hbWVOb2RlID0gIiI7CisJdGhpcy50aHVtYm5haWxJbWFnZU5vZGUgPSAiIjsKKwl0aGlzLnZpZXdEZW1vSW1hZ2VOb2RlID0gIiI7CisJdGhpcy5zY3JlZW5zaG90VGROb2RlID0gIiI7CisJdGhpcy5zY3JlZW5zaG90VGRDbGFzcyA9ICJkZW1vSXRlbVNjcmVlbnNob3QiOworCXRoaXMuc3VtbWFyeUNvbnRhaW5lck5vZGUgPSAiIjsKKwl0aGlzLnN1bW1hcnlDb250YWluZXJDbGFzcyA9ICJkZW1vSXRlbVN1bW1hcnlDb250YWluZXIiOworCXRoaXMuc3VtbWFyeU5vZGUgPSAiIjsKKwl0aGlzLnN1bW1hcnlDbGFzcyA9ICJkZW1vSXRlbVN1bW1hcnkiOworCXRoaXMudmlld0RlbW9MaW5rTm9kZSA9ICIiOworCXRoaXMudmlld0RlbW9MaW5rQ2xhc3MgPSAiZGVtb0l0ZW1WaWV3IjsKKwl0aGlzLmRlc2NyaXB0aW9uTm9kZSA9ICIiOworCXRoaXMubmFtZSA9ICJTb21lIERlbW8iOworCXRoaXMuZGVzY3JpcHRpb24gPSAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBkZW1vLiI7CisJdGhpcy50aHVtYm5haWwgPSAiaW1hZ2VzL3Rlc3RfdGh1bWIuZ2lmIjsKKwl0aGlzLnZpZXdEZW1vSW1hZ2UgPSAiaW1hZ2VzL3ZpZXdEZW1vLnBuZyI7Cit9KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL0RlbW9OYXZpZ2F0b3IuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvRGVtb05hdmlnYXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA0YTFjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL0RlbW9OYXZpZ2F0b3IuanMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LmRlbW9FbmdpbmUuRGVtb05hdmlnYXRvciIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQnV0dG9uIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LmRlbW9FbmdpbmUuRGVtb0l0ZW0iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJteS53aWRnZXQuZGVtb0VuZ2luZS5EZW1vTmF2aWdhdG9yIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwge3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGRvam9BdHRhY2hQb2ludD1cImRvbU5vZGVcIj5cblx0PHRhYmxlIHdpZHRoPVwiMTAwJVwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiNVwiPlxuXHRcdDx0Ym9keT5cblx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJuYXZpZ2F0aW9uQ29udGFpbmVyXCI+XG5cdFx0XHRcdDx0ZCBkb2pvQXR0YWNoUG9pbnQ9XCJjYXRlZ29yaWVzTm9kZVwiIHZhbGlnbj1cInRvcFwiIHdpZHRoPVwiMSVcIj5cblx0XHRcdFx0XHQ8aDE+Q2F0ZWdvcmllczwvaDE+XG5cdFx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJjYXRlZ29yaWVzQnV0dG9uc05vZGVcIj48L2Rpdj5cblx0XHRcdFx0PC90ZD5cblxuXHRcdFx0XHQ8dGQgZG9qb0F0dGFjaFBvaW50PVwiZGVtb0xpc3ROb2RlXCIgdmFsaWduPVwidG9wXCI+XG5cdFx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkZW1vTGlzdFdyYXBwZXJOb2RlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cImRlbW9MaXN0Q29udGFpbmVyTm9kZVwiPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdFx0PHRyPlxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjJcIj5cblx0XHRcdFx0XHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cImRlbW9Ob2RlXCI+PC9kaXY+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdDwvdGJvZHk+XG5cdDwvdGFibGU+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZGVtb05hdmlnYXRvckxpc3RXcmFwcGVyIHtcblx0Ym9yZGVyOjFweCBzb2xpZCAjZGNkYmRiO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiNmOGY4Zjg7XG5cdHBhZGRpbmc6MnB4O1xufVxuXG4uZGVtb05hdmlnYXRvckxpc3RDb250YWluZXIge1xuXHRib3JkZXI6MXB4IHNvbGlkICNmMGYwZjA7XG5cdGJhY2tncm91bmQtY29sb3I6I2ZmZjtcblx0cGFkZGluZzoxZW07XG59XG5cbi5kZW1vTmF2aWdhdG9yIGgxIHtcblx0bWFyZ2luLXRvcDogMHB4O1xuXHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRmb250LXNpemU6IDEuMmVtO1xuXHRib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2E5Y2NmNTtcbn1cblxuLmRlbW9OYXZpZ2F0b3IgLmRvam9CdXR0b24ge1xuXHRtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5kZW1vTmF2aWdhdG9yIC5kb2pvQnV0dG9uIC5kb2pvQnV0dG9uQ29udGVudHMge1xuXHRmb250LXNpemU6IDEuMWVtO1xuXHR3aWR0aDogMTAwcHg7XG5cdGNvbG9yOiBibGFjaztcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgImRlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9OYXZpZ2F0b3IuY3NzIiksIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsIHRoaXMuZG9tTm9kZUNsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kZW1vTGlzdFdyYXBwZXJOb2RlLCB0aGlzLmRlbW9MaXN0V3JhcHBlckNsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kZW1vTGlzdENvbnRhaW5lck5vZGUsIHRoaXMuZGVtb0xpc3RDb250YWluZXJDbGFzcyk7CisJaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkJZG9qby5kZWJ1ZygicmVuZGVyIGllIik7CisJCWRvam8uaHRtbC5oaWRlKHRoaXMuZGVtb0xpc3RXcmFwcGVyTm9kZSk7CisJfSBlbHNlIHsKKwkJZG9qby5kZWJ1ZygicmVuZGVyIG5vbi1pZSIpOworCQlkb2pvLmxmeC5odG1sLmZhZGVIaWRlKHRoaXMuZGVtb0xpc3RXcmFwcGVyTm9kZSwgMCkucGxheSgpOworCX0KKwl0aGlzLmdldFJlZ2lzdHJ5KHRoaXMuZGVtb1JlZ2lzdHJ5VXJsKTsKKwl0aGlzLmRlbW9Db250YWluZXIgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkRlbW9Db250YWluZXIiLCB7cmV0dXJuSW1hZ2U6dGhpcy5yZXR1cm5JbWFnZX0sIHRoaXMuZGVtb05vZGUpOworCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRlbW9Db250YWluZXIsICJyZXR1cm5Ub0RlbW9zIiwgdGhpcywgInJldHVyblRvRGVtb3MiKTsKKwl0aGlzLmRlbW9Db250YWluZXIuaGlkZSgpOworfSwgcmV0dXJuVG9EZW1vczpmdW5jdGlvbiAoKSB7CisJdGhpcy5kZW1vQ29udGFpbmVyLmhpZGUoKTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQlkb2pvLmRlYnVnKCJyZW5kZXIgaWUiKTsKKwkJZG9qby5odG1sLnNob3codGhpcy5uYXZpZ2F0aW9uQ29udGFpbmVyKTsKKwl9IGVsc2UgeworCQlkb2pvLmRlYnVnKCJyZW5kZXIgbm9uLWllIik7CisJCWRvam8ubGZ4Lmh0bWwuZmFkZVNob3codGhpcy5uYXZpZ2F0aW9uQ29udGFpbmVyLCAyNTApLnBsYXkoKTsKKwl9CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5jYXRlZ29yaWVzQ2hpbGRyZW4sIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbiAoY2hpbGQpIHsKKwkJY2hpbGQuY2hlY2tTaXplKCk7CisJfSkpOworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZGVtb0xpc3RDaGlsZHJlbiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uIChjaGlsZCkgeworCQljaGlsZC5jaGVja1NpemUoKTsKKwl9KSk7Cit9LCBzaG93OmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuc2hvdyh0aGlzLmRvbU5vZGUpOworCWRvam8uaHRtbC5zZXRPcGFjaXR5KHRoaXMuZG9tTm9kZSwgMSk7CisJZG9qby5odG1sLnNldE9wYWNpdHkodGhpcy5uYXZpZ2F0aW9uQ29udGFpbmVyLCAxKTsKKwlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNhdGVnb3JpZXNDaGlsZHJlbiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uIChjaGlsZCkgeworCQljaGlsZC5jaGVja1NpemUoKTsKKwl9KSk7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5kZW1vTGlzdENoaWxkcmVuLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKGNoaWxkKSB7CisJCWNoaWxkLmNoZWNrU2l6ZSgpOworCX0pKTsKK30sIGdldFJlZ2lzdHJ5OmZ1bmN0aW9uICh1cmwpIHsKKwlkb2pvLmlvLmJpbmQoe3VybDp1cmwsIGxvYWQ6ZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMucHJvY2Vzc1JlZ2lzdHJ5KSwgbWltZXR5cGU6InRleHQvanNvbiJ9KTsKK30sIHByb2Nlc3NSZWdpc3RyeTpmdW5jdGlvbiAodHlwZSwgcmVnaXN0cnksIGUpIHsKKwlkb2pvLmRlYnVnKCJQcm9jZXNzaW5nIFJlZ2lzdHJ5Iik7CisJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMucmVnaXN0cnkubmF2aWdhdGlvbiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMuYWRkQ2F0ZWdvcnkpKTsKK30sIGFkZENhdGVnb3J5OmZ1bmN0aW9uIChjYXRlZ29yeSkgeworCXZhciBuZXdDYXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkJ1dHRvbiIsIHtjYXB0aW9uOmNhdGVnb3J5Lm5hbWV9KTsKKwlpZiAoIWRvam8ubGFuZy5pc09iamVjdCh0aGlzLnJlZ2lzdHJ5LmNhdGVnb3JpZXMpKSB7CisJCXRoaXMucmVnaXN0cnkuY2F0ZWdvcmllcyA9IGZ1bmN0aW9uICgpIHsKKwkJfTsKKwl9CisJdGhpcy5yZWdpc3RyeS5jYXRlZ29yaWVzW2NhdGVnb3J5Lm5hbWVdID0gY2F0ZWdvcnk7CisJdGhpcy5jYXRlZ29yaWVzQ2hpbGRyZW4ucHVzaChuZXdDYXQpOworCXRoaXMuY2F0ZWdvcmllc0J1dHRvbnNOb2RlLmFwcGVuZENoaWxkKG5ld0NhdC5kb21Ob2RlKTsKKwluZXdDYXQuZG9tTm9kZS5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeS5uYW1lOworCWRvam8uZXZlbnQuY29ubmVjdChuZXdDYXQsICJvbkNsaWNrIiwgdGhpcywgIm9uU2VsZWN0Q2F0ZWdvcnkiKTsKK30sIGFkZERlbW86ZnVuY3Rpb24gKGRlbW9OYW1lKSB7CisJdmFyIGRlbW8gPSB0aGlzLnJlZ2lzdHJ5LmRlZmluaXRpb25zW2RlbW9OYW1lXTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQlkb2pvLmh0bWwuc2hvdyh0aGlzLmRlbW9MaXN0V3JhcHBlck5vZGUpOworCX0gZWxzZSB7CisJCWRvam8ubGZ4Lmh0bWwuZmFkZVNob3codGhpcy5kZW1vTGlzdFdyYXBwZXJOb2RlLCAyNTApLnBsYXkoKTsKKwl9CisJdmFyIG5ld0RlbW8gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkRlbW9JdGVtIiwge3ZpZXdEZW1vSW1hZ2U6dGhpcy52aWV3RGVtb0ltYWdlLCBuYW1lOmRlbW9OYW1lLCBkZXNjcmlwdGlvbjpkZW1vLmRlc2NyaXB0aW9uLCB0aHVtYm5haWw6ZGVtby50aHVtYm5haWx9KTsKKwl0aGlzLmRlbW9MaXN0Q2hpbGRyZW4ucHVzaChuZXdEZW1vKTsKKwl0aGlzLmRlbW9MaXN0Q29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChuZXdEZW1vLmRvbU5vZGUpOworCWRvam8uZXZlbnQuY29ubmVjdChuZXdEZW1vLCAib25TZWxlY3REZW1vIiwgdGhpcywgIm9uU2VsZWN0RGVtbyIpOworfSwgb25TZWxlY3RDYXRlZ29yeTpmdW5jdGlvbiAoZSkgeworCWNhdE5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuY2F0ZWdvcnlOYW1lOworCWRvam8uZGVidWcoIlNlbGVjdGVkIENhdGVnb3J5OiAiICsgY2F0TmFtZSk7CisJZG9qby5sYW5nLmZvckVhY2godGhpcy5kZW1vTGlzdENoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKKwkJY2hpbGQuZGVzdHJveSgpOworCX0pOworCXRoaXMuZGVtb0xpc3RDaGlsZHJlbiA9IFtdOworCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMucmVnaXN0cnkuY2F0ZWdvcmllc1tjYXROYW1lXS5kZW1vcywgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uIChkZW1vTmFtZSkgeworCQl0aGlzLmFkZERlbW8oZGVtb05hbWUpOworCX0pKTsKK30sIG9uU2VsZWN0RGVtbzpmdW5jdGlvbiAoZSkgeworCWRvam8uZGVidWcoIkRlbW8gU2VsZWN0ZWQ6ICIgKyBlLnRhcmdldC5uYW1lKTsKKwlpZiAoZG9qby5yZW5kZXIuaHRtbC5pZSkgeworCQlkb2pvLmRlYnVnKCJyZW5kZXIgaWUiKTsKKwkJZG9qby5odG1sLmhpZGUodGhpcy5uYXZpZ2F0aW9uQ29udGFpbmVyKTsKKwkJdGhpcy5kZW1vQ29udGFpbmVyLnNob3coKTsKKwkJdGhpcy5kZW1vQ29udGFpbmVyLnNob3dEZW1vKCk7CisJfSBlbHNlIHsKKwkJZG9qby5kZWJ1ZygicmVuZGVyIG5vbi1pZSIpOworCQlkb2pvLmxmeC5odG1sLmZhZGVIaWRlKHRoaXMubmF2aWdhdGlvbkNvbnRhaW5lciwgMjUwLCBudWxsLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24gKCkgeworCQkJdGhpcy5kZW1vQ29udGFpbmVyLnNob3coKTsKKwkJCXRoaXMuZGVtb0NvbnRhaW5lci5zaG93RGVtbygpOworCQl9KSkucGxheSgpOworCX0KKwl0aGlzLmRlbW9Db250YWluZXIubG9hZERlbW8odGhpcy5yZWdpc3RyeS5kZWZpbml0aW9uc1tlLnRhcmdldC5uYW1lXS51cmwpOworCXRoaXMuZGVtb0NvbnRhaW5lci5zZXROYW1lKGUudGFyZ2V0Lm5hbWUpOworCXRoaXMuZGVtb0NvbnRhaW5lci5zZXRTdW1tYXJ5KHRoaXMucmVnaXN0cnkuZGVmaW5pdGlvbnNbZS50YXJnZXQubmFtZV0uZGVzY3JpcHRpb24pOworfX0sICIiLCBmdW5jdGlvbiAoKSB7CisJdGhpcy5kZW1vUmVnaXN0cnlVcmwgPSAiZGVtb1JlZ2lzdHJ5Lmpzb24iOworCXRoaXMucmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7CisJfTsKKwl0aGlzLmNhdGVnb3JpZXNOb2RlID0gIiI7CisJdGhpcy5jYXRlZ29yaWVzQnV0dG9uc05vZGUgPSAiIjsKKwl0aGlzLm5hdmlnYXRpb25Db250YWluZXIgPSAiIjsKKwl0aGlzLmRvbU5vZGVDbGFzcyA9ICJkZW1vTmF2aWdhdG9yIjsKKwl0aGlzLmRlbW9Ob2RlID0gIiI7CisJdGhpcy5kZW1vQ29udGFpbmVyID0gIiI7CisJdGhpcy5kZW1vTGlzdFdyYXBwZXJOb2RlID0gIiI7CisJdGhpcy5kZW1vTGlzdFdyYXBwZXJDbGFzcyA9ICJkZW1vTmF2aWdhdG9yTGlzdFdyYXBwZXIiOworCXRoaXMuZGVtb0xpc3RDb250YWluZXJDbGFzcyA9ICJkZW1vTmF2aWdhdG9yTGlzdENvbnRhaW5lciI7CisJdGhpcy5yZXR1cm5JbWFnZSA9ICJpbWFnZXMvZG9qb0RlbW9zLmdpZiI7CisJdGhpcy52aWV3RGVtb0ltYWdlID0gImltYWdlcy92aWV3RGVtby5wbmciOworCXRoaXMuZGVtb0xpc3RDaGlsZHJlbiA9IFtdOworCXRoaXMuY2F0ZWdvcmllc0NoaWxkcmVuID0gW107Cit9KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL0RlbW9QYW5lLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL0RlbW9QYW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDhmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvRGVtb1BhbmUuanMKQEAgLTAsMCArMSwzMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5EZW1vUGFuZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgibXkud2lkZ2V0LmRlbW9FbmdpbmUuRGVtb1BhbmUiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7dGVtcGxhdGVTdHJpbmc6IjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiZG9tTm9kZVwiPlxuXHQ8aWZyYW1lIGRvam9BdHRhY2hQb2ludD1cImRlbW9Ob2RlXCI+PC9pZnJhbWU+XG48L2Rpdj5cbiIsIHRlbXBsYXRlQ3NzU3RyaW5nOiIuZGVtb1BhbmUge1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRwYWRkaW5nOiAwcHg7XG5cdG1hcmdpbjogMHB4O1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGVtb1BhbmUgaWZyYW1lIHtcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0Ym9yZGVyOiAwcHg7XG5cdGJvcmRlcjogbm9uZTtcblx0b3ZlcmZsb3c6IGF1dG87XG5cdHBhZGRpbmc6IDBweDtcblx0bWFyZ2luOjBweDtcblx0YmFja2dyb3VuZDogI2ZmZmZmZjtcbn1cbiIsIHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgImRlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9QYW5lLmNzcyIpLCBwb3N0Q3JlYXRlOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCB0aGlzLmRvbU5vZGVDbGFzcyk7CisJZG9qby5kZWJ1ZygiUG9zdENyZWF0ZSIpOworCXRoaXMuX2xhdW5jaERlbW8oKTsKK30sIF9sYXVuY2hEZW1vOmZ1bmN0aW9uICgpIHsKKwlkb2pvLmRlYnVnKCJMYXVuY2hpbmcgRGVtbyIpOworCWRvam8uZGVidWcodGhpcy5kZW1vTm9kZSk7CisJdGhpcy5kZW1vTm9kZS5zcmMgPSB0aGlzLmhyZWY7Cit9LCBzZXRIcmVmOmZ1bmN0aW9uICh1cmwpIHsKKwl0aGlzLmhyZWYgPSB1cmw7CisJdGhpcy5fbGF1bmNoRGVtbygpOworfX0sICIiLCBmdW5jdGlvbiAoKSB7CisJZG9qby5kZWJ1ZygiRGVtb1BhbmUgSW5pdCIpOworCXRoaXMuZG9tTm9kZUNsYXNzID0gImRlbW9QYW5lIjsKKwl0aGlzLmRlbW9Ob2RlID0gIiI7CisJdGhpcy5ocmVmID0gIiI7Cit9KTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL1NvdXJjZVBhbmUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvU291cmNlUGFuZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGNhNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL1NvdXJjZVBhbmUuanMKQEAgLTAsMCArMSwzNSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5Tb3VyY2VQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgibXkud2lkZ2V0LmRlbW9FbmdpbmUuU291cmNlUGFuZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHt0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkb21Ob2RlXCI+XG5cdDx0ZXh0YXJlYSBkb2pvQXR0YWNoUG9pbnQ9XCJzb3VyY2VOb2RlXCIgcm93cz1cIjEwMCVcIj48L3RleHRhcmVhPlxuPC9kaXY+XG4iLCB0ZW1wbGF0ZUNzc1N0cmluZzoiLnNvdXJjZVBhbmUge1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRwYWRkaW5nOiAwcHg7XG5cdG1hcmdpbjogMHB4O1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uc291cmNlUGFuZSB0ZXh0YXJlYXtcblx0d2lkdGg6IDEwMCU7XG5cdGhlaWdodDogMTAwJTtcblx0Ym9yZGVyOiAwcHg7XG5cdG92ZXJmbG93OiBhdXRvO1xuXHRwYWRkaW5nOiAwcHg7XG5cdG1hcmdpbjowcHg7XG59XG5cbiogaHRtbCAuc291cmNlUGFuZSB7XG5cdG92ZXJmbG93OiBhdXRvO1xufVxuIiwgdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAiZGVtb0VuZ2luZS90ZW1wbGF0ZXMvU291cmNlUGFuZS5jc3MiKSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgdGhpcy5kb21Ob2RlQ2xhc3MpOworCWRvam8uZGVidWcoIlBvc3RDcmVhdGUiKTsKK30sIGdldFNvdXJjZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuaHJlZikgeworCQlkb2pvLmlvLmJpbmQoe3VybDp0aGlzLmhyZWYsIGxvYWQ6ZG9qby5sYW5nLmhpdGNoKHRoaXMsICJmaWxsSW5Tb3VyY2UiKSwgbWltZXR5cGU6InRleHQvcGxhaW4ifSk7CisJfQorfSwgZmlsbEluU291cmNlOmZ1bmN0aW9uICh0eXBlLCBzb3VyY2UsIGUpIHsKKwl0aGlzLnNvdXJjZU5vZGUudmFsdWUgPSBzb3VyY2U7Cit9LCBzZXRIcmVmOmZ1bmN0aW9uICh1cmwpIHsKKwl0aGlzLmhyZWYgPSB1cmw7CisJdGhpcy5nZXRTb3VyY2UoKTsKK319LCAiIiwgZnVuY3Rpb24gKCkgeworCWRvam8uZGVidWcoIlNvdXJjZVBhbmUgSW5pdCIpOworCXRoaXMuZG9tTm9kZUNsYXNzID0gInNvdXJjZVBhbmUiOworCXRoaXMuc291cmNlTm9kZSA9ICIiOworCXRoaXMuaHJlZiA9ICIiOworfSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS9fX3BhY2thZ2VfXy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFhMTZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHticm93c2VyOlsiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5EZW1vSXRlbSIsICJkb2pvLndpZGdldC5kZW1vRW5naW5lLkRlbW9OYXZpZ2F0b3IiLCAiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5EZW1vUGFuZSIsICJkb2pvLndpZGdldC5kZW1vRW5naW5lLlNvdXJjZVBhbmUiLCAiZG9qby53aWRnZXQuZGVtb0VuZ2luZS5EZW1vQ29udGFpbmVyIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuZGVtb0VuZ2luZS4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0NvbnRhaW5lci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9Db250YWluZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDk3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9Db250YWluZXIuY3NzCkBAIC0wLDAgKzEsMzkgQEAKKy5kZW1vQ29udGFpbmVyeworCXdpZHRoOiAxMDAlOworCWhlaWdodDogMTAwJTsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7Cit9CisKKy5kZW1vQ29udGFpbmVyIC5yZXR1cm4geworCWN1cnNvcjogcG9pbnRlcjsKK30KKworLmRlbW9Db250YWluZXIgc3BhbiB7CisJbWFyZ2luLXJpZ2h0OiAxMHB4OworCWN1cnNvcjogcG9pbnRlcjsKK30KKworLmRlbW9Db250YWluZXIgLnNlbGVjdGVkIHsKKwlib3JkZXItYm90dG9tOiA1cHggc29saWQgIzk1YmZmZjsKK30KKworLmRlbW9Db250YWluZXIgdGFibGUgeworCWJhY2tncm91bmQ6ICNmNWY1ZjU7CisJd2lkdGg6IDEwMCU7CisJaGVpZ2h0OiAxMDAlOworfQorCisuZGVtb0NvbnRhaW5lclRhYnMgeworCXdpZHRoOiAxMDAlOworCWhlaWdodDogNDAwcHg7Cit9CisKKy5kZW1vQ29udGFpbmVyVGFicyAuZG9qb1RhYkxhYmVscy10b3AgeworCWRpc3BsYXk6IG5vbmU7Cit9CisKKy5kZW1vQ29udGFpbmVyVGFicyAuZG9qb1RhYlBhbmVXcmFwcGVyIHsKKwlib3JkZXI6IDBweDsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vQ29udGFpbmVyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9Db250YWluZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVlODNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vQ29udGFpbmVyLmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImRvbU5vZGUiPgorCTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1Ij4KKwkJPHRib2R5PgorCQkJPHRyIGRvam9BdHRhY2hQb2ludD0iaGVhZGVyTm9kZSI+CisJCQkJPHRkIGRvam9BdHRhY2hQb2ludD0icmV0dXJuTm9kZSIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSIxJSI+CisJCQkJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJyZXR1cm5JbWFnZU5vZGUiIGRvam9BdHRhY2hFdmVudD0ib25jbGljazogcmV0dXJuVG9EZW1vcyIvPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8aDEgZG9qb0F0dGFjaFBvaW50PSJkZW1vTmFtZU5vZGUiPjwvaDE+CisJCQkJCTxwIGRvam9BdHRhY2hQb2ludD0ic3VtbWFyeU5vZGUiPjwvcD4KKwkJCQk8L3RkPgorCQkJCTx0ZCBkb2pvQXR0YWNoUG9pbnQ9InRhYkNvbnRyb2xOb2RlIiB2YWxpZ249Im1pZGRsZSIgYWxpZ249InJpZ2h0IiBub3dyYXA+CisJCQkJCTxzcGFuIGRvam9BdHRhY2hQb2ludD0ic291cmNlQnV0dG9uTm9kZSIgZG9qb0F0dGFjaEV2ZW50PSJvbmNsaWNrOiBzaG93U291cmNlIj5zb3VyY2U8L3NwYW4+CisJCQkJCTxzcGFuIGRvam9BdHRhY2hQb2ludD0iZGVtb0J1dHRvbk5vZGUiIGRvam9BdHRhY2hFdmVudD0ib25jbGljazogc2hvd0RlbW8iPmRlbW88L3NwYW4+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkIGNvbHNwYW49IjMiPgorCQkJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0idGFiTm9kZSI+CisJCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQk8L3Rib2R5PgorCTwvdGFibGU+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0l0ZW0uY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vSXRlbS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5OTE1OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0l0ZW0uY3NzCkBAIC0wLDAgKzEsNTggQEAKKy5kZW1vSXRlbVN1bW1hcnlCb3ggeworCWJhY2tncm91bmQ6ICNlZmVmZWY7CisJYm9yZGVyOjFweCBzb2xpZCAjZGFlM2VlOworfQorCisuZGVtb0l0ZW1TY3JlZW5zaG90IHsKKwlwYWRkaW5nOjAuNjVlbTsKKwl3aWR0aDoxNzVweDsKKwlib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNmYWZhZmE7CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJY3Vyc29yOiBwb2ludGVyOworfQorCisuZGVtb0l0ZW1XcmFwcGVyeworCW1hcmdpbi1ib3R0b206MWVtOworfQorCisuZGVtb0l0ZW1XcmFwcGVyIGE6bGluaywgLmRlbW9JdGVtV3JhcHBlciBhOnZpc2l0ZWQgeworCWNvbG9yOiNhNjIzOGY7CisJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cit9CisKKy5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgeworCWJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZGRkOworfQorCisuZGVtb0l0ZW1TdW1tYXJ5Q29udGFpbmVyIGgxIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTY7CisJY29sb3I6IzczOGZiOTsKKwltYXJnaW46MXB4OworCXBhZGRpbmc6MC41ZW07CisJZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCAiVGFob21hIiwgc2VyaWY7CisJZm9udC1zaXplOjEuMjVlbTsKKwlmb250LXdlaWdodDpub3JtYWw7Cit9CisKKy5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgaDEgLnBhY2thZ2VTdW1tYXJ5IHsKKwlkaXNwbGF5OmJsb2NrOworCWNvbG9yOiMwMDA7CisJZm9udC1zaXplOjEwcHg7CisJbWFyZ2luLXRvcDoycHg7Cit9CisKKy5kZW1vSXRlbVN1bW1hcnlDb250YWluZXIgLmRlbW9JdGVtU3VtbWFyeXsKKwlwYWRkaW5nOjFlbTsKK30KKworLmRlbW9JdGVtU3VtbWFyeUNvbnRhaW5lciAuZGVtb0l0ZW1TdW1tYXJ5IHAgeworCWZvbnQtc2l6ZTowLjg1ZW07CisJcGFkZGluZzowOworCW1hcmdpbjowOworfQorCisuZGVtb0l0ZW1WaWV3IHsKKwl0ZXh0LWFsaWduOnJpZ2h0OworCWN1cnNvcjogcG9pbnRlcjsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0l0ZW0uaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb0l0ZW0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjAzNzkxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vSXRlbS5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJkb21Ob2RlIj4KKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0ic3VtbWFyeUJveE5vZGUiPgorCQk8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisJCQk8dGJvZHk+CisJCQkJPHRyPgorCQkJCQk8dGQgZG9qb0F0dGFjaFBvaW50PSJzY3JlZW5zaG90VGROb2RlIiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKwkJCQkJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJ0aHVtYm5haWxJbWFnZU5vZGUiIGRvam9BdHRhY2hFdmVudD0ib25jbGljazogb25TZWxlY3REZW1vIiAvPgorCQkJCQk8L3RkPgorCQkJCQk8dGQgZG9qb0F0dGFjaFBvaW50PSJzdW1tYXJ5Q29udGFpbmVyTm9kZSIgdmFsaWduPSJ0b3AiPgorCQkJCQkJPGgxIGRvam9BdHRhY2hQb2ludD0ibmFtZU5vZGUiPgorCQkJCQkJPC9oMT4KKwkJCQkJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJzdW1tYXJ5Tm9kZSI+CisJCQkJCQkJPHAgZG9qb0F0dGFjaFBvaW50PSJkZXNjcmlwdGlvbk5vZGUiPjwvcD4KKwkJCQkJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0idmlld0RlbW9MaW5rTm9kZSI+PGltZyBkb2pvQXR0YWNoUG9pbnQ9InZpZXdEZW1vSW1hZ2VOb2RlIi8gZG9qb0F0dGFjaEV2ZW50PSJvbmNsaWNrOiBvblNlbGVjdERlbW8iPjwvZGl2PgorCQkJCQkJPC9kaXY+CisJCQkJCTwvdGQ+CisJCQkJPC90cj4KKwkJCTwvdGJvZHk+CisJCTwvdGFibGU+CisJPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb05hdmlnYXRvci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9OYXZpZ2F0b3IuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMmFhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9OYXZpZ2F0b3IuY3NzCkBAIC0wLDAgKzEsMjggQEAKKy5kZW1vTmF2aWdhdG9yTGlzdFdyYXBwZXIgeworCWJvcmRlcjoxcHggc29saWQgI2RjZGJkYjsKKwliYWNrZ3JvdW5kLWNvbG9yOiNmOGY4Zjg7CisJcGFkZGluZzoycHg7Cit9CisKKy5kZW1vTmF2aWdhdG9yTGlzdENvbnRhaW5lciB7CisJYm9yZGVyOjFweCBzb2xpZCAjZjBmMGYwOworCWJhY2tncm91bmQtY29sb3I6I2ZmZjsKKwlwYWRkaW5nOjFlbTsKK30KKworLmRlbW9OYXZpZ2F0b3IgaDEgeworCW1hcmdpbi10b3A6IDBweDsKKwltYXJnaW4tYm90dG9tOiAxMHB4OworCWZvbnQtc2l6ZTogMS4yZW07CisJYm9yZGVyLWJvdHRvbToxcHggZG90dGVkICNhOWNjZjU7Cit9CisKKy5kZW1vTmF2aWdhdG9yIC5kb2pvQnV0dG9uIHsKKwltYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKy5kZW1vTmF2aWdhdG9yIC5kb2pvQnV0dG9uIC5kb2pvQnV0dG9uQ29udGVudHMgeworCWZvbnQtc2l6ZTogMS4xZW07CisJd2lkdGg6IDEwMHB4OworCWNvbG9yOiBibGFjazsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb05hdmlnYXRvci5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vTmF2aWdhdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwNDQwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb05hdmlnYXRvci5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJkb21Ob2RlIj4KKwk8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+CisJCTx0Ym9keT4KKwkJCTx0ciBkb2pvQXR0YWNoUG9pbnQ9Im5hdmlnYXRpb25Db250YWluZXIiPgorCQkJCTx0ZCBkb2pvQXR0YWNoUG9pbnQ9ImNhdGVnb3JpZXNOb2RlIiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKwkJCQkJPGgxPkNhdGVnb3JpZXM8L2gxPgorCQkJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0iY2F0ZWdvcmllc0J1dHRvbnNOb2RlIj48L2Rpdj4KKwkJCQk8L3RkPgorCisJCQkJPHRkIGRvam9BdHRhY2hQb2ludD0iZGVtb0xpc3ROb2RlIiB2YWxpZ249InRvcCI+CisJCQkJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJkZW1vTGlzdFdyYXBwZXJOb2RlIj4KKwkJCQkJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJkZW1vTGlzdENvbnRhaW5lck5vZGUiPgorCQkJCQkJPC9kaXY+CisJCQkJCTwvZGl2PgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0ZCBjb2xzcGFuPSIyIj4KKwkJCQkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImRlbW9Ob2RlIj48L2Rpdj4KKwkJCQk8L3RkPgorCQkJPC90cj4KKwkJPC90Ym9keT4KKwk8L3RhYmxlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9QYW5lLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvRGVtb1BhbmUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjgzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9QYW5lLmNzcwpAQCAtMCwwICsxLDE4IEBACisuZGVtb1BhbmUgeworCXdpZHRoOiAxMDAlOworCWhlaWdodDogMTAwJTsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7CisJb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworLmRlbW9QYW5lIGlmcmFtZSB7CisJd2lkdGg6IDEwMCU7CisJaGVpZ2h0OiAxMDAlOworCWJvcmRlcjogMHB4OworCWJvcmRlcjogbm9uZTsKKwlvdmVyZmxvdzogYXV0bzsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOjBweDsKKwliYWNrZ3JvdW5kOiAjZmZmZmZmOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vUGFuZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9EZW1vUGFuZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL0RlbW9QYW5lLmh0bWwKQEAgLTAsMCArMSwzIEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iZG9tTm9kZSI+CisJPGlmcmFtZSBkb2pvQXR0YWNoUG9pbnQ9ImRlbW9Ob2RlIj48L2lmcmFtZT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9Tb3VyY2VQYW5lLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvU291cmNlUGFuZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3OGM4MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvU291cmNlUGFuZS5jc3MKQEAgLTAsMCArMSwyMCBAQAorLnNvdXJjZVBhbmUgeworCXdpZHRoOiAxMDAlOworCWhlaWdodDogMTAwJTsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7CisJb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworLnNvdXJjZVBhbmUgdGV4dGFyZWF7CisJd2lkdGg6IDEwMCU7CisJaGVpZ2h0OiAxMDAlOworCWJvcmRlcjogMHB4OworCW92ZXJmbG93OiBhdXRvOworCXBhZGRpbmc6IDBweDsKKwltYXJnaW46MHB4OworfQorCisqIGh0bWwgLnNvdXJjZVBhbmUgeworCW92ZXJmbG93OiBhdXRvOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9Tb3VyY2VQYW5lLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL1NvdXJjZVBhbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTViNTQwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9Tb3VyY2VQYW5lLmh0bWwKQEAgLTAsMCArMSwzIEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iZG9tTm9kZSI+CisJPHRleHRhcmVhIGRvam9BdHRhY2hQb2ludD0ic291cmNlTm9kZSIgcm93cz0iMTAwJSI+PC90ZXh0YXJlYT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9nZW5lcmFsLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvZ2VuZXJhbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkYWU4NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvZGVtb0VuZ2luZS90ZW1wbGF0ZXMvZ2VuZXJhbC5jc3MKQEAgLTAsMCArMSw3MyBAQAorLmRlbW9MaXN0V3JhcHBlciB7CisJYm9yZGVyOjFweCBzb2xpZCAjZGNkYmRiOworCWJhY2tncm91bmQtY29sb3I6I2Y4ZjhmODsKKwlwYWRkaW5nOjJweDsKK30KKworLmRlbW9MaXN0Q29udGFpbmVyIHsKKwlib3JkZXI6MXB4IHNvbGlkICNmMGYwZjA7CisJYmFja2dyb3VuZC1jb2xvcjojZmZmOworCXBhZGRpbmc6MWVtOworfQorCisuZGVtb1N1bW1hcnlCb3ggeworCWJhY2tncm91bmQ6ICNlZmVmZWY7CisJYm9yZGVyOjFweCBzb2xpZCAjZGFlM2VlOworfQorCisuc2NyZWVuc2hvdCB7CisJcGFkZGluZzowLjY1ZW07CisJd2lkdGg6MTc1cHg7CisJYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmFmYWZhOworCXRleHQtYWxpZ246Y2VudGVyOworfQorCisuZGVtb1N1bW1hcnkgeworCW1hcmdpbi1ib3R0b206MWVtOworfQorCisuZGVtb1N1bW1hcnkgYTpsaW5rLCAuZGVtb1N1bW1hcnkgYTp2aXNpdGVkIHsKKwljb2xvcjojYTYyMzhmOworCXRleHQtZGVjb3JhdGlvbjpub25lOworfQorCisuc3VtbWFyeUNvbnRhaW5lciB7CisJYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGQ7Cit9CisKKy5zdW1tYXJ5Q29udGFpbmVyIGgxIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTY7CisJY29sb3I6IzczOGZiOTsKKwltYXJnaW46MXB4OworCXBhZGRpbmc6MC41ZW07CisJZm9udC1mYW1pbHk6Ikx1Y2lkYSBHcmFuZGUiLCAiVGFob21hIiwgc2VyaWY7CisJZm9udC1zaXplOjEuMjVlbTsKKwlmb250LXdlaWdodDpub3JtYWw7Cit9CisKKy5zdW1tYXJ5Q29udGFpbmVyIGgxIC5wYWNrYWdlU3VtbWFyeSB7CisJZGlzcGxheTpibG9jazsKKwljb2xvcjojMDAwOworCWZvbnQtc2l6ZToxMHB4OworCW1hcmdpbi10b3A6MnB4OworfQorCisuc3VtbWFyeUNvbnRhaW5lciAuc3VtbWFyeSB7CisJcGFkZGluZzoxZW07Cit9CisKKy5zdW1tYXJ5Q29udGFpbmVyIC5zdW1tYXJ5IHAgeworCWZvbnQtc2l6ZTowLjg1ZW07CisJcGFkZGluZzowOworCW1hcmdpbjowOworfQorCisucmVmbGVjdGlvbiB7CisJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvZGVtb0JveFJlZmxlY3Rpb24uZ2lmIikgcmVwZWF0LXggdG9wIGxlZnQ7CisJaGVpZ2h0OjI1cHg7Cit9CisKKy52aWV3IHsKKwl0ZXh0LWFsaWduOnJpZ2h0OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9pbWFnZXMvdGVzdF90aHVtYi5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL2ltYWdlcy90ZXN0X3RodW1iLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY4NWU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9pbWFnZXMvdGVzdF90aHVtYi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9pbWFnZXMvdmlld0RlbW8ucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9kZW1vRW5naW5lL3RlbXBsYXRlcy9pbWFnZXMvdmlld0RlbW8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2RlbW9FbmdpbmUvdGVtcGxhdGVzL2ltYWdlcy92aWV3RGVtby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9odG1sL2xheW91dC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvaHRtbC9sYXlvdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxMjA1MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvaHRtbC9sYXlvdXQuanMKQEAgLTAsMCArMSw5NCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmNvbW1vbiIpOworZG9qby5yZXF1aXJlKCJkb2pvLnN0cmluZy5leHRyYXMiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLnN0eWxlIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8ud2lkZ2V0Lmh0bWwubGF5b3V0ID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY2hpbGRyZW4sIGxheW91dFByaW9yaXR5KSB7CisJZG9qby5odG1sLmFkZENsYXNzKGNvbnRhaW5lciwgImRvam9MYXlvdXRDb250YWluZXIiKTsKKwljaGlsZHJlbiA9IGRvam8ubGFuZy5maWx0ZXIoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCwgaWR4KSB7CisJCWNoaWxkLmlkeCA9IGlkeDsKKwkJcmV0dXJuIGRvam8ubGFuZy5pbkFycmF5KFsidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImNsaWVudCIsICJmbG9vZCJdLCBjaGlsZC5sYXlvdXRBbGlnbik7CisJfSk7CisJaWYgKGxheW91dFByaW9yaXR5ICYmIGxheW91dFByaW9yaXR5ICE9ICJub25lIikgeworCQl2YXIgcmFuayA9IGZ1bmN0aW9uIChjaGlsZCkgeworCQkJc3dpdGNoIChjaGlsZC5sYXlvdXRBbGlnbikgeworCQkJICBjYXNlICJmbG9vZCI6CisJCQkJcmV0dXJuIDE7CisJCQkgIGNhc2UgImxlZnQiOgorCQkJICBjYXNlICJyaWdodCI6CisJCQkJcmV0dXJuIChsYXlvdXRQcmlvcml0eSA9PSAibGVmdC1yaWdodCIpID8gMiA6IDM7CisJCQkgIGNhc2UgInRvcCI6CisJCQkgIGNhc2UgImJvdHRvbSI6CisJCQkJcmV0dXJuIChsYXlvdXRQcmlvcml0eSA9PSAibGVmdC1yaWdodCIpID8gMyA6IDI7CisJCQkgIGRlZmF1bHQ6CisJCQkJcmV0dXJuIDQ7CisJCQl9CisJCX07CisJCWNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKwkJCXJldHVybiAocmFuayhhKSAtIHJhbmsoYikpIHx8IChhLmlkeCAtIGIuaWR4KTsKKwkJfSk7CisJfQorCXZhciBmID0ge3RvcDpkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShjb250YWluZXIsICJwYWRkaW5nLXRvcCIsIHRydWUpLCBsZWZ0OmRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKGNvbnRhaW5lciwgInBhZGRpbmctbGVmdCIsIHRydWUpfTsKKwlkb2pvLmxhbmcubWl4aW4oZiwgZG9qby5odG1sLmdldENvbnRlbnRCb3goY29udGFpbmVyKSk7CisJZG9qby5sYW5nLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgeworCQl2YXIgZWxtID0gY2hpbGQuZG9tTm9kZTsKKwkJdmFyIHBvcyA9IGNoaWxkLmxheW91dEFsaWduOworCQl3aXRoIChlbG0uc3R5bGUpIHsKKwkJCWxlZnQgPSBmLmxlZnQgKyAicHgiOworCQkJdG9wID0gZi50b3AgKyAicHgiOworCQkJYm90dG9tID0gImF1dG8iOworCQkJcmlnaHQgPSAiYXV0byI7CisJCX0KKwkJZG9qby5odG1sLmFkZENsYXNzKGVsbSwgImRvam9BbGlnbiIgKyBkb2pvLnN0cmluZy5jYXBpdGFsaXplKHBvcykpOworCQlpZiAoKHBvcyA9PSAidG9wIikgfHwgKHBvcyA9PSAiYm90dG9tIikpIHsKKwkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3goZWxtLCB7d2lkdGg6Zi53aWR0aH0pOworCQkJdmFyIGggPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KGVsbSkuaGVpZ2h0OworCQkJZi5oZWlnaHQgLT0gaDsKKwkJCWlmIChwb3MgPT0gInRvcCIpIHsKKwkJCQlmLnRvcCArPSBoOworCQkJfSBlbHNlIHsKKwkJCQllbG0uc3R5bGUudG9wID0gZi50b3AgKyBmLmhlaWdodCArICJweCI7CisJCQl9CisJCQlpZiAoY2hpbGQub25SZXNpemVkKSB7CisJCQkJY2hpbGQub25SZXNpemVkKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocG9zID09ICJsZWZ0IiB8fCBwb3MgPT0gInJpZ2h0IikgeworCQkJCXZhciB3ID0gZG9qby5odG1sLmdldE1hcmdpbkJveChlbG0pLndpZHRoOworCQkJCWlmIChjaGlsZC5yZXNpemVUbykgeworCQkJCQljaGlsZC5yZXNpemVUbyh3LCBmLmhlaWdodCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG9qby5odG1sLnNldE1hcmdpbkJveChlbG0sIHt3aWR0aDp3LCBoZWlnaHQ6Zi5oZWlnaHR9KTsKKwkJCQl9CisJCQkJZi53aWR0aCAtPSB3OworCQkJCWlmIChwb3MgPT0gImxlZnQiKSB7CisJCQkJCWYubGVmdCArPSB3OworCQkJCX0gZWxzZSB7CisJCQkJCWVsbS5zdHlsZS5sZWZ0ID0gZi5sZWZ0ICsgZi53aWR0aCArICJweCI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocG9zID09ICJmbG9vZCIgfHwgcG9zID09ICJjbGllbnQiKSB7CisJCQkJCWlmIChjaGlsZC5yZXNpemVUbykgeworCQkJCQkJY2hpbGQucmVzaXplVG8oZi53aWR0aCwgZi5oZWlnaHQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZG9qby5odG1sLnNldE1hcmdpbkJveChlbG0sIHt3aWR0aDpmLndpZHRoLCBoZWlnaHQ6Zi5oZWlnaHR9KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0pOworfTsKK2Rvam8uaHRtbC5pbnNlcnRDc3NUZXh0KCIuZG9qb0xheW91dENvbnRhaW5lcnsgcG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuIiArICJib2R5IC5kb2pvQWxpZ25Ub3AsIGJvZHkgLmRvam9BbGlnbkJvdHRvbSwgYm9keSAuZG9qb0FsaWduTGVmdCwgYm9keSAuZG9qb0FsaWduUmlnaHQgeyBwb3NpdGlvbjogYWJzb2x1dGU7IG92ZXJmbG93OiBoaWRkZW47IH1cbiIgKyAiYm9keSAuZG9qb0FsaWduQ2xpZW50IHsgcG9zaXRpb246IGFic29sdXRlIH1cbiIgKyAiLmRvam9BbGlnbkNsaWVudCB7IG92ZXJmbG93OiBhdXRvOyB9XG4iKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9odG1sL2xvYWRlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvaHRtbC9sb2FkZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViZjRiYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvaHRtbC9sb2FkZXIuanMKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lmh0bWwubG9hZGVyIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy5jb21tb24iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5sYW5nLmV4dHJhcyIpOworZG9qby5yZXF1aXJlKCJkb2pvLmV4cGVyaW1lbnRhbCIpOworZG9qby5leHBlcmltZW50YWwoImRvam8ud2lkZ2V0Lmh0bWwubG9hZGVyIik7Citkb2pvLndpZGdldC5odG1sLmxvYWRlciA9IG5ldyAoZnVuY3Rpb24gKCkgeworCXRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisJCXJldHVybiAiZG9qby53aWRnZXQuaHRtbC5sb2FkZXIiOworCX07CisJdmFyIF9sb2FkZXIgPSB0aGlzOworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uICgpIHsKKwkJZG9qby5leHBlcmltZW50YWwoX2xvYWRlci50b1N0cmluZygpKTsKKwkJdmFyIHVuZG8gPSBkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLnVuZG8uYnJvd3NlciIpOworCQlpZiAoZGpDb25maWdbInByZXZlbnRCYWNrQnV0dG9uRml4Il0gJiYgdW5kbyAmJiAhdW5kby5pbml0aWFsU3RhdGUpIHsKKwkJCXVuZG8uc2V0SW5pdGlhbFN0YXRlKG5ldyB0cmFja2VyT2JqKTsKKwkJfQorCX0pOworCXZhciBsb2dnZXIgPSB7fTsKKwl2YXIgdHJhY2tlck9iaiA9IGZ1bmN0aW9uIChpZCwgZGF0YSkgeworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuZGF0YSA9IGRhdGE7CisJfTsKKwl0cmFja2VyT2JqLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAodHlwZSkgeworCQlpZiAodHlwZW9mIGRvam8gPT0gInVuZGVmaW5lZCIpIHsKKwkJCXJldHVybjsKKwkJfQorCQl2YXIgd2cgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuaWQpOworCQlpZiAod2cpIHsKKwkJCXdnLnNldENvbnRlbnQodGhpcy5kYXRhLCB0cnVlKTsKKwkJfQorCX07CisJdGhpcy5fbG9nID0gZnVuY3Rpb24gKHdpZGdldCwgZGF0YSkgeworCQlpZiAod2lkZ2V0LnRyYWNrSGlzdG9yeSkgeworCQkJaWYgKCFsb2dnZXJbd2lkZ2V0LndpZGdldElkXSkgeworCQkJCWxvZ2dlclt3aWRnZXQud2lkZ2V0SWRdID0ge2NoaWxkcmVuSWRzOltdLCBzdGFjazpbZGF0YV19OworCQkJfQorCQkJdmFyIGNoaWxkcmVuID0gbG9nZ2VyW3dpZGdldC53aWRnZXRJZF0uY2hpbGRyZW5JZHM7CisJCQl3aGlsZSAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CisJCQkJZGVsZXRlIGxvZ2dlcltjaGlsZHJlbi5wb3AoKV07CisJCQl9CisJCQlmb3IgKHZhciBjaGlsZCBpbiB3aWRnZXQuY2hpbGRyZW4pIHsKKwkJCQlsb2dnZXJbd2lkZ2V0LndpZGdldElkXS5jaGlsZHJlbklkcyA9IGNoaWxkLndpZGdldElkOworCQkJfQorCQkJZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KG5ldyB0cmFja2VyT2JqKHdpZGdldC53aWRnZXRJZCwgZG9qby5sYW5nLnNoYWxsb3dDb3B5KGRhdGEsIHRydWUpKSk7CisJCX0KKwl9OworCXZhciB1bmRlZiA9IGRvam8ubGFuZy5pc1VuZGVmaW5lZDsKKwl2YXIgaXNGdW5jID0gZG9qby5sYW5nLmlzRnVuY3Rpb247CisJZnVuY3Rpb24gaGFuZGxlRGVmYXVsdHMoZSwgaGFuZGxlciwgdXNlQWxlcnQpIHsKKwkJaWYgKCFoYW5kbGVyKSB7CisJCQloYW5kbGVyID0gIm9uQ29udGVudEVycm9yIjsKKwkJfQorCQlpZiAoZG9qby5sYW5nLmlzU3RyaW5nKGUpKSB7CisJCQllID0ge190ZXh0OmV9OworCQl9CisJCWlmICghZS5fdGV4dCkgeworCQkJZS5fdGV4dCA9IGUudG9TdHJpbmcoKTsKKwkJfQorCQllLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworCQkJcmV0dXJuIHRoaXMuX3RleHQ7CisJCX07CisJCWlmICh0eXBlb2YgZS5yZXR1cm5WYWx1ZSAhPSAiYm9vbGVhbiIpIHsKKwkJCWUucmV0dXJuVmFsdWUgPSB0cnVlOworCQl9CisJCWlmICh0eXBlb2YgZS5wcmV2ZW50RGVmYXVsdCAhPSAiZnVuY3Rpb24iKSB7CisJCQllLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkgeworCQkJCXRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwkJCX07CisJCX0KKwkJdGhpc1toYW5kbGVyXShlKTsKKwkJaWYgKGUucmV0dXJuVmFsdWUpIHsKKwkJCWlmICh1c2VBbGVydCkgeworCQkJCWFsZXJ0KGUudG9TdHJpbmcoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMubG9hZGVyLmNhbGxPblVuTG9hZC5jYWxsKHRoaXMsIGZhbHNlKTsKKwkJCQl0aGlzLm9uU2V0Q29udGVudChlLnRvU3RyaW5nKCkpOworCQkJfQorCQl9CisJfQorCWZ1bmN0aW9uIGRvd25sb2FkZXIoYmluZEFyZ3MpIHsKKwkJZm9yICh2YXIgeCBpbiB0aGlzLmJpbmRBcmdzKSB7CisJCQliaW5kQXJnc1t4XSA9ICh1bmRlZihiaW5kQXJnc1t4XSkgPyB0aGlzLmJpbmRBcmdzW3hdIDogdW5kZWZpbmVkKTsKKwkJfQorCQl2YXIgY2FjaGUgPSB0aGlzLmNhY2hlQ29udGVudDsKKwkJaWYgKHVuZGVmKGJpbmRBcmdzLnVzZUNhY2hlKSkgeworCQkJYmluZEFyZ3MudXNlQ2FjaGUgPSBjYWNoZTsKKwkJfQorCQlpZiAodW5kZWYoYmluZEFyZ3MucHJldmVudENhY2hlKSkgeworCQkJYmluZEFyZ3MucHJldmVudENhY2hlID0gIWNhY2hlOworCQl9CisJCWlmICh1bmRlZihiaW5kQXJncy5taW1ldHlwZSkpIHsKKwkJCWJpbmRBcmdzLm1pbWV0eXBlID0gInRleHQvaHRtbCI7CisJCX0KKwkJdGhpcy5sb2FkZXIuYmluZE9iaiA9IGRvam8uaW8uYmluZChiaW5kQXJncyk7CisJfQorCWZ1bmN0aW9uIHN0YWNrUnVubmVyKHN0KSB7CisJCXZhciBlcnIgPSAiIiwgZnVuYyA9IG51bGw7CisJCXZhciBzY29wZSA9IHRoaXMuc2NyaXB0U2NvcGUgfHwgZG9qby5nbG9iYWwoKTsKKwkJd2hpbGUgKHN0Lmxlbmd0aCkgeworCQkJZnVuYyA9IHN0LnNoaWZ0KCk7CisJCQl0cnkgeworCQkJCWZ1bmMuY2FsbChzY29wZSk7CisJCQl9CisJCQljYXRjaCAoZSkgeworCQkJCWVyciArPSAiXG4iICsgZnVuYyArICIgZmFpbGVkOiAiICsgZTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyLmxlbmd0aCkgeworCQkJdmFyIG5hbWUgPSAoc3QgPT0gdGhpcy5sb2FkZXIuYWRkT25Mb2FkcykgPyAiYWRkT25Mb2FkIiA6ICJhZGRPblVuTG9hZCI7CisJCQloYW5kbGVEZWZhdWx0cy5jYWxsKHRoaXMsIG5hbWUgKyAiIGZhaWx1cmVcbiAiICsgZXJyLCAib25FeGVjRXJyb3IiLCB0cnVlKTsKKwkJfQorCX0KKwlmdW5jdGlvbiBzdGFja1B1c2hlcihzdCwgb2JqLCBmdW5jKSB7CisJCWlmICh0eXBlb2YgZnVuYyA9PSAidW5kZWZpbmVkIikgeworCQkJc3QucHVzaChvYmopOworCQl9IGVsc2UgeworCQkJc3QucHVzaChmdW5jdGlvbiAoKSB7CisJCQkJb2JqW2Z1bmNdKCk7CisJCQl9KTsKKwkJfQorCX0KKwlmdW5jdGlvbiByZWZyZXNoZWQoKSB7CisJCXRoaXMub25SZXNpemVkKCk7CisJCXRoaXMub25Mb2FkKCk7CisJCXRoaXMuaXNMb2FkZWQgPSB0cnVlOworCX0KKwlmdW5jdGlvbiBhc3luY1BhcnNlKGRhdGEpIHsKKwkJaWYgKHRoaXMuZXhlY3V0ZVNjcmlwdHMpIHsKKwkJCXRoaXMub25FeGVjU2NyaXB0LmNhbGwodGhpcywgZGF0YS5zY3JpcHRzKTsKKwkJfQorCQlpZiAodGhpcy5wYXJzZUNvbnRlbnQpIHsKKwkJCXRoaXMub25Db250ZW50UGFyc2UuY2FsbCh0aGlzKTsKKwkJfQorCQlyZWZyZXNoZWQuY2FsbCh0aGlzKTsKKwl9CisJZnVuY3Rpb24gcnVuSGFuZGxlcigpIHsKKwkJaWYgKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuaGFuZGxlcikpIHsKKwkJCXRoaXMuaGFuZGxlcih0aGlzLCB0aGlzLmNvbnRhaW5lck5vZGUgfHwgdGhpcy5kb21Ob2RlKTsKKwkJCXJlZnJlc2hlZC5jYWxsKHRoaXMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwl0aGlzLmh0bWxDb250ZW50QmFzaWNGaXggPSBmdW5jdGlvbiAocywgdXJsKSB7CisJCXZhciB0aXRsZXMgPSBbXSwgc3R5bGVzID0gW107CisJCXZhciByZWdleCA9IC88dGl0bGVbXj5dKj4oW1xzXFNdKj8pPFwvdGl0bGU+L2k7CisJCXZhciBtYXRjaCwgYXR0cjsKKwkJd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzKSkgeworCQkJdGl0bGVzLnB1c2gobWF0Y2hbMV0pOworCQkJcyA9IHMuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSArIHMuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKKwkJfQorCQlyZWdleCA9IC8oPzo8KHN0eWxlKVtePl0qPihbXHNcU10qPyk8XC9zdHlsZT58PGxpbmsgKFtePl0qcmVsPVsnIl0/c3R5bGVzaGVldFsnIl0/W14+XSopPikvaTsKKwkJd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzKSkgeworCQkJaWYgKG1hdGNoWzFdICYmIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgPT0gInN0eWxlIikgeworCQkJCXN0eWxlcy5wdXNoKGRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChtYXRjaFsyXSwgdXJsKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhdHRyID0gbWF0Y2hbM10ubWF0Y2goL2hyZWY9KFsnIl0/KShbXiciPl0qKVwxL2kpKSB7CisJCQkJCXN0eWxlcy5wdXNoKHtwYXRoOmF0dHJbMl19KTsKKwkJCQl9CisJCQl9CisJCQlzID0gcy5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCQl9CisJCXJldHVybiB7InMiOnMsICJ0aXRsZXMiOnRpdGxlcywgInN0eWxlcyI6c3R5bGVzfTsKKwl9OworCXRoaXMuaHRtbENvbnRlbnRBZGp1c3RQYXRocyA9IGZ1bmN0aW9uIChzLCB1cmwpIHsKKwkJdmFyIHRhZyA9ICIiLCBzdHIgPSAiIiwgdGFnRml4ID0gIiIsIHBhdGggPSAiIjsKKwkJdmFyIGF0dHIgPSBbXSwgb3JpZ1BhdGggPSAiIiwgZml4ID0gIiI7CisJCXZhciByZWdleEZpbmRUYWcgPSAvPFthLXpdW2EtejAtOV0qW14+XSpccyg/Oig/OnNyY3xocmVmfHN0eWxlKT1bXj5dKStbXj5dKj4vaTsKKwkJdmFyIHJlZ2V4RmluZEF0dHIgPSAvXHMoc3JjfGhyZWZ8c3R5bGUpPShbJyJdPykoW1x3KClcW1xdXC8uLFxcJyItOjsjPSY/XHNAXSs/KVwyL2k7CisJCXZhciByZWdleFByb3RvY29scyA9IC9eKD86WyNdfCg/Oig/Omh0dHBzP3xmdHBzP3xmaWxlfGphdmFzY3JpcHR8bWFpbHRvfG5ld3MpOikpLzsKKwkJd2hpbGUgKHRhZyA9IHJlZ2V4RmluZFRhZy5leGVjKHMpKSB7CisJCQlzdHIgKz0gcy5zdWJzdHJpbmcoMCwgdGFnLmluZGV4KTsKKwkJCXMgPSBzLnN1YnN0cmluZygodGFnLmluZGV4ICsgdGFnWzBdLmxlbmd0aCksIHMubGVuZ3RoKTsKKwkJCXRhZyA9IHRhZ1swXTsKKwkJCXRhZ0ZpeCA9ICIiOworCQkJd2hpbGUgKGF0dHIgPSByZWdleEZpbmRBdHRyLmV4ZWModGFnKSkgeworCQkJCXBhdGggPSAiIjsKKwkJCQlvcmlnUGF0aCA9IGF0dHJbM107CisJCQkJc3dpdGNoIChhdHRyWzFdLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkgIGNhc2UgInNyYyI6CisJCQkJICBjYXNlICJocmVmIjoKKwkJCQkJaWYgKHJlZ2V4UHJvdG9jb2xzLmV4ZWMob3JpZ1BhdGgpKSB7CisJCQkJCQlwYXRoID0gb3JpZ1BhdGg7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwYXRoID0gKG5ldyBkb2pvLnVyaS5VcmkodXJsLCBvcmlnUGF0aCkudG9TdHJpbmcoKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJICBjYXNlICJzdHlsZSI6CisJCQkJCXBhdGggPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQob3JpZ1BhdGgsIHVybCk7CisJCQkJCWJyZWFrOworCQkJCSAgZGVmYXVsdDoKKwkJCQkJcGF0aCA9IG9yaWdQYXRoOworCQkJCX0KKwkJCQlmaXggPSAiICIgKyBhdHRyWzFdICsgIj0iICsgYXR0clsyXSArIHBhdGggKyBhdHRyWzJdOworCQkJCXRhZ0ZpeCArPSB0YWcuc3Vic3RyaW5nKDAsIGF0dHIuaW5kZXgpICsgZml4OworCQkJCXRhZyA9IHRhZy5zdWJzdHJpbmcoKGF0dHIuaW5kZXggKyBhdHRyWzBdLmxlbmd0aCksIHRhZy5sZW5ndGgpOworCQkJfQorCQkJc3RyICs9IHRhZ0ZpeCArIHRhZzsKKwkJfQorCQlyZXR1cm4gc3RyICsgczsKKwl9OworCXRoaXMuaHRtbENvbnRlbnRTY3JpcHRzID0gZnVuY3Rpb24gKHMsIGNvbGxlY3RTY3JpcHRzKSB7CisJCXZhciBzY3JpcHRzID0gW10sIHJlcXVpcmVzID0gW10sIG1hdGNoID0gW107CisJCXZhciBhdHRyID0gIiIsIHRtcCA9IG51bGwsIHRhZyA9ICIiLCBzYyA9ICIiLCBzdHIgPSAiIjsKKwkJdmFyIHJlZ2V4ID0gLzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2k7CisJCXZhciByZWdleFNyYyA9IC9zcmM9KFsnIl0/KShbXiInXSopXDEvaTsKKwkJdmFyIHJlZ2V4RG9qb0pzID0gLy4qKFxiZG9qb1xiXC5qcyg/OlwudW5jb21wcmVzc2VkXC5qcyk/KSQvOworCQl2YXIgcmVnZXhJbnZhbGlkID0gLyg/OnZhciApP1xiZGpDb25maWdcYig/Oltcc10qPVtcc10qXHtbXn1dK1x9fFwuW1x3XSpbXHNdKj1bXHNdKlteO1xuXSopPzs/fGRvam9cLmhvc3RlbnZcLndyaXRlSW5jbHVkZXNcKFxzKlwpOz8vZzsKKwkJdmFyIHJlZ2V4UmVxdWlyZXMgPSAvZG9qb1wuKD86KD86cmVxdWlyZSg/OkFmdGVyKT8oPzpJZik/KXwoPzp3aWRnZXRcLig/Om1hbmFnZXJcLik/cmVnaXN0ZXJXaWRnZXRQYWNrYWdlKXwoPzooPzpob3N0ZW52XC4pP3NldE1vZHVsZVByZWZpeCl8ZGVmaW5lTmFtZXNwYWNlKVwoKFsnIl0pLio/XDFcKVxzKjs/LzsKKwkJd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzKSkgeworCQkJaWYgKHRoaXMuZXhlY3V0ZVNjcmlwdHMgJiYgbWF0Y2hbMV0pIHsKKwkJCQlpZiAoYXR0ciA9IHJlZ2V4U3JjLmV4ZWMobWF0Y2hbMV0pKSB7CisJCQkJCWlmIChyZWdleERvam9Kcy5leGVjKGF0dHJbMl0pKSB7CisJCQkJCQlkb2pvLmRlYnVnKCJTZWN1cml0eSBub3RlISBpbmhpYml0OiIgKyBhdHRyWzJdICsgIiBmcm9tICBiZWVpbmcgbG9hZGVkIGFnYWluLiIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2NyaXB0cy5wdXNoKHtwYXRoOmF0dHJbMl19KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaFsyXSkgeworCQkJCXNjID0gbWF0Y2hbMl0ucmVwbGFjZShyZWdleEludmFsaWQsICIiKTsKKwkJCQlpZiAoIXNjKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl3aGlsZSAodG1wID0gcmVnZXhSZXF1aXJlcy5leGVjKHNjKSkgeworCQkJCQlyZXF1aXJlcy5wdXNoKHRtcFswXSk7CisJCQkJCXNjID0gc2Muc3Vic3RyaW5nKDAsIHRtcC5pbmRleCkgKyBzYy5zdWJzdHIodG1wLmluZGV4ICsgdG1wWzBdLmxlbmd0aCk7CisJCQkJfQorCQkJCWlmIChjb2xsZWN0U2NyaXB0cykgeworCQkJCQlzY3JpcHRzLnB1c2goc2MpOworCQkJCX0KKwkJCX0KKwkJCXMgPSBzLnN1YnN0cigwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJCX0KKwkJaWYgKGNvbGxlY3RTY3JpcHRzKSB7CisJCQl2YXIgcmVnZXggPSAvKDxbYS16QS1aXVthLXpBLVowLTldKlxzW14+XSpcUz0oWyciXSlbXj5dKlteXC5cXV0pc2NyaXB0U2NvcGUoW14+XSo+KS87CisJCQlzdHIgPSAiIjsKKwkJCXdoaWxlICh0YWcgPSByZWdleC5leGVjKHMpKSB7CisJCQkJdG1wID0gKCh0YWdbMl0gPT0gIiciKSA/ICJcIiIgOiAiJyIpOworCQkJCXN0ciArPSBzLnN1YnN0cmluZygwLCB0YWcuaW5kZXgpOworCQkJCXMgPSBzLnN1YnN0cih0YWcuaW5kZXgpLnJlcGxhY2UocmVnZXgsICIkMWRvam8ud2lkZ2V0LmJ5SWQoIiArIHRtcCArIHRoaXMud2lkZ2V0SWQgKyB0bXAgKyAiKS5zY3JpcHRTY29wZSQzIik7CisJCQl9CisJCQlzID0gc3RyICsgczsKKwkJfQorCQlyZXR1cm4geyJzIjpzLCAicmVxdWlyZXMiOnJlcXVpcmVzLCAic2NyaXB0cyI6c2NyaXB0c307CisJfTsKKwl0aGlzLnNwbGl0QW5kRml4UGF0aHMgPSBmdW5jdGlvbiAoYXJncykgeworCQlpZiAoIWFyZ3MudXJsKSB7CisJCQlhcmdzLnVybCA9ICIuLyI7CisJCX0KKwkJdXJsID0gbmV3IGRvam8udXJpLlVyaShsb2NhdGlvbiwgYXJncy51cmwpLnRvU3RyaW5nKCk7CisJCXZhciByZXQgPSB7InhtbCI6IiIsICJzdHlsZXMiOltdLCAidGl0bGVzIjpbXSwgInJlcXVpcmVzIjpbXSwgInNjcmlwdHMiOltdLCAidXJsIjp1cmx9OworCQlpZiAoYXJncy5jb250ZW50KSB7CisJCQl2YXIgdG1wID0gbnVsbCwgY29udGVudCA9IGFyZ3MuY29udGVudDsKKwkJCWlmIChhcmdzLmFkanVzdFBhdGhzKSB7CisJCQkJY29udGVudCA9IF9sb2FkZXIuaHRtbENvbnRlbnRBZGp1c3RQYXRocy5jYWxsKHRoaXMsIGNvbnRlbnQsIHVybCk7CisJCQl9CisJCQl0bXAgPSBfbG9hZGVyLmh0bWxDb250ZW50QmFzaWNGaXguY2FsbCh0aGlzLCBjb250ZW50LCB1cmwpOworCQkJY29udGVudCA9IHRtcC5zOworCQkJcmV0LnN0eWxlcyA9IHRtcC5zdHlsZXM7CisJCQlyZXQudGl0bGVzID0gdG1wLnRpdGxlczsKKwkJCWlmIChhcmdzLmNvbGxlY3RSZXF1aXJlcyB8fCBhcmdzLmNvbGxlY3RTY3JpcHRzKSB7CisJCQkJdG1wID0gX2xvYWRlci5odG1sQ29udGVudFNjcmlwdHMuY2FsbCh0aGlzLCBjb250ZW50LCBhcmdzLmNvbGxlY3RTY3JpcHRzKTsKKwkJCQljb250ZW50ID0gdG1wLnM7CisJCQkJcmV0LnJlcXVpcmVzID0gdG1wLnJlcXVpcmVzOworCQkJCXJldC5zY3JpcHRzID0gdG1wLnNjcmlwdHM7CisJCQl9CisJCQl2YXIgbWF0Y2ggPSBbXTsKKwkJCWlmIChhcmdzLmJvZHlFeHRyYWN0KSB7CisJCQkJbWF0Y2ggPSBjb250ZW50Lm1hdGNoKC88Ym9keVtePl0qPlxzKihbXHNcU10rKVxzKjxcL2JvZHk+L2ltKTsKKwkJCQlpZiAobWF0Y2gpIHsKKwkJCQkJY29udGVudCA9IG1hdGNoWzFdOworCQkJCX0KKwkJCX0KKwkJCXJldC54bWwgPSBjb250ZW50OworCQl9CisJCXJldHVybiByZXQ7CisJfTsKKwl0aGlzLmhvb2tVcCA9IGZ1bmN0aW9uIChhcmdzKSB7CisJCXZhciB3aWRnZXQgPSBhcmdzLndpZGdldDsKKwkJaWYgKGRvam8ubGFuZy5pc1N0cmluZyh3aWRnZXQpKSB7CisJCQlpZiAoYXJncy5taXhpbikgeworCQkJCWRvam8ucmFpc2UodGhpcy50b1N0cmluZygpICsgIiwgY2FudCB1c2UgbWl4aW4gd2hlbiB3aWRnZXQgaXMgYSBzdHJpbmciKTsKKwkJCX0KKwkJCXdpZGdldCA9IGRvam8uZXZhbE9ialBhdGgod2lkZ2V0KTsKKwkJfQorCQlpZiAoIXdpZGdldCB8fCAhKHdpZGdldCBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQpKSB7CisJCQlkb2pvLnJhaXNlKHRoaXMudG9TdHJpbmcoKSArICIgV2lkZ2V0IGlzbid0IGRlZmluZWQgb3IgaXNuJ3QgYSBIdG1sV2lkZ2V0IGluc3RhbmNlIik7CisJCX0KKwkJaWYgKHdpZGdldC5sb2FkZXIgJiYgd2lkZ2V0LnNldFVybCkgeworCQkJcmV0dXJuOworCQl9CisJCXZhciB3aWRnZXRQcm90byA9IChhcmdzLm1peGluKSA/IHdpZGdldCA6IHdpZGdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisJCXdpZGdldC5sb2FkZXIgPSB7aXNMb2FkZWQ6ZmFsc2UsIHN0eWxlTm9kZXM6W10sIGFkZE9uTG9hZHM6W10sIGFkZE9uVW5Mb2FkczpbXSwgY2FsbE9uVW5Mb2FkOihmdW5jdGlvbiAoY2FuQ2FsbCkgeworCQkJcmV0dXJuIGZ1bmN0aW9uIChhZnRlcikgeworCQkJCXRoaXMuYWJvcnQoKTsKKwkJCQlpZiAoY2FuQ2FsbCkgeworCQkJCQl0aGlzLm9uVW5Mb2FkKCk7CisJCQkJfQorCQkJCWNhbkNhbGwgPSBhZnRlcjsKKwkJCX07CisJCX0pKGZhbHNlKSwgYmluZE9iajpudWxsLCB1bkhvb2s6KGZ1bmN0aW9uICh3LCB3ZykgeworCQkJdmFyIG9sZFByb3BzID0ge2lzQ29udGFpbmVyOncuaXNDb250YWluZXIsIGFkanVzdFBhdHM6dy5hZGp1c3RQYXRocywgaHJlZjp3LmhyZWYsIGV4dHJhY3RDb250ZW50OncuZXh0cmFjdENvbnRlbnQsIHBhcnNlQ29udGVudDp3LnBhcnNlQ29udGVudCwgY2FjaGVDb250ZW50OncuY2FjaGVDb250ZW50LCBiaW5kQXJnczp3LmJpbmRBcmdzLCBwcmVsb2FkOncucHJlbG9hZCwgcmVmcmVzaE9uU2hvdzp3LnJlZnJlc2hPblNob3csIGhhbmRsZXI6dy5oYW5kbGVyLCB0cmFja0hpc3Rvcnk6dy50cmFja0hpc3RvcnksIGV4ZWN1dGVTY3JpcHRzOncuZXhlY3V0ZVNjcmlwdHMsIHNjcmlwdFNjb3BlOncuc2NyaXB0U2NvcGUsIHBvc3RDcmVhdGU6dy5wb3N0Q3JlYXRlLCBzaG93Oncuc2hvdywgcmVmcmVzaDp3LnJlZnJlc2gsIGxvYWRDb250ZW50czp3LmxvYWRDb250ZW50cywgYWJvcnQ6dy5hYm9ydCwgZGVzdHJveTp3LmRlc3Ryb3ksIG9uTG9hZDp3Lm9uTG9hZCwgb25VbkxvYWQ6dy5vblVuTG9hZCwgYWRkT25Mb2FkOncuYWRkT25Mb2FkLCBhZGRPblVuTG9hZDp3LmFkZE9uVW5Mb2FkLCBvbkRvd25sb2FkU3RhcnQ6dy5vbkRvd25sb2FkU3RhcnQsIG9uRG93bmxvYWRFbmQ6dy5vbkRvd25sb2FkRW5kLCBvbkRvd25sb2FkRXJyb3I6dy5vbkRvd25sb2FkRXJyb3IsIG9uQ29udGVudEVycm9yOncub25Db250ZW50RXJyb3IsIG9uRXhlY0Vycm9yOncub25FeGVjRXJyb3IsIG9uU2V0Q29udGVudDp3Lm9uU2V0Q29udGVudCwgc2V0VXJsOncuc2V0VXJsLCBzZXRDb250ZW50Oncuc2V0Q29udGVudCwgb25Db250ZW50UGFyc2U6dy5vbkNvbnRlbnRQYXJzZSwgb25FeGVjU2NyaXB0Oncub25FeGVjU2NyaXB0LCBzZXRIYW5kbGVyOncuc2V0SGFuZGxlcn07CisJCQlyZXR1cm4gZnVuY3Rpb24gKCkgeworCQkJCWlmICh3Zy5hYm9ydCkgeworCQkJCQl3Zy5hYm9ydCgpOworCQkJCX0KKwkJCQlpZiAoKHcgIT0gd2cpICYmIChkb2pvLndpZGdldC5ieVR5cGUod2cud2lkZ2V0VHlwZSkubGVuZ3RoID4gMSkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlmb3IgKHZhciB4IGluIG9sZFByb3BzKSB7CisJCQkJCWlmIChvbGRQcm9wc1t4XSA9PT0gdW5kZWZpbmVkKSB7CisJCQkJCQlkZWxldGUgd1t4XTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXdbeF0gPSBvbGRQcm9wc1t4XTsKKwkJCQl9CisJCQkJZGVsZXRlIHdnLl9sb2FkZXJfZGVmaW5lZDsKKwkJCQlkZWxldGUgd2cubG9hZGVyOworCQkJfTsKKwkJfSkod2lkZ2V0UHJvdG8sIHdpZGdldCl9OworCQlpZiAod2lkZ2V0UHJvdG8uX2xvYWRlcl9kZWZpbmVkIHx8IHdpZGdldC5fbG9hZGVyX2RlZmluZWQpIHsKKwkJCXJldHVybjsKKwkJfQorCQlkb2pvLm1peGluKHdpZGdldFByb3RvLCB7aXNDb250YWluZXI6dHJ1ZSwgYWRqdXN0UGF0aHM6dW5kZWYod2lkZ2V0UHJvdG8uYWRqdXN0UGF0aHMpID8gdHJ1ZSA6IHdpZGdldFByb3RvLmFkanVzdFBhdGhzLCBocmVmOnVuZGVmKHdpZGdldFByb3RvLmhyZWYpID8gIiIgOiB3aWRnZXRQcm90by5ocmVmLCBleHRyYWN0Q29udGVudDp1bmRlZih3aWRnZXRQcm90by5leHRyYWN0Q29udGVudCkgPyB0cnVlIDogd2lkZ2V0UHJvdG8uZXh0cmFjdENvbnRlbnQsIHBhcnNlQ29udGVudDp1bmRlZih3aWRnZXRQcm90by5wYXJzZUNvbnRlbnQpID8gdHJ1ZSA6IHdpZGdldFByb3RvLnBhcnNlQ29udGVudCwgY2FjaGVDb250ZW50OnVuZGVmKHdpZGdldFByb3RvLmNhY2hlQ29udGVudCkgPyB0cnVlIDogd2lkZ2V0UHJvdG8uY2FjaGVDb250ZW50LCBiaW5kQXJnczp1bmRlZih3aWRnZXRQcm90by5iaW5kQXJncykgPyB7fSA6IHdpZGdldFByb3RvLmJpbmRBcmdzLCBwcmVsb2FkOnVuZGVmKHdpZGdldFByb3RvLnByZWxvYWQpID8gZmFsc2UgOiB3aWRnZXRQcm90by5wcmVsb2FkLCByZWZyZXNoT25TaG93OnVuZGVmKHdpZGdldFByb3RvLnJlZnJlc2hPblNob3cpID8gZmFsc2UgOiB3aWRnZXRQcm90by5yZWZyZXNoT25TaG93LCBoYW5kbGVyOnVuZGVmKHdpZGdldFByb3RvLmhhbmRsZXIpID8gIiIgOiB3aWRnZXRQcm90by5oYW5kbGVyLCBleGVjdXRlU2NyaXB0czp1bmRlZih3aWRnZXRQcm90by5leGVjdXRlU2NyaXB0cykgPyBmYWxzZSA6IHdpZGdldFByb3RvLmV4ZWN1dGVTY3JpcHRzLCB0cmFja0hpc3Rvcnk6dW5kZWYod2lkZ2V0UHJvdG8udHJhY0hpc3RvcnkpID8gZmFsc2UgOiB3aWRnZXRQcm90by50cmFja0hpc3RvcnksIHNjcmlwdFNjb3BlOm51bGx9KTsKKwkJd2lkZ2V0UHJvdG8ucG9zdENyZWF0ZSA9IChmdW5jdGlvbiAocG9zdENyZWF0ZSkgeworCQkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJCQlpZiAod2lkZ2V0UHJvdG8uY29uc3RydWN0b3Iuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlICE9IHBvc3RDcmVhdGUpIHsKKwkJCQkJcG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJCX0gZWxzZSB7CisJCQkJCXdpZGdldFByb3RvLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJCX0KKwkJCQlpZiAodGhpcy5oYW5kbGVyICE9PSAiIikgeworCQkJCQl0aGlzLnNldEhhbmRsZXIodGhpcy5oYW5kbGVyKTsKKwkJCQl9CisJCQkJaWYgKHRoaXMuaXNTaG93aW5nKCkgfHwgdGhpcy5wcmVsb2FkKSB7CisJCQkJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJCQkJCWlmICghdGhpcy5ocmVmKSB7CisJCQkJCQlfbG9hZGVyLl9sb2codGhpcywgKHRoaXMuZG9tTm9kZSB8fCB0aGlzLmNvbnRhaW5lck5vZGUpLmlubmVySFRNTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9KSh3aWRnZXRQcm90by5wb3N0Q3JlYXRlKTsKKwkJd2lkZ2V0UHJvdG8uc2hvdyA9IChmdW5jdGlvbiAoc2hvdykgeworCQkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKKwkJCQlpZiAodGhpcy5yZWZyZXNoT25TaG93KSB7CisJCQkJCXRoaXMucmVmcmVzaCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJCQkJfQorCQkJCWlmICgod2lkZ2V0UHJvdG8uY29uc3RydWN0b3Iuc3VwZXJjbGFzcy5zaG93ID09IHNob3cpIHx8ICFpc0Z1bmMoc2hvdykpIHsKKwkJCQkJd2lkZ2V0UHJvdG8uY29uc3RydWN0b3Iuc3VwZXJjbGFzcy5zaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJCX0KKwkJCX07CisJCX0pKHdpZGdldFByb3RvLnNob3cpOworCQl3aWRnZXRQcm90by5kZXN0cm95ID0gKGZ1bmN0aW9uIChkZXN0cm95KSB7CisJCQlyZXR1cm4gZnVuY3Rpb24gKGRlc3Ryb3kpIHsKKwkJCQl0aGlzLm9uVW5Mb2FkKCk7CisJCQkJdGhpcy5hYm9ydCgpOworCQkJCXRoaXMubG9hZGVyLnVuSG9vaygpOworCQkJCWlmICgod2lkZ2V0UHJvdG8uY29uc3RydWN0b3Iuc3VwZXJjbGFzcy5kZXN0cm95ICE9IGRlc3Ryb3kpICYmIGlzRnVuYyhkZXN0cm95KSkgeworCQkJCQlkZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2lkZ2V0UHJvdG8uY29uc3RydWN0b3Iuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQkJfQorCQkJfTsKKwkJfSkod2lkZ2V0UHJvdG8uZGVzdHJveSk7CisJCWlmICghd2lkZ2V0UHJvdG8ucmVmcmVzaCkgeworCQkJd2lkZ2V0UHJvdG8ucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsKKwkJCQl0aGlzLmxvYWRlci5pc0xvYWRlZCA9IGZhbHNlOworCQkJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ubG9hZENvbnRlbnRzKSB7CisJCQl3aWRnZXRQcm90by5sb2FkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7CisJCQkJaWYgKHRoaXMubG9hZGVyLmlzTG9hZGVkKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKGlzRnVuYyh0aGlzLmhhbmRsZXIpKSB7CisJCQkJCXJ1bkhhbmRsZXIuY2FsbCh0aGlzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodGhpcy5ocmVmICE9PSAiIikgeworCQkJCQkJaGFuZGxlRGVmYXVsdHMuY2FsbCh0aGlzLCAiTG9hZGluZy4uLiIsICJvbkRvd25sb2FkU3RhcnQiKTsKKwkJCQkJCXZhciBzZWxmID0gdGhpcywgdXJsID0gdGhpcy5ocmVmOworCQkJCQkJZG93bmxvYWRlci5jYWxsKHRoaXMsIHt1cmw6dXJsLCBsb2FkOmZ1bmN0aW9uICh0eXBlLCBkYXRhLCB4aHIpIHsKKwkJCQkJCQlzZWxmLm9uRG93bmxvYWRFbmQuY2FsbChzZWxmLCB1cmwsIGRhdGEpOworCQkJCQkJfSwgZXJyb3I6ZnVuY3Rpb24gKHR5cGUsIGVyciwgeGhyKSB7CisJCQkJCQkJdmFyIGUgPSB7cmVzcG9uc2VUZXh0Onhoci5yZXNwb25zZVRleHQsIHN0YXR1czp4aHIuc3RhdHVzLCBzdGF0dXNUZXh0Onhoci5zdGF0dXNUZXh0LCByZXNwb25zZUhlYWRlcnM6KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMpID8geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIDogW10sIF90ZXh0OiJFcnJvciBsb2FkaW5nICciICsgdXJsICsgIicgKCIgKyB4aHIuc3RhdHVzICsgIiAiICsgeGhyLnN0YXR1c1RleHQgKyAiKSJ9OworCQkJCQkJCWhhbmRsZURlZmF1bHRzLmNhbGwoc2VsZiwgZSwgIm9uRG93bmxvYWRFcnJvciIpOworCQkJCQkJCXNlbGYub25Mb2FkKCk7CisJCQkJCQl9fSk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8uYWJvcnQpIHsKKwkJCXdpZGdldFByb3RvLmFib3J0ID0gZnVuY3Rpb24gKCkgeworCQkJCWlmICghdGhpcy5sb2FkZXIgfHwgIXRoaXMubG9hZGVyLmJpbmRPYmogfHwgIXRoaXMubG9hZGVyLmJpbmRPYmouYWJvcnQpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQl0aGlzLmxvYWRlci5iaW5kT2JqLmFib3J0KCk7CisJCQkJdGhpcy5sb2FkZXIuYmluZE9iaiA9IG51bGw7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25Mb2FkKSB7CisJCQl3aWRnZXRQcm90by5vbkxvYWQgPSBmdW5jdGlvbiAoKSB7CisJCQkJc3RhY2tSdW5uZXIuY2FsbCh0aGlzLCB0aGlzLmxvYWRlci5hZGRPbkxvYWRzKTsKKwkJCQl0aGlzLmxvYWRlci5pc0xvYWRlZCA9IHRydWU7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25VbkxvYWQpIHsKKwkJCXdpZGdldFByb3RvLm9uVW5Mb2FkID0gZnVuY3Rpb24gKCkgeworCQkJCXN0YWNrUnVubmVyLmNhbGwodGhpcywgdGhpcy5sb2FkZXIuYWRkT25VbkxvYWRzKTsKKwkJCQlkZWxldGUgdGhpcy5zY3JpcHRTY29wZTsKKwkJCX07CisJCX0KKwkJaWYgKCF3aWRnZXRQcm90by5hZGRPbkxvYWQpIHsKKwkJCXdpZGdldFByb3RvLmFkZE9uTG9hZCA9IGZ1bmN0aW9uIChvYmosIGZ1bmMpIHsKKwkJCQlzdGFja1B1c2hlci5jYWxsKHRoaXMsIHRoaXMubG9hZGVyLmFkZE9uTG9hZHMsIG9iaiwgZnVuYyk7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8uYWRkT25VbkxvYWQpIHsKKwkJCXdpZGdldFByb3RvLmFkZE9uVW5Mb2FkID0gZnVuY3Rpb24gKG9iaiwgZnVuYykgeworCQkJCXN0YWNrUHVzaGVyLmNhbGwodGhpcywgdGhpcy5sb2FkZXIuYWRkT25VbkxvYWRzLCBvYmosIGZ1bmMpOworCQkJfTsKKwkJfQorCQlpZiAoIXdpZGdldFByb3RvLm9uRXhlY0Vycm9yKSB7CisJCQl3aWRnZXRQcm90by5vbkV4ZWNFcnJvciA9IGZ1bmN0aW9uICgpIHsKKwkJCX07CisJCX0KKwkJaWYgKCF3aWRnZXRQcm90by5vbkNvbnRlbnRFcnJvcikgeworCQkJd2lkZ2V0UHJvdG8ub25Db250ZW50RXJyb3IgPSBmdW5jdGlvbiAoKSB7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25Eb3dubG9hZEVycm9yKSB7CisJCQl3aWRnZXRQcm90by5vbkRvd25sb2FkRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25Eb3dubG9hZFN0YXJ0KSB7CisJCQl3aWRnZXRQcm90by5vbkRvd25sb2FkU3RhcnQgPSBmdW5jdGlvbiAob25Eb3dubG9hZFN0YXJ0KSB7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25Eb3dubG9hZEVuZCkgeworCQkJd2lkZ2V0UHJvdG8ub25Eb3dubG9hZEVuZCA9IGZ1bmN0aW9uICh1cmwsIGRhdGEpIHsKKwkJCQl2YXIgYXJncyA9IHtjb250ZW50OmRhdGEsIHVybDp1cmwsIGFkanVzdFBhdGhzOnRoaXMuYWRqdXN0UGF0aHMsIGNvbGxlY3RTY3JpcHRzOnRoaXMuZXhlY3V0ZVNjcmlwdHMsIGNvbGxlY3RSZXF1aXJlczp0aGlzLnBhcnNlQ29udGVudCwgYm9keUV4dHJhY3Q6dGhpcy5leHRyYWN0Q29udGVudH07CisJCQkJZGF0YSA9IF9sb2FkZXIuc3BsaXRBbmRGaXhQYXRocy5jYWxsKHRoaXMsIGFyZ3MpOworCQkJCXRoaXMuc2V0Q29udGVudChkYXRhKTsKKwkJCX07CisJCX0KKwkJaWYgKCF3aWRnZXRQcm90by5vblNldENvbnRlbnQpIHsKKwkJCXdpZGdldFByb3RvLm9uU2V0Q29udGVudCA9IGZ1bmN0aW9uIChjb250KSB7CisJCQkJdGhpcy5kZXN0cm95Q2hpbGRyZW4oKTsKKwkJCQl2YXIgc3R5bGVOb2RlcyA9IHRoaXMubG9hZGVyLnN0eWxlTm9kZXM7CisJCQkJd2hpbGUgKHN0eWxlTm9kZXMubGVuZ3RoKSB7CisJCQkJCXZhciBzdCA9IHN0eWxlTm9kZXMucG9wKCk7CisJCQkJCWlmIChzdCAmJiBzdC5wYXJlbnROb2RlKSB7CisJCQkJCQlzdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0KTsKKwkJCQkJfQorCQkJCX0KKwkJCQl2YXIgbm9kZSA9IHRoaXMuY29udGFpbmVyTm9kZSB8fCB0aGlzLmRvbU5vZGU7CisJCQkJd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkgeworCQkJCQl0cnkgeworCQkJCQkJZG9qby5ldmVudC5icm93c2VyLmNsZWFuKG5vZGUuZmlyc3RDaGlsZCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJfQorCQkJCQlub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7CisJCQkJfQorCQkJCXRyeSB7CisJCQkJCWlmICh0eXBlb2YgY29udCAhPSAic3RyaW5nIikgeworCQkJCQkJbm9kZS5hcHBlbmRDaGlsZChjb250KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJbm9kZS5pbm5lckhUTUwgPSBjb250OworCQkJCQkJfQorCQkJCQkJY2F0Y2ggKGUpIHsKKwkJCQkJCQl2YXIgdG1wOworCQkJCQkJCSh0bXAgPSBkb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUwgPSBjb250OworCQkJCQkJCXdoaWxlICh0bXAuZmlyc3RDaGlsZCkgeworCQkJCQkJCQlub2RlLmFwcGVuZENoaWxkKHRtcC5yZW1vdmVDaGlsZCh0bXAuZmlyc3RDaGlsZCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljYXRjaCAoZSkgeworCQkJCQllLl90ZXh0ID0gIkNvdWxkJ250IGxvYWQgY29udGVudDogIiArIGU7CisJCQkJCXZhciB1c2VBbGVydCA9ICh0aGlzLmxvYWRlci5fb25TZXRDb250ZW50X2VyciA9PSBlLl90ZXh0KTsKKwkJCQkJdGhpcy5sb2FkZXIuX29uU2V0Q29udGVudF9lcnIgPSBlLl90ZXh0OworCQkJCQloYW5kbGVEZWZhdWx0cy5jYWxsKHRoaXMsIGUsICJvbkNvbnRlbnRFcnJvciIsIHVzZUFsZXJ0KTsKKwkJCQl9CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8uc2V0VXJsKSB7CisJCQl3aWRnZXRQcm90by5zZXRVcmwgPSBmdW5jdGlvbiAodXJsKSB7CisJCQkJdGhpcy5ocmVmID0gdXJsOworCQkJCXRoaXMubG9hZGVyLmlzTG9hZGVkID0gZmFsc2U7CisJCQkJaWYgKHRoaXMucHJlbG9hZCB8fCB0aGlzLmlzU2hvd2luZygpKSB7CisJCQkJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJCQkJfQorCQkJfTsKKwkJfQorCQlpZiAoIXdpZGdldFByb3RvLnNldENvbnRlbnQpIHsKKwkJCXdpZGdldFByb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiAoZGF0YSwgZG9udExvZykgeworCQkJCXRoaXMubG9hZGVyLmNhbGxPblVuTG9hZC5jYWxsKHRoaXMsIHRydWUpOworCQkJCWlmICghZGF0YSB8fCBkb2pvLmh0bWwuaXNOb2RlKGRhdGEpKSB7CisJCQkJCXRoaXMub25TZXRDb250ZW50KGRhdGEpOworCQkJCQlyZWZyZXNoZWQuY2FsbCh0aGlzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHlwZW9mIGRhdGEueG1sICE9ICJzdHJpbmciKSB7CisJCQkJCQl0aGlzLmhyZWYgPSAiIjsKKwkJCQkJCXZhciBhcmdzID0ge2NvbnRlbnQ6ZGF0YSwgdXJsOnRoaXMuaHJlZiwgYWRqdXN0UGF0aHM6dGhpcy5hZGp1c3RQYXRocywgY29sbGVjdFNjcmlwdHM6dGhpcy5leGVjdXRlU2NyaXB0cywgY29sbGVjdFJlcXVpcmVzOnRoaXMucGFyc2VDb250ZW50LCBib2R5RXh0cmFjdDp0aGlzLmV4dHJhY3RDb250ZW50fTsKKwkJCQkJCWRhdGEgPSBfbG9hZGVyLnNwbGl0QW5kRml4UGF0aHMuY2FsbCh0aGlzLCBhcmdzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChkYXRhLnVybCAhPSAiLi8iKSB7CisJCQkJCQkJdGhpcy51cmwgPSBkYXRhLnVybDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0aGlzLm9uU2V0Q29udGVudChkYXRhLnhtbCk7CisJCQkJCWZvciAodmFyIGkgPSAwLCBzdHlsZXMgPSBkYXRhLnN0eWxlczsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJaWYgKHN0eWxlc1tpXS5wYXRoKSB7CisJCQkJCQkJdGhpcy5sb2FkZXIuc3R5bGVOb2Rlcy5wdXNoKGRvam8uaHRtbC5pbnNlcnRDc3NGaWxlKHN0eWxlc1tpXS5wYXRoKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMubG9hZGVyLnN0eWxlTm9kZXMucHVzaChkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dChzdHlsZXNbaV0pKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodGhpcy5wYXJzZUNvbnRlbnQpIHsKKwkJCQkJCWZvciAodmFyIGkgPSAwLCByZXF1aXJlcyA9IGRhdGEucmVxdWlyZXM7IGkgPCByZXF1aXJlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWV2YWwocmVxdWlyZXNbaV0pOworCQkJCQkJCX0KKwkJCQkJCQljYXRjaCAoZSkgeworCQkJCQkJCQllLl90ZXh0ID0gImRvam8ud2lkZ2V0Lmh0bWwubG9hZGVyLmhvb2tVcDogZXJyb3IgaW4gcGFja2FnZSBsb2FkaW5nIGNhbGxzLCAiICsgKGUuZGVzY3JpcHRpb24gfHwgZSk7CisJCQkJCQkJCWhhbmRsZURlZmF1bHRzLmNhbGwodGhpcywgZSwgIm9uQ29udGVudEVycm9yIiwgdHJ1ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChkb2pvLmhvc3RlbnYuaXNYRG9tYWluICYmIGRhdGEucmVxdWlyZXMubGVuZ3RoKSB7CisJCQkJCQlkb2pvLmFkZE9uTG9hZChmdW5jdGlvbiAoKSB7CisJCQkJCQkJYXN5bmNQYXJzZS5jYWxsKHRoaXMsIGRhdGEpOworCQkJCQkJCWlmICghZG9udExvZykgeworCQkJCQkJCQlfbG9hZGVyLl9sb2codGhpcywgZGF0YSk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCQlkb250TG9nID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWFzeW5jUGFyc2UuY2FsbCh0aGlzLCBkYXRhKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWRvbnRMb2cpIHsKKwkJCQl9CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25Db250ZW50UGFyc2UpIHsKKwkJCXdpZGdldFByb3RvLm9uQ29udGVudFBhcnNlID0gZnVuY3Rpb24gKCkgeworCQkJCXZhciBub2RlID0gdGhpcy5jb250YWluZXJOb2RlIHx8IHRoaXMuZG9tTm9kZTsKKwkJCQl2YXIgcGFyc2VyID0gbmV3IGRvam8ueG1sLlBhcnNlKCk7CisJCQkJdmFyIGZyYWcgPSBwYXJzZXIucGFyc2VFbGVtZW50KG5vZGUsIG51bGwsIHRydWUpOworCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZywgdGhpcyk7CisJCQl9OworCQl9CisJCWlmICghd2lkZ2V0UHJvdG8ub25FeGVjU2NyaXB0KSB7CisJCQl3aWRnZXRQcm90by5vbkV4ZWNTY3JpcHQgPSBmdW5jdGlvbiAoc2NyaXB0cykgeworCQkJCXZhciBzZWxmID0gdGhpcywgdG1wID0gIiIsIGNvZGUgPSAiIjsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHNjcmlwdHNbaV0ucGF0aCkgeworCQkJCQkJdmFyIHVybCA9IHNjcmlwdHNbaV0ucGF0aDsKKwkJCQkJCWRvd25sb2FkZXIuY2FsbCh0aGlzLCB7InVybCI6dXJsLCAibG9hZCI6ZnVuY3Rpb24gKHR5cGUsIHNjcmlwdFN0cikgeworCQkJCQkJCShmdW5jdGlvbiAoKSB7CisJCQkJCQkJCXRtcCA9IHNjcmlwdFN0cjsKKwkJCQkJCQkJc2NyaXB0c1tpXSA9IHNjcmlwdFN0cjsKKwkJCQkJCQl9KS5jYWxsKHNlbGYpOworCQkJCQkJfSwgImVycm9yIjpmdW5jdGlvbiAodHlwZSwgZXJyb3IpIHsKKwkJCQkJCQllcnJvci5fdGV4dCA9IHR5cGUgKyAiIGRvd25sb2FkaW5nIHJlbW90ZSBzY3JpcHQiOworCQkJCQkJCWhhbmRsZURlZmF1bHRzLmNhbGwoc2VsZiwgZXJyb3IsICJvbkV4ZWNFcnJvciIsIHRydWUpOworCQkJCQkJfSwgIm1pbWV0eXBlIjoidGV4dC9wbGFpbiIsICJzeW5jIjp0cnVlfSk7CisJCQkJCQljb2RlICs9IHRtcDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZGUgKz0gc2NyaXB0c1tpXTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0cnkgeworCQkJCQlkZWxldGUgdGhpcy5zY3JpcHRTY29wZTsKKwkJCQkJdGhpcy5zY3JpcHRTY29wZSA9IG5ldyAobmV3IEZ1bmN0aW9uKCJfY29udGFpbmVyXyIsIGNvZGUgKyAiOyByZXR1cm4gdGhpczsiKSkoc2VsZik7CisJCQkJfQorCQkJCWNhdGNoIChlKSB7CisJCQkJCWUuX3RleHQgPSAiRXJyb3IgcnVubmluZyBzY3JpcHRzIGZyb20gY29udGVudDpcbiIgKyAoZS5kZXNjcmlwdGlvbiB8fCBlLnRvU3RyaW5nKCkpOworCQkJCQloYW5kbGVEZWZhdWx0cy5jYWxsKHRoaXMsIGUsICJvbkV4ZWNFcnJvciIsIHRydWUpOworCQkJCX0KKwkJCX07CisJCX0KKwkJaWYgKCF3aWRnZXRQcm90by5zZXRIYW5kbGVyKSB7CisJCQl3aWRnZXRQcm90by5zZXRIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHsKKwkJCQl2YXIgZmNuID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oaGFuZGxlcikgPyBoYW5kbGVyIDogd2luZG93W2hhbmRsZXJdOworCQkJCWlmICghaXNGdW5jKGZjbikpIHsKKwkJCQkJaGFuZGxlRGVmYXVsdHMuY2FsbCh0aGlzLCAiVW5hYmxlIHRvIHNldCBoYW5kbGVyLCAnIiArIGhhbmRsZXIgKyAiJyBub3QgYSBmdW5jdGlvbi4iLCAib25FeGVjRXJyb3IiLCB0cnVlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQl0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7CisJCQkJCXJldHVybiBmY24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCQl9OworCQkJfTsKKwkJfQorCQl3aWRnZXRQcm90by5fbG9hZGVyX2RlZmluZWQgPSB0cnVlOworCX07Cit9KSgpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2h0bWwvc3RhYmlsZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvaHRtbC9zdGFiaWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjN2ZiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L2h0bWwvc3RhYmlsZS5qcwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlIik7Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUgPSB7X3NxUXVvdGFibGVzOm5ldyBSZWdFeHAoIihbXFxcXCddKSIsICJnIiksIF9kZXB0aDowLCBfcmVjdXI6ZmFsc2UsIGRlcHRoTGltaXQ6Mn07Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoaWQpIHsKKwlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0dXAoKTsKKwlyZXR1cm4gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlW2lkXTsKK307Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoaWQsIHN0YXRlLCBpc0NvbW1pdCkgeworCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5zZXR1cCgpOworCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS53aWRnZXRTdGF0ZVtpZF0gPSBzdGF0ZTsKKwlpZiAoaXNDb21taXQpIHsKKwkJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmNvbW1pdChkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGUpOworCX0KK307Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0dXAgPSBmdW5jdGlvbiAoKSB7CisJaWYgKCFkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGUpIHsKKwkJdmFyIHRleHQgPSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2dldFN0b3JhZ2UoKS52YWx1ZTsKKwkJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlID0gdGV4dCA/IGRqX2V2YWwoIigiICsgdGV4dCArICIpIikgOiB7fTsKKwl9Cit9OworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmNvbW1pdCA9IGZ1bmN0aW9uIChzdGF0ZSkgeworCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZ2V0U3RvcmFnZSgpLnZhbHVlID0gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRlc2NyaXB0aW9uKHN0YXRlKTsKK307Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiAodiwgc2hvd0FsbCkgeworCXZhciBkZXB0aCA9IGRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGg7CisJdmFyIGRlc2NyaWJlVGhpcyA9IGZ1bmN0aW9uICgpIHsKKwkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24odGhpcywgdHJ1ZSk7CisJfTsKKwl0cnkgeworCQlpZiAodiA9PT0gdm9pZCAoMCkpIHsKKwkJCXJldHVybiAidW5kZWZpbmVkIjsKKwkJfQorCQlpZiAodiA9PT0gbnVsbCkgeworCQkJcmV0dXJuICJudWxsIjsKKwkJfQorCQlpZiAodHlwZW9mICh2KSA9PSAiYm9vbGVhbiIgfHwgdHlwZW9mICh2KSA9PSAibnVtYmVyIiB8fCB2IGluc3RhbmNlb2YgQm9vbGVhbiB8fCB2IGluc3RhbmNlb2YgTnVtYmVyKSB7CisJCQlyZXR1cm4gdi50b1N0cmluZygpOworCQl9CisJCWlmICh0eXBlb2YgKHYpID09ICJzdHJpbmciIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXZhciB2MSA9IHYucmVwbGFjZShkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX3NxUXVvdGFibGVzLCAiXFwkMSIpOworCQkJdjEgPSB2MS5yZXBsYWNlKC9cbi9nLCAiXFxuIik7CisJCQl2MSA9IHYxLnJlcGxhY2UoL1xyL2csICJcXHIiKTsKKwkJCXJldHVybiAiJyIgKyB2MSArICInIjsKKwkJfQorCQlpZiAodiBpbnN0YW5jZW9mIERhdGUpIHsKKwkJCXJldHVybiAibmV3IERhdGUoIiArIGQuZ2V0RnVsbFllYXIgKyAiLCIgKyBkLmdldE1vbnRoKCkgKyAiLCIgKyBkLmdldERhdGUoKSArICIpIjsKKwkJfQorCQl2YXIgZDsKKwkJaWYgKHYgaW5zdGFuY2VvZiBBcnJheSB8fCB2LnB1c2gpIHsKKwkJCWlmIChkZXB0aCA+PSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVwdGhMaW1pdCkgeworCQkJCXJldHVybiAiWyAuLi4gXSI7CisJCQl9CisJCQlkID0gIlsiOworCQkJdmFyIGZpcnN0ID0gdHJ1ZTsKKwkJCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGgrKzsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworCQkJCWlmIChmaXJzdCkgeworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCX0gZWxzZSB7CisJCQkJCWQgKz0gIiwiOworCQkJCX0KKwkJCQlkICs9IGFyZ3VtZW50cy5jYWxsZWUodltpXSwgc2hvd0FsbCk7CisJCQl9CisJCQlyZXR1cm4gZCArICJdIjsKKwkJfQorCQlpZiAodi5jb25zdHJ1Y3RvciA9PSBPYmplY3QgfHwgdi50b1N0cmluZyA9PSBkZXNjcmliZVRoaXMpIHsKKwkJCWlmIChkZXB0aCA+PSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVwdGhMaW1pdCkgeworCQkJCXJldHVybiAieyAuLi4gfSI7CisJCQl9CisJCQlpZiAodHlwZW9mICh2Lmhhc093blByb3BlcnR5KSAhPSAiZnVuY3Rpb24iICYmIHYucHJvdG90eXBlKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCJkZXNjcmlwdGlvbjogIiArIHYgKyAiIG5vdCBzdXBwb3J0ZWQgYnkgc2NyaXB0IGVuZ2luZSIpOworCQkJfQorCQkJdmFyIGZpcnN0ID0gdHJ1ZTsKKwkJCWQgPSAieyI7CisJCQlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2RlcHRoKys7CisJCQlmb3IgKHZhciBrZXkgaW4gdikgeworCQkJCWlmICh2W2tleV0gPT0gdm9pZCAoMCkgfHwgdHlwZW9mICh2W2tleV0pID09ICJmdW5jdGlvbiIpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChmaXJzdCkgeworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCX0gZWxzZSB7CisJCQkJCWQgKz0gIiwgIjsKKwkJCQl9CisJCQkJdmFyIGtkID0ga2V5OworCQkJCWlmICgha2QubWF0Y2goL15bYS16QS1aX11bYS16QS1aMC05X10qJC8pKSB7CisJCQkJCWtkID0gYXJndW1lbnRzLmNhbGxlZShrZXksIHNob3dBbGwpOworCQkJCX0KKwkJCQlkICs9IGtkICsgIjogIiArIGFyZ3VtZW50cy5jYWxsZWUodltrZXldLCBzaG93QWxsKTsKKwkJCX0KKwkJCXJldHVybiBkICsgIn0iOworCQl9CisJCWlmIChzaG93QWxsKSB7CisJCQlpZiAoZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9yZWN1cikgeworCQkJCXZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisJCQkJcmV0dXJuIG9iamVjdFRvU3RyaW5nLmFwcGx5KHYsIFtdKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9yZWN1ciA9IHRydWU7CisJCQkJcmV0dXJuIHYudG9TdHJpbmcoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBFcnJvcigiVW5rbm93biB0eXBlOiAiICsgdik7CisJCQlyZXR1cm4gIid1bmtub3duJyI7CisJCX0KKwl9CisJZmluYWxseSB7CisJCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGggPSBkZXB0aDsKKwl9Cit9OworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9nZXRTdG9yYWdlID0gZnVuY3Rpb24gKCkgeworCWlmIChkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGF0YUZpZWxkKSB7CisJCXJldHVybiBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGF0YUZpZWxkOworCX0KKwl2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zLl9kb2pvX2Zvcm07CisJcmV0dXJuIGRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5kYXRhRmllbGQgPSBmb3JtID8gZm9ybS5zdGFiaWxlIDoge3ZhbHVlOiIifTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL0Ryb3Bkb3duRGF0ZVBpY2tlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL0Ryb3Bkb3duRGF0ZVBpY2tlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWE1Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvRHJvcGRvd25EYXRlUGlja2VyLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJzZWxlY3REYXRlIjoiU2VsZWN0IGEgZGF0ZSJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL0Ryb3Bkb3duVGltZVBpY2tlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL0Ryb3Bkb3duVGltZVBpY2tlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk3ODE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvRHJvcGRvd25UaW1lUGlja2VyLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJzZWxlY3RUaW1lIjoiU2VsZWN0IHRpbWUifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L25scy9UaW1lUGlja2VyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvVGltZVBpY2tlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTExMWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvVGltZVBpY2tlci5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsiYW55IjoiYW55In0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvZnIvdmFsaWRhdGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L25scy9mci92YWxpZGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRhOWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvZnIvdmFsaWRhdGUuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7InJhbmdlTWVzc2FnZSI6IiogQ2V0dGUgdmFsZXVyIGVzdCBob3JzIGxpbWl0ZXMuIiwgImludmFsaWRNZXNzYWdlIjoiKiBMYSB2YWxldXIgc2Fpc2llIGVzdCBpbmNvcnJlY3RlLiIsICJtaXNzaW5nTWVzc2FnZSI6IiogQ2V0dGUgdmFsZXVyIGVzdCBvYmxpZ2F0b2lyZS4ifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L25scy9qYS92YWxpZGF0ZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL2phL3ZhbGlkYXRlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYzJlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L25scy9qYS92YWxpZGF0ZS5qcwpAQCAtMCwwICsxLDEzIEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworKHsicmFuZ2VNZXNzYWdlIjoiKiBcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNWZcdTY1NzBcdTUwMjRcdTMwNmZcdTkwNzhcdTYyOWVcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDIiLCAiaW52YWxpZE1lc3NhZ2UiOiIqIFx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA1Zlx1MzBjN1x1MzBmY1x1MzBiZlx1MzA2Ylx1OGE3Mlx1NWY1M1x1MzA1OVx1MzA4Ylx1MzA4Mlx1MzA2ZVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiIsICJtaXNzaW5nTWVzc2FnZSI6IiogXHU1MTY1XHU1MjliXHUzMDRjXHU1ZmM1XHU5ODA4XHUzMDY3XHUzMDU5XHUzMDAyIn0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvdmFsaWRhdGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L25scy92YWxpZGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ3ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvdmFsaWRhdGUuanMKQEAgLTAsMCArMSwxMyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKKyh7InJhbmdlTWVzc2FnZSI6IiogVGhpcyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuIiwgImludmFsaWRNZXNzYWdlIjoiKiBUaGUgdmFsdWUgZW50ZXJlZCBpcyBub3QgdmFsaWQuIiwgIm1pc3NpbmdNZXNzYWdlIjoiKiBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkLiJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL3poLWNuL3ZhbGlkYXRlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC9ubHMvemgtY24vdmFsaWRhdGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NjY5OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvbmxzL3poLWNuL3ZhbGlkYXRlLmpzCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCisoeyJyYW5nZU1lc3NhZ2UiOiIqIFx1OGY5M1x1NTE2NVx1NjU3MFx1NjM2ZVx1OGQ4NVx1NTFmYVx1NTAzY1x1NTdkZlx1MzAwMiIsICJpbnZhbGlkTWVzc2FnZSI6IiogXHU5NzVlXHU2Y2Q1XHU3Njg0XHU4ZjkzXHU1MTY1XHU1MDNjXHUzMDAyIiwgIm1pc3NpbmdNZXNzYWdlIjoiKiBcdTZiNjRcdTUwM2NcdTY2MmZcdTVmYzVcdTk4N2JcdTc2ODRcdTMwMDIifSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3N2Zy9DaGFydC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvc3ZnL0NoYXJ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDk4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3N2Zy9DaGFydC5qcwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuc3ZnLkNoYXJ0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ2hhcnQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLmxheW91dCIpOworZG9qby5yZXF1aXJlKCJkb2pvLm1hdGgiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5zdmciKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5qc29uIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LnN2Zy5DaGFydCIsIFtkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBkb2pvLndpZGdldC5DaGFydF0sIGZ1bmN0aW9uICgpIHsKKwl0aGlzLnRlbXBsYXRlUGF0aCA9IG51bGw7CisJdGhpcy50ZW1wbGF0ZUNzc1BhdGggPSBudWxsOworCXRoaXMuX2lzSW5pdGlhbGl6ZSA9IGZhbHNlOworCXRoaXMuaGFzRGF0YSA9IGZhbHNlOworCXRoaXMudmVjdG9yTm9kZSA9IG51bGw7CisJdGhpcy5wbG90QXJlYSA9IG51bGw7CisJdGhpcy5kYXRhR3JvdXAgPSBudWxsOworCXRoaXMuYXhpc0dyb3VwID0gbnVsbDsKKwl0aGlzLnByb3BlcnRpZXMgPSB7aGVpZ2h0OjAsIHdpZHRoOjAsIGRlZmF1bHRXaWR0aDo2MDAsIGRlZmF1bHRIZWlnaHQ6NDAwLCBwbG90VHlwZTpudWxsLCBwYWRkaW5nOnt0b3A6MTAsIGJvdHRvbToyLCBsZWZ0OjYwLCByaWdodDozMH0sIGF4ZXM6e3g6e3Bsb3RBdDowLCBsYWJlbDoiIiwgdW5pdExhYmVsOiIiLCB1bml0VHlwZTpOdW1iZXIsIG5Vbml0c1RvU2hvdzoxMCwgcmFuZ2U6e21pbjowLCBtYXg6MjAwfX0sIHk6e3Bsb3RBdDowLCBsYWJlbDoiIiwgdW5pdExhYmVsOiIiLCB1bml0VHlwZTpOdW1iZXIsIG5Vbml0c1RvU2hvdzoxMCwgcmFuZ2U6e21pbjowLCBtYXg6MjAwfX19fTsKK30sIHtwYXJzZVByb3BlcnRpZXM6ZnVuY3Rpb24gKG5vZGUpIHsKKwl2YXIgYlJhbmdlWCA9IGZhbHNlOworCXZhciBiUmFuZ2VZID0gZmFsc2U7CisJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpKSB7CisJCXRoaXMucHJvcGVydGllcy53aWR0aCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOworCX0KKwlpZiAobm9kZS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpKSB7CisJCXRoaXMucHJvcGVydGllcy5oZWlnaHQgPSBub2RlLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iik7CisJfQorCWlmIChub2RlLmdldEF0dHJpYnV0ZSgicGxvdFR5cGUiKSkgeworCQl0aGlzLnByb3BlcnRpZXMucGxvdFR5cGUgPSBub2RlLmdldEF0dHJpYnV0ZSgicGxvdFR5cGUiKTsKKwl9CisJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJwYWRkaW5nIikpIHsKKwkJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJwYWRkaW5nIikuaW5kZXhPZigiLCIpID4gLTEpIHsKKwkJCXZhciBwID0gbm9kZS5nZXRBdHRyaWJ1dGUoInBhZGRpbmciKS5zcGxpdCgiLCIpOworCQl9IGVsc2UgeworCQkJdmFyIHAgPSBub2RlLmdldEF0dHJpYnV0ZSgicGFkZGluZyIpLnNwbGl0KCIgIik7CisJCX0KKwkJaWYgKHAubGVuZ3RoID09IDEpIHsKKwkJCXZhciBwYWQgPSBwYXJzZUZsb2F0KHBbMF0pOworCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wID0gcGFkOworCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcucmlnaHQgPSBwYWQ7CisJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5ib3R0b20gPSBwYWQ7CisJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5sZWZ0ID0gcGFkOworCQl9IGVsc2UgeworCQkJaWYgKHAubGVuZ3RoID09IDIpIHsKKwkJCQl2YXIgcGFkViA9IHBhcnNlRmxvYXQocFswXSk7CisJCQkJdmFyIHBhZEggPSBwYXJzZUZsb2F0KHBbMV0pOworCQkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCA9IHBhZFY7CisJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcucmlnaHQgPSBwYWRIOworCQkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSA9IHBhZFY7CisJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCA9IHBhZEg7CisJCQl9IGVsc2UgeworCQkJCWlmIChwLmxlbmd0aCA9PSA0KSB7CisJCQkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCA9IHBhcnNlRmxvYXQocFswXSk7CisJCQkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0ID0gcGFyc2VGbG9hdChwWzFdKTsKKwkJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcuYm90dG9tID0gcGFyc2VGbG9hdChwWzJdKTsKKwkJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCA9IHBhcnNlRmxvYXQocFszXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChub2RlLmdldEF0dHJpYnV0ZSgicmFuZ2VYIikpIHsKKwkJdmFyIHAgPSBub2RlLmdldEF0dHJpYnV0ZSgicmFuZ2VYIik7CisJCWlmIChwLmluZGV4T2YoIiwiKSA+IC0xKSB7CisJCQlwID0gcC5zcGxpdCgiLCIpOworCQl9IGVsc2UgeworCQkJcCA9IHAuc3BsaXQoIiAiKTsKKwkJfQorCQl0aGlzLnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1pbiA9IHBhcnNlRmxvYXQocFswXSk7CisJCXRoaXMucHJvcGVydGllcy5heGVzLngucmFuZ2UubWF4ID0gcGFyc2VGbG9hdChwWzFdKTsKKwkJYlJhbmdlWCA9IHRydWU7CisJfQorCWlmIChub2RlLmdldEF0dHJpYnV0ZSgicmFuZ2VZIikpIHsKKwkJdmFyIHAgPSBub2RlLmdldEF0dHJpYnV0ZSgicmFuZ2VZIik7CisJCWlmIChwLmluZGV4T2YoIiwiKSA+IC0xKSB7CisJCQlwID0gcC5zcGxpdCgiLCIpOworCQl9IGVsc2UgeworCQkJcCA9IHAuc3BsaXQoIiAiKTsKKwkJfQorCQl0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1pbiA9IHBhcnNlRmxvYXQocFswXSk7CisJCXRoaXMucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWF4ID0gcGFyc2VGbG9hdChwWzFdKTsKKwkJYlJhbmdlWSA9IHRydWU7CisJfQorCXJldHVybiB7cmFuZ2VYOmJSYW5nZVgsIHJhbmdlWTpiUmFuZ2VZfTsKK30sIHNldEF4ZXNQbG90OmZ1bmN0aW9uICh0YWJsZSkgeworCWlmICh0YWJsZS5nZXRBdHRyaWJ1dGUoImF4aXNBdCIpKSB7CisJCXZhciBwID0gdGFibGUuZ2V0QXR0cmlidXRlKCJheGlzQXQiKTsKKwkJaWYgKHAuaW5kZXhPZigiLCIpID4gLTEpIHsKKwkJCXAgPSBwLnNwbGl0KCIsIik7CisJCX0gZWxzZSB7CisJCQlwID0gcC5zcGxpdCgiICIpOworCQl9CisJCWlmICghaXNOYU4ocGFyc2VGbG9hdChwWzBdKSkpIHsKKwkJCXRoaXMucHJvcGVydGllcy5heGVzLngucGxvdEF0ID0gcGFyc2VGbG9hdChwWzBdKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwWzBdLnRvTG93ZXJDYXNlKCkgPT0gInltaW4iKSB7CisJCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQgPSB0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1pbjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBbMF0udG9Mb3dlckNhc2UoKSA9PSAieW1heCIpIHsKKwkJCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQgPSB0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1heDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFpc05hTihwYXJzZUZsb2F0KHBbMV0pKSkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueS5wbG90QXQgPSBwYXJzZUZsb2F0KHBbMV0pOworCQl9IGVsc2UgeworCQkJaWYgKHBbMV0udG9Mb3dlckNhc2UoKSA9PSAieG1pbiIpIHsKKwkJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy55LnBsb3RBdCA9IHRoaXMucHJvcGVydGllcy5heGVzLngucmFuZ2UubWluOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocFsxXS50b0xvd2VyQ2FzZSgpID09ICJ4bWF4IikgeworCQkJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy55LnBsb3RBdCA9IHRoaXMucHJvcGVydGllcy5heGVzLngucmFuZ2UubWF4OworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXRoaXMucHJvcGVydGllcy5heGVzLngucGxvdEF0ID0gdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueS5yYW5nZS5taW47CisJCXRoaXMucHJvcGVydGllcy5heGVzLnkucGxvdEF0ID0gdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5taW47CisJfQorfSwgZHJhd1ZlY3Rvck5vZGU6ZnVuY3Rpb24gKCkgeworCWRvam8uc3ZnLmcuc3VzcGVuZCgpOworCWlmICh0aGlzLnZlY3Rvck5vZGUpIHsKKwkJdGhpcy5kZXN0cm95KCk7CisJfQorCXRoaXMudmVjdG9yTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJzdmciKTsKKwl0aGlzLnZlY3Rvck5vZGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHRoaXMucHJvcGVydGllcy53aWR0aCk7CisJdGhpcy52ZWN0b3JOb2RlLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCk7CisJZG9qby5zdmcuZy5yZXN1bWUoKTsKK30sIGRyYXdQbG90QXJlYTpmdW5jdGlvbiAoKSB7CisJZG9qby5zdmcuZy5zdXNwZW5kKCk7CisJaWYgKHRoaXMucGxvdEFyZWEpIHsKKwkJdGhpcy5wbG90QXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxvdEFyZWEpOworCQl0aGlzLnBsb3RBcmVhID0gbnVsbDsKKwl9CisJdmFyIGRlZnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZGVmcyIpOworCXZhciBjbGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImNsaXBQYXRoIik7CisJY2xpcC5zZXRBdHRyaWJ1dGUoImlkIiwgInBsb3RDbGlwIiArIHRoaXMud2lkZ2V0SWQpOworCXZhciByZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInJlY3QiKTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgieCIsIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQpOworCXJlY3Quc2V0QXR0cmlidXRlKCJ5IiwgdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wKTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgid2lkdGgiLCB0aGlzLnByb3BlcnRpZXMud2lkdGggLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5sZWZ0IC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcucmlnaHQpOworCXJlY3Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLCB0aGlzLnByb3BlcnRpZXMuaGVpZ2h0IC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wIC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcuYm90dG9tKTsKKwljbGlwLmFwcGVuZENoaWxkKHJlY3QpOworCWRlZnMuYXBwZW5kQ2hpbGQoY2xpcCk7CisJdGhpcy52ZWN0b3JOb2RlLmFwcGVuZENoaWxkKGRlZnMpOworCXRoaXMucGxvdEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCXRoaXMudmVjdG9yTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnBsb3RBcmVhKTsKKwl2YXIgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJyZWN0Iik7CisJcmVjdC5zZXRBdHRyaWJ1dGUoIngiLCB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5sZWZ0KTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgieSIsIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdGhpcy5wcm9wZXJ0aWVzLndpZHRoIC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0KTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoImZpbGwiLCAiI2ZmZiIpOworCXRoaXMucGxvdEFyZWEuYXBwZW5kQ2hpbGQocmVjdCk7CisJZG9qby5zdmcuZy5yZXN1bWUoKTsKK30sIGRyYXdEYXRhR3JvdXA6ZnVuY3Rpb24gKCkgeworCWRvam8uc3ZnLmcuc3VzcGVuZCgpOworCWlmICh0aGlzLmRhdGFHcm91cCkgeworCQl0aGlzLmRhdGFHcm91cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZGF0YUdyb3VwKTsKKwkJdGhpcy5kYXRhR3JvdXAgPSBudWxsOworCX0KKwl0aGlzLmRhdGFHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJnIik7CisJdGhpcy5kYXRhR3JvdXAuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJjbGlwLXBhdGg6dXJsKCNwbG90Q2xpcCIgKyB0aGlzLndpZGdldElkICsgIik7Iik7CisJdGhpcy5wbG90QXJlYS5hcHBlbmRDaGlsZCh0aGlzLmRhdGFHcm91cCk7CisJZG9qby5zdmcuZy5yZXN1bWUoKTsKK30sIGRyYXdBeGVzOmZ1bmN0aW9uICgpIHsKKwlkb2pvLnN2Zy5nLnN1c3BlbmQoKTsKKwlpZiAodGhpcy5heGlzR3JvdXApIHsKKwkJdGhpcy5heGlzR3JvdXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmF4aXNHcm91cCk7CisJCXRoaXMuYXhpc0dyb3VwID0gbnVsbDsKKwl9CisJdGhpcy5heGlzR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAiZyIpOworCXRoaXMucGxvdEFyZWEuYXBwZW5kQ2hpbGQodGhpcy5heGlzR3JvdXApOworCXZhciBzdHJva2UgPSAxOworCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImxpbmUiKTsKKwl2YXIgeSA9IGRvam8ud2lkZ2V0LnN2Zy5DaGFydC5QbG90dGVyLmdldFkodGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQsIHRoaXMpOworCWxpbmUuc2V0QXR0cmlidXRlKCJ5MSIsIHkpOworCWxpbmUuc2V0QXR0cmlidXRlKCJ5MiIsIHkpOworCWxpbmUuc2V0QXR0cmlidXRlKCJ4MSIsIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgLSBzdHJva2UpOworCWxpbmUuc2V0QXR0cmlidXRlKCJ4MiIsIHRoaXMucHJvcGVydGllcy53aWR0aCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0KTsKKwlsaW5lLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAic3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOiIgKyBzdHJva2UgKyAiOyIpOworCXRoaXMuYXhpc0dyb3VwLmFwcGVuZENoaWxkKGxpbmUpOworCXZhciB0ZXh0U2l6ZSA9IDEwOworCXZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInRleHQiKTsKKwl0ZXh0LnNldEF0dHJpYnV0ZSgieCIsIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQpOworCXRleHQuc2V0QXR0cmlidXRlKCJ5IiwgdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSArIHRleHRTaXplICsgMik7CisJdGV4dC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6IiArIHRleHRTaXplICsgInB4O2ZpbGw6IzAwMDsiKTsKKwl0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRvam8ubWF0aC5yb3VuZChwYXJzZUZsb2F0KHRoaXMucHJvcGVydGllcy5heGVzLngucmFuZ2UubWluKSwgMikpKTsKKwl0aGlzLmF4aXNHcm91cC5hcHBlbmRDaGlsZCh0ZXh0KTsKKwl2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJ0ZXh0Iik7CisJdGV4dC5zZXRBdHRyaWJ1dGUoIngiLCB0aGlzLnByb3BlcnRpZXMud2lkdGggLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5yaWdodCAtICh0ZXh0U2l6ZSAvIDIpKTsKKwl0ZXh0LnNldEF0dHJpYnV0ZSgieSIsIHRoaXMucHJvcGVydGllcy5oZWlnaHQgLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5ib3R0b20gKyB0ZXh0U2l6ZSArIDIpOworCXRleHQuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJ0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOiIgKyB0ZXh0U2l6ZSArICJweDtmaWxsOiMwMDA7Iik7CisJdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkb2pvLm1hdGgucm91bmQocGFyc2VGbG9hdCh0aGlzLnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1heCksIDIpKSk7CisJdGhpcy5heGlzR3JvdXAuYXBwZW5kQ2hpbGQodGV4dCk7CisJdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAibGluZSIpOworCXZhciB4ID0gZG9qby53aWRnZXQuc3ZnLkNoYXJ0LlBsb3R0ZXIuZ2V0WCh0aGlzLnByb3BlcnRpZXMuYXhlcy55LnBsb3RBdCwgdGhpcyk7CisJbGluZS5zZXRBdHRyaWJ1dGUoIngxIiwgeCk7CisJbGluZS5zZXRBdHRyaWJ1dGUoIngyIiwgeCk7CisJbGluZS5zZXRBdHRyaWJ1dGUoInkxIiwgdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wKTsKKwlsaW5lLnNldEF0dHJpYnV0ZSgieTIiLCB0aGlzLnByb3BlcnRpZXMuaGVpZ2h0IC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcuYm90dG9tKTsKKwlsaW5lLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAic3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOiIgKyBzdHJva2UgKyAiOyIpOworCXRoaXMuYXhpc0dyb3VwLmFwcGVuZENoaWxkKGxpbmUpOworCXZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInRleHQiKTsKKwl0ZXh0LnNldEF0dHJpYnV0ZSgieCIsIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgLSA0KTsKKwl0ZXh0LnNldEF0dHJpYnV0ZSgieSIsIHRoaXMucHJvcGVydGllcy5oZWlnaHQgLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5ib3R0b20pOworCXRleHQuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJ0ZXh0LWFuY2hvcjplbmQ7Zm9udC1zaXplOiIgKyB0ZXh0U2l6ZSArICJweDtmaWxsOiMwMDA7Iik7CisJdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkb2pvLm1hdGgucm91bmQocGFyc2VGbG9hdCh0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1pbiksIDIpKSk7CisJdGhpcy5heGlzR3JvdXAuYXBwZW5kQ2hpbGQodGV4dCk7CisJdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAidGV4dCIpOworCXRleHQuc2V0QXR0cmlidXRlKCJ4IiwgdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCAtIDQpOworCXRleHQuc2V0QXR0cmlidXRlKCJ5IiwgdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wICsgKHRleHRTaXplIC8gMikpOworCXRleHQuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJ0ZXh0LWFuY2hvcjplbmQ7Zm9udC1zaXplOiIgKyB0ZXh0U2l6ZSArICJweDtmaWxsOiMwMDA7Iik7CisJdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkb2pvLm1hdGgucm91bmQocGFyc2VGbG9hdCh0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1heCksIDIpKSk7CisJdGhpcy5heGlzR3JvdXAuYXBwZW5kQ2hpbGQodGV4dCk7CisJZG9qby5zdmcuZy5yZXN1bWUoKTsKK30sIGluaXQ6ZnVuY3Rpb24gKCkgeworCWlmICghdGhpcy5wcm9wZXJ0aWVzLndpZHRoIHx8ICF0aGlzLnByb3BlcnRpZXMuaGVpZ2h0KSB7CisJCXZhciBib3ggPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmRvbU5vZGUpOworCQlpZiAoIXRoaXMucHJvcGVydGllcy53aWR0aCkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLndpZHRoID0gKGJveC53aWR0aCA8IDMyKSA/IHRoaXMucHJvcGVydGllcy5kZWZhdWx0V2lkdGggOiBib3gud2lkdGg7CisJCX0KKwkJaWYgKCF0aGlzLnByb3BlcnRpZXMuaGVpZ2h0KSB7CisJCQl0aGlzLnByb3BlcnRpZXMuaGVpZ2h0ID0gKGJveC5oZWlnaHQgPCAzMikgPyB0aGlzLnByb3BlcnRpZXMuZGVmYXVsdEhlaWdodCA6IGJveC5oZWlnaHQ7CisJCX0KKwl9CisJdGhpcy5kcmF3VmVjdG9yTm9kZSgpOworCXRoaXMuZHJhd1Bsb3RBcmVhKCk7CisJdGhpcy5kcmF3RGF0YUdyb3VwKCk7CisJdGhpcy5kcmF3QXhlcygpOworCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLnZlY3Rvck5vZGUpOworCXRoaXMuYXNzaWduQ29sb3JzKCk7CisJdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7Cit9LCBkZXN0cm95OmZ1bmN0aW9uICgpIHsKKwl3aGlsZSAodGhpcy5kb21Ob2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkgeworCQl0aGlzLmRvbU5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb21Ob2RlLmNoaWxkTm9kZXMuaXRlbSgwKSk7CisJfQorCXRoaXMudmVjdG9yTm9kZSA9IHRoaXMucGxvdEFyZWEgPSB0aGlzLmRhdGFHcm91cCA9IHRoaXMuYXhpc0dyb3VwID0gbnVsbDsKK30sIHJlbmRlcjpmdW5jdGlvbiAoKSB7CisJZG9qby5zdmcuZy5zdXNwZW5kKCk7CisJaWYgKHRoaXMuZGF0YUdyb3VwKSB7CisJCXdoaWxlICh0aGlzLmRhdGFHcm91cC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJCXRoaXMuZGF0YUdyb3VwLnJlbW92ZUNoaWxkKHRoaXMuZGF0YUdyb3VwLmNoaWxkTm9kZXMuaXRlbSgwKSk7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLmluaXQoKTsKKwl9CisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlcmllcy5sZW5ndGg7IGkrKykgeworCQlkb2pvLndpZGdldC5zdmcuQ2hhcnQuUGxvdHRlci5wbG90KHRoaXMuc2VyaWVzW2ldLCB0aGlzKTsKKwl9CisJZG9qby5zdmcuZy5yZXN1bWUoKTsKK30sIHBvc3RDcmVhdGU6ZnVuY3Rpb24gKCkgeworCXZhciB0YWJsZSA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXTsKKwlpZiAodGFibGUpIHsKKwkJdmFyIHJhbmdlcyA9IHRoaXMucGFyc2VQcm9wZXJ0aWVzKHRhYmxlKTsKKwkJdmFyIGJSYW5nZVggPSBmYWxzZTsKKwkJdmFyIGJSYW5nZVkgPSBmYWxzZTsKKwkJdmFyIGF4aXNWYWx1ZXMgPSB0aGlzLnBhcnNlRGF0YSh0YWJsZSk7CisJCWlmICghYlJhbmdlWCkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZSA9IHttaW46YXhpc1ZhbHVlcy54Lm1pbiwgbWF4OmF4aXNWYWx1ZXMueC5tYXh9OworCQl9CisJCWlmICghYlJhbmdlWSkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueS5yYW5nZSA9IHttaW46YXhpc1ZhbHVlcy55Lm1pbiwgbWF4OmF4aXNWYWx1ZXMueS5tYXh9OworCQl9CisJCXRoaXMuc2V0QXhlc1Bsb3QodGFibGUpOworCQl0aGlzLmRvbU5vZGUucmVtb3ZlQ2hpbGQodGFibGUpOworCX0KKwlpZiAodGhpcy5zZXJpZXMubGVuZ3RoID4gMCkgeworCQl0aGlzLnJlbmRlcigpOworCX0KK319KTsKK2Rvam8ud2lkZ2V0LnN2Zy5DaGFydC5QbG90dGVyID0gbmV3IGZ1bmN0aW9uICgpIHsKKwl2YXIgc2VsZiA9IHRoaXM7CisJdmFyIHBsb3R0ZXJzID0ge307CisJdmFyIHR5cGVzID0gZG9qby53aWRnZXQuQ2hhcnQuUGxvdFR5cGVzOworCXRoaXMuZ2V0WCA9IGZ1bmN0aW9uICh2YWx1ZSwgY2hhcnQpIHsKKwkJdmFyIHYgPSBwYXJzZUZsb2F0KHZhbHVlKTsKKwkJdmFyIG1pbiA9IGNoYXJ0LnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1pbjsKKwkJdmFyIG1heCA9IGNoYXJ0LnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1heDsKKwkJdmFyIG9mc3QgPSAwIC0gbWluOworCQltaW4gKz0gb2ZzdDsKKwkJbWF4ICs9IG9mc3Q7CisJCXYgKz0gb2ZzdDsKKwkJdmFyIHhtaW4gPSBjaGFydC5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdDsKKwkJdmFyIHhtYXggPSBjaGFydC5wcm9wZXJ0aWVzLndpZHRoIC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0OworCQl2YXIgeCA9ICh2ICogKCh4bWF4IC0geG1pbikgLyBtYXgpKSArIHhtaW47CisJCXJldHVybiB4OworCX07CisJdGhpcy5nZXRZID0gZnVuY3Rpb24gKHZhbHVlLCBjaGFydCkgeworCQl2YXIgdiA9IHBhcnNlRmxvYXQodmFsdWUpOworCQl2YXIgbWF4ID0gY2hhcnQucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWF4OworCQl2YXIgbWluID0gY2hhcnQucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWluOworCQl2YXIgb2ZzdCA9IDA7CisJCWlmIChtaW4gPCAwKSB7CisJCQlvZnN0ICs9IE1hdGguYWJzKG1pbik7CisJCX0KKwkJbWluICs9IG9mc3Q7CisJCW1heCArPSBvZnN0OworCQl2ICs9IG9mc3Q7CisJCXZhciB5bWluID0gY2hhcnQucHJvcGVydGllcy5oZWlnaHQgLSBjaGFydC5wcm9wZXJ0aWVzLnBhZGRpbmcuYm90dG9tOworCQl2YXIgeW1heCA9IGNoYXJ0LnByb3BlcnRpZXMucGFkZGluZy50b3A7CisJCXZhciB5ID0gKCgoeW1pbiAtIHltYXgpIC8gKG1heCAtIG1pbikpICogKG1heCAtIHYpKSArIHltYXg7CisJCXJldHVybiB5OworCX07CisJdGhpcy5hZGRQbG90dGVyID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHsKKwkJcGxvdHRlcnNbbmFtZV0gPSBmdW5jOworCX07CisJdGhpcy5wbG90ID0gZnVuY3Rpb24gKHNlcmllcywgY2hhcnQpIHsKKwkJaWYgKHNlcmllcy52YWx1ZXMubGVuZ3RoID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc2VyaWVzLnBsb3RUeXBlICYmIHBsb3R0ZXJzW3Nlcmllcy5wbG90VHlwZV0pIHsKKwkJCXJldHVybiBwbG90dGVyc1tzZXJpZXMucGxvdFR5cGVdKHNlcmllcywgY2hhcnQpOworCQl9IGVsc2UgeworCQkJaWYgKGNoYXJ0LnBsb3RUeXBlICYmIHBsb3R0ZXJzW2NoYXJ0LnBsb3RUeXBlXSkgeworCQkJCXJldHVybiBwbG90dGVyc1tjaGFydC5wbG90VHlwZV0oc2VyaWVzLCBjaGFydCk7CisJCQl9CisJCX0KKwl9OworCXBsb3R0ZXJzWyJiYXIiXSA9IGZ1bmN0aW9uIChzZXJpZXMsIGNoYXJ0KSB7CisJCXZhciBzcGFjZSA9IDE7CisJCXZhciBsYXN0VyA9IDA7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLnZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBzZWxmLmdldFgoc2VyaWVzLnZhbHVlc1tpXS54LCBjaGFydCk7CisJCQl2YXIgdzsKKwkJCWlmIChpID09IHNlcmllcy52YWx1ZXMubGVuZ3RoIC0gMSkgeworCQkJCXcgPSBsYXN0VzsKKwkJCX0gZWxzZSB7CisJCQkJdyA9IHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2kgKyAxXS54LCBjaGFydCkgLSB4IC0gc3BhY2U7CisJCQkJbGFzdFcgPSB3OworCQkJfQorCQkJeCAtPSAodyAvIDIpOworCQkJdmFyIHlBID0gc2VsZi5nZXRZKGNoYXJ0LnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCwgY2hhcnQpOworCQkJdmFyIHkgPSBzZWxmLmdldFkoc2VyaWVzLnZhbHVlc1tpXS52YWx1ZSwgY2hhcnQpOworCQkJdmFyIGggPSBNYXRoLmFicyh5QSAtIHkpOworCQkJaWYgKHBhcnNlRmxvYXQoc2VyaWVzLnZhbHVlc1tpXS52YWx1ZSkgPCBjaGFydC5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQpIHsKKwkJCQl2YXIgb3kgPSB5QTsKKwkJCQl5QSA9IHk7CisJCQkJeSA9IG95OworCQkJfQorCQkJdmFyIGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJyZWN0Iik7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsIiwgc2VyaWVzLmNvbG9yKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgc2VyaWVzLmxhYmVsICsgIjogIiArIHNlcmllcy52YWx1ZXNbaV0udmFsdWUpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIngiLCB4KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoInkiLCB5KTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoIndpZHRoIiwgdyk7CisJCQliYXIuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoKTsKKwkJCWJhci5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjkiKTsKKwkJCWNoYXJ0LmRhdGFHcm91cC5hcHBlbmRDaGlsZChiYXIpOworCQl9CisJfTsKKwlwbG90dGVyc1sibGluZSJdID0gZnVuY3Rpb24gKHNlcmllcywgY2hhcnQpIHsKKwkJdmFyIHRlbnNpb24gPSAxLjU7CisJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgInBhdGgiKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwgc2VyaWVzLmNvbG9yKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsICIyIik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsICIwLjg1Iik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHNlcmllcy5sYWJlbCk7CisJCWNoYXJ0LmRhdGFHcm91cC5hcHBlbmRDaGlsZChsaW5lKTsKKwkJdmFyIHBhdGggPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KTsKKwkJCXZhciB5ID0gc2VsZi5nZXRZKHNlcmllcy52YWx1ZXNbaV0udmFsdWUsIGNoYXJ0KTsKKwkJCXZhciBkeCA9IGNoYXJ0LnByb3BlcnRpZXMucGFkZGluZy5sZWZ0ICsgMTsKKwkJCXZhciBkeSA9IGNoYXJ0LnByb3BlcnRpZXMuaGVpZ2h0IC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbTsKKwkJCWlmIChpID4gMCkgeworCQkJCWR4ID0geCAtIHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2kgLSAxXS54LCBjaGFydCk7CisJCQkJZHkgPSBzZWxmLmdldFkoc2VyaWVzLnZhbHVlc1tpIC0gMV0udmFsdWUsIGNoYXJ0KTsKKwkJCX0KKwkJCWlmIChpID09IDApIHsKKwkJCQlwYXRoLnB1c2goIk0iKTsKKwkJCX0gZWxzZSB7CisJCQkJcGF0aC5wdXNoKCJDIik7CisJCQkJdmFyIGN4ID0geCAtICh0ZW5zaW9uIC0gMSkgKiAoZHggLyB0ZW5zaW9uKTsKKwkJCQlwYXRoLnB1c2goY3ggKyAiLCIgKyBkeSk7CisJCQkJY3ggPSB4IC0gKGR4IC8gdGVuc2lvbik7CisJCQkJcGF0aC5wdXNoKGN4ICsgIiwiICsgeSk7CisJCQl9CisJCQlwYXRoLnB1c2goeCArICIsIiArIHkpOworCQl9CisJCWxpbmUuc2V0QXR0cmlidXRlKCJkIiwgcGF0aC5qb2luKCIgIikpOworCX07CisJcGxvdHRlcnNbImFyZWEiXSA9IGZ1bmN0aW9uIChzZXJpZXMsIGNoYXJ0KSB7CisJCXZhciB0ZW5zaW9uID0gMS41OworCQl2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb2pvLnN2Zy54bWxucy5zdmcsICJwYXRoIik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJmaWxsIiwgc2VyaWVzLmNvbG9yKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjQiKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsIHNlcmllcy5jb2xvcik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAiMSIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLCAiMC44Iik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHNlcmllcy5sYWJlbCk7CisJCWNoYXJ0LmRhdGFHcm91cC5hcHBlbmRDaGlsZChsaW5lKTsKKwkJdmFyIHBhdGggPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KTsKKwkJCXZhciB5ID0gc2VsZi5nZXRZKHNlcmllcy52YWx1ZXNbaV0udmFsdWUsIGNoYXJ0KTsKKwkJCXZhciBkeCA9IGNoYXJ0LnByb3BlcnRpZXMucGFkZGluZy5sZWZ0ICsgMTsKKwkJCXZhciBkeSA9IGNoYXJ0LnByb3BlcnRpZXMuaGVpZ2h0IC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbTsKKwkJCWlmIChpID4gMCkgeworCQkJCWR4ID0geCAtIHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2kgLSAxXS54LCBjaGFydCk7CisJCQkJZHkgPSBzZWxmLmdldFkoc2VyaWVzLnZhbHVlc1tpIC0gMV0udmFsdWUsIGNoYXJ0KTsKKwkJCX0KKwkJCWlmIChpID09IDApIHsKKwkJCQlwYXRoLnB1c2goIk0iKTsKKwkJCX0gZWxzZSB7CisJCQkJcGF0aC5wdXNoKCJDIik7CisJCQkJdmFyIGN4ID0geCAtICh0ZW5zaW9uIC0gMSkgKiAoZHggLyB0ZW5zaW9uKTsKKwkJCQlwYXRoLnB1c2goY3ggKyAiLCIgKyBkeSk7CisJCQkJY3ggPSB4IC0gKGR4IC8gdGVuc2lvbik7CisJCQkJcGF0aC5wdXNoKGN4ICsgIiwiICsgeSk7CisJCQl9CisJCQlwYXRoLnB1c2goeCArICIsIiArIHkpOworCQl9CisJCXBhdGgucHVzaCgiTCIpOworCQlwYXRoLnB1c2goeCArICIsIiArIHNlbGYuZ2V0WSgwLCBjaGFydCkpOworCQlwYXRoLnB1c2goIkwiKTsKKwkJcGF0aC5wdXNoKHNlbGYuZ2V0WCgwLCBjaGFydCkgKyAiLCIgKyBzZWxmLmdldFkoMCwgY2hhcnQpKTsKKwkJcGF0aC5wdXNoKCJaIik7CisJCWxpbmUuc2V0QXR0cmlidXRlKCJkIiwgcGF0aC5qb2luKCIgIikpOworCX0sIHBsb3R0ZXJzWyJzY2F0dGVyIl0gPSBmdW5jdGlvbiAoc2VyaWVzLCBjaGFydCkgeworCQl2YXIgciA9IDc7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLnZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBzZWxmLmdldFgoc2VyaWVzLnZhbHVlc1tpXS54LCBjaGFydCk7CisJCQl2YXIgeSA9IHNlbGYuZ2V0WShzZXJpZXMudmFsdWVzW2ldLnZhbHVlLCBjaGFydCk7CisJCQl2YXIgcG9pbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZG9qby5zdmcueG1sbnMuc3ZnLCAicGF0aCIpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJmaWxsIiwgc2VyaWVzLmNvbG9yKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIiwgIjAiKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCBzZXJpZXMubGFiZWwgKyAiOiAiICsgc2VyaWVzLnZhbHVlc1tpXS52YWx1ZSk7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImQiLCAiTSAiICsgeCArICIsIiArICh5IC0gcikgKyAiICIgKyAiUSAiICsgeCArICIsIiArIHkgKyAiICIgKyAoeCArIHIpICsgIiwiICsgeSArICIgIiArICJRICIgKyB4ICsgIiwiICsgeSArICIgIiArIHggKyAiLCIgKyAoeSArIHIpICsgIiAiICsgIlEgIiArIHggKyAiLCIgKyB5ICsgIiAiICsgKHggLSByKSArICIsIiArIHkgKyAiICIgKyAiUSAiICsgeCArICIsIiArIHkgKyAiICIgKyB4ICsgIiwiICsgKHkgLSByKSArICIgIiArICJaIik7CisJCQljaGFydC5kYXRhR3JvdXAuYXBwZW5kQ2hpbGQocG9pbnQpOworCQl9CisJfTsKKwlwbG90dGVyc1siYnViYmxlIl0gPSBmdW5jdGlvbiAoc2VyaWVzLCBjaGFydCkgeworCQl2YXIgbWluUiA9IDE7CisJCXZhciBtaW4gPSBjaGFydC5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5taW47CisJCXZhciBtYXggPSBjaGFydC5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5tYXg7CisJCXZhciBvZnN0ID0gMCAtIG1pbjsKKwkJbWluICs9IG9mc3Q7CisJCW1heCArPSBvZnN0OworCQl2YXIgeG1pbiA9IGNoYXJ0LnByb3BlcnRpZXMucGFkZGluZy5sZWZ0OworCQl2YXIgeG1heCA9IGNoYXJ0LnByb3BlcnRpZXMud2lkdGggLSBjaGFydC5wcm9wZXJ0aWVzLnBhZGRpbmcucmlnaHQ7CisJCXZhciBmYWN0b3IgPSAobWF4IC0gbWluKSAvICh4bWF4IC0geG1pbikgKiAyNTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgc2l6ZSA9IHNlcmllcy52YWx1ZXNbaV0uc2l6ZTsKKwkJCWlmIChpc05hTihwYXJzZUZsb2F0KHNpemUpKSkgeworCQkJCXNpemUgPSBtaW5SOworCQkJfQorCQkJdmFyIHBvaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvam8uc3ZnLnhtbG5zLnN2ZywgImNpcmNsZSIpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLCAwKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgiZmlsbCIsIHNlcmllcy5jb2xvcik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGwtb3BhY2l0eSIsICIwLjgiKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgiciIsIChwYXJzZUZsb2F0KHNpemUpICogZmFjdG9yKSAvIDIpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJjeCIsIHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KSk7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImN5Iiwgc2VsZi5nZXRZKHNlcmllcy52YWx1ZXNbaV0udmFsdWUsIGNoYXJ0KSk7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgc2VyaWVzLmxhYmVsICsgIjogIiArIHNlcmllcy52YWx1ZXNbaV0udmFsdWUgKyAiICgiICsgc2l6ZSArICIpIik7CisJCQljaGFydC5kYXRhR3JvdXAuYXBwZW5kQ2hpbGQocG9pbnQpOworCQl9CisJfTsKK30oKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQWNjb3JkaW9uUGFuZS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9BY2NvcmRpb25QYW5lLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU2MjljCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQWNjb3JkaW9uUGFuZS5jc3MKQEAgLTAsMCArMSwyMiBAQAorLmRvam9BY2NvcmRpb25QYW5lIC5sYWJlbCB7CisJY29sb3I6ICMwMDA7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvc29yaWFBY2NvcmRpb25PZmYuZ2lmIikgcmVwZWF0LXggdG9wIGxlZnQgIzg1YWVlYzsKKwlib3JkZXI6MXB4IHNvbGlkICNkOWQ5ZDk7CisJZm9udC1zaXplOjAuOWVtOworfQorCisuZG9qb0FjY29yZGlvblBhbmUtc2VsZWN0ZWQgLmxhYmVsIHsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9zb3JpYUFjY29yZGlvblNlbGVjdGVkLmdpZiIpIHJlcGVhdC14IHRvcCBsZWZ0ICM4NWFlZWM7CisJYm9yZGVyOjFweCBzb2xpZCAjODRhM2QxOworfQorCisuZG9qb0FjY29yZGlvblBhbmUgLmxhYmVsOmhvdmVyIHsKKwljdXJzb3I6IHBvaW50ZXI7Cit9CisKKy5kb2pvQWNjb3JkaW9uUGFuZSAuYWNjQm9keSB7CisJYmFja2dyb3VuZDogI2ZmZjsKKwlvdmVyZmxvdzogYXV0bzsKKwlib3JkZXI6MXB4IHNvbGlkICM4NGEzZDE7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQWNjb3JkaW9uUGFuZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQWNjb3JkaW9uUGFuZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYWIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9BY2NvcmRpb25QYW5lLmh0bWwKQEAgLTAsMCArMSw0IEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iZG9tTm9kZSI+Cis8ZGl2IGRvam9BdHRhY2hQb2ludD0ibGFiZWxOb2RlIiBkb2pvQXR0YWNoRXZlbnQ9Im9uY2xpY2s6IG9uTGFiZWxDbGljayIgY2xhc3M9IiR7dGhpcy5sYWJlbE5vZGVDbGFzc30iPiR7dGhpcy5sYWJlbH08L2Rpdj4KKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJjb250YWluZXJOb2RlIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiIGNsYXNzPSIke3RoaXMuY29udGFpbmVyTm9kZUNsYXNzfSI+PC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0J1dHRvblRlbXBsYXRlLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0J1dHRvblRlbXBsYXRlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQ2MzFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQnV0dG9uVGVtcGxhdGUuY3NzCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0tLS0gYnV0dG9uIC0tLSAqLworLmRvam9CdXR0b24geworCXBhZGRpbmc6IDAgMCAwIDA7CisJZm9udC1zaXplOiA4cHQ7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwljdXJzb3I6IHBvaW50ZXI7CisJZm9udC1mYW1pbHk6IE15cmlhZCwgVGFob21hLCBWZXJkYW5hLCBzYW5zLXNlcmlmOworfQorCisuZG9qb0J1dHRvbiAuZG9qb0J1dHRvbkNvbnRlbnRzIHsKKwlwYWRkaW5nOiAycHggMnB4IDJweCAycHg7CisJdGV4dC1hbGlnbjogY2VudGVyOwkJLyogaWYgaWNvbiBhbmQgbGFiZWwgYXJlIHNwbGl0IGFjcm9zcyB0d28gbGluZXMsIGNlbnRlciBpY29uICovCisJY29sb3I6IHdoaXRlOworfQorCisuZG9qb0J1dHRvbkxlZnRQYXJ0IC5kb2pvQnV0dG9uQ29udGVudHMgeworCXBhZGRpbmctcmlnaHQ6IDhweDsKK30KKworLmRvam9CdXR0b25EaXNhYmxlZCB7CisJY3Vyc29yOiB1cmwoImltYWdlcy9uby5naWYiKSwgZGVmYXVsdDsKK30KKworCisuZG9qb0J1dHRvbkNvbnRlbnRzIGltZyB7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsJLyogaWYgaWNvbiBhbmQgbGFiZWwgYXJlIG9uIHNhbWUgbGluZSwgY2VudGVyIHRoZW0gKi8KK30KKworLyogLS0tLS0tLS0gY29sb3JzIC0tLS0tLS0tLS0tLSAqLworCisuZG9qb0J1dHRvbkhvdmVyIC5kb2pvQnV0dG9uQ29udGVudHMgeworfQorCisuZG9qb0J1dHRvbkRlcHJlc3NlZCAuZG9qb0J1dHRvbkNvbnRlbnRzIHsKKwljb2xvcjogIzI5M2E0YjsKK30KKworLmRvam9CdXR0b25EaXNhYmxlZCAuZG9qb0J1dHRvbkNvbnRlbnRzIHsKKwljb2xvcjogI2FhYTsKK30KKworCisvKiAtLS0tLS0tLS0tIGRyb3AgZG93biBidXR0b24gc3BlY2lmaWMgLS0tLS0tLS0tLSAqLworCisvKiBib3JkZXIgYmV0d2VlbiBsYWJlbCBhbmQgYXJyb3cgKGZvciBkcm9wIGRvd24gYnV0dG9ucyAqLworLmRvam9CdXR0b24gLmJvcmRlciB7CisJd2lkdGg6IDFweDsKKwliYWNrZ3JvdW5kOiBncmF5OworfQorCisvKiBidXR0b24gYXJyb3cgKi8KKy5kb2pvQnV0dG9uIC5kb3duQXJyb3cgeworCXBhZGRpbmctbGVmdDogMTBweDsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5kb2pvQnV0dG9uLmRpc2FibGVkIC5kb3duQXJyb3cgeworCWN1cnNvciA6IGRlZmF1bHQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQnV0dG9uVGVtcGxhdGUuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0J1dHRvblRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiNGVlOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0J1dHRvblRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw2IEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iYnV0dG9uTm9kZSIgY2xhc3M9ImRvam9CdXR0b24iIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGRvam9BdHRhY2hFdmVudD0ib25Nb3VzZU92ZXI7IG9uTW91c2VPdXQ7IG9uTW91c2VEb3duOyBvbk1vdXNlVXA7IG9uQ2xpY2s6YnV0dG9uQ2xpY2s7IG9uS2V5Om9uS2V5OyBvbkZvY3VzOyI+CisgIDxkaXYgY2xhc3M9ImRvam9CdXR0b25Db250ZW50cyIgYWxpZ249Y2VudGVyIGRvam9BdHRhY2hQb2ludD0iY29udGFpbmVyTm9kZSIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjsiPjwvZGl2PgorICA8aW1nIGRvam9BdHRhY2hQb2ludD0ibGVmdEltYWdlIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7Ij4KKyAgPGltZyBkb2pvQXR0YWNoUG9pbnQ9ImNlbnRlckltYWdlIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxOyI+CisgIDxpbWcgZG9qb0F0dGFjaFBvaW50PSJyaWdodEltYWdlIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtyaWdodDowcHg7Ij4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ2hlY2tib3guY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ2hlY2tib3guY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODg4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9DaGVja2JveC5jc3MKQEAgLTAsMCArMSwyNiBAQAorLmRvam9IdG1sQ2hlY2tib3ggeworCWJvcmRlcjogMHB4OworCXdpZHRoOiAxNnB4OworCWhlaWdodDogMTZweDsKKwltYXJnaW46IDJweDsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuZG9qb0h0bWxDaGVja2JveE9uIHsKKwliYWNrZ3JvdW5kOiB1cmwoY2hlY2suZ2lmKSAwcHggMHB4OworfQorLmRvam9IdG1sQ2hlY2tib3hPZmYgeworCWJhY2tncm91bmQ6IHVybChjaGVjay5naWYpIC0xNnB4IDBweDsKK30KKy5kb2pvSHRtbENoZWNrYm94RGlzYWJsZWRPbiB7CisJYmFja2dyb3VuZDogdXJsKGNoZWNrLmdpZikgLTMycHggMHB4OworfQorLmRvam9IdG1sQ2hlY2tib3hEaXNhYmxlZE9mZiB7CisJYmFja2dyb3VuZDogdXJsKGNoZWNrLmdpZikgLTQ4cHggMHB4OworfQorLmRvam9IdG1sQ2hlY2tib3hPbkhvdmVyIHsKKwliYWNrZ3JvdW5kOiB1cmwoY2hlY2suZ2lmKSAtNjRweCAwcHg7Cit9CisuZG9qb0h0bWxDaGVja2JveE9mZkhvdmVyIHsKKwliYWNrZ3JvdW5kOiB1cmwoY2hlY2suZ2lmKSAtODBweCAwcHg7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ2hlY2tib3guaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0NoZWNrYm94Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MzY4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0NoZWNrYm94Lmh0bWwKQEAgLTAsMCArMSw1IEBACis8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyIgdGFiSW5kZXg9IiR7dGhpcy50YWJJbmRleH0iIHdhaVJvbGU9ImNoZWNrYm94IiBpZD0iJHt0aGlzLmlkfSI+CisJPGltZyBkb2pvQXR0YWNoUG9pbnQ9ImltYWdlTm9kZSIgY2xhc3M9ImRvam9IdG1sQ2hlY2tib3giIHNyYz0iJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvYmxhbmsuZ2lmIiBhbHQ9IiIgLz4KKwk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IiR7dGhpcy5uYW1lfSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiIHZhbHVlPSIke3RoaXMudmFsdWV9IgorCQlkb2pvQXR0YWNoUG9pbnQ9ImlucHV0Tm9kZSI+Cis8L3NwYW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ2hlY2tib3hBMTF5Lmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9DaGVja2JveEExMXkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGMwYWYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ2hlY2tib3hBMTF5Lmh0bWwKQEAgLTAsMCArMSw0IEBACis8c3BhbiBjbGFzcz0nZG9qb0h0bWxDaGVja2JveCc+CisJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSIke3RoaXMubmFtZX0iIHRhYkluZGV4PSIke3RoaXMudGFiSW5kZXh9IiBpZD0iJHt0aGlzLmlkfSIgdmFsdWU9IiR7dGhpcy52YWx1ZX0iCisJCSBkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IF9vbkNsaWNrOyIgZG9qb0F0dGFjaFBvaW50PSJpbnB1dE5vZGUiPiAKKzwvc3Bhbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0NpdmlDcm1EYXRlUGlja2VyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9DaXZpQ3JtRGF0ZVBpY2tlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjBkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9DaXZpQ3JtRGF0ZVBpY2tlci5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9IjQwMCI+CisJPHRyPgorCQk8dGQgaWQ9ImRhdGVIb2xkZXJUZCIgd2lkdGg9IjIwMCI+CisJCTwvdGQ+CisJCTx0ZCBpZD0idGltZUhvbGRlclRkIiB3aWR0aD0iMjAwIj4KKwkJPC90ZD4KKwk8L3RyPgorCTx0ciBzdHlsZT0iZGlzcGxheTogbm9uZTsiIGlkPSJmb3JtSXRlbXNUciI+CisJCTx0ZCBpZD0iZm9ybUl0ZW1zVGQiPiZuYnNwOzwvdGQ+CisJCTx0ZD4mbmJzcDs8L3RkPgorCTwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ29tYm9Cb3guY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ29tYm9Cb3guY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Yzg0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Db21ib0JveC5jc3MKQEAgLTAsMCArMSw2OCBAQAorLmRvam9Db21ib0JveE91dGVyIHsKKwlib3JkZXI6IDBweCAhaW1wb3J0YW50OworCW1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7CisJcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7CisJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKKwl3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7Cit9CisKKy5kb2pvQ29tYm9Cb3ggeworCWJvcmRlcjogMXB4IGluc2V0ICNhZmFmYWY7CisJbWFyZ2luOiAwcHg7CisJcGFkZGluZzogMHB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGUgIWltcG9ydGFudDsKKwlmbG9hdDogbm9uZSAhaW1wb3J0YW50OworCXBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKKwlkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKK30KKworLyogdGhlIGlucHV0IGJveCAqLworaW5wdXQuZG9qb0NvbWJvQm94IHsKKwlib3JkZXItcmlnaHQtd2lkdGg6IDBweCAhaW1wb3J0YW50OyAKKwltYXJnaW4tcmlnaHQ6IDBweCAhaW1wb3J0YW50OworCXBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50OworfQorCisvKiB0aGUgZG93biBhcnJvdyAqLworaW1nLmRvam9Db21ib0JveCB7CisJYm9yZGVyLWxlZnQtd2lkdGg6IDBweCAhaW1wb3J0YW50OworCXBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7CisJbWFyZ2luLWxlZnQ6IDBweCAhaW1wb3J0YW50OworfQorCisvKiBJRSB2ZXJ0aWNhbC1hbGlnbm1lbnQgY2FsY3VsYXRpb25zIGNhbiBiZSBvZmYgYnkgKy0xIGJ1dCB0aGVzZSBtYXJnaW5zIGFyZSBjb2xsYXBzZWQgYXdheSAqLworLmRqX2llIGltZy5kb2pvQ29tYm9Cb3ggeworCW1hcmdpbi10b3A6IDFweDsgCisJbWFyZ2luLWJvdHRvbTogMXB4OyAKK30KKworLyogdGhlIGRyb3AgZG93biAqLworLmRvam9Db21ib0JveE9wdGlvbnMgeworCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIEdhcmFtb25kLCBzYW5zLXNlcmlmOworCS8qIGZvbnQtc2l6ZTogMC43ZW07ICovCisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJYm9yZGVyOiAxcHggc29saWQgI2FmYWZhZjsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJei1pbmRleDogMTAwMDsgCisJb3ZlcmZsb3c6IGF1dG87CisJY3Vyc29yOiBkZWZhdWx0OworfQorCisuZG9qb0NvbWJvQm94SXRlbSB7CisJcGFkZGluZy1sZWZ0OiAycHg7CisJcGFkZGluZy10b3A6IDJweDsKKwltYXJnaW46IDBweDsKK30KKworLmRvam9Db21ib0JveEl0ZW1FdmVuIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0OworfQorCisuZG9qb0NvbWJvQm94SXRlbU9kZCB7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Cit9CisKKy5kb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjNjM3MDlBOworCWNvbG9yOiB3aGl0ZTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0NvbWJvQm94Lmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Db21ib0JveC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Db21ib0JveC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxzcGFuIF89IndoaXRlc3BhY2UgYW5kIENSJ3MgYmV0d2VlbiB0YWdzIGFkZHMgJm5ic3A7IGluIEZGIgorCWNsYXNzPSJkb2pvQ29tYm9Cb3hPdXRlciIKKwk+PGlucHV0IHN0eWxlPSJkaXNwbGF5Om5vbmUiICB0YWJpbmRleD0iLTEiIG5hbWU9IiIgdmFsdWU9IiIgCisJCWRvam9BdHRhY2hQb2ludD0iY29tYm9Cb3hWYWx1ZSIKKwk+PGlucHV0IHN0eWxlPSJkaXNwbGF5Om5vbmUiICB0YWJpbmRleD0iLTEiIG5hbWU9IiIgdmFsdWU9IiIgCisJCWRvam9BdHRhY2hQb2ludD0iY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZSIKKwk+PGlucHV0IHR5cGU9InRleHQiIGF1dG9jb21wbGV0ZT0ib2ZmIiBjbGFzcz0iZG9qb0NvbWJvQm94IgorCQlkb2pvQXR0YWNoRXZlbnQ9ImtleTpfaGFuZGxlS2V5RXZlbnRzOyBrZXlVcDogb25LZXlVcDsgY29tcG9zaXRpb25FbmQ7IG9uUmVzaXplOyIKKwkJZG9qb0F0dGFjaFBvaW50PSJ0ZXh0SW5wdXROb2RlIgorCT48aW1nIGhzcGFjZT0iMCIKKwkJdnNwYWNlPSIwIgorCQljbGFzcz0iZG9qb0NvbWJvQm94IgorCQlkb2pvQXR0YWNoUG9pbnQ9ImRvd25BcnJvd05vZGUiCisJCWRvam9BdHRhY2hFdmVudD0ib25Nb3VzZVVwOiBoYW5kbGVBcnJvd0NsaWNrOyBvblJlc2l6ZTsiCisJCXNyYz0iJHt0aGlzLmJ1dHRvblNyY30iCis+PC9zcGFuPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ29tYm9CdXR0b25UZW1wbGF0ZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvQ29tYm9CdXR0b25UZW1wbGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Db21ib0J1dHRvblRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGRpdiBjbGFzcz0iZG9qb0J1dHRvbiIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO3RvcDowcHg7bGVmdDowcHg7IHRleHQtYWxpZ246bm9uZTsiIGRvam9BdHRhY2hFdmVudD0ib25LZXk7b25Gb2N1cyI+CisKKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0iYnV0dG9uTm9kZSIgY2xhc3M9ImRvam9CdXR0b25MZWZ0UGFydCIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MHB4O3RvcDowcHg7IgorCQlkb2pvQXR0YWNoRXZlbnQ9Im9uTW91c2VPdmVyOyBvbk1vdXNlT3V0OyBvbk1vdXNlRG93bjsgb25Nb3VzZVVwOyBvbkNsaWNrOmJ1dHRvbkNsaWNrOyI+CisJCTxkaXYgY2xhc3M9ImRvam9CdXR0b25Db250ZW50cyIgZG9qb0F0dGFjaFBvaW50PSJjb250YWluZXJOb2RlIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtyaWdodDowcHg7ei1pbmRleDoyOyI+PC9kaXY+CisJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJsZWZ0SW1hZ2UiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjBweDt0b3A6MHB4OyI+CisJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJjZW50ZXJJbWFnZSIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjBweDt0b3A6MHB4O3otaW5kZXg6MTsiPgorCTwvZGl2PgorCisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJpZ2h0UGFydCIgY2xhc3M9ImRvam9CdXR0b25SaWdodFBhcnQiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MHB4O3JpZ2h0OjBweDsiCisJCWRvam9BdHRhY2hFdmVudD0ib25Nb3VzZU92ZXI6cmlnaHRPdmVyOyBvbk1vdXNlT3V0OnJpZ2h0T3V0OyBvbk1vdXNlRG93bjpyaWdodERvd247IG9uTW91c2VVcDpyaWdodFVwOyBvbkNsaWNrOnJpZ2h0Q2xpY2s7Ij4KKwkJPGltZyBkb2pvQXR0YWNoUG9pbnQ9ImFycm93QmFja2dyb3VuZEltYWdlIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjBweDt6LWluZGV4OjE7Ij4KKwkJPGltZyBzcmM9IiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW1hZ2VzL3doaXRlRG93bkFycm93LmdpZiIKKwkJICAJCXN0eWxlPSJ6LWluZGV4OjI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDozcHg7dG9wOjUwJTsiPgorCQk8aW1nIGRvam9BdHRhY2hQb2ludD0icmlnaHRJbWFnZSIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7cmlnaHQ6MHB4OyI+CisJPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRGF0ZVBpY2tlci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EYXRlUGlja2VyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTViMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRGF0ZVBpY2tlci5jc3MKQEAgLTAsMCArMSwxNjcgQEAKKy5kYXRlUGlja2VyQ29udGFpbmVyIHsKKwl3aWR0aDoxNjRweDsgLyogbmVlZGVkIGZvciBwcm9wZXIgdXNlciBzdHlsaW5nICovCit9CisKKy5jYWxlbmRhckNvbnRhaW5lciB7CisvKglib3JkZXI6MXB4IHNvbGlkICM1NjZmOGY7Ki8KK30KKworLmNhbGVuZGFyQm9keUNvbnRhaW5lciB7CisJd2lkdGg6MTAwJTsgLyogbmVlZGVkIGZvciB0aGUgZXhwbG9kZSBlZmZlY3QgKGV4cGxhaW4/KSAqLworCWJhY2tncm91bmQ6ICM3NTkxYmMgdXJsKCJpbWFnZXMvZHBCZy5naWYiKSB0b3AgbGVmdCByZXBlYXQteDsKK30KKworLmNhbGVuZGFyQm9keUNvbnRhaW5lciB0aGVhZCB0ciB0ZCB7CisJY29sb3I6IzI5M2E0YjsKKwlmb250OmJvbGQgMC43NWVtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJcGFkZGluZzowLjI1ZW07CisJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvZHBIb3JpekxpbmUuZ2lmIikgYm90dG9tIGxlZnQgcmVwZWF0LXg7Cit9CisKKy5jYWxlbmRhckJvZHlDb250YWluZXIgdGJvZHkgdHIgdGQgeworCWNvbG9yOiNmZmY7CisJZm9udDpib2xkIDAuN2VtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJcGFkZGluZzowLjRlbTsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcFZlcnRMaW5lLmdpZiIpIHRvcCByaWdodCByZXBlYXQteTsKKwljdXJzb3I6cG9pbnRlcjsKKwljdXJzb3I6aGFuZDsKK30KKworCisubW9udGhXcmFwcGVyIHsKKwlwYWRkaW5nLWJvdHRvbToycHg7CisJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvZHBIb3JpekxpbmUuZ2lmIikgYm90dG9tIGxlZnQgcmVwZWF0LXg7Cit9CisKKy5tb250aENvbnRhaW5lciB7CisJd2lkdGg6MTAwJTsKK30KKworLm1vbnRoTGFiZWxDb250YWluZXIgeworCXRleHQtYWxpZ246Y2VudGVyOworCWZvbnQ6Ym9sZCAwLjc1ZW0gSGVsdmV0aWNhLCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcE1vbnRoQmcucG5nIikgcmVwZWF0LXggdG9wIGxlZnQgIWltcG9ydGFudDsKKwljb2xvcjojMjkzYTRiOworCXBhZGRpbmc6MC4yNWVtOworfQorCisubW9udGhDdXJ2ZSB7CisJd2lkdGg6MTJweDsKK30KKworLm1vbnRoQ3VydmVUTCB7CisJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvZHBDdXJ2ZVRMLnBuZyIpIG5vLXJlcGVhdCB0b3AgbGVmdCAhaW1wb3J0YW50OworfQorCisubW9udGhDdXJ2ZVRSIHsKKwkJYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvZHBDdXJ2ZVRSLnBuZyIpIG5vLXJlcGVhdCB0b3AgcmlnaHQgIWltcG9ydGFudDsKK30KKworCisueWVhcldyYXBwZXIgeworCWJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2RwSG9yaXpMaW5lRm9vdC5naWYiKSB0b3AgbGVmdCByZXBlYXQteDsKKwlwYWRkaW5nLXRvcDoycHg7Cit9CisKKy55ZWFyQ29udGFpbmVyIHsKKwl3aWR0aDoxMDAlOworfQorCisueWVhckNvbnRhaW5lciB0ZCB7CisJYmFja2dyb3VuZDp1cmwoImltYWdlcy9kcFllYXJCZy5wbmciKSB0b3AgbGVmdCByZXBlYXQteDsKK30KKworLnllYXJDb250YWluZXIgLnllYXJMYWJlbCB7CisJbWFyZ2luOjA7CisJcGFkZGluZzowLjQ1ZW0gMCAwLjQ1ZW0gMDsKKwljb2xvcjojZmZmOworCWZvbnQ6Ym9sZCAwLjc1ZW0gSGVsdmV0aWNhLCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKKwl0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworLmN1cnZlQkwgeworCWJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2RwQ3VydmVCTC5wbmciKSBib3R0b20gbGVmdCBuby1yZXBlYXQgIWltcG9ydGFudDsKKwl3aWR0aDo5cHggIWltcG9ydGFudDsKKwlwYWRkaW5nOjA7CisJbWFyZ2luOjA7Cit9CisKKy5jdXJ2ZUJSIHsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcEN1cnZlQlIucG5nIikgYm90dG9tIHJpZ2h0IG5vLXJlcGVhdCAhaW1wb3J0YW50OworCXdpZHRoOjlweCAhaW1wb3J0YW50OworCXBhZGRpbmc6MDsKKwltYXJnaW46MDsKK30KKworCisucHJldmlvdXNNb250aCB7CisJYmFja2dyb3VuZC1jb2xvcjojNjc4MmE4ICFpbXBvcnRhbnQ7Cit9CisKKy5wcmV2aW91c01vbnRoRGlzYWJsZWQgeworCWJhY2tncm91bmQtY29sb3I6I2E0YTVhNiAhaW1wb3J0YW50OworCWN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnQKK30KKy5jdXJyZW50TW9udGggeworfQorCisuY3VycmVudE1vbnRoRGlzYWJsZWQgeworCWJhY2tncm91bmQtY29sb3I6I2JiYmJiYyAhaW1wb3J0YW50OworCWN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnQKK30KKy5uZXh0TW9udGggeworCWJhY2tncm91bmQtY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50OworfQorLm5leHRNb250aERpc2FibGVkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNhNGE1YTYgIWltcG9ydGFudDsKKwljdXJzb3I6ZGVmYXVsdCAhaW1wb3J0YW50OworfQorCisuY3VycmVudERhdGUgeworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisJZm9udC1zdHlsZTppdGFsaWM7Cit9CisKKy5zZWxlY3RlZERhdGUgeworCWJhY2tncm91bmQtY29sb3I6I2ZmZiAhaW1wb3J0YW50OworCWNvbG9yOiM2NzgyYTggIWltcG9ydGFudDsKK30KKworLnllYXJMYWJlbCAuc2VsZWN0ZWRZZWFyIHsKKwlwYWRkaW5nOjAuMmVtOworCWJhY2tncm91bmQtY29sb3I6IzllYzNmYiAhaW1wb3J0YW50OworfQorCisubmV4dFllYXIsIC5wcmV2aW91c1llYXIgeworCWN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kOworCXBhZGRpbmc6MDsKK30KKworLm5leHRZZWFyIHsKKwltYXJnaW46MCAwIDAgMC41NWVtOworfQorCisucHJldmlvdXNZZWFyIHsKKwltYXJnaW46MCAwLjU1ZW0gMCAwOworfQorCisuaW5jcmVtZW50Q29udHJvbCB7CisJY3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7CisJd2lkdGg6MWVtOworfQorCisuaW5jcmVhc2UgeworCWZsb2F0OnJpZ2h0OworfQorCisuZGVjcmVhc2UgeworCWZsb2F0OmxlZnQ7Cit9CisKKy5sYXN0Q29sdW1uIHsKKwliYWNrZ3JvdW5kLWltYWdlOm5vbmUgIWltcG9ydGFudDsKK30KKworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EYXRlUGlja2VyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EYXRlUGlja2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ZDAzMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RhdGVQaWNrZXIuaHRtbApAQCAtMCwwICsxLDk1IEBACis8ZGl2IGNsYXNzPSJkYXRlUGlja2VyQ29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9ImRhdGVQaWNrZXJDb250YWluZXJOb2RlIj4KKwk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBjbGFzcz0iY2FsZW5kYXJDb250YWluZXIiPgorCQk8dGhlYWQ+CisJCQk8dHI+CisJCQkJPHRkIGNsYXNzPSJtb250aFdyYXBwZXIiIHZhbGlnbj0idG9wIj4KKwkJCQkJPHRhYmxlIGNsYXNzPSJtb250aENvbnRhaW5lciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPgorCQkJCQkJPHRyPgorCQkJCQkJCTx0ZCBjbGFzcz0ibW9udGhDdXJ2ZSBtb250aEN1cnZlVEwiIHZhbGlnbj0idG9wIj48L3RkPgorCQkJCQkJCTx0ZCBjbGFzcz0ibW9udGhMYWJlbENvbnRhaW5lciIgdmFsaWduPSJ0b3AiPgorCQkJCQkJCQk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9ImluY3JlYXNlV2Vla05vZGUiIAorCQkJCQkJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBvbkluY3JlbWVudFdlZWs7IiAKKwkJCQkJCQkJCWNsYXNzPSJpbmNyZW1lbnRDb250cm9sIGluY3JlYXNlIj4KKwkJCQkJCQkJCTxpbWcgc3JjPSIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmciIAorCQkJCQkJCQkJYWx0PSImZGFycjsiIHN0eWxlPSJ3aWR0aDo3cHg7aGVpZ2h0OjVweDsiIC8+CisJCQkJCQkJCTwvc3Bhbj4KKwkJCQkJCQkJPHNwYW4gCisJCQkJCQkJCQlkb2pvQXR0YWNoUG9pbnQ9ImluY3JlYXNlTW9udGhOb2RlIiAKKwkJCQkJCQkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25JbmNyZW1lbnRNb250aDsiIGNsYXNzPSJpbmNyZW1lbnRDb250cm9sIGluY3JlYXNlIj4KKwkJCQkJCQkJCTxpbWcgc3JjPSIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmciIAorCQkJCQkJCQkJCWFsdD0iJmRhcnI7IiAgZG9qb0F0dGFjaFBvaW50PSJpbmNyZW1lbnRNb250aEltYWdlTm9kZSI+CisJCQkJCQkJCTwvc3Bhbj4KKwkJCQkJCQkJPHNwYW4gCisJCQkJCQkJCQlkb2pvQXR0YWNoUG9pbnQ9ImRlY3JlYXNlV2Vla05vZGUiIAorCQkJCQkJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBvbkluY3JlbWVudFdlZWs7IiAKKwkJCQkJCQkJCWNsYXNzPSJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlIj4KKwkJCQkJCQkJCTxpbWcgc3JjPSIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9kZWNyZW1lbnRNb250aC5wbmciIGFsdD0iJnVhcnI7IiBzdHlsZT0id2lkdGg6N3B4O2hlaWdodDo1cHg7IiAvPgorCQkJCQkJCQk8L3NwYW4+CisJCQkJCQkJCTxzcGFuIAorCQkJCQkJCQkJZG9qb0F0dGFjaFBvaW50PSJkZWNyZWFzZU1vbnRoTm9kZSIgCisJCQkJCQkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7IiBjbGFzcz0iaW5jcmVtZW50Q29udHJvbCBkZWNyZWFzZSI+CisJCQkJCQkJCQk8aW1nIHNyYz0iJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nIiAKKwkJCQkJCQkJCQlhbHQ9IiZ1YXJyOyIgZG9qb0F0dGFjaFBvaW50PSJkZWNyZW1lbnRNb250aEltYWdlTm9kZSI+CisJCQkJCQkJCTwvc3Bhbj4KKwkJCQkJCQkJPHNwYW4gZG9qb0F0dGFjaFBvaW50PSJtb250aExhYmVsTm9kZSIgY2xhc3M9Im1vbnRoIj48L3NwYW4+CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgY2xhc3M9Im1vbnRoQ3VydmUgbW9udGhDdXJ2ZVRSIiB2YWxpZ249InRvcCI+PC90ZD4KKwkJCQkJCTwvdHI+CisJCQkJCTwvdGFibGU+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCTwvdGhlYWQ+CisJCTx0Ym9keT4KKwkJCTx0cj4KKwkJCQk8dGQgY29sc3Bhbj0iMyI+CisJCQkJCTx0YWJsZSBjbGFzcz0iY2FsZW5kYXJCb2R5Q29udGFpbmVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+CisJCQkJCQk8dGhlYWQ+CisJCQkJCQkJPHRyIGRvam9BdHRhY2hQb2ludD0iZGF5TGFiZWxzUm93Ij4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJCTx0ZD48L3RkPgorCQkJCQkJCQk8dGQ+PC90ZD4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJCTx0ZD48L3RkPgorCQkJCQkJCQk8dGQ+PC90ZD4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGhlYWQ+CisJCQkJCQk8dGJvZHkgZG9qb0F0dGFjaFBvaW50PSJjYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZSIgCisJCQkJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBfaGFuZGxlVWlDbGljazsiPgorCQkJCQkJCTx0ciBkb2pvQXR0YWNoUG9pbnQ9ImNhbGVuZGFyV2Vla1RlbXBsYXRlIj4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJCTx0ZD48L3RkPgorCQkJCQkJCQk8dGQ+PC90ZD4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJCTx0ZD48L3RkPgorCQkJCQkJCQk8dGQ+PC90ZD4KKwkJCQkJCQkJPHRkPjwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGJvZHk+CisJCQkJCTwvdGFibGU+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCTwvdGJvZHk+CisJCTx0Zm9vdD4KKwkJCTx0cj4KKwkJCQk8dGQgY29sc3Bhbj0iMyIgY2xhc3M9InllYXJXcmFwcGVyIj4KKwkJCQkJPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBjbGFzcz0ieWVhckNvbnRhaW5lciI+CisJCQkJCQk8dHI+CisJCQkJCQkJPHRkIGNsYXNzPSJjdXJ2ZUJMIiB2YWxpZ249InRvcCI+PC90ZD4KKwkJCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgorCQkJCQkJCQk8aDMgY2xhc3M9InllYXJMYWJlbCI+CisJCQkJCQkJCQk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9InByZXZpb3VzWWVhckxhYmVsTm9kZSIKKwkJCQkJCQkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uSW5jcmVtZW50WWVhcjsiIGNsYXNzPSJwcmV2aW91c1llYXIiPjwvc3Bhbj4KKwkJCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWxlY3RlZFllYXIiIGRvam9BdHRhY2hQb2ludD0iY3VycmVudFllYXJMYWJlbE5vZGUiPjwvc3Bhbj4KKwkJCQkJCQkJCTxzcGFuIGRvam9BdHRhY2hQb2ludD0ibmV4dFllYXJMYWJlbE5vZGUiIAorCQkJCQkJCQkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25JbmNyZW1lbnRZZWFyOyIgY2xhc3M9Im5leHRZZWFyIj48L3NwYW4+CisJCQkJCQkJCTwvaDM+CisJCQkJCQkJPC90ZD4KKwkJCQkJCQk8dGQgY2xhc3M9ImN1cnZlQlIiIHZhbGlnbj0idG9wIj48L3RkPgorCQkJCQkJPC90cj4KKwkJCQkJPC90YWJsZT4KKwkJCQk8L3RkPgorCQkJPC90cj4KKwkJPC90Zm9vdD4KKwk8L3RhYmxlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EZW1vRW5naW5lLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EZW1vRW5naW5lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjYzdkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RlbW9FbmdpbmUuaHRtbApAQCAtMCwwICsxLDI0IEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iZG9tTm9kZSI+CisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9Im5hdmlnYXRpb25Ob2RlIj4KKwkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKwkJCTx0cj4KKwkJCQk8dGQgd2lkdGg9IjElIiB2YWxpZ249InRvcCIgY2xhc3M9Im5hdmlnYXRpb25DZWxsIj48aDE+Q2F0ZWdvcmllczwvaDE+PGRpdiBkb2pvQXR0YWNoUG9pbnQ9Im1lbnVOYXZpZ2F0aW9uTm9kZSI+PC9kaXY+PC90ZD4KKwkJCQk8dGQgd2lkdGg9Ijk5JSIgdmFsaWduPSJ0b3AiPgorCQkJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0iZGVtb05hdmlnYXRpb25Ob2RlIj4KKwkJCQkJPC9kaXY+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCTwvdGFibGU+CisJPC9kaXY+CisKKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0iZGVtb0NvbnRhaW5lck5vZGUiPgorCisJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJkZW1vUGFuZU5vZGUiPgorCQk8L2Rpdj4KKworCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0iZGVtb0hlYWRlck5vZGUiPgorCQkJPHNwYW4gZG9qb0F0dGFjaFBvaW50PSJjb2xsYXBzZWRNZW51Tm9kZSIgZG9qb0F0dGFjaEV2ZW50PSJvbmNsaWNrOiBleHBhbmREZW1vTmF2aWdhdGlvbiI+PC9zcGFuPgorCQkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImFib3V0Tm9kZSI+QWJvdXQgdGhpcyBEZW1vPC9kaXY+CisJCTwvZGl2PgorCTwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EaWFsb2cuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RpYWxvZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGZhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9EaWFsb2cuaHRtbApAQCAtMCwwICsxLDcgQEAKKzxkaXYgaWQ9IiR7dGhpcy53aWRnZXRJZH0iIGNsYXNzPSJkb2pvRGlhbG9nIiBkb2pvYXR0YWNocG9pbnQ9IndyYXBwZXIiPgorCTxzcGFuIGRvam9hdHRhY2hwb2ludD0idGFiU3RhcnRPdXRlciIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiCXRhYmluZGV4PSIwIj48L3NwYW4+CisJPHNwYW4gZG9qb2F0dGFjaHBvaW50PSJ0YWJTdGFydCIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiIHRhYmluZGV4PSIwIj48L3NwYW4+CisJPGRpdiBkb2pvYXR0YWNocG9pbnQ9ImNvbnRhaW5lck5vZGUiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDI7Ij48L2Rpdj4KKwk8c3BhbiBkb2pvYXR0YWNocG9pbnQ9InRhYkVuZCIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiIHRhYmluZGV4PSIwIj48L3NwYW4+CisJPHNwYW4gZG9qb2F0dGFjaHBvaW50PSJ0YWJFbmRPdXRlciIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiIHRhYmluZGV4PSIwIj48L3NwYW4+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RvY1BhbmUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRG9jUGFuZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyNDc3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RvY1BhbmUuY3NzCkBAIC0wLDAgKzEsNDkgQEAKKy5kb2pvRG9jUGFuZSB7IHBhZGRpbmc6MWVtOyBmb250OiAxZW0gR2VvcmdpYSxUaW1lcywiVGltZXMgTmV3IFJvbWFuIixzZXJpZjsgfQorCisuZG9qb0RvY1BhbmUgLmNvbnRhaW5lcnsgfQorCisuZG9qb0RvY1BhbmUgLmRpYWxvZ3sgfQorLmRvam9Eb2NQYW5lIC5kaWFsb2cgLmNvbnRhaW5lcnsgcGFkZGluZzogMC41ZW07IGJhY2tncm91bmQ6ICNmZmY7IGJvcmRlcjogMnB4IHNvbGlkICMzMzM7IH0KKy5kb2pvRG9jUGFuZSAuZGlhbG9nIC5kb2NEaWFsb2d7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB3aWR0aDogMjBlbTsgfQorLmRvam9Eb2NQYW5lIC5kaWFsb2cgLmRvY0RpYWxvZyBoMnsgbWFyZ2luLXRvcDogMDsgcGFkZGluZy10b3A6IDA7IH0KKy5kb2pvRG9jUGFuZSAuZGlhbG9nIC5kb2NEaWFsb2cgaW5wdXQgeyBmbG9hdDogcmlnaHQ7IG1hcmdpbi1yaWdodDogMWVtOyB9CisuZG9qb0RvY1BhbmUgLmRpYWxvZyAuZG9jRGlhbG9nIHB7IGNsZWFyOiBib3RoOyB9CisjZG9qb0RvY1VzZXJOYW1lLCAjZG9qb0RvY1Bhc3N3b3JkIHsgd2lkdGg6IDEwZW07IH0KKworLmRvam9Eb2NQYW5lIC5uYXZ7IH0KKy5kb2pvRG9jUGFuZSAubmF2IHNwYW57IH0KKworLmRvam9Eb2NQYW5lIC5kZXRhaWx7IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIGgxeyB9CisuZG9qb0RvY1BhbmUgLmRldGFpbCBoMSBzcGFuLmZueyB9CisuZG9qb0RvY1BhbmUgLmRldGFpbCAuZGVzY3JpcHRpb257IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC5wYXJhbXN7IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC5wYXJhbXMgLnJvd3sgfQorLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnBhcmFtcyAucm93IHNwYW57IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC52YXJpYWJsZXN7IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC52YXJpYWJsZXMgLnJvd3sgfQorLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZXsgfQorLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZSAuc291cmNleyB3aGl0ZS1zcGFjZTogcHJlOyBmb250OiAwLjhlbSBNb25hY28sIENvdXJpZXIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsgfQorLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZSAuc291cmNlIC5yZXR1cm57IGNvbG9yOiMzNjk7IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmUgLnNvdXJjZSAuZnVuY3Rpb257IGNvbG9yOiAjOTg1NDNGOyBmb250LXdlaWdodDogYm9sZDsgfQorLmRvam9Eb2NQYW5lIC5kZXRhaWwgLnNpZ25hdHVyZSAuc291cmNlIC5wYXJhbXN7IH0KKy5kb2pvRG9jUGFuZSAuZGV0YWlsIC5zaWduYXR1cmUgLnNvdXJjZSAucGFyYW1zIC50eXBleyBmb250LXN0eWxlOiBpdGFsaWM7IGNvbG9yOiAjZDE3NTc1OyB9CisuZG9qb0RvY1BhbmUgLmRldGFpbCAuc2lnbmF0dXJlIC5zb3VyY2UgLnBhcmFtcyAubmFtZXsgY29sb3I6ICNkMTQwNDA7IH0KKworLmRvam9Eb2NQYW5lIC5yZXN1bHR7IH0KKy5kb2pvRG9jUGFuZSAucmVzdWx0IGgxeyB9CisuZG9qb0RvY1BhbmUgLnJlc3VsdCAucm93eyB9CisuZG9qb0RvY1BhbmUgLnJlc3VsdCAucm93IC5zdW1tYXJ5eyB9CisKKy5kb2pvRG9jUGFuZSAucGFja2FnZXsgfQorLmRvam9Eb2NQYW5lIC5wYWNrYWdlIGgxeyB9CisuZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJvd3sgfQorLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5yb3cgLnN1bW1hcnl7IH0KKy5kb2pvRG9jUGFuZSAucGFja2FnZSAuZGVzY3JpcHRpb257IH0KKy5kb2pvRG9jUGFuZSAucGFja2FnZSAubWV0aG9kc3sgfQorLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5tZXRob2RzIGgyeyB9CisuZG9qb0RvY1BhbmUgLnBhY2thZ2UgLm1ldGhvZHMgLnJvd3sgfQorLmRvam9Eb2NQYW5lIC5wYWNrYWdlIC5tZXRob2RzIC5yb3cgLmRlc2NyaXB0aW9ueyB9CisuZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzeyB9CisuZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzIGgyeyB9CisuZG9qb0RvY1BhbmUgLnBhY2thZ2UgLnJlcXVpcmVzIC5yb3d7IH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RvY1BhbmUuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0RvY1BhbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjEzNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRG9jUGFuZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzxkaXYgY2xhc3M9ImRvam9Eb2NQYW5lIj4KKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0iY29udGFpbmVyTm9kZSIgY2xhc3M9ImNvbnRhaW5lciI+PC9kaXY+CisKKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0iZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KKwkJPGRpdiBjbGFzcz0iY29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9ImRpYWxvZ0JnIj4KKwkJCTxkaXYgY2xhc3M9ImRvY0RpYWxvZyIgZG9qb0F0dGFjaFBvaW50PSJkaWFsb2dGZyI+CisJCQkJPGgyPkxvZyBJbjwvaDI+CisJCQkJPHA+PGlucHV0IGlkPSJkb2pvRG9jVXNlck5hbWUiIGRvam9BdHRhY2hQb2ludD0idXNlck5hbWUiPjxsYWJlbCBmb3I9ImRvam9Eb2NVc2VyTmFtZSI+VXNlciBOYW1lOjwvbGFiZWw+PC9wPgorCQkJCTxwPjxpbnB1dCBpZD0iZG9qb0RvY1Bhc3N3b3JkIiBkb2pvQXR0YWNoUG9pbnQ9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCI+PGxhYmVsIGZvcj0iZG9qb0RvY1Bhc3N3b3JkIj5QYXNzd29yZDo8L2xhYmVsPjwvcD4KKwkJCQk8cD48aW5wdXQgdHlwZT0iYnV0dG9uIiBkb2pvQXR0YWNoUG9pbnQ9ImNhbmNlbCIgdmFsdWU9ImNhbmNlbCI+IDxpbnB1dCB0eXBlPSJidXR0b24iIGRvam9BdHRhY2hQb2ludD0ibG9nSW4iIHZhbHVlPSJMb2cgSW4iPjwvcD4KKwkJCQk8cD48L3A+CisJCQk8L2Rpdj4KKwkJPC9kaXY+CisJPC9kaXY+CisKKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0ibmF2IiBjbGFzcz0ibmF2Ij48c3Bhbj5EZXRhaWw8L3NwYW4+IHwgPHNwYW4+U291cmNlPC9zcGFuPiB8IDxzcGFuPkV4YW1wbGVzPC9zcGFuPiB8IDxzcGFuPldhbGt0aHJvdWdoPC9zcGFuPjwvZGl2PgorCisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImRldGFpbCIgY2xhc3M9ImRldGFpbCI+CisJCTxoMT5EZXRhaWw6IDxzcGFuIGNsYXNzPSJmbiIgZG9qb0F0dGFjaFBvaW50PSJmbiI+ZG9qby5zZWxlY3Q8L3NwYW4+PC9oMT4KKwkJPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24iIGRvam9BdHRhY2hQb2ludD0iZGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uPC9kaXY+CisJCTxkaXYgY2xhc3M9InBhcmFtcyIgZG9qb0F0dGFjaFBvaW50PSJwYXJhbWV0ZXJzIj4KKwkJCTxoMj5QYXJhbWV0ZXJzPC9oMj4KKwkJCTxkaXYgY2xhc3M9InJvdyIgZG9qb0F0dGFjaFBvaW50PSJwUm93Ij4KKwkJCQk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9InBPcHQiPjxlbT5vcHRpb25hbDwvZW0+IDwvc3Bhbj4KKwkJCQk8c3Bhbj48c3BhbiBkb2pvQXR0YWNoUG9pbnQ9InBUeXBlIj50eXBlPC9zcGFuPiA8L3NwYW4+CisJCQkJPGEgaHJlZj0iIyIgZG9qb0F0dGFjaFBvaW50PSJwTGluayI+dmFyaWFibGU8L2E+CisJCQkJPHNwYW4+IC0gPHNwYW4gZG9qb0F0dGFjaFBvaW50PSJwRGVzYyI+PC9zcGFuPjwvc3Bhbj4KKwkJCTwvZGl2PgorCQk8L2Rpdj4KKwkJPGRpdiBjbGFzcz0idmFyaWFibGVzIiBkb2pvQXR0YWNoUG9pbnQ9InZhcmlhYmxlcyI+CisJCQk8aDI+VmFyaWFibGVzPC9oMj4KKwkJCTxkaXYgY2xhc3Micm93IiBkb2pvQXR0YWNoUG9pbnQ9InZSb3ciPgorCQkJCTxhIGhyZWY9IiMiIGRvam9BdHRhY2hQb2ludD0idkxpbmsiPnZhcmlhYmxlPC9hPjxzcGFuPiAtIDxzcGFuIGRvam9BdHRhY2hQb2ludD0idkRlc2MiPjwvc3Bhbj48L3NwYW4+CisJCQk8L2Rpdj4KKwkJPC9kaXY+CisJCTxkaXYgY2xhc3M9InNpZ25hdHVyZSI+CisJCQk8aDI+U2lnbmF0dXJlPC9oMj4KKwkJCTxkaXYgY2xhc3M9InNvdXJjZSI+CisJCQkJPHNwYW4gY2xhc3M9InJldHVybiIgZG9qb0F0dGFjaFBvaW50PSJzVHlwZSI+cmV0dXJuVHlwZTwvc3Bhbj4gCisJCQkJPHNwYW4gY2xhc3M9ImZ1bmN0aW9uIiBkb2pvQXR0YWNoUG9pbnQ9InNOYW1lIj5mb288L3NwYW4+CisJCQkJKDxzcGFuIGNsYXNzPSJwYXJhbXMiIGRvam9BdHRhY2hQb2ludD0ic1BhcmFtcyI+CisJCQkJCTxzcGFuIGNsYXNzPSJ0eXBlIiBkb2pvQXR0YWNoUG9pbnQ9InNQVHlwZSI+dHlwZSA8L3NwYW4+CisJCQkJCTxzcGFuIGNsYXNzPSJuYW1lIiBkb2pvQXR0YWNoUG9pbnQ9InNQTmFtZSI+cGFyYW1OYW1lPC9zcGFuPgorCQkJCTwvc3Bhbj4pCisJCQk8L2Rpdj4KKwkJPC9kaXY+CisJPC9kaXY+CisJCisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJlc3VsdCIgY2xhc3M9InJlc3VsdCI+CisJCTxoMT5TZWFyY2ggUmVzdWx0czogPHNwYW4gZG9qb0F0dGFjaFBvaW50PSJjb3VudCI+MDwvc3Bhbj4gbWF0Y2hlczwvaDE+CisJCTxkaXYgY2xhc3M9InJvdyIgZG9qb0F0dGFjaFBvaW50PSJyb3ciPgorCQkJPGEgaHJlZj0iIyIgZG9qb0F0dGFjaFBvaW50PSJmbkxpbmsiPmRvam8uZm5MaW5rPC9hPgorCQkJPHNwYW4+IC0gPHNwYW4gY2xhc3M9InN1bW1hcnkiIGRvam9BdHRhY2hQb2ludD0ic3VtbWFyeSI+c3VtbWFyeTwvc3Bhbj48L3NwYW4+CisJCTwvZGl2PgorCTwvZGl2PgorCisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InBhY2thZyIgY2xhc3M9InBhY2thZ2UiPgorCQk8aDE+UGFja2FnZTogCisJCQk8c3BhbiBjbGFzcz0icGtnIiBkb2pvQXR0YWNoUG9pbnQ9InBrZyI+ZG9qby5wYWNrYWdlPC9zcGFuPiAKKwkJCTxzcGFuIGNsYXNzPSJlZGl0IiBkb2pvQXR0YWNoUG9pbnQ9ImVkaXQiPltlZGl0XTwvc3Bhbj4gCisJCQk8c3BhbiBjbGFzcz0ic2F2ZSIgZG9qb0F0dGFjaFBvaW50PSJzYXZlIj5bc2F2ZV08L3NwYW4+CisJCTwvaDE+CisJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJwa2dEZXNjcmlwdGlvbiIgY2xhc3M9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvZGl2PgorCQk8ZGl2IGNsYXNzPSJtZXRob2RzIiBkb2pvQXR0YWNoUG9pbnQ9Im1ldGhvZHMiPgorCQkJPGgyPk1ldGhvZHM8L2gyPgorCQkJPGRpdiBjbGFzcz0icm93IiBkb2pvQXR0YWNoUG9pbnQ9Im1Sb3ciPgorCQkJCTxhIGhyZWY9IiMiIGRvam9BdHRhY2hQb2ludD0ibUxpbmsiPm1ldGhvZDwvYT4KKwkJCQk8c3Bhbj4gLSA8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIGRvam9BdHRhY2hQb2ludD0ibURlc2MiPjwvc3Bhbj48L3NwYW4+CisJCQk8L2Rpdj4KKwkJPC9kaXY+CisJCTxkaXYgY2xhc3M9InJlcXVpcmVzIiBkb2pvQXR0YWNoUG9pbnQ9InJlcXVpcmVzIj4KKwkJCTxoMj5SZXF1aXJlczwvaDI+CisJCQk8ZGl2IGNsYXNzPSJyb3ciIGRvam9BdHRhY2hQb2ludD0iclJvdyI+CisJCQkJPGgzIGRvam9BdHRhY2hQb2ludD0ickgzIj5FbnZpcm9ubWVudDwvaDM+CisJCQkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJSb3cyIj48YSBocmVmPSIjIiBkb2pvQXR0YWNoUG9pbnQ9InJMaW5rIiBjbGFzcz0icGFja2FnZSI+cmVxdWlyZTwvYT48L2Rpdj4KKwkJCTwvZGl2PgorCQk8L2Rpdj4KKwk8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRHJvcERvd25CdXR0b25UZW1wbGF0ZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRHJvcERvd25CdXR0b25UZW1wbGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDgyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Ecm9wRG93bkJ1dHRvblRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw5IEBACis8YnV0dG9uIGRvam9BdHRhY2hQb2ludD0iYnV0dG9uIiBjbGFzcz0iZG9qb0J1dHRvbiBkb2pvQnV0dG9uTm9Ib3ZlciIgZG9qb0F0dGFjaEV2ZW50PSJvbk1vdXNlT3ZlcjogOyBvbk1vdXNlT3V0OiA7IG9uQ2xpY2s6IDsiPgorICA8dGFibGUgZG9qb0F0dGFjaFBvaW50PSJ0YWJsZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAwOyI+PHRyPgorICAgIDx0ZCBjbGFzcz0ibGFiZWwiIGRvam9BdHRhY2hQb2ludD0ibGFiZWxDZWxsIj48L3RkPgorICAgIDx0ZCBjbGFzcz0iYm9yZGVyIiBkb2pvQXR0YWNoUG9pbnQ9ImJvcmRlckNlbGwiPjwvdGQ+CisgICAgPHRkIGNsYXNzPSJkb3duQXJyb3ciIGRvam9BdHRhY2hQb2ludD0iYXJyb3dDZWxsIj4KKyAgICAgIDxpbWcgZG9qb0F0dGFjaFBvaW50PSJhcnJvdyI+CisgICAgPC90ZD4KKyAgPC90cj48L3RhYmxlPgorPC9idXR0b24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9EaWFsb2cvY3JlYXRlbGluay5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9EaWFsb2cvY3JlYXRlbGluay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzA2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9jcmVhdGVsaW5rLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPHRhYmxlPgorPHRyPjx0ZD5VUkw8L3RkPjx0ZD4gPGlucHV0IHR5cGU9InRleHQiIGRvam9BdHRhY2hQb2ludD0ibGlua19ocmVmIiBuYW1lPSJkb2pvX2NyZWF0ZUxpbmtfaHJlZiIvPjwvdGQ+PC90cj4KKzx0cj48dGQ+VGFyZ2V0IDwvdGQ+PHRkPjxzZWxlY3QgZG9qb0F0dGFjaFBvaW50PSJsaW5rX3RhcmdldCI+CisJPG9wdGlvbiB2YWx1ZT0iIj5TZWxmPC9vcHRpb24+CisJPG9wdGlvbiB2YWx1ZT0iX2JsYW5rIj5OZXcgV2luZG93PC9vcHRpb24+CisJPG9wdGlvbiB2YWx1ZT0iX3RvcCI+VG9wIFdpbmRvdzwvb3B0aW9uPgorCTwvc2VsZWN0PjwvdGQ+PC90cj4KKzx0cj48dGQ+Q2xhc3MgPC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIGRvam9BdHRhY2hQb2ludD0ibGlua19jbGFzcyIgLz48L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjIiPgorCTx0YWJsZT48dHI+CisJPHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOm9rJz5PSzwvYnV0dG9uPjwvdGQ+CisJPHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOmNhbmNlbCc+Q2FuY2VsPC9idXR0b24+PC90ZD4KKwk8L3RyPjwvdGFibGU+CisJPC90ZD48L3RyPgorPC90YWJsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9maW5kLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9maW5kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxMzA1OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL2ZpbmQuaHRtbApAQCAtMCwwICsxLDE1IEBACis8dGFibGUgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4KKzx0cj48dGQgY29sc3Bhbj0nMic+RmluZDogPGlucHV0IHR5cGU9InRleHQiIGRvam9BdHRhY2hQb2ludD0iZmluZF90ZXh0IiAvPjwvdGQ+PC90cj4KKzx0cj48dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkb2pvVHlwZT0iQ2hlY2tCb3giIGRvam9BdHRhY2hQb2ludD0iZmluZF9vcHRpb25fY2FzZXNlbnMiIC8+CisJCTxsYWJlbCBmb3I9ImZpbmRfb3B0aW9uX2Nhc2VzZW5zIj5DYXNlIFNlbnNpdGl2ZTwvbGFiZWw+PC90ZD4KKwkJCTx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRvam9UeXBlPSJDaGVja0JveCIgZG9qb0F0dGFjaFBvaW50PSJmaW5kX29wdGlvbl9iYWNrd2FyZHMiIC8+CisJCTxsYWJlbCBmb3I9ImZpbmRfb3B0aW9uX2JhY2t3YXJkcyI+U2VhcmNoIEJhY2t3YXJkczwvbGFiZWw+PC90ZD48L3RyPgorPHRyPjx0ZCBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZG9qb1R5cGU9IkNoZWNrQm94IiBkb2pvQXR0YWNoUG9pbnQ9ImZpbmRfb3B0aW9uX3dob2xld29yZCIgLz4KKwkJPGxhYmVsIGZvcj0iZmluZF9vcHRpb25fd2hvbGV3b3JkIj5XaG9sZSBXb3JkPC9sYWJlbD48L3RkPgorPHRyPjx0ZCBjb2xzcGFuPSIxIj4KKwk8dGFibGU+PHRyPgorCTx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpmaW5kJz5GaW5kPC9idXR0b24+PC90ZD4KKwk8dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6Y2FuY2VsJz5DbG9zZTwvYnV0dG9uPjwvdGQ+CisJPC90cj48L3RhYmxlPgorCTwvdGQ+PC90cj4KKzwvdGFibGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9EaWFsb2cvaW5zZXJ0aW1hZ2UuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL2luc2VydGltYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0ZGRlOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL2luc2VydGltYWdlLmh0bWwKQEAgLTAsMCArMSwxMTQgQEAKKzx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+CisJPHRyPgorCQk8dGQ+CisJCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIj4KKwkJCQk8dHI+CisJCQkJCTx0ZCB3aWR0aD0iMTAwJSI+CisJCQkJCQk8c3Bhbj5VUkw8L3NwYW4+CisJCQkJCTwvdGQ+CisJCQkJCTx0ZCBzdHlsZT0iZGlzcGxheTogbm9uZSIgbm93cmFwPSJub3dyYXAiIHJvd3NwYW49IjIiPgorCQkJCQkJPCEtLWlucHV0IGlkPSJidG5Ccm93c2UiIG9uY2xpY2s9IkJyb3dzZVNlcnZlcigpOyIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQnJvd3NlIFNlcnZlciIvLS0+CisJCQkJCTwvdGQ+CisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZCB2YWxpZ249InRvcCI+CisJCQkJCQk8aW5wdXQgZG9qb0F0dGFjaFBvaW50PSJpbWFnZV9zcmMiIHN0eWxlPSJ3aWR0aDogMTAwJSIgdHlwZT0idGV4dCIgLz4KKwkJCQkJPC90ZD4KKwkJCQk8L3RyPgorCQkJPC90YWJsZT4KKwkJPC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkPgorCQkJPHNwYW4+QWx0ZXJuYXRpdmUgVGV4dDwvc3Bhbj48YnIgLz4KKwkJCTxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9ImltYWdlX2FsdCIgc3R5bGU9IndpZHRoOiAxMDAlIiB0eXBlPSJ0ZXh0IiAvPjxiciAvPgorCQk8L3RkPgorCTwvdHI+CisJPHRyPgorCQk8dGQgdmFsaWduPSJ0b3AiPgorCQkJPHRhYmxlPjx0cj48dGQ+CisJCQkJCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPgorCQkJCQkJCTx0cj4KKwkJCQkJCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KKwkJCQkJCQkJCTxzcGFuPldpZHRoPC9zcGFuPiZuYnNwOzwvdGQ+CisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIzIiBkb2pvQXR0YWNoUG9pbnQ9ImltYWdlX3dpZHRoIiAvPjwvdGQ+CisKKwkJCQkJCQkJPHRkIHJvd3NwYW49IjIiPgorCQkJCQkJCQkJPCEtLWRpdiBpZD0iYnRuTG9ja1NpemVzIiBjbGFzcz0iQnRuTG9ja2VkIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWUgPSAoYkxvY2tSYXRpbyA/ICdCdG5Mb2NrZWQnIDogJ0J0blVubG9ja2VkJyApICsgJyBCdG5PdmVyJzsiCisJCQkJCQkJCQkJb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWUgPSAoYkxvY2tSYXRpbyA/ICdCdG5Mb2NrZWQnIDogJ0J0blVubG9ja2VkJyApOyIgdGl0bGU9IkxvY2sgU2l6ZXMiCisJCQkJCQkJCQkJb25jbGljaz0iU3dpdGNoTG9jayh0aGlzKTsiPgorCQkJCQkJCQkJPC9kaXYtLT4KKwkJCQkJCQkJPC90ZD4KKwkJCQkJCQkJPHRkIHJvd3NwYW49IjIiPgorCQkJCQkJCQkJPCEtLWRpdiBpZD0iYnRuUmVzZXRTaXplIiBjbGFzcz0iQnRuUmVzZXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT0nQnRuUmVzZXQgQnRuT3Zlcic7IgorCQkJCQkJCQkJCW9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPSdCdG5SZXNldCc7IiB0aXRsZT0iUmVzZXQgU2l6ZSIgb25jbGljaz0iUmVzZXRTaXplcygpOyI+CisJCQkJCQkJCQk8L2Rpdi0tPgorCQkJCQkJCQk8L3RkPgorCQkJCQkJCTwvdHI+CisKKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+CisJCQkJCQkJCQk8c3Bhbj5IZWlnaHQ8L3NwYW4+Jm5ic3A7PC90ZD4KKwkJCQkJCQkJPHRkPgorCQkJCQkJCQkJPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMiIGRvam9BdHRhY2hQb2ludD0iaW1hZ2VfaGVpZ2h0IiAvPjwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGFibGU+CisJCQkJCTwvdGQ+PHRkPgorCisJCQkJCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPgorCQkJCQkJCTx0cj4KKworCQkJCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgorCQkJCQkJCQkJPHNwYW4gPkhTcGFjZTwvc3Bhbj4mbmJzcDs8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMiIgZG9qb0F0dGFjaFBvaW50PSJpbWFnZV9oc3BhY2UiLz48L3RkPgorCQkJCQkJCTwvdHI+CisJCQkJCQkJPHRyPgorCQkJCQkJCQk8dGQgbm93cmFwPSJub3dyYXAiPgorCQkJCQkJCQkJPHNwYW4gPlZTcGFjZTwvc3Bhbj4mbmJzcDs8L3RkPgorCisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIyIiBkb2pvQXR0YWNoUG9pbnQ9ImltYWdlX3ZzcGFjZSIgLz48L3RkPgorCQkJCQkJCTwvdHI+CisJCQkJCQk8L3RhYmxlPgorCQkJCQk8L3RkPjwvdHI+CisJCQkJCTx0cj48dGQgY29sc3Bhbj0iMiI+CisJCQkJCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPgorCQkJCQkJCTx0cj4KKwkJCQkJCQkJPHRkIG5vd3JhcD0ibm93cmFwIj4KKwkJCQkJCQkJCTxzcGFuPkJvcmRlcjwvc3Bhbj4mbmJzcDs8L3RkPgorCQkJCQkJCQk8dGQ+CisJCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMiIgdmFsdWU9IiIgZG9qb0F0dGFjaFBvaW50PSJpbWFnZV9ib3JkZXIiIC8+PC90ZD4KKwkJCQkJCQkJPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisJCQkJCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+CisJCQkJCQkJCQk8c3BhbiA+QWxpZ248L3NwYW4+Jm5ic3A7PC90ZD4KKwkJCQkJCQkJPHRkPgorCQkJCQkJCQkJPHNlbGVjdCBkb2pvQXR0YWNoUG9pbnQ9ImltYWdlX2FsaWduIj4KKworCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj48L29wdGlvbj4KKwkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJsZWZ0Ij5MZWZ0PC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWJzQm90dG9tIj5BYnMgQm90dG9tPC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWJzTWlkZGxlIj5BYnMgTWlkZGxlPC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYmFzZWxpbmUiPkJhc2VsaW5lPC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYm90dG9tIj5Cb3R0b208L29wdGlvbj4KKworCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9Im1pZGRsZSI+TWlkZGxlPC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icmlnaHQiPlJpZ2h0PC9vcHRpb24+CisJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0idGV4dFRvcCI+VGV4dCBUb3A8L29wdGlvbj4KKwkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0b3AiPlRvcDwvb3B0aW9uPgorCQkJCQkJCQkJPC9zZWxlY3Q+CisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGFibGU+CisJCQkJCTwvdGQ+CisJCQkJPC90cj48L3RhYmxlPgorCQk8L3RkPgorCTwvdHI+CisJPHRyPjx0ZD4KKwkJPHRhYmxlPjx0cj4KKwkJPHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOm9rJz5PSzwvYnV0dG9uPjwvdGQ+CisJCTx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpjYW5jZWwnPkNhbmNlbDwvYnV0dG9uPjwvdGQ+CisJCTwvdHI+PC90YWJsZT4KKwk8L3RkPjwvdHI+Cis8L3RhYmxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL2luc2VydHRhYmxlLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9pbnNlcnR0YWJsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWZlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9pbnNlcnR0YWJsZS5odG1sCkBAIC0wLDAgKzEsOTEgQEAKKzxkaXY+Cis8dGFibGUgY2VsbFNwYWNpbmc9IjEiIGNlbGxQYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIj4KKwk8dHI+CisJCTx0ZCB2YWxpZ249InRvcCI+CisJCQk8dGFibGUgY2VsbFNwYWNpbmc9IjAiIGNlbGxQYWRkaW5nPSIwIiBib3JkZXI9IjAiPgorCQkJCTx0cj4KKworCQkJCQk8dGQ+PHNwYW4+Um93czwvc3Bhbj46PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX3Jvd3MiIHR5cGU9InRleHQiIG1heExlbmd0aD0iMyIgc2l6ZT0iMiIgdmFsdWU9IjMiPjwvdGQ+CisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZD48c3Bhbj5Db2x1bW5zPC9zcGFuPjo8L3RkPgorCQkJCQk8dGQ+Jm5ic3A7PGlucHV0IGRvam9BdHRhY2hQb2ludD0idGFibGVfY29scyIgdHlwZT0idGV4dCIgbWF4TGVuZ3RoPSIyIiBzaXplPSIyIiB2YWx1ZT0iMiI+PC90ZD4KKwkJCQk8L3RyPgorCisJCQkJPHRyPgorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzwvdGQ+CisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZD48c3Bhbj5Cb3JkZXIgc2l6ZTwvc3Bhbj46PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzxJTlBVVCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX2JvcmRlciIgdHlwZT0idGV4dCIgbWF4TGVuZ3RoPSIyIiBzaXplPSIyIiB2YWx1ZT0iMSI+PC90ZD4KKwkJCQk8L3RyPgorCisJCQkJPHRyPgorCQkJCQk8dGQ+PHNwYW4+QWxpZ25tZW50PC9zcGFuPjo8L3RkPgorCQkJCQk8dGQ+Jm5ic3A7PHNlbGVjdCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX2FsaWduIj4KKwkJCQkJCQk8b3B0aW9uIHZhbHVlPSIiIHNlbGVjdGVkPiZsdDtOb3Qgc2V0Jmd0Ozwvb3B0aW9uPgorCQkJCQkJCTxvcHRpb24gdmFsdWU9ImxlZnQiPkxlZnQ8L29wdGlvbj4KKwkJCQkJCQk8b3B0aW9uIHZhbHVlPSJjZW50ZXIiPkNlbnRlcjwvb3B0aW9uPgorCQkJCQkJCTxvcHRpb24gdmFsdWU9InJpZ2h0Ij5SaWdodDwvb3B0aW9uPgorCQkJCQkJPC9zZWxlY3Q+PC90ZD4KKwkJCQk8L3RyPgorCQkJPC90YWJsZT4KKwkJPC90ZD4KKwkJPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisJCTx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj4KKwkJCTx0YWJsZSBjZWxsU3BhY2luZz0iMCIgY2VsbFBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+CisJCQkJPHRyPgorCQkJCQk8dGQ+PHNwYW4+V2lkdGg8L3NwYW4+OjwvdGQ+CisJCQkJCTx0ZD4mbmJzcDs8aW5wdXQgZG9qb0F0dGFjaFBvaW50PSJ0YWJsZV93aWR0aCIgdHlwZT0idGV4dCIgbWF4TGVuZ3RoPSI0IiBzaXplPSIzIj48L3RkPgorCQkJCQk8dGQ+Jm5ic3A7PHNlbGVjdCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX3dpZHRodHlwZSI+CisJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icGVyY2VudCIgc2VsZWN0ZWQ+cGVyY2VudDwvb3B0aW9uPgorCQkJCQkJCTxvcHRpb24gdmFsdWU9InBpeGVscyI+cGl4ZWxzPC9vcHRpb24+CisJCQkJCQk8L3NlbGVjdD48L3RkPgorCisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZD48c3Bhbj5IZWlnaHQ8L3NwYW4+OjwvdGQ+CisJCQkJCTx0ZD4mbmJzcDs8SU5QVVQgZG9qb0F0dGFjaFBvaW50PSJ0YWJsZV9oZWlnaHQiIHR5cGU9InRleHQiIG1heExlbmd0aD0iNCIgc2l6ZT0iMyI+PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzxzcGFuPnBpeGVsczwvc3Bhbj48L3RkPgorCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzwvdGQ+CisJCQkJCTx0ZD4mbmJzcDs8L3RkPgorCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQgbm93cmFwPjxzcGFuPkNlbGwgc3BhY2luZzwvc3Bhbj46PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX2NlbGxzcGFjaW5nIiB0eXBlPSJ0ZXh0IiBtYXhMZW5ndGg9IjIiIHNpemU9IjIiIHZhbHVlPSIxIj48L3RkPgorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKworCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQgbm93cmFwPjxzcGFuPkNlbGwgcGFkZGluZzwvc3Bhbj46PC90ZD4KKwkJCQkJPHRkPiZuYnNwOzxpbnB1dCBkb2pvQXR0YWNoUG9pbnQ9InRhYmxlX2NlbGxwYWRkaW5nIiB0eXBlPSJ0ZXh0IiBtYXhMZW5ndGg9IjIiIHNpemU9IjIiIHZhbHVlPSIxIj48L3RkPgorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJCQk8L3RyPgorCQkJPC90YWJsZT4KKwkJPC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzx0YWJsZSBjZWxsU3BhY2luZz0iMCIgY2VsbFBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiPgorCTx0cj4KKwkJPHRkIG5vd3JhcD48c3Bhbj5DYXB0aW9uPC9zcGFuPjo8L3RkPgorCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJPHRkIHdpZHRoPSIxMDAlIiBub3dyYXA+Jm5ic3A7CisJCQk8aW5wdXQgZG9qb0F0dGFjaFBvaW50PSJ0YWJsZV9jYXB0aW9uIiB0eXBlPSJ0ZXh0IiBzdHlsZT0iV0lEVEg6IDkwJSI+PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkIG5vd3JhcD48c3Bhbj5TdW1tYXJ5PC9zcGFuPjo8L3RkPgorCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJPHRkIHdpZHRoPSIxMDAlIiBub3dyYXA+Jm5ic3A7CisJCQk8aW5wdXQgZG9qb0F0dGFjaFBvaW50PSJ0YWJsZV9zdW1tYXJ5IiB0eXBlPSJ0ZXh0IiBzdHlsZT0iV0lEVEg6IDkwJSI+PC90ZD4KKwk8L3RyPgorPC90YWJsZT4KKzx0YWJsZT48dHI+Cis8dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6b2snPk9rPC9idXR0b24+PC90ZD4KKzx0ZD48YnV0dG9uIGRvam9UeXBlPSdCdXR0b24nIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpjYW5jZWwnPkNhbmNlbDwvYnV0dG9uPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9yZXBsYWNlLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0RpYWxvZy9yZXBsYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4ZTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRGlhbG9nL3JlcGxhY2UuaHRtbApAQCAtMCwwICsxLDE1IEBACis8dGFibGUgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXA7Ij4KKzx0cj48dGQ+RmluZDogPC90ZD48dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBkb2pvQXR0YWNoUG9pbnQ9InJlcGxhY2VfdGV4dCIgLz48L3RkPjwvdHI+Cis8dHI+PHRkPlJlcGxhY2Ugd2l0aDogPC90ZD48dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBkb2pvQXR0YWNoUG9pbnQ9InJlcGxhY2VfdGV4dCIgLz48L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49JzInPjx0YWJsZT48dHI+PHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZG9qb1R5cGU9IkNoZWNrQm94IiBkb2pvQXR0YWNoUG9pbnQ9InJlcGxhY2Vfb3B0aW9uX2Nhc2VzZW5zIiBpZD0iZG9qb19yZXBsYWNlX29wdGlvbl9jYXNlc2VucyIgLz4KKwkJPGxhYmVsIGZvcj0iZG9qb19yZXBsYWNlX29wdGlvbl9jYXNlc2VucyI+Q2FzZSBTZW5zaXRpdmU8L2xhYmVsPjwvdGQ+CisJCQk8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkb2pvVHlwZT0iQ2hlY2tCb3giIGRvam9BdHRhY2hQb2ludD0icmVwbGFjZV9vcHRpb25fYmFja3dhcmRzIiBpZD0iZG9qb19yZXBsYWNlX29wdGlvbl9iYWNrd2FyZHMiIC8+CisJCTxsYWJlbCBmb3I9ImRvam9fcmVwbGFjZV9vcHRpb25fYmFja3dhcmRzIj5TZWFyY2ggQmFja3dhcmRzPC9sYWJlbD48L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49MiI+CisJPHRhYmxlPjx0cj4KKwk8dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6cmVwbGFjZSc+UmVwbGFjZTwvYnV0dG9uPjwvdGQ+CisJPHRkPjxidXR0b24gZG9qb1R5cGU9J0J1dHRvbicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOnJlcGxhY2VBbGwnPlJlcGxhY2UgQWxsPC9idXR0b24+PC90ZD4KKwk8dGQ+PGJ1dHRvbiBkb2pvVHlwZT0nQnV0dG9uJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s6Y2FuY2VsJz5DbG9zZTwvYnV0dG9uPjwvdGQ+CisJPC90cj48L3RhYmxlPgorCTwvdGQ+PC90cj4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0VkaXRvckRpYWxvZy5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JEaWFsb2cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE5MTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JEaWFsb2cuaHRtbApAQCAtMCwwICsxLDIxIEBACis8ZGl2IGlkPSIke3RoaXMud2lkZ2V0SWR9IiBjbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZSI+CisJPHNwYW4gZG9qb2F0dGFjaHBvaW50PSJ0YWJTdGFydE91dGVyIiBkb2pvb25mb2N1cz0idHJhcFRhYnMiIGRvam9vbmJsdXI9ImNsZWFyVHJhcCIJdGFiaW5kZXg9IjAiPjwvc3Bhbj4KKwk8c3BhbiBkb2pvYXR0YWNocG9pbnQ9InRhYlN0YXJ0IiBkb2pvb25mb2N1cz0idHJhcFRhYnMiIGRvam9vbmJsdXI9ImNsZWFyVHJhcCIgdGFiaW5kZXg9IjAiPjwvc3Bhbj4KKwk8ZGl2IGRvam9BdHRhY2hQb2ludD0idGl0bGVCYXIiIGNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lVGl0bGVCYXIiICBzdHlsZT0iZGlzcGxheTpub25lIj4KKwkgIAk8aW1nIGRvam9BdHRhY2hQb2ludD0idGl0bGVCYXJJY29uIiAgY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb24iPgorCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0iY2xvc2VBY3Rpb24iIGRvam9BdHRhY2hFdmVudD0ib25DbGljazpoaWRlIgorICAgCSAgCQljbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZUNsb3NlSWNvbiI+PC9kaXY+CisJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJyZXN0b3JlQWN0aW9uIiBkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6cmVzdG9yZVdpbmRvdyIKKyAgIAkgIAkJY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbiI+PC9kaXY+CisJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJtYXhpbWl6ZUFjdGlvbiIgZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOm1heGltaXplV2luZG93IgorICAgCSAgCQljbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvbiI+PC9kaXY+CisJCTxkaXYgZG9qb0F0dGFjaFBvaW50PSJtaW5pbWl6ZUFjdGlvbiIgZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOm1pbmltaXplV2luZG93IgorICAgCSAgCQljbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvbiI+PC9kaXY+CisJICAJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InRpdGxlQmFyVGV4dCIgY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVUaXRsZVRleHQiPiR7dGhpcy50aXRsZX08L2Rpdj4KKwk8L2Rpdj4KKworCTxkaXYgaWQ9IiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9ImNvbnRhaW5lck5vZGUiIGNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lQ2xpZW50Ij48L2Rpdj4KKwk8c3BhbiBkb2pvYXR0YWNocG9pbnQ9InRhYkVuZCIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiIHRhYmluZGV4PSIwIj48L3NwYW4+CisJPHNwYW4gZG9qb2F0dGFjaHBvaW50PSJ0YWJFbmRPdXRlciIgZG9qb29uZm9jdXM9InRyYXBUYWJzIiBkb2pvb25ibHVyPSJjbGVhclRyYXAiIHRhYmluZGV4PSIwIj48L3NwYW4+CisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJlc2l6ZUJhciIgY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgorPC9kaXY+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0ZvbnROYW1lLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9udE5hbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmIzM2QwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0ZvbnROYW1lLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPGRpdiBjbGFzcz0iU0NfUGFuZWwiIHN0eWxlPSJ3aWR0aDogMTUwcHg7IGhlaWdodDogMTUwcHg7Ij4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJBcmlhbCI+CisJCTxmb250IGZhY2U9IkFyaWFsIiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyI+QXJpYWw8L2ZvbnQ+CisJPC9kaXY+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iQ29taWMgU2FucyBNUyI+CisJCTxmb250IGZhY2U9IkNvbWljIFNhbnMgTVMiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij5Db21pYyBTYW5zIE1TPC9mb250PgorCTwvZGl2PgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9IkNvdXJpZXIgTmV3Ij4KKwkJPGZvbnQgZmFjZT0iQ291cmllciBOZXciIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij5Db3VyaWVyIE5ldzwvZm9udD4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJUYWhvbWEiPgorCQk8Zm9udCBmYWNlPSJUYWhvbWEiIHN0eWxlPSJmb250LXNpemU6IDEycHg7Ij5UYWhvbWE8L2ZvbnQ+CisJPC9kaXY+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iVGltZXMgTmV3IFJvbWFuIj4KKwkJPGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyI+VGltZXMgTmV3IFJvbWFuPC9mb250PgorCTwvZGl2PgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9IlZlcmRhbmEiPgorCQk8Zm9udCBmYWNlPSJWZXJkYW5hIiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyI+VmVyZGFuYTwvZm9udD4KKwk8L2Rpdj4KKzwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRWRpdG9yVG9vbGJhcl9Gb250U2l6ZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0ZvbnRTaXplLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzNmI5NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRWRpdG9yVG9vbGJhcl9Gb250U2l6ZS5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxkaXYgY2xhc3M9IlNDX1BhbmVsIiBzdHlsZT0id2lkdGg6IDE1MHB4OyBoZWlnaHQ6IDE1MHB4OyI+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgc3R5bGU9InRhYmxlLWxheW91dDogZml4ZWQ7Ij4KKzx0Ym9keT4KKzx0cj4KKzx0ZCBub3dyYXA9IiI+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iMSI+CisJPGZvbnQgc2l6ZT0iMSI+eHgtc21hbGw8L2ZvbnQ+CisJPC9kaXY+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iMiI+CisJPGZvbnQgc2l6ZT0iMiI+eC1zbWFsbDwvZm9udD4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSIzIj4KKwk8Zm9udCBzaXplPSIzIj5zbWFsbDwvZm9udD4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSI0Ij4KKwk8Zm9udCBzaXplPSI0Ij5tZWRpdW08L2ZvbnQ+CisJPC9kaXY+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iNSI+CisJPGZvbnQgc2l6ZT0iNSI+bGFyZ2U8L2ZvbnQ+CisJPC9kaXY+CisJPGRpdiBjbGFzcz0iU0NfSXRlbSIgZHJvcERvd25JdGVtTmFtZT0iNiI+CisJPGZvbnQgc2l6ZT0iNiI+eC1sYXJnZTwvZm9udD4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSI3Ij4KKwk8Zm9udCBzaXplPSI3Ij54eC1sYXJnZTwvZm9udD4KKwk8L2Rpdj4KKzwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9ybWF0QmxvY2suaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvRWRpdG9yVG9vbGJhcl9Gb3JtYXRCbG9jay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzdkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9ybWF0QmxvY2suaHRtbApAQCAtMCwwICsxLDUyIEBACis8ZGl2IGNsYXNzPSJTQ19QYW5lbCIgc3R5bGU9IndpZHRoOiAxOTBweDsgaGVpZ2h0OiAxNTBweDsiPgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9InAiPgorCQk8ZGl2IGNsYXNzPSJCYXNlRm9udCI+CisJCQk8cD5Ob3JtYWw8L3A+CisJCTwvZGl2PgorCTwvZGl2PgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9ImRpdiI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxkaXY+Tm9ybWFsIChESVYpPC9kaXY+CisJCTwvZGl2PgorCTwvZGl2PgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9InByZSI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxwcmU+Rm9ybWF0dGVkPC9wcmU+CisJCTwvZGl2PgorCTwvZGl2PgorCTxkaXYgY2xhc3M9IlNDX0l0ZW0iIGRyb3BEb3duSXRlbU5hbWU9ImFkZHJlc3MiPgorCQk8ZGl2IGNsYXNzPSJCYXNlRm9udCI+CisJCQk8YWRkcmVzcz5BZGRyZXNzPC9hZGRyZXNzPgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoMSI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoMT5IZWFkaW5nIDE8L2gxPgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoMiI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoMj5IZWFkaW5nIDI8L2gyPgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoMyI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoMz5IZWFkaW5nIDM8L2gzPgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoNCI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoND5IZWFkaW5nIDQ8L2g0PgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoNSI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoNT5IZWFkaW5nIDU8L2g1PgorCQk8L2Rpdj4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJTQ19JdGVtIiBkcm9wRG93bkl0ZW1OYW1lPSJoNiI+CisJCTxkaXYgY2xhc3M9IkJhc2VGb250Ij4KKwkJCTxoNj5IZWFkaW5nIDY8L2g2PgorCQk8L2Rpdj4KKwk8L2Rpdj4KKzwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvc2hvd3RhYmxlYm9yZGVyX2dlY2tvLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvcjIvc2hvd3RhYmxlYm9yZGVyX2dlY2tvLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQzNjJhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9zaG93dGFibGVib3JkZXJfZ2Vja28uY3NzCkBAIC0wLDAgKzEsMTkgQEAKKy8qIEZvciB0YWJsZXMgd2l0aCB0aGUgImJvcmRlciIgYXR0cmlidXRlIHNldCB0byAiMCIgKi8KK3RhYmxlW2JvcmRlcj0iMCJdLCAKK3RhYmxlW2JvcmRlcj0iMCJdID4gdHIgPiB0ZCwgdGFibGVbYm9yZGVyPSIwIl0gPiB0ciA+IHRoLCAKK3RhYmxlW2JvcmRlcj0iMCJdID4gdGJvZHkgPiB0ciA+IHRkLCB0YWJsZVtib3JkZXI9IjAiXSA+IHRib2R5ID4gdHIgPiB0aCwgCit0YWJsZVtib3JkZXI9IjAiXSA+IHRoZWFkID4gdHIgPiB0ZCwgdGFibGVbYm9yZGVyPSIwIl0gPiB0aGVhZCA+IHRyID4gdGgsIAordGFibGVbYm9yZGVyPSIwIl0gPiB0Zm9vdCA+IHRyID4gdGQsIHRhYmxlW2JvcmRlcj0iMCJdID4gdGZvb3QgPiB0ciA+IHRoCit7CisJYm9yZGVyOiAjZDNkM2QzIDFweCBkb3R0ZWQgOworfQorCisvKiBGb3IgdGFibGVzIHdpdGggbm8gImJvcmRlciIgYXR0cmlidXRlIHNldCAqLwordGFibGU6bm90KFtib3JkZXJdKSwgCit0YWJsZTpub3QoW2JvcmRlcl0pID4gdHIgPiB0ZCwgdGFibGU6bm90KFtib3JkZXJdKSA+IHRyID4gdGgsCit0YWJsZTpub3QoW2JvcmRlcl0pID4gdGJvZHkgPiB0ciA+IHRkLCB0YWJsZTpub3QoW2JvcmRlcl0pID4gdGJvZHkgPiB0ciA+IHRoLAordGFibGU6bm90KFtib3JkZXJdKSA+IHRoZWFkID4gdHIgPiB0ZCwgdGFibGU6bm90KFtib3JkZXJdKSA+IHRoZWFkID4gdHIgPiB0aCwKK3RhYmxlOm5vdChbYm9yZGVyXSkgPiB0Zm9vdCA+IHRyID4gdGQsIHRhYmxlOm5vdChbYm9yZGVyXSkgPiB0Zm9vdCA+IHRyID4gdGgKK3sKKwlib3JkZXI6ICNkM2QzZDMgMXB4IGRvdHRlZCA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9zaG93dGFibGVib3JkZXJfaWUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yMi9zaG93dGFibGVib3JkZXJfaWUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWExYjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3IyL3Nob3d0YWJsZWJvcmRlcl9pZS5jc3MKQEAgLTAsMCArMSw0IEBACit0YWJsZS5kb2pvU2hvd0lFVGFibGVCb3JkZXJzLCB0YWJsZS5kb2pvU2hvd0lFVGFibGVCb3JkZXJzIHRkLCB0YWJsZS5kb2pvU2hvd0lFVGFibGVCb3JkZXJzIHRoCit7CisJYm9yZGVyOiAjZDNkM2QzIDFweCBzb2xpZDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3JUb29sYmFyLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvclRvb2xiYXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTBmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3JUb29sYmFyLmNzcwpAQCAtMCwwICsxLDE1MiBAQAorLlN0eWxlRHJvcGRvd25Db250YWluZXIgeworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl6LWluZGV4OiAxMDAwOworCW92ZXJmbG93OiBhdXRvOworCWN1cnNvcjogZGVmYXVsdDsKKwl3aWR0aDogMjUwcHg7CisJaGVpZ2h0OiAyNTBweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKwlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKK30KKworLkNvbG9yRHJvcGRvd25Db250YWluZXIgeworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl6LWluZGV4OiAxMDAwOworCW92ZXJmbG93OiBhdXRvOworCWN1cnNvcjogZGVmYXVsdDsKKwl3aWR0aDogMjUwcHg7CisJaGVpZ2h0OiAxNTBweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKwlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKK30KKworLkVkaXRvclRvb2xiYXJEb21Ob2RlIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoYnV0dG9ucy9iZy1mYWRlLnBuZyk7CisJYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworCWJhY2tncm91bmQtcG9zaXRpb246IDBweCAtNTBweDsKK30KKworLkVkaXRvclRvb2xiYXJTbWFsbEJnIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3Rvb2xiYXItYmcuZ2lmKTsKKwliYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisJYmFja2dyb3VuZC1wb3NpdGlvbjogMHB4IDBweDsKK30KKworLyoKK2JvZHkgeworCWJhY2tncm91bmQ6dXJsKGltYWdlcy9ibGFuay5naWYpIGZpeGVkOworfSovCisKKy5JRUZpeGVkVG9vbGJhciB7CisJcG9zaXRpb246YWJzb2x1dGU7CisJLyogdG9wOjA7ICovCisJdG9wOiBleHByZXNzaW9uKGV2YWwoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKSk7Cit9CisKK2Rpdi5iaWdJY29uIHsKKwl3aWR0aDogNDBweDsKKwloZWlnaHQ6IDQwcHg7IAorCS8qIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAqLworCS8qIGJvcmRlcjogMXB4IHNvbGlkICNhNmE3YTM7ICovCisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIFRyZWJ1Y2hldCwgVGFob21hLCBBcmlhbDsKK30KKworLmljb25Db250YWluZXIgeworCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBUcmVidWNoZXQsIFRhaG9tYSwgQXJpYWw7CisJZm9udC1zaXplOiAxM3B4OworCWZsb2F0OiBsZWZ0OworCWhlaWdodDogMThweDsKKwlkaXNwbGF5OiBibG9jazsKKwkvKiBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgKi8KKwljdXJzb3I6IHBvaW50ZXI7CisJcGFkZGluZzogMXB4IDRweCAxcHggMXB4OyAvKiBhbG1vc3QgdGhlIHNhbWUgYXMgYSB0cmFuc3BhcmVudCBib3JkZXIgKi8KKwlib3JkZXI6IDBweDsKK30KKworLmRvam9FMlRCSWNvbiB7CisJZGlzcGxheTogYmxvY2s7CisJdGV4dC1hbGlnbjogY2VudGVyOworCW1pbi13aWR0aDogMThweDsKKwl3aWR0aDogMThweDsKKwloZWlnaHQ6IDE4cHg7CisJLyogYmFja2dyb3VuZC1jb2xvcjogI2E2YTdhMzsgKi8KKwliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworCWJhY2tncm91bmQtaW1hZ2U6IHVybChidXR0b25zL2FnZ3JlZ2F0ZS5naWYpOworfQorCisKKy5kb2pvRTJUQkljb25bY2xhc3N+PWRvam9FMlRCSWNvbl0geworfQorCisuVG9vbGJhckJ1dHRvbkxhdGNoZWQgeworICAgIGJvcmRlcjogIzMxNmFjNSAxcHggc29saWQ7ICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqLworICAgIGJhY2tncm91bmQtY29sb3I6ICNjMWQyZWU7Cit9CisKKy5Ub29sYmFyQnV0dG9uSGlnaGxpZ2h0ZWQgeworICAgIGJvcmRlcjogIzMxNmFjNSAxcHggc29saWQ7ICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqLworICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYxZmY7Cit9CisKKy5Ub29sYmFyQnV0dG9uRGlzYWJsZWR7CisgICAgZmlsdGVyOiBncmF5KCkgYWxwaGEob3BhY2l0eT0zMCk7IC8qIElFICovCisgICAgb3BhY2l0eTogMC4zMDsgLyogU2FmYXJpLCBPcGVyYSBhbmQgTW96aWxsYSAqLworfQorCisuaGVhZGluZ0NvbnRhaW5lciB7CisJd2lkdGg6IDE1MHB4OworCWhlaWdodDogMzBweDsKKwltYXJnaW46IDBweDsKKwkvKiBwYWRkaW5nLWxlZnQ6IDVweDsgKi8KKwlvdmVyZmxvdzogaGlkZGVuOworCWxpbmUtaGVpZ2h0OiAyNXB4OworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKKwlib3JkZXItdG9wOiAxcHggc29saWQgd2hpdGU7Cit9CisKKy5FZGl0b3JUb29sYmFyRG9tTm9kZSBzZWxlY3QgeworCWZvbnQtc2l6ZTogMTRweDsKK30KKyAKKy5kb2pvRTJUQkljb25fU2VwIHsgd2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7IG1heC13aWR0aDogNXB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggMHB4fQorLmRvam9FMlRCSWNvbl9CYWNrY29sb3IgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMThweCAwcHh9CisuZG9qb0UyVEJJY29uX0JvbGQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzZweCAwcHh9CisuZG9qb0UyVEJJY29uX0NhbmNlbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDBweH0KKy5kb2pvRTJUQkljb25fQ29weSB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MnB4IDBweH0KKy5kb2pvRTJUQkljb25fTGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05MHB4IDBweH0KKy5kb2pvRTJUQkljb25fQ3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwOHB4IDBweH0KKy5kb2pvRTJUQkljb25fRGVsZXRlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyNnB4IDBweH0KKy5kb2pvRTJUQkljb25fVGV4dENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IDBweH0KKy5kb2pvRTJUQkljb25fQmFja2dyb3VuZENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MnB4IDBweH0KKy5kb2pvRTJUQkljb25fSW5kZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE4MHB4IDBweH0KKy5kb2pvRTJUQkljb25fSG9yaXpvbnRhbExpbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTk4cHggMHB4fQorLmRvam9FMlRCSWNvbl9JbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTZweCAwcHh9CisuZG9qb0UyVEJJY29uX051bWJlcmVkTGlzdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMzRweCAwcHh9CisuZG9qb0UyVEJJY29uX1RhYmxlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI1MnB4IDBweH0KKy5kb2pvRTJUQkljb25fQnVsbGV0ZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MHB4IDBweH0KKy5kb2pvRTJUQkljb25fSXRhbGljIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4OHB4IDBweH0KKy5kb2pvRTJUQkljb25fQ2VudGVySnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMDZweCAwcHh9CisuZG9qb0UyVEJJY29uX0Jsb2NrSnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMjRweCAwcHh9CisuZG9qb0UyVEJJY29uX0xlZnRKdXN0aWZ5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM0MnB4IDBweH0KKy5kb2pvRTJUQkljb25fUmlnaHRKdXN0aWZ5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2MHB4IDBweH0KKy5kb2pvRTJUQkljb25fbGVmdF90b19yaWdodCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAwcHh9CisuZG9qb0UyVEJJY29uX2xpc3RfYnVsbGV0X2luZGVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zOTZweCAwcHh9CisuZG9qb0UyVEJJY29uX2xpc3RfYnVsbGV0X291dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDE0cHggMHB4fQorLmRvam9FMlRCSWNvbl9saXN0X251bV9pbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDMycHggMHB4fQorLmRvam9FMlRCSWNvbl9saXN0X251bV9vdXRkZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ1MHB4IDBweH0KKy5kb2pvRTJUQkljb25fT3V0ZGVudCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00NjhweCAwcHh9CisuZG9qb0UyVEJJY29uX1Bhc3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4NnB4IDBweH0KKy5kb2pvRTJUQkljb25fUmVkbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MDRweCAwcHh9Citkb2pvRTJUQkljb25fUmVtb3ZlRm9ybWF0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUyMnB4IDBweH0KKy5kb2pvRTJUQkljb25fcmlnaHRfdG9fbGVmdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NDBweCAwcHh9CisuZG9qb0UyVEJJY29uX1NhdmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTU4cHggMHB4fQorLmRvam9FMlRCSWNvbl9TcGFjZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NzZweCAwcHh9CisuZG9qb0UyVEJJY29uX1N0cmlrZVRocm91Z2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk0cHggMHB4fQorLmRvam9FMlRCSWNvbl9TdWJzY3JpcHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjEycHggMHB4fQorLmRvam9FMlRCSWNvbl9TdXBlcnNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MzBweCAwcHh9CisuZG9qb0UyVEJJY29uX1VuZGVybGluZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NDhweCAwcHh9CisuZG9qb0UyVEJJY29uX1VuZG8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjY2cHggMHB4fQorLmRvam9FMlRCSWNvbl9XaWtpV29yZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02ODRweCAwcHh9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvclRvb2xiYXIuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvclRvb2xiYXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDAxMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yVG9vbGJhci5odG1sCkBAIC0wLDAgKzEsMTUzIEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iZG9tTm9kZSIgY2xhc3M9IkVkaXRvclRvb2xiYXJEb21Ob2RlIiB1bnNlbGVjdGFibGU9Im9uIj4KKwk8dGFibGUgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPgorCQk8IS0tCisJCQlvdXIgdG9vbGJhciBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZToKKworCQkJKz09PT09PT0rPT09PT09PSs9PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKwkJCXwgdyAgIHcgfCBzdHlsZSB8IGNvcHkgIHwgYm8gfCBpdCB8IHVuIHwgbGUgfCBjZSB8IHJpIHwKKwkJCXwgdyB3IHcgfCBzdHlsZSB8PT09PT09PXw9PT09PT09PT09PT09PXw9PT09PT09PT09PT09PXwKKwkJCXwgIHcgdyAgfCBzdHlsZSB8IHBhc3RlIHwgIHVuZG8gfCByZWRvIHwgY2hhbmdlIHN0eWxlIHwKKwkJCSs9PT09PT09Kz09PT09PT0rPT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisJCS0tPgorCQk8dGJvZHk+CisJCQk8dHIgdmFsaWduPSJ0b3AiPgorCQkJCTx0ZCByb3dzcGFuPSIyIj4KKwkJCQkJPGRpdiBjbGFzcz0iYmlnSWNvbiIgZG9qb0F0dGFjaFBvaW50PSJ3aWtpV29yZEJ1dHRvbiIKKwkJCQkJCWRvam9PbkNsaWNrPSJ3aWtpV29yZENsaWNrOyBidXR0b25DbGljazsiPgorCQkJCQkJPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMzBweDsgbWFyZ2luLWxlZnQ6IDVweDsiPgorCQkJCQkJCVcKKwkJCQkJCTwvc3Bhbj4KKwkJCQkJPC9kaXY+CisJCQkJPC90ZD4KKwkJCQk8dGQgcm93c3Bhbj0iMiI+CisJCQkJCTxkaXYgY2xhc3M9ImJpZ0ljb24iIGRvam9BdHRhY2hQb2ludD0ic3R5bGVEcm9wZG93bkJ1dHRvbiIKKwkJCQkJCWRvam9PbkNsaWNrPSJzdHlsZURyb3Bkb3duQ2xpY2s7IGJ1dHRvbkNsaWNrOyI+CisJCQkJCQk8c3BhbiB1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCXN0eWxlPSJmb250LXNpemU6IDMwcHg7IG1hcmdpbi1sZWZ0OiA1cHg7Ij4KKwkJCQkJCQlTCisJCQkJCQk8L3NwYW4+CisJCQkJCTwvZGl2PgorCQkJCQk8ZGl2IGNsYXNzPSJTdHlsZURyb3Bkb3duQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiCisJCQkJCQlkb2pvQXR0YWNoUG9pbnQ9InN0eWxlRHJvcGRvd25Db250YWluZXIiPgorCQkJCQkJPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIgorCQkJCQkJCWhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPgorCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+CisJCQkJCQkJCTx0ZCByb3dzcGFuPSIyIj4KKwkJCQkJCQkJCTxkaXYgc3R5bGU9ImhlaWdodDogMjQ1cHg7IG92ZXJmbG93OiBhdXRvOyI+CisJCQkJCQkJCQkJPGRpdiBjbGFzcz0iaGVhZGluZ0NvbnRhaW5lciIKKwkJCQkJCQkJCQkJdW5zZWxlY3RhYmxlPSJvbiIKKwkJCQkJCQkJCQkJZG9qb09uQ2xpY2s9Im5vcm1hbFRleHRDbGljayI+bm9ybWFsPC9kaXY+CisJCQkJCQkJCQkJPGgxIGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIgorCQkJCQkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCQkJCQlkb2pvT25DbGljaz0iaDFUZXh0Q2xpY2siPkhlYWRpbmcgMTwvaDE+CisJCQkJCQkJCQkJPGgyIGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIgorCQkJCQkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCQkJCQlkb2pvT25DbGljaz0iaDJUZXh0Q2xpY2siPkhlYWRpbmcgMjwvaDI+CisJCQkJCQkJCQkJPGgzIGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIgorCQkJCQkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCQkJCQlkb2pvT25DbGljaz0iaDNUZXh0Q2xpY2siPkhlYWRpbmcgMzwvaDM+CisJCQkJCQkJCQkJPGg0IGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIgorCQkJCQkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCQkJCQlkb2pvT25DbGljaz0iaDRUZXh0Q2xpY2siPkhlYWRpbmcgNDwvaDQ+CisJCQkJCQkJCQkJPGRpdiBjbGFzcz0iaGVhZGluZ0NvbnRhaW5lciIKKwkJCQkJCQkJCQkJdW5zZWxlY3RhYmxlPSJvbiIKKwkJCQkJCQkJCQkJZG9qb09uQ2xpY2s9ImJsYWhUZXh0Q2xpY2siPmJsYWg8L2Rpdj4KKwkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIgorCQkJCQkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJCQkJCQlkb2pvT25DbGljaz0iYmxhaFRleHRDbGljayI+YmxhaDwvZGl2PgorCQkJCQkJCQkJCTxkaXYgY2xhc3M9ImhlYWRpbmdDb250YWluZXIiCisJCQkJCQkJCQkJCXVuc2VsZWN0YWJsZT0ib24iCisJCQkJCQkJCQkJCWRvam9PbkNsaWNrPSJibGFoVGV4dENsaWNrIj5ibGFoPC9kaXY+CisJCQkJCQkJCQkJPGRpdiBjbGFzcz0iaGVhZGluZ0NvbnRhaW5lciI+YmxhaDwvZGl2PgorCQkJCQkJCQkJCTxkaXYgY2xhc3M9ImhlYWRpbmdDb250YWluZXIiPmJsYWg8L2Rpdj4KKwkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIj5ibGFoPC9kaXY+CisJCQkJCQkJCQkJPGRpdiBjbGFzcz0iaGVhZGluZ0NvbnRhaW5lciI+YmxhaDwvZGl2PgorCQkJCQkJCQkJPC9kaXY+CisJCQkJCQkJCTwvdGQ+CisJCQkJCQkJCTwhLS0KKwkJCQkJCQkJPHRkPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9PbkNsaWNrPSJidXR0b25DbGljazsiPgorCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIGp1c3RpZnlsZWZ0IiAKKwkJCQkJCQkJCQkJc3R5bGU9ImZsb2F0OiBsZWZ0OyI+Jm5ic3A7PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9PbkNsaWNrPSJidXR0b25DbGljazsiPgorCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIGp1c3RpZnljZW50ZXIiIAorCQkJCQkJCQkJCQlzdHlsZT0iZmxvYXQ6IGxlZnQ7Ij4mbmJzcDs8L3NwYW4+CisJCQkJCQkJCQk8L3NwYW4+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciIgZG9qb09uQ2xpY2s9ImJ1dHRvbkNsaWNrOyI+CisJCQkJCQkJCQkJPHNwYW4gY2xhc3M9Imljb24ganVzdGlmeXJpZ2h0IiAKKwkJCQkJCQkJCQkJc3R5bGU9ImZsb2F0OiBsZWZ0OyI+Jm5ic3A7PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9PbkNsaWNrPSJidXR0b25DbGljazsiPgorCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIGp1c3RpZnlmdWxsIiAKKwkJCQkJCQkJCQkJc3R5bGU9ImZsb2F0OiBsZWZ0OyI+Jm5ic3A7PC9zcGFuPgorCQkJCQkJCQkJPC9zcGFuPgorCQkJCQkJCQk8L3RkPgorCQkJCQkJCQktLT4KKwkJCQkJCQk8L3RyPgorCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+CisJCQkJCQkJCTx0ZD4KKwkJCQkJCQkJCXRodWQKKwkJCQkJCQkJPC90ZD4KKwkJCQkJCQk8L3RyPgorCQkJCQkJPC90YWJsZT4KKwkJCQkJPC9kaXY+CisJCQkJPC90ZD4KKwkJCQk8dGQ+CisJCQkJCTwhLS0gY29weSAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9BdHRhY2hQb2ludD0iY29weUJ1dHRvbiIKKwkJCQkJCXVuc2VsZWN0YWJsZT0ib24iCisJCQkJCQlkb2pvT25DbGljaz0iY29weUNsaWNrOyBidXR0b25DbGljazsiPgorCQkJCQkJPHNwYW4gY2xhc3M9Imljb24gY29weSIgCisJCQkJCQkJdW5zZWxlY3RhYmxlPSJvbiIKKwkJCQkJCQlzdHlsZT0iZmxvYXQ6IGxlZnQ7Ij4mbmJzcDs8L3NwYW4+IGNvcHkKKwkJCQkJPC9zcGFuPgorCQkJCQk8IS0tICJkcm9wcGFibGUiIG9wdGlvbnMgLS0+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9ImJvbGRCdXR0b24iCisJCQkJCQl1bnNlbGVjdGFibGU9Im9uIgorCQkJCQkJZG9qb09uQ2xpY2s9ImJvbGRDbGljazsgYnV0dG9uQ2xpY2s7Ij4KKwkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIGJvbGQiIHVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciIgZG9qb0F0dGFjaFBvaW50PSJpdGFsaWNCdXR0b24iCisJCQkJCQlkb2pvT25DbGljaz0iaXRhbGljQ2xpY2s7IGJ1dHRvbkNsaWNrOyI+CisJCQkJCQk8c3BhbiBjbGFzcz0iaWNvbiBpdGFsaWMiIHVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciIgZG9qb0F0dGFjaFBvaW50PSJ1bmRlcmxpbmVCdXR0b24iCisJCQkJCQlkb2pvT25DbGljaz0idW5kZXJsaW5lQ2xpY2s7IGJ1dHRvbkNsaWNrOyI+CisJCQkJCQk8c3BhbiBjbGFzcz0iaWNvbiB1bmRlcmxpbmUiIHVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciIgZG9qb0F0dGFjaFBvaW50PSJsZWZ0QnV0dG9uIgorCQkJCQkJZG9qb09uQ2xpY2s9ImxlZnRDbGljazsgYnV0dG9uQ2xpY2s7Ij4KKwkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIGp1c3RpZnlsZWZ0IiB1bnNlbGVjdGFibGU9Im9uIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9BdHRhY2hQb2ludD0iZnVsbEJ1dHRvbiIKKwkJCQkJCWRvam9PbkNsaWNrPSJmdWxsQ2xpY2s7IGJ1dHRvbkNsaWNrOyI+CisJCQkJCQk8c3BhbiBjbGFzcz0iaWNvbiBqdXN0aWZ5ZnVsbCIgdW5zZWxlY3RhYmxlPSJvbiI+Jm5ic3A7PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9InJpZ2h0QnV0dG9uIgorCQkJCQkJZG9qb09uQ2xpY2s9InJpZ2h0Q2xpY2s7IGJ1dHRvbkNsaWNrOyI+CisJCQkJCQk8c3BhbiBjbGFzcz0iaWNvbiBqdXN0aWZ5cmlnaHQiIHVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0ZD4KKwkJCQkJPCEtLSBwYXN0ZSAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiIGRvam9BdHRhY2hQb2ludD0icGFzdGVCdXR0b24iCisJCQkJCQlkb2pvT25DbGljaz0icGFzdGVDbGljazsgYnV0dG9uQ2xpY2s7IiB1bnNlbGVjdGFibGU9Im9uIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIHBhc3RlIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IiB1bnNlbGVjdGFibGU9Im9uIj4mbmJzcDs8L3NwYW4+IHBhc3RlCisJCQkJCTwvc3Bhbj4KKwkJCQkJPCEtLSAiZHJvcHBhYmxlIiBvcHRpb25zIC0tPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciIgZG9qb0F0dGFjaFBvaW50PSJ1bmRvQnV0dG9uIgorCQkJCQkJZG9qb09uQ2xpY2s9InVuZG9DbGljazsgYnV0dG9uQ2xpY2s7IiB1bnNlbGVjdGFibGU9Im9uIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJpY29uIHVuZG8iIHN0eWxlPSJmbG9hdDogbGVmdDsiIHVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4gdW5kbworCQkJCQk8L3NwYW4+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9InJlZG9CdXR0b24iCisJCQkJCQlkb2pvT25DbGljaz0icmVkb0NsaWNrOyBidXR0b25DbGljazsiIHVuc2VsZWN0YWJsZT0ib24iPgorCQkJCQkJPHNwYW4gY2xhc3M9Imljb24gcmVkbyIgc3R5bGU9ImZsb2F0OiBsZWZ0OyIgdW5zZWxlY3RhYmxlPSJvbiI+Jm5ic3A7PC9zcGFuPiByZWRvCisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgkKKwkJCTwvdHI+CisJCTwvdGJvZHk+CisJPC90YWJsZT4KKzwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvclRvb2xiYXJMaWdodC5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yVG9vbGJhckxpZ2h0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMjYyYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0VkaXRvclRvb2xiYXJMaWdodC5odG1sCkBAIC0wLDAgKzEsNDYgQEAKKzxkaXYgY2xhc3M9IkVkaXRvclRvb2xiYXJEb21Ob2RlIEVkaXRvclRvb2xiYXJTbWFsbEJnIiAKKwl1bnNlbGVjdGFibGU9Im9uIiBkb2pvT25Nb3VzZURvd249InByZXZlbnRTZWxlY3QiPgorCTx0YWJsZSBjZWxscGFkZGluZz0iMSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+CisJCTx0Ym9keT4KKwkJCTx0ciB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIGRvam9BdHRhY2hQb2ludD0ib25lTGluZVRyIj4KKwkJCQk8dGQ+CisJCQkJCTwhLS0gYm9sZCAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iYm9sZCI+CisJCQkJCQk8c3BhbiB0aXRsZT0iVG9nZ2xlIEJvbGQgKEN0cmwtQikiIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0JvbGQiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8IS0tIGl0YWxpYyAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iaXRhbGljIj4KKwkJCQkJCTxzcGFuIHRpdGxlPSJUb2dnbGUgSXRhbGljIChDdHJsLUkpIiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JdGFsaWMiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8IS0tIHVuZGVybGluZSAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0idW5kZXJsaW5lIj4KKwkJCQkJCTxzcGFuIHRpdGxlPSJUb2dnbGUgVW5kZXJsaW5lIChDdHJsLVUpIiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9VbmRlcmxpbmUiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8IS0tIGxpbmsgLS0+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9ImNyZWF0ZWxpbmsiPgorCQkJCQkJPHNwYW4gdGl0bGU9IkNyZWF0ZSBMaW5rIiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9MaW5rIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPCEtLSBpbnNlcnRpbWFnZSAtLT4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iaW5zZXJ0aW1hZ2UiPgorCQkJCQkJPHNwYW4gdGl0bGU9Ikluc2VydCBJbWFnZSIgY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fSW1hZ2UiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8IS0tIHNhdmUgLS0+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9InNhdmUiPgorCQkJCQkJPHNwYW4gdGl0bGU9IlNhdmUiIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NhdmUiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkIHdpZHRoPSIqIj4mbmJzcDs8L3RkPgorCQkJPC90cj4KKwkJPC90Ym9keT4KKwk8L3RhYmxlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9FZGl0b3JUb29sYmFyT25lbGluZS5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yVG9vbGJhck9uZWxpbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDk2MjE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvRWRpdG9yVG9vbGJhck9uZWxpbmUuaHRtbApAQCAtMCwwICsxLDE3MiBAQAorPGRpdiBjbGFzcz0iRWRpdG9yVG9vbGJhckRvbU5vZGUgRWRpdG9yVG9vbGJhclNtYWxsQmciPgorCTx0YWJsZSBjZWxscGFkZGluZz0iMSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+CisJCTx0Ym9keT4KKwkJCTx0ciB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iaHRtbHRvZ2dsZSI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIiAKKwkJCQkJCXN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiBub25lOyB3aWR0aDogMzBweDsiID4mbHQ7aCZndDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iY29weSI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Db3B5Ij4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0icGFzdGUiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUGFzdGUiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJ1bmRvIj4KKwkJCQkJCTwhLS0gRklYTUU6IHNob3VsZCB3ZSBoYXZlIHRoZSB0ZXh0ICJ1bmRvIiBoZXJlPyAtLT4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1VuZG8iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJyZWRvIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1JlZG8iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkIGlzU3BhY2VyPSJ0cnVlIj4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwIglzdHlsZT0id2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7Ij48L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iY3JlYXRlbGluayI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9MaW5rIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0iaW5zZXJ0aW1hZ2UiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fSW1hZ2UiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJpbnNlcnRob3Jpem9udGFscnVsZSI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Ib3Jpem9udGFsTGluZSAiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJib2xkIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0JvbGQiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJpdGFsaWMiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fSXRhbGljIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0idW5kZXJsaW5lIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1VuZGVybGluZSI+Jm5ic3A7PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJPC90ZD4KKwkJCQk8dGQ+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9InN0cmlrZXRocm91Z2giPgorCQkJCQkJPHNwYW4gCisJCQkJCQkJY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU3RyaWtlVGhyb3VnaCI+Jm5ic3A7PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJPC90ZD4KKwkJCQk8dGQgaXNTcGFjZXI9InRydWUiPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXAiIAorCQkJCQkJCXN0eWxlPSJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDsiPjwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJpbnNlcnR1bm9yZGVyZWRsaXN0Ij4KKwkJCQkJCTxzcGFuIAorCQkJCQkJCWNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0J1bGxldGVkTGlzdCI+Jm5ic3A7PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJPC90ZD4KKwkJCQk8dGQ+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9Imluc2VydG9yZGVyZWRsaXN0Ij4KKwkJCQkJCTxzcGFuIAorCQkJCQkJCWNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX051bWJlcmVkTGlzdCI+Jm5ic3A7PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJPC90ZD4KKwkJCQk8dGQgaXNTcGFjZXI9InRydWUiPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXAiIHN0eWxlPSJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDsiPjwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJpbmRlbnQiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fSW5kZW50IiAKKwkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0ib3V0ZGVudCI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9PdXRkZW50IiAKKwkJCQkJCQl1bnNlbGVjdGFibGU9Im9uIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZCBpc1NwYWNlcj0idHJ1ZSI+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NlcCIgc3R5bGU9IndpZHRoOiA1cHg7IG1pbi13aWR0aDogNXB4OyI+PC9zcGFuPgorCQkJCQk8L3NwYW4+CisJCQkJPC90ZD4KKwkJCQk8dGQ+CisJCQkJCTxzcGFuIGNsYXNzPSJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9ImZvcmVjb2xvciI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9UZXh0Q29sb3IiIAorCQkJCQkJCXVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJoaWxpdGVjb2xvciI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CYWNrZ3JvdW5kQ29sb3IiIAorCQkJCQkJCXVuc2VsZWN0YWJsZT0ib24iPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkIGlzU3BhY2VyPSJ0cnVlIj4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwIiBzdHlsZT0id2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7Ij48L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0ianVzdGlmeWxlZnQiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fTGVmdEp1c3RpZnkiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJqdXN0aWZ5Y2VudGVyIj4KKwkJCQkJCTxzcGFuIGNsYXNzPSJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0NlbnRlckp1c3RpZnkiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJPC9zcGFuPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8c3BhbiBjbGFzcz0iaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW0iIGRvam9FVEl0ZW1OYW1lPSJqdXN0aWZ5cmlnaHQiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUmlnaHRKdXN0aWZ5Ij4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgorCQkJCTx0ZD4KKwkJCQkJPHNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0ianVzdGlmeWZ1bGwiPgorCQkJCQkJPHNwYW4gY2xhc3M9ImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQmxvY2tKdXN0aWZ5Ij4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbj4KKwkJCQk8L3RkPgkKKwkJCQk8dGQ+CisJCQkJCTxzZWxlY3QgY2xhc3M9ImRvam9FZGl0b3JUb29sYmFySXRlbSIgZG9qb0VUSXRlbU5hbWU9InBsYWluZm9ybWF0YmxvY2siPgorCQkJCQkJPCEtLSBGSVhNRTogdXNpbmcgInAiIGhlcmUgaW5zZXJ0cyBhIHBhcmFncmFwaCBpbiBtb3N0IGNhc2VzISAtLT4KKwkJCQkJCTxvcHRpb24gdmFsdWU9IiI+LS0gZm9ybWF0IC0tPC9vcHRpb24+CisJCQkJCQk8b3B0aW9uIHZhbHVlPSJwIj5Ob3JtYWw8L29wdGlvbj4KKwkJCQkJCTxvcHRpb24gdmFsdWU9InByZSI+Rml4ZWQgRm9udDwvb3B0aW9uPgorCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaDEiPk1haW4gSGVhZGluZzwvb3B0aW9uPgorCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaDIiPlNlY3Rpb24gSGVhZGluZzwvb3B0aW9uPgorCQkJCQkJPG9wdGlvbiB2YWx1ZT0iaDMiPlN1Yi1IZWFkaW5nPC9vcHRpb24+CisJCQkJCQk8IS0tIDxvcHRpb24gdmFsdWU9ImJsb2NrcXVvdGUiPkJsb2NrIFF1b3RlPC9vcHRpb24+IC0tPgorCQkJCQk8L3NlbGVjdD4KKwkJCQk8L3RkPgorCQkJCTx0ZD48IS0tIHVuY29tbWVudCB0byBlbmFibGUgc2F2ZSBidXR0b24gLS0+CisJCQkJCTwhLS0gc2F2ZSAtLT4KKwkJCQkJPCEtLXNwYW4gY2xhc3M9Imljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtIiBkb2pvRVRJdGVtTmFtZT0ic2F2ZSI+CisJCQkJCQk8c3BhbiBjbGFzcz0iZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TYXZlIj4mbmJzcDs8L3NwYW4+CisJCQkJCTwvc3Bhbi0tPgorCQkJCTwvdGQ+CisJCQkJPHRkIHdpZHRoPSIqIj4mbmJzcDs8L3RkPgorCQkJPC90cj4KKwkJPC90Ym9keT4KKwk8L3RhYmxlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GaXNoZXllTGlzdC5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GaXNoZXllTGlzdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5MTQxZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0Zpc2hleWVMaXN0LmNzcwpAQCAtMCwwICsxLDI3IEBACisuZG9qb0h0bWxGaXNoZXllTGlzdEl0ZW1MYWJlbCB7CisJZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKwlib3JkZXI6IDJweCBzb2xpZCAjNjY2OworCXBhZGRpbmc6IDJweDsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJcG9zaXRpb246IGFic29sdXRlOworCWRpc3BsYXk6IG5vbmU7Cit9CisKKy5kb2pvSHRtbEZpc2hleWVMaXN0SXRlbUxhYmVsLnNlbGVjdGVkIHsKKwlkaXNwbGF5OiBibG9jazsKK30KKworLmRvam9IdG1sRmlzaGV5ZUxpc3RJdGVtSW1hZ2UgeworCWJvcmRlcjogMHB4OworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKK30KKworLmRvam9IdG1sRmlzaGV5ZUxpc3RJdGVtIHsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJei1pbmRleDogMjsKK30KKworLmRvam9IdG1sRmlzaGV5ZUxpc3RCYXIgeworCXBvc2l0aW9uOiByZWxhdGl2ZTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0Zsb2F0aW5nUGFuZS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GbG9hdGluZ1BhbmUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDJhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GbG9hdGluZ1BhbmUuY3NzCkBAIC0wLDAgKzEsMTE4IEBACisKKy8qKioqKioqKioqIE91dGVyIFdpbmRvdyAqKioqKioqKioqKioqKiovCisKKy5kb2pvRmxvYXRpbmdQYW5lIHsKKwkvKiBlc3NlbnRpYWwgY3NzICovCisJcG9zaXRpb246IGFic29sdXRlOworCW92ZXJmbG93OiB2aXNpYmxlOwkJLyogc28gZHJvcCBzaGFkb3cgaXMgZGlzcGxheWVkICovCisJei1pbmRleDogMTA7CisKKwkvKiBzdHlsaW5nIGNzcyAqLworCWJvcmRlcjogMXB4IHNvbGlkOworCWJvcmRlci1jb2xvcjogVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdyBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0OworCWJhY2tncm91bmQtY29sb3I6IFRocmVlREZhY2U7Cit9CisKKworLyoqKioqKioqKiogVGl0bGUgQmFyICoqKioqKioqKioqKioqKiovCisKKy5kb2pvRmxvYXRpbmdQYW5lVGl0bGVCYXIgeworCXZlcnRpY2FsLWFsaWduOiB0b3A7CisJbWFyZ2luOiAycHggMnB4IDJweCAycHg7CisJei1pbmRleDogMTA7CisJYmFja2dyb3VuZC1jb2xvcjogIzc1OTZjNjsKKwljdXJzb3I6IGRlZmF1bHQ7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwlib3JkZXItY29sb3I6IFRocmVlREhpZ2hsaWdodCBUaHJlZURTaGFkb3cgVGhyZWVEU2hhZG93IFRocmVlREhpZ2hsaWdodDsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dCB7CisJZmxvYXQ6IGxlZnQ7CisJcGFkZGluZzogMnB4IDRweCAycHggMnB4OworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJY29sb3I6IENhcHRpb25UZXh0OworCWZvbnQ6IHNtYWxsLWNhcHRpb247Cit9CisKKy5kb2pvVGl0bGVCYXJJY29uIHsKKwlmbG9hdDogbGVmdDsKKwloZWlnaHQ6IDIycHg7CisJd2lkdGg6IDIycHg7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKwltYXJnaW4tcmlnaHQ6IDVweDsKKwltYXJnaW4tbGVmdDogNXB4OworfQorCisuZG9qb0Zsb2F0aW5nUGFuZUFjdGlvbnN7CisJZmxvYXQ6IHJpZ2h0OworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwlyaWdodDogMnB4OworCXRvcDogMnB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKworLmRvam9GbG9hdGluZ1BhbmVBY3Rpb25JdGVtIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworCW1hcmdpbi1yaWdodDogMXB4OworCWhlaWdodDogMjJweDsKKwl3aWR0aDogMjJweDsKK30KKworCisuZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFySWNvbiB7CisJLyogZXNzZW50aWFsIGNzcyAqLworCWZsb2F0OiBsZWZ0OworCisJLyogc3R5bGluZyBjc3MgKi8KKwltYXJnaW4tbGVmdDogMnB4OworCW1hcmdpbi1yaWdodDogNHB4OworCWhlaWdodDogMjJweDsKK30KKworLyogbWluaW1pemUvbWF4aW1pemUgaWNvbnMgYXJlIHNwZWNpZmllZCBieSBDU1Mgb25seSAqLworLmRvam9GbG9hdGluZ1BhbmVNaW5pbWl6ZUljb24sCisuZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvbiwKKy5kb2pvRmxvYXRpbmdQYW5lUmVzdG9yZUljb24sCisuZG9qb0Zsb2F0aW5nUGFuZUNsb3NlSWNvbiB7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKwloZWlnaHQ6IDIycHg7CisJd2lkdGg6IDIycHg7CisJZmxvYXQ6IHJpZ2h0OworfQorLmRvam9GbG9hdGluZ1BhbmVNaW5pbWl6ZUljb24geworCWJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZmxvYXRpbmdQYW5lTWluaW1pemUuZ2lmKTsKK30KKy5kb2pvRmxvYXRpbmdQYW5lTWF4aW1pemVJY29uIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZU1heGltaXplLmdpZik7Cit9CisuZG9qb0Zsb2F0aW5nUGFuZVJlc3RvcmVJY29uIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZVJlc3RvcmUuZ2lmKTsKK30KKy5kb2pvRmxvYXRpbmdQYW5lQ2xvc2VJY29uIHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZUNsb3NlLmdpZik7Cit9CisKKy8qIGJhciBhdCBib3R0b20gb2Ygd2luZG93IHRoYXQgaG9sZHMgcmVzaXplIGhhbmRsZSAqLworLmRvam9GbG9hdGluZ1BhbmVSZXNpemViYXIgeworCXotaW5kZXg6IDEwOworCWhlaWdodDogMTNweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlOworfQorCisvKioqKioqKioqKioqKiBDbGllbnQgQXJlYSAqKioqKioqKioqKioqKiovCisKKy5kb2pvRmxvYXRpbmdQYW5lQ2xpZW50IHsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJei1pbmRleDogMTA7CisJYm9yZGVyOiAxcHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0IFRocmVlREhpZ2hsaWdodCBUaHJlZURTaGFkb3c7CisJbWFyZ2luOiAycHg7CisJYmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTsKKwlwYWRkaW5nOiA4cHg7CisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgR2FyYW1vbmQsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxMnB4OworCW92ZXJmbG93OiBhdXRvOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GbG9hdGluZ1BhbmUuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0Zsb2F0aW5nUGFuZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTgxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9GbG9hdGluZ1BhbmUuaHRtbApAQCAtMCwwICsxLDE4IEBACis8ZGl2IGlkPSIke3RoaXMud2lkZ2V0SWR9IiBkb2pvQXR0YWNoRXZlbnQ9Im9uTW91c2VEb3duIiBjbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZSI+CisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InRpdGxlQmFyIiBjbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFyIiAgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisJICAJPGltZyBkb2pvQXR0YWNoUG9pbnQ9InRpdGxlQmFySWNvbiIgIGNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lVGl0bGVCYXJJY29uIj4KKwkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImNsb3NlQWN0aW9uIiBkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6Y2xvc2VXaW5kb3ciCisgICAJICAJCWNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lQ2xvc2VJY29uIj48L2Rpdj4KKwkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJlc3RvcmVBY3Rpb24iIGRvam9BdHRhY2hFdmVudD0ib25DbGljazpyZXN0b3JlV2luZG93IgorICAgCSAgCQljbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZVJlc3RvcmVJY29uIj48L2Rpdj4KKwkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9Im1heGltaXplQWN0aW9uIiBkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6bWF4aW1pemVXaW5kb3ciCisgICAJICAJCWNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lTWF4aW1pemVJY29uIj48L2Rpdj4KKwkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9Im1pbmltaXplQWN0aW9uIiBkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6bWluaW1pemVXaW5kb3ciCisgICAJICAJCWNsYXNzPSJkb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uIj48L2Rpdj4KKwkgIAk8ZGl2IGRvam9BdHRhY2hQb2ludD0idGl0bGVCYXJUZXh0IiBjbGFzcz0iZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dCI+JHt0aGlzLnRpdGxlfTwvZGl2PgorCTwvZGl2PgorCisJPGRpdiBpZD0iJHt0aGlzLndpZGdldElkfV9jb250YWluZXIiIGRvam9BdHRhY2hQb2ludD0iY29udGFpbmVyTm9kZSIgY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVDbGllbnQiPjwvZGl2PgorCisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InJlc2l6ZUJhciIgY2xhc3M9ImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgorPC9kaXY+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvSW5saW5lRWRpdEJveC5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9JbmxpbmVFZGl0Qm94LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWYwZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvSW5saW5lRWRpdEJveC5jc3MKQEAgLTAsMCArMSwyOSBAQAorLmVkaXRMYWJlbCB7CisJZm9udC1zaXplIDogc21hbGw7CisJcGFkZGluZyA6IDAgNXB4OworCWRpc3BsYXkgOiBub25lOworfQorCisuZWRpdGFibGVSZWdpb25EaXNhYmxlZCB7CisJY3Vyc29yIDogcG9pbnRlcjsKKwlfY3Vyc29yIDogaGFuZDsKK30KKworLmVkaXRhYmxlUmVnaW9uIHsKKwliYWNrZ3JvdW5kLWNvbG9yIDogI2ZmYyAhaW1wb3J0YW50OworCWN1cnNvciA6IHBvaW50ZXI7CisJX2N1cnNvciA6IGhhbmQ7Cit9CisKKy5lZGl0YWJsZVJlZ2lvbiAuZWRpdExhYmVsIHsKKwlkaXNwbGF5IDogaW5saW5lOworfQorCisuZWRpdGFibGVUZXh0YXJlYVJlZ2lvbiAuZWRpdExhYmVsIHsKKwlkaXNwbGF5IDogYmxvY2s7Cit9CisKKy5pbmxpbmVFZGl0Qm94IHsKKwkvKmJhY2tncm91bmQtY29sb3IgOiAjZmZjOyovCisJZGlzcGxheSA6IGlubGluZTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0lubGluZUVkaXRCb3guaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL0lubGluZUVkaXRCb3guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWIwMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvSW5saW5lRWRpdEJveC5odG1sCkBAIC0wLDAgKzEsNiBAQAorPGZvcm0gY2xhc3M9ImlubGluZUVkaXRCb3giIHN0eWxlPSJkaXNwbGF5OiBub25lIiBkb2pvQXR0YWNoUG9pbnQ9ImZvcm0iIGRvam9BdHRhY2hFdmVudD0ib25TdWJtaXQ6c2F2ZUVkaXQ7IG9uUmVzZXQ6Y2FuY2VsRWRpdDsgb25LZXlVcDogY2hlY2tGb3JWYWx1ZUNoYW5nZTsiPgorCTxpbnB1dCB0eXBlPSJ0ZXh0IiBkb2pvQXR0YWNoUG9pbnQ9InRleHQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KKwk8dGV4dGFyZWEgZG9qb0F0dGFjaFBvaW50PSJ0ZXh0YXJlYSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48L3RleHRhcmVhPgorCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTYXZlIiBkb2pvQXR0YWNoUG9pbnQ9InN1Ym1pdEJ1dHRvbiIgLz4KKwk8aW5wdXQgdHlwZT0icmVzZXQiIHZhbHVlPSJDYW5jZWwiIGRvam9BdHRhY2hQb2ludD0iY2FuY2VsQnV0dG9uIiAvPgorPC9mb3JtPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTWVudS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9NZW51LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE5ZjZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTWVudS5jc3MKQEAgLTAsMCArMSw2MCBAQAorLmRvam9NZW51IHsKKwlib3JkZXI6MXB4IHNvbGlkICMwMDAwMDA7CisJbGlzdC1zdHlsZS10eXBlOm5vbmU7CisJbWFyZ2luOjA7CisJcGFkZGluZzowOworCXBhZGRpbmctYm90dG9tOiAxcHg7CisJYmFja2dyb3VuZC1jb2xvcjojZjRmNGY0OworCWZvbnQtc2l6ZTogOHB0OworfQorCisuZG9qb01lbnVTZXBhcmF0b3IgeworCWxpc3Qtc3R5bGUtdHlwZTpub25lOworCW1hcmdpbjowOworCXBhZGRpbmc6MXB4IDA7CisJYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzAwMDAwMDsKKwlsaW5lLWhlaWdodDoxcHg7CisJaGVpZ2h0OjFweDsKK30KKworbGk6aG92ZXIuZG9qb01lbnVTZXBhcmF0b3IgeworCWJhY2tncm91bmQtY29sb3I6I2U1ZTVlNTsKKwljdXJzb3I6ZGVmYXVsdDsKK30KKworCisKKworLmRvam9Db250ZXh0TWVudSB7CisJcG9zaXRpb246IGFic29sdXRlOworCWRpc3BsYXk6IG5vbmU7CisJYm9yZGVyOiAycHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7CisJbGlzdC1zdHlsZS10eXBlOiBub25lOworCW1hcmdpbjogMDsKKwlwYWRkaW5nOiAxcHg7CisJYmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTsKKwlmb250LXNpemU6IDhwdDsKK30KKworLmRvam9NZW51SXRlbSB7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwlwYWRkaW5nOiAycHg7CisJZm9udDogbWVudTsKKwljb2xvcjogV2luZG93VGV4dDsKK30KKworLmRvam9NZW51SXRlbSBhIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6IFdpbmRvd1RleHQ7CisJZm9udDogaW5oZXJpdDsKK30KKworLmRvam9NZW51SXRlbUhvdmVyIHsKKwlwYWRkaW5nOiAycHg7CisJYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsKKwljdXJzb3I6IHBvaW50ZXI7CisJX2N1cnNvcjogaGFuZDsKKwliYWNrZ3JvdW5kLWNvbG9yOiBIaWdobGlnaHQ7CisJY29sb3I6IEhpZ2hsaWdodFRleHQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTWVudTIuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTWVudTIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2NmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9NZW51Mi5jc3MKQEAgLTAsMCArMSwxMTYgQEAKKworLmRvam9Qb3B1cE1lbnUyIHsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJYm9yZGVyOiAxcHggc29saWQgIzcyOThkMDsKKwliYWNrZ3JvdW5kOiM4NWFlZWMgdXJsKGltYWdlcy9zb3JpYU1lbnVCZy5naWYpIHJlcGVhdC14IGJvdHRvbSBsZWZ0ICFpbXBvcnRhbnQ7CisJcGFkZGluZzogMXB4OworCW1hcmdpbi10b3A6IDFweDsKKwltYXJnaW4tYm90dG9tOiAxcHg7Cit9CisKKy5kb2pvTWVudUl0ZW0yeworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJZm9udDogbWVudTsKKwltYXJnaW46IDA7Cit9CisKKy5kb2pvTWVudUl0ZW0ySG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNEMkU0RkQ7CisJY3Vyc29yOnBvaW50ZXI7CisJY3Vyc29yOmhhbmQ7Cit9CisKKy5kb2pvTWVudUl0ZW0ySWNvbiB7CisJcG9zaXRpb246IHJlbGF0aXZlOworCWJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7CisJYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKwl3aWR0aDogMTZweDsKKwloZWlnaHQ6IDE2cHg7CisJcGFkZGluZy1yaWdodDogM3B4OworfQorCisuZG9qb01lbnVJdGVtMkxhYmVsIHsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLyogbWFpbiBsYWJlbCB0ZXh0ICovCisuZG9qb01lbnVJdGVtMkxhYmVsIHsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLmRvam9NZW51SXRlbTJBY2NlbCB7CisJcG9zaXRpb246IHJlbGF0aXZlOworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisJcGFkZGluZy1sZWZ0OiAzcHg7Cit9CisKKy5kb2pvTWVudUl0ZW0yRGlzYWJsZWQgLmRvam9NZW51SXRlbTJMYWJlbCwKKy5kb2pvTWVudUl0ZW0yRGlzYWJsZWQgLmRvam9NZW51SXRlbTJBY2NlbCB7CisJY29sb3I6ICM2MDdhOWU7Cit9CisKKy5kb2pvTWVudUl0ZW0yU3VibWVudSB7CisJcG9zaXRpb246IHJlbGF0aXZlOworCWJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7CisJYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3N1Ym1lbnVfb2ZmLmdpZik7CisJd2lkdGg6IDVweDsKKwloZWlnaHQ6IDlweDsKKwlwYWRkaW5nLWxlZnQ6IDNweDsKK30KKy5kb2pvTWVudUl0ZW0ySG92ZXIgLmRvam9NZW51SXRlbTJTdWJtZW51IHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3N1Ym1lbnVfb24uZ2lmKTsKK30KKworLmRvam9NZW51SXRlbTJEaXNhYmxlZCAuZG9qb01lbnVJdGVtMlN1Ym1lbnUgeworCWJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvc3VibWVudV9kaXNhYmxlZC5naWYpOworfQorCisuZG9qb01lbnVTZXBhcmF0b3IyIHsKKwlmb250LXNpemU6IDFweDsKKwltYXJnaW46IDA7Cit9CisKKy5kb2pvTWVudVNlcGFyYXRvcjJUb3AgeworCWhlaWdodDogNTAlOworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjN2E5OGM0OworCW1hcmdpbjogMHB4IDJweDsKKwlmb250LXNpemU6IDFweDsKK30KKworLmRvam9NZW51U2VwYXJhdG9yMkJvdHRvbSB7CisJaGVpZ2h0OiA1MCU7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjOWRlZmY7CisJbWFyZ2luOiAwcHggMnB4OworCWZvbnQtc2l6ZTogMXB4OworfQorCisuZG9qb01lbnVCYXIyIHsKKwliYWNrZ3JvdW5kOiM4NWFlZWMgdXJsKGltYWdlcy9zb3JpYUJhckJnLmdpZikgcmVwZWF0LXggdG9wIGxlZnQ7CisJLypib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNmI5ZmVjOyovCisJcGFkZGluZzogMXB4OworfQorCisuZG9qb01lbnVCYXIyIC5kb2pvTWVudUl0ZW0yIHsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworCWZvbnQ6IG1lbnU7CisJbWFyZ2luOiAwOworCXBvc2l0aW9uOiByZWxhdGl2ZTsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworCXotaW5kZXg6IDE7CisJcGFkZGluZzogM3B4IDhweDsKKwlkaXNwbGF5OiBpbmxpbmU7LyogbmVlZGVkIGluIGtodG1sIHRvIGRpc3BsYXkgY29ycmVjdGx5ICovCisJZGlzcGxheTogLW1vei1pbmxpbmUtYm94Oy8qIG5lZWRlZCBpbiBmaXJlZm94ICovCisJY3Vyc29yOnBvaW50ZXI7CisJY3Vyc29yOmhhbmQ7Cit9CisKKy5kb2pvTWVudUJhcjIgLmRvam9NZW51SXRlbTJIb3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjojZDJlNGZkOworfQorCisuZG9qb01lbnVCYXIyIC5kb2pvTWVudUl0ZW0yRGlzYWJsZWQgc3BhbiB7CisJY29sb3I6ICM0ZjY1ODI7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Nb250aGx5Q2FsZW5kYXIuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTW9udGhseUNhbGVuZGFyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQ2OTAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTW9udGhseUNhbGVuZGFyLmNzcwpAQCAtMCwwICsxLDkxIEBACisuZGF0ZVBpY2tlckNvbnRhaW5lciB7CisJbWFyZ2luOjAuNWVtIDJlbSAwLjVlbSAwOworCS8qd2lkdGg6MTBlbTsqLworCWZsb2F0OmxlZnQ7Cit9CisKKy5wcmV2aW91c01vbnRoIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNiYmJiYmI7Cit9CisKKy5jdXJyZW50TW9udGggeworCWJhY2tncm91bmQtY29sb3I6IzhmOGY4ZjsKK30KKworLm5leHRNb250aCB7CisJYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOworfQorCisuY3VycmVudERhdGUgeworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisJZm9udC1zdHlsZTppdGFsaWM7Cit9CisKKy5zZWxlY3RlZEl0ZW0geworCWJhY2tncm91bmQtY29sb3I6IzNhM2EzYTsKKwljb2xvcjojZmZmZmZmOworfQorCisuY2FsZW5kYXJDb250YWluZXIgeworCWJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKKwlib3JkZXItc3BhY2luZzowOworCWJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNmU2ZTY7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKworLmNhbGVuZGFyQ29udGFpbmVyIHRoZWFkeworCWJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKKy5jYWxlbmRhckNvbnRhaW5lciB0Ym9keSAqIHRkIHsKKyAgICAgICAgaGVpZ2h0OiAxMDBweDsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKK30KKworLmNhbGVuZGFyQ29udGFpbmVyIHRkIHsKKyAgICAgICAgd2lkdGg6IDEwMHB4OworICAgICAgICBwYWRkaW5nOiAycHg7CisJdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworLm1vbnRoTGFiZWwgeworCWZvbnQtc2l6ZTowLjllbTsKKwlmb250LXdlaWdodDo0MDA7CisJbWFyZ2luOjA7CisJdGV4dC1hbGlnbjpjZW50ZXI7Cit9CisKKy5tb250aExhYmVsIC5tb250aCB7CisJcGFkZGluZzowIDAuNGVtIDAgMC40ZW07Cit9CisKKy55ZWFyTGFiZWwgeworCWZvbnQtc2l6ZTowLjllbTsKKwlmb250LXdlaWdodDo0MDA7CisJbWFyZ2luOjAuMjVlbSAwIDAgMDsKKwl0ZXh0LWFsaWduOnJpZ2h0OworCWNvbG9yOiNhM2EzYTM7Cit9CisKKy55ZWFyTGFiZWwgLnNlbGVjdGVkWWVhciB7CisJY29sb3I6IzAwMDsKKwlwYWRkaW5nOjAgMC4yZW07Cit9CisKKy5uZXh0WWVhciwgLnByZXZpb3VzWWVhciB7CisJY3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7Cit9CisKKy5pbmNyZW1lbnRDb250cm9sIHsKKwljdXJzb3I6cG9pbnRlcjtjdXJzb3I6aGFuZDsKKwl3aWR0aDoxZW07Cit9CisKKy5kb2pvTW9udGhseUNhbGVuZGFyRXZlbnQgeworCWZvbnQtc2l6ZTowLjdlbTsKKwlvdmVyZmxvdzogaGlkZGVuOworCWZvbnQtY29sb3I6IGdyZXk7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwl0ZXh0LWFsaWduOiBsZWZ0OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTW9udGhseUNhbGVuZGFyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Nb250aGx5Q2FsZW5kYXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I5ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvTW9udGhseUNhbGVuZGFyLmh0bWwKQEAgLTAsMCArMSwxMTAgQEAKKzxkaXYgY2xhc3M9ImRhdGVQaWNrZXJDb250YWluZXIiIGRvam9BdHRhY2hQb2ludD0iZGF0ZVBpY2tlckNvbnRhaW5lck5vZGUiPgorCTxoMyBjbGFzcz0ibW9udGhMYWJlbCI+CisJPCEtLQorCTxzcGFuIAorCQlkb2pvQXR0YWNoUG9pbnQ9ImRlY3JlYXNlV2Vla05vZGUiIAorCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uSW5jcmVtZW50V2VlazsiIAorCQljbGFzcz0iaW5jcmVtZW50Q29udHJvbCI+CisJCTxpbWcgc3JjPSIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2RlY3JlbWVudFdlZWsuZ2lmIiBhbHQ9IiZ1YXJyOyIgLz4KKwk8L3NwYW4+CisJLS0+CisJPHNwYW4gCisJCWRvam9BdHRhY2hQb2ludD0iZGVjcmVhc2VNb250aE5vZGUiIAorCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7IiBjbGFzcz0iaW5jcmVtZW50Q29udHJvbCI+CisJCTxpbWcgc3JjPSIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2RlY3JlbWVudE1vbnRoLmdpZiIgCisJCQlhbHQ9IiZ1YXJyOyIgZG9qb0F0dGFjaFBvaW50PSJkZWNyZW1lbnRNb250aEltYWdlTm9kZSI+CisJPC9zcGFuPgorCTxzcGFuIGRvam9BdHRhY2hQb2ludD0ibW9udGhMYWJlbE5vZGUiIGNsYXNzPSJtb250aCI+SnVseTwvc3Bhbj4KKwk8c3BhbiAKKwkJZG9qb0F0dGFjaFBvaW50PSJpbmNyZWFzZU1vbnRoTm9kZSIgCisJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25JbmNyZW1lbnRNb250aDsiIGNsYXNzPSJpbmNyZW1lbnRDb250cm9sIj4KKwkJPGltZyBzcmM9IiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW5jcmVtZW50TW9udGguZ2lmIiAKKwkJCWFsdD0iJmRhcnI7IiAgZG9qb0F0dGFjaFBvaW50PSJpbmNyZW1lbnRNb250aEltYWdlTm9kZSI+CisJPC9zcGFuPgorCTwhLS0KKwkJPHNwYW4gZG9qb0F0dGFjaFBvaW50PSJpbmNyZWFzZVdlZWtOb2RlIiAKKwkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25JbmNyZW1lbnRXZWVrOyIgCisJCQljbGFzcz0iaW5jcmVtZW50Q29udHJvbCI+CisJCQk8aW1nIHNyYz0iJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbmNyZW1lbnRXZWVrLmdpZiIgCisJCQlhbHQ9IiZkYXJyOyIgLz4KKwkJPC9zcGFuPgorCS0tPgorCTwvaDM+CisJPHRhYmxlIGNsYXNzPSJjYWxlbmRhckNvbnRhaW5lciI+CisJCTx0aGVhZD4KKwkJCTx0ciBkb2pvQXR0YWNoUG9pbnQ9ImRheUxhYmVsc1JvdyI+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQk8L3RyPgorCQk8L3RoZWFkPgorCQk8dGJvZHkgZG9qb0F0dGFjaFBvaW50PSJjYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZSIgCisJCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uU2V0RGF0ZTsiPgorCQkJPHRyIGRvam9BdHRhY2hQb2ludD0iY2FsZW5kYXJSb3cwIj4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHIgZG9qb0F0dGFjaFBvaW50PSJjYWxlbmRhclJvdzEiPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJPC90cj4KKwkJCTx0ciBkb2pvQXR0YWNoUG9pbnQ9ImNhbGVuZGFyUm93MiI+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQk8L3RyPgorCQkJPHRyIGRvam9BdHRhY2hQb2ludD0iY2FsZW5kYXJSb3czIj4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCQk8dGQ+PC90ZD4KKwkJCTwvdHI+CisJCQk8dHIgZG9qb0F0dGFjaFBvaW50PSJjYWxlbmRhclJvdzQiPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJCTx0ZD48L3RkPgorCQkJPC90cj4KKwkJCTx0ciBkb2pvQXR0YWNoUG9pbnQ9ImNhbGVuZGFyUm93NSI+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQkJPHRkPjwvdGQ+CisJCQk8L3RyPgorCQk8L3Rib2R5PgorCTwvdGFibGU+CisJPGgzIGNsYXNzPSJ5ZWFyTGFiZWwiPgorCQk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9InByZXZpb3VzWWVhckxhYmVsTm9kZSIKKwkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25JbmNyZW1lbnRZZWFyOyIgY2xhc3M9InByZXZpb3VzWWVhciI+PC9zcGFuPgorCQk8c3BhbiBjbGFzcz0ic2VsZWN0ZWRZZWFyIiBkb2pvQXR0YWNoUG9pbnQ9ImN1cnJlbnRZZWFyTGFiZWxOb2RlIj48L3NwYW4+CisJCTxzcGFuIGRvam9BdHRhY2hQb2ludD0ibmV4dFllYXJMYWJlbE5vZGUiIAorCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBvbkluY3JlbWVudFllYXI7IiBjbGFzcz0ibmV4dFllYXIiPjwvc3Bhbj4KKwk8L2gzPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Qb3BVcEJ1dHRvbi5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Qb3BVcEJ1dHRvbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjNTU4MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1BvcFVwQnV0dG9uLmNzcwpAQCAtMCwwICsxLDM1IEBACisuUG9wVXBCdXR0b24geworCXBhZGRpbmcgOiAycHggNnB4IDJweCA5cHg7CisJYm9yZGVyIDogMXB4IG91dHNldCAjY2NjOworCWJhY2tncm91bmQgOiAjZjRmNGY0OworCWNvbG9yIDogIzMzMzsKKwl0ZXh0LWRlY29yYXRpb24gOiBub25lOworfQorCisuUG9wVXBCdXR0b24gLmRvd25BcnJvdyB7CisJbWFyZ2luLWxlZnQ6IDAuNWVtOworCW1hcmdpbi1ib3R0b206IDJweDsKK30KKworLmRvd25BcnJvdy5kaXNhYmxlZCB7CisJYmFja2dyb3VuZC1pbWFnZSA6IHVybChpbWFnZXMvZHJvcGRvd25CdXR0b25zQXJyb3ctZGlzYWJsZWQuZ2lmKTsKKwljdXJzb3IgOiBkZWZhdWx0OworfQorCit1bC5kcm9wZG93bkJ1dHRvbnMgbGkgYTpob3ZlciwKK3VsLmRyb3Bkb3duQnV0dG9ucyBsaSBzcGFuLmRvd25BcnJvdzpob3ZlciB7CisJY29sb3IgOiBibGFjazsKKwliYWNrZ3JvdW5kLWNvbG9yIDogI2RkZDsKK30KKwordWwuZHJvcGRvd25CdXR0b25zIGxpIC5kb3duQXJyb3cucHJlc3NlZCwgdWwuZHJvcGRvd25CdXR0b25zIGxpIC5kb3duQXJyb3c6Zm9jdXMgeworCWJvcmRlci1zdHlsZSA6IGluc2V0OworCWJhY2tncm91bmQtcG9zaXRpb24gOiA1cHggMTBweDsKKwlwYWRkaW5nIDogMnB4IDRweDsKK30KKwordWwuZHJvcGRvd25CdXR0b25zIGxpIGEuZGlzYWJsZWQ6aG92ZXIsCit1bC5kcm9wZG93bkJ1dHRvbnMgbGkgc3Bhbi5kb3duQXJyb3cuZGlzYWJsZWQ6aG92ZXIgeworCWNvbG9yIDogIzk5OTsKKwliYWNrZ3JvdW5kLWNvbG9yIDogI2QyZTRmZDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Byb2dyZXNzQmFyLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Byb2dyZXNzQmFyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y1MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUHJvZ3Jlc3NCYXIuY3NzCkBAIC0wLDAgKzEsMjMgQEAKKy5iYWNrQmFyeworCWJvcmRlcjoxcHggc29saWQgIzg0YTNkMTsKK30KKy5mcm9udEJhcnsKKwliYWNrZ3JvdW5kOnVybCgiaW1hZ2VzL2Jhci5naWYiKSByZXBlYXQgYm90dG9tIGxlZnQ7CisJYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDsKK30KKy5oLWZyb250QmFyeworCWJhY2tncm91bmQ6dXJsKCJpbWFnZXMvaC1iYXIuZ2lmIikgcmVwZWF0IGJvdHRvbSBsZWZ0OworCWJhY2tncm91bmQtYXR0YWNobWVudDogZml4ZWQ7Cit9Cisuc2ltcGxlRnJvbnRCYXJ7CisJYmFja2dyb3VuZDogcmVkOworfQorLmZyb250UGVyY2VudCwuYmFja1BlcmNlbnR7CisJZm9udDpib2xkIDEzcHggaGVsdmV0aWNhOworfQorLmJhY2tQZXJjZW50eworCWNvbG9yOiMyOTNhNGI7Cit9CisuZnJvbnRQZXJjZW50eworCWNvbG9yOiNmZmY7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUHJvZ3Jlc3NCYXIuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Byb2dyZXNzQmFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzOGZhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Byb2dyZXNzQmFyLmh0bWwKQEAgLTAsMCArMSw1IEBACis8ZGl2IGRvam9BdHRhY2hQb2ludD0iY29udGFpbmVyTm9kZSIgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbiI+CisJPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpub25lO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXIiIGRvam9BdHRhY2hQb2ludD0iYmFja1BlcmNlbnRMYWJlbCIgY2xhc3M9ImRvam9CYWNrUGVyY2VudExhYmVsIj48L2Rpdj4KKwk8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJSIgZG9qb0F0dGFjaFBvaW50PSJpbnRlcm5hbFByb2dyZXNzIj4KKwk8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5Om5vbmU7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlciIgZG9qb0F0dGFjaFBvaW50PSJmcm9udFBlcmNlbnRMYWJlbCIgY2xhc3M9ImRvam9Gcm9udFBlcmNlbnRMYWJlbCI+PC9kaXY+PC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1JlbW90ZVRhYkNvbnRyb2wuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUmVtb3RlVGFiQ29udHJvbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmNTRlNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1JlbW90ZVRhYkNvbnRyb2wuY3NzCkBAIC0wLDAgKzEsNjEgQEAKKy5kb2pvUmVtb3RlVGFiQ29udHJvbGxlciB7CisJcG9zaXRpb246IHJlbGF0aXZlOworfQorCisuZG9qb1JlbW90ZVRhYiB7CisJcG9zaXRpb24gOiByZWxhdGl2ZTsKKwlmbG9hdCA6IGxlZnQ7CisJcGFkZGluZy1sZWZ0IDogOXB4OworCWJvcmRlci1ib3R0b20gOiAxcHggc29saWQgIzYyOTBkMjsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDsKKwljdXJzb3I6IHBvaW50ZXI7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwl6LWluZGV4OiAzOworfQorCisuZG9qb1JlbW90ZVRhYiBkaXYgeworCWRpc3BsYXkgOiBibG9jazsKKwlwYWRkaW5nIDogNHB4IDE1cHggNHB4IDZweDsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDsKKwljb2xvciA6ICMzMzM7CisJZm9udC1zaXplIDogOTAlOworfQorCisuZG9qb1JlbW90ZVRhYlBhbmVDbG9zZSB7CisJcG9zaXRpb24gOiBhYnNvbHV0ZTsKKwlib3R0b20gOiAwcHg7CisJcmlnaHQgOiA2cHg7CisJaGVpZ2h0IDogMTJweDsKKwl3aWR0aCA6IDEycHg7CisJYmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2Nsb3NlLmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDsKK30KKworLmRvam9SZW1vdGVUYWJQYW5lQ2xvc2VIb3ZlciB7CisJYmFja2dyb3VuZC1pbWFnZSA6IHVybChpbWFnZXMvdGFiX2Nsb3NlX2guZ2lmKTsKK30KKworLmRvam9SZW1vdGVUYWJDbG9zZSB7CisJZGlzcGxheSA6IGlubGluZS1ibG9jazsKKwloZWlnaHQgOiAxMnB4OworCXdpZHRoIDogMTJweDsKKwlwYWRkaW5nIDogMCAxMnB4IDAgMDsKKwltYXJnaW4gOiAwIC0xMHB4IDAgMTBweDsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfY2xvc2UuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wOworCWN1cnNvciA6IGRlZmF1bHQ7Cit9CisKKy5kb2pvUmVtb3RlVGFiQ2xvc2VIb3ZlciB7CisJYmFja2dyb3VuZC1pbWFnZSA6IHVybChpbWFnZXMvdGFiX2Nsb3NlX2guZ2lmKTsKK30KKworLmRvam9SZW1vdGVUYWIuY3VycmVudCB7CisJcGFkZGluZy1ib3R0b20gOiAxcHg7CisJYm9yZGVyLWJvdHRvbSA6IDA7CisJYmFja2dyb3VuZC1wb3NpdGlvbiA6IDAgLTE1MHB4OworfQorCisuZG9qb1JlbW90ZVRhYi5jdXJyZW50IGRpdiB7CisJcGFkZGluZy1ib3R0b20gOiA1cHg7CisJbWFyZ2luLWJvdHRvbSA6IC0xcHg7CisJYmFja2dyb3VuZC1wb3NpdGlvbiA6IDEwMCUgLTE1MHB4OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUmVzaXphYmxlVGV4dGFyZWEuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUmVzaXphYmxlVGV4dGFyZWEuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMGNmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9SZXNpemFibGVUZXh0YXJlYS5jc3MKQEAgLTAsMCArMSwxNSBAQAorZGl2LnN0YXR1c0JhciB7CisJYmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTsKKwloZWlnaHQ6IDI4cHg7CisJcGFkZGluZzogMXB4OworCW92ZXJmbG93OiBoaWRkZW47CisJZm9udC1zaXplOiAxMnB4OworfQorCitkaXYuc3RhdHVzUGFuZWwgeworCWJhY2tncm91bmQtY29sb3I6IFRocmVlREZhY2U7CisJYm9yZGVyOiAxcHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0IFRocmVlREhpZ2hsaWdodCBUaHJlZURTaGFkb3c7CisJbWFyZ2luOiAxcHg7CisJcGFkZGluZzogMnB4IDZweDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Jlc2l6YWJsZVRleHRhcmVhLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9SZXNpemFibGVUZXh0YXJlYS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODI3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9SZXNpemFibGVUZXh0YXJlYS5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxkaXY+CisJPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgYmxhY2s7IHdpZHRoOiA5MCU7IGhlaWdodDogMjAwcHg7IgorCQlkb2pvQXR0YWNoUG9pbnQ9InJvb3RMYXlvdXROb2RlIj4KKwkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InRleHRBcmVhQ29udGFpbmVyTm9kZSIgCisJCQlzdHlsZT0iYm9yZGVyOiAwcHg7IG1hcmdpbjogMHB4OyBvdmVyZmxvdzogaGlkZGVuOyI+CisJCTwvZGl2PgorCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0ic3RhdHVzQmFyQ29udGFpbmVyTm9kZSIgY2xhc3M9InN0YXR1c0JhciI+CisJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0ic3RhdHVzTGFiZWxOb2RlIiAKKwkJCQljbGFzcz0ic3RhdHVzUGFuZWwiCisJCQkJc3R5bGU9InBhZGRpbmctcmlnaHQ6IDBweDsgei1pbmRleDogMTsiPmRyYWcgdG8gcmVzaXplPC9kaXY+CisJCQk8ZGl2IGRvam9BdHRhY2hQb2ludD0icmVzaXplSGFuZGxlTm9kZSI+PC9kaXY+CisJCTwvZGl2PgorCTwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9SZXNpemVIYW5kbGUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUmVzaXplSGFuZGxlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFhODZhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvUmVzaXplSGFuZGxlLmNzcwpAQCAtMCwwICsxLDEyIEBACisuZG9qb0h0bWxSZXNpemVIYW5kbGUgeworCWZsb2F0OiByaWdodDsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJcmlnaHQ6IDJweDsKKwlib3R0b206IDJweDsKKwl3aWR0aDogMTNweDsKKwloZWlnaHQ6IDEzcHg7CisJei1pbmRleDogMjA7CisJY3Vyc29yOiBudy1yZXNpemU7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGdyYWJDb3JuZXIuZ2lmKTsKKwlsaW5lLWhlaWdodDogMHB4OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Nob3cuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2hvdy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1MWNkZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Nob3cuY3NzCkBAIC0wLDAgKzEsNTkgQEAKK0BtZWRpYSBzY3JlZW4geworCWh0bWwsIGJvZHkgeworCQltYXJnaW46IDBweDsKKwkJcGFkZGluZzogMHB4OworCQl3aWR0aDogMTAwJTsKKwl9CisJaDEgeworCQlmb250LXNpemU6IDUwcHg7CisJfQorCXAsIGxpIHsKKwkJZm9udC1zaXplOiAzMHB4OworCX0KKwkuZG9qb1Nob3dOYXYgeworCQliYWNrZ3JvdW5kOiAjMzY5OworCQlvdmVyZmxvdzogaGlkZGVuOworCQlwb3NpdGlvbjogYWJzb2x1dGU7CisJCWhlaWdodDogNXB4OworCQlib3R0b206IDBweDsKKwkJbGVmdDogMHB4OworCQl3aWR0aDogMTAwJTsKKwkJdGV4dC1hbGlnbjogY2VudGVyOworCX0KKwkuZG9qb1Nob3dOYXYgaW5wdXQgeworCQltYXJnaW46IDBweDsKKwl9CisJLmRvam9TaG93SGlkZXIgeworCQloZWlnaHQ6IDVweDsKKwkJb3ZlcmZsb3c6IGhpZGRlbjsKKwkJd2lkdGg6IDEwMCU7CisJfQorCS5kb2pvU2hvd1ByaW50IHsKKwkJcG9zaXRpb246IGFic29sdXRlOworCQlsZWZ0OiA1cHg7CisJCXRvcDogMHB4OworCX0KKwkuZG9qb1Nob3cgeworCQlkaXNwbGF5OiBub25lOworCX0KK30KK0BtZWRpYSBwcmludCB7CisJLmRvam9TaG93IHsKKwkJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OworCX0KKwkuZG9qb1Nob3dQcmludCB7CisJCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CisJfQorCS5kb2pvU2hvd1ByaW50U2xpZGUgeworCQlib3JkZXI6IDFweCBzb2xpZCAjYWFhOworCQlwYWRkaW5nOiAxMHB4OworCQltYXJnaW4tYm90dG9tOiAxNXB4OworCX0KKwkuZG9qb1Nob3dQcmludFNsaWRlLCB1bCB7CisJcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOworCX0KKwloMSB7CisJCW1hcmdpbi10b3A6IDA7CisJCXBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TaG93Lmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TaG93Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4N2NkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Nob3cuaHRtbApAQCAtMCwwICsxLDExIEBACis8ZGl2IGNsYXNzPSJkb2pvU2hvdyI+CisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImNvbnRlbnROb2RlIj48L2Rpdj4KKwk8ZGl2IGNsYXNzPSJkb2pvU2hvd05hdiIgZG9qb0F0dGFjaFBvaW50PSJuYXYiPgorCQk8ZGl2IGNsYXNzPSJkb2pvU2hvd0hpZGVyIiBkb2pvQXR0YWNoUG9pbnQ9ImhpZGVyIj48L2Rpdj4KKwkJPHNwYW4gdW5zZWxlY3RhYmxlPSJvbiIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGRvam9BdHRhY2hFdmVudD0ib25DbGljazpwcmV2aW91c1NsaWRlIj4mbHQ7PC9zcGFuPgorCQk8c2VsZWN0IGRvam9BdHRhY2hFdmVudD0ib25DbGljazpnb3RvU2xpZGVCeUV2ZW50IiBkb2pvQXR0YWNoUG9pbnQ9InNlbGVjdCI+CisJCQk8b3B0aW9uIGRvam9BdHRhY2hQb2ludD0ib3B0aW9uIj5UaXRsZTwvb3B0aW9uPgorCQk8L3NlbGVjdD4KKwkJPHNwYW4gdW5zZWxlY3RhYmxlPSJvbiIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGRvam9BdHRhY2hFdmVudD0ib25DbGljazpuZXh0U2xpZGUiPiZndDs8L3NwYW4+CisJPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Nob3dTbGlkZS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TaG93U2xpZGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTVjODIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TaG93U2xpZGUuY3NzCkBAIC0wLDAgKzEsMTIgQEAKKy5kb2pvU2hvd1NsaWRlVGl0bGUgeworCWhlaWdodDogMTAwcHg7CisJYmFja2dyb3VuZDogIzM2OTsKK30KKy5kb2pvU2hvd1NsaWRlVGl0bGUgaDEgeworCW1hcmdpbi10b3A6IDA7CisJbGluZS1oZWlnaHQ6IDEwMHB4OworCW1hcmdpbi1sZWZ0OiAzMHB4OworfQorLmRvam9TaG93U2xpZGVCb2R5IHsKKwltYXJnaW46IDE1cHg7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2hvd1NsaWRlLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TaG93U2xpZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ5NTg2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2hvd1NsaWRlLmh0bWwKQEAgLTAsMCArMSw2IEBACis8ZGl2IGNsYXNzPSJkb2pvU2hvd1NsaWRlIj4KKwk8ZGl2IGNsYXNzPSJkb2pvU2hvd1NsaWRlVGl0bGUiPgorCQk8aDEgZG9qb0F0dGFjaFBvaW50PSJodG1sVGl0bGUiPlRpdGxlPC9oMT4KKwk8L2Rpdj4KKwk8ZGl2IGNsYXNzPSJkb2pvU2hvd1NsaWRlQm9keSIgZG9qb0F0dGFjaFBvaW50PSJjb250YWluZXJOb2RlIj48L2Rpdj4KKzwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NsaWRlU2hvdy5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZVNob3cuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTk3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZVNob3cuY3NzCkBAIC0wLDAgKzEsOSBAQAorLnNsaWRlU2hvd0ltZyB7CisJcG9zaXRpb246IGFic29sdXRlOworCWxlZnQ6IDBweDsKKwl0b3A6IDBweDsgCisJYm9yZGVyOiAycHggc29saWQgIzRkNGQ0ZDsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NsaWRlU2hvdy5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVTaG93Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NTIxNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NsaWRlU2hvdy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxkaXYgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogM3B4OyI+CisJCTxkaXY+CisJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0icGF1c2UiIAorCQkJCWRvam9BdHRhY2hQb2ludD0ic3RhcnRTdG9wQnV0dG9uIgorCQkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogdG9nZ2xlUGF1c2VkOyI+CisJCTwvZGl2PgorCQk8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAke3RoaXMud2lkdGh9OyBoZWlnaHQ6ICR7dGhpcy5oZWlnaHR9OyIKKwkJCWRvam9BdHRhY2hQb2ludD0iaW1hZ2VzQ29udGFpbmVyIgorCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiB0b2dnbGVQYXVzZWQ7Ij4KKwkJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJpbWcxIiBjbGFzcz0ic2xpZGVTaG93SW1nIiAKKwkJCQlzdHlsZT0iei1pbmRleDogMTsgd2lkdGg6ICR7dGhpcy53aWR0aH07IGhlaWdodDogJHt0aGlzLmhlaWdodH07IiAgLz4KKwkJCTxpbWcgZG9qb0F0dGFjaFBvaW50PSJpbWcyIiBjbGFzcz0ic2xpZGVTaG93SW1nIiAKKwkJCQlzdHlsZT0iei1pbmRleDogMDsgd2lkdGg6ICR7dGhpcy53aWR0aH07IGhlaWdodDogJHt0aGlzLmhlaWdodH07IiAvPgorCQk8L2Rpdj4JCis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZXIuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA3YWFjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVyLmNzcwpAQCAtMCwwICsxLDYxIEBACisuc2xpZGVyTWFpbiB7CisgIGJvcmRlcjogMHB4ICFpbXBvcnRhbnQ7CisgIGJvcmRlci1zcGFjaW5nOiAwcHggIWltcG9ydGFudDsKKyAgbGluZS1oZWlnaHQ6IDBweCAhaW1wb3J0YW50OworICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDsKKyAgZGlzcGxheTogLW1vei1pbmxpbmUtdGFibGUgIWltcG9ydGFudDsKKyAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7CisgIC1tb3otdXNlci1mb2N1czogbm9ybWFsICFpbXBvcnRhbnQ7Cit9CisKKy5zbGlkZXJDb21wb25lbnQgeworICBib3JkZXI6IDBweDsKKyAgcGFkZGluZzogMHB4OworICBtYXJnaW46IDBweDsKK30KKworLnNsaWRlckhhbmRsZSB7IAorICB0b3A6IDBweDsKKyAgbGVmdDogMHB4OworICB6LWluZGV4OiAxMDAwOworICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKK30KKworLnNsaWRlck91dHNldEJ1dHRvbiB7IAorICBib3JkZXItc3R5bGU6IG91dHNldDsKKyAgYm9yZGVyLXdpZHRoOiAwcHggMXB4IDFweCAwcHg7CisgIGJvcmRlci1jb2xvcjogYmxhY2s7Cit9CisKKy5zbGlkZXJJbnNldEJ1dHRvbiB7IAorICBib3JkZXItc3R5bGU6IGluc2V0OworICBib3JkZXItd2lkdGg6IDFweCAwcHggMHB4IDFweDsKKyAgYm9yZGVyLWNvbG9yOiBibGFjazsKK30KKworLnNsaWRlckJ1dHRvblkgeworICBtYXJnaW46IDBweDsKKyAgcGFkZGluZzogMHB4OworICB6LWluZGV4OiA5MDA7Cit9CisKKy5zbGlkZXJCdXR0b25YIHsKKyAgbWFyZ2luOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKKyAgei1pbmRleDogOTAwOworfQorCisuc2xpZGVyQmFja2dyb3VuZCB7IAorICB6LWluZGV4OiAwOworICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OworICBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsKK30KKworLnNsaWRlclByb2dyZXNzQmFja2dyb3VuZCB7IAorICB6LWluZGV4OiA4MDA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICBjbGlwOiByZWN0KDBweCwwcHgsMHB4LDBweCk7Cit9CisKKy5zbGlkZXJCYWNrZ3JvdW5kU2l6ZU9ubHkgeyAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZXIuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NsaWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODIzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZXIuaHRtbApAQCAtMCwwICsxLDU2IEBACis8dGFibGUgXz0id2VpcmQgZW5kIHRhZyBmb3JtYXR0aW5nIGlzIHRvIHByZXZlbnQgd2hpdGVzcGFjZSBmcm9tIGJlY29taW5nICZuYnNwOyIgCisJY2xhc3M9InNsaWRlck1haW4iIAorCWRvam9BdHRhY2hQb2ludD0iZm9jdXNOb2RlIiAKKwlkb2pvQXR0YWNoRXZlbnQ9Im9ubW91c2Vkb3duOl9zZXRGb2N1czsgb25rZXk6X2hhbmRsZUtleUV2ZW50czsgb25rZXl1cDpfYnV0dG9uUmVsZWFzZWQ7IG9ubW91c2V1cDpfYnV0dG9uUmVsZWFzZWQ7IG9ubW91c2V3aGVlbDpfbW91c2VXaGVlbGVkOyIKKwl0YWJpbmRleD0iMCIgY29scz0zIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdHlsZT0iIj4KKwk8dHIgdmFsaWduPW1pZGRsZSBhbGlnbj1jZW50ZXI+CisJCTx0ZCBjbGFzcz0ic2xpZGVyQ29tcG9uZW50IiBjb2xzcGFuPTMgZG9qb0F0dGFjaFBvaW50PXRvcEJvcmRlck5vZGUgc3R5bGU9IiIKKwkJCT48aW1nIGNsYXNzPSJzbGlkZXJPdXRzZXRCdXR0b24gc2xpZGVyQnV0dG9uWSIKKwkJCQlkb2pvQXR0YWNoUG9pbnQ9dG9wQnV0dG9uTm9kZSAKKwkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9ubW91c2Vkb3duOl90b3BCdXR0b25QcmVzc2VkOyBvbm1vdXNlbW92ZTpfZGlzY2FyZEV2ZW50OyBvbmRibGNsaWNrOl90b3BCdXR0b25Eb3VibGVDbGlja2VkOyIKKwkJCQlzcmM9IiR7dGhpcy50b3BCdXR0b25TcmN9IiAKKwkJCQlzdHlsZT0iJHt0aGlzLmJ1dHRvblN0eWxlWX0iCisJCT48L3RkPgorCTwvdHI+CisJPHRyIHZhbGlnbj1taWRkbGUgYWxpZ249Y2VudGVyPgorCQk8dGQgY2xhc3M9InNsaWRlckNvbXBvbmVudCIgZG9qb0F0dGFjaFBvaW50PWxlZnRCb3JkZXJOb2RlIHN0eWxlPSIiCisJCQk+PGltZyBjbGFzcz0ic2xpZGVyT3V0c2V0QnV0dG9uIHNsaWRlckJ1dHRvblgiCisJCQkJZG9qb0F0dGFjaFBvaW50PWxlZnRCdXR0b25Ob2RlCisJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbm1vdXNlZG93bjpfbGVmdEJ1dHRvblByZXNzZWQ7IG9ubW91c2Vtb3ZlOl9kaXNjYXJkRXZlbnQ7IG9uZGJsY2xpY2s6X2xlZnRCdXR0b25Eb3VibGVDbGlja2VkOyIKKwkJCQlzcmM9IiR7dGhpcy5sZWZ0QnV0dG9uU3JjfSIgCisJCQkJc3R5bGU9IiR7dGhpcy5idXR0b25TdHlsZVh9IgorCQk+PC90ZD4KKwkJPHRkIGRvam9BdHRhY2hQb2ludD1jb25zdHJhaW5pbmdDb250YWluZXJOb2RlIAorCQkJY2xhc3M9InNsaWRlckNvbXBvbmVudCBzbGlkZXJCYWNrZ3JvdW5kIgorCQkJc3R5bGU9IiR7dGhpcy5iYWNrZ3JvdW5kU3R5bGV9IgorCQkJPjxpbWcgc3JjPSIke3RoaXMuaGFuZGxlU3JjfSIgCisJCQkJY2xhc3M9c2xpZGVySGFuZGxlCisJCQkJZG9qb0F0dGFjaFBvaW50PXNsaWRlckhhbmRsZU5vZGUKKwkJCQlzdHlsZT0iJHt0aGlzLmhhbmRsZVN0eWxlfSIKKwkJCT48aW1nIHNyYz0iJHt0aGlzLnByb2dyZXNzQmFja2dyb3VuZFNyY30iCisJCQkJY2xhc3M9InNsaWRlckJhY2tncm91bmRTaXplT25seSBzbGlkZXJQcm9ncmVzc0JhY2tncm91bmQiCisJCQkJZG9qb0F0dGFjaFBvaW50PXByb2dyZXNzQmFja2dyb3VuZE5vZGUKKwkJCQlzdHlsZT0iJHt0aGlzLmJhY2tncm91bmRTaXplfSIKKwkJCT48aW1nIHNyYz0iJHt0aGlzLmJhY2tncm91bmRTcmN9IiAKKwkJCQljbGFzcz1zbGlkZXJCYWNrZ3JvdW5kU2l6ZU9ubHkKKwkJCQlkb2pvQXR0YWNoUG9pbnQ9c2xpZGVyQmFja2dyb3VuZE5vZGUKKwkJCQlzdHlsZT0iJHt0aGlzLmJhY2tncm91bmRTaXplfSIKKwkJPjwvdGQ+CisJCTx0ZCBjbGFzcz0ic2xpZGVyQ29tcG9uZW50IiBkb2pvQXR0YWNoUG9pbnQ9cmlnaHRCb3JkZXJOb2RlIHN0eWxlPSIiCisJCQk+PGltZyBjbGFzcz0ic2xpZGVyT3V0c2V0QnV0dG9uIHNsaWRlckJ1dHRvblgiCisJCQkJZG9qb0F0dGFjaFBvaW50PXJpZ2h0QnV0dG9uTm9kZQorCQkJCWRvam9BdHRhY2hFdmVudD0ib25tb3VzZWRvd246X3JpZ2h0QnV0dG9uUHJlc3NlZDsgb25tb3VzZW1vdmU6X2Rpc2NhcmRFdmVudDsgb25kYmxjbGljazpfcmlnaHRCdXR0b25Eb3VibGVDbGlja2VkOyIKKwkJCQlzcmM9IiR7dGhpcy5yaWdodEJ1dHRvblNyY30iIAorCQkJCXN0eWxlPSIke3RoaXMuYnV0dG9uU3R5bGVYfSIKKwkJPjwvdGQ+CisJPC90cj4KKwk8dHIgdmFsaWduPW1pZGRsZSBhbGlnbj1jZW50ZXI+CisJCTx0ZCBjbGFzcz0ic2xpZGVyQ29tcG9uZW50IiBjb2xzcGFuPTMgZG9qb0F0dGFjaFBvaW50PWJvdHRvbUJvcmRlck5vZGUgc3R5bGU9IiIKKwkJCT48aW1nIGNsYXNzPSJzbGlkZXJPdXRzZXRCdXR0b24gc2xpZGVyQnV0dG9uWSIKKwkJCQlkb2pvQXR0YWNoUG9pbnQ9Ym90dG9tQnV0dG9uTm9kZSAKKwkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9ubW91c2Vkb3duOl9ib3R0b21CdXR0b25QcmVzc2VkOyBvbm1vdXNlbW92ZTpfZGlzY2FyZEV2ZW50OyBvbmRibGNsaWNrOl9ib3R0b21CdXR0b25Eb3VibGVDbGlja2VkOyIKKwkJCQlzcmM9IiR7dGhpcy5ib3R0b21CdXR0b25TcmN9IiAKKwkJCQlzdHlsZT0iJHt0aGlzLmJ1dHRvblN0eWxlWX0iCisJCT48L3RkPgorCTwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVySG9yaXpvbnRhbC5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVySG9yaXpvbnRhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmRhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZXJIb3Jpem9udGFsLmh0bWwKQEAgLTAsMCArMSwzIEBACis8ZGl2IGNsYXNzPSJzbGlkZXJNYWluSG9yaXpvbnRhbCI+CisgICAgPGRpdiBjbGFzcz0ic2xpZGVySGFuZGxlSG9yaXpvbnRhbCIgZG9qb0F0dGFjaFBvaW50PSJzbGlkZXJIYW5kbGUiPjwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TbGlkZXJWZXJ0aWNhbC5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVyVmVydGljYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc3ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU2xpZGVyVmVydGljYWwuaHRtbApAQCAtMCwwICsxLDMgQEAKKzxkaXYgY2xhc3M9InNsaWRlck1haW5WZXJ0aWNhbCI+CisgICAgPGRpdiBjbGFzcz0ic2xpZGVySGFuZGxlVmVydGljYWwiIGRvam9BdHRhY2hQb2ludD0ic2xpZGVySGFuZGxlIj48L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU3Bpbm5lci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TcGlubmVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzIyMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU3Bpbm5lci5jc3MKQEAgLTAsMCArMSwzNCBAQAorLyogaW5saW5lIHRoZSB0YWJsZSBob2xkaW5nIHRoZSA8aW5wdXQ+IGFuZCBidXR0b25zIChtZXRob2QgdmFyaWVzIGJ5IGJyb3dzZXIpICovCisuaWUgLmRvam9TcGlubmVyLCAuc2FmYXJpIC5kb2pvU3Bpbm5lciB7CisJZGlzcGxheTogaW5saW5lOworfQorCisubW96IC5kb2pvU3Bpbm5lciB7CisJZGlzcGxheTogLW1vei1pbmxpbmUtYm94OworfQorCisub3BlcmEgLmRvam9TcGlubmVyIHsKKwlkaXNwbGF5OiBpbmxpbmUtdGFibGU7Cit9CisKKy8qIGdlbmVyaWMgc3R1ZmYgZm9yIHRoZSB0YWJsZSAqLworLmRvam9TcGlubmVyIHRkIHsKKwlwYWRkaW5nOjBweDsKKwltYXJnaW46MHB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9Cit0YWJsZS5kb2pvU3Bpbm5lciB7CisJYm9yZGVyOjBweDsKKwlib3JkZXItc3BhY2luZzowcHg7CisJbGluZS1oZWlnaHQ6MHB4OworCXBhZGRpbmc6MHB4OworCW1hcmdpbjogMHB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy8qIHRoZSBidXR0b25zICovCisuZG9qb1NwaW5uZXIgaW1nIHsKKwlkaXNwbGF5OiBibG9jazsKKwlib3JkZXItd2lkdGg6MHB4IDFweCAxcHggMHB4OworCWJvcmRlci1zdHlsZTpvdXRzZXQ7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TcGlubmVyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9TcGlubmVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMmU3MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NwaW5uZXIuaHRtbApAQCAtMCwwICsxLDI1IEBACis8c3BhbiBfPSJ3ZWlyZCBlbmQgdGFnIGZvcm1hdHRpbmcgaXMgdG8gcHJldmVudCB3aGl0ZXNwYWNlIGZyb20gYmVjb21pbmcgJm5ic3A7IgorCXN0eWxlPSdmbG9hdDoke3RoaXMuaHRtbGZsb2F0fTsnCisJPjx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9ImRvam9TcGlubmVyIj4KKwkJPHRyPgorCQkJPHRkCisJCQkJPjxpbnB1dAorCQkJCQlkb2pvQXR0YWNoUG9pbnQ9J3RleHRib3gnIHR5cGU9JyR7dGhpcy50eXBlfScKKwkJCQkJZG9qb0F0dGFjaEV2ZW50PSdvbmJsdXI7b25mb2N1cztvbmtleTpfaGFuZGxlS2V5RXZlbnRzO29uS2V5VXA6X29uU3Bpbm5lcktleVVwO29ucmVzaXplOl9yZXNpemUnCisJCQkJCWlkPScke3RoaXMud2lkZ2V0SWR9JyBuYW1lPScke3RoaXMubmFtZX0nIHNpemU9JyR7dGhpcy5zaXplfScgbWF4bGVuZ3RoPScke3RoaXMubWF4bGVuZ3RofScKKwkJCQkJdmFsdWU9JyR7dGhpcy52YWx1ZX0nIGNsYXNzPScke3RoaXMuY2xhc3NOYW1lfScgYXV0b2NvbXBsZXRlPSJvZmYiCisJCQk+PC90ZD4KKwkJCTx0ZAorCQkJCT48aW1nIGRvam9BdHRhY2hQb2ludD0idXBBcnJvd05vZGUiCisJCQkJCWRvam9BdHRhY2hFdmVudD0ib25EYmxDbGljazogX3VwQXJyb3dEb3VibGVDbGlja2VkOyAgb25Nb3VzZURvd246IF91cEFycm93UHJlc3NlZDsgb25Nb3VzZVVwOiBfYXJyb3dSZWxlYXNlZDsgb25Nb3VzZU91dDogX2Fycm93UmVsZWFzZWQ7IG9uTW91c2VNb3ZlOiBfZGlzY2FyZEV2ZW50OyIKKwkJCQkJc3JjPSIke3RoaXMuaW5jcmVtZW50U3JjfSIgc3R5bGU9IndpZHRoOiAke3RoaXMuYnV0dG9uU2l6ZS53aWR0aH1weDsgaGVpZ2h0OiAke3RoaXMuYnV0dG9uU2l6ZS5oZWlnaHR9cHg7IgorCQkJCT48aW1nIGRvam9BdHRhY2hQb2ludD0iZG93bkFycm93Tm9kZSIKKwkJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkRibENsaWNrOiBfZG93bkFycm93RG91YmxlQ2xpY2tlZDsgIG9uTW91c2VEb3duOiBfZG93bkFycm93UHJlc3NlZDsgb25Nb3VzZVVwOiBfYXJyb3dSZWxlYXNlZDsgb25Nb3VzZU91dDogX2Fycm93UmVsZWFzZWQ7IG9uTW91c2VNb3ZlOiBfZGlzY2FyZEV2ZW50OyIKKwkJCQkJc3JjPSIke3RoaXMuZGVjcmVtZW50U3JjfSIgc3R5bGU9IndpZHRoOiAke3RoaXMuYnV0dG9uU2l6ZS53aWR0aH1weDsgaGVpZ2h0OiAke3RoaXMuYnV0dG9uU2l6ZS5oZWlnaHR9cHg7IgorCQkJPjwvdGQ+CisJCTwvdHI+CisJPC90YWJsZQorCT48c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J2ludmFsaWRTcGFuJyBjbGFzcz0nJHt0aGlzLmludmFsaWRDbGFzc30nPiR7dGhpcy5tZXNzYWdlcy5pbnZhbGlkTWVzc2FnZX08L3NwYW4KKwk+PHNwYW4gZG9qb0F0dGFjaFBvaW50PSdtaXNzaW5nU3BhbicgY2xhc3M9JyR7dGhpcy5taXNzaW5nQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMubWlzc2luZ01lc3NhZ2V9PC9zcGFuCisJPjxzcGFuIGRvam9BdHRhY2hQb2ludD0ncmFuZ2VTcGFuJyBjbGFzcz0nJHt0aGlzLnJhbmdlQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMucmFuZ2VNZXNzYWdlfTwvc3BhbgorPjwvc3Bhbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NwbGl0Q29udGFpbmVyLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1NwbGl0Q29udGFpbmVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgxNGMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvU3BsaXRDb250YWluZXIuY3NzCkBAIC0wLDAgKzEsNDAgQEAKKy5kb2pvU3BsaXRDb250YWluZXJ7CisJcG9zaXRpb246IHJlbGF0aXZlOworCW92ZXJmbG93OiBoaWRkZW47CisJZGlzcGxheTogYmxvY2s7Cit9CisKKy5kb2pvU3BsaXRQYW5leworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKK30KKworLmRvam9TcGxpdENvbnRhaW5lclNpemVySCwKKy5kb2pvU3BsaXRDb250YWluZXJTaXplclYgeworCWZvbnQtc2l6ZTogMXB4OworCWN1cnNvcjogbW92ZTsKKwljdXJzb3I6IHctcmVzaXplOworCWJhY2tncm91bmQtY29sb3I6IFRocmVlREZhY2U7CisJYm9yZGVyOiAxcHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7CisJbWFyZ2luOiAwOworfQorCisuZG9qb1NwbGl0Q29udGFpbmVyU2l6ZXJWIHsKKwljdXJzb3I6IG4tcmVzaXplOworfQorCisuZG9qb1NwbGl0Q29udGFpbmVyVmlydHVhbFNpemVySCwKKy5kb2pvU3BsaXRDb250YWluZXJWaXJ0dWFsU2l6ZXJWIHsKKwlmb250LXNpemU6IDFweDsKKwljdXJzb3I6IG1vdmU7CisJY3Vyc29yOiB3LXJlc2l6ZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURTaGFkb3c7CisJLW1vei1vcGFjaXR5OiAwLjU7CisJb3BhY2l0eTogMC41OworCWZpbHRlcjogQWxwaGEoT3BhY2l0eT01MCk7CisJbWFyZ2luOiAwOworfQorCisuZG9qb1NwbGl0Q29udGFpbmVyVmlydHVhbFNpemVyViB7CisJY3Vyc29yOiBuLXJlc2l6ZTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RhYkNvbnRhaW5lci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYWJDb250YWluZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2YwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYWJDb250YWluZXIuY3NzCkBAIC0wLDAgKzEsMTYzIEBACisuZG9qb1RhYkNvbnRhaW5lciB7CisJcG9zaXRpb24gOiByZWxhdGl2ZTsKK30KKworLmRvam9UYWJQYW5lV3JhcHBlciB7CisJYm9yZGVyIDogMXB4IHNvbGlkICM2MjkwZDI7CisJX3pvb206IDE7IC8qIGZvcmNlIElFNiBsYXlvdXQgbW9kZSBzbyB0b3AgYm9yZGVyIGRvZXNudCBkaXNhcHBlYXIgKi8KKwlkaXNwbGF5OiBibG9jazsKKwljbGVhcjogYm90aDsKKwlvdmVyZmxvdzogaGlkZGVuOworfQorCisuZG9qb1RhYkxhYmVscy10b3AgeworCXBvc2l0aW9uIDogcmVsYXRpdmU7CisJdG9wIDogMHB4OworCWxlZnQgOiAwcHg7CisJb3ZlcmZsb3cgOiB2aXNpYmxlOworCW1hcmdpbi1ib3R0b20gOiAtMXB4OworCXdpZHRoIDogMTAwJTsKKwl6LWluZGV4OiAyOwkvKiBzbyB0aGUgYm90dG9tIG9mIHRoZSB0YWIgbGFiZWwgd2lsbCBjb3ZlciB1cCB0aGUgYm9yZGVyIG9mIGRvam9UYWJQYW5lV3JhcHBlciAqLworfQorCisuZG9qb1RhYk5vTGF5b3V0LmRvam9UYWJMYWJlbHMtdG9wIC5kb2pvVGFiIHsKKwltYXJnaW4tYm90dG9tOiAtMXB4OworCV9tYXJnaW4tYm90dG9tOiAwcHg7IC8qIElFIGZpbHRlciBzbyB0b3AgYm9yZGVyIGxpbmVzIHVwIGNvcnJlY3RseSAqLworfQorCisuZG9qb1RhYiB7CisJcG9zaXRpb24gOiByZWxhdGl2ZTsKKwlmbG9hdCA6IGxlZnQ7CisJcGFkZGluZy1sZWZ0IDogOXB4OworCWJvcmRlci1ib3R0b20gOiAxcHggc29saWQgIzYyOTBkMjsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDsKKwljdXJzb3I6IHBvaW50ZXI7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwl6LWluZGV4OiAzOworfQorCisuZG9qb1RhYiBkaXYgeworCWRpc3BsYXkgOiBibG9jazsKKwlwYWRkaW5nIDogNHB4IDE1cHggNHB4IDZweDsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDsKKwljb2xvciA6ICMzMzM7CisJZm9udC1zaXplIDogOTAlOworfQorCisuZG9qb1RhYiAuY2xvc2UgeworCWRpc3BsYXkgOiBpbmxpbmUtYmxvY2s7CisJaGVpZ2h0IDogMTJweDsKKwl3aWR0aCA6IDEycHg7CisJcGFkZGluZyA6IDAgMTJweCAwIDA7CisJbWFyZ2luIDogMCAtMTBweCAwIDEwcHg7CisJY3Vyc29yIDogZGVmYXVsdDsKKwlmb250LXNpemU6IHNtYWxsOworfQorCisuZG9qb1RhYiAuY2xvc2VJbWFnZSB7CisJYmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2Nsb3NlLmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDsKK30KKworLmRvam9UYWIgLmNsb3NlSG92ZXIgeworCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoaW1hZ2VzL3RhYl9jbG9zZV9oLmdpZik7Cit9CisKKy5kb2pvVGFiLmN1cnJlbnQgeworCXBhZGRpbmctYm90dG9tIDogMXB4OworCWJvcmRlci1ib3R0b20gOiAwOworCWJhY2tncm91bmQtcG9zaXRpb24gOiAwIC0xNTBweDsKK30KKworLmRvam9UYWIuY3VycmVudCBkaXYgeworCXBhZGRpbmctYm90dG9tIDogNXB4OworCW1hcmdpbi1ib3R0b20gOiAtMXB4OworCWJhY2tncm91bmQtcG9zaXRpb24gOiAxMDAlIC0xNTBweDsKK30KKworLyogYm90dG9tIHRhYnMgKi8KKworLmRvam9UYWJMYWJlbHMtYm90dG9tIHsKKwlwb3NpdGlvbiA6IHJlbGF0aXZlOworCWJvdHRvbSA6IDBweDsKKwlsZWZ0IDogMHB4OworCW92ZXJmbG93IDogdmlzaWJsZTsKKwltYXJnaW4tdG9wIDogLTFweDsKKwl3aWR0aCA6IDEwMCU7CisJei1pbmRleDogMjsKK30KKworLmRvam9UYWJOb0xheW91dC5kb2pvVGFiTGFiZWxzLWJvdHRvbSB7CisJcG9zaXRpb24gOiByZWxhdGl2ZTsKK30KKworLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiIHsKKwlib3JkZXItdG9wIDogIDFweCBzb2xpZCAjNjI5MGQyOworCWJvcmRlci1ib3R0b20gOiAwOworCWJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9ib3RfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IGJvdHRvbTsKK30KKworLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiIGRpdiB7CisJYmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207Cit9CisKKy5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYi5jdXJyZW50IHsKKwlib3JkZXItdG9wIDogMDsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X2xlZnRfY3Vyci5naWYpIG5vLXJlcGVhdCBsZWZ0IGJvdHRvbTsKK30KKworLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiLmN1cnJlbnQgZGl2IHsKKwlwYWRkaW5nLXRvcCA6IDRweDsKKwliYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X3JpZ2h0X2N1cnIuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOworfQorCisvKiByaWdodC1oIHRhYnMgKi8KKworLmRvam9UYWJMYWJlbHMtcmlnaHQtaCB7CisJb3ZlcmZsb3cgOiB2aXNpYmxlOworCW1hcmdpbi1sZWZ0IDogLTFweDsKKwl6LWluZGV4OiAyOworfQorCisuZG9qb1RhYkxhYmVscy1yaWdodC1oIC5kb2pvVGFiIHsKKwlwYWRkaW5nLWxlZnQgOiAwOworCWJvcmRlci1sZWZ0IDogIDFweCBzb2xpZCAjNjI5MGQyOworCWJvcmRlci1ib3R0b20gOiAwOworCWJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9ib3RfcmlnaHQuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOworCWZsb2F0IDogbm9uZTsKK30KKworLmRvam9UYWJMYWJlbHMtcmlnaHQtaCAuZG9qb1RhYiBkaXYgeworCXBhZGRpbmcgOiA0cHggMTVweCA0cHggMTVweDsKK30KKworLmRvam9UYWJMYWJlbHMtcmlnaHQtaCAuZG9qb1RhYi5jdXJyZW50IHsKKwlib3JkZXItbGVmdCA6ICAwOworCWJvcmRlci1ib3R0b20gOiAgMXB4IHNvbGlkICM2MjkwZDI7Cit9CisKKy8qIGxlZnQtaCB0YWJzICovCisKKy5kb2pvVGFiTGFiZWxzLWxlZnQtaCB7CisJb3ZlcmZsb3cgOiB2aXNpYmxlOworCW1hcmdpbi1yaWdodCA6IC0xcHg7CisJei1pbmRleDogMjsKK30KKworLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiIHsKKwlib3JkZXItcmlnaHQgOiAgMXB4IHNvbGlkICM2MjkwZDI7CisJYm9yZGVyLWJvdHRvbSA6IDA7CisJZmxvYXQgOiBub25lOworCWJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl90b3BfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDsKK30KKworLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiLmN1cnJlbnQgeworCWJvcmRlci1yaWdodCA6IDA7CisJYm9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjsKKwlwYWRkaW5nLWJvdHRvbSA6IDA7CisJYmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX3RvcF9sZWZ0LmdpZikgbm8tcmVwZWF0IDAgLTE1MHB4OworfQorCisuZG9qb1RhYkxhYmVscy1sZWZ0LWggLmRvam9UYWIgZGl2IHsKKwliYWNrZ3JvdW5kIDogMDsKKwlib3JkZXItYm90dG9tIDogIDFweCBzb2xpZCAjNjI5MGQyOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVGFiQ29udGFpbmVyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYWJDb250YWluZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTYzMjMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVGFiQ29udGFpbmVyLmh0bWwKQEAgLTAsMCArMSw0IEBACis8ZGl2IGlkPSIke3RoaXMud2lkZ2V0SWR9IiBjbGFzcz0iZG9qb1RhYkNvbnRhaW5lciI+CisJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9InRhYmxpc3ROb2RlIj48L2Rpdj4KKwk8ZGl2IGNsYXNzPSJkb2pvVGFiUGFuZVdyYXBwZXIiIGRvam9BdHRhY2hQb2ludD0iY29udGFpbmVyTm9kZSIgZG9qb0F0dGFjaEV2ZW50PSJvbktleSIgd2FpUm9sZT0idGFicGFuZWwiPjwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYWJDb250YWluZXJBMTF5LmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RhYkNvbnRhaW5lckExMXkuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODZkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYWJDb250YWluZXJBMTF5LmNzcwpAQCAtMCwwICsxLDE3NSBAQAorLmRvam9UYWJDb250YWluZXIgeworCXBvc2l0aW9uIDogcmVsYXRpdmU7Cit9CisKKy5kb2pvVGFiUGFuZVdyYXBwZXIgeworCXBvc2l0aW9uIDogcmVsYXRpdmU7CisJYm9yZGVyIDogMXB4IHNvbGlkICM2MjkwZDI7CisJY2xlYXI6IGJvdGg7CisJX3pvb206IDE7IC8qIGZvcmNlIElFNiBsYXlvdXQgbW9kZSBzbyB0b3AgYm9yZGVyIGRvZXNudCBkaXNhcHBlYXIgKi8KK30KKworLmRvam9UYWJMYWJlbHMtdG9wIHsKKwlwb3NpdGlvbiA6IGFic29sdXRlOworCXRvcCA6IDBweDsKKwlsZWZ0IDogMHB4OworCW92ZXJmbG93IDogdmlzaWJsZTsKKwltYXJnaW4tYm90dG9tIDogLTFweDsKKwl3aWR0aCA6IDEwMCU7CisJei1pbmRleDogMjsJLyogc28gdGhlIGJvdHRvbSBvZiB0aGUgdGFiIGxhYmVsIHdpbGwgY292ZXIgdXAgdGhlIGJvcmRlciBvZiBkb2pvVGFiUGFuZVdyYXBwZXIgKi8KK30KKworLmRvam9UYWJOb0xheW91dC5kb2pvVGFiTGFiZWxzLXRvcCB7CisJcG9zaXRpb24gOiByZWxhdGl2ZTsKK30KKworLmRvam9UYWJOb0xheW91dC5kb2pvVGFiTGFiZWxzLXRvcCAuZG9qb1RhYiB7CisJbWFyZ2luLWJvdHRvbTogLTFweDsKKwlfbWFyZ2luLWJvdHRvbTogMHB4OyAvKiBJRSBmaWx0ZXIgc28gdG9wIGJvcmRlciBsaW5lcyB1cCBjb3JyZWN0bHkgKi8KK30KKworLmRvam9UYWIgeworCXBvc2l0aW9uIDogcmVsYXRpdmU7CisJZmxvYXQgOiBsZWZ0OworCXBhZGRpbmctbGVmdCA6IDlweDsKKwlib3JkZXItYm90dG9tIDogMXB4IHNvbGlkICM2MjkwZDI7CisJY3Vyc29yOiBwb2ludGVyOworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJei1pbmRleDogMzsKK30KKworLmRvam9UYWIgZGl2IHsKKwlkaXNwbGF5IDogYmxvY2s7CisJcGFkZGluZyA6IDRweCAxNXB4IDRweCA2cHg7CisJY29sb3IgOiAjMzMzOworCWZvbnQtc2l6ZSA6IDkwJTsKK30KKworLmRvam9UYWJQYW5lUGFuZUNsb3NlIHsKKwlwb3NpdGlvbiA6IGFic29sdXRlOworCWJvdHRvbSA6IDBweDsKKwlyaWdodCA6IDZweDsKKwloZWlnaHQgOiAxMnB4OworCXdpZHRoIDogMTJweDsKKwlmb250LXNpemUgOiBzbWFsbDsKK30KKy5kb2pvVGFiUGFuZVBhbmVDbG9zZUltYWdlIHsKK30KKworLmRvam9UYWJQYW5lUGFuZUNsb3NlSG92ZXIgeworfQorCisuZG9qb1RhYkNsb3NlIHsKKwlkaXNwbGF5IDogaW5saW5lLWJsb2NrOworCWhlaWdodCA6IDEycHg7CisJd2lkdGggOiAxMnB4OworCXBhZGRpbmcgOiAwIDEycHggMCAwOworCW1hcmdpbiA6IDAgLTEwcHggMCAxMHB4OworCWN1cnNvciA6IGRlZmF1bHQ7CisJZm9udC1zaXplOiBzbWFsbDsKK30KKworLmRvam9UYWJDbG9zZUltYWdlIHsKK30KKworLmRvam9UYWJDbG9zZUhvdmVyIHsKK30KKworLmRvam9UYWIuY3VycmVudCB7CisJcGFkZGluZy1ib3R0b20gOiAxcHg7CisJYm9yZGVyLWJvdHRvbSA6IDA7CisJYmFja2dyb3VuZC1wb3NpdGlvbiA6IDAgLTE1MHB4OworfQorCisuZG9qb1RhYi5jdXJyZW50IGRpdiB7CisJcGFkZGluZy1ib3R0b20gOiA1cHg7CisJbWFyZ2luLWJvdHRvbSA6IC0xcHg7CisJYmFja2dyb3VuZC1wb3NpdGlvbiA6IDEwMCUgLTE1MHB4OworfQorCisvKiBib3R0b20gdGFicyAqLworCisuZG9qb1RhYkxhYmVscy1ib3R0b20geworCXBvc2l0aW9uIDogYWJzb2x1dGU7CisJYm90dG9tIDogMHB4OworCWxlZnQgOiAwcHg7CisJb3ZlcmZsb3cgOiB2aXNpYmxlOworCW1hcmdpbi10b3AgOiAtMXB4OworCXdpZHRoIDogMTAwJTsKKwl6LWluZGV4OiAyOworfQorCisuZG9qb1RhYk5vTGF5b3V0LmRvam9UYWJMYWJlbHMtYm90dG9tIHsKKwlwb3NpdGlvbiA6IHJlbGF0aXZlOworfQorCisuZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIgeworCWJvcmRlci10b3AgOiAgMXB4IHNvbGlkICM2MjkwZDI7CisJYm9yZGVyLWJvdHRvbSA6IDA7Cit9CisKKy5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYiBkaXYgeworfQorCisuZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIuY3VycmVudCB7CisJYm9yZGVyLXRvcCA6IDA7Cit9CisKKy5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYi5jdXJyZW50IGRpdiB7CisJcGFkZGluZy10b3AgOiA0cHg7Cit9CisKKy8qIHJpZ2h0LWggdGFicyAqLworCisuZG9qb1RhYkxhYmVscy1yaWdodC1oIHsKKwlwb3NpdGlvbiA6IGFic29sdXRlOworCXRvcCA6IDBweDsKKwlyaWdodCA6IDBweDsKKwlvdmVyZmxvdyA6IHZpc2libGU7CisJbWFyZ2luLWxlZnQgOiAtMXB4OworCXotaW5kZXg6IDI7Cit9CisKKy5kb2pvVGFiTGFiZWxzLXJpZ2h0LWggLmRvam9UYWIgeworCXBhZGRpbmctbGVmdCA6IDA7CisJYm9yZGVyLWxlZnQgOiAgMXB4IHNvbGlkICM2MjkwZDI7CisJYm9yZGVyLWJvdHRvbSA6IDA7CisJZmxvYXQgOiBub25lOworfQorCisuZG9qb1RhYkxhYmVscy1yaWdodC1oIC5kb2pvVGFiIGRpdiB7CisJcGFkZGluZyA6IDRweCAxNXB4IDRweCAxNXB4OworfQorCisuZG9qb1RhYkxhYmVscy1yaWdodC1oIC5kb2pvVGFiLmN1cnJlbnQgeworCWJvcmRlci1sZWZ0IDogIDA7CisJYm9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjsKK30KKworLyogbGVmdC1oIHRhYnMgKi8KKworLmRvam9UYWJMYWJlbHMtbGVmdC1oIHsKKwlwb3NpdGlvbiA6IGFic29sdXRlOworCXRvcCA6IDBweDsKKwlsZWZ0IDogMHB4OworCW92ZXJmbG93IDogdmlzaWJsZTsKKwltYXJnaW4tcmlnaHQgOiAtMXB4OworCXotaW5kZXg6IDI7Cit9CisKKy5kb2pvVGFiTGFiZWxzLWxlZnQtaCAuZG9qb1RhYiB7CisJYm9yZGVyLXJpZ2h0IDogIDFweCBzb2xpZCAjNjI5MGQyOworCWJvcmRlci1ib3R0b20gOiAwOworCWZsb2F0IDogbm9uZTsKK30KKworLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiLmN1cnJlbnQgeworCWJvcmRlci1yaWdodCA6IDA7CisJYm9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjsKKwlwYWRkaW5nLWJvdHRvbSA6IDA7Cit9CisKKy5kb2pvVGFiTGFiZWxzLWxlZnQtaCAuZG9qb1RhYiBkaXYgeworCWJhY2tncm91bmQgOiAwOworCWJvcmRlci1ib3R0b20gOiAgMXB4IHNvbGlkICM2MjkwZDI7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYXNrQmFyLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Rhc2tCYXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNTVhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYXNrQmFyLmNzcwpAQCAtMCwwICsxLDI5IEBACisuZG9qb1Rhc2tCYXJJdGVtIHsKKwlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisJYmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTsKKwlib3JkZXI6IG91dHNldCAycHg7CisJbWFyZ2luLXJpZ2h0OiA1cHg7CisJY3Vyc29yOiBwb2ludGVyOworCWhlaWdodDogMzVweDsKKwl3aWR0aDogMTAwcHg7CisJZm9udC1zaXplOiAxMHB0OworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWZsb2F0OiBsZWZ0OworCW92ZXJmbG93OiBoaWRkZW47Cit9CisKKy5kb2pvVGFza0Jhckl0ZW0gaW1nIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworCW1hcmdpbi1yaWdodDogNXB4OworCW1hcmdpbi1sZWZ0OiA1cHg7CQorCWhlaWdodDogMzJweDsKKwl3aWR0aDogMzJweDsKK30KKworLmRvam9UYXNrQmFySXRlbSBhIHsKKwkgY29sb3I6IGJsYWNrOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYXNrQmFySXRlbVRlbXBsYXRlLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UYXNrQmFySXRlbVRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Rhc2tCYXJJdGVtVGVtcGxhdGUuaHRtbApAQCAtMCwwICsxLDIgQEAKKzxkaXYgY2xhc3M9ImRvam9UYXNrQmFySXRlbSIgZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrIj4KKzwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RleHRib3guaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RleHRib3guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGViMzQxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVGV4dGJveC5odG1sCkBAIC0wLDAgKzEsNSBAQAorPHNwYW4gc3R5bGU9J2Zsb2F0OiR7dGhpcy5odG1sZmxvYXR9Oyc+CisJPGlucHV0IGRvam9BdHRhY2hQb2ludD0ndGV4dGJveCcgZG9qb0F0dGFjaEV2ZW50PSdvbmJsdXI7b25mb2N1cycKKwkJaWQ9JyR7dGhpcy53aWRnZXRJZH0nIG5hbWU9JyR7dGhpcy5uYW1lfScKKwkJY2xhc3M9JyR7dGhpcy5jbGFzc05hbWV9JyB0eXBlPScke3RoaXMudHlwZX0nID4KKzwvc3Bhbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RpbWVQaWNrZXIuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVGltZVBpY2tlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhNWMzOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RpbWVQaWNrZXIuY3NzCkBAIC0wLDAgKzEsMTc5IEBACisvKlRpbWUgUGlja2VyICovCisudGltZVBpY2tlckNvbnRhaW5lciB7CisJd2lkdGg6MTIycHg7CisJZm9udC1mYW1pbHk6VGFob21hLCBNeXJpYWQsIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOjE2cHg7Cit9CisKKy50aW1lQ29udGFpbmVyIHsKKwlib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7CisJYm9yZGVyLXNwYWNpbmc6MDsKK30KKworLnRpbWVDb250YWluZXIgdGhlYWQgeworCWNvbG9yOiMyOTNhNGI7CisJZm9udC1zaXplOjAuOWVtOworCWZvbnQtd2VpZ2h0OjcwMDsKK30KKworLnRpbWVDb250YWluZXIgdGhlYWQgdGQgeworCXBhZGRpbmc6MC4yNWVtOworCWZvbnQtc2l6ZTowLjgwZW07CisJYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzY3ODJBODsKK30KKworLnRpbWVDb3JuZXIgeworCXdpZHRoOjEwcHg7Cit9CisKKy5jb3JuZXJUb3BMZWZ0IHsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcEN1cnZlVEwucG5nIikgdG9wIGxlZnQgbm8tcmVwZWF0OworfQorCisuY29ybmVyVG9wUmlnaHQgeworCWJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2RwQ3VydmVUUi5wbmciKSB0b3AgcmlnaHQgbm8tcmVwZWF0OworfQorCisudGltZUxhYmVsQ29udGFpbmVyIHsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcE1vbnRoQmcucG5nIikgdG9wIGxlZnQgcmVwZWF0LXg7Cit9CisKKy5ob3VycywgLm1pbnV0ZXMsIC50aW1lQm9yZGVyIHsKKwliYWNrZ3JvdW5kOiAjNzU5MWJjIHVybCgiaW1hZ2VzL2RwQmcuZ2lmIikgdG9wIGxlZnQgcmVwZWF0LXg7CisKK30KKworLmhvdXJzIHRkLCAubWludXRlcyB0ZCB7CisJcGFkZGluZzowLjJlbTsKKwl0ZXh0LWFsaWduOmNlbnRlcjsKKwlmb250LXNpemU6MC43ZW07CisJZm9udC13ZWlnaHQ6Ym9sZDsKKwljdXJzb3I6cG9pbnRlcjsKKwljdXJzb3I6aGFuZDsKKwljb2xvcjojZmZmOworfQorCisubWludXRlcyB7CisJYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNmNWQxZGI7Cit9CisKKy5ob3VycyB7CisJYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNjc4MkE4OworfQorCisuaG91clNlbGVjdG9yIHsKKwlib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM2NzgyQTg7CisJcGFkZGluZzo1cHg7CisJcGFkZGluZy1yaWdodDoxMHB4OworfQorCisubWludXRlc1NlbGVjdG9yIHsKKwlwYWRkaW5nOjVweDsKKwlib3JkZXItbGVmdDoxcHggc29saWQgI2Y1YzdkNDsKKwl0ZXh0LWFsaWduOmNlbnRlcjsKK30KKworLm1pbnV0ZXNIZWFkaW5nIHsKKwlwYWRkaW5nLWxlZnQ6OXB4ICFpbXBvcnRhbnQ7Cit9CisKKy50aW1lT3B0aW9ucyB7CisJYmFja2dyb3VuZC1jb2xvcjojRjlDOUQ3OworfQorCisudGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tTGVmdCwgLnRpbWVDb250YWluZXIgLmNvcm5lckJvdHRvbVJpZ2h0LCAudGltZUNvbnRhaW5lciAudGltZU9wdGlvbnMgeworCWJvcmRlci10b3A6MXB4IHNvbGlkICM2NzgyQTg7Cit9CisKKy50aW1lQ29udGFpbmVyIC5jb3JuZXJCb3R0b21MZWZ0IHsKKwliYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9kcEN1cnZlQkwucG5nIikgYm90dG9tIGxlZnQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7CisJd2lkdGg6OXB4ICFpbXBvcnRhbnQ7CisJcGFkZGluZzowOworCW1hcmdpbjowOworfQorCisudGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tUmlnaHQgeworCWJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2RwQ3VydmVCUi5wbmciKSBib3R0b20gcmlnaHQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7CisJd2lkdGg6OXB4ICFpbXBvcnRhbnQ7CisJcGFkZGluZzowOworCW1hcmdpbjowOworfQorCisudGltZU9wdGlvbnMgeworCWNvbG9yOiNmZmY7CisJYmFja2dyb3VuZDp1cmwoImltYWdlcy9kcFllYXJCZy5wbmciKSB0b3AgbGVmdCByZXBlYXQteDsKKworfQorCisuc2VsZWN0ZWRJdGVtIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiNmZmY7CisJY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50OworfQorCisudGltZU9wdGlvbnMgLnNlbGVjdGVkSXRlbSB7CisJY29sb3I6I2ZmZiAhaW1wb3J0YW50OworCWJhY2tncm91bmQtY29sb3I6IzllYzNmYiAhaW1wb3J0YW50OworfQorCisuYW55VGltZUNvbnRhaW5lciB7CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJZm9udC13ZWlnaHQ6Ym9sZDsKKwlmb250LXNpemU6MC43ZW07CisJcGFkZGluZzowLjFlbTsKKwljdXJzb3I6cG9pbnRlcjsKKwljdXJzb3I6aGFuZDsKKwljb2xvcjojZmZmICFpbXBvcnRhbnQ7Cit9CisKKy5hbVBtQ29udGFpbmVyIHsKKwl3aWR0aDoxMDAlOworfQorCisuYW1QbUNvbnRhaW5lciB0ZCB7CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJZm9udC1zaXplOjAuN2VtOworCWZvbnQtd2VpZ2h0OmJvbGQ7CisJY3Vyc29yOnBvaW50ZXI7CisJY3Vyc29yOmhhbmQ7CisJY29sb3I6I2ZmZjsKK30KKworCisKKy8qLnRpbWVQaWNrZXJDb250YWluZXIgeworCW1hcmdpbjoxLjc1ZW0gMCAwLjVlbSAwOworCXdpZHRoOjEwZW07CisJZmxvYXQ6bGVmdDsKK30KKworLnRpbWVDb250YWluZXIgeworCWJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKKwlib3JkZXItc3BhY2luZzowOworfQorCisudGltZUNvbnRhaW5lciB0aGVhZCB0ZHsKKwlib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTZlNmU2OworCXBhZGRpbmc6MCAwLjRlbSAwLjJlbSAwLjRlbTsKK30KKworLnRpbWVDb250YWluZXIgdGQgeworCWZvbnQtc2l6ZTowLjllbTsKKwlwYWRkaW5nOjAgMC4yNWVtIDAgMC4yNWVtOworCXRleHQtYWxpZ246bGVmdDsKKwljdXJzb3I6cG9pbnRlcjtjdXJzb3I6aGFuZDsKK30KKworLnRpbWVDb250YWluZXIgdGQubWludXRlc0hlYWRpbmcgeworCWJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTZlNmU2OworCWJvcmRlci1yaWdodDoxcHggc29saWQgI2U2ZTZlNjsJCit9CisKKy50aW1lQ29udGFpbmVyIC5taW51dGVzIHsKKwlib3JkZXItbGVmdDoxcHggc29saWQgI2U2ZTZlNjsKKwlib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKKy5zZWxlY3RlZEl0ZW0geworCWJhY2tncm91bmQtY29sb3I6IzNhM2EzYTsKKwljb2xvcjojZmZmZmZmOworfSovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UaW1lUGlja2VyLmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UaW1lUGlja2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZTVhNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RpbWVQaWNrZXIuaHRtbApAQCAtMCwwICsxLDk4IEBACis8ZGl2IGNsYXNzPSJ0aW1lUGlja2VyQ29udGFpbmVyIiBkb2pvQXR0YWNoUG9pbnQ9InRpbWVQaWNrZXJDb250YWluZXJOb2RlIj4KKwk8dGFibGUgY2xhc3M9InRpbWVDb250YWluZXIiIGNlbGxzcGFjaW5nPSIwIiA+CisJCTx0aGVhZD4KKwkJCTx0cj4KKwkJCQk8dGQgY2xhc3M9InRpbWVDb3JuZXIgY29ybmVyVG9wTGVmdCIgdmFsaWduPSJ0b3AiPiZuYnNwOzwvdGQ+CisJCQkJPHRkIGNsYXNzPSJ0aW1lTGFiZWxDb250YWluZXIgaG91clNlbGVjdG9yIj4ke3RoaXMuY2FsZW5kYXIuZmllbGQtaG91cn08L3RkPgorCQkJCTx0ZCBjbGFzcz0idGltZUxhYmVsQ29udGFpbmVyIG1pbnV0ZXNIZWFkaW5nIj4ke3RoaXMuY2FsZW5kYXIuZmllbGQtbWludXRlfTwvdGQ+CisJCQkJPHRkIGNsYXNzPSJ0aW1lQ29ybmVyIGNvcm5lclRvcFJpZ2h0IiB2YWxpZ249InRvcCI+Jm5ic3A7PC90ZD4KKwkJCTwvdHI+CisJCTwvdGhlYWQ+CisJCTx0Ym9keT4KKwkJCTx0cj4KKwkJCQk8dGQgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjIiIGNsYXNzPSJob3VycyI+CisJCQkJCTx0YWJsZSBhbGlnbj0iY2VudGVyIj4KKwkJCQkJCTx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9ImhvdXJDb250YWluZXJOb2RlIiAgCisJCQkJCQkJZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBvblNldFNlbGVjdGVkSG91cjsiPgorCQkJCQkJCTx0cj4KKwkJCQkJCQkJPHRkPjEyPC90ZD4KKwkJCQkJCQkJPHRkPjY8L3RkPgorCQkJCQkJCTwvdHI+CisJCQkJCQkJPHRyPgorCQkJCQkJCQk8dGQ+MTwvdGQ+CisJCQkJCQkJCTx0ZD43PC90ZD4KKwkJCQkJCQk8L3RyPgorCQkJCQkJCTx0cj4KKwkJCQkJCQkJPHRkPjI8L3RkPgorCQkJCQkJCQk8dGQ+ODwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4zPC90ZD4KKwkJCQkJCQkJPHRkPjk8L3RkPgorCQkJCQkJCTwvdHI+CisJCQkJCQkJPHRyPgorCQkJCQkJCQk8dGQ+NDwvdGQ+CisJCQkJCQkJCTx0ZD4xMDwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD41PC90ZD4KKwkJCQkJCQkJPHRkPjExPC90ZD4KKwkJCQkJCQk8L3RyPgorCQkJCQkJPC90Ym9keT4KKwkJCQkJPC90YWJsZT4KKwkJCQk8L3RkPgorCQkJCTx0ZCB2YWxpZ249InRvcCIgY2xhc3M9Im1pbnV0ZXMiIGNvbHNwYW49IjIiPgorCQkJCQk8dGFibGUgYWxpZ249ImNlbnRlciI+CisJCQkJCQk8dGJvZHkgZG9qb0F0dGFjaFBvaW50PSJtaW51dGVDb250YWluZXJOb2RlIiAKKwkJCQkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uU2V0U2VsZWN0ZWRNaW51dGU7Ij4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4wMDwvdGQ+CisJCQkJCQkJCTx0ZD4zMDwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4wNTwvdGQ+CisJCQkJCQkJCTx0ZD4zNTwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4xMDwvdGQ+CisJCQkJCQkJCTx0ZD40MDwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4xNTwvdGQ+CisJCQkJCQkJCTx0ZD40NTwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4yMDwvdGQ+CisJCQkJCQkJCTx0ZD41MDwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCQk8dHI+CisJCQkJCQkJCTx0ZD4yNTwvdGQ+CisJCQkJCQkJCTx0ZD41NTwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGJvZHk+CisJCQkJCTwvdGFibGU+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCQk8dHI+CisJCQkJPHRkIGNsYXNzPSJjb3JuZXJCb3R0b21MZWZ0Ij4mbmJzcDs8L3RkPgorCQkJCTx0ZCB2YWxpZ249InRvcCIgY2xhc3M9InRpbWVPcHRpb25zIj4KKwkJCQkJPHRhYmxlIGNsYXNzPSJhbVBtQ29udGFpbmVyIj4KKwkJCQkJCTx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9ImFtUG1Db250YWluZXJOb2RlIiAKKwkJCQkJCQlkb2pvQXR0YWNoRXZlbnQ9Im9uQ2xpY2s6IG9uU2V0U2VsZWN0ZWRBbVBtOyI+CisJCQkJCQkJPHRyPgorCQkJCQkJCQk8dGQgaWQ9ImFtIj4ke3RoaXMuY2FsZW5kYXIuYW19PC90ZD4KKwkJCQkJCQkJPHRkIGlkPSJwbSI+JHt0aGlzLmNhbGVuZGFyLnBtfTwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwvdGJvZHk+CisJCQkJCTwvdGFibGU+CisJCQkJPC90ZD4KKwkJCQk8dGQgY2xhc3M9InRpbWVPcHRpb25zIj4KKwkJCQkJPGRpdiBkb2pvQXR0YWNoUG9pbnQ9ImFueVRpbWVDb250YWluZXJOb2RlIiAKKwkJCQkJCWRvam9BdHRhY2hFdmVudD0ib25DbGljazogb25TZXRTZWxlY3RlZEFueVRpbWU7IiAKKwkJCQkJCWNsYXNzPSJhbnlUaW1lQ29udGFpbmVyIj4ke3RoaXMud2lkZ2V0U3RyaW5ncy5hbnl9PC9kaXY+CisJCQkJPC90ZD4KKwkJCQk8dGQgY2xhc3M9ImNvcm5lckJvdHRvbVJpZ2h0Ij4mbmJzcDs8L3RkPgorCQkJPC90cj4KKwkJPC90Ym9keT4KKwk8L3RhYmxlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UaXRsZVBhbmUuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RpdGxlUGFuZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNTdmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UaXRsZVBhbmUuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJkb21Ob2RlIj4KKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJsYWJlbE5vZGUiIGRvam9BdHRhY2hFdmVudD0ib25jbGljazogb25MYWJlbENsaWNrIj48L2Rpdj4KKzxkaXYgZG9qb0F0dGFjaFBvaW50PSJjb250YWluZXJOb2RlIj48L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVG9hc3Rlci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Ub2FzdGVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY4MDAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVG9hc3Rlci5jc3MKQEAgLTAsMCArMSw0MiBAQAorLmRvam9Ub2FzdGVyQ2xpcCB7CisJcG9zaXRpb246IGFic29sdXRlOworCW92ZXJmbG93OiBoaWRkZW47Cit9CisKKy5kb2pvVG9hc3RlckNvbnRhaW5lciB7CisJZGlzcGxheTogYmxvY2s7CisJcG9zaXRpb246IGFic29sdXRlOworCXdpZHRoOiAxNy41ZW07CisJei1pbmRleDogNTAwMDsKKwltYXJnaW46IDBweDsKKwlmb250OjAuNzVlbSBUYWhvbWEsIEhlbHZldGljYSwgVmVyZGFuYSwgQXJpYWw7Cit9CisKKy5kb2pvVG9hc3RlckNvbnRlbnR7CisJcGFkZGluZzoxZW07CisJcGFkZGluZy10b3A6MC4yNWVtOworCWJhY2tncm91bmQ6IzczYzc0YTsKK30KKworLmRvam9Ub2FzdGVyTWVzc2FnZXsgCisJY29sb3I6I2ZmZjsKK30KKy5kb2pvVG9hc3Rlcldhcm5pbmd7IH0KKy5kb2pvVG9hc3RlckVycm9yLAorLmRvam9Ub2FzdGVyRmF0YWx7CisJZm9udC13ZWlnaHQ6Ym9sZDsKKwljb2xvcjojZmZmOworfQorCisKKy5kb2pvVG9hc3Rlcldhcm5pbmcgLmRvam9Ub2FzdGVyQ29udGVudHsKKwlwYWRkaW5nOjFlbTsKKwlwYWRkaW5nLXRvcDowLjI1ZW07CisJYmFja2dyb3VuZDojZDRkOTQzOworfSAKKworLmRvam9Ub2FzdGVyRXJyb3IgLmRvam9Ub2FzdGVyQ29udGVudHsKKwlwYWRkaW5nOjFlbTsKKwlwYWRkaW5nLXRvcDowLjI1ZW07CisJYmFja2dyb3VuZDojYzQ2NjAwOworfSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Rvb2xiYXIuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVG9vbGJhci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmZThkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Rvb2xiYXIuY3NzCkBAIC0wLDAgKzEsNTQgQEAKKy50b29sYmFyQ29udGFpbmVyIHsKKwlib3JkZXItYm90dG9tIDogMDsKKwliYWNrZ3JvdW5kLWNvbG9yIDogI2RlZjsKKwljb2xvciA6IEJ1dHRvblRleHQ7CisJZm9udCA6IE1lbnU7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy90b29sYmFyLWJnLmdpZik7Cit9CisKKy50b29sYmFyIHsKKwlwYWRkaW5nIDogMnB4IDRweDsKKwltaW4taGVpZ2h0IDogMjZweDsKKwlfaGVpZ2h0IDogMjZweDsKK30KKworLnRvb2xiYXJJdGVtIHsKKwlmbG9hdCA6IGxlZnQ7CisJcGFkZGluZyA6IDFweCAycHg7CisJbWFyZ2luIDogMCAycHggMXB4IDA7CisJY3Vyc29yIDogcG9pbnRlcjsKK30KKworLnRvb2xiYXJJdGVtLnNlbGVjdGVkLCAudG9vbGJhckl0ZW0uZG93biB7CisJbWFyZ2luIDogMXB4IDFweCAwIDFweDsKKwlwYWRkaW5nIDogMHB4IDFweDsKKwlib3JkZXIgOiAxcHggc29saWQgI2JiZjsKKwliYWNrZ3JvdW5kLWNvbG9yIDogI2ZhZmFmZjsKK30KKworLnRvb2xiYXJCdXR0b24gaW1nIHsKKwl2ZXJ0aWNhbC1hbGlnbiA6IGJvdHRvbTsKK30KKworLnRvb2xiYXJCdXR0b24gc3BhbiB7CisJbGluZS1oZWlnaHQgOiAxNnB4OworCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOworfQorCisudG9vbGJhckJ1dHRvbi5ob3ZlciB7CisJcGFkZGluZyA6IDBweCAxcHg7CisJYm9yZGVyIDogMXB4IHNvbGlkICM5OWM7Cit9CisKKy50b29sYmFySXRlbS5kaXNhYmxlZCB7CisJb3BhY2l0eSA6IDAuMzsKKwlmaWx0ZXIgOiBhbHBoYShvcGFjaXR5PTMwKTsKKwljdXJzb3IgOiBkZWZhdWx0OworfQorCisudG9vbGJhclNlcGFyYXRvciB7CisJY3Vyc29yIDogZGVmYXVsdDsKK30KKworLnRvb2xiYXJGbGV4aWJsZVNwYWNlIHsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1Rvb2x0aXBUZW1wbGF0ZS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Ub29sdGlwVGVtcGxhdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMGJlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9Ub29sdGlwVGVtcGxhdGUuY3NzCkBAIC0wLDAgKzEsMTAgQEAKKy5kb2pvVG9vbHRpcCB7CisJYm9yZGVyOiBzb2xpZCBibGFjayAxcHg7CisJYmFja2dyb3VuZDogYmVpZ2U7CisJY29sb3I6IGJsYWNrOworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwlmb250LXNpemU6IHNtYWxsOworCXBhZGRpbmc6IDJweCAycHggMnB4IDJweDsKKwl6LWluZGV4OiAxMDsKKwlkaXNwbGF5OiBibG9jazsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmNzIxZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWUuY3NzCkBAIC0wLDAgKzEsMjkgQEAKKy5kb2pvVHJlZSB7CisJZm9udDogY2FwdGlvbjsKKwlmb250LXNpemU6IDExcHg7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlvdmVyZmxvdzogYXV0bzsKK30KKworLmRvam9UcmVlTm9kZUxhYmVsIHsKKwlwYWRkaW5nOiAxcHggMnB4OworCWNvbG9yOiBXaW5kb3dUZXh0OworCWN1cnNvcjogZGVmYXVsdDsKK30KKworLmRvam9UcmVlTm9kZUxhYmVsOmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworLmRvam9UcmVlTm9kZUxhYmVsU2VsZWN0ZWQgeworCWJhY2tncm91bmQtY29sb3I6IEhpZ2hsaWdodDsKKwljb2xvcjogSGlnaGxpZ2h0VGV4dDsKK30KKworLmRvam9UcmVlIGRpdiB7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLmRvam9UcmVlIGltZyB7CisJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWVEaXNhYmxlV3JhcC5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UcmVlRGlzYWJsZVdyYXAuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGRiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UcmVlRGlzYWJsZVdyYXAuY3NzCkBAIC0wLDAgKzEsOSBAQAorCisvKiBDU1MgZm9yIFRyZWVEaXNhYmxlV3JhcEV4dGVuc2lvbiAqLworCisuVHJlZURpc2FibGVXcmFwIHsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworfQorLlRyZWVJRURpc2FibGVXcmFwIHsKKwl3aWR0aDogZXhwcmVzc2lvbiggNSArIGZpcnN0Q2hpbGQub2Zmc2V0V2lkdGggKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWVEb2NJY29uLmNzcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1RyZWVEb2NJY29uLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNiOTkyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZURvY0ljb24uY3NzCkBAIC0wLDAgKzEsNTUgQEAKKworLyogQ1NTIGZvciBUcmVlRG9jSWNvbkV4dGVuc2lvbiAqLworCisKKy8qIGxvbmcgdmVydGljYWwgbGluZSB1bmRlciBkb2NJY29uLCBjb25uZWN0aW5nIHcvIGNoaWxkcmVuICovCisuVHJlZVN0YXRlQ2hpbGRyZW5ZZXMtRXhwYW5kT3BlbiAuVHJlZUljb25Db250ZW50IHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pX2xvbmcuZ2lmJyk7CisgICAgYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMThweCA5cHg7Cit9CisKKy8qIGNsb3NlIGhhcyBoaWdoZXIgcHJpb3JpdHkgKi8KKy5UcmVlU3RhdGVDaGlsZHJlblllcy1FeHBhbmRDbG9zZWQgLlRyZWVJY29uQ29udGVudCB7CisgICAgYmFja2dyb3VuZC1pbWFnZSA6IHVybCgpOworfQorCisvKiBoaWdoZXIgcHJpb3RpdHk6IHNhbWUgbGVuZ3RoIGFuZCBhcHBlYXIgYWZ0ZXIgYmFja2dyb3VuZC1kZWZpbml0aW9uICovCisuVHJlZVN0YXRlQ2hpbGRyZW5Oby1FeHBhbmRMZWFmIC5UcmVlSWNvbkNvbnRlbnQgeworICAgIGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoKTsKK30KKworLlRyZWVTdGF0ZUNoaWxkcmVuTm8tRXhwYW5kQ2xvc2VkIC5UcmVlSWNvbkNvbnRlbnQgeworICAgIGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoKTsKK30KKworLlRyZWVTdGF0ZUNoaWxkcmVuTm8tRXhwYW5kT3BlbiAuVHJlZUljb25Db250ZW50IHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCk7Cit9CisKKworLyogaGlnaGVzdCBwcmlvcml0eSAqLworLlRyZWVJY29uRG9jdW1lbnQgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZG9jdW1lbnQuZ2lmJyk7Cit9CisKKy5UcmVlRXhwYW5kT3BlbiAuVHJlZUljb25Gb2xkZXIgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvb3Blbi5naWYnKTsKK30KKworLlRyZWVFeHBhbmRDbG9zZWQgLlRyZWVJY29uRm9sZGVyIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2Nsb3NlZC5naWYnKTsKK30KKworLyogZ2VuZXJpYyBjbGFzcyBmb3IgZG9jSWNvbiAqLworLlRyZWVJY29uIHsKKyAgICB3aWR0aDogMThweDsKKyAgICBoZWlnaHQ6IDE4cHg7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OworfQorCitkaXYuVHJlZUNvbnRlbnQgeworICAgIG1hcmdpbi1sZWZ0OiAzNnB4OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZUVkaXRvci5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UcmVlRWRpdG9yLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYwOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZUVkaXRvci5jc3MKQEAgLTAsMCArMSw0IEBACitodG1sLCBib2R5IHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmM7CisgICAgICBjb2xvcjogYmxhY2s7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9UcmVlVjMuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZVYzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE1ZmJkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvVHJlZVYzLmNzcwpAQCAtMCwwICsxLDgyIEBACisvKiBpbmRlbnQgZm9yIGFsbCB0cmVlIGNoaWxkcmVuIGV4Y2VwdHMgcm9vdCAqLworLlRyZWVOb2RlIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pLmdpZicpOworICAgIGJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdCA6IHJlcGVhdC15OworICAgIG1hcmdpbi1sZWZ0OiAxOXB4OworICAgIHpvb206IDE7Cit9CisuVHJlZUlzUm9vdCB7CisgICAgbWFyZ2luLWxlZnQ6IDA7Cit9CisgCisvKiBsZWZ0IHZlcnRpY2FsIGxpbmUgKGdyaWQpIGZvciBhbGwgbm9kZXMgKi8KKy5UcmVlSXNMYXN0IHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfaGFsZi5naWYnKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKK30KKyAKKy5UcmVlRXhwYW5kT3BlbiAuVHJlZUV4cGFuZCB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9leHBhbmRfbWludXMuZ2lmJyk7Cit9CisgCisvKiBjbG9zZWQgaXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gb3BlbiAqLworLlRyZWVFeHBhbmRDbG9zZWQgLlRyZWVFeHBhbmQgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX3BsdXMuZ2lmJyk7Cit9CisgCisvKiBoaWdoZXN0IHByaW9yaXR5ICovCisuVHJlZUV4cGFuZExlYWYgLlRyZWVFeHBhbmQgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX2xlYWYuZ2lmJyk7Cit9CisKKy8qIAorc2hvdWxkIGFsd2F5cyBvdmVycmlkZSBhbnkgZXhwYW5kIHNldHRpbmcsIGJ1dCBkbyBub3QgdG91Y2ggY2hpbGRyZW4uCitpZiBJIGFkZCAuVHJlZUV4cGFuZCAuVHJlZUV4cGFuZExvYWRpbmcgc2FtZSB0aW1lIGFuZCBwdXQgaXQgdG8gdG9wL2JvdHRvbSwgdGhlbiBpdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyICstIGZvciBhbGwgZGVzY2VuZGFudHMgb3IgYWx3YXlzIGZhaWwKK3NvIEkgaGF2ZSB0byByZW1vdmUgVHJlZUV4cGFuZCBhbmQgcHJvY2VzcyB0aGlzIG9uZSBzcGVjaWZpY2FsbHkKKyovCisKKy5UcmVlRXhwYW5kTG9hZGluZyAgIHsKKyAgICB3aWR0aDogMThweDsKKyAgICBoZWlnaHQ6IDE4cHg7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX2xvYWRpbmcuZ2lmJyk7Cit9CisgCisuVHJlZUNvbnRlbnQgeworICAgIG1pbi1oZWlnaHQ6IDE4cHg7CisgICAgbWluLXdpZHRoOiAxOHB4OworICAgIG1hcmdpbi1sZWZ0OjE4cHg7CisgICAgY3Vyc29yOiBkZWZhdWx0OworICAgIC8qIGNhbid0IG1ha2UgaW5saW5lIC0gbXVsdGlsaW5lIGJ1Z3MgKi8KK30KKworLlRyZWVJRUNvbnRlbnQgeworCWhlaWdodDogMThweDsKK30KKyAKKy5UcmVlRXhwYW5kIHsKKyAgICB3aWR0aDogMThweDsKKyAgICBoZWlnaHQ6IDE4cHg7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OworfQorIAorLyogc2FtZSBzdHlsZSBhcyBJRSBzZWxlY3Rpb24gKi8KKy5UcmVlTm9kZUVtcGhhc2l6ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEhpZ2hsaWdodDsKKyAgICBjb2xvcjogSGlnaGxpZ2h0VGV4dDsKK30KKyAKKy5UcmVlQ29udGVudCAuUmljaFRleHRFZGl0YWJsZSwgLlRyZWVDb250ZW50IC5SaWNoVGV4dEVkaXRhYmxlIGlmcmFtZSB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjOworICAgICAgY29sb3I6IGJsYWNrOworfQorCisvKiBkb24ndCB1c2UgOmZvY3VzIGR1ZSB0byBvcGVyYSdzIGxhY2sgb2Ygc3VwcG9ydCBvbiBkaXYncyAqLworLlRyZWVMYWJlbEZvY3VzZWQgeworICAgICAgb3V0bGluZTogMXB4IGludmVydCBkb3R0ZWQ7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9WYWxpZGF0ZS5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9WYWxpZGF0ZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiMGZlMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1ZhbGlkYXRlLmNzcwpAQCAtMCwwICsxLDEyIEBACisuZG9qb1ZhbGlkYXRlRW1wdHl7CisJYmFja2dyb3VuZC1jb2xvcjogIzAwRkZGRjsKK30KKy5kb2pvVmFsaWRhdGVWYWxpZHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjY2ZjOworfQorLmRvam9WYWxpZGF0ZUludmFsaWR7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZjYzsKK30KKy5kb2pvVmFsaWRhdGVSYW5nZXsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjY2NmOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1ZhbGlkYXRpb25UZXh0Ym94Lmh0bWwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9WYWxpZGF0aW9uVGV4dGJveC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWRiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9WYWxpZGF0aW9uVGV4dGJveC5odG1sCkBAIC0wLDAgKzEsOCBAQAorPHNwYW4gc3R5bGU9J2Zsb2F0OiR7dGhpcy5odG1sZmxvYXR9Oyc+CisJPGlucHV0IGRvam9BdHRhY2hQb2ludD0ndGV4dGJveCcgdHlwZT0nJHt0aGlzLnR5cGV9JyBkb2pvQXR0YWNoRXZlbnQ9J29uYmx1cjtvbmZvY3VzO29ua2V5dXAnCisJCWlkPScke3RoaXMud2lkZ2V0SWR9JyBuYW1lPScke3RoaXMubmFtZX0nIHNpemU9JyR7dGhpcy5zaXplfScgbWF4bGVuZ3RoPScke3RoaXMubWF4bGVuZ3RofScKKwkJY2xhc3M9JyR7dGhpcy5jbGFzc05hbWV9JyBzdHlsZT0nJz4KKwk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9J2ludmFsaWRTcGFuJyBjbGFzcz0nJHt0aGlzLmludmFsaWRDbGFzc30nPiR7dGhpcy5tZXNzYWdlcy5pbnZhbGlkTWVzc2FnZX08L3NwYW4+CisJPHNwYW4gZG9qb0F0dGFjaFBvaW50PSdtaXNzaW5nU3BhbicgY2xhc3M9JyR7dGhpcy5taXNzaW5nQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMubWlzc2luZ01lc3NhZ2V9PC9zcGFuPgorCTxzcGFuIGRvam9BdHRhY2hQb2ludD0ncmFuZ2VTcGFuJyBjbGFzcz0nJHt0aGlzLnJhbmdlQ2xhc3N9Jz4ke3RoaXMubWVzc2FnZXMucmFuZ2VNZXNzYWdlfTwvc3Bhbj4KKzwvc3Bhbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1dpemFyZC5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9XaXphcmQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9XaXphcmQuY3NzCkBAIC0wLDAgKzEsNzIgQEAKKy5XaXphcmRDb250YWluZXIgeworCWJhY2tncm91bmQ6ICNFRUVFRUU7CisJYm9yZGVyOiAjNzk4RUM1IDFweCBzb2xpZDsKKwlwYWRkaW5nOiAycHg7Cit9CisKKy5XaXphcmRUaXRsZSB7CisJY29sb3I6ICMwMDMzNjY7CisJcGFkZGluZzogOHB4IDVweCAxNXB4IDJweDsKKwlmb250LXdlaWdodDogYm9sZDsKKwlmb250LXNpemU6IHgtc21hbGw7CisJZm9udC1zdHlsZTogbm9ybWFsOworCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOworCXRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy5XaXphcmRUZXh0IHsKKwljb2xvcjogIzAwMDAzMzsKKwlmb250LXdlaWdodDogbm9ybWFsOworCWZvbnQtc2l6ZTogeHgtc21hbGw7CisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7CisJcGFkZGluZzogMiA1MDsgdGV4dC1hbGlnbjoganVzdGlmeTsKK30KKworLldpemFyZExpZ2h0VGV4dCB7CisJY29sb3I6ICM2NjY2NjY7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlmb250LXNpemU6IHh4LXNtYWxsOworCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhOworCXBhZGRpbmc6IDJweCA1MHB4OworCXRleHQtYWxpZ246IGp1c3RpZnk7Cit9CisKKy5XaXphcmRCdXR0b25Ib2xkZXIgeworCXRleHQtYWxpZ246IHJpZ2h0OworCXBhZGRpbmc6IDEwcHggNXB4OworfQorCisuV2l6YXJkQnV0dG9uIHsKKwljb2xvcjogI2ZmZmZmZjsKKwliYWNrZ3JvdW5kOiAjNzk4RUM1OworCWZvbnQtc2l6ZTogeHgtc21hbGw7CisJZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJYm9yZGVyLXJpZ2h0OiAjMDAwMDAwIDFweCBzb2xpZDsKKwlib3JkZXItYm90dG9tOiAjMDAwMDAwIDFweCBzb2xpZDsKKwlib3JkZXItbGVmdDogIzY2NjY2NiAxcHggc29saWQ7CisJYm9yZGVyLXRvcDogIzY2NjY2NiAxcHggc29saWQ7CisJcGFkZGluZy1yaWdodDogNHB4OworCXBhZGRpbmctbGVmdDogNHB4OworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgaGVpZ2h0OiAxOHB4OworfQorCisuV2l6YXJkQnV0dG9uOmhvdmVyIHsKKwljdXJzb3I6IHBvaW50ZXI7Cit9CisKKy5XaXphcmRCdXR0b25EaXNhYmxlZCB7CisJY29sb3I6ICNlZWVlZWU7CisJYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKKwlmb250LXNpemU6IHh4LXNtYWxsOworCUZPTlQtRkFNSUxZOiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOworCWJvcmRlci1yaWdodDogIzAwMDAwMCAxcHggc29saWQ7CisJYm9yZGVyLWJvdHRvbTogIzAwMDAwMCAxcHggc29saWQ7CisJYm9yZGVyLWxlZnQ6ICM3OThFQzUgMXB4IHNvbGlkOworCWJvcmRlci10b3A6ICM3OThFQzUgMXB4IHNvbGlkOworCXBhZGRpbmctcmlnaHQ6IDRweDsKKwlwYWRkaW5nLWxlZnQ6IDRweDsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJaGVpZ2h0OiAxOHB4OworfQorCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1dpemFyZC5odG1sIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvV2l6YXJkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxNDYwYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL1dpemFyZC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxkaXYgY2xhc3M9IldpemFyZENvbnRhaW5lciIgZG9qb0F0dGFjaFBvaW50PSJ3aXphcmROb2RlIj4KKyAgICA8ZGl2IGNsYXNzPSJXaXphcmRUZXh0IiBkb2pvQXR0YWNoUG9pbnQ9IndpemFyZFBhbmVsQ29udGFpbmVyTm9kZSI+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iV2l6YXJkQnV0dG9uSG9sZGVyIiBkb2pvQXR0YWNoUG9pbnQ9IndpemFyZENvbnRyb2xDb250YWluZXJOb2RlIj4KKyAgICAgICAgPGlucHV0IGNsYXNzPSJXaXphcmRCdXR0b24iIHR5cGU9ImJ1dHRvbiIgZG9qb0F0dGFjaFBvaW50PSJwcmV2aW91c0J1dHRvbiIvPgorICAgICAgICA8aW5wdXQgY2xhc3M9IldpemFyZEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiBkb2pvQXR0YWNoUG9pbnQ9Im5leHRCdXR0b24iLz4KKyAgICAgICAgPGlucHV0IGNsYXNzPSJXaXphcmRCdXR0b24iIHR5cGU9ImJ1dHRvbiIgZG9qb0F0dGFjaFBvaW50PSJkb25lQnV0dG9uIiBzdHlsZT0iZGlzcGxheTpub25lIi8+CisgICAgICAgIDxpbnB1dCBjbGFzcz0iV2l6YXJkQnV0dG9uIiB0eXBlPSJidXR0b24iIGRvam9BdHRhY2hQb2ludD0iY2FuY2VsQnV0dG9uIi8+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYWdncmVnYXRlLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYWdncmVnYXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU3MDUyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9hZ2dyZWdhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYmFja2NvbG9yLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYmFja2NvbG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRkMmZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9iYWNrY29sb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYmctZmFkZS5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2JnLWZhZGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzRhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2JnLWZhZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvYm9sZC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2JvbGQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2JvbGQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY2FuY2VsLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY2FuY2VsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM5OTczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9jYW5jZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY29weS5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2NvcHkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjI5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2NvcHkuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY3JlYXRlbGluay5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2NyZWF0ZWxpbmsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTQwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2NyZWF0ZWxpbmsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY3V0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvY3V0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmRiZjRhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9jdXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvZGVsZXRlLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvZGVsZXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU2MWMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9kZWxldGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvZm9yZWNvbG9yLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvZm9yZWNvbG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjYwYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9mb3JlY29sb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaGlsaXRlY29sb3IuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9oaWxpdGVjb2xvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZDJmYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaGlsaXRlY29sb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5kZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5kZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pbmRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0aG9yaXpvbnRhbHJ1bGUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pbnNlcnRob3Jpem9udGFscnVsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExNWI1NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0aG9yaXpvbnRhbHJ1bGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0aW1hZ2UuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pbnNlcnRpbWFnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyMmJlMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0aW1hZ2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0b3JkZXJlZGxpc3QuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pbnNlcnRvcmRlcmVkbGlzdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMDMxYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0b3JkZXJlZGxpc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0dGFibGUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pbnNlcnR0YWJsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhNzdmNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0dGFibGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaW5zZXJ0dW5vcmRlcmVkbGlzdC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2luc2VydHVub3JkZXJlZGxpc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDA3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2luc2VydHVub3JkZXJlZGxpc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaXRhbGljLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvaXRhbGljLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FiMDBjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9pdGFsaWMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeWNlbnRlci5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2p1c3RpZnljZW50ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzkzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2p1c3RpZnljZW50ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeWZ1bGwuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9qdXN0aWZ5ZnVsbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZDg1OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeWZ1bGwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeWxlZnQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9qdXN0aWZ5bGVmdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiODU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeWxlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeXJpZ2h0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvanVzdGlmeXJpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU2Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9qdXN0aWZ5cmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGVmdF90b19yaWdodC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xlZnRfdG9fcmlnaHQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYmFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xlZnRfdG9fcmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9idWxsZXRfaW5kZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9idWxsZXRfaW5kZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMwNmNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9saXN0X2J1bGxldF9pbmRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9idWxsZXRfb3V0ZGVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xpc3RfYnVsbGV0X291dGRlbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTA1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xpc3RfYnVsbGV0X291dGRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9udW1faW5kZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9udW1faW5kZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM3NDFhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9saXN0X251bV9pbmRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvbGlzdF9udW1fb3V0ZGVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xpc3RfbnVtX291dGRlbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTUwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL2xpc3RfbnVtX291dGRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvb3V0ZGVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL291dGRlbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2I0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL291dGRlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcGFzdGUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9wYXN0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzNmNiZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcGFzdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcmVkby5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3JlZG8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjAwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3JlZG8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcmVtb3ZlZm9ybWF0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcmVtb3ZlZm9ybWF0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGJiNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9yZW1vdmVmb3JtYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvcmlnaHRfdG9fbGVmdC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3JpZ2h0X3RvX2xlZnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3JpZ2h0X3RvX2xlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc2F2ZS5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3NhdmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3NhdmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc2VwLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc2VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI2NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9zZXAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3BhY2UuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9zcGFjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmZDY3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3BhY2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3RyaWtldGhyb3VnaC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3N0cmlrZXRocm91Z2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3N0cmlrZXRocm91Z2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3Vic2NyaXB0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3Vic2NyaXB0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzNkMzQwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9zdWJzY3JpcHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3VwZXJzY3JpcHQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy9zdXBlcnNjcmlwdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMjRkYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvc3VwZXJzY3JpcHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvdW5kZXJsaW5lLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvdW5kZXJsaW5lLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzIzODc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy91bmRlcmxpbmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvdW5kby5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3VuZG8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmViYTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9idXR0b25zL3VuZG8uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvd2lraXdvcmQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvYnV0dG9ucy93aWtpd29yZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3NDFkMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2J1dHRvbnMvd2lraXdvcmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2NoZWNrLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2NoZWNrLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ViZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvY2hlY2suZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2RlY3JlbWVudE1vbnRoLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2RlY3JlbWVudE1vbnRoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTVkODY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvZGVjcmVtZW50TW9udGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2RlY3JlbWVudFdlZWsuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvZGVjcmVtZW50V2Vlay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYjhhMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2RlY3JlbWVudFdlZWsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2dyYWJDb3JuZXIuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvZ3JhYkNvcm5lci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NTNjNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2dyYWJDb3JuZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL1RyZWUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvVHJlZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxOTU2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL1RyZWUuY3NzCkBAIC0wLDAgKzEsMzYgQEAKKworLmRvam9UcmVlIHsKKwlmb250OiBjYXB0aW9uOworCWZvbnQtc2l6ZTogMTFweDsKKwlmb250LXdlaWdodDogbm9ybWFsOworCW92ZXJmbG93OiBhdXRvOworfQorCisKKy5kb2pvVHJlZU5vZGVMYWJlbFRpdGxlIHsKKwlwYWRkaW5nLWxlZnQ6IDJweDsKKwljb2xvcjogV2luZG93VGV4dDsKK30KKworLmRvam9UcmVlTm9kZUxhYmVsIHsKKwljdXJzb3I6aGFuZDsKKwljdXJzb3I6cG9pbnRlcjsKK30KKworLmRvam9UcmVlTm9kZUxhYmVsVGl0bGU6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisuZG9qb1RyZWVOb2RlTGFiZWxTZWxlY3RlZCB7CisJYmFja2dyb3VuZC1jb2xvcjogSGlnaGxpZ2h0OworCWNvbG9yOiBIaWdobGlnaHRUZXh0OworfQorCisuZG9qb1RyZWUgZGl2IHsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisuZG9qb1RyZWUgaW1nLCAuZG9qb1RyZWVOb2RlTGFiZWwgaW1nIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9ibGFuay5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9ibGFuay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwYWI5NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL2JsYW5rLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9jbG9zZWQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvY2xvc2VkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvY2xvc2VkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9kb2N1bWVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9kb2N1bWVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1N2FmYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL2RvY3VtZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9taW51cy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9taW51cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiNTg2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL21pbnVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9wbHVzLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3BsdXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjAwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS9wbHVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmFuc3BhcmVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmFuc3BhcmVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwY2MyNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyYW5zcGFyZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ibGFuay5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ibGFuay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4NDhiYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2JsYW5rLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9jaGlsZC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9jaGlsZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkYTZkYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2NoaWxkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfbWludXMuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZXhwYW5kX21pbnVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZThmOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZXhwYW5kX21pbnVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfcGx1cy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfcGx1cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmOTBhZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2V4cGFuZF9wbHVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX2MuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9jLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc3Y2VhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9jLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX2wuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBhZThkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9sLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3AuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9wLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA2NzYwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9wLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3QuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF90LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjljNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF90LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3YuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF92LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNhYTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF92LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3guZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF94LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDllZTljCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF94LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3kuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF95LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNlZmJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF95LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3ouZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF96LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjIzYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF96LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9sb2FkaW5nLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2xvYWRpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTg2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9sb2FkaW5nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9sb2FkaW5nLmpwZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2xvYWRpbmcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzkxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9sb2FkaW5nLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2Nsb3NlZC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2Nsb3NlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZDY0NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvY2xvc2VkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2RvY3VtZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZG9jdW1lbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2RvY3VtZW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9sZWFmLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX2xlYWYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDllYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9sZWFmLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9sb2FkaW5nLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX2xvYWRpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDUzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9sb2FkaW5nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9taW51cy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9taW51cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiNmNmMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX21pbnVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9wbHVzLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvZXhwYW5kX3BsdXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmE4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2V4cGFuZF9wbHVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2kuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM2YTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfYmhhbGYuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pX2JoYWxmLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjlmOGFhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9pX2JoYWxmLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfaGFsZi5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfaGFsZi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkMzk1YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvaV9oYWxmLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfbG9uZy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2lfbG9uZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMjc4NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvaV9sb25nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL2wuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDdjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9sLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL21pbnVzLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9UcmVlVjMvbWludXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL21pbnVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL29wZW4uZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9vcGVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNmOTMwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9vcGVuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL3BsdXMuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9wbHVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDllYmQxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy9wbHVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL3QuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy90LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzcyMjAxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy90LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvVHJlZVYzL3guZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy94LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA5ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL1RyZWVWMy94LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvYmFyLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9iYXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWJkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvYmFyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvYmRZZWFyQmcuMS5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvYmRZZWFyQmcuMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9iZFllYXJCZy4xLmdpZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2JkWWVhckJnLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9iZFllYXJCZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmZjk3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9iZFllYXJCZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2JsYW5rLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9ibGFuay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2NTgyNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9ibGFuay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Nsb2NrLnBuZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9jbG9jay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkNTMzNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9jbG9jay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2NvbWJvX2JveF9hcnJvdy5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvY29tYm9fYm94X2Fycm93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk0ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2NvbWJvX2JveF9hcnJvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RhdGVJY29uLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kYXRlSWNvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxZjMxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kYXRlSWNvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RlY3JlbWVudE1vbnRoLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kZWNyZW1lbnRNb250aC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3MGU4MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kZWNyZW1lbnRNb250aC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RlY3JlbWVudE1vbnRoLnBuZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kZWNyZW1lbnRNb250aC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4MDE2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kZWNyZW1lbnRNb250aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQmcuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYWNjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBCZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVCTC5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBDdXJ2ZUJMLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNmZTgwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVCTC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVCUi5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBDdXJ2ZUJSLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWNjMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVCUi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVUTC5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBDdXJ2ZVRMLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVUTC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVUUi5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBDdXJ2ZVRSLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZiMGFhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwQ3VydmVUUi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwSG9yaXpMaW5lLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcEhvcml6TGluZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiZjY4MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcEhvcml6TGluZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwSG9yaXpMaW5lRm9vdC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBIb3JpekxpbmVGb290LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDk5YWViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwSG9yaXpMaW5lRm9vdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBNb250aEJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ4YTkxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZy5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBNb250aEJnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYzODEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZzIucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwTW9udGhCZzIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjM4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBNb250aEJnMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwVmVydExpbmUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwVmVydExpbmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2FmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZHBWZXJ0TGluZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwWWVhckJnLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcFllYXJCZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmZjk3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcFllYXJCZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2RwWWVhckJnLnBuZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcFllYXJCZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxZjc1MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcFllYXJCZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Ryb3Bkb3duQnV0dG9uc0Fycm93LWRpc2FibGVkLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcm9wZG93bkJ1dHRvbnNBcnJvdy1kaXNhYmxlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NDQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcm9wZG93bkJ1dHRvbnNBcnJvdy1kaXNhYmxlZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Ryb3Bkb3duQnV0dG9uc0Fycm93LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcm9wZG93bkJ1dHRvbnNBcnJvdy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2NDE4MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9kcm9wZG93bkJ1dHRvbnNBcnJvdy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Zsb2F0aW5nUGFuZUNsb3NlLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVDbG9zZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3NjU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVDbG9zZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Zsb2F0aW5nUGFuZU1heGltaXplLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVNYXhpbWl6ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1Y2VjMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVNYXhpbWl6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Zsb2F0aW5nUGFuZU1pbmltaXplLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVNaW5pbWl6ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMGIzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9mbG9hdGluZ1BhbmVNaW5pbWl6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Zsb2F0aW5nUGFuZVJlc3RvcmUuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2Zsb2F0aW5nUGFuZVJlc3RvcmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjA0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvZmxvYXRpbmdQYW5lUmVzdG9yZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2gtYmFyLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9oLWJhci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViYmRmMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9oLWJhci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2luY3JlbWVudE1vbnRoLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxMGUzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL2luY3JlbWVudE1vbnRoLnBuZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzOTkxMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL25vLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9uby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMWExNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9uby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL25vLnN2ZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9uby5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9uby5zdmcKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiIFsKKwk8IUVOVElUWSBuc19zdmcgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KKwk8IUVOVElUWSBuc194bGluayAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CitdPgorPHN2ZyAgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9IiZuc19zdmc7IiB4bWxuczp4bGluaz0iJm5zX3hsaW5rOyIgd2lkdGg9IjE1LjQzMyIgaGVpZ2h0PSIxNS40MzMiCisJIHZpZXdCb3g9IjAgMCAxNS40MzMgMTUuNDMzIiBvdmVyZmxvdz0idmlzaWJsZSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTUuNDMzIDE1LjQzMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Cis8Y2lyY2xlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0QwMjAyNiIgc3Ryb2tlLXdpZHRoPSIyIiBjeD0iNy43MTYiIGN5PSI3LjcxNiIgcj0iNi43MTYiLz4KKzxsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0QwMjAyNiIgc3Ryb2tlLXdpZHRoPSIyIiB4MT0iMy4wMiIgeTE9IjEyLjM1MiIgeDI9IjEyLjYzOSIgeTI9IjIuNzMyIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zY0JhY2tncm91bmQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NjQmFja2dyb3VuZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMTI4OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zY0JhY2tncm91bmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYmctcHJvZ3Jlc3MtdmVydC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLXByb2dyZXNzLXZlcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODZjODgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLXByb2dyZXNzLXZlcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYmctdmVydC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLXZlcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWY0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyLWJnLXZlcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYmcuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlci1iZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4MTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLWhvcnoucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlci1idXR0b24taG9yei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4Y2IxZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLWhvcnoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLXZlcnQucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlci1idXR0b24tdmVydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MGJmZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLXZlcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLnBuZyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXItYnV0dG9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmRmYTFiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlci1idXR0b24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXIuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZjMyZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfZG93bl9hcnJvdy5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyX2Rvd25fYXJyb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZmYzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyX2Rvd25fYXJyb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfbGVmdF9hcnJvdy5wbmcgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyX2xlZnRfYXJyb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNmE2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc2xpZGVyX2xlZnRfYXJyb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfcmlnaHRfYXJyb3cucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlcl9yaWdodF9hcnJvdy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzMWZmZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfcmlnaHRfYXJyb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfdXBfYXJyb3cucG5nIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NsaWRlcl91cF9hcnJvdy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhMTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zbGlkZXJfdXBfYXJyb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjY29yZGlvbk9mZi5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFBY2NvcmRpb25PZmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjJlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFBY2NvcmRpb25PZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjY29yZGlvblNlbGVjdGVkLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjY29yZGlvblNlbGVjdGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNkNWExCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQWNjb3JkaW9uU2VsZWN0ZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1jLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1jLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY5Y2MxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQWN0aXZlLWMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1sLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ4ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQWN0aXZlLWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1yLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUFjdGl2ZS1yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNkNWVlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQWN0aXZlLXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJhckJnLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJhckJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE3YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQmFyQmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1jLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1jLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWUwODI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQnV0dG9uLWMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1sLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA3ZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQnV0dG9uLWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1yLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYUJ1dHRvbi1yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjljYjNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhQnV0dG9uLXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLWMuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhRGlzYWJsZWQtYy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkYjQzYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLWMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLWwuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhRGlzYWJsZWQtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwYWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLXIuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NvcmlhRGlzYWJsZWQtci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiM2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYURpc2FibGVkLXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYU1lbnVCZy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFNZW51QmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NmE5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFNZW51QmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYVByZXNzZWQtYy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLWMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTE2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLWMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYVByZXNzZWQtbC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTliYmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zb3JpYVByZXNzZWQtci5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGVlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc29yaWFQcmVzc2VkLXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zcGlubmVyRGVjcmVtZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zcGlubmVyRGVjcmVtZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM5ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NwaW5uZXJEZWNyZW1lbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zcGlubmVySW5jcmVtZW50LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zcGlubmVySW5jcmVtZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmMyMzdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3NwaW5uZXJJbmNyZW1lbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zdWJtZW51X2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zdWJtZW51X2Rpc2FibGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmNDVmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3N1Ym1lbnVfZGlzYWJsZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zdWJtZW51X29mZi5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc3VibWVudV9vZmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzU5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvc3VibWVudV9vZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zdWJtZW51X29uLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy9zdWJtZW51X29uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmE1N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3N1Ym1lbnVfb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X2xlZnQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9ib3RfbGVmdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYWIzOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X2xlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X2xlZnRfY3Vyci5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2JvdF9sZWZ0X2N1cnIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzlkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2JvdF9sZWZ0X2N1cnIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X3JpZ2h0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X3JpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmMwNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9ib3RfcmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X3JpZ2h0X2N1cnIuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9ib3RfcmlnaHRfY3Vyci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MWVmZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfYm90X3JpZ2h0X2N1cnIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfY2xvc2UuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9jbG9zZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiMGNiOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfY2xvc2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfY2xvc2VfaC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2Nsb3NlX2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTAwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2Nsb3NlX2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfbGVmdC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2xlZnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDA5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX2xlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfbGVmdF9yLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfbGVmdF9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZhYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9sZWZ0X3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfbGVmdF9yX2N1cnIuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9sZWZ0X3JfY3Vyci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3OWQyNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfbGVmdF9yX2N1cnIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfcmlnaHQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9yaWdodC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhYjM4NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfcmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfcmlnaHRfci5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX3JpZ2h0X3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzA3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGFiX3JpZ2h0X3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfcmlnaHRfcl9jdXJyLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfcmlnaHRfcl9jdXJyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYxZWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl9yaWdodF9yX2N1cnIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfdG9wX2xlZnQuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl90b3BfbGVmdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmZmNhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfdG9wX2xlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FiMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RhYl90b3BfcmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90aW1lSWNvbi5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGltZUljb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTFhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdGltZUljb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90b29sYmFyLWJnLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90b29sYmFyLWJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNjZDQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3Rvb2xiYXItYmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmFuc3BhcmVudC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJhbnNwYXJlbnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGNjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJhbnNwYXJlbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ibGFuay5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfYmxhbmsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODQ4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfYmxhbmsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9jaGlsZC5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfY2hpbGQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZGE2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfY2hpbGQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9leHBhbmRfbWludXMuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2V4cGFuZF9taW51cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4ZjhkOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9leHBhbmRfbWludXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9leHBhbmRfcGx1cy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfZXhwYW5kX3BsdXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjkwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdHJlZW5vZGVfZXhwYW5kX3BsdXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX2MuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfYy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3N2NlYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX2MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX2wuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwYWU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3AuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfcC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwNjc2MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3AuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3QuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5YzU4OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3YuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfdi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzYWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3YuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3guZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfeC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ZWU5YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3kuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfeS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzZWZiYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3kuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3ouZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX2dyaWRfei5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyM2IzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ncmlkX3ouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ub2RlLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy90cmVlbm9kZV9ub2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWM3ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW1hZ2VzL3RyZWVub2RlX25vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy92ZXJ0aWNhbGJhci5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdmVydGljYWxiYXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTQ0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvdmVydGljYWxiYXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2ltYWdlcy93aGl0ZURvd25BcnJvdy5naWYgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvd2hpdGVEb3duQXJyb3cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Mzk4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3RlbXBsYXRlcy9pbWFnZXMvd2hpdGVEb3duQXJyb3cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2luY3JlbWVudE1vbnRoLmdpZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2luY3JlbWVudE1vbnRoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZlMjBkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW5jcmVtZW50TW9udGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2luY3JlbWVudFdlZWsuZ2lmIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvaW5jcmVtZW50V2Vlay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmMWIyNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL2luY3JlbWVudFdlZWsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL3JpY2h0ZXh0ZnJhbWUuaHRtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdGVtcGxhdGVzL3JpY2h0ZXh0ZnJhbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTMwNjIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3dpZGdldC90ZW1wbGF0ZXMvcmljaHRleHRmcmFtZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0gPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gLS0+CisKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iIAorCSJEVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWw+CisJPGhlYWQ+CisJCTx0aXRsZT48L3RpdGxlPgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisJCQlmdW5jdGlvbiBpbml0KCl7CisJCQkJZG9jdW1lbnQuZGVzaWduTW9kZSA9ICdvbic7CisJCQkJdHJ5eworCQkJCQlwYXJlbnRQYWdlRG9tYWluID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpWzFdOworCQkJCQlpZihwYXJlbnRQYWdlRG9tYWluKXsKKwkJCQkJCWRvY3VtZW50LmRvbWFpbiA9IHBhcmVudFBhZ2VEb21haW47CisJCQkJCX0KKwkJCQl9Y2F0Y2goZSl7IH0KKwkJCX0KKwkJCXdpbmRvdy5vbmxvYWQgPSBpbml0OworCQk8L3NjcmlwdD4KKwk8L2hlYWQ+CisJPGJvZHk+CisJCTxiciAvPgorCTwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdmFsaWRhdGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3ZhbGlkYXRlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTkyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3ZhbGlkYXRlLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LnZhbGlkYXRlIik7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LnZhbGlkYXRlIiwgInVzZSBvbmUgb2YgdGhlIHNwZWNpZmljIHdpZGdldHMgaW4gZG9qby53aWRnZXQuPG5hbWU+VGV4dGJveCBpbnN0ZWFkIiwgIjAuNSIpOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3ZtbC9DaGFydC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy93aWRnZXQvdm1sL0NoYXJ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMvd2lkZ2V0L3ZtbC9DaGFydC5qcwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQudm1sLkNoYXJ0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ2hhcnQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5tYXRoIik7Citkb2pvLnJlcXVpcmUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5nZnguY29sb3IiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQudm1sLkNoYXJ0IiwgW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LkNoYXJ0XSwgZnVuY3Rpb24gKCkgeworCXRoaXMudGVtcGxhdGVQYXRoID0gbnVsbDsKKwl0aGlzLnRlbXBsYXRlQ3NzUGF0aCA9IG51bGw7CisJdGhpcy5faXNJbml0aWFsaXplID0gZmFsc2U7CisJdGhpcy5oYXNEYXRhID0gZmFsc2U7CisJdGhpcy52ZWN0b3JOb2RlID0gbnVsbDsKKwl0aGlzLnBsb3RBcmVhID0gbnVsbDsKKwl0aGlzLmRhdGFHcm91cCA9IG51bGw7CisJdGhpcy5heGlzR3JvdXAgPSBudWxsOworCXRoaXMucHJvcGVydGllcyA9IHtoZWlnaHQ6MCwgd2lkdGg6MCwgZGVmYXVsdFdpZHRoOjYwMCwgZGVmYXVsdEhlaWdodDo0MDAsIHBsb3RUeXBlOm51bGwsIHBhZGRpbmc6e3RvcDoxMCwgYm90dG9tOjIsIGxlZnQ6NjAsIHJpZ2h0OjMwfSwgYXhlczp7eDp7cGxvdEF0OjAsIGxhYmVsOiIiLCB1bml0TGFiZWw6IiIsIHVuaXRUeXBlOk51bWJlciwgblVuaXRzVG9TaG93OjEwLCByYW5nZTp7bWluOjAsIG1heDoyMDB9fSwgeTp7cGxvdEF0OjAsIGxhYmVsOiIiLCB1bml0TGFiZWw6IiIsIHVuaXRUeXBlOk51bWJlciwgblVuaXRzVG9TaG93OjEwLCByYW5nZTp7bWluOjAsIG1heDoyMDB9fX19OworfSwge3BhcnNlUHJvcGVydGllczpmdW5jdGlvbiAobm9kZSkgeworCXZhciBiUmFuZ2VYID0gZmFsc2U7CisJdmFyIGJSYW5nZVkgPSBmYWxzZTsKKwlpZiAobm9kZS5nZXRBdHRyaWJ1dGUoIndpZHRoIikpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzLndpZHRoID0gbm9kZS5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CisJfQorCWlmIChub2RlLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IikpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKKwl9CisJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJwbG90VHlwZSIpKSB7CisJCXRoaXMucHJvcGVydGllcy5wbG90VHlwZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJwbG90VHlwZSIpOworCX0KKwlpZiAobm9kZS5nZXRBdHRyaWJ1dGUoInBhZGRpbmciKSkgeworCQlpZiAobm9kZS5nZXRBdHRyaWJ1dGUoInBhZGRpbmciKS5pbmRleE9mKCIsIikgPiAtMSkgeworCQkJdmFyIHAgPSBub2RlLmdldEF0dHJpYnV0ZSgicGFkZGluZyIpLnNwbGl0KCIsIik7CisJCX0gZWxzZSB7CisJCQl2YXIgcCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJwYWRkaW5nIikuc3BsaXQoIiAiKTsKKwkJfQorCQlpZiAocC5sZW5ndGggPT0gMSkgeworCQkJdmFyIHBhZCA9IHBhcnNlRmxvYXQocFswXSk7CisJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy50b3AgPSBwYWQ7CisJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5yaWdodCA9IHBhZDsKKwkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSA9IHBhZDsKKwkJCXRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgPSBwYWQ7CisJCX0gZWxzZSB7CisJCQlpZiAocC5sZW5ndGggPT0gMikgeworCQkJCXZhciBwYWRWID0gcGFyc2VGbG9hdChwWzBdKTsKKwkJCQl2YXIgcGFkSCA9IHBhcnNlRmxvYXQocFsxXSk7CisJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wID0gcGFkVjsKKwkJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5yaWdodCA9IHBhZEg7CisJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcuYm90dG9tID0gcGFkVjsKKwkJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5sZWZ0ID0gcGFkSDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHAubGVuZ3RoID09IDQpIHsKKwkJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wID0gcGFyc2VGbG9hdChwWzBdKTsKKwkJCQkJdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcucmlnaHQgPSBwYXJzZUZsb2F0KHBbMV0pOworCQkJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5ib3R0b20gPSBwYXJzZUZsb2F0KHBbMl0pOworCQkJCQl0aGlzLnByb3BlcnRpZXMucGFkZGluZy5sZWZ0ID0gcGFyc2VGbG9hdChwWzNdKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJyYW5nZVgiKSkgeworCQl2YXIgcCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJyYW5nZVgiKTsKKwkJaWYgKHAuaW5kZXhPZigiLCIpID4gLTEpIHsKKwkJCXAgPSBwLnNwbGl0KCIsIik7CisJCX0gZWxzZSB7CisJCQlwID0gcC5zcGxpdCgiICIpOworCQl9CisJCXRoaXMucHJvcGVydGllcy5heGVzLngucmFuZ2UubWluID0gcGFyc2VGbG9hdChwWzBdKTsKKwkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5tYXggPSBwYXJzZUZsb2F0KHBbMV0pOworCQliUmFuZ2VYID0gdHJ1ZTsKKwl9CisJaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJyYW5nZVkiKSkgeworCQl2YXIgcCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJyYW5nZVkiKTsKKwkJaWYgKHAuaW5kZXhPZigiLCIpID4gLTEpIHsKKwkJCXAgPSBwLnNwbGl0KCIsIik7CisJCX0gZWxzZSB7CisJCQlwID0gcC5zcGxpdCgiICIpOworCQl9CisJCXRoaXMucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWluID0gcGFyc2VGbG9hdChwWzBdKTsKKwkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueS5yYW5nZS5tYXggPSBwYXJzZUZsb2F0KHBbMV0pOworCQliUmFuZ2VZID0gdHJ1ZTsKKwl9CisJcmV0dXJuIHtyYW5nZVg6YlJhbmdlWCwgcmFuZ2VZOmJSYW5nZVl9OworfSwgc2V0QXhlc1Bsb3Q6ZnVuY3Rpb24gKHRhYmxlKSB7CisJaWYgKHRhYmxlLmdldEF0dHJpYnV0ZSgiYXhpc0F0IikpIHsKKwkJdmFyIHAgPSB0YWJsZS5nZXRBdHRyaWJ1dGUoImF4aXNBdCIpOworCQlpZiAocC5pbmRleE9mKCIsIikgPiAtMSkgeworCQkJcCA9IHAuc3BsaXQoIiwiKTsKKwkJfSBlbHNlIHsKKwkJCXAgPSBwLnNwbGl0KCIgIik7CisJCX0KKwkJaWYgKCFpc05hTihwYXJzZUZsb2F0KHBbMF0pKSkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQgPSBwYXJzZUZsb2F0KHBbMF0pOworCQl9IGVsc2UgeworCQkJaWYgKHBbMF0udG9Mb3dlckNhc2UoKSA9PSAieW1pbiIpIHsKKwkJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCA9IHRoaXMucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWluOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocFswXS50b0xvd2VyQ2FzZSgpID09ICJ5bWF4IikgeworCQkJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCA9IHRoaXMucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWF4OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWlzTmFOKHBhcnNlRmxvYXQocFsxXSkpKSB7CisJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy55LnBsb3RBdCA9IHBhcnNlRmxvYXQocFsxXSk7CisJCX0gZWxzZSB7CisJCQlpZiAocFsxXS50b0xvd2VyQ2FzZSgpID09ICJ4bWluIikgeworCQkJCXRoaXMucHJvcGVydGllcy5heGVzLnkucGxvdEF0ID0gdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5taW47CisJCQl9IGVsc2UgeworCQkJCWlmIChwWzFdLnRvTG93ZXJDYXNlKCkgPT0gInhtYXgiKSB7CisJCQkJCXRoaXMucHJvcGVydGllcy5heGVzLnkucGxvdEF0ID0gdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5tYXg7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5wbG90QXQgPSB0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1pbjsKKwkJdGhpcy5wcm9wZXJ0aWVzLmF4ZXMueS5wbG90QXQgPSB0aGlzLnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1pbjsKKwl9Cit9LCBkcmF3VmVjdG9yTm9kZTpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMudmVjdG9yTm9kZSkgeworCQl0aGlzLmRlc3Ryb3koKTsKKwl9CisJdGhpcy52ZWN0b3JOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdGhpcy52ZWN0b3JOb2RlLnN0eWxlLndpZHRoID0gdGhpcy5wcm9wZXJ0aWVzLndpZHRoICsgInB4IjsKKwl0aGlzLnZlY3Rvck5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCArICJweCI7CisJdGhpcy52ZWN0b3JOb2RlLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy52ZWN0b3JOb2RlKTsKK30sIGRyYXdQbG90QXJlYTpmdW5jdGlvbiAoKSB7CisJdmFyIHBsb3RXaWR0aCA9IHRoaXMucHJvcGVydGllcy53aWR0aCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5yaWdodDsKKwl2YXIgcGxvdEhlaWdodCA9IHRoaXMucHJvcGVydGllcy5oZWlnaHQgLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy50b3AgLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5ib3R0b207CisJaWYgKHRoaXMucGxvdEFyZWEpIHsKKwkJdGhpcy5wbG90QXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxvdEFyZWEpOworCQl0aGlzLnBsb3RBcmVhID0gbnVsbDsKKwl9CisJdGhpcy5wbG90QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXRoaXMucGxvdEFyZWEuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCXRoaXMucGxvdEFyZWEuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNmZmYiOworCXRoaXMucGxvdEFyZWEuc3R5bGUudG9wID0gKHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCkgLSAyICsgInB4IjsKKwl0aGlzLnBsb3RBcmVhLnN0eWxlLmxlZnQgPSAodGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCAtIDEpICsgInB4IjsKKwl0aGlzLnBsb3RBcmVhLnN0eWxlLndpZHRoID0gcGxvdFdpZHRoICsgInB4IjsKKwl0aGlzLnBsb3RBcmVhLnN0eWxlLmhlaWdodCA9IHBsb3RIZWlnaHQgKyAicHgiOworCXRoaXMucGxvdEFyZWEuc3R5bGUuY2xpcCA9ICJyZWN0KDAgIiArIHBsb3RXaWR0aCArICIgIiArIHBsb3RIZWlnaHQgKyAiIDApIjsKKwl0aGlzLnZlY3Rvck5vZGUuYXBwZW5kQ2hpbGQodGhpcy5wbG90QXJlYSk7Cit9LCBkcmF3RGF0YUdyb3VwOmZ1bmN0aW9uICgpIHsKKwl2YXIgcGxvdFdpZHRoID0gdGhpcy5wcm9wZXJ0aWVzLndpZHRoIC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0OworCXZhciBwbG90SGVpZ2h0ID0gdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbTsKKwlpZiAodGhpcy5kYXRhR3JvdXApIHsKKwkJdGhpcy5kYXRhR3JvdXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRhdGFHcm91cCk7CisJCXRoaXMuZGF0YUdyb3VwID0gbnVsbDsKKwl9CisJdGhpcy5kYXRhR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl0aGlzLmRhdGFHcm91cC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdGhpcy5kYXRhR3JvdXAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICJEYXRhIEdyb3VwIik7CisJdGhpcy5kYXRhR3JvdXAuc3R5bGUudG9wID0gIjBweCI7CisJdGhpcy5kYXRhR3JvdXAuc3R5bGUubGVmdCA9ICIwcHgiOworCXRoaXMuZGF0YUdyb3VwLnN0eWxlLndpZHRoID0gcGxvdFdpZHRoICsgInB4IjsKKwl0aGlzLmRhdGFHcm91cC5zdHlsZS5oZWlnaHQgPSBwbG90SGVpZ2h0ICsgInB4IjsKKwl0aGlzLnBsb3RBcmVhLmFwcGVuZENoaWxkKHRoaXMuZGF0YUdyb3VwKTsKK30sIGRyYXdBeGVzOmZ1bmN0aW9uICgpIHsKKwl2YXIgcGxvdFdpZHRoID0gdGhpcy5wcm9wZXJ0aWVzLndpZHRoIC0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0OworCXZhciBwbG90SGVpZ2h0ID0gdGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLnRvcCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbTsKKwlpZiAodGhpcy5heGlzR3JvdXApIHsKKwkJdGhpcy5heGlzR3JvdXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmF4aXNHcm91cCk7CisJCXRoaXMuYXhpc0dyb3VwID0gbnVsbDsKKwl9CisJdGhpcy5heGlzR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwl0aGlzLmF4aXNHcm91cC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdGhpcy5heGlzR3JvdXAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICJBeGlzIEdyb3VwIik7CisJdGhpcy5heGlzR3JvdXAuc3R5bGUudG9wID0gIjBweCI7CisJdGhpcy5heGlzR3JvdXAuc3R5bGUubGVmdCA9ICIwcHgiOworCXRoaXMuYXhpc0dyb3VwLnN0eWxlLndpZHRoID0gcGxvdFdpZHRoICsgInB4IjsKKwl0aGlzLmF4aXNHcm91cC5zdHlsZS5oZWlnaHQgPSBwbG90SGVpZ2h0ICsgInB4IjsKKwl0aGlzLnBsb3RBcmVhLmFwcGVuZENoaWxkKHRoaXMuYXhpc0dyb3VwKTsKKwl2YXIgc3Ryb2tlID0gMTsKKwl2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6bGluZSIpOworCXZhciB5ID0gZG9qby53aWRnZXQudm1sLkNoYXJ0LlBsb3R0ZXIuZ2V0WSh0aGlzLnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCwgdGhpcyk7CisJbGluZS5zZXRBdHRyaWJ1dGUoImZyb20iLCAiMHB4LCIgKyB5ICsgInB4Iik7CisJbGluZS5zZXRBdHRyaWJ1dGUoInRvIiwgcGxvdFdpZHRoICsgInB4LCIgKyB5ICsgInB4Iik7CisJbGluZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJbGluZS5zdHlsZS50b3AgPSAiMHB4IjsKKwlsaW5lLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwlsaW5lLnN0eWxlLmFudGlhbGlhcyA9ICJmYWxzZSI7CisJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZWNvbG9yIiwgIiM2NjYiKTsKKwlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0Iiwgc3Ryb2tlICogMiArICJweCIpOworCXRoaXMuYXhpc0dyb3VwLmFwcGVuZENoaWxkKGxpbmUpOworCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpsaW5lIik7CisJdmFyIHggPSBkb2pvLndpZGdldC52bWwuQ2hhcnQuUGxvdHRlci5nZXRYKHRoaXMucHJvcGVydGllcy5heGVzLnkucGxvdEF0LCB0aGlzKTsKKwlsaW5lLnNldEF0dHJpYnV0ZSgiZnJvbSIsIHggKyAicHgsMHB4Iik7CisJbGluZS5zZXRBdHRyaWJ1dGUoInRvIiwgeCArICJweCwiICsgcGxvdEhlaWdodCArICJweCIpOworCWxpbmUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCWxpbmUuc3R5bGUudG9wID0gIjBweCI7CisJbGluZS5zdHlsZS5sZWZ0ID0gIjBweCI7CisJbGluZS5zdHlsZS5hbnRpYWxpYXMgPSAiZmFsc2UiOworCWxpbmUuc2V0QXR0cmlidXRlKCJzdHJva2Vjb2xvciIsICIjNjY2Iik7CisJbGluZS5zZXRBdHRyaWJ1dGUoInN0cm9rZXdlaWdodCIsIHN0cm9rZSAqIDIgKyAicHgiKTsKKwl0aGlzLmF4aXNHcm91cC5hcHBlbmRDaGlsZChsaW5lKTsKKwl2YXIgc2l6ZSA9IDEwOworCXZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdC5zdHlsZS50b3AgPSAodGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSkgKyAicHgiOworCXQuc3R5bGUubGVmdCA9IHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgKyAicHgiOworCXQuc3R5bGUuZm9udEZhbWlseSA9ICJzYW5zLXNlcmlmIjsKKwl0LnN0eWxlLmZvbnRTaXplID0gc2l6ZSArICJweCI7CisJdC5pbm5lckhUTUwgPSBkb2pvLm1hdGgucm91bmQocGFyc2VGbG9hdCh0aGlzLnByb3BlcnRpZXMuYXhlcy54LnJhbmdlLm1pbiksIDIpOworCXRoaXMudmVjdG9yTm9kZS5hcHBlbmRDaGlsZCh0KTsKKwl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdC5zdHlsZS50b3AgPSAodGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSkgKyAicHgiOworCXQuc3R5bGUubGVmdCA9ICh0aGlzLnByb3BlcnRpZXMud2lkdGggLSB0aGlzLnByb3BlcnRpZXMucGFkZGluZy5yaWdodCAtIHNpemUpICsgInB4IjsKKwl0LnN0eWxlLmZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiI7CisJdC5zdHlsZS5mb250U2l6ZSA9IHNpemUgKyAicHgiOworCXQuaW5uZXJIVE1MID0gZG9qby5tYXRoLnJvdW5kKHBhcnNlRmxvYXQodGhpcy5wcm9wZXJ0aWVzLmF4ZXMueC5yYW5nZS5tYXgpLCAyKTsKKwl0aGlzLnZlY3Rvck5vZGUuYXBwZW5kQ2hpbGQodCk7CisJdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCXQuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCXQuc3R5bGUudG9wID0gKHNpemUgLyAyKSArICJweCI7CisJdC5zdHlsZS5sZWZ0ID0gIjBweCI7CisJdC5zdHlsZS53aWR0aCA9IHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmxlZnQgKyAicHgiOworCXQuc3R5bGUudGV4dEFsaWduID0gInJpZ2h0IjsKKwl0LnN0eWxlLnBhZGRpbmdSaWdodCA9ICI0cHgiOworCXQuc3R5bGUuZm9udEZhbWlseSA9ICJzYW5zLXNlcmlmIjsKKwl0LnN0eWxlLmZvbnRTaXplID0gc2l6ZSArICJweCI7CisJdC5pbm5lckhUTUwgPSBkb2pvLm1hdGgucm91bmQocGFyc2VGbG9hdCh0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlLm1heCksIDIpOworCXRoaXMudmVjdG9yTm9kZS5hcHBlbmRDaGlsZCh0KTsKKwl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJdC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJdC5zdHlsZS50b3AgPSAodGhpcy5wcm9wZXJ0aWVzLmhlaWdodCAtIHRoaXMucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbSAtIHNpemUpICsgInB4IjsKKwl0LnN0eWxlLmxlZnQgPSAiMHB4IjsKKwl0LnN0eWxlLndpZHRoID0gdGhpcy5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdCArICJweCI7CisJdC5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOworCXQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gIjRweCI7CisJdC5zdHlsZS5mb250RmFtaWx5ID0gInNhbnMtc2VyaWYiOworCXQuc3R5bGUuZm9udFNpemUgPSBzaXplICsgInB4IjsKKwl0LmlubmVySFRNTCA9IGRvam8ubWF0aC5yb3VuZChwYXJzZUZsb2F0KHRoaXMucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWluKSwgMik7CisJdGhpcy52ZWN0b3JOb2RlLmFwcGVuZENoaWxkKHQpOworfSwgaW5pdDpmdW5jdGlvbiAoKSB7CisJaWYgKCF0aGlzLnByb3BlcnRpZXMud2lkdGggfHwgIXRoaXMucHJvcGVydGllcy5oZWlnaHQpIHsKKwkJdmFyIGJveCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuZG9tTm9kZSk7CisJCWlmICghdGhpcy5wcm9wZXJ0aWVzLndpZHRoKSB7CisJCQl0aGlzLnByb3BlcnRpZXMud2lkdGggPSAoYm94LndpZHRoIDwgMzIpID8gdGhpcy5wcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aCA6IGJveC53aWR0aDsKKwkJfQorCQlpZiAoIXRoaXMucHJvcGVydGllcy5oZWlnaHQpIHsKKwkJCXRoaXMucHJvcGVydGllcy5oZWlnaHQgPSAoYm94LmhlaWdodCA8IDMyKSA/IHRoaXMucHJvcGVydGllcy5kZWZhdWx0SGVpZ2h0IDogYm94LmhlaWdodDsKKwkJfQorCX0KKwl0aGlzLmRyYXdWZWN0b3JOb2RlKCk7CisJdGhpcy5kcmF3UGxvdEFyZWEoKTsKKwl0aGlzLmRyYXdEYXRhR3JvdXAoKTsKKwl0aGlzLmRyYXdBeGVzKCk7CisJdGhpcy5hc3NpZ25Db2xvcnMoKTsKKwl0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30sIGRlc3Ryb3k6ZnVuY3Rpb24gKCkgeworCXdoaWxlICh0aGlzLmRvbU5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CisJCXRoaXMuZG9tTm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbU5vZGUuY2hpbGROb2Rlc1swXSk7CisJfQorCXRoaXMudmVjdG9yTm9kZSA9IHRoaXMucGxvdEFyZWEgPSB0aGlzLmRhdGFHcm91cCA9IHRoaXMuYXhpc0dyb3VwID0gbnVsbDsKK30sIHJlbmRlcjpmdW5jdGlvbiAoKSB7CisJaWYgKHRoaXMuZGF0YUdyb3VwKSB7CisJCXdoaWxlICh0aGlzLmRhdGFHcm91cC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHsKKwkJCXRoaXMuZGF0YUdyb3VwLnJlbW92ZUNoaWxkKHRoaXMuZGF0YUdyb3VwLmNoaWxkTm9kZXNbMF0pOworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5pbml0KCk7CisJfQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKKwkJZG9qby53aWRnZXQudm1sLkNoYXJ0LlBsb3R0ZXIucGxvdCh0aGlzLnNlcmllc1tpXSwgdGhpcyk7CisJfQorfSwgcG9zdENyZWF0ZTpmdW5jdGlvbiAoKSB7CisJdmFyIHRhYmxlID0gdGhpcy5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpWzBdOworCWlmICh0YWJsZSkgeworCQl2YXIgcmFuZ2VzID0gdGhpcy5wYXJzZVByb3BlcnRpZXModGFibGUpOworCQl2YXIgYlJhbmdlWCA9IGZhbHNlOworCQl2YXIgYlJhbmdlWSA9IGZhbHNlOworCQl2YXIgYXhpc1ZhbHVlcyA9IHRoaXMucGFyc2VEYXRhKHRhYmxlKTsKKwkJaWYgKCFiUmFuZ2VYKSB7CisJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy54LnJhbmdlID0ge21pbjpheGlzVmFsdWVzLngubWluLCBtYXg6YXhpc1ZhbHVlcy54Lm1heH07CisJCX0KKwkJaWYgKCFiUmFuZ2VZKSB7CisJCQl0aGlzLnByb3BlcnRpZXMuYXhlcy55LnJhbmdlID0ge21pbjpheGlzVmFsdWVzLnkubWluLCBtYXg6YXhpc1ZhbHVlcy55Lm1heH07CisJCX0KKwkJdGhpcy5zZXRBeGVzUGxvdCh0YWJsZSk7CisJCXRoaXMuZG9tTm9kZS5yZW1vdmVDaGlsZCh0YWJsZSk7CisJfQorCWlmICh0aGlzLnNlcmllcy5sZW5ndGggPiAwKSB7CisJCXRoaXMucmVuZGVyKCk7CisJfQorfX0pOworZG9qby53aWRnZXQudm1sLkNoYXJ0LlBsb3R0ZXIgPSBuZXcgZnVuY3Rpb24gKCkgeworCXZhciBzZWxmID0gdGhpczsKKwl2YXIgcGxvdHRlcnMgPSB7fTsKKwl2YXIgdHlwZXMgPSBkb2pvLndpZGdldC5DaGFydC5QbG90VHlwZXM7CisJdGhpcy5nZXRYID0gZnVuY3Rpb24gKHZhbHVlLCBjaGFydCkgeworCQl2YXIgdiA9IHBhcnNlRmxvYXQodmFsdWUpOworCQl2YXIgbWluID0gY2hhcnQucHJvcGVydGllcy5heGVzLngucmFuZ2UubWluOworCQl2YXIgbWF4ID0gY2hhcnQucHJvcGVydGllcy5heGVzLngucmFuZ2UubWF4OworCQl2YXIgb2ZzdCA9IDAgLSBtaW47CisJCW1pbiArPSBvZnN0OworCQltYXggKz0gb2ZzdDsKKwkJdiArPSBvZnN0OworCQl2YXIgeG1pbiA9IDA7CisJCXZhciB4bWF4ID0gY2hhcnQucHJvcGVydGllcy53aWR0aCAtIGNoYXJ0LnByb3BlcnRpZXMucGFkZGluZy5sZWZ0IC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0OworCQl2YXIgeCA9ICh2ICogKCh4bWF4IC0geG1pbikgLyBtYXgpKSArIHhtaW47CisJCXJldHVybiB4OworCX07CisJdGhpcy5nZXRZID0gZnVuY3Rpb24gKHZhbHVlLCBjaGFydCkgeworCQl2YXIgdiA9IHBhcnNlRmxvYXQodmFsdWUpOworCQl2YXIgbWF4ID0gY2hhcnQucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWF4OworCQl2YXIgbWluID0gY2hhcnQucHJvcGVydGllcy5heGVzLnkucmFuZ2UubWluOworCQl2YXIgb2ZzdCA9IDA7CisJCWlmIChtaW4gPCAwKSB7CisJCQlvZnN0ICs9IE1hdGguYWJzKG1pbik7CisJCX0KKwkJbWluICs9IG9mc3Q7CisJCW1heCArPSBvZnN0OworCQl2ICs9IG9mc3Q7CisJCXZhciB5bWluID0gY2hhcnQucHJvcGVydGllcy5oZWlnaHQgLSBjaGFydC5wcm9wZXJ0aWVzLnBhZGRpbmcudG9wIC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLmJvdHRvbTsKKwkJdmFyIHltYXggPSAwOworCQl2YXIgeSA9ICgoKHltaW4gLSB5bWF4KSAvIChtYXggLSBtaW4pKSAqIChtYXggLSB2KSkgKyB5bWF4OworCQlyZXR1cm4geTsKKwl9OworCXRoaXMuYWRkUGxvdHRlciA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jKSB7CisJCXBsb3R0ZXJzW25hbWVdID0gZnVuYzsKKwl9OworCXRoaXMucGxvdCA9IGZ1bmN0aW9uIChzZXJpZXMsIGNoYXJ0KSB7CisJCWlmIChzZXJpZXMudmFsdWVzLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNlcmllcy5wbG90VHlwZSAmJiBwbG90dGVyc1tzZXJpZXMucGxvdFR5cGVdKSB7CisJCQlyZXR1cm4gcGxvdHRlcnNbc2VyaWVzLnBsb3RUeXBlXShzZXJpZXMsIGNoYXJ0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjaGFydC5wbG90VHlwZSAmJiBwbG90dGVyc1tjaGFydC5wbG90VHlwZV0pIHsKKwkJCQlyZXR1cm4gcGxvdHRlcnNbY2hhcnQucGxvdFR5cGVdKHNlcmllcywgY2hhcnQpOworCQkJfQorCQl9CisJfTsKKwlwbG90dGVyc1siYmFyIl0gPSBmdW5jdGlvbiAoc2VyaWVzLCBjaGFydCkgeworCQl2YXIgc3BhY2UgPSAxOworCQl2YXIgbGFzdFcgPSAwOworCQl2YXIgeXMgPSBbXTsKKwkJdmFyIHlBeGlzID0gc2VsZi5nZXRZKGNoYXJ0LnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCwgY2hhcnQpOworCQl2YXIgeUEgPSB5QXhpczsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KTsKKwkJCXZhciB3OworCQkJaWYgKGkgPT0gc2VyaWVzLnZhbHVlcy5sZW5ndGggLSAxKSB7CisJCQkJdyA9IGxhc3RXOworCQkJfSBlbHNlIHsKKwkJCQl3ID0gc2VsZi5nZXRYKHNlcmllcy52YWx1ZXNbaSArIDFdLngsIGNoYXJ0KSAtIHggLSBzcGFjZTsKKwkJCQlsYXN0VyA9IHc7CisJCQl9CisJCQl4IC09ICh3IC8gMik7CisJCQl2YXIgeSA9IHNlbGYuZ2V0WShzZXJpZXMudmFsdWVzW2ldLnZhbHVlLCBjaGFydCk7CisJCQl2YXIgaCA9IE1hdGguYWJzKHlBIC0geSk7CisJCQlpZiAocGFyc2VGbG9hdChzZXJpZXMudmFsdWVzW2ldLnZhbHVlKSA8IGNoYXJ0LnByb3BlcnRpZXMuYXhlcy54LnBsb3RBdCkgeworCQkJCXkgPSB5QTsKKwkJCX0KKwkJCXZhciBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnJlY3QiKTsKKwkJCWJhci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQliYXIuc3R5bGUudG9wID0geSArICJweCI7CisJCQliYXIuc3R5bGUubGVmdCA9IHggKyAicHgiOworCQkJYmFyLnN0eWxlLndpZHRoID0gdyArICJweCI7CisJCQliYXIuc3R5bGUuaGVpZ2h0ID0gaCArICJweCI7CisJCQliYXIuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCBzZXJpZXMuY29sb3IpOworCQkJYmFyLnNldEF0dHJpYnV0ZSgic3Ryb2tlZCIsICJmYWxzZSIpOworCQkJYmFyLnN0eWxlLmFudGlhbGlhcyA9ICJmYWxzZSI7CisJCQliYXIuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHNlcmllcy5sYWJlbCArICIgKCIgKyBpICsgIik6ICIgKyBzZXJpZXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQlmaWxsLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjkiKTsKKwkJCWJhci5hcHBlbmRDaGlsZChmaWxsKTsKKwkJCWNoYXJ0LmRhdGFHcm91cC5hcHBlbmRDaGlsZChiYXIpOworCQl9CisJfTsKKwlwbG90dGVyc1sibGluZSJdID0gZnVuY3Rpb24gKHNlcmllcywgY2hhcnQpIHsKKwkJdmFyIHRlbnNpb24gPSAxLjU7CisJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzaGFwZSIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjJweCIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBzZXJpZXMuY29sb3IpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgIm5vbmUiKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoImZpbGxlZCIsICJmYWxzZSIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgidGl0bGUiLCBzZXJpZXMubGFiZWwpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgiY29vcmRzaXplIiwgY2hhcnQucHJvcGVydGllcy53aWR0aCArICIsIiArIGNoYXJ0LnByb3BlcnRpZXMuaGVpZ2h0KTsKKwkJbGluZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCWxpbmUuc3R5bGUudG9wID0gIjBweCI7CisJCWxpbmUuc3R5bGUubGVmdCA9ICIwcHgiOworCQlsaW5lLnN0eWxlLndpZHRoID0gY2hhcnQucHJvcGVydGllcy53aWR0aCArICJweCI7CisJCWxpbmUuc3R5bGUuaGVpZ2h0ID0gY2hhcnQucHJvcGVydGllcy5oZWlnaHQgKyAicHgiOworCQl2YXIgc3Ryb2tlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzdHJva2UiKTsKKwkJc3Ryb2tlLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjg1Iik7CisJCWxpbmUuYXBwZW5kQ2hpbGQoc3Ryb2tlKTsKKwkJdmFyIHBhdGggPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgeCA9IE1hdGgucm91bmQoc2VsZi5nZXRYKHNlcmllcy52YWx1ZXNbaV0ueCwgY2hhcnQpKTsKKwkJCXZhciB5ID0gTWF0aC5yb3VuZChzZWxmLmdldFkoc2VyaWVzLnZhbHVlc1tpXS52YWx1ZSwgY2hhcnQpKTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlwYXRoLnB1c2goIm0iKTsKKwkJCQlwYXRoLnB1c2goeCArICIsIiArIHkpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgbGFzdHggPSBNYXRoLnJvdW5kKHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2kgLSAxXS54LCBjaGFydCkpOworCQkJCXZhciBsYXN0eSA9IE1hdGgucm91bmQoc2VsZi5nZXRZKHNlcmllcy52YWx1ZXNbaSAtIDFdLnZhbHVlLCBjaGFydCkpOworCQkJCXZhciBkeCA9IHggLSBsYXN0eDsKKwkJCQl2YXIgZHkgPSB5IC0gbGFzdHk7CisJCQkJcGF0aC5wdXNoKCJjIik7CisJCQkJdmFyIGN4ID0gTWF0aC5yb3VuZCgoeCAtICh0ZW5zaW9uIC0gMSkgKiAoZHggLyB0ZW5zaW9uKSkpOworCQkJCXBhdGgucHVzaChjeCArICIsIiArIGxhc3R5KTsKKwkJCQljeCA9IE1hdGgucm91bmQoKHggLSAoZHggLyB0ZW5zaW9uKSkpOworCQkJCXBhdGgucHVzaChjeCArICIsIiArIHkpOworCQkJCXBhdGgucHVzaCh4ICsgIiwiICsgeSk7CisJCQl9CisJCX0KKwkJbGluZS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBwYXRoLmpvaW4oIiAiKSArICIgZSIpOworCQljaGFydC5kYXRhR3JvdXAuYXBwZW5kQ2hpbGQobGluZSk7CisJfTsKKwlwbG90dGVyc1siYXJlYSJdID0gZnVuY3Rpb24gKHNlcmllcywgY2hhcnQpIHsKKwkJdmFyIHRlbnNpb24gPSAxLjU7CisJCXZhciBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpzaGFwZSIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tld2VpZ2h0IiwgIjFweCIpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBzZXJpZXMuY29sb3IpOworCQlsaW5lLnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgc2VyaWVzLmNvbG9yKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgc2VyaWVzLmxhYmVsKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoImNvb3Jkc2l6ZSIsIGNoYXJ0LnByb3BlcnRpZXMud2lkdGggKyAiLCIgKyBjaGFydC5wcm9wZXJ0aWVzLmhlaWdodCk7CisJCWxpbmUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlsaW5lLnN0eWxlLnRvcCA9ICIwcHgiOworCQlsaW5lLnN0eWxlLmxlZnQgPSAiMHB4IjsKKwkJbGluZS5zdHlsZS53aWR0aCA9IGNoYXJ0LnByb3BlcnRpZXMud2lkdGggKyAicHgiOworCQlsaW5lLnN0eWxlLmhlaWdodCA9IGNoYXJ0LnByb3BlcnRpZXMuaGVpZ2h0ICsgInB4IjsKKwkJdmFyIHN0cm9rZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInY6c3Ryb2tlIik7CisJCXN0cm9rZS5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC44Iik7CisJCWxpbmUuYXBwZW5kQ2hpbGQoc3Ryb2tlKTsKKwkJdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OmZpbGwiKTsKKwkJZmlsbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLCAiMC40Iik7CisJCWxpbmUuYXBwZW5kQ2hpbGQoZmlsbCk7CisJCXZhciBwYXRoID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLnZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBNYXRoLnJvdW5kKHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KSk7CisJCQl2YXIgeSA9IE1hdGgucm91bmQoc2VsZi5nZXRZKHNlcmllcy52YWx1ZXNbaV0udmFsdWUsIGNoYXJ0KSk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJcGF0aC5wdXNoKCJtIik7CisJCQkJcGF0aC5wdXNoKHggKyAiLCIgKyB5KTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIGxhc3R4ID0gTWF0aC5yb3VuZChzZWxmLmdldFgoc2VyaWVzLnZhbHVlc1tpIC0gMV0ueCwgY2hhcnQpKTsKKwkJCQl2YXIgbGFzdHkgPSBNYXRoLnJvdW5kKHNlbGYuZ2V0WShzZXJpZXMudmFsdWVzW2kgLSAxXS52YWx1ZSwgY2hhcnQpKTsKKwkJCQl2YXIgZHggPSB4IC0gbGFzdHg7CisJCQkJdmFyIGR5ID0geSAtIGxhc3R5OworCQkJCXBhdGgucHVzaCgiYyIpOworCQkJCXZhciBjeCA9IE1hdGgucm91bmQoKHggLSAodGVuc2lvbiAtIDEpICogKGR4IC8gdGVuc2lvbikpKTsKKwkJCQlwYXRoLnB1c2goY3ggKyAiLCIgKyBsYXN0eSk7CisJCQkJY3ggPSBNYXRoLnJvdW5kKCh4IC0gKGR4IC8gdGVuc2lvbikpKTsKKwkJCQlwYXRoLnB1c2goY3ggKyAiLCIgKyB5KTsKKwkJCQlwYXRoLnB1c2goeCArICIsIiArIHkpOworCQkJfQorCQl9CisJCXBhdGgucHVzaCgibCIpOworCQlwYXRoLnB1c2goeCArICIsIiArIHNlbGYuZ2V0WSgwLCBjaGFydCkpOworCQlwYXRoLnB1c2goImwiKTsKKwkJcGF0aC5wdXNoKHNlbGYuZ2V0WCgwLCBjaGFydCkgKyAiLCIgKyBzZWxmLmdldFkoMCwgY2hhcnQpKTsKKwkJbGluZS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBwYXRoLmpvaW4oIiAiKSArICIgeCBlIik7CisJCWNoYXJ0LmRhdGFHcm91cC5hcHBlbmRDaGlsZChsaW5lKTsKKwl9OworCXBsb3R0ZXJzWyJzY2F0dGVyIl0gPSBmdW5jdGlvbiAoc2VyaWVzLCBjaGFydCkgeworCQl2YXIgciA9IDY7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLnZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHggPSBzZWxmLmdldFgoc2VyaWVzLnZhbHVlc1tpXS54LCBjaGFydCk7CisJCQl2YXIgeSA9IHNlbGYuZ2V0WShzZXJpZXMudmFsdWVzW2ldLnZhbHVlLCBjaGFydCk7CisJCQl2YXIgbW9kID0gciAvIDI7CisJCQl2YXIgcG9pbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2OnJlY3QiKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgc2VyaWVzLmNvbG9yKTsKKwkJCXBvaW50LnNldEF0dHJpYnV0ZSgic3Ryb2tlY29sb3IiLCBzZXJpZXMuY29sb3IpOworCQkJcG9pbnQuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHNlcmllcy5sYWJlbCArICI6ICIgKyBzZXJpZXMudmFsdWVzW2ldLnZhbHVlKTsKKwkJCXBvaW50LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXBvaW50LnN0eWxlLnJvdGF0aW9uID0gIjQ1IjsKKwkJCXBvaW50LnN0eWxlLnRvcCA9ICh5IC0gbW9kKSArICJweCI7CisJCQlwb2ludC5zdHlsZS5sZWZ0ID0gKHggLSBtb2QpICsgInB4IjsKKwkJCXBvaW50LnN0eWxlLndpZHRoID0gciArICJweCI7CisJCQlwb2ludC5zdHlsZS5oZWlnaHQgPSByICsgInB4IjsKKwkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQlmaWxsLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjYiKTsKKwkJCXBvaW50LmFwcGVuZENoaWxkKGZpbGwpOworCQkJY2hhcnQuZGF0YUdyb3VwLmFwcGVuZENoaWxkKHBvaW50KTsKKwkJfQorCX07CisJcGxvdHRlcnNbImJ1YmJsZSJdID0gZnVuY3Rpb24gKHNlcmllcywgY2hhcnQpIHsKKwkJdmFyIG1pblIgPSAxOworCQl2YXIgbWluID0gY2hhcnQucHJvcGVydGllcy5heGVzLngucmFuZ2UubWluOworCQl2YXIgbWF4ID0gY2hhcnQucHJvcGVydGllcy5heGVzLngucmFuZ2UubWF4OworCQl2YXIgb2ZzdCA9IDAgLSBtaW47CisJCW1pbiArPSBvZnN0OworCQltYXggKz0gb2ZzdDsKKwkJdmFyIHhtaW4gPSBjaGFydC5wcm9wZXJ0aWVzLnBhZGRpbmcubGVmdDsKKwkJdmFyIHhtYXggPSBjaGFydC5wcm9wZXJ0aWVzLndpZHRoIC0gY2hhcnQucHJvcGVydGllcy5wYWRkaW5nLnJpZ2h0OworCQl2YXIgZmFjdG9yID0gKG1heCAtIG1pbikgLyAoeG1heCAtIHhtaW4pICogMjU7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLnZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHNpemUgPSBzZXJpZXMudmFsdWVzW2ldLnNpemU7CisJCQlpZiAoaXNOYU4ocGFyc2VGbG9hdChzaXplKSkpIHsKKwkJCQlzaXplID0gbWluUjsKKwkJCX0KKwkJCXZhciByYWRpdXMgPSAocGFyc2VGbG9hdChzaXplKSAqIGZhY3RvcikgLyAyOworCQkJdmFyIGRpYW1ldGVyID0gcmFkaXVzICogMjsKKwkJCXZhciBjeCA9IHNlbGYuZ2V0WChzZXJpZXMudmFsdWVzW2ldLngsIGNoYXJ0KTsKKwkJCXZhciBjeSA9IHNlbGYuZ2V0WShzZXJpZXMudmFsdWVzW2ldLnZhbHVlLCBjaGFydCk7CisJCQl2YXIgdG9wID0gY3kgLSByYWRpdXM7CisJCQl2YXIgbGVmdCA9IGN4IC0gcmFkaXVzOworCQkJdmFyIHBvaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpvdmFsIik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsIHNlcmllcy5jb2xvcik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgc2VyaWVzLmxhYmVsICsgIjogIiArIHNlcmllcy52YWx1ZXNbaV0udmFsdWUgKyAiICgiICsgc2l6ZSArICIpIik7CisJCQlwb2ludC5zZXRBdHRyaWJ1dGUoInN0cm9rZWQiLCAiZmFsc2UiKTsKKwkJCXBvaW50LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCXBvaW50LnN0eWxlLnRvcCA9IHRvcCArICJweCI7CisJCQlwb2ludC5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CisJCQlwb2ludC5zdHlsZS53aWR0aCA9IGRpYW1ldGVyICsgInB4IjsKKwkJCXBvaW50LnN0eWxlLmhlaWdodCA9IGRpYW1ldGVyICsgInB4IjsKKwkJCXZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidjpmaWxsIik7CisJCQlmaWxsLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsICIwLjgiKTsKKwkJCXBvaW50LmFwcGVuZENoaWxkKGZpbGwpOworCQkJY2hhcnQuZGF0YUdyb3VwLmFwcGVuZENoaWxkKHBvaW50KTsKKwkJfQorCX07Cit9KCk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy94bWwvUGFyc2UuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL1BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWFiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL1BhcnNlLmpzCkBAIC0wLDAgKzEsMTY1IEBACisvKgorCUNvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUxpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEgb3IgYWJvdmUgT1IgdGhlCisJbW9kaWZpZWQgQlNEIGxpY2Vuc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIERvam8gbGljZW5zaW5nLCBzZWU6CisKKwkJaHR0cDovL2Rvam90b29sa2l0Lm9yZy9jb21tdW5pdHkvbGljZW5zaW5nLnNodG1sCisqLworCisKKworZG9qby5wcm92aWRlKCJkb2pvLnhtbC5QYXJzZSIpOworZG9qby5yZXF1aXJlKCJkb2pvLmRvbSIpOworZG9qby54bWwuUGFyc2UgPSBmdW5jdGlvbiAoKSB7CisJdmFyIGlzSUUgPSAoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkgJiYgKGRvam8ucmVuZGVyLmh0bWwuaWUpKTsKKwlmdW5jdGlvbiBnZXRUYWdOYW1lKG5vZGUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKwkJfQorCQljYXRjaCAoZSkgeworCQkJcmV0dXJuICIiOworCQl9CisJfQorCWZ1bmN0aW9uIGdldERvam9UYWdOYW1lKG5vZGUpIHsKKwkJdmFyIHRhZ05hbWUgPSBnZXRUYWdOYW1lKG5vZGUpOworCQlpZiAoIXRhZ05hbWUpIHsKKwkJCXJldHVybiAiIjsKKwkJfQorCQlpZiAoKGRvam8ud2lkZ2V0KSAmJiAoZG9qby53aWRnZXQudGFnc1t0YWdOYW1lXSkpIHsKKwkJCXJldHVybiB0YWdOYW1lOworCQl9CisJCXZhciBwID0gdGFnTmFtZS5pbmRleE9mKCI6Iik7CisJCWlmIChwID49IDApIHsKKwkJCXJldHVybiB0YWdOYW1lOworCQl9CisJCWlmICh0YWdOYW1lLnN1YnN0cigwLCA1KSA9PSAiZG9qbzoiKSB7CisJCQlyZXR1cm4gdGFnTmFtZTsKKwkJfQorCQlpZiAoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlICYmIGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgbm9kZS5zY29wZU5hbWUgIT0gIkhUTUwiKSB7CisJCQlyZXR1cm4gbm9kZS5zY29wZU5hbWUudG9Mb3dlckNhc2UoKSArICI6IiArIHRhZ05hbWU7CisJCX0KKwkJaWYgKHRhZ05hbWUuc3Vic3RyKDAsIDQpID09ICJkb2pvIikgeworCQkJcmV0dXJuICJkb2pvOiIgKyB0YWdOYW1lLnN1YnN0cmluZyg0KTsKKwkJfQorCQl2YXIgZGp0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoImRvam9UeXBlIikgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoImRvam90eXBlIik7CisJCWlmIChkanQpIHsKKwkJCWlmIChkanQuaW5kZXhPZigiOiIpIDwgMCkgeworCQkJCWRqdCA9ICJkb2pvOiIgKyBkanQ7CisJCQl9CisJCQlyZXR1cm4gZGp0LnRvTG93ZXJDYXNlKCk7CisJCX0KKwkJZGp0ID0gbm9kZS5nZXRBdHRyaWJ1dGVOUyAmJiBub2RlLmdldEF0dHJpYnV0ZU5TKGRvam8uZG9tLmRvam9tbCwgInR5cGUiKTsKKwkJaWYgKGRqdCkgeworCQkJcmV0dXJuICJkb2pvOiIgKyBkanQudG9Mb3dlckNhc2UoKTsKKwkJfQorCQl0cnkgeworCQkJZGp0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoImRvam86dHlwZSIpOworCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJaWYgKGRqdCkgeworCQkJcmV0dXJuICJkb2pvOiIgKyBkanQudG9Mb3dlckNhc2UoKTsKKwkJfQorCQlpZiAoKGRqX2dsb2JhbFsiZGpDb25maWciXSkgJiYgKCFkakNvbmZpZ1siaWdub3JlQ2xhc3NOYW1lcyJdKSkgeworCQkJdmFyIGNsYXNzZXMgPSBub2RlLmNsYXNzTmFtZSB8fCBub2RlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsKKwkJCWlmICgoY2xhc3NlcykgJiYgKGNsYXNzZXMuaW5kZXhPZikgJiYgKGNsYXNzZXMuaW5kZXhPZigiZG9qby0iKSAhPSAtMSkpIHsKKwkJCQl2YXIgYWNsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCIgIik7CisJCQkJZm9yICh2YXIgeCA9IDAsIGMgPSBhY2xhc3Nlcy5sZW5ndGg7IHggPCBjOyB4KyspIHsKKwkJCQkJaWYgKGFjbGFzc2VzW3hdLnNsaWNlKDAsIDUpID09ICJkb2pvLSIpIHsKKwkJCQkJCXJldHVybiAiZG9qbzoiICsgYWNsYXNzZXNbeF0uc3Vic3RyKDUpLnRvTG93ZXJDYXNlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuICIiOworCX0KKwl0aGlzLnBhcnNlRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBoYXNQYXJlbnROb2RlU2V0LCBvcHRpbWl6ZUZvckRvam9NTCwgdGhpc0lkeCkgeworCQl2YXIgdGFnTmFtZSA9IGdldFRhZ05hbWUobm9kZSk7CisJCWlmIChpc0lFICYmIHRhZ05hbWUuaW5kZXhPZigiLyIpID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXRyeSB7CisJCQl2YXIgYXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlKCJwYXJzZVdpZGdldHMiKTsKKwkJCWlmIChhdHRyICYmIGF0dHIudG9Mb3dlckNhc2UoKSA9PSAiZmFsc2UiKSB7CisJCQkJcmV0dXJuIHt9OworCQkJfQorCQl9CisJCWNhdGNoIChlKSB7CisJCX0KKwkJdmFyIHByb2Nlc3MgPSB0cnVlOworCQlpZiAob3B0aW1pemVGb3JEb2pvTUwpIHsKKwkJCXZhciBkb2pvVGFnTmFtZSA9IGdldERvam9UYWdOYW1lKG5vZGUpOworCQkJdGFnTmFtZSA9IGRvam9UYWdOYW1lIHx8IHRhZ05hbWU7CisJCQlwcm9jZXNzID0gQm9vbGVhbihkb2pvVGFnTmFtZSk7CisJCX0KKwkJdmFyIHBhcnNlZE5vZGVTZXQgPSB7fTsKKwkJcGFyc2VkTm9kZVNldFt0YWdOYW1lXSA9IFtdOworCQl2YXIgcG9zID0gdGFnTmFtZS5pbmRleE9mKCI6Iik7CisJCWlmIChwb3MgPiAwKSB7CisJCQl2YXIgbnMgPSB0YWdOYW1lLnN1YnN0cmluZygwLCBwb3MpOworCQkJcGFyc2VkTm9kZVNldFsibnMiXSA9IG5zOworCQkJaWYgKChkb2pvLm5zKSAmJiAoIWRvam8ubnMuYWxsb3cobnMpKSkgeworCQkJCXByb2Nlc3MgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocHJvY2VzcykgeworCQkJdmFyIGF0dHJpYnV0ZVNldCA9IHRoaXMucGFyc2VBdHRyaWJ1dGVzKG5vZGUpOworCQkJZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVTZXQpIHsKKwkJCQlpZiAoKCFwYXJzZWROb2RlU2V0W3RhZ05hbWVdW2F0dHJdKSB8fCAodHlwZW9mIHBhcnNlZE5vZGVTZXRbdGFnTmFtZV1bYXR0cl0gIT0gImFycmF5IikpIHsKKwkJCQkJcGFyc2VkTm9kZVNldFt0YWdOYW1lXVthdHRyXSA9IFtdOworCQkJCX0KKwkJCQlwYXJzZWROb2RlU2V0W3RhZ05hbWVdW2F0dHJdLnB1c2goYXR0cmlidXRlU2V0W2F0dHJdKTsKKwkJCX0KKwkJCXBhcnNlZE5vZGVTZXRbdGFnTmFtZV0ubm9kZVJlZiA9IG5vZGU7CisJCQlwYXJzZWROb2RlU2V0LnRhZ05hbWUgPSB0YWdOYW1lOworCQkJcGFyc2VkTm9kZVNldC5pbmRleCA9IHRoaXNJZHggfHwgMDsKKwkJfQorCQl2YXIgY291bnQgPSAwOworCQlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJdmFyIHRjbiA9IG5vZGUuY2hpbGROb2Rlcy5pdGVtKGkpOworCQkJc3dpdGNoICh0Y24ubm9kZVR5cGUpIHsKKwkJCSAgY2FzZSBkb2pvLmRvbS5FTEVNRU5UX05PREU6CisJCQkJdmFyIGN0biA9IGdldERvam9UYWdOYW1lKHRjbikgfHwgZ2V0VGFnTmFtZSh0Y24pOworCQkJCWlmICghcGFyc2VkTm9kZVNldFtjdG5dKSB7CisJCQkJCXBhcnNlZE5vZGVTZXRbY3RuXSA9IFtdOworCQkJCX0KKwkJCQlwYXJzZWROb2RlU2V0W2N0bl0ucHVzaCh0aGlzLnBhcnNlRWxlbWVudCh0Y24sIHRydWUsIG9wdGltaXplRm9yRG9qb01MLCBjb3VudCkpOworCQkJCWlmICgodGNuLmNoaWxkTm9kZXMubGVuZ3RoID09IDEpICYmICh0Y24uY2hpbGROb2Rlcy5pdGVtKDApLm5vZGVUeXBlID09IGRvam8uZG9tLlRFWFRfTk9ERSkpIHsKKwkJCQkJcGFyc2VkTm9kZVNldFtjdG5dW3BhcnNlZE5vZGVTZXRbY3RuXS5sZW5ndGggLSAxXS52YWx1ZSA9IHRjbi5jaGlsZE5vZGVzLml0ZW0oMCkubm9kZVZhbHVlOworCQkJCX0KKwkJCQljb3VudCsrOworCQkJCWJyZWFrOworCQkJICBjYXNlIGRvam8uZG9tLlRFWFRfTk9ERToKKwkJCQlpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKSB7CisJCQkJCXBhcnNlZE5vZGVTZXRbdGFnTmFtZV0ucHVzaCh7dmFsdWU6bm9kZS5jaGlsZE5vZGVzLml0ZW0oMCkubm9kZVZhbHVlfSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICBkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBwYXJzZWROb2RlU2V0OworCX07CisJdGhpcy5wYXJzZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAobm9kZSkgeworCQl2YXIgcGFyc2VkQXR0cmlidXRlU2V0ID0ge307CisJCXZhciBhdHRzID0gbm9kZS5hdHRyaWJ1dGVzOworCQl2YXIgYXR0bm9kZSwgaSA9IDA7CisJCXdoaWxlICgoYXR0bm9kZSA9IGF0dHNbaSsrXSkpIHsKKwkJCWlmIChpc0lFKSB7CisJCQkJaWYgKCFhdHRub2RlKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoKHR5cGVvZiBhdHRub2RlID09ICJvYmplY3QiKSAmJiAodHlwZW9mIGF0dG5vZGUubm9kZVZhbHVlID09ICJ1bmRlZmluZWQiKSB8fCAoYXR0bm9kZS5ub2RlVmFsdWUgPT0gbnVsbCkgfHwgKGF0dG5vZGUubm9kZVZhbHVlID09ICIiKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQl2YXIgbm4gPSBhdHRub2RlLm5vZGVOYW1lLnNwbGl0KCI6Iik7CisJCQlubiA9IChubi5sZW5ndGggPT0gMikgPyBublsxXSA6IGF0dG5vZGUubm9kZU5hbWU7CisJCQlwYXJzZWRBdHRyaWJ1dGVTZXRbbm5dID0ge3ZhbHVlOmF0dG5vZGUubm9kZVZhbHVlfTsKKwkJfQorCQlyZXR1cm4gcGFyc2VkQXR0cmlidXRlU2V0OworCX07Cit9OworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL1hzbFRyYW5zZm9ybS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy94bWwvWHNsVHJhbnNmb3JtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGI4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL1hzbFRyYW5zZm9ybS5qcwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKwlDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgVGhlIERvam8gRm91bmRhdGlvbgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIG9yIGFib3ZlIE9SIHRoZQorCW1vZGlmaWVkIEJTRCBsaWNlbnNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBEb2pvIGxpY2Vuc2luZywgc2VlOgorCisJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvY29tbXVuaXR5L2xpY2Vuc2luZy5zaHRtbAorKi8KKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby54bWwuWHNsVHJhbnNmb3JtIik7Citkb2pvLnhtbC5Yc2xUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoeHNsdFVyaSkgeworCWRvam8uZGVidWcoIlhzbFRyYW5zZm9ybSBpcyBzdXBwb3J0ZWQgYnkgSW50ZXJuZXQgRXhwbG9yZXIgYW5kIE1vemlsbGEsIHdpdGggbGltaXRlZCBzdXBwb3J0IGluIE9wZXJhIDkgKG5vIGRvY3VtZW50IGZ1bmN0aW9uIHN1cHBvcnQpLiIpOworCXZhciBJU19JRSA9IGRvam8ucmVuZGVyLmh0bWwuaWU7CisJdmFyIEFDVElWRVhfRE9NUyA9IFsiTXN4bWwyLkRPTURvY3VtZW50LjUuMCIsICJNc3htbDIuRE9NRG9jdW1lbnQuNC4wIiwgIk1zeG1sMi5ET01Eb2N1bWVudC4zLjAiLCAiTVNYTUwyLkRPTURvY3VtZW50IiwgIk1TWE1MLkRPTURvY3VtZW50IiwgIk1pY3Jvc29mdC5YTUxET00iXTsKKwl2YXIgQUNUSVZFWF9GVF9ET01TID0gWyJNc3htbDIuRnJlZVRocmVhZGVkRE9NRG9jdW1lbnQuNS4wIiwgIk1TWE1MMi5GcmVlVGhyZWFkZWRET01Eb2N1bWVudC40LjAiLCAiTVNYTUwyLkZyZWVUaHJlYWRlZERPTURvY3VtZW50LjMuMCJdOworCXZhciBBQ1RJVkVYX1RFTVBMQVRFUyA9IFsiTXN4bWwyLlhTTFRlbXBsYXRlLjUuMCIsICJNc3htbDIuWFNMVGVtcGxhdGUuNC4wIiwgIk1TWE1MMi5YU0xUZW1wbGF0ZS4zLjAiXTsKKwlmdW5jdGlvbiBnZXRBY3RpdmVYSW1wbChhY3RpdmVYQXJyYXkpIHsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVYQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJdmFyIHRlc3RPYmogPSBuZXcgQWN0aXZlWE9iamVjdChhY3RpdmVYQXJyYXlbaV0pOworCQkJCWlmICh0ZXN0T2JqKSB7CisJCQkJCXJldHVybiBhY3RpdmVYQXJyYXlbaV07CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKGUpIHsKKwkJCX0KKwkJfQorCQlkb2pvLnJhaXNlKCJDb3VsZCBub3QgZmluZCBhbiBBY3RpdmVYIGltcGxlbWVudGF0aW9uIGluOlxuXG4gIiArIGFjdGl2ZVhBcnJheSk7CisJfQorCWlmICh4c2x0VXJpID09IG51bGwgfHwgeHNsdFVyaSA9PSB1bmRlZmluZWQpIHsKKwkJZG9qby5yYWlzZSgiWW91IG11c3QgcGFzcyB0aGUgVVJJIFN0cmluZyBmb3IgdGhlIFhTTCBmaWxlIHRvIGJlIHVzZWQhIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFyIHhzbHREb2N1bWVudCA9IG51bGw7CisJdmFyIHhzbHRQcm9jZXNzb3IgPSBudWxsOworCWlmIChJU19JRSkgeworCQl4c2x0RG9jdW1lbnQgPSBuZXcgQWN0aXZlWE9iamVjdChnZXRBY3RpdmVYSW1wbChBQ1RJVkVYX0ZUX0RPTVMpKTsKKwkJeHNsdERvY3VtZW50LmFzeW5jID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJeHNsdFByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CisJCXhzbHREb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCAiIiwgbnVsbCk7CisJCXhzbHREb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgb25Yc2xMb2FkLCBmYWxzZSk7CisJfQorCXhzbHREb2N1bWVudC5sb2FkKHhzbHRVcmkpOworCWlmIChJU19JRSkgeworCQl2YXIgeHNsdCA9IG5ldyBBY3RpdmVYT2JqZWN0KGdldEFjdGl2ZVhJbXBsKEFDVElWRVhfVEVNUExBVEVTKSk7CisJCXhzbHQuc3R5bGVzaGVldCA9IHhzbHREb2N1bWVudDsKKwkJeHNsdFByb2Nlc3NvciA9IHhzbHQuY3JlYXRlUHJvY2Vzc29yKCk7CisJfQorCWZ1bmN0aW9uIG9uWHNsTG9hZCgpIHsKKwkJeHNsdFByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbHREb2N1bWVudCk7CisJfQorCWZ1bmN0aW9uIGdldFJlc3VsdERvbSh4bWxEb2MsIHBhcmFtcykgeworCQlpZiAoSVNfSUUpIHsKKwkJCWFkZEllUGFyYW1zKHBhcmFtcyk7CisJCQl2YXIgcmVzdWx0ID0gZ2V0SWVSZXN1bHREb20oeG1sRG9jKTsKKwkJCXJlbW92ZUllUGFyYW1zKHBhcmFtcyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJcmV0dXJuIGdldE1vemlsbGFSZXN1bHREb20oeG1sRG9jLCBwYXJhbXMpOworCQl9CisJfQorCWZ1bmN0aW9uIGFkZEllUGFyYW1zKHBhcmFtcykgeworCQlpZiAoIXBhcmFtcykgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisJCQl4c2x0UHJvY2Vzc29yLmFkZFBhcmFtZXRlcihwYXJhbXNbaV1bMF0sIHBhcmFtc1tpXVsxXSk7CisJCX0KKwl9CisJZnVuY3Rpb24gcmVtb3ZlSWVQYXJhbXMocGFyYW1zKSB7CisJCWlmICghcGFyYW1zKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKwkJCXhzbHRQcm9jZXNzb3IuYWRkUGFyYW1ldGVyKHBhcmFtc1tpXVswXSwgIiIpOworCQl9CisJfQorCWZ1bmN0aW9uIGdldEllUmVzdWx0RG9tKHhtbERvYykgeworCQl4c2x0UHJvY2Vzc29yLmlucHV0ID0geG1sRG9jOworCQl2YXIgb3V0RG9jID0gbmV3IEFjdGl2ZVhPYmplY3QoZ2V0QWN0aXZlWEltcGwoQUNUSVZFWF9ET01TKSk7CisJCW91dERvYy5hc3luYyA9IGZhbHNlOworCQlvdXREb2MudmFsaWRhdGVPblBhcnNlID0gZmFsc2U7CisJCXhzbHRQcm9jZXNzb3Iub3V0cHV0ID0gb3V0RG9jOworCQl4c2x0UHJvY2Vzc29yLnRyYW5zZm9ybSgpOworCQlpZiAob3V0RG9jLnBhcnNlRXJyb3IuZXJyb3JDb2RlICE9IDApIHsKKwkJCXZhciBlcnIgPSBvdXREb2MucGFyc2VFcnJvcjsKKwkJCWRvam8ucmFpc2UoImVyci5lcnJvckNvZGU6ICIgKyBlcnIuZXJyb3JDb2RlICsgIlxuXG5lcnIucmVhc29uOiAiICsgZXJyLnJlYXNvbiArICJcblxuZXJyLnVybDogIiArIGVyci51cmwgKyAiXG5cbmVyci5zcmNUZXh0OiAiICsgZXJyLnNyY1RleHQpOworCQl9CisJCXJldHVybiBvdXREb2M7CisJfQorCWZ1bmN0aW9uIGdldEllUmVzdWx0U3RyKHhtbERvYywgcGFyYW1zKSB7CisJCXhzbHRQcm9jZXNzb3IuaW5wdXQgPSB4bWxEb2M7CisJCXhzbHRQcm9jZXNzb3IudHJhbnNmb3JtKCk7CisJCXJldHVybiB4c2x0UHJvY2Vzc29yLm91dHB1dDsKKwl9CisJZnVuY3Rpb24gYWRkTW96aWxsYVBhcmFtcyhwYXJhbXMpIHsKKwkJaWYgKCFwYXJhbXMpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworCQkJeHNsdFByb2Nlc3Nvci5zZXRQYXJhbWV0ZXIobnVsbCwgcGFyYW1zW2ldWzBdLCBwYXJhbXNbaV1bMV0pOworCQl9CisJfQorCWZ1bmN0aW9uIGdldE1vemlsbGFSZXN1bHREb20oeG1sRG9jLCBwYXJhbXMpIHsKKwkJYWRkTW96aWxsYVBhcmFtcyhwYXJhbXMpOworCQl2YXIgcmVzdWx0RG9jID0geHNsdFByb2Nlc3Nvci50cmFuc2Zvcm1Ub0RvY3VtZW50KHhtbERvYyk7CisJCXhzbHRQcm9jZXNzb3IuY2xlYXJQYXJhbWV0ZXJzKCk7CisJCXJldHVybiByZXN1bHREb2M7CisJfQorCWZ1bmN0aW9uIGdldE1vemlsbGFSZXN1bHRTdHIoeG1sRG9jLCBwYXJhbXMsIHBhcmVudERvYykgeworCQlhZGRNb3ppbGxhUGFyYW1zKHBhcmFtcyk7CisJCXZhciByZXN1bHREb2MgPSB4c2x0UHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQoeG1sRG9jLCBwYXJlbnREb2MpOworCQl2YXIgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7CisJCXhzbHRQcm9jZXNzb3IuY2xlYXJQYXJhbWV0ZXJzKCk7CisJCXJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHJlc3VsdERvYyk7CisJfQorCXRoaXMuZ2V0UmVzdWx0U3RyaW5nID0gZnVuY3Rpb24gKHhtbERvYywgcGFyYW1zLCBwYXJlbnREb2MpIHsKKwkJdmFyIGNvbnRlbnQgPSBudWxsOworCQlpZiAoSVNfSUUpIHsKKwkJCWFkZEllUGFyYW1zKHBhcmFtcyk7CisJCQljb250ZW50ID0gZ2V0SWVSZXN1bHRTdHIoeG1sRG9jLCBwYXJhbXMpOworCQkJcmVtb3ZlSWVQYXJhbXMocGFyYW1zKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnRlbnQgPSBnZXRNb3ppbGxhUmVzdWx0U3RyKHhtbERvYywgcGFyYW1zLCBwYXJlbnREb2MpOworCQl9CisJCXJldHVybiBjb250ZW50OworCX07CisJdGhpcy50cmFuc2Zvcm1Ub0NvbnRlbnRQYW5lID0gZnVuY3Rpb24gKHhtbERvYywgcGFyYW1zLCBjb250ZW50UGFuZSwgcGFyZW50RG9jKSB7CisJCXZhciBjb250ZW50ID0gdGhpcy5nZXRSZXN1bHRTdHJpbmcoeG1sRG9jLCBwYXJhbXMsIHBhcmVudERvYyk7CisJCWNvbnRlbnRQYW5lLnNldENvbnRlbnQoY29udGVudCk7CisJfTsKKwl0aGlzLnRyYW5zZm9ybVRvUmVnaW9uID0gZnVuY3Rpb24gKHhtbERvYywgcGFyYW1zLCByZWdpb24sIHBhcmVudERvYykgeworCQl0cnkgeworCQkJdmFyIGNvbnRlbnQgPSB0aGlzLmdldFJlc3VsdFN0cmluZyh4bWxEb2MsIHBhcmFtcywgcGFyZW50RG9jKTsKKwkJCXJlZ2lvbi5pbm5lckhUTUwgPSBjb250ZW50OworCQl9CisJCWNhdGNoIChlKSB7CisJCQlkb2pvLnJhaXNlKGUubWVzc2FnZSArICJcblxuIHhzbHRVcmk6ICIgKyB4c2x0VXJpKTsKKwkJfQorCX07CisJdGhpcy50cmFuc2Zvcm1Ub0RvY3VtZW50ID0gZnVuY3Rpb24gKHhtbERvYywgcGFyYW1zKSB7CisJCXJldHVybiBnZXRSZXN1bHREb20oeG1sRG9jLCBwYXJhbXMpOworCX07CisJdGhpcy50cmFuc2Zvcm1Ub1dpbmRvdyA9IGZ1bmN0aW9uICh4bWxEb2MsIHBhcmFtcywgd2luZG93RG9jLCBwYXJlbnREb2MpIHsKKwkJdHJ5IHsKKwkJCXdpbmRvd0RvYy5vcGVuKCk7CisJCQl3aW5kb3dEb2Mud3JpdGUodGhpcy5nZXRSZXN1bHRTdHJpbmcoeG1sRG9jLCBwYXJhbXMsIHBhcmVudERvYykpOworCQkJd2luZG93RG9jLmNsb3NlKCk7CisJCX0KKwkJY2F0Y2ggKGUpIHsKKwkJCWRvam8ucmFpc2UoZS5tZXNzYWdlICsgIlxuXG4geHNsdFVyaTogIiArIHhzbHRVcmkpOworCQl9CisJfTsKK307CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy94bWwvX19wYWNrYWdlX18uanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL19fcGFja2FnZV9fLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTEwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zcmMveG1sL19fcGFja2FnZV9fLmpzCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKworCitkb2pvLnJlcXVpcmUoImRvam8ueG1sLlBhcnNlIik7Citkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmRvbSJdLCBicm93c2VyOlsiZG9qby5odG1sLioiXSwgZGFzaGJvYXJkOlsiZG9qby5odG1sLioiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLnhtbC4qIik7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy94bWwvc3ZnVXRpbC5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3NyYy94bWwvc3ZnVXRpbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM5ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3JjL3htbC9zdmdVdGlsLmpzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKK2Rvam8ucHJvdmlkZSgiZG9qby54bWwuc3ZnVXRpbCIpOworLy8gRklYTUU6IGFkZCBpbXBvcnRzIGZvciBkZXBzIQorCitkb2pvLnhtbC5zdmdVdGlsID0gbmV3IGZ1bmN0aW9uKCl7CisKKwl0aGlzLmdldElubmVyV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwkJLy8gRklYTUU6IG5lZWQgdG8gZmluZCBvdXQgZnJvbSBkeWxhbiBob3cgdG8gCisJfQorCisJdGhpcy5nZXRPdXRlcldpZHRoID0gZnVuY3Rpb24obm9kZSl7CisJCQorCX0KKworCXRoaXMuZ2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwkJCisJfQorCisJdGhpcy5nZXRPdXRlckhlaWdodCA9IGZ1bmN0aW9uKG5vZGUpeworCQkKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0b3JhZ2VfZGlhbG9nLnN3ZiBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0b3JhZ2VfZGlhbG9nLnN3ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE1ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RvcmFnZV9kaWFsb2cuc3dmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy9Db21ib0JveC5jc3MgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvQ29tYm9Cb3guY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzhmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvQ29tYm9Cb3guY3NzCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy5kb2pvQ29tYm9Cb3hPdXRlciB7CisJYm9yZGVyOiAwcHggIWltcG9ydGFudDsKKwltYXJnaW46IDBweCAhaW1wb3J0YW50OworCXBhZGRpbmc6IDBweCAhaW1wb3J0YW50OworCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CisJd2hpdGUtc3BhY2U6IG5vd3JhcCAhaW1wb3J0YW50OworfQorCisuZG9qb0NvbWJvQm94IHsKKwlib3JkZXI6IDFweCBpbnNldCAjYWZhZmFmOworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDBweDsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlICFpbXBvcnRhbnQ7CisJZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsKKwlwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7CisJZGlzcGxheTogaW5saW5lOworfQorCisvKiB0aGUgaW5wdXQgYm94ICovCitpbnB1dC5kb2pvQ29tYm9Cb3ggeworCWJvcmRlci1yaWdodC13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CisJbWFyZ2luLXJpZ2h0OiAwcHggIWltcG9ydGFudDsKKwlwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDsKK30KKworLyogdGhlIGRvd24gYXJyb3cgKi8KK2ltZy5kb2pvQ29tYm9Cb3ggeworCWJvcmRlci1sZWZ0LXdpZHRoOiAwcHggIWltcG9ydGFudDsKKwlwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OworCW1hcmdpbi1sZWZ0OiAwcHggIWltcG9ydGFudDsKK30KKworLyogSUUgdmVydGljYWwtYWxpZ25tZW50IGNhbGN1bGF0aW9ucyBjYW4gYmUgb2ZmIGJ5ICstMSBidXQgdGhlc2UgbWFyZ2lucyBhcmUgY29sbGFwc2VkIGF3YXkgKi8KKy5kal9pZSBpbWcuZG9qb0NvbWJvQm94IHsKKwltYXJnaW4tdG9wOiAxcHg7CisJbWFyZ2luLWJvdHRvbTogMXB4OworfQorCisvKiB0aGUgZHJvcCBkb3duICovCisuZG9qb0NvbWJvQm94T3B0aW9ucyB7CisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgR2FyYW1vbmQsIHNhbnMtc2VyaWY7CisJLyogZm9udC1zaXplOiAwLjdlbTsgKi8KKwliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKwlib3JkZXI6IDFweCBzb2xpZCAjYWZhZmFmOworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl6LWluZGV4OiAxMDAwOworCW92ZXJmbG93OiBhdXRvOworCWN1cnNvcjogZGVmYXVsdDsKK30KKworLmRvam9Db21ib0JveEl0ZW0geworCXBhZGRpbmctbGVmdDogMnB4OworCXBhZGRpbmctdG9wOiAycHg7CisJbWFyZ2luOiAwcHg7Cit9CisKKy5kb2pvQ29tYm9Cb3hJdGVtRXZlbiB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKK30KKworLmRvam9Db21ib0JveEl0ZW1PZGQgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworfQorCisuZG9qb0NvbWJvQm94SXRlbUhpZ2hsaWdodCB7CisJYmFja2dyb3VuZC1jb2xvcjogIzYzNzA5QTsKKwljb2xvcjogd2hpdGU7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L0JpbmQuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L0JpbmQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzMjY5YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvQmluZC5qcwpAQCAtMCwwICsxLDQ2NCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkJpbmQiKTsKKworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7Citkb2pvLnJlcXVpcmUoImRvam8ubGZ4Lmh0bWwiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuQmluZCIsCisgIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIHsKKyAgd2lkZ2V0VHlwZSA6ICJCaW5kIiwKKyAgZXhlY3V0ZVNjcmlwdHMgOiBmYWxzZSwKKyAgc2NyaXB0U2VwYXJhdGlvbiA6IGZhbHNlLAorICB0YXJnZXRzIDogIiIsCisgIHRhcmdldHNBcnJheSA6IG51bGwsCisgIGhyZWYgOiAiIiwKKyAgaGFuZGxlciA6ICIiLAorCisgIC8vbWVzc2FnZXMKKyAgbG9hZGluZ1RleHQgOiAiTG9hZGluZy4uLiIsCisgIGVycm9yVGV4dCA6ICIiLAorICBzaG93RXJyb3IgOiB0cnVlLAorICBzaG93TG9hZGluZyA6IGZhbHNlLAorCisgIC8vcHViL3N1YiBldmVudHMKKyAgbGlzdGVuVG9waWNzIDogIiIsCisgIG5vdGlmeVRvcGljcyA6ICIiLAorICBub3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIGJlZm9yZU5vdGlmeVRvcGljcyA6ICIiLAorICBiZWZvcmVOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIGFmdGVyTm90aWZ5VG9waWNzIDogIiIsCisgIGFmdGVyTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBlcnJvck5vdGlmeVRvcGljcyA6ICIiLAorICBlcnJvck5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKworICBmb3JtSWQgOiAiIiwKKyAgZm9ybUZpbHRlciA6ICIiLAorICBmb3JtTm9kZSA6IG51bGwsCisKKyAgZXZlbnRzIDogIiIsCisgIGluZGljYXRvciA6ICIiLAorCisgIHBhcnNlQ29udGVudCA6IHRydWUsCisgIAorICBoaWdobGlnaHRDb2xvciA6ICIiLAorICBoaWdobGlnaHREdXJhdGlvbiA6IDIwMDAsCisgIAorICB2YWxpZGF0ZSA6IGZhbHNlLAorICBhamF4QWZ0ZXJWYWxpZGF0aW9uIDogZmFsc2UsCisgIAorICAvL3VzZWQgZm9yIHNjcmlwdHMgZG93bmxvYWRpbmcgJiBjYWNoaW5nCisgIGNhY2hlQ29udGVudCA6IHRydWUsCisgIC8vcnVuIHNjcmlwdCBvbiBpdHMgb3duIHNjb3BlCisgIHNjcmlwdFNlcGFyYXRpb24gOiB0cnVlLAorICAvL3Njb3BlIGZvciB0aGUgY3JpcHQgc2VwYXJhdGlvbgorICBzY3JpcHRTY29wZSA6IG51bGwsCisgIHRyYW5zcG9ydCA6ICIiLAorICAgCisgIHBvc3RDcmVhdGUgOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisKKyAgICAvL2F0dGFjaCBsaXN0ZW5lcnMKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmxpc3RlblRvcGljcykpIHsKKyAgICAgIHRoaXMubG9nKCJMaXN0ZW5pbmcgdG8gIiArIHRoaXMubGlzdGVuVG9waWNzICsgIiB0byByZWZyZXNoIik7CisgICAgICB2YXIgdG9waWNzID0gdGhpcy5saXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgIGlmKHRvcGljcykgeworICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0b3BpY3MsIGZ1bmN0aW9uKHRvcGljKXsKKyAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0b3BpYywgc2VsZiwgInJlbG9hZENvbnRlbnRzIik7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIC8vdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ub3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLm5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgLy9iZWZvcmUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmJlZm9yZU5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgLy9hZnRlciB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5hZnRlck5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKyAgICAKKyAgICAvL2Vycm9yIHRvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YXJnZXRzKSkgeworICAgICAgLy9zcGxpdCB0YXJnZXRzCisgICAgICB0aGlzLnRhcmdldHNBcnJheSA9IHRoaXMudGFyZ2V0cy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXZlbnRzKSkgeworICAgICAgdmFyIGV2ZW50c0FycmF5ID0gdGhpcy5ldmVudHMuc3BsaXQoIiwiKTsKKyAgICAgIGlmKGV2ZW50c0FycmF5ICYmIHRoaXMuZG9tTm9kZSkgeworICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaChldmVudHNBcnJheSwgZnVuY3Rpb24oZXZlbnQpeworICAgICAgICAgICBkb2pvLmV2ZW50LmNvbm5lY3Qoc2VsZi5kb21Ob2RlLCBldmVudCwgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgICAgICAgIHNlbGYucmVsb2FkQ29udGVudHMoKTsKKyAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIGlmKGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5mb3JtSWQpKSB7CisgICAgICAvL25vIGZvcm1JZCwgc2VlIGlmIHdlIGFyZSBpbnNpZGUgYSBmb3JtCisgICAgICB0aGlzLmZvcm1Ob2RlID0gZG9qby5kb20uZ2V0Rmlyc3RBbmNlc3RvckJ5VGFnKHRoaXMuZG9tTm9kZSwgImZvcm0iKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5mb3JtTm9kZSA9IGRvam8uYnlJZCh0aGlzLmZvcm1JZCk7CisgICAgfQorCisgICAgaWYodGhpcy5mb3JtTm9kZSAmJiBkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaHJlZikpIHsKKyAgICAgIHRoaXMuaHJlZiA9IHRoaXMuZm9ybU5vZGUuYWN0aW9uOworICAgIH0KKyAgfSwKKworICBoaWdobGlnaHQgOiBmdW5jdGlvbigpIHsKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhpZ2hsaWdodENvbG9yKSkgeworICAgICAgdmFyIG5vZGVzID0gW107CisgICAgICAvL2FkZCBub2RlcyB0byBhcnJheQorICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy50YXJnZXRzQXJyYXksIGZ1bmN0aW9uKHRhcmdldCkgeworICAgICAgICB2YXIgbm9kZSA9IGRvam8uYnlJZCh0YXJnZXQpOworICAgICAgICBpZihub2RlKSB7CisgICAgICAgICAgbm9kZXMucHVzaChub2RlKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICB2YXIgZWZmZWN0ID0gZG9qby5sZnguaHRtbC5oaWdobGlnaHQobm9kZXMsIHRoaXMuaGlnaGxpZ2h0Q29sb3IsIHRoaXMuaGlnaGxpZ2h0RHVyYXRpb24pOworICAgICAgZWZmZWN0LnBsYXkoKTsgICAgCisgICAgfQorICB9LAorICAKKyAgbG9nIDogZnVuY3Rpb24odGV4dCkgeworICAgIGRvam8uZGVidWcoIlsiICsgKHRoaXMud2lkZ2V0SWQgPyB0aGlzLndpZGdldElkIDogInVua25vd24iKSAgKyAiXSAiICsgdGV4dCk7CisgIH0sCisKKyAgc2V0Q29udGVudCA6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICBpZih0aGlzLnRhcmdldHNBcnJheSkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOworCSAgdmFyIHhtbFBhcnNlciA9IG5ldyBkb2pvLnhtbC5QYXJzZSgpOworICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy50YXJnZXRzQXJyYXksIGZ1bmN0aW9uKHRhcmdldCkgeworICAgICAgICB2YXIgbm9kZSA9IGRvam8uYnlJZCh0YXJnZXQpOworICAgICAgICBpZihub2RlKSB7CisgICAgICAgICAgbm9kZS5pbm5lckhUTUwgPSB0ZXh0OworICAKKyAgICAgICAgICBpZihzZWxmLnBhcnNlQ29udGVudCAmJiB0ZXh0ICE9IHNlbGYubG9hZGluZ1RleHQpeworICAgICAgICAgICAgdmFyIGZyYWcgID0geG1sUGFyc2VyLnBhcnNlRWxlbWVudChub2RlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIGRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZywgZG9qby53aWRnZXQuYnlJZCh0YXJnZXQpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi5sb2coIlVuYWJsZSB0byBmaW5kIHRhcmdldDogIiArIG5vZGUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sCisgIAorICBiaW5kSGFuZGxlciA6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGUpIHsKKyAgICAvL2hpZGUgaW5kaWNhdG9yCisgICAgZG9qby5odG1sLmhpZGUodGhpcy5pbmRpY2F0b3IpOworICAgIAorICAgIC8vcHVibGlzaCB0b3BpY3MKKyAgICB0aGlzLm5vdGlmeShkYXRhLCB0eXBlLCBlKTsKKyAgICAKKyAgICBpZih0eXBlID09ICJsb2FkIikgeworICAgICAgaWYodGhpcy52YWxpZGF0ZSkgeworICAgICAgICBTdHJ1dHNVdGlscy5jbGVhclZhbGlkYXRpb25FcnJvcnModGhpcy5mb3JtTm9kZSk7CisgICAgICAgIC8vdmFsaWRhdGlvbiBpcyBhY3RpdmUgZm9yIHRoaXMgYWN0aW9uCisgICAgICAgIHZhciBlcnJvcnMgPSBTdHJ1dHNVdGlscy5nZXRWYWxpZGF0aW9uRXJyb3JzKGRhdGEpOworICAgICAgICBpZihlcnJvcnMgJiYgZXJyb3JzLmZpZWxkRXJyb3JzKSB7CisgICAgICAgICAgLy92YWxpZGF0aW9uIGZhaWxlZAorICAgICAgICAgIFN0cnV0c1V0aWxzLnNob3dWYWxpZGF0aW9uRXJyb3JzKHRoaXMuZm9ybU5vZGUsIGVycm9ycyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vdmFsaWRhdGlvbiBwYXNzZWQKKyAgICAgICAgICBpZighdGhpcy5hamF4QWZ0ZXJWYWxpZGF0aW9uICYmIHRoaXMuZm9ybU5vZGUpIHsKKyAgICAgICAgICAgIC8vcmVndWxhciBzdWJtaXQKKyAgICAgICAgICAgIHRoaXMuZm9ybU5vZGUuc3VibWl0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IAorICAgICAgCisgICAgICAvLyBubyB2YWxpZGF0aW9uIG9yIHZhbGlkYXRpb24gcGFzc2VkCisgICAgICBpZih0aGlzLmV4ZWN1dGVTY3JpcHRzKSB7CisgICAgICAgIC8vcGFyc2UgdGV4dCB0byBleHRyYWN0IGNvbnRlbnQgYW5kIGphdmFzY3JpcHQKKyAgICAgICAgdmFyIHBhcnNlZCA9IHRoaXMucGFyc2UoZGF0YSk7CisgICAgICAgICAKKyAgICAgICAgLy91cGRhdGUgdGFyZ2V0cyBjb250ZW50CisgICAgICAgIHRoaXMuc2V0Q29udGVudChwYXJzZWQudGV4dCk7CisgICAgICAgIAorICAgICAgICAvL2V4ZWN1dGUgc2NyaXB0cworICAgICAgICB0aGlzLl9leGVjdXRlU2NyaXB0cyhwYXJzZWQuc2NyaXB0cyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdGhpcy5zZXRDb250ZW50KGRhdGEpOworICAgICAgfQorICAgICAgdGhpcy5oaWdobGlnaHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYodGhpcy5zaG93RXJyb3IpIHsKKyAgICAgICAgdmFyIG1lc3NhZ2UgPSBkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JUZXh0KSA/IGUubWVzc2FnZSA6IHRoaXMuZXJyb3JUZXh0OworICAgICAgICB0aGlzLnNldENvbnRlbnQobWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICB9LAorCisgIG5vdGlmeSA6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIGUpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgLy9nZW5lcmFsIHRvcGljcworICAgIGlmKHRoaXMubm90aWZ5VG9waWNzQXJyYXkpIHsKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRoaXMubm90aWZ5VG9waWNzQXJyYXksIGZ1bmN0aW9uKHRvcGljKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCB0eXBlLCBlLCBzZWxmKTsKKyAgICAgICAgfSBjYXRjaChleCl7CisJCSAgc2VsZi5sb2coZXgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgLy9iZWZvcmUsIGFmdGVyIGFuZCBlcnJvciB0b3BpY3MKKyAgICB2YXIgdG9waWNzQXJyYXkgPSBudWxsOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICBjYXNlICJiZWZvcmUiOgorICAgICAgICB0aGlzLm5vdGlmeVRvKHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzQXJyYXksIG51bGwsIGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImxvYWQiOgorICAgICAgICB0aGlzLm5vdGlmeVRvKHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSwgZGF0YSwgZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiZXJyb3IiOgorICAgICAgICB0aGlzLm5vdGlmeVRvKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSwgZGF0YSwgZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSwKKyAgCisgIG5vdGlmeVRvIDogZnVuY3Rpb24odG9waWNzQXJyYXksIGRhdGEsIGUpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgaWYodG9waWNzQXJyYXkpIHsKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRvcGljc0FycmF5LCBmdW5jdGlvbih0b3BpYykgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCBlLCBzZWxmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godG9waWMsIGUsIHNlbGYpOworICAgICAgICB9CisgICAgICB9IGNhdGNoKGV4KXsKKyAgICAgICAgc2VsZi5sb2coZXgpOworICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LAorCisgIG9uRG93bmxvYWRTdGFydCA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgaWYodGhpcy5zaG93TG9hZGluZyAmJiAhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmxvYWRpbmdUZXh0KSkgeworICAgICAgZXZlbnQudGV4dCA9IHRoaXMubG9hZGluZ1RleHQ7CisgICAgfQorICB9LAorCisgIHJlbG9hZENvbnRlbnRzIDogZnVuY3Rpb24oZXZ0KSB7CisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5oYW5kbGVyKSkgeworICAgICAgLy91c2UgY3VzdG9tIGhhbmRsZXIKKyAgICAgIHRoaXMubG9nKCJJbnZva2luZyBoYW5kbGVyOiAiICsgdGhpcy5oYW5kbGVyKTsKKyAgICAgIHdpbmRvd1t0aGlzLmhhbmRsZXJdKHRoaXMsIHRoaXMuZG9tTm9kZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgICAgdmFyIHJlcXVlc3QgPSB7Y2FuY2VsOiBmYWxzZX07CisgICAgICAgICAgdGhpcy5ub3RpZnkodGhpcy53aWRnZXRJZCwgImJlZm9yZSIsIHJlcXVlc3QpOworICAgICAgICAgIGlmKHJlcXVlc3QuY2FuY2VsKSB7CisgICAgICAgICAgICB0aGlzLmxvZygiUmVxdWVzdCBjYW5jZWxlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vaWYgdGhlIGhyZWYgaXMgbnVsbCwgd2Ugc3RpbGwgcHVibGlzaCB0aGUgbm90aWZ5IHRvcGljcworICAgICAgICAgIGlmKGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ocmVmKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBwYXJlbnQgZm9ybSwgYW5kIGl0IGhhcyBhICJvbnN1Ym1pdCIKKyAgICAgICAgICAvL2V4ZWN1dGUgaXQsIHZhbGlkYXRpb24gaXMgdXN1YWxseSB0aGVyZSwgZXhjZXB0IGlzIHZhbGlkYXRpb24gPT0gdHJ1ZQorICAgICAgICAgIC8vb24gd2hpY2ggY2FzZSBpdCBpcyBhamF4IHZhbGlkYXRpb24sIGluc3RlYWQgb2YgY2xpZW50IHNpZGUKKyAgICAgICAgICBpZighdGhpcy52YWxpZGF0ZSAmJiB0aGlzLmZvcm1Ob2RlICYmIHRoaXMuZm9ybU5vZGUub25zdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIG1ha2VSZXF1ZXN0ID0gdGhpcy5mb3JtTm9kZS5vbnN1Ym1pdC5jYWxsKGV2dCk7CisgICAgICAgICAgICBpZihtYWtlUmVxdWVzdCAhPSBudWxsICYmICFtYWtlUmVxdWVzdCkgeworICAgICAgICAgICAgICB0aGlzLmxvZygiUmVxdWVzdCBjYW5jZWxlZCBieSAnb25zdWJtaXQnIG9mIHRoZSBmb3JtIik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvL3Nob3cgaW5kaWNhdG9yCisgICAgICAgICAgZG9qby5odG1sLnNob3codGhpcy5pbmRpY2F0b3IpOworCQkgIGlmKHRoaXMuc2hvd0xvYWRpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudCh0aGlzLmxvYWRpbmdUZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgdmFyIHRtcEhyZWYgPSB0aGlzLmhyZWY7CisgICAgICAgICAgdG1wSHJlZiA9IHRtcEhyZWYgKyAodG1wSHJlZi5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyAic3RydXRzLmVuYWJsZUpTT05WYWxpZGF0aW9uPXRydWUiOworICAgICAgICAgIGlmKCF0aGlzLmFqYXhBZnRlclZhbGlkYXRpb24gJiYgdGhpcy52YWxpZGF0ZSkgeworICAgICAgICAgICAgdG1wSHJlZiA9IHRtcEhyZWYgKyAodG1wSHJlZi5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyAic3RydXRzLnZhbGlkYXRlT25seT10cnVlIjsKKyAgICAgICAgICB9ICAKKyAgICAgICAgICAKKyAgICAgICAgICBpZihkb2pvLmRvbS5pc1RhZyh0aGlzLmRvbU5vZGUsICJJTlBVVCIsICJpbnB1dCIpIAorICAgICAgICAgICAgICYmIHRoaXMuZXZlbnRzID09ICJvbmNsaWNrIiAKKyAgICAgICAgICAgICAmJiB0aGlzLmRvbU5vZGUudHlwZSA9PSAic3VibWl0IgorICAgICAgICAgICAgICYmICFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZG9tTm9kZS5uYW1lKQorICAgICAgICAgICAgICYmICFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZG9tTm9kZS52YWx1ZSkpIHsKKyAgICAgICAgICAgICB2YXIgZW5jID0gL3V0Zi9pLnRlc3QoIiIpID8gZW5jb2RlVVJJQ29tcG9uZW50IDogZG9qby5zdHJpbmcuZW5jb2RlQXNjaWkKKyAgICAgICAgICAgICB0bXBIcmVmID0gdG1wSHJlZiArICh0bXBIcmVmLmluZGV4T2YoIj8iKSA+IC0xID8gIiYiIDogIj8iKSArIGVuYyh0aGlzLmRvbU5vZGUubmFtZSkgKyAiPSIgKyBlbmModGhpcy5kb21Ob2RlLnZhbHVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBkb2pvLmlvLmJpbmQoeworICAgICAgICAgICAgdXJsOiB0bXBIcmVmLAorICAgICAgICAgICAgdXNlQ2FjaGU6IGZhbHNlLAorICAgICAgICAgICAgcHJldmVudENhY2hlOiB0cnVlLAorICAgICAgICAgICAgZm9ybU5vZGU6IHNlbGYuZm9ybU5vZGUsCisgICAgICAgICAgICBmb3JtRmlsdGVyOiB3aW5kb3dbc2VsZi5mb3JtRmlsdGVyXSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogc2VsZi50cmFuc3BvcnQsCisgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgICAgIGRvam8ubGFuZy5oaXRjaChzZWxmLCAiYmluZEhhbmRsZXIiKSh0eXBlLCBkYXRhLCBlKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBtaW1ldHlwZTogInRleHQvaHRtbCIKKyAgICAgICAgIH0pOworICAgICAgfQorICAgICAgY2F0Y2goZXgpIHsKKyAgICAgICAgaWYodGhpcy5zaG93RXJyb3IpIHsKKyAgICAgICAgICB2YXIgbWVzc2FnZSA9IGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvclRleHQpID8gZXggOiB0aGlzLmVycm9yVGV4dDsKKyAgICAgICAgICB0aGlzLnNldENvbnRlbnQobWVzc2FnZSk7CisgICAgICAgIH0gIAorICAgICAgfQorICAgIH0KKyAgfSwKKworICAvL2Zyb20gRG9qbydzIENvbnRlbnRQYW5lCisgIHBhcnNlIDogZnVuY3Rpb24ocykgeworICAgIHRoaXMubG9nKCJQYXJzaW5nOiAiICsgcyk7CisgICAgdmFyIG1hdGNoID0gW107CisgICAgdmFyIHRtcCA9IFtdOworICAgIHZhciBzY3JpcHRzID0gW107CisgICAgd2hpbGUobWF0Y2gpeworICAgICAgbWF0Y2ggPSBzLm1hdGNoKC88c2NyaXB0KFtePl0qKT4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9pKTsKKyAgICAgIGlmKCFtYXRjaCl7IGJyZWFrOyB9CisgICAgICBpZihtYXRjaFsxXSl7CisgICAgICAgIGF0dHIgPSBtYXRjaFsxXS5tYXRjaCgvc3JjPShbJyJdPykoW14iJ10qKVwxL2kpOworICAgICAgICBpZihhdHRyKXsKKyAgICAgICAgICAvLyByZW1vdmUgYSBkb2pvLmpzIG9yIGRvam8uanMudW5jb21wcmVzc2VkLmpzIGZyb20gcmVtb3RlU2NyaXB0cworICAgICAgICAgIC8vIHdlIGRlY2xhcmUgYWxsIGZpbGVzIHdpdGggZG9qby5qcyBhcyBiYWQsIHJlZ2FyZGxlc3Mgb2YgZm9sZGVyCisgICAgICAgICAgdmFyIHRtcDIgPSBhdHRyWzJdLnNlYXJjaCgvLiooXGJkb2pvXGIoPzpcLnVuY29tcHJlc3NlZCk/XC5qcykkLyk7CisgICAgICAgICAgaWYodG1wMiA+IC0xKXsKKyAgICAgICAgICAgIHRoaXMubG9nKCJTZWN1cml0eSBub3RlISBpbmhpYml0OiIrYXR0clsyXSsiIGZyb20gIGJlZWluZyBsb2FkZWQgYWdhaW4uIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZihtYXRjaFsyXSl7CisgICAgICAgIC8vIHN0cmlwIG91dCBhbGwgZGpDb25maWcgdmFyaWFibGVzIGZyb20gc2NyaXB0IHRhZ3Mgbm9kZVZhbHVlCisgICAgICAgIC8vIHRoaXMgaXMgQUJTT0xVVExZIG5lZWRlZCBhcyByZWluaXRpYWxpemUgZGpDb25maWcgYWZ0ZXIgZG9qbyBpcyBpbml0aWFsaXNlZAorICAgICAgICAvLyBtYWtlcyBhIGRpc3Nhc3RlciBncmVhdGVyIHRoYW4gVGl0YW5pYywgdXBkYXRlIHJlbW92ZSB3cml0ZUluY2x1ZGVzKCkgdG8KKyAgICAgICAgdmFyIHNjID0gbWF0Y2hbMl0ucmVwbGFjZSgvKD86dmFyICk/XGJkakNvbmZpZ1xiKD86W1xzXSo9W1xzXSpce1tefV0rXH18XC5bXHddKltcc10qPVtcc10qW147XG5dKik/Oz98ZG9qb1wuaG9zdGVudlwud3JpdGVJbmNsdWRlc1woXHMqXCk7Py9nLCAiIik7CisgICAgICAgIGlmKCFzYyl7IGNvbnRpbnVlOyB9CisKKyAgICAgICAgLy8gY3V0IG91dCBhbGwgZG9qby5yZXF1aXJlICguLi4pIGNhbGxzLCBpZiB3ZSBoYXZlIGV4ZWN1dGUKKyAgICAgICAgLy8gc2NyaXB0cyBmYWxzZSB3aWRnZXRzIGRvbnQgZ2V0IHRoZXJlIHJlcXVpcmUgY2FsbHMKKyAgICAgICAgLy8gZG9lcyBzdWNrIG91dCBwb3NzaWJsZSB3aWRnZXRwYWNrYWdlIHJlZ2lzdHJhdGlvbiBhcyB3ZWxsCisgICAgICAgIHRtcCA9IFtdOworICAgICAgICB3aGlsZSh0bXApeworICAgICAgICAgIHRtcCA9IHNjLm1hdGNoKC9kb2pvXC4oPzooPzpyZXF1aXJlKD86QWZ0ZXIpPyg/OklmKT8pfCg/OndpZGdldFwuKD86bWFuYWdlclwuKT9yZWdpc3RlcldpZGdldFBhY2thZ2UpfCg/Oig/Omhvc3RlbnZcLik/c2V0TW9kdWxlUHJlZml4KSlcKChbJyJdKS4qP1wxXClccyo7Py8pOworICAgICAgICAgIGlmKCF0bXApeyBicmVhazt9CisgICAgICAgICAgc2MgPSBzYy5yZXBsYWNlKHRtcFswXSwgIiIpOworICAgICAgICB9CisgICAgICAgIHNjcmlwdHMucHVzaChzYyk7CisgICAgICB9CisgICAgICBzID0gcy5yZXBsYWNlKC88c2NyaXB0W14+XSo+W1xzXFNdKj88XC9zY3JpcHQ+L2ksICIiKTsKKyAgICB9CisKKyAgICByZXR1cm4geworICAgICAgdGV4dDogcywKKyAgICAgIHNjcmlwdHM6IHNjcmlwdHMKKyAgICB9OworICB9LCAKKyAgCisgIC8vZnJvbSBEb2pvIGNvbnRlbnQgcGFuZQorICBfZXhlY3V0ZVNjcmlwdHMgOiBmdW5jdGlvbiAoc2NyaXB0cykgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICB2YXIgdG1wID0gIiIsIGNvZGUgPSAiIjsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKHNjcmlwdHNbaV0ucGF0aCkgeworICAgICAgICAgICAgZG9qby5pby5iaW5kKHRoaXMuX2NhY2hlU2V0dGluZyh7InVybCI6c2NyaXB0c1tpXS5wYXRoLCAibG9hZCI6ZnVuY3Rpb24gKHR5cGUsIHNjcmlwdFN0cikgeworICAgICAgICAgICAgICAgIGRvam8ubGFuZy5oaXRjaChzZWxmLCB0bXAgPSAiOyIgKyBzY3JpcHRTdHIpOworICAgICAgICAgICAgfSwgImVycm9yIjpmdW5jdGlvbiAodHlwZSwgZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBlcnJvci50ZXh0ID0gdHlwZSArICIgZG93bmxvYWRpbmcgcmVtb3RlIHNjcmlwdCI7CisgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRGVmYXVsdHMuY2FsbChzZWxmLCBlcnJvciwgIm9uRXhlY0Vycm9yIiwgImRlYnVnIik7CisgICAgICAgICAgICB9LCAibWltZXR5cGUiOiJ0ZXh0L3BsYWluIiwgInN5bmMiOnRydWV9LCB0aGlzLmNhY2hlQ29udGVudCkpOworICAgICAgICAgICAgY29kZSArPSB0bXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlICs9IHNjcmlwdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRoaXMuc2NyaXB0U2VwYXJhdGlvbikgeworICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NyaXB0U2NvcGU7CisgICAgICAgICAgICB0aGlzLnNjcmlwdFNjb3BlID0gbmV3IChuZXcgRnVuY3Rpb24oIl9jb250YWluZXJfIiwgY29kZSArICI7IHJldHVybiB0aGlzOyIpKShzZWxmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBkamcgPSBkb2pvLmdsb2JhbCgpOworICAgICAgICAgICAgaWYgKGRqZy5leGVjU2NyaXB0KSB7CisgICAgICAgICAgICAgICAgZGpnLmV4ZWNTY3JpcHQoY29kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhciBkamQgPSBkb2pvLmRvYygpOworICAgICAgICAgICAgICAgIHZhciBzYyA9IGRqZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAgICAgICAgICAgICAgICBzYy5hcHBlbmRDaGlsZChkamQuY3JlYXRlVGV4dE5vZGUoY29kZSkpOworICAgICAgICAgICAgICAgICh0aGlzLmNvbnRhaW5lck5vZGUgfHwgdGhpcy5kb21Ob2RlKS5hcHBlbmRDaGlsZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgICAgZS50ZXh0ID0gIkVycm9yIHJ1bm5pbmcgc2NyaXB0cyBmcm9tIGNvbnRlbnQ6XG4iICsgZS5kZXNjcmlwdGlvbjsKKyAgICAgICAgdGhpcy5sb2coZSk7CisgICAgfQorIH0sCisgCisgX2NhY2hlU2V0dGluZyA6IGZ1bmN0aW9uIChiaW5kT2JqLCB1c2VDYWNoZSkgeworICAgIGZvciAodmFyIHggaW4gdGhpcy5iaW5kQXJncykgeworICAgICAgICBpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGJpbmRPYmpbeF0pKSB7CisgICAgICAgICAgICBiaW5kT2JqW3hdID0gdGhpcy5iaW5kQXJnc1t4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGJpbmRPYmoudXNlQ2FjaGUpKSB7CisgICAgICAgIGJpbmRPYmoudXNlQ2FjaGUgPSB1c2VDYWNoZTsKKyAgICB9CisgICAgaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChiaW5kT2JqLnByZXZlbnRDYWNoZSkpIHsKKyAgICAgICAgYmluZE9iai5wcmV2ZW50Q2FjaGUgPSAhdXNlQ2FjaGU7CisgICAgfQorICAgIGlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9iai5taW1ldHlwZSkpIHsKKyAgICAgICAgYmluZE9iai5taW1ldHlwZSA9ICJ0ZXh0L2h0bWwiOworICAgIH0KKyAgICByZXR1cm4gYmluZE9iajsKKyB9CisgCit9KTsKKworCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvQmluZEFuY2hvci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvQmluZEFuY2hvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg4MTRlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9CaW5kQW5jaG9yLmpzCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kQW5jaG9yIik7CisKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIpOworZG9qby5yZXF1aXJlKCJkb2pvLmlvLioiKTsKK2Rvam8ucmVxdWlyZSgic3RydXRzLndpZGdldC5CaW5kIik7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuQmluZEFuY2hvciIsCisgIHN0cnV0cy53aWRnZXQuQmluZCwgeworICB3aWRnZXRUeXBlIDogIkJpbmRBbmNob3IiLAorCisgIGV2ZW50czogIm9uY2xpY2siLAorCisgIHBvc3RDcmVhdGUgOiBmdW5jdGlvbigpIHsKKyAgICAgc3RydXRzLndpZGdldC5CaW5kQW5jaG9yLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzKTsKKyAgICAgdGhpcy5kb21Ob2RlLmhyZWYgPSAiIyI7CisgIH0KK30pOworCisKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9CaW5kRGl2LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9CaW5kRGl2LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWJlODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L0JpbmREaXYuanMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRGl2Iik7CisKK2Rvam8ucmVxdWlyZSgiZG9qby5pby4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIik7Citkb2pvLnJlcXVpcmUoImRvam8ubGFuZy50aW1pbmcuVGltZXIiKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAic3RydXRzLndpZGdldC5CaW5kRGl2IiwKKyAgZG9qby53aWRnZXQuQ29udGVudFBhbmUsIHsKKyAgICB3aWRnZXRUeXBlIDogIkJpbmREaXYiLAorCisgICAgLy9mcm9tIENvbnRlbnRQYW5lCisgICAgaHJlZiA6ICIiLAorICAgIGV4dHJhY3RDb250ZW50IDogZmFsc2UsCisgICAgcGFyc2VDb250ZW50IDogZmFsc2UsCisgICAgY2FjaGVDb250ZW50IDogZmFsc2UsCisgICAgcmVmcmVzaE9uU2hvdyA6IGZhbHNlLAorICAgIGV4ZWN1dGVTY3JpcHRzIDogZmFsc2UsCisgICAgcHJlbG9hZCA6IHRydWUsCisgICAgCisgICAgLy91cGRhdGUgdGltZXMKKyAgICB1cGRhdGVGcmVxIDogMCwKKyAgICBkZWxheSA6IDAsCisgICAgYXV0b1N0YXJ0IDogdHJ1ZSwKKyAgICB0aW1lciA6IG51bGwsCisKKyAgICAvL21lc3NhZ2VzCisgICAgbG9hZGluZ1RleHQgOiAiTG9hZGluZy4uLiIsCisgICAgc2hvd0xvYWRpbmcgOiBmYWxzZSwKKyAgICBlcnJvclRleHQgOiAiIiwKKyAgICBzaG93RXJyb3IgOiB0cnVlLAorCisgICAgLy9wdWIvc3ViIGV2ZW50cworICAgIGxpc3RlblRvcGljcyA6ICIiLAorICAgIG5vdGlmeVRvcGljcyA6ICIiLAorICAgIG5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgICBzdG9wVGltZXJMaXN0ZW5Ub3BpY3MgOiAiIiwKKyAgICBzdGFydFRpbWVyTGlzdGVuVG9waWNzIDogIiIsCisgICAgYmVmb3JlTm90aWZ5VG9waWNzIDogIiIsCisgICAgYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICAgIGFmdGVyTm90aWZ5VG9waWNzIDogIiIsCisgICAgYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgICAgZXJyb3JOb3RpZnlUb3BpY3MgOiAiIiwKKyAgICBlcnJvck5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgICAKKworICAgIC8vY2FsbGJhY2tzCisgICAgYmVmb3JlTG9hZGluZyA6ICIiLAorICAgIGFmdGVyTG9hZGluZyA6ICIiLAorCisgICAgZm9ybUlkIDogIiIsCisgICAgZm9ybUZpbHRlciA6ICIiLAorCisgICAgaW5kaWNhdG9yOiAiIiwKKworCS8vbWFrZSBkb2pvIHByb2Nlc3MgdGhlIGNvbnRlbnQKKwlwYXJzZUNvbnRlbnQgOiB0cnVlLAorCisgICAgaGlnaGxpZ2h0Q29sb3IgOiAiIiwKKyAgICBoaWdobGlnaHREdXJhdGlvbiA6IDIwMDAsCisgICAgCisgICAgLy9vbmx5IHVzZWQgd2hlbiBpbnNpZGUgYSB0YWJiZWRwYW5lbAorICAgIGRpc2FibGVkIDogZmFsc2UsCisgICAgCisgICAgdHJhbnNwb3J0IDogIiIsCisgICAgCisgICAgb25Eb3dubG9hZFN0YXJ0IDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmKCF0aGlzLnNob3dMb2FkaW5nKSB7CisgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKHRoaXMuc2hvd0xvYWRpbmcgJiYgIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5sb2FkaW5nVGV4dCkpIHsKKyAgICAgICAgZXZlbnQudGV4dCA9IHRoaXMubG9hZGluZ1RleHQ7CisgICAgICB9CisgICAgfSwKKyAgICAKKyAgICBoaWdobGlnaHQgOiBmdW5jdGlvbigpIHsKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaGlnaGxpZ2h0Q29sb3IpKSB7CisgICAgICAgIHZhciBlZmZlY3QgPSBkb2pvLmxmeC5odG1sLmhpZ2hsaWdodChbdGhpcy5kb21Ob2RlXSwgdGhpcy5oaWdobGlnaHRDb2xvciwgdGhpcy5oaWdobGlnaHREdXJhdGlvbik7CisgICAgICAgIGVmZmVjdC5wbGF5KCk7ICAgIAorICAgICAgfSAgICAgICAgCisgICAgfSwKKworICAgIG9uRG93bmxvYWRFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkNvbnRlbnRFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkV4ZWNFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkVycm9yIDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmKHRoaXMuc2hvd0Vycm9yKSB7CisgICAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JUZXh0KSkgeworICAgICAgICAgIGV2ZW50LnRleHQgPSB0aGlzLmVycm9yVGV4dDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnQudGV4dCA9ICIiOworICAgICAgfQorICAgIH0sCisKKyAgICBub3RpZnkgOiBmdW5jdGlvbihkYXRhLCB0eXBlLCBlKSB7CisgICAgICBpZih0aGlzLm5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5ub3RpZnlUb3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCB0eXBlLCBlLCBzZWxmKTsKKyAgICAgICAgICB9IGNhdGNoKGV4KSB7CisgICAgICAgICAgICBzZWxmLmxvZyhleCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy9iZWZvcmUsIGFmdGVyIGFuZCBlcnJvciB0b3BpY3MKKyAgICAgIHZhciB0b3BpY3NBcnJheSA9IG51bGw7CisgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlICJiZWZvcmUiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSwgbnVsbCwgZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImxvYWQiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5LCBkYXRhLCBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZXJyb3IiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5LCBkYXRhLCBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9LAorICAgIAorICAgIG5vdGlmeVRvIDogZnVuY3Rpb24odG9waWNzQXJyYXksIGRhdGEsIGUpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIGlmKHRvcGljc0FycmF5KSB7CisgICAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRvcGljc0FycmF5LCBmdW5jdGlvbih0b3BpYykgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlmKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCBlLCBzZWxmKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBlLCBzZWxmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goZXgpeworICAgICAgICAgIHNlbGYubG9nKGV4KTsKKyAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcG9zdENyZWF0ZSA6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpIHsKKyAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT09ICIiKSB7CisgICAgICAgICAgdGhpcy5zZXRIYW5kbGVyKHRoaXMuaGFuZGxlcik7CisgICAgICB9CisKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHZhciBoaXRjaGVkUmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgInJlZnJlc2giKSgpOworICAgICAgfTsKKyAgICAgIHZhciBoaXRjaGVkU3RhcnRUaW1lciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgInN0YXJ0VGltZXIiKSgpOworICAgICAgfTsKKworICAgICAgaWYodGhpcy51cGRhdGVGcmVxID4gMCkgeworICAgICAgICAvL3RoZXJlIGlzIGEgdGltZXIKKyAgICAgICAgdGhpcy50aW1lciA9IG5ldyBkb2pvLmxhbmcudGltaW5nLlRpbWVyKHRoaXMudXBkYXRlRnJlcSk7CisgICAgICAgIHRoaXMudGltZXIub25UaWNrID0gaGl0Y2hlZFJlZnJlc2g7CisKKyAgICAgICAgaWYodGhpcy5hdXRvU3RhcnQpIHsKKyAgICAgICAgICAvL3N0YXJ0IHRoZSB0aW1lcgorICAgICAgICAgIGlmKHRoaXMuZGVsYXkgPiAwKSB7CisgICAgICAgICAgICAvL3N0YXJ0IHRpbWUgYWZ0ZXIgZGVsYXkKKyAgICAgICAgICAgIGRvam8ubGFuZy5zZXRUaW1lb3V0KGhpdGNoZWRTdGFydFRpbWVyLCB0aGlzLmRlbGF5KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9zdGFydCB0aW1lciBub3cKKyAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy9ubyB0aW1lcgorICAgICAgICBpZih0aGlzLmRlbGF5ID4gMCkgeworICAgICAgICAgIC8vbG9hZCBhZnRlciBkZWxheQorICAgICAgICAgIGRvam8ubGFuZy5zZXRUaW1lb3V0KGhpdGNoZWRSZWZyZXNoLCB0aGlzLmRlbGF5KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvL2F0dGFjaCBsaXN0ZW5lcnMKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubGlzdGVuVG9waWNzKSkgeworICAgICAgICB0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIgKyB0aGlzLmxpc3RlblRvcGljcyArICIgdG8gcmVmcmVzaCIpOworICAgICAgICB2YXIgdG9waWNzID0gdGhpcy5saXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgICAgaWYodG9waWNzKSB7CisgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2godG9waWNzLCBmdW5jdGlvbih0b3BpYyl7CisgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0b3BpYywgc2VsZiwgInJlZnJlc2giKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnN0b3BUaW1lckxpc3RlblRvcGljcykpIHsKKyAgICAgICAgdGhpcy5sb2coIkxpc3RlbmluZyB0byAiICsgdGhpcy5zdG9wVGltZXJMaXN0ZW5Ub3BpY3MgKyAiIHRvIHN0b3AgdGltZXIiKTsKKyAgICAgICAgdmFyIHN0b3BUb3BpY3MgPSB0aGlzLnN0b3BUaW1lckxpc3RlblRvcGljcy5zcGxpdCgiLCIpOworICAgICAgICBpZihzdG9wVG9waWNzKSB7CisgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goc3RvcFRvcGljcywgZnVuY3Rpb24odG9waWMpeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWMsIHNlbGYsICJzdG9wVGltZXIiKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MpKSB7CisgICAgICAgIHRoaXMubG9nKCJMaXN0ZW5pbmcgdG8gIiArIHRoaXMuc3RvcFRpbWVyTGlzdGVuVG9waWNzICsgIiB0byBzdGFydCB0aW1lciIpOworICAgICAgICB2YXIgc3RhcnRUb3BpY3MgPSB0aGlzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgICAgaWYoc3RhcnRUb3BpY3MpIHsKKyAgICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaChzdGFydFRvcGljcywgZnVuY3Rpb24odG9waWMpeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWMsIHNlbGYsICJzdGFydFRpbWVyIik7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgCisgICAgICAvL25vdGlmeSB0b3BpY3MKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLm5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy9iZWZvcmUgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmJlZm9yZU5vdGlmeVRvcGljcykpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vYWZ0ZXIgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyTm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmFmdGVyTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vZXJyb3IgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yTm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmKHRoaXMuaXNTaG93aW5nKCkgJiYgdGhpcy5wcmVsb2FkICYmIHRoaXMudXBkYXRlRnJlcSA8PSAwICYmIHRoaXMuZGVsYXkgPD0gMCkgeworICAgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2Rvd25sb2FkRXh0ZXJuYWxDb250ZW50OiBmdW5jdGlvbih1cmwsIHVzZUNhY2hlKSB7CisgICAgICAKKyAgICAgIHZhciByZXF1ZXN0ID0ge2NhbmNlbDogZmFsc2V9OworICAgICAgdGhpcy5ub3RpZnkodGhpcy53aWRnZXRJZCwgImJlZm9yZSIsIHJlcXVlc3QpOworICAgICAgaWYocmVxdWVzdC5jYW5jZWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvL3Nob3cgaW5kaWNhdG9yCisgICAgICBkb2pvLmh0bWwuc2hvdyh0aGlzLmluZGljYXRvcik7CisKKyAgICAgIHRoaXMuX2hhbmRsZURlZmF1bHRzKCJMb2FkaW5nLi4uIiwgIm9uRG93bmxvYWRTdGFydCIpOworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgZG9qby5pby5iaW5kKHsKKyAgICAgICAgdXJsOiB1cmwsCisgICAgICAgIHVzZUNhY2hlOiB1c2VDYWNoZSwKKyAgICAgICAgcHJldmVudENhY2hlOiAhdXNlQ2FjaGUsCisgICAgICAgIG1pbWV0eXBlOiAidGV4dC9odG1sIiwKKyAgICAgICAgZm9ybU5vZGU6IGRvam8uYnlJZChzZWxmLmZvcm1JZCksCisgICAgICAgIGZvcm1GaWx0ZXI6IHdpbmRvd1tzZWxmLmZvcm1GaWx0ZXJdLAorICAgICAgICB0cmFuc3BvcnQ6IHNlbGYudHJhbnNwb3J0LAorICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgLy9oaWRlIGluZGljYXRvcgorICAgICAgICAgIGRvam8uaHRtbC5oaWRlKHNlbGYuaW5kaWNhdG9yKTsKKworICAgICAgICAgIHNlbGYubm90aWZ5KGRhdGEsIHR5cGUsIGUpOworCisgICAgICAgICAgaWYodHlwZSA9PSAibG9hZCIpIHsKKyAgICAgICAgICAgIHNlbGYub25Eb3dubG9hZEVuZC5jYWxsKHNlbGYsIHVybCwgZGF0YSk7CisgICAgICAgICAgICBzZWxmLmhpZ2hsaWdodCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3b3JrcyBiZXN0IHdoZW4gZnJvbSBhIGxpdmUgc2VydmVyIGluc3RlYWQgb2YgZnJvbSBmaWxlIHN5c3RlbQorICAgICAgICAgICAgc2VsZi5faGFuZGxlRGVmYXVsdHMuY2FsbChzZWxmLCAiRXJyb3IgbG9hZGluZyAnIiArIHVybCArICInICgiICsgZS5zdGF0dXMgKyAiICIrICBlLnN0YXR1c1RleHQgKyAiKSIsICJvbkRvd25sb2FkRXJyb3IiKTsKKyAgICAgICAgICAgIHNlbGYub25Mb2FkKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgfSwKKworICAgIGxvZyA6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICAgIGRvam8uZGVidWcoIlsiICsgdGhpcy53aWRnZXRJZCArICJdICIgKyB0ZXh0KTsKKyAgICB9LAorCisgICAgc3RvcFRpbWVyIDogZnVuY3Rpb24oKSB7CisgICAgICBpZih0aGlzLnRpbWVyICYmIHRoaXMudGltZXIuaXNSdW5uaW5nKSB7CisgICAgICAgIHRoaXMubG9nKCJzdG9wcGluZyB0aW1lciIpOworICAgICAgICB0aGlzLnRpbWVyLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc3RhcnRUaW1lciA6IGZ1bmN0aW9uKCkgeworICAgICAgaWYodGhpcy50aW1lciAmJiAhdGhpcy50aW1lci5pc1J1bm5pbmcpIHsKKyAgICAgICAgdGhpcy5sb2coInN0YXJ0aW5nIHRpbWVyIHdpdGggdXBkYXRlIGludGVydmFsICIgKyB0aGlzLnVwZGF0ZUZyZXEpOworICAgICAgICB0aGlzLnRpbWVyLnN0YXJ0KCk7CisgICAgICB9CisgICAgfSwKKyAgICAKKyAgICAvL2Zyb20gRG9qbydzIENvbnRlbnRQYW5lCisgICAgLy9UT0RPOiByZW1vdmUgd2hlbiBmaXhlZCBvbiBEb2pvIChXVy0xODY5KQorICAgIHNwbGl0QW5kRml4UGF0aHM6ZnVuY3Rpb24gKHMsIHVybCkgeworICAgICAgdmFyIHRpdGxlcyA9IFtdLCBzY3JpcHRzID0gW10sIHRtcCA9IFtdOworICAgICAgdmFyIG1hdGNoID0gW10sIHJlcXVpcmVzID0gW10sIGF0dHIgPSBbXSwgc3R5bGVzID0gW107CisgICAgICB2YXIgc3RyID0gIiIsIHBhdGggPSAiIiwgZml4ID0gIiIsIHRhZ0ZpeCA9ICIiLCB0YWcgPSAiIiwgb3JpZ1BhdGggPSAiIjsKKyAgICAgIGlmICghdXJsKSB7CisgICAgICAgIHVybCA9ICIuLyI7CisgICAgICB9CisgICAgICBpZiAocykgeworICAgICAgICB2YXIgcmVnZXggPSAvPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOworICAgICAgICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHMpKSB7CisgICAgICAgICAgdGl0bGVzLnB1c2gobWF0Y2hbMV0pOworICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWRqdXN0UGF0aHMpIHsKKyAgICAgICAgICB2YXIgcmVnZXhGaW5kVGFnID0gLzxbYS16XVthLXowLTldKltePl0qXHMoPzooPzpzcmN8aHJlZnxzdHlsZSk9W14+XSkrW14+XSo+L2k7CisgICAgICAgICAgdmFyIHJlZ2V4RmluZEF0dHIgPSAvXHMoc3JjfGhyZWZ8c3R5bGUpPShbJyJdPykoW1x3KClcW1xdXC8uLFxcJyItOjsjPSY/XHNAIV0rPylcMi9pOworICAgICAgICAgIHZhciByZWdleFByb3RvY29scyA9IC9eKD86WyNdfCg/Oig/Omh0dHBzP3xmdHBzP3xmaWxlfGphdmFzY3JpcHR8bWFpbHRvfG5ld3MpOikpLzsKKyAgICAgICAgICB3aGlsZSAodGFnID0gcmVnZXhGaW5kVGFnLmV4ZWMocykpIHsKKyAgICAgICAgICAgIHN0ciArPSBzLnN1YnN0cmluZygwLCB0YWcuaW5kZXgpOworICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKCh0YWcuaW5kZXggKyB0YWdbMF0ubGVuZ3RoKSwgcy5sZW5ndGgpOworICAgICAgICAgICAgdGFnID0gdGFnWzBdOworICAgICAgICAgICAgdGFnRml4ID0gIiI7CisgICAgICAgICAgICB3aGlsZSAoYXR0ciA9IHJlZ2V4RmluZEF0dHIuZXhlYyh0YWcpKSB7CisgICAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgICAgICAgb3JpZ1BhdGggPSBhdHRyWzNdOworICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJbMV0udG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgInNyYyI6CisgICAgICAgICAgICAgICAgY2FzZSAiaHJlZiI6CisgICAgICAgICAgICAgICAgaWYgKHJlZ2V4UHJvdG9jb2xzLmV4ZWMob3JpZ1BhdGgpKSB7CisgICAgICAgICAgICAgICAgICBwYXRoID0gb3JpZ1BhdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHBhdGggPSAobmV3IGRvam8udXJpLlVyaSh1cmwsIG9yaWdQYXRoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAic3R5bGUiOgorICAgICAgICAgICAgICAgIHBhdGggPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQob3JpZ1BhdGgsIHVybCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYXRoID0gb3JpZ1BhdGg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZml4ID0gIiAiICsgYXR0clsxXSArICI9IiArIGF0dHJbMl0gKyBwYXRoICsgYXR0clsyXTsKKyAgICAgICAgICAgICAgdGFnRml4ICs9IHRhZy5zdWJzdHJpbmcoMCwgYXR0ci5pbmRleCkgKyBmaXg7CisgICAgICAgICAgICAgIHRhZyA9IHRhZy5zdWJzdHJpbmcoKGF0dHIuaW5kZXggKyBhdHRyWzBdLmxlbmd0aCksIHRhZy5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyICs9IHRhZ0ZpeCArIHRhZzsKKyAgICAgICAgICB9CisgICAgICAgICAgcyA9IHN0ciArIHM7CisgICAgICAgIH0KKyAgICAgICAgcmVnZXggPSAvKD86PChzdHlsZSlbXj5dKj4oW1xzXFNdKj8pPFwvc3R5bGU+fDxsaW5rIChbXj5dKnJlbD1bJyJdP3N0eWxlc2hlZXRbJyJdP1tePl0qKT4pL2k7CisgICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpIHsKKyAgICAgICAgICBpZiAobWF0Y2hbMV0gJiYgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSA9PSAic3R5bGUiKSB7CisgICAgICAgICAgICBzdHlsZXMucHVzaChkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQobWF0Y2hbMl0sIHVybCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXR0ciA9IG1hdGNoWzNdLm1hdGNoKC9ocmVmPShbJyJdPykoW14nIj5dKilcMS9pKSkgeworICAgICAgICAgICAgICBzdHlsZXMucHVzaCh7cGF0aDphdHRyWzJdfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHJlZ2V4ID0gLzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2k7CisgICAgICAgIHZhciByZWdleFNyYyA9IC9zcmM9KFsnIl0/KShbXiInXSopXDEvaTsKKyAgICAgICAgdmFyIHJlZ2V4RG9qb0pzID0gLy4qKFxiZG9qb1xiXC5qcyg/OlwudW5jb21wcmVzc2VkXC5qcyk/KSQvOworICAgICAgICB2YXIgcmVnZXhJbnZhbGlkID0gLyg/OnZhciApP1xiZGpDb25maWdcYig/Oltcc10qPVtcc10qXHtbXn1dK1x9fFwuW1x3XSpbXHNdKj1bXHNdKlteO1xuXSopPzs/fGRvam9cLmhvc3RlbnZcLndyaXRlSW5jbHVkZXNcKFxzKlwpOz8vZzsKKyAgICAgICAgdmFyIHJlZ2V4UmVxdWlyZXMgPSAvZG9qb1wuKD86KD86cmVxdWlyZSg/OkFmdGVyKT8oPzpJZik/KXwoPzp3aWRnZXRcLig/Om1hbmFnZXJcLik/cmVnaXN0ZXJXaWRnZXRQYWNrYWdlKXwoPzooPzpob3N0ZW52XC4pP3NldE1vZHVsZVByZWZpeHxyZWdpc3Rlck1vZHVsZVBhdGgpfGRlZmluZU5hbWVzcGFjZSlcKChbJyJdKS4qP1wxXClccyo7Py87CisgICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpIHsKKyAgICAgICAgICBpZiAodGhpcy5leGVjdXRlU2NyaXB0cyAmJiBtYXRjaFsxXSkgeworICAgICAgICAgICAgaWYgKGF0dHIgPSByZWdleFNyYy5leGVjKG1hdGNoWzFdKSkgeworICAgICAgICAgICAgICBpZiAocmVnZXhEb2pvSnMuZXhlYyhhdHRyWzJdKSkgeworICAgICAgICAgICAgICAgIGRvam8uZGVidWcoIlNlY3VyaXR5IG5vdGUhIGluaGliaXQ6IiArIGF0dHJbMl0gKyAiIGZyb20gIGJlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRzLnB1c2goe3BhdGg6YXR0clsyXX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtYXRjaFsyXSkgeworICAgICAgICAgICAgdmFyIHNjID0gbWF0Y2hbMl0ucmVwbGFjZShyZWdleEludmFsaWQsICIiKTsKKyAgICAgICAgICAgIGlmICghc2MpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAodG1wID0gcmVnZXhSZXF1aXJlcy5leGVjKHNjKSkgeworICAgICAgICAgICAgICByZXF1aXJlcy5wdXNoKHRtcFswXSk7CisgICAgICAgICAgICAgIHNjID0gc2Muc3Vic3RyaW5nKDAsIHRtcC5pbmRleCkgKyBzYy5zdWJzdHIodG1wLmluZGV4ICsgdG1wWzBdLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5leGVjdXRlU2NyaXB0cykgeworICAgICAgICAgICAgICBzY3JpcHRzLnB1c2goc2MpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBzID0gcy5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmV4dHJhY3RDb250ZW50KSB7CisgICAgICAgICAgbWF0Y2ggPSBzLm1hdGNoKC88Ym9keVtePl0qPlxzKihbXHNcU10rKVxzKjxcL2JvZHk+L2ltKTsKKyAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgIHMgPSBtYXRjaFsxXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVNjcmlwdHMgJiYgdGhpcy5zY3JpcHRTZXBhcmF0aW9uKSB7CisgICAgICAgICAgdmFyIHJlZ2V4ID0gLyg8W2EtekEtWl1bYS16QS1aMC05XSpcc1tePl0qP1xTPSkoKFsnIl0pW14+XSpzY3JpcHRTY29wZVtePl0qPikvOworICAgICAgICAgIHZhciByZWdleEF0dHIgPSAvKFtccyciOzpcKF0pc2NyaXB0U2NvcGUoLiopLzsKKyAgICAgICAgICBzdHIgPSAiIjsKKyAgICAgICAgICB3aGlsZSAodGFnID0gcmVnZXguZXhlYyhzKSkgeworICAgICAgICAgICAgdG1wID0gKCh0YWdbM10gPT0gIiciKSA/ICJcIiIgOiAiJyIpOworICAgICAgICAgICAgZml4ID0gIiI7CisgICAgICAgICAgICBzdHIgKz0gcy5zdWJzdHJpbmcoMCwgdGFnLmluZGV4KSArIHRhZ1sxXTsKKyAgICAgICAgICAgIHdoaWxlIChhdHRyID0gcmVnZXhBdHRyLmV4ZWModGFnWzJdKSkgeworICAgICAgICAgICAgICB0YWdbMl0gPSB0YWdbMl0uc3Vic3RyaW5nKDAsIGF0dHIuaW5kZXgpICsgYXR0clsxXSArICJkb2pvLndpZGdldC5ieUlkKCIgKyB0bXAgKyB0aGlzLndpZGdldElkICsgdG1wICsgIikuc2NyaXB0U2NvcGUiICsgYXR0clsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ciArPSB0YWdbMl07CisgICAgICAgICAgICBzID0gcy5zdWJzdHIodGFnLmluZGV4ICsgdGFnWzBdLmxlbmd0aCk7CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBzdHIgKyBzOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4geyJ4bWwiOnMsICJzdHlsZXMiOnN0eWxlcywgInRpdGxlcyI6dGl0bGVzLCAicmVxdWlyZXMiOnJlcXVpcmVzLCAic2NyaXB0cyI6c2NyaXB0cywgInVybCI6dXJsfTsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvQmluZEV2ZW50LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9CaW5kRXZlbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwNzUxZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvQmluZEV2ZW50LmpzCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRXZlbnQiKTsKKworZG9qby5yZXF1aXJlKCJzdHJ1dHMud2lkZ2V0LkJpbmQiKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAic3RydXRzLndpZGdldC5CaW5kRXZlbnQiLAorICBzdHJ1dHMud2lkZ2V0LkJpbmQsIHsKKyAgd2lkZ2V0VHlwZSA6ICJCaW5kRXZlbnQiLAorCisgIHNvdXJjZXM6ICIiLAorCisgIHBvc3RDcmVhdGUgOiBmdW5jdGlvbigpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LkJpbmRFdmVudC5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgdmFyIHNlbGYgPSB0aGlzOworCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ldmVudHMpICYmICFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc291cmNlcykpIHsKKyAgICAgIHZhciBldmVudHNBcnJheSA9IHRoaXMuZXZlbnRzLnNwbGl0KCIsIik7CisgICAgICB2YXIgc291cmNlc0FycmF5ID0gdGhpcy5zb3VyY2VzLnNwbGl0KCIsIik7CisKKyAgICAgIGlmKGV2ZW50c0FycmF5ICYmIHRoaXMuZG9tTm9kZSkgeworICAgICAgICAvL2V2ZW50cworICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaChldmVudHNBcnJheSwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAvL3NvdXJjZXMKKyAgICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaChzb3VyY2VzQXJyYXksIGZ1bmN0aW9uKHNvdXJjZSkgeworICAgICAgICAgICAgdmFyIHNvdXJjZU9iamVjdCA9IGRvam8uYnlJZChzb3VyY2UpOworICAgICAgICAgICAgaWYoc291cmNlT2JqZWN0KSB7CisgICAgICAgICAgICAgIGRvam8uZXZlbnQuY29ubmVjdChzb3VyY2VPYmplY3QsIGV2ZW50LCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRDb250ZW50cygpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L0NvbWJvQm94LmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9Db21ib0JveC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUyMWMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9Db21ib0JveC5qcwpAQCAtMCwwICsxLDUzNiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkNvbWJvQm94Iik7CisKK2Rvam8ucmVxdWlyZSgiZG9qby5odG1sLioiKTsKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29tYm9Cb3giKTsKKworc3RydXRzLndpZGdldC5Db21ib0JveERhdGFQcm92aWRlciA9IGZ1bmN0aW9uKGNvbWJvYm94LCBub2RlKXsKKyAgdGhpcy5kYXRhID0gW107CisgIHRoaXMuc2VhcmNoTGltaXQgPSBjb21ib2JveC5zZWFyY2hMaW1pdDsKKyAgdGhpcy5zZWFyY2hUeXBlID0gIlNUQVJUU1RSSU5HIjsgLy8gbWF5IGFsc28gYmUgIlNUQVJUV09SRCIgb3IgIlNVQlNUUklORyIKKyAgdGhpcy5jYXNlU2Vuc2l0aXZlID0gZmFsc2U7CisgIC8vIGZvciBjYWNoaW5nIG9wdGltaXphdGlvbnMKKyAgdGhpcy5fbGFzdFNlYXJjaCA9ICIiOworICB0aGlzLl9sYXN0U2VhcmNoUmVzdWx0cyA9IG51bGw7CisKKyAgdGhpcy5maXJzdFJlcXVlc3QgPSB0cnVlOworCisgIHRoaXMuY2JveCA9IGNvbWJvYm94OworICB0aGlzLmZvcm1JZCA9IHRoaXMuY2JveC5mb3JtSWQ7CisgIHRoaXMuZm9ybUZpbHRlciA9IHRoaXMuY2JveC5mb3JtRmlsdGVyOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMuY2JveC50cmFuc3BvcnQ7CisKKyAgdGhpcy5nZXREYXRhID0gZnVuY3Rpb24oLypTdHJpbmcqLyB1cmwpeworICAgIC8vc2hvdyBpbmRpY2F0b3IKKyAgICBkb2pvLmh0bWwuc2hvdyh0aGlzLmNib3guaW5kaWNhdG9yKTsKKworICAgIGRvam8uaW8uYmluZCh7CisgICAgICB1cmw6IHVybCwKKyAgICAgIGZvcm1Ob2RlOiBkb2pvLmJ5SWQodGhpcy5mb3JtSWQpLAorICAgICAgZm9ybUZpbHRlcjogd2luZG93W3RoaXMuZm9ybUZpbHRlcl0sCisgICAgICB0cmFuc3BvcnQ6IHRoaXMudHJhbnNwb3J0LAorICAgICAgaGFuZGxlcjogZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGV2dCkgeworICAgICAgICAvL2hpZGUgaW5kaWNhdG9yCisgICAgICAgIGRvam8uaHRtbC5oaWRlKHRoaXMuY2JveC5pbmRpY2F0b3IpOworCisgICAgICAgIC8vaWYgbm90aWZ5VG9waWNzIGlzIHB1Ymxpc2hlZCBvbiB0aGUgZmlyc3QgcmVxdWVzdCAob25sb2FkKQorICAgICAgICAvL3RoZSB2YWx1ZSBvZiBsaXN0ZW5lcnMgd2lsbCBiZSByZXNldAorICAgICAgICBpZighdGhpcy5maXJzdFJlcXVlc3QgfHwgdHlwZSA9PSAiZXJyb3IiKSB7CisgICAgICAgICAgdGhpcy5jYm94Lm5vdGlmeS5hcHBseSh0aGlzLmNib3gsIFtkYXRhLCB0eXBlLCBldnRdKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlyc3RSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgIHZhciBhcnJEYXRhID0gbnVsbDsKKyAgICAgICAgdmFyIGRhdGFCeU5hbWUgPSBkYXRhW2Rvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5jYm94LmRhdGFGaWVsZE5hbWUpID8gdGhpcy5jYm94Lm5hbWUgOiB0aGlzLmNib3guZGF0YUZpZWxkTmFtZV07CisgICAgICAgIGlmKCFkb2pvLmxhbmcuaXNBcnJheShkYXRhKSkgeworICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgZGF0YUZpZWxkTmFtZSwgdGFrZSBpdAorICAgICAgICAgICBpZihkYXRhQnlOYW1lKSB7CisgICAgICAgICAgICAgaWYoZG9qby5sYW5nLmlzQXJyYXkoZGF0YUJ5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvL29rLCBpdCBpcyBhbiBhcnJheQorICAgICAgICAgICAgICAgIGFyckRhdGEgPSBkYXRhQnlOYW1lOworICAgICAgICAgICAgIH0gZWxzZSBpZihkb2pvLmxhbmcuaXNPYmplY3QoZGF0YUJ5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvL2l0IGlzIGFuIG9iamVjdCwgdHJlYXQgaXQgbGlrZSBhIG1hcAorICAgICAgICAgICAgICAgIGFyckRhdGEgPSBbXTsKKyAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBkYXRhQnlOYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgYXJyRGF0YS5wdXNoKFtrZXksIGRhdGFCeU5hbWVba2V5XV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgLy90cnkgdG8gZmluZCBhIG1hdGNoCisgICAgICAgICAgICAgdmFyIHRtcEFyckRhdGEgPSBbXTsKKyAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBkYXRhKXsKKyAgICAgICAgICAgICAgIC8vZG9lcyBpdCBzdGFydCB3aXRoIHRoZSBmaWVsZCBuYW1lPyB0YWtlIGl0CisgICAgICAgICAgICAgICBpZihkb2pvLnN0cmluZy5zdGFydHNXaXRoKGtleSwgdGhpcy5jYm94Lm5hbWUpKSB7CisgICAgICAgICAgICAgICAgIGFyckRhdGEgPSBkYXRhW2tleV07CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgLy9pZiBuYXRoaW5nIGVsc2UgaXMgZm91bmQsIHdlIHdpbGwgdXNlIHZhbHVlcyBpbiB0aGlzCisgICAgICAgICAgICAgICAgIC8vb2JqZWN0IGFzIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgIHRtcEFyckRhdGEucHVzaChba2V5LCBkYXRhW2tleV1dKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8vZ3JhYiB0aGUgZmlyc3QgYXJyYXkgZm91bmQsIHdlIHdpbGwgdXNlIGl0IGlmIG5vdGhpbmcgZWxzZQorICAgICAgICAgICAgICAgLy9pcyBmb3VuZAorICAgICAgICAgICAgICAgaWYoIWFyckRhdGEgJiYgZG9qby5sYW5nLmlzQXJyYXkoZGF0YVtrZXldKSAmJiAhZG9qby5sYW5nLmlzU3RyaW5nKGRhdGFba2V5XSkpIHsKKyAgICAgICAgICAgICAgICAgYXJyRGF0YSA9IGRhdGFba2V5XTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYoIWFyckRhdGEpIHsKKyAgICAgICAgICAgICAgIGFyckRhdGEgPSB0bXBBcnJEYXRhOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGRhdGEgPSBhcnJEYXRhOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2V0RGF0YShkYXRhKTsKKyAgICAgIH0pLAorICAgICAgbWltZXR5cGU6ICJ0ZXh0L2pzb24iCisgICAgfSk7CisgIH07CisKKyAgdGhpcy5zdGFydFNlYXJjaCA9IGZ1bmN0aW9uIChzZWFyY2hTdHIsIGNhbGxiYWNrKSB7CisgICAgLy8gRklYTUU6IG5lZWQgdG8gYWRkIHRpbWVvdXQgaGFuZGxpbmcgaGVyZSEhCisgICAgdGhpcy5fcHJlZm9ybVNlYXJjaChzZWFyY2hTdHIsIGNhbGxiYWNrKTsKKyAgfTsKKworICB0aGlzLl9wcmVmb3JtU2VhcmNoID0gZnVuY3Rpb24oLypTdHJpbmcqLyBzZWFyY2hTdHIsIGNhbGxiYWNrKXsKKyAgICAvLworICAgIC8vICBOT1RFOiB0aGlzIHNlYXJjaCBpcyBMSU5FQVIsIHdoaWNoIG1lYW5zIHRoYXQgaXQgZXhoaWJpdHMgcGVyaGFwcworICAgIC8vICB0aGUgd29yc3QgcG9zc2libGUgc3BlZWQgY2hhcmFjdGVyaXN0aWNzIG9mIGFueSBzZWFyY2ggdHlwZS4gSXQncworICAgIC8vICB3cml0dGVuIHRoaXMgd2F5IHRvIG91dGxpbmUgdGhlIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGludGVyZmFjZXMgZm9yCisgICAgLy8gIGEgc2VhcmNoLgorICAgIC8vCisgICAgdmFyIHN0ID0gdGhpcy5zZWFyY2hUeXBlOworICAgIC8vIEZJWE1FOiB0aGlzIGlzIGp1c3QgYW4gZXhhbXBsZSBzZWFyY2gsIHdoaWNoIG1lYW5zIHRoYXQgd2UgaW1wbGVtZW50CisgICAgLy8gb25seSBhIGxpbmVhciBzZWFyY2ggd2l0aG91dCBhbnkgb2YgdGhlIGF0dGVuZGFudCAodXNlZnVsISkgb3B0aW1pemF0aW9ucworICAgIHZhciByZXQgPSBbXTsKKyAgICBpZighdGhpcy5jYXNlU2Vuc2l0aXZlKXsKKyAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpOworICAgIH0KKyAgICBmb3IodmFyIHg9MDsgeDx0aGlzLmRhdGEubGVuZ3RoOyB4KyspeworICAgICAgaWYoIXRoaXMuZGF0YVt4XSB8fCAhdGhpcy5kYXRhW3hdWzBdKSB7CisgICAgICAgIC8vbmVlZGVkIGZvciBJRQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCh0aGlzLnNlYXJjaExpbWl0ID4gMCkgJiYgKHJldC5sZW5ndGggPj0gdGhpcy5zZWFyY2hMaW1pdCkpIHsKKwkJCWJyZWFrOworICAgICAgfQorICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBhdm9pZCBjb3BpZXMgaWYgcG9zc2libGUhCisgICAgICB2YXIgZGF0YUxhYmVsID0gbmV3IFN0cmluZygoIXRoaXMuY2FzZVNlbnNpdGl2ZSkgPyB0aGlzLmRhdGFbeF1bMF0udG9Mb3dlckNhc2UoKSA6IHRoaXMuZGF0YVt4XVswXSk7CisgICAgICBpZihkYXRhTGFiZWwubGVuZ3RoIDwgc2VhcmNoU3RyLmxlbmd0aCl7CisgICAgICAgIC8vIHRoaXMgd29uJ3QgZXZlciBiZSBhIGdvb2Qgc2VhcmNoLCB3aWxsIGl0PyBXaGF0IGlmIHdlIHN0YXJ0CisgICAgICAgIC8vIHRvIHN1cHBvcnQgcmVnZXggc2VhcmNoPworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYoc3QgPT0gIlNUQVJUU1RSSU5HIil7CisgICAgICAgIGlmKHNlYXJjaFN0ciA9PSBkYXRhTGFiZWwuc3Vic3RyKDAsIHNlYXJjaFN0ci5sZW5ndGgpKXsKKyAgICAgICAgICByZXQucHVzaCh0aGlzLmRhdGFbeF0pOworICAgICAgICB9CisgICAgICB9ZWxzZSBpZihzdCA9PSAiU1VCU1RSSU5HIil7CisgICAgICAgIC8vIHRoaXMgb25lIGlzIGEgZ2ltbWllCisgICAgICAgIGlmKGRhdGFMYWJlbC5pbmRleE9mKHNlYXJjaFN0cikgPj0gMCl7CisgICAgICAgICAgcmV0LnB1c2godGhpcy5kYXRhW3hdKTsKKyAgICAgICAgfQorICAgICAgfWVsc2UgaWYoc3QgPT0gIlNUQVJUV09SRCIpeworICAgICAgICAvLyBkbyBhIHN1YnN0cmluZyBzZWFyY2ggYW5kIHRoZW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgaWYgdGhlCisgICAgICAgIC8vIHByZWNlZWRpbmcgY2hhciB3YXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIG9yIGEKKyAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyLgorICAgICAgICB2YXIgaWR4ID0gZGF0YUxhYmVsLmluZGV4T2Yoc2VhcmNoU3RyKTsKKyAgICAgICAgaWYoaWR4ID09IDApeworICAgICAgICAgIC8vIGltcGxpY2l0IG1hdGNoCisgICAgICAgICAgcmV0LnB1c2godGhpcy5kYXRhW3hdKTsKKyAgICAgICAgfQorICAgICAgICBpZihpZHggPD0gMCl7CisgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IG1hdGNoIG9yIGltcGxpY2lseSBtYXRjaGVkLCBtYXJjaCBvbndhcmQKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBvdGhlcndpc2UsIHdlIGhhdmUgdG8gZ28gZmlndXJlIG91dCBpZiB0aGUgbWF0Y2ggd2FzIGF0IHRoZQorICAgICAgICAvLyBzdGFydCBvZiBhIHdvcmQuLi4KKyAgICAgICAgLy8gdGhpcyBjb2RlIGlzIHRha2VuIGFsbW9zdCBkaXJlY3R5IGZyb20gbldpZGdldHMKKyAgICAgICAgdmFyIG1hdGNoZXMgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUoaWR4IT0tMSl7CisgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBtYXRjaCBlaXRoZXIgc3RhcnRzIHdob2xlIHN0cmluZywgb3IKKyAgICAgICAgICAvLyBmb2xsb3dzIGEgc3BhY2UsIG9yIGZvbGxvd3Mgc29tZSBwdW5jdHVhdGlvbgorICAgICAgICAgIGlmKCIgLC8oIi5pbmRleE9mKGRhdGFMYWJlbC5jaGFyQXQoaWR4LTEpKSAhPSAtMSl7CisgICAgICAgICAgICAvLyBGSVhNRTogd2hhdCBhYm91dCB0YWIgY2hhcnM/CisgICAgICAgICAgICBtYXRjaGVzID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlkeCA9IGRhdGFMYWJlbC5pbmRleE9mKHNlYXJjaFN0ciwgaWR4KzEpOworICAgICAgICB9CisgICAgICAgIGlmKCFtYXRjaGVzKXsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgcmV0LnB1c2godGhpcy5kYXRhW3hdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYWxsYmFjayhyZXQpOworICB9OworCisgIHRoaXMuYWRkRGF0YSA9IGZ1bmN0aW9uKC8qQXJyYXkqLyBwYWlycyl7CisgICAgLy8gRklYTUU6IGluY3JlZGlibHkgbmFpdmUgYW5kIHNsb3chCisgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChwYWlycyk7CisgIH07CisKKyAgdGhpcy5zZXREYXRhID0gZnVuY3Rpb24oLypBcnJheSovIHBkYXRhKXsKKyAgICAvLyBwb3B1bGF0ZSB0aGlzLmRhdGEgYW5kIGluaXRpYWxpemUgbG9va3VwIHN0cnVjdHVyZXMKKyAgICB0aGlzLmRhdGEgPSBwZGF0YTsKKyAgICAvL2FsbCBlbGxlbWVudHMgbXVzdCBiZSBhIGtleSBhbmQgdmFsdWUgcGFpcgorICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5kYXRhW2ldOworICAgICAgaWYoIWRvam8ubGFuZy5pc0FycmF5KGVsZW1lbnQpKSB7CisgICAgICAgIHRoaXMuZGF0YVtpXSA9IFtlbGVtZW50LCBlbGVtZW50XTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKworICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmNib3guZGF0YVVybCkgJiYgdGhpcy5jYm94LnByZWxvYWQpeworICAgIHRoaXMuZ2V0RGF0YSh0aGlzLmNib3guZGF0YVVybCk7CisgIH0gZWxzZSB7CisgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBwb3B1bGF0ZSB0aGUgbGlzdCBmcm9tIDxvcHRpb24+IGVsZW1lbnRzCisgICAgaWYoKG5vZGUpJiYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJzZWxlY3QiKSl7CisgICAgICAvLyBOT1RFOiB3ZSdyZSBub3QgaGFuZGxpbmcgPG9wdGdyb3VwPiBoZXJlIHlldAorICAgICAgdmFyIG9wdHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcHRpb24iKTsKKyAgICAgIHZhciBvbCA9IG9wdHMubGVuZ3RoOworICAgICAgdmFyIGRhdGEgPSBbXTsKKyAgICAgIGZvcih2YXIgeD0wOyB4PG9sOyB4KyspeworICAgICAgICB2YXIgdGV4dCA9IG9wdHNbeF0udGV4dENvbnRlbnQgfHwgb3B0c1t4XS5pbm5lclRleHQgfHwgb3B0c1t4XS5pbm5lckhUTUw7CisgICAgICAgIHZhciBrZXlWYWxBcnIgPSBbU3RyaW5nKHRleHQpLCBTdHJpbmcob3B0c1t4XS52YWx1ZSldOworICAgICAgICBkYXRhLnB1c2goa2V5VmFsQXJyKTsKKyAgICAgICAgaWYob3B0c1t4XS5zZWxlY3RlZCl7CisgICAgICAgICAgdGhpcy5jYm94LnNldEFsbFZhbHVlcyhrZXlWYWxBcnJbMF0sIGtleVZhbEFyclsxXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMuc2V0RGF0YShkYXRhKTsKKyAgICB9CisgIH0KK307CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuQ29tYm9Cb3giLAorICBkb2pvLndpZGdldC5Db21ib0JveCwgeworICB3aWRnZXRUeXBlIDogIkNvbWJvQm94IiwKKworICBkcm9wZG93bkhlaWdodDogMTIwLAorICBkcm9wZG93bldpZHRoOiAwLAorICBpdGVtSGVpZ2h0OiAwLAorCisgIGxpc3RlblRvcGljcyA6ICIiLAorICBub3RpZnlUb3BpY3MgOiAiIiwKKyAgbm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBiZWZvcmVOb3RpZnlUb3BpY3MgOiAiIiwKKyAgYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBhZnRlck5vdGlmeVRvcGljcyA6ICIiLAorICBhZnRlck5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgZXJyb3JOb3RpZnlUb3BpY3MgOiAiIiwKKyAgZXJyb3JOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIHZhbHVlTm90aWZ5VG9waWNzIDogIiIsCisgIHZhbHVlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBpbmRpY2F0b3IgOiAiIiwKKworICBmb3JtSWQgOiAiIiwKKyAgZm9ybUZpbHRlciA6ICIiLAorICBkYXRhUHJvdmlkZXJDbGFzczogInN0cnV0cy53aWRnZXQuQ29tYm9Cb3hEYXRhUHJvdmlkZXIiLAorCisgIGxvYWRPblR5cGUgOiBmYWxzZSwKKyAgbG9hZE1pbmltdW0gOiAzLAorCisgIGluaXRpYWxWYWx1ZSA6ICIiLAorICBpbml0aWFsS2V5IDogIiIsCisKKyAgdmlzaWJsZURvd25BcnJvdyA6IHRydWUsCisgIGZhZGVUaW1lIDogMTAwLAorCisgIC8vZG9qbyBoYXMgInN0cmluZ3N0YXJ0IiB3aGljaCBpcyBpbnZhbGlkCisgIHNlYXJjaFR5cGU6ICJTVEFSVFNUUklORyIsCisKKyAgZGF0YUZpZWxkTmFtZSA6ICIiLAorICBrZXlOYW1lOiAiIiwKKyAgLy9lbWJlZGRlZCB0aGUgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHN0cmluZyBpbiAwLjQuMiByZWxlYXNlLCBub3QgZ29vZAorICB0ZW1wbGF0ZUNzc1N0cmluZzogbnVsbCwKKyAgdGVtcGxhdGVDc3NQYXRoOiBkb2pvLnVyaS5kb2pvVXJpKCJzdHJ1dHMvQ29tYm9Cb3guY3NzIiksCisKKyAgLy9ob3cgbWFueSByZXN1bHRzIGFyZSBzaG93bgorICBzZWFyY2hMaW1pdCA6IDMwLAorCisgIHRyYW5zcG9ydCA6ICIiLAorCisgIC8vbG9hZCBvcHRpb25zIHdoZW4gcGFnZSBsb2FkcworICBwcmVsb2FkIDogdHJ1ZSwKKworICB0YWJJbmRleDogIiIsCisKKyAgLy9mcm9tIERvam8ncyAgQ29tYm9Cb3gKKyAgc2hvd1Jlc3VsdExpc3Q6IGZ1bmN0aW9uKCkgeworICAvLyBPdXIgZGVhciBmcmllbmQgSUUgZG9lc250IHRha2UgbWF4LWhlaWdodCBzbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGF0IG9uIG91ciBvd24gZXZlcnkgdGltZQorICAgIHZhciBjaGlsZHMgPSB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5jaGlsZE5vZGVzOworICAgIGlmKGNoaWxkcy5sZW5ndGgpeworCisgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5zdHlsZS53aWR0aCA9IHRoaXMuZHJvcGRvd25XaWR0aCA9PT0gMCA/IChkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSkud2lkdGgtMikrInB4IiA6IHRoaXMuZHJvcGRvd25XaWR0aCArICJweCI7CisKKyAgICAgIGlmKHRoaXMuaXRlbUhlaWdodCA9PT0gMCB8fCBkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSkpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcm9wZG93bkhlaWdodCArICJweCI7CisgICAgICAgIHRoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICAgICAgdGhpcy5pdGVtSGVpZ2h0ID0gZG9qby5odG1sLmdldE1hcmdpbkJveChjaGlsZHNbMF0pLmhlaWdodDsKKyAgICAgIH0KKworICAgICAgLy9pZiB0aGVyZSBpcyBleHRyYSBzcGFjZSwgYWRqdXN0IGhlaWdodAorICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gdGhpcy5pdGVtSGVpZ2h0ICogY2hpbGRzLmxlbmd0aDsKKyAgICAgIGlmKHRvdGFsSGVpZ2h0IDwgdGhpcy5kcm9wZG93bkhlaWdodCkgeworICAgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSB0b3RhbEhlaWdodCArIDIgKyAicHgiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcm9wZG93bkhlaWdodCArICJweCI7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9wdXBXaWRnZXQub3Blbih0aGlzLmRvbU5vZGUsIHRoaXMsIHRoaXMuZG93bkFycm93Tm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKyAgICB9CisgIH0sCisKKyAgX29wZW5SZXN1bHRMaXN0OiBmdW5jdGlvbigvKkFycmF5Ki8gcmVzdWx0cyl7CisgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKyAgICB0aGlzLl9jbGVhclJlc3VsdExpc3QoKTsKKyAgICBpZighcmVzdWx0cy5sZW5ndGgpeworICAgICAgICB0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworICAgIH0KKworICAgIGlmKCAodGhpcy5hdXRvQ29tcGxldGUpJiYKKyAgICAgICAgKHJlc3VsdHMubGVuZ3RoKSYmCisgICAgICAgICghdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlKSYmCisgICAgICAgICh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoID4gMCkpeworICAgICAgICB2YXIgY3BvcyA9IHRoaXMuX2dldENhcmV0UG9zKHRoaXMudGV4dElucHV0Tm9kZSk7CisgICAgICAgIC8vIG9ubHkgdHJ5IHRvIGV4dGVuZCBpZiB3ZSBhZGRlZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgICAgICAgaWYoKGNwb3MrMSkgPiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKKyAgICAgICAgICAgIC8vIG9ubHkgYWRkIHRvIGlucHV0IG5vZGUgYXMgd2Ugd291bGQgb3ZlcndyaXRlIENhcGl0YWxpc2F0aW9uIG9mIGNoYXJzCisgICAgICAgICAgICB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgKz0gcmVzdWx0c1swXVswXS5zdWJzdHIoY3Bvcyk7CisgICAgICAgICAgICAvLyBidWlsZCBhIG5ldyByYW5nZSB0aGF0IGhhcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZWFybGllcgorICAgICAgICAgICAgLy8gY2FyZXQgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHNlbGVjdGVkCisgICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSwgY3BvcywgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFyIHR5cGVkVGV4dCA9IHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZTsKKyAgICB2YXIgZXZlbiA9IHRydWU7CisgICAgd2hpbGUocmVzdWx0cy5sZW5ndGgpeworICAgICAgICB2YXIgdHIgPSByZXN1bHRzLnNoaWZ0KCk7CisgICAgICAgIGlmKHRyKXsKKyAgICAgICAgICAgIHZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICAgICAgdmFyIHRleHQgPSB0clswXTsKKyAgICAgICAgICAgIHZhciBpID0gdGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YodHlwZWRUZXh0LnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgaWYoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRleHQuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICAgICAgICAgIHZhciBtYXRjaGVkID0gdGV4dC5zdWJzdHJpbmcoaSwgaSArIHR5cGVkVGV4dC5sZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciBwb3N0ID0gdGV4dC5zdWJzdHJpbmcoaSArIHR5cGVkVGV4dC5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsocHJlKSkgeworICAgICAgICAgICAgICAgICAgdGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocHJlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBib2xkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImIiKTsKKyAgICAgICAgICAgICAgICB0ZC5hcHBlbmRDaGlsZChib2xkTm9kZSk7CisgICAgICAgICAgICAgICAgYm9sZE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWF0Y2hlZCkpOworICAgICAgICAgICAgICAgIHRkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBvc3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHJbMF0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGQuc2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiwgdHJbMF0pOworICAgICAgICAgICAgdGQuc2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIsIHRyWzFdKTsKKyAgICAgICAgICAgIHRkLmNsYXNzTmFtZSA9ICJkb2pvQ29tYm9Cb3hJdGVtICIrKChldmVuKSA/ICJkb2pvQ29tYm9Cb3hJdGVtRXZlbiIgOiAiZG9qb0NvbWJvQm94SXRlbU9kZCIpOworICAgICAgICAgICAgZXZlbiA9ICghZXZlbik7CisgICAgICAgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5hcHBlbmRDaGlsZCh0ZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaG93IG91ciBsaXN0IChvbmx5IGlmIHdlIGhhdmUgY29udGVudCwgZWxzZSBub3RoaW5nKQorICAgIHRoaXMuc2hvd1Jlc3VsdExpc3QoKTsKKyAgfSwKKworICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5Db21ib0JveC5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIC8vZXZlbnRzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5saXN0ZW5Ub3BpY3MpKSB7CisgICAgICB2YXIgdG9waWNzID0gdGhpcy5saXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0b3BpY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWNzW2ldLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgcmVxdWVzdCA9IHtjYW5jZWw6IGZhbHNlfTsKKwkgICAgICBzZWxmLm5vdGlmeSh0aGlzLndpZGdldElkLCAiYmVmb3JlIiwgcmVxdWVzdCk7CisJICAgICAgaWYocmVxdWVzdC5jYW5jZWwpIHsKKwkgICAgICAgIHJldHVybjsKKwkgICAgICB9CisgICAgICAgICAgc2VsZi5jbGVhclZhbHVlcygpOworICAgICAgICAgIHNlbGYuZGF0YVByb3ZpZGVyLmdldERhdGEoc2VsZi5kYXRhVXJsKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgLy9ub3RpZnkgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ub3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLm5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL2JlZm9yZSB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmJlZm9yZU5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmJlZm9yZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIC8vYWZ0ZXIgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5hZnRlck5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL2Vycm9yIHRvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorCisgICAgLy92YWx1ZSB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnZhbHVlTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy52YWx1ZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIC8vYmV0dGVyIG5hbWUKKyAgICB0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUubmFtZSA9IGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5rZXlOYW1lKSA/IHRoaXMubmFtZSArICJLZXkiIDogdGhpcy5rZXlOYW1lOworCisgICAgLy9pbml0IHZhbHVlcworICAgIHRoaXMuY29tYm9Cb3hWYWx1ZS52YWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlOworICAgIHRoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS52YWx1ZSA9IHRoaXMuaW5pdGlhbEtleTsKKyAgICB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZTsKKworICAgIC8vdGFiaW5kZXgKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnRhYkluZGV4KSkgeworICAgICAgdGhpcy50ZXh0SW5wdXROb2RlLnRhYkluZGV4ID0gdGhpcy50YWJJbmRleDsKKyAgICB9CisKKyAgICAvL2hpZGUgYXJyb3c/CisgICAgaWYoIXRoaXMudmlzaWJsZURvd25BcnJvdykgeworICAgICAgZG9qby5odG1sLmhpZGUodGhpcy5kb3duQXJyb3dOb2RlKTsKKyAgICB9CisKKyAgICAvL3NlYXJjaCB0eXBlCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zZWFyY2hUeXBlKSkgeworICAgICAgdGhpcy5kYXRhUHJvdmlkZXIuc2VhcmNoVHlwZSA9IHRoaXMuc2VhcmNoVHlwZS50b1VwcGVyQ2FzZSgpOworICAgIH0KKyAgfSwKKworICBjbGVhclZhbHVlcyA6IGZ1bmN0aW9uKCkgeworICAJdGhpcy5jb21ib0JveFZhbHVlLnZhbHVlID0gIiI7CisgICAgdGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLnZhbHVlID0gIiI7CisgICAgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlID0gIiI7CisgIH0sCisKKyAgb25WYWx1ZUNoYW5nZWQgOiBmdW5jdGlvbihkYXRhKSB7CisgICAgdGhpcy5ub3RpZnkoZGF0YSwgInZhbHVlY2hhbmdlZCIsIG51bGwpOworICB9LAorCisgIG5vdGlmeSA6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIGUpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgLy9nZW5lcmFsIHRvcGljcworICAgIGlmKHRoaXMubm90aWZ5VG9waWNzQXJyYXkpIHsKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRoaXMubm90aWZ5VG9waWNzQXJyYXksIGZ1bmN0aW9uKHRvcGljKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCB0eXBlLCBlLCBzZWxmKTsKKyAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgc2VsZi5sb2coZXgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICAvL2JlZm9yZSwgYWZ0ZXIgYW5kIGVycm9yIHRvcGljcworICAgIHZhciB0b3BpY3NBcnJheSA9IG51bGw7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgIGNhc2UgImJlZm9yZSI6CisgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSwgW2UsIHRoaXNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJsb2FkIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXksIFtkYXRhLCBlLCB0aGlzXSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiZXJyb3IiOgorICAgICAgICB0aGlzLm5vdGlmeVRvKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSwgW2RhdGEsIGUsIHRoaXNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAidmFsdWVjaGFuZ2VkIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXksIFt0aGlzLmdldFNlbGVjdGVkVmFsdWUoKSwgdGhpcy5nZXRTZWxlY3RlZEtleSgpLCB0aGlzLmdldFRleHQoKSwgdGhpc10pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0sCisKKyAgbm90aWZ5VG8gOiBmdW5jdGlvbih0b3BpY3NBcnJheSwgcGFyYW1zKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIGlmKHRvcGljc0FycmF5KSB7CisgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0b3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2hBcHBseSh0b3BpYywgcGFyYW1zKTsKKyAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgc2VsZi5sb2coZXgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgbG9nIDogZnVuY3Rpb24odGV4dCkgeworICAgIGRvam8uZGVidWcoIlsiICsgKHRoaXMud2lkZ2V0SWQgPyB0aGlzLndpZGdldElkIDogInVua25vd24iKSAgKyAiXSAiICsgdGV4dCk7CisgIH0sCisKKyAgX3N0YXJ0U2VhcmNoRnJvbUlucHV0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VhcmNoU3RyID0gdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlOworICAgIGlmKHRoaXMubG9hZE9uVHlwZSkgeworICAgICAgaWYoc2VhcmNoU3RyLmxlbmd0aCA+PSB0aGlzLmxvYWRNaW5pbXVtKSB7CisgICAgICAgICAgdmFyIG51SHJlZiA9IHRoaXMuZGF0YVVybCArICh0aGlzLmRhdGFVcmwuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpOworICAgICAgbnVIcmVmICs9IHRoaXMubmFtZSArICc9JyArICBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyKTsKKyAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEobnVIcmVmKTsKKyAgICAgIHRoaXMuX3N0YXJ0U2VhcmNoKHNlYXJjaFN0cik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKwkgIHRoaXMuX3N0YXJ0U2VhcmNoKHNlYXJjaFN0cik7CisJfQorICB9LAorCisgIHNldFNlbGVjdGVkS2V5IDogZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGFQcm92aWRlci5kYXRhOworICAgIGZvcihlbGVtZW50IGluIGRhdGEpIHsKKyAgICAgICB2YXIgb2JqID0gZGF0YVtlbGVtZW50XTsKKyAgICAgICBpZihvYmpbMV0udG9TdHJpbmcoKSA9PSBrZXkpIHsKKyAgICAgICAgIHRoaXMuc2V0VmFsdWUob2JqWzBdLnRvU3RyaW5nKCkpOworICAgICAgICAgdGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLnZhbHVlID0gb2JqWzFdLnRvU3RyaW5nKCk7CisgICAgICAgfQorICAgIH0KKyAgfSwKKworICBnZXRTZWxlY3RlZEtleSA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWU7CisgIH0sCisKKyAgZ2V0U2VsZWN0ZWRWYWx1ZSA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU7CisgIH0sCisKKyAgZ2V0VGV4dCA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWU7CisgIH0KK30pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9TdHJ1dHNEYXRlUGlja2VyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9TdHJ1dHNEYXRlUGlja2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDNkODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c0RhdGVQaWNrZXIuanMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c0RhdGVQaWNrZXIiKTsKKworZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzRGF0ZVBpY2tlciIsCisgIGRvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlciwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c0RhdGVQaWNrZXIiLAorCisgIHZhbHVlTm90aWZ5VG9waWNzIDogIiIsCisgIHZhbHVlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICB0YWJJbmRleCA6ICIiLAorCisgIHBvc3RDcmVhdGU6IGZ1bmN0aW9uKCkgeworICAgIHN0cnV0cy53aWRnZXQuU3RydXRzRGF0ZVBpY2tlci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgIC8vc2V0IGNzc0NsYXNzCisgICAgaWYodGhpcy5leHRyYUFyZ3NbImNsYXNzIl0pIHsKKyAgICAgIGRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmlucHV0Tm9kZSwgdGhpcy5leHRyYUFyZ3NbImNsYXNzIl0pOworICAgIH0KKworICAgIC8vc2V0IGNzc1N0eWxlCisgICAgaWYodGhpcy5leHRyYUFyZ3Muc3R5bGUpIHsKKyAgICAgIGRvam8uaHRtbC5zZXRTdHlsZVRleHQodGhpcy5pbnB1dE5vZGUsIHRoaXMuZXh0cmFBcmdzLnN0eWxlKTsKKyAgICB9CisKKyAgICAvL3ZhbHVlIHRvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudmFsdWVOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLnZhbHVlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorCisgICAgLy90YWJpbmRleAorICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudGFiSW5kZXgpKSB7CisgICAgICB0aGlzLmlucHV0Tm9kZS50YWJJbmRleCA9IHRoaXMudGFiSW5kZXg7CisgICAgfQorICB9LAorCisgIF9zeW5jVmFsdWVOb2RlOmZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZGF0ZSA9IHRoaXMuZGF0ZVBpY2tlci52YWx1ZTsKKyAgICB2YXIgdmFsdWUgPSAiIjsKKyAgICBzd2l0Y2ggKHRoaXMuc2F2ZUZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7CisgICAgICBjYXNlICJyZmMiOgorICAgICAgY2FzZSAiaXNvIjoKKyAgICAgIGNhc2UgIiI6CisgICAgICAgIHZhbHVlID0gZG9qby5kYXRlLnRvUmZjMzMzOShkYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJwb3NpeCI6CisgICAgICBjYXNlICJ1bml4IjoKKyAgICAgICAgdmFsdWUgPSBOdW1iZXIoZGF0ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGRhdGUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZG9qby5kYXRlLmZvcm1hdChkYXRlLCB7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LCBzZWxlY3RvcjoiZGF0ZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGhpcy52YWx1ZU5vZGUudmFsdWUgPSB2YWx1ZTsKKyAgfSwKKworICBfdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKCkgeworICAgIHN0cnV0cy53aWRnZXQuU3RydXRzRGF0ZVBpY2tlci5zdXBlcmNsYXNzLl91cGRhdGVUZXh0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgaWYodGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5ICE9IG51bGwpIHsKKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHRvcGljID0gdGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5W2ldOworICAgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0b3BpYykpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCB0aGlzLmlucHV0Tm9kZS52YWx1ZSwgdGhpcy5nZXRWYWx1ZSgpLCB0aGlzKTsKKyAgICAgICAgICB9IGNhdGNoKGV4KSB7CisgICAgICAgICAgICBkb2pvLmRlYnVnKGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVGFiQ29udGFpbmVyLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9TdHJ1dHNUYWJDb250YWluZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMTgyMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVGFiQ29udGFpbmVyLmpzCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitkb2pvLnByb3ZpZGUoInN0cnV0cy53aWRnZXQuU3RydXRzVGFiQ29udGFpbmVyIik7CisKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuVGFiQ29udGFpbmVyIik7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVGFiQ29udGFpbmVyIiwKKyAgZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLCB7CisgIHdpZGdldFR5cGUgOiAiU3RydXRzVGFiQ29udGFpbmVyIiwKKworICBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcyA6ICIiLAorICBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzIDogIiIsCisgIGJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKworICBkaXNhYmxlZFRhYkNzc0NsYXNzIDogInN0cnV0c0Rpc2FibGVkVGFiIiwKKyAgCisgIHBvc3RDcmVhdGUgOiBmdW5jdGlvbigpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgCisgICAgLy9iZWZvcmUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgLy9hZnRlciB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKyAgICAKKyAgICAvLyBhZGQgZGlzYWJsZWQgY2xhc3MgdG8gZGlzYWJsZWQgdGFicworICAgIGlmKHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcykgeworICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oZGl2KXsKKyAgICAgICAgaWYoZGl2LmRpc2FibGVkKSB7CisgICAgICAgICAgdGhpcy5kaXNhYmxlVGFiKGRpdik7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSwKKyAgIAorICBzZWxlY3RDaGlsZDogZnVuY3Rpb24gKHRhYiwgY2FsbGluZ1dpZGdldCkgIHsKKyAgICBpZighdGFiLmRpc2FibGVkKSB7CisgICAgICB2YXIgY2FuY2VsID0geyJjYW5jZWwiIDogZmFsc2V9OworICAgICAgCisgICAgICBpZih0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBjYW5jZWwsIHRhYiwgc2VsZik7CisgICAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgICBkb2pvLmRlYnVnKGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOyAgIAorICAgICAgfQorICAgICAgCisgICAgICBpZighY2FuY2VsLmNhbmNlbCkgeworICAgICAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnNlbGVjdENoaWxkLmFwcGx5KHRoaXMsIFt0YWIsIGNhbGxpbmdXaWRnZXRdKTsKKyAgICAgICAgCisgICAgICAgIGlmKHRoaXMuYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3NBcnJheSkgeworICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzQXJyYXksIGZ1bmN0aW9uKHRvcGljKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godG9waWMsIHRhYiwgc2VsZik7CisgICAgICAgICAgICB9IGNhdGNoKGV4KXsKKyAgICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7ICAgCisgICAgICAgIH0KKyAgICAgIH0gCisgICAgfSAKKyAgfSwKKyAgCisgIGRpc2FibGVUYWIgOiBmdW5jdGlvbih0KSB7CisgICAgdmFyIHRhYldpZGdldCA9IHRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworICAgIHRhYldpZGdldC5kaXNhYmxlZCA9IHRydWU7CisgICAgZG9qby5odG1sLmFkZENsYXNzKHRhYldpZGdldC5jb250cm9sQnV0dG9uLmRvbU5vZGUsIHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcyk7CisgIH0sCisgIAorICBlbmFibGVUYWIgOiBmdW5jdGlvbih0KSB7CisgICAgdmFyIHRhYldpZGdldCA9IHRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworICAgIHRhYldpZGdldC5kaXNhYmxlZCA9IGZhbHNlOworICAgIGRvam8uaHRtbC5yZW1vdmVDbGFzcyh0YWJXaWRnZXQuY29udHJvbEJ1dHRvbi5kb21Ob2RlLCB0aGlzLmRpc2FibGVkVGFiQ3NzQ2xhc3MpOworICB9LAorICAKKyAgZ2V0VGFiV2lkZ2V0IDogZnVuY3Rpb24odCkgeworICAgIGlmKGRvam8ubGFuZy5pc051bWJlcih0KSkgeworICAgICAgLy90YWIgaW5kZXgKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW3RdOworICAgIH0gZWxzZSBpZihkb2pvLmxhbmcuaXNTdHJpbmcodCkpIHsKKyAgICAgIC8vdGFiIGlkCisgICAgICByZXR1cm4gZG9qby53aWRnZXQuYnlJZCh0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy90YWIgd2lkZ2V0PworICAgICAgcmV0dXJuIHQ7CisgICAgfQorICB9Cit9KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVGltZVBpY2tlci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVGltZVBpY2tlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODkyYTFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9TdHJ1dHNUaW1lUGlja2VyLmpzCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL0lmIHdlIHVzZSAiVGltZVBpY2tlciIgZm9yIHRoZSBuYW1lLCBEb2pvIGdldCdzIGNvbmZ1c2VkIGFuZCBicmVha3MKKy8vVE9ETyByZW1vdmUgdGhpcyBmaWxlIG9uIG5leHQgRG9qbyByZWxlYXNlCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUaW1lUGlja2VyIik7CisKK2Rvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIik7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVGltZVBpY2tlciIsCisgIGRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RpbWVQaWNrZXIiLAorCisgIGlucHV0TmFtZTogIiIsCisgIG5hbWU6ICIiLAorCisgIHZhbHVlTm90aWZ5VG9waWNzIDogIiIsCisgIHZhbHVlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorCisgIHRhYkluZGV4IDogIiIsCisKKyAgcG9zdENyZWF0ZTogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNUaW1lUGlja2VyLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgLy9zZXQgY3NzQ2xhc3MKKyAgICBpZih0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSkgeworICAgICAgZG9qby5odG1sLnNldENsYXNzKHRoaXMuaW5wdXROb2RlLCB0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSk7CisgICAgfQorCisgICAgLy9zZXQgY3NzU3R5bGUKKyAgICBpZih0aGlzLmV4dHJhQXJncy5zdHlsZSkgeworICAgICAgZG9qby5odG1sLnNldFN0eWxlVGV4dCh0aGlzLmlucHV0Tm9kZSwgdGhpcy5leHRyYUFyZ3Muc3R5bGUpOworICAgIH0KKworICAgIC8vdmFsdWUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy52YWx1ZU5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMudmFsdWVOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL3RhYmluZGV4CisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YWJJbmRleCkpIHsKKyAgICAgIHRoaXMuaW5wdXROb2RlLnRhYkluZGV4ID0gdGhpcy50YWJJbmRleDsKKyAgICB9CisgIH0sCisKKyAgX3N5bmNWYWx1ZU5vZGU6ZnVuY3Rpb24gKCkgeworICAgIHZhciB0aW1lID0gdGhpcy50aW1lUGlja2VyLnRpbWU7CisgICAgdmFyIHZhbHVlOworICAgIHN3aXRjaCAodGhpcy5zYXZlRm9ybWF0LnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNhc2UgInJmYyI6CisgICAgICBjYXNlICJpc28iOgorICAgICAgY2FzZSAiIjoKKyAgICAgIC8vb3JpZ2luYWxseSwgRG9qbyBvbmx5IHNhdmVzIHRoZSB0aW1lIHBhcnQKKyAgICAgIHZhbHVlID0gZG9qby5kYXRlLnRvUmZjMzMzOSh0aW1lKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAicG9zaXgiOgorICAgICAgY2FzZSAidW5peCI6CisgICAgICB2YWx1ZSA9IE51bWJlcih0aW1lKTsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHZhbHVlID0gZG9qby5kYXRlLmZvcm1hdCh0aW1lLCB7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LCBzZWxlY3RvcjoidGltZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisgICAgfQorICAgIHRoaXMudmFsdWVOb2RlLnZhbHVlID0gdmFsdWU7CisgIH0sCisKKyAgX3VwZGF0ZVRleHQgOiBmdW5jdGlvbigpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIuc3VwZXJjbGFzcy5fdXBkYXRlVGV4dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIGlmKHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSAhPSBudWxsKSB7CisgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB0b3BpYyA9IHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheVtpXTsKKyAgICAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodG9waWMpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvam8uZXZlbnQudG9waWMucHVibGlzaCh0b3BpYywgdGhpcy5pbnB1dE5vZGUudmFsdWUsIHRoaXMuZ2V0VmFsdWUoKSwgdGhpcyk7CisgICAgICAgICAgfSBjYXRjaChleCkgeworICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMTcxNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVHJlZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitkb2pvLnByb3ZpZGUoInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZSIpOworCitkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWUiKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlIiwKKyAgZG9qby53aWRnZXQuVHJlZSwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RyZWUiLAorCisgIGhyZWYgOiAiIiwKKyAgZXJyb3JOb3RpZnlUb3BpY3MgOiAiIiwKKyAgZXJyb3JOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIAorICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZS5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgIAorICAgICAvL2Vycm9yIHRvcGljcworICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yTm90aWZ5VG9waWNzKSkgeworICAgICAgIHRoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuZXJyb3JOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgfQorICAgICAKKyAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhyZWYpKSB7CisgICAgICAgZG9qby5pby5iaW5kKHsKKyAgICAgICAgdXJsOiB0aGlzLmhyZWYsCisgICAgICAgIHVzZUNhY2hlOiBmYWxzZSwKKyAgICAgICAgcHJldmVudENhY2hlOiB0cnVlLAorICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgaWYodHlwZSA9PSAnbG9hZCcpIHsKKyAgICAgICAgICAgIC8vZGF0YSBzaG91bGQgYmUgYW4gYXJyYXkKKyAgICAgICAgICAgIGlmKGRhdGEpIHsKKyAgICAgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goZGF0YSwgZnVuY3Rpb24oZGVzY3IpIHsKKyAgICAgICAgICAgICAgICAvL2NyZWF0ZSBub2RlIGZvciBlYWNoZCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoInN0cnV0czpTdHJ1dHNUcmVlTm9kZSIseworICAgICAgICAgICAgICAgICAgdGl0bGUgICA6IGRlc2NyLmxhYmVsLAorICAgICAgICAgICAgICAgICAgaXNGb2xkZXI6IGRlc2NyLmhhc0NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQ6IGRlc2NyLmlkICAgCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc2VsZi5hZGRDaGlsZChuZXdOb2RlKTsKKyAgICAgICAgICAgICAgfSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL3B1Ymxpc2ggZXJyb3IgdG9waWNzCisgICAgICAgICAgICBpZihzZWxmLmVycm9yTm90aWZ5VG9waWNzQXJyYXkpIHsKKyAgICAgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goc2VsZi5lcnJvck5vdGlmeVRvcGljc0FycmF5LCBmdW5jdGlvbih0b3BpYykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godG9waWMsIGRhdGEsIGUsIHNlbGYpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpeworICAgICAgICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG1pbWV0eXBlOiAidGV4dC9qc29uIgorICAgICAgIH0pOworICAgICB9ICAgCisgIH0KK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVHJlZU5vZGUuanMgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWVOb2RlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWVOb2RlLmpzCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlTm9kZSIpOworCitkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVOb2RlIik7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUiLAorICBkb2pvLndpZGdldC5UcmVlTm9kZSwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RyZWVOb2RlIiwKKyAgCisgIGxvYWRlZCA6IGZhbHNlLAorICAKKyAgZXhwYW5kIDogZnVuY3Rpb24oKSB7CisgICAgaWYoIXRoaXMubG9hZGVkKSB7CisgICAgICB0aGlzLnJlbG9hZCgpOworICAgIH0gIAorICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUuc3VwZXJjbGFzcy5leHBhbmQuYXBwbHkodGhpcyk7CisgIH0sCisgIAorICByZW1vdmVDaGlsZHJlbiA6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICB2YXIgY2hpbGRyZW5Db3B5ID0gZG9qby5sYW5nLnRvQXJyYXkodGhpcy5jaGlsZHJlbik7CisgICAgZG9qby5sYW5nLmZvckVhY2goY2hpbGRyZW5Db3B5LCBmdW5jdGlvbihub2RlKSB7CisgICAgICBzZWxmLnJlbW92ZU5vZGUobm9kZSk7CisgICAgfSk7CisgIH0sCisgIAorICByZWxvYWQgOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaHJlZiA9IHRoaXMudHJlZS5ocmVmOworICAgIHRoaXMubG9hZGVkID0gdHJ1ZTsKKyAgICAKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayhocmVmKSkgeworICAgICAgLy9jbGVhciBjaGlsZHJlbiBsaXN0CisgICAgICB0aGlzLnJlbW92ZUNoaWxkcmVuKCk7CisgICAgICAvL3Bhc3Mgd2lkZ2V0SWQgYXMgcGFyYW1ldGVyCisgICAgICB2YXIgdG1wSHJlZiA9IGhyZWYgKyAoaHJlZi5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyAibm9kZUlkPSIgKyB0aGlzLndpZGdldElkOworCisgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICB0aGlzLm1hcmtMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgCisgICAgICBkb2pvLmlvLmJpbmQoeworICAgICAgICB1cmw6IHRtcEhyZWYsCisgICAgICAgIHVzZUNhY2hlOiBmYWxzZSwKKyAgICAgICAgcHJldmVudENhY2hlOiB0cnVlLAorICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgaWYodHlwZSA9PSAnbG9hZCcpIHsKKyAgICAgICAgICAgIC8vZGF0YSBzaG91bGQgYmUgYW4gYXJyYXkKKyAgICAgICAgICAgIGlmKGRhdGEpIHsKKyAgICAgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goZGF0YSwgZnVuY3Rpb24oZGVzY3IpIHsKKyAgICAgICAgICAgICAgICAvL2NyZWF0ZSBub2RlIGZvciBlYWNoZCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoInN0cnV0czpTdHJ1dHNUcmVlTm9kZSIseworICAgICAgICAgICAgICAgICAgdGl0bGUgICA6IGRlc2NyLmxhYmVsLAorICAgICAgICAgICAgICAgICAgaXNGb2xkZXI6IGRlc2NyLmhhc0NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQ6IGRlc2NyLmlkICAgCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc2VsZi5hZGRDaGlsZChuZXdOb2RlKTsKKyAgICAgICAgICAgICAgfSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBzZWxmLnVuTWFya0xvYWRpbmcoKTsgICAgCisgICAgICAgIH0sCisgICAgICAgIG1pbWV0eXBlOiAidGV4dC9qc29uIgorICAgICAgfSk7CisgICAgfQorICB9Cit9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWVTZWxlY3Rvci5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvU3RydXRzVHJlZVNlbGVjdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YThjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMvd2lkZ2V0L1N0cnV0c1RyZWVTZWxlY3Rvci5qcwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3RvciIpOworCitkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvciIpOworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3RvciIsCisgIGRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvciwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RyZWVTZWxlY3RvciIsCisgIAorICBzZWxlY3RlZE5vdGlmeVRvcGljcyA6ICIiLAorICBjb2xsYXBzZWROb3RpZnlUb3BpY3MgOiAiIiwKKyAgZXhwYW5kZWROb3RpZnlUb3BpY3MgOiAiIiwKKyAgCisgIHNlbGVjdGVkTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBjb2xsYXBzZWROb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIGV4cGFuZGVkTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICAKKyAgZXZlbnROYW1lc0RlZmF1bHQ6IHsKKyAgICBzZWxlY3QgOiAic2VsZWN0IiwKKyAgICBkZXN0cm95IDogImRlc3Ryb3kiLAorICAgIGRlc2VsZWN0IDogImRlc2VsZWN0IiwKKyAgICBkYmxzZWxlY3Q6ICJkYmxzZWxlY3QiLCAvLyBzZWxlY3QgYWxyZWFkeSBzZWxlY3RlZCBub2RlLi4gRWRpdCBvciB3aGF0ZXZlcgorICAgIGV4cGFuZDogImV4cGFuZCIsCisgICAgY29sbGFwc2U6ICJjb2xsYXBzZSIKKyAgfSwKKyAgCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3Rvci5zdXBlcmNsYXNzLmluaXRpYWxpemUuYXBwbHkodGhpcyk7CisgICAgCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnNlbGVjdGVkTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuY29sbGFwc2VkTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorICAgIAorICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmV4cGFuZGVkTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmV4cGFuZGVkTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorICB9LAorICAKKyAgbGlzdGVuVHJlZTogZnVuY3Rpb24odHJlZSkgeworICAgIGRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jb2xsYXBzZSwgdGhpcywgImNvbGxhcHNlIik7CisgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmV4cGFuZCwgdGhpcywgImV4cGFuZCIpOworICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yLnN1cGVyY2xhc3MubGlzdGVuVHJlZS5hcHBseSh0aGlzLCBbdHJlZV0pOworICB9LAorICAKKyAgdW5saXN0ZW5UcmVlOiBmdW5jdGlvbih0cmVlKSB7CisgICAgZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY29sbGFwc2UsIHRoaXMsICJjb2xsYXBzZSIpOworICAgIGRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmV4cGFuZCwgdGhpcywgImV4cGFuZCIpOworICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yLnN1cGVyY2xhc3MudW5saXN0ZW5UcmVlLmFwcGx5KHRoaXMsIFt0cmVlXSk7CisgIH0sCisKKyAgcHVibGlzaFRvcGljcyA6IGZ1bmN0aW9uKHRvcGljcywgbm9kZSkgeworICAgIGlmKHRvcGljcyAhPSBudWxsKSB7CisgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG9waWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB0b3BpYyA9IHRvcGljc1tpXTsKKyAgICAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodG9waWMpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvam8uZXZlbnQudG9waWMucHVibGlzaCh0b3BpYywgbm9kZSk7CisgICAgICAgICAgfSBjYXRjaChleCkgeworICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorICAKKyAgc2VsZWN0OmZ1bmN0aW9uIChtZXNzYWdlKSB7CisgICAgdmFyIG5vZGUgPSBtZXNzYWdlLnNvdXJjZTsKKyAgICB2YXIgZSA9IG1lc3NhZ2UuZXZlbnQ7CisgICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlID09PSBub2RlKSB7CisgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5KSB7CisgICAgICAgIHRoaXMuZGVzZWxlY3QoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5kYmxzZWxlY3QsIHtub2RlOm5vZGV9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlKSB7CisgICAgICB0aGlzLmRlc2VsZWN0KCk7CisgICAgfQorICAgIHRoaXMuZG9TZWxlY3Qobm9kZSk7CisgICAgCisgICAgdGhpcy5wdWJsaXNoVG9waWNzKHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3NBcnJheSwge25vZGU6IG5vZGV9KTsKKyAgfSwKKyAgCisgIGV4cGFuZDogZnVuY3Rpb24obWVzc2FnZSkgeworICAgIHZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisgICAgdGhpcy5wdWJsaXNoVG9waWNzKHRoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3NBcnJheSwge25vZGU6IG5vZGV9KTsKKyAgfSwKKyAgCisgIGNvbGxhcHNlOiBmdW5jdGlvbihtZXNzYWdlKSB7CisgICAgdmFyIG5vZGUgPSBtZXNzYWdlLnNvdXJjZTsKKyAgICB0aGlzLnB1Ymxpc2hUb3BpY3ModGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3NBcnJheSwge25vZGU6IG5vZGV9KTsKKyAgfQorfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL3dpZGdldC9fX3BhY2thZ2VfXy5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvX19wYWNrYWdlX18uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NDJiYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0cy93aWRnZXQvX19wYWNrYWdlX18uanMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbInN0cnV0cy53aWRnZXQuQmluZCIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQmluZERpdiIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQmluZEFuY2hvciIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQ29tYm9Cb3giLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c0RhdGVQaWNrZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LkJpbmRFdmVudCIsCisgICAgICAgICAgICAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yIiwKKyAgICAgICAgICAgICAic3RydXRzLndpZGdldC5TdHJ1dHNUYWJDb250YWluZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVOb2RlIiwKKyAgICAgICAgICAgICAic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlIl0KK30pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LioiKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0c19kb2pvLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzX2Rvam8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZjA2OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvL3N0cnV0c19kb2pvLmpzCkBAIC0wLDAgKzEsMTg3OTQgQEAKKy8qCisJQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFRoZSBEb2pvIEZvdW5kYXRpb24KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMSBvciBhYm92ZSBPUiB0aGUKKwltb2RpZmllZCBCU0QgbGljZW5zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRG9qbyBsaWNlbnNpbmcsIHNlZToKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnL2NvbW11bml0eS9saWNlbnNpbmcuc2h0bWwKKyovCisKKy8qCisJVGhpcyBpcyBhIGNvbXBpbGVkIHZlcnNpb24gb2YgRG9qbywgYnVpbHQgZm9yIGRlcGxveW1lbnQgYW5kIG5vdCBmb3IKKwlkZXZlbG9wbWVudC4gVG8gZ2V0IGFuIGVkaXRhYmxlIHZlcnNpb24sIHBsZWFzZSB2aXNpdDoKKworCQlodHRwOi8vZG9qb3Rvb2xraXQub3JnCisKKwlmb3IgZG9jdW1lbnRhdGlvbiBhbmQgaW5mb3JtYXRpb24gb24gZ2V0dGluZyB0aGUgc291cmNlLgorKi8KKworaWYodHlwZW9mIGRvam89PSJ1bmRlZmluZWQiKXsKK3ZhciBkal9nbG9iYWw9dGhpczsKK3ZhciBkal9jdXJyZW50Q29udGV4dD10aGlzOworZnVuY3Rpb24gZGpfdW5kZWYoXzEsXzIpeworcmV0dXJuICh0eXBlb2YgKF8yfHxkal9jdXJyZW50Q29udGV4dClbXzFdPT0idW5kZWZpbmVkIik7Cit9CitpZihkal91bmRlZigiZGpDb25maWciLHRoaXMpKXsKK3ZhciBkakNvbmZpZz17fTsKK30KK2lmKGRqX3VuZGVmKCJkb2pvIix0aGlzKSl7Cit2YXIgZG9qbz17fTsKK30KK2Rvam8uZ2xvYmFsPWZ1bmN0aW9uKCl7CityZXR1cm4gZGpfY3VycmVudENvbnRleHQ7Cit9OworZG9qby5sb2NhbGU9ZGpDb25maWcubG9jYWxlOworZG9qby52ZXJzaW9uPXttYWpvcjowLG1pbm9yOjQscGF0Y2g6MyxmbGFnOiIiLHJldmlzaW9uOk51bWJlcigiJFJldjogNjcwMzcxICQiLm1hdGNoKC9bMC05XSsvKVswXSksdG9TdHJpbmc6ZnVuY3Rpb24oKXsKK3dpdGgoZG9qby52ZXJzaW9uKXsKK3JldHVybiBtYWpvcisiLiIrbWlub3IrIi4iK3BhdGNoK2ZsYWcrIiAoIityZXZpc2lvbisiKSI7Cit9Cit9fTsKK2Rvam8uZXZhbFByb3A9ZnVuY3Rpb24oXzMsXzQsXzUpeworaWYoKCFfNCl8fCghXzMpKXsKK3JldHVybiB1bmRlZmluZWQ7Cit9CitpZighZGpfdW5kZWYoXzMsXzQpKXsKK3JldHVybiBfNFtfM107Cit9CityZXR1cm4gKF81PyhfNFtfM109e30pOnVuZGVmaW5lZCk7Cit9OworZG9qby5wYXJzZU9ialBhdGg9ZnVuY3Rpb24oXzYsXzcsXzgpewordmFyIF85PShfN3x8ZG9qby5nbG9iYWwoKSk7Cit2YXIgX2E9XzYuc3BsaXQoIi4iKTsKK3ZhciBfYj1fYS5wb3AoKTsKK2Zvcih2YXIgaT0wLGw9X2EubGVuZ3RoO2k8bCYmXzk7aSsrKXsKK185PWRvam8uZXZhbFByb3AoX2FbaV0sXzksXzgpOworfQorcmV0dXJuIHtvYmo6XzkscHJvcDpfYn07Cit9OworZG9qby5ldmFsT2JqUGF0aD1mdW5jdGlvbihfZSxfZil7CitpZih0eXBlb2YgX2UhPSJzdHJpbmciKXsKK3JldHVybiBkb2pvLmdsb2JhbCgpOworfQoraWYoX2UuaW5kZXhPZigiLiIpPT0tMSl7CityZXR1cm4gZG9qby5ldmFsUHJvcChfZSxkb2pvLmdsb2JhbCgpLF9mKTsKK30KK3ZhciByZWY9ZG9qby5wYXJzZU9ialBhdGgoX2UsZG9qby5nbG9iYWwoKSxfZik7CitpZihyZWYpeworcmV0dXJuIGRvam8uZXZhbFByb3AocmVmLnByb3AscmVmLm9iaixfZik7Cit9CityZXR1cm4gbnVsbDsKK307Citkb2pvLmVycm9yVG9TdHJpbmc9ZnVuY3Rpb24oXzExKXsKK2lmKCFkal91bmRlZigibWVzc2FnZSIsXzExKSl7CityZXR1cm4gXzExLm1lc3NhZ2U7Cit9ZWxzZXsKK2lmKCFkal91bmRlZigiZGVzY3JpcHRpb24iLF8xMSkpeworcmV0dXJuIF8xMS5kZXNjcmlwdGlvbjsKK31lbHNleworcmV0dXJuIF8xMTsKK30KK30KK307Citkb2pvLnJhaXNlPWZ1bmN0aW9uKF8xMixfMTMpeworaWYoXzEzKXsKK18xMj1fMTIrIjogIitkb2pvLmVycm9yVG9TdHJpbmcoXzEzKTsKK31lbHNleworXzEyPWRvam8uZXJyb3JUb1N0cmluZyhfMTIpOworfQordHJ5eworaWYoZGpDb25maWcuaXNEZWJ1Zyl7Citkb2pvLmhvc3RlbnYucHJpbnRsbigiRkFUQUwgZXhjZXB0aW9uIHJhaXNlZDogIitfMTIpOworfQorfQorY2F0Y2goZSl7Cit9Cit0aHJvdyBfMTN8fEVycm9yKF8xMik7Cit9OworZG9qby5kZWJ1Zz1mdW5jdGlvbigpeworfTsKK2Rvam8uZGVidWdTaGFsbG93PWZ1bmN0aW9uKG9iail7Cit9OworZG9qby5wcm9maWxlPXtzdGFydDpmdW5jdGlvbigpeworfSxlbmQ6ZnVuY3Rpb24oKXsKK30sc3RvcDpmdW5jdGlvbigpeworfSxkdW1wOmZ1bmN0aW9uKCl7Cit9fTsKK2Z1bmN0aW9uIGRqX2V2YWwoXzE1KXsKK3JldHVybiBkal9nbG9iYWwuZXZhbD9kal9nbG9iYWwuZXZhbChfMTUpOmV2YWwoXzE1KTsKK30KK2Rvam8udW5pbXBsZW1lbnRlZD1mdW5jdGlvbihfMTYsXzE3KXsKK3ZhciBfMTg9IiciK18xNisiJyBub3QgaW1wbGVtZW50ZWQiOworaWYoXzE3IT1udWxsKXsKK18xOCs9IiAiK18xNzsKK30KK2Rvam8ucmFpc2UoXzE4KTsKK307Citkb2pvLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oXzE5LF8xYSxfMWIpewordmFyIF8xYz0iREVQUkVDQVRFRDogIitfMTk7CitpZihfMWEpeworXzFjKz0iICIrXzFhOworfQoraWYoXzFiKXsKK18xYys9IiAtLSB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbjogIitfMWI7Cit9Citkb2pvLmRlYnVnKF8xYyk7Cit9OworZG9qby5yZW5kZXI9KGZ1bmN0aW9uKCl7CitmdW5jdGlvbiB2c2NhZmZvbGQoXzFkLF8xZSl7Cit2YXIgdG1wPXtjYXBhYmxlOmZhbHNlLHN1cHBvcnQ6e2J1aWx0aW46ZmFsc2UscGx1Z2luOmZhbHNlfSxwcmVmaXhlczpfMWR9OworZm9yKHZhciBpPTA7aTxfMWUubGVuZ3RoO2krKyl7Cit0bXBbXzFlW2ldXT1mYWxzZTsKK30KK3JldHVybiB0bXA7Cit9CityZXR1cm4ge25hbWU6IiIsdmVyOmRvam8udmVyc2lvbixvczp7d2luOmZhbHNlLGxpbnV4OmZhbHNlLG9zeDpmYWxzZX0saHRtbDp2c2NhZmZvbGQoWyJodG1sIl0sWyJpZSIsIm9wZXJhIiwia2h0bWwiLCJzYWZhcmkiLCJtb3oiXSksc3ZnOnZzY2FmZm9sZChbInN2ZyJdLFsiY29yZWwiLCJhZG9iZSIsImJhdGlrIl0pLHZtbDp2c2NhZmZvbGQoWyJ2bWwiXSxbImllIl0pLHN3Zjp2c2NhZmZvbGQoWyJTd2YiLCJGbGFzaCIsIk1tIl0sWyJtbSJdKSxzd3Q6dnNjYWZmb2xkKFsiU3d0Il0sWyJpYm0iXSl9OworfSkoKTsKK2Rvam8uaG9zdGVudj0oZnVuY3Rpb24oKXsKK3ZhciBfMjE9e2lzRGVidWc6ZmFsc2UsYWxsb3dRdWVyeUNvbmZpZzpmYWxzZSxiYXNlU2NyaXB0VXJpOiIiLGJhc2VSZWxhdGl2ZVBhdGg6IiIsbGlicmFyeVNjcmlwdFVyaToiIixpZVByZXZlbnRDbG9iYmVyOmZhbHNlLGllQ2xvYmJlck1pbmltYWw6dHJ1ZSxwcmV2ZW50QmFja0J1dHRvbkZpeDp0cnVlLGRlbGF5TW96TG9hZGluZ0ZpeDpmYWxzZSxzZWFyY2hJZHM6W10scGFyc2VXaWRnZXRzOnRydWV9OworaWYodHlwZW9mIGRqQ29uZmlnPT0idW5kZWZpbmVkIil7CitkakNvbmZpZz1fMjE7Cit9ZWxzZXsKK2Zvcih2YXIgXzIyIGluIF8yMSl7CitpZih0eXBlb2YgZGpDb25maWdbXzIyXT09InVuZGVmaW5lZCIpeworZGpDb25maWdbXzIyXT1fMjFbXzIyXTsKK30KK30KK30KK3JldHVybiB7bmFtZV86Iih1bnNldCkiLHZlcnNpb25fOiIodW5zZXQpIixnZXROYW1lOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy5uYW1lXzsKK30sZ2V0VmVyc2lvbjpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudmVyc2lvbl87Cit9LGdldFRleHQ6ZnVuY3Rpb24odXJpKXsKK2Rvam8udW5pbXBsZW1lbnRlZCgiZ2V0VGV4dCIsInVyaT0iK3VyaSk7Cit9fTsKK30pKCk7Citkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaT1mdW5jdGlvbigpeworaWYoZGpDb25maWcuYmFzZVNjcmlwdFVyaS5sZW5ndGgpeworcmV0dXJuIGRqQ29uZmlnLmJhc2VTY3JpcHRVcmk7Cit9Cit2YXIgdXJpPW5ldyBTdHJpbmcoZGpDb25maWcubGlicmFyeVNjcmlwdFVyaXx8ZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aCk7CitpZighdXJpKXsKK2Rvam8ucmFpc2UoIk5vdGhpbmcgcmV0dXJuZWQgYnkgZ2V0TGlicmFyeVNjcmlwdFVyaSgpOiAiK3VyaSk7Cit9Cit2YXIgXzI1PXVyaS5sYXN0SW5kZXhPZigiLyIpOworZGpDb25maWcuYmFzZVNjcmlwdFVyaT1kakNvbmZpZy5iYXNlUmVsYXRpdmVQYXRoOworcmV0dXJuIGRqQ29uZmlnLmJhc2VTY3JpcHRVcmk7Cit9OworKGZ1bmN0aW9uKCl7Cit2YXIgXzI2PXtwa2dGaWxlTmFtZToiX19wYWNrYWdlX18iLGxvYWRpbmdfbW9kdWxlc186e30sbG9hZGVkX21vZHVsZXNfOnt9LGFkZGVkVG9Mb2FkaW5nQ291bnQ6W10scmVtb3ZlZEZyb21Mb2FkaW5nQ291bnQ6W10saW5GbGlnaHRDb3VudDowLG1vZHVsZVByZWZpeGVzXzp7ZG9qbzp7bmFtZToiZG9qbyIsdmFsdWU6InNyYyJ9fSxzZXRNb2R1bGVQcmVmaXg6ZnVuY3Rpb24oXzI3LF8yOCl7Cit0aGlzLm1vZHVsZVByZWZpeGVzX1tfMjddPXtuYW1lOl8yNyx2YWx1ZTpfMjh9OworfSxtb2R1bGVIYXNQcmVmaXg6ZnVuY3Rpb24oXzI5KXsKK3ZhciBtcD10aGlzLm1vZHVsZVByZWZpeGVzXzsKK3JldHVybiBCb29sZWFuKG1wW18yOV0mJm1wW18yOV0udmFsdWUpOworfSxnZXRNb2R1bGVQcmVmaXg6ZnVuY3Rpb24oXzJiKXsKK2lmKHRoaXMubW9kdWxlSGFzUHJlZml4KF8yYikpeworcmV0dXJuIHRoaXMubW9kdWxlUHJlZml4ZXNfW18yYl0udmFsdWU7Cit9CityZXR1cm4gXzJiOworfSxnZXRUZXh0U3RhY2s6W10sbG9hZFVyaVN0YWNrOltdLGxvYWRlZFVyaXM6W10scG9zdF9sb2FkXzpmYWxzZSxtb2R1bGVzTG9hZGVkTGlzdGVuZXJzOltdLHVubG9hZExpc3RlbmVyczpbXSxsb2FkTm90aWZ5aW5nOmZhbHNlfTsKK2Zvcih2YXIgXzJjIGluIF8yNil7Citkb2pvLmhvc3RlbnZbXzJjXT1fMjZbXzJjXTsKK30KK30pKCk7Citkb2pvLmhvc3RlbnYubG9hZFBhdGg9ZnVuY3Rpb24oXzJkLF8yZSxjYil7Cit2YXIgdXJpOworaWYoXzJkLmNoYXJBdCgwKT09Ii8ifHxfMmQubWF0Y2goL15cdys6LykpewordXJpPV8yZDsKK31lbHNlewordXJpPXRoaXMuZ2V0QmFzZVNjcmlwdFVyaSgpK18yZDsKK30KK2lmKGRqQ29uZmlnLmNhY2hlQnVzdCYmZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKXsKK3VyaSs9Ij8iK1N0cmluZyhkakNvbmZpZy5jYWNoZUJ1c3QpLnJlcGxhY2UoL1xXKy9nLCIiKTsKK30KK3RyeXsKK3JldHVybiAhXzJlP3RoaXMubG9hZFVyaSh1cmksY2IpOnRoaXMubG9hZFVyaUFuZENoZWNrKHVyaSxfMmUsY2IpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworcmV0dXJuIGZhbHNlOworfQorfTsKK2Rvam8uaG9zdGVudi5sb2FkVXJpPWZ1bmN0aW9uKHVyaSxjYil7CitpZih0aGlzLmxvYWRlZFVyaXNbdXJpXSl7CityZXR1cm4gdHJ1ZTsKK30KK3ZhciBfMzM9dGhpcy5nZXRUZXh0KHVyaSxudWxsLHRydWUpOworaWYoIV8zMyl7CityZXR1cm4gZmFsc2U7Cit9Cit0aGlzLmxvYWRlZFVyaXNbdXJpXT10cnVlOworaWYoY2IpeworXzMzPSIoIitfMzMrIikiOworfQordmFyIF8zND1kal9ldmFsKF8zMyk7CitpZihjYil7CitjYihfMzQpOworfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5ob3N0ZW52LmxvYWRVcmlBbmRDaGVjaz1mdW5jdGlvbih1cmksXzM2LGNiKXsKK3ZhciBvaz10cnVlOwordHJ5eworb2s9dGhpcy5sb2FkVXJpKHVyaSxjYik7Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoImZhaWxlZCBsb2FkaW5nICIsdXJpLCIgd2l0aCBlcnJvcjogIixlKTsKK30KK3JldHVybiBCb29sZWFuKG9rJiZ0aGlzLmZpbmRNb2R1bGUoXzM2LGZhbHNlKSk7Cit9OworZG9qby5sb2FkZWQ9ZnVuY3Rpb24oKXsKK307Citkb2pvLnVubG9hZGVkPWZ1bmN0aW9uKCl7Cit9OworZG9qby5ob3N0ZW52LmxvYWRlZD1mdW5jdGlvbigpewordGhpcy5sb2FkTm90aWZ5aW5nPXRydWU7Cit0aGlzLnBvc3RfbG9hZF89dHJ1ZTsKK3ZhciBtbGw9dGhpcy5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzOworZm9yKHZhciB4PTA7eDxtbGwubGVuZ3RoO3grKyl7CittbGxbeF0oKTsKK30KK3RoaXMubW9kdWxlc0xvYWRlZExpc3RlbmVycz1bXTsKK3RoaXMubG9hZE5vdGlmeWluZz1mYWxzZTsKK2Rvam8ubG9hZGVkKCk7Cit9OworZG9qby5ob3N0ZW52LnVubG9hZGVkPWZ1bmN0aW9uKCl7Cit2YXIgbWxsPXRoaXMudW5sb2FkTGlzdGVuZXJzOword2hpbGUobWxsLmxlbmd0aCl7CisobWxsLnBvcCgpKSgpOworfQorZG9qby51bmxvYWRlZCgpOworfTsKK2Rvam8uYWRkT25Mb2FkPWZ1bmN0aW9uKG9iaixfM2QpewordmFyIGRoPWRvam8uaG9zdGVudjsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpeworZGgubW9kdWxlc0xvYWRlZExpc3RlbmVycy5wdXNoKG9iaik7Cit9ZWxzZXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7CitkaC5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXsKK29ialtfM2RdKCk7Cit9KTsKK30KK30KK2lmKGRoLnBvc3RfbG9hZF8mJmRoLmluRmxpZ2h0Q291bnQ9PTAmJiFkaC5sb2FkTm90aWZ5aW5nKXsKK2RoLmNhbGxMb2FkZWQoKTsKK30KK307Citkb2pvLmFkZE9uVW5sb2FkPWZ1bmN0aW9uKG9iaixfNDApewordmFyIGRoPWRvam8uaG9zdGVudjsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpeworZGgudW5sb2FkTGlzdGVuZXJzLnB1c2gob2JqKTsKK31lbHNleworaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsKK2RoLnVubG9hZExpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7CitvYmpbXzQwXSgpOworfSk7Cit9Cit9Cit9OworZG9qby5ob3N0ZW52Lm1vZHVsZXNMb2FkZWQ9ZnVuY3Rpb24oKXsKK2lmKHRoaXMucG9zdF9sb2FkXyl7CityZXR1cm47Cit9CitpZih0aGlzLmxvYWRVcmlTdGFjay5sZW5ndGg9PTAmJnRoaXMuZ2V0VGV4dFN0YWNrLmxlbmd0aD09MCl7CitpZih0aGlzLmluRmxpZ2h0Q291bnQ+MCl7Citkb2pvLmRlYnVnKCJmaWxlcyBzdGlsbCBpbiBmbGlnaHQhIik7CityZXR1cm47Cit9Citkb2pvLmhvc3RlbnYuY2FsbExvYWRlZCgpOworfQorfTsKK2Rvam8uaG9zdGVudi5jYWxsTG9hZGVkPWZ1bmN0aW9uKCl7CitpZih0eXBlb2Ygc2V0VGltZW91dD09Im9iamVjdCJ8fChkakNvbmZpZ1sidXNlWERvbWFpbiJdJiZkb2pvLnJlbmRlci5odG1sLm9wZXJhKSl7CitzZXRUaW1lb3V0KCJkb2pvLmhvc3RlbnYubG9hZGVkKCk7IiwwKTsKK31lbHNleworZG9qby5ob3N0ZW52LmxvYWRlZCgpOworfQorfTsKK2Rvam8uaG9zdGVudi5nZXRNb2R1bGVTeW1ib2xzPWZ1bmN0aW9uKF80Mil7Cit2YXIgXzQzPV80Mi5zcGxpdCgiLiIpOworZm9yKHZhciBpPV80My5sZW5ndGg7aT4wO2ktLSl7Cit2YXIgXzQ1PV80My5zbGljZSgwLGkpLmpvaW4oIi4iKTsKK2lmKChpPT0xKSYmIXRoaXMubW9kdWxlSGFzUHJlZml4KF80NSkpeworXzQzWzBdPSIuLi8iK180M1swXTsKK31lbHNlewordmFyIF80Nj10aGlzLmdldE1vZHVsZVByZWZpeChfNDUpOworaWYoXzQ2IT1fNDUpeworXzQzLnNwbGljZSgwLGksXzQ2KTsKK2JyZWFrOworfQorfQorfQorcmV0dXJuIF80MzsKK307Citkb2pvLmhvc3RlbnYuX2dsb2JhbF9vbWl0X21vZHVsZV9jaGVjaz1mYWxzZTsKK2Rvam8uaG9zdGVudi5sb2FkTW9kdWxlPWZ1bmN0aW9uKF80NyxfNDgsXzQ5KXsKK2lmKCFfNDcpeworcmV0dXJuOworfQorXzQ5PXRoaXMuX2dsb2JhbF9vbWl0X21vZHVsZV9jaGVja3x8XzQ5OwordmFyIF80YT10aGlzLmZpbmRNb2R1bGUoXzQ3LGZhbHNlKTsKK2lmKF80YSl7CityZXR1cm4gXzRhOworfQoraWYoZGpfdW5kZWYoXzQ3LHRoaXMubG9hZGluZ19tb2R1bGVzXykpewordGhpcy5hZGRlZFRvTG9hZGluZ0NvdW50LnB1c2goXzQ3KTsKK30KK3RoaXMubG9hZGluZ19tb2R1bGVzX1tfNDddPTE7Cit2YXIgXzRiPV80Ny5yZXBsYWNlKC9cLi9nLCIvIikrIi5qcyI7Cit2YXIgXzRjPV80Ny5zcGxpdCgiLiIpOwordmFyIF80ZD10aGlzLmdldE1vZHVsZVN5bWJvbHMoXzQ3KTsKK3ZhciBfNGU9KChfNGRbMF0uY2hhckF0KDApIT0iLyIpJiYhXzRkWzBdLm1hdGNoKC9eXHcrOi8pKTsKK3ZhciBfNGY9XzRkW180ZC5sZW5ndGgtMV07Cit2YXIgb2s7CitpZihfNGY9PSIqIil7CitfNDc9XzRjLnNsaWNlKDAsLTEpLmpvaW4oIi4iKTsKK3doaWxlKF80ZC5sZW5ndGgpeworXzRkLnBvcCgpOworXzRkLnB1c2godGhpcy5wa2dGaWxlTmFtZSk7CitfNGI9XzRkLmpvaW4oIi8iKSsiLmpzIjsKK2lmKF80ZSYmXzRiLmNoYXJBdCgwKT09Ii8iKXsKK180Yj1fNGIuc2xpY2UoMSk7Cit9Citvaz10aGlzLmxvYWRQYXRoKF80YiwhXzQ5P180NzpudWxsKTsKK2lmKG9rKXsKK2JyZWFrOworfQorXzRkLnBvcCgpOworfQorfWVsc2V7CitfNGI9XzRkLmpvaW4oIi8iKSsiLmpzIjsKK180Nz1fNGMuam9pbigiLiIpOwordmFyIF81MT0hXzQ5P180NzpudWxsOworb2s9dGhpcy5sb2FkUGF0aChfNGIsXzUxKTsKK2lmKCFvayYmIV80OCl7CitfNGQucG9wKCk7Cit3aGlsZShfNGQubGVuZ3RoKXsKK180Yj1fNGQuam9pbigiLyIpKyIuanMiOworb2s9dGhpcy5sb2FkUGF0aChfNGIsXzUxKTsKK2lmKG9rKXsKK2JyZWFrOworfQorXzRkLnBvcCgpOworXzRiPV80ZC5qb2luKCIvIikrIi8iK3RoaXMucGtnRmlsZU5hbWUrIi5qcyI7CitpZihfNGUmJl80Yi5jaGFyQXQoMCk9PSIvIil7CitfNGI9XzRiLnNsaWNlKDEpOworfQorb2s9dGhpcy5sb2FkUGF0aChfNGIsXzUxKTsKK2lmKG9rKXsKK2JyZWFrOworfQorfQorfQoraWYoIW9rJiYhXzQ5KXsKK2Rvam8ucmFpc2UoIkNvdWxkIG5vdCBsb2FkICciK180NysiJzsgbGFzdCB0cmllZCAnIitfNGIrIiciKTsKK30KK30KK2lmKCFfNDkmJiF0aGlzWyJpc1hEb21haW4iXSl7CitfNGE9dGhpcy5maW5kTW9kdWxlKF80NyxmYWxzZSk7CitpZighXzRhKXsKK2Rvam8ucmFpc2UoInN5bWJvbCAnIitfNDcrIicgaXMgbm90IGRlZmluZWQgYWZ0ZXIgbG9hZGluZyAnIitfNGIrIiciKTsKK30KK30KK3JldHVybiBfNGE7Cit9OworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZT1mdW5jdGlvbihfNTIpewordmFyIF81Mz1TdHJpbmcoXzUyKTsKK3ZhciBfNTQ9XzUzOwordmFyIF81NT1fNTIuc3BsaXQoL1wuLyk7CitpZihfNTVbXzU1Lmxlbmd0aC0xXT09IioiKXsKK181NS5wb3AoKTsKK181ND1fNTUuam9pbigiLiIpOworfQordmFyIF81Nj1kb2pvLmV2YWxPYmpQYXRoKF81NCx0cnVlKTsKK3RoaXMubG9hZGVkX21vZHVsZXNfW181M109XzU2OwordGhpcy5sb2FkZWRfbW9kdWxlc19bXzU0XT1fNTY7CityZXR1cm4gXzU2OworfTsKK2Rvam8uaG9zdGVudi5maW5kTW9kdWxlPWZ1bmN0aW9uKF81NyxfNTgpewordmFyIGxtbj1TdHJpbmcoXzU3KTsKK2lmKHRoaXMubG9hZGVkX21vZHVsZXNfW2xtbl0peworcmV0dXJuIHRoaXMubG9hZGVkX21vZHVsZXNfW2xtbl07Cit9CitpZihfNTgpeworZG9qby5yYWlzZSgibm8gbG9hZGVkIG1vZHVsZSBuYW1lZCAnIitfNTcrIiciKTsKK30KK3JldHVybiBudWxsOworfTsKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmU9ZnVuY3Rpb24oXzVhKXsKK3ZhciBfNWI9XzVhWyJjb21tb24iXXx8W107Cit2YXIgXzVjPV81YVtkb2pvLmhvc3RlbnYubmFtZV9dP181Yi5jb25jYXQoXzVhW2Rvam8uaG9zdGVudi5uYW1lX118fFtdKTpfNWIuY29uY2F0KF81YVsiZGVmYXVsdCJdfHxbXSk7Citmb3IodmFyIHg9MDt4PF81Yy5sZW5ndGg7eCsrKXsKK3ZhciBfNWU9XzVjW3hdOworaWYoXzVlLmNvbnN0cnVjdG9yPT1BcnJheSl7Citkb2pvLmhvc3RlbnYubG9hZE1vZHVsZS5hcHBseShkb2pvLmhvc3RlbnYsXzVlKTsKK31lbHNleworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUoXzVlKTsKK30KK30KK307Citkb2pvLnJlcXVpcmU9ZnVuY3Rpb24oXzVmKXsKK2Rvam8uaG9zdGVudi5sb2FkTW9kdWxlLmFwcGx5KGRvam8uaG9zdGVudixhcmd1bWVudHMpOworfTsKK2Rvam8ucmVxdWlyZUlmPWZ1bmN0aW9uKF82MCxfNjEpewordmFyIF82Mj1hcmd1bWVudHNbMF07CitpZigoXzYyPT09dHJ1ZSl8fChfNjI9PSJjb21tb24iKXx8KF82MiYmZG9qby5yZW5kZXJbXzYyXS5jYXBhYmxlKSl7Cit2YXIgXzYzPVtdOworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitfNjMucHVzaChhcmd1bWVudHNbaV0pOworfQorZG9qby5yZXF1aXJlLmFwcGx5KGRvam8sXzYzKTsKK30KK307Citkb2pvLnJlcXVpcmVBZnRlcklmPWRvam8ucmVxdWlyZUlmOworZG9qby5wcm92aWRlPWZ1bmN0aW9uKF82NSl7CityZXR1cm4gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZS5hcHBseShkb2pvLmhvc3RlbnYsYXJndW1lbnRzKTsKK307Citkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aD1mdW5jdGlvbihfNjYsXzY3KXsKK3JldHVybiBkb2pvLmhvc3RlbnYuc2V0TW9kdWxlUHJlZml4KF82NixfNjcpOworfTsKK2lmKGRqQ29uZmlnWyJtb2R1bGVQYXRocyJdKXsKK2Zvcih2YXIgcGFyYW0gaW4gZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgocGFyYW0sZGpDb25maWdbIm1vZHVsZVBhdGhzIl1bcGFyYW1dKTsKK30KK30KK2Rvam8uc2V0TW9kdWxlUHJlZml4PWZ1bmN0aW9uKF82OCxfNjkpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLnNldE1vZHVsZVByZWZpeChcIiIrXzY4KyJcIiwgXCIiK182OSsiXCIpIiwicmVwbGFjZWQgYnkgZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgiLCIwLjUiKTsKK3JldHVybiBkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChfNjgsXzY5KTsKK307Citkb2pvLmV4aXN0cz1mdW5jdGlvbihvYmosXzZiKXsKK3ZhciBwPV82Yi5zcGxpdCgiLiIpOworZm9yKHZhciBpPTA7aTxwLmxlbmd0aDtpKyspeworaWYoIW9ialtwW2ldXSl7CityZXR1cm4gZmFsc2U7Cit9CitvYmo9b2JqW3BbaV1dOworfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZT1mdW5jdGlvbihfNmUpewordmFyIF82Zj1fNmU/XzZlLnRvTG93ZXJDYXNlKCk6ZG9qby5sb2NhbGU7CitpZihfNmY9PSJyb290Iil7CitfNmY9IlJPT1QiOworfQorcmV0dXJuIF82ZjsKK307Citkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aD1mdW5jdGlvbihfNzAsXzcxLF83Mil7CitfNzA9ZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShfNzApOwordmFyIF83Mz1fNzAuc3BsaXQoIi0iKTsKK3ZhciBfNzQ9W107Citmb3IodmFyIGk9XzczLmxlbmd0aDtpPjA7aS0tKXsKK183NC5wdXNoKF83My5zbGljZSgwLGkpLmpvaW4oIi0iKSk7Cit9CitfNzQucHVzaChmYWxzZSk7CitpZihfNzEpeworXzc0LnJldmVyc2UoKTsKK30KK2Zvcih2YXIgaj1fNzQubGVuZ3RoLTE7aj49MDtqLS0pewordmFyIGxvYz1fNzRbal18fCJST09UIjsKK3ZhciBfNzg9XzcyKGxvYyk7CitpZihfNzgpeworYnJlYWs7Cit9Cit9Cit9OworZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQ9WyJST09UIiwiZXMtZXMiLCJlcyIsIml0LWl0IiwicHQtYnIiLCJkZSIsImZyLWZyIiwiemgtY24iLCJwdCIsImVuLXVzIiwiemgiLCJmciIsInpoLXR3IiwiaXQiLCJlbi1nYiIsInh4IiwiZGUtZGUiLCJrby1rciIsImphLWpwIiwia28iLCJlbiIsImphIl07Citkb2pvLmhvc3RlbnYucmVnaXN0ZXJObHNQcmVmaXg9ZnVuY3Rpb24oKXsKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKCJubHMiLCJubHMiKTsKK307Citkb2pvLmhvc3RlbnYucHJlbG9hZExvY2FsaXphdGlvbnM9ZnVuY3Rpb24oKXsKK2lmKGRvam8uaG9zdGVudi5sb2NhbGVzR2VuZXJhdGVkKXsKK2Rvam8uaG9zdGVudi5yZWdpc3Rlck5sc1ByZWZpeCgpOworZnVuY3Rpb24gcHJlbG9hZChfNzkpeworXzc5PWRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUoXzc5KTsKK2Rvam8uaG9zdGVudi5zZWFyY2hMb2NhbGVQYXRoKF83OSx0cnVlLGZ1bmN0aW9uKGxvYyl7Citmb3IodmFyIGk9MDtpPGRvam8uaG9zdGVudi5sb2NhbGVzR2VuZXJhdGVkLmxlbmd0aDtpKyspeworaWYoZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWRbaV09PWxvYyl7Citkb2pvWyJyZXF1aXJlIl0oIm5scy5kb2pvXyIrbG9jKTsKK3JldHVybiB0cnVlOworfQorfQorcmV0dXJuIGZhbHNlOworfSk7Cit9CitwcmVsb2FkKCk7Cit2YXIgXzdjPWRqQ29uZmlnLmV4dHJhTG9jYWxlfHxbXTsKK2Zvcih2YXIgaT0wO2k8XzdjLmxlbmd0aDtpKyspeworcHJlbG9hZChfN2NbaV0pOworfQorfQorZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zPWZ1bmN0aW9uKCl7Cit9OworfTsKK2Rvam8ucmVxdWlyZUxvY2FsaXphdGlvbj1mdW5jdGlvbihfN2UsXzdmLF84MCxfODEpeworZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zKCk7Cit2YXIgXzgyPWRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUoXzgwKTsKK3ZhciBfODM9W183ZSwibmxzIixfN2ZdLmpvaW4oIi4iKTsKK3ZhciBfODQ9IiI7CitpZihfODEpewordmFyIF84NT1fODEuc3BsaXQoIiwiKTsKK2Zvcih2YXIgaT0wO2k8Xzg1Lmxlbmd0aDtpKyspeworaWYoXzgyLmluZGV4T2YoXzg1W2ldKT09MCl7CitpZihfODVbaV0ubGVuZ3RoPl84NC5sZW5ndGgpeworXzg0PV84NVtpXTsKK30KK30KK30KK2lmKCFfODQpeworXzg0PSJST09UIjsKK30KK30KK3ZhciBfODc9XzgxP184NDpfODI7Cit2YXIgXzg4PWRvam8uaG9zdGVudi5maW5kTW9kdWxlKF84Myk7Cit2YXIgXzg5PW51bGw7CitpZihfODgpeworaWYoZGpDb25maWcubG9jYWxpemF0aW9uQ29tcGxldGUmJl84OC5fYnVpbHQpeworcmV0dXJuOworfQordmFyIF84YT1fODcucmVwbGFjZSgiLSIsIl8iKTsKK3ZhciBfOGI9XzgzKyIuIitfOGE7CitfODk9ZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUoXzhiKTsKK30KK2lmKCFfODkpeworXzg4PWRvam8uaG9zdGVudi5zdGFydFBhY2thZ2UoXzgzKTsKK3ZhciBfOGM9ZG9qby5ob3N0ZW52LmdldE1vZHVsZVN5bWJvbHMoXzdlKTsKK3ZhciBfOGQ9XzhjLmNvbmNhdCgibmxzIikuam9pbigiLyIpOwordmFyIF84ZTsKK2Rvam8uaG9zdGVudi5zZWFyY2hMb2NhbGVQYXRoKF84NyxfODEsZnVuY3Rpb24obG9jKXsKK3ZhciBfOTA9bG9jLnJlcGxhY2UoIi0iLCJfIik7Cit2YXIgXzkxPV84MysiLiIrXzkwOwordmFyIF85Mj1mYWxzZTsKK2lmKCFkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShfOTEpKXsKK2Rvam8uaG9zdGVudi5zdGFydFBhY2thZ2UoXzkxKTsKK3ZhciBfOTM9W184ZF07CitpZihsb2MhPSJST09UIil7CitfOTMucHVzaChsb2MpOworfQorXzkzLnB1c2goXzdmKTsKK3ZhciBfOTQ9XzkzLmpvaW4oIi8iKSsiLmpzIjsKK185Mj1kb2pvLmhvc3RlbnYubG9hZFBhdGgoXzk0LG51bGwsZnVuY3Rpb24oXzk1KXsKK3ZhciBfOTY9ZnVuY3Rpb24oKXsKK307CitfOTYucHJvdG90eXBlPV84ZTsKK184OFtfOTBdPW5ldyBfOTYoKTsKK2Zvcih2YXIgaiBpbiBfOTUpeworXzg4W185MF1bal09Xzk1W2pdOworfQorfSk7Cit9ZWxzZXsKK185Mj10cnVlOworfQoraWYoXzkyJiZfODhbXzkwXSl7CitfOGU9Xzg4W185MF07Cit9ZWxzZXsKK184OFtfOTBdPV84ZTsKK30KK2lmKF84MSl7CityZXR1cm4gdHJ1ZTsKK30KK30pOworfQoraWYoXzgxJiZfODIhPV84NCl7CitfODhbXzgyLnJlcGxhY2UoIi0iLCJfIildPV84OFtfODQucmVwbGFjZSgiLSIsIl8iKV07Cit9Cit9OworKGZ1bmN0aW9uKCl7Cit2YXIgXzk4PWRqQ29uZmlnLmV4dHJhTG9jYWxlOworaWYoXzk4KXsKK2lmKCFfOTggaW5zdGFuY2VvZiBBcnJheSl7CitfOTg9W185OF07Cit9Cit2YXIgcmVxPWRvam8ucmVxdWlyZUxvY2FsaXphdGlvbjsKK2Rvam8ucmVxdWlyZUxvY2FsaXphdGlvbj1mdW5jdGlvbihtLGIsXzljLF85ZCl7CityZXEobSxiLF85YyxfOWQpOworaWYoXzljKXsKK3JldHVybjsKK30KK2Zvcih2YXIgaT0wO2k8Xzk4Lmxlbmd0aDtpKyspeworcmVxKG0sYixfOThbaV0sXzlkKTsKK30KK307Cit9Cit9KSgpOworfQoraWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIpeworKGZ1bmN0aW9uKCl7CitpZihkakNvbmZpZy5hbGxvd1F1ZXJ5Q29uZmlnKXsKK3ZhciBfOWY9ZG9jdW1lbnQubG9jYXRpb24udG9TdHJpbmcoKTsKK3ZhciBfYTA9XzlmLnNwbGl0KCI/IiwyKTsKK2lmKF9hMC5sZW5ndGg+MSl7Cit2YXIgX2ExPV9hMFsxXTsKK3ZhciBfYTI9X2ExLnNwbGl0KCImIik7Citmb3IodmFyIHggaW4gX2EyKXsKK3ZhciBzcD1fYTJbeF0uc3BsaXQoIj0iKTsKK2lmKChzcFswXS5sZW5ndGg+OSkmJihzcFswXS5zdWJzdHIoMCw5KT09ImRqQ29uZmlnLiIpKXsKK3ZhciBvcHQ9c3BbMF0uc3Vic3RyKDkpOwordHJ5eworZGpDb25maWdbb3B0XT1ldmFsKHNwWzFdKTsKK30KK2NhdGNoKGUpeworZGpDb25maWdbb3B0XT1zcFsxXTsKK30KK30KK30KK30KK30KK2lmKCgoZGpDb25maWdbImJhc2VTY3JpcHRVcmkiXT09IiIpfHwoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXT09IiIpKSYmKGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkpewordmFyIF9hNj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Cit2YXIgX2E3PS8oX19wYWNrYWdlX198ZG9qb3xib290c3RyYXAxKVwuanMoW1w/XC5dfCQpL2k7Citmb3IodmFyIGk9MDtpPF9hNi5sZW5ndGg7aSsrKXsKK3ZhciBzcmM9X2E2W2ldLmdldEF0dHJpYnV0ZSgic3JjIik7CitpZighc3JjKXsKK2NvbnRpbnVlOworfQordmFyIG09c3JjLm1hdGNoKF9hNyk7CitpZihtKXsKK3ZhciBfYWI9c3JjLnN1YnN0cmluZygwLG0uaW5kZXgpOworaWYoc3JjLmluZGV4T2YoImJvb3RzdHJhcDEiKT4tMSl7CitfYWIrPSIuLi8iOworfQoraWYoIXRoaXNbImRqQ29uZmlnIl0peworZGpDb25maWc9e307Cit9CitpZihkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdPT0iIil7CitkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdPV9hYjsKK30KK2lmKGRqQ29uZmlnWyJiYXNlUmVsYXRpdmVQYXRoIl09PSIiKXsKK2RqQ29uZmlnWyJiYXNlUmVsYXRpdmVQYXRoIl09X2FiOworfQorYnJlYWs7Cit9Cit9Cit9Cit2YXIgZHI9ZG9qby5yZW5kZXI7Cit2YXIgZHJoPWRvam8ucmVuZGVyLmh0bWw7Cit2YXIgZHJzPWRvam8ucmVuZGVyLnN2ZzsKK3ZhciBkdWE9KGRyaC5VQT1uYXZpZ2F0b3IudXNlckFnZW50KTsKK3ZhciBkYXY9KGRyaC5BVj1uYXZpZ2F0b3IuYXBwVmVyc2lvbik7Cit2YXIgdD10cnVlOwordmFyIGY9ZmFsc2U7CitkcmguY2FwYWJsZT10OworZHJoLnN1cHBvcnQuYnVpbHRpbj10OworZHIudmVyPXBhcnNlRmxvYXQoZHJoLkFWKTsKK2RyLm9zLm1hYz1kYXYuaW5kZXhPZigiTWFjaW50b3NoIik+PTA7Citkci5vcy53aW49ZGF2LmluZGV4T2YoIldpbmRvd3MiKT49MDsKK2RyLm9zLmxpbnV4PWRhdi5pbmRleE9mKCJYMTEiKT49MDsKK2RyaC5vcGVyYT1kdWEuaW5kZXhPZigiT3BlcmEiKT49MDsKK2RyaC5raHRtbD0oZGF2LmluZGV4T2YoIktvbnF1ZXJvciIpPj0wKXx8KGRhdi5pbmRleE9mKCJTYWZhcmkiKT49MCk7Citkcmguc2FmYXJpPWRhdi5pbmRleE9mKCJTYWZhcmkiKT49MDsKK3ZhciBfYjM9ZHVhLmluZGV4T2YoIkdlY2tvIik7CitkcmgubW96aWxsYT1kcmgubW96PShfYjM+PTApJiYoIWRyaC5raHRtbCk7CitpZihkcmgubW96aWxsYSl7CitkcmguZ2Vja29WZXJzaW9uPWR1YS5zdWJzdHJpbmcoX2IzKzYsX2IzKzE0KTsKK30KK2RyaC5pZT0oZG9jdW1lbnQuYWxsKSYmKCFkcmgub3BlcmEpOworZHJoLmllNTA9ZHJoLmllJiZkYXYuaW5kZXhPZigiTVNJRSA1LjAiKT49MDsKK2RyaC5pZTU1PWRyaC5pZSYmZGF2LmluZGV4T2YoIk1TSUUgNS41Iik+PTA7CitkcmguaWU2MD1kcmguaWUmJmRhdi5pbmRleE9mKCJNU0lFIDYuMCIpPj0wOworZHJoLmllNzA9ZHJoLmllJiZkYXYuaW5kZXhPZigiTVNJRSA3LjAiKT49MDsKK3ZhciBjbT1kb2N1bWVudFsiY29tcGF0TW9kZSJdOworZHJoLnF1aXJrcz0oY209PSJCYWNrQ29tcGF0Iil8fChjbT09IlF1aXJrc01vZGUiKXx8ZHJoLmllNTV8fGRyaC5pZTUwOworZG9qby5sb2NhbGU9ZG9qby5sb2NhbGV8fChkcmguaWU/bmF2aWdhdG9yLnVzZXJMYW5ndWFnZTpuYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvTG93ZXJDYXNlKCk7Citkci52bWwuY2FwYWJsZT1kcmguaWU7CitkcnMuY2FwYWJsZT1mOworZHJzLnN1cHBvcnQucGx1Z2luPWY7CitkcnMuc3VwcG9ydC5idWlsdGluPWY7Cit2YXIgX2I1PXdpbmRvd1siZG9jdW1lbnQiXTsKK3ZhciB0ZGk9X2I1WyJpbXBsZW1lbnRhdGlvbiJdOworaWYoKHRkaSkmJih0ZGlbImhhc0ZlYXR1cmUiXSkmJih0ZGkuaGFzRmVhdHVyZSgib3JnLnczYy5kb20uc3ZnIiwiMS4wIikpKXsKK2Rycy5jYXBhYmxlPXQ7CitkcnMuc3VwcG9ydC5idWlsdGluPXQ7CitkcnMuc3VwcG9ydC5wbHVnaW49ZjsKK30KK2lmKGRyaC5zYWZhcmkpewordmFyIHRtcD1kdWEuc3BsaXQoIkFwcGxlV2ViS2l0LyIpWzFdOwordmFyIHZlcj1wYXJzZUZsb2F0KHRtcC5zcGxpdCgiICIpWzBdKTsKK2lmKHZlcj49NDIwKXsKK2Rycy5jYXBhYmxlPXQ7CitkcnMuc3VwcG9ydC5idWlsdGluPXQ7CitkcnMuc3VwcG9ydC5wbHVnaW49ZjsKK30KK31lbHNleworfQorfSkoKTsKK2Rvam8uaG9zdGVudi5zdGFydFBhY2thZ2UoImRvam8uaG9zdGVudiIpOworZG9qby5yZW5kZXIubmFtZT1kb2pvLmhvc3RlbnYubmFtZV89ImJyb3dzZXIiOworZG9qby5ob3N0ZW52LnNlYXJjaElkcz1bXTsKK2Rvam8uaG9zdGVudi5fWE1MSFRUUF9QUk9HSURTPVsiTXN4bWwyLlhNTEhUVFAiLCJNaWNyb3NvZnQuWE1MSFRUUCIsIk1zeG1sMi5YTUxIVFRQLjQuMCJdOworZG9qby5ob3N0ZW52LmdldFhtbGh0dHBPYmplY3Q9ZnVuY3Rpb24oKXsKK3ZhciBfYjk9bnVsbDsKK3ZhciBfYmE9bnVsbDsKK3RyeXsKK19iOT1uZXcgWE1MSHR0cFJlcXVlc3QoKTsKK30KK2NhdGNoKGUpeworfQoraWYoIV9iOSl7Citmb3IodmFyIGk9MDtpPDM7KytpKXsKK3ZhciBfYmM9ZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFNbaV07Cit0cnl7CitfYjk9bmV3IEFjdGl2ZVhPYmplY3QoX2JjKTsKK30KK2NhdGNoKGUpeworX2JhPWU7Cit9CitpZihfYjkpeworZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFM9W19iY107CiticmVhazsKK30KK30KK30KK2lmKCFfYjkpeworcmV0dXJuIGRvam8ucmFpc2UoIlhNTEhUVFAgbm90IGF2YWlsYWJsZSIsX2JhKTsKK30KK3JldHVybiBfYjk7Cit9OworZG9qby5ob3N0ZW52Ll9ibG9ja0FzeW5jPWZhbHNlOworZG9qby5ob3N0ZW52LmdldFRleHQ9ZnVuY3Rpb24odXJpLF9iZSxfYmYpeworaWYoIV9iZSl7Cit0aGlzLl9ibG9ja0FzeW5jPXRydWU7Cit9Cit2YXIgX2MwPXRoaXMuZ2V0WG1saHR0cE9iamVjdCgpOworZnVuY3Rpb24gaXNEb2N1bWVudE9rKF9jMSl7Cit2YXIgX2MyPV9jMVsic3RhdHVzIl07CityZXR1cm4gQm9vbGVhbigoIV9jMil8fCgoMjAwPD1fYzIpJiYoMzAwPl9jMikpfHwoX2MyPT0zMDQpKTsKK30KK2lmKF9iZSl7Cit2YXIgX2MzPXRoaXMsX2M0PW51bGwsZ2JsPWRvam8uZ2xvYmFsKCk7Cit2YXIgeGhyPWRvam8uZXZhbE9ialBhdGgoImRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydCIpOworX2MwLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeworaWYoX2M0KXsKK2dibC5jbGVhclRpbWVvdXQoX2M0KTsKK19jND1udWxsOworfQoraWYoX2MzLl9ibG9ja0FzeW5jfHwoeGhyJiZ4aHIuX2Jsb2NrQXN5bmMpKXsKK19jND1nYmwuc2V0VGltZW91dChmdW5jdGlvbigpeworX2MwLm9ucmVhZHlzdGF0ZWNoYW5nZS5hcHBseSh0aGlzKTsKK30sMTApOworfWVsc2V7CitpZig0PT1fYzAucmVhZHlTdGF0ZSl7CitpZihpc0RvY3VtZW50T2soX2MwKSl7CitfYmUoX2MwLnJlc3BvbnNlVGV4dCk7Cit9Cit9Cit9Cit9OworfQorX2MwLm9wZW4oIkdFVCIsdXJpLF9iZT90cnVlOmZhbHNlKTsKK3RyeXsKK19jMC5zZW5kKG51bGwpOworaWYoX2JlKXsKK3JldHVybiBudWxsOworfQoraWYoIWlzRG9jdW1lbnRPayhfYzApKXsKK3ZhciBlcnI9RXJyb3IoIlVuYWJsZSB0byBsb2FkICIrdXJpKyIgc3RhdHVzOiIrX2MwLnN0YXR1cyk7CitlcnIuc3RhdHVzPV9jMC5zdGF0dXM7CitlcnIucmVzcG9uc2VUZXh0PV9jMC5yZXNwb25zZVRleHQ7Cit0aHJvdyBlcnI7Cit9Cit9CitjYXRjaChlKXsKK3RoaXMuX2Jsb2NrQXN5bmM9ZmFsc2U7CitpZigoX2JmKSYmKCFfYmUpKXsKK3JldHVybiBudWxsOworfWVsc2V7Cit0aHJvdyBlOworfQorfQordGhpcy5fYmxvY2tBc3luYz1mYWxzZTsKK3JldHVybiBfYzAucmVzcG9uc2VUZXh0OworfTsKK2Rvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZD0iZG9qb0RlYnVnIjsKK2Rvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXI9W107Citkb2pvLmhvc3RlbnYuX3ByaW50bG5fc2FmZT1mYWxzZTsKK2Rvam8uaG9zdGVudi5wcmludGxuPWZ1bmN0aW9uKF9jOCl7CitpZighZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmUpeworZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5wdXNoKF9jOCk7Cit9ZWxzZXsKK3RyeXsKK3ZhciBfYzk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGpDb25maWcuZGVidWdDb250YWluZXJJZD9kakNvbmZpZy5kZWJ1Z0NvbnRhaW5lcklkOmRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCk7CitpZighX2M5KXsKK19jOT1kb2pvLmJvZHkoKTsKK30KK3ZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CitkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoX2M4KSk7CitfYzkuYXBwZW5kQ2hpbGQoZGl2KTsKK30KK2NhdGNoKGUpewordHJ5eworZG9jdW1lbnQud3JpdGUoIjxkaXY+IitfYzgrIjwvZGl2PiIpOworfQorY2F0Y2goZTIpeword2luZG93LnN0YXR1cz1fYzg7Cit9Cit9Cit9Cit9OworZG9qby5hZGRPbkxvYWQoZnVuY3Rpb24oKXsKK2Rvam8uaG9zdGVudi5fcHJpbnRsbl9zYWZlPXRydWU7Cit3aGlsZShkb2pvLmhvc3RlbnYuX3ByaW50bG5fYnVmZmVyLmxlbmd0aD4wKXsKK2Rvam8uaG9zdGVudi5wcmludGxuKGRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIuc2hpZnQoKSk7Cit9Cit9KTsKK2Z1bmN0aW9uIGRqX2FkZE5vZGVFdnRIZGxyKF9jYixfY2MsZnApewordmFyIF9jZT1fY2JbIm9uIitfY2NdfHxmdW5jdGlvbigpeworfTsKK19jYlsib24iK19jY109ZnVuY3Rpb24oKXsKK2ZwLmFwcGx5KF9jYixhcmd1bWVudHMpOworX2NlLmFwcGx5KF9jYixhcmd1bWVudHMpOworfTsKK3JldHVybiB0cnVlOworfQorZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZD1mYWxzZTsKK2Z1bmN0aW9uIGRqX2xvYWRfaW5pdChlKXsKK2Rvam8uaG9zdGVudi5fZGpJbml0RmlyZWQ9dHJ1ZTsKK3ZhciBfZDA9KGUmJmUudHlwZSk/ZS50eXBlLnRvTG93ZXJDYXNlKCk6ImxvYWQiOworaWYoYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZHx8KF9kMCE9ImRvbWNvbnRlbnRsb2FkZWQiJiZfZDAhPSJsb2FkIikpeworcmV0dXJuOworfQorYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZD10cnVlOworaWYodHlwZW9mIChfdGltZXIpIT0idW5kZWZpbmVkIil7CitjbGVhckludGVydmFsKF90aW1lcik7CitkZWxldGUgX3RpbWVyOworfQordmFyIF9kMT1mdW5jdGlvbigpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Citkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKK30KK307CitpZihkb2pvLmhvc3RlbnYuaW5GbGlnaHRDb3VudD09MCl7CitfZDEoKTsKK2Rvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkKCk7Cit9ZWxzZXsKK2Rvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnVuc2hpZnQoX2QxKTsKK30KK30KK2lmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpeworaWYoZG9qby5yZW5kZXIuaHRtbC5vcGVyYXx8KGRvam8ucmVuZGVyLmh0bWwubW96JiYoZGpDb25maWdbImVuYWJsZU1vekRvbUNvbnRlbnRMb2FkZWQiXT09PXRydWUpKSl7Citkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixkal9sb2FkX2luaXQsbnVsbCk7Cit9Cit3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZGpfbG9hZF9pbml0LG51bGwpOworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSYmZG9qby5yZW5kZXIub3Mud2luKXsKK2RvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKGUpeworaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09ImNvbXBsZXRlIil7Citkal9sb2FkX2luaXQoKTsKK30KK30pOworfQoraWYoLyhXZWJLaXR8a2h0bWwpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7Cit2YXIgX3RpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7CitpZigvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKXsKK2RqX2xvYWRfaW5pdCgpOworfQorfSwxMCk7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2RqX2FkZE5vZGVFdnRIZGxyKHdpbmRvdywiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpeworZG9qby5ob3N0ZW52Ll91bmxvYWRpbmc9dHJ1ZTsKK3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Citkb2pvLmhvc3RlbnYuX3VubG9hZGluZz1mYWxzZTsKK30sMCk7Cit9KTsKK30KK2RqX2FkZE5vZGVFdnRIZGxyKHdpbmRvdywidW5sb2FkIixmdW5jdGlvbigpeworZG9qby5ob3N0ZW52LnVubG9hZGVkKCk7CitpZigoIWRvam8ucmVuZGVyLmh0bWwuaWUpfHwoZG9qby5yZW5kZXIuaHRtbC5pZSYmZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcpKXsKK2Rvam8uaG9zdGVudi51bmxvYWRlZCgpOworfQorfSk7Citkb2pvLmhvc3RlbnYubWFrZVdpZGdldHM9ZnVuY3Rpb24oKXsKK3ZhciBfZDM9W107CitpZihkakNvbmZpZy5zZWFyY2hJZHMmJmRqQ29uZmlnLnNlYXJjaElkcy5sZW5ndGg+MCl7CitfZDM9X2QzLmNvbmNhdChkakNvbmZpZy5zZWFyY2hJZHMpOworfQoraWYoZG9qby5ob3N0ZW52LnNlYXJjaElkcyYmZG9qby5ob3N0ZW52LnNlYXJjaElkcy5sZW5ndGg+MCl7CitfZDM9X2QzLmNvbmNhdChkb2pvLmhvc3RlbnYuc2VhcmNoSWRzKTsKK30KK2lmKChkakNvbmZpZy5wYXJzZVdpZGdldHMpfHwoX2QzLmxlbmd0aD4wKSl7CitpZihkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLndpZGdldC5QYXJzZSIpKXsKK3ZhciBfZDQ9bmV3IGRvam8ueG1sLlBhcnNlKCk7CitpZihfZDMubGVuZ3RoPjApeworZm9yKHZhciB4PTA7eDxfZDMubGVuZ3RoO3grKyl7Cit2YXIgX2Q2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF9kM1t4XSk7CitpZighX2Q2KXsKK2NvbnRpbnVlOworfQordmFyIF9kNz1fZDQucGFyc2VFbGVtZW50KF9kNixudWxsLHRydWUpOworZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlQ29tcG9uZW50cyhfZDcpOworfQorfWVsc2V7CitpZihkakNvbmZpZy5wYXJzZVdpZGdldHMpewordmFyIF9kNz1fZDQucGFyc2VFbGVtZW50KGRvam8uYm9keSgpLG51bGwsdHJ1ZSk7Citkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVDb21wb25lbnRzKF9kNyk7Cit9Cit9Cit9Cit9Cit9OworZG9qby5hZGRPbkxvYWQoZnVuY3Rpb24oKXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uaG9zdGVudi5tYWtlV2lkZ2V0cygpOworfQorfSk7Cit0cnl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2RvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJ2IiwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiKTsKK2RvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKCJ2XFw6KiIsImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpIik7Cit9Cit9CitjYXRjaChlKXsKK30KK2Rvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzPWZ1bmN0aW9uKCl7Cit9OworaWYoIWRqX3VuZGVmKCJkb2N1bWVudCIsdGhpcykpeworZGpfY3VycmVudERvY3VtZW50PXRoaXMuZG9jdW1lbnQ7Cit9Citkb2pvLmRvYz1mdW5jdGlvbigpeworcmV0dXJuIGRqX2N1cnJlbnREb2N1bWVudDsKK307Citkb2pvLmJvZHk9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmRvYygpLmJvZHl8fGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTsKK307Citkb2pvLmJ5SWQ9ZnVuY3Rpb24oaWQsZG9jKXsKK2lmKChpZCkmJigodHlwZW9mIGlkPT0ic3RyaW5nIil8fChpZCBpbnN0YW5jZW9mIFN0cmluZykpKXsKK2lmKCFkb2MpeworZG9jPWRqX2N1cnJlbnREb2N1bWVudDsKK30KK3ZhciBlbGU9ZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKK2lmKGVsZSYmKGVsZS5pZCE9aWQpJiZkb2MuYWxsKXsKK2VsZT1udWxsOworZWxlcz1kb2MuYWxsW2lkXTsKK2lmKGVsZXMpeworaWYoZWxlcy5sZW5ndGgpeworZm9yKHZhciBpPTA7aTxlbGVzLmxlbmd0aDtpKyspeworaWYoZWxlc1tpXS5pZD09aWQpeworZWxlPWVsZXNbaV07CiticmVhazsKK30KK30KK31lbHNleworZWxlPWVsZXM7Cit9Cit9Cit9CityZXR1cm4gZWxlOworfQorcmV0dXJuIGlkOworfTsKK2Rvam8uc2V0Q29udGV4dD1mdW5jdGlvbihfZGMsX2RkKXsKK2RqX2N1cnJlbnRDb250ZXh0PV9kYzsKK2RqX2N1cnJlbnREb2N1bWVudD1fZGQ7Cit9OworZG9qby5fZmlyZUNhbGxiYWNrPWZ1bmN0aW9uKF9kZSxfZGYsX2UwKXsKK2lmKChfZGYpJiYoKHR5cGVvZiBfZGU9PSJzdHJpbmciKXx8KF9kZSBpbnN0YW5jZW9mIFN0cmluZykpKXsKK19kZT1fZGZbX2RlXTsKK30KK3JldHVybiAoX2RmP19kZS5hcHBseShfZGYsX2UwfHxbXSk6X2RlKCkpOworfTsKK2Rvam8ud2l0aEdsb2JhbD1mdW5jdGlvbihfZTEsX2UyLF9lMyxfZTQpewordmFyIF9lNTsKK3ZhciBfZTY9ZGpfY3VycmVudENvbnRleHQ7Cit2YXIgX2U3PWRqX2N1cnJlbnREb2N1bWVudDsKK3RyeXsKK2Rvam8uc2V0Q29udGV4dChfZTEsX2UxLmRvY3VtZW50KTsKK19lNT1kb2pvLl9maXJlQ2FsbGJhY2soX2UyLF9lMyxfZTQpOworfQorZmluYWxseXsKK2Rvam8uc2V0Q29udGV4dChfZTYsX2U3KTsKK30KK3JldHVybiBfZTU7Cit9OworZG9qby53aXRoRG9jPWZ1bmN0aW9uKF9lOCxfZTksX2VhLF9lYil7Cit2YXIgX2VjOwordmFyIF9lZD1kal9jdXJyZW50RG9jdW1lbnQ7Cit0cnl7Citkal9jdXJyZW50RG9jdW1lbnQ9X2U4OworX2VjPWRvam8uX2ZpcmVDYWxsYmFjayhfZTksX2VhLF9lYik7Cit9CitmaW5hbGx5eworZGpfY3VycmVudERvY3VtZW50PV9lZDsKK30KK3JldHVybiBfZWM7Cit9OworfQorZG9qby5yZXF1aXJlSWYoKGRqQ29uZmlnWyJpc0RlYnVnIl18fGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSksImRvam8uZGVidWciKTsKK2Rvam8ucmVxdWlyZUlmKGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSYmIXdpbmRvdy53aWRnZXQmJiFkakNvbmZpZ1sidXNlWERvbWFpbiJdLCJkb2pvLmJyb3dzZXJfZGVidWciKTsKK2Rvam8ucmVxdWlyZUlmKGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSYmIXdpbmRvdy53aWRnZXQmJmRqQ29uZmlnWyJ1c2VYRG9tYWluIl0sImRvam8uYnJvd3Nlcl9kZWJ1Z194ZCIpOworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZy5jb21tb24iKTsKK2Rvam8uc3RyaW5nLnRyaW09ZnVuY3Rpb24oc3RyLHdoKXsKK2lmKCFzdHIucmVwbGFjZSl7CityZXR1cm4gc3RyOworfQoraWYoIXN0ci5sZW5ndGgpeworcmV0dXJuIHN0cjsKK30KK3ZhciByZT0od2g+MCk/KC9eXHMrLyk6KHdoPDApPygvXHMrJC8pOigvXlxzK3xccyskL2cpOworcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCIiKTsKK307Citkb2pvLnN0cmluZy50cmltU3RhcnQ9ZnVuY3Rpb24oc3RyKXsKK3JldHVybiBkb2pvLnN0cmluZy50cmltKHN0ciwxKTsKK307Citkb2pvLnN0cmluZy50cmltRW5kPWZ1bmN0aW9uKHN0cil7CityZXR1cm4gZG9qby5zdHJpbmcudHJpbShzdHIsLTEpOworfTsKK2Rvam8uc3RyaW5nLnJlcGVhdD1mdW5jdGlvbihzdHIsX2Y0LF9mNSl7Cit2YXIgb3V0PSIiOworZm9yKHZhciBpPTA7aTxfZjQ7aSsrKXsKK291dCs9c3RyOworaWYoX2Y1JiZpPF9mNC0xKXsKK291dCs9X2Y1OworfQorfQorcmV0dXJuIG91dDsKK307Citkb2pvLnN0cmluZy5wYWQ9ZnVuY3Rpb24oc3RyLGxlbixjLGRpcil7Cit2YXIgb3V0PVN0cmluZyhzdHIpOworaWYoIWMpeworYz0iMCI7Cit9CitpZighZGlyKXsKK2Rpcj0xOworfQord2hpbGUob3V0Lmxlbmd0aDxsZW4peworaWYoZGlyPjApeworb3V0PWMrb3V0OworfWVsc2V7CitvdXQrPWM7Cit9Cit9CityZXR1cm4gb3V0OworfTsKK2Rvam8uc3RyaW5nLnBhZExlZnQ9ZnVuY3Rpb24oc3RyLGxlbixjKXsKK3JldHVybiBkb2pvLnN0cmluZy5wYWQoc3RyLGxlbixjLDEpOworfTsKK2Rvam8uc3RyaW5nLnBhZFJpZ2h0PWZ1bmN0aW9uKHN0cixsZW4sYyl7CityZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0cixsZW4sYywtMSk7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZyIpOworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuY29tbW9uIik7Citkb2pvLmxhbmcuaW5oZXJpdHM9ZnVuY3Rpb24oXzEwMyxfMTA0KXsKK2lmKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihfMTA0KSl7Citkb2pvLnJhaXNlKCJkb2pvLmluaGVyaXRzOiBzdXBlcmNsYXNzIGFyZ3VtZW50IFsiK18xMDQrIl0gbXVzdCBiZSBhIGZ1bmN0aW9uIChzdWJjbGFzczogWyIrXzEwMysiJ10iKTsKK30KK18xMDMucHJvdG90eXBlPW5ldyBfMTA0KCk7CitfMTAzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1fMTAzOworXzEwMy5zdXBlcmNsYXNzPV8xMDQucHJvdG90eXBlOworXzEwM1sic3VwZXIiXT1fMTA0LnByb3RvdHlwZTsKK307Citkb2pvLmxhbmcuX21peGluPWZ1bmN0aW9uKG9iaixfMTA2KXsKK3ZhciB0b2JqPXt9OworZm9yKHZhciB4IGluIF8xMDYpeworaWYoKHR5cGVvZiB0b2JqW3hdPT0idW5kZWZpbmVkIil8fCh0b2JqW3hdIT1fMTA2W3hdKSl7CitvYmpbeF09XzEwNlt4XTsKK30KK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUmJih0eXBlb2YgKF8xMDZbInRvU3RyaW5nIl0pPT0iZnVuY3Rpb24iKSYmKF8xMDZbInRvU3RyaW5nIl0hPW9ialsidG9TdHJpbmciXSkmJihfMTA2WyJ0b1N0cmluZyJdIT10b2JqWyJ0b1N0cmluZyJdKSl7CitvYmoudG9TdHJpbmc9XzEwNi50b1N0cmluZzsKK30KK3JldHVybiBvYmo7Cit9OworZG9qby5sYW5nLm1peGluPWZ1bmN0aW9uKG9iaixfMTBhKXsKK2Zvcih2YXIgaT0xLGw9YXJndW1lbnRzLmxlbmd0aDtpPGw7aSsrKXsKK2Rvam8ubGFuZy5fbWl4aW4ob2JqLGFyZ3VtZW50c1tpXSk7Cit9CityZXR1cm4gb2JqOworfTsKK2Rvam8ubGFuZy5leHRlbmQ9ZnVuY3Rpb24oXzEwZCxfMTBlKXsKK2Zvcih2YXIgaT0xLGw9YXJndW1lbnRzLmxlbmd0aDtpPGw7aSsrKXsKK2Rvam8ubGFuZy5fbWl4aW4oXzEwZC5wcm90b3R5cGUsYXJndW1lbnRzW2ldKTsKK30KK3JldHVybiBfMTBkOworfTsKK2Rvam8uaW5oZXJpdHM9ZG9qby5sYW5nLmluaGVyaXRzOworZG9qby5taXhpbj1kb2pvLmxhbmcubWl4aW47Citkb2pvLmV4dGVuZD1kb2pvLmxhbmcuZXh0ZW5kOworZG9qby5sYW5nLmZpbmQ9ZnVuY3Rpb24oXzExMSxfMTEyLF8xMTMsXzExNCl7CitpZighZG9qby5sYW5nLmlzQXJyYXlMaWtlKF8xMTEpJiZkb2pvLmxhbmcuaXNBcnJheUxpa2UoXzExMikpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLmxhbmcuZmluZCh2YWx1ZSwgYXJyYXkpIiwidXNlIGRvam8ubGFuZy5maW5kKGFycmF5LCB2YWx1ZSkgaW5zdGVhZCIsIjAuNSIpOwordmFyIHRlbXA9XzExMTsKK18xMTE9XzExMjsKK18xMTI9dGVtcDsKK30KK3ZhciBfMTE2PWRvam8ubGFuZy5pc1N0cmluZyhfMTExKTsKK2lmKF8xMTYpeworXzExMT1fMTExLnNwbGl0KCIiKTsKK30KK2lmKF8xMTQpewordmFyIHN0ZXA9LTE7Cit2YXIgaT1fMTExLmxlbmd0aC0xOwordmFyIGVuZD0tMTsKK31lbHNlewordmFyIHN0ZXA9MTsKK3ZhciBpPTA7Cit2YXIgZW5kPV8xMTEubGVuZ3RoOworfQoraWYoXzExMyl7Cit3aGlsZShpIT1lbmQpeworaWYoXzExMVtpXT09PV8xMTIpeworcmV0dXJuIGk7Cit9CitpKz1zdGVwOworfQorfWVsc2V7Cit3aGlsZShpIT1lbmQpeworaWYoXzExMVtpXT09XzExMil7CityZXR1cm4gaTsKK30KK2krPXN0ZXA7Cit9Cit9CityZXR1cm4gLTE7Cit9OworZG9qby5sYW5nLmluZGV4T2Y9ZG9qby5sYW5nLmZpbmQ7Citkb2pvLmxhbmcuZmluZExhc3Q9ZnVuY3Rpb24oXzExYSxfMTFiLF8xMWMpeworcmV0dXJuIGRvam8ubGFuZy5maW5kKF8xMWEsXzExYixfMTFjLHRydWUpOworfTsKK2Rvam8ubGFuZy5sYXN0SW5kZXhPZj1kb2pvLmxhbmcuZmluZExhc3Q7Citkb2pvLmxhbmcuaW5BcnJheT1mdW5jdGlvbihfMTFkLF8xMWUpeworcmV0dXJuIGRvam8ubGFuZy5maW5kKF8xMWQsXzExZSk+LTE7Cit9OworZG9qby5sYW5nLmlzT2JqZWN0PWZ1bmN0aW9uKGl0KXsKK2lmKHR5cGVvZiBpdD09InVuZGVmaW5lZCIpeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuICh0eXBlb2YgaXQ9PSJvYmplY3QifHxpdD09PW51bGx8fGRvam8ubGFuZy5pc0FycmF5KGl0KXx8ZG9qby5sYW5nLmlzRnVuY3Rpb24oaXQpKTsKK307Citkb2pvLmxhbmcuaXNBcnJheT1mdW5jdGlvbihpdCl7CityZXR1cm4gKGl0JiZpdCBpbnN0YW5jZW9mIEFycmF5fHx0eXBlb2YgaXQ9PSJhcnJheSIpOworfTsKK2Rvam8ubGFuZy5pc0FycmF5TGlrZT1mdW5jdGlvbihpdCl7CitpZigoIWl0KXx8KGRvam8ubGFuZy5pc1VuZGVmaW5lZChpdCkpKXsKK3JldHVybiBmYWxzZTsKK30KK2lmKGRvam8ubGFuZy5pc1N0cmluZyhpdCkpeworcmV0dXJuIGZhbHNlOworfQoraWYoZG9qby5sYW5nLmlzRnVuY3Rpb24oaXQpKXsKK3JldHVybiBmYWxzZTsKK30KK2lmKGRvam8ubGFuZy5pc0FycmF5KGl0KSl7CityZXR1cm4gdHJ1ZTsKK30KK2lmKChpdC50YWdOYW1lKSYmKGl0LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ImZvcm0iKSl7CityZXR1cm4gZmFsc2U7Cit9CitpZihkb2pvLmxhbmcuaXNOdW1iZXIoaXQubGVuZ3RoKSYmaXNGaW5pdGUoaXQubGVuZ3RoKSl7CityZXR1cm4gdHJ1ZTsKK30KK3JldHVybiBmYWxzZTsKK307Citkb2pvLmxhbmcuaXNGdW5jdGlvbj1mdW5jdGlvbihpdCl7CityZXR1cm4gKGl0IGluc3RhbmNlb2YgRnVuY3Rpb258fHR5cGVvZiBpdD09ImZ1bmN0aW9uIik7Cit9OworKGZ1bmN0aW9uKCl7CitpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ucmVuZGVyLmh0bWxbInNhZmFyaSJdKSl7Citkb2pvLmxhbmcuaXNGdW5jdGlvbj1mdW5jdGlvbihpdCl7CitpZigodHlwZW9mIChpdCk9PSJmdW5jdGlvbiIpJiYoaXQ9PSJbb2JqZWN0IE5vZGVMaXN0XSIpKXsKK3JldHVybiBmYWxzZTsKK30KK3JldHVybiAoaXQgaW5zdGFuY2VvZiBGdW5jdGlvbnx8dHlwZW9mIGl0PT0iZnVuY3Rpb24iKTsKK307Cit9Cit9KSgpOworZG9qby5sYW5nLmlzU3RyaW5nPWZ1bmN0aW9uKGl0KXsKK3JldHVybiAodHlwZW9mIGl0PT0ic3RyaW5nInx8aXQgaW5zdGFuY2VvZiBTdHJpbmcpOworfTsKK2Rvam8ubGFuZy5pc0FsaWVuPWZ1bmN0aW9uKGl0KXsKK2lmKCFpdCl7CityZXR1cm4gZmFsc2U7Cit9CityZXR1cm4gIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGl0KSYmL1x7XHMqXFtuYXRpdmUgY29kZVxdXHMqXH0vLnRlc3QoU3RyaW5nKGl0KSk7Cit9OworZG9qby5sYW5nLmlzQm9vbGVhbj1mdW5jdGlvbihpdCl7CityZXR1cm4gKGl0IGluc3RhbmNlb2YgQm9vbGVhbnx8dHlwZW9mIGl0PT0iYm9vbGVhbiIpOworfTsKK2Rvam8ubGFuZy5pc051bWJlcj1mdW5jdGlvbihpdCl7CityZXR1cm4gKGl0IGluc3RhbmNlb2YgTnVtYmVyfHx0eXBlb2YgaXQ9PSJudW1iZXIiKTsKK307Citkb2pvLmxhbmcuaXNVbmRlZmluZWQ9ZnVuY3Rpb24oaXQpeworcmV0dXJuICgodHlwZW9mIChpdCk9PSJ1bmRlZmluZWQiKSYmKGl0PT11bmRlZmluZWQpKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5leHRyYXMiKTsKK2Rvam8ubGFuZy5zZXRUaW1lb3V0PWZ1bmN0aW9uKGZ1bmMsXzEyYSl7Cit2YXIgXzEyYj13aW5kb3csXzEyYz0yOworaWYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGZ1bmMpKXsKK18xMmI9ZnVuYzsKK2Z1bmM9XzEyYTsKK18xMmE9YXJndW1lbnRzWzJdOworXzEyYysrOworfQoraWYoZG9qby5sYW5nLmlzU3RyaW5nKGZ1bmMpKXsKK2Z1bmM9XzEyYltmdW5jXTsKK30KK3ZhciBhcmdzPVtdOworZm9yKHZhciBpPV8xMmM7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CithcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKK30KK3JldHVybiBkb2pvLmdsb2JhbCgpLnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKK2Z1bmMuYXBwbHkoXzEyYixhcmdzKTsKK30sXzEyYSk7Cit9OworZG9qby5sYW5nLmNsZWFyVGltZW91dD1mdW5jdGlvbihfMTJmKXsKK2Rvam8uZ2xvYmFsKCkuY2xlYXJUaW1lb3V0KF8xMmYpOworfTsKK2Rvam8ubGFuZy5nZXROYW1lSW5PYmo9ZnVuY3Rpb24obnMsaXRlbSl7CitpZighbnMpeworbnM9ZGpfZ2xvYmFsOworfQorZm9yKHZhciB4IGluIG5zKXsKK2lmKG5zW3hdPT09aXRlbSl7CityZXR1cm4gbmV3IFN0cmluZyh4KTsKK30KK30KK3JldHVybiBudWxsOworfTsKK2Rvam8ubGFuZy5zaGFsbG93Q29weT1mdW5jdGlvbihvYmosZGVlcCl7Cit2YXIgaSxyZXQ7CitpZihvYmo9PT1udWxsKXsKK3JldHVybiBudWxsOworfQoraWYoZG9qby5sYW5nLmlzT2JqZWN0KG9iaikpeworcmV0PW5ldyBvYmouY29uc3RydWN0b3IoKTsKK2ZvcihpIGluIG9iail7CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQocmV0W2ldKSl7CityZXRbaV09ZGVlcD9kb2pvLmxhbmcuc2hhbGxvd0NvcHkob2JqW2ldLGRlZXApOm9ialtpXTsKK30KK30KK31lbHNleworaWYoZG9qby5sYW5nLmlzQXJyYXkob2JqKSl7CityZXQ9W107Citmb3IoaT0wO2k8b2JqLmxlbmd0aDtpKyspeworcmV0W2ldPWRlZXA/ZG9qby5sYW5nLnNoYWxsb3dDb3B5KG9ialtpXSxkZWVwKTpvYmpbaV07Cit9Cit9ZWxzZXsKK3JldD1vYmo7Cit9Cit9CityZXR1cm4gcmV0OworfTsKK2Rvam8ubGFuZy5maXJzdFZhbHVlZD1mdW5jdGlvbigpeworZm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZih0eXBlb2YgYXJndW1lbnRzW2ldIT0idW5kZWZpbmVkIil7CityZXR1cm4gYXJndW1lbnRzW2ldOworfQorfQorcmV0dXJuIHVuZGVmaW5lZDsKK307Citkb2pvLmxhbmcuZ2V0T2JqUGF0aFZhbHVlPWZ1bmN0aW9uKF8xMzgsXzEzOSxfMTNhKXsKK3dpdGgoZG9qby5wYXJzZU9ialBhdGgoXzEzOCxfMTM5LF8xM2EpKXsKK3JldHVybiBkb2pvLmV2YWxQcm9wKHByb3Asb2JqLF8xM2EpOworfQorfTsKK2Rvam8ubGFuZy5zZXRPYmpQYXRoVmFsdWU9ZnVuY3Rpb24oXzEzYixfMTNjLF8xM2QsXzEzZSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ubGFuZy5zZXRPYmpQYXRoVmFsdWUiLCJ1c2UgZG9qby5wYXJzZU9ialBhdGggYW5kIHRoZSAnPScgb3BlcmF0b3IiLCIwLjYiKTsKK2lmKGFyZ3VtZW50cy5sZW5ndGg8NCl7CitfMTNlPXRydWU7Cit9Cit3aXRoKGRvam8ucGFyc2VPYmpQYXRoKF8xM2IsXzEzZCxfMTNlKSl7CitpZihvYmomJihfMTNlfHwocHJvcCBpbiBvYmopKSl7CitvYmpbcHJvcF09XzEzYzsKK30KK30KK307Citkb2pvLnByb3ZpZGUoImRvam8uaW8uY29tbW9uIik7Citkb2pvLmlvLnRyYW5zcG9ydHM9W107Citkb2pvLmlvLmhkbHJGdW5jTmFtZXM9WyJsb2FkIiwiZXJyb3IiLCJ0aW1lb3V0Il07Citkb2pvLmlvLlJlcXVlc3Q9ZnVuY3Rpb24odXJsLF8xNDAsXzE0MSxfMTQyKXsKK2lmKChhcmd1bWVudHMubGVuZ3RoPT0xKSYmKGFyZ3VtZW50c1swXS5jb25zdHJ1Y3Rvcj09T2JqZWN0KSl7Cit0aGlzLmZyb21Ld0FyZ3MoYXJndW1lbnRzWzBdKTsKK31lbHNlewordGhpcy51cmw9dXJsOworaWYoXzE0MCl7Cit0aGlzLm1pbWV0eXBlPV8xNDA7Cit9CitpZihfMTQxKXsKK3RoaXMudHJhbnNwb3J0PV8xNDE7Cit9CitpZihhcmd1bWVudHMubGVuZ3RoPj00KXsKK3RoaXMuY2hhbmdlVXJsPV8xNDI7Cit9Cit9Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmlvLlJlcXVlc3Qse3VybDoiIixtaW1ldHlwZToidGV4dC9wbGFpbiIsbWV0aG9kOiJHRVQiLGNvbnRlbnQ6dW5kZWZpbmVkLHRyYW5zcG9ydDp1bmRlZmluZWQsY2hhbmdlVXJsOnVuZGVmaW5lZCxmb3JtTm9kZTp1bmRlZmluZWQsc3luYzpmYWxzZSxiaW5kU3VjY2VzczpmYWxzZSx1c2VDYWNoZTpmYWxzZSxwcmV2ZW50Q2FjaGU6ZmFsc2UsanNvbkZpbHRlcjpmdW5jdGlvbihfMTQzKXsKK2lmKCh0aGlzLm1pbWV0eXBlPT0idGV4dC9qc29uLWNvbW1lbnQtZmlsdGVyZWQiKXx8KHRoaXMubWltZXR5cGU9PSJhcHBsaWNhdGlvbi9qc29uLWNvbW1lbnQtZmlsdGVyZWQiKSl7Cit2YXIgXzE0ND1fMTQzLmluZGV4T2YoIi8qIik7Cit2YXIgXzE0NT1fMTQzLmxhc3RJbmRleE9mKCIqLyIpOworaWYoKF8xNDQ9PS0xKXx8KF8xNDU9PS0xKSl7Citkb2pvLmRlYnVnKCJ5b3VyIEpTT04gd2Fzbid0IGNvbW1lbnQgZmlsdGVyZWQhIik7CityZXR1cm4gIiI7Cit9CityZXR1cm4gXzE0My5zdWJzdHJpbmcoXzE0NCsyLF8xNDUpOworfQorZG9qby5kZWJ1ZygicGxlYXNlIGNvbnNpZGVyIHVzaW5nIGEgbWltZXR5cGUgb2YgdGV4dC9qc29uLWNvbW1lbnQtZmlsdGVyZWQgdG8gYXZvaWQgcG90ZW50aWFsIHNlY3VyaXR5IGlzc3VlcyB3aXRoIEpTT04gZW5kcG9pbnRzIik7CityZXR1cm4gXzE0MzsKK30sbG9hZDpmdW5jdGlvbih0eXBlLGRhdGEsXzE0OCxfMTQ5KXsKK30sZXJyb3I6ZnVuY3Rpb24odHlwZSxfMTRiLF8xNGMsXzE0ZCl7Cit9LHRpbWVvdXQ6ZnVuY3Rpb24odHlwZSxfMTRmLF8xNTAsXzE1MSl7Cit9LGhhbmRsZTpmdW5jdGlvbih0eXBlLGRhdGEsXzE1NCxfMTU1KXsKK30sdGltZW91dFNlY29uZHM6MCxhYm9ydDpmdW5jdGlvbigpeworfSxmcm9tS3dBcmdzOmZ1bmN0aW9uKF8xNTYpeworaWYoXzE1NlsidXJsIl0peworXzE1Ni51cmw9XzE1Ni51cmwudG9TdHJpbmcoKTsKK30KK2lmKF8xNTZbImZvcm1Ob2RlIl0peworXzE1Ni5mb3JtTm9kZT1kb2pvLmJ5SWQoXzE1Ni5mb3JtTm9kZSk7Cit9CitpZighXzE1NlsibWV0aG9kIl0mJl8xNTZbImZvcm1Ob2RlIl0mJl8xNTZbImZvcm1Ob2RlIl0ubWV0aG9kKXsKK18xNTYubWV0aG9kPV8xNTZbImZvcm1Ob2RlIl0ubWV0aG9kOworfQoraWYoIV8xNTZbImhhbmRsZSJdJiZfMTU2WyJoYW5kbGVyIl0peworXzE1Ni5oYW5kbGU9XzE1Ni5oYW5kbGVyOworfQoraWYoIV8xNTZbImxvYWQiXSYmXzE1NlsibG9hZGVkIl0peworXzE1Ni5sb2FkPV8xNTYubG9hZGVkOworfQoraWYoIV8xNTZbImNoYW5nZVVybCJdJiZfMTU2WyJjaGFuZ2VVUkwiXSl7CitfMTU2LmNoYW5nZVVybD1fMTU2LmNoYW5nZVVSTDsKK30KK18xNTYuZW5jb2Rpbmc9ZG9qby5sYW5nLmZpcnN0VmFsdWVkKF8xNTZbImVuY29kaW5nIl0sZGpDb25maWdbImJpbmRFbmNvZGluZyJdLCIiKTsKK18xNTYuc2VuZFRyYW5zcG9ydD1kb2pvLmxhbmcuZmlyc3RWYWx1ZWQoXzE1Nlsic2VuZFRyYW5zcG9ydCJdLGRqQ29uZmlnWyJpb1NlbmRUcmFuc3BvcnQiXSxmYWxzZSk7Cit2YXIgXzE1Nz1kb2pvLmxhbmcuaXNGdW5jdGlvbjsKK2Zvcih2YXIgeD0wO3g8ZG9qby5pby5oZGxyRnVuY05hbWVzLmxlbmd0aDt4KyspewordmFyIGZuPWRvam8uaW8uaGRsckZ1bmNOYW1lc1t4XTsKK2lmKF8xNTZbZm5dJiZfMTU3KF8xNTZbZm5dKSl7Citjb250aW51ZTsKK30KK2lmKF8xNTZbImhhbmRsZSJdJiZfMTU3KF8xNTZbImhhbmRsZSJdKSl7CitfMTU2W2ZuXT1fMTU2LmhhbmRsZTsKK30KK30KK2Rvam8ubGFuZy5taXhpbih0aGlzLF8xNTYpOworfX0pOworZG9qby5pby5FcnJvcj1mdW5jdGlvbihtc2csdHlwZSxudW0pewordGhpcy5tZXNzYWdlPW1zZzsKK3RoaXMudHlwZT10eXBlfHwidW5rbm93biI7Cit0aGlzLm51bWJlcj1udW18fDA7Cit9OworZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydD1mdW5jdGlvbihuYW1lKXsKK3RoaXMucHVzaChuYW1lKTsKK3RoaXNbbmFtZV09ZG9qby5pb1tuYW1lXTsKK307Citkb2pvLmlvLmJpbmQ9ZnVuY3Rpb24oXzE1ZSl7CitpZighKF8xNWUgaW5zdGFuY2VvZiBkb2pvLmlvLlJlcXVlc3QpKXsKK3RyeXsKK18xNWU9bmV3IGRvam8uaW8uUmVxdWVzdChfMTVlKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK30KK3ZhciBfMTVmPSIiOworaWYoXzE1ZVsidHJhbnNwb3J0Il0peworXzE1Zj1fMTVlWyJ0cmFuc3BvcnQiXTsKK2lmKCF0aGlzW18xNWZdKXsKK2Rvam8uaW8uc2VuZEJpbmRFcnJvcihfMTVlLCJObyBkb2pvLmlvLmJpbmQoKSB0cmFuc3BvcnQgd2l0aCBuYW1lICciK18xNWVbInRyYW5zcG9ydCJdKyInLiIpOworcmV0dXJuIF8xNWU7Cit9CitpZighdGhpc1tfMTVmXS5jYW5IYW5kbGUoXzE1ZSkpeworZG9qby5pby5zZW5kQmluZEVycm9yKF8xNWUsImRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIrXzE1ZVsidHJhbnNwb3J0Il0rIicgY2Fubm90IGhhbmRsZSB0aGlzIHR5cGUgb2YgcmVxdWVzdC4iKTsKK3JldHVybiBfMTVlOworfQorfWVsc2V7Citmb3IodmFyIHg9MDt4PGRvam8uaW8udHJhbnNwb3J0cy5sZW5ndGg7eCsrKXsKK3ZhciB0bXA9ZG9qby5pby50cmFuc3BvcnRzW3hdOworaWYoKHRoaXNbdG1wXSkmJih0aGlzW3RtcF0uY2FuSGFuZGxlKF8xNWUpKSl7CitfMTVmPXRtcDsKK2JyZWFrOworfQorfQoraWYoXzE1Zj09IiIpeworZG9qby5pby5zZW5kQmluZEVycm9yKF8xNWUsIk5vbmUgb2YgdGhlIGxvYWRlZCB0cmFuc3BvcnRzIGZvciBkb2pvLmlvLmJpbmQoKSIrIiBjYW4gaGFuZGxlIHRoZSByZXF1ZXN0LiIpOworcmV0dXJuIF8xNWU7Cit9Cit9Cit0aGlzW18xNWZdLmJpbmQoXzE1ZSk7CitfMTVlLmJpbmRTdWNjZXNzPXRydWU7CityZXR1cm4gXzE1ZTsKK307Citkb2pvLmlvLnNlbmRCaW5kRXJyb3I9ZnVuY3Rpb24oXzE2MixfMTYzKXsKK2lmKCh0eXBlb2YgXzE2Mi5lcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIF8xNjIuaGFuZGxlPT0iZnVuY3Rpb24iKSYmKHR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24ifHx0eXBlb2Ygc2V0VGltZW91dD09Im9iamVjdCIpKXsKK3ZhciBfMTY0PW5ldyBkb2pvLmlvLkVycm9yKF8xNjMpOworc2V0VGltZW91dChmdW5jdGlvbigpeworXzE2MlsodHlwZW9mIF8xNjIuZXJyb3I9PSJmdW5jdGlvbiIpPyJlcnJvciI6ImhhbmRsZSJdKCJlcnJvciIsXzE2NCxudWxsLF8xNjIpOworfSw1MCk7Cit9ZWxzZXsKK2Rvam8ucmFpc2UoXzE2Myk7Cit9Cit9OworZG9qby5pby5xdWV1ZUJpbmQ9ZnVuY3Rpb24oXzE2NSl7CitpZighKF8xNjUgaW5zdGFuY2VvZiBkb2pvLmlvLlJlcXVlc3QpKXsKK3RyeXsKK18xNjU9bmV3IGRvam8uaW8uUmVxdWVzdChfMTY1KTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK30KK3ZhciBfMTY2PV8xNjUubG9hZDsKK18xNjUubG9hZD1mdW5jdGlvbigpeworZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQ9ZmFsc2U7Cit2YXIgcmV0PV8xNjYuYXBwbHkodGhpcyxhcmd1bWVudHMpOworZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CityZXR1cm4gcmV0OworfTsKK3ZhciBfMTY4PV8xNjUuZXJyb3I7CitfMTY1LmVycm9yPWZ1bmN0aW9uKCl7Citkb2pvLmlvLl9xdWV1ZUJpbmRJbkZsaWdodD1mYWxzZTsKK3ZhciByZXQ9XzE2OC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Citkb2pvLmlvLl9kaXNwYXRjaE5leHRRdWV1ZUJpbmQoKTsKK3JldHVybiByZXQ7Cit9OworZG9qby5pby5fYmluZFF1ZXVlLnB1c2goXzE2NSk7Citkb2pvLmlvLl9kaXNwYXRjaE5leHRRdWV1ZUJpbmQoKTsKK3JldHVybiBfMTY1OworfTsKK2Rvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZD1mdW5jdGlvbigpeworaWYoIWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0KXsKK2Rvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0PXRydWU7CitpZihkb2pvLmlvLl9iaW5kUXVldWUubGVuZ3RoPjApeworZG9qby5pby5iaW5kKGRvam8uaW8uX2JpbmRRdWV1ZS5zaGlmdCgpKTsKK31lbHNleworZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQ9ZmFsc2U7Cit9Cit9Cit9OworZG9qby5pby5fYmluZFF1ZXVlPVtdOworZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQ9ZmFsc2U7Citkb2pvLmlvLmFyZ3NGcm9tTWFwPWZ1bmN0aW9uKG1hcCxfMTZiLGxhc3QpewordmFyIGVuYz0vdXRmL2kudGVzdChfMTZifHwiIik/ZW5jb2RlVVJJQ29tcG9uZW50OmRvam8uc3RyaW5nLmVuY29kZUFzY2lpOwordmFyIF8xNmU9W107Cit2YXIgXzE2Zj1uZXcgT2JqZWN0KCk7Citmb3IodmFyIG5hbWUgaW4gbWFwKXsKK3ZhciBfMTcxPWZ1bmN0aW9uKGVsdCl7Cit2YXIgdmFsPWVuYyhuYW1lKSsiPSIrZW5jKGVsdCk7CitfMTZlWyhsYXN0PT1uYW1lKT8icHVzaCI6InVuc2hpZnQiXSh2YWwpOworfTsKK2lmKCFfMTZmW25hbWVdKXsKK3ZhciBfMTc0PW1hcFtuYW1lXTsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF8xNzQpKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF8xNzQsXzE3MSk7Cit9ZWxzZXsKK18xNzEoXzE3NCk7Cit9Cit9Cit9CityZXR1cm4gXzE2ZS5qb2luKCImIik7Cit9OworZG9qby5pby5zZXRJRnJhbWVTcmM9ZnVuY3Rpb24oXzE3NSxzcmMsXzE3Nyl7Cit0cnl7Cit2YXIgcj1kb2pvLnJlbmRlci5odG1sOworaWYoIV8xNzcpeworaWYoci5zYWZhcmkpeworXzE3NS5sb2NhdGlvbj1zcmM7Cit9ZWxzZXsKK2ZyYW1lc1tfMTc1Lm5hbWVdLmxvY2F0aW9uPXNyYzsKK30KK31lbHNlewordmFyIGlkb2M7CitpZihyLmllKXsKK2lkb2M9XzE3NS5jb250ZW50V2luZG93LmRvY3VtZW50OworfWVsc2V7CitpZihyLnNhZmFyaSl7CitpZG9jPV8xNzUuZG9jdW1lbnQ7Cit9ZWxzZXsKK2lkb2M9XzE3NS5jb250ZW50V2luZG93OworfQorfQoraWYoIWlkb2MpeworXzE3NS5sb2NhdGlvbj1zcmM7CityZXR1cm47Cit9ZWxzZXsKK2lkb2MubG9jYXRpb24ucmVwbGFjZShzcmMpOworfQorfQorfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworZG9qby5kZWJ1Zygic2V0SUZyYW1lU3JjOiAiK2UpOworfQorfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmFycmF5Iik7Citkb2pvLmxhbmcubWl4aW4oZG9qby5sYW5nLHtoYXM6ZnVuY3Rpb24ob2JqLG5hbWUpewordHJ5eworcmV0dXJuIHR5cGVvZiBvYmpbbmFtZV0hPSJ1bmRlZmluZWQiOworfQorY2F0Y2goZSl7CityZXR1cm4gZmFsc2U7Cit9Cit9LGlzRW1wdHk6ZnVuY3Rpb24ob2JqKXsKK2lmKGRvam8ubGFuZy5pc09iamVjdChvYmopKXsKK3ZhciB0bXA9e307Cit2YXIgXzE3ZT0wOworZm9yKHZhciB4IGluIG9iail7CitpZihvYmpbeF0mJighdG1wW3hdKSl7CitfMTdlKys7CiticmVhazsKK30KK30KK3JldHVybiBfMTdlPT0wOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uob2JqKXx8ZG9qby5sYW5nLmlzU3RyaW5nKG9iaikpeworcmV0dXJuIG9iai5sZW5ndGg9PTA7Cit9Cit9Cit9LG1hcDpmdW5jdGlvbihhcnIsb2JqLF8xODIpewordmFyIF8xODM9ZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CitpZihfMTgzKXsKK2Fycj1hcnIuc3BsaXQoIiIpOworfQoraWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSYmKCFfMTgyKSl7CitfMTgyPW9iajsKK29iaj1kal9nbG9iYWw7Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikmJl8xODIpewordmFyIF8xODQ9b2JqOworb2JqPV8xODI7CitfMTgyPV8xODQ7Cit9Cit9CitpZihBcnJheS5tYXApewordmFyIF8xODU9QXJyYXkubWFwKGFycixfMTgyLG9iaik7Cit9ZWxzZXsKK3ZhciBfMTg1PVtdOworZm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSl7CitfMTg1LnB1c2goXzE4Mi5jYWxsKG9iaixhcnJbaV0pKTsKK30KK30KK2lmKF8xODMpeworcmV0dXJuIF8xODUuam9pbigiIik7Cit9ZWxzZXsKK3JldHVybiBfMTg1OworfQorfSxyZWR1Y2U6ZnVuY3Rpb24oYXJyLF8xODgsb2JqLF8xOGEpewordmFyIF8xOGI9XzE4ODsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTIpeworXzE4YT1fMTg4OworXzE4Yj1hcnJbMF07CithcnI9YXJyLnNsaWNlKDEpOworfWVsc2V7CitpZihhcmd1bWVudHMubGVuZ3RoPT0zKXsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikpeworXzE4YT1vYmo7CitvYmo9bnVsbDsKK30KK31lbHNleworaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSl7Cit2YXIgdG1wPV8xOGE7CitfMThhPW9iajsKK29iaj10bXA7Cit9Cit9Cit9Cit2YXIgb2I9b2JqfHxkal9nbG9iYWw7Citkb2pvLmxhbmcubWFwKGFycixmdW5jdGlvbih2YWwpeworXzE4Yj1fMThhLmNhbGwob2IsXzE4Yix2YWwpOworfSk7CityZXR1cm4gXzE4YjsKK30sZm9yRWFjaDpmdW5jdGlvbihfMThmLF8xOTAsXzE5MSl7CitpZihkb2pvLmxhbmcuaXNTdHJpbmcoXzE4ZikpeworXzE4Zj1fMThmLnNwbGl0KCIiKTsKK30KK2lmKEFycmF5LmZvckVhY2gpeworQXJyYXkuZm9yRWFjaChfMThmLF8xOTAsXzE5MSk7Cit9ZWxzZXsKK2lmKCFfMTkxKXsKK18xOTE9ZGpfZ2xvYmFsOworfQorZm9yKHZhciBpPTAsbD1fMThmLmxlbmd0aDtpPGw7aSsrKXsKK18xOTAuY2FsbChfMTkxLF8xOGZbaV0saSxfMThmKTsKK30KK30KK30sX2V2ZXJ5T3JTb21lOmZ1bmN0aW9uKF8xOTQsYXJyLF8xOTYsXzE5Nyl7CitpZihkb2pvLmxhbmcuaXNTdHJpbmcoYXJyKSl7CithcnI9YXJyLnNwbGl0KCIiKTsKK30KK2lmKEFycmF5LmV2ZXJ5KXsKK3JldHVybiBBcnJheVtfMTk0PyJldmVyeSI6InNvbWUiXShhcnIsXzE5NixfMTk3KTsKK31lbHNleworaWYoIV8xOTcpeworXzE5Nz1kal9nbG9iYWw7Cit9Citmb3IodmFyIGk9MCxsPWFyci5sZW5ndGg7aTxsO2krKyl7Cit2YXIgXzE5YT1fMTk2LmNhbGwoXzE5NyxhcnJbaV0saSxhcnIpOworaWYoXzE5NCYmIV8xOWEpeworcmV0dXJuIGZhbHNlOworfWVsc2V7CitpZigoIV8xOTQpJiYoXzE5YSkpeworcmV0dXJuIHRydWU7Cit9Cit9Cit9CityZXR1cm4gQm9vbGVhbihfMTk0KTsKK30KK30sZXZlcnk6ZnVuY3Rpb24oYXJyLF8xOWMsXzE5ZCl7CityZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUodHJ1ZSxhcnIsXzE5YyxfMTlkKTsKK30sc29tZTpmdW5jdGlvbihhcnIsXzE5ZixfMWEwKXsKK3JldHVybiB0aGlzLl9ldmVyeU9yU29tZShmYWxzZSxhcnIsXzE5ZixfMWEwKTsKK30sZmlsdGVyOmZ1bmN0aW9uKGFycixfMWEyLF8xYTMpewordmFyIF8xYTQ9ZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CitpZihfMWE0KXsKK2Fycj1hcnIuc3BsaXQoIiIpOworfQordmFyIF8xYTU7CitpZihBcnJheS5maWx0ZXIpeworXzFhNT1BcnJheS5maWx0ZXIoYXJyLF8xYTIsXzFhMyk7Cit9ZWxzZXsKK2lmKCFfMWEzKXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg+PTMpeworZG9qby5yYWlzZSgidGhpc09iamVjdCBkb2Vzbid0IGV4aXN0ISIpOworfQorXzFhMz1kal9nbG9iYWw7Cit9CitfMWE1PVtdOworZm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoO2krKyl7CitpZihfMWEyLmNhbGwoXzFhMyxhcnJbaV0saSxhcnIpKXsKK18xYTUucHVzaChhcnJbaV0pOworfQorfQorfQoraWYoXzFhNCl7CityZXR1cm4gXzFhNS5qb2luKCIiKTsKK31lbHNleworcmV0dXJuIF8xYTU7Cit9Cit9LHVubmVzdDpmdW5jdGlvbigpewordmFyIG91dD1bXTsKK2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFyZ3VtZW50c1tpXSkpewordmFyIGFkZD1kb2pvLmxhbmcudW5uZXN0LmFwcGx5KHRoaXMsYXJndW1lbnRzW2ldKTsKK291dD1vdXQuY29uY2F0KGFkZCk7Cit9ZWxzZXsKK291dC5wdXNoKGFyZ3VtZW50c1tpXSk7Cit9Cit9CityZXR1cm4gb3V0OworfSx0b0FycmF5OmZ1bmN0aW9uKF8xYWEsXzFhYil7Cit2YXIgXzFhYz1bXTsKK2Zvcih2YXIgaT1fMWFifHwwO2k8XzFhYS5sZW5ndGg7aSsrKXsKK18xYWMucHVzaChfMWFhW2ldKTsKK30KK3JldHVybiBfMWFjOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuZnVuYyIpOworZG9qby5sYW5nLmhpdGNoPWZ1bmN0aW9uKF8xYWUsXzFhZil7Cit2YXIgYXJncz1bXTsKK2Zvcih2YXIgeD0yO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspeworYXJncy5wdXNoKGFyZ3VtZW50c1t4XSk7Cit9Cit2YXIgZmNuPShkb2pvLmxhbmcuaXNTdHJpbmcoXzFhZik/XzFhZVtfMWFmXTpfMWFmKXx8ZnVuY3Rpb24oKXsKK307CityZXR1cm4gZnVuY3Rpb24oKXsKK3ZhciB0YT1hcmdzLmNvbmNhdChbXSk7Citmb3IodmFyIHg9MDt4PGFyZ3VtZW50cy5sZW5ndGg7eCsrKXsKK3RhLnB1c2goYXJndW1lbnRzW3hdKTsKK30KK3JldHVybiBmY24uYXBwbHkoXzFhZSx0YSk7Cit9OworfTsKK2Rvam8ubGFuZy5hbm9uQ3RyPTA7Citkb2pvLmxhbmcuYW5vbj17fTsKK2Rvam8ubGFuZy5uYW1lQW5vbkZ1bmM9ZnVuY3Rpb24oXzFiNSxfMWI2LF8xYjcpewordmFyIG5zbz0oXzFiNnx8ZG9qby5sYW5nLmFub24pOworaWYoKF8xYjcpfHwoKGRqX2dsb2JhbFsiZGpDb25maWciXSkmJihkakNvbmZpZ1sic2xvd0Fub25GdW5jTG9va3VwcyJdPT10cnVlKSkpeworZm9yKHZhciB4IGluIG5zbyl7Cit0cnl7CitpZihuc29beF09PT1fMWI1KXsKK3JldHVybiB4OworfQorfQorY2F0Y2goZSl7Cit9Cit9Cit9Cit2YXIgcmV0PSJfXyIrZG9qby5sYW5nLmFub25DdHIrKzsKK3doaWxlKHR5cGVvZiBuc29bcmV0XSE9InVuZGVmaW5lZCIpeworcmV0PSJfXyIrZG9qby5sYW5nLmFub25DdHIrKzsKK30KK25zb1tyZXRdPV8xYjU7CityZXR1cm4gcmV0OworfTsKK2Rvam8ubGFuZy5mb3J3YXJkPWZ1bmN0aW9uKF8xYmIpeworcmV0dXJuIGZ1bmN0aW9uKCl7CityZXR1cm4gdGhpc1tfMWJiXS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9OworfTsKK2Rvam8ubGFuZy5jdXJyeT1mdW5jdGlvbihfMWJjLGZ1bmMpewordmFyIF8xYmU9W107CitfMWJjPV8xYmN8fGRqX2dsb2JhbDsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhmdW5jKSl7CitmdW5jPV8xYmNbZnVuY107Cit9Citmb3IodmFyIHg9Mjt4PGFyZ3VtZW50cy5sZW5ndGg7eCsrKXsKK18xYmUucHVzaChhcmd1bWVudHNbeF0pOworfQordmFyIF8xYzA9KGZ1bmNbIl9fcHJlSm9pbkFyaXR5Il18fGZ1bmMubGVuZ3RoKS1fMWJlLmxlbmd0aDsKK2Z1bmN0aW9uIGdhdGhlcihfMWMxLF8xYzIsXzFjMyl7Cit2YXIgXzFjND1fMWMzOwordmFyIF8xYzU9XzFjMi5zbGljZSgwKTsKK2Zvcih2YXIgeD0wO3g8XzFjMS5sZW5ndGg7eCsrKXsKK18xYzUucHVzaChfMWMxW3hdKTsKK30KK18xYzM9XzFjMy1fMWMxLmxlbmd0aDsKK2lmKF8xYzM8PTApewordmFyIHJlcz1mdW5jLmFwcGx5KF8xYmMsXzFjNSk7CitfMWMzPV8xYzQ7CityZXR1cm4gcmVzOworfWVsc2V7CityZXR1cm4gZnVuY3Rpb24oKXsKK3JldHVybiBnYXRoZXIoYXJndW1lbnRzLF8xYzUsXzFjMyk7Cit9OworfQorfQorcmV0dXJuIGdhdGhlcihbXSxfMWJlLF8xYzApOworfTsKK2Rvam8ubGFuZy5jdXJyeUFyZ3VtZW50cz1mdW5jdGlvbihfMWM4LGZ1bmMsYXJncyxfMWNiKXsKK3ZhciBfMWNjPVtdOwordmFyIHg9XzFjYnx8MDsKK2Zvcih4PV8xY2I7eDxhcmdzLmxlbmd0aDt4KyspeworXzFjYy5wdXNoKGFyZ3NbeF0pOworfQorcmV0dXJuIGRvam8ubGFuZy5jdXJyeS5hcHBseShkb2pvLmxhbmcsW18xYzgsZnVuY10uY29uY2F0KF8xY2MpKTsKK307Citkb2pvLmxhbmcudHJ5VGhlc2U9ZnVuY3Rpb24oKXsKK2Zvcih2YXIgeD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspewordHJ5eworaWYodHlwZW9mIGFyZ3VtZW50c1t4XT09ImZ1bmN0aW9uIil7Cit2YXIgcmV0PShhcmd1bWVudHNbeF0oKSk7CitpZihyZXQpeworcmV0dXJuIHJldDsKK30KK30KK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK30KK307Citkb2pvLmxhbmcuZGVsYXlUaGVzZT1mdW5jdGlvbihmYXJyLGNiLF8xZDIsXzFkMyl7CitpZighZmFyci5sZW5ndGgpeworaWYodHlwZW9mIF8xZDM9PSJmdW5jdGlvbiIpeworXzFkMygpOworfQorcmV0dXJuOworfQoraWYoKHR5cGVvZiBfMWQyPT0idW5kZWZpbmVkIikmJih0eXBlb2YgY2I9PSJudW1iZXIiKSl7CitfMWQyPWNiOworY2I9ZnVuY3Rpb24oKXsKK307Cit9ZWxzZXsKK2lmKCFjYil7CitjYj1mdW5jdGlvbigpeworfTsKK2lmKCFfMWQyKXsKK18xZDI9MDsKK30KK30KK30KK3NldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyhmYXJyLnNoaWZ0KCkpKCk7CitjYigpOworZG9qby5sYW5nLmRlbGF5VGhlc2UoZmFycixjYixfMWQyLF8xZDMpOworfSxfMWQyKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nLmV4dHJhcyIpOworZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcz1mdW5jdGlvbihfMWQ0LGhhc2gpewordmFyIG1hcD0odHlwZW9mIGhhc2g9PSJvYmplY3QiKT9oYXNoOmRvam8ubGFuZy50b0FycmF5KGFyZ3VtZW50cywxKTsKK3JldHVybiBfMWQ0LnJlcGxhY2UoL1wlXHsoXHcrKVx9L2csZnVuY3Rpb24oXzFkNyxrZXkpeworaWYodHlwZW9mIChtYXBba2V5XSkhPSJ1bmRlZmluZWQiJiZtYXBba2V5XSE9bnVsbCl7CityZXR1cm4gbWFwW2tleV07Cit9Citkb2pvLnJhaXNlKCJTdWJzdGl0dXRpb24gbm90IGZvdW5kOiAiK2tleSk7Cit9KTsKK307Citkb2pvLnN0cmluZy5jYXBpdGFsaXplPWZ1bmN0aW9uKHN0cil7CitpZighZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpeworcmV0dXJuICIiOworfQoraWYoYXJndW1lbnRzLmxlbmd0aD09MCl7CitzdHI9dGhpczsKK30KK3ZhciBfMWRhPXN0ci5zcGxpdCgiICIpOworZm9yKHZhciBpPTA7aTxfMWRhLmxlbmd0aDtpKyspeworXzFkYVtpXT1fMWRhW2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK18xZGFbaV0uc3Vic3RyaW5nKDEpOworfQorcmV0dXJuIF8xZGEuam9pbigiICIpOworfTsKK2Rvam8uc3RyaW5nLmlzQmxhbms9ZnVuY3Rpb24oc3RyKXsKK2lmKCFkb2pvLmxhbmcuaXNTdHJpbmcoc3RyKSl7CityZXR1cm4gdHJ1ZTsKK30KK3JldHVybiAoZG9qby5zdHJpbmcudHJpbShzdHIpLmxlbmd0aD09MCk7Cit9OworZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk9ZnVuY3Rpb24oc3RyKXsKK2lmKCFkb2pvLmxhbmcuaXNTdHJpbmcoc3RyKSl7CityZXR1cm4gc3RyOworfQordmFyIHJldD0iIjsKK3ZhciBfMWRmPWVzY2FwZShzdHIpOwordmFyIF8xZTAscmU9LyV1KFswLTlBLUZdezR9KS9pOword2hpbGUoKF8xZTA9XzFkZi5tYXRjaChyZSkpKXsKK3ZhciBudW09TnVtYmVyKCIweCIrXzFlMFsxXSk7Cit2YXIgXzFlMz1lc2NhcGUoIiYjIitudW0rIjsiKTsKK3JldCs9XzFkZi5zdWJzdHJpbmcoMCxfMWUwLmluZGV4KStfMWUzOworXzFkZj1fMWRmLnN1YnN0cmluZyhfMWUwLmluZGV4K18xZTBbMF0ubGVuZ3RoKTsKK30KK3JldCs9XzFkZi5yZXBsYWNlKC9cKy9nLCIlMkIiKTsKK3JldHVybiByZXQ7Cit9OworZG9qby5zdHJpbmcuZXNjYXBlPWZ1bmN0aW9uKHR5cGUsc3RyKXsKK3ZhciBhcmdzPWRvam8ubGFuZy50b0FycmF5KGFyZ3VtZW50cywxKTsKK3N3aXRjaCh0eXBlLnRvTG93ZXJDYXNlKCkpeworY2FzZSAieG1sIjoKK2Nhc2UgImh0bWwiOgorY2FzZSAieGh0bWwiOgorcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVhtbC5hcHBseSh0aGlzLGFyZ3MpOworY2FzZSAic3FsIjoKK3JldHVybiBkb2pvLnN0cmluZy5lc2NhcGVTcWwuYXBwbHkodGhpcyxhcmdzKTsKK2Nhc2UgInJlZ2V4cCI6CitjYXNlICJyZWdleCI6CityZXR1cm4gZG9qby5zdHJpbmcuZXNjYXBlUmVnRXhwLmFwcGx5KHRoaXMsYXJncyk7CitjYXNlICJqYXZhc2NyaXB0IjoKK2Nhc2UgImpzY3JpcHQiOgorY2FzZSAianMiOgorcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZUphdmFTY3JpcHQuYXBwbHkodGhpcyxhcmdzKTsKK2Nhc2UgImFzY2lpIjoKK3JldHVybiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaS5hcHBseSh0aGlzLGFyZ3MpOworZGVmYXVsdDoKK3JldHVybiBzdHI7Cit9Cit9OworZG9qby5zdHJpbmcuZXNjYXBlWG1sPWZ1bmN0aW9uKHN0cixfMWU4KXsKK3N0cj1zdHIucmVwbGFjZSgvJi9nbSwiJmFtcDsiKS5yZXBsYWNlKC88L2dtLCImbHQ7IikucmVwbGFjZSgvPi9nbSwiJmd0OyIpLnJlcGxhY2UoLyIvZ20sIiZxdW90OyIpOworaWYoIV8xZTgpeworc3RyPXN0ci5yZXBsYWNlKC8nL2dtLCImIzM5OyIpOworfQorcmV0dXJuIHN0cjsKK307Citkb2pvLnN0cmluZy5lc2NhcGVTcWw9ZnVuY3Rpb24oc3RyKXsKK3JldHVybiBzdHIucmVwbGFjZSgvJy9nbSwiJyciKTsKK307Citkb2pvLnN0cmluZy5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24oc3RyKXsKK3JldHVybiBzdHIucmVwbGFjZSgvXFwvZ20sIlxcXFwiKS5yZXBsYWNlKC8oW1xmXGJcblx0XHJbXF4kfD8qKygpe31dKS9nbSwiXFwkMSIpOworfTsKK2Rvam8uc3RyaW5nLmVzY2FwZUphdmFTY3JpcHQ9ZnVuY3Rpb24oc3RyKXsKK3JldHVybiBzdHIucmVwbGFjZSgvKFsiJ1xmXGJcblx0XHJdKS9nbSwiXFwkMSIpOworfTsKK2Rvam8uc3RyaW5nLmVzY2FwZVN0cmluZz1mdW5jdGlvbihzdHIpeworcmV0dXJuICgiXCIiK3N0ci5yZXBsYWNlKC8oWyJcXF0pL2csIlxcJDEiKSsiXCIiKS5yZXBsYWNlKC9bXGZdL2csIlxcZiIpLnJlcGxhY2UoL1tcYl0vZywiXFxiIikucmVwbGFjZSgvW1xuXS9nLCJcXG4iKS5yZXBsYWNlKC9bXHRdL2csIlxcdCIpLnJlcGxhY2UoL1tccl0vZywiXFxyIik7Cit9OworZG9qby5zdHJpbmcuc3VtbWFyeT1mdW5jdGlvbihzdHIsbGVuKXsKK2lmKCFsZW58fHN0ci5sZW5ndGg8PWxlbil7CityZXR1cm4gc3RyOworfQorcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCxsZW4pLnJlcGxhY2UoL1wuKyQvLCIiKSsiLi4uIjsKK307Citkb2pvLnN0cmluZy5lbmRzV2l0aD1mdW5jdGlvbihzdHIsZW5kLF8xZjEpeworaWYoXzFmMSl7CitzdHI9c3RyLnRvTG93ZXJDYXNlKCk7CitlbmQ9ZW5kLnRvTG93ZXJDYXNlKCk7Cit9CitpZigoc3RyLmxlbmd0aC1lbmQubGVuZ3RoKTwwKXsKK3JldHVybiBmYWxzZTsKK30KK3JldHVybiBzdHIubGFzdEluZGV4T2YoZW5kKT09c3RyLmxlbmd0aC1lbmQubGVuZ3RoOworfTsKK2Rvam8uc3RyaW5nLmVuZHNXaXRoQW55PWZ1bmN0aW9uKHN0cil7Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2lmKGRvam8uc3RyaW5nLmVuZHNXaXRoKHN0cixhcmd1bWVudHNbaV0pKXsKK3JldHVybiB0cnVlOworfQorfQorcmV0dXJuIGZhbHNlOworfTsKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGg9ZnVuY3Rpb24oc3RyLF8xZjUsXzFmNil7CitpZihfMWY2KXsKK3N0cj1zdHIudG9Mb3dlckNhc2UoKTsKK18xZjU9XzFmNS50b0xvd2VyQ2FzZSgpOworfQorcmV0dXJuIHN0ci5pbmRleE9mKF8xZjUpPT0wOworfTsKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGhBbnk9ZnVuY3Rpb24oc3RyKXsKK2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworaWYoZG9qby5zdHJpbmcuc3RhcnRzV2l0aChzdHIsYXJndW1lbnRzW2ldKSl7CityZXR1cm4gdHJ1ZTsKK30KK30KK3JldHVybiBmYWxzZTsKK307Citkb2pvLnN0cmluZy5oYXM9ZnVuY3Rpb24oc3RyKXsKK2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworaWYoc3RyLmluZGV4T2YoYXJndW1lbnRzW2ldKT4tMSl7CityZXR1cm4gdHJ1ZTsKK30KK30KK3JldHVybiBmYWxzZTsKK307Citkb2pvLnN0cmluZy5ub3JtYWxpemVOZXdsaW5lcz1mdW5jdGlvbih0ZXh0LF8xZmMpeworaWYoXzFmYz09IlxuIil7Cit0ZXh0PXRleHQucmVwbGFjZSgvXHJcbi9nLCJcbiIpOwordGV4dD10ZXh0LnJlcGxhY2UoL1xyL2csIlxuIik7Cit9ZWxzZXsKK2lmKF8xZmM9PSJcciIpewordGV4dD10ZXh0LnJlcGxhY2UoL1xyXG4vZywiXHIiKTsKK3RleHQ9dGV4dC5yZXBsYWNlKC9cbi9nLCJcciIpOworfWVsc2V7Cit0ZXh0PXRleHQucmVwbGFjZSgvKFteXHJdKVxuL2csIiQxXHJcbiIpLnJlcGxhY2UoL1xyKFteXG5dKS9nLCJcclxuJDEiKTsKK30KK30KK3JldHVybiB0ZXh0OworfTsKK2Rvam8uc3RyaW5nLnNwbGl0RXNjYXBlZD1mdW5jdGlvbihzdHIsXzFmZSl7Cit2YXIgXzFmZj1bXTsKK2Zvcih2YXIgaT0wLF8yMDE9MDtpPHN0ci5sZW5ndGg7aSsrKXsKK2lmKHN0ci5jaGFyQXQoaSk9PSJcXCIpeworaSsrOworY29udGludWU7Cit9CitpZihzdHIuY2hhckF0KGkpPT1fMWZlKXsKK18xZmYucHVzaChzdHIuc3Vic3RyaW5nKF8yMDEsaSkpOworXzIwMT1pKzE7Cit9Cit9CitfMWZmLnB1c2goc3RyLnN1YnN0cihfMjAxKSk7CityZXR1cm4gXzFmZjsKK307Citkb2pvLnByb3ZpZGUoImRvam8uZG9tIik7Citkb2pvLmRvbS5FTEVNRU5UX05PREU9MTsKK2Rvam8uZG9tLkFUVFJJQlVURV9OT0RFPTI7Citkb2pvLmRvbS5URVhUX05PREU9MzsKK2Rvam8uZG9tLkNEQVRBX1NFQ1RJT05fTk9ERT00OworZG9qby5kb20uRU5USVRZX1JFRkVSRU5DRV9OT0RFPTU7Citkb2pvLmRvbS5FTlRJVFlfTk9ERT02OworZG9qby5kb20uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFPTc7Citkb2pvLmRvbS5DT01NRU5UX05PREU9ODsKK2Rvam8uZG9tLkRPQ1VNRU5UX05PREU9OTsKK2Rvam8uZG9tLkRPQ1VNRU5UX1RZUEVfTk9ERT0xMDsKK2Rvam8uZG9tLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU9MTE7Citkb2pvLmRvbS5OT1RBVElPTl9OT0RFPTEyOworZG9qby5kb20uZG9qb21sPSJodHRwOi8vd3d3LmRvam90b29sa2l0Lm9yZy8yMDA0L2Rvam9tbCI7Citkb2pvLmRvbS54bWxucz17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsc21pbDoiaHR0cDovL3d3dy53My5vcmcvMjAwMS9TTUlMMjAvIixtbWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLGNtbDoiaHR0cDovL3d3dy54bWwtY21sLm9yZyIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4dWw6Imh0dHA6Ly93d3cubW96aWxsYS5vcmcva2V5bWFzdGVyL2dhdGVrZWVwZXIvdGhlcmUuaXMub25seS54dWwiLHhibDoiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy94YmwiLGZvOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiLHhzbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIix4c2x0OiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLHhpOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIix4Zm9ybXM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDIvMDEveGZvcm1zIixzYXhvbjoiaHR0cDovL2ljbC5jb20vc2F4b24iLHhhbGFuOiJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIseHNkOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsZHQ6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIseHNpOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIscmRmOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIixyZGZzOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIixkYzoiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLGRjcToiaHR0cDovL3B1cmwub3JnL2RjL3F1YWxpZmllcnMvMS4wIiwic29hcC1lbnYiOiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsd3NkbDoiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLEFkb2JlRXh0ZW5zaW9uczoiaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZVNWR1ZpZXdlckV4dGVuc2lvbnMvMy4wLyJ9OworZG9qby5kb20uaXNOb2RlPWZ1bmN0aW9uKHdoKXsKK2lmKHR5cGVvZiBFbGVtZW50PT0iZnVuY3Rpb24iKXsKK3RyeXsKK3JldHVybiB3aCBpbnN0YW5jZW9mIEVsZW1lbnQ7Cit9CitjYXRjaChlKXsKK30KK31lbHNleworcmV0dXJuIHdoJiYhaXNOYU4od2gubm9kZVR5cGUpOworfQorfTsKK2Rvam8uZG9tLmdldFVuaXF1ZUlkPWZ1bmN0aW9uKCl7Cit2YXIgXzIwMz1kb2pvLmRvYygpOworZG97Cit2YXIgaWQ9ImRqX3VuaXF1ZV8iKygrK2FyZ3VtZW50cy5jYWxsZWUuX2lkSW5jcmVtZW50KTsKK313aGlsZShfMjAzLmdldEVsZW1lbnRCeUlkKGlkKSk7CityZXR1cm4gaWQ7Cit9OworZG9qby5kb20uZ2V0VW5pcXVlSWQuX2lkSW5jcmVtZW50PTA7Citkb2pvLmRvbS5maXJzdEVsZW1lbnQ9ZG9qby5kb20uZ2V0Rmlyc3RDaGlsZEVsZW1lbnQ9ZnVuY3Rpb24oXzIwNSxfMjA2KXsKK3ZhciBub2RlPV8yMDUuZmlyc3RDaGlsZDsKK3doaWxlKG5vZGUmJm5vZGUubm9kZVR5cGUhPWRvam8uZG9tLkVMRU1FTlRfTk9ERSl7Citub2RlPW5vZGUubmV4dFNpYmxpbmc7Cit9CitpZihfMjA2JiZub2RlJiZub2RlLnRhZ05hbWUmJm5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIT1fMjA2LnRvTG93ZXJDYXNlKCkpeworbm9kZT1kb2pvLmRvbS5uZXh0RWxlbWVudChub2RlLF8yMDYpOworfQorcmV0dXJuIG5vZGU7Cit9OworZG9qby5kb20ubGFzdEVsZW1lbnQ9ZG9qby5kb20uZ2V0TGFzdENoaWxkRWxlbWVudD1mdW5jdGlvbihfMjA4LF8yMDkpewordmFyIG5vZGU9XzIwOC5sYXN0Q2hpbGQ7Cit3aGlsZShub2RlJiZub2RlLm5vZGVUeXBlIT1kb2pvLmRvbS5FTEVNRU5UX05PREUpeworbm9kZT1ub2RlLnByZXZpb3VzU2libGluZzsKK30KK2lmKF8yMDkmJm5vZGUmJm5vZGUudGFnTmFtZSYmbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPV8yMDkudG9Mb3dlckNhc2UoKSl7Citub2RlPWRvam8uZG9tLnByZXZFbGVtZW50KG5vZGUsXzIwOSk7Cit9CityZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5uZXh0RWxlbWVudD1kb2pvLmRvbS5nZXROZXh0U2libGluZ0VsZW1lbnQ9ZnVuY3Rpb24obm9kZSxfMjBjKXsKK2lmKCFub2RlKXsKK3JldHVybiBudWxsOworfQorZG97Citub2RlPW5vZGUubmV4dFNpYmxpbmc7Cit9d2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9ZG9qby5kb20uRUxFTUVOVF9OT0RFKTsKK2lmKG5vZGUmJl8yMGMmJl8yMGMudG9Mb3dlckNhc2UoKSE9bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpeworcmV0dXJuIGRvam8uZG9tLm5leHRFbGVtZW50KG5vZGUsXzIwYyk7Cit9CityZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5wcmV2RWxlbWVudD1kb2pvLmRvbS5nZXRQcmV2aW91c1NpYmxpbmdFbGVtZW50PWZ1bmN0aW9uKG5vZGUsXzIwZSl7CitpZighbm9kZSl7CityZXR1cm4gbnVsbDsKK30KK2lmKF8yMGUpeworXzIwZT1fMjBlLnRvTG93ZXJDYXNlKCk7Cit9Citkb3sKK25vZGU9bm9kZS5wcmV2aW91c1NpYmxpbmc7Cit9d2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9ZG9qby5kb20uRUxFTUVOVF9OT0RFKTsKK2lmKG5vZGUmJl8yMGUmJl8yMGUudG9Mb3dlckNhc2UoKSE9bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpeworcmV0dXJuIGRvam8uZG9tLnByZXZFbGVtZW50KG5vZGUsXzIwZSk7Cit9CityZXR1cm4gbm9kZTsKK307Citkb2pvLmRvbS5tb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oXzIwZixfMjEwLHRyaW0pewordmFyIF8yMTI9MDsKK2lmKHRyaW0peword2hpbGUoXzIwZi5oYXNDaGlsZE5vZGVzKCkmJl8yMGYuZmlyc3RDaGlsZC5ub2RlVHlwZT09ZG9qby5kb20uVEVYVF9OT0RFKXsKK18yMGYucmVtb3ZlQ2hpbGQoXzIwZi5maXJzdENoaWxkKTsKK30KK3doaWxlKF8yMGYuaGFzQ2hpbGROb2RlcygpJiZfMjBmLmxhc3RDaGlsZC5ub2RlVHlwZT09ZG9qby5kb20uVEVYVF9OT0RFKXsKK18yMGYucmVtb3ZlQ2hpbGQoXzIwZi5sYXN0Q2hpbGQpOworfQorfQord2hpbGUoXzIwZi5oYXNDaGlsZE5vZGVzKCkpeworXzIxMC5hcHBlbmRDaGlsZChfMjBmLmZpcnN0Q2hpbGQpOworXzIxMisrOworfQorcmV0dXJuIF8yMTI7Cit9OworZG9qby5kb20uY29weUNoaWxkcmVuPWZ1bmN0aW9uKF8yMTMsXzIxNCx0cmltKXsKK3ZhciBfMjE2PV8yMTMuY2xvbmVOb2RlKHRydWUpOworcmV0dXJuIHRoaXMubW92ZUNoaWxkcmVuKF8yMTYsXzIxNCx0cmltKTsKK307Citkb2pvLmRvbS5yZXBsYWNlQ2hpbGRyZW49ZnVuY3Rpb24obm9kZSxfMjE4KXsKK3ZhciBfMjE5PVtdOworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Citmb3IodmFyIGk9MDtpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXsKK18yMTkucHVzaChub2RlLmNoaWxkTm9kZXNbaV0pOworfQorfQorZG9qby5kb20ucmVtb3ZlQ2hpbGRyZW4obm9kZSk7Citub2RlLmFwcGVuZENoaWxkKF8yMTgpOworZm9yKHZhciBpPTA7aTxfMjE5Lmxlbmd0aDtpKyspeworZG9qby5kb20uZGVzdHJveU5vZGUoXzIxOVtpXSk7Cit9Cit9OworZG9qby5kb20ucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24obm9kZSl7Cit2YXIgXzIxYz1ub2RlLmNoaWxkTm9kZXMubGVuZ3RoOword2hpbGUobm9kZS5oYXNDaGlsZE5vZGVzKCkpeworZG9qby5kb20ucmVtb3ZlTm9kZShub2RlLmZpcnN0Q2hpbGQpOworfQorcmV0dXJuIF8yMWM7Cit9OworZG9qby5kb20ucmVwbGFjZU5vZGU9ZnVuY3Rpb24obm9kZSxfMjFlKXsKK3JldHVybiBub2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKF8yMWUsbm9kZSk7Cit9OworZG9qby5kb20uZGVzdHJveU5vZGU9ZnVuY3Rpb24obm9kZSl7CitpZihub2RlLnBhcmVudE5vZGUpeworbm9kZT1kb2pvLmRvbS5yZW1vdmVOb2RlKG5vZGUpOworfQoraWYobm9kZS5ub2RlVHlwZSE9Myl7CitpZihkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4iLGZhbHNlKSl7Citkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4obm9kZSk7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK25vZGUub3V0ZXJIVE1MPSIiOworfQorfQorfTsKK2Rvam8uZG9tLnJlbW92ZU5vZGU9ZnVuY3Rpb24obm9kZSl7CitpZihub2RlJiZub2RlLnBhcmVudE5vZGUpeworcmV0dXJuIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKK30KK307Citkb2pvLmRvbS5nZXRBbmNlc3RvcnM9ZnVuY3Rpb24obm9kZSxfMjIyLF8yMjMpewordmFyIF8yMjQ9W107Cit2YXIgXzIyNT0oXzIyMiYmKF8yMjIgaW5zdGFuY2VvZiBGdW5jdGlvbnx8dHlwZW9mIF8yMjI9PSJmdW5jdGlvbiIpKTsKK3doaWxlKG5vZGUpeworaWYoIV8yMjV8fF8yMjIobm9kZSkpeworXzIyNC5wdXNoKG5vZGUpOworfQoraWYoXzIyMyYmXzIyNC5sZW5ndGg+MCl7CityZXR1cm4gXzIyNFswXTsKK30KK25vZGU9bm9kZS5wYXJlbnROb2RlOworfQoraWYoXzIyMyl7CityZXR1cm4gbnVsbDsKK30KK3JldHVybiBfMjI0OworfTsKK2Rvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnPWZ1bmN0aW9uKG5vZGUsdGFnLF8yMjgpewordGFnPXRhZy50b0xvd2VyQ2FzZSgpOworcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9ycyhub2RlLGZ1bmN0aW9uKGVsKXsKK3JldHVybiAoKGVsLnRhZ05hbWUpJiYoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT10YWcpKTsKK30sXzIyOCk7Cit9OworZG9qby5kb20uZ2V0Rmlyc3RBbmNlc3RvckJ5VGFnPWZ1bmN0aW9uKG5vZGUsdGFnKXsKK3JldHVybiBkb2pvLmRvbS5nZXRBbmNlc3RvcnNCeVRhZyhub2RlLHRhZyx0cnVlKTsKK307Citkb2pvLmRvbS5pc0Rlc2NlbmRhbnRPZj1mdW5jdGlvbihub2RlLF8yMmQsXzIyZSl7CitpZihfMjJlJiZub2RlKXsKK25vZGU9bm9kZS5wYXJlbnROb2RlOworfQord2hpbGUobm9kZSl7CitpZihub2RlPT1fMjJkKXsKK3JldHVybiB0cnVlOworfQorbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9CityZXR1cm4gZmFsc2U7Cit9OworZG9qby5kb20uaW5uZXJYTUw9ZnVuY3Rpb24obm9kZSl7CitpZihub2RlLmlubmVyWE1MKXsKK3JldHVybiBub2RlLmlubmVyWE1MOworfWVsc2V7CitpZihub2RlLnhtbCl7CityZXR1cm4gbm9kZS54bWw7Cit9ZWxzZXsKK2lmKHR5cGVvZiBYTUxTZXJpYWxpemVyIT0idW5kZWZpbmVkIil7CityZXR1cm4gKG5ldyBYTUxTZXJpYWxpemVyKCkpLnNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUpOworfQorfQorfQorfTsKK2Rvam8uZG9tLmNyZWF0ZURvY3VtZW50PWZ1bmN0aW9uKCl7Cit2YXIgZG9jPW51bGw7Cit2YXIgXzIzMT1kb2pvLmRvYygpOworaWYoIWRqX3VuZGVmKCJBY3RpdmVYT2JqZWN0IikpewordmFyIF8yMzI9WyJNU1hNTDIiLCJNaWNyb3NvZnQiLCJNU1hNTCIsIk1TWE1MMyJdOworZm9yKHZhciBpPTA7aTxfMjMyLmxlbmd0aDtpKyspewordHJ5eworZG9jPW5ldyBBY3RpdmVYT2JqZWN0KF8yMzJbaV0rIi5YTUxET00iKTsKK30KK2NhdGNoKGUpeworfQoraWYoZG9jKXsKK2JyZWFrOworfQorfQorfWVsc2V7CitpZigoXzIzMS5pbXBsZW1lbnRhdGlvbikmJihfMjMxLmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KSl7Citkb2M9XzIzMS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwiIixudWxsKTsKK30KK30KK3JldHVybiBkb2M7Cit9OworZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dD1mdW5jdGlvbihzdHIsXzIzNSl7CitpZighXzIzNSl7CitfMjM1PSJ0ZXh0L3htbCI7Cit9CitpZighZGpfdW5kZWYoIkRPTVBhcnNlciIpKXsKK3ZhciBfMjM2PW5ldyBET01QYXJzZXIoKTsKK3JldHVybiBfMjM2LnBhcnNlRnJvbVN0cmluZyhzdHIsXzIzNSk7Cit9ZWxzZXsKK2lmKCFkal91bmRlZigiQWN0aXZlWE9iamVjdCIpKXsKK3ZhciBfMjM3PWRvam8uZG9tLmNyZWF0ZURvY3VtZW50KCk7CitpZihfMjM3KXsKK18yMzcuYXN5bmM9ZmFsc2U7CitfMjM3LmxvYWRYTUwoc3RyKTsKK3JldHVybiBfMjM3OworfWVsc2V7Citkb2pvLmRlYnVnKCJ0b1htbCBkaWRuJ3Qgd29yaz8iKTsKK30KK31lbHNlewordmFyIF8yMzg9ZG9qby5kb2MoKTsKK2lmKF8yMzguY3JlYXRlRWxlbWVudCl7Cit2YXIgdG1wPV8yMzguY3JlYXRlRWxlbWVudCgieG1sIik7Cit0bXAuaW5uZXJIVE1MPXN0cjsKK2lmKF8yMzguaW1wbGVtZW50YXRpb24mJl8yMzguaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpewordmFyIF8yM2E9XzIzOC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiZm9vIiwiIixudWxsKTsKK2Zvcih2YXIgaT0wO2k8dG1wLmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7CitfMjNhLmltcG9ydE5vZGUodG1wLmNoaWxkTm9kZXMuaXRlbShpKSx0cnVlKTsKK30KK3JldHVybiBfMjNhOworfQorcmV0dXJuICgodG1wLmRvY3VtZW50KSYmKHRtcC5kb2N1bWVudC5maXJzdENoaWxkP3RtcC5kb2N1bWVudC5maXJzdENoaWxkOnRtcCkpOworfQorfQorfQorcmV0dXJuIG51bGw7Cit9OworZG9qby5kb20ucHJlcGVuZENoaWxkPWZ1bmN0aW9uKG5vZGUsXzIzZCl7CitpZihfMjNkLmZpcnN0Q2hpbGQpeworXzIzZC5pbnNlcnRCZWZvcmUobm9kZSxfMjNkLmZpcnN0Q2hpbGQpOworfWVsc2V7CitfMjNkLmFwcGVuZENoaWxkKG5vZGUpOworfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5kb20uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKG5vZGUscmVmLF8yNDApeworaWYoKF8yNDAhPXRydWUpJiYobm9kZT09PXJlZnx8bm9kZS5uZXh0U2libGluZz09PXJlZikpeworcmV0dXJuIGZhbHNlOworfQordmFyIF8yNDE9cmVmLnBhcmVudE5vZGU7CitfMjQxLmluc2VydEJlZm9yZShub2RlLHJlZik7CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmRvbS5pbnNlcnRBZnRlcj1mdW5jdGlvbihub2RlLHJlZixfMjQ0KXsKK3ZhciBwbj1yZWYucGFyZW50Tm9kZTsKK2lmKHJlZj09cG4ubGFzdENoaWxkKXsKK2lmKChfMjQ0IT10cnVlKSYmKG5vZGU9PT1yZWYpKXsKK3JldHVybiBmYWxzZTsKK30KK3BuLmFwcGVuZENoaWxkKG5vZGUpOworfWVsc2V7CityZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobm9kZSxyZWYubmV4dFNpYmxpbmcsXzI0NCk7Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmRvbS5pbnNlcnRBdFBvc2l0aW9uPWZ1bmN0aW9uKG5vZGUscmVmLF8yNDgpeworaWYoKCFub2RlKXx8KCFyZWYpfHwoIV8yNDgpKXsKK3JldHVybiBmYWxzZTsKK30KK3N3aXRjaChfMjQ4LnRvTG93ZXJDYXNlKCkpeworY2FzZSAiYmVmb3JlIjoKK3JldHVybiBkb2pvLmRvbS5pbnNlcnRCZWZvcmUobm9kZSxyZWYpOworY2FzZSAiYWZ0ZXIiOgorcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUscmVmKTsKK2Nhc2UgImZpcnN0IjoKK2lmKHJlZi5maXJzdENoaWxkKXsKK3JldHVybiBkb2pvLmRvbS5pbnNlcnRCZWZvcmUobm9kZSxyZWYuZmlyc3RDaGlsZCk7Cit9ZWxzZXsKK3JlZi5hcHBlbmRDaGlsZChub2RlKTsKK3JldHVybiB0cnVlOworfQorYnJlYWs7CitkZWZhdWx0OgorcmVmLmFwcGVuZENoaWxkKG5vZGUpOworcmV0dXJuIHRydWU7Cit9Cit9OworZG9qby5kb20uaW5zZXJ0QXRJbmRleD1mdW5jdGlvbihub2RlLF8yNGEsXzI0Yil7Cit2YXIgXzI0Yz1fMjRhLmNoaWxkTm9kZXM7CitpZighXzI0Yy5sZW5ndGh8fF8yNGMubGVuZ3RoPT1fMjRiKXsKK18yNGEuYXBwZW5kQ2hpbGQobm9kZSk7CityZXR1cm4gdHJ1ZTsKK30KK2lmKF8yNGI9PTApeworcmV0dXJuIGRvam8uZG9tLnByZXBlbmRDaGlsZChub2RlLF8yNGEpOworfQorcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUsXzI0Y1tfMjRiLTFdKTsKK307Citkb2pvLmRvbS50ZXh0Q29udGVudD1mdW5jdGlvbihub2RlLHRleHQpeworaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsKK3ZhciBfMjRmPWRvam8uZG9jKCk7Citkb2pvLmRvbS5yZXBsYWNlQ2hpbGRyZW4obm9kZSxfMjRmLmNyZWF0ZVRleHROb2RlKHRleHQpKTsKK3JldHVybiB0ZXh0OworfWVsc2V7CitpZihub2RlLnRleHRDb250ZW50IT11bmRlZmluZWQpeworcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ7Cit9Cit2YXIgXzI1MD0iIjsKK2lmKG5vZGU9PW51bGwpeworcmV0dXJuIF8yNTA7Cit9Citmb3IodmFyIGk9MDtpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXsKK3N3aXRjaChub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVR5cGUpeworY2FzZSAxOgorY2FzZSA1OgorXzI1MCs9ZG9qby5kb20udGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKK2JyZWFrOworY2FzZSAzOgorY2FzZSAyOgorY2FzZSA0OgorXzI1MCs9bm9kZS5jaGlsZE5vZGVzW2ldLm5vZGVWYWx1ZTsKK2JyZWFrOworZGVmYXVsdDoKK2JyZWFrOworfQorfQorcmV0dXJuIF8yNTA7Cit9Cit9OworZG9qby5kb20uaGFzUGFyZW50PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIEJvb2xlYW4obm9kZSYmbm9kZS5wYXJlbnROb2RlJiZkb2pvLmRvbS5pc05vZGUobm9kZS5wYXJlbnROb2RlKSk7Cit9OworZG9qby5kb20uaXNUYWc9ZnVuY3Rpb24obm9kZSl7CitpZihub2RlJiZub2RlLnRhZ05hbWUpeworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZihub2RlLnRhZ05hbWU9PVN0cmluZyhhcmd1bWVudHNbaV0pKXsKK3JldHVybiBTdHJpbmcoYXJndW1lbnRzW2ldKTsKK30KK30KK30KK3JldHVybiAiIjsKK307Citkb2pvLmRvbS5zZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbihlbGVtLF8yNTYsXzI1NyxfMjU4KXsKK2lmKGVsZW09PW51bGx8fCgoZWxlbT09dW5kZWZpbmVkKSYmKHR5cGVvZiBlbGVtPT0idW5kZWZpbmVkIikpKXsKK2Rvam8ucmFpc2UoIk5vIGVsZW1lbnQgZ2l2ZW4gdG8gZG9qby5kb20uc2V0QXR0cmlidXRlTlMiKTsKK30KK2lmKCEoKGVsZW0uc2V0QXR0cmlidXRlTlM9PXVuZGVmaW5lZCkmJih0eXBlb2YgZWxlbS5zZXRBdHRyaWJ1dGVOUz09InVuZGVmaW5lZCIpKSl7CitlbGVtLnNldEF0dHJpYnV0ZU5TKF8yNTYsXzI1NyxfMjU4KTsKK31lbHNlewordmFyIF8yNTk9ZWxlbS5vd25lckRvY3VtZW50OwordmFyIF8yNWE9XzI1OS5jcmVhdGVOb2RlKDIsXzI1NyxfMjU2KTsKK18yNWEubm9kZVZhbHVlPV8yNTg7CitlbGVtLnNldEF0dHJpYnV0ZU5vZGUoXzI1YSk7Cit9Cit9OworZG9qby5wcm92aWRlKCJkb2pvLnVuZG8uYnJvd3NlciIpOwordHJ5eworaWYoKCFkakNvbmZpZ1sicHJldmVudEJhY2tCdXR0b25GaXgiXSkmJighZG9qby5ob3N0ZW52LnBvc3RfbG9hZF8pKXsKK2RvY3VtZW50LndyaXRlKCI8aWZyYW1lIHN0eWxlPSdib3JkZXI6IDBweDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYm90dG9tOiAwcHg7IHJpZ2h0OiAwcHg7IHZpc2liaWxpdHk6IHZpc2libGU7JyBuYW1lPSdkamhpc3RvcnknIGlkPSdkamhpc3RvcnknIHNyYz0nIisoZGpDb25maWdbImRvam9JZnJhbWVIaXN0b3J5VXJsIl18fGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCkrImlmcmFtZV9oaXN0b3J5Lmh0bWwiKSsiJz48L2lmcmFtZT4iKTsKK30KK30KK2NhdGNoKGUpeworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7Citkb2pvLmRlYnVnKCJPcGVyYSBpcyBub3Qgc3VwcG9ydGVkIHdpdGggZG9qby51bmRvLmJyb3dzZXIsIHNvIGJhY2svZm9yd2FyZCBkZXRlY3Rpb24gd2lsbCBub3Qgd29yay4iKTsKK30KK2Rvam8udW5kby5icm93c2VyPXtpbml0aWFsSHJlZjooIWRqX3VuZGVmKCJ3aW5kb3ciKSk/d2luZG93LmxvY2F0aW9uLmhyZWY6IiIsaW5pdGlhbEhhc2g6KCFkal91bmRlZigid2luZG93IikpP3dpbmRvdy5sb2NhdGlvbi5oYXNoOiIiLG1vdmVGb3J3YXJkOmZhbHNlLGhpc3RvcnlTdGFjazpbXSxmb3J3YXJkU3RhY2s6W10saGlzdG9yeUlmcmFtZTpudWxsLGJvb2ttYXJrQW5jaG9yOm51bGwsbG9jYXRpb25UaW1lcjpudWxsLHNldEluaXRpYWxTdGF0ZTpmdW5jdGlvbihhcmdzKXsKK3RoaXMuaW5pdGlhbFN0YXRlPXRoaXMuX2NyZWF0ZVN0YXRlKHRoaXMuaW5pdGlhbEhyZWYsYXJncyx0aGlzLmluaXRpYWxIYXNoKTsKK30sYWRkVG9IaXN0b3J5OmZ1bmN0aW9uKGFyZ3MpewordGhpcy5mb3J3YXJkU3RhY2s9W107Cit2YXIgaGFzaD1udWxsOwordmFyIHVybD1udWxsOworaWYoIXRoaXMuaGlzdG9yeUlmcmFtZSl7CitpZihkakNvbmZpZ1sidXNlWERvbWFpbiJdJiYhZGpDb25maWdbImRvam9JZnJhbWVIaXN0b3J5VXJsIl0peworZG9qby5kZWJ1ZygiZG9qby51bmRvLmJyb3dzZXI6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIrIiBwbGVhc2Ugc2F2ZSBpZnJhbWVfaGlzdG9yeS5odG1sIHRvIHlvdXIgZG9tYWluIGFuZCBzZXQgZGpDb25maWcuZG9qb0lmcmFtZUhpc3RvcnlVcmwiKyIgdG8gdGhlIHBhdGggb24geW91ciBkb21haW4gdG8gaWZyYW1lX2hpc3RvcnkuaHRtbCIpOworfQordGhpcy5oaXN0b3J5SWZyYW1lPXdpbmRvdy5mcmFtZXNbImRqaGlzdG9yeSJdOworfQoraWYoIXRoaXMuYm9va21hcmtBbmNob3IpewordGhpcy5ib29rbWFya0FuY2hvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmJvb2ttYXJrQW5jaG9yKTsKK3RoaXMuYm9va21hcmtBbmNob3Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9CitpZihhcmdzWyJjaGFuZ2VVcmwiXSl7CitoYXNoPSIjIisoKGFyZ3NbImNoYW5nZVVybCJdIT09dHJ1ZSk/YXJnc1siY2hhbmdlVXJsIl06KG5ldyBEYXRlKCkpLmdldFRpbWUoKSk7CitpZih0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGg9PTAmJnRoaXMuaW5pdGlhbFN0YXRlLnVybEhhc2g9PWhhc2gpewordGhpcy5pbml0aWFsU3RhdGU9dGhpcy5fY3JlYXRlU3RhdGUodXJsLGFyZ3MsaGFzaCk7CityZXR1cm47Cit9ZWxzZXsKK2lmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aD4wJiZ0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGgtMV0udXJsSGFzaD09aGFzaCl7Cit0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGgtMV09dGhpcy5fY3JlYXRlU3RhdGUodXJsLGFyZ3MsaGFzaCk7CityZXR1cm47Cit9Cit9Cit0aGlzLmNoYW5naW5nVXJsPXRydWU7CitzZXRUaW1lb3V0KCJ3aW5kb3cubG9jYXRpb24uaHJlZiA9ICciK2hhc2grIic7IGRvam8udW5kby5icm93c2VyLmNoYW5naW5nVXJsID0gZmFsc2U7IiwxKTsKK3RoaXMuYm9va21hcmtBbmNob3IuaHJlZj1oYXNoOworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit1cmw9dGhpcy5fbG9hZElmcmFtZUhpc3RvcnkoKTsKK3ZhciBfMjVmPWFyZ3NbImJhY2siXXx8YXJnc1siYmFja0J1dHRvbiJdfHxhcmdzWyJoYW5kbGUiXTsKK3ZhciB0Y2I9ZnVuY3Rpb24oXzI2MSl7CitpZih3aW5kb3cubG9jYXRpb24uaGFzaCE9IiIpeworc2V0VGltZW91dCgid2luZG93LmxvY2F0aW9uLmhyZWYgPSAnIitoYXNoKyInOyIsMSk7Cit9CitfMjVmLmFwcGx5KHRoaXMsW18yNjFdKTsKK307CitpZihhcmdzWyJiYWNrIl0peworYXJncy5iYWNrPXRjYjsKK31lbHNleworaWYoYXJnc1siYmFja0J1dHRvbiJdKXsKK2FyZ3MuYmFja0J1dHRvbj10Y2I7Cit9ZWxzZXsKK2lmKGFyZ3NbImhhbmRsZSJdKXsKK2FyZ3MuaGFuZGxlPXRjYjsKK30KK30KK30KK3ZhciBfMjYyPWFyZ3NbImZvcndhcmQiXXx8YXJnc1siZm9yd2FyZEJ1dHRvbiJdfHxhcmdzWyJoYW5kbGUiXTsKK3ZhciB0Znc9ZnVuY3Rpb24oXzI2NCl7CitpZih3aW5kb3cubG9jYXRpb24uaGFzaCE9IiIpeword2luZG93LmxvY2F0aW9uLmhyZWY9aGFzaDsKK30KK2lmKF8yNjIpeworXzI2Mi5hcHBseSh0aGlzLFtfMjY0XSk7Cit9Cit9OworaWYoYXJnc1siZm9yd2FyZCJdKXsKK2FyZ3MuZm9yd2FyZD10Znc7Cit9ZWxzZXsKK2lmKGFyZ3NbImZvcndhcmRCdXR0b24iXSl7CithcmdzLmZvcndhcmRCdXR0b249dGZ3OworfWVsc2V7CitpZihhcmdzWyJoYW5kbGUiXSl7CithcmdzLmhhbmRsZT10Znc7Cit9Cit9Cit9Cit9ZWxzZXsKK2lmKGRvam8ucmVuZGVyLmh0bWwubW96KXsKK2lmKCF0aGlzLmxvY2F0aW9uVGltZXIpewordGhpcy5sb2NhdGlvblRpbWVyPXNldEludGVydmFsKCJkb2pvLnVuZG8uYnJvd3Nlci5jaGVja0xvY2F0aW9uKCk7IiwyMDApOworfQorfQorfQorfWVsc2V7Cit1cmw9dGhpcy5fbG9hZElmcmFtZUhpc3RvcnkoKTsKK30KK3RoaXMuaGlzdG9yeVN0YWNrLnB1c2godGhpcy5fY3JlYXRlU3RhdGUodXJsLGFyZ3MsaGFzaCkpOworfSxjaGVja0xvY2F0aW9uOmZ1bmN0aW9uKCl7CitpZighdGhpcy5jaGFuZ2luZ1VybCl7Cit2YXIgaHNsPXRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aDsKK2lmKCh3aW5kb3cubG9jYXRpb24uaGFzaD09dGhpcy5pbml0aWFsSGFzaHx8d2luZG93LmxvY2F0aW9uLmhyZWY9PXRoaXMuaW5pdGlhbEhyZWYpJiYoaHNsPT0xKSl7Cit0aGlzLmhhbmRsZUJhY2tCdXR0b24oKTsKK3JldHVybjsKK30KK2lmKHRoaXMuZm9yd2FyZFN0YWNrLmxlbmd0aD4wKXsKK2lmKHRoaXMuZm9yd2FyZFN0YWNrW3RoaXMuZm9yd2FyZFN0YWNrLmxlbmd0aC0xXS51cmxIYXNoPT13aW5kb3cubG9jYXRpb24uaGFzaCl7Cit0aGlzLmhhbmRsZUZvcndhcmRCdXR0b24oKTsKK3JldHVybjsKK30KK30KK2lmKChoc2w+PTIpJiYodGhpcy5oaXN0b3J5U3RhY2tbaHNsLTJdKSl7CitpZih0aGlzLmhpc3RvcnlTdGFja1toc2wtMl0udXJsSGFzaD09d2luZG93LmxvY2F0aW9uLmhhc2gpewordGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7CityZXR1cm47Cit9Cit9Cit9Cit9LGlmcmFtZUxvYWRlZDpmdW5jdGlvbihldnQsXzI2Nyl7CitpZighZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7Cit2YXIgXzI2OD10aGlzLl9nZXRVcmxRdWVyeShfMjY3LmhyZWYpOworaWYoXzI2OD09bnVsbCl7CitpZih0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGg9PTEpewordGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7Cit9CityZXR1cm47Cit9CitpZih0aGlzLm1vdmVGb3J3YXJkKXsKK3RoaXMubW92ZUZvcndhcmQ9ZmFsc2U7CityZXR1cm47Cit9CitpZih0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGg+PTImJl8yNjg9PXRoaXMuX2dldFVybFF1ZXJ5KHRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aC0yXS51cmwpKXsKK3RoaXMuaGFuZGxlQmFja0J1dHRvbigpOworfWVsc2V7CitpZih0aGlzLmZvcndhcmRTdGFjay5sZW5ndGg+MCYmXzI2OD09dGhpcy5fZ2V0VXJsUXVlcnkodGhpcy5mb3J3YXJkU3RhY2tbdGhpcy5mb3J3YXJkU3RhY2subGVuZ3RoLTFdLnVybCkpewordGhpcy5oYW5kbGVGb3J3YXJkQnV0dG9uKCk7Cit9Cit9Cit9Cit9LGhhbmRsZUJhY2tCdXR0b246ZnVuY3Rpb24oKXsKK3ZhciBfMjY5PXRoaXMuaGlzdG9yeVN0YWNrLnBvcCgpOworaWYoIV8yNjkpeworcmV0dXJuOworfQordmFyIGxhc3Q9dGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoLTFdOworaWYoIWxhc3QmJnRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aD09MCl7CitsYXN0PXRoaXMuaW5pdGlhbFN0YXRlOworfQoraWYobGFzdCl7CitpZihsYXN0Lmt3QXJnc1siYmFjayJdKXsKK2xhc3Qua3dBcmdzWyJiYWNrIl0oKTsKK31lbHNleworaWYobGFzdC5rd0FyZ3NbImJhY2tCdXR0b24iXSl7CitsYXN0Lmt3QXJnc1siYmFja0J1dHRvbiJdKCk7Cit9ZWxzZXsKK2lmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CitsYXN0Lmt3QXJncy5oYW5kbGUoImJhY2siKTsKK30KK30KK30KK30KK3RoaXMuZm9yd2FyZFN0YWNrLnB1c2goXzI2OSk7Cit9LGhhbmRsZUZvcndhcmRCdXR0b246ZnVuY3Rpb24oKXsKK3ZhciBsYXN0PXRoaXMuZm9yd2FyZFN0YWNrLnBvcCgpOworaWYoIWxhc3QpeworcmV0dXJuOworfQoraWYobGFzdC5rd0FyZ3NbImZvcndhcmQiXSl7CitsYXN0Lmt3QXJncy5mb3J3YXJkKCk7Cit9ZWxzZXsKK2lmKGxhc3Qua3dBcmdzWyJmb3J3YXJkQnV0dG9uIl0peworbGFzdC5rd0FyZ3MuZm9yd2FyZEJ1dHRvbigpOworfWVsc2V7CitpZihsYXN0Lmt3QXJnc1siaGFuZGxlIl0peworbGFzdC5rd0FyZ3MuaGFuZGxlKCJmb3J3YXJkIik7Cit9Cit9Cit9Cit0aGlzLmhpc3RvcnlTdGFjay5wdXNoKGxhc3QpOworfSxfY3JlYXRlU3RhdGU6ZnVuY3Rpb24odXJsLGFyZ3MsaGFzaCl7CityZXR1cm4geyJ1cmwiOnVybCwia3dBcmdzIjphcmdzLCJ1cmxIYXNoIjpoYXNofTsKK30sX2dldFVybFF1ZXJ5OmZ1bmN0aW9uKHVybCl7Cit2YXIgXzI3MD11cmwuc3BsaXQoIj8iKTsKK2lmKF8yNzAubGVuZ3RoPDIpeworcmV0dXJuIG51bGw7Cit9ZWxzZXsKK3JldHVybiBfMjcwWzFdOworfQorfSxfbG9hZElmcmFtZUhpc3Rvcnk6ZnVuY3Rpb24oKXsKK3ZhciB1cmw9KGRqQ29uZmlnWyJkb2pvSWZyYW1lSGlzdG9yeVVybCJdfHxkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpKyJpZnJhbWVfaGlzdG9yeS5odG1sIikrIj8iKyhuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Cit0aGlzLm1vdmVGb3J3YXJkPXRydWU7Citkb2pvLmlvLnNldElGcmFtZVNyYyh0aGlzLmhpc3RvcnlJZnJhbWUsdXJsLGZhbHNlKTsKK3JldHVybiB1cmw7Cit9fTsKK2Rvam8ucHJvdmlkZSgiZG9qby5pby5Ccm93c2VySU8iKTsKK2lmKCFkal91bmRlZigid2luZG93IikpeworZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZT1mdW5jdGlvbihub2RlKXsKK3ZhciBfMjczPWZhbHNlOwordmFyIF8yNzQ9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKK2Rvam8ubGFuZy5mb3JFYWNoKF8yNzQsZnVuY3Rpb24oXzI3NSl7CitpZihfMjczKXsKK3JldHVybjsKK30KK2lmKF8yNzUuZ2V0QXR0cmlidXRlKCJ0eXBlIik9PSJmaWxlIil7CitfMjczPXRydWU7Cit9Cit9KTsKK3JldHVybiBfMjczOworfTsKK2Rvam8uaW8uZm9ybUhhc0ZpbGU9ZnVuY3Rpb24oXzI3Nil7CityZXR1cm4gZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZShfMjc2KTsKK307Citkb2pvLmlvLnVwZGF0ZU5vZGU9ZnVuY3Rpb24obm9kZSxfMjc4KXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIGFyZ3M9XzI3ODsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhfMjc4KSl7CithcmdzPXt1cmw6XzI3OH07Cit9CithcmdzLm1pbWV0eXBlPSJ0ZXh0L2h0bWwiOworYXJncy5sb2FkPWZ1bmN0aW9uKHQsZCxlKXsKK3doaWxlKG5vZGUuZmlyc3RDaGlsZCl7Citkb2pvLmRvbS5kZXN0cm95Tm9kZShub2RlLmZpcnN0Q2hpbGQpOworfQorbm9kZS5pbm5lckhUTUw9ZDsKK307Citkb2pvLmlvLmJpbmQoYXJncyk7Cit9OworZG9qby5pby5mb3JtRmlsdGVyPWZ1bmN0aW9uKG5vZGUpewordmFyIHR5cGU9KG5vZGUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7CityZXR1cm4gIW5vZGUuZGlzYWJsZWQmJm5vZGUubmFtZSYmIWRvam8ubGFuZy5pbkFycmF5KFsiZmlsZSIsInN1Ym1pdCIsImltYWdlIiwicmVzZXQiLCJidXR0b24iXSx0eXBlKTsKK307Citkb2pvLmlvLmVuY29kZUZvcm09ZnVuY3Rpb24oXzI3ZixfMjgwLF8yODEpeworaWYoKCFfMjdmKXx8KCFfMjdmLnRhZ05hbWUpfHwoIV8yN2YudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iZm9ybSIpKXsKK2Rvam8ucmFpc2UoIkF0dGVtcHRlZCB0byBlbmNvZGUgYSBub24tZm9ybSBlbGVtZW50LiIpOworfQoraWYoIV8yODEpeworXzI4MT1kb2pvLmlvLmZvcm1GaWx0ZXI7Cit9Cit2YXIgZW5jPS91dGYvaS50ZXN0KF8yODB8fCIiKT9lbmNvZGVVUklDb21wb25lbnQ6ZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk7Cit2YXIgXzI4Mz1bXTsKK2Zvcih2YXIgaT0wO2k8XzI3Zi5lbGVtZW50cy5sZW5ndGg7aSsrKXsKK3ZhciBlbG09XzI3Zi5lbGVtZW50c1tpXTsKK2lmKCFlbG18fGVsbS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJmaWVsZHNldCJ8fCFfMjgxKGVsbSkpeworY29udGludWU7Cit9Cit2YXIgbmFtZT1lbmMoZWxtLm5hbWUpOwordmFyIHR5cGU9ZWxtLnR5cGUudG9Mb3dlckNhc2UoKTsKK2lmKHR5cGU9PSJzZWxlY3QtbXVsdGlwbGUiKXsKK2Zvcih2YXIgaj0wO2o8ZWxtLm9wdGlvbnMubGVuZ3RoO2orKyl7CitpZihlbG0ub3B0aW9uc1tqXS5zZWxlY3RlZCl7CitfMjgzLnB1c2gobmFtZSsiPSIrZW5jKGVsbS5vcHRpb25zW2pdLnZhbHVlKSk7Cit9Cit9Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pbkFycmF5KFsicmFkaW8iLCJjaGVja2JveCJdLHR5cGUpKXsKK2lmKGVsbS5jaGVja2VkKXsKK18yODMucHVzaChuYW1lKyI9IitlbmMoZWxtLnZhbHVlKSk7Cit9Cit9ZWxzZXsKK18yODMucHVzaChuYW1lKyI9IitlbmMoZWxtLnZhbHVlKSk7Cit9Cit9Cit9Cit2YXIgXzI4OT1fMjdmLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOworZm9yKHZhciBpPTA7aTxfMjg5Lmxlbmd0aDtpKyspewordmFyIF8yOGE9XzI4OVtpXTsKK2lmKF8yOGEudHlwZS50b0xvd2VyQ2FzZSgpPT0iaW1hZ2UiJiZfMjhhLmZvcm09PV8yN2YmJl8yODEoXzI4YSkpewordmFyIG5hbWU9ZW5jKF8yOGEubmFtZSk7CitfMjgzLnB1c2gobmFtZSsiPSIrZW5jKF8yOGEudmFsdWUpKTsKK18yODMucHVzaChuYW1lKyIueD0wIik7CitfMjgzLnB1c2gobmFtZSsiLnk9MCIpOworfQorfQorcmV0dXJuIF8yODMuam9pbigiJiIpKyImIjsKK307Citkb2pvLmlvLkZvcm1CaW5kPWZ1bmN0aW9uKGFyZ3MpewordGhpcy5iaW5kQXJncz17fTsKK2lmKGFyZ3MmJmFyZ3MuZm9ybU5vZGUpewordGhpcy5pbml0KGFyZ3MpOworfWVsc2V7CitpZihhcmdzKXsKK3RoaXMuaW5pdCh7Zm9ybU5vZGU6YXJnc30pOworfQorfQorfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5pby5Gb3JtQmluZCx7Zm9ybTpudWxsLGJpbmRBcmdzOm51bGwsY2xpY2tlZEJ1dHRvbjpudWxsLGluaXQ6ZnVuY3Rpb24oYXJncyl7Cit2YXIgZm9ybT1kb2pvLmJ5SWQoYXJncy5mb3JtTm9kZSk7CitpZighZm9ybXx8IWZvcm0udGFnTmFtZXx8Zm9ybS50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJmb3JtIil7Cit0aHJvdyBuZXcgRXJyb3IoIkZvcm1CaW5kOiBDb3VsZG4ndCBhcHBseSwgaW52YWxpZCBmb3JtIik7Cit9ZWxzZXsKK2lmKHRoaXMuZm9ybT09Zm9ybSl7CityZXR1cm47Cit9ZWxzZXsKK2lmKHRoaXMuZm9ybSl7Cit0aHJvdyBuZXcgRXJyb3IoIkZvcm1CaW5kOiBBbHJlYWR5IGFwcGxpZWQgdG8gYSBmb3JtIik7Cit9Cit9Cit9Citkb2pvLmxhbmcubWl4aW4odGhpcy5iaW5kQXJncyxhcmdzKTsKK3RoaXMuZm9ybT1mb3JtOwordGhpcy5jb25uZWN0KGZvcm0sIm9uc3VibWl0Iiwic3VibWl0Iik7Citmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKyl7Cit2YXIgbm9kZT1mb3JtLmVsZW1lbnRzW2ldOworaWYobm9kZSYmbm9kZS50eXBlJiZkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsImJ1dHRvbiJdLG5vZGUudHlwZS50b0xvd2VyQ2FzZSgpKSl7Cit0aGlzLmNvbm5lY3Qobm9kZSwib25jbGljayIsImNsaWNrIik7Cit9Cit9Cit2YXIgXzI5MD1mb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOworZm9yKHZhciBpPTA7aTxfMjkwLmxlbmd0aDtpKyspewordmFyIF8yOTE9XzI5MFtpXTsKK2lmKF8yOTEudHlwZS50b0xvd2VyQ2FzZSgpPT0iaW1hZ2UiJiZfMjkxLmZvcm09PWZvcm0pewordGhpcy5jb25uZWN0KF8yOTEsIm9uY2xpY2siLCJjbGljayIpOworfQorfQorfSxvblN1Ym1pdDpmdW5jdGlvbihmb3JtKXsKK3JldHVybiB0cnVlOworfSxzdWJtaXQ6ZnVuY3Rpb24oZSl7CitlLnByZXZlbnREZWZhdWx0KCk7CitpZih0aGlzLm9uU3VibWl0KHRoaXMuZm9ybSkpeworZG9qby5pby5iaW5kKGRvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLHtmb3JtRmlsdGVyOmRvam8ubGFuZy5oaXRjaCh0aGlzLCJmb3JtRmlsdGVyIil9KSk7Cit9Cit9LGNsaWNrOmZ1bmN0aW9uKGUpewordmFyIG5vZGU9ZS5jdXJyZW50VGFyZ2V0OworaWYobm9kZS5kaXNhYmxlZCl7CityZXR1cm47Cit9Cit0aGlzLmNsaWNrZWRCdXR0b249bm9kZTsKK30sZm9ybUZpbHRlcjpmdW5jdGlvbihub2RlKXsKK3ZhciB0eXBlPShub2RlLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpOwordmFyIF8yOTg9ZmFsc2U7CitpZihub2RlLmRpc2FibGVkfHwhbm9kZS5uYW1lKXsKK18yOTg9ZmFsc2U7Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pbkFycmF5KFsic3VibWl0IiwiYnV0dG9uIiwiaW1hZ2UiXSx0eXBlKSl7CitpZighdGhpcy5jbGlja2VkQnV0dG9uKXsKK3RoaXMuY2xpY2tlZEJ1dHRvbj1ub2RlOworfQorXzI5OD1ub2RlPT10aGlzLmNsaWNrZWRCdXR0b247Cit9ZWxzZXsKK18yOTg9IWRvam8ubGFuZy5pbkFycmF5KFsiZmlsZSIsInN1Ym1pdCIsInJlc2V0IiwiYnV0dG9uIl0sdHlwZSk7Cit9Cit9CityZXR1cm4gXzI5ODsKK30sY29ubmVjdDpmdW5jdGlvbihfMjk5LF8yOWEsXzI5Yil7CitpZihkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLmV2ZW50LmNvbm5lY3QiKSl7Citkb2pvLmV2ZW50LmNvbm5lY3QoXzI5OSxfMjlhLHRoaXMsXzI5Yik7Cit9ZWxzZXsKK3ZhciBmY249ZG9qby5sYW5nLmhpdGNoKHRoaXMsXzI5Yik7CitfMjk5W18yOWFdPWZ1bmN0aW9uKGUpeworaWYoIWUpeworZT13aW5kb3cuZXZlbnQ7Cit9CitpZighZS5jdXJyZW50VGFyZ2V0KXsKK2UuY3VycmVudFRhcmdldD1lLnNyY0VsZW1lbnQ7Cit9CitpZighZS5wcmV2ZW50RGVmYXVsdCl7CitlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7Cit3aW5kb3cuZXZlbnQucmV0dXJuVmFsdWU9ZmFsc2U7Cit9OworfQorZmNuKGUpOworfTsKK30KK319KTsKK2Rvam8uaW8uWE1MSFRUUFRyYW5zcG9ydD1uZXcgZnVuY3Rpb24oKXsKK3ZhciBfMjllPXRoaXM7Cit2YXIgXzI5Zj17fTsKK3RoaXMudXNlQ2FjaGU9ZmFsc2U7Cit0aGlzLnByZXZlbnRDYWNoZT1mYWxzZTsKK2Z1bmN0aW9uIGdldENhY2hlS2V5KHVybCxfMmExLF8yYTIpeworcmV0dXJuIHVybCsifCIrXzJhMSsifCIrXzJhMi50b0xvd2VyQ2FzZSgpOworfQorZnVuY3Rpb24gYWRkVG9DYWNoZSh1cmwsXzJhNCxfMmE1LGh0dHApeworXzI5ZltnZXRDYWNoZUtleSh1cmwsXzJhNCxfMmE1KV09aHR0cDsKK30KK2Z1bmN0aW9uIGdldEZyb21DYWNoZSh1cmwsXzJhOCxfMmE5KXsKK3JldHVybiBfMjlmW2dldENhY2hlS2V5KHVybCxfMmE4LF8yYTkpXTsKK30KK3RoaXMuY2xlYXJDYWNoZT1mdW5jdGlvbigpeworXzI5Zj17fTsKK307CitmdW5jdGlvbiBkb0xvYWQoXzJhYSxodHRwLHVybCxfMmFkLF8yYWUpeworaWYoKChodHRwLnN0YXR1cz49MjAwKSYmKGh0dHAuc3RhdHVzPDMwMCkpfHwoaHR0cC5zdGF0dXM9PTMwNCl8fChodHRwLnN0YXR1cz09MTIyMyl8fChsb2NhdGlvbi5wcm90b2NvbD09ImZpbGU6IiYmKGh0dHAuc3RhdHVzPT0wfHxodHRwLnN0YXR1cz09dW5kZWZpbmVkKSl8fChsb2NhdGlvbi5wcm90b2NvbD09ImNocm9tZToiJiYoaHR0cC5zdGF0dXM9PTB8fGh0dHAuc3RhdHVzPT11bmRlZmluZWQpKSl7Cit2YXIgcmV0OworaWYoXzJhYS5tZXRob2QudG9Mb3dlckNhc2UoKT09ImhlYWQiKXsKK3ZhciBfMmIwPWh0dHAuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CityZXQ9e307CityZXQudG9TdHJpbmc9ZnVuY3Rpb24oKXsKK3JldHVybiBfMmIwOworfTsKK3ZhciBfMmIxPV8yYjAuc3BsaXQoL1tcclxuXSsvZyk7Citmb3IodmFyIGk9MDtpPF8yYjEubGVuZ3RoO2krKyl7Cit2YXIgcGFpcj1fMmIxW2ldLm1hdGNoKC9eKFteOl0rKVxzKjpccyooLispJC9pKTsKK2lmKHBhaXIpeworcmV0W3BhaXJbMV1dPXBhaXJbMl07Cit9Cit9Cit9ZWxzZXsKK2lmKF8yYWEubWltZXR5cGU9PSJ0ZXh0L2phdmFzY3JpcHQiKXsKK3RyeXsKK3JldD1kal9ldmFsKGh0dHAucmVzcG9uc2VUZXh0KTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK2Rvam8uZGVidWcoaHR0cC5yZXNwb25zZVRleHQpOworcmV0PW51bGw7Cit9Cit9ZWxzZXsKK2lmKF8yYWEubWltZXR5cGUuc3Vic3RyKDAsOSk9PSJ0ZXh0L2pzb24ifHxfMmFhLm1pbWV0eXBlLnN1YnN0cigwLDE2KT09ImFwcGxpY2F0aW9uL2pzb24iKXsKK3RyeXsKK3JldD1kal9ldmFsKCIoIitfMmFhLmpzb25GaWx0ZXIoaHR0cC5yZXNwb25zZVRleHQpKyIpIik7Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoZSk7Citkb2pvLmRlYnVnKGh0dHAucmVzcG9uc2VUZXh0KTsKK3JldD1mYWxzZTsKK30KK31lbHNleworaWYoKF8yYWEubWltZXR5cGU9PSJhcHBsaWNhdGlvbi94bWwiKXx8KF8yYWEubWltZXR5cGU9PSJ0ZXh0L3htbCIpKXsKK3JldD1odHRwLnJlc3BvbnNlWE1MOworaWYoIXJldHx8dHlwZW9mIHJldD09InN0cmluZyJ8fCFodHRwLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSl7CityZXQ9ZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dChodHRwLnJlc3BvbnNlVGV4dCk7Cit9Cit9ZWxzZXsKK3JldD1odHRwLnJlc3BvbnNlVGV4dDsKK30KK30KK30KK30KK2lmKF8yYWUpeworYWRkVG9DYWNoZSh1cmwsXzJhZCxfMmFhLm1ldGhvZCxodHRwKTsKK30KK18yYWFbKHR5cGVvZiBfMmFhLmxvYWQ9PSJmdW5jdGlvbiIpPyJsb2FkIjoiaGFuZGxlIl0oImxvYWQiLHJldCxodHRwLF8yYWEpOworfWVsc2V7Cit2YXIgXzJiND1uZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydCBFcnJvcjogIitodHRwLnN0YXR1cysiICIraHR0cC5zdGF0dXNUZXh0KTsKK18yYWFbKHR5cGVvZiBfMmFhLmVycm9yPT0iZnVuY3Rpb24iKT8iZXJyb3IiOiJoYW5kbGUiXSgiZXJyb3IiLF8yYjQsaHR0cCxfMmFhKTsKK30KK30KK2Z1bmN0aW9uIHNldEhlYWRlcnMoaHR0cCxfMmI2KXsKK2lmKF8yYjZbImhlYWRlcnMiXSl7Citmb3IodmFyIF8yYjcgaW4gXzJiNlsiaGVhZGVycyJdKXsKK2lmKF8yYjcudG9Mb3dlckNhc2UoKT09ImNvbnRlbnQtdHlwZSImJiFfMmI2WyJjb250ZW50VHlwZSJdKXsKK18yYjZbImNvbnRlbnRUeXBlIl09XzJiNlsiaGVhZGVycyJdW18yYjddOworfWVsc2V7CitodHRwLnNldFJlcXVlc3RIZWFkZXIoXzJiNyxfMmI2WyJoZWFkZXJzIl1bXzJiN10pOworfQorfQorfQorfQordGhpcy5pbkZsaWdodD1bXTsKK3RoaXMuaW5GbGlnaHRUaW1lcj1udWxsOwordGhpcy5zdGFydFdhdGNoaW5nSW5GbGlnaHQ9ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmluRmxpZ2h0VGltZXIpewordGhpcy5pbkZsaWdodFRpbWVyPXNldFRpbWVvdXQoImRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0KCk7IiwxMCk7Cit9Cit9OwordGhpcy53YXRjaEluRmxpZ2h0PWZ1bmN0aW9uKCl7Cit2YXIgbm93PW51bGw7CitpZighZG9qby5ob3N0ZW52Ll9ibG9ja0FzeW5jJiYhXzI5ZS5fYmxvY2tBc3luYyl7Citmb3IodmFyIHg9dGhpcy5pbkZsaWdodC5sZW5ndGgtMTt4Pj0wO3gtLSl7Cit0cnl7Cit2YXIgdGlmPXRoaXMuaW5GbGlnaHRbeF07CitpZighdGlmfHx0aWYuaHR0cC5fYWJvcnRlZHx8IXRpZi5odHRwLnJlYWR5U3RhdGUpewordGhpcy5pbkZsaWdodC5zcGxpY2UoeCwxKTsKK2NvbnRpbnVlOworfQoraWYoND09dGlmLmh0dHAucmVhZHlTdGF0ZSl7Cit0aGlzLmluRmxpZ2h0LnNwbGljZSh4LDEpOworZG9Mb2FkKHRpZi5yZXEsdGlmLmh0dHAsdGlmLnVybCx0aWYucXVlcnksdGlmLnVzZUNhY2hlKTsKK31lbHNleworaWYodGlmLnN0YXJ0VGltZSl7CitpZighbm93KXsKK25vdz0obmV3IERhdGUoKSkuZ2V0VGltZSgpOworfQoraWYodGlmLnN0YXJ0VGltZSsodGlmLnJlcS50aW1lb3V0U2Vjb25kcyoxMDAwKTxub3cpeworaWYodHlwZW9mIHRpZi5odHRwLmFib3J0PT0iZnVuY3Rpb24iKXsKK3RpZi5odHRwLmFib3J0KCk7Cit9Cit0aGlzLmluRmxpZ2h0LnNwbGljZSh4LDEpOwordGlmLnJlcVsodHlwZW9mIHRpZi5yZXEudGltZW91dD09ImZ1bmN0aW9uIik/InRpbWVvdXQiOiJoYW5kbGUiXSgidGltZW91dCIsbnVsbCx0aWYuaHR0cCx0aWYucmVxKTsKK30KK30KK30KK30KK2NhdGNoKGUpewordHJ5ewordmFyIF8yYmI9bmV3IGRvam8uaW8uRXJyb3IoIlhNTEh0dHBUcmFuc3BvcnQud2F0Y2hJbkZsaWdodCBFcnJvcjogIitlKTsKK3RpZi5yZXFbKHR5cGVvZiB0aWYucmVxLmVycm9yPT0iZnVuY3Rpb24iKT8iZXJyb3IiOiJoYW5kbGUiXSgiZXJyb3IiLF8yYmIsdGlmLmh0dHAsdGlmLnJlcSk7Cit9CitjYXRjaChlMil7Citkb2pvLmRlYnVnKCJYTUxIdHRwVHJhbnNwb3J0IGVycm9yIGNhbGxiYWNrIGZhaWxlZDogIitlMik7Cit9Cit9Cit9Cit9CitjbGVhclRpbWVvdXQodGhpcy5pbkZsaWdodFRpbWVyKTsKK2lmKHRoaXMuaW5GbGlnaHQubGVuZ3RoPT0wKXsKK3RoaXMuaW5GbGlnaHRUaW1lcj1udWxsOworcmV0dXJuOworfQordGhpcy5pbkZsaWdodFRpbWVyPXNldFRpbWVvdXQoImRvam8uaW8uWE1MSFRUUFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0KCk7IiwxMCk7Cit9OwordmFyIF8yYmM9ZG9qby5ob3N0ZW52LmdldFhtbGh0dHBPYmplY3QoKT90cnVlOmZhbHNlOwordGhpcy5jYW5IYW5kbGU9ZnVuY3Rpb24oXzJiZCl7Cit2YXIgbWxjPV8yYmRbIm1pbWV0eXBlIl0udG9Mb3dlckNhc2UoKXx8IiI7CityZXR1cm4gXzJiYyYmKChkb2pvLmxhbmcuaW5BcnJheShbInRleHQvcGxhaW4iLCJ0ZXh0L2h0bWwiLCJhcHBsaWNhdGlvbi94bWwiLCJ0ZXh0L3htbCIsInRleHQvamF2YXNjcmlwdCJdLG1sYykpfHwobWxjLnN1YnN0cigwLDkpPT0idGV4dC9qc29uInx8bWxjLnN1YnN0cigwLDE2KT09ImFwcGxpY2F0aW9uL2pzb24iKSkmJiEoXzJiZFsiZm9ybU5vZGUiXSYmZG9qby5pby5mb3JtSGFzRmlsZShfMmJkWyJmb3JtTm9kZSJdKSk7Cit9OwordGhpcy5tdWx0aXBhcnRCb3VuZGFyeT0iNDUzMDlGRkYtQkQ2NS00ZDUwLTk5QzktMzY5ODY4OTZBOTZGIjsKK3RoaXMuYmluZD1mdW5jdGlvbihfMmJmKXsKK2lmKCFfMmJmWyJ1cmwiXSl7CitpZighXzJiZlsiZm9ybU5vZGUiXSYmKF8yYmZbImJhY2tCdXR0b24iXXx8XzJiZlsiYmFjayJdfHxfMmJmWyJjaGFuZ2VVcmwiXXx8XzJiZlsid2F0Y2hGb3JVUkwiXSkmJighZGpDb25maWcucHJldmVudEJhY2tCdXR0b25GaXgpKXsKK2Rvam8uZGVwcmVjYXRlZCgiVXNpbmcgZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LmJpbmQoKSB0byBhZGQgdG8gYnJvd3NlciBoaXN0b3J5IHdpdGhvdXQgZG9pbmcgYW4gSU8gcmVxdWVzdCIsIlVzZSBkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3RvcnkoKSBpbnN0ZWFkLiIsIjAuNCIpOworZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KF8yYmYpOworcmV0dXJuIHRydWU7Cit9Cit9Cit2YXIgdXJsPV8yYmYudXJsOwordmFyIF8yYzE9IiI7CitpZihfMmJmWyJmb3JtTm9kZSJdKXsKK3ZhciB0YT1fMmJmLmZvcm1Ob2RlLmdldEF0dHJpYnV0ZSgiYWN0aW9uIik7CitpZigodGEpJiYoIV8yYmZbInVybCJdKSl7Cit1cmw9dGE7Cit9Cit2YXIgdHA9XzJiZi5mb3JtTm9kZS5nZXRBdHRyaWJ1dGUoIm1ldGhvZCIpOworaWYoKHRwKSYmKCFfMmJmWyJtZXRob2QiXSkpeworXzJiZi5tZXRob2Q9dHA7Cit9CitfMmMxKz1kb2pvLmlvLmVuY29kZUZvcm0oXzJiZi5mb3JtTm9kZSxfMmJmLmVuY29kaW5nLF8yYmZbImZvcm1GaWx0ZXIiXSk7Cit9CitpZih1cmwuaW5kZXhPZigiIyIpPi0xKXsKK2Rvam8uZGVidWcoIldhcm5pbmc6IGRvam8uaW8uYmluZDogc3RyaXBwaW5nIGhhc2ggdmFsdWVzIGZyb20gdXJsOiIsdXJsKTsKK3VybD11cmwuc3BsaXQoIiMiKVswXTsKK30KK2lmKF8yYmZbImZpbGUiXSl7CitfMmJmLm1ldGhvZD0icG9zdCI7Cit9CitpZighXzJiZlsibWV0aG9kIl0peworXzJiZi5tZXRob2Q9ImdldCI7Cit9CitpZihfMmJmLm1ldGhvZC50b0xvd2VyQ2FzZSgpPT0iZ2V0Iil7CitfMmJmLm11bHRpcGFydD1mYWxzZTsKK31lbHNleworaWYoXzJiZlsiZmlsZSJdKXsKK18yYmYubXVsdGlwYXJ0PXRydWU7Cit9ZWxzZXsKK2lmKCFfMmJmWyJtdWx0aXBhcnQiXSl7CitfMmJmLm11bHRpcGFydD1mYWxzZTsKK30KK30KK30KK2lmKF8yYmZbImJhY2tCdXR0b24iXXx8XzJiZlsiYmFjayJdfHxfMmJmWyJjaGFuZ2VVcmwiXSl7Citkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3RvcnkoXzJiZik7Cit9Cit2YXIgXzJjND1fMmJmWyJjb250ZW50Il18fHt9OworaWYoXzJiZi5zZW5kVHJhbnNwb3J0KXsKK18yYzRbImRvam8udHJhbnNwb3J0Il09InhtbGh0dHAiOworfQorZG97CitpZihfMmJmLnBvc3RDb250ZW50KXsKK18yYzE9XzJiZi5wb3N0Q29udGVudDsKK2JyZWFrOworfQoraWYoXzJjNCl7CitfMmMxKz1kb2pvLmlvLmFyZ3NGcm9tTWFwKF8yYzQsXzJiZi5lbmNvZGluZyk7Cit9CitpZihfMmJmLm1ldGhvZC50b0xvd2VyQ2FzZSgpPT0iZ2V0Inx8IV8yYmYubXVsdGlwYXJ0KXsKK2JyZWFrOworfQordmFyIHQ9W107CitpZihfMmMxLmxlbmd0aCl7Cit2YXIgcT1fMmMxLnNwbGl0KCImIik7Citmb3IodmFyIGk9MDtpPHEubGVuZ3RoOysraSl7CitpZihxW2ldLmxlbmd0aCl7Cit2YXIgcD1xW2ldLnNwbGl0KCI9Iik7Cit0LnB1c2goIi0tIit0aGlzLm11bHRpcGFydEJvdW5kYXJ5LCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiK3BbMF0rIlwiIiwiIixwWzFdKTsKK30KK30KK30KK2lmKF8yYmYuZmlsZSl7CitpZihkb2pvLmxhbmcuaXNBcnJheShfMmJmLmZpbGUpKXsKK2Zvcih2YXIgaT0wO2k8XzJiZi5maWxlLmxlbmd0aDsrK2kpewordmFyIG89XzJiZi5maWxlW2ldOwordC5wdXNoKCItLSIrdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSwiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIitvLm5hbWUrIlwiOyBmaWxlbmFtZT1cIiIrKCJmaWxlTmFtZSIgaW4gbz9vLmZpbGVOYW1lOm8ubmFtZSkrIlwiIiwiQ29udGVudC1UeXBlOiAiKygiY29udGVudFR5cGUiIGluIG8/by5jb250ZW50VHlwZToiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiksIiIsby5jb250ZW50KTsKK30KK31lbHNlewordmFyIG89XzJiZi5maWxlOwordC5wdXNoKCItLSIrdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSwiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIitvLm5hbWUrIlwiOyBmaWxlbmFtZT1cIiIrKCJmaWxlTmFtZSIgaW4gbz9vLmZpbGVOYW1lOm8ubmFtZSkrIlwiIiwiQ29udGVudC1UeXBlOiAiKygiY29udGVudFR5cGUiIGluIG8/by5jb250ZW50VHlwZToiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiksIiIsby5jb250ZW50KTsKK30KK30KK2lmKHQubGVuZ3RoKXsKK3QucHVzaCgiLS0iK3RoaXMubXVsdGlwYXJ0Qm91bmRhcnkrIi0tIiwiIik7CitfMmMxPXQuam9pbigiXHJcbiIpOworfQorfXdoaWxlKGZhbHNlKTsKK3ZhciBfMmNhPV8yYmZbInN5bmMiXT9mYWxzZTp0cnVlOwordmFyIF8yY2I9XzJiZlsicHJldmVudENhY2hlIl18fCh0aGlzLnByZXZlbnRDYWNoZT09dHJ1ZSYmXzJiZlsicHJldmVudENhY2hlIl0hPWZhbHNlKTsKK3ZhciBfMmNjPV8yYmZbInVzZUNhY2hlIl09PXRydWV8fCh0aGlzLnVzZUNhY2hlPT10cnVlJiZfMmJmWyJ1c2VDYWNoZSJdIT1mYWxzZSk7CitpZighXzJjYiYmXzJjYyl7Cit2YXIgXzJjZD1nZXRGcm9tQ2FjaGUodXJsLF8yYzEsXzJiZi5tZXRob2QpOworaWYoXzJjZCl7Citkb0xvYWQoXzJiZixfMmNkLHVybCxfMmMxLGZhbHNlKTsKK3JldHVybjsKK30KK30KK3ZhciBodHRwPWRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0KF8yYmYpOwordmFyIF8yY2Y9ZmFsc2U7CitpZihfMmNhKXsKK3ZhciBfMmQwPXRoaXMuaW5GbGlnaHQucHVzaCh7InJlcSI6XzJiZiwiaHR0cCI6aHR0cCwidXJsIjp1cmwsInF1ZXJ5IjpfMmMxLCJ1c2VDYWNoZSI6XzJjYywic3RhcnRUaW1lIjpfMmJmLnRpbWVvdXRTZWNvbmRzPyhuZXcgRGF0ZSgpKS5nZXRUaW1lKCk6MH0pOwordGhpcy5zdGFydFdhdGNoaW5nSW5GbGlnaHQoKTsKK31lbHNleworXzI5ZS5fYmxvY2tBc3luYz10cnVlOworfQoraWYoXzJiZi5tZXRob2QudG9Mb3dlckNhc2UoKT09InBvc3QiKXsKK2lmKCFfMmJmLnVzZXIpeworaHR0cC5vcGVuKCJQT1NUIix1cmwsXzJjYSk7Cit9ZWxzZXsKK2h0dHAub3BlbigiUE9TVCIsdXJsLF8yY2EsXzJiZi51c2VyLF8yYmYucGFzc3dvcmQpOworfQorc2V0SGVhZGVycyhodHRwLF8yYmYpOworaHR0cC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLF8yYmYubXVsdGlwYXJ0PygibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9Iit0aGlzLm11bHRpcGFydEJvdW5kYXJ5KTooXzJiZi5jb250ZW50VHlwZXx8ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpKTsKK3RyeXsKK2h0dHAuc2VuZChfMmMxKTsKK30KK2NhdGNoKGUpeworaWYodHlwZW9mIGh0dHAuYWJvcnQ9PSJmdW5jdGlvbiIpeworaHR0cC5hYm9ydCgpOworfQorZG9Mb2FkKF8yYmYse3N0YXR1czo0MDR9LHVybCxfMmMxLF8yY2MpOworfQorfWVsc2V7Cit2YXIgXzJkMT11cmw7CitpZihfMmMxIT0iIil7CitfMmQxKz0oXzJkMS5pbmRleE9mKCI/Iik+LTE/IiYiOiI/IikrXzJjMTsKK30KK2lmKF8yY2IpeworXzJkMSs9KGRvam8uc3RyaW5nLmVuZHNXaXRoQW55KF8yZDEsIj8iLCImIik/IiI6KF8yZDEuaW5kZXhPZigiPyIpPi0xPyImIjoiPyIpKSsiZG9qby5wcmV2ZW50Q2FjaGU9IituZXcgRGF0ZSgpLnZhbHVlT2YoKTsKK30KK2lmKCFfMmJmLnVzZXIpeworaHR0cC5vcGVuKF8yYmYubWV0aG9kLnRvVXBwZXJDYXNlKCksXzJkMSxfMmNhKTsKK31lbHNleworaHR0cC5vcGVuKF8yYmYubWV0aG9kLnRvVXBwZXJDYXNlKCksXzJkMSxfMmNhLF8yYmYudXNlcixfMmJmLnBhc3N3b3JkKTsKK30KK3NldEhlYWRlcnMoaHR0cCxfMmJmKTsKK3RyeXsKK2h0dHAuc2VuZChudWxsKTsKK30KK2NhdGNoKGUpeworaWYodHlwZW9mIGh0dHAuYWJvcnQ9PSJmdW5jdGlvbiIpeworaHR0cC5hYm9ydCgpOworfQorZG9Mb2FkKF8yYmYse3N0YXR1czo0MDR9LHVybCxfMmMxLF8yY2MpOworfQorfQoraWYoIV8yY2EpeworZG9Mb2FkKF8yYmYsaHR0cCx1cmwsXzJjMSxfMmNjKTsKK18yOWUuX2Jsb2NrQXN5bmM9ZmFsc2U7Cit9CitfMmJmLmFib3J0PWZ1bmN0aW9uKCl7Cit0cnl7CitodHRwLl9hYm9ydGVkPXRydWU7Cit9CitjYXRjaChlKXsKK30KK3JldHVybiBodHRwLmFib3J0KCk7Cit9OworcmV0dXJuOworfTsKK2Rvam8uaW8udHJhbnNwb3J0cy5hZGRUcmFuc3BvcnQoIlhNTEhUVFBUcmFuc3BvcnQiKTsKK307Cit9Citkb2pvLnByb3ZpZGUoImRvam8uaW8uY29va2llIik7Citkb2pvLmlvLmNvb2tpZS5zZXRDb29raWU9ZnVuY3Rpb24obmFtZSxfMmQzLGRheXMscGF0aCxfMmQ2LF8yZDcpewordmFyIF8yZDg9LTE7CitpZigodHlwZW9mIGRheXM9PSJudW1iZXIiKSYmKGRheXM+PTApKXsKK3ZhciBkPW5ldyBEYXRlKCk7CitkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGRheXMqMjQqNjAqNjAqMTAwMCkpOworXzJkOD1kLnRvR01UU3RyaW5nKCk7Cit9CitfMmQzPWVzY2FwZShfMmQzKTsKK2RvY3VtZW50LmNvb2tpZT1uYW1lKyI9IitfMmQzKyI7IisoXzJkOCE9LTE/IiBleHBpcmVzPSIrXzJkOCsiOyI6IiIpKyhwYXRoPyJwYXRoPSIrcGF0aDoiIikrKF8yZDY/IjsgZG9tYWluPSIrXzJkNjoiIikrKF8yZDc/Ijsgc2VjdXJlIjoiIik7Cit9OworZG9qby5pby5jb29raWUuc2V0PWRvam8uaW8uY29va2llLnNldENvb2tpZTsKK2Rvam8uaW8uY29va2llLmdldENvb2tpZT1mdW5jdGlvbihuYW1lKXsKK3ZhciBpZHg9ZG9jdW1lbnQuY29va2llLmxhc3RJbmRleE9mKG5hbWUrIj0iKTsKK2lmKGlkeD09LTEpeworcmV0dXJuIG51bGw7Cit9Cit2YXIgXzJkYz1kb2N1bWVudC5jb29raWUuc3Vic3RyaW5nKGlkeCtuYW1lLmxlbmd0aCsxKTsKK3ZhciBlbmQ9XzJkYy5pbmRleE9mKCI7Iik7CitpZihlbmQ9PS0xKXsKK2VuZD1fMmRjLmxlbmd0aDsKK30KK18yZGM9XzJkYy5zdWJzdHJpbmcoMCxlbmQpOworXzJkYz11bmVzY2FwZShfMmRjKTsKK3JldHVybiBfMmRjOworfTsKK2Rvam8uaW8uY29va2llLmdldD1kb2pvLmlvLmNvb2tpZS5nZXRDb29raWU7Citkb2pvLmlvLmNvb2tpZS5kZWxldGVDb29raWU9ZnVuY3Rpb24obmFtZSl7Citkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwiLSIsMCk7Cit9OworZG9qby5pby5jb29raWUuc2V0T2JqZWN0Q29va2llPWZ1bmN0aW9uKG5hbWUsb2JqLGRheXMscGF0aCxfMmUzLF8yZTQsXzJlNSl7CitpZihhcmd1bWVudHMubGVuZ3RoPT01KXsKK18yZTU9XzJlMzsKK18yZTM9bnVsbDsKK18yZTQ9bnVsbDsKK30KK3ZhciBfMmU2PVtdLF8yZTcsXzJlOD0iIjsKK2lmKCFfMmU1KXsKK18yZTc9ZG9qby5pby5jb29raWUuZ2V0T2JqZWN0Q29va2llKG5hbWUpOworfQoraWYoZGF5cz49MCl7CitpZighXzJlNyl7CitfMmU3PXt9OworfQorZm9yKHZhciBwcm9wIGluIG9iail7CitpZihvYmpbcHJvcF09PW51bGwpeworZGVsZXRlIF8yZTdbcHJvcF07Cit9ZWxzZXsKK2lmKCh0eXBlb2Ygb2JqW3Byb3BdPT0ic3RyaW5nIil8fCh0eXBlb2Ygb2JqW3Byb3BdPT0ibnVtYmVyIikpeworXzJlN1twcm9wXT1vYmpbcHJvcF07Cit9Cit9Cit9Citwcm9wPW51bGw7Citmb3IodmFyIHByb3AgaW4gXzJlNyl7CitfMmU2LnB1c2goZXNjYXBlKHByb3ApKyI9Iitlc2NhcGUoXzJlN1twcm9wXSkpOworfQorXzJlOD1fMmU2LmpvaW4oIiYiKTsKK30KK2Rvam8uaW8uY29va2llLnNldENvb2tpZShuYW1lLF8yZTgsZGF5cyxwYXRoLF8yZTMsXzJlNCk7Cit9OworZG9qby5pby5jb29raWUuZ2V0T2JqZWN0Q29va2llPWZ1bmN0aW9uKG5hbWUpewordmFyIF8yZWI9bnVsbCxfMmVjPWRvam8uaW8uY29va2llLmdldENvb2tpZShuYW1lKTsKK2lmKF8yZWMpeworXzJlYj17fTsKK3ZhciBfMmVkPV8yZWMuc3BsaXQoIiYiKTsKK2Zvcih2YXIgaT0wO2k8XzJlZC5sZW5ndGg7aSsrKXsKK3ZhciBwYWlyPV8yZWRbaV0uc3BsaXQoIj0iKTsKK3ZhciBfMmYwPXBhaXJbMV07CitpZihpc05hTihfMmYwKSl7CitfMmYwPXVuZXNjYXBlKHBhaXJbMV0pOworfQorXzJlYlt1bmVzY2FwZShwYWlyWzBdKV09XzJmMDsKK30KK30KK3JldHVybiBfMmViOworfTsKK2Rvam8uaW8uY29va2llLmlzU3VwcG9ydGVkPWZ1bmN0aW9uKCl7CitpZih0eXBlb2YgbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQhPSJib29sZWFuIil7Citkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUoIl9fVGVzdGluZ1lvdXJCcm93c2VyRm9yQ29va2llU3VwcG9ydF9fIiwiQ29va2llc0FsbG93ZWQiLDkwLG51bGwpOwordmFyIF8yZjE9ZG9qby5pby5jb29raWUuZ2V0Q29va2llKCJfX1Rlc3RpbmdZb3VyQnJvd3NlckZvckNvb2tpZVN1cHBvcnRfXyIpOworbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ9KF8yZjE9PSJDb29raWVzQWxsb3dlZCIpOworaWYobmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQpewordGhpcy5kZWxldGVDb29raWUoIl9fVGVzdGluZ1lvdXJCcm93c2VyRm9yQ29va2llU3VwcG9ydF9fIik7Cit9Cit9CityZXR1cm4gbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ7Cit9OworaWYoIWRvam8uaW8uY29va2llcyl7Citkb2pvLmlvLmNvb2tpZXM9ZG9qby5pby5jb29raWU7Cit9Citkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmlvLmNvbW1vbiJdLHJoaW5vOlsiZG9qby5pby5SaGlub0lPIl0sYnJvd3NlcjpbImRvam8uaW8uQnJvd3NlcklPIiwiZG9qby5pby5jb29raWUiXSxkYXNoYm9hcmQ6WyJkb2pvLmlvLkJyb3dzZXJJTyIsImRvam8uaW8uY29va2llIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5pby4qIik7Citkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuY29tbW9uIik7Citkb2pvLmV2ZW50PW5ldyBmdW5jdGlvbigpewordGhpcy5fY2FuVGltZW91dD1kb2pvLmxhbmcuaXNGdW5jdGlvbihkal9nbG9iYWxbInNldFRpbWVvdXQiXSl8fGRvam8ubGFuZy5pc0FsaWVuKGRqX2dsb2JhbFsic2V0VGltZW91dCJdKTsKK2Z1bmN0aW9uIGludGVycG9sYXRlQXJncyhhcmdzLF8yZjMpewordmFyIGRsPWRvam8ubGFuZzsKK3ZhciBhbz17c3JjT2JqOmRqX2dsb2JhbCxzcmNGdW5jOm51bGwsYWR2aWNlT2JqOmRqX2dsb2JhbCxhZHZpY2VGdW5jOm51bGwsYXJvdW5kT2JqOm51bGwsYXJvdW5kRnVuYzpudWxsLGFkdmljZVR5cGU6KGFyZ3MubGVuZ3RoPjIpP2FyZ3NbMF06ImFmdGVyIixwcmVjZWRlbmNlOiJsYXN0IixvbmNlOmZhbHNlLGRlbGF5Om51bGwscmF0ZTowLGFkdmljZU1zZzpmYWxzZSxtYXhDYWxsczotMX07Citzd2l0Y2goYXJncy5sZW5ndGgpeworY2FzZSAwOgorcmV0dXJuOworY2FzZSAxOgorcmV0dXJuOworY2FzZSAyOgorYW8uc3JjRnVuYz1hcmdzWzBdOworYW8uYWR2aWNlRnVuYz1hcmdzWzFdOworYnJlYWs7CitjYXNlIDM6CitpZigoZGwuaXNPYmplY3QoYXJnc1swXSkpJiYoZGwuaXNTdHJpbmcoYXJnc1sxXSkpJiYoZGwuaXNTdHJpbmcoYXJnc1syXSkpKXsKK2FvLmFkdmljZVR5cGU9ImFmdGVyIjsKK2FvLnNyY09iaj1hcmdzWzBdOworYW8uc3JjRnVuYz1hcmdzWzFdOworYW8uYWR2aWNlRnVuYz1hcmdzWzJdOworfWVsc2V7CitpZigoZGwuaXNTdHJpbmcoYXJnc1sxXSkpJiYoZGwuaXNTdHJpbmcoYXJnc1syXSkpKXsKK2FvLnNyY0Z1bmM9YXJnc1sxXTsKK2FvLmFkdmljZUZ1bmM9YXJnc1syXTsKK31lbHNleworaWYoKGRsLmlzT2JqZWN0KGFyZ3NbMF0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMV0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1syXSkpKXsKK2FvLmFkdmljZVR5cGU9ImFmdGVyIjsKK2FvLnNyY09iaj1hcmdzWzBdOworYW8uc3JjRnVuYz1hcmdzWzFdOwordmFyIF8yZjY9ZGwubmFtZUFub25GdW5jKGFyZ3NbMl0sYW8uYWR2aWNlT2JqLF8yZjMpOworYW8uYWR2aWNlRnVuYz1fMmY2OworfWVsc2V7CitpZigoZGwuaXNGdW5jdGlvbihhcmdzWzBdKSkmJihkbC5pc09iamVjdChhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT0iYWZ0ZXIiOworYW8uc3JjT2JqPWRqX2dsb2JhbDsKK3ZhciBfMmY2PWRsLm5hbWVBbm9uRnVuYyhhcmdzWzBdLGFvLnNyY09iaixfMmYzKTsKK2FvLnNyY0Z1bmM9XzJmNjsKK2FvLmFkdmljZU9iaj1hcmdzWzFdOworYW8uYWR2aWNlRnVuYz1hcmdzWzJdOworfQorfQorfQorfQorYnJlYWs7CitjYXNlIDQ6CitpZigoZGwuaXNPYmplY3QoYXJnc1swXSkpJiYoZGwuaXNPYmplY3QoYXJnc1syXSkpKXsKK2FvLmFkdmljZVR5cGU9ImFmdGVyIjsKK2FvLnNyY09iaj1hcmdzWzBdOworYW8uc3JjRnVuYz1hcmdzWzFdOworYW8uYWR2aWNlT2JqPWFyZ3NbMl07Cithby5hZHZpY2VGdW5jPWFyZ3NbM107Cit9ZWxzZXsKK2lmKChkbC5pc1N0cmluZyhhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc09iamVjdChhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT1hcmdzWzBdOworYW8uc3JjT2JqPWRqX2dsb2JhbDsKK2FvLnNyY0Z1bmM9YXJnc1sxXTsKK2FvLmFkdmljZU9iaj1hcmdzWzJdOworYW8uYWR2aWNlRnVuYz1hcmdzWzNdOworfWVsc2V7CitpZigoZGwuaXNTdHJpbmcoYXJnc1swXSkpJiYoZGwuaXNGdW5jdGlvbihhcmdzWzFdKSkmJihkbC5pc09iamVjdChhcmdzWzJdKSkpeworYW8uYWR2aWNlVHlwZT1hcmdzWzBdOworYW8uc3JjT2JqPWRqX2dsb2JhbDsKK3ZhciBfMmY2PWRsLm5hbWVBbm9uRnVuYyhhcmdzWzFdLGRqX2dsb2JhbCxfMmYzKTsKK2FvLnNyY0Z1bmM9XzJmNjsKK2FvLmFkdmljZU9iaj1hcmdzWzJdOworYW8uYWR2aWNlRnVuYz1hcmdzWzNdOworfWVsc2V7CitpZigoZGwuaXNTdHJpbmcoYXJnc1swXSkpJiYoZGwuaXNPYmplY3QoYXJnc1sxXSkpJiYoZGwuaXNTdHJpbmcoYXJnc1syXSkpJiYoZGwuaXNGdW5jdGlvbihhcmdzWzNdKSkpeworYW8uc3JjT2JqPWFyZ3NbMV07Cithby5zcmNGdW5jPWFyZ3NbMl07Cit2YXIgXzJmNj1kbC5uYW1lQW5vbkZ1bmMoYXJnc1szXSxkal9nbG9iYWwsXzJmMyk7Cithby5hZHZpY2VPYmo9ZGpfZ2xvYmFsOworYW8uYWR2aWNlRnVuYz1fMmY2OworfWVsc2V7CitpZihkbC5pc09iamVjdChhcmdzWzFdKSl7Cithby5zcmNPYmo9YXJnc1sxXTsKK2FvLnNyY0Z1bmM9YXJnc1syXTsKK2FvLmFkdmljZU9iaj1kal9nbG9iYWw7Cithby5hZHZpY2VGdW5jPWFyZ3NbM107Cit9ZWxzZXsKK2lmKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKXsKK2FvLnNyY09iaj1kal9nbG9iYWw7Cithby5zcmNGdW5jPWFyZ3NbMV07Cithby5hZHZpY2VPYmo9YXJnc1syXTsKK2FvLmFkdmljZUZ1bmM9YXJnc1szXTsKK31lbHNleworYW8uc3JjT2JqPWFvLmFkdmljZU9iaj1hby5hcm91bmRPYmo9ZGpfZ2xvYmFsOworYW8uc3JjRnVuYz1hcmdzWzFdOworYW8uYWR2aWNlRnVuYz1hcmdzWzJdOworYW8uYXJvdW5kRnVuYz1hcmdzWzNdOworfQorfQorfQorfQorfQorfQorYnJlYWs7CitjYXNlIDY6Cithby5zcmNPYmo9YXJnc1sxXTsKK2FvLnNyY0Z1bmM9YXJnc1syXTsKK2FvLmFkdmljZU9iaj1hcmdzWzNdOworYW8uYWR2aWNlRnVuYz1hcmdzWzRdOworYW8uYXJvdW5kRnVuYz1hcmdzWzVdOworYW8uYXJvdW5kT2JqPWRqX2dsb2JhbDsKK2JyZWFrOworZGVmYXVsdDoKK2FvLnNyY09iaj1hcmdzWzFdOworYW8uc3JjRnVuYz1hcmdzWzJdOworYW8uYWR2aWNlT2JqPWFyZ3NbM107Cithby5hZHZpY2VGdW5jPWFyZ3NbNF07Cithby5hcm91bmRPYmo9YXJnc1s1XTsKK2FvLmFyb3VuZEZ1bmM9YXJnc1s2XTsKK2FvLm9uY2U9YXJnc1s3XTsKK2FvLmRlbGF5PWFyZ3NbOF07Cithby5yYXRlPWFyZ3NbOV07Cithby5hZHZpY2VNc2c9YXJnc1sxMF07Cithby5tYXhDYWxscz0oIWlzTmFOKHBhcnNlSW50KGFyZ3NbMTFdKSkpP2FyZ3NbMTFdOi0xOworYnJlYWs7Cit9CitpZihkbC5pc0Z1bmN0aW9uKGFvLmFyb3VuZEZ1bmMpKXsKK3ZhciBfMmY2PWRsLm5hbWVBbm9uRnVuYyhhby5hcm91bmRGdW5jLGFvLmFyb3VuZE9iaixfMmYzKTsKK2FvLmFyb3VuZEZ1bmM9XzJmNjsKK30KK2lmKGRsLmlzRnVuY3Rpb24oYW8uc3JjRnVuYykpeworYW8uc3JjRnVuYz1kbC5nZXROYW1lSW5PYmooYW8uc3JjT2JqLGFvLnNyY0Z1bmMpOworfQoraWYoZGwuaXNGdW5jdGlvbihhby5hZHZpY2VGdW5jKSl7Cithby5hZHZpY2VGdW5jPWRsLmdldE5hbWVJbk9iaihhby5hZHZpY2VPYmosYW8uYWR2aWNlRnVuYyk7Cit9CitpZigoYW8uYXJvdW5kT2JqKSYmKGRsLmlzRnVuY3Rpb24oYW8uYXJvdW5kRnVuYykpKXsKK2FvLmFyb3VuZEZ1bmM9ZGwuZ2V0TmFtZUluT2JqKGFvLmFyb3VuZE9iaixhby5hcm91bmRGdW5jKTsKK30KK2lmKCFhby5zcmNPYmopeworZG9qby5yYWlzZSgiYmFkIHNyY09iaiBmb3Igc3JjRnVuYzogIithby5zcmNGdW5jKTsKK30KK2lmKCFhby5hZHZpY2VPYmopeworZG9qby5yYWlzZSgiYmFkIGFkdmljZU9iaiBmb3IgYWR2aWNlRnVuYzogIithby5hZHZpY2VGdW5jKTsKK30KK2lmKCFhby5hZHZpY2VGdW5jKXsKK2Rvam8uZGVidWcoImJhZCBhZHZpY2VGdW5jIGZvciBzcmNGdW5jOiAiK2FvLnNyY0Z1bmMpOworZG9qby5kZWJ1Z1NoYWxsb3coYW8pOworfQorcmV0dXJuIGFvOworfQordGhpcy5jb25uZWN0PWZ1bmN0aW9uKCl7CitpZihhcmd1bWVudHMubGVuZ3RoPT0xKXsKK3ZhciBhbz1hcmd1bWVudHNbMF07Cit9ZWxzZXsKK3ZhciBhbz1pbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLHRydWUpOworfQoraWYoZG9qby5sYW5nLmlzU3RyaW5nKGFvLnNyY0Z1bmMpJiYoYW8uc3JjRnVuYy50b0xvd2VyQ2FzZSgpPT0ib25rZXkiKSl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2FvLnNyY0Z1bmM9Im9ua2V5ZG93biI7Cit0aGlzLmNvbm5lY3QoYW8pOworfQorYW8uc3JjRnVuYz0ib25rZXlwcmVzcyI7Cit9CitpZihkb2pvLmxhbmcuaXNBcnJheShhby5zcmNPYmopJiZhby5zcmNPYmohPSIiKXsKK3ZhciBfMmY4PXt9OworZm9yKHZhciB4IGluIGFvKXsKK18yZjhbeF09YW9beF07Cit9Cit2YXIgbWpwcz1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKGFvLnNyY09iaixmdW5jdGlvbihzcmMpeworaWYoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkmJihkb2pvLmxhbmcuaXNTdHJpbmcoc3JjKSkpeworc3JjPWRvam8uYnlJZChzcmMpOworfQorXzJmOC5zcmNPYmo9c3JjOworbWpwcy5wdXNoKGRvam8uZXZlbnQuY29ubmVjdC5jYWxsKGRvam8uZXZlbnQsXzJmOCkpOworfSk7CityZXR1cm4gbWpwczsKK30KK3ZhciBtanA9ZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaixhby5zcmNGdW5jKTsKK2lmKGFvLmFkdmljZUZ1bmMpewordmFyIG1qcDI9ZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLmFkdmljZU9iaixhby5hZHZpY2VGdW5jKTsKK30KK21qcC5rd0FkZEFkdmljZShhbyk7CityZXR1cm4gbWpwOworfTsKK3RoaXMubG9nPWZ1bmN0aW9uKGExLGEyKXsKK3ZhciBfMzAwOworaWYoKGFyZ3VtZW50cy5sZW5ndGg9PTEpJiYodHlwZW9mIGExPT0ib2JqZWN0IikpeworXzMwMD1hMTsKK31lbHNleworXzMwMD17c3JjT2JqOmExLHNyY0Z1bmM6YTJ9OworfQorXzMwMC5hZHZpY2VGdW5jPWZ1bmN0aW9uKCl7Cit2YXIgXzMwMT1bXTsKK2Zvcih2YXIgeD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspeworXzMwMS5wdXNoKGFyZ3VtZW50c1t4XSk7Cit9Citkb2pvLmRlYnVnKCIoIitfMzAwLnNyY09iaisiKS4iK18zMDAuc3JjRnVuYywiOiIsXzMwMS5qb2luKCIsICIpKTsKK307Cit0aGlzLmt3Q29ubmVjdChfMzAwKTsKK307Cit0aGlzLmNvbm5lY3RCZWZvcmU9ZnVuY3Rpb24oKXsKK3ZhciBhcmdzPVsiYmVmb3JlIl07Citmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2FyZ3MucHVzaChhcmd1bWVudHNbaV0pOworfQorcmV0dXJuIHRoaXMuY29ubmVjdC5hcHBseSh0aGlzLGFyZ3MpOworfTsKK3RoaXMuY29ubmVjdEFyb3VuZD1mdW5jdGlvbigpewordmFyIGFyZ3M9WyJhcm91bmQiXTsKK2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspeworYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7Cit9CityZXR1cm4gdGhpcy5jb25uZWN0LmFwcGx5KHRoaXMsYXJncyk7Cit9OwordGhpcy5jb25uZWN0T25jZT1mdW5jdGlvbigpewordmFyIGFvPWludGVycG9sYXRlQXJncyhhcmd1bWVudHMsdHJ1ZSk7Cithby5vbmNlPXRydWU7CityZXR1cm4gdGhpcy5jb25uZWN0KGFvKTsKK307Cit0aGlzLmNvbm5lY3RSdW5PbmNlPWZ1bmN0aW9uKCl7Cit2YXIgYW89aW50ZXJwb2xhdGVBcmdzKGFyZ3VtZW50cyx0cnVlKTsKK2FvLm1heENhbGxzPTE7CityZXR1cm4gdGhpcy5jb25uZWN0KGFvKTsKK307Cit0aGlzLl9rd0Nvbm5lY3RJbXBsPWZ1bmN0aW9uKF8zMDksXzMwYSl7Cit2YXIgZm49KF8zMGEpPyJkaXNjb25uZWN0IjoiY29ubmVjdCI7CitpZih0eXBlb2YgXzMwOVsic3JjRnVuYyJdPT0iZnVuY3Rpb24iKXsKK18zMDkuc3JjT2JqPV8zMDlbInNyY09iaiJdfHxkal9nbG9iYWw7Cit2YXIgXzMwYz1kb2pvLmxhbmcubmFtZUFub25GdW5jKF8zMDkuc3JjRnVuYyxfMzA5LnNyY09iaix0cnVlKTsKK18zMDkuc3JjRnVuYz1fMzBjOworfQoraWYodHlwZW9mIF8zMDlbImFkdmljZUZ1bmMiXT09ImZ1bmN0aW9uIil7CitfMzA5LmFkdmljZU9iaj1fMzA5WyJhZHZpY2VPYmoiXXx8ZGpfZ2xvYmFsOwordmFyIF8zMGM9ZG9qby5sYW5nLm5hbWVBbm9uRnVuYyhfMzA5LmFkdmljZUZ1bmMsXzMwOS5hZHZpY2VPYmosdHJ1ZSk7CitfMzA5LmFkdmljZUZ1bmM9XzMwYzsKK30KK18zMDkuc3JjT2JqPV8zMDlbInNyY09iaiJdfHxkal9nbG9iYWw7CitfMzA5LmFkdmljZU9iaj1fMzA5WyJhZHZpY2VPYmoiXXx8XzMwOVsidGFyZ2V0T2JqIl18fGRqX2dsb2JhbDsKK18zMDkuYWR2aWNlRnVuYz1fMzA5WyJhZHZpY2VGdW5jIl18fF8zMDlbInRhcmdldEZ1bmMiXTsKK3JldHVybiBkb2pvLmV2ZW50W2ZuXShfMzA5KTsKK307Cit0aGlzLmt3Q29ubmVjdD1mdW5jdGlvbihfMzBkKXsKK3JldHVybiB0aGlzLl9rd0Nvbm5lY3RJbXBsKF8zMGQsZmFsc2UpOworfTsKK3RoaXMuZGlzY29ubmVjdD1mdW5jdGlvbigpeworaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7Cit2YXIgYW89YXJndW1lbnRzWzBdOworfWVsc2V7Cit2YXIgYW89aW50ZXJwb2xhdGVBcmdzKGFyZ3VtZW50cyx0cnVlKTsKK30KK2lmKCFhby5hZHZpY2VGdW5jKXsKK3JldHVybjsKK30KK2lmKGRvam8ubGFuZy5pc1N0cmluZyhhby5zcmNGdW5jKSYmKGFvLnNyY0Z1bmMudG9Mb3dlckNhc2UoKT09Im9ua2V5IikpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cithby5zcmNGdW5jPSJvbmtleWRvd24iOwordGhpcy5kaXNjb25uZWN0KGFvKTsKK30KK2FvLnNyY0Z1bmM9Im9ua2V5cHJlc3MiOworfQoraWYoIWFvLnNyY09ialthby5zcmNGdW5jXSl7CityZXR1cm4gbnVsbDsKK30KK3ZhciBtanA9ZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaixhby5zcmNGdW5jLHRydWUpOworbWpwLnJlbW92ZUFkdmljZShhby5hZHZpY2VPYmosYW8uYWR2aWNlRnVuYyxhby5hZHZpY2VUeXBlLGFvLm9uY2UpOworcmV0dXJuIG1qcDsKK307Cit0aGlzLmt3RGlzY29ubmVjdD1mdW5jdGlvbihfMzEwKXsKK3JldHVybiB0aGlzLl9rd0Nvbm5lY3RJbXBsKF8zMTAsdHJ1ZSk7Cit9OworfTsKK2Rvam8uZXZlbnQuTWV0aG9kSW52b2NhdGlvbj1mdW5jdGlvbihfMzExLG9iaixhcmdzKXsKK3RoaXMuanBfPV8zMTE7Cit0aGlzLm9iamVjdD1vYmo7Cit0aGlzLmFyZ3M9W107Citmb3IodmFyIHg9MDt4PGFyZ3MubGVuZ3RoO3grKyl7Cit0aGlzLmFyZ3NbeF09YXJnc1t4XTsKK30KK3RoaXMuYXJvdW5kX2luZGV4PS0xOworfTsKK2Rvam8uZXZlbnQuTWV0aG9kSW52b2NhdGlvbi5wcm90b3R5cGUucHJvY2VlZD1mdW5jdGlvbigpewordGhpcy5hcm91bmRfaW5kZXgrKzsKK2lmKHRoaXMuYXJvdW5kX2luZGV4Pj10aGlzLmpwXy5hcm91bmQubGVuZ3RoKXsKK3JldHVybiB0aGlzLmpwXy5vYmplY3RbdGhpcy5qcF8ubWV0aG9kbmFtZV0uYXBwbHkodGhpcy5qcF8ub2JqZWN0LHRoaXMuYXJncyk7Cit9ZWxzZXsKK3ZhciB0aT10aGlzLmpwXy5hcm91bmRbdGhpcy5hcm91bmRfaW5kZXhdOwordmFyIG1vYmo9dGlbMF18fGRqX2dsb2JhbDsKK3ZhciBtZXRoPXRpWzFdOworcmV0dXJuIG1vYmpbbWV0aF0uY2FsbChtb2JqLHRoaXMpOworfQorfTsKK2Rvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50PWZ1bmN0aW9uKG9iaixfMzE5KXsKK3RoaXMub2JqZWN0PW9ianx8ZGpfZ2xvYmFsOwordGhpcy5tZXRob2RuYW1lPV8zMTk7Cit0aGlzLm1ldGhvZGZ1bmM9dGhpcy5vYmplY3RbXzMxOV07Cit0aGlzLnNxdWVsY2g9ZmFsc2U7Cit9OworZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kPWZ1bmN0aW9uKG9iaixfMzFiKXsKK2lmKCFvYmopeworb2JqPWRqX2dsb2JhbDsKK30KK3ZhciBvZm49b2JqW18zMWJdOworaWYoIW9mbil7CitvZm49b2JqW18zMWJdPWZ1bmN0aW9uKCl7Cit9OworaWYoIW9ialtfMzFiXSl7Citkb2pvLnJhaXNlKCJDYW5ub3Qgc2V0IGRvLW5vdGhpbmcgbWV0aG9kIG9uIHRoYXQgb2JqZWN0ICIrXzMxYik7Cit9Cit9ZWxzZXsKK2lmKCh0eXBlb2Ygb2ZuIT0iZnVuY3Rpb24iKSYmKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihvZm4pKSYmKCFkb2pvLmxhbmcuaXNBbGllbihvZm4pKSl7CityZXR1cm4gbnVsbDsKK30KK30KK3ZhciBfMzFkPV8zMWIrIiRqb2lucG9pbnQiOwordmFyIF8zMWU9XzMxYisiJGpvaW5wb2ludCRtZXRob2QiOwordmFyIF8zMWY9b2JqW18zMWRdOworaWYoIV8zMWYpewordmFyIF8zMjA9ZmFsc2U7CitpZihkb2pvLmV2ZW50WyJicm93c2VyIl0peworaWYoKG9ialsiYXR0YWNoRXZlbnQiXSl8fChvYmpbIm5vZGVUeXBlIl0pfHwob2JqWyJhZGRFdmVudExpc3RlbmVyIl0pKXsKK18zMjA9dHJ1ZTsKK2Rvam8uZXZlbnQuYnJvd3Nlci5hZGRDbG9iYmVyTm9kZUF0dHJzKG9iaixbXzMxZCxfMzFlLF8zMWJdKTsKK30KK30KK3ZhciBfMzIxPW9mbi5sZW5ndGg7CitvYmpbXzMxZV09b2ZuOworXzMxZj1vYmpbXzMxZF09bmV3IGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50KG9iaixfMzFlKTsKK2lmKCFfMzIwKXsKK29ialtfMzFiXT1mdW5jdGlvbigpeworcmV0dXJuIF8zMWYucnVuLmFwcGx5KF8zMWYsYXJndW1lbnRzKTsKK307Cit9ZWxzZXsKK29ialtfMzFiXT1mdW5jdGlvbigpewordmFyIGFyZ3M9W107CitpZighYXJndW1lbnRzLmxlbmd0aCl7Cit2YXIgZXZ0PW51bGw7Cit0cnl7CitpZihvYmoub3duZXJEb2N1bWVudCl7CitldnQ9b2JqLm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93LmV2ZW50OworfWVsc2V7CitpZihvYmouZG9jdW1lbnRFbGVtZW50KXsKK2V2dD1vYmouZG9jdW1lbnRFbGVtZW50Lm93bmVyRG9jdW1lbnQucGFyZW50V2luZG93LmV2ZW50OworfWVsc2V7CitpZihvYmouZXZlbnQpeworZXZ0PW9iai5ldmVudDsKK31lbHNleworZXZ0PXdpbmRvdy5ldmVudDsKK30KK30KK30KK30KK2NhdGNoKGUpeworZXZ0PXdpbmRvdy5ldmVudDsKK30KK2lmKGV2dCl7CithcmdzLnB1c2goZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCx0aGlzKSk7Cit9Cit9ZWxzZXsKK2Zvcih2YXIgeD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspeworaWYoKHg9PTApJiYoZG9qby5ldmVudC5icm93c2VyLmlzRXZlbnQoYXJndW1lbnRzW3hdKSkpeworYXJncy5wdXNoKGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudChhcmd1bWVudHNbeF0sdGhpcykpOworfWVsc2V7CithcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKK30KK30KK30KK3JldHVybiBfMzFmLnJ1bi5hcHBseShfMzFmLGFyZ3MpOworfTsKK30KK29ialtfMzFiXS5fX3ByZUpvaW5Bcml0eT1fMzIxOworfQorcmV0dXJuIF8zMWY7Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludCx7c3F1ZWxjaDpmYWxzZSx1bmludGVyY2VwdDpmdW5jdGlvbigpewordGhpcy5vYmplY3RbdGhpcy5tZXRob2RuYW1lXT10aGlzLm1ldGhvZGZ1bmM7Cit0aGlzLmJlZm9yZT1bXTsKK3RoaXMuYWZ0ZXI9W107Cit0aGlzLmFyb3VuZD1bXTsKK30sZGlzY29ubmVjdDpkb2pvLmxhbmcuZm9yd2FyZCgidW5pbnRlcmNlcHQiKSxydW46ZnVuY3Rpb24oKXsKK3ZhciBvYmo9dGhpcy5vYmplY3R8fGRqX2dsb2JhbDsKK3ZhciBhcmdzPWFyZ3VtZW50czsKK3ZhciBfMzI3PVtdOworZm9yKHZhciB4PTA7eDxhcmdzLmxlbmd0aDt4KyspeworXzMyN1t4XT1hcmdzW3hdOworfQordmFyIF8zMjk9ZnVuY3Rpb24obWFycil7CitpZighbWFycil7Citkb2pvLmRlYnVnKCJOdWxsIGFyZ3VtZW50IHRvIHVucm9sbEFkdmljZSgpIik7CityZXR1cm47Cit9Cit2YXIgXzMyYj1tYXJyWzBdfHxkal9nbG9iYWw7Cit2YXIgXzMyYz1tYXJyWzFdOworaWYoIV8zMmJbXzMyY10peworZG9qby5yYWlzZSgiZnVuY3Rpb24gXCIiK18zMmMrIlwiIGRvZXMgbm90IGV4aXN0IG9uIFwiIitfMzJiKyJcIiIpOworfQordmFyIF8zMmQ9bWFyclsyXXx8ZGpfZ2xvYmFsOwordmFyIF8zMmU9bWFyclszXTsKK3ZhciBtc2c9bWFycls2XTsKK3ZhciBfMzMwPW1hcnJbN107CitpZihfMzMwPi0xKXsKK2lmKF8zMzA9PTApeworcmV0dXJuOworfQorbWFycls3XS0tOworfQordmFyIF8zMzE7Cit2YXIgdG89e2FyZ3M6W10sanBfOnRoaXMsb2JqZWN0Om9iaixwcm9jZWVkOmZ1bmN0aW9uKCl7CityZXR1cm4gXzMyYltfMzJjXS5hcHBseShfMzJiLHRvLmFyZ3MpOworfX07Cit0by5hcmdzPV8zMjc7Cit2YXIgXzMzMz1wYXJzZUludChtYXJyWzRdKTsKK3ZhciBfMzM0PSgoIWlzTmFOKF8zMzMpKSYmKG1hcnJbNF0hPT1udWxsKSYmKHR5cGVvZiBtYXJyWzRdIT0idW5kZWZpbmVkIikpOworaWYobWFycls1XSl7Cit2YXIgcmF0ZT1wYXJzZUludChtYXJyWzVdKTsKK3ZhciBjdXI9bmV3IERhdGUoKTsKK3ZhciBfMzM3PWZhbHNlOworaWYoKG1hcnJbImxhc3QiXSkmJigoY3VyLW1hcnIubGFzdCk8PXJhdGUpKXsKK2lmKGRvam8uZXZlbnQuX2NhblRpbWVvdXQpeworaWYobWFyclsiZGVsYXlUaW1lciJdKXsKK2NsZWFyVGltZW91dChtYXJyLmRlbGF5VGltZXIpOworfQordmFyIHRvZD1wYXJzZUludChyYXRlKjIpOwordmFyIG1jcHk9ZG9qby5sYW5nLnNoYWxsb3dDb3B5KG1hcnIpOworbWFyci5kZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKK21jcHlbNV09MDsKK18zMjkobWNweSk7Cit9LHRvZCk7Cit9CityZXR1cm47Cit9ZWxzZXsKK21hcnIubGFzdD1jdXI7Cit9Cit9CitpZihfMzJlKXsKK18zMmRbXzMyZV0uY2FsbChfMzJkLHRvKTsKK31lbHNleworaWYoKF8zMzQpJiYoKGRvam8ucmVuZGVyLmh0bWwpfHwoZG9qby5yZW5kZXIuc3ZnKSkpeworZGpfZ2xvYmFsWyJzZXRUaW1lb3V0Il0oZnVuY3Rpb24oKXsKK2lmKG1zZyl7CitfMzJiW18zMmNdLmNhbGwoXzMyYix0byk7Cit9ZWxzZXsKK18zMmJbXzMyY10uYXBwbHkoXzMyYixhcmdzKTsKK30KK30sXzMzMyk7Cit9ZWxzZXsKK2lmKG1zZyl7CitfMzJiW18zMmNdLmNhbGwoXzMyYix0byk7Cit9ZWxzZXsKK18zMmJbXzMyY10uYXBwbHkoXzMyYixhcmdzKTsKK30KK30KK30KK307Cit2YXIgXzMzYT1mdW5jdGlvbigpeworaWYodGhpcy5zcXVlbGNoKXsKK3RyeXsKK3JldHVybiBfMzI5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK31lbHNleworcmV0dXJuIF8zMjkuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorfTsKK2lmKCh0aGlzWyJiZWZvcmUiXSkmJih0aGlzLmJlZm9yZS5sZW5ndGg+MCkpeworZG9qby5sYW5nLmZvckVhY2godGhpcy5iZWZvcmUuY29uY2F0KG5ldyBBcnJheSgpKSxfMzNhKTsKK30KK3ZhciBfMzNiOwordHJ5eworaWYoKHRoaXNbImFyb3VuZCJdKSYmKHRoaXMuYXJvdW5kLmxlbmd0aD4wKSl7Cit2YXIgbWk9bmV3IGRvam8uZXZlbnQuTWV0aG9kSW52b2NhdGlvbih0aGlzLG9iaixhcmdzKTsKK18zM2I9bWkucHJvY2VlZCgpOworfWVsc2V7CitpZih0aGlzLm1ldGhvZGZ1bmMpeworXzMzYj10aGlzLm9iamVjdFt0aGlzLm1ldGhvZG5hbWVdLmFwcGx5KHRoaXMub2JqZWN0LGFyZ3MpOworfQorfQorfQorY2F0Y2goZSl7CitpZighdGhpcy5zcXVlbGNoKXsKK2Rvam8uZGVidWcoZSwid2hlbiBjYWxsaW5nIix0aGlzLm1ldGhvZG5hbWUsIm9uIix0aGlzLm9iamVjdCwid2l0aCBhcmd1bWVudHMiLGFyZ3MpOworZG9qby5yYWlzZShlKTsKK30KK30KK2lmKCh0aGlzWyJhZnRlciJdKSYmKHRoaXMuYWZ0ZXIubGVuZ3RoPjApKXsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuYWZ0ZXIuY29uY2F0KG5ldyBBcnJheSgpKSxfMzNhKTsKK30KK3JldHVybiAodGhpcy5tZXRob2RmdW5jKT9fMzNiOm51bGw7Cit9LGdldEFycjpmdW5jdGlvbihraW5kKXsKK3ZhciB0eXBlPSJhZnRlciI7CitpZigodHlwZW9mIGtpbmQ9PSJzdHJpbmciKSYmKGtpbmQuaW5kZXhPZigiYmVmb3JlIikhPS0xKSl7Cit0eXBlPSJiZWZvcmUiOworfWVsc2V7CitpZihraW5kPT0iYXJvdW5kIil7Cit0eXBlPSJhcm91bmQiOworfQorfQoraWYoIXRoaXNbdHlwZV0pewordGhpc1t0eXBlXT1bXTsKK30KK3JldHVybiB0aGlzW3R5cGVdOworfSxrd0FkZEFkdmljZTpmdW5jdGlvbihhcmdzKXsKK3RoaXMuYWRkQWR2aWNlKGFyZ3NbImFkdmljZU9iaiJdLGFyZ3NbImFkdmljZUZ1bmMiXSxhcmdzWyJhcm91bmRPYmoiXSxhcmdzWyJhcm91bmRGdW5jIl0sYXJnc1siYWR2aWNlVHlwZSJdLGFyZ3NbInByZWNlZGVuY2UiXSxhcmdzWyJvbmNlIl0sYXJnc1siZGVsYXkiXSxhcmdzWyJyYXRlIl0sYXJnc1siYWR2aWNlTXNnIl0sYXJnc1sibWF4Q2FsbHMiXSk7Cit9LGFkZEFkdmljZTpmdW5jdGlvbihfMzQwLF8zNDEsXzM0MixfMzQzLF8zNDQsXzM0NSxvbmNlLF8zNDcscmF0ZSxfMzQ5LF8zNGEpewordmFyIGFycj10aGlzLmdldEFycihfMzQ0KTsKK2lmKCFhcnIpeworZG9qby5yYWlzZSgiYmFkIHRoaXM6ICIrdGhpcyk7Cit9Cit2YXIgYW89W18zNDAsXzM0MSxfMzQyLF8zNDMsXzM0NyxyYXRlLF8zNDksXzM0YV07CitpZihvbmNlKXsKK2lmKHRoaXMuaGFzQWR2aWNlKF8zNDAsXzM0MSxfMzQ0LGFycik+PTApeworcmV0dXJuOworfQorfQoraWYoXzM0NT09ImZpcnN0Iil7CithcnIudW5zaGlmdChhbyk7Cit9ZWxzZXsKK2Fyci5wdXNoKGFvKTsKK30KK30saGFzQWR2aWNlOmZ1bmN0aW9uKF8zNGQsXzM0ZSxfMzRmLGFycil7CitpZighYXJyKXsKK2Fycj10aGlzLmdldEFycihfMzRmKTsKK30KK3ZhciBpbmQ9LTE7Citmb3IodmFyIHg9MDt4PGFyci5sZW5ndGg7eCsrKXsKK3ZhciBhYW89KHR5cGVvZiBfMzRlPT0ib2JqZWN0Iik/KG5ldyBTdHJpbmcoXzM0ZSkpLnRvU3RyaW5nKCk6XzM0ZTsKK3ZhciBhMW89KHR5cGVvZiBhcnJbeF1bMV09PSJvYmplY3QiKT8obmV3IFN0cmluZyhhcnJbeF1bMV0pKS50b1N0cmluZygpOmFyclt4XVsxXTsKK2lmKChhcnJbeF1bMF09PV8zNGQpJiYoYTFvPT1hYW8pKXsKK2luZD14OworfQorfQorcmV0dXJuIGluZDsKK30scmVtb3ZlQWR2aWNlOmZ1bmN0aW9uKF8zNTUsXzM1NixfMzU3LG9uY2UpewordmFyIGFycj10aGlzLmdldEFycihfMzU3KTsKK3ZhciBpbmQ9dGhpcy5oYXNBZHZpY2UoXzM1NSxfMzU2LF8zNTcsYXJyKTsKK2lmKGluZD09LTEpeworcmV0dXJuIGZhbHNlOworfQord2hpbGUoaW5kIT0tMSl7CithcnIuc3BsaWNlKGluZCwxKTsKK2lmKG9uY2UpeworYnJlYWs7Cit9CitpbmQ9dGhpcy5oYXNBZHZpY2UoXzM1NSxfMzU2LF8zNTcsYXJyKTsKK30KK3JldHVybiB0cnVlOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLmV2ZW50LnRvcGljIik7Citkb2pvLmV2ZW50LnRvcGljPW5ldyBmdW5jdGlvbigpewordGhpcy50b3BpY3M9e307Cit0aGlzLmdldFRvcGljPWZ1bmN0aW9uKF8zNWIpeworaWYoIXRoaXMudG9waWNzW18zNWJdKXsKK3RoaXMudG9waWNzW18zNWJdPW5ldyB0aGlzLlRvcGljSW1wbChfMzViKTsKK30KK3JldHVybiB0aGlzLnRvcGljc1tfMzViXTsKK307Cit0aGlzLnJlZ2lzdGVyUHVibGlzaGVyPWZ1bmN0aW9uKF8zNWMsb2JqLF8zNWUpewordmFyIF8zNWM9dGhpcy5nZXRUb3BpYyhfMzVjKTsKK18zNWMucmVnaXN0ZXJQdWJsaXNoZXIob2JqLF8zNWUpOworfTsKK3RoaXMuc3Vic2NyaWJlPWZ1bmN0aW9uKF8zNWYsb2JqLF8zNjEpewordmFyIF8zNWY9dGhpcy5nZXRUb3BpYyhfMzVmKTsKK18zNWYuc3Vic2NyaWJlKG9iaixfMzYxKTsKK307Cit0aGlzLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKF8zNjIsb2JqLF8zNjQpewordmFyIF8zNjI9dGhpcy5nZXRUb3BpYyhfMzYyKTsKK18zNjIudW5zdWJzY3JpYmUob2JqLF8zNjQpOworfTsKK3RoaXMuZGVzdHJveT1mdW5jdGlvbihfMzY1KXsKK3RoaXMuZ2V0VG9waWMoXzM2NSkuZGVzdHJveSgpOworZGVsZXRlIHRoaXMudG9waWNzW18zNjVdOworfTsKK3RoaXMucHVibGlzaEFwcGx5PWZ1bmN0aW9uKF8zNjYsYXJncyl7Cit2YXIgXzM2Nj10aGlzLmdldFRvcGljKF8zNjYpOworXzM2Ni5zZW5kTWVzc2FnZS5hcHBseShfMzY2LGFyZ3MpOworfTsKK3RoaXMucHVibGlzaD1mdW5jdGlvbihfMzY4LF8zNjkpewordmFyIF8zNjg9dGhpcy5nZXRUb3BpYyhfMzY4KTsKK3ZhciBhcmdzPVtdOworZm9yKHZhciB4PTE7eDxhcmd1bWVudHMubGVuZ3RoO3grKyl7CithcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKK30KK18zNjguc2VuZE1lc3NhZ2UuYXBwbHkoXzM2OCxhcmdzKTsKK307Cit9OworZG9qby5ldmVudC50b3BpYy5Ub3BpY0ltcGw9ZnVuY3Rpb24oXzM2Yyl7Cit0aGlzLnRvcGljTmFtZT1fMzZjOwordGhpcy5zdWJzY3JpYmU9ZnVuY3Rpb24oXzM2ZCxfMzZlKXsKK3ZhciB0Zj1fMzZlfHxfMzZkOwordmFyIHRvPSghXzM2ZSk/ZGpfZ2xvYmFsOl8zNmQ7CityZXR1cm4gZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajp0aGlzLHNyY0Z1bmM6InNlbmRNZXNzYWdlIixhZHZpY2VPYmo6dG8sYWR2aWNlRnVuYzp0Zn0pOworfTsKK3RoaXMudW5zdWJzY3JpYmU9ZnVuY3Rpb24oXzM3MSxfMzcyKXsKK3ZhciB0Zj0oIV8zNzIpP18zNzE6XzM3MjsKK3ZhciB0bz0oIV8zNzIpP251bGw6XzM3MTsKK3JldHVybiBkb2pvLmV2ZW50Lmt3RGlzY29ubmVjdCh7c3JjT2JqOnRoaXMsc3JjRnVuYzoic2VuZE1lc3NhZ2UiLGFkdmljZU9iajp0byxhZHZpY2VGdW5jOnRmfSk7Cit9OwordGhpcy5fZ2V0Sm9pblBvaW50PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKHRoaXMsInNlbmRNZXNzYWdlIik7Cit9OwordGhpcy5zZXRTcXVlbGNoPWZ1bmN0aW9uKF8zNzUpewordGhpcy5fZ2V0Sm9pblBvaW50KCkuc3F1ZWxjaD1fMzc1OworfTsKK3RoaXMuZGVzdHJveT1mdW5jdGlvbigpewordGhpcy5fZ2V0Sm9pblBvaW50KCkuZGlzY29ubmVjdCgpOworfTsKK3RoaXMucmVnaXN0ZXJQdWJsaXNoZXI9ZnVuY3Rpb24oXzM3NixfMzc3KXsKK2Rvam8uZXZlbnQuY29ubmVjdChfMzc2LF8zNzcsdGhpcywic2VuZE1lc3NhZ2UiKTsKK307Cit0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKF8zNzgpeworfTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuYnJvd3NlciIpOworZG9qby5faWVfY2xvYmJlcj1uZXcgZnVuY3Rpb24oKXsKK3RoaXMuY2xvYmJlck5vZGVzPVtdOworZnVuY3Rpb24gbnVrZVByb3Aobm9kZSxwcm9wKXsKK3RyeXsKK25vZGVbcHJvcF09bnVsbDsKK30KK2NhdGNoKGUpeworfQordHJ5eworZGVsZXRlIG5vZGVbcHJvcF07Cit9CitjYXRjaChlKXsKK30KK3RyeXsKK25vZGUucmVtb3ZlQXR0cmlidXRlKHByb3ApOworfQorY2F0Y2goZSl7Cit9Cit9Cit0aGlzLmNsb2JiZXI9ZnVuY3Rpb24oXzM3Yil7Cit2YXIgbmE7Cit2YXIgdG5hOworaWYoXzM3Yil7Cit0bmE9XzM3Yi5hbGx8fF8zN2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKK25hPVtfMzdiXTsKK2Zvcih2YXIgeD0wO3g8dG5hLmxlbmd0aDt4KyspeworaWYodG5hW3hdWyJfX2RvQ2xvYmJlcl9fIl0peworbmEucHVzaCh0bmFbeF0pOworfQorfQorfWVsc2V7Cit0cnl7Cit3aW5kb3cub25sb2FkPW51bGw7Cit9CitjYXRjaChlKXsKK30KK25hPSh0aGlzLmNsb2JiZXJOb2Rlcy5sZW5ndGgpP3RoaXMuY2xvYmJlck5vZGVzOmRvY3VtZW50LmFsbDsKK30KK3RuYT1udWxsOwordmFyIF8zN2Y9e307Citmb3IodmFyIGk9bmEubGVuZ3RoLTE7aT49MDtpPWktMSl7Cit2YXIgZWw9bmFbaV07Cit0cnl7CitpZihlbCYmZWxbIl9fY2xvYmJlckF0dHJzX18iXSl7Citmb3IodmFyIGo9MDtqPGVsLl9fY2xvYmJlckF0dHJzX18ubGVuZ3RoO2orKyl7CitudWtlUHJvcChlbCxlbC5fX2Nsb2JiZXJBdHRyc19fW2pdKTsKK30KK251a2VQcm9wKGVsLCJfX2Nsb2JiZXJBdHRyc19fIik7CitudWtlUHJvcChlbCwiX19kb0Nsb2JiZXJfXyIpOworfQorfQorY2F0Y2goZSl7Cit9Cit9CituYT1udWxsOworfTsKK307CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uYWRkT25VbmxvYWQoZnVuY3Rpb24oKXsKK2Rvam8uX2llX2Nsb2JiZXIuY2xvYmJlcigpOwordHJ5eworaWYoKGRvam9bIndpZGdldCJdKSYmKGRvam8ud2lkZ2V0WyJtYW5hZ2VyIl0pKXsKK2Rvam8ud2lkZ2V0Lm1hbmFnZXIuZGVzdHJveUFsbCgpOworfQorfQorY2F0Y2goZSl7Cit9CitpZihkb2pvLndpZGdldCl7Citmb3IodmFyIG5hbWUgaW4gZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGUpeworaWYoZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZSl7Citkb2pvLmRvbS5kZXN0cm95Tm9kZShkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVtuYW1lXS5ub2RlKTsKK2Rvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGU9bnVsbDsKK2RlbGV0ZSBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVtuYW1lXS5ub2RlOworfQorfQorfQordHJ5eword2luZG93Lm9ubG9hZD1udWxsOworfQorY2F0Y2goZSl7Cit9Cit0cnl7Cit3aW5kb3cub251bmxvYWQ9bnVsbDsKK30KK2NhdGNoKGUpeworfQorZG9qby5faWVfY2xvYmJlci5jbG9iYmVyTm9kZXM9W107Cit9KTsKK30KK2Rvam8uZXZlbnQuYnJvd3Nlcj1uZXcgZnVuY3Rpb24oKXsKK3ZhciBfMzg0PTA7Cit0aGlzLm5vcm1hbGl6ZWRFdmVudE5hbWU9ZnVuY3Rpb24oXzM4NSl7Citzd2l0Y2goXzM4NSl7CitjYXNlICJDaGVja2JveFN0YXRlQ2hhbmdlIjoKK2Nhc2UgIkRPTUF0dHJNb2RpZmllZCI6CitjYXNlICJET01NZW51SXRlbUFjdGl2ZSI6CitjYXNlICJET01NZW51SXRlbUluYWN0aXZlIjoKK2Nhc2UgIkRPTU1vdXNlU2Nyb2xsIjoKK2Nhc2UgIkRPTU5vZGVJbnNlcnRlZCI6CitjYXNlICJET01Ob2RlUmVtb3ZlZCI6CitjYXNlICJSYWRpb1N0YXRlQ2hhbmdlIjoKK3JldHVybiBfMzg1OworYnJlYWs7CitkZWZhdWx0OgordmFyIGxjbj1fMzg1LnRvTG93ZXJDYXNlKCk7CityZXR1cm4gKGxjbi5pbmRleE9mKCJvbiIpPT0wKT9sY24uc3Vic3RyKDIpOmxjbjsKK2JyZWFrOworfQorfTsKK3RoaXMuY2xlYW49ZnVuY3Rpb24obm9kZSl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uX2llX2Nsb2JiZXIuY2xvYmJlcihub2RlKTsKK30KK307Cit0aGlzLmFkZENsb2JiZXJOb2RlPWZ1bmN0aW9uKG5vZGUpeworaWYoIWRvam8ucmVuZGVyLmh0bWwuaWUpeworcmV0dXJuOworfQoraWYoIW5vZGVbIl9fZG9DbG9iYmVyX18iXSl7Citub2RlLl9fZG9DbG9iYmVyX189dHJ1ZTsKK2Rvam8uX2llX2Nsb2JiZXIuY2xvYmJlck5vZGVzLnB1c2gobm9kZSk7Citub2RlLl9fY2xvYmJlckF0dHJzX189W107Cit9Cit9OwordGhpcy5hZGRDbG9iYmVyTm9kZUF0dHJzPWZ1bmN0aW9uKG5vZGUsXzM4YSl7CitpZighZG9qby5yZW5kZXIuaHRtbC5pZSl7CityZXR1cm47Cit9Cit0aGlzLmFkZENsb2JiZXJOb2RlKG5vZGUpOworZm9yKHZhciB4PTA7eDxfMzhhLmxlbmd0aDt4Kyspeworbm9kZS5fX2Nsb2JiZXJBdHRyc19fLnB1c2goXzM4YVt4XSk7Cit9Cit9OwordGhpcy5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihub2RlLF8zOGQsZnAsXzM4Zil7CitpZighXzM4Zil7Cit2YXIgXzM4Zj1mYWxzZTsKK30KK18zOGQ9ZG9qby5ldmVudC5icm93c2VyLm5vcm1hbGl6ZWRFdmVudE5hbWUoXzM4ZCk7CitpZihfMzhkPT0ia2V5Iil7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK3RoaXMucmVtb3ZlTGlzdGVuZXIobm9kZSwib25rZXlkb3duIixmcCxfMzhmKTsKK30KK18zOGQ9ImtleXByZXNzIjsKK30KK2lmKG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcil7Citub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXzM4ZCxmcCxfMzhmKTsKK30KK307Cit0aGlzLmFkZExpc3RlbmVyPWZ1bmN0aW9uKG5vZGUsXzM5MSxmcCxfMzkzLF8zOTQpeworaWYoIW5vZGUpeworcmV0dXJuOworfQoraWYoIV8zOTMpewordmFyIF8zOTM9ZmFsc2U7Cit9CitfMzkxPWRvam8uZXZlbnQuYnJvd3Nlci5ub3JtYWxpemVkRXZlbnROYW1lKF8zOTEpOworaWYoXzM5MT09ImtleSIpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit0aGlzLmFkZExpc3RlbmVyKG5vZGUsIm9ua2V5ZG93biIsZnAsXzM5MyxfMzk0KTsKK30KK18zOTE9ImtleXByZXNzIjsKK30KK2lmKCFfMzk0KXsKK3ZhciBfMzk1PWZ1bmN0aW9uKGV2dCl7CitpZighZXZ0KXsKK2V2dD13aW5kb3cuZXZlbnQ7Cit9Cit2YXIgcmV0PWZwKGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudChldnQsdGhpcykpOworaWYoXzM5Myl7Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Cit9CityZXR1cm4gcmV0OworfTsKK31lbHNleworXzM5NT1mcDsKK30KK2lmKG5vZGUuYWRkRXZlbnRMaXN0ZW5lcil7Citub2RlLmFkZEV2ZW50TGlzdGVuZXIoXzM5MSxfMzk1LF8zOTMpOworcmV0dXJuIF8zOTU7Cit9ZWxzZXsKK18zOTE9Im9uIitfMzkxOworaWYodHlwZW9mIG5vZGVbXzM5MV09PSJmdW5jdGlvbiIpewordmFyIF8zOTg9bm9kZVtfMzkxXTsKK25vZGVbXzM5MV09ZnVuY3Rpb24oZSl7CitfMzk4KGUpOworcmV0dXJuIF8zOTUoZSk7Cit9OworfWVsc2V7Citub2RlW18zOTFdPV8zOTU7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK3RoaXMuYWRkQ2xvYmJlck5vZGVBdHRycyhub2RlLFtfMzkxXSk7Cit9CityZXR1cm4gXzM5NTsKK30KK307Cit0aGlzLmlzRXZlbnQ9ZnVuY3Rpb24ob2JqKXsKK3JldHVybiAodHlwZW9mIG9iaiE9InVuZGVmaW5lZCIpJiYob2JqKSYmKHR5cGVvZiBFdmVudCE9InVuZGVmaW5lZCIpJiYob2JqLmV2ZW50UGhhc2UpOworfTsKK3RoaXMuY3VycmVudEV2ZW50PW51bGw7Cit0aGlzLmNhbGxMaXN0ZW5lcj1mdW5jdGlvbihfMzliLF8zOWMpeworaWYodHlwZW9mIF8zOWIhPSJmdW5jdGlvbiIpeworZG9qby5yYWlzZSgibGlzdGVuZXIgbm90IGEgZnVuY3Rpb246ICIrXzM5Yik7Cit9Citkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50LmN1cnJlbnRUYXJnZXQ9XzM5YzsKK3JldHVybiBfMzliLmNhbGwoXzM5Yyxkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50KTsKK307Cit0aGlzLl9zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQuY2FuY2VsQnViYmxlPXRydWU7Cit9OwordGhpcy5fcHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQucmV0dXJuVmFsdWU9ZmFsc2U7Cit9OwordGhpcy5rZXlzPXtLRVlfQkFDS1NQQUNFOjgsS0VZX1RBQjo5LEtFWV9DTEVBUjoxMixLRVlfRU5URVI6MTMsS0VZX1NISUZUOjE2LEtFWV9DVFJMOjE3LEtFWV9BTFQ6MTgsS0VZX1BBVVNFOjE5LEtFWV9DQVBTX0xPQ0s6MjAsS0VZX0VTQ0FQRToyNyxLRVlfU1BBQ0U6MzIsS0VZX1BBR0VfVVA6MzMsS0VZX1BBR0VfRE9XTjozNCxLRVlfRU5EOjM1LEtFWV9IT01FOjM2LEtFWV9MRUZUX0FSUk9XOjM3LEtFWV9VUF9BUlJPVzozOCxLRVlfUklHSFRfQVJST1c6MzksS0VZX0RPV05fQVJST1c6NDAsS0VZX0lOU0VSVDo0NSxLRVlfREVMRVRFOjQ2LEtFWV9IRUxQOjQ3LEtFWV9MRUZUX1dJTkRPVzo5MSxLRVlfUklHSFRfV0lORE9XOjkyLEtFWV9TRUxFQ1Q6OTMsS0VZX05VTVBBRF8wOjk2LEtFWV9OVU1QQURfMTo5NyxLRVlfTlVNUEFEXzI6OTgsS0VZX05VTVBBRF8zOjk5LEtFWV9OVU1QQURfNDoxMDAsS0VZX05VTVBBRF81OjEwMSxLRVlfTlVNUEFEXzY6MTAyLEtFWV9OVU1QQURfNzoxMDMsS0VZX05VTVBBRF84OjEwNCxLRVlfTlVNUEFEXzk6MTA1LEtFWV9OVU1QQURfTVVMVElQTFk6MTA2LEtFWV9OVU1QQURfUExVUzoxMDcsS0VZX05VTVBBRF9FTlRFUjoxMDgsS0VZX05VTVBBRF9NSU5VUzoxMDksS0VZX05VTVBBRF9QRVJJT0Q6MTEwLEtFWV9OVU1QQURfRElWSURFOjExMSxLRVlfRjE6MTEyLEtFWV9GMjoxMTMsS0VZX0YzOjExNCxLRVlfRjQ6MTE1LEtFWV9GNToxMTYsS0VZX0Y2OjExNyxLRVlfRjc6MTE4LEtFWV9GODoxMTksS0VZX0Y5OjEyMCxLRVlfRjEwOjEyMSxLRVlfRjExOjEyMixLRVlfRjEyOjEyMyxLRVlfRjEzOjEyNCxLRVlfRjE0OjEyNSxLRVlfRjE1OjEyNixLRVlfTlVNX0xPQ0s6MTQ0LEtFWV9TQ1JPTExfTE9DSzoxNDV9OwordGhpcy5yZXZLZXlzPVtdOworZm9yKHZhciBrZXkgaW4gdGhpcy5rZXlzKXsKK3RoaXMucmV2S2V5c1t0aGlzLmtleXNba2V5XV09a2V5OworfQordGhpcy5maXhFdmVudD1mdW5jdGlvbihldnQsXzM5Zil7CitpZighZXZ0KXsKK2lmKHdpbmRvd1siZXZlbnQiXSl7CitldnQ9d2luZG93LmV2ZW50OworfQorfQoraWYoKGV2dFsidHlwZSJdKSYmKGV2dFsidHlwZSJdLmluZGV4T2YoImtleSIpPT0wKSl7CitldnQua2V5cz10aGlzLnJldktleXM7Citmb3IodmFyIGtleSBpbiB0aGlzLmtleXMpeworZXZ0W2tleV09dGhpcy5rZXlzW2tleV07Cit9CitpZihldnRbInR5cGUiXT09ImtleWRvd24iJiZkb2pvLnJlbmRlci5odG1sLmllKXsKK3N3aXRjaChldnQua2V5Q29kZSl7CitjYXNlIGV2dC5LRVlfU0hJRlQ6CitjYXNlIGV2dC5LRVlfQ1RSTDoKK2Nhc2UgZXZ0LktFWV9BTFQ6CitjYXNlIGV2dC5LRVlfQ0FQU19MT0NLOgorY2FzZSBldnQuS0VZX0xFRlRfV0lORE9XOgorY2FzZSBldnQuS0VZX1JJR0hUX1dJTkRPVzoKK2Nhc2UgZXZ0LktFWV9TRUxFQ1Q6CitjYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CitjYXNlIGV2dC5LRVlfU0NST0xMX0xPQ0s6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzA6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzE6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzI6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzM6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzQ6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzU6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzY6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzc6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzg6CitjYXNlIGV2dC5LRVlfTlVNUEFEXzk6CitjYXNlIGV2dC5LRVlfTlVNUEFEX1BFUklPRDoKK2JyZWFrOworY2FzZSBldnQuS0VZX05VTVBBRF9NVUxUSVBMWToKK2Nhc2UgZXZ0LktFWV9OVU1QQURfUExVUzoKK2Nhc2UgZXZ0LktFWV9OVU1QQURfRU5URVI6CitjYXNlIGV2dC5LRVlfTlVNUEFEX01JTlVTOgorY2FzZSBldnQuS0VZX05VTVBBRF9ESVZJREU6CiticmVhazsKK2Nhc2UgZXZ0LktFWV9QQVVTRToKK2Nhc2UgZXZ0LktFWV9UQUI6CitjYXNlIGV2dC5LRVlfQkFDS1NQQUNFOgorY2FzZSBldnQuS0VZX0VOVEVSOgorY2FzZSBldnQuS0VZX0VTQ0FQRToKK2Nhc2UgZXZ0LktFWV9QQUdFX1VQOgorY2FzZSBldnQuS0VZX1BBR0VfRE9XTjoKK2Nhc2UgZXZ0LktFWV9FTkQ6CitjYXNlIGV2dC5LRVlfSE9NRToKK2Nhc2UgZXZ0LktFWV9MRUZUX0FSUk9XOgorY2FzZSBldnQuS0VZX1VQX0FSUk9XOgorY2FzZSBldnQuS0VZX1JJR0hUX0FSUk9XOgorY2FzZSBldnQuS0VZX0RPV05fQVJST1c6CitjYXNlIGV2dC5LRVlfSU5TRVJUOgorY2FzZSBldnQuS0VZX0RFTEVURToKK2Nhc2UgZXZ0LktFWV9GMToKK2Nhc2UgZXZ0LktFWV9GMjoKK2Nhc2UgZXZ0LktFWV9GMzoKK2Nhc2UgZXZ0LktFWV9GNDoKK2Nhc2UgZXZ0LktFWV9GNToKK2Nhc2UgZXZ0LktFWV9GNjoKK2Nhc2UgZXZ0LktFWV9GNzoKK2Nhc2UgZXZ0LktFWV9GODoKK2Nhc2UgZXZ0LktFWV9GOToKK2Nhc2UgZXZ0LktFWV9GMTA6CitjYXNlIGV2dC5LRVlfRjExOgorY2FzZSBldnQuS0VZX0YxMjoKK2Nhc2UgZXZ0LktFWV9GMTI6CitjYXNlIGV2dC5LRVlfRjEzOgorY2FzZSBldnQuS0VZX0YxNDoKK2Nhc2UgZXZ0LktFWV9GMTU6CitjYXNlIGV2dC5LRVlfQ0xFQVI6CitjYXNlIGV2dC5LRVlfSEVMUDoKK2V2dC5rZXk9ZXZ0LmtleUNvZGU7CiticmVhazsKK2RlZmF1bHQ6CitpZihldnQuY3RybEtleXx8ZXZ0LmFsdEtleSl7Cit2YXIgXzNhMT1ldnQua2V5Q29kZTsKK2lmKF8zYTE+PTY1JiZfM2ExPD05MCYmZXZ0LnNoaWZ0S2V5PT1mYWxzZSl7CitfM2ExKz0zMjsKK30KK2lmKF8zYTE+PTEmJl8zYTE8PTI2JiZldnQuY3RybEtleSl7CitfM2ExKz05NjsKK30KK2V2dC5rZXk9U3RyaW5nLmZyb21DaGFyQ29kZShfM2ExKTsKK30KK30KK31lbHNleworaWYoZXZ0WyJ0eXBlIl09PSJrZXlwcmVzcyIpeworaWYoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7CitpZihldnQud2hpY2g9PTApeworZXZ0LmtleT1ldnQua2V5Q29kZTsKK31lbHNleworaWYoZXZ0LndoaWNoPjApeworc3dpdGNoKGV2dC53aGljaCl7CitjYXNlIGV2dC5LRVlfU0hJRlQ6CitjYXNlIGV2dC5LRVlfQ1RSTDoKK2Nhc2UgZXZ0LktFWV9BTFQ6CitjYXNlIGV2dC5LRVlfQ0FQU19MT0NLOgorY2FzZSBldnQuS0VZX05VTV9MT0NLOgorY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorYnJlYWs7CitjYXNlIGV2dC5LRVlfUEFVU0U6CitjYXNlIGV2dC5LRVlfVEFCOgorY2FzZSBldnQuS0VZX0JBQ0tTUEFDRToKK2Nhc2UgZXZ0LktFWV9FTlRFUjoKK2Nhc2UgZXZ0LktFWV9FU0NBUEU6CitldnQua2V5PWV2dC53aGljaDsKK2JyZWFrOworZGVmYXVsdDoKK3ZhciBfM2ExPWV2dC53aGljaDsKK2lmKChldnQuY3RybEtleXx8ZXZ0LmFsdEtleXx8ZXZ0Lm1ldGFLZXkpJiYoZXZ0LndoaWNoPj02NSYmZXZ0LndoaWNoPD05MCYmZXZ0LnNoaWZ0S2V5PT1mYWxzZSkpeworXzNhMSs9MzI7Cit9CitldnQua2V5PVN0cmluZy5mcm9tQ2hhckNvZGUoXzNhMSk7Cit9Cit9Cit9Cit9ZWxzZXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworaWYoIWV2dC5jdHJsS2V5JiYhZXZ0LmFsdEtleSYmZXZ0LmtleUNvZGU+PWV2dC5LRVlfU1BBQ0UpeworZXZ0LmtleT1TdHJpbmcuZnJvbUNoYXJDb2RlKGV2dC5rZXlDb2RlKTsKK30KK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpeworc3dpdGNoKGV2dC5rZXlDb2RlKXsKK2Nhc2UgMjU6CitldnQua2V5PWV2dC5LRVlfVEFCOworZXZ0LnNoaWZ0PXRydWU7CiticmVhazsKK2Nhc2UgNjMyMzI6CitldnQua2V5PWV2dC5LRVlfVVBfQVJST1c7CiticmVhazsKK2Nhc2UgNjMyMzM6CitldnQua2V5PWV2dC5LRVlfRE9XTl9BUlJPVzsKK2JyZWFrOworY2FzZSA2MzIzNDoKK2V2dC5rZXk9ZXZ0LktFWV9MRUZUX0FSUk9XOworYnJlYWs7CitjYXNlIDYzMjM1OgorZXZ0LmtleT1ldnQuS0VZX1JJR0hUX0FSUk9XOworYnJlYWs7CitjYXNlIDYzMjM2OgorZXZ0LmtleT1ldnQuS0VZX0YxOworYnJlYWs7CitjYXNlIDYzMjM3OgorZXZ0LmtleT1ldnQuS0VZX0YyOworYnJlYWs7CitjYXNlIDYzMjM4OgorZXZ0LmtleT1ldnQuS0VZX0YzOworYnJlYWs7CitjYXNlIDYzMjM5OgorZXZ0LmtleT1ldnQuS0VZX0Y0OworYnJlYWs7CitjYXNlIDYzMjQwOgorZXZ0LmtleT1ldnQuS0VZX0Y1OworYnJlYWs7CitjYXNlIDYzMjQxOgorZXZ0LmtleT1ldnQuS0VZX0Y2OworYnJlYWs7CitjYXNlIDYzMjQyOgorZXZ0LmtleT1ldnQuS0VZX0Y3OworYnJlYWs7CitjYXNlIDYzMjQzOgorZXZ0LmtleT1ldnQuS0VZX0Y4OworYnJlYWs7CitjYXNlIDYzMjQ0OgorZXZ0LmtleT1ldnQuS0VZX0Y5OworYnJlYWs7CitjYXNlIDYzMjQ1OgorZXZ0LmtleT1ldnQuS0VZX0YxMDsKK2JyZWFrOworY2FzZSA2MzI0NjoKK2V2dC5rZXk9ZXZ0LktFWV9GMTE7CiticmVhazsKK2Nhc2UgNjMyNDc6CitldnQua2V5PWV2dC5LRVlfRjEyOworYnJlYWs7CitjYXNlIDYzMjUwOgorZXZ0LmtleT1ldnQuS0VZX1BBVVNFOworYnJlYWs7CitjYXNlIDYzMjcyOgorZXZ0LmtleT1ldnQuS0VZX0RFTEVURTsKK2JyZWFrOworY2FzZSA2MzI3MzoKK2V2dC5rZXk9ZXZ0LktFWV9IT01FOworYnJlYWs7CitjYXNlIDYzMjc1OgorZXZ0LmtleT1ldnQuS0VZX0VORDsKK2JyZWFrOworY2FzZSA2MzI3NjoKK2V2dC5rZXk9ZXZ0LktFWV9QQUdFX1VQOworYnJlYWs7CitjYXNlIDYzMjc3OgorZXZ0LmtleT1ldnQuS0VZX1BBR0VfRE9XTjsKK2JyZWFrOworY2FzZSA2MzMwMjoKK2V2dC5rZXk9ZXZ0LktFWV9JTlNFUlQ7CiticmVhazsKK2Nhc2UgNjMyNDg6CitjYXNlIDYzMjQ5OgorY2FzZSA2MzI4OToKK2JyZWFrOworZGVmYXVsdDoKK2V2dC5rZXk9ZXZ0LmNoYXJDb2RlPj1ldnQuS0VZX1NQQUNFP1N0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmNoYXJDb2RlKTpldnQua2V5Q29kZTsKK30KK31lbHNleworZXZ0LmtleT1ldnQuY2hhckNvZGU+MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGV2dC5jaGFyQ29kZSk6ZXZ0LmtleUNvZGU7Cit9Cit9Cit9Cit9Cit9Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2lmKCFldnQudGFyZ2V0KXsKK2V2dC50YXJnZXQ9ZXZ0LnNyY0VsZW1lbnQ7Cit9CitpZighZXZ0LmN1cnJlbnRUYXJnZXQpeworZXZ0LmN1cnJlbnRUYXJnZXQ9KF8zOWY/XzM5ZjpldnQuc3JjRWxlbWVudCk7Cit9CitpZighZXZ0LmxheWVyWCl7CitldnQubGF5ZXJYPWV2dC5vZmZzZXRYOworfQoraWYoIWV2dC5sYXllclkpeworZXZ0LmxheWVyWT1ldnQub2Zmc2V0WTsKK30KK3ZhciBkb2M9KGV2dC5zcmNFbGVtZW50JiZldnQuc3JjRWxlbWVudC5vd25lckRvY3VtZW50KT9ldnQuc3JjRWxlbWVudC5vd25lckRvY3VtZW50OmRvY3VtZW50OwordmFyIF8zYTM9KChkb2pvLnJlbmRlci5odG1sLmllNTUpfHwoZG9jWyJjb21wYXRNb2RlIl09PSJCYWNrQ29tcGF0IikpP2RvYy5ib2R5OmRvYy5kb2N1bWVudEVsZW1lbnQ7CitpZighZXZ0LnBhZ2VYKXsKK2V2dC5wYWdlWD1ldnQuY2xpZW50WCsoXzNhMy5zY3JvbGxMZWZ0fHwwKTsKK30KK2lmKCFldnQucGFnZVkpeworZXZ0LnBhZ2VZPWV2dC5jbGllbnRZKyhfM2EzLnNjcm9sbFRvcHx8MCk7Cit9CitpZihldnQudHlwZT09Im1vdXNlb3ZlciIpeworZXZ0LnJlbGF0ZWRUYXJnZXQ9ZXZ0LmZyb21FbGVtZW50OworfQoraWYoZXZ0LnR5cGU9PSJtb3VzZW91dCIpeworZXZ0LnJlbGF0ZWRUYXJnZXQ9ZXZ0LnRvRWxlbWVudDsKK30KK3RoaXMuY3VycmVudEV2ZW50PWV2dDsKK2V2dC5jYWxsTGlzdGVuZXI9dGhpcy5jYWxsTGlzdGVuZXI7CitldnQuc3RvcFByb3BhZ2F0aW9uPXRoaXMuX3N0b3BQcm9wYWdhdGlvbjsKK2V2dC5wcmV2ZW50RGVmYXVsdD10aGlzLl9wcmV2ZW50RGVmYXVsdDsKK30KK3JldHVybiBldnQ7Cit9OwordGhpcy5zdG9wRXZlbnQ9ZnVuY3Rpb24oZXZ0KXsKK2lmKHdpbmRvdy5ldmVudCl7CitldnQuY2FuY2VsQnViYmxlPXRydWU7CitldnQucmV0dXJuVmFsdWU9ZmFsc2U7Cit9ZWxzZXsKK2V2dC5wcmV2ZW50RGVmYXVsdCgpOworZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworfQorfTsKK307Citkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246WyJkb2pvLmV2ZW50LmNvbW1vbiIsImRvam8uZXZlbnQudG9waWMiXSxicm93c2VyOlsiZG9qby5ldmVudC5icm93c2VyIl0sZGFzaGJvYXJkOlsiZG9qby5ldmVudC5icm93c2VyIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC4qIik7Citkb2pvLnByb3ZpZGUoImRvam8uZ2Z4LmNvbG9yIik7Citkb2pvLmdmeC5jb2xvci5Db2xvcj1mdW5jdGlvbihyLGcsYixhKXsKK2lmKGRvam8ubGFuZy5pc0FycmF5KHIpKXsKK3RoaXMucj1yWzBdOwordGhpcy5nPXJbMV07Cit0aGlzLmI9clsyXTsKK3RoaXMuYT1yWzNdfHwxOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNTdHJpbmcocikpewordmFyIHJnYj1kb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCKHIpOwordGhpcy5yPXJnYlswXTsKK3RoaXMuZz1yZ2JbMV07Cit0aGlzLmI9cmdiWzJdOwordGhpcy5hPWd8fDE7Cit9ZWxzZXsKK2lmKHIgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcil7Cit0aGlzLnI9ci5yOwordGhpcy5iPXIuYjsKK3RoaXMuZz1yLmc7Cit0aGlzLmE9ci5hOworfWVsc2V7Cit0aGlzLnI9cjsKK3RoaXMuZz1nOwordGhpcy5iPWI7Cit0aGlzLmE9YTsKK30KK30KK30KK307Citkb2pvLmdmeC5jb2xvci5Db2xvci5mcm9tQXJyYXk9ZnVuY3Rpb24oYXJyKXsKK3JldHVybiBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoYXJyWzBdLGFyclsxXSxhcnJbMl0sYXJyWzNdKTsKK307Citkb2pvLmV4dGVuZChkb2pvLmdmeC5jb2xvci5Db2xvcix7dG9SZ2I6ZnVuY3Rpb24oXzNhYil7CitpZihfM2FiKXsKK3JldHVybiB0aGlzLnRvUmdiYSgpOworfWVsc2V7CityZXR1cm4gW3RoaXMucix0aGlzLmcsdGhpcy5iXTsKK30KK30sdG9SZ2JhOmZ1bmN0aW9uKCl7CityZXR1cm4gW3RoaXMucix0aGlzLmcsdGhpcy5iLHRoaXMuYV07Cit9LHRvSGV4OmZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5nZnguY29sb3IucmdiMmhleCh0aGlzLnRvUmdiKCkpOworfSx0b0NzczpmdW5jdGlvbigpeworcmV0dXJuICJyZ2IoIit0aGlzLnRvUmdiKCkuam9pbigpKyIpIjsKK30sdG9TdHJpbmc6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnRvSGV4KCk7Cit9LGJsZW5kOmZ1bmN0aW9uKF8zYWMsXzNhZCl7Cit2YXIgcmdiPW51bGw7CitpZihkb2pvLmxhbmcuaXNBcnJheShfM2FjKSl7CityZ2I9XzNhYzsKK31lbHNleworaWYoXzNhYyBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKK3JnYj1fM2FjLnRvUmdiKCk7Cit9ZWxzZXsKK3JnYj1uZXcgZG9qby5nZnguY29sb3IuQ29sb3IoXzNhYykudG9SZ2IoKTsKK30KK30KK3JldHVybiBkb2pvLmdmeC5jb2xvci5ibGVuZCh0aGlzLnRvUmdiKCkscmdiLF8zYWQpOworfX0pOworZG9qby5nZnguY29sb3IubmFtZWQ9e3doaXRlOlsyNTUsMjU1LDI1NV0sYmxhY2s6WzAsMCwwXSxyZWQ6WzI1NSwwLDBdLGdyZWVuOlswLDI1NSwwXSxsaW1lOlswLDI1NSwwXSxibHVlOlswLDAsMjU1XSxuYXZ5OlswLDAsMTI4XSxncmF5OlsxMjgsMTI4LDEyOF0sc2lsdmVyOlsxOTIsMTkyLDE5Ml19OworZG9qby5nZnguY29sb3IuYmxlbmQ9ZnVuY3Rpb24oYSxiLF8zYjEpeworaWYodHlwZW9mIGE9PSJzdHJpbmciKXsKK3JldHVybiBkb2pvLmdmeC5jb2xvci5ibGVuZEhleChhLGIsXzNiMSk7Cit9CitpZighXzNiMSl7CitfM2IxPTA7Cit9CitfM2IxPU1hdGgubWluKE1hdGgubWF4KC0xLF8zYjEpLDEpOworXzNiMT0oKF8zYjErMSkvMik7Cit2YXIgYz1bXTsKK2Zvcih2YXIgeD0wO3g8Mzt4KyspeworY1t4XT1wYXJzZUludChiW3hdKygoYVt4XS1iW3hdKSpfM2IxKSk7Cit9CityZXR1cm4gYzsKK307Citkb2pvLmdmeC5jb2xvci5ibGVuZEhleD1mdW5jdGlvbihhLGIsXzNiNil7CityZXR1cm4gZG9qby5nZnguY29sb3IucmdiMmhleChkb2pvLmdmeC5jb2xvci5ibGVuZChkb2pvLmdmeC5jb2xvci5oZXgycmdiKGEpLGRvam8uZ2Z4LmNvbG9yLmhleDJyZ2IoYiksXzNiNikpOworfTsKK2Rvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0I9ZnVuY3Rpb24oXzNiNyl7Cit2YXIgaGV4PSIwMTIzNDU2Nzg5YWJjZGVmIjsKK18zYjc9XzNiNy50b0xvd2VyQ2FzZSgpOworaWYoXzNiNy5pbmRleE9mKCJyZ2IiKT09MCl7Cit2YXIgXzNiOT1fM2I3Lm1hdGNoKC9yZ2JhKlwoKFxkKyksICooXGQrKSwgKihcZCspL2kpOwordmFyIHJldD1fM2I5LnNwbGljZSgxLDMpOworcmV0dXJuIHJldDsKK31lbHNlewordmFyIF8zYmI9ZG9qby5nZnguY29sb3IuaGV4MnJnYihfM2I3KTsKK2lmKF8zYmIpeworcmV0dXJuIF8zYmI7Cit9ZWxzZXsKK3JldHVybiBkb2pvLmdmeC5jb2xvci5uYW1lZFtfM2I3XXx8WzI1NSwyNTUsMjU1XTsKK30KK30KK307Citkb2pvLmdmeC5jb2xvci5oZXgycmdiPWZ1bmN0aW9uKGhleCl7Cit2YXIgXzNiZD0iMDEyMzQ1Njc4OUFCQ0RFRiI7Cit2YXIgcmdiPW5ldyBBcnJheSgzKTsKK2lmKGhleC5pbmRleE9mKCIjIik9PTApeworaGV4PWhleC5zdWJzdHJpbmcoMSk7Cit9CitoZXg9aGV4LnRvVXBwZXJDYXNlKCk7CitpZihoZXgucmVwbGFjZShuZXcgUmVnRXhwKCJbIitfM2JkKyJdIiwiZyIpLCIiKSE9IiIpeworcmV0dXJuIG51bGw7Cit9CitpZihoZXgubGVuZ3RoPT0zKXsKK3JnYlswXT1oZXguY2hhckF0KDApK2hleC5jaGFyQXQoMCk7CityZ2JbMV09aGV4LmNoYXJBdCgxKStoZXguY2hhckF0KDEpOworcmdiWzJdPWhleC5jaGFyQXQoMikraGV4LmNoYXJBdCgyKTsKK31lbHNleworcmdiWzBdPWhleC5zdWJzdHJpbmcoMCwyKTsKK3JnYlsxXT1oZXguc3Vic3RyaW5nKDIsNCk7CityZ2JbMl09aGV4LnN1YnN0cmluZyg0KTsKK30KK2Zvcih2YXIgaT0wO2k8cmdiLmxlbmd0aDtpKyspeworcmdiW2ldPV8zYmQuaW5kZXhPZihyZ2JbaV0uY2hhckF0KDApKSoxNitfM2JkLmluZGV4T2YocmdiW2ldLmNoYXJBdCgxKSk7Cit9CityZXR1cm4gcmdiOworfTsKK2Rvam8uZ2Z4LmNvbG9yLnJnYjJoZXg9ZnVuY3Rpb24ocixnLGIpeworaWYoZG9qby5sYW5nLmlzQXJyYXkocikpeworZz1yWzFdfHwwOworYj1yWzJdfHwwOworcj1yWzBdfHwwOworfQordmFyIHJldD1kb2pvLmxhbmcubWFwKFtyLGcsYl0sZnVuY3Rpb24oeCl7Cit4PW5ldyBOdW1iZXIoeCk7Cit2YXIgcz14LnRvU3RyaW5nKDE2KTsKK3doaWxlKHMubGVuZ3RoPDIpeworcz0iMCIrczsKK30KK3JldHVybiBzOworfSk7CityZXQudW5zaGlmdCgiIyIpOworcmV0dXJuIHJldC5qb2luKCIiKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8ubGZ4LkFuaW1hdGlvbiIpOworZG9qby5sZnguTGluZT1mdW5jdGlvbihfM2M2LGVuZCl7Cit0aGlzLnN0YXJ0PV8zYzY7Cit0aGlzLmVuZD1lbmQ7CitpZihkb2pvLmxhbmcuaXNBcnJheShfM2M2KSl7Cit2YXIgZGlmZj1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuc3RhcnQsZnVuY3Rpb24ocyxpKXsKK2RpZmZbaV09dGhpcy5lbmRbaV0tczsKK30sdGhpcyk7Cit0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKG4pewordmFyIHJlcz1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuc3RhcnQsZnVuY3Rpb24ocyxpKXsKK3Jlc1tpXT0oZGlmZltpXSpuKStzOworfSx0aGlzKTsKK3JldHVybiByZXM7Cit9OworfWVsc2V7Cit2YXIgZGlmZj1lbmQtXzNjNjsKK3RoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24obil7CityZXR1cm4gKGRpZmYqbikrdGhpcy5zdGFydDsKK307Cit9Cit9OworaWYoKGRvam8ucmVuZGVyLmh0bWwua2h0bWwpJiYoIWRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSl7Citkb2pvLmxmeC5lYXNlRGVmYXVsdD1mdW5jdGlvbihuKXsKK3JldHVybiAocGFyc2VGbG9hdCgiMC41IikrKChNYXRoLnNpbigobitwYXJzZUZsb2F0KCIxLjUiKSkqTWF0aC5QSSkpLzIpKTsKK307Cit9ZWxzZXsKK2Rvam8ubGZ4LmVhc2VEZWZhdWx0PWZ1bmN0aW9uKG4peworcmV0dXJuICgwLjUrKChNYXRoLnNpbigobisxLjUpKk1hdGguUEkpKS8yKSk7Cit9OworfQorZG9qby5sZnguZWFzZUluPWZ1bmN0aW9uKG4peworcmV0dXJuIE1hdGgucG93KG4sMyk7Cit9OworZG9qby5sZnguZWFzZU91dD1mdW5jdGlvbihuKXsKK3JldHVybiAoMS1NYXRoLnBvdygxLW4sMykpOworfTsKK2Rvam8ubGZ4LmVhc2VJbk91dD1mdW5jdGlvbihuKXsKK3JldHVybiAoKDMqTWF0aC5wb3cobiwyKSktKDIqTWF0aC5wb3cobiwzKSkpOworfTsKK2Rvam8ubGZ4LklBbmltYXRpb249ZnVuY3Rpb24oKXsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LklBbmltYXRpb24se2N1cnZlOm51bGwsZHVyYXRpb246MTAwMCxlYXNpbmc6bnVsbCxyZXBlYXRDb3VudDowLHJhdGU6MTAsaGFuZGxlcjpudWxsLGJlZm9yZUJlZ2luOm51bGwsb25CZWdpbjpudWxsLG9uQW5pbWF0ZTpudWxsLG9uRW5kOm51bGwsb25QbGF5Om51bGwsb25QYXVzZTpudWxsLG9uU3RvcDpudWxsLHBsYXk6bnVsbCxwYXVzZTpudWxsLHN0b3A6bnVsbCxjb25uZWN0OmZ1bmN0aW9uKGV2dCxfM2Q2LF8zZDcpeworaWYoIV8zZDcpeworXzNkNz1fM2Q2OworXzNkNj10aGlzOworfQorXzNkNz1kb2pvLmxhbmcuaGl0Y2goXzNkNixfM2Q3KTsKK3ZhciBfM2Q4PXRoaXNbZXZ0XXx8ZnVuY3Rpb24oKXsKK307Cit0aGlzW2V2dF09ZnVuY3Rpb24oKXsKK3ZhciByZXQ9XzNkOC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitfM2Q3LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3JldHVybiByZXQ7Cit9OworcmV0dXJuIHRoaXM7Cit9LGZpcmU6ZnVuY3Rpb24oZXZ0LGFyZ3MpeworaWYodGhpc1tldnRdKXsKK3RoaXNbZXZ0XS5hcHBseSh0aGlzLChhcmdzfHxbXSkpOworfQorcmV0dXJuIHRoaXM7Cit9LHJlcGVhdDpmdW5jdGlvbihfM2RjKXsKK3RoaXMucmVwZWF0Q291bnQ9XzNkYzsKK3JldHVybiB0aGlzOworfSxfYWN0aXZlOmZhbHNlLF9wYXVzZWQ6ZmFsc2V9KTsKK2Rvam8ubGZ4LkFuaW1hdGlvbj1mdW5jdGlvbihfM2RkLF8zZGUsXzNkZixfM2UwLF8zZTEscmF0ZSl7Citkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7CitpZihkb2pvLmxhbmcuaXNOdW1iZXIoXzNkZCl8fCghXzNkZCYmXzNkZS5nZXRWYWx1ZSkpeworcmF0ZT1fM2UxOworXzNlMT1fM2UwOworXzNlMD1fM2RmOworXzNkZj1fM2RlOworXzNkZT1fM2RkOworXzNkZD1udWxsOworfWVsc2V7CitpZihfM2RkLmdldFZhbHVlfHxkb2pvLmxhbmcuaXNBcnJheShfM2RkKSl7CityYXRlPV8zZTA7CitfM2UxPV8zZGY7CitfM2UwPV8zZGU7CitfM2RmPV8zZGQ7CitfM2RlPW51bGw7CitfM2RkPW51bGw7Cit9Cit9CitpZihkb2pvLmxhbmcuaXNBcnJheShfM2RmKSl7Cit0aGlzLmN1cnZlPW5ldyBkb2pvLmxmeC5MaW5lKF8zZGZbMF0sXzNkZlsxXSk7Cit9ZWxzZXsKK3RoaXMuY3VydmU9XzNkZjsKK30KK2lmKF8zZGUhPW51bGwmJl8zZGU+MCl7Cit0aGlzLmR1cmF0aW9uPV8zZGU7Cit9CitpZihfM2UxKXsKK3RoaXMucmVwZWF0Q291bnQ9XzNlMTsKK30KK2lmKHJhdGUpewordGhpcy5yYXRlPXJhdGU7Cit9CitpZihfM2RkKXsKK2Rvam8ubGFuZy5mb3JFYWNoKFsiaGFuZGxlciIsImJlZm9yZUJlZ2luIiwib25CZWdpbiIsIm9uRW5kIiwib25QbGF5Iiwib25TdG9wIiwib25BbmltYXRlIl0sZnVuY3Rpb24oaXRlbSl7CitpZihfM2RkW2l0ZW1dKXsKK3RoaXMuY29ubmVjdChpdGVtLF8zZGRbaXRlbV0pOworfQorfSx0aGlzKTsKK30KK2lmKF8zZTAmJmRvam8ubGFuZy5pc0Z1bmN0aW9uKF8zZTApKXsKK3RoaXMuZWFzaW5nPV8zZTA7Cit9Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmxmeC5BbmltYXRpb24sZG9qby5sZnguSUFuaW1hdGlvbik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LkFuaW1hdGlvbix7X3N0YXJ0VGltZTpudWxsLF9lbmRUaW1lOm51bGwsX3RpbWVyOm51bGwsX3BlcmNlbnQ6MCxfc3RhcnRSZXBlYXRDb3VudDowLHBsYXk6ZnVuY3Rpb24oXzNlNCxfM2U1KXsKK2lmKF8zZTUpeworY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKK3RoaXMuX2FjdGl2ZT1mYWxzZTsKK3RoaXMuX3BhdXNlZD1mYWxzZTsKK3RoaXMuX3BlcmNlbnQ9MDsKK31lbHNleworaWYodGhpcy5fYWN0aXZlJiYhdGhpcy5fcGF1c2VkKXsKK3JldHVybiB0aGlzOworfQorfQordGhpcy5maXJlKCJoYW5kbGVyIixbImJlZm9yZUJlZ2luIl0pOwordGhpcy5maXJlKCJiZWZvcmVCZWdpbiIpOworaWYoXzNlND4wKXsKK3NldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsZnVuY3Rpb24oKXsKK3RoaXMucGxheShudWxsLF8zZTUpOworfSksXzNlNCk7CityZXR1cm4gdGhpczsKK30KK3RoaXMuX3N0YXJ0VGltZT1uZXcgRGF0ZSgpLnZhbHVlT2YoKTsKK2lmKHRoaXMuX3BhdXNlZCl7Cit0aGlzLl9zdGFydFRpbWUtPSh0aGlzLmR1cmF0aW9uKnRoaXMuX3BlcmNlbnQvMTAwKTsKK30KK3RoaXMuX2VuZFRpbWU9dGhpcy5fc3RhcnRUaW1lK3RoaXMuZHVyYXRpb247Cit0aGlzLl9hY3RpdmU9dHJ1ZTsKK3RoaXMuX3BhdXNlZD1mYWxzZTsKK3ZhciBzdGVwPXRoaXMuX3BlcmNlbnQvMTAwOwordmFyIF8zZTc9dGhpcy5jdXJ2ZS5nZXRWYWx1ZShzdGVwKTsKK2lmKHRoaXMuX3BlcmNlbnQ9PTApeworaWYoIXRoaXMuX3N0YXJ0UmVwZWF0Q291bnQpewordGhpcy5fc3RhcnRSZXBlYXRDb3VudD10aGlzLnJlcGVhdENvdW50OworfQordGhpcy5maXJlKCJoYW5kbGVyIixbImJlZ2luIixfM2U3XSk7Cit0aGlzLmZpcmUoIm9uQmVnaW4iLFtfM2U3XSk7Cit9Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsicGxheSIsXzNlN10pOwordGhpcy5maXJlKCJvblBsYXkiLFtfM2U3XSk7Cit0aGlzLl9jeWNsZSgpOworcmV0dXJuIHRoaXM7Cit9LHBhdXNlOmZ1bmN0aW9uKCl7CitjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworaWYoIXRoaXMuX2FjdGl2ZSl7CityZXR1cm4gdGhpczsKK30KK3RoaXMuX3BhdXNlZD10cnVlOwordmFyIF8zZTg9dGhpcy5jdXJ2ZS5nZXRWYWx1ZSh0aGlzLl9wZXJjZW50LzEwMCk7Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsicGF1c2UiLF8zZThdKTsKK3RoaXMuZmlyZSgib25QYXVzZSIsW18zZThdKTsKK3JldHVybiB0aGlzOworfSxnb3RvUGVyY2VudDpmdW5jdGlvbihwY3QsXzNlYSl7CitjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOwordGhpcy5fYWN0aXZlPXRydWU7Cit0aGlzLl9wYXVzZWQ9dHJ1ZTsKK3RoaXMuX3BlcmNlbnQ9cGN0OworaWYoXzNlYSl7Cit0aGlzLnBsYXkoKTsKK30KK3JldHVybiB0aGlzOworfSxzdG9wOmZ1bmN0aW9uKF8zZWIpeworY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKK3ZhciBzdGVwPXRoaXMuX3BlcmNlbnQvMTAwOworaWYoXzNlYil7CitzdGVwPTE7Cit9Cit2YXIgXzNlZD10aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOwordGhpcy5maXJlKCJoYW5kbGVyIixbInN0b3AiLF8zZWRdKTsKK3RoaXMuZmlyZSgib25TdG9wIixbXzNlZF0pOwordGhpcy5fYWN0aXZlPWZhbHNlOwordGhpcy5fcGF1c2VkPWZhbHNlOworcmV0dXJuIHRoaXM7Cit9LHN0YXR1czpmdW5jdGlvbigpeworaWYodGhpcy5fYWN0aXZlKXsKK3JldHVybiB0aGlzLl9wYXVzZWQ/InBhdXNlZCI6InBsYXlpbmciOworfWVsc2V7CityZXR1cm4gInN0b3BwZWQiOworfQorcmV0dXJuIHRoaXM7Cit9LF9jeWNsZTpmdW5jdGlvbigpeworY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKK2lmKHRoaXMuX2FjdGl2ZSl7Cit2YXIgY3Vycj1uZXcgRGF0ZSgpLnZhbHVlT2YoKTsKK3ZhciBzdGVwPShjdXJyLXRoaXMuX3N0YXJ0VGltZSkvKHRoaXMuX2VuZFRpbWUtdGhpcy5fc3RhcnRUaW1lKTsKK2lmKHN0ZXA+PTEpeworc3RlcD0xOwordGhpcy5fcGVyY2VudD0xMDA7Cit9ZWxzZXsKK3RoaXMuX3BlcmNlbnQ9c3RlcCoxMDA7Cit9CitpZigodGhpcy5lYXNpbmcpJiYoZG9qby5sYW5nLmlzRnVuY3Rpb24odGhpcy5lYXNpbmcpKSl7CitzdGVwPXRoaXMuZWFzaW5nKHN0ZXApOworfQordmFyIF8zZjA9dGhpcy5jdXJ2ZS5nZXRWYWx1ZShzdGVwKTsKK3RoaXMuZmlyZSgiaGFuZGxlciIsWyJhbmltYXRlIixfM2YwXSk7Cit0aGlzLmZpcmUoIm9uQW5pbWF0ZSIsW18zZjBdKTsKK2lmKHN0ZXA8MSl7Cit0aGlzLl90aW1lcj1zZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCJfY3ljbGUiKSx0aGlzLnJhdGUpOworfWVsc2V7Cit0aGlzLl9hY3RpdmU9ZmFsc2U7Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsiZW5kIl0pOwordGhpcy5maXJlKCJvbkVuZCIpOworaWYodGhpcy5yZXBlYXRDb3VudD4wKXsKK3RoaXMucmVwZWF0Q291bnQtLTsKK3RoaXMucGxheShudWxsLHRydWUpOworfWVsc2V7CitpZih0aGlzLnJlcGVhdENvdW50PT0tMSl7Cit0aGlzLnBsYXkobnVsbCx0cnVlKTsKK31lbHNleworaWYodGhpcy5fc3RhcnRSZXBlYXRDb3VudCl7Cit0aGlzLnJlcGVhdENvdW50PXRoaXMuX3N0YXJ0UmVwZWF0Q291bnQ7Cit0aGlzLl9zdGFydFJlcGVhdENvdW50PTA7Cit9Cit9Cit9Cit9Cit9CityZXR1cm4gdGhpczsKK319KTsKK2Rvam8ubGZ4LkNvbWJpbmU9ZnVuY3Rpb24oXzNmMSl7Citkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7Cit0aGlzLl9hbmltcz1bXTsKK3RoaXMuX2FuaW1zRW5kZWQ9MDsKK3ZhciBfM2YyPWFyZ3VtZW50czsKK2lmKF8zZjIubGVuZ3RoPT0xJiYoZG9qby5sYW5nLmlzQXJyYXkoXzNmMlswXSl8fGRvam8ubGFuZy5pc0FycmF5TGlrZShfM2YyWzBdKSkpeworXzNmMj1fM2YyWzBdOworfQorZG9qby5sYW5nLmZvckVhY2goXzNmMixmdW5jdGlvbihhbmltKXsKK3RoaXMuX2FuaW1zLnB1c2goYW5pbSk7CithbmltLmNvbm5lY3QoIm9uRW5kIixkb2pvLmxhbmcuaGl0Y2godGhpcywiX29uQW5pbXNFbmRlZCIpKTsKK30sdGhpcyk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmxmeC5Db21iaW5lLGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5Db21iaW5lLHtfYW5pbXNFbmRlZDowLHBsYXk6ZnVuY3Rpb24oXzNmNCxfM2Y1KXsKK2lmKCF0aGlzLl9hbmltcy5sZW5ndGgpeworcmV0dXJuIHRoaXM7Cit9Cit0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CitpZihfM2Y0PjApeworc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpewordGhpcy5wbGF5KG51bGwsXzNmNSk7Cit9KSxfM2Y0KTsKK3JldHVybiB0aGlzOworfQoraWYoXzNmNXx8dGhpcy5fYW5pbXNbMF0ucGVyY2VudD09MCl7Cit0aGlzLmZpcmUoIm9uQmVnaW4iKTsKK30KK3RoaXMuZmlyZSgib25QbGF5Iik7Cit0aGlzLl9hbmltc0NhbGwoInBsYXkiLG51bGwsXzNmNSk7CityZXR1cm4gdGhpczsKK30scGF1c2U6ZnVuY3Rpb24oKXsKK3RoaXMuZmlyZSgib25QYXVzZSIpOwordGhpcy5fYW5pbXNDYWxsKCJwYXVzZSIpOworcmV0dXJuIHRoaXM7Cit9LHN0b3A6ZnVuY3Rpb24oXzNmNil7Cit0aGlzLmZpcmUoIm9uU3RvcCIpOwordGhpcy5fYW5pbXNDYWxsKCJzdG9wIixfM2Y2KTsKK3JldHVybiB0aGlzOworfSxfb25Bbmltc0VuZGVkOmZ1bmN0aW9uKCl7Cit0aGlzLl9hbmltc0VuZGVkKys7CitpZih0aGlzLl9hbmltc0VuZGVkPj10aGlzLl9hbmltcy5sZW5ndGgpewordGhpcy5maXJlKCJvbkVuZCIpOworfQorcmV0dXJuIHRoaXM7Cit9LF9hbmltc0NhbGw6ZnVuY3Rpb24oXzNmNyl7Cit2YXIgYXJncz1bXTsKK2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Citmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsKK2FyZ3MucHVzaChhcmd1bWVudHNbaV0pOworfQorfQordmFyIF8zZmE9dGhpczsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuX2FuaW1zLGZ1bmN0aW9uKGFuaW0peworYW5pbVtfM2Y3XShhcmdzKTsKK30sXzNmYSk7CityZXR1cm4gdGhpczsKK319KTsKK2Rvam8ubGZ4LkNoYWluPWZ1bmN0aW9uKF8zZmMpeworZG9qby5sZnguSUFuaW1hdGlvbi5jYWxsKHRoaXMpOwordGhpcy5fYW5pbXM9W107Cit0aGlzLl9jdXJyQW5pbT0tMTsKK3ZhciBfM2ZkPWFyZ3VtZW50czsKK2lmKF8zZmQubGVuZ3RoPT0xJiYoZG9qby5sYW5nLmlzQXJyYXkoXzNmZFswXSl8fGRvam8ubGFuZy5pc0FycmF5TGlrZShfM2ZkWzBdKSkpeworXzNmZD1fM2ZkWzBdOworfQordmFyIF8zZmU9dGhpczsKK2Rvam8ubGFuZy5mb3JFYWNoKF8zZmQsZnVuY3Rpb24oYW5pbSxpLF80MDEpewordGhpcy5fYW5pbXMucHVzaChhbmltKTsKK2lmKGk8XzQwMS5sZW5ndGgtMSl7CithbmltLmNvbm5lY3QoIm9uRW5kIixkb2pvLmxhbmcuaGl0Y2godGhpcywiX3BsYXlOZXh0IikpOworfWVsc2V7CithbmltLmNvbm5lY3QoIm9uRW5kIixkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpewordGhpcy5maXJlKCJvbkVuZCIpOworfSkpOworfQorfSx0aGlzKTsKK307Citkb2pvLmluaGVyaXRzKGRvam8ubGZ4LkNoYWluLGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5DaGFpbix7X2N1cnJBbmltOi0xLHBsYXk6ZnVuY3Rpb24oXzQwMixfNDAzKXsKK2lmKCF0aGlzLl9hbmltcy5sZW5ndGgpeworcmV0dXJuIHRoaXM7Cit9CitpZihfNDAzfHwhdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dKXsKK3RoaXMuX2N1cnJBbmltPTA7Cit9Cit2YXIgXzQwND10aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV07Cit0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CitpZihfNDAyPjApeworc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpewordGhpcy5wbGF5KG51bGwsXzQwMyk7Cit9KSxfNDAyKTsKK3JldHVybiB0aGlzOworfQoraWYoXzQwNCl7CitpZih0aGlzLl9jdXJyQW5pbT09MCl7Cit0aGlzLmZpcmUoImhhbmRsZXIiLFsiYmVnaW4iLHRoaXMuX2N1cnJBbmltXSk7Cit0aGlzLmZpcmUoIm9uQmVnaW4iLFt0aGlzLl9jdXJyQW5pbV0pOworfQordGhpcy5maXJlKCJvblBsYXkiLFt0aGlzLl9jdXJyQW5pbV0pOworXzQwNC5wbGF5KG51bGwsXzQwMyk7Cit9CityZXR1cm4gdGhpczsKK30scGF1c2U6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSl7Cit0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGF1c2UoKTsKK3RoaXMuZmlyZSgib25QYXVzZSIsW3RoaXMuX2N1cnJBbmltXSk7Cit9CityZXR1cm4gdGhpczsKK30scGxheVBhdXNlOmZ1bmN0aW9uKCl7CitpZih0aGlzLl9hbmltcy5sZW5ndGg9PTApeworcmV0dXJuIHRoaXM7Cit9CitpZih0aGlzLl9jdXJyQW5pbT09LTEpewordGhpcy5fY3VyckFuaW09MDsKK30KK3ZhciBfNDA1PXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKK2lmKF80MDUpeworaWYoIV80MDUuX2FjdGl2ZXx8XzQwNS5fcGF1c2VkKXsKK3RoaXMucGxheSgpOworfWVsc2V7Cit0aGlzLnBhdXNlKCk7Cit9Cit9CityZXR1cm4gdGhpczsKK30sc3RvcDpmdW5jdGlvbigpewordmFyIF80MDY9dGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dOworaWYoXzQwNil7CitfNDA2LnN0b3AoKTsKK3RoaXMuZmlyZSgib25TdG9wIixbdGhpcy5fY3VyckFuaW1dKTsKK30KK3JldHVybiBfNDA2OworfSxfcGxheU5leHQ6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuX2N1cnJBbmltPT0tMXx8dGhpcy5fYW5pbXMubGVuZ3RoPT0wKXsKK3JldHVybiB0aGlzOworfQordGhpcy5fY3VyckFuaW0rKzsKK2lmKHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSl7Cit0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheShudWxsLHRydWUpOworfQorcmV0dXJuIHRoaXM7Cit9fSk7Citkb2pvLmxmeC5jb21iaW5lPWZ1bmN0aW9uKF80MDcpewordmFyIF80MDg9YXJndW1lbnRzOworaWYoZG9qby5sYW5nLmlzQXJyYXkoYXJndW1lbnRzWzBdKSl7CitfNDA4PWFyZ3VtZW50c1swXTsKK30KK2lmKF80MDgubGVuZ3RoPT0xKXsKK3JldHVybiBfNDA4WzBdOworfQorcmV0dXJuIG5ldyBkb2pvLmxmeC5Db21iaW5lKF80MDgpOworfTsKK2Rvam8ubGZ4LmNoYWluPWZ1bmN0aW9uKF80MDkpewordmFyIF80MGE9YXJndW1lbnRzOworaWYoZG9qby5sYW5nLmlzQXJyYXkoYXJndW1lbnRzWzBdKSl7CitfNDBhPWFyZ3VtZW50c1swXTsKK30KK2lmKF80MGEubGVuZ3RoPT0xKXsKK3JldHVybiBfNDBhWzBdOworfQorcmV0dXJuIG5ldyBkb2pvLmxmeC5DaGFpbihfNDBhKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5jb21tb24iKTsKK2Rvam8ubGFuZy5taXhpbihkb2pvLmh0bWwsZG9qby5kb20pOworZG9qby5odG1sLmJvZHk9ZnVuY3Rpb24oKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLmJvZHkoKSBtb3ZlZCB0byBkb2pvLmJvZHkoKSIsIjAuNSIpOworcmV0dXJuIGRvam8uYm9keSgpOworfTsKK2Rvam8uaHRtbC5nZXRFdmVudFRhcmdldD1mdW5jdGlvbihldnQpeworaWYoIWV2dCl7CitldnQ9ZG9qby5nbG9iYWwoKS5ldmVudHx8e307Cit9Cit2YXIgdD0oZXZ0LnNyY0VsZW1lbnQ/ZXZ0LnNyY0VsZW1lbnQ6KGV2dC50YXJnZXQ/ZXZ0LnRhcmdldDpudWxsKSk7Cit3aGlsZSgodCkmJih0Lm5vZGVUeXBlIT0xKSl7Cit0PXQucGFyZW50Tm9kZTsKK30KK3JldHVybiB0OworfTsKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydD1mdW5jdGlvbigpewordmFyIF80MGQ9ZG9qby5nbG9iYWwoKTsKK3ZhciBfNDBlPWRvam8uZG9jKCk7Cit2YXIgdz0wOwordmFyIGg9MDsKK2lmKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSl7Cit3PV80MGUuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOworaD1fNDBkLmlubmVySGVpZ2h0OworfWVsc2V7CitpZighZG9qby5yZW5kZXIuaHRtbC5vcGVyYSYmXzQwZC5pbm5lcldpZHRoKXsKK3c9XzQwZC5pbm5lcldpZHRoOworaD1fNDBkLmlubmVySGVpZ2h0OworfWVsc2V7CitpZighZG9qby5yZW5kZXIuaHRtbC5vcGVyYSYmZG9qby5leGlzdHMoXzQwZSwiZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIikpewordmFyIHcyPV80MGUuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOworaWYoIXd8fHcyJiZ3Mjx3KXsKK3c9dzI7Cit9CitoPV80MGUuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKK31lbHNleworaWYoZG9qby5ib2R5KCkuY2xpZW50V2lkdGgpewordz1kb2pvLmJvZHkoKS5jbGllbnRXaWR0aDsKK2g9ZG9qby5ib2R5KCkuY2xpZW50SGVpZ2h0OworfQorfQorfQorfQorcmV0dXJuIHt3aWR0aDp3LGhlaWdodDpofTsKK307Citkb2pvLmh0bWwuZ2V0U2Nyb2xsPWZ1bmN0aW9uKCl7Cit2YXIgXzQxMj1kb2pvLmdsb2JhbCgpOwordmFyIF80MTM9ZG9qby5kb2MoKTsKK3ZhciB0b3A9XzQxMi5wYWdlWU9mZnNldHx8XzQxMy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2pvLmJvZHkoKS5zY3JvbGxUb3B8fDA7Cit2YXIgbGVmdD1fNDEyLnBhZ2VYT2Zmc2V0fHxfNDEzLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2pvLmJvZHkoKS5zY3JvbGxMZWZ0fHwwOworcmV0dXJuIHt0b3A6dG9wLGxlZnQ6bGVmdCxvZmZzZXQ6e3g6bGVmdCx5OnRvcH19OworfTsKK2Rvam8uaHRtbC5nZXRQYXJlbnRCeVR5cGU9ZnVuY3Rpb24obm9kZSx0eXBlKXsKK3ZhciBfNDE4PWRvam8uZG9jKCk7Cit2YXIgXzQxOT1kb2pvLmJ5SWQobm9kZSk7Cit0eXBlPXR5cGUudG9Mb3dlckNhc2UoKTsKK3doaWxlKChfNDE5KSYmKF80MTkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9dHlwZSkpeworaWYoXzQxOT09KF80MThbImJvZHkiXXx8XzQxOFsiZG9jdW1lbnRFbGVtZW50Il0pKXsKK3JldHVybiBudWxsOworfQorXzQxOT1fNDE5LnBhcmVudE5vZGU7Cit9CityZXR1cm4gXzQxOTsKK307Citkb2pvLmh0bWwuZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKG5vZGUsYXR0cil7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKCghbm9kZSl8fCghbm9kZS5nZXRBdHRyaWJ1dGUpKXsKK3JldHVybiBudWxsOworfQordmFyIHRhPXR5cGVvZiBhdHRyPT0ic3RyaW5nIj9hdHRyOm5ldyBTdHJpbmcoYXR0cik7Cit2YXIgdj1ub2RlLmdldEF0dHJpYnV0ZSh0YS50b1VwcGVyQ2FzZSgpKTsKK2lmKCh2KSYmKHR5cGVvZiB2PT0ic3RyaW5nIikmJih2IT0iIikpeworcmV0dXJuIHY7Cit9CitpZih2JiZ2LnZhbHVlKXsKK3JldHVybiB2LnZhbHVlOworfQoraWYoKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSkmJihub2RlLmdldEF0dHJpYnV0ZU5vZGUodGEpKSl7CityZXR1cm4gKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSh0YSkpLnZhbHVlOworfWVsc2V7CitpZihub2RlLmdldEF0dHJpYnV0ZSh0YSkpeworcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKHRhKTsKK31lbHNleworaWYobm9kZS5nZXRBdHRyaWJ1dGUodGEudG9Mb3dlckNhc2UoKSkpeworcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvTG93ZXJDYXNlKCkpOworfQorfQorfQorcmV0dXJuIG51bGw7Cit9OworZG9qby5odG1sLmhhc0F0dHJpYnV0ZT1mdW5jdGlvbihub2RlLGF0dHIpeworcmV0dXJuIGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUoZG9qby5ieUlkKG5vZGUpLGF0dHIpP3RydWU6ZmFsc2U7Cit9OworZG9qby5odG1sLmdldEN1cnNvclBvc2l0aW9uPWZ1bmN0aW9uKGUpeworZT1lfHxkb2pvLmdsb2JhbCgpLmV2ZW50OwordmFyIF80MjE9e3g6MCx5OjB9OworaWYoZS5wYWdlWHx8ZS5wYWdlWSl7CitfNDIxLng9ZS5wYWdlWDsKK180MjEueT1lLnBhZ2VZOworfWVsc2V7Cit2YXIgZGU9ZG9qby5kb2MoKS5kb2N1bWVudEVsZW1lbnQ7Cit2YXIgZGI9ZG9qby5ib2R5KCk7CitfNDIxLng9ZS5jbGllbnRYKygoZGV8fGRiKVsic2Nyb2xsTGVmdCJdKS0oKGRlfHxkYilbImNsaWVudExlZnQiXSk7CitfNDIxLnk9ZS5jbGllbnRZKygoZGV8fGRiKVsic2Nyb2xsVG9wIl0pLSgoZGV8fGRiKVsiY2xpZW50VG9wIl0pOworfQorcmV0dXJuIF80MjE7Cit9OworZG9qby5odG1sLmlzVGFnPWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZihub2RlJiZub2RlLnRhZ05hbWUpeworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZihub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09U3RyaW5nKGFyZ3VtZW50c1tpXSkudG9Mb3dlckNhc2UoKSl7CityZXR1cm4gU3RyaW5nKGFyZ3VtZW50c1tpXSkudG9Mb3dlckNhc2UoKTsKK30KK30KK30KK3JldHVybiAiIjsKK307CitpZihkb2pvLnJlbmRlci5odG1sLmllJiYhZG9qby5yZW5kZXIuaHRtbC5pZTcwKXsKK2lmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cigwLDYpLnRvTG93ZXJDYXNlKCkhPSJodHRwczoiKXsKKyhmdW5jdGlvbigpewordmFyIF80MjY9ZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKK180MjYuc3JjPSJqYXZhc2NyaXB0Oidkb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50PWZ1bmN0aW9uKGRvYywgdGFnKXsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7IH0nIjsKK2Rvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChfNDI2KTsKK30pKCk7Cit9Cit9ZWxzZXsKK2Rvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQ9ZnVuY3Rpb24oZG9jLHRhZyl7CityZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsKK307Cit9Citkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkPWZ1bmN0aW9uKF80MjksXzQyYSxhcmdzLF80MmMsXzQyZCl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC4iK180MjksInJlcGxhY2VkIGJ5IGRvam8uaHRtbC4iK180MmErIigiKyhfNDJjPyJub2RlLCB7IitfNDJjKyI6ICIrXzQyYysifSI6IiIpKyIpIisoXzQyZD8iLiIrXzQyZDoiIiksIjAuNSIpOwordmFyIF80MmU9W107CitpZihfNDJjKXsKK3ZhciBfNDJmPXt9OworXzQyZltfNDJjXT1hcmdzWzFdOworXzQyZS5wdXNoKGFyZ3NbMF0pOworXzQyZS5wdXNoKF80MmYpOworfWVsc2V7CitfNDJlPWFyZ3M7Cit9Cit2YXIgcmV0PWRvam8uaHRtbFtfNDJhXS5hcHBseShkb2pvLmh0bWwsYXJncyk7CitpZihfNDJkKXsKK3JldHVybiByZXRbXzQyZF07Cit9ZWxzZXsKK3JldHVybiByZXQ7Cit9Cit9OworZG9qby5odG1sLmdldFZpZXdwb3J0V2lkdGg9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRWaWV3cG9ydFdpZHRoIiwiZ2V0Vmlld3BvcnQiLGFyZ3VtZW50cyxudWxsLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydEhlaWdodD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFZpZXdwb3J0SGVpZ2h0IiwiZ2V0Vmlld3BvcnQiLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnRTaXplPWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Vmlld3BvcnRTaXplIiwiZ2V0Vmlld3BvcnQiLGFyZ3VtZW50cyk7Cit9OworZG9qby5odG1sLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFNjcm9sbFRvcCIsImdldFNjcm9sbCIsYXJndW1lbnRzLG51bGwsInRvcCIpOworfTsKK2Rvam8uaHRtbC5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsTGVmdCIsImdldFNjcm9sbCIsYXJndW1lbnRzLG51bGwsImxlZnQiKTsKK307Citkb2pvLmh0bWwuZ2V0U2Nyb2xsT2Zmc2V0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsT2Zmc2V0IiwiZ2V0U2Nyb2xsIixhcmd1bWVudHMsbnVsbCwib2Zmc2V0Iik7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLnVyaS5VcmkiKTsKK2Rvam8udXJpPW5ldyBmdW5jdGlvbigpewordGhpcy5kb2pvVXJpPWZ1bmN0aW9uKHVyaSl7CityZXR1cm4gbmV3IGRvam8udXJpLlVyaShkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpLHVyaSk7Cit9OwordGhpcy5tb2R1bGVVcmk9ZnVuY3Rpb24oXzQzMix1cmkpewordmFyIGxvYz1kb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhfNDMyKS5qb2luKCIvIik7CitpZighbG9jKXsKK3JldHVybiBudWxsOworfQoraWYobG9jLmxhc3RJbmRleE9mKCIvIikhPWxvYy5sZW5ndGgtMSl7Citsb2MrPSIvIjsKK30KK3ZhciBfNDM1PWxvYy5pbmRleE9mKCI6Iik7Cit2YXIgXzQzNj1sb2MuaW5kZXhPZigiLyIpOworaWYobG9jLmNoYXJBdCgwKSE9Ii8iJiYoXzQzNT09LTF8fF80MzU+XzQzNikpeworbG9jPWRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCkrbG9jOworfQorcmV0dXJuIG5ldyBkb2pvLnVyaS5VcmkobG9jLHVyaSk7Cit9OwordGhpcy5Vcmk9ZnVuY3Rpb24oKXsKK3ZhciB1cmk9YXJndW1lbnRzWzBdOworZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7CitpZighYXJndW1lbnRzW2ldKXsKK2NvbnRpbnVlOworfQordmFyIF80Mzk9bmV3IGRvam8udXJpLlVyaShhcmd1bWVudHNbaV0udG9TdHJpbmcoKSk7Cit2YXIgXzQzYT1uZXcgZG9qby51cmkuVXJpKHVyaS50b1N0cmluZygpKTsKK2lmKChfNDM5LnBhdGg9PSIiKSYmKF80Mzkuc2NoZW1lPT1udWxsKSYmKF80MzkuYXV0aG9yaXR5PT1udWxsKSYmKF80MzkucXVlcnk9PW51bGwpKXsKK2lmKF80MzkuZnJhZ21lbnQhPW51bGwpeworXzQzYS5mcmFnbWVudD1fNDM5LmZyYWdtZW50OworfQorXzQzOT1fNDNhOworfWVsc2V7CitpZihfNDM5LnNjaGVtZT09bnVsbCl7CitfNDM5LnNjaGVtZT1fNDNhLnNjaGVtZTsKK2lmKF80MzkuYXV0aG9yaXR5PT1udWxsKXsKK180MzkuYXV0aG9yaXR5PV80M2EuYXV0aG9yaXR5OworaWYoXzQzOS5wYXRoLmNoYXJBdCgwKSE9Ii8iKXsKK3ZhciBwYXRoPV80M2EucGF0aC5zdWJzdHJpbmcoMCxfNDNhLnBhdGgubGFzdEluZGV4T2YoIi8iKSsxKStfNDM5LnBhdGg7Cit2YXIgc2Vncz1wYXRoLnNwbGl0KCIvIik7Citmb3IodmFyIGo9MDtqPHNlZ3MubGVuZ3RoO2orKyl7CitpZihzZWdzW2pdPT0iLiIpeworaWYoaj09c2Vncy5sZW5ndGgtMSl7CitzZWdzW2pdPSIiOworfWVsc2V7CitzZWdzLnNwbGljZShqLDEpOworai0tOworfQorfWVsc2V7CitpZihqPjAmJiEoaj09MSYmc2Vnc1swXT09IiIpJiZzZWdzW2pdPT0iLi4iJiZzZWdzW2otMV0hPSIuLiIpeworaWYoaj09c2Vncy5sZW5ndGgtMSl7CitzZWdzLnNwbGljZShqLDEpOworc2Vnc1tqLTFdPSIiOworfWVsc2V7CitzZWdzLnNwbGljZShqLTEsMik7CitqLT0yOworfQorfQorfQorfQorXzQzOS5wYXRoPXNlZ3Muam9pbigiLyIpOworfQorfQorfQorfQordXJpPSIiOworaWYoXzQzOS5zY2hlbWUhPW51bGwpewordXJpKz1fNDM5LnNjaGVtZSsiOiI7Cit9CitpZihfNDM5LmF1dGhvcml0eSE9bnVsbCl7Cit1cmkrPSIvLyIrXzQzOS5hdXRob3JpdHk7Cit9Cit1cmkrPV80MzkucGF0aDsKK2lmKF80MzkucXVlcnkhPW51bGwpewordXJpKz0iPyIrXzQzOS5xdWVyeTsKK30KK2lmKF80MzkuZnJhZ21lbnQhPW51bGwpewordXJpKz0iIyIrXzQzOS5mcmFnbWVudDsKK30KK30KK3RoaXMudXJpPXVyaS50b1N0cmluZygpOwordmFyIF80M2U9Il4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kIjsKK3ZhciByPXRoaXMudXJpLm1hdGNoKG5ldyBSZWdFeHAoXzQzZSkpOwordGhpcy5zY2hlbWU9clsyXXx8KHJbMV0/IiI6bnVsbCk7Cit0aGlzLmF1dGhvcml0eT1yWzRdfHwoclszXT8iIjpudWxsKTsKK3RoaXMucGF0aD1yWzVdOwordGhpcy5xdWVyeT1yWzddfHwocls2XT8iIjpudWxsKTsKK3RoaXMuZnJhZ21lbnQ9cls5XXx8KHJbOF0/IiI6bnVsbCk7CitpZih0aGlzLmF1dGhvcml0eSE9bnVsbCl7CitfNDNlPSJeKCgoW146XSs6KT8oW15AXSspKUApPyhbXjpdKikoOihbMC05XSspKT8kIjsKK3I9dGhpcy5hdXRob3JpdHkubWF0Y2gobmV3IFJlZ0V4cChfNDNlKSk7Cit0aGlzLnVzZXI9clszXXx8bnVsbDsKK3RoaXMucGFzc3dvcmQ9cls0XXx8bnVsbDsKK3RoaXMuaG9zdD1yWzVdOwordGhpcy5wb3J0PXJbN118fG51bGw7Cit9Cit0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy51cmk7Cit9OworfTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5zdHlsZSIpOworZG9qby5odG1sLmdldENsYXNzPWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZighbm9kZSl7CityZXR1cm4gIiI7Cit9Cit2YXIgY3M9IiI7CitpZihub2RlLmNsYXNzTmFtZSl7Citjcz1ub2RlLmNsYXNzTmFtZTsKK31lbHNleworaWYoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShub2RlLCJjbGFzcyIpKXsKK2NzPWRvam8uaHRtbC5nZXRBdHRyaWJ1dGUobm9kZSwiY2xhc3MiKTsKK30KK30KK3JldHVybiBjcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7Cit9OworZG9qby5odG1sLmdldENsYXNzZXM9ZnVuY3Rpb24obm9kZSl7Cit2YXIgYz1kb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSk7CityZXR1cm4gKGM9PSIiKT9bXTpjLnNwbGl0KC9ccysvZyk7Cit9OworZG9qby5odG1sLmhhc0NsYXNzPWZ1bmN0aW9uKG5vZGUsXzQ0NSl7CityZXR1cm4gKG5ldyBSZWdFeHAoIihefFxccyspIitfNDQ1KyIoXFxzK3wkKSIpKS50ZXN0KGRvam8uaHRtbC5nZXRDbGFzcyhub2RlKSk7Cit9OworZG9qby5odG1sLnByZXBlbmRDbGFzcz1mdW5jdGlvbihub2RlLF80NDcpeworXzQ0Nys9IiAiK2Rvam8uaHRtbC5nZXRDbGFzcyhub2RlKTsKK3JldHVybiBkb2pvLmh0bWwuc2V0Q2xhc3Mobm9kZSxfNDQ3KTsKK307Citkb2pvLmh0bWwuYWRkQ2xhc3M9ZnVuY3Rpb24obm9kZSxfNDQ5KXsKK2lmKGRvam8uaHRtbC5oYXNDbGFzcyhub2RlLF80NDkpKXsKK3JldHVybiBmYWxzZTsKK30KK180NDk9KGRvam8uaHRtbC5nZXRDbGFzcyhub2RlKSsiICIrXzQ0OSkucmVwbGFjZSgvXlxzK3xccyskL2csIiIpOworcmV0dXJuIGRvam8uaHRtbC5zZXRDbGFzcyhub2RlLF80NDkpOworfTsKK2Rvam8uaHRtbC5zZXRDbGFzcz1mdW5jdGlvbihub2RlLF80NGIpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgY3M9bmV3IFN0cmluZyhfNDRiKTsKK3RyeXsKK2lmKHR5cGVvZiBub2RlLmNsYXNzTmFtZT09InN0cmluZyIpeworbm9kZS5jbGFzc05hbWU9Y3M7Cit9ZWxzZXsKK2lmKG5vZGUuc2V0QXR0cmlidXRlKXsKK25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsXzQ0Yik7Citub2RlLmNsYXNzTmFtZT1jczsKK31lbHNleworcmV0dXJuIGZhbHNlOworfQorfQorfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKCJkb2pvLmh0bWwuc2V0Q2xhc3MoKSBmYWlsZWQiLGUpOworfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKG5vZGUsXzQ0ZSxfNDRmKXsKK3RyeXsKK2lmKCFfNDRmKXsKK3ZhciBfNDUwPWRvam8uaHRtbC5nZXRDbGFzcyhub2RlKS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIitfNDRlKyIoXFxzK3wkKSIpLCIkMSQyIik7Cit9ZWxzZXsKK3ZhciBfNDUwPWRvam8uaHRtbC5nZXRDbGFzcyhub2RlKS5yZXBsYWNlKF80NGUsIiIpOworfQorZG9qby5odG1sLnNldENsYXNzKG5vZGUsXzQ1MCk7Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoImRvam8uaHRtbC5yZW1vdmVDbGFzcygpIGZhaWxlZCIsZSk7Cit9CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmh0bWwucmVwbGFjZUNsYXNzPWZ1bmN0aW9uKG5vZGUsXzQ1MixfNDUzKXsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyhub2RlLF80NTMpOworZG9qby5odG1sLmFkZENsYXNzKG5vZGUsXzQ1Mik7Cit9OworZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlPXtDb250YWluc0FsbDowLENvbnRhaW5zQW55OjEsSXNPbmx5OjJ9OworZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzcz1mdW5jdGlvbihfNDU0LF80NTUsXzQ1NixfNDU3LF80NTgpeworXzQ1OD1mYWxzZTsKK3ZhciBfNDU5PWRvam8uZG9jKCk7CitfNDU1PWRvam8uYnlJZChfNDU1KXx8XzQ1OTsKK3ZhciBfNDVhPV80NTQuc3BsaXQoL1xzKy9nKTsKK3ZhciBfNDViPVtdOworaWYoXzQ1NyE9MSYmXzQ1NyE9Mil7CitfNDU3PTA7Cit9Cit2YXIgXzQ1Yz1uZXcgUmVnRXhwKCIoXFxzfF4pKCgiK180NWEuam9pbigiKXwoIikrIikpKFxcc3wkKSIpOwordmFyIF80NWQ9XzQ1YS5qb2luKCIgIikubGVuZ3RoOwordmFyIF80NWU9W107CitpZighXzQ1OCYmXzQ1OS5ldmFsdWF0ZSl7Cit2YXIgXzQ1Zj0iLi8vIisoXzQ1Nnx8IioiKSsiW2NvbnRhaW5zKCI7CitpZihfNDU3IT1kb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpeworXzQ1Zis9ImNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIitfNDVhLmpvaW4oIiAnKSBhbmQgY29udGFpbnMoY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiKSsiICcpIjsKK2lmKF80NTc9PTIpeworXzQ1Zis9IiBhbmQgc3RyaW5nLWxlbmd0aChAY2xhc3MpPSIrXzQ1ZCsiXSI7Cit9ZWxzZXsKK180NWYrPSJdIjsKK30KK31lbHNleworXzQ1Zis9ImNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIitfNDVhLmpvaW4oIiAnKSBvciBjb250YWlucyhjb25jYXQoJyAnLEBjbGFzcywnICcpLCAnICIpKyIgJyldIjsKK30KK3ZhciBfNDYwPV80NTkuZXZhbHVhdGUoXzQ1ZixfNDU1LG51bGwsWFBhdGhSZXN1bHQuQU5ZX1RZUEUsbnVsbCk7Cit2YXIgXzQ2MT1fNDYwLml0ZXJhdGVOZXh0KCk7Cit3aGlsZShfNDYxKXsKK3RyeXsKK180NWUucHVzaChfNDYxKTsKK180NjE9XzQ2MC5pdGVyYXRlTmV4dCgpOworfQorY2F0Y2goZSl7CiticmVhazsKK30KK30KK3JldHVybiBfNDVlOworfWVsc2V7CitpZighXzQ1Nil7CitfNDU2PSIqIjsKK30KK180NWU9XzQ1NS5nZXRFbGVtZW50c0J5VGFnTmFtZShfNDU2KTsKK3ZhciBub2RlLGk9MDsKK291dGVyOgord2hpbGUobm9kZT1fNDVlW2krK10pewordmFyIF80NjQ9ZG9qby5odG1sLmdldENsYXNzZXMobm9kZSk7CitpZihfNDY0Lmxlbmd0aD09MCl7Citjb250aW51ZSBvdXRlcjsKK30KK3ZhciBfNDY1PTA7Citmb3IodmFyIGo9MDtqPF80NjQubGVuZ3RoO2orKyl7CitpZihfNDVjLnRlc3QoXzQ2NFtqXSkpeworaWYoXzQ1Nz09ZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlLkNvbnRhaW5zQW55KXsKK180NWIucHVzaChub2RlKTsKK2NvbnRpbnVlIG91dGVyOworfWVsc2V7CitfNDY1Kys7Cit9Cit9ZWxzZXsKK2lmKF80NTc9PWRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Jc09ubHkpeworY29udGludWUgb3V0ZXI7Cit9Cit9Cit9CitpZihfNDY1PT1fNDVhLmxlbmd0aCl7CitpZigoXzQ1Nz09ZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlLklzT25seSkmJihfNDY1PT1fNDY0Lmxlbmd0aCkpeworXzQ1Yi5wdXNoKG5vZGUpOworfWVsc2V7CitpZihfNDU3PT1kb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbGwpeworXzQ1Yi5wdXNoKG5vZGUpOworfQorfQorfQorfQorcmV0dXJuIF80NWI7Cit9Cit9OworZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9ZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzczsKK2Rvam8uaHRtbC50b0NhbWVsQ2FzZT1mdW5jdGlvbihfNDY3KXsKK3ZhciBhcnI9XzQ2Ny5zcGxpdCgiLSIpLGNjPWFyclswXTsKK2Zvcih2YXIgaT0xO2k8YXJyLmxlbmd0aDtpKyspeworY2MrPWFycltpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthcnJbaV0uc3Vic3RyaW5nKDEpOworfQorcmV0dXJuIGNjOworfTsKK2Rvam8uaHRtbC50b1NlbGVjdG9yQ2FzZT1mdW5jdGlvbihfNDZiKXsKK3JldHVybiBfNDZiLnJlcGxhY2UoLyhbQS1aXSkvZywiLSQxIikudG9Mb3dlckNhc2UoKTsKK307CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlPWZ1bmN0aW9uKG5vZGUsXzQ2ZCxfNDZlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYoIW5vZGV8fCFub2RlLmN1cnJlbnRTdHlsZSl7CityZXR1cm4gXzQ2ZTsKK30KK3JldHVybiBub2RlLmN1cnJlbnRTdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UoXzQ2ZCldOworfTsKK2Rvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlcz1mdW5jdGlvbihub2RlKXsKK3JldHVybiBub2RlLmN1cnJlbnRTdHlsZTsKK307Cit9ZWxzZXsKK2Rvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlPWZ1bmN0aW9uKG5vZGUsXzQ3MSxfNDcyKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYoIW5vZGV8fCFub2RlLnN0eWxlKXsKK3JldHVybiBfNDcyOworfQordmFyIHM9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLG51bGwpOworcmV0dXJuIChzJiZzW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShfNDcxKV0pfHwiIjsKK307Citkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZXM9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLG51bGwpOworfTsKK30KK2Rvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5PWZ1bmN0aW9uKG5vZGUsXzQ3Nil7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3JldHVybiAobm9kZSYmbm9kZS5zdHlsZT9ub2RlLnN0eWxlW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShfNDc2KV06dW5kZWZpbmVkKTsKK307Citkb2pvLmh0bWwuZ2V0U3R5bGU9ZnVuY3Rpb24obm9kZSxfNDc4KXsKK3ZhciBfNDc5PWRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsXzQ3OCk7CityZXR1cm4gKF80Nzk/XzQ3OTpkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLF80NzgpKTsKK307Citkb2pvLmh0bWwuc2V0U3R5bGU9ZnVuY3Rpb24obm9kZSxfNDdiLF80N2Mpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitpZihub2RlJiZub2RlLnN0eWxlKXsKK3ZhciBfNDdkPWRvam8uaHRtbC50b0NhbWVsQ2FzZShfNDdiKTsKK25vZGUuc3R5bGVbXzQ3ZF09XzQ3YzsKK30KK307Citkb2pvLmh0bWwuc2V0U3R5bGVUZXh0PWZ1bmN0aW9uKF80N2UsdGV4dCl7Cit0cnl7CitfNDdlLnN0eWxlLmNzc1RleHQ9dGV4dDsKK30KK2NhdGNoKGUpeworXzQ3ZS5zZXRBdHRyaWJ1dGUoInN0eWxlIix0ZXh0KTsKK30KK307Citkb2pvLmh0bWwuY29weVN0eWxlPWZ1bmN0aW9uKF80ODAsXzQ4MSl7CitpZighXzQ4MS5zdHlsZS5jc3NUZXh0KXsKK180ODAuc2V0QXR0cmlidXRlKCJzdHlsZSIsXzQ4MS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpOworfWVsc2V7CitfNDgwLnN0eWxlLmNzc1RleHQ9XzQ4MS5zdHlsZS5jc3NUZXh0OworfQorZG9qby5odG1sLmFkZENsYXNzKF80ODAsZG9qby5odG1sLmdldENsYXNzKF80ODEpKTsKK307Citkb2pvLmh0bWwuZ2V0VW5pdFZhbHVlPWZ1bmN0aW9uKG5vZGUsXzQ4MyxfNDg0KXsKK3ZhciBzPWRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsXzQ4Myk7CitpZigoIXMpfHwoKHM9PSJhdXRvIikmJihfNDg0KSkpeworcmV0dXJuIHt2YWx1ZTowLHVuaXRzOiJweCJ9OworfQordmFyIF80ODY9cy5tYXRjaCgvKFwtP1tcZC5dKykoW2EteiVdKikvaSk7CitpZighXzQ4Nil7CityZXR1cm4gZG9qby5odG1sLmdldFVuaXRWYWx1ZS5iYWQ7Cit9CityZXR1cm4ge3ZhbHVlOk51bWJlcihfNDg2WzFdKSx1bml0czpfNDg2WzJdLnRvTG93ZXJDYXNlKCl9OworfTsKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWUuYmFkPXt2YWx1ZTpOYU4sdW5pdHM6IiJ9OworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Citkb2pvLmh0bWwudG9QaXhlbFZhbHVlPWZ1bmN0aW9uKF80ODcsXzQ4OCl7CitpZighXzQ4OCl7CityZXR1cm4gMDsKK30KK2lmKF80ODguc2xpY2UoLTIpPT0icHgiKXsKK3JldHVybiBwYXJzZUZsb2F0KF80ODgpOworfQordmFyIF80ODk9MDsKK3dpdGgoXzQ4Nyl7Cit2YXIgXzQ4YT1zdHlsZS5sZWZ0OwordmFyIF80OGI9cnVudGltZVN0eWxlLmxlZnQ7CitydW50aW1lU3R5bGUubGVmdD1jdXJyZW50U3R5bGUubGVmdDsKK3RyeXsKK3N0eWxlLmxlZnQ9XzQ4OHx8MDsKK180ODk9c3R5bGUucGl4ZWxMZWZ0Oworc3R5bGUubGVmdD1fNDhhOworcnVudGltZVN0eWxlLmxlZnQ9XzQ4YjsKK30KK2NhdGNoKGUpeworfQorfQorcmV0dXJuIF80ODk7Cit9OworfWVsc2V7Citkb2pvLmh0bWwudG9QaXhlbFZhbHVlPWZ1bmN0aW9uKF80OGMsXzQ4ZCl7CityZXR1cm4gKF80OGQmJihfNDhkLnNsaWNlKC0yKT09InB4Iik/cGFyc2VGbG9hdChfNDhkKTowKTsKK307Cit9Citkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZT1mdW5jdGlvbihub2RlLF80OGYsXzQ5MCl7CityZXR1cm4gZG9qby5odG1sLnRvUGl4ZWxWYWx1ZShub2RlLGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsXzQ4ZikpOworfTsKK2Rvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWU9ZnVuY3Rpb24obm9kZSxfNDkyLF80OTMpeworaWYoaXNOYU4oXzQ5MykpeworcmV0dXJuIGZhbHNlOworfQorbm9kZS5zdHlsZVtfNDkyXT1NYXRoLm1heCgwLF80OTMpKyJweCI7CityZXR1cm4gdHJ1ZTsKK307Citkb2pvLmh0bWwuc3R5bGVTaGVldD1udWxsOworZG9qby5odG1sLmluc2VydENzc1J1bGU9ZnVuY3Rpb24oXzQ5NCxfNDk1LF80OTYpeworaWYoIWRvam8uaHRtbC5zdHlsZVNoZWV0KXsKK2lmKGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQpeworZG9qby5odG1sLnN0eWxlU2hlZXQ9ZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCgpOworfWVsc2V7CitpZihkb2N1bWVudC5zdHlsZVNoZWV0c1swXSl7Citkb2pvLmh0bWwuc3R5bGVTaGVldD1kb2N1bWVudC5zdHlsZVNoZWV0c1swXTsKK31lbHNleworcmV0dXJuIG51bGw7Cit9Cit9Cit9CitpZihhcmd1bWVudHMubGVuZ3RoPDMpeworaWYoZG9qby5odG1sLnN0eWxlU2hlZXQuY3NzUnVsZXMpeworXzQ5Nj1kb2pvLmh0bWwuc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGg7Cit9ZWxzZXsKK2lmKGRvam8uaHRtbC5zdHlsZVNoZWV0LnJ1bGVzKXsKK180OTY9ZG9qby5odG1sLnN0eWxlU2hlZXQucnVsZXMubGVuZ3RoOworfWVsc2V7CityZXR1cm4gbnVsbDsKK30KK30KK30KK2lmKGRvam8uaHRtbC5zdHlsZVNoZWV0Lmluc2VydFJ1bGUpewordmFyIHJ1bGU9XzQ5NCsiIHsgIitfNDk1KyIgfSI7CityZXR1cm4gZG9qby5odG1sLnN0eWxlU2hlZXQuaW5zZXJ0UnVsZShydWxlLF80OTYpOworfWVsc2V7CitpZihkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKXsKK3JldHVybiBkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKF80OTQsXzQ5NSxfNDk2KTsKK31lbHNleworcmV0dXJuIG51bGw7Cit9Cit9Cit9OworZG9qby5odG1sLnJlbW92ZUNzc1J1bGU9ZnVuY3Rpb24oXzQ5OCl7CitpZighZG9qby5odG1sLnN0eWxlU2hlZXQpeworZG9qby5kZWJ1Zygibm8gc3R5bGVzaGVldCBkZWZpbmVkIGZvciByZW1vdmluZyBydWxlcyIpOworcmV0dXJuIGZhbHNlOworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CitpZighXzQ5OCl7CitfNDk4PWRvam8uaHRtbC5zdHlsZVNoZWV0LnJ1bGVzLmxlbmd0aDsKK2Rvam8uaHRtbC5zdHlsZVNoZWV0LnJlbW92ZVJ1bGUoXzQ5OCk7Cit9Cit9ZWxzZXsKK2lmKGRvY3VtZW50LnN0eWxlU2hlZXRzWzBdKXsKK2lmKCFfNDk4KXsKK180OTg9ZG9qby5odG1sLnN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoOworfQorZG9qby5odG1sLnN0eWxlU2hlZXQuZGVsZXRlUnVsZShfNDk4KTsKK30KK30KK3JldHVybiB0cnVlOworfTsKK2Rvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcz1bXTsKK2Rvam8uaHRtbC5pbnNlcnRDc3NGaWxlPWZ1bmN0aW9uKFVSSSxkb2MsXzQ5YixfNDljKXsKK2lmKCFVUkkpeworcmV0dXJuOworfQoraWYoIWRvYyl7Citkb2M9ZG9jdW1lbnQ7Cit9Cit2YXIgXzQ5ZD1kb2pvLmhvc3RlbnYuZ2V0VGV4dChVUkksZmFsc2UsXzQ5Yyk7CitpZihfNDlkPT09bnVsbCl7CityZXR1cm47Cit9CitfNDlkPWRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChfNDlkLFVSSSk7CitpZihfNDliKXsKK3ZhciBpZHg9LTEsbm9kZSxlbnQ9ZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzOworZm9yKHZhciBpPTA7aTxlbnQubGVuZ3RoO2krKyl7CitpZigoZW50W2ldLmRvYz09ZG9jKSYmKGVudFtpXS5jc3NUZXh0PT1fNDlkKSl7CitpZHg9aTsKK25vZGU9ZW50W2ldLm5vZGVSZWY7CiticmVhazsKK30KK30KK2lmKG5vZGUpewordmFyIF80YTI9ZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpOworZm9yKHZhciBpPTA7aTxfNGEyLmxlbmd0aDtpKyspeworaWYoXzRhMltpXT09bm9kZSl7CityZXR1cm47Cit9Cit9Citkb2pvLmh0bWwuX2luc2VydGVkQ3NzRmlsZXMuc2hpZnQoaWR4LDEpOworfQorfQordmFyIF80YTM9ZG9qby5odG1sLmluc2VydENzc1RleHQoXzQ5ZCxkb2MpOworZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzLnB1c2goeyJkb2MiOmRvYywiY3NzVGV4dCI6XzQ5ZCwibm9kZVJlZiI6XzRhM30pOworaWYoXzRhMyYmZGpDb25maWcuaXNEZWJ1Zyl7CitfNGEzLnNldEF0dHJpYnV0ZSgiZGJnSHJlZiIsVVJJKTsKK30KK3JldHVybiBfNGEzOworfTsKK2Rvam8uaHRtbC5pbnNlcnRDc3NUZXh0PWZ1bmN0aW9uKF80YTQsZG9jLFVSSSl7CitpZighXzRhNCl7CityZXR1cm47Cit9CitpZighZG9jKXsKK2RvYz1kb2N1bWVudDsKK30KK2lmKFVSSSl7CitfNGE0PWRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChfNGE0LFVSSSk7Cit9Cit2YXIgXzRhNz1kb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKK180YTcuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKTsKK3ZhciBoZWFkPWRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworaWYoIWhlYWQpeworZG9qby5kZWJ1ZygiTm8gaGVhZCB0YWcgaW4gZG9jdW1lbnQsIGFib3J0aW5nIHN0eWxlcyIpOworcmV0dXJuOworfWVsc2V7CitoZWFkLmFwcGVuZENoaWxkKF80YTcpOworfQoraWYoXzRhNy5zdHlsZVNoZWV0KXsKK3ZhciBfNGE5PWZ1bmN0aW9uKCl7Cit0cnl7CitfNGE3LnN0eWxlU2hlZXQuY3NzVGV4dD1fNGE0OworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworfQorfTsKK2lmKF80YTcuc3R5bGVTaGVldC5kaXNhYmxlZCl7CitzZXRUaW1lb3V0KF80YTksMTApOworfWVsc2V7CitfNGE5KCk7Cit9Cit9ZWxzZXsKK3ZhciBfNGFhPWRvYy5jcmVhdGVUZXh0Tm9kZShfNGE0KTsKK180YTcuYXBwZW5kQ2hpbGQoXzRhYSk7Cit9CityZXR1cm4gXzRhNzsKK307Citkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQ9ZnVuY3Rpb24oXzRhYixVUkkpeworaWYoIV80YWJ8fCFVUkkpeworcmV0dXJuOworfQordmFyIF80YWQsc3RyPSIiLHVybD0iIixfNGIwPSJbXFx0XFxzXFx3XFwoXFwpXFwvXFwuXFxcXCdcIi06Iz0mP35dKyI7Cit2YXIgXzRiMT1uZXcgUmVnRXhwKCJ1cmxcXChcXHMqKCIrXzRiMCsiKVxccypcXCkiKTsKK3ZhciBfNGIyPS8oZmlsZXxodHRwcz98ZnRwcz8pOlwvXC8vOworcmVnZXhUcmltPW5ldyBSZWdFeHAoIl5bXFxzXSooWydcIl0/KSgiK180YjArIilcXDFbXFxzXSo/JCIpOworaWYoZG9qby5yZW5kZXIuaHRtbC5pZTU1fHxkb2pvLnJlbmRlci5odG1sLmllNjApewordmFyIF80YjM9bmV3IFJlZ0V4cCgiQWxwaGFJbWFnZUxvYWRlclxcKCguKilzcmM9WydcIl0oIitfNGIwKyIpWydcIl0iKTsKK3doaWxlKF80YWQ9XzRiMy5leGVjKF80YWIpKXsKK3VybD1fNGFkWzJdLnJlcGxhY2UocmVnZXhUcmltLCIkMiIpOworaWYoIV80YjIuZXhlYyh1cmwpKXsKK3VybD0obmV3IGRvam8udXJpLlVyaShVUkksdXJsKS50b1N0cmluZygpKTsKK30KK3N0cis9XzRhYi5zdWJzdHJpbmcoMCxfNGFkLmluZGV4KSsiQWxwaGFJbWFnZUxvYWRlcigiK180YWRbMV0rInNyYz0nIit1cmwrIiciOworXzRhYj1fNGFiLnN1YnN0cihfNGFkLmluZGV4K180YWRbMF0ubGVuZ3RoKTsKK30KK180YWI9c3RyK180YWI7CitzdHI9IiI7Cit9Cit3aGlsZShfNGFkPV80YjEuZXhlYyhfNGFiKSl7Cit1cmw9XzRhZFsxXS5yZXBsYWNlKHJlZ2V4VHJpbSwiJDIiKTsKK2lmKCFfNGIyLmV4ZWModXJsKSl7Cit1cmw9KG5ldyBkb2pvLnVyaS5VcmkoVVJJLHVybCkudG9TdHJpbmcoKSk7Cit9CitzdHIrPV80YWIuc3Vic3RyaW5nKDAsXzRhZC5pbmRleCkrInVybCgiK3VybCsiKSI7CitfNGFiPV80YWIuc3Vic3RyKF80YWQuaW5kZXgrXzRhZFswXS5sZW5ndGgpOworfQorcmV0dXJuIHN0citfNGFiOworfTsKK2Rvam8uaHRtbC5zZXRBY3RpdmVTdHlsZVNoZWV0PWZ1bmN0aW9uKF80YjQpewordmFyIGk9MCxhLGVscz1kb2pvLmRvYygpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7Cit3aGlsZShhPWVsc1tpKytdKXsKK2lmKGEuZ2V0QXR0cmlidXRlKCJyZWwiKS5pbmRleE9mKCJzdHlsZSIpIT0tMSYmYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpeworYS5kaXNhYmxlZD10cnVlOworaWYoYS5nZXRBdHRyaWJ1dGUoInRpdGxlIik9PV80YjQpeworYS5kaXNhYmxlZD1mYWxzZTsKK30KK30KK30KK307Citkb2pvLmh0bWwuZ2V0QWN0aXZlU3R5bGVTaGVldD1mdW5jdGlvbigpewordmFyIGk9MCxhLGVscz1kb2pvLmRvYygpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7Cit3aGlsZShhPWVsc1tpKytdKXsKK2lmKGEuZ2V0QXR0cmlidXRlKCJyZWwiKS5pbmRleE9mKCJzdHlsZSIpIT0tMSYmYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikmJiFhLmRpc2FibGVkKXsKK3JldHVybiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKTsKK30KK30KK3JldHVybiBudWxsOworfTsKK2Rvam8uaHRtbC5nZXRQcmVmZXJyZWRTdHlsZVNoZWV0PWZ1bmN0aW9uKCl7Cit2YXIgaT0wLGEsZWxzPWRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKK3doaWxlKGE9ZWxzW2krK10peworaWYoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikhPS0xJiZhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigiYWx0Iik9PS0xJiZhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSl7CityZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInRpdGxlIik7Cit9Cit9CityZXR1cm4gbnVsbDsKK307Citkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3M9ZnVuY3Rpb24obm9kZSl7Cit2YXIgZHJoPWRvam8ucmVuZGVyLmh0bWw7Cit2YXIgXzRjMD17ZGpfaWU6ZHJoLmllLGRqX2llNTU6ZHJoLmllNTUsZGpfaWU2OmRyaC5pZTYwLGRqX2llNzpkcmguaWU3MCxkal9pZXF1aXJrczpkcmguaWUmJmRyaC5xdWlya3MsZGpfb3BlcmE6ZHJoLm9wZXJhLGRqX29wZXJhODpkcmgub3BlcmEmJihNYXRoLmZsb29yKGRvam8ucmVuZGVyLnZlcnNpb24pPT04KSxkal9vcGVyYTk6ZHJoLm9wZXJhJiYoTWF0aC5mbG9vcihkb2pvLnJlbmRlci52ZXJzaW9uKT09OSksZGpfa2h0bWw6ZHJoLmtodG1sLGRqX3NhZmFyaTpkcmguc2FmYXJpLGRqX2dlY2tvOmRyaC5tb3ppbGxhfTsKK2Zvcih2YXIgcCBpbiBfNGMwKXsKK2lmKF80YzBbcF0peworZG9qby5odG1sLmFkZENsYXNzKG5vZGUscCk7Cit9Cit9Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworZG9qby5odG1sLl90b2dnbGU9ZnVuY3Rpb24obm9kZSxfNGMzLF80YzQpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CitfNGM0KG5vZGUsIV80YzMobm9kZSkpOworcmV0dXJuIF80YzMobm9kZSk7Cit9OworZG9qby5odG1sLnNob3c9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsImRpc3BsYXkiKT09Im5vbmUiKXsKK2Rvam8uaHRtbC5zZXRTdHlsZShub2RlLCJkaXNwbGF5Iiwobm9kZS5kb2pvRGlzcGxheUNhY2hlfHwiIikpOworbm9kZS5kb2pvRGlzcGxheUNhY2hlPXVuZGVmaW5lZDsKK30KK307Citkb2pvLmh0bWwuaGlkZT1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYodHlwZW9mIG5vZGVbImRvam9EaXNwbGF5Q2FjaGUiXT09InVuZGVmaW5lZCIpewordmFyIGQ9ZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwiZGlzcGxheSIpOworaWYoZCE9Im5vbmUiKXsKK25vZGUuZG9qb0Rpc3BsYXlDYWNoZT1kOworfQorfQorZG9qby5odG1sLnNldFN0eWxlKG5vZGUsImRpc3BsYXkiLCJub25lIik7Cit9OworZG9qby5odG1sLnNldFNob3dpbmc9ZnVuY3Rpb24obm9kZSxfNGM5KXsKK2Rvam8uaHRtbFsoXzRjOT8ic2hvdyI6ImhpZGUiKV0obm9kZSk7Cit9OworZG9qby5odG1sLmlzU2hvd2luZz1mdW5jdGlvbihub2RlKXsKK3JldHVybiAoZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwiZGlzcGxheSIpIT0ibm9uZSIpOworfTsKK2Rvam8uaHRtbC50b2dnbGVTaG93aW5nPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsZG9qby5odG1sLmlzU2hvd2luZyxkb2pvLmh0bWwuc2V0U2hvd2luZyk7Cit9OworZG9qby5odG1sLmRpc3BsYXlNYXA9e3RyOiIiLHRkOiIiLHRoOiIiLGltZzoiaW5saW5lIixzcGFuOiJpbmxpbmUiLGlucHV0OiJpbmxpbmUiLGJ1dHRvbjoiaW5saW5lIn07Citkb2pvLmh0bWwuc3VnZ2VzdERpc3BsYXlCeVRhZ05hbWU9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2lmKG5vZGUmJm5vZGUudGFnTmFtZSl7Cit2YXIgdGFnPW5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworcmV0dXJuICh0YWcgaW4gZG9qby5odG1sLmRpc3BsYXlNYXA/ZG9qby5odG1sLmRpc3BsYXlNYXBbdGFnXToiYmxvY2siKTsKK30KK307Citkb2pvLmh0bWwuc2V0RGlzcGxheT1mdW5jdGlvbihub2RlLF80Y2YpeworZG9qby5odG1sLnNldFN0eWxlKG5vZGUsImRpc3BsYXkiLCgoXzRjZiBpbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIF80Y2Y9PSJzdHJpbmciKT9fNGNmOihfNGNmP2Rvam8uaHRtbC5zdWdnZXN0RGlzcGxheUJ5VGFnTmFtZShub2RlKToibm9uZSIpKSk7Cit9OworZG9qby5odG1sLmlzRGlzcGxheWVkPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCJkaXNwbGF5IikhPSJub25lIik7Cit9OworZG9qby5odG1sLnRvZ2dsZURpc3BsYXk9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9qby5odG1sLl90b2dnbGUobm9kZSxkb2pvLmh0bWwuaXNEaXNwbGF5ZWQsZG9qby5odG1sLnNldERpc3BsYXkpOworfTsKK2Rvam8uaHRtbC5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKG5vZGUsXzRkMyl7Citkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwidmlzaWJpbGl0eSIsKChfNGQzIGluc3RhbmNlb2YgU3RyaW5nfHx0eXBlb2YgXzRkMz09InN0cmluZyIpP180ZDM6KF80ZDM/InZpc2libGUiOiJoaWRkZW4iKSkpOworfTsKK2Rvam8uaHRtbC5pc1Zpc2libGU9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsInZpc2liaWxpdHkiKSE9ImhpZGRlbiIpOworfTsKK2Rvam8uaHRtbC50b2dnbGVWaXNpYmlsaXR5PWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsZG9qby5odG1sLmlzVmlzaWJsZSxkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eSk7Cit9OworZG9qby5odG1sLnNldE9wYWNpdHk9ZnVuY3Rpb24obm9kZSxfNGQ3LF80ZDgpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgaD1kb2pvLnJlbmRlci5odG1sOworaWYoIV80ZDgpeworaWYoXzRkNz49MSl7CitpZihoLmllKXsKK2Rvam8uaHRtbC5jbGVhck9wYWNpdHkobm9kZSk7CityZXR1cm47Cit9ZWxzZXsKK180ZDc9MC45OTk5OTk7Cit9Cit9ZWxzZXsKK2lmKF80ZDc8MCl7CitfNGQ3PTA7Cit9Cit9Cit9CitpZihoLmllKXsKK2lmKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09InRyIil7Cit2YXIgdGRzPW5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Citmb3IodmFyIHg9MDt4PHRkcy5sZW5ndGg7eCsrKXsKK3Rkc1t4XS5zdHlsZS5maWx0ZXI9IkFscGhhKE9wYWNpdHk9IitfNGQ3KjEwMCsiKSI7Cit9Cit9Citub2RlLnN0eWxlLmZpbHRlcj0iQWxwaGEoT3BhY2l0eT0iK180ZDcqMTAwKyIpIjsKK31lbHNleworaWYoaC5tb3opeworbm9kZS5zdHlsZS5vcGFjaXR5PV80ZDc7Citub2RlLnN0eWxlLk1vek9wYWNpdHk9XzRkNzsKK31lbHNleworaWYoaC5zYWZhcmkpeworbm9kZS5zdHlsZS5vcGFjaXR5PV80ZDc7Citub2RlLnN0eWxlLktodG1sT3BhY2l0eT1fNGQ3OworfWVsc2V7Citub2RlLnN0eWxlLm9wYWNpdHk9XzRkNzsKK30KK30KK30KK307Citkb2pvLmh0bWwuY2xlYXJPcGFjaXR5PWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgbnM9bm9kZS5zdHlsZTsKK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7CitpZihoLmllKXsKK3RyeXsKK2lmKG5vZGUuZmlsdGVycyYmbm9kZS5maWx0ZXJzLmFscGhhKXsKK25zLmZpbHRlcj0iIjsKK30KK30KK2NhdGNoKGUpeworfQorfWVsc2V7CitpZihoLm1veil7Citucy5vcGFjaXR5PTE7Citucy5Nb3pPcGFjaXR5PTE7Cit9ZWxzZXsKK2lmKGguc2FmYXJpKXsKK25zLm9wYWNpdHk9MTsKK25zLktodG1sT3BhY2l0eT0xOworfWVsc2V7Citucy5vcGFjaXR5PTE7Cit9Cit9Cit9Cit9OworZG9qby5odG1sLmdldE9wYWNpdHk9ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7CitpZihoLmllKXsKK3ZhciBvcGFjPShub2RlLmZpbHRlcnMmJm5vZGUuZmlsdGVycy5hbHBoYSYmdHlwZW9mIG5vZGUuZmlsdGVycy5hbHBoYS5vcGFjaXR5PT0ibnVtYmVyIj9ub2RlLmZpbHRlcnMuYWxwaGEub3BhY2l0eToxMDApLzEwMDsKK31lbHNlewordmFyIG9wYWM9bm9kZS5zdHlsZS5vcGFjaXR5fHxub2RlLnN0eWxlLk1vek9wYWNpdHl8fG5vZGUuc3R5bGUuS2h0bWxPcGFjaXR5fHwxOworfQorcmV0dXJuIG9wYWM+PTAuOTk5OTk5PzE6TnVtYmVyKG9wYWMpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmNvbG9yIik7Citkb2pvLmh0bWwuZ2V0QmFja2dyb3VuZENvbG9yPWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgXzRlMzsKK2RveworXzRlMz1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYmFja2dyb3VuZC1jb2xvciIpOworaWYoXzRlMy50b0xvd2VyQ2FzZSgpPT0icmdiYSgwLCAwLCAwLCAwKSIpeworXzRlMz0idHJhbnNwYXJlbnQiOworfQoraWYobm9kZT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSl7Citub2RlPW51bGw7CiticmVhazsKK30KK25vZGU9bm9kZS5wYXJlbnROb2RlOworfXdoaWxlKG5vZGUmJmRvam8ubGFuZy5pbkFycmF5KFsidHJhbnNwYXJlbnQiLCIiXSxfNGUzKSk7CitpZihfNGUzPT0idHJhbnNwYXJlbnQiKXsKK180ZTM9WzI1NSwyNTUsMjU1LDBdOworfWVsc2V7CitfNGUzPWRvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0IoXzRlMyk7Cit9CityZXR1cm4gXzRlMzsKK307Citkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5sYXlvdXQiKTsKK2Rvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXM9ZnVuY3Rpb24obm9kZSxwcm9wKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOworaWYoIW5vZGUpeworcmV0dXJuIDA7Cit9Cit2YXIgXzRlNj0wOword2hpbGUobm9kZSl7CitpZihkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCJwb3NpdGlvbiIpPT0iZml4ZWQiKXsKK3JldHVybiAwOworfQordmFyIHZhbD1ub2RlW3Byb3BdOworaWYodmFsKXsKK180ZTYrPXZhbC0wOworaWYobm9kZT09ZG9qby5ib2R5KCkpeworYnJlYWs7Cit9Cit9Citub2RlPW5vZGUucGFyZW50Tm9kZTsKK30KK3JldHVybiBfNGU2OworfTsKK2Rvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXM9ZnVuY3Rpb24obm9kZSxfNGU5KXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIF80ZWE9XzRlOS5yZXBsYWNlKC8oOyk/XHMqJC8sIiIpLnNwbGl0KCI7Iik7Citmb3IodmFyIGk9MDtpPF80ZWEubGVuZ3RoO2krKyl7Cit2YXIgXzRlYz1fNGVhW2ldLnNwbGl0KCI6Iik7Cit2YXIgbmFtZT1fNGVjWzBdLnJlcGxhY2UoL1xzKiQvLCIiKS5yZXBsYWNlKC9eXHMqLywiIikudG9Mb3dlckNhc2UoKTsKK3ZhciBfNGVlPV80ZWNbMV0ucmVwbGFjZSgvXHMqJC8sIiIpLnJlcGxhY2UoL15ccyovLCIiKTsKK3N3aXRjaChuYW1lKXsKK2Nhc2UgIm9wYWNpdHkiOgorZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSxfNGVlKTsKK2JyZWFrOworY2FzZSAiY29udGVudC1oZWlnaHQiOgorZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSx7aGVpZ2h0Ol80ZWV9KTsKK2JyZWFrOworY2FzZSAiY29udGVudC13aWR0aCI6Citkb2pvLmh0bWwuc2V0Q29udGVudEJveChub2RlLHt3aWR0aDpfNGVlfSk7CiticmVhazsKK2Nhc2UgIm91dGVyLWhlaWdodCI6Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94KG5vZGUse2hlaWdodDpfNGVlfSk7CiticmVhazsKK2Nhc2UgIm91dGVyLXdpZHRoIjoKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSx7d2lkdGg6XzRlZX0pOworYnJlYWs7CitkZWZhdWx0Ogorbm9kZS5zdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UobmFtZSldPV80ZWU7Cit9Cit9Cit9OworZG9qby5odG1sLmJveFNpemluZz17TUFSR0lOX0JPWDoibWFyZ2luLWJveCIsQk9SREVSX0JPWDoiYm9yZGVyLWJveCIsUEFERElOR19CT1g6InBhZGRpbmctYm94IixDT05URU5UX0JPWDoiY29udGVudC1ib3gifTsKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uPWRvam8uaHRtbC5hYnM9ZnVuY3Rpb24obm9kZSxfNGYwLF80ZjEpeworbm9kZT1kb2pvLmJ5SWQobm9kZSxub2RlLm93bmVyRG9jdW1lbnQpOwordmFyIHJldD17eDowLHk6MH07Cit2YXIgYnM9ZG9qby5odG1sLmJveFNpemluZzsKK2lmKCFfNGYxKXsKK180ZjE9YnMuQ09OVEVOVF9CT1g7Cit9Cit2YXIgXzRmND0yOwordmFyIF80ZjU7Citzd2l0Y2goXzRmMSl7CitjYXNlIGJzLk1BUkdJTl9CT1g6CitfNGY1PTM7CiticmVhazsKK2Nhc2UgYnMuQk9SREVSX0JPWDoKK180ZjU9MjsKK2JyZWFrOworY2FzZSBicy5QQURESU5HX0JPWDoKK2RlZmF1bHQ6CitfNGY1PTE7CiticmVhazsKK2Nhc2UgYnMuQ09OVEVOVF9CT1g6CitfNGY1PTA7CiticmVhazsKK30KK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7Cit2YXIgZGI9ZG9jdW1lbnRbImJvZHkiXXx8ZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdOworaWYoaC5pZSl7Cit3aXRoKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpeworcmV0Lng9bGVmdC0yOworcmV0Lnk9dG9wLTI7Cit9Cit9ZWxzZXsKK2lmKGRvY3VtZW50LmdldEJveE9iamVjdEZvcil7CitfNGY0PTE7Cit0cnl7Cit2YXIgYm89ZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yKG5vZGUpOworcmV0Lng9Ym8ueC1kb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsInNjcm9sbExlZnQiKTsKK3JldC55PWJvLnktZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyhub2RlLCJzY3JvbGxUb3AiKTsKK30KK2NhdGNoKGUpeworfQorfWVsc2V7CitpZihub2RlWyJvZmZzZXRQYXJlbnQiXSl7Cit2YXIgXzRmOTsKK2lmKChoLnNhZmFyaSkmJihub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoInBvc2l0aW9uIik9PSJhYnNvbHV0ZSIpJiYobm9kZS5wYXJlbnROb2RlPT1kYikpeworXzRmOT1kYjsKK31lbHNleworXzRmOT1kYi5wYXJlbnROb2RlOworfQoraWYobm9kZS5wYXJlbnROb2RlIT1kYil7Cit2YXIgbmQ9bm9kZTsKK2lmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworbmQ9ZGI7Cit9CityZXQueC09ZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyhuZCwic2Nyb2xsTGVmdCIpOworcmV0LnktPWRvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXMobmQsInNjcm9sbFRvcCIpOworfQordmFyIF80ZmI9bm9kZTsKK2RvewordmFyIG49XzRmYlsib2Zmc2V0TGVmdCJdOworaWYoIWgub3BlcmF8fG4+MCl7CityZXQueCs9aXNOYU4obik/MDpuOworfQordmFyIG09XzRmYlsib2Zmc2V0VG9wIl07CityZXQueSs9aXNOYU4obSk/MDptOworXzRmYj1fNGZiLm9mZnNldFBhcmVudDsKK313aGlsZSgoXzRmYiE9XzRmOSkmJihfNGZiIT1udWxsKSk7Cit9ZWxzZXsKK2lmKG5vZGVbIngiXSYmbm9kZVsieSJdKXsKK3JldC54Kz1pc05hTihub2RlLngpPzA6bm9kZS54OworcmV0LnkrPWlzTmFOKG5vZGUueSk/MDpub2RlLnk7Cit9Cit9Cit9Cit9CitpZihfNGYwKXsKK3ZhciBfNGZlPWRvam8uaHRtbC5nZXRTY3JvbGwoKTsKK3JldC55Kz1fNGZlLnRvcDsKK3JldC54Kz1fNGZlLmxlZnQ7Cit9Cit2YXIgXzRmZj1bZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQsZG9qby5odG1sLmdldEJvcmRlckV4dGVudCxkb2pvLmh0bWwuZ2V0TWFyZ2luRXh0ZW50XTsKK2lmKF80ZjQ+XzRmNSl7Citmb3IodmFyIGk9XzRmNTtpPF80ZjQ7KytpKXsKK3JldC55Kz1fNGZmW2ldKG5vZGUsInRvcCIpOworcmV0LngrPV80ZmZbaV0obm9kZSwibGVmdCIpOworfQorfWVsc2V7CitpZihfNGY0PF80ZjUpeworZm9yKHZhciBpPV80ZjU7aT5fNGY0Oy0taSl7CityZXQueS09XzRmZltpLTFdKG5vZGUsInRvcCIpOworcmV0LngtPV80ZmZbaS0xXShub2RlLCJsZWZ0Iik7Cit9Cit9Cit9CityZXQudG9wPXJldC55OworcmV0LmxlZnQ9cmV0Lng7CityZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5pc1Bvc2l0aW9uQWJzb2x1dGU9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsInBvc2l0aW9uIik9PSJhYnNvbHV0ZSIpOworfTsKK2Rvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXM9ZnVuY3Rpb24obm9kZSxfNTAzLF81MDQpewordmFyIF81MDU9MDsKK2Zvcih2YXIgeD0wO3g8XzUwMy5sZW5ndGg7eCsrKXsKK181MDUrPWRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKG5vZGUsXzUwM1t4XSxfNTA0KTsKK30KK3JldHVybiBfNTA1OworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW49ZnVuY3Rpb24obm9kZSl7CityZXR1cm4ge3dpZHRoOmRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSxbIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0Il0sKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsInBvc2l0aW9uIik9PSJhYnNvbHV0ZSIpKSxoZWlnaHQ6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLFsibWFyZ2luLXRvcCIsIm1hcmdpbi1ib3R0b20iXSwoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwicG9zaXRpb24iKT09ImFic29sdXRlIikpfTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyPWZ1bmN0aW9uKG5vZGUpeworcmV0dXJuIHt3aWR0aDpkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsImxlZnQiKStkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsInJpZ2h0IiksaGVpZ2h0OmRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwidG9wIikrZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCJib3R0b20iKX07Cit9OworZG9qby5odG1sLmdldEJvcmRlckV4dGVudD1mdW5jdGlvbihub2RlLHNpZGUpeworcmV0dXJuIChkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYm9yZGVyLSIrc2lkZSsiLXN0eWxlIik9PSJub25lIj8wOmRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKG5vZGUsImJvcmRlci0iK3NpZGUrIi13aWR0aCIpKTsKK307Citkb2pvLmh0bWwuZ2V0TWFyZ2luRXh0ZW50PWZ1bmN0aW9uKG5vZGUsc2lkZSl7CityZXR1cm4gZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLFsibWFyZ2luLSIrc2lkZV0sZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZShub2RlKSk7Cit9OworZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQ9ZnVuY3Rpb24obm9kZSxzaWRlKXsKK3JldHVybiBkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsWyJwYWRkaW5nLSIrc2lkZV0sdHJ1ZSk7Cit9OworZG9qby5odG1sLmdldFBhZGRpbmc9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4ge3dpZHRoOmRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSxbInBhZGRpbmctbGVmdCIsInBhZGRpbmctcmlnaHQiXSx0cnVlKSxoZWlnaHQ6ZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLFsicGFkZGluZy10b3AiLCJwYWRkaW5nLWJvdHRvbSJdLHRydWUpfTsKK307Citkb2pvLmh0bWwuZ2V0UGFkQm9yZGVyPWZ1bmN0aW9uKG5vZGUpewordmFyIHBhZD1kb2pvLmh0bWwuZ2V0UGFkZGluZyhub2RlKTsKK3ZhciBfNTEyPWRvam8uaHRtbC5nZXRCb3JkZXIobm9kZSk7CityZXR1cm4ge3dpZHRoOnBhZC53aWR0aCtfNTEyLndpZHRoLGhlaWdodDpwYWQuaGVpZ2h0K181MTIuaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuZ2V0Qm94U2l6aW5nPWZ1bmN0aW9uKG5vZGUpewordmFyIGg9ZG9qby5yZW5kZXIuaHRtbDsKK3ZhciBicz1kb2pvLmh0bWwuYm94U2l6aW5nOworaWYoKChoLmllKXx8KGgub3BlcmEpKSYmbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0iaW1nIil7Cit2YXIgY209ZG9jdW1lbnRbImNvbXBhdE1vZGUiXTsKK2lmKChjbT09IkJhY2tDb21wYXQiKXx8KGNtPT0iUXVpcmtzTW9kZSIpKXsKK3JldHVybiBicy5CT1JERVJfQk9YOworfWVsc2V7CityZXR1cm4gYnMuQ09OVEVOVF9CT1g7Cit9Cit9ZWxzZXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTApeworbm9kZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Cit9Cit2YXIgXzUxNzsKK2lmKCFoLmllKXsKK181MTc9ZG9qby5odG1sLmdldFN0eWxlKG5vZGUsIi1tb3otYm94LXNpemluZyIpOworaWYoIV81MTcpeworXzUxNz1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYm94LXNpemluZyIpOworfQorfQorcmV0dXJuIChfNTE3P181MTc6YnMuQ09OVEVOVF9CT1gpOworfQorfTsKK2Rvam8uaHRtbC5pc0JvcmRlckJveD1mdW5jdGlvbihub2RlKXsKK3JldHVybiAoZG9qby5odG1sLmdldEJveFNpemluZyhub2RlKT09ZG9qby5odG1sLmJveFNpemluZy5CT1JERVJfQk9YKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94PWZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7CityZXR1cm4ge3dpZHRoOm5vZGUub2Zmc2V0V2lkdGgsaGVpZ2h0Om5vZGUub2Zmc2V0SGVpZ2h0fTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZ0JveD1mdW5jdGlvbihub2RlKXsKK3ZhciBib3g9ZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsKK3ZhciBfNTFjPWRvam8uaHRtbC5nZXRCb3JkZXIobm9kZSk7CityZXR1cm4ge3dpZHRoOmJveC53aWR0aC1fNTFjLndpZHRoLGhlaWdodDpib3guaGVpZ2h0LV81MWMuaGVpZ2h0fTsKK307Citkb2pvLmh0bWwuZ2V0Q29udGVudEJveD1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIF81MWU9ZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKTsKK3JldHVybiB7d2lkdGg6bm9kZS5vZmZzZXRXaWR0aC1fNTFlLndpZHRoLGhlaWdodDpub2RlLm9mZnNldEhlaWdodC1fNTFlLmhlaWdodH07Cit9OworZG9qby5odG1sLnNldENvbnRlbnRCb3g9ZnVuY3Rpb24obm9kZSxhcmdzKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIF81MjE9MDsKK3ZhciBfNTIyPTA7Cit2YXIgaXNiYj1kb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7Cit2YXIgXzUyND0oaXNiYj9kb2pvLmh0bWwuZ2V0UGFkQm9yZGVyKG5vZGUpOnt3aWR0aDowLGhlaWdodDowfSk7Cit2YXIgcmV0PXt9OworaWYodHlwZW9mIGFyZ3Mud2lkdGghPSJ1bmRlZmluZWQiKXsKK181MjE9YXJncy53aWR0aCtfNTI0LndpZHRoOworcmV0LndpZHRoPWRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwid2lkdGgiLF81MjEpOworfQoraWYodHlwZW9mIGFyZ3MuaGVpZ2h0IT0idW5kZWZpbmVkIil7CitfNTIyPWFyZ3MuaGVpZ2h0K181MjQuaGVpZ2h0OworcmV0LmhlaWdodD1kb2pvLmh0bWwuc2V0UG9zaXRpdmVQaXhlbFZhbHVlKG5vZGUsImhlaWdodCIsXzUyMik7Cit9CityZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5Cb3g9ZnVuY3Rpb24obm9kZSl7Cit2YXIgXzUyNz1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOwordmFyIF81Mjg9ZG9qby5odG1sLmdldE1hcmdpbihub2RlKTsKK3JldHVybiB7d2lkdGg6XzUyNy53aWR0aCtfNTI4LndpZHRoLGhlaWdodDpfNTI3LmhlaWdodCtfNTI4LmhlaWdodH07Cit9OworZG9qby5odG1sLnNldE1hcmdpbkJveD1mdW5jdGlvbihub2RlLGFyZ3Mpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Cit2YXIgXzUyYj0wOwordmFyIF81MmM9MDsKK3ZhciBpc2JiPWRvam8uaHRtbC5pc0JvcmRlckJveChub2RlKTsKK3ZhciBfNTJlPSghaXNiYj9kb2pvLmh0bWwuZ2V0UGFkQm9yZGVyKG5vZGUpOnt3aWR0aDowLGhlaWdodDowfSk7Cit2YXIgXzUyZj1kb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOwordmFyIHJldD17fTsKK2lmKHR5cGVvZiBhcmdzLndpZHRoIT0idW5kZWZpbmVkIil7CitfNTJiPWFyZ3Mud2lkdGgtXzUyZS53aWR0aDsKK181MmItPV81MmYud2lkdGg7CityZXQud2lkdGg9ZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCJ3aWR0aCIsXzUyYik7Cit9CitpZih0eXBlb2YgYXJncy5oZWlnaHQhPSJ1bmRlZmluZWQiKXsKK181MmM9YXJncy5oZWlnaHQtXzUyZS5oZWlnaHQ7CitfNTJjLT1fNTJmLmhlaWdodDsKK3JldC5oZWlnaHQ9ZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCJoZWlnaHQiLF81MmMpOworfQorcmV0dXJuIHJldDsKK307Citkb2pvLmh0bWwuZ2V0RWxlbWVudEJveD1mdW5jdGlvbihub2RlLHR5cGUpewordmFyIGJzPWRvam8uaHRtbC5ib3hTaXppbmc7Citzd2l0Y2godHlwZSl7CitjYXNlIGJzLk1BUkdJTl9CT1g6CityZXR1cm4gZG9qby5odG1sLmdldE1hcmdpbkJveChub2RlKTsKK2Nhc2UgYnMuQk9SREVSX0JPWDoKK3JldHVybiBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOworY2FzZSBicy5QQURESU5HX0JPWDoKK3JldHVybiBkb2pvLmh0bWwuZ2V0UGFkZGluZ0JveChub2RlKTsKK2Nhc2UgYnMuQ09OVEVOVF9CT1g6CitkZWZhdWx0OgorcmV0dXJuIGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpOworfQorfTsKK2Rvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3Q9ZG9qby5odG1sLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKF81MzQsXzUzNSxfNTM2KXsKK2lmKF81MzQgaW5zdGFuY2VvZiBBcnJheXx8dHlwZW9mIF81MzQ9PSJhcnJheSIpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkiLCJ1c2UgZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdCh7bGVmdDogLCB0b3A6ICwgd2lkdGg6ICwgaGVpZ2h0OiB9KSBpbnN0ZWFkIiwiMC41Iik7Cit3aGlsZShfNTM0Lmxlbmd0aDw0KXsKK181MzQucHVzaCgwKTsKK30KK3doaWxlKF81MzQubGVuZ3RoPjQpeworXzUzNC5wb3AoKTsKK30KK3ZhciByZXQ9e2xlZnQ6XzUzNFswXSx0b3A6XzUzNFsxXSx3aWR0aDpfNTM0WzJdLGhlaWdodDpfNTM0WzNdfTsKK31lbHNleworaWYoIV81MzQubm9kZVR5cGUmJiEoXzUzNCBpbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIF81MzQ9PSJzdHJpbmciKSYmKCJ3aWR0aCIgaW4gXzUzNHx8ImhlaWdodCIgaW4gXzUzNHx8ImxlZnQiIGluIF81MzR8fCJ4IiBpbiBfNTM0fHwidG9wIiBpbiBfNTM0fHwieSIgaW4gXzUzNCkpewordmFyIHJldD17bGVmdDpfNTM0LmxlZnR8fF81MzQueHx8MCx0b3A6XzUzNC50b3B8fF81MzQueXx8MCx3aWR0aDpfNTM0LndpZHRofHwwLGhlaWdodDpfNTM0LmhlaWdodHx8MH07Cit9ZWxzZXsKK3ZhciBub2RlPWRvam8uYnlJZChfNTM0KTsKK3ZhciBwb3M9ZG9qby5odG1sLmFicyhub2RlLF81MzUsXzUzNik7Cit2YXIgXzUzYT1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KG5vZGUpOwordmFyIHJldD17bGVmdDpwb3MubGVmdCx0b3A6cG9zLnRvcCx3aWR0aDpfNTNhLndpZHRoLGhlaWdodDpfNTNhLmhlaWdodH07Cit9Cit9CityZXQueD1yZXQubGVmdDsKK3JldC55PXJldC50b3A7CityZXR1cm4gcmV0OworfTsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3hXaWR0aD1kb2pvLmh0bWwuc2V0T3V0ZXJXaWR0aD1mdW5jdGlvbihub2RlLF81M2MpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldE1hcmdpbkJveFdpZHRoIiwic2V0TWFyZ2luQm94Iixhcmd1bWVudHMsIndpZHRoIik7Cit9OworZG9qby5odG1sLnNldE1hcmdpbkJveEhlaWdodD1kb2pvLmh0bWwuc2V0T3V0ZXJIZWlnaHQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRNYXJnaW5Cb3hIZWlnaHQiLCJzZXRNYXJnaW5Cb3giLGFyZ3VtZW50cywiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldE1hcmdpbkJveFdpZHRoPWRvam8uaHRtbC5nZXRPdXRlcldpZHRoPWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luQm94V2lkdGgiLCJnZXRNYXJnaW5Cb3giLGFyZ3VtZW50cyxudWxsLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5Cb3hIZWlnaHQ9ZG9qby5odG1sLmdldE91dGVySGVpZ2h0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luQm94SGVpZ2h0IiwiZ2V0TWFyZ2luQm94Iixhcmd1bWVudHMsbnVsbCwiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldFRvdGFsT2Zmc2V0PWZ1bmN0aW9uKG5vZGUsdHlwZSxfNTNmKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRUb3RhbE9mZnNldCIsImdldEFic29sdXRlUG9zaXRpb24iLGFyZ3VtZW50cyxudWxsLHR5cGUpOworfTsKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVg9ZnVuY3Rpb24obm9kZSxfNTQxKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRBYnNvbHV0ZVgiLCJnZXRBYnNvbHV0ZVBvc2l0aW9uIixhcmd1bWVudHMsbnVsbCwieCIpOworfTsKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVk9ZnVuY3Rpb24obm9kZSxfNTQzKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRBYnNvbHV0ZVkiLCJnZXRBYnNvbHV0ZVBvc2l0aW9uIixhcmd1bWVudHMsbnVsbCwieSIpOworfTsKK2Rvam8uaHRtbC50b3RhbE9mZnNldExlZnQ9ZnVuY3Rpb24obm9kZSxfNTQ1KXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJ0b3RhbE9mZnNldExlZnQiLCJnZXRBYnNvbHV0ZVBvc2l0aW9uIixhcmd1bWVudHMsbnVsbCwibGVmdCIpOworfTsKK2Rvam8uaHRtbC50b3RhbE9mZnNldFRvcD1mdW5jdGlvbihub2RlLF81NDcpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInRvdGFsT2Zmc2V0VG9wIiwiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsYXJndW1lbnRzLG51bGwsInRvcCIpOworfTsKK2Rvam8uaHRtbC5nZXRNYXJnaW5XaWR0aD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5XaWR0aCIsImdldE1hcmdpbiIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldE1hcmdpbkhlaWdodD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5IZWlnaHQiLCJnZXRNYXJnaW4iLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyV2lkdGg9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Qm9yZGVyV2lkdGgiLCJnZXRCb3JkZXIiLGFyZ3VtZW50cyxudWxsLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5nZXRCb3JkZXJIZWlnaHQ9ZnVuY3Rpb24obm9kZSl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Qm9yZGVySGVpZ2h0IiwiZ2V0Qm9yZGVyIixhcmd1bWVudHMsbnVsbCwiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLmdldFBhZGRpbmdXaWR0aD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRQYWRkaW5nV2lkdGgiLCJnZXRQYWRkaW5nIixhcmd1bWVudHMsbnVsbCwid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0UGFkZGluZ0hlaWdodD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRQYWRkaW5nSGVpZ2h0IiwiZ2V0UGFkZGluZyIsYXJndW1lbnRzLG51bGwsImhlaWdodCIpOworfTsKK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXJXaWR0aD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRQYWRCb3JkZXJXaWR0aCIsImdldFBhZEJvcmRlciIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldFBhZEJvcmRlckhlaWdodD1mdW5jdGlvbihub2RlKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRQYWRCb3JkZXJIZWlnaHQiLCJnZXRQYWRCb3JkZXIiLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94V2lkdGg9ZG9qby5odG1sLmdldElubmVyV2lkdGg9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJCb3hXaWR0aCIsImdldEJvcmRlckJveCIsYXJndW1lbnRzLG51bGwsIndpZHRoIik7Cit9OworZG9qby5odG1sLmdldEJvcmRlckJveEhlaWdodD1kb2pvLmh0bWwuZ2V0SW5uZXJIZWlnaHQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJCb3hIZWlnaHQiLCJnZXRCb3JkZXJCb3giLGFyZ3VtZW50cyxudWxsLCJoZWlnaHQiKTsKK307Citkb2pvLmh0bWwuZ2V0Q29udGVudEJveFdpZHRoPWRvam8uaHRtbC5nZXRDb250ZW50V2lkdGg9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRDb250ZW50Qm94V2lkdGgiLCJnZXRDb250ZW50Qm94Iixhcmd1bWVudHMsbnVsbCwid2lkdGgiKTsKK307Citkb2pvLmh0bWwuZ2V0Q29udGVudEJveEhlaWdodD1kb2pvLmh0bWwuZ2V0Q29udGVudEhlaWdodD1mdW5jdGlvbigpeworcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldENvbnRlbnRCb3hIZWlnaHQiLCJnZXRDb250ZW50Qm94Iixhcmd1bWVudHMsbnVsbCwiaGVpZ2h0Iik7Cit9OworZG9qby5odG1sLnNldENvbnRlbnRCb3hXaWR0aD1kb2pvLmh0bWwuc2V0Q29udGVudFdpZHRoPWZ1bmN0aW9uKG5vZGUsXzU1MSl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0Q29udGVudEJveFdpZHRoIiwic2V0Q29udGVudEJveCIsYXJndW1lbnRzLCJ3aWR0aCIpOworfTsKK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94SGVpZ2h0PWRvam8uaHRtbC5zZXRDb250ZW50SGVpZ2h0PWZ1bmN0aW9uKG5vZGUsXzU1Myl7CityZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0Q29udGVudEJveEhlaWdodCIsInNldENvbnRlbnRCb3giLGFyZ3VtZW50cywiaGVpZ2h0Iik7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmxmeC5odG1sIik7Citkb2pvLmxmeC5odG1sLl9ieUlkPWZ1bmN0aW9uKF81NTQpeworaWYoIV81NTQpeworcmV0dXJuIFtdOworfQoraWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKF81NTQpKXsKK2lmKCFfNTU0LmFscmVhZHlDaGVja2VkKXsKK3ZhciBuPVtdOworZG9qby5sYW5nLmZvckVhY2goXzU1NCxmdW5jdGlvbihub2RlKXsKK24ucHVzaChkb2pvLmJ5SWQobm9kZSkpOworfSk7CituLmFscmVhZHlDaGVja2VkPXRydWU7CityZXR1cm4gbjsKK31lbHNleworcmV0dXJuIF81NTQ7Cit9Cit9ZWxzZXsKK3ZhciBuPVtdOworbi5wdXNoKGRvam8uYnlJZChfNTU0KSk7CituLmFscmVhZHlDaGVja2VkPXRydWU7CityZXR1cm4gbjsKK30KK307Citkb2pvLmxmeC5odG1sLnByb3BlcnR5QW5pbWF0aW9uPWZ1bmN0aW9uKF81NTcsXzU1OCxfNTU5LF81NWEsXzU1Yil7CitfNTU3PWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzU1Nyk7Cit2YXIgXzU1Yz17InByb3BlcnR5TWFwIjpfNTU4LCJub2RlcyI6XzU1NywiZHVyYXRpb24iOl81NTksImVhc2luZyI6XzU1YXx8ZG9qby5sZnguZWFzZURlZmF1bHR9OwordmFyIF81NWQ9ZnVuY3Rpb24oYXJncyl7CitpZihhcmdzLm5vZGVzLmxlbmd0aD09MSl7Cit2YXIgcG09YXJncy5wcm9wZXJ0eU1hcDsKK2lmKCFkb2pvLmxhbmcuaXNBcnJheShhcmdzLnByb3BlcnR5TWFwKSl7Cit2YXIgcGFycj1bXTsKK2Zvcih2YXIgXzU2MSBpbiBwbSl7CitwbVtfNTYxXS5wcm9wZXJ0eT1fNTYxOworcGFyci5wdXNoKHBtW181NjFdKTsKK30KK3BtPWFyZ3MucHJvcGVydHlNYXA9cGFycjsKK30KK2Rvam8ubGFuZy5mb3JFYWNoKHBtLGZ1bmN0aW9uKHByb3ApeworaWYoZGpfdW5kZWYoInN0YXJ0Iixwcm9wKSl7CitpZihwcm9wLnByb3BlcnR5IT0ib3BhY2l0eSIpeworcHJvcC5zdGFydD1wYXJzZUludChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShhcmdzLm5vZGVzWzBdLHByb3AucHJvcGVydHkpKTsKK31lbHNleworcHJvcC5zdGFydD1kb2pvLmh0bWwuZ2V0T3BhY2l0eShhcmdzLm5vZGVzWzBdKTsKK30KK30KK30pOworfQorfTsKK3ZhciBfNTYzPWZ1bmN0aW9uKF81NjQpewordmFyIF81NjU9W107Citkb2pvLmxhbmcuZm9yRWFjaChfNTY0LGZ1bmN0aW9uKGMpeworXzU2NS5wdXNoKE1hdGgucm91bmQoYykpOworfSk7CityZXR1cm4gXzU2NTsKK307Cit2YXIgXzU2Nz1mdW5jdGlvbihuLF81Njkpeworbj1kb2pvLmJ5SWQobik7CitpZighbnx8IW4uc3R5bGUpeworcmV0dXJuOworfQorZm9yKHZhciBzIGluIF81NjkpewordHJ5eworaWYocz09Im9wYWNpdHkiKXsKK2Rvam8uaHRtbC5zZXRPcGFjaXR5KG4sXzU2OVtzXSk7Cit9ZWxzZXsKK24uc3R5bGVbc109XzU2OVtzXTsKK30KK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK30KK307Cit2YXIgXzU2Yj1mdW5jdGlvbihfNTZjKXsKK3RoaXMuX3Byb3BlcnRpZXM9XzU2YzsKK3RoaXMuZGlmZnM9bmV3IEFycmF5KF81NmMubGVuZ3RoKTsKK2Rvam8ubGFuZy5mb3JFYWNoKF81NmMsZnVuY3Rpb24ocHJvcCxpKXsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHByb3Auc3RhcnQpKXsKK3Byb3Auc3RhcnQ9cHJvcC5zdGFydChwcm9wLGkpOworfQoraWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5lbmQpKXsKK3Byb3AuZW5kPXByb3AuZW5kKHByb3AsaSk7Cit9CitpZihkb2pvLmxhbmcuaXNBcnJheShwcm9wLnN0YXJ0KSl7Cit0aGlzLmRpZmZzW2ldPW51bGw7Cit9ZWxzZXsKK2lmKHByb3Auc3RhcnQgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcil7Citwcm9wLnN0YXJ0UmdiPXByb3Auc3RhcnQudG9SZ2IoKTsKK3Byb3AuZW5kUmdiPXByb3AuZW5kLnRvUmdiKCk7Cit9ZWxzZXsKK3RoaXMuZGlmZnNbaV09cHJvcC5lbmQtcHJvcC5zdGFydDsKK30KK30KK30sdGhpcyk7Cit0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKG4pewordmFyIHJldD17fTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuX3Byb3BlcnRpZXMsZnVuY3Rpb24ocHJvcCxpKXsKK3ZhciBfNTczPW51bGw7CitpZihkb2pvLmxhbmcuaXNBcnJheShwcm9wLnN0YXJ0KSl7Cit9ZWxzZXsKK2lmKHByb3Auc3RhcnQgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcil7CitfNTczPShwcm9wLnVuaXRzfHwicmdiIikrIigiOworZm9yKHZhciBqPTA7ajxwcm9wLnN0YXJ0UmdiLmxlbmd0aDtqKyspeworXzU3Mys9TWF0aC5yb3VuZCgoKHByb3AuZW5kUmdiW2pdLXByb3Auc3RhcnRSZ2Jbal0pKm4pK3Byb3Auc3RhcnRSZ2Jbal0pKyhqPHByb3Auc3RhcnRSZ2IubGVuZ3RoLTE/IiwiOiIiKTsKK30KK181NzMrPSIpIjsKK31lbHNleworXzU3Mz0oKHRoaXMuZGlmZnNbaV0pKm4pK3Byb3Auc3RhcnQrKHByb3AucHJvcGVydHkhPSJvcGFjaXR5Ij9wcm9wLnVuaXRzfHwicHgiOiIiKTsKK30KK30KK3JldFtkb2pvLmh0bWwudG9DYW1lbENhc2UocHJvcC5wcm9wZXJ0eSldPV81NzM7Cit9LHRoaXMpOworcmV0dXJuIHJldDsKK307Cit9OwordmFyIGFuaW09bmV3IGRvam8ubGZ4LkFuaW1hdGlvbih7YmVmb3JlQmVnaW46ZnVuY3Rpb24oKXsKK181NWQoXzU1Yyk7CithbmltLmN1cnZlPW5ldyBfNTZiKF81NWMucHJvcGVydHlNYXApOworfSxvbkFuaW1hdGU6ZnVuY3Rpb24oXzU3Nil7Citkb2pvLmxhbmcuZm9yRWFjaChfNTVjLm5vZGVzLGZ1bmN0aW9uKG5vZGUpeworXzU2Nyhub2RlLF81NzYpOworfSk7Cit9fSxfNTVjLmR1cmF0aW9uLG51bGwsXzU1Yy5lYXNpbmcpOworaWYoXzU1Yil7Citmb3IodmFyIHggaW4gXzU1Yil7CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihfNTViW3hdKSl7CithbmltLmNvbm5lY3QoeCxhbmltLF81NWJbeF0pOworfQorfQorfQorcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5fbWFrZUZhZGVhYmxlPWZ1bmN0aW9uKF81NzkpewordmFyIF81N2E9ZnVuY3Rpb24obm9kZSl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2lmKChub2RlLnN0eWxlLnpvb20ubGVuZ3RoPT0wKSYmKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJ6b29tIik9PSJub3JtYWwiKSl7Citub2RlLnN0eWxlLnpvb209IjEiOworfQoraWYoKG5vZGUuc3R5bGUud2lkdGgubGVuZ3RoPT0wKSYmKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCJ3aWR0aCIpPT0iYXV0byIpKXsKK25vZGUuc3R5bGUud2lkdGg9ImF1dG8iOworfQorfQorfTsKK2lmKGRvam8ubGFuZy5pc0FycmF5TGlrZShfNTc5KSl7Citkb2pvLmxhbmcuZm9yRWFjaChfNTc5LF81N2EpOworfWVsc2V7CitfNTdhKF81NzkpOworfQorfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZT1mdW5jdGlvbihfNTdjLF81N2QsXzU3ZSxfNTdmLF81ODApeworXzU3Yz1kb2pvLmxmeC5odG1sLl9ieUlkKF81N2MpOwordmFyIF81ODE9e3Byb3BlcnR5OiJvcGFjaXR5In07CitpZighZGpfdW5kZWYoInN0YXJ0IixfNTdkKSl7CitfNTgxLnN0YXJ0PV81N2Quc3RhcnQ7Cit9ZWxzZXsKK181ODEuc3RhcnQ9ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmh0bWwuZ2V0T3BhY2l0eShfNTdjWzBdKTsKK307Cit9CitpZighZGpfdW5kZWYoImVuZCIsXzU3ZCkpeworXzU4MS5lbmQ9XzU3ZC5lbmQ7Cit9ZWxzZXsKK2Rvam8ucmFpc2UoImRvam8ubGZ4Lmh0bWwuZmFkZSBuZWVkcyBhbiBlbmQgdmFsdWUiKTsKK30KK3ZhciBhbmltPWRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKF81N2MsW181ODFdLF81N2UsXzU3Zik7CithbmltLmNvbm5lY3QoImJlZm9yZUJlZ2luIixmdW5jdGlvbigpeworZG9qby5sZnguaHRtbC5fbWFrZUZhZGVhYmxlKF81N2MpOworfSk7CitpZihfNTgwKXsKK2FuaW0uY29ubmVjdCgib25FbmQiLGZ1bmN0aW9uKCl7CitfNTgwKF81N2MsYW5pbSk7Cit9KTsKK30KK3JldHVybiBhbmltOworfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZUluPWZ1bmN0aW9uKF81ODMsXzU4NCxfNTg1LF81ODYpeworcmV0dXJuIGRvam8ubGZ4Lmh0bWwuZmFkZShfNTgzLHtlbmQ6MX0sXzU4NCxfNTg1LF81ODYpOworfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZU91dD1mdW5jdGlvbihfNTg3LF81ODgsXzU4OSxfNThhKXsKK3JldHVybiBkb2pvLmxmeC5odG1sLmZhZGUoXzU4Nyx7ZW5kOjB9LF81ODgsXzU4OSxfNThhKTsKK307Citkb2pvLmxmeC5odG1sLmZhZGVTaG93PWZ1bmN0aW9uKF81OGIsXzU4YyxfNThkLF81OGUpeworXzU4Yj1kb2pvLmxmeC5odG1sLl9ieUlkKF81OGIpOworZG9qby5sYW5nLmZvckVhY2goXzU4YixmdW5jdGlvbihub2RlKXsKK2Rvam8uaHRtbC5zZXRPcGFjaXR5KG5vZGUsMCk7Cit9KTsKK3ZhciBhbmltPWRvam8ubGZ4Lmh0bWwuZmFkZUluKF81OGIsXzU4YyxfNThkLF81OGUpOworYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsZnVuY3Rpb24oKXsKK2lmKGRvam8ubGFuZy5pc0FycmF5TGlrZShfNThiKSl7Citkb2pvLmxhbmcuZm9yRWFjaChfNThiLGRvam8uaHRtbC5zaG93KTsKK31lbHNleworZG9qby5odG1sLnNob3coXzU4Yik7Cit9Cit9KTsKK3JldHVybiBhbmltOworfTsKK2Rvam8ubGZ4Lmh0bWwuZmFkZUhpZGU9ZnVuY3Rpb24oXzU5MSxfNTkyLF81OTMsXzU5NCl7Cit2YXIgYW5pbT1kb2pvLmxmeC5odG1sLmZhZGVPdXQoXzU5MSxfNTkyLF81OTMsZnVuY3Rpb24oKXsKK2lmKGRvam8ubGFuZy5pc0FycmF5TGlrZShfNTkxKSl7Citkb2pvLmxhbmcuZm9yRWFjaChfNTkxLGRvam8uaHRtbC5oaWRlKTsKK31lbHNleworZG9qby5odG1sLmhpZGUoXzU5MSk7Cit9CitpZihfNTk0KXsKK181OTQoXzU5MSxhbmltKTsKK30KK30pOworcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC53aXBlSW49ZnVuY3Rpb24oXzU5NixfNTk3LF81OTgsXzU5OSl7CitfNTk2PWRvam8ubGZ4Lmh0bWwuX2J5SWQoXzU5Nik7Cit2YXIgXzU5YT1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKF81OTYsZnVuY3Rpb24obm9kZSl7Cit2YXIgXzU5Yz17fTsKK3ZhciBfNTlkLF81OWUsXzU5ZjsKK3dpdGgobm9kZS5zdHlsZSl7CitfNTlkPXRvcDsKK181OWU9bGVmdDsKK181OWY9cG9zaXRpb247Cit0b3A9Ii05OTk5cHgiOworbGVmdD0iLTk5OTlweCI7Citwb3NpdGlvbj0iYWJzb2x1dGUiOworZGlzcGxheT0iIjsKK30KK3ZhciBfNWEwPWRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSkuaGVpZ2h0Oword2l0aChub2RlLnN0eWxlKXsKK3RvcD1fNTlkOworbGVmdD1fNTllOworcG9zaXRpb249XzU5ZjsKK2Rpc3BsYXk9Im5vbmUiOworfQordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7ImhlaWdodCI6e3N0YXJ0OjEsZW5kOmZ1bmN0aW9uKCl7CityZXR1cm4gXzVhMDsKK319fSxfNTk3LF81OTgpOworYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsZnVuY3Rpb24oKXsKK181OWMub3ZlcmZsb3c9bm9kZS5zdHlsZS5vdmVyZmxvdzsKK181OWMuaGVpZ2h0PW5vZGUuc3R5bGUuaGVpZ2h0Oword2l0aChub2RlLnN0eWxlKXsKK292ZXJmbG93PSJoaWRkZW4iOworaGVpZ2h0PSIxcHgiOworfQorZG9qby5odG1sLnNob3cobm9kZSk7Cit9KTsKK2FuaW0uY29ubmVjdCgib25FbmQiLGZ1bmN0aW9uKCl7Cit3aXRoKG5vZGUuc3R5bGUpeworb3ZlcmZsb3c9XzU5Yy5vdmVyZmxvdzsKK2hlaWdodD1fNTljLmhlaWdodDsKK30KK2lmKF81OTkpeworXzU5OShub2RlLGFuaW0pOworfQorfSk7CitfNTlhLnB1c2goYW5pbSk7Cit9KTsKK3JldHVybiBkb2pvLmxmeC5jb21iaW5lKF81OWEpOworfTsKK2Rvam8ubGZ4Lmh0bWwud2lwZU91dD1mdW5jdGlvbihfNWEyLF81YTMsXzVhNCxfNWE1KXsKK181YTI9ZG9qby5sZnguaHRtbC5fYnlJZChfNWEyKTsKK3ZhciBfNWE2PVtdOworZG9qby5sYW5nLmZvckVhY2goXzVhMixmdW5jdGlvbihub2RlKXsKK3ZhciBfNWE4PXt9OwordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7ImhlaWdodCI6e3N0YXJ0OmZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLmdldENvbnRlbnRCb3gobm9kZSkuaGVpZ2h0OworfSxlbmQ6MX19LF81YTMsXzVhNCx7ImJlZm9yZUJlZ2luIjpmdW5jdGlvbigpeworXzVhOC5vdmVyZmxvdz1ub2RlLnN0eWxlLm92ZXJmbG93OworXzVhOC5oZWlnaHQ9bm9kZS5zdHlsZS5oZWlnaHQ7Cit3aXRoKG5vZGUuc3R5bGUpeworb3ZlcmZsb3c9ImhpZGRlbiI7Cit9Citkb2pvLmh0bWwuc2hvdyhub2RlKTsKK30sIm9uRW5kIjpmdW5jdGlvbigpeworZG9qby5odG1sLmhpZGUobm9kZSk7Cit3aXRoKG5vZGUuc3R5bGUpeworb3ZlcmZsb3c9XzVhOC5vdmVyZmxvdzsKK2hlaWdodD1fNWE4LmhlaWdodDsKK30KK2lmKF81YTUpeworXzVhNShub2RlLGFuaW0pOworfQorfX0pOworXzVhNi5wdXNoKGFuaW0pOworfSk7CityZXR1cm4gZG9qby5sZnguY29tYmluZShfNWE2KTsKK307Citkb2pvLmxmeC5odG1sLnNsaWRlVG89ZnVuY3Rpb24oXzVhYSxfNWFiLF81YWMsXzVhZCxfNWFlKXsKK181YWE9ZG9qby5sZnguaHRtbC5fYnlJZChfNWFhKTsKK3ZhciBfNWFmPVtdOwordmFyIF81YjA9ZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU7CitpZihkb2pvLmxhbmcuaXNBcnJheShfNWFiKSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ubGZ4Lmh0bWwuc2xpZGVUbyhub2RlLCBhcnJheSkiLCJ1c2UgZG9qby5sZnguaHRtbC5zbGlkZVRvKG5vZGUsIHt0b3A6IHZhbHVlLCBsZWZ0OiB2YWx1ZX0pOyIsIjAuNSIpOworXzVhYj17dG9wOl81YWJbMF0sbGVmdDpfNWFiWzFdfTsKK30KK2Rvam8ubGFuZy5mb3JFYWNoKF81YWEsZnVuY3Rpb24obm9kZSl7Cit2YXIgdG9wPW51bGw7Cit2YXIgbGVmdD1udWxsOwordmFyIGluaXQ9KGZ1bmN0aW9uKCl7Cit2YXIgXzViNT1ub2RlOworcmV0dXJuIGZ1bmN0aW9uKCl7Cit2YXIgcG9zPV81YjAoXzViNSwicG9zaXRpb24iKTsKK3RvcD0ocG9zPT0iYWJzb2x1dGUiP25vZGUub2Zmc2V0VG9wOnBhcnNlSW50KF81YjAobm9kZSwidG9wIikpfHwwKTsKK2xlZnQ9KHBvcz09ImFic29sdXRlIj9ub2RlLm9mZnNldExlZnQ6cGFyc2VJbnQoXzViMChub2RlLCJsZWZ0IikpfHwwKTsKK2lmKCFkb2pvLmxhbmcuaW5BcnJheShbImFic29sdXRlIiwicmVsYXRpdmUiXSxwb3MpKXsKK3ZhciByZXQ9ZG9qby5odG1sLmFicyhfNWI1LHRydWUpOworZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcyhfNWI1LCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6IityZXQueSsicHg7bGVmdDoiK3JldC54KyJweDsiKTsKK3RvcD1yZXQueTsKK2xlZnQ9cmV0Lng7Cit9Cit9OworfSkoKTsKK2luaXQoKTsKK3ZhciBhbmltPWRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUseyJ0b3AiOntzdGFydDp0b3AsZW5kOihfNWFiLnRvcHx8MCl9LCJsZWZ0Ijp7c3RhcnQ6bGVmdCxlbmQ6KF81YWIubGVmdHx8MCl9fSxfNWFjLF81YWQseyJiZWZvcmVCZWdpbiI6aW5pdH0pOworaWYoXzVhZSl7CithbmltLmNvbm5lY3QoIm9uRW5kIixmdW5jdGlvbigpeworXzVhZShfNWFhLGFuaW0pOworfSk7Cit9CitfNWFmLnB1c2goYW5pbSk7Cit9KTsKK3JldHVybiBkb2pvLmxmeC5jb21iaW5lKF81YWYpOworfTsKK2Rvam8ubGZ4Lmh0bWwuc2xpZGVCeT1mdW5jdGlvbihfNWI5LF81YmEsXzViYixfNWJjLF81YmQpeworXzViOT1kb2pvLmxmeC5odG1sLl9ieUlkKF81YjkpOwordmFyIF81YmU9W107Cit2YXIgXzViZj1kb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZTsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF81YmEpKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5sZnguaHRtbC5zbGlkZUJ5KG5vZGUsIGFycmF5KSIsInVzZSBkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7IiwiMC41Iik7CitfNWJhPXt0b3A6XzViYVswXSxsZWZ0Ol81YmFbMV19OworfQorZG9qby5sYW5nLmZvckVhY2goXzViOSxmdW5jdGlvbihub2RlKXsKK3ZhciB0b3A9bnVsbDsKK3ZhciBsZWZ0PW51bGw7Cit2YXIgaW5pdD0oZnVuY3Rpb24oKXsKK3ZhciBfNWM0PW5vZGU7CityZXR1cm4gZnVuY3Rpb24oKXsKK3ZhciBwb3M9XzViZihfNWM0LCJwb3NpdGlvbiIpOwordG9wPShwb3M9PSJhYnNvbHV0ZSI/bm9kZS5vZmZzZXRUb3A6cGFyc2VJbnQoXzViZihub2RlLCJ0b3AiKSl8fDApOworbGVmdD0ocG9zPT0iYWJzb2x1dGUiP25vZGUub2Zmc2V0TGVmdDpwYXJzZUludChfNWJmKG5vZGUsImxlZnQiKSl8fDApOworaWYoIWRvam8ubGFuZy5pbkFycmF5KFsiYWJzb2x1dGUiLCJyZWxhdGl2ZSJdLHBvcykpewordmFyIHJldD1kb2pvLmh0bWwuYWJzKF81YzQsdHJ1ZSk7Citkb2pvLmh0bWwuc2V0U3R5bGVBdHRyaWJ1dGVzKF81YzQsInBvc2l0aW9uOmFic29sdXRlO3RvcDoiK3JldC55KyJweDtsZWZ0OiIrcmV0LngrInB4OyIpOwordG9wPXJldC55OworbGVmdD1yZXQueDsKK30KK307Cit9KSgpOworaW5pdCgpOwordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7InRvcCI6e3N0YXJ0OnRvcCxlbmQ6dG9wKyhfNWJhLnRvcHx8MCl9LCJsZWZ0Ijp7c3RhcnQ6bGVmdCxlbmQ6bGVmdCsoXzViYS5sZWZ0fHwwKX19LF81YmIsXzViYykuY29ubmVjdCgiYmVmb3JlQmVnaW4iLGluaXQpOworaWYoXzViZCl7CithbmltLmNvbm5lY3QoIm9uRW5kIixmdW5jdGlvbigpeworXzViZChfNWI5LGFuaW0pOworfSk7Cit9CitfNWJlLnB1c2goYW5pbSk7Cit9KTsKK3JldHVybiBkb2pvLmxmeC5jb21iaW5lKF81YmUpOworfTsKK2Rvam8ubGZ4Lmh0bWwuZXhwbG9kZT1mdW5jdGlvbihfNWM4LF81YzksXzVjYSxfNWNiLF81Y2MpewordmFyIGg9ZG9qby5odG1sOworXzVjOD1kb2pvLmJ5SWQoXzVjOCk7CitfNWM5PWRvam8uYnlJZChfNWM5KTsKK3ZhciBfNWNlPWgudG9Db29yZGluYXRlT2JqZWN0KF81YzgsdHJ1ZSk7Cit2YXIgXzVjZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK2guY29weVN0eWxlKF81Y2YsXzVjOSk7CitpZihfNWM5LmV4cGxvZGVDbGFzc05hbWUpeworXzVjZi5jbGFzc05hbWU9XzVjOS5leHBsb2RlQ2xhc3NOYW1lOworfQord2l0aChfNWNmLnN0eWxlKXsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7CitkaXNwbGF5PSJub25lIjsKK3ZhciBfNWQwPWguZ2V0U3R5bGUoXzVjOCwiYmFja2dyb3VuZC1jb2xvciIpOworYmFja2dyb3VuZENvbG9yPV81ZDA/XzVkMC50b0xvd2VyQ2FzZSgpOiJ0cmFuc3BhcmVudCI7CitiYWNrZ3JvdW5kQ29sb3I9KGJhY2tncm91bmRDb2xvcj09InRyYW5zcGFyZW50Iik/InJnYigyMjEsIDIyMSwgMjIxKSI6YmFja2dyb3VuZENvbG9yOworfQorZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQoXzVjZik7Cit3aXRoKF81Yzkuc3R5bGUpewordmlzaWJpbGl0eT0iaGlkZGVuIjsKK2Rpc3BsYXk9ImJsb2NrIjsKK30KK3ZhciBfNWQxPWgudG9Db29yZGluYXRlT2JqZWN0KF81YzksdHJ1ZSk7Cit3aXRoKF81Yzkuc3R5bGUpeworZGlzcGxheT0ibm9uZSI7Cit2aXNpYmlsaXR5PSJ2aXNpYmxlIjsKK30KK3ZhciBfNWQyPXtvcGFjaXR5OntzdGFydDowLjUsZW5kOjF9fTsKK2Rvam8ubGFuZy5mb3JFYWNoKFsiaGVpZ2h0Iiwid2lkdGgiLCJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24odHlwZSl7CitfNWQyW3R5cGVdPXtzdGFydDpfNWNlW3R5cGVdLGVuZDpfNWQxW3R5cGVdfTsKK30pOwordmFyIGFuaW09bmV3IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKF81Y2YsXzVkMixfNWNhLF81Y2IseyJiZWZvcmVCZWdpbiI6ZnVuY3Rpb24oKXsKK2guc2V0RGlzcGxheShfNWNmLCJibG9jayIpOworfSwib25FbmQiOmZ1bmN0aW9uKCl7CitoLnNldERpc3BsYXkoXzVjOSwiYmxvY2siKTsKK181Y2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChfNWNmKTsKK319KTsKK2lmKF81Y2MpeworYW5pbS5jb25uZWN0KCJvbkVuZCIsZnVuY3Rpb24oKXsKK181Y2MoXzVjOSxhbmltKTsKK30pOworfQorcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5pbXBsb2RlPWZ1bmN0aW9uKF81ZDUsZW5kLF81ZDcsXzVkOCxfNWQ5KXsKK3ZhciBoPWRvam8uaHRtbDsKK181ZDU9ZG9qby5ieUlkKF81ZDUpOworZW5kPWRvam8uYnlJZChlbmQpOwordmFyIF81ZGI9ZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdChfNWQ1LHRydWUpOwordmFyIF81ZGM9ZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdChlbmQsdHJ1ZSk7Cit2YXIgXzVkZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK2Rvam8uaHRtbC5jb3B5U3R5bGUoXzVkZCxfNWQ1KTsKK2lmKF81ZDUuZXhwbG9kZUNsYXNzTmFtZSl7CitfNWRkLmNsYXNzTmFtZT1fNWQ1LmV4cGxvZGVDbGFzc05hbWU7Cit9Citkb2pvLmh0bWwuc2V0T3BhY2l0eShfNWRkLDAuMyk7Cit3aXRoKF81ZGQuc3R5bGUpeworcG9zaXRpb249ImFic29sdXRlIjsKK2Rpc3BsYXk9Im5vbmUiOworYmFja2dyb3VuZENvbG9yPWguZ2V0U3R5bGUoXzVkNSwiYmFja2dyb3VuZC1jb2xvciIpLnRvTG93ZXJDYXNlKCk7Cit9Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChfNWRkKTsKK3ZhciBfNWRlPXtvcGFjaXR5OntzdGFydDoxLGVuZDowLjV9fTsKK2Rvam8ubGFuZy5mb3JFYWNoKFsiaGVpZ2h0Iiwid2lkdGgiLCJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24odHlwZSl7CitfNWRlW3R5cGVdPXtzdGFydDpfNWRiW3R5cGVdLGVuZDpfNWRjW3R5cGVdfTsKK30pOwordmFyIGFuaW09bmV3IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKF81ZGQsXzVkZSxfNWQ3LF81ZDgseyJiZWZvcmVCZWdpbiI6ZnVuY3Rpb24oKXsKK2Rvam8uaHRtbC5oaWRlKF81ZDUpOworZG9qby5odG1sLnNob3coXzVkZCk7Cit9LCJvbkVuZCI6ZnVuY3Rpb24oKXsKK181ZGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChfNWRkKTsKK319KTsKK2lmKF81ZDkpeworYW5pbS5jb25uZWN0KCJvbkVuZCIsZnVuY3Rpb24oKXsKK181ZDkoXzVkNSxhbmltKTsKK30pOworfQorcmV0dXJuIGFuaW07Cit9OworZG9qby5sZnguaHRtbC5oaWdobGlnaHQ9ZnVuY3Rpb24oXzVlMSxfNWUyLF81ZTMsXzVlNCxfNWU1KXsKK181ZTE9ZG9qby5sZnguaHRtbC5fYnlJZChfNWUxKTsKK3ZhciBfNWU2PVtdOworZG9qby5sYW5nLmZvckVhY2goXzVlMSxmdW5jdGlvbihub2RlKXsKK3ZhciBfNWU4PWRvam8uaHRtbC5nZXRCYWNrZ3JvdW5kQ29sb3Iobm9kZSk7Cit2YXIgYmc9ZG9qby5odG1sLmdldFN0eWxlKG5vZGUsImJhY2tncm91bmQtY29sb3IiKS50b0xvd2VyQ2FzZSgpOwordmFyIF81ZWE9ZG9qby5odG1sLmdldFN0eWxlKG5vZGUsImJhY2tncm91bmQtaW1hZ2UiKTsKK3ZhciBfNWViPShiZz09InRyYW5zcGFyZW50Inx8Ymc9PSJyZ2JhKDAsIDAsIDAsIDApIik7Cit3aGlsZShfNWU4Lmxlbmd0aD4zKXsKK181ZTgucG9wKCk7Cit9Cit2YXIgcmdiPW5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihfNWUyKTsKK3ZhciBfNWVkPW5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihfNWU4KTsKK3ZhciBhbmltPWRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUseyJiYWNrZ3JvdW5kLWNvbG9yIjp7c3RhcnQ6cmdiLGVuZDpfNWVkfX0sXzVlMyxfNWU0LHsiYmVmb3JlQmVnaW4iOmZ1bmN0aW9uKCl7CitpZihfNWVhKXsKK25vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJub25lIjsKK30KK25vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoIityZ2IudG9SZ2IoKS5qb2luKCIsIikrIikiOworfSwib25FbmQiOmZ1bmN0aW9uKCl7CitpZihfNWVhKXsKK25vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPV81ZWE7Cit9CitpZihfNWViKXsKK25vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCI7Cit9CitpZihfNWU1KXsKK181ZTUobm9kZSxhbmltKTsKK30KK319KTsKK181ZTYucHVzaChhbmltKTsKK30pOworcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoXzVlNik7Cit9OworZG9qby5sZnguaHRtbC51bmhpZ2hsaWdodD1mdW5jdGlvbihfNWVmLF81ZjAsXzVmMSxfNWYyLF81ZjMpeworXzVlZj1kb2pvLmxmeC5odG1sLl9ieUlkKF81ZWYpOwordmFyIF81ZjQ9W107Citkb2pvLmxhbmcuZm9yRWFjaChfNWVmLGZ1bmN0aW9uKG5vZGUpewordmFyIF81ZjY9bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGRvam8uaHRtbC5nZXRCYWNrZ3JvdW5kQ29sb3Iobm9kZSkpOwordmFyIHJnYj1uZXcgZG9qby5nZnguY29sb3IuQ29sb3IoXzVmMCk7Cit2YXIgXzVmOD1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwiYmFja2dyb3VuZC1pbWFnZSIpOwordmFyIGFuaW09ZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSx7ImJhY2tncm91bmQtY29sb3IiOntzdGFydDpfNWY2LGVuZDpyZ2J9fSxfNWYxLF81ZjIseyJiZWZvcmVCZWdpbiI6ZnVuY3Rpb24oKXsKK2lmKF81Zjgpeworbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9Im5vbmUiOworfQorbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYigiK181ZjYudG9SZ2IoKS5qb2luKCIsIikrIikiOworfSwib25FbmQiOmZ1bmN0aW9uKCl7CitpZihfNWYzKXsKK181ZjMobm9kZSxhbmltKTsKK30KK319KTsKK181ZjQucHVzaChhbmltKTsKK30pOworcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoXzVmNCk7Cit9OworZG9qby5sYW5nLm1peGluKGRvam8ubGZ4LGRvam8ubGZ4Lmh0bWwpOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7YnJvd3NlcjpbImRvam8ubGZ4Lmh0bWwiXSxkYXNoYm9hcmQ6WyJkb2pvLmxmeC5odG1sIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguKiIpOworaWYoIXRoaXNbImRvam8iXSl7CithbGVydCgiXCJkb2pvL19fcGFja2FnZV9fLmpzXCIgaXMgbm93IGxvY2F0ZWQgYXQgXCJkb2pvL2Rvam8uanNcIi4gUGxlYXNlIHVwZGF0ZSB5b3VyIGluY2x1ZGVzIGFjY29yZGluZ2x5Iik7Cit9Citkb2pvLnByb3ZpZGUoImRvam8ueG1sLlBhcnNlIik7Citkb2pvLnhtbC5QYXJzZT1mdW5jdGlvbigpewordmFyIGlzSUU9KChkb2pvLnJlbmRlci5odG1sLmNhcGFibGUpJiYoZG9qby5yZW5kZXIuaHRtbC5pZSkpOworZnVuY3Rpb24gZ2V0VGFnTmFtZShub2RlKXsKK3RyeXsKK3JldHVybiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKK30KK2NhdGNoKGUpeworcmV0dXJuICIiOworfQorfQorZnVuY3Rpb24gZ2V0RG9qb1RhZ05hbWUobm9kZSl7Cit2YXIgXzVmZD1nZXRUYWdOYW1lKG5vZGUpOworaWYoIV81ZmQpeworcmV0dXJuICIiOworfQoraWYoKGRvam8ud2lkZ2V0KSYmKGRvam8ud2lkZ2V0LnRhZ3NbXzVmZF0pKXsKK3JldHVybiBfNWZkOworfQordmFyIHA9XzVmZC5pbmRleE9mKCI6Iik7CitpZihwPj0wKXsKK3JldHVybiBfNWZkOworfQoraWYoXzVmZC5zdWJzdHIoMCw1KT09ImRvam86Iil7CityZXR1cm4gXzVmZDsKK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSYmZG9qby5yZW5kZXIuaHRtbC5pZSYmbm9kZS5zY29wZU5hbWUhPSJIVE1MIil7CityZXR1cm4gbm9kZS5zY29wZU5hbWUudG9Mb3dlckNhc2UoKSsiOiIrXzVmZDsKK30KK2lmKF81ZmQuc3Vic3RyKDAsNCk9PSJkb2pvIil7CityZXR1cm4gImRvam86IitfNWZkLnN1YnN0cmluZyg0KTsKK30KK3ZhciBkanQ9bm9kZS5nZXRBdHRyaWJ1dGUoImRvam9UeXBlIil8fG5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvdHlwZSIpOworaWYoZGp0KXsKK2lmKGRqdC5pbmRleE9mKCI6Iik8MCl7CitkanQ9ImRvam86IitkanQ7Cit9CityZXR1cm4gZGp0LnRvTG93ZXJDYXNlKCk7Cit9CitkanQ9bm9kZS5nZXRBdHRyaWJ1dGVOUyYmbm9kZS5nZXRBdHRyaWJ1dGVOUyhkb2pvLmRvbS5kb2pvbWwsInR5cGUiKTsKK2lmKGRqdCl7CityZXR1cm4gImRvam86IitkanQudG9Mb3dlckNhc2UoKTsKK30KK3RyeXsKK2RqdD1ub2RlLmdldEF0dHJpYnV0ZSgiZG9qbzp0eXBlIik7Cit9CitjYXRjaChlKXsKK30KK2lmKGRqdCl7CityZXR1cm4gImRvam86IitkanQudG9Mb3dlckNhc2UoKTsKK30KK2lmKChkal9nbG9iYWxbImRqQ29uZmlnIl0pJiYoIWRqQ29uZmlnWyJpZ25vcmVDbGFzc05hbWVzIl0pKXsKK3ZhciBfNjAwPW5vZGUuY2xhc3NOYW1lfHxub2RlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsKK2lmKChfNjAwKSYmKF82MDAuaW5kZXhPZikmJihfNjAwLmluZGV4T2YoImRvam8tIikhPS0xKSl7Cit2YXIgXzYwMT1fNjAwLnNwbGl0KCIgIik7Citmb3IodmFyIHg9MCxjPV82MDEubGVuZ3RoO3g8Yzt4KyspeworaWYoXzYwMVt4XS5zbGljZSgwLDUpPT0iZG9qby0iKXsKK3JldHVybiAiZG9qbzoiK182MDFbeF0uc3Vic3RyKDUpLnRvTG93ZXJDYXNlKCk7Cit9Cit9Cit9Cit9CityZXR1cm4gIiI7Cit9Cit0aGlzLnBhcnNlRWxlbWVudD1mdW5jdGlvbihub2RlLF82MDUsXzYwNixfNjA3KXsKK3ZhciBfNjA4PWdldFRhZ05hbWUobm9kZSk7CitpZihpc0lFJiZfNjA4LmluZGV4T2YoIi8iKT09MCl7CityZXR1cm4gbnVsbDsKK30KK3RyeXsKK3ZhciBhdHRyPW5vZGUuZ2V0QXR0cmlidXRlKCJwYXJzZVdpZGdldHMiKTsKK2lmKGF0dHImJmF0dHIudG9Mb3dlckNhc2UoKT09ImZhbHNlIil7CityZXR1cm4ge307Cit9Cit9CitjYXRjaChlKXsKK30KK3ZhciBfNjBhPXRydWU7CitpZihfNjA2KXsKK3ZhciBfNjBiPWdldERvam9UYWdOYW1lKG5vZGUpOworXzYwOD1fNjBifHxfNjA4OworXzYwYT1Cb29sZWFuKF82MGIpOworfQordmFyIF82MGM9e307CitfNjBjW182MDhdPVtdOwordmFyIHBvcz1fNjA4LmluZGV4T2YoIjoiKTsKK2lmKHBvcz4wKXsKK3ZhciBucz1fNjA4LnN1YnN0cmluZygwLHBvcyk7CitfNjBjWyJucyJdPW5zOworaWYoKGRvam8ubnMpJiYoIWRvam8ubnMuYWxsb3cobnMpKSl7CitfNjBhPWZhbHNlOworfQorfQoraWYoXzYwYSl7Cit2YXIgXzYwZj10aGlzLnBhcnNlQXR0cmlidXRlcyhub2RlKTsKK2Zvcih2YXIgYXR0ciBpbiBfNjBmKXsKK2lmKCghXzYwY1tfNjA4XVthdHRyXSl8fCh0eXBlb2YgXzYwY1tfNjA4XVthdHRyXSE9ImFycmF5IikpeworXzYwY1tfNjA4XVthdHRyXT1bXTsKK30KK182MGNbXzYwOF1bYXR0cl0ucHVzaChfNjBmW2F0dHJdKTsKK30KK182MGNbXzYwOF0ubm9kZVJlZj1ub2RlOworXzYwYy50YWdOYW1lPV82MDg7CitfNjBjLmluZGV4PV82MDd8fDA7Cit9Cit2YXIgXzYxMD0wOworZm9yKHZhciBpPTA7aTxub2RlLmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7Cit2YXIgdGNuPW5vZGUuY2hpbGROb2Rlcy5pdGVtKGkpOworc3dpdGNoKHRjbi5ub2RlVHlwZSl7CitjYXNlIGRvam8uZG9tLkVMRU1FTlRfTk9ERToKK3ZhciBjdG49Z2V0RG9qb1RhZ05hbWUodGNuKXx8Z2V0VGFnTmFtZSh0Y24pOworaWYoIV82MGNbY3RuXSl7CitfNjBjW2N0bl09W107Cit9CitfNjBjW2N0bl0ucHVzaCh0aGlzLnBhcnNlRWxlbWVudCh0Y24sdHJ1ZSxfNjA2LF82MTApKTsKK2lmKCh0Y24uY2hpbGROb2Rlcy5sZW5ndGg9PTEpJiYodGNuLmNoaWxkTm9kZXMuaXRlbSgwKS5ub2RlVHlwZT09ZG9qby5kb20uVEVYVF9OT0RFKSl7CitfNjBjW2N0bl1bXzYwY1tjdG5dLmxlbmd0aC0xXS52YWx1ZT10Y24uY2hpbGROb2Rlcy5pdGVtKDApLm5vZGVWYWx1ZTsKK30KK182MTArKzsKK2JyZWFrOworY2FzZSBkb2pvLmRvbS5URVhUX05PREU6CitpZihub2RlLmNoaWxkTm9kZXMubGVuZ3RoPT0xKXsKK182MGNbXzYwOF0ucHVzaCh7dmFsdWU6bm9kZS5jaGlsZE5vZGVzLml0ZW0oMCkubm9kZVZhbHVlfSk7Cit9CiticmVhazsKK2RlZmF1bHQ6CiticmVhazsKK30KK30KK3JldHVybiBfNjBjOworfTsKK3RoaXMucGFyc2VBdHRyaWJ1dGVzPWZ1bmN0aW9uKG5vZGUpewordmFyIF82MTU9e307Cit2YXIgYXR0cz1ub2RlLmF0dHJpYnV0ZXM7Cit2YXIgXzYxNyxpPTA7Cit3aGlsZSgoXzYxNz1hdHRzW2krK10pKXsKK2lmKGlzSUUpeworaWYoIV82MTcpeworY29udGludWU7Cit9CitpZigodHlwZW9mIF82MTc9PSJvYmplY3QiKSYmKHR5cGVvZiBfNjE3Lm5vZGVWYWx1ZT09InVuZGVmaW5lZCIpfHwoXzYxNy5ub2RlVmFsdWU9PW51bGwpfHwoXzYxNy5ub2RlVmFsdWU9PSIiKSl7Citjb250aW51ZTsKK30KK30KK3ZhciBubj1fNjE3Lm5vZGVOYW1lLnNwbGl0KCI6Iik7Citubj0obm4ubGVuZ3RoPT0yKT9ublsxXTpfNjE3Lm5vZGVOYW1lOworXzYxNVtubl09e3ZhbHVlOl82MTcubm9kZVZhbHVlfTsKK30KK3JldHVybiBfNjE1OworfTsKK307Citkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5kZWNsYXJlIik7Citkb2pvLmxhbmcuZGVjbGFyZT1mdW5jdGlvbihfNjFhLF82MWIsaW5pdCxfNjFkKXsKK2lmKChkb2pvLmxhbmcuaXNGdW5jdGlvbihfNjFkKSl8fCgoIV82MWQpJiYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGluaXQpKSkpewordmFyIHRlbXA9XzYxZDsKK182MWQ9aW5pdDsKK2luaXQ9dGVtcDsKK30KK3ZhciBfNjFmPVtdOworaWYoZG9qby5sYW5nLmlzQXJyYXkoXzYxYikpeworXzYxZj1fNjFiOworXzYxYj1fNjFmLnNoaWZ0KCk7Cit9CitpZighaW5pdCl7Citpbml0PWRvam8uZXZhbE9ialBhdGgoXzYxYSxmYWxzZSk7CitpZigoaW5pdCkmJighZG9qby5sYW5nLmlzRnVuY3Rpb24oaW5pdCkpKXsKK2luaXQ9bnVsbDsKK30KK30KK3ZhciBjdG9yPWRvam8ubGFuZy5kZWNsYXJlLl9tYWtlQ29uc3RydWN0b3IoKTsKK3ZhciBzY3A9KF82MWI/XzYxYi5wcm90b3R5cGU6bnVsbCk7CitpZihzY3Apeworc2NwLnByb3RvdHlwaW5nPXRydWU7CitjdG9yLnByb3RvdHlwZT1uZXcgXzYxYigpOworc2NwLnByb3RvdHlwaW5nPWZhbHNlOworfQorY3Rvci5zdXBlcmNsYXNzPXNjcDsKK2N0b3IubWl4aW5zPV82MWY7Citmb3IodmFyIGk9MCxsPV82MWYubGVuZ3RoO2k8bDtpKyspeworZG9qby5sYW5nLmV4dGVuZChjdG9yLF82MWZbaV0ucHJvdG90eXBlKTsKK30KK2N0b3IucHJvdG90eXBlLmluaXRpYWxpemVyPW51bGw7CitjdG9yLnByb3RvdHlwZS5kZWNsYXJlZENsYXNzPV82MWE7CitpZihkb2pvLmxhbmcuaXNBcnJheShfNjFkKSl7Citkb2pvLmxhbmcuZXh0ZW5kLmFwcGx5KGRvam8ubGFuZyxbY3Rvcl0uY29uY2F0KF82MWQpKTsKK31lbHNleworZG9qby5sYW5nLmV4dGVuZChjdG9yLChfNjFkKXx8e30pOworfQorZG9qby5sYW5nLmV4dGVuZChjdG9yLGRvam8ubGFuZy5kZWNsYXJlLl9jb21tb24pOworY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I9Y3RvcjsKK2N0b3IucHJvdG90eXBlLmluaXRpYWxpemVyPShjdG9yLnByb3RvdHlwZS5pbml0aWFsaXplcil8fChpbml0KXx8KGZ1bmN0aW9uKCl7Cit9KTsKK3ZhciBfNjI0PWRvam8ucGFyc2VPYmpQYXRoKF82MWEsbnVsbCx0cnVlKTsKK182MjQub2JqW182MjQucHJvcF09Y3RvcjsKK3JldHVybiBjdG9yOworfTsKK2Rvam8ubGFuZy5kZWNsYXJlLl9tYWtlQ29uc3RydWN0b3I9ZnVuY3Rpb24oKXsKK3JldHVybiBmdW5jdGlvbigpewordmFyIHNlbGY9dGhpcy5fZ2V0UHJvcENvbnRleHQoKTsKK3ZhciBzPXNlbGYuY29uc3RydWN0b3Iuc3VwZXJjbGFzczsKK2lmKChzKSYmKHMuY29uc3RydWN0b3IpKXsKK2lmKHMuY29uc3RydWN0b3I9PWFyZ3VtZW50cy5jYWxsZWUpewordGhpcy5faW5oZXJpdGVkKCJjb25zdHJ1Y3RvciIsYXJndW1lbnRzKTsKK31lbHNlewordGhpcy5fY29udGV4dE1ldGhvZChzLCJjb25zdHJ1Y3RvciIsYXJndW1lbnRzKTsKK30KK30KK3ZhciBtcz0oc2VsZi5jb25zdHJ1Y3Rvci5taXhpbnMpfHwoW10pOworZm9yKHZhciBpPTAsbTsobT1tc1tpXSk7aSsrKXsKKygoKG0ucHJvdG90eXBlKSYmKG0ucHJvdG90eXBlLmluaXRpYWxpemVyKSl8fChtKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQoraWYoKCF0aGlzLnByb3RvdHlwaW5nKSYmKHNlbGYuaW5pdGlhbGl6ZXIpKXsKK3NlbGYuaW5pdGlhbGl6ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorfTsKK307Citkb2pvLmxhbmcuZGVjbGFyZS5fY29tbW9uPXtfZ2V0UHJvcENvbnRleHQ6ZnVuY3Rpb24oKXsKK3JldHVybiAodGhpcy5fX19wcm90b3x8dGhpcyk7Cit9LF9jb250ZXh0TWV0aG9kOmZ1bmN0aW9uKF82MmEsXzYyYixhcmdzKXsKK3ZhciBfNjJkLF82MmU9dGhpcy5fX19wcm90bzsKK3RoaXMuX19fcHJvdG89XzYyYTsKK3RyeXsKK182MmQ9XzYyYVtfNjJiXS5hcHBseSh0aGlzLChhcmdzfHxbXSkpOworfQorY2F0Y2goZSl7Cit0aHJvdyBlOworfQorZmluYWxseXsKK3RoaXMuX19fcHJvdG89XzYyZTsKK30KK3JldHVybiBfNjJkOworfSxfaW5oZXJpdGVkOmZ1bmN0aW9uKHByb3AsYXJncyl7Cit2YXIgcD10aGlzLl9nZXRQcm9wQ29udGV4dCgpOworZG97CitpZigoIXAuY29uc3RydWN0b3IpfHwoIXAuY29uc3RydWN0b3Iuc3VwZXJjbGFzcykpeworcmV0dXJuOworfQorcD1wLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3M7Cit9d2hpbGUoIShwcm9wIGluIHApKTsKK3JldHVybiAoZG9qby5sYW5nLmlzRnVuY3Rpb24ocFtwcm9wXSk/dGhpcy5fY29udGV4dE1ldGhvZChwLHByb3AsYXJncyk6cFtwcm9wXSk7Cit9LGluaGVyaXRlZDpmdW5jdGlvbihwcm9wLGFyZ3MpeworZG9qby5kZXByZWNhdGVkKCInaW5oZXJpdGVkJyBtZXRob2QgaXMgZGFuZ2Vyb3VzLCBkbyBub3QgdXAtY2FsbCEgJ2luaGVyaXRlZCcgaXMgc2xhdGVkIGZvciByZW1vdmFsIGluIDAuNTsgbmFtZSB5b3VyIHN1cGVyIGNsYXNzIChvciB1c2Ugc3VwZXJjbGFzcyBwcm9wZXJ0eSkgaW5zdGVhZC4iLCIwLjUiKTsKK3RoaXMuX2luaGVyaXRlZChwcm9wLGFyZ3MpOworfX07Citkb2pvLmRlY2xhcmU9ZG9qby5sYW5nLmRlY2xhcmU7Citkb2pvLnByb3ZpZGUoImRvam8ubnMiKTsKK2Rvam8ubnM9e25hbWVzcGFjZXM6e30sZmFpbGVkOnt9LGxvYWRpbmc6e30sbG9hZGVkOnt9LHJlZ2lzdGVyOmZ1bmN0aW9uKG5hbWUsXzYzNSxfNjM2LF82MzcpeworaWYoIV82Mzd8fCF0aGlzLm5hbWVzcGFjZXNbbmFtZV0pewordGhpcy5uYW1lc3BhY2VzW25hbWVdPW5ldyBkb2pvLm5zLk5zKG5hbWUsXzYzNSxfNjM2KTsKK30KK30sYWxsb3c6ZnVuY3Rpb24obmFtZSl7CitpZih0aGlzLmZhaWxlZFtuYW1lXSl7CityZXR1cm4gZmFsc2U7Cit9CitpZigoZGpDb25maWcuZXhjbHVkZU5hbWVzcGFjZSkmJihkb2pvLmxhbmcuaW5BcnJheShkakNvbmZpZy5leGNsdWRlTmFtZXNwYWNlLG5hbWUpKSl7CityZXR1cm4gZmFsc2U7Cit9CityZXR1cm4gKChuYW1lPT10aGlzLmRvam8pfHwoIWRqQ29uZmlnLmluY2x1ZGVOYW1lc3BhY2UpfHwoZG9qby5sYW5nLmluQXJyYXkoZGpDb25maWcuaW5jbHVkZU5hbWVzcGFjZSxuYW1lKSkpOworfSxnZXQ6ZnVuY3Rpb24obmFtZSl7CityZXR1cm4gdGhpcy5uYW1lc3BhY2VzW25hbWVdOworfSxyZXF1aXJlOmZ1bmN0aW9uKG5hbWUpewordmFyIG5zPXRoaXMubmFtZXNwYWNlc1tuYW1lXTsKK2lmKChucykmJih0aGlzLmxvYWRlZFtuYW1lXSkpeworcmV0dXJuIG5zOworfQoraWYoIXRoaXMuYWxsb3cobmFtZSkpeworcmV0dXJuIGZhbHNlOworfQoraWYodGhpcy5sb2FkaW5nW25hbWVdKXsKK2Rvam8uZGVidWcoImRvam8ubmFtZXNwYWNlLnJlcXVpcmU6IHJlLWVudHJhbnQgcmVxdWVzdCB0byBsb2FkIG5hbWVzcGFjZSBcIiIrbmFtZSsiXCIgbXVzdCBmYWlsLiIpOworcmV0dXJuIGZhbHNlOworfQordmFyIHJlcT1kb2pvLnJlcXVpcmU7Cit0aGlzLmxvYWRpbmdbbmFtZV09dHJ1ZTsKK3RyeXsKK2lmKG5hbWU9PSJkb2pvIil7CityZXEoImRvam8ubmFtZXNwYWNlcy5kb2pvIik7Cit9ZWxzZXsKK2lmKCFkb2pvLmhvc3RlbnYubW9kdWxlSGFzUHJlZml4KG5hbWUpKXsKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUsIi4uLyIrbmFtZSk7Cit9CityZXEoW25hbWUsIm1hbmlmZXN0Il0uam9pbigiLiIpLGZhbHNlLHRydWUpOworfQoraWYoIXRoaXMubmFtZXNwYWNlc1tuYW1lXSl7Cit0aGlzLmZhaWxlZFtuYW1lXT10cnVlOworfQorfQorZmluYWxseXsKK3RoaXMubG9hZGluZ1tuYW1lXT1mYWxzZTsKK30KK3JldHVybiB0aGlzLm5hbWVzcGFjZXNbbmFtZV07Cit9fTsKK2Rvam8ubnMuTnM9ZnVuY3Rpb24obmFtZSxfNjNlLF82M2YpewordGhpcy5uYW1lPW5hbWU7Cit0aGlzLm1vZHVsZT1fNjNlOwordGhpcy5yZXNvbHZlcj1fNjNmOwordGhpcy5fbG9hZGVkPVtdOwordGhpcy5fZmFpbGVkPVtdOworfTsKK2Rvam8ubnMuTnMucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24obmFtZSxfNjQxLF82NDIpeworaWYoIXRoaXMucmVzb2x2ZXJ8fGRqQ29uZmlnWyJza2lwQXV0b1JlcXVpcmUiXSl7CityZXR1cm4gZmFsc2U7Cit9Cit2YXIgXzY0Mz10aGlzLnJlc29sdmVyKG5hbWUsXzY0MSk7CitpZigoXzY0MykmJighdGhpcy5fbG9hZGVkW182NDNdKSYmKCF0aGlzLl9mYWlsZWRbXzY0M10pKXsKK3ZhciByZXE9ZG9qby5yZXF1aXJlOworcmVxKF82NDMsZmFsc2UsdHJ1ZSk7CitpZihkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShfNjQzLGZhbHNlKSl7Cit0aGlzLl9sb2FkZWRbXzY0M109dHJ1ZTsKK31lbHNleworaWYoIV82NDIpeworZG9qby5yYWlzZSgiZG9qby5ucy5Ocy5yZXNvbHZlOiBtb2R1bGUgJyIrXzY0MysiJyBub3QgZm91bmQgYWZ0ZXIgbG9hZGluZyB2aWEgbmFtZXNwYWNlICciK3RoaXMubmFtZSsiJyIpOworfQordGhpcy5fZmFpbGVkW182NDNdPXRydWU7Cit9Cit9CityZXR1cm4gQm9vbGVhbih0aGlzLl9sb2FkZWRbXzY0M10pOworfTsKK2Rvam8ucmVnaXN0ZXJOYW1lc3BhY2U9ZnVuY3Rpb24obmFtZSxfNjQ2LF82NDcpeworZG9qby5ucy5yZWdpc3Rlci5hcHBseShkb2pvLm5zLGFyZ3VtZW50cyk7Cit9OworZG9qby5yZWdpc3Rlck5hbWVzcGFjZVJlc29sdmVyPWZ1bmN0aW9uKG5hbWUsXzY0OSl7Cit2YXIgbj1kb2pvLm5zLm5hbWVzcGFjZXNbbmFtZV07CitpZihuKXsKK24ucmVzb2x2ZXI9XzY0OTsKK30KK307Citkb2pvLnJlZ2lzdGVyTmFtZXNwYWNlTWFuaWZlc3Q9ZnVuY3Rpb24oXzY0YixwYXRoLG5hbWUsXzY0ZSxfNjRmKXsKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUscGF0aCk7Citkb2pvLnJlZ2lzdGVyTmFtZXNwYWNlKG5hbWUsXzY0ZSxfNjRmKTsKK307Citkb2pvLnJlZ2lzdGVyTmFtZXNwYWNlKCJkb2pvIiwiZG9qby53aWRnZXQiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuTWFuYWdlciIpOworZG9qby53aWRnZXQubWFuYWdlcj1uZXcgZnVuY3Rpb24oKXsKK3RoaXMud2lkZ2V0cz1bXTsKK3RoaXMud2lkZ2V0SWRzPVtdOwordGhpcy50b3BXaWRnZXRzPXt9OwordmFyIF82NTA9e307Cit2YXIgXzY1MT1bXTsKK3RoaXMuZ2V0VW5pcXVlSWQ9ZnVuY3Rpb24oXzY1Mil7Cit2YXIgXzY1MzsKK2RveworXzY1Mz1fNjUyKyJfIisoXzY1MFtfNjUyXSE9dW5kZWZpbmVkPysrXzY1MFtfNjUyXTpfNjUwW182NTJdPTApOworfXdoaWxlKHRoaXMuZ2V0V2lkZ2V0QnlJZChfNjUzKSk7CityZXR1cm4gXzY1MzsKK307Cit0aGlzLmFkZD1mdW5jdGlvbihfNjU0KXsKK3RoaXMud2lkZ2V0cy5wdXNoKF82NTQpOworaWYoIV82NTQuZXh0cmFBcmdzWyJpZCJdKXsKK182NTQuZXh0cmFBcmdzWyJpZCJdPV82NTQuZXh0cmFBcmdzWyJJRCJdOworfQoraWYoXzY1NC53aWRnZXRJZD09IiIpeworaWYoXzY1NFsiaWQiXSl7CitfNjU0LndpZGdldElkPV82NTRbImlkIl07Cit9ZWxzZXsKK2lmKF82NTQuZXh0cmFBcmdzWyJpZCJdKXsKK182NTQud2lkZ2V0SWQ9XzY1NC5leHRyYUFyZ3NbImlkIl07Cit9ZWxzZXsKK182NTQud2lkZ2V0SWQ9dGhpcy5nZXRVbmlxdWVJZChfNjU0Lm5zKyJfIitfNjU0LndpZGdldFR5cGUpOworfQorfQorfQoraWYodGhpcy53aWRnZXRJZHNbXzY1NC53aWRnZXRJZF0peworZG9qby5kZWJ1Zygid2lkZ2V0IElEIGNvbGxpc2lvbiBvbiBJRDogIitfNjU0LndpZGdldElkKTsKK30KK3RoaXMud2lkZ2V0SWRzW182NTQud2lkZ2V0SWRdPV82NTQ7Cit9OwordGhpcy5kZXN0cm95QWxsPWZ1bmN0aW9uKCl7Citmb3IodmFyIHg9dGhpcy53aWRnZXRzLmxlbmd0aC0xO3g+PTA7eC0tKXsKK3RyeXsKK3RoaXMud2lkZ2V0c1t4XS5kZXN0cm95KHRydWUpOworZGVsZXRlIHRoaXMud2lkZ2V0c1t4XTsKK30KK2NhdGNoKGUpeworfQorfQorfTsKK3RoaXMucmVtb3ZlPWZ1bmN0aW9uKF82NTYpeworaWYoZG9qby5sYW5nLmlzTnVtYmVyKF82NTYpKXsKK3ZhciB0dz10aGlzLndpZGdldHNbXzY1Nl0ud2lkZ2V0SWQ7CitkZWxldGUgdGhpcy50b3BXaWRnZXRzW3R3XTsKK2RlbGV0ZSB0aGlzLndpZGdldElkc1t0d107Cit0aGlzLndpZGdldHMuc3BsaWNlKF82NTYsMSk7Cit9ZWxzZXsKK3RoaXMucmVtb3ZlQnlJZChfNjU2KTsKK30KK307Cit0aGlzLnJlbW92ZUJ5SWQ9ZnVuY3Rpb24oaWQpeworaWYoIWRvam8ubGFuZy5pc1N0cmluZyhpZCkpeworaWQ9aWRbIndpZGdldElkIl07CitpZighaWQpeworZG9qby5kZWJ1ZygiaW52YWxpZCB3aWRnZXQgb3IgaWQgcGFzc2VkIHRvIHJlbW92ZUJ5SWQiKTsKK3JldHVybjsKK30KK30KK2Zvcih2YXIgaT0wO2k8dGhpcy53aWRnZXRzLmxlbmd0aDtpKyspeworaWYodGhpcy53aWRnZXRzW2ldLndpZGdldElkPT1pZCl7Cit0aGlzLnJlbW92ZShpKTsKK2JyZWFrOworfQorfQorfTsKK3RoaXMuZ2V0V2lkZ2V0QnlJZD1mdW5jdGlvbihpZCl7CitpZihkb2pvLmxhbmcuaXNTdHJpbmcoaWQpKXsKK3JldHVybiB0aGlzLndpZGdldElkc1tpZF07Cit9CityZXR1cm4gaWQ7Cit9OwordGhpcy5nZXRXaWRnZXRzQnlUeXBlPWZ1bmN0aW9uKHR5cGUpewordmFyIGx0PXR5cGUudG9Mb3dlckNhc2UoKTsKK3ZhciBfNjVkPSh0eXBlLmluZGV4T2YoIjoiKTwwP2Z1bmN0aW9uKHgpeworcmV0dXJuIHgud2lkZ2V0VHlwZS50b0xvd2VyQ2FzZSgpOworfTpmdW5jdGlvbih4KXsKK3JldHVybiB4LmdldE5hbWVzcGFjZWRUeXBlKCk7Cit9KTsKK3ZhciByZXQ9W107Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLndpZGdldHMsZnVuY3Rpb24oeCl7CitpZihfNjVkKHgpPT1sdCl7CityZXQucHVzaCh4KTsKK30KK30pOworcmV0dXJuIHJldDsKK307Cit0aGlzLmdldFdpZGdldHNCeUZpbHRlcj1mdW5jdGlvbihfNjYyLF82NjMpewordmFyIHJldD1bXTsKK2Rvam8ubGFuZy5ldmVyeSh0aGlzLndpZGdldHMsZnVuY3Rpb24oeCl7CitpZihfNjYyKHgpKXsKK3JldC5wdXNoKHgpOworaWYoXzY2Myl7CityZXR1cm4gZmFsc2U7Cit9Cit9CityZXR1cm4gdHJ1ZTsKK30pOworcmV0dXJuIChfNjYzP3JldFswXTpyZXQpOworfTsKK3RoaXMuZ2V0QWxsV2lkZ2V0cz1mdW5jdGlvbigpeworcmV0dXJuIHRoaXMud2lkZ2V0cy5jb25jYXQoKTsKK307Cit0aGlzLmdldFdpZGdldEJ5Tm9kZT1mdW5jdGlvbihub2RlKXsKK3ZhciB3PXRoaXMuZ2V0QWxsV2lkZ2V0cygpOworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Citmb3IodmFyIGk9MDtpPHcubGVuZ3RoO2krKyl7CitpZih3W2ldLmRvbU5vZGU9PW5vZGUpeworcmV0dXJuIHdbaV07Cit9Cit9CityZXR1cm4gbnVsbDsKK307Cit0aGlzLmJ5SWQ9dGhpcy5nZXRXaWRnZXRCeUlkOwordGhpcy5ieVR5cGU9dGhpcy5nZXRXaWRnZXRzQnlUeXBlOwordGhpcy5ieUZpbHRlcj10aGlzLmdldFdpZGdldHNCeUZpbHRlcjsKK3RoaXMuYnlOb2RlPXRoaXMuZ2V0V2lkZ2V0QnlOb2RlOwordmFyIF82Njk9e307Cit2YXIgXzY2YT1bImRvam8ud2lkZ2V0Il07Citmb3IodmFyIGk9MDtpPF82NmEubGVuZ3RoO2krKyl7CitfNjZhW182NmFbaV1dPXRydWU7Cit9Cit0aGlzLnJlZ2lzdGVyV2lkZ2V0UGFja2FnZT1mdW5jdGlvbihfNjZjKXsKK2lmKCFfNjZhW182NmNdKXsKK182NmFbXzY2Y109dHJ1ZTsKK182NmEucHVzaChfNjZjKTsKK30KK307Cit0aGlzLmdldFdpZGdldFBhY2thZ2VMaXN0PWZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5sYW5nLm1hcChfNjZhLGZ1bmN0aW9uKGVsdCl7CityZXR1cm4gKGVsdCE9PXRydWU/ZWx0OnVuZGVmaW5lZCk7Cit9KTsKK307Cit0aGlzLmdldEltcGxlbWVudGF0aW9uPWZ1bmN0aW9uKF82NmUsXzY2ZixfNjcwLG5zKXsKK3ZhciBpbXBsPXRoaXMuZ2V0SW1wbGVtZW50YXRpb25OYW1lKF82NmUsbnMpOworaWYoaW1wbCl7Cit2YXIgcmV0PV82NmY/bmV3IGltcGwoXzY2Zik6bmV3IGltcGwoKTsKK3JldHVybiByZXQ7Cit9Cit9OworZnVuY3Rpb24gYnVpbGRQcmVmaXhDYWNoZSgpeworZm9yKHZhciBfNjc0IGluIGRvam8ucmVuZGVyKXsKK2lmKGRvam8ucmVuZGVyW182NzRdWyJjYXBhYmxlIl09PT10cnVlKXsKK3ZhciBfNjc1PWRvam8ucmVuZGVyW182NzRdLnByZWZpeGVzOworZm9yKHZhciBpPTA7aTxfNjc1Lmxlbmd0aDtpKyspeworXzY1MS5wdXNoKF82NzVbaV0udG9Mb3dlckNhc2UoKSk7Cit9Cit9Cit9Cit9Cit2YXIgXzY3Nz1mdW5jdGlvbihfNjc4LF82NzkpeworaWYoIV82NzkpeworcmV0dXJuIG51bGw7Cit9Citmb3IodmFyIGk9MCxsPV82NTEubGVuZ3RoLF82N2M7aTw9bDtpKyspeworXzY3Yz0oaTxsP182NzlbXzY1MVtpXV06XzY3OSk7CitpZighXzY3Yyl7Citjb250aW51ZTsKK30KK2Zvcih2YXIgbmFtZSBpbiBfNjdjKXsKK2lmKG5hbWUudG9Mb3dlckNhc2UoKT09XzY3OCl7CityZXR1cm4gXzY3Y1tuYW1lXTsKK30KK30KK30KK3JldHVybiBudWxsOworfTsKK3ZhciBfNjdlPWZ1bmN0aW9uKF82N2YsXzY4MCl7Cit2YXIgXzY4MT1kb2pvLmV2YWxPYmpQYXRoKF82ODAsZmFsc2UpOworcmV0dXJuIChfNjgxP182NzcoXzY3ZixfNjgxKTpudWxsKTsKK307Cit0aGlzLmdldEltcGxlbWVudGF0aW9uTmFtZT1mdW5jdGlvbihfNjgyLG5zKXsKK3ZhciBfNjg0PV82ODIudG9Mb3dlckNhc2UoKTsKK25zPW5zfHwiZG9qbyI7Cit2YXIgaW1wcz1fNjY5W25zXXx8KF82NjlbbnNdPXt9KTsKK3ZhciBpbXBsPWltcHNbXzY4NF07CitpZihpbXBsKXsKK3JldHVybiBpbXBsOworfQoraWYoIV82NTEubGVuZ3RoKXsKK2J1aWxkUHJlZml4Q2FjaGUoKTsKK30KK3ZhciBfNjg3PWRvam8ubnMuZ2V0KG5zKTsKK2lmKCFfNjg3KXsKK2Rvam8ubnMucmVnaXN0ZXIobnMsbnMrIi53aWRnZXQiKTsKK182ODc9ZG9qby5ucy5nZXQobnMpOworfQoraWYoXzY4Nyl7CitfNjg3LnJlc29sdmUoXzY4Mik7Cit9CitpbXBsPV82N2UoXzY4NCxfNjg3Lm1vZHVsZSk7CitpZihpbXBsKXsKK3JldHVybiAoaW1wc1tfNjg0XT1pbXBsKTsKK30KK182ODc9ZG9qby5ucy5yZXF1aXJlKG5zKTsKK2lmKChfNjg3KSYmKF82ODcucmVzb2x2ZXIpKXsKK182ODcucmVzb2x2ZShfNjgyKTsKK2ltcGw9XzY3ZShfNjg0LF82ODcubW9kdWxlKTsKK2lmKGltcGwpeworcmV0dXJuIChpbXBzW182ODRdPWltcGwpOworfQorfQorZG9qby5kZXByZWNhdGVkKCJkb2pvLndpZGdldC5NYW5hZ2VyLmdldEltcGxlbWVudGF0aW9uTmFtZSIsIkNvdWxkIG5vdCBsb2NhdGUgd2lkZ2V0IGltcGxlbWVudGF0aW9uIGZvciBcIiIrXzY4MisiXCIgaW4gXCIiK182ODcubW9kdWxlKyJcIiByZWdpc3RlcmVkIHRvIG5hbWVzcGFjZSBcIiIrXzY4Ny5uYW1lKyJcIi4gIisiRGV2ZWxvcGVycyBtdXN0IHNwZWNpZnkgY29ycmVjdCBuYW1lc3BhY2VzIGZvciBhbGwgbm9uLURvam8gd2lkZ2V0cyIsIjAuNSIpOworZm9yKHZhciBpPTA7aTxfNjZhLmxlbmd0aDtpKyspeworaW1wbD1fNjdlKF82ODQsXzY2YVtpXSk7CitpZihpbXBsKXsKK3JldHVybiAoaW1wc1tfNjg0XT1pbXBsKTsKK30KK30KK3Rocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGxvY2F0ZSB3aWRnZXQgaW1wbGVtZW50YXRpb24gZm9yIFwiIitfNjgyKyJcIiBpbiBcIiIrXzY4Ny5tb2R1bGUrIlwiIHJlZ2lzdGVyZWQgdG8gbmFtZXNwYWNlIFwiIitfNjg3Lm5hbWUrIlwiIik7Cit9OwordGhpcy5yZXNpemluZz1mYWxzZTsKK3RoaXMub25XaW5kb3dSZXNpemVkPWZ1bmN0aW9uKCl7CitpZih0aGlzLnJlc2l6aW5nKXsKK3JldHVybjsKK30KK3RyeXsKK3RoaXMucmVzaXppbmc9dHJ1ZTsKK2Zvcih2YXIgaWQgaW4gdGhpcy50b3BXaWRnZXRzKXsKK3ZhciBfNjhhPXRoaXMudG9wV2lkZ2V0c1tpZF07CitpZihfNjhhLmNoZWNrU2l6ZSl7CitfNjhhLmNoZWNrU2l6ZSgpOworfQorfQorfQorY2F0Y2goZSl7Cit9CitmaW5hbGx5ewordGhpcy5yZXNpemluZz1mYWxzZTsKK30KK307CitpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIil7Citkb2pvLmFkZE9uTG9hZCh0aGlzLCJvbldpbmRvd1Jlc2l6ZWQiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh3aW5kb3csIm9ucmVzaXplIix0aGlzLCJvbldpbmRvd1Jlc2l6ZWQiKTsKK30KK307CisoZnVuY3Rpb24oKXsKK3ZhciBkdz1kb2pvLndpZGdldDsKK3ZhciBkd209ZHcubWFuYWdlcjsKK3ZhciBoPWRvam8ubGFuZy5jdXJyeShkb2pvLmxhbmcsImhpdGNoIixkd20pOwordmFyIGc9ZnVuY3Rpb24oXzY4ZixfNjkwKXsKK2R3WyhfNjkwfHxfNjhmKV09aChfNjhmKTsKK307CitnKCJhZGQiLCJhZGRXaWRnZXQiKTsKK2coImRlc3Ryb3lBbGwiLCJkZXN0cm95QWxsV2lkZ2V0cyIpOworZygicmVtb3ZlIiwicmVtb3ZlV2lkZ2V0Iik7CitnKCJyZW1vdmVCeUlkIiwicmVtb3ZlV2lkZ2V0QnlJZCIpOworZygiZ2V0V2lkZ2V0QnlJZCIpOworZygiZ2V0V2lkZ2V0QnlJZCIsImJ5SWQiKTsKK2coImdldFdpZGdldHNCeVR5cGUiKTsKK2coImdldFdpZGdldHNCeUZpbHRlciIpOworZygiZ2V0V2lkZ2V0c0J5VHlwZSIsImJ5VHlwZSIpOworZygiZ2V0V2lkZ2V0c0J5RmlsdGVyIiwiYnlGaWx0ZXIiKTsKK2coImdldFdpZGdldEJ5Tm9kZSIsImJ5Tm9kZSIpOworZHcuYWxsPWZ1bmN0aW9uKG4pewordmFyIF82OTI9ZHdtLmdldEFsbFdpZGdldHMuYXBwbHkoZHdtLGFyZ3VtZW50cyk7CitpZihhcmd1bWVudHMubGVuZ3RoPjApeworcmV0dXJuIF82OTJbbl07Cit9CityZXR1cm4gXzY5MjsKK307CitnKCJyZWdpc3RlcldpZGdldFBhY2thZ2UiKTsKK2coImdldEltcGxlbWVudGF0aW9uIiwiZ2V0V2lkZ2V0SW1wbGVtZW50YXRpb24iKTsKK2coImdldEltcGxlbWVudGF0aW9uTmFtZSIsImdldFdpZGdldEltcGxlbWVudGF0aW9uTmFtZSIpOworZHcud2lkZ2V0cz1kd20ud2lkZ2V0czsKK2R3LndpZGdldElkcz1kd20ud2lkZ2V0SWRzOworZHcucm9vdD1kd20ucm9vdDsKK30pKCk7Citkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHtjb21tb246W1siZG9qby51cmkuVXJpIixmYWxzZSxmYWxzZV1dfSk7Citkb2pvLnByb3ZpZGUoImRvam8udXJpLioiKTsKK2Rvam8ucHJvdmlkZSgiZG9qby5hMTF5Iik7Citkb2pvLmExMXk9e2ltZ1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMiKSxkb0FjY2Vzc2libGVDaGVjazp0cnVlLGFjY2Vzc2libGU6bnVsbCxjaGVja0FjY2Vzc2libGU6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuYWNjZXNzaWJsZT09PW51bGwpewordGhpcy5hY2Nlc3NpYmxlPWZhbHNlOworaWYodGhpcy5kb0FjY2Vzc2libGVDaGVjaz09dHJ1ZSl7Cit0aGlzLmFjY2Vzc2libGU9dGhpcy50ZXN0QWNjZXNzaWJsZSgpOworfQorfQorcmV0dXJuIHRoaXMuYWNjZXNzaWJsZTsKK30sdGVzdEFjY2Vzc2libGU6ZnVuY3Rpb24oKXsKK3RoaXMuYWNjZXNzaWJsZT1mYWxzZTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWV8fGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSl7Cit2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworZGl2LnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKFwiIit0aGlzLmltZ1BhdGgrIi90YWJfY2xvc2UuZ2lmXCIpIjsKK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKGRpdik7Cit2YXIgXzY5ND1udWxsOworaWYod2luZG93LmdldENvbXB1dGVkU3R5bGUpewordmFyIF82OTU9Z2V0Q29tcHV0ZWRTdHlsZShkaXYsIiIpOworXzY5ND1fNjk1LmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtaW1hZ2UiKTsKK31lbHNleworXzY5ND1kaXYuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZTsKK30KK3ZhciBfNjk2PWZhbHNlOworaWYoXzY5NCE9bnVsbCYmKF82OTQ9PSJub25lInx8XzY5ND09InVybChpbnZhbGlkLXVybDopIikpewordGhpcy5hY2Nlc3NpYmxlPXRydWU7Cit9Citkb2pvLmJvZHkoKS5yZW1vdmVDaGlsZChkaXYpOworfQorcmV0dXJuIHRoaXMuYWNjZXNzaWJsZTsKK30sc2V0Q2hlY2tBY2Nlc3NpYmxlOmZ1bmN0aW9uKF82OTcpewordGhpcy5kb0FjY2Vzc2libGVDaGVjaz1fNjk3OworfSxzZXRBY2Nlc3NpYmxlTW9kZTpmdW5jdGlvbigpeworaWYodGhpcy5hY2Nlc3NpYmxlPT09bnVsbCl7CitpZih0aGlzLmNoZWNrQWNjZXNzaWJsZSgpKXsKK2Rvam8ucmVuZGVyLmh0bWwucHJlZml4ZXMudW5zaGlmdCgiYTExeSIpOworfQorfQorcmV0dXJuIHRoaXMuYWNjZXNzaWJsZTsKK319OworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5XaWRnZXQiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuV2lkZ2V0IixudWxsLGZ1bmN0aW9uKCl7Cit0aGlzLmNoaWxkcmVuPVtdOwordGhpcy5leHRyYUFyZ3M9e307Cit9LHtwYXJlbnQ6bnVsbCxpc1RvcExldmVsOmZhbHNlLGRpc2FibGVkOmZhbHNlLGlzQ29udGFpbmVyOmZhbHNlLHdpZGdldElkOiIiLHdpZGdldFR5cGU6IldpZGdldCIsbnM6ImRvam8iLGdldE5hbWVzcGFjZWRUeXBlOmZ1bmN0aW9uKCl7CityZXR1cm4gKHRoaXMubnM/dGhpcy5ucysiOiIrdGhpcy53aWRnZXRUeXBlOnRoaXMud2lkZ2V0VHlwZSkudG9Mb3dlckNhc2UoKTsKK30sdG9TdHJpbmc6ZnVuY3Rpb24oKXsKK3JldHVybiAiW1dpZGdldCAiK3RoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKSsiLCAiKyh0aGlzLndpZGdldElkfHwiTk8gSUQiKSsiXSI7Cit9LHJlcHI6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnRvU3RyaW5nKCk7Cit9LGVuYWJsZTpmdW5jdGlvbigpewordGhpcy5kaXNhYmxlZD1mYWxzZTsKK30sZGlzYWJsZTpmdW5jdGlvbigpewordGhpcy5kaXNhYmxlZD10cnVlOworfSxvblJlc2l6ZWQ6ZnVuY3Rpb24oKXsKK3RoaXMubm90aWZ5Q2hpbGRyZW5PZlJlc2l6ZSgpOworfSxub3RpZnlDaGlsZHJlbk9mUmVzaXplOmZ1bmN0aW9uKCl7Citmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2krKyl7Cit2YXIgXzY5OT10aGlzLmNoaWxkcmVuW2ldOworaWYoXzY5OS5vblJlc2l6ZWQpeworXzY5OS5vblJlc2l6ZWQoKTsKK30KK30KK30sY3JlYXRlOmZ1bmN0aW9uKGFyZ3MsXzY5YixfNjljLG5zKXsKK2lmKG5zKXsKK3RoaXMubnM9bnM7Cit9Cit0aGlzLnNhdGlzZnlQcm9wZXJ0eVNldHMoYXJncyxfNjliLF82OWMpOwordGhpcy5taXhJblByb3BlcnRpZXMoYXJncyxfNjliLF82OWMpOwordGhpcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzKGFyZ3MsXzY5YixfNjljKTsKK2Rvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkKHRoaXMpOwordGhpcy5idWlsZFJlbmRlcmluZyhhcmdzLF82OWIsXzY5Yyk7Cit0aGlzLmluaXRpYWxpemUoYXJncyxfNjliLF82OWMpOwordGhpcy5wb3N0SW5pdGlhbGl6ZShhcmdzLF82OWIsXzY5Yyk7Cit0aGlzLnBvc3RDcmVhdGUoYXJncyxfNjliLF82OWMpOworcmV0dXJuIHRoaXM7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oXzY5ZSl7CitpZih0aGlzLnBhcmVudCl7Cit0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKK30KK3RoaXMuZGVzdHJveUNoaWxkcmVuKCk7Cit0aGlzLnVuaW5pdGlhbGl6ZSgpOwordGhpcy5kZXN0cm95UmVuZGVyaW5nKF82OWUpOworZG9qby53aWRnZXQubWFuYWdlci5yZW1vdmVCeUlkKHRoaXMud2lkZ2V0SWQpOworfSxkZXN0cm95Q2hpbGRyZW46ZnVuY3Rpb24oKXsKK3ZhciBfNjlmOwordmFyIGk9MDsKK3doaWxlKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPmkpeworXzY5Zj10aGlzLmNoaWxkcmVuW2ldOworaWYoXzY5ZiBpbnN0YW5jZW9mIGRvam8ud2lkZ2V0LldpZGdldCl7Cit0aGlzLnJlbW92ZUNoaWxkKF82OWYpOworXzY5Zi5kZXN0cm95KCk7Citjb250aW51ZTsKK30KK2krKzsKK30KK30sZ2V0Q2hpbGRyZW5PZlR5cGU6ZnVuY3Rpb24odHlwZSxfNmEyKXsKK3ZhciByZXQ9W107Cit2YXIgXzZhND1kb2pvLmxhbmcuaXNGdW5jdGlvbih0eXBlKTsKK2lmKCFfNmE0KXsKK3R5cGU9dHlwZS50b0xvd2VyQ2FzZSgpOworfQorZm9yKHZhciB4PTA7eDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt4KyspeworaWYoXzZhNCl7CitpZih0aGlzLmNoaWxkcmVuW3hdIGluc3RhbmNlb2YgdHlwZSl7CityZXQucHVzaCh0aGlzLmNoaWxkcmVuW3hdKTsKK30KK31lbHNleworaWYodGhpcy5jaGlsZHJlblt4XS53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCk9PXR5cGUpeworcmV0LnB1c2godGhpcy5jaGlsZHJlblt4XSk7Cit9Cit9CitpZihfNmEyKXsKK3JldD1yZXQuY29uY2F0KHRoaXMuY2hpbGRyZW5beF0uZ2V0Q2hpbGRyZW5PZlR5cGUodHlwZSxfNmEyKSk7Cit9Cit9CityZXR1cm4gcmV0OworfSxnZXREZXNjZW5kYW50czpmdW5jdGlvbigpewordmFyIF82YTY9W107Cit2YXIgXzZhNz1bdGhpc107Cit2YXIgZWxlbTsKK3doaWxlKChlbGVtPV82YTcucG9wKCkpKXsKK182YTYucHVzaChlbGVtKTsKK2lmKGVsZW0uY2hpbGRyZW4peworZG9qby5sYW5nLmZvckVhY2goZWxlbS5jaGlsZHJlbixmdW5jdGlvbihlbGVtKXsKK182YTcucHVzaChlbGVtKTsKK30pOworfQorfQorcmV0dXJuIF82YTY7Cit9LGlzRmlyc3RDaGlsZDpmdW5jdGlvbigpeworcmV0dXJuIHRoaXM9PT10aGlzLnBhcmVudC5jaGlsZHJlblswXTsKK30saXNMYXN0Q2hpbGQ6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzPT09dGhpcy5wYXJlbnQuY2hpbGRyZW5bdGhpcy5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLTFdOworfSxzYXRpc2Z5UHJvcGVydHlTZXRzOmZ1bmN0aW9uKGFyZ3MpeworcmV0dXJuIGFyZ3M7Cit9LG1peEluUHJvcGVydGllczpmdW5jdGlvbihhcmdzLGZyYWcpeworaWYoKGFyZ3NbImZhc3RNaXhJbiJdKXx8KGZyYWdbImZhc3RNaXhJbiJdKSl7Citmb3IodmFyIHggaW4gYXJncyl7Cit0aGlzW3hdPWFyZ3NbeF07Cit9CityZXR1cm47Cit9Cit2YXIgXzZhZTsKK3ZhciBfNmFmPWRvam8ud2lkZ2V0LmxjQXJnc0NhY2hlW3RoaXMud2lkZ2V0VHlwZV07CitpZihfNmFmPT1udWxsKXsKK182YWY9e307Citmb3IodmFyIHkgaW4gdGhpcyl7CitfNmFmWygobmV3IFN0cmluZyh5KSkudG9Mb3dlckNhc2UoKSldPXk7Cit9Citkb2pvLndpZGdldC5sY0FyZ3NDYWNoZVt0aGlzLndpZGdldFR5cGVdPV82YWY7Cit9Cit2YXIgXzZiMT17fTsKK2Zvcih2YXIgeCBpbiBhcmdzKXsKK2lmKCF0aGlzW3hdKXsKK3ZhciB5PV82YWZbKG5ldyBTdHJpbmcoeCkpLnRvTG93ZXJDYXNlKCldOworaWYoeSl7CithcmdzW3ldPWFyZ3NbeF07Cit4PXk7Cit9Cit9CitpZihfNmIxW3hdKXsKK2NvbnRpbnVlOworfQorXzZiMVt4XT10cnVlOworaWYoKHR5cGVvZiB0aGlzW3hdKSE9KHR5cGVvZiBfNmFlKSl7CitpZih0eXBlb2YgYXJnc1t4XSE9InN0cmluZyIpewordGhpc1t4XT1hcmdzW3hdOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNTdHJpbmcodGhpc1t4XSkpewordGhpc1t4XT1hcmdzW3hdOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNOdW1iZXIodGhpc1t4XSkpewordGhpc1t4XT1uZXcgTnVtYmVyKGFyZ3NbeF0pOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNCb29sZWFuKHRoaXNbeF0pKXsKK3RoaXNbeF09KGFyZ3NbeF0udG9Mb3dlckNhc2UoKT09ImZhbHNlIik/ZmFsc2U6dHJ1ZTsKK31lbHNleworaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24odGhpc1t4XSkpeworaWYoYXJnc1t4XS5zZWFyY2goL1teXHdcLl0rL2kpPT0tMSl7Cit0aGlzW3hdPWRvam8uZXZhbE9ialBhdGgoYXJnc1t4XSxmYWxzZSk7Cit9ZWxzZXsKK3ZhciB0bj1kb2pvLmxhbmcubmFtZUFub25GdW5jKG5ldyBGdW5jdGlvbihhcmdzW3hdKSx0aGlzKTsKK2Rvam8uZXZlbnQua3dDb25uZWN0KHtzcmNPYmo6dGhpcyxzcmNGdW5jOngsYWR2aWNlT2JqOnRoaXMsYWR2aWNlRnVuYzp0bn0pOworfQorfWVsc2V7CitpZihkb2pvLmxhbmcuaXNBcnJheSh0aGlzW3hdKSl7Cit0aGlzW3hdPWFyZ3NbeF0uc3BsaXQoIjsiKTsKK31lbHNleworaWYodGhpc1t4XSBpbnN0YW5jZW9mIERhdGUpewordGhpc1t4XT1uZXcgRGF0ZShOdW1iZXIoYXJnc1t4XSkpOworfWVsc2V7CitpZih0eXBlb2YgdGhpc1t4XT09Im9iamVjdCIpeworaWYodGhpc1t4XSBpbnN0YW5jZW9mIGRvam8udXJpLlVyaSl7Cit0aGlzW3hdPWRvam8udXJpLmRvam9VcmkoYXJnc1t4XSk7Cit9ZWxzZXsKK3ZhciBfNmIzPWFyZ3NbeF0uc3BsaXQoIjsiKTsKK2Zvcih2YXIgeT0wO3k8XzZiMy5sZW5ndGg7eSsrKXsKK3ZhciBzaT1fNmIzW3ldLmluZGV4T2YoIjoiKTsKK2lmKChzaSE9LTEpJiYoXzZiM1t5XS5sZW5ndGg+c2kpKXsKK3RoaXNbeF1bXzZiM1t5XS5zdWJzdHIoMCxzaSkucmVwbGFjZSgvXlxzK3xccyskL2csIiIpXT1fNmIzW3ldLnN1YnN0cihzaSsxKTsKK30KK30KK30KK31lbHNlewordGhpc1t4XT1hcmdzW3hdOworfQorfQorfQorfQorfQorfQorfQorfQorfWVsc2V7Cit0aGlzLmV4dHJhQXJnc1t4LnRvTG93ZXJDYXNlKCldPWFyZ3NbeF07Cit9Cit9Cit9LHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oYXJncyxmcmFnLF82YjcpeworfSxpbml0aWFsaXplOmZ1bmN0aW9uKGFyZ3MsZnJhZyxfNmJhKXsKK3JldHVybiBmYWxzZTsKK30scG9zdEluaXRpYWxpemU6ZnVuY3Rpb24oYXJncyxmcmFnLF82YmQpeworcmV0dXJuIGZhbHNlOworfSxwb3N0Q3JlYXRlOmZ1bmN0aW9uKGFyZ3MsZnJhZyxfNmMwKXsKK3JldHVybiBmYWxzZTsKK30sdW5pbml0aWFsaXplOmZ1bmN0aW9uKCl7CityZXR1cm4gZmFsc2U7Cit9LGJ1aWxkUmVuZGVyaW5nOmZ1bmN0aW9uKGFyZ3MsZnJhZyxfNmMzKXsKK2Rvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuV2lkZ2V0LmJ1aWxkUmVuZGVyaW5nLCBvbiAiK3RoaXMudG9TdHJpbmcoKSsiLCAiKTsKK3JldHVybiBmYWxzZTsKK30sZGVzdHJveVJlbmRlcmluZzpmdW5jdGlvbigpeworZG9qby51bmltcGxlbWVudGVkKCJkb2pvLndpZGdldC5XaWRnZXQuZGVzdHJveVJlbmRlcmluZyIpOworcmV0dXJuIGZhbHNlOworfSxhZGRlZFRvOmZ1bmN0aW9uKF82YzQpeworfSxhZGRDaGlsZDpmdW5jdGlvbihfNmM1KXsKK2Rvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuV2lkZ2V0LmFkZENoaWxkIik7CityZXR1cm4gZmFsc2U7Cit9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKF82YzYpeworZm9yKHZhciB4PTA7eDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt4KyspeworaWYodGhpcy5jaGlsZHJlblt4XT09PV82YzYpewordGhpcy5jaGlsZHJlbi5zcGxpY2UoeCwxKTsKK182YzYucGFyZW50PW51bGw7CiticmVhazsKK30KK30KK3JldHVybiBfNmM2OworfSxnZXRQcmV2aW91c1NpYmxpbmc6ZnVuY3Rpb24oKXsKK3ZhciBpZHg9dGhpcy5nZXRQYXJlbnRJbmRleCgpOworaWYoaWR4PD0wKXsKK3JldHVybiBudWxsOworfQorcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2lkeC0xXTsKK30sZ2V0U2libGluZ3M6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbjsKK30sZ2V0UGFyZW50SW5kZXg6ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLmxhbmcuaW5kZXhPZih0aGlzLnBhcmVudC5jaGlsZHJlbix0aGlzLHRydWUpOworfSxnZXROZXh0U2libGluZzpmdW5jdGlvbigpewordmFyIGlkeD10aGlzLmdldFBhcmVudEluZGV4KCk7CitpZihpZHg9PXRoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aC0xKXsKK3JldHVybiBudWxsOworfQoraWYoaWR4PDApeworcmV0dXJuIG51bGw7Cit9CityZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baWR4KzFdOworfX0pOworZG9qby53aWRnZXQubGNBcmdzQ2FjaGU9e307Citkb2pvLndpZGdldC50YWdzPXt9OworZG9qby53aWRnZXQudGFncy5hZGRQYXJzZVRyZWVIYW5kbGVyPWZ1bmN0aW9uKHR5cGUpeworZG9qby5kZXByZWNhdGVkKCJhZGRQYXJzZVRyZWVIYW5kbGVyIiwiLiBQYXJzZVRyZWVIYW5kbGVycyBhcmUgbm93IHJlc2VydmVkIGZvciBjb21wb25lbnRzLiBBbnkgdW5maWx0ZXJlZCBEb2pvTUwgdGFnIHdpdGhvdXQgYSBQYXJzZVRyZWVIYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYSB3aWRnZXQiLCIwLjUiKTsKK307Citkb2pvLndpZGdldC50YWdzWyJkb2pvOnByb3BlcnR5c2V0Il09ZnVuY3Rpb24oXzZjYixfNmNjLF82Y2QpewordmFyIF82Y2U9XzZjYy5wYXJzZVByb3BlcnRpZXMoXzZjYlsiZG9qbzpwcm9wZXJ0eXNldCJdKTsKK307Citkb2pvLndpZGdldC50YWdzWyJkb2pvOmNvbm5lY3QiXT1mdW5jdGlvbihfNmNmLF82ZDAsXzZkMSl7Cit2YXIgXzZkMj1fNmQwLnBhcnNlUHJvcGVydGllcyhfNmNmWyJkb2pvOmNvbm5lY3QiXSk7Cit9OworZG9qby53aWRnZXQuYnVpbGRXaWRnZXRGcm9tUGFyc2VUcmVlPWZ1bmN0aW9uKHR5cGUsZnJhZyxfNmQ1LF82ZDYsXzZkNyxfNmQ4KXsKK2Rvam8uYTExeS5zZXRBY2Nlc3NpYmxlTW9kZSgpOwordmFyIF82ZDk9dHlwZS5zcGxpdCgiOiIpOworXzZkOT0oXzZkOS5sZW5ndGg9PTIpP182ZDlbMV06dHlwZTsKK3ZhciBfNmRhPV82ZDh8fF82ZDUucGFyc2VQcm9wZXJ0aWVzKGZyYWdbZnJhZ1sibnMiXSsiOiIrXzZkOV0pOwordmFyIF82ZGI9ZG9qby53aWRnZXQubWFuYWdlci5nZXRJbXBsZW1lbnRhdGlvbihfNmQ5LG51bGwsbnVsbCxmcmFnWyJucyJdKTsKK2lmKCFfNmRiKXsKK3Rocm93IG5ldyBFcnJvcigiY2Fubm90IGZpbmQgXCIiK3R5cGUrIlwiIHdpZGdldCIpOworfWVsc2V7CitpZighXzZkYi5jcmVhdGUpewordGhyb3cgbmV3IEVycm9yKCJcIiIrdHlwZSsiXCIgd2lkZ2V0IG9iamVjdCBoYXMgbm8gXCJjcmVhdGVcIiBtZXRob2QgYW5kIGRvZXMgbm90IGFwcGVhciB0byBpbXBsZW1lbnQgKldpZGdldCIpOworfQorfQorXzZkYVsiZG9qb2luc2VydGlvbmluZGV4Il09XzZkNzsKK3ZhciByZXQ9XzZkYi5jcmVhdGUoXzZkYSxmcmFnLF82ZDYsZnJhZ1sibnMiXSk7CityZXR1cm4gcmV0OworfTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldD1mdW5jdGlvbihfNmRkLF82ZGUsXzZkZixpbml0LF82ZTEpeworaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFyZ3VtZW50c1szXSkpeworZG9qby53aWRnZXQuX2RlZmluZVdpZGdldChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzNdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbNF0sYXJndW1lbnRzWzJdKTsKK31lbHNlewordmFyIGFyZ3M9W2FyZ3VtZW50c1swXV0scD0zOworaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFyZ3VtZW50c1sxXSkpeworYXJncy5wdXNoKGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pOworfWVsc2V7CithcmdzLnB1c2goIiIsYXJndW1lbnRzWzFdKTsKK3A9MjsKK30KK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGFyZ3VtZW50c1twXSkpeworYXJncy5wdXNoKGFyZ3VtZW50c1twXSxhcmd1bWVudHNbcCsxXSk7Cit9ZWxzZXsKK2FyZ3MucHVzaChudWxsLGFyZ3VtZW50c1twXSk7Cit9Citkb2pvLndpZGdldC5fZGVmaW5lV2lkZ2V0LmFwcGx5KHRoaXMsYXJncyk7Cit9Cit9OworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0LnJlbmRlcmVycz0iaHRtbHxzdmd8dm1sIjsKK2Rvam8ud2lkZ2V0Ll9kZWZpbmVXaWRnZXQ9ZnVuY3Rpb24oXzZlNCxfNmU1LF82ZTYsaW5pdCxfNmU4KXsKK3ZhciBfNmU5PV82ZTQuc3BsaXQoIi4iKTsKK3ZhciB0eXBlPV82ZTkucG9wKCk7Cit2YXIgcmVneD0iXFwuKCIrKF82ZTU/XzZlNSsifCI6IiIpK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldC5yZW5kZXJlcnMrIilcXC4iOwordmFyIHI9XzZlNC5zZWFyY2gobmV3IFJlZ0V4cChyZWd4KSk7CitfNmU5PShyPDA/XzZlOS5qb2luKCIuIik6XzZlNC5zdWJzdHIoMCxyKSk7Citkb2pvLndpZGdldC5tYW5hZ2VyLnJlZ2lzdGVyV2lkZ2V0UGFja2FnZShfNmU5KTsKK3ZhciBwb3M9XzZlOS5pbmRleE9mKCIuIik7Cit2YXIgXzZlZT0ocG9zPi0xKT9fNmU5LnN1YnN0cmluZygwLHBvcyk6XzZlOTsKK182ZTg9KF82ZTgpfHx7fTsKK182ZTgud2lkZ2V0VHlwZT10eXBlOworaWYoKCFpbml0KSYmKF82ZThbImNsYXNzQ29uc3RydWN0b3IiXSkpeworaW5pdD1fNmU4LmNsYXNzQ29uc3RydWN0b3I7CitkZWxldGUgXzZlOC5jbGFzc0NvbnN0cnVjdG9yOworfQorZG9qby5kZWNsYXJlKF82ZTQsXzZlNixpbml0LF82ZTgpOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUGFyc2UiKTsKK2Rvam8ud2lkZ2V0LlBhcnNlPWZ1bmN0aW9uKF82ZWYpewordGhpcy5wcm9wZXJ0eVNldHNMaXN0PVtdOwordGhpcy5mcmFnbWVudD1fNmVmOwordGhpcy5jcmVhdGVDb21wb25lbnRzPWZ1bmN0aW9uKGZyYWcsXzZmMSl7Cit2YXIgXzZmMj1bXTsKK3ZhciBfNmYzPWZhbHNlOwordHJ5eworaWYoZnJhZyYmZnJhZy50YWdOYW1lJiYoZnJhZyE9ZnJhZy5ub2RlUmVmKSl7Cit2YXIgXzZmND1kb2pvLndpZGdldC50YWdzOwordmFyIHRuYT1TdHJpbmcoZnJhZy50YWdOYW1lKS5zcGxpdCgiOyIpOworZm9yKHZhciB4PTA7eDx0bmEubGVuZ3RoO3grKyl7Cit2YXIgbHRuPXRuYVt4XS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIikudG9Mb3dlckNhc2UoKTsKK2ZyYWcudGFnTmFtZT1sdG47Cit2YXIgcmV0OworaWYoXzZmNFtsdG5dKXsKK182ZjM9dHJ1ZTsKK3JldD1fNmY0W2x0bl0oZnJhZyx0aGlzLF82ZjEsZnJhZy5pbmRleCk7CitfNmYyLnB1c2gocmV0KTsKK31lbHNleworaWYobHRuLmluZGV4T2YoIjoiKT09LTEpeworbHRuPSJkb2pvOiIrbHRuOworfQorcmV0PWRvam8ud2lkZ2V0LmJ1aWxkV2lkZ2V0RnJvbVBhcnNlVHJlZShsdG4sZnJhZyx0aGlzLF82ZjEsZnJhZy5pbmRleCk7CitpZihyZXQpeworXzZmMz10cnVlOworXzZmMi5wdXNoKHJldCk7Cit9Cit9Cit9Cit9Cit9CitjYXRjaChlKXsKK2Rvam8uZGVidWcoImRvam8ud2lkZ2V0LlBhcnNlOiBlcnJvcjoiLGUpOworfQoraWYoIV82ZjMpeworXzZmMj1fNmYyLmNvbmNhdCh0aGlzLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZyxfNmYxKSk7Cit9CityZXR1cm4gXzZmMjsKK307Cit0aGlzLmNyZWF0ZVN1YkNvbXBvbmVudHM9ZnVuY3Rpb24oXzZmOSxfNmZhKXsKK3ZhciBmcmFnLF82ZmM9W107Citmb3IodmFyIGl0ZW0gaW4gXzZmOSl7CitmcmFnPV82ZjlbaXRlbV07CitpZihmcmFnJiZ0eXBlb2YgZnJhZz09Im9iamVjdCImJihmcmFnIT1fNmY5Lm5vZGVSZWYpJiYoZnJhZyE9XzZmOS50YWdOYW1lKSYmKCFkb2pvLmRvbS5pc05vZGUoZnJhZykpKXsKK182ZmM9XzZmYy5jb25jYXQodGhpcy5jcmVhdGVDb21wb25lbnRzKGZyYWcsXzZmYSkpOworfQorfQorcmV0dXJuIF82ZmM7Cit9OwordGhpcy5wYXJzZVByb3BlcnR5U2V0cz1mdW5jdGlvbihfNmZlKXsKK3JldHVybiBbXTsKK307Cit0aGlzLnBhcnNlUHJvcGVydGllcz1mdW5jdGlvbihfNmZmKXsKK3ZhciBfNzAwPXt9OworZm9yKHZhciBpdGVtIGluIF82ZmYpeworaWYoKF82ZmZbaXRlbV09PV82ZmYudGFnTmFtZSl8fChfNmZmW2l0ZW1dPT1fNmZmLm5vZGVSZWYpKXsKK31lbHNlewordmFyIGZyYWc9XzZmZltpdGVtXTsKK2lmKGZyYWcudGFnTmFtZSYmZG9qby53aWRnZXQudGFnc1tmcmFnLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0peworfWVsc2V7CitpZihmcmFnWzBdJiZmcmFnWzBdLnZhbHVlIT0iIiYmZnJhZ1swXS52YWx1ZSE9bnVsbCl7Cit0cnl7CitpZihpdGVtLnRvTG93ZXJDYXNlKCk9PSJkYXRhcHJvdmlkZXIiKXsKK3ZhciBfNzAzPXRoaXM7Cit0aGlzLmdldERhdGFQcm92aWRlcihfNzAzLGZyYWdbMF0udmFsdWUpOworXzcwMC5kYXRhUHJvdmlkZXI9dGhpcy5kYXRhUHJvdmlkZXI7Cit9CitfNzAwW2l0ZW1dPWZyYWdbMF0udmFsdWU7Cit2YXIgXzcwND10aGlzLnBhcnNlUHJvcGVydGllcyhmcmFnKTsKK2Zvcih2YXIgXzcwNSBpbiBfNzA0KXsKK183MDBbXzcwNV09XzcwNFtfNzA1XTsKK30KK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK30KK30KK3N3aXRjaChpdGVtLnRvTG93ZXJDYXNlKCkpeworY2FzZSAiY2hlY2tlZCI6CitjYXNlICJkaXNhYmxlZCI6CitpZih0eXBlb2YgXzcwMFtpdGVtXSE9ImJvb2xlYW4iKXsKK183MDBbaXRlbV09dHJ1ZTsKK30KK2JyZWFrOworfQorfQorfQorcmV0dXJuIF83MDA7Cit9OwordGhpcy5nZXREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oXzcwNixfNzA3KXsKK2Rvam8uaW8uYmluZCh7dXJsOl83MDcsbG9hZDpmdW5jdGlvbih0eXBlLF83MDkpeworaWYodHlwZT09ImxvYWQiKXsKK183MDYuZGF0YVByb3ZpZGVyPV83MDk7Cit9Cit9LG1pbWV0eXBlOiJ0ZXh0L2phdmFzY3JpcHQiLHN5bmM6dHJ1ZX0pOworfTsKK3RoaXMuZ2V0UHJvcGVydHlTZXRCeUlkPWZ1bmN0aW9uKF83MGEpeworZm9yKHZhciB4PTA7eDx0aGlzLnByb3BlcnR5U2V0c0xpc3QubGVuZ3RoO3grKyl7CitpZihfNzBhPT10aGlzLnByb3BlcnR5U2V0c0xpc3RbeF1bImlkIl1bMF0udmFsdWUpeworcmV0dXJuIHRoaXMucHJvcGVydHlTZXRzTGlzdFt4XTsKK30KK30KK3JldHVybiAiIjsKK307Cit0aGlzLmdldFByb3BlcnR5U2V0c0J5VHlwZT1mdW5jdGlvbihfNzBjKXsKK3ZhciBfNzBkPVtdOworZm9yKHZhciB4PTA7eDx0aGlzLnByb3BlcnR5U2V0c0xpc3QubGVuZ3RoO3grKyl7Cit2YXIgY3BsPXRoaXMucHJvcGVydHlTZXRzTGlzdFt4XTsKK3ZhciBjcGNjPWNwbC5jb21wb25lbnRDbGFzc3x8Y3BsLmNvbXBvbmVudFR5cGV8fG51bGw7Cit2YXIgXzcxMT10aGlzLnByb3BlcnR5U2V0c0xpc3RbeF1bImlkIl1bMF0udmFsdWU7CitpZihjcGNjJiYoXzcxMT09Y3BjY1swXS52YWx1ZSkpeworXzcwZC5wdXNoKGNwbCk7Cit9Cit9CityZXR1cm4gXzcwZDsKK307Cit0aGlzLmdldFByb3BlcnR5U2V0cz1mdW5jdGlvbihfNzEyKXsKK3ZhciBwcGw9ImRvam86cHJvcGVydHlwcm92aWRlcmxpc3QiOwordmFyIF83MTQ9W107Cit2YXIgXzcxNT1fNzEyLnRhZ05hbWU7CitpZihfNzEyW3BwbF0pewordmFyIF83MTY9XzcxMltwcGxdLnZhbHVlLnNwbGl0KCIgIik7Citmb3IodmFyIF83MTcgaW4gXzcxNil7CitpZigoXzcxNy5pbmRleE9mKCIuLiIpPT0tMSkmJihfNzE3LmluZGV4T2YoIjovLyIpPT0tMSkpewordmFyIF83MTg9dGhpcy5nZXRQcm9wZXJ0eVNldEJ5SWQoXzcxNyk7CitpZihfNzE4IT0iIil7CitfNzE0LnB1c2goXzcxOCk7Cit9Cit9ZWxzZXsKK30KK30KK30KK3JldHVybiB0aGlzLmdldFByb3BlcnR5U2V0c0J5VHlwZShfNzE1KS5jb25jYXQoXzcxNCk7Cit9OwordGhpcy5jcmVhdGVDb21wb25lbnRGcm9tU2NyaXB0PWZ1bmN0aW9uKF83MTksXzcxYSxfNzFiLG5zKXsKK183MWIuZmFzdE1peEluPXRydWU7Cit2YXIgbHRuPShuc3x8ImRvam8iKSsiOiIrXzcxYS50b0xvd2VyQ2FzZSgpOworaWYoZG9qby53aWRnZXQudGFnc1tsdG5dKXsKK3JldHVybiBbZG9qby53aWRnZXQudGFnc1tsdG5dKF83MWIsdGhpcyxudWxsLG51bGwsXzcxYildOworfQorcmV0dXJuIFtkb2pvLndpZGdldC5idWlsZFdpZGdldEZyb21QYXJzZVRyZWUobHRuLF83MWIsdGhpcyxudWxsLG51bGwsXzcxYildOworfTsKK307Citkb2pvLndpZGdldC5fcGFyc2VyX2NvbGxlY3Rpb249eyJkb2pvIjpuZXcgZG9qby53aWRnZXQuUGFyc2UoKX07Citkb2pvLndpZGdldC5nZXRQYXJzZXI9ZnVuY3Rpb24obmFtZSl7CitpZighbmFtZSl7CituYW1lPSJkb2pvIjsKK30KK2lmKCF0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXSl7Cit0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXT1uZXcgZG9qby53aWRnZXQuUGFyc2UoKTsKK30KK3JldHVybiB0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXTsKK307Citkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQ9ZnVuY3Rpb24obmFtZSxfNzIwLF83MjEsXzcyMil7Cit2YXIgXzcyMz1mYWxzZTsKK3ZhciBfNzI0PSh0eXBlb2YgbmFtZT09InN0cmluZyIpOworaWYoXzcyNCl7Cit2YXIgcG9zPW5hbWUuaW5kZXhPZigiOiIpOwordmFyIG5zPShwb3M+LTEpP25hbWUuc3Vic3RyaW5nKDAscG9zKToiZG9qbyI7CitpZihwb3M+LTEpeworbmFtZT1uYW1lLnN1YnN0cmluZyhwb3MrMSk7Cit9Cit2YXIgXzcyNz1uYW1lLnRvTG93ZXJDYXNlKCk7Cit2YXIgXzcyOD1ucysiOiIrXzcyNzsKK183MjM9KGRvam8uYnlJZChuYW1lKSYmIWRvam8ud2lkZ2V0LnRhZ3NbXzcyOF0pOworfQoraWYoKGFyZ3VtZW50cy5sZW5ndGg9PTEpJiYoXzcyM3x8IV83MjQpKXsKK3ZhciB4cD1uZXcgZG9qby54bWwuUGFyc2UoKTsKK3ZhciB0bj1fNzIzP2Rvam8uYnlJZChuYW1lKTpuYW1lOworcmV0dXJuIGRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoeHAucGFyc2VFbGVtZW50KHRuLG51bGwsdHJ1ZSkpWzBdOworfQorZnVuY3Rpb24gZnJvbVNjcmlwdChfNzJiLG5hbWUsXzcyZCxucyl7CitfNzJkW183MjhdPXtkb2pvdHlwZTpbe3ZhbHVlOl83Mjd9XSxub2RlUmVmOl83MmIsZmFzdE1peEluOnRydWV9OworXzcyZC5ucz1uczsKK3JldHVybiBkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVDb21wb25lbnRGcm9tU2NyaXB0KF83MmIsbmFtZSxfNzJkLG5zKTsKK30KK183MjA9XzcyMHx8e307Cit2YXIgXzcyZj1mYWxzZTsKK3ZhciB0bj1udWxsOwordmFyIGg9ZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlOworaWYoaCl7Cit0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Cit9CitpZighXzcyMSl7CitfNzJmPXRydWU7CitfNzIxPXRuOworaWYoaCl7Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChfNzIxKTsKK30KK31lbHNleworaWYoXzcyMil7Citkb2pvLmRvbS5pbnNlcnRBdFBvc2l0aW9uKHRuLF83MjEsXzcyMik7Cit9ZWxzZXsKK3RuPV83MjE7Cit9Cit9Cit2YXIgXzczMT1mcm9tU2NyaXB0KHRuLG5hbWUudG9Mb3dlckNhc2UoKSxfNzIwLG5zKTsKK2lmKCghXzczMSl8fCghXzczMVswXSl8fCh0eXBlb2YgXzczMVswXS53aWRnZXRUeXBlPT0idW5kZWZpbmVkIikpewordGhyb3cgbmV3IEVycm9yKCJjcmVhdGVXaWRnZXQ6IENyZWF0aW9uIG9mIFwiIituYW1lKyJcIiB3aWRnZXQgZmFpbGVkLiIpOworfQordHJ5eworaWYoXzcyZiYmXzczMVswXS5kb21Ob2RlLnBhcmVudE5vZGUpeworXzczMVswXS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoXzczMVswXS5kb21Ob2RlKTsKK30KK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK3JldHVybiBfNzMxWzBdOworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRG9tV2lkZ2V0Iik7Citkb2pvLndpZGdldC5fY3NzRmlsZXM9e307Citkb2pvLndpZGdldC5fY3NzU3RyaW5ncz17fTsKK2Rvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlPXt9OworZG9qby53aWRnZXQuZGVmYXVsdFN0cmluZ3M9e2Rvam9Sb290OmRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCksZG9qb1dpZGdldE1vZHVsZVVyaTpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiksYmFzZVNjcmlwdFVyaTpkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpfTsKK2Rvam8ud2lkZ2V0LmZpbGxGcm9tVGVtcGxhdGVDYWNoZT1mdW5jdGlvbihvYmosXzczMyxfNzM0LF83MzUpewordmFyIF83MzY9XzczM3x8b2JqLnRlbXBsYXRlUGF0aDsKK3ZhciBfNzM3PWRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlOworaWYoIV83MzYmJiFvYmpbIndpZGdldFR5cGUiXSl7Citkb3sKK3ZhciBfNzM4PSJfX2R1bW15VGVtcGxhdGVfXyIrZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGUuZHVtbXlDb3VudCsrOworfXdoaWxlKF83MzdbXzczOF0pOworb2JqLndpZGdldFR5cGU9XzczODsKK30KK3ZhciB3dD1fNzM2P183MzYudG9TdHJpbmcoKTpvYmoud2lkZ2V0VHlwZTsKK3ZhciB0cz1fNzM3W3d0XTsKK2lmKCF0cyl7CitfNzM3W3d0XT17InN0cmluZyI6bnVsbCwibm9kZSI6bnVsbH07CitpZihfNzM1KXsKK3RzPXt9OworfWVsc2V7Cit0cz1fNzM3W3d0XTsKK30KK30KK2lmKCghb2JqLnRlbXBsYXRlU3RyaW5nKSYmKCFfNzM1KSl7CitvYmoudGVtcGxhdGVTdHJpbmc9XzczNHx8dHNbInN0cmluZyJdOworfQoraWYob2JqLnRlbXBsYXRlU3RyaW5nKXsKK29iai50ZW1wbGF0ZVN0cmluZz10aGlzLl9zYW5pdGl6ZVRlbXBsYXRlU3RyaW5nKG9iai50ZW1wbGF0ZVN0cmluZyk7Cit9CitpZigoIW9iai50ZW1wbGF0ZU5vZGUpJiYoIV83MzUpKXsKK29iai50ZW1wbGF0ZU5vZGU9dHNbIm5vZGUiXTsKK30KK2lmKCghb2JqLnRlbXBsYXRlTm9kZSkmJighb2JqLnRlbXBsYXRlU3RyaW5nKSYmKF83MzYpKXsKK3ZhciBfNzNiPXRoaXMuX3Nhbml0aXplVGVtcGxhdGVTdHJpbmcoZG9qby5ob3N0ZW52LmdldFRleHQoXzczNikpOworb2JqLnRlbXBsYXRlU3RyaW5nPV83M2I7CitpZighXzczNSl7CitfNzM3W3d0XVsic3RyaW5nIl09XzczYjsKK30KK30KK2lmKCghdHNbInN0cmluZyJdKSYmKCFfNzM1KSl7Cit0cy5zdHJpbmc9b2JqLnRlbXBsYXRlU3RyaW5nOworfQorfTsKK2Rvam8ud2lkZ2V0Ll9zYW5pdGl6ZVRlbXBsYXRlU3RyaW5nPWZ1bmN0aW9uKF83M2MpeworaWYoXzczYyl7CitfNzNjPV83M2MucmVwbGFjZSgvXlxzKjxcP3htbChccykrdmVyc2lvbj1bXCdcIl0oXGQpKi4oXGQpKltcJ1wiXShccykqXD8+L2ltLCIiKTsKK3ZhciBfNzNkPV83M2MubWF0Y2goLzxib2R5W14+XSo+XHMqKFtcc1xTXSspXHMqPFwvYm9keT4vaW0pOworaWYoXzczZCl7CitfNzNjPV83M2RbMV07Cit9Cit9ZWxzZXsKK183M2M9IiI7Cit9CityZXR1cm4gXzczYzsKK307Citkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZS5kdW1teUNvdW50PTA7Citkb2pvLndpZGdldC5hdHRhY2hQcm9wZXJ0aWVzPVsiZG9qb0F0dGFjaFBvaW50IiwiaWQiXTsKK2Rvam8ud2lkZ2V0LmV2ZW50QXR0YWNoUHJvcGVydHk9ImRvam9BdHRhY2hFdmVudCI7Citkb2pvLndpZGdldC5vbkJ1aWxkUHJvcGVydHk9ImRvam9PbkJ1aWxkIjsKK2Rvam8ud2lkZ2V0LndhaU5hbWVzPVsid2FpUm9sZSIsIndhaVN0YXRlIl07Citkb2pvLndpZGdldC53YWk9e3dhaVJvbGU6e25hbWU6IndhaVJvbGUiLCJuYW1lc3BhY2UiOiJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDIiLGFsaWFzOiJ4MiIscHJlZml4OiJ3YWlyb2xlOiJ9LHdhaVN0YXRlOntuYW1lOiJ3YWlTdGF0ZSIsIm5hbWVzcGFjZSI6Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDcvYWFhIixhbGlhczoiYWFhIixwcmVmaXg6IiJ9LHNldEF0dHI6ZnVuY3Rpb24obm9kZSxucyxhdHRyLF83NDEpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Citub2RlLnNldEF0dHJpYnV0ZSh0aGlzW25zXS5hbGlhcysiOiIrYXR0cix0aGlzW25zXS5wcmVmaXgrXzc0MSk7Cit9ZWxzZXsKK25vZGUuc2V0QXR0cmlidXRlTlModGhpc1tuc11bIm5hbWVzcGFjZSJdLGF0dHIsdGhpc1tuc10ucHJlZml4K183NDEpOworfQorfSxnZXRBdHRyOmZ1bmN0aW9uKG5vZGUsbnMsYXR0cil7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK3JldHVybiBub2RlLmdldEF0dHJpYnV0ZSh0aGlzW25zXS5hbGlhcysiOiIrYXR0cik7Cit9ZWxzZXsKK3JldHVybiBub2RlLmdldEF0dHJpYnV0ZU5TKHRoaXNbbnNdWyJuYW1lc3BhY2UiXSxhdHRyKTsKK30KK30scmVtb3ZlQXR0cjpmdW5jdGlvbihub2RlLG5zLGF0dHIpewordmFyIF83NDg9dHJ1ZTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworXzc0OD1ub2RlLnJlbW92ZUF0dHJpYnV0ZSh0aGlzW25zXS5hbGlhcysiOiIrYXR0cik7Cit9ZWxzZXsKK25vZGUucmVtb3ZlQXR0cmlidXRlTlModGhpc1tuc11bIm5hbWVzcGFjZSJdLGF0dHIpOworfQorcmV0dXJuIF83NDg7Cit9fTsKK2Rvam8ud2lkZ2V0LmF0dGFjaFRlbXBsYXRlTm9kZXM9ZnVuY3Rpb24oXzc0OSxfNzRhLF83NGIpewordmFyIF83NGM9ZG9qby5kb20uRUxFTUVOVF9OT0RFOworZnVuY3Rpb24gdHJpbShzdHIpeworcmV0dXJuIHN0ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7Cit9CitpZighXzc0OSl7CitfNzQ5PV83NGEuZG9tTm9kZTsKK30KK2lmKF83NDkubm9kZVR5cGUhPV83NGMpeworcmV0dXJuOworfQordmFyIF83NGU9Xzc0OS5hbGx8fF83NDkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKK3ZhciBfNzRmPV83NGE7Citmb3IodmFyIHg9LTE7eDxfNzRlLmxlbmd0aDt4KyspewordmFyIF83NTE9KHg9PS0xKT9fNzQ5Ol83NGVbeF07Cit2YXIgXzc1Mj1bXTsKK2lmKCFfNzRhLndpZGdldHNJblRlbXBsYXRlfHwhXzc1MS5nZXRBdHRyaWJ1dGUoImRvam9UeXBlIikpeworZm9yKHZhciB5PTA7eTx0aGlzLmF0dGFjaFByb3BlcnRpZXMubGVuZ3RoO3krKyl7Cit2YXIgXzc1ND1fNzUxLmdldEF0dHJpYnV0ZSh0aGlzLmF0dGFjaFByb3BlcnRpZXNbeV0pOworaWYoXzc1NCl7CitfNzUyPV83NTQuc3BsaXQoIjsiKTsKK2Zvcih2YXIgej0wO3o8Xzc1Mi5sZW5ndGg7eisrKXsKK2lmKGRvam8ubGFuZy5pc0FycmF5KF83NGFbXzc1Mlt6XV0pKXsKK183NGFbXzc1Mlt6XV0ucHVzaChfNzUxKTsKK31lbHNleworXzc0YVtfNzUyW3pdXT1fNzUxOworfQorfQorYnJlYWs7Cit9Cit9Cit2YXIgXzc1Nj1fNzUxLmdldEF0dHJpYnV0ZSh0aGlzLmV2ZW50QXR0YWNoUHJvcGVydHkpOworaWYoXzc1Nil7Cit2YXIgZXZ0cz1fNzU2LnNwbGl0KCI7Iik7Citmb3IodmFyIHk9MDt5PGV2dHMubGVuZ3RoO3krKyl7CitpZigoIWV2dHNbeV0pfHwoIWV2dHNbeV0ubGVuZ3RoKSl7Citjb250aW51ZTsKK30KK3ZhciBfNzU4PW51bGw7Cit2YXIgdGV2dD10cmltKGV2dHNbeV0pOworaWYoZXZ0c1t5XS5pbmRleE9mKCI6Iik+PTApewordmFyIF83NWE9dGV2dC5zcGxpdCgiOiIpOwordGV2dD10cmltKF83NWFbMF0pOworXzc1OD10cmltKF83NWFbMV0pOworfQoraWYoIV83NTgpeworXzc1OD10ZXZ0OworfQordmFyIHRmPWZ1bmN0aW9uKCl7Cit2YXIgbnRmPW5ldyBTdHJpbmcoXzc1OCk7CityZXR1cm4gZnVuY3Rpb24oZXZ0KXsKK2lmKF83NGZbbnRmXSl7CitfNzRmW250Zl0oZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCx0aGlzKSk7Cit9Cit9OworfSgpOworZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKF83NTEsdGV2dCx0ZixmYWxzZSx0cnVlKTsKK30KK30KK2Zvcih2YXIgeT0wO3k8Xzc0Yi5sZW5ndGg7eSsrKXsKK3ZhciBfNzVlPV83NTEuZ2V0QXR0cmlidXRlKF83NGJbeV0pOworaWYoKF83NWUpJiYoXzc1ZS5sZW5ndGgpKXsKK3ZhciBfNzU4PW51bGw7Cit2YXIgXzc1Zj1fNzRiW3ldLnN1YnN0cig0KTsKK183NTg9dHJpbShfNzVlKTsKK3ZhciBfNzYwPVtfNzU4XTsKK2lmKF83NTguaW5kZXhPZigiOyIpPj0wKXsKK183NjA9ZG9qby5sYW5nLm1hcChfNzU4LnNwbGl0KCI7IiksdHJpbSk7Cit9Citmb3IodmFyIHo9MDt6PF83NjAubGVuZ3RoO3orKyl7CitpZighXzc2MFt6XS5sZW5ndGgpeworY29udGludWU7Cit9Cit2YXIgdGY9ZnVuY3Rpb24oKXsKK3ZhciBudGY9bmV3IFN0cmluZyhfNzYwW3pdKTsKK3JldHVybiBmdW5jdGlvbihldnQpeworaWYoXzc0ZltudGZdKXsKK183NGZbbnRmXShkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LHRoaXMpKTsKK30KK307Cit9KCk7Citkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoXzc1MSxfNzVmLHRmLGZhbHNlLHRydWUpOworfQorfQorfQorfQordmFyIF83NjM9Xzc1MS5nZXRBdHRyaWJ1dGUodGhpcy50ZW1wbGF0ZVByb3BlcnR5KTsKK2lmKF83NjMpeworXzc0YVtfNzYzXT1fNzUxOworfQorZG9qby5sYW5nLmZvckVhY2goZG9qby53aWRnZXQud2FpTmFtZXMsZnVuY3Rpb24obmFtZSl7Cit2YXIgd2FpPWRvam8ud2lkZ2V0LndhaVtuYW1lXTsKK3ZhciB2YWw9Xzc1MS5nZXRBdHRyaWJ1dGUod2FpLm5hbWUpOworaWYodmFsKXsKK2lmKHZhbC5pbmRleE9mKCItIik9PS0xKXsKK2Rvam8ud2lkZ2V0LndhaS5zZXRBdHRyKF83NTEsd2FpLm5hbWUsInJvbGUiLHZhbCk7Cit9ZWxzZXsKK3ZhciBfNzY3PXZhbC5zcGxpdCgiLSIpOworZG9qby53aWRnZXQud2FpLnNldEF0dHIoXzc1MSx3YWkubmFtZSxfNzY3WzBdLF83NjdbMV0pOworfQorfQorfSx0aGlzKTsKK3ZhciBfNzY4PV83NTEuZ2V0QXR0cmlidXRlKHRoaXMub25CdWlsZFByb3BlcnR5KTsKK2lmKF83NjgpeworZXZhbCgidmFyIG5vZGUgPSBiYXNlTm9kZTsgdmFyIHdpZGdldCA9IHRhcmdldE9iajsgIitfNzY4KTsKK30KK30KK307Citkb2pvLndpZGdldC5nZXREb2pvRXZlbnRzRnJvbVN0cj1mdW5jdGlvbihzdHIpewordmFyIHJlPS8oZG9qb09uKFthLXpdKykoXHM/KSk9L2dpOwordmFyIGV2dHM9c3RyP3N0ci5tYXRjaChyZSl8fFtdOltdOwordmFyIHJldD1bXTsKK3ZhciBsZW09e307Citmb3IodmFyIHg9MDt4PGV2dHMubGVuZ3RoO3grKyl7CitpZihldnRzW3hdLmxlbmd0aDwxKXsKK2NvbnRpbnVlOworfQordmFyIGNtPWV2dHNbeF0ucmVwbGFjZSgvXHMvLCIiKTsKK2NtPShjbS5zbGljZSgwLGNtLmxlbmd0aC0xKSk7CitpZighbGVtW2NtXSl7CitsZW1bY21dPXRydWU7CityZXQucHVzaChjbSk7Cit9Cit9CityZXR1cm4gcmV0OworfTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRG9tV2lkZ2V0Iixkb2pvLndpZGdldC5XaWRnZXQsZnVuY3Rpb24oKXsKK2lmKChhcmd1bWVudHMubGVuZ3RoPjApJiYodHlwZW9mIGFyZ3VtZW50c1swXT09Im9iamVjdCIpKXsKK3RoaXMuY3JlYXRlKGFyZ3VtZW50c1swXSk7Cit9Cit9LHt0ZW1wbGF0ZU5vZGU6bnVsbCx0ZW1wbGF0ZVN0cmluZzpudWxsLHRlbXBsYXRlQ3NzU3RyaW5nOm51bGwscHJldmVudENsb2JiZXI6ZmFsc2UsZG9tTm9kZTpudWxsLGNvbnRhaW5lck5vZGU6bnVsbCx3aWRnZXRzSW5UZW1wbGF0ZTpmYWxzZSxhZGRDaGlsZDpmdW5jdGlvbihfNzcwLF83NzEscG9zLHJlZixfNzc0KXsKK2lmKCF0aGlzLmlzQ29udGFpbmVyKXsKK2Rvam8uZGVidWcoImRvam8ud2lkZ2V0LkRvbVdpZGdldC5hZGRDaGlsZCgpIGF0dGVtcHRlZCBvbiBub24tY29udGFpbmVyIHdpZGdldCIpOworcmV0dXJuIG51bGw7Cit9ZWxzZXsKK2lmKF83NzQ9PXVuZGVmaW5lZCl7CitfNzc0PXRoaXMuY2hpbGRyZW4ubGVuZ3RoOworfQordGhpcy5hZGRXaWRnZXRBc0RpcmVjdENoaWxkKF83NzAsXzc3MSxwb3MscmVmLF83NzQpOwordGhpcy5yZWdpc3RlckNoaWxkKF83NzAsXzc3NCk7Cit9CityZXR1cm4gXzc3MDsKK30sYWRkV2lkZ2V0QXNEaXJlY3RDaGlsZDpmdW5jdGlvbihfNzc1LF83NzYscG9zLHJlZixfNzc5KXsKK2lmKCghdGhpcy5jb250YWluZXJOb2RlKSYmKCFfNzc2KSl7Cit0aGlzLmNvbnRhaW5lck5vZGU9dGhpcy5kb21Ob2RlOworfQordmFyIGNuPShfNzc2KT9fNzc2OnRoaXMuY29udGFpbmVyTm9kZTsKK2lmKCFwb3MpeworcG9zPSJhZnRlciI7Cit9CitpZighcmVmKXsKK2lmKCFjbil7Citjbj1kb2pvLmJvZHkoKTsKK30KK3JlZj1jbi5sYXN0Q2hpbGQ7Cit9CitpZighXzc3OSl7CitfNzc5PTA7Cit9CitfNzc1LmRvbU5vZGUuc2V0QXR0cmlidXRlKCJkb2pvaW5zZXJ0aW9uaW5kZXgiLF83NzkpOworaWYoIXJlZil7Citjbi5hcHBlbmRDaGlsZChfNzc1LmRvbU5vZGUpOworfWVsc2V7CitpZihwb3M9PSJpbnNlcnRBdEluZGV4Iil7Citkb2pvLmRvbS5pbnNlcnRBdEluZGV4KF83NzUuZG9tTm9kZSxyZWYucGFyZW50Tm9kZSxfNzc5KTsKK31lbHNleworaWYoKHBvcz09ImFmdGVyIikmJihyZWY9PT1jbi5sYXN0Q2hpbGQpKXsKK2NuLmFwcGVuZENoaWxkKF83NzUuZG9tTm9kZSk7Cit9ZWxzZXsKK2Rvam8uZG9tLmluc2VydEF0UG9zaXRpb24oXzc3NS5kb21Ob2RlLGNuLHBvcyk7Cit9Cit9Cit9Cit9LHJlZ2lzdGVyQ2hpbGQ6ZnVuY3Rpb24oXzc3YixfNzdjKXsKK183N2IuZG9qb0luc2VydGlvbkluZGV4PV83N2M7Cit2YXIgaWR4PS0xOworZm9yKHZhciBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtpKyspeworaWYodGhpcy5jaGlsZHJlbltpXS5kb2pvSW5zZXJ0aW9uSW5kZXg8PV83N2MpeworaWR4PWk7Cit9Cit9Cit0aGlzLmNoaWxkcmVuLnNwbGljZShpZHgrMSwwLF83N2IpOworXzc3Yi5wYXJlbnQ9dGhpczsKK183N2IuYWRkZWRUbyh0aGlzLGlkeCsxKTsKK2RlbGV0ZSBkb2pvLndpZGdldC5tYW5hZ2VyLnRvcFdpZGdldHNbXzc3Yi53aWRnZXRJZF07Cit9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKF83N2YpeworZG9qby5kb20ucmVtb3ZlTm9kZShfNzdmLmRvbU5vZGUpOworcmV0dXJuIGRvam8ud2lkZ2V0LkRvbVdpZGdldC5zdXBlcmNsYXNzLnJlbW92ZUNoaWxkLmNhbGwodGhpcyxfNzdmKTsKK30sZ2V0RnJhZ05vZGVSZWY6ZnVuY3Rpb24oZnJhZyl7CitpZighZnJhZyl7CityZXR1cm4gbnVsbDsKK30KK2lmKCFmcmFnW3RoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKV0peworZG9qby5yYWlzZSgiRXJyb3I6IG5vIGZyYWcgZm9yIHdpZGdldCB0eXBlICIrdGhpcy5nZXROYW1lc3BhY2VkVHlwZSgpKyIsIGlkICIrdGhpcy53aWRnZXRJZCsiIChtYXliZSBhIHdpZGdldCBoYXMgc2V0IGl0J3MgdHlwZSBpbmNvcnJlY3RseSkiKTsKK30KK3JldHVybiBmcmFnW3RoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKV1bIm5vZGVSZWYiXTsKK30scG9zdEluaXRpYWxpemU6ZnVuY3Rpb24oYXJncyxmcmFnLF83ODMpewordmFyIF83ODQ9dGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKK2lmKF83ODMmJihfNzgzLnNuYXJmQ2hpbGREb21PdXRwdXR8fCFfNzg0KSl7CitfNzgzLmFkZFdpZGdldEFzRGlyZWN0Q2hpbGQodGhpcywiIiwiaW5zZXJ0QXRJbmRleCIsIiIsYXJnc1siZG9qb2luc2VydGlvbmluZGV4Il0sXzc4NCk7Cit9ZWxzZXsKK2lmKF83ODQpeworaWYodGhpcy5kb21Ob2RlJiYodGhpcy5kb21Ob2RlIT09Xzc4NCkpewordGhpcy5fc291cmNlTm9kZVJlZj1kb2pvLmRvbS5yZXBsYWNlTm9kZShfNzg0LHRoaXMuZG9tTm9kZSk7Cit9Cit9Cit9CitpZihfNzgzKXsKK183ODMucmVnaXN0ZXJDaGlsZCh0aGlzLGFyZ3MuZG9qb2luc2VydGlvbmluZGV4KTsKK31lbHNleworZG9qby53aWRnZXQubWFuYWdlci50b3BXaWRnZXRzW3RoaXMud2lkZ2V0SWRdPXRoaXM7Cit9CitpZih0aGlzLndpZGdldHNJblRlbXBsYXRlKXsKK3ZhciBfNzg1PW5ldyBkb2pvLnhtbC5QYXJzZSgpOwordmFyIF83ODY7Cit2YXIgXzc4Nz10aGlzLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKK2Zvcih2YXIgaT0wO2k8Xzc4Ny5sZW5ndGg7aSsrKXsKK2lmKF83ODdbaV0uZ2V0QXR0cmlidXRlKCJkb2pvQXR0YWNoUG9pbnQiKT09InN1YkNvbnRhaW5lcldpZGdldCIpeworXzc4Nj1fNzg3W2ldOworfQoraWYoXzc4N1tpXS5nZXRBdHRyaWJ1dGUoImRvam9UeXBlIikpeworXzc4N1tpXS5zZXRBdHRyaWJ1dGUoImlzU3ViV2lkZ2V0Iix0cnVlKTsKK30KK30KK2lmKHRoaXMuaXNDb250YWluZXImJiF0aGlzLmNvbnRhaW5lck5vZGUpeworaWYoXzc4Nil7Cit2YXIgc3JjPXRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CitpZihzcmMpeworZG9qby5kb20ubW92ZUNoaWxkcmVuKHNyYyxfNzg2KTsKK2ZyYWdbImRvam9Eb250Rm9sbG93Il09dHJ1ZTsKK30KK31lbHNleworZG9qby5kZWJ1ZygiTm8gc3ViQ29udGFpbmVyV2lkZ2V0IG5vZGUgY2FuIGJlIGZvdW5kIGluIHRlbXBsYXRlIGZpbGUgZm9yIHdpZGdldCAiK3RoaXMpOworfQorfQordmFyIF83OGE9Xzc4NS5wYXJzZUVsZW1lbnQodGhpcy5kb21Ob2RlLG51bGwsdHJ1ZSk7Citkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKF83OGEsdGhpcyk7Cit2YXIgXzc4Yj1bXTsKK3ZhciBfNzhjPVt0aGlzXTsKK3ZhciB3Oword2hpbGUoKHc9Xzc4Yy5wb3AoKSkpeworZm9yKHZhciBpPTA7aTx3LmNoaWxkcmVuLmxlbmd0aDtpKyspewordmFyIF83OGU9dy5jaGlsZHJlbltpXTsKK2lmKF83OGUuX3Byb2Nlc3NlZFN1YldpZGdldHN8fCFfNzhlLmV4dHJhQXJnc1siaXNzdWJ3aWRnZXQiXSl7Citjb250aW51ZTsKK30KK183OGIucHVzaChfNzhlKTsKK2lmKF83OGUuaXNDb250YWluZXIpeworXzc4Yy5wdXNoKF83OGUpOworfQorfQorfQorZm9yKHZhciBpPTA7aTxfNzhiLmxlbmd0aDtpKyspewordmFyIF83OGY9Xzc4YltpXTsKK2lmKF83OGYuX3Byb2Nlc3NlZFN1YldpZGdldHMpeworZG9qby5kZWJ1ZygiVGhpcyBzaG91bGQgbm90IGhhcHBlbjogd2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzIGlzIGFscmVhZHkgdHJ1ZSEiKTsKK3JldHVybjsKK30KK183OGYuX3Byb2Nlc3NlZFN1YldpZGdldHM9dHJ1ZTsKK2lmKF83OGYuZXh0cmFBcmdzWyJkb2pvYXR0YWNoZXZlbnQiXSl7Cit2YXIgZXZ0cz1fNzhmLmV4dHJhQXJnc1siZG9qb2F0dGFjaGV2ZW50Il0uc3BsaXQoIjsiKTsKK2Zvcih2YXIgaj0wO2o8ZXZ0cy5sZW5ndGg7aisrKXsKK3ZhciBfNzkyPW51bGw7Cit2YXIgdGV2dD1kb2pvLnN0cmluZy50cmltKGV2dHNbal0pOworaWYodGV2dC5pbmRleE9mKCI6Iik+PTApewordmFyIF83OTQ9dGV2dC5zcGxpdCgiOiIpOwordGV2dD1kb2pvLnN0cmluZy50cmltKF83OTRbMF0pOworXzc5Mj1kb2pvLnN0cmluZy50cmltKF83OTRbMV0pOworfQoraWYoIV83OTIpeworXzc5Mj10ZXZ0OworfQoraWYoZG9qby5sYW5nLmlzRnVuY3Rpb24oXzc4Zlt0ZXZ0XSkpeworZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajpfNzhmLHNyY0Z1bmM6dGV2dCx0YXJnZXRPYmo6dGhpcyx0YXJnZXRGdW5jOl83OTJ9KTsKK31lbHNleworYWxlcnQodGV2dCsiIGlzIG5vdCBhIGZ1bmN0aW9uIGluIHdpZGdldCAiK183OGYpOworfQorfQorfQoraWYoXzc4Zi5leHRyYUFyZ3NbImRvam9hdHRhY2hwb2ludCJdKXsKK3RoaXNbXzc4Zi5leHRyYUFyZ3NbImRvam9hdHRhY2hwb2ludCJdXT1fNzhmOworfQorfQorfQoraWYodGhpcy5pc0NvbnRhaW5lciYmIWZyYWdbImRvam9Eb250Rm9sbG93Il0peworZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlU3ViQ29tcG9uZW50cyhmcmFnLHRoaXMpOworfQorfSxidWlsZFJlbmRlcmluZzpmdW5jdGlvbihhcmdzLGZyYWcpewordmFyIHRzPWRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW3RoaXMud2lkZ2V0VHlwZV07CitpZihhcmdzWyJ0ZW1wbGF0ZWNzc3BhdGgiXSl7CithcmdzWyJ0ZW1wbGF0ZUNzc1BhdGgiXT1hcmdzWyJ0ZW1wbGF0ZWNzc3BhdGgiXTsKK30KK3ZhciBfNzk4PWFyZ3NbInRlbXBsYXRlQ3NzUGF0aCJdfHx0aGlzLnRlbXBsYXRlQ3NzUGF0aDsKK2lmKF83OTgmJiFkb2pvLndpZGdldC5fY3NzRmlsZXNbXzc5OC50b1N0cmluZygpXSl7CitpZigoIXRoaXMudGVtcGxhdGVDc3NTdHJpbmcpJiYoXzc5OCkpewordGhpcy50ZW1wbGF0ZUNzc1N0cmluZz1kb2pvLmhvc3RlbnYuZ2V0VGV4dChfNzk4KTsKK3RoaXMudGVtcGxhdGVDc3NQYXRoPW51bGw7Cit9Citkb2pvLndpZGdldC5fY3NzRmlsZXNbXzc5OC50b1N0cmluZygpXT10cnVlOworfQoraWYoKHRoaXNbInRlbXBsYXRlQ3NzU3RyaW5nIl0pJiYoIWRvam8ud2lkZ2V0Ll9jc3NTdHJpbmdzW3RoaXMudGVtcGxhdGVDc3NTdHJpbmddKSl7Citkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCh0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nLG51bGwsXzc5OCk7Citkb2pvLndpZGdldC5fY3NzU3RyaW5nc1t0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nXT10cnVlOworfQoraWYoKCF0aGlzLnByZXZlbnRDbG9iYmVyKSYmKCh0aGlzLnRlbXBsYXRlUGF0aCl8fCh0aGlzLnRlbXBsYXRlTm9kZSl8fCgodGhpc1sidGVtcGxhdGVTdHJpbmciXSkmJih0aGlzLnRlbXBsYXRlU3RyaW5nLmxlbmd0aCkpfHwoKHR5cGVvZiB0cyE9InVuZGVmaW5lZCIpJiYoKHRzWyJzdHJpbmciXSl8fCh0c1sibm9kZSJdKSkpKSl7Cit0aGlzLmJ1aWxkRnJvbVRlbXBsYXRlKGFyZ3MsZnJhZyk7Cit9ZWxzZXsKK3RoaXMuZG9tTm9kZT10aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworfQordGhpcy5maWxsSW5UZW1wbGF0ZShhcmdzLGZyYWcpOworfSxidWlsZEZyb21UZW1wbGF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpewordmFyIF83OWI9ZmFsc2U7CitpZihhcmdzWyJ0ZW1wbGF0ZXBhdGgiXSl7CithcmdzWyJ0ZW1wbGF0ZVBhdGgiXT1hcmdzWyJ0ZW1wbGF0ZXBhdGgiXTsKK30KK2Rvam8ud2lkZ2V0LmZpbGxGcm9tVGVtcGxhdGVDYWNoZSh0aGlzLGFyZ3NbInRlbXBsYXRlUGF0aCJdLG51bGwsXzc5Yik7Cit2YXIgdHM9ZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbdGhpcy50ZW1wbGF0ZVBhdGg/dGhpcy50ZW1wbGF0ZVBhdGgudG9TdHJpbmcoKTp0aGlzLndpZGdldFR5cGVdOworaWYoKHRzKSYmKCFfNzliKSl7CitpZighdGhpcy50ZW1wbGF0ZVN0cmluZy5sZW5ndGgpewordGhpcy50ZW1wbGF0ZVN0cmluZz10c1sic3RyaW5nIl07Cit9CitpZighdGhpcy50ZW1wbGF0ZU5vZGUpewordGhpcy50ZW1wbGF0ZU5vZGU9dHNbIm5vZGUiXTsKK30KK30KK3ZhciBfNzlkPWZhbHNlOwordmFyIG5vZGU9bnVsbDsKK3ZhciB0c3RyPXRoaXMudGVtcGxhdGVTdHJpbmc7CitpZigoIXRoaXMudGVtcGxhdGVOb2RlKSYmKHRoaXMudGVtcGxhdGVTdHJpbmcpKXsKK183OWQ9dGhpcy50ZW1wbGF0ZVN0cmluZy5tYXRjaCgvXCRceyhbXlx9XSspXH0vZyk7CitpZihfNzlkKXsKK3ZhciBoYXNoPXRoaXMuc3RyaW5nc3x8e307Citmb3IodmFyIGtleSBpbiBkb2pvLndpZGdldC5kZWZhdWx0U3RyaW5ncyl7CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoaGFzaFtrZXldKSl7CitoYXNoW2tleV09ZG9qby53aWRnZXQuZGVmYXVsdFN0cmluZ3Nba2V5XTsKK30KK30KK2Zvcih2YXIgaT0wO2k8Xzc5ZC5sZW5ndGg7aSsrKXsKK3ZhciBrZXk9Xzc5ZFtpXTsKK2tleT1rZXkuc3Vic3RyaW5nKDIsa2V5Lmxlbmd0aC0xKTsKK3ZhciBrdmFsPShrZXkuc3Vic3RyaW5nKDAsNSk9PSJ0aGlzLiIpP2Rvam8ubGFuZy5nZXRPYmpQYXRoVmFsdWUoa2V5LnN1YnN0cmluZyg1KSx0aGlzKTpoYXNoW2tleV07Cit2YXIgXzdhNDsKK2lmKChrdmFsKXx8KGRvam8ubGFuZy5pc1N0cmluZyhrdmFsKSkpeworXzdhND1uZXcgU3RyaW5nKChkb2pvLmxhbmcuaXNGdW5jdGlvbihrdmFsKSk/a3ZhbC5jYWxsKHRoaXMsa2V5LHRoaXMudGVtcGxhdGVTdHJpbmcpOmt2YWwpOword2hpbGUoXzdhNC5pbmRleE9mKCJcIiIpPi0xKXsKK183YTQ9XzdhNC5yZXBsYWNlKCJcIiIsIiZxdW90OyIpOworfQordHN0cj10c3RyLnJlcGxhY2UoXzc5ZFtpXSxfN2E0KTsKK30KK30KK31lbHNlewordGhpcy50ZW1wbGF0ZU5vZGU9dGhpcy5jcmVhdGVOb2Rlc0Zyb21UZXh0KHRoaXMudGVtcGxhdGVTdHJpbmcsdHJ1ZSlbMF07CitpZighXzc5Yil7Cit0cy5ub2RlPXRoaXMudGVtcGxhdGVOb2RlOworfQorfQorfQoraWYoKCF0aGlzLnRlbXBsYXRlTm9kZSkmJighXzc5ZCkpeworZG9qby5kZWJ1ZygiRG9tV2lkZ2V0LmJ1aWxkRnJvbVRlbXBsYXRlOiBjb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIik7CityZXR1cm4gZmFsc2U7Cit9ZWxzZXsKK2lmKCFfNzlkKXsKK25vZGU9dGhpcy50ZW1wbGF0ZU5vZGUuY2xvbmVOb2RlKHRydWUpOworaWYoIW5vZGUpeworcmV0dXJuIGZhbHNlOworfQorfWVsc2V7Citub2RlPXRoaXMuY3JlYXRlTm9kZXNGcm9tVGV4dCh0c3RyLHRydWUpWzBdOworfQorfQordGhpcy5kb21Ob2RlPW5vZGU7Cit0aGlzLmF0dGFjaFRlbXBsYXRlTm9kZXMoKTsKK2lmKHRoaXMuaXNDb250YWluZXImJnRoaXMuY29udGFpbmVyTm9kZSl7Cit2YXIgc3JjPXRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CitpZihzcmMpeworZG9qby5kb20ubW92ZUNoaWxkcmVuKHNyYyx0aGlzLmNvbnRhaW5lck5vZGUpOworfQorfQorfSxhdHRhY2hUZW1wbGF0ZU5vZGVzOmZ1bmN0aW9uKF83YTYsXzdhNyl7CitpZighXzdhNil7CitfN2E2PXRoaXMuZG9tTm9kZTsKK30KK2lmKCFfN2E3KXsKK183YTc9dGhpczsKK30KK3JldHVybiBkb2pvLndpZGdldC5hdHRhY2hUZW1wbGF0ZU5vZGVzKF83YTYsXzdhNyxkb2pvLndpZGdldC5nZXREb2pvRXZlbnRzRnJvbVN0cih0aGlzLnRlbXBsYXRlU3RyaW5nKSk7Cit9LGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKCl7Cit9LGRlc3Ryb3lSZW5kZXJpbmc6ZnVuY3Rpb24oKXsKK3RyeXsKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlKHRoaXMuZG9tTm9kZSk7CitkZWxldGUgdGhpcy5kb21Ob2RlOworfQorY2F0Y2goZSl7Cit9CitpZih0aGlzLl9zb3VyY2VOb2RlUmVmKXsKK3RyeXsKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlKHRoaXMuX3NvdXJjZU5vZGVSZWYpOworfQorY2F0Y2goZSl7Cit9Cit9Cit9LGNyZWF0ZU5vZGVzRnJvbVRleHQ6ZnVuY3Rpb24oKXsKK2Rvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuRG9tV2lkZ2V0LmNyZWF0ZU5vZGVzRnJvbVRleHQiKTsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLnV0aWwiKTsKK2Rvam8uaHRtbC5nZXRFbGVtZW50V2luZG93PWZ1bmN0aW9uKF83YTgpeworcmV0dXJuIGRvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyhfN2E4Lm93bmVyRG9jdW1lbnQpOworfTsKK2Rvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdz1mdW5jdGlvbihkb2MpeworaWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkmJiFkb2MuX3BhcmVudFdpbmRvdyl7Cit2YXIgZml4PWZ1bmN0aW9uKHdpbil7Cit3aW4uZG9jdW1lbnQuX3BhcmVudFdpbmRvdz13aW47Citmb3IodmFyIGk9MDtpPHdpbi5mcmFtZXMubGVuZ3RoO2krKyl7CitmaXgod2luLmZyYW1lc1tpXSk7Cit9Cit9OworZml4KHdpbmRvdy50b3ApOworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSYmd2luZG93IT09ZG9jdW1lbnQucGFyZW50V2luZG93JiYhZG9jLl9wYXJlbnRXaW5kb3cpeworZG9jLnBhcmVudFdpbmRvdy5leGVjU2NyaXB0KCJkb2N1bWVudC5fcGFyZW50V2luZG93ID0gd2luZG93OyIsIkphdmFzY3JpcHQiKTsKK3ZhciB3aW49ZG9jLl9wYXJlbnRXaW5kb3c7Citkb2MuX3BhcmVudFdpbmRvdz1udWxsOworcmV0dXJuIHdpbjsKK30KK3JldHVybiBkb2MuX3BhcmVudFdpbmRvd3x8ZG9jLnBhcmVudFdpbmRvd3x8ZG9jLmRlZmF1bHRWaWV3OworfTsKK2Rvam8uaHRtbC5ncmF2aXR5PWZ1bmN0aW9uKG5vZGUsZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBfN2IwPWRvam8uaHRtbC5nZXRDdXJzb3JQb3NpdGlvbihlKTsKK3dpdGgoZG9qby5odG1sKXsKK3ZhciBfN2IxPWdldEFic29sdXRlUG9zaXRpb24obm9kZSx0cnVlKTsKK3ZhciBiYj1nZXRCb3JkZXJCb3gobm9kZSk7Cit2YXIgXzdiMz1fN2IxLngrKGJiLndpZHRoLzIpOwordmFyIF83YjQ9XzdiMS55KyhiYi5oZWlnaHQvMik7Cit9Cit3aXRoKGRvam8uaHRtbC5ncmF2aXR5KXsKK3JldHVybiAoKF83YjAueDxfN2IzP1dFU1Q6RUFTVCl8KF83YjAueTxfN2I0P05PUlRIOlNPVVRIKSk7Cit9Cit9OworZG9qby5odG1sLmdyYXZpdHkuTk9SVEg9MTsKK2Rvam8uaHRtbC5ncmF2aXR5LlNPVVRIPTE8PDE7Citkb2pvLmh0bWwuZ3Jhdml0eS5FQVNUPTE8PDI7Citkb2pvLmh0bWwuZ3Jhdml0eS5XRVNUPTE8PDM7Citkb2pvLmh0bWwub3ZlckVsZW1lbnQ9ZnVuY3Rpb24oXzdiNSxlKXsKK183YjU9ZG9qby5ieUlkKF83YjUpOwordmFyIF83Yjc9ZG9qby5odG1sLmdldEN1cnNvclBvc2l0aW9uKGUpOwordmFyIGJiPWRvam8uaHRtbC5nZXRCb3JkZXJCb3goXzdiNSk7Cit2YXIgXzdiOT1kb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihfN2I1LHRydWUsZG9qby5odG1sLmJveFNpemluZy5CT1JERVJfQk9YKTsKK3ZhciB0b3A9XzdiOS55OwordmFyIF83YmI9dG9wK2JiLmhlaWdodDsKK3ZhciBsZWZ0PV83YjkueDsKK3ZhciBfN2JkPWxlZnQrYmIud2lkdGg7CityZXR1cm4gKF83YjcueD49bGVmdCYmXzdiNy54PD1fN2JkJiZfN2I3Lnk+PXRvcCYmXzdiNy55PD1fN2JiKTsKK307Citkb2pvLmh0bWwucmVuZGVyZWRUZXh0Q29udGVudD1mdW5jdGlvbihub2RlKXsKK25vZGU9ZG9qby5ieUlkKG5vZGUpOwordmFyIF83YmY9IiI7CitpZihub2RlPT1udWxsKXsKK3JldHVybiBfN2JmOworfQorZm9yKHZhciBpPTA7aTxub2RlLmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7Citzd2l0Y2gobm9kZS5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlKXsKK2Nhc2UgMToKK2Nhc2UgNToKK3ZhciBfN2MxPSJ1bmtub3duIjsKK3RyeXsKK183YzE9ZG9qby5odG1sLmdldFN0eWxlKG5vZGUuY2hpbGROb2Rlc1tpXSwiZGlzcGxheSIpOworfQorY2F0Y2goRSl7Cit9Citzd2l0Y2goXzdjMSl7CitjYXNlICJibG9jayI6CitjYXNlICJsaXN0LWl0ZW0iOgorY2FzZSAicnVuLWluIjoKK2Nhc2UgInRhYmxlIjoKK2Nhc2UgInRhYmxlLXJvdy1ncm91cCI6CitjYXNlICJ0YWJsZS1oZWFkZXItZ3JvdXAiOgorY2FzZSAidGFibGUtZm9vdGVyLWdyb3VwIjoKK2Nhc2UgInRhYmxlLXJvdyI6CitjYXNlICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOgorY2FzZSAidGFibGUtY29sdW1uIjoKK2Nhc2UgInRhYmxlLWNlbGwiOgorY2FzZSAidGFibGUtY2FwdGlvbiI6CitfN2JmKz0iXG4iOworXzdiZis9ZG9qby5odG1sLnJlbmRlcmVkVGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKK183YmYrPSJcbiI7CiticmVhazsKK2Nhc2UgIm5vbmUiOgorYnJlYWs7CitkZWZhdWx0OgoraWYobm9kZS5jaGlsZE5vZGVzW2ldLnRhZ05hbWUmJm5vZGUuY2hpbGROb2Rlc1tpXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJiciIpeworXzdiZis9IlxuIjsKK31lbHNleworXzdiZis9ZG9qby5odG1sLnJlbmRlcmVkVGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKK30KK2JyZWFrOworfQorYnJlYWs7CitjYXNlIDM6CitjYXNlIDI6CitjYXNlIDQ6Cit2YXIgdGV4dD1ub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVZhbHVlOwordmFyIF83YzM9InVua25vd24iOwordHJ5eworXzdjMz1kb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwidGV4dC10cmFuc2Zvcm0iKTsKK30KK2NhdGNoKEUpeworfQorc3dpdGNoKF83YzMpeworY2FzZSAiY2FwaXRhbGl6ZSI6Cit2YXIgXzdjND10ZXh0LnNwbGl0KCIgIik7Citmb3IodmFyIGk9MDtpPF83YzQubGVuZ3RoO2krKyl7CitfN2M0W2ldPV83YzRbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrXzdjNFtpXS5zdWJzdHJpbmcoMSk7Cit9Cit0ZXh0PV83YzQuam9pbigiICIpOworYnJlYWs7CitjYXNlICJ1cHBlcmNhc2UiOgordGV4dD10ZXh0LnRvVXBwZXJDYXNlKCk7CiticmVhazsKK2Nhc2UgImxvd2VyY2FzZSI6Cit0ZXh0PXRleHQudG9Mb3dlckNhc2UoKTsKK2JyZWFrOworZGVmYXVsdDoKK2JyZWFrOworfQorc3dpdGNoKF83YzMpeworY2FzZSAibm93cmFwIjoKK2JyZWFrOworY2FzZSAicHJlLXdyYXAiOgorYnJlYWs7CitjYXNlICJwcmUtbGluZSI6CiticmVhazsKK2Nhc2UgInByZSI6CiticmVhazsKK2RlZmF1bHQ6Cit0ZXh0PXRleHQucmVwbGFjZSgvXHMrLywiICIpOworaWYoL1xzJC8udGVzdChfN2JmKSl7Cit0ZXh0LnJlcGxhY2UoL15ccy8sIiIpOworfQorYnJlYWs7Cit9CitfN2JmKz10ZXh0OworYnJlYWs7CitkZWZhdWx0OgorYnJlYWs7Cit9Cit9CityZXR1cm4gXzdiZjsKK307Citkb2pvLmh0bWwuY3JlYXRlTm9kZXNGcm9tVGV4dD1mdW5jdGlvbih0eHQsdHJpbSl7CitpZih0cmltKXsKK3R4dD10eHQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpOworfQordmFyIHRuPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cit0bi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iOworZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodG4pOwordmFyIF83Yzg9Im5vbmUiOworaWYoKC9ePHRbZGhdW1xzXHJcbj5dL2kpLnRlc3QodHh0LnJlcGxhY2UoL15ccysvKSkpewordHh0PSI8dGFibGU+PHRib2R5Pjx0cj4iK3R4dCsiPC90cj48L3Rib2R5PjwvdGFibGU+IjsKK183Yzg9ImNlbGwiOworfWVsc2V7CitpZigoL148dHJbXHNcclxuPl0vaSkudGVzdCh0eHQucmVwbGFjZSgvXlxzKy8pKSl7Cit0eHQ9Ijx0YWJsZT48dGJvZHk+Iit0eHQrIjwvdGJvZHk+PC90YWJsZT4iOworXzdjOD0icm93IjsKK31lbHNleworaWYoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdClbXHNcclxuPl0vaSkudGVzdCh0eHQucmVwbGFjZSgvXlxzKy8pKSl7Cit0eHQ9Ijx0YWJsZT4iK3R4dCsiPC90YWJsZT4iOworXzdjOD0ic2VjdGlvbiI7Cit9Cit9Cit9Cit0bi5pbm5lckhUTUw9dHh0OworaWYodG5bIm5vcm1hbGl6ZSJdKXsKK3RuLm5vcm1hbGl6ZSgpOworfQordmFyIF83Yzk9bnVsbDsKK3N3aXRjaChfN2M4KXsKK2Nhc2UgImNlbGwiOgorXzdjOT10bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKVswXTsKK2JyZWFrOworY2FzZSAicm93IjoKK183Yzk9dG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF07CiticmVhazsKK2Nhc2UgInNlY3Rpb24iOgorXzdjOT10bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXTsKK2JyZWFrOworZGVmYXVsdDoKK183Yzk9dG47CiticmVhazsKK30KK3ZhciBfN2NhPVtdOworZm9yKHZhciB4PTA7eDxfN2M5LmNoaWxkTm9kZXMubGVuZ3RoO3grKyl7CitfN2NhLnB1c2goXzdjOS5jaGlsZE5vZGVzW3hdLmNsb25lTm9kZSh0cnVlKSk7Cit9Cit0bi5zdHlsZS5kaXNwbGF5PSJub25lIjsKK2Rvam8uaHRtbC5kZXN0cm95Tm9kZSh0bik7CityZXR1cm4gXzdjYTsKK307Citkb2pvLmh0bWwucGxhY2VPblNjcmVlbj1mdW5jdGlvbihub2RlLF83Y2QsXzdjZSxfN2NmLF83ZDAsXzdkMSxfN2QyKXsKK2lmKF83Y2QgaW5zdGFuY2VvZiBBcnJheXx8dHlwZW9mIF83Y2Q9PSJhcnJheSIpeworXzdkMj1fN2QxOworXzdkMT1fN2QwOworXzdkMD1fN2NmOworXzdjZj1fN2NlOworXzdjZT1fN2NkWzFdOworXzdjZD1fN2NkWzBdOworfQoraWYoXzdkMSBpbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIF83ZDE9PSJzdHJpbmciKXsKK183ZDE9XzdkMS5zcGxpdCgiLCIpOworfQoraWYoIWlzTmFOKF83Y2YpKXsKK183Y2Y9W051bWJlcihfN2NmKSxOdW1iZXIoXzdjZildOworfWVsc2V7CitpZighKF83Y2YgaW5zdGFuY2VvZiBBcnJheXx8dHlwZW9mIF83Y2Y9PSJhcnJheSIpKXsKK183Y2Y9WzAsMF07Cit9Cit9Cit2YXIgXzdkMz1kb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OwordmFyIHZpZXc9ZG9qby5odG1sLmdldFZpZXdwb3J0KCk7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3ZhciBfN2Q1PW5vZGUuc3R5bGUuZGlzcGxheTsKK25vZGUuc3R5bGUuZGlzcGxheT0iIjsKK3ZhciBiYj1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOwordmFyIHc9YmIud2lkdGg7Cit2YXIgaD1iYi5oZWlnaHQ7Citub2RlLnN0eWxlLmRpc3BsYXk9XzdkNTsKK2lmKCEoXzdkMSBpbnN0YW5jZW9mIEFycmF5fHx0eXBlb2YgXzdkMT09ImFycmF5IikpeworXzdkMT1bIlRMIl07Cit9Cit2YXIgXzdkOSxfN2RhLF83ZGI9SW5maW5pdHksXzdkYzsKK2Zvcih2YXIgXzdkZD0wO183ZGQ8XzdkMS5sZW5ndGg7KytfN2RkKXsKK3ZhciBfN2RlPV83ZDFbXzdkZF07Cit2YXIgXzdkZj10cnVlOwordmFyIHRyeVg9XzdjZC0oXzdkZS5jaGFyQXQoMSk9PSJMIj8wOncpK183Y2ZbMF0qKF83ZGUuY2hhckF0KDEpPT0iTCI/MTotMSk7Cit2YXIgdHJ5WT1fN2NlLShfN2RlLmNoYXJBdCgwKT09IlQiPzA6aCkrXzdjZlsxXSooXzdkZS5jaGFyQXQoMCk9PSJUIj8xOi0xKTsKK2lmKF83ZDApewordHJ5WC09XzdkMy54OwordHJ5WS09XzdkMy55OworfQoraWYodHJ5WDwwKXsKK3RyeVg9MDsKK183ZGY9ZmFsc2U7Cit9CitpZih0cnlZPDApewordHJ5WT0wOworXzdkZj1mYWxzZTsKK30KK3ZhciB4PXRyeVgrdzsKK2lmKHg+dmlldy53aWR0aCl7Cit4PXZpZXcud2lkdGgtdzsKK183ZGY9ZmFsc2U7Cit9ZWxzZXsKK3g9dHJ5WDsKK30KK3g9TWF0aC5tYXgoXzdjZlswXSx4KStfN2QzLng7Cit2YXIgeT10cnlZK2g7CitpZih5PnZpZXcuaGVpZ2h0KXsKK3k9dmlldy5oZWlnaHQtaDsKK183ZGY9ZmFsc2U7Cit9ZWxzZXsKK3k9dHJ5WTsKK30KK3k9TWF0aC5tYXgoXzdjZlsxXSx5KStfN2QzLnk7CitpZihfN2RmKXsKK183ZDk9eDsKK183ZGE9eTsKK183ZGI9MDsKK183ZGM9XzdkZTsKK2JyZWFrOworfWVsc2V7Cit2YXIgZGlzdD1NYXRoLnBvdyh4LXRyeVgtXzdkMy54LDIpK01hdGgucG93KHktdHJ5WS1fN2QzLnksMik7CitpZihfN2RiPmRpc3QpeworXzdkYj1kaXN0OworXzdkOT14OworXzdkYT15OworXzdkYz1fN2RlOworfQorfQorfQoraWYoIV83ZDIpeworbm9kZS5zdHlsZS5sZWZ0PV83ZDkrInB4IjsKK25vZGUuc3R5bGUudG9wPV83ZGErInB4IjsKK30KK3JldHVybiB7bGVmdDpfN2Q5LHRvcDpfN2RhLHg6XzdkOSx5Ol83ZGEsZGlzdDpfN2RiLGNvcm5lcjpfN2RjfTsKK307Citkb2pvLmh0bWwucGxhY2VPblNjcmVlblBvaW50PWZ1bmN0aW9uKG5vZGUsXzdlNixfN2U3LF83ZTgsXzdlOSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC5wbGFjZU9uU2NyZWVuUG9pbnQiLCJ1c2UgZG9qby5odG1sLnBsYWNlT25TY3JlZW4oKSBpbnN0ZWFkIiwiMC41Iik7CityZXR1cm4gZG9qby5odG1sLnBsYWNlT25TY3JlZW4obm9kZSxfN2U2LF83ZTcsXzdlOCxfN2U5LFsiVEwiLCJUUiIsIkJMIiwiQlIiXSk7Cit9OworZG9qby5odG1sLnBsYWNlT25TY3JlZW5Bcm91bmRFbGVtZW50PWZ1bmN0aW9uKG5vZGUsXzdlYixfN2VjLF83ZWQsXzdlZSxfN2VmKXsKK3ZhciBiZXN0LF83ZjE9SW5maW5pdHk7CitfN2ViPWRvam8uYnlJZChfN2ViKTsKK3ZhciBfN2YyPV83ZWIuc3R5bGUuZGlzcGxheTsKK183ZWIuc3R5bGUuZGlzcGxheT0iIjsKK3ZhciBtYj1kb2pvLmh0bWwuZ2V0RWxlbWVudEJveChfN2ViLF83ZWQpOwordmFyIF83ZjQ9bWIud2lkdGg7Cit2YXIgXzdmNT1tYi5oZWlnaHQ7Cit2YXIgXzdmNj1kb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihfN2ViLHRydWUsXzdlZCk7CitfN2ViLnN0eWxlLmRpc3BsYXk9XzdmMjsKK2Zvcih2YXIgXzdmNyBpbiBfN2VlKXsKK3ZhciBwb3MsXzdmOSxfN2ZhOwordmFyIF83ZmI9XzdlZVtfN2Y3XTsKK183Zjk9XzdmNi54KyhfN2Y3LmNoYXJBdCgxKT09IkwiPzA6XzdmNCk7CitfN2ZhPV83ZjYueSsoXzdmNy5jaGFyQXQoMCk9PSJUIj8wOl83ZjUpOworcG9zPWRvam8uaHRtbC5wbGFjZU9uU2NyZWVuKG5vZGUsXzdmOSxfN2ZhLF83ZWMsdHJ1ZSxfN2ZiLHRydWUpOworaWYocG9zLmRpc3Q9PTApeworYmVzdD1wb3M7CiticmVhazsKK31lbHNleworaWYoXzdmMT5wb3MuZGlzdCl7CitfN2YxPXBvcy5kaXN0OworYmVzdD1wb3M7Cit9Cit9Cit9CitpZighXzdlZil7Citub2RlLnN0eWxlLmxlZnQ9YmVzdC5sZWZ0KyJweCI7Citub2RlLnN0eWxlLnRvcD1iZXN0LnRvcCsicHgiOworfQorcmV0dXJuIGJlc3Q7Cit9OworZG9qby5odG1sLnNjcm9sbEludG9WaWV3PWZ1bmN0aW9uKG5vZGUpeworaWYoIW5vZGUpeworcmV0dXJuOworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CitpZihkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUucGFyZW50Tm9kZSkuaGVpZ2h0PD1ub2RlLnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KXsKK25vZGUuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpOworfQorfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLm1vemlsbGEpeworbm9kZS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7Cit9ZWxzZXsKK3ZhciBfN2ZkPW5vZGUucGFyZW50Tm9kZTsKK3ZhciBfN2ZlPV83ZmQuc2Nyb2xsVG9wK2Rvam8uaHRtbC5nZXRCb3JkZXJCb3goXzdmZCkuaGVpZ2h0OwordmFyIF83ZmY9bm9kZS5vZmZzZXRUb3ArZG9qby5odG1sLmdldE1hcmdpbkJveChub2RlKS5oZWlnaHQ7CitpZihfN2ZlPF83ZmYpeworXzdmZC5zY3JvbGxUb3ArPShfN2ZmLV83ZmUpOworfWVsc2V7CitpZihfN2ZkLnNjcm9sbFRvcD5ub2RlLm9mZnNldFRvcCl7CitfN2ZkLnNjcm9sbFRvcC09KF83ZmQuc2Nyb2xsVG9wLW5vZGUub2Zmc2V0VG9wKTsKK30KK30KK30KK30KK307Citkb2pvLnByb3ZpZGUoImRvam8ubGZ4LnRvZ2dsZSIpOworZG9qby5sZngudG9nZ2xlLnBsYWluPXtzaG93OmZ1bmN0aW9uKG5vZGUsXzgwMSxfODAyLF84MDMpeworZG9qby5odG1sLnNob3cobm9kZSk7CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihfODAzKSl7CitfODAzKCk7Cit9Cit9LGhpZGU6ZnVuY3Rpb24obm9kZSxfODA1LF84MDYsXzgwNyl7Citkb2pvLmh0bWwuaGlkZShub2RlKTsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKF84MDcpKXsKK184MDcoKTsKK30KK319OworZG9qby5sZngudG9nZ2xlLmZhZGU9e3Nob3c6ZnVuY3Rpb24obm9kZSxfODA5LF84MGEsXzgwYil7Citkb2pvLmxmeC5mYWRlU2hvdyhub2RlLF84MDksXzgwYSxfODBiKS5wbGF5KCk7Cit9LGhpZGU6ZnVuY3Rpb24obm9kZSxfODBkLF84MGUsXzgwZil7Citkb2pvLmxmeC5mYWRlSGlkZShub2RlLF84MGQsXzgwZSxfODBmKS5wbGF5KCk7Cit9fTsKK2Rvam8ubGZ4LnRvZ2dsZS53aXBlPXtzaG93OmZ1bmN0aW9uKG5vZGUsXzgxMSxfODEyLF84MTMpeworZG9qby5sZngud2lwZUluKG5vZGUsXzgxMSxfODEyLF84MTMpLnBsYXkoKTsKK30saGlkZTpmdW5jdGlvbihub2RlLF84MTUsXzgxNixfODE3KXsKK2Rvam8ubGZ4LndpcGVPdXQobm9kZSxfODE1LF84MTYsXzgxNykucGxheSgpOworfX07Citkb2pvLmxmeC50b2dnbGUuZXhwbG9kZT17c2hvdzpmdW5jdGlvbihub2RlLF84MTksXzgxYSxfODFiLF84MWMpeworZG9qby5sZnguZXhwbG9kZShfODFjfHx7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxub2RlLF84MTksXzgxYSxfODFiKS5wbGF5KCk7Cit9LGhpZGU6ZnVuY3Rpb24obm9kZSxfODFlLF84MWYsXzgyMCxfODIxKXsKK2Rvam8ubGZ4LmltcGxvZGUobm9kZSxfODIxfHx7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxfODFlLF84MWYsXzgyMCkucGxheSgpOworfX07Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuSHRtbFdpZGdldCIsZG9qby53aWRnZXQuRG9tV2lkZ2V0LHt0ZW1wbGF0ZUNzc1BhdGg6bnVsbCx0ZW1wbGF0ZVBhdGg6bnVsbCxsYW5nOiIiLHRvZ2dsZToicGxhaW4iLHRvZ2dsZUR1cmF0aW9uOjE1MCxpbml0aWFsaXplOmZ1bmN0aW9uKGFyZ3MsZnJhZyl7Cit9LHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK2lmKHRoaXMubGFuZz09PSIiKXsKK3RoaXMubGFuZz1udWxsOworfQordGhpcy50b2dnbGVPYmo9ZG9qby5sZngudG9nZ2xlW3RoaXMudG9nZ2xlLnRvTG93ZXJDYXNlKCldfHxkb2pvLmxmeC50b2dnbGUucGxhaW47Cit9LGNyZWF0ZU5vZGVzRnJvbVRleHQ6ZnVuY3Rpb24odHh0LHdyYXApeworcmV0dXJuIGRvam8uaHRtbC5jcmVhdGVOb2Rlc0Zyb21UZXh0KHR4dCx3cmFwKTsKK30sZGVzdHJveVJlbmRlcmluZzpmdW5jdGlvbihfODI4KXsKK3RyeXsKK2lmKHRoaXMuYmdJZnJhbWUpewordGhpcy5iZ0lmcmFtZS5yZW1vdmUoKTsKK2RlbGV0ZSB0aGlzLmJnSWZyYW1lOworfQoraWYoIV84MjgmJnRoaXMuZG9tTm9kZSl7Citkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4odGhpcy5kb21Ob2RlKTsKK30KK2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQuc3VwZXJjbGFzcy5kZXN0cm95UmVuZGVyaW5nLmNhbGwodGhpcyk7Cit9CitjYXRjaChlKXsKK30KK30saXNTaG93aW5nOmZ1bmN0aW9uKCl7CityZXR1cm4gZG9qby5odG1sLmlzU2hvd2luZyh0aGlzLmRvbU5vZGUpOworfSx0b2dnbGVTaG93aW5nOmZ1bmN0aW9uKCl7CitpZih0aGlzLmlzU2hvd2luZygpKXsKK3RoaXMuaGlkZSgpOworfWVsc2V7Cit0aGlzLnNob3coKTsKK30KK30sc2hvdzpmdW5jdGlvbigpeworaWYodGhpcy5pc1Nob3dpbmcoKSl7CityZXR1cm47Cit9Cit0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3M9dHJ1ZTsKK3RoaXMudG9nZ2xlT2JqLnNob3codGhpcy5kb21Ob2RlLHRoaXMudG9nZ2xlRHVyYXRpb24sbnVsbCxkb2pvLmxhbmcuaGl0Y2godGhpcyx0aGlzLm9uU2hvdyksdGhpcy5leHBsb2RlU3JjKTsKK30sb25TaG93OmZ1bmN0aW9uKCl7Cit0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3M9ZmFsc2U7Cit0aGlzLmNoZWNrU2l6ZSgpOworfSxoaWRlOmZ1bmN0aW9uKCl7CitpZighdGhpcy5pc1Nob3dpbmcoKSl7CityZXR1cm47Cit9Cit0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3M9dHJ1ZTsKK3RoaXMudG9nZ2xlT2JqLmhpZGUodGhpcy5kb21Ob2RlLHRoaXMudG9nZ2xlRHVyYXRpb24sbnVsbCxkb2pvLmxhbmcuaGl0Y2godGhpcyx0aGlzLm9uSGlkZSksdGhpcy5leHBsb2RlU3JjKTsKK30sb25IaWRlOmZ1bmN0aW9uKCl7Cit0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3M9ZmFsc2U7Cit9LF9pc1Jlc2l6ZWQ6ZnVuY3Rpb24odyxoKXsKK2lmKCF0aGlzLmlzU2hvd2luZygpKXsKK3JldHVybiBmYWxzZTsKK30KK3ZhciB3aD1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7Cit2YXIgXzgyYz13fHx3aC53aWR0aDsKK3ZhciBfODJkPWh8fHdoLmhlaWdodDsKK2lmKHRoaXMud2lkdGg9PV84MmMmJnRoaXMuaGVpZ2h0PT1fODJkKXsKK3JldHVybiBmYWxzZTsKK30KK3RoaXMud2lkdGg9XzgyYzsKK3RoaXMuaGVpZ2h0PV84MmQ7CityZXR1cm4gdHJ1ZTsKK30sY2hlY2tTaXplOmZ1bmN0aW9uKCl7CitpZighdGhpcy5faXNSZXNpemVkKCkpeworcmV0dXJuOworfQordGhpcy5vblJlc2l6ZWQoKTsKK30scmVzaXplVG86ZnVuY3Rpb24odyxoKXsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlLHt3aWR0aDp3LGhlaWdodDpofSk7CitpZih0aGlzLmlzU2hvd2luZygpKXsKK3RoaXMub25SZXNpemVkKCk7Cit9Cit9LHJlc2l6ZVNvb246ZnVuY3Rpb24oKXsKK2lmKHRoaXMuaXNTaG93aW5nKCkpeworZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcyx0aGlzLm9uUmVzaXplZCwwKTsKK30KK30sb25SZXNpemVkOmZ1bmN0aW9uKCl7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKF84MzApeworaWYoXzgzMC5jaGVja1NpemUpeworXzgzMC5jaGVja1NpemUoKTsKK30KK30pOworfX0pOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby54bWwuUGFyc2UiLCJkb2pvLndpZGdldC5XaWRnZXQiLCJkb2pvLndpZGdldC5QYXJzZSIsImRvam8ud2lkZ2V0Lk1hbmFnZXIiXSxicm93c2VyOlsiZG9qby53aWRnZXQuRG9tV2lkZ2V0IiwiZG9qby53aWRnZXQuSHRtbFdpZGdldCJdLGRhc2hib2FyZDpbImRvam8ud2lkZ2V0LkRvbVdpZGdldCIsImRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQiXSxzdmc6WyJkb2pvLndpZGdldC5TdmdXaWRnZXQiXSxyaGlubzpbImRvam8ud2lkZ2V0LlN3dFdpZGdldCJdfSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LioiKTsKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoe2NvbW1vbjpbImRvam8uaHRtbC5jb21tb24iLCJkb2pvLmh0bWwuc3R5bGUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuKiIpOworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuc2VsZWN0aW9uIik7Citkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZT17Tk9ORTowLFRFWFQ6MSxDT05UUk9MOjJ9OworZG9qby5odG1sLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7Cit2YXIgXzgzMT1kb2pvLmdsb2JhbCgpOwordmFyIF84MzI9ZG9qby5kb2MoKTsKK3RyeXsKK2lmKF84MzFbImdldFNlbGVjdGlvbiJdKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKXsKK184MzEuZ2V0U2VsZWN0aW9uKCkuY29sbGFwc2UoKTsKK31lbHNleworXzgzMS5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKK30KK31lbHNleworaWYoXzgzMi5zZWxlY3Rpb24peworaWYoXzgzMi5zZWxlY3Rpb24uZW1wdHkpeworXzgzMi5zZWxlY3Rpb24uZW1wdHkoKTsKK31lbHNleworaWYoXzgzMi5zZWxlY3Rpb24uY2xlYXIpeworXzgzMi5zZWxlY3Rpb24uY2xlYXIoKTsKK30KK30KK30KK30KK3JldHVybiB0cnVlOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworcmV0dXJuIGZhbHNlOworfQorfTsKK2Rvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uPWZ1bmN0aW9uKF84MzMpeworXzgzMz1kb2pvLmJ5SWQoXzgzMyl8fGRvam8uYm9keSgpOwordmFyIGg9ZG9qby5yZW5kZXIuaHRtbDsKK2lmKGgubW96aWxsYSl7CitfODMzLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiOworfWVsc2V7CitpZihoLnNhZmFyaSl7CitfODMzLnN0eWxlLktodG1sVXNlclNlbGVjdD0ibm9uZSI7Cit9ZWxzZXsKK2lmKGguaWUpeworXzgzMy51bnNlbGVjdGFibGU9Im9uIjsKK31lbHNleworcmV0dXJuIGZhbHNlOworfQorfQorfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLmVuYWJsZVNlbGVjdGlvbj1mdW5jdGlvbihfODM1KXsKK184MzU9ZG9qby5ieUlkKF84MzUpfHxkb2pvLmJvZHkoKTsKK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7CitpZihoLm1vemlsbGEpeworXzgzNS5zdHlsZS5Nb3pVc2VyU2VsZWN0PSIiOworfWVsc2V7CitpZihoLnNhZmFyaSl7CitfODM1LnN0eWxlLktodG1sVXNlclNlbGVjdD0iIjsKK31lbHNleworaWYoaC5pZSl7CitfODM1LnVuc2VsZWN0YWJsZT0ib2ZmIjsKK31lbHNleworcmV0dXJuIGZhbHNlOworfQorfQorfQorcmV0dXJuIHRydWU7Cit9OworZG9qby5odG1sLnNlbGVjdEVsZW1lbnQ9ZnVuY3Rpb24oXzgzNyl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC5zZWxlY3RFbGVtZW50IiwicmVwbGFjZWQgYnkgZG9qby5odG1sLnNlbGVjdGlvbi5zZWxlY3RFbGVtZW50Q2hpbGRyZW4iLDAuNSk7Cit9OworZG9qby5odG1sLnNlbGVjdElucHV0VGV4dD1mdW5jdGlvbihfODM4KXsKK3ZhciBfODM5PWRvam8uZ2xvYmFsKCk7Cit2YXIgXzgzYT1kb2pvLmRvYygpOworXzgzOD1kb2pvLmJ5SWQoXzgzOCk7CitpZihfODNhWyJzZWxlY3Rpb24iXSYmZG9qby5ib2R5KClbImNyZWF0ZVRleHRSYW5nZSJdKXsKK3ZhciBfODNiPV84MzguY3JlYXRlVGV4dFJhbmdlKCk7CitfODNiLm1vdmVTdGFydCgiY2hhcmFjdGVyIiwwKTsKK184M2IubW92ZUVuZCgiY2hhcmFjdGVyIixfODM4LnZhbHVlLmxlbmd0aCk7CitfODNiLnNlbGVjdCgpOworfWVsc2V7CitpZihfODM5WyJnZXRTZWxlY3Rpb24iXSl7Cit2YXIgXzgzYz1fODM5LmdldFNlbGVjdGlvbigpOworXzgzOC5zZXRTZWxlY3Rpb25SYW5nZSgwLF84MzgudmFsdWUubGVuZ3RoKTsKK30KK30KK184MzguZm9jdXMoKTsKK307Citkb2pvLmh0bWwuaXNTZWxlY3Rpb25Db2xsYXBzZWQ9ZnVuY3Rpb24oKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLmlzU2VsZWN0aW9uQ29sbGFwc2VkIiwicmVwbGFjZWQgYnkgZG9qby5odG1sLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCIsMC41KTsKK3JldHVybiBkb2pvLmh0bWwuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKCk7Cit9OworZG9qby5sYW5nLm1peGluKGRvam8uaHRtbC5zZWxlY3Rpb24se2dldFR5cGU6ZnVuY3Rpb24oKXsKK2lmKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKXsKK3JldHVybiBkb2pvLmh0bWwuc2VsZWN0aW9uVHlwZVtkb2pvLmRvYygpLnNlbGVjdGlvbi50eXBlLnRvVXBwZXJDYXNlKCldOworfWVsc2V7Cit2YXIgXzgzZD1kb2pvLmh0bWwuc2VsZWN0aW9uVHlwZS5URVhUOwordmFyIG9TZWw7Cit0cnl7CitvU2VsPWRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7Cit9CitjYXRjaChlKXsKK30KK2lmKG9TZWwmJm9TZWwucmFuZ2VDb3VudD09MSl7Cit2YXIgXzgzZj1vU2VsLmdldFJhbmdlQXQoMCk7CitpZihfODNmLnN0YXJ0Q29udGFpbmVyPT1fODNmLmVuZENvbnRhaW5lciYmKF84M2YuZW5kT2Zmc2V0LV84M2Yuc3RhcnRPZmZzZXQpPT0xJiZfODNmLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlIT1kb2pvLmRvbS5URVhUX05PREUpeworXzgzZD1kb2pvLmh0bWwuc2VsZWN0aW9uVHlwZS5DT05UUk9MOworfQorfQorcmV0dXJuIF84M2Q7Cit9Cit9LGlzQ29sbGFwc2VkOmZ1bmN0aW9uKCl7Cit2YXIgXzg0MD1kb2pvLmdsb2JhbCgpOwordmFyIF84NDE9ZG9qby5kb2MoKTsKK2lmKF84NDFbInNlbGVjdGlvbiJdKXsKK3JldHVybiBfODQxLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ9PSIiOworfWVsc2V7CitpZihfODQwWyJnZXRTZWxlY3Rpb24iXSl7Cit2YXIgXzg0Mj1fODQwLmdldFNlbGVjdGlvbigpOworaWYoZG9qby5sYW5nLmlzU3RyaW5nKF84NDIpKXsKK3JldHVybiBfODQyPT0iIjsKK31lbHNleworcmV0dXJuIF84NDIuaXNDb2xsYXBzZWR8fF84NDIudG9TdHJpbmcoKT09IiI7Cit9Cit9Cit9Cit9LGdldFNlbGVjdGVkRWxlbWVudDpmdW5jdGlvbigpeworaWYoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRUeXBlKCk9PWRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpeworaWYoZG9qby5kb2MoKVsic2VsZWN0aW9uIl0pewordmFyIF84NDM9ZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKK2lmKF84NDMmJl84NDMuaXRlbSl7CityZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKDApOworfQorfWVsc2V7Cit2YXIgXzg0ND1kb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworcmV0dXJuIF84NDQuYW5jaG9yTm9kZS5jaGlsZE5vZGVzW184NDQuYW5jaG9yT2Zmc2V0XTsKK30KK30KK30sZ2V0UGFyZW50RWxlbWVudDpmdW5jdGlvbigpeworaWYoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRUeXBlKCk9PWRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpewordmFyIHA9ZG9qby5odG1sLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKTsKK2lmKHApeworcmV0dXJuIHAucGFyZW50Tm9kZTsKK30KK31lbHNleworaWYoZG9qby5kb2MoKVsic2VsZWN0aW9uIl0peworcmV0dXJuIGRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkucGFyZW50RWxlbWVudCgpOworfWVsc2V7Cit2YXIgXzg0Nj1kb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworaWYoXzg0Nil7Cit2YXIgbm9kZT1fODQ2LmFuY2hvck5vZGU7Cit3aGlsZShub2RlJiZub2RlLm5vZGVUeXBlIT1kb2pvLmRvbS5FTEVNRU5UX05PREUpeworbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9CityZXR1cm4gbm9kZTsKK30KK30KK30KK30sZ2V0U2VsZWN0ZWRUZXh0OmZ1bmN0aW9uKCl7CitpZihkb2pvLmRvYygpWyJzZWxlY3Rpb24iXSl7CitpZihkb2pvLmh0bWwuc2VsZWN0aW9uLmdldFR5cGUoKT09ZG9qby5odG1sLnNlbGVjdGlvblR5cGUuQ09OVFJPTCl7CityZXR1cm4gbnVsbDsKK30KK3JldHVybiBkb2pvLmRvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7Cit9ZWxzZXsKK3ZhciBfODQ4PWRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CitpZihfODQ4KXsKK3JldHVybiBfODQ4LnRvU3RyaW5nKCk7Cit9Cit9Cit9LGdldFNlbGVjdGVkSHRtbDpmdW5jdGlvbigpeworaWYoZG9qby5kb2MoKVsic2VsZWN0aW9uIl0peworaWYoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRUeXBlKCk9PWRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpeworcmV0dXJuIG51bGw7Cit9CityZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5odG1sVGV4dDsKK31lbHNlewordmFyIF84NDk9ZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKK2lmKF84NDkmJl84NDkucmFuZ2VDb3VudCl7Cit2YXIgZnJhZz1fODQ5LmdldFJhbmdlQXQoMCkuY2xvbmVDb250ZW50cygpOwordmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK2Rpdi5hcHBlbmRDaGlsZChmcmFnKTsKK3JldHVybiBkaXYuaW5uZXJIVE1MOworfQorcmV0dXJuIG51bGw7Cit9Cit9LGhhc0FuY2VzdG9yRWxlbWVudDpmdW5jdGlvbihfODRjKXsKK3JldHVybiAoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRBbmNlc3RvckVsZW1lbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpIT1udWxsKTsKK30sZ2V0QW5jZXN0b3JFbGVtZW50OmZ1bmN0aW9uKF84NGQpewordmFyIG5vZGU9ZG9qby5odG1sLnNlbGVjdGlvbi5nZXRTZWxlY3RlZEVsZW1lbnQoKXx8ZG9qby5odG1sLnNlbGVjdGlvbi5nZXRQYXJlbnRFbGVtZW50KCk7Cit3aGlsZShub2RlKXsKK2lmKGRvam8uaHRtbC5zZWxlY3Rpb24uaXNUYWcobm9kZSxhcmd1bWVudHMpLmxlbmd0aD4wKXsKK3JldHVybiBub2RlOworfQorbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9CityZXR1cm4gbnVsbDsKK30saXNUYWc6ZnVuY3Rpb24obm9kZSx0YWdzKXsKK2lmKG5vZGUmJm5vZGUudGFnTmFtZSl7Citmb3IodmFyIGk9MDtpPHRhZ3MubGVuZ3RoO2krKyl7CitpZihub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09U3RyaW5nKHRhZ3NbaV0pLnRvTG93ZXJDYXNlKCkpeworcmV0dXJuIFN0cmluZyh0YWdzW2ldKS50b0xvd2VyQ2FzZSgpOworfQorfQorfQorcmV0dXJuICIiOworfSxzZWxlY3RFbGVtZW50OmZ1bmN0aW9uKF84NTIpewordmFyIF84NTM9ZG9qby5nbG9iYWwoKTsKK3ZhciBfODU0PWRvam8uZG9jKCk7CitfODUyPWRvam8uYnlJZChfODUyKTsKK2lmKF84NTQuc2VsZWN0aW9uJiZkb2pvLmJvZHkoKS5jcmVhdGVUZXh0UmFuZ2UpewordHJ5ewordmFyIF84NTU9ZG9qby5ib2R5KCkuY3JlYXRlQ29udHJvbFJhbmdlKCk7CitfODU1LmFkZEVsZW1lbnQoXzg1Mik7CitfODU1LnNlbGVjdCgpOworfQorY2F0Y2goZSl7Citkb2pvLmh0bWwuc2VsZWN0aW9uLnNlbGVjdEVsZW1lbnRDaGlsZHJlbihfODUyKTsKK30KK31lbHNleworaWYoXzg1M1siZ2V0U2VsZWN0aW9uIl0pewordmFyIF84NTY9Xzg1My5nZXRTZWxlY3Rpb24oKTsKK2lmKF84NTZbInJlbW92ZUFsbFJhbmdlcyJdKXsKK3ZhciBfODU1PV84NTQuY3JlYXRlUmFuZ2UoKTsKK184NTUuc2VsZWN0Tm9kZShfODUyKTsKK184NTYucmVtb3ZlQWxsUmFuZ2VzKCk7CitfODU2LmFkZFJhbmdlKF84NTUpOworfQorfQorfQorfSxzZWxlY3RFbGVtZW50Q2hpbGRyZW46ZnVuY3Rpb24oXzg1Nyl7Cit2YXIgXzg1OD1kb2pvLmdsb2JhbCgpOwordmFyIF84NTk9ZG9qby5kb2MoKTsKK184NTc9ZG9qby5ieUlkKF84NTcpOworaWYoXzg1OS5zZWxlY3Rpb24mJmRvam8uYm9keSgpLmNyZWF0ZVRleHRSYW5nZSl7Cit2YXIgXzg1YT1kb2pvLmJvZHkoKS5jcmVhdGVUZXh0UmFuZ2UoKTsKK184NWEubW92ZVRvRWxlbWVudFRleHQoXzg1Nyk7CitfODVhLnNlbGVjdCgpOworfWVsc2V7CitpZihfODU4WyJnZXRTZWxlY3Rpb24iXSl7Cit2YXIgXzg1Yj1fODU4LmdldFNlbGVjdGlvbigpOworaWYoXzg1Ylsic2V0QmFzZUFuZEV4dGVudCJdKXsKK184NWIuc2V0QmFzZUFuZEV4dGVudChfODU3LDAsXzg1NyxfODU3LmlubmVyVGV4dC5sZW5ndGgtMSk7Cit9ZWxzZXsKK2lmKF84NWJbInNlbGVjdEFsbENoaWxkcmVuIl0peworXzg1Yi5zZWxlY3RBbGxDaGlsZHJlbihfODU3KTsKK30KK30KK30KK30KK30sZ2V0Qm9va21hcms6ZnVuY3Rpb24oKXsKK3ZhciBfODVjOwordmFyIF84NWQ9ZG9qby5kb2MoKTsKK2lmKF84NWRbInNlbGVjdGlvbiJdKXsKK3ZhciBfODVlPV84NWQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CitfODVjPV84NWUuZ2V0Qm9va21hcmsoKTsKK31lbHNlewordmFyIF84NWY7Cit0cnl7CitfODVmPWRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7Cit9CitjYXRjaChlKXsKK30KK2lmKF84NWYpewordmFyIF84NWU9Xzg1Zi5nZXRSYW5nZUF0KDApOworXzg1Yz1fODVlLmNsb25lUmFuZ2UoKTsKK31lbHNleworZG9qby5kZWJ1ZygiTm8gaWRlYSBob3cgdG8gc3RvcmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZvciB0aGlzIGJyb3dzZXIhIik7Cit9Cit9CityZXR1cm4gXzg1YzsKK30sbW92ZVRvQm9va21hcms6ZnVuY3Rpb24oXzg2MCl7Cit2YXIgXzg2MT1kb2pvLmRvYygpOworaWYoXzg2MVsic2VsZWN0aW9uIl0pewordmFyIF84NjI9Xzg2MS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKK184NjIubW92ZVRvQm9va21hcmsoXzg2MCk7CitfODYyLnNlbGVjdCgpOworfWVsc2V7Cit2YXIgXzg2MzsKK3RyeXsKK184NjM9ZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKK30KK2NhdGNoKGUpeworfQoraWYoXzg2MyYmXzg2M1sicmVtb3ZlQWxsUmFuZ2VzIl0peworXzg2My5yZW1vdmVBbGxSYW5nZXMoKTsKK184NjMuYWRkUmFuZ2UoXzg2MCk7Cit9ZWxzZXsKK2Rvam8uZGVidWcoIk5vIGlkZWEgaG93IHRvIHJlc3RvcmUgc2VsZWN0aW9uIGZvciB0aGlzIGJyb3dzZXIhIik7Cit9Cit9Cit9LGNvbGxhcHNlOmZ1bmN0aW9uKF84NjQpeworaWYoZG9qby5nbG9iYWwoKVsiZ2V0U2VsZWN0aW9uIl0pewordmFyIF84NjU9ZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKK2lmKF84NjUucmVtb3ZlQWxsUmFuZ2VzKXsKK2lmKF84NjQpeworXzg2NS5jb2xsYXBzZVRvU3RhcnQoKTsKK31lbHNleworXzg2NS5jb2xsYXBzZVRvRW5kKCk7Cit9Cit9ZWxzZXsKK2Rvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCkuY29sbGFwc2UoXzg2NCk7Cit9Cit9ZWxzZXsKK2lmKGRvam8uZG9jKCkuc2VsZWN0aW9uKXsKK3ZhciBfODY2PWRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CitfODY2LmNvbGxhcHNlKF84NjQpOworXzg2Ni5zZWxlY3QoKTsKK30KK30KK30scmVtb3ZlOmZ1bmN0aW9uKCl7CitpZihkb2pvLmRvYygpLnNlbGVjdGlvbil7Cit2YXIgXzg2Nz1kb2pvLmRvYygpLnNlbGVjdGlvbjsKK2lmKF84NjcudHlwZS50b1VwcGVyQ2FzZSgpIT0iTk9ORSIpeworXzg2Ny5jbGVhcigpOworfQorcmV0dXJuIF84Njc7Cit9ZWxzZXsKK3ZhciBfODY3PWRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7Citmb3IodmFyIGk9MDtpPF84NjcucmFuZ2VDb3VudDtpKyspeworXzg2Ny5nZXRSYW5nZUF0KGkpLmRlbGV0ZUNvbnRlbnRzKCk7Cit9CityZXR1cm4gXzg2NzsKK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5EZWZlcnJlZCIpOworZG9qby5EZWZlcnJlZD1mdW5jdGlvbihfODY5KXsKK3RoaXMuY2hhaW49W107Cit0aGlzLmlkPXRoaXMuX25leHRJZCgpOwordGhpcy5maXJlZD0tMTsKK3RoaXMucGF1c2VkPTA7Cit0aGlzLnJlc3VsdHM9W251bGwsbnVsbF07Cit0aGlzLmNhbmNlbGxlcj1fODY5OwordGhpcy5zaWxlbnRseUNhbmNlbGxlZD1mYWxzZTsKK307Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uRGVmZXJyZWQse2dldEZ1bmN0aW9uRnJvbUFyZ3M6ZnVuY3Rpb24oKXsKK3ZhciBhPWFyZ3VtZW50czsKK2lmKChhWzBdKSYmKCFhWzFdKSl7CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihhWzBdKSl7CityZXR1cm4gYVswXTsKK31lbHNleworaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFbMF0pKXsKK3JldHVybiBkal9nbG9iYWxbYVswXV07Cit9Cit9Cit9ZWxzZXsKK2lmKChhWzBdKSYmKGFbMV0pKXsKK3JldHVybiBkb2pvLmxhbmcuaGl0Y2goYVswXSxhWzFdKTsKK30KK30KK3JldHVybiBudWxsOworfSxtYWtlQ2FsbGVkOmZ1bmN0aW9uKCl7Cit2YXIgXzg2Yj1uZXcgZG9qby5EZWZlcnJlZCgpOworXzg2Yi5jYWxsYmFjaygpOworcmV0dXJuIF84NmI7Cit9LHJlcHI6ZnVuY3Rpb24oKXsKK3ZhciBfODZjOworaWYodGhpcy5maXJlZD09LTEpeworXzg2Yz0idW5maXJlZCI7Cit9ZWxzZXsKK2lmKHRoaXMuZmlyZWQ9PTApeworXzg2Yz0ic3VjY2VzcyI7Cit9ZWxzZXsKK184NmM9ImVycm9yIjsKK30KK30KK3JldHVybiAiRGVmZXJyZWQoIit0aGlzLmlkKyIsICIrXzg2YysiKSI7Cit9LHRvU3RyaW5nOmRvam8ubGFuZy5mb3J3YXJkKCJyZXByIiksX25leHRJZDooZnVuY3Rpb24oKXsKK3ZhciBuPTE7CityZXR1cm4gZnVuY3Rpb24oKXsKK3JldHVybiBuKys7Cit9OworfSkoKSxjYW5jZWw6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuZmlyZWQ9PS0xKXsKK2lmKHRoaXMuY2FuY2VsbGVyKXsKK3RoaXMuY2FuY2VsbGVyKHRoaXMpOworfWVsc2V7Cit0aGlzLnNpbGVudGx5Q2FuY2VsbGVkPXRydWU7Cit9CitpZih0aGlzLmZpcmVkPT0tMSl7Cit0aGlzLmVycmJhY2sobmV3IEVycm9yKHRoaXMucmVwcigpKSk7Cit9Cit9ZWxzZXsKK2lmKCh0aGlzLmZpcmVkPT0wKSYmKHRoaXMucmVzdWx0c1swXSBpbnN0YW5jZW9mIGRvam8uRGVmZXJyZWQpKXsKK3RoaXMucmVzdWx0c1swXS5jYW5jZWwoKTsKK30KK30KK30sX3BhdXNlOmZ1bmN0aW9uKCl7Cit0aGlzLnBhdXNlZCsrOworfSxfdW5wYXVzZTpmdW5jdGlvbigpewordGhpcy5wYXVzZWQtLTsKK2lmKCh0aGlzLnBhdXNlZD09MCkmJih0aGlzLmZpcmVkPj0wKSl7Cit0aGlzLl9maXJlKCk7Cit9Cit9LF9jb250aW51ZTpmdW5jdGlvbihyZXMpewordGhpcy5fcmVzYmFjayhyZXMpOwordGhpcy5fdW5wYXVzZSgpOworfSxfcmVzYmFjazpmdW5jdGlvbihyZXMpewordGhpcy5maXJlZD0oKHJlcyBpbnN0YW5jZW9mIEVycm9yKT8xOjApOwordGhpcy5yZXN1bHRzW3RoaXMuZmlyZWRdPXJlczsKK3RoaXMuX2ZpcmUoKTsKK30sX2NoZWNrOmZ1bmN0aW9uKCl7CitpZih0aGlzLmZpcmVkIT0tMSl7CitpZighdGhpcy5zaWxlbnRseUNhbmNlbGxlZCl7Citkb2pvLnJhaXNlKCJhbHJlYWR5IGNhbGxlZCEiKTsKK30KK3RoaXMuc2lsZW50bHlDYW5jZWxsZWQ9ZmFsc2U7CityZXR1cm47Cit9Cit9LGNhbGxiYWNrOmZ1bmN0aW9uKHJlcyl7Cit0aGlzLl9jaGVjaygpOwordGhpcy5fcmVzYmFjayhyZXMpOworfSxlcnJiYWNrOmZ1bmN0aW9uKHJlcyl7Cit0aGlzLl9jaGVjaygpOworaWYoIShyZXMgaW5zdGFuY2VvZiBFcnJvcikpeworcmVzPW5ldyBFcnJvcihyZXMpOworfQordGhpcy5fcmVzYmFjayhyZXMpOworfSxhZGRCb3RoOmZ1bmN0aW9uKGNiLGNiZm4pewordmFyIF84NzQ9dGhpcy5nZXRGdW5jdGlvbkZyb21BcmdzKGNiLGNiZm4pOworaWYoYXJndW1lbnRzLmxlbmd0aD4yKXsKK184NzQ9ZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzKG51bGwsXzg3NCxhcmd1bWVudHMsMik7Cit9CityZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoXzg3NCxfODc0KTsKK30sYWRkQ2FsbGJhY2s6ZnVuY3Rpb24oY2IsY2Jmbil7Cit2YXIgXzg3Nz10aGlzLmdldEZ1bmN0aW9uRnJvbUFyZ3MoY2IsY2Jmbik7CitpZihhcmd1bWVudHMubGVuZ3RoPjIpeworXzg3Nz1kb2pvLmxhbmcuY3VycnlBcmd1bWVudHMobnVsbCxfODc3LGFyZ3VtZW50cywyKTsKK30KK3JldHVybiB0aGlzLmFkZENhbGxiYWNrcyhfODc3LG51bGwpOworfSxhZGRFcnJiYWNrOmZ1bmN0aW9uKGNiLGNiZm4pewordmFyIF84N2E9dGhpcy5nZXRGdW5jdGlvbkZyb21BcmdzKGNiLGNiZm4pOworaWYoYXJndW1lbnRzLmxlbmd0aD4yKXsKK184N2E9ZG9qby5sYW5nLmN1cnJ5QXJndW1lbnRzKG51bGwsXzg3YSxhcmd1bWVudHMsMik7Cit9CityZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MobnVsbCxfODdhKTsKK3JldHVybiB0aGlzLmFkZENhbGxiYWNrcyhudWxsLGNiZm4pOworfSxhZGRDYWxsYmFja3M6ZnVuY3Rpb24oY2IsZWIpewordGhpcy5jaGFpbi5wdXNoKFtjYixlYl0pOworaWYodGhpcy5maXJlZD49MCl7Cit0aGlzLl9maXJlKCk7Cit9CityZXR1cm4gdGhpczsKK30sX2ZpcmU6ZnVuY3Rpb24oKXsKK3ZhciBfODdkPXRoaXMuY2hhaW47Cit2YXIgXzg3ZT10aGlzLmZpcmVkOwordmFyIHJlcz10aGlzLnJlc3VsdHNbXzg3ZV07Cit2YXIgc2VsZj10aGlzOwordmFyIGNiPW51bGw7Cit3aGlsZShfODdkLmxlbmd0aD4wJiZ0aGlzLnBhdXNlZD09MCl7Cit2YXIgcGFpcj1fODdkLnNoaWZ0KCk7Cit2YXIgZj1wYWlyW184N2VdOworaWYoZj09bnVsbCl7Citjb250aW51ZTsKK30KK3RyeXsKK3Jlcz1mKHJlcyk7CitfODdlPSgocmVzIGluc3RhbmNlb2YgRXJyb3IpPzE6MCk7CitpZihyZXMgaW5zdGFuY2VvZiBkb2pvLkRlZmVycmVkKXsKK2NiPWZ1bmN0aW9uKHJlcyl7CitzZWxmLl9jb250aW51ZShyZXMpOworfTsKK3RoaXMuX3BhdXNlKCk7Cit9Cit9CitjYXRjaChlcnIpeworXzg3ZT0xOworcmVzPWVycjsKK30KK30KK3RoaXMuZmlyZWQ9Xzg3ZTsKK3RoaXMucmVzdWx0c1tfODdlXT1yZXM7CitpZigoY2IpJiYodGhpcy5wYXVzZWQpKXsKK3Jlcy5hZGRCb3RoKGNiKTsKK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUmljaFRleHQiKTsKK2lmKCFkakNvbmZpZ1sidXNlWERvbWFpbiJdfHxkakNvbmZpZ1siYWxsb3dYZFJpY2hUZXh0U2F2ZSJdKXsKK2lmKGRvam8uaG9zdGVudi5wb3N0X2xvYWRfKXsKKyhmdW5jdGlvbigpewordmFyIF84ODU9ZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworXzg4NS5pZD0iZG9qby53aWRnZXQuUmljaFRleHQuc2F2ZWRDb250ZW50IjsKK184ODUuc3R5bGU9ImRpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTEwMHB4O2xlZnQ6LTEwMHB4O2hlaWdodDozcHg7d2lkdGg6M3B4O292ZXJmbG93OmhpZGRlbjsiOworZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQoXzg4NSk7Cit9KSgpOworfWVsc2V7Cit0cnl7Citkb2pvLmRvYygpLndyaXRlKCI8dGV4dGFyZWEgaWQ9XCJkb2pvLndpZGdldC5SaWNoVGV4dC5zYXZlZENvbnRlbnRcIiAiKyJzdHlsZT1cImRpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTEwMHB4O2xlZnQ6LTEwMHB4O2hlaWdodDozcHg7d2lkdGg6M3B4O292ZXJmbG93OmhpZGRlbjtcIj48L3RleHRhcmVhPiIpOworfQorY2F0Y2goZSl7Cit9Cit9Cit9Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJpY2hUZXh0Iixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LGZ1bmN0aW9uKCl7Cit0aGlzLmNvbnRlbnRQcmVGaWx0ZXJzPVtdOwordGhpcy5jb250ZW50UG9zdEZpbHRlcnM9W107Cit0aGlzLmNvbnRlbnREb21QcmVGaWx0ZXJzPVtdOwordGhpcy5jb250ZW50RG9tUG9zdEZpbHRlcnM9W107Cit0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHM9W107CitpZihkb2pvLnJlbmRlci5odG1sLm1veil7Cit0aGlzLmNvbnRlbnRQcmVGaWx0ZXJzLnB1c2godGhpcy5fZml4Q29udGVudEZvck1veik7Cit9Cit0aGlzLl9rZXlIYW5kbGVycz17fTsKK2lmKGRvam8uRGVmZXJyZWQpewordGhpcy5vbkxvYWREZWZlcnJlZD1uZXcgZG9qby5EZWZlcnJlZCgpOworfQorfSx7aW5oZXJpdFdpZHRoOmZhbHNlLGZvY3VzT25Mb2FkOmZhbHNlLHNhdmVOYW1lOiIiLHN0eWxlU2hlZXRzOiIiLF9jb250ZW50OiIiLGhlaWdodDoiIixtaW5IZWlnaHQ6IjFlbSIsaXNDbG9zZWQ6dHJ1ZSxpc0xvYWRlZDpmYWxzZSx1c2VBY3RpdmVYOmZhbHNlLHJlbGF0aXZlSW1hZ2VVcmxzOmZhbHNlLF9TRVBBUkFUT1I6IkBAKiolJV9fUklDSFRFWFRCT1VORFJZX18lJSoqQEAiLG9uTG9hZERlZmVycmVkOm51bGwsZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24oKXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCgiZG9qby53aWRnZXQuUmljaFRleHQ6OmluaXQiLHRoaXMpOwordGhpcy5vcGVuKCk7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywib25LZXlQcmVzc2VkIix0aGlzLCJhZnRlcktleVByZXNzIik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywib25LZXlQcmVzcyIsdGhpcywia2V5UHJlc3MiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLCJvbktleURvd24iLHRoaXMsImtleURvd24iKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLCJvbktleVVwIix0aGlzLCJrZXlVcCIpOwordGhpcy5zZXR1cERlZmF1bHRTaG9ydGN1dHMoKTsKK30sc2V0dXBEZWZhdWx0U2hvcnRjdXRzOmZ1bmN0aW9uKCl7Cit2YXIgY3RybD10aGlzLktFWV9DVFJMOwordmFyIGV4ZWM9ZnVuY3Rpb24oY21kLGFyZyl7CityZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT9mdW5jdGlvbigpewordGhpcy5leGVjQ29tbWFuZChjbWQpOworfTpmdW5jdGlvbigpewordGhpcy5leGVjQ29tbWFuZChjbWQsYXJnKTsKK307Cit9OwordGhpcy5hZGRLZXlIYW5kbGVyKCJiIixjdHJsLGV4ZWMoImJvbGQiKSk7Cit0aGlzLmFkZEtleUhhbmRsZXIoImkiLGN0cmwsZXhlYygiaXRhbGljIikpOwordGhpcy5hZGRLZXlIYW5kbGVyKCJ1IixjdHJsLGV4ZWMoInVuZGVybGluZSIpKTsKK3RoaXMuYWRkS2V5SGFuZGxlcigiYSIsY3RybCxleGVjKCJzZWxlY3RhbGwiKSk7Cit0aGlzLmFkZEtleUhhbmRsZXIoInMiLGN0cmwsZnVuY3Rpb24oKXsKK3RoaXMuc2F2ZSh0cnVlKTsKK30pOwordGhpcy5hZGRLZXlIYW5kbGVyKCIxIixjdHJsLGV4ZWMoImZvcm1hdGJsb2NrIiwiaDEiKSk7Cit0aGlzLmFkZEtleUhhbmRsZXIoIjIiLGN0cmwsZXhlYygiZm9ybWF0YmxvY2siLCJoMiIpKTsKK3RoaXMuYWRkS2V5SGFuZGxlcigiMyIsY3RybCxleGVjKCJmb3JtYXRibG9jayIsImgzIikpOwordGhpcy5hZGRLZXlIYW5kbGVyKCI0IixjdHJsLGV4ZWMoImZvcm1hdGJsb2NrIiwiaDQiKSk7Cit0aGlzLmFkZEtleUhhbmRsZXIoIlxcIixjdHJsLGV4ZWMoImluc2VydHVub3JkZXJlZGxpc3QiKSk7CitpZighZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit0aGlzLmFkZEtleUhhbmRsZXIoIloiLGN0cmwsZXhlYygicmVkbyIpKTsKK30KK30sZXZlbnRzOlsib25CbHVyIiwib25Gb2N1cyIsIm9uS2V5UHJlc3MiLCJvbktleURvd24iLCJvbktleVVwIiwib25DbGljayJdLG9wZW46ZnVuY3Rpb24oXzg4YSl7CitpZih0aGlzLm9uTG9hZERlZmVycmVkLmZpcmVkPj0wKXsKK3RoaXMub25Mb2FkRGVmZXJyZWQ9bmV3IGRvam8uRGVmZXJyZWQoKTsKK30KK3ZhciBoPWRvam8ucmVuZGVyLmh0bWw7CitpZighdGhpcy5pc0Nsb3NlZCl7Cit0aGlzLmNsb3NlKCk7Cit9Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LlJpY2hUZXh0OjpvcGVuIix0aGlzKTsKK3RoaXMuX2NvbnRlbnQ9IiI7CitpZigoYXJndW1lbnRzLmxlbmd0aD09MSkmJihfODhhWyJub2RlTmFtZSJdKSl7Cit0aGlzLmRvbU5vZGU9Xzg4YTsKK30KK2lmKCh0aGlzLmRvbU5vZGVbIm5vZGVOYW1lIl0pJiYodGhpcy5kb21Ob2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PSJ0ZXh0YXJlYSIpKXsKK3RoaXMudGV4dGFyZWE9dGhpcy5kb21Ob2RlOwordmFyIGh0bWw9dGhpcy5fcHJlRmlsdGVyQ29udGVudCh0aGlzLnRleHRhcmVhLnZhbHVlKTsKK3RoaXMuZG9tTm9kZT1kb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoImRpdiIpOworZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsdGhpcy50ZXh0YXJlYSk7Cit2YXIgXzg4ZD1kb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpeword2l0aCh0aGlzLnRleHRhcmVhLnN0eWxlKXsKK2Rpc3BsYXk9ImJsb2NrIjsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7CitsZWZ0PXRvcD0iLTEwMDBweCI7CitpZihoLmllKXsKK3RoaXMuX19vdmVyZmxvdz1vdmVyZmxvdzsKK292ZXJmbG93PSJoaWRkZW4iOworfQorfQorfSk7CitpZihoLmllKXsKK3NldFRpbWVvdXQoXzg4ZCwxMCk7Cit9ZWxzZXsKK184OGQoKTsKK30KK2lmKCFoLnNhZmFyaSl7Citkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tTm9kZSx0aGlzLnRleHRhcmVhKTsKK30KK2lmKHRoaXMudGV4dGFyZWEuZm9ybSl7Citkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZSIsdGhpcy50ZXh0YXJlYS5mb3JtLCJvbnN1Ym1pdCIsZG9qby5sYW5nLmhpdGNoKHRoaXMsZnVuY3Rpb24oKXsKK3RoaXMudGV4dGFyZWEudmFsdWU9dGhpcy5nZXRFZGl0b3JDb250ZW50KCk7Cit9KSk7Cit9Cit2YXIgXzg4ZT10aGlzOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMsInBvc3RDcmVhdGUiLGZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuaW5zZXJ0QWZ0ZXIoXzg4ZS50ZXh0YXJlYSxfODhlLmRvbU5vZGUpOworfSk7Cit9ZWxzZXsKK3ZhciBodG1sPXRoaXMuX3ByZUZpbHRlckNvbnRlbnQoZG9qby5zdHJpbmcudHJpbSh0aGlzLmRvbU5vZGUuaW5uZXJIVE1MKSk7Cit9CitpZihodG1sPT0iIil7CitodG1sPSImbmJzcDsiOworfQordmFyIF84OGY9ZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5kb21Ob2RlKTsKK3RoaXMuX29sZEhlaWdodD1fODhmLmhlaWdodDsKK3RoaXMuX29sZFdpZHRoPV84OGYud2lkdGg7Cit0aGlzLl9maXJzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luPXRoaXMuX2dldENvbnRyaWJ1dGluZ01hcmdpbih0aGlzLmRvbU5vZGUsInRvcCIpOwordGhpcy5fbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luPXRoaXMuX2dldENvbnRyaWJ1dGluZ01hcmdpbih0aGlzLmRvbU5vZGUsImJvdHRvbSIpOwordGhpcy5zYXZlZENvbnRlbnQ9aHRtbDsKK3RoaXMuZG9tTm9kZS5pbm5lckhUTUw9IiI7Cit0aGlzLmVkaXRpbmdBcmVhPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cit0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5lZGl0aW5nQXJlYSk7CitpZigodGhpcy5kb21Ob2RlWyJub2RlTmFtZSJdKSYmKHRoaXMuZG9tTm9kZS5ub2RlTmFtZT09IkxJIikpewordGhpcy5kb21Ob2RlLmlubmVySFRNTD0iIDxicj4iOworfQoraWYodGhpcy5zYXZlTmFtZSE9IiImJighZGpDb25maWdbInVzZVhEb21haW4iXXx8ZGpDb25maWdbImFsbG93WGRSaWNoVGV4dFNhdmUiXSkpewordmFyIF84OTA9ZG9qby5kb2MoKS5nZXRFbGVtZW50QnlJZCgiZG9qby53aWRnZXQuUmljaFRleHQuc2F2ZWRDb250ZW50Iik7CitpZihfODkwLnZhbHVlIT0iIil7Cit2YXIgXzg5MT1fODkwLnZhbHVlLnNwbGl0KHRoaXMuX1NFUEFSQVRPUik7Citmb3IodmFyIGk9MDtpPF84OTEubGVuZ3RoO2krKyl7Cit2YXIgZGF0YT1fODkxW2ldLnNwbGl0KCI6Iik7CitpZihkYXRhWzBdPT10aGlzLnNhdmVOYW1lKXsKK2h0bWw9ZGF0YVsxXTsKK184OTEuc3BsaWNlKGksMSk7CiticmVhazsKK30KK30KK30KK2Rvam8uZXZlbnQuY29ubmVjdCgiYmVmb3JlIix3aW5kb3csIm9udW5sb2FkIix0aGlzLCJfc2F2ZUNvbnRlbnQiKTsKK30KK2lmKGguaWU3MCYmdGhpcy51c2VBY3RpdmVYKXsKK2Rvam8uZGVidWcoImFjdGl2ZVggaW4gaWU3MCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgdXNlQWN0aXZlWCBpcyBpZ25vcmVkIGZvciBub3cuIik7Cit0aGlzLnVzZUFjdGl2ZVg9ZmFsc2U7Cit9CitpZih0aGlzLnVzZUFjdGl2ZVgmJmguaWUpewordmFyIHNlbGY9dGhpczsKK3NldFRpbWVvdXQoZnVuY3Rpb24oKXsKK3NlbGYuX2RyYXdPYmplY3QoaHRtbCk7Cit9LDApOworfWVsc2V7CitpZihoLmllfHx0aGlzLl9zYWZhcmlJc0xlb3BhcmQoKXx8aC5vcGVyYSl7Cit0aGlzLmlmcmFtZT1kb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwordGhpcy5pZnJhbWUuc3JjPSJqYXZhc2NyaXB0OnZvaWQoMCkiOwordGhpcy5lZGl0b3JPYmplY3Q9dGhpcy5pZnJhbWU7Cit3aXRoKHRoaXMuaWZyYW1lLnN0eWxlKXsKK2JvcmRlcj0iMCI7Cit3aWR0aD0iMTAwJSI7Cit9Cit0aGlzLmlmcmFtZS5mcmFtZUJvcmRlcj0wOwordGhpcy5lZGl0aW5nQXJlYS5hcHBlbmRDaGlsZCh0aGlzLmlmcmFtZSk7Cit0aGlzLndpbmRvdz10aGlzLmlmcmFtZS5jb250ZW50V2luZG93OwordGhpcy5kb2N1bWVudD10aGlzLndpbmRvdy5kb2N1bWVudDsKK3RoaXMuZG9jdW1lbnQub3BlbigpOwordGhpcy5kb2N1bWVudC53cml0ZSgiPGh0bWw+PGhlYWQ+PHN0eWxlPmJvZHl7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO292ZXJmbG93OmhpZGRlbjt9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdj48L2Rpdj48L2JvZHk+PC9odG1sPiIpOwordGhpcy5kb2N1bWVudC5jbG9zZSgpOwordGhpcy5lZGl0Tm9kZT10aGlzLmRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZDsKK3RoaXMuZWRpdE5vZGUuY29udGVudEVkaXRhYmxlPXRydWU7Cit3aXRoKHRoaXMuaWZyYW1lLnN0eWxlKXsKK2lmKGguaWU3MCl7CitpZih0aGlzLmhlaWdodCl7CitoZWlnaHQ9dGhpcy5oZWlnaHQ7Cit9CitpZih0aGlzLm1pbkhlaWdodCl7CittaW5IZWlnaHQ9dGhpcy5taW5IZWlnaHQ7Cit9Cit9ZWxzZXsKK2hlaWdodD10aGlzLmhlaWdodD90aGlzLmhlaWdodDp0aGlzLm1pbkhlaWdodDsKK30KK30KK3ZhciBfODk1PVsicCIsInByZSIsImFkZHJlc3MiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJvbCIsImRpdiIsInVsIl07Cit2YXIgXzg5Nj0iIjsKK2Zvcih2YXIgaSBpbiBfODk1KXsKK2lmKF84OTVbaV0uY2hhckF0KDEpIT0ibCIpeworXzg5Nis9IjwiK184OTVbaV0rIj48c3Bhbj5jb250ZW50PC9zcGFuPjwvIitfODk1W2ldKyI+IjsKK31lbHNleworXzg5Nis9IjwiK184OTVbaV0rIj48bGk+Y29udGVudDwvbGk+PC8iK184OTVbaV0rIj4iOworfQorfQord2l0aCh0aGlzLmVkaXROb2RlLnN0eWxlKXsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7CitsZWZ0PSItMjAwMHB4IjsKK3RvcD0iLTIwMDBweCI7Cit9Cit0aGlzLmVkaXROb2RlLmlubmVySFRNTD1fODk2OwordmFyIG5vZGU9dGhpcy5lZGl0Tm9kZS5maXJzdENoaWxkOword2hpbGUobm9kZSl7Citkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csInNlbGVjdEVsZW1lbnQiLGRvam8uaHRtbC5zZWxlY3Rpb24sW25vZGUuZmlyc3RDaGlsZF0pOwordmFyIF84OTg9bm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Cit0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tfODk4XT10aGlzLnF1ZXJ5Q29tbWFuZFZhbHVlKCJmb3JtYXRibG9jayIpOwordGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbdGhpcy5fbG9jYWwyTmF0aXZlRm9ybWF0TmFtZXNbXzg5OF1dPV84OTg7Citub2RlPW5vZGUubmV4dFNpYmxpbmc7Cit9Cit3aXRoKHRoaXMuZWRpdE5vZGUuc3R5bGUpeworcG9zaXRpb249IiI7CitsZWZ0PSIiOwordG9wPSIiOworfQordGhpcy5lZGl0Tm9kZS5pbm5lckhUTUw9aHRtbDsKK2lmKHRoaXMuaGVpZ2h0KXsKK3RoaXMuZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1k9InNjcm9sbCI7Cit9Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmV2ZW50cyxmdW5jdGlvbihlKXsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLmVkaXROb2RlLGUudG9Mb3dlckNhc2UoKSx0aGlzLGUpOworfSx0aGlzKTsKK3RoaXMub25Mb2FkKCk7Cit9ZWxzZXsKK3RoaXMuX2RyYXdJZnJhbWUoaHRtbCk7Cit0aGlzLmVkaXRvck9iamVjdD10aGlzLmlmcmFtZTsKK30KK30KK2lmKHRoaXMuZG9tTm9kZS5ub2RlTmFtZT09IkxJIil7Cit0aGlzLmRvbU5vZGUubGFzdENoaWxkLnN0eWxlLm1hcmdpblRvcD0iLTEuMmVtIjsKK30KK2Rvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmRvbU5vZGUsIlJpY2hUZXh0RWRpdGFibGUiKTsKK3RoaXMuaXNDbG9zZWQ9ZmFsc2U7Cit9LF9oYXNDb2xsYXBzZWFibGVNYXJnaW46ZnVuY3Rpb24oXzg5YSxzaWRlKXsKK2lmKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKF84OWEsImJvcmRlci0iK3NpZGUrIi13aWR0aCIsZmFsc2UpKXsKK3JldHVybiBmYWxzZTsKK31lbHNleworaWYoZG9qby5odG1sLmdldFBpeGVsVmFsdWUoXzg5YSwicGFkZGluZy0iK3NpZGUsZmFsc2UpKXsKK3JldHVybiBmYWxzZTsKK31lbHNleworcmV0dXJuIHRydWU7Cit9Cit9Cit9LF9nZXRDb250cmlidXRpbmdNYXJnaW46ZnVuY3Rpb24oXzg5YyxfODlkKXsKK2lmKF84OWQ9PSJ0b3AiKXsKK3ZhciBfODllPSJwcmV2aW91c1NpYmxpbmciOwordmFyIF84OWY9Im5leHRTaWJsaW5nIjsKK3ZhciBfOGEwPSJmaXJzdENoaWxkIjsKK3ZhciBfOGExPSJtYXJnaW4tdG9wIjsKK3ZhciBfOGEyPSJtYXJnaW4tYm90dG9tIjsKK31lbHNlewordmFyIF84OWU9Im5leHRTaWJsaW5nIjsKK3ZhciBfODlmPSJwcmV2aW91c1NpYmxpbmciOwordmFyIF84YTA9Imxhc3RDaGlsZCI7Cit2YXIgXzhhMT0ibWFyZ2luLWJvdHRvbSI7Cit2YXIgXzhhMj0ibWFyZ2luLXRvcCI7Cit9Cit2YXIgXzhhMz1kb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShfODljLF84YTEsZmFsc2UpOworZnVuY3Rpb24gaXNTaWduaWZpY2FudE5vZGUoXzhhNCl7CityZXR1cm4gIShfOGE0Lm5vZGVUeXBlPT0zJiZkb2pvLnN0cmluZy5pc0JsYW5rKF84YTQuZGF0YSkpJiZkb2pvLmh0bWwuZ2V0U3R5bGUoXzhhNCwiZGlzcGxheSIpIT0ibm9uZSImJiFkb2pvLmh0bWwuaXNQb3NpdGlvbkFic29sdXRlKF84YTQpOworfQordmFyIF84YTU9MDsKK3ZhciBfOGE2PV84OWNbXzhhMF07Cit3aGlsZShfOGE2KXsKK3doaWxlKCghaXNTaWduaWZpY2FudE5vZGUoXzhhNikpJiZfOGE2W184OWZdKXsKK184YTY9XzhhNltfODlmXTsKK30KK184YTU9TWF0aC5tYXgoXzhhNSxkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShfOGE2LF84YTEsZmFsc2UpKTsKK2lmKCF0aGlzLl9oYXNDb2xsYXBzZWFibGVNYXJnaW4oXzhhNixfODlkKSl7CiticmVhazsKK30KK184YTY9XzhhNltfOGEwXTsKK30KK2lmKCF0aGlzLl9oYXNDb2xsYXBzZWFibGVNYXJnaW4oXzg5YyxfODlkKSl7CityZXR1cm4gcGFyc2VJbnQoXzhhNSk7Cit9Cit2YXIgXzhhNz0wOwordmFyIF84YTg9Xzg5Y1tfODllXTsKK3doaWxlKF84YTgpeworaWYoaXNTaWduaWZpY2FudE5vZGUoXzhhOCkpeworXzhhNz1kb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShfOGE4LF84YTIsZmFsc2UpOworYnJlYWs7Cit9CitfOGE4PV84YThbXzg5ZV07Cit9CitpZighXzhhOCl7CitfOGE3PWRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKF84OWMucGFyZW50Tm9kZSxfOGExLGZhbHNlKTsKK30KK2lmKF84YTU+XzhhMyl7CityZXR1cm4gcGFyc2VJbnQoTWF0aC5tYXgoKF84YTUtXzhhMyktXzhhNywwKSk7Cit9ZWxzZXsKK3JldHVybiAwOworfQorfSxfZHJhd0lmcmFtZTpmdW5jdGlvbihodG1sKXsKK3ZhciBfOGFhPUJvb2xlYW4oZG9qby5yZW5kZXIuaHRtbC5tb3omJih0eXBlb2Ygd2luZG93LlhNTD09InVuZGVmaW5lZCIpKTsKK2lmKCF0aGlzLmlmcmFtZSl7Cit2YXIgXzhhYj0obmV3IGRvam8udXJpLlVyaShkb2pvLmRvYygpLmxvY2F0aW9uKSkuaG9zdDsKK3RoaXMuaWZyYW1lPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Cit3aXRoKHRoaXMuaWZyYW1lKXsKK3N0eWxlLmJvcmRlcj0ibm9uZSI7CitzdHlsZS5saW5lSGVpZ2h0PSIwIjsKK3N0eWxlLnZlcnRpY2FsQWxpZ249ImJvdHRvbSI7CitzY3JvbGxpbmc9dGhpcy5oZWlnaHQ/ImF1dG8iOiJubyI7Cit9Cit9CitpZihkakNvbmZpZ1sidXNlWERvbWFpbiJdJiYhZGpDb25maWdbImRvam9SaWNoVGV4dEZyYW1lVXJsIl0peworZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuUmljaFRleHQ6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIrIiBwbGVhc2Ugc2F2ZSBzcmMvd2lkZ2V0L3RlbXBsYXRlcy9yaWNodGV4dGZyYW1lLmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvUmljaFRleHRGcmFtZVVybCIrIiB0byB0aGUgcGF0aCBvbiB5b3VyIGRvbWFpbiB0byByaWNodGV4dGZyYW1lLmh0bWwiKTsKK30KK3RoaXMuaWZyYW1lLnNyYz0oZGpDb25maWdbImRvam9SaWNoVGV4dEZyYW1lVXJsIl18fGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvcmljaHRleHRmcmFtZS5odG1sIikpKygoZG9qby5kb2MoKS5kb21haW4hPV84YWIpPygiIyIrZG9qby5kb2MoKS5kb21haW4pOiIiKTsKK3RoaXMuaWZyYW1lLndpZHRoPXRoaXMuaW5oZXJpdFdpZHRoP3RoaXMuX29sZFdpZHRoOiIxMDAlIjsKK2lmKHRoaXMuaGVpZ2h0KXsKK3RoaXMuaWZyYW1lLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodDsKK31lbHNlewordmFyIF84YWM9dGhpcy5fb2xkSGVpZ2h0OworaWYodGhpcy5faGFzQ29sbGFwc2VhYmxlTWFyZ2luKHRoaXMuZG9tTm9kZSwidG9wIikpeworXzhhYys9dGhpcy5fZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbjsKK30KK2lmKHRoaXMuX2hhc0NvbGxhcHNlYWJsZU1hcmdpbih0aGlzLmRvbU5vZGUsImJvdHRvbSIpKXsKK184YWMrPXRoaXMuX2xhc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbjsKK30KK3RoaXMuaWZyYW1lLmhlaWdodD1fOGFjOworfQordmFyIF84YWQ9ZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK184YWQuaW5uZXJIVE1MPWh0bWw7Cit0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKF84YWQpOworaWYodGhpcy5yZWxhdGl2ZUltYWdlVXJscyl7Cit2YXIgaW1ncz1fOGFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKTsKK2Zvcih2YXIgaT0wO2k8aW1ncy5sZW5ndGg7aSsrKXsKK2ltZ3NbaV0uc3JjPShuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24saW1nc1tpXS5zcmMpKS50b1N0cmluZygpOworfQoraHRtbD1fOGFkLmlubmVySFRNTDsKK30KK3ZhciBfOGIwPWRvam8uaHRtbC5maXJzdEVsZW1lbnQoXzhhZCk7Cit2YXIgXzhiMT1kb2pvLmh0bWwubGFzdEVsZW1lbnQoXzhhZCk7CitpZihfOGIwKXsKK184YjAuc3R5bGUubWFyZ2luVG9wPXRoaXMuX2ZpcnN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4rInB4IjsKK30KK2lmKF84YjEpeworXzhiMS5zdHlsZS5tYXJnaW5Cb3R0b209dGhpcy5fbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luKyJweCI7Cit9Cit0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKXsKK3RoaXMuaWZyYW1lLnNyYz10aGlzLmlmcmFtZS5zcmM7Cit9Cit2YXIgXzhiMj1mYWxzZTsKK3ZhciBfOGIzPWRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKCl7CitpZighXzhiMil7CitfOGIyPXRydWU7Cit9ZWxzZXsKK3JldHVybjsKK30KK2lmKCF0aGlzLmVkaXROb2RlKXsKK2lmKHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpewordGhpcy53aW5kb3c9dGhpcy5pZnJhbWUuY29udGVudFdpbmRvdzsKK3RoaXMuZG9jdW1lbnQ9dGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKK31lbHNleworaWYodGhpcy5pZnJhbWUuY29udGVudERvY3VtZW50KXsKK3RoaXMud2luZG93PXRoaXMuaWZyYW1lLmNvbnRlbnREb2N1bWVudC53aW5kb3c7Cit0aGlzLmRvY3VtZW50PXRoaXMuaWZyYW1lLmNvbnRlbnREb2N1bWVudDsKK30KK30KK3ZhciBfOGI0PShmdW5jdGlvbihfOGI1KXsKK3JldHVybiBmdW5jdGlvbihfOGI2KXsKK3JldHVybiBkb2pvLmh0bWwuZ2V0U3R5bGUoXzhiNSxfOGI2KTsKK307Cit9KSh0aGlzLmRvbU5vZGUpOwordmFyIGZvbnQ9XzhiNCgiZm9udC13ZWlnaHQiKSsiICIrXzhiNCgiZm9udC1zaXplIikrIiAiK184YjQoImZvbnQtZmFtaWx5Iik7Cit2YXIgXzhiOD0iMS4wIjsKK3ZhciBfOGI5PWRvam8uaHRtbC5nZXRVbml0VmFsdWUodGhpcy5kb21Ob2RlLCJsaW5lLWhlaWdodCIpOworaWYoXzhiOS52YWx1ZSYmXzhiOS51bml0cz09IiIpeworXzhiOD1fOGI5LnZhbHVlOworfQorZG9qby5odG1sLmluc2VydENzc1RleHQoImJvZHksaHRtbHtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O3BhZGRpbmc6MDttYXJnaW46MDt9IisiYm9keXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDsiKygoKHRoaXMuaGVpZ2h0KXx8KGRvam8ucmVuZGVyLmh0bWwub3BlcmEpKT8iIjoicG9zaXRpb246Zml4ZWQ7IikrImZvbnQ6Iitmb250KyI7IisibWluLWhlaWdodDoiK3RoaXMubWluSGVpZ2h0KyI7IisibGluZS1oZWlnaHQ6IitfOGI4KyJ9IisicHttYXJnaW46IDFlbSAwICFpbXBvcnRhbnQ7fSIrImJvZHkgPiAqOmZpcnN0LWNoaWxke3BhZGRpbmctdG9wOjAgIWltcG9ydGFudDttYXJnaW4tdG9wOiIrdGhpcy5fZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbisicHggIWltcG9ydGFudDt9IisiYm9keSA+ICo6bGFzdC1jaGlsZHtwYWRkaW5nLWJvdHRvbTowICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToiK3RoaXMuX2xhc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbisicHggIWltcG9ydGFudDt9IisibGkgPiB1bDotbW96LWZpcnN0LW5vZGUsIGxpID4gb2w6LW1vei1maXJzdC1ub2Rle3BhZGRpbmctdG9wOjEuMmVtO31cbiIrImxpe21pbi1oZWlnaHQ6MS4yZW07fSIrIiIsdGhpcy5kb2N1bWVudCk7Citkb2pvLmh0bWwucmVtb3ZlTm9kZShfOGFkKTsKK3RoaXMuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9aHRtbDsKK2lmKF84YWF8fGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKXsKK3RoaXMuZG9jdW1lbnQuZGVzaWduTW9kZT0ib24iOworfQordGhpcy5vbkxvYWQoKTsKK31lbHNleworZG9qby5odG1sLnJlbW92ZU5vZGUoXzhhZCk7Cit0aGlzLmVkaXROb2RlLmlubmVySFRNTD1odG1sOwordGhpcy5vbkRpc3BsYXlDaGFuZ2VkKCk7Cit9Cit9KTsKK2lmKHRoaXMuZWRpdE5vZGUpeworXzhiMygpOworfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLm1veil7Cit0aGlzLmlmcmFtZS5vbmxvYWQ9ZnVuY3Rpb24oKXsKK3NldFRpbWVvdXQoXzhiMywyNTApOworfTsKK31lbHNlewordGhpcy5pZnJhbWUub25sb2FkPV84YjM7Cit9Cit9Cit9LF9hcHBseUVkaXRpbmdBcmVhU3R5bGVTaGVldHM6ZnVuY3Rpb24oKXsKK3ZhciBfOGJhPVtdOworaWYodGhpcy5zdHlsZVNoZWV0cyl7CitfOGJhPXRoaXMuc3R5bGVTaGVldHMuc3BsaXQoIjsiKTsKK3RoaXMuc3R5bGVTaGVldHM9IiI7Cit9CitfOGJhPV84YmEuY29uY2F0KHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cyk7Cit0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHM9W107CitpZihfOGJhLmxlbmd0aD4wKXsKK2Zvcih2YXIgaT0wO2k8XzhiYS5sZW5ndGg7aSsrKXsKK3ZhciB1cmw9XzhiYVtpXTsKK2lmKHVybCl7Cit0aGlzLmFkZFN0eWxlU2hlZXQoZG9qby51cmkuZG9qb1VyaSh1cmwpKTsKK30KK30KK30KK30sYWRkU3R5bGVTaGVldDpmdW5jdGlvbih1cmkpewordmFyIHVybD11cmkudG9TdHJpbmcoKTsKK2lmKGRvam8ubGFuZy5maW5kKHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cyx1cmwpPi0xKXsKK2Rvam8uZGVidWcoImRvam8ud2lkZ2V0LlJpY2hUZXh0LmFkZFN0eWxlU2hlZXQ6IFN0eWxlIHNoZWV0ICIrdXJsKyIgaXMgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBlZGl0aW5nIGFyZWEhIik7CityZXR1cm47Cit9CitpZih1cmwuY2hhckF0KDApPT0iLiJ8fCh1cmwuY2hhckF0KDApIT0iLyImJiF1cmkuaG9zdCkpewordXJsPShuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24sdXJsKSkudG9TdHJpbmcoKTsKK30KK3RoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cy5wdXNoKHVybCk7CitpZih0aGlzLmRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQpewordGhpcy5kb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KHVybCk7Cit9ZWxzZXsKK3ZhciBoZWFkPXRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKK3ZhciBfOGMwPXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOword2l0aChfOGMwKXsKK3JlbD0ic3R5bGVzaGVldCI7Cit0eXBlPSJ0ZXh0L2NzcyI7CitocmVmPXVybDsKK30KK2hlYWQuYXBwZW5kQ2hpbGQoXzhjMCk7Cit9Cit9LHJlbW92ZVN0eWxlU2hlZXQ6ZnVuY3Rpb24odXJpKXsKK3ZhciB1cmw9dXJpLnRvU3RyaW5nKCk7CitpZih1cmwuY2hhckF0KDApPT0iLiJ8fCh1cmwuY2hhckF0KDApIT0iLyImJiF1cmkuaG9zdCkpewordXJsPShuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24sdXJsKSkudG9TdHJpbmcoKTsKK30KK3ZhciBfOGMzPWRvam8ubGFuZy5maW5kKHRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cyx1cmwpOworaWYoXzhjMz09LTEpeworZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuUmljaFRleHQucmVtb3ZlU3R5bGVTaGVldDogU3R5bGUgc2hlZXQgIit1cmwrIiBpcyBub3QgYXBwbGllZCB0byB0aGUgZWRpdGluZyBhcmVhIHNvIGl0IGNhbiBub3QgYmUgcmVtb3ZlZCEiKTsKK3JldHVybjsKK30KK2RlbGV0ZSB0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHNbXzhjM107Cit2YXIgXzhjND10aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7Citmb3IodmFyIGk9MDtpPF84YzQubGVuZ3RoO2krKyl7CitpZihfOGM0W2ldLmhyZWY9PXVybCl7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK184YzRbaV0uaHJlZj0iIjsKK30KK2Rvam8uaHRtbC5yZW1vdmVOb2RlKF84YzRbaV0pOworYnJlYWs7Cit9Cit9Cit9LF9kcmF3T2JqZWN0OmZ1bmN0aW9uKGh0bWwpewordGhpcy5vYmplY3Q9ZG9qby5odG1sLmNyZWF0ZUV4dGVybmFsRWxlbWVudChkb2pvLmRvYygpLCJvYmplY3QiKTsKK3dpdGgodGhpcy5vYmplY3QpeworY2xhc3NpZD0iY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMUQxLThEMDMtMDBBMEM5NTlCQzBBIjsKK3dpZHRoPXRoaXMuaW5oZXJpdFdpZHRoP3RoaXMuX29sZFdpZHRoOiIxMDAlIjsKK3N0eWxlLmhlaWdodD10aGlzLmhlaWdodD90aGlzLmhlaWdodDoodGhpcy5fb2xkSGVpZ2h0KyJweCIpOworU2Nyb2xsYmFycz10aGlzLmhlaWdodD90cnVlOmZhbHNlOworQXBwZWFyYW5jZT10aGlzLl9hY3RpdmVYLmFwcGVhcmFuY2UuZmxhdDsKK30KK3RoaXMuZWRpdG9yT2JqZWN0PXRoaXMub2JqZWN0OwordGhpcy5lZGl0aW5nQXJlYS5hcHBlbmRDaGlsZCh0aGlzLm9iamVjdCk7Cit0aGlzLm9iamVjdC5hdHRhY2hFdmVudCgiRG9jdW1lbnRDb21wbGV0ZSIsZG9qby5sYW5nLmhpdGNoKHRoaXMsIm9uTG9hZCIpKTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuZXZlbnRzLGZ1bmN0aW9uKGUpewordGhpcy5vYmplY3QuYXR0YWNoRXZlbnQoZS50b0xvd2VyQ2FzZSgpLGRvam8ubGFuZy5oaXRjaCh0aGlzLGUpKTsKK30sdGhpcyk7Cit0aGlzLm9iamVjdC5Eb2N1bWVudEhUTUw9IjwhZG9jdHlwZSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGRcIj4iKyI8aHRtbD48dGl0bGU+PC90aXRsZT4iKyI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+IisiICAgIGJvZHksaHRtbCB7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDsgfSIrKHRoaXMuaGVpZ2h0PyIiOiIgICAgYm9keSwgIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIpKyI8L3N0eWxlPiIrIjxib2R5PjxkaXY+IitodG1sKyI8ZGl2PjwvYm9keT48L2h0bWw+IjsKK3RoaXMuX2NhY2hlTG9jYWxCbG9ja0Zvcm1hdE5hbWVzKCk7Cit9LF9sb2NhbDJOYXRpdmVGb3JtYXROYW1lczp7fSxfbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXM6e30sX2NhY2hlTG9jYWxCbG9ja0Zvcm1hdE5hbWVzOmZ1bmN0aW9uKCl7CitpZighdGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbInAiXSl7Cit2YXIgb2JqPXRoaXMub2JqZWN0OwordmFyIF84Yzk9ZmFsc2U7CitpZighb2JqKXsKK3RyeXsKK29iaj1kb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50KGRvam8uZG9jKCksIm9iamVjdCIpOworb2JqLmNsYXNzaWQ9ImNsc2lkOjJEMzYwMjAxLUZGRjUtMTFEMS04RDAzLTAwQTBDOTU5QkMwQSI7Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChvYmopOworb2JqLkRvY3VtZW50SFRNTD0iPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+IjsKK30KK2NhdGNoKGUpeworXzhjOT10cnVlOworfQorfQordHJ5ewordmFyIF84Y2E9bmV3IEFjdGl2ZVhPYmplY3QoIkRFR2V0QmxvY2tGbXROYW1lc1BhcmFtLkRFR2V0QmxvY2tGbXROYW1lc1BhcmFtIik7CitvYmouRXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kWyJnZXRibG9ja2Zvcm1hdG5hbWVzIl0sMCxfOGNhKTsKK3ZhciBfOGNiPW5ldyBWQkFycmF5KF84Y2EuTmFtZXMpOwordmFyIF84Y2M9XzhjYi50b0FycmF5KCk7Cit2YXIgXzhjZD1bInAiLCJwcmUiLCJhZGRyZXNzIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2Iiwib2wiLCJ1bCIsIiIsIiIsIiIsIiIsImRpdiJdOworZm9yKHZhciBpPTA7aTxfOGNkLmxlbmd0aDsrK2kpeworaWYoXzhjZFtpXS5sZW5ndGg+MCl7Cit0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tfOGNjW2ldXT1fOGNkW2ldOwordGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbXzhjZFtpXV09XzhjY1tpXTsKK30KK30KK30KK2NhdGNoKGUpeworXzhjOT10cnVlOworfQoraWYob2JqJiYhdGhpcy5vYmplY3QpeworZG9qby5ib2R5KCkucmVtb3ZlQ2hpbGQob2JqKTsKK30KK30KK3JldHVybiAhXzhjOTsKK30sX2lzUmVzaXplZDpmdW5jdGlvbigpeworcmV0dXJuIGZhbHNlOworfSxvbkxvYWQ6ZnVuY3Rpb24oZSl7Cit0aGlzLmlzTG9hZGVkPXRydWU7CitpZih0aGlzLm9iamVjdCl7Cit0aGlzLmRvY3VtZW50PXRoaXMub2JqZWN0LkRPTTsKK3RoaXMud2luZG93PXRoaXMuZG9jdW1lbnQucGFyZW50V2luZG93OwordGhpcy5lZGl0Tm9kZT10aGlzLmRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZDsKK3RoaXMuZWRpdGluZ0FyZWEuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0P3RoaXMuaGVpZ2h0OnRoaXMubWluSGVpZ2h0OworaWYoIXRoaXMuaGVpZ2h0KXsKK3RoaXMuY29ubmVjdCh0aGlzLCJvbkRpc3BsYXlDaGFuZ2VkIiwiX3VwZGF0ZUhlaWdodCIpOworfQordGhpcy53aW5kb3cuX2ZyYW1lRWxlbWVudD10aGlzLm9iamVjdDsKK31lbHNleworaWYodGhpcy5pZnJhbWUmJiFkb2pvLnJlbmRlci5odG1sLmllKXsKK3RoaXMuZWRpdE5vZGU9dGhpcy5kb2N1bWVudC5ib2R5OworaWYoIXRoaXMuaGVpZ2h0KXsKK3RoaXMuY29ubmVjdCh0aGlzLCJvbkRpc3BsYXlDaGFuZ2VkIiwiX3VwZGF0ZUhlaWdodCIpOworfQordHJ5ewordGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZCgidXNlQ1NTIixmYWxzZSx0cnVlKTsKK3RoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInN0eWxlV2l0aENTUyIsZmFsc2UsZmFsc2UpOworfQorY2F0Y2goZTIpeworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpewordGhpcy5jb25uZWN0KHRoaXMuZWRpdE5vZGUsIm9uYmx1ciIsIm9uQmx1ciIpOwordGhpcy5jb25uZWN0KHRoaXMuZWRpdE5vZGUsIm9uZm9jdXMiLCJvbkZvY3VzIik7Cit0aGlzLmNvbm5lY3QodGhpcy5lZGl0Tm9kZSwib25jbGljayIsIm9uRm9jdXMiKTsKK3RoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZG9qby5sYW5nLmhpdGNoKHRoaXMsIm9uRGlzcGxheUNoYW5nZWQiKSw3NTApOworfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLm1vemlsbGF8fGRvam8ucmVuZGVyLmh0bWwub3BlcmEpewordmFyIGRvYz10aGlzLmRvY3VtZW50OwordmFyIF84ZDE9ZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyOwordmFyIHNlbGY9dGhpczsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuZXZlbnRzLGZ1bmN0aW9uKGUpewordmFyIGw9XzhkMShzZWxmLmRvY3VtZW50LGUuc3Vic3RyKDIpLnRvTG93ZXJDYXNlKCksZG9qby5sYW5nLmhpdGNoKHNlbGYsZSkpOworaWYoZT09Im9uQmx1ciIpewordmFyIF84ZDU9e3VuQmx1cjpmdW5jdGlvbihlKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5yZW1vdmVMaXN0ZW5lcihkb2MsImJsdXIiLGwpOworfX07Citkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZSIsc2VsZiwiY2xvc2UiLF84ZDUsInVuQmx1ciIpOworfQorfSk7Cit9Cit9Cit9ZWxzZXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworaWYoIXRoaXMuaGVpZ2h0KXsKK3RoaXMuY29ubmVjdCh0aGlzLCJvbkRpc3BsYXlDaGFuZ2VkIiwiX3VwZGF0ZUhlaWdodCIpOworfQordGhpcy5lZGl0Tm9kZS5zdHlsZS56b29tPTE7Cit9Cit9Cit9Cit0aGlzLl9hcHBseUVkaXRpbmdBcmVhU3R5bGVTaGVldHMoKTsKK2lmKHRoaXMuZm9jdXNPbkxvYWQpewordGhpcy5mb2N1cygpOworfQordGhpcy5vbkRpc3BsYXlDaGFuZ2VkKGUpOworaWYodGhpcy5vbkxvYWREZWZlcnJlZCl7Cit0aGlzLm9uTG9hZERlZmVycmVkLmNhbGxiYWNrKHRydWUpOworfQorfSxvbktleURvd246ZnVuY3Rpb24oZSl7CitpZigoIWUpJiYodGhpcy5vYmplY3QpKXsKK2U9ZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KHRoaXMud2luZG93LmV2ZW50KTsKK30KK2lmKChkb2pvLnJlbmRlci5odG1sLmllKSYmKGUua2V5Q29kZT09ZS5LRVlfVEFCKSl7CitlLnByZXZlbnREZWZhdWx0KCk7CitlLnN0b3BQcm9wYWdhdGlvbigpOwordGhpcy5leGVjQ29tbWFuZCgoZS5zaGlmdEtleT8ib3V0ZGVudCI6ImluZGVudCIpKTsKK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CitpZigoNjU8PWUua2V5Q29kZSkmJihlLmtleUNvZGU8PTkwKSl7CitlLmNoYXJDb2RlPWUua2V5Q29kZTsKK3RoaXMub25LZXlQcmVzcyhlKTsKK30KK30KK30KK30sb25LZXlVcDpmdW5jdGlvbihlKXsKK3JldHVybjsKK30sS0VZX0NUUkw6MSxvbktleVByZXNzOmZ1bmN0aW9uKGUpeworaWYoKCFlKSYmKHRoaXMub2JqZWN0KSl7CitlPWRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudCh0aGlzLndpbmRvdy5ldmVudCk7Cit9Cit2YXIgXzhkYT1lLmN0cmxLZXk/dGhpcy5LRVlfQ1RSTDowOworaWYodGhpcy5fa2V5SGFuZGxlcnNbZS5rZXldKXsKK3ZhciBfOGRiPXRoaXMuX2tleUhhbmRsZXJzW2Uua2V5XSxpPTAsXzhkZDsKK3doaWxlKF84ZGQ9XzhkYltpKytdKXsKK2lmKF84ZGE9PV84ZGQubW9kaWZpZXJzKXsKK2UucHJldmVudERlZmF1bHQoKTsKK184ZGQuaGFuZGxlci5jYWxsKHRoaXMpOworYnJlYWs7Cit9Cit9Cit9Citkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLHRoaXMub25LZXlQcmVzc2VkLDEsZSk7Cit9LGFkZEtleUhhbmRsZXI6ZnVuY3Rpb24oa2V5LF84ZGYsXzhlMCl7CitpZighKHRoaXMuX2tleUhhbmRsZXJzW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpewordGhpcy5fa2V5SGFuZGxlcnNba2V5XT1bXTsKK30KK3RoaXMuX2tleUhhbmRsZXJzW2tleV0ucHVzaCh7bW9kaWZpZXJzOl84ZGZ8fDAsaGFuZGxlcjpfOGUwfSk7Cit9LG9uS2V5UHJlc3NlZDpmdW5jdGlvbihlKXsKK3RoaXMub25EaXNwbGF5Q2hhbmdlZCgpOworfSxvbkNsaWNrOmZ1bmN0aW9uKGUpewordGhpcy5vbkRpc3BsYXlDaGFuZ2VkKGUpOworfSxvbkJsdXI6ZnVuY3Rpb24oZSl7Cit9LF9pbml0aWFsRm9jdXM6dHJ1ZSxvbkZvY3VzOmZ1bmN0aW9uKGUpeworaWYoKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkmJih0aGlzLl9pbml0aWFsRm9jdXMpKXsKK3RoaXMuX2luaXRpYWxGb2N1cz1mYWxzZTsKK2lmKGRvam8uc3RyaW5nLnRyaW0odGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwpPT0iJm5ic3A7Iil7Cit0aGlzLnBsYWNlQ3Vyc29yQXRTdGFydCgpOworfQorfQorfSxibHVyOmZ1bmN0aW9uKCl7CitpZih0aGlzLmlmcmFtZSl7Cit0aGlzLndpbmRvdy5ibHVyKCk7Cit9ZWxzZXsKK2lmKHRoaXMub2JqZWN0KXsKK3RoaXMuZG9jdW1lbnQuYm9keS5ibHVyKCk7Cit9ZWxzZXsKK2lmKHRoaXMuZWRpdE5vZGUpewordGhpcy5lZGl0Tm9kZS5ibHVyKCk7Cit9Cit9Cit9Cit9LGZvY3VzOmZ1bmN0aW9uKCl7CitpZih0aGlzLmlmcmFtZSYmIWRvam8ucmVuZGVyLmh0bWwuaWUpewordGhpcy53aW5kb3cuZm9jdXMoKTsKK31lbHNleworaWYodGhpcy5vYmplY3QpewordGhpcy5kb2N1bWVudC5mb2N1cygpOworfWVsc2V7CitpZih0aGlzLmVkaXROb2RlJiZ0aGlzLmVkaXROb2RlLmZvY3VzKXsKK3RoaXMuZWRpdE5vZGUuZm9jdXMoKTsKK31lbHNleworZG9qby5kZWJ1ZygiSGF2ZSBubyBpZGVhIGhvdyB0byBmb2N1cyBpbnRvIHRoZSBlZGl0b3IhIik7Cit9Cit9Cit9Cit9LG9uRGlzcGxheUNoYW5nZWQ6ZnVuY3Rpb24oZSl7Cit9LF9hY3RpdmVYOntjb21tYW5kOntib2xkOjUwMDAsaXRhbGljOjUwMjMsdW5kZXJsaW5lOjUwNDgsanVzdGlmeWNlbnRlcjo1MDI0LGp1c3RpZnlsZWZ0OjUwMjUsanVzdGlmeXJpZ2h0OjUwMjYsY3V0OjUwMDMsY29weTo1MDAyLHBhc3RlOjUwMzIsImRlbGV0ZSI6NTAwNCx1bmRvOjUwNDkscmVkbzo1MDMzLHJlbW92ZWZvcm1hdDo1MDM0LHNlbGVjdGFsbDo1MDM1LHVubGluazo1MDUwLGluZGVudDo1MDE4LG91dGRlbnQ6NTAzMSxpbnNlcnRvcmRlcmVkbGlzdDo1MDMwLGluc2VydHVub3JkZXJlZGxpc3Q6NTA1MSxpbnNlcnR0YWJsZTo1MDIyLGluc2VydGNlbGw6NTAxOSxpbnNlcnRjb2w6NTAyMCxpbnNlcnRyb3c6NTAyMSxkZWxldGVjZWxsczo1MDA1LGRlbGV0ZWNvbHM6NTAwNixkZWxldGVyb3dzOjUwMDcsbWVyZ2VjZWxsczo1MDI5LHNwbGl0Y2VsbDo1MDQ3LHNldGJsb2NrZm9ybWF0OjUwNDMsZ2V0YmxvY2tmb3JtYXQ6NTAxMSxnZXRibG9ja2Zvcm1hdG5hbWVzOjUwMTIsc2V0Zm9udG5hbWU6NTA0NCxnZXRmb250bmFtZTo1MDEzLHNldGZvbnRzaXplOjUwNDUsZ2V0Zm9udHNpemU6NTAxNCxzZXRiYWNrY29sb3I6NTA0MixnZXRiYWNrY29sb3I6NTAxMCxzZXRmb3JlY29sb3I6NTA0NixnZXRmb3JlY29sb3I6NTAxNSxmaW5kdGV4dDo1MDA4LGZvbnQ6NTAwOSxoeXBlcmxpbms6NTAxNixpbWFnZTo1MDE3LGxvY2tlbGVtZW50OjUwMjcsbWFrZWFic29sdXRlOjUwMjgsc2VuZGJhY2t3YXJkOjUwMzYsYnJpbmdmb3J3YXJkOjUwMzcsc2VuZGJlbG93dGV4dDo1MDM4LGJyaW5nYWJvdmV0ZXh0OjUwMzksc2VuZHRvYmFjazo1MDQwLGJyaW5ndG9mcm9udDo1MDQxLHByb3BlcnRpZXM6NTA1Mn0sdWk6eyJkZWZhdWx0IjowLHByb21wdDoxLG5vcHJvbXB0OjJ9LHN0YXR1czp7bm90c3VwcG9ydGVkOjAsZGlzYWJsZWQ6MSxlbmFibGVkOjMsbGF0Y2hlZDo3LG5pbmNoZWQ6MTF9LGFwcGVhcmFuY2U6e2ZsYXQ6MCxpbnNldDoxfSxzdGF0ZTp7dW5jaGVja2VkOjAsY2hlY2tlZDoxLGdyYXk6Mn19LF9ub3JtYWxpemVDb21tYW5kOmZ1bmN0aW9uKGNtZCl7Cit2YXIgZHJoPWRvam8ucmVuZGVyLmh0bWw7Cit2YXIgXzhlOD1jbWQudG9Mb3dlckNhc2UoKTsKK2lmKF84ZTg9PSJmb3JtYXRibG9jayIpeworaWYoZHJoLnNhZmFyaSl7CitfOGU4PSJoZWFkaW5nIjsKK30KK31lbHNleworaWYodGhpcy5vYmplY3Qpeworc3dpdGNoKF84ZTgpeworY2FzZSAiY3JlYXRlbGluayI6CitfOGU4PSJoeXBlcmxpbmsiOworYnJlYWs7CitjYXNlICJpbnNlcnRpbWFnZSI6CitfOGU4PSJpbWFnZSI7CiticmVhazsKK30KK31lbHNleworaWYoXzhlOD09ImhpbGl0ZWNvbG9yIiYmIWRyaC5tb3ppbGxhKXsKK184ZTg9ImJhY2tjb2xvciI7Cit9Cit9Cit9CityZXR1cm4gXzhlODsKK30sX3NhZmFyaUlzTGVvcGFyZDpmdW5jdGlvbigpewordmFyIF84ZTk9ZmFsc2U7CitpZihkb2pvLnJlbmRlci5odG1sLnNhZmFyaSl7Cit2YXIgdG1wPWRvam8ucmVuZGVyLmh0bWwuVUEuc3BsaXQoIkFwcGxlV2ViS2l0LyIpWzFdOwordmFyIHZlcj1wYXJzZUZsb2F0KHRtcC5zcGxpdCgiICIpWzBdKTsKK2lmKHZlcj49NDIwKXsKK184ZTk9dHJ1ZTsKK30KK30KK3JldHVybiBfOGU5OworfSxxdWVyeUNvbW1hbmRBdmFpbGFibGU6ZnVuY3Rpb24oXzhlYyl7Cit2YXIgaWU9MTsKK3ZhciBfOGVlPTE8PDE7Cit2YXIgXzhlZj0xPDwyOwordmFyIF84ZjA9MTw8MzsKK3ZhciBfOGYxPTE8PDQ7Cit2YXIgXzhmMj10aGlzLl9zYWZhcmlJc0xlb3BhcmQoKTsKK2Z1bmN0aW9uIGlzU3VwcG9ydGVkQnkoXzhmMyl7CityZXR1cm4ge2llOkJvb2xlYW4oXzhmMyZpZSksbW96aWxsYTpCb29sZWFuKF84ZjMmXzhlZSksc2FmYXJpOkJvb2xlYW4oXzhmMyZfOGVmKSxzYWZhcmk0MjA6Qm9vbGVhbihfOGYzJl84ZjEpLG9wZXJhOkJvb2xlYW4oXzhmMyZfOGYwKX07Cit9Cit2YXIgXzhmND1udWxsOworc3dpdGNoKF84ZWMudG9Mb3dlckNhc2UoKSl7CitjYXNlICJib2xkIjoKK2Nhc2UgIml0YWxpYyI6CitjYXNlICJ1bmRlcmxpbmUiOgorY2FzZSAic3Vic2NyaXB0IjoKK2Nhc2UgInN1cGVyc2NyaXB0IjoKK2Nhc2UgImZvbnRuYW1lIjoKK2Nhc2UgImZvbnRzaXplIjoKK2Nhc2UgImZvcmVjb2xvciI6CitjYXNlICJoaWxpdGVjb2xvciI6CitjYXNlICJqdXN0aWZ5Y2VudGVyIjoKK2Nhc2UgImp1c3RpZnlmdWxsIjoKK2Nhc2UgImp1c3RpZnlsZWZ0IjoKK2Nhc2UgImp1c3RpZnlyaWdodCI6CitjYXNlICJkZWxldGUiOgorY2FzZSAic2VsZWN0YWxsIjoKK184ZjQ9aXNTdXBwb3J0ZWRCeShfOGVlfGllfF84ZWZ8XzhmMCk7CiticmVhazsKK2Nhc2UgImNyZWF0ZWxpbmsiOgorY2FzZSAidW5saW5rIjoKK2Nhc2UgInJlbW92ZWZvcm1hdCI6CitjYXNlICJpbnNlcnRob3Jpem9udGFscnVsZSI6CitjYXNlICJpbnNlcnRpbWFnZSI6CitjYXNlICJpbnNlcnRvcmRlcmVkbGlzdCI6CitjYXNlICJpbnNlcnR1bm9yZGVyZWRsaXN0IjoKK2Nhc2UgImluZGVudCI6CitjYXNlICJvdXRkZW50IjoKK2Nhc2UgImZvcm1hdGJsb2NrIjoKK2Nhc2UgImluc2VydGh0bWwiOgorY2FzZSAidW5kbyI6CitjYXNlICJyZWRvIjoKK2Nhc2UgInN0cmlrZXRocm91Z2giOgorXzhmND1pc1N1cHBvcnRlZEJ5KF84ZWV8aWV8XzhmMHxfOGYxKTsKK2JyZWFrOworY2FzZSAiYmxvY2tkaXJsdHIiOgorY2FzZSAiYmxvY2tkaXJydGwiOgorY2FzZSAiZGlybHRyIjoKK2Nhc2UgImRpcnJ0bCI6CitjYXNlICJpbmxpbmVkaXJsdHIiOgorY2FzZSAiaW5saW5lZGlycnRsIjoKK184ZjQ9aXNTdXBwb3J0ZWRCeShpZSk7CiticmVhazsKK2Nhc2UgImN1dCI6CitjYXNlICJjb3B5IjoKK2Nhc2UgInBhc3RlIjoKK184ZjQ9aXNTdXBwb3J0ZWRCeShpZXxfOGVlfF84ZjEpOworYnJlYWs7CitjYXNlICJpbnNlcnR0YWJsZSI6CitfOGY0PWlzU3VwcG9ydGVkQnkoXzhlZXwodGhpcy5vYmplY3Q/aWU6MCkpOworYnJlYWs7CitjYXNlICJpbnNlcnRjZWxsIjoKK2Nhc2UgImluc2VydGNvbCI6CitjYXNlICJpbnNlcnRyb3ciOgorY2FzZSAiZGVsZXRlY2VsbHMiOgorY2FzZSAiZGVsZXRlY29scyI6CitjYXNlICJkZWxldGVyb3dzIjoKK2Nhc2UgIm1lcmdlY2VsbHMiOgorY2FzZSAic3BsaXRjZWxsIjoKK184ZjQ9aXNTdXBwb3J0ZWRCeSh0aGlzLm9iamVjdD9pZTowKTsKK2JyZWFrOworZGVmYXVsdDoKK3JldHVybiBmYWxzZTsKK30KK3JldHVybiAoZG9qby5yZW5kZXIuaHRtbC5pZSYmXzhmNC5pZSl8fChkb2pvLnJlbmRlci5odG1sLm1vemlsbGEmJl84ZjQubW96aWxsYSl8fChkb2pvLnJlbmRlci5odG1sLnNhZmFyaSYmXzhmNC5zYWZhcmkpfHwoXzhmMiYmXzhmNC5zYWZhcmk0MjApfHwoZG9qby5yZW5kZXIuaHRtbC5vcGVyYSYmXzhmNC5vcGVyYSk7Cit9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKF84ZjUsXzhmNil7Cit2YXIgXzhmNzsKK3RoaXMuZm9jdXMoKTsKK184ZjU9dGhpcy5fbm9ybWFsaXplQ29tbWFuZChfOGY1KTsKK2lmKF84ZjYhPXVuZGVmaW5lZCl7CitpZihfOGY1PT0iaGVhZGluZyIpewordGhyb3cgbmV3IEVycm9yKCJ1bmltcGxlbWVudGVkIik7Cit9ZWxzZXsKK2lmKF84ZjU9PSJmb3JtYXRibG9jayIpeworaWYodGhpcy5vYmplY3QpeworXzhmNj10aGlzLl9uYXRpdmUyTG9jYWxGb3JtYXROYW1lc1tfOGY2XTsKK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CitfOGY2PSI8IitfOGY2KyI+IjsKK30KK30KK30KK30KK30KK2lmKHRoaXMub2JqZWN0KXsKK3N3aXRjaChfOGY1KXsKK2Nhc2UgImhpbGl0ZWNvbG9yIjoKK184ZjU9InNldGJhY2tjb2xvciI7CiticmVhazsKK2Nhc2UgImZvcmVjb2xvciI6CitjYXNlICJiYWNrY29sb3IiOgorY2FzZSAiZm9udHNpemUiOgorY2FzZSAiZm9udG5hbWUiOgorXzhmNT0ic2V0IitfOGY1OworYnJlYWs7CitjYXNlICJmb3JtYXRibG9jayI6CitfOGY1PSJzZXRibG9ja2Zvcm1hdCI7Cit9CitpZihfOGY1PT0ic3RyaWtldGhyb3VnaCIpeworXzhmNT0iaW5zZXJ0aHRtbCI7Cit2YXIgXzhmOD10aGlzLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworaWYoIV84ZjguaHRtbFRleHQpeworcmV0dXJuOworfQorXzhmNj1fOGY4Lmh0bWxUZXh0LnN0cmlrZSgpOworfWVsc2V7CitpZihfOGY1PT0iaW5zZXJ0aG9yaXpvbnRhbHJ1bGUiKXsKK184ZjU9Imluc2VydGh0bWwiOworXzhmNj0iPGhyPiI7Cit9Cit9CitpZihfOGY1PT0iaW5zZXJ0aHRtbCIpewordmFyIF84Zjg9dGhpcy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKK2lmKHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLnR5cGUudG9VcHBlckNhc2UoKT09IkNPTlRST0wiKXsKK2Zvcih2YXIgaT0wO2k8XzhmOC5sZW5ndGg7aSsrKXsKK184ZjguaXRlbShpKS5vdXRlckhUTUw9XzhmNjsKK30KK31lbHNleworXzhmOC5wYXN0ZUhUTUwoXzhmNik7CitfOGY4LnNlbGVjdCgpOworfQorXzhmNz10cnVlOworfWVsc2V7CitpZihhcmd1bWVudHMubGVuZ3RoPT0xKXsKK184Zjc9dGhpcy5vYmplY3QuRXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kW184ZjVdLHRoaXMuX2FjdGl2ZVgudWkubm9wcm9tcHQpOworfWVsc2V7CitfOGY3PXRoaXMub2JqZWN0LkV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFtfOGY1XSx0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0LF84ZjYpOworfQorfQorfWVsc2V7CitpZihfOGY1PT0iaW5zZXJ0aHRtbCIpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit2YXIgXzhmYT10aGlzLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworXzhmYS5wYXN0ZUhUTUwoXzhmNik7CitfOGZhLnNlbGVjdCgpOworcmV0dXJuIHRydWU7Cit9ZWxzZXsKK3JldHVybiB0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKF84ZjUsZmFsc2UsXzhmNik7Cit9Cit9ZWxzZXsKK2lmKChfOGY1PT0idW5saW5rIikmJih0aGlzLnF1ZXJ5Q29tbWFuZEVuYWJsZWQoInVubGluayIpKSYmKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSkpewordmFyIF84ZmI9dGhpcy53aW5kb3cuZ2V0U2VsZWN0aW9uKCk7Cit2YXIgXzhmYz1fOGZiLmdldFJhbmdlQXQoMCk7Cit2YXIgXzhmZD1fOGZjLnN0YXJ0Q29udGFpbmVyOwordmFyIF84ZmU9XzhmYy5zdGFydE9mZnNldDsKK3ZhciBfOGZmPV84ZmMuZW5kQ29udGFpbmVyOwordmFyIF85MDA9XzhmYy5lbmRPZmZzZXQ7Cit2YXIgYT1kb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csImdldEFuY2VzdG9yRWxlbWVudCIsZG9qby5odG1sLnNlbGVjdGlvbixbImEiXSk7Citkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csInNlbGVjdEVsZW1lbnQiLGRvam8uaHRtbC5zZWxlY3Rpb24sW2FdKTsKK184Zjc9dGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZCgidW5saW5rIixmYWxzZSxudWxsKTsKK3ZhciBfOGZjPXRoaXMuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKK184ZmMuc2V0U3RhcnQoXzhmZCxfOGZlKTsKK184ZmMuc2V0RW5kKF84ZmYsXzkwMCk7CitfOGZiLnJlbW92ZUFsbFJhbmdlcygpOworXzhmYi5hZGRSYW5nZShfOGZjKTsKK3JldHVybiBfOGY3OworfWVsc2V7CitpZigoXzhmNT09ImhpbGl0ZWNvbG9yIikmJihkb2pvLnJlbmRlci5odG1sLm1vemlsbGEpKXsKK3RoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInVzZUNTUyIsZmFsc2UsZmFsc2UpOworXzhmNz10aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKF84ZjUsZmFsc2UsXzhmNik7Cit0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKCJ1c2VDU1MiLGZhbHNlLHRydWUpOworfWVsc2V7CitpZigoZG9qby5yZW5kZXIuaHRtbC5pZSkmJigoXzhmNT09ImJhY2tjb2xvciIpfHwoXzhmNT09ImZvcmVjb2xvciIpKSl7CitfOGY2PWFyZ3VtZW50cy5sZW5ndGg+MT9fOGY2Om51bGw7CitfOGY3PXRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoXzhmNSxmYWxzZSxfOGY2KTsKK31lbHNleworXzhmNj1hcmd1bWVudHMubGVuZ3RoPjE/XzhmNjpudWxsOworaWYoXzhmNnx8XzhmNSE9ImNyZWF0ZWxpbmsiKXsKK184Zjc9dGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZChfOGY1LGZhbHNlLF84ZjYpOworfQorfQorfQorfQorfQorfQordGhpcy5vbkRpc3BsYXlDaGFuZ2VkKCk7CityZXR1cm4gXzhmNzsKK30scXVlcnlDb21tYW5kRW5hYmxlZDpmdW5jdGlvbihfOTAyKXsKK185MDI9dGhpcy5fbm9ybWFsaXplQ29tbWFuZChfOTAyKTsKK2lmKHRoaXMub2JqZWN0KXsKK3N3aXRjaChfOTAyKXsKK2Nhc2UgImhpbGl0ZWNvbG9yIjoKK185MDI9InNldGJhY2tjb2xvciI7CiticmVhazsKK2Nhc2UgImZvcmVjb2xvciI6CitjYXNlICJiYWNrY29sb3IiOgorY2FzZSAiZm9udHNpemUiOgorY2FzZSAiZm9udG5hbWUiOgorXzkwMj0ic2V0IitfOTAyOworYnJlYWs7CitjYXNlICJmb3JtYXRibG9jayI6CitfOTAyPSJzZXRibG9ja2Zvcm1hdCI7CiticmVhazsKK2Nhc2UgInN0cmlrZXRocm91Z2giOgorXzkwMj0iYm9sZCI7CiticmVhazsKK2Nhc2UgImluc2VydGhvcml6b250YWxydWxlIjoKK3JldHVybiB0cnVlOworfQoraWYodHlwZW9mIHRoaXMuX2FjdGl2ZVguY29tbWFuZFtfOTAyXT09InVuZGVmaW5lZCIpeworcmV0dXJuIGZhbHNlOworfQordmFyIF85MDM9dGhpcy5vYmplY3QuUXVlcnlTdGF0dXModGhpcy5fYWN0aXZlWC5jb21tYW5kW185MDJdKTsKK3JldHVybiAoKF85MDMhPXRoaXMuX2FjdGl2ZVguc3RhdHVzLm5vdHN1cHBvcnRlZCkmJihfOTAzIT10aGlzLl9hY3RpdmVYLnN0YXR1cy5kaXNhYmxlZCkpOworfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLm1vemlsbGEpeworaWYoXzkwMj09InVubGluayIpeworcmV0dXJuIGRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywiaGFzQW5jZXN0b3JFbGVtZW50Iixkb2pvLmh0bWwuc2VsZWN0aW9uLFsiYSJdKTsKK31lbHNleworaWYoXzkwMj09Imluc2VydHRhYmxlIil7CityZXR1cm4gdHJ1ZTsKK30KK30KK30KK3ZhciBlbGVtPShkb2pvLnJlbmRlci5odG1sLmllKT90aGlzLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOnRoaXMuZG9jdW1lbnQ7CityZXR1cm4gZWxlbS5xdWVyeUNvbW1hbmRFbmFibGVkKF85MDIpOworfQorfSxxdWVyeUNvbW1hbmRTdGF0ZTpmdW5jdGlvbihfOTA1KXsKK185MDU9dGhpcy5fbm9ybWFsaXplQ29tbWFuZChfOTA1KTsKK2lmKHRoaXMub2JqZWN0KXsKK2lmKF85MDU9PSJmb3JlY29sb3IiKXsKK185MDU9InNldGZvcmVjb2xvciI7Cit9ZWxzZXsKK2lmKF85MDU9PSJiYWNrY29sb3IiKXsKK185MDU9InNldGJhY2tjb2xvciI7Cit9ZWxzZXsKK2lmKF85MDU9PSJzdHJpa2V0aHJvdWdoIil7CityZXR1cm4gZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCJoYXNBbmNlc3RvckVsZW1lbnQiLGRvam8uaHRtbC5zZWxlY3Rpb24sWyJzdHJpa2UiXSk7Cit9ZWxzZXsKK2lmKF85MDU9PSJpbnNlcnRob3Jpem9udGFscnVsZSIpeworcmV0dXJuIGZhbHNlOworfQorfQorfQorfQoraWYodHlwZW9mIHRoaXMuX2FjdGl2ZVguY29tbWFuZFtfOTA1XT09InVuZGVmaW5lZCIpeworcmV0dXJuIG51bGw7Cit9Cit2YXIgXzkwNj10aGlzLm9iamVjdC5RdWVyeVN0YXR1cyh0aGlzLl9hY3RpdmVYLmNvbW1hbmRbXzkwNV0pOworcmV0dXJuICgoXzkwNj09dGhpcy5fYWN0aXZlWC5zdGF0dXMubGF0Y2hlZCl8fChfOTA2PT10aGlzLl9hY3RpdmVYLnN0YXR1cy5uaW5jaGVkKSk7Cit9ZWxzZXsKK3JldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKF85MDUpOworfQorfSxxdWVyeUNvbW1hbmRWYWx1ZTpmdW5jdGlvbihfOTA3KXsKK185MDc9dGhpcy5fbm9ybWFsaXplQ29tbWFuZChfOTA3KTsKK2lmKHRoaXMub2JqZWN0KXsKK3N3aXRjaChfOTA3KXsKK2Nhc2UgImZvcmVjb2xvciI6CitjYXNlICJiYWNrY29sb3IiOgorY2FzZSAiZm9udHNpemUiOgorY2FzZSAiZm9udG5hbWUiOgorXzkwNz0iZ2V0IitfOTA3OworcmV0dXJuIHRoaXMub2JqZWN0LmV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFtfOTA3XSx0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0KTsKK2Nhc2UgImZvcm1hdGJsb2NrIjoKK3ZhciBfOTA4PXRoaXMub2JqZWN0LmV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFsiZ2V0YmxvY2tmb3JtYXQiXSx0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0KTsKK2lmKF85MDgpeworcmV0dXJuIHRoaXMuX2xvY2FsMk5hdGl2ZUZvcm1hdE5hbWVzW185MDhdOworfQorfQorfWVsc2V7CitpZihkb2pvLnJlbmRlci5odG1sLmllJiZfOTA3PT0iZm9ybWF0YmxvY2siKXsKK3JldHVybiB0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1t0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKF85MDcpXXx8dGhpcy5kb2N1bWVudC5xdWVyeUNvbW1hbmRWYWx1ZShfOTA3KTsKK30KK3JldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKF85MDcpOworfQorfSxwbGFjZUN1cnNvckF0U3RhcnQ6ZnVuY3Rpb24oKXsKK3RoaXMuZm9jdXMoKTsKK2lmKGRvam8ucmVuZGVyLmh0bWwubW96JiZ0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQmJnRoaXMuZWRpdE5vZGUuZmlyc3RDaGlsZC5ub2RlVHlwZSE9ZG9qby5kb20uVEVYVF9OT0RFKXsKK2Rvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywic2VsZWN0RWxlbWVudENoaWxkcmVuIixkb2pvLmh0bWwuc2VsZWN0aW9uLFt0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGRdKTsKK31lbHNleworZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCJzZWxlY3RFbGVtZW50Q2hpbGRyZW4iLGRvam8uaHRtbC5zZWxlY3Rpb24sW3RoaXMuZWRpdE5vZGVdKTsKK30KK2Rvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywiY29sbGFwc2UiLGRvam8uaHRtbC5zZWxlY3Rpb24sW3RydWVdKTsKK30scGxhY2VDdXJzb3JBdEVuZDpmdW5jdGlvbigpewordGhpcy5mb2N1cygpOworaWYoZG9qby5yZW5kZXIuaHRtbC5tb3omJnRoaXMuZWRpdE5vZGUubGFzdENoaWxkJiZ0aGlzLmVkaXROb2RlLmxhc3RDaGlsZC5ub2RlVHlwZSE9ZG9qby5kb20uVEVYVF9OT0RFKXsKK2Rvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywic2VsZWN0RWxlbWVudENoaWxkcmVuIixkb2pvLmh0bWwuc2VsZWN0aW9uLFt0aGlzLmVkaXROb2RlLmxhc3RDaGlsZF0pOworfWVsc2V7Citkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csInNlbGVjdEVsZW1lbnRDaGlsZHJlbiIsZG9qby5odG1sLnNlbGVjdGlvbixbdGhpcy5lZGl0Tm9kZV0pOworfQorZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCJjb2xsYXBzZSIsZG9qby5odG1sLnNlbGVjdGlvbixbZmFsc2VdKTsKK30scmVwbGFjZUVkaXRvckNvbnRlbnQ6ZnVuY3Rpb24oaHRtbCl7CitodG1sPXRoaXMuX3ByZUZpbHRlckNvbnRlbnQoaHRtbCk7CitpZih0aGlzLmlzQ2xvc2VkKXsKK3RoaXMuZG9tTm9kZS5pbm5lckhUTUw9aHRtbDsKK31lbHNleworaWYodGhpcy53aW5kb3cmJnRoaXMud2luZG93LmdldFNlbGVjdGlvbiYmIWRvam8ucmVuZGVyLmh0bWwubW96KXsKK3RoaXMuZWRpdE5vZGUuaW5uZXJIVE1MPWh0bWw7Cit9ZWxzZXsKK2lmKCh0aGlzLndpbmRvdyYmdGhpcy53aW5kb3cuZ2V0U2VsZWN0aW9uKXx8KHRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uKSl7Cit0aGlzLmV4ZWNDb21tYW5kKCJzZWxlY3RhbGwiKTsKK2lmKGRvam8ucmVuZGVyLmh0bWwubW96JiYhaHRtbCl7CitodG1sPSImbmJzcDsiOworfQordGhpcy5leGVjQ29tbWFuZCgiaW5zZXJ0aHRtbCIsaHRtbCk7Cit9Cit9Cit9Cit9LF9wcmVGaWx0ZXJDb250ZW50OmZ1bmN0aW9uKGh0bWwpewordmFyIGVjPWh0bWw7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnRQcmVGaWx0ZXJzLGZ1bmN0aW9uKGVmKXsKK2VjPWVmKGVjKTsKK30pOworaWYodGhpcy5jb250ZW50RG9tUHJlRmlsdGVycy5sZW5ndGg+MCl7Cit2YXIgZG9tPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7Citkb20uc3R5bGUuZGlzcGxheT0ibm9uZSI7Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChkb20pOworZG9tLmlubmVySFRNTD1lYzsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuY29udGVudERvbVByZUZpbHRlcnMsZnVuY3Rpb24oZWYpeworZG9tPWVmKGRvbSk7Cit9KTsKK2VjPWRvbS5pbm5lckhUTUw7Citkb2pvLmJvZHkoKS5yZW1vdmVDaGlsZChkb20pOworfQorcmV0dXJuIGVjOworfSxfcG9zdEZpbHRlckNvbnRlbnQ6ZnVuY3Rpb24oaHRtbCl7Cit2YXIgZWM9aHRtbDsKK2lmKHRoaXMuY29udGVudERvbVBvc3RGaWx0ZXJzLmxlbmd0aD4wKXsKK3ZhciBkb209dGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK2RvbS5pbm5lckhUTUw9ZWM7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnREb21Qb3N0RmlsdGVycyxmdW5jdGlvbihlZil7Citkb209ZWYoZG9tKTsKK30pOworZWM9ZG9tLmlubmVySFRNTDsKK30KK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuY29udGVudFBvc3RGaWx0ZXJzLGZ1bmN0aW9uKGVmKXsKK2VjPWVmKGVjKTsKK30pOworcmV0dXJuIGVjOworfSxfbGFzdEhlaWdodDowLF91cGRhdGVIZWlnaHQ6ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmlzTG9hZGVkKXsKK3JldHVybjsKK30KK2lmKHRoaXMuaGVpZ2h0KXsKK3JldHVybjsKK30KK3ZhciBfOTE0PWRvam8uaHRtbC5nZXRCb3JkZXJCb3godGhpcy5lZGl0Tm9kZSkuaGVpZ2h0OworaWYoIV85MTQpeworXzkxND1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9jdW1lbnQuYm9keSkuaGVpZ2h0OworfQoraWYoXzkxND09MCl7Citkb2pvLmRlYnVnKCJDYW4gbm90IGZpZ3VyZSBvdXQgdGhlIGhlaWdodCBvZiB0aGUgZWRpdGluZyBhcmVhISIpOworcmV0dXJuOworfQordGhpcy5fbGFzdEhlaWdodD1fOTE0OwordGhpcy5lZGl0b3JPYmplY3Quc3R5bGUuaGVpZ2h0PXRoaXMuX2xhc3RIZWlnaHQrInB4IjsKK3RoaXMud2luZG93LnNjcm9sbFRvKDAsMCk7Cit9LF9zYXZlQ29udGVudDpmdW5jdGlvbihlKXsKK3ZhciBfOTE2PWRvam8uZG9jKCkuZ2V0RWxlbWVudEJ5SWQoImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCIpOworXzkxNi52YWx1ZSs9dGhpcy5fU0VQQVJBVE9SK3RoaXMuc2F2ZU5hbWUrIjoiK3RoaXMuZ2V0RWRpdG9yQ29udGVudCgpOworfSxnZXRFZGl0b3JDb250ZW50OmZ1bmN0aW9uKCl7Cit2YXIgZWM9IiI7Cit0cnl7CitlYz0odGhpcy5fY29udGVudC5sZW5ndGg+MCk/dGhpcy5fY29udGVudDp0aGlzLmVkaXROb2RlLmlubmVySFRNTDsKK2lmKGRvam8uc3RyaW5nLnRyaW0oZWMpPT0iJm5ic3A7Iil7CitlYz0iIjsKK30KK30KK2NhdGNoKGUpeworfQoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSYmIXRoaXMub2JqZWN0KXsKK3ZhciByZT1uZXcgUmVnRXhwKCIoPzo8cD4mbmJzcDs8L3A+W1xuXHJdKikrJCIsImkiKTsKK2VjPWVjLnJlcGxhY2UocmUsIiIpOworfQorZWM9dGhpcy5fcG9zdEZpbHRlckNvbnRlbnQoZWMpOworaWYodGhpcy5yZWxhdGl2ZUltYWdlVXJscyl7Cit2YXIgXzkxOT1kb2pvLmdsb2JhbCgpLmxvY2F0aW9uLnByb3RvY29sKyIvLyIrZG9qby5nbG9iYWwoKS5sb2NhdGlvbi5ob3N0OwordmFyIF85MWE9ZG9qby5nbG9iYWwoKS5sb2NhdGlvbi5wYXRobmFtZTsKK2lmKF85MWEubWF0Y2goL1wvJC8pKXsKK31lbHNlewordmFyIF85MWI9XzkxYS5zcGxpdCgiLyIpOworaWYoXzkxYi5sZW5ndGgpeworXzkxYi5wb3AoKTsKK30KK185MWE9XzkxYi5qb2luKCIvIikrIi8iOworfQordmFyIF85MWM9bmV3IFJlZ0V4cCgiKDxpbWdbXj5dKiBzcmM9W1wiJ10pKCIrXzkxOSsiKCIrXzkxYSsiKT8pIiwiaWciKTsKK2VjPWVjLnJlcGxhY2UoXzkxYywiJDEiKTsKK30KK3JldHVybiBlYzsKK30sY2xvc2U6ZnVuY3Rpb24oc2F2ZSxfOTFlKXsKK2lmKHRoaXMuaXNDbG9zZWQpeworcmV0dXJuIGZhbHNlOworfQoraWYoYXJndW1lbnRzLmxlbmd0aD09MCl7CitzYXZlPXRydWU7Cit9Cit0aGlzLl9jb250ZW50PXRoaXMuX3Bvc3RGaWx0ZXJDb250ZW50KHRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MKTsKK3ZhciBfOTFmPSh0aGlzLnNhdmVkQ29udGVudCE9dGhpcy5fY29udGVudCk7CitpZih0aGlzLmludGVydmFsKXsKK2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7Cit9CitpZihkb2pvLnJlbmRlci5odG1sLmllJiYhdGhpcy5vYmplY3QpeworZG9qby5ldmVudC5icm93c2VyLmNsZWFuKHRoaXMuZWRpdE5vZGUpOworfQoraWYodGhpcy5pZnJhbWUpeworZGVsZXRlIHRoaXMuaWZyYW1lOworfQoraWYodGhpcy50ZXh0YXJlYSl7Cit3aXRoKHRoaXMudGV4dGFyZWEuc3R5bGUpeworcG9zaXRpb249IiI7CitsZWZ0PXRvcD0iIjsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworb3ZlcmZsb3c9dGhpcy5fX292ZXJmbG93OwordGhpcy5fX292ZXJmbG93PW51bGw7Cit9Cit9CitpZihzYXZlKXsKK3RoaXMudGV4dGFyZWEudmFsdWU9dGhpcy5fY29udGVudDsKK31lbHNlewordGhpcy50ZXh0YXJlYS52YWx1ZT10aGlzLnNhdmVkQ29udGVudDsKK30KK2Rvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZG9tTm9kZSk7Cit0aGlzLmRvbU5vZGU9dGhpcy50ZXh0YXJlYTsKK31lbHNleworaWYoc2F2ZSl7CitpZihkb2pvLnJlbmRlci5odG1sLm1veil7Cit2YXIgbmM9ZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Cit0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQobmMpOworbmMuaW5uZXJIVE1MPXRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MOworfWVsc2V7Cit0aGlzLmRvbU5vZGUuaW5uZXJIVE1MPXRoaXMuX2NvbnRlbnQ7Cit9Cit9ZWxzZXsKK3RoaXMuZG9tTm9kZS5pbm5lckhUTUw9dGhpcy5zYXZlZENvbnRlbnQ7Cit9Cit9Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCJSaWNoVGV4dEVkaXRhYmxlIik7Cit0aGlzLmlzQ2xvc2VkPXRydWU7Cit0aGlzLmlzTG9hZGVkPWZhbHNlOworZGVsZXRlIHRoaXMuZWRpdE5vZGU7CitpZih0aGlzLndpbmRvdy5fZnJhbWVFbGVtZW50KXsKK3RoaXMud2luZG93Ll9mcmFtZUVsZW1lbnQ9bnVsbDsKK30KK3RoaXMud2luZG93PW51bGw7Cit0aGlzLmRvY3VtZW50PW51bGw7Cit0aGlzLm9iamVjdD1udWxsOwordGhpcy5lZGl0aW5nQXJlYT1udWxsOwordGhpcy5lZGl0b3JPYmplY3Q9bnVsbDsKK3JldHVybiBfOTFmOworfSxkZXN0cm95UmVuZGVyaW5nOmZ1bmN0aW9uKCl7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK3RoaXMuZGVzdHJveVJlbmRlcmluZygpOworaWYoIXRoaXMuaXNDbG9zZWQpewordGhpcy5jbG9zZShmYWxzZSk7Cit9Citkb2pvLndpZGdldC5SaWNoVGV4dC5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK30sY29ubmVjdDpmdW5jdGlvbihfOTIxLF85MjIsXzkyMyl7Citkb2pvLmV2ZW50LmNvbm5lY3QoXzkyMSxfOTIyLHRoaXMsXzkyMyk7Cit9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oXzkyNCxfOTI1LF85MjYpeworZG9qby5ldmVudC5kaXNjb25uZWN0KF85MjQsXzkyNSx0aGlzLF85MjYpOworfSxkaXNjb25uZWN0QWxsV2l0aFJvb3Q6ZnVuY3Rpb24oXzkyNyl7Citkb2pvLmRlcHJlY2F0ZWQoImRpc2Nvbm5lY3RBbGxXaXRoUm9vdCIsImlzIGRlcHJlY2F0ZWQuIE5vIG5lZWQgdG8gZGlzY29ubmVjdCBtYW51YWxseSIsIjAuNSIpOworfSxfZml4Q29udGVudEZvck1vejpmdW5jdGlvbihodG1sKXsKK2h0bWw9aHRtbC5yZXBsYWNlKC88c3Ryb25nKFsgXD5dKS9naSwiPGIkMSIpOworaHRtbD1odG1sLnJlcGxhY2UoLzxcL3N0cm9uZz4vZ2ksIjwvYj4iKTsKK2h0bWw9aHRtbC5yZXBsYWNlKC88ZW0oWyBcPl0pL2dpLCI8aSQxIik7CitodG1sPWh0bWwucmVwbGFjZSgvPFwvZW0+L2dpLCI8L2k+Iik7CityZXR1cm4gaHRtbDsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnR5cGUiKTsKK2Rvam8ubGFuZy53aGF0QW1JPWZ1bmN0aW9uKF85MjkpeworZG9qby5kZXByZWNhdGVkKCJkb2pvLmxhbmcud2hhdEFtSSIsInVzZSBkb2pvLmxhbmcuZ2V0VHlwZSBpbnN0ZWFkIiwiMC41Iik7CityZXR1cm4gZG9qby5sYW5nLmdldFR5cGUoXzkyOSk7Cit9OworZG9qby5sYW5nLndoYXRBbUkuY3VzdG9tPXt9OworZG9qby5sYW5nLmdldFR5cGU9ZnVuY3Rpb24oXzkyYSl7Cit0cnl7CitpZihkb2pvLmxhbmcuaXNBcnJheShfOTJhKSl7CityZXR1cm4gImFycmF5IjsKK30KK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKF85MmEpKXsKK3JldHVybiAiZnVuY3Rpb24iOworfQoraWYoZG9qby5sYW5nLmlzU3RyaW5nKF85MmEpKXsKK3JldHVybiAic3RyaW5nIjsKK30KK2lmKGRvam8ubGFuZy5pc051bWJlcihfOTJhKSl7CityZXR1cm4gIm51bWJlciI7Cit9CitpZihkb2pvLmxhbmcuaXNCb29sZWFuKF85MmEpKXsKK3JldHVybiAiYm9vbGVhbiI7Cit9CitpZihkb2pvLmxhbmcuaXNBbGllbihfOTJhKSl7CityZXR1cm4gImFsaWVuIjsKK30KK2lmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChfOTJhKSl7CityZXR1cm4gInVuZGVmaW5lZCI7Cit9Citmb3IodmFyIG5hbWUgaW4gZG9qby5sYW5nLndoYXRBbUkuY3VzdG9tKXsKK2lmKGRvam8ubGFuZy53aGF0QW1JLmN1c3RvbVtuYW1lXShfOTJhKSl7CityZXR1cm4gbmFtZTsKK30KK30KK2lmKGRvam8ubGFuZy5pc09iamVjdChfOTJhKSl7CityZXR1cm4gIm9iamVjdCI7Cit9Cit9CitjYXRjaChlKXsKK30KK3JldHVybiAidW5rbm93biI7Cit9OworZG9qby5sYW5nLmlzTnVtZXJpYz1mdW5jdGlvbihfOTJjKXsKK3JldHVybiAoIWlzTmFOKF85MmMpJiZpc0Zpbml0ZShfOTJjKSYmKF85MmMhPW51bGwpJiYhZG9qby5sYW5nLmlzQm9vbGVhbihfOTJjKSYmIWRvam8ubGFuZy5pc0FycmF5KF85MmMpJiYhL15ccyokLy50ZXN0KF85MmMpKTsKK307Citkb2pvLmxhbmcuaXNCdWlsdEluPWZ1bmN0aW9uKF85MmQpeworcmV0dXJuIChkb2pvLmxhbmcuaXNBcnJheShfOTJkKXx8ZG9qby5sYW5nLmlzRnVuY3Rpb24oXzkyZCl8fGRvam8ubGFuZy5pc1N0cmluZyhfOTJkKXx8ZG9qby5sYW5nLmlzTnVtYmVyKF85MmQpfHxkb2pvLmxhbmcuaXNCb29sZWFuKF85MmQpfHwoXzkyZD09bnVsbCl8fChfOTJkIGluc3RhbmNlb2YgRXJyb3IpfHwodHlwZW9mIF85MmQ9PSJlcnJvciIpKTsKK307Citkb2pvLmxhbmcuaXNQdXJlT2JqZWN0PWZ1bmN0aW9uKF85MmUpeworcmV0dXJuICgoXzkyZSE9bnVsbCkmJmRvam8ubGFuZy5pc09iamVjdChfOTJlKSYmXzkyZS5jb25zdHJ1Y3Rvcj09T2JqZWN0KTsKK307Citkb2pvLmxhbmcuaXNPZlR5cGU9ZnVuY3Rpb24oXzkyZix0eXBlLF85MzEpewordmFyIF85MzI9ZmFsc2U7CitpZihfOTMxKXsKK185MzI9XzkzMVsib3B0aW9uYWwiXTsKK30KK2lmKF85MzImJigoXzkyZj09PW51bGwpfHxkb2pvLmxhbmcuaXNVbmRlZmluZWQoXzkyZikpKXsKK3JldHVybiB0cnVlOworfQoraWYoZG9qby5sYW5nLmlzQXJyYXkodHlwZSkpewordmFyIF85MzM9dHlwZTsKK2Zvcih2YXIgaSBpbiBfOTMzKXsKK3ZhciBfOTM1PV85MzNbaV07CitpZihkb2pvLmxhbmcuaXNPZlR5cGUoXzkyZixfOTM1KSl7CityZXR1cm4gdHJ1ZTsKK30KK30KK3JldHVybiBmYWxzZTsKK31lbHNleworaWYoZG9qby5sYW5nLmlzU3RyaW5nKHR5cGUpKXsKK3R5cGU9dHlwZS50b0xvd2VyQ2FzZSgpOworfQorc3dpdGNoKHR5cGUpeworY2FzZSBBcnJheToKK2Nhc2UgImFycmF5IjoKK3JldHVybiBkb2pvLmxhbmcuaXNBcnJheShfOTJmKTsKK2Nhc2UgRnVuY3Rpb246CitjYXNlICJmdW5jdGlvbiI6CityZXR1cm4gZG9qby5sYW5nLmlzRnVuY3Rpb24oXzkyZik7CitjYXNlIFN0cmluZzoKK2Nhc2UgInN0cmluZyI6CityZXR1cm4gZG9qby5sYW5nLmlzU3RyaW5nKF85MmYpOworY2FzZSBOdW1iZXI6CitjYXNlICJudW1iZXIiOgorcmV0dXJuIGRvam8ubGFuZy5pc051bWJlcihfOTJmKTsKK2Nhc2UgIm51bWVyaWMiOgorcmV0dXJuIGRvam8ubGFuZy5pc051bWVyaWMoXzkyZik7CitjYXNlIEJvb2xlYW46CitjYXNlICJib29sZWFuIjoKK3JldHVybiBkb2pvLmxhbmcuaXNCb29sZWFuKF85MmYpOworY2FzZSBPYmplY3Q6CitjYXNlICJvYmplY3QiOgorcmV0dXJuIGRvam8ubGFuZy5pc09iamVjdChfOTJmKTsKK2Nhc2UgInB1cmVvYmplY3QiOgorcmV0dXJuIGRvam8ubGFuZy5pc1B1cmVPYmplY3QoXzkyZik7CitjYXNlICJidWlsdGluIjoKK3JldHVybiBkb2pvLmxhbmcuaXNCdWlsdEluKF85MmYpOworY2FzZSAiYWxpZW4iOgorcmV0dXJuIGRvam8ubGFuZy5pc0FsaWVuKF85MmYpOworY2FzZSAidW5kZWZpbmVkIjoKK3JldHVybiBkb2pvLmxhbmcuaXNVbmRlZmluZWQoXzkyZik7CitjYXNlIG51bGw6CitjYXNlICJudWxsIjoKK3JldHVybiAoXzkyZj09PW51bGwpOworY2FzZSAib3B0aW9uYWwiOgorZG9qby5kZXByZWNhdGVkKCJkb2pvLmxhbmcuaXNPZlR5cGUodmFsdWUsIFt0eXBlLCBcIm9wdGlvbmFsXCJdKSIsInVzZSBkb2pvLmxhbmcuaXNPZlR5cGUodmFsdWUsIHR5cGUsIHtvcHRpb25hbDogdHJ1ZX0gKSBpbnN0ZWFkIiwiMC41Iik7CityZXR1cm4gKChfOTJmPT09bnVsbCl8fGRvam8ubGFuZy5pc1VuZGVmaW5lZChfOTJmKSk7CitkZWZhdWx0OgoraWYoZG9qby5sYW5nLmlzRnVuY3Rpb24odHlwZSkpeworcmV0dXJuIChfOTJmIGluc3RhbmNlb2YgdHlwZSk7Cit9ZWxzZXsKK2Rvam8ucmFpc2UoImRvam8ubGFuZy5pc09mVHlwZSgpIHdhcyBwYXNzZWQgYW4gaW52YWxpZCB0eXBlIik7Cit9Cit9Cit9Citkb2pvLnJhaXNlKCJJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgYSBidWcgd2FzIGludHJvZHVjZWQgYWJvdmUuIik7Cit9OworZG9qby5sYW5nLmdldE9iamVjdD1mdW5jdGlvbihzdHIpewordmFyIF85Mzc9c3RyLnNwbGl0KCIuIiksaT0wLG9iaj1kal9nbG9iYWw7Citkb3sKK29iaj1vYmpbXzkzN1tpKytdXTsKK313aGlsZShpPF85MzcubGVuZ3RoJiZvYmopOworcmV0dXJuIChvYmohPWRqX2dsb2JhbCk/b2JqOm51bGw7Cit9OworZG9qby5sYW5nLmRvZXNPYmplY3RFeGlzdD1mdW5jdGlvbihzdHIpewordmFyIF85M2I9c3RyLnNwbGl0KCIuIiksaT0wLG9iaj1kal9nbG9iYWw7Citkb3sKK29iaj1vYmpbXzkzYltpKytdXTsKK313aGlsZShpPF85M2IubGVuZ3RoJiZvYmopOworcmV0dXJuIChvYmomJm9iaiE9ZGpfZ2xvYmFsKTsKK307Citkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5hc3NlcnQiKTsKK2Rvam8ubGFuZy5hc3NlcnQ9ZnVuY3Rpb24oXzkzZSxfOTNmKXsKK2lmKCFfOTNlKXsKK3ZhciBfOTQwPSJBbiBhc3NlcnQgc3RhdGVtZW50IGZhaWxlZC5cbiIrIlRoZSBtZXRob2QgZG9qby5sYW5nLmFzc2VydCgpIHdhcyBjYWxsZWQgd2l0aCBhICdmYWxzZScgdmFsdWUuXG4iOworaWYoXzkzZil7CitfOTQwKz0iSGVyZSdzIHRoZSBhc3NlcnQgbWVzc2FnZTpcbiIrXzkzZisiXG4iOworfQordGhyb3cgbmV3IEVycm9yKF85NDApOworfQorfTsKK2Rvam8ubGFuZy5hc3NlcnRUeXBlPWZ1bmN0aW9uKF85NDEsdHlwZSxfOTQzKXsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyhfOTQzKSl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ubGFuZy5hc3NlcnRUeXBlKHZhbHVlLCB0eXBlLCBcIm1lc3NhZ2VcIikiLCJ1c2UgZG9qby5sYW5nLmFzc2VydFR5cGUodmFsdWUsIHR5cGUpIGluc3RlYWQiLCIwLjUiKTsKK30KK2lmKCFkb2pvLmxhbmcuaXNPZlR5cGUoXzk0MSx0eXBlLF85NDMpKXsKK2lmKCFkb2pvLmxhbmcuYXNzZXJ0VHlwZS5fZXJyb3JNZXNzYWdlKXsKK2Rvam8ubGFuZy5hc3NlcnRUeXBlLl9lcnJvck1lc3NhZ2U9IlR5cGUgbWlzbWF0Y2g6IGRvam8ubGFuZy5hc3NlcnRUeXBlKCkgZmFpbGVkLiI7Cit9Citkb2pvLmxhbmcuYXNzZXJ0KGZhbHNlLGRvam8ubGFuZy5hc3NlcnRUeXBlLl9lcnJvck1lc3NhZ2UpOworfQorfTsKK2Rvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzPWZ1bmN0aW9uKF85NDQsXzk0NSxfOTQ2KXsKK3ZhciBrZXk7CitpZighXzk0Nil7CitpZighZG9qby5sYW5nLmFzc2VydFZhbGlkS2V5d29yZHMuX2Vycm9yTWVzc2FnZSl7Citkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcy5fZXJyb3JNZXNzYWdlPSJJbiBkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3JkcygpLCBmb3VuZCBpbnZhbGlkIGtleXdvcmQ6IjsKK30KK185NDY9ZG9qby5sYW5nLmFzc2VydFZhbGlkS2V5d29yZHMuX2Vycm9yTWVzc2FnZTsKK30KK2lmKGRvam8ubGFuZy5pc0FycmF5KF85NDUpKXsKK2ZvcihrZXkgaW4gXzk0NCl7CitpZighZG9qby5sYW5nLmluQXJyYXkoXzk0NSxrZXkpKXsKK2Rvam8ubGFuZy5hc3NlcnQoZmFsc2UsXzk0NisiICIra2V5KTsKK30KK30KK31lbHNleworZm9yKGtleSBpbiBfOTQ0KXsKK2lmKCEoa2V5IGluIF85NDUpKXsKK2Rvam8ubGFuZy5hc3NlcnQoZmFsc2UsXzk0NisiICIra2V5KTsKK30KK30KK30KK307Citkb2pvLnByb3ZpZGUoImRvam8uQWRhcHRlclJlZ2lzdHJ5Iik7Citkb2pvLkFkYXB0ZXJSZWdpc3RyeT1mdW5jdGlvbihfOTQ4KXsKK3RoaXMucGFpcnM9W107Cit0aGlzLnJldHVybldyYXBwZXJzPV85NDh8fGZhbHNlOworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5BZGFwdGVyUmVnaXN0cnkse3JlZ2lzdGVyOmZ1bmN0aW9uKG5hbWUsXzk0YSx3cmFwLF85NGMsXzk0ZCl7Cit2YXIgdHlwZT0oXzk0ZCk/InVuc2hpZnQiOiJwdXNoIjsKK3RoaXMucGFpcnNbdHlwZV0oW25hbWUsXzk0YSx3cmFwLF85NGNdKTsKK30sbWF0Y2g6ZnVuY3Rpb24oKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5wYWlycy5sZW5ndGg7aSsrKXsKK3ZhciBwYWlyPXRoaXMucGFpcnNbaV07CitpZihwYWlyWzFdLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7CitpZigocGFpclszXSl8fCh0aGlzLnJldHVybldyYXBwZXJzKSl7CityZXR1cm4gcGFpclsyXTsKK31lbHNleworcmV0dXJuIHBhaXJbMl0uYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorfQorfQordGhyb3cgbmV3IEVycm9yKCJObyBtYXRjaCBmb3VuZCIpOworfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKG5hbWUpeworZm9yKHZhciBpPTA7aTx0aGlzLnBhaXJzLmxlbmd0aDtpKyspewordmFyIHBhaXI9dGhpcy5wYWlyc1tpXTsKK2lmKHBhaXJbMF09PW5hbWUpewordGhpcy5wYWlycy5zcGxpY2UoaSwxKTsKK3JldHVybiB0cnVlOworfQorfQorcmV0dXJuIGZhbHNlOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcucmVwciIpOworZG9qby5sYW5nLnJlcHJSZWdpc3RyeT1uZXcgZG9qby5BZGFwdGVyUmVnaXN0cnkoKTsKK2Rvam8ubGFuZy5yZWdpc3RlclJlcHI9ZnVuY3Rpb24obmFtZSxfOTU1LHdyYXAsXzk1Nyl7Citkb2pvLmxhbmcucmVwclJlZ2lzdHJ5LnJlZ2lzdGVyKG5hbWUsXzk1NSx3cmFwLF85NTcpOworfTsKK2Rvam8ubGFuZy5yZXByPWZ1bmN0aW9uKG9iail7CitpZih0eXBlb2YgKG9iaik9PSJ1bmRlZmluZWQiKXsKK3JldHVybiAidW5kZWZpbmVkIjsKK31lbHNleworaWYob2JqPT09bnVsbCl7CityZXR1cm4gIm51bGwiOworfQorfQordHJ5eworaWYodHlwZW9mIChvYmpbIl9fcmVwcl9fIl0pPT0iZnVuY3Rpb24iKXsKK3JldHVybiBvYmpbIl9fcmVwcl9fIl0oKTsKK31lbHNleworaWYoKHR5cGVvZiAob2JqWyJyZXByIl0pPT0iZnVuY3Rpb24iKSYmKG9iai5yZXByIT1hcmd1bWVudHMuY2FsbGVlKSl7CityZXR1cm4gb2JqWyJyZXByIl0oKTsKK30KK30KK3JldHVybiBkb2pvLmxhbmcucmVwclJlZ2lzdHJ5Lm1hdGNoKG9iaik7Cit9CitjYXRjaChlKXsKK2lmKHR5cGVvZiAob2JqLk5BTUUpPT0ic3RyaW5nIiYmKG9iai50b1N0cmluZz09RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nfHxvYmoudG9TdHJpbmc9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpKXsKK3JldHVybiBvYmouTkFNRTsKK30KK30KK2lmKHR5cGVvZiAob2JqKT09ImZ1bmN0aW9uIil7CitvYmo9KG9iaisiIikucmVwbGFjZSgvXlxzKy8sIiIpOwordmFyIGlkeD1vYmouaW5kZXhPZigieyIpOworaWYoaWR4IT0tMSl7CitvYmo9b2JqLnN1YnN0cigwLGlkeCkrInsuLi59IjsKK30KK30KK3JldHVybiBvYmorIiI7Cit9OworZG9qby5sYW5nLnJlcHJBcnJheUxpa2U9ZnVuY3Rpb24oYXJyKXsKK3RyeXsKK3ZhciBuYT1kb2pvLmxhbmcubWFwKGFycixkb2pvLmxhbmcucmVwcik7CityZXR1cm4gIlsiK25hLmpvaW4oIiwgIikrIl0iOworfQorY2F0Y2goZSl7Cit9Cit9OworKGZ1bmN0aW9uKCl7Cit2YXIgbT1kb2pvLmxhbmc7CittLnJlZ2lzdGVyUmVwcigiYXJyYXlMaWtlIixtLmlzQXJyYXlMaWtlLG0ucmVwckFycmF5TGlrZSk7CittLnJlZ2lzdGVyUmVwcigic3RyaW5nIixtLmlzU3RyaW5nLG0ucmVwclN0cmluZyk7CittLnJlZ2lzdGVyUmVwcigibnVtYmVycyIsbS5pc051bWJlcixtLnJlcHJOdW1iZXIpOworbS5yZWdpc3RlclJlcHIoImJvb2xlYW4iLG0uaXNCb29sZWFuLG0ucmVwck51bWJlcik7Cit9KSgpOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5sYW5nLmNvbW1vbiIsImRvam8ubGFuZy5hc3NlcnQiLCJkb2pvLmxhbmcuYXJyYXkiLCJkb2pvLmxhbmcudHlwZSIsImRvam8ubGFuZy5mdW5jIiwiZG9qby5sYW5nLmV4dHJhcyIsImRvam8ubGFuZy5yZXByIiwiZG9qby5sYW5nLmRlY2xhcmUiXX0pOworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuKiIpOworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuaWZyYW1lIik7Citkb2pvLmh0bWwuaWZyYW1lQ29udGVudFdpbmRvdz1mdW5jdGlvbihfOTVkKXsKK3ZhciB3aW49ZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KGRvam8uaHRtbC5pZnJhbWVDb250ZW50RG9jdW1lbnQoXzk1ZCkpfHxkb2pvLmh0bWwuaWZyYW1lQ29udGVudERvY3VtZW50KF85NWQpLl9fcGFyZW50X198fChfOTVkLm5hbWUmJmRvY3VtZW50LmZyYW1lc1tfOTVkLm5hbWVdKXx8bnVsbDsKK3JldHVybiB3aW47Cit9OworZG9qby5odG1sLmlmcmFtZUNvbnRlbnREb2N1bWVudD1mdW5jdGlvbihfOTVmKXsKK3ZhciBkb2M9Xzk1Zi5jb250ZW50RG9jdW1lbnR8fCgoXzk1Zi5jb250ZW50V2luZG93KSYmKF85NWYuY29udGVudFdpbmRvdy5kb2N1bWVudCkpfHwoKF85NWYubmFtZSkmJihkb2N1bWVudC5mcmFtZXNbXzk1Zi5uYW1lXSkmJihkb2N1bWVudC5mcmFtZXNbXzk1Zi5uYW1lXS5kb2N1bWVudCkpfHxudWxsOworcmV0dXJuIGRvYzsKK307Citkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZT1mdW5jdGlvbihub2RlKXsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWU1NXx8ZG9qby5yZW5kZXIuaHRtbC5pZTYwKXsKK3ZhciBodG1sPSI8aWZyYW1lIHNyYz0namF2YXNjcmlwdDpmYWxzZSciKyIgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMHB4OyB0b3A6IDBweDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsiKyJ6LWluZGV4OiAtMTsgZmlsdGVyOkFscGhhKE9wYWNpdHk9XCIwXCIpOycgIisiPiI7Cit0aGlzLmlmcmFtZT1kb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoaHRtbCk7Cit0aGlzLmlmcmFtZS50YWJJbmRleD0tMTsKK2lmKG5vZGUpeworbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmlmcmFtZSk7Cit0aGlzLmRvbU5vZGU9bm9kZTsKK31lbHNleworZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5pZnJhbWUpOwordGhpcy5pZnJhbWUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9Cit9Cit9OworZG9qby5sYW5nLmV4dGVuZChkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSx7aWZyYW1lOm51bGwsb25SZXNpemVkOmZ1bmN0aW9uKCl7CitpZih0aGlzLmlmcmFtZSYmdGhpcy5kb21Ob2RlJiZ0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSl7Cit2YXIgXzk2Mz1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CitpZihfOTYzLndpZHRoPT0wfHxfOTYzLmhlaWdodD09MCl7Citkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLHRoaXMub25SZXNpemVkLDEwMCk7CityZXR1cm47Cit9Cit0aGlzLmlmcmFtZS5zdHlsZS53aWR0aD1fOTYzLndpZHRoKyJweCI7Cit0aGlzLmlmcmFtZS5zdHlsZS5oZWlnaHQ9Xzk2My5oZWlnaHQrInB4IjsKK30KK30sc2l6ZTpmdW5jdGlvbihub2RlKXsKK2lmKCF0aGlzLmlmcmFtZSl7CityZXR1cm47Cit9Cit2YXIgXzk2NT1kb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KG5vZGUsdHJ1ZSxkb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gpOword2l0aCh0aGlzLmlmcmFtZS5zdHlsZSl7Cit3aWR0aD1fOTY1LndpZHRoKyJweCI7CitoZWlnaHQ9Xzk2NS5oZWlnaHQrInB4IjsKK2xlZnQ9Xzk2NS5sZWZ0KyJweCI7Cit0b3A9Xzk2NS50b3ArInB4IjsKK30KK30sc2V0WkluZGV4OmZ1bmN0aW9uKG5vZGUpeworaWYoIXRoaXMuaWZyYW1lKXsKK3JldHVybjsKK30KK2lmKGRvam8uZG9tLmlzTm9kZShub2RlKSl7Cit0aGlzLmlmcmFtZS5zdHlsZS56SW5kZXg9ZG9qby5odG1sLmdldFN0eWxlKG5vZGUsInotaW5kZXgiKS0xOworfWVsc2V7CitpZighaXNOYU4obm9kZSkpewordGhpcy5pZnJhbWUuc3R5bGUuekluZGV4PW5vZGU7Cit9Cit9Cit9LHNob3c6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuaWZyYW1lKXsKK3RoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsKK30KK30saGlkZTpmdW5jdGlvbigpeworaWYodGhpcy5pZnJhbWUpewordGhpcy5pZnJhbWUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9Cit9LHJlbW92ZTpmdW5jdGlvbigpeworaWYodGhpcy5pZnJhbWUpeworZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5pZnJhbWUsdHJ1ZSk7CitkZWxldGUgdGhpcy5pZnJhbWU7Cit0aGlzLmlmcmFtZT1udWxsOworfQorfX0pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lciIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UiLG51bGwsZnVuY3Rpb24oKXsKK3RoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaD1bXTsKK30se2lzU2hvd2luZ05vdzpmYWxzZSxjdXJyZW50U3VicG9wdXA6bnVsbCxiZWdpblpJbmRleDoxMDAwLHBhcmVudFBvcHVwOm51bGwscGFyZW50Om51bGwscG9wdXBJbmRleDowLGFyb3VuZEJveDpkb2pvLmh0bWwuYm94U2l6aW5nLkJPUkRFUl9CT1gsb3BlbmVkRm9yV2luZG93Om51bGwscHJvY2Vzc0tleTpmdW5jdGlvbihldnQpeworcmV0dXJuIGZhbHNlOworfSxhcHBseVBvcHVwQmFzaWNTdHlsZTpmdW5jdGlvbigpeword2l0aCh0aGlzLmRvbU5vZGUuc3R5bGUpeworZGlzcGxheT0ibm9uZSI7Citwb3NpdGlvbj0iYWJzb2x1dGUiOworfQorfSxhYm91dFRvU2hvdzpmdW5jdGlvbigpeworfSxvcGVuOmZ1bmN0aW9uKHgseSxfOTZhLF85NmIsXzk2YyxfOTZkKXsKK2lmKHRoaXMuaXNTaG93aW5nTm93KXsKK3JldHVybjsKK30KK2lmKHRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcyl7Cit0aGlzLnF1ZXVlT25BbmltYXRpb25GaW5pc2gucHVzaCh0aGlzLm9wZW4sYXJndW1lbnRzKTsKK3JldHVybjsKK30KK3RoaXMuYWJvdXRUb1Nob3coKTsKK3ZhciBfOTZlPWZhbHNlLG5vZGUsXzk3MDsKK2lmKHR5cGVvZiB4PT0ib2JqZWN0Iil7Citub2RlPXg7CitfOTcwPV85NmI7CitfOTZiPV85NmE7CitfOTZhPXk7CitfOTZlPXRydWU7Cit9Cit0aGlzLnBhcmVudD1fOTZhOworZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKK185NmI9Xzk2Ynx8Xzk2YVsiZG9tTm9kZSJdfHxbXTsKK3ZhciBfOTcxPW51bGw7Cit0aGlzLmlzVG9wTGV2ZWw9dHJ1ZTsKK3doaWxlKF85NmEpeworaWYoXzk2YSE9PXRoaXMmJihfOTZhLnNldE9wZW5lZFN1YnBvcHVwIT11bmRlZmluZWQmJl85NmEuYXBwbHlQb3B1cEJhc2ljU3R5bGUhPXVuZGVmaW5lZCkpeworXzk3MT1fOTZhOwordGhpcy5pc1RvcExldmVsPWZhbHNlOworXzk3MS5zZXRPcGVuZWRTdWJwb3B1cCh0aGlzKTsKK2JyZWFrOworfQorXzk2YT1fOTZhLnBhcmVudDsKK30KK3RoaXMucGFyZW50UG9wdXA9Xzk3MTsKK3RoaXMucG9wdXBJbmRleD1fOTcxP185NzEucG9wdXBJbmRleCsxOjE7CitpZih0aGlzLmlzVG9wTGV2ZWwpewordmFyIF85NzI9ZG9qby5odG1sLmlzTm9kZShfOTZiKT9fOTZiOm51bGw7Citkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIub3BlbmVkKHRoaXMsXzk3Mik7Cit9CitpZih0aGlzLmlzVG9wTGV2ZWwmJiFkb2pvLndpdGhHbG9iYWwodGhpcy5vcGVuZWRGb3JXaW5kb3d8fGRvam8uZ2xvYmFsKCksZG9qby5odG1sLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCkpewordGhpcy5fYm9va21hcms9ZG9qby53aXRoR2xvYmFsKHRoaXMub3BlbmVkRm9yV2luZG93fHxkb2pvLmdsb2JhbCgpLGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0Qm9va21hcmspOworfWVsc2V7Cit0aGlzLl9ib29rbWFyaz1udWxsOworfQoraWYoXzk2YiBpbnN0YW5jZW9mIEFycmF5KXsKK185NmI9e2xlZnQ6Xzk2YlswXSx0b3A6Xzk2YlsxXSx3aWR0aDowLGhlaWdodDowfTsKK30KK3dpdGgodGhpcy5kb21Ob2RlLnN0eWxlKXsKK2Rpc3BsYXk9IiI7Cit6SW5kZXg9dGhpcy5iZWdpblpJbmRleCt0aGlzLnBvcHVwSW5kZXg7Cit9CitpZihfOTZlKXsKK3RoaXMubW92ZShub2RlLF85NmQsXzk3MCk7Cit9ZWxzZXsKK3RoaXMubW92ZSh4LHksXzk2ZCxfOTZjKTsKK30KK3RoaXMuZG9tTm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIjsKK3RoaXMuZXhwbG9kZVNyYz1fOTZiOwordGhpcy5zaG93KCk7Cit0aGlzLmlzU2hvd2luZ05vdz10cnVlOworfSxtb3ZlOmZ1bmN0aW9uKHgseSxfOTc1LF85NzYpewordmFyIF85Nzc9KHR5cGVvZiB4PT0ib2JqZWN0Iik7CitpZihfOTc3KXsKK3ZhciBfOTc4PV85NzU7Cit2YXIgbm9kZT14OworXzk3NT15OworaWYoIV85NzgpeworXzk3OD17IkJMIjoiVEwiLCJUTCI6IkJMIn07Cit9Citkb2pvLmh0bWwucGxhY2VPblNjcmVlbkFyb3VuZEVsZW1lbnQodGhpcy5kb21Ob2RlLG5vZGUsXzk3NSx0aGlzLmFyb3VuZEJveCxfOTc4KTsKK31lbHNleworaWYoIV85NzYpeworXzk3Nj0iVEwsVFIsQkwsQlIiOworfQorZG9qby5odG1sLnBsYWNlT25TY3JlZW4odGhpcy5kb21Ob2RlLHgseSxfOTc1LHRydWUsXzk3Nik7Cit9Cit9LGNsb3NlOmZ1bmN0aW9uKF85N2EpeworaWYoXzk3YSl7Cit0aGlzLmRvbU5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9CitpZih0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3MpewordGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoLnB1c2godGhpcy5jbG9zZSxbXSk7CityZXR1cm47Cit9Cit0aGlzLmNsb3NlU3VicG9wdXAoXzk3YSk7Cit0aGlzLmhpZGUoKTsKK2lmKHRoaXMuYmdJZnJhbWUpewordGhpcy5iZ0lmcmFtZS5oaWRlKCk7Cit0aGlzLmJnSWZyYW1lLnNpemUoe2xlZnQ6MCx0b3A6MCx3aWR0aDowLGhlaWdodDowfSk7Cit9CitpZih0aGlzLmlzVG9wTGV2ZWwpeworZG9qby53aWRnZXQuUG9wdXBNYW5hZ2VyLmNsb3NlZCh0aGlzKTsKK30KK3RoaXMuaXNTaG93aW5nTm93PWZhbHNlOworaWYodGhpcy5wYXJlbnQpeworc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpewordHJ5eworaWYodGhpcy5wYXJlbnRbImZvY3VzIl0pewordGhpcy5wYXJlbnQuZm9jdXMoKTsKK31lbHNlewordGhpcy5wYXJlbnQuZG9tTm9kZS5mb2N1cygpOworfQorfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKCJObyBpZGVhIGhvdyB0byBmb2N1cyB0byBwYXJlbnQiLGUpOworfQorfSksMTApOworfQoraWYodGhpcy5fYm9va21hcmsmJmRvam8ud2l0aEdsb2JhbCh0aGlzLm9wZW5lZEZvcldpbmRvd3x8ZG9qby5nbG9iYWwoKSxkb2pvLmh0bWwuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSl7CitpZih0aGlzLm9wZW5lZEZvcldpbmRvdyl7Cit0aGlzLm9wZW5lZEZvcldpbmRvdy5mb2N1cygpOworfQordHJ5eworZG9qby53aXRoR2xvYmFsKHRoaXMub3BlbmVkRm9yV2luZG93fHxkb2pvLmdsb2JhbCgpLCJtb3ZlVG9Cb29rbWFyayIsZG9qby5odG1sLnNlbGVjdGlvbixbdGhpcy5fYm9va21hcmtdKTsKK30KK2NhdGNoKGUpeworfQorfQordGhpcy5fYm9va21hcms9bnVsbDsKK30sY2xvc2VBbGw6ZnVuY3Rpb24oXzk3Yil7CitpZih0aGlzLnBhcmVudFBvcHVwKXsKK3RoaXMucGFyZW50UG9wdXAuY2xvc2VBbGwoXzk3Yik7Cit9ZWxzZXsKK3RoaXMuY2xvc2UoXzk3Yik7Cit9Cit9LHNldE9wZW5lZFN1YnBvcHVwOmZ1bmN0aW9uKF85N2MpewordGhpcy5jdXJyZW50U3VicG9wdXA9Xzk3YzsKK30sY2xvc2VTdWJwb3B1cDpmdW5jdGlvbihfOTdkKXsKK2lmKHRoaXMuY3VycmVudFN1YnBvcHVwPT1udWxsKXsKK3JldHVybjsKK30KK3RoaXMuY3VycmVudFN1YnBvcHVwLmNsb3NlKF85N2QpOwordGhpcy5jdXJyZW50U3VicG9wdXA9bnVsbDsKK30sb25TaG93OmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lci5zdXBlcmNsYXNzLm9uU2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit0aGlzLm9wZW5lZFNpemU9e3c6dGhpcy5kb21Ob2RlLnN0eWxlLndpZHRoLGg6dGhpcy5kb21Ob2RlLnN0eWxlLmhlaWdodH07CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2lmKCF0aGlzLmJnSWZyYW1lKXsKK3RoaXMuYmdJZnJhbWU9bmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKCk7Cit0aGlzLmJnSWZyYW1lLnNldFpJbmRleCh0aGlzLmRvbU5vZGUpOworfQordGhpcy5iZ0lmcmFtZS5zaXplKHRoaXMuZG9tTm9kZSk7Cit0aGlzLmJnSWZyYW1lLnNob3coKTsKK30KK3RoaXMucHJvY2Vzc1F1ZXVlKCk7Cit9LHByb2Nlc3NRdWV1ZTpmdW5jdGlvbigpeworaWYoIXRoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaC5sZW5ndGgpeworcmV0dXJuOworfQordmFyIGZ1bmM9dGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoLnNoaWZ0KCk7Cit2YXIgYXJncz10aGlzLnF1ZXVlT25BbmltYXRpb25GaW5pc2guc2hpZnQoKTsKK2Z1bmMuYXBwbHkodGhpcyxhcmdzKTsKK30sb25IaWRlOmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnByb3RvdHlwZS5vbkhpZGUuY2FsbCh0aGlzKTsKK2lmKHRoaXMub3BlbmVkU2l6ZSl7Cit3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7Cit3aWR0aD10aGlzLm9wZW5lZFNpemUudzsKK2hlaWdodD10aGlzLm9wZW5lZFNpemUuaDsKK30KK30KK3RoaXMucHJvY2Vzc1F1ZXVlKCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyIixbZG9qby53aWRnZXQuSHRtbFdpZGdldCxkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2VdLHtpc0NvbnRhaW5lcjp0cnVlLGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKCl7Cit0aGlzLmFwcGx5UG9wdXBCYXNpY1N0eWxlKCk7Citkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK319KTsKK2Rvam8ud2lkZ2V0LlBvcHVwTWFuYWdlcj1uZXcgZnVuY3Rpb24oKXsKK3RoaXMuY3VycmVudE1lbnU9bnVsbDsKK3RoaXMuY3VycmVudEJ1dHRvbj1udWxsOwordGhpcy5jdXJyZW50Rm9jdXNNZW51PW51bGw7Cit0aGlzLmZvY3VzTm9kZT1udWxsOwordGhpcy5yZWdpc3RlcmVkV2luZG93cz1bXTsKK3RoaXMucmVnaXN0ZXJXaW49ZnVuY3Rpb24od2luKXsKK2lmKCF3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkKXsKK2Rvam8uZXZlbnQuY29ubmVjdCh3aW4uZG9jdW1lbnQsIm9ubW91c2Vkb3duIix0aGlzLCJvbkNsaWNrIik7Citkb2pvLmV2ZW50LmNvbm5lY3Qod2luLCJvbnNjcm9sbCIsdGhpcywib25DbGljayIpOworZG9qby5ldmVudC5jb25uZWN0KHdpbi5kb2N1bWVudCwib25rZXkiLHRoaXMsIm9uS2V5Iik7Cit3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkPXRydWU7Cit0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzLnB1c2god2luKTsKK30KK307Cit0aGlzLnJlZ2lzdGVyQWxsV2luZG93cz1mdW5jdGlvbihfOTgxKXsKK2lmKCFfOTgxKXsKK185ODE9ZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KHdpbmRvdy50b3AmJndpbmRvdy50b3AuZG9jdW1lbnR8fHdpbmRvdy5kb2N1bWVudCk7Cit9Cit0aGlzLnJlZ2lzdGVyV2luKF85ODEpOworZm9yKHZhciBpPTA7aTxfOTgxLmZyYW1lcy5sZW5ndGg7aSsrKXsKK3RyeXsKK3ZhciB3aW49ZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KF85ODEuZnJhbWVzW2ldLmRvY3VtZW50KTsKK2lmKHdpbil7Cit0aGlzLnJlZ2lzdGVyQWxsV2luZG93cyh3aW4pOworfQorfQorY2F0Y2goZSl7Cit9Cit9Cit9OwordGhpcy51blJlZ2lzdGVyV2luPWZ1bmN0aW9uKHdpbil7CitpZih3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkKXsKK2Rvam8uZXZlbnQuZGlzY29ubmVjdCh3aW4uZG9jdW1lbnQsIm9ubW91c2Vkb3duIix0aGlzLCJvbkNsaWNrIik7Citkb2pvLmV2ZW50LmRpc2Nvbm5lY3Qod2luLCJvbnNjcm9sbCIsdGhpcywib25DbGljayIpOworZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbi5kb2N1bWVudCwib25rZXkiLHRoaXMsIm9uS2V5Iik7Cit3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkPWZhbHNlOworfQorfTsKK3RoaXMudW5SZWdpc3RlckFsbFdpbmRvd3M9ZnVuY3Rpb24oKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5yZWdpc3RlcmVkV2luZG93cy5sZW5ndGg7KytpKXsKK3RoaXMudW5SZWdpc3Rlcldpbih0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzW2ldKTsKK30KK3RoaXMucmVnaXN0ZXJlZFdpbmRvd3M9W107Cit9OworZG9qby5hZGRPbkxvYWQodGhpcywicmVnaXN0ZXJBbGxXaW5kb3dzIik7Citkb2pvLmFkZE9uVW5sb2FkKHRoaXMsInVuUmVnaXN0ZXJBbGxXaW5kb3dzIik7Cit0aGlzLmNsb3NlZD1mdW5jdGlvbihtZW51KXsKK2lmKHRoaXMuY3VycmVudE1lbnU9PW1lbnUpewordGhpcy5jdXJyZW50TWVudT1udWxsOwordGhpcy5jdXJyZW50QnV0dG9uPW51bGw7Cit0aGlzLmN1cnJlbnRGb2N1c01lbnU9bnVsbDsKK30KK307Cit0aGlzLm9wZW5lZD1mdW5jdGlvbihtZW51LF85ODgpeworaWYobWVudT09dGhpcy5jdXJyZW50TWVudSl7CityZXR1cm47Cit9CitpZih0aGlzLmN1cnJlbnRNZW51KXsKK3RoaXMuY3VycmVudE1lbnUuY2xvc2UoKTsKK30KK3RoaXMuY3VycmVudE1lbnU9bWVudTsKK3RoaXMuY3VycmVudEZvY3VzTWVudT1tZW51OwordGhpcy5jdXJyZW50QnV0dG9uPV85ODg7Cit9OwordGhpcy5zZXRGb2N1c2VkTWVudT1mdW5jdGlvbihtZW51KXsKK3RoaXMuY3VycmVudEZvY3VzTWVudT1tZW51OworfTsKK3RoaXMub25LZXk9ZnVuY3Rpb24oZSl7CitpZighZS5rZXkpeworcmV0dXJuOworfQoraWYoIXRoaXMuY3VycmVudE1lbnV8fCF0aGlzLmN1cnJlbnRNZW51LmlzU2hvd2luZ05vdyl7CityZXR1cm47Cit9Cit2YXIgbT10aGlzLmN1cnJlbnRGb2N1c01lbnU7Cit3aGlsZShtKXsKK2lmKG0ucHJvY2Vzc0tleShlKSl7CitlLnByZXZlbnREZWZhdWx0KCk7CitlLnN0b3BQcm9wYWdhdGlvbigpOworYnJlYWs7Cit9CittPW0ucGFyZW50UG9wdXB8fG0ucGFyZW50TWVudTsKK30KK30sdGhpcy5vbkNsaWNrPWZ1bmN0aW9uKGUpeworaWYoIXRoaXMuY3VycmVudE1lbnUpeworcmV0dXJuOworfQordmFyIF85OGQ9ZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKK3ZhciBtPXRoaXMuY3VycmVudE1lbnU7Cit3aGlsZShtKXsKK2lmKGRvam8uaHRtbC5vdmVyRWxlbWVudChtLmRvbU5vZGUsZSl8fGRvam8uaHRtbC5pc0Rlc2NlbmRhbnRPZihlLnRhcmdldCxtLmRvbU5vZGUpKXsKK3JldHVybjsKK30KK209bS5jdXJyZW50U3VicG9wdXA7Cit9CitpZih0aGlzLmN1cnJlbnRCdXR0b24mJmRvam8uaHRtbC5vdmVyRWxlbWVudCh0aGlzLmN1cnJlbnRCdXR0b24sZSkpeworcmV0dXJuOworfQordGhpcy5jdXJyZW50TWVudS5jbG9zZUFsbCh0cnVlKTsKK307Cit9OworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Db2xvclBhbGV0dGUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuQ29sb3JQYWxldHRlIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LHtwYWxldHRlOiI3eDEwIixfcGFsZXR0ZXM6eyI3eDEwIjpbWyJmZmYiLCJmY2MiLCJmYzkiLCJmZjkiLCJmZmMiLCI5ZjkiLCI5ZmYiLCJjZmYiLCJjY2YiLCJmY2YiXSxbImNjYyIsImY2NiIsImY5NiIsImZmNiIsImZmMyIsIjZmOSIsIjNmZiIsIjZmZiIsIjk5ZiIsImY5ZiJdLFsiYzBjMGMwIiwiZjAwIiwiZjkwIiwiZmM2IiwiZmYwIiwiM2YzIiwiNmNjIiwiM2NmIiwiNjZjIiwiYzZjIl0sWyI5OTkiLCJjMDAiLCJmNjAiLCJmYzMiLCJmYzAiLCIzYzAiLCIwY2MiLCIzNmYiLCI2M2YiLCJjM2MiXSxbIjY2NiIsIjkwMCIsImM2MCIsImM5MyIsIjk5MCIsIjA5MCIsIjM5OSIsIjMzZiIsIjYwYyIsIjkzOSJdLFsiMzMzIiwiNjAwIiwiOTMwIiwiOTYzIiwiNjYwIiwiMDYwIiwiMzY2IiwiMDA5IiwiMzM5IiwiNjM2Il0sWyIwMDAiLCIzMDAiLCI2MzAiLCI2MzMiLCIzMzAiLCIwMzAiLCIwMzMiLCIwMDYiLCIzMDkiLCIzMDMiXV0sIjN4NCI6W1siZmZmZmZmIiwiMDBmZjAwIiwiMDA4MDAwIiwiMDAwMGZmIl0sWyJjMGMwYzAiLCJmZmZmMDAiLCJmZjAwZmYiLCIwMDAwODAiXSxbIjgwODA4MCIsImZmMDAwMCIsIjgwMDA4MCIsIjAwMDAwMCJdXX0sYnVpbGRSZW5kZXJpbmc6ZnVuY3Rpb24oKXsKK3RoaXMuZG9tTm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOworZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbU5vZGUsIm9ubW91c2Vkb3duIixmdW5jdGlvbihlKXsKK2UucHJldmVudERlZmF1bHQoKTsKK30pOword2l0aCh0aGlzLmRvbU5vZGUpeworY2VsbFBhZGRpbmc9IjAiOworY2VsbFNwYWNpbmc9IjEiOworYm9yZGVyPSIxIjsKK3N0eWxlLmJhY2tncm91bmRDb2xvcj0id2hpdGUiOworfQordmFyIF85OTA9dGhpcy5fcGFsZXR0ZXNbdGhpcy5wYWxldHRlXTsKK2Zvcih2YXIgaT0wO2k8Xzk5MC5sZW5ndGg7aSsrKXsKK3ZhciB0cj10aGlzLmRvbU5vZGUuaW5zZXJ0Um93KC0xKTsKK2Zvcih2YXIgaj0wO2o8Xzk5MFtpXS5sZW5ndGg7aisrKXsKK2lmKF85OTBbaV1bal0ubGVuZ3RoPT0zKXsKK185OTBbaV1bal09Xzk5MFtpXVtqXS5yZXBsYWNlKC8oLikoLikoLikvLCIkMSQxJDIkMiQzJDMiKTsKK30KK3ZhciB0ZD10ci5pbnNlcnRDZWxsKC0xKTsKK3dpdGgodGQuc3R5bGUpeworYmFja2dyb3VuZENvbG9yPSIjIitfOTkwW2ldW2pdOworYm9yZGVyPSIxcHggc29saWQgZ3JheSI7Cit3aWR0aD1oZWlnaHQ9IjE1cHgiOworZm9udFNpemU9IjFweCI7Cit9Cit0ZC5jb2xvcj0iIyIrXzk5MFtpXVtqXTsKK3RkLm9ubW91c2VvdmVyPWZ1bmN0aW9uKGUpewordGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0id2hpdGUiOworfTsKK3RkLm9ubW91c2VvdXQ9ZnVuY3Rpb24oZSl7Cit0aGlzLnN0eWxlLmJvcmRlckNvbG9yPSJncmF5IjsKK307Citkb2pvLmV2ZW50LmNvbm5lY3QodGQsIm9ubW91c2Vkb3duIix0aGlzLCJvbkNsaWNrIik7Cit0ZC5pbm5lckhUTUw9IiZuYnNwOyI7Cit9Cit9Cit9LG9uQ2xpY2s6ZnVuY3Rpb24oZSl7Cit0aGlzLm9uQ29sb3JTZWxlY3QoZS5jdXJyZW50VGFyZ2V0LmNvbG9yKTsKK2UuY3VycmVudFRhcmdldC5zdHlsZS5ib3JkZXJDb2xvcj0iZ3JheSI7Cit9LG9uQ29sb3JTZWxlY3Q6ZnVuY3Rpb24oXzk5OCl7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LGZ1bmN0aW9uKCl7Cit0aGlzLl9zdHlsZU5vZGVzPVtdOwordGhpcy5fb25Mb2FkU3RhY2s9W107Cit0aGlzLl9vblVubG9hZFN0YWNrPVtdOwordGhpcy5fY2FsbE9uVW5sb2FkPWZhbHNlOwordGhpcy5faW9CaW5kT2JqOwordGhpcy5zY3JpcHRTY29wZTsKK3RoaXMuYmluZEFyZ3M9e307Cit9LHtpc0NvbnRhaW5lcjp0cnVlLGFkanVzdFBhdGhzOnRydWUsaHJlZjoiIixleHRyYWN0Q29udGVudDp0cnVlLHBhcnNlQ29udGVudDp0cnVlLGNhY2hlQ29udGVudDp0cnVlLHByZWxvYWQ6ZmFsc2UscmVmcmVzaE9uU2hvdzpmYWxzZSxoYW5kbGVyOiIiLGV4ZWN1dGVTY3JpcHRzOmZhbHNlLHNjcmlwdFNlcGFyYXRpb246dHJ1ZSxsb2FkaW5nTWVzc2FnZToiTG9hZGluZy4uLiIsaXNMb2FkZWQ6ZmFsc2UscG9zdENyZWF0ZTpmdW5jdGlvbihhcmdzLGZyYWcsXzk5Yil7CitpZih0aGlzLmhhbmRsZXIhPT0iIil7Cit0aGlzLnNldEhhbmRsZXIodGhpcy5oYW5kbGVyKTsKK30KK2lmKHRoaXMuaXNTaG93aW5nKCl8fHRoaXMucHJlbG9hZCl7Cit0aGlzLmxvYWRDb250ZW50cygpOworfQorfSxzaG93OmZ1bmN0aW9uKCl7CitpZih0aGlzLnJlZnJlc2hPblNob3cpewordGhpcy5yZWZyZXNoKCk7Cit9ZWxzZXsKK3RoaXMubG9hZENvbnRlbnRzKCk7Cit9Citkb2pvLndpZGdldC5Db250ZW50UGFuZS5zdXBlcmNsYXNzLnNob3cuY2FsbCh0aGlzKTsKK30scmVmcmVzaDpmdW5jdGlvbigpewordGhpcy5pc0xvYWRlZD1mYWxzZTsKK3RoaXMubG9hZENvbnRlbnRzKCk7Cit9LGxvYWRDb250ZW50czpmdW5jdGlvbigpeworaWYodGhpcy5pc0xvYWRlZCl7CityZXR1cm47Cit9CitpZihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmhhbmRsZXIpKXsKK3RoaXMuX3J1bkhhbmRsZXIoKTsKK31lbHNleworaWYodGhpcy5ocmVmIT0iIil7Cit0aGlzLl9kb3dubG9hZEV4dGVybmFsQ29udGVudCh0aGlzLmhyZWYsdGhpcy5jYWNoZUNvbnRlbnQmJiF0aGlzLnJlZnJlc2hPblNob3cpOworfQorfQorfSxzZXRVcmw6ZnVuY3Rpb24odXJsKXsKK3RoaXMuaHJlZj11cmw7Cit0aGlzLmlzTG9hZGVkPWZhbHNlOworaWYodGhpcy5wcmVsb2FkfHx0aGlzLmlzU2hvd2luZygpKXsKK3RoaXMubG9hZENvbnRlbnRzKCk7Cit9Cit9LGFib3J0OmZ1bmN0aW9uKCl7Cit2YXIgYmluZD10aGlzLl9pb0JpbmRPYmo7CitpZighYmluZHx8IWJpbmQuYWJvcnQpeworcmV0dXJuOworfQorYmluZC5hYm9ydCgpOworZGVsZXRlIHRoaXMuX2lvQmluZE9iajsKK30sX2Rvd25sb2FkRXh0ZXJuYWxDb250ZW50OmZ1bmN0aW9uKHVybCxfOTlmKXsKK3RoaXMuYWJvcnQoKTsKK3RoaXMuX2hhbmRsZURlZmF1bHRzKHRoaXMubG9hZGluZ01lc3NhZ2UsIm9uRG93bmxvYWRTdGFydCIpOwordmFyIHNlbGY9dGhpczsKK3RoaXMuX2lvQmluZE9iaj1kb2pvLmlvLmJpbmQodGhpcy5fY2FjaGVTZXR0aW5nKHt1cmw6dXJsLG1pbWV0eXBlOiJ0ZXh0L2h0bWwiLGhhbmRsZXI6ZnVuY3Rpb24odHlwZSxkYXRhLHhocil7CitkZWxldGUgc2VsZi5faW9CaW5kT2JqOworaWYodHlwZT09ImxvYWQiKXsKK3NlbGYub25Eb3dubG9hZEVuZC5jYWxsKHNlbGYsdXJsLGRhdGEpOworfWVsc2V7Cit2YXIgZT17cmVzcG9uc2VUZXh0Onhoci5yZXNwb25zZVRleHQsc3RhdHVzOnhoci5zdGF0dXMsc3RhdHVzVGV4dDp4aHIuc3RhdHVzVGV4dCxyZXNwb25zZUhlYWRlcnM6eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLHRleHQ6IkVycm9yIGxvYWRpbmcgJyIrdXJsKyInICgiK3hoci5zdGF0dXMrIiAiK3hoci5zdGF0dXNUZXh0KyIpIn07CitzZWxmLl9oYW5kbGVEZWZhdWx0cy5jYWxsKHNlbGYsZSwib25Eb3dubG9hZEVycm9yIik7CitzZWxmLm9uTG9hZCgpOworfQorfX0sXzk5ZikpOworfSxfY2FjaGVTZXR0aW5nOmZ1bmN0aW9uKF85YTUsXzlhNil7Citmb3IodmFyIHggaW4gdGhpcy5iaW5kQXJncyl7CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoXzlhNVt4XSkpeworXzlhNVt4XT10aGlzLmJpbmRBcmdzW3hdOworfQorfQoraWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKF85YTUudXNlQ2FjaGUpKXsKK185YTUudXNlQ2FjaGU9XzlhNjsKK30KK2lmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChfOWE1LnByZXZlbnRDYWNoZSkpeworXzlhNS5wcmV2ZW50Q2FjaGU9IV85YTY7Cit9CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoXzlhNS5taW1ldHlwZSkpeworXzlhNS5taW1ldHlwZT0idGV4dC9odG1sIjsKK30KK3JldHVybiBfOWE1OworfSxvbkxvYWQ6ZnVuY3Rpb24oZSl7Cit0aGlzLl9ydW5TdGFjaygiX29uTG9hZFN0YWNrIik7Cit0aGlzLmlzTG9hZGVkPXRydWU7Cit9LG9uVW5Mb2FkOmZ1bmN0aW9uKGUpeworZG9qby5kZXByZWNhdGVkKHRoaXMud2lkZ2V0VHlwZSsiLm9uVW5Mb2FkLCB1c2UgLm9uVW5sb2FkIChsb3dlcmNhc2VkIGxvYWQpIiwwLjUpOworfSxvblVubG9hZDpmdW5jdGlvbihlKXsKK3RoaXMuX3J1blN0YWNrKCJfb25VbmxvYWRTdGFjayIpOworZGVsZXRlIHRoaXMuc2NyaXB0U2NvcGU7CitpZih0aGlzLm9uVW5Mb2FkIT09ZG9qby53aWRnZXQuQ29udGVudFBhbmUucHJvdG90eXBlLm9uVW5Mb2FkKXsKK3RoaXMub25VbkxvYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorfSxfcnVuU3RhY2s6ZnVuY3Rpb24oXzlhYil7Cit2YXIgc3Q9dGhpc1tfOWFiXTsKK3ZhciBlcnI9IiI7Cit2YXIgXzlhZT10aGlzLnNjcmlwdFNjb3BlfHx3aW5kb3c7Citmb3IodmFyIGk9MDtpPHN0Lmxlbmd0aDtpKyspewordHJ5eworc3RbaV0uY2FsbChfOWFlKTsKK30KK2NhdGNoKGUpeworZXJyKz0iXG4iK3N0W2ldKyIgZmFpbGVkOiAiK2UuZGVzY3JpcHRpb247Cit9Cit9Cit0aGlzW185YWJdPVtdOworaWYoZXJyLmxlbmd0aCl7Cit2YXIgbmFtZT0oXzlhYj09Il9vbkxvYWRTdGFjayIpPyJhZGRPbkxvYWQiOiJhZGRPblVuTG9hZCI7Cit0aGlzLl9oYW5kbGVEZWZhdWx0cyhuYW1lKyIgZmFpbHVyZVxuICIrZXJyLCJvbkV4ZWNFcnJvciIsImRlYnVnIik7Cit9Cit9LGFkZE9uTG9hZDpmdW5jdGlvbihvYmosZnVuYyl7Cit0aGlzLl9wdXNoT25TdGFjayh0aGlzLl9vbkxvYWRTdGFjayxvYmosZnVuYyk7Cit9LGFkZE9uVW5sb2FkOmZ1bmN0aW9uKG9iaixmdW5jKXsKK3RoaXMuX3B1c2hPblN0YWNrKHRoaXMuX29uVW5sb2FkU3RhY2ssb2JqLGZ1bmMpOworfSxhZGRPblVuTG9hZDpmdW5jdGlvbigpeworZG9qby5kZXByZWNhdGVkKHRoaXMud2lkZ2V0VHlwZSsiLmFkZE9uVW5Mb2FkLCB1c2UgYWRkT25VbmxvYWQgaW5zdGVhZC4gKGxvd2VyY2FzZWQgTG9hZCkiLDAuNSk7Cit0aGlzLmFkZE9uVW5sb2FkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sX3B1c2hPblN0YWNrOmZ1bmN0aW9uKF85YjUsb2JqLGZ1bmMpeworaWYodHlwZW9mIGZ1bmM9PSJ1bmRlZmluZWQiKXsKK185YjUucHVzaChvYmopOworfWVsc2V7CitfOWI1LnB1c2goZnVuY3Rpb24oKXsKK29ialtmdW5jXSgpOworfSk7Cit9Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK3RoaXMub25VbmxvYWQoKTsKK2Rvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworfSxvbkV4ZWNFcnJvcjpmdW5jdGlvbihlKXsKK30sb25Db250ZW50RXJyb3I6ZnVuY3Rpb24oZSl7Cit9LG9uRG93bmxvYWRFcnJvcjpmdW5jdGlvbihlKXsKK30sb25Eb3dubG9hZFN0YXJ0OmZ1bmN0aW9uKGUpeworfSxvbkRvd25sb2FkRW5kOmZ1bmN0aW9uKHVybCxkYXRhKXsKK2RhdGE9dGhpcy5zcGxpdEFuZEZpeFBhdGhzKGRhdGEsdXJsKTsKK3RoaXMuc2V0Q29udGVudChkYXRhKTsKK30sX2hhbmRsZURlZmF1bHRzOmZ1bmN0aW9uKGUsXzliZixfOWMwKXsKK2lmKCFfOWJmKXsKK185YmY9Im9uQ29udGVudEVycm9yIjsKK30KK2lmKGRvam8ubGFuZy5pc1N0cmluZyhlKSl7CitlPXt0ZXh0OmV9OworfQoraWYoIWUudGV4dCl7CitlLnRleHQ9ZS50b1N0cmluZygpOworfQorZS50b1N0cmluZz1mdW5jdGlvbigpeworcmV0dXJuIHRoaXMudGV4dDsKK307CitpZih0eXBlb2YgZS5yZXR1cm5WYWx1ZSE9ImJvb2xlYW4iKXsKK2UucmV0dXJuVmFsdWU9dHJ1ZTsKK30KK2lmKHR5cGVvZiBlLnByZXZlbnREZWZhdWx0IT0iZnVuY3Rpb24iKXsKK2UucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXsKK3RoaXMucmV0dXJuVmFsdWU9ZmFsc2U7Cit9OworfQordGhpc1tfOWJmXShlKTsKK2lmKGUucmV0dXJuVmFsdWUpeworc3dpdGNoKF85YzApeworY2FzZSB0cnVlOgorY2FzZSAiYWxlcnQiOgorYWxlcnQoZS50b1N0cmluZygpKTsKK2JyZWFrOworY2FzZSAiZGVidWciOgorZG9qby5kZWJ1ZyhlLnRvU3RyaW5nKCkpOworYnJlYWs7CitkZWZhdWx0OgoraWYodGhpcy5fY2FsbE9uVW5sb2FkKXsKK3RoaXMub25VbmxvYWQoKTsKK30KK3RoaXMuX2NhbGxPblVubG9hZD1mYWxzZTsKK2lmKGFyZ3VtZW50cy5jYWxsZWUuX2xvb3BTdG9wKXsKK2Rvam8uZGVidWcoZS50b1N0cmluZygpKTsKK31lbHNleworYXJndW1lbnRzLmNhbGxlZS5fbG9vcFN0b3A9dHJ1ZTsKK3RoaXMuX3NldENvbnRlbnQoZS50b1N0cmluZygpKTsKK30KK30KK30KK2FyZ3VtZW50cy5jYWxsZWUuX2xvb3BTdG9wPWZhbHNlOworfSxzcGxpdEFuZEZpeFBhdGhzOmZ1bmN0aW9uKHMsdXJsKXsKK3ZhciBfOWMzPVtdLF85YzQ9W10sdG1wPVtdOwordmFyIF85YzY9W10sXzljNz1bXSxhdHRyPVtdLF85Yzk9W107Cit2YXIgc3RyPSIiLHBhdGg9IiIsZml4PSIiLF85Y2Q9IiIsdGFnPSIiLF85Y2Y9IiI7CitpZighdXJsKXsKK3VybD0iLi8iOworfQoraWYocyl7Cit2YXIgXzlkMD0vPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOword2hpbGUoXzljNj1fOWQwLmV4ZWMocykpeworXzljMy5wdXNoKF85YzZbMV0pOworcz1zLnN1YnN0cmluZygwLF85YzYuaW5kZXgpK3Muc3Vic3RyKF85YzYuaW5kZXgrXzljNlswXS5sZW5ndGgpOworfQoraWYodGhpcy5hZGp1c3RQYXRocyl7Cit2YXIgXzlkMT0vPFthLXpdW2EtejAtOV0qW14+XSpccyg/Oig/OnNyY3xocmVmfHN0eWxlKT1bXj5dKStbXj5dKj4vaTsKK3ZhciBfOWQyPS9ccyhzcmN8aHJlZnxzdHlsZSk9KFsnIl0/KShbXHcoKVxbXF1cLy4sXFwnIi06OyM9Jj9cc0BdKz8pXDIvaTsKK3ZhciBfOWQzPS9eKD86WyNdfCg/Oig/Omh0dHBzP3xmdHBzP3xmaWxlfGphdmFzY3JpcHR8bWFpbHRvfG5ld3MpOikpLzsKK3doaWxlKHRhZz1fOWQxLmV4ZWMocykpeworc3RyKz1zLnN1YnN0cmluZygwLHRhZy5pbmRleCk7CitzPXMuc3Vic3RyaW5nKCh0YWcuaW5kZXgrdGFnWzBdLmxlbmd0aCkscy5sZW5ndGgpOwordGFnPXRhZ1swXTsKK185Y2Q9IiI7Cit3aGlsZShhdHRyPV85ZDIuZXhlYyh0YWcpKXsKK3BhdGg9IiI7CitfOWNmPWF0dHJbM107Citzd2l0Y2goYXR0clsxXS50b0xvd2VyQ2FzZSgpKXsKK2Nhc2UgInNyYyI6CitjYXNlICJocmVmIjoKK2lmKF85ZDMuZXhlYyhfOWNmKSl7CitwYXRoPV85Y2Y7Cit9ZWxzZXsKK3BhdGg9KG5ldyBkb2pvLnVyaS5VcmkodXJsLF85Y2YpLnRvU3RyaW5nKCkpOworfQorYnJlYWs7CitjYXNlICJzdHlsZSI6CitwYXRoPWRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChfOWNmLHVybCk7CiticmVhazsKK2RlZmF1bHQ6CitwYXRoPV85Y2Y7Cit9CitmaXg9IiAiK2F0dHJbMV0rIj0iK2F0dHJbMl0rcGF0aCthdHRyWzJdOworXzljZCs9dGFnLnN1YnN0cmluZygwLGF0dHIuaW5kZXgpK2ZpeDsKK3RhZz10YWcuc3Vic3RyaW5nKChhdHRyLmluZGV4K2F0dHJbMF0ubGVuZ3RoKSx0YWcubGVuZ3RoKTsKK30KK3N0cis9XzljZCt0YWc7Cit9CitzPXN0citzOworfQorXzlkMD0vKD86PChzdHlsZSlbXj5dKj4oW1xzXFNdKj8pPFwvc3R5bGU+fDxsaW5rIChbXj5dKnJlbD1bJyJdP3N0eWxlc2hlZXRbJyJdP1tePl0qKT4pL2k7Cit3aGlsZShfOWM2PV85ZDAuZXhlYyhzKSl7CitpZihfOWM2WzFdJiZfOWM2WzFdLnRvTG93ZXJDYXNlKCk9PSJzdHlsZSIpeworXzljOS5wdXNoKGRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChfOWM2WzJdLHVybCkpOworfWVsc2V7CitpZihhdHRyPV85YzZbM10ubWF0Y2goL2hyZWY9KFsnIl0/KShbXiciPl0qKVwxL2kpKXsKK185YzkucHVzaCh7cGF0aDphdHRyWzJdfSk7Cit9Cit9CitzPXMuc3Vic3RyaW5nKDAsXzljNi5pbmRleCkrcy5zdWJzdHIoXzljNi5pbmRleCtfOWM2WzBdLmxlbmd0aCk7Cit9Cit2YXIgXzlkMD0vPHNjcmlwdChbXj5dKik+KFtcc1xTXSo/KTxcL3NjcmlwdD4vaTsKK3ZhciBfOWQ0PS9zcmM9KFsnIl0/KShbXiInXSopXDEvaTsKK3ZhciBfOWQ1PS8uKihcYmRvam9cYlwuanMoPzpcLnVuY29tcHJlc3NlZFwuanMpPykkLzsKK3ZhciBfOWQ2PS8oPzp2YXIgKT9cYmRqQ29uZmlnXGIoPzpbXHNdKj1bXHNdKlx7W159XStcfXxcLltcd10qW1xzXSo9W1xzXSpbXjtcbl0qKT87P3xkb2pvXC5ob3N0ZW52XC53cml0ZUluY2x1ZGVzXChccypcKTs/L2c7Cit2YXIgXzlkNz0vZG9qb1wuKD86KD86cmVxdWlyZSg/OkFmdGVyKT8oPzpJZik/KXwoPzp3aWRnZXRcLig/Om1hbmFnZXJcLik/cmVnaXN0ZXJXaWRnZXRQYWNrYWdlKXwoPzooPzpob3N0ZW52XC4pP3NldE1vZHVsZVByZWZpeHxyZWdpc3Rlck1vZHVsZVBhdGgpfGRlZmluZU5hbWVzcGFjZSlcKChbJyJdKS4qP1wxXClccyo7Py87Cit3aGlsZShfOWM2PV85ZDAuZXhlYyhzKSl7CitpZih0aGlzLmV4ZWN1dGVTY3JpcHRzJiZfOWM2WzFdKXsKK2lmKGF0dHI9XzlkNC5leGVjKF85YzZbMV0pKXsKK2lmKF85ZDUuZXhlYyhhdHRyWzJdKSl7Citkb2pvLmRlYnVnKCJTZWN1cml0eSBub3RlISBpbmhpYml0OiIrYXR0clsyXSsiIGZyb20gIGJlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKK31lbHNleworXzljNC5wdXNoKHtwYXRoOmF0dHJbMl19KTsKK30KK30KK30KK2lmKF85YzZbMl0pewordmFyIHNjPV85YzZbMl0ucmVwbGFjZShfOWQ2LCIiKTsKK2lmKCFzYyl7Citjb250aW51ZTsKK30KK3doaWxlKHRtcD1fOWQ3LmV4ZWMoc2MpKXsKK185YzcucHVzaCh0bXBbMF0pOworc2M9c2Muc3Vic3RyaW5nKDAsdG1wLmluZGV4KStzYy5zdWJzdHIodG1wLmluZGV4K3RtcFswXS5sZW5ndGgpOworfQoraWYodGhpcy5leGVjdXRlU2NyaXB0cyl7CitfOWM0LnB1c2goc2MpOworfQorfQorcz1zLnN1YnN0cigwLF85YzYuaW5kZXgpK3Muc3Vic3RyKF85YzYuaW5kZXgrXzljNlswXS5sZW5ndGgpOworfQoraWYodGhpcy5leHRyYWN0Q29udGVudCl7CitfOWM2PXMubWF0Y2goLzxib2R5W14+XSo+XHMqKFtcc1xTXSspXHMqPFwvYm9keT4vaW0pOworaWYoXzljNil7CitzPV85YzZbMV07Cit9Cit9CitpZih0aGlzLmV4ZWN1dGVTY3JpcHRzJiZ0aGlzLnNjcmlwdFNlcGFyYXRpb24pewordmFyIF85ZDA9Lyg8W2EtekEtWl1bYS16QS1aMC05XSpcc1tePl0qP1xTPSkoKFsnIl0pW14+XSpzY3JpcHRTY29wZVtePl0qPikvOwordmFyIF85ZDk9LyhbXHMnIjs6XChdKXNjcmlwdFNjb3BlKC4qKS87CitzdHI9IiI7Cit3aGlsZSh0YWc9XzlkMC5leGVjKHMpKXsKK3RtcD0oKHRhZ1szXT09IiciKT8iXCIiOiInIik7CitmaXg9IiI7CitzdHIrPXMuc3Vic3RyaW5nKDAsdGFnLmluZGV4KSt0YWdbMV07Cit3aGlsZShhdHRyPV85ZDkuZXhlYyh0YWdbMl0pKXsKK3RhZ1syXT10YWdbMl0uc3Vic3RyaW5nKDAsYXR0ci5pbmRleCkrYXR0clsxXSsiZG9qby53aWRnZXQuYnlJZCgiK3RtcCt0aGlzLndpZGdldElkK3RtcCsiKS5zY3JpcHRTY29wZSIrYXR0clsyXTsKK30KK3N0cis9dGFnWzJdOworcz1zLnN1YnN0cih0YWcuaW5kZXgrdGFnWzBdLmxlbmd0aCk7Cit9CitzPXN0citzOworfQorfQorcmV0dXJuIHsieG1sIjpzLCJzdHlsZXMiOl85YzksInRpdGxlcyI6XzljMywicmVxdWlyZXMiOl85YzcsInNjcmlwdHMiOl85YzQsInVybCI6dXJsfTsKK30sX3NldENvbnRlbnQ6ZnVuY3Rpb24oY29udCl7Cit0aGlzLmRlc3Ryb3lDaGlsZHJlbigpOworZm9yKHZhciBpPTA7aTx0aGlzLl9zdHlsZU5vZGVzLmxlbmd0aDtpKyspeworaWYodGhpcy5fc3R5bGVOb2Rlc1tpXSYmdGhpcy5fc3R5bGVOb2Rlc1tpXS5wYXJlbnROb2RlKXsKK3RoaXMuX3N0eWxlTm9kZXNbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9zdHlsZU5vZGVzW2ldKTsKK30KK30KK3RoaXMuX3N0eWxlTm9kZXM9W107Cit0cnl7Cit2YXIgbm9kZT10aGlzLmNvbnRhaW5lck5vZGV8fHRoaXMuZG9tTm9kZTsKK3doaWxlKG5vZGUuZmlyc3RDaGlsZCl7Citkb2pvLmh0bWwuZGVzdHJveU5vZGUobm9kZS5maXJzdENoaWxkKTsKK30KK2lmKHR5cGVvZiBjb250IT0ic3RyaW5nIil7Citub2RlLmFwcGVuZENoaWxkKGNvbnQpOworfWVsc2V7Citub2RlLmlubmVySFRNTD1jb250OworfQorfQorY2F0Y2goZSl7CitlLnRleHQ9IkNvdWxkbid0IGxvYWQgY29udGVudDoiK2UuZGVzY3JpcHRpb247Cit0aGlzLl9oYW5kbGVEZWZhdWx0cyhlLCJvbkNvbnRlbnRFcnJvciIpOworfQorfSxzZXRDb250ZW50OmZ1bmN0aW9uKGRhdGEpewordGhpcy5hYm9ydCgpOworaWYodGhpcy5fY2FsbE9uVW5sb2FkKXsKK3RoaXMub25VbmxvYWQoKTsKK30KK3RoaXMuX2NhbGxPblVubG9hZD10cnVlOworaWYoIWRhdGF8fGRvam8uaHRtbC5pc05vZGUoZGF0YSkpewordGhpcy5fc2V0Q29udGVudChkYXRhKTsKK3RoaXMub25SZXNpemVkKCk7Cit0aGlzLm9uTG9hZCgpOworfWVsc2V7CitpZih0eXBlb2YgZGF0YS54bWwhPSJzdHJpbmciKXsKK3RoaXMuaHJlZj0iIjsKK2RhdGE9dGhpcy5zcGxpdEFuZEZpeFBhdGhzKGRhdGEpOworfQordGhpcy5fc2V0Q29udGVudChkYXRhLnhtbCk7Citmb3IodmFyIGk9MDtpPGRhdGEuc3R5bGVzLmxlbmd0aDtpKyspeworaWYoZGF0YS5zdHlsZXNbaV0ucGF0aCl7Cit0aGlzLl9zdHlsZU5vZGVzLnB1c2goZG9qby5odG1sLmluc2VydENzc0ZpbGUoZGF0YS5zdHlsZXNbaV0ucGF0aCxkb2pvLmRvYygpLGZhbHNlLHRydWUpKTsKK31lbHNlewordGhpcy5fc3R5bGVOb2Rlcy5wdXNoKGRvam8uaHRtbC5pbnNlcnRDc3NUZXh0KGRhdGEuc3R5bGVzW2ldKSk7Cit9Cit9CitpZih0aGlzLnBhcnNlQ29udGVudCl7Citmb3IodmFyIGk9MDtpPGRhdGEucmVxdWlyZXMubGVuZ3RoO2krKyl7Cit0cnl7CitldmFsKGRhdGEucmVxdWlyZXNbaV0pOworfQorY2F0Y2goZSl7CitlLnRleHQ9IkNvbnRlbnRQYW5lOiBlcnJvciBpbiBwYWNrYWdlIGxvYWRpbmcgY2FsbHMsICIrKGUuZGVzY3JpcHRpb258fGUpOwordGhpcy5faGFuZGxlRGVmYXVsdHMoZSwib25Db250ZW50RXJyb3IiLCJkZWJ1ZyIpOworfQorfQorfQordmFyIF85ZGY9dGhpczsKK2Z1bmN0aW9uIGFzeW5jUGFyc2UoKXsKK2lmKF85ZGYuZXhlY3V0ZVNjcmlwdHMpeworXzlkZi5fZXhlY3V0ZVNjcmlwdHMoZGF0YS5zY3JpcHRzKTsKK30KK2lmKF85ZGYucGFyc2VDb250ZW50KXsKK3ZhciBub2RlPV85ZGYuY29udGFpbmVyTm9kZXx8XzlkZi5kb21Ob2RlOwordmFyIF85ZTE9bmV3IGRvam8ueG1sLlBhcnNlKCk7Cit2YXIgZnJhZz1fOWUxLnBhcnNlRWxlbWVudChub2RlLG51bGwsdHJ1ZSk7Citkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKGZyYWcsXzlkZik7Cit9CitfOWRmLm9uUmVzaXplZCgpOworXzlkZi5vbkxvYWQoKTsKK30KK2lmKGRvam8uaG9zdGVudi5pc1hEb21haW4mJmRhdGEucmVxdWlyZXMubGVuZ3RoKXsKK2Rvam8uYWRkT25Mb2FkKGFzeW5jUGFyc2UpOworfWVsc2V7Cithc3luY1BhcnNlKCk7Cit9Cit9Cit9LHNldEhhbmRsZXI6ZnVuY3Rpb24oXzllMyl7Cit2YXIgZmNuPWRvam8ubGFuZy5pc0Z1bmN0aW9uKF85ZTMpP185ZTM6d2luZG93W185ZTNdOworaWYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGZjbikpewordGhpcy5faGFuZGxlRGVmYXVsdHMoIlVuYWJsZSB0byBzZXQgaGFuZGxlciwgJyIrXzllMysiJyBub3QgYSBmdW5jdGlvbi4iLCJvbkV4ZWNFcnJvciIsdHJ1ZSk7CityZXR1cm47Cit9Cit0aGlzLmhhbmRsZXI9ZnVuY3Rpb24oKXsKK3JldHVybiBmY24uYXBwbHkodGhpcyxhcmd1bWVudHMpOworfTsKK30sX3J1bkhhbmRsZXI6ZnVuY3Rpb24oKXsKK3ZhciByZXQ9dHJ1ZTsKK2lmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuaGFuZGxlcikpewordGhpcy5oYW5kbGVyKHRoaXMsdGhpcy5kb21Ob2RlKTsKK3JldD1mYWxzZTsKK30KK3RoaXMub25Mb2FkKCk7CityZXR1cm4gcmV0OworfSxfZXhlY3V0ZVNjcmlwdHM6ZnVuY3Rpb24oXzllNil7Cit2YXIgc2VsZj10aGlzOwordmFyIHRtcD0iIixjb2RlPSIiOworZm9yKHZhciBpPTA7aTxfOWU2Lmxlbmd0aDtpKyspeworaWYoXzllNltpXS5wYXRoKXsKK2Rvam8uaW8uYmluZCh0aGlzLl9jYWNoZVNldHRpbmcoeyJ1cmwiOl85ZTZbaV0ucGF0aCwibG9hZCI6ZnVuY3Rpb24odHlwZSxfOWVjKXsKK2Rvam8ubGFuZy5oaXRjaChzZWxmLHRtcD0iOyIrXzllYyk7Cit9LCJlcnJvciI6ZnVuY3Rpb24odHlwZSxfOWVlKXsKK185ZWUudGV4dD10eXBlKyIgZG93bmxvYWRpbmcgcmVtb3RlIHNjcmlwdCI7CitzZWxmLl9oYW5kbGVEZWZhdWx0cy5jYWxsKHNlbGYsXzllZSwib25FeGVjRXJyb3IiLCJkZWJ1ZyIpOworfSwibWltZXR5cGUiOiJ0ZXh0L3BsYWluIiwic3luYyI6dHJ1ZX0sdGhpcy5jYWNoZUNvbnRlbnQpKTsKK2NvZGUrPXRtcDsKK31lbHNleworY29kZSs9XzllNltpXTsKK30KK30KK3RyeXsKK2lmKHRoaXMuc2NyaXB0U2VwYXJhdGlvbil7CitkZWxldGUgdGhpcy5zY3JpcHRTY29wZTsKK3RoaXMuc2NyaXB0U2NvcGU9bmV3IChuZXcgRnVuY3Rpb24oIl9jb250YWluZXJfIixjb2RlKyI7IHJldHVybiB0aGlzOyIpKShzZWxmKTsKK31lbHNlewordmFyIGRqZz1kb2pvLmdsb2JhbCgpOworaWYoZGpnLmV4ZWNTY3JpcHQpeworZGpnLmV4ZWNTY3JpcHQoY29kZSk7Cit9ZWxzZXsKK3ZhciBkamQ9ZG9qby5kb2MoKTsKK3ZhciBzYz1kamQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CitzYy5hcHBlbmRDaGlsZChkamQuY3JlYXRlVGV4dE5vZGUoY29kZSkpOworKHRoaXMuY29udGFpbmVyTm9kZXx8dGhpcy5kb21Ob2RlKS5hcHBlbmRDaGlsZChzYyk7Cit9Cit9Cit9CitjYXRjaChlKXsKK2UudGV4dD0iRXJyb3IgcnVubmluZyBzY3JpcHRzIGZyb20gY29udGVudDpcbiIrZS5kZXNjcmlwdGlvbjsKK3RoaXMuX2hhbmRsZURlZmF1bHRzKGUsIm9uRXhlY0Vycm9yIiwiZGVidWciKTsKK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXIiKTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5IYW5kbGVyTWFuYWdlciIsbnVsbCxmdW5jdGlvbigpewordGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzPVtdOworfSx7cmVnaXN0ZXJIYW5kbGVyOmZ1bmN0aW9uKG9iaixmdW5jKXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTIpewordGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLnB1c2goZnVuY3Rpb24oKXsKK3JldHVybiBvYmpbZnVuY10uYXBwbHkob2JqLGFyZ3VtZW50cyk7Cit9KTsKK31lbHNlewordGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLnB1c2gob2JqKTsKK30KK30scmVtb3ZlSGFuZGxlcjpmdW5jdGlvbihmdW5jKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworaWYoZnVuYz09PXRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVyc1tpXSl7CitkZWxldGUgdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldOworcmV0dXJuOworfQorfQorZG9qby5kZWJ1ZygiSGFuZGxlck1hbmFnZXIgaGFuZGxlciAiK2Z1bmMrIiBpcyBub3QgcmVnaXN0ZXJlZCwgY2FuIG5vdCByZW1vdmUuIik7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVyc1tpXTsKK30KK319KTsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFySXRlbU1hbmFnZXI9bmV3IGRvam8ud2lkZ2V0LkhhbmRsZXJNYW5hZ2VyOworZG9qby5sYW5nLm1peGluKGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFySXRlbU1hbmFnZXIse2dldFRvb2xiYXJJdGVtOmZ1bmN0aW9uKG5hbWUpewordmFyIGl0ZW07CituYW1lPW5hbWUudG9Mb3dlckNhc2UoKTsKK2Zvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworaXRlbT10aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnNbaV0obmFtZSk7CitpZihpdGVtKXsKK3JldHVybiBpdGVtOworfQorfQorc3dpdGNoKG5hbWUpeworY2FzZSAiYm9sZCI6CitjYXNlICJjb3B5IjoKK2Nhc2UgImN1dCI6CitjYXNlICJkZWxldGUiOgorY2FzZSAiaW5kZW50IjoKK2Nhc2UgImluc2VydGhvcml6b250YWxydWxlIjoKK2Nhc2UgImluc2VydG9yZGVyZWRsaXN0IjoKK2Nhc2UgImluc2VydHVub3JkZXJlZGxpc3QiOgorY2FzZSAiaXRhbGljIjoKK2Nhc2UgImp1c3RpZnljZW50ZXIiOgorY2FzZSAianVzdGlmeWZ1bGwiOgorY2FzZSAianVzdGlmeWxlZnQiOgorY2FzZSAianVzdGlmeXJpZ2h0IjoKK2Nhc2UgIm91dGRlbnQiOgorY2FzZSAicGFzdGUiOgorY2FzZSAicmVkbyI6CitjYXNlICJyZW1vdmVmb3JtYXQiOgorY2FzZSAic2VsZWN0YWxsIjoKK2Nhc2UgInN0cmlrZXRocm91Z2giOgorY2FzZSAic3Vic2NyaXB0IjoKK2Nhc2UgInN1cGVyc2NyaXB0IjoKK2Nhc2UgInVuZGVybGluZSI6CitjYXNlICJ1bmRvIjoKK2Nhc2UgInVubGluayI6CitjYXNlICJjcmVhdGVsaW5rIjoKK2Nhc2UgImluc2VydGltYWdlIjoKK2Nhc2UgImh0bWx0b2dnbGUiOgoraXRlbT1uZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24obmFtZSk7CiticmVhazsKK2Nhc2UgImZvcmVjb2xvciI6CitjYXNlICJoaWxpdGVjb2xvciI6CitpdGVtPW5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckNvbG9yUGFsZXR0ZUJ1dHRvbihuYW1lKTsKK2JyZWFrOworY2FzZSAicGxhaW5mb3JtYXRibG9jayI6CitpdGVtPW5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3QoImZvcm1hdGJsb2NrIik7CiticmVhazsKK2Nhc2UgImZvcm1hdGJsb2NrIjoKK2l0ZW09bmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3QoImZvcm1hdGJsb2NrIik7CiticmVhazsKK2Nhc2UgImZvbnRzaXplIjoKK2l0ZW09bmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udFNpemVTZWxlY3QoImZvbnRzaXplIik7CiticmVhazsKK2Nhc2UgImZvbnRuYW1lIjoKK2l0ZW09bmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udE5hbWVTZWxlY3QoImZvbnRuYW1lIik7CiticmVhazsKK2Nhc2UgImluc2VydHRhYmxlIjoKK2Nhc2UgImluc2VydGNlbGwiOgorY2FzZSAiaW5zZXJ0Y29sIjoKK2Nhc2UgImluc2VydHJvdyI6CitjYXNlICJkZWxldGVjZWxscyI6CitjYXNlICJkZWxldGVjb2xzIjoKK2Nhc2UgImRlbGV0ZXJvd3MiOgorY2FzZSAibWVyZ2VjZWxscyI6CitjYXNlICJzcGxpdGNlbGwiOgorZG9qby5kZWJ1ZyhuYW1lKyIgaXMgaW1wbGVtZW50ZWQgaW4gZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5UYWJsZU9wZXJhdGlvbiwgcGxlYXNlIHJlcXVpcmUgaXQgZmlyc3QuIik7CiticmVhazsKK2Nhc2UgImluc2VydGh0bWwiOgorY2FzZSAiYmxvY2tkaXJsdHIiOgorY2FzZSAiYmxvY2tkaXJydGwiOgorY2FzZSAiZGlybHRyIjoKK2Nhc2UgImRpcnJ0bCI6CitjYXNlICJpbmxpbmVkaXJsdHIiOgorY2FzZSAiaW5saW5lZGlycnRsIjoKK2Rvam8uZGVidWcoIk5vdCB5ZXQgaW1wbGVtZW50ZWQgdG9vbGJhciBpdGVtOiAiK25hbWUpOworYnJlYWs7CitkZWZhdWx0OgorZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJJdGVtTWFuYWdlci5nZXRUb29sYmFySXRlbTogVW5rbm93biB0b29sYmFyIGl0ZW06ICIrbmFtZSk7Cit9CityZXR1cm4gaXRlbTsKK319KTsKK2Rvam8uYWRkT25VbmxvYWQoZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJJdGVtTWFuYWdlciwiZGVzdHJveSIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbiIsbnVsbCxmdW5jdGlvbihuYW1lKXsKK3RoaXMuX25hbWU9bmFtZTsKK30se2NyZWF0ZTpmdW5jdGlvbihub2RlLF85ZmMsXzlmZCl7Cit0aGlzLl9kb21Ob2RlPW5vZGU7Cit2YXIgY21kPV85ZmMucGFyZW50LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihjbWQpewordGhpcy5fZG9tTm9kZS50aXRsZT1jbWQuZ2V0VGV4dCgpOworfQordGhpcy5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuX2RvbU5vZGUpOwordGhpcy5fcGFyZW50VG9vbGJhcj1fOWZjOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2RvbU5vZGUsIm9uY2xpY2siLHRoaXMsIm9uQ2xpY2siKTsKK2lmKCFfOWZkKXsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCJvbm1vdXNlb3ZlciIsdGhpcywib25Nb3VzZU92ZXIiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCJvbm1vdXNlb3V0Iix0aGlzLCJvbk1vdXNlT3V0Iik7Cit9Cit9LGRpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oXzlmZil7Citkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihfOWZmKTsKK3ZhciBfYTAwPV85ZmYuYWxsfHxfOWZmLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Citmb3IodmFyIHg9MDt4PF9hMDAubGVuZ3RoO3grKyl7Citkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihfYTAwW3hdKTsKK30KK30sb25Nb3VzZU92ZXI6ZnVuY3Rpb24oKXsKK3ZhciBfYTAyPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYoX2EwMil7Cit2YXIgX2EwMz1fYTAyLmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihfYTAzJiZfYTAzLmdldFN0YXRlKCkhPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCl7Cit0aGlzLmhpZ2hsaWdodFRvb2xiYXJJdGVtKCk7Cit9Cit9Cit9LG9uTW91c2VPdXQ6ZnVuY3Rpb24oKXsKK3RoaXMudW5oaWdobGlnaHRUb29sYmFySXRlbSgpOworfSxkZXN0cm95OmZ1bmN0aW9uKCl7Cit0aGlzLl9kb21Ob2RlPW51bGw7Cit0aGlzLl9wYXJlbnRUb29sYmFyPW51bGw7Cit9LG9uQ2xpY2s6ZnVuY3Rpb24oZSl7CitpZih0aGlzLl9kb21Ob2RlJiYhdGhpcy5fZG9tTm9kZS5kaXNhYmxlZCYmdGhpcy5fcGFyZW50VG9vbGJhci5jaGVja0F2YWlsYWJpbGl0eSgpKXsKK2UucHJldmVudERlZmF1bHQoKTsKK2Uuc3RvcFByb3BhZ2F0aW9uKCk7Cit2YXIgX2EwNT1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKK2lmKF9hMDUpewordmFyIF9hMDY9X2EwNS5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworaWYoX2EwNil7CitfYTA2LmV4ZWN1dGUoKTsKK30KK30KK30KK30scmVmcmVzaFN0YXRlOmZ1bmN0aW9uKCl7Cit2YXIgX2EwNz1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKK3ZhciBlbT1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlcjsKK2lmKF9hMDcpewordmFyIF9hMDk9X2EwNy5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworaWYoX2EwOSl7Cit2YXIgX2EwYT1fYTA5LmdldFN0YXRlKCk7CitpZihfYTBhIT10aGlzLl9sYXN0U3RhdGUpeworc3dpdGNoKF9hMGEpeworY2FzZSBlbS5jb21tYW5kU3RhdGUuTGF0Y2hlZDoKK3RoaXMubGF0Y2hUb29sYmFySXRlbSgpOworYnJlYWs7CitjYXNlIGVtLmNvbW1hbmRTdGF0ZS5FbmFibGVkOgordGhpcy5lbmFibGVUb29sYmFySXRlbSgpOworYnJlYWs7CitjYXNlIGVtLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZDoKK2RlZmF1bHQ6Cit0aGlzLmRpc2FibGVUb29sYmFySXRlbSgpOworfQordGhpcy5fbGFzdFN0YXRlPV9hMGE7Cit9Cit9Cit9CityZXR1cm4gZW0uY29tbWFuZFN0YXRlLkVuYWJsZWQ7Cit9LGxhdGNoVG9vbGJhckl0ZW06ZnVuY3Rpb24oKXsKK3RoaXMuX2RvbU5vZGUuZGlzYWJsZWQ9ZmFsc2U7Cit0aGlzLnJlbW92ZVRvb2xiYXJJdGVtU3R5bGUodGhpcy5fZG9tTm9kZSk7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJMYXRjaGVkSXRlbVN0eWxlKTsKK30sZW5hYmxlVG9vbGJhckl0ZW06ZnVuY3Rpb24oKXsKK3RoaXMuX2RvbU5vZGUuZGlzYWJsZWQ9ZmFsc2U7Cit0aGlzLnJlbW92ZVRvb2xiYXJJdGVtU3R5bGUodGhpcy5fZG9tTm9kZSk7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJFbmFibGVkSXRlbVN0eWxlKTsKK30sZGlzYWJsZVRvb2xiYXJJdGVtOmZ1bmN0aW9uKCl7Cit0aGlzLl9kb21Ob2RlLmRpc2FibGVkPXRydWU7Cit0aGlzLnJlbW92ZVRvb2xiYXJJdGVtU3R5bGUodGhpcy5fZG9tTm9kZSk7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJEaXNhYmxlZEl0ZW1TdHlsZSk7Cit9LGhpZ2hsaWdodFRvb2xiYXJJdGVtOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZEl0ZW1TdHlsZSk7Cit9LHVuaGlnaGxpZ2h0VG9vbGJhckl0ZW06ZnVuY3Rpb24oKXsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9kb21Ob2RlLHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckhpZ2hsaWdodGVkSXRlbVN0eWxlKTsKK30scmVtb3ZlVG9vbGJhckl0ZW1TdHlsZTpmdW5jdGlvbigpeworZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuX2RvbU5vZGUsdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFyRW5hYmxlZEl0ZW1TdHlsZSk7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5fZG9tTm9kZSx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJMYXRjaGVkSXRlbVN0eWxlKTsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9kb21Ob2RlLHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckRpc2FibGVkSXRlbVN0eWxlKTsKK3RoaXMudW5oaWdobGlnaHRUb29sYmFySXRlbSgpOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckRyb3BEb3duQnV0dG9uIixkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckJ1dHRvbix7b25DbGljazpmdW5jdGlvbigpeworaWYodGhpcy5fZG9tTm9kZSYmIXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQmJnRoaXMuX3BhcmVudFRvb2xiYXIuY2hlY2tBdmFpbGFiaWxpdHkoKSl7CitpZighdGhpcy5fZHJvcGRvd24pewordGhpcy5fZHJvcGRvd249ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJQb3B1cENvbnRhaW5lciIse30pOwordGhpcy5fZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9kcm9wZG93bi5kb21Ob2RlKTsKK30KK2lmKHRoaXMuX2Ryb3Bkb3duLmlzU2hvd2luZ05vdyl7Cit0aGlzLl9kcm9wZG93bi5jbG9zZSgpOworfWVsc2V7Cit0aGlzLm9uRHJvcERvd25TaG93bigpOwordGhpcy5fZHJvcGRvd24ub3Blbih0aGlzLl9kb21Ob2RlLG51bGwsdGhpcy5fZG9tTm9kZSk7Cit9Cit9Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK3RoaXMub25Ecm9wRG93bkRlc3Ryb3koKTsKK2lmKHRoaXMuX2Ryb3Bkb3duKXsKK3RoaXMuX2Ryb3Bkb3duLmRlc3Ryb3koKTsKK30KK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24uc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7Cit9LG9uRHJvcERvd25TaG93bjpmdW5jdGlvbigpeworfSxvbkRyb3BEb3duRGVzdHJveTpmdW5jdGlvbigpeworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckNvbG9yUGFsZXR0ZUJ1dHRvbiIsZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJEcm9wRG93bkJ1dHRvbix7b25Ecm9wRG93blNob3duOmZ1bmN0aW9uKCl7CitpZighdGhpcy5fY29sb3JwYWxldHRlKXsKK3RoaXMuX2NvbG9ycGFsZXR0ZT1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkNvbG9yUGFsZXR0ZSIse30pOwordGhpcy5fZHJvcGRvd24uYWRkQ2hpbGQodGhpcy5fY29sb3JwYWxldHRlKTsKK3RoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLl9kcm9wZG93bi5kb21Ob2RlKTsKK3RoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLl9jb2xvcnBhbGV0dGUuZG9tTm9kZSk7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fY29sb3JwYWxldHRlLCJvbkNvbG9yU2VsZWN0Iix0aGlzLCJzZXRDb2xvciIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Ryb3Bkb3duLCJvcGVuIix0aGlzLCJsYXRjaFRvb2xiYXJJdGVtIik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZHJvcGRvd24sImNsb3NlIix0aGlzLCJlbmFibGVUb29sYmFySXRlbSIpOworfQorfSxzZXRDb2xvcjpmdW5jdGlvbihfYTBiKXsKK3RoaXMuX2Ryb3Bkb3duLmNsb3NlKCk7Cit2YXIgX2EwYz1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKK2lmKF9hMGMpewordmFyIF9hMGQ9X2EwYy5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworaWYoX2EwZCl7CitfYTBkLmV4ZWN1dGUoX2EwYik7Cit9Cit9Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tQbGFpblNlbGVjdCIsZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24se2NyZWF0ZTpmdW5jdGlvbihub2RlLF9hMGYpewordGhpcy5fZG9tTm9kZT1ub2RlOwordGhpcy5fcGFyZW50VG9vbGJhcj1fYTBmOwordGhpcy5fZG9tTm9kZT1ub2RlOwordGhpcy5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuX2RvbU5vZGUpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2RvbU5vZGUsIm9uY2hhbmdlIix0aGlzLCJvbkNoYW5nZSIpOworfSxkZXN0cm95OmZ1bmN0aW9uKCl7Cit0aGlzLl9kb21Ob2RlPW51bGw7Cit9LG9uQ2hhbmdlOmZ1bmN0aW9uKCl7CitpZih0aGlzLl9wYXJlbnRUb29sYmFyLmNoZWNrQXZhaWxhYmlsaXR5KCkpewordmFyIHN2PXRoaXMuX2RvbU5vZGUudmFsdWUudG9Mb3dlckNhc2UoKTsKK3ZhciBfYTExPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYoX2ExMSl7Cit2YXIgX2ExMj1fYTExLmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihfYTEyKXsKK19hMTIuZXhlY3V0ZShzdik7Cit9Cit9Cit9Cit9LHJlZnJlc2hTdGF0ZTpmdW5jdGlvbigpeworaWYodGhpcy5fZG9tTm9kZSl7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKK3ZhciBfYTEzPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYoX2ExMyl7Cit2YXIgX2ExND1fYTEzLmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihfYTE0KXsKK3ZhciBfYTE1PV9hMTQuZ2V0VmFsdWUoKTsKK2lmKCFfYTE1KXsKK19hMTU9IiI7Cit9Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLl9kb21Ob2RlLm9wdGlvbnMsZnVuY3Rpb24oaXRlbSl7CitpZihpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCk9PV9hMTUudG9Mb3dlckNhc2UoKSl7CitpdGVtLnNlbGVjdGVkPXRydWU7Cit9Cit9KTsKK30KK30KK30KK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0iLGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24se2hyZWY6bnVsbCxjcmVhdGU6ZnVuY3Rpb24obm9kZSxfYTE4KXsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtLnN1cGVyY2xhc3MuY3JlYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2lmKCF0aGlzLl9jb250ZW50UGFuZSl7Cit0aGlzLl9jb250ZW50UGFuZT1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkNvbnRlbnRQYW5lIix7cHJlbG9hZDoidHJ1ZSJ9KTsKK3RoaXMuX2NvbnRlbnRQYW5lLmFkZE9uTG9hZCh0aGlzLCJzZXR1cCIpOwordGhpcy5fY29udGVudFBhbmUuc2V0VXJsKHRoaXMuaHJlZik7Cit9Cit9LG9uTW91c2VPdmVyOmZ1bmN0aW9uKGUpeworaWYodGhpcy5fbGFzdFN0YXRlIT1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRGlzYWJsZWQpeworZG9qby5odG1sLmFkZENsYXNzKGUuY3VycmVudFRhcmdldCx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlKTsKK30KK30sb25Nb3VzZU91dDpmdW5jdGlvbihlKXsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyhlLmN1cnJlbnRUYXJnZXQsdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRTZWxlY3RTdHlsZSk7Cit9LG9uRHJvcERvd25TaG93bjpmdW5jdGlvbigpeworaWYoIXRoaXMuX2Ryb3Bkb3duLl9fYWRkZWRDb250ZW50UGFnZSl7Cit0aGlzLl9kcm9wZG93bi5hZGRDaGlsZCh0aGlzLl9jb250ZW50UGFuZSk7Cit0aGlzLl9kcm9wZG93bi5fX2FkZGVkQ29udGVudFBhZ2U9dHJ1ZTsKK30KK30sc2V0dXA6ZnVuY3Rpb24oKXsKK30sb25DaGFuZ2U6ZnVuY3Rpb24oZSl7CitpZih0aGlzLl9wYXJlbnRUb29sYmFyLmNoZWNrQXZhaWxhYmlsaXR5KCkpewordmFyIG5hbWU9ZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgiZHJvcERvd25JdGVtTmFtZSIpOwordmFyIF9hMWQ9ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CitpZihfYTFkKXsKK3ZhciBfYTFlPV9hMWQuZ2V0Q29tbWFuZCh0aGlzLl9uYW1lKTsKK2lmKF9hMWUpeworX2ExZS5leGVjdXRlKG5hbWUpOworfQorfQorfQordGhpcy5fZHJvcGRvd24uY2xvc2UoKTsKK30sb25Nb3VzZU92ZXJJdGVtOmZ1bmN0aW9uKGUpeworZG9qby5odG1sLmFkZENsYXNzKGUuY3VycmVudFRhcmdldCx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdEl0ZW1TdHlsZSk7Cit9LG9uTW91c2VPdXRJdGVtOmZ1bmN0aW9uKGUpeworZG9qby5odG1sLnJlbW92ZUNsYXNzKGUuY3VycmVudFRhcmdldCx0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdEl0ZW1TdHlsZSk7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3QiLGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtLHtocmVmOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0Zvcm1hdEJsb2NrLmh0bWwiKSxzZXR1cDpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1NlbGVjdC5zdXBlcmNsYXNzLnNldHVwLmNhbGwodGhpcyk7Cit2YXIgX2EyMT10aGlzLl9jb250ZW50UGFuZS5kb21Ob2RlLmFsbHx8dGhpcy5fY29udGVudFBhbmUuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwordGhpcy5fYmxvY2tOYW1lcz17fTsKK3RoaXMuX2Jsb2NrRGlzcGxheU5hbWVzPXt9OworZm9yKHZhciB4PTA7eDxfYTIxLmxlbmd0aDt4KyspewordmFyIG5vZGU9X2EyMVt4XTsKK2Rvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKG5vZGUpOwordmFyIG5hbWU9bm9kZS5nZXRBdHRyaWJ1dGUoImRyb3BEb3duSXRlbU5hbWUiKTsKK2lmKG5hbWUpewordGhpcy5fYmxvY2tOYW1lc1tuYW1lXT1ub2RlOwordmFyIF9hMjU9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKK3RoaXMuX2Jsb2NrRGlzcGxheU5hbWVzW25hbWVdPV9hMjVbX2EyNS5sZW5ndGgtMV0uaW5uZXJIVE1MOworfQorfQorZm9yKHZhciBuYW1lIGluIHRoaXMuX2Jsb2NrTmFtZXMpeworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0sIm9uY2xpY2siLHRoaXMsIm9uQ2hhbmdlIik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fYmxvY2tOYW1lc1tuYW1lXSwib25tb3VzZW92ZXIiLHRoaXMsIm9uTW91c2VPdmVySXRlbSIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0sIm9ubW91c2VvdXQiLHRoaXMsIm9uTW91c2VPdXRJdGVtIik7Cit9Cit9LG9uRHJvcERvd25EZXN0cm95OmZ1bmN0aW9uKCl7CitpZih0aGlzLl9ibG9ja05hbWVzKXsKK2Zvcih2YXIgbmFtZSBpbiB0aGlzLl9ibG9ja05hbWVzKXsKK2RlbGV0ZSB0aGlzLl9ibG9ja05hbWVzW25hbWVdOworZGVsZXRlIHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzW25hbWVdOworfQorfQorfSxyZWZyZXNoU3RhdGU6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKK2lmKHRoaXMuX2xhc3RTdGF0ZSE9ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkRpc2FibGVkKXsKK3ZhciBfYTI3PWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYoX2EyNyl7Cit2YXIgX2EyOD1fYTI3LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihfYTI4KXsKK3ZhciBfYTI5PV9hMjguZ2V0VmFsdWUoKTsKK2lmKF9hMjk9PXRoaXMuX2xhc3RTZWxlY3RlZEZvcm1hdCYmdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXMpeworcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKK30KK3RoaXMuX2xhc3RTZWxlY3RlZEZvcm1hdD1fYTI5OwordmFyIF9hMmE9dGhpcy5fZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGFiZWwiKVswXTsKK3ZhciBfYTJiPWZhbHNlOworaWYodGhpcy5fYmxvY2tEaXNwbGF5TmFtZXMpeworZm9yKHZhciBuYW1lIGluIHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzKXsKK2lmKG5hbWU9PV9hMjkpeworX2EyYS5pbm5lckhUTUw9dGhpcy5fYmxvY2tEaXNwbGF5TmFtZXNbbmFtZV07CitfYTJiPXRydWU7CiticmVhazsKK30KK30KK2lmKCFfYTJiKXsKK19hMmEuaW5uZXJIVE1MPSImbmJzcDsiOworfQorfQorfQorfQorfQorcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb250U2l6ZVNlbGVjdCIsZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0se2hyZWY6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9udFNpemUuaHRtbCIpLHNldHVwOmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0LnN1cGVyY2xhc3Muc2V0dXAuY2FsbCh0aGlzKTsKK3ZhciBfYTJkPXRoaXMuX2NvbnRlbnRQYW5lLmRvbU5vZGUuYWxsfHx0aGlzLl9jb250ZW50UGFuZS5kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Cit0aGlzLl9mb250c2l6ZXM9e307Cit0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lcz17fTsKK2Zvcih2YXIgeD0wO3g8X2EyZC5sZW5ndGg7eCsrKXsKK3ZhciBub2RlPV9hMmRbeF07Citkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihub2RlKTsKK3ZhciBuYW1lPW5vZGUuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIik7CitpZihuYW1lKXsKK3RoaXMuX2ZvbnRzaXplc1tuYW1lXT1ub2RlOwordGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXNbbmFtZV09bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9udCIpWzBdLmlubmVySFRNTDsKK30KK30KK2Zvcih2YXIgbmFtZSBpbiB0aGlzLl9mb250c2l6ZXMpeworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2ZvbnRzaXplc1tuYW1lXSwib25jbGljayIsdGhpcywib25DaGFuZ2UiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sIm9ubW91c2VvdmVyIix0aGlzLCJvbk1vdXNlT3Zlckl0ZW0iKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sIm9ubW91c2VvdXQiLHRoaXMsIm9uTW91c2VPdXRJdGVtIik7Cit9Cit9LG9uRHJvcERvd25EZXN0cm95OmZ1bmN0aW9uKCl7CitpZih0aGlzLl9mb250c2l6ZXMpeworZm9yKHZhciBuYW1lIGluIHRoaXMuX2ZvbnRzaXplcyl7CitkZWxldGUgdGhpcy5fZm9udHNpemVzW25hbWVdOworZGVsZXRlIHRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzW25hbWVdOworfQorfQorfSxyZWZyZXNoU3RhdGU6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKK2lmKHRoaXMuX2xhc3RTdGF0ZSE9ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkRpc2FibGVkKXsKK3ZhciBfYTMyPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYoX2EzMil7Cit2YXIgX2EzMz1fYTMyLmdldENvbW1hbmQodGhpcy5fbmFtZSk7CitpZihfYTMzKXsKK3ZhciBzaXplPV9hMzMuZ2V0VmFsdWUoKTsKK2lmKHNpemU9PXRoaXMuX2xhc3RTZWxlY3RlZFNpemUmJnRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzKXsKK3JldHVybiB0aGlzLl9sYXN0U3RhdGU7Cit9Cit0aGlzLl9sYXN0U2VsZWN0ZWRTaXplPXNpemU7Cit2YXIgX2EzNT10aGlzLl9kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsYWJlbCIpWzBdOwordmFyIF9hMzY9ZmFsc2U7CitpZih0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lcyl7Citmb3IodmFyIG5hbWUgaW4gdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXMpeworaWYobmFtZT09c2l6ZSl7CitfYTM1LmlubmVySFRNTD10aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lc1tuYW1lXTsKK19hMzY9dHJ1ZTsKK2JyZWFrOworfQorfQoraWYoIV9hMzYpeworX2EzNS5pbm5lckhUTUw9IiZuYnNwOyI7Cit9Cit9Cit9Cit9Cit9CityZXR1cm4gdGhpcy5fbGFzdFN0YXRlOworfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnROYW1lU2VsZWN0Iixkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnRTaXplU2VsZWN0LHtocmVmOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0ZvbnROYW1lLmh0bWwiKX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhciIsZG9qby53aWRnZXQuSHRtbFdpZGdldCxmdW5jdGlvbigpeworZG9qby5ldmVudC5jb25uZWN0KHRoaXMsImZpbGxJblRlbXBsYXRlIixkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbigpeworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit0aGlzLmRvbU5vZGUuc3R5bGUuem9vbT0xOworfQorfSkpOworfSx7dGVtcGxhdGVTdHJpbmc6IjxkaXYgZG9qb0F0dGFjaFBvaW50PVwiZG9tTm9kZVwiIGNsYXNzPVwiRWRpdG9yVG9vbGJhckRvbU5vZGVcIiB1bnNlbGVjdGFibGU9XCJvblwiPlxyXG5cdDx0YWJsZSBjZWxscGFkZGluZz1cIjNcIiBjZWxsc3BhY2luZz1cIjBcIiBib3JkZXI9XCIwXCI+XHJcblx0XHQ8IS0tXHJcblx0XHRcdG91ciB0b29sYmFyIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOlxyXG5cclxuXHRcdFx0Kz09PT09PT0rPT09PT09PSs9PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcclxuXHRcdFx0fCB3ICAgdyB8IHN0eWxlIHwgY29weSAgfCBibyB8IGl0IHwgdW4gfCBsZSB8IGNlIHwgcmkgfFxyXG5cdFx0XHR8IHcgdyB3IHwgc3R5bGUgfD09PT09PT18PT09PT09PT09PT09PT18PT09PT09PT09PT09PT18XHJcblx0XHRcdHwgIHcgdyAgfCBzdHlsZSB8IHBhc3RlIHwgIHVuZG8gfCByZWRvIHwgY2hhbmdlIHN0eWxlIHxcclxuXHRcdFx0Kz09PT09PT0rPT09PT09PSs9PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcclxuXHRcdC0tPlxyXG5cdFx0PHRib2R5PlxyXG5cdFx0XHQ8dHIgdmFsaWduPVwidG9wXCI+XHJcblx0XHRcdFx0PHRkIHJvd3NwYW49XCIyXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmlnSWNvblwiIGRvam9BdHRhY2hQb2ludD1cIndpa2lXb3JkQnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJ3aWtpV29yZENsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDMwcHg7IG1hcmdpbi1sZWZ0OiA1cHg7XCI+XHJcblx0XHRcdFx0XHRcdFx0V1xyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCByb3dzcGFuPVwiMlwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJpZ0ljb25cIiBkb2pvQXR0YWNoUG9pbnQ9XCJzdHlsZURyb3Bkb3duQnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJzdHlsZURyb3Bkb3duQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiB1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmb250LXNpemU6IDMwcHg7IG1hcmdpbi1sZWZ0OiA1cHg7XCI+XHJcblx0XHRcdFx0XHRcdFx0U1xyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJTdHlsZURyb3Bkb3duQ29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcblx0XHRcdFx0XHRcdGRvam9BdHRhY2hQb2ludD1cInN0eWxlRHJvcGRvd25Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHRhYmxlIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIlxyXG5cdFx0XHRcdFx0XHRcdGhlaWdodD1cIjEwMCVcIiB3aWR0aD1cIjEwMCVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8dHIgdmFsaWduPVwidG9wXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQgcm93c3Bhbj1cIjJcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBzdHlsZT1cImhlaWdodDogMjQ1cHg7IG92ZXJmbG93OiBhdXRvO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwibm9ybWFsVGV4dENsaWNrXCI+bm9ybWFsPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGgxIGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImgxVGV4dENsaWNrXCI+SGVhZGluZyAxPC9oMT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aDIgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiaDJUZXh0Q2xpY2tcIj5IZWFkaW5nIDI8L2gyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxoMyBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJoM1RleHRDbGlja1wiPkhlYWRpbmcgMzwvaDM+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGg0IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImg0VGV4dENsaWNrXCI+SGVhZGluZyA0PC9oND5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImJsYWhUZXh0Q2xpY2tcIj5ibGFoPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJibGFoVGV4dENsaWNrXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiYmxhaFRleHRDbGlja1wiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PCEtLVxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5bGVmdFwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb09uQ2xpY2s9XCJidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeWNlbnRlclwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb09uQ2xpY2s9XCJidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeXJpZ2h0XCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5ZnVsbFwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQtLT5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciB2YWxpZ249XCJ0b3BcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGh1ZFxyXG5cdFx0XHRcdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHQ8L3RhYmxlPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8IS0tIGNvcHkgLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjb3B5QnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImNvcHlDbGljazsgYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBjb3B5XCIgXHJcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCI+Jm5ic3A7PC9zcGFuPiBjb3B5XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tIFwiZHJvcHBhYmxlXCIgb3B0aW9ucyAtLT5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImJvbGRCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiYm9sZENsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGJvbGRcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cIml0YWxpY0J1dHRvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiaXRhbGljQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24gaXRhbGljXCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJ1bmRlcmxpbmVCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInVuZGVybGluZUNsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIHVuZGVybGluZVwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwibGVmdEJ1dHRvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwibGVmdENsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGp1c3RpZnlsZWZ0XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJmdWxsQnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJmdWxsQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeWZ1bGxcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInJpZ2h0QnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJyaWdodENsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGp1c3RpZnlyaWdodFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdDwvdHI+XHJcblx0XHRcdDx0cj5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8IS0tIHBhc3RlIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwicGFzdGVCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInBhc3RlQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiIHVuc2VsZWN0YWJsZT1cIm9uXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBwYXN0ZVwiIHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+IHBhc3RlXHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tIFwiZHJvcHBhYmxlXCIgb3B0aW9ucyAtLT5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInVuZG9CdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInVuZG9DbGljazsgYnV0dG9uQ2xpY2s7XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIHVuZG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0O1wiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPiB1bmRvXHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJyZWRvQnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJyZWRvQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiIHVuc2VsZWN0YWJsZT1cIm9uXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiByZWRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdDtcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj4gcmVkb1xyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHRcclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGJvZHk+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbiIsdGVtcGxhdGVDc3NTdHJpbmc6Ii5TdHlsZURyb3Bkb3duQ29udGFpbmVyIHtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDtcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcblx0d2lkdGg6IDI1MHB4O1xyXG5cdGhlaWdodDogMjUwcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcbn1cclxuXHJcbi5Db2xvckRyb3Bkb3duQ29udGFpbmVyIHtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDtcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcblx0d2lkdGg6IDI1MHB4O1xyXG5cdGhlaWdodDogMTUwcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyRG9tTm9kZSB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGJ1dHRvbnMvYmctZmFkZS5wbmcpO1xyXG5cdGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcclxuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggLTUwcHg7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyU21hbGxCZyB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy90b29sYmFyLWJnLmdpZik7XHJcblx0YmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xyXG5cdGJhY2tncm91bmQtcG9zaXRpb246IDBweCAwcHg7XHJcbn1cclxuXHJcbi8qXHJcbmJvZHkge1xyXG5cdGJhY2tncm91bmQ6dXJsKGltYWdlcy9ibGFuay5naWYpIGZpeGVkO1xyXG59Ki9cclxuXHJcbi5JRUZpeGVkVG9vbGJhciB7XHJcblx0cG9zaXRpb246YWJzb2x1dGU7XHJcblx0LyogdG9wOjA7ICovXHJcblx0dG9wOiBleHByZXNzaW9uKGV2YWwoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKSk7XHJcbn1cclxuXHJcbmRpdi5iaWdJY29uIHtcclxuXHR3aWR0aDogNDBweDtcclxuXHRoZWlnaHQ6IDQwcHg7IFxyXG5cdC8qIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAqL1xyXG5cdC8qIGJvcmRlcjogMXB4IHNvbGlkICNhNmE3YTM7ICovXHJcblx0Zm9udC1mYW1pbHk6IFZlcmRhbmEsIFRyZWJ1Y2hldCwgVGFob21hLCBBcmlhbDtcclxufVxyXG5cclxuLmljb25Db250YWluZXIge1xyXG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBUcmVidWNoZXQsIFRhaG9tYSwgQXJpYWw7XHJcblx0Zm9udC1zaXplOiAxM3B4O1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cdGhlaWdodDogMThweDtcclxuXHRkaXNwbGF5OiBibG9jaztcclxuXHQvKiBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgKi9cclxuXHRjdXJzb3I6IHBvaW50ZXI7XHJcblx0cGFkZGluZzogMXB4IDRweCAxcHggMXB4OyAvKiBhbG1vc3QgdGhlIHNhbWUgYXMgYSB0cmFuc3BhcmVudCBib3JkZXIgKi9cclxuXHRib3JkZXI6IDBweDtcclxufVxyXG5cclxuLmRvam9FMlRCSWNvbiB7XHJcblx0ZGlzcGxheTogYmxvY2s7XHJcblx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdG1pbi13aWR0aDogMThweDtcclxuXHR3aWR0aDogMThweDtcclxuXHRoZWlnaHQ6IDE4cHg7XHJcblx0LyogYmFja2dyb3VuZC1jb2xvcjogI2E2YTdhMzsgKi9cclxuXHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChidXR0b25zL2FnZ3JlZ2F0ZS5naWYpO1xyXG59XHJcblxyXG5cclxuLmRvam9FMlRCSWNvbltjbGFzc349ZG9qb0UyVEJJY29uXSB7XHJcbn1cclxuXHJcbi5Ub29sYmFyQnV0dG9uTGF0Y2hlZCB7XHJcbiAgICBib3JkZXI6ICMzMTZhYzUgMXB4IHNvbGlkOyAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2MxZDJlZTtcclxufVxyXG5cclxuLlRvb2xiYXJCdXR0b25IaWdobGlnaHRlZCB7XHJcbiAgICBib3JkZXI6ICMzMTZhYzUgMXB4IHNvbGlkOyAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjFmZjtcclxufVxyXG5cclxuLlRvb2xiYXJCdXR0b25EaXNhYmxlZHtcclxuICAgIGZpbHRlcjogZ3JheSgpIGFscGhhKG9wYWNpdHk9MzApOyAvKiBJRSAqL1xyXG4gICAgb3BhY2l0eTogMC4zMDsgLyogU2FmYXJpLCBPcGVyYSBhbmQgTW96aWxsYSAqL1xyXG59XHJcblxyXG4uaGVhZGluZ0NvbnRhaW5lciB7XHJcblx0d2lkdGg6IDE1MHB4O1xyXG5cdGhlaWdodDogMzBweDtcclxuXHRtYXJnaW46IDBweDtcclxuXHQvKiBwYWRkaW5nLWxlZnQ6IDVweDsgKi9cclxuXHRvdmVyZmxvdzogaGlkZGVuO1xyXG5cdGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG5cdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcclxuXHRib3JkZXItdG9wOiAxcHggc29saWQgd2hpdGU7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyRG9tTm9kZSBzZWxlY3Qge1xyXG5cdGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG4gXHJcbi5kb2pvRTJUQkljb25fU2VwIHsgd2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7IG1heC13aWR0aDogNXB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0JhY2tjb2xvciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9Cb2xkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0NhbmNlbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9Db3B5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0xpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQ3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwOHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9EZWxldGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1RleHRDb2xvciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQmFja2dyb3VuZENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTgwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0hvcml6b250YWxMaW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5OHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTZweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fTnVtYmVyZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIzNHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9UYWJsZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNTJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQnVsbGV0ZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JdGFsaWMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg4cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0NlbnRlckp1c3RpZnkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzA2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0Jsb2NrSnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMjRweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fTGVmdEp1c3RpZnkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzQycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1JpZ2h0SnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNjBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fbGVmdF90b19yaWdodCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fbGlzdF9idWxsZXRfaW5kZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM5NnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9saXN0X2J1bGxldF9vdXRkZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQxNHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9saXN0X251bV9pbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDMycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX2xpc3RfbnVtX291dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDUwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX091dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDY4cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1Bhc3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4NnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9SZWRvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwNHB4IDBweH1cclxuZG9qb0UyVEJJY29uX1JlbW92ZUZvcm1hdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MjJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fcmlnaHRfdG9fbGVmdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NDBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU2F2ZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NThweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU3BhY2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTc2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1N0cmlrZVRocm91Z2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk0cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1N1YnNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MTJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU3VwZXJzY3JpcHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjMwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1VuZGVybGluZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NDhweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fVW5kbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NjZweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fV2lraVdvcmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjg0cHggMHB4fVxyXG5cclxuIix0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9FZGl0b3JUb29sYmFyLmNzcyIpLFRvb2xiYXJMYXRjaGVkSXRlbVN0eWxlOiJUb29sYmFyQnV0dG9uTGF0Y2hlZCIsVG9vbGJhckVuYWJsZWRJdGVtU3R5bGU6IlRvb2xiYXJCdXR0b25FbmFibGVkIixUb29sYmFyRGlzYWJsZWRJdGVtU3R5bGU6IlRvb2xiYXJCdXR0b25EaXNhYmxlZCIsVG9vbGJhckhpZ2hsaWdodGVkSXRlbVN0eWxlOiJUb29sYmFyQnV0dG9uSGlnaGxpZ2h0ZWQiLFRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlOiJUb29sYmFyU2VsZWN0SGlnaGxpZ2h0ZWQiLFRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdEl0ZW1TdHlsZToiVG9vbGJhclNlbGVjdEhpZ2hsaWdodGVkSXRlbSIscG9zdENyZWF0ZTpmdW5jdGlvbigpewordmFyIF9hMzg9ZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzcygiZG9qb0VkaXRvclRvb2xiYXJJdGVtIix0aGlzLmRvbU5vZGUpOwordGhpcy5pdGVtcz17fTsKK2Zvcih2YXIgeD0wO3g8X2EzOC5sZW5ndGg7eCsrKXsKK3ZhciBub2RlPV9hMzhbeF07Cit2YXIgX2EzYj1ub2RlLmdldEF0dHJpYnV0ZSgiZG9qb0VUSXRlbU5hbWUiKTsKK2lmKF9hM2IpewordmFyIGl0ZW09ZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJJdGVtTWFuYWdlci5nZXRUb29sYmFySXRlbShfYTNiKTsKK2lmKGl0ZW0peworaXRlbS5jcmVhdGUobm9kZSx0aGlzKTsKK3RoaXMuaXRlbXNbX2EzYi50b0xvd2VyQ2FzZSgpXT1pdGVtOworfWVsc2V7Citub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworfQorfQorfQorfSx1cGRhdGU6ZnVuY3Rpb24oKXsKK2Zvcih2YXIgY21kIGluIHRoaXMuaXRlbXMpewordGhpcy5pdGVtc1tjbWRdLnJlZnJlc2hTdGF0ZSgpOworfQorfSxzaGFyZUdyb3VwOiIiLGNoZWNrQXZhaWxhYmlsaXR5OmZ1bmN0aW9uKCl7CitpZighdGhpcy5zaGFyZUdyb3VwKXsKK3RoaXMucGFyZW50LmZvY3VzKCk7CityZXR1cm4gdHJ1ZTsKK30KK3ZhciBfYTNlPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworaWYodGhpcy5zaGFyZUdyb3VwPT1fYTNlLnRvb2xiYXJHcm91cCl7CityZXR1cm4gdHJ1ZTsKK30KK3JldHVybiBmYWxzZTsKK30sZGVzdHJveTpmdW5jdGlvbigpeworZm9yKHZhciBpdCBpbiB0aGlzLml0ZW1zKXsKK3RoaXMuaXRlbXNbaXRdLmRlc3Ryb3koKTsKK2RlbGV0ZSB0aGlzLml0ZW1zW2l0XTsKK30KK2Rvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLnVyaS5jYWNoZSIpOworZG9qby51cmkuY2FjaGU9e19jYWNoZTp7fSxzZXQ6ZnVuY3Rpb24odXJpLF9hNDEpewordGhpcy5fY2FjaGVbdXJpLnRvU3RyaW5nKCldPV9hNDE7CityZXR1cm4gdXJpOworfSxyZW1vdmU6ZnVuY3Rpb24odXJpKXsKK2RlbGV0ZSB0aGlzLl9jYWNoZVt1cmkudG9TdHJpbmcoKV07Cit9LGdldDpmdW5jdGlvbih1cmkpewordmFyIGtleT11cmkudG9TdHJpbmcoKTsKK3ZhciBfYTQ1PXRoaXMuX2NhY2hlW2tleV07CitpZighX2E0NSl7CitfYTQ1PWRvam8uaG9zdGVudi5nZXRUZXh0KGtleSk7CitpZihfYTQ1KXsKK3RoaXMuX2NhY2hlW2tleV09X2E0NTsKK30KK30KK3JldHVybiBfYTQ1OworfSxhbGxvdzpmdW5jdGlvbih1cmkpeworcmV0dXJuIHVyaTsKK319OworZG9qby5wcm92aWRlKCJkb2pvLmxmeC5zaGFkb3ciKTsKK2Rvam8ubGZ4LnNoYWRvdz1mdW5jdGlvbihub2RlKXsKK3RoaXMuc2hhZG93UG5nPWRvam8udXJpLm1vZHVsZVVyaSgiZG9qby5odG1sIiwiaW1hZ2VzL3NoYWRvdyIpOwordGhpcy5zaGFkb3dUaGlja25lc3M9ODsKK3RoaXMuc2hhZG93T2Zmc2V0PTE1OwordGhpcy5pbml0KG5vZGUpOworfTsKK2Rvam8uZXh0ZW5kKGRvam8ubGZ4LnNoYWRvdyx7aW5pdDpmdW5jdGlvbihub2RlKXsKK3RoaXMubm9kZT1ub2RlOwordGhpcy5waWVjZXM9e307Cit2YXIgeDE9LTEqdGhpcy5zaGFkb3dUaGlja25lc3M7Cit2YXIgeTA9dGhpcy5zaGFkb3dPZmZzZXQ7Cit2YXIgeTE9dGhpcy5zaGFkb3dPZmZzZXQrdGhpcy5zaGFkb3dUaGlja25lc3M7Cit0aGlzLl9tYWtlUGllY2UoInRsIiwidG9wIix5MCwibGVmdCIseDEpOwordGhpcy5fbWFrZVBpZWNlKCJsIiwidG9wIix5MSwibGVmdCIseDEsInNjYWxlIik7Cit0aGlzLl9tYWtlUGllY2UoInRyIiwidG9wIix5MCwibGVmdCIsMCk7Cit0aGlzLl9tYWtlUGllY2UoInIiLCJ0b3AiLHkxLCJsZWZ0IiwwLCJzY2FsZSIpOwordGhpcy5fbWFrZVBpZWNlKCJibCIsInRvcCIsMCwibGVmdCIseDEpOwordGhpcy5fbWFrZVBpZWNlKCJiIiwidG9wIiwwLCJsZWZ0IiwwLCJjcm9wIik7Cit0aGlzLl9tYWtlUGllY2UoImJyIiwidG9wIiwwLCJsZWZ0IiwwKTsKK30sX21ha2VQaWVjZTpmdW5jdGlvbihuYW1lLF9hNGQsX2E0ZSxfYTRmLF9hNTAsX2E1MSl7Cit2YXIgaW1nOwordmFyIHVybD10aGlzLnNoYWRvd1BuZytuYW1lLnRvVXBwZXJDYXNlKCkrIi5wbmciOworaWYoZG9qby5yZW5kZXIuaHRtbC5pZTU1fHxkb2pvLnJlbmRlci5odG1sLmllNjApeworaW1nPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CitpbWcuc3R5bGUuZmlsdGVyPSJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihzcmM9JyIrdXJsKyInIisoX2E1MT8iLCBzaXppbmdNZXRob2Q9JyIrX2E1MSsiJyI6IiIpKyIpIjsKK31lbHNleworaW1nPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiaW1nIik7CitpbWcuc3JjPXVybDsKK30KK2ltZy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiOworaW1nLnN0eWxlW19hNGRdPV9hNGUrInB4IjsKK2ltZy5zdHlsZVtfYTRmXT1fYTUwKyJweCI7CitpbWcuc3R5bGUud2lkdGg9dGhpcy5zaGFkb3dUaGlja25lc3MrInB4IjsKK2ltZy5zdHlsZS5oZWlnaHQ9dGhpcy5zaGFkb3dUaGlja25lc3MrInB4IjsKK3RoaXMucGllY2VzW25hbWVdPWltZzsKK3RoaXMubm9kZS5hcHBlbmRDaGlsZChpbWcpOworfSxzaXplOmZ1bmN0aW9uKF9hNTQsX2E1NSl7Cit2YXIgX2E1Nj1fYTU1LSh0aGlzLnNoYWRvd09mZnNldCt0aGlzLnNoYWRvd1RoaWNrbmVzcysxKTsKK2lmKF9hNTY8MCl7CitfYTU2PTA7Cit9CitpZihfYTU1PDEpeworX2E1NT0xOworfQoraWYoX2E1NDwxKXsKK19hNTQ9MTsKK30KK3dpdGgodGhpcy5waWVjZXMpeworbC5zdHlsZS5oZWlnaHQ9X2E1NisicHgiOworci5zdHlsZS5oZWlnaHQ9X2E1NisicHgiOworYi5zdHlsZS53aWR0aD0oX2E1NC0xKSsicHgiOworYmwuc3R5bGUudG9wPShfYTU1LTEpKyJweCI7CitiLnN0eWxlLnRvcD0oX2E1NS0xKSsicHgiOworYnIuc3R5bGUudG9wPShfYTU1LTEpKyJweCI7Cit0ci5zdHlsZS5sZWZ0PShfYTU0LTEpKyJweCI7CityLnN0eWxlLmxlZnQ9KF9hNTQtMSkrInB4IjsKK2JyLnN0eWxlLmxlZnQ9KF9hNTQtMSkrInB4IjsKK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKK2Rvam8ud2lkZ2V0Lmh0bWwubGF5b3V0PWZ1bmN0aW9uKF9hNTcsX2E1OCxfYTU5KXsKK2Rvam8uaHRtbC5hZGRDbGFzcyhfYTU3LCJkb2pvTGF5b3V0Q29udGFpbmVyIik7CitfYTU4PWRvam8ubGFuZy5maWx0ZXIoX2E1OCxmdW5jdGlvbihfYTVhLGlkeCl7CitfYTVhLmlkeD1pZHg7CityZXR1cm4gZG9qby5sYW5nLmluQXJyYXkoWyJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJjbGllbnQiLCJmbG9vZCJdLF9hNWEubGF5b3V0QWxpZ24pOworfSk7CitpZihfYTU5JiZfYTU5IT0ibm9uZSIpewordmFyIHJhbms9ZnVuY3Rpb24oX2E1ZCl7Citzd2l0Y2goX2E1ZC5sYXlvdXRBbGlnbil7CitjYXNlICJmbG9vZCI6CityZXR1cm4gMTsKK2Nhc2UgImxlZnQiOgorY2FzZSAicmlnaHQiOgorcmV0dXJuIChfYTU5PT0ibGVmdC1yaWdodCIpPzI6MzsKK2Nhc2UgInRvcCI6CitjYXNlICJib3R0b20iOgorcmV0dXJuIChfYTU5PT0ibGVmdC1yaWdodCIpPzM6MjsKK2RlZmF1bHQ6CityZXR1cm4gNDsKK30KK307CitfYTU4LnNvcnQoZnVuY3Rpb24oYSxiKXsKK3JldHVybiAocmFuayhhKS1yYW5rKGIpKXx8KGEuaWR4LWIuaWR4KTsKK30pOworfQordmFyIGY9e3RvcDpkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShfYTU3LCJwYWRkaW5nLXRvcCIsdHJ1ZSksbGVmdDpkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZShfYTU3LCJwYWRkaW5nLWxlZnQiLHRydWUpfTsKK2Rvam8ubGFuZy5taXhpbihmLGRvam8uaHRtbC5nZXRDb250ZW50Qm94KF9hNTcpKTsKK2Rvam8ubGFuZy5mb3JFYWNoKF9hNTgsZnVuY3Rpb24oX2E2MSl7Cit2YXIgZWxtPV9hNjEuZG9tTm9kZTsKK3ZhciBwb3M9X2E2MS5sYXlvdXRBbGlnbjsKK3dpdGgoZWxtLnN0eWxlKXsKK2xlZnQ9Zi5sZWZ0KyJweCI7Cit0b3A9Zi50b3ArInB4IjsKK2JvdHRvbT0iYXV0byI7CityaWdodD0iYXV0byI7Cit9Citkb2pvLmh0bWwuYWRkQ2xhc3MoZWxtLCJkb2pvQWxpZ24iK2Rvam8uc3RyaW5nLmNhcGl0YWxpemUocG9zKSk7CitpZigocG9zPT0idG9wIil8fChwb3M9PSJib3R0b20iKSl7Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94KGVsbSx7d2lkdGg6Zi53aWR0aH0pOwordmFyIGg9ZG9qby5odG1sLmdldE1hcmdpbkJveChlbG0pLmhlaWdodDsKK2YuaGVpZ2h0LT1oOworaWYocG9zPT0idG9wIil7CitmLnRvcCs9aDsKK31lbHNleworZWxtLnN0eWxlLnRvcD1mLnRvcCtmLmhlaWdodCsicHgiOworfQoraWYoX2E2MS5vblJlc2l6ZWQpeworX2E2MS5vblJlc2l6ZWQoKTsKK30KK31lbHNleworaWYocG9zPT0ibGVmdCJ8fHBvcz09InJpZ2h0Iil7Cit2YXIgdz1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KGVsbSkud2lkdGg7CitpZihfYTYxLnJlc2l6ZVRvKXsKK19hNjEucmVzaXplVG8odyxmLmhlaWdodCk7Cit9ZWxzZXsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3goZWxtLHt3aWR0aDp3LGhlaWdodDpmLmhlaWdodH0pOworfQorZi53aWR0aC09dzsKK2lmKHBvcz09ImxlZnQiKXsKK2YubGVmdCs9dzsKK31lbHNleworZWxtLnN0eWxlLmxlZnQ9Zi5sZWZ0K2Yud2lkdGgrInB4IjsKK30KK31lbHNleworaWYocG9zPT0iZmxvb2QifHxwb3M9PSJjbGllbnQiKXsKK2lmKF9hNjEucmVzaXplVG8peworX2E2MS5yZXNpemVUbyhmLndpZHRoLGYuaGVpZ2h0KTsKK31lbHNleworZG9qby5odG1sLnNldE1hcmdpbkJveChlbG0se3dpZHRoOmYud2lkdGgsaGVpZ2h0OmYuaGVpZ2h0fSk7Cit9Cit9Cit9Cit9Cit9KTsKK307Citkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCgiLmRvam9MYXlvdXRDb250YWluZXJ7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IH1cbiIrImJvZHkgLmRvam9BbGlnblRvcCwgYm9keSAuZG9qb0FsaWduQm90dG9tLCBib2R5IC5kb2pvQWxpZ25MZWZ0LCBib2R5IC5kb2pvQWxpZ25SaWdodCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuIisiYm9keSAuZG9qb0FsaWduQ2xpZW50IHsgcG9zaXRpb246IGFic29sdXRlIH1cbiIrIi5kb2pvQWxpZ25DbGllbnQgeyBvdmVyZmxvdzogYXV0bzsgfVxuIik7Citkb2pvLnByb3ZpZGUoImRvam8uZG5kLkRyYWdBbmREcm9wIik7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdTb3VyY2UiLG51bGwse3R5cGU6IiIsb25EcmFnRW5kOmZ1bmN0aW9uKGV2dCl7Cit9LG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uKGV2dCl7Cit9LG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oZXZ0KXsKK30sdW5yZWdpc3RlcjpmdW5jdGlvbigpeworZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7Cit9LHJlcmVnaXN0ZXI6ZnVuY3Rpb24oKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnJlZ2lzdGVyRHJhZ1NvdXJjZSh0aGlzKTsKK319KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuRHJhZ09iamVjdCIsbnVsbCx7dHlwZToiIixyZWdpc3RlcjpmdW5jdGlvbigpewordmFyIGRtPWRvam8uZG5kLmRyYWdNYW5hZ2VyOworaWYoZG1bInJlZ2lzdGVyRHJhZ09iamVjdCJdKXsKK2RtLnJlZ2lzdGVyRHJhZ09iamVjdCh0aGlzKTsKK30KK30sb25EcmFnU3RhcnQ6ZnVuY3Rpb24oZXZ0KXsKK30sb25EcmFnTW92ZTpmdW5jdGlvbihldnQpeworfSxvbkRyYWdPdmVyOmZ1bmN0aW9uKGV2dCl7Cit9LG9uRHJhZ091dDpmdW5jdGlvbihldnQpeworfSxvbkRyYWdFbmQ6ZnVuY3Rpb24oZXZ0KXsKK30sb25EcmFnTGVhdmU6ZG9qby5sYW5nLmZvcndhcmQoIm9uRHJhZ091dCIpLG9uRHJhZ0VudGVyOmRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdmVyIiksb25kcmFnb3V0OmRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdXQiKSxvbmRyYWdvdmVyOmRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdmVyIil9KTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuRHJvcFRhcmdldCIsbnVsbCx7YWNjZXB0c1R5cGU6ZnVuY3Rpb24odHlwZSl7CitpZighZG9qby5sYW5nLmluQXJyYXkodGhpcy5hY2NlcHRlZFR5cGVzLCIqIikpeworaWYoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMuYWNjZXB0ZWRUeXBlcyx0eXBlKSl7CityZXR1cm4gZmFsc2U7Cit9Cit9CityZXR1cm4gdHJ1ZTsKK30sYWNjZXB0czpmdW5jdGlvbihfYTcwKXsKK2lmKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLmFjY2VwdGVkVHlwZXMsIioiKSl7Citmb3IodmFyIGk9MDtpPF9hNzAubGVuZ3RoO2krKyl7CitpZighZG9qby5sYW5nLmluQXJyYXkodGhpcy5hY2NlcHRlZFR5cGVzLF9hNzBbaV0udHlwZSkpeworcmV0dXJuIGZhbHNlOworfQorfQorfQorcmV0dXJuIHRydWU7Cit9LHVucmVnaXN0ZXI6ZnVuY3Rpb24oKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcm9wVGFyZ2V0KHRoaXMpOworfSxvbkRyYWdPdmVyOmZ1bmN0aW9uKGV2dCl7Cit9LG9uRHJhZ091dDpmdW5jdGlvbihldnQpeworfSxvbkRyYWdNb3ZlOmZ1bmN0aW9uKGV2dCl7Cit9LG9uRHJvcFN0YXJ0OmZ1bmN0aW9uKGV2dCl7Cit9LG9uRHJvcDpmdW5jdGlvbihldnQpeworfSxvbkRyb3BFbmQ6ZnVuY3Rpb24oKXsKK319LGZ1bmN0aW9uKCl7Cit0aGlzLmFjY2VwdGVkVHlwZXM9W107Cit9KTsKK2Rvam8uZG5kLkRyYWdFdmVudD1mdW5jdGlvbigpewordGhpcy5kcmFnU291cmNlPW51bGw7Cit0aGlzLmRyYWdPYmplY3Q9bnVsbDsKK3RoaXMudGFyZ2V0PW51bGw7Cit0aGlzLmV2ZW50U3RhdHVzPSJzdWNjZXNzIjsKK307Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdNYW5hZ2VyIixudWxsLHtzZWxlY3RlZFNvdXJjZXM6W10sZHJhZ09iamVjdHM6W10sZHJhZ1NvdXJjZXM6W10scmVnaXN0ZXJEcmFnU291cmNlOmZ1bmN0aW9uKF9hNzcpeworfSxkcm9wVGFyZ2V0czpbXSxyZWdpc3RlckRyb3BUYXJnZXQ6ZnVuY3Rpb24oX2E3OCl7Cit9LGxhc3REcmFnVGFyZ2V0Om51bGwsY3VycmVudERyYWdUYXJnZXQ6bnVsbCxvbktleURvd246ZnVuY3Rpb24oKXsKK30sb25Nb3VzZU91dDpmdW5jdGlvbigpeworfSxvbk1vdXNlTW92ZTpmdW5jdGlvbigpeworfSxvbk1vdXNlVXA6ZnVuY3Rpb24oKXsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuSHRtbERyYWdNYW5hZ2VyIik7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcmFnTWFuYWdlciIsZG9qby5kbmQuRHJhZ01hbmFnZXIse2Rpc2FibGVkOmZhbHNlLG5lc3RlZFRhcmdldHM6ZmFsc2UsbW91c2VEb3duVGltZXI6bnVsbCxkc0NvdW50ZXI6MCxkc1ByZWZpeDoiZG9qb0RyYWdTb3VyY2UiLGRyb3BUYXJnZXREaW1lbnNpb25zOltdLGN1cnJlbnREcm9wVGFyZ2V0Om51bGwscHJldmlvdXNEcm9wVGFyZ2V0Om51bGwsX2RyYWdUcmlnZ2VyZWQ6ZmFsc2Usc2VsZWN0ZWRTb3VyY2VzOltdLGRyYWdPYmplY3RzOltdLGRyYWdTb3VyY2VzOltdLGRyb3BUYXJnZXRzOltdLGN1cnJlbnRYOm51bGwsY3VycmVudFk6bnVsbCxsYXN0WDpudWxsLGxhc3RZOm51bGwsbW91c2VEb3duWDpudWxsLG1vdXNlRG93blk6bnVsbCx0aHJlc2hvbGQ6Nyxkcm9wQWNjZXB0YWJsZTpmYWxzZSxjYW5jZWxFdmVudDpmdW5jdGlvbihlKXsKK2Uuc3RvcFByb3BhZ2F0aW9uKCk7CitlLnByZXZlbnREZWZhdWx0KCk7Cit9LHJlZ2lzdGVyRHJhZ1NvdXJjZTpmdW5jdGlvbihkcyl7CitpZihkc1siZG9tTm9kZSJdKXsKK3ZhciBkcD10aGlzLmRzUHJlZml4OwordmFyIF9hN2M9ZHArIklkeF8iKyh0aGlzLmRzQ291bnRlcisrKTsKK2RzLmRyYWdTb3VyY2VJZD1fYTdjOwordGhpcy5kcmFnU291cmNlc1tfYTdjXT1kczsKK2RzLmRvbU5vZGUuc2V0QXR0cmlidXRlKGRwLF9hN2MpOworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Citkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoZHMuZG9tTm9kZSwib25kcmFnc3RhcnQiLHRoaXMuY2FuY2VsRXZlbnQpOworfQorfQorfSx1bnJlZ2lzdGVyRHJhZ1NvdXJjZTpmdW5jdGlvbihkcyl7CitpZihkc1siZG9tTm9kZSJdKXsKK3ZhciBkcD10aGlzLmRzUHJlZml4OwordmFyIF9hN2Y9ZHMuZHJhZ1NvdXJjZUlkOworZGVsZXRlIGRzLmRyYWdTb3VyY2VJZDsKK2RlbGV0ZSB0aGlzLmRyYWdTb3VyY2VzW19hN2ZdOworZHMuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoZHAsbnVsbCk7CitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5yZW1vdmVMaXN0ZW5lcihkcy5kb21Ob2RlLCJvbmRyYWdzdGFydCIsdGhpcy5jYW5jZWxFdmVudCk7Cit9Cit9Cit9LHJlZ2lzdGVyRHJvcFRhcmdldDpmdW5jdGlvbihkdCl7Cit0aGlzLmRyb3BUYXJnZXRzLnB1c2goZHQpOworfSx1bnJlZ2lzdGVyRHJvcFRhcmdldDpmdW5jdGlvbihkdCl7Cit2YXIgX2E4Mj1kb2pvLmxhbmcuZmluZCh0aGlzLmRyb3BUYXJnZXRzLGR0LHRydWUpOworaWYoX2E4Mj49MCl7Cit0aGlzLmRyb3BUYXJnZXRzLnNwbGljZShfYTgyLDEpOworfQorfSxnZXREcmFnU291cmNlOmZ1bmN0aW9uKGUpewordmFyIHRuPWUudGFyZ2V0OworaWYodG49PT1kb2pvLmJvZHkoKSl7CityZXR1cm47Cit9Cit2YXIgdGE9ZG9qby5odG1sLmdldEF0dHJpYnV0ZSh0bix0aGlzLmRzUHJlZml4KTsKK3doaWxlKCghdGEpJiYodG4pKXsKK3RuPXRuLnBhcmVudE5vZGU7CitpZigoIXRuKXx8KHRuPT09ZG9qby5ib2R5KCkpKXsKK3JldHVybjsKK30KK3RhPWRvam8uaHRtbC5nZXRBdHRyaWJ1dGUodG4sdGhpcy5kc1ByZWZpeCk7Cit9CityZXR1cm4gdGhpcy5kcmFnU291cmNlc1t0YV07Cit9LG9uS2V5RG93bjpmdW5jdGlvbihlKXsKK30sb25Nb3VzZURvd246ZnVuY3Rpb24oZSl7CitpZih0aGlzLmRpc2FibGVkKXsKK3JldHVybjsKK30KK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworaWYoZS5idXR0b24hPTEpeworcmV0dXJuOworfQorfWVsc2V7CitpZihlLndoaWNoIT0xKXsKK3JldHVybjsKK30KK30KK3ZhciBfYTg4PWUudGFyZ2V0Lm5vZGVUeXBlPT1kb2pvLmh0bWwuVEVYVF9OT0RFP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQ7CitpZihkb2pvLmh0bWwuaXNUYWcoX2E4OCwiYnV0dG9uIiwidGV4dGFyZWEiLCJpbnB1dCIsInNlbGVjdCIsIm9wdGlvbiIpKXsKK3JldHVybjsKK30KK3ZhciBkcz10aGlzLmdldERyYWdTb3VyY2UoZSk7CitpZighZHMpeworcmV0dXJuOworfQoraWYoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMuc2VsZWN0ZWRTb3VyY2VzLGRzKSl7Cit0aGlzLnNlbGVjdGVkU291cmNlcy5wdXNoKGRzKTsKK2RzLm9uU2VsZWN0ZWQoKTsKK30KK3RoaXMubW91c2VEb3duWD1lLnBhZ2VYOwordGhpcy5tb3VzZURvd25ZPWUucGFnZVk7CitlLnByZXZlbnREZWZhdWx0KCk7Citkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQsIm9ubW91c2Vtb3ZlIix0aGlzLCJvbk1vdXNlTW92ZSIpOworfSxvbk1vdXNlVXA6ZnVuY3Rpb24oZSxfYThiKXsKK2lmKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aD09MCl7CityZXR1cm47Cit9Cit0aGlzLm1vdXNlRG93blg9bnVsbDsKK3RoaXMubW91c2VEb3duWT1udWxsOwordGhpcy5fZHJhZ1RyaWdnZXJlZD1mYWxzZTsKK2UuZHJhZ1NvdXJjZT10aGlzLmRyYWdTb3VyY2U7CitpZigoIWUuc2hpZnRLZXkpJiYoIWUuY3RybEtleSkpeworaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCl7Cit0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJvcFN0YXJ0KCk7Cit9Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmRyYWdPYmplY3RzLGZ1bmN0aW9uKF9hOGMpewordmFyIHJldD1udWxsOworaWYoIV9hOGMpeworcmV0dXJuOworfQoraWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCl7CitlLmRyYWdPYmplY3Q9X2E4YzsKK3ZhciBjZT10aGlzLmN1cnJlbnREcm9wVGFyZ2V0LmRvbU5vZGUuY2hpbGROb2RlczsKK2lmKGNlLmxlbmd0aD4wKXsKK2UuZHJvcFRhcmdldD1jZVswXTsKK3doaWxlKGUuZHJvcFRhcmdldD09X2E4Yy5kb21Ob2RlKXsKK2UuZHJvcFRhcmdldD1lLmRyb3BUYXJnZXQubmV4dFNpYmxpbmc7Cit9Cit9ZWxzZXsKK2UuZHJvcFRhcmdldD10aGlzLmN1cnJlbnREcm9wVGFyZ2V0LmRvbU5vZGU7Cit9CitpZih0aGlzLmRyb3BBY2NlcHRhYmxlKXsKK3JldD10aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJvcChlKTsKK31lbHNlewordGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdPdXQoZSk7Cit9Cit9CitlLmRyYWdTdGF0dXM9dGhpcy5kcm9wQWNjZXB0YWJsZSYmcmV0PyJkcm9wU3VjY2VzcyI6ImRyb3BGYWlsdXJlIjsKK2Rvam8ubGFuZy5kZWxheVRoZXNlKFtmdW5jdGlvbigpewordHJ5eworX2E4Yy5kcmFnU291cmNlLm9uRHJhZ0VuZChlKTsKK30KK2NhdGNoKGVycil7Cit2YXIgX2E4Zj17fTsKK2Zvcih2YXIgaSBpbiBlKXsKK2lmKGk9PSJ0eXBlIil7CitfYThmLnR5cGU9Im1vdXNldXAiOworY29udGludWU7Cit9CitfYThmW2ldPWVbaV07Cit9CitfYThjLmRyYWdTb3VyY2Uub25EcmFnRW5kKF9hOGYpOworfQorfSxmdW5jdGlvbigpeworX2E4Yy5vbkRyYWdFbmQoZSk7Cit9XSk7Cit9LHRoaXMpOwordGhpcy5zZWxlY3RlZFNvdXJjZXM9W107Cit0aGlzLmRyYWdPYmplY3RzPVtdOwordGhpcy5kcmFnU291cmNlPW51bGw7CitpZih0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KXsKK3RoaXMuY3VycmVudERyb3BUYXJnZXQub25Ecm9wRW5kKCk7Cit9Cit9ZWxzZXsKK30KK2Rvam8uZXZlbnQuZGlzY29ubmVjdChkb2N1bWVudCwib25tb3VzZW1vdmUiLHRoaXMsIm9uTW91c2VNb3ZlIik7Cit0aGlzLmN1cnJlbnREcm9wVGFyZ2V0PW51bGw7Cit9LG9uU2Nyb2xsOmZ1bmN0aW9uKCl7Citmb3IodmFyIGk9MDtpPHRoaXMuZHJhZ09iamVjdHMubGVuZ3RoO2krKyl7CitpZih0aGlzLmRyYWdPYmplY3RzW2ldLnVwZGF0ZURyYWdPZmZzZXQpewordGhpcy5kcmFnT2JqZWN0c1tpXS51cGRhdGVEcmFnT2Zmc2V0KCk7Cit9Cit9CitpZih0aGlzLmRyYWdPYmplY3RzLmxlbmd0aCl7Cit0aGlzLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7Cit9Cit9LF9kcmFnU3RhcnREaXN0YW5jZTpmdW5jdGlvbih4LHkpeworaWYoKCF0aGlzLm1vdXNlRG93blgpfHwoIXRoaXMubW91c2VEb3duWCkpeworcmV0dXJuOworfQordmFyIGR4PU1hdGguYWJzKHgtdGhpcy5tb3VzZURvd25YKTsKK3ZhciBkeDI9ZHgqZHg7Cit2YXIgZHk9TWF0aC5hYnMoeS10aGlzLm1vdXNlRG93blkpOwordmFyIGR5Mj1keSpkeTsKK3JldHVybiBwYXJzZUludChNYXRoLnNxcnQoZHgyK2R5MiksMTApOworfSxjYWNoZVRhcmdldExvY2F0aW9uczpmdW5jdGlvbigpeworZG9qby5wcm9maWxlLnN0YXJ0KCJjYWNoZVRhcmdldExvY2F0aW9ucyIpOwordGhpcy5kcm9wVGFyZ2V0RGltZW5zaW9ucz1bXTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuZHJvcFRhcmdldHMsZnVuY3Rpb24oX2E5OCl7Cit2YXIgdG49X2E5OC5kb21Ob2RlOworaWYoIXRufHwhX2E5OC5hY2NlcHRzKFt0aGlzLmRyYWdTb3VyY2VdKSl7CityZXR1cm47Cit9Cit2YXIgYWJzPWRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRuLHRydWUpOwordmFyIGJiPWRvam8uaHRtbC5nZXRCb3JkZXJCb3godG4pOwordGhpcy5kcm9wVGFyZ2V0RGltZW5zaW9ucy5wdXNoKFtbYWJzLngsYWJzLnldLFthYnMueCtiYi53aWR0aCxhYnMueStiYi5oZWlnaHRdLF9hOThdKTsKK30sdGhpcyk7Citkb2pvLnByb2ZpbGUuZW5kKCJjYWNoZVRhcmdldExvY2F0aW9ucyIpOworfSxvbk1vdXNlTW92ZTpmdW5jdGlvbihlKXsKK2lmKChkb2pvLnJlbmRlci5odG1sLmllKSYmKGUuYnV0dG9uIT0xKSl7Cit0aGlzLmN1cnJlbnREcm9wVGFyZ2V0PW51bGw7Cit0aGlzLm9uTW91c2VVcChlLHRydWUpOworcmV0dXJuOworfQoraWYoKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aCkmJighdGhpcy5kcmFnT2JqZWN0cy5sZW5ndGgpKXsKK3ZhciBkeDsKK3ZhciBkeTsKK2lmKCF0aGlzLl9kcmFnVHJpZ2dlcmVkKXsKK3RoaXMuX2RyYWdUcmlnZ2VyZWQ9KHRoaXMuX2RyYWdTdGFydERpc3RhbmNlKGUucGFnZVgsZS5wYWdlWSk+dGhpcy50aHJlc2hvbGQpOworaWYoIXRoaXMuX2RyYWdUcmlnZ2VyZWQpeworcmV0dXJuOworfQorZHg9ZS5wYWdlWC10aGlzLm1vdXNlRG93blg7CitkeT1lLnBhZ2VZLXRoaXMubW91c2VEb3duWTsKK30KK3RoaXMuZHJhZ1NvdXJjZT10aGlzLnNlbGVjdGVkU291cmNlc1swXTsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLGZ1bmN0aW9uKF9hOWYpeworaWYoIV9hOWYpeworcmV0dXJuOworfQordmFyIHRkbz1fYTlmLm9uRHJhZ1N0YXJ0KGUpOworaWYodGRvKXsKK3Rkby5vbkRyYWdTdGFydChlKTsKK3Rkby5kcmFnT2Zmc2V0LnkrPWR5OwordGRvLmRyYWdPZmZzZXQueCs9ZHg7Cit0ZG8uZHJhZ1NvdXJjZT1fYTlmOwordGhpcy5kcmFnT2JqZWN0cy5wdXNoKHRkbyk7Cit9Cit9LHRoaXMpOwordGhpcy5wcmV2aW91c0Ryb3BUYXJnZXQ9bnVsbDsKK3RoaXMuY2FjaGVUYXJnZXRMb2NhdGlvbnMoKTsKK30KK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuZHJhZ09iamVjdHMsZnVuY3Rpb24oX2FhMSl7CitpZihfYWExKXsKK19hYTEub25EcmFnTW92ZShlKTsKK30KK30pOworaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCl7Cit2YXIgYz1kb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KHRoaXMuY3VycmVudERyb3BUYXJnZXQuZG9tTm9kZSx0cnVlKTsKK3ZhciBkdHA9W1tjLngsYy55XSxbYy54K2Mud2lkdGgsYy55K2MuaGVpZ2h0XV07Cit9CitpZigoIXRoaXMubmVzdGVkVGFyZ2V0cykmJihkdHApJiYodGhpcy5pc0luc2lkZUJveChlLGR0cCkpKXsKK2lmKHRoaXMuZHJvcEFjY2VwdGFibGUpewordGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdNb3ZlKGUsdGhpcy5kcmFnT2JqZWN0cyk7Cit9Cit9ZWxzZXsKK3ZhciBfYWE0PXRoaXMuZmluZEJlc3RUYXJnZXQoZSk7CitpZihfYWE0LnRhcmdldD09PW51bGwpeworaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCl7Cit0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ091dChlKTsKK3RoaXMucHJldmlvdXNEcm9wVGFyZ2V0PXRoaXMuY3VycmVudERyb3BUYXJnZXQ7Cit0aGlzLmN1cnJlbnREcm9wVGFyZ2V0PW51bGw7Cit9Cit0aGlzLmRyb3BBY2NlcHRhYmxlPWZhbHNlOworcmV0dXJuOworfQoraWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCE9PV9hYTQudGFyZ2V0KXsKK2lmKHRoaXMuY3VycmVudERyb3BUYXJnZXQpewordGhpcy5wcmV2aW91c0Ryb3BUYXJnZXQ9dGhpcy5jdXJyZW50RHJvcFRhcmdldDsKK3RoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnT3V0KGUpOworfQordGhpcy5jdXJyZW50RHJvcFRhcmdldD1fYWE0LnRhcmdldDsKK2UuZHJhZ09iamVjdHM9dGhpcy5kcmFnT2JqZWN0czsKK3RoaXMuZHJvcEFjY2VwdGFibGU9dGhpcy5jdXJyZW50RHJvcFRhcmdldC5vbkRyYWdPdmVyKGUpOworfWVsc2V7CitpZih0aGlzLmRyb3BBY2NlcHRhYmxlKXsKK3RoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnTW92ZShlLHRoaXMuZHJhZ09iamVjdHMpOworfQorfQorfQorfSxmaW5kQmVzdFRhcmdldDpmdW5jdGlvbihlKXsKK3ZhciBfYWE2PXRoaXM7Cit2YXIgX2FhNz1uZXcgT2JqZWN0KCk7CitfYWE3LnRhcmdldD1udWxsOworX2FhNy5wb2ludHM9bnVsbDsKK2Rvam8ubGFuZy5ldmVyeSh0aGlzLmRyb3BUYXJnZXREaW1lbnNpb25zLGZ1bmN0aW9uKF9hYTgpeworaWYoIV9hYTYuaXNJbnNpZGVCb3goZSxfYWE4KSl7CityZXR1cm4gdHJ1ZTsKK30KK19hYTcudGFyZ2V0PV9hYThbMl07CitfYWE3LnBvaW50cz1fYWE4OworcmV0dXJuIEJvb2xlYW4oX2FhNi5uZXN0ZWRUYXJnZXRzKTsKK30pOworcmV0dXJuIF9hYTc7Cit9LGlzSW5zaWRlQm94OmZ1bmN0aW9uKGUsX2FhYSl7CitpZigoZS5wYWdlWD5fYWFhWzBdWzBdKSYmKGUucGFnZVg8X2FhYVsxXVswXSkmJihlLnBhZ2VZPl9hYWFbMF1bMV0pJiYoZS5wYWdlWTxfYWFhWzFdWzFdKSl7CityZXR1cm4gdHJ1ZTsKK30KK3JldHVybiBmYWxzZTsKK30sb25Nb3VzZU92ZXI6ZnVuY3Rpb24oZSl7Cit9LG9uTW91c2VPdXQ6ZnVuY3Rpb24oZSl7Cit9fSk7Citkb2pvLmRuZC5kcmFnTWFuYWdlcj1uZXcgZG9qby5kbmQuSHRtbERyYWdNYW5hZ2VyKCk7CisoZnVuY3Rpb24oKXsKK3ZhciBkPWRvY3VtZW50OwordmFyIGRtPWRvam8uZG5kLmRyYWdNYW5hZ2VyOworZG9qby5ldmVudC5jb25uZWN0KGQsIm9ua2V5ZG93biIsZG0sIm9uS2V5RG93biIpOworZG9qby5ldmVudC5jb25uZWN0KGQsIm9ubW91c2VvdmVyIixkbSwib25Nb3VzZU92ZXIiKTsKK2Rvam8uZXZlbnQuY29ubmVjdChkLCJvbm1vdXNlb3V0IixkbSwib25Nb3VzZU91dCIpOworZG9qby5ldmVudC5jb25uZWN0KGQsIm9ubW91c2Vkb3duIixkbSwib25Nb3VzZURvd24iKTsKK2Rvam8uZXZlbnQuY29ubmVjdChkLCJvbm1vdXNldXAiLGRtLCJvbk1vdXNlVXAiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh3aW5kb3csIm9uc2Nyb2xsIixkbSwib25TY3JvbGwiKTsKK30pKCk7Citkb2pvLnByb3ZpZGUoImRvam8uZG5kLkh0bWxEcmFnQW5kRHJvcCIpOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSIsZG9qby5kbmQuRHJhZ1NvdXJjZSx7ZHJhZ0NsYXNzOiIiLG9uRHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7Cit2YXIgX2FhZj1uZXcgZG9qby5kbmQuSHRtbERyYWdPYmplY3QodGhpcy5kcmFnT2JqZWN0LHRoaXMudHlwZSk7CitpZih0aGlzLmRyYWdDbGFzcyl7CitfYWFmLmRyYWdDbGFzcz10aGlzLmRyYWdDbGFzczsKK30KK2lmKHRoaXMuY29uc3RyYWluVG9Db250YWluZXIpeworX2FhZi5jb25zdHJhaW5Ubyh0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lcnx8dGhpcy5kb21Ob2RlLnBhcmVudE5vZGUpOworfQorcmV0dXJuIF9hYWY7Cit9LHNldERyYWdIYW5kbGU6ZnVuY3Rpb24obm9kZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMpOwordGhpcy5kb21Ob2RlPW5vZGU7Citkb2pvLmRuZC5kcmFnTWFuYWdlci5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7Cit9LHNldERyYWdUYXJnZXQ6ZnVuY3Rpb24obm9kZSl7Cit0aGlzLmRyYWdPYmplY3Q9bm9kZTsKK30sY29uc3RyYWluVG86ZnVuY3Rpb24oX2FiMil7Cit0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyPXRydWU7CitpZihfYWIyKXsKK3RoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyPV9hYjI7Cit9Cit9LG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5kcmFnT2JqZWN0cy5sZW5ndGg7aSsrKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnNlbGVjdGVkU291cmNlcy5wdXNoKG5ldyBkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSh0aGlzLmRyYWdPYmplY3RzW2ldKSk7Cit9Cit9LGFkZERyYWdPYmplY3RzOmZ1bmN0aW9uKGVsKXsKK2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspewordGhpcy5kcmFnT2JqZWN0cy5wdXNoKGRvam8uYnlJZChhcmd1bWVudHNbaV0pKTsKK30KK319LGZ1bmN0aW9uKG5vZGUsdHlwZSl7Citub2RlPWRvam8uYnlJZChub2RlKTsKK3RoaXMuZHJhZ09iamVjdHM9W107Cit0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyPWZhbHNlOworaWYobm9kZSl7Cit0aGlzLmRvbU5vZGU9bm9kZTsKK3RoaXMuZHJhZ09iamVjdD1ub2RlOwordGhpcy50eXBlPSh0eXBlKXx8KHRoaXMuZG9tTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKK2Rvam8uZG5kLkRyYWdTb3VyY2UucHJvdG90eXBlLnJlcmVnaXN0ZXIuY2FsbCh0aGlzKTsKK30KK30pOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ09iamVjdCIsZG9qby5kbmQuRHJhZ09iamVjdCx7ZHJhZ0NsYXNzOiIiLG9wYWNpdHk6MC41LGNyZWF0ZUlmcmFtZTp0cnVlLGRpc2FibGVYOmZhbHNlLGRpc2FibGVZOmZhbHNlLGNyZWF0ZURyYWdOb2RlOmZ1bmN0aW9uKCl7Cit2YXIgbm9kZT10aGlzLmRvbU5vZGUuY2xvbmVOb2RlKHRydWUpOworaWYodGhpcy5kcmFnQ2xhc3MpeworZG9qby5odG1sLmFkZENsYXNzKG5vZGUsdGhpcy5kcmFnQ2xhc3MpOworfQoraWYodGhpcy5vcGFjaXR5PDEpeworZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSx0aGlzLm9wYWNpdHkpOworfQordmFyIGx0bj1ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKK3ZhciBpc1RyPShsdG49PSJ0ciIpOworaWYoKGlzVHIpfHwobHRuPT0idGJvZHkiKSl7Cit2YXIgZG9jPXRoaXMuZG9tTm9kZS5vd25lckRvY3VtZW50OwordmFyIF9hYmM9ZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CitpZihpc1RyKXsKK3ZhciBfYWJkPWRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOworX2FiYy5hcHBlbmRDaGlsZChfYWJkKTsKK19hYmQuYXBwZW5kQ2hpbGQobm9kZSk7Cit9ZWxzZXsKK19hYmMuYXBwZW5kQ2hpbGQobm9kZSk7Cit9Cit2YXIgX2FiZT0oKGlzVHIpP3RoaXMuZG9tTm9kZTp0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7Cit2YXIgX2FiZj0oKGlzVHIpP25vZGU6bm9kZS5maXJzdENoaWxkKTsKK3ZhciBfYWMwPV9hYmUuY2hpbGROb2RlczsKK3ZhciBfYWMxPV9hYmYuY2hpbGROb2RlczsKK2Zvcih2YXIgaT0wO2k8X2FjMC5sZW5ndGg7aSsrKXsKK2lmKChfYWMxW2ldKSYmKF9hYzFbaV0uc3R5bGUpKXsKK19hYzFbaV0uc3R5bGUud2lkdGg9ZG9qby5odG1sLmdldENvbnRlbnRCb3goX2FjMFtpXSkud2lkdGgrInB4IjsKK30KK30KK25vZGU9X2FiYzsKK30KK2lmKChkb2pvLnJlbmRlci5odG1sLmllNTV8fGRvam8ucmVuZGVyLmh0bWwuaWU2MCkmJnRoaXMuY3JlYXRlSWZyYW1lKXsKK3dpdGgobm9kZS5zdHlsZSl7Cit0b3A9IjBweCI7CitsZWZ0PSIwcHgiOworfQordmFyIF9hYzM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CitfYWMzLmFwcGVuZENoaWxkKG5vZGUpOwordGhpcy5iZ0lmcmFtZT1uZXcgZG9qby5odG1sLkJhY2tncm91bmRJZnJhbWUoX2FjMyk7CitfYWMzLmFwcGVuZENoaWxkKHRoaXMuYmdJZnJhbWUuaWZyYW1lKTsKK25vZGU9X2FjMzsKK30KK25vZGUuc3R5bGUuekluZGV4PTk5OTsKK3JldHVybiBub2RlOworfSxvbkRyYWdTdGFydDpmdW5jdGlvbihlKXsKK2Rvam8uaHRtbC5jbGVhclNlbGVjdGlvbigpOwordGhpcy5zY3JvbGxPZmZzZXQ9ZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKK3RoaXMuZHJhZ1N0YXJ0UG9zaXRpb249ZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLHRydWUpOwordGhpcy5kcmFnT2Zmc2V0PXt5OnRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueS1lLnBhZ2VZLHg6dGhpcy5kcmFnU3RhcnRQb3NpdGlvbi54LWUucGFnZVh9OwordGhpcy5kcmFnQ2xvbmU9dGhpcy5jcmVhdGVEcmFnTm9kZSgpOwordGhpcy5jb250YWluaW5nQmxvY2tQb3NpdGlvbj10aGlzLmRvbU5vZGUub2Zmc2V0UGFyZW50P2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZS5vZmZzZXRQYXJlbnQsdHJ1ZSk6e3g6MCx5OjB9OworaWYodGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcil7Cit0aGlzLmNvbnN0cmFpbnRzPXRoaXMuZ2V0Q29uc3RyYWludHMoKTsKK30KK3dpdGgodGhpcy5kcmFnQ2xvbmUuc3R5bGUpeworcG9zaXRpb249ImFic29sdXRlIjsKK3RvcD10aGlzLmRyYWdPZmZzZXQueStlLnBhZ2VZKyJweCI7CitsZWZ0PXRoaXMuZHJhZ09mZnNldC54K2UucGFnZVgrInB4IjsKK30KK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCgiZHJhZ1N0YXJ0Iix7c291cmNlOnRoaXN9KTsKK30sZ2V0Q29uc3RyYWludHM6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PSJib2R5Iil7Cit2YXIgX2FjNT1kb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKK3ZhciBfYWM2PV9hYzUud2lkdGg7Cit2YXIgX2FjNz1fYWM1LmhlaWdodDsKK3ZhciBfYWM4PWRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7Cit2YXIgeD1fYWM4Lng7Cit2YXIgeT1fYWM4Lnk7Cit9ZWxzZXsKK3ZhciBfYWNiPWRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyKTsKK19hYzY9X2FjYi53aWR0aDsKK19hYzc9X2FjYi5oZWlnaHQ7Cit4PXRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24ueCtkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciwicGFkZGluZy1sZWZ0Iix0cnVlKStkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLCJsZWZ0Iik7Cit5PXRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24ueStkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciwicGFkZGluZy10b3AiLHRydWUpK2Rvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIsInRvcCIpOworfQordmFyIG1iPWRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKK3JldHVybiB7bWluWDp4LG1pblk6eSxtYXhYOngrX2FjNi1tYi53aWR0aCxtYXhZOnkrX2FjNy1tYi5oZWlnaHR9OworfSx1cGRhdGVEcmFnT2Zmc2V0OmZ1bmN0aW9uKCl7Cit2YXIgX2FjZD1kb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OworaWYoX2FjZC55IT10aGlzLnNjcm9sbE9mZnNldC55KXsKK3ZhciBkaWZmPV9hY2QueS10aGlzLnNjcm9sbE9mZnNldC55OwordGhpcy5kcmFnT2Zmc2V0LnkrPWRpZmY7Cit0aGlzLnNjcm9sbE9mZnNldC55PV9hY2QueTsKK30KK2lmKF9hY2QueCE9dGhpcy5zY3JvbGxPZmZzZXQueCl7Cit2YXIgZGlmZj1fYWNkLngtdGhpcy5zY3JvbGxPZmZzZXQueDsKK3RoaXMuZHJhZ09mZnNldC54Kz1kaWZmOwordGhpcy5zY3JvbGxPZmZzZXQueD1fYWNkLng7Cit9Cit9LG9uRHJhZ01vdmU6ZnVuY3Rpb24oZSl7Cit0aGlzLnVwZGF0ZURyYWdPZmZzZXQoKTsKK3ZhciB4PXRoaXMuZHJhZ09mZnNldC54K2UucGFnZVg7Cit2YXIgeT10aGlzLmRyYWdPZmZzZXQueStlLnBhZ2VZOworaWYodGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcil7CitpZih4PHRoaXMuY29uc3RyYWludHMubWluWCl7Cit4PXRoaXMuY29uc3RyYWludHMubWluWDsKK30KK2lmKHk8dGhpcy5jb25zdHJhaW50cy5taW5ZKXsKK3k9dGhpcy5jb25zdHJhaW50cy5taW5ZOworfQoraWYoeD50aGlzLmNvbnN0cmFpbnRzLm1heFgpeworeD10aGlzLmNvbnN0cmFpbnRzLm1heFg7Cit9CitpZih5PnRoaXMuY29uc3RyYWludHMubWF4WSl7Cit5PXRoaXMuY29uc3RyYWludHMubWF4WTsKK30KK30KK3RoaXMuc2V0QWJzb2x1dGVQb3NpdGlvbih4LHkpOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkcmFnTW92ZSIse3NvdXJjZTp0aGlzfSk7Cit9LHNldEFic29sdXRlUG9zaXRpb246ZnVuY3Rpb24oeCx5KXsKK2lmKCF0aGlzLmRpc2FibGVZKXsKK3RoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcD15KyJweCI7Cit9CitpZighdGhpcy5kaXNhYmxlWCl7Cit0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0PXgrInB4IjsKK30KK30sb25EcmFnRW5kOmZ1bmN0aW9uKGUpeworc3dpdGNoKGUuZHJhZ1N0YXR1cyl7CitjYXNlICJkcm9wU3VjY2VzcyI6Citkb2pvLmh0bWwucmVtb3ZlTm9kZSh0aGlzLmRyYWdDbG9uZSk7Cit0aGlzLmRyYWdDbG9uZT1udWxsOworYnJlYWs7CitjYXNlICJkcm9wRmFpbHVyZSI6Cit2YXIgX2FkNT1kb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRyYWdDbG9uZSx0cnVlKTsKK3ZhciBfYWQ2PXtsZWZ0OnRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueCsxLHRvcDp0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnkrMX07Cit2YXIgYW5pbT1kb2pvLmxmeC5zbGlkZVRvKHRoaXMuZHJhZ0Nsb25lLF9hZDYsMzAwKTsKK3ZhciBfYWQ4PXRoaXM7Citkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwib25FbmQiLGZ1bmN0aW9uKGUpeworZG9qby5odG1sLnJlbW92ZU5vZGUoX2FkOC5kcmFnQ2xvbmUpOworX2FkOC5kcmFnQ2xvbmU9bnVsbDsKK30pOworYW5pbS5wbGF5KCk7CiticmVhazsKK30KK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCgiZHJhZ0VuZCIse3NvdXJjZTp0aGlzfSk7Cit9LGNvbnN0cmFpblRvOmZ1bmN0aW9uKF9hZGEpewordGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcj10cnVlOworaWYoX2FkYSl7Cit0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lcj1fYWRhOworfWVsc2V7Cit0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lcj10aGlzLmRvbU5vZGUucGFyZW50Tm9kZTsKK30KK319LGZ1bmN0aW9uKG5vZGUsdHlwZSl7Cit0aGlzLmRvbU5vZGU9ZG9qby5ieUlkKG5vZGUpOwordGhpcy50eXBlPXR5cGU7Cit0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyPWZhbHNlOwordGhpcy5kcmFnU291cmNlPW51bGw7Citkb2pvLmRuZC5EcmFnT2JqZWN0LnByb3RvdHlwZS5yZWdpc3Rlci5jYWxsKHRoaXMpOworfSk7Citkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0Iixkb2pvLmRuZC5Ecm9wVGFyZ2V0LHt2ZXJ0aWNhbDpmYWxzZSxvbkRyYWdPdmVyOmZ1bmN0aW9uKGUpeworaWYoIXRoaXMuYWNjZXB0cyhlLmRyYWdPYmplY3RzKSl7CityZXR1cm4gZmFsc2U7Cit9Cit0aGlzLmNoaWxkQm94ZXM9W107Citmb3IodmFyIGk9MCxfYWRmO2k8dGhpcy5kb21Ob2RlLmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7CitfYWRmPXRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzW2ldOworaWYoX2FkZi5ub2RlVHlwZSE9ZG9qby5odG1sLkVMRU1FTlRfTk9ERSl7Citjb250aW51ZTsKK30KK3ZhciBwb3M9ZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24oX2FkZix0cnVlKTsKK3ZhciBfYWUxPWRvam8uaHRtbC5nZXRCb3JkZXJCb3goX2FkZik7Cit0aGlzLmNoaWxkQm94ZXMucHVzaCh7dG9wOnBvcy55LGJvdHRvbTpwb3MueStfYWUxLmhlaWdodCxsZWZ0OnBvcy54LHJpZ2h0OnBvcy54K19hZTEud2lkdGgsaGVpZ2h0Ol9hZTEuaGVpZ2h0LHdpZHRoOl9hZTEud2lkdGgsbm9kZTpfYWRmfSk7Cit9CityZXR1cm4gdHJ1ZTsKK30sX2dldE5vZGVVbmRlck1vdXNlOmZ1bmN0aW9uKGUpeworZm9yKHZhciBpPTAsX2FlNDtpPHRoaXMuY2hpbGRCb3hlcy5sZW5ndGg7aSsrKXsKK3dpdGgodGhpcy5jaGlsZEJveGVzW2ldKXsKK2lmKGUucGFnZVg+PWxlZnQmJmUucGFnZVg8PXJpZ2h0JiZlLnBhZ2VZPj10b3AmJmUucGFnZVk8PWJvdHRvbSl7CityZXR1cm4gaTsKK30KK30KK30KK3JldHVybiAtMTsKK30sY3JlYXRlRHJvcEluZGljYXRvcjpmdW5jdGlvbigpewordGhpcy5kcm9wSW5kaWNhdG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOword2l0aCh0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUpeworcG9zaXRpb249ImFic29sdXRlIjsKK3pJbmRleD05OTk7CitpZih0aGlzLnZlcnRpY2FsKXsKK2JvcmRlckxlZnRXaWR0aD0iMXB4IjsKK2JvcmRlckxlZnRDb2xvcj0iYmxhY2siOworYm9yZGVyTGVmdFN0eWxlPSJzb2xpZCI7CitoZWlnaHQ9ZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmRvbU5vZGUpLmhlaWdodCsicHgiOwordG9wPWRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSx0cnVlKS55KyJweCI7Cit9ZWxzZXsKK2JvcmRlclRvcFdpZHRoPSIxcHgiOworYm9yZGVyVG9wQ29sb3I9ImJsYWNrIjsKK2JvcmRlclRvcFN0eWxlPSJzb2xpZCI7Cit3aWR0aD1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KHRoaXMuZG9tTm9kZSkud2lkdGgrInB4IjsKK2xlZnQ9ZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLHRydWUpLngrInB4IjsKK30KK30KK30sb25EcmFnTW92ZTpmdW5jdGlvbihlLF9hZTYpewordmFyIGk9dGhpcy5fZ2V0Tm9kZVVuZGVyTW91c2UoZSk7CitpZighdGhpcy5kcm9wSW5kaWNhdG9yKXsKK3RoaXMuY3JlYXRlRHJvcEluZGljYXRvcigpOworfQordmFyIF9hZTg9dGhpcy52ZXJ0aWNhbD9kb2pvLmh0bWwuZ3Jhdml0eS5XRVNUOmRvam8uaHRtbC5ncmF2aXR5Lk5PUlRIOwordmFyIGhpZGU9ZmFsc2U7CitpZihpPDApeworaWYodGhpcy5jaGlsZEJveGVzLmxlbmd0aCl7Cit2YXIgX2FlYT0oZG9qby5odG1sLmdyYXZpdHkodGhpcy5jaGlsZEJveGVzWzBdLm5vZGUsZSkmX2FlOCk7CitpZihfYWVhKXsKK2hpZGU9dHJ1ZTsKK30KK31lbHNlewordmFyIF9hZWE9dHJ1ZTsKK30KK31lbHNlewordmFyIF9hZWI9dGhpcy5jaGlsZEJveGVzW2ldOwordmFyIF9hZWE9KGRvam8uaHRtbC5ncmF2aXR5KF9hZWIubm9kZSxlKSZfYWU4KTsKK2lmKF9hZWIubm9kZT09PV9hZTZbMF0uZHJhZ1NvdXJjZS5kb21Ob2RlKXsKK2hpZGU9dHJ1ZTsKK31lbHNlewordmFyIF9hZWM9X2FlYT8oaT4wP3RoaXMuY2hpbGRCb3hlc1tpLTFdOl9hZWIpOihpPHRoaXMuY2hpbGRCb3hlcy5sZW5ndGgtMT90aGlzLmNoaWxkQm94ZXNbaSsxXTpfYWViKTsKK2lmKF9hZWMubm9kZT09PV9hZTZbMF0uZHJhZ1NvdXJjZS5kb21Ob2RlKXsKK2hpZGU9dHJ1ZTsKK30KK30KK30KK2lmKGhpZGUpewordGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworcmV0dXJuOworfWVsc2V7Cit0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheT0iIjsKK30KK3RoaXMucGxhY2VJbmRpY2F0b3IoZSxfYWU2LGksX2FlYSk7CitpZighZG9qby5odG1sLmhhc1BhcmVudCh0aGlzLmRyb3BJbmRpY2F0b3IpKXsKK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuZHJvcEluZGljYXRvcik7Cit9Cit9LHBsYWNlSW5kaWNhdG9yOmZ1bmN0aW9uKGUsX2FlZSxfYWVmLF9hZjApewordmFyIF9hZjE9dGhpcy52ZXJ0aWNhbD8ibGVmdCI6InRvcCI7Cit2YXIgX2FmMjsKK2lmKF9hZWY8MCl7CitpZih0aGlzLmNoaWxkQm94ZXMubGVuZ3RoKXsKK19hZjI9X2FmMD90aGlzLmNoaWxkQm94ZXNbMF06dGhpcy5jaGlsZEJveGVzW3RoaXMuY2hpbGRCb3hlcy5sZW5ndGgtMV07Cit9ZWxzZXsKK3RoaXMuZHJvcEluZGljYXRvci5zdHlsZVtfYWYxXT1kb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRvbU5vZGUsdHJ1ZSlbdGhpcy52ZXJ0aWNhbD8ieCI6InkiXSsicHgiOworfQorfWVsc2V7CitfYWYyPXRoaXMuY2hpbGRCb3hlc1tfYWVmXTsKK30KK2lmKF9hZjIpewordGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlW19hZjFdPShfYWYwP19hZjJbX2FmMV06X2FmMlt0aGlzLnZlcnRpY2FsPyJyaWdodCI6ImJvdHRvbSJdKSsicHgiOworaWYodGhpcy52ZXJ0aWNhbCl7Cit0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUuaGVpZ2h0PV9hZjIuaGVpZ2h0KyJweCI7Cit0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUudG9wPV9hZjIudG9wKyJweCI7Cit9ZWxzZXsKK3RoaXMuZHJvcEluZGljYXRvci5zdHlsZS53aWR0aD1fYWYyLndpZHRoKyJweCI7Cit0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUubGVmdD1fYWYyLmxlZnQrInB4IjsKK30KK30KK30sb25EcmFnT3V0OmZ1bmN0aW9uKGUpeworaWYodGhpcy5kcm9wSW5kaWNhdG9yKXsKK2Rvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZHJvcEluZGljYXRvcik7CitkZWxldGUgdGhpcy5kcm9wSW5kaWNhdG9yOworfQorfSxvbkRyb3A6ZnVuY3Rpb24oZSl7Cit0aGlzLm9uRHJhZ091dChlKTsKK3ZhciBpPXRoaXMuX2dldE5vZGVVbmRlck1vdXNlKGUpOwordmFyIF9hZjY9dGhpcy52ZXJ0aWNhbD9kb2pvLmh0bWwuZ3Jhdml0eS5XRVNUOmRvam8uaHRtbC5ncmF2aXR5Lk5PUlRIOworaWYoaTwwKXsKK2lmKHRoaXMuY2hpbGRCb3hlcy5sZW5ndGgpeworaWYoZG9qby5odG1sLmdyYXZpdHkodGhpcy5jaGlsZEJveGVzWzBdLm5vZGUsZSkmX2FmNil7CityZXR1cm4gdGhpcy5pbnNlcnQoZSx0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwiYmVmb3JlIik7Cit9ZWxzZXsKK3JldHVybiB0aGlzLmluc2VydChlLHRoaXMuY2hpbGRCb3hlc1t0aGlzLmNoaWxkQm94ZXMubGVuZ3RoLTFdLm5vZGUsImFmdGVyIik7Cit9Cit9CityZXR1cm4gdGhpcy5pbnNlcnQoZSx0aGlzLmRvbU5vZGUsImFwcGVuZCIpOworfQordmFyIF9hZjc9dGhpcy5jaGlsZEJveGVzW2ldOworaWYoZG9qby5odG1sLmdyYXZpdHkoX2FmNy5ub2RlLGUpJl9hZjYpeworcmV0dXJuIHRoaXMuaW5zZXJ0KGUsX2FmNy5ub2RlLCJiZWZvcmUiKTsKK31lbHNleworcmV0dXJuIHRoaXMuaW5zZXJ0KGUsX2FmNy5ub2RlLCJhZnRlciIpOworfQorfSxpbnNlcnQ6ZnVuY3Rpb24oZSxfYWY5LF9hZmEpewordmFyIG5vZGU9ZS5kcmFnT2JqZWN0LmRvbU5vZGU7CitpZihfYWZhPT0iYmVmb3JlIil7CityZXR1cm4gZG9qby5odG1sLmluc2VydEJlZm9yZShub2RlLF9hZjkpOworfWVsc2V7CitpZihfYWZhPT0iYWZ0ZXIiKXsKK3JldHVybiBkb2pvLmh0bWwuaW5zZXJ0QWZ0ZXIobm9kZSxfYWY5KTsKK31lbHNleworaWYoX2FmYT09ImFwcGVuZCIpeworX2FmOS5hcHBlbmRDaGlsZChub2RlKTsKK3JldHVybiB0cnVlOworfQorfQorfQorcmV0dXJuIGZhbHNlOworfX0sZnVuY3Rpb24obm9kZSxfYWZkKXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTApeworcmV0dXJuOworfQordGhpcy5kb21Ob2RlPWRvam8uYnlJZChub2RlKTsKK2Rvam8uZG5kLkRyb3BUYXJnZXQuY2FsbCh0aGlzKTsKK2lmKF9hZmQmJmRvam8ubGFuZy5pc1N0cmluZyhfYWZkKSl7CitfYWZkPVtfYWZkXTsKK30KK3RoaXMuYWNjZXB0ZWRUeXBlcz1fYWZkfHxbXTsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnJlZ2lzdGVyRHJvcFRhcmdldCh0aGlzKTsKK30pOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsiZG9qby5kbmQuRHJhZ0FuZERyb3AiXSxicm93c2VyOlsiZG9qby5kbmQuSHRtbERyYWdBbmREcm9wIl0sZGFzaGJvYXJkOlsiZG9qby5kbmQuSHRtbERyYWdBbmREcm9wIl19KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuKiIpOworZG9qby5wcm92aWRlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmUiKTsKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuSHRtbERyYWdNb3ZlU291cmNlIixkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSx7b25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXsKK3ZhciBfYWZlPW5ldyBkb2pvLmRuZC5IdG1sRHJhZ01vdmVPYmplY3QodGhpcy5kcmFnT2JqZWN0LHRoaXMudHlwZSk7CitpZih0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKXsKK19hZmUuY29uc3RyYWluVG8odGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIpOworfQorcmV0dXJuIF9hZmU7Cit9LG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy5kcmFnT2JqZWN0cy5sZW5ndGg7aSsrKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnNlbGVjdGVkU291cmNlcy5wdXNoKG5ldyBkb2pvLmRuZC5IdG1sRHJhZ01vdmVTb3VyY2UodGhpcy5kcmFnT2JqZWN0c1tpXSkpOworfQorfX0pOworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmVPYmplY3QiLGRvam8uZG5kLkh0bWxEcmFnT2JqZWN0LHtvbkRyYWdTdGFydDpmdW5jdGlvbihlKXsKK2Rvam8uaHRtbC5jbGVhclNlbGVjdGlvbigpOwordGhpcy5kcmFnQ2xvbmU9dGhpcy5kb21Ob2RlOworaWYoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCJwb3NpdGlvbiIpIT0iYWJzb2x1dGUiKXsKK3RoaXMuZG9tTm9kZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiOworfQordmFyIGxlZnQ9cGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCJsZWZ0IikpOwordmFyIHRvcD1wYXJzZUludChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbU5vZGUsInRvcCIpKTsKK3RoaXMuZHJhZ1N0YXJ0UG9zaXRpb249e3g6aXNOYU4obGVmdCk/MDpsZWZ0LHk6aXNOYU4odG9wKT8wOnRvcH07Cit0aGlzLnNjcm9sbE9mZnNldD1kb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OwordGhpcy5kcmFnT2Zmc2V0PXt5OnRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueS1lLnBhZ2VZLHg6dGhpcy5kcmFnU3RhcnRQb3NpdGlvbi54LWUucGFnZVh9OwordGhpcy5jb250YWluaW5nQmxvY2tQb3NpdGlvbj17eDowLHk6MH07CitpZih0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKXsKK3RoaXMuY29uc3RyYWludHM9dGhpcy5nZXRDb25zdHJhaW50cygpOworfQorZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZG9tTm9kZSwib25jbGljayIsdGhpcywiX3NxdWVsY2hPbkNsaWNrIik7Cit9LG9uRHJhZ0VuZDpmdW5jdGlvbihlKXsKK30sc2V0QWJzb2x1dGVQb3NpdGlvbjpmdW5jdGlvbih4LHkpeworaWYoIXRoaXMuZGlzYWJsZVkpewordGhpcy5kb21Ob2RlLnN0eWxlLnRvcD15KyJweCI7Cit9CitpZighdGhpcy5kaXNhYmxlWCl7Cit0aGlzLmRvbU5vZGUuc3R5bGUubGVmdD14KyJweCI7Cit9Cit9LF9zcXVlbGNoT25DbGljazpmdW5jdGlvbihlKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7Citkb2pvLmV2ZW50LmRpc2Nvbm5lY3QodGhpcy5kb21Ob2RlLCJvbmNsaWNrIix0aGlzLCJfc3F1ZWxjaE9uQ2xpY2siKTsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRGlhbG9nIik7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZSIsbnVsbCx7aXNDb250YWluZXI6dHJ1ZSxmb2N1c0VsZW1lbnQ6IiIsYmdDb2xvcjoiYmxhY2siLGJnT3BhY2l0eTowLjQsZm9sbG93U2Nyb2xsOnRydWUsY2xvc2VPbkJhY2tncm91bmRDbGljazpmYWxzZSx0cmFwVGFiczpmdW5jdGlvbihlKXsKK2lmKGUudGFyZ2V0PT10aGlzLnRhYlN0YXJ0T3V0ZXIpeworaWYodGhpcy5fZnJvbVRyYXApewordGhpcy50YWJTdGFydC5mb2N1cygpOwordGhpcy5fZnJvbVRyYXA9ZmFsc2U7Cit9ZWxzZXsKK3RoaXMuX2Zyb21UcmFwPXRydWU7Cit0aGlzLnRhYkVuZC5mb2N1cygpOworfQorfWVsc2V7CitpZihlLnRhcmdldD09dGhpcy50YWJTdGFydCl7CitpZih0aGlzLl9mcm9tVHJhcCl7Cit0aGlzLl9mcm9tVHJhcD1mYWxzZTsKK31lbHNlewordGhpcy5fZnJvbVRyYXA9dHJ1ZTsKK3RoaXMudGFiRW5kLmZvY3VzKCk7Cit9Cit9ZWxzZXsKK2lmKGUudGFyZ2V0PT10aGlzLnRhYkVuZE91dGVyKXsKK2lmKHRoaXMuX2Zyb21UcmFwKXsKK3RoaXMudGFiRW5kLmZvY3VzKCk7Cit0aGlzLl9mcm9tVHJhcD1mYWxzZTsKK31lbHNlewordGhpcy5fZnJvbVRyYXA9dHJ1ZTsKK3RoaXMudGFiU3RhcnQuZm9jdXMoKTsKK30KK31lbHNleworaWYoZS50YXJnZXQ9PXRoaXMudGFiRW5kKXsKK2lmKHRoaXMuX2Zyb21UcmFwKXsKK3RoaXMuX2Zyb21UcmFwPWZhbHNlOworfWVsc2V7Cit0aGlzLl9mcm9tVHJhcD10cnVlOwordGhpcy50YWJTdGFydC5mb2N1cygpOworfQorfQorfQorfQorfQorfSxjbGVhclRyYXA6ZnVuY3Rpb24oZSl7Cit2YXIgX2IwOT10aGlzOworc2V0VGltZW91dChmdW5jdGlvbigpeworX2IwOS5fZnJvbVRyYXA9ZmFsc2U7Cit9LDEwMCk7Cit9LHBvc3RDcmVhdGU6ZnVuY3Rpb24oKXsKK3dpdGgodGhpcy5kb21Ob2RlLnN0eWxlKXsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7Cit6SW5kZXg9OTk5OworZGlzcGxheT0ibm9uZSI7CitvdmVyZmxvdz0idmlzaWJsZSI7Cit9Cit2YXIgYj1kb2pvLmJvZHkoKTsKK2IuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKK3RoaXMuYmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cit0aGlzLmJnLmNsYXNzTmFtZT0iZGlhbG9nVW5kZXJsYXkiOword2l0aCh0aGlzLmJnLnN0eWxlKXsKK3Bvc2l0aW9uPSJhYnNvbHV0ZSI7CitsZWZ0PXRvcD0iMHB4IjsKK3pJbmRleD05OTg7CitkaXNwbGF5PSJub25lIjsKK30KK2IuYXBwZW5kQ2hpbGQodGhpcy5iZyk7Cit0aGlzLnNldEJhY2tncm91bmRDb2xvcih0aGlzLmJnQ29sb3IpOwordGhpcy5iZ0lmcmFtZT1uZXcgZG9qby5odG1sLkJhY2tncm91bmRJZnJhbWUoKTsKK2lmKHRoaXMuYmdJZnJhbWUuaWZyYW1lKXsKK3dpdGgodGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUpeworcG9zaXRpb249ImFic29sdXRlIjsKK2xlZnQ9dG9wPSIwcHgiOworekluZGV4PTkwOworZGlzcGxheT0ibm9uZSI7Cit9Cit9CitpZih0aGlzLmNsb3NlT25CYWNrZ3JvdW5kQ2xpY2speworZG9qby5ldmVudC5rd0Nvbm5lY3Qoe3NyY09iajp0aGlzLmJnLHNyY0Z1bmM6Im9uY2xpY2siLGFkdmljZU9iajp0aGlzLGFkdmljZUZ1bmM6Im9uQmFja2dyb3VuZENsaWNrIixvbmNlOnRydWV9KTsKK30KK30sdW5pbml0aWFsaXplOmZ1bmN0aW9uKCl7Cit0aGlzLmJnSWZyYW1lLnJlbW92ZSgpOworZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5iZyx0cnVlKTsKK30sc2V0QmFja2dyb3VuZENvbG9yOmZ1bmN0aW9uKF9iMGIpeworaWYoYXJndW1lbnRzLmxlbmd0aD49Myl7CitfYjBiPW5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7Cit9ZWxzZXsKK19iMGI9bmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKF9iMGIpOworfQordGhpcy5iZy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9X2IwYi50b1N0cmluZygpOworcmV0dXJuIHRoaXMuYmdDb2xvcj1fYjBiOworfSxzZXRCYWNrZ3JvdW5kT3BhY2l0eTpmdW5jdGlvbihvcCl7CitpZihhcmd1bWVudHMubGVuZ3RoPT0wKXsKK29wPXRoaXMuYmdPcGFjaXR5OworfQorZG9qby5odG1sLnNldE9wYWNpdHkodGhpcy5iZyxvcCk7Cit0cnl7Cit0aGlzLmJnT3BhY2l0eT1kb2pvLmh0bWwuZ2V0T3BhY2l0eSh0aGlzLmJnKTsKK30KK2NhdGNoKGUpewordGhpcy5iZ09wYWNpdHk9b3A7Cit9CityZXR1cm4gdGhpcy5iZ09wYWNpdHk7Cit9LF9zaXplQmFja2dyb3VuZDpmdW5jdGlvbigpeworaWYodGhpcy5iZ09wYWNpdHk+MCl7Cit2YXIgX2IwZD1kb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKK3ZhciBoPV9iMGQuaGVpZ2h0OwordmFyIHc9X2IwZC53aWR0aDsKK3dpdGgodGhpcy5iZy5zdHlsZSl7Cit3aWR0aD13KyJweCI7CitoZWlnaHQ9aCsicHgiOworfQordmFyIF9iMTA9ZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKK3RoaXMuYmcuc3R5bGUudG9wPV9iMTAueSsicHgiOwordGhpcy5iZy5zdHlsZS5sZWZ0PV9iMTAueCsicHgiOwordmFyIF9iMGQ9ZG9qby5odG1sLmdldFZpZXdwb3J0KCk7CitpZihfYjBkLndpZHRoIT13KXsKK3RoaXMuYmcuc3R5bGUud2lkdGg9X2IwZC53aWR0aCsicHgiOworfQoraWYoX2IwZC5oZWlnaHQhPWgpewordGhpcy5iZy5zdHlsZS5oZWlnaHQ9X2IwZC5oZWlnaHQrInB4IjsKK30KK30KK3RoaXMuYmdJZnJhbWUuc2l6ZSh0aGlzLmJnKTsKK30sX3Nob3dCYWNrZ3JvdW5kOmZ1bmN0aW9uKCl7CitpZih0aGlzLmJnT3BhY2l0eT4wKXsKK3RoaXMuYmcuc3R5bGUuZGlzcGxheT0iYmxvY2siOworfQoraWYodGhpcy5iZ0lmcmFtZS5pZnJhbWUpewordGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUuZGlzcGxheT0iYmxvY2siOworfQorfSxwbGFjZU1vZGFsRGlhbG9nOmZ1bmN0aW9uKCl7Cit2YXIgX2IxMT1kb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OwordmFyIF9iMTI9ZG9qby5odG1sLmdldFZpZXdwb3J0KCk7Cit2YXIgbWI7CitpZih0aGlzLmlzU2hvd2luZygpKXsKK21iPWRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKK31lbHNleworZG9qby5odG1sLnNldFZpc2liaWxpdHkodGhpcy5kb21Ob2RlLGZhbHNlKTsKK2Rvam8uaHRtbC5zaG93KHRoaXMuZG9tTm9kZSk7CittYj1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7Citkb2pvLmh0bWwuaGlkZSh0aGlzLmRvbU5vZGUpOworZG9qby5odG1sLnNldFZpc2liaWxpdHkodGhpcy5kb21Ob2RlLHRydWUpOworfQordmFyIHg9X2IxMS54KyhfYjEyLndpZHRoLW1iLndpZHRoKS8yOwordmFyIHk9X2IxMS55KyhfYjEyLmhlaWdodC1tYi5oZWlnaHQpLzI7Cit3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7CitsZWZ0PXgrInB4IjsKK3RvcD15KyJweCI7Cit9Cit9LF9vbktleTpmdW5jdGlvbihldnQpeworaWYoZXZ0LmtleSl7Cit2YXIgbm9kZT1ldnQudGFyZ2V0Oword2hpbGUobm9kZSE9bnVsbCl7CitpZihub2RlPT10aGlzLmRvbU5vZGUpeworcmV0dXJuOworfQorbm9kZT1ub2RlLnBhcmVudE5vZGU7Cit9CitpZihldnQua2V5IT1ldnQuS0VZX1RBQil7Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Cit9ZWxzZXsKK2lmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhKXsKK3RyeXsKK3RoaXMudGFiU3RhcnQuZm9jdXMoKTsKK30KK2NhdGNoKGUpeworfQorfQorfQorfQorfSxzaG93TW9kYWxEaWFsb2c6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuZm9sbG93U2Nyb2xsJiYhdGhpcy5fc2Nyb2xsQ29ubmVjdGVkKXsKK3RoaXMuX3Njcm9sbENvbm5lY3RlZD10cnVlOworZG9qby5ldmVudC5jb25uZWN0KHdpbmRvdywib25zY3JvbGwiLHRoaXMsIl9vblNjcm9sbCIpOworfQorZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwib25rZXkiLHRoaXMsIl9vbktleSIpOwordGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7Cit0aGlzLnNldEJhY2tncm91bmRPcGFjaXR5KCk7Cit0aGlzLl9zaXplQmFja2dyb3VuZCgpOwordGhpcy5fc2hvd0JhY2tncm91bmQoKTsKK3RoaXMuX2Zyb21UcmFwPXRydWU7CitzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKCl7Cit0cnl7Cit0aGlzLnRhYlN0YXJ0LmZvY3VzKCk7Cit9CitjYXRjaChlKXsKK30KK30pLDUwKTsKK30saGlkZU1vZGFsRGlhbG9nOmZ1bmN0aW9uKCl7CitpZih0aGlzLmZvY3VzRWxlbWVudCl7Citkb2pvLmJ5SWQodGhpcy5mb2N1c0VsZW1lbnQpLmZvY3VzKCk7Citkb2pvLmJ5SWQodGhpcy5mb2N1c0VsZW1lbnQpLmJsdXIoKTsKK30KK3RoaXMuYmcuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit0aGlzLmJnLnN0eWxlLndpZHRoPXRoaXMuYmcuc3R5bGUuaGVpZ2h0PSIxcHgiOworaWYodGhpcy5iZ0lmcmFtZS5pZnJhbWUpewordGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9Citkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJvbmtleSIsdGhpcywiX29uS2V5Iik7CitpZih0aGlzLl9zY3JvbGxDb25uZWN0ZWQpewordGhpcy5fc2Nyb2xsQ29ubmVjdGVkPWZhbHNlOworZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbmRvdywib25zY3JvbGwiLHRoaXMsIl9vblNjcm9sbCIpOworfQorfSxfb25TY3JvbGw6ZnVuY3Rpb24oKXsKK3ZhciBfYjE4PWRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7Cit0aGlzLmJnLnN0eWxlLnRvcD1fYjE4LnkrInB4IjsKK3RoaXMuYmcuc3R5bGUubGVmdD1fYjE4LngrInB4IjsKK3RoaXMucGxhY2VNb2RhbERpYWxvZygpOworfSxjaGVja1NpemU6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuaXNTaG93aW5nKCkpewordGhpcy5fc2l6ZUJhY2tncm91bmQoKTsKK3RoaXMucGxhY2VNb2RhbERpYWxvZygpOwordGhpcy5vblJlc2l6ZWQoKTsKK30KK30sb25CYWNrZ3JvdW5kQ2xpY2s6ZnVuY3Rpb24oKXsKK2lmKHRoaXMubGlmZXRpbWUtdGhpcy50aW1lUmVtYWluaW5nPj10aGlzLmJsb2NrRHVyYXRpb24peworcmV0dXJuOworfQordGhpcy5oaWRlKCk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkRpYWxvZyIsW2Rvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLGRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZV0se3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGlkPVwiJHt0aGlzLndpZGdldElkfVwiIGNsYXNzPVwiZG9qb0RpYWxvZ1wiIGRvam9hdHRhY2hwb2ludD1cIndyYXBwZXJcIj5cclxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJTdGFydE91dGVyXCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIlx0dGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYlN0YXJ0XCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcblx0PGRpdiBkb2pvYXR0YWNocG9pbnQ9XCJjb250YWluZXJOb2RlXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDI7XCI+PC9kaXY+XHJcblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiRW5kXCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiRW5kT3V0ZXJcIiBkb2pvb25mb2N1cz1cInRyYXBUYWJzXCIgZG9qb29uYmx1cj1cImNsZWFyVHJhcFwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cclxuPC9kaXY+XHJcbiIsYmxvY2tEdXJhdGlvbjowLGxpZmV0aW1lOjAsY2xvc2VOb2RlOiIiLHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOworaWYodGhpcy5jbG9zZU5vZGUpewordGhpcy5zZXRDbG9zZUNvbnRyb2wodGhpcy5jbG9zZU5vZGUpOworfQorfSxwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2Rvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LHNob3c6ZnVuY3Rpb24oKXsKK2lmKHRoaXMubGlmZXRpbWUpewordGhpcy50aW1lUmVtYWluaW5nPXRoaXMubGlmZXRpbWU7CitpZih0aGlzLnRpbWVyTm9kZSl7Cit0aGlzLnRpbWVyTm9kZS5pbm5lckhUTUw9TWF0aC5jZWlsKHRoaXMudGltZVJlbWFpbmluZy8xMDAwKTsKK30KK2lmKHRoaXMuYmxvY2tEdXJhdGlvbiYmdGhpcy5jbG9zZU5vZGUpeworaWYodGhpcy5saWZldGltZT50aGlzLmJsb2NrRHVyYXRpb24pewordGhpcy5jbG9zZU5vZGUuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjsKK31lbHNlewordGhpcy5jbG9zZU5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9Cit9CitpZih0aGlzLnRpbWVyKXsKK2NsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7Cit9Cit0aGlzLnRpbWVyPXNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCJfb25UaWNrIiksMTAwKTsKK30KK3RoaXMuc2hvd01vZGFsRGlhbG9nKCk7Citkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5zaG93LmNhbGwodGhpcyk7Cit9LG9uTG9hZDpmdW5jdGlvbigpewordGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7Citkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5vbkxvYWQuY2FsbCh0aGlzKTsKK30sZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24oKXsKK30saGlkZTpmdW5jdGlvbigpewordGhpcy5oaWRlTW9kYWxEaWFsb2coKTsKK2Rvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLmhpZGUuY2FsbCh0aGlzKTsKK2lmKHRoaXMudGltZXIpeworY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKK30KK30sc2V0VGltZXJOb2RlOmZ1bmN0aW9uKG5vZGUpewordGhpcy50aW1lck5vZGU9bm9kZTsKK30sc2V0Q2xvc2VDb250cm9sOmZ1bmN0aW9uKG5vZGUpewordGhpcy5jbG9zZU5vZGU9ZG9qby5ieUlkKG5vZGUpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuY2xvc2VOb2RlLCJvbmNsaWNrIix0aGlzLCJoaWRlIik7Cit9LHNldFNob3dDb250cm9sOmZ1bmN0aW9uKG5vZGUpeworbm9kZT1kb2pvLmJ5SWQobm9kZSk7Citkb2pvLmV2ZW50LmNvbm5lY3Qobm9kZSwib25jbGljayIsdGhpcywic2hvdyIpOworfSxfb25UaWNrOmZ1bmN0aW9uKCl7CitpZih0aGlzLnRpbWVyKXsKK3RoaXMudGltZVJlbWFpbmluZy09MTAwOworaWYodGhpcy5saWZldGltZS10aGlzLnRpbWVSZW1haW5pbmc+PXRoaXMuYmxvY2tEdXJhdGlvbil7CitpZih0aGlzLmNsb3NlTm9kZSl7Cit0aGlzLmNsb3NlTm9kZS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjsKK30KK30KK2lmKCF0aGlzLnRpbWVSZW1haW5pbmcpeworY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKK3RoaXMuaGlkZSgpOworfWVsc2V7CitpZih0aGlzLnRpbWVyTm9kZSl7Cit0aGlzLnRpbWVyTm9kZS5pbm5lckhUTUw9TWF0aC5jZWlsKHRoaXMudGltZVJlbWFpbmluZy8xMDAwKTsKK30KK30KK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuUmVzaXplSGFuZGxlIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlJlc2l6ZUhhbmRsZSIsZG9qby53aWRnZXQuSHRtbFdpZGdldCx7dGFyZ2V0RWxtSWQ6IiIsdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvSHRtbFJlc2l6ZUhhbmRsZSB7XHJcblx0ZmxvYXQ6IHJpZ2h0O1xyXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRyaWdodDogMnB4O1xyXG5cdGJvdHRvbTogMnB4O1xyXG5cdHdpZHRoOiAxM3B4O1xyXG5cdGhlaWdodDogMTNweDtcclxuXHR6LWluZGV4OiAyMDtcclxuXHRjdXJzb3I6IG53LXJlc2l6ZTtcclxuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZ3JhYkNvcm5lci5naWYpO1xyXG5cdGxpbmUtaGVpZ2h0OiAwcHg7XHJcbn1cclxuIix0ZW1wbGF0ZUNzc1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9SZXNpemVIYW5kbGUuY3NzIiksdGVtcGxhdGVTdHJpbmc6IjxkaXYgY2xhc3M9XCJkb2pvSHRtbFJlc2l6ZUhhbmRsZVwiPjxkaXY+PC9kaXY+PC9kaXY+Iixwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5kb21Ob2RlLCJvbm1vdXNlZG93biIsdGhpcywiX2JlZ2luU2l6aW5nIik7Cit9LF9iZWdpblNpemluZzpmdW5jdGlvbihlKXsKK2lmKHRoaXMuX2lzU2l6aW5nKXsKK3JldHVybiBmYWxzZTsKK30KK3RoaXMudGFyZ2V0V2lkZ2V0PWRvam8ud2lkZ2V0LmJ5SWQodGhpcy50YXJnZXRFbG1JZCk7Cit0aGlzLnRhcmdldERvbU5vZGU9dGhpcy50YXJnZXRXaWRnZXQ/dGhpcy50YXJnZXRXaWRnZXQuZG9tTm9kZTpkb2pvLmJ5SWQodGhpcy50YXJnZXRFbG1JZCk7CitpZighdGhpcy50YXJnZXREb21Ob2RlKXsKK3JldHVybjsKK30KK3RoaXMuX2lzU2l6aW5nPXRydWU7Cit0aGlzLnN0YXJ0UG9pbnQ9eyJ4IjplLmNsaWVudFgsInkiOmUuY2xpZW50WX07Cit2YXIgbWI9ZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLnRhcmdldERvbU5vZGUpOwordGhpcy5zdGFydFNpemU9eyJ3IjptYi53aWR0aCwiaCI6bWIuaGVpZ2h0fTsKK2Rvam8uZXZlbnQua3dDb25uZWN0KHtzcmNPYmo6ZG9qby5ib2R5KCksc3JjRnVuYzoib25tb3VzZW1vdmUiLHRhcmdldE9iajp0aGlzLHRhcmdldEZ1bmM6Il9jaGFuZ2VTaXppbmciLHJhdGU6MjV9KTsKK2Rvam8uZXZlbnQuY29ubmVjdChkb2pvLmJvZHkoKSwib25tb3VzZXVwIix0aGlzLCJfZW5kU2l6aW5nIik7CitlLnByZXZlbnREZWZhdWx0KCk7Cit9LF9jaGFuZ2VTaXppbmc6ZnVuY3Rpb24oZSl7Cit0cnl7CitpZighZS5jbGllbnRYfHwhZS5jbGllbnRZKXsKK3JldHVybjsKK30KK30KK2NhdGNoKGUpeworcmV0dXJuOworfQordmFyIGR4PXRoaXMuc3RhcnRQb2ludC54LWUuY2xpZW50WDsKK3ZhciBkeT10aGlzLnN0YXJ0UG9pbnQueS1lLmNsaWVudFk7Cit2YXIgbmV3Vz10aGlzLnN0YXJ0U2l6ZS53LWR4OwordmFyIG5ld0g9dGhpcy5zdGFydFNpemUuaC1keTsKK2lmKHRoaXMubWluU2l6ZSl7Cit2YXIgbWI9ZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLnRhcmdldERvbU5vZGUpOworaWYobmV3Vzx0aGlzLm1pblNpemUudyl7CituZXdXPW1iLndpZHRoOworfQoraWYobmV3SDx0aGlzLm1pblNpemUuaCl7CituZXdIPW1iLmhlaWdodDsKK30KK30KK2lmKHRoaXMudGFyZ2V0V2lkZ2V0KXsKK3RoaXMudGFyZ2V0V2lkZ2V0LnJlc2l6ZVRvKG5ld1csbmV3SCk7Cit9ZWxzZXsKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3godGhpcy50YXJnZXREb21Ob2RlLHt3aWR0aDpuZXdXLGhlaWdodDpuZXdIfSk7Cit9CitlLnByZXZlbnREZWZhdWx0KCk7Cit9LF9lbmRTaXppbmc6ZnVuY3Rpb24oZSl7Citkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9qby5ib2R5KCksIm9ubW91c2Vtb3ZlIix0aGlzLCJfY2hhbmdlU2l6aW5nIik7Citkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9qby5ib2R5KCksIm9ubW91c2V1cCIsdGhpcywiX2VuZFNpemluZyIpOwordGhpcy5faXNTaXppbmc9ZmFsc2U7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZSIpOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlIixudWxsLHt0aXRsZToiIixpY29uU3JjOiIiLGhhc1NoYWRvdzpmYWxzZSxjb25zdHJhaW5Ub0NvbnRhaW5lcjpmYWxzZSx0YXNrQmFySWQ6IiIscmVzaXphYmxlOnRydWUsdGl0bGVCYXJEaXNwbGF5OnRydWUsd2luZG93U3RhdGU6Im5vcm1hbCIsZGlzcGxheUNsb3NlQWN0aW9uOmZhbHNlLGRpc3BsYXlNaW5pbWl6ZUFjdGlvbjpmYWxzZSxkaXNwbGF5TWF4aW1pemVBY3Rpb246ZmFsc2UsX21heF90YXNrQmFyQ29ubmVjdEF0dGVtcHRzOjUsX3Rhc2tCYXJDb25uZWN0QXR0ZW1wdHM6MCx0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbk1vdXNlRG93blwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVwiPlxyXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwidGl0bGVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhclwiICBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG5cdCAgXHQ8aW1nIGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFySWNvblwiICBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb25cIj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY2xvc2VBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOmNsb3NlV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVDbG9zZUljb25cIj48L2Rpdj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwicmVzdG9yZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6cmVzdG9yZVdpbmRvd1wiXHJcbiAgIFx0ICBcdFx0Y2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lUmVzdG9yZUljb25cIj48L2Rpdj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwibWF4aW1pemVBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOm1heGltaXplV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVNYXhpbWl6ZUljb25cIj48L2Rpdj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwibWluaW1pemVBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOm1pbmltaXplV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVNaW5pbWl6ZUljb25cIj48L2Rpdj5cclxuXHQgIFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJ0aXRsZUJhclRleHRcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZVRleHRcIj4ke3RoaXMudGl0bGV9PC9kaXY+XHJcblx0PC9kaXY+XHJcblxyXG5cdDxkaXYgaWQ9XCIke3RoaXMud2lkZ2V0SWR9X2NvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVDbGllbnRcIj48L2Rpdj5cclxuXHJcblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXNpemVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuIix0ZW1wbGF0ZUNzc1N0cmluZzoiXHJcbi8qKioqKioqKioqIE91dGVyIFdpbmRvdyAqKioqKioqKioqKioqKiovXHJcblxyXG4uZG9qb0Zsb2F0aW5nUGFuZSB7XHJcblx0LyogZXNzZW50aWFsIGNzcyAqL1xyXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRvdmVyZmxvdzogdmlzaWJsZTtcdFx0Lyogc28gZHJvcCBzaGFkb3cgaXMgZGlzcGxheWVkICovXHJcblx0ei1pbmRleDogMTA7XHJcblxyXG5cdC8qIHN0eWxpbmcgY3NzICovXHJcblx0Ym9yZGVyOiAxcHggc29saWQ7XHJcblx0Ym9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcclxufVxyXG5cclxuXHJcbi8qKioqKioqKioqIFRpdGxlIEJhciAqKioqKioqKioqKioqKioqL1xyXG5cclxuLmRvam9GbG9hdGluZ1BhbmVUaXRsZUJhciB7XHJcblx0dmVydGljYWwtYWxpZ246IHRvcDtcclxuXHRtYXJnaW46IDJweCAycHggMnB4IDJweDtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjNzU5NmM2O1xyXG5cdGN1cnNvcjogZGVmYXVsdDtcclxuXHRvdmVyZmxvdzogaGlkZGVuO1xyXG5cdGJvcmRlci1jb2xvcjogVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdyBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0O1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbn1cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lVGl0bGVUZXh0IHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHRwYWRkaW5nOiAycHggNHB4IDJweCAycHg7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuXHRjb2xvcjogQ2FwdGlvblRleHQ7XHJcblx0Zm9udDogc21hbGwtY2FwdGlvbjtcclxufVxyXG5cclxuLmRvam9UaXRsZUJhckljb24ge1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cdGhlaWdodDogMjJweDtcclxuXHR3aWR0aDogMjJweDtcclxuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG5cdG1hcmdpbi1yaWdodDogNXB4O1xyXG5cdG1hcmdpbi1sZWZ0OiA1cHg7XHJcbn1cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lQWN0aW9uc3tcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cG9zaXRpb246IGFic29sdXRlO1xyXG5cdHJpZ2h0OiAycHg7XHJcblx0dG9wOiAycHg7XHJcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxufVxyXG5cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lQWN0aW9uSXRlbSB7XHJcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRtYXJnaW4tcmlnaHQ6IDFweDtcclxuXHRoZWlnaHQ6IDIycHg7XHJcblx0d2lkdGg6IDIycHg7XHJcbn1cclxuXHJcblxyXG4uZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFySWNvbiB7XHJcblx0LyogZXNzZW50aWFsIGNzcyAqL1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cclxuXHQvKiBzdHlsaW5nIGNzcyAqL1xyXG5cdG1hcmdpbi1sZWZ0OiAycHg7XHJcblx0bWFyZ2luLXJpZ2h0OiA0cHg7XHJcblx0aGVpZ2h0OiAyMnB4O1xyXG59XHJcblxyXG4vKiBtaW5pbWl6ZS9tYXhpbWl6ZSBpY29ucyBhcmUgc3BlY2lmaWVkIGJ5IENTUyBvbmx5ICovXHJcbi5kb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uLFxyXG4uZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvbixcclxuLmRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbixcclxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0aGVpZ2h0OiAyMnB4O1xyXG5cdHdpZHRoOiAyMnB4O1xyXG5cdGZsb2F0OiByaWdodDtcclxufVxyXG4uZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvbiB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mbG9hdGluZ1BhbmVNaW5pbWl6ZS5naWYpO1xyXG59XHJcbi5kb2pvRmxvYXRpbmdQYW5lTWF4aW1pemVJY29uIHtcclxuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZU1heGltaXplLmdpZik7XHJcbn1cclxuLmRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbiB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mbG9hdGluZ1BhbmVSZXN0b3JlLmdpZik7XHJcbn1cclxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZmxvYXRpbmdQYW5lQ2xvc2UuZ2lmKTtcclxufVxyXG5cclxuLyogYmFyIGF0IGJvdHRvbSBvZiB3aW5kb3cgdGhhdCBob2xkcyByZXNpemUgaGFuZGxlICovXHJcbi5kb2pvRmxvYXRpbmdQYW5lUmVzaXplYmFyIHtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRoZWlnaHQ6IDEzcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcclxufVxyXG5cclxuLyoqKioqKioqKioqKiogQ2xpZW50IEFyZWEgKioqKioqKioqKioqKioqL1xyXG5cclxuLmRvam9GbG9hdGluZ1BhbmVDbGllbnQge1xyXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRib3JkZXI6IDFweCBzb2xpZDtcclxuXHRib3JkZXItY29sb3I6IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQgVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdztcclxuXHRtYXJnaW46IDJweDtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlO1xyXG5cdHBhZGRpbmc6IDhweDtcclxuXHRmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBHYXJhbW9uZCwgc2Fucy1zZXJpZjtcclxuXHRmb250LXNpemU6IDEycHg7XHJcblx0b3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbiIsdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvRmxvYXRpbmdQYW5lLmNzcyIpLGZpbGxJbkZsb2F0aW5nUGFuZVRlbXBsYXRlOmZ1bmN0aW9uKGFyZ3MsZnJhZyl7Cit2YXIgX2IyNz10aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsX2IyNyk7Citkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmRvbU5vZGUpOworaWYoIXRoaXMuaXNTaG93aW5nKCkpewordGhpcy53aW5kb3dTdGF0ZT0ibWluaW1pemVkIjsKK30KK2lmKHRoaXMuaWNvblNyYz09IiIpeworZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy50aXRsZUJhckljb24pOworfWVsc2V7Cit0aGlzLnRpdGxlQmFySWNvbi5zcmM9dGhpcy5pY29uU3JjLnRvU3RyaW5nKCk7Cit9CitpZih0aGlzLnRpdGxlQmFyRGlzcGxheSl7Cit0aGlzLnRpdGxlQmFyLnN0eWxlLmRpc3BsYXk9IiI7Citkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnRpdGxlQmFyKTsKK3RoaXMudGl0bGVCYXJJY29uLnN0eWxlLmRpc3BsYXk9KHRoaXMuaWNvblNyYz09IiI/Im5vbmUiOiIiKTsKK3RoaXMubWluaW1pemVBY3Rpb24uc3R5bGUuZGlzcGxheT0odGhpcy5kaXNwbGF5TWluaW1pemVBY3Rpb24/IiI6Im5vbmUiKTsKK3RoaXMubWF4aW1pemVBY3Rpb24uc3R5bGUuZGlzcGxheT0odGhpcy5kaXNwbGF5TWF4aW1pemVBY3Rpb24mJnRoaXMud2luZG93U3RhdGUhPSJtYXhpbWl6ZWQiPyIiOiJub25lIik7Cit0aGlzLnJlc3RvcmVBY3Rpb24uc3R5bGUuZGlzcGxheT0odGhpcy5kaXNwbGF5TWF4aW1pemVBY3Rpb24mJnRoaXMud2luZG93U3RhdGU9PSJtYXhpbWl6ZWQiPyIiOiJub25lIik7Cit0aGlzLmNsb3NlQWN0aW9uLnN0eWxlLmRpc3BsYXk9KHRoaXMuZGlzcGxheUNsb3NlQWN0aW9uPyIiOiJub25lIik7Cit0aGlzLmRyYWc9bmV3IGRvam8uZG5kLkh0bWxEcmFnTW92ZVNvdXJjZSh0aGlzLmRvbU5vZGUpOworaWYodGhpcy5jb25zdHJhaW5Ub0NvbnRhaW5lcil7Cit0aGlzLmRyYWcuY29uc3RyYWluVG8oKTsKK30KK3RoaXMuZHJhZy5zZXREcmFnSGFuZGxlKHRoaXMudGl0bGVCYXIpOwordmFyIHNlbGY9dGhpczsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJkcmFnTW92ZSIsZnVuY3Rpb24oaW5mbyl7CitpZihpbmZvLnNvdXJjZS5kb21Ob2RlPT1zZWxmLmRvbU5vZGUpeworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJmbG9hdGluZ1BhbmVNb3ZlIix7c291cmNlOnNlbGZ9KTsKK30KK30pOworfQoraWYodGhpcy5yZXNpemFibGUpewordGhpcy5yZXNpemVCYXIuc3R5bGUuZGlzcGxheT0iIjsKK3RoaXMucmVzaXplSGFuZGxlPWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiUmVzaXplSGFuZGxlIix7dGFyZ2V0RWxtSWQ6dGhpcy53aWRnZXRJZCxpZDp0aGlzLndpZGdldElkKyJfcmVzaXplIn0pOwordGhpcy5yZXNpemVCYXIuYXBwZW5kQ2hpbGQodGhpcy5yZXNpemVIYW5kbGUuZG9tTm9kZSk7Cit9CitpZih0aGlzLmhhc1NoYWRvdyl7Cit0aGlzLnNoYWRvdz1uZXcgZG9qby5sZnguc2hhZG93KHRoaXMuZG9tTm9kZSk7Cit9Cit0aGlzLmJnSWZyYW1lPW5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSh0aGlzLmRvbU5vZGUpOworaWYodGhpcy50YXNrQmFySWQpewordGhpcy5fdGFza0JhclNldHVwKCk7Cit9Citkb2pvLmJvZHkoKS5yZW1vdmVDaGlsZCh0aGlzLmRvbU5vZGUpOworfSxwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7CitpZihkb2pvLmhvc3RlbnYucG9zdF9sb2FkXyl7Cit0aGlzLl9zZXRJbml0aWFsV2luZG93U3RhdGUoKTsKK31lbHNleworZG9qby5hZGRPbkxvYWQodGhpcywiX3NldEluaXRpYWxXaW5kb3dTdGF0ZSIpOworfQorfSxtYXhpbWl6ZVdpbmRvdzpmdW5jdGlvbihldnQpewordmFyIG1iPWRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKK3RoaXMucHJldmlvdXM9e3dpZHRoOm1iLndpZHRofHx0aGlzLndpZHRoLGhlaWdodDptYi5oZWlnaHR8fHRoaXMuaGVpZ2h0LGxlZnQ6dGhpcy5kb21Ob2RlLnN0eWxlLmxlZnQsdG9wOnRoaXMuZG9tTm9kZS5zdHlsZS50b3AsYm90dG9tOnRoaXMuZG9tTm9kZS5zdHlsZS5ib3R0b20scmlnaHQ6dGhpcy5kb21Ob2RlLnN0eWxlLnJpZ2h0fTsKK2lmKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93LnRvTG93ZXJDYXNlKCkhPSJoaWRkZW4iKXsKK3RoaXMucGFyZW50UHJldmlvdXM9e292ZXJmbG93OnRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93fTsKK2Rvam8uZGVidWcodGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3cpOwordGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7Cit9Cit0aGlzLmRvbU5vZGUuc3R5bGUubGVmdD1kb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSwicGFkZGluZy1sZWZ0Iix0cnVlKSsicHgiOwordGhpcy5kb21Ob2RlLnN0eWxlLnRvcD1kb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSwicGFkZGluZy10b3AiLHRydWUpKyJweCI7CitpZigodGhpcy5kb21Ob2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ImJvZHkiKSl7Cit2YXIgX2IyYz1kb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKK3ZhciBfYjJkPWRvam8uaHRtbC5nZXRQYWRkaW5nKGRvam8uYm9keSgpKTsKK3RoaXMucmVzaXplVG8oX2IyYy53aWR0aC1fYjJkLndpZHRoLF9iMmMuaGVpZ2h0LV9iMmQuaGVpZ2h0KTsKK31lbHNlewordmFyIF9iMmU9ZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5kb21Ob2RlLnBhcmVudE5vZGUpOwordGhpcy5yZXNpemVUbyhfYjJlLndpZHRoLF9iMmUuaGVpZ2h0KTsKK30KK3RoaXMubWF4aW1pemVBY3Rpb24uc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit0aGlzLnJlc3RvcmVBY3Rpb24uc3R5bGUuZGlzcGxheT0iIjsKK2lmKHRoaXMucmVzaXplSGFuZGxlKXsKK3RoaXMucmVzaXplSGFuZGxlLmRvbU5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9Cit0aGlzLmRyYWcuc2V0RHJhZ0hhbmRsZShudWxsKTsKK3RoaXMud2luZG93U3RhdGU9Im1heGltaXplZCI7Cit9LG1pbmltaXplV2luZG93OmZ1bmN0aW9uKGV2dCl7Cit0aGlzLmhpZGUoKTsKK2Zvcih2YXIgYXR0ciBpbiB0aGlzLnBhcmVudFByZXZpb3VzKXsKK3RoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlW2F0dHJdPXRoaXMucGFyZW50UHJldmlvdXNbYXR0cl07Cit9Cit0aGlzLmxhc3RXaW5kb3dTdGF0ZT10aGlzLndpbmRvd1N0YXRlOwordGhpcy53aW5kb3dTdGF0ZT0ibWluaW1pemVkIjsKK30scmVzdG9yZVdpbmRvdzpmdW5jdGlvbihldnQpeworaWYodGhpcy53aW5kb3dTdGF0ZT09Im1pbmltaXplZCIpewordGhpcy5zaG93KCk7CitpZih0aGlzLmxhc3RXaW5kb3dTdGF0ZT09Im1heGltaXplZCIpewordGhpcy5kb21Ob2RlLnBhcmVudE5vZGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7Cit0aGlzLndpbmRvd1N0YXRlPSJtYXhpbWl6ZWQiOworfWVsc2V7Cit0aGlzLndpbmRvd1N0YXRlPSJub3JtYWwiOworfQorfWVsc2V7CitpZih0aGlzLndpbmRvd1N0YXRlPT0ibWF4aW1pemVkIil7Citmb3IodmFyIGF0dHIgaW4gdGhpcy5wcmV2aW91cyl7Cit0aGlzLmRvbU5vZGUuc3R5bGVbYXR0cl09dGhpcy5wcmV2aW91c1thdHRyXTsKK30KK2Zvcih2YXIgYXR0ciBpbiB0aGlzLnBhcmVudFByZXZpb3VzKXsKK3RoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlW2F0dHJdPXRoaXMucGFyZW50UHJldmlvdXNbYXR0cl07Cit9Cit0aGlzLnJlc2l6ZVRvKHRoaXMucHJldmlvdXMud2lkdGgsdGhpcy5wcmV2aW91cy5oZWlnaHQpOwordGhpcy5wcmV2aW91cz1udWxsOwordGhpcy5wYXJlbnRQcmV2aW91cz1udWxsOwordGhpcy5yZXN0b3JlQWN0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwordGhpcy5tYXhpbWl6ZUFjdGlvbi5zdHlsZS5kaXNwbGF5PXRoaXMuZGlzcGxheU1heGltaXplQWN0aW9uPyIiOiJub25lIjsKK2lmKHRoaXMucmVzaXplSGFuZGxlKXsKK3RoaXMucmVzaXplSGFuZGxlLmRvbU5vZGUuc3R5bGUuZGlzcGxheT0iIjsKK30KK3RoaXMuZHJhZy5zZXREcmFnSGFuZGxlKHRoaXMudGl0bGVCYXIpOwordGhpcy53aW5kb3dTdGF0ZT0ibm9ybWFsIjsKK31lbHNleworfQorfQorfSx0b2dnbGVEaXNwbGF5OmZ1bmN0aW9uKCl7CitpZih0aGlzLndpbmRvd1N0YXRlPT0ibWluaW1pemVkIil7Cit0aGlzLnJlc3RvcmVXaW5kb3coKTsKK31lbHNlewordGhpcy5taW5pbWl6ZVdpbmRvdygpOworfQorfSxjbG9zZVdpbmRvdzpmdW5jdGlvbihldnQpeworZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kb21Ob2RlKTsKK3RoaXMuZGVzdHJveSgpOworfSxvbk1vdXNlRG93bjpmdW5jdGlvbihldnQpewordGhpcy5icmluZ1RvVG9wKCk7Cit9LGJyaW5nVG9Ub3A6ZnVuY3Rpb24oKXsKK3ZhciBfYjM1PWRvam8ud2lkZ2V0Lm1hbmFnZXIuZ2V0V2lkZ2V0c0J5VHlwZSh0aGlzLndpZGdldFR5cGUpOwordmFyIF9iMzY9W107Citmb3IodmFyIHg9MDt4PF9iMzUubGVuZ3RoO3grKyl7CitpZih0aGlzLndpZGdldElkIT1fYjM1W3hdLndpZGdldElkKXsKK19iMzYucHVzaChfYjM1W3hdKTsKK30KK30KK19iMzYuc29ydChmdW5jdGlvbihhLGIpeworcmV0dXJuIGEuZG9tTm9kZS5zdHlsZS56SW5kZXgtYi5kb21Ob2RlLnN0eWxlLnpJbmRleDsKK30pOworX2IzNi5wdXNoKHRoaXMpOwordmFyIF9iM2E9MTAwOworZm9yKHg9MDt4PF9iMzYubGVuZ3RoO3grKyl7CitfYjM2W3hdLmRvbU5vZGUuc3R5bGUuekluZGV4PV9iM2EreCoyOworfQorfSxfc2V0SW5pdGlhbFdpbmRvd1N0YXRlOmZ1bmN0aW9uKCl7CitpZih0aGlzLmlzU2hvd2luZygpKXsKK3RoaXMud2lkdGg9LTE7Cit2YXIgbWI9ZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOwordGhpcy5yZXNpemVUbyhtYi53aWR0aCxtYi5oZWlnaHQpOworfQoraWYodGhpcy53aW5kb3dTdGF0ZT09Im1heGltaXplZCIpewordGhpcy5tYXhpbWl6ZVdpbmRvdygpOwordGhpcy5zaG93KCk7CityZXR1cm47Cit9CitpZih0aGlzLndpbmRvd1N0YXRlPT0ibm9ybWFsIil7Cit0aGlzLnNob3coKTsKK3JldHVybjsKK30KK2lmKHRoaXMud2luZG93U3RhdGU9PSJtaW5pbWl6ZWQiKXsKK3RoaXMuaGlkZSgpOworcmV0dXJuOworfQordGhpcy53aW5kb3dTdGF0ZT0ibWluaW1pemVkIjsKK30sX3Rhc2tCYXJTZXR1cDpmdW5jdGlvbigpewordmFyIF9iM2M9ZG9qby53aWRnZXQuZ2V0V2lkZ2V0QnlJZCh0aGlzLnRhc2tCYXJJZCk7CitpZighX2IzYyl7CitpZih0aGlzLl90YXNrQmFyQ29ubmVjdEF0dGVtcHRzPHRoaXMuX21heF90YXNrQmFyQ29ubmVjdEF0dGVtcHRzKXsKK2Rvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsdGhpcy5fdGFza0JhclNldHVwLDUwKTsKK3RoaXMuX3Rhc2tCYXJDb25uZWN0QXR0ZW1wdHMrKzsKK31lbHNleworZG9qby5kZWJ1ZygiVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHRhc2tCYXIiKTsKK30KK3JldHVybjsKK30KK19iM2MuYWRkQ2hpbGQodGhpcyk7Cit9LHNob3dGbG9hdGluZ1BhbmU6ZnVuY3Rpb24oKXsKK3RoaXMuYnJpbmdUb1RvcCgpOworfSxvbkZsb2F0aW5nUGFuZVNob3c6ZnVuY3Rpb24oKXsKK3ZhciBtYj1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7Cit0aGlzLnJlc2l6ZVRvKG1iLndpZHRoLG1iLmhlaWdodCk7Cit9LHJlc2l6ZVRvOmZ1bmN0aW9uKF9iM2UsX2IzZil7Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSx7d2lkdGg6X2IzZSxoZWlnaHQ6X2IzZn0pOworZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5kb21Ob2RlLFt7ZG9tTm9kZTp0aGlzLnRpdGxlQmFyLGxheW91dEFsaWduOiJ0b3AifSx7ZG9tTm9kZTp0aGlzLnJlc2l6ZUJhcixsYXlvdXRBbGlnbjoiYm90dG9tIn0se2RvbU5vZGU6dGhpcy5jb250YWluZXJOb2RlLGxheW91dEFsaWduOiJjbGllbnQifV0pOworZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5jb250YWluZXJOb2RlLHRoaXMuY2hpbGRyZW4sInRvcC1ib3R0b20iKTsKK3RoaXMuYmdJZnJhbWUub25SZXNpemVkKCk7CitpZih0aGlzLnNoYWRvdyl7Cit0aGlzLnNoYWRvdy5zaXplKF9iM2UsX2IzZik7Cit9Cit0aGlzLm9uUmVzaXplZCgpOworfSxjaGVja1NpemU6ZnVuY3Rpb24oKXsKK30sZGVzdHJveUZsb2F0aW5nUGFuZTpmdW5jdGlvbigpeworaWYodGhpcy5yZXNpemVIYW5kbGUpewordGhpcy5yZXNpemVIYW5kbGUuZGVzdHJveSgpOwordGhpcy5yZXNpemVIYW5kbGU9bnVsbDsKK30KK319KTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lIixbZG9qby53aWRnZXQuQ29udGVudFBhbmUsZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lQmFzZV0se2ZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKGFyZ3MsZnJhZyl7Cit0aGlzLmZpbGxJbkZsb2F0aW5nUGFuZVRlbXBsYXRlKGFyZ3MsZnJhZyk7Citkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsYXJncyxmcmFnKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Citkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sc2hvdzpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3Muc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit0aGlzLnNob3dGbG9hdGluZ1BhbmUoKTsKK30sb25TaG93OmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5vblNob3cuY2FsbCh0aGlzKTsKK3RoaXMub25GbG9hdGluZ1BhbmVTaG93KCk7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK3RoaXMuZGVzdHJveUZsb2F0aW5nUGFuZSgpOworZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0Lk1vZGFsRmxvYXRpbmdQYW5lIixbZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLGRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZV0se3dpbmRvd1N0YXRlOiJtaW5pbWl6ZWQiLGRpc3BsYXlDbG9zZUFjdGlvbjp0cnVlLHBvc3RDcmVhdGU6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5jYWxsKHRoaXMpOworZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmNhbGwodGhpcyk7Cit9LHNob3c6ZnVuY3Rpb24oKXsKK3RoaXMuc2hvd01vZGFsRGlhbG9nKCk7Citkb2pvLndpZGdldC5Nb2RhbEZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnNob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordGhpcy5iZy5zdHlsZS56SW5kZXg9dGhpcy5kb21Ob2RlLnN0eWxlLnpJbmRleC0xOworfSxoaWRlOmZ1bmN0aW9uKCl7Cit0aGlzLmhpZGVNb2RhbERpYWxvZygpOworZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5oaWRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sY2xvc2VXaW5kb3c6ZnVuY3Rpb24oKXsKK3RoaXMuaGlkZSgpOworZG9qby53aWRnZXQuTW9kYWxGbG9hdGluZ1BhbmUuc3VwZXJjbGFzcy5jbG9zZVdpbmRvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uQWx3YXlzU2hvd1Rvb2xiYXIiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJkb2pvLndpZGdldC5FZGl0b3IyOjpvbkxvYWQiLGZ1bmN0aW9uKF9iNDIpeworaWYoX2I0Mi50b29sYmFyQWx3YXlzVmlzaWJsZSl7Cit2YXIgcD1uZXcgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5BbHdheXNTaG93VG9vbGJhcihfYjQyKTsKK30KK30pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkFsd2F5c1Nob3dUb29sYmFyIixudWxsLGZ1bmN0aW9uKF9iNDQpewordGhpcy5lZGl0b3I9X2I0NDsKK3RoaXMuZWRpdG9yLnJlZ2lzdGVyTG9hZGVkUGx1Z2luKHRoaXMpOwordGhpcy5zZXR1cCgpOworfSx7X3Njcm9sbFNldFVwOmZhbHNlLF9maXhFbmFibGVkOmZhbHNlLF9zY3JvbGxUaHJlc2hvbGQ6ZmFsc2UsX2hhbmRsZVNjcm9sbDp0cnVlLHNldHVwOmZ1bmN0aW9uKCl7Cit2YXIgdGRuPXRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQ7CitpZighdGRuLnRiQmdJZnJhbWUpewordGRuLnRiQmdJZnJhbWU9bmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKHRkbi5kb21Ob2RlKTsKK3Rkbi50YkJnSWZyYW1lLm9uUmVzaXplZCgpOworfQordGhpcy5zY3JvbGxJbnRlcnZhbD1zZXRJbnRlcnZhbChkb2pvLmxhbmcuaGl0Y2godGhpcywiZ2xvYmFsT25TY3JvbGxIYW5kbGVyIiksMTAwKTsKK2Rvam8uZXZlbnQuY29ubmVjdCgiYmVmb3JlIix0aGlzLmVkaXRvci50b29sYmFyV2lkZ2V0LCJkZXN0cm95Iix0aGlzLCJkZXN0cm95Iik7Cit9LGdsb2JhbE9uU2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpewordmFyIGlzSUU9ZG9qby5yZW5kZXIuaHRtbC5pZTsKK2lmKCF0aGlzLl9oYW5kbGVTY3JvbGwpeworcmV0dXJuOworfQordmFyIGRoPWRvam8uaHRtbDsKK3ZhciB0ZG49dGhpcy5lZGl0b3IudG9vbGJhcldpZGdldC5kb21Ob2RlOwordmFyIGRiPWRvam8uYm9keSgpOworaWYoIXRoaXMuX3Njcm9sbFNldFVwKXsKK3RoaXMuX3Njcm9sbFNldFVwPXRydWU7Cit2YXIgX2I0YT1kaC5nZXRNYXJnaW5Cb3godGhpcy5lZGl0b3IuZG9tTm9kZSkud2lkdGg7Cit0aGlzLl9zY3JvbGxUaHJlc2hvbGQ9ZGguYWJzKHRkbix0cnVlKS55OworaWYoKGlzSUUpJiYoZGIpJiYoZGguZ2V0U3R5bGUoZGIsImJhY2tncm91bmQtaW1hZ2UiKT09Im5vbmUiKSl7Cit3aXRoKGRiLnN0eWxlKXsKK2JhY2tncm91bmRJbWFnZT0idXJsKCIrZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvYmxhbmsuZ2lmIikrIikiOworYmFja2dyb3VuZEF0dGFjaG1lbnQ9ImZpeGVkIjsKK30KK30KK30KK3ZhciBfYjRiPSh3aW5kb3dbInBhZ2VZT2Zmc2V0Il0pP3dpbmRvd1sicGFnZVlPZmZzZXQiXTooZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdfHxkb2N1bWVudFsiYm9keSJdKS5zY3JvbGxUb3A7CitpZihfYjRiPnRoaXMuX3Njcm9sbFRocmVzaG9sZCl7CitpZighdGhpcy5fZml4RW5hYmxlZCl7Cit2YXIgX2I0Yz1kb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRkbik7Cit0aGlzLmVkaXRvci5lZGl0b3JPYmplY3Quc3R5bGUubWFyZ2luVG9wPV9iNGMuaGVpZ2h0KyJweCI7CitpZihpc0lFKXsKK3Rkbi5zdHlsZS5sZWZ0PWRvam8uaHRtbC5hYnModGRuLGRvam8uaHRtbC5ib3hTaXppbmcuTUFSR0lOX0JPWCkueDsKK2lmKHRkbi5wcmV2aW91c1NpYmxpbmcpewordGhpcy5fSUVPcmlnaW5hbFBvcz1bImFmdGVyIix0ZG4ucHJldmlvdXNTaWJsaW5nXTsKK31lbHNleworaWYodGRuLm5leHRTaWJsaW5nKXsKK3RoaXMuX0lFT3JpZ2luYWxQb3M9WyJiZWZvcmUiLHRkbi5uZXh0U2libGluZ107Cit9ZWxzZXsKK3RoaXMuX0lFT3JpZ2luYWxQb3M9WyIiLHRkbi5wYXJlbnROb2RlXTsKK30KK30KK2Rvam8uYm9keSgpLmFwcGVuZENoaWxkKHRkbik7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGRuLCJJRUZpeGVkVG9vbGJhciIpOworfWVsc2V7Cit3aXRoKHRkbi5zdHlsZSl7Citwb3NpdGlvbj0iZml4ZWQiOwordG9wPSIwcHgiOworfQorfQordGRuLnN0eWxlLndpZHRoPV9iNGMud2lkdGgrInB4IjsKK3Rkbi5zdHlsZS56SW5kZXg9MTAwMDsKK3RoaXMuX2ZpeEVuYWJsZWQ9dHJ1ZTsKK30KK2lmKCFkb2pvLnJlbmRlci5odG1sLnNhZmFyaSl7Cit2YXIgX2I0ZD0odGhpcy5oZWlnaHQpP3BhcnNlSW50KHRoaXMuZWRpdG9yLmhlaWdodCk6dGhpcy5lZGl0b3IuX2xhc3RIZWlnaHQ7CitpZihfYjRiPih0aGlzLl9zY3JvbGxUaHJlc2hvbGQrX2I0ZCkpewordGRuLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworfWVsc2V7Cit0ZG4uc3R5bGUuZGlzcGxheT0iIjsKK30KK30KK31lbHNleworaWYodGhpcy5fZml4RW5hYmxlZCl7CisodGhpcy5lZGl0b3Iub2JqZWN0fHx0aGlzLmVkaXRvci5pZnJhbWUpLnN0eWxlLm1hcmdpblRvcD1udWxsOword2l0aCh0ZG4uc3R5bGUpeworcG9zaXRpb249IiI7Cit0b3A9IiI7Cit6SW5kZXg9IiI7CitkaXNwbGF5PSIiOworfQoraWYoaXNJRSl7Cit0ZG4uc3R5bGUubGVmdD0iIjsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyh0ZG4sIklFRml4ZWRUb29sYmFyIik7CitpZih0aGlzLl9JRU9yaWdpbmFsUG9zKXsKK2Rvam8uaHRtbC5pbnNlcnRBdFBvc2l0aW9uKHRkbix0aGlzLl9JRU9yaWdpbmFsUG9zWzFdLHRoaXMuX0lFT3JpZ2luYWxQb3NbMF0pOwordGhpcy5fSUVPcmlnaW5hbFBvcz1udWxsOworfWVsc2V7Citkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRkbix0aGlzLmVkaXRvci5vYmplY3R8fHRoaXMuZWRpdG9yLmlmcmFtZSk7Cit9Cit9Cit0ZG4uc3R5bGUud2lkdGg9IiI7Cit0aGlzLl9maXhFbmFibGVkPWZhbHNlOworfQorfQorfSxkZXN0cm95OmZ1bmN0aW9uKCl7Cit0aGlzLl9JRU9yaWdpbmFsUG9zPW51bGw7Cit0aGlzLl9oYW5kbGVTY3JvbGw9ZmFsc2U7CitjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWwpOwordGhpcy5lZGl0b3IudW5yZWdpc3RlckxvYWRlZFBsdWdpbih0aGlzKTsKK2lmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSwiSUVGaXhlZFRvb2xiYXIiKTsKK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMiIpOworZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXI9bmV3IGRvam8ud2lkZ2V0LkhhbmRsZXJNYW5hZ2VyOworZG9qby5sYW5nLm1peGluKGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLHtfY3VycmVudEluc3RhbmNlOm51bGwsY29tbWFuZFN0YXRlOntEaXNhYmxlZDowLExhdGNoZWQ6MSxFbmFibGVkOjJ9LGdldEN1cnJlbnRJbnN0YW5jZTpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMuX2N1cnJlbnRJbnN0YW5jZTsKK30sc2V0Q3VycmVudEluc3RhbmNlOmZ1bmN0aW9uKGluc3QpewordGhpcy5fY3VycmVudEluc3RhbmNlPWluc3Q7Cit9LGdldENvbW1hbmQ6ZnVuY3Rpb24oX2I0ZixuYW1lKXsKK3ZhciBfYjUxOworbmFtZT1uYW1lLnRvTG93ZXJDYXNlKCk7Citmb3IodmFyIGk9MDtpPHRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVycy5sZW5ndGg7aSsrKXsKK19iNTE9dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldKF9iNGYsbmFtZSk7CitpZihfYjUxKXsKK3JldHVybiBfYjUxOworfQorfQorc3dpdGNoKG5hbWUpeworY2FzZSAiaHRtbHRvZ2dsZSI6CitfYjUxPW5ldyBkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQoX2I0ZixuYW1lKTsKK2JyZWFrOworY2FzZSAiZm9ybWF0YmxvY2siOgorX2I1MT1uZXcgZG9qby53aWRnZXQuRWRpdG9yMkZvcm1hdEJsb2NrQ29tbWFuZChfYjRmLG5hbWUpOworYnJlYWs7CitjYXNlICJhbmNob3IiOgorX2I1MT1uZXcgZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQoX2I0ZixuYW1lKTsKK2JyZWFrOworY2FzZSAiY3JlYXRlbGluayI6CitfYjUxPW5ldyBkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29tbWFuZChfYjRmLG5hbWUse2NvbnRlbnRGaWxlOiJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkNyZWF0ZUxpbmtEaWFsb2ciLGNvbnRlbnRDbGFzczoiRWRpdG9yMkNyZWF0ZUxpbmtEaWFsb2ciLHRpdGxlOiJJbnNlcnQvRWRpdCBMaW5rIix3aWR0aDoiMzAwcHgiLGhlaWdodDoiMjAwcHgifSk7CiticmVhazsKK2Nhc2UgImluc2VydGltYWdlIjoKK19iNTE9bmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kKF9iNGYsbmFtZSx7Y29udGVudEZpbGU6ImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uSW5zZXJ0SW1hZ2VEaWFsb2ciLGNvbnRlbnRDbGFzczoiRWRpdG9yMkluc2VydEltYWdlRGlhbG9nIix0aXRsZToiSW5zZXJ0L0VkaXQgSW1hZ2UiLHdpZHRoOiI0MDBweCIsaGVpZ2h0OiIyNzBweCJ9KTsKK2JyZWFrOworZGVmYXVsdDoKK3ZhciBfYjUzPXRoaXMuZ2V0Q3VycmVudEluc3RhbmNlKCk7CitpZigoX2I1MyYmX2I1My5xdWVyeUNvbW1hbmRBdmFpbGFibGUobmFtZSkpfHwoIV9iNTMmJmRvam8ud2lkZ2V0LkVkaXRvcjIucHJvdG90eXBlLnF1ZXJ5Q29tbWFuZEF2YWlsYWJsZShuYW1lKSkpeworX2I1MT1uZXcgZG9qby53aWRnZXQuRWRpdG9yMkJyb3dzZXJDb21tYW5kKF9iNGYsbmFtZSk7Cit9ZWxzZXsKK2Rvam8uZGVidWcoImRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldENvbW1hbmQ6IFVua25vd24gY29tbWFuZCAiK25hbWUpOworcmV0dXJuOworfQorfQorcmV0dXJuIF9iNTE7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oKXsKK3RoaXMuX2N1cnJlbnRJbnN0YW5jZT1udWxsOworZG9qby53aWRnZXQuSGFuZGxlck1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK319KTsKK2Rvam8uYWRkT25VbmxvYWQoZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIsImRlc3Ryb3kiKTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyQ29tbWFuZCIsbnVsbCxmdW5jdGlvbihfYjU0LG5hbWUpewordGhpcy5fZWRpdG9yPV9iNTQ7Cit0aGlzLl91cGRhdGVUaW1lPTA7Cit0aGlzLl9uYW1lPW5hbWU7Cit9LHtfdGV4dDoiVW5rbm93biIsZXhlY3V0ZTpmdW5jdGlvbihwYXJhKXsKK2Rvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQuZXhlY3V0ZSIpOworfSxnZXRUZXh0OmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy5fdGV4dDsKK30sZ2V0U3RhdGU6ZnVuY3Rpb24oKXsKK3JldHVybiBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRW5hYmxlZDsKK30sZGVzdHJveTpmdW5jdGlvbigpeworfX0pOworZG9qby53aWRnZXQuRWRpdG9yMkJyb3dzZXJDb21tYW5kTmFtZXM9eyJib2xkIjoiQm9sZCIsImNvcHkiOiJDb3B5IiwiY3V0IjoiQ3V0IiwiRGVsZXRlIjoiRGVsZXRlIiwiaW5kZW50IjoiSW5kZW50IiwiaW5zZXJ0aG9yaXpvbnRhbHJ1bGUiOiJIb3JpemVudGFsIFJ1bGUiLCJpbnNlcnRvcmRlcmVkbGlzdCI6Ik51bWJlcmVkIExpc3QiLCJpbnNlcnR1bm9yZGVyZWRsaXN0IjoiQnVsbGV0IExpc3QiLCJpdGFsaWMiOiJJdGFsaWMiLCJqdXN0aWZ5Y2VudGVyIjoiQWxpZ24gQ2VudGVyIiwianVzdGlmeWZ1bGwiOiJKdXN0aWZ5IiwianVzdGlmeWxlZnQiOiJBbGlnbiBMZWZ0IiwianVzdGlmeXJpZ2h0IjoiQWxpZ24gUmlnaHQiLCJvdXRkZW50IjoiT3V0ZGVudCIsInBhc3RlIjoiUGFzdGUiLCJyZWRvIjoiUmVkbyIsInJlbW92ZWZvcm1hdCI6IlJlbW92ZSBGb3JtYXQiLCJzZWxlY3RhbGwiOiJTZWxlY3QgQWxsIiwic3RyaWtldGhyb3VnaCI6IlN0cmlrZXRocm91Z2giLCJzdWJzY3JpcHQiOiJTdWJzY3JpcHQiLCJzdXBlcnNjcmlwdCI6IlN1cGVyc2NyaXB0IiwidW5kZXJsaW5lIjoiVW5kZXJsaW5lIiwidW5kbyI6IlVuZG8iLCJ1bmxpbmsiOiJSZW1vdmUgTGluayIsImNyZWF0ZWxpbmsiOiJDcmVhdGUgTGluayIsImluc2VydGltYWdlIjoiSW5zZXJ0IEltYWdlIiwiaHRtbHRvZ2dsZSI6IkhUTUwgU291cmNlIiwiZm9yZWNvbG9yIjoiRm9yZWdyb3VuZCBDb2xvciIsImhpbGl0ZWNvbG9yIjoiQmFja2dyb3VuZCBDb2xvciIsInBsYWluZm9ybWF0YmxvY2siOiJQYXJhZ3JhcGggU3R5bGUiLCJmb3JtYXRibG9jayI6IlBhcmFncmFwaCBTdHlsZSIsImZvbnRzaXplIjoiRm9udCBTaXplIiwiZm9udG5hbWUiOiJGb250IE5hbWUifTsKK2Rvam8ubGFuZy5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQiLGRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kLGZ1bmN0aW9uKF9iNTcsbmFtZSl7Cit2YXIgdGV4dD1kb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmROYW1lc1tuYW1lLnRvTG93ZXJDYXNlKCldOworaWYodGV4dCl7Cit0aGlzLl90ZXh0PXRleHQ7Cit9Cit9LHtleGVjdXRlOmZ1bmN0aW9uKHBhcmEpewordGhpcy5fZWRpdG9yLmV4ZWNDb21tYW5kKHRoaXMuX25hbWUscGFyYSk7Cit9LGdldFN0YXRlOmZ1bmN0aW9uKCl7CitpZih0aGlzLl9lZGl0b3IuX2xhc3RTdGF0ZVRpbWVzdGFtcD50aGlzLl91cGRhdGVUaW1lfHx0aGlzLl9zdGF0ZT09dW5kZWZpbmVkKXsKK3RoaXMuX3VwZGF0ZVRpbWU9dGhpcy5fZWRpdG9yLl9sYXN0U3RhdGVUaW1lc3RhbXA7Cit0cnl7CitpZih0aGlzLl9lZGl0b3IucXVlcnlDb21tYW5kRW5hYmxlZCh0aGlzLl9uYW1lKSl7CitpZih0aGlzLl9lZGl0b3IucXVlcnlDb21tYW5kU3RhdGUodGhpcy5fbmFtZSkpewordGhpcy5fc3RhdGU9ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkxhdGNoZWQ7Cit9ZWxzZXsKK3RoaXMuX3N0YXRlPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5FbmFibGVkOworfQorfWVsc2V7Cit0aGlzLl9zdGF0ZT1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRGlzYWJsZWQ7Cit9Cit9CitjYXRjaChlKXsKK3RoaXMuX3N0YXRlPWRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5FbmFibGVkOworfQorfQorcmV0dXJuIHRoaXMuX3N0YXRlOworfSxnZXRWYWx1ZTpmdW5jdGlvbigpewordHJ5eworcmV0dXJuIHRoaXMuX2VkaXRvci5xdWVyeUNvbW1hbmRWYWx1ZSh0aGlzLl9uYW1lKTsKK30KK2NhdGNoKGUpeworfQorfX0pOworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJGb3JtYXRCbG9ja0NvbW1hbmQiLGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZCx7fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2ciLFtkb2pvLndpZGdldC5IdG1sV2lkZ2V0LGRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZUJhc2UsZG9qby53aWRnZXQuTW9kYWxEaWFsb2dCYXNlXSx7dGVtcGxhdGVTdHJpbmc6IjxkaXYgaWQ9XCIke3RoaXMud2lkZ2V0SWR9XCIgY2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lXCI+XHJcblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiU3RhcnRPdXRlclwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCJcdHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cclxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJTdGFydFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwidGl0bGVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhclwiICBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG5cdCAgXHQ8aW1nIGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFySWNvblwiICBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb25cIj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY2xvc2VBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOmhpZGVcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsb3NlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXN0b3JlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpyZXN0b3JlV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtYXhpbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWF4aW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtaW5pbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWluaW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvblwiPjwvZGl2PlxyXG5cdCAgXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyVGV4dFwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dFwiPiR7dGhpcy50aXRsZX08L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsaWVudFwiPjwvZGl2PlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZE91dGVyXCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXNpemVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuIixtb2RhbDp0cnVlLHdpZHRoOiIiLGhlaWdodDoiIix3aW5kb3dTdGF0ZToibWluaW1pemVkIixkaXNwbGF5Q2xvc2VBY3Rpb246dHJ1ZSxjb250ZW50RmlsZToiIixjb250ZW50Q2xhc3M6IiIsZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK3RoaXMuZmlsbEluRmxvYXRpbmdQYW5lVGVtcGxhdGUoYXJncyxmcmFnKTsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsYXJncyxmcmFnKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpeworaWYodGhpcy5jb250ZW50RmlsZSl7Citkb2pvLnJlcXVpcmUodGhpcy5jb250ZW50RmlsZSk7Cit9CitpZih0aGlzLm1vZGFsKXsKK2Rvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5jYWxsKHRoaXMpOworfWVsc2V7Cit3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7Cit6SW5kZXg9OTk5OworZGlzcGxheT0ibm9uZSI7Cit9Cit9Citkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlLnByb3RvdHlwZS5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmNhbGwodGhpcyk7CitpZih0aGlzLndpZHRoJiZ0aGlzLmhlaWdodCl7Cit3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7Cit3aWR0aD10aGlzLndpZHRoOworaGVpZ2h0PXRoaXMuaGVpZ2h0OworfQorfQorfSxjcmVhdGVDb250ZW50OmZ1bmN0aW9uKCl7CitpZighdGhpcy5jb250ZW50V2lkZ2V0JiZ0aGlzLmNvbnRlbnRDbGFzcyl7Cit0aGlzLmNvbnRlbnRXaWRnZXQ9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KHRoaXMuY29udGVudENsYXNzKTsKK3RoaXMuYWRkQ2hpbGQodGhpcy5jb250ZW50V2lkZ2V0KTsKK30KK30sc2hvdzpmdW5jdGlvbigpeworaWYoIXRoaXMuY29udGVudFdpZGdldCl7Citkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3Muc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit0aGlzLmNyZWF0ZUNvbnRlbnQoKTsKK2Rvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7Cit9CitpZighdGhpcy5jb250ZW50V2lkZ2V0fHwhdGhpcy5jb250ZW50V2lkZ2V0LmxvYWRDb250ZW50KCkpeworcmV0dXJuOworfQordGhpcy5zaG93RmxvYXRpbmdQYW5lKCk7Citkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3Muc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitpZih0aGlzLm1vZGFsKXsKK3RoaXMuc2hvd01vZGFsRGlhbG9nKCk7Cit9CitpZih0aGlzLm1vZGFsKXsKK3RoaXMuYmcuc3R5bGUuekluZGV4PXRoaXMuZG9tTm9kZS5zdHlsZS56SW5kZXgtMTsKK30KK30sb25TaG93OmZ1bmN0aW9uKCl7Citkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3Mub25TaG93LmNhbGwodGhpcyk7Cit0aGlzLm9uRmxvYXRpbmdQYW5lU2hvdygpOworfSxjbG9zZVdpbmRvdzpmdW5jdGlvbigpewordGhpcy5oaWRlKCk7Citkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MuY2xvc2VXaW5kb3cuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxoaWRlOmZ1bmN0aW9uKCl7CitpZih0aGlzLm1vZGFsKXsKK3RoaXMuaGlkZU1vZGFsRGlhbG9nKCk7Cit9Citkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MuaGlkZS5jYWxsKHRoaXMpOworfSxjaGVja1NpemU6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuaXNTaG93aW5nKCkpeworaWYodGhpcy5tb2RhbCl7Cit0aGlzLl9zaXplQmFja2dyb3VuZCgpOworfQordGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7Cit0aGlzLm9uUmVzaXplZCgpOworfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCIsZG9qby53aWRnZXQuSHRtbFdpZGdldCx7d2lkZ2V0c0luVGVtcGxhdGU6dHJ1ZSxsb2FkQ29udGVudDpmdW5jdGlvbigpeworcmV0dXJuIHRydWU7Cit9LGNhbmNlbDpmdW5jdGlvbigpewordGhpcy5wYXJlbnQuaGlkZSgpOworfX0pOworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kIixkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQsZnVuY3Rpb24oX2I1ZCxuYW1lLF9iNWYpewordGhpcy5kaWFsb2dQYXJhcz1fYjVmOworfSx7ZXhlY3V0ZTpmdW5jdGlvbigpeworaWYoIXRoaXMuZGlhbG9nKXsKK2lmKCF0aGlzLmRpYWxvZ1BhcmFzLmNvbnRlbnRGaWxlfHwhdGhpcy5kaWFsb2dQYXJhcy5jb250ZW50Q2xhc3MpeworYWxlcnQoImNvbnRlbnRGaWxlIGFuZCBjb250ZW50Q2xhc3Mgc2hvdWxkIGJlIHNldCBmb3IgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQuZGlhbG9nUGFyYXMhIik7CityZXR1cm47Cit9Cit0aGlzLmRpYWxvZz1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJEaWFsb2ciLHRoaXMuZGlhbG9nUGFyYXMpOworZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2cuZG9tTm9kZSk7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywiZGVzdHJveSIsdGhpcy5kaWFsb2csImRlc3Ryb3kiKTsKK30KK3RoaXMuZGlhbG9nLnNob3coKTsKK30sZ2V0VGV4dDpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMuZGlhbG9nUGFyYXMudGl0bGV8fGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kLnN1cGVyY2xhc3MuZ2V0VGV4dC5jYWxsKHRoaXMpOworfX0pOworZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHM9e307Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkVkaXRvcjIiLGRvam8ud2lkZ2V0LlJpY2hUZXh0LGZ1bmN0aW9uKCl7Cit0aGlzLl9sb2FkZWRDb21tYW5kcz17fTsKK30se3Rvb2xiYXJBbHdheXNWaXNpYmxlOmZhbHNlLHRvb2xiYXJXaWRnZXQ6bnVsbCxzY3JvbGxJbnRlcnZhbDpudWxsLHRvb2xiYXJUZW1wbGF0ZVBhdGg6ZG9qby51cmkuY2FjaGUuc2V0KGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvRWRpdG9yVG9vbGJhck9uZWxpbmUuaHRtbCIpLCAiPGRpdiBjbGFzcz1cIkVkaXRvclRvb2xiYXJEb21Ob2RlIEVkaXRvclRvb2xiYXJTbWFsbEJnXCI+XHJcblx0PHRhYmxlIGNlbGxwYWRkaW5nPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cclxuXHRcdDx0Ym9keT5cclxuXHRcdFx0PHRyIHZhbGlnbj1cInRvcFwiIGFsaWduPVwibGVmdFwiPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImh0bWx0b2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb25cIiBcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOiBub25lOyB3aWR0aDogMzBweDtcIiA+Jmx0O2gmZ3Q7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiY29weVwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQ29weVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInBhc3RlXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9QYXN0ZVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInVuZG9cIj5cclxuXHRcdFx0XHRcdFx0PCEtLSBGSVhNRTogc2hvdWxkIHdlIGhhdmUgdGhlIHRleHQgXCJ1bmRvXCIgaGVyZT8gLS0+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9VbmRvXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwicmVkb1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUmVkb1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwXCJcdHN0eWxlPVwid2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiY3JlYXRlbGlua1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fTGlua1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImluc2VydGltYWdlXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JbWFnZVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImluc2VydGhvcml6b250YWxydWxlXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Ib3Jpem9udGFsTGluZSBcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJib2xkXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Cb2xkXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaXRhbGljXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9JdGFsaWNcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJ1bmRlcmxpbmVcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1VuZGVybGluZVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInN0cmlrZXRocm91Z2hcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1N0cmlrZVRocm91Z2hcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgaXNTcGFjZXI9XCJ0cnVlXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NlcFwiIFxyXG5cdFx0XHRcdFx0XHRcdHN0eWxlPVwid2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0dW5vcmRlcmVkbGlzdFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBcclxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQnVsbGV0ZWRMaXN0XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0b3JkZXJlZGxpc3RcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX051bWJlcmVkTGlzdFwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwXCIgc3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpbmRlbnRcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0luZGVudFwiIFxyXG5cdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwib3V0ZGVudFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fT3V0ZGVudFwiIFxyXG5cdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIGlzU3BhY2VyPVwidHJ1ZVwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIiBzdHlsZT1cIndpZHRoOiA1cHg7IG1pbi13aWR0aDogNXB4O1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImZvcmVjb2xvclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fVGV4dENvbG9yXCIgXHJcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJoaWxpdGVjb2xvclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQmFja2dyb3VuZENvbG9yXCIgXHJcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgaXNTcGFjZXI9XCJ0cnVlXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NlcFwiIHN0eWxlPVwid2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeWxlZnRcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0xlZnRKdXN0aWZ5XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeWNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQ2VudGVySnVzdGlmeVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImp1c3RpZnlyaWdodFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fUmlnaHRKdXN0aWZ5XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeWZ1bGxcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0Jsb2NrSnVzdGlmeVwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlx0XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNlbGVjdCBjbGFzcz1cImRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwicGxhaW5mb3JtYXRibG9ja1wiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tIEZJWE1FOiB1c2luZyBcInBcIiBoZXJlIGluc2VydHMgYSBwYXJhZ3JhcGggaW4gbW9zdCBjYXNlcyEgLS0+XHJcblx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJcIj4tLSBmb3JtYXQgLS08L29wdGlvbj5cclxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInBcIj5Ob3JtYWw8L29wdGlvbj5cclxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInByZVwiPkZpeGVkIEZvbnQ8L29wdGlvbj5cclxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImgxXCI+TWFpbiBIZWFkaW5nPC9vcHRpb24+XHJcblx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJoMlwiPlNlY3Rpb24gSGVhZGluZzwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiaDNcIj5TdWItSGVhZGluZzwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHQ8IS0tIDxvcHRpb24gdmFsdWU9XCJibG9ja3F1b3RlXCI+QmxvY2sgUXVvdGU8L29wdGlvbj4gLS0+XHJcblx0XHRcdFx0XHQ8L3NlbGVjdD5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD48IS0tIHVuY29tbWVudCB0byBlbmFibGUgc2F2ZSBidXR0b24gLS0+XHJcblx0XHRcdFx0XHQ8IS0tIHNhdmUgLS0+XHJcblx0XHRcdFx0XHQ8IS0tc3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJzYXZlXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TYXZlXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuLS0+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgd2lkdGg9XCIqXCI+Jm5ic3A7PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGJvZHk+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbiIpLHRvb2xiYXJUZW1wbGF0ZUNzc1BhdGg6bnVsbCx0b29sYmFyUGxhY2VIb2xkZXI6IiIsX2luU291cmNlTW9kZTpmYWxzZSxfaHRtbEVkaXROb2RlOm51bGwsdG9vbGJhckdyb3VwOiIiLHNoYXJlVG9vbGJhcjpmYWxzZSxjb250ZXh0TWVudUdyb3VwU2V0OiIiLGVkaXRvck9uTG9hZDpmdW5jdGlvbigpeworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkb2pvLndpZGdldC5FZGl0b3IyOjpwcmVMb2FkaW5nVG9vbGJhciIsdGhpcyk7CitpZih0aGlzLnRvb2xiYXJBbHdheXNWaXNpYmxlKXsKK30KK2lmKHRoaXMudG9vbGJhcldpZGdldCl7Cit0aGlzLnRvb2xiYXJXaWRnZXQuc2hvdygpOworZG9qby5odG1sLmluc2VydEJlZm9yZSh0aGlzLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSx0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7Cit9ZWxzZXsKK2lmKHRoaXMuc2hhcmVUb29sYmFyKXsKK2Rvam8uZGVwcmVjYXRlZCgiRWRpdG9yMjpzaGFyZVRvb2xiYXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0b29sYmFyR3JvdXAiLCIwLjUiKTsKK3RoaXMudG9vbGJhckdyb3VwPSJkZWZhdWx0RG9qb1Rvb2xiYXJHcm91cCI7Cit9CitpZih0aGlzLnRvb2xiYXJHcm91cCl7CitpZihkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckdyb3Vwc1t0aGlzLnRvb2xiYXJHcm91cF0pewordGhpcy50b29sYmFyV2lkZ2V0PWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyR3JvdXBzW3RoaXMudG9vbGJhckdyb3VwXTsKK30KK30KK2lmKCF0aGlzLnRvb2xiYXJXaWRnZXQpewordmFyIF9iNjA9e3NoYXJlR3JvdXA6dGhpcy50b29sYmFyR3JvdXAscGFyZW50OnRoaXN9OworX2I2MC50ZW1wbGF0ZVN0cmluZz1kb2pvLnVyaS5jYWNoZS5nZXQodGhpcy50b29sYmFyVGVtcGxhdGVQYXRoKTsKK2lmKHRoaXMudG9vbGJhclRlbXBsYXRlQ3NzUGF0aCl7CitfYjYwLnRlbXBsYXRlQ3NzUGF0aD10aGlzLnRvb2xiYXJUZW1wbGF0ZUNzc1BhdGg7CitfYjYwLnRlbXBsYXRlQ3NzU3RyaW5nPWRvam8udXJpLmNhY2hlLmdldCh0aGlzLnRvb2xiYXJUZW1wbGF0ZUNzc1BhdGgpOworfQoraWYodGhpcy50b29sYmFyUGxhY2VIb2xkZXIpewordGhpcy50b29sYmFyV2lkZ2V0PWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMlRvb2xiYXIiLF9iNjAsZG9qby5ieUlkKHRoaXMudG9vbGJhclBsYWNlSG9sZGVyKSwiYWZ0ZXIiKTsKK31lbHNlewordGhpcy50b29sYmFyV2lkZ2V0PWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMlRvb2xiYXIiLF9iNjAsdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQsImJlZm9yZSIpOworfQoraWYodGhpcy50b29sYmFyR3JvdXApeworZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHNbdGhpcy50b29sYmFyR3JvdXBdPXRoaXMudG9vbGJhcldpZGdldDsKK30KK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLCJjbG9zZSIsdGhpcy50b29sYmFyV2lkZ2V0LCJoaWRlIik7Cit0aGlzLnRvb2xiYXJMb2FkZWQoKTsKK30KK30KK2Rvam8uZXZlbnQudG9waWMucmVnaXN0ZXJQdWJsaXNoZXIoIkVkaXRvcjIuY2xvYmJlckZvY3VzIix0aGlzLCJjbG9iYmVyRm9jdXMiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJFZGl0b3IyLmNsb2JiZXJGb2N1cyIsdGhpcywic2V0Qmx1ciIpOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkb2pvLndpZGdldC5FZGl0b3IyOjpvbkxvYWQiLHRoaXMpOworfSx0b29sYmFyTG9hZGVkOmZ1bmN0aW9uKCl7Cit9LHJlZ2lzdGVyTG9hZGVkUGx1Z2luOmZ1bmN0aW9uKG9iail7CitpZighdGhpcy5sb2FkZWRQbHVnaW5zKXsKK3RoaXMubG9hZGVkUGx1Z2lucz1bXTsKK30KK3RoaXMubG9hZGVkUGx1Z2lucy5wdXNoKG9iaik7Cit9LHVucmVnaXN0ZXJMb2FkZWRQbHVnaW46ZnVuY3Rpb24ob2JqKXsKK2Zvcih2YXIgaSBpbiB0aGlzLmxvYWRlZFBsdWdpbnMpeworaWYodGhpcy5sb2FkZWRQbHVnaW5zW2ldPT09b2JqKXsKK2RlbGV0ZSB0aGlzLmxvYWRlZFBsdWdpbnNbaV07CityZXR1cm47Cit9Cit9Citkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyLnVucmVnaXN0ZXJMb2FkZWRQbHVnaW46IHVua25vdyBwbHVnaW4gb2JqZWN0OiAiK29iaik7Cit9LGV4ZWNDb21tYW5kOmZ1bmN0aW9uKF9iNjQsX2I2NSl7Citzd2l0Y2goX2I2NC50b0xvd2VyQ2FzZSgpKXsKK2Nhc2UgImh0bWx0b2dnbGUiOgordGhpcy50b2dnbGVIdG1sRWRpdGluZygpOworYnJlYWs7CitkZWZhdWx0OgorZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLmV4ZWNDb21tYW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30KK30scXVlcnlDb21tYW5kRW5hYmxlZDpmdW5jdGlvbihfYjY2LF9iNjcpeworc3dpdGNoKF9iNjYudG9Mb3dlckNhc2UoKSl7CitjYXNlICJodG1sdG9nZ2xlIjoKK3JldHVybiB0cnVlOworZGVmYXVsdDoKK2lmKHRoaXMuX2luU291cmNlTW9kZSl7CityZXR1cm4gZmFsc2U7Cit9CityZXR1cm4gZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLnF1ZXJ5Q29tbWFuZEVuYWJsZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfQorfSxxdWVyeUNvbW1hbmRTdGF0ZTpmdW5jdGlvbihfYjY4LF9iNjkpeworc3dpdGNoKF9iNjgudG9Mb3dlckNhc2UoKSl7CitjYXNlICJodG1sdG9nZ2xlIjoKK3JldHVybiB0aGlzLl9pblNvdXJjZU1vZGU7CitkZWZhdWx0OgorcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5xdWVyeUNvbW1hbmRTdGF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9Cit9LG9uQ2xpY2s6ZnVuY3Rpb24oZSl7Citkb2pvLndpZGdldC5FZGl0b3IyLnN1cGVyY2xhc3Mub25DbGljay5jYWxsKHRoaXMsZSk7CitpZihkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIpeworaWYoIWUpeworZT10aGlzLndpbmRvdy5ldmVudDsKK30KK2Rvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5vbkNsaWNrKGUpOworfQorfSxjbG9iYmVyRm9jdXM6ZnVuY3Rpb24oKXsKK30sdG9nZ2xlSHRtbEVkaXRpbmc6ZnVuY3Rpb24oKXsKK2lmKHRoaXM9PT1kb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKSl7CitpZighdGhpcy5faW5Tb3VyY2VNb2RlKXsKK3ZhciBodG1sPXRoaXMuZ2V0RWRpdG9yQ29udGVudCgpOwordGhpcy5faW5Tb3VyY2VNb2RlPXRydWU7CitpZighdGhpcy5faHRtbEVkaXROb2RlKXsKK3RoaXMuX2h0bWxFZGl0Tm9kZT1kb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7Citkb2pvLmh0bWwuaW5zZXJ0QWZ0ZXIodGhpcy5faHRtbEVkaXROb2RlLHRoaXMuZWRpdG9yT2JqZWN0KTsKK30KK3RoaXMuX2h0bWxFZGl0Tm9kZS5zdHlsZS5kaXNwbGF5PSIiOwordGhpcy5faHRtbEVkaXROb2RlLnN0eWxlLndpZHRoPSIxMDAlIjsKK3RoaXMuX2h0bWxFZGl0Tm9kZS5zdHlsZS5oZWlnaHQ9ZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmVkaXROb2RlKS5oZWlnaHQrInB4IjsKK3RoaXMuX2h0bWxFZGl0Tm9kZS52YWx1ZT1odG1sOword2l0aCh0aGlzLmVkaXRvck9iamVjdC5zdHlsZSl7Citwb3NpdGlvbj0iYWJzb2x1dGUiOworbGVmdD0iLTIwMDBweCI7Cit0b3A9Ii0yMDAwcHgiOworfQorfWVsc2V7Cit0aGlzLl9pblNvdXJjZU1vZGU9ZmFsc2U7Cit0aGlzLl9odG1sRWRpdE5vZGUuYmx1cigpOword2l0aCh0aGlzLmVkaXRvck9iamVjdC5zdHlsZSl7Citwb3NpdGlvbj0iIjsKK2xlZnQ9IiI7Cit0b3A9IiI7Cit9Cit2YXIgaHRtbD10aGlzLl9odG1sRWRpdE5vZGUudmFsdWU7Citkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCJyZXBsYWNlRWRpdG9yQ29udGVudCIsMSxodG1sKTsKK3RoaXMuX2h0bWxFZGl0Tm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIjsKK3RoaXMuZm9jdXMoKTsKK30KK3RoaXMub25EaXNwbGF5Q2hhbmdlZChudWxsLHRydWUpOworfQorfSxzZXRGb2N1czpmdW5jdGlvbigpeworaWYoZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk9PT10aGlzKXsKK3JldHVybjsKK30KK3RoaXMuY2xvYmJlckZvY3VzKCk7Citkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5zZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7Cit9LHNldEJsdXI6ZnVuY3Rpb24oKXsKK30sc2F2ZVNlbGVjdGlvbjpmdW5jdGlvbigpewordGhpcy5fYm9va21hcms9bnVsbDsKK3RoaXMuX2Jvb2ttYXJrPWRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdyxkb2pvLmh0bWwuc2VsZWN0aW9uLmdldEJvb2ttYXJrKTsKK30scmVzdG9yZVNlbGVjdGlvbjpmdW5jdGlvbigpeworaWYodGhpcy5fYm9va21hcmspewordGhpcy5mb2N1cygpOworZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCJtb3ZlVG9Cb29rbWFyayIsZG9qby5odG1sLnNlbGVjdGlvbixbdGhpcy5fYm9va21hcmtdKTsKK3RoaXMuX2Jvb2ttYXJrPW51bGw7Cit9ZWxzZXsKK2Rvam8uZGVidWcoInJlc3RvcmVTZWxlY3Rpb246IG5vIHNhdmVkIHNlbGVjdGlvbiBpcyBmb3VuZCEiKTsKK30KK30sX3VwZGF0ZVRvb2xiYXJMYXN0UmFuOm51bGwsX3VwZGF0ZVRvb2xiYXJUaW1lcjpudWxsLF91cGRhdGVUb29sYmFyRnJlcXVlbmN5OjUwMCx1cGRhdGVUb29sYmFyOmZ1bmN0aW9uKF9iNmMpeworaWYoKCF0aGlzLmlzTG9hZGVkKXx8KCF0aGlzLnRvb2xiYXJXaWRnZXQpKXsKK3JldHVybjsKK30KK3ZhciBkaWZmPW5ldyBEYXRlKCktdGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW47CitpZigoIV9iNmMpJiYodGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW4pJiYoKGRpZmY8dGhpcy5fdXBkYXRlVG9vbGJhckZyZXF1ZW5jeSkpKXsKK2NsZWFyVGltZW91dCh0aGlzLl91cGRhdGVUb29sYmFyVGltZXIpOwordmFyIF9iNmU9dGhpczsKK3RoaXMuX3VwZGF0ZVRvb2xiYXJUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CitfYjZlLnVwZGF0ZVRvb2xiYXIoKTsKK30sdGhpcy5fdXBkYXRlVG9vbGJhckZyZXF1ZW5jeS8yKTsKK3JldHVybjsKK31lbHNlewordGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW49bmV3IERhdGUoKTsKK30KK2lmKGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpIT09dGhpcyl7CityZXR1cm47Cit9Cit0aGlzLnRvb2xiYXJXaWRnZXQudXBkYXRlKCk7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oX2I2Zil7Cit0aGlzLl9odG1sRWRpdE5vZGU9bnVsbDsKK2Rvam8uZXZlbnQuZGlzY29ubmVjdCh0aGlzLCJjbG9zZSIsdGhpcy50b29sYmFyV2lkZ2V0LCJoaWRlIik7CitpZighX2I2Zil7Cit0aGlzLnRvb2xiYXJXaWRnZXQuZGVzdHJveSgpOworfQorZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTsKK30sX2xhc3RTdGF0ZVRpbWVzdGFtcDowLG9uRGlzcGxheUNoYW5nZWQ6ZnVuY3Rpb24oZSxfYjcxKXsKK3RoaXMuX2xhc3RTdGF0ZVRpbWVzdGFtcD0obmV3IERhdGUoKSkuZ2V0VGltZSgpOworZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLm9uRGlzcGxheUNoYW5nZWQuY2FsbCh0aGlzLGUpOwordGhpcy51cGRhdGVUb29sYmFyKF9iNzEpOworfSxvbkxvYWQ6ZnVuY3Rpb24oKXsKK3RyeXsKK2Rvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkxvYWQuY2FsbCh0aGlzKTsKK30KK2NhdGNoKGUpeworZG9qby5kZWJ1ZyhlKTsKK30KK3RoaXMuZWRpdG9yT25Mb2FkKCk7Cit9LG9uRm9jdXM6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkZvY3VzLmNhbGwodGhpcyk7Cit0aGlzLnNldEZvY3VzKCk7Cit9LGdldEVkaXRvckNvbnRlbnQ6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuX2luU291cmNlTW9kZSl7CityZXR1cm4gdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlOworfQorcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5nZXRFZGl0b3JDb250ZW50LmNhbGwodGhpcyk7Cit9LHJlcGxhY2VFZGl0b3JDb250ZW50OmZ1bmN0aW9uKGh0bWwpeworaWYodGhpcy5faW5Tb3VyY2VNb2RlKXsKK3RoaXMuX2h0bWxFZGl0Tm9kZS52YWx1ZT1odG1sOworcmV0dXJuOworfQorZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLnJlcGxhY2VFZGl0b3JDb250ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sZ2V0Q29tbWFuZDpmdW5jdGlvbihuYW1lKXsKK2lmKHRoaXMuX2xvYWRlZENvbW1hbmRzW25hbWVdKXsKK3JldHVybiB0aGlzLl9sb2FkZWRDb21tYW5kc1tuYW1lXTsKK30KK3ZhciBjbWQ9ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q29tbWFuZCh0aGlzLG5hbWUpOwordGhpcy5fbG9hZGVkQ29tbWFuZHNbbmFtZV09Y21kOworcmV0dXJuIGNtZDsKK30sc2hvcnRjdXRzOltbImJvbGQiXSxbIml0YWxpYyJdLFsidW5kZXJsaW5lIl0sWyJzZWxlY3RhbGwiLCJhIl0sWyJpbnNlcnR1bm9yZGVyZWRsaXN0IiwiXFwiXV0sc2V0dXBEZWZhdWx0U2hvcnRjdXRzOmZ1bmN0aW9uKCl7Cit2YXIgZXhlYz1mdW5jdGlvbihjbWQpeworcmV0dXJuIGZ1bmN0aW9uKCl7CitjbWQuZXhlY3V0ZSgpOworfTsKK307Cit2YXIgc2VsZj10aGlzOworZG9qby5sYW5nLmZvckVhY2godGhpcy5zaG9ydGN1dHMsZnVuY3Rpb24oaXRlbSl7Cit2YXIgY21kPXNlbGYuZ2V0Q29tbWFuZChpdGVtWzBdKTsKK2lmKGNtZCl7CitzZWxmLmFkZEtleUhhbmRsZXIoaXRlbVsxXT9pdGVtWzFdOml0ZW1bMF0uY2hhckF0KDApLGl0ZW1bMl09PXVuZGVmaW5lZD9zZWxmLktFWV9DVFJMOml0ZW1bMl0sZXhlYyhjbWQpKTsKK30KK30pOworfX0pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkJpbmQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgic3RydXRzLndpZGdldC5CaW5kIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LHt3aWRnZXRUeXBlOiJCaW5kIixleGVjdXRlU2NyaXB0czpmYWxzZSxzY3JpcHRTZXBhcmF0aW9uOmZhbHNlLHRhcmdldHM6IiIsdGFyZ2V0c0FycmF5Om51bGwsaHJlZjoiIixoYW5kbGVyOiIiLGxvYWRpbmdUZXh0OiJMb2FkaW5nLi4uIixlcnJvclRleHQ6IiIsc2hvd0Vycm9yOnRydWUsc2hvd0xvYWRpbmc6ZmFsc2UsbGlzdGVuVG9waWNzOiIiLG5vdGlmeVRvcGljczoiIixub3RpZnlUb3BpY3NBcnJheTpudWxsLGJlZm9yZU5vdGlmeVRvcGljczoiIixiZWZvcmVOb3RpZnlUb3BpY3NBcnJheTpudWxsLGFmdGVyTm90aWZ5VG9waWNzOiIiLGFmdGVyTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxlcnJvck5vdGlmeVRvcGljczoiIixlcnJvck5vdGlmeVRvcGljc0FycmF5Om51bGwsZm9ybUlkOiIiLGZvcm1GaWx0ZXI6IiIsZm9ybU5vZGU6bnVsbCxldmVudHM6IiIsaW5kaWNhdG9yOiIiLHBhcnNlQ29udGVudDp0cnVlLGhpZ2hsaWdodENvbG9yOiIiLGhpZ2hsaWdodER1cmF0aW9uOjIwMDAsdmFsaWRhdGU6ZmFsc2UsYWpheEFmdGVyVmFsaWRhdGlvbjpmYWxzZSxjYWNoZUNvbnRlbnQ6dHJ1ZSxzY3JpcHRTZXBhcmF0aW9uOnRydWUsc2NyaXB0U2NvcGU6bnVsbCx0cmFuc3BvcnQ6IiIscG9zdENyZWF0ZTpmdW5jdGlvbigpewordmFyIHNlbGY9dGhpczsKK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubGlzdGVuVG9waWNzKSl7Cit0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIrdGhpcy5saXN0ZW5Ub3BpY3MrIiB0byByZWZyZXNoIik7Cit2YXIgX2I3Yj10aGlzLmxpc3RlblRvcGljcy5zcGxpdCgiLCIpOworaWYoX2I3Yil7Citkb2pvLmxhbmcuZm9yRWFjaChfYjdiLGZ1bmN0aW9uKF9iN2MpeworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoX2I3YyxzZWxmLCJyZWxvYWRDb250ZW50cyIpOworfSk7Cit9Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLm5vdGlmeVRvcGljcykpewordGhpcy5ub3RpZnlUb3BpY3NBcnJheT10aGlzLm5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5iZWZvcmVOb3RpZnlUb3BpY3MpKXsKK3RoaXMuYmVmb3JlTm90aWZ5VG9waWNzQXJyYXk9dGhpcy5iZWZvcmVOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3MpKXsKK3RoaXMuYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheT10aGlzLmFmdGVyTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yTm90aWZ5VG9waWNzKSl7Cit0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXk9dGhpcy5lcnJvck5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YXJnZXRzKSl7Cit0aGlzLnRhcmdldHNBcnJheT10aGlzLnRhcmdldHMuc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXZlbnRzKSl7Cit2YXIgX2I3ZD10aGlzLmV2ZW50cy5zcGxpdCgiLCIpOworaWYoX2I3ZCYmdGhpcy5kb21Ob2RlKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF9iN2QsZnVuY3Rpb24oX2I3ZSl7Citkb2pvLmV2ZW50LmNvbm5lY3Qoc2VsZi5kb21Ob2RlLF9iN2UsZnVuY3Rpb24oZXZ0KXsKK2V2dC5wcmV2ZW50RGVmYXVsdCgpOworZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworc2VsZi5yZWxvYWRDb250ZW50cygpOworfSk7Cit9KTsKK30KK30KK2lmKGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5mb3JtSWQpKXsKK3RoaXMuZm9ybU5vZGU9ZG9qby5kb20uZ2V0Rmlyc3RBbmNlc3RvckJ5VGFnKHRoaXMuZG9tTm9kZSwiZm9ybSIpOworfWVsc2V7Cit0aGlzLmZvcm1Ob2RlPWRvam8uYnlJZCh0aGlzLmZvcm1JZCk7Cit9CitpZih0aGlzLmZvcm1Ob2RlJiZkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaHJlZikpewordGhpcy5ocmVmPXRoaXMuZm9ybU5vZGUuYWN0aW9uOworfQorfSxoaWdobGlnaHQ6ZnVuY3Rpb24oKXsKK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaGlnaGxpZ2h0Q29sb3IpKXsKK3ZhciBfYjgwPVtdOworZG9qby5sYW5nLmZvckVhY2godGhpcy50YXJnZXRzQXJyYXksZnVuY3Rpb24oX2I4MSl7Cit2YXIgbm9kZT1kb2pvLmJ5SWQoX2I4MSk7CitpZihub2RlKXsKK19iODAucHVzaChub2RlKTsKK30KK30pOwordmFyIF9iODM9ZG9qby5sZnguaHRtbC5oaWdobGlnaHQoX2I4MCx0aGlzLmhpZ2hsaWdodENvbG9yLHRoaXMuaGlnaGxpZ2h0RHVyYXRpb24pOworX2I4My5wbGF5KCk7Cit9Cit9LGxvZzpmdW5jdGlvbih0ZXh0KXsKK2Rvam8uZGVidWcoIlsiKyh0aGlzLndpZGdldElkP3RoaXMud2lkZ2V0SWQ6InVua25vd24iKSsiXSAiK3RleHQpOworfSxzZXRDb250ZW50OmZ1bmN0aW9uKHRleHQpeworaWYodGhpcy50YXJnZXRzQXJyYXkpewordmFyIHNlbGY9dGhpczsKK3ZhciBfYjg3PW5ldyBkb2pvLnhtbC5QYXJzZSgpOworZG9qby5sYW5nLmZvckVhY2godGhpcy50YXJnZXRzQXJyYXksZnVuY3Rpb24oX2I4OCl7Cit2YXIgbm9kZT1kb2pvLmJ5SWQoX2I4OCk7CitpZihub2RlKXsKK25vZGUuaW5uZXJIVE1MPXRleHQ7CitpZihzZWxmLnBhcnNlQ29udGVudCYmdGV4dCE9c2VsZi5sb2FkaW5nVGV4dCl7Cit2YXIgZnJhZz1fYjg3LnBhcnNlRWxlbWVudChub2RlLG51bGwsdHJ1ZSk7Citkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKGZyYWcsZG9qby53aWRnZXQuYnlJZChfYjg4KSk7Cit9Cit9ZWxzZXsKK3NlbGYubG9nKCJVbmFibGUgdG8gZmluZCB0YXJnZXQ6ICIrbm9kZSk7Cit9Cit9KTsKK30KK30sYmluZEhhbmRsZXI6ZnVuY3Rpb24odHlwZSxkYXRhLGUpeworZG9qby5odG1sLmhpZGUodGhpcy5pbmRpY2F0b3IpOwordGhpcy5ub3RpZnkoZGF0YSx0eXBlLGUpOworaWYodHlwZT09ImxvYWQiKXsKK2lmKHRoaXMudmFsaWRhdGUpeworU3RydXRzVXRpbHMuY2xlYXJWYWxpZGF0aW9uRXJyb3JzKHRoaXMuZm9ybU5vZGUpOwordmFyIF9iOGU9U3RydXRzVXRpbHMuZ2V0VmFsaWRhdGlvbkVycm9ycyhkYXRhKTsKK2lmKF9iOGUmJl9iOGUuZmllbGRFcnJvcnMpeworU3RydXRzVXRpbHMuc2hvd1ZhbGlkYXRpb25FcnJvcnModGhpcy5mb3JtTm9kZSxfYjhlKTsKK3JldHVybjsKK31lbHNleworaWYoIXRoaXMuYWpheEFmdGVyVmFsaWRhdGlvbiYmdGhpcy5mb3JtTm9kZSl7Cit0aGlzLmZvcm1Ob2RlLnN1Ym1pdCgpOworcmV0dXJuOworfQorfQorfQoraWYodGhpcy5leGVjdXRlU2NyaXB0cyl7Cit2YXIgX2I4Zj10aGlzLnBhcnNlKGRhdGEpOwordGhpcy5zZXRDb250ZW50KF9iOGYudGV4dCk7Cit0aGlzLl9leGVjdXRlU2NyaXB0cyhfYjhmLnNjcmlwdHMpOworfWVsc2V7Cit0aGlzLnNldENvbnRlbnQoZGF0YSk7Cit9Cit0aGlzLmhpZ2hsaWdodCgpOworfWVsc2V7CitpZih0aGlzLnNob3dFcnJvcil7Cit2YXIgX2I5MD1kb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JUZXh0KT9lLm1lc3NhZ2U6dGhpcy5lcnJvclRleHQ7Cit0aGlzLnNldENvbnRlbnQoX2I5MCk7Cit9Cit9Cit9LG5vdGlmeTpmdW5jdGlvbihkYXRhLHR5cGUsZSl7Cit2YXIgc2VsZj10aGlzOworaWYodGhpcy5ub3RpZnlUb3BpY3NBcnJheSl7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLm5vdGlmeVRvcGljc0FycmF5LGZ1bmN0aW9uKF9iOTUpewordHJ5eworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKF9iOTUsZGF0YSx0eXBlLGUsc2VsZik7Cit9CitjYXRjaChleCl7CitzZWxmLmxvZyhleCk7Cit9Cit9KTsKK30KK3ZhciBfYjk2PW51bGw7Citzd2l0Y2godHlwZSl7CitjYXNlICJiZWZvcmUiOgordGhpcy5ub3RpZnlUbyh0aGlzLmJlZm9yZU5vdGlmeVRvcGljc0FycmF5LG51bGwsZSk7CiticmVhazsKK2Nhc2UgImxvYWQiOgordGhpcy5ub3RpZnlUbyh0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXksZGF0YSxlKTsKK2JyZWFrOworY2FzZSAiZXJyb3IiOgordGhpcy5ub3RpZnlUbyh0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXksZGF0YSxlKTsKK2JyZWFrOworfQorfSxub3RpZnlUbzpmdW5jdGlvbihfYjk3LGRhdGEsZSl7Cit2YXIgc2VsZj10aGlzOworaWYoX2I5Nyl7Citkb2pvLmxhbmcuZm9yRWFjaChfYjk3LGZ1bmN0aW9uKF9iOWIpewordHJ5eworaWYoZGF0YSE9bnVsbCl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2I5YixkYXRhLGUsc2VsZik7Cit9ZWxzZXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaChfYjliLGUsc2VsZik7Cit9Cit9CitjYXRjaChleCl7CitzZWxmLmxvZyhleCk7Cit9Cit9KTsKK30KK30sb25Eb3dubG9hZFN0YXJ0OmZ1bmN0aW9uKF9iOWMpeworaWYodGhpcy5zaG93TG9hZGluZyYmIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5sb2FkaW5nVGV4dCkpeworX2I5Yy50ZXh0PXRoaXMubG9hZGluZ1RleHQ7Cit9Cit9LHJlbG9hZENvbnRlbnRzOmZ1bmN0aW9uKGV2dCl7CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhhbmRsZXIpKXsKK3RoaXMubG9nKCJJbnZva2luZyBoYW5kbGVyOiAiK3RoaXMuaGFuZGxlcik7Cit3aW5kb3dbdGhpcy5oYW5kbGVyXSh0aGlzLHRoaXMuZG9tTm9kZSk7Cit9ZWxzZXsKK3RyeXsKK3ZhciBzZWxmPXRoaXM7Cit2YXIgX2I5Zj17Y2FuY2VsOmZhbHNlfTsKK3RoaXMubm90aWZ5KHRoaXMud2lkZ2V0SWQsImJlZm9yZSIsX2I5Zik7CitpZihfYjlmLmNhbmNlbCl7Cit0aGlzLmxvZygiUmVxdWVzdCBjYW5jZWxlZCIpOworcmV0dXJuOworfQoraWYoZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhyZWYpKXsKK3JldHVybjsKK30KK2lmKCF0aGlzLnZhbGlkYXRlJiZ0aGlzLmZvcm1Ob2RlJiZ0aGlzLmZvcm1Ob2RlLm9uc3VibWl0IT1udWxsKXsKK3ZhciBfYmEwPXRoaXMuZm9ybU5vZGUub25zdWJtaXQuY2FsbChldnQpOworaWYoX2JhMCE9bnVsbCYmIV9iYTApewordGhpcy5sb2coIlJlcXVlc3QgY2FuY2VsZWQgYnkgJ29uc3VibWl0JyBvZiB0aGUgZm9ybSIpOworcmV0dXJuOworfQorfQorZG9qby5odG1sLnNob3codGhpcy5pbmRpY2F0b3IpOworaWYodGhpcy5zaG93TG9hZGluZyl7Cit0aGlzLnNldENvbnRlbnQodGhpcy5sb2FkaW5nVGV4dCk7Cit9Cit2YXIgX2JhMT10aGlzLmhyZWY7CitfYmExPV9iYTErKF9iYTEuaW5kZXhPZigiPyIpPi0xPyImIjoiPyIpKyJzdHJ1dHMuZW5hYmxlSlNPTlZhbGlkYXRpb249dHJ1ZSI7CitpZighdGhpcy5hamF4QWZ0ZXJWYWxpZGF0aW9uJiZ0aGlzLnZhbGlkYXRlKXsKK19iYTE9X2JhMSsoX2JhMS5pbmRleE9mKCI/Iik+LTE/IiYiOiI/IikrInN0cnV0cy52YWxpZGF0ZU9ubHk9dHJ1ZSI7Cit9CitpZihkb2pvLmRvbS5pc1RhZyh0aGlzLmRvbU5vZGUsIklOUFVUIiwiaW5wdXQiKSYmdGhpcy5ldmVudHM9PSJvbmNsaWNrIiYmdGhpcy5kb21Ob2RlLnR5cGU9PSJzdWJtaXQiJiYhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmRvbU5vZGUubmFtZSkmJiFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZG9tTm9kZS52YWx1ZSkpewordmFyIGVuYz0vdXRmL2kudGVzdCgiIik/ZW5jb2RlVVJJQ29tcG9uZW50OmRvam8uc3RyaW5nLmVuY29kZUFzY2lpOworX2JhMT1fYmExKyhfYmExLmluZGV4T2YoIj8iKT4tMT8iJiI6Ij8iKStlbmModGhpcy5kb21Ob2RlLm5hbWUpKyI9IitlbmModGhpcy5kb21Ob2RlLnZhbHVlKTsKK30KK2Rvam8uaW8uYmluZCh7dXJsOl9iYTEsdXNlQ2FjaGU6ZmFsc2UscHJldmVudENhY2hlOnRydWUsZm9ybU5vZGU6c2VsZi5mb3JtTm9kZSxmb3JtRmlsdGVyOndpbmRvd1tzZWxmLmZvcm1GaWx0ZXJdLHRyYW5zcG9ydDpzZWxmLnRyYW5zcG9ydCxoYW5kbGVyOmZ1bmN0aW9uKHR5cGUsZGF0YSxlKXsKK2Rvam8ubGFuZy5oaXRjaChzZWxmLCJiaW5kSGFuZGxlciIpKHR5cGUsZGF0YSxlKTsKK30sbWltZXR5cGU6InRleHQvaHRtbCJ9KTsKK30KK2NhdGNoKGV4KXsKK2lmKHRoaXMuc2hvd0Vycm9yKXsKK3ZhciBfYmE2PWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvclRleHQpP2V4OnRoaXMuZXJyb3JUZXh0OwordGhpcy5zZXRDb250ZW50KF9iYTYpOworfQorfQorfQorfSxwYXJzZTpmdW5jdGlvbihzKXsKK3RoaXMubG9nKCJQYXJzaW5nOiAiK3MpOwordmFyIF9iYTg9W107Cit2YXIgdG1wPVtdOwordmFyIF9iYWE9W107Cit3aGlsZShfYmE4KXsKK19iYTg9cy5tYXRjaCgvPHNjcmlwdChbXj5dKik+KFtcc1xTXSo/KTxcL3NjcmlwdD4vaSk7CitpZighX2JhOCl7CiticmVhazsKK30KK2lmKF9iYThbMV0peworYXR0cj1fYmE4WzFdLm1hdGNoKC9zcmM9KFsnIl0/KShbXiInXSopXDEvaSk7CitpZihhdHRyKXsKK3ZhciB0bXAyPWF0dHJbMl0uc2VhcmNoKC8uKihcYmRvam9cYig/OlwudW5jb21wcmVzc2VkKT9cLmpzKSQvKTsKK2lmKHRtcDI+LTEpewordGhpcy5sb2coIlNlY3VyaXR5IG5vdGUhIGluaGliaXQ6IithdHRyWzJdKyIgZnJvbSAgYmVlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKK30KK30KK30KK2lmKF9iYThbMl0pewordmFyIHNjPV9iYThbMl0ucmVwbGFjZSgvKD86dmFyICk/XGJkakNvbmZpZ1xiKD86W1xzXSo9W1xzXSpce1tefV0rXH18XC5bXHddKltcc10qPVtcc10qW147XG5dKik/Oz98ZG9qb1wuaG9zdGVudlwud3JpdGVJbmNsdWRlc1woXHMqXCk7Py9nLCIiKTsKK2lmKCFzYyl7Citjb250aW51ZTsKK30KK3RtcD1bXTsKK3doaWxlKHRtcCl7Cit0bXA9c2MubWF0Y2goL2Rvam9cLig/Oig/OnJlcXVpcmUoPzpBZnRlcik/KD86SWYpPyl8KD86d2lkZ2V0XC4oPzptYW5hZ2VyXC4pP3JlZ2lzdGVyV2lkZ2V0UGFja2FnZSl8KD86KD86aG9zdGVudlwuKT9zZXRNb2R1bGVQcmVmaXgpKVwoKFsnIl0pLio/XDFcKVxzKjs/Lyk7CitpZighdG1wKXsKK2JyZWFrOworfQorc2M9c2MucmVwbGFjZSh0bXBbMF0sIiIpOworfQorX2JhYS5wdXNoKHNjKTsKK30KK3M9cy5yZXBsYWNlKC88c2NyaXB0W14+XSo+W1xzXFNdKj88XC9zY3JpcHQ+L2ksIiIpOworfQorcmV0dXJuIHt0ZXh0OnMsc2NyaXB0czpfYmFhfTsKK30sX2V4ZWN1dGVTY3JpcHRzOmZ1bmN0aW9uKF9iYWQpewordmFyIHNlbGY9dGhpczsKK3ZhciB0bXA9IiIsY29kZT0iIjsKK2Zvcih2YXIgaT0wO2k8X2JhZC5sZW5ndGg7aSsrKXsKK2lmKF9iYWRbaV0ucGF0aCl7Citkb2pvLmlvLmJpbmQodGhpcy5fY2FjaGVTZXR0aW5nKHsidXJsIjpfYmFkW2ldLnBhdGgsImxvYWQiOmZ1bmN0aW9uKHR5cGUsX2JiMyl7Citkb2pvLmxhbmcuaGl0Y2goc2VsZix0bXA9IjsiK19iYjMpOworfSwiZXJyb3IiOmZ1bmN0aW9uKHR5cGUsX2JiNSl7CitfYmI1LnRleHQ9dHlwZSsiIGRvd25sb2FkaW5nIHJlbW90ZSBzY3JpcHQiOworc2VsZi5faGFuZGxlRGVmYXVsdHMuY2FsbChzZWxmLF9iYjUsIm9uRXhlY0Vycm9yIiwiZGVidWciKTsKK30sIm1pbWV0eXBlIjoidGV4dC9wbGFpbiIsInN5bmMiOnRydWV9LHRoaXMuY2FjaGVDb250ZW50KSk7Citjb2RlKz10bXA7Cit9ZWxzZXsKK2NvZGUrPV9iYWRbaV07Cit9Cit9Cit0cnl7CitpZih0aGlzLnNjcmlwdFNlcGFyYXRpb24peworZGVsZXRlIHRoaXMuc2NyaXB0U2NvcGU7Cit0aGlzLnNjcmlwdFNjb3BlPW5ldyAobmV3IEZ1bmN0aW9uKCJfY29udGFpbmVyXyIsY29kZSsiOyByZXR1cm4gdGhpczsiKSkoc2VsZik7Cit9ZWxzZXsKK3ZhciBkamc9ZG9qby5nbG9iYWwoKTsKK2lmKGRqZy5leGVjU2NyaXB0KXsKK2RqZy5leGVjU2NyaXB0KGNvZGUpOworfWVsc2V7Cit2YXIgZGpkPWRvam8uZG9jKCk7Cit2YXIgc2M9ZGpkLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworc2MuYXBwZW5kQ2hpbGQoZGpkLmNyZWF0ZVRleHROb2RlKGNvZGUpKTsKKyh0aGlzLmNvbnRhaW5lck5vZGV8fHRoaXMuZG9tTm9kZSkuYXBwZW5kQ2hpbGQoc2MpOworfQorfQorfQorY2F0Y2goZSl7CitlLnRleHQ9IkVycm9yIHJ1bm5pbmcgc2NyaXB0cyBmcm9tIGNvbnRlbnQ6XG4iK2UuZGVzY3JpcHRpb247Cit0aGlzLmxvZyhlKTsKK30KK30sX2NhY2hlU2V0dGluZzpmdW5jdGlvbihfYmI5LF9iYmEpeworZm9yKHZhciB4IGluIHRoaXMuYmluZEFyZ3MpeworaWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKF9iYjlbeF0pKXsKK19iYjlbeF09dGhpcy5iaW5kQXJnc1t4XTsKK30KK30KK2lmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChfYmI5LnVzZUNhY2hlKSl7CitfYmI5LnVzZUNhY2hlPV9iYmE7Cit9CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoX2JiOS5wcmV2ZW50Q2FjaGUpKXsKK19iYjkucHJldmVudENhY2hlPSFfYmJhOworfQoraWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKF9iYjkubWltZXR5cGUpKXsKK19iYjkubWltZXR5cGU9InRleHQvaHRtbCI7Cit9CityZXR1cm4gX2JiOTsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnRpbWluZy5UaW1lciIpOworZG9qby5sYW5nLnRpbWluZy5UaW1lcj1mdW5jdGlvbihfYmJjKXsKK3RoaXMudGltZXI9bnVsbDsKK3RoaXMuaXNSdW5uaW5nPWZhbHNlOwordGhpcy5pbnRlcnZhbD1fYmJjOwordGhpcy5vblN0YXJ0PW51bGw7Cit0aGlzLm9uU3RvcD1udWxsOworfTsKK2Rvam8uZXh0ZW5kKGRvam8ubGFuZy50aW1pbmcuVGltZXIse29uVGljazpmdW5jdGlvbigpeworfSxzZXRJbnRlcnZhbDpmdW5jdGlvbihfYmJkKXsKK2lmKHRoaXMuaXNSdW5uaW5nKXsKK2RqX2dsb2JhbC5jbGVhckludGVydmFsKHRoaXMudGltZXIpOworfQordGhpcy5pbnRlcnZhbD1fYmJkOworaWYodGhpcy5pc1J1bm5pbmcpewordGhpcy50aW1lcj1kal9nbG9iYWwuc2V0SW50ZXJ2YWwoZG9qby5sYW5nLmhpdGNoKHRoaXMsIm9uVGljayIpLHRoaXMuaW50ZXJ2YWwpOworfQorfSxzdGFydDpmdW5jdGlvbigpeworaWYodHlwZW9mIHRoaXMub25TdGFydD09ImZ1bmN0aW9uIil7Cit0aGlzLm9uU3RhcnQoKTsKK30KK3RoaXMuaXNSdW5uaW5nPXRydWU7Cit0aGlzLnRpbWVyPWRqX2dsb2JhbC5zZXRJbnRlcnZhbChkb2pvLmxhbmcuaGl0Y2godGhpcywib25UaWNrIiksdGhpcy5pbnRlcnZhbCk7Cit9LHN0b3A6ZnVuY3Rpb24oKXsKK2lmKHR5cGVvZiB0aGlzLm9uU3RvcD09ImZ1bmN0aW9uIil7Cit0aGlzLm9uU3RvcCgpOworfQordGhpcy5pc1J1bm5pbmc9ZmFsc2U7Citkal9nbG9iYWwuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKK319KTsKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRGl2Iik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoInN0cnV0cy53aWRnZXQuQmluZERpdiIsZG9qby53aWRnZXQuQ29udGVudFBhbmUse3dpZGdldFR5cGU6IkJpbmREaXYiLGhyZWY6IiIsZXh0cmFjdENvbnRlbnQ6ZmFsc2UscGFyc2VDb250ZW50OmZhbHNlLGNhY2hlQ29udGVudDpmYWxzZSxyZWZyZXNoT25TaG93OmZhbHNlLGV4ZWN1dGVTY3JpcHRzOmZhbHNlLHByZWxvYWQ6dHJ1ZSx1cGRhdGVGcmVxOjAsZGVsYXk6MCxhdXRvU3RhcnQ6dHJ1ZSx0aW1lcjpudWxsLGxvYWRpbmdUZXh0OiJMb2FkaW5nLi4uIixzaG93TG9hZGluZzpmYWxzZSxlcnJvclRleHQ6IiIsc2hvd0Vycm9yOnRydWUsbGlzdGVuVG9waWNzOiIiLG5vdGlmeVRvcGljczoiIixub3RpZnlUb3BpY3NBcnJheTpudWxsLHN0b3BUaW1lckxpc3RlblRvcGljczoiIixzdGFydFRpbWVyTGlzdGVuVG9waWNzOiIiLGJlZm9yZU5vdGlmeVRvcGljczoiIixiZWZvcmVOb3RpZnlUb3BpY3NBcnJheTpudWxsLGFmdGVyTm90aWZ5VG9waWNzOiIiLGFmdGVyTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxlcnJvck5vdGlmeVRvcGljczoiIixlcnJvck5vdGlmeVRvcGljc0FycmF5Om51bGwsYmVmb3JlTG9hZGluZzoiIixhZnRlckxvYWRpbmc6IiIsZm9ybUlkOiIiLGZvcm1GaWx0ZXI6IiIsaW5kaWNhdG9yOiIiLHBhcnNlQ29udGVudDp0cnVlLGhpZ2hsaWdodENvbG9yOiIiLGhpZ2hsaWdodER1cmF0aW9uOjIwMDAsZGlzYWJsZWQ6ZmFsc2UsdHJhbnNwb3J0OiIiLG9uRG93bmxvYWRTdGFydDpmdW5jdGlvbihfYmJlKXsKK2lmKCF0aGlzLnNob3dMb2FkaW5nKXsKK19iYmUucmV0dXJuVmFsdWU9ZmFsc2U7CityZXR1cm47Cit9CitpZih0aGlzLnNob3dMb2FkaW5nJiYhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmxvYWRpbmdUZXh0KSl7CitfYmJlLnRleHQ9dGhpcy5sb2FkaW5nVGV4dDsKK30KK30saGlnaGxpZ2h0OmZ1bmN0aW9uKCl7CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhpZ2hsaWdodENvbG9yKSl7Cit2YXIgX2JiZj1kb2pvLmxmeC5odG1sLmhpZ2hsaWdodChbdGhpcy5kb21Ob2RlXSx0aGlzLmhpZ2hsaWdodENvbG9yLHRoaXMuaGlnaGxpZ2h0RHVyYXRpb24pOworX2JiZi5wbGF5KCk7Cit9Cit9LG9uRG93bmxvYWRFcnJvcjpmdW5jdGlvbihfYmMwKXsKK3RoaXMub25FcnJvcihfYmMwKTsKK30sb25Db250ZW50RXJyb3I6ZnVuY3Rpb24oX2JjMSl7Cit0aGlzLm9uRXJyb3IoX2JjMSk7Cit9LG9uRXhlY0Vycm9yOmZ1bmN0aW9uKF9iYzIpewordGhpcy5vbkVycm9yKF9iYzIpOworfSxvbkVycm9yOmZ1bmN0aW9uKF9iYzMpeworaWYodGhpcy5zaG93RXJyb3IpeworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvclRleHQpKXsKK19iYzMudGV4dD10aGlzLmVycm9yVGV4dDsKK30KK31lbHNleworX2JjMy50ZXh0PSIiOworfQorfSxub3RpZnk6ZnVuY3Rpb24oZGF0YSx0eXBlLGUpeworaWYodGhpcy5ub3RpZnlUb3BpY3NBcnJheSl7Cit2YXIgc2VsZj10aGlzOworZG9qby5sYW5nLmZvckVhY2godGhpcy5ub3RpZnlUb3BpY3NBcnJheSxmdW5jdGlvbihfYmM4KXsKK3RyeXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaChfYmM4LGRhdGEsdHlwZSxlLHNlbGYpOworfQorY2F0Y2goZXgpeworc2VsZi5sb2coZXgpOworfQorfSk7Cit9Cit2YXIgX2JjOT1udWxsOworc3dpdGNoKHR5cGUpeworY2FzZSAiYmVmb3JlIjoKK3RoaXMubm90aWZ5VG8odGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSxudWxsLGUpOworYnJlYWs7CitjYXNlICJsb2FkIjoKK3RoaXMubm90aWZ5VG8odGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5LGRhdGEsZSk7CiticmVhazsKK2Nhc2UgImVycm9yIjoKK3RoaXMubm90aWZ5VG8odGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5LGRhdGEsZSk7CiticmVhazsKK30KK30sbm90aWZ5VG86ZnVuY3Rpb24oX2JjYSxkYXRhLGUpewordmFyIHNlbGY9dGhpczsKK2lmKF9iY2EpeworZG9qby5sYW5nLmZvckVhY2goX2JjYSxmdW5jdGlvbihfYmNlKXsKK3RyeXsKK2lmKGRhdGEhPW51bGwpeworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKF9iY2UsZGF0YSxlLHNlbGYpOworfWVsc2V7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2JjZSxlLHNlbGYpOworfQorfQorY2F0Y2goZXgpeworc2VsZi5sb2coZXgpOworfQorfSk7Cit9Cit9LHBvc3RDcmVhdGU6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK2lmKHRoaXMuaGFuZGxlciE9PSIiKXsKK3RoaXMuc2V0SGFuZGxlcih0aGlzLmhhbmRsZXIpOworfQordmFyIHNlbGY9dGhpczsKK3ZhciBfYmQyPWZ1bmN0aW9uKCl7Citkb2pvLmxhbmcuaGl0Y2goc2VsZiwicmVmcmVzaCIpKCk7Cit9OwordmFyIF9iZDM9ZnVuY3Rpb24oKXsKK2Rvam8ubGFuZy5oaXRjaChzZWxmLCJzdGFydFRpbWVyIikoKTsKK307CitpZih0aGlzLnVwZGF0ZUZyZXE+MCl7Cit0aGlzLnRpbWVyPW5ldyBkb2pvLmxhbmcudGltaW5nLlRpbWVyKHRoaXMudXBkYXRlRnJlcSk7Cit0aGlzLnRpbWVyLm9uVGljaz1fYmQyOworaWYodGhpcy5hdXRvU3RhcnQpeworaWYodGhpcy5kZWxheT4wKXsKK2Rvam8ubGFuZy5zZXRUaW1lb3V0KF9iZDMsdGhpcy5kZWxheSk7Cit9ZWxzZXsKK3RoaXMuc3RhcnRUaW1lcigpOworfQorfQorfWVsc2V7CitpZih0aGlzLmRlbGF5PjApeworZG9qby5sYW5nLnNldFRpbWVvdXQoX2JkMix0aGlzLmRlbGF5KTsKK30KK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubGlzdGVuVG9waWNzKSl7Cit0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIrdGhpcy5saXN0ZW5Ub3BpY3MrIiB0byByZWZyZXNoIik7Cit2YXIgX2JkND10aGlzLmxpc3RlblRvcGljcy5zcGxpdCgiLCIpOworaWYoX2JkNCl7Citkb2pvLmxhbmcuZm9yRWFjaChfYmQ0LGZ1bmN0aW9uKF9iZDUpeworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoX2JkNSxzZWxmLCJyZWZyZXNoIik7Cit9KTsKK30KK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc3RvcFRpbWVyTGlzdGVuVG9waWNzKSl7Cit0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIrdGhpcy5zdG9wVGltZXJMaXN0ZW5Ub3BpY3MrIiB0byBzdG9wIHRpbWVyIik7Cit2YXIgX2JkNj10aGlzLnN0b3BUaW1lckxpc3RlblRvcGljcy5zcGxpdCgiLCIpOworaWYoX2JkNil7Citkb2pvLmxhbmcuZm9yRWFjaChfYmQ2LGZ1bmN0aW9uKF9iZDcpeworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoX2JkNyxzZWxmLCJzdG9wVGltZXIiKTsKK30pOworfQorfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zdGFydFRpbWVyTGlzdGVuVG9waWNzKSl7Cit0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIrdGhpcy5zdG9wVGltZXJMaXN0ZW5Ub3BpY3MrIiB0byBzdGFydCB0aW1lciIpOwordmFyIF9iZDg9dGhpcy5zdGFydFRpbWVyTGlzdGVuVG9waWNzLnNwbGl0KCIsIik7CitpZihfYmQ4KXsKK2Rvam8ubGFuZy5mb3JFYWNoKF9iZDgsZnVuY3Rpb24oX2JkOSl7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZShfYmQ5LHNlbGYsInN0YXJ0VGltZXIiKTsKK30pOworfQorfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ub3RpZnlUb3BpY3MpKXsKK3RoaXMubm90aWZ5VG9waWNzQXJyYXk9dGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzKSl7Cit0aGlzLmJlZm9yZU5vdGlmeVRvcGljc0FycmF5PXRoaXMuYmVmb3JlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyTm90aWZ5VG9waWNzKSl7Cit0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXk9dGhpcy5hZnRlck5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvck5vdGlmeVRvcGljcykpewordGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5PXRoaXMuZXJyb3JOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKHRoaXMuaXNTaG93aW5nKCkmJnRoaXMucHJlbG9hZCYmdGhpcy51cGRhdGVGcmVxPD0wJiZ0aGlzLmRlbGF5PD0wKXsKK3RoaXMucmVmcmVzaCgpOworfQorfSxfZG93bmxvYWRFeHRlcm5hbENvbnRlbnQ6ZnVuY3Rpb24odXJsLF9iZGIpewordmFyIF9iZGM9e2NhbmNlbDpmYWxzZX07Cit0aGlzLm5vdGlmeSh0aGlzLndpZGdldElkLCJiZWZvcmUiLF9iZGMpOworaWYoX2JkYy5jYW5jZWwpeworcmV0dXJuOworfQorZG9qby5odG1sLnNob3codGhpcy5pbmRpY2F0b3IpOwordGhpcy5faGFuZGxlRGVmYXVsdHMoIkxvYWRpbmcuLi4iLCJvbkRvd25sb2FkU3RhcnQiKTsKK3ZhciBzZWxmPXRoaXM7Citkb2pvLmlvLmJpbmQoe3VybDp1cmwsdXNlQ2FjaGU6X2JkYixwcmV2ZW50Q2FjaGU6IV9iZGIsbWltZXR5cGU6InRleHQvaHRtbCIsZm9ybU5vZGU6ZG9qby5ieUlkKHNlbGYuZm9ybUlkKSxmb3JtRmlsdGVyOndpbmRvd1tzZWxmLmZvcm1GaWx0ZXJdLHRyYW5zcG9ydDpzZWxmLnRyYW5zcG9ydCxoYW5kbGVyOmZ1bmN0aW9uKHR5cGUsZGF0YSxlKXsKK2Rvam8uaHRtbC5oaWRlKHNlbGYuaW5kaWNhdG9yKTsKK3NlbGYubm90aWZ5KGRhdGEsdHlwZSxlKTsKK2lmKHR5cGU9PSJsb2FkIil7CitzZWxmLm9uRG93bmxvYWRFbmQuY2FsbChzZWxmLHVybCxkYXRhKTsKK3NlbGYuaGlnaGxpZ2h0KCk7Cit9ZWxzZXsKK3NlbGYuX2hhbmRsZURlZmF1bHRzLmNhbGwoc2VsZiwiRXJyb3IgbG9hZGluZyAnIit1cmwrIicgKCIrZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dCsiKSIsIm9uRG93bmxvYWRFcnJvciIpOworc2VsZi5vbkxvYWQoKTsKK30KK319KTsKK30sbG9nOmZ1bmN0aW9uKHRleHQpeworZG9qby5kZWJ1ZygiWyIrdGhpcy53aWRnZXRJZCsiXSAiK3RleHQpOworfSxzdG9wVGltZXI6ZnVuY3Rpb24oKXsKK2lmKHRoaXMudGltZXImJnRoaXMudGltZXIuaXNSdW5uaW5nKXsKK3RoaXMubG9nKCJzdG9wcGluZyB0aW1lciIpOwordGhpcy50aW1lci5zdG9wKCk7Cit9Cit9LHN0YXJ0VGltZXI6ZnVuY3Rpb24oKXsKK2lmKHRoaXMudGltZXImJiF0aGlzLnRpbWVyLmlzUnVubmluZyl7Cit0aGlzLmxvZygic3RhcnRpbmcgdGltZXIgd2l0aCB1cGRhdGUgaW50ZXJ2YWwgIit0aGlzLnVwZGF0ZUZyZXEpOwordGhpcy50aW1lci5zdGFydCgpOworfQorfSxzcGxpdEFuZEZpeFBhdGhzOmZ1bmN0aW9uKHMsdXJsKXsKK3ZhciBfYmU0PVtdLF9iZTU9W10sdG1wPVtdOwordmFyIF9iZTc9W10sX2JlOD1bXSxhdHRyPVtdLF9iZWE9W107Cit2YXIgc3RyPSIiLHBhdGg9IiIsZml4PSIiLF9iZWU9IiIsdGFnPSIiLF9iZjA9IiI7CitpZighdXJsKXsKK3VybD0iLi8iOworfQoraWYocyl7Cit2YXIgX2JmMT0vPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOword2hpbGUoX2JlNz1fYmYxLmV4ZWMocykpeworX2JlNC5wdXNoKF9iZTdbMV0pOworcz1zLnN1YnN0cmluZygwLF9iZTcuaW5kZXgpK3Muc3Vic3RyKF9iZTcuaW5kZXgrX2JlN1swXS5sZW5ndGgpOworfQoraWYodGhpcy5hZGp1c3RQYXRocyl7Cit2YXIgX2JmMj0vPFthLXpdW2EtejAtOV0qW14+XSpccyg/Oig/OnNyY3xocmVmfHN0eWxlKT1bXj5dKStbXj5dKj4vaTsKK3ZhciBfYmYzPS9ccyhzcmN8aHJlZnxzdHlsZSk9KFsnIl0/KShbXHcoKVxbXF1cLy4sXFwnIi06OyM9Jj9cc0AhXSs/KVwyL2k7Cit2YXIgX2JmND0vXig/OlsjXXwoPzooPzpodHRwcz98ZnRwcz98ZmlsZXxqYXZhc2NyaXB0fG1haWx0b3xuZXdzKTopKS87Cit3aGlsZSh0YWc9X2JmMi5leGVjKHMpKXsKK3N0cis9cy5zdWJzdHJpbmcoMCx0YWcuaW5kZXgpOworcz1zLnN1YnN0cmluZygodGFnLmluZGV4K3RhZ1swXS5sZW5ndGgpLHMubGVuZ3RoKTsKK3RhZz10YWdbMF07CitfYmVlPSIiOword2hpbGUoYXR0cj1fYmYzLmV4ZWModGFnKSl7CitwYXRoPSIiOworX2JmMD1hdHRyWzNdOworc3dpdGNoKGF0dHJbMV0udG9Mb3dlckNhc2UoKSl7CitjYXNlICJzcmMiOgorY2FzZSAiaHJlZiI6CitpZihfYmY0LmV4ZWMoX2JmMCkpeworcGF0aD1fYmYwOworfWVsc2V7CitwYXRoPShuZXcgZG9qby51cmkuVXJpKHVybCxfYmYwKS50b1N0cmluZygpKTsKK30KK2JyZWFrOworY2FzZSAic3R5bGUiOgorcGF0aD1kb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQoX2JmMCx1cmwpOworYnJlYWs7CitkZWZhdWx0OgorcGF0aD1fYmYwOworfQorZml4PSIgIithdHRyWzFdKyI9IithdHRyWzJdK3BhdGgrYXR0clsyXTsKK19iZWUrPXRhZy5zdWJzdHJpbmcoMCxhdHRyLmluZGV4KStmaXg7Cit0YWc9dGFnLnN1YnN0cmluZygoYXR0ci5pbmRleCthdHRyWzBdLmxlbmd0aCksdGFnLmxlbmd0aCk7Cit9CitzdHIrPV9iZWUrdGFnOworfQorcz1zdHIrczsKK30KK19iZjE9Lyg/Ojwoc3R5bGUpW14+XSo+KFtcc1xTXSo/KTxcL3N0eWxlPnw8bGluayAoW14+XSpyZWw9WyciXT9zdHlsZXNoZWV0WyciXT9bXj5dKik+KS9pOword2hpbGUoX2JlNz1fYmYxLmV4ZWMocykpeworaWYoX2JlN1sxXSYmX2JlN1sxXS50b0xvd2VyQ2FzZSgpPT0ic3R5bGUiKXsKK19iZWEucHVzaChkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQoX2JlN1syXSx1cmwpKTsKK31lbHNleworaWYoYXR0cj1fYmU3WzNdLm1hdGNoKC9ocmVmPShbJyJdPykoW14nIj5dKilcMS9pKSl7CitfYmVhLnB1c2goe3BhdGg6YXR0clsyXX0pOworfQorfQorcz1zLnN1YnN0cmluZygwLF9iZTcuaW5kZXgpK3Muc3Vic3RyKF9iZTcuaW5kZXgrX2JlN1swXS5sZW5ndGgpOworfQordmFyIF9iZjE9LzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2k7Cit2YXIgX2JmNT0vc3JjPShbJyJdPykoW14iJ10qKVwxL2k7Cit2YXIgX2JmNj0vLiooXGJkb2pvXGJcLmpzKD86XC51bmNvbXByZXNzZWRcLmpzKT8pJC87Cit2YXIgX2JmNz0vKD86dmFyICk/XGJkakNvbmZpZ1xiKD86W1xzXSo9W1xzXSpce1tefV0rXH18XC5bXHddKltcc10qPVtcc10qW147XG5dKik/Oz98ZG9qb1wuaG9zdGVudlwud3JpdGVJbmNsdWRlc1woXHMqXCk7Py9nOwordmFyIF9iZjg9L2Rvam9cLig/Oig/OnJlcXVpcmUoPzpBZnRlcik/KD86SWYpPyl8KD86d2lkZ2V0XC4oPzptYW5hZ2VyXC4pP3JlZ2lzdGVyV2lkZ2V0UGFja2FnZSl8KD86KD86aG9zdGVudlwuKT9zZXRNb2R1bGVQcmVmaXh8cmVnaXN0ZXJNb2R1bGVQYXRoKXxkZWZpbmVOYW1lc3BhY2UpXCgoWyciXSkuKj9cMVwpXHMqOz8vOword2hpbGUoX2JlNz1fYmYxLmV4ZWMocykpeworaWYodGhpcy5leGVjdXRlU2NyaXB0cyYmX2JlN1sxXSl7CitpZihhdHRyPV9iZjUuZXhlYyhfYmU3WzFdKSl7CitpZihfYmY2LmV4ZWMoYXR0clsyXSkpeworZG9qby5kZWJ1ZygiU2VjdXJpdHkgbm90ZSEgaW5oaWJpdDoiK2F0dHJbMl0rIiBmcm9tICBiZWluZyBsb2FkZWQgYWdhaW4uIik7Cit9ZWxzZXsKK19iZTUucHVzaCh7cGF0aDphdHRyWzJdfSk7Cit9Cit9Cit9CitpZihfYmU3WzJdKXsKK3ZhciBzYz1fYmU3WzJdLnJlcGxhY2UoX2JmNywiIik7CitpZighc2MpeworY29udGludWU7Cit9Cit3aGlsZSh0bXA9X2JmOC5leGVjKHNjKSl7CitfYmU4LnB1c2godG1wWzBdKTsKK3NjPXNjLnN1YnN0cmluZygwLHRtcC5pbmRleCkrc2Muc3Vic3RyKHRtcC5pbmRleCt0bXBbMF0ubGVuZ3RoKTsKK30KK2lmKHRoaXMuZXhlY3V0ZVNjcmlwdHMpeworX2JlNS5wdXNoKHNjKTsKK30KK30KK3M9cy5zdWJzdHIoMCxfYmU3LmluZGV4KStzLnN1YnN0cihfYmU3LmluZGV4K19iZTdbMF0ubGVuZ3RoKTsKK30KK2lmKHRoaXMuZXh0cmFjdENvbnRlbnQpeworX2JlNz1zLm1hdGNoKC88Ym9keVtePl0qPlxzKihbXHNcU10rKVxzKjxcL2JvZHk+L2ltKTsKK2lmKF9iZTcpeworcz1fYmU3WzFdOworfQorfQoraWYodGhpcy5leGVjdXRlU2NyaXB0cyYmdGhpcy5zY3JpcHRTZXBhcmF0aW9uKXsKK3ZhciBfYmYxPS8oPFthLXpBLVpdW2EtekEtWjAtOV0qXHNbXj5dKj9cUz0pKChbJyJdKVtePl0qc2NyaXB0U2NvcGVbXj5dKj4pLzsKK3ZhciBfYmZhPS8oW1xzJyI7OlwoXSlzY3JpcHRTY29wZSguKikvOworc3RyPSIiOword2hpbGUodGFnPV9iZjEuZXhlYyhzKSl7Cit0bXA9KCh0YWdbM109PSInIik/IlwiIjoiJyIpOworZml4PSIiOworc3RyKz1zLnN1YnN0cmluZygwLHRhZy5pbmRleCkrdGFnWzFdOword2hpbGUoYXR0cj1fYmZhLmV4ZWModGFnWzJdKSl7Cit0YWdbMl09dGFnWzJdLnN1YnN0cmluZygwLGF0dHIuaW5kZXgpK2F0dHJbMV0rImRvam8ud2lkZ2V0LmJ5SWQoIit0bXArdGhpcy53aWRnZXRJZCt0bXArIikuc2NyaXB0U2NvcGUiK2F0dHJbMl07Cit9CitzdHIrPXRhZ1syXTsKK3M9cy5zdWJzdHIodGFnLmluZGV4K3RhZ1swXS5sZW5ndGgpOworfQorcz1zdHIrczsKK30KK30KK3JldHVybiB7InhtbCI6cywic3R5bGVzIjpfYmVhLCJ0aXRsZXMiOl9iZTQsInJlcXVpcmVzIjpfYmU4LCJzY3JpcHRzIjpfYmU1LCJ1cmwiOnVybH07Cit9fSk7Citkb2pvLnByb3ZpZGUoInN0cnV0cy53aWRnZXQuQmluZEFuY2hvciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJzdHJ1dHMud2lkZ2V0LkJpbmRBbmNob3IiLHN0cnV0cy53aWRnZXQuQmluZCx7d2lkZ2V0VHlwZToiQmluZEFuY2hvciIsZXZlbnRzOiJvbmNsaWNrIixwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7CitzdHJ1dHMud2lkZ2V0LkJpbmRBbmNob3Iuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMpOwordGhpcy5kb21Ob2RlLmhyZWY9IiMiOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5odG1sLnN0YWJpbGUiKTsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZT17X3NxUXVvdGFibGVzOm5ldyBSZWdFeHAoIihbXFxcXCddKSIsImciKSxfZGVwdGg6MCxfcmVjdXI6ZmFsc2UsZGVwdGhMaW1pdDoyfTsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5nZXRTdGF0ZT1mdW5jdGlvbihpZCl7Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0dXAoKTsKK3JldHVybiBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGVbaWRdOworfTsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5zZXRTdGF0ZT1mdW5jdGlvbihpZCxfYmZkLF9iZmUpeworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLnNldHVwKCk7Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGVbaWRdPV9iZmQ7CitpZihfYmZlKXsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5jb21taXQoZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlKTsKK30KK307Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0dXA9ZnVuY3Rpb24oKXsKK2lmKCFkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGUpewordmFyIHRleHQ9ZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9nZXRTdG9yYWdlKCkudmFsdWU7Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGU9dGV4dD9kal9ldmFsKCIoIit0ZXh0KyIpIik6e307Cit9Cit9OworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmNvbW1pdD1mdW5jdGlvbihfYzAwKXsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZ2V0U3RvcmFnZSgpLnZhbHVlPWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5kZXNjcmlwdGlvbihfYzAwKTsKK307Citkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVzY3JpcHRpb249ZnVuY3Rpb24odixfYzAyKXsKK3ZhciBfYzAzPWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGg7Cit2YXIgX2MwND1mdW5jdGlvbigpeworcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24odGhpcyx0cnVlKTsKK307Cit0cnl7CitpZih2PT09dm9pZCAoMCkpeworcmV0dXJuICJ1bmRlZmluZWQiOworfQoraWYodj09PW51bGwpeworcmV0dXJuICJudWxsIjsKK30KK2lmKHR5cGVvZiAodik9PSJib29sZWFuInx8dHlwZW9mICh2KT09Im51bWJlciJ8fHYgaW5zdGFuY2VvZiBCb29sZWFufHx2IGluc3RhbmNlb2YgTnVtYmVyKXsKK3JldHVybiB2LnRvU3RyaW5nKCk7Cit9CitpZih0eXBlb2YgKHYpPT0ic3RyaW5nInx8diBpbnN0YW5jZW9mIFN0cmluZyl7Cit2YXIgdjE9di5yZXBsYWNlKGRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fc3FRdW90YWJsZXMsIlxcJDEiKTsKK3YxPXYxLnJlcGxhY2UoL1xuL2csIlxcbiIpOwordjE9djEucmVwbGFjZSgvXHIvZywiXFxyIik7CityZXR1cm4gIiciK3YxKyInIjsKK30KK2lmKHYgaW5zdGFuY2VvZiBEYXRlKXsKK3JldHVybiAibmV3IERhdGUoIitkLmdldEZ1bGxZZWFyKyIsIitkLmdldE1vbnRoKCkrIiwiK2QuZ2V0RGF0ZSgpKyIpIjsKK30KK3ZhciBkOworaWYodiBpbnN0YW5jZW9mIEFycmF5fHx2LnB1c2gpeworaWYoX2MwMz49ZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRlcHRoTGltaXQpeworcmV0dXJuICJbIC4uLiBdIjsKK30KK2Q9IlsiOwordmFyIF9jMDc9dHJ1ZTsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGgrKzsKK2Zvcih2YXIgaT0wO2k8di5sZW5ndGg7aSsrKXsKK2lmKF9jMDcpeworX2MwNz1mYWxzZTsKK31lbHNleworZCs9IiwiOworfQorZCs9YXJndW1lbnRzLmNhbGxlZSh2W2ldLF9jMDIpOworfQorcmV0dXJuIGQrIl0iOworfQoraWYodi5jb25zdHJ1Y3Rvcj09T2JqZWN0fHx2LnRvU3RyaW5nPT1fYzA0KXsKK2lmKF9jMDM+PWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5kZXB0aExpbWl0KXsKK3JldHVybiAieyAuLi4gfSI7Cit9CitpZih0eXBlb2YgKHYuaGFzT3duUHJvcGVydHkpIT0iZnVuY3Rpb24iJiZ2LnByb3RvdHlwZSl7Cit0aHJvdyBuZXcgRXJyb3IoImRlc2NyaXB0aW9uOiAiK3YrIiBub3Qgc3VwcG9ydGVkIGJ5IHNjcmlwdCBlbmdpbmUiKTsKK30KK3ZhciBfYzA3PXRydWU7CitkPSJ7IjsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGgrKzsKK2Zvcih2YXIga2V5IGluIHYpeworaWYodltrZXldPT12b2lkICgwKXx8dHlwZW9mICh2W2tleV0pPT0iZnVuY3Rpb24iKXsKK2NvbnRpbnVlOworfQoraWYoX2MwNyl7CitfYzA3PWZhbHNlOworfWVsc2V7CitkKz0iLCAiOworfQordmFyIGtkPWtleTsKK2lmKCFrZC5tYXRjaCgvXlthLXpBLVpfXVthLXpBLVowLTlfXSokLykpewora2Q9YXJndW1lbnRzLmNhbGxlZShrZXksX2MwMik7Cit9CitkKz1rZCsiOiAiK2FyZ3VtZW50cy5jYWxsZWUodltrZXldLF9jMDIpOworfQorcmV0dXJuIGQrIn0iOworfQoraWYoX2MwMil7CitpZihkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX3JlY3VyKXsKK3ZhciBfYzBiPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CityZXR1cm4gX2MwYi5hcHBseSh2LFtdKTsKK31lbHNleworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9yZWN1cj10cnVlOworcmV0dXJuIHYudG9TdHJpbmcoKTsKK30KK31lbHNlewordGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIrdik7CityZXR1cm4gIid1bmtub3duJyI7Cit9Cit9CitmaW5hbGx5eworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9kZXB0aD1fYzAzOworfQorfTsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZ2V0U3RvcmFnZT1mdW5jdGlvbigpeworaWYoZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRhdGFGaWVsZCl7CityZXR1cm4gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRhdGFGaWVsZDsKK30KK3ZhciBmb3JtPWRvY3VtZW50LmZvcm1zLl9kb2pvX2Zvcm07CityZXR1cm4gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRhdGFGaWVsZD1mb3JtP2Zvcm0uc3RhYmlsZTp7dmFsdWU6IiJ9OworfTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQ29tYm9Cb3giKTsKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuaW5jcmVtZW50YWxDb21ib0JveERhdGFQcm92aWRlciIsbnVsbCxmdW5jdGlvbihfYzBkKXsKK3RoaXMuc2VhcmNoVXJsPV9jMGQuZGF0YVVybDsKK3RoaXMuX2NhY2hlPXt9OwordGhpcy5faW5GbGlnaHQ9ZmFsc2U7Cit0aGlzLl9sYXN0UmVxdWVzdD1udWxsOwordGhpcy5hbGxvd0NhY2hlPWZhbHNlOworfSx7X2FkZFRvQ2FjaGU6ZnVuY3Rpb24oX2MwZSxkYXRhKXsKK2lmKHRoaXMuYWxsb3dDYWNoZSl7Cit0aGlzLl9jYWNoZVtfYzBlXT1kYXRhOworfQorfSxzdGFydFNlYXJjaDpmdW5jdGlvbihfYzEwLF9jMTEpeworaWYodGhpcy5faW5GbGlnaHQpeworfQordmFyIHRzcz1lbmNvZGVVUklDb21wb25lbnQoX2MxMCk7Cit2YXIgX2MxMz1kb2pvLnN0cmluZy5zdWJzdGl0dXRlUGFyYW1zKHRoaXMuc2VhcmNoVXJsLHsic2VhcmNoU3RyaW5nIjp0c3N9KTsKK3ZhciBfYzE0PXRoaXM7Cit2YXIgX2MxNT10aGlzLl9sYXN0UmVxdWVzdD1kb2pvLmlvLmJpbmQoe3VybDpfYzEzLG1ldGhvZDoiZ2V0IixtaW1ldHlwZToidGV4dC9qc29uIixsb2FkOmZ1bmN0aW9uKHR5cGUsZGF0YSxldnQpeworX2MxNC5faW5GbGlnaHQ9ZmFsc2U7CitpZighZG9qby5sYW5nLmlzQXJyYXkoZGF0YSkpewordmFyIF9jMTk9W107Citmb3IodmFyIGtleSBpbiBkYXRhKXsKK19jMTkucHVzaChbZGF0YVtrZXldLGtleV0pOworfQorZGF0YT1fYzE5OworfQorX2MxNC5fYWRkVG9DYWNoZShfYzEwLGRhdGEpOworaWYoX2MxNT09X2MxNC5fbGFzdFJlcXVlc3QpeworX2MxMShkYXRhKTsKK30KK319KTsKK3RoaXMuX2luRmxpZ2h0PXRydWU7Cit9fSk7Citkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LmJhc2ljQ29tYm9Cb3hEYXRhUHJvdmlkZXIiLG51bGwsZnVuY3Rpb24oX2MxYixub2RlKXsKK3RoaXMuX2RhdGE9W107Cit0aGlzLnNlYXJjaExpbWl0PTMwOwordGhpcy5zZWFyY2hUeXBlPSJTVEFSVFNUUklORyI7Cit0aGlzLmNhc2VTZW5zaXRpdmU9ZmFsc2U7CitpZighZGpfdW5kZWYoImRhdGFVcmwiLF9jMWIpJiYhZG9qby5zdHJpbmcuaXNCbGFuayhfYzFiLmRhdGFVcmwpKXsKK3RoaXMuX2dldERhdGEoX2MxYi5kYXRhVXJsKTsKK31lbHNleworaWYoKG5vZGUpJiYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT0ic2VsZWN0IikpewordmFyIG9wdHM9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIik7Cit2YXIgb2w9b3B0cy5sZW5ndGg7Cit2YXIgZGF0YT1bXTsKK2Zvcih2YXIgeD0wO3g8b2w7eCsrKXsKK3ZhciB0ZXh0PW9wdHNbeF0udGV4dENvbnRlbnR8fG9wdHNbeF0uaW5uZXJUZXh0fHxvcHRzW3hdLmlubmVySFRNTDsKK3ZhciBfYzIyPVtTdHJpbmcodGV4dCksU3RyaW5nKG9wdHNbeF0udmFsdWUpXTsKK2RhdGEucHVzaChfYzIyKTsKK2lmKG9wdHNbeF0uc2VsZWN0ZWQpeworX2MxYi5zZXRBbGxWYWx1ZXMoX2MyMlswXSxfYzIyWzFdKTsKK30KK30KK3RoaXMuc2V0RGF0YShkYXRhKTsKK30KK30KK30se19nZXREYXRhOmZ1bmN0aW9uKHVybCl7Citkb2pvLmlvLmJpbmQoe3VybDp1cmwsbG9hZDpkb2pvLmxhbmcuaGl0Y2godGhpcyxmdW5jdGlvbih0eXBlLGRhdGEsZXZ0KXsKK2lmKCFkb2pvLmxhbmcuaXNBcnJheShkYXRhKSl7Cit2YXIgX2MyNz1bXTsKK2Zvcih2YXIga2V5IGluIGRhdGEpeworX2MyNy5wdXNoKFtkYXRhW2tleV0sa2V5XSk7Cit9CitkYXRhPV9jMjc7Cit9Cit0aGlzLnNldERhdGEoZGF0YSk7Cit9KSxtaW1ldHlwZToidGV4dC9qc29uIn0pOworfSxzdGFydFNlYXJjaDpmdW5jdGlvbihfYzI5LF9jMmEpewordGhpcy5fcGVyZm9ybVNlYXJjaChfYzI5LF9jMmEpOworfSxfcGVyZm9ybVNlYXJjaDpmdW5jdGlvbihfYzJiLF9jMmMpewordmFyIHN0PXRoaXMuc2VhcmNoVHlwZTsKK3ZhciByZXQ9W107CitpZighdGhpcy5jYXNlU2Vuc2l0aXZlKXsKK19jMmI9X2MyYi50b0xvd2VyQ2FzZSgpOworfQorZm9yKHZhciB4PTA7eDx0aGlzLl9kYXRhLmxlbmd0aDt4KyspeworaWYoKHRoaXMuc2VhcmNoTGltaXQ+MCkmJihyZXQubGVuZ3RoPj10aGlzLnNlYXJjaExpbWl0KSl7CiticmVhazsKK30KK3ZhciBfYzMwPW5ldyBTdHJpbmcoKCF0aGlzLmNhc2VTZW5zaXRpdmUpP3RoaXMuX2RhdGFbeF1bMF0udG9Mb3dlckNhc2UoKTp0aGlzLl9kYXRhW3hdWzBdKTsKK2lmKF9jMzAubGVuZ3RoPF9jMmIubGVuZ3RoKXsKK2NvbnRpbnVlOworfQoraWYoc3Q9PSJTVEFSVFNUUklORyIpeworaWYoX2MyYj09X2MzMC5zdWJzdHIoMCxfYzJiLmxlbmd0aCkpeworcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7Cit9Cit9ZWxzZXsKK2lmKHN0PT0iU1VCU1RSSU5HIil7CitpZihfYzMwLmluZGV4T2YoX2MyYik+PTApeworcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7Cit9Cit9ZWxzZXsKK2lmKHN0PT0iU1RBUlRXT1JEIil7Cit2YXIgaWR4PV9jMzAuaW5kZXhPZihfYzJiKTsKK2lmKGlkeD09MCl7CityZXQucHVzaCh0aGlzLl9kYXRhW3hdKTsKK30KK2lmKGlkeDw9MCl7Citjb250aW51ZTsKK30KK3ZhciBfYzMyPWZhbHNlOword2hpbGUoaWR4IT0tMSl7CitpZigiICwvKCIuaW5kZXhPZihfYzMwLmNoYXJBdChpZHgtMSkpIT0tMSl7CitfYzMyPXRydWU7CiticmVhazsKK30KK2lkeD1fYzMwLmluZGV4T2YoX2MyYixpZHgrMSk7Cit9CitpZighX2MzMil7Citjb250aW51ZTsKK31lbHNleworcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7Cit9Cit9Cit9Cit9Cit9CitfYzJjKHJldCk7Cit9LHNldERhdGE6ZnVuY3Rpb24oX2MzMyl7Cit0aGlzLl9kYXRhPV9jMzM7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkNvbWJvQm94Iixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LHtmb3JjZVZhbGlkT3B0aW9uOmZhbHNlLHNlYXJjaFR5cGU6InN0cmluZ3N0YXJ0IixkYXRhUHJvdmlkZXI6bnVsbCxhdXRvQ29tcGxldGU6dHJ1ZSxzZWFyY2hEZWxheToxMDAsZGF0YVVybDoiIixmYWRlVGltZToyMDAsbWF4TGlzdExlbmd0aDo4LG1vZGU6ImxvY2FsIixzZWxlY3RlZFJlc3VsdDpudWxsLGRhdGFQcm92aWRlckNsYXNzOiIiLGJ1dHRvblNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy9jb21ib19ib3hfYXJyb3cucG5nIiksZHJvcGRvd25Ub2dnbGU6ImZhZGUiLHRlbXBsYXRlU3RyaW5nOiI8c3BhbiBfPVwid2hpdGVzcGFjZSBhbmQgQ1IncyBiZXR3ZWVuIHRhZ3MgYWRkcyAmbmJzcDsgaW4gRkZcIlxyXG5cdGNsYXNzPVwiZG9qb0NvbWJvQm94T3V0ZXJcIlxyXG5cdD48aW5wdXQgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIiAgdGFiaW5kZXg9XCItMVwiIG5hbWU9XCJcIiB2YWx1ZT1cIlwiIFxyXG5cdFx0ZG9qb0F0dGFjaFBvaW50PVwiY29tYm9Cb3hWYWx1ZVwiXHJcblx0PjxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZVwiICB0YWJpbmRleD1cIi0xXCIgbmFtZT1cIlwiIHZhbHVlPVwiXCIgXHJcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJjb21ib0JveFNlbGVjdGlvblZhbHVlXCJcclxuXHQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJkb2pvQ29tYm9Cb3hcIlxyXG5cdFx0ZG9qb0F0dGFjaEV2ZW50PVwia2V5Ol9oYW5kbGVLZXlFdmVudHM7IGtleVVwOiBvbktleVVwOyBjb21wb3NpdGlvbkVuZDsgb25SZXNpemU7XCJcclxuXHRcdGRvam9BdHRhY2hQb2ludD1cInRleHRJbnB1dE5vZGVcIlxyXG5cdD48aW1nIGhzcGFjZT1cIjBcIlxyXG5cdFx0dnNwYWNlPVwiMFwiXHJcblx0XHRjbGFzcz1cImRvam9Db21ib0JveFwiXHJcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkb3duQXJyb3dOb2RlXCJcclxuXHRcdGRvam9BdHRhY2hFdmVudD1cIm9uTW91c2VVcDogaGFuZGxlQXJyb3dDbGljazsgb25SZXNpemU7XCJcclxuXHRcdHNyYz1cIiR7dGhpcy5idXR0b25TcmN9XCJcclxuPjwvc3Bhbj5cclxuIix0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9Db21ib0JveE91dGVyIHtcclxuXHRib3JkZXI6IDBweCAhaW1wb3J0YW50O1xyXG5cdG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcclxuXHR3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3gge1xyXG5cdGJvcmRlcjogMXB4IGluc2V0ICNhZmFmYWY7XHJcblx0bWFyZ2luOiAwcHg7XHJcblx0cGFkZGluZzogMHB4O1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgIWltcG9ydGFudDtcclxuXHRmbG9hdDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuXHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogdGhlIGlucHV0IGJveCAqL1xyXG5pbnB1dC5kb2pvQ29tYm9Cb3gge1xyXG5cdGJvcmRlci1yaWdodC13aWR0aDogMHB4ICFpbXBvcnRhbnQ7IFxyXG5cdG1hcmdpbi1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIHRoZSBkb3duIGFycm93ICovXHJcbmltZy5kb2pvQ29tYm9Cb3gge1xyXG5cdGJvcmRlci1sZWZ0LXdpZHRoOiAwcHggIWltcG9ydGFudDtcclxuXHRwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50O1xyXG5cdG1hcmdpbi1sZWZ0OiAwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogSUUgdmVydGljYWwtYWxpZ25tZW50IGNhbGN1bGF0aW9ucyBjYW4gYmUgb2ZmIGJ5ICstMSBidXQgdGhlc2UgbWFyZ2lucyBhcmUgY29sbGFwc2VkIGF3YXkgKi9cclxuLmRqX2llIGltZy5kb2pvQ29tYm9Cb3gge1xyXG5cdG1hcmdpbi10b3A6IDFweDsgXHJcblx0bWFyZ2luLWJvdHRvbTogMXB4OyBcclxufVxyXG5cclxuLyogdGhlIGRyb3AgZG93biAqL1xyXG4uZG9qb0NvbWJvQm94T3B0aW9ucyB7XHJcblx0Zm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgR2FyYW1vbmQsIHNhbnMtc2VyaWY7XHJcblx0LyogZm9udC1zaXplOiAwLjdlbTsgKi9cclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuXHRib3JkZXI6IDFweCBzb2xpZCAjYWZhZmFmO1xyXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHR6LWluZGV4OiAxMDAwOyBcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtIHtcclxuXHRwYWRkaW5nLWxlZnQ6IDJweDtcclxuXHRwYWRkaW5nLXRvcDogMnB4O1xyXG5cdG1hcmdpbjogMHB4O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbUV2ZW4ge1xyXG5cdGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtT2RkIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRvam9Db21ib0JveEl0ZW1IaWdobGlnaHQge1xyXG5cdGJhY2tncm91bmQtY29sb3I6ICM2MzcwOUE7XHJcblx0Y29sb3I6IHdoaXRlO1xyXG59XHJcbiIsdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvQ29tYm9Cb3guY3NzIiksc2V0VmFsdWU6ZnVuY3Rpb24oX2MzNCl7Cit0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU9X2MzNDsKK2lmKHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSE9X2MzNCl7Cit0aGlzLnRleHRJbnB1dE5vZGUudmFsdWU9X2MzNDsKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5zZXRTdGF0ZSh0aGlzLndpZGdldElkLHRoaXMuZ2V0U3RhdGUoKSx0cnVlKTsKK3RoaXMub25WYWx1ZUNoYW5nZWQoX2MzNCk7Cit9Cit9LG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKF9jMzUpeworfSxnZXRWYWx1ZTpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMuY29tYm9Cb3hWYWx1ZS52YWx1ZTsKK30sZ2V0U3RhdGU6ZnVuY3Rpb24oKXsKK3JldHVybiB7dmFsdWU6dGhpcy5nZXRWYWx1ZSgpfTsKK30sc2V0U3RhdGU6ZnVuY3Rpb24oX2MzNil7Cit0aGlzLnNldFZhbHVlKF9jMzYudmFsdWUpOworfSxlbmFibGU6ZnVuY3Rpb24oKXsKK3RoaXMuZGlzYWJsZWQ9ZmFsc2U7Cit0aGlzLnRleHRJbnB1dE5vZGUucmVtb3ZlQXR0cmlidXRlKCJkaXNhYmxlZCIpOworfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Cit0aGlzLmRpc2FibGVkPXRydWU7Cit0aGlzLnRleHRJbnB1dE5vZGUuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsdHJ1ZSk7Cit9LF9nZXRDYXJldFBvczpmdW5jdGlvbihfYzM3KXsKK2lmKGRvam8ubGFuZy5pc051bWJlcihfYzM3LnNlbGVjdGlvblN0YXJ0KSl7CityZXR1cm4gX2MzNy5zZWxlY3Rpb25TdGFydDsKK31lbHNleworaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7Cit2YXIgdHI9ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuZHVwbGljYXRlKCk7Cit2YXIgbnRyPV9jMzcuY3JlYXRlVGV4dFJhbmdlKCk7Cit0ci5tb3ZlKCJjaGFyYWN0ZXIiLDApOworbnRyLm1vdmUoImNoYXJhY3RlciIsMCk7Cit0cnl7CitudHIuc2V0RW5kUG9pbnQoIkVuZFRvRW5kIix0cik7CityZXR1cm4gU3RyaW5nKG50ci50ZXh0KS5yZXBsYWNlKC9cci9nLCIiKS5sZW5ndGg7Cit9CitjYXRjaChlKXsKK3JldHVybiAwOworfQorfQorfQorfSxfc2V0Q2FyZXRQb3M6ZnVuY3Rpb24oX2MzYSxfYzNiKXsKK19jM2I9cGFyc2VJbnQoX2MzYik7Cit0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKF9jM2EsX2MzYixfYzNiKTsKK30sX3NldFNlbGVjdGVkUmFuZ2U6ZnVuY3Rpb24oX2MzYyxfYzNkLGVuZCl7CitpZighZW5kKXsKK2VuZD1fYzNjLnZhbHVlLmxlbmd0aDsKK30KK2lmKF9jM2Muc2V0U2VsZWN0aW9uUmFuZ2UpeworX2MzYy5mb2N1cygpOworX2MzYy5zZXRTZWxlY3Rpb25SYW5nZShfYzNkLGVuZCk7Cit9ZWxzZXsKK2lmKF9jM2MuY3JlYXRlVGV4dFJhbmdlKXsKK3ZhciBfYzNmPV9jM2MuY3JlYXRlVGV4dFJhbmdlKCk7Cit3aXRoKF9jM2YpeworY29sbGFwc2UodHJ1ZSk7Cittb3ZlRW5kKCJjaGFyYWN0ZXIiLGVuZCk7Cittb3ZlU3RhcnQoImNoYXJhY3RlciIsX2MzZCk7CitzZWxlY3QoKTsKK30KK31lbHNleworX2MzYy52YWx1ZT1fYzNjLnZhbHVlOworX2MzYy5ibHVyKCk7CitfYzNjLmZvY3VzKCk7Cit2YXIgZGlzdD1wYXJzZUludChfYzNjLnZhbHVlLmxlbmd0aCktZW5kOwordmFyIF9jNDE9U3RyaW5nLmZyb21DaGFyQ29kZSgzNyk7Cit2YXIgdGNjPV9jNDEuY2hhckNvZGVBdCgwKTsKK2Zvcih2YXIgeD0wO3g8ZGlzdDt4KyspewordmFyIHRlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJLZXlFdmVudHMiKTsKK3RlLmluaXRLZXlFdmVudCgia2V5cHJlc3MiLHRydWUsdHJ1ZSxudWxsLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLHRjYyx0Y2MpOworX2MzYy5kaXNwYXRjaEV2ZW50KHRlKTsKK30KK30KK30KK30sX2hhbmRsZUtleUV2ZW50czpmdW5jdGlvbihldnQpeworaWYoZXZ0LmN0cmxLZXl8fGV2dC5hbHRLZXl8fCFldnQua2V5KXsKK3JldHVybjsKK30KK3RoaXMuX3ByZXZfa2V5X2JhY2tzcGFjZT1mYWxzZTsKK3RoaXMuX3ByZXZfa2V5X2VzYz1mYWxzZTsKK3ZhciBrPWRvam8uZXZlbnQuYnJvd3Nlci5rZXlzOwordmFyIF9jNDc9dHJ1ZTsKK3N3aXRjaChldnQua2V5KXsKK2Nhc2Ugay5LRVlfRE9XTl9BUlJPVzoKK2lmKCF0aGlzLnBvcHVwV2lkZ2V0LmlzU2hvd2luZ05vdyl7Cit0aGlzLl9zdGFydFNlYXJjaEZyb21JbnB1dCgpOworfQordGhpcy5faGlnaGxpZ2h0TmV4dE9wdGlvbigpOworZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworcmV0dXJuOworY2FzZSBrLktFWV9VUF9BUlJPVzoKK3RoaXMuX2hpZ2hsaWdodFByZXZPcHRpb24oKTsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK3JldHVybjsKK2Nhc2Ugay5LRVlfVEFCOgoraWYoIXRoaXMuYXV0b0NvbXBsZXRlJiZ0aGlzLnBvcHVwV2lkZ2V0LmlzU2hvd2luZ05vdyYmdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK3RoaXMuX3NlbGVjdE9wdGlvbih7InRhcmdldCI6dGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLCJub0hpZGUiOmZhbHNlfSk7Cit0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSx0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoLG51bGwpOworfWVsc2V7Cit0aGlzLl9zZWxlY3RPcHRpb24oKTsKK3JldHVybjsKK30KK2JyZWFrOworY2FzZSBrLktFWV9FTlRFUjoKK2lmKHRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK30KK2lmKHRoaXMuYXV0b0NvbXBsZXRlKXsKK3RoaXMuX3NlbGVjdE9wdGlvbigpOworcmV0dXJuOworfQorY2FzZSAiICI6CitpZih0aGlzLnBvcHVwV2lkZ2V0LmlzU2hvd2luZ05vdyYmdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKXsKK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK3RoaXMuX3NlbGVjdE9wdGlvbigpOwordGhpcy5faGlkZVJlc3VsdExpc3QoKTsKK3JldHVybjsKK30KK2JyZWFrOworY2FzZSBrLktFWV9FU0NBUEU6Cit0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOwordGhpcy5fcHJldl9rZXlfZXNjPXRydWU7CityZXR1cm47CitjYXNlIGsuS0VZX0JBQ0tTUEFDRToKK3RoaXMuX3ByZXZfa2V5X2JhY2tzcGFjZT10cnVlOworaWYoIXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpewordGhpcy5zZXRBbGxWYWx1ZXMoIiIsIiIpOwordGhpcy5faGlkZVJlc3VsdExpc3QoKTsKK19jNDc9ZmFsc2U7Cit9CiticmVhazsKK2Nhc2Ugay5LRVlfUklHSFRfQVJST1c6CitjYXNlIGsuS0VZX0xFRlRfQVJST1c6CitfYzQ3PWZhbHNlOworYnJlYWs7CitkZWZhdWx0OgoraWYoZXZ0LmNoYXJDb2RlPT0wKXsKK19jNDc9ZmFsc2U7Cit9Cit9CitpZih0aGlzLnNlYXJjaFRpbWVyKXsKK2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaFRpbWVyKTsKK30KK2lmKF9jNDcpewordGhpcy5fYmx1ck9wdGlvbk5vZGUoKTsKK3RoaXMuc2VhcmNoVGltZXI9c2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcyx0aGlzLl9zdGFydFNlYXJjaEZyb21JbnB1dCksdGhpcy5zZWFyY2hEZWxheSk7Cit9Cit9LGNvbXBvc2l0aW9uRW5kOmZ1bmN0aW9uKGV2dCl7CitldnQua2V5PWV2dC5rZXlDb2RlOwordGhpcy5faGFuZGxlS2V5RXZlbnRzKGV2dCk7Cit9LG9uS2V5VXA6ZnVuY3Rpb24oZXZ0KXsKK3RoaXMuc2V0VmFsdWUodGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlKTsKK30sc2V0U2VsZWN0ZWRWYWx1ZTpmdW5jdGlvbihfYzRhKXsKK3RoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS52YWx1ZT1fYzRhOworfSxzZXRBbGxWYWx1ZXM6ZnVuY3Rpb24oX2M0YixfYzRjKXsKK3RoaXMuc2V0U2VsZWN0ZWRWYWx1ZShfYzRjKTsKK3RoaXMuc2V0VmFsdWUoX2M0Yik7Cit9LF9mb2N1c09wdGlvbk5vZGU6ZnVuY3Rpb24obm9kZSl7CitpZih0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24hPW5vZGUpewordGhpcy5fYmx1ck9wdGlvbk5vZGUoKTsKK3RoaXMuX2hpZ2hsaWdodGVkX29wdGlvbj1ub2RlOworZG9qby5odG1sLmFkZENsYXNzKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiwiZG9qb0NvbWJvQm94SXRlbUhpZ2hsaWdodCIpOworfQorfSxfYmx1ck9wdGlvbk5vZGU6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbil7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLCJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7Cit0aGlzLl9oaWdobGlnaHRlZF9vcHRpb249bnVsbDsKK30KK30sX2hpZ2hsaWdodE5leHRPcHRpb246ZnVuY3Rpb24oKXsKK2lmKCghdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKXx8IXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wYXJlbnROb2RlKXsKK3RoaXMuX2ZvY3VzT3B0aW9uTm9kZSh0aGlzLm9wdGlvbnNMaXN0Tm9kZS5maXJzdENoaWxkKTsKK31lbHNleworaWYodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm5leHRTaWJsaW5nKXsKK3RoaXMuX2ZvY3VzT3B0aW9uTm9kZSh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24ubmV4dFNpYmxpbmcpOworfQorfQorZG9qby5odG1sLnNjcm9sbEludG9WaWV3KHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbik7Cit9LF9oaWdobGlnaHRQcmV2T3B0aW9uOmZ1bmN0aW9uKCl7CitpZih0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24mJnRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wcmV2aW91c1NpYmxpbmcpewordGhpcy5fZm9jdXNPcHRpb25Ob2RlKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wcmV2aW91c1NpYmxpbmcpOworfWVsc2V7Cit0aGlzLl9oaWdobGlnaHRlZF9vcHRpb249bnVsbDsKK3RoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CityZXR1cm47Cit9Citkb2pvLmh0bWwuc2Nyb2xsSW50b1ZpZXcodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKTsKK30sX2l0ZW1Nb3VzZU92ZXI6ZnVuY3Rpb24oZXZ0KXsKK2lmKGV2dC50YXJnZXQ9PT10aGlzLm9wdGlvbnNMaXN0Tm9kZSl7CityZXR1cm47Cit9Cit0aGlzLl9mb2N1c09wdGlvbk5vZGUoZXZ0LnRhcmdldCk7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLCJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7Cit9LF9pdGVtTW91c2VPdXQ6ZnVuY3Rpb24oZXZ0KXsKK2lmKGV2dC50YXJnZXQ9PT10aGlzLm9wdGlvbnNMaXN0Tm9kZSl7CityZXR1cm47Cit9Cit0aGlzLl9ibHVyT3B0aW9uTm9kZSgpOworfSxvblJlc2l6ZTpmdW5jdGlvbigpewordmFyIF9jNTA9ZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy50ZXh0SW5wdXROb2RlKTsKK2lmKF9jNTAuaGVpZ2h0PD0wKXsKK2Rvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsIm9uUmVzaXplIiwxMDApOworcmV0dXJuOworfQordmFyIF9jNTE9e3dpZHRoOl9jNTAuaGVpZ2h0LGhlaWdodDpfYzUwLmhlaWdodH07Citkb2pvLmh0bWwuc2V0Q29udGVudEJveCh0aGlzLmRvd25BcnJvd05vZGUsX2M1MSk7Cit9LGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKGFyZ3MsZnJhZyl7Citkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3ModGhpcy5kb21Ob2RlKTsKK3ZhciBfYzU0PXRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CitpZighdGhpcy5uYW1lJiZfYzU0Lm5hbWUpewordGhpcy5uYW1lPV9jNTQubmFtZTsKK30KK3RoaXMuY29tYm9Cb3hWYWx1ZS5uYW1lPXRoaXMubmFtZTsKK3RoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS5uYW1lPXRoaXMubmFtZSsiX3NlbGVjdGVkIjsKK2Rvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLF9jNTQpOworZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLnRleHRJbnB1dE5vZGUsX2M1NCk7Citkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG93bkFycm93Tm9kZSxfYzU0KTsKK3dpdGgodGhpcy5kb3duQXJyb3dOb2RlLnN0eWxlKXsKK3dpZHRoPSIwcHgiOworaGVpZ2h0PSIwcHgiOworfQordmFyIF9jNTU7CitpZih0aGlzLmRhdGFQcm92aWRlckNsYXNzKXsKK2lmKHR5cGVvZiB0aGlzLmRhdGFQcm92aWRlckNsYXNzPT0ic3RyaW5nIil7CitfYzU1PWRvam8uZXZhbE9ialBhdGgodGhpcy5kYXRhUHJvdmlkZXJDbGFzcyk7Cit9ZWxzZXsKK19jNTU9dGhpcy5kYXRhUHJvdmlkZXJDbGFzczsKK30KK31lbHNleworaWYodGhpcy5tb2RlPT0icmVtb3RlIil7CitfYzU1PWRvam8ud2lkZ2V0LmluY3JlbWVudGFsQ29tYm9Cb3hEYXRhUHJvdmlkZXI7Cit9ZWxzZXsKK19jNTU9ZG9qby53aWRnZXQuYmFzaWNDb21ib0JveERhdGFQcm92aWRlcjsKK30KK30KK3RoaXMuZGF0YVByb3ZpZGVyPW5ldyBfYzU1KHRoaXMsdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKSk7Cit0aGlzLnBvcHVwV2lkZ2V0PW5ldyBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlBvcHVwQ29udGFpbmVyIix7dG9nZ2xlOnRoaXMuZHJvcGRvd25Ub2dnbGUsdG9nZ2xlRHVyYXRpb246dGhpcy50b2dnbGVEdXJhdGlvbn0pOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMsImRlc3Ryb3kiLHRoaXMucG9wdXBXaWRnZXQsImRlc3Ryb3kiKTsKK3RoaXMub3B0aW9uc0xpc3ROb2RlPXRoaXMucG9wdXBXaWRnZXQuZG9tTm9kZTsKK3RoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSk7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zTGlzdE5vZGUsImRvam9Db21ib0JveE9wdGlvbnMiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSwib25jbGljayIsdGhpcywiX3NlbGVjdE9wdGlvbiIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMub3B0aW9uc0xpc3ROb2RlLCJvbm1vdXNlb3ZlciIsdGhpcywiX29uTW91c2VPdmVyIik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsIm9ubW91c2VvdXQiLHRoaXMsIl9vbk1vdXNlT3V0Iik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsIm9ubW91c2VvdmVyIix0aGlzLCJfaXRlbU1vdXNlT3ZlciIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMub3B0aW9uc0xpc3ROb2RlLCJvbm1vdXNlb3V0Iix0aGlzLCJfaXRlbU1vdXNlT3V0Iik7Cit9LF9vcGVuUmVzdWx0TGlzdDpmdW5jdGlvbihfYzU2KXsKK2lmKHRoaXMuZGlzYWJsZWQpeworcmV0dXJuOworfQordGhpcy5fY2xlYXJSZXN1bHRMaXN0KCk7CitpZighX2M1Ni5sZW5ndGgpewordGhpcy5faGlkZVJlc3VsdExpc3QoKTsKK30KK2lmKCh0aGlzLmF1dG9Db21wbGV0ZSkmJihfYzU2Lmxlbmd0aCkmJighdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlKSYmKHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGg+MCkpewordmFyIGNwb3M9dGhpcy5fZ2V0Q2FyZXRQb3ModGhpcy50ZXh0SW5wdXROb2RlKTsKK2lmKChjcG9zKzEpPnRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpewordGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlKz1fYzU2WzBdWzBdLnN1YnN0cihjcG9zKTsKK3RoaXMuX3NldFNlbGVjdGVkUmFuZ2UodGhpcy50ZXh0SW5wdXROb2RlLGNwb3MsdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCk7Cit9Cit9Cit2YXIgZXZlbj10cnVlOword2hpbGUoX2M1Ni5sZW5ndGgpewordmFyIHRyPV9jNTYuc2hpZnQoKTsKK2lmKHRyKXsKK3ZhciB0ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKK3RkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRyWzBdKSk7Cit0ZC5zZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiLHRyWzBdKTsKK3RkLnNldEF0dHJpYnV0ZSgicmVzdWx0VmFsdWUiLHRyWzFdKTsKK3RkLmNsYXNzTmFtZT0iZG9qb0NvbWJvQm94SXRlbSAiKygoZXZlbik/ImRvam9Db21ib0JveEl0ZW1FdmVuIjoiZG9qb0NvbWJvQm94SXRlbU9kZCIpOworZXZlbj0oIWV2ZW4pOwordGhpcy5vcHRpb25zTGlzdE5vZGUuYXBwZW5kQ2hpbGQodGQpOworfQorfQordGhpcy5fc2hvd1Jlc3VsdExpc3QoKTsKK30sX29uRm9jdXNJbnB1dDpmdW5jdGlvbigpewordGhpcy5faGFzRm9jdXM9dHJ1ZTsKK30sX29uQmx1cklucHV0OmZ1bmN0aW9uKCl7Cit0aGlzLl9oYXNGb2N1cz1mYWxzZTsKK3RoaXMuX2hhbmRsZUJsdXJUaW1lcih0cnVlLDUwMCk7Cit9LF9oYW5kbGVCbHVyVGltZXI6ZnVuY3Rpb24oX2M1YixfYzVjKXsKK2lmKHRoaXMuYmx1clRpbWVyJiYoX2M1Ynx8X2M1YykpeworY2xlYXJUaW1lb3V0KHRoaXMuYmx1clRpbWVyKTsKK30KK2lmKF9jNWMpewordGhpcy5ibHVyVGltZXI9ZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywiX2NoZWNrQmx1cnJlZCIsX2M1Yyk7Cit9Cit9LF9vbk1vdXNlT3ZlcjpmdW5jdGlvbihldnQpeworaWYoIXRoaXMuX21vdXNlb3Zlcl9saXN0KXsKK3RoaXMuX2hhbmRsZUJsdXJUaW1lcih0cnVlLDApOwordGhpcy5fbW91c2VvdmVyX2xpc3Q9dHJ1ZTsKK30KK30sX29uTW91c2VPdXQ6ZnVuY3Rpb24oZXZ0KXsKK3ZhciBfYzVmPWV2dC5yZWxhdGVkVGFyZ2V0OwordHJ5eworaWYoIV9jNWZ8fF9jNWYucGFyZW50Tm9kZSE9dGhpcy5vcHRpb25zTGlzdE5vZGUpewordGhpcy5fbW91c2VvdmVyX2xpc3Q9ZmFsc2U7Cit0aGlzLl9oYW5kbGVCbHVyVGltZXIodHJ1ZSwxMDApOwordGhpcy5fdHJ5Rm9jdXMoKTsKK30KK30KK2NhdGNoKGUpeworfQorfSxfaXNJbnB1dEVxdWFsVG9SZXN1bHQ6ZnVuY3Rpb24oX2M2MCl7Cit2YXIgX2M2MT10aGlzLnRleHRJbnB1dE5vZGUudmFsdWU7CitpZighdGhpcy5kYXRhUHJvdmlkZXIuY2FzZVNlbnNpdGl2ZSl7CitfYzYxPV9jNjEudG9Mb3dlckNhc2UoKTsKK19jNjA9X2M2MC50b0xvd2VyQ2FzZSgpOworfQorcmV0dXJuIChfYzYxPT1fYzYwKTsKK30sX2lzVmFsaWRPcHRpb246ZnVuY3Rpb24oKXsKK3ZhciB0Z3Q9ZG9qby5odG1sLmZpcnN0RWxlbWVudCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSk7Cit2YXIgX2M2Mz1mYWxzZTsKK3doaWxlKCFfYzYzJiZ0Z3QpeworaWYodGhpcy5faXNJbnB1dEVxdWFsVG9SZXN1bHQodGd0LmdldEF0dHJpYnV0ZSgicmVzdWx0TmFtZSIpKSl7CitfYzYzPXRydWU7Cit9ZWxzZXsKK3RndD1kb2pvLmh0bWwubmV4dEVsZW1lbnQodGd0KTsKK30KK30KK3JldHVybiBfYzYzOworfSxfY2hlY2tCbHVycmVkOmZ1bmN0aW9uKCl7CitpZighdGhpcy5faGFzRm9jdXMmJiF0aGlzLl9tb3VzZW92ZXJfbGlzdCl7Cit0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworaWYoIXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpewordGhpcy5zZXRBbGxWYWx1ZXMoIiIsIiIpOworcmV0dXJuOworfQordmFyIF9jNjQ9dGhpcy5faXNWYWxpZE9wdGlvbigpOworaWYodGhpcy5mb3JjZVZhbGlkT3B0aW9uJiYhX2M2NCl7Cit0aGlzLnNldEFsbFZhbHVlcygiIiwiIik7CityZXR1cm47Cit9CitpZighX2M2NCl7Cit0aGlzLnNldFNlbGVjdGVkVmFsdWUoIiIpOworfQorfQorfSxfc2VsZWN0T3B0aW9uOmZ1bmN0aW9uKGV2dCl7Cit2YXIgdGd0PW51bGw7CitpZighZXZ0KXsKK2V2dD17dGFyZ2V0OnRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbn07Cit9CitpZighZG9qby5odG1sLmlzRGVzY2VuZGFudE9mKGV2dC50YXJnZXQsdGhpcy5vcHRpb25zTGlzdE5vZGUpKXsKK2lmKCF0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKK3JldHVybjsKK30KK3RndD1kb2pvLmh0bWwuZmlyc3RFbGVtZW50KHRoaXMub3B0aW9uc0xpc3ROb2RlKTsKK2lmKCF0Z3R8fCF0aGlzLl9pc0lucHV0RXF1YWxUb1Jlc3VsdCh0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIikpKXsKK3JldHVybjsKK30KK31lbHNlewordGd0PWV2dC50YXJnZXQ7Cit9Cit3aGlsZSgodGd0Lm5vZGVUeXBlIT0xKXx8KCF0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIikpKXsKK3RndD10Z3QucGFyZW50Tm9kZTsKK2lmKHRndD09PWRvam8uYm9keSgpKXsKK3JldHVybiBmYWxzZTsKK30KK30KK3RoaXMuc2VsZWN0ZWRSZXN1bHQ9W3RndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSx0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIpXTsKK3RoaXMuc2V0QWxsVmFsdWVzKHRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSx0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIpKTsKK2lmKCFldnQubm9IaWRlKXsKK3RoaXMuX2hpZGVSZXN1bHRMaXN0KCk7Cit0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSwwLG51bGwpOworfQordGhpcy5fdHJ5Rm9jdXMoKTsKK30sX2NsZWFyUmVzdWx0TGlzdDpmdW5jdGlvbigpeworaWYodGhpcy5vcHRpb25zTGlzdE5vZGUuaW5uZXJIVE1MKXsKK3RoaXMub3B0aW9uc0xpc3ROb2RlLmlubmVySFRNTD0iIjsKK30KK30sX2hpZGVSZXN1bHRMaXN0OmZ1bmN0aW9uKCl7Cit0aGlzLnBvcHVwV2lkZ2V0LmNsb3NlKCk7Cit9LF9zaG93UmVzdWx0TGlzdDpmdW5jdGlvbigpewordmFyIF9jNjc9dGhpcy5vcHRpb25zTGlzdE5vZGUuY2hpbGROb2RlczsKK2lmKF9jNjcubGVuZ3RoKXsKK3ZhciBfYzY4PU1hdGgubWluKF9jNjcubGVuZ3RoLHRoaXMubWF4TGlzdExlbmd0aCk7Cit3aXRoKHRoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlKXsKK2Rpc3BsYXk9IiI7CitpZihfYzY4PT1fYzY3Lmxlbmd0aCl7CitoZWlnaHQ9IiI7Cit9ZWxzZXsKK2hlaWdodD1fYzY4KmRvam8uaHRtbC5nZXRNYXJnaW5Cb3goX2M2N1swXSkuaGVpZ2h0KyJweCI7Cit9Cit3aWR0aD0oZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpLndpZHRoLTIpKyJweCI7Cit9Cit0aGlzLnBvcHVwV2lkZ2V0Lm9wZW4odGhpcy5kb21Ob2RlLHRoaXMsdGhpcy5kb3duQXJyb3dOb2RlKTsKK31lbHNlewordGhpcy5faGlkZVJlc3VsdExpc3QoKTsKK30KK30saGFuZGxlQXJyb3dDbGljazpmdW5jdGlvbigpewordGhpcy5faGFuZGxlQmx1clRpbWVyKHRydWUsMCk7Cit0aGlzLl90cnlGb2N1cygpOworaWYodGhpcy5wb3B1cFdpZGdldC5pc1Nob3dpbmdOb3cpewordGhpcy5faGlkZVJlc3VsdExpc3QoKTsKK31lbHNlewordGhpcy5fc3RhcnRTZWFyY2goIiIpOworfQorfSxfdHJ5Rm9jdXM6ZnVuY3Rpb24oKXsKK3RyeXsKK3RoaXMudGV4dElucHV0Tm9kZS5mb2N1cygpOworfQorY2F0Y2goZSl7Cit9Cit9LF9zdGFydFNlYXJjaEZyb21JbnB1dDpmdW5jdGlvbigpewordGhpcy5fc3RhcnRTZWFyY2godGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlKTsKK30sX3N0YXJ0U2VhcmNoOmZ1bmN0aW9uKGtleSl7Cit0aGlzLmRhdGFQcm92aWRlci5zdGFydFNlYXJjaChrZXksZG9qby5sYW5nLmhpdGNoKHRoaXMsIl9vcGVuUmVzdWx0TGlzdCIpKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpewordGhpcy5vblJlc2l6ZSgpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMudGV4dElucHV0Tm9kZSwib25ibHVyIix0aGlzLCJfb25CbHVySW5wdXQiKTsKK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLnRleHRJbnB1dE5vZGUsIm9uZm9jdXMiLHRoaXMsIl9vbkZvY3VzSW5wdXQiKTsKK2lmKHRoaXMuZGlzYWJsZWQpewordGhpcy5kaXNhYmxlKCk7Cit9Cit2YXIgcz1kb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZ2V0U3RhdGUodGhpcy53aWRnZXRJZCk7CitpZihzKXsKK3RoaXMuc2V0U3RhdGUocyk7Cit9Cit9fSk7Citkb2pvLnByb3ZpZGUoInN0cnV0cy53aWRnZXQuQ29tYm9Cb3giKTsKK3N0cnV0cy53aWRnZXQuQ29tYm9Cb3hEYXRhUHJvdmlkZXI9ZnVuY3Rpb24oX2M2Yixub2RlKXsKK3RoaXMuZGF0YT1bXTsKK3RoaXMuc2VhcmNoTGltaXQ9X2M2Yi5zZWFyY2hMaW1pdDsKK3RoaXMuc2VhcmNoVHlwZT0iU1RBUlRTVFJJTkciOwordGhpcy5jYXNlU2Vuc2l0aXZlPWZhbHNlOwordGhpcy5fbGFzdFNlYXJjaD0iIjsKK3RoaXMuX2xhc3RTZWFyY2hSZXN1bHRzPW51bGw7Cit0aGlzLmZpcnN0UmVxdWVzdD10cnVlOwordGhpcy5jYm94PV9jNmI7Cit0aGlzLmZvcm1JZD10aGlzLmNib3guZm9ybUlkOwordGhpcy5mb3JtRmlsdGVyPXRoaXMuY2JveC5mb3JtRmlsdGVyOwordGhpcy50cmFuc3BvcnQ9dGhpcy5jYm94LnRyYW5zcG9ydDsKK3RoaXMuZ2V0RGF0YT1mdW5jdGlvbih1cmwpeworZG9qby5odG1sLnNob3codGhpcy5jYm94LmluZGljYXRvcik7Citkb2pvLmlvLmJpbmQoe3VybDp1cmwsZm9ybU5vZGU6ZG9qby5ieUlkKHRoaXMuZm9ybUlkKSxmb3JtRmlsdGVyOndpbmRvd1t0aGlzLmZvcm1GaWx0ZXJdLHRyYW5zcG9ydDp0aGlzLnRyYW5zcG9ydCxoYW5kbGVyOmRvam8ubGFuZy5oaXRjaCh0aGlzLGZ1bmN0aW9uKHR5cGUsZGF0YSxldnQpeworZG9qby5odG1sLmhpZGUodGhpcy5jYm94LmluZGljYXRvcik7CitpZighdGhpcy5maXJzdFJlcXVlc3R8fHR5cGU9PSJlcnJvciIpewordGhpcy5jYm94Lm5vdGlmeS5hcHBseSh0aGlzLmNib3gsW2RhdGEsdHlwZSxldnRdKTsKK30KK3RoaXMuZmlyc3RSZXF1ZXN0PWZhbHNlOwordmFyIF9jNzE9bnVsbDsKK3ZhciBfYzcyPWRhdGFbZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmNib3guZGF0YUZpZWxkTmFtZSk/dGhpcy5jYm94Lm5hbWU6dGhpcy5jYm94LmRhdGFGaWVsZE5hbWVdOworaWYoIWRvam8ubGFuZy5pc0FycmF5KGRhdGEpKXsKK2lmKF9jNzIpeworaWYoZG9qby5sYW5nLmlzQXJyYXkoX2M3MikpeworX2M3MT1fYzcyOworfWVsc2V7CitpZihkb2pvLmxhbmcuaXNPYmplY3QoX2M3MikpeworX2M3MT1bXTsKK2Zvcih2YXIga2V5IGluIF9jNzIpeworX2M3MS5wdXNoKFtrZXksX2M3MltrZXldXSk7Cit9Cit9Cit9Cit9ZWxzZXsKK3ZhciBfYzc0PVtdOworZm9yKHZhciBrZXkgaW4gZGF0YSl7CitpZihkb2pvLnN0cmluZy5zdGFydHNXaXRoKGtleSx0aGlzLmNib3gubmFtZSkpeworX2M3MT1kYXRhW2tleV07CiticmVhazsKK31lbHNleworX2M3NC5wdXNoKFtrZXksZGF0YVtrZXldXSk7Cit9CitpZighX2M3MSYmZG9qby5sYW5nLmlzQXJyYXkoZGF0YVtrZXldKSYmIWRvam8ubGFuZy5pc1N0cmluZyhkYXRhW2tleV0pKXsKK19jNzE9ZGF0YVtrZXldOworfQorfQoraWYoIV9jNzEpeworX2M3MT1fYzc0OworfQorfQorZGF0YT1fYzcxOworfQordGhpcy5zZXREYXRhKGRhdGEpOworfSksbWltZXR5cGU6InRleHQvanNvbiJ9KTsKK307Cit0aGlzLnN0YXJ0U2VhcmNoPWZ1bmN0aW9uKF9jNzUsX2M3Nil7Cit0aGlzLl9wcmVmb3JtU2VhcmNoKF9jNzUsX2M3Nik7Cit9OwordGhpcy5fcHJlZm9ybVNlYXJjaD1mdW5jdGlvbihfYzc3LF9jNzgpewordmFyIHN0PXRoaXMuc2VhcmNoVHlwZTsKK3ZhciByZXQ9W107CitpZighdGhpcy5jYXNlU2Vuc2l0aXZlKXsKK19jNzc9X2M3Ny50b0xvd2VyQ2FzZSgpOworfQorZm9yKHZhciB4PTA7eDx0aGlzLmRhdGEubGVuZ3RoO3grKyl7CitpZighdGhpcy5kYXRhW3hdfHwhdGhpcy5kYXRhW3hdWzBdKXsKK2NvbnRpbnVlOworfQoraWYoKHRoaXMuc2VhcmNoTGltaXQ+MCkmJihyZXQubGVuZ3RoPj10aGlzLnNlYXJjaExpbWl0KSl7CiticmVhazsKK30KK3ZhciBfYzdjPW5ldyBTdHJpbmcoKCF0aGlzLmNhc2VTZW5zaXRpdmUpP3RoaXMuZGF0YVt4XVswXS50b0xvd2VyQ2FzZSgpOnRoaXMuZGF0YVt4XVswXSk7CitpZihfYzdjLmxlbmd0aDxfYzc3Lmxlbmd0aCl7Citjb250aW51ZTsKK30KK2lmKHN0PT0iU1RBUlRTVFJJTkciKXsKK2lmKF9jNzc9PV9jN2Muc3Vic3RyKDAsX2M3Ny5sZW5ndGgpKXsKK3JldC5wdXNoKHRoaXMuZGF0YVt4XSk7Cit9Cit9ZWxzZXsKK2lmKHN0PT0iU1VCU1RSSU5HIil7CitpZihfYzdjLmluZGV4T2YoX2M3Nyk+PTApeworcmV0LnB1c2godGhpcy5kYXRhW3hdKTsKK30KK31lbHNleworaWYoc3Q9PSJTVEFSVFdPUkQiKXsKK3ZhciBpZHg9X2M3Yy5pbmRleE9mKF9jNzcpOworaWYoaWR4PT0wKXsKK3JldC5wdXNoKHRoaXMuZGF0YVt4XSk7Cit9CitpZihpZHg8PTApeworY29udGludWU7Cit9Cit2YXIgX2M3ZT1mYWxzZTsKK3doaWxlKGlkeCE9LTEpeworaWYoIiAsLygiLmluZGV4T2YoX2M3Yy5jaGFyQXQoaWR4LTEpKSE9LTEpeworX2M3ZT10cnVlOworYnJlYWs7Cit9CitpZHg9X2M3Yy5pbmRleE9mKF9jNzcsaWR4KzEpOworfQoraWYoIV9jN2UpeworY29udGludWU7Cit9ZWxzZXsKK3JldC5wdXNoKHRoaXMuZGF0YVt4XSk7Cit9Cit9Cit9Cit9Cit9CitfYzc4KHJldCk7Cit9OwordGhpcy5hZGREYXRhPWZ1bmN0aW9uKF9jN2YpewordGhpcy5kYXRhPXRoaXMuZGF0YS5jb25jYXQoX2M3Zik7Cit9OwordGhpcy5zZXREYXRhPWZ1bmN0aW9uKF9jODApewordGhpcy5kYXRhPV9jODA7Citmb3IodmFyIGk9MDtpPHRoaXMuZGF0YS5sZW5ndGg7aSsrKXsKK3ZhciBfYzgyPXRoaXMuZGF0YVtpXTsKK2lmKCFkb2pvLmxhbmcuaXNBcnJheShfYzgyKSl7Cit0aGlzLmRhdGFbaV09W19jODIsX2M4Ml07Cit9Cit9Cit9OworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5jYm94LmRhdGFVcmwpJiZ0aGlzLmNib3gucHJlbG9hZCl7Cit0aGlzLmdldERhdGEodGhpcy5jYm94LmRhdGFVcmwpOworfWVsc2V7CitpZigobm9kZSkmJihub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PSJzZWxlY3QiKSl7Cit2YXIgb3B0cz1ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcHRpb24iKTsKK3ZhciBvbD1vcHRzLmxlbmd0aDsKK3ZhciBkYXRhPVtdOworZm9yKHZhciB4PTA7eDxvbDt4KyspewordmFyIHRleHQ9b3B0c1t4XS50ZXh0Q29udGVudHx8b3B0c1t4XS5pbm5lclRleHR8fG9wdHNbeF0uaW5uZXJIVE1MOwordmFyIF9jODg9W1N0cmluZyh0ZXh0KSxTdHJpbmcob3B0c1t4XS52YWx1ZSldOworZGF0YS5wdXNoKF9jODgpOworaWYob3B0c1t4XS5zZWxlY3RlZCl7Cit0aGlzLmNib3guc2V0QWxsVmFsdWVzKF9jODhbMF0sX2M4OFsxXSk7Cit9Cit9Cit0aGlzLnNldERhdGEoZGF0YSk7Cit9Cit9Cit9OworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJzdHJ1dHMud2lkZ2V0LkNvbWJvQm94Iixkb2pvLndpZGdldC5Db21ib0JveCx7d2lkZ2V0VHlwZToiQ29tYm9Cb3giLGRyb3Bkb3duSGVpZ2h0OjEyMCxkcm9wZG93bldpZHRoOjAsaXRlbUhlaWdodDowLGxpc3RlblRvcGljczoiIixub3RpZnlUb3BpY3M6IiIsbm90aWZ5VG9waWNzQXJyYXk6bnVsbCxiZWZvcmVOb3RpZnlUb3BpY3M6IiIsYmVmb3JlTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxhZnRlck5vdGlmeVRvcGljczoiIixhZnRlck5vdGlmeVRvcGljc0FycmF5Om51bGwsZXJyb3JOb3RpZnlUb3BpY3M6IiIsZXJyb3JOb3RpZnlUb3BpY3NBcnJheTpudWxsLHZhbHVlTm90aWZ5VG9waWNzOiIiLHZhbHVlTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxpbmRpY2F0b3I6IiIsZm9ybUlkOiIiLGZvcm1GaWx0ZXI6IiIsZGF0YVByb3ZpZGVyQ2xhc3M6InN0cnV0cy53aWRnZXQuQ29tYm9Cb3hEYXRhUHJvdmlkZXIiLGxvYWRPblR5cGU6ZmFsc2UsbG9hZE1pbmltdW06Myxpbml0aWFsVmFsdWU6IiIsaW5pdGlhbEtleToiIix2aXNpYmxlRG93bkFycm93OnRydWUsZmFkZVRpbWU6MTAwLHNlYXJjaFR5cGU6IlNUQVJUU1RSSU5HIixkYXRhRmllbGROYW1lOiIiLGtleU5hbWU6IiIsdGVtcGxhdGVDc3NTdHJpbmc6bnVsbCx0ZW1wbGF0ZUNzc1N0cmluZzoiLypcclxuICogJElkJFxyXG4gKlxyXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXHJcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxyXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxyXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXHJcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcclxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXHJcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXHJcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXHJcbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxyXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXHJcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuXHJcbi5kb2pvQ29tYm9Cb3hPdXRlciB7XHJcblx0Ym9yZGVyOiAwcHggIWltcG9ydGFudDtcclxuXHRtYXJnaW46IDBweCAhaW1wb3J0YW50O1xyXG5cdHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXI6IDFweCBpbnNldCAjYWZhZmFmO1xyXG5cdG1hcmdpbjogMHB4O1xyXG5cdHBhZGRpbmc6IDBweDtcclxuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlICFpbXBvcnRhbnQ7XHJcblx0ZmxvYXQ6IG5vbmUgIWltcG9ydGFudDtcclxuXHRwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcblx0ZGlzcGxheTogaW5saW5lO1xyXG59XHJcblxyXG4vKiB0aGUgaW5wdXQgYm94ICovXHJcbmlucHV0LmRvam9Db21ib0JveCB7XHJcblx0Ym9yZGVyLXJpZ2h0LXdpZHRoOiAxcHggIWltcG9ydGFudDtcclxuXHRtYXJnaW4tcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xyXG5cdHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiB0aGUgZG93biBhcnJvdyAqL1xyXG5pbWcuZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXItbGVmdC13aWR0aDogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcclxuXHRtYXJnaW4tbGVmdDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIElFIHZlcnRpY2FsLWFsaWdubWVudCBjYWxjdWxhdGlvbnMgY2FuIGJlIG9mZiBieSArLTEgYnV0IHRoZXNlIG1hcmdpbnMgYXJlIGNvbGxhcHNlZCBhd2F5ICovXHJcbi5kal9pZSBpbWcuZG9qb0NvbWJvQm94IHtcclxuXHRtYXJnaW4tdG9wOiAxcHg7XHJcblx0bWFyZ2luLWJvdHRvbTogMXB4O1xyXG59XHJcblxyXG4vKiB0aGUgZHJvcCBkb3duICovXHJcbi5kb2pvQ29tYm9Cb3hPcHRpb25zIHtcclxuXHRmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBHYXJhbW9uZCwgc2Fucy1zZXJpZjtcclxuXHQvKiBmb250LXNpemU6IDAuN2VtOyAqL1xyXG5cdGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG5cdGJvcmRlcjogMXB4IHNvbGlkICNhZmFmYWY7XHJcblx0cG9zaXRpb246IGFic29sdXRlO1xyXG5cdHotaW5kZXg6IDEwMDA7XHJcblx0b3ZlcmZsb3c6IGF1dG87XHJcblx0Y3Vyc29yOiBkZWZhdWx0O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbSB7XHJcblx0cGFkZGluZy1sZWZ0OiAycHg7XHJcblx0cGFkZGluZy10b3A6IDJweDtcclxuXHRtYXJnaW46IDBweDtcclxufVxyXG5cclxuLmRvam9Db21ib0JveEl0ZW1FdmVuIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbU9kZCB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0IHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjNjM3MDlBO1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG4iLHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5kb2pvVXJpKCJzdHJ1dHMvQ29tYm9Cb3guY3NzIiksc2VhcmNoTGltaXQ6MzAsdHJhbnNwb3J0OiIiLHByZWxvYWQ6dHJ1ZSx0YWJJbmRleDoiIixzaG93UmVzdWx0TGlzdDpmdW5jdGlvbigpewordmFyIF9jODk9dGhpcy5vcHRpb25zTGlzdE5vZGUuY2hpbGROb2RlczsKK2lmKF9jODkubGVuZ3RoKXsKK3RoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlLndpZHRoPXRoaXMuZHJvcGRvd25XaWR0aD09PTA/KGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKS53aWR0aC0yKSsicHgiOnRoaXMuZHJvcGRvd25XaWR0aCsicHgiOworaWYodGhpcy5pdGVtSGVpZ2h0PT09MHx8ZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUpKXsKK3RoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlLmhlaWdodD10aGlzLmRyb3Bkb3duSGVpZ2h0KyJweCI7Cit0aGlzLm9wdGlvbnNMaXN0Tm9kZS5zdHlsZS5kaXNwbGF5PSIiOwordGhpcy5pdGVtSGVpZ2h0PWRvam8uaHRtbC5nZXRNYXJnaW5Cb3goX2M4OVswXSkuaGVpZ2h0OworfQordmFyIF9jOGE9dGhpcy5pdGVtSGVpZ2h0Kl9jODkubGVuZ3RoOworaWYoX2M4YTx0aGlzLmRyb3Bkb3duSGVpZ2h0KXsKK3RoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlLmhlaWdodD1fYzhhKzIrInB4IjsKK31lbHNlewordGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUuaGVpZ2h0PXRoaXMuZHJvcGRvd25IZWlnaHQrInB4IjsKK30KK3RoaXMucG9wdXBXaWRnZXQub3Blbih0aGlzLmRvbU5vZGUsdGhpcyx0aGlzLmRvd25BcnJvd05vZGUpOworfWVsc2V7Cit0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworfQorfSxfb3BlblJlc3VsdExpc3Q6ZnVuY3Rpb24oX2M4Yil7CitpZih0aGlzLmRpc2FibGVkKXsKK3JldHVybjsKK30KK3RoaXMuX2NsZWFyUmVzdWx0TGlzdCgpOworaWYoIV9jOGIubGVuZ3RoKXsKK3RoaXMuX2hpZGVSZXN1bHRMaXN0KCk7Cit9CitpZigodGhpcy5hdXRvQ29tcGxldGUpJiYoX2M4Yi5sZW5ndGgpJiYoIXRoaXMuX3ByZXZfa2V5X2JhY2tzcGFjZSkmJih0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoPjApKXsKK3ZhciBjcG9zPXRoaXMuX2dldENhcmV0UG9zKHRoaXMudGV4dElucHV0Tm9kZSk7CitpZigoY3BvcysxKT50aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKK3RoaXMudGV4dElucHV0Tm9kZS52YWx1ZSs9X2M4YlswXVswXS5zdWJzdHIoY3Bvcyk7Cit0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSxjcG9zLHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpOworfQorfQordmFyIF9jOGQ9dGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlOwordmFyIGV2ZW49dHJ1ZTsKK3doaWxlKF9jOGIubGVuZ3RoKXsKK3ZhciB0cj1fYzhiLnNoaWZ0KCk7CitpZih0cil7Cit2YXIgdGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Cit2YXIgdGV4dD10clswXTsKK3ZhciBpPXRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKF9jOGQudG9Mb3dlckNhc2UoKSk7CitpZihpPj0wKXsKK3ZhciBwcmU9dGV4dC5zdWJzdHJpbmcoMCxpKTsKK3ZhciBfYzk0PXRleHQuc3Vic3RyaW5nKGksaStfYzhkLmxlbmd0aCk7Cit2YXIgcG9zdD10ZXh0LnN1YnN0cmluZyhpK19jOGQubGVuZ3RoKTsKK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHByZSkpewordGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocHJlKSk7Cit9Cit2YXIgX2M5Nj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiIik7Cit0ZC5hcHBlbmRDaGlsZChfYzk2KTsKK19jOTYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoX2M5NCkpOwordGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocG9zdCkpOworfWVsc2V7Cit0ZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0clswXSkpOworfQordGQuc2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIix0clswXSk7Cit0ZC5zZXRBdHRyaWJ1dGUoInJlc3VsdFZhbHVlIix0clsxXSk7Cit0ZC5jbGFzc05hbWU9ImRvam9Db21ib0JveEl0ZW0gIisoKGV2ZW4pPyJkb2pvQ29tYm9Cb3hJdGVtRXZlbiI6ImRvam9Db21ib0JveEl0ZW1PZGQiKTsKK2V2ZW49KCFldmVuKTsKK3RoaXMub3B0aW9uc0xpc3ROb2RlLmFwcGVuZENoaWxkKHRkKTsKK30KK30KK3RoaXMuc2hvd1Jlc3VsdExpc3QoKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpeworc3RydXRzLndpZGdldC5Db21ib0JveC5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7Cit2YXIgc2VsZj10aGlzOworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5saXN0ZW5Ub3BpY3MpKXsKK3ZhciBfYzk4PXRoaXMubGlzdGVuVG9waWNzLnNwbGl0KCIsIik7Citmb3IodmFyIGk9MDtpPF9jOTgubGVuZ3RoO2krKyl7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZShfYzk4W2ldLGZ1bmN0aW9uKCl7Cit2YXIgX2M5YT17Y2FuY2VsOmZhbHNlfTsKK3NlbGYubm90aWZ5KHRoaXMud2lkZ2V0SWQsImJlZm9yZSIsX2M5YSk7CitpZihfYzlhLmNhbmNlbCl7CityZXR1cm47Cit9CitzZWxmLmNsZWFyVmFsdWVzKCk7CitzZWxmLmRhdGFQcm92aWRlci5nZXREYXRhKHNlbGYuZGF0YVVybCk7Cit9KTsKK30KK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubm90aWZ5VG9waWNzKSl7Cit0aGlzLm5vdGlmeVRvcGljc0FycmF5PXRoaXMubm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmJlZm9yZU5vdGlmeVRvcGljcykpewordGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheT10aGlzLmJlZm9yZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5hZnRlck5vdGlmeVRvcGljcykpewordGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5PXRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MpKXsKK3RoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheT10aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnZhbHVlTm90aWZ5VG9waWNzKSl7Cit0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXk9dGhpcy52YWx1ZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQordGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLm5hbWU9ZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmtleU5hbWUpP3RoaXMubmFtZSsiS2V5Ijp0aGlzLmtleU5hbWU7Cit0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU9dGhpcy5pbml0aWFsVmFsdWU7Cit0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWU9dGhpcy5pbml0aWFsS2V5OwordGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlPXRoaXMuaW5pdGlhbFZhbHVlOworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YWJJbmRleCkpewordGhpcy50ZXh0SW5wdXROb2RlLnRhYkluZGV4PXRoaXMudGFiSW5kZXg7Cit9CitpZighdGhpcy52aXNpYmxlRG93bkFycm93KXsKK2Rvam8uaHRtbC5oaWRlKHRoaXMuZG93bkFycm93Tm9kZSk7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnNlYXJjaFR5cGUpKXsKK3RoaXMuZGF0YVByb3ZpZGVyLnNlYXJjaFR5cGU9dGhpcy5zZWFyY2hUeXBlLnRvVXBwZXJDYXNlKCk7Cit9Cit9LGNsZWFyVmFsdWVzOmZ1bmN0aW9uKCl7Cit0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU9IiI7Cit0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWU9IiI7Cit0aGlzLnRleHRJbnB1dE5vZGUudmFsdWU9IiI7Cit9LG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGRhdGEpewordGhpcy5ub3RpZnkoZGF0YSwidmFsdWVjaGFuZ2VkIixudWxsKTsKK30sbm90aWZ5OmZ1bmN0aW9uKGRhdGEsdHlwZSxlKXsKK3ZhciBzZWxmPXRoaXM7CitpZih0aGlzLm5vdGlmeVRvcGljc0FycmF5KXsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMubm90aWZ5VG9waWNzQXJyYXksZnVuY3Rpb24oX2NhMCl7Cit0cnl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2NhMCxkYXRhLHR5cGUsZSxzZWxmKTsKK30KK2NhdGNoKGV4KXsKK3NlbGYubG9nKGV4KTsKK30KK30pOworfQordmFyIF9jYTE9bnVsbDsKK3N3aXRjaCh0eXBlKXsKK2Nhc2UgImJlZm9yZSI6Cit0aGlzLm5vdGlmeVRvKHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzQXJyYXksW2UsdGhpc10pOworYnJlYWs7CitjYXNlICJsb2FkIjoKK3RoaXMubm90aWZ5VG8odGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5LFtkYXRhLGUsdGhpc10pOworYnJlYWs7CitjYXNlICJlcnJvciI6Cit0aGlzLm5vdGlmeVRvKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSxbZGF0YSxlLHRoaXNdKTsKK2JyZWFrOworY2FzZSAidmFsdWVjaGFuZ2VkIjoKK3RoaXMubm90aWZ5VG8odGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5LFt0aGlzLmdldFNlbGVjdGVkVmFsdWUoKSx0aGlzLmdldFNlbGVjdGVkS2V5KCksdGhpcy5nZXRUZXh0KCksdGhpc10pOworYnJlYWs7Cit9Cit9LG5vdGlmeVRvOmZ1bmN0aW9uKF9jYTIsX2NhMyl7Cit2YXIgc2VsZj10aGlzOworaWYoX2NhMil7Citkb2pvLmxhbmcuZm9yRWFjaChfY2EyLGZ1bmN0aW9uKF9jYTUpewordHJ5eworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoQXBwbHkoX2NhNSxfY2EzKTsKK30KK2NhdGNoKGV4KXsKK3NlbGYubG9nKGV4KTsKK30KK30pOworfQorfSxsb2c6ZnVuY3Rpb24odGV4dCl7Citkb2pvLmRlYnVnKCJbIisodGhpcy53aWRnZXRJZD90aGlzLndpZGdldElkOiJ1bmtub3duIikrIl0gIit0ZXh0KTsKK30sX3N0YXJ0U2VhcmNoRnJvbUlucHV0OmZ1bmN0aW9uKCl7Cit2YXIgX2NhNz10aGlzLnRleHRJbnB1dE5vZGUudmFsdWU7CitpZih0aGlzLmxvYWRPblR5cGUpeworaWYoX2NhNy5sZW5ndGg+PXRoaXMubG9hZE1pbmltdW0pewordmFyIF9jYTg9dGhpcy5kYXRhVXJsKyh0aGlzLmRhdGFVcmwuaW5kZXhPZigiPyIpPi0xPyImIjoiPyIpOworX2NhOCs9dGhpcy5uYW1lKyI9IitlbmNvZGVVUklDb21wb25lbnQoX2NhNyk7Cit0aGlzLmRhdGFQcm92aWRlci5nZXREYXRhKF9jYTgpOwordGhpcy5fc3RhcnRTZWFyY2goX2NhNyk7Cit9ZWxzZXsKK3RoaXMuX2hpZGVSZXN1bHRMaXN0KCk7Cit9Cit9ZWxzZXsKK3RoaXMuX3N0YXJ0U2VhcmNoKF9jYTcpOworfQorfSxzZXRTZWxlY3RlZEtleTpmdW5jdGlvbihrZXkpewordmFyIGRhdGE9dGhpcy5kYXRhUHJvdmlkZXIuZGF0YTsKK2ZvcihlbGVtZW50IGluIGRhdGEpewordmFyIG9iaj1kYXRhW2VsZW1lbnRdOworaWYob2JqWzFdLnRvU3RyaW5nKCk9PWtleSl7Cit0aGlzLnNldFZhbHVlKG9ialswXS50b1N0cmluZygpKTsKK3RoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS52YWx1ZT1vYmpbMV0udG9TdHJpbmcoKTsKK30KK30KK30sZ2V0U2VsZWN0ZWRLZXk6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWU7Cit9LGdldFNlbGVjdGVkVmFsdWU6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU7Cit9LGdldFRleHQ6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWU7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LHtpbnB1dFdpZHRoOiI3ZW0iLGlkOiIiLGlucHV0SWQ6IiIsaW5wdXROYW1lOiIiLGljb25VUkw6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvY29tYm9fYm94X2Fycm93LnBuZyIpLGNvcHlDbGFzc2VzOmZhbHNlLGljb25BbHQ6IiIsY29udGFpbmVyVG9nZ2xlOiJwbGFpbiIsY29udGFpbmVyVG9nZ2xlRHVyYXRpb246MTUwLHRlbXBsYXRlU3RyaW5nOiI8c3BhbiBzdHlsZT1cIndoaXRlLXNwYWNlOm5vd3JhcFwiPjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIlwiIHZhbHVlPVwiXCIgZG9qb0F0dGFjaFBvaW50PVwidmFsdWVOb2RlXCIgLz48aW5wdXQgbmFtZT1cIlwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIiBzdHlsZT1cInZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiBkb2pvQXR0YWNoUG9pbnQ9XCJpbnB1dE5vZGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPiA8aW1nIHNyYz1cIiR7dGhpcy5pY29uVVJMfVwiIGFsdD1cIiR7dGhpcy5pY29uQWx0fVwiIGRvam9BdHRhY2hFdmVudD1cIm9uY2xpY2s6b25JY29uQ2xpY2tcIiBkb2pvQXR0YWNoUG9pbnQ9XCJidXR0b25Ob2RlXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IGN1cnNvcjpwb2ludGVyOyBjdXJzb3I6aGFuZFwiIC8+PC9zcGFuPiIsdGVtcGxhdGVDc3NQYXRoOiIiLGlzQ29udGFpbmVyOnRydWUsYXR0YWNoVGVtcGxhdGVOb2RlczpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIuc3VwZXJjbGFzcy5hdHRhY2hUZW1wbGF0ZU5vZGVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3RoaXMucG9wdXA9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJQb3B1cENvbnRhaW5lciIse3RvZ2dsZTp0aGlzLmNvbnRhaW5lclRvZ2dsZSx0b2dnbGVEdXJhdGlvbjp0aGlzLmNvbnRhaW5lclRvZ2dsZUR1cmF0aW9ufSk7Cit0aGlzLmNvbnRhaW5lck5vZGU9dGhpcy5wb3B1cC5kb21Ob2RlOworfSxmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpewordGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMucG9wdXAuZG9tTm9kZSk7CitpZih0aGlzLmlkKXsKK3RoaXMuZG9tTm9kZS5pZD10aGlzLmlkOworfQoraWYodGhpcy5pbnB1dElkKXsKK3RoaXMuaW5wdXROb2RlLmlkPXRoaXMuaW5wdXRJZDsKK30KK2lmKHRoaXMuaW5wdXROYW1lKXsKK3RoaXMuaW5wdXROb2RlLm5hbWU9dGhpcy5pbnB1dE5hbWU7Cit9Cit0aGlzLmlucHV0Tm9kZS5zdHlsZS53aWR0aD10aGlzLmlucHV0V2lkdGg7Cit0aGlzLmlucHV0Tm9kZS5kaXNhYmxlZD10aGlzLmRpc2FibGVkOworaWYodGhpcy5jb3B5Q2xhc3Nlcyl7Cit0aGlzLmlucHV0Tm9kZS5zdHlsZT0iIjsKK3RoaXMuaW5wdXROb2RlLmNsYXNzTmFtZT10aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpLmNsYXNzTmFtZTsKK30KK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLmlucHV0Tm9kZSwib25jaGFuZ2UiLHRoaXMsIm9uSW5wdXRDaGFuZ2UiKTsKK30sb25JY29uQ2xpY2s6ZnVuY3Rpb24oZXZ0KXsKK2lmKHRoaXMuZGlzYWJsZWQpeworcmV0dXJuOworfQoraWYoIXRoaXMucG9wdXAuaXNTaG93aW5nTm93KXsKK3RoaXMucG9wdXAub3Blbih0aGlzLmlucHV0Tm9kZSx0aGlzLHRoaXMuYnV0dG9uTm9kZSk7Cit9ZWxzZXsKK3RoaXMucG9wdXAuY2xvc2UoKTsKK30KK30saGlkZUNvbnRhaW5lcjpmdW5jdGlvbigpeworaWYodGhpcy5wb3B1cC5pc1Nob3dpbmdOb3cpewordGhpcy5wb3B1cC5jbG9zZSgpOworfQorfSxvbklucHV0Q2hhbmdlOmZ1bmN0aW9uKCl7Cit9LGVuYWJsZTpmdW5jdGlvbigpewordGhpcy5pbnB1dE5vZGUuZGlzYWJsZWQ9ZmFsc2U7Citkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lci5zdXBlcmNsYXNzLmVuYWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGRpc2FibGU6ZnVuY3Rpb24oKXsKK3RoaXMuaW5wdXROb2RlLmRpc2FibGVkPXRydWU7Citkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lci5zdXBlcmNsYXNzLmRpc2FibGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuc2VyaWFsaXplIik7Citkb2pvLmRhdGUuc2V0SXNvODYwMT1mdW5jdGlvbihfY2FmLF9jYjApewordmFyIF9jYjE9KF9jYjAuaW5kZXhPZigiVCIpPT0tMSk/X2NiMC5zcGxpdCgiICIpOl9jYjAuc3BsaXQoIlQiKTsKK19jYWY9ZG9qby5kYXRlLnNldElzbzg2MDFEYXRlKF9jYWYsX2NiMVswXSk7CitpZihfY2IxLmxlbmd0aD09Mil7CitfY2FmPWRvam8uZGF0ZS5zZXRJc284NjAxVGltZShfY2FmLF9jYjFbMV0pOworfQorcmV0dXJuIF9jYWY7Cit9OworZG9qby5kYXRlLmZyb21Jc284NjAxPWZ1bmN0aW9uKF9jYjIpeworcmV0dXJuIGRvam8uZGF0ZS5zZXRJc284NjAxKG5ldyBEYXRlKDAsMCksX2NiMik7Cit9OworZG9qby5kYXRlLnNldElzbzg2MDFEYXRlPWZ1bmN0aW9uKF9jYjMsX2NiNCl7Cit2YXIgX2NiNT0iXihbMC05XXs0fSkoKC0/KFswLTldezJ9KSgtPyhbMC05XXsyfSkpPyl8IisiKC0/KFswLTldezN9KSl8KC0/VyhbMC05XXsyfSkoLT8oWzEtN10pKT8pKT8kIjsKK3ZhciBkPV9jYjQubWF0Y2gobmV3IFJlZ0V4cChfY2I1KSk7CitpZighZCl7Citkb2pvLmRlYnVnKCJpbnZhbGlkIGRhdGUgc3RyaW5nOiAiK19jYjQpOworcmV0dXJuIG51bGw7Cit9Cit2YXIgeWVhcj1kWzFdOwordmFyIF9jYjg9ZFs0XTsKK3ZhciBkYXRlPWRbNl07Cit2YXIgX2NiYT1kWzhdOwordmFyIHdlZWs9ZFsxMF07Cit2YXIgX2NiYz1kWzEyXT9kWzEyXToxOworX2NiMy5zZXRGdWxsWWVhcih5ZWFyKTsKK2lmKF9jYmEpeworX2NiMy5zZXRNb250aCgwKTsKK19jYjMuc2V0RGF0ZShOdW1iZXIoX2NiYSkpOworfWVsc2V7CitpZih3ZWVrKXsKK19jYjMuc2V0TW9udGgoMCk7CitfY2IzLnNldERhdGUoMSk7Cit2YXIgZ2Q9X2NiMy5nZXREYXkoKTsKK3ZhciBkYXk9Z2Q/Z2Q6NzsKK3ZhciBfY2JmPU51bWJlcihfY2JjKSsoNypOdW1iZXIod2VlaykpOworaWYoZGF5PD00KXsKK19jYjMuc2V0RGF0ZShfY2JmKzEtZGF5KTsKK31lbHNleworX2NiMy5zZXREYXRlKF9jYmYrOC1kYXkpOworfQorfWVsc2V7CitpZihfY2I4KXsKK19jYjMuc2V0RGF0ZSgxKTsKK19jYjMuc2V0TW9udGgoX2NiOC0xKTsKK30KK2lmKGRhdGUpeworX2NiMy5zZXREYXRlKGRhdGUpOworfQorfQorfQorcmV0dXJuIF9jYjM7Cit9OworZG9qby5kYXRlLmZyb21Jc284NjAxRGF0ZT1mdW5jdGlvbihfY2MwKXsKK3JldHVybiBkb2pvLmRhdGUuc2V0SXNvODYwMURhdGUobmV3IERhdGUoMCwwKSxfY2MwKTsKK307Citkb2pvLmRhdGUuc2V0SXNvODYwMVRpbWU9ZnVuY3Rpb24oX2NjMSxfY2MyKXsKK3ZhciBfY2MzPSJafCgoWy0rXSkoWzAtOV17Mn0pKDo/KFswLTldezJ9KSk/KSQiOwordmFyIGQ9X2NjMi5tYXRjaChuZXcgUmVnRXhwKF9jYzMpKTsKK3ZhciBfY2M1PTA7CitpZihkKXsKK2lmKGRbMF0hPSJaIil7CitfY2M1PShOdW1iZXIoZFszXSkqNjApK051bWJlcihkWzVdKTsKK19jYzUqPSgoZFsyXT09Ii0iKT8xOi0xKTsKK30KK19jYzUtPV9jYzEuZ2V0VGltZXpvbmVPZmZzZXQoKTsKK19jYzI9X2NjMi5zdWJzdHIoMCxfY2MyLmxlbmd0aC1kWzBdLmxlbmd0aCk7Cit9Cit2YXIgX2NjNj0iXihbMC05XXsyfSkoOj8oWzAtOV17Mn0pKDo/KFswLTldezJ9KSguKFswLTldKykpPyk/KT8kIjsKK2Q9X2NjMi5tYXRjaChuZXcgUmVnRXhwKF9jYzYpKTsKK2lmKCFkKXsKK2Rvam8uZGVidWcoImludmFsaWQgdGltZSBzdHJpbmc6ICIrX2NjMik7CityZXR1cm4gbnVsbDsKK30KK3ZhciBfY2M3PWRbMV07Cit2YXIgbWlucz1OdW1iZXIoKGRbM10pP2RbM106MCk7Cit2YXIgc2Vjcz0oZFs1XSk/ZFs1XTowOwordmFyIG1zPWRbN10/KE51bWJlcigiMC4iK2RbN10pKjEwMDApOjA7CitfY2MxLnNldEhvdXJzKF9jYzcpOworX2NjMS5zZXRNaW51dGVzKG1pbnMpOworX2NjMS5zZXRTZWNvbmRzKHNlY3MpOworX2NjMS5zZXRNaWxsaXNlY29uZHMobXMpOworaWYoX2NjNSE9PTApeworX2NjMS5zZXRUaW1lKF9jYzEuZ2V0VGltZSgpK19jYzUqNjAwMDApOworfQorcmV0dXJuIF9jYzE7Cit9OworZG9qby5kYXRlLmZyb21Jc284NjAxVGltZT1mdW5jdGlvbihfY2NiKXsKK3JldHVybiBkb2pvLmRhdGUuc2V0SXNvODYwMVRpbWUobmV3IERhdGUoMCwwKSxfY2NiKTsKK307Citkb2pvLmRhdGUudG9SZmMzMzM5PWZ1bmN0aW9uKF9jY2MsX2NjZCl7CitpZighX2NjYyl7CitfY2NjPW5ldyBEYXRlKCk7Cit9Cit2YXIgXz1kb2pvLnN0cmluZy5wYWQ7Cit2YXIgX2NjZj1bXTsKK2lmKF9jY2QhPSJ0aW1lT25seSIpewordmFyIGRhdGU9W18oX2NjYy5nZXRGdWxsWWVhcigpLDQpLF8oX2NjYy5nZXRNb250aCgpKzEsMiksXyhfY2NjLmdldERhdGUoKSwyKV0uam9pbigiLSIpOworX2NjZi5wdXNoKGRhdGUpOworfQoraWYoX2NjZCE9ImRhdGVPbmx5Iil7Cit2YXIgdGltZT1bXyhfY2NjLmdldEhvdXJzKCksMiksXyhfY2NjLmdldE1pbnV0ZXMoKSwyKSxfKF9jY2MuZ2V0U2Vjb25kcygpLDIpXS5qb2luKCI6Iik7Cit2YXIgX2NkMj1fY2NjLmdldFRpbWV6b25lT2Zmc2V0KCk7Cit0aW1lKz0oX2NkMj4wPyItIjoiKyIpK18oTWF0aC5mbG9vcihNYXRoLmFicyhfY2QyKS82MCksMikrIjoiK18oTWF0aC5hYnMoX2NkMiklNjAsMik7CitfY2NmLnB1c2godGltZSk7Cit9CityZXR1cm4gX2NjZi5qb2luKCJUIik7Cit9OworZG9qby5kYXRlLmZyb21SZmMzMzM5PWZ1bmN0aW9uKF9jZDMpeworaWYoX2NkMy5pbmRleE9mKCJUYW55IikhPS0xKXsKK19jZDM9X2NkMy5yZXBsYWNlKCJUYW55IiwiIik7Cit9Cit2YXIgX2NkND1uZXcgRGF0ZSgpOworcmV0dXJuIGRvam8uZGF0ZS5zZXRJc284NjAxKF9jZDQsX2NkMyk7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuY29tbW9uIik7Citkb2pvLmRhdGUuc2V0RGF5T2ZZZWFyPWZ1bmN0aW9uKF9jZDUsX2NkNil7CitfY2Q1LnNldE1vbnRoKDApOworX2NkNS5zZXREYXRlKF9jZDYpOworcmV0dXJuIF9jZDU7Cit9OworZG9qby5kYXRlLmdldERheU9mWWVhcj1mdW5jdGlvbihfY2Q3KXsKK3ZhciBfY2Q4PV9jZDcuZ2V0RnVsbFllYXIoKTsKK3ZhciBfY2Q5PW5ldyBEYXRlKF9jZDgtMSwxMSwzMSk7CityZXR1cm4gTWF0aC5mbG9vcigoX2NkNy5nZXRUaW1lKCktX2NkOS5nZXRUaW1lKCkpLzg2NDAwMDAwKTsKK307Citkb2pvLmRhdGUuc2V0V2Vla09mWWVhcj1mdW5jdGlvbihfY2RhLHdlZWssX2NkYyl7CitpZihhcmd1bWVudHMubGVuZ3RoPT0xKXsKK19jZGM9MDsKK30KK2Rvam8udW5pbXBsZW1lbnRlZCgiZG9qby5kYXRlLnNldFdlZWtPZlllYXIiKTsKK307Citkb2pvLmRhdGUuZ2V0V2Vla09mWWVhcj1mdW5jdGlvbihfY2RkLF9jZGUpeworaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7CitfY2RlPTA7Cit9Cit2YXIgX2NkZj1uZXcgRGF0ZShfY2RkLmdldEZ1bGxZZWFyKCksMCwxKTsKK3ZhciBkYXk9X2NkZi5nZXREYXkoKTsKK19jZGYuc2V0RGF0ZShfY2RmLmdldERhdGUoKS1kYXkrX2NkZS0oZGF5Pl9jZGU/NzowKSk7CityZXR1cm4gTWF0aC5mbG9vcigoX2NkZC5nZXRUaW1lKCktX2NkZi5nZXRUaW1lKCkpLzYwNDgwMDAwMCk7Cit9OworZG9qby5kYXRlLnNldElzb1dlZWtPZlllYXI9ZnVuY3Rpb24oX2NlMSx3ZWVrLF9jZTMpeworaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7CitfY2UzPTE7Cit9Citkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0ZS5zZXRJc29XZWVrT2ZZZWFyIik7Cit9OworZG9qby5kYXRlLmdldElzb1dlZWtPZlllYXI9ZnVuY3Rpb24oX2NlNCxfY2U1KXsKK2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpeworX2NlNT0xOworfQorZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUuZ2V0SXNvV2Vla09mWWVhciIpOworfTsKK2Rvam8uZGF0ZS5zaG9ydFRpbWV6b25lcz1bIklETFciLCJCRVQiLCJIU1QiLCJNQVJUIiwiQUtTVCIsIlBTVCIsIk1TVCIsIkNTVCIsIkVTVCIsIkFTVCIsIk5GVCIsIkJTVCIsIkZTVCIsIkFUIiwiR01UIiwiQ0VUIiwiRUVUIiwiTVNLIiwiSVJUIiwiR1NUIiwiQUZUIiwiQUdUVCIsIklTVCIsIk5QVCIsIkFMTVQiLCJNTVQiLCJKVCIsIkFXU1QiLCJKU1QiLCJBQ1NUIiwiQUVTVCIsIkxIU1QiLCJWVVQiLCJORlQiLCJOWlQiLCJDSEFTVCIsIlBIT1QiLCJMSU5UIl07Citkb2pvLmRhdGUudGltZXpvbmVPZmZzZXRzPVstNzIwLC02NjAsLTYwMCwtNTcwLC01NDAsLTQ4MCwtNDIwLC0zNjAsLTMwMCwtMjQwLC0yMTAsLTE4MCwtMTIwLC02MCwwLDYwLDEyMCwxODAsMjEwLDI0MCwyNzAsMzAwLDMzMCwzNDUsMzYwLDM5MCw0MjAsNDgwLDU0MCw1NzAsNjAwLDYzMCw2NjAsNjkwLDcyMCw3NjUsNzgwLDg0MF07Citkb2pvLmRhdGUuZ2V0RGF5c0luTW9udGg9ZnVuY3Rpb24oX2NlNil7Cit2YXIgX2NlNz1fY2U2LmdldE1vbnRoKCk7Cit2YXIgZGF5cz1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdOworaWYoX2NlNz09MSYmZG9qby5kYXRlLmlzTGVhcFllYXIoX2NlNikpeworcmV0dXJuIDI5OworfWVsc2V7CityZXR1cm4gZGF5c1tfY2U3XTsKK30KK307Citkb2pvLmRhdGUuaXNMZWFwWWVhcj1mdW5jdGlvbihfY2U5KXsKK3ZhciB5ZWFyPV9jZTkuZ2V0RnVsbFllYXIoKTsKK3JldHVybiAoeWVhciU0MDA9PTApP3RydWU6KHllYXIlMTAwPT0wKT9mYWxzZTooeWVhciU0PT0wKT90cnVlOmZhbHNlOworfTsKK2Rvam8uZGF0ZS5nZXRUaW1lem9uZU5hbWU9ZnVuY3Rpb24oX2NlYil7Cit2YXIgc3RyPV9jZWIudG9TdHJpbmcoKTsKK3ZhciB0ej0iIjsKK3ZhciBfY2VlOwordmFyIHBvcz1zdHIuaW5kZXhPZigiKCIpOworaWYocG9zPi0xKXsKK3BvcysrOwordHo9c3RyLnN1YnN0cmluZyhwb3Msc3RyLmluZGV4T2YoIikiKSk7Cit9ZWxzZXsKK3ZhciBwYXQ9LyhbQS1aXC9dKykgXGR7NH0kLzsKK2lmKChfY2VlPXN0ci5tYXRjaChwYXQpKSl7Cit0ej1fY2VlWzFdOworfWVsc2V7CitzdHI9X2NlYi50b0xvY2FsZVN0cmluZygpOworcGF0PS8gKFtBLVpcL10rKSQvOworaWYoKF9jZWU9c3RyLm1hdGNoKHBhdCkpKXsKK3R6PV9jZWVbMV07Cit9Cit9Cit9CityZXR1cm4gdHo9PSJBTSJ8fHR6PT0iUE0iPyIiOnR6OworfTsKK2Rvam8uZGF0ZS5nZXRPcmRpbmFsPWZ1bmN0aW9uKF9jZjEpewordmFyIGRhdGU9X2NmMS5nZXREYXRlKCk7CitpZihkYXRlJTEwMCE9MTEmJmRhdGUlMTA9PTEpeworcmV0dXJuICJzdCI7Cit9ZWxzZXsKK2lmKGRhdGUlMTAwIT0xMiYmZGF0ZSUxMD09Mil7CityZXR1cm4gIm5kIjsKK31lbHNleworaWYoZGF0ZSUxMDAhPTEzJiZkYXRlJTEwPT0zKXsKK3JldHVybiAicmQiOworfWVsc2V7CityZXR1cm4gInRoIjsKK30KK30KK30KK307Citkb2pvLmRhdGUuY29tcGFyZVR5cGVzPXtEQVRFOjEsVElNRToyfTsKK2Rvam8uZGF0ZS5jb21wYXJlPWZ1bmN0aW9uKF9jZjMsX2NmNCxfY2Y1KXsKK3ZhciBkQT1fY2YzOwordmFyIGRCPV9jZjR8fG5ldyBEYXRlKCk7Cit2YXIgbm93PW5ldyBEYXRlKCk7Cit3aXRoKGRvam8uZGF0ZS5jb21wYXJlVHlwZXMpewordmFyIG9wdD1fY2Y1fHwoREFURXxUSU1FKTsKK3ZhciBkMT1uZXcgRGF0ZSgob3B0JkRBVEUpP2RBLmdldEZ1bGxZZWFyKCk6bm93LmdldEZ1bGxZZWFyKCksKG9wdCZEQVRFKT9kQS5nZXRNb250aCgpOm5vdy5nZXRNb250aCgpLChvcHQmREFURSk/ZEEuZ2V0RGF0ZSgpOm5vdy5nZXREYXRlKCksKG9wdCZUSU1FKT9kQS5nZXRIb3VycygpOjAsKG9wdCZUSU1FKT9kQS5nZXRNaW51dGVzKCk6MCwob3B0JlRJTUUpP2RBLmdldFNlY29uZHMoKTowKTsKK3ZhciBkMj1uZXcgRGF0ZSgob3B0JkRBVEUpP2RCLmdldEZ1bGxZZWFyKCk6bm93LmdldEZ1bGxZZWFyKCksKG9wdCZEQVRFKT9kQi5nZXRNb250aCgpOm5vdy5nZXRNb250aCgpLChvcHQmREFURSk/ZEIuZ2V0RGF0ZSgpOm5vdy5nZXREYXRlKCksKG9wdCZUSU1FKT9kQi5nZXRIb3VycygpOjAsKG9wdCZUSU1FKT9kQi5nZXRNaW51dGVzKCk6MCwob3B0JlRJTUUpP2RCLmdldFNlY29uZHMoKTowKTsKK30KK2lmKGQxLnZhbHVlT2YoKT5kMi52YWx1ZU9mKCkpeworcmV0dXJuIDE7Cit9CitpZihkMS52YWx1ZU9mKCk8ZDIudmFsdWVPZigpKXsKK3JldHVybiAtMTsKK30KK3JldHVybiAwOworfTsKK2Rvam8uZGF0ZS5kYXRlUGFydHM9e1lFQVI6MCxNT05USDoxLERBWToyLEhPVVI6MyxNSU5VVEU6NCxTRUNPTkQ6NSxNSUxMSVNFQ09ORDo2LFFVQVJURVI6NyxXRUVLOjgsV0VFS0RBWTo5fTsKK2Rvam8uZGF0ZS5hZGQ9ZnVuY3Rpb24oZHQsX2NmZCxpbmNyKXsKK2lmKHR5cGVvZiBkdD09Im51bWJlciIpeworZHQ9bmV3IERhdGUoZHQpOworfQorZnVuY3Rpb24gZml4T3ZlcnNob290KCl7CitpZihzdW0uZ2V0RGF0ZSgpPGR0LmdldERhdGUoKSl7CitzdW0uc2V0RGF0ZSgwKTsKK30KK30KK3ZhciBzdW09bmV3IERhdGUoZHQpOword2l0aChkb2pvLmRhdGUuZGF0ZVBhcnRzKXsKK3N3aXRjaChfY2ZkKXsKK2Nhc2UgWUVBUjoKK3N1bS5zZXRGdWxsWWVhcihkdC5nZXRGdWxsWWVhcigpK2luY3IpOworZml4T3ZlcnNob290KCk7CiticmVhazsKK2Nhc2UgUVVBUlRFUjoKK2luY3IqPTM7CitjYXNlIE1PTlRIOgorc3VtLnNldE1vbnRoKGR0LmdldE1vbnRoKCkraW5jcik7CitmaXhPdmVyc2hvb3QoKTsKK2JyZWFrOworY2FzZSBXRUVLOgoraW5jcio9NzsKK2Nhc2UgREFZOgorc3VtLnNldERhdGUoZHQuZ2V0RGF0ZSgpK2luY3IpOworYnJlYWs7CitjYXNlIFdFRUtEQVk6Cit2YXIgZGF0PWR0LmdldERhdGUoKTsKK3ZhciBfZDAxPTA7Cit2YXIgZGF5cz0wOwordmFyIHN0cnQ9MDsKK3ZhciB0cmd0PTA7Cit2YXIgYWRqPTA7Cit2YXIgbW9kPWluY3IlNTsKK2lmKG1vZD09MCl7CitkYXlzPShpbmNyPjApPzU6LTU7CitfZDAxPShpbmNyPjApPygoaW5jci01KS81KTooKGluY3IrNSkvNSk7Cit9ZWxzZXsKK2RheXM9bW9kOworX2QwMT1wYXJzZUludChpbmNyLzUpOworfQorc3RydD1kdC5nZXREYXkoKTsKK2lmKHN0cnQ9PTYmJmluY3I+MCl7CithZGo9MTsKK31lbHNleworaWYoc3RydD09MCYmaW5jcjwwKXsKK2Fkaj0tMTsKK30KK30KK3RyZ3Q9KHN0cnQrZGF5cyk7CitpZih0cmd0PT0wfHx0cmd0PT02KXsKK2Fkaj0oaW5jcj4wKT8yOi0yOworfQorc3VtLnNldERhdGUoZGF0Kyg3Kl9kMDEpK2RheXMrYWRqKTsKK2JyZWFrOworY2FzZSBIT1VSOgorc3VtLnNldEhvdXJzKHN1bS5nZXRIb3VycygpK2luY3IpOworYnJlYWs7CitjYXNlIE1JTlVURToKK3N1bS5zZXRNaW51dGVzKHN1bS5nZXRNaW51dGVzKCkraW5jcik7CiticmVhazsKK2Nhc2UgU0VDT05EOgorc3VtLnNldFNlY29uZHMoc3VtLmdldFNlY29uZHMoKStpbmNyKTsKK2JyZWFrOworY2FzZSBNSUxMSVNFQ09ORDoKK3N1bS5zZXRNaWxsaXNlY29uZHMoc3VtLmdldE1pbGxpc2Vjb25kcygpK2luY3IpOworYnJlYWs7CitkZWZhdWx0OgorYnJlYWs7Cit9Cit9CityZXR1cm4gc3VtOworfTsKK2Rvam8uZGF0ZS5kaWZmPWZ1bmN0aW9uKGR0QSxkdEIsX2QwOSl7CitpZih0eXBlb2YgZHRBPT0ibnVtYmVyIil7CitkdEE9bmV3IERhdGUoZHRBKTsKK30KK2lmKHR5cGVvZiBkdEI9PSJudW1iZXIiKXsKK2R0Qj1uZXcgRGF0ZShkdEIpOworfQordmFyIF9kMGE9ZHRCLmdldEZ1bGxZZWFyKCktZHRBLmdldEZ1bGxZZWFyKCk7Cit2YXIgX2QwYj0oZHRCLmdldE1vbnRoKCktZHRBLmdldE1vbnRoKCkpKyhfZDBhKjEyKTsKK3ZhciBfZDBjPWR0Qi5nZXRUaW1lKCktZHRBLmdldFRpbWUoKTsKK3ZhciBfZDBkPV9kMGMvMTAwMDsKK3ZhciBfZDBlPV9kMGQvNjA7Cit2YXIgX2QwZj1fZDBlLzYwOwordmFyIF9kMTA9X2QwZi8yNDsKK3ZhciBfZDExPV9kMTAvNzsKK3ZhciBfZDEyPTA7Cit3aXRoKGRvam8uZGF0ZS5kYXRlUGFydHMpeworc3dpdGNoKF9kMDkpeworY2FzZSBZRUFSOgorX2QxMj1fZDBhOworYnJlYWs7CitjYXNlIFFVQVJURVI6Cit2YXIgbUE9ZHRBLmdldE1vbnRoKCk7Cit2YXIgbUI9ZHRCLmdldE1vbnRoKCk7Cit2YXIgcUE9TWF0aC5mbG9vcihtQS8zKSsxOwordmFyIHFCPU1hdGguZmxvb3IobUIvMykrMTsKK3FCKz0oX2QwYSo0KTsKK19kMTI9cUItcUE7CiticmVhazsKK2Nhc2UgTU9OVEg6CitfZDEyPV9kMGI7CiticmVhazsKK2Nhc2UgV0VFSzoKK19kMTI9cGFyc2VJbnQoX2QxMSk7CiticmVhazsKK2Nhc2UgREFZOgorX2QxMj1fZDEwOworYnJlYWs7CitjYXNlIFdFRUtEQVk6Cit2YXIgZGF5cz1NYXRoLnJvdW5kKF9kMTApOwordmFyIF9kMTg9cGFyc2VJbnQoZGF5cy83KTsKK3ZhciBtb2Q9ZGF5cyU3OworaWYobW9kPT0wKXsKK2RheXM9X2QxOCo1OworfWVsc2V7Cit2YXIgYWRqPTA7Cit2YXIgYURheT1kdEEuZ2V0RGF5KCk7Cit2YXIgYkRheT1kdEIuZ2V0RGF5KCk7CitfZDE4PXBhcnNlSW50KGRheXMvNyk7Cittb2Q9ZGF5cyU3OwordmFyIF9kMWQ9bmV3IERhdGUoZHRBKTsKK19kMWQuc2V0RGF0ZShfZDFkLmdldERhdGUoKSsoX2QxOCo3KSk7Cit2YXIgX2QxZT1fZDFkLmdldERheSgpOworaWYoX2QxMD4wKXsKK3N3aXRjaCh0cnVlKXsKK2Nhc2UgYURheT09NjoKK2Fkaj0tMTsKK2JyZWFrOworY2FzZSBhRGF5PT0wOgorYWRqPTA7CiticmVhazsKK2Nhc2UgYkRheT09NjoKK2Fkaj0tMTsKK2JyZWFrOworY2FzZSBiRGF5PT0wOgorYWRqPS0yOworYnJlYWs7CitjYXNlIChfZDFlK21vZCk+NToKK2Fkaj0tMjsKK2JyZWFrOworZGVmYXVsdDoKK2JyZWFrOworfQorfWVsc2V7CitpZihfZDEwPDApeworc3dpdGNoKHRydWUpeworY2FzZSBhRGF5PT02OgorYWRqPTA7CiticmVhazsKK2Nhc2UgYURheT09MDoKK2Fkaj0xOworYnJlYWs7CitjYXNlIGJEYXk9PTY6CithZGo9MjsKK2JyZWFrOworY2FzZSBiRGF5PT0wOgorYWRqPTE7CiticmVhazsKK2Nhc2UgKF9kMWUrbW9kKTwwOgorYWRqPTI7CiticmVhazsKK2RlZmF1bHQ6CiticmVhazsKK30KK30KK30KK2RheXMrPWFkajsKK2RheXMtPShfZDE4KjIpOworfQorX2QxMj1kYXlzOworYnJlYWs7CitjYXNlIEhPVVI6CitfZDEyPV9kMGY7CiticmVhazsKK2Nhc2UgTUlOVVRFOgorX2QxMj1fZDBlOworYnJlYWs7CitjYXNlIFNFQ09ORDoKK19kMTI9X2QwZDsKK2JyZWFrOworY2FzZSBNSUxMSVNFQ09ORDoKK19kMTI9X2QwYzsKK2JyZWFrOworZGVmYXVsdDoKK2JyZWFrOworfQorfQorcmV0dXJuIE1hdGgucm91bmQoX2QxMik7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuc3VwcGxlbWVudGFsIik7Citkb2pvLmRhdGUuZ2V0Rmlyc3REYXlPZldlZWs9ZnVuY3Rpb24oX2QxZil7Cit2YXIgX2QyMD17bXY6NSxhZTo2LGFmOjYsYmg6Nixkajo2LGR6OjYsZWc6Nixlcjo2LGV0OjYsaXE6Nixpcjo2LGpvOjYsa2U6Nixrdzo2LGxiOjYsbHk6NixtYTo2LG9tOjYscWE6NixzYTo2LHNkOjYsc286Nix0bjo2LHllOjYsYXM6MCxhdTowLGF6OjAsYnc6MCxjYTowLGNuOjAsZm86MCxnZTowLGdsOjAsZ3U6MCxoazowLGllOjAsaWw6MCxpczowLGptOjAsanA6MCxrZzowLGtyOjAsbGE6MCxtaDowLG1vOjAsbXA6MCxtdDowLG56OjAscGg6MCxwazowLHNnOjAsdGg6MCx0dDowLHR3OjAsdW06MCx1czowLHV6OjAsdmk6MCx6YTowLHp3OjAsZXQ6MCxtdzowLG5nOjAsdGo6MCxnYjowLHN5OjR9OworX2QxZj1kb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKF9kMWYpOwordmFyIF9kMjE9X2QxZi5zcGxpdCgiLSIpWzFdOwordmFyIGRvdz1fZDIwW19kMjFdOworcmV0dXJuICh0eXBlb2YgZG93PT0idW5kZWZpbmVkIik/MTpkb3c7Cit9OworZG9qby5kYXRlLmdldFdlZWtlbmQ9ZnVuY3Rpb24oX2QyMyl7Cit2YXIgX2QyND17ZWc6NSxpbDo1LHN5OjUsImluIjowLGFlOjQsYmg6NCxkejo0LGlxOjQsam86NCxrdzo0LGxiOjQsbHk6NCxtYTo0LG9tOjQscWE6NCxzYTo0LHNkOjQsdG46NCx5ZTo0fTsKK3ZhciBfZDI1PXthZTo1LGJoOjUsZHo6NSxpcTo1LGpvOjUsa3c6NSxsYjo1LGx5OjUsbWE6NSxvbTo1LHFhOjUsc2E6NSxzZDo1LHRuOjUseWU6NSxhZjo1LGlyOjUsZWc6NixpbDo2LHN5OjZ9OworX2QyMz1kb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKF9kMjMpOwordmFyIF9kMjY9X2QyMy5zcGxpdCgiLSIpWzFdOwordmFyIF9kMjc9X2QyNFtfZDI2XTsKK3ZhciBlbmQ9X2QyNVtfZDI2XTsKK2lmKHR5cGVvZiBfZDI3PT0idW5kZWZpbmVkIil7CitfZDI3PTY7Cit9CitpZih0eXBlb2YgZW5kPT0idW5kZWZpbmVkIil7CitlbmQ9MDsKK30KK3JldHVybiB7c3RhcnQ6X2QyNyxlbmQ6ZW5kfTsKK307Citkb2pvLmRhdGUuaXNXZWVrZW5kPWZ1bmN0aW9uKF9kMjksX2QyYSl7Cit2YXIgX2QyYj1kb2pvLmRhdGUuZ2V0V2Vla2VuZChfZDJhKTsKK3ZhciBkYXk9KF9kMjl8fG5ldyBEYXRlKCkpLmdldERheSgpOworaWYoX2QyYi5lbmQ8X2QyYi5zdGFydCl7CitfZDJiLmVuZCs9NzsKK2lmKGRheTxfZDJiLnN0YXJ0KXsKK2RheSs9NzsKK30KK30KK3JldHVybiBkYXk+PV9kMmIuc3RhcnQmJmRheTw9X2QyYi5lbmQ7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY29tbW9uIik7Citkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uPWZ1bmN0aW9uKF9kMmQsX2QyZSxfZDJmKXsKK2Rvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworX2QyZj1kb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKF9kMmYpOwordmFyIF9kMzA9X2QyZi5zcGxpdCgiLSIpOwordmFyIF9kMzE9W19kMmQsIm5scyIsX2QyZV0uam9pbigiLiIpOwordmFyIF9kMzI9ZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUoX2QzMSx0cnVlKTsKK3ZhciBfZDMzOworZm9yKHZhciBpPV9kMzAubGVuZ3RoO2k+MDtpLS0pewordmFyIGxvYz1fZDMwLnNsaWNlKDAsaSkuam9pbigiXyIpOworaWYoX2QzMltsb2NdKXsKK19kMzM9X2QzMltsb2NdOworYnJlYWs7Cit9Cit9CitpZighX2QzMyl7CitfZDMzPV9kMzIuUk9PVDsKK30KK2lmKF9kMzMpewordmFyIF9kMzY9ZnVuY3Rpb24oKXsKK307CitfZDM2LnByb3RvdHlwZT1fZDMzOworcmV0dXJuIG5ldyBfZDM2KCk7Cit9Citkb2pvLnJhaXNlKCJCdW5kbGUgbm90IGZvdW5kOiAiK19kMmUrIiBpbiAiK19kMmQrIiAsIGxvY2FsZT0iK19kMmYpOworfTsKK2Rvam8uaTE4bi5pc0xUUj1mdW5jdGlvbihfZDM3KXsKK3ZhciBsYW5nPWRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUoX2QzNykuc3BsaXQoIi0iKVswXTsKK3ZhciBSVEw9e2FyOnRydWUsZmE6dHJ1ZSxoZTp0cnVlLHVyOnRydWUseWk6dHJ1ZX07CityZXR1cm4gIVJUTFtsYW5nXTsKK307Citkb2pvLnByb3ZpZGUoImRvam8uZGF0ZS5mb3JtYXQiKTsKKyhmdW5jdGlvbigpeworZG9qby5kYXRlLmZvcm1hdD1mdW5jdGlvbihfZDNhLF9kM2IpeworaWYodHlwZW9mIF9kM2I9PSJzdHJpbmciKXsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby5kYXRlLmZvcm1hdCIsIlRvIGZvcm1hdCBkYXRlcyB3aXRoIFBPU0lYLXN0eWxlIHN0cmluZ3MsIHBsZWFzZSB1c2UgZG9qby5kYXRlLnN0cmZ0aW1lIGluc3RlYWQiLCIwLjUiKTsKK3JldHVybiBkb2pvLmRhdGUuc3RyZnRpbWUoX2QzYSxfZDNiKTsKK30KK2Z1bmN0aW9uIGZvcm1hdFBhdHRlcm4oX2QzYyxfZDNkKXsKK3JldHVybiBfZDNkLnJlcGxhY2UoLyhbYS16XSlcMSovaWcsZnVuY3Rpb24oX2QzZSl7Cit2YXIgczsKK3ZhciBjPV9kM2UuY2hhckF0KDApOwordmFyIGw9X2QzZS5sZW5ndGg7Cit2YXIgcGFkOwordmFyIF9kNDM9WyJhYmJyIiwid2lkZSIsIm5hcnJvdyJdOworc3dpdGNoKGMpeworY2FzZSAiRyI6CitpZihsPjMpeworZG9qby51bmltcGxlbWVudGVkKCJFcmEgZm9ybWF0IG5vdCBpbXBsZW1lbnRlZCIpOworfQorcz1pbmZvLmVyYXNbX2QzYy5nZXRGdWxsWWVhcigpPDA/MTowXTsKK2JyZWFrOworY2FzZSAieSI6CitzPV9kM2MuZ2V0RnVsbFllYXIoKTsKK3N3aXRjaChsKXsKK2Nhc2UgMToKK2JyZWFrOworY2FzZSAyOgorcz1TdHJpbmcocykuc3Vic3RyKC0yKTsKK2JyZWFrOworZGVmYXVsdDoKK3BhZD10cnVlOworfQorYnJlYWs7CitjYXNlICJRIjoKK2Nhc2UgInEiOgorcz1NYXRoLmNlaWwoKF9kM2MuZ2V0TW9udGgoKSsxKS8zKTsKK3N3aXRjaChsKXsKK2Nhc2UgMToKK2Nhc2UgMjoKK3BhZD10cnVlOworYnJlYWs7CitjYXNlIDM6CitjYXNlIDQ6Citkb2pvLnVuaW1wbGVtZW50ZWQoIlF1YXJ0ZXIgZm9ybWF0IG5vdCBpbXBsZW1lbnRlZCIpOworfQorYnJlYWs7CitjYXNlICJNIjoKK2Nhc2UgIkwiOgordmFyIG09X2QzYy5nZXRNb250aCgpOwordmFyIF9kNDY7Citzd2l0Y2gobCl7CitjYXNlIDE6CitjYXNlIDI6CitzPW0rMTsKK3BhZD10cnVlOworYnJlYWs7CitjYXNlIDM6CitjYXNlIDQ6CitjYXNlIDU6CitfZDQ2PV9kNDNbbC0zXTsKK2JyZWFrOworfQoraWYoX2Q0Nil7Cit2YXIgdHlwZT0oYz09IkwiKT8ic3RhbmRhbG9uZSI6ImZvcm1hdCI7Cit2YXIgcHJvcD1bIm1vbnRocyIsdHlwZSxfZDQ2XS5qb2luKCItIik7CitzPWluZm9bcHJvcF1bbV07Cit9CiticmVhazsKK2Nhc2UgInciOgordmFyIF9kNDk9MDsKK3M9ZG9qby5kYXRlLmdldFdlZWtPZlllYXIoX2QzYyxfZDQ5KTsKK3BhZD10cnVlOworYnJlYWs7CitjYXNlICJkIjoKK3M9X2QzYy5nZXREYXRlKCk7CitwYWQ9dHJ1ZTsKK2JyZWFrOworY2FzZSAiRCI6CitzPWRvam8uZGF0ZS5nZXREYXlPZlllYXIoX2QzYyk7CitwYWQ9dHJ1ZTsKK2JyZWFrOworY2FzZSAiRSI6CitjYXNlICJlIjoKK2Nhc2UgImMiOgordmFyIGQ9X2QzYy5nZXREYXkoKTsKK3ZhciBfZDQ2Oworc3dpdGNoKGwpeworY2FzZSAxOgorY2FzZSAyOgoraWYoYz09ImUiKXsKK3ZhciBfZDRiPWRvam8uZGF0ZS5nZXRGaXJzdERheU9mV2VlayhfZDNiLmxvY2FsZSk7CitkPShkLV9kNGIrNyklNzsKK30KK2lmKGMhPSJjIil7CitzPWQrMTsKK3BhZD10cnVlOworYnJlYWs7Cit9CitjYXNlIDM6CitjYXNlIDQ6CitjYXNlIDU6CitfZDQ2PV9kNDNbbC0zXTsKK2JyZWFrOworfQoraWYoX2Q0Nil7Cit2YXIgdHlwZT0oYz09ImMiKT8ic3RhbmRhbG9uZSI6ImZvcm1hdCI7Cit2YXIgcHJvcD1bImRheXMiLHR5cGUsX2Q0Nl0uam9pbigiLSIpOworcz1pbmZvW3Byb3BdW2RdOworfQorYnJlYWs7CitjYXNlICJhIjoKK3ZhciBfZDRjPShfZDNjLmdldEhvdXJzKCk8MTIpPyJhbSI6InBtIjsKK3M9aW5mb1tfZDRjXTsKK2JyZWFrOworY2FzZSAiaCI6CitjYXNlICJIIjoKK2Nhc2UgIksiOgorY2FzZSAiayI6Cit2YXIgaD1fZDNjLmdldEhvdXJzKCk7Citzd2l0Y2goYyl7CitjYXNlICJoIjoKK3M9KGglMTIpfHwxMjsKK2JyZWFrOworY2FzZSAiSCI6CitzPWg7CiticmVhazsKK2Nhc2UgIksiOgorcz0oaCUxMik7CiticmVhazsKK2Nhc2UgImsiOgorcz1ofHwyNDsKK2JyZWFrOworfQorcGFkPXRydWU7CiticmVhazsKK2Nhc2UgIm0iOgorcz1fZDNjLmdldE1pbnV0ZXMoKTsKK3BhZD10cnVlOworYnJlYWs7CitjYXNlICJzIjoKK3M9X2QzYy5nZXRTZWNvbmRzKCk7CitwYWQ9dHJ1ZTsKK2JyZWFrOworY2FzZSAiUyI6CitzPU1hdGgucm91bmQoX2QzYy5nZXRNaWxsaXNlY29uZHMoKSpNYXRoLnBvdygxMCxsLTMpKTsKK2JyZWFrOworY2FzZSAidiI6CitjYXNlICJ6IjoKK3M9ZG9qby5kYXRlLmdldFRpbWV6b25lTmFtZShfZDNjKTsKK2lmKHMpeworYnJlYWs7Cit9CitsPTQ7CitjYXNlICJaIjoKK3ZhciBfZDRlPV9kM2MuZ2V0VGltZXpvbmVPZmZzZXQoKTsKK3ZhciB0ej1bKF9kNGU8PTA/IisiOiItIiksZG9qby5zdHJpbmcucGFkKE1hdGguZmxvb3IoTWF0aC5hYnMoX2Q0ZSkvNjApLDIpLGRvam8uc3RyaW5nLnBhZChNYXRoLmFicyhfZDRlKSU2MCwyKV07CitpZihsPT00KXsKK3R6LnNwbGljZSgwLDAsIkdNVCIpOwordHouc3BsaWNlKDMsMCwiOiIpOworfQorcz10ei5qb2luKCIiKTsKK2JyZWFrOworY2FzZSAiWSI6CitjYXNlICJ1IjoKK2Nhc2UgIlciOgorY2FzZSAiRiI6CitjYXNlICJnIjoKK2Nhc2UgIkEiOgorZG9qby5kZWJ1ZyhfZDNlKyIgbW9kaWZpZXIgbm90IHlldCBpbXBsZW1lbnRlZCIpOworcz0iPyI7CiticmVhazsKK2RlZmF1bHQ6Citkb2pvLnJhaXNlKCJkb2pvLmRhdGUuZm9ybWF0OiBpbnZhbGlkIHBhdHRlcm4gY2hhcjogIitfZDNkKTsKK30KK2lmKHBhZCl7CitzPWRvam8uc3RyaW5nLnBhZChzLGwpOworfQorcmV0dXJuIHM7Cit9KTsKK30KK19kM2I9X2QzYnx8e307Cit2YXIgX2Q1MD1kb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKF9kM2IubG9jYWxlKTsKK3ZhciBfZDUxPV9kM2IuZm9ybWF0TGVuZ3RofHwiZnVsbCI7Cit2YXIgaW5mbz1kb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZShfZDUwKTsKK3ZhciBzdHI9W107Cit2YXIgX2Q1Mz1kb2pvLmxhbmcuY3VycnkodGhpcyxmb3JtYXRQYXR0ZXJuLF9kM2EpOworaWYoX2QzYi5zZWxlY3RvciE9InRpbWVPbmx5Iil7Cit2YXIgX2Q1ND1fZDNiLmRhdGVQYXR0ZXJufHxpbmZvWyJkYXRlRm9ybWF0LSIrX2Q1MV07CitpZihfZDU0KXsKK3N0ci5wdXNoKF9wcm9jZXNzUGF0dGVybihfZDU0LF9kNTMpKTsKK30KK30KK2lmKF9kM2Iuc2VsZWN0b3IhPSJkYXRlT25seSIpewordmFyIF9kNTU9X2QzYi50aW1lUGF0dGVybnx8aW5mb1sidGltZUZvcm1hdC0iK19kNTFdOworaWYoX2Q1NSl7CitzdHIucHVzaChfcHJvY2Vzc1BhdHRlcm4oX2Q1NSxfZDUzKSk7Cit9Cit9Cit2YXIgX2Q1Nj1zdHIuam9pbigiICIpOworcmV0dXJuIF9kNTY7Cit9OworZG9qby5kYXRlLnBhcnNlPWZ1bmN0aW9uKF9kNTcsX2Q1OCl7CitfZDU4PV9kNTh8fHt9OwordmFyIF9kNTk9ZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShfZDU4LmxvY2FsZSk7Cit2YXIgaW5mbz1kb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZShfZDU5KTsKK3ZhciBfZDViPV9kNTguZm9ybWF0TGVuZ3RofHwiZnVsbCI7CitpZighX2Q1OC5zZWxlY3Rvcil7CitfZDU4LnNlbGVjdG9yPSJkYXRlT25seSI7Cit9Cit2YXIgX2Q1Yz1fZDU4LmRhdGVQYXR0ZXJufHxpbmZvWyJkYXRlRm9ybWF0LSIrX2Q1Yl07Cit2YXIgX2Q1ZD1fZDU4LnRpbWVQYXR0ZXJufHxpbmZvWyJ0aW1lRm9ybWF0LSIrX2Q1Yl07Cit2YXIgX2Q1ZTsKK2lmKF9kNTguc2VsZWN0b3I9PSJkYXRlT25seSIpeworX2Q1ZT1fZDVjOworfWVsc2V7CitpZihfZDU4LnNlbGVjdG9yPT0idGltZU9ubHkiKXsKK19kNWU9X2Q1ZDsKK31lbHNleworaWYoX2Q1OC5zZWxlY3Rvcj09ImRhdGVUaW1lIil7CitfZDVlPV9kNWMrIiAiK19kNWQ7Cit9ZWxzZXsKK3ZhciBtc2c9ImRvam8uZGF0ZS5wYXJzZTogVW5rbm93biBzZWxlY3RvciBwYXJhbSBwYXNzZWQ6ICciK19kNTguc2VsZWN0b3IrIicuIjsKK21zZys9IiBEZWZhdWx0aW5nIHRvIGRhdGUgcGF0dGVybi4iOworZG9qby5kZWJ1Zyhtc2cpOworX2Q1ZT1fZDVjOworfQorfQorfQordmFyIF9kNjA9W107Cit2YXIgX2Q2MT1fcHJvY2Vzc1BhdHRlcm4oX2Q1ZSxkb2pvLmxhbmcuY3VycnkodGhpcyxfYnVpbGREYXRlVGltZVJFLF9kNjAsaW5mbyxfZDU4KSk7Cit2YXIgX2Q2Mj1uZXcgUmVnRXhwKCJeIitfZDYxKyIkIik7Cit2YXIgX2Q2Mz1fZDYyLmV4ZWMoX2Q1Nyk7CitpZighX2Q2Myl7CityZXR1cm4gbnVsbDsKK30KK3ZhciBfZDY0PVsiYWJiciIsIndpZGUiLCJuYXJyb3ciXTsKK3ZhciBfZDY1PW5ldyBEYXRlKDE5NzIsMCk7Cit2YXIgX2Q2Nj17fTsKK2Zvcih2YXIgaT0xO2k8X2Q2My5sZW5ndGg7aSsrKXsKK3ZhciBncnA9X2Q2MFtpLTFdOwordmFyIGw9Z3JwLmxlbmd0aDsKK3ZhciB2PV9kNjNbaV07Citzd2l0Y2goZ3JwLmNoYXJBdCgwKSl7CitjYXNlICJ5IjoKK2lmKGwhPTIpeworX2Q2NS5zZXRGdWxsWWVhcih2KTsKK19kNjYueWVhcj12OworfWVsc2V7CitpZih2PDEwMCl7Cit2PU51bWJlcih2KTsKK3ZhciB5ZWFyPSIiK25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTsKK3ZhciBfZDZjPXllYXIuc3Vic3RyaW5nKDAsMikqMTAwOwordmFyIF9kNmQ9TnVtYmVyKHllYXIuc3Vic3RyaW5nKDIsNCkpOwordmFyIF9kNmU9TWF0aC5taW4oX2Q2ZCsyMCw5OSk7Cit2YXIgbnVtPSh2PF9kNmUpP19kNmMrdjpfZDZjLTEwMCt2OworX2Q2NS5zZXRGdWxsWWVhcihudW0pOworX2Q2Ni55ZWFyPW51bTsKK31lbHNleworaWYoX2Q1OC5zdHJpY3QpeworcmV0dXJuIG51bGw7Cit9CitfZDY1LnNldEZ1bGxZZWFyKHYpOworX2Q2Ni55ZWFyPXY7Cit9Cit9CiticmVhazsKK2Nhc2UgIk0iOgoraWYobD4yKXsKK2lmKCFfZDU4LnN0cmljdCl7Cit2PXYucmVwbGFjZSgvXC4vZywiIik7Cit2PXYudG9Mb3dlckNhc2UoKTsKK30KK3ZhciBfZDcwPWluZm9bIm1vbnRocy1mb3JtYXQtIitfZDY0W2wtM11dLmNvbmNhdCgpOworZm9yKHZhciBqPTA7ajxfZDcwLmxlbmd0aDtqKyspeworaWYoIV9kNTguc3RyaWN0KXsKK19kNzBbal09X2Q3MFtqXS50b0xvd2VyQ2FzZSgpOworfQoraWYodj09X2Q3MFtqXSl7CitfZDY1LnNldE1vbnRoKGopOworX2Q2Ni5tb250aD1qOworYnJlYWs7Cit9Cit9CitpZihqPT1fZDcwLmxlbmd0aCl7Citkb2pvLmRlYnVnKCJkb2pvLmRhdGUucGFyc2U6IENvdWxkIG5vdCBwYXJzZSBtb250aCBuYW1lOiAnIit2KyInLiIpOworcmV0dXJuIG51bGw7Cit9Cit9ZWxzZXsKK19kNjUuc2V0TW9udGgodi0xKTsKK19kNjYubW9udGg9di0xOworfQorYnJlYWs7CitjYXNlICJFIjoKK2Nhc2UgImUiOgoraWYoIV9kNTguc3RyaWN0KXsKK3Y9di50b0xvd2VyQ2FzZSgpOworfQordmFyIGRheXM9aW5mb1siZGF5cy1mb3JtYXQtIitfZDY0W2wtM11dLmNvbmNhdCgpOworZm9yKHZhciBqPTA7ajxkYXlzLmxlbmd0aDtqKyspeworaWYoIV9kNTguc3RyaWN0KXsKK2RheXNbal09ZGF5c1tqXS50b0xvd2VyQ2FzZSgpOworfQoraWYodj09ZGF5c1tqXSl7CiticmVhazsKK30KK30KK2lmKGo9PWRheXMubGVuZ3RoKXsKK2Rvam8uZGVidWcoImRvam8uZGF0ZS5wYXJzZTogQ291bGQgbm90IHBhcnNlIHdlZWtkYXkgbmFtZTogJyIrdisiJy4iKTsKK3JldHVybiBudWxsOworfQorYnJlYWs7CitjYXNlICJkIjoKK19kNjUuc2V0RGF0ZSh2KTsKK19kNjYuZGF0ZT12OworYnJlYWs7CitjYXNlICJhIjoKK3ZhciBhbT1fZDU4LmFtfHxpbmZvLmFtOwordmFyIHBtPV9kNTgucG18fGluZm8ucG07CitpZighX2Q1OC5zdHJpY3Qpewordj12LnJlcGxhY2UoL1wuL2csIiIpLnRvTG93ZXJDYXNlKCk7CithbT1hbS5yZXBsYWNlKC9cLi9nLCIiKS50b0xvd2VyQ2FzZSgpOworcG09cG0ucmVwbGFjZSgvXC4vZywiIikudG9Mb3dlckNhc2UoKTsKK30KK2lmKF9kNTguc3RyaWN0JiZ2IT1hbSYmdiE9cG0peworZG9qby5kZWJ1ZygiZG9qby5kYXRlLnBhcnNlOiBDb3VsZCBub3QgcGFyc2UgYW0vcG0gcGFydC4iKTsKK3JldHVybiBudWxsOworfQordmFyIF9kNzU9X2Q2NS5nZXRIb3VycygpOworaWYodj09cG0mJl9kNzU8MTIpeworX2Q2NS5zZXRIb3VycyhfZDc1KzEyKTsKK31lbHNleworaWYodj09YW0mJl9kNzU9PTEyKXsKK19kNjUuc2V0SG91cnMoMCk7Cit9Cit9CiticmVhazsKK2Nhc2UgIksiOgoraWYodj09MjQpewordj0wOworfQorY2FzZSAiaCI6CitjYXNlICJIIjoKK2Nhc2UgImsiOgoraWYodj4yMyl7Citkb2pvLmRlYnVnKCJkb2pvLmRhdGUucGFyc2U6IElsbGVnYWwgaG91cnMgdmFsdWUiKTsKK3JldHVybiBudWxsOworfQorX2Q2NS5zZXRIb3Vycyh2KTsKK2JyZWFrOworY2FzZSAibSI6CitfZDY1LnNldE1pbnV0ZXModik7CiticmVhazsKK2Nhc2UgInMiOgorX2Q2NS5zZXRTZWNvbmRzKHYpOworYnJlYWs7CitjYXNlICJTIjoKK19kNjUuc2V0TWlsbGlzZWNvbmRzKHYpOworYnJlYWs7CitkZWZhdWx0OgorZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUucGFyc2U6IHVuc3VwcG9ydGVkIHBhdHRlcm4gY2hhcj0iK2dycC5jaGFyQXQoMCkpOworfQorfQoraWYoX2Q2Ni55ZWFyJiZfZDY1LmdldEZ1bGxZZWFyKCkhPV9kNjYueWVhcil7Citkb2pvLmRlYnVnKCJQYXJzZWQgeWVhcjogJyIrX2Q2NS5nZXRGdWxsWWVhcigpKyInIGRpZCBub3QgbWF0Y2ggaW5wdXQgeWVhcjogJyIrX2Q2Ni55ZWFyKyInLiIpOworcmV0dXJuIG51bGw7Cit9CitpZihfZDY2Lm1vbnRoJiZfZDY1LmdldE1vbnRoKCkhPV9kNjYubW9udGgpeworZG9qby5kZWJ1ZygiUGFyc2VkIG1vbnRoOiAnIitfZDY1LmdldE1vbnRoKCkrIicgZGlkIG5vdCBtYXRjaCBpbnB1dCBtb250aDogJyIrX2Q2Ni5tb250aCsiJy4iKTsKK3JldHVybiBudWxsOworfQoraWYoX2Q2Ni5kYXRlJiZfZDY1LmdldERhdGUoKSE9X2Q2Ni5kYXRlKXsKK2Rvam8uZGVidWcoIlBhcnNlZCBkYXkgb2YgbW9udGg6ICciK19kNjUuZ2V0RGF0ZSgpKyInIGRpZCBub3QgbWF0Y2ggaW5wdXQgZGF5IG9mIG1vbnRoOiAnIitfZDY2LmRhdGUrIicuIik7CityZXR1cm4gbnVsbDsKK30KK3JldHVybiBfZDY1OworfTsKK2Z1bmN0aW9uIF9wcm9jZXNzUGF0dGVybihfZDc2LF9kNzcsX2Q3OCxfZDc5KXsKK3ZhciBfZDdhPWZ1bmN0aW9uKHgpeworcmV0dXJuIHg7Cit9OworX2Q3Nz1fZDc3fHxfZDdhOworX2Q3OD1fZDc4fHxfZDdhOworX2Q3OT1fZDc5fHxfZDdhOwordmFyIF9kN2M9X2Q3Ni5tYXRjaCgvKCcnfFteJ10pKy9nKTsKK3ZhciBfZDdkPWZhbHNlOworZm9yKHZhciBpPTA7aTxfZDdjLmxlbmd0aDtpKyspeworaWYoIV9kN2NbaV0peworX2Q3Y1tpXT0iIjsKK31lbHNleworX2Q3Y1tpXT0oX2Q3ZD9fZDc4Ol9kNzcpKF9kN2NbaV0pOworX2Q3ZD0hX2Q3ZDsKK30KK30KK3JldHVybiBfZDc5KF9kN2Muam9pbigiIikpOworfQorZnVuY3Rpb24gX2J1aWxkRGF0ZVRpbWVSRShfZDdmLGluZm8sX2Q4MSxfZDgyKXsKK3JldHVybiBfZDgyLnJlcGxhY2UoLyhbYS16XSlcMSovaWcsZnVuY3Rpb24oX2Q4Myl7Cit2YXIgczsKK3ZhciBjPV9kODMuY2hhckF0KDApOwordmFyIGw9X2Q4My5sZW5ndGg7Citzd2l0Y2goYyl7CitjYXNlICJ5IjoKK3M9IlxcZCIrKChsPT0yKT8iezIsNH0iOiIrIik7CiticmVhazsKK2Nhc2UgIk0iOgorcz0obD4yKT8iXFxTKyI6IlxcZHsxLDJ9IjsKK2JyZWFrOworY2FzZSAiZCI6CitzPSJcXGR7MSwyfSI7CiticmVhazsKK2Nhc2UgIkUiOgorcz0iXFxTKyI7CiticmVhazsKK2Nhc2UgImgiOgorY2FzZSAiSCI6CitjYXNlICJLIjoKK2Nhc2UgImsiOgorcz0iXFxkezEsMn0iOworYnJlYWs7CitjYXNlICJtIjoKK2Nhc2UgInMiOgorcz0iWzAtNV1cXGQiOworYnJlYWs7CitjYXNlICJTIjoKK3M9IlxcZHsxLDN9IjsKK2JyZWFrOworY2FzZSAiYSI6Cit2YXIgYW09X2Q4MS5hbXx8aW5mby5hbXx8IkFNIjsKK3ZhciBwbT1fZDgxLnBtfHxpbmZvLnBtfHwiUE0iOworaWYoX2Q4MS5zdHJpY3Qpeworcz1hbSsifCIrcG07Cit9ZWxzZXsKK3M9YW07CitzKz0oYW0hPWFtLnRvTG93ZXJDYXNlKCkpPyJ8IithbS50b0xvd2VyQ2FzZSgpOiIiOworcys9InwiOworcys9KHBtIT1wbS50b0xvd2VyQ2FzZSgpKT9wbSsifCIrcG0udG9Mb3dlckNhc2UoKTpwbTsKK30KK2JyZWFrOworZGVmYXVsdDoKK2Rvam8udW5pbXBsZW1lbnRlZCgicGFyc2Ugb2YgZGF0ZSBmb3JtYXQsIHBhdHRlcm49IitfZDgyKTsKK30KK2lmKF9kN2YpeworX2Q3Zi5wdXNoKF9kODMpOworfQorcmV0dXJuICJcXHMqKCIrcysiKVxccyoiOworfSk7Cit9Cit9KSgpOworZG9qby5kYXRlLnN0cmZ0aW1lPWZ1bmN0aW9uKF9kODksX2Q4YSxfZDhiKXsKK3ZhciBfZDhjPW51bGw7CitmdW5jdGlvbiBfKHMsbil7CityZXR1cm4gZG9qby5zdHJpbmcucGFkKHMsbnx8MixfZDhjfHwiMCIpOworfQordmFyIGluZm89ZG9qby5kYXRlLl9nZXRHcmVnb3JpYW5CdW5kbGUoX2Q4Yik7CitmdW5jdGlvbiAkKF9kOTApeworc3dpdGNoKF9kOTApeworY2FzZSAiYSI6CityZXR1cm4gZG9qby5kYXRlLmdldERheVNob3J0TmFtZShfZDg5LF9kOGIpOworY2FzZSAiQSI6CityZXR1cm4gZG9qby5kYXRlLmdldERheU5hbWUoX2Q4OSxfZDhiKTsKK2Nhc2UgImIiOgorY2FzZSAiaCI6CityZXR1cm4gZG9qby5kYXRlLmdldE1vbnRoU2hvcnROYW1lKF9kODksX2Q4Yik7CitjYXNlICJCIjoKK3JldHVybiBkb2pvLmRhdGUuZ2V0TW9udGhOYW1lKF9kODksX2Q4Yik7CitjYXNlICJjIjoKK3JldHVybiBkb2pvLmRhdGUuZm9ybWF0KF9kODkse2xvY2FsZTpfZDhifSk7CitjYXNlICJDIjoKK3JldHVybiBfKE1hdGguZmxvb3IoX2Q4OS5nZXRGdWxsWWVhcigpLzEwMCkpOworY2FzZSAiZCI6CityZXR1cm4gXyhfZDg5LmdldERhdGUoKSk7CitjYXNlICJEIjoKK3JldHVybiAkKCJtIikrIi8iKyQoImQiKSsiLyIrJCgieSIpOworY2FzZSAiZSI6CitpZihfZDhjPT1udWxsKXsKK19kOGM9IiAiOworfQorcmV0dXJuIF8oX2Q4OS5nZXREYXRlKCkpOworY2FzZSAiZiI6CitpZihfZDhjPT1udWxsKXsKK19kOGM9IiAiOworfQorcmV0dXJuIF8oX2Q4OS5nZXRNb250aCgpKzEpOworY2FzZSAiZyI6CiticmVhazsKK2Nhc2UgIkciOgorZG9qby51bmltcGxlbWVudGVkKCJ1bmltcGxlbWVudGVkIG1vZGlmaWVyICdHJyIpOworYnJlYWs7CitjYXNlICJGIjoKK3JldHVybiAkKCJZIikrIi0iKyQoIm0iKSsiLSIrJCgiZCIpOworY2FzZSAiSCI6CityZXR1cm4gXyhfZDg5LmdldEhvdXJzKCkpOworY2FzZSAiSSI6CityZXR1cm4gXyhfZDg5LmdldEhvdXJzKCklMTJ8fDEyKTsKK2Nhc2UgImoiOgorcmV0dXJuIF8oZG9qby5kYXRlLmdldERheU9mWWVhcihfZDg5KSwzKTsKK2Nhc2UgImsiOgoraWYoX2Q4Yz09bnVsbCl7CitfZDhjPSIgIjsKK30KK3JldHVybiBfKF9kODkuZ2V0SG91cnMoKSk7CitjYXNlICJsIjoKK2lmKF9kOGM9PW51bGwpeworX2Q4Yz0iICI7Cit9CityZXR1cm4gXyhfZDg5LmdldEhvdXJzKCklMTJ8fDEyKTsKK2Nhc2UgIm0iOgorcmV0dXJuIF8oX2Q4OS5nZXRNb250aCgpKzEpOworY2FzZSAiTSI6CityZXR1cm4gXyhfZDg5LmdldE1pbnV0ZXMoKSk7CitjYXNlICJuIjoKK3JldHVybiAiXG4iOworY2FzZSAicCI6CityZXR1cm4gaW5mb1tfZDg5LmdldEhvdXJzKCk8MTI/ImFtIjoicG0iXTsKK2Nhc2UgInIiOgorcmV0dXJuICQoIkkiKSsiOiIrJCgiTSIpKyI6IiskKCJTIikrIiAiKyQoInAiKTsKK2Nhc2UgIlIiOgorcmV0dXJuICQoIkgiKSsiOiIrJCgiTSIpOworY2FzZSAiUyI6CityZXR1cm4gXyhfZDg5LmdldFNlY29uZHMoKSk7CitjYXNlICJ0IjoKK3JldHVybiAiXHQiOworY2FzZSAiVCI6CityZXR1cm4gJCgiSCIpKyI6IiskKCJNIikrIjoiKyQoIlMiKTsKK2Nhc2UgInUiOgorcmV0dXJuIFN0cmluZyhfZDg5LmdldERheSgpfHw3KTsKK2Nhc2UgIlUiOgorcmV0dXJuIF8oZG9qby5kYXRlLmdldFdlZWtPZlllYXIoX2Q4OSkpOworY2FzZSAiViI6CityZXR1cm4gXyhkb2pvLmRhdGUuZ2V0SXNvV2Vla09mWWVhcihfZDg5KSk7CitjYXNlICJXIjoKK3JldHVybiBfKGRvam8uZGF0ZS5nZXRXZWVrT2ZZZWFyKF9kODksMSkpOworY2FzZSAidyI6CityZXR1cm4gU3RyaW5nKF9kODkuZ2V0RGF5KCkpOworY2FzZSAieCI6CityZXR1cm4gZG9qby5kYXRlLmZvcm1hdChfZDg5LHtzZWxlY3RvcjoiZGF0ZU9ubHkiLGxvY2FsZTpfZDhifSk7CitjYXNlICJYIjoKK3JldHVybiBkb2pvLmRhdGUuZm9ybWF0KF9kODkse3NlbGVjdG9yOiJ0aW1lT25seSIsbG9jYWxlOl9kOGJ9KTsKK2Nhc2UgInkiOgorcmV0dXJuIF8oX2Q4OS5nZXRGdWxsWWVhcigpJTEwMCk7CitjYXNlICJZIjoKK3JldHVybiBTdHJpbmcoX2Q4OS5nZXRGdWxsWWVhcigpKTsKK2Nhc2UgInoiOgordmFyIF9kOTE9X2Q4OS5nZXRUaW1lem9uZU9mZnNldCgpOworcmV0dXJuIChfZDkxPjA/Ii0iOiIrIikrXyhNYXRoLmZsb29yKE1hdGguYWJzKF9kOTEpLzYwKSkrIjoiK18oTWF0aC5hYnMoX2Q5MSklNjApOworY2FzZSAiWiI6CityZXR1cm4gZG9qby5kYXRlLmdldFRpbWV6b25lTmFtZShfZDg5KTsKK2Nhc2UgIiUiOgorcmV0dXJuICIlIjsKK30KK30KK3ZhciBfZDkyPSIiOwordmFyIGk9MDsKK3ZhciBfZDk0PTA7Cit2YXIgX2Q5NT1udWxsOword2hpbGUoKF9kOTQ9X2Q4YS5pbmRleE9mKCIlIixpKSkhPS0xKXsKK19kOTIrPV9kOGEuc3Vic3RyaW5nKGksX2Q5NCsrKTsKK3N3aXRjaChfZDhhLmNoYXJBdChfZDk0KyspKXsKK2Nhc2UgIl8iOgorX2Q4Yz0iICI7CiticmVhazsKK2Nhc2UgIi0iOgorX2Q4Yz0iIjsKK2JyZWFrOworY2FzZSAiMCI6CitfZDhjPSIwIjsKK2JyZWFrOworY2FzZSAiXiI6CitfZDk1PSJ1cHBlciI7CiticmVhazsKK2Nhc2UgIioiOgorX2Q5NT0ibG93ZXIiOworYnJlYWs7CitjYXNlICIjIjoKK19kOTU9InN3YXAiOworYnJlYWs7CitkZWZhdWx0OgorX2Q4Yz1udWxsOworX2Q5NC0tOworYnJlYWs7Cit9Cit2YXIgX2Q5Nj0kKF9kOGEuY2hhckF0KF9kOTQrKykpOworc3dpdGNoKF9kOTUpeworY2FzZSAidXBwZXIiOgorX2Q5Nj1fZDk2LnRvVXBwZXJDYXNlKCk7CiticmVhazsKK2Nhc2UgImxvd2VyIjoKK19kOTY9X2Q5Ni50b0xvd2VyQ2FzZSgpOworYnJlYWs7CitjYXNlICJzd2FwIjoKK3ZhciBfZDk3PV9kOTYudG9Mb3dlckNhc2UoKTsKK3ZhciBfZDk4PSIiOwordmFyIGo9MDsKK3ZhciBjaD0iIjsKK3doaWxlKGo8X2Q5Ni5sZW5ndGgpeworY2g9X2Q5Ni5jaGFyQXQoaik7CitfZDk4Kz0oY2g9PV9kOTcuY2hhckF0KGopKT9jaC50b1VwcGVyQ2FzZSgpOmNoLnRvTG93ZXJDYXNlKCk7CitqKys7Cit9CitfZDk2PV9kOTg7CiticmVhazsKK2RlZmF1bHQ6CiticmVhazsKK30KK19kOTU9bnVsbDsKK19kOTIrPV9kOTY7CitpPV9kOTQ7Cit9CitfZDkyKz1fZDhhLnN1YnN0cmluZyhpKTsKK3JldHVybiBfZDkyOworfTsKKyhmdW5jdGlvbigpewordmFyIF9kOWI9W107Citkb2pvLmRhdGUuYWRkQ3VzdG9tRm9ybWF0cz1mdW5jdGlvbihfZDljLF9kOWQpeworX2Q5Yi5wdXNoKHtwa2c6X2Q5YyxuYW1lOl9kOWR9KTsKK307Citkb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZT1mdW5jdGlvbihfZDllKXsKK3ZhciBfZDlmPXt9OworZG9qby5sYW5nLmZvckVhY2goX2Q5YixmdW5jdGlvbihkZXNjKXsKK3ZhciBfZGExPWRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oZGVzYy5wa2csZGVzYy5uYW1lLF9kOWUpOworX2Q5Zj1kb2pvLmxhbmcubWl4aW4oX2Q5ZixfZGExKTsKK30sdGhpcyk7CityZXR1cm4gX2Q5ZjsKK307Cit9KSgpOworZG9qby5kYXRlLmFkZEN1c3RvbUZvcm1hdHMoImRvam8uaTE4bi5jYWxlbmRhciIsImdyZWdvcmlhbiIpOworZG9qby5kYXRlLmFkZEN1c3RvbUZvcm1hdHMoImRvam8uaTE4bi5jYWxlbmRhciIsImdyZWdvcmlhbkV4dHJhcyIpOworZG9qby5kYXRlLmdldE5hbWVzPWZ1bmN0aW9uKGl0ZW0sdHlwZSx1c2UsX2RhNSl7Cit2YXIgX2RhNjsKK3ZhciBfZGE3PWRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKF9kYTUpOwordmFyIF9kYTg9W2l0ZW0sdXNlLHR5cGVdOworaWYodXNlPT0ic3RhbmRBbG9uZSIpeworX2RhNj1fZGE3W19kYTguam9pbigiLSIpXTsKK30KK19kYThbMV09ImZvcm1hdCI7CityZXR1cm4gKF9kYTZ8fF9kYTdbX2RhOC5qb2luKCItIildKS5jb25jYXQoKTsKK307Citkb2pvLmRhdGUuZ2V0RGF5TmFtZT1mdW5jdGlvbihfZGE5LF9kYWEpeworcmV0dXJuIGRvam8uZGF0ZS5nZXROYW1lcygiZGF5cyIsIndpZGUiLCJmb3JtYXQiLF9kYWEpW19kYTkuZ2V0RGF5KCldOworfTsKK2Rvam8uZGF0ZS5nZXREYXlTaG9ydE5hbWU9ZnVuY3Rpb24oX2RhYixfZGFjKXsKK3JldHVybiBkb2pvLmRhdGUuZ2V0TmFtZXMoImRheXMiLCJhYmJyIiwiZm9ybWF0IixfZGFjKVtfZGFiLmdldERheSgpXTsKK307Citkb2pvLmRhdGUuZ2V0TW9udGhOYW1lPWZ1bmN0aW9uKF9kYWQsX2RhZSl7CityZXR1cm4gZG9qby5kYXRlLmdldE5hbWVzKCJtb250aHMiLCJ3aWRlIiwiZm9ybWF0IixfZGFlKVtfZGFkLmdldE1vbnRoKCldOworfTsKK2Rvam8uZGF0ZS5nZXRNb250aFNob3J0TmFtZT1mdW5jdGlvbihfZGFmLF9kYjApeworcmV0dXJuIGRvam8uZGF0ZS5nZXROYW1lcygibW9udGhzIiwiYWJiciIsImZvcm1hdCIsX2RiMClbX2RhZi5nZXRNb250aCgpXTsKK307Citkb2pvLmRhdGUudG9SZWxhdGl2ZVN0cmluZz1mdW5jdGlvbihfZGIxKXsKK3ZhciBub3c9bmV3IERhdGUoKTsKK3ZhciBkaWZmPShub3ctX2RiMSkvMTAwMDsKK3ZhciBlbmQ9IiBhZ28iOwordmFyIF9kYjU9ZmFsc2U7CitpZihkaWZmPDApeworX2RiNT10cnVlOworZW5kPSIgZnJvbSBub3ciOworZGlmZj0tZGlmZjsKK30KK2lmKGRpZmY8NjApeworZGlmZj1NYXRoLnJvdW5kKGRpZmYpOworcmV0dXJuIGRpZmYrIiBzZWNvbmQiKyhkaWZmPT0xPyIiOiJzIikrZW5kOworfQoraWYoZGlmZjw2MCo2MCl7CitkaWZmPU1hdGgucm91bmQoZGlmZi82MCk7CityZXR1cm4gZGlmZisiIG1pbnV0ZSIrKGRpZmY9PTE/IiI6InMiKStlbmQ7Cit9CitpZihkaWZmPDYwKjYwKjI0KXsKK2RpZmY9TWF0aC5yb3VuZChkaWZmLzM2MDApOworcmV0dXJuIGRpZmYrIiBob3VyIisoZGlmZj09MT8iIjoicyIpK2VuZDsKK30KK2lmKGRpZmY8NjAqNjAqMjQqNyl7CitkaWZmPU1hdGgucm91bmQoZGlmZi8oMzYwMCoyNCkpOworaWYoZGlmZj09MSl7CityZXR1cm4gX2RiNT8iVG9tb3Jyb3ciOiJZZXN0ZXJkYXkiOworfWVsc2V7CityZXR1cm4gZGlmZisiIGRheXMiK2VuZDsKK30KK30KK3JldHVybiBkb2pvLmRhdGUuZm9ybWF0KF9kYjEpOworfTsKK2Rvam8uZGF0ZS50b1NxbD1mdW5jdGlvbihfZGI2LF9kYjcpeworcmV0dXJuIGRvam8uZGF0ZS5zdHJmdGltZShfZGI2LCIlRiIrIV9kYjc/IiAlVCI6IiIpOworfTsKK2Rvam8uZGF0ZS5mcm9tU3FsPWZ1bmN0aW9uKF9kYjgpewordmFyIF9kYjk9X2RiOC5zcGxpdCgvW1wtIDpdL2cpOword2hpbGUoX2RiOS5sZW5ndGg8Nil7CitfZGI5LnB1c2goMCk7Cit9CityZXR1cm4gbmV3IERhdGUoX2RiOVswXSwocGFyc2VJbnQoX2RiOVsxXSwxMCktMSksX2RiOVsyXSxfZGI5WzNdLF9kYjlbNF0sX2RiOVs1XSk7Cit9OworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UaW1lUGlja2VyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRpbWVQaWNrZXIiLGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsZnVuY3Rpb24oKXsKK3RoaXMudGltZT0iIjsKK3RoaXMudXNlRGVmYXVsdFRpbWU9ZmFsc2U7Cit0aGlzLnVzZURlZmF1bHRNaW51dGVzPWZhbHNlOwordGhpcy5zdG9yZWRUaW1lPSIiOwordGhpcy5jdXJyZW50VGltZT17fTsKK3RoaXMuY2xhc3NOYW1lcz17c2VsZWN0ZWRUaW1lOiJzZWxlY3RlZEl0ZW0ifTsKK3RoaXMuYW55PSJhbnkiOwordGhpcy5zZWxlY3RlZFRpbWU9e2hvdXI6IiIsbWludXRlOiIiLGFtUG06IiIsYW55VGltZTpmYWxzZX07Cit0aGlzLmhvdXJJbmRleE1hcD1bIiIsMiw0LDYsOCwxMCwxLDMsNSw3LDksMTEsMF07Cit0aGlzLm1pbnV0ZUluZGV4TWFwPVswLDIsNCw2LDgsMTAsMSwzLDUsNyw5LDExXTsKK30se2lzQ29udGFpbmVyOmZhbHNlLHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwidGltZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInRpbWVQaWNrZXJDb250YWluZXJOb2RlXCI+XHJcblx0PHRhYmxlIGNsYXNzPVwidGltZUNvbnRhaW5lclwiIGNlbGxzcGFjaW5nPVwiMFwiID5cclxuXHRcdDx0aGVhZD5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cInRpbWVDb3JuZXIgY29ybmVyVG9wTGVmdFwiIHZhbGlnbj1cInRvcFwiPiZuYnNwOzwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZUxhYmVsQ29udGFpbmVyIGhvdXJTZWxlY3RvclwiPiR7dGhpcy5jYWxlbmRhci5maWVsZC1ob3VyfTwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZUxhYmVsQ29udGFpbmVyIG1pbnV0ZXNIZWFkaW5nXCI+JHt0aGlzLmNhbGVuZGFyLmZpZWxkLW1pbnV0ZX08L3RkPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cInRpbWVDb3JuZXIgY29ybmVyVG9wUmlnaHRcIiB2YWxpZ249XCJ0b3BcIj4mbmJzcDs8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90aGVhZD5cclxuXHRcdDx0Ym9keT5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCB2YWxpZ249XCJ0b3BcIiBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiaG91cnNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBhbGlnbj1cImNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHQ8dGJvZHkgZG9qb0F0dGFjaFBvaW50PVwiaG91ckNvbnRhaW5lck5vZGVcIiAgXHJcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZEhvdXI7XCI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjEyPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD42PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD43PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4yPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD44PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4zPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD45PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD40PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xMDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+NTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTE8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdDwvdGJvZHk+XHJcblx0XHRcdFx0XHQ8L3RhYmxlPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiIGNsYXNzPVwibWludXRlc1wiIGNvbHNwYW49XCIyXCI+XHJcblx0XHRcdFx0XHQ8dGFibGUgYWxpZ249XCJjZW50ZXJcIj5cclxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cIm1pbnV0ZUNvbnRhaW5lck5vZGVcIiBcclxuXHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkTWludXRlO1wiPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4wMDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MzA8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjA1PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4zNTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTA8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjQwPC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xNTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+NDU8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjIwPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD41MDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MjU8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjU1PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHQ8L3Rib2R5PlxyXG5cdFx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8dHI+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwiY29ybmVyQm90dG9tTGVmdFwiPiZuYnNwOzwvdGQ+XHJcblx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiIGNsYXNzPVwidGltZU9wdGlvbnNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBjbGFzcz1cImFtUG1Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cImFtUG1Db250YWluZXJOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZEFtUG07XCI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkIGlkPVwiYW1cIj4ke3RoaXMuY2FsZW5kYXIuYW19PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBpZD1cInBtXCI+JHt0aGlzLmNhbGVuZGFyLnBtfTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJ0aW1lT3B0aW9uc1wiPlxyXG5cdFx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJhbnlUaW1lQ29udGFpbmVyTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkQW55VGltZTtcIiBcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJhbnlUaW1lQ29udGFpbmVyXCI+JHt0aGlzLndpZGdldFN0cmluZ3MuYW55fTwvZGl2PlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwiY29ybmVyQm90dG9tUmlnaHRcIj4mbmJzcDs8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Ym9keT5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIix0ZW1wbGF0ZUNzc1N0cmluZzoiLypUaW1lIFBpY2tlciAqL1xyXG4udGltZVBpY2tlckNvbnRhaW5lciB7XHJcblx0d2lkdGg6MTIycHg7XHJcblx0Zm9udC1mYW1pbHk6VGFob21hLCBNeXJpYWQsIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XHJcblx0Zm9udC1zaXplOjE2cHg7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHtcclxuXHRib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XHJcblx0Ym9yZGVyLXNwYWNpbmc6MDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQge1xyXG5cdGNvbG9yOiMyOTNhNGI7XHJcblx0Zm9udC1zaXplOjAuOWVtO1xyXG5cdGZvbnQtd2VpZ2h0OjcwMDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQgdGQge1xyXG5cdHBhZGRpbmc6MC4yNWVtO1xyXG5cdGZvbnQtc2l6ZTowLjgwZW07XHJcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzY3ODJBODtcclxufVxyXG5cclxuLnRpbWVDb3JuZXIge1xyXG5cdHdpZHRoOjEwcHg7XHJcbn1cclxuXHJcbi5jb3JuZXJUb3BMZWZ0IHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZVRMLnBuZ1wiKSB0b3AgbGVmdCBuby1yZXBlYXQ7XHJcbn1cclxuXHJcbi5jb3JuZXJUb3BSaWdodCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUUi5wbmdcIikgdG9wIHJpZ2h0IG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnRpbWVMYWJlbENvbnRhaW5lciB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwTW9udGhCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi5ob3VycywgLm1pbnV0ZXMsIC50aW1lQm9yZGVyIHtcclxuXHRiYWNrZ3JvdW5kOiAjNzU5MWJjIHVybChcImltYWdlcy9kcEJnLmdpZlwiKSB0b3AgbGVmdCByZXBlYXQteDtcclxuXHJcbn1cclxuXHJcbi5ob3VycyB0ZCwgLm1pbnV0ZXMgdGQge1xyXG5cdHBhZGRpbmc6MC4yZW07XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC1zaXplOjAuN2VtO1xyXG5cdGZvbnQtd2VpZ2h0OmJvbGQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7XHJcblx0Y3Vyc29yOmhhbmQ7XHJcblx0Y29sb3I6I2ZmZjtcclxufVxyXG5cclxuLm1pbnV0ZXMge1xyXG5cdGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZjVkMWRiO1xyXG59XHJcblxyXG4uaG91cnMge1xyXG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgIzY3ODJBODtcclxufVxyXG5cclxuLmhvdXJTZWxlY3RvciB7XHJcblx0Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNjc4MkE4O1xyXG5cdHBhZGRpbmc6NXB4O1xyXG5cdHBhZGRpbmctcmlnaHQ6MTBweDtcclxufVxyXG5cclxuLm1pbnV0ZXNTZWxlY3RvciB7XHJcblx0cGFkZGluZzo1cHg7XHJcblx0Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNmNWM3ZDQ7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcbn1cclxuXHJcbi5taW51dGVzSGVhZGluZyB7XHJcblx0cGFkZGluZy1sZWZ0OjlweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udGltZU9wdGlvbnMge1xyXG5cdGJhY2tncm91bmQtY29sb3I6I0Y5QzlENztcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgLmNvcm5lckJvdHRvbUxlZnQsIC50aW1lQ29udGFpbmVyIC5jb3JuZXJCb3R0b21SaWdodCwgLnRpbWVDb250YWluZXIgLnRpbWVPcHRpb25zIHtcclxuXHRib3JkZXItdG9wOjFweCBzb2xpZCAjNjc4MkE4O1xyXG59XHJcblxyXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tTGVmdCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCTC5wbmdcIikgYm90dG9tIGxlZnQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7XHJcblx0d2lkdGg6OXB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzowO1xyXG5cdG1hcmdpbjowO1xyXG59XHJcblxyXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tUmlnaHQge1xyXG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEN1cnZlQlIucG5nXCIpIGJvdHRvbSByaWdodCBuby1yZXBlYXQgIWltcG9ydGFudDtcclxuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcclxuXHRwYWRkaW5nOjA7XHJcblx0bWFyZ2luOjA7XHJcbn1cclxuXHJcbi50aW1lT3B0aW9ucyB7XHJcblx0Y29sb3I6I2ZmZjtcclxuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9kcFllYXJCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcblxyXG59XHJcblxyXG4uc2VsZWN0ZWRJdGVtIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7XHJcblx0Y29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udGltZU9wdGlvbnMgLnNlbGVjdGVkSXRlbSB7XHJcblx0Y29sb3I6I2ZmZiAhaW1wb3J0YW50O1xyXG5cdGJhY2tncm91bmQtY29sb3I6IzllYzNmYiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYW55VGltZUNvbnRhaW5lciB7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC13ZWlnaHQ6Ym9sZDtcclxuXHRmb250LXNpemU6MC43ZW07XHJcblx0cGFkZGluZzowLjFlbTtcclxuXHRjdXJzb3I6cG9pbnRlcjtcclxuXHRjdXJzb3I6aGFuZDtcclxuXHRjb2xvcjojZmZmICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5hbVBtQ29udGFpbmVyIHtcclxuXHR3aWR0aDoxMDAlO1xyXG59XHJcblxyXG4uYW1QbUNvbnRhaW5lciB0ZCB7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC1zaXplOjAuN2VtO1xyXG5cdGZvbnQtd2VpZ2h0OmJvbGQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7XHJcblx0Y3Vyc29yOmhhbmQ7XHJcblx0Y29sb3I6I2ZmZjtcclxufVxyXG5cclxuXHJcblxyXG4vKi50aW1lUGlja2VyQ29udGFpbmVyIHtcclxuXHRtYXJnaW46MS43NWVtIDAgMC41ZW0gMDtcclxuXHR3aWR0aDoxMGVtO1xyXG5cdGZsb2F0OmxlZnQ7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHtcclxuXHRib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XHJcblx0Ym9yZGVyLXNwYWNpbmc6MDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQgdGR7XHJcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZTZlNjtcclxuXHRwYWRkaW5nOjAgMC40ZW0gMC4yZW0gMC40ZW07XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHRkIHtcclxuXHRmb250LXNpemU6MC45ZW07XHJcblx0cGFkZGluZzowIDAuMjVlbSAwIDAuMjVlbTtcclxuXHR0ZXh0LWFsaWduOmxlZnQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHRkLm1pbnV0ZXNIZWFkaW5nIHtcclxuXHRib3JkZXItbGVmdDoxcHggc29saWQgI2U2ZTZlNjtcclxuXHRib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNlNmU2ZTY7XHRcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgLm1pbnV0ZXMge1xyXG5cdGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTZlNmU2O1xyXG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgI2U2ZTZlNjtcclxufVxyXG5cclxuLnNlbGVjdGVkSXRlbSB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojM2EzYTNhO1xyXG5cdGNvbG9yOiNmZmZmZmY7XHJcbn0qL1xyXG4iLHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL1RpbWVQaWNrZXIuY3NzIikscG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbihfZGJhLGZyYWcpeworZG9qby53aWRnZXQuVGltZVBpY2tlci5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordGhpcy5jYWxlbmRhcj1kb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCJncmVnb3JpYW4iLHRoaXMubGFuZyk7Cit0aGlzLndpZGdldFN0cmluZ3M9ZG9qby5pMThuLmdldExvY2FsaXphdGlvbigiZG9qby53aWRnZXQiLCJUaW1lUGlja2VyIix0aGlzLmxhbmcpOworfSxmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpewordmFyIF9kYmU9dGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKK2Rvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLF9kYmUpOworaWYoYXJncy52YWx1ZSl7CitpZihhcmdzLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSl7Cit0aGlzLnN0b3JlZFRpbWU9ZG9qby5kYXRlLnRvUmZjMzMzOShhcmdzLnZhbHVlKTsKK31lbHNlewordGhpcy5zdG9yZWRUaW1lPWFyZ3MudmFsdWU7Cit9Cit9Cit0aGlzLmluaXREYXRhKCk7Cit0aGlzLmluaXRVSSgpOworfSxpbml0RGF0YTpmdW5jdGlvbigpeworaWYodGhpcy5zdG9yZWRUaW1lLmluZGV4T2YoIlQiKSE9LTEmJnRoaXMuc3RvcmVkVGltZS5zcGxpdCgiVCIpWzFdJiZ0aGlzLnN0b3JlZFRpbWUhPSIgIiYmdGhpcy5zdG9yZWRUaW1lLnNwbGl0KCJUIilbMV0hPSJhbnkiKXsKK3RoaXMudGltZT1kb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwuZnJvbVJmY0RhdGVUaW1lKHRoaXMuc3RvcmVkVGltZSx0aGlzLnVzZURlZmF1bHRNaW51dGVzLHRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUpOworfWVsc2V7CitpZih0aGlzLnVzZURlZmF1bHRUaW1lKXsKK3RoaXMudGltZT1kb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwuZnJvbVJmY0RhdGVUaW1lKCIiLHRoaXMudXNlRGVmYXVsdE1pbnV0ZXMsdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSk7Cit9ZWxzZXsKK3RoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWU9dHJ1ZTsKK3RoaXMudGltZT1kb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwuZnJvbVJmY0RhdGVUaW1lKCIiLDAsMSk7Cit9Cit9Cit9LGluaXRVSTpmdW5jdGlvbigpeworaWYoIXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUmJnRoaXMudGltZSl7Cit2YXIgX2RiZj1kb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwudG9BbVBtSG91cih0aGlzLnRpbWUuZ2V0SG91cnMoKSk7Cit2YXIgaG91cj1fZGJmWzBdOwordmFyIGlzQW09X2RiZlsxXTsKK3ZhciBfZGMyPXRoaXMudGltZS5nZXRNaW51dGVzKCk7Cit2YXIgX2RjMz1wYXJzZUludChfZGMyLzUpOwordGhpcy5vblNldFNlbGVjdGVkSG91cih0aGlzLmhvdXJJbmRleE1hcFtob3VyXSk7Cit0aGlzLm9uU2V0U2VsZWN0ZWRNaW51dGUodGhpcy5taW51dGVJbmRleE1hcFtfZGMzXSk7Cit0aGlzLm9uU2V0U2VsZWN0ZWRBbVBtKGlzQW0pOworfWVsc2V7Cit0aGlzLm9uU2V0U2VsZWN0ZWRBbnlUaW1lKCk7Cit9Cit9LHNldFRpbWU6ZnVuY3Rpb24oZGF0ZSl7CitpZihkYXRlKXsKK3RoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWU9ZmFsc2U7Cit0aGlzLnNldERhdGVUaW1lKGRvam8uZGF0ZS50b1JmYzMzMzkoZGF0ZSkpOworfWVsc2V7Cit0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lPXRydWU7Cit9Cit0aGlzLmluaXREYXRhKCk7Cit0aGlzLmluaXRVSSgpOworfSxzZXREYXRlVGltZTpmdW5jdGlvbihfZGM1KXsKK3RoaXMuc3RvcmVkVGltZT1fZGM1OworfSxvbkNsZWFyU2VsZWN0ZWRIb3VyOmZ1bmN0aW9uKGV2dCl7Cit0aGlzLmNsZWFyU2VsZWN0ZWRIb3VyKCk7Cit9LG9uQ2xlYXJTZWxlY3RlZE1pbnV0ZTpmdW5jdGlvbihldnQpewordGhpcy5jbGVhclNlbGVjdGVkTWludXRlKCk7Cit9LG9uQ2xlYXJTZWxlY3RlZEFtUG06ZnVuY3Rpb24oZXZ0KXsKK3RoaXMuY2xlYXJTZWxlY3RlZEFtUG0oKTsKK30sb25DbGVhclNlbGVjdGVkQW55VGltZTpmdW5jdGlvbihldnQpewordGhpcy5jbGVhclNlbGVjdGVkQW55VGltZSgpOworaWYodGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSl7Cit0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lPWZhbHNlOwordGhpcy50aW1lPWRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC5mcm9tUmZjRGF0ZVRpbWUoIiIsdGhpcy51c2VEZWZhdWx0TWludXRlcyk7Cit0aGlzLmluaXRVSSgpOworfQorfSxjbGVhclNlbGVjdGVkSG91cjpmdW5jdGlvbigpewordmFyIF9kY2E9dGhpcy5ob3VyQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKK2Zvcih2YXIgaT0wO2k8X2RjYS5sZW5ndGg7aSsrKXsKK2Rvam8uaHRtbC5zZXRDbGFzcyhfZGNhLml0ZW0oaSksIiIpOworfQorfSxjbGVhclNlbGVjdGVkTWludXRlOmZ1bmN0aW9uKCl7Cit2YXIgX2RjYz10aGlzLm1pbnV0ZUNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Citmb3IodmFyIGk9MDtpPF9kY2MubGVuZ3RoO2krKyl7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RjYy5pdGVtKGkpLCIiKTsKK30KK30sY2xlYXJTZWxlY3RlZEFtUG06ZnVuY3Rpb24oKXsKK3ZhciBfZGNlPXRoaXMuYW1QbUNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Citmb3IodmFyIGk9MDtpPF9kY2UubGVuZ3RoO2krKyl7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RjZS5pdGVtKGkpLCIiKTsKK30KK30sY2xlYXJTZWxlY3RlZEFueVRpbWU6ZnVuY3Rpb24oKXsKK2Rvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmFueVRpbWVDb250YWluZXJOb2RlLCJhbnlUaW1lQ29udGFpbmVyIik7Cit9LG9uU2V0U2VsZWN0ZWRIb3VyOmZ1bmN0aW9uKGV2dCl7Cit0aGlzLm9uQ2xlYXJTZWxlY3RlZEFueVRpbWUoKTsKK3RoaXMub25DbGVhclNlbGVjdGVkSG91cigpOwordGhpcy5zZXRTZWxlY3RlZEhvdXIoZXZ0KTsKK3RoaXMub25TZXRUaW1lKCk7Cit9LHNldFNlbGVjdGVkSG91cjpmdW5jdGlvbihldnQpeworaWYoZXZ0JiZldnQudGFyZ2V0KXsKK2lmKGV2dC50YXJnZXQubm9kZVR5cGU9PWRvam8uZG9tLkVMRU1FTlRfTk9ERSl7Cit2YXIgX2RkMj1ldnQudGFyZ2V0OworfWVsc2V7Cit2YXIgX2RkMj1ldnQudGFyZ2V0LnBhcmVudE5vZGU7Cit9Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RkMix0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKK3RoaXMuc2VsZWN0ZWRUaW1lWyJob3VyIl09X2RkMi5pbm5lckhUTUw7Cit9ZWxzZXsKK2lmKCFpc05hTihldnQpKXsKK3ZhciBfZGQzPXRoaXMuaG91ckNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CitpZihfZGQzLml0ZW0oZXZ0KSl7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RkMy5pdGVtKGV2dCksdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7Cit0aGlzLnNlbGVjdGVkVGltZVsiaG91ciJdPV9kZDMuaXRlbShldnQpLmlubmVySFRNTDsKK30KK30KK30KK3RoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWU9ZmFsc2U7Cit9LG9uU2V0U2VsZWN0ZWRNaW51dGU6ZnVuY3Rpb24oZXZ0KXsKK3RoaXMub25DbGVhclNlbGVjdGVkQW55VGltZSgpOwordGhpcy5vbkNsZWFyU2VsZWN0ZWRNaW51dGUoKTsKK3RoaXMuc2V0U2VsZWN0ZWRNaW51dGUoZXZ0KTsKK3RoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWU9ZmFsc2U7Cit0aGlzLm9uU2V0VGltZSgpOworfSxzZXRTZWxlY3RlZE1pbnV0ZTpmdW5jdGlvbihldnQpeworaWYoZXZ0JiZldnQudGFyZ2V0KXsKK2lmKGV2dC50YXJnZXQubm9kZVR5cGU9PWRvam8uZG9tLkVMRU1FTlRfTk9ERSl7Cit2YXIgX2RkNj1ldnQudGFyZ2V0OworfWVsc2V7Cit2YXIgX2RkNj1ldnQudGFyZ2V0LnBhcmVudE5vZGU7Cit9Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RkNix0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKK3RoaXMuc2VsZWN0ZWRUaW1lWyJtaW51dGUiXT1fZGQ2LmlubmVySFRNTDsKK31lbHNleworaWYoIWlzTmFOKGV2dCkpewordmFyIF9kZDc9dGhpcy5taW51dGVDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworaWYoX2RkNy5pdGVtKGV2dCkpeworZG9qby5odG1sLnNldENsYXNzKF9kZDcuaXRlbShldnQpLHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZFRpbWUpOwordGhpcy5zZWxlY3RlZFRpbWVbIm1pbnV0ZSJdPV9kZDcuaXRlbShldnQpLmlubmVySFRNTDsKK30KK30KK30KK30sb25TZXRTZWxlY3RlZEFtUG06ZnVuY3Rpb24oZXZ0KXsKK3RoaXMub25DbGVhclNlbGVjdGVkQW55VGltZSgpOwordGhpcy5vbkNsZWFyU2VsZWN0ZWRBbVBtKCk7Cit0aGlzLnNldFNlbGVjdGVkQW1QbShldnQpOwordGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZT1mYWxzZTsKK3RoaXMub25TZXRUaW1lKCk7Cit9LHNldFNlbGVjdGVkQW1QbTpmdW5jdGlvbihldnQpewordmFyIF9kZGE9ZXZ0LnRhcmdldDsKK2lmKGV2dCYmX2RkYSl7CitpZihfZGRhLm5vZGVUeXBlIT1kb2pvLmRvbS5FTEVNRU5UX05PREUpeworX2RkYT1fZGRhLnBhcmVudE5vZGU7Cit9Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Cit0aGlzLnNlbGVjdGVkVGltZS5hbVBtPV9kZGEuaWQ7Citkb2pvLmh0bWwuc2V0Q2xhc3MoX2RkYSx0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKK31lbHNleworZXZ0PWV2dD8wOjE7Cit2YXIgX2RkYj10aGlzLmFtUG1Db250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworaWYoX2RkYi5pdGVtKGV2dCkpewordGhpcy5zZWxlY3RlZFRpbWUuYW1QbT1fZGRiLml0ZW0oZXZ0KS5pZDsKK2Rvam8uaHRtbC5zZXRDbGFzcyhfZGRiLml0ZW0oZXZ0KSx0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKK30KK30KK30sb25TZXRTZWxlY3RlZEFueVRpbWU6ZnVuY3Rpb24oZXZ0KXsKK3RoaXMub25DbGVhclNlbGVjdGVkSG91cigpOwordGhpcy5vbkNsZWFyU2VsZWN0ZWRNaW51dGUoKTsKK3RoaXMub25DbGVhclNlbGVjdGVkQW1QbSgpOwordGhpcy5zZXRTZWxlY3RlZEFueVRpbWUoKTsKK3RoaXMub25TZXRUaW1lKCk7Cit9LHNldFNlbGVjdGVkQW55VGltZTpmdW5jdGlvbihldnQpewordGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZT10cnVlOworZG9qby5odG1sLnNldENsYXNzKHRoaXMuYW55VGltZUNvbnRhaW5lck5vZGUsdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSsiICIrImFueVRpbWVDb250YWluZXIiKTsKK30sb25DbGljazpmdW5jdGlvbihldnQpeworZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworfSxvblNldFRpbWU6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUpewordGhpcy50aW1lPW5ldyBEYXRlKCk7Cit2YXIgX2RkZj1kb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwudG9SZmNEYXRlVGltZSh0aGlzLnRpbWUpOwordGhpcy5zZXREYXRlVGltZShfZGRmLnNwbGl0KCJUIilbMF0pOworfWVsc2V7Cit2YXIgaG91cj0xMjsKK3ZhciBfZGUxPTA7Cit2YXIgaXNBbT1mYWxzZTsKK2lmKHRoaXMuc2VsZWN0ZWRUaW1lWyJob3VyIl0peworaG91cj1wYXJzZUludCh0aGlzLnNlbGVjdGVkVGltZVsiaG91ciJdLDEwKTsKK30KK2lmKHRoaXMuc2VsZWN0ZWRUaW1lWyJtaW51dGUiXSl7CitfZGUxPXBhcnNlSW50KHRoaXMuc2VsZWN0ZWRUaW1lWyJtaW51dGUiXSwxMCk7Cit9CitpZih0aGlzLnNlbGVjdGVkVGltZVsiYW1QbSJdKXsKK2lzQW09KHRoaXMuc2VsZWN0ZWRUaW1lWyJhbVBtIl0udG9Mb3dlckNhc2UoKT09ImFtIik7Cit9Cit0aGlzLnRpbWU9bmV3IERhdGUoKTsKK3RoaXMudGltZS5zZXRIb3Vycyhkb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwuZnJvbUFtUG1Ib3VyKGhvdXIsaXNBbSkpOwordGhpcy50aW1lLnNldE1pbnV0ZXMoX2RlMSk7Cit0aGlzLnNldERhdGVUaW1lKGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC50b1JmY0RhdGVUaW1lKHRoaXMudGltZSkpOworfQordGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLnRpbWUpOworfSxvblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihkYXRlKXsKK319KTsKK2Rvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbD1uZXcgZnVuY3Rpb24oKXsKK3RoaXMudG9SZmNEYXRlVGltZT1mdW5jdGlvbihfZGU0KXsKK2lmKCFfZGU0KXsKK19kZTQ9bmV3IERhdGUoKTsKK30KK19kZTQuc2V0U2Vjb25kcygwKTsKK3JldHVybiBkb2pvLmRhdGUuc3RyZnRpbWUoX2RlNCwiJVktJW0tJWRUJUg6JU06MDAleiIpOworfTsKK3RoaXMuZnJvbVJmY0RhdGVUaW1lPWZ1bmN0aW9uKF9kZTUsX2RlNixfZGU3KXsKK3ZhciBfZGU4PW5ldyBEYXRlKCk7CitpZighX2RlNXx8X2RlNS5pbmRleE9mKCJUIik9PS0xKXsKK2lmKF9kZTYpeworX2RlOC5zZXRNaW51dGVzKE1hdGguZmxvb3IoX2RlOC5nZXRNaW51dGVzKCkvNSkqNSk7Cit9ZWxzZXsKK19kZTguc2V0TWludXRlcygwKTsKK30KK31lbHNlewordmFyIF9kZTk9X2RlNS5zcGxpdCgiVCIpWzFdLnNwbGl0KCI6Iik7Cit2YXIgX2RlOD1uZXcgRGF0ZSgpOworX2RlOC5zZXRIb3VycyhfZGU5WzBdKTsKK19kZTguc2V0TWludXRlcyhfZGU5WzFdKTsKK30KK3JldHVybiBfZGU4OworfTsKK3RoaXMudG9BbVBtSG91cj1mdW5jdGlvbihob3VyKXsKK3ZhciBfZGViPWhvdXI7Cit2YXIgaXNBbT10cnVlOworaWYoX2RlYj09MCl7CitfZGViPTEyOworfWVsc2V7CitpZihfZGViPjEyKXsKK19kZWI9X2RlYi0xMjsKK2lzQW09ZmFsc2U7Cit9ZWxzZXsKK2lmKF9kZWI9PTEyKXsKK2lzQW09ZmFsc2U7Cit9Cit9Cit9CityZXR1cm4gW19kZWIsaXNBbV07Cit9OwordGhpcy5mcm9tQW1QbUhvdXI9ZnVuY3Rpb24oX2RlZCxpc0FtKXsKK3ZhciBob3VyPXBhcnNlSW50KF9kZWQsMTApOworaWYoaXNBbSYmaG91cj09MTIpeworaG91cj0wOworfWVsc2V7CitpZighaXNBbSYmaG91cjwxMil7Citob3VyPWhvdXIrMTI7Cit9Cit9CityZXR1cm4gaG91cjsKK307Cit9OworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIixkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lcix7aWNvblVSTDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy90aW1lSWNvbi5naWYiKSxmb3JtYXRMZW5ndGg6InNob3J0IixkaXNwbGF5Rm9ybWF0OiIiLHRpbWVGb3JtYXQ6IiIsc2F2ZUZvcm1hdDoiIix2YWx1ZToiIixuYW1lOiIiLHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oKXsKK2Rvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlci5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordmFyIF9kZjA9ZG9qby5pMThuLmdldExvY2FsaXphdGlvbigiZG9qby53aWRnZXQiLCJEcm9wZG93blRpbWVQaWNrZXIiLHRoaXMubGFuZyk7Cit0aGlzLmljb25BbHQ9X2RmMC5zZWxlY3RUaW1lOworaWYodHlwZW9mICh0aGlzLnZhbHVlKT09InN0cmluZyImJnRoaXMudmFsdWUudG9Mb3dlckNhc2UoKT09InRvZGF5Iil7Cit0aGlzLnZhbHVlPW5ldyBEYXRlKCk7Cit9CitpZih0aGlzLnZhbHVlJiZpc05hTih0aGlzLnZhbHVlKSl7Cit2YXIgb3JpZz10aGlzLnZhbHVlOwordGhpcy52YWx1ZT1kb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy52YWx1ZSk7CitpZighdGhpcy52YWx1ZSl7Cit2YXIgZD1kb2pvLmRhdGUuZm9ybWF0KG5ldyBEYXRlKCkse3NlbGVjdG9yOiJkYXRlT25seSIsZGF0ZVBhdHRlcm46Inl5eXktTU0tZGQifSk7Cit2YXIgYz1vcmlnLnNwbGl0KCI6Iik7Citmb3IodmFyIGk9MDtpPGMubGVuZ3RoOysraSl7CitpZihjW2ldLmxlbmd0aD09MSl7CitjW2ldPSIwIitjW2ldOworfQorfQorb3JpZz1jLmpvaW4oIjoiKTsKK3RoaXMudmFsdWU9ZG9qby5kYXRlLmZyb21SZmMzMzM5KGQrIlQiK29yaWcpOworZG9qby5kZXByZWNhdGVkKCJkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIiLCJ0aW1lIGF0dHJpYnV0ZXMgbXVzdCBiZSBwYXNzZWQgaW4gUmZjMzMzOSBmb3JtYXQiLCIwLjUiKTsKK30KK30KK2lmKHRoaXMudmFsdWUmJiFpc05hTih0aGlzLnZhbHVlKSl7Cit0aGlzLnZhbHVlPW5ldyBEYXRlKHRoaXMudmFsdWUpOworfQorfSxmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordmFyIF9kZjU9IiI7CitpZih0aGlzLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSl7CitfZGY1PXRoaXMudmFsdWU7Cit9ZWxzZXsKK2lmKHRoaXMudmFsdWUpewordmFyIG9yaWc9dGhpcy52YWx1ZTsKK3ZhciBkPWRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoKSx7c2VsZWN0b3I6ImRhdGVPbmx5IixkYXRlUGF0dGVybjoieXl5eS1NTS1kZCJ9KTsKK3ZhciBjPW9yaWcuc3BsaXQoIjoiKTsKK2Zvcih2YXIgaT0wO2k8Yy5sZW5ndGg7KytpKXsKK2lmKGNbaV0ubGVuZ3RoPT0xKXsKK2NbaV09IjAiK2NbaV07Cit9Cit9CitvcmlnPWMuam9pbigiOiIpOworX2RmNT1kb2pvLmRhdGUuZnJvbVJmYzMzMzkoZCsiVCIrb3JpZyk7Cit9Cit9Cit2YXIgX2RmYT17d2lkZ2V0Q29udGFpbmVySWQ6dGhpcy53aWRnZXRJZCxsYW5nOnRoaXMubGFuZyx2YWx1ZTpfZGY1fTsKK3RoaXMudGltZVBpY2tlcj1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRpbWVQaWNrZXIiLF9kZmEsdGhpcy5jb250YWluZXJOb2RlLCJjaGlsZCIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMudGltZVBpY2tlciwib25WYWx1ZUNoYW5nZWQiLHRoaXMsIl91cGRhdGVUZXh0Iik7CitpZih0aGlzLnZhbHVlKXsKK3RoaXMuX3VwZGF0ZVRleHQoKTsKK30KK3RoaXMuY29udGFpbmVyTm9kZS5zdHlsZS56SW5kZXg9dGhpcy56SW5kZXg7Cit0aGlzLmNvbnRhaW5lck5vZGUuZXhwbG9kZUNsYXNzTmFtZT0idGltZUNvbnRhaW5lciI7Cit0aGlzLnZhbHVlTm9kZS5uYW1lPXRoaXMubmFtZTsKK30sZ2V0VmFsdWU6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnZhbHVlTm9kZS52YWx1ZTsKK30sZ2V0VGltZTpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudGltZVBpY2tlci5zdG9yZWRUaW1lOworfSxzZXRWYWx1ZTpmdW5jdGlvbihfZGZiKXsKK3RoaXMuc2V0VGltZShfZGZiKTsKK30sc2V0VGltZTpmdW5jdGlvbihfZGZjKXsKK3ZhciBfZGZkPSIiOworaWYoX2RmYyBpbnN0YW5jZW9mIERhdGUpeworX2RmZD1fZGZjOworfWVsc2V7CitpZih0aGlzLnZhbHVlKXsKK3ZhciBvcmlnPXRoaXMudmFsdWU7Cit2YXIgZD1kb2pvLmRhdGUuZm9ybWF0KG5ldyBEYXRlKCkse3NlbGVjdG9yOiJkYXRlT25seSIsZGF0ZVBhdHRlcm46Inl5eXktTU0tZGQifSk7Cit2YXIgYz1vcmlnLnNwbGl0KCI6Iik7Citmb3IodmFyIGk9MDtpPGMubGVuZ3RoOysraSl7CitpZihjW2ldLmxlbmd0aD09MSl7CitjW2ldPSIwIitjW2ldOworfQorfQorb3JpZz1jLmpvaW4oIjoiKTsKK19kZmQ9ZG9qby5kYXRlLmZyb21SZmMzMzM5KGQrIlQiK29yaWcpOworfQorfQordGhpcy50aW1lUGlja2VyLnNldFRpbWUoX2RmZCk7Cit0aGlzLl9zeW5jVmFsdWVOb2RlKCk7Cit9LF91cGRhdGVUZXh0OmZ1bmN0aW9uKCl7CitpZih0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRUaW1lLmFueVRpbWUpewordGhpcy5pbnB1dE5vZGUudmFsdWU9IiI7Cit9ZWxzZXsKK2lmKHRoaXMudGltZUZvcm1hdCl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsIk11c3QgdXNlIGRpc3BsYXlGb3JtYXQgYXR0cmlidXRlIGluc3RlYWQgb2YgdGltZUZvcm1hdC4gIFNlZSBkb2pvLmRhdGUuZm9ybWF0IGZvciBzcGVjaWZpY2F0aW9uLiIsIjAuNSIpOwordGhpcy5pbnB1dE5vZGUudmFsdWU9ZG9qby5kYXRlLnN0cmZ0aW1lKHRoaXMudGltZVBpY2tlci50aW1lLHRoaXMudGltZUZvcm1hdCx0aGlzLmxhbmcpOworfWVsc2V7Cit0aGlzLmlucHV0Tm9kZS52YWx1ZT1kb2pvLmRhdGUuZm9ybWF0KHRoaXMudGltZVBpY2tlci50aW1lLHtmb3JtYXRMZW5ndGg6dGhpcy5mb3JtYXRMZW5ndGgsdGltZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0LHNlbGVjdG9yOiJ0aW1lT25seSIsbG9jYWxlOnRoaXMubGFuZ30pOworfQorfQordGhpcy5fc3luY1ZhbHVlTm9kZSgpOwordGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLmdldFRpbWUoKSk7Cit0aGlzLmhpZGVDb250YWluZXIoKTsKK30sb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oX2UwMil7Cit9LG9uSW5wdXRDaGFuZ2U6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuZGF0ZUZvcm1hdCl7Citkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsIkNhbm5vdCBwYXJzZSB1c2VyIGlucHV0LiAgTXVzdCB1c2UgZGlzcGxheUZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiBkYXRlRm9ybWF0LiAgU2VlIGRvam8uZGF0ZS5mb3JtYXQgZm9yIHNwZWNpZmljYXRpb24uIiwiMC41Iik7Cit9ZWxzZXsKK3ZhciBfZTAzPWRvam8uc3RyaW5nLnRyaW0odGhpcy5pbnB1dE5vZGUudmFsdWUpOworaWYoX2UwMyl7Cit2YXIgX2UwND1kb2pvLmRhdGUucGFyc2UoX2UwMyx7Zm9ybWF0TGVuZ3RoOnRoaXMuZm9ybWF0TGVuZ3RoLHRpbWVQYXR0ZXJuOnRoaXMuZGlzcGxheUZvcm1hdCxzZWxlY3RvcjoidGltZU9ubHkiLGxvY2FsZTp0aGlzLmxhbmd9KTsKK2lmKF9lMDQpewordGhpcy5zZXRUaW1lKF9lMDQpOworfQorfWVsc2V7Cit0aGlzLnZhbHVlTm9kZS52YWx1ZT1fZTAzOworfQorfQoraWYoX2UwMyl7Cit0aGlzLl91cGRhdGVUZXh0KCk7Cit9Cit9LF9zeW5jVmFsdWVOb2RlOmZ1bmN0aW9uKCl7Cit2YXIgdGltZT10aGlzLnRpbWVQaWNrZXIudGltZTsKK3ZhciBfZTA2Oworc3dpdGNoKHRoaXMuc2F2ZUZvcm1hdC50b0xvd2VyQ2FzZSgpKXsKK2Nhc2UgInJmYyI6CitjYXNlICJpc28iOgorY2FzZSAiIjoKK19lMDY9ZG9qby5kYXRlLnRvUmZjMzMzOSh0aW1lLCJ0aW1lT25seSIpOworYnJlYWs7CitjYXNlICJwb3NpeCI6CitjYXNlICJ1bml4IjoKK19lMDY9TnVtYmVyKHRpbWUpOworYnJlYWs7CitkZWZhdWx0OgorX2UwNj1kb2pvLmRhdGUuZm9ybWF0KHRpbWUse2RhdGVQYXR0ZXJuOnRoaXMuc2F2ZUZvcm1hdCxzZWxlY3RvcjoidGltZU9ubHkiLGxvY2FsZTp0aGlzLmxhbmd9KTsKK30KK3RoaXMudmFsdWVOb2RlLnZhbHVlPV9lMDY7Cit9LGRlc3Ryb3k6ZnVuY3Rpb24oX2UwNyl7Cit0aGlzLnRpbWVQaWNrZXIuZGVzdHJveShfZTA3KTsKK2Rvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfX0pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgic3RydXRzLndpZGdldC5TdHJ1dHNUaW1lUGlja2VyIixkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIse3dpZGdldFR5cGU6IlN0cnV0c1RpbWVQaWNrZXIiLGlucHV0TmFtZToiIixuYW1lOiIiLHZhbHVlTm90aWZ5VG9waWNzOiIiLHZhbHVlTm90aWZ5VG9waWNzQXJyYXk6bnVsbCx0YWJJbmRleDoiIixwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7CitzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2lmKHRoaXMuZXh0cmFBcmdzWyJjbGFzcyJdKXsKK2Rvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmlucHV0Tm9kZSx0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSk7Cit9CitpZih0aGlzLmV4dHJhQXJncy5zdHlsZSl7Citkb2pvLmh0bWwuc2V0U3R5bGVUZXh0KHRoaXMuaW5wdXROb2RlLHRoaXMuZXh0cmFBcmdzLnN0eWxlKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudmFsdWVOb3RpZnlUb3BpY3MpKXsKK3RoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheT10aGlzLnZhbHVlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnRhYkluZGV4KSl7Cit0aGlzLmlucHV0Tm9kZS50YWJJbmRleD10aGlzLnRhYkluZGV4OworfQorfSxfc3luY1ZhbHVlTm9kZTpmdW5jdGlvbigpewordmFyIHRpbWU9dGhpcy50aW1lUGlja2VyLnRpbWU7Cit2YXIgX2UwOTsKK3N3aXRjaCh0aGlzLnNhdmVGb3JtYXQudG9Mb3dlckNhc2UoKSl7CitjYXNlICJyZmMiOgorY2FzZSAiaXNvIjoKK2Nhc2UgIiI6CitfZTA5PWRvam8uZGF0ZS50b1JmYzMzMzkodGltZSk7CiticmVhazsKK2Nhc2UgInBvc2l4IjoKK2Nhc2UgInVuaXgiOgorX2UwOT1OdW1iZXIodGltZSk7CiticmVhazsKK2RlZmF1bHQ6CitfZTA5PWRvam8uZGF0ZS5mb3JtYXQodGltZSx7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LHNlbGVjdG9yOiJ0aW1lT25seSIsbG9jYWxlOnRoaXMubGFuZ30pOworfQordGhpcy52YWx1ZU5vZGUudmFsdWU9X2UwOTsKK30sX3VwZGF0ZVRleHQ6ZnVuY3Rpb24oKXsKK3N0cnV0cy53aWRnZXQuU3RydXRzVGltZVBpY2tlci5zdXBlcmNsYXNzLl91cGRhdGVUZXh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2lmKHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSE9bnVsbCl7Citmb3IodmFyIGk9MDtpPHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheS5sZW5ndGg7aSsrKXsKK3ZhciBfZTBiPXRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheVtpXTsKK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKF9lMGIpKXsKK3RyeXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaChfZTBiLHRoaXMuaW5wdXROb2RlLnZhbHVlLHRoaXMuZ2V0VmFsdWUoKSx0aGlzKTsKK30KK2NhdGNoKGV4KXsKK2Rvam8uZGVidWcoZXgpOworfQorfQorfQorfQorfX0pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5EYXRlUGlja2VyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkRhdGVQaWNrZXIiLGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQse3ZhbHVlOiIiLG5hbWU6IiIsZGlzcGxheVdlZWtzOjYsYWRqdXN0V2Vla3M6ZmFsc2Usc3RhcnREYXRlOiIxNDkyLTEwLTEyIixlbmREYXRlOiIyOTQxLTEwLTEyIix3ZWVrU3RhcnRzT246IiIsc3RhdGljRGlzcGxheTpmYWxzZSxkYXlXaWR0aDoibmFycm93IixjbGFzc05hbWVzOntwcmV2aW91czoicHJldmlvdXNNb250aCIsZGlzYWJsZWRQcmV2aW91czoicHJldmlvdXNNb250aERpc2FibGVkIixjdXJyZW50OiJjdXJyZW50TW9udGgiLGRpc2FibGVkQ3VycmVudDoiY3VycmVudE1vbnRoRGlzYWJsZWQiLG5leHQ6Im5leHRNb250aCIsZGlzYWJsZWROZXh0OiJuZXh0TW9udGhEaXNhYmxlZCIsY3VycmVudERhdGU6ImN1cnJlbnREYXRlIixzZWxlY3RlZERhdGU6InNlbGVjdGVkRGF0ZSJ9LHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiZGF0ZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImRhdGVQaWNrZXJDb250YWluZXJOb2RlXCI+XHJcblx0PHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNsYXNzPVwiY2FsZW5kYXJDb250YWluZXJcIj5cclxuXHRcdDx0aGVhZD5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cIm1vbnRoV3JhcHBlclwiIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0PHRhYmxlIGNsYXNzPVwibW9udGhDb250YWluZXJcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiBib3JkZXI9XCIwXCI+XHJcblx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJtb250aEN1cnZlIG1vbnRoQ3VydmVUTFwiIHZhbGlnbj1cInRvcFwiPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwibW9udGhMYWJlbENvbnRhaW5lclwiIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVhc2VXZWVrTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvbkluY3JlbWVudFdlZWs7XCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiaW5jcmVtZW50Q29udHJvbCBpbmNyZWFzZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW1hZ2VzL2luY3JlbWVudE1vbnRoLnBuZ1wiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRhbHQ9XCImZGFycjtcIiBzdHlsZT1cIndpZHRoOjdweDtoZWlnaHQ6NXB4O1wiIC8+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVhc2VNb250aE5vZGVcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRNb250aDtcIiBjbGFzcz1cImluY3JlbWVudENvbnRyb2wgaW5jcmVhc2VcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmdcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbHQ9XCImZGFycjtcIiAgZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVtZW50TW9udGhJbWFnZU5vZGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkZWNyZWFzZVdlZWtOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50V2VlaztcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nXCIgYWx0PVwiJnVhcnI7XCIgc3R5bGU9XCJ3aWR0aDo3cHg7aGVpZ2h0OjVweDtcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hQb2ludD1cImRlY3JlYXNlTW9udGhOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7XCIgY2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWx0PVwiJnVhcnI7XCIgZG9qb0F0dGFjaFBvaW50PVwiZGVjcmVtZW50TW9udGhJbWFnZU5vZGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cIm1vbnRoTGFiZWxOb2RlXCIgY2xhc3M9XCJtb250aFwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIm1vbnRoQ3VydmUgbW9udGhDdXJ2ZVRSXCIgdmFsaWduPVwidG9wXCI+PC90ZD5cclxuXHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGhlYWQ+XHJcblx0XHQ8dGJvZHk+XHJcblx0XHRcdDx0cj5cclxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBjbGFzcz1cImNhbGVuZGFyQm9keUNvbnRhaW5lclwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cclxuXHRcdFx0XHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJkYXlMYWJlbHNSb3dcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdDwvdGhlYWQ+XHJcblx0XHRcdFx0XHRcdDx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IF9oYW5kbGVVaUNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhcldlZWtUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGJvZHk+XHJcblx0XHQ8dGZvb3Q+XHJcblx0XHRcdDx0cj5cclxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjNcIiBjbGFzcz1cInllYXJXcmFwcGVyXCI+XHJcblx0XHRcdFx0XHQ8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCIgYm9yZGVyPVwiMFwiIGNsYXNzPVwieWVhckNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiY3VydmVCTFwiIHZhbGlnbj1cInRvcFwiPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGgzIGNsYXNzPVwieWVhckxhYmVsXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cInByZXZpb3VzWWVhckxhYmVsTm9kZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRZZWFyO1wiIGNsYXNzPVwicHJldmlvdXNZZWFyXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInNlbGVjdGVkWWVhclwiIGRvam9BdHRhY2hQb2ludD1cImN1cnJlbnRZZWFyTGFiZWxOb2RlXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJuZXh0WWVhckxhYmVsTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50WWVhcjtcIiBjbGFzcz1cIm5leHRZZWFyXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9oMz5cclxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cImN1cnZlQlJcIiB2YWxpZ249XCJ0b3BcIj48L3RkPlxyXG5cdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Zm9vdD5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIix0ZW1wbGF0ZUNzc1N0cmluZzoiLmRhdGVQaWNrZXJDb250YWluZXIge1xyXG5cdHdpZHRoOjE2NHB4OyAvKiBuZWVkZWQgZm9yIHByb3BlciB1c2VyIHN0eWxpbmcgKi9cclxufVxyXG5cclxuLmNhbGVuZGFyQ29udGFpbmVyIHtcclxuLypcdGJvcmRlcjoxcHggc29saWQgIzU2NmY4ZjsqL1xyXG59XHJcblxyXG4uY2FsZW5kYXJCb2R5Q29udGFpbmVyIHtcclxuXHR3aWR0aDoxMDAlOyAvKiBuZWVkZWQgZm9yIHRoZSBleHBsb2RlIGVmZmVjdCAoZXhwbGFpbj8pICovXHJcblx0YmFja2dyb3VuZDogIzc1OTFiYyB1cmwoXCJpbWFnZXMvZHBCZy5naWZcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi5jYWxlbmRhckJvZHlDb250YWluZXIgdGhlYWQgdHIgdGQge1xyXG5cdGNvbG9yOiMyOTNhNGI7XHJcblx0Zm9udDpib2xkIDAuNzVlbSBIZWx2ZXRpY2EsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xyXG5cdHRleHQtYWxpZ246Y2VudGVyO1xyXG5cdHBhZGRpbmc6MC4yNWVtO1xyXG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEhvcml6TGluZS5naWZcIikgYm90dG9tIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi5jYWxlbmRhckJvZHlDb250YWluZXIgdGJvZHkgdHIgdGQge1xyXG5cdGNvbG9yOiNmZmY7XHJcblx0Zm9udDpib2xkIDAuN2VtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0cGFkZGluZzowLjRlbTtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBWZXJ0TGluZS5naWZcIikgdG9wIHJpZ2h0IHJlcGVhdC15O1xyXG5cdGN1cnNvcjpwb2ludGVyO1xyXG5cdGN1cnNvcjpoYW5kO1xyXG59XHJcblxyXG5cclxuLm1vbnRoV3JhcHBlciB7XHJcblx0cGFkZGluZy1ib3R0b206MnB4O1xyXG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEhvcml6TGluZS5naWZcIikgYm90dG9tIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi5tb250aENvbnRhaW5lciB7XHJcblx0d2lkdGg6MTAwJTtcclxufVxyXG5cclxuLm1vbnRoTGFiZWxDb250YWluZXIge1xyXG5cdHRleHQtYWxpZ246Y2VudGVyO1xyXG5cdGZvbnQ6Ym9sZCAwLjc1ZW0gSGVsdmV0aWNhLCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBNb250aEJnLnBuZ1wiKSByZXBlYXQteCB0b3AgbGVmdCAhaW1wb3J0YW50O1xyXG5cdGNvbG9yOiMyOTNhNGI7XHJcblx0cGFkZGluZzowLjI1ZW07XHJcbn1cclxuXHJcbi5tb250aEN1cnZlIHtcclxuXHR3aWR0aDoxMnB4O1xyXG59XHJcblxyXG4ubW9udGhDdXJ2ZVRMIHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZVRMLnBuZ1wiKSBuby1yZXBlYXQgdG9wIGxlZnQgIWltcG9ydGFudDtcclxufVxyXG5cclxuLm1vbnRoQ3VydmVUUiB7XHJcblx0XHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZVRSLnBuZ1wiKSBuby1yZXBlYXQgdG9wIHJpZ2h0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcblxyXG4ueWVhcldyYXBwZXIge1xyXG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEhvcml6TGluZUZvb3QuZ2lmXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xyXG5cdHBhZGRpbmctdG9wOjJweDtcclxufVxyXG5cclxuLnllYXJDb250YWluZXIge1xyXG5cdHdpZHRoOjEwMCU7XHJcbn1cclxuXHJcbi55ZWFyQ29udGFpbmVyIHRkIHtcclxuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9kcFllYXJCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi55ZWFyQ29udGFpbmVyIC55ZWFyTGFiZWwge1xyXG5cdG1hcmdpbjowO1xyXG5cdHBhZGRpbmc6MC40NWVtIDAgMC40NWVtIDA7XHJcblx0Y29sb3I6I2ZmZjtcclxuXHRmb250OmJvbGQgMC43NWVtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcbn1cclxuXHJcbi5jdXJ2ZUJMIHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZUJMLnBuZ1wiKSBib3R0b20gbGVmdCBuby1yZXBlYXQgIWltcG9ydGFudDtcclxuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcclxuXHRwYWRkaW5nOjA7XHJcblx0bWFyZ2luOjA7XHJcbn1cclxuXHJcbi5jdXJ2ZUJSIHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZUJSLnBuZ1wiKSBib3R0b20gcmlnaHQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7XHJcblx0d2lkdGg6OXB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzowO1xyXG5cdG1hcmdpbjowO1xyXG59XHJcblxyXG5cclxuLnByZXZpb3VzTW9udGgge1xyXG5cdGJhY2tncm91bmQtY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ucHJldmlvdXNNb250aERpc2FibGVkIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiNhNGE1YTYgIWltcG9ydGFudDtcclxuXHRjdXJzb3I6ZGVmYXVsdCAhaW1wb3J0YW50XHJcbn1cclxuLmN1cnJlbnRNb250aCB7XHJcbn1cclxuXHJcbi5jdXJyZW50TW9udGhEaXNhYmxlZCB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojYmJiYmJjICFpbXBvcnRhbnQ7XHJcblx0Y3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudFxyXG59XHJcbi5uZXh0TW9udGgge1xyXG5cdGJhY2tncm91bmQtY29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xyXG59XHJcbi5uZXh0TW9udGhEaXNhYmxlZCB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojYTRhNWE2ICFpbXBvcnRhbnQ7XHJcblx0Y3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmN1cnJlbnREYXRlIHtcclxuXHR0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1xyXG5cdGZvbnQtc3R5bGU6aXRhbGljO1xyXG59XHJcblxyXG4uc2VsZWN0ZWREYXRlIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiNmZmYgIWltcG9ydGFudDtcclxuXHRjb2xvcjojNjc4MmE4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi55ZWFyTGFiZWwgLnNlbGVjdGVkWWVhciB7XHJcblx0cGFkZGluZzowLjJlbTtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiM5ZWMzZmIgIWltcG9ydGFudDtcclxufVxyXG5cclxuLm5leHRZZWFyLCAucHJldmlvdXNZZWFyIHtcclxuXHRjdXJzb3I6cG9pbnRlcjtjdXJzb3I6aGFuZDtcclxuXHRwYWRkaW5nOjA7XHJcbn1cclxuXHJcbi5uZXh0WWVhciB7XHJcblx0bWFyZ2luOjAgMCAwIDAuNTVlbTtcclxufVxyXG5cclxuLnByZXZpb3VzWWVhciB7XHJcblx0bWFyZ2luOjAgMC41NWVtIDAgMDtcclxufVxyXG5cclxuLmluY3JlbWVudENvbnRyb2wge1xyXG5cdGN1cnNvcjpwb2ludGVyO2N1cnNvcjpoYW5kO1xyXG5cdHdpZHRoOjFlbTtcclxufVxyXG5cclxuLmluY3JlYXNlIHtcclxuXHRmbG9hdDpyaWdodDtcclxufVxyXG5cclxuLmRlY3JlYXNlIHtcclxuXHRmbG9hdDpsZWZ0O1xyXG59XHJcblxyXG4ubGFzdENvbHVtbiB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTpub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcblxyXG4iLHRlbXBsYXRlQ3NzUGF0aDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL0RhdGVQaWNrZXIuY3NzIikscG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRGF0ZVBpY2tlci5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOworaWYoIXRoaXMud2Vla1N0YXJ0c09uKXsKK3RoaXMud2Vla1N0YXJ0c09uPWRvam8uZGF0ZS5nZXRGaXJzdERheU9mV2Vlayh0aGlzLmxhbmcpOworfQordGhpcy50b2RheT1uZXcgRGF0ZSgpOwordGhpcy50b2RheS5zZXRIb3VycygwLDAsMCwwKTsKK2lmKHR5cGVvZiAodGhpcy52YWx1ZSk9PSJzdHJpbmciJiZ0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCk9PSJ0b2RheSIpewordGhpcy52YWx1ZT1uZXcgRGF0ZSgpOworfWVsc2V7CitpZih0aGlzLnZhbHVlJiYodHlwZW9mIHRoaXMudmFsdWU9PSJzdHJpbmciKSYmKHRoaXMudmFsdWUuc3BsaXQoIi0iKS5sZW5ndGg+MikpewordGhpcy52YWx1ZT1kb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy52YWx1ZSk7Cit0aGlzLnZhbHVlLnNldEhvdXJzKDAsMCwwLDApOworfQorfQorfSxmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpeworZG9qby53aWRnZXQuRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3ZhciBfZTBlPXRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7Citkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSxfZTBlKTsKK3RoaXMud2Vla1RlbXBsYXRlPWRvam8uZG9tLnJlbW92ZU5vZGUodGhpcy5jYWxlbmRhcldlZWtUZW1wbGF0ZSk7Cit0aGlzLl9wcmVJbml0VUkodGhpcy52YWx1ZT90aGlzLnZhbHVlOnRoaXMudG9kYXksZmFsc2UsdHJ1ZSk7Cit2YXIgX2UwZj1kb2pvLmxhbmcudW5uZXN0KGRvam8uZGF0ZS5nZXROYW1lcygiZGF5cyIsdGhpcy5kYXlXaWR0aCwic3RhbmRBbG9uZSIsdGhpcy5sYW5nKSk7CitpZih0aGlzLndlZWtTdGFydHNPbj4wKXsKK2Zvcih2YXIgaT0wO2k8dGhpcy53ZWVrU3RhcnRzT247aSsrKXsKK19lMGYucHVzaChfZTBmLnNoaWZ0KCkpOworfQorfQordmFyIF9lMTE9dGhpcy5kYXlMYWJlbHNSb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Citmb3IoaT0wO2k8NztpKyspeworX2UxMS5pdGVtKGkpLmlubmVySFRNTD1fZTBmW2ldOworfQoraWYodGhpcy52YWx1ZSl7Cit0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUpOworfQorfSxnZXRWYWx1ZTpmdW5jdGlvbigpeworcmV0dXJuIGRvam8uZGF0ZS50b1JmYzMzMzkobmV3IERhdGUodGhpcy52YWx1ZSksImRhdGVPbmx5Iik7Cit9LGdldERhdGU6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnZhbHVlOworfSxzZXRWYWx1ZTpmdW5jdGlvbihfZTEyKXsKK3RoaXMuc2V0RGF0ZShfZTEyKTsKK30sc2V0RGF0ZTpmdW5jdGlvbihfZTEzKXsKK2lmKF9lMTM9PSIiKXsKK3RoaXMudmFsdWU9IiI7Cit0aGlzLl9wcmVJbml0VUkodGhpcy5jdXJNb250aCxmYWxzZSx0cnVlKTsKK31lbHNleworaWYodHlwZW9mIF9lMTM9PSJzdHJpbmciKXsKK3RoaXMudmFsdWU9ZG9qby5kYXRlLmZyb21SZmMzMzM5KF9lMTMpOwordGhpcy52YWx1ZS5zZXRIb3VycygwLDAsMCwwKTsKK31lbHNlewordGhpcy52YWx1ZT1uZXcgRGF0ZShfZTEzKTsKK3RoaXMudmFsdWUuc2V0SG91cnMoMCwwLDAsMCk7Cit9Cit9CitpZih0aGlzLnNlbGVjdGVkTm9kZSE9bnVsbCl7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5zZWxlY3RlZE5vZGUsdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkRGF0ZSk7Cit9CitpZih0aGlzLmNsaWNrZWROb2RlIT1udWxsKXsKK2Rvam8uZGVidWcoImFkZGluZyBzZWxlY3RlZERhdGUiKTsKK2Rvam8uaHRtbC5hZGRDbGFzcyh0aGlzLmNsaWNrZWROb2RlLHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZERhdGUpOwordGhpcy5zZWxlY3RlZE5vZGU9dGhpcy5jbGlja2VkTm9kZTsKK31lbHNlewordGhpcy5fcHJlSW5pdFVJKHRoaXMudmFsdWUsZmFsc2UsdHJ1ZSk7Cit9Cit0aGlzLmNsaWNrZWROb2RlPW51bGw7Cit0aGlzLm9uVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpOworfSxfcHJlSW5pdFVJOmZ1bmN0aW9uKF9lMTQsX2UxNSxfZTE2KXsKK2lmKHR5cGVvZiAodGhpcy5zdGFydERhdGUpPT0ic3RyaW5nIil7Cit0aGlzLnN0YXJ0RGF0ZT1kb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy5zdGFydERhdGUpOworfQoraWYodHlwZW9mICh0aGlzLmVuZERhdGUpPT0ic3RyaW5nIil7Cit0aGlzLmVuZERhdGU9ZG9qby5kYXRlLmZyb21SZmMzMzM5KHRoaXMuZW5kRGF0ZSk7Cit9Cit0aGlzLnN0YXJ0RGF0ZS5zZXRIb3VycygwLDAsMCwwKTsKK3RoaXMuZW5kRGF0ZS5zZXRIb3VycygyNCwwLDAsLTEpOworaWYoX2UxNDx0aGlzLnN0YXJ0RGF0ZXx8X2UxND50aGlzLmVuZERhdGUpeworX2UxND1uZXcgRGF0ZSgoX2UxNDx0aGlzLnN0YXJ0RGF0ZSk/dGhpcy5zdGFydERhdGU6dGhpcy5lbmREYXRlKTsKK30KK3RoaXMuZmlyc3REYXk9dGhpcy5faW5pdEZpcnN0RGF5KF9lMTQsX2UxNSk7Cit0aGlzLnNlbGVjdGVkSXNVc2VkPWZhbHNlOwordGhpcy5jdXJyZW50SXNVc2VkPWZhbHNlOwordmFyIF9lMTc9bmV3IERhdGUodGhpcy5maXJzdERheSk7Cit2YXIgX2UxOD1fZTE3LmdldE1vbnRoKCk7Cit0aGlzLmN1ck1vbnRoPW5ldyBEYXRlKF9lMTcpOwordGhpcy5jdXJNb250aC5zZXREYXRlKF9lMTcuZ2V0RGF0ZSgpKzYpOwordGhpcy5jdXJNb250aC5zZXREYXRlKDEpOworaWYodGhpcy5kaXNwbGF5V2Vla3M9PSIifHx0aGlzLmFkanVzdFdlZWtzKXsKK3RoaXMuYWRqdXN0V2Vla3M9dHJ1ZTsKK3RoaXMuZGlzcGxheVdlZWtzPU1hdGguY2VpbCgoZG9qby5kYXRlLmdldERheXNJbk1vbnRoKHRoaXMuY3VyTW9udGgpK3RoaXMuX2dldEFkanVzdGVkRGF5KHRoaXMuY3VyTW9udGgpKS83KTsKK30KK3ZhciBkYXlzPXRoaXMuZGlzcGxheVdlZWtzKjc7CitpZihkb2pvLmRhdGUuZGlmZih0aGlzLnN0YXJ0RGF0ZSx0aGlzLmVuZERhdGUsZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVkpPGRheXMpewordGhpcy5zdGF0aWNEaXNwbGF5PXRydWU7CitpZihkb2pvLmRhdGUuZGlmZihfZTE3LHRoaXMuZW5kRGF0ZSxkb2pvLmRhdGUuZGF0ZVBhcnRzLkRBWSk+ZGF5cyl7Cit0aGlzLl9wcmVJbml0VUkodGhpcy5zdGFydERhdGUsdHJ1ZSxmYWxzZSk7CitfZTE3PW5ldyBEYXRlKHRoaXMuZmlyc3REYXkpOworfQordGhpcy5jdXJNb250aD1uZXcgRGF0ZShfZTE3KTsKK3RoaXMuY3VyTW9udGguc2V0RGF0ZShfZTE3LmdldERhdGUoKSs2KTsKK3RoaXMuY3VyTW9udGguc2V0RGF0ZSgxKTsKK3ZhciBfZTFhPShfZTE3LmdldE1vbnRoKCk9PXRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSk/ImN1cnJlbnQiOiJwcmV2aW91cyI7Cit9CitpZihfZTE2KXsKK3RoaXMuX2luaXRVSShkYXlzKTsKK30KK30sX2luaXRVSTpmdW5jdGlvbihkYXlzKXsKK2Rvam8uZG9tLnJlbW92ZUNoaWxkcmVuKHRoaXMuY2FsZW5kYXJEYXRlc0NvbnRhaW5lck5vZGUpOworZm9yKHZhciBpPTA7aTx0aGlzLmRpc3BsYXlXZWVrcztpKyspewordGhpcy5jYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh0aGlzLndlZWtUZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSkpOworfQordmFyIF9lMWQ9bmV3IERhdGUodGhpcy5maXJzdERheSk7Cit0aGlzLl9zZXRNb250aExhYmVsKHRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSk7Cit0aGlzLl9zZXRZZWFyTGFiZWxzKHRoaXMuY3VyTW9udGguZ2V0RnVsbFllYXIoKSk7Cit2YXIgX2UxZT10aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwordmFyIF9lMWY9dGhpcy5jYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKTsKK3ZhciBfZTIwOworZm9yKGk9MDtpPGRheXM7aSsrKXsKK19lMjA9X2UxZS5pdGVtKGkpOworX2UyMC5pbm5lckhUTUw9X2UxZC5nZXREYXRlKCk7CitfZTIwLnNldEF0dHJpYnV0ZSgiZGpEYXRlVmFsdWUiLF9lMWQudmFsdWVPZigpKTsKK3ZhciBfZTIxPShfZTFkLmdldE1vbnRoKCkhPXRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSYmTnVtYmVyKF9lMWQpPE51bWJlcih0aGlzLmN1ck1vbnRoKSk/InByZXZpb3VzIjooX2UxZC5nZXRNb250aCgpPT10aGlzLmN1ck1vbnRoLmdldE1vbnRoKCkpPyJjdXJyZW50IjoibmV4dCI7Cit2YXIgX2UyMj1fZTIxOworaWYodGhpcy5faXNEaXNhYmxlZERhdGUoX2UxZCkpewordmFyIF9lMjM9e3ByZXZpb3VzOiJkaXNhYmxlZFByZXZpb3VzIixjdXJyZW50OiJkaXNhYmxlZEN1cnJlbnQiLG5leHQ6ImRpc2FibGVkTmV4dCJ9OworX2UyMj1fZTIzW19lMjFdOworfQorZG9qby5odG1sLnNldENsYXNzKF9lMjAsdGhpcy5fZ2V0RGF0ZUNsYXNzTmFtZShfZTFkLF9lMjIpKTsKK2lmKGRvam8uaHRtbC5oYXNDbGFzcyhfZTIwLHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZERhdGUpKXsKK3RoaXMuc2VsZWN0ZWROb2RlPV9lMjA7Cit9CitfZTFkPWRvam8uZGF0ZS5hZGQoX2UxZCxkb2pvLmRhdGUuZGF0ZVBhcnRzLkRBWSwxKTsKK30KK3RoaXMubGFzdERheT1kb2pvLmRhdGUuYWRkKF9lMWQsZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVksLTEpOwordGhpcy5faW5pdENvbnRyb2xzKCk7Cit9LF9pbml0Q29udHJvbHM6ZnVuY3Rpb24oKXsKK3ZhciBkPXRoaXMuZmlyc3REYXk7Cit2YXIgZDI9dGhpcy5sYXN0RGF5OwordmFyIF9lMjYsX2UyNyxfZTI4LF9lMjksX2UyYSxfZTJiOworX2UyNj1fZTI3PV9lMjg9X2UyOT1fZTJhPV9lMmI9IXRoaXMuc3RhdGljRGlzcGxheTsKK3dpdGgoZG9qby5kYXRlLmRhdGVQYXJ0cyl7Cit2YXIgYWRkPWRvam8uZGF0ZS5hZGQ7CitpZihfZTI2JiZhZGQoZCxEQVksKC0xKih0aGlzLl9nZXRBZGp1c3RlZERheShkKSsxKSkpPHRoaXMuc3RhcnREYXRlKXsKK19lMjY9X2UyOD1fZTJhPWZhbHNlOworfQoraWYoX2UyNyYmZDI+dGhpcy5lbmREYXRlKXsKK19lMjc9X2UyOT1fZTJiPWZhbHNlOworfQoraWYoX2UyOCYmYWRkKGQsREFZLC0xKTx0aGlzLnN0YXJ0RGF0ZSl7CitfZTI4PV9lMmE9ZmFsc2U7Cit9CitpZihfZTI5JiZhZGQoZDIsREFZLDEpPnRoaXMuZW5kRGF0ZSl7CitfZTI5PV9lMmI9ZmFsc2U7Cit9CitpZihfZTJhJiZhZGQoZDIsWUVBUiwtMSk8dGhpcy5zdGFydERhdGUpeworX2UyYT1mYWxzZTsKK30KK2lmKF9lMmImJmFkZChkLFlFQVIsMSk+dGhpcy5lbmREYXRlKXsKK19lMmI9ZmFsc2U7Cit9Cit9CitmdW5jdGlvbiBlbmFibGVDb250cm9sKG5vZGUsX2UyZSl7Citkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eShub2RlLF9lMmU/IiI6ImhpZGRlbiIpOworfQorZW5hYmxlQ29udHJvbCh0aGlzLmRlY3JlYXNlV2Vla05vZGUsX2UyNik7CitlbmFibGVDb250cm9sKHRoaXMuaW5jcmVhc2VXZWVrTm9kZSxfZTI3KTsKK2VuYWJsZUNvbnRyb2wodGhpcy5kZWNyZWFzZU1vbnRoTm9kZSxfZTI4KTsKK2VuYWJsZUNvbnRyb2wodGhpcy5pbmNyZWFzZU1vbnRoTm9kZSxfZTI5KTsKK2VuYWJsZUNvbnRyb2wodGhpcy5wcmV2aW91c1llYXJMYWJlbE5vZGUsX2UyYSk7CitlbmFibGVDb250cm9sKHRoaXMubmV4dFllYXJMYWJlbE5vZGUsX2UyYik7Cit9LF9pbmNyZW1lbnRXZWVrOmZ1bmN0aW9uKGV2dCl7Cit2YXIgZD1uZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKK3N3aXRjaChldnQudGFyZ2V0KXsKK2Nhc2UgdGhpcy5pbmNyZWFzZVdlZWtOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorY2FzZSB0aGlzLmluY3JlYXNlV2Vla05vZGU6Cit2YXIgX2UzMT1kb2pvLmRhdGUuYWRkKGQsZG9qby5kYXRlLmRhdGVQYXJ0cy5XRUVLLDEpOworaWYoX2UzMTx0aGlzLmVuZERhdGUpeworZD1kb2pvLmRhdGUuYWRkKGQsZG9qby5kYXRlLmRhdGVQYXJ0cy5XRUVLLDEpOworfQorYnJlYWs7CitjYXNlIHRoaXMuZGVjcmVhc2VXZWVrTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIikuaXRlbSgwKToKK2Nhc2UgdGhpcy5kZWNyZWFzZVdlZWtOb2RlOgoraWYoZD49dGhpcy5zdGFydERhdGUpeworZD1kb2pvLmRhdGUuYWRkKGQsZG9qby5kYXRlLmRhdGVQYXJ0cy5XRUVLLC0xKTsKK30KK2JyZWFrOworfQordGhpcy5fcHJlSW5pdFVJKGQsdHJ1ZSx0cnVlKTsKK30sX2luY3JlbWVudE1vbnRoOmZ1bmN0aW9uKGV2dCl7Cit2YXIgZD1uZXcgRGF0ZSh0aGlzLmN1ck1vbnRoKTsKK3ZhciBfZTM0PW5ldyBEYXRlKHRoaXMuZmlyc3REYXkpOworc3dpdGNoKGV2dC5jdXJyZW50VGFyZ2V0KXsKK2Nhc2UgdGhpcy5pbmNyZWFzZU1vbnRoTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIikuaXRlbSgwKToKK2Nhc2UgdGhpcy5pbmNyZWFzZU1vbnRoTm9kZToKK19lMzQ9ZG9qby5kYXRlLmFkZChfZTM0LGRvam8uZGF0ZS5kYXRlUGFydHMuREFZLHRoaXMuZGlzcGxheVdlZWtzKjcpOworaWYoX2UzNDx0aGlzLmVuZERhdGUpeworZD1kb2pvLmRhdGUuYWRkKGQsZG9qby5kYXRlLmRhdGVQYXJ0cy5NT05USCwxKTsKK31lbHNlewordmFyIF9lMzU9dHJ1ZTsKK30KK2JyZWFrOworY2FzZSB0aGlzLmRlY3JlYXNlTW9udGhOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorY2FzZSB0aGlzLmRlY3JlYXNlTW9udGhOb2RlOgoraWYoX2UzND50aGlzLnN0YXJ0RGF0ZSl7CitkPWRvam8uZGF0ZS5hZGQoZCxkb2pvLmRhdGUuZGF0ZVBhcnRzLk1PTlRILC0xKTsKK31lbHNlewordmFyIF9lMzY9dHJ1ZTsKK30KK2JyZWFrOworfQoraWYoX2UzNil7CitkPW5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKTsKK31lbHNleworaWYoX2UzNSl7CitkPW5ldyBEYXRlKHRoaXMuZW5kRGF0ZSk7Cit9Cit9Cit0aGlzLl9wcmVJbml0VUkoZCxmYWxzZSx0cnVlKTsKK30sX2luY3JlbWVudFllYXI6ZnVuY3Rpb24oZXZ0KXsKK3ZhciB5ZWFyPXRoaXMuY3VyTW9udGguZ2V0RnVsbFllYXIoKTsKK3ZhciBfZTM5PW5ldyBEYXRlKHRoaXMuZmlyc3REYXkpOworc3dpdGNoKGV2dC50YXJnZXQpeworY2FzZSB0aGlzLm5leHRZZWFyTGFiZWxOb2RlOgorX2UzOT1kb2pvLmRhdGUuYWRkKF9lMzksZG9qby5kYXRlLmRhdGVQYXJ0cy5ZRUFSLDEpOworaWYoX2UzOTx0aGlzLmVuZERhdGUpeworeWVhcisrOworfWVsc2V7Cit2YXIgX2UzYT10cnVlOworfQorYnJlYWs7CitjYXNlIHRoaXMucHJldmlvdXNZZWFyTGFiZWxOb2RlOgorX2UzOT1kb2pvLmRhdGUuYWRkKF9lMzksZG9qby5kYXRlLmRhdGVQYXJ0cy5ZRUFSLC0xKTsKK2lmKF9lMzk+dGhpcy5zdGFydERhdGUpeworeWVhci0tOworfWVsc2V7Cit2YXIgX2UzYj10cnVlOworfQorYnJlYWs7Cit9Cit2YXIgZDsKK2lmKF9lM2IpeworZD1uZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSk7Cit9ZWxzZXsKK2lmKF9lM2EpeworZD1uZXcgRGF0ZSh0aGlzLmVuZERhdGUpOworfWVsc2V7CitkPW5ldyBEYXRlKHllYXIsdGhpcy5jdXJNb250aC5nZXRNb250aCgpLDEpOworfQorfQordGhpcy5fcHJlSW5pdFVJKGQsZmFsc2UsdHJ1ZSk7Cit9LG9uSW5jcmVtZW50V2VlazpmdW5jdGlvbihldnQpeworZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworaWYoIXRoaXMuc3RhdGljRGlzcGxheSl7Cit0aGlzLl9pbmNyZW1lbnRXZWVrKGV2dCk7Cit9Cit9LG9uSW5jcmVtZW50TW9udGg6ZnVuY3Rpb24oZXZ0KXsKK2V2dC5zdG9wUHJvcGFnYXRpb24oKTsKK2lmKCF0aGlzLnN0YXRpY0Rpc3BsYXkpewordGhpcy5faW5jcmVtZW50TW9udGgoZXZ0KTsKK30KK30sb25JbmNyZW1lbnRZZWFyOmZ1bmN0aW9uKGV2dCl7CitldnQuc3RvcFByb3BhZ2F0aW9uKCk7CitpZighdGhpcy5zdGF0aWNEaXNwbGF5KXsKK3RoaXMuX2luY3JlbWVudFllYXIoZXZ0KTsKK30KK30sX3NldE1vbnRoTGFiZWw6ZnVuY3Rpb24oX2U0MCl7Cit0aGlzLm1vbnRoTGFiZWxOb2RlLmlubmVySFRNTD1kb2pvLmRhdGUuZ2V0TmFtZXMoIm1vbnRocyIsIndpZGUiLCJzdGFuZEFsb25lIix0aGlzLmxhbmcpW19lNDBdOworfSxfc2V0WWVhckxhYmVsczpmdW5jdGlvbih5ZWFyKXsKK3ZhciB5PXllYXItMTsKK3ZhciB0aGF0PXRoaXM7CitmdW5jdGlvbiBmKG4pewordGhhdFtuKyJZZWFyTGFiZWxOb2RlIl0uaW5uZXJIVE1MPWRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoeSsrLDApLHtmb3JtYXRMZW5ndGg6InllYXJPbmx5Iixsb2NhbGU6dGhhdC5sYW5nfSk7Cit9CitmKCJwcmV2aW91cyIpOworZigiY3VycmVudCIpOworZigibmV4dCIpOworfSxfZ2V0RGF0ZUNsYXNzTmFtZTpmdW5jdGlvbihkYXRlLF9lNDYpewordmFyIF9lNDc9dGhpcy5jbGFzc05hbWVzW19lNDZdOworaWYoKCF0aGlzLnNlbGVjdGVkSXNVc2VkJiZ0aGlzLnZhbHVlKSYmKE51bWJlcihkYXRlKT09TnVtYmVyKHRoaXMudmFsdWUpKSl7CitfZTQ3PXRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZERhdGUrIiAiK19lNDc7Cit0aGlzLnNlbGVjdGVkSXNVc2VkPXRydWU7Cit9CitpZigoIXRoaXMuY3VycmVudElzVXNlZCkmJihOdW1iZXIoZGF0ZSk9PU51bWJlcih0aGlzLnRvZGF5KSkpeworX2U0Nz1fZTQ3KyIgIit0aGlzLmNsYXNzTmFtZXMuY3VycmVudERhdGU7Cit0aGlzLmN1cnJlbnRJc1VzZWQ9dHJ1ZTsKK30KK3JldHVybiBfZTQ3OworfSxvbkNsaWNrOmZ1bmN0aW9uKGV2dCl7Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7Cit9LF9oYW5kbGVVaUNsaWNrOmZ1bmN0aW9uKGV2dCl7Cit2YXIgX2U0YT1ldnQudGFyZ2V0OworaWYoX2U0YS5ub2RlVHlwZSE9ZG9qby5kb20uRUxFTUVOVF9OT0RFKXsKK19lNGE9X2U0YS5wYXJlbnROb2RlOworfQorZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOwordGhpcy5zZWxlY3RlZElzVXNlZD10aGlzLnRvZGF5SXNVc2VkPWZhbHNlOworaWYoZG9qby5odG1sLmhhc0NsYXNzKF9lNGEsdGhpcy5jbGFzc05hbWVzWyJkaXNhYmxlZFByZXZpb3VzIl0pfHxkb2pvLmh0bWwuaGFzQ2xhc3MoX2U0YSx0aGlzLmNsYXNzTmFtZXNbImRpc2FibGVkQ3VycmVudCJdKXx8ZG9qby5odG1sLmhhc0NsYXNzKF9lNGEsdGhpcy5jbGFzc05hbWVzWyJkaXNhYmxlZE5leHQiXSkpeworcmV0dXJuOworfQordGhpcy5jbGlja2VkTm9kZT1fZTRhOwordGhpcy5zZXREYXRlKG5ldyBEYXRlKE51bWJlcihkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKF9lNGEsImRqRGF0ZVZhbHVlIikpKSk7Cit9LG9uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGRhdGUpeworfSxfaXNEaXNhYmxlZERhdGU6ZnVuY3Rpb24oX2U0Yyl7CitpZihfZTRjPHRoaXMuc3RhcnREYXRlfHxfZTRjPnRoaXMuZW5kRGF0ZSl7CityZXR1cm4gdHJ1ZTsKK30KK3JldHVybiB0aGlzLmlzRGlzYWJsZWREYXRlKF9lNGMsdGhpcy5sYW5nKTsKK30saXNEaXNhYmxlZERhdGU6ZnVuY3Rpb24oX2U0ZCxfZTRlKXsKK3JldHVybiBmYWxzZTsKK30sX2luaXRGaXJzdERheTpmdW5jdGlvbihfZTRmLGFkail7Cit2YXIgZD1uZXcgRGF0ZShfZTRmKTsKK2lmKCFhZGopeworZC5zZXREYXRlKDEpOworfQorZC5zZXREYXRlKGQuZ2V0RGF0ZSgpLXRoaXMuX2dldEFkanVzdGVkRGF5KGQsdGhpcy53ZWVrU3RhcnRzT24pKTsKK2Quc2V0SG91cnMoMCwwLDAsMCk7CityZXR1cm4gZDsKK30sX2dldEFkanVzdGVkRGF5OmZ1bmN0aW9uKF9lNTIpewordmFyIGRheXM9WzAsMSwyLDMsNCw1LDZdOworaWYodGhpcy53ZWVrU3RhcnRzT24+MCl7Citmb3IodmFyIGk9MDtpPHRoaXMud2Vla1N0YXJ0c09uO2krKyl7CitkYXlzLnVuc2hpZnQoZGF5cy5wb3AoKSk7Cit9Cit9CityZXR1cm4gZGF5c1tfZTUyLmdldERheSgpXTsKK30sZGVzdHJveTpmdW5jdGlvbigpeworZG9qby53aWRnZXQuRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworZG9qby5odG1sLmRlc3Ryb3lOb2RlKHRoaXMud2Vla1RlbXBsYXRlKTsKK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlciIsZG9qby53aWRnZXQuRHJvcGRvd25Db250YWluZXIse2ljb25VUkw6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvZGF0ZUljb24uZ2lmIiksZm9ybWF0TGVuZ3RoOiJzaG9ydCIsZGlzcGxheUZvcm1hdDoiIixzYXZlRm9ybWF0OiIiLHZhbHVlOiIiLG5hbWU6IiIsZGlzcGxheVdlZWtzOjYsYWRqdXN0V2Vla3M6ZmFsc2Usc3RhcnREYXRlOiIxNDkyLTEwLTEyIixlbmREYXRlOiIyOTQxLTEwLTEyIix3ZWVrU3RhcnRzT246IiIsc3RhdGljRGlzcGxheTpmYWxzZSxwb3N0TWl4SW5Qcm9wZXJ0aWVzOmZ1bmN0aW9uKF9lNTUsZnJhZyl7Citkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3ZhciBfZTU3PWRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oImRvam8ud2lkZ2V0IiwiRHJvcGRvd25EYXRlUGlja2VyIix0aGlzLmxhbmcpOwordGhpcy5pY29uQWx0PV9lNTcuc2VsZWN0RGF0ZTsKK2lmKHR5cGVvZiAodGhpcy52YWx1ZSk9PSJzdHJpbmciJiZ0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCk9PSJ0b2RheSIpewordGhpcy52YWx1ZT1uZXcgRGF0ZSgpOworfQoraWYodGhpcy52YWx1ZSYmaXNOYU4odGhpcy52YWx1ZSkpewordmFyIG9yaWc9dGhpcy52YWx1ZTsKK3RoaXMudmFsdWU9ZG9qby5kYXRlLmZyb21SZmMzMzM5KHRoaXMudmFsdWUpOworaWYoIXRoaXMudmFsdWUpewordGhpcy52YWx1ZT1uZXcgRGF0ZShvcmlnKTsKK2Rvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIiwiZGF0ZSBhdHRyaWJ1dGVzIG11c3QgYmUgcGFzc2VkIGluIFJmYzMzMzkgZm9ybWF0IiwiMC41Iik7Cit9Cit9CitpZih0aGlzLnZhbHVlJiYhaXNOYU4odGhpcy52YWx1ZSkpewordGhpcy52YWx1ZT1uZXcgRGF0ZSh0aGlzLnZhbHVlKTsKK30KK30sZmlsbEluVGVtcGxhdGU6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK2Rvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcyxhcmdzLGZyYWcpOwordmFyIF9lNWI9e3dpZGdldENvbnRhaW5lcklkOnRoaXMud2lkZ2V0SWQsbGFuZzp0aGlzLmxhbmcsdmFsdWU6dGhpcy52YWx1ZSxzdGFydERhdGU6dGhpcy5zdGFydERhdGUsZW5kRGF0ZTp0aGlzLmVuZERhdGUsZGlzcGxheVdlZWtzOnRoaXMuZGlzcGxheVdlZWtzLHdlZWtTdGFydHNPbjp0aGlzLndlZWtTdGFydHNPbixhZGp1c3RXZWVrczp0aGlzLmFkanVzdFdlZWtzLHN0YXRpY0Rpc3BsYXk6dGhpcy5zdGF0aWNEaXNwbGF5fTsKK3RoaXMuZGF0ZVBpY2tlcj1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkRhdGVQaWNrZXIiLF9lNWIsdGhpcy5jb250YWluZXJOb2RlLCJjaGlsZCIpOworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZGF0ZVBpY2tlciwib25WYWx1ZUNoYW5nZWQiLHRoaXMsIl91cGRhdGVUZXh0Iik7Citkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5pbnB1dE5vZGUsIm9uQ2hhbmdlIix0aGlzLCJfdXBkYXRlVGV4dCIpOworaWYodGhpcy52YWx1ZSl7Cit0aGlzLl91cGRhdGVUZXh0KCk7Cit9Cit0aGlzLmNvbnRhaW5lck5vZGUuZXhwbG9kZUNsYXNzTmFtZT0iY2FsZW5kYXJCb2R5Q29udGFpbmVyIjsKK3RoaXMudmFsdWVOb2RlLm5hbWU9dGhpcy5uYW1lOworfSxnZXRWYWx1ZTpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudmFsdWVOb2RlLnZhbHVlOworfSxnZXREYXRlOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy5kYXRlUGlja2VyLnZhbHVlOworfSxzZXRWYWx1ZTpmdW5jdGlvbihfZTVjKXsKK3RoaXMuc2V0RGF0ZShfZTVjKTsKK30sc2V0RGF0ZTpmdW5jdGlvbihfZTVkKXsKK3RoaXMuZGF0ZVBpY2tlci5zZXREYXRlKF9lNWQpOwordGhpcy5fc3luY1ZhbHVlTm9kZSgpOworfSxfdXBkYXRlVGV4dDpmdW5jdGlvbigpewordGhpcy5pbnB1dE5vZGUudmFsdWU9dGhpcy5kYXRlUGlja2VyLnZhbHVlP2Rvam8uZGF0ZS5mb3JtYXQodGhpcy5kYXRlUGlja2VyLnZhbHVlLHtmb3JtYXRMZW5ndGg6dGhpcy5mb3JtYXRMZW5ndGgsZGF0ZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0LHNlbGVjdG9yOiJkYXRlT25seSIsbG9jYWxlOnRoaXMubGFuZ30pOiIiOworaWYodGhpcy52YWx1ZTx0aGlzLmRhdGVQaWNrZXIuc3RhcnREYXRlfHx0aGlzLnZhbHVlPnRoaXMuZGF0ZVBpY2tlci5lbmREYXRlKXsKK3RoaXMuaW5wdXROb2RlLnZhbHVlPSIiOworfQordGhpcy5fc3luY1ZhbHVlTm9kZSgpOwordGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLmdldERhdGUoKSk7Cit0aGlzLmhpZGVDb250YWluZXIoKTsKK30sb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oX2U1ZSl7Cit9LG9uSW5wdXRDaGFuZ2U6ZnVuY3Rpb24oKXsKK3ZhciBfZTVmPWRvam8uc3RyaW5nLnRyaW0odGhpcy5pbnB1dE5vZGUudmFsdWUpOworaWYoX2U1Zil7Cit2YXIgX2U2MD1kb2pvLmRhdGUucGFyc2UoX2U1Zix7Zm9ybWF0TGVuZ3RoOnRoaXMuZm9ybWF0TGVuZ3RoLGRhdGVQYXR0ZXJuOnRoaXMuZGlzcGxheUZvcm1hdCxzZWxlY3RvcjoiZGF0ZU9ubHkiLGxvY2FsZTp0aGlzLmxhbmd9KTsKK2lmKCF0aGlzLmRhdGVQaWNrZXIuX2lzRGlzYWJsZWREYXRlKF9lNjApKXsKK3RoaXMuc2V0RGF0ZShfZTYwKTsKK30KK31lbHNleworaWYoX2U1Zj09IiIpewordGhpcy5kYXRlUGlja2VyLnNldERhdGUoIiIpOworfQordGhpcy52YWx1ZU5vZGUudmFsdWU9X2U1ZjsKK30KK2lmKF9lNWYpewordGhpcy5fdXBkYXRlVGV4dCgpOworfQorfSxfc3luY1ZhbHVlTm9kZTpmdW5jdGlvbigpewordmFyIGRhdGU9dGhpcy5kYXRlUGlja2VyLnZhbHVlOwordmFyIF9lNjI9IiI7Citzd2l0Y2godGhpcy5zYXZlRm9ybWF0LnRvTG93ZXJDYXNlKCkpeworY2FzZSAicmZjIjoKK2Nhc2UgImlzbyI6CitjYXNlICIiOgorX2U2Mj1kb2pvLmRhdGUudG9SZmMzMzM5KGRhdGUsImRhdGVPbmx5Iik7CiticmVhazsKK2Nhc2UgInBvc2l4IjoKK2Nhc2UgInVuaXgiOgorX2U2Mj1OdW1iZXIoZGF0ZSk7CiticmVhazsKK2RlZmF1bHQ6CitpZihkYXRlKXsKK19lNjI9ZG9qby5kYXRlLmZvcm1hdChkYXRlLHtkYXRlUGF0dGVybjp0aGlzLnNhdmVGb3JtYXQsc2VsZWN0b3I6ImRhdGVPbmx5Iixsb2NhbGU6dGhpcy5sYW5nfSk7Cit9Cit9Cit0aGlzLnZhbHVlTm9kZS52YWx1ZT1fZTYyOworfSxkZXN0cm95OmZ1bmN0aW9uKF9lNjMpewordGhpcy5kYXRlUGlja2VyLmRlc3Ryb3koX2U2Myk7Citkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK319KTsKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoInN0cnV0cy53aWRnZXQuU3RydXRzRGF0ZVBpY2tlciIsZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyLHt3aWRnZXRUeXBlOiJTdHJ1dHNEYXRlUGlja2VyIix2YWx1ZU5vdGlmeVRvcGljczoiIix2YWx1ZU5vdGlmeVRvcGljc0FycmF5Om51bGwsdGFiSW5kZXg6IiIscG9zdENyZWF0ZTpmdW5jdGlvbigpeworc3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitpZih0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSl7Citkb2pvLmh0bWwuc2V0Q2xhc3ModGhpcy5pbnB1dE5vZGUsdGhpcy5leHRyYUFyZ3NbImNsYXNzIl0pOworfQoraWYodGhpcy5leHRyYUFyZ3Muc3R5bGUpeworZG9qby5odG1sLnNldFN0eWxlVGV4dCh0aGlzLmlucHV0Tm9kZSx0aGlzLmV4dHJhQXJncy5zdHlsZSk7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnZhbHVlTm90aWZ5VG9waWNzKSl7Cit0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXk9dGhpcy52YWx1ZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YWJJbmRleCkpewordGhpcy5pbnB1dE5vZGUudGFiSW5kZXg9dGhpcy50YWJJbmRleDsKK30KK30sX3N5bmNWYWx1ZU5vZGU6ZnVuY3Rpb24oKXsKK3ZhciBkYXRlPXRoaXMuZGF0ZVBpY2tlci52YWx1ZTsKK3ZhciBfZTY1PSIiOworc3dpdGNoKHRoaXMuc2F2ZUZvcm1hdC50b0xvd2VyQ2FzZSgpKXsKK2Nhc2UgInJmYyI6CitjYXNlICJpc28iOgorY2FzZSAiIjoKK19lNjU9ZG9qby5kYXRlLnRvUmZjMzMzOShkYXRlKTsKK2JyZWFrOworY2FzZSAicG9zaXgiOgorY2FzZSAidW5peCI6CitfZTY1PU51bWJlcihkYXRlKTsKK2JyZWFrOworZGVmYXVsdDoKK2lmKGRhdGUpeworX2U2NT1kb2pvLmRhdGUuZm9ybWF0KGRhdGUse2RhdGVQYXR0ZXJuOnRoaXMuc2F2ZUZvcm1hdCxzZWxlY3RvcjoiZGF0ZU9ubHkiLGxvY2FsZTp0aGlzLmxhbmd9KTsKK30KK30KK3RoaXMudmFsdWVOb2RlLnZhbHVlPV9lNjU7Cit9LF91cGRhdGVUZXh0OmZ1bmN0aW9uKCl7CitzdHJ1dHMud2lkZ2V0LlN0cnV0c0RhdGVQaWNrZXIuc3VwZXJjbGFzcy5fdXBkYXRlVGV4dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitpZih0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXkhPW51bGwpeworZm9yKHZhciBpPTA7aTx0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXkubGVuZ3RoO2krKyl7Cit2YXIgX2U2Nz10aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXlbaV07CitpZighZG9qby5zdHJpbmcuaXNCbGFuayhfZTY3KSl7Cit0cnl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2U2Nyx0aGlzLmlucHV0Tm9kZS52YWx1ZSx0aGlzLmdldFZhbHVlKCksdGhpcyk7Cit9CitjYXRjaChleCl7Citkb2pvLmRlYnVnKGV4KTsKK30KK30KK30KK30KK319KTsKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRXZlbnQiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgic3RydXRzLndpZGdldC5CaW5kRXZlbnQiLHN0cnV0cy53aWRnZXQuQmluZCx7d2lkZ2V0VHlwZToiQmluZEV2ZW50Iixzb3VyY2VzOiIiLHBvc3RDcmVhdGU6ZnVuY3Rpb24oKXsKK3N0cnV0cy53aWRnZXQuQmluZEV2ZW50LnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzKTsKK3ZhciBzZWxmPXRoaXM7CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmV2ZW50cykmJiFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc291cmNlcykpewordmFyIF9lNjk9dGhpcy5ldmVudHMuc3BsaXQoIiwiKTsKK3ZhciBfZTZhPXRoaXMuc291cmNlcy5zcGxpdCgiLCIpOworaWYoX2U2OSYmdGhpcy5kb21Ob2RlKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF9lNjksZnVuY3Rpb24oX2U2Yil7Citkb2pvLmxhbmcuZm9yRWFjaChfZTZhLGZ1bmN0aW9uKF9lNmMpewordmFyIF9lNmQ9ZG9qby5ieUlkKF9lNmMpOworaWYoX2U2ZCl7Citkb2pvLmV2ZW50LmNvbm5lY3QoX2U2ZCxfZTZiLGZ1bmN0aW9uKGV2dCl7CitldnQucHJldmVudERlZmF1bHQoKTsKK2V2dC5zdG9wUHJvcGFnYXRpb24oKTsKK3NlbGYucmVsb2FkQ29udGVudHMoKTsKK30pOworfQorfSk7Cit9KTsKK30KK30KK319KTsKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVTZWxlY3RvciIsZG9qby53aWRnZXQuSHRtbFdpZGdldCxmdW5jdGlvbigpewordGhpcy5ldmVudE5hbWVzPXt9OwordGhpcy5saXN0ZW5lZFRyZWVzPVtdOworfSx7d2lkZ2V0VHlwZToiVHJlZVNlbGVjdG9yIixzZWxlY3RlZE5vZGU6bnVsbCxkaWVXaXRoVHJlZTpmYWxzZSxldmVudE5hbWVzRGVmYXVsdDp7c2VsZWN0OiJzZWxlY3QiLGRlc3Ryb3k6ImRlc3Ryb3kiLGRlc2VsZWN0OiJkZXNlbGVjdCIsZGJsc2VsZWN0OiJkYmxzZWxlY3QifSxpbml0aWFsaXplOmZ1bmN0aW9uKCl7Citmb3IodmFyIG5hbWUgaW4gdGhpcy5ldmVudE5hbWVzRGVmYXVsdCl7CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQodGhpcy5ldmVudE5hbWVzW25hbWVdKSl7Cit0aGlzLmV2ZW50TmFtZXNbbmFtZV09dGhpcy53aWRnZXRJZCsiLyIrdGhpcy5ldmVudE5hbWVzRGVmYXVsdFtuYW1lXTsKK30KK30KK30sZGVzdHJveTpmdW5jdGlvbigpeworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5kZXN0cm95LHtzb3VyY2U6dGhpc30pOworcmV0dXJuIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxsaXN0ZW5UcmVlOmZ1bmN0aW9uKHRyZWUpeworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRpdGxlQ2xpY2ssdGhpcywic2VsZWN0Iik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuaWNvbkNsaWNrLHRoaXMsInNlbGVjdCIpOworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLHRoaXMsIm9uQ29sbGFwc2UiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSx0aGlzLCJvbk1vdmVGcm9tIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMucmVtb3ZlTm9kZSx0aGlzLCJvblJlbW92ZU5vZGUiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSx0aGlzLCJvblRyZWVEZXN0cm95Iik7Cit0aGlzLmxpc3RlbmVkVHJlZXMucHVzaCh0cmVlKTsKK30sdW5saXN0ZW5UcmVlOmZ1bmN0aW9uKHRyZWUpeworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudGl0bGVDbGljayx0aGlzLCJzZWxlY3QiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmljb25DbGljayx0aGlzLCJzZWxlY3QiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLHRoaXMsIm9uQ29sbGFwc2UiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLm1vdmVGcm9tLHRoaXMsIm9uTW92ZUZyb20iKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUsdGhpcywib25SZW1vdmVOb2RlIik7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSx0aGlzLCJvblRyZWVEZXN0cm95Iik7Citmb3IodmFyIGk9MDtpPHRoaXMubGlzdGVuZWRUcmVlcy5sZW5ndGg7aSsrKXsKK2lmKHRoaXMubGlzdGVuZWRUcmVlc1tpXT09PXRyZWUpewordGhpcy5saXN0ZW5lZFRyZWVzLnNwbGljZShpLDEpOworYnJlYWs7Cit9Cit9Cit9LG9uVHJlZURlc3Ryb3k6ZnVuY3Rpb24oX2U3Myl7Cit0aGlzLnVubGlzdGVuVHJlZShfZTczLnNvdXJjZSk7CitpZih0aGlzLmRpZVdpdGhUcmVlKXsKK3RoaXMuZGVzdHJveSgpOworfQorfSxvbkNvbGxhcHNlOmZ1bmN0aW9uKF9lNzQpeworaWYoIXRoaXMuc2VsZWN0ZWROb2RlKXsKK3JldHVybjsKK30KK3ZhciBub2RlPV9lNzQuc291cmNlOwordmFyIF9lNzY9dGhpcy5zZWxlY3RlZE5vZGUucGFyZW50Oword2hpbGUoX2U3NiE9PW5vZGUmJl9lNzYuaXNUcmVlTm9kZSl7CitfZTc2PV9lNzYucGFyZW50OworfQoraWYoX2U3Ni5pc1RyZWVOb2RlKXsKK3RoaXMuZGVzZWxlY3QoKTsKK30KK30sc2VsZWN0OmZ1bmN0aW9uKF9lNzcpewordmFyIG5vZGU9X2U3Ny5zb3VyY2U7Cit2YXIgZT1fZTc3LmV2ZW50OworaWYodGhpcy5zZWxlY3RlZE5vZGU9PT1ub2RlKXsKK2lmKGUuY3RybEtleXx8ZS5zaGlmdEtleXx8ZS5tZXRhS2V5KXsKK3RoaXMuZGVzZWxlY3QoKTsKK3JldHVybjsKK30KK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuZGJsc2VsZWN0LHtub2RlOm5vZGV9KTsKK3JldHVybjsKK30KK2lmKHRoaXMuc2VsZWN0ZWROb2RlKXsKK3RoaXMuZGVzZWxlY3QoKTsKK30KK3RoaXMuZG9TZWxlY3Qobm9kZSk7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLnNlbGVjdCx7bm9kZTpub2RlfSk7Cit9LG9uTW92ZUZyb206ZnVuY3Rpb24oX2U3YSl7CitpZihfZTdhLmNoaWxkIT09dGhpcy5zZWxlY3RlZE5vZGUpeworcmV0dXJuOworfQoraWYoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMubGlzdGVuZWRUcmVlcyxfZTdhLm5ld1RyZWUpKXsKK3RoaXMuZGVzZWxlY3QoKTsKK30KK30sb25SZW1vdmVOb2RlOmZ1bmN0aW9uKF9lN2IpeworaWYoX2U3Yi5jaGlsZCE9PXRoaXMuc2VsZWN0ZWROb2RlKXsKK3JldHVybjsKK30KK3RoaXMuZGVzZWxlY3QoKTsKK30sZG9TZWxlY3Q6ZnVuY3Rpb24obm9kZSl7Citub2RlLm1hcmtTZWxlY3RlZCgpOwordGhpcy5zZWxlY3RlZE5vZGU9bm9kZTsKK30sZGVzZWxlY3Q6ZnVuY3Rpb24oKXsKK3ZhciBub2RlPXRoaXMuc2VsZWN0ZWROb2RlOwordGhpcy5zZWxlY3RlZE5vZGU9bnVsbDsKK25vZGUudW5NYXJrU2VsZWN0ZWQoKTsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuZGVzZWxlY3Qse25vZGU6bm9kZX0pOworfX0pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3RvciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3RvciIsZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yLHt3aWRnZXRUeXBlOiJTdHJ1dHNUcmVlU2VsZWN0b3IiLHNlbGVjdGVkTm90aWZ5VG9waWNzOiIiLGNvbGxhcHNlZE5vdGlmeVRvcGljczoiIixleHBhbmRlZE5vdGlmeVRvcGljczoiIixzZWxlY3RlZE5vdGlmeVRvcGljc0FycmF5Om51bGwsY29sbGFwc2VkTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxleHBhbmRlZE5vdGlmeVRvcGljc0FycmF5Om51bGwsZXZlbnROYW1lc0RlZmF1bHQ6e3NlbGVjdDoic2VsZWN0IixkZXN0cm95OiJkZXN0cm95IixkZXNlbGVjdDoiZGVzZWxlY3QiLGRibHNlbGVjdDoiZGJsc2VsZWN0IixleHBhbmQ6ImV4cGFuZCIsY29sbGFwc2U6ImNvbGxhcHNlIn0saW5pdGlhbGl6ZTpmdW5jdGlvbigpeworc3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3Iuc3VwZXJjbGFzcy5pbml0aWFsaXplLmFwcGx5KHRoaXMpOworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcykpewordGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljc0FycmF5PXRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3MpKXsKK3RoaXMuY29sbGFwc2VkTm90aWZ5VG9waWNzQXJyYXk9dGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3MpKXsKK3RoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3NBcnJheT10aGlzLmV4cGFuZGVkTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9Cit9LGxpc3RlblRyZWU6ZnVuY3Rpb24odHJlZSl7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY29sbGFwc2UsdGhpcywiY29sbGFwc2UiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5leHBhbmQsdGhpcywiZXhwYW5kIik7CitzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVTZWxlY3Rvci5zdXBlcmNsYXNzLmxpc3RlblRyZWUuYXBwbHkodGhpcyxbdHJlZV0pOworfSx1bmxpc3RlblRyZWU6ZnVuY3Rpb24odHJlZSl7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jb2xsYXBzZSx0aGlzLCJjb2xsYXBzZSIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuZXhwYW5kLHRoaXMsImV4cGFuZCIpOworc3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3Iuc3VwZXJjbGFzcy51bmxpc3RlblRyZWUuYXBwbHkodGhpcyxbdHJlZV0pOworfSxwdWJsaXNoVG9waWNzOmZ1bmN0aW9uKF9lODAsbm9kZSl7CitpZihfZTgwIT1udWxsKXsKK2Zvcih2YXIgaT0wO2k8X2U4MC5sZW5ndGg7aSsrKXsKK3ZhciBfZTgzPV9lODBbaV07CitpZighZG9qby5zdHJpbmcuaXNCbGFuayhfZTgzKSl7Cit0cnl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2U4Myxub2RlKTsKK30KK2NhdGNoKGV4KXsKK2Rvam8uZGVidWcoZXgpOworfQorfQorfQorfQorfSxzZWxlY3Q6ZnVuY3Rpb24oX2U4NCl7Cit2YXIgbm9kZT1fZTg0LnNvdXJjZTsKK3ZhciBlPV9lODQuZXZlbnQ7CitpZih0aGlzLnNlbGVjdGVkTm9kZT09PW5vZGUpeworaWYoZS5jdHJsS2V5fHxlLnNoaWZ0S2V5fHxlLm1ldGFLZXkpewordGhpcy5kZXNlbGVjdCgpOworcmV0dXJuOworfQorZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5kYmxzZWxlY3Qse25vZGU6bm9kZX0pOworcmV0dXJuOworfQoraWYodGhpcy5zZWxlY3RlZE5vZGUpewordGhpcy5kZXNlbGVjdCgpOworfQordGhpcy5kb1NlbGVjdChub2RlKTsKK3RoaXMucHVibGlzaFRvcGljcyh0aGlzLnNlbGVjdGVkTm90aWZ5VG9waWNzQXJyYXkse25vZGU6bm9kZX0pOworfSxleHBhbmQ6ZnVuY3Rpb24oX2U4Nyl7Cit2YXIgbm9kZT1fZTg3LnNvdXJjZTsKK3RoaXMucHVibGlzaFRvcGljcyh0aGlzLmV4cGFuZGVkTm90aWZ5VG9waWNzQXJyYXkse25vZGU6bm9kZX0pOworfSxjb2xsYXBzZTpmdW5jdGlvbihfZTg5KXsKK3ZhciBub2RlPV9lODkuc291cmNlOwordGhpcy5wdWJsaXNoVG9waWNzKHRoaXMuY29sbGFwc2VkTm90aWZ5VG9waWNzQXJyYXkse25vZGU6bm9kZX0pOworfX0pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5QYWdlQ29udGFpbmVyIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiLGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQse2lzQ29udGFpbmVyOnRydWUsZG9MYXlvdXQ6dHJ1ZSx0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9J2NvbnRhaW5lck5vZGUnPjwvZGl2PiIsc2VsZWN0ZWRDaGlsZDoiIixmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpewordmFyIF9lOGQ9dGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKK2Rvam8uaHRtbC5jb3B5U3R5bGUodGhpcy5kb21Ob2RlLF9lOGQpOworZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbihhcmdzLGZyYWcpeworaWYodGhpcy5jaGlsZHJlbi5sZW5ndGgpeworZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbix0aGlzLl9zZXR1cENoaWxkLHRoaXMpOwordmFyIF9lOTA7CitpZih0aGlzLnNlbGVjdGVkQ2hpbGQpewordGhpcy5zZWxlY3RDaGlsZCh0aGlzLnNlbGVjdGVkQ2hpbGQpOworfWVsc2V7Citmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2krKyl7CitpZih0aGlzLmNoaWxkcmVuW2ldLnNlbGVjdGVkKXsKK3RoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlbltpXSk7CiticmVhazsKK30KK30KK2lmKCF0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpewordGhpcy5zZWxlY3RDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTsKK30KK30KK30KK30sYWRkQ2hpbGQ6ZnVuY3Rpb24oX2U5Mil7Citkb2pvLndpZGdldC5QYWdlQ29udGFpbmVyLnN1cGVyY2xhc3MuYWRkQ2hpbGQuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordGhpcy5fc2V0dXBDaGlsZChfZTkyKTsKK3RoaXMub25SZXNpemVkKCk7CitpZighdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KXsKK3RoaXMuc2VsZWN0Q2hpbGQoX2U5Mik7Cit9Cit9LF9zZXR1cENoaWxkOmZ1bmN0aW9uKHBhZ2UpeworcGFnZS5oaWRlKCk7CitwYWdlLmRvbU5vZGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLndpZGdldElkKyItYWRkQ2hpbGQiLHBhZ2UpOworfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihwYWdlKXsKK2Rvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5yZW1vdmVDaGlsZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitpZih0aGlzLl9iZWluZ0Rlc3Ryb3llZCl7CityZXR1cm47Cit9Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy53aWRnZXRJZCsiLXJlbW92ZUNoaWxkIixwYWdlKTsKK3RoaXMub25SZXNpemVkKCk7CitpZih0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQ9PT1wYWdlKXsKK3RoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldD11bmRlZmluZWQ7CitpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXsKK3RoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlblswXSx0cnVlKTsKK30KK30KK30sc2VsZWN0Q2hpbGQ6ZnVuY3Rpb24ocGFnZSxfZTk2KXsKK3BhZ2U9ZG9qby53aWRnZXQuYnlJZChwYWdlKTsKK3RoaXMuY29ycmVzcG9uZGluZ1BhZ2VCdXR0b249X2U5NjsKK2lmKHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCl7Cit0aGlzLl9oaWRlQ2hpbGQodGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KTsKK30KK3RoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldD1wYWdlOwordGhpcy5zZWxlY3RlZENoaWxkPXBhZ2Uud2lkZ2V0SWQ7Cit0aGlzLl9zaG93Q2hpbGQocGFnZSk7CitwYWdlLmlzRmlyc3RDaGlsZD0ocGFnZT09dGhpcy5jaGlsZHJlblswXSk7CitwYWdlLmlzTGFzdENoaWxkPShwYWdlPT10aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdKTsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLndpZGdldElkKyItc2VsZWN0Q2hpbGQiLHBhZ2UpOworfSxmb3J3YXJkOmZ1bmN0aW9uKCl7Cit2YXIgX2U5Nz1kb2pvLmxhbmcuZmluZCh0aGlzLmNoaWxkcmVuLHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCk7Cit0aGlzLnNlbGVjdENoaWxkKHRoaXMuY2hpbGRyZW5bX2U5NysxXSk7Cit9LGJhY2s6ZnVuY3Rpb24oKXsKK3ZhciBfZTk4PWRvam8ubGFuZy5maW5kKHRoaXMuY2hpbGRyZW4sdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KTsKK3RoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlbltfZTk4LTFdKTsKK30sb25SZXNpemVkOmZ1bmN0aW9uKCl7CitpZih0aGlzLmRvTGF5b3V0JiZ0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpeword2l0aCh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQuZG9tTm9kZS5zdHlsZSl7Cit0b3A9ZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5jb250YWluZXJOb2RlLCJwYWRkaW5nLXRvcCIsdHJ1ZSk7CitsZWZ0PWRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuY29udGFpbmVyTm9kZSwicGFkZGluZy1sZWZ0Iix0cnVlKTsKK30KK3ZhciBfZTk5PWRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29udGFpbmVyTm9kZSk7Cit0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQucmVzaXplVG8oX2U5OS53aWR0aCxfZTk5LmhlaWdodCk7Cit9Cit9LF9zaG93Q2hpbGQ6ZnVuY3Rpb24ocGFnZSl7CitpZih0aGlzLmRvTGF5b3V0KXsKK3ZhciBfZTliPWRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29udGFpbmVyTm9kZSk7CitwYWdlLnJlc2l6ZVRvKF9lOWIud2lkdGgsX2U5Yi5oZWlnaHQpOworfQorcGFnZS5zZWxlY3RlZD10cnVlOworcGFnZS5zaG93KCk7Cit9LF9oaWRlQ2hpbGQ6ZnVuY3Rpb24ocGFnZSl7CitwYWdlLnNlbGVjdGVkPWZhbHNlOworcGFnZS5oaWRlKCk7Cit9LGNsb3NlQ2hpbGQ6ZnVuY3Rpb24ocGFnZSl7Cit2YXIgX2U5ZT1wYWdlLm9uQ2xvc2UodGhpcyxwYWdlKTsKK2lmKF9lOWUpewordGhpcy5yZW1vdmVDaGlsZChwYWdlKTsKK3BhZ2UuZGVzdHJveSgpOworfQorfSxkZXN0cm95OmZ1bmN0aW9uKCl7Cit0aGlzLl9iZWluZ0Rlc3Ryb3llZD10cnVlOworZG9qby5ldmVudC50b3BpYy5kZXN0cm95KHRoaXMud2lkZ2V0SWQrIi1hZGRDaGlsZCIpOworZG9qby5ldmVudC50b3BpYy5kZXN0cm95KHRoaXMud2lkZ2V0SWQrIi1yZW1vdmVDaGlsZCIpOworZG9qby5ldmVudC50b3BpYy5kZXN0cm95KHRoaXMud2lkZ2V0SWQrIi1zZWxlY3RDaGlsZCIpOworZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5QYWdlQ29udHJvbGxlciIsZG9qby53aWRnZXQuSHRtbFdpZGdldCx7dGVtcGxhdGVTdHJpbmc6IjxzcGFuIHdhaXJvbGU9J3RhYmxpc3QnIGRvam9BdHRhY2hFdmVudD0nb25LZXknPjwvc3Bhbj4iLGlzQ29udGFpbmVyOnRydWUsY29udGFpbmVySWQ6IiIsYnV0dG9uV2lkZ2V0OiJQYWdlQnV0dG9uIiwiY2xhc3MiOiJkb2pvUGFnZUNvbnRyb2xsZXIiLGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLHRoaXNbImNsYXNzIl0pOworZG9qby53aWRnZXQud2FpLnNldEF0dHIodGhpcy5kb21Ob2RlLCJ3YWlSb2xlIiwicm9sZSIsInRhYmxpc3QiKTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpewordGhpcy5wYW5lMmJ1dHRvbj17fTsKK3ZhciBfZTlmPWRvam8ud2lkZ2V0LmJ5SWQodGhpcy5jb250YWluZXJJZCk7CitpZihfZTlmKXsKK2Rvam8ubGFuZy5mb3JFYWNoKF9lOWYuY2hpbGRyZW4sdGhpcy5vbkFkZENoaWxkLHRoaXMpOworfQorZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCsiLWFkZENoaWxkIix0aGlzLCJvbkFkZENoaWxkIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItcmVtb3ZlQ2hpbGQiLHRoaXMsIm9uUmVtb3ZlQ2hpbGQiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuY29udGFpbmVySWQrIi1zZWxlY3RDaGlsZCIsdGhpcywib25TZWxlY3RDaGlsZCIpOworfSxkZXN0cm95OmZ1bmN0aW9uKCl7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRoaXMuY29udGFpbmVySWQrIi1hZGRDaGlsZCIsdGhpcywib25BZGRDaGlsZCIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItcmVtb3ZlQ2hpbGQiLHRoaXMsIm9uUmVtb3ZlQ2hpbGQiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCsiLXNlbGVjdENoaWxkIix0aGlzLCJvblNlbGVjdENoaWxkIik7Citkb2pvLndpZGdldC5QYWdlQ29udHJvbGxlci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxvbkFkZENoaWxkOmZ1bmN0aW9uKHBhZ2UpewordmFyIF9lYTE9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KHRoaXMuYnV0dG9uV2lkZ2V0LHtsYWJlbDpwYWdlLmxhYmVsLGNsb3NlQnV0dG9uOnBhZ2UuY2xvc2FibGV9KTsKK3RoaXMuYWRkQ2hpbGQoX2VhMSk7Cit0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQoX2VhMS5kb21Ob2RlKTsKK3RoaXMucGFuZTJidXR0b25bcGFnZV09X2VhMTsKK3BhZ2UuY29udHJvbEJ1dHRvbj1fZWExOwordmFyIF9lYTI9dGhpczsKK2Rvam8uZXZlbnQuY29ubmVjdChfZWExLCJvbkNsaWNrIixmdW5jdGlvbigpeworX2VhMi5vbkJ1dHRvbkNsaWNrKHBhZ2UpOworfSk7Citkb2pvLmV2ZW50LmNvbm5lY3QoX2VhMSwib25DbG9zZUJ1dHRvbkNsaWNrIixmdW5jdGlvbigpeworX2VhMi5vbkNsb3NlQnV0dG9uQ2xpY2socGFnZSk7Cit9KTsKK30sb25SZW1vdmVDaGlsZDpmdW5jdGlvbihwYWdlKXsKK2lmKHRoaXMuX2N1cnJlbnRDaGlsZD09cGFnZSl7Cit0aGlzLl9jdXJyZW50Q2hpbGQ9bnVsbDsKK30KK3ZhciBfZWE0PXRoaXMucGFuZTJidXR0b25bcGFnZV07CitpZihfZWE0KXsKK19lYTQuZGVzdHJveSgpOworfQordGhpcy5wYW5lMmJ1dHRvbltwYWdlXT1udWxsOworfSxvblNlbGVjdENoaWxkOmZ1bmN0aW9uKHBhZ2UpeworaWYodGhpcy5fY3VycmVudENoaWxkKXsKK3ZhciBfZWE2PXRoaXMucGFuZTJidXR0b25bdGhpcy5fY3VycmVudENoaWxkXTsKK19lYTYuY2xlYXJTZWxlY3RlZCgpOworfQordmFyIF9lYTc9dGhpcy5wYW5lMmJ1dHRvbltwYWdlXTsKK19lYTcuc2V0U2VsZWN0ZWQoKTsKK3RoaXMuX2N1cnJlbnRDaGlsZD1wYWdlOworfSxvbkJ1dHRvbkNsaWNrOmZ1bmN0aW9uKHBhZ2UpewordmFyIF9lYTk9ZG9qby53aWRnZXQuYnlJZCh0aGlzLmNvbnRhaW5lcklkKTsKK19lYTkuc2VsZWN0Q2hpbGQocGFnZSxmYWxzZSx0aGlzKTsKK30sb25DbG9zZUJ1dHRvbkNsaWNrOmZ1bmN0aW9uKHBhZ2UpewordmFyIF9lYWI9ZG9qby53aWRnZXQuYnlJZCh0aGlzLmNvbnRhaW5lcklkKTsKK19lYWIuY2xvc2VDaGlsZChwYWdlKTsKK30sb25LZXk6ZnVuY3Rpb24oZXZ0KXsKK2lmKChldnQua2V5Q29kZT09ZXZ0LktFWV9SSUdIVF9BUlJPVyl8fChldnQua2V5Q29kZT09ZXZ0LktFWV9MRUZUX0FSUk9XKSl7Cit2YXIgX2VhZD0wOwordmFyIG5leHQ9bnVsbDsKK3ZhciBfZWFkPWRvam8ubGFuZy5maW5kKHRoaXMuY2hpbGRyZW4sdGhpcy5wYW5lMmJ1dHRvblt0aGlzLl9jdXJyZW50Q2hpbGRdKTsKK2lmKGV2dC5rZXlDb2RlPT1ldnQuS0VZX1JJR0hUX0FSUk9XKXsKK25leHQ9dGhpcy5jaGlsZHJlblsoX2VhZCsxKSV0aGlzLmNoaWxkcmVuLmxlbmd0aF07Cit9ZWxzZXsKK25leHQ9dGhpcy5jaGlsZHJlblsoX2VhZCsodGhpcy5jaGlsZHJlbi5sZW5ndGgtMSkpJXRoaXMuY2hpbGRyZW4ubGVuZ3RoXTsKK30KK2Rvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKK25leHQub25DbGljaygpOworfQorfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5QYWdlQnV0dG9uIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LHt0ZW1wbGF0ZVN0cmluZzoiPHNwYW4gY2xhc3M9J2l0ZW0nPiIrIjxzcGFuIGRvam9BdHRhY2hFdmVudD0nb25DbGljaycgZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIGNsYXNzPSdzZWxlY3RCdXR0b24nPiR7dGhpcy5sYWJlbH08L3NwYW4+IisiPHNwYW4gZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOm9uQ2xvc2VCdXR0b25DbGljaycgY2xhc3M9J2Nsb3NlQnV0dG9uJz5bWF08L3NwYW4+IisiPC9zcGFuPiIsbGFiZWw6ImZvbyIsY2xvc2VCdXR0b246ZmFsc2Usb25DbGljazpmdW5jdGlvbigpewordGhpcy5mb2N1cygpOworfSxvbkNsb3NlQnV0dG9uTW91c2VPdmVyOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5jbG9zZUJ1dHRvbk5vZGUsImNsb3NlSG92ZXIiKTsKK30sb25DbG9zZUJ1dHRvbk1vdXNlT3V0OmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5jbG9zZUJ1dHRvbk5vZGUsImNsb3NlSG92ZXIiKTsKK30sb25DbG9zZUJ1dHRvbkNsaWNrOmZ1bmN0aW9uKGV2dCl7Cit9LHNldFNlbGVjdGVkOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5kb21Ob2RlLCJjdXJyZW50Iik7Cit0aGlzLnRpdGxlTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwiMCIpOworfSxjbGVhclNlbGVjdGVkOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCJjdXJyZW50Iik7Cit0aGlzLnRpdGxlTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwiLTEiKTsKK30sZm9jdXM6ZnVuY3Rpb24oKXsKK2lmKHRoaXMudGl0bGVOb2RlLmZvY3VzKXsKK3RoaXMudGl0bGVOb2RlLmZvY3VzKCk7Cit9Cit9fSk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ud2lkZ2V0LldpZGdldCx7bGFiZWw6IiIsc2VsZWN0ZWQ6ZmFsc2UsY2xvc2FibGU6ZmFsc2Usb25DbG9zZTpmdW5jdGlvbigpeworcmV0dXJuIHRydWU7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lciIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UYWJDb250YWluZXIiLGRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIse2xhYmVsUG9zaXRpb246InRvcCIsY2xvc2VCdXR0b246Im5vbmUiLHRlbXBsYXRlU3RyaW5nOm51bGwsdGVtcGxhdGVTdHJpbmc6IjxkaXYgaWQ9XCIke3RoaXMud2lkZ2V0SWR9XCIgY2xhc3M9XCJkb2pvVGFiQ29udGFpbmVyXCI+XHJcblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJ0YWJsaXN0Tm9kZVwiPjwvZGl2PlxyXG5cdDxkaXYgY2xhc3M9XCJkb2pvVGFiUGFuZVdyYXBwZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCIgZG9qb0F0dGFjaEV2ZW50PVwib25LZXlcIiB3YWlSb2xlPVwidGFicGFuZWxcIj48L2Rpdj5cclxuPC9kaXY+XHJcbiIsdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvVGFiQ29udGFpbmVyIHtcclxuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xyXG59XHJcblxyXG4uZG9qb1RhYlBhbmVXcmFwcGVyIHtcclxuXHRib3JkZXIgOiAxcHggc29saWQgIzYyOTBkMjtcclxuXHRfem9vbTogMTsgLyogZm9yY2UgSUU2IGxheW91dCBtb2RlIHNvIHRvcCBib3JkZXIgZG9lc250IGRpc2FwcGVhciAqL1xyXG5cdGRpc3BsYXk6IGJsb2NrO1xyXG5cdGNsZWFyOiBib3RoO1xyXG5cdG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLXRvcCB7XHJcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcclxuXHR0b3AgOiAwcHg7XHJcblx0bGVmdCA6IDBweDtcclxuXHRvdmVyZmxvdyA6IHZpc2libGU7XHJcblx0bWFyZ2luLWJvdHRvbSA6IC0xcHg7XHJcblx0d2lkdGggOiAxMDAlO1xyXG5cdHotaW5kZXg6IDI7XHQvKiBzbyB0aGUgYm90dG9tIG9mIHRoZSB0YWIgbGFiZWwgd2lsbCBjb3ZlciB1cCB0aGUgYm9yZGVyIG9mIGRvam9UYWJQYW5lV3JhcHBlciAqL1xyXG59XHJcblxyXG4uZG9qb1RhYk5vTGF5b3V0LmRvam9UYWJMYWJlbHMtdG9wIC5kb2pvVGFiIHtcclxuXHRtYXJnaW4tYm90dG9tOiAtMXB4O1xyXG5cdF9tYXJnaW4tYm90dG9tOiAwcHg7IC8qIElFIGZpbHRlciBzbyB0b3AgYm9yZGVyIGxpbmVzIHVwIGNvcnJlY3RseSAqL1xyXG59XHJcblxyXG4uZG9qb1RhYiB7XHJcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcclxuXHRmbG9hdCA6IGxlZnQ7XHJcblx0cGFkZGluZy1sZWZ0IDogOXB4O1xyXG5cdGJvcmRlci1ib3R0b20gOiAxcHggc29saWQgIzYyOTBkMjtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDtcclxuXHRjdXJzb3I6IHBvaW50ZXI7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuXHR6LWluZGV4OiAzO1xyXG59XHJcblxyXG4uZG9qb1RhYiBkaXYge1xyXG5cdGRpc3BsYXkgOiBibG9jaztcclxuXHRwYWRkaW5nIDogNHB4IDE1cHggNHB4IDZweDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX3JpZ2h0LmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDtcclxuXHRjb2xvciA6ICMzMzM7XHJcblx0Zm9udC1zaXplIDogOTAlO1xyXG59XHJcblxyXG4uZG9qb1RhYiAuY2xvc2Uge1xyXG5cdGRpc3BsYXkgOiBpbmxpbmUtYmxvY2s7XHJcblx0aGVpZ2h0IDogMTJweDtcclxuXHR3aWR0aCA6IDEycHg7XHJcblx0cGFkZGluZyA6IDAgMTJweCAwIDA7XHJcblx0bWFyZ2luIDogMCAtMTBweCAwIDEwcHg7XHJcblx0Y3Vyc29yIDogZGVmYXVsdDtcclxuXHRmb250LXNpemU6IHNtYWxsO1xyXG59XHJcblxyXG4uZG9qb1RhYiAuY2xvc2VJbWFnZSB7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2Nsb3NlLmdpZikgbm8tcmVwZWF0IHJpZ2h0IHRvcDtcclxufVxyXG5cclxuLmRvam9UYWIgLmNsb3NlSG92ZXIge1xyXG5cdGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoaW1hZ2VzL3RhYl9jbG9zZV9oLmdpZik7XHJcbn1cclxuXHJcbi5kb2pvVGFiLmN1cnJlbnQge1xyXG5cdHBhZGRpbmctYm90dG9tIDogMXB4O1xyXG5cdGJvcmRlci1ib3R0b20gOiAwO1xyXG5cdGJhY2tncm91bmQtcG9zaXRpb24gOiAwIC0xNTBweDtcclxufVxyXG5cclxuLmRvam9UYWIuY3VycmVudCBkaXYge1xyXG5cdHBhZGRpbmctYm90dG9tIDogNXB4O1xyXG5cdG1hcmdpbi1ib3R0b20gOiAtMXB4O1xyXG5cdGJhY2tncm91bmQtcG9zaXRpb24gOiAxMDAlIC0xNTBweDtcclxufVxyXG5cclxuLyogYm90dG9tIHRhYnMgKi9cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSB7XHJcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcclxuXHRib3R0b20gOiAwcHg7XHJcblx0bGVmdCA6IDBweDtcclxuXHRvdmVyZmxvdyA6IHZpc2libGU7XHJcblx0bWFyZ2luLXRvcCA6IC0xcHg7XHJcblx0d2lkdGggOiAxMDAlO1xyXG5cdHotaW5kZXg6IDI7XHJcbn1cclxuXHJcbi5kb2pvVGFiTm9MYXlvdXQuZG9qb1RhYkxhYmVscy1ib3R0b20ge1xyXG5cdHBvc2l0aW9uIDogcmVsYXRpdmU7XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYiB7XHJcblx0Ym9yZGVyLXRvcCA6ICAxcHggc29saWQgIzYyOTBkMjtcclxuXHRib3JkZXItYm90dG9tIDogMDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X2xlZnQuZ2lmKSBuby1yZXBlYXQgbGVmdCBib3R0b207XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYiBkaXYge1xyXG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9ib3RfcmlnaHQuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tO1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1ib3R0b20gLmRvam9UYWIuY3VycmVudCB7XHJcblx0Ym9yZGVyLXRvcCA6IDA7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9sZWZ0X2N1cnIuZ2lmKSBuby1yZXBlYXQgbGVmdCBib3R0b207XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYi5jdXJyZW50IGRpdiB7XHJcblx0cGFkZGluZy10b3AgOiA0cHg7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodF9jdXJyLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTtcclxufVxyXG5cclxuLyogcmlnaHQtaCB0YWJzICovXHJcblxyXG4uZG9qb1RhYkxhYmVscy1yaWdodC1oIHtcclxuXHRvdmVyZmxvdyA6IHZpc2libGU7XHJcblx0bWFyZ2luLWxlZnQgOiAtMXB4O1xyXG5cdHotaW5kZXg6IDI7XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWggLmRvam9UYWIge1xyXG5cdHBhZGRpbmctbGVmdCA6IDA7XHJcblx0Ym9yZGVyLWxlZnQgOiAgMXB4IHNvbGlkICM2MjkwZDI7XHJcblx0Ym9yZGVyLWJvdHRvbSA6IDA7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207XHJcblx0ZmxvYXQgOiBub25lO1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1yaWdodC1oIC5kb2pvVGFiIGRpdiB7XHJcblx0cGFkZGluZyA6IDRweCAxNXB4IDRweCAxNXB4O1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1yaWdodC1oIC5kb2pvVGFiLmN1cnJlbnQge1xyXG5cdGJvcmRlci1sZWZ0IDogIDA7XHJcblx0Ym9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjtcclxufVxyXG5cclxuLyogbGVmdC1oIHRhYnMgKi9cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWxlZnQtaCB7XHJcblx0b3ZlcmZsb3cgOiB2aXNpYmxlO1xyXG5cdG1hcmdpbi1yaWdodCA6IC0xcHg7XHJcblx0ei1pbmRleDogMjtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiIHtcclxuXHRib3JkZXItcmlnaHQgOiAgMXB4IHNvbGlkICM2MjkwZDI7XHJcblx0Ym9yZGVyLWJvdHRvbSA6IDA7XHJcblx0ZmxvYXQgOiBub25lO1xyXG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl90b3BfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IHRvcDtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtbGVmdC1oIC5kb2pvVGFiLmN1cnJlbnQge1xyXG5cdGJvcmRlci1yaWdodCA6IDA7XHJcblx0Ym9yZGVyLWJvdHRvbSA6ICAxcHggc29saWQgIzYyOTBkMjtcclxuXHRwYWRkaW5nLWJvdHRvbSA6IDA7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX3RvcF9sZWZ0LmdpZikgbm8tcmVwZWF0IDAgLTE1MHB4O1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1sZWZ0LWggLmRvam9UYWIgZGl2IHtcclxuXHRiYWNrZ3JvdW5kIDogMDtcclxuXHRib3JkZXItYm90dG9tIDogIDFweCBzb2xpZCAjNjI5MGQyO1xyXG59XHJcbiIsdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvVGFiQ29udGFpbmVyLmNzcyIpLHNlbGVjdGVkVGFiOiIiLHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuc2VsZWN0ZWRUYWIpeworZG9qby5kZXByZWNhdGVkKCJzZWxlY3RlZFRhYiBkZXByZWNhdGVkLCB1c2Ugc2VsZWN0ZWRDaGlsZCBpbnN0ZWFkLCB3aWxsIGJlIHJlbW92ZWQgaW4iLCIwLjUiKTsKK3RoaXMuc2VsZWN0ZWRDaGlsZD10aGlzLnNlbGVjdGVkVGFiOworfQoraWYodGhpcy5jbG9zZUJ1dHRvbiE9Im5vbmUiKXsKK2Rvam8uZGVwcmVjYXRlZCgiY2xvc2VCdXR0b24gZGVwcmVjYXRlZCwgdXNlIGNsb3NhYmxlPSd0cnVlJyBvbiBlYWNoIGNoaWxkIGluc3RlYWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiIsIjAuNSIpOworfQorZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGZpbGxJblRlbXBsYXRlOmZ1bmN0aW9uKCl7Cit0aGlzLnRhYmxpc3Q9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUYWJDb250cm9sbGVyIix7aWQ6dGhpcy53aWRnZXRJZCsiX3RhYmxpc3QiLGxhYmVsUG9zaXRpb246dGhpcy5sYWJlbFBvc2l0aW9uLGRvTGF5b3V0OnRoaXMuZG9MYXlvdXQsY29udGFpbmVySWQ6dGhpcy53aWRnZXRJZH0sdGhpcy50YWJsaXN0Tm9kZSk7Citkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LHBvc3RDcmVhdGU6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK2Rvam8ud2lkZ2V0LlRhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordGhpcy5vblJlc2l6ZWQoKTsKK30sX3NldHVwQ2hpbGQ6ZnVuY3Rpb24odGFiKXsKK2lmKHRoaXMuY2xvc2VCdXR0b249PSJ0YWIifHx0aGlzLmNsb3NlQnV0dG9uPT0icGFuZSIpewordGFiLmNsb3NhYmxlPXRydWU7Cit9Citkb2pvLmh0bWwuYWRkQ2xhc3ModGFiLmRvbU5vZGUsImRvam9UYWJQYW5lIik7Citkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5fc2V0dXBDaGlsZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LG9uUmVzaXplZDpmdW5jdGlvbigpeworaWYoIXRoaXMuZG9MYXlvdXQpeworcmV0dXJuOworfQordmFyIF9lYjM9dGhpcy5sYWJlbFBvc2l0aW9uLnJlcGxhY2UoLy1oLywiIik7Cit2YXIgX2ViND1be2RvbU5vZGU6dGhpcy50YWJsaXN0LmRvbU5vZGUsbGF5b3V0QWxpZ246X2ViM30se2RvbU5vZGU6dGhpcy5jb250YWluZXJOb2RlLGxheW91dEFsaWduOiJjbGllbnQifV07Citkb2pvLndpZGdldC5odG1sLmxheW91dCh0aGlzLmRvbU5vZGUsX2ViNCk7CitpZih0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpewordmFyIF9lYjU9ZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5jb250YWluZXJOb2RlKTsKK3RoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldC5yZXNpemVUbyhfZWI1LndpZHRoLF9lYjUuaGVpZ2h0KTsKK30KK30sc2VsZWN0VGFiOmZ1bmN0aW9uKHRhYixfZWI3KXsKK2Rvam8uZGVwcmVjYXRlZCgidXNlIHNlbGVjdENoaWxkKCkgcmF0aGVyIHRoYW4gc2VsZWN0VGFiKCksIHNlbGVjdFRhYigpIHdpbGwgYmUgcmVtb3ZlZCBpbiIsIjAuNSIpOwordGhpcy5zZWxlY3RDaGlsZCh0YWIsX2ViNyk7Cit9LG9uS2V5OmZ1bmN0aW9uKGUpeworaWYoZS5rZXlDb2RlPT1lLktFWV9VUF9BUlJPVyYmZS5jdHJsS2V5KXsKK3ZhciBfZWI5PXRoaXMuY29ycmVzcG9uZGluZ1RhYkJ1dHRvbnx8dGhpcy5zZWxlY3RlZFRhYldpZGdldC50YWJCdXR0b247CitfZWI5LmZvY3VzKCk7Citkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworfWVsc2V7CitpZihlLmtleUNvZGU9PWUuS0VZX0RFTEVURSYmZS5hbHRLZXkpeworaWYodGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0LmNsb3NhYmxlKXsKK3RoaXMuY2xvc2VDaGlsZCh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpOworZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChlKTsKK30KK30KK30KK30sZGVzdHJveTpmdW5jdGlvbigpewordGhpcy50YWJsaXN0LmRlc3Ryb3koKTsKK2Rvam8ud2lkZ2V0LlRhYkNvbnRhaW5lci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UYWJDb250cm9sbGVyIixkb2pvLndpZGdldC5QYWdlQ29udHJvbGxlcix7dGVtcGxhdGVTdHJpbmc6IjxkaXYgd2Fpcm9sZT0ndGFibGlzdCcgZG9qb0F0dGFjaEV2ZW50PSdvbktleSc+PC9kaXY+IixsYWJlbFBvc2l0aW9uOiJ0b3AiLGRvTGF5b3V0OnRydWUsImNsYXNzIjoiIixidXR0b25XaWRnZXQ6IlRhYkJ1dHRvbiIscG9zdE1peEluUHJvcGVydGllczpmdW5jdGlvbigpeworaWYoIXRoaXNbImNsYXNzIl0pewordGhpc1siY2xhc3MiXT0iZG9qb1RhYkxhYmVscy0iK3RoaXMubGFiZWxQb3NpdGlvbisodGhpcy5kb0xheW91dD8iIjoiIGRvam9UYWJOb0xheW91dCIpOworfQorZG9qby53aWRnZXQuVGFiQ29udHJvbGxlci5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfX0pOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UYWJCdXR0b24iLGRvam8ud2lkZ2V0LlBhZ2VCdXR0b24se3RlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPSdkb2pvVGFiJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2snPiIrIjxkaXYgZG9qb0F0dGFjaFBvaW50PSdpbm5lckRpdic+IisiPHNwYW4gZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIHRhYkluZGV4PSctMScgd2FpUm9sZT0ndGFiJz4ke3RoaXMubGFiZWx9PC9zcGFuPiIrIjxzcGFuIGRvam9BdHRhY2hQb2ludD0nY2xvc2VCdXR0b25Ob2RlJyBjbGFzcz0nY2xvc2UgY2xvc2VJbWFnZScgc3R5bGU9JyR7dGhpcy5jbG9zZUJ1dHRvblN0eWxlfSciKyIgICAgZG9qb0F0dGFjaEV2ZW50PSdvbk1vdXNlT3ZlcjpvbkNsb3NlQnV0dG9uTW91c2VPdmVyOyBvbk1vdXNlT3V0Om9uQ2xvc2VCdXR0b25Nb3VzZU91dDsgb25DbGljazpvbkNsb3NlQnV0dG9uQ2xpY2snPjwvc3Bhbj4iKyI8L2Rpdj4iKyI8L2Rpdj4iLHBvc3RNaXhJblByb3BlcnRpZXM6ZnVuY3Rpb24oKXsKK3RoaXMuY2xvc2VCdXR0b25TdHlsZT10aGlzLmNsb3NlQnV0dG9uPyIiOiJkaXNwbGF5OiBub25lIjsKK2Rvam8ud2lkZ2V0LlRhYkJ1dHRvbi5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxmaWxsSW5UZW1wbGF0ZTpmdW5jdGlvbigpeworZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy50aXRsZU5vZGUpOworZG9qby53aWRnZXQuVGFiQnV0dG9uLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxvbkNsb3NlQnV0dG9uQ2xpY2s6ZnVuY3Rpb24oZXZ0KXsKK2V2dC5zdG9wUHJvcGFnYXRpb24oKTsKK2Rvam8ud2lkZ2V0LlRhYkJ1dHRvbi5zdXBlcmNsYXNzLm9uQ2xvc2VCdXR0b25DbGljay5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9fSk7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LmExMXkuVGFiQnV0dG9uIixkb2pvLndpZGdldC5UYWJCdXR0b24se2ltZ1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvdGFiX2Nsb3NlLmdpZiIpLHRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPSdkb2pvVGFiJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s7b25LZXknPiIrIjxkaXYgZG9qb0F0dGFjaFBvaW50PSdpbm5lckRpdic+IisiPHNwYW4gZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIHRhYkluZGV4PSctMScgd2FpUm9sZT0ndGFiJz4ke3RoaXMubGFiZWx9PC9zcGFuPiIrIjxpbWcgY2xhc3M9J2Nsb3NlJyBzcmM9JyR7dGhpcy5pbWdQYXRofScgYWx0PSdbeF0nIHN0eWxlPScke3RoaXMuY2xvc2VCdXR0b25TdHlsZX0nIisiICAgIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpvbkNsb3NlQnV0dG9uQ2xpY2snPiIrIjwvZGl2PiIrIjwvZGl2PiJ9KTsKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUYWJDb250YWluZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgic3RydXRzLndpZGdldC5TdHJ1dHNUYWJDb250YWluZXIiLGRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lcix7d2lkZ2V0VHlwZToiU3RydXRzVGFiQ29udGFpbmVyIixhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljczoiIixhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5Om51bGwsYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzOiIiLGJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5Om51bGwsZGlzYWJsZWRUYWJDc3NDbGFzczoic3RydXRzRGlzYWJsZWRUYWIiLHBvc3RDcmVhdGU6ZnVuY3Rpb24oKXsKK3N0cnV0cy53aWRnZXQuU3RydXRzVGFiQ29udGFpbmVyLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzKTsKK2lmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzKSl7Cit0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5PXRoaXMuYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7Cit9CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzKSl7Cit0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzQXJyYXk9dGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworfQoraWYodGhpcy5kaXNhYmxlZFRhYkNzc0NsYXNzKXsKK2Rvam8ubGFuZy5mb3JFYWNoKHRoaXMuY2hpbGRyZW4sZnVuY3Rpb24oZGl2KXsKK2lmKGRpdi5kaXNhYmxlZCl7Cit0aGlzLmRpc2FibGVUYWIoZGl2KTsKK30KK30pOworfQorfSxzZWxlY3RDaGlsZDpmdW5jdGlvbih0YWIsX2ViZCl7CitpZighdGFiLmRpc2FibGVkKXsKK3ZhciBfZWJlPXsiY2FuY2VsIjpmYWxzZX07CitpZih0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5KXsKK3ZhciBzZWxmPXRoaXM7Citkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5LGZ1bmN0aW9uKF9lYzApewordHJ5eworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKF9lYzAsX2ViZSx0YWIsc2VsZik7Cit9CitjYXRjaChleCl7Citkb2pvLmRlYnVnKGV4KTsKK30KK30pOworfQoraWYoIV9lYmUuY2FuY2VsKXsKK3N0cnV0cy53aWRnZXQuU3RydXRzVGFiQ29udGFpbmVyLnN1cGVyY2xhc3Muc2VsZWN0Q2hpbGQuYXBwbHkodGhpcyxbdGFiLF9lYmRdKTsKK2lmKHRoaXMuYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3NBcnJheSl7Cit2YXIgc2VsZj10aGlzOworZG9qby5sYW5nLmZvckVhY2godGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5LGZ1bmN0aW9uKF9lYzEpewordHJ5eworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKF9lYzEsdGFiLHNlbGYpOworfQorY2F0Y2goZXgpeworZG9qby5kZWJ1ZyhleCk7Cit9Cit9KTsKK30KK30KK30KK30sZGlzYWJsZVRhYjpmdW5jdGlvbih0KXsKK3ZhciBfZWMzPXRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworX2VjMy5kaXNhYmxlZD10cnVlOworZG9qby5odG1sLmFkZENsYXNzKF9lYzMuY29udHJvbEJ1dHRvbi5kb21Ob2RlLHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcyk7Cit9LGVuYWJsZVRhYjpmdW5jdGlvbih0KXsKK3ZhciBfZWM1PXRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworX2VjNS5kaXNhYmxlZD1mYWxzZTsKK2Rvam8uaHRtbC5yZW1vdmVDbGFzcyhfZWM1LmNvbnRyb2xCdXR0b24uZG9tTm9kZSx0aGlzLmRpc2FibGVkVGFiQ3NzQ2xhc3MpOworfSxnZXRUYWJXaWRnZXQ6ZnVuY3Rpb24odCl7CitpZihkb2pvLmxhbmcuaXNOdW1iZXIodCkpeworcmV0dXJuIHRoaXMuY2hpbGRyZW5bdF07Cit9ZWxzZXsKK2lmKGRvam8ubGFuZy5pc1N0cmluZyh0KSl7CityZXR1cm4gZG9qby53aWRnZXQuYnlJZCh0KTsKK31lbHNleworcmV0dXJuIHQ7Cit9Cit9Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVOb2RlIik7Citkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVOb2RlIixkb2pvLndpZGdldC5IdG1sV2lkZ2V0LGZ1bmN0aW9uKCl7Cit0aGlzLmFjdGlvbnNEaXNhYmxlZD1bXTsKK30se3dpZGdldFR5cGU6IlRyZWVOb2RlIixsb2FkU3RhdGVzOntVTkNIRUNLRUQ6IlVOQ0hFQ0tFRCIsTE9BRElORzoiTE9BRElORyIsTE9BREVEOiJMT0FERUQifSxhY3Rpb25zOntNT1ZFOiJNT1ZFIixSRU1PVkU6IlJFTU9WRSIsRURJVDoiRURJVCIsQUREQ0hJTEQ6IkFERENISUxEIn0saXNDb250YWluZXI6dHJ1ZSxsb2NrTGV2ZWw6MCx0ZW1wbGF0ZVN0cmluZzooIjxkaXYgY2xhc3M9XCJkb2pvVHJlZU5vZGVcIj4gIisiPHNwYW4gdHJlZU5vZGU9XCIke3RoaXMud2lkZ2V0SWR9XCIgY2xhc3M9XCJkb2pvVHJlZU5vZGVMYWJlbFwiIGRvam9BdHRhY2hQb2ludD1cImxhYmVsTm9kZVwiPiAiKyJcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwidGl0bGVOb2RlXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25UaXRsZUNsaWNrXCIgY2xhc3M9XCJkb2pvVHJlZU5vZGVMYWJlbFRpdGxlXCI+JHt0aGlzLnRpdGxlfTwvc3Bhbj4gIisiPC9zcGFuPiAiKyI8c3BhbiBjbGFzcz1cImRvam9UcmVlTm9kZUFmdGVyTGFiZWxcIiBkb2pvQXR0YWNoUG9pbnQ9XCJhZnRlckxhYmVsTm9kZVwiPiR7dGhpcy5hZnRlckxhYmVsfTwvc3Bhbj4gIisiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJjb250YWluZXJOb2RlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj48L2Rpdj4gIisiPC9kaXY+IikucmVwbGFjZSgvKD58PClccysvZywiJDEiKSxjaGlsZEljb25TcmM6IiIsY2hpbGRJY29uRm9sZGVyU3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvY2xvc2VkLmdpZiIpLGNoaWxkSWNvbkRvY3VtZW50U3JjOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvZG9jdW1lbnQuZ2lmIiksY2hpbGRJY29uOm51bGwsaXNUcmVlTm9kZTp0cnVlLG9iamVjdElkOiIiLGFmdGVyTGFiZWw6IiIsYWZ0ZXJMYWJlbE5vZGU6bnVsbCxleHBhbmRJY29uOm51bGwsdGl0bGU6IiIsb2JqZWN0OiIiLGlzRm9sZGVyOmZhbHNlLGxhYmVsTm9kZTpudWxsLHRpdGxlTm9kZTpudWxsLGltZ3M6bnVsbCxleHBhbmRMZXZlbDoiIix0cmVlOm51bGwsZGVwdGg6MCxpc0V4cGFuZGVkOmZhbHNlLHN0YXRlOm51bGwsZG9tTm9kZUluaXRpYWxpemVkOmZhbHNlLGlzRmlyc3RDaGlsZDpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMuZ2V0UGFyZW50SW5kZXgoKT09MD90cnVlOmZhbHNlOworfSxpc0xhc3RDaGlsZDpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMuZ2V0UGFyZW50SW5kZXgoKT09dGhpcy5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLTE/dHJ1ZTpmYWxzZTsKK30sbG9jazpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudHJlZS5sb2NrLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sdW5sb2NrOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy50cmVlLnVubG9jay5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGlzTG9ja2VkOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy50cmVlLmlzTG9ja2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sY2xlYW5Mb2NrOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy50cmVlLmNsZWFuTG9jay5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGFjdGlvbklzRGlzYWJsZWQ6ZnVuY3Rpb24oX2VjNyl7Cit2YXIgX2VjOD10aGlzOwordmFyIF9lYzk9ZmFsc2U7CitpZih0aGlzLnRyZWUuc3RyaWN0Rm9sZGVycyYmX2VjNz09dGhpcy5hY3Rpb25zLkFERENISUxEJiYhdGhpcy5pc0ZvbGRlcil7CitfZWM5PXRydWU7Cit9CitpZihkb2pvLmxhbmcuaW5BcnJheShfZWM4LmFjdGlvbnNEaXNhYmxlZCxfZWM3KSl7CitfZWM5PXRydWU7Cit9CitpZih0aGlzLmlzTG9ja2VkKCkpeworX2VjOT10cnVlOworfQorcmV0dXJuIF9lYzk7Cit9LGdldEluZm86ZnVuY3Rpb24oKXsKK3ZhciBpbmZvPXt3aWRnZXRJZDp0aGlzLndpZGdldElkLG9iamVjdElkOnRoaXMub2JqZWN0SWQsaW5kZXg6dGhpcy5nZXRQYXJlbnRJbmRleCgpLGlzRm9sZGVyOnRoaXMuaXNGb2xkZXJ9OworcmV0dXJuIGluZm87Cit9LGluaXRpYWxpemU6ZnVuY3Rpb24oYXJncyxmcmFnKXsKK3RoaXMuc3RhdGU9dGhpcy5sb2FkU3RhdGVzLlVOQ0hFQ0tFRDsKK2Zvcih2YXIgaT0wO2k8dGhpcy5hY3Rpb25zRGlzYWJsZWQubGVuZ3RoO2krKyl7Cit0aGlzLmFjdGlvbnNEaXNhYmxlZFtpXT10aGlzLmFjdGlvbnNEaXNhYmxlZFtpXS50b1VwcGVyQ2FzZSgpOworfQordGhpcy5leHBhbmRMZXZlbD1wYXJzZUludCh0aGlzLmV4cGFuZExldmVsKTsKK30sYWRqdXN0RGVwdGg6ZnVuY3Rpb24oX2VjZSl7Citmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2krKyl7Cit0aGlzLmNoaWxkcmVuW2ldLmFkanVzdERlcHRoKF9lY2UpOworfQordGhpcy5kZXB0aCs9X2VjZTsKK2lmKF9lY2U+MCl7Citmb3IodmFyIGk9MDtpPF9lY2U7aSsrKXsKK3ZhciBpbWc9dGhpcy50cmVlLm1ha2VCbGFua0ltZygpOwordGhpcy5pbWdzLnVuc2hpZnQoaW1nKTsKK2Rvam8uaHRtbC5pbnNlcnRCZWZvcmUodGhpcy5pbWdzWzBdLHRoaXMuZG9tTm9kZS5maXJzdENoaWxkKTsKK30KK30KK2lmKF9lY2U8MCl7Citmb3IodmFyIGk9MDtpPC1fZWNlO2krKyl7Cit0aGlzLmltZ3Muc2hpZnQoKTsKK2Rvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZG9tTm9kZS5maXJzdENoaWxkKTsKK30KK30KK30sbWFya0xvYWRpbmc6ZnVuY3Rpb24oKXsKK3RoaXMuX21hcmtMb2FkaW5nU2F2ZWRJY29uPXRoaXMuZXhwYW5kSWNvbi5zcmM7Cit0aGlzLmV4cGFuZEljb24uc3JjPXRoaXMudHJlZS5leHBhbmRJY29uU3JjTG9hZGluZzsKK30sdW5NYXJrTG9hZGluZzpmdW5jdGlvbigpeworaWYoIXRoaXMuX21hcmtMb2FkaW5nU2F2ZWRJY29uKXsKK3JldHVybjsKK30KK3ZhciBpbT1uZXcgSW1hZ2UoKTsKK2ltLnNyYz10aGlzLnRyZWUuZXhwYW5kSWNvblNyY0xvYWRpbmc7CitpZih0aGlzLmV4cGFuZEljb24uc3JjPT1pbS5zcmMpewordGhpcy5leHBhbmRJY29uLnNyYz10aGlzLl9tYXJrTG9hZGluZ1NhdmVkSWNvbjsKK30KK3RoaXMuX21hcmtMb2FkaW5nU2F2ZWRJY29uPW51bGw7Cit9LHNldEZvbGRlcjpmdW5jdGlvbigpeworZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZXhwYW5kSWNvbiwib25jbGljayIsdGhpcywib25UcmVlQ2xpY2siKTsKK3RoaXMuZXhwYW5kSWNvbi5zcmM9dGhpcy5pc0V4cGFuZGVkP3RoaXMudHJlZS5leHBhbmRJY29uU3JjTWludXM6dGhpcy50cmVlLmV4cGFuZEljb25TcmNQbHVzOwordGhpcy5pc0ZvbGRlcj10cnVlOworfSxjcmVhdGVET01Ob2RlOmZ1bmN0aW9uKHRyZWUsX2VkMyl7Cit0aGlzLnRyZWU9dHJlZTsKK3RoaXMuZGVwdGg9X2VkMzsKK3RoaXMuaW1ncz1bXTsKK2Zvcih2YXIgaT0wO2k8dGhpcy5kZXB0aCsxO2krKyl7Cit2YXIgaW1nPXRoaXMudHJlZS5tYWtlQmxhbmtJbWcoKTsKK3RoaXMuZG9tTm9kZS5pbnNlcnRCZWZvcmUoaW1nLHRoaXMubGFiZWxOb2RlKTsKK3RoaXMuaW1ncy5wdXNoKGltZyk7Cit9Cit0aGlzLmV4cGFuZEljb249dGhpcy5pbWdzW3RoaXMuaW1ncy5sZW5ndGgtMV07Cit0aGlzLmNoaWxkSWNvbj10aGlzLnRyZWUubWFrZUJsYW5rSW1nKCk7Cit0aGlzLmltZ3MucHVzaCh0aGlzLmNoaWxkSWNvbik7Citkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuY2hpbGRJY29uLHRoaXMudGl0bGVOb2RlKTsKK2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RofHx0aGlzLmlzRm9sZGVyKXsKK3RoaXMuc2V0Rm9sZGVyKCk7Cit9ZWxzZXsKK3RoaXMuc3RhdGU9dGhpcy5sb2FkU3RhdGVzLkxPQURFRDsKK30KK2Rvam8uZXZlbnQuY29ubmVjdCh0aGlzLmNoaWxkSWNvbiwib25jbGljayIsdGhpcywib25JY29uQ2xpY2siKTsKK2Zvcih2YXIgaT0wO2k8dGhpcy5jaGlsZHJlbi5sZW5ndGg7aSsrKXsKK3RoaXMuY2hpbGRyZW5baV0ucGFyZW50PXRoaXM7Cit2YXIgbm9kZT10aGlzLmNoaWxkcmVuW2ldLmNyZWF0ZURPTU5vZGUodGhpcy50cmVlLHRoaXMuZGVwdGgrMSk7Cit0aGlzLmNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7Cit9CitpZih0aGlzLmNoaWxkcmVuLmxlbmd0aCl7Cit0aGlzLnN0YXRlPXRoaXMubG9hZFN0YXRlcy5MT0FERUQ7Cit9Cit0aGlzLnVwZGF0ZUljb25zKCk7Cit0aGlzLmRvbU5vZGVJbml0aWFsaXplZD10cnVlOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUse3NvdXJjZTp0aGlzfSk7CityZXR1cm4gdGhpcy5kb21Ob2RlOworfSxvblRyZWVDbGljazpmdW5jdGlvbihlKXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy50cmVlQ2xpY2sse3NvdXJjZTp0aGlzLGV2ZW50OmV9KTsKK30sb25JY29uQ2xpY2s6ZnVuY3Rpb24oZSl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuaWNvbkNsaWNrLHtzb3VyY2U6dGhpcyxldmVudDplfSk7Cit9LG9uVGl0bGVDbGljazpmdW5jdGlvbihlKXsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy50aXRsZUNsaWNrLHtzb3VyY2U6dGhpcyxldmVudDplfSk7Cit9LG1hcmtTZWxlY3RlZDpmdW5jdGlvbigpeworZG9qby5odG1sLmFkZENsYXNzKHRoaXMudGl0bGVOb2RlLCJkb2pvVHJlZU5vZGVMYWJlbFNlbGVjdGVkIik7Cit9LHVuTWFya1NlbGVjdGVkOmZ1bmN0aW9uKCl7Citkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy50aXRsZU5vZGUsImRvam9UcmVlTm9kZUxhYmVsU2VsZWN0ZWQiKTsKK30sdXBkYXRlRXhwYW5kSWNvbjpmdW5jdGlvbigpeworaWYodGhpcy5pc0ZvbGRlcil7Cit0aGlzLmV4cGFuZEljb24uc3JjPXRoaXMuaXNFeHBhbmRlZD90aGlzLnRyZWUuZXhwYW5kSWNvblNyY01pbnVzOnRoaXMudHJlZS5leHBhbmRJY29uU3JjUGx1czsKK31lbHNlewordGhpcy5leHBhbmRJY29uLnNyYz10aGlzLnRyZWUuYmxhbmtJY29uU3JjOworfQorfSx1cGRhdGVFeHBhbmRHcmlkOmZ1bmN0aW9uKCl7CitpZih0aGlzLnRyZWUuc2hvd0dyaWQpeworaWYodGhpcy5kZXB0aCl7Cit0aGlzLnNldEdyaWRJbWFnZSgtMix0aGlzLmlzTGFzdENoaWxkKCk/dGhpcy50cmVlLmdyaWRJY29uU3JjTDp0aGlzLnRyZWUuZ3JpZEljb25TcmNUKTsKK31lbHNleworaWYodGhpcy5pc0ZpcnN0Q2hpbGQoKSl7Cit0aGlzLnNldEdyaWRJbWFnZSgtMix0aGlzLmlzTGFzdENoaWxkKCk/dGhpcy50cmVlLmdyaWRJY29uU3JjWDp0aGlzLnRyZWUuZ3JpZEljb25TcmNZKTsKK31lbHNlewordGhpcy5zZXRHcmlkSW1hZ2UoLTIsdGhpcy5pc0xhc3RDaGlsZCgpP3RoaXMudHJlZS5ncmlkSWNvblNyY0w6dGhpcy50cmVlLmdyaWRJY29uU3JjVCk7Cit9Cit9Cit9ZWxzZXsKK3RoaXMuc2V0R3JpZEltYWdlKC0yLHRoaXMudHJlZS5ibGFua0ljb25TcmMpOworfQorfSx1cGRhdGVDaGlsZEdyaWQ6ZnVuY3Rpb24oKXsKK2lmKCh0aGlzLmRlcHRofHx0aGlzLnRyZWUuc2hvd1Jvb3RHcmlkKSYmdGhpcy50cmVlLnNob3dHcmlkKXsKK3RoaXMuc2V0R3JpZEltYWdlKC0xLCh0aGlzLmNoaWxkcmVuLmxlbmd0aCYmdGhpcy5pc0V4cGFuZGVkKT90aGlzLnRyZWUuZ3JpZEljb25TcmNQOnRoaXMudHJlZS5ncmlkSWNvblNyY0MpOworfWVsc2V7CitpZih0aGlzLnRyZWUuc2hvd0dyaWQmJiF0aGlzLnRyZWUuc2hvd1Jvb3RHcmlkKXsKK3RoaXMuc2V0R3JpZEltYWdlKC0xLCh0aGlzLmNoaWxkcmVuLmxlbmd0aCYmdGhpcy5pc0V4cGFuZGVkKT90aGlzLnRyZWUuZ3JpZEljb25TcmNaOnRoaXMudHJlZS5ibGFua0ljb25TcmMpOworfWVsc2V7Cit0aGlzLnNldEdyaWRJbWFnZSgtMSx0aGlzLnRyZWUuYmxhbmtJY29uU3JjKTsKK30KK30KK30sdXBkYXRlUGFyZW50R3JpZDpmdW5jdGlvbigpewordmFyIF9lZGE9dGhpcy5wYXJlbnQ7Citmb3IodmFyIGk9MDtpPHRoaXMuZGVwdGg7aSsrKXsKK3ZhciBpZHg9dGhpcy5pbWdzLmxlbmd0aC0oMytpKTsKK3ZhciBpbWc9KHRoaXMudHJlZS5zaG93R3JpZCYmIV9lZGEuaXNMYXN0Q2hpbGQoKSk/dGhpcy50cmVlLmdyaWRJY29uU3JjVjp0aGlzLnRyZWUuYmxhbmtJY29uU3JjOwordGhpcy5zZXRHcmlkSW1hZ2UoaWR4LGltZyk7CitfZWRhPV9lZGEucGFyZW50OworfQorfSx1cGRhdGVFeHBhbmRHcmlkQ29sdW1uOmZ1bmN0aW9uKCl7CitpZighdGhpcy50cmVlLnNob3dHcmlkKXsKK3JldHVybjsKK30KK3ZhciBfZWRlPXRoaXM7Cit2YXIgaWNvbj10aGlzLmlzTGFzdENoaWxkKCk/dGhpcy50cmVlLmJsYW5rSWNvblNyYzp0aGlzLnRyZWUuZ3JpZEljb25TcmNWOworZG9qby5sYW5nLmZvckVhY2goX2VkZS5nZXREZXNjZW5kYW50cygpLGZ1bmN0aW9uKG5vZGUpeworbm9kZS5zZXRHcmlkSW1hZ2UoX2VkZS5kZXB0aCxpY29uKTsKK30pOwordGhpcy51cGRhdGVFeHBhbmRHcmlkKCk7Cit9LHVwZGF0ZUljb25zOmZ1bmN0aW9uKCl7Cit0aGlzLmltZ3NbMF0uc3R5bGUuZGlzcGxheT10aGlzLnRyZWUuc2hvd1Jvb3RHcmlkPyJpbmxpbmUiOiJub25lIjsKK3RoaXMuYnVpbGRDaGlsZEljb24oKTsKK3RoaXMudXBkYXRlRXhwYW5kR3JpZCgpOwordGhpcy51cGRhdGVDaGlsZEdyaWQoKTsKK3RoaXMudXBkYXRlUGFyZW50R3JpZCgpOworZG9qby5wcm9maWxlLnN0b3AoInVwZGF0ZUljb25zIik7Cit9LGJ1aWxkQ2hpbGRJY29uOmZ1bmN0aW9uKCl7CitpZih0aGlzLmNoaWxkSWNvblNyYyl7Cit0aGlzLmNoaWxkSWNvbi5zcmM9dGhpcy5jaGlsZEljb25TcmM7Cit9Cit0aGlzLmNoaWxkSWNvbi5zdHlsZS5kaXNwbGF5PXRoaXMuY2hpbGRJY29uU3JjPyJpbmxpbmUiOiJub25lIjsKK30sc2V0R3JpZEltYWdlOmZ1bmN0aW9uKGlkeCxzcmMpeworaWYoaWR4PDApeworaWR4PXRoaXMuaW1ncy5sZW5ndGgraWR4OworfQordGhpcy5pbWdzW2lkeF0uc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoIitzcmMrIikiOworfSx1cGRhdGVJY29uVHJlZTpmdW5jdGlvbigpewordGhpcy50cmVlLnVwZGF0ZUljb25UcmVlLmNhbGwodGhpcyk7Cit9LGV4cGFuZDpmdW5jdGlvbigpeworaWYodGhpcy5pc0V4cGFuZGVkKXsKK3JldHVybjsKK30KK2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKXsKK3RoaXMuc2hvd0NoaWxkcmVuKCk7Cit9Cit0aGlzLmlzRXhwYW5kZWQ9dHJ1ZTsKK3RoaXMudXBkYXRlRXhwYW5kSWNvbigpOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmV4cGFuZCx7c291cmNlOnRoaXN9KTsKK30sY29sbGFwc2U6ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmlzRXhwYW5kZWQpeworcmV0dXJuOworfQordGhpcy5oaWRlQ2hpbGRyZW4oKTsKK3RoaXMuaXNFeHBhbmRlZD1mYWxzZTsKK3RoaXMudXBkYXRlRXhwYW5kSWNvbigpOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLHtzb3VyY2U6dGhpc30pOworfSxoaWRlQ2hpbGRyZW46ZnVuY3Rpb24oKXsKK3RoaXMudHJlZS50b2dnbGVPYmouaGlkZSh0aGlzLmNvbnRhaW5lck5vZGUsdGhpcy50b2dnbGVEdXJhdGlvbix0aGlzLmV4cGxvZGVTcmMsZG9qby5sYW5nLmhpdGNoKHRoaXMsIm9uSGlkZSIpKTsKK2lmKGRvam8uZXhpc3RzKGRvam8sImRuZC5kcmFnTWFuYWdlci5kcmFnT2JqZWN0cyIpJiZkb2pvLmRuZC5kcmFnTWFuYWdlci5kcmFnT2JqZWN0cy5sZW5ndGgpeworZG9qby5kbmQuZHJhZ01hbmFnZXIuY2FjaGVUYXJnZXRMb2NhdGlvbnMoKTsKK30KK30sc2hvd0NoaWxkcmVuOmZ1bmN0aW9uKCl7Cit0aGlzLnRyZWUudG9nZ2xlT2JqLnNob3codGhpcy5jb250YWluZXJOb2RlLHRoaXMudG9nZ2xlRHVyYXRpb24sdGhpcy5leHBsb2RlU3JjLGRvam8ubGFuZy5oaXRjaCh0aGlzLCJvblNob3ciKSk7CitpZihkb2pvLmV4aXN0cyhkb2pvLCJkbmQuZHJhZ01hbmFnZXIuZHJhZ09iamVjdHMiKSYmZG9qby5kbmQuZHJhZ01hbmFnZXIuZHJhZ09iamVjdHMubGVuZ3RoKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7Cit9Cit9LGFkZENoaWxkOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy50cmVlLmFkZENoaWxkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sZG9BZGRDaGlsZDpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudHJlZS5kb0FkZENoaWxkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK30sZWRpdDpmdW5jdGlvbihfZWUzKXsKK2Rvam8ubGFuZy5taXhpbih0aGlzLF9lZTMpOworaWYoX2VlMy50aXRsZSl7Cit0aGlzLnRpdGxlTm9kZS5pbm5lckhUTUw9dGhpcy50aXRsZTsKK30KK2lmKF9lZTMuYWZ0ZXJMYWJlbCl7Cit0aGlzLmFmdGVyTGFiZWxOb2RlLmlubmVySFRNTD10aGlzLmFmdGVyTGFiZWw7Cit9CitpZihfZWUzLmNoaWxkSWNvblNyYyl7Cit0aGlzLmJ1aWxkQ2hpbGRJY29uKCk7Cit9Cit9LHJlbW92ZU5vZGU6ZnVuY3Rpb24oKXsKK3JldHVybiB0aGlzLnRyZWUucmVtb3ZlTm9kZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGRvUmVtb3ZlTm9kZTpmdW5jdGlvbigpeworcmV0dXJuIHRoaXMudHJlZS5kb1JlbW92ZU5vZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSx0b1N0cmluZzpmdW5jdGlvbigpeworcmV0dXJuICJbIit0aGlzLndpZGdldFR5cGUrIiBUcmVlOiIrdGhpcy50cmVlKyIgSUQ6Iit0aGlzLndpZGdldElkKyIgVGl0bGU6Iit0aGlzLnRpdGxlKyJdIjsKK319KTsKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlTm9kZSIpOworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVOb2RlIixkb2pvLndpZGdldC5UcmVlTm9kZSx7d2lkZ2V0VHlwZToiU3RydXRzVHJlZU5vZGUiLGxvYWRlZDpmYWxzZSxleHBhbmQ6ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmxvYWRlZCl7Cit0aGlzLnJlbG9hZCgpOworfQorc3RydXRzLndpZGdldC5TdHJ1dHNUcmVlTm9kZS5zdXBlcmNsYXNzLmV4cGFuZC5hcHBseSh0aGlzKTsKK30scmVtb3ZlQ2hpbGRyZW46ZnVuY3Rpb24oKXsKK3ZhciBzZWxmPXRoaXM7Cit2YXIgX2VlNT1kb2pvLmxhbmcudG9BcnJheSh0aGlzLmNoaWxkcmVuKTsKK2Rvam8ubGFuZy5mb3JFYWNoKF9lZTUsZnVuY3Rpb24obm9kZSl7CitzZWxmLnJlbW92ZU5vZGUobm9kZSk7Cit9KTsKK30scmVsb2FkOmZ1bmN0aW9uKCl7Cit2YXIgaHJlZj10aGlzLnRyZWUuaHJlZjsKK3RoaXMubG9hZGVkPXRydWU7CitpZighZG9qby5zdHJpbmcuaXNCbGFuayhocmVmKSl7Cit0aGlzLnJlbW92ZUNoaWxkcmVuKCk7Cit2YXIgX2VlOD1ocmVmKyhocmVmLmluZGV4T2YoIj8iKT4tMT8iJiI6Ij8iKSsibm9kZUlkPSIrdGhpcy53aWRnZXRJZDsKK3ZhciBzZWxmPXRoaXM7Cit0aGlzLm1hcmtMb2FkaW5nKCk7Citkb2pvLmlvLmJpbmQoe3VybDpfZWU4LHVzZUNhY2hlOmZhbHNlLHByZXZlbnRDYWNoZTp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24odHlwZSxkYXRhLGUpeworaWYodHlwZT09ImxvYWQiKXsKK2lmKGRhdGEpeworZG9qby5sYW5nLmZvckVhY2goZGF0YSxmdW5jdGlvbihfZWVkKXsKK3ZhciBfZWVlPWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgic3RydXRzOlN0cnV0c1RyZWVOb2RlIix7dGl0bGU6X2VlZC5sYWJlbCxpc0ZvbGRlcjpfZWVkLmhhc0NoaWxkcmVuLHdpZGdldElkOl9lZWQuaWR9KTsKK3NlbGYuYWRkQ2hpbGQoX2VlZSk7Cit9KTsKK30KK30KK3NlbGYudW5NYXJrTG9hZGluZygpOworfSxtaW1ldHlwZToidGV4dC9qc29uIn0pOworfQorfX0pOworZG9qby5wcm92aWRlKCJkb2pvLmpzb24iKTsKK2Rvam8uanNvbj17anNvblJlZ2lzdHJ5Om5ldyBkb2pvLkFkYXB0ZXJSZWdpc3RyeSgpLHJlZ2lzdGVyOmZ1bmN0aW9uKG5hbWUsX2VmMCx3cmFwLF9lZjIpeworZG9qby5qc29uLmpzb25SZWdpc3RyeS5yZWdpc3RlcihuYW1lLF9lZjAsd3JhcCxfZWYyKTsKK30sZXZhbEpzb246ZnVuY3Rpb24oanNvbil7Cit0cnl7CityZXR1cm4gZXZhbCgiKCIranNvbisiKSIpOworfQorY2F0Y2goZSl7Citkb2pvLmRlYnVnKGUpOworcmV0dXJuIGpzb247Cit9Cit9LHNlcmlhbGl6ZTpmdW5jdGlvbihvKXsKK3ZhciBfZWY1PXR5cGVvZiAobyk7CitpZihfZWY1PT0idW5kZWZpbmVkIil7CityZXR1cm4gInVuZGVmaW5lZCI7Cit9ZWxzZXsKK2lmKChfZWY1PT0ibnVtYmVyIil8fChfZWY1PT0iYm9vbGVhbiIpKXsKK3JldHVybiBvKyIiOworfWVsc2V7CitpZihvPT09bnVsbCl7CityZXR1cm4gIm51bGwiOworfQorfQorfQoraWYoX2VmNT09InN0cmluZyIpeworcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVN0cmluZyhvKTsKK30KK3ZhciBtZT1hcmd1bWVudHMuY2FsbGVlOwordmFyIF9lZjc7CitpZih0eXBlb2YgKG8uX19qc29uX18pPT0iZnVuY3Rpb24iKXsKK19lZjc9by5fX2pzb25fXygpOworaWYobyE9PV9lZjcpeworcmV0dXJuIG1lKF9lZjcpOworfQorfQoraWYodHlwZW9mIChvLmpzb24pPT0iZnVuY3Rpb24iKXsKK19lZjc9by5qc29uKCk7CitpZihvIT09X2VmNyl7CityZXR1cm4gbWUoX2VmNyk7Cit9Cit9CitpZihfZWY1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgKG8ubGVuZ3RoKT09Im51bWJlciIpewordmFyIHJlcz1bXTsKK2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXsKK3ZhciB2YWw9bWUob1tpXSk7CitpZih0eXBlb2YgKHZhbCkhPSJzdHJpbmciKXsKK3ZhbD0idW5kZWZpbmVkIjsKK30KK3Jlcy5wdXNoKHZhbCk7Cit9CityZXR1cm4gIlsiK3Jlcy5qb2luKCIsIikrIl0iOworfQordHJ5eword2luZG93Lm89bzsKK19lZjc9ZG9qby5qc29uLmpzb25SZWdpc3RyeS5tYXRjaChvKTsKK3JldHVybiBtZShfZWY3KTsKK30KK2NhdGNoKGUpeworfQoraWYoX2VmNT09ImZ1bmN0aW9uIil7CityZXR1cm4gbnVsbDsKK30KK3Jlcz1bXTsKK2Zvcih2YXIgayBpbiBvKXsKK3ZhciBfZWZjOworaWYodHlwZW9mIChrKT09Im51bWJlciIpeworX2VmYz0iXCIiK2srIlwiIjsKK31lbHNleworaWYodHlwZW9mIChrKT09InN0cmluZyIpeworX2VmYz1kb2pvLnN0cmluZy5lc2NhcGVTdHJpbmcoayk7Cit9ZWxzZXsKK2NvbnRpbnVlOworfQorfQordmFsPW1lKG9ba10pOworaWYodHlwZW9mICh2YWwpIT0ic3RyaW5nIil7Citjb250aW51ZTsKK30KK3Jlcy5wdXNoKF9lZmMrIjoiK3ZhbCk7Cit9CityZXR1cm4gInsiK3Jlcy5qb2luKCIsIikrIn0iOworfX07Citkb2pvLnByb3ZpZGUoImRvam8uZG5kLlRyZWVEcmFnQW5kRHJvcCIpOworZG9qby5kbmQuVHJlZURyYWdTb3VyY2U9ZnVuY3Rpb24obm9kZSxfZWZlLHR5cGUsX2YwMCl7Cit0aGlzLmNvbnRyb2xsZXI9X2VmZTsKK3RoaXMudHJlZU5vZGU9X2YwMDsKK2Rvam8uZG5kLkh0bWxEcmFnU291cmNlLmNhbGwodGhpcyxub2RlLHR5cGUpOworfTsKK2Rvam8uaW5oZXJpdHMoZG9qby5kbmQuVHJlZURyYWdTb3VyY2UsZG9qby5kbmQuSHRtbERyYWdTb3VyY2UpOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZSx7b25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXsKK3ZhciBfZjAxPWRvam8uZG5kLkh0bWxEcmFnU291cmNlLnByb3RvdHlwZS5vbkRyYWdTdGFydC5jYWxsKHRoaXMpOworX2YwMS50cmVlTm9kZT10aGlzLnRyZWVOb2RlOworX2YwMS5vbkRyYWdTdGFydD1kb2pvLmxhbmcuaGl0Y2goX2YwMSxmdW5jdGlvbihlKXsKK3RoaXMuc2F2ZWRTZWxlY3RlZE5vZGU9dGhpcy50cmVlTm9kZS50cmVlLnNlbGVjdG9yLnNlbGVjdGVkTm9kZTsKK2lmKHRoaXMuc2F2ZWRTZWxlY3RlZE5vZGUpewordGhpcy5zYXZlZFNlbGVjdGVkTm9kZS51bk1hcmtTZWxlY3RlZCgpOworfQordmFyIF9mMDM9ZG9qby5kbmQuSHRtbERyYWdPYmplY3QucHJvdG90eXBlLm9uRHJhZ1N0YXJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3ZhciBfZjA0PXRoaXMuZHJhZ0Nsb25lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKTsKK2Zvcih2YXIgaT0wO2k8X2YwNC5sZW5ndGg7aSsrKXsKK19mMDQuaXRlbShpKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgpIjsKK30KK3JldHVybiBfZjAzOworfSk7CitfZjAxLm9uRHJhZ0VuZD1mdW5jdGlvbihlKXsKK2lmKHRoaXMuc2F2ZWRTZWxlY3RlZE5vZGUpewordGhpcy5zYXZlZFNlbGVjdGVkTm9kZS5tYXJrU2VsZWN0ZWQoKTsKK30KK3JldHVybiBkb2pvLmRuZC5IdG1sRHJhZ09iamVjdC5wcm90b3R5cGUub25EcmFnRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK307CityZXR1cm4gX2YwMTsKK30sb25EcmFnRW5kOmZ1bmN0aW9uKGUpewordmFyIHJlcz1kb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZS5wcm90b3R5cGUub25EcmFnRW5kLmNhbGwodGhpcyxlKTsKK3JldHVybiByZXM7Cit9fSk7Citkb2pvLmRuZC5UcmVlRHJvcFRhcmdldD1mdW5jdGlvbihfZjA5LF9mMGEsdHlwZSxfZjBjKXsKK3RoaXMudHJlZU5vZGU9X2YwYzsKK3RoaXMuY29udHJvbGxlcj1fZjBhOworZG9qby5kbmQuSHRtbERyb3BUYXJnZXQuYXBwbHkodGhpcyxbX2YwOSx0eXBlXSk7Cit9OworZG9qby5pbmhlcml0cyhkb2pvLmRuZC5UcmVlRHJvcFRhcmdldCxkb2pvLmRuZC5IdG1sRHJvcFRhcmdldCk7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZG5kLlRyZWVEcm9wVGFyZ2V0LHthdXRvRXhwYW5kRGVsYXk6MTUwMCxhdXRvRXhwYW5kVGltZXI6bnVsbCxwb3NpdGlvbjpudWxsLGluZGljYXRvclN0eWxlOiIycHggYmxhY2sgc29saWQiLHNob3dJbmRpY2F0b3I6ZnVuY3Rpb24oX2YwZCl7CitpZih0aGlzLnBvc2l0aW9uPT1fZjBkKXsKK3JldHVybjsKK30KK3RoaXMuaGlkZUluZGljYXRvcigpOwordGhpcy5wb3NpdGlvbj1fZjBkOworaWYoX2YwZD09ImJlZm9yZSIpewordGhpcy50cmVlTm9kZS5sYWJlbE5vZGUuc3R5bGUuYm9yZGVyVG9wPXRoaXMuaW5kaWNhdG9yU3R5bGU7Cit9ZWxzZXsKK2lmKF9mMGQ9PSJhZnRlciIpewordGhpcy50cmVlTm9kZS5sYWJlbE5vZGUuc3R5bGUuYm9yZGVyQm90dG9tPXRoaXMuaW5kaWNhdG9yU3R5bGU7Cit9ZWxzZXsKK2lmKF9mMGQ9PSJvbnRvIil7Cit0aGlzLnRyZWVOb2RlLm1hcmtTZWxlY3RlZCgpOworfQorfQorfQorfSxoaWRlSW5kaWNhdG9yOmZ1bmN0aW9uKCl7Cit0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJCb3R0b209IiI7Cit0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJUb3A9IiI7Cit0aGlzLnRyZWVOb2RlLnVuTWFya1NlbGVjdGVkKCk7Cit0aGlzLnBvc2l0aW9uPW51bGw7Cit9LG9uRHJhZ092ZXI6ZnVuY3Rpb24oZSl7Cit2YXIgX2YwZj1kb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUub25EcmFnT3Zlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CitpZihfZjBmJiZ0aGlzLnRyZWVOb2RlLmlzRm9sZGVyJiYhdGhpcy50cmVlTm9kZS5pc0V4cGFuZGVkKXsKK3RoaXMuc2V0QXV0b0V4cGFuZFRpbWVyKCk7Cit9CityZXR1cm4gX2YwZjsKK30sYWNjZXB0czpmdW5jdGlvbihfZjEwKXsKK3ZhciBfZjExPWRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0LnByb3RvdHlwZS5hY2NlcHRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2lmKCFfZjExKXsKK3JldHVybiBmYWxzZTsKK30KK3ZhciBfZjEyPV9mMTBbMF0udHJlZU5vZGU7CitpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoX2YxMil8fCFfZjEyfHwhX2YxMi5pc1RyZWVOb2RlKXsKK2Rvam8ucmFpc2UoIlNvdXJjZSBpcyBub3QgVHJlZU5vZGUgb3Igbm90IGZvdW5kIik7Cit9CitpZihfZjEyPT09dGhpcy50cmVlTm9kZSl7CityZXR1cm4gZmFsc2U7Cit9CityZXR1cm4gdHJ1ZTsKK30sc2V0QXV0b0V4cGFuZFRpbWVyOmZ1bmN0aW9uKCl7Cit2YXIgX2YxMz10aGlzOwordmFyIF9mMTQ9ZnVuY3Rpb24oKXsKK2lmKGRvam8uZG5kLmRyYWdNYW5hZ2VyLmN1cnJlbnREcm9wVGFyZ2V0PT09X2YxMyl7CitfZjEzLmNvbnRyb2xsZXIuZXhwYW5kKF9mMTMudHJlZU5vZGUpOworfQorfTsKK3RoaXMuYXV0b0V4cGFuZFRpbWVyPWRvam8ubGFuZy5zZXRUaW1lb3V0KF9mMTQsX2YxMy5hdXRvRXhwYW5kRGVsYXkpOworfSxnZXRETkRNb2RlOmZ1bmN0aW9uKCl7CityZXR1cm4gdGhpcy50cmVlTm9kZS50cmVlLkRORE1vZGU7Cit9LGdldEFjY2VwdFBvc2l0aW9uOmZ1bmN0aW9uKGUsX2YxNil7Cit2YXIgX2YxNz10aGlzLmdldERORE1vZGUoKTsKK2lmKF9mMTcmZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuT05UTyYmISghdGhpcy50cmVlTm9kZS5hY3Rpb25Jc0Rpc2FibGVkKGRvam8ud2lkZ2V0LlRyZWVOb2RlLnByb3RvdHlwZS5hY3Rpb25zLkFERENISUxEKSYmX2YxNi5wYXJlbnQhPT10aGlzLnRyZWVOb2RlJiZ0aGlzLmNvbnRyb2xsZXIuY2FuTW92ZShfZjE2LHRoaXMudHJlZU5vZGUpKSl7CitfZjE3Jj1+ZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuT05UTzsKK30KK3ZhciBfZjE4PXRoaXMuZ2V0UG9zaXRpb24oZSxfZjE3KTsKK2lmKF9mMTg9PSJvbnRvInx8KCF0aGlzLmlzQWRqYWNlbnROb2RlKF9mMTYsX2YxOCkmJnRoaXMuY29udHJvbGxlci5jYW5Nb3ZlKF9mMTYsdGhpcy50cmVlTm9kZS5wYXJlbnQpKSl7CityZXR1cm4gX2YxODsKK31lbHNleworcmV0dXJuIGZhbHNlOworfQorfSxvbkRyYWdPdXQ6ZnVuY3Rpb24oZSl7Cit0aGlzLmNsZWFyQXV0b0V4cGFuZFRpbWVyKCk7Cit0aGlzLmhpZGVJbmRpY2F0b3IoKTsKK30sY2xlYXJBdXRvRXhwYW5kVGltZXI6ZnVuY3Rpb24oKXsKK2lmKHRoaXMuYXV0b0V4cGFuZFRpbWVyKXsKK2NsZWFyVGltZW91dCh0aGlzLmF1dG9FeHBhbmRUaW1lcik7Cit0aGlzLmF1dG9FeHBhbmRUaW1lcj1udWxsOworfQorfSxvbkRyYWdNb3ZlOmZ1bmN0aW9uKGUsX2YxYil7Cit2YXIgX2YxYz1fZjFiWzBdLnRyZWVOb2RlOwordmFyIF9mMWQ9dGhpcy5nZXRBY2NlcHRQb3NpdGlvbihlLF9mMWMpOworaWYoX2YxZCl7Cit0aGlzLnNob3dJbmRpY2F0b3IoX2YxZCk7Cit9Cit9LGlzQWRqYWNlbnROb2RlOmZ1bmN0aW9uKF9mMWUsX2YxZil7CitpZihfZjFlPT09dGhpcy50cmVlTm9kZSl7CityZXR1cm4gdHJ1ZTsKK30KK2lmKF9mMWUuZ2V0TmV4dFNpYmxpbmcoKT09PXRoaXMudHJlZU5vZGUmJl9mMWY9PSJiZWZvcmUiKXsKK3JldHVybiB0cnVlOworfQoraWYoX2YxZS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PXRoaXMudHJlZU5vZGUmJl9mMWY9PSJhZnRlciIpeworcmV0dXJuIHRydWU7Cit9CityZXR1cm4gZmFsc2U7Cit9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGUsX2YyMSl7Cit2YXIgbm9kZT1kb2pvLmJ5SWQodGhpcy50cmVlTm9kZS5sYWJlbE5vZGUpOwordmFyIF9mMjM9ZS5wYWdlWXx8ZS5jbGllbnRZK2Rvam8uYm9keSgpLnNjcm9sbFRvcDsKK3ZhciBfZjI0PWRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKG5vZGUpLnk7Cit2YXIgX2YyNT1kb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpLmhlaWdodDsKK3ZhciByZWxZPV9mMjMtX2YyNDsKK3ZhciBwPXJlbFkvX2YyNTsKK3ZhciBfZjI4PSIiOworaWYoX2YyMSZkb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5PTlRPJiZfZjIxJmRvam8ud2lkZ2V0LlRyZWUucHJvdG90eXBlLkRORE1vZGVzLkJFVFdFRU4peworaWYocDw9MC4zKXsKK19mMjg9ImJlZm9yZSI7Cit9ZWxzZXsKK2lmKHA8PTAuNyl7CitfZjI4PSJvbnRvIjsKK31lbHNleworX2YyOD0iYWZ0ZXIiOworfQorfQorfWVsc2V7CitpZihfZjIxJmRvam8ud2lkZ2V0LlRyZWUucHJvdG90eXBlLkRORE1vZGVzLkJFVFdFRU4peworaWYocDw9MC41KXsKK19mMjg9ImJlZm9yZSI7Cit9ZWxzZXsKK19mMjg9ImFmdGVyIjsKK30KK31lbHNleworaWYoX2YyMSZkb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5PTlRPKXsKK19mMjg9Im9udG8iOworfQorfQorfQorcmV0dXJuIF9mMjg7Cit9LGdldFRhcmdldFBhcmVudEluZGV4OmZ1bmN0aW9uKF9mMjksX2YyYSl7Cit2YXIgX2YyYj1fZjJhPT0iYmVmb3JlIj90aGlzLnRyZWVOb2RlLmdldFBhcmVudEluZGV4KCk6dGhpcy50cmVlTm9kZS5nZXRQYXJlbnRJbmRleCgpKzE7CitpZih0aGlzLnRyZWVOb2RlLnBhcmVudD09PV9mMjkucGFyZW50JiZ0aGlzLnRyZWVOb2RlLmdldFBhcmVudEluZGV4KCk+X2YyOS5nZXRQYXJlbnRJbmRleCgpKXsKK19mMmItLTsKK30KK3JldHVybiBfZjJiOworfSxvbkRyb3A6ZnVuY3Rpb24oZSl7Cit2YXIgX2YyZD10aGlzLnBvc2l0aW9uOwordGhpcy5vbkRyYWdPdXQoZSk7Cit2YXIgX2YyZT1lLmRyYWdPYmplY3QudHJlZU5vZGU7CitpZighZG9qby5sYW5nLmlzT2JqZWN0KF9mMmUpKXsKK2Rvam8ucmFpc2UoIlRyZWVOb2RlIG5vdCBmb3VuZCBpbiBkcmFnT2JqZWN0Iik7Cit9CitpZihfZjJkPT0ib250byIpeworcmV0dXJuIHRoaXMuY29udHJvbGxlci5tb3ZlKF9mMmUsdGhpcy50cmVlTm9kZSwwKTsKK31lbHNlewordmFyIF9mMmY9dGhpcy5nZXRUYXJnZXRQYXJlbnRJbmRleChfZjJlLF9mMmQpOworcmV0dXJuIHRoaXMuY29udHJvbGxlci5tb3ZlKF9mMmUsdGhpcy50cmVlTm9kZS5wYXJlbnQsX2YyZik7Cit9Cit9fSk7Citkb2pvLmRuZC5UcmVlRE5EQ29udHJvbGxlcj1mdW5jdGlvbihfZjMwKXsKK3RoaXMudHJlZUNvbnRyb2xsZXI9X2YzMDsKK3RoaXMuZHJhZ1NvdXJjZXM9e307Cit0aGlzLmRyb3BUYXJnZXRzPXt9OworfTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5kbmQuVHJlZURORENvbnRyb2xsZXIse2xpc3RlblRyZWU6ZnVuY3Rpb24odHJlZSl7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSx0aGlzLCJvbkNyZWF0ZURPTU5vZGUiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSx0aGlzLCJvbk1vdmVGcm9tIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMubW92ZVRvLHRoaXMsIm9uTW92ZVRvIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuYWRkQ2hpbGQsdGhpcywib25BZGRDaGlsZCIpOworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUsdGhpcywib25SZW1vdmVOb2RlIik7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZURlc3Ryb3ksdGhpcywib25UcmVlRGVzdHJveSIpOworfSx1bmxpc3RlblRyZWU6ZnVuY3Rpb24odHJlZSl7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jcmVhdGVET01Ob2RlLHRoaXMsIm9uQ3JlYXRlRE9NTm9kZSIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMubW92ZUZyb20sdGhpcywib25Nb3ZlRnJvbSIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMubW92ZVRvLHRoaXMsIm9uTW92ZVRvIik7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCx0aGlzLCJvbkFkZENoaWxkIik7Citkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLHRoaXMsIm9uUmVtb3ZlTm9kZSIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZURlc3Ryb3ksdGhpcywib25UcmVlRGVzdHJveSIpOworfSxvblRyZWVEZXN0cm95OmZ1bmN0aW9uKF9mMzMpewordGhpcy51bmxpc3RlblRyZWUoX2YzMy5zb3VyY2UpOworfSxvbkNyZWF0ZURPTU5vZGU6ZnVuY3Rpb24oX2YzNCl7Cit0aGlzLnJlZ2lzdGVyRE5ETm9kZShfZjM0LnNvdXJjZSk7Cit9LG9uQWRkQ2hpbGQ6ZnVuY3Rpb24oX2YzNSl7Cit0aGlzLnJlZ2lzdGVyRE5ETm9kZShfZjM1LmNoaWxkKTsKK30sb25Nb3ZlRnJvbTpmdW5jdGlvbihfZjM2KXsKK3ZhciBfZjM3PXRoaXM7Citkb2pvLmxhbmcuZm9yRWFjaChfZjM2LmNoaWxkLmdldERlc2NlbmRhbnRzKCksZnVuY3Rpb24obm9kZSl7CitfZjM3LnVucmVnaXN0ZXJETkROb2RlKG5vZGUpOworfSk7Cit9LG9uTW92ZVRvOmZ1bmN0aW9uKF9mMzkpewordmFyIF9mM2E9dGhpczsKK2Rvam8ubGFuZy5mb3JFYWNoKF9mMzkuY2hpbGQuZ2V0RGVzY2VuZGFudHMoKSxmdW5jdGlvbihub2RlKXsKK19mM2EucmVnaXN0ZXJETkROb2RlKG5vZGUpOworfSk7Cit9LHJlZ2lzdGVyRE5ETm9kZTpmdW5jdGlvbihub2RlKXsKK2lmKCFub2RlLnRyZWUuRE5ETW9kZSl7CityZXR1cm47Cit9Cit2YXIgX2YzZD1udWxsOwordmFyIF9mM2U9bnVsbDsKK2lmKCFub2RlLmFjdGlvbklzRGlzYWJsZWQobm9kZS5hY3Rpb25zLk1PVkUpKXsKK3ZhciBfZjNkPW5ldyBkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZShub2RlLmxhYmVsTm9kZSx0aGlzLG5vZGUudHJlZS53aWRnZXRJZCxub2RlKTsKK3RoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF09X2YzZDsKK30KK3ZhciBfZjNlPW5ldyBkb2pvLmRuZC5UcmVlRHJvcFRhcmdldChub2RlLmxhYmVsTm9kZSx0aGlzLnRyZWVDb250cm9sbGVyLG5vZGUudHJlZS5ETkRBY2NlcHRUeXBlcyxub2RlKTsKK3RoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF09X2YzZTsKK30sdW5yZWdpc3RlckRORE5vZGU6ZnVuY3Rpb24obm9kZSl7CitpZih0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF0pOworZGVsZXRlIHRoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF07Cit9CitpZih0aGlzLmRyb3BUYXJnZXRzW25vZGUud2lkZ2V0SWRdKXsKK2Rvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcm9wVGFyZ2V0KHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0pOworZGVsZXRlIHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF07Cit9Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXIiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZUJhc2ljQ29udHJvbGxlciIsZG9qby53aWRnZXQuSHRtbFdpZGdldCx7d2lkZ2V0VHlwZToiVHJlZUJhc2ljQ29udHJvbGxlciIsRE5EQ29udHJvbGxlcjoiIixkaWVXaXRoVHJlZTpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKGFyZ3MsZnJhZyl7CitpZih0aGlzLkRORENvbnRyb2xsZXI9PSJjcmVhdGUiKXsKK3RoaXMuRE5EQ29udHJvbGxlcj1uZXcgZG9qby5kbmQuVHJlZURORENvbnRyb2xsZXIodGhpcyk7Cit9Cit9LGxpc3RlblRyZWU6ZnVuY3Rpb24odHJlZSl7Citkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSx0aGlzLCJvbkNyZWF0ZURPTU5vZGUiKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ2xpY2ssdGhpcywib25UcmVlQ2xpY2siKTsKK2Rvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ3JlYXRlLHRoaXMsIm9uVHJlZUNyZWF0ZSIpOworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LHRoaXMsIm9uVHJlZURlc3Ryb3kiKTsKK2lmKHRoaXMuRE5EQ29udHJvbGxlcil7Cit0aGlzLkRORENvbnRyb2xsZXIubGlzdGVuVHJlZSh0cmVlKTsKK30KK30sdW5saXN0ZW5UcmVlOmZ1bmN0aW9uKHRyZWUpeworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSx0aGlzLCJvbkNyZWF0ZURPTU5vZGUiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVDbGljayx0aGlzLCJvblRyZWVDbGljayIpOworZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudHJlZUNyZWF0ZSx0aGlzLCJvblRyZWVDcmVhdGUiKTsKK2Rvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LHRoaXMsIm9uVHJlZURlc3Ryb3kiKTsKK30sb25UcmVlRGVzdHJveTpmdW5jdGlvbihfZjQ0KXsKK3ZhciB0cmVlPV9mNDQuc291cmNlOwordGhpcy51bmxpc3RlblRyZWUodHJlZSk7CitpZih0aGlzLmRpZVdpdGhUcmVlKXsKK3RoaXMuZGVzdHJveSgpOworfQorfSxvbkNyZWF0ZURPTU5vZGU6ZnVuY3Rpb24oX2Y0Nil7Cit2YXIgbm9kZT1fZjQ2LnNvdXJjZTsKK2lmKG5vZGUuZXhwYW5kTGV2ZWw+MCl7Cit0aGlzLmV4cGFuZFRvTGV2ZWwobm9kZSxub2RlLmV4cGFuZExldmVsKTsKK30KK30sb25UcmVlQ3JlYXRlOmZ1bmN0aW9uKF9mNDgpewordmFyIHRyZWU9X2Y0OC5zb3VyY2U7Cit2YXIgX2Y0YT10aGlzOworaWYodHJlZS5leHBhbmRMZXZlbCl7Citkb2pvLmxhbmcuZm9yRWFjaCh0cmVlLmNoaWxkcmVuLGZ1bmN0aW9uKF9mNGIpeworX2Y0YS5leHBhbmRUb0xldmVsKF9mNGIsdHJlZS5leHBhbmRMZXZlbC0xKTsKK30pOworfQorfSxleHBhbmRUb0xldmVsOmZ1bmN0aW9uKG5vZGUsX2Y0ZCl7CitpZihfZjRkPT0wKXsKK3JldHVybjsKK30KK3ZhciBfZjRlPW5vZGUuY2hpbGRyZW47Cit2YXIgX2Y0Zj10aGlzOwordmFyIF9mNTA9ZnVuY3Rpb24obm9kZSxfZjUyKXsKK3RoaXMubm9kZT1ub2RlOwordGhpcy5leHBhbmRMZXZlbD1fZjUyOwordGhpcy5wcm9jZXNzPWZ1bmN0aW9uKCl7Citmb3IodmFyIGk9MDtpPHRoaXMubm9kZS5jaGlsZHJlbi5sZW5ndGg7aSsrKXsKK3ZhciBfZjU0PW5vZGUuY2hpbGRyZW5baV07CitfZjRmLmV4cGFuZFRvTGV2ZWwoX2Y1NCx0aGlzLmV4cGFuZExldmVsKTsKK30KK307Cit9OwordmFyIGg9bmV3IF9mNTAobm9kZSxfZjRkLTEpOwordGhpcy5leHBhbmQobm9kZSxmYWxzZSxoLGgucHJvY2Vzcyk7Cit9LG9uVHJlZUNsaWNrOmZ1bmN0aW9uKF9mNTYpewordmFyIG5vZGU9X2Y1Ni5zb3VyY2U7CitpZihub2RlLmlzTG9ja2VkKCkpeworcmV0dXJuIGZhbHNlOworfQoraWYobm9kZS5pc0V4cGFuZGVkKXsKK3RoaXMuY29sbGFwc2Uobm9kZSk7Cit9ZWxzZXsKK3RoaXMuZXhwYW5kKG5vZGUpOworfQorfSxleHBhbmQ6ZnVuY3Rpb24obm9kZSxzeW5jLF9mNWEsX2Y1Yil7Citub2RlLmV4cGFuZCgpOworaWYoX2Y1Yil7CitfZjViLmFwcGx5KF9mNWEsW25vZGVdKTsKK30KK30sY29sbGFwc2U6ZnVuY3Rpb24obm9kZSl7Citub2RlLmNvbGxhcHNlKCk7Cit9LGNhbk1vdmU6ZnVuY3Rpb24oX2Y1ZCxfZjVlKXsKK2lmKF9mNWQuYWN0aW9uSXNEaXNhYmxlZChfZjVkLmFjdGlvbnMuTU9WRSkpeworcmV0dXJuIGZhbHNlOworfQoraWYoX2Y1ZC5wYXJlbnQhPT1fZjVlJiZfZjVlLmFjdGlvbklzRGlzYWJsZWQoX2Y1ZS5hY3Rpb25zLkFERENISUxEKSl7CityZXR1cm4gZmFsc2U7Cit9Cit2YXIgbm9kZT1fZjVlOword2hpbGUobm9kZS5pc1RyZWVOb2RlKXsKK2lmKG5vZGU9PT1fZjVkKXsKK3JldHVybiBmYWxzZTsKK30KK25vZGU9bm9kZS5wYXJlbnQ7Cit9CityZXR1cm4gdHJ1ZTsKK30sbW92ZTpmdW5jdGlvbihfZjYwLF9mNjEsX2Y2Mil7CitpZighdGhpcy5jYW5Nb3ZlKF9mNjAsX2Y2MSkpeworcmV0dXJuIGZhbHNlOworfQordmFyIF9mNjM9dGhpcy5kb01vdmUoX2Y2MCxfZjYxLF9mNjIpOworaWYoIV9mNjMpeworcmV0dXJuIF9mNjM7Cit9CitpZihfZjYxLmlzVHJlZU5vZGUpewordGhpcy5leHBhbmQoX2Y2MSk7Cit9CityZXR1cm4gX2Y2MzsKK30sZG9Nb3ZlOmZ1bmN0aW9uKF9mNjQsX2Y2NSxfZjY2KXsKK19mNjQudHJlZS5tb3ZlKF9mNjQsX2Y2NSxfZjY2KTsKK3JldHVybiB0cnVlOworfSxjYW5SZW1vdmVOb2RlOmZ1bmN0aW9uKF9mNjcpeworaWYoX2Y2Ny5hY3Rpb25Jc0Rpc2FibGVkKF9mNjcuYWN0aW9ucy5SRU1PVkUpKXsKK3JldHVybiBmYWxzZTsKK30KK3JldHVybiB0cnVlOworfSxyZW1vdmVOb2RlOmZ1bmN0aW9uKG5vZGUsX2Y2OSxfZjZhKXsKK2lmKCF0aGlzLmNhblJlbW92ZU5vZGUobm9kZSkpeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuIHRoaXMuZG9SZW1vdmVOb2RlKG5vZGUsX2Y2OSxfZjZhKTsKK30sZG9SZW1vdmVOb2RlOmZ1bmN0aW9uKG5vZGUsX2Y2YyxfZjZkKXsKK25vZGUudHJlZS5yZW1vdmVOb2RlKG5vZGUpOworaWYoX2Y2ZCl7CitfZjZkLmFwcGx5KGRvam8ubGFuZy5pc1VuZGVmaW5lZChfZjZjKT90aGlzOl9mNmMsW25vZGVdKTsKK30KK30sY2FuQ3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oX2Y2ZSxfZjZmLGRhdGEpeworaWYoX2Y2ZS5hY3Rpb25Jc0Rpc2FibGVkKF9mNmUuYWN0aW9ucy5BRERDSElMRCkpeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuIHRydWU7Cit9LGNyZWF0ZUNoaWxkOmZ1bmN0aW9uKF9mNzEsX2Y3MixkYXRhLF9mNzQsX2Y3NSl7CitpZighdGhpcy5jYW5DcmVhdGVDaGlsZChfZjcxLF9mNzIsZGF0YSkpeworcmV0dXJuIGZhbHNlOworfQorcmV0dXJuIHRoaXMuZG9DcmVhdGVDaGlsZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Cit9LGRvQ3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oX2Y3NixfZjc3LGRhdGEsX2Y3OSxfZjdhKXsKK3ZhciBfZjdiPWRhdGEud2lkZ2V0VHlwZT9kYXRhLndpZGdldFR5cGU6IlRyZWVOb2RlIjsKK3ZhciBfZjdjPWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldChfZjdiLGRhdGEpOworX2Y3Ni5hZGRDaGlsZChfZjdjLF9mNzcpOwordGhpcy5leHBhbmQoX2Y3Nik7CitpZihfZjdhKXsKK19mN2EuYXBwbHkoX2Y3OSxbX2Y3Y10pOworfQorcmV0dXJuIF9mN2M7Cit9fSk7Citkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRyZWUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZSIsZG9qby53aWRnZXQuSHRtbFdpZGdldCxmdW5jdGlvbigpewordGhpcy5ldmVudE5hbWVzPXt9OwordGhpcy50cmVlPXRoaXM7Cit0aGlzLkROREFjY2VwdFR5cGVzPVtdOwordGhpcy5hY3Rpb25zRGlzYWJsZWQ9W107Cit9LHt3aWRnZXRUeXBlOiJUcmVlIixldmVudE5hbWVzRGVmYXVsdDp7Y3JlYXRlRE9NTm9kZToiY3JlYXRlRE9NTm9kZSIsdHJlZUNyZWF0ZToidHJlZUNyZWF0ZSIsdHJlZURlc3Ryb3k6InRyZWVEZXN0cm95Iix0cmVlQ2xpY2s6InRyZWVDbGljayIsaWNvbkNsaWNrOiJpY29uQ2xpY2siLHRpdGxlQ2xpY2s6InRpdGxlQ2xpY2siLG1vdmVGcm9tOiJtb3ZlRnJvbSIsbW92ZVRvOiJtb3ZlVG8iLGFkZENoaWxkOiJhZGRDaGlsZCIscmVtb3ZlTm9kZToicmVtb3ZlTm9kZSIsZXhwYW5kOiJleHBhbmQiLGNvbGxhcHNlOiJjb2xsYXBzZSJ9LGlzQ29udGFpbmVyOnRydWUsRE5ETW9kZToib2ZmIixsb2NrTGV2ZWw6MCxzdHJpY3RGb2xkZXJzOnRydWUsRE5ETW9kZXM6e0JFVFdFRU46MSxPTlRPOjJ9LEROREFjY2VwdFR5cGVzOiIiLHRlbXBsYXRlQ3NzU3RyaW5nOiJcclxuLmRvam9UcmVlIHtcclxuXHRmb250OiBjYXB0aW9uO1xyXG5cdGZvbnQtc2l6ZTogMTFweDtcclxuXHRmb250LXdlaWdodDogbm9ybWFsO1xyXG5cdG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG5cclxuLmRvam9UcmVlTm9kZUxhYmVsVGl0bGUge1xyXG5cdHBhZGRpbmctbGVmdDogMnB4O1xyXG5cdGNvbG9yOiBXaW5kb3dUZXh0O1xyXG59XHJcblxyXG4uZG9qb1RyZWVOb2RlTGFiZWwge1xyXG5cdGN1cnNvcjpoYW5kO1xyXG5cdGN1cnNvcjpwb2ludGVyO1xyXG59XHJcblxyXG4uZG9qb1RyZWVOb2RlTGFiZWxUaXRsZTpob3ZlciB7XHJcblx0dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbn1cclxuXHJcbi5kb2pvVHJlZU5vZGVMYWJlbFNlbGVjdGVkIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiBIaWdobGlnaHQ7XHJcblx0Y29sb3I6IEhpZ2hsaWdodFRleHQ7XHJcbn1cclxuXHJcbi5kb2pvVHJlZSBkaXYge1xyXG5cdHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbn1cclxuXHJcbi5kb2pvVHJlZSBpbWcsIC5kb2pvVHJlZU5vZGVMYWJlbCBpbWcge1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbn1cclxuXHJcbiIsdGVtcGxhdGVDc3NQYXRoOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvVHJlZS5jc3MiKSx0ZW1wbGF0ZVN0cmluZzoiPGRpdiBjbGFzcz1cImRvam9UcmVlXCI+PC9kaXY+Iixpc0V4cGFuZGVkOnRydWUsaXNUcmVlOnRydWUsb2JqZWN0SWQ6IiIsY29udHJvbGxlcjoiIixzZWxlY3RvcjoiIixtZW51OiIiLGV4cGFuZExldmVsOiIiLGJsYW5rSWNvblNyYzpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2JsYW5rLmdpZiIpLGdyaWRJY29uU3JjVDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfdC5naWYiKSxncmlkSWNvblNyY0w6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX2wuZ2lmIiksZ3JpZEljb25TcmNWOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF92LmdpZiIpLGdyaWRJY29uU3JjUDpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfcC5naWYiKSxncmlkSWNvblNyY0M6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX2MuZ2lmIiksZ3JpZEljb25TcmNYOmRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF94LmdpZiIpLGdyaWRJY29uU3JjWTpkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfeS5naWYiKSxncmlkSWNvblNyY1o6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3ouZ2lmIiksZXhwYW5kSWNvblNyY1BsdXM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfcGx1cy5naWYiKSxleHBhbmRJY29uU3JjTWludXM6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfbWludXMuZ2lmIiksZXhwYW5kSWNvblNyY0xvYWRpbmc6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9sb2FkaW5nLmdpZiIpLGljb25XaWR0aDoxOCxpY29uSGVpZ2h0OjE4LHNob3dHcmlkOnRydWUsc2hvd1Jvb3RHcmlkOnRydWUsYWN0aW9uSXNEaXNhYmxlZDpmdW5jdGlvbihfZjdkKXsKK3ZhciBfZjdlPXRoaXM7CityZXR1cm4gZG9qby5sYW5nLmluQXJyYXkoX2Y3ZS5hY3Rpb25zRGlzYWJsZWQsX2Y3ZCk7Cit9LGFjdGlvbnM6e0FERENISUxEOiJBRERDSElMRCJ9LGdldEluZm86ZnVuY3Rpb24oKXsKK3ZhciBpbmZvPXt3aWRnZXRJZDp0aGlzLndpZGdldElkLG9iamVjdElkOnRoaXMub2JqZWN0SWR9OworcmV0dXJuIGluZm87Cit9LGluaXRpYWxpemVDb250cm9sbGVyOmZ1bmN0aW9uKCl7CitpZih0aGlzLmNvbnRyb2xsZXIhPSJvZmYiKXsKK2lmKHRoaXMuY29udHJvbGxlcil7Cit0aGlzLmNvbnRyb2xsZXI9ZG9qby53aWRnZXQuYnlJZCh0aGlzLmNvbnRyb2xsZXIpOworfWVsc2V7Cit0aGlzLmNvbnRyb2xsZXI9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUcmVlQmFzaWNDb250cm9sbGVyIix7RE5EQ29udHJvbGxlcjoodGhpcy5ETkRNb2RlPyJjcmVhdGUiOiIiKSxkaWVXaXRoVHJlZTp0cnVlfSk7Cit9Cit0aGlzLmNvbnRyb2xsZXIubGlzdGVuVHJlZSh0aGlzKTsKK31lbHNlewordGhpcy5jb250cm9sbGVyPW51bGw7Cit9Cit9LGluaXRpYWxpemVTZWxlY3RvcjpmdW5jdGlvbigpeworaWYodGhpcy5zZWxlY3RvciE9Im9mZiIpeworaWYodGhpcy5zZWxlY3Rvcil7Cit0aGlzLnNlbGVjdG9yPWRvam8ud2lkZ2V0LmJ5SWQodGhpcy5zZWxlY3Rvcik7Cit9ZWxzZXsKK3RoaXMuc2VsZWN0b3I9ZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUcmVlU2VsZWN0b3IiLHtkaWVXaXRoVHJlZTp0cnVlfSk7Cit9Cit0aGlzLnNlbGVjdG9yLmxpc3RlblRyZWUodGhpcyk7Cit9ZWxzZXsKK3RoaXMuc2VsZWN0b3I9bnVsbDsKK30KK30saW5pdGlhbGl6ZTpmdW5jdGlvbihhcmdzLGZyYWcpewordmFyIF9mODI9dGhpczsKK2ZvcihuYW1lIGluIHRoaXMuZXZlbnROYW1lc0RlZmF1bHQpeworaWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKHRoaXMuZXZlbnROYW1lc1tuYW1lXSkpewordGhpcy5ldmVudE5hbWVzW25hbWVdPXRoaXMud2lkZ2V0SWQrIi8iK3RoaXMuZXZlbnROYW1lc0RlZmF1bHRbbmFtZV07Cit9Cit9Citmb3IodmFyIGk9MDtpPHRoaXMuYWN0aW9uc0Rpc2FibGVkLmxlbmd0aDtpKyspewordGhpcy5hY3Rpb25zRGlzYWJsZWRbaV09dGhpcy5hY3Rpb25zRGlzYWJsZWRbaV0udG9VcHBlckNhc2UoKTsKK30KK2lmKHRoaXMuRE5ETW9kZT09Im9mZiIpewordGhpcy5ETkRNb2RlPTA7Cit9ZWxzZXsKK2lmKHRoaXMuRE5ETW9kZT09ImJldHdlZW4iKXsKK3RoaXMuRE5ETW9kZT10aGlzLkRORE1vZGVzLk9OVE98dGhpcy5ETkRNb2Rlcy5CRVRXRUVOOworfWVsc2V7CitpZih0aGlzLkRORE1vZGU9PSJvbnRvIil7Cit0aGlzLkRORE1vZGU9dGhpcy5ETkRNb2Rlcy5PTlRPOworfQorfQorfQordGhpcy5leHBhbmRMZXZlbD1wYXJzZUludCh0aGlzLmV4cGFuZExldmVsKTsKK3RoaXMuaW5pdGlhbGl6ZVNlbGVjdG9yKCk7Cit0aGlzLmluaXRpYWxpemVDb250cm9sbGVyKCk7CitpZih0aGlzLm1lbnUpewordGhpcy5tZW51PWRvam8ud2lkZ2V0LmJ5SWQodGhpcy5tZW51KTsKK3RoaXMubWVudS5saXN0ZW5UcmVlKHRoaXMpOworfQordGhpcy5jb250YWluZXJOb2RlPXRoaXMuZG9tTm9kZTsKK30scG9zdENyZWF0ZTpmdW5jdGlvbigpewordGhpcy5jcmVhdGVET01Ob2RlKCk7Cit9LGNyZWF0ZURPTU5vZGU6ZnVuY3Rpb24oKXsKK2Rvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uKHRoaXMuZG9tTm9kZSk7Citmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2krKyl7Cit0aGlzLmNoaWxkcmVuW2ldLnBhcmVudD10aGlzOwordmFyIG5vZGU9dGhpcy5jaGlsZHJlbltpXS5jcmVhdGVET01Ob2RlKHRoaXMsMCk7Cit0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7Cit9CitpZighdGhpcy5zaG93Um9vdEdyaWQpeworZm9yKHZhciBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtpKyspewordGhpcy5jaGlsZHJlbltpXS5leHBhbmQoKTsKK30KK30KK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMudHJlZUNyZWF0ZSx7c291cmNlOnRoaXN9KTsKK30sZGVzdHJveTpmdW5jdGlvbigpeworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LHtzb3VyY2U6dGhpc30pOworcmV0dXJuIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpOworfSxhZGRDaGlsZDpmdW5jdGlvbihfZjg2LF9mODcpewordmFyIF9mODg9e2NoaWxkOl9mODYsaW5kZXg6X2Y4NyxwYXJlbnQ6dGhpcyxkb21Ob2RlSW5pdGlhbGl6ZWQ6X2Y4Ni5kb21Ob2RlSW5pdGlhbGl6ZWR9OwordGhpcy5kb0FkZENoaWxkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCxfZjg4KTsKK30sZG9BZGRDaGlsZDpmdW5jdGlvbihfZjg5LF9mOGEpeworaWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKF9mOGEpKXsKK19mOGE9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Cit9CitpZighX2Y4OS5pc1RyZWVOb2RlKXsKK2Rvam8ucmFpc2UoIllvdSBjYW4gb25seSBhZGQgVHJlZU5vZGUgd2lkZ2V0cyB0byBhICIrdGhpcy53aWRnZXRUeXBlKyIgd2lkZ2V0ISIpOworcmV0dXJuOworfQoraWYodGhpcy5pc1RyZWVOb2RlKXsKK2lmKCF0aGlzLmlzRm9sZGVyKXsKK3RoaXMuc2V0Rm9sZGVyKCk7Cit9Cit9Cit2YXIgX2Y4Yj10aGlzOworZG9qby5sYW5nLmZvckVhY2goX2Y4OS5nZXREZXNjZW5kYW50cygpLGZ1bmN0aW9uKGVsZW0peworZWxlbS50cmVlPV9mOGIudHJlZTsKK30pOworX2Y4OS5wYXJlbnQ9dGhpczsKK2lmKHRoaXMuaXNUcmVlTm9kZSl7Cit0aGlzLnN0YXRlPXRoaXMubG9hZFN0YXRlcy5MT0FERUQ7Cit9CitpZihfZjhhPHRoaXMuY2hpbGRyZW4ubGVuZ3RoKXsKK2Rvam8uaHRtbC5pbnNlcnRCZWZvcmUoX2Y4OS5kb21Ob2RlLHRoaXMuY2hpbGRyZW5bX2Y4YV0uZG9tTm9kZSk7Cit9ZWxzZXsKK3RoaXMuY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChfZjg5LmRvbU5vZGUpOworaWYodGhpcy5pc0V4cGFuZGVkJiZ0aGlzLmlzVHJlZU5vZGUpewordGhpcy5zaG93Q2hpbGRyZW4oKTsKK30KK30KK3RoaXMuY2hpbGRyZW4uc3BsaWNlKF9mOGEsMCxfZjg5KTsKK2lmKF9mODkuZG9tTm9kZUluaXRpYWxpemVkKXsKK3ZhciBkPXRoaXMuaXNUcmVlTm9kZT90aGlzLmRlcHRoOi0xOworX2Y4OS5hZGp1c3REZXB0aChkLV9mODkuZGVwdGgrMSk7CitfZjg5LnVwZGF0ZUljb25UcmVlKCk7Cit9ZWxzZXsKK19mODkuZGVwdGg9dGhpcy5pc1RyZWVOb2RlP3RoaXMuZGVwdGgrMTowOworX2Y4OS5jcmVhdGVET01Ob2RlKF9mODkudHJlZSxfZjg5LmRlcHRoKTsKK30KK3ZhciBfZjhlPV9mODkuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CitpZihfZjg5LmlzTGFzdENoaWxkKCkmJl9mOGUpeworX2Y4ZS51cGRhdGVFeHBhbmRHcmlkQ29sdW1uKCk7Cit9Cit9LG1ha2VCbGFua0ltZzpmdW5jdGlvbigpewordmFyIGltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKK2ltZy5zdHlsZS53aWR0aD10aGlzLmljb25XaWR0aCsicHgiOworaW1nLnN0eWxlLmhlaWdodD10aGlzLmljb25IZWlnaHQrInB4IjsKK2ltZy5zcmM9dGhpcy5ibGFua0ljb25TcmM7CitpbWcuc3R5bGUudmVydGljYWxBbGlnbj0ibWlkZGxlIjsKK3JldHVybiBpbWc7Cit9LHVwZGF0ZUljb25UcmVlOmZ1bmN0aW9uKCl7CitpZighdGhpcy5pc1RyZWUpewordGhpcy51cGRhdGVJY29ucygpOworfQorZm9yKHZhciBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtpKyspewordGhpcy5jaGlsZHJlbltpXS51cGRhdGVJY29uVHJlZSgpOworfQorfSx0b1N0cmluZzpmdW5jdGlvbigpeworcmV0dXJuICJbIit0aGlzLndpZGdldFR5cGUrIiBJRDoiK3RoaXMud2lkZ2V0SWQrIl0iOworfSxtb3ZlOmZ1bmN0aW9uKF9mOTEsX2Y5MixfZjkzKXsKK3ZhciBfZjk0PV9mOTEucGFyZW50OwordmFyIF9mOTU9X2Y5MS50cmVlOwordGhpcy5kb01vdmUuYXBwbHkodGhpcyxhcmd1bWVudHMpOwordmFyIF9mOTI9X2Y5MS5wYXJlbnQ7Cit2YXIgX2Y5Nj1fZjkxLnRyZWU7Cit2YXIgX2Y5Nz17b2xkUGFyZW50Ol9mOTQsb2xkVHJlZTpfZjk1LG5ld1BhcmVudDpfZjkyLG5ld1RyZWU6X2Y5NixjaGlsZDpfZjkxfTsKK2Rvam8uZXZlbnQudG9waWMucHVibGlzaChfZjk1LmV2ZW50TmFtZXMubW92ZUZyb20sX2Y5Nyk7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2Y5Ni5ldmVudE5hbWVzLm1vdmVUbyxfZjk3KTsKK30sZG9Nb3ZlOmZ1bmN0aW9uKF9mOTgsX2Y5OSxfZjlhKXsKK19mOTgucGFyZW50LmRvUmVtb3ZlTm9kZShfZjk4KTsKK19mOTkuZG9BZGRDaGlsZChfZjk4LF9mOWEpOworfSxyZW1vdmVOb2RlOmZ1bmN0aW9uKF9mOWIpeworaWYoIV9mOWIucGFyZW50KXsKK3JldHVybjsKK30KK3ZhciBfZjljPV9mOWIudHJlZTsKK3ZhciBfZjlkPV9mOWIucGFyZW50OwordmFyIF9mOWU9dGhpcy5kb1JlbW92ZU5vZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOworZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUse2NoaWxkOl9mOWUsdHJlZTpfZjljLHBhcmVudDpfZjlkfSk7CityZXR1cm4gX2Y5ZTsKK30sZG9SZW1vdmVOb2RlOmZ1bmN0aW9uKF9mOWYpeworaWYoIV9mOWYucGFyZW50KXsKK3JldHVybjsKK30KK3ZhciBfZmEwPV9mOWYucGFyZW50OwordmFyIF9mYTE9X2ZhMC5jaGlsZHJlbjsKK3ZhciBfZmEyPV9mOWYuZ2V0UGFyZW50SW5kZXgoKTsKK2lmKF9mYTI8MCl7Citkb2pvLnJhaXNlKCJDb3VsZG4ndCBmaW5kIG5vZGUgIitfZjlmKyIgZm9yIHJlbW92YWwiKTsKK30KK19mYTEuc3BsaWNlKF9mYTIsMSk7Citkb2pvLmh0bWwucmVtb3ZlTm9kZShfZjlmLmRvbU5vZGUpOworaWYoX2ZhMC5jaGlsZHJlbi5sZW5ndGg9PTAmJiFfZmEwLmlzVHJlZSl7CitfZmEwLmNvbnRhaW5lck5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSI7Cit9CitpZihfZmEyPT1fZmExLmxlbmd0aCYmX2ZhMj4wKXsKK19mYTFbX2ZhMi0xXS51cGRhdGVFeHBhbmRHcmlkQ29sdW1uKCk7Cit9CitpZihfZmEwIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVHJlZSYmX2ZhMj09MCYmX2ZhMS5sZW5ndGg+MCl7CitfZmExWzBdLnVwZGF0ZUV4cGFuZEdyaWQoKTsKK30KK19mOWYucGFyZW50PV9mOWYudHJlZT1udWxsOworcmV0dXJuIF9mOWY7Cit9LG1hcmtMb2FkaW5nOmZ1bmN0aW9uKCl7Cit9LHVuTWFya0xvYWRpbmc6ZnVuY3Rpb24oKXsKK30sbG9jazpmdW5jdGlvbigpeworIXRoaXMubG9ja0xldmVsJiZ0aGlzLm1hcmtMb2FkaW5nKCk7Cit0aGlzLmxvY2tMZXZlbCsrOworfSx1bmxvY2s6ZnVuY3Rpb24oKXsKK2lmKCF0aGlzLmxvY2tMZXZlbCl7Citkb2pvLnJhaXNlKCJ1bmxvY2s6IG5vdCBsb2NrZWQiKTsKK30KK3RoaXMubG9ja0xldmVsLS07CishdGhpcy5sb2NrTGV2ZWwmJnRoaXMudW5NYXJrTG9hZGluZygpOworfSxpc0xvY2tlZDpmdW5jdGlvbigpewordmFyIG5vZGU9dGhpczsKK3doaWxlKHRydWUpeworaWYobm9kZS5sb2NrTGV2ZWwpeworcmV0dXJuIHRydWU7Cit9CitpZihub2RlIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVHJlZSl7CiticmVhazsKK30KK25vZGU9bm9kZS5wYXJlbnQ7Cit9CityZXR1cm4gZmFsc2U7Cit9LGZsdXNoTG9jazpmdW5jdGlvbigpewordGhpcy5sb2NrTGV2ZWw9MDsKK3RoaXMudW5NYXJrTG9hZGluZygpOworfX0pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWUiKTsKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlIixkb2pvLndpZGdldC5UcmVlLHt3aWRnZXRUeXBlOiJTdHJ1dHNUcmVlIixocmVmOiIiLGVycm9yTm90aWZ5VG9waWNzOiIiLGVycm9yTm90aWZ5VG9waWNzQXJyYXk6bnVsbCxwb3N0Q3JlYXRlOmZ1bmN0aW9uKCl7CitzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWUuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMpOworaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvck5vdGlmeVRvcGljcykpewordGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5PXRoaXMuZXJyb3JOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKK30KK3ZhciBzZWxmPXRoaXM7CitpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhyZWYpKXsKK2Rvam8uaW8uYmluZCh7dXJsOnRoaXMuaHJlZix1c2VDYWNoZTpmYWxzZSxwcmV2ZW50Q2FjaGU6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uKHR5cGUsZGF0YSxlKXsKK2lmKHR5cGU9PSJsb2FkIil7CitpZihkYXRhKXsKK2Rvam8ubGFuZy5mb3JFYWNoKGRhdGEsZnVuY3Rpb24oX2ZhOCl7Cit2YXIgX2ZhOT1kb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoInN0cnV0czpTdHJ1dHNUcmVlTm9kZSIse3RpdGxlOl9mYTgubGFiZWwsaXNGb2xkZXI6X2ZhOC5oYXNDaGlsZHJlbix3aWRnZXRJZDpfZmE4LmlkfSk7CitzZWxmLmFkZENoaWxkKF9mYTkpOworfSk7Cit9Cit9ZWxzZXsKK2lmKHNlbGYuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSl7Citkb2pvLmxhbmcuZm9yRWFjaChzZWxmLmVycm9yTm90aWZ5VG9waWNzQXJyYXksZnVuY3Rpb24oX2ZhYSl7Cit0cnl7Citkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goX2ZhYSxkYXRhLGUsc2VsZik7Cit9CitjYXRjaChleCl7Citkb2pvLmRlYnVnKGV4KTsKK30KK30pOworfQorfQorfSxtaW1ldHlwZToidGV4dC9qc29uIn0pOworfQorfX0pOworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7Y29tbW9uOlsic3RydXRzLndpZGdldC5CaW5kIiwic3RydXRzLndpZGdldC5CaW5kRGl2Iiwic3RydXRzLndpZGdldC5CaW5kQW5jaG9yIiwic3RydXRzLndpZGdldC5Db21ib0JveCIsInN0cnV0cy53aWRnZXQuU3RydXRzVGltZVBpY2tlciIsInN0cnV0cy53aWRnZXQuU3RydXRzRGF0ZVBpY2tlciIsInN0cnV0cy53aWRnZXQuQmluZEV2ZW50Iiwic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3IiLCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RhYkNvbnRhaW5lciIsInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUiLCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWUiXX0pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzX2Rvam8uanMudW5jb21wcmVzc2VkLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzX2Rvam8uanMudW5jb21wcmVzc2VkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjI0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHNfZG9qby5qcy51bmNvbXByZXNzZWQuanMKQEAgLTAsMCArMSwzMTM1MyBAQAoraWYodHlwZW9mIGRvam8gPT0gInVuZGVmaW5lZCIpeworCisvLyBUT0RPQzogSE9XIFRPIERPQyBUSEUgQkVMT1c/CisvLyBAZ2xvYmFsOiBkakNvbmZpZworLy8gc3VtbWFyeToKKy8vCQlBcHBsaWNhdGlvbiBjb2RlIGNhbiBzZXQgdGhlIGdsb2JhbCAnZGpDb25maWcnIHByaW9yIHRvIGxvYWRpbmcKKy8vCQl0aGUgbGlicmFyeSB0byBvdmVycmlkZSBjZXJ0YWluIGdsb2JhbCBzZXR0aW5ncyBmb3IgaG93IGRvam8gd29ya3MuCisvLyBkZXNjcmlwdGlvbjogIFRoZSB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgc2V0IGFyZSBhcyBmb2xsb3dzOgorLy8JCQktIGlzRGVidWc6IGZhbHNlCisvLwkJCS0gYWxsb3dRdWVyeUNvbmZpZzogZmFsc2UKKy8vCQkJLSBiYXNlU2NyaXB0VXJpOiAiIgorLy8JCQktIGJhc2VSZWxhdGl2ZVBhdGg6ICIiCisvLwkJCS0gbGlicmFyeVNjcmlwdFVyaTogIiIKKy8vCQkJLSBpZVByZXZlbnRDbG9iYmVyOiBmYWxzZQorLy8JCQktIGllQ2xvYmJlck1pbmltYWw6IHRydWUKKy8vCQkJLSBsb2NhbGU6IHVuZGVmaW5lZAorLy8JCQktIGV4dHJhTG9jYWxlOiB1bmRlZmluZWQKKy8vCQkJLSBwcmV2ZW50QmFja0J1dHRvbkZpeDogdHJ1ZQorLy8JCQktIHNlYXJjaElkczogW10KKy8vCQkJLSBwYXJzZVdpZGdldHM6IHRydWUKKy8vIFRPRE9DOiBIT1cgVE8gRE9DIFRIRVNFIFZBUklBQkxFUz8KKy8vIFRPRE9DOiBJUyBUSElTIEEgQ09NUExFVEUgTElTVD8KKy8vIG5vdGU6CisvLwkJJ2RqQ29uZmlnJyBkb2VzIG5vdCBleGlzdCB1bmRlciAnZG9qby4qJyBzbyB0aGF0IGl0IGNhbiBiZSBzZXQgYmVmb3JlIHRoZQorLy8JCSdkb2pvJyB2YXJpYWJsZSBleGlzdHMuCisvLyBub3RlOgorLy8JCVNldHRpbmcgYW55IG9mIHRoZXNlIHZhcmlhYmxlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5IGhhcyBsb2FkZWQgZG9lcyBub3RoaW5nIGF0IGFsbC4KKy8vIFRPRE9DOiBpcyB0aGlzIHN0aWxsIHRydWU/ICBSZWxlYXNlIG5vdGVzIGZvciAwLjMgaW5kaWNhdGVkIHRoZXkgY291bGQgYmUgc2V0IGFmdGVyIGxvYWQuCisvLworCisKKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRISVM/CisvLyBAZ2xvYmFsOiBkal9nbG9iYWwKKy8vIHN1bW1hcnk6CisvLwkJYW4gYWxpYXMgZm9yIHRoZSB0b3AtbGV2ZWwgZ2xvYmFsIG9iamVjdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudAorLy8JCShlLmcuLCB0aGUgd2luZG93IG9iamVjdCBpbiBhIGJyb3dzZXIpLgorLy8gZGVzY3JpcHRpb246CisvLwkJUmVmZXIgdG8gJ2RqX2dsb2JhbCcgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvIHdpbmRvdyB0byBlbnN1cmUgeW91cgorLy8JCWNvZGUgcnVucyBjb3JyZWN0bHkgaW4gY29udGV4dHMgb3RoZXIgdGhhbiB3ZWIgYnJvd3NlcnMgKGVnOiBSaGlubyBvbiBhIHNlcnZlcikuCit2YXIgZGpfZ2xvYmFsID0gdGhpczsKKworLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KKy8vIEBnbG9iYWw6IGRqX2N1cnJlbnRDb250ZXh0CisvLyBzdW1tYXJ5OgorLy8JCVByaXZhdGUgZ2xvYmFsIGNvbnRleHQgb2JqZWN0LiBXaGVyZSAnZGpfZ2xvYmFsJyBhbHdheXMgcmVmZXJzIHRvIHRoZSBib290LXRpbWUKKy8vICAgIGdsb2JhbCBjb250ZXh0LCAnZGpfY3VycmVudENvbnRleHQnIGNhbiBiZSBtb2RpZmllZCBmb3IgdGVtcG9yYXJ5IGNvbnRleHQgc2hpZnRpbmcuCisvLyAgICBkb2pvLmdsb2JhbCgpIHJldHVybnMgZGpfY3VycmVudENvbnRleHQuCisvLyBkZXNjcmlwdGlvbjoKKy8vCQlSZWZlciB0byBkb2pvLmdsb2JhbCgpIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byBkal9nbG9iYWwgdG8gZW5zdXJlIHlvdXIKKy8vCQljb2RlIHJ1bnMgY29ycmVjdGx5IGluIG1hbmFnZWQgY29udGV4dHMuCit2YXIgZGpfY3VycmVudENvbnRleHQgPSB0aGlzOworCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGdsb2JhbCBwdWJsaWMgdXRpbHMKKy8vIFRPRE9DOiBETyBXRSBXQU5UIFRPIE5PVEUgVEhBVCBUSEVTRSBBUkUgR0xPQkFMIFBVQkxJQyBVVElMUz8KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworZnVuY3Rpb24gZGpfdW5kZWYoLypTdHJpbmcqLyBuYW1lLCAvKk9iamVjdD8qLyBvYmplY3QpeworCS8vc3VtbWFyeTogUmV0dXJucyB0cnVlIGlmICduYW1lJyBpcyBkZWZpbmVkIG9uICdvYmplY3QnIChvciBnbG9iYWxseSBpZiAnb2JqZWN0JyBpcyBudWxsKS4KKwkvL2Rlc2NyaXB0aW9uOiBOb3RlIHRoYXQgJ2RlZmluZWQnIGFuZCAnZXhpc3RzJyBhcmUgbm90IHRoZSBzYW1lIGNvbmNlcHQuCisJcmV0dXJuICh0eXBlb2YgKG9iamVjdCB8fCBkal9jdXJyZW50Q29udGV4dClbbmFtZV0gPT0gInVuZGVmaW5lZCIpOwkvLyBCb29sZWFuCit9CisKKy8vIG1ha2Ugc3VyZSBkakNvbmZpZyBpcyBkZWZpbmVkCitpZihkal91bmRlZigiZGpDb25maWciLCB0aGlzKSl7CisJdmFyIGRqQ29uZmlnID0ge307Cit9CisKKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRISVM/CisvLyBkb2pvIGlzIHRoZSByb290IHZhcmlhYmxlIG9mIChhbG1vc3QgYWxsKSBvdXIgcHVibGljIHN5bWJvbHMgLS0gbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuCitpZihkal91bmRlZigiZG9qbyIsIHRoaXMpKXsKKwl2YXIgZG9qbyA9IHt9OworfQorCitkb2pvLmdsb2JhbCA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwkJcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbCBjb250ZXh0IG9iamVjdAorCS8vCQkoZS5nLiwgdGhlIHdpbmRvdyBvYmplY3QgaW4gYSBicm93c2VyKS4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLwkJUmVmZXIgdG8gJ2Rvam8uZ2xvYmFsKCknIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byB3aW5kb3cgdG8gZW5zdXJlIHlvdXIKKwkvLwkJY29kZSBydW5zIGNvcnJlY3RseSBpbiBjb250ZXh0cyBvdGhlciB0aGFuIHdlYiBicm93c2VycyAoZWc6IFJoaW5vIG9uIGEgc2VydmVyKS4KKwlyZXR1cm4gZGpfY3VycmVudENvbnRleHQ7Cit9CisKKy8vIE92ZXJyaWRlIGxvY2FsZSBzZXR0aW5nLCBpZiBzcGVjaWZpZWQKK2Rvam8ubG9jYWxlICA9IGRqQ29uZmlnLmxvY2FsZTsKKworLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KK2Rvam8udmVyc2lvbiA9IHsKKwkvLyBzdW1tYXJ5OiB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGluc3RhbmNlIG9mIGRvam8uCisJbWFqb3I6IDAsIG1pbm9yOiA0LCBwYXRjaDogMywgZmxhZzogIiIsCisJcmV2aXNpb246IE51bWJlcigiJFJldiQiLm1hdGNoKC9bMC05XSsvKVswXSksCisJdG9TdHJpbmc6IGZ1bmN0aW9uKCl7CisJCXdpdGgoZG9qby52ZXJzaW9uKXsKKwkJCXJldHVybiBtYWpvciArICIuIiArIG1pbm9yICsgIi4iICsgcGF0Y2ggKyBmbGFnICsgIiAoIiArIHJldmlzaW9uICsgIikiOwkvLyBTdHJpbmcKKwkJfQorCX0KK30KKworZG9qby5ldmFsUHJvcCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gbmFtZSwgLypPYmplY3QqLyBvYmplY3QsIC8qQm9vbGVhbj8qLyBjcmVhdGUpeworCS8vIHN1bW1hcnk6IFJldHVybnMgJ29iamVjdFtuYW1lXScuICBJZiBub3QgZGVmaW5lZCBhbmQgJ2NyZWF0ZScgaXMgdHJ1ZSwgd2lsbCByZXR1cm4gYSBuZXcgT2JqZWN0LgorCS8vIGRlc2NyaXB0aW9uOgorCS8vCQlSZXR1cm5zIG51bGwgaWYgJ29iamVjdFtuYW1lXScgaXMgbm90IGRlZmluZWQgYW5kICdjcmVhdGUnIGlzIG5vdCB0cnVlLgorCS8vIAkJTm90ZTogJ2RlZmluZWQnIGFuZCAnZXhpc3RzJyBhcmUgbm90IHRoZSBzYW1lIGNvbmNlcHQuCisJaWYoKCFvYmplY3QpfHwoIW5hbWUpKSByZXR1cm4gdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQKKwlpZighZGpfdW5kZWYobmFtZSwgb2JqZWN0KSkgcmV0dXJuIG9iamVjdFtuYW1lXTsgLy8gbWl4ZWQKKwlyZXR1cm4gKGNyZWF0ZSA/IChvYmplY3RbbmFtZV09e30pIDogdW5kZWZpbmVkKTsJLy8gbWl4ZWQKK30KKworZG9qby5wYXJzZU9ialBhdGggPSBmdW5jdGlvbigvKlN0cmluZyovIHBhdGgsIC8qT2JqZWN0PyovIGNvbnRleHQsIC8qQm9vbGVhbj8qLyBjcmVhdGUpeworCS8vIHN1bW1hcnk6IFBhcnNlIHN0cmluZyBwYXRoIHRvIGFuIG9iamVjdCwgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIG9iamVjdCByZWZlcmVuY2UgYW5kIHByb3BlcnR5IG5hbWUuCisJLy8gZGVzY3JpcHRpb246CisJLy8JCVJldHVybnMgYW4gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXMsICdvYmonIGFuZCAncHJvcCcuCisJLy8JCSdvYmpbcHJvcF0nIGlzIHRoZSByZWZlcmVuY2UgaW5kaWNhdGVkIGJ5ICdwYXRoJy4KKwkvLyBwYXRoOiBQYXRoIHRvIGFuIG9iamVjdCwgaW4gdGhlIGZvcm0gIkEuQi5DIi4KKwkvLyBjb250ZXh0OiBPYmplY3QgdG8gdXNlIGFzIHJvb3Qgb2YgcGF0aC4gIERlZmF1bHRzIHRvICdkb2pvLmdsb2JhbCgpJy4KKwkvLyBjcmVhdGU6IElmIHRydWUsIE9iamVjdHMgd2lsbCBiZSBjcmVhdGVkIGF0IGFueSBwb2ludCBhbG9uZyB0aGUgJ3BhdGgnIHRoYXQgaXMgdW5kZWZpbmVkLgorCXZhciBvYmplY3QgPSAoY29udGV4dCB8fCBkb2pvLmdsb2JhbCgpKTsKKwl2YXIgbmFtZXMgPSBwYXRoLnNwbGl0KCcuJyk7CisJdmFyIHByb3AgPSBuYW1lcy5wb3AoKTsKKwlmb3IgKHZhciBpPTAsbD1uYW1lcy5sZW5ndGg7aTxsICYmIG9iamVjdDtpKyspeworCQlvYmplY3QgPSBkb2pvLmV2YWxQcm9wKG5hbWVzW2ldLCBvYmplY3QsIGNyZWF0ZSk7CisJfQorCXJldHVybiB7b2JqOiBvYmplY3QsIHByb3A6IHByb3B9OwkvLyBPYmplY3Q6IHtvYmo6IE9iamVjdCwgcHJvcDogU3RyaW5nfQorfQorCitkb2pvLmV2YWxPYmpQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqLyBwYXRoLCAvKkJvb2xlYW4/Ki8gY3JlYXRlKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdGhlIHZhbHVlIG9mIG9iamVjdCBhdCAncGF0aCcgaW4gdGhlIGdsb2JhbCBzY29wZSwgd2l0aG91dCB1c2luZyAnZXZhbCgpJy4KKwkvLyBwYXRoOiBQYXRoIHRvIGFuIG9iamVjdCwgaW4gdGhlIGZvcm0gIkEuQi5DIi4KKwkvLyBjcmVhdGU6IElmIHRydWUsIE9iamVjdHMgd2lsbCBiZSBjcmVhdGVkIGF0IGFueSBwb2ludCBhbG9uZyB0aGUgJ3BhdGgnIHRoYXQgaXMgdW5kZWZpbmVkLgorCWlmKHR5cGVvZiBwYXRoICE9ICJzdHJpbmciKXsKKwkJcmV0dXJuIGRvam8uZ2xvYmFsKCk7CisJfQorCS8vIGZhc3QgcGF0aCBmb3Igbm8gcGVyaW9kcworCWlmKHBhdGguaW5kZXhPZignLicpID09IC0xKXsKKwkJcmV0dXJuIGRvam8uZXZhbFByb3AocGF0aCwgZG9qby5nbG9iYWwoKSwgY3JlYXRlKTsJCS8vIG1peGVkCisJfQorCisJLy9NT1c6IG9sZCAnd2l0aCcgc3ludGF4IHdhcyBjb25mdXNpbmcgYW5kIHdvdWxkIHRocm93IGFuIGVycm9yIGlmIHBhcnNlT2JqUGF0aCByZXR1cm5lZCBudWxsLgorCXZhciByZWYgPSBkb2pvLnBhcnNlT2JqUGF0aChwYXRoLCBkb2pvLmdsb2JhbCgpLCBjcmVhdGUpOworCWlmKHJlZil7CisJCXJldHVybiBkb2pvLmV2YWxQcm9wKHJlZi5wcm9wLCByZWYub2JqLCBjcmVhdGUpOwkvLyBtaXhlZAorCX0KKwlyZXR1cm4gbnVsbDsKK30KKworZG9qby5lcnJvclRvU3RyaW5nID0gZnVuY3Rpb24oLypFcnJvciovIGV4Y2VwdGlvbil7CisJLy8gc3VtbWFyeTogUmV0dXJuIGFuIGV4Y2VwdGlvbidzICdtZXNzYWdlJywgJ2Rlc2NyaXB0aW9uJyBvciB0ZXh0LgorCisJLy8gVE9ETzogb3ZlcnJpZGluZyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgd29uJ3QgYWNjb21wbGlzaCB0aGlzPworIAkvLyAJCS4uLiBzaW5jZSBuYXRpdmVseSBnZW5lcmF0ZWQgRXJyb3Igb2JqZWN0cyBkbyBub3QgYWx3YXlzIHJlZmxlY3Qgc3VjaCB0aGluZ3M/CisJaWYoIWRqX3VuZGVmKCJtZXNzYWdlIiwgZXhjZXB0aW9uKSl7CisJCXJldHVybiBleGNlcHRpb24ubWVzc2FnZTsJCS8vIFN0cmluZworCX1lbHNlIGlmKCFkal91bmRlZigiZGVzY3JpcHRpb24iLCBleGNlcHRpb24pKXsKKwkJcmV0dXJuIGV4Y2VwdGlvbi5kZXNjcmlwdGlvbjsJLy8gU3RyaW5nCisJfWVsc2V7CisJCXJldHVybiBleGNlcHRpb247CQkJCS8vIEVycm9yCisJfQorfQorCitkb2pvLnJhaXNlID0gZnVuY3Rpb24oLypTdHJpbmcqLyBtZXNzYWdlLCAvKkVycm9yPyovIGV4Y2VwdGlvbil7CisJLy8gc3VtbWFyeTogQ29tbW9uIHBvaW50IGZvciByYWlzaW5nIGV4Y2VwdGlvbnMgaW4gRG9qbyB0byBlbmFibGUgbG9nZ2luZy4KKwkvLwlUaHJvd3MgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRleHQgb2YgJ2V4Y2VwdGlvbicgaWYgcHJvdmlkZWQsIG9yCisJLy8JcmV0aHJvd3MgZXhjZXB0aW9uIG9iamVjdC4KKworCWlmKGV4Y2VwdGlvbil7CisJCW1lc3NhZ2UgPSBtZXNzYWdlICsgIjogIitkb2pvLmVycm9yVG9TdHJpbmcoZXhjZXB0aW9uKTsKKwl9ZWxzZXsKKwkJbWVzc2FnZSA9IGRvam8uZXJyb3JUb1N0cmluZyhtZXNzYWdlKTsKKwl9CisKKwkvLyBwcmludCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBpZiBob3N0ZW52LnByaW50bG4gaXMgZGVmaW5lZAorCXRyeSB7IGlmKGRqQ29uZmlnLmlzRGVidWcpeyBkb2pvLmhvc3RlbnYucHJpbnRsbigiRkFUQUwgZXhjZXB0aW9uIHJhaXNlZDogIittZXNzYWdlKTsgfSB9IGNhdGNoIChlKSB7fQorCisJdGhyb3cgZXhjZXB0aW9uIHx8IEVycm9yKG1lc3NhZ2UpOworfQorCisvL1N0dWIgZnVuY3Rpb25zIHNvIHRoaW5ncyBkb24ndCBicmVhay4KKy8vVE9ET0M6ICBIT1cgVE8gRE9DIFRIRVNFPworZG9qby5kZWJ1ZyA9IGZ1bmN0aW9uKCl7fTsKK2Rvam8uZGVidWdTaGFsbG93ID0gZnVuY3Rpb24ob2JqKXt9OworZG9qby5wcm9maWxlID0geyBzdGFydDogZnVuY3Rpb24oKXt9LCBlbmQ6IGZ1bmN0aW9uKCl7fSwgc3RvcDogZnVuY3Rpb24oKXt9LCBkdW1wOiBmdW5jdGlvbigpe30gfTsKKworZnVuY3Rpb24gZGpfZXZhbCgvKlN0cmluZyovIHNjcmlwdEZyYWdtZW50KXsKKwkvLyBzdW1tYXJ5OiBQZXJmb3JtIGFuIGV2YWx1YXRpb24gaW4gdGhlIGdsb2JhbCBzY29wZS4gIFVzZSB0aGlzIHJhdGhlciB0aGFuIGNhbGxpbmcgJ2V2YWwoKScgZGlyZWN0bHkuCisJLy8gZGVzY3JpcHRpb246IFBsYWNlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIG1pbmltaXplIHNpemUgb2YgdHJhcHBlZCBldmFsdWF0aW9uIGNvbnRleHQuCisJLy8gbm90ZToKKwkvLwkgLSBKU0MgZXZhbCgpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aGljaCBjYW4gYmUgJ3Vuc2FmZScuCisJLy8JIC0gTW96aWxsYS9TcGlkZXJNb25rZXkgZXZhbCgpIHRha2VzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aGljaCBpcyB0aGUKKwkvLyAgCSBzY29wZSBvYmplY3QgZm9yIG5ldyBzeW1ib2xzLgorCXJldHVybiBkal9nbG9iYWwuZXZhbCA/IGRqX2dsb2JhbC5ldmFsKHNjcmlwdEZyYWdtZW50KSA6IGV2YWwoc2NyaXB0RnJhZ21lbnQpOyAJLy8gbWl4ZWQKK30KKworZG9qby51bmltcGxlbWVudGVkID0gZnVuY3Rpb24oLypTdHJpbmcqLyBmdW5jbmFtZSwgLypTdHJpbmc/Ki8gZXh0cmEpeworCS8vIHN1bW1hcnk6IFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHNvbWUgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkLgorCS8vIGV4dHJhOiBUZXh0IHRvIGFwcGVuZCB0byB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisJdmFyIG1lc3NhZ2UgPSAiJyIgKyBmdW5jbmFtZSArICInIG5vdCBpbXBsZW1lbnRlZCI7CisJaWYgKGV4dHJhICE9IG51bGwpIHsgbWVzc2FnZSArPSAiICIgKyBleHRyYTsgfQorCWRvam8ucmFpc2UobWVzc2FnZSk7Cit9CisKK2Rvam8uZGVwcmVjYXRlZCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gYmVoYXZpb3VyLCAvKlN0cmluZz8qLyBleHRyYSwgLypTdHJpbmc/Ki8gcmVtb3ZhbCl7CisJLy8gc3VtbWFyeTogTG9nIGEgZGVidWcgbWVzc2FnZSB0byBpbmRpY2F0ZSB0aGF0IGEgYmVoYXZpb3IgaGFzIGJlZW4gZGVwcmVjYXRlZC4KKwkvLyBleHRyYTogVGV4dCB0byBhcHBlbmQgdG8gdGhlIG1lc3NhZ2UuCisJLy8gcmVtb3ZhbDogVGV4dCB0byBpbmRpY2F0ZSB3aGVuIGluIHRoZSBmdXR1cmUgdGhlIGJlaGF2aW9yIHdpbGwgYmUgcmVtb3ZlZC4KKwl2YXIgbWVzc2FnZSA9ICJERVBSRUNBVEVEOiAiICsgYmVoYXZpb3VyOworCWlmKGV4dHJhKXsgbWVzc2FnZSArPSAiICIgKyBleHRyYTsgfQorCWlmKHJlbW92YWwpeyBtZXNzYWdlICs9ICIgLS0gd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb246ICIgKyByZW1vdmFsOyB9CisJZG9qby5kZWJ1ZyhtZXNzYWdlKTsKK30KKworZG9qby5yZW5kZXIgPSAoZnVuY3Rpb24oKXsKKwkvL1RPRE9DOiBIT1cgVE8gRE9DIFRISVM/CisJLy8gc3VtbWFyeTogRGV0YWlscyByZW5kZXJpbmcgc3VwcG9ydCwgT1MgYW5kIGJyb3dzZXIgb2YgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCisJLy8gVE9ET0M6IGlzIHRoaXMgc29tZXRoaW5nIG1hbnkgZm9sa3Mgd2lsbCBpbnRlcmFjdCB3aXRoPyAgSWYgc28sIHdlIHNob3VsZCBkb2MgdGhlIHN0cnVjdHVyZSBjcmVhdGVkLi4uCisJZnVuY3Rpb24gdnNjYWZmb2xkKHByZWZzLCBuYW1lcyl7CisJCXZhciB0bXAgPSB7CisJCQljYXBhYmxlOiBmYWxzZSwKKwkJCXN1cHBvcnQ6IHsKKwkJCQlidWlsdGluOiBmYWxzZSwKKwkJCQlwbHVnaW46IGZhbHNlCisJCQl9LAorCQkJcHJlZml4ZXM6IHByZWZzCisJCX07CisJCWZvcih2YXIgaT0wOyBpPG5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCXRtcFtuYW1lc1tpXV0gPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdG1wOworCX0KKworCXJldHVybiB7CisJCW5hbWU6ICIiLAorCQl2ZXI6IGRvam8udmVyc2lvbiwKKwkJb3M6IHsgd2luOiBmYWxzZSwgbGludXg6IGZhbHNlLCBvc3g6IGZhbHNlIH0sCisJCWh0bWw6IHZzY2FmZm9sZChbImh0bWwiXSwgWyJpZSIsICJvcGVyYSIsICJraHRtbCIsICJzYWZhcmkiLCAibW96Il0pLAorCQlzdmc6IHZzY2FmZm9sZChbInN2ZyJdLCBbImNvcmVsIiwgImFkb2JlIiwgImJhdGlrIl0pLAorCQl2bWw6IHZzY2FmZm9sZChbInZtbCJdLCBbImllIl0pLAorCQlzd2Y6IHZzY2FmZm9sZChbIlN3ZiIsICJGbGFzaCIsICJNbSJdLCBbIm1tIl0pLAorCQlzd3Q6IHZzY2FmZm9sZChbIlN3dCJdLCBbImlibSJdKQorCX07Cit9KSgpOworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkb2pvLmhvc3RlbnYgbWV0aG9kcyB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiBob3N0ZW52XyouanMKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIGRlZmluaW5pbmcgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIEVjbWFTY3JpcHQgaG9zdCBlbnZpcm9ubWVudC4KKyovCisKKy8qCisgKiBOb25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGxpYnJhcnkgdXNlcnMuCisgKiBJbnN0ZWFkIHB1YmxpYyBtZXRob2RzIHN1Y2ggYXMgbG9hZE1vZHVsZSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQuCisgKi8KK2Rvam8uaG9zdGVudiA9IChmdW5jdGlvbigpeworCS8vIFRPRE9DOiAgSE9XIFRPIERPQyBUSElTPworCS8vIHN1bW1hcnk6IFByb3ZpZGVzIGVuY2Fwc3VsYXRpb24gb2YgYmVoYXZpb3IgdGhhdCBjaGFuZ2VzIGFjcm9zcyBkaWZmZXJlbnQgJ2hvc3QgZW52aXJvbm1lbnRzJworCS8vCQkJKGRpZmZlcmVudCBicm93c2Vycywgc2VydmVyIHZpYSBSaGlubywgZXRjKS4KKwkvLyBkZXNjcmlwdGlvbjogTm9uZSBvZiB0aGVzZSBtZXRob2RzIHNob3VsZCBldmVyIGJlIGNhbGxlZCBkaXJlY3RseSBieSBsaWJyYXJ5IHVzZXJzLgorCS8vCQkJCVVzZSBwdWJsaWMgbWV0aG9kcyBzdWNoIGFzICdsb2FkTW9kdWxlJyBpbnN0ZWFkLgorCisJLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKwl2YXIgY29uZmlnID0geworCQlpc0RlYnVnOiBmYWxzZSwKKwkJYWxsb3dRdWVyeUNvbmZpZzogZmFsc2UsCisJCWJhc2VTY3JpcHRVcmk6ICIiLAorCQliYXNlUmVsYXRpdmVQYXRoOiAiIiwKKwkJbGlicmFyeVNjcmlwdFVyaTogIiIsCisJCWllUHJldmVudENsb2JiZXI6IGZhbHNlLAorCQlpZUNsb2JiZXJNaW5pbWFsOiB0cnVlLAorCQlwcmV2ZW50QmFja0J1dHRvbkZpeDogdHJ1ZSwKKwkJZGVsYXlNb3pMb2FkaW5nRml4OiBmYWxzZSwKKwkJc2VhcmNoSWRzOiBbXSwKKwkJcGFyc2VXaWRnZXRzOiB0cnVlCisJfTsKKworCWlmICh0eXBlb2YgZGpDb25maWcgPT0gInVuZGVmaW5lZCIpIHsgZGpDb25maWcgPSBjb25maWc7IH0KKwllbHNlIHsKKwkJZm9yICh2YXIgb3B0aW9uIGluIGNvbmZpZykgeworCQkJaWYgKHR5cGVvZiBkakNvbmZpZ1tvcHRpb25dID09ICJ1bmRlZmluZWQiKSB7CisJCQkJZGpDb25maWdbb3B0aW9uXSA9IGNvbmZpZ1tvcHRpb25dOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHsKKwkJbmFtZV86ICcodW5zZXQpJywKKwkJdmVyc2lvbl86ICcodW5zZXQpJywKKworCisJCWdldE5hbWU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1hcnk6IFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaG9zdCBlbnZpcm9ubWVudC4KKwkJCXJldHVybiB0aGlzLm5hbWVfOyAJLy8gU3RyaW5nCisJCX0sCisKKworCQlnZXRWZXJzaW9uOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBob3N0ZW52LgorCQkJcmV0dXJuIHRoaXMudmVyc2lvbl87IC8vIFN0cmluZworCQl9LAorCisJCWdldFRleHQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdXJpKXsKKwkJCS8vIHN1bW1hcnk6CVJlYWQgdGhlIHBsYWluL3RleHQgY29udGVudHMgYXQgdGhlIHNwZWNpZmllZCAndXJpJy4KKwkJCS8vIGRlc2NyaXB0aW9uOgorCQkJLy8JCQlJZiAnZ2V0VGV4dCgpJyBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIG92ZXJyaWRlCisJCQkvLwkJCSdsb2FkVXJpKCknIHdpdGggYW4gaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IHJlbHkgb24gaXQuCisKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgnZ2V0VGV4dCcsICJ1cmk9IiArIHVyaSk7CisJCX0KKwl9OworfSkoKTsKKworCitkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeTogUmV0dXJuIHRoZSBiYXNlIHNjcmlwdCB1cmkgdGhhdCBvdGhlciBzY3JpcHRzIGFyZSBmb3VuZCByZWxhdGl2ZSB0by4KKwkvLyBUT0RPQzogSFVIPyAgVGhpcyBjb21tZW50IG1lYW5zIG5vdGhpbmcgdG8gbWUuICBXaGF0IG90aGVyIHNjcmlwdHM/IElzIHRoaXMgdGhlIHBhdGggdG8gb3RoZXIgZG9qbyBsaWJyYXJpZXM/CisJLy8JCU1BWUJFOiAgUmV0dXJuIHRoZSBiYXNlIHVyaSB0byBzY3JpcHRzIGluIHRoZSBkb2pvIGxpYnJhcnkuCSA/Pz8KKwkvLyByZXR1cm46IEVtcHR5IHN0cmluZyBvciBhIHBhdGggZW5kaW5nIGluICcvJy4KKwlpZihkakNvbmZpZy5iYXNlU2NyaXB0VXJpLmxlbmd0aCl7CisJCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOworCX0KKworCS8vIE1PVzogV2h5IG5vdDoKKwkvLwkJCXVyaSA9IGRqQ29uZmlnLmxpYnJhcnlTY3JpcHRVcmkgfHwgZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aAorCS8vCQk/Pz8gV2h5ICduZXcgU3RyaW5nKC4uLiknCisJdmFyIHVyaSA9IG5ldyBTdHJpbmcoZGpDb25maWcubGlicmFyeVNjcmlwdFVyaXx8ZGpDb25maWcuYmFzZVJlbGF0aXZlUGF0aCk7CisJaWYgKCF1cmkpIHsgZG9qby5yYWlzZSgiTm90aGluZyByZXR1cm5lZCBieSBnZXRMaWJyYXJ5U2NyaXB0VXJpKCk6ICIgKyB1cmkpOyB9CisKKwkvLyBNT1c6IHVyaSBzZWVtcyB0byBub3QgYmUgYWN0dWFsbHkgdXNlZC4gIFNlZW1zIHRvIGJlIGhhcmQtY29kaW5nIHRvIGRqQ29uZmlnLmJhc2VSZWxhdGl2ZVBhdGguLi4gPz8/CisJdmFyIGxhc3RzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwkJLy8gTU9XID8/PworCWRqQ29uZmlnLmJhc2VTY3JpcHRVcmkgPSBkakNvbmZpZy5iYXNlUmVsYXRpdmVQYXRoOworCXJldHVybiBkakNvbmZpZy5iYXNlU2NyaXB0VXJpOwkvLyBTdHJpbmcKK30KKworLyoKKyAqIGxvYWRlci5qcyAtIEEgYm9vdHN0cmFwIG1vZHVsZS4gIFJ1bnMgYmVmb3JlIHRoZSBob3N0ZW52XyouanMgZmlsZS4gQ29udGFpbnMgYWxsIG9mIHRoZSBwYWNrYWdlIGxvYWRpbmcgbWV0aG9kcy4KKyAqLworCisvL0Egc2VtaS1jb2xvbiBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYmVjYXVzZSBhZnRlciBkb2luZyBhIGJ1aWxkLCB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24KKy8vZ2V0IGNvbXByZXNzZWQgb250byB0aGUgc2FtZSBsaW5lIGFzIHRoZSBsYXN0IGxpbmUgaW4gYm9vdHN0cmFwMS5qcy4gVGhhdCBsaXN0IGxpbmUgaXMganVzdCBhCisvL2N1cmx5IGJyYWNrZXQsIGFuZCB0aGUgYnJvd3NlciBjb21wbGFpbnMgYWJvdXQgdGhhdCBzeW50YXguIFRoZSBzZW1pY29sb24gZml4ZXMgaXQuIFB1dHRpbmcgaXQKKy8vaGVyZSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgb2YgYm9vdHN0cmFwMS5qcywgc2luY2UgaXQgaXMgbW9yZSBvZiBhbiBpc3N1ZSBmb3IgdGhpcyBmaWxlLCAodXNpbmcKKy8vdGhlIGNsb3N1cmUpLCBhbmQgYm9vdHN0cmFwMS5qcyBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKzsoZnVuY3Rpb24oKXsKKwkvL0FkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgZG9qby5ob3N0ZW52CisJdmFyIF9hZGRIb3N0RW52ID0geworCQlwa2dGaWxlTmFtZTogIl9fcGFja2FnZV9fIiwKKwkKKwkJLy8gZm9yIHJlY3Vyc2lvbiBwcm90ZWN0aW9uCisJCWxvYWRpbmdfbW9kdWxlc186IHt9LAorCQlsb2FkZWRfbW9kdWxlc186IHt9LAorCQlhZGRlZFRvTG9hZGluZ0NvdW50OiBbXSwKKwkJcmVtb3ZlZEZyb21Mb2FkaW5nQ291bnQ6IFtdLAorCQorCQlpbkZsaWdodENvdW50OiAwLAorCQorCQkvLyBGSVhNRTogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHB1bGwgbW9kdWxlIHByZWZpeGVzIGluIGZyb20gZGpDb25maWcKKwkJbW9kdWxlUHJlZml4ZXNfOiB7CisJCQlkb2pvOiB7bmFtZTogImRvam8iLCB2YWx1ZTogInNyYyJ9CisJCX0sCisKKwkJc2V0TW9kdWxlUHJlZml4OiBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlLCAvKlN0cmluZyovcHJlZml4KXsKKwkJCS8vIHN1bW1hcnk6IGVzdGFibGlzaGVzIG1vZHVsZS9wcmVmaXggcGFpcgorCQkJdGhpcy5tb2R1bGVQcmVmaXhlc19bbW9kdWxlXSA9IHtuYW1lOiBtb2R1bGUsIHZhbHVlOiBwcmVmaXh9OworCQl9LAorCisJCW1vZHVsZUhhc1ByZWZpeDogZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSl7CisJCQkvLyBzdW1tYXJ5OiBjaGVja3MgdG8gc2VlIGlmIG1vZHVsZSBoYXMgYmVlbiBlc3RhYmxpc2hlZAorCQkJdmFyIG1wID0gdGhpcy5tb2R1bGVQcmVmaXhlc187CisJCQlyZXR1cm4gQm9vbGVhbihtcFttb2R1bGVdICYmIG1wW21vZHVsZV0udmFsdWUpOyAvLyBCb29sZWFuCisJCX0sCisKKwkJZ2V0TW9kdWxlUHJlZml4OiBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlKXsKKwkJCS8vIHN1bW1hcnk6IGdldHMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggbW9kdWxlCisJCQlpZih0aGlzLm1vZHVsZUhhc1ByZWZpeChtb2R1bGUpKXsKKwkJCQlyZXR1cm4gdGhpcy5tb2R1bGVQcmVmaXhlc19bbW9kdWxlXS52YWx1ZTsgLy8gU3RyaW5nCisJCQl9CisJCQlyZXR1cm4gbW9kdWxlOyAvLyBTdHJpbmcKKwkJfSwKKworCQlnZXRUZXh0U3RhY2s6IFtdLAorCQlsb2FkVXJpU3RhY2s6IFtdLAorCQlsb2FkZWRVcmlzOiBbXSwKKwkKKwkJLy9XQVJOSU5HOiBUaGlzIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgYnkgcGFja2FnZXMgb3V0c2lkZSBvZiBib290c3RyYXA6IEZsb2F0aW5nUGFuZS5qcyBhbmQgdW5kby9icm93c2VyLmpzCisJCXBvc3RfbG9hZF86IGZhbHNlLAorCQkKKwkJLy9FZ2FkISBMb3RzIG9mIHRlc3QgZmlsZXMgcHVzaCBvbiB0aGlzIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgZG9qby5hZGRPbkxvYWQuCisJCW1vZHVsZXNMb2FkZWRMaXN0ZW5lcnM6IFtdLAorCQl1bmxvYWRMaXN0ZW5lcnM6IFtdLAorCQlsb2FkTm90aWZ5aW5nOiBmYWxzZQorCX07CisJCisJLy9BZGQgYWxsIG9mIHRoZXNlIHByb3BlcnRpZXMgdG8gZG9qby5ob3N0ZW52CisJZm9yKHZhciBwYXJhbSBpbiBfYWRkSG9zdEVudil7CisJCWRvam8uaG9zdGVudltwYXJhbV0gPSBfYWRkSG9zdEVudltwYXJhbV07CisJfQorfSkoKTsKKworZG9qby5ob3N0ZW52LmxvYWRQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqL3JlbHBhdGgsIC8qU3RyaW5nPyovbW9kdWxlLCAvKkZ1bmN0aW9uPyovY2IpeworLy8gc3VtbWFyeToKKy8vCUxvYWQgYSBKYXZhc2NyaXB0IG1vZHVsZSBnaXZlbiBhIHJlbGF0aXZlIHBhdGgKKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCUxvYWRzIGFuZCBpbnRlcnByZXRzIHRoZSBzY3JpcHQgbG9jYXRlZCBhdCByZWxwYXRoLCB3aGljaCBpcyByZWxhdGl2ZSB0byB0aGUKKy8vCXNjcmlwdCByb290IGRpcmVjdG9yeS4gIElmIHRoZSBzY3JpcHQgaXMgZm91bmQgYnV0IGl0cyBpbnRlcnByZXRhdGlvbiBjYXVzZXMKKy8vCWEgcnVudGltZSBleGNlcHRpb24sIHRoYXQgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgdXMsIHNvIHRoZSBjYWxsZXIgd2lsbAorLy8Jc2VlIGl0LiAgV2UgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBhbmQgb25seSBpZiB0aGUgc2NyaXB0IGlzIGZvdW5kLgorLy8KKy8vCUZvciBub3csIHdlIGRvIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgdHJ1ZSBzZWFyY2ggcGF0aC4gIFdlCisvLwljb25zaWRlciBvbmx5IHRoZSBzaW5nbGUgYmFzZSBzY3JpcHQgdXJpLCBhcyByZXR1cm5lZCBieSBnZXRCYXNlU2NyaXB0VXJpKCkuCisvLworLy8gcmVscGF0aDogQSByZWxhdGl2ZSBwYXRoIHRvIGEgc2NyaXB0IChubyBsZWFkaW5nICcvJywgYW5kIHR5cGljYWxseQorLy8gCWVuZGluZyBpbiAnLmpzJykuCisvLyBtb2R1bGU6IEEgbW9kdWxlIHdob3NlIGV4aXN0YW5jZSB0byBjaGVjayBmb3IgYWZ0ZXIgbG9hZGluZyBhIHBhdGguCisvLwlDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBsb2FkLgorLy8gY2I6IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcGFzcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNjcmlwdAorCisJdmFyIHVyaTsKKwlpZihyZWxwYXRoLmNoYXJBdCgwKSA9PSAnLycgfHwgcmVscGF0aC5tYXRjaCgvXlx3KzovKSl7CisJCS8vIGRvam8ucmFpc2UoInJlbHBhdGggJyIgKyByZWxwYXRoICsgIic7IG11c3QgYmUgcmVsYXRpdmUiKTsKKwkJdXJpID0gcmVscGF0aDsKKwl9ZWxzZXsKKwkJdXJpID0gdGhpcy5nZXRCYXNlU2NyaXB0VXJpKCkgKyByZWxwYXRoOworCX0KKwlpZihkakNvbmZpZy5jYWNoZUJ1c3QgJiYgZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKXsKKwkJdXJpICs9ICI/IiArIFN0cmluZyhkakNvbmZpZy5jYWNoZUJ1c3QpLnJlcGxhY2UoL1xXKy9nLCIiKTsKKwl9CisJdHJ5eworCQlyZXR1cm4gIW1vZHVsZSA/IHRoaXMubG9hZFVyaSh1cmksIGNiKSA6IHRoaXMubG9hZFVyaUFuZENoZWNrKHVyaSwgbW9kdWxlLCBjYik7IC8vIEJvb2xlYW4KKwl9Y2F0Y2goZSl7CisJCWRvam8uZGVidWcoZSk7CisJCXJldHVybiBmYWxzZTsgLy8gQm9vbGVhbgorCX0KK30KKworZG9qby5ob3N0ZW52LmxvYWRVcmkgPSBmdW5jdGlvbigvKlN0cmluZyAoVVJMKSovdXJpLCAvKkZ1bmN0aW9uPyovY2IpeworLy8gc3VtbWFyeToKKy8vCUxvYWRzIEphdmFTY3JpcHQgZnJvbSBhIFVSSQorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8JUmVhZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkksIGFuZCBldmFsdWF0ZXMgdGhlIGNvbnRlbnRzLiAgVGhpcyBpcyB1c2VkIHRvIGxvYWQgbW9kdWxlcyBhcyB3ZWxsCisvLwlhcyByZXNvdXJjZSBidW5kbGVzLiAgUmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgVVJJIHJlYWRpbmcgZmFpbGVkLgorLy8JVGhyb3dzIGlmIHRoZSBldmFsdWF0aW9uIHRocm93cy4KKy8vCisvLyB1cmk6IGEgdXJpIHdoaWNoIHBvaW50cyBhdCB0aGUgc2NyaXB0IHRvIGJlIGxvYWRlZAorLy8gY2I6IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNjcmlwdCBhcyBhbiBleHByZXNzaW9uLCB0eXBpY2FsbHkKKy8vCXVzZWQgYnkgdGhlIHJlc291cmNlIGJ1bmRsZSBsb2FkZXIgdG8gbG9hZCBKU09OLXN0eWxlIHJlc291cmNlcworCisJaWYodGhpcy5sb2FkZWRVcmlzW3VyaV0peworCQlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorCX0KKwl2YXIgY29udGVudHMgPSB0aGlzLmdldFRleHQodXJpLCBudWxsLCB0cnVlKTsKKwlpZighY29udGVudHMpeyByZXR1cm4gZmFsc2U7IH0gLy8gQm9vbGVhbgorCXRoaXMubG9hZGVkVXJpc1t1cmldID0gdHJ1ZTsKKwlpZihjYil7IGNvbnRlbnRzID0gJygnK2NvbnRlbnRzKycpJzsgfQorCXZhciB2YWx1ZSA9IGRqX2V2YWwoY29udGVudHMpOworCWlmKGNiKXsgY2IodmFsdWUpOyB9CisJcmV0dXJuIHRydWU7IC8vIEJvb2xlYW4KK30KKworLy8gRklYTUU6IHByb2JhYmx5IG5lZWQgdG8gYWRkIGxvZ2dpbmcgdG8gdGhpcyBtZXRob2QKK2Rvam8uaG9zdGVudi5sb2FkVXJpQW5kQ2hlY2sgPSBmdW5jdGlvbigvKlN0cmluZyAoVVJMKSovdXJpLCAvKlN0cmluZyovbW9kdWxlTmFtZSwgLypGdW5jdGlvbj8qL2NiKXsKKwkvLyBzdW1tYXJ5OiBjYWxscyBsb2FkVXJpIHRoZW4gZmluZE1vZHVsZSBhbmQgcmV0dXJucyB0cnVlIGlmIGJvdGggc3VjY2VlZAorCXZhciBvayA9IHRydWU7CisJdHJ5eworCQlvayA9IHRoaXMubG9hZFVyaSh1cmksIGNiKTsKKwl9Y2F0Y2goZSl7CisJCWRvam8uZGVidWcoImZhaWxlZCBsb2FkaW5nICIsIHVyaSwgIiB3aXRoIGVycm9yOiAiLCBlKTsKKwl9CisJcmV0dXJuIEJvb2xlYW4ob2sgJiYgdGhpcy5maW5kTW9kdWxlKG1vZHVsZU5hbWUsIGZhbHNlKSk7IC8vIEJvb2xlYW4KK30KKworZG9qby5sb2FkZWQgPSBmdW5jdGlvbigpeyB9Citkb2pvLnVubG9hZGVkID0gZnVuY3Rpb24oKXsgfQorCitkb2pvLmhvc3RlbnYubG9hZGVkID0gZnVuY3Rpb24oKXsKKwl0aGlzLmxvYWROb3RpZnlpbmcgPSB0cnVlOworCXRoaXMucG9zdF9sb2FkXyA9IHRydWU7CisJdmFyIG1sbCA9IHRoaXMubW9kdWxlc0xvYWRlZExpc3RlbmVyczsKKwlmb3IodmFyIHg9MDsgeDxtbGwubGVuZ3RoOyB4KyspeworCQltbGxbeF0oKTsKKwl9CisKKwkvL0NsZWFyIGxpc3RlbmVycyBzbyBuZXcgb25lcyBjYW4gYmUgYWRkZWQKKwkvL0ZvciBvdGhlciB4ZG9tYWluIHBhY2thZ2UgbG9hZHMgYWZ0ZXIgdGhlIGluaXRpYWwgbG9hZC4KKwl0aGlzLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMgPSBbXTsKKwl0aGlzLmxvYWROb3RpZnlpbmcgPSBmYWxzZTsKKworCWRvam8ubG9hZGVkKCk7Cit9CisKK2Rvam8uaG9zdGVudi51bmxvYWRlZCA9IGZ1bmN0aW9uKCl7CisJdmFyIG1sbCA9IHRoaXMudW5sb2FkTGlzdGVuZXJzOworCXdoaWxlKG1sbC5sZW5ndGgpeworCQkobWxsLnBvcCgpKSgpOworCX0KKwlkb2pvLnVubG9hZGVkKCk7Cit9CisKK2Rvam8uYWRkT25Mb2FkID0gZnVuY3Rpb24oLypPYmplY3Q/Ki9vYmosIC8qU3RyaW5nfEZ1bmN0aW9uKi9mdW5jdGlvbk5hbWUpIHsKKy8vIHN1bW1hcnk6CisvLwlSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIERPTSBoYXMgZmluaXNoZWQgbG9hZGluZyAKKy8vCWFuZCB3aWRnZXRzIGRlY2xhcmVkIGluIG1hcmt1cCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLiAgSW1hZ2VzIGFuZCBDU1MgZmlsZXMKKy8vCW1heSBvciBtYXkgbm90IGhhdmUgZmluaXNoZWQgZG93bmxvYWRpbmcgd2hlbiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKy8vCShOb3RlIHRoYXQgd2lkZ2V0cycgQ1NTIGFuZCBIVE1MIGNvZGUgaXMgZ3VhcmFudGVlZCB0byBiZSBkb3dubG9hZGVkIGJlZm9yZSBzYWlkCisvLwl3aWRnZXRzIGFyZSBpbnN0YW50aWF0ZWQuKQorLy8KKy8vIHVzYWdlOgorLy8JZG9qby5hZGRPbkxvYWQoZnVuY3Rpb25Qb2ludGVyKQorLy8JZG9qby5hZGRPbkxvYWQob2JqZWN0LCAiZnVuY3Rpb25OYW1lIikKKworCXZhciBkaCA9IGRvam8uaG9zdGVudjsKKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKwkJZGgubW9kdWxlc0xvYWRlZExpc3RlbmVycy5wdXNoKG9iaik7CisJfSBlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCWRoLm1vZHVsZXNMb2FkZWRMaXN0ZW5lcnMucHVzaChmdW5jdGlvbigpIHsKKwkJCW9ialtmdW5jdGlvbk5hbWVdKCk7CisJCX0pOworCX0KKworCS8vQWRkZWQgZm9yIHhkb21haW4gbG9hZGluZy4gZG9qby5hZGRPbkxvYWQgaXMgdXNlZCB0bworCS8vaW5kaWNhdGUgY2FsbGJhY2tzIGFmdGVyIGRvaW5nIHNvbWUgZG9qby5yZXF1aXJlKCkgc3RhdGVtZW50cy4KKwkvL0luIHRoZSB4ZG9tYWluIGNhc2UsIGlmIGFsbCB0aGUgcmVxdWlyZXMgYXJlIGxvYWRlZCAoYWZ0ZXIgaW5pdGlhbAorCS8vcGFnZSBsb2FkKSwgdGhlbiBpbW1lZGlhdGVseSBjYWxsIGFueSBsaXN0ZW5lcnMuCisJaWYoZGgucG9zdF9sb2FkXyAmJiBkaC5pbkZsaWdodENvdW50ID09IDAgJiYgIWRoLmxvYWROb3RpZnlpbmcpeworCQlkaC5jYWxsTG9hZGVkKCk7CisJfQorfQorCitkb2pvLmFkZE9uVW5sb2FkID0gZnVuY3Rpb24oLypPYmplY3Q/Ki9vYmosIC8qU3RyaW5nfEZ1bmN0aW9uPyovZnVuY3Rpb25OYW1lKXsKKy8vIHN1bW1hcnk6IHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBwYWdlIHVubG9hZHMKKy8vCisvLyB1c2FnZToKKy8vCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uUG9pbnRlcikKKy8vCWRvam8uYWRkT25Mb2FkKG9iamVjdCwgImZ1bmN0aW9uTmFtZSIpCisJdmFyIGRoID0gZG9qby5ob3N0ZW52OworCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSl7CisJCWRoLnVubG9hZExpc3RlbmVycy5wdXNoKG9iaik7CisJfSBlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisJCWRoLnVubG9hZExpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCkgeworCQkJb2JqW2Z1bmN0aW9uTmFtZV0oKTsKKwkJfSk7CisJfQorfQorCitkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCA9IGZ1bmN0aW9uKCl7CisJaWYodGhpcy5wb3N0X2xvYWRfKXsgcmV0dXJuOyB9CisJaWYodGhpcy5sb2FkVXJpU3RhY2subGVuZ3RoPT0wICYmIHRoaXMuZ2V0VGV4dFN0YWNrLmxlbmd0aD09MCl7CisJCWlmKHRoaXMuaW5GbGlnaHRDb3VudCA+IDApeyAKKwkJCWRvam8uZGVidWcoImZpbGVzIHN0aWxsIGluIGZsaWdodCEiKTsKKwkJCXJldHVybjsKKwkJfQorCQlkb2pvLmhvc3RlbnYuY2FsbExvYWRlZCgpOworCX0KK30KKworZG9qby5ob3N0ZW52LmNhbGxMb2FkZWQgPSBmdW5jdGlvbigpeworCS8vVGhlICJvYmplY3QiIGNoZWNrIGlzIGZvciBJRSwgYW5kIHRoZSBvdGhlciBvcGVyYSBjaGVjayBmaXhlcyBhbiBpc3N1ZQorCS8vaW4gT3BlcmEgd2hlcmUgaXQgY291bGQgbm90IGZpbmQgdGhlIGJvZHkgZWxlbWVudCBpbiBzb21lIHdpZGdldCB0ZXN0IGNhc2VzLgorCS8vRm9yIDAuOSwgbWF5YmUgcm91dGUgYWxsIGJyb3dzZXJzIHRocm91Z2ggdGhlIHNldFRpbWVvdXQgKG5lZWQgcHJvdGVjdGlvbgorCS8vc3RpbGwgZm9yIG5vbi1icm93c2VyIGVudmlyb25tZW50cyB0aG91Z2gpLiBUaGlzIG1pZ2h0IGFsc28gaGVscCB0aGUgaXNzdWUgd2l0aAorCS8vRkYgMi4wIGFuZCBmcmVlemluZyBpc3N1ZXMgd2hlcmUgd2UgdHJ5IHRvIGRvIHN5bmMgeGhyIHdoaWxlIGJhY2tncm91bmQgY3NzIGltYWdlcworCS8vYXJlIGJlaW5nIGxvYWRlZCAodHJhYyAjMjU3Mik/IENvbnNpZGVyIGZvciAwLjkuCisJaWYodHlwZW9mIHNldFRpbWVvdXQgPT0gIm9iamVjdCIgfHwgKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gJiYgZG9qby5yZW5kZXIuaHRtbC5vcGVyYSkpeworCQlzZXRUaW1lb3V0KCJkb2pvLmhvc3RlbnYubG9hZGVkKCk7IiwgMCk7CisJfWVsc2V7CisJCWRvam8uaG9zdGVudi5sb2FkZWQoKTsKKwl9Cit9CisKK2Rvam8uaG9zdGVudi5nZXRNb2R1bGVTeW1ib2xzID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZW5hbWUpeworLy8gc3VtbWFyeToKKy8vCUNvbnZlcnRzIGEgbW9kdWxlIG5hbWUgaW4gZG90dGVkIEpTIG5vdGF0aW9uIHRvIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGF0aCBpbiB0aGUgc291cmNlIHRyZWUKKwl2YXIgc3ltcyA9IG1vZHVsZW5hbWUuc3BsaXQoIi4iKTsKKwlmb3IodmFyIGkgPSBzeW1zLmxlbmd0aDsgaT4wOyBpLS0peworCQl2YXIgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCIuIik7CisJCWlmKChpPT0xKSAmJiAhdGhpcy5tb2R1bGVIYXNQcmVmaXgocGFyZW50TW9kdWxlKSl7CQkKKwkJCS8vIFN1cHBvcnQgZGVmYXVsdCBtb2R1bGUgZGlyZWN0b3J5IChzaWJsaW5nIG9mIGRvam8pIGZvciB0b3AtbGV2ZWwgbW9kdWxlcyAKKwkJCXN5bXNbMF0gPSAiLi4vIiArIHN5bXNbMF07CisJCX1lbHNleworCQkJdmFyIHBhcmVudE1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVByZWZpeChwYXJlbnRNb2R1bGUpOworCQkJaWYocGFyZW50TW9kdWxlUGF0aCAhPSBwYXJlbnRNb2R1bGUpeworCQkJCXN5bXMuc3BsaWNlKDAsIGksIHBhcmVudE1vZHVsZVBhdGgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBzeW1zOyAvLyBBcnJheQorfQorCitkb2pvLmhvc3RlbnYuX2dsb2JhbF9vbWl0X21vZHVsZV9jaGVjayA9IGZhbHNlOworZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUgPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypCb29sZWFuPyovZXhhY3RPbmx5LCAvKkJvb2xlYW4/Ki9vbWl0TW9kdWxlQ2hlY2speworLy8gc3VtbWFyeToKKy8vCWxvYWRzIGEgSmF2YXNjcmlwdCBtb2R1bGUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgVVJJCisvLworLy8gZGVzY3JpcHRpb246CisvLwlsb2FkTW9kdWxlKCJBLkIiKSBmaXJzdCBjaGVja3MgdG8gc2VlIGlmIHN5bWJvbCBBLkIgaXMgZGVmaW5lZC4gCisvLwlJZiBpdCBpcywgaXQgaXMgc2ltcGx5IHJldHVybmVkIChub3RoaW5nIHRvIGRvKS4KKy8vCQorLy8JSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IHdpbGwgbG9vayBmb3IgIkEvQi5qcyIgaW4gdGhlIHNjcmlwdCByb290IGRpcmVjdG9yeSwKKy8vCWZvbGxvd2VkIGJ5ICJBLmpzIi4KKy8vCQorLy8JSXQgdGhyb3dzIGlmIGl0IGNhbm5vdCBmaW5kIGEgZmlsZSB0byBsb2FkLCBvciBpZiB0aGUgc3ltYm9sIEEuQiBpcyBub3QKKy8vCWRlZmluZWQgYWZ0ZXIgbG9hZGluZy4KKy8vCQorLy8JSXQgcmV0dXJucyB0aGUgb2JqZWN0IEEuQi4KKy8vCQorLy8JVGhpcyBkb2VzIG5vdGhpbmcgYWJvdXQgaW1wb3J0aW5nIHN5bWJvbHMgaW50byB0aGUgY3VycmVudCBwYWNrYWdlLgorLy8JSXQgaXMgcHJlc3VtZWQgdGhhdCB0aGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoYXQuIEZvciBleGFtcGxlLCB0byBpbXBvcnQKKy8vCWFsbCBzeW1ib2xzOgorLy8JCisvLwkgICB3aXRoIChkb2pvLmhvc3RlbnYubG9hZE1vZHVsZSgiQS5CIikpIHsKKy8vCSAgICAgIC4uLgorLy8JICAgfQorLy8JCisvLwlBbmQgdG8gaW1wb3J0IGp1c3QgdGhlIGxlYWYgc3ltYm9sOgorLy8JCisvLwkgICB2YXIgQiA9IGRvam8uaG9zdGVudi5sb2FkTW9kdWxlKCJBLkIiKTsKKy8vCSAgIC4uLgorLy8JCisvLwlkal9sb2FkIGlzIGFuIGFsaWFzIGZvciBkb2pvLmhvc3RlbnYubG9hZE1vZHVsZQorCisJaWYoIW1vZHVsZU5hbWUpeyByZXR1cm47IH0KKwlvbWl0TW9kdWxlQ2hlY2sgPSB0aGlzLl9nbG9iYWxfb21pdF9tb2R1bGVfY2hlY2sgfHwgb21pdE1vZHVsZUNoZWNrOworCXZhciBtb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCWlmKG1vZHVsZSl7CisJCXJldHVybiBtb2R1bGU7CisJfQorCisJLy8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbiBmcm9tIG11dHVhbCBkZXBlbmRlbmNpZXMKKwlpZihkal91bmRlZihtb2R1bGVOYW1lLCB0aGlzLmxvYWRpbmdfbW9kdWxlc18pKXsKKwkJdGhpcy5hZGRlZFRvTG9hZGluZ0NvdW50LnB1c2gobW9kdWxlTmFtZSk7CisJfQorCXRoaXMubG9hZGluZ19tb2R1bGVzX1ttb2R1bGVOYW1lXSA9IDE7CisKKwkvLyBjb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcworCXZhciByZWxwYXRoID0gbW9kdWxlTmFtZS5yZXBsYWNlKC9cLi9nLCAnLycpICsgJy5qcyc7CisKKwl2YXIgbnN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCIuIik7CisJCisJLy8gdGhpcyBsaW5lIGFsbG93ZWQgbG9hZGluZyBvZiBhIG1vZHVsZSBtYW5pZmVzdCBhcyBpZiBpdCB3ZXJlIGEgbmFtZXNwYWNlCisJLy8gaXQncyBhbiBpbnRlcmVzdGluZyBpZGVhLCBidXQgc2hvdWxkbid0IGJlIGNvbWJpbmVkIHdpdGggJ25hbWVzcGFjZXMnIHByb3BlcgorCS8vIGFuZCBsZWFkcyB0byB1bndhbnRlZCBkZXBlbmRlbmNpZXMKKwkvLyB0aGUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBpbiBvdGhlciAoYWxiZWl0IGxlc3MtZmxleGlibGUpIHdheXMgbm93LCBzbyBJIGFtCisJLy8gcmVtb3ZpbmcgdGhpcyBwZW5kaW5nIGZ1cnRoZXIgZGVzaWduIHdvcmsKKwkvLyBwZXJoYXBzIHdlIGNhbiBleHBsaWNpdGx5IGRlZmluZSB0aGlzIGlkZWEgb2YgYSAnbW9kdWxlIG1hbmlmZXN0JywgYW5kIHN1YmNsYXNzCisJLy8gJ25hbWVzcGFjZSBtYW5pZmVzdCcgZnJvbSB0aGF0CisJLy9kb2pvLmdldE5hbWVzcGFjZShuc3ltc1swXSk7CisKKwl2YXIgc3ltcyA9IHRoaXMuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGVOYW1lKTsKKwl2YXIgc3RhcnRlZFJlbGF0aXZlID0gKChzeW1zWzBdLmNoYXJBdCgwKSAhPSAnLycpICYmICFzeW1zWzBdLm1hdGNoKC9eXHcrOi8pKTsKKwl2YXIgbGFzdCA9IHN5bXNbc3ltcy5sZW5ndGggLSAxXTsKKwl2YXIgb2s7CisJLy8gZmlndXJlIG91dCBpZiB3ZSdyZSBsb29raW5nIGZvciBhIGZ1bGwgcGFja2FnZSwgaWYgc28sIHdlIHdhbnQgdG8gZG8KKwkvLyB0aGluZ3Mgc2xpZ2h0bHkgZGlmZnJlbnRseQorCWlmKGxhc3Q9PSIqIil7CisJCW1vZHVsZU5hbWUgPSBuc3ltcy5zbGljZSgwLCAtMSkuam9pbignLicpOworCQl3aGlsZShzeW1zLmxlbmd0aCl7CisJCQlzeW1zLnBvcCgpOworCQkJc3ltcy5wdXNoKHRoaXMucGtnRmlsZU5hbWUpOworCQkJcmVscGF0aCA9IHN5bXMuam9pbigiLyIpICsgJy5qcyc7CisJCQlpZihzdGFydGVkUmVsYXRpdmUgJiYgcmVscGF0aC5jaGFyQXQoMCk9PSIvIil7CisJCQkJcmVscGF0aCA9IHJlbHBhdGguc2xpY2UoMSk7CisJCQl9CisJCQlvayA9IHRoaXMubG9hZFBhdGgocmVscGF0aCwgIW9taXRNb2R1bGVDaGVjayA/IG1vZHVsZU5hbWUgOiBudWxsKTsKKwkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCXN5bXMucG9wKCk7CisJCX0KKwl9ZWxzZXsKKwkJcmVscGF0aCA9IHN5bXMuam9pbigiLyIpICsgJy5qcyc7CisJCW1vZHVsZU5hbWUgPSBuc3ltcy5qb2luKCcuJyk7CisJCXZhciBtb2RBcmcgPSAhb21pdE1vZHVsZUNoZWNrID8gbW9kdWxlTmFtZSA6IG51bGw7CisJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQlpZighb2sgJiYgIWV4YWN0T25seSl7CisJCQlzeW1zLnBvcCgpOworCQkJd2hpbGUoc3ltcy5sZW5ndGgpeworCQkJCXJlbHBhdGggPSBzeW1zLmpvaW4oJy8nKSArICcuanMnOworCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCQlzeW1zLnBvcCgpOworCQkJCXJlbHBhdGggPSBzeW1zLmpvaW4oJy8nKSArICcvJyt0aGlzLnBrZ0ZpbGVOYW1lKycuanMnOworCQkJCWlmKHN0YXJ0ZWRSZWxhdGl2ZSAmJiByZWxwYXRoLmNoYXJBdCgwKT09Ii8iKXsKKwkJCQkJcmVscGF0aCA9IHJlbHBhdGguc2xpY2UoMSk7CisJCQkJfQorCQkJCW9rID0gdGhpcy5sb2FkUGF0aChyZWxwYXRoLCBtb2RBcmcpOworCQkJCWlmKG9rKXsgYnJlYWs7IH0KKwkJCX0KKwkJfQorCisJCWlmKCFvayAmJiAhb21pdE1vZHVsZUNoZWNrKXsKKwkJCWRvam8ucmFpc2UoIkNvdWxkIG5vdCBsb2FkICciICsgbW9kdWxlTmFtZSArICInOyBsYXN0IHRyaWVkICciICsgcmVscGF0aCArICInIik7CisJCX0KKwl9CisKKwkvLyBjaGVjayB0aGF0IHRoZSBzeW1ib2wgd2FzIGRlZmluZWQKKwkvL0Rvbid0IGJvdGhlciBpZiB3ZSdyZSBkb2luZyB4ZG9tYWluIChhc3luY2hyb25vdXMpIGxvYWRpbmcuCisJaWYoIW9taXRNb2R1bGVDaGVjayAmJiAhdGhpc1siaXNYRG9tYWluIl0peworCQkvLyBwYXNzIGluIGZhbHNlIHNvIHdlIGNhbiBnaXZlIGJldHRlciBlcnJvcgorCQltb2R1bGUgPSB0aGlzLmZpbmRNb2R1bGUobW9kdWxlTmFtZSwgZmFsc2UpOworCQlpZighbW9kdWxlKXsKKwkJCWRvam8ucmFpc2UoInN5bWJvbCAnIiArIG1vZHVsZU5hbWUgKyAiJyBpcyBub3QgZGVmaW5lZCBhZnRlciBsb2FkaW5nICciICsgcmVscGF0aCArICInIik7IAorCQl9CisJfQorCisJcmV0dXJuIG1vZHVsZTsKK30KKworZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9wYWNrYWdlTmFtZSl7CisvLyBzdW1tYXJ5OgorLy8JQ3JlYXRlcyBhIEphdmFTY3JpcHQgcGFja2FnZQorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8Jc3RhcnRQYWNrYWdlKCJBLkIiKSBmb2xsb3dzIHRoZSBwYXRoLCBhbmQgYXQgZWFjaCBsZXZlbCBjcmVhdGVzIGEgbmV3IGVtcHR5CisvLwlvYmplY3Qgb3IgdXNlcyB3aGF0IGFscmVhZHkgZXhpc3RzLiBJdCByZXR1cm5zIHRoZSByZXN1bHQuCisvLworLy8gcGFja2FnZU5hbWU6IHRoZSBwYWNrYWdlIHRvIGJlIGNyZWF0ZWQgYXMgYSBTdHJpbmcgaW4gZG90IG5vdGF0aW9uCisKKwkvL01ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyaW5nLgorCXZhciBmdWxsUGtnTmFtZSA9IFN0cmluZyhwYWNrYWdlTmFtZSk7CisJdmFyIHN0cmlwcGVkUGtnTmFtZSA9IGZ1bGxQa2dOYW1lOworCisJdmFyIHN5bXMgPSBwYWNrYWdlTmFtZS5zcGxpdCgvXC4vKTsKKwlpZihzeW1zW3N5bXMubGVuZ3RoLTFdPT0iKiIpeworCQlzeW1zLnBvcCgpOworCQlzdHJpcHBlZFBrZ05hbWUgPSBzeW1zLmpvaW4oIi4iKTsKKwl9CisJdmFyIGV2YWxlZFBrZyA9IGRvam8uZXZhbE9ialBhdGgoc3RyaXBwZWRQa2dOYW1lLCB0cnVlKTsKKwl0aGlzLmxvYWRlZF9tb2R1bGVzX1tmdWxsUGtnTmFtZV0gPSBldmFsZWRQa2c7CisJdGhpcy5sb2FkZWRfbW9kdWxlc19bc3RyaXBwZWRQa2dOYW1lXSA9IGV2YWxlZFBrZzsKKwkKKwlyZXR1cm4gZXZhbGVkUGtnOyAvLyBPYmplY3QKK30KKworZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUgPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypCb29sZWFuPyovbXVzdEV4aXN0KXsKKy8vIHN1bW1hcnk6CisvLwlSZXR1cm5zIHRoZSBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtb2R1bGUsIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGwuCisvLworLy8gbW9kdWxlTmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBtb2R1bGUgaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSwgbGlrZSAnQS5CJy4KKy8vIG11c3RFeGlzdCBPcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4gdGhyb3cgaW5zdGVhZCBvZiByZXR1cm5pbmcgbnVsbAorLy8JaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuCisKKwl2YXIgbG1uID0gU3RyaW5nKG1vZHVsZU5hbWUpOworCisJaWYodGhpcy5sb2FkZWRfbW9kdWxlc19bbG1uXSl7CisJCXJldHVybiB0aGlzLmxvYWRlZF9tb2R1bGVzX1tsbW5dOyAvLyBPYmplY3QKKwl9CisKKwlpZihtdXN0RXhpc3QpeworCQlkb2pvLnJhaXNlKCJubyBsb2FkZWQgbW9kdWxlIG5hbWVkICciICsgbW9kdWxlTmFtZSArICInIik7CisJfQorCXJldHVybiBudWxsOyAvLyBudWxsCit9CisKKy8vU3RhcnQgb2Ygb2xkIGJvb3RzdHJhcDI6CisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUgPSBmdW5jdGlvbigvKk9iamVjdCBjb250YWluaW5nIEFycmF5cyovbW9kTWFwKXsKKy8vIGRlc2NyaXB0aW9uOgorLy8JVGhpcyBtZXRob2QgdGFrcyBhICJtYXAiIG9mIGFycmF5cyB3aGljaCBvbmUgY2FuIHVzZSB0byBvcHRpb25hbGx5IGxvYWQgZG9qbworLy8JbW9kdWxlcy4gVGhlIG1hcCBpcyBpbmRleGVkIGJ5IHRoZSBwb3NzaWJsZSBkb2pvLmhvc3RlbnYubmFtZV8gdmFsdWVzLCB3aXRoCisvLwl0d28gYWRkaXRpb25hbCB2YWx1ZXM6ICJkZWZhdWx0IiBhbmQgImNvbW1vbiIuIFRoZSBpdGVtcyBpbiB0aGUgImRlZmF1bHQiCisvLwlhcnJheSB3aWxsIGJlIGxvYWRlZCBpZiBub25lIG9mIHRoZSBvdGhlciBpdGVtcyBoYXZlIGJlZW4gY2hvb3NlbiBiYXNlZCBvbgorLy8JdGhlIGhvc3RlbnYubmFtZV8gaXRlbS4gVGhlIGl0ZW1zIGluIHRoZSAiY29tbW9uIiBhcnJheSB3aWxsIF9hbHdheXNfIGJlCisvLwlsb2FkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGlzdCBpcyBjaG9zZW4uICBIZXJlJ3MgaG93IGl0J3Mgbm9ybWFsbHkKKy8vCWNhbGxlZDoKKy8vCQorLy8JZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisvLwkJYnJvd3NlcjogWworLy8JCQlbImZvby5iYXIuYmF6IiwgdHJ1ZSwgdHJ1ZV0sIC8vIGFuIGV4YW1wbGUgdGhhdCBwYXNzZXMgbXVsdGlwbGUgYXJncyB0byBsb2FkTW9kdWxlKCkKKy8vCQkJImZvby5zYW1wbGUuKiIsCisvLwkJCSJmb28udGVzdCwKKy8vCQldLAorLy8JCWRlZmF1bHQ6IFsgImZvby5zYW1wbGUuKiIgXSwKKy8vCQljb21tb246IFsgInJlYWxseS5pbXBvcnRhbnQubW9kdWxlLioiIF0KKy8vCX0pOworCisJdmFyIGNvbW1vbiA9IG1vZE1hcFsiY29tbW9uIl18fFtdOworCXZhciByZXN1bHQgPSBtb2RNYXBbZG9qby5ob3N0ZW52Lm5hbWVfXSA/IGNvbW1vbi5jb25jYXQobW9kTWFwW2Rvam8uaG9zdGVudi5uYW1lX118fFtdKSA6IGNvbW1vbi5jb25jYXQobW9kTWFwWyJkZWZhdWx0Il18fFtdKTsKKworCWZvcih2YXIgeD0wOyB4PHJlc3VsdC5sZW5ndGg7IHgrKyl7CisJCXZhciBjdXJyID0gcmVzdWx0W3hdOworCQlpZihjdXJyLmNvbnN0cnVjdG9yID09IEFycmF5KXsKKwkJCWRvam8uaG9zdGVudi5sb2FkTW9kdWxlLmFwcGx5KGRvam8uaG9zdGVudiwgY3Vycik7CisJCX1lbHNleworCQkJZG9qby5ob3N0ZW52LmxvYWRNb2R1bGUoY3Vycik7CisJCX0KKwl9Cit9CisKK2Rvam8ucmVxdWlyZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gcmVzb3VyY2VOYW1lKXsKKwkvLyBzdW1tYXJ5CisJLy8JRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHJlc291cmNlIChpZSwgamF2YXNjcmlwdAorCS8vCXNvdXJjZSBmaWxlKSBoYXMgYmVlbiBsb2FkZWQuCisJLy8gZGVzY3JpcHRpb24KKwkvLwlkb2pvLnJlcXVpcmUoKSBpcyBzaW1pbGFyIHRvIEMncyAjaW5jbHVkZSBjb21tYW5kIG9yIGphdmEncyAiaW1wb3J0IiBjb21tYW5kLgorCS8vCVlvdSBjYWxsIGRvam8ucmVxdWlyZSgpIHRvIHB1bGwgaW4gdGhlIHJlc291cmNlcyAoaWUsIGphdmFzY3JpcHQgc291cmNlIGZpbGVzKQorCS8vCXRoYXQgZGVmaW5lIHRoZSBmdW5jdGlvbnMgeW91IGFyZSB1c2luZy4gCisJLy8KKwkvLwlOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYSBidWlsZCwgbWFueSByZXNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQKKwkvLwlpbnRvIGRvam8uanMgKGllLCBtYW55IG9mIHRoZSBqYXZhc2NyaXB0IHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gY29tcHJlc3NlZCBhbmQKKwkvLwljb25jYXRlbmVkIGludG8gZG9qby5qcyksIHNvIG1hbnkgZG9qby5yZXF1aXJlKCkgY2FsbHMgd2lsbCBzaW1wbHkgcmV0dXJuCisJLy8Jd2l0aG91dCBkb3dubG9hZGluZyBhbnl0aGluZy4KKwlkb2pvLmhvc3RlbnYubG9hZE1vZHVsZS5hcHBseShkb2pvLmhvc3RlbnYsIGFyZ3VtZW50cyk7Cit9CisKK2Rvam8ucmVxdWlyZUlmID0gZnVuY3Rpb24oLypCb29sZWFuKi8gY29uZGl0aW9uLCAvKlN0cmluZyovIHJlc291cmNlTmFtZSl7CisJLy8gc3VtbWFyeQorCS8vCUlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSB0aGVuIGNhbGwgZG9qby5yZXF1aXJlKCkgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKKwl2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTsKKwlpZigoYXJnMCA9PT0gdHJ1ZSl8fChhcmcwPT0iY29tbW9uIil8fChhcmcwICYmIGRvam8ucmVuZGVyW2FyZzBdLmNhcGFibGUpKXsKKwkJdmFyIGFyZ3MgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KKwkJZG9qby5yZXF1aXJlLmFwcGx5KGRvam8sIGFyZ3MpOworCX0KK30KKworZG9qby5yZXF1aXJlQWZ0ZXJJZiA9IGRvam8ucmVxdWlyZUlmOworCitkb2pvLnByb3ZpZGUgPSBmdW5jdGlvbigvKlN0cmluZyovIHJlc291cmNlTmFtZSl7CisJLy8gc3VtbWFyeQorCS8vCUVhY2ggamF2YXNjcmlwdCBzb3VyY2UgZmlsZSBtdXN0IGhhdmUgKGV4YWN0bHkpIG9uZSBkb2pvLnByb3ZpZGUoKQorCS8vCWNhbGwgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZSBuYW1lLgorCS8vCUZvciBleGFtcGxlLCBkb2pvL3NyYy9mb28uanMgbXVzdCBoYXZlIGRvam8ucHJvdmlkZSgiZG9qby5mb28iKTsgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KKwkvLworCS8vIGRlc2NyaXB0aW9uCisJLy8JRWFjaCBqYXZhc2NyaXB0IHNvdXJjZSBmaWxlIGlzIGNhbGxlZCBhIHJlc291cmNlLiAgV2hlbiBhIHJlc291cmNlCisJLy8JaXMgbG9hZGVkIGJ5IHRoZSBicm93c2VyLCBkb2pvLnByb3ZpZGUoKSByZWdpc3RlcnMgdGhhdCBpdCBoYXMKKwkvLwliZWVuIGxvYWRlZC4KKwkvLwkKKwkvLwlGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucywgaW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJpbmcgdGhlIHJlc291cmNlLAorCS8vCWRvam8ucHJvdmlkZSgpIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBqYXZhc2NyaXB0IG9iamVjdCBmb3IgdGhlIG1vZHVsZSBleGlzdHMuICBGb3IKKwkvLwlleGFtcGxlLCBkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5jb21tb24iKSwgaW4gYWRkaXRpb24gdG8gcmVnaXN0ZXJpbmcgdGhhdCBjb21tb24uanMKKwkvLwlpcyBhIHJlc291cmNlIGZvciB0aGUgZG9qby5odG1sIG1vZHVsZSwgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZG9qby5odG1sIGphdmFzY3JpcHQgb2JqZWN0CisJLy8JZXhpc3RzLCBzbyB0aGF0IGNhbGxzIGxpa2UgZG9qby5odG1sLmZvbyA9IGZ1bmN0aW9uKCl7IC4uLiB9IGRvbid0IGZhaWwuCisJLy8KKwkvLwlJbiB0aGUgY2FzZSBvZiBhIGJ1aWxkIChvciBpbiB0aGUgZnV0dXJlLCBhIHJvbGx1cCksIHdoZXJlIG11bHRpcGxlIGphdmFzY3JpcHQgc291cmNlCisJLy8JZmlsZXMgYXJlIGNvbWJpbmVkIGludG8gb25lIGJpZ2dlciBmaWxlIChzaW1pbGFyIHRvIGEgLmxpYiBvciAuamFyIGZpbGUpLCB0aGF0IGZpbGUKKwkvLwl3aWxsIGNvbnRhaW4gbXVsdGlwbGUgZG9qby5wcm92aWRlKCkgY2FsbHMsIHRvIG5vdGUgdGhhdCBpdCBpbmNsdWRlcworCS8vCW11bHRpcGxlIHJlc291cmNlcy4KKwlyZXR1cm4gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZS5hcHBseShkb2pvLmhvc3RlbnYsIGFyZ3VtZW50cyk7Cit9CisKK2Rvam8ucmVnaXN0ZXJNb2R1bGVQYXRoID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypTdHJpbmcqL3ByZWZpeCl7CisJLy8gc3VtbWFyeTogbWFwcyBhIG1vZHVsZSBuYW1lIHRvIGEgcGF0aAorCS8vIGRlc2NyaXB0aW9uOiBBbiB1bnJlZ2lzdGVyZWQgbW9kdWxlIGlzIGdpdmVuIHRoZSBkZWZhdWx0IHBhdGggb2YgLi4vPG1vZHVsZT4sCisJLy8JcmVsYXRpdmUgdG8gRG9qbyByb290LiBGb3IgZXhhbXBsZSwgbW9kdWxlIGFjbWUgaXMgbWFwcGVkIHRvIC4uL2FjbWUuCisJLy8JSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1vZHVsZSBuYW1lLCB1c2UgZG9qby5yZWdpc3Rlck1vZHVsZVBhdGguIAorCXJldHVybiBkb2pvLmhvc3RlbnYuc2V0TW9kdWxlUHJlZml4KG1vZHVsZSwgcHJlZml4KTsKK30KKworaWYoZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworCWZvcih2YXIgcGFyYW0gaW4gZGpDb25maWdbIm1vZHVsZVBhdGhzIl0peworCQlkb2pvLnJlZ2lzdGVyTW9kdWxlUGF0aChwYXJhbSwgZGpDb25maWdbIm1vZHVsZVBhdGhzIl1bcGFyYW1dKTsKKwl9Cit9CisKK2Rvam8uc2V0TW9kdWxlUHJlZml4ID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypTdHJpbmcqL3ByZWZpeCl7CisJLy8gc3VtbWFyeTogbWFwcyBhIG1vZHVsZSBuYW1lIHRvIGEgcGF0aAorCWRvam8uZGVwcmVjYXRlZCgnZG9qby5zZXRNb2R1bGVQcmVmaXgoIicgKyBtb2R1bGUgKyAnIiwgIicgKyBwcmVmaXggKyAnIiknLCAicmVwbGFjZWQgYnkgZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgiLCAiMC41Iik7CisJcmV0dXJuIGRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG1vZHVsZSwgcHJlZml4KTsKK30KKworZG9qby5leGlzdHMgPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKlN0cmluZyovbmFtZSl7CisJLy8gc3VtbWFyeTogZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBzdXBwb3J0cyBhIGdpdmVuIG1ldGhvZAorCS8vIGRlc2NyaXB0aW9uOiB1c2VmdWwgZm9yIGxvbmdlciBhcGkgY2hhaW5zIHdoZXJlIHlvdSBoYXZlIHRvIHRlc3QgZWFjaCBvYmplY3QgaW4gdGhlIGNoYWluCisJdmFyIHAgPSBuYW1lLnNwbGl0KCIuIik7CisJZm9yKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspeworCQlpZighb2JqW3BbaV1dKXsgcmV0dXJuIGZhbHNlOyB9IC8vIEJvb2xlYW4KKwkJb2JqID0gb2JqW3BbaV1dOworCX0KKwlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorfQorCisvLyBMb2NhbGl6YXRpb24gcm91dGluZXMKKworZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZSA9IGZ1bmN0aW9uKC8qU3RyaW5nPyovbG9jYWxlKXsKKy8vCXN1bW1hcnk6CisvLwkJUmV0dXJucyBjYW5vbmljYWwgZm9ybSBvZiBsb2NhbGUsIGFzIHVzZWQgYnkgRG9qby4gIEFsbCB2YXJpYW50cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYXJlIHNlcGFyYXRlZCBieSAnLScKKy8vCQlhcyBzcGVjaWZpZWQgaW4gUkZDIDMwNjYuIElmIG5vIGxvY2FsZSBpcyBzcGVjaWZpZWQsIHRoZSB1c2VyIGFnZW50J3MgZGVmYXVsdCBpcyByZXR1cm5lZC4KKworCXZhciByZXN1bHQgPSBsb2NhbGUgPyBsb2NhbGUudG9Mb3dlckNhc2UoKSA6IGRvam8ubG9jYWxlOworCWlmKHJlc3VsdCA9PSAicm9vdCIpeworCQlyZXN1bHQgPSAiUk9PVCI7CisJfQorCXJldHVybiByZXN1bHQ7Ly8gU3RyaW5nCit9OworCitkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9sb2NhbGUsIC8qQm9vbGVhbiovZG93biwgLypGdW5jdGlvbiovc2VhcmNoRnVuYyl7CisvLwlzdW1tYXJ5OgorLy8JCUEgaGVscGVyIG1ldGhvZCB0byBhc3Npc3QgaW4gc2VhcmNoaW5nIGZvciBsb2NhbGUtYmFzZWQgcmVzb3VyY2VzLiAgV2lsbCBpdGVyYXRlIHRocm91Z2gKKy8vCQl0aGUgdmFyaWFudHMgb2YgYSBwYXJ0aWN1bGFyIGxvY2FsZSwgZWl0aGVyIHVwIG9yIGRvd24sIGV4ZWN1dGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorLy8JCUZvciBleGFtcGxlLCAiZW4tdXMiIGFuZCB0cnVlIHdpbGwgdHJ5ICJlbi11cyIgZm9sbG93ZWQgYnkgImVuIiBhbmQgZmluYWxseSAiUk9PVCIuCisKKwlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisKKwl2YXIgZWxlbWVudHMgPSBsb2NhbGUuc3BsaXQoJy0nKTsKKwl2YXIgc2VhcmNobGlzdCA9IFtdOworCWZvcih2YXIgaSA9IGVsZW1lbnRzLmxlbmd0aDsgaSA+IDA7IGktLSl7CisJCXNlYXJjaGxpc3QucHVzaChlbGVtZW50cy5zbGljZSgwLCBpKS5qb2luKCctJykpOworCX0KKwlzZWFyY2hsaXN0LnB1c2goZmFsc2UpOworCWlmKGRvd24pe3NlYXJjaGxpc3QucmV2ZXJzZSgpO30KKworCWZvcih2YXIgaiA9IHNlYXJjaGxpc3QubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0peworCQl2YXIgbG9jID0gc2VhcmNobGlzdFtqXSB8fCAiUk9PVCI7CisJCXZhciBzdG9wID0gc2VhcmNoRnVuYyhsb2MpOworCQlpZihzdG9wKXsgYnJlYWs7IH0KKwl9Cit9CisKKy8vVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgcGxhY2VkIG91dHNpZGUgb2YgcHJlbG9hZExvY2FsaXphdGlvbnMKKy8vU28gdGhhdCB0aGUgeGQgbG9hZGluZyBjYW4gdXNlL292ZXJyaWRlIHRoZW0uCitkb2pvLmhvc3RlbnYubG9jYWxlc0dlbmVyYXRlZCA9WyJST09UIiwiZXMtZXMiLCJlcyIsIml0LWl0IiwicHQtYnIiLCJkZSIsImZyLWZyIiwiemgtY24iLCJwdCIsImVuLXVzIiwiemgiLCJmciIsInpoLXR3IiwiaXQiLCJlbi1nYiIsInh4IiwiZGUtZGUiLCJrby1rciIsImphLWpwIiwia28iLCJlbiIsImphIl07IC8vIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZSBhdCBidWlsZCB0aW1lLCBpZiBuZWNlc3NhcnkKKworZG9qby5ob3N0ZW52LnJlZ2lzdGVyTmxzUHJlZml4ID0gZnVuY3Rpb24oKXsKKy8vIHN1bW1hcnk6CisvLwlSZWdpc3RlciBtb2R1bGUgIm5scyIgdG8gcG9pbnQgd2hlcmUgRG9qbyBjYW4gZmluZCBwcmUtYnVpbHQgbG9jYWxpemF0aW9uIGZpbGVzCisJZG9qby5yZWdpc3Rlck1vZHVsZVBhdGgoIm5scyIsIm5scyIpOwkKK30KKworZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zID0gZnVuY3Rpb24oKXsKKy8vIHN1bW1hcnk6CisvLwlMb2FkIGJ1aWx0LCBmbGF0dGVuZWQgcmVzb3VyY2UgYnVuZGxlcywgaWYgYXZhaWxhYmxlIGZvciBhbGwgbG9jYWxlcyB1c2VkIGluIHRoZSBwYWdlLgorLy8JRXhlY3V0ZSBvbmx5IG9uY2UuICBOb3RlIHRoYXQgdGhpcyBpcyBhIG5vLW9wIHVubGVzcyB0aGVyZSBpcyBhIGJ1aWxkLgorCisJaWYoZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQpeworCQlkb2pvLmhvc3RlbnYucmVnaXN0ZXJObHNQcmVmaXgoKTsKKworCQlmdW5jdGlvbiBwcmVsb2FkKGxvY2FsZSl7CisJCQlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJCQlkb2pvLmhvc3RlbnYuc2VhcmNoTG9jYWxlUGF0aChsb2NhbGUsIHRydWUsIGZ1bmN0aW9uKGxvYyl7CisJCQkJZm9yKHZhciBpPTA7IGk8ZG9qby5ob3N0ZW52LmxvY2FsZXNHZW5lcmF0ZWQubGVuZ3RoO2krKyl7CisJCQkJCWlmKGRvam8uaG9zdGVudi5sb2NhbGVzR2VuZXJhdGVkW2ldID09IGxvYyl7CisJCQkJCQlkb2pvWyJyZXF1aXJlIl0oIm5scy5kb2pvXyIrbG9jKTsKKwkJCQkJCXJldHVybiB0cnVlOyAvLyBCb29sZWFuCisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOyAvLyBCb29sZWFuCisJCQl9KTsKKwkJfQorCQlwcmVsb2FkKCk7CisJCXZhciBleHRyYSA9IGRqQ29uZmlnLmV4dHJhTG9jYWxlfHxbXTsKKwkJZm9yKHZhciBpPTA7IGk8ZXh0cmEubGVuZ3RoOyBpKyspeworCQkJcHJlbG9hZChleHRyYVtpXSk7CisJCX0KKwl9CisJZG9qby5ob3N0ZW52LnByZWxvYWRMb2NhbGl6YXRpb25zID0gZnVuY3Rpb24oKXt9OworfQorCitkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb24gPSBmdW5jdGlvbigvKlN0cmluZyovbW9kdWxlTmFtZSwgLypTdHJpbmcqL2J1bmRsZU5hbWUsIC8qU3RyaW5nPyovbG9jYWxlLCAvKlN0cmluZz8qL2F2YWlsYWJsZUZsYXRMb2NhbGVzKXsKKy8vIHN1bW1hcnk6CisvLwlEZWNsYXJlcyB0cmFuc2xhdGVkIHJlc291cmNlcyBhbmQgbG9hZHMgdGhlbSBpZiBuZWNlc3NhcnksIGluIHRoZSBzYW1lIHN0eWxlIGFzIGRvam8ucmVxdWlyZS4KKy8vCUNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgYXJlIHR5cGljYWxseSBzdHJpbmdzLCBidXQgbWF5IGJlIGFueSBuYW1lL3ZhbHVlIHBhaXIsCisvLwlyZXByZXNlbnRlZCBpbiBKU09OIGZvcm1hdC4gIFNlZSBhbHNvIGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24uCisvLworLy8gbW9kdWxlTmFtZTogbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSAibmxzIiBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGJ1bmRsZSBpcyBmb3VuZAorLy8gYnVuZGxlTmFtZTogYnVuZGxlIG5hbWUsIGkuZS4gdGhlIGZpbGVuYW1lIHdpdGhvdXQgdGhlICcuanMnIHN1ZmZpeAorLy8gbG9jYWxlOiB0aGUgbG9jYWxlIHRvIGxvYWQgKG9wdGlvbmFsKSAgQnkgZGVmYXVsdCwgdGhlIGJyb3dzZXIncyB1c2VyIGxvY2FsZSBhcyBkZWZpbmVkIGJ5IGRvam8ubG9jYWxlCisvLyBhdmFpbGFibGVGbGF0TG9jYWxlczogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgYXZhaWxhYmxlLCBmbGF0dGVuZWQgbG9jYWxlcyBmb3IgdGhpcyBidW5kbGUuCisvLyBUaGlzIGFyZ3VtZW50IHNob3VsZCBvbmx5IGJlIHNldCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCUxvYWQgdHJhbnNsYXRlZCByZXNvdXJjZSBidW5kbGVzIHByb3ZpZGVkIHVuZGVybmVhdGggdGhlICJubHMiIGRpcmVjdG9yeSB3aXRoaW4gYSBwYWNrYWdlLgorLy8JVHJhbnNsYXRlZCByZXNvdXJjZXMgbWF5IGJlIGxvY2F0ZWQgaW4gZGlmZmVyZW50IHBhY2thZ2VzIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgRm9yIGV4YW1wbGUsCisvLwlhIHBhcnRpY3VsYXIgd2lkZ2V0IG1heSBkZWZpbmUgb25lIG9yIG1vcmUgcmVzb3VyY2UgYnVuZGxlcywgc3RydWN0dXJlZCBpbiBhIHByb2dyYW0gYXMgZm9sbG93cywKKy8vCXdoZXJlIG1vZHVsZU5hbWUgaXMgbXljb2RlLm15d2lkZ2V0IGFuZCBidW5kbGVOYW1lcyBhdmFpbGFibGUgaW5jbHVkZSBidW5kbGVvbmUgYW5kIGJ1bmRsZXR3bzoKKy8vCS4uLgorLy8JbXljb2RlLworLy8JIG15d2lkZ2V0LworLy8JICBubHMvCisvLwkgICBidW5kbGVvbmUuanMgKHRoZSBmYWxsYmFjayB0cmFuc2xhdGlvbiwgRW5nbGlzaCBpbiB0aGlzIGV4YW1wbGUpCisvLwkgICBidW5kbGV0d28uanMgKGFsc28gYSBmYWxsYmFjayB0cmFuc2xhdGlvbikKKy8vCSAgIGRlLworLy8JICAgIGJ1bmRsZW9uZS5qcworLy8JICAgIGJ1bmRsZXR3by5qcworLy8JICAgZGUtYXQvCisvLwkgICAgYnVuZGxlb25lLmpzCisvLwkgICBlbi8KKy8vCSAgICAoZW1wdHk7IHVzZSB0aGUgZmFsbGJhY2sgdHJhbnNsYXRpb24pCisvLwkgICBlbi11cy8KKy8vCSAgICBidW5kbGVvbmUuanMKKy8vCSAgIGVuLWdiLworLy8JICAgIGJ1bmRsZW9uZS5qcworLy8JICAgZXMvCisvLwkgICAgYnVuZGxlb25lLmpzCisvLwkgICAgYnVuZGxldHdvLmpzCisvLwkgIC4uLmV0YworLy8JLi4uCisvLwlFYWNoIGRpcmVjdG9yeSBpcyBuYW1lZCBmb3IgYSBsb2NhbGUgYXMgc3BlY2lmaWVkIGJ5IFJGQyAzMDY2LCAoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzA2Ni50eHQpLAorLy8Jbm9ybWFsaXplZCBpbiBsb3dlcmNhc2UuICBOb3RlIHRoYXQgdGhlIHR3byBidW5kbGVzIGluIHRoZSBleGFtcGxlIGRvIG5vdCBkZWZpbmUgYWxsIHRoZSBzYW1lIHZhcmlhbnRzLgorLy8JRm9yIGEgZ2l2ZW4gbG9jYWxlLCBidW5kbGVzIHdpbGwgYmUgbG9hZGVkIGZvciB0aGF0IGxvY2FsZSBhbmQgYWxsIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGFib3ZlIGl0LCBpbmNsdWRpbmcKKy8vCWEgZmFsbGJhY2sgYXQgdGhlIHJvb3QgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIGEgZGVjbGFyYXRpb24gZm9yIHRoZSAiZGUtYXQiIGxvY2FsZSB3aWxsIGZpcnN0CisvLwlsb2FkIG5scy9kZS1hdC9idW5kbGVvbmUuanMsIHRoZW4gbmxzL2RlL2J1bmRsZW9uZS5qcyBhbmQgZmluYWxseSBubHMvYnVuZGxlb25lLmpzLiAgVGhlIGRhdGEgd2lsbAorLy8JYmUgZmxhdHRlbmVkIGludG8gYSBzaW5nbGUgT2JqZWN0IHNvIHRoYXQgbG9va3VwcyB3aWxsIGZvbGxvdyB0aGlzIGNhc2NhZGluZyBwYXR0ZXJuLiAgQW4gb3B0aW9uYWwgYnVpbGQKKy8vCXN0ZXAgY2FuIHByZWxvYWQgdGhlIGJ1bmRsZXMgdG8gYXZvaWQgZGF0YSByZWR1bmRhbmN5IGFuZCB0aGUgbXVsdGlwbGUgbmV0d29yayBoaXRzIG5vcm1hbGx5IHJlcXVpcmVkIHRvCisvLwlsb2FkIHRoZXNlIHJlc291cmNlcy4KKworCWRvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworCXZhciB0YXJnZXRMb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisgCXZhciBidW5kbGVQYWNrYWdlID0gW21vZHVsZU5hbWUsICJubHMiLCBidW5kbGVOYW1lXS5qb2luKCIuIik7CisvL05PVEU6IFdoZW4gbG9hZGluZyB0aGVzZSByZXNvdXJjZXMsIHRoZSBwYWNrYWdpbmcgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBvbiBkaXNrLiAgVGhpcyBpcyBhbgorLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBhcyB0aGlzIGlzIGp1c3QgYSBwcml2YXRlIGRhdGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGxvYWRlZCByZXNvdXJjZXMuCisvLyBlLmcuIHRlc3RzL2hlbGxvL25scy9lbi11cy9zYWx1dGF0aW9ucy5qcyBpcyBsb2FkZWQgYXMgdGhlIG9iamVjdCB0ZXN0cy5oZWxsby5ubHMuc2FsdXRhdGlvbnMuZW5fdXM9ey4uLn0KKy8vIFRoZSBzdHJ1Y3R1cmUgb24gZGlzayBpcyBpbnRlbmRlZCB0byBiZSBtb3N0IGNvbnZlbmllbnQgZm9yIGRldmVsb3BlcnMgYW5kIHRyYW5zbGF0b3JzLCBidXQgaW4gbWVtb3J5CisvLyBpdCBpcyBtb3JlIGxvZ2ljYWwgYW5kIGVmZmljaWVudCB0byBzdG9yZSBpbiBhIGRpZmZlcmVudCBvcmRlci4gIExvY2FsZXMgY2Fubm90IHVzZSBkYXNoZXMsIHNpbmNlIHRoZQorLy8gcmVzdWx0aW5nIHBhdGggd2lsbCBub3QgZXZhbHVhdGUgYXMgdmFsaWQgSlMsIHNvIHdlIHRyYW5zbGF0ZSB0aGVtIHRvIHVuZGVyc2NvcmVzLgorCQorCS8vRmluZCB0aGUgYmVzdC1tYXRjaCBsb2NhbGUgdG8gbG9hZCBpZiB3ZSBoYXZlIGF2YWlsYWJsZSBmbGF0IGxvY2FsZXMuCisJdmFyIGJlc3RMb2NhbGUgPSAiIjsKKwlpZihhdmFpbGFibGVGbGF0TG9jYWxlcyl7CisJCXZhciBmbGF0TG9jYWxlcyA9IGF2YWlsYWJsZUZsYXRMb2NhbGVzLnNwbGl0KCIsIik7CisJCWZvcih2YXIgaSA9IDA7IGkgPCBmbGF0TG9jYWxlcy5sZW5ndGg7IGkrKyl7CisJCQkvL0xvY2FsZSBtdXN0IG1hdGNoIGZyb20gc3RhcnQgb2Ygc3RyaW5nLgorCQkJaWYodGFyZ2V0TG9jYWxlLmluZGV4T2YoZmxhdExvY2FsZXNbaV0pID09IDApeworCQkJCWlmKGZsYXRMb2NhbGVzW2ldLmxlbmd0aCA+IGJlc3RMb2NhbGUubGVuZ3RoKXsKKwkJCQkJYmVzdExvY2FsZSA9IGZsYXRMb2NhbGVzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZighYmVzdExvY2FsZSl7CisJCQliZXN0TG9jYWxlID0gIlJPT1QiOworCQl9CQkKKwl9CisKKwkvL1NlZSBpZiB0aGUgZGVzaXJlZCBsb2NhbGUgaXMgYWxyZWFkeSBsb2FkZWQuCisJdmFyIHRlbXBMb2NhbGUgPSBhdmFpbGFibGVGbGF0TG9jYWxlcyA/IGJlc3RMb2NhbGUgOiB0YXJnZXRMb2NhbGU7CisJdmFyIGJ1bmRsZSA9IGRvam8uaG9zdGVudi5maW5kTW9kdWxlKGJ1bmRsZVBhY2thZ2UpOworCXZhciBsb2NhbGl6ZWRCdW5kbGUgPSBudWxsOworCWlmKGJ1bmRsZSl7CisJCWlmKGRqQ29uZmlnLmxvY2FsaXphdGlvbkNvbXBsZXRlICYmIGJ1bmRsZS5fYnVpbHQpe3JldHVybjt9CisJCXZhciBqc0xvYyA9IHRlbXBMb2NhbGUucmVwbGFjZSgnLScsICdfJyk7CisJCXZhciB0cmFuc2xhdGlvblBhY2thZ2UgPSBidW5kbGVQYWNrYWdlKyIuIitqc0xvYzsKKwkJbG9jYWxpemVkQnVuZGxlID0gZG9qby5ob3N0ZW52LmZpbmRNb2R1bGUodHJhbnNsYXRpb25QYWNrYWdlKTsKKwl9CisKKwlpZighbG9jYWxpemVkQnVuZGxlKXsKKwkJYnVuZGxlID0gZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZShidW5kbGVQYWNrYWdlKTsKKwkJdmFyIHN5bXMgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGVOYW1lKTsKKwkJdmFyIG1vZHBhdGggPSBzeW1zLmNvbmNhdCgibmxzIikuam9pbigiLyIpOworCQl2YXIgcGFyZW50OworCisJCWRvam8uaG9zdGVudi5zZWFyY2hMb2NhbGVQYXRoKHRlbXBMb2NhbGUsIGF2YWlsYWJsZUZsYXRMb2NhbGVzLCBmdW5jdGlvbihsb2MpeworCQkJdmFyIGpzTG9jID0gbG9jLnJlcGxhY2UoJy0nLCAnXycpOworCQkJdmFyIHRyYW5zbGF0aW9uUGFja2FnZSA9IGJ1bmRsZVBhY2thZ2UgKyAiLiIgKyBqc0xvYzsKKwkJCXZhciBsb2FkZWQgPSBmYWxzZTsKKwkJCWlmKCFkb2pvLmhvc3RlbnYuZmluZE1vZHVsZSh0cmFuc2xhdGlvblBhY2thZ2UpKXsKKwkJCQkvLyBNYXJrIGxvYWRlZCB3aGV0aGVyIGl0J3MgZm91bmQgb3Igbm90LCBzbyB0aGF0IGZ1cnRoZXIgbG9hZCBhdHRlbXB0cyB3aWxsIG5vdCBiZSBtYWRlCisJCQkJZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSh0cmFuc2xhdGlvblBhY2thZ2UpOworCQkJCXZhciBtb2R1bGUgPSBbbW9kcGF0aF07CisJCQkJaWYobG9jICE9ICJST09UIil7bW9kdWxlLnB1c2gobG9jKTt9CisJCQkJbW9kdWxlLnB1c2goYnVuZGxlTmFtZSk7CisJCQkJdmFyIGZpbGVzcGVjID0gbW9kdWxlLmpvaW4oIi8iKSArICcuanMnOworCQkJCWxvYWRlZCA9IGRvam8uaG9zdGVudi5sb2FkUGF0aChmaWxlc3BlYywgbnVsbCwgZnVuY3Rpb24oaGFzaCl7CisJCQkJCS8vIFVzZSBzaW5nbGV0b24gd2l0aCBwcm90b3R5cGUgdG8gcG9pbnQgdG8gcGFyZW50IGJ1bmRsZSwgdGhlbiBtaXgtaW4gcmVzdWx0IGZyb20gbG9hZFBhdGgKKwkJCQkJdmFyIGNsYXp6ID0gZnVuY3Rpb24oKXt9OworCQkJCQljbGF6ei5wcm90b3R5cGUgPSBwYXJlbnQ7CisJCQkJCWJ1bmRsZVtqc0xvY10gPSBuZXcgY2xhenooKTsKKwkJCQkJZm9yKHZhciBqIGluIGhhc2gpeyBidW5kbGVbanNMb2NdW2pdID0gaGFzaFtqXTsgfQorCQkJCX0pOworCQkJfWVsc2V7CisJCQkJbG9hZGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWlmKGxvYWRlZCAmJiBidW5kbGVbanNMb2NdKXsKKwkJCQlwYXJlbnQgPSBidW5kbGVbanNMb2NdOworCQkJfWVsc2V7CisJCQkJYnVuZGxlW2pzTG9jXSA9IHBhcmVudDsKKwkJCX0KKwkJCQorCQkJaWYoYXZhaWxhYmxlRmxhdExvY2FsZXMpeworCQkJCS8vU3RvcCB0aGUgbG9jYWxlIHBhdGggc2VhcmNoaW5nIGlmIHdlIGtub3cgdGhlIGF2YWlsYWJsZUZsYXRMb2NhbGVzLCBzaW5jZQorCQkJCS8vdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgdGhlIG9ubHkgYnVuZGxlIHRoYXQgaXMgbmVlZGVkLgorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9KTsKKwl9CisKKwkvL1NhdmUgdGhlIGJlc3QgbG9jYWxlIGJ1bmRsZSBhcyB0aGUgdGFyZ2V0IGxvY2FsZSBidW5kbGUgd2hlbiB3ZSBrbm93IHRoZQorCS8vdGhlIGF2YWlsYWJsZSBidW5kbGVzLgorCWlmKGF2YWlsYWJsZUZsYXRMb2NhbGVzICYmIHRhcmdldExvY2FsZSAhPSBiZXN0TG9jYWxlKXsKKwkJYnVuZGxlW3RhcmdldExvY2FsZS5yZXBsYWNlKCctJywgJ18nKV0gPSBidW5kbGVbYmVzdExvY2FsZS5yZXBsYWNlKCctJywgJ18nKV07CisJfQorfTsKKworKGZ1bmN0aW9uKCl7CisJLy8gSWYgb3RoZXIgbG9jYWxlcyBhcmUgdXNlZCwgZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uIHNob3VsZCBsb2FkIHRoZW0gYXMgd2VsbCwgYnkgZGVmYXVsdC4KKwkvLyBPdmVycmlkZSBkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb24gdG8gZG8gbG9hZCB0aGUgZGVmYXVsdCBidW5kbGUsIHRoZW4gaXRlcmF0ZSB0aHJvdWdoIHRoZQorCS8vIGV4dHJhTG9jYWxlIGxpc3QgYW5kIGxvYWQgdGhvc2UgdHJhbnNsYXRpb25zIGFzIHdlbGwsIHVubGVzcyBhIHBhcnRpY3VsYXIgbG9jYWxlIHdhcyByZXF1ZXN0ZWQuCisKKwl2YXIgZXh0cmEgPSBkakNvbmZpZy5leHRyYUxvY2FsZTsKKwlpZihleHRyYSl7CisJCWlmKCFleHRyYSBpbnN0YW5jZW9mIEFycmF5KXsKKwkJCWV4dHJhID0gW2V4dHJhXTsKKwkJfQorCisJCXZhciByZXEgPSBkb2pvLnJlcXVpcmVMb2NhbGl6YXRpb247CisJCWRvam8ucmVxdWlyZUxvY2FsaXphdGlvbiA9IGZ1bmN0aW9uKG0sIGIsIGxvY2FsZSwgYXZhaWxhYmxlRmxhdExvY2FsZXMpeworCQkJcmVxKG0sYixsb2NhbGUsIGF2YWlsYWJsZUZsYXRMb2NhbGVzKTsKKwkJCWlmKGxvY2FsZSl7cmV0dXJuO30KKwkJCWZvcih2YXIgaT0wOyBpPGV4dHJhLmxlbmd0aDsgaSsrKXsKKwkJCQlyZXEobSxiLGV4dHJhW2ldLCBhdmFpbGFibGVGbGF0TG9jYWxlcyk7CisJCQl9CisJCX07CisJfQorfSkoKTsKKworfTsKKworaWYodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyl7CisKKwkvLyBhdHRlbXB0IHRvIGZpZ3VyZSBvdXQgdGhlIHBhdGggdG8gZG9qbyBpZiBpdCBpc24ndCBzZXQgaW4gdGhlIGNvbmZpZworCShmdW5jdGlvbigpeworCQkvLyBiZWZvcmUgd2UgZ2V0IGFueSBmdXJ0aGVyIHdpdGggdGhlIGNvbmZpZyBvcHRpb25zLCB0cnkgdG8gcGljayB0aGVtIG91dAorCQkvLyBvZiB0aGUgVVJMLiBNb3N0IG9mIHRoaXMgY29kZSBpcyBmcm9tIE5XCisJCWlmKGRqQ29uZmlnLmFsbG93UXVlcnlDb25maWcpeworCQkJdmFyIGJhc2VVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpOyAvLyBGSVhNRTogdXNlIGxvY2F0aW9uLnF1ZXJ5IGluc3RlYWQ/CisJCQl2YXIgcGFyYW1zID0gYmFzZVVybC5zcGxpdCgiPyIsIDIpOworCQkJaWYocGFyYW1zLmxlbmd0aCA+IDEpeworCQkJCXZhciBwYXJhbVN0ciA9IHBhcmFtc1sxXTsKKwkJCQl2YXIgcGFpcnMgPSBwYXJhbVN0ci5zcGxpdCgiJiIpOworCQkJCWZvcih2YXIgeCBpbiBwYWlycyl7CisJCQkJCXZhciBzcCA9IHBhaXJzW3hdLnNwbGl0KCI9Iik7CisJCQkJCS8vIEZJWE1FOiBpcyB0aGlzIGV2YWwgZGFuZ2Vyb3VzPworCQkJCQlpZigoc3BbMF0ubGVuZ3RoID4gOSkmJihzcFswXS5zdWJzdHIoMCwgOSkgPT0gImRqQ29uZmlnLiIpKXsKKwkJCQkJCXZhciBvcHQgPSBzcFswXS5zdWJzdHIoOSk7CisJCQkJCQl0cnl7CisJCQkJCQkJZGpDb25maWdbb3B0XT1ldmFsKHNwWzFdKTsKKwkJCQkJCX1jYXRjaChlKXsKKwkJCQkJCQlkakNvbmZpZ1tvcHRdPXNwWzFdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoCisJCQkoKGRqQ29uZmlnWyJiYXNlU2NyaXB0VXJpIl0gPT0gIiIpfHwoZGpDb25maWdbImJhc2VSZWxhdGl2ZVBhdGgiXSA9PSAiIikpICYmIAorCQkJKGRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKQorCQkpeworCQkJdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7CisJCQl2YXIgcmVQa2cgPSAvKF9fcGFja2FnZV9ffGRvam98Ym9vdHN0cmFwMSlcLmpzKFtcP1wuXXwkKS9pOworCQkJZm9yKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YXIgc3JjID0gc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoInNyYyIpOworCQkJCWlmKCFzcmMpIHsgY29udGludWU7IH0KKwkJCQl2YXIgbSA9IHNyYy5tYXRjaChyZVBrZyk7CisJCQkJaWYobSkgeworCQkJCQl2YXIgcm9vdCA9IHNyYy5zdWJzdHJpbmcoMCwgbS5pbmRleCk7CisJCQkJCWlmKHNyYy5pbmRleE9mKCJib290c3RyYXAxIikgPiAtMSkgeyByb290ICs9ICIuLi8iOyB9CisJCQkJCWlmKCF0aGlzWyJkakNvbmZpZyJdKSB7IGRqQ29uZmlnID0ge307IH0KKwkJCQkJaWYoZGpDb25maWdbImJhc2VTY3JpcHRVcmkiXSA9PSAiIikgeyBkakNvbmZpZ1siYmFzZVNjcmlwdFVyaSJdID0gcm9vdDsgfQorCQkJCQlpZihkakNvbmZpZ1siYmFzZVJlbGF0aXZlUGF0aCJdID09ICIiKSB7IGRqQ29uZmlnWyJiYXNlUmVsYXRpdmVQYXRoIl0gPSByb290OyB9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIGZpbGwgaW4gdGhlIHJlbmRlcmluZyBzdXBwb3J0IGluZm9ybWF0aW9uIGluIGRvam8ucmVuZGVyLioKKwkJdmFyIGRyID0gZG9qby5yZW5kZXI7CisJCXZhciBkcmggPSBkb2pvLnJlbmRlci5odG1sOworCQl2YXIgZHJzID0gZG9qby5yZW5kZXIuc3ZnOworCQl2YXIgZHVhID0gKGRyaC5VQSA9IG5hdmlnYXRvci51c2VyQWdlbnQpOworCQl2YXIgZGF2ID0gKGRyaC5BViA9IG5hdmlnYXRvci5hcHBWZXJzaW9uKTsKKwkJdmFyIHQgPSB0cnVlOworCQl2YXIgZiA9IGZhbHNlOworCQlkcmguY2FwYWJsZSA9IHQ7CisJCWRyaC5zdXBwb3J0LmJ1aWx0aW4gPSB0OworCisJCWRyLnZlciA9IHBhcnNlRmxvYXQoZHJoLkFWKTsKKwkJZHIub3MubWFjID0gZGF2LmluZGV4T2YoIk1hY2ludG9zaCIpID49IDA7CisJCWRyLm9zLndpbiA9IGRhdi5pbmRleE9mKCJXaW5kb3dzIikgPj0gMDsKKwkJLy8gY291bGQgYWxzbyBiZSBTb2xhcmlzIG9yIHNvbWV0aGluZywgYnV0IGl0J3MgdGhlIHNhbWUgYnJvd3NlcgorCQlkci5vcy5saW51eCA9IGRhdi5pbmRleE9mKCJYMTEiKSA+PSAwOworCisJCWRyaC5vcGVyYSA9IGR1YS5pbmRleE9mKCJPcGVyYSIpID49IDA7CisJCWRyaC5raHRtbCA9IChkYXYuaW5kZXhPZigiS29ucXVlcm9yIikgPj0gMCl8fChkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMCk7CisJCWRyaC5zYWZhcmkgPSBkYXYuaW5kZXhPZigiU2FmYXJpIikgPj0gMDsKKwkJdmFyIGdlY2tvUG9zID0gZHVhLmluZGV4T2YoIkdlY2tvIik7CisJCWRyaC5tb3ppbGxhID0gZHJoLm1veiA9IChnZWNrb1BvcyA+PSAwKSYmKCFkcmgua2h0bWwpOworCQlpZiAoZHJoLm1vemlsbGEpIHsKKwkJCS8vIGdlY2tvIHZlcnNpb24gaXMgWVlZWU1NREQKKwkJCWRyaC5nZWNrb1ZlcnNpb24gPSBkdWEuc3Vic3RyaW5nKGdlY2tvUG9zICsgNiwgZ2Vja29Qb3MgKyAxNCk7CisJCX0KKwkJZHJoLmllID0gKGRvY3VtZW50LmFsbCkmJighZHJoLm9wZXJhKTsKKwkJZHJoLmllNTAgPSBkcmguaWUgJiYgZGF2LmluZGV4T2YoIk1TSUUgNS4wIik+PTA7CisJCWRyaC5pZTU1ID0gZHJoLmllICYmIGRhdi5pbmRleE9mKCJNU0lFIDUuNSIpPj0wOworCQlkcmguaWU2MCA9IGRyaC5pZSAmJiBkYXYuaW5kZXhPZigiTVNJRSA2LjAiKT49MDsKKwkJZHJoLmllNzAgPSBkcmguaWUgJiYgZGF2LmluZGV4T2YoIk1TSUUgNy4wIik+PTA7CisKKwkJdmFyIGNtID0gZG9jdW1lbnRbImNvbXBhdE1vZGUiXTsKKwkJZHJoLnF1aXJrcyA9IChjbSA9PSAiQmFja0NvbXBhdCIpfHwoY20gPT0gIlF1aXJrc01vZGUiKXx8ZHJoLmllNTV8fGRyaC5pZTUwOworCisJCS8vIFRPRE86IGlzIHRoZSBIVE1MIExBTkcgYXR0cmlidXRlIHJlbGV2YW50PworCQlkb2pvLmxvY2FsZSA9IGRvam8ubG9jYWxlIHx8IChkcmguaWUgPyBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIDogbmF2aWdhdG9yLmxhbmd1YWdlKS50b0xvd2VyQ2FzZSgpOworCisJCWRyLnZtbC5jYXBhYmxlPWRyaC5pZTsKKwkJZHJzLmNhcGFibGUgPSBmOworCQlkcnMuc3VwcG9ydC5wbHVnaW4gPSBmOworCQlkcnMuc3VwcG9ydC5idWlsdGluID0gZjsKKwkJdmFyIHRkb2MgPSB3aW5kb3dbImRvY3VtZW50Il07CisJCXZhciB0ZGkgPSB0ZG9jWyJpbXBsZW1lbnRhdGlvbiJdOworCisJCWlmKCh0ZGkpJiYodGRpWyJoYXNGZWF0dXJlIl0pJiYodGRpLmhhc0ZlYXR1cmUoIm9yZy53M2MuZG9tLnN2ZyIsICIxLjAiKSkpeworCQkJZHJzLmNhcGFibGUgPSB0OworCQkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IHQ7CisJCQlkcnMuc3VwcG9ydC5wbHVnaW4gPSBmOworCQl9CisJCS8vIHdlYmtpdHMgYWZ0ZXIgNDIwIHN1cHBvcnQgU1ZHIG5hdGl2ZWx5LiBUaGUgdGVzdCBzdHJpbmcgaXMgIkFwcGxlV2ViS2l0LzQyMCsiCisJCWlmKGRyaC5zYWZhcmkpeworCQkJdmFyIHRtcCA9IGR1YS5zcGxpdCgiQXBwbGVXZWJLaXQvIilbMV07CisJCQl2YXIgdmVyID0gcGFyc2VGbG9hdCh0bXAuc3BsaXQoIiAiKVswXSk7CisJCQlpZih2ZXIgPj0gNDIwKXsKKwkJCQlkcnMuY2FwYWJsZSA9IHQ7CisJCQkJZHJzLnN1cHBvcnQuYnVpbHRpbiA9IHQ7CisJCQkJZHJzLnN1cHBvcnQucGx1Z2luID0gZjsKKwkJCX0KKwkJfWVsc2V7CisJCX0KKwl9KSgpOworCisJZG9qby5ob3N0ZW52LnN0YXJ0UGFja2FnZSgiZG9qby5ob3N0ZW52Iik7CisKKwlkb2pvLnJlbmRlci5uYW1lID0gZG9qby5ob3N0ZW52Lm5hbWVfID0gJ2Jyb3dzZXInOworCWRvam8uaG9zdGVudi5zZWFyY2hJZHMgPSBbXTsKKworCS8vIFRoZXNlIGFyZSBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIGxpa2VsaWhvb2Q7IHRoaXMgd2lsbCBjaGFuZ2UgaW4gdGltZS4KKwlkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEUyA9IFsnTXN4bWwyLlhNTEhUVFAnLCAnTWljcm9zb2Z0LlhNTEhUVFAnLCAnTXN4bWwyLlhNTEhUVFAuNC4wJ107CisKKwlkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGRvZXMgdGhlIHdvcmsgb2YgcG9ydGFibHkgZ2VuZXJhdGluZyBhIG5ldyBYTUxIVFRQUmVxdWVzdCBvYmplY3QuCisJCXZhciBodHRwID0gbnVsbDsKKwkJdmFyIGxhc3RfZSA9IG51bGw7CisJCXRyeXsgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9Y2F0Y2goZSl7fQorCQlpZighaHR0cCl7CisJCQlmb3IodmFyIGk9MDsgaTwzOyArK2kpeworCQkJCXZhciBwcm9naWQgPSBkb2pvLmhvc3RlbnYuX1hNTEhUVFBfUFJPR0lEU1tpXTsKKwkJCQl0cnl7CisJCQkJCWh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChwcm9naWQpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJbGFzdF9lID0gZTsKKwkJCQl9CisKKwkJCQlpZihodHRwKXsKKwkJCQkJZG9qby5ob3N0ZW52Ll9YTUxIVFRQX1BST0dJRFMgPSBbcHJvZ2lkXTsgIC8vIHNvIGZhc3RlciBuZXh0IHRpbWUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKmlmKGh0dHAgJiYgIWh0dHAudG9TdHJpbmcpIHsKKwkJCQlodHRwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7ICJbb2JqZWN0IFhNTEh0dHBSZXF1ZXN0XSI7IH0KKwkJCX0qLworCQl9CisKKwkJaWYoIWh0dHApeworCQkJcmV0dXJuIGRvam8ucmFpc2UoIlhNTEhUVFAgbm90IGF2YWlsYWJsZSIsIGxhc3RfZSk7CisJCX0KKworCQlyZXR1cm4gaHR0cDsgLy8gWE1MSFRUUFJlcXVlc3QgaW5zdGFuY2UKKwl9CisKKwlkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgPSBmYWxzZTsKKwlkb2pvLmhvc3RlbnYuZ2V0VGV4dCA9IGZ1bmN0aW9uKHVyaSwgYXN5bmNfY2IsIGZhaWxfb2speworCQkvLyBzdW1tYXJ5OiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHVyaSBhbmQgcmV0dXJuIHRob3NlIGNvbnRlbnRzLgorCQkvLyB1cmk6CisJCS8vCQlBIHJlbGF0aXZlIG9yIGFic29sdXRlIHVyaS4gSWYgYWJzb2x1dGUsIGl0IHN0aWxsIG11c3QgYmUgaW4KKwkJLy8JCXRoZSBzYW1lICJkb21haW4iIGFzIHdlIGFyZS4KKwkJLy8gYXN5bmNfY2I6CisJCS8vCQlJZiBub3Qgc3BlY2lmaWVkLCBsb2FkIHN5bmNocm9ub3VzbHkuIElmIHNwZWNpZmllZCwgbG9hZAorCQkvLwkJYXN5bmNocm9ub3VzbHksIGFuZCB1c2UgYXN5bmNfY2IgYXMgdGhlIHByb2dyZXNzIGhhbmRsZXIgd2hpY2gKKwkJLy8JCXRha2VzIHRoZSB4bWxodHRwIG9iamVjdCBhcyBpdHMgYXJndW1lbnQuIElmIGFzeW5jX2NiLCB0aGlzCisJCS8vCQlmdW5jdGlvbiByZXR1cm5zIG51bGwuCisJCS8vIGZhaWxfb2s6CisJCS8vCQlEZWZhdWx0IGZhbHNlLiBJZiBmYWlsX29rIGFuZCAhYXN5bmNfY2IgYW5kIGxvYWRpbmcgZmFpbHMsCisJCS8vCQlyZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nLgorCisJCS8vIG5lZWQgdG8gYmxvY2sgYXN5bmMgY2FsbGJhY2tzIGZyb20gc25hdGNoaW5nIHRoaXMgdGhyZWFkIGFzIHRoZSByZXN1bHQKKwkJLy8gb2YgYW4gYXN5bmMgY2FsbGJhY2sgbWlnaHQgY2FsbCBhbm90aGVyIHN5bmMgWEhSLCB0aGlzIGhhbmdzIGtodG1sIGZvcmV2ZXIKKwkJLy8gaG9zdGVudi5fYmxvY2tBc3luYyBtdXN0IGFsc28gYmUgY2hlY2tlZCBpbiBCcm93c2VySU8ncyB3YXRjaEluRmxpZ2h0KCkKKwkJLy8gTk9URTogbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUgc2NvcGUgc3dpdGNoZXMgaWUuIHRoaXMuZ2V0WG1saHR0cE9iamVjdCgpCisJCWlmKCFhc3luY19jYil7IHRoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOyB9CisKKwkJdmFyIGh0dHAgPSB0aGlzLmdldFhtbGh0dHBPYmplY3QoKTsKKworCQlmdW5jdGlvbiBpc0RvY3VtZW50T2soaHR0cCl7CisJCQl2YXIgc3RhdCA9IGh0dHBbInN0YXR1cyJdOworCQkJLy8gYWxsb3cgYSAzMDQgdXNlIGNhY2hlLCBuZWVkZWQgaW4ga29ucSAoaXMgdGhpcyBjb21wbGlhbnQgd2l0aCB0aGUgaHR0cCBzcGVjPykKKwkJCXJldHVybiBCb29sZWFuKCghc3RhdCl8fCgoMjAwIDw9IHN0YXQpJiYoMzAwID4gc3RhdCkpfHwoc3RhdD09MzA0KSk7CisJCX0KKworCQlpZihhc3luY19jYil7CisJCQl2YXIgX3RoaXMgPSB0aGlzLCB0aW1lciA9IG51bGwsIGdibCA9IGRvam8uZ2xvYmFsKCk7CisJCQl2YXIgeGhyID0gZG9qby5ldmFsT2JqUGF0aCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0Iik7CisJCQlodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CisJCQkJaWYodGltZXIpeyBnYmwuY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOyB9CisJCQkJaWYoX3RoaXMuX2Jsb2NrQXN5bmMgfHwgKHhociAmJiB4aHIuX2Jsb2NrQXN5bmMpKXsKKwkJCQkJdGltZXIgPSBnYmwuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGh0dHAub25yZWFkeXN0YXRlY2hhbmdlLmFwcGx5KHRoaXMpOyB9LCAxMCk7CisJCQkJfWVsc2V7CisJCQkJCWlmKDQ9PWh0dHAucmVhZHlTdGF0ZSl7CisJCQkJCQlpZihpc0RvY3VtZW50T2soaHR0cCkpeworCQkJCQkJCS8vIGRvam8uZGVidWcoIkxPQURFRCBVUkk6ICIrdXJpKTsKKwkJCQkJCQlhc3luY19jYihodHRwLnJlc3BvbnNlVGV4dCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlodHRwLm9wZW4oJ0dFVCcsIHVyaSwgYXN5bmNfY2IgPyB0cnVlIDogZmFsc2UpOworCQl0cnl7CisJCQlodHRwLnNlbmQobnVsbCk7CisJCQlpZihhc3luY19jYil7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZighaXNEb2N1bWVudE9rKGh0dHApKXsKKwkJCQl2YXIgZXJyID0gRXJyb3IoIlVuYWJsZSB0byBsb2FkICIrdXJpKyIgc3RhdHVzOiIrIGh0dHAuc3RhdHVzKTsKKwkJCQllcnIuc3RhdHVzID0gaHR0cC5zdGF0dXM7CisJCQkJZXJyLnJlc3BvbnNlVGV4dCA9IGh0dHAucmVzcG9uc2VUZXh0OworCQkJCXRocm93IGVycjsKKwkJCX0KKwkJfWNhdGNoKGUpeworCQkJdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQkJaWYoKGZhaWxfb2spJiYoIWFzeW5jX2NiKSl7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9ZWxzZXsKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9CisKKwkJdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQlyZXR1cm4gaHR0cC5yZXNwb25zZVRleHQ7IC8vIFN0cmluZworCX0KKworCWRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCA9ICdkb2pvRGVidWcnOworCWRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIgPSBbXTsKKwlkb2pvLmhvc3RlbnYuX3ByaW50bG5fc2FmZSA9IGZhbHNlOworCWRvam8uaG9zdGVudi5wcmludGxuID0gZnVuY3Rpb24oLypTdHJpbmcqL2xpbmUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcHJpbnRzIHRoZSBwcm92aWRlZCBsaW5lIHRvIHdoYXRldmVyIGxvZ2dpbmcgY29udGFpbmVyIGlzCisJCS8vCQlhdmFpbGFibGUuIElmIHRoZSBwYWdlIGlzbid0IGxvYWRlZCB5ZXQsIHRoZSBsaW5lIG1heSBiZSBhZGRlZAorCQkvLwkJdG8gYSBidWZmZXIgZm9yIHByaW50aW5nIGxhdGVyLgorCQlpZighZG9qby5ob3N0ZW52Ll9wcmludGxuX3NhZmUpeworCQkJZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5wdXNoKGxpbmUpOworCQl9ZWxzZXsKKwkJCXRyeSB7CisJCQkJdmFyIGNvbnNvbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkakNvbmZpZy5kZWJ1Z0NvbnRhaW5lcklkID8KKwkJCQkJZGpDb25maWcuZGVidWdDb250YWluZXJJZCA6IGRvam8uaG9zdGVudi5kZWZhdWx0RGVidWdDb250YWluZXJJZCk7CisJCQkJaWYoIWNvbnNvbGUpIHsgY29uc29sZSA9IGRvam8uYm9keSgpOyB9CisKKwkJCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTsKKwkJCQljb25zb2xlLmFwcGVuZENoaWxkKGRpdik7CisJCQl9IGNhdGNoIChlKSB7CisJCQkJdHJ5eworCQkJCQkvLyBzYWZhcmkgbmVlZHMgdGhlIG91dHB1dCB3cmFwcGVkIGluIGFuIGVsZW1lbnQgZm9yIHNvbWUgcmVhc29uCisJCQkJCWRvY3VtZW50LndyaXRlKCI8ZGl2PiIgKyBsaW5lICsgIjwvZGl2PiIpOworCQkJCX1jYXRjaChlMil7CisJCQkJCXdpbmRvdy5zdGF0dXMgPSBsaW5lOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCl7CisJCWRvam8uaG9zdGVudi5fcHJpbnRsbl9zYWZlID0gdHJ1ZTsKKwkJd2hpbGUoZG9qby5ob3N0ZW52Ll9wcmludGxuX2J1ZmZlci5sZW5ndGggPiAwKXsKKwkJCWRvam8uaG9zdGVudi5wcmludGxuKGRvam8uaG9zdGVudi5fcHJpbnRsbl9idWZmZXIuc2hpZnQoKSk7CisJCX0KKwl9KTsKKworCWZ1bmN0aW9uIGRqX2FkZE5vZGVFdnRIZGxyKC8qRG9tTm9kZSovbm9kZSwgLypTdHJpbmcqL2V2dE5hbWUsIC8qRnVuY3Rpb24qL2ZwKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCW5vbi1kZXN0cnVjdGl2ZWx5IGFkZHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byB0aGUgbm9kZSdzCisJCS8vCQlldnROYW1lIGhhbmRsZXIuCisJCS8vIG5vZGU6IHRoZSBEb21Ob2RlIHRvIGFkZCB0aGUgaGFuZGxlciB0bworCQkvLyBldnROYW1lOiBzaG91bGQgYmUgaW4gdGhlIGZvcm0gImNsaWNrIiBmb3IgIm9uY2xpY2siIGhhbmRsZXJzCisJCXZhciBvbGRIYW5kbGVyID0gbm9kZVsib24iK2V2dE5hbWVdIHx8IGZ1bmN0aW9uKCl7fTsKKwkJbm9kZVsib24iK2V2dE5hbWVdID0gZnVuY3Rpb24oKXsKKwkJCWZwLmFwcGx5KG5vZGUsIGFyZ3VtZW50cyk7CisJCQlvbGRIYW5kbGVyLmFwcGx5KG5vZGUsIGFyZ3VtZW50cyk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZCA9IGZhbHNlOworCS8vCUJFR0lOIERPTUNvbnRlbnRMb2FkZWQsIGZyb20gRGVhbiBFZHdhcmRzIChodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIwMDYvMDYvYWdhaW4vKQorCWZ1bmN0aW9uIGRqX2xvYWRfaW5pdChlKXsKKwkJZG9qby5ob3N0ZW52Ll9kakluaXRGaXJlZCA9IHRydWU7CisJCS8vIGFsbG93IG11bHRpcGxlIGNhbGxzLCBvbmx5IGZpcnN0IG9uZSB3aWxsIHRha2UgZWZmZWN0CisJCS8vIEEgYnVnIGluIGtodG1sIGNhbGxzIGV2ZW50cyBjYWxsYmFja3MgZm9yIGRvY3VtZW50IGZvciBldmVudCB3aGljaCBpc250IHN1cHBvcnRlZAorCQkvLyBmb3IgZXhhbXBsZSBhIGNyZWF0ZWQgY29udGV4dG1lbnUgZXZlbnQgY2FsbHMgRE9NQ29udGVudExvYWRlZCwgd29ya2Fyb3VuZAorCQl2YXIgdHlwZSA9IChlICYmIGUudHlwZSkgPyBlLnR5cGUudG9Mb3dlckNhc2UoKSA6ICJsb2FkIjsKKwkJaWYoYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZCB8fCAodHlwZSE9ImRvbWNvbnRlbnRsb2FkZWQiICYmIHR5cGUhPSJsb2FkIikpeyByZXR1cm47IH0KKwkJYXJndW1lbnRzLmNhbGxlZS5pbml0aWFsaXplZCA9IHRydWU7CisJCWlmKHR5cGVvZihfdGltZXIpICE9ICd1bmRlZmluZWQnKXsKKwkJCWNsZWFySW50ZXJ2YWwoX3RpbWVyKTsKKwkJCWRlbGV0ZSBfdGltZXI7CisJCX0KKworCQl2YXIgaW5pdEZ1bmMgPSBmdW5jdGlvbigpeworCQkJLy9wZXJmb3JtIGluaXRpYWxpemF0aW9uCisJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKKwkJCX0KKwkJfTsKKworCQlpZihkb2pvLmhvc3RlbnYuaW5GbGlnaHRDb3VudCA9PSAwKXsKKwkJCWluaXRGdW5jKCk7CisJCQlkb2pvLmhvc3RlbnYubW9kdWxlc0xvYWRlZCgpOworCQl9ZWxzZXsKKwkJCS8vVGhpcyBlbHNlIGNhc2Ugc2hvdWxkIGJlIHhkb21haW4gbG9hZGluZy4KKwkJCS8vTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBsb2FkIGxpc3RlbmVyIGFycmF5LgorCQkJLy9QYXJ0IG9mIHRoZSBkb2pvLmFkZE9uTG9hZCBndWFyYW50ZWUgaXMgdGhhdCB3aGVuIHRoZSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkLAorCQkJLy9JdCBtZWFucyB0aGUgRE9NIChvciBwYWdlKSBoYXMgbG9hZGVkIGFuZCB0aGF0IHdpZGdldHMgaGF2ZSBiZWVuIHBhcnNlZC4KKwkJCWRvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnVuc2hpZnQoaW5pdEZ1bmMpOworCQl9CisJfQorCisJLy8JU1RBUlQgRE9NQ29udGVudExvYWRlZAorCS8vIE1vemlsbGEgYW5kIE9wZXJhIDkgZXhwb3NlIHRoZSBldmVudCB3ZSBjb3VsZCB1c2UKKwlpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXsKKwkJLy8gTk9URTogCisJCS8vCQlkdWUgdG8gYSB0aHJlYWRpbmcgaXNzdWUgaW4gRmlyZWZveCAyLjAsIHdlIGNhbid0IGVuYWJsZQorCQkvLwkJRE9NQ29udGVudExvYWRlZCBvbiB0aGF0IHBsYXRmb3JtLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgorCQkvLwkJaHR0cDovL3RyYWMuZG9qb3Rvb2xraXQub3JnL3RpY2tldC8xNzA0CisJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEgfHwgKGRvam8ucmVuZGVyLmh0bWwubW96ICYmIChkakNvbmZpZ1siZW5hYmxlTW96RG9tQ29udGVudExvYWRlZCJdID09PSB0cnVlKSkpeworCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGRqX2xvYWRfaW5pdCwgbnVsbCk7CisJCX0KKworCQkvLwltYWlubHkgZm9yIE9wZXJhIDguNSwgd29uJ3QgYmUgZmlyZWQgaWYgRE9NQ29udGVudExvYWRlZCBmaXJlZCBhbHJlYWR5LgorCQkvLyAgYWxzbyB1c2VkIGZvciBNb3ppbGxhIGJlY2F1c2Ugb2YgdHJhYyAjMTY0MAorCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRqX2xvYWRfaW5pdCwgbnVsbCk7CisJfQorCisJLy8gCWZvciBJbnRlcm5ldCBFeHBsb3Jlci4gcmVhZHlTdGF0ZSB3aWxsIG5vdCBiZSBhY2hpZXZlZCBvbiBpbml0IGNhbGwsIGJ1dCBkb2pvIGRvZXNuJ3QgbmVlZCBpdAorCS8vCWhvd2V2ZXIsIHdlJ2xsIGluY2x1ZGUgaXQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZSBvdGhlciBmdW5jdGlvbnMgYWRkZWQgdGhhdCBtaWdodC4KKwkvLwlOb3RlIHRoYXQgdGhpcyBoYXMgY2hhbmdlZCBiZWNhdXNlIHRoZSBidWlsZCBwcm9jZXNzIHN0cmlwcyBhbGwgY29tbWVudHMtLWluY2x1ZGluZyBjb25kaXRpb25hbAorCS8vCQlvbmVzLgorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgZG9qby5yZW5kZXIub3Mud2luKXsKKwkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKGUpeworCQkJaWYoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKXsKKwkJCQlkal9sb2FkX2luaXQoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJaWYgKC8oV2ViS2l0fGtodG1sKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsgLy8gc25pZmYKKwkJdmFyIF90aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworCQkJaWYgKC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpIHsKKwkJCQlkal9sb2FkX2luaXQoKTsgLy8gY2FsbCB0aGUgb25sb2FkIGhhbmRsZXIKKwkJCX0KKwkJfSwgMTApOworCX0KKwkvLwlFTkQgRE9NQ29udGVudExvYWRlZAorCisJLy8gSUUgV2ViQ29udHJvbCBob3N0ZWQgaW4gYW4gYXBwbGljYXRpb24gY2FuIGZpcmUgImJlZm9yZXVubG9hZCIgYW5kICJ1bmxvYWQiCisJLy8gZXZlbnRzIHdoZW4gY29udHJvbCB2aXNpYmlsaXR5IGNoYW5nZXMsIGNhdXNpbmcgRG9qbyB0byB1bmxvYWQgdG9vIHNvb24uIFRoZQorCS8vIGZvbGxvd2luZyBjb2RlIGZpeGVzIHRoZSBwcm9ibGVtCisJLy8gUmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzE5OTE1NQorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQlkal9hZGROb2RlRXZ0SGRscih3aW5kb3csICJiZWZvcmV1bmxvYWQiLCBmdW5jdGlvbigpeworCQkJZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcgPSB0cnVlOworCQkJd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQkJZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcgPSBmYWxzZTsKKwkJCX0sIDApOworCQl9KTsKKwl9CisKKwlkal9hZGROb2RlRXZ0SGRscih3aW5kb3csICJ1bmxvYWQiLCBmdW5jdGlvbigpeworCQlkb2pvLmhvc3RlbnYudW5sb2FkZWQoKTsKKwkJaWYoKCFkb2pvLnJlbmRlci5odG1sLmllKXx8KGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgZG9qby5ob3N0ZW52Ll91bmxvYWRpbmcpKXsKKwkJCWRvam8uaG9zdGVudi51bmxvYWRlZCgpOworCQl9CisJfSk7CisKKwlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMgPSBmdW5jdGlvbigpeworCQkvLyB5b3UgY2FuIHB1dCBzZWFyY2hJZHMgaW4gZGpDb25maWcgYW5kIGRvam8uaG9zdGVudiBhdCB0aGUgbW9tZW50CisJCS8vIHdlIHNob3VsZCBwcm9iYWJseSBldmVudHVhbGx5IG1vdmUgdG8gb25lIG9yIHRoZSBvdGhlcgorCQl2YXIgc2lkcyA9IFtdOworCQlpZihkakNvbmZpZy5zZWFyY2hJZHMgJiYgZGpDb25maWcuc2VhcmNoSWRzLmxlbmd0aCA+IDApIHsKKwkJCXNpZHMgPSBzaWRzLmNvbmNhdChkakNvbmZpZy5zZWFyY2hJZHMpOworCQl9CisJCWlmKGRvam8uaG9zdGVudi5zZWFyY2hJZHMgJiYgZG9qby5ob3N0ZW52LnNlYXJjaElkcy5sZW5ndGggPiAwKSB7CisJCQlzaWRzID0gc2lkcy5jb25jYXQoZG9qby5ob3N0ZW52LnNlYXJjaElkcyk7CisJCX0KKworCQlpZigoZGpDb25maWcucGFyc2VXaWRnZXRzKXx8KHNpZHMubGVuZ3RoID4gMCkpeworCQkJaWYoZG9qby5ldmFsT2JqUGF0aCgiZG9qby53aWRnZXQuUGFyc2UiKSl7CisJCQkJLy8gd2UgbXVzdCBkbyB0aGlzIG9uIGEgZGVsYXkgdG8gYXZvaWQ6CisJCQkJLy8JaHR0cDovL3d3dy5zaGFmdGVrLm9yZy9ibG9nL2FyY2hpdmVzLzAwMDIxMi5odG1sCisJCQkJLy8gKElFIGJ1ZykKKwkJCQkJdmFyIHBhcnNlciA9IG5ldyBkb2pvLnhtbC5QYXJzZSgpOworCQkJCQlpZihzaWRzLmxlbmd0aCA+IDApeworCQkJCQkJZm9yKHZhciB4PTA7IHg8c2lkcy5sZW5ndGg7IHgrKyl7CisJCQkJCQkJdmFyIHRtcE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzaWRzW3hdKTsKKwkJCQkJCQlpZighdG1wTm9kZSl7IGNvbnRpbnVlOyB9CisJCQkJCQkJdmFyIGZyYWcgPSBwYXJzZXIucGFyc2VFbGVtZW50KHRtcE5vZGUsIG51bGwsIHRydWUpOworCQkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoZnJhZyk7CisJCQkJCQl9CisJCQkJCX1lbHNlIGlmKGRqQ29uZmlnLnBhcnNlV2lkZ2V0cyl7CisJCQkJCQl2YXIgZnJhZyAgPSBwYXJzZXIucGFyc2VFbGVtZW50KGRvam8uYm9keSgpLCBudWxsLCB0cnVlKTsKKwkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoZnJhZyk7CisJCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCl7CisJCWlmKCFkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlkb2pvLmhvc3RlbnYubWFrZVdpZGdldHMoKTsKKwkJfQorCX0pOworCisJdHJ5eworCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCWRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKCJ2IiwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiKTsKKwkJCWRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKCJ2XFw6KiIsICJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKSIpOworCQl9CisJfWNhdGNoKGUpeyB9CisKKwkvLyBzdHViLCBvdmVyLXJpZGRlbiBieSBkZWJ1Z2dpbmcgY29kZS4gVGhpcyB3aWxsIGF0IGxlYXN0IGtlZXAgdXMgZnJvbQorCS8vIGJyZWFraW5nIHdoZW4gaXQncyBub3QgaW5jbHVkZWQKKwlkb2pvLmhvc3RlbnYud3JpdGVJbmNsdWRlcyA9IGZ1bmN0aW9uKCl7fQorCisJLy9UT0RPQzogIEhPVyBUTyBET0MgVEhJUz8KKwkvLyBAZ2xvYmFsOiBkal9jdXJyZW50RG9jdW1lbnQKKwkvLyBzdW1tYXJ5OgorCS8vCQlDdXJyZW50IGRvY3VtZW50IG9iamVjdC4gJ2RqX2N1cnJlbnREb2N1bWVudCcgY2FuIGJlIG1vZGlmaWVkIGZvciB0ZW1wb3JhcnkgY29udGV4dCBzaGlmdGluZy4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLyAgICBkb2pvLmRvYygpIHJldHVybnMgZG9qby5jdXJyZW50RG9jdW1lbnQuCisJLy8JCVJlZmVyIHRvIGRvam8uZG9jKCkgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvICd3aW5kb3cuZG9jdW1lbnQnIHRvIGVuc3VyZSB5b3VyCisJLy8JCWNvZGUgcnVucyBjb3JyZWN0bHkgaW4gbWFuYWdlZCBjb250ZXh0cy4KKwlpZighZGpfdW5kZWYoImRvY3VtZW50IiwgdGhpcykpeworCQlkal9jdXJyZW50RG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50OworCX0KKworCWRvam8uZG9jID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybiB0aGUgZG9jdW1lbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZG9qby5nbG9iYWwoKQorCQlyZXR1cm4gZGpfY3VycmVudERvY3VtZW50OworCX0KKworCWRvam8uYm9keSA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm4gdGhlIGJvZHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBkb2pvLmRvYygpCisJCS8vIE5vdGU6IGRvY3VtZW50LmJvZHkgaXMgbm90IGRlZmluZWQgZm9yIGEgc3RyaWN0IHhodG1sIGRvY3VtZW50CisJCXJldHVybiBkb2pvLmRvYygpLmJvZHkgfHwgZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOworCX0KKworCWRvam8uYnlJZCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9pZCwgLypEb2N1bWVudEVsZW1lbnQqL2RvYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vIAkJc2ltaWxhciB0byBvdGhlciBsaWJyYXJ5J3MgIiQiIGZ1bmN0aW9uLCB0YWtlcyBhIHN0cmluZworCQkvLyAJCXJlcHJlc2VudGluZyBhIERPTSBpZCBvciBhIERvbU5vZGUgYW5kIHJldHVybnMgdGhlCisJCS8vIAkJY29ycmVzcG9uZGluZyBEb21Ob2RlLiBJZiBhIE5vZGUgaXMgcGFzc2VkLCB0aGlzIGZ1bmN0aW9uIGlzIGEKKwkJLy8gCQluby1vcC4gUmV0dXJucyBhIHNpbmdsZSBET00gbm9kZSBvciBudWxsLCB3b3JraW5nIGFyb3VuZAorCQkvLyAJCXNldmVyYWwgYnJvd3Nlci1zcGVjaWZpYyBidWdzIHRvIGRvIHNvLgorCQkvLyBpZDogRE9NIGlkIG9yIERPTSBOb2RlCisJCS8vIGRvYzoKKwkJLy8JCW9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiBkal9jdXJyZW50RG9jdW1lbnQuCisJCS8vCQlDYW4gYmUgdXNlZCB0byByZXRyZWl2ZSBub2RlIHJlZmVyZW5jZXMgZnJvbSBvdGhlciBkb2N1bWVudHMuCisJCWlmKChpZCkmJigodHlwZW9mIGlkID09ICJzdHJpbmciKXx8KGlkIGluc3RhbmNlb2YgU3RyaW5nKSkpeworCQkJaWYoIWRvYyl7IGRvYyA9IGRqX2N1cnJlbnREb2N1bWVudDsgfQorCQkJdmFyIGVsZSA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7CisJCQkvLyB3b3JrYXJvdW5kIGJ1ZyBpbiBJRSBhbmQgT3BlcmEgOC4yIHdoZXJlIGdldEVsZW1lbnRCeUlkIHJldHVybnMgd3JvbmcgZWxlbWVudAorCQkJaWYoZWxlICYmIChlbGUuaWQgIT0gaWQpICYmIGRvYy5hbGwpeworCQkJCWVsZSA9IG51bGw7CisJCQkJLy8gZ2V0IGFsbCBtYXRjaGluZyBlbGVtZW50cyB3aXRoIHRoaXMgaWQKKwkJCQllbGVzID0gZG9jLmFsbFtpZF07CisJCQkJaWYoZWxlcyl7CisJCQkJCS8vIGlmIG1vcmUgdGhhbiAxLCBjaG9vc2UgZmlyc3Qgd2l0aCB0aGUgY29ycmVjdCBpZAorCQkJCQlpZihlbGVzLmxlbmd0aCl7CisJCQkJCQlmb3IodmFyIGk9MDsgaTxlbGVzLmxlbmd0aDsgaSsrKXsKKwkJCQkJCQlpZihlbGVzW2ldLmlkID09IGlkKXsKKwkJCQkJCQkJZWxlID0gZWxlc1tpXTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkvLyByZXR1cm4gMSBhbmQgb25seSBlbGVtZW50CisJCQkJCX1lbHNleworCQkJCQkJZWxlID0gZWxlczsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlbGU7IC8vIERvbU5vZGUKKwkJfQorCQlyZXR1cm4gaWQ7IC8vIERvbU5vZGUKKwl9CisKKwlkb2pvLnNldENvbnRleHQgPSBmdW5jdGlvbigvKk9iamVjdCovZ2xvYmFsT2JqZWN0LCAvKkRvY3VtZW50RWxlbWVudCovZ2xvYmFsRG9jdW1lbnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgbWFueSBjb3JlIERvam8gZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoCisJCS8vCQluYW1lc3BhY2UgYW5kIERPTSBsb29rdXAsIGNoYW5naW5nIHRoZW0gdG8gd29yayBpbiBhIG5ldyBnbG9iYWwKKwkJLy8JCWNvbnRleHQuIFRoZSB2YXJpYmxlcyBkal9jdXJyZW50Q29udGV4dCBhbmQgZGpfY3VycmVudERvY3VtZW50CisJCS8vCQlhcmUgbW9kaWZpZWQgYXMgYSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorCQlkal9jdXJyZW50Q29udGV4dCA9IGdsb2JhbE9iamVjdDsKKwkJZGpfY3VycmVudERvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7CisJfTsKKworCWRvam8uX2ZpcmVDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBjb250ZXh0LCBjYkFyZ3VtZW50cyl7CisJCWlmKChjb250ZXh0KSYmKCh0eXBlb2YgY2FsbGJhY2sgPT0gInN0cmluZyIpfHwoY2FsbGJhY2sgaW5zdGFuY2VvZiBTdHJpbmcpKSl7CisJCQljYWxsYmFjaz1jb250ZXh0W2NhbGxiYWNrXTsKKwkJfQorCQlyZXR1cm4gKGNvbnRleHQgPyBjYWxsYmFjay5hcHBseShjb250ZXh0LCBjYkFyZ3VtZW50cyB8fCBbIF0pIDogY2FsbGJhY2soKSk7CisJfQorCisJZG9qby53aXRoR2xvYmFsID0gZnVuY3Rpb24oLypPYmplY3QqL2dsb2JhbE9iamVjdCwgLypGdW5jdGlvbiovY2FsbGJhY2ssIC8qT2JqZWN0PyovdGhpc09iamVjdCwgLypBcnJheT8qL2NiQXJndW1lbnRzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNhbGwgY2FsbGJhY2sgd2l0aCBnbG9iYWxPYmplY3QgYXMgZG9qby5nbG9iYWwoKSBhbmQgZ2xvYmFsT2JqZWN0LmRvY3VtZW50CisJCS8vCQlhcyBkb2pvLmRvYygpLiBJZiBwcm92aWRlZCwgZ2xvYmFsT2JqZWN0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YKKwkJLy8JCW9iamVjdCB0aGlzT2JqZWN0CisJCS8vIGRlc2NyaXB0aW9uOgorCQkvLwkJV2hlbiBjYWxsYmFjaygpIHJldHVybnMgb3IgdGhyb3dzIGFuIGVycm9yLCB0aGUgZG9qby5nbG9iYWwoKSBhbmQgZG9qby5kb2MoKSB3aWxsCisJCS8vCQliZSByZXN0b3JlZCB0byBpdHMgcHJldmlvdXMgc3RhdGUuCisJCXZhciBydmFsOworCQl2YXIgb2xkR2xvYiA9IGRqX2N1cnJlbnRDb250ZXh0OworCQl2YXIgb2xkRG9jID0gZGpfY3VycmVudERvY3VtZW50OworCQl0cnl7CisJCQlkb2pvLnNldENvbnRleHQoZ2xvYmFsT2JqZWN0LCBnbG9iYWxPYmplY3QuZG9jdW1lbnQpOworCQkJcnZhbCA9IGRvam8uX2ZpcmVDYWxsYmFjayhjYWxsYmFjaywgdGhpc09iamVjdCwgY2JBcmd1bWVudHMpOworCQl9ZmluYWxseXsKKwkJCWRvam8uc2V0Q29udGV4dChvbGRHbG9iLCBvbGREb2MpOworCQl9CisJCXJldHVybiBydmFsOworCX0KKworCWRvam8ud2l0aERvYyA9IGZ1bmN0aW9uICgvKk9iamVjdCovZG9jdW1lbnRPYmplY3QsIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QsIC8qQXJyYXk/Ki9jYkFyZ3VtZW50cykgeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbCBjYWxsYmFjayB3aXRoIGRvY3VtZW50T2JqZWN0IGFzIGRvam8uZG9jKCkuIElmIHByb3ZpZGVkLCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkCisJCS8vCQlpbiB0aGUgY29udGV4dCBvZiBvYmplY3QgdGhpc09iamVjdAorCQkvLyBkZXNjcmlwdGlvbjoKKwkJLy8JCVdoZW4gY2FsbGJhY2soKSByZXR1cm5zIG9yIHRocm93cyBhbiBlcnJvciwgdGhlIGRvam8uZG9jKCkgd2lsbAorCQkvLwkJYmUgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHN0YXRlLgorCQl2YXIgcnZhbDsKKwkJdmFyIG9sZERvYyA9IGRqX2N1cnJlbnREb2N1bWVudDsKKwkJdHJ5eworCQkJZGpfY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnRPYmplY3Q7CisJCQlydmFsID0gZG9qby5fZmlyZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzT2JqZWN0LCBjYkFyZ3VtZW50cyk7CisJCX1maW5hbGx5eworCQkJZGpfY3VycmVudERvY3VtZW50ID0gb2xkRG9jOworCQl9CisJCXJldHVybiBydmFsOworCX0KKworfSAvL2lmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKQorCisvL0xvYWQgZGVidWcgY29kZSBpZiBuZWNlc3NhcnkuCitkb2pvLnJlcXVpcmVJZigoZGpDb25maWdbImlzRGVidWciXSB8fCBkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0pLCAiZG9qby5kZWJ1ZyIpOworCisvL3dpbmRvdy53aWRnZXQgaXMgZm9yIERhc2hib2FyZCBkZXRlY3Rpb24KKy8vVGhlIGZ1bGwgY29uZGl0aW9uYWxzIGFyZSBzcGVsbGVkIG91dCB0byBhdm9pZCBpc3N1ZXMgZHVyaW5nIGJ1aWxkcy4KKy8vQnVpbGRzIG1heSBiZSBsb29raW5nIGZvciByZXF1aXJlL3JlcXVpcmVJZiBzdGF0ZW1lbnRzIGFuZCBwcm9jZXNzaW5nIHRoZW0uCitkb2pvLnJlcXVpcmVJZihkakNvbmZpZ1siZGVidWdBdEFsbENvc3RzIl0gJiYgIXdpbmRvdy53aWRnZXQgJiYgIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0sICJkb2pvLmJyb3dzZXJfZGVidWciKTsKK2Rvam8ucmVxdWlyZUlmKGRqQ29uZmlnWyJkZWJ1Z0F0QWxsQ29zdHMiXSAmJiAhd2luZG93LndpZGdldCAmJiBkakNvbmZpZ1sidXNlWERvbWFpbiJdLCAiZG9qby5icm93c2VyX2RlYnVnX3hkIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5zdHJpbmcuY29tbW9uIik7CisKK2Rvam8uc3RyaW5nLnRyaW0gPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zdHIsIC8qIGludGVnZXI/ICovd2gpeworCS8vCXN1bW1hcnkKKwkvLwlUcmltIHdoaXRlc3BhY2UgZnJvbSBzdHIuICBJZiB3aCA+IDAsIHRyaW0gZnJvbSBzdGFydCwgaWYgd2ggPCAwLCB0cmltIGZyb20gZW5kLCBlbHNlIGJvdGgKKwlpZighc3RyLnJlcGxhY2UpeyByZXR1cm4gc3RyOyB9CisJaWYoIXN0ci5sZW5ndGgpeyByZXR1cm4gc3RyOyB9CisJdmFyIHJlID0gKHdoID4gMCkgPyAoL15ccysvKSA6ICh3aCA8IDApID8gKC9ccyskLykgOiAoL15ccyt8XHMrJC9nKTsKKwlyZXR1cm4gc3RyLnJlcGxhY2UocmUsICIiKTsJLy8Jc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnRyaW1TdGFydCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0cikgeworCS8vCXN1bW1hcnkKKwkvLwlUcmltIHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiAnc3RyJworCXJldHVybiBkb2pvLnN0cmluZy50cmltKHN0ciwgMSk7CS8vCXN0cmluZworfQorCitkb2pvLnN0cmluZy50cmltRW5kID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyKSB7CisJLy8Jc3VtbWFyeQorCS8vCVRyaW0gd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mICdzdHInCisJcmV0dXJuIGRvam8uc3RyaW5nLnRyaW0oc3RyLCAtMSk7Cit9CisKK2Rvam8uc3RyaW5nLnJlcGVhdCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0ciwgLyogaW50ZWdlciAqL2NvdW50LCAvKiBzdHJpbmc/ICovc2VwYXJhdG9yKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybiAnc3RyJyByZXBlYXRlZCAnY291bnQnIHRpbWVzLCBvcHRpb25hbGx5IHBsYWNpbmcgJ3NlcGFyYXRvcicgYmV0d2VlbiBlYWNoIHJlcAorCXZhciBvdXQgPSAiIjsKKwlmb3IodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlvdXQgKz0gc3RyOworCQlpZihzZXBhcmF0b3IgJiYgaSA8IGNvdW50IC0gMSkgeworCQkJb3V0ICs9IHNlcGFyYXRvcjsKKwkJfQorCX0KKwlyZXR1cm4gb3V0OwkvLwlzdHJpbmcKK30KKworZG9qby5zdHJpbmcucGFkID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyLCAvKiBpbnRlZ2VyICovbGVuLyo9MiovLCAvKiBzdHJpbmcgKi8gYy8qPScwJyovLCAvKiBpbnRlZ2VyICovZGlyLyo9MSovKSB7CisJLy8Jc3VtbWFyeQorCS8vCVBhZCAnc3RyJyB0byBndWFyYW50ZWUgdGhhdCBpdCBpcyBhdCBsZWFzdCAnbGVuJyBsZW5ndGggd2l0aCB0aGUgY2hhcmFjdGVyICdjJyBhdCBlaXRoZXIgdGhlIAorCS8vCXN0YXJ0IChkaXI9MSkgb3IgZW5kIChkaXI9LTEpIG9mIHRoZSBzdHJpbmcKKwl2YXIgb3V0ID0gU3RyaW5nKHN0cik7CisJaWYoIWMpIHsKKwkJYyA9ICcwJzsKKwl9CisJaWYoIWRpcikgeworCQlkaXIgPSAxOworCX0KKwl3aGlsZShvdXQubGVuZ3RoIDwgbGVuKSB7CisJCWlmKGRpciA+IDApIHsKKwkJCW91dCA9IGMgKyBvdXQ7CisJCX0gZWxzZSB7CisJCQlvdXQgKz0gYzsKKwkJfQorCX0KKwlyZXR1cm4gb3V0OwkvLwlzdHJpbmcKK30KKworZG9qby5zdHJpbmcucGFkTGVmdCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3N0ciwgLyogaW50ZWdlciAqL2xlbiwgLyogc3RyaW5nICovYykgeworCS8vCXN1bW1hcnkKKwkvLwlzYW1lIGFzIGRvam8uc3RyaW5nLnBhZChzdHIsIGxlbiwgYywgMSkKKwlyZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAxKTsJLy8Jc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnBhZFJpZ2h0ID0gZnVuY3Rpb24oLyogc3RyaW5nICovc3RyLCAvKiBpbnRlZ2VyICovbGVuLCAvKiBzdHJpbmcgKi9jKSB7CisJLy8Jc3VtbWFyeQorCS8vCXNhbWUgYXMgZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAtMSkKKwlyZXR1cm4gZG9qby5zdHJpbmcucGFkKHN0ciwgbGVuLCBjLCAtMSk7CS8vCXN0cmluZworfQorCitkb2pvLnByb3ZpZGUoImRvam8uc3RyaW5nIik7CisKKworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuY29tbW9uIik7CisKK2Rvam8ubGFuZy5pbmhlcml0cyA9IGZ1bmN0aW9uKC8qRnVuY3Rpb24qL3N1YmNsYXNzLCAvKkZ1bmN0aW9uKi9zdXBlcmNsYXNzKXsKKwkvLyBzdW1tYXJ5OiBTZXQgdXAgaW5oZXJpdGFuY2UgYmV0d2VlbiB0d28gY2xhc3Nlcy4KKwlpZighZG9qby5sYW5nLmlzRnVuY3Rpb24oc3VwZXJjbGFzcykpeyAKKwkJZG9qby5yYWlzZSgiZG9qby5pbmhlcml0czogc3VwZXJjbGFzcyBhcmd1bWVudCBbIitzdXBlcmNsYXNzKyJdIG11c3QgYmUgYSBmdW5jdGlvbiAoc3ViY2xhc3M6IFsiK3N1YmNsYXNzKyInXSIpOworCX0KKwlzdWJjbGFzcy5wcm90b3R5cGUgPSBuZXcgc3VwZXJjbGFzcygpOworCXN1YmNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YmNsYXNzOworCXN1YmNsYXNzLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLnByb3RvdHlwZTsKKwkvLyBERVBSRUNBVEVEOiBzdXBlciBpcyBhIHJlc2VydmVkIHdvcmQsIHVzZSAnc3VwZXJjbGFzcycKKwlzdWJjbGFzc1snc3VwZXInXSA9IHN1cGVyY2xhc3MucHJvdG90eXBlOworfQorCitkb2pvLmxhbmcuX21peGluID0gZnVuY3Rpb24oLypPYmplY3QqLyBvYmosIC8qT2JqZWN0Ki8gcHJvcHMpeworCS8vIHN1bW1hcnk6CisJLy8JCUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gb2JqLiBUaGlzIGFkZGl0aW9uIGlzCisJLy8JCSJwcm90b3R5cGUgZXh0ZW5zaW9uIHNhZmUiLCBzbyB0aGF0IGluc3RhbmNlcyBvZiBvYmplY3RzIHdpbGwgbm90CisJLy8JCXBhc3MgYWxvbmcgcHJvdG90eXBlIGRlZmF1bHRzLgorCXZhciB0b2JqID0ge307CisJZm9yKHZhciB4IGluIHByb3BzKXsKKwkJLy8gdGhlICJ0b2JqIiBjb25kaXRpb24gYXZvaWQgY29weWluZyBwcm9wZXJ0aWVzIGluICJwcm9wcyIKKwkJLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4gIEZvciBleGFtcGxlLCBpZiBvYmogaGFzIGEgY3VzdG9tCisJCS8vIHRvU3RyaW5nKCkgbWV0aG9kLCBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QKKwkJLy8gdGhhdCBwcm9wcyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG95cGUKKwkJaWYoKHR5cGVvZiB0b2JqW3hdID09ICJ1bmRlZmluZWQiKSB8fCAodG9ialt4XSAhPSBwcm9wc1t4XSkpeworCQkJb2JqW3hdID0gcHJvcHNbeF07CisJCX0KKwl9CisJLy8gSUUgZG9lc24ndCByZWNvZ25pemUgY3VzdG9tIHRvU3RyaW5ncyBpbiBmb3IuLmluCisJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSAKKwkJJiYgKHR5cGVvZihwcm9wc1sidG9TdHJpbmciXSkgPT0gImZ1bmN0aW9uIikKKwkJJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IG9ialsidG9TdHJpbmciXSkKKwkJJiYgKHByb3BzWyJ0b1N0cmluZyJdICE9IHRvYmpbInRvU3RyaW5nIl0pKQorCXsKKwkJb2JqLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7CisJfQorCXJldHVybiBvYmo7IC8vIE9iamVjdAorfQorCitkb2pvLmxhbmcubWl4aW4gPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKk9iamVjdC4uLiovcHJvcHMpeworCS8vIHN1bW1hcnk6CUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gb2JqLiAKKwlmb3IodmFyIGk9MSwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKyl7CisJCWRvam8ubGFuZy5fbWl4aW4ob2JqLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gb2JqOyAvLyBPYmplY3QKK30KKworZG9qby5sYW5nLmV4dGVuZCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gY29uc3RydWN0b3IsIC8qT2JqZWN0Li4uKi8gcHJvcHMpeworCS8vIHN1bW1hcnk6CisJLy8JCUFkZHMgYWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgcHJvcHMgdG8gY29uc3RydWN0b3IncworCS8vCQlwcm90b3R5cGUsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgaW5zdGFuY2VzIGNyZWF0ZWQgd2l0aAorCS8vCQljb25zdHJ1Y3Rvci4KKwlmb3IodmFyIGk9MSwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKyl7CisJCWRvam8ubGFuZy5fbWl4aW4oY29uc3RydWN0b3IucHJvdG90eXBlLCBhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gY29uc3RydWN0b3I7IC8vIE9iamVjdAorfQorCisvLyBQcm9tb3RlIHRvIGRvam8gbW9kdWxlCitkb2pvLmluaGVyaXRzID0gZG9qby5sYW5nLmluaGVyaXRzOworLy9kb2pvLmxhbmcuX21peGluID0gZG9qby5sYW5nLl9taXhpbjsKK2Rvam8ubWl4aW4gPSBkb2pvLmxhbmcubWl4aW47Citkb2pvLmV4dGVuZCA9IGRvam8ubGFuZy5leHRlbmQ7CisKK2Rvam8ubGFuZy5maW5kID0gZnVuY3Rpb24oCS8qQXJyYXkqLwkJYXJyYXksIAorCQkJCQkJCS8qT2JqZWN0Ki8JCXZhbHVlLAorCQkJCQkJCS8qQm9vbGVhbj8qLwlpZGVudGl0eSwKKwkJCQkJCQkvKkJvb2xlYW4/Ki8JZmluZExhc3QpeworCS8vIHN1bW1hcnk6CQorCS8vCQlSZXR1cm4gdGhlIGluZGV4IG9mIHZhbHVlIGluIGFycmF5LCByZXR1cm5pbmcgLTEgaWYgbm90IGZvdW5kLgorCS8vIGFycmF5OiBqdXN0IHdoYXQgeW91IHRoaW5rCisJLy8gdmFsdWU6IHRoZSB2YWx1ZSB0byBsb2NhdGUKKwkvLyBpZGVudGl0eTogCisJLy8JCUlmIHRydWUsIG1hdGNoZXMgd2l0aCBpZGVudGl0eSBjb21wYXJpc29uICg9PT0pLiBJZiBmYWxzZSwgdXNlcworCS8vCQlub3JtYWwgY29tcGFyaXNvbiAoPT0pLgorCS8vIGZpbmRMYXN0OiAKKwkvLwkJSWYgdHJ1ZSwgcmV0dXJucyBpbmRleCBvZiBsYXN0IGluc3RhbmNlIG9mIHZhbHVlLgorCS8vIGV4YW1wbGVzOgorCS8vCQlmaW5kKGFycmF5LCB2YWx1ZVssIGlkZW50aXR5IFtmaW5kTGFzdF1dKSAvLyByZWNvbW1lbmRlZAorIAkvLwkJZmluZCh2YWx1ZSwgYXJyYXlbLCBpZGVudGl0eSBbZmluZExhc3RdXSkgLy8gZGVwcmVjYXRlZAorCQkJCQkJCQorCS8vIHN1cHBvcnQgYm90aCAoYXJyYXksIHZhbHVlKSBhbmQgKHZhbHVlLCBhcnJheSkKKwlpZighZG9qby5sYW5nLmlzQXJyYXlMaWtlKGFycmF5KSAmJiBkb2pvLmxhbmcuaXNBcnJheUxpa2UodmFsdWUpKSB7CisJCWRvam8uZGVwcmVjYXRlZCgnZG9qby5sYW5nLmZpbmQodmFsdWUsIGFycmF5KScsICd1c2UgZG9qby5sYW5nLmZpbmQoYXJyYXksIHZhbHVlKSBpbnN0ZWFkJywgIjAuNSIpOworCQl2YXIgdGVtcCA9IGFycmF5OworCQlhcnJheSA9IHZhbHVlOworCQl2YWx1ZSA9IHRlbXA7CisJfQorCXZhciBpc1N0cmluZyA9IGRvam8ubGFuZy5pc1N0cmluZyhhcnJheSk7CisJaWYoaXNTdHJpbmcpIHsgYXJyYXkgPSBhcnJheS5zcGxpdCgiIik7IH0KKworCWlmKGZpbmRMYXN0KSB7CisJCXZhciBzdGVwID0gLTE7CisJCXZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJdmFyIGVuZCA9IC0xOworCX0gZWxzZSB7CisJCXZhciBzdGVwID0gMTsKKwkJdmFyIGkgPSAwOworCQl2YXIgZW5kID0gYXJyYXkubGVuZ3RoOworCX0KKwlpZihpZGVudGl0eSl7CisJCXdoaWxlKGkgIT0gZW5kKSB7CisJCQlpZihhcnJheVtpXSA9PT0gdmFsdWUpeyByZXR1cm4gaTsgfQorCQkJaSArPSBzdGVwOworCQl9CisJfWVsc2V7CisJCXdoaWxlKGkgIT0gZW5kKSB7CisJCQlpZihhcnJheVtpXSA9PSB2YWx1ZSl7IHJldHVybiBpOyB9CisJCQlpICs9IHN0ZXA7CisJCX0KKwl9CisJcmV0dXJuIC0xOwkvLyBudW1iZXIKK30KKworZG9qby5sYW5nLmluZGV4T2YgPSBkb2pvLmxhbmcuZmluZDsKKworZG9qby5sYW5nLmZpbmRMYXN0ID0gZnVuY3Rpb24oLypBcnJheSovYXJyYXksIC8qT2JqZWN0Ki92YWx1ZSwgLypib29sZWFuPyovaWRlbnRpdHkpeworCS8vIHN1bW1hcnk6CisJLy8JCVJldHVybiBpbmRleCBvZiBsYXN0IG9jY3VyYW5jZSBvZiB2YWx1ZSBpbiBhcnJheSwgcmV0dXJuaW5nIC0xIGlmCisJLy8JCW5vdCBmb3VuZC4gVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBkb2pvLmxhbmcuZmluZCgpIHdpdGggYSB0cnVlCisJLy8JCXZhbHVlIGZvciBpdHMgImZpbmRMYXN0IiBwYXJhbWV0ZXIuCisJLy8gaWRlbnRpdHk6CisJLy8JCUlmIHRydWUsIG1hdGNoZXMgd2l0aCBpZGVudGl0eSBjb21wYXJpc29uICg9PT0pLiBJZiBmYWxzZSwgdXNlcworCS8vCQlub3JtYWwgY29tcGFyaXNvbiAoPT0pLgorCXJldHVybiBkb2pvLmxhbmcuZmluZChhcnJheSwgdmFsdWUsIGlkZW50aXR5LCB0cnVlKTsgLy8gbnVtYmVyCit9CisKK2Rvam8ubGFuZy5sYXN0SW5kZXhPZiA9IGRvam8ubGFuZy5maW5kTGFzdDsKKworZG9qby5sYW5nLmluQXJyYXkgPSBmdW5jdGlvbihhcnJheSAvKkFycmF5Ki8sIHZhbHVlIC8qT2JqZWN0Ki8peworCS8vIHN1bW1hcnk6CVJldHVybiB0cnVlIGlmIHZhbHVlIGlzIHByZXNlbnQgaW4gYXJyYXkuCisJcmV0dXJuIGRvam8ubGFuZy5maW5kKGFycmF5LCB2YWx1ZSkgPiAtMTsgLy8gYm9vbGVhbgorfQorCisvKioKKyAqIFBhcnRpYWwgaW1wbG1lbnRhdGlvbiBvZiBpcyogZnVuY3Rpb25zIGZyb20KKyAqIGh0dHA6Ly93d3cuY3JvY2tmb3JkLmNvbS9qYXZhc2NyaXB0L3JlY29tbWVuZC5odG1sCisgKiBOT1RFOiBzb21lIG9mIHRoZXNlIG1heSBub3QgYmUgdGhlIGJlc3QgdGhpbmcgdG8gdXNlIGluIGFsbCBzaXR1YXRpb25zCisgKiBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIGNvcmUgSlMgYW5kIHRoZXJlZm9yZSBjYW4ndCB3b3JrIGluIGV2ZXJ5IGNhc2UuCisgKiBTZWUgV0FSTklORyBtZXNzYWdlcyBpbmxpbmUgZm9yIHRpcHMuCisgKgorICogVGhlIGZvbGxvd2luZyBpcyogZnVuY3Rpb25zIGFyZSBmYWlybHkgInNhZmUiCisgKi8KKworZG9qby5sYW5nLmlzT2JqZWN0ID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBPYmplY3QsIEFycmF5IG9yIEZ1bmN0aW9uLgorCWlmKHR5cGVvZiBpdCA9PSAidW5kZWZpbmVkIil7IHJldHVybiBmYWxzZTsgfQorCXJldHVybiAodHlwZW9mIGl0ID09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsIHx8IGRvam8ubGFuZy5pc0FycmF5KGl0KSB8fCBkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkpOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0FycmF5ID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBBcnJheS4KKwlyZXR1cm4gKGl0ICYmIGl0IGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGl0ID09ICJhcnJheSIpOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0FycmF5TGlrZSA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJLy8gc3VtbWFyeToJCisJLy8JCVJldHVybiB0cnVlIGlmIGl0IGNhbiBiZSB1c2VkIGFzIGFuIGFycmF5IChpLmUuIGlzIGFuIG9iamVjdCB3aXRoCisJLy8JCWFuIGludGVnZXIgbGVuZ3RoIHByb3BlcnR5KS4KKwlpZigoIWl0KXx8KGRvam8ubGFuZy5pc1VuZGVmaW5lZChpdCkpKXsgcmV0dXJuIGZhbHNlOyB9CisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGl0KSl7IHJldHVybiBmYWxzZTsgfQorCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGl0KSl7IHJldHVybiBmYWxzZTsgfSAvLyBrZWVwcyBvdXQgYnVpbHQtaW4gY29uc3RydWN0b3JzIChOdW1iZXIsIFN0cmluZywgLi4uKSB3aGljaCBoYXZlIGxlbmd0aCBwcm9wZXJ0aWVzCisJaWYoZG9qby5sYW5nLmlzQXJyYXkoaXQpKXsgcmV0dXJuIHRydWU7IH0KKwkvLyBmb3JtIG5vZGUgaXRzZWxmIGlzIEFycmF5TGlrZSwgYnV0IG5vdCBhbHdheXMgaXRlcmFibGUuIFVzZSBmb3JtLmVsZW1lbnRzIGluc3RlYWQuCisJaWYoKGl0LnRhZ05hbWUpJiYoaXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0nZm9ybScpKXsgcmV0dXJuIGZhbHNlOyB9CisJaWYoZG9qby5sYW5nLmlzTnVtYmVyKGl0Lmxlbmd0aCkgJiYgaXNGaW5pdGUoaXQubGVuZ3RoKSl7IHJldHVybiB0cnVlOyB9CisJcmV0dXJuIGZhbHNlOyAvLyBCb29sZWFuCit9CisKK2Rvam8ubGFuZy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIEZ1bmN0aW9uLgorCXJldHVybiAoaXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgaXQgPT0gImZ1bmN0aW9uIik7IC8vIEJvb2xlYW4KK307CisKKyhmdW5jdGlvbigpeworCS8vIHdlYmtpdCB0cmVhdHMgTm9kZUxpc3QgYXMgYSBmdW5jdGlvbiwgd2hpY2ggaXMgYmFkCisJaWYoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkmJihkb2pvLnJlbmRlci5odG1sWyJzYWZhcmkiXSkpeworCQlkb2pvLmxhbmcuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJCQlpZigodHlwZW9mKGl0KSA9PSAiZnVuY3Rpb24iKSAmJiAoaXQgPT0gIltvYmplY3QgTm9kZUxpc3RdIikpIHsgcmV0dXJuIGZhbHNlOyB9CisJCQlyZXR1cm4gKGl0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHlwZW9mIGl0ID09ICJmdW5jdGlvbiIpOyAvLyBCb29sZWFuCisJCX0KKwl9Cit9KSgpOworCitkb2pvLmxhbmcuaXNTdHJpbmcgPSBmdW5jdGlvbigvKmFueXRoaW5nKi8gaXQpeworCS8vIHN1bW1hcnk6CVJldHVybiB0cnVlIGlmIGl0IGlzIGEgU3RyaW5nLgorCXJldHVybiAodHlwZW9mIGl0ID09ICJzdHJpbmciIHx8IGl0IGluc3RhbmNlb2YgU3RyaW5nKTsKK30KKworZG9qby5sYW5nLmlzQWxpZW4gPSBmdW5jdGlvbigvKmFueXRoaW5nKi8gaXQpeworCS8vIHN1bW1hcnk6IFJldHVybiB0cnVlIGlmIGl0IGlzIG5vdCBhIGJ1aWx0LWluIGZ1bmN0aW9uLiBGYWxzZSBpZiBub3QuCisJaWYoIWl0KXsgcmV0dXJuIGZhbHNlOyB9CisJcmV0dXJuICFkb2pvLmxhbmcuaXNGdW5jdGlvbihpdCkgJiYgL1x7XHMqXFtuYXRpdmUgY29kZVxdXHMqXH0vLnRlc3QoU3RyaW5nKGl0KSk7IC8vIEJvb2xlYW4KK30KKworZG9qby5sYW5nLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKC8qYW55dGhpbmcqLyBpdCl7CisJLy8gc3VtbWFyeToJUmV0dXJuIHRydWUgaWYgaXQgaXMgYSBCb29sZWFuLgorCXJldHVybiAoaXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHR5cGVvZiBpdCA9PSAiYm9vbGVhbiIpOyAvLyBCb29sZWFuCit9CisKKy8qKgorICogVGhlIGZvbGxvd2luZyBpcyoqKigpIGZ1bmN0aW9ucyBhcmUgc29tZXdoYXQgInVuc2FmZSIuIEZvcnR1bmF0ZWx5LAorICogdGhlcmUgYXJlIHdvcmthcm91bmRzIHRoZSB0aGUgbGFuZ3VhZ2UgcHJvdmlkZXMgYW5kIGFyZSBtZW50aW9uZWQKKyAqIGluIHRoZSBXQVJOSU5HIG1lc3NhZ2VzLgorICoKKyAqLworZG9qby5sYW5nLmlzTnVtYmVyID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OglSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIG51bWJlci4KKwkvLyBkZXNjcmlwdGlvbjogCisJLy8JCVdBUk5JTkcgLSBJbiBtb3N0IGNhc2VzLCBpc05hTihpdCkgaXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QKKwkvLyAJCXNvbWV0aGluZyBpcyBhIG51bWJlciBvciBjYW4gYmUgdXNlZCBhcyBzdWNoLiBGb3IgZXhhbXBsZSwgYSBudW1iZXIgb3Igc3RyaW5nCisJLy8gCQljYW4gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aGVuIGFjY2Vzc2luZyBhcnJheSBpdGVtcyAoYXJyYXlbIjEiXSBpcyB0aGUgc2FtZSBhcworCS8vIAkJYXJyYXlbMV0pIGFuZCBpc05hTiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYm90aCB2YWx1ZXMgKCIxIiBhbmQgMSkuIEhvd2V2ZXIsCisJLy8gCQlpc051bWJlcigiMSIpICB3aWxsIHJldHVybiBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IG5vdCB0b28gdXNlZnVsLgorCS8vIAkJQWxzbywgaXNOdW1iZXIoTmFOKSByZXR1cm5zIHRydWUsIGFnYWluLCB0aGlzIGlzbid0IGdlbmVyYWxseSB1c2VmdWwsIGJ1dCB0aGVyZQorCS8vIAkJYXJlIGNvcm5lciBjYXNlcyAobGlrZSB3aGVuIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHR3byB0aGluZ3MgYXJlIHJlYWxseQorCS8vIAkJdGhlIHNhbWUgdHlwZSBvZiB0aGluZykuIFRoYXQgaXMgcmVhbGx5IHdoZXJlIGlzTnVtYmVyICJzaGluZXMiLgorCS8vCisJLy8gUmVjb21tZW5kYXRpb24gLSBVc2UgaXNOYU4oaXQpIHdoZW4gcG9zc2libGUKKwkKKwlyZXR1cm4gKGl0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHR5cGVvZiBpdCA9PSAibnVtYmVyIik7IC8vIEJvb2xlYW4KK30KKworLyoKKyAqIEZJWE1FOiBTaG91bGQgaXNVbmRlZmluZWQgZ28gYXdheSBzaW5jZSBpdCBpcyBlcnJvciBwcm9uZT8KKyAqLworZG9qby5sYW5nLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24oLyphbnl0aGluZyovIGl0KXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBub3QgZGVmaW5lZC4KKwkvLyBkZXNjcmlwdGlvbjogCisJLy8JCVdBUk5JTkcgLSBJbiBzb21lIGNhc2VzLCBpc1VuZGVmaW5lZCB3aWxsIG5vdCBiZWhhdmUgYXMgeW91CisJLy8gCQltaWdodCBleHBlY3QuIElmIHlvdSBkbyBpc1VuZGVmaW5lZChmb28pIGFuZCB0aGVyZSBpcyBubyBlYXJsaWVyCisJLy8gCQlyZWZlcmVuY2UgdG8gZm9vLCBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWZvcmUgaXNVbmRlZmluZWQgaXMKKwkvLyAJCWNhbGxlZC4gSXQgYmVoYXZlcyBjb3JyZWN0bHkgaWYgeW91IHNjb3BlIHlvciBvYmplY3QgZmlyc3QsIGkuZS4KKwkvLyAJCWlzVW5kZWZpbmVkKGZvby5iYXIpIHdoZXJlIGZvbyBpcyBhbiBvYmplY3QgYW5kIGJhciBpc24ndCBhCisJLy8gCQlwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LgorCS8vCisJLy8gUmVjb21tZW5kYXRpb24gLSBVc2UgdHlwZW9mIGZvbyA9PSAidW5kZWZpbmVkIiB3aGVuIHBvc3NpYmxlCisKKwlyZXR1cm4gKCh0eXBlb2YoaXQpID09ICJ1bmRlZmluZWQiKSYmKGl0ID09IHVuZGVmaW5lZCkpOyAvLyBCb29sZWFuCit9CisKKy8vIGVuZCBDcm9ja2ZvcmQgZnVuY3Rpb25zCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLmV4dHJhcyIpOworCisKKworZG9qby5sYW5nLnNldFRpbWVvdXQgPSBmdW5jdGlvbigvKkZ1bmN0aW9uKi9mdW5jLCAvKmludCovZGVsYXkgLyosIC4uLiovKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlTZXRzIGEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGluIGEgZ2l2ZW4KKwkvLwkJY29udGV4dCB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50cy4KKwkvLyB1c2FnZToKKwkvLwkJZG9qby5sYW5nLnNldFRpbWVvdXQoT2JqZWN0IGNvbnRleHQsIGZ1bmN0aW9uIGZ1bmMsIG51bWJlciBkZWxheVssIGFyZzFbLCAuLi5dXSk7CisJLy8JCWRvam8ubGFuZy5zZXRUaW1lb3V0KGZ1bmN0aW9uIGZ1bmMsIG51bWJlciBkZWxheVssIGFyZzFbLCAuLi5dXSk7CisKKwl2YXIgY29udGV4dCA9IHdpbmRvdywgYXJnc1N0YXJ0ID0gMjsKKwlpZighZG9qby5sYW5nLmlzRnVuY3Rpb24oZnVuYykpeworCQljb250ZXh0ID0gZnVuYzsKKwkJZnVuYyA9IGRlbGF5OworCQlkZWxheSA9IGFyZ3VtZW50c1syXTsKKwkJYXJnc1N0YXJ0Kys7CisJfQorCisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGZ1bmMpKXsKKwkJZnVuYyA9IGNvbnRleHRbZnVuY107CisJfQorCQorCXZhciBhcmdzID0gW107CisJZm9yICh2YXIgaSA9IGFyZ3NTdGFydDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7CisJCWFyZ3MucHVzaChhcmd1bWVudHNbaV0pOworCX0KKwlyZXR1cm4gZG9qby5nbG9iYWwoKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7IH0sIGRlbGF5KTsgLy8gaW50Cit9CisKK2Rvam8ubGFuZy5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbigvKmludCovdGltZXIpeworCS8vIHN1bW1hcnk6IGNsZWFycyB0aW1lciBieSBudW1iZXIgZnJvbSB0aGUgZXhlY3V0aW9uIHF1ZXVlCisKKwkvLyBGSVhNRToKKwkvLwkJd2h5IGRvIHdlIGhhdmUgdGhpcyBmdW5jdGlvbj8gSXQncyBub3QgcG9ydGFibGUgb3V0c2lkZSBvZiBicm93c2VyCisJLy8JCWVudmlyb25tZW50cyBhbmQgaXQncyBhIHN0dXBpZCB3cmFwcGVyIG9uIHNvbWV0aGluZyB0aGF0IGJyb3dzZXJzCisJLy8JCXByb3ZpZGUgYW55d2F5LgorCWRvam8uZ2xvYmFsKCkuY2xlYXJUaW1lb3V0KHRpbWVyKTsKK30KKworZG9qby5sYW5nLmdldE5hbWVJbk9iaiA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9ucywgLyp1bmtub3duKi9pdGVtKXsKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJbG9va3MgZm9yIGEgdmFsdWUgaW4gdGhlIG9iamVjdCBucyB3aXRoIGEgdmFsdWUgbWF0Y2hpbmcgaXRlbSBhbmQKKwkvLwkJcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZQorCS8vIG5zOiBpZiBudWxsLCBkal9nbG9iYWwgaXMgdXNlZAorCS8vIGl0ZW06IHZhbHVlIHRvIHJldHVybiBhIG5hbWUgZm9yCisJaWYoIW5zKXsgbnMgPSBkal9nbG9iYWw7IH0KKworCWZvcih2YXIgeCBpbiBucyl7CisJCWlmKG5zW3hdID09PSBpdGVtKXsKKwkJCXJldHVybiBuZXcgU3RyaW5nKHgpOyAvLyBTdHJpbmcKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsgLy8gbnVsbAorfQorCitkb2pvLmxhbmcuc2hhbGxvd0NvcHkgPSBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKkJvb2xlYW4/Ki9kZWVwKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQljb3BpZXMgb2JqZWN0IG9iaiBvbmUgbGV2ZWwgZGVlcCwgb3IgZnVsbCBkZXB0aCBpZiBkZWVwIGlzIHRydWUKKwl2YXIgaSwgcmV0OwkKKworCWlmKG9iaiA9PT0gbnVsbCl7IC8qb2JqOiBudWxsKi8gcmV0dXJuIG51bGw7IH0gLy8gbnVsbAorCQorCWlmKGRvam8ubGFuZy5pc09iamVjdChvYmopKXsKKwkJLy8gb2JqOiBPYmplY3QJCisJCXJldCA9IG5ldyBvYmouY29uc3RydWN0b3IoKTsKKwkJZm9yKGkgaW4gb2JqKXsKKwkJCWlmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChyZXRbaV0pKXsKKwkJCQlyZXRbaV0gPSBkZWVwID8gZG9qby5sYW5nLnNoYWxsb3dDb3B5KG9ialtpXSwgZGVlcCkgOiBvYmpbaV07CisJCQl9CisJCX0KKwl9ZWxzZSBpZihkb2pvLmxhbmcuaXNBcnJheShvYmopKXsKKwkJLy8gb2JqOiBBcnJheQorCQlyZXQgPSBbXTsKKwkJZm9yKGk9MDsgaTxvYmoubGVuZ3RoOyBpKyspeworCQkJcmV0W2ldID0gZGVlcCA/IGRvam8ubGFuZy5zaGFsbG93Q29weShvYmpbaV0sIGRlZXApIDogb2JqW2ldOworCQl9CisJfWVsc2V7CisJCS8vIG9iajogT2JqZWN0CisJCXJldCA9IG9iajsKKwl9CisKKwlyZXR1cm4gcmV0OyAvLyBPYmplY3QKK30KKworZG9qby5sYW5nLmZpcnN0VmFsdWVkID0gZnVuY3Rpb24oLyogLi4uICovKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgaXNuJ3QgdW5kZWZpbmVkCisKKwlmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJaWYodHlwZW9mIGFyZ3VtZW50c1tpXSAhPSAidW5kZWZpbmVkIil7CisJCQlyZXR1cm4gYXJndW1lbnRzW2ldOyAvLyBPYmplY3QKKwkJfQorCX0KKwlyZXR1cm4gdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQKK30KKworZG9qby5sYW5nLmdldE9ialBhdGhWYWx1ZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9vYmpwYXRoLCAvKk9iamVjdD8qL2NvbnRleHQsIC8qQm9vbGVhbj8qL2NyZWF0ZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJR2V0cyBhIHZhbHVlIGZyb20gYSByZWZlcmVuY2Ugc3BlY2lmaWVkIGFzIGEgc3RyaW5nIGRlc2NyaXB0b3IsCisJLy8JCShlLmcuICJBLkIiKSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KKwkvLyBjb250ZXh0OiBpZiBub3Qgc3BlY2lmaWVkLCBkal9nbG9iYWwgaXMgdXNlZAorCS8vIGNyZWF0ZTogaWYgdHJ1ZSwgdW5kZWZpbmVkIG9iamVjdHMgaW4gdGhlIHBhdGggYXJlIGNyZWF0ZWQuCisJd2l0aChkb2pvLnBhcnNlT2JqUGF0aChvYmpwYXRoLCBjb250ZXh0LCBjcmVhdGUpKXsKKwkJcmV0dXJuIGRvam8uZXZhbFByb3AocHJvcCwgb2JqLCBjcmVhdGUpOyAvLyBPYmplY3QKKwl9Cit9CisKK2Rvam8ubGFuZy5zZXRPYmpQYXRoVmFsdWUgPSBmdW5jdGlvbigvKlN0cmluZyovb2JqcGF0aCwgLyphbnl0aGluZyovdmFsdWUsIC8qT2JqZWN0PyovY29udGV4dCwgLypCb29sZWFuPyovY3JlYXRlKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlTZXRzIGEgdmFsdWUgb24gYSByZWZlcmVuY2Ugc3BlY2lmaWVkIGFzIGEgc3RyaW5nIGRlc2NyaXB0b3IuCisJLy8JCShlLmcuICJBLkIiKSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4gVGhpcyBpcyBzaW1pbGFyIHRvIHN0cmFpZ2h0CisJLy8JCWFzc2lnbm1lbnQsIGV4Y2VwdCB0aGF0IHRoZSBvYmplY3Qgc3RydWN0dXJlIGluIHF1ZXN0aW9uIGNhbgorCS8vCQlvcHRpb25hbGx5IGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisJLy8JY29udGV4dDogaWYgbm90IHNwZWNpZmllZCwgZGpfZ2xvYmFsIGlzIHVzZWQKKwkvLwljcmVhdGU6IGlmIHRydWUsIHVuZGVmaW5lZCBvYmplY3RzIGluIHRoZSBwYXRoIGFyZSBjcmVhdGVkLgorCisJLy8gRklYTUU6IHdoeSBpcyB0aGlzIGZ1bmN0aW9uIHZhbHVhYmxlPyBJdCBzaG91bGQgYmUgc2NoZWR1bGVkIGZvcgorCS8vIHJlbW92YWwgb24gdGhlIGdyb3VuZHMgdGhhdCBkb2pvLnBhcnNlT2JqUGF0aCBkb2VzIG1vc3Qgb2YgaXQncyB3b3JrIGFuZAorCS8vIGlzIG1vcmUgc3RyYWlnaHRmb3J3YXJkIGFuZCBoYXMgZmV3ZXIgZGVwZW5kZW5jaWVzLiBBbHNvLCB0aGUgb3JkZXIgb2YKKwkvLyBhcmd1bWVudHMgaXMgYm9uZS1oZWFkZWQuICJjb250ZXh0IiBzaG91bGQgY2xlYXJseSBjb21lIGFmdGVyICJjcmVhdGUiLgorCS8vICpzaWdoKgorCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLnNldE9ialBhdGhWYWx1ZSIsICJ1c2UgZG9qby5wYXJzZU9ialBhdGggYW5kIHRoZSAnPScgb3BlcmF0b3IiLCAiMC42Iik7CisKKwlpZihhcmd1bWVudHMubGVuZ3RoIDwgNCl7CisJCWNyZWF0ZSA9IHRydWU7CisJfQorCXdpdGgoZG9qby5wYXJzZU9ialBhdGgob2JqcGF0aCwgY29udGV4dCwgY3JlYXRlKSl7CisJCWlmKG9iaiAmJiAoY3JlYXRlIHx8IChwcm9wIGluIG9iaikpKXsKKwkJCW9ialtwcm9wXSA9IHZhbHVlOworCQl9CisJfQorfQorCitkb2pvLnByb3ZpZGUoImRvam8uaW8uY29tbW9uIik7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOb3RlcyBhYm91dCBkb2pvLmlvIGRlc2lnbjoKKyAqCQorICoJVGhlIGRvam8uaW8uKiBwYWNrYWdlIGhhcyB0aGUgdW5lbnZpYWJsZSB0YXNrIG9mIG1ha2luZyBhIGxvdCBvZiBkaWZmZXJlbnQKKyAqCXR5cGVzIG9mIEkvTyBmZWVsIG5hdHVyYWwsIGRlc3BpdGUgYSB1bml2ZXJzYWwgbGFjayBvZiBnb29kIChvciBldmVuCisgKglyZWFzb25hYmxlISkgSS9PIGNhcGFiaWxpdHkgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuIFNvIGxldHMgcGluIHRoaXMgZG93bgorICoJYSBsaXR0bGUgYml0IGZ1cnRoZXIuCisgKgorICoJUmhpbm86CisgKgkJcGVyaGFwcyB0aGUgYmVzdCBzaXR1YXRpb24gYW55d2hlcmUuIEFjY2VzcyB0byBKYXZhIGNsYXNzZXMgYWxsb3dzIHlvdQorICoJCXRvIGRvIGFueXRoaW5nIG9uZSBtaWdodCB3YW50IGluIHRlcm1zIG9mIEkvTywgYm90aCBzeW5jaHJvbm91c2x5IGFuZAorICoJCWFzeW5jLiBDYW4gb3BlbiBUQ1Agc29ja2V0cyBhbmQgcGVyZm9ybSBsb3ctbGF0ZW5jeSBjbGllbnQvc2VydmVyCisgKgkJaW50ZXJhY3Rpb25zLiBIVFRQIHRyYW5zcG9ydCBpcyBhdmFpbGFibGUgdGhyb3VnaCBKYXZhIEhUVFAgY2xpZW50IGFuZAorICoJCXNlcnZlciBjbGFzc2VzLiBXaXNoIGl0IHdlcmUgYWx3YXlzIHRoaXMgZWFzeS4KKyAqCisgKgl4cGNzaGVsbDoKKyAqCQlYUENPTSBmb3IgSS9PLgorICoKKyAqCXNwaWRlcm1vbmtleToKKyAqCQlTLk8uTC4KKyAqCisgKglCcm93c2VyczoKKyAqCQlCcm93c2VycyBnZW5lcmFsbHkgZG8gbm90IHByb3ZpZGUgYW55IHVzZWFibGUgZmlsZXN5c3RlbSBhY2Nlc3MuIFdlIGFyZQorICoJCXRoZXJlZm9yZSBsaW1pdGVkIHRvIEhUVFAgZm9yIG1vdmluZyBpbmZvcm1hdGlvbiB0byBhbmQgZnJvbSBEb2pvCisgKgkJaW5zdGFuY2VzIGxpdmluZyBpbiBhIGJyb3dzZXIuCisgKgorICoJCVhNTEhUVFA6CisgKgkJCVN5bmMgb3IgYXN5bmMsIGFsbG93cyByZWFkaW5nIG9mIGFyYml0cmFyeSB0ZXh0IGZpbGVzIChpbmNsdWRpbmcKKyAqCQkJSlMsIHdoaWNoIGNhbiB0aGVuIGJlIGV2YWwoKSdkKSwgd3JpdGluZyByZXF1aXJlcyBzZXJ2ZXIKKyAqCQkJY29vcGVyYXRpb24gYW5kIGlzIGxpbWl0ZWQgdG8gSFRUUCBtZWNoYW5pc21zIChQT1NUIGFuZCBHRVQpLgorICoKKyAqCQk8aWZyYW1lPiBoYWNrczoKKyAqCQkJaWZyYW1lIGRvY3VtZW50IGhhY2tzIGFsbG93IGJyb3dzZXJzIHRvIGNvbW11bmljYXRlIGFzeW5jaHJvbm91c2x5CisgKgkJCXdpdGggYSBzZXJ2ZXIgdmlhIEhUVFAgUE9TVCBhbmQgR0VUIG9wZXJhdGlvbnMuIFdpdGggc2lnbmlmaWNhbnQKKyAqCQkJZWZmb3J0IGFuZCBzZXJ2ZXIgY29vcGVyYXRpb24sIGxvdy1sYXRlbmN5IGRhdGEgdHJhbnNpdCBiZXR3ZWVuCisgKgkJCWNsaWVudCBhbmQgc2VydmVyIGNhbiBiZSBhY2hlaXZlZCB2aWEgaWZyYW1lIG1lY2hhbmlzbXMgKHJlcHVic3ViKS4KKyAqCisgKgkJU1ZHOgorICoJCQlBZG9iZSdzIFNWRyB2aWV3ZXIgaW1wbGVtZW50cyBoZWxwZnVsIHByaW1pdGl2ZXMgZm9yIFhNTC1iYXNlZAorICoJCQlyZXF1ZXN0cywgYnV0IHJlY2VpcHQgb2YgYXJiaXRyYXJ5IHRleHQgZGF0YSBzZWVtcyB1bmxpa2VseSB3L28KKyAqCQkJPCFbQ0RBVEFbXV0+IHNlY3Rpb25zLgorICoKKyAqCisgKglBIGRpc2N1c3Npb24gYmV0d2VlbiBEeWxhbiwgTWFyaywgVG9tLCBhbmQgQWxleCBoZWxwZWQgdG8gbGF5IGRvd24gYSBsb3QKKyAqCXRoZSBJTyBBUEkgaW50ZXJmYWNlLiBBIHRyYW5zY3JpcHQgb2YgaXQgY2FuIGJlIGZvdW5kIGF0OgorICoJCWh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvdmlld2N2cy92aWV3Y3ZzLnB5L2RvY3VtZW50cy9pcmMvaXJjX2lvX2FwaV9sb2cudHh0P3Jldj0zMDcmdmlldz1hdXRvCisgKgkKKyAqCUFsc28gcmVmZXJlbmNlZCBpbiB0aGUgZGVzaWduIG9mIHRoZSBBUEkgd2FzIHRoZSBET00gMyBMJlMgc3BlYzoKKyAqCQlodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1MUy0yMDA0MDQwNy9sb2FkLXNhdmUuaHRtbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gYSBtYXAgb2YgdGhlIGF2YWlsYWJsZSB0cmFuc3BvcnQgb3B0aW9ucy4gVHJhbnNwb3J0cyBzaG91bGQgYWRkIHRoZW1zZWx2ZXMKKy8vIGJ5IGNhbGxpbmcgYWRkKG5hbWUpCitkb2pvLmlvLnRyYW5zcG9ydHMgPSBbXTsKK2Rvam8uaW8uaGRsckZ1bmNOYW1lcyA9IFsgImxvYWQiLCAiZXJyb3IiLCAidGltZW91dCIgXTsgLy8gd2UncmUgb21pdHRpbmcgYSBwcm9ncmVzcygpIGV2ZW50IGZvciBub3cKKworZG9qby5pby5SZXF1ZXN0ID0gZnVuY3Rpb24oLypTdHJpbmcqLyB1cmwsIC8qU3RyaW5nKi8gbWltZXR5cGUsIC8qU3RyaW5nKi8gdHJhbnNwb3J0LCAvKlN0cmluZyBvciBCb29sZWFuKi8gY2hhbmdlVXJsKXsKKy8vIHN1bW1hcnk6CisvLwkJQ29uc3RydWN0cyBhIFJlcXVlc3Qgb2JqZWN0IHRoYXQgaXMgdXNlZCBieSBkb2pvLmlvLmJpbmQoKS4KKy8vIGRlc2NyaXB0aW9uOgorLy8JCWRvam8uaW8uYmluZCgpIHdpbGwgY3JlYXRlIG9uZSBvZiB0aGVzZSBmb3IgeW91IGlmCisvLwkJeW91IGNhbGwgZG9qby5pby5iaW5kKCkgd2l0aCBhbiBwbGFpbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmluZCBwYXJhbWV0ZXJzLgorLy8JCVRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgdGFrZSB0aGUgYXJndW1lbnRzIHNwZWNpZmllZCwgb3IgYW4gT2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgeW91CisvLwkJd2FudCB0byB1c2UgdG8gY3JlYXRlIHRoZSBkb2pvLmlvLlJlcXVlc3QgKHNpbWlsYXIgdG8gaG93IGRvam8uaW8uYmluZCgpIGlzIGNhbGxlZC4KKy8vCQlUaGUgbmFtZWQgcGFyYW1ldGVycyB0byB0aGlzIGNvbnN0cnVjdG9yIHJlcHJlc2VudCB0aGUgbWluaW11bSBzZXQgb2YgcGFyYW1ldGVycyBuZWVkCisJaWYoKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkmJihhcmd1bWVudHNbMF0uY29uc3RydWN0b3IgPT0gT2JqZWN0KSl7CisJCXRoaXMuZnJvbUt3QXJncyhhcmd1bWVudHNbMF0pOworCX1lbHNleworCQl0aGlzLnVybCA9IHVybDsKKwkJaWYobWltZXR5cGUpeyB0aGlzLm1pbWV0eXBlID0gbWltZXR5cGU7IH0KKwkJaWYodHJhbnNwb3J0KXsgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7IH0KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA+PSA0KXsgdGhpcy5jaGFuZ2VVcmwgPSBjaGFuZ2VVcmw7IH0KKwl9Cit9CisKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5pby5SZXF1ZXN0LCB7CisKKwkvKiogVGhlIFVSTCB0byBoaXQgKi8KKwl1cmw6ICIiLAorCQorCS8qKiBUaGUgbWltZSB0eXBlIHVzZWQgdG8gaW50ZXJycHJldCB0aGUgcmVzcG9uc2UgYm9keSAqLworCW1pbWV0eXBlOiAidGV4dC9wbGFpbiIsCisJCisJLyoqIFRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKi8KKwltZXRob2Q6ICJHRVQiLAorCQorCS8qKiBBbiBPYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgdG8gYmUgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCAqLworCWNvbnRlbnQ6IHVuZGVmaW5lZCwgLy8gT2JqZWN0CisJCisJLyoqIFRoZSB0cmFuc3BvcnQgbWVkaXVtIHRvIHVzZSAqLworCXRyYW5zcG9ydDogdW5kZWZpbmVkLCAvLyBTdHJpbmcKKwkKKwkvKiogSWYgZGVmaW5lZCB0aGUgVVJMIG9mIHRoZSBwYWdlIGlzIHBoeXNpY2FsbHkgY2hhbmdlZCAqLworCWNoYW5nZVVybDogdW5kZWZpbmVkLCAvLyBTdHJpbmcKKwkKKwkvKiogQSBmb3JtIG5vZGUgdG8gdXNlIGluIHRoZSByZXF1ZXN0ICovCisJZm9ybU5vZGU6IHVuZGVmaW5lZCwgLy8gSFRNTEZvcm1FbGVtZW50CisJCisJLyoqIFdoZXRoZXIgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIG1hZGUgc3luY2hyb25vdXNseSAqLworCXN5bmM6IGZhbHNlLAorCQorCWJpbmRTdWNjZXNzOiBmYWxzZSwKKworCS8qKiBDYWNoZS9sb29rIGZvciB0aGUgcmVxdWVzdCBpbiB0aGUgY2FjaGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVxdWVzdD8KKwkgKiAgTk9URTogdGhpcyBpc24ndCBhIGJyb3dzZXIgY2FjaGUsIHRoaXMgaXMgaW50ZXJuYWwgYW5kIHdvdWxkIG9ubHkgY2FjaGUgaW4tcGFnZQorCSAqLworCXVzZUNhY2hlOiBmYWxzZSwKKworCS8qKiBQcmV2ZW50IHRoZSBicm93c2VyIGZyb20gY2FjaGluZyB0aGlzIGJ5IGFkZGluZyBhIHF1ZXJ5IHN0cmluZyBhcmd1bWVudCB0byB0aGUgVVJMICovCisJcHJldmVudENhY2hlOiBmYWxzZSwKKworCWpzb25GaWx0ZXI6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJaWYoCSh0aGlzLm1pbWV0eXBlID09ICJ0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCIpfHwKKwkJCSh0aGlzLm1pbWV0eXBlID09ICJhcHBsaWNhdGlvbi9qc29uLWNvbW1lbnQtZmlsdGVyZWQiKQorCQkpeworCQkJdmFyIGNTdGFydElkeCA9IHZhbHVlLmluZGV4T2YoIlwvKiIpOworCQkJdmFyIGNFbmRJZHggPSB2YWx1ZS5sYXN0SW5kZXhPZigiKlwvIik7CisJCQlpZigoY1N0YXJ0SWR4ID09IC0xKXx8KGNFbmRJZHggPT0gLTEpKXsKKwkJCQlkb2pvLmRlYnVnKCJ5b3VyIEpTT04gd2Fzbid0IGNvbW1lbnQgZmlsdGVyZWQhIik7IC8vIEZJWE1FOiB0aHJvdyBleGNlcHRpb24gaW5zdGVhZD8KKwkJCQlyZXR1cm4gIiI7CisJCQl9CisJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGNTdGFydElkeCsyLCBjRW5kSWR4KTsKKwkJfQorCQlkb2pvLmRlYnVnKCJwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBtaW1ldHlwZSBvZiB0ZXh0L2pzb24tY29tbWVudC1maWx0ZXJlZCB0byBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzIHdpdGggSlNPTiBlbmRwb2ludHMiKTsKKwkJcmV0dXJuIHZhbHVlOworCX0sCisJCisJLy8gZXZlbnRzIHN0dWZmCisJbG9hZDogZnVuY3Rpb24oLypTdHJpbmcqL3R5cGUsIC8qT2JqZWN0Ki9kYXRhLCAvKk9iamVjdCovdHJhbnNwb3J0SW1wbGVtZW50YXRpb24sIC8qT2JqZWN0Ki9rd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbGVkIG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhIGJpbmQuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAibG9hZCIKKwkJLy8JCWRhdGE6IE9iamVjdAorCQkvLwkJCQlUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBiaW5kLiBUaGUgYWN0dWFsIHN0cnVjdHVyZQorCQkvLwkJCQlvZiB0aGUgZGF0YSBvYmplY3Qgd2lsbCBkZXBlbmQgb24gdGhlIG1pbWV0eXBlIHRoYXQgd2FzIGdpdmVuIHRvIGJpbmQKKwkJLy8JCQkJaW4gdGhlIGJpbmQgYXJndW1lbnRzLgorCQkvLwkJdHJhbnNwb3J0SW1wbGVtZW50YXRpb246IE9iamVjdAorCQkvLwkJCQlUaGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LiBTdHJ1Y3R1cmUgaXMgZGVwZWRlbnQKKwkJLy8JCQkJb24gdGhlIHRyYW5zcG9ydC4gRm9yIFhNTEhUVFBUcmFuc3BvcnQgKGRvam8uaW8uQnJvd3NlcklPKSwgaXQgd2lsbCBiZSB0aGUKKwkJLy8JCQkJWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IGZyb20gdGhlIGJyb3dzZXIuCisJCS8vCQlrd0FyZ3M6IE9iamVjdAorCQkvLwkJCQlPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBnaXZlbiB0byB0aGUKKwkJLy8JCQkJYmluZCBjYWxsLiBVc2VmdWwgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgc3RhdGUgZnJvbSB3aGVuIGJpbmQKKwkJLy8JCQkJd2FzIGNhbGxlZC4KKwl9LAorCWVycm9yOiBmdW5jdGlvbigvKlN0cmluZyovdHlwZSwgLypPYmplY3QqL2Vycm9yLCAvKk9iamVjdCovdHJhbnNwb3J0SW1wbGVtZW50YXRpb24sIC8qT2JqZWN0Ki9rd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCBhIGJpbmQuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAiZXJyb3IiCisJCS8vCQllcnJvcjogT2JqZWN0CisJCS8vCQkJCVRoZSBlcnJvciBvYmplY3QuIFNob3VsZCBiZSBhIGRvam8uaW8uRXJyb3Igb2JqZWN0LCBidXQgbm90IGd1YXJhbnRlZWQuCisJCS8vCQl0cmFuc3BvcnRJbXBsZW1lbnRhdGlvbjogT2JqZWN0CisJCS8vCQkJCVRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhciB0cmFuc3BvcnQuIFN0cnVjdHVyZSBpcyBkZXBlZGVudAorCQkvLwkJCQlvbiB0aGUgdHJhbnNwb3J0LiBGb3IgWE1MSFRUUFRyYW5zcG9ydCAoZG9qby5pby5Ccm93c2VySU8pLCBpdCB3aWxsIGJlIHRoZQorCQkvLwkJCQlYTUxIdHRwUmVxdWVzdCBvYmplY3QgZnJvbSB0aGUgYnJvd3Nlci4KKwkJLy8JCWt3QXJnczogT2JqZWN0CisJCS8vCQkJCU9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGdpdmVuIHRvIHRoZQorCQkvLwkJCQliaW5kIGNhbGwuIFVzZWZ1bCBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBzdGF0ZSBmcm9tIHdoZW4gYmluZAorCQkvLwkJCQl3YXMgY2FsbGVkLgorCX0sCisJdGltZW91dDogZnVuY3Rpb24oLypTdHJpbmcqL3R5cGUsIC8qT2JqZWN0Ki9lbXB0eSwgLypPYmplY3QqL3RyYW5zcG9ydEltcGxlbWVudGF0aW9uLCAvKk9iamVjdCova3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggYSBiaW5kLiBPbmx5IGltcGxlbWVudGVkIGluIGNlcnRhaW4gdHJhbnNwb3J0cyBhdCB0aGlzIHRpbWUuCisJCS8vCQl0eXBlOiBTdHJpbmcKKwkJLy8JCQkJQSBzdHJpbmcgd2l0aCB2YWx1ZSAidGltZW91dCIKKwkJLy8JCWVtcHR5OiBPYmplY3QKKwkJLy8JCQkJU2hvdWxkIGJlIG51bGwuIEp1c3QgYSBzcGFjZXIgYXJndW1lbnQgc28gdGhhdCBsb2FkLCBlcnJvciwgdGltZW91dCBhbmQgaGFuZGxlIGhhdmUgdGhlCisJCS8vCQkJCXNhbWUgc2lnbmF0dXJlcy4KKwkJLy8JCXRyYW5zcG9ydEltcGxlbWVudGF0aW9uOiBPYmplY3QKKwkJLy8JCQkJVGhlIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydC4gU3RydWN0dXJlIGlzIGRlcGVkZW50CisJCS8vCQkJCW9uIHRoZSB0cmFuc3BvcnQuIEZvciBYTUxIVFRQVHJhbnNwb3J0IChkb2pvLmlvLkJyb3dzZXJJTyksIGl0IHdpbGwgYmUgdGhlCisJCS8vCQkJCVhNTEh0dHBSZXF1ZXN0IG9iamVjdCBmcm9tIHRoZSBicm93c2VyLiBNYXkgYmUgbnVsbCBmb3IgdGhlIHRpbWVvdXQgY2FzZSBmb3IKKwkJLy8JCQkJc29tZSB0cmFuc3BvcnRzLgorCQkvLwkJa3dBcmdzOiBPYmplY3QKKwkJLy8JCQkJT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdGhlCisJCS8vCQkJCWJpbmQgY2FsbC4gVXNlZnVsIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHN0YXRlIGZyb20gd2hlbiBiaW5kCisJCS8vCQkJCXdhcyBjYWxsZWQuCisJfSwKKwloYW5kbGU6IGZ1bmN0aW9uKC8qU3RyaW5nKi90eXBlLCAvKk9iamVjdCovZGF0YSwgLypPYmplY3QqL3RyYW5zcG9ydEltcGxlbWVudGF0aW9uLCAvKk9iamVjdCova3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVRoZSBoYW5kbGUgbWV0aG9kIGNhbiBiZSBkZWZpbmVkIGluc3RlYWQgb2YgZGVmaW5pbmcgc2VwYXJhdGUgbG9hZCwgZXJyb3IgYW5kIHRpbWVvdXQKKwkJLy8JCWNhbGxiYWNrcy4KKwkJLy8JCXR5cGU6IFN0cmluZworCQkvLwkJCQlBIHN0cmluZyB3aXRoIHRoZSB0eXBlIG9mIGNhbGxiYWNrOiAibG9hZCIsICJlcnJvciIsIG9yICJ0aW1lb3V0Ii4KKwkJLy8JCWRhdGE6IE9iamVjdAorCQkvLwkJCQlTZWUgdGhlIGFib3ZlIGNhbGxiYWNrcyBmb3Igd2hhdCB0aGlzIHBhcmFtZXRlciBjb3VsZCBiZS4KKwkJLy8JCXRyYW5zcG9ydEltcGxlbWVudGF0aW9uOiBPYmplY3QKKwkJLy8JCQkJVGhlIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydC4gU3RydWN0dXJlIGlzIGRlcGVkZW50CisJCS8vCQkJCW9uIHRoZSB0cmFuc3BvcnQuIEZvciBYTUxIVFRQVHJhbnNwb3J0IChkb2pvLmlvLkJyb3dzZXJJTyksIGl0IHdpbGwgYmUgdGhlCisJCS8vCQkJCVhNTEh0dHBSZXF1ZXN0IG9iamVjdCBmcm9tIHRoZSBicm93c2VyLgorCQkvLwkJa3dBcmdzOiBPYmplY3QKKwkJLy8JCQkJT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdGhlCisJCS8vCQkJCWJpbmQgY2FsbC4gVXNlZnVsIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHN0YXRlIGZyb20gd2hlbiBiaW5kCisJCS8vCQkJCXdhcyBjYWxsZWQuCQorCX0sCisKKwkvL0ZJWE1FOiBjaGFuZ2UgSWZyYW1lSU8uanMgdG8gdXNlIHRpbWVvdXRzPworCS8vIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IHVudGlsIGZpcmluZyBhIHRpbWVvdXQgY2FsbGJhY2suCisJLy8gSWYgaXQgaXMgemVybywgdGhhdCBtZWFucywgZG9uJ3QgZG8gYSB0aW1lb3V0IGNoZWNrLgorCXRpbWVvdXRTZWNvbmRzOiAwLAorCQorCS8vIHRoZSBhYm9ydCBtZXRob2QgbmVlZHMgdG8gYmUgZmlsbGVkIGluIGJ5IHRoZSB0cmFuc3BvcnQgdGhhdCBhY2NlcHRzIHRoZQorCS8vIGJpbmQoKSByZXF1ZXN0CisJYWJvcnQ6IGZ1bmN0aW9uKCl7IH0sCisJCisJLy8gYmFja0J1dHRvbjogZnVuY3Rpb24oKXsgfSwKKwkvLyBmb3J3YXJkQnV0dG9uOiBmdW5jdGlvbigpeyB9LAorCisJZnJvbUt3QXJnczogZnVuY3Rpb24oLypPYmplY3QqLyBrd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQ3JlYXRlcyBhIGRvam8uaW8uUmVxdWVzdCBmcm9tIGEgc2ltcGxlIG9iamVjdCAoa3dBcmdzIG9iamVjdCkuCisKKwkJLy8gbm9ybWFsaXplIGFyZ3MKKwkJaWYoa3dBcmdzWyJ1cmwiXSl7IGt3QXJncy51cmwgPSBrd0FyZ3MudXJsLnRvU3RyaW5nKCk7IH0KKwkJaWYoa3dBcmdzWyJmb3JtTm9kZSJdKSB7IGt3QXJncy5mb3JtTm9kZSA9IGRvam8uYnlJZChrd0FyZ3MuZm9ybU5vZGUpOyB9CisJCWlmKCFrd0FyZ3NbIm1ldGhvZCJdICYmIGt3QXJnc1siZm9ybU5vZGUiXSAmJiBrd0FyZ3NbImZvcm1Ob2RlIl0ubWV0aG9kKSB7CisJCQlrd0FyZ3MubWV0aG9kID0ga3dBcmdzWyJmb3JtTm9kZSJdLm1ldGhvZDsKKwkJfQorCQkKKwkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJaWYoIWt3QXJnc1siaGFuZGxlIl0gJiYga3dBcmdzWyJoYW5kbGVyIl0peyBrd0FyZ3MuaGFuZGxlID0ga3dBcmdzLmhhbmRsZXI7IH0KKwkJaWYoIWt3QXJnc1sibG9hZCJdICYmIGt3QXJnc1sibG9hZGVkIl0peyBrd0FyZ3MubG9hZCA9IGt3QXJncy5sb2FkZWQ7IH0KKwkJaWYoIWt3QXJnc1siY2hhbmdlVXJsIl0gJiYga3dBcmdzWyJjaGFuZ2VVUkwiXSkgeyBrd0FyZ3MuY2hhbmdlVXJsID0ga3dBcmdzLmNoYW5nZVVSTDsgfQorCisJCS8vIGVuY29kaW5nIGZ1biEKKwkJa3dBcmdzLmVuY29kaW5nID0gZG9qby5sYW5nLmZpcnN0VmFsdWVkKGt3QXJnc1siZW5jb2RpbmciXSwgZGpDb25maWdbImJpbmRFbmNvZGluZyJdLCAiIik7CisKKwkJa3dBcmdzLnNlbmRUcmFuc3BvcnQgPSBkb2pvLmxhbmcuZmlyc3RWYWx1ZWQoa3dBcmdzWyJzZW5kVHJhbnNwb3J0Il0sIGRqQ29uZmlnWyJpb1NlbmRUcmFuc3BvcnQiXSwgZmFsc2UpOworCisJCXZhciBpc0Z1bmN0aW9uID0gZG9qby5sYW5nLmlzRnVuY3Rpb247CisJCWZvcih2YXIgeD0wOyB4PGRvam8uaW8uaGRsckZ1bmNOYW1lcy5sZW5ndGg7IHgrKyl7CisJCQl2YXIgZm4gPSBkb2pvLmlvLmhkbHJGdW5jTmFtZXNbeF07CisJCQlpZihrd0FyZ3NbZm5dICYmIGlzRnVuY3Rpb24oa3dBcmdzW2ZuXSkpeyBjb250aW51ZTsgfQorCQkJaWYoa3dBcmdzWyJoYW5kbGUiXSAmJiBpc0Z1bmN0aW9uKGt3QXJnc1siaGFuZGxlIl0pKXsKKwkJCQlrd0FyZ3NbZm5dID0ga3dBcmdzLmhhbmRsZTsKKwkJCX0KKwkJCS8vIGhhbmRsZXIgaXMgYWxpYXNlZCBhYm92ZSwgc2hvdWxkbid0IG5lZWQgdGhpcyBjaGVjaworCQkJLyogZWxzZSBpZihkb2pvLmxhbmcuaXNPYmplY3Qoa3dBcmdzLmhhbmRsZXIpKXsKKwkJCQlpZihpc0Z1bmN0aW9uKGt3QXJncy5oYW5kbGVyW2ZuXSkpeworCQkJCQlrd0FyZ3NbZm5dID0ga3dBcmdzLmhhbmRsZXJbZm5dfHxrd0FyZ3MuaGFuZGxlclsiaGFuZGxlIl18fGZ1bmN0aW9uKCl7fTsKKwkJCQl9CisJCQl9Ki8KKwkJfQorCQlkb2pvLmxhbmcubWl4aW4odGhpcywga3dBcmdzKTsKKwl9CisKK30pOworCitkb2pvLmlvLkVycm9yID0gZnVuY3Rpb24oLypTdHJpbmcqLyBtc2csIC8qU3RyaW5nKi8gdHlwZSwgLypOdW1iZXIqL251bSl7CisJLy8gc3VtbWFyeToKKwkvLwkJQ29uc3RydWN0cyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYmluZCBlcnJvci4KKwl0aGlzLm1lc3NhZ2UgPSBtc2c7CisJdGhpcy50eXBlID0gIHR5cGUgfHwgInVua25vd24iOyAvLyBtdXN0IGJlIG9uZSBvZiAiaW8iLCAicGFyc2UiLCAidW5rbm93biIKKwl0aGlzLm51bWJlciA9IG51bSB8fCAwOyAvLyBwZXItc3Vic3RyYXRlIGVycm9yIG51bWJlciwgbm90IG5vcm1hbGl6ZWQKK30KKworZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlVc2VkIHRvIHJlZ2lzdGVyIHRyYW5zcG9ydHMgdGhhdCBjYW4gc3VwcG9ydCBiaW5kIGNhbGxzLgorCXRoaXMucHVzaChuYW1lKTsKKwkvLyBGSVhNRTogZG8gd2UgbmVlZCB0byBoYW5kbGUgdGhpbmdzIHRoYXQgYXJlbid0IGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUKKwkvLyBkb2pvLmlvIG1vZHVsZT8gKHNheSwgZG9qby5pby5mb28uZm9vVHJhbnNwb3J0PykKKwl0aGlzW25hbWVdID0gZG9qby5pb1tuYW1lXTsKK30KKworLy8gYmluZGluZyBpbnRlcmZhY2UsIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyByZWdpc3RlciB0aGVpciBjYXBhYmlsaXRpZXMKKy8vIGFuZCB0aGUgYmluZCgpIG1ldGhvZCBkaXNwYXRjaGVzCitkb2pvLmlvLmJpbmQgPSBmdW5jdGlvbigvKmRvam8uaW8uUmVxdWVzdCBvciBPYmplY3QqL3JlcXVlc3QpeworCS8vIHN1bW1hcnk6CisJLy8JCUJpbmRpbmcgaW50ZXJmYWNlIGZvciBJTy4gTG9hZGluZyBkaWZmZXJlbnQgSU8gdHJhbnNwb3J0cywgbGlrZQorCS8vCQlkb2pvLmlvLkJyb3dzZXJJTyBvciBkb2pvLmlvLklmcmFtZUlPLCB3aWxsIHJlZ2lzdGVyIHdpdGggYmluZAorCS8vCQl0byBoYW5kbGUgcGFydGljdWxhciB0eXBlcyBvZiBiaW5kIGNhbGxzLgorCS8vCQlyZXF1ZXN0OiBPYmplY3QKKwkvLwkJCQlPYmplY3QgY29udGFpbmluZyBiaW5kIGFyZ3VtZW50cy4gVGhpcyBvYmplY3QgaXMgY29udmVydGVkIHRvCisJLy8JCQkJYSBkb2pvLmlvLlJlcXVlc3Qgb2JqZWN0LCBhbmQgdGhhdCByZXF1ZXN0IG9iamVjdCBpcyB0aGUgcmV0dXJuCisJLy8JCQkJdmFsdWUgZm9yIHRoaXMgbWV0aG9kLgorCWlmKCEocmVxdWVzdCBpbnN0YW5jZW9mIGRvam8uaW8uUmVxdWVzdCkpeworCQl0cnl7CisJCQlyZXF1ZXN0ID0gbmV3IGRvam8uaW8uUmVxdWVzdChyZXF1ZXN0KTsKKwkJfWNhdGNoKGUpeyBkb2pvLmRlYnVnKGUpOyB9CisJfQorCisJLy8gaWYgdGhlIHJlcXVlc3QgYXNrcyBmb3IgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLCB1c2UgaXQKKwl2YXIgdHNOYW1lID0gIiI7CisJaWYocmVxdWVzdFsidHJhbnNwb3J0Il0peworCQl0c05hbWUgPSByZXF1ZXN0WyJ0cmFuc3BvcnQiXTsKKwkJaWYoIXRoaXNbdHNOYW1lXSl7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgIk5vIGRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIKKwkJCQkrIHJlcXVlc3RbInRyYW5zcG9ydCJdICsgIicuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKKwkJfQorCQlpZighdGhpc1t0c05hbWVdLmNhbkhhbmRsZShyZXF1ZXN0KSl7CisJCQlkb2pvLmlvLnNlbmRCaW5kRXJyb3IocmVxdWVzdCwgImRvam8uaW8uYmluZCgpIHRyYW5zcG9ydCB3aXRoIG5hbWUgJyIKKwkJCQkrIHJlcXVlc3RbInRyYW5zcG9ydCJdICsgIicgY2Fubm90IGhhbmRsZSB0aGlzIHR5cGUgb2YgcmVxdWVzdC4iKTsKKwkJCXJldHVybiByZXF1ZXN0OwkvL2Rvam8uaW8uUmVxdWVzdAorCQl9CisJfWVsc2V7CisJCS8vIG90aGVyd2lzZSB3ZSBkbyBvdXIgYmVzdCB0byBhdXRvLWRldGVjdCB3aGF0IGF2YWlsYWJsZSB0cmFuc3BvcnRzCisJCS8vIHdpbGwgaGFuZGxlIAorCQlmb3IodmFyIHg9MDsgeDxkb2pvLmlvLnRyYW5zcG9ydHMubGVuZ3RoOyB4KyspeworCQkJdmFyIHRtcCA9IGRvam8uaW8udHJhbnNwb3J0c1t4XTsKKwkJCWlmKCh0aGlzW3RtcF0pJiYodGhpc1t0bXBdLmNhbkhhbmRsZShyZXF1ZXN0KSkpeworCQkJCXRzTmFtZSA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZih0c05hbWUgPT0gIiIpeworCQkJZG9qby5pby5zZW5kQmluZEVycm9yKHJlcXVlc3QsICJOb25lIG9mIHRoZSBsb2FkZWQgdHJhbnNwb3J0cyBmb3IgZG9qby5pby5iaW5kKCkiCisJCQkJKyAiIGNhbiBoYW5kbGUgdGhlIHJlcXVlc3QuIik7CisJCQlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKKwkJfQorCX0KKwl0aGlzW3RzTmFtZV0uYmluZChyZXF1ZXN0KTsKKwlyZXF1ZXN0LmJpbmRTdWNjZXNzID0gdHJ1ZTsKKwlyZXR1cm4gcmVxdWVzdDsgLy9kb2pvLmlvLlJlcXVlc3QKK30KKworZG9qby5pby5zZW5kQmluZEVycm9yID0gZnVuY3Rpb24oLyogT2JqZWN0ICovcmVxdWVzdCwgLyogU3RyaW5nICovbWVzc2FnZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJVXNlZCBpbnRlcm5hbGx5IGJ5IGRvam8uaW8uYmluZCgpIHRvIHJldHVybi9yYWlzZSBhIGJpbmQgZXJyb3IuCisKKwkvL05lZWQgdG8gYmUgY2FyZWZ1bCBzaW5jZSBub3QgYWxsIGhvc3RlbnZzIHN1cHBvcnQgc2V0VGltZW91dC4KKwlpZigodHlwZW9mIHJlcXVlc3QuZXJyb3IgPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgcmVxdWVzdC5oYW5kbGUgPT0gImZ1bmN0aW9uIikKKwkJJiYgKHR5cGVvZiBzZXRUaW1lb3V0ID09ICJmdW5jdGlvbiIgfHwgdHlwZW9mIHNldFRpbWVvdXQgPT0gIm9iamVjdCIpKXsKKwkJdmFyIGVycm9yT2JqZWN0ID0gbmV3IGRvam8uaW8uRXJyb3IobWVzc2FnZSk7CisJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCXJlcXVlc3RbKHR5cGVvZiByZXF1ZXN0LmVycm9yID09ICJmdW5jdGlvbiIpID8gImVycm9yIiA6ICJoYW5kbGUiXSgiZXJyb3IiLCBlcnJvck9iamVjdCwgbnVsbCwgcmVxdWVzdCk7CisJCX0sIDUwKTsKKwl9ZWxzZXsKKwkJZG9qby5yYWlzZShtZXNzYWdlKTsKKwl9Cit9CisKK2Rvam8uaW8ucXVldWVCaW5kID0gZnVuY3Rpb24oLypkb2pvLmlvLlJlcXVlc3Qgb3IgT2JqZWN0Ki9yZXF1ZXN0KXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlxdWV1ZUJpbmQgd2lsbCB1c2UgZG9qby5pby5iaW5kKCkgYnV0IGd1YXJhbnRlZSB0aGF0IG9ubHkgb25lIGJpbmQKKwkvLwkJY2FsbCBpcyBoYW5kbGVkIGF0IGEgdGltZS4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLwkJSWYgcXVldWVCaW5kIGlzIGNhbGxlZCB3aGlsZSBhIGJpbmQgY2FsbAorCS8vCQlpcyBpbiBwcm9jZXNzLCBpdCB3aWxsIHF1ZXVlIHVwIHRoZSBvdGhlciBjYWxscyB0byBiaW5kIGFuZCBjYWxsIHRoZW0KKwkvLwkJaW4gb3JkZXIgYXMgYmluZCBjYWxscyBjb21wbGV0ZS4KKwkvLwkJcmVxdWVzdDogT2JqZWN0CisJLy8JCQlTYW1lIHNvcnQgb2YgcmVxdWVzdCBvYmplY3QgYXMgdXNlZCBmb3IgZG9qby5pby5iaW5kKCkuCisJaWYoIShyZXF1ZXN0IGluc3RhbmNlb2YgZG9qby5pby5SZXF1ZXN0KSl7CisJCXRyeXsKKwkJCXJlcXVlc3QgPSBuZXcgZG9qby5pby5SZXF1ZXN0KHJlcXVlc3QpOworCQl9Y2F0Y2goZSl7IGRvam8uZGVidWcoZSk7IH0KKwl9CisKKwkvLyBtYWtlIHN1cmUgd2UgZ2V0IGNhbGxlZCBpZi93aGVuIHdlIGdldCBhIHJlc3BvbnNlCisJdmFyIG9sZExvYWQgPSByZXF1ZXN0LmxvYWQ7CisJcmVxdWVzdC5sb2FkID0gZnVuY3Rpb24oKXsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSBmYWxzZTsKKwkJdmFyIHJldCA9IG9sZExvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdmFyIG9sZEVyciA9IHJlcXVlc3QuZXJyb3I7CisJcmVxdWVzdC5lcnJvciA9IGZ1bmN0aW9uKCl7CisJCWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisJCXZhciByZXQgPSBvbGRFcnIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZG9qby5pby5fYmluZFF1ZXVlLnB1c2gocmVxdWVzdCk7CisJZG9qby5pby5fZGlzcGF0Y2hOZXh0UXVldWVCaW5kKCk7CisJcmV0dXJuIHJlcXVlc3Q7IC8vZG9qby5pby5SZXF1ZXN0Cit9CisKK2Rvam8uaW8uX2Rpc3BhdGNoTmV4dFF1ZXVlQmluZCA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwlQcml2YXRlIG1ldGhvZCB1c2VkIGJ5IGRvam8uaW8ucXVldWVCaW5kKCkuCisJaWYoIWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0KXsKKwkJZG9qby5pby5fcXVldWVCaW5kSW5GbGlnaHQgPSB0cnVlOworCQlpZihkb2pvLmlvLl9iaW5kUXVldWUubGVuZ3RoID4gMCl7CisJCQlkb2pvLmlvLmJpbmQoZG9qby5pby5fYmluZFF1ZXVlLnNoaWZ0KCkpOworCQl9ZWxzZXsKKwkJCWRvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisJCX0KKwl9Cit9Citkb2pvLmlvLl9iaW5kUXVldWUgPSBbXTsKK2Rvam8uaW8uX3F1ZXVlQmluZEluRmxpZ2h0ID0gZmFsc2U7CisKK2Rvam8uaW8uYXJnc0Zyb21NYXAgPSBmdW5jdGlvbigvKk9iamVjdCovbWFwLCAvKlN0cmluZz8qL2VuY29kaW5nLCAvKlN0cmluZz8qL2xhc3QpeworCS8vIHN1bW1hcnk6CisJLy8JCUNvbnZlcnRzIG5hbWUvdmFsdWVzIHBhaXJzIGluIHRoZSBtYXAgb2JqZWN0IHRvIGFuIFVSTC1lbmNvZGVkIHN0cmluZworCS8vCQl3aXRoIGZvcm1hdCBvZiBuYW1lMT12YWx1ZTEmbmFtZTI9dmFsdWUyLi4uCisJLy8JCW1hcDogT2JqZWN0CisJLy8JCQlPYmplY3QgdGhhdCBoYXMgdGhlIGNvbnRhaW5zIHRoZSBuYW1lcyBhbmQgdmFsdWVzLgorCS8vCQllbmNvZGluZzogU3RyaW5nPworCS8vCQkJU3RyaW5nIHRvIHNwZWNpZnkgaG93IHRvIGVuY29kZSB0aGUgbmFtZSBhbmQgdmFsdWUuIElmIHRoZSBlbmNvZGluZyBzdHJpbmcKKwkvLwkJCWNvbnRhaW5zICJ1dGYiIChjYXNlLWluc2Vuc2l0aXZlKSwgdGhlbiBlbmNvZGVVUklDb21wb25lbnQgaXMgdXNlZC4gT3RoZXJ3aXNlCisJLy8JCQlkb2pvLnN0cmluZy5lbmNvZGVBc2NpaSBpcyB1c2VkLgorCS8vCQlsYXN0OiBTdHJpbmc/CisJLy8JCQlUaGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGxpc3QuIEhlbHBzIHdpdGggZmluYWwgc3RyaW5nIGZvcm1hdHRpbmc/CisJdmFyIGVuYyA9IC91dGYvaS50ZXN0KGVuY29kaW5nfHwiIikgPyBlbmNvZGVVUklDb21wb25lbnQgOiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaTsKKwl2YXIgbWFwcGVkID0gW107CisJdmFyIGNvbnRyb2wgPSBuZXcgT2JqZWN0KCk7CisJZm9yKHZhciBuYW1lIGluIG1hcCl7CisJCXZhciBkb21hcCA9IGZ1bmN0aW9uKGVsdCl7CisJCQl2YXIgdmFsID0gZW5jKG5hbWUpKyI9IitlbmMoZWx0KTsKKwkJCW1hcHBlZFsobGFzdCA9PSBuYW1lKSA/ICJwdXNoIiA6ICJ1bnNoaWZ0Il0odmFsKTsKKwkJfQorCQlpZighY29udHJvbFtuYW1lXSl7CisJCQl2YXIgdmFsdWUgPSBtYXBbbmFtZV07CisJCQkvLyBGSVhNRTogc2hvdWxkIGJlIGlzQXJyYXlMaWtlPworCQkJaWYgKGRvam8ubGFuZy5pc0FycmF5KHZhbHVlKSl7CisJCQkJZG9qby5sYW5nLmZvckVhY2godmFsdWUsIGRvbWFwKTsKKwkJCX1lbHNleworCQkJCWRvbWFwKHZhbHVlKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbWFwcGVkLmpvaW4oIiYiKTsgLy9TdHJpbmcKK30KKworZG9qby5pby5zZXRJRnJhbWVTcmMgPSBmdW5jdGlvbigvKkRPTU5vZGUqLyBpZnJhbWUsIC8qU3RyaW5nKi8gc3JjLCAvKkJvb2xlYW4qLyByZXBsYWNlKXsKKwkvL3N1bW1hcnk6CisJLy8JCVNldHMgdGhlIFVSTCB0aGF0IGlzIGxvYWRlZCBpbiBhbiBJRnJhbWUuIFRoZSByZXBsYWNlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgorCS8vCQlsb2NhdGlvbi5yZXBsYWNlKCkgc2hvdWxkIGJlIHVzZWQgd2hlbiBjaGFuZ2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIGlmcmFtZS4KKwl0cnl7CisJCXZhciByID0gZG9qby5yZW5kZXIuaHRtbDsKKwkJLy8gZG9qby5kZWJ1ZyhpZnJhbWUpOworCQlpZighcmVwbGFjZSl7CisJCQlpZihyLnNhZmFyaSl7CisJCQkJaWZyYW1lLmxvY2F0aW9uID0gc3JjOworCQkJfWVsc2V7CisJCQkJZnJhbWVzW2lmcmFtZS5uYW1lXS5sb2NhdGlvbiA9IHNyYzsKKwkJCX0KKwkJfWVsc2V7CisJCQkvLyBGdW4gd2l0aCBET00gMCBpbmNvbXBhdGliaWxpdGllcyEKKwkJCXZhciBpZG9jOworCQkJaWYoci5pZSl7CisJCQkJaWRvYyA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OworCQkJfWVsc2UgaWYoci5zYWZhcmkpeworCQkJCWlkb2MgPSBpZnJhbWUuZG9jdW1lbnQ7CisJCQl9ZWxzZXsgLy8gIGlmKHIubW96KXsKKwkJCQlpZG9jID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7CisJCQl9CisKKwkJCS8vRm9yIFNhZmFyaSAoYXQgbGVhc3QgMi4wLjMpIGFuZCBPcGVyYSwgaWYgdGhlIGlmcmFtZQorCQkJLy9oYXMganVzdCBiZWVuIGNyZWF0ZWQgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBjb250ZW50CisJCQkvL3lldCwgdGhlbiBpZnJhbWUuZG9jdW1lbnQgbWF5IGJlIG51bGwuIEluIHRoYXQgY2FzZSwKKwkJCS8vdXNlIGlmcmFtZS5sb2NhdGlvbiBhbmQgcmV0dXJuLgorCQkJaWYoIWlkb2MpeworCQkJCWlmcmFtZS5sb2NhdGlvbiA9IHNyYzsKKwkJCQlyZXR1cm47CisJCQl9ZWxzZXsKKwkJCQlpZG9jLmxvY2F0aW9uLnJlcGxhY2Uoc3JjKTsKKwkJCX0KKwkJfQorCX1jYXRjaChlKXsgCisJCWRvam8uZGVidWcoZSk7IAorCQlkb2pvLmRlYnVnKCJzZXRJRnJhbWVTcmM6ICIrZSk7IAorCX0KK30KKworLyoKK2Rvam8uaW8uc2FtcGxlVHJhbnBvcnQgPSBuZXcgZnVuY3Rpb24oKXsKKwl0aGlzLmNhbkhhbmRsZSA9IGZ1bmN0aW9uKGt3QXJncyl7CisJCS8vIGNhbkhhbmRsZSBqdXN0IHRlbGxzIGRvam8uaW8uYmluZCgpIGlmIHRoaXMgaXMgYSBnb29kIHRyYW5zcG9ydCB0bworCQkvLyB1c2UgZm9yIHRoZSBwYXJ0aWN1bGFyIHR5cGUgb2YgcmVxdWVzdC4KKwkJaWYoCQorCQkJKAorCQkJCShrd0FyZ3NbIm1pbWV0eXBlIl0gPT0gInRleHQvcGxhaW4iKSB8fAorCQkJCShrd0FyZ3NbIm1pbWV0eXBlIl0gPT0gInRleHQvaHRtbCIpIHx8CisJCQkJKGt3QXJnc1sibWltZXR5cGUiXSA9PSAidGV4dC9qYXZhc2NyaXB0IikKKwkJCSkmJigKKwkJCQkoa3dBcmdzWyJtZXRob2QiXSA9PSAiZ2V0IikgfHwKKwkJCQkoIChrd0FyZ3NbIm1ldGhvZCJdID09ICJwb3N0IikgJiYgKCFrd0FyZ3NbImZvcm1Ob2RlIl0pICkKKwkJCSkKKwkJKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXRoaXMuYmluZCA9IGZ1bmN0aW9uKGt3QXJncyl7CisJCXZhciBoZGxyT2JqID0ge307CisKKwkJLy8gc2V0IHVwIGEgaGFuZGxlciBvYmplY3QKKwkJZm9yKHZhciB4PTA7IHg8ZG9qby5pby5oZGxyRnVuY05hbWVzLmxlbmd0aDsgeCsrKXsKKwkJCXZhciBmbiA9IGRvam8uaW8uaGRsckZ1bmNOYW1lc1t4XTsKKwkJCWlmKHR5cGVvZiBrd0FyZ3MuaGFuZGxlciA9PSAib2JqZWN0Iil7CisJCQkJaWYodHlwZW9mIGt3QXJncy5oYW5kbGVyW2ZuXSA9PSAiZnVuY3Rpb24iKXsKKwkJCQkJaGRsck9ialtmbl0gPSBrd0FyZ3MuaGFuZGxlcltmbl18fGt3QXJncy5oYW5kbGVyWyJoYW5kbGUiXTsKKwkJCQl9CisJCQl9ZWxzZSBpZih0eXBlb2Yga3dBcmdzW2ZuXSA9PSAiZnVuY3Rpb24iKXsKKwkJCQloZGxyT2JqW2ZuXSA9IGt3QXJnc1tmbl07CisJCQl9ZWxzZXsKKwkJCQloZGxyT2JqW2ZuXSA9IGt3QXJnc1siaGFuZGxlIl18fGZ1bmN0aW9uKCl7fTsKKwkJCX0KKwkJfQorCisJCS8vIGJ1aWxkIGEgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGhhbmRsZXIgb2JqCisJCXZhciBoZGxyRnVuYyA9IGZ1bmN0aW9uKGV2dCl7CisJCQlpZihldnQudHlwZSA9PSAib25sb2FkIil7CisJCQkJaGRsck9iai5sb2FkKCJsb2FkIiwgZXZ0LmRhdGEsIGV2dCk7CisJCQl9ZWxzZSBpZihldnQudHlwZSA9PSAib25lcnIiKXsKKwkJCQl2YXIgZXJyT2JqID0gbmV3IGRvam8uaW8uRXJyb3IoInNhbXBsZVRyYW5zcG9ydCBFcnJvcjogIitldnQubXNnKTsKKwkJCQloZGxyT2JqLmVycm9yKCJlcnJvciIsIGVyck9iaik7CisJCQl9CisJCX0KKworCQkvLyB0aGUgc2FtcGxlIHRyYW5zcG9ydCB3b3VsZCBhdHRhY2ggdGhlIGhkbHJGdW5jKCkgd2hlbiBzZW5kaW5nIHRoZQorCQkvLyByZXF1ZXN0IGRvd24gdGhlIHBpcGUgYXQgdGhpcyBwb2ludAorCQl2YXIgdGd0VVJMID0ga3dBcmdzLnVybCsiPyIrZG9qby5pby5hcmdzRnJvbU1hcChrd0FyZ3MuY29udGVudCk7CisJCS8vIHNhbXBsZVRyYW5zcG9ydC5zZW5kUmVxdWVzdCh0Z3RVUkwsIGhkbHJGdW5jKTsKKwl9CisKKwlkb2pvLmlvLnRyYW5zcG9ydHMuYWRkVHJhbnNwb3J0KCJzYW1wbGVUcmFucG9ydCIpOworfQorKi8KKworZG9qby5wcm92aWRlKCJkb2pvLmxhbmcuYXJyYXkiKTsKKworCisKKy8vIEZJWE1FOiBJcyB0aGlzIHdvcnRobGVzcyBzaW5jZSB5b3UgY2FuIGRvOiBpZihuYW1lIGluIG9iaikKKy8vIGlzIHRoaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzPworCitkb2pvLmxhbmcubWl4aW4oZG9qby5sYW5nLCB7CisJaGFzOiBmdW5jdGlvbigvKk9iamVjdCovb2JqLCAvKlN0cmluZyovbmFtZSl7CisJCS8vIHN1bW1hcnk6IGlzIHRoZXJlIGEgcHJvcGVydHkgd2l0aCB0aGUgcGFzc2VkIG5hbWUgaW4gb2JqPworCQl0cnl7CisJCQlyZXR1cm4gdHlwZW9mIG9ialtuYW1lXSAhPSAidW5kZWZpbmVkIjsgLy8gQm9vbGVhbgorCQl9Y2F0Y2goZSl7IHJldHVybiBmYWxzZTsgfSAvLyBCb29sZWFuCisJfSwKKworCWlzRW1wdHk6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9vYmopeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgb2JqZWN0IGlzICJlbXB0eSIuIEluCisJCS8vCQl0aGUgY2FzZSBvZiBhcnJheS1saWtlIG9iamVjdHMsIHRoZSBsZW5ndGgsIHByb3BlcnR5IGlzCisJCS8vCQlleGFtaW5lZCwgYnV0IGZvciBvdGhlciB0eXBlcyBvZiBvYmplY3RzIGl0ZXJhdGlvbiBpcyB1c2VkIHRvCisJCS8vCQlleGFtaW5lIHRoZSBpdGVyYWJsZSAic3VyZmFjZSBhcmVhIiB0byBkZXRlcm1pbmUgaWYgYW55CisJCS8vCQlub24tcHJvdG90eXBhbCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBhc3NpZ25lZC4gVGhpcyBpdGVyYXRpb24gaXMKKwkJLy8JCXByb3RvdHlwZS1leHRlbnNpb24gc2FmZS4KKwkJaWYoZG9qby5sYW5nLmlzT2JqZWN0KG9iaikpeworCQkJdmFyIHRtcCA9IHt9OworCQkJdmFyIGNvdW50ID0gMDsKKwkJCWZvcih2YXIgeCBpbiBvYmopeworCQkJCWlmKG9ialt4XSAmJiAoIXRtcFt4XSkpeworCQkJCQljb3VudCsrOworCQkJCQlicmVhazsKKwkJCQl9IAorCQkJfQorCQkJcmV0dXJuIGNvdW50ID09IDA7IC8vIGJvb2xlYW4KKwkJfWVsc2UgaWYoZG9qby5sYW5nLmlzQXJyYXlMaWtlKG9iaikgfHwgZG9qby5sYW5nLmlzU3RyaW5nKG9iaikpeworCQkJcmV0dXJuIG9iai5sZW5ndGggPT0gMDsgLy8gYm9vbGVhbgorCQl9CisJfSwKKworCW1hcDogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKk9iamVjdHxGdW5jdGlvbiovb2JqLCAvKkZ1bmN0aW9uPyovdW5hcnlfZnVuYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIGEgbmV3IGFycmF5IGNvbnN0aXR1ZGVkIGZyb20gdGhlIHJldHVybiB2YWx1ZXMgb2YKKwkJLy8JCXBhc3NpbmcgZWFjaCBlbGVtZW50IG9mIGFyciBpbnRvIHVuYXJ5X2Z1bmMuIFRoZSBvYmogcGFyYW1ldGVyCisJCS8vCQltYXkgYmUgcGFzc2VkIHRvIGVuYWJsZSB0aGUgcGFzc2VkIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbgorCQkvLwkJdGhhdCBzY29wZS4gSW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBKYXZhU2NyaXB0IDEuNiwgdGhpcworCQkvLwkJZnVuY3Rpb24gaXMgYSBwYXNzdGhyb3VnaCB0byB0aGUgYnVpbHQtaW4gbWFwKCkgZnVuY3Rpb24KKwkJLy8JCXByb3ZpZGVkIGJ5IEFycmF5IGluc3RhbmNlcy4gRm9yIGRldGFpbHMgb24gdGhpcywgc2VlOgorCQkvLyAJCQlodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2U6R2xvYmFsX09iamVjdHM6QXJyYXk6bWFwCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLm1hcChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbSsxIH0pOworCQkvLwkJLy8gcmV0dXJucyBbMiwgMywgNCwgNV0KKwkJdmFyIGlzU3RyaW5nID0gZG9qby5sYW5nLmlzU3RyaW5nKGFycik7CisJCWlmKGlzU3RyaW5nKXsKKwkJCS8vIGFycjogU3RyaW5nCisJCQlhcnIgPSBhcnIuc3BsaXQoIiIpOworCQl9CisJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikmJighdW5hcnlfZnVuYykpeworCQkJdW5hcnlfZnVuYyA9IG9iajsKKwkJCW9iaiA9IGRqX2dsb2JhbDsKKwkJfWVsc2UgaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ob2JqKSAmJiB1bmFyeV9mdW5jKXsKKwkJCS8vIGZmIDEuNSBjb21wYXQKKwkJCXZhciB0bXBPYmogPSBvYmo7CisJCQlvYmogPSB1bmFyeV9mdW5jOworCQkJdW5hcnlfZnVuYyA9IHRtcE9iajsKKwkJfQorCQlpZihBcnJheS5tYXApeworCQkJdmFyIG91dEFyciA9IEFycmF5Lm1hcChhcnIsIHVuYXJ5X2Z1bmMsIG9iaik7CisJCX1lbHNleworCQkJdmFyIG91dEFyciA9IFtdOworCQkJZm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSl7CisJCQkJb3V0QXJyLnB1c2godW5hcnlfZnVuYy5jYWxsKG9iaiwgYXJyW2ldKSk7CisJCQl9CisJCX0KKwkJaWYoaXNTdHJpbmcpIHsKKwkJCXJldHVybiBvdXRBcnIuam9pbigiIik7IC8vIFN0cmluZworCQl9IGVsc2UgeworCQkJcmV0dXJuIG91dEFycjsgLy8gQXJyYXkKKwkJfQorCX0sCisKKwlyZWR1Y2U6IGZ1bmN0aW9uKC8qQXJyYXkqL2FyciwgaW5pdGlhbFZhbHVlLCAvKk9iamVjdHxGdW5jdGlvbiovb2JqLCAvKkZ1bmN0aW9uKi9iaW5hcnlfZnVuYyl7CisJCS8vIHN1bW1hcnk6CisJCS8vIAkJc2ltaWxhciB0byBQeXRob24ncyBidWlsdGluIHJlZHVjZSgpIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IG9mCisJCS8vIAkJdGhlIHByZXZpb3VzIGNvbXB1dGF0aW9uIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KKwkJLy8gCQliaW5hcnlfZnVuYyBhbG9uZyB3aXRoIHRoZSBuZXh0IHZhbHVlIGZyb20gYXJyLiBUaGUgcmVzdWx0IG9mCisJCS8vIAkJdGhpcyBjYWxsIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgc3Vic2VxdWVudCB2YWx1ZSBmcm9tIGFyciwgYW5kCisJCS8vIAkJdGhpcyBjb250aW51ZXMgdW50aWwgYXJyIGlzIGV4aGF1c3RlZC4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKKwkJLy8gCQlsYXN0IHJlc3VsdC4gVGhlICJvYmoiIGFuZCAiaW5pdGlhbFZhbHVlIiBwYXJhbWV0ZXJzIG1heSBiZQorCQkvLyAJCXNhZmVseSBvbWl0dGVkIGFuZCB0aGUgb3JkZXIgb2Ygb2JqIGFuZCBiaW5hcnlfZnVuYyBtYXkgYmUKKwkJLy8gCQlyZXZlcnNlZC4gVGhlIGRlZmF1bHQgb3JkZXIgb2YgdGhlIG9iaiBhbmQgYmluYXJ5X2Z1bmMgYXJndW1lbnQKKwkJLy8gCQl3aWxsIHByb2JhYmx5IGJlIHJldmVyc2VkIGluIGEgZnV0dXJlIHJlbGVhc2UsIGFuZCB0aGlzIGNhbGwKKwkJLy8gCQlvcmRlciBpcyBzdXBwb3J0ZWQgdG9kYXkuCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLnJlZHVjZShbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGxhc3QsIG5leHQpeyByZXR1cm4gbGFzdCtuZXh0fSk7CisJCS8vCQlyZXR1cm5zIDEwCisJCXZhciByZWR1Y2VkVmFsdWUgPSBpbml0aWFsVmFsdWU7CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMil7CisJCQliaW5hcnlfZnVuYyA9IGluaXRpYWxWYWx1ZTsKKwkJCXJlZHVjZWRWYWx1ZSA9IGFyclswXTsKKwkJCWFyciA9IGFyci5zbGljZSgxKTsKKwkJfWVsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAzKXsKKwkJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKG9iaikpeworCQkJCWJpbmFyeV9mdW5jID0gb2JqOworCQkJCW9iaiA9IG51bGw7CisJCQl9CisJCX1lbHNleworCQkJLy8gdW4tZnNjayB0aGUgZGVmYXVsdCBvcmRlcgorCQkJLy8gRklYTUU6CisJCQkvLwkJY291bGQgYmUgd3JvbmcgZm9yIHNvbWUgc3RyYW5nZSBmdW5jdGlvbiBvYmplY3QgY2FzZXMuIE5vdAorCQkJLy8JCXN1cmUgaG93IHRvIHRlc3QgZm9yIHRoZW0uCisJCQlpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihvYmopKXsKKwkJCQl2YXIgdG1wID0gYmluYXJ5X2Z1bmM7CisJCQkJYmluYXJ5X2Z1bmMgPSBvYmo7CisJCQkJb2JqID0gdG1wOworCQkJfQorCQl9CisKKwkJdmFyIG9iID0gb2JqIHx8IGRqX2dsb2JhbDsKKwkJZG9qby5sYW5nLm1hcChhcnIsIAorCQkJZnVuY3Rpb24odmFsKXsKKwkJCQlyZWR1Y2VkVmFsdWUgPSBiaW5hcnlfZnVuYy5jYWxsKG9iLCByZWR1Y2VkVmFsdWUsIHZhbCk7CisJCQl9CisJCSk7CisJCXJldHVybiByZWR1Y2VkVmFsdWU7CisJfSwKKworCWZvckVhY2g6IGZ1bmN0aW9uKC8qQXJyYXkqL2FuQXJyYXksIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZm9yIGV2ZXJ5IGl0ZW0gaW4gYW5BcnJheSwgY2FsbCBjYWxsYmFjayB3aXRoIHRoYXQgaXRlbSBhcyBpdHMKKwkJLy8JCW9ubHkgcGFyYW1ldGVyLiBSZXR1cm4gdmFsdWVzIGFyZSBpZ25vcmVkLiBUaGlzIGZ1bmNpdG9uCisJCS8vCQljb3JyZXNwb25kcyAoYW5kIHdyYXBzKSB0aGUgSmF2YVNjcmlwdCAxLjYgZm9yRWFjaCBtZXRob2QuIEZvcgorCQkvLwkJbW9yZSBkZXRhaWxzLCBzZWU6CisJCS8vCQkJaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOkdsb2JhbF9PYmplY3RzOkFycmF5OmZvckVhY2gKKwkJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFuQXJyYXkpKXsKKwkJCS8vIGFuQXJyYXk6IFN0cmluZworCQkJYW5BcnJheSA9IGFuQXJyYXkuc3BsaXQoIiIpOyAKKwkJfQorCQlpZihBcnJheS5mb3JFYWNoKXsKKwkJCUFycmF5LmZvckVhY2goYW5BcnJheSwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworCQl9ZWxzZXsKKwkJCS8vIEZJWE1FOiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIGhhbmRpbG5nIHRoaXNPYmplY3QuIElzIGRqX2dsb2JhbCBhbHdheXMgdGhlIGRlZmF1bHQgY29udGV4dD8KKwkJCWlmKCF0aGlzT2JqZWN0KXsKKwkJCQl0aGlzT2JqZWN0PWRqX2dsb2JhbDsKKwkJCX0KKwkJCWZvcih2YXIgaT0wLGw9YW5BcnJheS5sZW5ndGg7IGk8bDsgaSsrKXsgCisJCQkJY2FsbGJhY2suY2FsbCh0aGlzT2JqZWN0LCBhbkFycmF5W2ldLCBpLCBhbkFycmF5KTsKKwkJCX0KKwkJfQorCX0sCisKKwlfZXZlcnlPclNvbWU6IGZ1bmN0aW9uKC8qQm9vbGVhbiovZXZlcnksIC8qQXJyYXkqL2FyciwgLypGdW5jdGlvbiovY2FsbGJhY2ssIC8qT2JqZWN0PyovdGhpc09iamVjdCl7CisJCWlmKGRvam8ubGFuZy5pc1N0cmluZyhhcnIpKXsgCisJCQkvL2FycjogU3RyaW5nCisJCQlhcnIgPSBhcnIuc3BsaXQoIiIpOyAKKwkJfQorCQlpZihBcnJheS5ldmVyeSl7CisJCQlyZXR1cm4gQXJyYXlbIGV2ZXJ5ID8gImV2ZXJ5IiA6ICJzb21lIiBdKGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOworCQl9ZWxzZXsKKwkJCWlmKCF0aGlzT2JqZWN0KXsKKwkJCQl0aGlzT2JqZWN0ID0gZGpfZ2xvYmFsOworCQkJfQorCQkJZm9yKHZhciBpPTAsbD1hcnIubGVuZ3RoOyBpPGw7IGkrKyl7CisJCQkJdmFyIHJlc3VsdCA9IGNhbGxiYWNrLmNhbGwodGhpc09iamVjdCwgYXJyW2ldLCBpLCBhcnIpOworCQkJCWlmKGV2ZXJ5ICYmICFyZXN1bHQpeworCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEJvb2xlYW4KKwkJCQl9ZWxzZSBpZigoIWV2ZXJ5KSYmKHJlc3VsdCkpeworCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gQm9vbGVhbgorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBCb29sZWFuKGV2ZXJ5KTsgLy8gQm9vbGVhbgorCQl9CisJfSwKKworCWV2ZXJ5OiBmdW5jdGlvbigvKkFycmF5Ki9hcnIsIC8qRnVuY3Rpb24qL2NhbGxiYWNrLCAvKk9iamVjdD8qL3RoaXNPYmplY3QpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBldmVyeSBpdGVtIGluIHRoZSBhcnJheSBzYXRpc2ZpZXMgdGhlCisJCS8vCQljb25kaXRpb24gaW1wbGVtZW50ZWQgYnkgY2FsbGJhY2suIHRoaXNPYmplY3QgbWF5IGJlIHVzZWQgdG8KKwkJLy8JCXNjb3BlIHRoZSBjYWxsIHRvIGNhbGxiYWNrLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGRlcml2ZWQKKwkJLy8JCWZyb20gdGhlIEphdmFTY3JpcHQgMS42IEFycmF5LmV2ZXJ5KCkgZnVuY3Rpb24uIE1vcmUKKwkJLy8JCWluZm9ybWF0aW9uIG9uIHRoaXMgY2FuIGJlIGZvdW5kIGhlcmU6CisJCS8vCQkJaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOkdsb2JhbF9PYmplY3RzOkFycmF5OmV2ZXJ5CisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLmV2ZXJ5KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPjE7IH0pOworCQkvLwkJLy8gcmV0dXJucyBmYWxzZQorCQkvLwkJZG9qby5sYW5nLmV2ZXJ5KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPjA7IH0pOworCQkvLwkJLy8gcmV0dXJucyB0cnVlIAorCQlyZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUodHJ1ZSwgYXJyLCBjYWxsYmFjaywgdGhpc09iamVjdCk7IC8vIEJvb2xlYW4KKwl9LAorCisJc29tZTogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKkZ1bmN0aW9uKi9jYWxsYmFjaywgLypPYmplY3Q/Ki90aGlzT2JqZWN0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRldGVybWluZXMgd2hldGhlciBvciBub3QgYW55IGl0ZW0gaW4gdGhlIGFycmF5IHNhdGlzZmllcyB0aGUKKwkJLy8JCWNvbmRpdGlvbiBpbXBsZW1lbnRlZCBieSBjYWxsYmFjay4gdGhpc09iamVjdCBtYXkgYmUgdXNlZCB0bworCQkvLwkJc2NvcGUgdGhlIGNhbGwgdG8gY2FsbGJhY2suIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaXMgZGVyaXZlZAorCQkvLwkJZnJvbSB0aGUgSmF2YVNjcmlwdCAxLjYgQXJyYXkuc29tZSgpIGZ1bmN0aW9uLiBNb3JlCisJCS8vCQlpbmZvcm1hdGlvbiBvbiB0aGlzIGNhbiBiZSBmb3VuZCBoZXJlOgorCQkvLwkJCWh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpBcnJheTpzb21lCisJCS8vIGV4YW1wbGVzOgorCQkvLwkJZG9qby5sYW5nLnNvbWUoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0+MTsgfSk7CisJCS8vCQkvLyByZXR1cm5zIHRydWUKKwkJLy8JCWRvam8ubGFuZy5zb21lKFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtPDE7IH0pOworCQkvLwkJLy8gcmV0dXJucyBmYWxzZQorCQlyZXR1cm4gdGhpcy5fZXZlcnlPclNvbWUoZmFsc2UsIGFyciwgY2FsbGJhY2ssIHRoaXNPYmplY3QpOyAvLyBCb29sZWFuCisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oLypBcnJheSovYXJyLCAvKkZ1bmN0aW9uKi9jYWxsYmFjaywgLypPYmplY3Q/Ki90aGlzT2JqZWN0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybnMgYSBuZXcgQXJyYXkgd2l0aCB0aG9zZSBpdGVtcyBmcm9tIGFyciB0aGF0IG1hdGNoIHRoZQorCQkvLwkJY29uZGl0aW9uIGltcGxlbWVudGVkIGJ5IGNhbGxiYWNrLnRoaXNPYmplY3QgbWF5IGJlIHVzZWQgdG8KKwkJLy8JCXNjb3BlIHRoZSBjYWxsIHRvIGNhbGxiYWNrLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlzIGRlcml2ZWQKKwkJLy8JCWZyb20gdGhlIEphdmFTY3JpcHQgMS42IEFycmF5LmZpbHRlcigpIGZ1bmN0aW9uLCBhbHRob3VnaAorCQkvLwkJc3BlY2lhbCBhY2NvbWlkYXRpb24gaXMgbWFkZSBpbiBvdXIgaW1wbGVtZW50YXRpb24gZm9yIHN0cmluZ3MuCisJCS8vCQlNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBKUyAxLjYgQVBJIGNhbiBiZSBmb3VuZCBoZXJlOgorCQkvLwkJCWh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpBcnJheTpmaWx0ZXIKKwkJLy8gZXhhbXBsZXM6CisJCS8vCQlkb2pvLmxhbmcuc29tZShbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbT4xOyB9KTsKKwkJLy8JCS8vIHJldHVybnMgWzIsIDMsIDRdCisJCXZhciBpc1N0cmluZyA9IGRvam8ubGFuZy5pc1N0cmluZyhhcnIpOworCQlpZihpc1N0cmluZyl7IC8qYXJyOiBTdHJpbmcqL2FyciA9IGFyci5zcGxpdCgiIik7IH0KKwkJdmFyIG91dEFycjsKKwkJaWYoQXJyYXkuZmlsdGVyKXsKKwkJCW91dEFyciA9IEFycmF5LmZpbHRlcihhcnIsIGNhbGxiYWNrLCB0aGlzT2JqZWN0KTsKKwkJfWVsc2V7CisJCQlpZighdGhpc09iamVjdCl7CisJCQkJaWYoYXJndW1lbnRzLmxlbmd0aCA+PSAzKXsgZG9qby5yYWlzZSgidGhpc09iamVjdCBkb2Vzbid0IGV4aXN0ISIpOyB9CisJCQkJdGhpc09iamVjdCA9IGRqX2dsb2JhbDsKKwkJCX0KKworCQkJb3V0QXJyID0gW107CisJCQlmb3IodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKXsKKwkJCQlpZihjYWxsYmFjay5jYWxsKHRoaXNPYmplY3QsIGFycltpXSwgaSwgYXJyKSl7CisJCQkJCW91dEFyci5wdXNoKGFycltpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKGlzU3RyaW5nKXsKKwkJCXJldHVybiBvdXRBcnIuam9pbigiIik7IC8vIFN0cmluZworCQl9IGVsc2UgeworCQkJcmV0dXJuIG91dEFycjsgLy8gQXJyYXkKKwkJfQorCX0sCisKKwl1bm5lc3Q6IGZ1bmN0aW9uKC8qIC4uLiAqLyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlDcmVhdGVzIGEgMS1EIGFycmF5IG91dCBvZiBhbGwgdGhlIGFyZ3VtZW50cyBwYXNzZWQsCisJCS8vCQl1bnJhdmVsbGluZyBhbnkgYXJyYXktbGlrZSBvYmplY3RzIGluIHRoZSBwcm9jZXNzCisJCS8vIHVzYWdlOgorCQkvLwkJdW5uZXN0KDEsIDIsIDMpID09PiBbMSwgMiwgM10KKwkJLy8JCXVubmVzdCgxLCBbMiwgWzNdLCBbW1s0XV1dXSkgPT0+IFsxLCAyLCAzLCA0XQorCisJCXZhciBvdXQgPSBbXTsKKwkJZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7CisJCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2UoYXJndW1lbnRzW2ldKSl7CisJCQkJdmFyIGFkZCA9IGRvam8ubGFuZy51bm5lc3QuYXBwbHkodGhpcywgYXJndW1lbnRzW2ldKTsKKwkJCQlvdXQgPSBvdXQuY29uY2F0KGFkZCk7CisJCQl9ZWxzZXsKKwkJCQlvdXQucHVzaChhcmd1bWVudHNbaV0pOworCQkJfQorCQl9CisJCXJldHVybiBvdXQ7IC8vIEFycmF5CisJfSwKKworCXRvQXJyYXk6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9hcnJheUxpa2UsIC8qTnVtYmVyKi9zdGFydE9mZnNldCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlDb252ZXJ0cyBhbiBhcnJheS1saWtlIG9iamVjdCAoaS5lLiBhcmd1bWVudHMsIERPTUNvbGxlY3Rpb24pCisJCS8vCQl0byBhbiBhcnJheS4gUmV0dXJucyBhIG5ldyBBcnJheSBvYmplY3QuCisJCXZhciBhcnJheSA9IFtdOworCQlmb3IodmFyIGkgPSBzdGFydE9mZnNldHx8MDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKyl7CisJCQlhcnJheS5wdXNoKGFycmF5TGlrZVtpXSk7CisJCX0KKwkJcmV0dXJuIGFycmF5OyAvLyBBcnJheQorCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5mdW5jIik7CisKKworZG9qby5sYW5nLmhpdGNoID0gZnVuY3Rpb24oLypPYmplY3QqL3RoaXNPYmplY3QsIC8qRnVuY3Rpb258U3RyaW5nKi9tZXRob2QgLyosIC4uLiovKXsKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGV2ZXIgZXhlY3V0ZSBpbiB0aGUgYSBnaXZlbiBzY29wZQorCS8vCQkodGhpc09iamVjdCkuIFRoaXMgYWxsb3dzIGZvciBlYXN5IHVzZSBvZiBvYmplY3QgbWVtYmVyIGZ1bmN0aW9ucworCS8vCQlpbiBjYWxsYmFja3MgYW5kIG90aGVyIHBsYWNlcyBpbiB3aGljaCB0aGUgInRoaXMiIGtleXdvcmQgbWF5CisJLy8JCW90aGVyd2lzZSBub3QgcmVmZXJlbmNlIHRoZSBleHBlY3RlZCBzY29wZS4gQW55IG51bWJlciBvZiBkZWZhdWx0CisJLy8JCXBvc2l0aW9uYWwgYXJndW1lbnRzIG1heSBiZSBwYXNzZWQgYXMgcGFyYW1ldGVycyBiZXlvbmQgIm1ldGhvZCIuCisJLy8JCUVhY2ggb2YgdGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byAicGxhY2Vob2xkIiAoc2ltaWxhciB0byBjdXJyeSkKKwkvLwkJZm9yIHRoZSBoaXRjaGVkIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGFyZ3VtZW50cyBtYXkgYmUKKwkvLwkJcmV2ZXJzZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KKwkvLyB0aGlzT2JqZWN0OiB0aGUgc2NvcGUgdG8gcnVuIHRoZSBtZXRob2QgaW4KKwkvLyBtZXRob2Q6CisJLy8JCWEgZnVuY3Rpb24gdG8gYmUgImJvdW5kIiB0byB0aGlzT2JqZWN0IG9yIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4KKwkvLwkJdGhpc09iamVjdCB0byBiZSB1c2VkIGFzIHRoZSBiYXNpcyBmb3IgdGhlIGJpbmRpbmcKKwkvLyB1c2FnZToKKwkvLwkJZG9qby5sYW5nLmhpdGNoKGZvbywgImJhciIpKCk7IC8vIHJ1bnMgZm9vLmJhcigpIGluIHRoZSBzY29wZSBvZiBmb28KKwkvLwkJZG9qby5sYW5nLmhpdGNoKGZvbywgbXlGdW5jdGlvbik7IC8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJ1bnMgbXlGdW5jdGlvbiBpbiB0aGUgc2NvcGUgb2YgZm9vCisKKwl2YXIgYXJncyA9IFtdOworCWZvcih2YXIgeD0yOyB4PGFyZ3VtZW50cy5sZW5ndGg7IHgrKyl7CisJCWFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCX0KKwl2YXIgZmNuID0gKGRvam8ubGFuZy5pc1N0cmluZyhtZXRob2QpID8gdGhpc09iamVjdFttZXRob2RdIDogbWV0aG9kKSB8fCBmdW5jdGlvbigpe307CisJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCXZhciB0YSA9IGFyZ3MuY29uY2F0KFtdKTsgLy8gbWFrZSBhIGNvcHkKKwkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCXRhLnB1c2goYXJndW1lbnRzW3hdKTsKKwkJfQorCQlyZXR1cm4gZmNuLmFwcGx5KHRoaXNPYmplY3QsIHRhKTsgLy8gRnVuY3Rpb24KKwkJLy8gcmV0dXJuIGZjbi5hcHBseSh0aGlzT2JqZWN0LCBhcmd1bWVudHMpOyAvLyBGdW5jdGlvbgorCX07Cit9CisKK2Rvam8ubGFuZy5hbm9uQ3RyID0gMDsKK2Rvam8ubGFuZy5hbm9uID0ge307CisKK2Rvam8ubGFuZy5uYW1lQW5vbkZ1bmMgPSBmdW5jdGlvbigvKkZ1bmN0aW9uKi9hbm9uRnVuY1B0ciwgLypPYmplY3QqL3RoaXNPYmosIC8qQm9vbGVhbiovc2VhcmNoRm9yTmFtZXMpeworCS8vIHN1bW1hcnk6CisJLy8JCUNyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYW5vbkZ1bmNQdHIgaW4gdGhpc09iaiB3aXRoIGEgY29tcGxldGVseQorCS8vCQl1bmlxdWUgbmFtZS4gVGhlIG5ldyBuYW1lIGlzIHJldHVybmVkIGFzIGEgU3RyaW5nLiAgSWYKKwkvLwkJc2VhcmNoRm9yTmFtZXMgaXMgdHJ1ZSwgYW4gZWZmb3J0IHdpbGwgYmUgbWFkZSB0byBsb2NhdGUgYW4KKwkvLwkJZXhpc3RpbmcgcmVmZXJlbmNlIHRvIGFub25GdW5jUHRyIGluIHRoaXNPYmosIGFuZCBpZiBvbmUgaXMgZm91bmQsCisJLy8JCXRoZSBleGlzdGluZyBuYW1lIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4gVGhlIGRlZmF1bHQgaXMgZm9yCisJLy8JCXNlYXJjaEZvck5hbWVzIHRvIGJlIGZhbHNlLgorCXZhciBuc28gPSAodGhpc09ianx8IGRvam8ubGFuZy5hbm9uKTsKKwlpZiggKHNlYXJjaEZvck5hbWVzKSB8fAorCQkoKGRqX2dsb2JhbFsiZGpDb25maWciXSkmJihkakNvbmZpZ1sic2xvd0Fub25GdW5jTG9va3VwcyJdID09IHRydWUpKSApeworCQlmb3IodmFyIHggaW4gbnNvKXsKKwkJCXRyeXsKKwkJCQlpZihuc29beF0gPT09IGFub25GdW5jUHRyKXsKKwkJCQkJcmV0dXJuIHg7CisJCQkJfQorCQkJfWNhdGNoKGUpe30gLy8gd2luZG93LmV4dGVybmFsIGZhaWxzIGluIElFIGVtYmVkZGVkIGluIEVjbGlwc2UgKEVjbGlwc2UgYnVnICMxNTExNjUpCisJCX0KKwl9CisJdmFyIHJldCA9ICJfXyIrZG9qby5sYW5nLmFub25DdHIrKzsKKwl3aGlsZSh0eXBlb2YgbnNvW3JldF0gIT0gInVuZGVmaW5lZCIpeworCQlyZXQgPSAiX18iK2Rvam8ubGFuZy5hbm9uQ3RyKys7CisJfQorCW5zb1tyZXRdID0gYW5vbkZ1bmNQdHI7CisJcmV0dXJuIHJldDsgLy8gU3RyaW5nCit9CisKK2Rvam8ubGFuZy5mb3J3YXJkID0gZnVuY3Rpb24oZnVuY05hbWUpeworCS8vIHN1bW1hcnk6CisJLy8gCQlSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBmb3J3YXJkcyBhIG1ldGhvZCBjYWxsIHRvCisJLy8gCQl0aGlzLmZ1bmNOYW1lKC4uLikuICBVbmxpa2UgZG9qby5sYW5nLmhpdGNoKCksIHRoZSAidGhpcyIgc2NvcGUgaXMKKwkvLyAJCW5vdCBmaXhlZCBvbiBhIHNpbmdsZSBvYmplY3QuIFBvcnRlZCBmcm9tIE1vY2hpS2l0LgorCXJldHVybiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpc1tmdW5jTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9OyAvLyBGdW5jdGlvbgorfQorCitkb2pvLmxhbmcuY3VycnkgPSBmdW5jdGlvbih0aGlzT2JqLCBmdW5jIC8qIGFyZ3MgLi4uICovKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlzaW1pbGFyIHRvIHRoZSBjdXJyeSgpIG1ldGhvZCBmb3VuZCBpbiBtYW55IGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcKKwkvLwkJZW52aXJvbm1lbnRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gImFyZ3VtZW50IGFjY3VtdWxhdG9yIgorCS8vCQlmdW5jdGlvbiwgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIHNjb3BlLCBhbmQgInByaW1lZCIgd2l0aCBhIHZhcmlhYmxlCisJLy8JCW51bWJlciBvZiBhcmd1bWVudHMuIFRoZSBjdXJyeSBtZXRob2QgaXMgdW5pcXVlIGluIHRoYXQgaXQgcmV0dXJucworCS8vCQlhIGZ1bmN0aW9uIHRoYXQgbWF5IHJldHVybiBvdGhlciAicGFydGlhbCIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlCisJLy8JCWNhbGxlZCByZXBlYXRlZGx5LiBOZXcgZnVuY3Rpb25zIGFyZSByZXR1cm5lZCB1bnRpbCB0aGUgYXJpdHkgb2YKKwkvLwkJdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGlzIHJlYWNoZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB1bmRlcmx5aW5nCisJLy8JCWZ1bmN0aW9uIChmdW5jKSBpcyBjYWxsZWQgaW4gdGhlIHNjb3BlIHRoaXNPYmogd2l0aCBhbGwgb2YgdGhlCisJLy8JCWFjY3VtdWxhdGVkIGFyZ3VtZW50cyAocGx1cyBhbnkgZXh0cmFzKSBpbiBwb3NpdGlvbmFsIG9yZGVyLgorCS8vIGV4YW1wbGVzOgorCS8vCQlhc3N1bWluZyBhIGZ1bmN0aW9uIGRlZmluZWQgbGlrZSB0aGlzOgorCS8vCQkJdmFyIGZvbyA9IHsKKwkvLwkJCQliYXI6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpeworCS8vCQkJCQlkb2pvLmRlYnVnLmFwcGx5KGRvam8sIGFyZ3VtZW50cyk7CisJLy8JCQkJfQorCS8vCQkJfTsKKwkvLwkJCisJLy8JCWRvam8ubGFuZy5jdXJyeSgpIGNhbiBiZSB1c2VkIG1vc3Qgc2ltcGx5IGluIHRoaXMgd2F5OgorCS8vCQkKKwkvLwkJCXRtcCA9IGRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJhcmcgb25lIiwgInRoaW5nZXIiKTsKKwkvLwkJCXRtcCgiYmxhaCIsICJ0aGlzIGlzIHN1cGVyZmx1b3VzIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIHRoaW5nZXIgYmxhaCB0aGlzIGlzIHN1cGVyZmx1b3VzIgorCS8vCQkJdG1wKCJibGFoIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIHRoaW5nZXIgYmxhaCIKKwkvLwkJCXRtcCgpOworCS8vCQkJLy8gcmV0dXJucyBhIGZ1bmN0aW9uIGV4YWN0bHkgbGlrZSB0bXAgdGhhdCBleHBlY3RzIG9uZSBhcmd1bWVudAorCS8vCisJLy8JCW90aGVyIGludGVybWl0dGVudCBmdW5jdGlvbnMgY291bGQgYmUgY3JlYXRlZCB1bnRpbCB0aGUgMworCS8vCQlwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgZmlsbGVkOgorCS8vCisJLy8JCQl0bXAgPSBkb2pvLmxhbmcuY3VycnkoZm9vLCBmb28uYmFyLCAiYXJnIG9uZSIpOworCS8vCQkJdG1wMiA9IHRtcCgiYXJnIHR3byIpOworCS8vCQkJdG1wMigiYmxhaCBibGFoIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJhcmcgb25lIGFyZyB0d28gYmxhaCBibGFoIgorCS8vCQkJdG1wMigib3kiKTsKKwkvLwkJCS8vIGRlYnVnczogImFyZyBvbmUgYXJnIHR3byBveSIKKwkvLworCS8vCQljdXJyeSgpIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaWYgZW5vdWdoIGFyZ3VtZW50cworCS8vCQlhcmUgcGFzc2VkIGluIHRoZSBpbml0aWFsIGludm9jYXRpb246CisJLy8KKwkvLwkJCWRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiKTsKKwkvLwkJCS8vIGRlYnVnczogIm9uZSB0d28gdGhyZWUgZm91ciIKKwkvLwkJCWRvam8ubGFuZy5jdXJyeShmb28sIGZvby5iYXIsICJvbmUiLCAidHdvIiwgInRocmVlIik7CisJLy8JCQkvLyBkZWJ1Z3M6ICJvbmUgdHdvIHRocmVlIgorCisKKwkvLyBGSVhNRTogdGhlIG9yZGVyIG9mIGZ1bmMgYW5kIHRoaXNPYmogc2hvdWxkIGJlIGNoYW5nZWQhISEKKwl2YXIgb3V0ZXJBcmdzID0gW107CisJdGhpc09iaiA9IHRoaXNPYmp8fGRqX2dsb2JhbDsKKwlpZihkb2pvLmxhbmcuaXNTdHJpbmcoZnVuYykpeworCQlmdW5jID0gdGhpc09ialtmdW5jXTsKKwl9CisJZm9yKHZhciB4PTI7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJb3V0ZXJBcmdzLnB1c2goYXJndW1lbnRzW3hdKTsKKwl9CisJLy8gc2luY2UgdGhlIGV2ZW50IHN5c3RlbSByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCBhIG5ldworCS8vIGpvaW4tcG9pbnQgcnVubmVyIHdpdGggYW4gYXJpdHkgb2YgMCwgd2UgY2hlY2sgdG8gc2VlIGlmIGl0J3MgbGVmdCB1cworCS8vIGFueSBjbHVlcyBhYm91dCB0aGUgb3JpZ2luYWwgYXJpdHkgaW4gbGlldSBvZiB0aGUgZnVuY3Rpb24ncyBhY3R1YWwKKwkvLyBsZW5ndGggcHJvcGVydHkKKwl2YXIgZWNvdW50ID0gKGZ1bmNbIl9fcHJlSm9pbkFyaXR5Il18fGZ1bmMubGVuZ3RoKSAtIG91dGVyQXJncy5sZW5ndGg7CisJLy8gYm9ycm93ZWQgZnJvbSBzdmVuZCB0b2Z0ZQorCWZ1bmN0aW9uIGdhdGhlcihuZXh0QXJncywgaW5uZXJBcmdzLCBleHBlY3RlZCl7CisJCXZhciB0ZXhwZWN0ZWQgPSBleHBlY3RlZDsKKwkJdmFyIHRvdGFsQXJncyA9IGlubmVyQXJncy5zbGljZSgwKTsgLy8gY29weQorCQlmb3IodmFyIHg9MDsgeDxuZXh0QXJncy5sZW5ndGg7IHgrKyl7CisJCQl0b3RhbEFyZ3MucHVzaChuZXh0QXJnc1t4XSk7CisJCX0KKwkJLy8gY2hlY2sgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgbmV4dEFyZ3MgdG8gc2VlIGlmIGl0LCBwbHVzIHRoZQorCQkvLyBudW1iZXIgb2YgaW5uZXJBcmdzIGFscmVhZHkgc3VwcGxpZWQsIG1lZXRzIHRoZSB0b3RhbAorCQkvLyBleHBlY3RlZC4KKwkJZXhwZWN0ZWQgPSBleHBlY3RlZC1uZXh0QXJncy5sZW5ndGg7CisJCWlmKGV4cGVjdGVkPD0wKXsKKwkJCXZhciByZXMgPSBmdW5jLmFwcGx5KHRoaXNPYmosIHRvdGFsQXJncyk7CisJCQlleHBlY3RlZCA9IHRleHBlY3RlZDsKKwkJCXJldHVybiByZXM7CisJCX1lbHNleworCQkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQkJcmV0dXJuIGdhdGhlcihhcmd1bWVudHMsLy8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGJlZW4gcnVuCisJCQkJCQkJCQkJLy8gd2l0aCBlbm91Z2ggYXJncworCQkJCQkJCXRvdGFsQXJncywJLy8gYSBjb3B5CisJCQkJCQkJZXhwZWN0ZWQpOwkvLyBob3cgbWFueSBtb3JlIGRvIHdlIG5lZWQgdG8gcnVuPzsKKwkJCX07CisJCX0KKwl9CisJcmV0dXJuIGdhdGhlcihbXSwgb3V0ZXJBcmdzLCBlY291bnQpOworfQorCitkb2pvLmxhbmcuY3VycnlBcmd1bWVudHMgPSBmdW5jdGlvbigvKk9iamVjdCovdGhpc09iaiwgLypGdW5jdGlvbiovZnVuYywgLypBcnJheSovYXJncywgLypJbnRlZ2VyLCBvcHRpb25hbCovb2Zmc2V0KXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlzaW1pbGFyIHRvIGRvam8ubGFuZy5jdXJyeSgpLCBleGNlcHQgdGhhdCBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvCisJLy8JCXN0YXJ0IHRoZSBjdXJyeSB3aXRoIG1heSBiZSBwcm92aWRlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGFzCisJLy8JCXBvc2l0aW9uYWwgYXJndW1lbnRzLiBBbiBvZmZzZXQgbWF5IGJlIHNwZWNpZmllZCBmcm9tIHRoZSAwIGluZGV4CisJLy8JCXRvIHNraXAgc29tZSBlbGVtZW50cyBpbiBhcmdzLgorCXZhciB0YXJncyA9IFtdOworCXZhciB4ID0gb2Zmc2V0fHwwOworCWZvcih4PW9mZnNldDsgeDxhcmdzLmxlbmd0aDsgeCsrKXsKKwkJdGFyZ3MucHVzaChhcmdzW3hdKTsgLy8gZW5zdXJlIHRoYXQgaXQncyBhbiBhcnIKKwl9CisJcmV0dXJuIGRvam8ubGFuZy5jdXJyeS5hcHBseShkb2pvLmxhbmcsIFt0aGlzT2JqLCBmdW5jXS5jb25jYXQodGFyZ3MpKTsKK30KKworZG9qby5sYW5nLnRyeVRoZXNlID0gZnVuY3Rpb24oLyouLi4qLyl7CisJLy8gc3VtbWFyeToKKwkvLwkJZXhlY3V0ZXMgZWFjaCBmdW5jdGlvbiBhcmd1bWVudCBpbiB0dXJuLCByZXR1cm5pbmcgdGhlIHJldHVybiB2YWx1ZQorCS8vCQlmcm9tIHRoZSBmaXJzdCBvbmUgd2hpY2ggZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGluIGV4ZWN1dGlvbi4KKwkvLwkJQW55IG51bWJlciBvZiBmdW5jdGlvbnMgbWF5IGJlIHBhc3NlZC4KKwlmb3IodmFyIHg9MDsgeDxhcmd1bWVudHMubGVuZ3RoOyB4KyspeworCQl0cnl7CisJCQlpZih0eXBlb2YgYXJndW1lbnRzW3hdID09ICJmdW5jdGlvbiIpeworCQkJCXZhciByZXQgPSAoYXJndW1lbnRzW3hdKCkpOworCQkJCWlmKHJldCl7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9Y2F0Y2goZSl7CisJCQlkb2pvLmRlYnVnKGUpOworCQl9CisJfQorfQorCitkb2pvLmxhbmcuZGVsYXlUaGVzZSA9IGZ1bmN0aW9uKC8qQXJyYXkqL2ZhcnIsIC8qRnVuY3Rpb24sIG9wdGlvbmFsKi9jYiwgLypJbnRlZ2VyKi9kZWxheSwgLypGdW5jdGlvbiwgb3B0aW9uYWwqL29uZW5kKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlleGVjdXRlcyBhIHNlcmllcyBvZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGZhcnIsIGJ1dCBzcGFjZXMgb3V0CisJLy8JCWNhbGxzIHRvIGVhY2ggZnVuY3Rpb24gYnkgdGhlIG1pbGxpc2Vjb25kIGRlbGF5IHByb3ZpZGVkLiBJZiBjYiBpcworCS8vCQlwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgZWFjaCBpdGVtIGluIGZhcnIgaXMKKwkvLwkJY2FsbGVkIGFuZCBpZiBvbmVuZCBpcyBwYXNzZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYWxsIGl0ZW1zCisJLy8JCWhhdmUgY29tcGxldGVkIGV4ZWN1dGluZy4KKworCS8qKgorCSAqIGFsdGVybmF0ZTogKGFycmF5IGZ1bmNBcnJheSwgZnVuY3Rpb24gY2FsbGJhY2ssIGZ1bmN0aW9uIG9uZW5kKQorCSAqIGFsdGVybmF0ZTogKGFycmF5IGZ1bmNBcnJheSwgZnVuY3Rpb24gY2FsbGJhY2spCisJICogYWx0ZXJuYXRlOiAoYXJyYXkgZnVuY0FycmF5KQorCSAqLworCWlmKCFmYXJyLmxlbmd0aCl7IAorCQlpZih0eXBlb2Ygb25lbmQgPT0gImZ1bmN0aW9uIil7CisJCQlvbmVuZCgpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYoKHR5cGVvZiBkZWxheSA9PSAidW5kZWZpbmVkIikmJih0eXBlb2YgY2IgPT0gIm51bWJlciIpKXsKKwkJZGVsYXkgPSBjYjsKKwkJY2IgPSBmdW5jdGlvbigpe307CisJfWVsc2UgaWYoIWNiKXsKKwkJY2IgPSBmdW5jdGlvbigpe307CisJCWlmKCFkZWxheSl7IGRlbGF5ID0gMDsgfQorCX0KKwlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisJCShmYXJyLnNoaWZ0KCkpKCk7CisJCWNiKCk7CisJCWRvam8ubGFuZy5kZWxheVRoZXNlKGZhcnIsIGNiLCBkZWxheSwgb25lbmQpOworCX0sIGRlbGF5KTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLnN0cmluZy5leHRyYXMiKTsKKworCisKKworCisvL1RPRE86IHNob3VsZCB3ZSB1c2UgJHt9IHN1YnN0aXR1dGlvbiBzeW50YXggaW5zdGVhZCwgbGlrZSB3aWRnZXRzIGRvPworZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcyA9IGZ1bmN0aW9uKC8qc3RyaW5nKi90ZW1wbGF0ZSwgLyogb2JqZWN0IC0gb3B0aW9uYWwgb3IgLi4uICovaGFzaCl7CisvLyBzdW1tYXJ5OgorLy8JUGVyZm9ybXMgcGFyYW1ldGVyaXplZCBzdWJzdGl0dXRpb25zIG9uIGEgc3RyaW5nLiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgdW5tYXRjaGVkLgorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8JRm9yIGV4YW1wbGUsCisvLwkJZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcygiRmlsZSAnJXswfScgaXMgbm90IGZvdW5kIGluIGRpcmVjdG9yeSAnJXsxfScuIiwiZm9vLmh0bWwiLCIvdGVtcCIpOworLy8JcmV0dXJucworLy8JCSJGaWxlICdmb28uaHRtbCcgaXMgbm90IGZvdW5kIGluIGRpcmVjdG9yeSAnL3RlbXAnLiIKKy8vCisvLyB0ZW1wbGF0ZTogdGhlIG9yaWdpbmFsIHN0cmluZyB0ZW1wbGF0ZSB3aXRoICV7dmFsdWVzfSB0byBiZSByZXBsYWNlZAorLy8gaGFzaDogbmFtZS92YWx1ZSBwYWlycyAodHlwZSBvYmplY3QpIHRvIHByb3ZpZGUgc3Vic3RpdHV0aW9ucy4gIEFsdGVybmF0aXZlbHksIHN1YnN0aXR1dGlvbnMgbWF5IGJlCisvLwlpbmNsdWRlZCBhcyBhcmd1bWVudHMgMS4ubiB0byB0aGlzIGZ1bmN0aW9uLCBjb3JyZXNwb25kaW5nIHRvIHRlbXBsYXRlIHBhcmFtZXRlcnMgMC4ubi0xCisKKwl2YXIgbWFwID0gKHR5cGVvZiBoYXNoID09ICdvYmplY3QnKSA/IGhhc2ggOiBkb2pvLmxhbmcudG9BcnJheShhcmd1bWVudHMsIDEpOworCisJcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1wlXHsoXHcrKVx9L2csIGZ1bmN0aW9uKG1hdGNoLCBrZXkpeworCQlpZih0eXBlb2YobWFwW2tleV0pICE9ICJ1bmRlZmluZWQiICYmIG1hcFtrZXldICE9IG51bGwpeworCQkJcmV0dXJuIG1hcFtrZXldOworCQl9CisJCWRvam8ucmFpc2UoIlN1YnN0aXR1dGlvbiBub3QgZm91bmQ6ICIgKyBrZXkpOworCX0pOyAvLyBzdHJpbmcKK307CisKK2Rvam8uc3RyaW5nLmNhcGl0YWxpemUgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyKXsKKy8vIHN1bW1hcnk6CisvLwlVcHBlcmNhc2VzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkCisKKwlpZighZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpeyByZXR1cm4gIiI7IH0KKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDApeyBzdHIgPSB0aGlzOyB9CisKKwl2YXIgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsKKwlmb3IodmFyIGk9MDsgaTx3b3Jkcy5sZW5ndGg7IGkrKyl7CisJCXdvcmRzW2ldID0gd29yZHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkc1tpXS5zdWJzdHJpbmcoMSk7CisJfQorCXJldHVybiB3b3Jkcy5qb2luKCIgIik7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5pc0JsYW5rID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisvLyBzdW1tYXJ5OgorLy8JUmV0dXJuIHRydWUgaWYgdGhlIGVudGlyZSBzdHJpbmcgaXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisKKwlpZighZG9qby5sYW5nLmlzU3RyaW5nKHN0cikpeyByZXR1cm4gdHJ1ZTsgfQorCXJldHVybiAoZG9qby5zdHJpbmcudHJpbShzdHIpLmxlbmd0aCA9PSAwKTsgLy8gYm9vbGVhbgorfQorCisvL0ZJWE1FOiBub3Qgc3VyZSBleGFjdGx5IHdoYXQgZW5jb2RlQXNjaWkgaXMgdHJ5aW5nIHRvIGRvLCBvciBpZiBpdCdzIHdvcmtpbmcgcmlnaHQKK2Rvam8uc3RyaW5nLmVuY29kZUFzY2lpID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisJaWYoIWRvam8ubGFuZy5pc1N0cmluZyhzdHIpKXsgcmV0dXJuIHN0cjsgfSAvLyB1bmtub3duCisJdmFyIHJldCA9ICIiOworCXZhciB2YWx1ZSA9IGVzY2FwZShzdHIpOworCXZhciBtYXRjaCwgcmUgPSAvJXUoWzAtOUEtRl17NH0pL2k7CisJd2hpbGUoKG1hdGNoID0gdmFsdWUubWF0Y2gocmUpKSl7CisJCXZhciBudW0gPSBOdW1iZXIoIjB4IittYXRjaFsxXSk7CisJCXZhciBuZXdWYWwgPSBlc2NhcGUoIiYjIiArIG51bSArICI7Iik7CisJCXJldCArPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpICsgbmV3VmFsOworCQl2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhtYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGgpOworCX0KKwlyZXQgKz0gdmFsdWUucmVwbGFjZSgvXCsvZywgIiUyQiIpOworCXJldHVybiByZXQ7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5lc2NhcGUgPSBmdW5jdGlvbigvKnN0cmluZyovdHlwZSwgLypzdHJpbmcqL3N0cil7CisvLyBzdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIG9mICd0eXBlJworLy8KKy8vIHR5cGU6IG9uZSBvZiB4bWx8aHRtbHx4aHRtbHxzcWx8cmVnZXhwfHJlZ2V4fGphdmFzY3JpcHR8anNjcmlwdHxqc3xhc2NpaQorLy8gc3RyOiB0aGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQKKworCXZhciBhcmdzID0gZG9qby5sYW5nLnRvQXJyYXkoYXJndW1lbnRzLCAxKTsKKwlzd2l0Y2godHlwZS50b0xvd2VyQ2FzZSgpKXsKKwkJY2FzZSAieG1sIjoKKwkJY2FzZSAiaHRtbCI6CisJCWNhc2UgInhodG1sIjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVYbWwuYXBwbHkodGhpcywgYXJncyk7IC8vIHN0cmluZworCQljYXNlICJzcWwiOgorCQkJcmV0dXJuIGRvam8uc3RyaW5nLmVzY2FwZVNxbC5hcHBseSh0aGlzLCBhcmdzKTsgLy8gc3RyaW5nCisJCWNhc2UgInJlZ2V4cCI6CisJCWNhc2UgInJlZ2V4IjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVSZWdFeHAuYXBwbHkodGhpcywgYXJncyk7IC8vIHN0cmluZworCQljYXNlICJqYXZhc2NyaXB0IjoKKwkJY2FzZSAianNjcmlwdCI6CisJCWNhc2UgImpzIjoKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVKYXZhU2NyaXB0LmFwcGx5KHRoaXMsIGFyZ3MpOyAvLyBzdHJpbmcKKwkJY2FzZSAiYXNjaWkiOgorCQkJLy8gc28gaXQncyBlbmNvZGUsIGJ1dCBpdCBzZWVtcyB1c2VmdWwKKwkJCXJldHVybiBkb2pvLnN0cmluZy5lbmNvZGVBc2NpaS5hcHBseSh0aGlzLCBhcmdzKTsgLy8gc3RyaW5nCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc3RyOyAvLyBzdHJpbmcKKwl9Cit9CisKK2Rvam8uc3RyaW5nLmVzY2FwZVhtbCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qYm9vbGVhbiovbm9TaW5nbGVRdW90ZXMpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gWE1MOiAmPD4iJworLy8gIE9wdGlvbmFsbHkgc2tpcHMgZXNjYXBlcyBmb3Igc2luZ2xlIHF1b3RlcworCisJc3RyID0gc3RyLnJlcGxhY2UoLyYvZ20sICImYW1wOyIpLnJlcGxhY2UoLzwvZ20sICImbHQ7IikKKwkJLnJlcGxhY2UoLz4vZ20sICImZ3Q7IikucmVwbGFjZSgvIi9nbSwgIiZxdW90OyIpOworCWlmKCFub1NpbmdsZVF1b3Rlcyl7IHN0ciA9IHN0ci5yZXBsYWNlKC8nL2dtLCAiJiMzOTsiKTsgfQorCXJldHVybiBzdHI7IC8vIHN0cmluZworfQorCitkb2pvLnN0cmluZy5lc2NhcGVTcWwgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyKXsKKy8vc3VtbWFyeToKKy8vCUFkZHMgZXNjYXBlIHNlcXVlbmNlcyBmb3Igc2luZ2xlIHF1b3RlcyBpbiBTUUwgZXhwcmVzc2lvbnMKKworCXJldHVybiBzdHIucmVwbGFjZSgvJy9nbSwgIicnIik7IC8vc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLmVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gcmVndWxhciBleHByZXNzaW9ucworCisJcmV0dXJuIHN0ci5yZXBsYWNlKC9cXC9nbSwgIlxcXFwiKS5yZXBsYWNlKC8oW1xmXGJcblx0XHJbXF4kfD8qKygpe31dKS9nbSwgIlxcJDEiKTsgLy8gc3RyaW5nCit9CisKKy8vRklYTUU6IHNob3VsZCB0aGlzIG9uZSBhbHNvIGVzY2FwZSBiYWNrc2xhc2g/Citkb2pvLnN0cmluZy5lc2NhcGVKYXZhU2NyaXB0ID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0cil7CisvL3N1bW1hcnk6CisvLwlBZGRzIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhcyB3ZWxsCisvLwlhcyBub24tdmlzaWJsZSBjaGFyYWN0ZXJzIGluIEphdmFTY3JpcHQgc3RyaW5nIGxpdGVyYWwgZXhwcmVzc2lvbnMKKworCXJldHVybiBzdHIucmVwbGFjZSgvKFsiJ1xmXGJcblx0XHJdKS9nbSwgIlxcJDEiKTsgLy8gc3RyaW5nCit9CisKKy8vRklYTUU6IGxvb2tzIGEgbG90IGxpa2UgZXNjYXBlSmF2YVNjcmlwdCwganVzdCBhZGRzIHF1b3Rlcz8gZGVwcmVjYXRlIG9uZT8KK2Rvam8uc3RyaW5nLmVzY2FwZVN0cmluZyA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIpeworLy9zdW1tYXJ5OgorLy8JQWRkcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBub24tdmlzdWFsIGNoYXJhY3RlcnMsIGRvdWJsZSBxdW90ZSBhbmQgYmFja3NsYXNoCisvLwlhbmQgc3Vycm91bmRzIHdpdGggZG91YmxlIHF1b3RlcyB0byBmb3JtIGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwuCisJcmV0dXJuICgnIicgKyBzdHIucmVwbGFjZSgvKFsiXFxdKS9nLCAnXFwkMScpICsgJyInCisJCSkucmVwbGFjZSgvW1xmXS9nLCAiXFxmIgorCQkpLnJlcGxhY2UoL1tcYl0vZywgIlxcYiIKKwkJKS5yZXBsYWNlKC9bXG5dL2csICJcXG4iCisJCSkucmVwbGFjZSgvW1x0XS9nLCAiXFx0IgorCQkpLnJlcGxhY2UoL1tccl0vZywgIlxcciIpOyAvLyBzdHJpbmcKK30KKworLy8gVE9ETzogbWFrZSBhbiBIVE1MIHZlcnNpb24KK2Rvam8uc3RyaW5nLnN1bW1hcnkgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKm51bWJlciovbGVuKXsKKy8vIHN1bW1hcnk6CisvLwlUcnVuY2F0ZXMgJ3N0cicgYWZ0ZXIgJ2xlbicgY2hhcmFjdGVycyBhbmQgYXBwZW5kcyBwZXJpb2RzIGFzIG5lY2Vzc2FyeSBzbyB0aGF0IGl0IGVuZHMgd2l0aCAiLi4uIgorCisJaWYoIWxlbiB8fCBzdHIubGVuZ3RoIDw9IGxlbil7CisJCXJldHVybiBzdHI7IC8vIHN0cmluZworCX0KKworCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGxlbikucmVwbGFjZSgvXC4rJC8sICIiKSArICIuLi4iOyAvLyBzdHJpbmcKK30KKworZG9qby5zdHJpbmcuZW5kc1dpdGggPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKnN0cmluZyovZW5kLCAvKmJvb2xlYW4qL2lnbm9yZUNhc2UpeworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBlbmRzIHdpdGggJ2VuZCcKKworCWlmKGlnbm9yZUNhc2UpeworCQlzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTsKKwkJZW5kID0gZW5kLnRvTG93ZXJDYXNlKCk7CisJfQorCWlmKChzdHIubGVuZ3RoIC0gZW5kLmxlbmd0aCkgPCAwKXsKKwkJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCisJfQorCXJldHVybiBzdHIubGFzdEluZGV4T2YoZW5kKSA9PSBzdHIubGVuZ3RoIC0gZW5kLmxlbmd0aDsgLy8gYm9vbGVhbgorfQorCitkb2pvLnN0cmluZy5lbmRzV2l0aEFueSA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIgLyogLCAuLi4gKi8peworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBlbmRzIHdpdGggYW55IG9mIHRoZSBhcmd1bWVudHNbMiAtPiBuXQorCisJZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZihkb2pvLnN0cmluZy5lbmRzV2l0aChzdHIsIGFyZ3VtZW50c1tpXSkpIHsKKwkJCXJldHVybiB0cnVlOyAvLyBib29sZWFuCisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGggPSBmdW5jdGlvbigvKnN0cmluZyovc3RyLCAvKnN0cmluZyovc3RhcnQsIC8qYm9vbGVhbiovaWdub3JlQ2FzZSl7CisvLyBzdW1tYXJ5OgorLy8JUmV0dXJucyB0cnVlIGlmICdzdHInIHN0YXJ0cyB3aXRoICdzdGFydCcKKworCWlmKGlnbm9yZUNhc2UpIHsKKwkJc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7CisJCXN0YXJ0ID0gc3RhcnQudG9Mb3dlckNhc2UoKTsKKwl9CisJcmV0dXJuIHN0ci5pbmRleE9mKHN0YXJ0KSA9PSAwOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLnN0YXJ0c1dpdGhBbnkgPSBmdW5jdGlvbigvKnN0cmluZyovc3RyIC8qICwgLi4uICovKXsKKy8vIHN1bW1hcnk6CisvLwlSZXR1cm5zIHRydWUgaWYgJ3N0cicgc3RhcnRzIHdpdGggYW55IG9mIHRoZSBhcmd1bWVudHNbMiAtPiBuXQorCisJZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQlpZihkb2pvLnN0cmluZy5zdGFydHNXaXRoKHN0ciwgYXJndW1lbnRzW2ldKSkgeworCQkJcmV0dXJuIHRydWU7IC8vIGJvb2xlYW4KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7IC8vIGJvb2xlYW4KK30KKworZG9qby5zdHJpbmcuaGFzID0gZnVuY3Rpb24oLypzdHJpbmcqL3N0ciAvKiAsIC4uLiAqLykgeworLy8gc3VtbWFyeToKKy8vCVJldHVybnMgdHJ1ZSBpZiAnc3RyJyBjb250YWlucyBhbnkgb2YgdGhlIGFyZ3VtZW50cyAyIC0+IG4KKworCWZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJaWYoc3RyLmluZGV4T2YoYXJndW1lbnRzW2ldKSA+IC0xKXsKKwkJCXJldHVybiB0cnVlOyAvLyBib29sZWFuCisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOyAvLyBib29sZWFuCit9CisKK2Rvam8uc3RyaW5nLm5vcm1hbGl6ZU5ld2xpbmVzID0gZnVuY3Rpb24oLypzdHJpbmcqL3RleHQsIC8qc3RyaW5nPyAoXG4gb3IgXHIpKi9uZXdsaW5lQ2hhcil7CisvLyBzdW1tYXJ5OgorLy8JQ2hhbmdlcyBvY2N1cmVuY2VzIG9mIENSIGFuZCBMRiBpbiB0ZXh0IHRvIENSTEYsIG9yIGlmIG5ld2xpbmVDaGFyIGlzIHByb3ZpZGVkIGFzICdcbicgb3IgJ1xyJywKKy8vCXN1YnN0aXR1dGVzIG5ld2xpbmVDaGFyIGZvciBvY2N1cnJlbmNlcyBvZiBDUi9MRiBhbmQgQ1JMRgorCisJaWYgKG5ld2xpbmVDaGFyID09ICJcbiIpeworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxuL2csICJcbiIpOworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cci9nLCAiXG4iKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmVDaGFyID09ICJcciIpeworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxuL2csICJcciIpOworCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cbi9nLCAiXHIiKTsKKwl9ZWxzZXsKKwkJdGV4dCA9IHRleHQucmVwbGFjZSgvKFteXHJdKVxuL2csICIkMVxyXG4iKS5yZXBsYWNlKC9ccihbXlxuXSkvZywgIlxyXG4kMSIpOworCX0KKwlyZXR1cm4gdGV4dDsgLy8gc3RyaW5nCit9CisKK2Rvam8uc3RyaW5nLnNwbGl0RXNjYXBlZCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qc3RyaW5nIG9mIGxlbmd0aD0xKi9jaGFyYWMpeworLy8gc3VtbWFyeToKKy8vCVNwbGl0cyAnc3RyJyBpbnRvIGFuIGFycmF5IHNlcGFyYXRlZCBieSAnY2hhcmFjJywgYnV0IHNraXBzIGNoYXJhY3RlcnMgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoCisKKwl2YXIgY29tcG9uZW50cyA9IFtdOworCWZvciAodmFyIGkgPSAwLCBwcmV2Y29tbWEgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKXsKKwkJaWYgKHN0ci5jaGFyQXQoaSkgPT0gJ1xcJyl7IGkrKzsgY29udGludWU7IH0KKwkJaWYgKHN0ci5jaGFyQXQoaSkgPT0gY2hhcmFjKXsKKwkJCWNvbXBvbmVudHMucHVzaChzdHIuc3Vic3RyaW5nKHByZXZjb21tYSwgaSkpOworCQkJcHJldmNvbW1hID0gaSArIDE7CisJCX0KKwl9CisJY29tcG9uZW50cy5wdXNoKHN0ci5zdWJzdHIocHJldmNvbW1hKSk7CisJcmV0dXJuIGNvbXBvbmVudHM7IC8vIGFycmF5Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kb20iKTsKKworZG9qby5kb20uRUxFTUVOVF9OT0RFICAgICAgICAgICAgICAgICAgPSAxOworZG9qby5kb20uQVRUUklCVVRFX05PREUgICAgICAgICAgICAgICAgPSAyOworZG9qby5kb20uVEVYVF9OT0RFICAgICAgICAgICAgICAgICAgICAgPSAzOworZG9qby5kb20uQ0RBVEFfU0VDVElPTl9OT0RFICAgICAgICAgICAgPSA0OworZG9qby5kb20uRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgICAgPSA1OworZG9qby5kb20uRU5USVRZX05PREUgICAgICAgICAgICAgICAgICAgPSA2OworZG9qby5kb20uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFICAgPSA3OworZG9qby5kb20uQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgICAgPSA4OworZG9qby5kb20uRE9DVU1FTlRfTk9ERSAgICAgICAgICAgICAgICAgPSA5OworZG9qby5kb20uRE9DVU1FTlRfVFlQRV9OT0RFICAgICAgICAgICAgPSAxMDsKK2Rvam8uZG9tLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAgID0gMTE7Citkb2pvLmRvbS5OT1RBVElPTl9OT0RFICAgICAgICAgICAgICAgICA9IDEyOworCQorZG9qby5kb20uZG9qb21sID0gImh0dHA6Ly93d3cuZG9qb3Rvb2xraXQub3JnLzIwMDQvZG9qb21sIjsKKworLyoqCisgKgljb21wcmVoZW5zaXZlIGxpc3Qgb2YgWE1MIG5hbWVzcGFjZXMKKyoqLworZG9qby5kb20ueG1sbnMgPSB7CisJLy8Jc3VtbWFyeQorCS8vCWFsaWFzZXMgZm9yIHZhcmlvdXMgY29tbW9uIFhNTCBuYW1lc3BhY2VzCisJc3ZnIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKKwlzbWlsIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvU01JTDIwLyIsCisJbW1sIDogImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLAorCWNtbCA6ICJodHRwOi8vd3d3LnhtbC1jbWwub3JnIiwKKwl4bGluayA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKKwl4aHRtbCA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKKwl4dWwgOiAiaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCIsCisJeGJsIDogImh0dHA6Ly93d3cubW96aWxsYS5vcmcveGJsIiwKKwlmbyA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiLAorCXhzbCA6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iLAorCXhzbHQgOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiwKKwl4aSA6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIiwKKwl4Zm9ybXMgOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wMS94Zm9ybXMiLAorCXNheG9uIDogImh0dHA6Ly9pY2wuY29tL3NheG9uIiwKKwl4YWxhbiA6ICJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIsCisJeHNkIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwKKwlkdDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWRhdGF0eXBlcyIsCisJeHNpIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKKwlyZGYgOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIsCisJcmRmcyA6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiwKKwlkYyA6ICJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIsCisJZGNxOiAiaHR0cDovL3B1cmwub3JnL2RjL3F1YWxpZmllcnMvMS4wIiwKKwkic29hcC1lbnYiIDogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwKKwl3c2RsIDogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwKKwlBZG9iZUV4dGVuc2lvbnMgOiAiaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZVNWR1ZpZXdlckV4dGVuc2lvbnMvMy4wLyIKK307CisKK2Rvam8uZG9tLmlzTm9kZSA9IGZ1bmN0aW9uKC8qIG9iamVjdCAqL3doKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQljaGVja3MgdG8gc2VlIGlmIHdoIGlzIGFjdHVhbGx5IGEgbm9kZS4KKwlpZih0eXBlb2YgRWxlbWVudCA9PSAiZnVuY3Rpb24iKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gd2ggaW5zdGFuY2VvZiBFbGVtZW50OwkvLwlib29sZWFuCisJCX0gY2F0Y2goZSkge30KKwl9IGVsc2UgeworCQkvLyBiZXN0LWd1ZXNzCisJCXJldHVybiB3aCAmJiAhaXNOYU4od2gubm9kZVR5cGUpOwkvLwlib29sZWFuCisJfQorfQorCitkb2pvLmRvbS5nZXRVbmlxdWVJZCA9IGZ1bmN0aW9uKCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgZm9yIHVzZSB3aXRoIGFueSBET00gZWxlbWVudAorCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCWRvIHsKKwkJdmFyIGlkID0gImRqX3VuaXF1ZV8iICsgKCsrYXJndW1lbnRzLmNhbGxlZS5faWRJbmNyZW1lbnQpOworCX13aGlsZShfZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKTsKKwlyZXR1cm4gaWQ7CS8vCXN0cmluZworfQorZG9qby5kb20uZ2V0VW5pcXVlSWQuX2lkSW5jcmVtZW50ID0gMDsKKworZG9qby5kb20uZmlyc3RFbGVtZW50ID0gZG9qby5kb20uZ2V0Rmlyc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbigvKiBFbGVtZW50ICovcGFyZW50Tm9kZSwgLyogc3RyaW5nPyAqL3RhZ05hbWUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgbWF0Y2hpbmcgdGFnTmFtZQorCXZhciBub2RlID0gcGFyZW50Tm9kZS5maXJzdENoaWxkOworCXdoaWxlKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpeworCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwl9CisJaWYodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLm5leHRFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsJLy8JRWxlbWVudAorfQorCitkb2pvLmRvbS5sYXN0RWxlbWVudCA9IGRvam8uZG9tLmdldExhc3RDaGlsZEVsZW1lbnQgPSBmdW5jdGlvbigvKiBFbGVtZW50ICovcGFyZW50Tm9kZSwgLyogc3RyaW5nPyAqL3RhZ05hbWUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgdGhlIGxhc3QgY2hpbGQgZWxlbWVudCBtYXRjaGluZyB0YWdOYW1lCisJdmFyIG5vZGUgPSBwYXJlbnROb2RlLmxhc3RDaGlsZDsKKwl3aGlsZShub2RlICYmIG5vZGUubm9kZVR5cGUgIT0gZG9qby5kb20uRUxFTUVOVF9OT0RFKSB7CisJCW5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZzsKKwl9CisJaWYodGFnTmFtZSAmJiBub2RlICYmIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHsKKwkJbm9kZSA9IGRvam8uZG9tLnByZXZFbGVtZW50KG5vZGUsIHRhZ05hbWUpOworCX0KKwlyZXR1cm4gbm9kZTsJLy8JRWxlbWVudAorfQorCitkb2pvLmRvbS5uZXh0RWxlbWVudCA9IGRvam8uZG9tLmdldE5leHRTaWJsaW5nRWxlbWVudCA9IGZ1bmN0aW9uKC8qIE5vZGUgKi9ub2RlLCAvKiBzdHJpbmc/ICovdGFnTmFtZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgbWF0Y2hpbmcgdGFnTmFtZQorCWlmKCFub2RlKSB7IHJldHVybiBudWxsOyB9CisJZG8geworCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwl9IHdoaWxlKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPSBkb2pvLmRvbS5FTEVNRU5UX05PREUpOworCisJaWYobm9kZSAmJiB0YWdOYW1lICYmIHRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgeworCQlyZXR1cm4gZG9qby5kb20ubmV4dEVsZW1lbnQobm9kZSwgdGFnTmFtZSk7CisJfQorCXJldHVybiBub2RlOwkvLwlFbGVtZW50Cit9CisKK2Rvam8uZG9tLnByZXZFbGVtZW50ID0gZG9qby5kb20uZ2V0UHJldmlvdXNTaWJsaW5nRWxlbWVudCA9IGZ1bmN0aW9uKC8qIE5vZGUgKi9ub2RlLCAvKiBzdHJpbmc/ICovdGFnTmFtZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IG1hdGNoaW5nIHRhZ05hbWUKKwlpZighbm9kZSkgeyByZXR1cm4gbnVsbDsgfQorCWlmKHRhZ05hbWUpIHsgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsgfQorCWRvIHsKKwkJbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOworCX0gd2hpbGUobm9kZSAmJiBub2RlLm5vZGVUeXBlICE9IGRvam8uZG9tLkVMRU1FTlRfTk9ERSk7CisKKwlpZihub2RlICYmIHRhZ05hbWUgJiYgdGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7CisJCXJldHVybiBkb2pvLmRvbS5wcmV2RWxlbWVudChub2RlLCB0YWdOYW1lKTsKKwl9CisJcmV0dXJuIG5vZGU7CS8vCUVsZW1lbnQKK30KKworLy8gVE9ETzogaG1waAorLyp0aGlzLmZvckVhY2hDaGlsZFRhZyA9IGZ1bmN0aW9uKG5vZGUsIHVuYXJ5RnVuYykgeworCXZhciBjaGlsZCA9IHRoaXMuZ2V0Rmlyc3RDaGlsZFRhZyhub2RlKTsKKwl3aGlsZShjaGlsZCkgeworCQlpZih1bmFyeUZ1bmMoY2hpbGQpID09ICJicmVhayIpIHsgYnJlYWs7IH0KKwkJY2hpbGQgPSB0aGlzLmdldE5leHRTaWJsaW5nVGFnKGNoaWxkKTsKKwl9Cit9Ki8KKworZG9qby5kb20ubW92ZUNoaWxkcmVuID0gZnVuY3Rpb24oLypFbGVtZW50Ki9zcmNOb2RlLCAvKkVsZW1lbnQqL2Rlc3ROb2RlLCAvKmJvb2xlYW4/Ki90cmltKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlNb3ZlcyBjaGlsZHJlbiBmcm9tIHNyY05vZGUgdG8gZGVzdE5vZGUgYW5kIHJldHVybnMgdGhlIGNvdW50IG9mCisJLy8JCWNoaWxkcmVuIG1vdmVkOyB3aWxsIHRyaW0gb2ZmIHRleHQgbm9kZXMgaWYgdHJpbSA9PSB0cnVlCisJdmFyIGNvdW50ID0gMDsKKwlpZih0cmltKSB7CisJCXdoaWxlKHNyY05vZGUuaGFzQ2hpbGROb2RlcygpICYmCisJCQlzcmNOb2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gZG9qby5kb20uVEVYVF9OT0RFKSB7CisJCQlzcmNOb2RlLnJlbW92ZUNoaWxkKHNyY05vZGUuZmlyc3RDaGlsZCk7CisJCX0KKwkJd2hpbGUoc3JjTm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYKKwkJCXNyY05vZGUubGFzdENoaWxkLm5vZGVUeXBlID09IGRvam8uZG9tLlRFWFRfTk9ERSkgeworCQkJc3JjTm9kZS5yZW1vdmVDaGlsZChzcmNOb2RlLmxhc3RDaGlsZCk7CisJCX0KKwl9CisJd2hpbGUoc3JjTm9kZS5oYXNDaGlsZE5vZGVzKCkpeworCQlkZXN0Tm9kZS5hcHBlbmRDaGlsZChzcmNOb2RlLmZpcnN0Q2hpbGQpOworCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7CS8vCW51bWJlcgorfQorCitkb2pvLmRvbS5jb3B5Q2hpbGRyZW4gPSBmdW5jdGlvbigvKkVsZW1lbnQqL3NyY05vZGUsIC8qRWxlbWVudCovZGVzdE5vZGUsIC8qYm9vbGVhbj8qL3RyaW0peworCS8vCXN1bW1hcnk6CisJLy8JCUNvcGllcyBjaGlsZHJlbiBmcm9tIHNyY05kZSB0byBkZXN0Tm9kZSBhbmQgcmV0dXJucyB0aGUgY291bnQgb2YKKwkvLwkJY2hpbGRyZW4gY29waWVkOyB3aWxsIHRyaW0gb2ZmIHRleHQgbm9kZXMgaWYgdHJpbSA9PSB0cnVlCisJdmFyIGNsb25lZE5vZGUgPSBzcmNOb2RlLmNsb25lTm9kZSh0cnVlKTsKKwlyZXR1cm4gdGhpcy5tb3ZlQ2hpbGRyZW4oY2xvbmVkTm9kZSwgZGVzdE5vZGUsIHRyaW0pOwkvLwludW1iZXIKK30KKworZG9qby5kb20ucmVwbGFjZUNoaWxkcmVuID0gZnVuY3Rpb24oLypFbGVtZW50Ki9ub2RlLCAvKk5vZGUqL25ld0NoaWxkKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlSZW1vdmVzIGFsbCBjaGlsZHJlbiBvZiBub2RlIGFuZCBhcHBlbmRzIG5ld0NoaWxkLiBBbGwgdGhlIGV4aXN0aW5nCisJLy8JCWNoaWxkcmVuIHdpbGwgYmUgZGVzdHJveWVkLgorCS8vIEZJWE1FOiB3aGF0IGlmIG5ld0NoaWxkIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0PworCXZhciBub2RlcyA9IFtdOworCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQlmb3IodmFyIGk9MDtpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKXsKKwkJCW5vZGVzLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJfQorCX0KKwlkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbihub2RlKTsKKwlub2RlLmFwcGVuZENoaWxkKG5ld0NoaWxkKTsKKwlmb3IodmFyIGk9MDtpPG5vZGVzLmxlbmd0aDtpKyspeworCQlkb2pvLmRvbS5kZXN0cm95Tm9kZShub2Rlc1tpXSk7CisJfQorfQorCitkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKC8qRWxlbWVudCovbm9kZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSBub2RlIGFuZCByZXR1cm5zIHRoZSBjb3VudCBvZiBjaGlsZHJlbiByZW1vdmVkLgorCS8vCQlUaGUgY2hpbGRyZW4gbm9kZXMgYXJlIG5vdCBkZXN0cm95ZWQuIEJlIHN1cmUgdG8gY2FsbCBkZXN0cm95Tm9kZSBvbiB0aGVtCisJLy8JCWFmdGVyIHRoZXkgYXJlIG5vdCB1c2VkIGFueW1vcmUuCisJdmFyIGNvdW50ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsKKwl3aGlsZShub2RlLmhhc0NoaWxkTm9kZXMoKSl7IGRvam8uZG9tLnJlbW92ZU5vZGUobm9kZS5maXJzdENoaWxkKTsgfQorCXJldHVybiBjb3VudDsgLy8gaW50Cit9CisKK2Rvam8uZG9tLnJlcGxhY2VOb2RlID0gZnVuY3Rpb24oLypFbGVtZW50Ki9ub2RlLCAvKkVsZW1lbnQqL25ld05vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJlcGxhY2VzIG5vZGUgd2l0aCBuZXdOb2RlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIG5vZGUuCisJLy8JCVRvIHByZXZlbnQgSUUgbWVtb3J5IGxlYWssIGNhbGwgZGVzdHJveU5vZGUgb24gdGhlIHJldHVybmVkIG5vZGUgd2hlbgorCS8vCQlpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCXJldHVybiBub2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld05vZGUsIG5vZGUpOyAvLyBOb2RlCit9CisKK2Rvam8uZG9tLmRlc3Ryb3lOb2RlID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlkZXN0cm95IGEgbm9kZSAoaXQgY2FuIG5vdCBiZSB1c2VkIGFueSBtb3JlKS4gRm9yIElFLCB0aGlzIGlzIHRoZQorCS8vCQlyaWdodCBmdW5jdGlvbiB0byBjYWxsIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiBXaGlsZSBmb3Igb3RoZXIKKwkvLwkJYnJvd3NlcnMsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIGRvam8uZG9tLnJlbW92ZU5vZGUKKwlpZihub2RlLnBhcmVudE5vZGUpeworCQlub2RlID0gZG9qby5kb20ucmVtb3ZlTm9kZShub2RlKTsKKwl9CisJaWYobm9kZS5ub2RlVHlwZSAhPSAzKXsgLy8gaW5nb3JlIFRFWFRfTk9ERQorCQlpZihkb2pvLmV2YWxPYmpQYXRoKCJkb2pvLmV2ZW50LmJyb3dzZXIuY2xlYW4iLCBmYWxzZSkpeworCQkJZG9qby5ldmVudC5icm93c2VyLmNsZWFuKG5vZGUpOworCQl9CisJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJbm9kZS5vdXRlckhUTUw9Jyc7IC8vcHJldmVudCB1Z2x5IElFIG1lbSBsZWFrIGFzc29jaWF0ZWQgd2l0aCBOb2RlLnJlbW92ZUNoaWxkICh0aWNrZXQgIzE3MjcpCisJCX0KKwl9Cit9CisKK2Rvam8uZG9tLnJlbW92ZU5vZGUgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vIHN1bW1hcnk6CisJLy8JCWlmIG5vZGUgaGFzIGEgcGFyZW50LCByZW1vdmVzIG5vZGUgZnJvbSBwYXJlbnQgYW5kIHJldHVybnMgYQorCS8vCQlyZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgY2hpbGQuCisJLy8JCVRvIHByZXZlbnQgSUUgbWVtb3J5IGxlYWssIGNhbGwgZGVzdHJveU5vZGUgb24gdGhlIHJldHVybmVkIG5vZGUgd2hlbgorCS8vCQlpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCS8vCW5vZGU6CisJLy8JCXRoZSBub2RlIHRvIHJlbW92ZSBmcm9tIGl0cyBwYXJlbnQuCisKKwlpZihub2RlICYmIG5vZGUucGFyZW50Tm9kZSl7CisJCS8vIHJldHVybiBhIHJlZiB0byB0aGUgcmVtb3ZlZCBjaGlsZAorCQlyZXR1cm4gbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOyAvL05vZGUKKwl9Cit9CisKK2Rvam8uZG9tLmdldEFuY2VzdG9ycyA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypmdW5jdGlvbj8qL2ZpbHRlckZ1bmN0aW9uLCAvKmJvb2xlYW4/Ki9yZXR1cm5GaXJzdEhpdCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhbGwgYW5jZXN0b3JzIG1hdGNoaW5nIG9wdGlvbmFsIGZpbHRlckZ1bmN0aW9uOyB3aWxsIHJldHVybgorCS8vCQlvbmx5IHRoZSBmaXJzdCBpZiByZXR1cm5GaXJzdEhpdAorCXZhciBhbmNlc3RvcnMgPSBbXTsKKwl2YXIgaXNGdW5jdGlvbiA9IChmaWx0ZXJGdW5jdGlvbiAmJiAoZmlsdGVyRnVuY3Rpb24gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgZmlsdGVyRnVuY3Rpb24gPT0gImZ1bmN0aW9uIikpOworCXdoaWxlKG5vZGUpeworCQlpZighaXNGdW5jdGlvbiB8fCBmaWx0ZXJGdW5jdGlvbihub2RlKSl7CisJCQlhbmNlc3RvcnMucHVzaChub2RlKTsKKwkJfQorCQlpZihyZXR1cm5GaXJzdEhpdCAmJiBhbmNlc3RvcnMubGVuZ3RoID4gMCl7IAorCQkJcmV0dXJuIGFuY2VzdG9yc1swXTsgCS8vCU5vZGUKKwkJfQorCQkKKwkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwl9CisJaWYocmV0dXJuRmlyc3RIaXQpeyByZXR1cm4gbnVsbDsgfQorCXJldHVybiBhbmNlc3RvcnM7CS8vCWFycmF5Cit9CisKK2Rvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKlN0cmluZyovdGFnLCAvKmJvb2xlYW4/Ki9yZXR1cm5GaXJzdEhpdCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJcmV0dXJucyBhbGwgYW5jZXN0b3JzIG1hdGNoaW5nIHRhZyAoYXMgdGFnTmFtZSksIHdpbGwgb25seSByZXR1cm4KKwkvLwkJZmlyc3Qgb25lIGlmIHJldHVybkZpcnN0SGl0CisJdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7CisJcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9ycyhub2RlLCBmdW5jdGlvbihlbCl7CisJCXJldHVybiAoKGVsLnRhZ05hbWUpJiYoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZykpOworCX0sIHJldHVybkZpcnN0SGl0KTsJLy8JTm9kZSB8fCBhcnJheQorfQorCitkb2pvLmRvbS5nZXRGaXJzdEFuY2VzdG9yQnlUYWcgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUsIC8qc3RyaW5nKi90YWcpeworCS8vCXN1bW1hcnk6CisJLy8JCVJldHVybnMgZmlyc3QgYW5jZXN0b3Igb2Ygbm9kZSB3aXRoIHRhZyB0YWdOYW1lCisJcmV0dXJuIGRvam8uZG9tLmdldEFuY2VzdG9yc0J5VGFnKG5vZGUsIHRhZywgdHJ1ZSk7CS8vCU5vZGUKK30KKworZG9qby5kb20uaXNEZXNjZW5kYW50T2YgPSBmdW5jdGlvbigvKiBOb2RlICovbm9kZSwgLyogTm9kZSAqL2FuY2VzdG9yLCAvKiBib29sZWFuPyAqL2d1YXJhbnRlZURlc2NlbmRhbnQpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIGJvb2xlYW4gaWYgbm9kZSBpcyBhIGRlc2NlbmRhbnQgb2YgYW5jZXN0b3IKKwkvLyBndWFyYW50ZWVEZXNjZW5kYW50IGFsbG93cyB1cyB0byBiZSBhICJ0cnVlIiBpc0Rlc2NlbmRhbnRPZiBmdW5jdGlvbgorCWlmKGd1YXJhbnRlZURlc2NlbmRhbnQgJiYgbm9kZSkgeyBub2RlID0gbm9kZS5wYXJlbnROb2RlOyB9CisJd2hpbGUobm9kZSkgeworCQlpZihub2RlID09IGFuY2VzdG9yKXsgCisJCQlyZXR1cm4gdHJ1ZTsgCS8vCWJvb2xlYW4KKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gZmFsc2U7CS8vCWJvb2xlYW4KK30KKworZG9qby5kb20uaW5uZXJYTUwgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCUltcGxlbWVudGF0aW9uIG9mIE1TJ3MgaW5uZXJYTUwgZnVuY3Rpb24uCisJaWYobm9kZS5pbm5lclhNTCl7CisJCXJldHVybiBub2RlLmlubmVyWE1MOwkvLwlzdHJpbmcKKwl9ZWxzZSBpZiAobm9kZS54bWwpeworCQlyZXR1cm4gbm9kZS54bWw7CQkvLwlzdHJpbmcKKwl9ZWxzZSBpZih0eXBlb2YgWE1MU2VyaWFsaXplciAhPSAidW5kZWZpbmVkIil7CisJCXJldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcobm9kZSk7CS8vCXN0cmluZworCX0KK30KKworZG9qby5kb20uY3JlYXRlRG9jdW1lbnQgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnk6CisJLy8JCWNyb3NzLWJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRpbmcgYW4gWE1MIGRvY3VtZW50IG9iamVjdC4KKwl2YXIgZG9jID0gbnVsbDsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKworCWlmKCFkal91bmRlZigiQWN0aXZlWE9iamVjdCIpKXsKKwkJdmFyIHByZWZpeGVzID0gWyAiTVNYTUwyIiwgIk1pY3Jvc29mdCIsICJNU1hNTCIsICJNU1hNTDMiIF07CisJCWZvcih2YXIgaSA9IDA7IGk8cHJlZml4ZXMubGVuZ3RoOyBpKyspeworCQkJdHJ5eworCQkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KHByZWZpeGVzW2ldKyIuWE1MRE9NIik7CisJCQl9Y2F0Y2goZSl7IC8qIHNxdWVsY2ggKi8gfTsKKworCQkJaWYoZG9jKXsgYnJlYWs7IH0KKwkJfQorCX1lbHNlIGlmKChfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24pJiYKKwkJKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCkpeworCQlkb2MgPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsKKwl9CisJCisJcmV0dXJuIGRvYzsJLy8JRE9NRG9jdW1lbnQKK30KKworZG9qby5kb20uY3JlYXRlRG9jdW1lbnRGcm9tVGV4dCA9IGZ1bmN0aW9uKC8qc3RyaW5nKi9zdHIsIC8qc3RyaW5nPyovbWltZXR5cGUpeworCS8vCXN1bW1hcnk6CisJLy8JCWF0dGVtcHRzIHRvIGNyZWF0ZSBhIERvY3VtZW50IG9iamVjdCBiYXNlZCBvbiBvcHRpb25hbCBtaW1lLXR5cGUsCisJLy8JCXVzaW5nIHN0ciBhcyB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50CisJaWYoIW1pbWV0eXBlKXsgbWltZXR5cGUgPSAidGV4dC94bWwiOyB9CisJaWYoIWRqX3VuZGVmKCJET01QYXJzZXIiKSl7CisJCXZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CisJCXJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN0ciwgbWltZXR5cGUpOwkvLwlET01Eb2N1bWVudAorCX1lbHNlIGlmKCFkal91bmRlZigiQWN0aXZlWE9iamVjdCIpKXsKKwkJdmFyIGRvbURvYyA9IGRvam8uZG9tLmNyZWF0ZURvY3VtZW50KCk7CisJCWlmKGRvbURvYyl7CisJCQlkb21Eb2MuYXN5bmMgPSBmYWxzZTsKKwkJCWRvbURvYy5sb2FkWE1MKHN0cik7CisJCQlyZXR1cm4gZG9tRG9jOwkvLwlET01Eb2N1bWVudAorCQl9ZWxzZXsKKwkJCWRvam8uZGVidWcoInRvWG1sIGRpZG4ndCB3b3JrPyIpOworCQl9CisJLyoKKwl9ZWxzZSBpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSl7CisJCS8vIEZJWE1FOiB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmshCisJCS8vIGZyb206IGh0dHA6Ly93ZWItZ3JhcGhpY3MuY29tL210YXJjaGl2ZS8wMDE2MDYucGhwCisJCS8vIHZhciB4bWwgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JytzdHI7CisJCXZhciBtdHlwZSA9ICJ0ZXh0L3htbCI7CisJCXZhciB4bWwgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JytzdHI7CisJCXZhciB1cmwgPSAiZGF0YToiK210eXBlKyI7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudCh4bWwpOworCQl2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCXJlcS5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKKwkJcmVxLm92ZXJyaWRlTWltZVR5cGUobXR5cGUpOworCQlyZXEuc2VuZChudWxsKTsKKwkJcmV0dXJuIHJlcS5yZXNwb25zZVhNTDsKKwkqLworCX1lbHNleworCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJaWYoX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQpeworCQkJLy8gRklYTUU6IHRoaXMgbWF5IGNoYW5nZSBhbGwgdGFncyB0byB1cHBlcmNhc2UhCisJCQl2YXIgdG1wID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInhtbCIpOworCQkJdG1wLmlubmVySFRNTCA9IHN0cjsKKwkJCWlmKF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbiAmJiBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpeworCQkJCXZhciB4bWxEb2MgPSBfZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoImZvbyIsICIiLCBudWxsKTsKKwkJCQlmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJeG1sRG9jLmltcG9ydE5vZGUodG1wLmNoaWxkTm9kZXMuaXRlbShpKSwgdHJ1ZSk7CisJCQkJfQorCQkJCXJldHVybiB4bWxEb2M7CS8vCURPTURvY3VtZW50CisJCQl9CisJCQkvLyBGSVhNRTogcHJvYmFibHkgbm90IGEgZ29vZCBpZGVhIHRvIGhhdmUgdG8gcmV0dXJuIGFuIEhUTUwgZnJhZ21lbnQKKwkJCS8vIEZJWE1FOiB0aGUgdG1wLmRvYy5maXJzdENoaWxkIGlzIGFzIHRlc3RlZCBmcm9tIElFLCBzbyBpdCBtYXkgbm90CisJCQkvLyB3b3JrIHRoYXQgd2F5IGFjcm9zcyB0aGUgYm9hcmQKKwkJCXJldHVybiAoKHRtcC5kb2N1bWVudCkmJgorCQkJCSh0bXAuZG9jdW1lbnQuZmlyc3RDaGlsZCA/ICB0bXAuZG9jdW1lbnQuZmlyc3RDaGlsZCA6IHRtcCkpOwkvLwlET01Eb2N1bWVudAorCQl9CisJfQorCXJldHVybiBudWxsOworfQorCitkb2pvLmRvbS5wcmVwZW5kQ2hpbGQgPSBmdW5jdGlvbigvKkVsZW1lbnQqL25vZGUsIC8qRWxlbWVudCovcGFyZW50KXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlwcmVwZW5kcyBub2RlIHRvIHBhcmVudCdzIGNoaWxkcmVuIG5vZGVzCisJaWYocGFyZW50LmZpcnN0Q2hpbGQpIHsKKwkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBwYXJlbnQuZmlyc3RDaGlsZCk7CisJfSBlbHNlIHsKKwkJcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUsIC8qTm9kZSovcmVmLCAvKmJvb2xlYW4/Ki9mb3JjZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJVHJ5IHRvIGluc2VydCBub2RlIGJlZm9yZSByZWYKKwlpZigJKGZvcmNlICE9IHRydWUpJiYKKwkJKG5vZGUgPT09IHJlZiB8fCBub2RlLm5leHRTaWJsaW5nID09PSByZWYpKXsgcmV0dXJuIGZhbHNlOyB9CisJdmFyIHBhcmVudCA9IHJlZi5wYXJlbnROb2RlOworCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmKTsKKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypOb2RlKi9yZWYsIC8qYm9vbGVhbj8qL2ZvcmNlKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlUcnkgdG8gaW5zZXJ0IG5vZGUgYWZ0ZXIgcmVmCisJdmFyIHBuID0gcmVmLnBhcmVudE5vZGU7CisJaWYocmVmID09IHBuLmxhc3RDaGlsZCl7CisJCWlmKChmb3JjZSAhPSB0cnVlKSYmKG5vZGUgPT09IHJlZikpeworCQkJcmV0dXJuIGZhbHNlOwkvLwlib29sZWFuCisJCX0KKwkJcG4uYXBwZW5kQ2hpbGQobm9kZSk7CisJfWVsc2V7CisJCXJldHVybiB0aGlzLmluc2VydEJlZm9yZShub2RlLCByZWYubmV4dFNpYmxpbmcsIGZvcmNlKTsJLy8JYm9vbGVhbgorCX0KKwlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmRvbS5pbnNlcnRBdFBvc2l0aW9uID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKk5vZGUqL3JlZiwgLypzdHJpbmcqL3Bvc2l0aW9uKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlhdHRlbXB0IHRvIGluc2VydCBub2RlIGluIHJlbGF0aW9uIHRvIHJlZiBiYXNlZCBvbiBwb3NpdGlvbgorCWlmKCghbm9kZSl8fCghcmVmKXx8KCFwb3NpdGlvbikpeyAKKwkJcmV0dXJuIGZhbHNlOwkvLwlib29sZWFuIAorCX0KKwlzd2l0Y2gocG9zaXRpb24udG9Mb3dlckNhc2UoKSl7CisJCWNhc2UgImJlZm9yZSI6CisJCQlyZXR1cm4gZG9qby5kb20uaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZik7CS8vCWJvb2xlYW4KKwkJY2FzZSAiYWZ0ZXIiOgorCQkJcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUsIHJlZik7CQkvLwlib29sZWFuCisJCWNhc2UgImZpcnN0IjoKKwkJCWlmKHJlZi5maXJzdENoaWxkKXsKKwkJCQlyZXR1cm4gZG9qby5kb20uaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZi5maXJzdENoaWxkKTsJLy8JYm9vbGVhbgorCQkJfWVsc2V7CisJCQkJcmVmLmFwcGVuZENoaWxkKG5vZGUpOworCQkJCXJldHVybiB0cnVlOwkvLwlib29sZWFuCisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogLy8gYWthOiBsYXN0CisJCQlyZWYuYXBwZW5kQ2hpbGQobm9kZSk7CisJCQlyZXR1cm4gdHJ1ZTsJLy8JYm9vbGVhbgorCX0KK30KKworZG9qby5kb20uaW5zZXJ0QXRJbmRleCA9IGZ1bmN0aW9uKC8qTm9kZSovbm9kZSwgLypFbGVtZW50Ki9jb250YWluaW5nTm9kZSwgLypudW1iZXIqL2luc2VydGlvbkluZGV4KXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlpbnNlcnQgbm9kZSBpbnRvIGNoaWxkIG5vZGVzIG5vZGVsaXN0IG9mIGNvbnRhaW5pbmdOb2RlIGF0CisJLy8JCWluc2VydGlvbkluZGV4LiBpbnNlcnRpb25JbmRleCBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAKKwkvLwkJdGhlIG51bWJlciBvZiB0aGUgY2hpbGROb2RlcyBpbiBjb250YWluaW5nTm9kZS4gaW5zZXJ0aW9uSW5kZXgKKwkvLwkJc3BlY2lmeXMgYWZ0ZXIgaG93IG1hbnkgY2hpbGROb2RlcyBpbiBjb250YWluaW5nTm9kZSB0aGUgbm9kZQorCS8vCQlzaGFsbCBiZSBpbnNlcnRlZC4gSWYgMCBpcyBnaXZlbiwgbm9kZSB3aWxsIGJlIGFwcGVuZGVkIHRvIAorCS8vCQljb250YWluaW5nTm9kZS4KKwl2YXIgc2libGluZ05vZGVzID0gY29udGFpbmluZ05vZGUuY2hpbGROb2RlczsKKworCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkga2lkcyB5ZXQsIGp1c3QgYWRkIGl0IHRvIHRoZSBiZWdpbm5pbmcKKworCWlmICghc2libGluZ05vZGVzLmxlbmd0aCB8fCBzaWJsaW5nTm9kZXMubGVuZ3RoID09IGluc2VydGlvbkluZGV4KXsKKwkJY29udGFpbmluZ05vZGUuYXBwZW5kQ2hpbGQobm9kZSk7CisJCXJldHVybiB0cnVlOwkvLwlib29sZWFuCisJfQorCisJaWYoaW5zZXJ0aW9uSW5kZXggPT0gMCl7CisJCXJldHVybiBkb2pvLmRvbS5wcmVwZW5kQ2hpbGQobm9kZSwgY29udGFpbmluZ05vZGUpOwkvLwlib29sZWFuCisJfQorCS8vIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHdhbGsgdGhlIGNoaWxkTm9kZXMKKwkvLyBhbmQgZmluZCBvdXIgc3BvdAorCisJcmV0dXJuIGRvam8uZG9tLmluc2VydEFmdGVyKG5vZGUsIHNpYmxpbmdOb2Rlc1tpbnNlcnRpb25JbmRleC0xXSk7CS8vCWJvb2xlYW4KK30KKwkKK2Rvam8uZG9tLnRleHRDb250ZW50ID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlLCAvKnN0cmluZyovdGV4dCl7CisJLy8Jc3VtbWFyeToKKwkvLwkJaW1wbGVtZW50YXRpb24gb2YgdGhlIERPTSBMZXZlbCAzIGF0dHJpYnV0ZTsgc2NhbiBub2RlIGZvciB0ZXh0CisJaWYgKGFyZ3VtZW50cy5sZW5ndGg+MSkgeworCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJZG9qby5kb20ucmVwbGFjZUNoaWxkcmVuKG5vZGUsIF9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CisJCXJldHVybiB0ZXh0OwkvLwlzdHJpbmcKKwl9IGVsc2UgeworCQlpZihub2RlLnRleHRDb250ZW50ICE9IHVuZGVmaW5lZCl7IC8vRkYgMS41CisJCQlyZXR1cm4gbm9kZS50ZXh0Q29udGVudDsJLy8Jc3RyaW5nCisJCX0KKwkJdmFyIF9yZXN1bHQgPSAiIjsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gX3Jlc3VsdDsgfQorCQlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJc3dpdGNoIChub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVR5cGUpIHsKKwkJCQljYXNlIDE6IC8vIEVMRU1FTlRfTk9ERQorCQkJCWNhc2UgNTogLy8gRU5USVRZX1JFRkVSRU5DRV9OT0RFCisJCQkJCV9yZXN1bHQgKz0gZG9qby5kb20udGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOiAvLyBURVhUX05PREUKKwkJCQljYXNlIDI6IC8vIEFUVFJJQlVURV9OT0RFCisJCQkJY2FzZSA0OiAvLyBDREFUQV9TRUNUSU9OX05PREUKKwkJCQkJX3Jlc3VsdCArPSBub2RlLmNoaWxkTm9kZXNbaV0ubm9kZVZhbHVlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gX3Jlc3VsdDsJLy8Jc3RyaW5nCisJfQorfQorCitkb2pvLmRvbS5oYXNQYXJlbnQgPSBmdW5jdGlvbigvKk5vZGUqL25vZGUpeworCS8vCXN1bW1hcnk6CisJLy8JCXJldHVybnMgd2hldGhlciBvciBub3Qgbm9kZSBpcyBhIGNoaWxkIG9mIGFub3RoZXIgbm9kZS4KKwlyZXR1cm4gQm9vbGVhbihub2RlICYmIG5vZGUucGFyZW50Tm9kZSAmJiBkb2pvLmRvbS5pc05vZGUobm9kZS5wYXJlbnROb2RlKSk7CS8vCWJvb2xlYW4KK30KKworLyoqCisgKiBFeGFtcGxlczoKKyAqCisgKiBteUZvb05vZGUgPSA8Zm9vIC8+CisgKiBpc1RhZyhteUZvb05vZGUsICJmb28iKTsgLy8gcmV0dXJucyAiZm9vIgorICogaXNUYWcobXlGb29Ob2RlLCAiYmFyIik7IC8vIHJldHVybnMgIiIKKyAqIGlzVGFnKG15Rm9vTm9kZSwgIkZPTyIpOyAvLyByZXR1cm5zICIiCisgKiBpc1RhZyhteUZvb05vZGUsICJoZXkiLCAiZm9vIiwgImJhciIpOyAvLyByZXR1cm5zICJmb28iCisqKi8KK2Rvam8uZG9tLmlzVGFnID0gZnVuY3Rpb24oLyogTm9kZSAqL25vZGUgLyogLi4uICovKXsKKwkvLwlzdW1tYXJ5OgorCS8vCQlkZXRlcm1pbmVzIGlmIG5vZGUgaGFzIGFueSBvZiB0aGUgcHJvdmlkZWQgdGFnIG5hbWVzIGFuZCByZXR1cm5zCisJLy8JCXRoZSB0YWcgbmFtZSB0aGF0IG1hdGNoZXMsIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCisJaWYobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJZm9yKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCWlmKG5vZGUudGFnTmFtZT09U3RyaW5nKGFyZ3VtZW50c1tpXSkpeworCQkJCXJldHVybiBTdHJpbmcoYXJndW1lbnRzW2ldKTsJLy8Jc3RyaW5nCisJCQl9CisJCX0KKwl9CisJcmV0dXJuICIiOwkvLwlzdHJpbmcKK30KKworZG9qby5kb20uc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbigJLypFbGVtZW50Ki9lbGVtLCAvKnN0cmluZyovbmFtZXNwYWNlVVJJLCAKKwkJCQkJCQkJCS8qc3RyaW5nKi9hdHRyTmFtZSwgLypzdHJpbmcqL2F0dHJWYWx1ZSl7CisJLy8Jc3VtbWFyeToKKwkvLwkJaW1wbGVtZW50YXRpb24gb2YgRE9NMiBzZXRBdHRyaWJ1dGVOUyB0aGF0IHdvcmtzIGNyb3NzIGJyb3dzZXIuCisJaWYoZWxlbSA9PSBudWxsIHx8ICgoZWxlbSA9PSB1bmRlZmluZWQpJiYodHlwZW9mIGVsZW0gPT0gInVuZGVmaW5lZCIpKSl7CisJCWRvam8ucmFpc2UoIk5vIGVsZW1lbnQgZ2l2ZW4gdG8gZG9qby5kb20uc2V0QXR0cmlidXRlTlMiKTsKKwl9CisJCisJaWYoISgoZWxlbS5zZXRBdHRyaWJ1dGVOUyA9PSB1bmRlZmluZWQpJiYodHlwZW9mIGVsZW0uc2V0QXR0cmlidXRlTlMgPT0gInVuZGVmaW5lZCIpKSl7IC8vIHczYworCQllbGVtLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7CisJfWVsc2V7IC8vIElFCisJCS8vIGdldCBhIHJvb3QgWE1MIGRvY3VtZW50CisJCXZhciBvd25lckRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKKwkJdmFyIGF0dHJpYnV0ZSA9IG93bmVyRG9jLmNyZWF0ZU5vZGUoCisJCQkyLCAvLyBub2RlIHR5cGUKKwkJCWF0dHJOYW1lLAorCQkJbmFtZXNwYWNlVVJJCisJCSk7CisJCQorCQkvLyBzZXQgdmFsdWUKKwkJYXR0cmlidXRlLm5vZGVWYWx1ZSA9IGF0dHJWYWx1ZTsKKwkJCisJCS8vIGF0dGFjaCB0byBlbGVtZW50CisJCWVsZW0uc2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOworCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLnVuZG8uYnJvd3NlciIpOworCisKK3RyeXsKKwlpZigoIWRqQ29uZmlnWyJwcmV2ZW50QmFja0J1dHRvbkZpeCJdKSYmKCFkb2pvLmhvc3RlbnYucG9zdF9sb2FkXykpeworCQlkb2N1bWVudC53cml0ZSgiPGlmcmFtZSBzdHlsZT0nYm9yZGVyOiAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IGJvdHRvbTogMHB4OyByaWdodDogMHB4OyB2aXNpYmlsaXR5OiB2aXNpYmxlOycgbmFtZT0nZGpoaXN0b3J5JyBpZD0nZGpoaXN0b3J5JyBzcmM9JyIgKyAoZGpDb25maWdbImRvam9JZnJhbWVIaXN0b3J5VXJsIl0gfHwgZG9qby5ob3N0ZW52LmdldEJhc2VTY3JpcHRVcmkoKSsnaWZyYW1lX2hpc3RvcnkuaHRtbCcpICsgIic+PC9pZnJhbWU+Iik7CisJfQorfWNhdGNoKGUpey8qIHNxdWVsY2ggKi99CisKK2lmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworCWRvam8uZGVidWcoIk9wZXJhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb2pvLnVuZG8uYnJvd3Nlciwgc28gYmFjay9mb3J3YXJkIGRldGVjdGlvbiB3aWxsIG5vdCB3b3JrLiIpOworfQorCitkb2pvLnVuZG8uYnJvd3NlciA9IHsKKwlpbml0aWFsSHJlZjogKCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiAiIiwKKwlpbml0aWFsSGFzaDogKCFkal91bmRlZigid2luZG93IikpID8gd2luZG93LmxvY2F0aW9uLmhhc2ggOiAiIiwKKworCW1vdmVGb3J3YXJkOiBmYWxzZSwKKwloaXN0b3J5U3RhY2s6IFtdLAorCWZvcndhcmRTdGFjazogW10sCisJaGlzdG9yeUlmcmFtZTogbnVsbCwKKwlib29rbWFya0FuY2hvcjogbnVsbCwKKwlsb2NhdGlvblRpbWVyOiBudWxsLAorCisJLyoqCisJICogCisJICovCisJc2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigvKk9iamVjdCovYXJncyl7CisJCS8vc3VtbWFyeTogU2V0cyB0aGUgc3RhdGUgb2JqZWN0IGFuZCBiYWNrIGNhbGxiYWNrIGZvciB0aGUgdmVyeSBmaXJzdCBwYWdlIHRoYXQgaXMgbG9hZGVkLgorCQkvL2Rlc2NyaXB0aW9uOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoaXMgbWV0aG9kIGFzIHBhcnQgb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIHZpYQorCQkvL2Rvam8uYWRkT25Mb2FkKCkuCisJCS8vYXJnczogT2JqZWN0CisJCS8vCQlTZWUgdGhlIGFkZFRvSGlzdG9yeSgpIGZ1bmN0aW9uIGZvciB0aGUgbGlzdCBvZiB2YWxpZCBhcmdzIHByb3BlcnRpZXMuCisJCXRoaXMuaW5pdGlhbFN0YXRlID0gdGhpcy5fY3JlYXRlU3RhdGUodGhpcy5pbml0aWFsSHJlZiwgYXJncywgdGhpcy5pbml0aWFsSGFzaCk7CisJfSwKKworCS8vRklYTUU6IFdvdWxkIGxpa2UgdG8gc3VwcG9ydCBhcmJpdHJhcnkgYmFjay9mb3J3YXJkIGp1bXBzLiBIYXZlIHRvIHJld29yayBpZnJhbWVMb2FkZWQgYW1vbmcgb3RoZXIgdGhpbmdzLgorCS8vRklYTUU6IGlzIHRoZXJlIGEgc2xpZ2h0IHJhY2UgY29uZGl0aW9uIGluIG1veiB1c2luZyBjaGFuZ2UgVVJMIHdpdGggdGhlIHRpbWVyIGNoZWNrIGFuZCB3aGVuCisJLy8gICAgICAgdGhlIGhhc2ggZ2V0cyBzZXQ/IEkgdGhpbmsgSSBoYXZlIHNlZW4gYSBiYWNrL2ZvcndhcmQgY2FsbCBpbiBxdWljayBzdWNjZXNzaW9uLCBidXQgbm90IGNvbnNpc3RlbnQuCisJYWRkVG9IaXN0b3J5OiBmdW5jdGlvbihhcmdzKXsKKwkJLy9zdW1tYXJ5OiBhZGRzIGEgc3RhdGUgb2JqZWN0IChhcmdzKSB0byB0aGUgaGlzdG9yeSBsaXN0LiBZb3UgbXVzdCBzZXQKKwkJLy9kakNvbmZpZy5wcmV2ZW50QmFja0J1dHRvbkZpeCA9IGZhbHNlIHRvIHVzZSBkb2pvLnVuZG8uYnJvd3Nlci4KKworCQkvL2FyZ3M6IE9iamVjdAorCQkvLwkJYXJncyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisJCS8vCQlUbyBzdXBwb3J0IGdldHRpbmcgYmFjayBidXR0b24gbm90aWZpY2F0aW9ucywgdGhlIG9iamVjdCBhcmd1bWVudCBzaG91bGQgaW1wbGVtZW50IGEKKwkJLy8JCWZ1bmN0aW9uIGNhbGxlZCBlaXRoZXIgImJhY2siLCAiYmFja0J1dHRvbiIsIG9yICJoYW5kbGUiLiBUaGUgc3RyaW5nICJiYWNrIiB3aWxsIGJlCisJCS8vCQlwYXNzZWQgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IGFyZ3VtZW50IHRvIHRoaXMgY2FsbGJhY2suCisJCS8vCQktIFRvIHN1cHBvcnQgZ2V0dGluZyBmb3J3YXJkIGJ1dHRvbiBub3RpZmljYXRpb25zLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHNob3VsZCBpbXBsZW1lbnQgYQorCQkvLwkJZnVuY3Rpb24gY2FsbGVkIGVpdGhlciAiZm9yd2FyZCIsICJmb3J3YXJkQnV0dG9uIiwgb3IgImhhbmRsZSIuIFRoZSBzdHJpbmcgImZvcndhcmQiIHdpbGwgYmUKKwkJLy8JCXBhc3NlZCBhcyB0aGUgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQgdG8gdGhpcyBjYWxsYmFjay4KKwkJLy8JCS0gSWYgeW91IHdhbnQgdGhlIGJyb3dzZXIgbG9jYXRpb24gc3RyaW5nIHRvIGNoYW5nZSwgZGVmaW5lICJjaGFuZ2VVcmwiIG9uIHRoZSBvYmplY3QuIElmIHRoZQorCQkvLwkJdmFsdWUgb2YgImNoYW5nZVVybCIgaXMgdHJ1ZSwgdGhlbiBhIHVuaXF1ZSBudW1iZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIGFzIGEgZnJhZ21lbnQKKwkJLy8JCWlkZW50aWZpZXIgKGh0dHA6Ly9zb21lLmRvbWFpbi5jb20vcGF0aCN1bmlxdWVudW1iZXIpLiBJZiBpdCBpcyBhbnkgb3RoZXIgdmFsdWUgdGhhdCBkb2VzCisJCS8vCQlub3QgZXZhbHVhdGUgdG8gZmFsc2UsIHRoYXQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyLiBGb3IgZXhhbXBsZSwKKwkJLy8JCWlmIGNoYW5nZVVybDogJ3BhZ2UxJywgdGhlbiB0aGUgVVJMIHdpbGwgbG9vayBsaWtlOiBodHRwOi8vc29tZS5kb21haW4uY29tL3BhdGgjcGFnZTEKKwkgCS8vCQlGdWxsIGV4YW1wbGU6CisJCS8vCQlkb2pvLnVuZG8uYnJvd3Nlci5hZGRUb0hpc3RvcnkoeworCQkvLwkJICBiYWNrOiBmdW5jdGlvbigpIHsgYWxlcnQoJ2JhY2sgcHJlc3NlZCcpOyB9LAorCQkvLwkJICBmb3J3YXJkOiBmdW5jdGlvbigpIHsgYWxlcnQoJ2ZvcndhcmQgcHJlc3NlZCcpOyB9LAorCQkvLwkJICBjaGFuZ2VVcmw6IHRydWUKKwkJLy8JCX0pOworCQkvLworCQkvLwlCUk9XU0VSIE5PVEVTOgorCQkvLyAgU2FmYXJpIDEuMjogCisJCS8vCWJhY2sgYnV0dG9uICJ3b3JrcyIgZmluZSwgaG93ZXZlciBpdCdzIG5vdCBwb3NzaWJsZSB0byBhY3R1YWxseQorCQkvLwlERVRFQ1QgdGhhdCB5b3UndmUgbW92ZWQgYmFja3dhcmRzIGJ5IGluc3BlY3Rpbmcgd2luZG93LmxvY2F0aW9uLgorCQkvLwlVbmxlc3MgdGhlcmUgaXMgc29tZSBvdGhlciBtZWFucyBvZiBsb2NhdGluZy4KKwkJLy8JRklYTUU6IHBlcmhhcHMgd2UgY2FuIHBvbGwgb24gaGlzdG9yeS5sZW5ndGg/CisJCS8vCVNhZmFyaSAyLjAuMysgKGFuZCBwcm9iYWJseSAxLjMuMispOgorCQkvLwl3b3JrcyBmaW5lLCBleGNlcHQgd2hlbiBjaGFuZ2VVcmwgaXMgdXNlZC4gV2hlbiBjaGFuZ2VVcmwgaXMgdXNlZCwKKwkJLy8JU2FmYXJpIGp1bXBzIGFsbCB0aGUgd2F5IGJhY2sgdG8gd2hhdGV2ZXIgcGFnZSB3YXMgc2hvd24gYmVmb3JlCisJCS8vCXRoZSBwYWdlIHRoYXQgdXNlcyBkb2pvLnVuZG8uYnJvd3NlciBzdXBwb3J0LgorCQkvLwlJRSA1LjUgU1AyOgorCQkvLwliYWNrIGJ1dHRvbiBiZWhhdmlvciBpcyBtYWNyby4gSXQgZG9lcyBub3QgbW92ZSBiYWNrIHRvIHRoZQorCQkvLwlwcmV2aW91cyBoYXNoIHZhbHVlLCBidXQgdG8gdGhlIGxhc3QgZnVsbCBwYWdlIGxvYWQuIFRoaXMgc3VnZ2VzdHMKKwkJLy8JdGhhdCB0aGUgaWZyYW1lIGlzIHRoZSBjb3JyZWN0IHdheSB0byBjYXB0dXJlIHRoZSBiYWNrIGJ1dHRvbiBpbgorCQkvLwl0aGVzZSBjYXNlcy4KKwkJLy8JRG9uJ3QgdGVzdCB0aGlzIHBhZ2UgdXNpbmcgbG9jYWwgZGlzayBmb3IgTVNJRS4gTVNJRSB3aWxsIG5vdCBjcmVhdGUgCisJCS8vCWEgaGlzdG9yeSBsaXN0IGZvciBpZnJhbWVfaGlzdG9yeS5odG1sIGlmIHNlcnZlZCBmcm9tIGEgZmlsZTogVVJMLiAKKwkJLy8JVGhlIFhNTCBzZXJ2ZWQgYmFjayBmcm9tIHRoZSBYSFIgdGVzdHMgd2lsbCBhbHNvIG5vdCBiZSBwcm9wZXJseSAKKwkJLy8JY3JlYXRlZCBpZiBzZXJ2ZWQgZnJvbSBsb2NhbCBkaXNrLiBTZXJ2ZSB0aGUgdGVzdCBwYWdlcyBmcm9tIGEgd2ViIAorCQkvLwlzZXJ2ZXIgdG8gdGVzdCBpbiB0aGF0IGJyb3dzZXIuCisJCS8vCUlFIDYuMDoKKwkJLy8Jc2FtZSBiZWhhdmlvciBhcyBJRSA1LjUgU1AyCisJCS8vCUZpcmVmb3ggMS4wKzoKKwkJLy8JdGhlIGJhY2sgYnV0dG9uIHdpbGwgcmV0dXJuIHVzIHRvIHRoZSBwcmV2aW91cyBoYXNoIG9uIHRoZSBzYW1lCisJCS8vCXBhZ2UsIHRoZXJlYnkgbm90IHJlcXVpcmluZyBhbiBpZnJhbWUgaGFjaywgYWx0aG91Z2ggd2UgZG8gdGhlbgorCQkvLwluZWVkIHRvIHJ1biBhIHRpbWVyIHRvIGRldGVjdCBpbnRlci1wYWdlIG1vdmVtZW50LgorCisJCS8vSWYgYWRkVG9IaXN0b3J5IGlzIGNhbGxlZCwgdGhlbiB0aGF0IG1lYW5zIHdlIHBydW5lIHRoZQorCQkvL2ZvcndhcmQgc3RhY2sgLS0gdGhlIHVzZXIgd2VudCBiYWNrLCB0aGVuIHdhbnRlZCB0bworCQkvL3N0YXJ0IGEgbmV3IGZvcndhcmQgcGF0aC4KKwkJdGhpcy5mb3J3YXJkU3RhY2sgPSBbXTsgCisKKwkJdmFyIGhhc2ggPSBudWxsOworCQl2YXIgdXJsID0gbnVsbDsKKwkJaWYoIXRoaXMuaGlzdG9yeUlmcmFtZSl7CisJCQlpZihkakNvbmZpZ1sidXNlWERvbWFpbiJdICYmICFkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSl7CisJCQkJZG9qby5kZWJ1ZygiZG9qby51bmRvLmJyb3dzZXI6IFdoZW4gdXNpbmcgY3Jvc3MtZG9tYWluIERvam8gYnVpbGRzLCIKKwkJCQkJKyAiIHBsZWFzZSBzYXZlIGlmcmFtZV9oaXN0b3J5Lmh0bWwgdG8geW91ciBkb21haW4gYW5kIHNldCBkakNvbmZpZy5kb2pvSWZyYW1lSGlzdG9yeVVybCIKKwkJCQkJKyAiIHRvIHRoZSBwYXRoIG9uIHlvdXIgZG9tYWluIHRvIGlmcmFtZV9oaXN0b3J5Lmh0bWwiKTsKKwkJCX0KKwkJCXRoaXMuaGlzdG9yeUlmcmFtZSA9IHdpbmRvdy5mcmFtZXNbImRqaGlzdG9yeSJdOworCQl9CisJCWlmKCF0aGlzLmJvb2ttYXJrQW5jaG9yKXsKKwkJCXRoaXMuYm9va21hcmtBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmJvb2ttYXJrQW5jaG9yKTsKKwkJCXRoaXMuYm9va21hcmtBbmNob3Iuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJfQorCQlpZihhcmdzWyJjaGFuZ2VVcmwiXSl7CisJCQloYXNoID0gIiMiKyAoKGFyZ3NbImNoYW5nZVVybCJdIT09dHJ1ZSkgPyBhcmdzWyJjaGFuZ2VVcmwiXSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpOworCQkJCisJCQkvL0lmIHRoZSBjdXJyZW50IGhhc2ggbWF0Y2hlcyB0aGUgbmV3IG9uZSwganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5IG9iamVjdCB3aXRoCisJCQkvL3RoaXMgbmV3IG9uZS4gSXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHRyYWNrIGRpZmZlcmVudCBzdGF0ZSBvYmplY3RzIGZvciB0aGUgc2FtZQorCQkJLy9sb2dpY2FsIFVSTC4gVGhpcyBtYXRjaGVzIHRoZSBicm93c2VyIGJlaGF2aW9yIG9mIG9ubHkgcHV0dGluZyBpbiBvbmUgaGlzdG9yeQorCQkJLy9pdGVtIG5vIG1hdHRlciBob3cgbWFueSB0aW1lcyB5b3UgY2xpY2sgb24gdGhlIHNhbWUgI2hhc2ggbGluaywgYXQgbGVhc3QgaW4gRmlyZWZveAorCQkJLy9hbmQgU2FmYXJpLCBhbmQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IGluIHRob3NlIGJyb3dzZXJzIHRvIGtub3cgaWYgYSAjaGFzaCBsaW5rCisJCQkvL2hhcyBiZWVuIGNsaWNrZWQgb24gbXVsdGlwbGUgdGltZXMuIFNvIG1ha2luZyB0aGlzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciBpbiBhbGwgYnJvd3NlcnMKKwkJCS8vc28gdGhhdCBkb2pvLnVuZG8uYnJvd3NlcidzIGJlaGF2aW9yIGlzIHRoZSBzYW1lIGluIGFsbCBicm93c2Vycy4KKwkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAwICYmIHRoaXMuaW5pdGlhbFN0YXRlLnVybEhhc2ggPT0gaGFzaCl7CisJCQkJdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLl9jcmVhdGVTdGF0ZSh1cmwsIGFyZ3MsIGhhc2gpOworCQkJCXJldHVybjsKKwkJCX1lbHNlIGlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA+IDAgJiYgdGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoIC0gMV0udXJsSGFzaCA9PSBoYXNoKXsKKwkJCQl0aGlzLmhpc3RvcnlTdGFja1t0aGlzLmhpc3RvcnlTdGFjay5sZW5ndGggLSAxXSA9IHRoaXMuX2NyZWF0ZVN0YXRlKHVybCwgYXJncywgaGFzaCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQl0aGlzLmNoYW5naW5nVXJsID0gdHJ1ZTsKKwkJCXNldFRpbWVvdXQoIndpbmRvdy5sb2NhdGlvbi5ocmVmID0gJyIraGFzaCsiJzsgZG9qby51bmRvLmJyb3dzZXIuY2hhbmdpbmdVcmwgPSBmYWxzZTsiLCAxKTsKKwkJCXRoaXMuYm9va21hcmtBbmNob3IuaHJlZiA9IGhhc2g7CisJCQkKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCXVybCA9IHRoaXMuX2xvYWRJZnJhbWVIaXN0b3J5KCk7CisKKwkJCQl2YXIgb2xkQ0IgPSBhcmdzWyJiYWNrIl18fGFyZ3NbImJhY2tCdXR0b24iXXx8YXJnc1siaGFuZGxlIl07CisKKwkJCQkvL1RoZSBmdW5jdGlvbiB0YWtlcyBoYW5kbGVOYW1lIGFzIGEgcGFyYW1ldGVyLCBpbiBjYXNlIHRoZQorCQkJCS8vY2FsbGJhY2sgd2UgYXJlIG92ZXJyaWRpbmcgd2FzICJoYW5kbGUiLiBJbiB0aGF0IGNhc2UsCisJCQkJLy93ZSB3aWxsIG5lZWQgdG8gcGFzcyB0aGUgaGFuZGxlIG5hbWUgdG8gaGFuZGxlLgorCQkJCXZhciB0Y2IgPSBmdW5jdGlvbihoYW5kbGVOYW1lKXsKKwkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhhc2ggIT0gIiIpeworCQkJCQkJc2V0VGltZW91dCgid2luZG93LmxvY2F0aW9uLmhyZWYgPSAnIitoYXNoKyInOyIsIDEpOworCQkJCQl9CisJCQkJCS8vVXNlIGFwcGx5IHRvIHNldCAidGhpcyIgdG8gYXJncywgYW5kIHRvIHRyeSB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisJCQkJCW9sZENCLmFwcGx5KHRoaXMsIFtoYW5kbGVOYW1lXSk7CisJCQkJfQorCQkKKwkJCQkvL1NldCBpbnRlcmNlcHRvciBmdW5jdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuCisJCQkJaWYoYXJnc1siYmFjayJdKXsKKwkJCQkJYXJncy5iYWNrID0gdGNiOworCQkJCX1lbHNlIGlmKGFyZ3NbImJhY2tCdXR0b24iXSl7CisJCQkJCWFyZ3MuYmFja0J1dHRvbiA9IHRjYjsKKwkJCQl9ZWxzZSBpZihhcmdzWyJoYW5kbGUiXSl7CisJCQkJCWFyZ3MuaGFuZGxlID0gdGNiOworCQkJCX0KKwkJCisJCQkJdmFyIG9sZEZXID0gYXJnc1siZm9yd2FyZCJdfHxhcmdzWyJmb3J3YXJkQnV0dG9uIl18fGFyZ3NbImhhbmRsZSJdOworCQkKKwkJCQkvL1RoZSBmdW5jdGlvbiB0YWtlcyBoYW5kbGVOYW1lIGFzIGEgcGFyYW1ldGVyLCBpbiBjYXNlIHRoZQorCQkJCS8vY2FsbGJhY2sgd2UgYXJlIG92ZXJyaWRpbmcgd2FzICJoYW5kbGUiLiBJbiB0aGF0IGNhc2UsCisJCQkJLy93ZSB3aWxsIG5lZWQgdG8gcGFzcyB0aGUgaGFuZGxlIG5hbWUgdG8gaGFuZGxlLgorCQkJCXZhciB0ZncgPSBmdW5jdGlvbihoYW5kbGVOYW1lKXsKKwkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhhc2ggIT0gIiIpeworCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBoYXNoOworCQkJCQl9CisJCQkJCWlmKG9sZEZXKXsgLy8gd2UgbWlnaHQgbm90IGFjdHVhbGx5IGhhdmUgb25lCisJCQkJCQkvL1VzZSBhcHBseSB0byBzZXQgInRoaXMiIHRvIGFyZ3MsIGFuZCB0byB0cnkgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorCQkJCQkJb2xkRlcuYXBwbHkodGhpcywgW2hhbmRsZU5hbWVdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vU2V0IGludGVyY2VwdG9yIGZ1bmN0aW9uIGluIHRoZSByaWdodCBwbGFjZS4KKwkJCQlpZihhcmdzWyJmb3J3YXJkIl0peworCQkJCQlhcmdzLmZvcndhcmQgPSB0Znc7CisJCQkJfWVsc2UgaWYoYXJnc1siZm9yd2FyZEJ1dHRvbiJdKXsKKwkJCQkJYXJncy5mb3J3YXJkQnV0dG9uID0gdGZ3OworCQkJCX1lbHNlIGlmKGFyZ3NbImhhbmRsZSJdKXsKKwkJCQkJYXJncy5oYW5kbGUgPSB0Znc7CisJCQkJfQorCisJCQl9ZWxzZSBpZihkb2pvLnJlbmRlci5odG1sLm1veil7CisJCQkJLy8gc3RhcnQgdGhlIHRpbWVyCisJCQkJaWYoIXRoaXMubG9jYXRpb25UaW1lcil7CisJCQkJCXRoaXMubG9jYXRpb25UaW1lciA9IHNldEludGVydmFsKCJkb2pvLnVuZG8uYnJvd3Nlci5jaGVja0xvY2F0aW9uKCk7IiwgMjAwKTsKKwkJCQl9CisJCQl9CisJCX1lbHNleworCQkJdXJsID0gdGhpcy5fbG9hZElmcmFtZUhpc3RvcnkoKTsKKwkJfQorCisJCXRoaXMuaGlzdG9yeVN0YWNrLnB1c2godGhpcy5fY3JlYXRlU3RhdGUodXJsLCBhcmdzLCBoYXNoKSk7CisJfSwKKworCWNoZWNrTG9jYXRpb246IGZ1bmN0aW9uKCl7CisJCS8vc3VtbWFyeTogcHJpdmF0ZSBtZXRob2QuIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkuCisJCWlmICghdGhpcy5jaGFuZ2luZ1VybCl7CisJCQl2YXIgaHNsID0gdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoOworCisJCQlpZigod2luZG93LmxvY2F0aW9uLmhhc2ggPT0gdGhpcy5pbml0aWFsSGFzaHx8d2luZG93LmxvY2F0aW9uLmhyZWYgPT0gdGhpcy5pbml0aWFsSHJlZikmJihoc2wgPT0gMSkpeworCQkJCS8vIEZJWE1FOiBjb3VsZCB0aGlzIGV2ZXIgYmUgYSBmb3J3YXJkIGJ1dHRvbj8KKwkJCQkvLyB3ZSBjYW4ndCBjbGVhciBpdCBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgZm9yIGZvcndhcmRzLiBVZ2cuCisJCQkJLy8gY2xlYXJJbnRlcnZhbCh0aGlzLmxvY2F0aW9uVGltZXIpOworCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGNvdWxkIGhhdmUgZ29uZSBmb3J3YXJkLiBXZSBhbHdheXMgaGFsdCBvbgorCQkJLy8gYSBuby1oYXNoIGl0ZW0uCisJCQlpZih0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggPiAwKXsKKwkJCQlpZih0aGlzLmZvcndhcmRTdGFja1t0aGlzLmZvcndhcmRTdGFjay5sZW5ndGgtMV0udXJsSGFzaCA9PSB3aW5kb3cubG9jYXRpb24uaGFzaCl7CisJCQkJCXRoaXMuaGFuZGxlRm9yd2FyZEJ1dHRvbigpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQorCQkJLy8gb2ssIHRoYXQgZGlkbid0IHdvcmssIHRyeSBzb21lcGxhY2UgYmFjayBpbiB0aGUgaGlzdG9yeSBzdGFjaworCQkJaWYoKGhzbCA+PSAyKSYmKHRoaXMuaGlzdG9yeVN0YWNrW2hzbC0yXSkpeworCQkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrW2hzbC0yXS51cmxIYXNoPT13aW5kb3cubG9jYXRpb24uaGFzaCl7CisJCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCWlmcmFtZUxvYWRlZDogZnVuY3Rpb24oZXZ0LCBpZnJMb2MpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCQlpZighZG9qby5yZW5kZXIuaHRtbC5vcGVyYSl7CisJCQl2YXIgcXVlcnkgPSB0aGlzLl9nZXRVcmxRdWVyeShpZnJMb2MuaHJlZik7CisJCQlpZihxdWVyeSA9PSBudWxsKXsgCisJCQkJLy8gYWxlcnQoImlmcmFtZUxvYWRlZCIpOworCQkJCS8vIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5LCBzbyB3ZSBzaG91bGQgZ28gYmFjaworCQkJCWlmKHRoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aCA9PSAxKXsKKwkJCQkJdGhpcy5oYW5kbGVCYWNrQnV0dG9uKCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmKHRoaXMubW92ZUZvcndhcmQpeworCQkJCS8vIHdlIHdlcmUgZXhwZWN0aW5nIGl0LCBzbyBpdCdzIG5vdCBlaXRoZXIgYSBmb3J3YXJkIG9yIGJhY2t3YXJkIG1vdmVtZW50CisJCQkJdGhpcy5tb3ZlRm9yd2FyZCA9IGZhbHNlOworCQkJCXJldHVybjsKKwkJCX0KKwkKKwkJCS8vQ2hlY2sgdGhlIGJhY2sgc3RhY2sgZmlyc3QsIHNpbmNlIGl0IGlzIG1vcmUgbGlrZWx5LgorCQkJLy9Ob3RlIHRoYXQgb25seSBvbmUgc3RlcCBiYWNrIG9yIGZvcndhcmQgaXMgc3VwcG9ydGVkLgorCQkJaWYodGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID49IDIgJiYgcXVlcnkgPT0gdGhpcy5fZ2V0VXJsUXVlcnkodGhpcy5oaXN0b3J5U3RhY2tbdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoLTJdLnVybCkpeworCQkJCXRoaXMuaGFuZGxlQmFja0J1dHRvbigpOworCQkJfQorCQkJZWxzZSBpZih0aGlzLmZvcndhcmRTdGFjay5sZW5ndGggPiAwICYmIHF1ZXJ5ID09IHRoaXMuX2dldFVybFF1ZXJ5KHRoaXMuZm9yd2FyZFN0YWNrW3RoaXMuZm9yd2FyZFN0YWNrLmxlbmd0aC0xXS51cmwpKXsKKwkJCQl0aGlzLmhhbmRsZUZvcndhcmRCdXR0b24oKTsKKwkJCX0KKwkJfQorCX0sCisKKwloYW5kbGVCYWNrQnV0dG9uOiBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCisJCS8vVGhlICJjdXJyZW50IiBwYWdlIGlzIGFsd2F5cyBhdCB0aGUgdG9wIG9mIHRoZSBoaXN0b3J5IHN0YWNrLgorCQl2YXIgY3VycmVudCA9IHRoaXMuaGlzdG9yeVN0YWNrLnBvcCgpOworCQlpZighY3VycmVudCl7IHJldHVybjsgfQorCQl2YXIgbGFzdCA9IHRoaXMuaGlzdG9yeVN0YWNrW3RoaXMuaGlzdG9yeVN0YWNrLmxlbmd0aC0xXTsKKwkJaWYoIWxhc3QgJiYgdGhpcy5oaXN0b3J5U3RhY2subGVuZ3RoID09IDApeworCQkJbGFzdCA9IHRoaXMuaW5pdGlhbFN0YXRlOworCQl9CisJCWlmIChsYXN0KXsKKwkJCWlmKGxhc3Qua3dBcmdzWyJiYWNrIl0peworCQkJCWxhc3Qua3dBcmdzWyJiYWNrIl0oKTsKKwkJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJiYWNrQnV0dG9uIl0peworCQkJCWxhc3Qua3dBcmdzWyJiYWNrQnV0dG9uIl0oKTsKKwkJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CisJCQkJbGFzdC5rd0FyZ3MuaGFuZGxlKCJiYWNrIik7CisJCQl9CisJCX0KKwkJdGhpcy5mb3J3YXJkU3RhY2sucHVzaChjdXJyZW50KTsKKwl9LAorCisJaGFuZGxlRm9yd2FyZEJ1dHRvbjogZnVuY3Rpb24oKXsKKwkJLy9zdW1tYXJ5OiBwcml2YXRlIG1ldGhvZC4gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKworCQl2YXIgbGFzdCA9IHRoaXMuZm9yd2FyZFN0YWNrLnBvcCgpOworCQlpZighbGFzdCl7IHJldHVybjsgfQorCQlpZihsYXN0Lmt3QXJnc1siZm9yd2FyZCJdKXsKKwkJCWxhc3Qua3dBcmdzLmZvcndhcmQoKTsKKwkJfWVsc2UgaWYobGFzdC5rd0FyZ3NbImZvcndhcmRCdXR0b24iXSl7CisJCQlsYXN0Lmt3QXJncy5mb3J3YXJkQnV0dG9uKCk7CisJCX1lbHNlIGlmKGxhc3Qua3dBcmdzWyJoYW5kbGUiXSl7CisJCQlsYXN0Lmt3QXJncy5oYW5kbGUoImZvcndhcmQiKTsKKwkJfQorCQl0aGlzLmhpc3RvcnlTdGFjay5wdXNoKGxhc3QpOworCX0sCisKKwlfY3JlYXRlU3RhdGU6IGZ1bmN0aW9uKHVybCwgYXJncywgaGFzaCl7CisJCS8vc3VtbWFyeTogcHJpdmF0ZSBtZXRob2QuIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkuCisKKwkJcmV0dXJuIHsidXJsIjogdXJsLCAia3dBcmdzIjogYXJncywgInVybEhhc2giOiBoYXNofTsJLy9PYmplY3QKKwl9LAorCisJX2dldFVybFF1ZXJ5OiBmdW5jdGlvbih1cmwpeworCQkvL3N1bW1hcnk6IHByaXZhdGUgbWV0aG9kLiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgorCQl2YXIgc2VnbWVudHMgPSB1cmwuc3BsaXQoIj8iKTsKKwkJaWYgKHNlZ21lbnRzLmxlbmd0aCA8IDIpeworCQkJcmV0dXJuIG51bGw7IC8vbnVsbAorCQl9CisJCWVsc2V7CisJCQlyZXR1cm4gc2VnbWVudHNbMV07IC8vU3RyaW5nCisJCX0KKwl9LAorCQorCV9sb2FkSWZyYW1lSGlzdG9yeTogZnVuY3Rpb24oKXsKKwkJLy9zdW1tYXJ5OiBwcml2YXRlIG1ldGhvZC4gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KKwkJdmFyIHVybCA9IChkakNvbmZpZ1siZG9qb0lmcmFtZUhpc3RvcnlVcmwiXSB8fCBkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpKydpZnJhbWVfaGlzdG9yeS5odG1sJykKKwkJCSsgIj8iICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwkJdGhpcy5tb3ZlRm9yd2FyZCA9IHRydWU7CisJCWRvam8uaW8uc2V0SUZyYW1lU3JjKHRoaXMuaGlzdG9yeUlmcmFtZSwgdXJsLCBmYWxzZSk7CQorCQlyZXR1cm4gdXJsOyAvL1N0cmluZworCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLmlvLkJyb3dzZXJJTyIpOworCisKKworCisKKworCisKK2lmKCFkal91bmRlZigid2luZG93IikpIHsKKworZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSl7CisJLy9zdW1tYXJ5OiBDaGVja3MgYW55IGNoaWxkIG5vZGVzIG9mIG5vZGUgZm9yIGFuIGlucHV0IHR5cGU9ImZpbGUiIGVsZW1lbnQuCisJdmFyIGhhc0ZpbGUgPSBmYWxzZTsKKwl2YXIgaW5wdXRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKKwlkb2pvLmxhbmcuZm9yRWFjaChpbnB1dHMsIGZ1bmN0aW9uKGlucHV0KXsKKwkJaWYoaGFzRmlsZSl7IHJldHVybjsgfQorCQlpZihpbnB1dC5nZXRBdHRyaWJ1dGUoInR5cGUiKT09ImZpbGUiKXsKKwkJCWhhc0ZpbGUgPSB0cnVlOworCQl9CisJfSk7CisJcmV0dXJuIGhhc0ZpbGU7IC8vYm9vbGVhbgorfQorCitkb2pvLmlvLmZvcm1IYXNGaWxlID0gZnVuY3Rpb24oLypET01Ob2RlKi9mb3JtTm9kZSl7CisJLy9zdW1tYXJ5OiBKdXN0IGNhbGxzIGRvam8uaW8uY2hlY2tDaGlsZHJlbkZvckZpbGUoKS4KKwlyZXR1cm4gZG9qby5pby5jaGVja0NoaWxkcmVuRm9yRmlsZShmb3JtTm9kZSk7IC8vYm9vbGVhbgorfQorCitkb2pvLmlvLnVwZGF0ZU5vZGUgPSBmdW5jdGlvbigvKkRPTU5vZGUqL25vZGUsIC8qU3RyaW5nIG9yIE9iamVjdCovdXJsT3JBcmdzKXsKKwkvL3N1bW1hcnk6IFVwZGF0ZXMgYSBET01ub2RlIHdpdGggdGhlIHJlc3VsdCBvZiBhIGRvam8uaW8uYmluZCgpIGNhbGwuCisJLy9ub2RlOiBET01Ob2RlCisJLy91cmxPckFyZ3M6IFN0cmluZyBvciBPYmplY3QKKwkvLwkJRWl0aGVyIGEgU3RyaW5nIHRoYXQgaGFzIGFuIFVSTCwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZG9qby5pby5iaW5kKCkKKwkvLwkJYXJndW1lbnRzLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGFyZ3MgPSB1cmxPckFyZ3M7CisJaWYoZG9qby5sYW5nLmlzU3RyaW5nKHVybE9yQXJncykpeworCQlhcmdzID0geyB1cmw6IHVybE9yQXJncyB9OworCX0KKwlhcmdzLm1pbWV0eXBlID0gInRleHQvaHRtbCI7CisJYXJncy5sb2FkID0gZnVuY3Rpb24odCwgZCwgZSl7CisJCXdoaWxlKG5vZGUuZmlyc3RDaGlsZCl7CisJCQlkb2pvLmRvbS5kZXN0cm95Tm9kZShub2RlLmZpcnN0Q2hpbGQpOworCQl9CisJCW5vZGUuaW5uZXJIVE1MID0gZDsKKwl9OworCWRvam8uaW8uYmluZChhcmdzKTsKK30KKworZG9qby5pby5mb3JtRmlsdGVyID0gZnVuY3Rpb24oLypET01Ob2RlKi9ub2RlKSB7CisJLy9zdW1tYXJ5OiBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYW4gaW5wdXQgZWxlbWVudCB0aGF0IGlzIGVuYWJsZWQsIGhhcworCS8vYSBuYW1lLCBhbmQgd2hvc2UgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFsiZmlsZSIsICJzdWJtaXQiLCAiaW1hZ2UiLCAicmVzZXQiLCAiYnV0dG9uIl0KKwl2YXIgdHlwZSA9IChub2RlLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpOworCXJldHVybiAhbm9kZS5kaXNhYmxlZCAmJiBub2RlLm5hbWUKKwkJJiYgIWRvam8ubGFuZy5pbkFycmF5KFsiZmlsZSIsICJzdWJtaXQiLCAiaW1hZ2UiLCAicmVzZXQiLCAiYnV0dG9uIl0sIHR5cGUpOyAvL2Jvb2xlYW4KK30KKworLy8gVE9ETzogTW92ZSB0byBodG1sVXRpbHMKK2Rvam8uaW8uZW5jb2RlRm9ybSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovZm9ybU5vZGUsIC8qU3RyaW5nPyovZW5jb2RpbmcsIC8qRnVuY3Rpb24/Ki9mb3JtRmlsdGVyKXsKKwkvL3N1bW1hcnk6IENvbnZlcnRzIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGZvcm0gZWxlbWVudHMgaW50byBhbiBVUkwtZW5jb2RlZAorCS8vc3RyaW5nIChuYW1lPXZhbHVlJm5hbWU9dmFsdWUuLi4pLgorCS8vZm9ybU5vZGU6IERPTU5vZGUKKwkvL2VuY29kaW5nOiBTdHJpbmc/CisJLy8JCVRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSB2YWx1ZXMuIFNwZWNpZnkgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aAorCS8vCQkidXRmIiAoZm9yIGluc3RhbmNlLCAidXRmOCIpLCB0byB1c2UgZW5jb2RlVVJJQ29tcG9uZW50KCkgYXMgdGhlIGVuY29kaW5nCisJLy8JCWZ1bmN0aW9uLiBPdGhlcndpc2UsIGRvam8uc3RyaW5nLmVuY29kZUFzY2lpIHdpbGwgYmUgdXNlZC4KKwkvL2Zvcm1GaWx0ZXI6IEZ1bmN0aW9uPworCS8vCUEgZnVuY3Rpb24gdXNlZCB0byBmaWx0ZXIgb3V0IGZvcm0gZWxlbWVudHMuIFRoZSBlbGVtZW50IG5vZGUgd2lsbCBiZSBwYXNzZWQKKwkvLwl0byB0aGUgZm9ybUZpbHRlciBmdW5jdGlvbiwgYW5kIGEgYm9vbGVhbiByZXN1bHQgaXMgZXhwZWN0ZWQgKHRydWUgaW5kaWNhdGluZworCS8vCWluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBzaG91bGQgaGF2ZSBpdHMgbmFtZS92YWx1ZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0KS4KKwkvLwlJZiBubyBmb3JtRmlsdGVyIGlzIHNwZWNpZmllZCwgdGhlbiBkb2pvLmlvLmZvcm1GaWx0ZXIoKSB3aWxsIGJlIHVzZWQuCisJaWYoKCFmb3JtTm9kZSl8fCghZm9ybU5vZGUudGFnTmFtZSl8fCghZm9ybU5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJmb3JtIikpeworCQlkb2pvLnJhaXNlKCJBdHRlbXB0ZWQgdG8gZW5jb2RlIGEgbm9uLWZvcm0gZWxlbWVudC4iKTsKKwl9CisJaWYoIWZvcm1GaWx0ZXIpIHsgZm9ybUZpbHRlciA9IGRvam8uaW8uZm9ybUZpbHRlcjsgfQorCXZhciBlbmMgPSAvdXRmL2kudGVzdChlbmNvZGluZ3x8IiIpID8gZW5jb2RlVVJJQ29tcG9uZW50IDogZG9qby5zdHJpbmcuZW5jb2RlQXNjaWk7CisJdmFyIHZhbHVlcyA9IFtdOworCisJZm9yKHZhciBpID0gMDsgaSA8IGZvcm1Ob2RlLmVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJdmFyIGVsbSA9IGZvcm1Ob2RlLmVsZW1lbnRzW2ldOworCQlpZighZWxtIHx8IGVsbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImZpZWxkc2V0IiB8fCAhZm9ybUZpbHRlcihlbG0pKSB7IGNvbnRpbnVlOyB9CisJCXZhciBuYW1lID0gZW5jKGVsbS5uYW1lKTsKKwkJdmFyIHR5cGUgPSBlbG0udHlwZS50b0xvd2VyQ2FzZSgpOworCisJCWlmKHR5cGUgPT0gInNlbGVjdC1tdWx0aXBsZSIpeworCQkJZm9yKHZhciBqID0gMDsgaiA8IGVsbS5vcHRpb25zLmxlbmd0aDsgaisrKXsKKwkJCQlpZihlbG0ub3B0aW9uc1tqXS5zZWxlY3RlZCkgeworCQkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGVsbS5vcHRpb25zW2pdLnZhbHVlKSk7CisJCQkJfQorCQkJfQorCQl9ZWxzZSBpZihkb2pvLmxhbmcuaW5BcnJheShbInJhZGlvIiwgImNoZWNrYm94Il0sIHR5cGUpKXsKKwkJCWlmKGVsbS5jaGVja2VkKXsKKwkJCQl2YWx1ZXMucHVzaChuYW1lICsgIj0iICsgZW5jKGVsbS52YWx1ZSkpOworCQkJfQorCQl9ZWxzZXsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiPSIgKyBlbmMoZWxtLnZhbHVlKSk7CisJCX0KKwl9CisKKwkvLyBub3cgY29sbGVjdCBpbnB1dCB0eXBlPSJpbWFnZSIsIHdoaWNoIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgZWxlbWVudHMgYXJyYXkKKwl2YXIgaW5wdXRzID0gZm9ybU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7CisJZm9yKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgeworCQl2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisJCWlmKGlucHV0LnR5cGUudG9Mb3dlckNhc2UoKSA9PSAiaW1hZ2UiICYmIGlucHV0LmZvcm0gPT0gZm9ybU5vZGUKKwkJCSYmIGZvcm1GaWx0ZXIoaW5wdXQpKSB7CisJCQl2YXIgbmFtZSA9IGVuYyhpbnB1dC5uYW1lKTsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiPSIgKyBlbmMoaW5wdXQudmFsdWUpKTsKKwkJCXZhbHVlcy5wdXNoKG5hbWUgKyAiLng9MCIpOworCQkJdmFsdWVzLnB1c2gobmFtZSArICIueT0wIik7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlcy5qb2luKCImIikgKyAiJiI7IC8vU3RyaW5nCit9CisKK2Rvam8uaW8uRm9ybUJpbmQgPSBmdW5jdGlvbigvKkRPTU5vZGUgb3IgT2JqZWN0Ki9hcmdzKSB7CisJLy9zdW1tYXJ5OiBjb25zdHJ1Y3RvciBmb3IgYSBkb2pvLmlvLkZvcm1CaW5kIG9iamVjdC4gU2VlIHRoZSBEb2pvIEJvb2sgZm9yCisJLy9zb21lIGluZm9ybWF0aW9uIG9uIHVzYWdlOiBodHRwOi8vbWFudWFsLmRvam90b29sa2l0Lm9yZy9XaWtpSG9tZS9Eb2pvRG90Qm9vay9Cb29rMjMKKwkvL2FyZ3M6IERPTU5vZGUgb3IgT2JqZWN0CisJLy8JCWFyZ3MgY2FuIGVpdGhlciBiZSB0aGUgRE9NTm9kZSBmb3IgYSBmb3JtIGVsZW1lbnQsIG9yIGFuIG9iamVjdCBjb250YWluaW5nCisJLy8JCWRvam8uaW8uYmluZCgpIGFyZ3VtZW50cywgb25lIG9mIHdoaWNoIHNob3VsZCBiZSBmb3JtTm9kZSB3aXRoIHRoZSB2YWx1ZSBvZgorCS8vCQlhIGZvcm0gZWxlbWVudCBET01Ob2RlLgorCXRoaXMuYmluZEFyZ3MgPSB7fTsKKworCWlmKGFyZ3MgJiYgYXJncy5mb3JtTm9kZSkgeworCQl0aGlzLmluaXQoYXJncyk7CisJfSBlbHNlIGlmKGFyZ3MpIHsKKwkJdGhpcy5pbml0KHtmb3JtTm9kZTogYXJnc30pOworCX0KK30KK2Rvam8ubGFuZy5leHRlbmQoZG9qby5pby5Gb3JtQmluZCwgeworCWZvcm06IG51bGwsCisKKwliaW5kQXJnczogbnVsbCwKKworCWNsaWNrZWRCdXR0b246IG51bGwsCisKKwlpbml0OiBmdW5jdGlvbigvKkRPTU5vZGUgb3IgT2JqZWN0Ki9hcmdzKSB7CisJCS8vc3VtbWFyeTogSW50ZXJuYWwgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBkb2pvLmlvLkZvcm1CaW5kKCkgY29uc3RydWN0b3IKKwkJLy9kbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKwkJdmFyIGZvcm0gPSBkb2pvLmJ5SWQoYXJncy5mb3JtTm9kZSk7CisKKwkJaWYoIWZvcm0gfHwgIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAiZm9ybSIpIHsKKwkJCXRocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IENvdWxkbid0IGFwcGx5LCBpbnZhbGlkIGZvcm0iKTsKKwkJfSBlbHNlIGlmKHRoaXMuZm9ybSA9PSBmb3JtKSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZih0aGlzLmZvcm0pIHsKKwkJCXRocm93IG5ldyBFcnJvcigiRm9ybUJpbmQ6IEFscmVhZHkgYXBwbGllZCB0byBhIGZvcm0iKTsKKwkJfQorCisJCWRvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLCBhcmdzKTsKKwkJdGhpcy5mb3JtID0gZm9ybTsKKworCQl0aGlzLmNvbm5lY3QoZm9ybSwgIm9uc3VibWl0IiwgInN1Ym1pdCIpOworCisJCWZvcih2YXIgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgbm9kZSA9IGZvcm0uZWxlbWVudHNbaV07CisJCQlpZihub2RlICYmIG5vZGUudHlwZSAmJiBkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsICJidXR0b24iXSwgbm9kZS50eXBlLnRvTG93ZXJDYXNlKCkpKSB7CisJCQkJdGhpcy5jb25uZWN0KG5vZGUsICJvbmNsaWNrIiwgImNsaWNrIik7CisJCQl9CisJCX0KKworCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKKwkJZm9yKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykgeworCQkJdmFyIGlucHV0ID0gaW5wdXRzW2ldOworCQkJaWYoaW5wdXQudHlwZS50b0xvd2VyQ2FzZSgpID09ICJpbWFnZSIgJiYgaW5wdXQuZm9ybSA9PSBmb3JtKSB7CisJCQkJdGhpcy5jb25uZWN0KGlucHV0LCAib25jbGljayIsICJjbGljayIpOworCQkJfQorCQl9CisJfSwKKworCW9uU3VibWl0OiBmdW5jdGlvbigvKkRPTU5vZGUqL2Zvcm0pIHsKKwkJLy9zdW1tYXJ5OiBGdW5jdGlvbiB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmb3JtIGlzIE9LIHRvIHN1Ym1pdC4KKwkJLy9PdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHNwZWNpZmljIGZvcm0gdmFsaWRhdGlvbiBkb25lLgorCQlyZXR1cm4gdHJ1ZTsgLy9ib29sZWFuCisJfSwKKworCXN1Ym1pdDogZnVuY3Rpb24oLypFdmVudCovZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIGZ1bmN0aW9uIHRoYXQgaXMgY29ubmVjdGVkIGFzIGEgbGlzdGVuZXIgdG8gdGhlCisJCS8vZm9ybSdzIG9uc3VibWl0IGV2ZW50LgorCQllLnByZXZlbnREZWZhdWx0KCk7CisJCWlmKHRoaXMub25TdWJtaXQodGhpcy5mb3JtKSkgeworCQkJZG9qby5pby5iaW5kKGRvam8ubGFuZy5taXhpbih0aGlzLmJpbmRBcmdzLCB7CisJCQkJZm9ybUZpbHRlcjogZG9qby5sYW5nLmhpdGNoKHRoaXMsICJmb3JtRmlsdGVyIikKKwkJCX0pKTsKKwkJfQorCX0sCisKKwljbGljazogZnVuY3Rpb24oLypFdmVudCovZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB0aGF0IGlzIGNvbm5lY3RlZCBhcyBhIGxpc3RlbmVyIHRvIHRoZQorCQkvL2Zvcm0ncyBlbGVtZW50cyB3aG9zZSBjbGljayBldmVudCBjYW4gc3VibWl0IGEgZm9ybS4KKwkJdmFyIG5vZGUgPSBlLmN1cnJlbnRUYXJnZXQ7CisJCWlmKG5vZGUuZGlzYWJsZWQpIHsgcmV0dXJuOyB9CisJCXRoaXMuY2xpY2tlZEJ1dHRvbiA9IG5vZGU7CisJfSwKKworCWZvcm1GaWx0ZXI6IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSkgeworCQkvL3N1bW1hcnk6IGludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8ga25vdyB3aGljaCBmb3JtIGVsZW1lbnQgdmFsdWVzIHRvIGluY2x1ZGUKKwkJLy8JCWluIHRoZSBkb2pvLmlvLmJpbmQoKSByZXF1ZXN0LgorCQl2YXIgdHlwZSA9IChub2RlLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpOworCQl2YXIgYWNjZXB0ID0gZmFsc2U7CisJCWlmKG5vZGUuZGlzYWJsZWQgfHwgIW5vZGUubmFtZSkgeworCQkJYWNjZXB0ID0gZmFsc2U7CisJCX0gZWxzZSBpZihkb2pvLmxhbmcuaW5BcnJheShbInN1Ym1pdCIsICJidXR0b24iLCAiaW1hZ2UiXSwgdHlwZSkpIHsKKwkJCWlmKCF0aGlzLmNsaWNrZWRCdXR0b24pIHsgdGhpcy5jbGlja2VkQnV0dG9uID0gbm9kZTsgfQorCQkJYWNjZXB0ID0gbm9kZSA9PSB0aGlzLmNsaWNrZWRCdXR0b247CisJCX0gZWxzZSB7CisJCQlhY2NlcHQgPSAhZG9qby5sYW5nLmluQXJyYXkoWyJmaWxlIiwgInN1Ym1pdCIsICJyZXNldCIsICJidXR0b24iXSwgdHlwZSk7CisJCX0KKwkJcmV0dXJuIGFjY2VwdDsgLy9ib29sZWFuCisJfSwKKworCS8vIGluIGNhc2UgeW91IGRvbid0IGhhdmUgZG9qby5ldmVudC4qIHB1bGxlZCBpbgorCWNvbm5lY3Q6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9zcmNPYmosIC8qRnVuY3Rpb24qL3NyY0ZjbiwgLypGdW5jdGlvbiovdGFyZ2V0RmNuKSB7CisJCS8vc3VtbWFyeTogaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBjb25uZWN0IGV2ZW50IGxpc3RlbmVycyB0byBmb3JtIGVsZW1lbnRzCisJCS8vdGhhdCB0cmlnZ2VyIGV2ZW50cy4gVXNlZCBpbiBjYXNlIGRvam8uZXZlbnQgaXMgbm90IGxvYWRlZC4KKwkJaWYoZG9qby5ldmFsT2JqUGF0aCgiZG9qby5ldmVudC5jb25uZWN0IikpIHsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChzcmNPYmosIHNyY0ZjbiwgdGhpcywgdGFyZ2V0RmNuKTsKKwkJfSBlbHNlIHsKKwkJCXZhciBmY24gPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgdGFyZ2V0RmNuKTsKKwkJCXNyY09ialtzcmNGY25dID0gZnVuY3Rpb24oZSkgeworCQkJCWlmKCFlKSB7IGUgPSB3aW5kb3cuZXZlbnQ7IH0KKwkJCQlpZighZS5jdXJyZW50VGFyZ2V0KSB7IGUuY3VycmVudFRhcmdldCA9IGUuc3JjRWxlbWVudDsgfQorCQkJCWlmKCFlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsgd2luZG93LmV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7IH0gfQorCQkJCWZjbihlKTsKKwkJCX0KKwkJfQorCX0KK30pOworCitkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQgPSBuZXcgZnVuY3Rpb24oKXsKKwkvL3N1bW1hcnk6IFRoZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBkb2pvLmlvLmJpbmQgdHJhbnNwb3J0IGZvciBYTUxIdHRwUmVxdWVzdC4KKwl2YXIgX3RoaXMgPSB0aGlzOworCisJdmFyIF9jYWNoZSA9IHt9OyAvLyBGSVhNRTogbWFrZSB0aGlzIHB1YmxpYz8gZG8gd2UgZXZlbiBuZWVkIHRvPworCXRoaXMudXNlQ2FjaGUgPSBmYWxzZTsgLy8gaWYgdGhpcyBpcyB0cnVlLCB3ZSdsbCBjYWNoZSB1bmxlc3Mga3dBcmdzLnVzZUNhY2hlID0gZmFsc2UKKwl0aGlzLnByZXZlbnRDYWNoZSA9IGZhbHNlOyAvLyBpZiB0aGlzIGlzIHRydWUsIHdlJ2xsIGFsd2F5cyBmb3JjZSBHRVQgcmVxdWVzdHMgdG8gY2FjaGUKKworCS8vIEZJWE1FOiBTaG91bGQgdGhpcyBldmVuIGJlIGEgZnVuY3Rpb24/IG9yIGRvIHdlIGp1c3QgaGFyZCBjb2RlIGl0IGluIHRoZSBuZXh0IDIgZnVuY3Rpb25zPworCWZ1bmN0aW9uIGdldENhY2hlS2V5KHVybCwgcXVlcnksIG1ldGhvZCkgeworCQlyZXR1cm4gdXJsICsgInwiICsgcXVlcnkgKyAifCIgKyBtZXRob2QudG9Mb3dlckNhc2UoKTsKKwl9CisKKwlmdW5jdGlvbiBhZGRUb0NhY2hlKHVybCwgcXVlcnksIG1ldGhvZCwgaHR0cCkgeworCQlfY2FjaGVbZ2V0Q2FjaGVLZXkodXJsLCBxdWVyeSwgbWV0aG9kKV0gPSBodHRwOworCX0KKworCWZ1bmN0aW9uIGdldEZyb21DYWNoZSh1cmwsIHF1ZXJ5LCBtZXRob2QpIHsKKwkJcmV0dXJuIF9jYWNoZVtnZXRDYWNoZUtleSh1cmwsIHF1ZXJ5LCBtZXRob2QpXTsKKwl9CisKKwl0aGlzLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbigpIHsKKwkJX2NhY2hlID0ge307CisJfQorCisJLy8gbW92ZWQgc3VjY2Vzc2Z1bCBsb2FkIHN0dWZmIGhlcmUKKwlmdW5jdGlvbiBkb0xvYWQoa3dBcmdzLCBodHRwLCB1cmwsIHF1ZXJ5LCB1c2VDYWNoZSkgeworCQlpZigJKChodHRwLnN0YXR1cz49MjAwKSYmKGh0dHAuc3RhdHVzPDMwMCkpfHwgCS8vIGFsbG93IGFueSAyWFggcmVzcG9uc2UgY29kZQorCQkJKGh0dHAuc3RhdHVzPT0zMDQpfHwgCQkJCQkJLy8gZ2V0IGl0IG91dCBvZiB0aGUgY2FjaGUKKwkJCShodHRwLnN0YXR1cz09MTIyMyl8fCAJCQkJCQkvLyBJbnRlcm5ldCBFeHBsb3JlciBtYW5nbGVkIHRoZSBzdGF0dXMgY29kZQorCQkJKGxvY2F0aW9uLnByb3RvY29sPT0iZmlsZToiICYmIChodHRwLnN0YXR1cz09MCB8fCBodHRwLnN0YXR1cz09dW5kZWZpbmVkKSl8fAorCQkJKGxvY2F0aW9uLnByb3RvY29sPT0iY2hyb21lOiIgJiYgKGh0dHAuc3RhdHVzPT0wIHx8IGh0dHAuc3RhdHVzPT11bmRlZmluZWQpKQorCQkpeworCQkJdmFyIHJldDsKKwkJCWlmKGt3QXJncy5tZXRob2QudG9Mb3dlckNhc2UoKSA9PSAiaGVhZCIpeworCQkJCXZhciBoZWFkZXJzID0gaHR0cC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKKwkJCQlyZXQgPSB7fTsKKwkJCQlyZXQudG9TdHJpbmcgPSBmdW5jdGlvbigpeyByZXR1cm4gaGVhZGVyczsgfQorCQkJCXZhciB2YWx1ZXMgPSBoZWFkZXJzLnNwbGl0KC9bXHJcbl0rL2cpOworCQkJCWZvcih2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJdmFyIHBhaXIgPSB2YWx1ZXNbaV0ubWF0Y2goL14oW146XSspXHMqOlxzKiguKykkL2kpOworCQkJCQlpZihwYWlyKSB7CisJCQkJCQlyZXRbcGFpclsxXV0gPSBwYWlyWzJdOworCQkJCQl9CisJCQkJfQorCQkJfWVsc2UgaWYoa3dBcmdzLm1pbWV0eXBlID09ICJ0ZXh0L2phdmFzY3JpcHQiKXsKKwkJCQl0cnl7CisJCQkJCXJldCA9IGRqX2V2YWwoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCX1jYXRjaChlKXsKKwkJCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCQkJZG9qby5kZWJ1ZyhodHRwLnJlc3BvbnNlVGV4dCk7CisJCQkJCXJldCA9IG51bGw7CisJCQkJfQorCQkJfWVsc2UgaWYoa3dBcmdzLm1pbWV0eXBlLnN1YnN0cigwLCA5KSA9PSAidGV4dC9qc29uIiB8fCBrd0FyZ3MubWltZXR5cGUuc3Vic3RyKDAsIDE2KSA9PSAiYXBwbGljYXRpb24vanNvbiIpeworCQkJCXRyeXsKKwkJCQkJcmV0ID0gZGpfZXZhbCgiKCIra3dBcmdzLmpzb25GaWx0ZXIoaHR0cC5yZXNwb25zZVRleHQpKyIpIik7CisJCQkJfWNhdGNoKGUpeworCQkJCQlkb2pvLmRlYnVnKGUpOworCQkJCQlkb2pvLmRlYnVnKGh0dHAucmVzcG9uc2VUZXh0KTsKKwkJCQkJcmV0ID0gZmFsc2U7CisJCQkJfQorCQkJfWVsc2UgaWYoKGt3QXJncy5taW1ldHlwZSA9PSAiYXBwbGljYXRpb24veG1sIil8fAorCQkJCQkJKGt3QXJncy5taW1ldHlwZSA9PSAidGV4dC94bWwiKSl7CisJCQkJcmV0ID0gaHR0cC5yZXNwb25zZVhNTDsKKwkJCQlpZighcmV0IHx8IHR5cGVvZiByZXQgPT0gInN0cmluZyIgfHwgIWh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKSB7CisJCQkJCXJldCA9IGRvam8uZG9tLmNyZWF0ZURvY3VtZW50RnJvbVRleHQoaHR0cC5yZXNwb25zZVRleHQpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXJldCA9IGh0dHAucmVzcG9uc2VUZXh0OworCQkJfQorCisJCQlpZih1c2VDYWNoZSl7IC8vIG9ubHkgY2FjaGUgc3VjY2Vzc2Z1bCByZXNwb25zZXMKKwkJCQlhZGRUb0NhY2hlKHVybCwgcXVlcnksIGt3QXJncy5tZXRob2QsIGh0dHApOworCQkJfQorCQkJa3dBcmdzWyh0eXBlb2Yga3dBcmdzLmxvYWQgPT0gImZ1bmN0aW9uIikgPyAibG9hZCIgOiAiaGFuZGxlIl0oImxvYWQiLCByZXQsIGh0dHAsIGt3QXJncyk7CisJCX1lbHNleworCQkJdmFyIGVyck9iaiA9IG5ldyBkb2pvLmlvLkVycm9yKCJYTUxIdHRwVHJhbnNwb3J0IEVycm9yOiAiK2h0dHAuc3RhdHVzKyIgIitodHRwLnN0YXR1c1RleHQpOworCQkJa3dBcmdzWyh0eXBlb2Yga3dBcmdzLmVycm9yID09ICJmdW5jdGlvbiIpID8gImVycm9yIiA6ICJoYW5kbGUiXSgiZXJyb3IiLCBlcnJPYmosIGh0dHAsIGt3QXJncyk7CisJCX0KKwl9CisKKwkvLyBzZXQgaGVhZGVycyAobm90ZTogQ29udGVudC1UeXBlIHdpbGwgZ2V0IG92ZXJyaWRlbiBpZiBrd0FyZ3MuY29udGVudFR5cGUgaXMgc2V0KQorCWZ1bmN0aW9uIHNldEhlYWRlcnMoaHR0cCwga3dBcmdzKXsKKwkJaWYoa3dBcmdzWyJoZWFkZXJzIl0pIHsKKwkJCWZvcih2YXIgaGVhZGVyIGluIGt3QXJnc1siaGVhZGVycyJdKSB7CisJCQkJaWYoaGVhZGVyLnRvTG93ZXJDYXNlKCkgPT0gImNvbnRlbnQtdHlwZSIgJiYgIWt3QXJnc1siY29udGVudFR5cGUiXSkgeworCQkJCQlrd0FyZ3NbImNvbnRlbnRUeXBlIl0gPSBrd0FyZ3NbImhlYWRlcnMiXVtoZWFkZXJdOworCQkJCX0gZWxzZSB7CisJCQkJCWh0dHAuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGt3QXJnc1siaGVhZGVycyJdW2hlYWRlcl0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXRoaXMuaW5GbGlnaHQgPSBbXTsKKwl0aGlzLmluRmxpZ2h0VGltZXIgPSBudWxsOworCisJdGhpcy5zdGFydFdhdGNoaW5nSW5GbGlnaHQgPSBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB1c2VkIHRvIHRyaWdnZXIgYSB0aW1lciB0byB3YXRjaCBhbGwgaW5mbGlnaHQKKwkJLy9YTUxIdHRwUmVxdWVzdHMuCisJCWlmKCF0aGlzLmluRmxpZ2h0VGltZXIpeworCQkJLy8gc2V0SW50ZXJ2YWwgYnJva2VuIGluIG1vemlsbGEgeDg2XzY0IGluIHNvbWUgY2lyY3Vtc3RhbmNlcywgc2VlCisJCQkvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDQ0MzkKKwkJCS8vIHVzaW5nIHNldFRpbWVvdXQgaW5zdGVhZAorCQkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMCk7CisJCX0KKwl9CisKKwl0aGlzLndhdGNoSW5GbGlnaHQgPSBmdW5jdGlvbigpeworCQkvL3N1bW1hcnk6IGludGVybmFsIG1ldGhvZCB0aGF0IGNoZWNrcyBlYWNoIGluZmxpZ2h0IFhNTEh0dHBSZXF1ZXN0IHRvIHNlZQorCQkvL2lmIGl0IGhhcyBjb21wbGV0ZWQgb3IgaWYgdGhlIHRpbWVvdXQgc2l0dWF0aW9uIGFwcGxpZXMuCisJCXZhciBub3cgPSBudWxsOworCQkvLyBtYWtlIHN1cmUgc3luYyBjYWxscyBzdGF5IHRocmVhZCBzYWZlLCBpZiB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBkdXJpbmcgYSBzeW5jIGNhbGwKKwkJLy8gYW5kIHRoaXMgcmVzdWx0cyBpbiBhbm90aGVyIHN5bmMgY2FsbCBiZWZvcmUgdGhlIGZpcnN0IHN5bmMgY2FsbCBlbmRzIHRoZSBicm93c2VyIGhhbmdzCisJCWlmKCFkb2pvLmhvc3RlbnYuX2Jsb2NrQXN5bmMgJiYgIV90aGlzLl9ibG9ja0FzeW5jKXsKKwkJCWZvcih2YXIgeD10aGlzLmluRmxpZ2h0Lmxlbmd0aC0xOyB4Pj0wOyB4LS0peworCQkJCXRyeXsKKwkJCQkJdmFyIHRpZiA9IHRoaXMuaW5GbGlnaHRbeF07CisJCQkJCWlmKCF0aWYgfHwgdGlmLmh0dHAuX2Fib3J0ZWQgfHwgIXRpZi5odHRwLnJlYWR5U3RhdGUpeworCQkJCQkJdGhpcy5pbkZsaWdodC5zcGxpY2UoeCwgMSk7IGNvbnRpbnVlOyAKKwkJCQkJfQorCQkJCQlpZig0PT10aWYuaHR0cC5yZWFkeVN0YXRlKXsKKwkJCQkJCS8vIHJlbW92ZSBpdCBzbyB3ZSBjYW4gY2xlYW4gcmVmcworCQkJCQkJdGhpcy5pbkZsaWdodC5zcGxpY2UoeCwgMSk7CisJCQkJCQlkb0xvYWQodGlmLnJlcSwgdGlmLmh0dHAsIHRpZi51cmwsIHRpZi5xdWVyeSwgdGlmLnVzZUNhY2hlKTsKKwkJCQkJfWVsc2UgaWYgKHRpZi5zdGFydFRpbWUpeworCQkJCQkJLy9TZWUgaWYgdGhpcyBpcyBhIHRpbWVvdXQgY2FzZS4KKwkJCQkJCWlmKCFub3cpeworCQkJCQkJCW5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJCQkJCQl9CisJCQkJCQlpZih0aWYuc3RhcnRUaW1lICsgKHRpZi5yZXEudGltZW91dFNlY29uZHMgKiAxMDAwKSA8IG5vdyl7CisJCQkJCQkJLy9TdG9wIHRoZSByZXF1ZXN0LgorCQkJCQkJCWlmKHR5cGVvZiB0aWYuaHR0cC5hYm9ydCA9PSAiZnVuY3Rpb24iKXsKKwkJCQkJCQkJdGlmLmh0dHAuYWJvcnQoKTsKKwkJCQkJCQl9CisJCQorCQkJCQkJCS8vIHJlbW92ZSBpdCBzbyB3ZSBjYW4gY2xlYW4gcmVmcworCQkJCQkJCXRoaXMuaW5GbGlnaHQuc3BsaWNlKHgsIDEpOworCQkJCQkJCXRpZi5yZXFbKHR5cGVvZiB0aWYucmVxLnRpbWVvdXQgPT0gImZ1bmN0aW9uIikgPyAidGltZW91dCIgOiAiaGFuZGxlIl0oInRpbWVvdXQiLCBudWxsLCB0aWYuaHR0cCwgdGlmLnJlcSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9Y2F0Y2goZSl7CisJCQkJCXRyeXsKKwkJCQkJCXZhciBlcnJPYmogPSBuZXcgZG9qby5pby5FcnJvcigiWE1MSHR0cFRyYW5zcG9ydC53YXRjaEluRmxpZ2h0IEVycm9yOiAiICsgZSk7CisJCQkJCQl0aWYucmVxWyh0eXBlb2YgdGlmLnJlcS5lcnJvciA9PSAiZnVuY3Rpb24iKSA/ICJlcnJvciIgOiAiaGFuZGxlIl0oImVycm9yIiwgZXJyT2JqLCB0aWYuaHR0cCwgdGlmLnJlcSk7CisJCQkJCX1jYXRjaChlMil7CisJCQkJCQlkb2pvLmRlYnVnKCJYTUxIdHRwVHJhbnNwb3J0IGVycm9yIGNhbGxiYWNrIGZhaWxlZDogIiArIGUyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWNsZWFyVGltZW91dCh0aGlzLmluRmxpZ2h0VGltZXIpOworCQlpZih0aGlzLmluRmxpZ2h0Lmxlbmd0aCA9PSAwKXsKKwkJCXRoaXMuaW5GbGlnaHRUaW1lciA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5pbkZsaWdodFRpbWVyID0gc2V0VGltZW91dCgiZG9qby5pby5YTUxIVFRQVHJhbnNwb3J0LndhdGNoSW5GbGlnaHQoKTsiLCAxMCk7CisJfQorCisJdmFyIGhhc1htbEh0dHAgPSBkb2pvLmhvc3RlbnYuZ2V0WG1saHR0cE9iamVjdCgpID8gdHJ1ZSA6IGZhbHNlOworCXRoaXMuY2FuSGFuZGxlID0gZnVuY3Rpb24oLypkb2pvLmlvLlJlcXVlc3QqL2t3QXJncyl7CisJCS8vc3VtbWFyeTogVGVsbHMgZG9qby5pby5iaW5kKCkgaWYgdGhpcyBpcyBhIGdvb2QgdHJhbnNwb3J0IHRvCisJCS8vdXNlIGZvciB0aGUgcGFydGljdWxhciB0eXBlIG9mIHJlcXVlc3QuIFRoaXMgdHlwZSBvZiB0cmFuc3BvcnQgY2Fubm90CisJCS8vaGFuZGxlIGZvcm1zIHRoYXQgaGF2ZSBhbiBpbnB1dCB0eXBlPSJmaWxlIiBlbGVtZW50LgorCisJCS8vIEZJWE1FOiB3ZSBuZWVkIHRvIGRldGVybWluZSB3aGVuIGZvcm0gdmFsdWVzIG5lZWQgdG8gYmUKKwkJLy8gbXVsdGktcGFydCBtaW1lIGVuY29kZWQgYW5kIGF2b2lkIHVzaW5nIHRoaXMgdHJhbnNwb3J0IGZvciB0aG9zZQorCQkvLyByZXF1ZXN0cy4KKwkJdmFyIG1sYyA9IGt3QXJnc1sibWltZXR5cGUiXS50b0xvd2VyQ2FzZSgpfHwiIjsKKwkJcmV0dXJuIGhhc1htbEh0dHAKKwkJCSYmICgKKwkJCQkoCisJCQkJCWRvam8ubGFuZy5pbkFycmF5KFsKKwkJCQkJCSJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94bWwiLCAKKwkJCQkJCSJ0ZXh0L3htbCIsICJ0ZXh0L2phdmFzY3JpcHQiCisJCQkJCQldLCBtbGMKKwkJCQkJKQorCQkJCSkgfHwgKAorCQkJCQltbGMuc3Vic3RyKDAsIDkpID09ICJ0ZXh0L2pzb24iIHx8IG1sYy5zdWJzdHIoMCwgMTYpID09ICJhcHBsaWNhdGlvbi9qc29uIgorCQkJCSkKKwkJCSkKKwkJCSYmICEoIGt3QXJnc1siZm9ybU5vZGUiXSAmJiBkb2pvLmlvLmZvcm1IYXNGaWxlKGt3QXJnc1siZm9ybU5vZGUiXSkgKTsgLy9ib29sZWFuCisJfQorCisJdGhpcy5tdWx0aXBhcnRCb3VuZGFyeSA9ICI0NTMwOUZGRi1CRDY1LTRkNTAtOTlDOS0zNjk4Njg5NkE5NkYiOwkvLyB1bmlxdWUgZ3VpZCBhcyBhIGJvdW5kYXJ5IHZhbHVlIGZvciBtdWx0aXBhcnQgcG9zdHMKKworCXRoaXMuYmluZCA9IGZ1bmN0aW9uKC8qZG9qby5pby5SZXF1ZXN0Ki9rd0FyZ3MpeworCQkvL3N1bW1hcnk6IGZ1bmN0aW9uIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KKworCQkvL1RoaXMgZnVuY3Rpb24gd2lsbCBhdHRhY2ggYW4gYWJvcnQoKSBmdW5jdGlvbiB0byB0aGUga3dBcmdzIGRvam8uaW8uUmVxdWVzdCBvYmplY3QsCisJCS8vc28gaWYgeW91IG5lZWQgdG8gYWJvcnQgdGhlIHJlcXVlc3QsIHlvdSBjYW4gY2FsbCB0aGF0IG1ldGhvZCBvbiB0aGUgcmVxdWVzdCBvYmplY3QuCisJCS8vVGhlIGZvbGxvd2luZyBhcmUgYWNjZXB0YWJsZSBwcm9wZXJ0aWVzIGluIGt3QXJncyAoaW4gYWRkaXRpb24gdG8gdGhlCisJCS8vbm9ybWFsIGRvam8uaW8uUmVxdWVzdCBvYmplY3QgcHJvcGVydGllcykuCisJCS8vdXJsOiBTdHJpbmc6IFVSTCB0aGUgc2VydmVyIFVSTCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgorCQkvL21ldGhvZDogU3RyaW5nOiB0aGUgSFRUUCBtZXRob2QgdG8gdXNlIChHRVQsIFBPU1QsIGV0Yy4uLikuCisJCS8vbWltZXR5cGU6IFNwZWNpZmllcyB3aGF0IGZvcm1hdCB0aGUgcmVzdWx0IGRhdGEgc2hvdWxkIGJlIGdpdmVuIHRvIHRoZSBsb2FkL2hhbmRsZSBjYWxsYmFjay4gVmFsaWQgdmFsdWVzIGFyZToKKwkJLy8JCXRleHQvamF2YXNjcmlwdCwgdGV4dC9qc29uLCBhcHBsaWNhdGlvbi9qc29uLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLiBBbnkgb3RoZXIgbWltZXR5cGUgd2lsbCBnaXZlIGJhY2sgYSB0ZXh0CisJCS8vCQlzdHJpbmcuCisJCS8vdHJhbnNwb3J0OiBTdHJpbmc6IHNwZWNpZnkgIlhNTEhUVFBUcmFuc3BvcnQiIHRvIGZvcmNlIHRoZSB1c2Ugb2YgdGhpcyBYTUxIdHRwUmVxdWVzdCB0cmFuc3BvcnQuCisJCS8vaGVhZGVyczogT2JqZWN0OiBUaGUgb2JqZWN0IHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgd2lsbCBiZSBzZW50IGFzIEhUVFAgcmVxdWVzdCBoZWFkZXIKKwkJLy8JCW5hbWVzIGFuZCB2YWx1ZXMuCisJCS8vc2VuZFRyYW5zcG9ydDogYm9vbGVhbjogSWYgdHJ1ZSwgdGhlbiBkb2pvLnRyYW5zcG9ydD14bWxodHRwIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlcXVlc3QuCisJCS8vZW5jb2Rpbmc6IFN0cmluZzogVGhlIHR5cGUgb2YgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIHRoZSBjb250ZW50IGt3QXJncyBwcm9wZXJ0eS4KKwkJLy9jb250ZW50OiBPYmplY3Q6IFRoZSBjb250ZW50IG9iamVjdCBpcyBjb252ZXJ0ZWQgaW50byBhIG5hbWU9dmFsdWUmbmFtZT12YWx1ZSBzdHJpbmcsIGJ5CisJCS8vCQl1c2luZyBkb2pvLmlvLmFyZ3NGcm9tTWFwKCkuIFRoZSBlbmNvZGluZyBrd0FyZ3MgcHJvcGVydHkgaXMgcGFzc2VkIHRvIGRvam8uaW8uYXJnc0Zyb21NYXAoKQorCQkvLwkJZm9yIHVzZSBpbiBlbmNvZGluZyB0aGUgbmFtZXMgYW5kIHZhbHVlcy4gVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgYWRkZWQgdG8gdGhlIHJlcXVlc3QuCisJCS8vZm9ybU5vZGU6IERPTU5vZGU6IGEgZm9ybSBlbGVtZW50IG5vZGUuIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLiBVc2UgbmV3IGRvam8uaW8uRm9ybUJpbmQoKSBpbnN0ZWFkLgorCQkvLwkJSWYgZm9ybU5vZGUgaXMgdXNlZCwgdGhlbiB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiB0aGUgZm9ybSBlbGVtZW50cyB3aWxsIGJlIGNvbnZlcnRlZAorCQkvLwkJdG8gYSBuYW1lPXZhbHVlJm5hbWU9dmFsdWUgc3RyaW5nIGFuZCBhZGRlZCB0byB0aGUgcmVxdWVzdC4gVGhlIGVuY29kaW5nIGt3QXJncyBwcm9wZXJ0eSBpcyB1c2VkCisJCS8vCQl0byBlbmNvZGUgdGhlIG5hbWVzIGFuZCB2YWx1ZXMuCisJCS8vcG9zdENvbnRlbnQ6IFN0cmluZzogUmF3IG5hbWU9dmFsdWUmbmFtZT12YWx1ZSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4KKwkJLy9iYWNrIG9yIGJhY2tCdXR0b246IEZ1bmN0aW9uOiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpZiB0aGUgYmFjayBidXR0b24gaXMgcHJlc3NlZC4gSWYgdGhpcyBrd0FyZ3MgcHJvcGVydHkKKwkJLy8JCWlzIHVzZWQsIHRoZW4gYmFjayBidXR0b24gc3VwcG9ydCB2aWEgZG9qby51bmRvLmJyb3dzZXIgd2lsbCBiZSB1c2VkLiBTZWUgbm90ZXMgZm9yIGRvam8udW5kby5icm93c2VyIG9uIHVzYWdlLgorCQkvLwkJWW91IG5lZWQgdG8gc2V0IGRqQ29uZmlnLnByZXZlbnRCYWNrQnV0dG9uRml4ID0gZmFsc2UgdG8gZW5hYmxlIGJhY2sgYnV0dG9uIHN1cHBvcnQuCisJCS8vY2hhbmdlVXJsOiBib29sZWFuIG9yIFN0cmluZzogVXNlZCBhcyBwYXJ0IG9mIGJhY2sgYnV0dG9uIHN1cHBvcnQuIFNlZSBub3RlcyBmb3IgZG9qby51bmRvLmJyb3dzZXIgb24gdXNhZ2UuCisJCS8vdXNlcjogU3RyaW5nOiBUaGUgdXNlciBuYW1lLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBwYXNzd29yZC4gUGFzc2VkIHRvIFhNTEh0dHBSZXF1ZXN0Lm9wZW4oKS4KKwkJLy9wYXNzd29yZDogU3RyaW5nOiBUaGUgdXNlcidzIHBhc3N3b3JkLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB1c2VyLiBQYXNzZWQgdG8gWE1MSHR0cFJlcXVlc3Qub3BlbigpLgorCQkvL2ZpbGU6IE9iamVjdCBvciBBcnJheSBvZiBPYmplY3RzOiBhbiBvYmplY3Qgc2ltdWxhdGluZyBhIGZpbGUgdG8gYmUgdXBsb2FkZWQuIGZpbGUgb2JqZWN0cyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisJCS8vCQluYW1lIG9yIGZpbGVOYW1lOiB0aGUgbmFtZSBvZiB0aGUgZmlsZQorCQkvLwkJY29udGVudFR5cGU6IHRoZSBNSU1FIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGZpbGUuCisJCS8vCQljb250ZW50OiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGZpbGUuCisJCS8vbXVsdGlwYXJ0OiBib29sZWFuOiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIG11bHRpcGFydCBtaW1lIHJlcXVlc3QuIElmIGt3QXJncy5maWxlIGV4aXN0cywgdGhlbiB0aGlzCisJCS8vCQlwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSBhdXRvbWF0aWNhbGx5LgorCQkvL3N5bmM6IGJvb2xlYW46IGlmIHRydWUsIHRoZW4gYSBzeW5jaHJvbm91cyBYTUxIdHRwUmVxdWVzdCBjYWxsIGlzIGRvbmUsCisJCS8vCQlpZiBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGVuIGFuIGFzeW5jaHJvbm91cyBjYWxsIGlzIHVzZWQuCisJCS8vcHJldmVudENhY2hlOiBib29sZWFuOiBJZiB0cnVlLCB0aGVuIGEgY2FjaGUgYnVzdGluZyBwYXJhbWV0ZXIgaXMgYWRkZWQgdG8gdGhlIHJlcXVlc3QgVVJMLgorCQkvLwkJZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKwkJLy91c2VDYWNoZTogYm9vbGVhbjogSWYgdHJ1ZSwgdGhlbiBYTUxIdHRwVHJhbnNwb3J0IHdpbGwga2VlcCBhbiBpbnRlcm5hbCBjYWNoZSBvZiB0aGUgc2VydmVyCisJCS8vCQlyZXNwb25zZSBhbmQgdXNlIHRoYXQgcmVzcG9uc2UgaWYgYSBzaW1pbGFyIHJlcXVlc3QgaXMgZG9uZSBhZ2Fpbi4KKwkJLy8JCUEgc2ltaWxhciByZXF1ZXN0IGlzIG9uZSB0aGF0IGhhcyB0aGUgc2FtZSBVUkwsIHF1ZXJ5IHN0cmluZyBhbmQgSFRUUCBtZXRob2QgdmFsdWUuCisJCS8vCQlkZWZhdWx0IGlzIGZhbHNlLgorCQlpZigha3dBcmdzWyJ1cmwiXSl7CisJCQkvLyBhcmUgd2UgcGVyZm9ybWluZyBhIGhpc3RvcnkgYWN0aW9uPworCQkJaWYoICFrd0FyZ3NbImZvcm1Ob2RlIl0KKwkJCQkmJiAoa3dBcmdzWyJiYWNrQnV0dG9uIl0gfHwga3dBcmdzWyJiYWNrIl0gfHwga3dBcmdzWyJjaGFuZ2VVcmwiXSB8fCBrd0FyZ3NbIndhdGNoRm9yVVJMIl0pCisJCQkJJiYgKCFkakNvbmZpZy5wcmV2ZW50QmFja0J1dHRvbkZpeCkpIHsKKyAgICAgICAgZG9qby5kZXByZWNhdGVkKCJVc2luZyBkb2pvLmlvLlhNTEhUVFBUcmFuc3BvcnQuYmluZCgpIHRvIGFkZCB0byBicm93c2VyIGhpc3Rvcnkgd2l0aG91dCBkb2luZyBhbiBJTyByZXF1ZXN0IiwKKyAgICAgICAgCQkJCSJVc2UgZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KCkgaW5zdGVhZC4iLCAiMC40Iik7CisJCQkJZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KGt3QXJncyk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQkvLyBidWlsZCB0aGlzIGZpcnN0IGZvciBjYWNoZSBwdXJwb3NlcworCQl2YXIgdXJsID0ga3dBcmdzLnVybDsKKwkJdmFyIHF1ZXJ5ID0gIiI7CisJCWlmKGt3QXJnc1siZm9ybU5vZGUiXSl7CisJCQl2YXIgdGEgPSBrd0FyZ3MuZm9ybU5vZGUuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTsKKwkJCWlmKCh0YSkmJigha3dBcmdzWyJ1cmwiXSkpeyB1cmwgPSB0YTsgfQorCQkJdmFyIHRwID0ga3dBcmdzLmZvcm1Ob2RlLmdldEF0dHJpYnV0ZSgibWV0aG9kIik7CisJCQlpZigodHApJiYoIWt3QXJnc1sibWV0aG9kIl0pKXsga3dBcmdzLm1ldGhvZCA9IHRwOyB9CisJCQlxdWVyeSArPSBkb2pvLmlvLmVuY29kZUZvcm0oa3dBcmdzLmZvcm1Ob2RlLCBrd0FyZ3MuZW5jb2RpbmcsIGt3QXJnc1siZm9ybUZpbHRlciJdKTsKKwkJfQorCisJCWlmKHVybC5pbmRleE9mKCIjIikgPiAtMSkgeworCQkJZG9qby5kZWJ1ZygiV2FybmluZzogZG9qby5pby5iaW5kOiBzdHJpcHBpbmcgaGFzaCB2YWx1ZXMgZnJvbSB1cmw6IiwgdXJsKTsKKwkJCXVybCA9IHVybC5zcGxpdCgiIyIpWzBdOworCQl9CisKKwkJaWYoa3dBcmdzWyJmaWxlIl0peworCQkJLy8gZm9yY2UgcG9zdCBmb3IgZmlsZSB0cmFuc2ZlcgorCQkJa3dBcmdzLm1ldGhvZCA9ICJwb3N0IjsKKwkJfQorCisJCWlmKCFrd0FyZ3NbIm1ldGhvZCJdKXsKKwkJCWt3QXJncy5tZXRob2QgPSAiZ2V0IjsKKwkJfQorCisJCS8vIGd1ZXNzIHRoZSBtdWx0aXBhcnQgdmFsdWUKKwkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJnZXQiKXsKKwkJCS8vIEdFVCBjYW5ub3QgdXNlIG11bHRpcGFydAorCQkJa3dBcmdzLm11bHRpcGFydCA9IGZhbHNlOworCQl9ZWxzZXsKKwkJCWlmKGt3QXJnc1siZmlsZSJdKXsKKwkJCQkvLyBlbmZvcmNlIG11bHRpcGFydCB3aGVuIHNlbmRpbmcgZmlsZXMKKwkJCQlrd0FyZ3MubXVsdGlwYXJ0ID0gdHJ1ZTsKKwkJCX1lbHNlIGlmKCFrd0FyZ3NbIm11bHRpcGFydCJdKXsKKwkJCQkvLyBkZWZhdWx0IAorCQkJCWt3QXJncy5tdWx0aXBhcnQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWlmKGt3QXJnc1siYmFja0J1dHRvbiJdIHx8IGt3QXJnc1siYmFjayJdIHx8IGt3QXJnc1siY2hhbmdlVXJsIl0peworCQkJZG9qby51bmRvLmJyb3dzZXIuYWRkVG9IaXN0b3J5KGt3QXJncyk7CisJCX0KKworCQl2YXIgY29udGVudCA9IGt3QXJnc1siY29udGVudCJdIHx8IHt9OworCisJCWlmKGt3QXJncy5zZW5kVHJhbnNwb3J0KSB7CisJCQljb250ZW50WyJkb2pvLnRyYW5zcG9ydCJdID0gInhtbGh0dHAiOworCQl9CisKKwkJZG8geyAvLyBicmVhay1ibG9jaworCQkJaWYoa3dBcmdzLnBvc3RDb250ZW50KXsKKwkJCQlxdWVyeSA9IGt3QXJncy5wb3N0Q29udGVudDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYoY29udGVudCkgeworCQkJCXF1ZXJ5ICs9IGRvam8uaW8uYXJnc0Zyb21NYXAoY29udGVudCwga3dBcmdzLmVuY29kaW5nKTsKKwkJCX0KKwkJCQorCQkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJnZXQiIHx8ICFrd0FyZ3MubXVsdGlwYXJ0KXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdmFyCXQgPSBbXTsKKwkJCWlmKHF1ZXJ5Lmxlbmd0aCl7CisJCQkJdmFyIHEgPSBxdWVyeS5zcGxpdCgiJiIpOworCQkJCWZvcih2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgKytpKXsKKwkJCQkJaWYocVtpXS5sZW5ndGgpeworCQkJCQkJdmFyIHAgPSBxW2ldLnNwbGl0KCI9Iik7CisJCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCQkiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIHBbMF0gKyAiXCIiLCAKKwkJCQkJCQkJIiIsCisJCQkJCQkJCXBbMV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZihrd0FyZ3MuZmlsZSl7CisJCQkJaWYoZG9qby5sYW5nLmlzQXJyYXkoa3dBcmdzLmZpbGUpKXsKKwkJCQkJZm9yKHZhciBpID0gMDsgaSA8IGt3QXJncy5maWxlLmxlbmd0aDsgKytpKXsKKwkJCQkJCXZhciBvID0ga3dBcmdzLmZpbGVbaV07CisJCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCQkiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIiArIG8ubmFtZSArICJcIjsgZmlsZW5hbWU9XCIiICsgKCJmaWxlTmFtZSIgaW4gbyA/IG8uZmlsZU5hbWUgOiBvLm5hbWUpICsgIlwiIiwKKwkJCQkJCQkJIkNvbnRlbnQtVHlwZTogIiArICgiY29udGVudFR5cGUiIGluIG8gPyBvLmNvbnRlbnRUeXBlIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLAorCQkJCQkJCQkiIiwKKwkJCQkJCQkJby5jb250ZW50KTsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQl2YXIgbyA9IGt3QXJncy5maWxlOworCQkJCQl0LnB1c2goCSItLSIgKyB0aGlzLm11bHRpcGFydEJvdW5kYXJ5LAorCQkJCQkJCSJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgby5uYW1lICsgIlwiOyBmaWxlbmFtZT1cIiIgKyAoImZpbGVOYW1lIiBpbiBvID8gby5maWxlTmFtZSA6IG8ubmFtZSkgKyAiXCIiLAorCQkJCQkJCSJDb250ZW50LVR5cGU6ICIgKyAoImNvbnRlbnRUeXBlIiBpbiBvID8gby5jb250ZW50VHlwZSA6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSwKKwkJCQkJCQkiIiwKKwkJCQkJCQlvLmNvbnRlbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYodC5sZW5ndGgpeworCQkJCXQucHVzaCgiLS0iK3RoaXMubXVsdGlwYXJ0Qm91bmRhcnkrIi0tIiwgIiIpOworCQkJCXF1ZXJ5ID0gdC5qb2luKCJcclxuIik7CisJCQl9CisJCX13aGlsZShmYWxzZSk7CisKKwkJLy8ga3dBcmdzLkNvbm5lY3Rpb24gPSAiY2xvc2UiOworCisJCXZhciBhc3luYyA9IGt3QXJnc1sic3luYyJdID8gZmFsc2UgOiB0cnVlOworCisJCXZhciBwcmV2ZW50Q2FjaGUgPSBrd0FyZ3NbInByZXZlbnRDYWNoZSJdIHx8CisJCQkodGhpcy5wcmV2ZW50Q2FjaGUgPT0gdHJ1ZSAmJiBrd0FyZ3NbInByZXZlbnRDYWNoZSJdICE9IGZhbHNlKTsKKwkJdmFyIHVzZUNhY2hlID0ga3dBcmdzWyJ1c2VDYWNoZSJdID09IHRydWUgfHwKKwkJCSh0aGlzLnVzZUNhY2hlID09IHRydWUgJiYga3dBcmdzWyJ1c2VDYWNoZSJdICE9IGZhbHNlICk7CisKKwkJLy8gcHJldmVudENhY2hlIGlzIGJyb3dzZXItbGV2ZWwgKGFkZCBxdWVyeSBzdHJpbmcganVuayksIHVzZUNhY2hlCisJCS8vIGlzIGZvciB0aGUgbG9jYWwgY2FjaGUuIElmIHdlIHNheSBwcmV2ZW50Q2FjaGUsIHRoZW4gZG9uJ3QgYXR0ZW1wdAorCQkvLyB0byBsb29rIGluIHRoZSBjYWNoZSwgYnV0IGlmIHVzZUNhY2hlIGlzIHRydWUsIHdlIHN0aWxsIHdhbnQgdG8gY2FjaGUKKwkJLy8gdGhlIHJlc3BvbnNlCisJCWlmKCFwcmV2ZW50Q2FjaGUgJiYgdXNlQ2FjaGUpeworCQkJdmFyIGNhY2hlZEh0dHAgPSBnZXRGcm9tQ2FjaGUodXJsLCBxdWVyeSwga3dBcmdzLm1ldGhvZCk7CisJCQlpZihjYWNoZWRIdHRwKXsKKwkJCQlkb0xvYWQoa3dBcmdzLCBjYWNoZWRIdHRwLCB1cmwsIHF1ZXJ5LCBmYWxzZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLy8gbXVjaCBvZiB0aGlzIGlzIGZyb20gZ2V0VGV4dCwgYnV0IHJlcHJvZHVjZWQgaGVyZSBiZWNhdXNlIHdlIG5lZWQKKwkJLy8gbW9yZSBmbGV4aWJpbGl0eQorCQl2YXIgaHR0cCA9IGRvam8uaG9zdGVudi5nZXRYbWxodHRwT2JqZWN0KGt3QXJncyk7CQorCQl2YXIgcmVjZWl2ZWQgPSBmYWxzZTsKKworCQkvLyBidWlsZCBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBoYW5kbGVyIG9iagorCQlpZihhc3luYyl7CisJCQl2YXIgc3RhcnRUaW1lID0gCisJCQkvLyBGSVhNRTogc2V0dGluZyB1cCB0aGlzIGNhbGxiYWNrIGhhbmRsZXIgbGVha3Mgb24gSUUhISEKKwkJCXRoaXMuaW5GbGlnaHQucHVzaCh7CisJCQkJInJlcSI6CQlrd0FyZ3MsCisJCQkJImh0dHAiOgkJaHR0cCwKKwkJCQkidXJsIjoJIAl1cmwsCisJCQkJInF1ZXJ5IjoJcXVlcnksCisJCQkJInVzZUNhY2hlIjoJdXNlQ2FjaGUsCisJCQkJInN0YXJ0VGltZSI6IGt3QXJncy50aW1lb3V0U2Vjb25kcyA/IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgOiAwCisJCQl9KTsKKwkJCXRoaXMuc3RhcnRXYXRjaGluZ0luRmxpZ2h0KCk7CisJCX1lbHNleworCQkJLy8gYmxvY2sgYXN5bmMgY2FsbGJhY2tzIHVudGlsIHN5bmMgaXMgaW4sIG5lZWRlZCBpbiBraHRtbCwgb3RoZXJzPworCQkJX3RoaXMuX2Jsb2NrQXN5bmMgPSB0cnVlOworCQl9CisKKwkJaWYoa3dBcmdzLm1ldGhvZC50b0xvd2VyQ2FzZSgpID09ICJwb3N0Iil7CisJCQkvLyBGSVhNRTogbmVlZCB0byBoYWNrIGluIG1vcmUgZmxleGlibGUgQ29udGVudC1UeXBlIHNldHRpbmcgaGVyZSEKKwkJCWlmICgha3dBcmdzLnVzZXIpIHsKKwkJCQlodHRwLm9wZW4oIlBPU1QiLCB1cmwsIGFzeW5jKTsKKwkJCX1lbHNleworICAgICAgICBodHRwLm9wZW4oIlBPU1QiLCB1cmwsIGFzeW5jLCBrd0FyZ3MudXNlciwga3dBcmdzLnBhc3N3b3JkKTsKKwkJCX0KKwkJCXNldEhlYWRlcnMoaHR0cCwga3dBcmdzKTsKKwkJCWh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwga3dBcmdzLm11bHRpcGFydCA/ICgibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9IiArIHRoaXMubXVsdGlwYXJ0Qm91bmRhcnkpIDogCisJCQkJKGt3QXJncy5jb250ZW50VHlwZSB8fCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikpOworCQkJdHJ5eworCQkJCWh0dHAuc2VuZChxdWVyeSk7CisJCQl9Y2F0Y2goZSl7CisJCQkJaWYodHlwZW9mIGh0dHAuYWJvcnQgPT0gImZ1bmN0aW9uIil7CisJCQkJCWh0dHAuYWJvcnQoKTsKKwkJCQl9CisJCQkJZG9Mb2FkKGt3QXJncywge3N0YXR1czogNDA0fSwgdXJsLCBxdWVyeSwgdXNlQ2FjaGUpOworCQkJfQorCQl9ZWxzZXsKKwkJCXZhciB0bXBVcmwgPSB1cmw7CisJCQlpZihxdWVyeSAhPSAiIikgeworCQkJCXRtcFVybCArPSAodG1wVXJsLmluZGV4T2YoIj8iKSA+IC0xID8gIiYiIDogIj8iKSArIHF1ZXJ5OworCQkJfQorCQkJaWYocHJldmVudENhY2hlKSB7CisJCQkJdG1wVXJsICs9IChkb2pvLnN0cmluZy5lbmRzV2l0aEFueSh0bXBVcmwsICI/IiwgIiYiKQorCQkJCQk/ICIiIDogKHRtcFVybC5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikpICsgImRvam8ucHJldmVudENhY2hlPSIgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJCX0KKwkJCWlmICgha3dBcmdzLnVzZXIpIHsKKwkJCQlodHRwLm9wZW4oa3dBcmdzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0bXBVcmwsIGFzeW5jKTsKKwkJCX1lbHNleworCQkJCWh0dHAub3Blbihrd0FyZ3MubWV0aG9kLnRvVXBwZXJDYXNlKCksIHRtcFVybCwgYXN5bmMsIGt3QXJncy51c2VyLCBrd0FyZ3MucGFzc3dvcmQpOworCQkJfQorCQkJc2V0SGVhZGVycyhodHRwLCBrd0FyZ3MpOworCQkJdHJ5IHsKKwkJCQlodHRwLnNlbmQobnVsbCk7CisJCQl9Y2F0Y2goZSkJeworCQkJCWlmKHR5cGVvZiBodHRwLmFib3J0ID09ICJmdW5jdGlvbiIpeworCQkJCQlodHRwLmFib3J0KCk7CisJCQkJfQorCQkJCWRvTG9hZChrd0FyZ3MsIHtzdGF0dXM6IDQwNH0sIHVybCwgcXVlcnksIHVzZUNhY2hlKTsKKwkJCX0KKwkJfQorCisJCWlmKCAhYXN5bmMgKSB7CisJCQlkb0xvYWQoa3dBcmdzLCBodHRwLCB1cmwsIHF1ZXJ5LCB1c2VDYWNoZSk7CisJCQlfdGhpcy5fYmxvY2tBc3luYyA9IGZhbHNlOworCQl9CisKKwkJa3dBcmdzLmFib3J0ID0gZnVuY3Rpb24oKXsKKwkJCXRyeXsvLyBraHRtbCBkb2VzZW50IHJlc2V0IHJlYWR5U3RhdGUgb24gYWJvcnQsIG5lZWQgdGhpcyB3b3JrYXJvdW5kCisJCQkJaHR0cC5fYWJvcnRlZCA9IHRydWU7IAorCQkJfWNhdGNoKGUpey8qc3F1ZWxzaCovfQorCQkJcmV0dXJuIGh0dHAuYWJvcnQoKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisJZG9qby5pby50cmFuc3BvcnRzLmFkZFRyYW5zcG9ydCgiWE1MSFRUUFRyYW5zcG9ydCIpOworfQorCit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5pby5jb29raWUiKTsKKworZG9qby5pby5jb29raWUuc2V0Q29va2llID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qU3RyaW5nKi92YWx1ZSwgCisJCQkJCQkJCQkvKk51bWJlcj8qL2RheXMsIC8qU3RyaW5nPyovcGF0aCwgCisJCQkJCQkJCQkvKlN0cmluZz8qL2RvbWFpbiwgLypib29sZWFuPyovc2VjdXJlKXsKKwkvL3N1bW1hcnk6IHNldHMgYSBjb29raWUuCisJdmFyIGV4cGlyZXMgPSAtMTsKKwlpZigodHlwZW9mIGRheXMgPT0gIm51bWJlciIpJiYoZGF5cyA+PSAwKSl7CisJCXZhciBkID0gbmV3IERhdGUoKTsKKwkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpKyhkYXlzKjI0KjYwKjYwKjEwMDApKTsKKwkJZXhwaXJlcyA9IGQudG9HTVRTdHJpbmcoKTsKKwl9CisJdmFsdWUgPSBlc2NhcGUodmFsdWUpOworCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKyB2YWx1ZSArICI7IgorCQkrIChleHBpcmVzICE9IC0xID8gIiBleHBpcmVzPSIgKyBleHBpcmVzICsgIjsiIDogIiIpCisJCSsgKHBhdGggPyAicGF0aD0iICsgcGF0aCA6ICIiKQorCQkrIChkb21haW4gPyAiOyBkb21haW49IiArIGRvbWFpbiA6ICIiKQorCQkrIChzZWN1cmUgPyAiOyBzZWN1cmUiIDogIiIpOworfQorCitkb2pvLmlvLmNvb2tpZS5zZXQgPSBkb2pvLmlvLmNvb2tpZS5zZXRDb29raWU7CisKK2Rvam8uaW8uY29va2llLmdldENvb2tpZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvL3N1bW1hcnk6IEdldHMgYSBjb29raWUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworCS8vIEZJWE1FOiBXaGljaCBjb29raWUgc2hvdWxkIHdlIHJldHVybj8KKwkvLyAgICAgICAgSWYgdGhlcmUgYXJlIGNvb2tpZXMgc2V0IGZvciBkaWZmZXJlbnQgc3ViIGRvbWFpbnMgaW4gdGhlIGN1cnJlbnQKKwkvLyAgICAgICAgc2NvcGUgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBjb29raWUgd2l0aCB0aGUgc2FtZSBuYW1lLgorCS8vICAgICAgICBJIHRoaW5rIHRha2luZyB0aGUgbGFzdCBvbmUgaW4gdGhlIGxpc3QgdGFrZXMgdGhlIG9uZSBmcm9tIHRoZQorCS8vICAgICAgICBkZWVwZXN0IHN1YmRvbWFpbiwgd2hpY2ggaXMgd2hhdCB3ZSdyZSBkb2luZyBoZXJlLgorCXZhciBpZHggPSBkb2N1bWVudC5jb29raWUubGFzdEluZGV4T2YobmFtZSsnPScpOworCWlmKGlkeCA9PSAtMSkgeyByZXR1cm4gbnVsbDsgfQorCXZhciB2YWx1ZSA9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoaWR4K25hbWUubGVuZ3RoKzEpOworCXZhciBlbmQgPSB2YWx1ZS5pbmRleE9mKCc7Jyk7CisJaWYoZW5kID09IC0xKSB7IGVuZCA9IHZhbHVlLmxlbmd0aDsgfQorCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGVuZCk7CisJdmFsdWUgPSB1bmVzY2FwZSh2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOyAvL1N0cmluZworfQorCitkb2pvLmlvLmNvb2tpZS5nZXQgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWU7CisKK2Rvam8uaW8uY29va2llLmRlbGV0ZUNvb2tpZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkvL3N1bW1hcnk6IERlbGV0ZXMgYSBjb29raWUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgIi0iLCAwKTsKK30KKworZG9qby5pby5jb29raWUuc2V0T2JqZWN0Q29va2llID0gZnVuY3Rpb24oCS8qU3RyaW5nKi9uYW1lLCAvKk9iamVjdCovb2JqLCAKKwkJCQkJCQkJCQkJLypOdW1iZXI/Ki9kYXlzLCAvKlN0cmluZz8qL3BhdGgsIAorCQkJCQkJCQkJCQkvKlN0cmluZz8qL2RvbWFpbiwgLypib29sZWFuPyovc2VjdXJlLCAKKwkJCQkJCQkJCQkJLypib29sZWFuPyovY2xlYXJDdXJyZW50KXsKKwkvL3N1bW1hcnk6IFRha2VzIGFuIG9iamVjdCwgc2VyaWFsaXplcyBpdCB0byBhIGNvb2tpZSB2YWx1ZSwgYW5kIGVpdGhlcgorCS8vc2V0cyBhIGNvb2tpZSB3aXRoIHRoZSBzZXJpYWxpemVkIHZhbHVlLgorCS8vZGVzY3JpcHRpb246IElmIGNsZWFyQ3VycmVudCBpcyB0cnVlLCB0aGVuIGFueSBjdXJyZW50IGNvb2tpZSB2YWx1ZQorCS8vZm9yIHRoaXMgb2JqZWN0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdGhlIG5ldyBzZXJpYWxpemVkIG9iamVjdCB2YWx1ZS4KKwkvL0lmIGNsZWFyQ3VycmVudCBpcyBmYWxzZSwgdGhlbiB0aGUgZXhpc3RpbmcgY29va2llIHZhbHVlIHdpbGwgYmUgbW9kaWZpZWQKKwkvL3dpdGggYW55IGNoYW5nZXMgZnJvbSB0aGUgbmV3IG9iamVjdCB2YWx1ZS4KKwkvL09iamVjdHMgbXVzdCBiZSBzaW1wbGUgbmFtZS92YWx1ZSBwYWlycyB3aGVyZSB0aGUgdmFsdWUgaXMgZWl0aGVyIGEgc3RyaW5nCisJLy9vciBhIG51bWJlci4gQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgaWdub3JlZC4KKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDUpeyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdAorCQljbGVhckN1cnJlbnQgPSBkb21haW47CisJCWRvbWFpbiA9IG51bGw7CisJCXNlY3VyZSA9IG51bGw7CisJfQorCXZhciBwYWlycyA9IFtdLCBjb29raWUsIHZhbHVlID0gIiI7CisJaWYoIWNsZWFyQ3VycmVudCl7CisJCWNvb2tpZSA9IGRvam8uaW8uY29va2llLmdldE9iamVjdENvb2tpZShuYW1lKTsKKwl9CisJaWYoZGF5cyA+PSAwKXsKKwkJaWYoIWNvb2tpZSl7IGNvb2tpZSA9IHt9OyB9CisJCWZvcih2YXIgcHJvcCBpbiBvYmopeworCQkJaWYob2JqW3Byb3BdID09IG51bGwpeworCQkJCWRlbGV0ZSBjb29raWVbcHJvcF07CisJCQl9ZWxzZSBpZigodHlwZW9mIG9ialtwcm9wXSA9PSAic3RyaW5nIil8fCh0eXBlb2Ygb2JqW3Byb3BdID09ICJudW1iZXIiKSl7CisJCQkJY29va2llW3Byb3BdID0gb2JqW3Byb3BdOworCQkJfQorCQl9CisJCXByb3AgPSBudWxsOworCQlmb3IodmFyIHByb3AgaW4gY29va2llKXsKKwkJCXBhaXJzLnB1c2goZXNjYXBlKHByb3ApICsgIj0iICsgZXNjYXBlKGNvb2tpZVtwcm9wXSkpOworCQl9CisJCXZhbHVlID0gcGFpcnMuam9pbigiJiIpOworCX0KKwlkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUobmFtZSwgdmFsdWUsIGRheXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKTsKK30KKworZG9qby5pby5jb29raWUuZ2V0T2JqZWN0Q29va2llID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUpeworCS8vc3VtbWFyeTogR2V0cyBhbiBvYmplY3QgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb29raWUgbmFtZS4gVGhlIGNvbXBsZW1lbnQgb2YKKwkvL2Rvam8uaW8uY29va2llLnNldE9iamVjdENvb2tpZSgpLgorCXZhciB2YWx1ZXMgPSBudWxsLCBjb29raWUgPSBkb2pvLmlvLmNvb2tpZS5nZXRDb29raWUobmFtZSk7CisJaWYoY29va2llKXsKKwkJdmFsdWVzID0ge307CisJCXZhciBwYWlycyA9IGNvb2tpZS5zcGxpdCgiJiIpOworCQlmb3IodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspeworCQkJdmFyIHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgiPSIpOworCQkJdmFyIHZhbHVlID0gcGFpclsxXTsKKwkJCWlmKCBpc05hTih2YWx1ZSkgKXsgdmFsdWUgPSB1bmVzY2FwZShwYWlyWzFdKTsgfQorCQkJdmFsdWVzWyB1bmVzY2FwZShwYWlyWzBdKSBdID0gdmFsdWU7CisJCX0KKwl9CisJcmV0dXJuIHZhbHVlczsKK30KKworZG9qby5pby5jb29raWUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbigpeworCS8vc3VtbWFyeTogVGVzdHMgdGhlIGJyb3dzZXIgdG8gc2VlIGlmIGNvb2tpZXMgYXJlIGVuYWJsZWQuCisJaWYodHlwZW9mIG5hdmlnYXRvci5jb29raWVFbmFibGVkICE9ICJib29sZWFuIil7CisJCWRvam8uaW8uY29va2llLnNldENvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iLAorCQkJIkNvb2tpZXNBbGxvd2VkIiwgOTAsIG51bGwpOworCQl2YXIgY29va2llVmFsID0gZG9qby5pby5jb29raWUuZ2V0Q29va2llKCJfX1Rlc3RpbmdZb3VyQnJvd3NlckZvckNvb2tpZVN1cHBvcnRfXyIpOworCQluYXZpZ2F0b3IuY29va2llRW5hYmxlZCA9IChjb29raWVWYWwgPT0gIkNvb2tpZXNBbGxvd2VkIik7CisJCWlmKG5hdmlnYXRvci5jb29raWVFbmFibGVkKXsKKwkJCS8vIEZJWE1FOiBzaG91bGQgd2UgbGVhdmUgdGhpcyBhcm91bmQ/CisJCQl0aGlzLmRlbGV0ZUNvb2tpZSgiX19UZXN0aW5nWW91ckJyb3dzZXJGb3JDb29raWVTdXBwb3J0X18iKTsKKwkJfQorCX0KKwlyZXR1cm4gbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ7IC8vYm9vbGVhbgorfQorCisvLyBuZWVkIHRvIGxlYXZlIHRoaXMgaW4gZm9yIGJhY2t3YXJkcy1jb21wYXQgZnJvbSAwLjEgZm9yIHdoZW4gaXQgZ2V0cyBwdWxsZWQgaW4gYnkgZG9qby5pby4qCitpZighZG9qby5pby5jb29raWVzKXsgZG9qby5pby5jb29raWVzID0gZG9qby5pby5jb29raWU7IH0KKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbImRvam8uaW8uY29tbW9uIl0sCisJcmhpbm86IFsiZG9qby5pby5SaGlub0lPIl0sCisJYnJvd3NlcjogWyJkb2pvLmlvLkJyb3dzZXJJTyIsICJkb2pvLmlvLmNvb2tpZSJdLAorCWRhc2hib2FyZDogWyJkb2pvLmlvLkJyb3dzZXJJTyIsICJkb2pvLmlvLmNvb2tpZSJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5pby4qIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC5jb21tb24iKTsKKworCisKKworCisvLyBUT0RPOiBjb25uZWN0aW9uIGZpbHRlciBmdW5jdGlvbnMKKy8vCQkJdGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBhIG1ldGhvZCBpbnZvY2F0aW9uIChsaWtlIGFyb3VuZAorLy8JCQlhZHZpY2UpIGFuZCByZXR1cm4gYSBib29sZWFuIGJhc2VkIG9uIGl0LiBUaGF0IHZhbHVlIGRldGVybWluZXMKKy8vCQkJd2hldGhlciBvciBub3QgdGhlIGNvbm5lY3Rpb24gcHJvY2VlZHMuIEl0IGNvdWxkICJmZWVsIiBsaWtlIGFyb3VuZAorLy8JCQlhZHZpY2UgZm9yIHRob3NlIHdobyBrbm93IHdoYXQgaXQgaXMgKGNhbGxpbmcgcHJvY2VlZCgpIG9yIG5vdCksCisvLwkJCWJ1dCBJIHRoaW5rIHByZXNlbnRpbmcgaXQgYXMgYSAiZmlsdGVyIiBhbmQvb3IgY2FsbGluZyBpdCB3aXRoIHRoZQorLy8JCQlmdW5jdGlvbiBhcmdzIGFuZCBub3QgdGhlIE1ldGhvZEludm9jYXRpb24gbWlnaHQgbWFrZSBpdCBtb3JlCisvLwkJCXBhbGxldGFibGUgdG8gIm5vcm1hbCIgdXNlcnMgdGhhbiBhcm91bmQtYWR2aWNlIGN1cnJlbnRseSBpcworLy8gVE9ETzogZXhlY3V0aW9uIHNjb3BlIG1hbmdsaW5nCisvLwkJCVlVSSdzIGV2ZW50IGZhY2lsaXR5IGJ5IGRlZmF1bHQgZXhlY3V0ZXMgbGlzdGVuZXJzIGluIHRoZSBjb250ZXh0CisvLwkJCW9mIHRoZSBzb3VyY2Ugb2JqZWN0LiBUaGlzIGlzIHZlcnkgb2RkLCBidXQgc2hvdWxkIHByb2JhYmx5IGJlCisvLwkJCXN1cHBvcnRlZCBhcyBhbiBvcHRpb24gKGJvdGggZm9yIHRoZSBzb3VyY2UgYW5kIGZvciB0aGUgZGVzdCkuIEl0CisvLwkJCWNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY29ubmVjdGlvbi1zcGVjaWZpYyBoaXRjaCgpLgorLy8gVE9ETzogbW9yZSByZXNpbGllbmN5IGZvciA0KyBhcmd1bWVudHMgdG8gY29ubmVjdCgpCisKK2Rvam8uZXZlbnQgPSBuZXcgZnVuY3Rpb24oKXsKKwl0aGlzLl9jYW5UaW1lb3V0ID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oZGpfZ2xvYmFsWyJzZXRUaW1lb3V0Il0pfHxkb2pvLmxhbmcuaXNBbGllbihkal9nbG9iYWxbInNldFRpbWVvdXQiXSk7CisKKwkvLyBGSVhNRTogd2hlcmUgc2hvdWxkIHdlIHB1dCB0aGlzIG1ldGhvZCAobm90IGhlcmUhKT8KKwlmdW5jdGlvbiBpbnRlcnBvbGF0ZUFyZ3MoYXJncywgc2VhcmNoRm9yTmFtZXMpeworCQl2YXIgZGwgPSBkb2pvLmxhbmc7CisJCXZhciBhbyA9IHsKKwkJCXNyY09iajogZGpfZ2xvYmFsLAorCQkJc3JjRnVuYzogbnVsbCwKKwkJCWFkdmljZU9iajogZGpfZ2xvYmFsLAorCQkJYWR2aWNlRnVuYzogbnVsbCwKKwkJCWFyb3VuZE9iajogbnVsbCwKKwkJCWFyb3VuZEZ1bmM6IG51bGwsCisJCQlhZHZpY2VUeXBlOiAoYXJncy5sZW5ndGg+MikgPyBhcmdzWzBdIDogImFmdGVyIiwKKwkJCXByZWNlZGVuY2U6ICJsYXN0IiwKKwkJCW9uY2U6IGZhbHNlLAorCQkJZGVsYXk6IG51bGwsCisJCQlyYXRlOiAwLAorCQkJYWR2aWNlTXNnOiBmYWxzZSwKKwkJCW1heENhbGxzOiAtMQorCQl9OworCisJCXN3aXRjaChhcmdzLmxlbmd0aCl7CisJCQljYXNlIDA6IHJldHVybjsKKwkJCWNhc2UgMTogcmV0dXJuOworCQkJY2FzZSAyOgorCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzBdOworCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzFdOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmKChkbC5pc09iamVjdChhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworCQkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCX1lbHNlIGlmKChkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc1N0cmluZyhhcmdzWzJdKSkpeworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbMl07CisJCQkJfWVsc2UgaWYoKGRsLmlzT2JqZWN0KGFyZ3NbMF0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMV0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1syXSkpKXsKKwkJCQkJYW8uYWR2aWNlVHlwZSA9ICJhZnRlciI7CisJCQkJCWFvLnNyY09iaiA9IGFyZ3NbMF07CisJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzFdOworCQkJCQl2YXIgdG1wTmFtZSAgPSBkbC5uYW1lQW5vbkZ1bmMoYXJnc1syXSwgYW8uYWR2aWNlT2JqLCBzZWFyY2hGb3JOYW1lcyk7CisJCQkJCWFvLmFkdmljZUZ1bmMgPSB0bXBOYW1lOworCQkJCX1lbHNlIGlmKChkbC5pc0Z1bmN0aW9uKGFyZ3NbMF0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSl7CisJCQkJCWFvLmFkdmljZVR5cGUgPSAiYWZ0ZXIiOworCQkJCQlhby5zcmNPYmogPSBkal9nbG9iYWw7CisJCQkJCXZhciB0bXBOYW1lICA9IGRsLm5hbWVBbm9uRnVuYyhhcmdzWzBdLCBhby5zcmNPYmosIHNlYXJjaEZvck5hbWVzKTsKKwkJCQkJYW8uc3JjRnVuYyA9IHRtcE5hbWU7CisJCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlpZigoZGwuaXNPYmplY3QoYXJnc1swXSkpJiYoZGwuaXNPYmplY3QoYXJnc1syXSkpKXsKKwkJCQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IHdlJ3ZlIGdvdCBhbiBvbGQtc3R5bGUgImNvbm5lY3QiIGZyb20KKwkJCQkJLy8gdGhlIHNpZ3Nsb3Qgc2Nob29sIG9mIGV2ZW50IGF0dGFjaG1lbnQuIFdlIHRoZXJlZm9yZQorCQkJCQkvLyBhc3N1bWUgYWZ0ZXItYWR2aWNlLgorCQkJCQlhby5hZHZpY2VUeXBlID0gImFmdGVyIjsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbMl07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzNdOworCQkJCX1lbHNlIGlmKChkbC5pc1N0cmluZyhhcmdzWzBdKSkmJihkbC5pc1N0cmluZyhhcmdzWzFdKSkmJihkbC5pc09iamVjdChhcmdzWzJdKSkpeworCQkJCQlhby5hZHZpY2VUeXBlID0gYXJnc1swXTsKKwkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2UgaWYoKGRsLmlzU3RyaW5nKGFyZ3NbMF0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1sxXSkpJiYoZGwuaXNPYmplY3QoYXJnc1syXSkpKXsKKwkJCQkJYW8uYWR2aWNlVHlwZSA9IGFyZ3NbMF07CisJCQkJCWFvLnNyY09iaiA9IGRqX2dsb2JhbDsKKwkJCQkJdmFyIHRtcE5hbWUgID0gZGwubmFtZUFub25GdW5jKGFyZ3NbMV0sIGRqX2dsb2JhbCwgc2VhcmNoRm9yTmFtZXMpOworCQkJCQlhby5zcmNGdW5jID0gdG1wTmFtZTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2UgaWYoKGRsLmlzU3RyaW5nKGFyZ3NbMF0pKSYmKGRsLmlzT2JqZWN0KGFyZ3NbMV0pKSYmKGRsLmlzU3RyaW5nKGFyZ3NbMl0pKSYmKGRsLmlzRnVuY3Rpb24oYXJnc1szXSkpKXsKKwkJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMl07CisJCQkJCXZhciB0bXBOYW1lICA9IGRsLm5hbWVBbm9uRnVuYyhhcmdzWzNdLCBkal9nbG9iYWwsIHNlYXJjaEZvck5hbWVzKTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJCQl9ZWxzZSBpZihkbC5pc09iamVjdChhcmdzWzFdKSl7CisJCQkJCWFvLnNyY09iaiA9IGFyZ3NbMV07CisJCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCQlhby5hZHZpY2VPYmogPSBkal9nbG9iYWw7CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzNdOworCQkJCX1lbHNlIGlmKGRsLmlzT2JqZWN0KGFyZ3NbMl0pKXsKKwkJCQkJYW8uc3JjT2JqID0gZGpfZ2xvYmFsOworCQkJCQlhby5zcmNGdW5jID0gYXJnc1sxXTsKKwkJCQkJYW8uYWR2aWNlT2JqID0gYXJnc1syXTsKKwkJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbM107CisJCQkJfWVsc2V7CisJCQkJCWFvLnNyY09iaiA9IGFvLmFkdmljZU9iaiA9IGFvLmFyb3VuZE9iaiA9IGRqX2dsb2JhbDsKKwkJCQkJYW8uc3JjRnVuYyA9IGFyZ3NbMV07CisJCQkJCWFvLmFkdmljZUZ1bmMgPSBhcmdzWzJdOworCQkJCQlhby5hcm91bmRGdW5jID0gYXJnc1szXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQlhby5zcmNGdW5jID0gYXJnc1syXTsKKwkJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdCisJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQkJYW8uYXJvdW5kRnVuYyA9IGFyZ3NbNV07CisJCQkJYW8uYXJvdW5kT2JqID0gZGpfZ2xvYmFsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhby5zcmNPYmogPSBhcmdzWzFdOworCQkJCWFvLnNyY0Z1bmMgPSBhcmdzWzJdOworCQkJCWFvLmFkdmljZU9iaiA9IGFyZ3NbM10KKwkJCQlhby5hZHZpY2VGdW5jID0gYXJnc1s0XTsKKwkJCQlhby5hcm91bmRPYmogPSBhcmdzWzVdOworCQkJCWFvLmFyb3VuZEZ1bmMgPSBhcmdzWzZdOworCQkJCWFvLm9uY2UgPSBhcmdzWzddOworCQkJCWFvLmRlbGF5ID0gYXJnc1s4XTsKKwkJCQlhby5yYXRlID0gYXJnc1s5XTsKKwkJCQlhby5hZHZpY2VNc2cgPSBhcmdzWzEwXTsKKwkJCQlhby5tYXhDYWxscyA9ICghaXNOYU4ocGFyc2VJbnQoYXJnc1sxMV0pKSkgPyBhcmdzWzExXSA6IC0xOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYoZGwuaXNGdW5jdGlvbihhby5hcm91bmRGdW5jKSl7CisJCQl2YXIgdG1wTmFtZSAgPSBkbC5uYW1lQW5vbkZ1bmMoYW8uYXJvdW5kRnVuYywgYW8uYXJvdW5kT2JqLCBzZWFyY2hGb3JOYW1lcyk7CisJCQlhby5hcm91bmRGdW5jID0gdG1wTmFtZTsKKwkJfQorCisJCWlmKGRsLmlzRnVuY3Rpb24oYW8uc3JjRnVuYykpeworCQkJYW8uc3JjRnVuYyA9IGRsLmdldE5hbWVJbk9iaihhby5zcmNPYmosIGFvLnNyY0Z1bmMpOworCQl9CisKKwkJaWYoZGwuaXNGdW5jdGlvbihhby5hZHZpY2VGdW5jKSl7CisJCQlhby5hZHZpY2VGdW5jID0gZGwuZ2V0TmFtZUluT2JqKGFvLmFkdmljZU9iaiwgYW8uYWR2aWNlRnVuYyk7CisJCX0KKworCQlpZigoYW8uYXJvdW5kT2JqKSYmKGRsLmlzRnVuY3Rpb24oYW8uYXJvdW5kRnVuYykpKXsKKwkJCWFvLmFyb3VuZEZ1bmMgPSBkbC5nZXROYW1lSW5PYmooYW8uYXJvdW5kT2JqLCBhby5hcm91bmRGdW5jKTsKKwkJfQorCisJCWlmKCFhby5zcmNPYmopeworCQkJZG9qby5yYWlzZSgiYmFkIHNyY09iaiBmb3Igc3JjRnVuYzogIithby5zcmNGdW5jKTsKKwkJfQorCQlpZighYW8uYWR2aWNlT2JqKXsKKwkJCWRvam8ucmFpc2UoImJhZCBhZHZpY2VPYmogZm9yIGFkdmljZUZ1bmM6ICIrYW8uYWR2aWNlRnVuYyk7CisJCX0KKwkJCisJCWlmKCFhby5hZHZpY2VGdW5jKXsKKwkJCWRvam8uZGVidWcoImJhZCBhZHZpY2VGdW5jIGZvciBzcmNGdW5jOiAiK2FvLnNyY0Z1bmMpOworCQkJZG9qby5kZWJ1Z1NoYWxsb3coYW8pOworCQl9IAorCQkKKwkJcmV0dXJuIGFvOworCX0KKworCXRoaXMuY29ubmVjdCA9IGZ1bmN0aW9uKC8qLi4uKi8peworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZG9qby5ldmVudC5jb25uZWN0IGlzIHRoZSBnbHVlIHRoYXQgaG9sZHMgbW9zdCBEb2pvLWJhc2VkCisJCS8vCQlhcHBsaWNhdGlvbnMgdG9nZXRoZXIuIE1vc3QgY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cyBhcmUKKwkJLy8JCXN1cHBvcnRlZCwgd2l0aCB0aGUgY29ubmVjdCgpIG1ldGhvZCBhdHRlbXB0aW5nIHRvIGRpc2FtYmlndWF0ZQorCQkvLwkJdGhlIGltcGxpZWQgdHlwZXMgb2YgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLiBUaGUgZm9sbG93aW5nIHdpbGwKKwkJLy8JCWFsbCB3b3JrOgorCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiZ2xvYmFsRnVuY3Rpb25OYW1lMSIsICJnbG9iYWxGdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KGZ1bmN0aW9uUmVmZXJlbmNlMSwgZnVuY3Rpb25SZWZlcmVuY2UyKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImdsb2JhbEZ1bmN0aW9uTmFtZTEiLCBmdW5jdGlvblJlZmVyZW5jZTIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdChmdW5jdGlvblJlZmVyZW5jZTEsICJnbG9iYWxGdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KHNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAiZ2xvYmFsRnVuY3Rpb25OYW1lMiIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiZ2xvYmFsRnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3Qoc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImFmdGVyIiwgc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIHNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZSIsIHNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCBzY29wZTIsICJmdW5jdGlvbk5hbWUyIik7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQlhcm91bmRGdW5jdGlvblJlZmVyZW5jZSk7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQlzY29wZTMsICJhcm91bmRGdW5jdGlvbk5hbWUiKTsKKwkJLy8JCQlkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZS1hcm91bmQiLCAJc2NvcGUxLCAiZnVuY3Rpb25OYW1lMSIsIAorCQkvLwkJCQkJCQkJCQkJCQlzY29wZTIsICJmdW5jdGlvbk5hbWUyIiwKKwkJLy8JCQkJCQkJCQkJCQkJYXJvdW5kRnVuY3Rpb25SZWZlcmVuY2UpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYWZ0ZXItYXJvdW5kIiwgCQlzY29wZTEsICJmdW5jdGlvbk5hbWUxIiwgCisJCS8vCQkJCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJCQlhcm91bmRGdW5jdGlvblJlZmVyZW5jZSk7CisJCS8vCQkJZG9qby5ldmVudC5jb25uZWN0KCJhZnRlci1hcm91bmQiLCAJCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCQkJc2NvcGUyLCAiZnVuY3Rpb25OYW1lMiIsCisJCS8vCQkJCQkJCQkJCQkJCXNjb3BlMywgImFyb3VuZEZ1bmN0aW9uTmFtZSIpOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYXJvdW5kIiwgCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJc2NvcGUzLCAiYXJvdW5kRnVuY3Rpb25OYW1lIiwgdHJ1ZSwgMzApOworCQkvLwkJCWRvam8uZXZlbnQuY29ubmVjdCgiYXJvdW5kIiwgCXNjb3BlMSwgImZ1bmN0aW9uTmFtZTEiLCAKKwkJLy8JCQkJCQkJCQkJCXNjb3BlMiwgImZ1bmN0aW9uTmFtZTIiLAorCQkvLwkJCQkJCQkJCQkJc2NvcGUzLCAiYXJvdW5kRnVuY3Rpb25OYW1lIiwgbnVsbCwgbnVsbCwgMTApOworCQkvLyBhZHZpY2VUeXBlOiAKKwkJLy8JCU9wdGlvbmFsLiBTdHJpbmcuIE9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImFyb3VuZCIsCisJCS8vCQkiYmVmb3JlLWFyb3VuZCIsIG9yICJhZnRlci1hcm91bmQiLiBGSVhNRQorCQkvLyBzcmNPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIHNyY0Z1bmMuIEFsb25nCisJCS8vCQl3aXRoIHNyY0Z1bmMsIHRoaXMgY3JlYXRlcyBhIHdheSB0byBkZXJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gdG8KKwkJLy8JCWNhbGwuIFNvIGlmIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBpcyAiZm9vLmJhciIsIHRoZQorCQkvLwkJc3JjT2JqL3NyY0Z1bmMgcGFpciB3b3VsZCBiZSBmb28gYW5kICJiYXIiLCB3aGVyZSAiYmFyIiBpcyBhCisJCS8vCQlzdHJpbmcgYW5kIGZvbyBpcyBhbiBvYmplY3QgcmVmZXJlbmNlLgorCQkvLyBzcmNGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNvbm5lY3QgdG8uIFdoZW4gaXQgaXMgZXhlY3V0ZWQsCisJCS8vCQl0aGUgbGlzdGVuZXIgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2FsbCB3aWxsIGJlIGNhbGxlZC4KKwkJLy8JCVRoZSBhZHZpY2VUeXBlIGRlZmluZXMgdGhlIGNhbGwgb3JkZXIgYmV0d2VlbiB0aGUgc291cmNlIGFuZAorCQkvLwkJdGhlIHRhcmdldCBmdW5jdGlvbnMuCisJCS8vIGFkdmljZU9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYWR2aWNlRnVuYy4KKwkJLy8gYWR2aWNlRnVuYzoKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjb25lY3RlZCB0byBzcmNPYmouc3JjRnVuYworCQkvLyBhcm91bmRPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFyb3VuZEZ1bmMuCisJCS8vIGFyb3VuZEZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiwgb3IgYSByZWZlcmVuY2UgdG8sIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZAorCQkvLwkJdG8gbWVkaWF0ZSB0aGUgYWR2aWNlIGNhbGwuIEFyb3VuZCBhZHZpY2UgcmVxdWlyZXMgYSBzcGVjaWFsCisJCS8vCQl1bmFyeSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIGEgIk1ldGhvZEludm9jYXRpb24iIG9iamVjdC4KKwkJLy8JCVRoZXNlIG9iamVjdHMgaGF2ZSBzZXZlcmFsIGltcG9ydGFudCBwcm9wZXJ0aWVzLCBuYW1lbHk6CisJCS8vCQkJLSBhcmdzCisJCS8vCQkJCWEgbXV0YWJsZSBhcnJheSBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlCisJCS8vCQkJCXdyYXBwZWQgZnVuY3Rpb24KKwkJLy8JCQktIHByb2NlZWQKKwkJLy8JCQkJYSBmdW5jdGlvbiB0aGF0ICJjb250aW51ZXMiIHRoZSBpbnZvY2F0aW9uLiBUaGUgcmVzdWx0CisJCS8vCQkJCW9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldHVybiBvZiB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KKwkJLy8JCQkJWW91IGNhbiB0aGVuIG1hbmlwdWxhdGUgdGhpcyByZXR1cm4gYmVmb3JlIHBhc3NpbmcgaXQKKwkJLy8JCQkJYmFjayBvdXQgKG9yIHRha2UgZnVydGhlciBhY3Rpb24gYmFzZWQgb24gaXQpLgorCQkvLyBvbmNlOgorCQkvLwkJYm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBjb25uZWN0KCkgd2lsbAorCQkvLwkJY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gaWYgYW4gaWRlbnRpY2FsIGNvbm5lY3QoKSBoYXMgYWxyZWFkeQorCQkvLwkJYmVlbiBtYWRlLiBEZWZhdWx0cyB0byAiZmFsc2UiLgorCQkvLyBkZWxheToKKwkJLy8JCWFuIG9wdGlvbmFsIGRlbGF5IChpbiBtcyksIGFzIGFuIGludGVnZXIsIGZvciBkaXNwYXRjaCBvZiBhCisJCS8vCQlsaXN0ZW5lciBhZnRlciB0aGUgc291cmNlIGhhcyBiZWVuIGZpcmVkLgorCQkvLyByYXRlOgorCQkvLwkJYW4gb3B0aW9uYWwgcmF0ZSB0aHJvdHRsaW5nIHBhcmFtZXRlciAoaW50ZWdlciwgaW4gbXMpLiBXaGVuCisJCS8vCQlzcGVjaWZpZWQsIHRoaXMgcGFydGljdWxhciBjb25uZWN0aW9uIHdpbGwgbm90IGZpcmUgbW9yZSB0aGFuCisJCS8vCQlvbmNlIGluIHRoZSBpbnRlcnZhbCBzcGVjaWZpZWQgYnkgdGhlIHJhdGUKKwkJLy8gYWR2aWNlTXNnOgorCQkvLwkJYm9vbGVhbi4gU2hvdWxkIHRoZSBsaXN0ZW5lciBoYXZlIGFsbCB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW4KKwkJLy8JCWFzIGEgc2luZ2xlIGFyZ3VtZW50PworCisJCS8qCisJCQkJYW8uYWR2aWNlVHlwZSA9IGFyZ3NbMF07CisJCQkJYW8uc3JjT2JqID0gYXJnc1sxXTsKKwkJCQlhby5zcmNGdW5jID0gYXJnc1syXTsKKwkJCQlhby5hZHZpY2VPYmogPSBhcmdzWzNdCisJCQkJYW8uYWR2aWNlRnVuYyA9IGFyZ3NbNF07CisJCQkJYW8uYXJvdW5kT2JqID0gYXJnc1s1XTsKKwkJCQlhby5hcm91bmRGdW5jID0gYXJnc1s2XTsKKwkJCQlhby5vbmNlID0gYXJnc1s3XTsKKwkJCQlhby5kZWxheSA9IGFyZ3NbOF07CisJCQkJYW8ucmF0ZSA9IGFyZ3NbOV07CisJCQkJYW8uYWR2aWNlTXNnID0gYXJnc1sxMF07CisJCQkJYW8ubWF4Q2FsbHMgPSBhcmdzWzExXTsKKwkJKi8KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsKKwkJCXZhciBhbyA9IGFyZ3VtZW50c1swXTsKKwkJfWVsc2V7CisJCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJfQorCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcoYW8uc3JjRnVuYykgJiYgKGFvLnNyY0Z1bmMudG9Mb3dlckNhc2UoKSA9PSAib25rZXkiKSApeworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJYW8uc3JjRnVuYyA9ICJvbmtleWRvd24iOworCQkJCXRoaXMuY29ubmVjdChhbyk7CisJCQl9CisJCQlhby5zcmNGdW5jID0gIm9ua2V5cHJlc3MiOworCQl9CisKKwkJaWYoZG9qby5sYW5nLmlzQXJyYXkoYW8uc3JjT2JqKSAmJiBhby5zcmNPYmohPSIiKXsKKwkJCXZhciB0bXBBTyA9IHt9OworCQkJZm9yKHZhciB4IGluIGFvKXsKKwkJCQl0bXBBT1t4XSA9IGFvW3hdOworCQkJfQorCQkJdmFyIG1qcHMgPSBbXTsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKGFvLnNyY09iaiwgZnVuY3Rpb24oc3JjKXsKKwkJCQlpZigoZG9qby5yZW5kZXIuaHRtbC5jYXBhYmxlKSYmKGRvam8ubGFuZy5pc1N0cmluZyhzcmMpKSl7CisJCQkJCXNyYyA9IGRvam8uYnlJZChzcmMpOworCQkJCQkvLyBkb2pvLmRlYnVnKHNyYyk7CisJCQkJfQorCQkJCXRtcEFPLnNyY09iaiA9IHNyYzsKKwkJCQkvLyBkb2pvLmRlYnVnKHRtcEFPLnNyY09iaiwgdG1wQU8uc3JjRnVuYyk7CisJCQkJLy8gZG9qby5kZWJ1Zyh0bXBBTy5hZHZpY2VPYmosIHRtcEFPLmFkdmljZUZ1bmMpOworCQkJCW1qcHMucHVzaChkb2pvLmV2ZW50LmNvbm5lY3QuY2FsbChkb2pvLmV2ZW50LCB0bXBBTykpOworCQkJfSk7CisJCQlyZXR1cm4gbWpwczsKKwkJfQorCisJCS8vIEZJWE1FOiBqdXN0IGRvaW5nIGEgImdldEZvck1ldGhvZCgpIiBzZWVtcyB0byBiZSBlbm91Z2ggdG8gcHV0IHRoaXMgaW50byBpbmZpbml0ZSByZWN1cnNpb24hIQorCQl2YXIgbWpwID0gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaiwgYW8uc3JjRnVuYyk7CisJCWlmKGFvLmFkdmljZUZ1bmMpeworCQkJdmFyIG1qcDIgPSBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2QoYW8uYWR2aWNlT2JqLCBhby5hZHZpY2VGdW5jKTsKKwkJfQorCisJCW1qcC5rd0FkZEFkdmljZShhbyk7CisKKwkJLy8gYWR2YW5jZWQgdXNlcnMgbWlnaHQgd2FudCB0byBmc2NrIHcvIHRoZSBqb2luIHBvaW50IG1hbnVhbGx5CisJCXJldHVybiBtanA7IC8vIGEgTWV0aG9kSm9pblBvaW50IG9iamVjdAorCX0KKworCXRoaXMubG9nID0gZnVuY3Rpb24oLypvYmplY3Qgb3IgZnVuY05hbWUqLyBhMSwgLypmdW5jTmFtZSovIGEyKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWEgZnVuY3Rpb24gdGhhdCB3aWxsIHdyYXAgYW5kIGxvZyBhbGwgY2FsbHMgdG8gdGhlIHNwZWNpZmllZAorCQkvLwkJYTEuYTIoKSBmdW5jdGlvbi4gSWYgb25seSBhMSBpcyBwYXNzZWQsIGl0J2xsIGJlIHVzZWQgYXMgYQorCQkvLwkJZnVuY3Rpb24gb3IgZnVuY3Rpb24gbmFtZSBvbiB0aGUgZ2xvYmFsIGNvbnRleHQuIExvZ2dpbmcgd2lsbAorCQkvLwkJYmUgc2VudCB0byBkb2pvLmRlYnVnCisJCS8vIGExOgorCQkvLwkJaWYgYTIgaXMgcGFzc2VkLCB0aGlzIHNob3VsZCBiZSBhbiBvYmplY3QuIElmIG5vdCwgaXQgY2FuIGJlIGEKKwkJLy8JCWZ1bmN0aW9uIG9yIGZ1bmN0aW9uIG5hbWUuCisJCS8vIGEyOgorCQkvLwkJYSBmdW5jdGlvbiBuYW1lCisJCXZhciBrd0FyZ3M7CisJCWlmKChhcmd1bWVudHMubGVuZ3RoID09IDEpJiYodHlwZW9mIGExID09ICJvYmplY3QiKSl7CisJCQlrd0FyZ3MgPSBhMTsKKwkJfWVsc2V7CisJCQlrd0FyZ3MgPSB7CisJCQkJc3JjT2JqOiBhMSwKKwkJCQlzcmNGdW5jOiBhMgorCQkJfTsKKwkJfQorCQlrd0FyZ3MuYWR2aWNlRnVuYyA9IGZ1bmN0aW9uKCl7CisJCQl2YXIgYXJnc1N0ciA9IFtdOworCQkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCQlhcmdzU3RyLnB1c2goYXJndW1lbnRzW3hdKTsKKwkJCX0KKwkJCWRvam8uZGVidWcoIigiK2t3QXJncy5zcmNPYmorIikuIitrd0FyZ3Muc3JjRnVuYywgIjoiLCBhcmdzU3RyLmpvaW4oIiwgIikpOworCQl9OworCQl0aGlzLmt3Q29ubmVjdChrd0FyZ3MpOworCX0KKworCXRoaXMuY29ubmVjdEJlZm9yZSA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCSAJdGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBkb2pvLmV2ZW50LmNvbm5lY3QoKSwgZXhjZXB0IHRoYXQKKwkJLy8JIAl0aGUgYWR2aWNlIHR5cGUgd2lsbCBhbHdheXMgYmUgImJlZm9yZSIKKwkJdmFyIGFyZ3MgPSBbImJlZm9yZSJdOworCQlmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXsgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KKwkJcmV0dXJuIHRoaXMuY29ubmVjdC5hcHBseSh0aGlzLCBhcmdzKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJfQorCisJdGhpcy5jb25uZWN0QXJvdW5kID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JIAl0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpLCBleGNlcHQgdGhhdAorCQkvLwkgCXRoZSBhZHZpY2UgdHlwZSB3aWxsIGFsd2F5cyBiZSAiYXJvdW5kIgorCQl2YXIgYXJncyA9IFsiYXJvdW5kIl07CisJCWZvcih2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspeyBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfQorCQlyZXR1cm4gdGhpcy5jb25uZWN0LmFwcGx5KHRoaXMsIGFyZ3MpOyAvLyBhIE1ldGhvZEpvaW5Qb2ludCBvYmplY3QKKwl9CisKKwl0aGlzLmNvbm5lY3RPbmNlID0gZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JIAl0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpLCBleGNlcHQgdGhhdAorCQkvLwkgCXRoZSAib25jZSIgZmxhZyB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gInRydWUiCisJCXZhciBhbyA9IGludGVycG9sYXRlQXJncyhhcmd1bWVudHMsIHRydWUpOworCQlhby5vbmNlID0gdHJ1ZTsKKwkJcmV0dXJuIHRoaXMuY29ubmVjdChhbyk7IC8vIGEgTWV0aG9kSm9pblBvaW50IG9iamVjdAorCX0KKworCXRoaXMuY29ubmVjdFJ1bk9uY2UgPSBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkgCXRha2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgZG9qby5ldmVudC5jb25uZWN0KCksIGV4Y2VwdCB0aGF0CisJCS8vCSAJdGhlICJtYXhDYWxscyIgZmxhZyB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gMQorCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJYW8ubWF4Q2FsbHMgPSAxOworCQlyZXR1cm4gdGhpcy5jb25uZWN0KGFvKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJfQorCisJdGhpcy5fa3dDb25uZWN0SW1wbCA9IGZ1bmN0aW9uKGt3QXJncywgZGlzY29ubmVjdCl7CisJCXZhciBmbiA9IChkaXNjb25uZWN0KSA/ICJkaXNjb25uZWN0IiA6ICJjb25uZWN0IjsKKwkJaWYodHlwZW9mIGt3QXJnc1sic3JjRnVuYyJdID09ICJmdW5jdGlvbiIpeworCQkJa3dBcmdzLnNyY09iaiA9IGt3QXJnc1sic3JjT2JqIl18fGRqX2dsb2JhbDsKKwkJCXZhciB0bXBOYW1lICA9IGRvam8ubGFuZy5uYW1lQW5vbkZ1bmMoa3dBcmdzLnNyY0Z1bmMsIGt3QXJncy5zcmNPYmosIHRydWUpOworCQkJa3dBcmdzLnNyY0Z1bmMgPSB0bXBOYW1lOworCQl9CisJCWlmKHR5cGVvZiBrd0FyZ3NbImFkdmljZUZ1bmMiXSA9PSAiZnVuY3Rpb24iKXsKKwkJCWt3QXJncy5hZHZpY2VPYmogPSBrd0FyZ3NbImFkdmljZU9iaiJdfHxkal9nbG9iYWw7CisJCQl2YXIgdG1wTmFtZSAgPSBkb2pvLmxhbmcubmFtZUFub25GdW5jKGt3QXJncy5hZHZpY2VGdW5jLCBrd0FyZ3MuYWR2aWNlT2JqLCB0cnVlKTsKKwkJCWt3QXJncy5hZHZpY2VGdW5jID0gdG1wTmFtZTsKKwkJfQorCQlrd0FyZ3Muc3JjT2JqID0ga3dBcmdzWyJzcmNPYmoiXXx8ZGpfZ2xvYmFsOworCQlrd0FyZ3MuYWR2aWNlT2JqID0ga3dBcmdzWyJhZHZpY2VPYmoiXXx8a3dBcmdzWyJ0YXJnZXRPYmoiXXx8ZGpfZ2xvYmFsOworCQlrd0FyZ3MuYWR2aWNlRnVuYyA9IGt3QXJnc1siYWR2aWNlRnVuYyJdfHxrd0FyZ3NbInRhcmdldEZ1bmMiXTsKKwkJLy8gcGFzcyBrd2FyZ3MgdG8gYXZvaWQgdW5yb2xsaW5nL3JlcGFja2luZworCQlyZXR1cm4gZG9qby5ldmVudFtmbl0oa3dBcmdzKTsKKwl9CisKKwl0aGlzLmt3Q29ubmVjdCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki8ga3dBcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUEgdmVyc2lvbiBvZiBkb2pvLmV2ZW50LmNvbm5lY3QoKSB0aGF0IHRha2VzIGEgbWFwIG9mIG5hbWVkCisJCS8vCQlwYXJhbWV0ZXJzIGluc3RlYWQgb2YgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGF0CisJCS8vCQlkb2pvLmV2ZW50LmNvbm5lY3QoKSB1c2VzLiBGb3IgbWFueSBhZHZhbmNlZCBjb25uZWN0aW9uIHR5cGVzLAorCQkvLwkJdGhpcyBjYW4gYmUgYSBtdWNoIG1vcmUgcmVhZGFibGUgKGFuZCBwb3RlbnRpYWxseSBmYXN0ZXIpCisJCS8vCQlhbHRlcm5hdGl2ZS4KKwkJLy8ga3dBcmdzOgorCQkvLyAJCUFuIG9iamVjdCB0aGF0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKwkJLy8JCQktIGFkdmljZVR5cGUKKwkJLy8JCQktIHNyY09iagorCQkvLwkJCS0gc3JjRnVuYworCQkvLwkJCS0gYWR2aWNlT2JqCisJCS8vCQkJLSBhZHZpY2VGdW5jIAorCQkvLwkJCS0gYXJvdW5kT2JqCisJCS8vCQkJLSBhcm91bmRGdW5jCisJCS8vCQkJLSBvbmNlCisJCS8vCQkJLSBkZWxheQorCQkvLwkJCS0gcmF0ZQorCQkvLwkJCS0gYWR2aWNlTXNnCisJCS8vCQlBcyB3aXRoIGNvbm5lY3QsIG9ubHkgc3JjRnVuYyBhbmQgYWR2aWNlRnVuYyBhcmUgZ2VuZXJhbGx5CisJCS8vCQlyZXF1aXJlZAorCisJCXJldHVybiB0aGlzLl9rd0Nvbm5lY3RJbXBsKGt3QXJncywgZmFsc2UpOyAvLyBhIE1ldGhvZEpvaW5Qb2ludCBvYmplY3QKKworCX0KKworCXRoaXMuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlUYWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGRvam8uZXZlbnQuY29ubmVjdCgpIGJ1dCBkZXN0cm95cworCQkvLwkJYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS4gRm9yCisJCS8vCQltdWx0aXBsZSBpZGVudGljYWwgY29ubmVjdGlvbnMsIG11bHRpcGxlIGRpc2Nvbm5lY3QoKSBjYWxscworCQkvLwkJd2lsbCB1bnJvbGwgb25lIGVhY2ggdGltZSBpdCdzIGNhbGxlZC4KKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsKKwkJCXZhciBhbyA9IGFyZ3VtZW50c1swXTsKKwkJfWVsc2V7CisJCQl2YXIgYW8gPSBpbnRlcnBvbGF0ZUFyZ3MoYXJndW1lbnRzLCB0cnVlKTsKKwkJfQorCQlpZighYW8uYWR2aWNlRnVuYyl7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRpc2Nvbm5lY3QKKwkJaWYoZG9qby5sYW5nLmlzU3RyaW5nKGFvLnNyY0Z1bmMpICYmIChhby5zcmNGdW5jLnRvTG93ZXJDYXNlKCkgPT0gIm9ua2V5IikgKXsKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCWFvLnNyY0Z1bmMgPSAib25rZXlkb3duIjsKKwkJCQl0aGlzLmRpc2Nvbm5lY3QoYW8pOworCQkJfQorCQkJYW8uc3JjRnVuYyA9ICJvbmtleXByZXNzIjsKKwkJfQorCQlpZighYW8uc3JjT2JqW2FvLnNyY0Z1bmNdKXsgcmV0dXJuIG51bGw7IH0gLy8gcHJldmVudCB1bi1uZWNlc3NhcmF5IGpvaW5wb2ludCBjcmVhdGlvbgorCQl2YXIgbWpwID0gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kKGFvLnNyY09iaiwgYW8uc3JjRnVuYywgdHJ1ZSk7CisJCW1qcC5yZW1vdmVBZHZpY2UoYW8uYWR2aWNlT2JqLCBhby5hZHZpY2VGdW5jLCBhby5hZHZpY2VUeXBlLCBhby5vbmNlKTsgLy8gYSBNZXRob2RKb2luUG9pbnQgb2JqZWN0CisJCXJldHVybiBtanA7CisJfQorCisJdGhpcy5rd0Rpc2Nvbm5lY3QgPSBmdW5jdGlvbihrd0FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJVGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBkb2pvLmV2ZW50Lmt3Q29ubmVjdCgpIGJ1dAorCQkvLwkJZGVzdHJveXMgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS4KKwkJcmV0dXJuIHRoaXMuX2t3Q29ubmVjdEltcGwoa3dBcmdzLCB0cnVlKTsKKwl9Cit9CisKKy8vIGV4YWN0bHkgb25lIG9mIHRoZXNlIGlzIGNyZWF0ZWQgd2hlbmV2ZXIgYSBtZXRob2Qgd2l0aCBhIGpvaW50IHBvaW50IGlzIHJ1biwKKy8vIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAnYXJvdW5kJyBhZHZpY2UuCitkb2pvLmV2ZW50Lk1ldGhvZEludm9jYXRpb24gPSBmdW5jdGlvbigvKmRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50Ki9qb2luX3BvaW50LCAvKk9iamVjdCovb2JqLCAvKkFycmF5Ki9hcmdzKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlhIGNsYXNzIHRoZSBtb2RlbHMgdGhlIGNhbGwgaW50byBhIGZ1bmN0aW9uLiBUaGlzIGlzIHVzZWQgdW5kZXIgdGhlCisJLy8JCWNvdmVycyBmb3IgYWxsIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBib3RoIGVuZHMgb2YgYQorCS8vCQljb25uZWN0KCktd3JhcHBlZCBmdW5jdGlvbiBkaXNwYXRjaC4gVGhpcyBhbGxvd3MgdXMgdG8gInBpY2tsZSIKKwkvLwkJY2FsbHMsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYXJvdW5kIGFkdmljZS4KKwkvLyBqb2luX3BvaW50OgorCS8vCQlhIGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBjb25uZWN0aW9uCisJLy8gb2JqOgorCS8vCQl0aGUgc2NvcGUgdGhlIGNhbGwgd2lsbCBleGVjdXRlIGluCisJLy8gYXJnczoKKwkvLwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0aGF0IHdpbGwgZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGVlCisJdGhpcy5qcF8gPSBqb2luX3BvaW50OworCXRoaXMub2JqZWN0ID0gb2JqOworCXRoaXMuYXJncyA9IFtdOworCS8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb2NrIGludG8gYSBtdXRhYmxlIG9iamVjdCB3aGljaCBjYW4gY2hhbmdlIHVuZGVyIHVzLgorCS8vIEl0J3Mgb2sgaWYgdGhlIGluZGl2aWR1YWwgaXRlbXMgY2hhbmdlLCB0aG91Z2guCisJZm9yKHZhciB4PTA7IHg8YXJncy5sZW5ndGg7IHgrKyl7CisJCXRoaXMuYXJnc1t4XSA9IGFyZ3NbeF07CisJfQorCS8vIHRoZSBpbmRleCBvZiB0aGUgJ2Fyb3VuZCcgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQuCisJdGhpcy5hcm91bmRfaW5kZXggPSAtMTsKK30KKworZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uLnByb3RvdHlwZS5wcm9jZWVkID0gZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlwcm9jZWVkIHdpdGggdGhlIG1ldGhvZCBjYWxsIHRoYXQncyByZXByZXNlbnRlZCBieSB0aGlzIGludm9jYXRpb24KKwkvLwkJb2JqZWN0CisJdGhpcy5hcm91bmRfaW5kZXgrKzsKKwlpZih0aGlzLmFyb3VuZF9pbmRleCA+PSB0aGlzLmpwXy5hcm91bmQubGVuZ3RoKXsKKwkJcmV0dXJuIHRoaXMuanBfLm9iamVjdFt0aGlzLmpwXy5tZXRob2RuYW1lXS5hcHBseSh0aGlzLmpwXy5vYmplY3QsIHRoaXMuYXJncyk7CisJCS8vIHJldHVybiB0aGlzLmpwXy5ydW5fYmVmb3JlX2FmdGVyKHRoaXMub2JqZWN0LCB0aGlzLmFyZ3MpOworCX1lbHNleworCQl2YXIgdGkgPSB0aGlzLmpwXy5hcm91bmRbdGhpcy5hcm91bmRfaW5kZXhdOworCQl2YXIgbW9iaiA9IHRpWzBdfHxkal9nbG9iYWw7CisJCXZhciBtZXRoID0gdGlbMV07CisJCXJldHVybiBtb2JqW21ldGhdLmNhbGwobW9iaiwgdGhpcyk7CisJfQorfSAKKworCitkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludCA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9vYmosIC8qU3RyaW5nKi9mdW5jTmFtZSl7CisJdGhpcy5vYmplY3QgPSBvYmp8fGRqX2dsb2JhbDsKKwl0aGlzLm1ldGhvZG5hbWUgPSBmdW5jTmFtZTsKKwl0aGlzLm1ldGhvZGZ1bmMgPSB0aGlzLm9iamVjdFtmdW5jTmFtZV07CisJdGhpcy5zcXVlbGNoID0gZmFsc2U7CisJLy8gdGhpcy5iZWZvcmUgPSBbXTsKKwkvLyB0aGlzLmFmdGVyID0gW107CisJLy8gdGhpcy5hcm91bmQgPSBbXTsKK30KKworZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQuZ2V0Rm9yTWV0aG9kID0gZnVuY3Rpb24oLypPYmplY3QqL29iaiwgLypTdHJpbmcqL2Z1bmNOYW1lKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQkic3RhdGljIiBjbGFzcyBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgTWV0aG9kSm9pblBvaW50IGZyb20gYQorCS8vCQlzY29wZWQgZnVuY3Rpb24uIElmIG9uZSBkb2Vzbid0IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4KKwkvLyBvYmo6CisJLy8JCXRoZSBzY29wZSB0byBzZWFyY2ggZm9yIHRoZSBmdW5jdGlvbiBpbgorCS8vIGZ1bmNOYW1lOgorCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGEgTWV0aG9kSm9pblBvaW50IGZvcgorCWlmKCFvYmopeyBvYmogPSBkal9nbG9iYWw7IH0KKwl2YXIgb2ZuID0gb2JqW2Z1bmNOYW1lXTsKKwlpZighb2ZuKXsKKwkJLy8gc3VwcGx5IGEgZG8tbm90aGluZyBtZXRob2QgaW1wbGVtZW50YXRpb24KKwkJb2ZuID0gb2JqW2Z1bmNOYW1lXSA9IGZ1bmN0aW9uKCl7fTsKKwkJaWYoIW9ialtmdW5jTmFtZV0peworCQkJLy8gZS5nLiBjYW5ub3QgYWRkIHRvIGluYnVpbHQgb2JqZWN0cyBpbiBJRTYKKwkJCWRvam8ucmFpc2UoIkNhbm5vdCBzZXQgZG8tbm90aGluZyBtZXRob2Qgb24gdGhhdCBvYmplY3QgIitmdW5jTmFtZSk7CisJCX0KKwl9ZWxzZSBpZigodHlwZW9mIG9mbiAhPSAiZnVuY3Rpb24iKSYmKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihvZm4pKSYmKCFkb2pvLmxhbmcuaXNBbGllbihvZm4pKSl7CisJCS8vIEZJWE1FOiBzaG91bGQgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgaW5zdGVhZD8KKwkJcmV0dXJuIG51bGw7IAorCX0KKwkvLyB3ZSBoaWRlIG91ciBqb2lucG9pbnQgaW5zdGFuY2UgaW4gb2JqW2Z1bmNOYW1lICsgJyRqb2lucG9pbnQnXQorCXZhciBqcG5hbWUgPSBmdW5jTmFtZSArICIkam9pbnBvaW50IjsKKwl2YXIganBmdW5jbmFtZSA9IGZ1bmNOYW1lICsgIiRqb2lucG9pbnQkbWV0aG9kIjsKKwl2YXIgam9pbnBvaW50ID0gb2JqW2pwbmFtZV07CisJaWYoIWpvaW5wb2ludCl7CisJCXZhciBpc05vZGUgPSBmYWxzZTsKKwkJaWYoZG9qby5ldmVudFsiYnJvd3NlciJdKXsKKwkJCWlmKCAob2JqWyJhdHRhY2hFdmVudCJdKXx8CisJCQkJKG9ialsibm9kZVR5cGUiXSl8fAorCQkJCShvYmpbImFkZEV2ZW50TGlzdGVuZXIiXSkgKXsKKwkJCQlpc05vZGUgPSB0cnVlOworCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRDbG9iYmVyTm9kZUF0dHJzKG9iaiwgW2pwbmFtZSwganBmdW5jbmFtZSwgZnVuY05hbWVdKTsKKwkJCX0KKwkJfQorCQl2YXIgb3JpZ0FyaXR5ID0gb2ZuLmxlbmd0aDsKKwkJb2JqW2pwZnVuY25hbWVdID0gb2ZuOworCQkvLyBqb2lucG9pbnQgPSBvYmpbanBuYW1lXSA9IG5ldyBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludChvYmosIGZ1bmNOYW1lKTsKKwkJam9pbnBvaW50ID0gb2JqW2pwbmFtZV0gPSBuZXcgZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQob2JqLCBqcGZ1bmNuYW1lKTsKKworCQlpZighaXNOb2RlKXsKKwkJCW9ialtmdW5jTmFtZV0gPSBmdW5jdGlvbigpeyAKKwkJCQkvLyB2YXIgYXJncyA9IFtdOworCQkJCS8vIGZvcih2YXIgeD0wOyB4PGFyZ3VtZW50cy5sZW5ndGg7IHgrKyl7CisJCQkJCS8vIGFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCQkJCS8vIH0KKwkJCQkvLyByZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3MpOyAKKwkJCQlyZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3VtZW50cyk7IAorCQkJfQorCQl9ZWxzZXsKKwkJCW9ialtmdW5jTmFtZV0gPSBmdW5jdGlvbigpeyAKKwkJCQl2YXIgYXJncyA9IFtdOworCisJCQkJaWYoIWFyZ3VtZW50cy5sZW5ndGgpeworCQkJCQl2YXIgZXZ0ID0gbnVsbDsKKwkJCQkJdHJ5eworCQkJCQkJaWYob2JqLm93bmVyRG9jdW1lbnQpeworCQkJCQkJCWV2dCA9IG9iai5vd25lckRvY3VtZW50LnBhcmVudFdpbmRvdy5ldmVudDsKKwkJCQkJCX1lbHNlIGlmKG9iai5kb2N1bWVudEVsZW1lbnQpeworCQkJCQkJCWV2dCA9IG9iai5kb2N1bWVudEVsZW1lbnQub3duZXJEb2N1bWVudC5wYXJlbnRXaW5kb3cuZXZlbnQ7CisJCQkJCQl9ZWxzZSBpZihvYmouZXZlbnQpeyAvL29iaiBpcyBhIHdpbmRvdworCQkJCQkJCWV2dCA9IG9iai5ldmVudDsKKwkJCQkJCX1lbHNleworCQkJCQkJCWV2dCA9IHdpbmRvdy5ldmVudDsKKwkJCQkJCX0KKwkJCQkJfWNhdGNoKGUpeworCQkJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJCQl9CisKKwkJCQkJaWYoZXZ0KXsKKwkJCQkJCWFyZ3MucHVzaChkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQoZXZ0LCB0aGlzKSk7CisJCQkJCX0KKwkJCQl9ZWxzZXsKKwkJCQkJZm9yKHZhciB4PTA7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCQkJCWlmKCh4PT0wKSYmKGRvam8uZXZlbnQuYnJvd3Nlci5pc0V2ZW50KGFyZ3VtZW50c1t4XSkpKXsKKwkJCQkJCQlhcmdzLnB1c2goZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGFyZ3VtZW50c1t4XSwgdGhpcykpOworCQkJCQkJfWVsc2V7CisJCQkJCQkJYXJncy5wdXNoKGFyZ3VtZW50c1t4XSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmV0dXJuIGpvaW5wb2ludC5ydW4uYXBwbHkoam9pbnBvaW50LCBhcmd1bWVudHMpOyAKKwkJCQlyZXR1cm4gam9pbnBvaW50LnJ1bi5hcHBseShqb2lucG9pbnQsIGFyZ3MpOyAKKwkJCX0KKwkJfQorCQlvYmpbZnVuY05hbWVdLl9fcHJlSm9pbkFyaXR5ID0gb3JpZ0FyaXR5OworCX0KKwlyZXR1cm4gam9pbnBvaW50OyAvLyBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludAorfQorCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LCB7CisJc3F1ZWxjaDogZmFsc2UsCisKKwl1bmludGVyY2VwdDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlkZXN0cm95IHRoZSBjb25uZWN0aW9uIHRvIGFsbCBsaXN0ZW5lcnMgdGhhdCBtYXkgaGF2ZSBiZWVuCisJCS8vCQlyZWdpc3RlcmVkIG9uIHRoaXMgam9pbnBvaW50CisJCXRoaXMub2JqZWN0W3RoaXMubWV0aG9kbmFtZV0gPSB0aGlzLm1ldGhvZGZ1bmM7CisJCXRoaXMuYmVmb3JlID0gW107CisJCXRoaXMuYWZ0ZXIgPSBbXTsKKwkJdGhpcy5hcm91bmQgPSBbXTsKKwl9LAorCisJZGlzY29ubmVjdDogZG9qby5sYW5nLmZvcndhcmQoInVuaW50ZXJjZXB0IiksCisKKwlydW46IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlleGVjdXRlIHRoZSBjb25uZWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgam9pbiBwb2ludC4gVGhlCisJCS8vCQlhcmd1bWVudHMgcGFzc2VkIHRvIHJ1bigpIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhbmQKKwkJLy8JCWl0cyBsaXN0ZW5lcnMuCisJCXZhciBvYmogPSB0aGlzLm9iamVjdHx8ZGpfZ2xvYmFsOworCQl2YXIgYXJncyA9IGFyZ3VtZW50czsKKworCQkvLyBvcHRpbWl6YXRpb24uIFdlIG9ubHkgY29tcHV0ZSBvbmNlIHRoZSBhcnJheSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudHMKKwkJLy8gcHNldWRvLWFyciBpbiBvcmRlciB0byBwcmV2ZW50IGJ1aWxkaW5nIGl0IGVhY2ggdGltZSBhZHZpY2UgaXMgdW5yb2xsZWQuCisJCXZhciBhYXJncyA9IFtdOworCQlmb3IodmFyIHg9MDsgeDxhcmdzLmxlbmd0aDsgeCsrKXsKKwkJCWFhcmdzW3hdID0gYXJnc1t4XTsKKwkJfQorCisJCXZhciB1bnJvbGxBZHZpY2UgID0gZnVuY3Rpb24obWFycil7IAorCQkJaWYoIW1hcnIpeworCQkJCWRvam8uZGVidWcoIk51bGwgYXJndW1lbnQgdG8gdW5yb2xsQWR2aWNlKCkiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCSAgCisJCQl2YXIgY2FsbE9iaiA9IG1hcnJbMF18fGRqX2dsb2JhbDsKKwkJCXZhciBjYWxsRnVuYyA9IG1hcnJbMV07CisJCQkKKwkJCWlmKCFjYWxsT2JqW2NhbGxGdW5jXSl7CisJCQkJZG9qby5yYWlzZSgiZnVuY3Rpb24gXCIiICsgY2FsbEZ1bmMgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb24gXCIiICsgY2FsbE9iaiArICJcIiIpOworCQkJfQorCQkJCisJCQl2YXIgYXJvdW5kT2JqID0gbWFyclsyXXx8ZGpfZ2xvYmFsOworCQkJdmFyIGFyb3VuZEZ1bmMgPSBtYXJyWzNdOworCQkJdmFyIG1zZyA9IG1hcnJbNl07CisJCQl2YXIgbWF4Q291bnQgPSBtYXJyWzddOworCQkJaWYobWF4Q291bnQgPiAtMSl7CisJCQkJaWYobWF4Q291bnQgPT0gMCl7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJbWFycls3XS0tOworCQkJfQorCQkJdmFyIHVuZGVmOworCisJCQl2YXIgdG8gPSB7CisJCQkJYXJnczogW10sCisJCQkJanBfOiB0aGlzLAorCQkJCW9iamVjdDogb2JqLAorCQkJCXByb2NlZWQ6IGZ1bmN0aW9uKCl7CisJCQkJCXJldHVybiBjYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCB0by5hcmdzKTsKKwkJCQl9CisJCQl9OworCQkJdG8uYXJncyA9IGFhcmdzOworCisJCQl2YXIgZGVsYXkgPSBwYXJzZUludChtYXJyWzRdKTsKKwkJCXZhciBoYXNEZWxheSA9ICgoIWlzTmFOKGRlbGF5KSkmJihtYXJyWzRdIT09bnVsbCkmJih0eXBlb2YgbWFycls0XSAhPSAidW5kZWZpbmVkIikpOworCQkJaWYobWFycls1XSl7CisJCQkJdmFyIHJhdGUgPSBwYXJzZUludChtYXJyWzVdKTsKKwkJCQl2YXIgY3VyID0gbmV3IERhdGUoKTsKKwkJCQl2YXIgdGltZXJTZXQgPSBmYWxzZTsKKwkJCQlpZigobWFyclsibGFzdCJdKSYmKChjdXItbWFyci5sYXN0KTw9cmF0ZSkpeworCQkJCQlpZihkb2pvLmV2ZW50Ll9jYW5UaW1lb3V0KXsKKwkJCQkJCWlmKG1hcnJbImRlbGF5VGltZXIiXSl7CisJCQkJCQkJY2xlYXJUaW1lb3V0KG1hcnIuZGVsYXlUaW1lcik7CisJCQkJCQl9CisJCQkJCQl2YXIgdG9kID0gcGFyc2VJbnQocmF0ZSoyKTsgLy8gaXMgcmF0ZSoyIG5haXZlPworCQkJCQkJdmFyIG1jcHkgPSBkb2pvLmxhbmcuc2hhbGxvd0NvcHkobWFycik7CisJCQkJCQltYXJyLmRlbGF5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisJCQkJCQkJLy8gRklYTUU6IG9uIElFIGF0IGxlYXN0LCBldmVudCBvYmplY3RzIGZyb20gdGhlCisJCQkJCQkJLy8gYnJvd3NlciBjYW4gZ28gb3V0IG9mIHNjb3BlLiBIb3cgKG9yIHNob3VsZD8pIHdlCisJCQkJCQkJLy8gZGVhbCB3aXRoIGl0PworCQkJCQkJCW1jcHlbNV0gPSAwOworCQkJCQkJCXVucm9sbEFkdmljZShtY3B5KTsKKwkJCQkJCX0sIHRvZCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX1lbHNleworCQkJCQltYXJyLmxhc3QgPSBjdXI7CisJCQkJfQorCQkJfQorCisJCQkvLyBGSVhNRTogbmVlZCB0byBlbmZvcmNlIHJhdGVzIGZvciBhIGNvbm5lY3Rpb24gaGVyZSEKKworCQkJaWYoYXJvdW5kRnVuYyl7CisJCQkJLy8gTk9URTogYXJvdW5kIGFkdmljZSBjYW4ndCBkZWxheSBzaW5jZSB3ZSBtaWdodCBvdGhlcndpc2UgZGVwZW5kCisJCQkJLy8gb24gZXhlY3V0aW9uIG9yZGVyIQorCQkJCWFyb3VuZE9ialthcm91bmRGdW5jXS5jYWxsKGFyb3VuZE9iaiwgdG8pOworCQkJfWVsc2V7CisJCQkJLy8gdmFyIHRtanAgPSBkb2pvLmV2ZW50Lk1ldGhvZEpvaW5Qb2ludC5nZXRGb3JNZXRob2Qob2JqLCBtZXRobmFtZSk7CisJCQkJaWYoKGhhc0RlbGF5KSYmKChkb2pvLnJlbmRlci5odG1sKXx8KGRvam8ucmVuZGVyLnN2ZykpKXsgIC8vIEZJWE1FOiB0aGUgcmVuZGVyIGNoZWNrcyBhcmUgZ3JvdHR5IQorCQkJCQlkal9nbG9iYWxbInNldFRpbWVvdXQiXShmdW5jdGlvbigpeworCQkJCQkJaWYobXNnKXsKKwkJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5jYWxsKGNhbGxPYmosIHRvKTsgCisJCQkJCQl9ZWxzZXsKKwkJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsgCisJCQkJCQl9CisJCQkJCX0sIGRlbGF5KTsKKwkJCQl9ZWxzZXsgLy8gbWFueSBlbnZpcm9ubWVudHMgY2FuJ3Qgc3VwcG9ydCBkZWxheSEKKwkJCQkJaWYobXNnKXsKKwkJCQkJCWNhbGxPYmpbY2FsbEZ1bmNdLmNhbGwoY2FsbE9iaiwgdG8pOyAKKwkJCQkJfWVsc2V7CisJCQkJCQljYWxsT2JqW2NhbGxGdW5jXS5hcHBseShjYWxsT2JqLCBhcmdzKTsgCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisKKwkJdmFyIHVuUm9sbFNxdWVsY2ggPSBmdW5jdGlvbigpeworCQkJaWYodGhpcy5zcXVlbGNoKXsKKwkJCQl0cnl7CisJCQkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCQl9Y2F0Y2goZSl7IAorCQkJCQlkb2pvLmRlYnVnKGUpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXJldHVybiB1bnJvbGxBZHZpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0KKwkJfTsKKworCQlpZigodGhpc1siYmVmb3JlIl0pJiYodGhpcy5iZWZvcmUubGVuZ3RoPjApKXsKKwkJCS8vIHBhc3MgYSBjbG9uZWQgYXJyYXksIGlmIHRoaXMgZXZlbnQgZGlzY29ubmVjdHMgdGhpcyBldmVudCBmb3JFYWNoIG9uIHRoaXMuYmVmb3JlIHdvbnQgd29yaworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5iZWZvcmUuY29uY2F0KG5ldyBBcnJheSgpKSwgdW5Sb2xsU3F1ZWxjaCk7CisJCX0KKworCQl2YXIgcmVzdWx0OworCQl0cnl7CisJCQlpZigodGhpc1siYXJvdW5kIl0pJiYodGhpcy5hcm91bmQubGVuZ3RoPjApKXsKKwkJCQl2YXIgbWkgPSBuZXcgZG9qby5ldmVudC5NZXRob2RJbnZvY2F0aW9uKHRoaXMsIG9iaiwgYXJncyk7CisJCQkJcmVzdWx0ID0gbWkucHJvY2VlZCgpOworCQkJfWVsc2UgaWYodGhpcy5tZXRob2RmdW5jKXsKKwkJCQlyZXN1bHQgPSB0aGlzLm9iamVjdFt0aGlzLm1ldGhvZG5hbWVdLmFwcGx5KHRoaXMub2JqZWN0LCBhcmdzKTsKKwkJCX0KKwkJfWNhdGNoKGUpeyAKKwkJCWlmKCF0aGlzLnNxdWVsY2gpeyAKKwkJCQlkb2pvLmRlYnVnKGUsIndoZW4gY2FsbGluZyIsdGhpcy5tZXRob2RuYW1lLCJvbiIsdGhpcy5vYmplY3QsIndpdGggYXJndW1lbnRzIixhcmdzKTsKKwkJCQlkb2pvLnJhaXNlKGUpOworCQkJfSAKKwkJfQorCisJCWlmKCh0aGlzWyJhZnRlciJdKSYmKHRoaXMuYWZ0ZXIubGVuZ3RoPjApKXsKKwkJCS8vIHNlZSBjb21tZW50IG9uIHRoaXMuYmVmb3JlIGFib3ZlCisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmFmdGVyLmNvbmNhdChuZXcgQXJyYXkoKSksIHVuUm9sbFNxdWVsY2gpOworCQl9CisKKwkJcmV0dXJuICh0aGlzLm1ldGhvZGZ1bmMpID8gcmVzdWx0IDogbnVsbDsKKwl9LAorCisJZ2V0QXJyOiBmdW5jdGlvbigvKlN0cmluZyova2luZCl7CisJCS8vIHN1bW1hcnk6IHJldHVybiBhIGxpc3Qgb2YgbGlzdGVuZXJzIG9mIHRoZSBwYXN0ICJraW5kIgorCQkvLyBraW5kOgorCQkvLwkJY2FuIGJlIG9uZSBvZjogImJlZm9yZSIsICJhZnRlciIsICJhcm91bmQiLCAiYmVmb3JlLWFyb3VuZCIsIG9yCisJCS8vCQkiYWZ0ZXItYXJvdW5kIgorCQl2YXIgdHlwZSA9ICJhZnRlciI7CisJCS8vIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkbyB0aGlzIHRocm91Z2ggcHJvcHMgb3IgQXJyYXkuaW4oKQorCQlpZigodHlwZW9mIGtpbmQgPT0gInN0cmluZyIpJiYoa2luZC5pbmRleE9mKCJiZWZvcmUiKSE9LTEpKXsKKwkJCXR5cGUgPSAiYmVmb3JlIjsKKwkJfWVsc2UgaWYoa2luZD09ImFyb3VuZCIpeworCQkJdHlwZSA9ICJhcm91bmQiOworCQl9CisJCWlmKCF0aGlzW3R5cGVdKXsgdGhpc1t0eXBlXSA9IFtdOyB9CisJCXJldHVybiB0aGlzW3R5cGVdOyAvLyBBcnJheQorCX0sCisKKwlrd0FkZEFkdmljZTogZnVuY3Rpb24oLypPYmplY3QqL2FyZ3MpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJYWRkcyBhZHZpY2UgdG8gdGhlIGpvaW5wb2ludCB3aXRoIGFyZ3VtZW50cyBpbiBhIG1hcAorCQkvLyBhcmdzOgorCQkvLyAJCUFuIG9iamVjdCB0aGF0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKwkJLy8JCQktIGFkdmljZVR5cGUKKwkJLy8JCQktIGFkdmljZU9iagorCQkvLwkJCS0gYWR2aWNlRnVuYyAKKwkJLy8JCQktIGFyb3VuZE9iagorCQkvLwkJCS0gYXJvdW5kRnVuYworCQkvLwkJCS0gb25jZQorCQkvLwkJCS0gZGVsYXkKKwkJLy8JCQktIHJhdGUKKwkJLy8JCQktIGFkdmljZU1zZworCQkvLwkJCS0gbWF4Q2FsbHMKKwkJdGhpcy5hZGRBZHZpY2UoCWFyZ3NbImFkdmljZU9iaiJdLCBhcmdzWyJhZHZpY2VGdW5jIl0sIAorCQkJCQkJYXJnc1siYXJvdW5kT2JqIl0sIGFyZ3NbImFyb3VuZEZ1bmMiXSwgCisJCQkJCQlhcmdzWyJhZHZpY2VUeXBlIl0sIGFyZ3NbInByZWNlZGVuY2UiXSwgCisJCQkJCQlhcmdzWyJvbmNlIl0sIGFyZ3NbImRlbGF5Il0sIGFyZ3NbInJhdGUiXSwgCisJCQkJCQlhcmdzWyJhZHZpY2VNc2ciXSwgYXJnc1sibWF4Q2FsbHMiXSk7CisJfSwKKworCWFkZEFkdmljZTogZnVuY3Rpb24oCXRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIAorCQkJCQkJCXRoaXNBcm91bmRPYmosIHRoaXNBcm91bmQsIAorCQkJCQkJCWFkdmljZVR5cGUsIHByZWNlZGVuY2UsIAorCQkJCQkJCW9uY2UsIGRlbGF5LCByYXRlLCBhc01lc3NhZ2UsCisJCQkJCQkJbWF4Q2FsbHMpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJYWRkIGFkdmljZSB0byB0aGlzIGpvaW5wb2ludCB1c2luZyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKKwkJLy8gdGhpc0FkdmljZU9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYWR2aWNlRnVuYy4KKwkJLy8gdGhpc0FkdmljZUZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY29uZWN0ZWQKKwkJLy8gdGhpc0Fyb3VuZE9iajoKKwkJLy8JCXRoZSBzY29wZSBpbiB3aGljaCB0byBsb2NhdGUvZXhlY3V0ZSB0aGUgbmFtZWQgYXJvdW5kRnVuYy4KKwkJLy8gdGhpc0Fyb3VuZEZ1bmM6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbWVkaWF0ZSB0aGUKKwkJLy8JCWFkdmljZSBjYWxsLgorCQkvLyBhZHZpY2VUeXBlOiAKKwkJLy8JCU9wdGlvbmFsLiBTdHJpbmcuIE9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImFyb3VuZCIsCisJCS8vCQkiYmVmb3JlLWFyb3VuZCIsIG9yICJhZnRlci1hcm91bmQiLiBGSVhNRQorCQkvLyBvbmNlOgorCQkvLwkJYm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBhZHZpY2Ugd2lsbCBjcmVhdGUKKwkJLy8JCWEgbmV3IGNvbm5lY3Rpb24gaWYgYW4gaWRlbnRpY2FsIGFkdmljZSBzZXQgaGFzIGFscmVhZHkgYmVlbgorCQkvLwkJcHJvdmlkZWQuIERlZmF1bHRzIHRvICJmYWxzZSIuCisJCS8vIGRlbGF5OgorCQkvLwkJYW4gb3B0aW9uYWwgZGVsYXkgKGluIG1zKSwgYXMgYW4gaW50ZWdlciwgZm9yIGRpc3BhdGNoIG9mIGEKKwkJLy8JCWxpc3RlbmVyIGFmdGVyIHRoZSBzb3VyY2UgaGFzIGJlZW4gZmlyZWQuCisJCS8vIHJhdGU6CisJCS8vCQlhbiBvcHRpb25hbCByYXRlIHRocm90dGxpbmcgcGFyYW1ldGVyIChpbnRlZ2VyLCBpbiBtcykuIFdoZW4KKwkJLy8JCXNwZWNpZmllZCwgdGhpcyBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24gd2lsbCBub3QgZmlyZSBtb3JlIHRoYW4KKwkJLy8JCW9uY2UgaW4gdGhlIGludGVydmFsIHNwZWNpZmllZCBieSB0aGUgcmF0ZQorCQkvLyBhZHZpY2VNc2c6CisJCS8vCQlib29sZWFuLiBTaG91bGQgdGhlIGxpc3RlbmVyIGhhdmUgYWxsIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbgorCQkvLwkJYXMgYSBzaW5nbGUgYXJndW1lbnQ/CisJCS8vIG1heENhbGxzOgorCQkvLwkJSW50ZWdlci4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoaXMgY29ubmVjdGlvbiBjYW4gYmUKKwkJLy8JCXVzZWQgYmVmb3JlIGJlaW5nIGF1dG8tZGlzY29ubmVjdGVkLiAtMSBzaWduYWxzIHRoYXQgdGhlCisJCS8vCQljb25uZWN0aW9uIHNob3VsZCBuZXZlciBiZSBkaXNjb25uZWN0ZWQuCisJCXZhciBhcnIgPSB0aGlzLmdldEFycihhZHZpY2VUeXBlKTsKKwkJaWYoIWFycil7CisJCQlkb2pvLnJhaXNlKCJiYWQgdGhpczogIiArIHRoaXMpOworCQl9CisKKwkJdmFyIGFvID0gW3RoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIHRoaXNBcm91bmRPYmosIHRoaXNBcm91bmQsIGRlbGF5LCByYXRlLCBhc01lc3NhZ2UsIG1heENhbGxzXTsKKwkJCisJCWlmKG9uY2UpeworCQkJaWYodGhpcy5oYXNBZHZpY2UodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgYXJyKSA+PSAwKXsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZihwcmVjZWRlbmNlID09ICJmaXJzdCIpeworCQkJYXJyLnVuc2hpZnQoYW8pOworCQl9ZWxzZXsKKwkJCWFyci5wdXNoKGFvKTsKKwkJfQorCX0sCisKKwloYXNBZHZpY2U6IGZ1bmN0aW9uKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycil7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgZmlyc3QgZXhpc3RpbmcgY29ubmVjdGlvbgorCQkvLwkJYmV0d2VlbmVkIHRoZSBwYXNzZWQgYWR2aWNlIGFuZCB0aGlzIGpvaW5wb2ludC4gV2lsbCBiZSAtMSBpZgorCQkvLwkJbm9uZSBleGlzdHMuCisJCS8vIHRoaXNBZHZpY2VPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFkdmljZUZ1bmMuCisJCS8vIHRoaXNBZHZpY2VGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNvbmVjdGVkCisJCS8vIGFkdmljZVR5cGU6IAorCQkvLwkJT3B0aW9uYWwuIFN0cmluZy4gT25lIG9mICJiZWZvcmUiLCAiYWZ0ZXIiLCAiYXJvdW5kIiwKKwkJLy8JCSJiZWZvcmUtYXJvdW5kIiwgb3IgImFmdGVyLWFyb3VuZCIuIEZJWE1FCisJCS8vIGFycjoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgbGlzdCBvZiBhZHZpY2VzIHRvIHNlYXJjaC4gV2lsbCBiZSBmb3VuZCB2aWEKKwkJLy8JCWFkdmljZVR5cGUgaWYgbm90IHBhc3NlZAorCQlpZighYXJyKXsgYXJyID0gdGhpcy5nZXRBcnIoYWR2aWNlVHlwZSk7IH0KKwkJdmFyIGluZCA9IC0xOworCQlmb3IodmFyIHg9MDsgeDxhcnIubGVuZ3RoOyB4KyspeworCQkJdmFyIGFhbyA9ICh0eXBlb2YgdGhpc0FkdmljZSA9PSAib2JqZWN0IikgPyAobmV3IFN0cmluZyh0aGlzQWR2aWNlKSkudG9TdHJpbmcoKSA6IHRoaXNBZHZpY2U7CisJCQl2YXIgYTFvID0gKHR5cGVvZiBhcnJbeF1bMV0gPT0gIm9iamVjdCIpID8gKG5ldyBTdHJpbmcoYXJyW3hdWzFdKSkudG9TdHJpbmcoKSA6IGFyclt4XVsxXTsKKwkJCWlmKChhcnJbeF1bMF0gPT0gdGhpc0FkdmljZU9iaikmJihhMW8gPT0gYWFvKSl7CisJCQkJaW5kID0geDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5kOyAvLyBJbnRlZ2VyCisJfSwKKworCXJlbW92ZUFkdmljZTogZnVuY3Rpb24odGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgb25jZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgZmlyc3QgZXhpc3RpbmcgY29ubmVjdGlvbgorCQkvLwkJYmV0d2VlbmVkIHRoZSBwYXNzZWQgYWR2aWNlIGFuZCB0aGlzIGpvaW5wb2ludC4gV2lsbCBiZSAtMSBpZgorCQkvLwkJbm9uZSBleGlzdHMuCisJCS8vIHRoaXNBZHZpY2VPYmo6CisJCS8vCQl0aGUgc2NvcGUgaW4gd2hpY2ggdG8gbG9jYXRlL2V4ZWN1dGUgdGhlIG5hbWVkIGFkdmljZUZ1bmMuCisJCS8vIHRoaXNBZHZpY2VGdW5jOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGNvbmVjdGVkCisJCS8vIGFkdmljZVR5cGU6IAorCQkvLwkJT3B0aW9uYWwuIFN0cmluZy4gT25lIG9mICJiZWZvcmUiLCAiYWZ0ZXIiLCAiYXJvdW5kIiwKKwkJLy8JCSJiZWZvcmUtYXJvdW5kIiwgb3IgImFmdGVyLWFyb3VuZCIuIEZJWE1FCisJCS8vIG9uY2U6CisJCS8vCQlPcHRpb25hbC4gU2hvdWxkIHRoaXMgb25seSByZW1vdmUgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiB0aGUKKwkJLy8JCWNvbm5lY3Rpb24/CisJCXZhciBhcnIgPSB0aGlzLmdldEFycihhZHZpY2VUeXBlKTsKKwkJdmFyIGluZCA9IHRoaXMuaGFzQWR2aWNlKHRoaXNBZHZpY2VPYmosIHRoaXNBZHZpY2UsIGFkdmljZVR5cGUsIGFycik7CisJCWlmKGluZCA9PSAtMSl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJd2hpbGUoaW5kICE9IC0xKXsKKwkJCWFyci5zcGxpY2UoaW5kLCAxKTsKKwkJCWlmKG9uY2UpeyBicmVhazsgfQorCQkJaW5kID0gdGhpcy5oYXNBZHZpY2UodGhpc0FkdmljZU9iaiwgdGhpc0FkdmljZSwgYWR2aWNlVHlwZSwgYXJyKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9KTsKKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQudG9waWMiKTsKKworZG9qby5ldmVudC50b3BpYyA9IG5ldyBmdW5jdGlvbigpeworCXRoaXMudG9waWNzID0ge307CisKKwl0aGlzLmdldFRvcGljID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJldHVybnMgYSB0b3BpYyBpbXBsZW1lbnRhdGlvbiBvYmplY3Qgb2YgdHlwZQorCQkvLwkJZG9qby5ldmVudC50b3BpYy5Ub3BpY0ltcGwKKwkJLy8gdG9waWM6CisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQlpZighdGhpcy50b3BpY3NbdG9waWNdKXsKKwkJCXRoaXMudG9waWNzW3RvcGljXSA9IG5ldyB0aGlzLlRvcGljSW1wbCh0b3BpYyk7CisJCX0KKwkJcmV0dXJuIHRoaXMudG9waWNzW3RvcGljXTsgLy8gYSBkb2pvLmV2ZW50LnRvcGljLlRvcGljSW1wbCBvYmplY3QKKwl9CisKKwl0aGlzLnJlZ2lzdGVyUHVibGlzaGVyID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVnaXN0ZXJzIGEgZnVuY3Rpb24gYXMgYSBwdWJsaXNoZXIgb24gYSB0b3BpYy4gU3Vic2VxdWVudAorCQkvLwkJY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgYSBwdWJsaXNoIGV2ZW50IG9uIHRoZSB0b3BpYworCQkvLwkJd2l0aCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIHJlZ2lzdGVyZWQKKwkJLy8JCWxpc3RlbmVycy4KKwkJLy8gdG9waWM6IAorCQkvLwkJYSB1bmlxdWUsIG9wYXF1ZSBzdHJpbmcgdGhhdCBuYW1lcyB0aGUgdG9waWMKKwkJLy8gb2JqOgorCQkvLwkJdGhlIHNjb3BlIHRvIGxvY2F0ZSB0aGUgZnVuY3Rpb24gaW4KKwkJLy8gZnVuY05hbWU6CisJCS8vCQl0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnJlZ2lzdGVyUHVibGlzaGVyKG9iaiwgZnVuY05hbWUpOworCX0KKworCXRoaXMuc3Vic2NyaWJlID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3VzYnNjcmliZXMgdGhlIGZ1bmN0aW9uIHRvIHRoZSB0b3BpYy4gU3Vic2VxdWVudCBldmVudHMKKwkJLy8JCWRpc3BhY2hlZCB0byB0aGUgdG9waWMgd2lsbCBjcmVhdGUgYSBmdW5jdGlvbiBjYWxsIGZvciB0aGUKKwkJLy8JCW9iai5mdW5jTmFtZSgpIGZ1bmN0aW9uLgorCQkvLyB0b3BpYzogCisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQkvLyBvYmo6CisJCS8vCQl0aGUgc2NvcGUgdG8gbG9jYXRlIHRoZSBmdW5jdGlvbiBpbgorCQkvLyBmdW5jTmFtZToKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZWluZyByZWdpc3RlcmVkIGFzIGEgbGlzdGVuZXIKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnN1YnNjcmliZShvYmosIGZ1bmNOYW1lKTsKKwl9CisKKwl0aGlzLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljLCAvKk9iamVjdCovb2JqLCAvKlN0cmluZyovZnVuY05hbWUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJdW5zdWJzY3JpYmVzIHRoZSBvYmouZnVuY05hbWUoKSBmcm9tIHRoZSB0b3BpYworCQkvLyB0b3BpYzogCisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQkvLyBvYmo6CisJCS8vCQl0aGUgc2NvcGUgdG8gbG9jYXRlIHRoZSBmdW5jdGlvbiBpbgorCQkvLyBmdW5jTmFtZToKKwkJLy8JCXRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZWluZyB1bnJlZ2lzdGVyZWQgYXMgYSBsaXN0ZW5lcgorCQl2YXIgdG9waWMgPSB0aGlzLmdldFRvcGljKHRvcGljKTsKKwkJdG9waWMudW5zdWJzY3JpYmUob2JqLCBmdW5jTmFtZSk7CisJfQorCisJdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oLypTdHJpbmcqL3RvcGljKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlkZXN0cm95cyB0aGUgdG9waWMgYW5kIHVucmVnaXN0ZXJzIGFsbCBsaXN0ZW5lcnMKKwkJLy8gdG9waWM6CisJCS8vCQlhIHVuaXF1ZSwgb3BhcXVlIHN0cmluZyB0aGF0IG5hbWVzIHRoZSB0b3BpYworCQl0aGlzLmdldFRvcGljKHRvcGljKS5kZXN0cm95KCk7CisJCWRlbGV0ZSB0aGlzLnRvcGljc1t0b3BpY107CisJfQorCisJdGhpcy5wdWJsaXNoQXBwbHkgPSBmdW5jdGlvbigvKlN0cmluZyovdG9waWMsIC8qQXJyYXkqL2FyZ3MpeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCWRpc3BhdGNoZXMgYW4gZXZlbnQgdG8gdGhlIHRvcGljIHVzaW5nIHRoZSBhcmdzIGFycmF5IGFzIHRoZQorCQkvLwkJc291cmNlIGZvciB0aGUgY2FsbCBhcmd1bWVudHMgdG8gZWFjaCBsaXN0ZW5lci4gVGhpcyBpcyBzaW1pbGFyCisJCS8vCQl0byBKYXZhU2NyaXB0J3MgYnVpbHQtaW4gRnVuY3Rpb24uYXBwbHkoKQorCQkvLyB0b3BpYzoKKwkJLy8JCWEgdW5pcXVlLCBvcGFxdWUgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHRvcGljCisJCS8vIGFyZ3M6CisJCS8vCQl0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIGxpc3RlbmVycyBvZiB0aGUgdG9waWMKKwkJdmFyIHRvcGljID0gdGhpcy5nZXRUb3BpYyh0b3BpYyk7CisJCXRvcGljLnNlbmRNZXNzYWdlLmFwcGx5KHRvcGljLCBhcmdzKTsKKwl9CisKKwl0aGlzLnB1Ymxpc2ggPSBmdW5jdGlvbigvKlN0cmluZyovdG9waWMsIC8qT2JqZWN0Ki9tZXNzYWdlKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQltYW51YWxseSAicHVibGlzaCIgdG8gdGhlIHBhc3NlZCB0b3BpYworCQkvLyB0b3BpYzoKKwkJLy8JCWEgdW5pcXVlLCBvcGFxdWUgc3RyaW5nIHRoYXQgbmFtZXMgdGhlIHRvcGljCisJCS8vIG1lc3NhZ2U6CisJCS8vCQljYW4gYmUgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyAoc2ltaWxhciB0byBwdWJsaXNoQXBwbHkpLCBvcgorCQkvLwkJd2lsbCBiZSB0cmVhdGVkIGFzIG9uZSBvZiBtYW55IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgYWxvbmcgaW4KKwkJLy8JCWEgImZsYXQiIHVucm9sbGluZworCQl2YXIgdG9waWMgPSB0aGlzLmdldFRvcGljKHRvcGljKTsKKwkJLy8gaWYgbWVzc2FnZSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgYXJndW1lbnRzLAorCQkvLyBvdGhlcndpc2UsIHdlIGp1c3QgcGFzcyBvbiB0aGUgYXJndW1lbnRzIHBhc3NlZCBpbiBhcy1pcworCQl2YXIgYXJncyA9IFtdOworCQkvLyBjb3VsZCB3ZSB1c2UgY29uY2F0IGluc3RlYWQgaGVyZT8KKwkJZm9yKHZhciB4PTE7IHg8YXJndW1lbnRzLmxlbmd0aDsgeCsrKXsKKwkJCWFyZ3MucHVzaChhcmd1bWVudHNbeF0pOworCQl9CisJCXRvcGljLnNlbmRNZXNzYWdlLmFwcGx5KHRvcGljLCBhcmdzKTsKKwl9Cit9CisKK2Rvam8uZXZlbnQudG9waWMuVG9waWNJbXBsID0gZnVuY3Rpb24odG9waWNOYW1lKXsKKwkvLyBzdW1tYXJ5OiBhIGNsYXNzIHRvIHJlcHJlc2VudCB0b3BpY3MKKworCXRoaXMudG9waWNOYW1lID0gdG9waWNOYW1lOworCisJdGhpcy5zdWJzY3JpYmUgPSBmdW5jdGlvbigvKk9iamVjdCovbGlzdGVuZXJPYmplY3QsIC8qRnVuY3Rpb24gb3IgU3RyaW5nKi9saXN0ZW5lck1ldGhvZCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQl1c2UgZG9qby5ldmVudC5jb25uZWN0KCkgdG8gYXR0YWNoIHRoZSBwYXNzZWQgbGlzdGVuZXIgdG8gdGhlCisJCS8vCQl0b3BpYyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdAorCQkvLyBsaXN0ZW5lck9iamVjdDoKKwkJLy8JCWlmIGEgc3RyaW5nIGFuZCBsaXN0ZW5lck1ldGhvZCBpcyBvbW1pdHRlZCwgdGhpcyBpcyB0cmVhdGVkIGFzCisJCS8vCQl0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJZgorCQkvLwkJbGlzdGVuZXJNZXRob2QgaXMgcHJvdmlkZWQsIHRoaXMgaXMgdGhlIHNjb3BlIHRvIGZpbmQvZXhlY3V0ZQorCQkvLwkJdGhlIGZ1bmN0aW9uIGluLgorCQkvLyBsaXN0ZW5lck1ldGhvZDoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIuCisJCXZhciB0ZiA9IGxpc3RlbmVyTWV0aG9kfHxsaXN0ZW5lck9iamVjdDsKKwkJdmFyIHRvID0gKCFsaXN0ZW5lck1ldGhvZCkgPyBkal9nbG9iYWwgOiBsaXN0ZW5lck9iamVjdDsKKwkJcmV0dXJuIGRvam8uZXZlbnQua3dDb25uZWN0KHsgLy8gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQKKwkJCXNyY09iajoJCXRoaXMsIAorCQkJc3JjRnVuYzoJInNlbmRNZXNzYWdlIiwgCisJCQlhZHZpY2VPYmo6CXRvLAorCQkJYWR2aWNlRnVuYzogdGYKKwkJfSk7CisJfQorCisJdGhpcy51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9saXN0ZW5lck9iamVjdCwgLypGdW5jdGlvbiBvciBTdHJpbmcqL2xpc3RlbmVyTWV0aG9kKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXVzZSBkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoKSB0byBhdHRhY2ggdGhlIHBhc3NlZCBsaXN0ZW5lciB0byB0aGUKKwkJLy8JCXRvcGljIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0CisJCS8vIGxpc3RlbmVyT2JqZWN0OgorCQkvLwkJaWYgYSBzdHJpbmcgYW5kIGxpc3RlbmVyTWV0aG9kIGlzIG9tbWl0dGVkLCB0aGlzIGlzIHRyZWF0ZWQgYXMKKwkJLy8JCXRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIElmCisJCS8vCQlsaXN0ZW5lck1ldGhvZCBpcyBwcm92aWRlZCwgdGhpcyBpcyB0aGUgc2NvcGUgdG8gZmluZCB0aGUKKwkJLy8JCWZ1bmN0aW9uIGluLgorCQkvLyBsaXN0ZW5lck1ldGhvZDoKKwkJLy8JCU9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gdG8gdW5yZWdpc3Rlci4KKwkJdmFyIHRmID0gKCFsaXN0ZW5lck1ldGhvZCkgPyBsaXN0ZW5lck9iamVjdCA6IGxpc3RlbmVyTWV0aG9kOworCQl2YXIgdG8gPSAoIWxpc3RlbmVyTWV0aG9kKSA/IG51bGwgOiBsaXN0ZW5lck9iamVjdDsKKwkJcmV0dXJuIGRvam8uZXZlbnQua3dEaXNjb25uZWN0KHsgLy8gZG9qby5ldmVudC5NZXRob2RKb2luUG9pbnQKKwkJCXNyY09iajoJCXRoaXMsIAorCQkJc3JjRnVuYzoJInNlbmRNZXNzYWdlIiwgCisJCQlhZHZpY2VPYmo6CXRvLAorCQkJYWR2aWNlRnVuYzogdGYKKwkJfSk7CisJfQorCisJdGhpcy5fZ2V0Sm9pblBvaW50ID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIGRvam8uZXZlbnQuTWV0aG9kSm9pblBvaW50LmdldEZvck1ldGhvZCh0aGlzLCAic2VuZE1lc3NhZ2UiKTsKKwl9CisKKwl0aGlzLnNldFNxdWVsY2ggPSBmdW5jdGlvbigvKkJvb2xlYW4qL3Nob3VsZFNxdWVsY2gpeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCWRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBleGNlcHRpb25zIGluIHRoZSBjYWxsaW5nIG9mIGEKKwkJLy8JCWxpc3RlbmVyIGluIHRoZSBjaGFpbiBzaG91bGQgc3RvcCBleGVjdXRpb24gb2YgdGhlIGNoYWluLgorCQl0aGlzLl9nZXRKb2luUG9pbnQoKS5zcXVlbGNoID0gc2hvdWxkU3F1ZWxjaDsKKwl9CisKKwl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBkaXNjb25uZWN0cyBhbGwgbGlzdGVuZXJzIGZyb20gdGhpcyB0b3BpYworCQl0aGlzLl9nZXRKb2luUG9pbnQoKS5kaXNjb25uZWN0KCk7CisJfQorCisJdGhpcy5yZWdpc3RlclB1Ymxpc2hlciA9IGZ1bmN0aW9uKAkvKk9iamVjdCovcHVibGlzaGVyT2JqZWN0LCAKKwkJCQkJCQkJCQkvKkZ1bmN0aW9uIG9yIFN0cmluZyovcHVibGlzaGVyTWV0aG9kKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXJlZ2lzdGVycyB0aGUgcGFzc2VkIGZ1bmN0aW9uIGFzIGEgcHVibGlzaGVyIG9uIHRoaXMgdG9waWMuCisJCS8vCQlFYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW4gZXZlbnQgd2lsbCBiZSBwdWJsaXNoZWQgb24KKwkJLy8JCXRoaXMgdG9waWMuCisJCS8vIHB1Ymxpc2hlck9iamVjdDoKKwkJLy8JCWlmIGEgc3RyaW5nIGFuZCBsaXN0ZW5lck1ldGhvZCBpcyBvbW1pdHRlZCwgdGhpcyBpcyB0cmVhdGVkIGFzCisJCS8vCQl0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJZgorCQkvLwkJbGlzdGVuZXJNZXRob2QgaXMgcHJvdmlkZWQsIHRoaXMgaXMgdGhlIHNjb3BlIHRvIGZpbmQgdGhlCisJCS8vCQlmdW5jdGlvbiBpbi4KKwkJLy8gcHVibGlzaGVyTWV0aG9kOgorCQkvLwkJT3B0aW9uYWwuIFRoZSBmdW5jdGlvbiB0byByZWdpc3Rlci4KKwkJZG9qby5ldmVudC5jb25uZWN0KHB1Ymxpc2hlck9iamVjdCwgcHVibGlzaGVyTWV0aG9kLCB0aGlzLCAic2VuZE1lc3NhZ2UiKTsKKwl9CisKKwl0aGlzLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSl7CisJCS8vIHN1bW1hcnk6IGEgc3R1YiB0byBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgdG9waWMuCisKKwkJLy8gVGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvcGFnYXRlZAorCX0KK30KKworCitkb2pvLnByb3ZpZGUoImRvam8uZXZlbnQuYnJvd3NlciIpOworCisKKy8vIEZJWE1FOiBhbnkgcGFydGljdWxhciByZWFzb24gdGhpcyBpcyBpbiB0aGUgZ2xvYmFsIHNjb3BlPworZG9qby5faWVfY2xvYmJlciA9IG5ldyBmdW5jdGlvbigpeworCXRoaXMuY2xvYmJlck5vZGVzID0gW107CisKKwlmdW5jdGlvbiBudWtlUHJvcChub2RlLCBwcm9wKXsKKwkJLy8gdHJ5eyBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsgCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCXRyeXsgbm9kZVtwcm9wXSA9IG51bGw7IAkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCXRyeXsgZGVsZXRlIG5vZGVbcHJvcF07IAkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisJCS8vIEZJWE1FOiBKb3RMaXZlIG5lZWRzIHRoaXMsIGJ1dCBJJ20gbm90IHN1cmUgaWYgaXQncyB0b28gc2xvdyBvciBub3QKKwkJdHJ5eyBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsJfWNhdGNoKGUpeyAvKiBzcXVlbGNoICovIH0KKwl9CisKKwl0aGlzLmNsb2JiZXIgPSBmdW5jdGlvbihub2RlUmVmKXsKKwkJdmFyIG5hOworCQl2YXIgdG5hOworCQlpZihub2RlUmVmKXsKKwkJCXRuYSA9IG5vZGVSZWYuYWxsIHx8IG5vZGVSZWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJCW5hID0gW25vZGVSZWZdOworCQkJZm9yKHZhciB4PTA7IHg8dG5hLmxlbmd0aDsgeCsrKXsKKwkJCQkvLyBpZiB3ZSdyZSBnb25uYSBiZSBjbG9iYmVyaW5nIHRoZSB0aGluZywgYXQgbGVhc3QgbWFrZSBzdXJlCisJCQkJLy8gd2UgYXJlbid0IHRyeWluZyB0byBkbyBpdCB0d2ljZQorCQkJCWlmKHRuYVt4XVsiX19kb0Nsb2JiZXJfXyJdKXsKKwkJCQkJbmEucHVzaCh0bmFbeF0pOworCQkJCX0KKwkJCX0KKwkJfWVsc2V7CisJCQl0cnl7IHdpbmRvdy5vbmxvYWQgPSBudWxsOyB9Y2F0Y2goZSl7fQorCQkJbmEgPSAodGhpcy5jbG9iYmVyTm9kZXMubGVuZ3RoKSA/IHRoaXMuY2xvYmJlck5vZGVzIDogZG9jdW1lbnQuYWxsOworCQl9CisJCXRuYSA9IG51bGw7CisJCXZhciBiYXNpcyA9IHt9OworCQlmb3IodmFyIGkgPSBuYS5sZW5ndGgtMTsgaT49MDsgaT1pLTEpeworCQkJdmFyIGVsID0gbmFbaV07CisJCQl0cnl7CisJCQkJaWYoZWwgJiYgZWxbIl9fY2xvYmJlckF0dHJzX18iXSl7CisJCQkJCWZvcih2YXIgaj0wOyBqPGVsLl9fY2xvYmJlckF0dHJzX18ubGVuZ3RoOyBqKyspeworCQkJCQkJbnVrZVByb3AoZWwsIGVsLl9fY2xvYmJlckF0dHJzX19bal0pOworCQkJCQl9CisJCQkJCW51a2VQcm9wKGVsLCAiX19jbG9iYmVyQXR0cnNfXyIpOworCQkJCQludWtlUHJvcChlbCwgIl9fZG9DbG9iYmVyX18iKTsKKwkJCQl9CisJCQl9Y2F0Y2goZSl7IC8qIHNxdWVsY2ghICovfTsKKwkJfQorCQluYSA9IG51bGw7CisJfQorfQorCitpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwlkb2pvLmFkZE9uVW5sb2FkKGZ1bmN0aW9uKCl7CisJCWRvam8uX2llX2Nsb2JiZXIuY2xvYmJlcigpOworCQl0cnl7CisJCQlpZigoZG9qb1sid2lkZ2V0Il0pJiYoZG9qby53aWRnZXRbIm1hbmFnZXIiXSkpeworCQkJCWRvam8ud2lkZ2V0Lm1hbmFnZXIuZGVzdHJveUFsbCgpOworCQkJfQorCQl9Y2F0Y2goZSl7fQorCisJCS8vIFdvcmthcm91bmQgZm9yIElFIGxlYWsgcmVjb21tZW5kZWQgaW4gdGlja2V0ICMxNzI3IGJ5IHNjaGFsbG0KKwkJaWYoZG9qby53aWRnZXQpeworCQkJZm9yKHZhciBuYW1lIGluIGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlKXsKKwkJCQlpZihkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZVtuYW1lXS5ub2RlKXsKKwkJCQkJZG9qby5kb20uZGVzdHJveU5vZGUoZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZSk7CisJCQkJCWRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW25hbWVdLm5vZGUgPSBudWxsOworCQkJCQlkZWxldGUgZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbbmFtZV0ubm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl0cnl7IHdpbmRvdy5vbmxvYWQgPSBudWxsOyB9Y2F0Y2goZSl7fQorCQl0cnl7IHdpbmRvdy5vbnVubG9hZCA9IG51bGw7IH1jYXRjaChlKXt9CisJCWRvam8uX2llX2Nsb2JiZXIuY2xvYmJlck5vZGVzID0gW107CisJCS8vIENvbGxlY3RHYXJiYWdlKCk7CisJfSk7Cit9CisKK2Rvam8uZXZlbnQuYnJvd3NlciA9IG5ldyBmdW5jdGlvbigpeworCisJdmFyIGNsb2JiZXJJZHggPSAwOworCisJdGhpcy5ub3JtYWxpemVkRXZlbnROYW1lID0gZnVuY3Rpb24oLypTdHJpbmcqL2V2ZW50TmFtZSl7CisJCXN3aXRjaChldmVudE5hbWUpeworCQkJY2FzZSAiQ2hlY2tib3hTdGF0ZUNoYW5nZSI6CisJCQljYXNlICJET01BdHRyTW9kaWZpZWQiOgorCQkJY2FzZSAiRE9NTWVudUl0ZW1BY3RpdmUiOgorCQkJY2FzZSAiRE9NTWVudUl0ZW1JbmFjdGl2ZSI6CisJCQljYXNlICJET01Nb3VzZVNjcm9sbCI6CisJCQljYXNlICJET01Ob2RlSW5zZXJ0ZWQiOgorCQkJY2FzZSAiRE9NTm9kZVJlbW92ZWQiOgorCQkJY2FzZSAiUmFkaW9TdGF0ZUNoYW5nZSI6CisJCQkJcmV0dXJuIGV2ZW50TmFtZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFyIGxjbiA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpOworCQkJCXJldHVybiAobGNuLmluZGV4T2YoIm9uIikgPT0gMCkgPyBsY24uc3Vic3RyKDIpIDogbGNuOworCQkJCWJyZWFrOworCQl9CisJfQorCQorCXRoaXMuY2xlYW4gPSBmdW5jdGlvbigvKkRPTU5vZGUqL25vZGUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVtb3ZlcyBuYXRpdmUgZXZlbnQgaGFuZGxlcnMgc28gdGhhdCBkZXN0cnVjdGlvbiBvZiB0aGUgbm9kZQorCQkvLwkJd2lsbCBub3QgbGVhayBtZW1vcnkuIE9uIG1vc3QgYnJvd3NlcnMgdGhpcyBpcyBhIG5vLW9wLCBidXQKKwkJLy8JCWl0J3MgY3JpdGljYWwgZm9yIG1hbnVhbCBub2RlIHJlbW92YWwgb24gSUUuCisJCS8vIG5vZGU6CisJCS8vCQlBIERPTSBub2RlLiBBbGwgb2YgaXQncyBjaGlsZHJlbiB3aWxsIGFsc28gYmUgY2xlYW5lZC4KKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7IAorCQkJZG9qby5faWVfY2xvYmJlci5jbG9iYmVyKG5vZGUpOworCQl9CisJfQorCisJdGhpcy5hZGRDbG9iYmVyTm9kZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZWdpc3RlciB0aGUgcGFzc2VkIG5vZGUgdG8gc3VwcG9ydCBldmVudCBzdHJpcHBpbmcKKwkJLy8gbm9kZToKKwkJLy8JCUEgRE9NIG5vZGUKKwkJaWYoIWRvam8ucmVuZGVyLmh0bWwuaWUpeyByZXR1cm47IH0KKwkJaWYoIW5vZGVbIl9fZG9DbG9iYmVyX18iXSl7CisJCQlub2RlLl9fZG9DbG9iYmVyX18gPSB0cnVlOworCQkJZG9qby5faWVfY2xvYmJlci5jbG9iYmVyTm9kZXMucHVzaChub2RlKTsKKwkJCS8vIHRoaXMgbWlnaHQgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB0aGluZyB0byBkbywgYnV0IGl0J3MKKwkJCS8vIG11Y2ggbGVzcyBlcnJvciBwcm9uZSB0aGFuIG90aGVyIGFwcHJvYWNoZXMgd2hpY2ggd2VyZQorCQkJLy8gcHJldmlvdXNseSB0cmllZCBhbmQgZmFpbGVkCisJCQlub2RlLl9fY2xvYmJlckF0dHJzX18gPSBbXTsKKwkJfQorCX0KKworCXRoaXMuYWRkQ2xvYmJlck5vZGVBdHRycyA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovbm9kZSwgLypBcnJheSovcHJvcHMpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmVnaXN0ZXIgdGhlIHBhc3NlZCBub2RlIHRvIHN1cHBvcnQgZXZlbnQgc3RyaXBwaW5nCisJCS8vIG5vZGU6CisJCS8vCQlBIERPTSBub2RlIHRvIHN0aXAgcHJvcGVydGllcyBmcm9tIGxhdGVyCisJCS8vIHByb3BzOgorCQkvLwkJQSBsaXN0IG9mIHByb3BldGllcyB0byBzdHJpcCBmcm9tIHRoZSBub2RlCisJCWlmKCFkb2pvLnJlbmRlci5odG1sLmllKXsgcmV0dXJuOyB9CisJCXRoaXMuYWRkQ2xvYmJlck5vZGUobm9kZSk7CisJCWZvcih2YXIgeD0wOyB4PHByb3BzLmxlbmd0aDsgeCsrKXsKKwkJCW5vZGUuX19jbG9iYmVyQXR0cnNfXy5wdXNoKHByb3BzW3hdKTsKKwkJfQorCX0KKworCXRoaXMucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbigJLypET01Ob2RlKi8gbm9kZSwgCisJCQkJCQkJCQkvKlN0cmluZyovCWV2dE5hbWUsIAorCQkJCQkJCQkJLypGdW5jdGlvbiovZnAsIAorCQkJCQkJCQkJLypCb29sZWFuKi8JY2FwdHVyZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQljbG9iYmVycyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgbm9kZQorCQkvLyBldnROYW1lOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgdG8gcmVtb3ZlIHRoZSBmdW5jdGlvbiBmcm9tCisJCS8vIG5vZGU6CisJCS8vCQlET00gbm9kZSB0byBhdHRhY2ggdGhlIGV2ZW50IHRvCisJCS8vIGZwOgorCQkvLwkJdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyCisJCS8vIGNhcHR1cmU6CisJCS8vCQlPcHRpb25hbC4gc2hvdWxkIHRoaXMgbGlzdGVuZXIgcHJldmVudCBwcm9waWdhdGlvbj8KKwkJaWYoIWNhcHR1cmUpeyB2YXIgY2FwdHVyZSA9IGZhbHNlOyB9CisJCWV2dE5hbWUgPSBkb2pvLmV2ZW50LmJyb3dzZXIubm9ybWFsaXplZEV2ZW50TmFtZShldnROYW1lKTsKKwkJaWYoZXZ0TmFtZSA9PSAia2V5Iil7CisJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQl0aGlzLnJlbW92ZUxpc3RlbmVyKG5vZGUsICJvbmtleWRvd24iLCBmcCwgY2FwdHVyZSk7CisJCQl9CisJCQlldnROYW1lID0gImtleXByZXNzIjsKKwkJfQorCQkvLyBGSVhNRTogdGhpcyBpcyBtb3N0bHkgYSBwdW50LCB3ZSBhcmVuJ3QgYWN0dWFsbHkgZG9pbmcgYW55dGhpbmcgb24gSUUKKwkJaWYobm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKXsKKwkJCW5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnROYW1lLCBmcCwgY2FwdHVyZSk7CisJCX0KKwl9CisKKwl0aGlzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24oLypET01Ob2RlKi9ub2RlLCAvKlN0cmluZyovZXZ0TmFtZSwgLypGdW5jdGlvbiovZnAsIC8qQm9vbGVhbiovY2FwdHVyZSwgLypCb29sZWFuKi9kb250Rml4KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWFkZHMgYSBsaXN0ZW5lciB0byB0aGUgbm9kZQorCQkvLyBldnROYW1lOgorCQkvLwkJdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byBjYW4gYmUgZWl0aGVyIG9mCisJCS8vCQl0aGUgZm9ybSAib25jbGljayIgb3IgImNsaWNrIgorCQkvLyBub2RlOgorCQkvLwkJRE9NIG5vZGUgdG8gYXR0YWNoIHRoZSBldmVudCB0bworCQkvLyBmcDoKKwkJLy8JCXRoZSBmdW5jdGlvbiB0byByZWdpc3RlcgorCQkvLyBjYXB0dXJlOgorCQkvLwkJT3B0aW9uYWwuIFNob3VsZCB0aGlzIGxpc3RlbmVyIHByZXZlbnQgcHJvcGlnYXRpb24/CisJCS8vIGRvbnRGaXg6CisJCS8vCQlPcHRpb25hbC4gU2hvdWxkIHdlIGF2b2lkIHJlZ2lzdGVyaW5nIGEgbmV3IGNsb3N1cmUgYXJvdW5kIHRoZQorCQkvLwkJbGlzdGVuZXIgdG8gZW5hYmxlIGZpeEV2ZW50IGZvciBkaXNwYXRjaCBvZiB0aGUgcmVnaXN0ZXJlZAorCQkvLwkJZnVuY3Rpb24/CisJCWlmKCFub2RlKXsgcmV0dXJuOyB9IC8vIEZJWE1FOiBsb2cgYW5kL29yIGJhaWw/CisJCWlmKCFjYXB0dXJlKXsgdmFyIGNhcHR1cmUgPSBmYWxzZTsgfQorCQlldnROYW1lID0gZG9qby5ldmVudC5icm93c2VyLm5vcm1hbGl6ZWRFdmVudE5hbWUoZXZ0TmFtZSk7CisJCWlmKGV2dE5hbWUgPT0gImtleSIpeworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJdGhpcy5hZGRMaXN0ZW5lcihub2RlLCAib25rZXlkb3duIiwgZnAsIGNhcHR1cmUsIGRvbnRGaXgpOworCQkJfQorCQkJZXZ0TmFtZSA9ICJrZXlwcmVzcyI7CisJCX0KKworCQlpZighZG9udEZpeCl7CisJCQkvLyBidWlsZCB5ZXQgYW5vdGhlciBjbG9zdXJlIGFyb3VuZCBmcCBpbiBvcmRlciB0byBpbmplY3QgZml4RXZlbnQKKwkJCS8vIGFyb3VuZCB0aGUgcmVzdWx0aW5nIGV2ZW50CisJCQl2YXIgbmV3ZnAgPSBmdW5jdGlvbihldnQpeworCQkJCWlmKCFldnQpeyBldnQgPSB3aW5kb3cuZXZlbnQ7IH0KKwkJCQl2YXIgcmV0ID0gZnAoZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCwgdGhpcykpOworCQkJCWlmKGNhcHR1cmUpeworCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQkJfQorCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX1lbHNleworCQkJbmV3ZnAgPSBmcDsKKwkJfQorCisJCWlmKG5vZGUuYWRkRXZlbnRMaXN0ZW5lcil7IAorCQkJbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dE5hbWUsIG5ld2ZwLCBjYXB0dXJlKTsKKwkJCXJldHVybiBuZXdmcDsKKwkJfWVsc2V7CisJCQlldnROYW1lID0gIm9uIitldnROYW1lOworCQkJaWYodHlwZW9mIG5vZGVbZXZ0TmFtZV0gPT0gImZ1bmN0aW9uIiApeworCQkJCXZhciBvbGRFdnQgPSBub2RlW2V2dE5hbWVdOworCQkJCW5vZGVbZXZ0TmFtZV0gPSBmdW5jdGlvbihlKXsKKwkJCQkJb2xkRXZ0KGUpOworCQkJCQlyZXR1cm4gbmV3ZnAoZSk7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJbm9kZVtldnROYW1lXT1uZXdmcDsKKwkJCX0KKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCXRoaXMuYWRkQ2xvYmJlck5vZGVBdHRycyhub2RlLCBbZXZ0TmFtZV0pOworCQkJfQorCQkJcmV0dXJuIG5ld2ZwOworCQl9CisJfQorCisJdGhpcy5pc0V2ZW50ID0gZnVuY3Rpb24oLypPYmplY3QqL29iail7CisJCS8vIHN1bW1hcnk6IAorCQkvLwkJVHJpZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gZXZlbnQuCisKKwkJLy8gRklYTUU6IGV2ZW50IGRldGVjdGlvbiBoYWNrIC4uLiBjb3VsZCB0ZXN0IGZvciBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMKKwkJLy8gaWYgbmVjZXNzYXJ5CisJCXJldHVybiAodHlwZW9mIG9iaiAhPSAidW5kZWZpbmVkIikmJihvYmopJiYodHlwZW9mIEV2ZW50ICE9ICJ1bmRlZmluZWQiKSYmKG9iai5ldmVudFBoYXNlKTsgLy8gQm9vbGVhbgorCQkvLyBFdmVudCBkb2VzIG5vdCBzdXBwb3J0IGluc3RhbmNlb2YgaW4gT3BlcmEsIG90aGVyd2lzZToKKwkJLy9yZXR1cm4gKHR5cGVvZiBFdmVudCAhPSAidW5kZWZpbmVkIikmJihvYmogaW5zdGFuY2VvZiBFdmVudCk7CisJfQorCisJdGhpcy5jdXJyZW50RXZlbnQgPSBudWxsOworCQorCXRoaXMuY2FsbExpc3RlbmVyID0gZnVuY3Rpb24oLypGdW5jdGlvbiovbGlzdGVuZXIsIC8qRE9NTm9kZSovY3VyVGFyZ2V0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWNhbGxzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBub2RlCisJCS8vCQl3aXRoIHRoZSBjdXJyZW50IERPTSBldmVudCBvYmplY3QgYXMgdGhlIG9ubHkgcGFyYW1ldGVyCisJCS8vIGxpc3RlbmVyOgorCQkvLwkJdGhlIGZ1bmN0aW9uIHRvIGNhbGwKKwkJLy8gY3VyVGFyZ2V0OgorCQkvLwkJdGhlIE5vZGUgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaW4gdGhlIHNjb3BlIG9mCisJCWlmKHR5cGVvZiBsaXN0ZW5lciAhPSAnZnVuY3Rpb24nKXsKKwkJCWRvam8ucmFpc2UoImxpc3RlbmVyIG5vdCBhIGZ1bmN0aW9uOiAiICsgbGlzdGVuZXIpOworCQl9CisJCWRvam8uZXZlbnQuYnJvd3Nlci5jdXJyZW50RXZlbnQuY3VycmVudFRhcmdldCA9IGN1clRhcmdldDsKKwkJcmV0dXJuIGxpc3RlbmVyLmNhbGwoY3VyVGFyZ2V0LCBkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50KTsKKwl9CisKKwl0aGlzLl9zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpeworCQlkb2pvLmV2ZW50LmJyb3dzZXIuY3VycmVudEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7IAorCX0KKworCXRoaXMuX3ByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKXsKKwkJZG9qby5ldmVudC5icm93c2VyLmN1cnJlbnRFdmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCX0KKworCXRoaXMua2V5cyA9IHsKKwkJS0VZX0JBQ0tTUEFDRTogOCwKKwkJS0VZX1RBQjogOSwKKwkJS0VZX0NMRUFSOiAxMiwKKwkJS0VZX0VOVEVSOiAxMywKKwkJS0VZX1NISUZUOiAxNiwKKwkJS0VZX0NUUkw6IDE3LAorCQlLRVlfQUxUOiAxOCwKKwkJS0VZX1BBVVNFOiAxOSwKKwkJS0VZX0NBUFNfTE9DSzogMjAsCisJCUtFWV9FU0NBUEU6IDI3LAorCQlLRVlfU1BBQ0U6IDMyLAorCQlLRVlfUEFHRV9VUDogMzMsCisJCUtFWV9QQUdFX0RPV046IDM0LAorCQlLRVlfRU5EOiAzNSwKKwkJS0VZX0hPTUU6IDM2LAorCQlLRVlfTEVGVF9BUlJPVzogMzcsCisJCUtFWV9VUF9BUlJPVzogMzgsCisJCUtFWV9SSUdIVF9BUlJPVzogMzksCisJCUtFWV9ET1dOX0FSUk9XOiA0MCwKKwkJS0VZX0lOU0VSVDogNDUsCisJCUtFWV9ERUxFVEU6IDQ2LAorCQlLRVlfSEVMUDogNDcsCisJCUtFWV9MRUZUX1dJTkRPVzogOTEsCisJCUtFWV9SSUdIVF9XSU5ET1c6IDkyLAorCQlLRVlfU0VMRUNUOiA5MywKKwkJS0VZX05VTVBBRF8wOiA5NiwKKwkJS0VZX05VTVBBRF8xOiA5NywKKwkJS0VZX05VTVBBRF8yOiA5OCwKKwkJS0VZX05VTVBBRF8zOiA5OSwKKwkJS0VZX05VTVBBRF80OiAxMDAsCisJCUtFWV9OVU1QQURfNTogMTAxLAorCQlLRVlfTlVNUEFEXzY6IDEwMiwKKwkJS0VZX05VTVBBRF83OiAxMDMsCisJCUtFWV9OVU1QQURfODogMTA0LAorCQlLRVlfTlVNUEFEXzk6IDEwNSwKKwkJS0VZX05VTVBBRF9NVUxUSVBMWTogMTA2LAorCQlLRVlfTlVNUEFEX1BMVVM6IDEwNywKKwkJS0VZX05VTVBBRF9FTlRFUjogMTA4LAorCQlLRVlfTlVNUEFEX01JTlVTOiAxMDksCisJCUtFWV9OVU1QQURfUEVSSU9EOiAxMTAsCisJCUtFWV9OVU1QQURfRElWSURFOiAxMTEsCisJCUtFWV9GMTogMTEyLAorCQlLRVlfRjI6IDExMywKKwkJS0VZX0YzOiAxMTQsCisJCUtFWV9GNDogMTE1LAorCQlLRVlfRjU6IDExNiwKKwkJS0VZX0Y2OiAxMTcsCisJCUtFWV9GNzogMTE4LAorCQlLRVlfRjg6IDExOSwKKwkJS0VZX0Y5OiAxMjAsCisJCUtFWV9GMTA6IDEyMSwKKwkJS0VZX0YxMTogMTIyLAorCQlLRVlfRjEyOiAxMjMsCisJCUtFWV9GMTM6IDEyNCwKKwkJS0VZX0YxNDogMTI1LAorCQlLRVlfRjE1OiAxMjYsCisJCUtFWV9OVU1fTE9DSzogMTQ0LAorCQlLRVlfU0NST0xMX0xPQ0s6IDE0NQorCX07CisKKwkvLyByZXZlcnNlIGxvb2t1cAorCXRoaXMucmV2S2V5cyA9IFtdOworCWZvcih2YXIga2V5IGluIHRoaXMua2V5cyl7CisJCXRoaXMucmV2S2V5c1t0aGlzLmtleXNba2V5XV0gPSBrZXk7CisJfQorCisJdGhpcy5maXhFdmVudCA9IGZ1bmN0aW9uKC8qRXZlbnQqL2V2dCwgLypET01Ob2RlKi9zZW5kZXIpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJbm9ybWFsaXplcyBwcm9wZXJ0aWVzIG9uIHRoZSBldmVudCBvYmplY3QgaW5jbHVkaW5nIGV2ZW50CisJCS8vCQlidWJibGluZyBtZXRob2RzLCBrZXlzdHJva2Ugbm9ybWFsaXphdGlvbiwgYW5kIHgveSBwb3NpdGlvbnMKKwkJLy8gZXZ0OiB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAorCQkvLyBzZW5kZXI6IHRoZSBub2RlIHRvIHRyZWF0IGFzICJjdXJyZW50VGFyZ2V0IgorCQlpZighZXZ0KXsKKwkJCWlmKHdpbmRvd1siZXZlbnQiXSl7CisJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJfQorCQl9CisJCQorCQlpZigoZXZ0WyJ0eXBlIl0pJiYoZXZ0WyJ0eXBlIl0uaW5kZXhPZigia2V5IikgPT0gMCkpeyAvLyBrZXkgZXZlbnRzCisJCQlldnQua2V5cyA9IHRoaXMucmV2S2V5czsKKwkJCS8vIEZJWE1FOiBob3cgY2FuIHdlIGVsaW1pbmF0ZSB0aGlzIGl0ZXJhdGlvbj8KKwkJCWZvcih2YXIga2V5IGluIHRoaXMua2V5cyl7CisJCQkJZXZ0W2tleV0gPSB0aGlzLmtleXNba2V5XTsKKwkJCX0KKwkJCWlmKGV2dFsidHlwZSJdID09ICJrZXlkb3duIiAmJiBkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQlzd2l0Y2goZXZ0LmtleUNvZGUpeworCQkJCQljYXNlIGV2dC5LRVlfU0hJRlQ6CisJCQkJCWNhc2UgZXZ0LktFWV9DVFJMOgorCQkJCQljYXNlIGV2dC5LRVlfQUxUOgorCQkJCQljYXNlIGV2dC5LRVlfQ0FQU19MT0NLOgorCQkJCQljYXNlIGV2dC5LRVlfTEVGVF9XSU5ET1c6CisJCQkJCWNhc2UgZXZ0LktFWV9SSUdIVF9XSU5ET1c6CisJCQkJCWNhc2UgZXZ0LktFWV9TRUxFQ1Q6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1fTE9DSzoKKwkJCQkJY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorCQkJCQkvLyBJJ2xsIGdldCB0aGVzZSBpbiBrZXlwcmVzcyBhZnRlciB0aGUgT1MgbXVuZ2VzIHRoZW0gYmFzZWQgb24gbnVtbG9jaworCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzA6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfMToKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF8yOgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzM6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfNDoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF81OgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzY6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfNzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF84OgorCQkJCQljYXNlIGV2dC5LRVlfTlVNUEFEXzk6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfUEVSSU9EOgorCQkJCQkJYnJlYWs7IC8vIGp1c3QgaWdub3JlIHRoZSBrZXlzIHRoYXQgY2FuIG1vcnBoCisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfTVVMVElQTFk6CisJCQkJCWNhc2UgZXZ0LktFWV9OVU1QQURfUExVUzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9FTlRFUjoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9NSU5VUzoKKwkJCQkJY2FzZSBldnQuS0VZX05VTVBBRF9ESVZJREU6CisJCQkJCQlicmVhazsgLy8gSSBjb3VsZCBoYW5kbGUgdGhlc2UgYnV0IGp1c3QgcGljayB0aGVtIHVwIGluIGtleXByZXNzCisJCQkJCWNhc2UgZXZ0LktFWV9QQVVTRToKKwkJCQkJY2FzZSBldnQuS0VZX1RBQjoKKwkJCQkJY2FzZSBldnQuS0VZX0JBQ0tTUEFDRToKKwkJCQkJY2FzZSBldnQuS0VZX0VOVEVSOgorCQkJCQljYXNlIGV2dC5LRVlfRVNDQVBFOgorCQkJCQljYXNlIGV2dC5LRVlfUEFHRV9VUDoKKwkJCQkJY2FzZSBldnQuS0VZX1BBR0VfRE9XTjoKKwkJCQkJY2FzZSBldnQuS0VZX0VORDoKKwkJCQkJY2FzZSBldnQuS0VZX0hPTUU6CisJCQkJCWNhc2UgZXZ0LktFWV9MRUZUX0FSUk9XOgorCQkJCQljYXNlIGV2dC5LRVlfVVBfQVJST1c6CisJCQkJCWNhc2UgZXZ0LktFWV9SSUdIVF9BUlJPVzoKKwkJCQkJY2FzZSBldnQuS0VZX0RPV05fQVJST1c6CisJCQkJCWNhc2UgZXZ0LktFWV9JTlNFUlQ6CisJCQkJCWNhc2UgZXZ0LktFWV9ERUxFVEU6CisJCQkJCWNhc2UgZXZ0LktFWV9GMToKKwkJCQkJY2FzZSBldnQuS0VZX0YyOgorCQkJCQljYXNlIGV2dC5LRVlfRjM6CisJCQkJCWNhc2UgZXZ0LktFWV9GNDoKKwkJCQkJY2FzZSBldnQuS0VZX0Y1OgorCQkJCQljYXNlIGV2dC5LRVlfRjY6CisJCQkJCWNhc2UgZXZ0LktFWV9GNzoKKwkJCQkJY2FzZSBldnQuS0VZX0Y4OgorCQkJCQljYXNlIGV2dC5LRVlfRjk6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTA6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTE6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTI6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTI6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTM6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTQ6CisJCQkJCWNhc2UgZXZ0LktFWV9GMTU6CisJCQkJCWNhc2UgZXZ0LktFWV9DTEVBUjoKKwkJCQkJY2FzZSBldnQuS0VZX0hFTFA6CisJCQkJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmKGV2dC5jdHJsS2V5IHx8IGV2dC5hbHRLZXkpeworCQkJCQkJCXZhciB1bmlmaWVkQ2hhckNvZGUgPSBldnQua2V5Q29kZTsKKwkJCQkJCQkvLyBpZiBsb3dlciBjYXNlIGJ1dCBrZXljb2RlIGlzIHVwcGVyY2FzZSwgY29udmVydCBpdAorCQkJCQkJCWlmKHVuaWZpZWRDaGFyQ29kZSA+PSA2NSAmJiB1bmlmaWVkQ2hhckNvZGUgPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKXsKKwkJCQkJCQkJdW5pZmllZENoYXJDb2RlICs9IDMyOworCQkJCQkJCX0KKwkJCQkJCQlpZih1bmlmaWVkQ2hhckNvZGUgPj0gMSAmJiB1bmlmaWVkQ2hhckNvZGUgPD0gMjYgJiYgZXZ0LmN0cmxLZXkpeworCQkJCQkJCQl1bmlmaWVkQ2hhckNvZGUgKz0gOTY7IC8vIDAwMS0wMzIgPSBjdHJsK1thLXpdCisJCQkJCQkJfQorCQkJCQkJCWV2dC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWZpZWRDaGFyQ29kZSk7CisJCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmKGV2dFsidHlwZSJdID09ICJrZXlwcmVzcyIpeworCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworCQkJCQlpZihldnQud2hpY2ggPT0gMCl7CisJCQkJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQkJCX1lbHNlIGlmKGV2dC53aGljaCA+IDApeworCQkJCQkJc3dpdGNoKGV2dC53aGljaCl7CisJCQkJCQkJY2FzZSBldnQuS0VZX1NISUZUOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9DVFJMOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9BTFQ6CisJCQkJCQkJY2FzZSBldnQuS0VZX0NBUFNfTE9DSzoKKwkJCQkJCQljYXNlIGV2dC5LRVlfTlVNX0xPQ0s6CisJCQkJCQkJY2FzZSBldnQuS0VZX1NDUk9MTF9MT0NLOgorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIGV2dC5LRVlfUEFVU0U6CisJCQkJCQkJY2FzZSBldnQuS0VZX1RBQjoKKwkJCQkJCQljYXNlIGV2dC5LRVlfQkFDS1NQQUNFOgorCQkJCQkJCWNhc2UgZXZ0LktFWV9FTlRFUjoKKwkJCQkJCQljYXNlIGV2dC5LRVlfRVNDQVBFOgorCQkJCQkJCQlldnQua2V5ID0gZXZ0LndoaWNoOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQl2YXIgdW5pZmllZENoYXJDb2RlID0gZXZ0LndoaWNoOworCQkJCQkJCQlpZigoZXZ0LmN0cmxLZXkgfHwgZXZ0LmFsdEtleSB8fCBldnQubWV0YUtleSkgJiYgKGV2dC53aGljaCA+PSA2NSAmJiBldnQud2hpY2ggPD0gOTAgJiYgZXZ0LnNoaWZ0S2V5ID09IGZhbHNlKSl7CisJCQkJCQkJCQl1bmlmaWVkQ2hhckNvZGUgKz0gMzI7CisJCQkJCQkJCX0KKwkJCQkJCQkJZXZ0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pZmllZENoYXJDb2RlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX1lbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeyAvLyBjYXRjaCBzb21lIElFIGtleXMgdGhhdCBhcmUgaGFyZCB0byBnZXQgaW4ga2V5RG93bgorCQkJCQkvLyBrZXkgY29tYmluYXRpb25zIHdlcmUgaGFuZGxlZCBpbiBvbktleURvd24KKwkJCQkJaWYoIWV2dC5jdHJsS2V5ICYmICFldnQuYWx0S2V5ICYmIGV2dC5rZXlDb2RlID49IGV2dC5LRVlfU1BBQ0UpeworCQkJCQkJZXZ0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmtleUNvZGUpOworCQkJCQl9CisJCQkJfWVsc2UgaWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpeworCQkJCQlzd2l0Y2goZXZ0LmtleUNvZGUpeworCQkJCQkJY2FzZSAyNTogZXZ0LmtleSA9IGV2dC5LRVlfVEFCOyBldnQuc2hpZnQgPSB0cnVlO2JyZWFrOworCQkJCQkJY2FzZSA2MzIzMjogZXZ0LmtleSA9IGV2dC5LRVlfVVBfQVJST1c7IGJyZWFrOworCQkJCQkJY2FzZSA2MzIzMzogZXZ0LmtleSA9IGV2dC5LRVlfRE9XTl9BUlJPVzsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjM0OiBldnQua2V5ID0gZXZ0LktFWV9MRUZUX0FSUk9XOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzU6IGV2dC5rZXkgPSBldnQuS0VZX1JJR0hUX0FSUk9XOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzY6IGV2dC5rZXkgPSBldnQuS0VZX0YxOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzc6IGV2dC5rZXkgPSBldnQuS0VZX0YyOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzg6IGV2dC5rZXkgPSBldnQuS0VZX0YzOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyMzk6IGV2dC5rZXkgPSBldnQuS0VZX0Y0OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDA6IGV2dC5rZXkgPSBldnQuS0VZX0Y1OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDE6IGV2dC5rZXkgPSBldnQuS0VZX0Y2OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDI6IGV2dC5rZXkgPSBldnQuS0VZX0Y3OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDM6IGV2dC5rZXkgPSBldnQuS0VZX0Y4OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDQ6IGV2dC5rZXkgPSBldnQuS0VZX0Y5OyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNDU6IGV2dC5rZXkgPSBldnQuS0VZX0YxMDsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjQ2OiBldnQua2V5ID0gZXZ0LktFWV9GMTE7IGJyZWFrOworCQkJCQkJY2FzZSA2MzI0NzogZXZ0LmtleSA9IGV2dC5LRVlfRjEyOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNTA6IGV2dC5rZXkgPSBldnQuS0VZX1BBVVNFOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzI6IGV2dC5rZXkgPSBldnQuS0VZX0RFTEVURTsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjczOiBldnQua2V5ID0gZXZ0LktFWV9IT01FOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzU6IGV2dC5rZXkgPSBldnQuS0VZX0VORDsgYnJlYWs7CisJCQkJCQljYXNlIDYzMjc2OiBldnQua2V5ID0gZXZ0LktFWV9QQUdFX1VQOyBicmVhazsKKwkJCQkJCWNhc2UgNjMyNzc6IGV2dC5rZXkgPSBldnQuS0VZX1BBR0VfRE9XTjsgYnJlYWs7CisJCQkJCQljYXNlIDYzMzAyOiBldnQua2V5ID0gZXZ0LktFWV9JTlNFUlQ7IGJyZWFrOworCQkJCQkJY2FzZSA2MzI0ODovL3BydHNjcgorCQkJCQkJY2FzZSA2MzI0OTovL3Njcm9sbGxvY2sKKwkJCQkJCWNhc2UgNjMyODk6Ly9udW1sb2NrCisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAKKwkJCQkJCQlldnQua2V5ID0gZXZ0LmNoYXJDb2RlID49IGV2dC5LRVlfU1BBQ0UgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2dC5jaGFyQ29kZSkgOiBldnQua2V5Q29kZTsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQlldnQua2V5ID0gZXZ0LmNoYXJDb2RlID4gMCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZ0LmNoYXJDb2RlKSA6IGV2dC5rZXlDb2RlOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCWlmKCFldnQudGFyZ2V0KXsgZXZ0LnRhcmdldCA9IGV2dC5zcmNFbGVtZW50OyB9CisJCQlpZighZXZ0LmN1cnJlbnRUYXJnZXQpeyBldnQuY3VycmVudFRhcmdldCA9IChzZW5kZXIgPyBzZW5kZXIgOiBldnQuc3JjRWxlbWVudCk7IH0KKwkJCWlmKCFldnQubGF5ZXJYKXsgZXZ0LmxheWVyWCA9IGV2dC5vZmZzZXRYOyB9CisJCQlpZighZXZ0LmxheWVyWSl7IGV2dC5sYXllclkgPSBldnQub2Zmc2V0WTsgfQorCQkJLy8gRklYTUU6IHNjcm9sbCBwb3NpdGlvbiBxdWVyeSBpcyBkdXBlZCBmcm9tIGRvam8uaHRtbCB0byBhdm9pZCBkZXBlbmRlbmN5IG9uIHRoYXQgZW50aXJlIG1vZHVsZQorCQkJLy8gRE9OT1QgcmVwbGFjZSB0aGUgZm9sbG93aW5nIHRvIHVzZSBkb2pvLmJvZHkoKSwgaW4gSUUsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBzaG91bGQgYmUgdXNlZAorCQkJLy8gaGVyZSByYXRoZXIgdGhhbiBkb2N1bWVudC5ib2R5CisJCQl2YXIgZG9jID0gKGV2dC5zcmNFbGVtZW50ICYmIGV2dC5zcmNFbGVtZW50Lm93bmVyRG9jdW1lbnQpID8gZXZ0LnNyY0VsZW1lbnQub3duZXJEb2N1bWVudCA6IGRvY3VtZW50OworCQkJdmFyIGRvY0JvZHkgPSAoKGRvam8ucmVuZGVyLmh0bWwuaWU1NSl8fChkb2NbImNvbXBhdE1vZGUiXSA9PSAiQmFja0NvbXBhdCIpKSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudDsKKwkJCWlmKCFldnQucGFnZVgpeyBldnQucGFnZVggPSBldnQuY2xpZW50WCArIChkb2NCb2R5LnNjcm9sbExlZnQgfHwgMCkgfQorCQkJaWYoIWV2dC5wYWdlWSl7IGV2dC5wYWdlWSA9IGV2dC5jbGllbnRZICsgKGRvY0JvZHkuc2Nyb2xsVG9wIHx8IDApIH0KKwkJCS8vIG1vdXNlb3ZlcgorCQkJaWYoZXZ0LnR5cGUgPT0gIm1vdXNlb3ZlciIpeyBldnQucmVsYXRlZFRhcmdldCA9IGV2dC5mcm9tRWxlbWVudDsgfQorCQkJLy8gbW91c2VvdXQKKwkJCWlmKGV2dC50eXBlID09ICJtb3VzZW91dCIpeyBldnQucmVsYXRlZFRhcmdldCA9IGV2dC50b0VsZW1lbnQ7IH0KKwkJCXRoaXMuY3VycmVudEV2ZW50ID0gZXZ0OworCQkJZXZ0LmNhbGxMaXN0ZW5lciA9IHRoaXMuY2FsbExpc3RlbmVyOworCQkJZXZ0LnN0b3BQcm9wYWdhdGlvbiA9IHRoaXMuX3N0b3BQcm9wYWdhdGlvbjsKKwkJCWV2dC5wcmV2ZW50RGVmYXVsdCA9IHRoaXMuX3ByZXZlbnREZWZhdWx0OworCQl9CisJCXJldHVybiBldnQ7IC8vIEV2ZW50CisJfQorCisJdGhpcy5zdG9wRXZlbnQgPSBmdW5jdGlvbigvKkV2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcHJldmVudHMgcHJvcGlnYXRpb24gYW5kIGNsb2JiZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGUKKwkJLy8JCXBhc3NlZCBldmVudAorCQkvLyBldnQ6IE9wdGlvbmFsIGZvciBJRS4gVGhlIG5hdGl2ZSBldmVudCBvYmplY3QuCisJCWlmKHdpbmRvdy5ldmVudCl7CisJCQlldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwkJCWV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQl9ZWxzZXsKKwkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOworCQkJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworCQl9CisJfQorfQorCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwljb21tb246IFsiZG9qby5ldmVudC5jb21tb24iLCAiZG9qby5ldmVudC50b3BpYyJdLAorCWJyb3dzZXI6IFsiZG9qby5ldmVudC5icm93c2VyIl0sCisJZGFzaGJvYXJkOiBbImRvam8uZXZlbnQuYnJvd3NlciJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5ldmVudC4qIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5nZnguY29sb3IiKTsKKworCisKKy8vIFRPRE86IHJld3JpdGUgdGhlICJ4MnkiIG1ldGhvZHMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHBhcnNpbmcKKy8vICAgICAgIGFiaWxpdGllcyBvZiB0aGUgQ29sb3Igb2JqZWN0LiBBbHNvLCBiZWVmIHVwIHRoZSBDb2xvcgorLy8gICAgICAgb2JqZWN0IChhcyBwb3NzaWJsZSkgdG8gcGFyc2UgbW9zdCBjb21tb24gZm9ybWF0cworCisvLyB0YWtlcyBhbiByLCBnLCBiLCBhKGxwaGEpIHZhbHVlLCBbciwgZywgYiwgYV0gYXJyYXksICJyZ2IoLi4uKSIgc3RyaW5nLCBoZXggc3RyaW5nICgjYWFhLCAjYWFhYWFhLCBhYWFhYWFhKQorZG9qby5nZnguY29sb3IuQ29sb3IgPSBmdW5jdGlvbihyLCBnLCBiLCBhKSB7CisJLy8gZG9qby5kZWJ1ZygicjoiLCByWzBdLCAiZzoiLCByWzFdLCAiYjoiLCByWzJdKTsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShyKSl7CisJCXRoaXMuciA9IHJbMF07CisJCXRoaXMuZyA9IHJbMV07CisJCXRoaXMuYiA9IHJbMl07CisJCXRoaXMuYSA9IHJbM118fDEuMDsKKwl9ZWxzZSBpZihkb2pvLmxhbmcuaXNTdHJpbmcocikpeworCQl2YXIgcmdiID0gZG9qby5nZnguY29sb3IuZXh0cmFjdFJHQihyKTsKKwkJdGhpcy5yID0gcmdiWzBdOworCQl0aGlzLmcgPSByZ2JbMV07CisJCXRoaXMuYiA9IHJnYlsyXTsKKwkJdGhpcy5hID0gZ3x8MS4wOworCX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBkb2pvLmdmeC5jb2xvci5Db2xvcil7CisJCS8vIHdoeSBkb2VzIHRoaXMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGlmIHdlIHdlcmUgcGFzc2VkIG9uZT8KKwkJdGhpcy5yID0gci5yOworCQl0aGlzLmIgPSByLmI7CisJCXRoaXMuZyA9IHIuZzsKKwkJdGhpcy5hID0gci5hOworCX1lbHNleworCQl0aGlzLnIgPSByOworCQl0aGlzLmcgPSBnOworCQl0aGlzLmIgPSBiOworCQl0aGlzLmEgPSBhOworCX0KK30KKworZG9qby5nZnguY29sb3IuQ29sb3IuZnJvbUFycmF5ID0gZnVuY3Rpb24oYXJyKSB7CisJcmV0dXJuIG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10pOworfQorCitkb2pvLmV4dGVuZChkb2pvLmdmeC5jb2xvci5Db2xvciwgeworCXRvUmdiOiBmdW5jdGlvbihpbmNsdWRlQWxwaGEpIHsKKwkJaWYoaW5jbHVkZUFscGhhKSB7CisJCQlyZXR1cm4gdGhpcy50b1JnYmEoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYl07CisJCX0KKwl9LAorCXRvUmdiYTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hXTsKKwl9LAorCXRvSGV4OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoZXgodGhpcy50b1JnYigpKTsKKwl9LAorCXRvQ3NzOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuICJyZ2IoIiArIHRoaXMudG9SZ2IoKS5qb2luKCkgKyAiKSI7CisJfSwKKwl0b1N0cmluZzogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnRvSGV4KCk7IC8vIGRlY2VudCBkZWZhdWx0PworCX0sCisJYmxlbmQ6IGZ1bmN0aW9uKGNvbG9yLCB3ZWlnaHQpeworCQl2YXIgcmdiID0gbnVsbDsKKwkJaWYoZG9qby5sYW5nLmlzQXJyYXkoY29sb3IpKXsKKwkJCXJnYiA9IGNvbG9yOworCQl9ZWxzZSBpZihjb2xvciBpbnN0YW5jZW9mIGRvam8uZ2Z4LmNvbG9yLkNvbG9yKXsKKwkJCXJnYiA9IGNvbG9yLnRvUmdiKCk7CisJCX1lbHNleworCQkJcmdiID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGNvbG9yKS50b1JnYigpOworCQl9CisJCXJldHVybiBkb2pvLmdmeC5jb2xvci5ibGVuZCh0aGlzLnRvUmdiKCksIHJnYiwgd2VpZ2h0KTsKKwl9Cit9KTsKKworZG9qby5nZnguY29sb3IubmFtZWQgPSB7CisJd2hpdGU6ICAgICAgWzI1NSwyNTUsMjU1XSwKKwlibGFjazogICAgICBbMCwwLDBdLAorCXJlZDogICAgICAgIFsyNTUsMCwwXSwKKwlncmVlbjoJICAgIFswLDI1NSwwXSwKKwlsaW1lOgkgICAgWzAsMjU1LDBdLAorCWJsdWU6ICAgICAgIFswLDAsMjU1XSwKKwluYXZ5OiAgICAgICBbMCwwLDEyOF0sCisJZ3JheTogICAgICAgWzEyOCwxMjgsMTI4XSwKKwlzaWx2ZXI6ICAgICBbMTkyLDE5MiwxOTJdCit9OworCitkb2pvLmdmeC5jb2xvci5ibGVuZCA9IGZ1bmN0aW9uKGEsIGIsIHdlaWdodCl7CisJLy8gc3VtbWFyeTogCisJLy8JCWJsZW5kIGNvbG9ycyBhIGFuZCBiIChib3RoIGFzIFJHQiBhcnJheSBvciBoZXggc3RyaW5ncykgd2l0aCB3ZWlnaHQKKwkvLwkJZnJvbSAtMSB0byArMSwgMCBiZWluZyBhIDUwLzUwIGJsZW5kCisJaWYodHlwZW9mIGEgPT0gInN0cmluZyIpeworCQlyZXR1cm4gZG9qby5nZnguY29sb3IuYmxlbmRIZXgoYSwgYiwgd2VpZ2h0KTsKKwl9CisJaWYoIXdlaWdodCl7CisJCXdlaWdodCA9IDA7CisJfQorCXdlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KC0xLCB3ZWlnaHQpLCAxKTsKKworCS8vIGFsZXg6IHRoaXMgaW50ZXJmYWNlIGJsb3dzLgorCS8vIG1hcCAtMSB0byAxIHRvIHRoZSByYW5nZSAwIHRvIDEKKwl3ZWlnaHQgPSAoKHdlaWdodCArIDEpLzIpOworCQorCXZhciBjID0gW107CisKKwkvLyB2YXIgc3RvcCA9ICgxMDAwKndlaWdodCk7CisJZm9yKHZhciB4ID0gMDsgeCA8IDM7IHgrKyl7CisJCWNbeF0gPSBwYXJzZUludCggYlt4XSArICggKGFbeF0gLSBiW3hdKSAqIHdlaWdodCkgKTsKKwl9CisJcmV0dXJuIGM7Cit9CisKKy8vIHZlcnkgY29udmVuaWVudCBibGVuZCB0aGF0IHRha2VzIGFuZCByZXR1cm5zIGhleCB2YWx1ZXMKKy8vICh3aWxsIGdldCBjYWxsZWQgYXV0b21hdGljYWxseSBieSBibGVuZCB3aGVuIGJsZW5kIGdldHMgc3RyaW5ncykKK2Rvam8uZ2Z4LmNvbG9yLmJsZW5kSGV4ID0gZnVuY3Rpb24oYSwgYiwgd2VpZ2h0KSB7CisJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLnJnYjJoZXgoZG9qby5nZnguY29sb3IuYmxlbmQoZG9qby5nZnguY29sb3IuaGV4MnJnYihhKSwgZG9qby5nZnguY29sb3IuaGV4MnJnYihiKSwgd2VpZ2h0KSk7Cit9CisKKy8vIGdldCBSR0IgYXJyYXkgZnJvbSBjc3Mtc3R5bGUgY29sb3IgZGVjbGFyYXRpb25zCitkb2pvLmdmeC5jb2xvci5leHRyYWN0UkdCID0gZnVuY3Rpb24oY29sb3IpIHsKKwl2YXIgaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCWNvbG9yID0gY29sb3IudG9Mb3dlckNhc2UoKTsKKwlpZiggY29sb3IuaW5kZXhPZigicmdiIikgPT0gMCApIHsKKwkJdmFyIG1hdGNoZXMgPSBjb2xvci5tYXRjaCgvcmdiYSpcKChcZCspLCAqKFxkKyksICooXGQrKS9pKTsKKwkJdmFyIHJldCA9IG1hdGNoZXMuc3BsaWNlKDEsIDMpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXZhciBjb2xvcnMgPSBkb2pvLmdmeC5jb2xvci5oZXgycmdiKGNvbG9yKTsKKwkJaWYoY29sb3JzKSB7CisJCQlyZXR1cm4gY29sb3JzOworCQl9IGVsc2UgeworCQkJLy8gbmFtZWQgY29sb3IgKGhvdyBtYW55IGRvIHdlIHN1cHBvcnQ/KQorCQkJcmV0dXJuIGRvam8uZ2Z4LmNvbG9yLm5hbWVkW2NvbG9yXSB8fCBbMjU1LCAyNTUsIDI1NV07CisJCX0KKwl9Cit9CisKK2Rvam8uZ2Z4LmNvbG9yLmhleDJyZ2IgPSBmdW5jdGlvbihoZXgpIHsKKwl2YXIgaGV4TnVtID0gIjAxMjM0NTY3ODlBQkNERUYiOworCXZhciByZ2IgPSBuZXcgQXJyYXkoMyk7CisJaWYoIGhleC5pbmRleE9mKCIjIikgPT0gMCApIHsgaGV4ID0gaGV4LnN1YnN0cmluZygxKTsgfQorCWhleCA9IGhleC50b1VwcGVyQ2FzZSgpOworCWlmKGhleC5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiK2hleE51bSsiXSIsICJnIiksICIiKSAhPSAiIikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYoIGhleC5sZW5ndGggPT0gMyApIHsKKwkJcmdiWzBdID0gaGV4LmNoYXJBdCgwKSArIGhleC5jaGFyQXQoMCkKKwkJcmdiWzFdID0gaGV4LmNoYXJBdCgxKSArIGhleC5jaGFyQXQoMSkKKwkJcmdiWzJdID0gaGV4LmNoYXJBdCgyKSArIGhleC5jaGFyQXQoMik7CisJfSBlbHNlIHsKKwkJcmdiWzBdID0gaGV4LnN1YnN0cmluZygwLCAyKTsKKwkJcmdiWzFdID0gaGV4LnN1YnN0cmluZygyLCA0KTsKKwkJcmdiWzJdID0gaGV4LnN1YnN0cmluZyg0KTsKKwl9CisJZm9yKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykgeworCQlyZ2JbaV0gPSBoZXhOdW0uaW5kZXhPZihyZ2JbaV0uY2hhckF0KDApKSAqIDE2ICsgaGV4TnVtLmluZGV4T2YocmdiW2ldLmNoYXJBdCgxKSk7CisJfQorCXJldHVybiByZ2I7Cit9CisKK2Rvam8uZ2Z4LmNvbG9yLnJnYjJoZXggPSBmdW5jdGlvbihyLCBnLCBiKSB7CisJaWYoZG9qby5sYW5nLmlzQXJyYXkocikpIHsKKwkJZyA9IHJbMV0gfHwgMDsKKwkJYiA9IHJbMl0gfHwgMDsKKwkJciA9IHJbMF0gfHwgMDsKKwl9CisJdmFyIHJldCA9IGRvam8ubGFuZy5tYXAoW3IsIGcsIGJdLCBmdW5jdGlvbih4KSB7CisJCXggPSBuZXcgTnVtYmVyKHgpOworCQl2YXIgcyA9IHgudG9TdHJpbmcoMTYpOworCQl3aGlsZShzLmxlbmd0aCA8IDIpIHsgcyA9ICIwIiArIHM7IH0KKwkJcmV0dXJuIHM7CisJfSk7CisJcmV0LnVuc2hpZnQoIiMiKTsKKwlyZXR1cm4gcmV0LmpvaW4oIiIpOworfQorCitkb2pvLnByb3ZpZGUoImRvam8ubGZ4LkFuaW1hdGlvbiIpOworCisKKworLyoKKwlBbmltYXRpb24gcGFja2FnZSBiYXNlZCBvbiBEYW4gUHVwaXVzJyB3b3JrOiBodHRwOi8vcHVwaXVzLmNvLnVrL2pzL1Rvb2xraXQuRHJhd2luZy5qcworKi8KK2Rvam8ubGZ4LkxpbmUgPSBmdW5jdGlvbigvKmludCovIHN0YXJ0LCAvKmludCovIGVuZCl7CisJLy8gc3VtbWFyeTogZG9qby5sZnguTGluZSBpcyB0aGUgb2JqZWN0IHVzZWQgdG8gZ2VuZXJhdGUgdmFsdWVzCisJLy8JCQlmcm9tIGEgc3RhcnQgdmFsdWUgdG8gYW4gZW5kIHZhbHVlCisJdGhpcy5zdGFydCA9IHN0YXJ0OworCXRoaXMuZW5kID0gZW5kOworCWlmKGRvam8ubGFuZy5pc0FycmF5KHN0YXJ0KSl7CisJCS8qIHN0YXJ0OiBBcnJheQorCQkgICBlbmQ6IEFycmF5CisJCSAgIHBJZDogYSAqLworCQl2YXIgZGlmZiA9IFtdOworCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLnN0YXJ0LCBmdW5jdGlvbihzLGkpeworCQkJZGlmZltpXSA9IHRoaXMuZW5kW2ldIC0gczsKKwkJfSwgdGhpcyk7CisJCQorCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oLypmbG9hdCovIG4peworCQkJdmFyIHJlcyA9IFtdOworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5zdGFydCwgZnVuY3Rpb24ocywgaSl7CisJCQkJcmVzW2ldID0gKGRpZmZbaV0gKiBuKSArIHM7CisJCQl9LCB0aGlzKTsKKwkJCXJldHVybiByZXM7IC8vIEFycmF5CisJCX0KKwl9ZWxzZXsKKwkJdmFyIGRpZmYgPSBlbmQgLSBzdGFydDsKKwkJCQorCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oLypmbG9hdCovIG4peworCQkJLy8Jc3VtbWFyeTogcmV0dXJucyB0aGUgcG9pbnQgb24gdGhlIGxpbmUKKwkJCS8vCW46IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMQorCQkJcmV0dXJuIChkaWZmICogbikgKyB0aGlzLnN0YXJ0OyAvLyBEZWNpbWFsCisJCX0KKwl9Cit9CisKK2lmKChkb2pvLnJlbmRlci5odG1sLmtodG1sKSYmKCFkb2pvLnJlbmRlci5odG1sLnNhZmFyaSkpeworCS8vIHRoZSBjb29sIGtpZHMgYXJlIG9idmlvdXNseSBub3QgdXNpbmcga29ucXVlcm9yLi4uCisJLy8gZm91bmQgYSB2ZXJ5IHdpZXJkIGJ1ZyBpbiBmbG9hdHMgY29uc3RhbnRzLCAxLjUgZXZhbHMgYXMgMQorCS8vIHNlZW1zIHNvbWVib2R5IG1peGVkIHVwIGludHMgYW5kIGZsb2F0cyBpbiAzLjUuNCA/PworCS8vIEZJWE1FOiBpbnZlc3RpZ2F0ZSBtb3JlIGFuZCBwb3N0IGEgS0RFIGJ1ZyAoRnJlZHJpaykKKwlkb2pvLmxmeC5lYXNlRGVmYXVsdCA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkJLy8Jc3VtbWFyeTogUmV0dXJucyB0aGUgcG9pbnQgZm9yIHBvaW50IG4gb24gYSBzaW4gd2F2ZS4KKwkJcmV0dXJuIChwYXJzZUZsb2F0KCIwLjUiKSsoKE1hdGguc2luKCAobitwYXJzZUZsb2F0KCIxLjUiKSkgKiBNYXRoLlBJKSkvMikpOworCX0KK31lbHNleworCWRvam8ubGZ4LmVhc2VEZWZhdWx0ID0gZnVuY3Rpb24oLypEZWNpbWFsPyovIG4peworCQlyZXR1cm4gKDAuNSsoKE1hdGguc2luKCAobisxLjUpICogTWF0aC5QSSkpLzIpKTsKKwl9Cit9CisKK2Rvam8ubGZ4LmVhc2VJbiA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkvLwlzdW1tYXJ5OiByZXR1cm5zIHRoZSBwb2ludCBvbiBhbiBlYXNpbmcgY3VydmUKKwkvLwluOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEKKwlyZXR1cm4gTWF0aC5wb3cobiwgMyk7Cit9CisKK2Rvam8ubGZ4LmVhc2VPdXQgPSBmdW5jdGlvbigvKkRlY2ltYWw/Ki8gbil7CisJLy8Jc3VtbWFyeTogcmV0dXJucyB0aGUgcG9pbnQgb24gdGhlIGxpbmUKKwkvLwluOiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEKKwlyZXR1cm4gKCAxIC0gTWF0aC5wb3coMSAtIG4sIDMpICk7Cit9CisKK2Rvam8ubGZ4LmVhc2VJbk91dCA9IGZ1bmN0aW9uKC8qRGVjaW1hbD8qLyBuKXsKKwkvLwlzdW1tYXJ5OiByZXR1cm5zIHRoZSBwb2ludCBvbiB0aGUgbGluZQorCS8vCW46IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMQorCXJldHVybiAoICgzICogTWF0aC5wb3cobiwgMikpIC0gKDIgKiBNYXRoLnBvdyhuLCAzKSkgKTsKK30KKworZG9qby5sZnguSUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeTogZG9qby5sZnguSUFuaW1hdGlvbiBpcyBhbiBpbnRlcmZhY2UgdGhhdCBpbXBsZW1lbnRzCisJLy8JCQljb21tb25seSB1c2VkIGZ1bmN0aW9ucyBvZiBhbmltYXRpb24gb2JqZWN0cworfQorZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5JQW5pbWF0aW9uLCB7CisJLy8gcHVibGljIHByb3BlcnRpZXMKKwljdXJ2ZTogbnVsbCwKKwlkdXJhdGlvbjogMTAwMCwKKwllYXNpbmc6IG51bGwsCisJcmVwZWF0Q291bnQ6IDAsCisJcmF0ZTogMTAsCisJCisJLy8gZXZlbnRzCisJaGFuZGxlcjogbnVsbCwKKwliZWZvcmVCZWdpbjogbnVsbCwKKwlvbkJlZ2luOiBudWxsLAorCW9uQW5pbWF0ZTogbnVsbCwKKwlvbkVuZDogbnVsbCwKKwlvblBsYXk6IG51bGwsCisJb25QYXVzZTogbnVsbCwKKwlvblN0b3A6IG51bGwsCisJCisJLy8gcHVibGljIG1ldGhvZHMKKwlwbGF5OiBudWxsLAorCXBhdXNlOiBudWxsLAorCXN0b3A6IG51bGwsCisJCisJY29ubmVjdDogZnVuY3Rpb24oLypFdmVudCovIGV2dCwgLypPYmplY3QqLyBzY29wZSwgLypGdW5jdGlvbiovIG5ld0Z1bmMpeworCQkvLyBzdW1tYXJ5OiBDb252ZW5pZW5jZSBmdW5jdGlvbi4gIFF1aWNrbHkgY29ubmVjdCB0byBhbiBldmVudAorCQkvLwkJCW9mIHRoaXMgb2JqZWN0IGFuZCBzYXZlIHRoZSBvbGQgZnVuY3Rpb25zIGNvbm5lY3RlZCB0byBpdC4KKwkJLy8gZXZ0OiBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gY29ubmVjdCB0by4KKwkJLy8gc2NvcGU6IHRoZSBzY29wZSBpbiB3aGljaCB0byBydW4gbmV3RnVuYy4KKwkJLy8gbmV3RnVuYzogdGhlIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIGV2dCBpcyBmaXJlZC4KKwkJaWYoIW5ld0Z1bmMpeworCQkJLyogc2NvcGU6IEZ1bmN0aW9uCisJCQkgICBuZXdGdW5jOiBudWxsCisJCQkgICBwSWQ6IGYgKi8KKwkJCW5ld0Z1bmMgPSBzY29wZTsKKwkJCXNjb3BlID0gdGhpczsKKwkJfQorCQluZXdGdW5jID0gZG9qby5sYW5nLmhpdGNoKHNjb3BlLCBuZXdGdW5jKTsKKwkJdmFyIG9sZEZ1bmMgPSB0aGlzW2V2dF18fGZ1bmN0aW9uKCl7fTsKKwkJdGhpc1tldnRdID0gZnVuY3Rpb24oKXsKKwkJCXZhciByZXQgPSBvbGRGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQluZXdGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKworCWZpcmU6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQsIC8qQXJyYXkqLyBhcmdzKXsKKwkJLy8gc3VtbWFyeTogQ29udmVuaWVuY2UgZnVuY3Rpb24uICBGaXJlIGV2ZW50ICJldnQiIGFuZCBwYXNzIGl0CisJCS8vCQkJdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gImFyZ3MiLgorCQkvLyBldnQ6IFRoZSBldmVudCB0byBmaXJlLgorCQkvLyBhcmdzOiBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50LgorCQlpZih0aGlzW2V2dF0peworCQkJdGhpc1tldnRdLmFwcGx5KHRoaXMsIChhcmdzfHxbXSkpOworCQl9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKwkKKwlyZXBlYXQ6IGZ1bmN0aW9uKC8qaW50Ki8gY291bnQpeworCQkvLyBzdW1tYXJ5OiBTZXQgdGhlIHJlcGVhdCBjb3VudCBvZiB0aGlzIG9iamVjdC4KKwkJLy8gY291bnQ6IEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uLgorCQl0aGlzLnJlcGVhdENvdW50ID0gY291bnQ7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5JQW5pbWF0aW9uCisJfSwKKworCS8vIHByaXZhdGUgcHJvcGVydGllcworCV9hY3RpdmU6IGZhbHNlLAorCV9wYXVzZWQ6IGZhbHNlCit9KTsKKworZG9qby5sZnguQW5pbWF0aW9uID0gZnVuY3Rpb24oCS8qT2JqZWN0Ki8gaGFuZGxlcnMsIAorCQkJCQkJCQkvKmludCovIGR1cmF0aW9uLCAKKwkJCQkJCQkJLypkb2pvLmxmeC5MaW5lKi8gY3VydmUsIAorCQkJCQkJCQkvKmZ1bmN0aW9uKi8gZWFzaW5nLCAKKwkJCQkJCQkJLyppbnQqLyByZXBlYXRDb3VudCwgCisJCQkJCQkJCS8qaW50Ki8gcmF0ZSl7CisJLy8Jc3VtbWFyeQorCS8vCQlhIGdlbmVyaWMgYW5pbWF0aW9uIG9iamVjdCB0aGF0IGZpcmVzIGNhbGxiYWNrcyBpbnRvIGl0J3MgaGFuZGxlcnMKKwkvLwkJb2JqZWN0IGF0IHZhcmlvdXMgc3RhdGVzCisJLy8JaGFuZGxlcnM6IHsgaGFuZGxlcjogRnVuY3Rpb24/LCBvbnN0YXJ0OiBGdW5jdGlvbj8sIG9uc3RvcDogRnVuY3Rpb24/LCBvbmFuaW1hdGU6IEZ1bmN0aW9uPyB9CisJZG9qby5sZnguSUFuaW1hdGlvbi5jYWxsKHRoaXMpOworCWlmKGRvam8ubGFuZy5pc051bWJlcihoYW5kbGVycyl8fCghaGFuZGxlcnMgJiYgZHVyYXRpb24uZ2V0VmFsdWUpKXsKKwkJLy8gbm8gaGFuZGxlcnMgYXJndW1lbnQ6CisJCXJhdGUgPSByZXBlYXRDb3VudDsKKwkJcmVwZWF0Q291bnQgPSBlYXNpbmc7CisJCWVhc2luZyA9IGN1cnZlOworCQljdXJ2ZSA9IGR1cmF0aW9uOworCQlkdXJhdGlvbiA9IGhhbmRsZXJzOworCQloYW5kbGVycyA9IG51bGw7CisJfWVsc2UgaWYoaGFuZGxlcnMuZ2V0VmFsdWV8fGRvam8ubGFuZy5pc0FycmF5KGhhbmRsZXJzKSl7CisJCS8vIG5vIGhhbmRsZXJzIG9yIGR1cmF0aW9uOgorCQlyYXRlID0gZWFzaW5nOworCQlyZXBlYXRDb3VudCA9IGN1cnZlOworCQllYXNpbmcgPSBkdXJhdGlvbjsKKwkJY3VydmUgPSBoYW5kbGVyczsKKwkJZHVyYXRpb24gPSBudWxsOworCQloYW5kbGVycyA9IG51bGw7CisJfQorCWlmKGRvam8ubGFuZy5pc0FycmF5KGN1cnZlKSl7CisJCS8qIGN1cnZlOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJdGhpcy5jdXJ2ZSA9IG5ldyBkb2pvLmxmeC5MaW5lKGN1cnZlWzBdLCBjdXJ2ZVsxXSk7CisJfWVsc2V7CisJCXRoaXMuY3VydmUgPSBjdXJ2ZTsKKwl9CisJaWYoZHVyYXRpb24gIT0gbnVsbCAmJiBkdXJhdGlvbiA+IDApeyB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247IH0KKwlpZihyZXBlYXRDb3VudCl7IHRoaXMucmVwZWF0Q291bnQgPSByZXBlYXRDb3VudDsgfQorCWlmKHJhdGUpeyB0aGlzLnJhdGUgPSByYXRlOyB9CisJaWYoaGFuZGxlcnMpeworCQlkb2pvLmxhbmcuZm9yRWFjaChbCisJCQkJImhhbmRsZXIiLCAiYmVmb3JlQmVnaW4iLCAib25CZWdpbiIsIAorCQkJCSJvbkVuZCIsICJvblBsYXkiLCAib25TdG9wIiwgIm9uQW5pbWF0ZSIKKwkJCV0sIGZ1bmN0aW9uKGl0ZW0peworCQkJCWlmKGhhbmRsZXJzW2l0ZW1dKXsKKwkJCQkJdGhpcy5jb25uZWN0KGl0ZW0sIGhhbmRsZXJzW2l0ZW1dKTsKKwkJCQl9CisJCQl9LCB0aGlzKTsKKwl9CisJaWYoZWFzaW5nICYmIGRvam8ubGFuZy5pc0Z1bmN0aW9uKGVhc2luZykpeworCQl0aGlzLmVhc2luZz1lYXNpbmc7CisJfQorfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5BbmltYXRpb24sIGRvam8ubGZ4LklBbmltYXRpb24pOworZG9qby5sYW5nLmV4dGVuZChkb2pvLmxmeC5BbmltYXRpb24sIHsKKwkvLyAicHJpdmF0ZSIgcHJvcGVydGllcworCV9zdGFydFRpbWU6IG51bGwsCisJX2VuZFRpbWU6IG51bGwsCisJX3RpbWVyOiBudWxsLAorCV9wZXJjZW50OiAwLAorCV9zdGFydFJlcGVhdENvdW50OiAwLAorCisJLy8gcHVibGljIG1ldGhvZHMKKwlwbGF5OiBmdW5jdGlvbigvKmludD8qLyBkZWxheSwgLypib29sPyovIGdvdG9TdGFydCl7CisJCS8vIHN1bW1hcnk6IFN0YXJ0IHRoZSBhbmltYXRpb24uCisJCS8vIGRlbGF5OiBIb3cgbWFueSBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHN0YXJ0aW5nLgorCQkvLyBnb3RvU3RhcnQ6IElmIHRydWUsIHN0YXJ0cyB0aGUgYW5pbWF0aW9uIGZyb20gdGhlIGJlZ2lubmluZzsgb3RoZXJ3aXNlLAorCQkvLyAgICAgICAgICAgIHN0YXJ0cyBpdCBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uLgorCQlpZihnb3RvU3RhcnQpeworCQkJY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKKwkJCXRoaXMuX2FjdGl2ZSA9IGZhbHNlOworCQkJdGhpcy5fcGF1c2VkID0gZmFsc2U7CisJCQl0aGlzLl9wZXJjZW50ID0gMDsKKwkJfWVsc2UgaWYodGhpcy5fYWN0aXZlICYmICF0aGlzLl9wYXVzZWQpeworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCQl9CisJCQorCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImJlZm9yZUJlZ2luIl0pOworCQl0aGlzLmZpcmUoImJlZm9yZUJlZ2luIik7CisKKwkJaWYoZGVsYXkgPiAwKXsKKwkJCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMucGxheShudWxsLCBnb3RvU3RhcnQpOyB9KSwgZGVsYXkpOworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCQl9CisJCQorCQl0aGlzLl9zdGFydFRpbWUgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJaWYodGhpcy5fcGF1c2VkKXsKKwkJCXRoaXMuX3N0YXJ0VGltZSAtPSAodGhpcy5kdXJhdGlvbiAqIHRoaXMuX3BlcmNlbnQgLyAxMDApOworCQl9CisJCXRoaXMuX2VuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLmR1cmF0aW9uOworCisJCXRoaXMuX2FjdGl2ZSA9IHRydWU7CisJCXRoaXMuX3BhdXNlZCA9IGZhbHNlOworCQkKKwkJdmFyIHN0ZXAgPSB0aGlzLl9wZXJjZW50IC8gMTAwOworCQl2YXIgdmFsdWUgPSB0aGlzLmN1cnZlLmdldFZhbHVlKHN0ZXApOworCQlpZih0aGlzLl9wZXJjZW50ID09IDAgKXsKKwkJCWlmKCF0aGlzLl9zdGFydFJlcGVhdENvdW50KXsKKwkJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gdGhpcy5yZXBlYXRDb3VudDsKKwkJCX0KKwkJCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsiYmVnaW4iLCB2YWx1ZV0pOworCQkJdGhpcy5maXJlKCJvbkJlZ2luIiwgW3ZhbHVlXSk7CisJCX0KKworCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbInBsYXkiLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uUGxheSIsIFt2YWx1ZV0pOworCisJCXRoaXMuX2N5Y2xlKCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KKwl9LAorCisJcGF1c2U6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFBhdXNlcyBhIHJ1bm5pbmcgYW5pbWF0aW9uLgorCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQlpZighdGhpcy5fYWN0aXZlKXsgcmV0dXJuIHRoaXM7IC8qZG9qby5sZnguQW5pbWF0aW9uKi99CisJCXRoaXMuX3BhdXNlZCA9IHRydWU7CisJCXZhciB2YWx1ZSA9IHRoaXMuY3VydmUuZ2V0VmFsdWUodGhpcy5fcGVyY2VudCAvIDEwMCk7CisJCXRoaXMuZmlyZSgiaGFuZGxlciIsIFsicGF1c2UiLCB2YWx1ZV0pOworCQl0aGlzLmZpcmUoIm9uUGF1c2UiLCBbdmFsdWVdKTsKKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorCX0sCisKKwlnb3RvUGVyY2VudDogZnVuY3Rpb24oLypEZWNpbWFsKi8gcGN0LCAvKmJvb2w/Ki8gYW5kUGxheSl7CisJCS8vIHN1bW1hcnk6IFNldHMgdGhlIHByb2dyZXNzIG9mIHRoZSBhbmltYXRpb24uCisJCS8vIHBjdDogQSBwZXJjZW50YWdlIGluIGRlY2ltYWwgbm90YXRpb24gKGJldHdlZW4gYW5kIGluY2x1ZGluZyAwLjAgYW5kIDEuMCkuCisJCS8vIGFuZFBsYXk6IElmIHRydWUsIHBsYXkgdGhlIGFuaW1hdGlvbiBhZnRlciBzZXR0aW5nIHRoZSBwcm9ncmVzcy4KKwkJY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTsKKwkJdGhpcy5fYWN0aXZlID0gdHJ1ZTsKKwkJdGhpcy5fcGF1c2VkID0gdHJ1ZTsKKwkJdGhpcy5fcGVyY2VudCA9IHBjdDsKKwkJaWYoYW5kUGxheSl7IHRoaXMucGxheSgpOyB9CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KKwl9LAorCisJc3RvcDogZnVuY3Rpb24oLypib29sPyovIGdvdG9FbmQpeworCQkvLyBzdW1tYXJ5OiBTdG9wcyBhIHJ1bm5pbmcgYW5pbWF0aW9uLgorCQkvLyBnb3RvRW5kOiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgZW5kLgorCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQl2YXIgc3RlcCA9IHRoaXMuX3BlcmNlbnQgLyAxMDA7CisJCWlmKGdvdG9FbmQpeworCQkJc3RlcCA9IDE7CisJCX0KKwkJdmFyIHZhbHVlID0gdGhpcy5jdXJ2ZS5nZXRWYWx1ZShzdGVwKTsKKwkJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJzdG9wIiwgdmFsdWVdKTsKKwkJdGhpcy5maXJlKCJvblN0b3AiLCBbdmFsdWVdKTsKKwkJdGhpcy5fYWN0aXZlID0gZmFsc2U7CisJCXRoaXMuX3BhdXNlZCA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQW5pbWF0aW9uCisJfSwKKworCXN0YXR1czogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIG9mCisJCS8vCQkJdGhlIGFuaW1hdGlvbi4KKwkJaWYodGhpcy5fYWN0aXZlKXsKKwkJCXJldHVybiB0aGlzLl9wYXVzZWQgPyAicGF1c2VkIiA6ICJwbGF5aW5nIjsgLy8gU3RyaW5nCisJCX1lbHNleworCQkJcmV0dXJuICJzdG9wcGVkIjsgLy8gU3RyaW5nCisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCS8vICJwcml2YXRlIiBtZXRob2RzCisJX2N5Y2xlOiBmdW5jdGlvbigpeworCQljbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworCQlpZih0aGlzLl9hY3RpdmUpeworCQkJdmFyIGN1cnIgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTsKKwkJCXZhciBzdGVwID0gKGN1cnIgLSB0aGlzLl9zdGFydFRpbWUpIC8gKHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUpOworCisJCQlpZihzdGVwID49IDEpeworCQkJCXN0ZXAgPSAxOworCQkJCXRoaXMuX3BlcmNlbnQgPSAxMDA7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLl9wZXJjZW50ID0gc3RlcCAqIDEwMDsKKwkJCX0KKwkJCQorCQkJLy8gUGVyZm9ybSBlYXNpbmcKKwkJCWlmKCh0aGlzLmVhc2luZykmJihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmVhc2luZykpKXsKKwkJCQlzdGVwID0gdGhpcy5lYXNpbmcoc3RlcCk7CisJCQl9CisKKwkJCXZhciB2YWx1ZSA9IHRoaXMuY3VydmUuZ2V0VmFsdWUoc3RlcCk7CisJCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImFuaW1hdGUiLCB2YWx1ZV0pOworCQkJdGhpcy5maXJlKCJvbkFuaW1hdGUiLCBbdmFsdWVdKTsKKworCQkJaWYoIHN0ZXAgPCAxICl7CisJCQkJdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX2N5Y2xlIiksIHRoaXMucmF0ZSk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLl9hY3RpdmUgPSBmYWxzZTsKKwkJCQl0aGlzLmZpcmUoImhhbmRsZXIiLCBbImVuZCJdKTsKKwkJCQl0aGlzLmZpcmUoIm9uRW5kIik7CisKKwkJCQlpZih0aGlzLnJlcGVhdENvdW50ID4gMCl7CisJCQkJCXRoaXMucmVwZWF0Q291bnQtLTsKKwkJCQkJdGhpcy5wbGF5KG51bGwsIHRydWUpOworCQkJCX1lbHNlIGlmKHRoaXMucmVwZWF0Q291bnQgPT0gLTEpeworCQkJCQl0aGlzLnBsYXkobnVsbCwgdHJ1ZSk7CisJCQkJfWVsc2V7CisJCQkJCWlmKHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQpeworCQkJCQkJdGhpcy5yZXBlYXRDb3VudCA9IHRoaXMuX3N0YXJ0UmVwZWF0Q291bnQ7CisJCQkJCQl0aGlzLl9zdGFydFJlcGVhdENvdW50ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQW5pbWF0aW9uCisJfQorfSk7CisKK2Rvam8ubGZ4LkNvbWJpbmUgPSBmdW5jdGlvbigvKmRvam8ubGZ4LklBbmltYXRpb24uLi4qLyBhbmltYXRpb25zKXsKKwkvLyBzdW1tYXJ5OiBBbiBhbmltYXRpb24gb2JqZWN0IHRvIHBsYXkgYW5pbWF0aW9ucyBwYXNzZWQgdG8gaXQgYXQgdGhlIHNhbWUgdGltZS4KKwlkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7CisJdGhpcy5fYW5pbXMgPSBbXTsKKwl0aGlzLl9hbmltc0VuZGVkID0gMDsKKwkKKwl2YXIgYW5pbXMgPSBhcmd1bWVudHM7CisJaWYoYW5pbXMubGVuZ3RoID09IDEgJiYgKGRvam8ubGFuZy5pc0FycmF5KGFuaW1zWzBdKSB8fCBkb2pvLmxhbmcuaXNBcnJheUxpa2UoYW5pbXNbMF0pKSl7CisJCS8qIGFuaW1hdGlvbnM6IGRvam8ubGZ4LklBbmltYXRpb25bXQorCQkgICBwSWQ6IGEgKi8KKwkJYW5pbXMgPSBhbmltc1swXTsKKwl9CisJCisJZG9qby5sYW5nLmZvckVhY2goYW5pbXMsIGZ1bmN0aW9uKGFuaW0peworCQl0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJfb25Bbmltc0VuZGVkIikpOworCX0sIHRoaXMpOworfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5Db21iaW5lLCBkb2pvLmxmeC5JQW5pbWF0aW9uKTsKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5sZnguQ29tYmluZSwgeworCS8vIHByaXZhdGUgbWVtYmVycworCV9hbmltc0VuZGVkOiAwLAorCQorCS8vIHB1YmxpYyBtZXRob2RzCisJcGxheTogZnVuY3Rpb24oLyppbnQ/Ki8gZGVsYXksIC8qYm9vbD8qLyBnb3RvU3RhcnQpeworCQkvLyBzdW1tYXJ5OiBTdGFydCB0aGUgYW5pbWF0aW9ucy4KKwkJLy8gZGVsYXk6IEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcuCisJCS8vIGdvdG9TdGFydDogSWYgdHJ1ZSwgc3RhcnRzIHRoZSBhbmltYXRpb25zIGZyb20gdGhlIGJlZ2lubmluZzsgb3RoZXJ3aXNlLAorCQkvLyAgICAgICAgICAgIHN0YXJ0cyB0aGVtIGZyb20gdGhlaXIgY3VycmVudCBwb3NpdGlvbi4KKwkJaWYoICF0aGlzLl9hbmltcy5sZW5ndGggKXsgcmV0dXJuIHRoaXM7IC8qZG9qby5sZnguQ29tYmluZSovfQorCisJCXRoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKKworCQlpZihkZWxheSA+IDApeworCQkJc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24oKXsgdGhpcy5wbGF5KG51bGwsIGdvdG9TdGFydCk7IH0pLCBkZWxheSk7CisJCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCQl9CisJCQorCQlpZihnb3RvU3RhcnQgfHwgdGhpcy5fYW5pbXNbMF0ucGVyY2VudCA9PSAwKXsKKwkJCXRoaXMuZmlyZSgib25CZWdpbiIpOworCQl9CisJCXRoaXMuZmlyZSgib25QbGF5Iik7CisJCXRoaXMuX2FuaW1zQ2FsbCgicGxheSIsIG51bGwsIGdvdG9TdGFydCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5Db21iaW5lCisJfSwKKwkKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUGF1c2VzIHRoZSBydW5uaW5nIGFuaW1hdGlvbnMuCisJCXRoaXMuZmlyZSgib25QYXVzZSIpOworCQl0aGlzLl9hbmltc0NhbGwoInBhdXNlIik7IAorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCX0sCisJCisJc3RvcDogZnVuY3Rpb24oLypib29sPyovIGdvdG9FbmQpeworCQkvLyBzdW1tYXJ5OiBTdG9wcyB0aGUgcnVubmluZyBhbmltYXRpb25zLgorCQkvLyBnb3RvRW5kOiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9ucyB3aWxsIGVuZC4KKwkJdGhpcy5maXJlKCJvblN0b3AiKTsKKwkJdGhpcy5fYW5pbXNDYWxsKCJzdG9wIiwgZ290b0VuZCk7CisJCXJldHVybiB0aGlzOyAvLyBkb2pvLmxmeC5Db21iaW5lCisJfSwKKwkKKwkvLyBwcml2YXRlIG1ldGhvZHMKKwlfb25Bbmltc0VuZGVkOiBmdW5jdGlvbigpeworCQl0aGlzLl9hbmltc0VuZGVkKys7CisJCWlmKHRoaXMuX2FuaW1zRW5kZWQgPj0gdGhpcy5fYW5pbXMubGVuZ3RoKXsKKwkJCXRoaXMuZmlyZSgib25FbmQiKTsKKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ29tYmluZQorCX0sCisJCisJX2FuaW1zQ2FsbDogZnVuY3Rpb24oLypTdHJpbmcqLyBmdW5jTmFtZSl7CisJCXZhciBhcmdzID0gW107CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsKKwkJCWZvcih2YXIgaSA9IDEgOyBpIDwgYXJndW1lbnRzLmxlbmd0aCA7IGkrKyl7CisJCQkJYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CisJCQl9CisJCX0KKwkJdmFyIF90aGlzID0gdGhpczsKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy5fYW5pbXMsIGZ1bmN0aW9uKGFuaW0peworCQkJYW5pbVtmdW5jTmFtZV0oYXJncyk7CisJCX0sIF90aGlzKTsKKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNvbWJpbmUKKwl9Cit9KTsKKworZG9qby5sZnguQ2hhaW4gPSBmdW5jdGlvbigvKmRvam8ubGZ4LklBbmltYXRpb24uLi4qLyBhbmltYXRpb25zKSB7CisJLy8gc3VtbWFyeTogQW4gYW5pbWF0aW9uIG9iamVjdCB0byBwbGF5IGFuaW1hdGlvbnMgcGFzc2VkIHRvIGl0CisJLy8JCQlvbmUgYWZ0ZXIgYW5vdGhlci4KKwlkb2pvLmxmeC5JQW5pbWF0aW9uLmNhbGwodGhpcyk7CisJdGhpcy5fYW5pbXMgPSBbXTsKKwl0aGlzLl9jdXJyQW5pbSA9IC0xOworCQorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihhbmltcy5sZW5ndGggPT0gMSAmJiAoZG9qby5sYW5nLmlzQXJyYXkoYW5pbXNbMF0pIHx8IGRvam8ubGFuZy5pc0FycmF5TGlrZShhbmltc1swXSkpKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFuaW1zWzBdOworCX0KKwkKKwl2YXIgX3RoaXMgPSB0aGlzOworCWRvam8ubGFuZy5mb3JFYWNoKGFuaW1zLCBmdW5jdGlvbihhbmltLCBpLCBhbmltc19hcnIpeworCQl0aGlzLl9hbmltcy5wdXNoKGFuaW0pOworCQlpZihpIDwgYW5pbXNfYXJyLmxlbmd0aCAtIDEpeworCQkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX3BsYXlOZXh0IikgKTsKKwkJfWVsc2V7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMuZmlyZSgib25FbmQiKTsgfSkgKTsKKwkJfQorCX0sIHRoaXMpOworfQorZG9qby5pbmhlcml0cyhkb2pvLmxmeC5DaGFpbiwgZG9qby5sZnguSUFuaW1hdGlvbik7Citkb2pvLmxhbmcuZXh0ZW5kKGRvam8ubGZ4LkNoYWluLCB7CisJLy8gcHJpdmF0ZSBtZW1iZXJzCisJX2N1cnJBbmltOiAtMSwKKwkKKwkvLyBwdWJsaWMgbWV0aG9kcworCXBsYXk6IGZ1bmN0aW9uKC8qaW50PyovIGRlbGF5LCAvKmJvb2w/Ki8gZ290b1N0YXJ0KXsKKwkJLy8gc3VtbWFyeTogU3RhcnQgdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZS4KKwkJLy8gZGVsYXk6IEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgc3RhcnRpbmcuCisJCS8vIGdvdG9TdGFydDogSWYgdHJ1ZSwgc3RhcnRzIHRoZSBzZXF1ZW5jZSBmcm9tIHRoZSBiZWdpbm5pbmc7IG90aGVyd2lzZSwKKwkJLy8gICAgICAgICAgICBzdGFydHMgaXQgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbi4KKwkJaWYoICF0aGlzLl9hbmltcy5sZW5ndGggKSB7IHJldHVybiB0aGlzOyAvKmRvam8ubGZ4LkNoYWluKi99CisJCWlmKCBnb3RvU3RhcnQgfHwgIXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSApIHsKKwkJCXRoaXMuX2N1cnJBbmltID0gMDsKKwkJfQorCisJCXZhciBjdXJyZW50QW5pbWF0aW9uID0gdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dOworCisJCXRoaXMuZmlyZSgiYmVmb3JlQmVnaW4iKTsKKwkJaWYoZGVsYXkgPiAwKXsKKwkJCXNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7IHRoaXMucGxheShudWxsLCBnb3RvU3RhcnQpOyB9KSwgZGVsYXkpOworCQkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJCX0KKwkJCisJCWlmKGN1cnJlbnRBbmltYXRpb24peworCQkJaWYodGhpcy5fY3VyckFuaW0gPT0gMCl7CisJCQkJdGhpcy5maXJlKCJoYW5kbGVyIiwgWyJiZWdpbiIsIHRoaXMuX2N1cnJBbmltXSk7CisJCQkJdGhpcy5maXJlKCJvbkJlZ2luIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJCQl9CisJCQl0aGlzLmZpcmUoIm9uUGxheSIsIFt0aGlzLl9jdXJyQW5pbV0pOworCQkJY3VycmVudEFuaW1hdGlvbi5wbGF5KG51bGwsIGdvdG9TdGFydCk7CisJCX0KKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJfSwKKwkKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUGF1c2VzIHRoZSBydW5uaW5nIGFuaW1hdGlvbiBzZXF1ZW5jZS4KKwkJaWYoIHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXSApIHsKKwkJCXRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXS5wYXVzZSgpOworCQkJdGhpcy5maXJlKCJvblBhdXNlIiwgW3RoaXMuX2N1cnJBbmltXSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7IC8vIGRvam8ubGZ4LkNoYWluCisJfSwKKwkKKwlwbGF5UGF1c2U6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IElmIHRoZSBhbmltYXRpb24gc2VxdWVuY2UgaXMgcGxheWluZywgcGF1c2UgaXQ7IG90aGVyd2lzZSwKKwkJLy8JCQlwbGF5IGl0LgorCQlpZih0aGlzLl9hbmltcy5sZW5ndGggPT0gMCl7IHJldHVybiB0aGlzOyB9CisJCWlmKHRoaXMuX2N1cnJBbmltID09IC0xKXsgdGhpcy5fY3VyckFuaW0gPSAwOyB9CisJCXZhciBjdXJyQW5pbSA9IHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKKwkJaWYoIGN1cnJBbmltICkgeworCQkJaWYoICFjdXJyQW5pbS5fYWN0aXZlIHx8IGN1cnJBbmltLl9wYXVzZWQgKSB7CisJCQkJdGhpcy5wbGF5KCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucGF1c2UoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ2hhaW4KKwl9LAorCQorCXN0b3A6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFN0b3BzIHRoZSBydW5uaW5nIGFuaW1hdGlvbnMuCisJCXZhciBjdXJyQW5pbSA9IHRoaXMuX2FuaW1zW3RoaXMuX2N1cnJBbmltXTsKKwkJaWYoY3VyckFuaW0peworCQkJY3VyckFuaW0uc3RvcCgpOworCQkJdGhpcy5maXJlKCJvblN0b3AiLCBbdGhpcy5fY3VyckFuaW1dKTsKKwkJfQorCQlyZXR1cm4gY3VyckFuaW07IC8vIGRvam8ubGZ4LklBbmltYXRpb24KKwl9LAorCQorCS8vIHByaXZhdGUgbWV0aG9kcworCV9wbGF5TmV4dDogZnVuY3Rpb24oKXsKKwkJaWYoIHRoaXMuX2N1cnJBbmltID09IC0xIHx8IHRoaXMuX2FuaW1zLmxlbmd0aCA9PSAwICkgeyByZXR1cm4gdGhpczsgfQorCQl0aGlzLl9jdXJyQW5pbSsrOworCQlpZiggdGhpcy5fYW5pbXNbdGhpcy5fY3VyckFuaW1dICl7CisJCQl0aGlzLl9hbmltc1t0aGlzLl9jdXJyQW5pbV0ucGxheShudWxsLCB0cnVlKTsKKwkJfQorCQlyZXR1cm4gdGhpczsgLy8gZG9qby5sZnguQ2hhaW4KKwl9Cit9KTsKKworZG9qby5sZnguY29tYmluZSA9IGZ1bmN0aW9uKC8qZG9qby5sZnguSUFuaW1hdGlvbi4uLiovIGFuaW1hdGlvbnMpeworCS8vIHN1bW1hcnk6IENvbnZlbmllbmNlIGZ1bmN0aW9uLiAgUmV0dXJucyBhIGRvam8ubGZ4LkNvbWJpbmUgY3JlYXRlZAorCS8vCQkJdXNpbmcgdGhlIGFuaW1hdGlvbnMgcGFzc2VkIGluLgorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFyZ3VtZW50c1swXTsKKwl9CisJaWYoYW5pbXMubGVuZ3RoID09IDEpeyByZXR1cm4gYW5pbXNbMF07IH0KKwlyZXR1cm4gbmV3IGRvam8ubGZ4LkNvbWJpbmUoYW5pbXMpOyAvLyBkb2pvLmxmeC5Db21iaW5lCit9CisKK2Rvam8ubGZ4LmNoYWluID0gZnVuY3Rpb24oLypkb2pvLmxmeC5JQW5pbWF0aW9uLi4uKi8gYW5pbWF0aW9ucyl7CisJLy8gc3VtbWFyeTogQ29udmVuaWVuY2UgZnVuY3Rpb24uICBSZXR1cm5zIGEgZG9qby5sZnguQ2hhaW4gY3JlYXRlZAorCS8vCQkJdXNpbmcgdGhlIGFuaW1hdGlvbnMgcGFzc2VkIGluLgorCXZhciBhbmltcyA9IGFyZ3VtZW50czsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShhcmd1bWVudHNbMF0pKXsKKwkJLyogYW5pbWF0aW9uczogZG9qby5sZnguSUFuaW1hdGlvbltdCisJCSAgIHBJZDogYSAqLworCQlhbmltcyA9IGFyZ3VtZW50c1swXTsKKwl9CisJaWYoYW5pbXMubGVuZ3RoID09IDEpeyByZXR1cm4gYW5pbXNbMF07IH0KKwlyZXR1cm4gbmV3IGRvam8ubGZ4LkNoYWluKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5jb21tb24iKTsKKworCisKK2Rvam8ubGFuZy5taXhpbihkb2pvLmh0bWwsIGRvam8uZG9tKTsKKworZG9qby5odG1sLmJvZHkgPSBmdW5jdGlvbigpeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5odG1sLmJvZHkoKSBtb3ZlZCB0byBkb2pvLmJvZHkoKSIsICIwLjUiKTsKKwlyZXR1cm4gZG9qby5ib2R5KCk7Cit9CisKKy8vIEZJWE1FOiB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIHRocm93IGFueSBhbmQgZXZlcnkgcmVuZGVyaW5nCisvLyBlbmdpbmUgaW50byB0aGUgSUUgNS54IGJveCBtb2RlbC4gSW4gTW96aWxsYSwgd2UgZG8gdGhpcyB3LyBDU1MuCisvLyBOZWVkIHRvIGludmVzdGlnYXRlIGZvciBLSFRNTCBhbmQgT3BlcmEKKworZG9qby5odG1sLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24oLyogRE9NRXZlbnQgKi9ldnQpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB0YXJnZXQgb2YgYW4gZXZlbnQKKwlpZighZXZ0KSB7IGV2dCA9IGRvam8uZ2xvYmFsKCkuZXZlbnQgfHwge30gfTsKKwl2YXIgdCA9IChldnQuc3JjRWxlbWVudCA/IGV2dC5zcmNFbGVtZW50IDogKGV2dC50YXJnZXQgPyBldnQudGFyZ2V0IDogbnVsbCkpOworCXdoaWxlKCh0KSYmKHQubm9kZVR5cGUhPTEpKXsgdCA9IHQucGFyZW50Tm9kZTsgfQorCXJldHVybiB0OwkvLwlIVE1MRWxlbWVudAorfQorCitkb2pvLmh0bWwuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWV3YWJsZSBhcmVhIG9mIGEgYnJvd3NlciB3aW5kb3cKKwl2YXIgX3dpbmRvdyA9IGRvam8uZ2xvYmFsKCk7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdmFyIHcgPSAwOworCXZhciBoID0gMDsKKworCWlmKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSl7CisJCS8vIG1vemlsbGEKKwkJdyA9IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CisJCWggPSBfd2luZG93LmlubmVySGVpZ2h0OworCX1lbHNlIGlmKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIF93aW5kb3cuaW5uZXJXaWR0aCl7CisJCS8vaW4gb3BlcmE5LCBkb2pvLmJvZHkoKS5jbGllbnRXaWR0aCBzaG91bGQgYmUgdXNlZCwgaW5zdGVhZAorCQkvL29mIHdpbmRvdy5pbm5lcldpZHRoL2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aAorCQkvL3NvIHdlIGhhdmUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBvcGVyYQorCQl3ID0gX3dpbmRvdy5pbm5lcldpZHRoOworCQloID0gX3dpbmRvdy5pbm5lckhlaWdodDsKKwl9IGVsc2UgaWYgKCFkb2pvLnJlbmRlci5odG1sLm9wZXJhICYmIGRvam8uZXhpc3RzKF9kb2N1bWVudCwgImRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCIpKXsKKwkJLy8gSUU2IFN0cmljdAorCQl2YXIgdzIgPSBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOworCQkvLyB0aGlzIGxldHMgdXMgYWNjb3VudCBmb3Igc2Nyb2xsYmFycworCQlpZighdyB8fCB3MiAmJiB3MiA8IHcpIHsKKwkJCXcgPSB3MjsKKwkJfQorCQloID0gX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CisJfSBlbHNlIGlmIChkb2pvLmJvZHkoKS5jbGllbnRXaWR0aCl7CisJCS8vIElFLCBPcGVyYQorCQl3ID0gZG9qby5ib2R5KCkuY2xpZW50V2lkdGg7CisJCWggPSBkb2pvLmJvZHkoKS5jbGllbnRIZWlnaHQ7CisJfQorCXJldHVybiB7IHdpZHRoOiB3LCBoZWlnaHQ6IGggfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRTY3JvbGwgPSBmdW5jdGlvbigpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50CisJdmFyIF93aW5kb3cgPSBkb2pvLmdsb2JhbCgpOworCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCXZhciB0b3AgPSBfd2luZG93LnBhZ2VZT2Zmc2V0IHx8IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvam8uYm9keSgpLnNjcm9sbFRvcCB8fCAwOworCXZhciBsZWZ0ID0gX3dpbmRvdy5wYWdlWE9mZnNldCB8fCBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9qby5ib2R5KCkuc2Nyb2xsTGVmdCB8fCAwOworCXJldHVybiB7IAorCQl0b3A6IHRvcCwgCisJCWxlZnQ6IGxlZnQsIAorCQlvZmZzZXQ6eyB4OiBsZWZ0LCB5OiB0b3AgfQkvLwlub3RlIHRoZSBjaGFuZ2UsIE5PVCBhbiBBcnJheSB3aXRoIGFkZGVkIHByb3BlcnRpZXMuIAorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0UGFyZW50QnlUeXBlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi90eXBlKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIGZpcnN0IGFuY2VzdG9yIG9mIG5vZGUgd2l0aCB0YWdOYW1lIHR5cGUuCisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJdmFyIHBhcmVudCA9IGRvam8uYnlJZChub2RlKTsKKwl0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworCXdoaWxlKChwYXJlbnQpJiYocGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPXR5cGUpKXsKKwkJaWYocGFyZW50PT0oX2RvY3VtZW50WyJib2R5Il18fF9kb2N1bWVudFsiZG9jdW1lbnRFbGVtZW50Il0pKXsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gcGFyZW50OwkvLwlIVE1MRWxlbWVudAorfQorCitkb2pvLmh0bWwuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9hdHRyKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgdmFsdWUgb2YgYXR0cmlidXRlIGF0dHIgZnJvbSBub2RlLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJLy8gRklYTUU6IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGF0dHItc3BlY2lmaWMgYWNjZXNzb3JzCisJaWYoKCFub2RlKXx8KCFub2RlLmdldEF0dHJpYnV0ZSkpeworCQkvLyBpZihhdHRyICE9PSAnbndUeXBlJyl7CisJCS8vCWFsZXJ0KCJnZXRBdHRyIG9mICciICsgYXR0ciArICInIHdpdGggYmFkIG5vZGUiKTsgCisJCS8vIH0KKwkJcmV0dXJuIG51bGw7CisJfQorCXZhciB0YSA9IHR5cGVvZiBhdHRyID09ICdzdHJpbmcnID8gYXR0ciA6IG5ldyBTdHJpbmcoYXR0cik7CisKKwkvLyBmaXJzdCB0cnkgdGhlIGFwcHJvYWNoIG1vc3QgbGlrZWx5IHRvIHN1Y2NlZWQKKwl2YXIgdiA9IG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvVXBwZXJDYXNlKCkpOworCWlmKCh2KSYmKHR5cGVvZiB2ID09ICdzdHJpbmcnKSYmKHYhPSIiKSl7IAorCQlyZXR1cm4gdjsJLy8Jc3RyaW5nIAorCX0KKworCS8vIHRyeSByZXR1cm5pbmcgdGhlIGF0dHJpYnV0ZXMgdmFsdWUsIGlmIHdlIGNvdWxkbid0IGdldCBpdCBhcyBhIHN0cmluZworCWlmKHYgJiYgdi52YWx1ZSl7IAorCQlyZXR1cm4gdi52YWx1ZTsJLy8Jc3RyaW5nIAorCX0KKworCS8vIHRoaXMgc2hvdWxkIHdvcmsgb24gT3BlcmEgNywgYnV0IGl0J3MgYSBsaXR0bGUgb24gdGhlIGNyYXNoeSBzaWRlCisJaWYoKG5vZGUuZ2V0QXR0cmlidXRlTm9kZSkmJihub2RlLmdldEF0dHJpYnV0ZU5vZGUodGEpKSl7CisJCXJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlKHRhKSkudmFsdWU7CS8vCXN0cmluZworCX1lbHNlIGlmKG5vZGUuZ2V0QXR0cmlidXRlKHRhKSl7CisJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZSh0YSk7CS8vCXN0cmluZworCX1lbHNlIGlmKG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvTG93ZXJDYXNlKCkpKXsKKwkJcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKHRhLnRvTG93ZXJDYXNlKCkpOwkvLwlzdHJpbmcKKwl9CisJcmV0dXJuIG51bGw7CS8vCXN0cmluZworfQorCQorZG9qby5odG1sLmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovYXR0cil7CisJLy8Jc3VtbWFyeQorCS8vCURldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBub2RlIGNhcnJpZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbi4KKwlyZXR1cm4gZG9qby5odG1sLmdldEF0dHJpYnV0ZShkb2pvLmJ5SWQobm9kZSksIGF0dHIpID8gdHJ1ZSA6IGZhbHNlOwkvLwlib29sZWFuCit9CisJCitkb2pvLmh0bWwuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbigvKiBET01FdmVudCAqL2UpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBtb3VzZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgKG5vdCB0aGUgdmlld3BvcnQpLgorCS8vCUZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRvY3VtZW50IHRoYXQgaXMgMTAwMDBweCB0YWxsLAorCS8vCWJ1dCB5b3VyIGJyb3dzZXIgd2luZG93IGlzIG9ubHkgMTAwcHggdGFsbCwKKwkvLwlpZiB5b3Ugc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50IGFuZCBjYWxsIHRoaXMgZnVuY3Rpb24gaXQKKwkvLwl3aWxsIHJldHVybiB7eDogMCwgeTogMTAwMDB9CisJLy8JTk9URTogZm9yIGV2ZW50cyBkZWxpdmVyZWQgdmlhIGRvam8uZXZlbnQuY29ubmVjdCgpIGFuZC9vciBkb2pvQXR0YWNoRXZlbnQgKGZvciB3aWRnZXRzKSwKKwkvLwl5b3UgY2FuIGp1c3QgYWNjZXNzIGV2dC5wYWdlWCBhbmQgZXZ0LnBhZ2VZLCByYXRoZXIgdGhhbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisJZSA9IGUgfHwgZG9qby5nbG9iYWwoKS5ldmVudDsKKwl2YXIgY3Vyc29yID0ge3g6MCwgeTowfTsKKwlpZihlLnBhZ2VYIHx8IGUucGFnZVkpeworCQljdXJzb3IueCA9IGUucGFnZVg7CisJCWN1cnNvci55ID0gZS5wYWdlWTsKKwl9ZWxzZXsKKwkJdmFyIGRlID0gZG9qby5kb2MoKS5kb2N1bWVudEVsZW1lbnQ7CisJCXZhciBkYiA9IGRvam8uYm9keSgpOworCQljdXJzb3IueCA9IGUuY2xpZW50WCArICgoZGV8fGRiKVsic2Nyb2xsTGVmdCJdKSAtICgoZGV8fGRiKVsiY2xpZW50TGVmdCJdKTsKKwkJY3Vyc29yLnkgPSBlLmNsaWVudFkgKyAoKGRlfHxkYilbInNjcm9sbFRvcCJdKSAtICgoZGV8fGRiKVsiY2xpZW50VG9wIl0pOworCX0KKwlyZXR1cm4gY3Vyc29yOwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmlzVGFnID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKSB7CisJLy8Jc3VtbWFyeQorCS8vCUxpa2UgZG9qby5kb20uaXNUYWcsIGV4Y2VwdCBjYXNlLWluc2Vuc2l0aXZlCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZihub2RlICYmIG5vZGUudGFnTmFtZSkgeworCQlmb3IgKHZhciBpPTE7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCWlmIChub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09U3RyaW5nKGFyZ3VtZW50c1tpXSkudG9Mb3dlckNhc2UoKSl7CisJCQkJcmV0dXJuIFN0cmluZyhhcmd1bWVudHNbaV0pLnRvTG93ZXJDYXNlKCk7CS8vCXN0cmluZworCQkJfQorCQl9CisJfQorCXJldHVybiAiIjsJLy8Jc3RyaW5nCit9CisKKy8vZGVmaW5lIGRvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQgZm9yIElFIHRvIHdvcmthcm91bmQgdGhlIGFubm95aW5nIGFjdGl2YXRpb24gImZlYXR1cmUiIGluIG5ldyBJRQorLy9kZXRhaWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS93b3Jrc2hvcC9hdXRob3IvZGh0bWwvb3ZlcnZpZXcvYWN0aXZhdGluZ19hY3RpdmV4LmFzcAoraWYoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiAhZG9qby5yZW5kZXIuaHRtbC5pZTcwKXsKKwkvL29ubHkgZGVmaW5lIGNyZWF0ZUV4dGVybmFsRWxlbWVudCBmb3IgSUUgaW4gbm9uZSBodHRwcyB0byBhdm9pZCAibWl4ZWQgY29udGVudCIgd2FybmluZyBkaWFsb2cKKwlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIoMCw2KS50b0xvd2VyQ2FzZSgpICE9ICJodHRwczoiKXsKKwkJKGZ1bmN0aW9uKCl7CisJCQkvLyBGSVhNRTogdGhpcyBzZWVtcyBub3QgdG8gd29yayBjb3JyZWN0bHkgb24gSUUgNyEhCisKKwkJCS8vVGhlIHRyaWNrIGlzIHRvIGRlZmluZSBhIGZ1bmN0aW9uIGluIGEgc2NyaXB0LnNyYyBwcm9wZXJ0eToKKwkJCS8vIDxzY3JpcHQgc3JjPSJqYXZhc2NyaXB0OidmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbEVsZW1lbnQoKXsuLi59JyI+PC9zY3JpcHQ+LAorCQkJLy93aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gZXh0ZXJuYWwgamF2YXNjcmlwdCBmaWxlIGluIElFCisJCQl2YXIgeHNjcmlwdCA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisJCQl4c2NyaXB0LnNyYyA9ICJqYXZhc2NyaXB0Oidkb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50PWZ1bmN0aW9uKGRvYywgdGFnKXsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7IH0nIjsKKwkJCWRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh4c2NyaXB0KTsKKwkJfSkoKTsKKwl9Cit9ZWxzZXsKKwkvL2ZvciBvdGhlciBicm93c2Vycywgc2ltcGx5IHVzZSBkb2N1bWVudC5jcmVhdGVFbGVtZW50CisJLy9pcyBlbm91Z2gKKwlkb2pvLmh0bWwuY3JlYXRlRXh0ZXJuYWxFbGVtZW50ID0gZnVuY3Rpb24oLyogSFRNTERvY3VtZW50ICovZG9jLCAvKiBzdHJpbmcgKi90YWcpeworCQkvLwlzdW1tYXJ5CisJCS8vCUNyZWF0ZXMgYW4gZWxlbWVudCBpbiB0aGUgSFRNTCBkb2N1bWVudCwgaGVyZSBmb3IgQWN0aXZlWCBhY3RpdmF0aW9uIHdvcmthcm91bmQuCisJCXJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWcpOwkvLwlIVE1MRWxlbWVudAorCX0KK30KKworZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCA9IGZ1bmN0aW9uKGluRnVuYywgcmVwbEZ1bmMsIGFyZ3MsIGFyZ05hbWUsIHJldFZhbHVlKXsKKwlkb2pvLmRlcHJlY2F0ZWQoImRvam8uaHRtbC4iICsgaW5GdW5jLAorCQkJCQkicmVwbGFjZWQgYnkgZG9qby5odG1sLiIgKyByZXBsRnVuYyArICIoIiArIChhcmdOYW1lID8gIm5vZGUsIHsiKyBhcmdOYW1lICsgIjogIiArIGFyZ05hbWUgKyAifSIgOiAiIiApICsgIikiICsgKHJldFZhbHVlID8gIi4iICsgcmV0VmFsdWUgOiAiIiksICIwLjUiKTsKKwl2YXIgbmV3QXJncyA9IFtdOworCWlmKGFyZ05hbWUpeyB2YXIgYXJnc0luID0ge307IGFyZ3NJblthcmdOYW1lXSA9IGFyZ3NbMV07IG5ld0FyZ3MucHVzaChhcmdzWzBdKTsgbmV3QXJncy5wdXNoKGFyZ3NJbik7IH0KKwllbHNlIHsgbmV3QXJncyA9IGFyZ3MgfQorCXZhciByZXQgPSBkb2pvLmh0bWxbcmVwbEZ1bmNdLmFwcGx5KGRvam8uaHRtbCwgYXJncyk7CisJaWYocmV0VmFsdWUpeyByZXR1cm4gcmV0W3JldFZhbHVlXTsgfQorCWVsc2UgeyByZXR1cm4gcmV0OyB9Cit9CisKK2Rvam8uaHRtbC5nZXRWaWV3cG9ydFdpZHRoID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Vmlld3BvcnRXaWR0aCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuZ2V0Vmlld3BvcnRIZWlnaHQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRWaWV3cG9ydEhlaWdodCIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldFZpZXdwb3J0U2l6ZSA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldFZpZXdwb3J0U2l6ZSIsICJnZXRWaWV3cG9ydCIsIGFyZ3VtZW50cyk7Cit9Citkb2pvLmh0bWwuZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0U2Nyb2xsVG9wIiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgInRvcCIpOworfQorZG9qby5odG1sLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxMZWZ0IiwgImdldFNjcm9sbCIsIGFyZ3VtZW50cywgbnVsbCwgImxlZnQiKTsKK30KK2Rvam8uaHRtbC5nZXRTY3JvbGxPZmZzZXQgPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRTY3JvbGxPZmZzZXQiLCAiZ2V0U2Nyb2xsIiwgYXJndW1lbnRzLCBudWxsLCAib2Zmc2V0Iik7Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby51cmkuVXJpIik7CisKK2Rvam8udXJpID0gbmV3IGZ1bmN0aW9uKCkgeworCXRoaXMuZG9qb1VyaSA9IGZ1bmN0aW9uICgvKmRvam8udXJpLlVyaXx8U3RyaW5nKi91cmkpIHsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyBhIFVyaSBvYmplY3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGRvam8gcm9vdAorCQlyZXR1cm4gbmV3IGRvam8udXJpLlVyaShkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpLCB1cmkpOworCX0KKworCXRoaXMubW9kdWxlVXJpID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypkb2pvLnVyaS5Vcml8fFN0cmluZyovdXJpKXsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyBhIFVyaSBvYmplY3QgcmVsYXRpdmUgdG8gYSBtb2R1bGUKKwkJLy8gZGVzY3JpcHRpb246IEV4YW1wbGVzOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwidGVtcGxhdGVzL3RlbXBsYXRlLmh0bWwiKSwgb3IgZG9qby51cmkubW9kdWxlVXJpKCJhY21lIiwiaW1hZ2VzL3NtYWxsLnBuZyIpCisJCXZhciBsb2MgPSBkb2pvLmhvc3RlbnYuZ2V0TW9kdWxlU3ltYm9scyhtb2R1bGUpLmpvaW4oJy8nKTsKKwkJaWYoIWxvYyl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZihsb2MubGFzdEluZGV4T2YoIi8iKSAhPSBsb2MubGVuZ3RoLTEpeworCQkJbG9jICs9ICIvIjsKKwkJfQorCQkKKwkJLy9JZiB0aGUgcGF0aCBpcyBhbiBhYnNvbHV0ZSBwYXRoIChzdGFydHMgd2l0aCBhIC8gb3IgaXMgb24gYW5vdGhlciBkb21haW4veGRvbWFpbikKKwkJLy90aGVuIGRvbid0IGFkZCB0aGUgYmFzZVNjcmlwdFVyaS4KKwkJdmFyIGNvbG9uSW5kZXggPSBsb2MuaW5kZXhPZigiOiIpOworCQl2YXIgc2xhc2hJbmRleCA9IGxvYy5pbmRleE9mKCIvIik7CisJCWlmKGxvYy5jaGFyQXQoMCkgIT0gIi8iICYmIChjb2xvbkluZGV4ID09IC0xIHx8IGNvbG9uSW5kZXggPiBzbGFzaEluZGV4KSl7CisJCQlsb2MgPSBkb2pvLmhvc3RlbnYuZ2V0QmFzZVNjcmlwdFVyaSgpICsgbG9jOworCQl9CisKKwkJcmV0dXJuIG5ldyBkb2pvLnVyaS5VcmkobG9jLHVyaSk7CisJfQorCisJdGhpcy5VcmkgPSBmdW5jdGlvbiAoLypkb2pvLnVyaS5Vcml8fFN0cmluZy4uLiovKSB7CisJCS8vIHN1bW1hcnk6IENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgVVJJLgorCQkvLyBkZXNjcmlwdGlvbjogCisJCS8vICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCBpbiBvcmRlciByZWxhdGl2ZSB0byB0aGUgbmV4dCB1bnRpbAorCQkvLyAgYSBjYW5vbmljYWwgdXJpIGlzIHByb2R1Y2VkLiBUbyBnZXQgYW4gYWJzb2x1dGUgVXJpIHJlbGF0aXZlCisJCS8vICB0byB0aGUgY3VycmVudCBkb2N1bWVudCB1c2UKKwkJLy8gICAgICBuZXcgZG9qby51cmkuVXJpKGRvY3VtZW50LmJhc2VVUkksIHVyaSkKKworCQkvLyBUT0RPOiBzdXBwb3J0IGZvciBJUHY2LCBzZWUgUkZDIDI3MzIKKworCQkvLyByZXNvbHZlIHVyaSBjb21wb25lbnRzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIKKwkJdmFyIHVyaSA9IGFyZ3VtZW50c1swXTsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmKCFhcmd1bWVudHNbaV0pIHsgY29udGludWU7IH0KKworCQkJLy8gU2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLmNvbnN0cnVjdG9yIHNvIHdlIGhhdmUgdG8gYmUgZXhwbGljaXQKKwkJCXZhciByZWxvYmogPSBuZXcgZG9qby51cmkuVXJpKGFyZ3VtZW50c1tpXS50b1N0cmluZygpKTsKKwkJCXZhciB1cmlvYmogPSBuZXcgZG9qby51cmkuVXJpKHVyaS50b1N0cmluZygpKTsKKworCQkJaWYgKChyZWxvYmoucGF0aD09IiIpJiYocmVsb2JqLnNjaGVtZT09bnVsbCkmJihyZWxvYmouYXV0aG9yaXR5PT1udWxsKSYmKHJlbG9iai5xdWVyeT09bnVsbCkpIHsKKwkJCQlpZiAocmVsb2JqLmZyYWdtZW50ICE9IG51bGwpIHsgdXJpb2JqLmZyYWdtZW50ID0gcmVsb2JqLmZyYWdtZW50OyB9CisJCQkJcmVsb2JqID0gdXJpb2JqOworCQkJfSBlbHNlIGlmIChyZWxvYmouc2NoZW1lID09IG51bGwpIHsKKwkJCQlyZWxvYmouc2NoZW1lID0gdXJpb2JqLnNjaGVtZTsKKworCQkJCWlmIChyZWxvYmouYXV0aG9yaXR5ID09IG51bGwpIHsKKwkJCQkJcmVsb2JqLmF1dGhvcml0eSA9IHVyaW9iai5hdXRob3JpdHk7CisKKwkJCQkJaWYgKHJlbG9iai5wYXRoLmNoYXJBdCgwKSAhPSAiLyIpIHsKKwkJCQkJCXZhciBwYXRoID0gdXJpb2JqLnBhdGguc3Vic3RyaW5nKDAsCisJCQkJCQkJdXJpb2JqLnBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpICsgcmVsb2JqLnBhdGg7CisKKwkJCQkJCXZhciBzZWdzID0gcGF0aC5zcGxpdCgiLyIpOworCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBzZWdzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJaWYgKHNlZ3Nbal0gPT0gIi4iKSB7CisJCQkJCQkJCWlmIChqID09IHNlZ3MubGVuZ3RoIC0gMSkgeyBzZWdzW2pdID0gIiI7IH0KKwkJCQkJCQkJZWxzZSB7IHNlZ3Muc3BsaWNlKGosIDEpOyBqLS07IH0KKwkJCQkJCQl9IGVsc2UgaWYgKGogPiAwICYmICEoaiA9PSAxICYmIHNlZ3NbMF0gPT0gIiIpICYmCisJCQkJCQkJCXNlZ3Nbal0gPT0gIi4uIiAmJiBzZWdzW2otMV0gIT0gIi4uIikgeworCisJCQkJCQkJCWlmIChqID09IHNlZ3MubGVuZ3RoIC0gMSkgeyBzZWdzLnNwbGljZShqLCAxKTsgc2Vnc1tqIC0gMV0gPSAiIjsgfQorCQkJCQkJCQllbHNlIHsgc2Vncy5zcGxpY2UoaiAtIDEsIDIpOyBqIC09IDI7IH0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZWxvYmoucGF0aCA9IHNlZ3Muam9pbigiLyIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQl1cmkgPSAiIjsKKwkJCWlmIChyZWxvYmouc2NoZW1lICE9IG51bGwpIHsgdXJpICs9IHJlbG9iai5zY2hlbWUgKyAiOiI7IH0KKwkJCWlmIChyZWxvYmouYXV0aG9yaXR5ICE9IG51bGwpIHsgdXJpICs9ICIvLyIgKyByZWxvYmouYXV0aG9yaXR5OyB9CisJCQl1cmkgKz0gcmVsb2JqLnBhdGg7CisJCQlpZiAocmVsb2JqLnF1ZXJ5ICE9IG51bGwpIHsgdXJpICs9ICI/IiArIHJlbG9iai5xdWVyeTsgfQorCQkJaWYgKHJlbG9iai5mcmFnbWVudCAhPSBudWxsKSB7IHVyaSArPSAiIyIgKyByZWxvYmouZnJhZ21lbnQ7IH0KKwkJfQorCisJCXRoaXMudXJpID0gdXJpLnRvU3RyaW5nKCk7CisKKwkJLy8gYnJlYWsgdGhlIHVyaSBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHMKKwkJdmFyIHJlZ2V4cCA9ICJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/JCI7CisJCXZhciByID0gdGhpcy51cmkubWF0Y2gobmV3IFJlZ0V4cChyZWdleHApKTsKKworCQl0aGlzLnNjaGVtZSA9IHJbMl0gfHwgKHJbMV0gPyAiIiA6IG51bGwpOworCQl0aGlzLmF1dGhvcml0eSA9IHJbNF0gfHwgKHJbM10gPyAiIiA6IG51bGwpOworCQl0aGlzLnBhdGggPSByWzVdOyAvLyBjYW4gbmV2ZXIgYmUgdW5kZWZpbmVkCisJCXRoaXMucXVlcnkgPSByWzddIHx8IChyWzZdID8gIiIgOiBudWxsKTsKKwkJdGhpcy5mcmFnbWVudCAgPSByWzldIHx8IChyWzhdID8gIiIgOiBudWxsKTsKKworCQlpZiAodGhpcy5hdXRob3JpdHkgIT0gbnVsbCkgeworCQkJLy8gc2VydmVyIGJhc2VkIG5hbWluZyBhdXRob3JpdHkKKwkJCXJlZ2V4cCA9ICJeKCgoW146XSs6KT8oW15AXSspKUApPyhbXjpdKikoOihbMC05XSspKT8kIjsKKwkJCXIgPSB0aGlzLmF1dGhvcml0eS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCisJCQl0aGlzLnVzZXIgPSByWzNdIHx8IG51bGw7CisJCQl0aGlzLnBhc3N3b3JkID0gcls0XSB8fCBudWxsOworCQkJdGhpcy5ob3N0ID0gcls1XTsKKwkJCXRoaXMucG9ydCA9IHJbN10gfHwgbnVsbDsKKwkJfQorCisJCXRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy51cmk7IH0KKwl9Cit9OworCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbC5zdHlsZSIpOworCisKKworZG9qby5odG1sLmdldENsYXNzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBsaXN0IG9mIENTUyBjbGFzc2VzIGN1cnJlbnRseSBhc3NpZ25lZCBkaXJlY3RseSAKKwkvLwl0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kOworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJaWYoIW5vZGUpeyByZXR1cm4gIiI7IH0KKwl2YXIgY3MgPSAiIjsKKwlpZihub2RlLmNsYXNzTmFtZSl7CisJCWNzID0gbm9kZS5jbGFzc05hbWU7CisJfWVsc2UgaWYoZG9qby5odG1sLmhhc0F0dHJpYnV0ZShub2RlLCAiY2xhc3MiKSl7CisJCWNzID0gZG9qby5odG1sLmdldEF0dHJpYnV0ZShub2RlLCAiY2xhc3MiKTsKKwl9CisJcmV0dXJuIGNzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSkgeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIGFuIGFycmF5IG9mIENTUyBjbGFzc2VzIGN1cnJlbnRseSBhc3NpZ25lZCBkaXJlY3RseSB0byB0aGUgbm9kZSBpbiBxdWVzdGlvbi4gCisJLy8JUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBubyBjbGFzc2VzIGFyZSBmb3VuZDsKKwl2YXIgYyA9IGRvam8uaHRtbC5nZXRDbGFzcyhub2RlKTsKKwlyZXR1cm4gKGMgPT0gIiIpID8gW10gOiBjLnNwbGl0KC9ccysvZyk7CS8vCWFycmF5Cit9CisKK2Rvam8uaHRtbC5oYXNDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovY2xhc3NuYW1lKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGNsYXNzbmFtZSBpcyBhIHBvcnRpb24gb2YgdGhlCisJLy8JY2xhc3MgbGlzdCBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgbm9kZS4gRG9lcyBub3QgY292ZXIgY2FzY2FkZWQKKwkvLwlzdHlsZXMsIG9ubHkgY2xhc3NlcyBkaXJlY3RseSBhcHBsaWVkIHRvIHRoZSBub2RlLgorCXJldHVybiAobmV3IFJlZ0V4cCgnKF58XFxzKyknK2NsYXNzbmFtZSsnKFxccyt8JCknKSkudGVzdChkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSkpCS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnByZXBlbmRDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovY2xhc3NTdHIpeworCS8vCXN1bW1hcnkKKwkvLwlBZGRzIHRoZSBzcGVjaWZpZWQgY2xhc3MgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2xhc3MgbGlzdCBvbiB0aGUKKwkvLwlwYXNzZWQgbm9kZS4gVGhpcyBnaXZlcyB0aGUgc3BlY2lmaWVkIGNsYXNzIHRoZSBoaWdoZXN0IHByZWNpZGVuY2UKKwkvLwl3aGVuIHN0eWxlIGNhc2NhZGluZyBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbm9kZS4gUmV0dXJucyB0cnVlIG9yCisJLy8JZmFsc2U7IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBvcGVyYXRpb24sIHJlc3BlY3RpdmVseS4KKwljbGFzc1N0ciArPSAiICIgKyBkb2pvLmh0bWwuZ2V0Q2xhc3Mobm9kZSk7CisJcmV0dXJuIGRvam8uaHRtbC5zZXRDbGFzcyhub2RlLCBjbGFzc1N0cik7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLmFkZENsYXNzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9jbGFzc1N0cil7CisJLy8Jc3VtbWFyeQorCS8vCUFkZHMgdGhlIHNwZWNpZmllZCBjbGFzcyB0byB0aGUgZW5kIG9mIHRoZSBjbGFzcyBsaXN0IG9uIHRoZQorCS8vCXBhc3NlZCAmbm9kZTsuIFJldHVybnMgJnRydWU7IG9yICZmYWxzZTsgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCisJaWYgKGRvam8uaHRtbC5oYXNDbGFzcyhub2RlLCBjbGFzc1N0cikpIHsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisJY2xhc3NTdHIgPSAoZG9qby5odG1sLmdldENsYXNzKG5vZGUpICsgIiAiICsgY2xhc3NTdHIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKTsKKwlyZXR1cm4gZG9qby5odG1sLnNldENsYXNzKG5vZGUsIGNsYXNzU3RyKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwuc2V0Q2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2NsYXNzU3RyKXsKKwkvLwlzdW1tYXJ5CisJLy8JQ2xvYmJlcnMgdGhlIGV4aXN0aW5nIGxpc3Qgb2YgY2xhc3NlcyBmb3IgdGhlIG5vZGUsIHJlcGxhY2luZyBpdCB3aXRoCisJLy8JdGhlIGxpc3QgZ2l2ZW4gaW4gdGhlIDJuZCBhcmd1bWVudC4gUmV0dXJucyB0cnVlIG9yIGZhbHNlCisJLy8JaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgY3MgPSBuZXcgU3RyaW5nKGNsYXNzU3RyKTsKKwl0cnl7CisJCWlmKHR5cGVvZiBub2RlLmNsYXNzTmFtZSA9PSAic3RyaW5nIil7CisJCQlub2RlLmNsYXNzTmFtZSA9IGNzOworCQl9ZWxzZSBpZihub2RlLnNldEF0dHJpYnV0ZSl7CisJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBjbGFzc1N0cik7CisJCQlub2RlLmNsYXNzTmFtZSA9IGNzOworCQl9ZWxzZXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX1jYXRjaChlKXsKKwkJZG9qby5kZWJ1ZygiZG9qby5odG1sLnNldENsYXNzKCkgZmFpbGVkIiwgZSk7CisJfQorCXJldHVybiB0cnVlOworfQorCitkb2pvLmh0bWwucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2NsYXNzU3RyLCAvKiBib29sZWFuPyAqL2FsbG93UGFydGlhbE1hdGNoZXMpeworCS8vCXN1bW1hcnkKKwkvLwlSZW1vdmVzIHRoZSBjbGFzc05hbWUgZnJvbSB0aGUgbm9kZTsuIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKwl0cnl7CisJCWlmICghYWxsb3dQYXJ0aWFsTWF0Y2hlcykgeworCQkJdmFyIG5ld2NzID0gZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxzKyknK2NsYXNzU3RyKycoXFxzK3wkKScpLCAiJDEkMiIpOworCQl9IGVsc2UgeworCQkJdmFyIG5ld2NzID0gZG9qby5odG1sLmdldENsYXNzKG5vZGUpLnJlcGxhY2UoY2xhc3NTdHIsJycpOworCQl9CisJCWRvam8uaHRtbC5zZXRDbGFzcyhub2RlLCBuZXdjcyk7CisJfWNhdGNoKGUpeworCQlkb2pvLmRlYnVnKCJkb2pvLmh0bWwucmVtb3ZlQ2xhc3MoKSBmYWlsZWQiLCBlKTsKKwl9CisJcmV0dXJuIHRydWU7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnJlcGxhY2VDbGFzcyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovbmV3Q2xhc3MsIC8qIHN0cmluZyAqL29sZENsYXNzKSB7CisJLy8Jc3VtbWFyeQorCS8vCVJlcGxhY2VzICdvbGRDbGFzcycgYW5kIGFkZHMgJ25ld0NsYXNzJyB0byBub2RlCisJZG9qby5odG1sLnJlbW92ZUNsYXNzKG5vZGUsIG9sZENsYXNzKTsKKwlkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSwgbmV3Q2xhc3MpOworfQorCisvLyBFbnVtIHR5cGUgZm9yIGdldEVsZW1lbnRzQnlDbGFzcyBjbGFzc01hdGNoVHlwZSBhcmc6Citkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUgPSB7CisJQ29udGFpbnNBbGwgOiAwLCAvLyBhbGwgb2YgdGhlIGNsYXNzZXMgYXJlIHBhcnQgb2YgdGhlIG5vZGUncyBjbGFzcyAoZGVmYXVsdCkKKwlDb250YWluc0FueSA6IDEsIC8vIGFueSBvZiB0aGUgY2xhc3NlcyBhcmUgcGFydCBvZiB0aGUgbm9kZSdzIGNsYXNzCisJSXNPbmx5IDogMiAvLyBvbmx5IGFsbCBvZiB0aGUgY2xhc3NlcyBhcmUgcGFydCBvZiB0aGUgbm9kZSdzIGNsYXNzCit9CisKKworZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzcyA9IGZ1bmN0aW9uKAorCS8qIHN0cmluZyAqL2NsYXNzU3RyLCAKKwkvKiBIVE1MRWxlbWVudD8gKi9wYXJlbnQsIAorCS8qIHN0cmluZz8gKi9ub2RlVHlwZSwgCisJLyogaW50ZWdlcj8gKi9jbGFzc01hdGNoVHlwZSwgCisJLyogYm9vbGVhbj8gKi91c2VOb25YcGF0aAorKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyBhbiBhcnJheSBvZiBub2RlcyBmb3IgdGhlIGdpdmVuIGNsYXNzU3RyLCBjaGlsZHJlbiBvZiBhCisJLy8JcGFyZW50LCBhbmQgb3B0aW9uYWxseSBvZiBhIGNlcnRhaW4gbm9kZVR5cGUKKwkvLyBGSVhNRTogdGVtcG9yYXJpbHkgc2V0IHRvIGZhbHNlIGJlY2F1c2Ugb2Ygc2V2ZXJhbCBkb2pvIHRpY2tldHMgcmVsYXRlZAorCS8vIHRvIHRoZSB4cGF0aCB2ZXJzaW9uIG5vdCB3b3JraW5nIGNvbnNpc3RlbnRseSBpbiBmaXJlZm94LgorCXVzZU5vblhwYXRoID0gZmFsc2U7CisJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJcGFyZW50ID0gZG9qby5ieUlkKHBhcmVudCkgfHwgX2RvY3VtZW50OworCXZhciBjbGFzc2VzID0gY2xhc3NTdHIuc3BsaXQoL1xzKy9nKTsKKwl2YXIgbm9kZXMgPSBbXTsKKwlpZiggY2xhc3NNYXRjaFR5cGUgIT0gMSAmJiBjbGFzc01hdGNoVHlwZSAhPSAyICkgY2xhc3NNYXRjaFR5cGUgPSAwOyAvLyBtYWtlIGl0IGVudW0KKwl2YXIgcmVDbGFzcyA9IG5ldyBSZWdFeHAoIihcXHN8XikoKCIgKyBjbGFzc2VzLmpvaW4oIil8KCIpICsgIikpKFxcc3wkKSIpOworCXZhciBzcnRMZW5ndGggPSBjbGFzc2VzLmpvaW4oIiAiKS5sZW5ndGg7CisJdmFyIGNhbmRpZGF0ZU5vZGVzID0gW107CisJCisJaWYoIXVzZU5vblhwYXRoICYmIF9kb2N1bWVudC5ldmFsdWF0ZSkgeyAvLyBzdXBwb3J0cyBkb20gMyB4cGF0aAorCQl2YXIgeHBhdGggPSAiLi8vIiArIChub2RlVHlwZSB8fCAiKiIpICsgIltjb250YWlucygiOworCQlpZihjbGFzc01hdGNoVHlwZSAhPSBkb2pvLmh0bWwuY2xhc3NNYXRjaFR5cGUuQ29udGFpbnNBbnkpeworCQkJeHBhdGggKz0gImNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIiArCisJCQljbGFzc2VzLmpvaW4oIiAnKSBhbmQgY29udGFpbnMoY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiKSArCisJCQkiICcpIjsKKwkJCWlmIChjbGFzc01hdGNoVHlwZSA9PSAyKSB7CisJCQkJeHBhdGggKz0gIiBhbmQgc3RyaW5nLWxlbmd0aChAY2xhc3MpPSIrc3J0TGVuZ3RoKyJdIjsKKwkJCX1lbHNleworCQkJCXhwYXRoICs9ICJdIjsKKwkJCX0KKwkJfWVsc2V7CisJCQl4cGF0aCArPSAiY29uY2F0KCcgJyxAY2xhc3MsJyAnKSwgJyAiICsKKwkJCWNsYXNzZXMuam9pbigiICcpIG9yIGNvbnRhaW5zKGNvbmNhdCgnICcsQGNsYXNzLCcgJyksICcgIikgKworCQkJIiAnKV0iOworCQl9CisJCXZhciB4cGF0aFJlc3VsdCA9IF9kb2N1bWVudC5ldmFsdWF0ZSh4cGF0aCwgcGFyZW50LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7CisJCXZhciByZXN1bHQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpOworCQl3aGlsZShyZXN1bHQpeworCQkJdHJ5eworCQkJCWNhbmRpZGF0ZU5vZGVzLnB1c2gocmVzdWx0KTsKKwkJCQlyZXN1bHQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpOworCQkJfWNhdGNoKGUpeyBicmVhazsgfQorCQl9CisJCXJldHVybiBjYW5kaWRhdGVOb2RlczsJLy8JTm9kZUxpc3QKKwl9ZWxzZXsKKwkJaWYoIW5vZGVUeXBlKXsKKwkJCW5vZGVUeXBlID0gIioiOworCQl9CisJCWNhbmRpZGF0ZU5vZGVzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5vZGVUeXBlKTsKKworCQl2YXIgbm9kZSwgaSA9IDA7CisJCW91dGVyOgorCQl3aGlsZShub2RlID0gY2FuZGlkYXRlTm9kZXNbaSsrXSl7CisJCQl2YXIgbm9kZUNsYXNzZXMgPSBkb2pvLmh0bWwuZ2V0Q2xhc3Nlcyhub2RlKTsKKwkJCWlmKG5vZGVDbGFzc2VzLmxlbmd0aCA9PSAwKXsgY29udGludWUgb3V0ZXI7IH0KKwkJCXZhciBtYXRjaGVzID0gMDsKKwkKKwkJCWZvcih2YXIgaiA9IDA7IGogPCBub2RlQ2xhc3Nlcy5sZW5ndGg7IGorKyl7CisJCQkJaWYocmVDbGFzcy50ZXN0KG5vZGVDbGFzc2VzW2pdKSl7CisJCQkJCWlmKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Db250YWluc0FueSl7CisJCQkJCQlub2Rlcy5wdXNoKG5vZGUpOworCQkJCQkJY29udGludWUgb3V0ZXI7CisJCQkJCX1lbHNleworCQkJCQkJbWF0Y2hlcysrOworCQkJCQl9CisJCQkJfWVsc2V7CisJCQkJCWlmKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Jc09ubHkpeworCQkJCQkJY29udGludWUgb3V0ZXI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCisJCQlpZihtYXRjaGVzID09IGNsYXNzZXMubGVuZ3RoKXsKKwkJCQlpZigJKGNsYXNzTWF0Y2hUeXBlID09IGRvam8uaHRtbC5jbGFzc01hdGNoVHlwZS5Jc09ubHkpJiYKKwkJCQkJKG1hdGNoZXMgPT0gbm9kZUNsYXNzZXMubGVuZ3RoKSl7CisJCQkJCW5vZGVzLnB1c2gobm9kZSk7CisJCQkJfWVsc2UgaWYoY2xhc3NNYXRjaFR5cGUgPT0gZG9qby5odG1sLmNsYXNzTWF0Y2hUeXBlLkNvbnRhaW5zQWxsKXsKKwkJCQkJbm9kZXMucHVzaChub2RlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG5vZGVzOwkvLwlOb2RlTGlzdAorCX0KK30KK2Rvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZG9qby5odG1sLmdldEVsZW1lbnRzQnlDbGFzczsKKworZG9qby5odG1sLnRvQ2FtZWxDYXNlID0gZnVuY3Rpb24oLyogc3RyaW5nICovc2VsZWN0b3IpeworCS8vCXN1bW1hcnkKKwkvLwlUcmFuc2xhdGVzIGEgQ1NTIHNlbGVjdG9yIHN0cmluZyB0byBhIGNhbWVsLWNhc2VkIG9uZS4KKwl2YXIgYXJyID0gc2VsZWN0b3Iuc3BsaXQoJy0nKSwgY2MgPSBhcnJbMF07CisJZm9yKHZhciBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeworCQljYyArPSBhcnJbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhcnJbaV0uc3Vic3RyaW5nKDEpOworCX0KKwlyZXR1cm4gY2M7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwudG9TZWxlY3RvckNhc2UgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zZWxlY3Rvcil7CisJLy8Jc3VtbWFyeQorCS8vCVRyYW5zbGF0ZXMgYSBjYW1lbCBjYXNlZCBzdHJpbmcgdG8gYSBzZWxlY3RvciBjYXNlZCBvbmUuCisJcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOwkvLwlzdHJpbmcKK30KKworaWYgKGRvam8ucmVuZGVyLmh0bWwuaWUpIHsKKwkvLyBJRSBicmFuY2gKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKC8qSFRNTEVsZW1lbnR8U3RyaW5nKi9ub2RlLCAvKlN0cmluZyovcHJvcGVydHksIC8qU3RyaW5nKi92YWx1ZSkgeworCQkvLyBzdW1tYXJ5CisJCS8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgdmFsdWUgZm9yIHN0eWxlICJwcm9wZXJ0eSIgb24gIm5vZGUiIChJRSkuCisJCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7IC8vIEZJWE1FOiByZW1vdmUgYWJpbGl0eSB0byBhY2Nlc3Mgbm9kZXMgYnkgaWQgZm9yIHRoaXMgdGltZS1jcml0aWNhbCBmdW5jdGlvbgorCQlpZighbm9kZSB8fCAhbm9kZS5jdXJyZW50U3R5bGUpe3JldHVybiB2YWx1ZTt9CisJCS8vIEZJWE1FOiBzdGFuZGFyZGl6ZSBvbiBjYW1lbC1jYXNlIGlucHV0IHRvIGltcHJvdmUgc3BlZWQKKwkJcmV0dXJuIG5vZGUuY3VycmVudFN0eWxlW2Rvam8uaHRtbC50b0NhbWVsQ2FzZShwcm9wZXJ0eSldOyAvLyBTdHJpbmcKKwl9CisJLy8gU0pNOiBnZXRDb21wdXRlZFN0eWxlIHNob3VsZCBiZSBhYmFuZG9uZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlIGJlbG93IGZ1bmN0aW9uLgorCS8vIEFsbCBvdXIgc3VwcG9ydGVkIGJyb3dzZXJzIGNhbiByZXR1cm4gQ1NTMiBjb21wbGlhbnQgQ3NzU3R5bGVEZWNsYXJhdGlvbiBvYmplY3RzCisJLy8gd2hpY2ggY2FuIGJlIHF1ZXJpZWQgZGlyZWN0bHkgZm9yIG11bHRpcGxlIHN0eWxlcy4KKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZXMgPSBmdW5jdGlvbigvKkhUTUxFbGVtZW50Ki9ub2RlKSB7CisJCS8vIHN1bW1hcnkKKwkJLy8gR2V0IGEgc3R5bGUgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHV0ZWQgc3R5bGVzIGZvciBIVE1MIEVsZW1lbnQgbm9kZSAoSUUpLgorCQlyZXR1cm4gbm9kZS5jdXJyZW50U3R5bGU7IC8vIENTU1N0eWxlRGVjbGFyYXRpb24KKwl9Cit9IGVsc2UgeworCS8vIG5vbi1JRSBicmFuY2gKKwlkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uKC8qSFRNTEVsZW1lbnR8U3RyaW5nKi9ub2RlLCAvKlN0cmluZyovcHJvcGVydHksIC8qQW55Ki92YWx1ZSkgeworCQkvLyBzdW1tYXJ5CisJCS8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgdmFsdWUgZm9yIHN0eWxlICJwcm9wZXJ0eSIgb24gIm5vZGUiIChub24tSUUpLgorCQlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCQlpZighbm9kZSB8fCAhbm9kZS5zdHlsZSl7cmV0dXJuIHZhbHVlO30KKwkJdmFyIHMgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpOworCQkvLyBzIG1heSBiZSBudWxsIG9uIFNhZmFyaQorCQlyZXR1cm4gKHMmJnNbZG9qby5odG1sLnRvQ2FtZWxDYXNlKHByb3BlcnR5KV0pfHwnJzsgLy8gU3RyaW5nCisJfQkKKwkvLyBTSk06IGdldENvbXB1dGVkU3R5bGUgc2hvdWxkIGJlIGFiYW5kb25lZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUgYmVsb3cgZnVuY3Rpb24uCisJLy8gQWxsIG91ciBzdXBwb3J0ZWQgYnJvd3NlcnMgY2FuIHJldHVybiBDU1MyIGNvbXBsaWFudCBDc3NTdHlsZURlY2xhcmF0aW9uIG9iamVjdHMKKwkvLyB3aGljaCBjYW4gYmUgcXVlcmllZCBkaXJlY3RseSBmb3IgbXVsdGlwbGUgc3R5bGVzLgorCWRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlcyA9IGZ1bmN0aW9uKG5vZGUpIHsKKwkJLy8gc3VtbWFyeQorCQkvLyBHZXQgYSBzdHlsZSBvYmplY3QgY29udGFpbmluZyBjb21wdXRlZCBzdHlsZXMgZm9yIEhUTUwgRWxlbWVudCBub2RlIChub24tSUUpLgorCQlyZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTsgLy8gQ1NTU3R5bGVEZWNsYXJhdGlvbgorCX0JCit9CisKK2Rvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi9jc3NTZWxlY3Rvcil7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwYXNzZWQgc3R5bGUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXJldHVybiAobm9kZSAmJiBub2RlLnN0eWxlID8gbm9kZS5zdHlsZVtkb2pvLmh0bWwudG9DYW1lbENhc2UoY3NzU2VsZWN0b3IpXSA6IHVuZGVmaW5lZCk7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuZ2V0U3R5bGUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIHBhc3NlZCBzdHlsZQorCXZhciB2YWx1ZSA9IGRvam8uaHRtbC5nZXRTdHlsZVByb3BlcnR5KG5vZGUsIGNzc1NlbGVjdG9yKTsKKwlyZXR1cm4gKHZhbHVlID8gdmFsdWUgOiBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBjc3NTZWxlY3RvcikpOwkvLwlzdHJpbmcgfHwgaW50ZWdlcgorfQorCitkb2pvLmh0bWwuc2V0U3R5bGUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yLCAvKiBzdHJpbmcgKi92YWx1ZSl7CisJLy8Jc3VtbWFyeQorCS8vCVNldCB0aGUgdmFsdWUgb2YgcGFzc2VkIHN0eWxlIG9uIG5vZGUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKG5vZGUgJiYgbm9kZS5zdHlsZSl7CisJCXZhciBjYW1lbENhc2VkID0gZG9qby5odG1sLnRvQ2FtZWxDYXNlKGNzc1NlbGVjdG9yKTsKKwkJbm9kZS5zdHlsZVtjYW1lbENhc2VkXSA9IHZhbHVlOworCX0KK30KKworZG9qby5odG1sLnNldFN0eWxlVGV4dCA9IGZ1bmN0aW9uICgvKiBIVE1MRWxlbWVudCAqL3RhcmdldCwgLyogc3RyaW5nICovdGV4dCkgeworCS8vCXN1bW1hcnkKKwkvLwlUcnkgdG8gc2V0IHRoZSBlbnRpcmUgY3NzVGV4dCBwcm9wZXJ0eSBvZiB0aGUgcGFzc2VkIHRhcmdldDsgZXF1aXYgb2Ygc2V0dGluZyBzdHlsZSBhdHRyaWJ1dGUuCisJdHJ5IHsKKwkgCXRhcmdldC5zdHlsZS5jc3NUZXh0ID0gdGV4dDsKKwl9IGNhdGNoIChlKSB7CisJCXRhcmdldC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgdGV4dCk7CisJfQorfQorCitkb2pvLmh0bWwuY29weVN0eWxlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi90YXJnZXQsIC8qIEhUTUxFbGVtZW50ICovc291cmNlKXsKKwkvLwlzdW1tYXJ5CisJLy8gd29yayBhcm91bmQgZm9yIG9wZXJhIHdoaWNoIGRvZXNuJ3QgaGF2ZSBjc3NUZXh0LCBhbmQgZm9yIElFIHdoaWNoIGZhaWxzIG9uIHNldEF0dHJpYnV0ZSAKKwlpZighc291cmNlLnN0eWxlLmNzc1RleHQpeyAKKwkJdGFyZ2V0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzb3VyY2UuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKTsgCisJfWVsc2V7CisJCXRhcmdldC5zdHlsZS5jc3NUZXh0ID0gc291cmNlLnN0eWxlLmNzc1RleHQ7IAorCX0KKwlkb2pvLmh0bWwuYWRkQ2xhc3ModGFyZ2V0LCBkb2pvLmh0bWwuZ2V0Q2xhc3Moc291cmNlKSk7Cit9CisKK2Rvam8uaHRtbC5nZXRVbml0VmFsdWUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2Nzc1NlbGVjdG9yLCAvKiBib29sZWFuPyAqL2F1dG9Jc1plcm8peworCS8vCXN1bW1hcnkKKwkvLwlHZXQgdGhlIHZhbHVlIG9mIHBhc3NlZCBzZWxlY3Rvciwgd2l0aCB0aGUgc3BlY2lmaWMgdW5pdHMgdXNlZAorCXZhciBzID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgY3NzU2VsZWN0b3IpOworCWlmKCghcyl8fCgocyA9PSAnYXV0bycpJiYoYXV0b0lzWmVybykpKXsgCisJCXJldHVybiB7IHZhbHVlOiAwLCB1bml0czogJ3B4JyB9OwkvLwlvYmplY3QgCisJfQorCS8vIEZJWE1FOiBpcyByZWdleCBpbmVmZmljaWVudCB2cy4gcGFyc2VJbnQgb3Igc29tZSBtYW51YWwgdGVzdD8gCisJdmFyIG1hdGNoID0gcy5tYXRjaCgvKFwtP1tcZC5dKykoW2EteiVdKikvaSk7CisJaWYgKCFtYXRjaCl7cmV0dXJuIGRvam8uaHRtbC5nZXRVbml0VmFsdWUuYmFkO30KKwlyZXR1cm4geyB2YWx1ZTogTnVtYmVyKG1hdGNoWzFdKSwgdW5pdHM6IG1hdGNoWzJdLnRvTG93ZXJDYXNlKCkgfTsJLy8Jb2JqZWN0Cit9Citkb2pvLmh0bWwuZ2V0VW5pdFZhbHVlLmJhZCA9IHsgdmFsdWU6IE5hTiwgdW5pdHM6ICcnIH07CisKK2lmIChkb2pvLnJlbmRlci5odG1sLmllKSB7CisJLy8gSUUgYnJhbmNoCisJZG9qby5odG1sLnRvUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovZWxlbWVudCwgLyogU3RyaW5nICovc3R5bGVWYWx1ZSl7CisJCS8vIHN1bW1hcnkKKwkJLy8gIEV4dHJhY3QgdmFsdWUgaW4gcGl4ZWxzIGZyb20gc3R5bGVWYWx1ZSAoSUUgdmVyc2lvbikuCisJCS8vICBJZiBhIHZhbHVlIGNhbm5vdCBiZSBleHRyYWN0ZWQsIHplcm8gaXMgcmV0dXJuZWQuCisJCWlmKCFzdHlsZVZhbHVlKXtyZXR1cm4gMDt9CisJCWlmKHN0eWxlVmFsdWUuc2xpY2UoLTIpID09ICdweCcpe3JldHVybiBwYXJzZUZsb2F0KHN0eWxlVmFsdWUpO30KKwkJdmFyIHBpeGVsVmFsdWUgPSAwOworCQl3aXRoKGVsZW1lbnQpeworCQkJdmFyIHNMZWZ0ID0gc3R5bGUubGVmdDsKKwkJCXZhciByc0xlZnQgPSBydW50aW1lU3R5bGUubGVmdDsKKwkJCXJ1bnRpbWVTdHlsZS5sZWZ0ID0gY3VycmVudFN0eWxlLmxlZnQ7CisJCQl0cnkgeworCQkJCXN0eWxlLmxlZnQgPSBzdHlsZVZhbHVlIHx8IDA7CisJCQkJcGl4ZWxWYWx1ZSA9IHN0eWxlLnBpeGVsTGVmdDsKKwkJCQlzdHlsZS5sZWZ0ID0gc0xlZnQ7CisJCQkJcnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CisJCQl9Y2F0Y2goZSl7CisJCQkJLy8gRklYTUU6IGl0J3MgcG9zc2libGUgZm9yIHN0eWxlVmFsdWUgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGgKKwkJCQkvLyBzdHlsZS5sZWZ0LiBJbiBwYXJ0aWN1bGFyLCBib3JkZXIgd2lkdGggdmFsdWVzIG9mIAorCQkJCS8vICJ0aGljayIsICJtZWRpdW0iLCBvciAidGhpbiIgd2lsbCBwcm92b2tlIGFuIGV4Y2VwdGlvbi4KKwkJCX0KKwkJfQorCQlyZXR1cm4gcGl4ZWxWYWx1ZTsgLy8gTnVtYmVyCisJfQorfSBlbHNlIHsKKwkvLyBub24tSUUgYnJhbmNoCisJZG9qby5odG1sLnRvUGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovZWxlbWVudCwgLyogU3RyaW5nICovc3R5bGVWYWx1ZSl7CisJCS8vIHN1bW1hcnkKKwkJLy8gIEV4dHJhY3QgdmFsdWUgaW4gcGl4ZWxzIGZyb20gc3R5bGVWYWx1ZSAobm9uLUlFIHZlcnNpb24pLgorCQkvLyAgSWYgYSB2YWx1ZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCB6ZXJvIGlzIHJldHVybmVkLgorCQlyZXR1cm4gKHN0eWxlVmFsdWUgJiYgKHN0eWxlVmFsdWUuc2xpY2UoLTIpPT0ncHgnKSA/IHBhcnNlRmxvYXQoc3R5bGVWYWx1ZSkgOiAwKTsgLy8gTnVtYmVyCisJfQorfQorCitkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovc3R5bGVQcm9wZXJ0eSwgLyogYm9vbGVhbj8gKi9hdXRvSXNaZXJvKXsKKwkvLyBzdW1tYXJ5CisJLy8gIEdldCBhIGNvbXB1dGVkIHN0eWxlIHZhbHVlLCBpbiBwaXhlbHMuCisJLy8gbm9kZTogSFRNTEVsZW1lbnQKKwkvLyAgTm9kZSB0byBpbnRlcnJvZ2F0ZQorCS8vIHN0eWxlUHJvcGVydHk6IFN0cmluZworCS8vICBTdHlsZSBwcm9wZXJ0eSB0byBxdWVyeSwgaW4gZWl0aGVyIGNzcy1zZWxlY3RvciBvciBjYW1lbENhc2UgKHByb3BlcnR5KSBmb3JtYXQuCisJLy8gYXV0b0lzWmVybzogQm9vbGVhbgorCS8vICBEZXByZWNhdGVkLiBBbnkgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIHBpeGVscyBpcyByZXR1cm5lZCBhcyB6ZXJvLgorCS8vIAorCS8vICBzdW1tYXJ5CisJLy8gIEdldCB0aGUgdmFsdWUgb2YgcGFzc2VkIHNlbGVjdG9yIGluIHBpeGVscy4KKwkvLworCXJldHVybiBkb2pvLmh0bWwudG9QaXhlbFZhbHVlKG5vZGUsIGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIHN0eWxlUHJvcGVydHkpKTsKK30gCisKK2Rvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NlbGVjdG9yLCAvKiBpbnRlZ2VyICovdmFsdWUpeworCS8vCXN1bW1hcnkKKwkvLwlBdHRlbXB0IHRvIHNldCB0aGUgdmFsdWUgb2Ygc2VsZWN0b3Igb24gbm9kZSBhcyBhIHBvc2l0aXZlIHBpeGVsIHZhbHVlLgorCWlmKGlzTmFOKHZhbHVlKSl7cmV0dXJuIGZhbHNlO30KKwlub2RlLnN0eWxlW3NlbGVjdG9yXSA9IE1hdGgubWF4KDAsIHZhbHVlKSArICdweCc7IAorCXJldHVybiB0cnVlOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC5zdHlsZVNoZWV0ID0gbnVsbDsKKworLy8gRklYTUU6IHRoaXMgaXMgYSByZWFsbHkgYmFzaWMgc3R1YiBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBjc3NSdWxlcywgYnV0CisvLyBpdCBhc3N1bWVzIHRoYXQgeW91IGtub3cgdGhlIGluZGV4IG9mIHRoZSBjc3NSdWxlIHRoYXQgeW91IHdhbnQgdG8gYWRkIAorLy8gb3IgcmVtb3ZlLCBtYWtpbmcgaXQgbGVzcyB0aGFuIHVzZWZ1bC4gIFNvIHdlIG5lZWQgc29tZXRoaW5nIHRoYXQgY2FuIAorLy8gc2VhcmNoIGZvciB0aGUgc2VsZWN0b3IgdGhhdCB5b3UgeW91IHdhbnQgdG8gcmVtb3ZlLgorZG9qby5odG1sLmluc2VydENzc1J1bGUgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9zZWxlY3RvciwgLyogc3RyaW5nICovZGVjbGFyYXRpb24sIC8qIGludGVnZXI/ICovaW5kZXgpIHsKKwkvLwlzdW1tYXJ5CisJLy8JQXR0ZW1wdCB0byBpbnNlcnQgZGVjbGFyYXRpb24gYXMgc2VsZWN0b3Igb24gdGhlIGludGVybmFsIHN0eWxlc2hlZXQ7IGlmIGluZGV4IHRyeSB0byBzZXQgaXQgdGhlcmUuCisJaWYgKCFkb2pvLmh0bWwuc3R5bGVTaGVldCkgeworCQlpZiAoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCkgeyAvLyBJRQorCQkJZG9qby5odG1sLnN0eWxlU2hlZXQgPSBkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KCk7CisJCX0gZWxzZSBpZiAoZG9jdW1lbnQuc3R5bGVTaGVldHNbMF0pIHsgLy8gcmVzdAorCQkJLy8gRklYTUU6IHNob3VsZCBjcmVhdGUgYSBuZXcgc3R5bGUgc2hlZXQgaGVyZQorCQkJLy8gZmFsbCBiYWNrIG9uIGFuIGV4c2l0aW5nIHN0eWxlIHNoZWV0CisJCQlkb2pvLmh0bWwuc3R5bGVTaGVldCA9IGRvY3VtZW50LnN0eWxlU2hlZXRzWzBdOworCQl9IGVsc2UgeyAKKwkJCXJldHVybiBudWxsOwkvLwlpbnRlZ2VyIAorCQl9IC8vIGZhaWwKKwl9CisKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgLy8gaW5kZXggbWF5ID09IDAKKwkJaWYgKGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzKSB7IC8vIFczCisJCQlpbmRleCA9IGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aDsKKwkJfSBlbHNlIGlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcykgeyAvLyBJRQorCQkJaW5kZXggPSBkb2pvLmh0bWwuc3R5bGVTaGVldC5ydWxlcy5sZW5ndGg7CisJCX0gZWxzZSB7IAorCQkJcmV0dXJuIG51bGw7CS8vCWludGVnZXIgCisJCX0gLy8gZmFpbAorCX0KKworCWlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5pbnNlcnRSdWxlKSB7IC8vIFczCisJCXZhciBydWxlID0gc2VsZWN0b3IgKyAiIHsgIiArIGRlY2xhcmF0aW9uICsgIiB9IjsKKwkJcmV0dXJuIGRvam8uaHRtbC5zdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgaW5kZXgpOwkvLwlpbnRlZ2VyCisJfSBlbHNlIGlmIChkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKSB7IC8vIElFCisJCXJldHVybiBkb2pvLmh0bWwuc3R5bGVTaGVldC5hZGRSdWxlKHNlbGVjdG9yLCBkZWNsYXJhdGlvbiwgaW5kZXgpOwkvLwlpbnRlZ2VyCisJfSBlbHNlIHsgCisJCXJldHVybiBudWxsOyAvLyBpbnRlZ2VyCisJfSAvLyBmYWlsCit9CisKK2Rvam8uaHRtbC5yZW1vdmVDc3NSdWxlID0gZnVuY3Rpb24oLyogaW50ZWdlcj8gKi9pbmRleCl7CisJLy8Jc3VtbWFyeQorCS8vCUF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBydWxlIGF0IGluZGV4LgorCWlmKCFkb2pvLmh0bWwuc3R5bGVTaGVldCl7CisJCWRvam8uZGVidWcoIm5vIHN0eWxlc2hlZXQgZGVmaW5lZCBmb3IgcmVtb3ZpbmcgcnVsZXMiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJaWYoIWluZGV4KXsKKwkJCWluZGV4ID0gZG9qby5odG1sLnN0eWxlU2hlZXQucnVsZXMubGVuZ3RoOworCQkJZG9qby5odG1sLnN0eWxlU2hlZXQucmVtb3ZlUnVsZShpbmRleCk7CisJCX0KKwl9ZWxzZSBpZihkb2N1bWVudC5zdHlsZVNoZWV0c1swXSl7CisJCWlmKCFpbmRleCl7CisJCQlpbmRleCA9IGRvam8uaHRtbC5zdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aDsKKwkJfQorCQlkb2pvLmh0bWwuc3R5bGVTaGVldC5kZWxldGVSdWxlKGluZGV4KTsKKwl9CisJcmV0dXJuIHRydWU7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzID0gW107IC8vIGNhY2hlIGNvbnRhaW5lciBuZWVkZWQgYmVjYXVzZSBJRSByZWZvcm1hdHMgY3NzVGV4dCB3aGVuIGFkZGVkIHRvIERPTQorZG9qby5odG1sLmluc2VydENzc0ZpbGUgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9VUkksIC8qIEhUTUxEb2N1bWVudD8gKi9kb2MsIC8qIGJvb2xlYW4/ICovY2hlY2tEdXBsaWNhdGVzLCAvKiBib29sZWFuICovZmFpbF9vayl7CisJLy8Jc3VtbWFyeQorCS8vIGNhbGxzIGNzcyBieSBYbWxIVFRQIGFuZCBpbnNlcnRzIGl0IGludG8gRE9NIGFzIDxzdHlsZSBbd2lkZ2V0VHlwZT0id2lkZ2V0VHlwZSJdPiAqZG93bmxvYWRlZCBjc3NUZXh0Kjwvc3R5bGU+CisJaWYoIVVSSSl7IHJldHVybjsgfQorCWlmKCFkb2MpeyBkb2MgPSBkb2N1bWVudDsgfQorCXZhciBjc3NTdHIgPSBkb2pvLmhvc3RlbnYuZ2V0VGV4dChVUkksIGZhbHNlLCBmYWlsX29rKTsKKwlpZihjc3NTdHI9PT1udWxsKXsgcmV0dXJuOyB9CisJY3NzU3RyID0gZG9qby5odG1sLmZpeFBhdGhzSW5Dc3NUZXh0KGNzc1N0ciwgVVJJKTsKKworCWlmKGNoZWNrRHVwbGljYXRlcyl7CisJCXZhciBpZHggPSAtMSwgbm9kZSwgZW50ID0gZG9qby5odG1sLl9pbnNlcnRlZENzc0ZpbGVzOworCQlmb3IodmFyIGkgPSAwOyBpIDwgZW50Lmxlbmd0aDsgaSsrKXsKKwkJCWlmKChlbnRbaV0uZG9jID09IGRvYykgJiYgKGVudFtpXS5jc3NUZXh0ID09IGNzc1N0cikpeworCQkJCWlkeCA9IGk7IG5vZGUgPSBlbnRbaV0ubm9kZVJlZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZW50IGRlbGV0ZWQgb3VyIG5vZGUKKwkJaWYobm9kZSl7CisJCQl2YXIgc3R5bGVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpOworCQkJZm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKyl7CisJCQkJaWYoc3R5bGVzW2ldID09IG5vZGUpeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gZGVsZXRlIHRoaXMgZW50cnkKKwkJCWRvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5zaGlmdChpZHgsIDEpOworCQl9CisJfQorCisJdmFyIHN0eWxlID0gZG9qby5odG1sLmluc2VydENzc1RleHQoY3NzU3RyLCBkb2MpOworCWRvam8uaHRtbC5faW5zZXJ0ZWRDc3NGaWxlcy5wdXNoKHsnZG9jJzogZG9jLCAnY3NzVGV4dCc6IGNzc1N0ciwgJ25vZGVSZWYnOiBzdHlsZX0pOworCisJLy8gaW5zZXJ0IGN1c3RvbSBhdHRyaWJ1dGUgZXggZGJnSHJlZj0iLi4vZm9vLmNzcyIgdXNlZnVsbCB3aGVuIGRlYnVnZ2luZyBpbiBET00gaW5zcGVjdG9ycywgbm8/CisJaWYoc3R5bGUgJiYgZGpDb25maWcuaXNEZWJ1Zyl7CisJCXN0eWxlLnNldEF0dHJpYnV0ZSgiZGJnSHJlZiIsIFVSSSk7CisJfQorCXJldHVybiBzdHlsZTsJLy8JSFRNTFN0eWxlRWxlbWVudAorfQorCitkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL2Nzc1N0ciwgLyogSFRNTERvY3VtZW50PyAqL2RvYywgLyogc3RyaW5nPyAqL1VSSSl7CisJLy8Jc3VtbWFyeQorCS8vCUF0dGVtcHQgdG8gaW5zZXJ0IENTUyBydWxlcyBpbnRvIHRoZSBkb2N1bWVudCB0aHJvdWdoIGluc2VydGluZyBhIHN0eWxlIGVsZW1lbnQKKwkvLyBEb21Ob2RlIFN0eWxlICA9IGluc2VydENzc1RleHQoU3RyaW5nICIuZG9qb01lbnUge2NvbG9yOiBncmVlbjt9IlssIERvbURvYyBkb2N1bWVudCwgZG9qby51cmkuVXJpIFVybCBdKQorCWlmKCFjc3NTdHIpeyAKKwkJcmV0dXJuOyAvLwlIVE1MU3R5bGVFbGVtZW50CisJfQorCWlmKCFkb2MpeyBkb2MgPSBkb2N1bWVudDsgfQorCWlmKFVSSSl7Ly8gZml4IHBhdGhzIGluIGNzc1N0cgorCQljc3NTdHIgPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQoY3NzU3RyLCBVUkkpOworCX0KKwl2YXIgc3R5bGUgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKwlzdHlsZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9jc3MiKTsKKwkvLyBJRSBpcyBiMHJrZW4gZW5vdWdoIHRvIHJlcXVpcmUgdGhhdCB3ZSBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIGRvYworCS8vIGJlZm9yZSBjaGFuZ2luZyBpdCdzIHByb3BlcnRpZXMKKwl2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCWlmKCFoZWFkKXsgLy8gbXVzdCBoYXZlIGEgaGVhZCB0YWcgCisJCWRvam8uZGVidWcoIk5vIGhlYWQgdGFnIGluIGRvY3VtZW50LCBhYm9ydGluZyBzdHlsZXMiKTsKKwkJcmV0dXJuOwkvLwlIVE1MU3R5bGVFbGVtZW50CisJfWVsc2V7CisJCWhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOworCX0KKwlpZihzdHlsZS5zdHlsZVNoZWV0KXsvLyBJRQorCQl2YXIgc2V0RnVuYyA9IGZ1bmN0aW9uKCl7IAorCQkJdHJ5eworCQkJCXN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzc1N0cjsKKwkJCX1jYXRjaChlKXsgZG9qby5kZWJ1ZyhlKTsgfQorCQl9OworCQlpZihzdHlsZS5zdHlsZVNoZWV0LmRpc2FibGVkKXsKKwkJCXNldFRpbWVvdXQoc2V0RnVuYywgMTApOworCQl9ZWxzZXsKKwkJCXNldEZ1bmMoKTsKKwkJfQorCX1lbHNleyAvLyB3M2MKKwkJdmFyIGNzc1RleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoY3NzU3RyKTsKKwkJc3R5bGUuYXBwZW5kQ2hpbGQoY3NzVGV4dCk7CisJfQorCXJldHVybiBzdHlsZTsJLy8JSFRNTFN0eWxlRWxlbWVudAorfQorCitkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi9jc3NTdHIsIC8qIHN0cmluZyAqL1VSSSl7CisJLy8Jc3VtbWFyeQorCS8vIHVzYWdlOiBjc3NUZXh0IGNvbWVzIGZyb20gZG9qb3Jvb3Qvc3JjL3dpZGdldC90ZW1wbGF0ZXMvRm9vYmFyLmNzcworCS8vIAlpdCBoYXMgLmRvam9Gb28geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Jhci5wbmcpO30gdGhlbiB1cmkgc2hvdWxkIHBvaW50IHRvIGRvam9yb290L3NyYy93aWRnZXQvdGVtcGxhdGVzLworCWlmKCFjc3NTdHIgfHwgIVVSSSl7IHJldHVybjsgfQorCXZhciBtYXRjaCwgc3RyID0gIiIsIHVybCA9ICIiLCB1cmxDaHJzID0gIltcXHRcXHNcXHdcXChcXClcXC9cXC5cXFxcJ1wiLTojPSY/fl0rIjsKKwl2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCd1cmxcXChcXHMqKCcrdXJsQ2hycysnKVxccypcXCknKTsKKwl2YXIgcmVnZXhQcm90b2NvbCA9IC8oZmlsZXxodHRwcz98ZnRwcz8pOlwvXC8vOworCXJlZ2V4VHJpbSA9IG5ldyBSZWdFeHAoIl5bXFxzXSooWydcIl0/KSgiK3VybENocnMrIilcXDFbXFxzXSo/JCIpOworCWlmKGRvam8ucmVuZGVyLmh0bWwuaWU1NSB8fCBkb2pvLnJlbmRlci5odG1sLmllNjApeworCQl2YXIgcmVnZXhJZSA9IG5ldyBSZWdFeHAoIkFscGhhSW1hZ2VMb2FkZXJcXCgoLiopc3JjXD1bJ1wiXSgiK3VybENocnMrIilbJ1wiXSIpOworCQkvLyBUT0RPOiBuZWVkIHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIGFuZCBBbHBoYUltYWdlTG9hZGVyIHNlZSAjMTQ0MQorCQkvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uIGJyZWFrcyBvbiBidWlsZCB3aXRoIGludGVybl9zdHJpbmdzCisJCXdoaWxlKG1hdGNoID0gcmVnZXhJZS5leGVjKGNzc1N0cikpeworCQkJdXJsID0gbWF0Y2hbMl0ucmVwbGFjZShyZWdleFRyaW0sICIkMiIpOworCQkJaWYoIXJlZ2V4UHJvdG9jb2wuZXhlYyh1cmwpKXsKKwkJCQl1cmwgPSAobmV3IGRvam8udXJpLlVyaShVUkksIHVybCkudG9TdHJpbmcoKSk7CisJCQl9CisJCQlzdHIgKz0gY3NzU3RyLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyAiQWxwaGFJbWFnZUxvYWRlcigiICsgbWF0Y2hbMV0gKyAic3JjPSciICsgdXJsICsgIiciOworCQkJY3NzU3RyID0gY3NzU3RyLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJCX0KKwkJY3NzU3RyID0gc3RyICsgY3NzU3RyOworCQlzdHIgPSAiIjsKKwl9CisKKwl3aGlsZShtYXRjaCA9IHJlZ2V4LmV4ZWMoY3NzU3RyKSl7CisJCXVybCA9IG1hdGNoWzFdLnJlcGxhY2UocmVnZXhUcmltLCAiJDIiKTsKKwkJaWYoIXJlZ2V4UHJvdG9jb2wuZXhlYyh1cmwpKXsKKwkJCXVybCA9IChuZXcgZG9qby51cmkuVXJpKFVSSSwgdXJsKS50b1N0cmluZygpKTsKKwkJfQorCQlzdHIgKz0gY3NzU3RyLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyAidXJsKCIgKyB1cmwgKyAiKSI7CisJCWNzc1N0ciA9IGNzc1N0ci5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworCX0KKwlyZXR1cm4gc3RyICsgY3NzU3RyOwkvLwlzdHJpbmcKK30KKworZG9qby5odG1sLnNldEFjdGl2ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbigvKiBzdHJpbmcgKi90aXRsZSl7CisJLy8Jc3VtbWFyeQorCS8vCUFjdGl2YXRlIHN0eWxlIHNoZWV0IHdpdGggc3BlY2lmaWVkIHRpdGxlLgorCXZhciBpID0gMCwgYSwgZWxzID0gZG9qby5kb2MoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOworCXdoaWxlIChhID0gZWxzW2krK10pIHsKKwkJaWYoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikgIT0gLTEgJiYgYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpeworCQkJYS5kaXNhYmxlZCA9IHRydWU7CisJCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInRpdGxlIikgPT0gdGl0bGUpIHsgYS5kaXNhYmxlZCA9IGZhbHNlOyB9CisJCX0KKwl9Cit9CisKK2Rvam8uaHRtbC5nZXRBY3RpdmVTdHlsZVNoZWV0ID0gZnVuY3Rpb24oKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZXNoZWV0CisJdmFyIGkgPSAwLCBhLCBlbHMgPSBkb2pvLmRvYygpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7CisJd2hpbGUgKGEgPSBlbHNbaSsrXSkgeworCQlpZiAoYS5nZXRBdHRyaWJ1dGUoInJlbCIpLmluZGV4T2YoInN0eWxlIikgIT0gLTEgCisJCQkmJiBhLmdldEF0dHJpYnV0ZSgidGl0bGUiKSAKKwkJCSYmICFhLmRpc2FibGVkCisJCSl7CisJCQlyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInRpdGxlIik7CS8vCXN0cmluZyAKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsJLy8Jc3RyaW5nCit9CisKK2Rvam8uaHRtbC5nZXRQcmVmZXJyZWRTdHlsZVNoZWV0ID0gZnVuY3Rpb24oKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJuIHRoZSBwcmVmZXJyZWQgc3R5bGVzaGVldCB0aXRsZSAoaS5lLiBsaW5rIHdpdGhvdXQgYWx0IGF0dHJpYnV0ZSkKKwl2YXIgaSA9IDAsIGEsIGVscyA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsKKwl3aGlsZSAoYSA9IGVsc1tpKytdKSB7CisJCWlmKGEuZ2V0QXR0cmlidXRlKCJyZWwiKS5pbmRleE9mKCJzdHlsZSIpICE9IC0xCisJCQkmJiBhLmdldEF0dHJpYnV0ZSgicmVsIikuaW5kZXhPZigiYWx0IikgPT0gLTEKKwkJCSYmIGEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpCisJCSl7IAorCQkJcmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAJLy8Jc3RyaW5nCisJCX0KKwl9CisJcmV0dXJuIG51bGw7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3MgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlBcHBsaWVzIHByZS1zZXQgY2xhc3MgbmFtZXMgYmFzZWQgb24gYnJvd3NlciAmIHZlcnNpb24gdG8gdGhlIHBhc3NlZCBub2RlLgorCS8vCU1vZGlmaWVkIHZlcnNpb24gb2YgTW9ycmlzJyBDU1MgaGFjay4KKwl2YXIgZHJoPWRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGNsYXNzZXMgPSB7CisJCWRqX2llOiBkcmguaWUsCisJCWRqX2llNTU6IGRyaC5pZTU1LAorCQlkal9pZTY6IGRyaC5pZTYwLAorCQlkal9pZTc6IGRyaC5pZTcwLAorCQlkal9pZXF1aXJrczogZHJoLmllICYmIGRyaC5xdWlya3MsCisJCWRqX29wZXJhOiBkcmgub3BlcmEsCisJCWRqX29wZXJhODogZHJoLm9wZXJhICYmIChNYXRoLmZsb29yKGRvam8ucmVuZGVyLnZlcnNpb24pPT04KSwKKwkJZGpfb3BlcmE5OiBkcmgub3BlcmEgJiYgKE1hdGguZmxvb3IoZG9qby5yZW5kZXIudmVyc2lvbik9PTkpLAorCQlkal9raHRtbDogZHJoLmtodG1sLAorCQlkal9zYWZhcmk6IGRyaC5zYWZhcmksCisJCWRqX2dlY2tvOiBkcmgubW96aWxsYQorCX07IC8vIG5vIGRvam8gdW5zdXBwb3J0ZWQgYnJvd3NlcnMKKwlmb3IodmFyIHAgaW4gY2xhc3Nlcyl7CisJCWlmKGNsYXNzZXNbcF0peworCQkJZG9qby5odG1sLmFkZENsYXNzKG5vZGUsIHApOworCQl9CisJfQorfTsKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuZGlzcGxheSIpOworCisKK2Rvam8uaHRtbC5fdG9nZ2xlID0gZnVuY3Rpb24obm9kZSwgdGVzdGVyLCBzZXR0ZXIpeworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJc2V0dGVyKG5vZGUsICF0ZXN0ZXIobm9kZSkpOworCXJldHVybiB0ZXN0ZXIobm9kZSk7Cit9CisKK2Rvam8uaHRtbC5zaG93ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JU2hvdyB0aGUgcGFzc2VkIGVsZW1lbnQgYnkgcmV2ZXJ0aW5nIGRpc3BsYXkgcHJvcGVydHkgc2V0IGJ5IGRvam8uaHRtbC5oaWRlCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZihkb2pvLmh0bWwuZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAnZGlzcGxheScpPT0nbm9uZScpeworCQlkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwgJ2Rpc3BsYXknLCAobm9kZS5kb2pvRGlzcGxheUNhY2hlfHwnJykpOworCQlub2RlLmRvam9EaXNwbGF5Q2FjaGUgPSB1bmRlZmluZWQ7CS8vIGNhbm5vdCB1c2UgZGVsZXRlIG9uIGEgbm9kZSBpbiBJRTYKKwl9Cit9CisKK2Rvam8uaHRtbC5oaWRlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JSGlkZSB0aGUgcGFzc2VkIGVsZW1lbnQgYnkgc2V0dGluZyBkaXNwbGF5Om5vbmUKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKHR5cGVvZiBub2RlWyJkb2pvRGlzcGxheUNhY2hlIl0gPT0gInVuZGVmaW5lZCIpeyAvLyBpdCBjb3VsZCA9PSAnJywgc28gd2UgY2Fubm90IHNheSAhbm9kZS5kb2pvRGlzcGxheUNvdW50CisJCXZhciBkID0gZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2Rpc3BsYXknKQorCQlpZihkIT0nbm9uZScpeworCQkJbm9kZS5kb2pvRGlzcGxheUNhY2hlID0gZDsKKwkJfQorCX0KKwlkb2pvLmh0bWwuc2V0U3R5bGUobm9kZSwgJ2Rpc3BsYXknLCAnbm9uZScpOworfQorCitkb2pvLmh0bWwuc2V0U2hvd2luZyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogYm9vbGVhbj8gKi9zaG93aW5nKXsKKwkvLwlzdW1tYXJ5CisJLy8gQ2FsbHMgc2hvdygpIGlmIHNob3dpbmcgaXMgdHJ1ZSwgaGlkZSgpIG90aGVyd2lzZQorCWRvam8uaHRtbFsoc2hvd2luZyA/ICdzaG93JyA6ICdoaWRlJyldKG5vZGUpOworfQorCitkb2pvLmh0bWwuaXNTaG93aW5nID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc3BsYXllZCBvciBub3QuCisJLy8gRklYTUU6IHJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGJhZCwgaXNIaWRkZW4gd291bGQgYmUgZWFzaWVyIHRvIG1ha2UgY29ycmVjdAorCXJldHVybiAoZG9qby5odG1sLmdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2Rpc3BsYXknKSAhPSAnbm9uZScpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC50b2dnbGVTaG93aW5nID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gQ2FsbCBzZXRTaG93aW5nKCkgb24gbm9kZSB3aXRoIHRoZSBjb21wbGVtZW50IG9mIGlzU2hvd2luZygpLCB0aGVuIHJldHVybiB0aGUgbmV3IHZhbHVlIG9mIGlzU2hvd2luZygpCisJcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsIGRvam8uaHRtbC5pc1Nob3dpbmcsIGRvam8uaHRtbC5zZXRTaG93aW5nKTsJLy8JYm9vbGVhbgorfQorCisvLyBTaW1wbGUgbWFwcGluZyBvZiB0YWcgbmFtZXMgdG8gZGlzcGxheSB2YWx1ZXMKKy8vIEZJWE1FOiBzaW1wbGlzdGljIAorZG9qby5odG1sLmRpc3BsYXlNYXAgPSB7IHRyOiAnJywgdGQ6ICcnLCB0aDogJycsIGltZzogJ2lubGluZScsIHNwYW46ICdpbmxpbmUnLCBpbnB1dDogJ2lubGluZScsIGJ1dHRvbjogJ2lubGluZScgfTsKKworZG9qby5odG1sLnN1Z2dlc3REaXNwbGF5QnlUYWdOYW1lID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gU3VnZ2VzdCBhIHZhbHVlIGZvciB0aGUgZGlzcGxheSBwcm9wZXJ0eSB0aGF0IHdpbGwgc2hvdyAnbm9kZScgYmFzZWQgb24gaXQncyB0YWcKKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCWlmKG5vZGUgJiYgbm9kZS50YWdOYW1lKXsKKwkJdmFyIHRhZyA9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworCQlyZXR1cm4gKHRhZyBpbiBkb2pvLmh0bWwuZGlzcGxheU1hcCA/IGRvam8uaHRtbC5kaXNwbGF5TWFwW3RhZ10gOiAnYmxvY2snKTsJLy8Jc3RyaW5nCisJfQorfQorCitkb2pvLmh0bWwuc2V0RGlzcGxheSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogc3RyaW5nICovZGlzcGxheSl7CisJLy8Jc3VtbWFyeQorCS8vIAlTZXRzIHRoZSB2YWx1ZSBvZiBzdHlsZS5kaXNwbGF5IHRvIHZhbHVlIG9mICdkaXNwbGF5JyBwYXJhbWV0ZXIgaWYgaXQgaXMgYSBzdHJpbmcuCisJLy8gCU90aGVyd2lzZSwgaWYgJ2Rpc3BsYXknIGlzIGZhbHNlLCBzZXQgc3R5bGUuZGlzcGxheSB0byAnbm9uZScuCisJLy8gCUZpbmFsbHksIHNldCAnZGlzcGxheScgdG8gYSBzdWdnZXN0ZWQgZGlzcGxheSB2YWx1ZSBiYXNlZCBvbiB0aGUgbm9kZSdzIHRhZworCWRvam8uaHRtbC5zZXRTdHlsZShub2RlLCAnZGlzcGxheScsICgoZGlzcGxheSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2YgZGlzcGxheSA9PSAic3RyaW5nIikgPyBkaXNwbGF5IDogKGRpc3BsYXkgPyBkb2pvLmh0bWwuc3VnZ2VzdERpc3BsYXlCeVRhZ05hbWUobm9kZSkgOiAnbm9uZScpKSk7Cit9CisKK2Rvam8uaHRtbC5pc0Rpc3BsYXllZCA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIAlJcyB0cnVlIGlmIHRoZSB0aGUgY29tcHV0ZWQgZGlzcGxheSBzdHlsZSBmb3Igbm9kZSBpcyBub3QgJ25vbmUnCisJLy8gCUZJWE1FOiByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBiYWQsIGlzTm90RGlzcGxheWVkIHdvdWxkIGJlIGVhc2llciB0byBtYWtlIGNvcnJlY3QKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdkaXNwbGF5JykgIT0gJ25vbmUnKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwudG9nZ2xlRGlzcGxheSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIAlDYWxsIHNldERpc3BsYXkoKSBvbiBub2RlIHdpdGggdGhlIGNvbXBsZW1lbnQgb2YgaXNEaXNwbGF5ZWQoKSwgdGhlbgorCS8vIAlyZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiBpc0Rpc3BsYXllZCgpCisJcmV0dXJuIGRvam8uaHRtbC5fdG9nZ2xlKG5vZGUsIGRvam8uaHRtbC5pc0Rpc3BsYXllZCwgZG9qby5odG1sLnNldERpc3BsYXkpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC5zZXRWaXNpYmlsaXR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi92aXNpYmlsaXR5KXsKKwkvLwlzdW1tYXJ5CisJLy8gCVNldHMgdGhlIHZhbHVlIG9mIHN0eWxlLnZpc2liaWxpdHkgdG8gdmFsdWUgb2YgJ3Zpc2liaWxpdHknIHBhcmFtZXRlciBpZiBpdCBpcyBhIHN0cmluZy4KKwkvLyAJT3RoZXJ3aXNlLCBpZiAndmlzaWJpbGl0eScgaXMgZmFsc2UsIHNldCBzdHlsZS52aXNpYmlsaXR5IHRvICdoaWRkZW4nLiBGaW5hbGx5LCBzZXQgc3R5bGUudmlzaWJpbGl0eSB0byAndmlzaWJsZScuCisJZG9qby5odG1sLnNldFN0eWxlKG5vZGUsICd2aXNpYmlsaXR5JywgKCh2aXNpYmlsaXR5IGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiB2aXNpYmlsaXR5ID09ICJzdHJpbmciKSA/IHZpc2liaWxpdHkgOiAodmlzaWJpbGl0eSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKSkpOworfQorCitkb2pvLmh0bWwuaXNWaXNpYmxlID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8gCVJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlIGNvbXB1dGVkIHZpc2liaWxpdHkgc3R5bGUgZm9yIG5vZGUgaXMgbm90ICdoaWRkZW4nCisJLy8gCUZJWE1FOiByZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBiYWQsIGlzSW52aXNpYmxlIHdvdWxkIGJlIGVhc2llciB0byBtYWtlIGNvcnJlY3QKKwlyZXR1cm4gKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICd2aXNpYmlsaXR5JykgIT0gJ2hpZGRlbicpOwkvLwlib29sZWFuCit9CisKK2Rvam8uaHRtbC50b2dnbGVWaXNpYmlsaXR5ID0gZnVuY3Rpb24obm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vIENhbGwgc2V0VmlzaWJpbGl0eSgpIG9uIG5vZGUgd2l0aCB0aGUgY29tcGxlbWVudCBvZiBpc1Zpc2libGUoKSwgdGhlbiByZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiBpc1Zpc2libGUoKQorCXJldHVybiBkb2pvLmh0bWwuX3RvZ2dsZShub2RlLCBkb2pvLmh0bWwuaXNWaXNpYmxlLCBkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eSk7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLnNldE9wYWNpdHkgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIGZsb2F0ICovb3BhY2l0eSwgLyogYm9vbGVhbj8gKi9kb250Rml4T3BhY2l0eSl7CisJLy8Jc3VtbWFyeQorCS8vCVNldHMgdGhlIG9wYWNpdHkgb2Ygbm9kZSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LgorCS8vCWZsb2F0IGJldHdlZW4gMC4wICh0cmFuc3BhcmVudCkgYW5kIDEuMCAob3BhcXVlKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCWlmKCFkb250Rml4T3BhY2l0eSl7CisJCWlmKCBvcGFjaXR5ID49IDEuMCl7CisJCQlpZihoLmllKXsKKwkJCQlkb2pvLmh0bWwuY2xlYXJPcGFjaXR5KG5vZGUpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCW9wYWNpdHkgPSAwLjk5OTk5OTsKKwkJCX0KKwkJfWVsc2UgaWYoIG9wYWNpdHkgPCAwLjApeyBvcGFjaXR5ID0gMDsgfQorCX0KKwlpZihoLmllKXsKKwkJaWYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJ0ciIpeworCQkJLy8gRklYTUU6IGlzIHRoaXMgdG9vIG5haXZlPyB3aWxsIHdlIGdldCBtb3JlIHRoYW4gd2Ugd2FudD8KKwkJCXZhciB0ZHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJZm9yKHZhciB4PTA7IHg8dGRzLmxlbmd0aDsgeCsrKXsKKwkJCQl0ZHNbeF0uc3R5bGUuZmlsdGVyID0gIkFscGhhKE9wYWNpdHk9IitvcGFjaXR5KjEwMCsiKSI7CisJCQl9CisJCX0KKwkJbm9kZS5zdHlsZS5maWx0ZXIgPSAiQWxwaGEoT3BhY2l0eT0iK29wYWNpdHkqMTAwKyIpIjsKKwl9ZWxzZSBpZihoLm1veil7CisJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7IC8vIGZmb3ggMS4wIGRpcmVjdGx5IHN1cHBvcnRzICJvcGFjaXR5IgorCQlub2RlLnN0eWxlLk1vek9wYWNpdHkgPSBvcGFjaXR5OworCX1lbHNlIGlmKGguc2FmYXJpKXsKKwkJbm9kZS5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTsgLy8gMS4zIGRpcmVjdGx5IHN1cHBvcnRzICJvcGFjaXR5IgorCQlub2RlLnN0eWxlLktodG1sT3BhY2l0eSA9IG9wYWNpdHk7CisJfWVsc2V7CisJCW5vZGUuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJfQorfQorCitkb2pvLmh0bWwuY2xlYXJPcGFjaXR5ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JQ2xlYXJzIGFueSBvcGFjaXR5IHNldHRpbmcgb24gdGhlIHBhc3NlZCBlbGVtZW50LgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIG5zID0gbm9kZS5zdHlsZTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJaWYoaC5pZSl7CisJCXRyeSB7CisJCQlpZiggbm9kZS5maWx0ZXJzICYmIG5vZGUuZmlsdGVycy5hbHBoYSApeworCQkJCW5zLmZpbHRlciA9ICIiOyAvLyBGSVhNRTogbWF5IGdldCByaWQgb2Ygb3RoZXIgZmlsdGVyIGVmZmVjdHMKKwkJCX0KKwkJfSBjYXRjaChlKSB7CisJCQkvKgorCQkJICogSUU3IGdpdmVzIGVycm9yIGlmIG5vZGUuZmlsdGVycyBub3Qgc2V0OworCQkJICogZG9uJ3Qga25vdyB3aHkgb3IgaG93IHRvIHdvcmthcm91bmQgKG90aGVyIHRoYW4gdGhpcykKKwkJCSAqLworCQl9CisJfWVsc2UgaWYoaC5tb3opeworCQlucy5vcGFjaXR5ID0gMTsKKwkJbnMuTW96T3BhY2l0eSA9IDE7CisJfWVsc2UgaWYoaC5zYWZhcmkpeworCQlucy5vcGFjaXR5ID0gMTsKKwkJbnMuS2h0bWxPcGFjaXR5ID0gMTsKKwl9ZWxzZXsKKwkJbnMub3BhY2l0eSA9IDE7CisJfQorfQorCitkb2pvLmh0bWwuZ2V0T3BhY2l0eSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIG9wYWNpdHkgb2YgdGhlIHBhc3NlZCBlbGVtZW50CisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJaWYoaC5pZSl7CisJCXZhciBvcGFjID0gKG5vZGUuZmlsdGVycyAmJiBub2RlLmZpbHRlcnMuYWxwaGEgJiYKKwkJCXR5cGVvZiBub2RlLmZpbHRlcnMuYWxwaGEub3BhY2l0eSA9PSAibnVtYmVyIgorCQkJPyBub2RlLmZpbHRlcnMuYWxwaGEub3BhY2l0eSA6IDEwMCkgLyAxMDA7CisJfWVsc2V7CisJCXZhciBvcGFjID0gbm9kZS5zdHlsZS5vcGFjaXR5IHx8IG5vZGUuc3R5bGUuTW96T3BhY2l0eSB8fAorCQkJbm9kZS5zdHlsZS5LaHRtbE9wYWNpdHkgfHwgMTsKKwl9CisJcmV0dXJuIG9wYWMgPj0gMC45OTk5OTkgPyAxLjAgOiBOdW1iZXIob3BhYyk7CS8vCWZsb2F0Cit9CisKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuY29sb3IiKTsKKworCisKKworZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCXJldHVybnMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHBhc3NlZCBub2RlIGFzIGEgMzItYml0IGNvbG9yIChSR0JBKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIGNvbG9yOworCWRveworCQljb2xvciA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiYmFja2dyb3VuZC1jb2xvciIpOworCQkvLyBTYWZhcmkgZG9lc24ndCBzYXkgInRyYW5zcGFyZW50IgorCQlpZihjb2xvci50b0xvd2VyQ2FzZSgpID09ICJyZ2JhKDAsIDAsIDAsIDApIikgeyBjb2xvciA9ICJ0cmFuc3BhcmVudCI7IH0KKwkJaWYobm9kZSA9PSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKSB7IG5vZGUgPSBudWxsOyBicmVhazsgfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX13aGlsZShub2RlICYmIGRvam8ubGFuZy5pbkFycmF5KFsidHJhbnNwYXJlbnQiLCAiIl0sIGNvbG9yKSk7CisJaWYoY29sb3IgPT0gInRyYW5zcGFyZW50Iil7CisJCWNvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDBdOworCX1lbHNleworCQljb2xvciA9IGRvam8uZ2Z4LmNvbG9yLmV4dHJhY3RSR0IoY29sb3IpOworCX0KKwlyZXR1cm4gY29sb3I7CS8vCWFycmF5Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLmxheW91dCIpOworCisKKworCisKK2Rvam8uaHRtbC5zdW1BbmNlc3RvclByb3BlcnRpZXMgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3Byb3ApeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHBhc3NlZCBwcm9wZXJ0eSBvbiBhbGwgYW5jZXN0b3JzIG9mIG5vZGUuCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwlpZighbm9kZSl7IHJldHVybiAwOyB9IC8vIEZJWE1FOiB0aHJvdyBhbiBlcnJvcj8KKwkKKwl2YXIgcmV0VmFsID0gMDsKKwl3aGlsZShub2RlKXsKKwkJaWYoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3Bvc2l0aW9uJykgPT0gJ2ZpeGVkJyl7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl2YXIgdmFsID0gbm9kZVtwcm9wXTsKKwkJaWYodmFsKXsKKwkJCXJldFZhbCArPSB2YWwgLSAwOworCQkJaWYobm9kZT09ZG9qby5ib2R5KCkpeyBicmVhazsgfS8vIG9wZXJhIGFuZCBraHRtbCAjYm9keSAmICNodG1sIGhhcyB0aGUgc2FtZSB2YWx1ZXMsIHdlIG9ubHkgbmVlZCBvbmUgdmFsdWUKKwkJfQorCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCX0KKwlyZXR1cm4gcmV0VmFsOwkvLwlpbnRlZ2VyCit9CisKK2Rvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL2F0dHJpYnV0ZXMpIHsgCisJLy8Jc3VtbWFyeQorCS8vCWFsbG93cyBhIGRldiB0byBwYXNzIGEgc3RyaW5nIHNpbWlsYXIgdG8gd2hhdCB5b3UnZCBwYXNzIGluIHN0eWxlPSIiLCBhbmQgYXBwbHkgaXQgdG8gYSBub2RlLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHNwbGl0dGVkQXR0cmlicz1hdHRyaWJ1dGVzLnJlcGxhY2UoLyg7KT9ccyokLywgIiIpLnNwbGl0KCI7Iik7IAorCWZvcih2YXIgaT0wOyBpPHNwbGl0dGVkQXR0cmlicy5sZW5ndGg7IGkrKyl7IAorCQl2YXIgbmFtZVZhbHVlPXNwbGl0dGVkQXR0cmlic1tpXS5zcGxpdCgiOiIpOyAKKwkJdmFyIG5hbWU9bmFtZVZhbHVlWzBdLnJlcGxhY2UoL1xzKiQvLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKS50b0xvd2VyQ2FzZSgpOworCQl2YXIgdmFsdWU9bmFtZVZhbHVlWzFdLnJlcGxhY2UoL1xzKiQvLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKTsKKwkJc3dpdGNoKG5hbWUpeworCQkJY2FzZSAib3BhY2l0eSI6CisJCQkJZG9qby5odG1sLnNldE9wYWNpdHkobm9kZSwgdmFsdWUpOyAKKwkJCQlicmVhazsgCisJCQljYXNlICJjb250ZW50LWhlaWdodCI6CisJCQkJZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSwge2hlaWdodDogdmFsdWV9KTsgCisJCQkJYnJlYWs7IAorCQkJY2FzZSAiY29udGVudC13aWR0aCI6CisJCQkJZG9qby5odG1sLnNldENvbnRlbnRCb3gobm9kZSwge3dpZHRoOiB2YWx1ZX0pOyAKKwkJCQlicmVhazsgCisJCQljYXNlICJvdXRlci1oZWlnaHQiOgorCQkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSwge2hlaWdodDogdmFsdWV9KTsgCisJCQkJYnJlYWs7IAorCQkJY2FzZSAib3V0ZXItd2lkdGgiOgorCQkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3gobm9kZSwge3dpZHRoOiB2YWx1ZX0pOyAKKwkJCQlicmVhazsgCisJCQlkZWZhdWx0OgorCQkJCW5vZGUuc3R5bGVbZG9qby5odG1sLnRvQ2FtZWxDYXNlKG5hbWUpXT12YWx1ZTsgCisJCX0KKwl9IAorfQorCitkb2pvLmh0bWwuYm94U2l6aW5nID0geworCU1BUkdJTl9CT1g6ICJtYXJnaW4tYm94IiwKKwlCT1JERVJfQk9YOiAiYm9yZGVyLWJveCIsCisJUEFERElOR19CT1g6ICJwYWRkaW5nLWJveCIsCisJQ09OVEVOVF9CT1g6ICJjb250ZW50LWJveCIKK307CisKK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uID0gZG9qby5odG1sLmFicyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogYm9vbGVhbj8gKi9pbmNsdWRlU2Nyb2xsLCAvKiBzdHJpbmc/ICovYm94VHlwZSl7CisJLy8Jc3VtbWFyeQorCS8vCUdldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBwYXNzZWQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQgaXRzZWxmLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSwgbm9kZS5vd25lckRvY3VtZW50KTsKKwl2YXIgcmV0ID0geworCQl4OiAwLAorCQl5OiAwCisJfTsKKworCXZhciBicyA9IGRvam8uaHRtbC5ib3hTaXppbmc7CisJaWYoIWJveFR5cGUpIHsgYm94VHlwZSA9IGJzLkNPTlRFTlRfQk9YOyB9CisJdmFyIG5hdGl2ZUJveFR5cGUgPSAyOyAvL0JPUkRFUiBib3gKKwl2YXIgdGFyZ2V0Qm94VHlwZTsKKwlzd2l0Y2goYm94VHlwZSl7CisJCWNhc2UgYnMuTUFSR0lOX0JPWDoKKwkJCXRhcmdldEJveFR5cGUgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgYnMuQk9SREVSX0JPWDoKKwkJCXRhcmdldEJveFR5cGUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgYnMuUEFERElOR19CT1g6CisJCWRlZmF1bHQ6CisJCQl0YXJnZXRCb3hUeXBlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGJzLkNPTlRFTlRfQk9YOgorCQkJdGFyZ2V0Qm94VHlwZSA9IDA7CisJCQlicmVhazsKKwl9CisKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGRiID0gZG9jdW1lbnRbImJvZHkiXXx8ZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdOworCisJaWYoaC5pZSl7CisJCXdpdGgobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl7CisJCQlyZXQueCA9IGxlZnQtMjsKKwkJCXJldC55ID0gdG9wLTI7CisJCX0KKwl9ZWxzZSBpZihkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IpeworCQkvLyBtb3ppbGxhCisJCW5hdGl2ZUJveFR5cGUgPSAxOyAvL2dldEJveE9iamVjdEZvciByZXR1cm4gcGFkZGluZyBib3ggY29vcmRpbmF0ZQorCQl0cnl7CisJCQl2YXIgYm8gPSBkb2N1bWVudC5nZXRCb3hPYmplY3RGb3Iobm9kZSk7CisJCQlyZXQueCA9IGJvLnggLSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsICJzY3JvbGxMZWZ0Iik7CisJCQlyZXQueSA9IGJvLnkgLSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5vZGUsICJzY3JvbGxUb3AiKTsKKwkJfWNhdGNoKGUpeworCQkJLy8gc3F1ZWxjaAorCQl9CisJfWVsc2V7CisJCWlmKG5vZGVbIm9mZnNldFBhcmVudCJdKXsKKwkJCXZhciBlbmROb2RlOworCQkJLy8gaW4gU2FmYXJpLCBpZiB0aGUgbm9kZSBpcyBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgY2hpbGQgb2YKKwkJCS8vIHRoZSBib2R5IGFuZCB0aGUgYm9keSBoYXMgYSBtYXJnaW4gdGhlIG9mZnNldCBvZiB0aGUgY2hpbGQKKwkJCS8vIGFuZCB0aGUgYm9keSBjb250YWluIHRoZSBib2R5J3MgbWFyZ2lucywgc28gd2UgbmVlZCB0byBlbmQKKwkJCS8vIGF0IHRoZSBib2R5CisJCQlpZigJKGguc2FmYXJpKSYmCisJCQkJKG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKSYmCisJCQkJKG5vZGUucGFyZW50Tm9kZSA9PSBkYikpeworCQkJCWVuZE5vZGUgPSBkYjsKKwkJCX1lbHNleworCQkJCWVuZE5vZGUgPSBkYi5wYXJlbnROb2RlOworCQkJfQorCisJCQkvL1RPRE86IHNldCBjb3JyZWN0IG5hdGl2ZUJveFR5cGUgZm9yIHNhZmFyaS9rb25xdWVyb3IKKworCQkJaWYobm9kZS5wYXJlbnROb2RlICE9IGRiKXsKKwkJCQl2YXIgbmQgPSBub2RlOworCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwub3BlcmEpeyBuZCA9IGRiOyB9CisJCQkJcmV0LnggLT0gZG9qby5odG1sLnN1bUFuY2VzdG9yUHJvcGVydGllcyhuZCwgInNjcm9sbExlZnQiKTsKKwkJCQlyZXQueSAtPSBkb2pvLmh0bWwuc3VtQW5jZXN0b3JQcm9wZXJ0aWVzKG5kLCAic2Nyb2xsVG9wIik7CisJCQl9CisJCQl2YXIgY3Vybm9kZSA9IG5vZGU7CisJCQlkb3sKKwkJCQl2YXIgbiA9IGN1cm5vZGVbIm9mZnNldExlZnQiXTsKKwkJCQkvL0ZJWE1FOiB1Z2x5IGhhY2sgdG8gd29ya2Fyb3VuZCB0aGUgc3VibWVudSBpbiAKKwkJCQkvL3BvcHVwbWVudTIgZG9lcyBub3Qgc2hvd24gdXAgY29ycmVjdGx5IGluIG9wZXJhLiAKKwkJCQkvL1NvbWVvbmUgaGF2ZSBhIGJldHRlciB3b3JrYXJvdW5kPworCQkJCWlmKCFoLm9wZXJhIHx8IG4+MCl7CisJCQkJCXJldC54ICs9IGlzTmFOKG4pID8gMCA6IG47CisJCQkJfQorCQkJCXZhciBtID0gY3Vybm9kZVsib2Zmc2V0VG9wIl07CisJCQkJcmV0LnkgKz0gaXNOYU4obSkgPyAwIDogbTsKKwkJCQljdXJub2RlID0gY3Vybm9kZS5vZmZzZXRQYXJlbnQ7CisJCQl9d2hpbGUoKGN1cm5vZGUgIT0gZW5kTm9kZSkmJihjdXJub2RlICE9IG51bGwpKTsKKwkJfWVsc2UgaWYobm9kZVsieCJdJiZub2RlWyJ5Il0peworCQkJcmV0LnggKz0gaXNOYU4obm9kZS54KSA/IDAgOiBub2RlLng7CisJCQlyZXQueSArPSBpc05hTihub2RlLnkpID8gMCA6IG5vZGUueTsKKwkJfQorCX0KKworCS8vIGFjY291bnQgZm9yIGRvY3VtZW50IHNjcm9sbGluZyEKKwlpZihpbmNsdWRlU2Nyb2xsKXsKKwkJdmFyIHNjcm9sbCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKTsKKwkJcmV0LnkgKz0gc2Nyb2xsLnRvcDsKKwkJcmV0LnggKz0gc2Nyb2xsLmxlZnQ7CisJfQorCisJdmFyIGV4dGVudEZ1bmNBcnJheT1bZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQsIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQsIGRvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnRdOworCWlmKG5hdGl2ZUJveFR5cGUgPiB0YXJnZXRCb3hUeXBlKXsKKwkJZm9yKHZhciBpPXRhcmdldEJveFR5cGU7aTxuYXRpdmVCb3hUeXBlOysraSl7CisJCQlyZXQueSArPSBleHRlbnRGdW5jQXJyYXlbaV0obm9kZSwgJ3RvcCcpOworCQkJcmV0LnggKz0gZXh0ZW50RnVuY0FycmF5W2ldKG5vZGUsICdsZWZ0Jyk7CisJCX0KKwl9ZWxzZSBpZihuYXRpdmVCb3hUeXBlIDwgdGFyZ2V0Qm94VHlwZSl7CisJCWZvcih2YXIgaT10YXJnZXRCb3hUeXBlO2k+bmF0aXZlQm94VHlwZTstLWkpeworCQkJcmV0LnkgLT0gZXh0ZW50RnVuY0FycmF5W2ktMV0obm9kZSwgJ3RvcCcpOworCQkJcmV0LnggLT0gZXh0ZW50RnVuY0FycmF5W2ktMV0obm9kZSwgJ2xlZnQnKTsKKwkJfQorCX0KKwlyZXQudG9wID0gcmV0Lnk7CisJcmV0LmxlZnQgPSByZXQueDsKKwlyZXR1cm4gcmV0OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuCisJcmV0dXJuIChkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCBzZWxlY3RvcnMsIGF1dG9Jc1plcm8peworCXZhciB0b3RhbCA9IDA7CisJZm9yKHZhciB4PTA7IHg8c2VsZWN0b3JzLmxlbmd0aDsgeCsrKXsKKwkJdG90YWwgKz0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUobm9kZSwgc2VsZWN0b3JzW3hdLCBhdXRvSXNaZXJvKTsKKwl9CisJcmV0dXJuIHRvdGFsOworfQorCitkb2pvLmh0bWwuZ2V0TWFyZ2luID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBtYXJnaW4KKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCJdLCAoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykpLAorCQloZWlnaHQ6IGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJtYXJnaW4tdG9wIiwgIm1hcmdpbi1ib3R0b20iXSwgKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpKQorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0Qm9yZGVyID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBib3JkZXIKKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCAnbGVmdCcpICsgZG9qby5odG1sLmdldEJvcmRlckV4dGVudChub2RlLCAncmlnaHQnKSwKKwkJaGVpZ2h0OiBkb2pvLmh0bWwuZ2V0Qm9yZGVyRXh0ZW50KG5vZGUsICd0b3AnKSArIGRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQobm9kZSwgJ2JvdHRvbScpCisJfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlyZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIGJvcmRlcgorCXJldHVybiAoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICdib3JkZXItJyArIHNpZGUgKyAnLXN0eWxlJykgPT0gJ25vbmUnID8gMCA6IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKG5vZGUsICdib3JkZXItJyArIHNpZGUgKyAnLXdpZHRoJykpOwkvLyBpbnRlZ2VyCit9CisKK2Rvam8uaHRtbC5nZXRNYXJnaW5FeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlyZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIG1hcmdpbgorCXJldHVybiBkb2pvLmh0bWwuX3N1bVBpeGVsVmFsdWVzKG5vZGUsIFsibWFyZ2luLSIgKyBzaWRlXSwgZG9qby5odG1sLmlzUG9zaXRpb25BYnNvbHV0ZShub2RlKSk7CS8vCWludGVnZXIKK30KKworZG9qby5odG1sLmdldFBhZGRpbmdFeHRlbnQgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIHN0cmluZyAqL3NpZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmVxdWVzdGVkIHBhZGRpbmcgCisJcmV0dXJuIGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJwYWRkaW5nLSIgKyBzaWRlXSwgdHJ1ZSk7CS8vCWludGVnZXIKK30KKworZG9qby5odG1sLmdldFBhZGRpbmcgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYXNzZWQgbm9kZSdzIHBhZGRpbmcKKwlyZXR1cm4geworCQl3aWR0aDogZG9qby5odG1sLl9zdW1QaXhlbFZhbHVlcyhub2RlLCBbInBhZGRpbmctbGVmdCIsICJwYWRkaW5nLXJpZ2h0Il0sIHRydWUpLAorCQloZWlnaHQ6IGRvam8uaHRtbC5fc3VtUGl4ZWxWYWx1ZXMobm9kZSwgWyJwYWRkaW5nLXRvcCIsICJwYWRkaW5nLWJvdHRvbSJdLCB0cnVlKQorCX07CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0UGFkQm9yZGVyID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFzc2VkIG5vZGUncyBwYWRkaW5nIGFuZCBib3JkZXIKKwl2YXIgcGFkID0gZG9qby5odG1sLmdldFBhZGRpbmcobm9kZSk7CisJdmFyIGJvcmRlciA9IGRvam8uaHRtbC5nZXRCb3JkZXIobm9kZSk7CisJcmV0dXJuIHsgd2lkdGg6IHBhZC53aWR0aCArIGJvcmRlci53aWR0aCwgaGVpZ2h0OiBwYWQuaGVpZ2h0ICsgYm9yZGVyLmhlaWdodCB9OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmdldEJveFNpemluZyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgd2hpY2ggYm94IG1vZGVsIHRoZSBwYXNzZWQgZWxlbWVudCBpcyB3b3JraW5nIHdpdGgKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJdmFyIGJzID0gZG9qby5odG1sLmJveFNpemluZzsKKwlpZigoKGguaWUpfHwoaC5vcGVyYSkpICYmIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiaW1nIil7IAorCQl2YXIgY20gPSBkb2N1bWVudFsiY29tcGF0TW9kZSJdOworCQlpZigoY20gPT0gIkJhY2tDb21wYXQiKXx8KGNtID09ICJRdWlya3NNb2RlIikpeworCQkJcmV0dXJuIGJzLkJPUkRFUl9CT1g7IAkvLwlzdHJpbmcKKwkJfWVsc2V7CisJCQlyZXR1cm4gYnMuQ09OVEVOVF9CT1g7IAkvLwlzdHJpbmcKKwkJfQorCX1lbHNleworCQlpZihhcmd1bWVudHMubGVuZ3RoID09IDApeyBub2RlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyB9CisJCXZhciBzaXppbmc7CisJCWlmKCFoLmllKXsKKwkJCXNpemluZyA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAiLW1vei1ib3gtc2l6aW5nIik7CisJCQlpZighc2l6aW5nKXsgCisJCQkJc2l6aW5nID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJib3gtc2l6aW5nIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIChzaXppbmcgPyBzaXppbmcgOiBicy5DT05URU5UX0JPWCk7CS8vCXN0cmluZworCX0KK30KKworZG9qby5odG1sLmlzQm9yZGVyQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJucyB3aGV0aGVyIHRoZSBwYXNzZWQgZWxlbWVudCBpcyB1c2luZyBib3JkZXIgYm94IHNpemluZyBvciBub3QuCisJcmV0dXJuIChkb2pvLmh0bWwuZ2V0Qm94U2l6aW5nKG5vZGUpID09IGRvam8uaHRtbC5ib3hTaXppbmcuQk9SREVSX0JPWCk7CS8vCWJvb2xlYW4KK30KKworZG9qby5odG1sLmdldEJvcmRlckJveCA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVJldHVybnMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHBhc3NlZCBlbGVtZW50IGJhc2VkIG9uIGJvcmRlci1ib3ggc2l6aW5nLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJcmV0dXJuIHsgd2lkdGg6IG5vZGUub2Zmc2V0V2lkdGgsIGhlaWdodDogbm9kZS5vZmZzZXRIZWlnaHQgfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRQYWRkaW5nQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFkZGluZyBib3ggKHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9ib3guaHRtbCkKKwl2YXIgYm94ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsKKwl2YXIgYm9yZGVyID0gZG9qby5odG1sLmdldEJvcmRlcihub2RlKTsKKwlyZXR1cm4geworCQl3aWR0aDogYm94LndpZHRoIC0gYm9yZGVyLndpZHRoLAorCQloZWlnaHQ6Ym94LmhlaWdodCAtIGJvcmRlci5oZWlnaHQKKwl9OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLmdldENvbnRlbnRCb3ggPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb250ZW50IGJveCAoc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sKQorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9IGRvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSk7CisJcmV0dXJuIHsKKwkJd2lkdGg6IG5vZGUub2Zmc2V0V2lkdGggLSBwYWRib3JkZXIud2lkdGgsCisJCWhlaWdodDogbm9kZS5vZmZzZXRIZWlnaHQgLSBwYWRib3JkZXIuaGVpZ2h0CisJfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBvYmplY3QgKi9hcmdzKXsKKwkvLwlzdW1tYXJ5CisJLy8JU2V0cyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFzc2VkIG5vZGUgYWNjb3JkaW5nIHRvIGNvbnRlbnQgc2l6aW5nLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpZHRoID0gMDsgdmFyIGhlaWdodCA9IDA7CisJdmFyIGlzYmIgPSBkb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9IChpc2JiID8gZG9qby5odG1sLmdldFBhZEJvcmRlcihub2RlKSA6IHsgd2lkdGg6IDAsIGhlaWdodDogMH0pOworCXZhciByZXQgPSB7fTsKKwlpZih0eXBlb2YgYXJncy53aWR0aCAhPSAidW5kZWZpbmVkIil7CisJCXdpZHRoID0gYXJncy53aWR0aCArIHBhZGJvcmRlci53aWR0aDsKKwkJcmV0LndpZHRoID0gZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCAid2lkdGgiLCB3aWR0aCk7CisJfQorCWlmKHR5cGVvZiBhcmdzLmhlaWdodCAhPSAidW5kZWZpbmVkIil7CisJCWhlaWdodCA9IGFyZ3MuaGVpZ2h0ICsgcGFkYm9yZGVyLmhlaWdodDsKKwkJcmV0LmhlaWdodCA9IGRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwgImhlaWdodCIsIGhlaWdodCk7CisJfQorCXJldHVybiByZXQ7CS8vCW9iamVjdAorfQorCitkb2pvLmh0bWwuZ2V0TWFyZ2luQm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcGFzc2VkIG5vZGUgaW5jbHVkaW5nIGFueSBtYXJnaW5zLgorCXZhciBib3JkZXJib3ggPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KG5vZGUpOworCXZhciBtYXJnaW4gPSBkb2pvLmh0bWwuZ2V0TWFyZ2luKG5vZGUpOworCXJldHVybiB7IHdpZHRoOiBib3JkZXJib3gud2lkdGggKyBtYXJnaW4ud2lkdGgsIGhlaWdodDogYm9yZGVyYm94LmhlaWdodCArIG1hcmdpbi5oZWlnaHQgfTsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5zZXRNYXJnaW5Cb3ggPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUsIC8qIG9iamVjdCAqL2FyZ3MpeworCS8vCXN1bW1hcnkKKwkvLwlTZXRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBwYXNzZWQgbm9kZSB1c2luZyBtYXJnaW4gYm94IGNhbGNzLgorCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIHdpZHRoID0gMDsgdmFyIGhlaWdodCA9IDA7CisJdmFyIGlzYmIgPSBkb2pvLmh0bWwuaXNCb3JkZXJCb3gobm9kZSk7CisJdmFyIHBhZGJvcmRlciA9ICghaXNiYiA/IGRvam8uaHRtbC5nZXRQYWRCb3JkZXIobm9kZSkgOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7CisJdmFyIG1hcmdpbiA9IGRvam8uaHRtbC5nZXRNYXJnaW4obm9kZSk7CisJdmFyIHJldCA9IHt9OworCWlmKHR5cGVvZiBhcmdzLndpZHRoICE9ICJ1bmRlZmluZWQiKXsKKwkJd2lkdGggPSBhcmdzLndpZHRoIC0gcGFkYm9yZGVyLndpZHRoOworCQl3aWR0aCAtPSBtYXJnaW4ud2lkdGg7CisJCXJldC53aWR0aCA9IGRvam8uaHRtbC5zZXRQb3NpdGl2ZVBpeGVsVmFsdWUobm9kZSwgIndpZHRoIiwgd2lkdGgpOworCX0KKwlpZih0eXBlb2YgYXJncy5oZWlnaHQgIT0gInVuZGVmaW5lZCIpeworCQloZWlnaHQgPSBhcmdzLmhlaWdodCAtIHBhZGJvcmRlci5oZWlnaHQ7CisJCWhlaWdodCAtPSBtYXJnaW4uaGVpZ2h0OworCQlyZXQuaGVpZ2h0ID0gZG9qby5odG1sLnNldFBvc2l0aXZlUGl4ZWxWYWx1ZShub2RlLCAiaGVpZ2h0IiwgaGVpZ2h0KTsKKwl9CisJcmV0dXJuIHJldDsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5nZXRFbGVtZW50Qm94ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlLCAvKiBzdHJpbmcgKi90eXBlKXsKKwkvLwlzdW1tYXJ5CisJLy8JcmV0dXJuIGRpbWVzaW9ucyBvZiBhIG5vZGUgYmFzZWQgb24gdGhlIHBhc3NlZCBib3ggbW9kZWwgdHlwZS4KKwl2YXIgYnMgPSBkb2pvLmh0bWwuYm94U2l6aW5nOworCXN3aXRjaCh0eXBlKXsKKwkJY2FzZSBicy5NQVJHSU5fQk9YOgorCQkJcmV0dXJuIGRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSk7CS8vCW9iamVjdAorCQljYXNlIGJzLkJPUkRFUl9CT1g6CisJCQlyZXR1cm4gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKTsJLy8Jb2JqZWN0CisJCWNhc2UgYnMuUEFERElOR19CT1g6CisJCQlyZXR1cm4gZG9qby5odG1sLmdldFBhZGRpbmdCb3gobm9kZSk7CS8vCW9iamVjdAorCQljYXNlIGJzLkNPTlRFTlRfQk9YOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIGRvam8uaHRtbC5nZXRDb250ZW50Qm94KG5vZGUpOwkvLwlvYmplY3QKKwl9Cit9CisvLyBpbjogY29vcmRpbmF0ZSBhcnJheSBbeCx5LHcsaF0gb3IgZG9tIG5vZGUKKy8vIHJldHVybjogY29vcmRpbmF0ZSBvYmplY3QKK2Rvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3QgPSBkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkgPSBmdW5jdGlvbigvKiBhcnJheSAqL2Nvb3JkcywgLyogYm9vbGVhbj8gKi9pbmNsdWRlU2Nyb2xsLCAvKiBzdHJpbmc/ICovYm94dHlwZSkgeworCS8vCXN1bW1hcnkKKwkvLwlDb252ZXJ0cyBhbiBhcnJheSBvZiBjb29yZGluYXRlcyBpbnRvIGFuIG9iamVjdCBvZiBuYW1lZCBhcmd1bWVudHMuCisJaWYoY29vcmRzIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGNvb3JkcyA9PSAiYXJyYXkiKXsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwudG9Db29yZGluYXRlQXJyYXkiLCAidXNlIGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3Qoe2xlZnQ6ICwgdG9wOiAsIHdpZHRoOiAsIGhlaWdodDogfSkgaW5zdGVhZCIsICIwLjUiKTsKKwkJLy8gY29vcmRzIGlzIGFscmVhZHkgYW4gYXJyYXkgKG9mIGZvcm1hdCBbeCx5LHcsaF0pLCBqdXN0IHJldHVybiBpdAorCQl3aGlsZSAoIGNvb3Jkcy5sZW5ndGggPCA0ICkgeyBjb29yZHMucHVzaCgwKTsgfQorCQl3aGlsZSAoIGNvb3Jkcy5sZW5ndGggPiA0ICkgeyBjb29yZHMucG9wKCk7IH0KKwkJdmFyIHJldCA9IHsKKwkJCWxlZnQ6IGNvb3Jkc1swXSwKKwkJCXRvcDogY29vcmRzWzFdLAorCQkJd2lkdGg6IGNvb3Jkc1syXSwKKwkJCWhlaWdodDogY29vcmRzWzNdCisJCX07CisJfWVsc2UgaWYoIWNvb3Jkcy5ub2RlVHlwZSAmJiAhKGNvb3JkcyBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2YgY29vcmRzID09ICJzdHJpbmciKSAmJgorCQkJICgnd2lkdGgnIGluIGNvb3JkcyB8fCAnaGVpZ2h0JyBpbiBjb29yZHMgfHwgJ2xlZnQnIGluIGNvb3JkcyB8fAorCQkJICAneCcgaW4gY29vcmRzIHx8ICd0b3AnIGluIGNvb3JkcyB8fCAneScgaW4gY29vcmRzKSl7CisJCS8vIGNvb3JkcyBpcyBhIGNvb3JkaW5hdGUgb2JqZWN0IG9yIGF0IGxlYXN0IHBhcnQgb2Ygb25lCisJCXZhciByZXQgPSB7CisJCQlsZWZ0OiBjb29yZHMubGVmdHx8Y29vcmRzLnh8fDAsCisJCQl0b3A6IGNvb3Jkcy50b3B8fGNvb3Jkcy55fHwwLAorCQkJd2lkdGg6IGNvb3Jkcy53aWR0aHx8MCwKKwkJCWhlaWdodDogY29vcmRzLmhlaWdodHx8MAorCQl9OworCX1lbHNleworCQkvLyBjb29yZHMgaXMgYW4gZG9tIG9iamVjdCAob3IgZG9tIG9iamVjdCBpZCk7IHJldHVybiBpdCdzIGNvb3JkaW5hdGVzCisJCXZhciBub2RlID0gZG9qby5ieUlkKGNvb3Jkcyk7CisJCXZhciBwb3MgPSBkb2pvLmh0bWwuYWJzKG5vZGUsIGluY2x1ZGVTY3JvbGwsIGJveHR5cGUpOworCQl2YXIgbWFyZ2luYm94ID0gZG9qby5odG1sLmdldE1hcmdpbkJveChub2RlKTsKKwkJdmFyIHJldCA9IHsKKwkJCWxlZnQ6IHBvcy5sZWZ0LAorCQkJdG9wOiBwb3MudG9wLAorCQkJd2lkdGg6IG1hcmdpbmJveC53aWR0aCwKKwkJCWhlaWdodDogbWFyZ2luYm94LmhlaWdodAorCQl9OworCX0KKwlyZXQueCA9IHJldC5sZWZ0OworCXJldC55ID0gcmV0LnRvcDsKKwlyZXR1cm4gcmV0OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLnNldE1hcmdpbkJveFdpZHRoID0gZG9qby5odG1sLnNldE91dGVyV2lkdGggPSBmdW5jdGlvbihub2RlLCB3aWR0aCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldE1hcmdpbkJveFdpZHRoIiwgInNldE1hcmdpbkJveCIsIGFyZ3VtZW50cywgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuc2V0TWFyZ2luQm94SGVpZ2h0ID0gZG9qby5odG1sLnNldE91dGVySGVpZ2h0ID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgic2V0TWFyZ2luQm94SGVpZ2h0IiwgInNldE1hcmdpbkJveCIsIGFyZ3VtZW50cywgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldE1hcmdpbkJveFdpZHRoID0gZG9qby5odG1sLmdldE91dGVyV2lkdGggPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRNYXJnaW5Cb3hXaWR0aCIsICJnZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldE1hcmdpbkJveEhlaWdodCA9IGRvam8uaHRtbC5nZXRPdXRlckhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldE1hcmdpbkJveEhlaWdodCIsICJnZXRNYXJnaW5Cb3giLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRUb3RhbE9mZnNldCA9IGZ1bmN0aW9uKG5vZGUsIHR5cGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRUb3RhbE9mZnNldCIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCB0eXBlKTsKK30KK2Rvam8uaHRtbC5nZXRBYnNvbHV0ZVggPSBmdW5jdGlvbihub2RlLCBpbmNsdWRlU2Nyb2xsKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0QWJzb2x1dGVYIiwgImdldEFic29sdXRlUG9zaXRpb24iLCBhcmd1bWVudHMsIG51bGwsICJ4Iik7Cit9Citkb2pvLmh0bWwuZ2V0QWJzb2x1dGVZID0gZnVuY3Rpb24obm9kZSwgaW5jbHVkZVNjcm9sbCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEFic29sdXRlWSIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCAieSIpOworfQorZG9qby5odG1sLnRvdGFsT2Zmc2V0TGVmdCA9IGZ1bmN0aW9uKG5vZGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJ0b3RhbE9mZnNldExlZnQiLCAiZ2V0QWJzb2x1dGVQb3NpdGlvbiIsIGFyZ3VtZW50cywgbnVsbCwgImxlZnQiKTsKK30KK2Rvam8uaHRtbC50b3RhbE9mZnNldFRvcCA9IGZ1bmN0aW9uKG5vZGUsIGluY2x1ZGVTY3JvbGwpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJ0b3RhbE9mZnNldFRvcCIsICJnZXRBYnNvbHV0ZVBvc2l0aW9uIiwgYXJndW1lbnRzLCBudWxsLCAidG9wIik7Cit9Citkb2pvLmh0bWwuZ2V0TWFyZ2luV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luV2lkdGgiLCAiZ2V0TWFyZ2luIiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5nZXRNYXJnaW5IZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0TWFyZ2luSGVpZ2h0IiwgImdldE1hcmdpbiIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldEJvcmRlcldpZHRoID0gZnVuY3Rpb24obm9kZSl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlcldpZHRoIiwgImdldEJvcmRlciIsIGFyZ3VtZW50cywgbnVsbCwgIndpZHRoIik7Cit9Citkb2pvLmh0bWwuZ2V0Qm9yZGVySGVpZ2h0ID0gZnVuY3Rpb24obm9kZSl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckhlaWdodCIsICJnZXRCb3JkZXIiLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRQYWRkaW5nV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkZGluZ1dpZHRoIiwgImdldFBhZGRpbmciLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldFBhZGRpbmdIZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkZGluZ0hlaWdodCIsICJnZXRQYWRkaW5nIiwgYXJndW1lbnRzLCBudWxsLCAiaGVpZ2h0Iik7Cit9Citkb2pvLmh0bWwuZ2V0UGFkQm9yZGVyV2lkdGggPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkQm9yZGVyV2lkdGgiLCAiZ2V0UGFkQm9yZGVyIiwgYXJndW1lbnRzLCBudWxsLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5nZXRQYWRCb3JkZXJIZWlnaHQgPSBmdW5jdGlvbihub2RlKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0UGFkQm9yZGVySGVpZ2h0IiwgImdldFBhZEJvcmRlciIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLmdldEJvcmRlckJveFdpZHRoID0gZG9qby5odG1sLmdldElubmVyV2lkdGggPSBmdW5jdGlvbigpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJnZXRCb3JkZXJCb3hXaWR0aCIsICJnZXRCb3JkZXJCb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldEJvcmRlckJveEhlaWdodCA9IGRvam8uaHRtbC5nZXRJbm5lckhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldEJvcmRlckJveEhlaWdodCIsICJnZXRCb3JkZXJCb3giLCBhcmd1bWVudHMsIG51bGwsICJoZWlnaHQiKTsKK30KK2Rvam8uaHRtbC5nZXRDb250ZW50Qm94V2lkdGggPSBkb2pvLmh0bWwuZ2V0Q29udGVudFdpZHRoID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gZG9qby5odG1sLl9jYWxsRGVwcmVjYXRlZCgiZ2V0Q29udGVudEJveFdpZHRoIiwgImdldENvbnRlbnRCb3giLCBhcmd1bWVudHMsIG51bGwsICJ3aWR0aCIpOworfQorZG9qby5odG1sLmdldENvbnRlbnRCb3hIZWlnaHQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEhlaWdodCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoImdldENvbnRlbnRCb3hIZWlnaHQiLCAiZ2V0Q29udGVudEJveCIsIGFyZ3VtZW50cywgbnVsbCwgImhlaWdodCIpOworfQorZG9qby5odG1sLnNldENvbnRlbnRCb3hXaWR0aCA9IGRvam8uaHRtbC5zZXRDb250ZW50V2lkdGggPSBmdW5jdGlvbihub2RlLCB3aWR0aCl7CisJcmV0dXJuIGRvam8uaHRtbC5fY2FsbERlcHJlY2F0ZWQoInNldENvbnRlbnRCb3hXaWR0aCIsICJzZXRDb250ZW50Qm94IiwgYXJndW1lbnRzLCAid2lkdGgiKTsKK30KK2Rvam8uaHRtbC5zZXRDb250ZW50Qm94SGVpZ2h0ID0gZG9qby5odG1sLnNldENvbnRlbnRIZWlnaHQgPSBmdW5jdGlvbihub2RlLCBoZWlnaHQpeworCXJldHVybiBkb2pvLmh0bWwuX2NhbGxEZXByZWNhdGVkKCJzZXRDb250ZW50Qm94SGVpZ2h0IiwgInNldENvbnRlbnRCb3giLCBhcmd1bWVudHMsICJoZWlnaHQiKTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLmxmeC5odG1sIik7CisKKworCisKKworCisKKworZG9qby5sZnguaHRtbC5fYnlJZCA9IGZ1bmN0aW9uKG5vZGVzKXsKKwlpZighbm9kZXMpeyByZXR1cm4gW107IH0KKwlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJaWYoIW5vZGVzLmFscmVhZHlDaGVja2VkKXsKKwkJCXZhciBuID0gW107CisJCQlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCQkJbi5wdXNoKGRvam8uYnlJZChub2RlKSk7CisJCQl9KTsKKwkJCW4uYWxyZWFkeUNoZWNrZWQgPSB0cnVlOworCQkJcmV0dXJuIG47CisJCX1lbHNleworCQkJcmV0dXJuIG5vZGVzOworCQl9CisJfWVsc2V7CisJCXZhciBuID0gW107CisJCW4ucHVzaChkb2pvLmJ5SWQobm9kZXMpKTsKKwkJbi5hbHJlYWR5Q2hlY2tlZCA9IHRydWU7CisJCXJldHVybiBuOworCX0KK30KKworZG9qby5sZnguaHRtbC5wcm9wZXJ0eUFuaW1hdGlvbiA9IGZ1bmN0aW9uKAkvKkRPTU5vZGVbXSovIG5vZGVzLCAKKwkJCQkJCQkJCQkJLypPYmplY3RbXSovIHByb3BlcnR5TWFwLCAKKwkJCQkJCQkJCQkJLyppbnQqLyBkdXJhdGlvbiwKKwkJCQkJCQkJCQkJLypmdW5jdGlvbiovIGVhc2luZywKKwkJCQkJCQkJCQkJLypPYmplY3QqLyBoYW5kbGVycyl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHRyYW5zaXRpb24gdGhlIHByb3BlcnRpZXMgb2YgIm5vZGVzIgorCS8vCQkJZGVwZW5kaW5nIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluICJwcm9wZXJ0eU1hcCIuCisJLy8gbm9kZXM6IEFuIGFycmF5IG9mIERPTU5vZGVzIG9yIG9uZSBET01Ob2RlLgorCS8vIHByb3BlcnR5TWFwOiB7IHByb3BlcnR5OiBTdHJpbmcsIHN0YXJ0OiBEZWNpbWFsPywgZW5kOiBEZWNpbWFsPywgdW5pdHM6IFN0cmluZz8gfQorCS8vCQkJCUFuIGFycmF5IG9mIG9iamVjdHMgZGVmaW5pbmcgcHJvcGVydGllcyB0byBjaGFuZ2UuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGhhbmRsZXJzOiB7IGhhbmRsZXI6IEZ1bmN0aW9uPywgb25zdGFydDogRnVuY3Rpb24/LCBvbnN0b3A6IEZ1bmN0aW9uPywgb25hbmltYXRlOiBGdW5jdGlvbj8gfQorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisKKwl2YXIgdGFyZ3MgPSB7CisJCSJwcm9wZXJ0eU1hcCI6IHByb3BlcnR5TWFwLAorCQkibm9kZXMiOiBub2RlcywKKwkJImR1cmF0aW9uIjogZHVyYXRpb24sCisJCSJlYXNpbmciOiBlYXNpbmd8fGRvam8ubGZ4LmVhc2VEZWZhdWx0CisJfTsKKwkKKwl2YXIgc2V0RW1VcCA9IGZ1bmN0aW9uKGFyZ3MpeworCQlpZihhcmdzLm5vZGVzLmxlbmd0aD09MSl7CisJCQkvLyBGSVhNRTogd2UncmUgb25seSBzdXBwb3J0aW5nIHN0YXJ0LXZhbHVlIGZpbGxpbmcgd2hlbiBvbmUgbm9kZSBpcworCQkJLy8gcGFzc2VkCisJCQkKKwkJCXZhciBwbSA9IGFyZ3MucHJvcGVydHlNYXA7CisJCQlpZighZG9qby5sYW5nLmlzQXJyYXkoYXJncy5wcm9wZXJ0eU1hcCkpeworCQkJCS8vIGl0J3Mgc3R1cGlkIHRvIGhhdmUgdG8gcGFjayBhbiBhcnJheSB3aXRoIGEgc2V0IG9mIG9iamVjdHMKKwkJCQkvLyB3aGVuIHlvdSBjYW4ganVzdCBwYXNzIGluIGFuIG9iamVjdCBsaXN0CisJCQkJdmFyIHBhcnIgPSBbXTsKKwkJCQlmb3IodmFyIHBuYW1lIGluIHBtKXsKKwkJCQkJcG1bcG5hbWVdLnByb3BlcnR5ID0gcG5hbWU7CisJCQkJCXBhcnIucHVzaChwbVtwbmFtZV0pOworCQkJCX0KKwkJCQlwbSA9IGFyZ3MucHJvcGVydHlNYXAgPSBwYXJyOworCQkJfQorCQkJZG9qby5sYW5nLmZvckVhY2gocG0sIGZ1bmN0aW9uKHByb3ApeworCQkJCWlmKGRqX3VuZGVmKCJzdGFydCIsIHByb3ApKXsKKwkJCQkJaWYocHJvcC5wcm9wZXJ0eSAhPSAib3BhY2l0eSIpeworCQkJCQkJcHJvcC5zdGFydCA9IHBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKGFyZ3Mubm9kZXNbMF0sIHByb3AucHJvcGVydHkpKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlwcm9wLnN0YXJ0ID0gZG9qby5odG1sLmdldE9wYWNpdHkoYXJncy5ub2Rlc1swXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXZhciBjb29yZHNBc0ludHMgPSBmdW5jdGlvbihjb29yZHMpeworCQl2YXIgY2ludHMgPSBbXTsKKwkJZG9qby5sYW5nLmZvckVhY2goY29vcmRzLCBmdW5jdGlvbihjKXsgCisJCQljaW50cy5wdXNoKE1hdGgucm91bmQoYykpOworCQl9KTsKKwkJcmV0dXJuIGNpbnRzOworCX0KKworCXZhciBzZXRTdHlsZSA9IGZ1bmN0aW9uKG4sIHN0eWxlKXsKKwkJbiA9IGRvam8uYnlJZChuKTsKKwkJaWYoIW4gfHwgIW4uc3R5bGUpeyByZXR1cm47IH0KKwkJZm9yKHZhciBzIGluIHN0eWxlKXsKKwkJCXRyeXsKKwkJCQlpZihzID09ICJvcGFjaXR5Iil7CisJCQkJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG4sIHN0eWxlW3NdKTsKKwkJCQl9ZWxzZXsKKwkJCQkJCW4uc3R5bGVbc10gPSBzdHlsZVtzXTsKKwkJCQl9CisJCQl9Y2F0Y2goZSl7IGRvam8uZGVidWcoZSk7IH0KKwkJfQorCX0KKworCXZhciBwcm9wTGluZSA9IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQl0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwkJdGhpcy5kaWZmcyA9IG5ldyBBcnJheShwcm9wZXJ0aWVzLmxlbmd0aCk7CisJCWRvam8ubGFuZy5mb3JFYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uKHByb3AsIGkpeworCQkJLy8gY2FsY3VsYXRlIHRoZSBlbmQgLSBzdGFydCB0byBvcHRpbWl6ZSBhIGJpdAorCQkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5zdGFydCkpeworCQkJCXByb3Auc3RhcnQgPSBwcm9wLnN0YXJ0KHByb3AsIGkpOworCQkJfQorCQkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24ocHJvcC5lbmQpKXsKKwkJCQlwcm9wLmVuZCA9IHByb3AuZW5kKHByb3AsIGkpOworCQkJfQorCQkJaWYoZG9qby5sYW5nLmlzQXJyYXkocHJvcC5zdGFydCkpeworCQkJCS8vIGRvbid0IGxvb3AgdGhyb3VnaCB0aGUgYXJyYXlzCisJCQkJdGhpcy5kaWZmc1tpXSA9IG51bGw7CisJCQl9ZWxzZSBpZihwcm9wLnN0YXJ0IGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpeworCQkJCS8vIHNhdmUgdGhlc2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRvUmdiKCkgZXZlcnkgZ2V0VmFsdWUoKSBjYWxsCisJCQkJcHJvcC5zdGFydFJnYiA9IHByb3Auc3RhcnQudG9SZ2IoKTsKKwkJCQlwcm9wLmVuZFJnYiA9IHByb3AuZW5kLnRvUmdiKCk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLmRpZmZzW2ldID0gcHJvcC5lbmQgLSBwcm9wLnN0YXJ0OworCQkJfQorCQl9LCB0aGlzKTsKKworCQl0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24obil7CisJCQl2YXIgcmV0ID0ge307CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLl9wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wLCBpKXsKKwkJCQl2YXIgdmFsdWUgPSBudWxsOworCQkJCWlmKGRvam8ubGFuZy5pc0FycmF5KHByb3Auc3RhcnQpKXsKKwkJCQkJLy8gRklYTUU6IHdoYXQgdG8gZG8gaGVyZT8KKwkJCQl9ZWxzZSBpZihwcm9wLnN0YXJ0IGluc3RhbmNlb2YgZG9qby5nZnguY29sb3IuQ29sb3IpeworCQkJCQl2YWx1ZSA9IChwcm9wLnVuaXRzfHwicmdiIikgKyAiKCI7CisJCQkJCWZvcih2YXIgaiA9IDAgOyBqIDwgcHJvcC5zdGFydFJnYi5sZW5ndGggOyBqKyspeworCQkJCQkJdmFsdWUgKz0gTWF0aC5yb3VuZCgoKHByb3AuZW5kUmdiW2pdIC0gcHJvcC5zdGFydFJnYltqXSkgKiBuKSArIHByb3Auc3RhcnRSZ2Jbal0pICsgKGogPCBwcm9wLnN0YXJ0UmdiLmxlbmd0aCAtIDEgPyAiLCIgOiAiIik7CisJCQkJCX0KKwkJCQkJdmFsdWUgKz0gIikiOworCQkJCX1lbHNleworCQkJCQl2YWx1ZSA9ICgodGhpcy5kaWZmc1tpXSkgKiBuKSArIHByb3Auc3RhcnQgKyAocHJvcC5wcm9wZXJ0eSAhPSAib3BhY2l0eSIgPyBwcm9wLnVuaXRzfHwicHgiIDogIiIpOworCQkJCX0KKwkJCQlyZXRbZG9qby5odG1sLnRvQ2FtZWxDYXNlKHByb3AucHJvcGVydHkpXSA9IHZhbHVlOworCQkJfSwgdGhpcyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCQorCXZhciBhbmltID0gbmV3IGRvam8ubGZ4LkFuaW1hdGlvbih7CisJCQliZWZvcmVCZWdpbjogZnVuY3Rpb24oKXsgCisJCQkJc2V0RW1VcCh0YXJncyk7IAorCQkJCWFuaW0uY3VydmUgPSBuZXcgcHJvcExpbmUodGFyZ3MucHJvcGVydHlNYXApOworCQkJfSwKKwkJCW9uQW5pbWF0ZTogZnVuY3Rpb24ocHJvcFZhbHVlcyl7CisJCQkJZG9qby5sYW5nLmZvckVhY2godGFyZ3Mubm9kZXMsIGZ1bmN0aW9uKG5vZGUpeworCQkJCQlzZXRTdHlsZShub2RlLCBwcm9wVmFsdWVzKTsKKwkJCQl9KTsKKwkJCX0KKwkJfSwKKwkJdGFyZ3MuZHVyYXRpb24sIAorCQludWxsLAorCQl0YXJncy5lYXNpbmcKKwkpOworCWlmKGhhbmRsZXJzKXsKKwkJZm9yKHZhciB4IGluIGhhbmRsZXJzKXsKKwkJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGhhbmRsZXJzW3hdKSl7CisJCQkJYW5pbS5jb25uZWN0KHgsIGFuaW0sIGhhbmRsZXJzW3hdKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuX21ha2VGYWRlYWJsZSA9IGZ1bmN0aW9uKG5vZGVzKXsKKwl2YXIgbWFrZUZhZGUgPSBmdW5jdGlvbihub2RlKXsKKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkvLyBvbmx5IHNldCB0aGUgem9vbSBpZiB0aGUgInRpY2tsZSIgdmFsdWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlCisJCQkvLyBkZWZhdWx0CisJCQlpZiggKG5vZGUuc3R5bGUuem9vbS5sZW5ndGggPT0gMCkgJiYKKwkJCQkoZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJ6b29tIikgPT0gIm5vcm1hbCIpICl7CisJCQkJLy8gbWFrZSBzdXJlIHRoZSBub2RlICJoYXNMYXlvdXQiCisJCQkJLy8gTk9URTogdGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBsYXJnZXIgYW5kIHNtYWxsZXIgdXNlci1zZXQgdGV4dAorCQkJCS8vIHNpemVzIGFuZCB3b3JrcyBmaW5lCisJCQkJbm9kZS5zdHlsZS56b29tID0gIjEiOworCQkJCS8vIG5vZGUuc3R5bGUuem9vbSA9ICJub3JtYWwiOworCQkJfQorCQkJLy8gZG9uJ3Qgc2V0IHRoZSB3aWR0aCB0byBhdXRvIGlmIGl0IGRpZG4ndCBhbHJlYWR5IGNhc2NhZGUgdGhhdCB3YXkuCisJCQkvLyBXZSBkb24ndCB3YW50IHRvIGYgYW55b25lcyBkZXNpZ25zCisJCQlpZigJKG5vZGUuc3R5bGUud2lkdGgubGVuZ3RoID09IDApICYmCisJCQkJKGRvam8uaHRtbC5nZXRTdHlsZShub2RlLCAid2lkdGgiKSA9PSAiYXV0byIpICl7CisJCQkJbm9kZS5zdHlsZS53aWR0aCA9ICJhdXRvIjsKKwkJCX0KKwkJfQorCX0KKwlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIG1ha2VGYWRlKTsKKwl9ZWxzZXsKKwkJbWFrZUZhZGUobm9kZXMpOworCX0KK30KKworZG9qby5sZnguaHRtbC5mYWRlID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkgIC8qT2JqZWN0Ki92YWx1ZXMsCisJCQkJCQkJICAvKmludD8qLyBkdXJhdGlvbiwKKwkJCQkJCQkgIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLAorCQkJCQkJCSAgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTpSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSB0aGUgIm5vZGVzIiBmcm9tIHRoZSBzdGFydCB0byBlbmQgdmFsdWVzIHBhc3NlZC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gdmFsdWVzOiB7IHN0YXJ0OiBEZWNpbWFsPywgZW5kOiBEZWNpbWFsPyB9CisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIHByb3BzID0geyBwcm9wZXJ0eTogIm9wYWNpdHkiIH07CisJaWYoIWRqX3VuZGVmKCJzdGFydCIsIHZhbHVlcykpeworCQlwcm9wcy5zdGFydCA9IHZhbHVlcy5zdGFydDsKKwl9ZWxzZXsKKwkJcHJvcHMuc3RhcnQgPSBmdW5jdGlvbigpeyByZXR1cm4gZG9qby5odG1sLmdldE9wYWNpdHkobm9kZXNbMF0pOyB9OworCX0KKworCWlmKCFkal91bmRlZigiZW5kIiwgdmFsdWVzKSl7CisJCXByb3BzLmVuZCA9IHZhbHVlcy5lbmQ7CisJfWVsc2V7CisJCWRvam8ucmFpc2UoImRvam8ubGZ4Lmh0bWwuZmFkZSBuZWVkcyBhbiBlbmQgdmFsdWUiKTsKKwl9CisKKwl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGVzLCBbIHByb3BzIF0sIGR1cmF0aW9uLCBlYXNpbmcpOworCWFuaW0uY29ubmVjdCgiYmVmb3JlQmVnaW4iLCBmdW5jdGlvbigpeworCQlkb2pvLmxmeC5odG1sLl9tYWtlRmFkZWFibGUobm9kZXMpOworCX0pOworCWlmKGNhbGxiYWNrKXsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKG5vZGVzLCBhbmltKTsgfSk7CisJfQorCisJcmV0dXJuIGFuaW07IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLmZhZGVJbiA9IGZ1bmN0aW9uKC8qRE9NTm9kZVtdKi8gbm9kZXMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIGZhZGUgIm5vZGVzIiBmcm9tIGl0cyBjdXJyZW50IG9wYWNpdHkgdG8gZnVsbHkgb3BhcXVlLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJcmV0dXJuIGRvam8ubGZ4Lmh0bWwuZmFkZShub2RlcywgeyBlbmQ6IDEgfSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spOyAvLyBkb2pvLmxmeC5BbmltYXRpb24KK30KKworZG9qby5sZnguaHRtbC5mYWRlT3V0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywgLyppbnQ/Ki8gZHVyYXRpb24sIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLCAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSAibm9kZXMiIGZyb20gaXRzIGN1cnJlbnQgb3BhY2l0eSB0byBmdWxseSB0cmFuc3BhcmVudC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgkKKwlyZXR1cm4gZG9qby5sZnguaHRtbC5mYWRlKG5vZGVzLCB7IGVuZDogMCB9LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayk7IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLmZhZGVTaG93ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywgLyppbnQ/Ki8gZHVyYXRpb24sIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLCAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgZmFkZSAibm9kZXMiIGZyb20gdHJhbnNwYXJlbnQgdG8gb3BhcXVlIGFuZCBzaG93cworCS8vCQkJIm5vZGVzIiBhdCB0aGUgZW5kIGlmIGl0IGlzIGhpZGRlbi4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgkKKwlub2Rlcz1kb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCWRvam8uaHRtbC5zZXRPcGFjaXR5KG5vZGUsIDAuMCk7CisJfSk7CisKKwl2YXIgYW5pbSA9IGRvam8ubGZ4Lmh0bWwuZmFkZUluKG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayk7CisJYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsIGZ1bmN0aW9uKCl7IAorCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBkb2pvLmh0bWwuc2hvdyk7CisJCX1lbHNleworCQkJZG9qby5odG1sLnNob3cobm9kZXMpOworCQl9CisJfSk7CisKKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuZmFkZUhpZGUgPSBmdW5jdGlvbigvKkRPTU5vZGVbXSovIG5vZGVzLCAvKmludD8qLyBkdXJhdGlvbiwgLypGdW5jdGlvbj8qLyBlYXNpbmcsIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCBmYWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBvcGFjaXR5IHRvIG9wYXF1ZSBhbmQgaGlkZXMKKwkvLwkJCSJub2RlcyIgYXQgdGhlIGVuZC4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCXZhciBhbmltID0gZG9qby5sZnguaHRtbC5mYWRlT3V0KG5vZGVzLCBkdXJhdGlvbiwgZWFzaW5nLCBmdW5jdGlvbigpeworCQlpZihkb2pvLmxhbmcuaXNBcnJheUxpa2Uobm9kZXMpKXsKKwkJCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBkb2pvLmh0bWwuaGlkZSk7CisJCX1lbHNleworCQkJZG9qby5odG1sLmhpZGUobm9kZXMpOworCQl9CisJCWlmKGNhbGxiYWNrKXsgY2FsbGJhY2sobm9kZXMsIGFuaW0pOyB9CisJfSk7CisJCisJcmV0dXJuIGFuaW07IC8vIGRvam8ubGZ4LkFuaW1hdGlvbgorfQorCitkb2pvLmxmeC5odG1sLndpcGVJbiA9IGZ1bmN0aW9uKC8qRE9NTm9kZVtdKi8gbm9kZXMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNob3cgYW5kIHdpcGUgaW4gIm5vZGVzIi4KKwkvLyBub2RlczogQW4gYXJyYXkgb2YgRE9NTm9kZXMgb3Igb25lIERPTU5vZGUuCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBvcHJvcCA9IHsgIH07CS8vIG9sZCBwcm9wZXJ0aWVzIG9mIG5vZGUgKGJlZm9yZSB3ZSBtdWNrZWQgdy90aGVtKQorCQkKKwkJLy8gZ2V0IG5vZGUgaGVpZ2h0LCBlaXRoZXIgaXQncyBuYXR1cmFsIGhlaWdodCBvciBpdCdzIGhlaWdodCBzcGVjaWZpZWQgdmlhIHN0eWxlIG9yIGNsYXNzIGF0dHJpYnV0ZXMKKwkJLy8gKGZvciBGRiwgdGhlIG5vZGUgaGFzIHRvIGJlICh0ZW1wb3JhcmlseSkgcmVuZGVyZWQgdG8gbWVhc3VyZSBoZWlnaHQpCisJCS8vIFRPRE86IHNob3VsZCB0aGlzIG9mZnNjcmVlbiBjb2RlIGJlIHBhcnQgb2YgZG9qby5odG1sLCBzbyB0aGF0IGdldEJvcmRlckJveCgpIHdvcmtzIG9uIGhpZGRlbiBub2Rlcz8KKwkJdmFyIG9yaWdUb3AsIG9yaWdMZWZ0LCBvcmlnUG9zaXRpb247CisJCXdpdGgobm9kZS5zdHlsZSl7CisJCQlvcmlnVG9wPXRvcDsgb3JpZ0xlZnQ9bGVmdDsgb3JpZ1Bvc2l0aW9uPXBvc2l0aW9uOworCQkJdG9wPSItOTk5OXB4IjsgbGVmdD0iLTk5OTlweCI7IHBvc2l0aW9uPSJhYnNvbHV0ZSI7CisJCQlkaXNwbGF5PSIiOworCQl9CisJCXZhciBub2RlSGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKS5oZWlnaHQ7CisJCXdpdGgobm9kZS5zdHlsZSl7CisJCQl0b3A9b3JpZ1RvcDsgbGVmdD1vcmlnTGVmdDsgcG9zaXRpb249b3JpZ1Bvc2l0aW9uOworCQkJZGlzcGxheT0ibm9uZSI7CisJCX0KKworCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJoZWlnaHQiOiB7CisJCQkJCXN0YXJ0OiAxLCAvLyAwIGNhdXNlcyBJRSB0byBkaXNwbGF5IHRoZSB3aG9sZSBwYW5lbAorCQkJCQllbmQ6IGZ1bmN0aW9uKCl7IHJldHVybiBub2RlSGVpZ2h0OyB9IAorCQkJCX0KKwkJCX0sIAorCQkJZHVyYXRpb24sIAorCQkJZWFzaW5nKTsKKwkKKwkJYW5pbS5jb25uZWN0KCJiZWZvcmVCZWdpbiIsIGZ1bmN0aW9uKCl7CisJCQlvcHJvcC5vdmVyZmxvdyA9IG5vZGUuc3R5bGUub3ZlcmZsb3c7CisJCQlvcHJvcC5oZWlnaHQgPSBub2RlLnN0eWxlLmhlaWdodDsKKwkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJb3ZlcmZsb3cgPSAiaGlkZGVuIjsKKwkJCQloZWlnaHQgPSAiMXB4IjsgLy8gMCBjYXVzZXMgSUUgdG8gZGlzcGxheSB0aGUgd2hvbGUgcGFuZWwKKwkJCX0KKwkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQl9KTsKKwkJCisJCWFuaW0uY29ubmVjdCgib25FbmQiLCBmdW5jdGlvbigpeyAKKwkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJb3ZlcmZsb3cgPSBvcHJvcC5vdmVyZmxvdzsKKwkJCQloZWlnaHQgPSBvcHJvcC5oZWlnaHQ7CisJCQl9CisJCQlpZihjYWxsYmFjayl7IGNhbGxiYWNrKG5vZGUsIGFuaW0pOyB9CisJCX0pOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCQorCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLndpcGVPdXQgPSBmdW5jdGlvbigvKkRPTU5vZGVbXSovIG5vZGVzLCAvKmludD8qLyBkdXJhdGlvbiwgLypGdW5jdGlvbj8qLyBlYXNpbmcsIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCB3aXBlIG91dCBhbmQgaGlkZSAibm9kZXMiLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKwkKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBvcHJvcCA9IHsgIH07CS8vIG9sZCBwcm9wZXJ0aWVzIG9mIG5vZGUgKGJlZm9yZSB3ZSBtdWNrZWQgdy90aGVtKQorCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJoZWlnaHQiOiB7CisJCQkJCXN0YXJ0OiBmdW5jdGlvbigpeyByZXR1cm4gZG9qby5odG1sLmdldENvbnRlbnRCb3gobm9kZSkuaGVpZ2h0OyB9LAorCQkJCQllbmQ6IDEgLy8gMCBjYXVzZXMgSUUgdG8gZGlzcGxheSB0aGUgd2hvbGUgcGFuZWwKKwkJCQl9IAorCQkJfSwKKwkJCWR1cmF0aW9uLAorCQkJZWFzaW5nLAorCQkJeworCQkJCSJiZWZvcmVCZWdpbiI6IGZ1bmN0aW9uKCl7CisJCQkJCW9wcm9wLm92ZXJmbG93ID0gbm9kZS5zdHlsZS5vdmVyZmxvdzsKKwkJCQkJb3Byb3AuaGVpZ2h0ID0gbm9kZS5zdHlsZS5oZWlnaHQ7CisJCQkJCXdpdGgobm9kZS5zdHlsZSl7CisJCQkJCQlvdmVyZmxvdyA9ICJoaWRkZW4iOworCQkJCQl9CisJCQkJCWRvam8uaHRtbC5zaG93KG5vZGUpOworCQkJCX0sCisJCQkJCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWRvam8uaHRtbC5oaWRlKG5vZGUpOworCQkJCQl3aXRoKG5vZGUuc3R5bGUpeworCQkJCQkJb3ZlcmZsb3cgPSBvcHJvcC5vdmVyZmxvdzsKKwkJCQkJCWhlaWdodCA9IG9wcm9wLmhlaWdodDsKKwkJCQkJfQorCQkJCQlpZihjYWxsYmFjayl7IGNhbGxiYWNrKG5vZGUsIGFuaW0pOyB9CisJCQkJfQorCQkJfQorCQkpOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCisJcmV0dXJuIGRvam8ubGZ4LmNvbWJpbmUoYW5pbXMpOyAvLyBkb2pvLmxmeC5Db21iaW5lCit9CisKK2Rvam8ubGZ4Lmh0bWwuc2xpZGVUbyA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovIG5vZGVzLAorCQkJCQkJCQkgLypPYmplY3QqLyBjb29yZHMsCisJCQkJCQkJCSAvKmludD8qLyBkdXJhdGlvbiwKKwkJCQkJCQkJIC8qRnVuY3Rpb24/Ki8gZWFzaW5nLAorCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNsaWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB0bworCS8vCQkJdGhlIHBvc2l0aW9uIGRlZmluZWQgaW4gImNvb3JkcyIuCisJLy8gbm9kZXM6IEFuIGFycmF5IG9mIERPTU5vZGVzIG9yIG9uZSBET01Ob2RlLgorCS8vIGNvb3JkczogeyB0b3A6IERlY2ltYWw/LCBsZWZ0OiBEZWNpbWFsPyB9CisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisJdmFyIGNvbXB1dGUgPSBkb2pvLmh0bWwuZ2V0Q29tcHV0ZWRTdHlsZTsKKwkKKwlpZihkb2pvLmxhbmcuaXNBcnJheShjb29yZHMpKXsKKwkJLyogY29vcmRzOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLmxmeC5odG1sLnNsaWRlVG8obm9kZSwgYXJyYXkpJywgJ3VzZSBkb2pvLmxmeC5odG1sLnNsaWRlVG8obm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7JywgJzAuNScpOworCQljb29yZHMgPSB7IHRvcDogY29vcmRzWzBdLCBsZWZ0OiBjb29yZHNbMV0gfTsKKwl9CisJZG9qby5sYW5nLmZvckVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpeworCQl2YXIgdG9wID0gbnVsbDsKKwkJdmFyIGxlZnQgPSBudWxsOworCQkKKwkJdmFyIGluaXQgPSAoZnVuY3Rpb24oKXsKKwkJCXZhciBpbm5lck5vZGUgPSBub2RlOworCQkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQkJdmFyIHBvcyA9IGNvbXB1dGUoaW5uZXJOb2RlLCAncG9zaXRpb24nKTsKKwkJCQl0b3AgPSAocG9zID09ICdhYnNvbHV0ZScgPyBub2RlLm9mZnNldFRvcCA6IHBhcnNlSW50KGNvbXB1dGUobm9kZSwgJ3RvcCcpKSB8fCAwKTsKKwkJCQlsZWZ0ID0gKHBvcyA9PSAnYWJzb2x1dGUnID8gbm9kZS5vZmZzZXRMZWZ0IDogcGFyc2VJbnQoY29tcHV0ZShub2RlLCAnbGVmdCcpKSB8fCAwKTsKKworCQkJCWlmICghZG9qby5sYW5nLmluQXJyYXkoWydhYnNvbHV0ZScsICdyZWxhdGl2ZSddLCBwb3MpKSB7CisJCQkJCXZhciByZXQgPSBkb2pvLmh0bWwuYWJzKGlubmVyTm9kZSwgdHJ1ZSk7CisJCQkJCWRvam8uaHRtbC5zZXRTdHlsZUF0dHJpYnV0ZXMoaW5uZXJOb2RlLCAicG9zaXRpb246YWJzb2x1dGU7dG9wOiIrcmV0LnkrInB4O2xlZnQ6IityZXQueCsicHg7Iik7CisJCQkJCXRvcCA9IHJldC55OworCQkJCQlsZWZ0ID0gcmV0Lng7CisJCQkJfQorCQkJfQorCQl9KSgpOworCQlpbml0KCk7CisJCQorCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnByb3BlcnR5QW5pbWF0aW9uKG5vZGUsCisJCQl7CSJ0b3AiOiB7IHN0YXJ0OiB0b3AsIGVuZDogKGNvb3Jkcy50b3B8fDApIH0sCisJCQkJImxlZnQiOiB7IHN0YXJ0OiBsZWZ0LCBlbmQ6IChjb29yZHMubGVmdHx8MCkgIH0KKwkJCX0sCisJCQlkdXJhdGlvbiwKKwkJCWVhc2luZywKKwkJCXsgImJlZm9yZUJlZ2luIjogaW5pdCB9CisJCSk7CisKKwkJaWYoY2FsbGJhY2speworCQkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKG5vZGVzLCBhbmltKTsgfSk7CisJCX0KKworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCQorCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLnNsaWRlQnkgPSBmdW5jdGlvbigvKkRPTU5vZGUqLyBub2RlcywgLypPYmplY3QqLyBjb29yZHMsIC8qaW50PyovIGR1cmF0aW9uLCAvKkZ1bmN0aW9uPyovIGVhc2luZywgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNsaWRlICJub2RlcyIgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbgorCS8vCQkJdG8gaXRzIGN1cnJlbnQgcG9zaXRpb24gcGx1cyB0aGUgbnVtYmVycyBkZWZpbmVkIGluICJjb29yZHMiLgorCS8vIG5vZGVzOiBBbiBhcnJheSBvZiBET01Ob2RlcyBvciBvbmUgRE9NTm9kZS4KKwkvLyBjb29yZHM6IHsgdG9wOiBEZWNpbWFsPywgbGVmdDogRGVjaW1hbD8gfQorCS8vIGR1cmF0aW9uOiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkvLyBlYXNpbmc6IEFuIGVhc2luZyBmdW5jdGlvbi4KKwkvLyBjYWxsYmFjazogRnVuY3Rpb24gdG8gcnVuIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KKwlub2RlcyA9IGRvam8ubGZ4Lmh0bWwuX2J5SWQobm9kZXMpOworCXZhciBhbmltcyA9IFtdOworCXZhciBjb21wdXRlID0gZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGU7CisKKwlpZihkb2pvLmxhbmcuaXNBcnJheShjb29yZHMpKXsKKwkJLyogY29vcmRzOiBBcnJheQorCQkgICBwSWQ6IGEgKi8KKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwgYXJyYXkpJywgJ3VzZSBkb2pvLmxmeC5odG1sLnNsaWRlQnkobm9kZSwge3RvcDogdmFsdWUsIGxlZnQ6IHZhbHVlfSk7JywgJzAuNScpOworCQljb29yZHMgPSB7IHRvcDogY29vcmRzWzBdLCBsZWZ0OiBjb29yZHNbMV0gfTsKKwl9CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciB0b3AgPSBudWxsOworCQl2YXIgbGVmdCA9IG51bGw7CisJCQorCQl2YXIgaW5pdCA9IChmdW5jdGlvbigpeworCQkJdmFyIGlubmVyTm9kZSA9IG5vZGU7CisJCQlyZXR1cm4gZnVuY3Rpb24oKXsKKwkJCQl2YXIgcG9zID0gY29tcHV0ZShpbm5lck5vZGUsICdwb3NpdGlvbicpOworCQkJCXRvcCA9IChwb3MgPT0gJ2Fic29sdXRlJyA/IG5vZGUub2Zmc2V0VG9wIDogcGFyc2VJbnQoY29tcHV0ZShub2RlLCAndG9wJykpIHx8IDApOworCQkJCWxlZnQgPSAocG9zID09ICdhYnNvbHV0ZScgPyBub2RlLm9mZnNldExlZnQgOiBwYXJzZUludChjb21wdXRlKG5vZGUsICdsZWZ0JykpIHx8IDApOworCisJCQkJaWYgKCFkb2pvLmxhbmcuaW5BcnJheShbJ2Fic29sdXRlJywgJ3JlbGF0aXZlJ10sIHBvcykpIHsKKwkJCQkJdmFyIHJldCA9IGRvam8uaHRtbC5hYnMoaW5uZXJOb2RlLCB0cnVlKTsKKwkJCQkJZG9qby5odG1sLnNldFN0eWxlQXR0cmlidXRlcyhpbm5lck5vZGUsICJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6IityZXQueSsicHg7bGVmdDoiK3JldC54KyJweDsiKTsKKwkJCQkJdG9wID0gcmV0Lnk7CisJCQkJCWxlZnQgPSByZXQueDsKKwkJCQl9CisJCQl9CisJCX0pKCk7CisJCWluaXQoKTsKKwkJCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwKKwkJCXsKKwkJCQkidG9wIjogeyBzdGFydDogdG9wLCBlbmQ6IHRvcCsoY29vcmRzLnRvcHx8MCkgfSwKKwkJCQkibGVmdCI6IHsgc3RhcnQ6IGxlZnQsIGVuZDogbGVmdCsoY29vcmRzLmxlZnR8fDApIH0KKwkJCX0sCisJCQlkdXJhdGlvbiwKKwkJCWVhc2luZykuY29ubmVjdCgiYmVmb3JlQmVnaW4iLCBpbml0KTsKKworCQlpZihjYWxsYmFjayl7CisJCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24oKXsgY2FsbGJhY2sobm9kZXMsIGFuaW0pOyB9KTsKKwkJfQorCisJCWFuaW1zLnB1c2goYW5pbSk7CisJfSk7CisKKwlyZXR1cm4gZG9qby5sZnguY29tYmluZShhbmltcyk7IC8vIGRvam8ubGZ4LkNvbWJpbmUKK30KKworZG9qby5sZnguaHRtbC5leHBsb2RlID0gZnVuY3Rpb24oLypET01Ob2RlKi8gc3RhcnQsCisJCQkJCQkJCSAvKkRPTU5vZGUqLyBlbmROb2RlLAorCQkJCQkJCQkgLyppbnQ/Ki8gZHVyYXRpb24sCisJCQkJCQkJCSAvKkZ1bmN0aW9uPyovIGVhc2luZywKKwkJCQkJCQkJIC8qRnVuY3Rpb24/Ki8gY2FsbGJhY2speworCS8vIHN1bW1hcnk6IFJldHVybnMgYW4gYW5pbWF0aW9uIHRoYXQgd2lsbCAKKwkvLyBzdGFydDoKKwkvLyBlbmROb2RlOgorCS8vIGR1cmF0aW9uOiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkvLyBlYXNpbmc6IEFuIGVhc2luZyBmdW5jdGlvbi4KKwkvLyBjYWxsYmFjazogRnVuY3Rpb24gdG8gcnVuIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KKwl2YXIgaCA9IGRvam8uaHRtbDsKKwlzdGFydCA9IGRvam8uYnlJZChzdGFydCk7CisJZW5kTm9kZSA9IGRvam8uYnlJZChlbmROb2RlKTsKKwl2YXIgc3RhcnRDb29yZHMgPSBoLnRvQ29vcmRpbmF0ZU9iamVjdChzdGFydCwgdHJ1ZSk7CisJdmFyIG91dGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwloLmNvcHlTdHlsZShvdXRsaW5lLCBlbmROb2RlKTsKKwlpZihlbmROb2RlLmV4cGxvZGVDbGFzc05hbWUpeyBvdXRsaW5lLmNsYXNzTmFtZSA9IGVuZE5vZGUuZXhwbG9kZUNsYXNzTmFtZTsgfQorCXdpdGgob3V0bGluZS5zdHlsZSl7CisJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJLy8gYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayI7CisJCXZhciBiYWNrZ3JvdW5kU3R5bGUgPSBoLmdldFN0eWxlKHN0YXJ0LCAiYmFja2dyb3VuZC1jb2xvciIpOworCQliYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kU3R5bGUgPyBiYWNrZ3JvdW5kU3R5bGUudG9Mb3dlckNhc2UoKSA6ICJ0cmFuc3BhcmVudCI7CisJCWJhY2tncm91bmRDb2xvciA9IChiYWNrZ3JvdW5kQ29sb3IgPT0gInRyYW5zcGFyZW50IikgPyAicmdiKDIyMSwgMjIxLCAyMjEpIiA6IGJhY2tncm91bmRDb2xvcjsKKwl9CisJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQob3V0bGluZSk7CisKKwl3aXRoKGVuZE5vZGUuc3R5bGUpeworCQl2aXNpYmlsaXR5ID0gImhpZGRlbiI7CisJCWRpc3BsYXkgPSAiYmxvY2siOworCX0KKwl2YXIgZW5kQ29vcmRzID0gaC50b0Nvb3JkaW5hdGVPYmplY3QoZW5kTm9kZSwgdHJ1ZSk7CisJd2l0aChlbmROb2RlLnN0eWxlKXsKKwkJZGlzcGxheSA9ICJub25lIjsKKwkJdmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKKwl9CisKKwl2YXIgcHJvcHMgPSB7IG9wYWNpdHk6IHsgc3RhcnQ6IDAuNSwgZW5kOiAxLjAgfSB9OworCWRvam8ubGFuZy5mb3JFYWNoKFsiaGVpZ2h0IiwgIndpZHRoIiwgInRvcCIsICJsZWZ0Il0sIGZ1bmN0aW9uKHR5cGUpeworCQlwcm9wc1t0eXBlXSA9IHsgc3RhcnQ6IHN0YXJ0Q29vcmRzW3R5cGVdLCBlbmQ6IGVuZENvb3Jkc1t0eXBlXSB9CisJfSk7CisJCisJdmFyIGFuaW0gPSBuZXcgZG9qby5sZngucHJvcGVydHlBbmltYXRpb24ob3V0bGluZSwgCisJCXByb3BzLAorCQlkdXJhdGlvbiwKKwkJZWFzaW5nLAorCQl7CisJCQkiYmVmb3JlQmVnaW4iOiBmdW5jdGlvbigpeworCQkJCWguc2V0RGlzcGxheShvdXRsaW5lLCAiYmxvY2siKTsKKwkJCX0sCisJCQkib25FbmQiOiBmdW5jdGlvbigpeworCQkJCWguc2V0RGlzcGxheShlbmROb2RlLCAiYmxvY2siKTsKKwkJCQlvdXRsaW5lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob3V0bGluZSk7CisJCQl9CisJCX0KKwkpOworCisJaWYoY2FsbGJhY2speworCQlhbmltLmNvbm5lY3QoIm9uRW5kIiwgZnVuY3Rpb24oKXsgY2FsbGJhY2soZW5kTm9kZSwgYW5pbSk7IH0pOworCX0KKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuaW1wbG9kZSA9IGZ1bmN0aW9uKC8qRE9NTm9kZSovIHN0YXJ0Tm9kZSwKKwkJCQkJCQkJIC8qRE9NTm9kZSovIGVuZCwKKwkJCQkJCQkJIC8qaW50PyovIGR1cmF0aW9uLAorCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBlYXNpbmcsCisJCQkJCQkJCSAvKkZ1bmN0aW9uPyovIGNhbGxiYWNrKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm5zIGFuIGFuaW1hdGlvbiB0aGF0IHdpbGwgCisJLy8gc3RhcnROb2RlOgorCS8vIGVuZDoKKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJdmFyIGggPSBkb2pvLmh0bWw7CisJc3RhcnROb2RlID0gZG9qby5ieUlkKHN0YXJ0Tm9kZSk7CisJZW5kID0gZG9qby5ieUlkKGVuZCk7CisJdmFyIHN0YXJ0Q29vcmRzID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdChzdGFydE5vZGUsIHRydWUpOworCXZhciBlbmRDb29yZHMgPSBkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0KGVuZCwgdHJ1ZSk7CisKKwl2YXIgb3V0bGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRvam8uaHRtbC5jb3B5U3R5bGUob3V0bGluZSwgc3RhcnROb2RlKTsKKwlpZiAoc3RhcnROb2RlLmV4cGxvZGVDbGFzc05hbWUpIHsgb3V0bGluZS5jbGFzc05hbWUgPSBzdGFydE5vZGUuZXhwbG9kZUNsYXNzTmFtZTsgfQorCWRvam8uaHRtbC5zZXRPcGFjaXR5KG91dGxpbmUsIDAuMyk7CisJd2l0aChvdXRsaW5lLnN0eWxlKXsKKwkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQlkaXNwbGF5ID0gIm5vbmUiOworCQliYWNrZ3JvdW5kQ29sb3IgPSBoLmdldFN0eWxlKHN0YXJ0Tm9kZSwgImJhY2tncm91bmQtY29sb3IiKS50b0xvd2VyQ2FzZSgpOworCX0KKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChvdXRsaW5lKTsKKworCXZhciBwcm9wcyA9IHsgb3BhY2l0eTogeyBzdGFydDogMS4wLCBlbmQ6IDAuNSB9IH07CisJZG9qby5sYW5nLmZvckVhY2goWyJoZWlnaHQiLCAid2lkdGgiLCAidG9wIiwgImxlZnQiXSwgZnVuY3Rpb24odHlwZSl7CisJCXByb3BzW3R5cGVdID0geyBzdGFydDogc3RhcnRDb29yZHNbdHlwZV0sIGVuZDogZW5kQ29vcmRzW3R5cGVdIH0KKwl9KTsKKwkKKwl2YXIgYW5pbSA9IG5ldyBkb2pvLmxmeC5wcm9wZXJ0eUFuaW1hdGlvbihvdXRsaW5lLAorCQlwcm9wcywKKwkJZHVyYXRpb24sCisJCWVhc2luZywKKwkJeworCQkJImJlZm9yZUJlZ2luIjogZnVuY3Rpb24oKXsKKwkJCQlkb2pvLmh0bWwuaGlkZShzdGFydE5vZGUpOworCQkJCWRvam8uaHRtbC5zaG93KG91dGxpbmUpOworCQkJfSwKKwkJCSJvbkVuZCI6IGZ1bmN0aW9uKCl7CisJCQkJb3V0bGluZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGxpbmUpOworCQkJfQorCQl9CisJKTsKKworCWlmKGNhbGxiYWNrKXsKKwkJYW5pbS5jb25uZWN0KCJvbkVuZCIsIGZ1bmN0aW9uKCl7IGNhbGxiYWNrKHN0YXJ0Tm9kZSwgYW5pbSk7IH0pOworCX0KKwlyZXR1cm4gYW5pbTsgLy8gZG9qby5sZnguQW5pbWF0aW9uCit9CisKK2Rvam8ubGZ4Lmh0bWwuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkJICAgLypkb2pvLmdmeC5jb2xvci5Db2xvciovIHN0YXJ0Q29sb3IsCisJCQkJCQkJCSAgIC8qaW50PyovIGR1cmF0aW9uLAorCQkJCQkJCQkgICAvKkZ1bmN0aW9uPyovIGVhc2luZywKKwkJCQkJCQkJICAgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvcgorCS8vCQkJb2YgIm5vZGVzIiB0byBzdGFydENvbG9yIGFuZCB0cmFuc2l0aW9uIGl0IHRvICJub2RlcyIKKwkvLwkJCW9yaWdpbmFsIGNvbG9yLgorCS8vIHN0YXJ0Q29sb3I6IENvbG9yIHRvIHRyYW5zaXRpb24gZnJvbS4KKwkvLyBkdXJhdGlvbjogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuCisJLy8gZWFzaW5nOiBBbiBlYXNpbmcgZnVuY3Rpb24uCisJLy8gY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uCisJbm9kZXMgPSBkb2pvLmxmeC5odG1sLl9ieUlkKG5vZGVzKTsKKwl2YXIgYW5pbXMgPSBbXTsKKworCWRvam8ubGFuZy5mb3JFYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKXsKKwkJdmFyIGNvbG9yID0gZG9qby5odG1sLmdldEJhY2tncm91bmRDb2xvcihub2RlKTsKKwkJdmFyIGJnID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJiYWNrZ3JvdW5kLWNvbG9yIikudG9Mb3dlckNhc2UoKTsKKwkJdmFyIGJnSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwkJdmFyIHdhc1RyYW5zcGFyZW50ID0gKGJnID09ICJ0cmFuc3BhcmVudCIgfHwgYmcgPT0gInJnYmEoMCwgMCwgMCwgMCkiKTsKKwkJd2hpbGUoY29sb3IubGVuZ3RoID4gMykgeyBjb2xvci5wb3AoKTsgfQorCisJCXZhciByZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3Ioc3RhcnRDb2xvcik7CisJCXZhciBlbmRSZ2IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoY29sb3IpOworCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgCisJCQl7ICJiYWNrZ3JvdW5kLWNvbG9yIjogeyBzdGFydDogcmdiLCBlbmQ6IGVuZFJnYiB9IH0sIAorCQkJZHVyYXRpb24sIAorCQkJZWFzaW5nLAorCQkJeworCQkJCSJiZWZvcmVCZWdpbiI6IGZ1bmN0aW9uKCl7IAorCQkJCQlpZihiZ0ltYWdlKXsKKwkJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gIm5vbmUiOworCQkJCQl9CisJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInJnYigiICsgcmdiLnRvUmdiKCkuam9pbigiLCIpICsgIikiOworCQkJCX0sCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWlmKGJnSW1hZ2UpeworCQkJCQkJbm9kZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBiZ0ltYWdlOworCQkJCQl9CisJCQkJCWlmKHdhc1RyYW5zcGFyZW50KXsKKwkJCQkJCW5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gInRyYW5zcGFyZW50IjsKKwkJCQkJfQorCQkJCQlpZihjYWxsYmFjayl7CisJCQkJCQljYWxsYmFjayhub2RlLCBhbmltKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJKTsKKworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxmeC5odG1sLnVuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oLypET01Ob2RlW10qLyBub2RlcywKKwkJCQkJCQkJCSAvKmRvam8uZ2Z4LmNvbG9yLkNvbG9yKi8gZW5kQ29sb3IsCisJCQkJCQkJCQkgLyppbnQ/Ki8gZHVyYXRpb24sCisJCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBlYXNpbmcsCisJCQkJCQkJCQkgLypGdW5jdGlvbj8qLyBjYWxsYmFjayl7CisJLy8gc3VtbWFyeTogUmV0dXJucyBhbiBhbmltYXRpb24gdGhhdCB3aWxsIHRyYW5zaXRpb24gIm5vZGVzIiBiYWNrZ3JvdW5kIGNvbG9yCisJLy8JCQlmcm9tIGl0cyBjdXJyZW50IGNvbG9yIHRvICJlbmRDb2xvciIuCisJLy8gZW5kQ29sb3I6IENvbG9yIHRvIHRyYW5zaXRpb24gdG8uCisJLy8gZHVyYXRpb246IER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorCS8vIGVhc2luZzogQW4gZWFzaW5nIGZ1bmN0aW9uLgorCS8vIGNhbGxiYWNrOiBGdW5jdGlvbiB0byBydW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorCW5vZGVzID0gZG9qby5sZnguaHRtbC5fYnlJZChub2Rlcyk7CisJdmFyIGFuaW1zID0gW107CisKKwlkb2pvLmxhbmcuZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSl7CisJCXZhciBjb2xvciA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihkb2pvLmh0bWwuZ2V0QmFja2dyb3VuZENvbG9yKG5vZGUpKTsKKwkJdmFyIHJnYiA9IG5ldyBkb2pvLmdmeC5jb2xvci5Db2xvcihlbmRDb2xvcik7CisKKwkJdmFyIGJnSW1hZ2UgPSBkb2pvLmh0bWwuZ2V0U3R5bGUobm9kZSwgImJhY2tncm91bmQtaW1hZ2UiKTsKKwkJCisJCXZhciBhbmltID0gZG9qby5sZngucHJvcGVydHlBbmltYXRpb24obm9kZSwgCisJCQl7ICJiYWNrZ3JvdW5kLWNvbG9yIjogeyBzdGFydDogY29sb3IsIGVuZDogcmdiIH0gfSwKKwkJCWR1cmF0aW9uLCAKKwkJCWVhc2luZywKKwkJCXsKKwkJCQkiYmVmb3JlQmVnaW4iOiBmdW5jdGlvbigpeyAKKwkJCQkJaWYoYmdJbWFnZSl7CisJCQkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJub25lIjsKKwkJCQkJfQorCQkJCQlub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2IoIiArIGNvbG9yLnRvUmdiKCkuam9pbigiLCIpICsgIikiOworCQkJCX0sCisJCQkJIm9uRW5kIjogZnVuY3Rpb24oKXsgCisJCQkJCWlmKGNhbGxiYWNrKXsKKwkJCQkJCWNhbGxiYWNrKG5vZGUsIGFuaW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkpOworCQlhbmltcy5wdXNoKGFuaW0pOworCX0pOworCXJldHVybiBkb2pvLmxmeC5jb21iaW5lKGFuaW1zKTsgLy8gZG9qby5sZnguQ29tYmluZQorfQorCitkb2pvLmxhbmcubWl4aW4oZG9qby5sZngsIGRvam8ubGZ4Lmh0bWwpOworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwlicm93c2VyOiBbImRvam8ubGZ4Lmh0bWwiXSwKKwlkYXNoYm9hcmQ6IFsiZG9qby5sZnguaHRtbCJdCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sZnguKiIpOworCitpZighdGhpc1siZG9qbyJdKXsKKwlhbGVydCgiXCJkb2pvL19fcGFja2FnZV9fLmpzXCIgaXMgbm93IGxvY2F0ZWQgYXQgXCJkb2pvL2Rvam8uanNcIi4gUGxlYXNlIHVwZGF0ZSB5b3VyIGluY2x1ZGVzIGFjY29yZGluZ2x5Iik7Cit9CisKK2Rvam8ucHJvdmlkZSgiZG9qby54bWwuUGFyc2UiKTsKKworCisvL1RPRE86IGRldGVybWluZSBkZXBlbmRlbmNpZXMKKy8vIGN1cnJlbnRseSBoYXMgZGVwZW5kZW5jeSBvbiBkb2pvLnhtbC5Eb21VdGlsIG5vZGVUeXBlcyBjb25zdGFudHMuLi4KKworLy8gdXNpbmcgZG9jdW1lbnRGcmFnbWVudCBub21lbmNsYXR1cmUgdG8gZ2VuZXJhbGl6ZSBpbiBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSBwYXNzaW5nIGEgY29sbGVjdGlvbiBvZiBub2RlcyB3aXRoIGEgc2luZ2xlIHBhcmVudAorCitkb2pvLnhtbC5QYXJzZSA9IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwkJZ2VuZXJpYyBjbGFzcyBmb3IgdGFraW5nIGEgRE9NIG5vZGUgYW5kIHBhcnNpbmcgaXQgaW50byBhbiBvYmplY3QKKwkvLwkJYmFzZWQgb24gdGhlICJkb2pvIHRhZyBuYW1lIiBvZiB0aGF0IG5vZGUuCisJLy8gCisJLy8JCXN1cHBvcnRlZCBkb2pvVGFnTmFtZSdzOgorCS8vCQkJPHByZWZpeDp0YWc+ID0+IHByZWZpeDp0YWcKKwkvLwkJCTxkb2pvOnRhZz4gPT4gZG9qbzp0YWcKKwkvLwkJCTxkb2pvVGFnPiA9PiBkb2pvOnRhZworCS8vCQkJPHRhZyBkb2pvVHlwZT0idHlwZSI+ID0+IGRvam86dHlwZQorCS8vCQkJPHRhZyBkb2pvVHlwZT0icHJlZml4OnR5cGUiPiA9PiBwcmVmaXg6dHlwZQorCS8vCQkJPHRhZyBkb2pvOnR5cGU9InR5cGUiPiA9PiBkb2pvOnR5cGUKKwkvLwkJCTx0YWcgY2xhc3M9ImNsYXNzYSBkb2pvLXR5cGUgY2xhc3NiIj4gPT4gZG9qbzp0eXBlCQorCisJdmFyIGlzSUUgPSAoKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSkmJihkb2pvLnJlbmRlci5odG1sLmllKSk7CisKKwkvLyBnZXQgbm9ybWFsaXplZCAobG93ZXJjYXNlKSB0YWdOYW1lCisJLy8gc29tZSBicm93c2VycyByZXBvcnQgdGFnTmFtZXMgaW4gbG93ZXJjYXNlIG5vIG1hdHRlciB3aGF0CisJZnVuY3Rpb24gZ2V0VGFnTmFtZShub2RlKXsKKwkJLyoKKwkJcmV0dXJuICgobm9kZSkmJihub2RlWyJ0YWdOYW1lIl0pID8gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnJyk7CisJCSovCisJCXRyeXsKKwkJCXJldHVybiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKwkJfWNhdGNoKGUpeworCQkJcmV0dXJuICIiOworCQl9CisJfQorCisJLy8gbG9jYXRlIGRvam8gcXVhbGlmaWVkIHRhZyBuYW1lCisJZnVuY3Rpb24gZ2V0RG9qb1RhZ05hbWUobm9kZSl7CisJCXZhciB0YWdOYW1lID0gZ2V0VGFnTmFtZShub2RlKTsKKwkJaWYgKCF0YWdOYW1lKXsKKwkJCQlyZXR1cm4gJyc7CisJCX0KKwkJLy8gYW55IHJlZ2lzdGVyZWQgdGFnCisJCWlmKChkb2pvLndpZGdldCkmJihkb2pvLndpZGdldC50YWdzW3RhZ05hbWVdKSl7CisJCQlyZXR1cm4gdGFnTmFtZTsKKwkJfQorCQkvLyA8cHJlZml4OnRhZz4gPT4gcHJlZml4OnRhZworCQl2YXIgcCA9IHRhZ05hbWUuaW5kZXhPZigiOiIpOworCQlpZihwPj0wKXsKKwkJCXJldHVybiB0YWdOYW1lOworCQl9CisJCS8vIDxkb2pvOnRhZz4gPT4gZG9qbzp0YWcKKwkJaWYodGFnTmFtZS5zdWJzdHIoMCw1KSA9PSAiZG9qbzoiKXsKKwkJCXJldHVybiB0YWdOYW1lOworCQl9CisJCWlmKGRvam8ucmVuZGVyLmh0bWwuY2FwYWJsZSAmJiBkb2pvLnJlbmRlci5odG1sLmllICYmIG5vZGUuc2NvcGVOYW1lICE9ICdIVE1MJyl7CisJCQlyZXR1cm4gbm9kZS5zY29wZU5hbWUudG9Mb3dlckNhc2UoKSArICc6JyArIHRhZ05hbWU7CisJCX0KKwkJLy8gPGRvam9UYWc+ID0+IGRvam86dGFnCisJCWlmKHRhZ05hbWUuc3Vic3RyKDAsNCkgPT0gImRvam8iKXsKKwkJCS8vIEZJWE1FOiB0aGlzIGFzc3VtZXMgdGFnIG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZQorCQkJcmV0dXJuICJkb2pvOiIgKyB0YWdOYW1lLnN1YnN0cmluZyg0KTsKKwkJfQorCQkvLyA8dGFnIGRvam9UeXBlPSJwcmVmaXg6dHlwZSI+ID0+IHByZWZpeDp0eXBlCisJCS8vIDx0YWcgZG9qb1R5cGU9InR5cGUiPiA9PiBkb2pvOnR5cGUKKwkJdmFyIGRqdCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvVHlwZSIpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCJkb2pvdHlwZSIpOworCQlpZihkanQpeworCQkJaWYgKGRqdC5pbmRleE9mKCI6Iik8MCl7CisJCQkJZGp0ID0gImRvam86IitkanQ7CisJCQl9CisJCQlyZXR1cm4gZGp0LnRvTG93ZXJDYXNlKCk7CisJCX0KKwkJLy8gPHRhZyBkb2pvOnR5cGU9InR5cGUiPiA9PiBkb2pvOnR5cGUKKwkJZGp0ID0gbm9kZS5nZXRBdHRyaWJ1dGVOUyAmJiBub2RlLmdldEF0dHJpYnV0ZU5TKGRvam8uZG9tLmRvam9tbCwidHlwZSIpOworCQlpZihkanQpeworCQkJcmV0dXJuICJkb2pvOiIgKyBkanQudG9Mb3dlckNhc2UoKTsKKwkJfQorCQkvLyA8dGFnIGRvam86dHlwZT0idHlwZSI+ID0+IGRvam86dHlwZQorCQl0cnl7CisJCQkvLyBGSVhNRTogSUUgcmVhbGx5IHJlYWxseSBkb2Vzbid0IGxpa2UgdGhpcywgc28gd2Ugc3F1ZWxjaCBlcnJvcnMgZm9yIGl0CisJCQlkanQgPSBub2RlLmdldEF0dHJpYnV0ZSgiZG9qbzp0eXBlIik7CisJCX1jYXRjaChlKXsgCisJCQkvLyBGSVhNRTogbG9nPyAgCisJCX0KKwkJaWYoZGp0KXsgcmV0dXJuICJkb2pvOiIrZGp0LnRvTG93ZXJDYXNlKCk7IH0KKwkJLy8gPHRhZyBjbGFzcz0iY2xhc3NhIGRvam8tdHlwZSBjbGFzc2IiPiA9PiBkb2pvOnR5cGUJCisJCWlmKChkal9nbG9iYWxbImRqQ29uZmlnIl0pJiYoIWRqQ29uZmlnWyJpZ25vcmVDbGFzc05hbWVzIl0pKXsgCisJCQkvLyBGSVhNRTogc2hvdWxkIHdlIG1ha2UgdGhpcyBvcHRpb25hbGx5IGVuYWJsZWQgdmlhIGRqQ29uZmlnPworCQkJdmFyIGNsYXNzZXMgPSBub2RlLmNsYXNzTmFtZXx8bm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CisJCQkvLyBGSVhNRTogZm9sbG93aW5nIGxpbmUsIHdpdGhvdXQgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBjbGFzc2VzLmluZGV4T2YKKwkJCS8vIGJyZWFrcyBmaXJlZm94IDEuNSdzIHN2ZyB3aWRnZXRzCisJCQlpZigoY2xhc3NlcyApJiYoY2xhc3Nlcy5pbmRleE9mKSYmKGNsYXNzZXMuaW5kZXhPZigiZG9qby0iKSE9LTEpKXsKKwkJCQl2YXIgYWNsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCIgIik7CisJCQkJZm9yKHZhciB4PTAsIGM9YWNsYXNzZXMubGVuZ3RoOyB4PGM7IHgrKyl7CisJCQkJCWlmKGFjbGFzc2VzW3hdLnNsaWNlKDAsIDUpID09ICJkb2pvLSIpeworCQkJCQkJcmV0dXJuICJkb2pvOiIrYWNsYXNzZXNbeF0uc3Vic3RyKDUpLnRvTG93ZXJDYXNlKCk7IAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIG5vIGRvam8tcXVhbGlmaWVkIG5hbWUKKwkJcmV0dXJuICcnOworCX0KKworCisJdGhpcy5wYXJzZUVsZW1lbnQgPSBmdW5jdGlvbigJLypEb21Ob2RlKi9ub2RlLAorCQkJCQkJCQkJLypCb29sZWFuKi9oYXNQYXJlbnROb2RlU2V0LCAKKwkJCQkJCQkJCS8qQm9vbGVhbiovb3B0aW1pemVGb3JEb2pvTUwsIAorCQkJCQkJCQkJLypJbnRlZ2VyKi90aGlzSWR4CSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZWN1cnNpdmVseSBwYXJzZSB0aGUgcGFzc2VkIG5vZGUsIHJldHVybmluZyBhIG5vcm1hbGl6ZWQgZGF0YQorCQkvLwkJc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGUgImF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QiIG9mIHNhaWQKKwkJLy8JCWVsZW1lbnRzLiBJZiBvcHRpbWl6ZUZvckRvam9NTCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgY29udGFpbgorCQkvLwkJYSAiZG9qbyB0YWcgbmFtZSIgd2lsbCBiZSBpbnNwZWN0ZWQgZm9yIGF0dHJpYnV0ZXMuCisJCS8vIG5vZGU6IHRoZSBEb21Ob2RlIHRvIGJlIHRyZWF0ZWQgYXMgdGhlIHJvb3Qgb2YgaW5zcGVjdGlvbgorCQkvLyBoYXNQYXJlbnROb2RlU2V0OiBuby1vcCwgcGxlYXNlIHBhc3MgIm51bGwiCisJCS8vIG9wdGltaXplRm9yRG9qb01MOiBzaG91bGQgd2UgaWdub3JlIG5vbi1Eb2pvIG5vZGVzPyBEZWZhdWx0cyB0byBmYWxzZS4KKwkJLy8gdGhpc0lkeDoKKwkJLy8JCWEgd2F5IHRvIHNwZWNpZnkgYSBzeW50aGV0aWMgImluZGV4IiBwcm9wZXJ0eSBpbiB0aGUgcmVzdWx0aW5nCisJCS8vCQlkYXRhIHN0cnVjdHVyZS4gT3RoZXJ3aXNlIHRoZSBpbmRleCBwcm9wZXJ0eSBvZiB0aGUgdG9wLWxldmVsCisJCS8vCQlyZXR1cm4gZWxlbWVudCBpcyBhbHdheXMgIjAiLgorCisJCS8vIFRPRE9DOiBkb2N1bWVudCByZXR1cm4gc3RydWN0dXJlIG9mIGEgbm9uLXRyaXZpYWwgZWxlbWVudCBzZXQKKworCQkvLyBydW4gc2hvcnRjdXRzIHRvIGJhaWwgb3V0IG9mIHByb2Nlc3NpbmcgdXAgZnJvbnQgdG8gc2F2ZSB0aW1lIGFuZAorCQkvLyBvYmplY3QgYWxsb2MgaWYgcG9zc2libGUuCisJCXZhciB0YWdOYW1lID0gZ2V0VGFnTmFtZShub2RlKTsKKwkJLy9UaGVyZSdzIGEgd2VpcmQgYnVnIGluIElFIHdoZXJlIGl0IGNvdW50cyBlbmQgdGFncywgZS5nLiA8L2Rvam86YnV0dG9uPiBhcyBub2RlcyB0aGF0IHNob3VsZCBiZSBwYXJzZWQuICBJZ25vcmUgdGhlc2UKKwkJaWYoaXNJRSAmJiB0YWdOYW1lLmluZGV4T2YoIi8iKT09MCl7IHJldHVybiBudWxsOyB9CisKKwkJdHJ5eworCQkJdmFyIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZSgicGFyc2VXaWRnZXRzIik7CisJCQlpZihhdHRyICYmIGF0dHIudG9Mb3dlckNhc2UoKSA9PSAiZmFsc2UiKXsKKwkJCQlyZXR1cm4ge307CisJCQl9CisJCX1jYXRjaChlKXsvKmNvbnRpbnVlKi99CisKKwkJCisJCS8vIGxvb2sgZm9yIGEgZG9qb21sIHF1YWxpZmllZCBuYW1lCisJCS8vIHByb2Nlc3MgZG9qb21sIG9ubHkgd2hlbiBvcHRpbWl6ZUZvckRvam9NTCBpcyB0cnVlCisJCXZhciBwcm9jZXNzID0gdHJ1ZTsKKwkJaWYob3B0aW1pemVGb3JEb2pvTUwpeworCQkJdmFyIGRvam9UYWdOYW1lID0gZ2V0RG9qb1RhZ05hbWUobm9kZSk7CisJCQl0YWdOYW1lID0gZG9qb1RhZ05hbWUgfHwgdGFnTmFtZTsKKwkJCXByb2Nlc3MgPSBCb29sZWFuKGRvam9UYWdOYW1lKTsKKwkJfQorCisJCXZhciBwYXJzZWROb2RlU2V0ID0ge307CisJCXBhcnNlZE5vZGVTZXRbdGFnTmFtZV0gPSBbXTsKKwkJdmFyIHBvcyA9IHRhZ05hbWUuaW5kZXhPZigiOiIpOworCQlpZihwb3M+MCl7CisJCQl2YXIgbnMgPSB0YWdOYW1lLnN1YnN0cmluZygwLHBvcyk7CisJCQlwYXJzZWROb2RlU2V0WyJucyJdID0gbnM7CisJCQkvLyBob25vciB1c2VyIG5hbWVzcGFjZSBmaWx0ZXJzCisJCQlpZigoZG9qby5ucykmJighZG9qby5ucy5hbGxvdyhucykpKXtwcm9jZXNzPWZhbHNlO30KKwkJfQorCisJCWlmKHByb2Nlc3MpeworCQkJdmFyIGF0dHJpYnV0ZVNldCA9IHRoaXMucGFyc2VBdHRyaWJ1dGVzKG5vZGUpOworCQkJZm9yKHZhciBhdHRyIGluIGF0dHJpYnV0ZVNldCl7CisJCQkJaWYoKCFwYXJzZWROb2RlU2V0W3RhZ05hbWVdW2F0dHJdKXx8KHR5cGVvZiBwYXJzZWROb2RlU2V0W3RhZ05hbWVdW2F0dHJdICE9ICJhcnJheSIpKXsKKwkJCQkJcGFyc2VkTm9kZVNldFt0YWdOYW1lXVthdHRyXSA9IFtdOworCQkJCX0KKwkJCQlwYXJzZWROb2RlU2V0W3RhZ05hbWVdW2F0dHJdLnB1c2goYXR0cmlidXRlU2V0W2F0dHJdKTsKKwkJCX0JCisJCQkvLyBGSVhNRTogd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgb3B0aW9uYWwgb3IgcHJvdmlkZSBjbG9uaW5nIGluc3RlYWQgb2YKKwkJCS8vIHJlZmVyZW5jaW5nLCBidXQgZm9yIG5vdywgd2UgaW5jbHVkZSBhIG5vZGUgcmVmZXJlbmNlIHRvIGFsbG93CisJCQkvLyBpbnN0YW50aWF0ZWQgY29tcG9uZW50cyB0byBmaWd1cmUgb3V0IHRoZWlyICJyb290cyIKKwkJCXBhcnNlZE5vZGVTZXRbdGFnTmFtZV0ubm9kZVJlZiA9IG5vZGU7CisJCQlwYXJzZWROb2RlU2V0LnRhZ05hbWUgPSB0YWdOYW1lOworCQkJcGFyc2VkTm9kZVNldC5pbmRleCA9IHRoaXNJZHh8fDA7CisJCX0KKworCQl2YXIgY291bnQgPSAwOworCQlmb3IodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKXsKKwkJCXZhciB0Y24gPSBub2RlLmNoaWxkTm9kZXMuaXRlbShpKTsKKwkJCXN3aXRjaCh0Y24ubm9kZVR5cGUpeworCQkJCWNhc2UgIGRvam8uZG9tLkVMRU1FTlRfTk9ERTogLy8gZWxlbWVudCBub2RlcywgY2FsbCB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5CisJCQkJCXZhciBjdG4gPSBnZXREb2pvVGFnTmFtZSh0Y24pIHx8IGdldFRhZ05hbWUodGNuKTsKKwkJCQkJaWYoIXBhcnNlZE5vZGVTZXRbY3RuXSl7CisJCQkJCQlwYXJzZWROb2RlU2V0W2N0bl0gPSBbXTsKKwkJCQkJfQorCQkJCQlwYXJzZWROb2RlU2V0W2N0bl0ucHVzaCh0aGlzLnBhcnNlRWxlbWVudCh0Y24sIHRydWUsIG9wdGltaXplRm9yRG9qb01MLCBjb3VudCkpOworCQkJCQlpZigJKHRjbi5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKSYmCisJCQkJCQkodGNuLmNoaWxkTm9kZXMuaXRlbSgwKS5ub2RlVHlwZSA9PSBkb2pvLmRvbS5URVhUX05PREUpKXsKKwkJCQkJCXBhcnNlZE5vZGVTZXRbY3RuXVtwYXJzZWROb2RlU2V0W2N0bl0ubGVuZ3RoLTFdLnZhbHVlID0gdGNuLmNoaWxkTm9kZXMuaXRlbSgwKS5ub2RlVmFsdWU7CisJCQkJCX0KKwkJCQkJY291bnQrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAgZG9qby5kb20uVEVYVF9OT0RFOiAvLyBpZiBhIHNpbmdsZSB0ZXh0IG5vZGUgaXMgdGhlIGNoaWxkLCB0cmVhdCBpdCBhcyBhbiBhdHRyaWJ1dGUKKwkJCQkJaWYobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKXsKKwkJCQkJCXBhcnNlZE5vZGVTZXRbdGFnTmFtZV0ucHVzaCh7IHZhbHVlOiBub2RlLmNoaWxkTm9kZXMuaXRlbSgwKS5ub2RlVmFsdWUgfSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDogYnJlYWs7CisJCQkJLyoKKwkJCQljYXNlICBkb2pvLmRvbS5BVFRSSUJVVEVfTk9ERTogLy8gYXR0cmlidXRlIG5vZGUuLi4gbm90IG1lYW5pbmdmdWwgaGVyZQorCQkJCQlicmVhazsKKwkJCQljYXNlICBkb2pvLmRvbS5DREFUQV9TRUNUSU9OX05PREU6IC8vIGNkYXRhIHNlY3Rpb24uLi4gbm90IHN1cmUgaWYgdGhpcyB3b3VsZCBldmVyIGJlIG1lYW5pbmdmdWwuLi4gbWlnaHQgYmUuLi4KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAgZG9qby5kb20uRU5USVRZX1JFRkVSRU5DRV9OT0RFOiAvLyBlbnRpdHkgcmVmZXJlbmNlIG5vZGUuLi4gbm90IG1lYW5pbmdmdWwgaGVyZQorCQkJCQlicmVhazsKKwkJCQljYXNlICBkb2pvLmRvbS5FTlRJVFlfTk9ERTogLy8gZW50aXR5IG5vZGUuLi4gbm90IHN1cmUgaWYgdGhpcyB3b3VsZCBldmVyIGJlIG1lYW5pbmdmdWwKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAgZG9qby5kb20uUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiAvLyBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGUuLi4gbm90IG1lYW5pbmdmdWwgaGVyZQorCQkJCQlicmVhazsKKwkJCQljYXNlICBkb2pvLmRvbS5DT01NRU5UX05PREU6IC8vIGNvbW1lbnQgbm9kZS4uLiBub3Qgbm90IHN1cmUgaWYgdGhpcyB3b3VsZCBldmVyIGJlIG1lYW5pbmdmdWwgCisJCQkJCWJyZWFrOworCQkJCWNhc2UgIGRvam8uZG9tLkRPQ1VNRU5UX05PREU6IC8vIGRvY3VtZW50IG5vZGUuLi4gbm90IHN1cmUgaWYgdGhpcyB3b3VsZCBldmVyIGJlIG1lYW5pbmdmdWwKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAgZG9qby5kb20uRE9DVU1FTlRfVFlQRV9OT0RFOiAvLyBkb2N1bWVudCB0eXBlIG5vZGUuLi4gbm90IG1lYW5pbmdmdWwgaGVyZQorCQkJCQlicmVhazsKKwkJCQljYXNlICBkb2pvLmRvbS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAvLyBkb2N1bWVudCBmcmFnbWVudCBub2RlLi4uIG5vdCBtZWFuaW5nZnVsIGhlcmUKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAgZG9qby5kb20uTk9UQVRJT05fTk9ERTovLyBub3RhdGlvbiBub2RlLi4uIG5vdCBtZWFuaW5nZnVsIGhlcmUKKwkJCQkJYnJlYWs7CisJCQkJKi8KKwkJCX0KKwkJfQorCQkvL3JldHVybiAoaGFzUGFyZW50Tm9kZVNldCkgPyBwYXJzZWROb2RlU2V0W25vZGUudGFnTmFtZV0gOiBwYXJzZWROb2RlU2V0OworCQkvL2lmKHBhcnNlZE5vZGVTZXQudGFnTmFtZSlkb2pvLmRlYnVnKCJwYXJzZUVsZW1lbnQ6IFJFVFVSTklORyBOT0RFIFdJVEggVEFHTkFNRSAiK3BhcnNlZE5vZGVTZXQudGFnTmFtZSk7CisJCXJldHVybiBwYXJzZWROb2RlU2V0OworCX07CisKKworCS8qIHBhcnNlcyBhIHNldCBvZiBhdHRyaWJ1dGVzIG9uIGEgbm9kZSBpbnRvIGFuIG9iamVjdCB0cmVlICovCisJdGhpcy5wYXJzZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbigvKkRvbU5vZGUqL25vZGUpeworCQkvLyBzdW1tYXJ5OgorCQkvLyAJCWNyZWF0ZXMgYW4gYXR0cmlidXRlIG9iamVjdCB0aGF0IG1hcHMgYXR0cmlidXRlIHZhbHVlcyBmb3IgdGhlCisJCS8vIAkJcGFzc2VkIG5vZGUuIE5vdGUgdGhhdCB0aGlzIGlzIHNpbWlsYXIgdG8gY3JlYXRpbmcgYSBKU09OCisJCS8vIAkJcmVwcmVzZW50YXRpb24gb2YgYSBET00gbm9kZS4KKwkJLy8gdXNhZ2U6CisJCS8vCQlhIG5vZGUgd2l0aCB0aGUgZm9sbG93aW5nIHNlcmlhbGl6YXRpb246CisJCS8vCQkJPGRpdiBmb289ImJhciIgYmF6PSJ0aHVkIj4uLi48L2Rpdj4JCisJCS8vCQl3b3VsZCB5ZWlsZCB0aGUgZm9sbG93aW5nIHJldHVybiBzdHJ1Y3R1cmUgd2hlbiBwYXNzZWQgaW50byB0aGlzCisJCS8vCQlmdW5jdGlvbjoKKwkJLy8JCQl7CisJCS8vCQkJCSJmb28iOiB7CisJCS8vCQkJCQkidmFsdWUiOiAiYmFyIgorCQkvLwkJCQl9LAorCQkvLwkJCQkiYmF6IjogeworCQkvLwkJCQkJInZhbHVlIjogInRodWQiCisJCS8vCQkJCX0KKwkJLy8JCQl9CisJCS8vCisJCXZhciBwYXJzZWRBdHRyaWJ1dGVTZXQgPSB7fTsKKwkJdmFyIGF0dHMgPSBub2RlLmF0dHJpYnV0ZXM7CisJCS8vIFRPRE86IHNob3VsZCB3ZSBhbGxvdyBmb3IgZHVwbGljYXRlIGF0dHJpYnV0ZXMgYXQgdGhpcyBwb2ludC4uLgorCQkvLyB3b3VsZCBhbnkgb2YgdGhlIHJlbGV2YW50IGRvbSBpbXBsZW1lbnRhdGlvbnMgZXZlbiBhbGxvdyB0aGlzPworCQl2YXIgYXR0bm9kZSwgaT0wOworCQl3aGlsZSgoYXR0bm9kZT1hdHRzW2krK10pKXsKKwkJCWlmKGlzSUUpeworCQkJCWlmKCFhdHRub2RlKXsgY29udGludWU7IH0KKwkJCQlpZigodHlwZW9mIGF0dG5vZGUgPT0gIm9iamVjdCIpJiYKKwkJCQkJKHR5cGVvZiBhdHRub2RlLm5vZGVWYWx1ZSA9PSAndW5kZWZpbmVkJyl8fAorCQkJCQkoYXR0bm9kZS5ub2RlVmFsdWUgPT0gbnVsbCl8fAorCQkJCQkoYXR0bm9kZS5ub2RlVmFsdWUgPT0gJycpKXsgCisJCQkJCWNvbnRpbnVlOyAKKwkJCQl9CisJCQl9CisKKwkJCXZhciBubiA9IGF0dG5vZGUubm9kZU5hbWUuc3BsaXQoIjoiKTsKKwkJCW5uID0gKG5uLmxlbmd0aCA9PSAyKSA/IG5uWzFdIDogYXR0bm9kZS5ub2RlTmFtZTsKKwkJCQkJCQorCQkJcGFyc2VkQXR0cmlidXRlU2V0W25uXSA9IHsgCisJCQkJdmFsdWU6IGF0dG5vZGUubm9kZVZhbHVlIAorCQkJfTsKKwkJfQorCQlyZXR1cm4gcGFyc2VkQXR0cmlidXRlU2V0OworCX07Cit9OworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5kZWNsYXJlIik7CisKKworCisKK2Rvam8ubGFuZy5kZWNsYXJlID0gZnVuY3Rpb24oCS8qU3RyaW5nKi8gY2xhc3NOYW1lLCAKKwkJCQkJCQkJLypGdW5jdGlvbnxBcnJheSovIHN1cGVyY2xhc3MsIAorCQkJCQkJCQkvKkZ1bmN0aW9uPyovIGluaXQsIAorCQkJCQkJCQkvKk9iamVjdHxBcnJheSovIHByb3BzKXsKKwkvKgorCSAqCXN1bW1hcnk6IENyZWF0ZSBhIGZlYXR1cmUtcmljaCBjb25zdHJ1Y3RvciB3aXRoIGEgY29tcGFjdCBub3RhdGlvbgorCSAqCWNsYXNzTmFtZTogdGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIChsb29zZWx5LCBhICJjbGFzcyIpCisJICogCXN1cGVyY2xhc3M6CisJICoJCW1heSBiZSBhIEZ1bmN0aW9uLCBvciBhbiBBcnJheSBvZiBGdW5jdGlvbnMuIElmICJzdXBlcmNsYXNzIiBpcyBhbgorCSAqCQlhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZCBhcyB0aGUgcHJvdG90eXBpY2FsIGFuY2VzdG9yIGFuZAorCSAqCQlhbnkgZm9sbG93aW5nIEZ1bmN0aW9ucyBiZWNvbWUgbWl4aW4gYW5jZXN0b3JzLgorCSAqCWluaXQ6IGFuIGluaXRpYWxpemVyIGZ1bmN0aW9uCisJICoJcHJvcHM6CisJICoJCWFuIG9iamVjdCAob3IgYXJyYXkgb2Ygb2JqZWN0cykgd2hvc2UgcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZQorCSAqCQljcmVhdGVkIHByb3RvdHlwZQorCSAqCWRlc2NyaXB0aW9uOgorCSAqCQlDcmVhdGUgYSBjb25zdHJ1Y3RvciB1c2luZyBhIGNvbXBhY3Qgbm90YXRpb24gZm9yIGluaGVyaXRhbmNlIGFuZAorCSAqCQlwcm90b3R5cGUgZXh0ZW5zaW9uLiAic3VwZXJjbGFzcyIgYXJndW1lbnQgbWF5IGJlIGEgRnVuY3Rpb24sIG9yIGFuCisJICoJCWFycmF5IG9mIEZ1bmN0aW9ucy4gCisJICoKKwkgKgkJSWYgInN1cGVyY2xhc3MiIGlzIGFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkIGFzIHRoZQorCSAqCQlwcm90b3R5cGljYWwgYW5jZXN0b3IgYW5kIGFueSBmb2xsb3dpbmcgRnVuY3Rpb25zIGJlY29tZSBtaXhpbgorCSAqCQlhbmNlc3RvcnMuIAorCSAqIAorCSAqCQlBbGwgInN1cGVyY2xhc3MoZXMpIiBtdXN0IGJlIEZ1bmN0aW9ucyAobm90IG1lcmUgT2JqZWN0cykuCisJICoKKwkgKgkJVXNpbmcgbWl4aW4gYW5jZXN0b3JzIHByb3ZpZGVzIGEgdHlwZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKwkgKgkJTWl4aW4gYW5jZXN0b3JzIHByb3RvdHlwaWNhbCBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHN1YmNsYXNzLAorCSAqCQlhbmQgYW55IGluaWFsaXphdGVyL2NvbnN0cnVjdG9yIGlzIGludm9rZWQuIAorCSAqCisJICoJCVByb3BlcnRpZXMgb2Ygb2JqZWN0ICJwcm9wcyIgYXJlIGNvcGllZCB0byB0aGUgY29uc3RydWN0b3IKKwkgKgkJcHJvdG90eXBlLiBJZiAicHJvcHMiIGlzIGFuIGFycmF5LCBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGluIHRoZQorCSAqCQlhcnJheSBhcmUgY29waWVkIHRvIHRoZSBjb25zdHJ1Y3RvciBwcm90b3R5cGUuCisJICoKKwkgKgkJbmFtZSBvZiB0aGUgY2xhc3MgKCJjbGFzc05hbWUiIGFyZ3VtZW50KSBpcyBzdG9yZWQgaW4KKwkgKgkJImRlY2xhcmVkQ2xhc3MiIHByb3BlcnR5CisJICogCisJICoJCUluaXRpYWxpemVyIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGluc3RhbnRpYXRlZAorCSAqCQlmcm9tIHRoaXMgY29uc3RydWN0b3IuCisJICogCisJICoJCUFsaWFzZWQgYXMgImRvam8uZGVjbGFyZSIKKwkgKgorCSAqIFVzYWdlOgorCSAqCisJICoJCWRvam8uZGVjbGFyZSgibXkuY2xhc3Nlcy5iYXIiLCBteS5jbGFzc2VzLmZvbywKKwkgKgkJCWZ1bmN0aW9uKCl7CisJICoJCQkJLy8gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKwkgKgkJCQl0aGlzLm15Q29tcGxpY2F0ZWRPYmplY3QgPSBuZXcgUmVhbGx5Q29tcGxpY2F0ZWRPYmplY3QoKTsgCisJICoJCQl9LAorCSAqCQkJeyAvLyBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjbGFzcyBwcm90b3R5cGUKKwkgKgkJCQlzb21lVmFsdWU6IDIsCisJICoJCQkJc29tZU1ldGhvZDogZnVuY3Rpb24oKXsgCisJICoJCQkJCWRvU3R1ZmYoKTsgCisJICoJCQkJfQorCSAqCQkJfQorCSAqCQkpOworCSAqCisJICovCisJaWYoKGRvam8ubGFuZy5pc0Z1bmN0aW9uKHByb3BzKSl8fCgoIXByb3BzKSYmKCFkb2pvLmxhbmcuaXNGdW5jdGlvbihpbml0KSkpKXsgCisJCS8vIHBhcmFtZXRlciBqdWdnbGluZyB0byBzdXBwb3J0IG9taXR0aW5nIGluaXQgcGFyYW0gKGFsc28gYWxsb3dzCisJCS8vIHJlb3JkZXJpbmcgaW5pdCBhbmQgcHJvcHMgYXJndW1lbnRzKQorCQl2YXIgdGVtcCA9IHByb3BzOworCQlwcm9wcyA9IGluaXQ7CisJCWluaXQgPSB0ZW1wOworCX0JCisJdmFyIG1peGlucyA9IFsgXTsKKwlpZihkb2pvLmxhbmcuaXNBcnJheShzdXBlcmNsYXNzKSl7CisJCW1peGlucyA9IHN1cGVyY2xhc3M7CisJCXN1cGVyY2xhc3MgPSBtaXhpbnMuc2hpZnQoKTsKKwl9CisJaWYoIWluaXQpeworCQlpbml0ID0gZG9qby5ldmFsT2JqUGF0aChjbGFzc05hbWUsIGZhbHNlKTsKKwkJaWYoKGluaXQpJiYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGluaXQpKSl7IGluaXQgPSBudWxsIH07CisJfQorCXZhciBjdG9yID0gZG9qby5sYW5nLmRlY2xhcmUuX21ha2VDb25zdHJ1Y3RvcigpOworCXZhciBzY3AgPSAoc3VwZXJjbGFzcyA/IHN1cGVyY2xhc3MucHJvdG90eXBlIDogbnVsbCk7CisJaWYoc2NwKXsKKwkJc2NwLnByb3RvdHlwaW5nID0gdHJ1ZTsKKwkJY3Rvci5wcm90b3R5cGUgPSBuZXcgc3VwZXJjbGFzcygpOworCQlzY3AucHJvdG90eXBpbmcgPSBmYWxzZTsgCisJfQorCWN0b3Iuc3VwZXJjbGFzcyA9IHNjcDsKKwljdG9yLm1peGlucyA9IG1peGluczsKKwlmb3IodmFyIGk9MCxsPW1peGlucy5sZW5ndGg7IGk8bDsgaSsrKXsKKwkJZG9qby5sYW5nLmV4dGVuZChjdG9yLCBtaXhpbnNbaV0ucHJvdG90eXBlKTsKKwl9CisJY3Rvci5wcm90b3R5cGUuaW5pdGlhbGl6ZXIgPSBudWxsOworCWN0b3IucHJvdG90eXBlLmRlY2xhcmVkQ2xhc3MgPSBjbGFzc05hbWU7CisJaWYoZG9qby5sYW5nLmlzQXJyYXkocHJvcHMpKXsKKwkJZG9qby5sYW5nLmV4dGVuZC5hcHBseShkb2pvLmxhbmcsIFtjdG9yXS5jb25jYXQocHJvcHMpKTsKKwl9ZWxzZXsKKwkJZG9qby5sYW5nLmV4dGVuZChjdG9yLCAocHJvcHMpfHx7fSk7CisJfQorCWRvam8ubGFuZy5leHRlbmQoY3RvciwgZG9qby5sYW5nLmRlY2xhcmUuX2NvbW1vbik7CisJY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yOworCWN0b3IucHJvdG90eXBlLmluaXRpYWxpemVyID0gKGN0b3IucHJvdG90eXBlLmluaXRpYWxpemVyKXx8KGluaXQpfHwoZnVuY3Rpb24oKXt9KTsKKwl2YXIgY3JlYXRlZCA9IGRvam8ucGFyc2VPYmpQYXRoKGNsYXNzTmFtZSwgbnVsbCwgdHJ1ZSk7CisJY3JlYXRlZC5vYmpbY3JlYXRlZC5wcm9wXSA9IGN0b3I7CisJcmV0dXJuIGN0b3I7IC8vIEZ1bmN0aW9uCit9CisKK2Rvam8ubGFuZy5kZWNsYXJlLl9tYWtlQ29uc3RydWN0b3IgPSBmdW5jdGlvbigpeworCXJldHVybiBmdW5jdGlvbigpeyAKKwkJLy8gZ2V0IHRoZSBnZW5lcmF0aW9uYWwgY29udGV4dCAod2hpY2ggb2JqZWN0IFtvciBwcm90b3R5cGVdIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCkKKwkJdmFyIHNlbGYgPSB0aGlzLl9nZXRQcm9wQ29udGV4dCgpOworCQl2YXIgcyA9IHNlbGYuY29uc3RydWN0b3Iuc3VwZXJjbGFzczsKKwkJaWYoKHMpJiYocy5jb25zdHJ1Y3RvcikpeworCQkJaWYocy5jb25zdHJ1Y3Rvcj09YXJndW1lbnRzLmNhbGxlZSl7CisJCQkJLy8gaWYgdGhpcyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGRpcmVjdGx5IChteS5hbmNlc3Rvci5jYWxsKHRoaXMpKQorCQkJCXRoaXMuX2luaGVyaXRlZCgiY29uc3RydWN0b3IiLCBhcmd1bWVudHMpOworCQkJfWVsc2V7CisJCQkJdGhpcy5fY29udGV4dE1ldGhvZChzLCAiY29uc3RydWN0b3IiLCBhcmd1bWVudHMpOworCQkJfQorCQl9CisJCXZhciBtcyA9IChzZWxmLmNvbnN0cnVjdG9yLm1peGlucyl8fChbXSk7CisJCWZvcih2YXIgaT0wLCBtOyAobT1tc1tpXSk7IGkrKykgeworCQkJKCgobS5wcm90b3R5cGUpJiYobS5wcm90b3R5cGUuaW5pdGlhbGl6ZXIpKXx8KG0pKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9CisJCWlmKCghdGhpcy5wcm90b3R5cGluZykmJihzZWxmLmluaXRpYWxpemVyKSl7CisJCQlzZWxmLmluaXRpYWxpemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwl9Cit9CisKK2Rvam8ubGFuZy5kZWNsYXJlLl9jb21tb24gPSB7CisJX2dldFByb3BDb250ZXh0OiBmdW5jdGlvbigpeyByZXR1cm4gKHRoaXMuX19fcHJvdG98fHRoaXMpOyB9LAorCS8vIGNhY2hlcyBwdHlwZSBjb250ZXh0IGFuZCBjYWxscyBtZXRob2Qgb24gaXQKKwlfY29udGV4dE1ldGhvZDogZnVuY3Rpb24ocHR5cGUsIG1ldGhvZCwgYXJncyl7CisJCXZhciByZXN1bHQsIHN0YWNrID0gdGhpcy5fX19wcm90bzsKKwkJdGhpcy5fX19wcm90byA9IHB0eXBlOworCQl0cnkgeyByZXN1bHQgPSBwdHlwZVttZXRob2RdLmFwcGx5KHRoaXMsKGFyZ3N8fFtdKSk7IH0KKwkJY2F0Y2goZSkgeyB0aHJvdyBlOyB9CQorCQlmaW5hbGx5IHsgdGhpcy5fX19wcm90byA9IHN0YWNrOyB9CisJCXJldHVybiByZXN1bHQ7CisJfSwKKwlfaW5oZXJpdGVkOiBmdW5jdGlvbihwcm9wLCBhcmdzKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVNlYXJjaGVzIGJhY2t3YXJkIHRocnUgcHJvdG90eXBlIGNoYWluIHRvIGZpbmQgbmVhcmVzdAorCQkvLwkJYW5jZXN0cmFsIGluc3RhbmNlIG9mIHByb3AuIEludGVybmFsIHVzZSBvbmx5LgorCQl2YXIgcCA9IHRoaXMuX2dldFByb3BDb250ZXh0KCk7CisJCWRveworCQkJaWYoKCFwLmNvbnN0cnVjdG9yKXx8KCFwLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3MpKXsgcmV0dXJuOyB9CisJCQlwID0gcC5jb25zdHJ1Y3Rvci5zdXBlcmNsYXNzOworCQl9d2hpbGUoIShwcm9wIGluIHApKTsKKwkJcmV0dXJuIChkb2pvLmxhbmcuaXNGdW5jdGlvbihwW3Byb3BdKSA/IHRoaXMuX2NvbnRleHRNZXRob2QocCwgcHJvcCwgYXJncykgOiBwW3Byb3BdKTsKKwl9LAorCWluaGVyaXRlZDogZnVuY3Rpb24ocHJvcCwgYXJncyl7CisJCWRvam8uZGVwcmVjYXRlZCgiJ2luaGVyaXRlZCcgbWV0aG9kIGlzIGRhbmdlcm91cywgZG8gbm90IHVwLWNhbGwhICdpbmhlcml0ZWQnIGlzIHNsYXRlZCBmb3IgcmVtb3ZhbCBpbiAwLjU7IG5hbWUgeW91ciBzdXBlciBjbGFzcyAob3IgdXNlIHN1cGVyY2xhc3MgcHJvcGVydHkpIGluc3RlYWQuIiwgIjAuNSIpOworCQl0aGlzLl9pbmhlcml0ZWQocHJvcCwgYXJncyk7CisJfQorfQorCitkb2pvLmRlY2xhcmUgPSBkb2pvLmxhbmcuZGVjbGFyZTsKKworZG9qby5wcm92aWRlKCJkb2pvLm5zIik7CisKK2Rvam8ubnMgPSB7CisJLy8gc3VtbWFyeTogcHJpdmF0ZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHdpZGdldCBuYW1lc3BhY2UgbWFuYWdlbWVudAorCW5hbWVzcGFjZXM6IHt9LAorCWZhaWxlZDoge30sCisJbG9hZGluZzoge30sCisJbG9hZGVkOiB7fSwKKwlyZWdpc3RlcjogZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qU3RyaW5nKi9tb2R1bGUsIC8qRnVuY3Rpb24/Ki9yZXNvbHZlciwgLypCb29sZWFuPyovbm9PdmVycmlkZSl7CisJCS8vIHN1bW1hcnk6IGNyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIGRvam8ubnMuTnMgb2JqZWN0CisJCWlmKCFub092ZXJyaWRlIHx8ICF0aGlzLm5hbWVzcGFjZXNbbmFtZV0peworCQkJdGhpcy5uYW1lc3BhY2VzW25hbWVdID0gbmV3IGRvam8ubnMuTnMobmFtZSwgbW9kdWxlLCByZXNvbHZlcik7CisJCX0KKwl9LAorCWFsbG93OiBmdW5jdGlvbigvKlN0cmluZyovbmFtZSl7CisJCS8vIHN1bW1hcnk6IFJldHVybnMgZmFsc2UgaWYgJ25hbWUnIGlzIGZpbHRlcmVkIGJ5IGNvbmZpZ3VyYXRpb24gb3IgaGFzIGZhaWxlZCB0byBsb2FkLCB0cnVlIG90aGVyd2lzZQorCQlpZih0aGlzLmZhaWxlZFtuYW1lXSl7cmV0dXJuIGZhbHNlO30gLy8gQm9vbGVhbgorCQlpZigoZGpDb25maWcuZXhjbHVkZU5hbWVzcGFjZSkmJihkb2pvLmxhbmcuaW5BcnJheShkakNvbmZpZy5leGNsdWRlTmFtZXNwYWNlLCBuYW1lKSkpe3JldHVybiBmYWxzZTt9IC8vIEJvb2xlYW4KKwkJLy8gSWYgdGhlIG5hbWVzcGFjZSBpcyAiZG9qbyIsIG9yIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGFsbG93ZWQgbmFtZXNwYWNlcyByZXR1cm4gdHJ1ZS4KKwkJLy8gT3RoZXJ3aXNlLCBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWNhbGx5IGFsbG93ZWQgdGhpcyBuYW1lc3BhY2UsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgZmFsc2UuCisJCXJldHVybigobmFtZT09dGhpcy5kb2pvKXx8KCFkakNvbmZpZy5pbmNsdWRlTmFtZXNwYWNlKXx8KGRvam8ubGFuZy5pbkFycmF5KGRqQ29uZmlnLmluY2x1ZGVOYW1lc3BhY2UsIG5hbWUpKSk7IC8vIEJvb2xlYW4KKwl9LAorCWdldDogZnVuY3Rpb24oLypTdHJpbmcqL25hbWUpeworCQkvLyBzdW1tYXJ5CisJCS8vICBSZXR1cm4gTnMgb2JqZWN0IHJlZ2lzdGVyZWQgdG8gJ25hbWUnLCBpZiBhbnkKKwkJcmV0dXJuIHRoaXMubmFtZXNwYWNlc1tuYW1lXTsgLy8gTnMKKwl9LAorCXJlcXVpcmU6IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkJLy8gc3VtbWFyeQorICAJLy8gIFRyeSB0byBlbnN1cmUgdGhhdCAnbmFtZScgaXMgcmVnaXN0ZXJlZCwgbG9hZGluZyBhIG5hbWVzcGFjZSBtYW5pZmVzdCBpZiBuZWNlc3NhcnkKKwkJdmFyIG5zID0gdGhpcy5uYW1lc3BhY2VzW25hbWVdOworCQlpZigobnMpJiYodGhpcy5sb2FkZWRbbmFtZV0pKXtyZXR1cm4gbnM7fSAvLyBOcworCQlpZighdGhpcy5hbGxvdyhuYW1lKSl7cmV0dXJuIGZhbHNlO30gLy8gQm9vbGVhbgorIAkJaWYodGhpcy5sb2FkaW5nW25hbWVdKXsKKwkJCS8vIEZJWE1FOiBkbyB3ZSByZWFsbHkgZXZlciBoYXZlIHJlLWVudHJhbmN5IHNpdHVhdGlvbj8gdGhpcyB3b3VsZCBhcHBlYXIgdG8gYmUgcmVhbGx5IGJhZAorCQkJLy8gb3JpZ2luYWwgY29kZSBkaWQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiwgYWx0aG91Z2ggdGhhdCBzZWVtcyB0aGUgb25seSBjb3Vyc2UKKwkJCS8vIGFkZGluZyBkZWJ1ZyBvdXRwdXQgaGVyZSB0byB0cmFjayBpZiB0aGlzIG9jY3Vycy4KKwkJCWRvam8uZGVidWcoJ2Rvam8ubmFtZXNwYWNlLnJlcXVpcmU6IHJlLWVudHJhbnQgcmVxdWVzdCB0byBsb2FkIG5hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBtdXN0IGZhaWwuJyk7IAorCQkJcmV0dXJuIGZhbHNlOyAvLyBCb29sZWFuCisJCX0KKwkJLy8gd29ya2Fyb3VuZCBzbyB3ZSBkb24ndCBicmVhayB0aGUgYnVpbGQgc3lzdGVtCisJCXZhciByZXEgPSBkb2pvLnJlcXVpcmU7CisJCXRoaXMubG9hZGluZ1tuYW1lXSA9IHRydWU7CisJCXRyeSB7CisJCQkvL2Rvam8gbmFtZXNwYWNlIGZpbGUgaXMgYWx3YXlzIGluIHRoZSBEb2pvIG5hbWVzcGFjZXMgZm9sZGVyLCBub3QgYW55IGN1c3RvbSBmb2xkZXIKKwkJCWlmKG5hbWU9PSJkb2pvIil7CisJCQkJcmVxKCJkb2pvLm5hbWVzcGFjZXMuZG9qbyIpOworCQkJfWVsc2V7CisJCQkJLy8gaWYgbm8gcmVnaXN0ZXJlZCBtb2R1bGUgcHJlZml4LCB1c2UgLi4vPG5hbWU+IGJ5IGNvbnZlbnRpb24KKwkJCQlpZighZG9qby5ob3N0ZW52Lm1vZHVsZUhhc1ByZWZpeChuYW1lKSl7CisJCQkJCWRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUsICIuLi8iICsgbmFtZSk7CisJCQkJfQorCQkJCXJlcShbbmFtZSwgJ21hbmlmZXN0J10uam9pbignLicpLCBmYWxzZSwgdHJ1ZSk7CisJCQl9CisJCQlpZighdGhpcy5uYW1lc3BhY2VzW25hbWVdKXsKKwkJCQl0aGlzLmZhaWxlZFtuYW1lXSA9IHRydWU7IC8vb25seSBsb29rIGZvciBhIG5hbWVzcGFjZSBvbmNlCisJCQl9CisJCX1maW5hbGx5eworCQkJdGhpcy5sb2FkaW5nW25hbWVdPWZhbHNlOworCQl9CisJCXJldHVybiB0aGlzLm5hbWVzcGFjZXNbbmFtZV07IC8vIE5zCisJfQorfQorCitkb2pvLm5zLk5zID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qU3RyaW5nKi9tb2R1bGUsIC8qRnVuY3Rpb24/Ki9yZXNvbHZlcil7CisJLy8gc3VtbWFyeTogdGhpcyBvYmplY3Qgc2ltcGx5IGVuY2Fwc3VsYXRlcyBuYW1lc3BhY2UgZGF0YQorCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOworCXRoaXMuX2xvYWRlZCA9IFsgXTsKKwl0aGlzLl9mYWlsZWQgPSBbIF07Cit9CisKK2Rvam8ubnMuTnMucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbigvKlN0cmluZyovbmFtZSwgLypTdHJpbmcqL2RvbWFpbiwgLypCb29sZWFuPyovb21pdE1vZHVsZUNoZWNrKXsKKwkvL3N1bW1hcnk6IG1hcCBjb21wb25lbnQgd2l0aCAnbmFtZScgYW5kICdkb21haW4nIHRvIGEgbW9kdWxlIHZpYSBuYW1lc3BhY2UgcmVzb2x2ZXIsIGlmIHNwZWNpZmllZAorCWlmKCF0aGlzLnJlc29sdmVyIHx8IGRqQ29uZmlnWyJza2lwQXV0b1JlcXVpcmUiXSl7cmV0dXJuIGZhbHNlO30gLy8gQm9vbGVhbgorCXZhciBmdWxsTmFtZSA9IHRoaXMucmVzb2x2ZXIobmFtZSwgZG9tYWluKTsKKwkvL29ubHkgbG9hZCBhIHdpZGdldCBvbmNlLiBUaGlzIGlzIGEgcXVpY2tlciBjaGVjayB0aGFuIGRvam8ucmVxdWlyZSBkb2VzCisJaWYoKGZ1bGxOYW1lKSYmKCF0aGlzLl9sb2FkZWRbZnVsbE5hbWVdKSYmKCF0aGlzLl9mYWlsZWRbZnVsbE5hbWVdKSl7CisJCS8vd29ya2Fyb3VuZCBzbyB3ZSBkb24ndCBicmVhayB0aGUgYnVpbGQgc3lzdGVtCisJCXZhciByZXEgPSBkb2pvLnJlcXVpcmU7CisJCXJlcShmdWxsTmFtZSwgZmFsc2UsIHRydWUpOyAvL29taXQgdGhlIG1vZHVsZSBjaGVjaywgd2UnbGwgZG8gaXQgb3Vyc2VsdmVzLgorCQlpZihkb2pvLmhvc3RlbnYuZmluZE1vZHVsZShmdWxsTmFtZSwgZmFsc2UpKXsKKwkJCXRoaXMuX2xvYWRlZFtmdWxsTmFtZV0gPSB0cnVlOworCQl9ZWxzZXsKKwkJCWlmKCFvbWl0TW9kdWxlQ2hlY2spe2Rvam8ucmFpc2UoImRvam8ubnMuTnMucmVzb2x2ZTogbW9kdWxlICciICsgZnVsbE5hbWUgKyAiJyBub3QgZm91bmQgYWZ0ZXIgbG9hZGluZyB2aWEgbmFtZXNwYWNlICciICsgdGhpcy5uYW1lICsgIiciKTt9IAorCQkJdGhpcy5fZmFpbGVkW2Z1bGxOYW1lXSA9IHRydWU7CisJCX0KKwl9CisJcmV0dXJuIEJvb2xlYW4odGhpcy5fbG9hZGVkW2Z1bGxOYW1lXSk7IC8vIEJvb2xlYW4KK30KKworZG9qby5yZWdpc3Rlck5hbWVzcGFjZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lLCAvKlN0cmluZyovbW9kdWxlLCAvKkZ1bmN0aW9uPyovcmVzb2x2ZXIpeworCS8vIHN1bW1hcnk6IG1hcHMgYSBtb2R1bGUgbmFtZSB0byBhIG5hbWVzcGFjZSBmb3Igd2lkZ2V0cywgYW5kIG9wdGlvbmFsbHkgbWFwcyB3aWRnZXQgbmFtZXMgdG8gbW9kdWxlcyBmb3IgYXV0by1sb2FkaW5nCisJLy8gZGVzY3JpcHRpb246IEFuIHVucmVnaXN0ZXJlZCBuYW1lc3BhY2UgaXMgbWFwcGVkIHRvIGFuIGVwb255bW91cyBtb2R1bGUuCisJLy8JRm9yIGV4YW1wbGUsIG5hbWVzcGFjZSBhY21lIGlzIG1hcHBlZCB0byBtb2R1bGUgYWNtZSwgYW5kIHdpZGdldHMgYXJlCisJLy8JYXNzdW1lZCB0byBiZWxvbmcgdG8gYWNtZS53aWRnZXQuIElmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCB3aWRnZXQKKwkvLwltb2R1bGUsIHVzZSBkb2pvLnJlZ2lzdGVyTmFtZXNwYWNlLgorCWRvam8ubnMucmVnaXN0ZXIuYXBwbHkoZG9qby5ucywgYXJndW1lbnRzKTsKK30KKworZG9qby5yZWdpc3Rlck5hbWVzcGFjZVJlc29sdmVyID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qRnVuY3Rpb24qL3Jlc29sdmVyKXsKKwkvLyBzdW1tYXJ5OiBhIHJlc29sdmVyIGZ1bmN0aW9uIG1hcHMgd2lkZ2V0IG5hbWVzIHRvIG1vZHVsZXMsIHNvIHRoZQorCS8vCXdpZGdldCBtYW5hZ2VyIGNhbiBhdXRvLWxvYWQgbmVlZGVkIHdpZGdldCBpbXBsZW1lbnRhdGlvbnMKKwkvLworCS8vIGRlc2NyaXB0aW9uOiBUaGUgcmVzb2x2ZXIgcHJvdmlkZXMgaW5mb3JtYXRpb24gdG8gYWxsb3cgRG9qbworCS8vCXRvIGxvYWQgd2lkZ2V0IG1vZHVsZXMgb24gZGVtYW5kLiBXaGVuIGEgd2lkZ2V0IGlzIGNyZWF0ZWQsCisJLy8JYSBuYW1lc3BhY2UgcmVzb2x2ZXIgY2FuIHRlbGwgRG9qbyB3aGF0IG1vZHVsZSB0byByZXF1aXJlCisJLy8JdG8gZW5zdXJlIHRoYXQgdGhlIHdpZGdldCBpbXBsZW1lbnRhdGlvbiBjb2RlIGlzIGxvYWRlZC4KKwkvLworCS8vIG5hbWU6IHdpbGwgYWx3YXlzIGJlIGxvd2VyLWNhc2UuCisJLy8KKwkvLyBleGFtcGxlOgorCS8vICBkb2pvLnJlZ2lzdGVyTmFtZXNwYWNlUmVzb2x2ZXIoImFjbWUiLAorCS8vICAgIGZ1bmN0aW9uKG5hbWUpeyAKKwkvLyAgICAgIHJldHVybiAiYWNtZS53aWRnZXQuIitkb2pvLnN0cmluZy5jYXBpdGFsaXplKG5hbWUpOworCS8vICAgIH0KKwkvLyAgKTsKKwl2YXIgbiA9IGRvam8ubnMubmFtZXNwYWNlc1tuYW1lXTsKKwlpZihuKXsKKwkJbi5yZXNvbHZlciA9IHJlc29sdmVyOworCX0KK30KKworZG9qby5yZWdpc3Rlck5hbWVzcGFjZU1hbmlmZXN0ID0gZnVuY3Rpb24oLypTdHJpbmcqL21vZHVsZSwgLypTdHJpbmcqL3BhdGgsIC8qU3RyaW5nKi9uYW1lLCAvKlN0cmluZyovd2lkZ2V0TW9kdWxlLCAvKkZ1bmN0aW9uPyovcmVzb2x2ZXIpeworCS8vIHN1bW1hcnk6IGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGEgbW9kdWxlIHBhdGgsIGEgbmFtZXNwYWNlLCBhbmQgb3B0aW9uYWxseSBhIHJlc29sdmVyIGFsbCBhdCBvbmNlLgorCWRvam8ucmVnaXN0ZXJNb2R1bGVQYXRoKG5hbWUsIHBhdGgpOworCWRvam8ucmVnaXN0ZXJOYW1lc3BhY2UobmFtZSwgd2lkZ2V0TW9kdWxlLCByZXNvbHZlcik7Cit9CisKKy8vIE5PVEU6IHJhdGhlciBwdXQgdGhpcyBpbiBkb2pvLndpZGdldC5XaWRnZXQsIGJ1dCB0aGF0IGZ1YmFycyBkZWJ1Z0F0QWxsQ29zdHMKK2Rvam8ucmVnaXN0ZXJOYW1lc3BhY2UoImRvam8iLCAiZG9qby53aWRnZXQiKTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5NYW5hZ2VyIik7CisKKworCisKKy8vIHN1bW1hcnkKKy8vCU1hbmFnZXIgY2xhc3MgZm9yIHRoZSB3aWRnZXRzLgorLy8JVGhpcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIGJ5IGRvam87IHVzZXJzIHNob3VsZG4ndCBjYWxsIHRoaXMgY2xhc3MgZGlyZWN0bHkuCitkb2pvLndpZGdldC5tYW5hZ2VyID0gbmV3IGZ1bmN0aW9uKCl7CisJdGhpcy53aWRnZXRzID0gW107CisJdGhpcy53aWRnZXRJZHMgPSBbXTsKKwkKKwkvLyBtYXAgb2Ygd2lkZ2V0SWQtLT53aWRnZXQgZm9yIHdpZGdldHMgd2l0aG91dCBwYXJlbnRzICh0b3AgbGV2ZWwgd2lkZ2V0cykKKwl0aGlzLnRvcFdpZGdldHMgPSB7fTsKKworCXZhciB3aWRnZXRUeXBlQ3RyID0ge307CisJdmFyIHJlbmRlclByZWZpeENhY2hlID0gW107CisKKwl0aGlzLmdldFVuaXF1ZUlkID0gZnVuY3Rpb24gKHdpZGdldFR5cGUpIHsKKwkJdmFyIHdpZGdldElkOworCQlkb3sKKwkJCXdpZGdldElkID0gd2lkZ2V0VHlwZSArICJfIiArICh3aWRnZXRUeXBlQ3RyW3dpZGdldFR5cGVdICE9IHVuZGVmaW5lZCA/CisJCQkrK3dpZGdldFR5cGVDdHJbd2lkZ2V0VHlwZV0gOiB3aWRnZXRUeXBlQ3RyW3dpZGdldFR5cGVdID0gMCk7CisJCX13aGlsZSh0aGlzLmdldFdpZGdldEJ5SWQod2lkZ2V0SWQpKTsKKwkJcmV0dXJuIHdpZGdldElkOworCX0KKworCXRoaXMuYWRkID0gZnVuY3Rpb24od2lkZ2V0KXsKKwkJLy9kb2pvLnByb2ZpbGUuc3RhcnQoImRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkIik7CisJCXRoaXMud2lkZ2V0cy5wdXNoKHdpZGdldCk7CisJCS8vIE9wZXJhOSB1c2VzIElEIChjYXBzKQorCQlpZighd2lkZ2V0LmV4dHJhQXJnc1siaWQiXSl7CisJCQl3aWRnZXQuZXh0cmFBcmdzWyJpZCJdID0gd2lkZ2V0LmV4dHJhQXJnc1siSUQiXTsKKwkJfQorCQkvLyBGSVhNRTogdGhlIHJlc3Qgb2YgdGhpcyBtZXRob2QgaXMgdmVyeSBzbG93IQorCQlpZih3aWRnZXQud2lkZ2V0SWQgPT0gIiIpeworCQkJaWYod2lkZ2V0WyJpZCJdKXsKKwkJCQl3aWRnZXQud2lkZ2V0SWQgPSB3aWRnZXRbImlkIl07CisJCQl9ZWxzZSBpZih3aWRnZXQuZXh0cmFBcmdzWyJpZCJdKXsKKwkJCQl3aWRnZXQud2lkZ2V0SWQgPSB3aWRnZXQuZXh0cmFBcmdzWyJpZCJdOworCQkJfWVsc2V7CisJCQkJd2lkZ2V0LndpZGdldElkID0gdGhpcy5nZXRVbmlxdWVJZCh3aWRnZXQubnMrJ18nK3dpZGdldC53aWRnZXRUeXBlKTsKKwkJCX0KKwkJfQorCQlpZih0aGlzLndpZGdldElkc1t3aWRnZXQud2lkZ2V0SWRdKXsKKwkJCWRvam8uZGVidWcoIndpZGdldCBJRCBjb2xsaXNpb24gb24gSUQ6ICIrd2lkZ2V0LndpZGdldElkKTsKKwkJfQorCQl0aGlzLndpZGdldElkc1t3aWRnZXQud2lkZ2V0SWRdID0gd2lkZ2V0OworCQkvLyBXaWRnZXQuZGVzdHJveSBhbHJlYWR5IGNhbGxzIHJlbW92ZUJ5SWQoKSwgc28gd2UgZG9uJ3QgbmVlZCB0bworCQkvLyBjb25uZWN0KCkgaXQgaGVyZQorCQkvL2Rvam8ucHJvZmlsZS5lbmQoImRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkIik7CisJfQorCisJdGhpcy5kZXN0cm95QWxsID0gZnVuY3Rpb24oKXsKKwkJZm9yKHZhciB4PXRoaXMud2lkZ2V0cy5sZW5ndGgtMTsgeD49MDsgeC0tKXsKKwkJCXRyeXsKKwkJCQkvLyB0aGlzLndpZGdldHNbeF0uZGVzdHJveUNoaWxkcmVuKCk7CisJCQkJdGhpcy53aWRnZXRzW3hdLmRlc3Ryb3kodHJ1ZSk7CisJCQkJZGVsZXRlIHRoaXMud2lkZ2V0c1t4XTsKKwkJCX1jYXRjaChlKXsgfQorCQl9CisJfQorCisJLy8gRklYTUU6IHdlIHNob3VsZCBuZXZlciBhbGxvdyByZW1vdmFsIG9mIHRoZSByb290IHdpZGdldCB1bnRpbCBhbGwgb3RoZXJzCisJLy8gYXJlIHJlbW92ZWQhCisJdGhpcy5yZW1vdmUgPSBmdW5jdGlvbih3aWRnZXRJbmRleCl7CisJCWlmKGRvam8ubGFuZy5pc051bWJlcih3aWRnZXRJbmRleCkpeworCQkJdmFyIHR3ID0gdGhpcy53aWRnZXRzW3dpZGdldEluZGV4XS53aWRnZXRJZDsKKwkJCWRlbGV0ZSB0aGlzLnRvcFdpZGdldHNbdHddOworCQkJZGVsZXRlIHRoaXMud2lkZ2V0SWRzW3R3XTsKKwkJCXRoaXMud2lkZ2V0cy5zcGxpY2Uod2lkZ2V0SW5kZXgsIDEpOworCQl9ZWxzZXsKKwkJCXRoaXMucmVtb3ZlQnlJZCh3aWRnZXRJbmRleCk7CisJCX0KKwl9CisJCisJLy8gRklYTUU6IHN1Ym9wdGltYWwgcGVyZm9ybWFuY2UKKwl0aGlzLnJlbW92ZUJ5SWQgPSBmdW5jdGlvbihpZCkgeworCQlpZighZG9qby5sYW5nLmlzU3RyaW5nKGlkKSl7CisJCQlpZCA9IGlkWyJ3aWRnZXRJZCJdOworCQkJaWYoIWlkKXsgZG9qby5kZWJ1ZygiaW52YWxpZCB3aWRnZXQgb3IgaWQgcGFzc2VkIHRvIHJlbW92ZUJ5SWQiKTsgcmV0dXJuOyB9CisJCX0KKwkJZm9yICh2YXIgaT0wOyBpPHRoaXMud2lkZ2V0cy5sZW5ndGg7IGkrKyl7CisJCQlpZih0aGlzLndpZGdldHNbaV0ud2lkZ2V0SWQgPT0gaWQpeworCQkJCXRoaXMucmVtb3ZlKGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdGhpcy5nZXRXaWRnZXRCeUlkID0gZnVuY3Rpb24oaWQpeworCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcoaWQpKXsKKwkJCXJldHVybiB0aGlzLndpZGdldElkc1tpZF07CisJCX0KKwkJcmV0dXJuIGlkOworCX0KKworCXRoaXMuZ2V0V2lkZ2V0c0J5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpeworCQl2YXIgbHQgPSB0eXBlLnRvTG93ZXJDYXNlKCk7CisJCXZhciBnZXRUeXBlID0gKHR5cGUuaW5kZXhPZigiOiIpIDwgMCA/IAorCQkJZnVuY3Rpb24oeCkgeyByZXR1cm4geC53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCk7IH0gOgorCQkJZnVuY3Rpb24oeCkgeyByZXR1cm4geC5nZXROYW1lc3BhY2VkVHlwZSgpOyB9CisJCSk7CisJCXZhciByZXQgPSBbXTsKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy53aWRnZXRzLCBmdW5jdGlvbih4KXsKKwkJCWlmKGdldFR5cGUoeCkgPT0gbHQpe3JldC5wdXNoKHgpO30KKwkJfSk7CisJCXJldHVybiByZXQ7CisJfQorCisJdGhpcy5nZXRXaWRnZXRzQnlGaWx0ZXIgPSBmdW5jdGlvbih1bmFyeUZ1bmMsIG9ubHlPbmUpeworCQl2YXIgcmV0ID0gW107CisJCWRvam8ubGFuZy5ldmVyeSh0aGlzLndpZGdldHMsIGZ1bmN0aW9uKHgpeworCQkJaWYodW5hcnlGdW5jKHgpKXsKKwkJCQlyZXQucHVzaCh4KTsKKwkJCQlpZihvbmx5T25lKXtyZXR1cm4gZmFsc2U7fQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0pOworCQlyZXR1cm4gKG9ubHlPbmUgPyByZXRbMF0gOiByZXQpOworCX0KKworCXRoaXMuZ2V0QWxsV2lkZ2V0cyA9IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy53aWRnZXRzLmNvbmNhdCgpOworCX0KKworCS8vCWFkZGVkLCB0cnQgMjAwNi0wMS0yMAorCXRoaXMuZ2V0V2lkZ2V0QnlOb2RlID0gZnVuY3Rpb24oLyogRE9NTm9kZSAqLyBub2RlKXsKKwkJdmFyIHc9dGhpcy5nZXRBbGxXaWRnZXRzKCk7CisJCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCWZvcih2YXIgaT0wOyBpPHcubGVuZ3RoOyBpKyspeworCQkJaWYod1tpXS5kb21Ob2RlPT1ub2RlKXsKKwkJCQlyZXR1cm4gd1tpXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyBzaG9ydGN1dHMsIGJhYnkKKwl0aGlzLmJ5SWQgPSB0aGlzLmdldFdpZGdldEJ5SWQ7CisJdGhpcy5ieVR5cGUgPSB0aGlzLmdldFdpZGdldHNCeVR5cGU7CisJdGhpcy5ieUZpbHRlciA9IHRoaXMuZ2V0V2lkZ2V0c0J5RmlsdGVyOworCXRoaXMuYnlOb2RlID0gdGhpcy5nZXRXaWRnZXRCeU5vZGU7CisKKwkvLyBtYXAgb2YgcHJldmlvdXNhbGx5IGRpc2NvdmVyZWQgaW1wbGVtZW50YXRpb24gbmFtZXMgdG8gY29uc3RydWN0b3JzCisJdmFyIGtub3duV2lkZ2V0SW1wbGVtZW50YXRpb25zID0ge307CisKKwkvLyBzdXBwb3J0IG1hbnVhbGx5IHJlZ2lzdGVyZWQgd2lkZ2V0IHBhY2thZ2VzCisJdmFyIHdpZGdldFBhY2thZ2VzID0gWyJkb2pvLndpZGdldCJdOworCWZvciAodmFyIGk9MDsgaTx3aWRnZXRQYWNrYWdlcy5sZW5ndGg7IGkrKykgeworCQkvLyBjb252ZW5pZW5jZSBmb3IgY2hlY2tpbmcgaWYgYSBwYWNrYWdlIGV4aXN0cyAocmV2ZXJzZSBsb29rdXApCisJCXdpZGdldFBhY2thZ2VzW3dpZGdldFBhY2thZ2VzW2ldXSA9IHRydWU7CisJfQorCisJdGhpcy5yZWdpc3RlcldpZGdldFBhY2thZ2UgPSBmdW5jdGlvbihwbmFtZSkgeworCQlpZighd2lkZ2V0UGFja2FnZXNbcG5hbWVdKXsKKwkJCXdpZGdldFBhY2thZ2VzW3BuYW1lXSA9IHRydWU7CisJCQl3aWRnZXRQYWNrYWdlcy5wdXNoKHBuYW1lKTsKKwkJfQorCX0KKwkKKwl0aGlzLmdldFdpZGdldFBhY2thZ2VMaXN0ID0gZnVuY3Rpb24oKSB7CisJCXJldHVybiBkb2pvLmxhbmcubWFwKHdpZGdldFBhY2thZ2VzLCBmdW5jdGlvbihlbHQpIHsgcmV0dXJuKGVsdCE9PXRydWUgPyBlbHQgOiB1bmRlZmluZWQpOyB9KTsKKwl9CisJCisJdGhpcy5nZXRJbXBsZW1lbnRhdGlvbiA9IGZ1bmN0aW9uKHdpZGdldE5hbWUsIGN0b3JPYmplY3QsIG1peGlucywgbnMpeworCQkvLyB0cnkgYW5kIGZpbmQgYSBuYW1lIGZvciB0aGUgd2lkZ2V0CisJCXZhciBpbXBsID0gdGhpcy5nZXRJbXBsZW1lbnRhdGlvbk5hbWUod2lkZ2V0TmFtZSwgbnMpOworCQlpZihpbXBsKXsgCisJCQkvLyB2YXIgdGljID0gbmV3IERhdGUoKTsKKwkJCXZhciByZXQgPSBjdG9yT2JqZWN0ID8gbmV3IGltcGwoY3Rvck9iamVjdCkgOiBuZXcgaW1wbCgpOworCQkJLy8gZG9qby5kZWJ1ZyhuZXcgRGF0ZSgpIC0gdGljKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlmdW5jdGlvbiBidWlsZFByZWZpeENhY2hlKCkgeworCQlmb3IodmFyIHJlbmRlcmVyIGluIGRvam8ucmVuZGVyKXsKKwkJCWlmKGRvam8ucmVuZGVyW3JlbmRlcmVyXVsiY2FwYWJsZSJdID09PSB0cnVlKXsKKwkJCQl2YXIgcHJlZml4ZXMgPSBkb2pvLnJlbmRlcltyZW5kZXJlcl0ucHJlZml4ZXM7CisJCQkJZm9yKHZhciBpPTA7IGk8cHJlZml4ZXMubGVuZ3RoOyBpKyspeworCQkJCQlyZW5kZXJQcmVmaXhDYWNoZS5wdXNoKHByZWZpeGVzW2ldLnRvTG93ZXJDYXNlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgSEFWRSB0byBwcmVmaXggd2lkZ2V0IGltcGxlbWVudGF0aW9uIG5hbWVzCisJCS8vIHdpdGggYW55dGhpbmcgdG8gZ2V0IHRoZW0gdG8gcmVuZGVyCisJCS8vcmVuZGVyUHJlZml4Q2FjaGUucHVzaCgiIik7CisJCS8vIGVtcHR5IHByZWZpeCBpcyBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5CisJfQorCQorCXZhciBmaW5kSW1wbGVtZW50YXRpb25Jbk1vZHVsZSA9IGZ1bmN0aW9uKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG1vZHVsZSl7CisJCWlmKCFtb2R1bGUpe3JldHVybiBudWxsO30KKwkJZm9yKHZhciBpPTAsIGw9cmVuZGVyUHJlZml4Q2FjaGUubGVuZ3RoLCB3aWRnZXRNb2R1bGU7IGk8PWw7IGkrKyl7CisJCQl3aWRnZXRNb2R1bGUgPSAoaTxsID8gbW9kdWxlW3JlbmRlclByZWZpeENhY2hlW2ldXSA6IG1vZHVsZSk7CisJCQlpZighd2lkZ2V0TW9kdWxlKXtjb250aW51ZTt9CisJCQlmb3IodmFyIG5hbWUgaW4gd2lkZ2V0TW9kdWxlKXsKKwkJCQlpZihuYW1lLnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlV2lkZ2V0TmFtZSl7CisJCQkJCXJldHVybiB3aWRnZXRNb2R1bGVbbmFtZV07CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXZhciBmaW5kSW1wbGVtZW50YXRpb24gPSBmdW5jdGlvbihsb3dlckNhc2VXaWRnZXROYW1lLCBtb2R1bGVOYW1lKXsKKwkJLy8gbG9jYXRlIHJlZ2lzdGVyZWQgd2lkZ2V0IG1vZHVsZQorCQl2YXIgbW9kdWxlID0gZG9qby5ldmFsT2JqUGF0aChtb2R1bGVOYW1lLCBmYWxzZSk7CisJCS8vIGxvY2F0ZSBhIHdpZGdldCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgcmVnaXN0ZXJlZCBtb2R1bGUgZm9yIG91ciBjdXJyZW50IHJlbmRlcmluZyBlbnZpcm9ubWVudAorCQlyZXR1cm4gKG1vZHVsZSA/IGZpbmRJbXBsZW1lbnRhdGlvbkluTW9kdWxlKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG1vZHVsZSkgOiBudWxsKTsKKwl9CisKKwl0aGlzLmdldEltcGxlbWVudGF0aW9uTmFtZSA9IGZ1bmN0aW9uKHdpZGdldE5hbWUsIG5zKXsKKwkJLyoKKwkJICogTG9jYXRlIGFuIGltcGxlbWVudGF0aW9uIChjb25zdHJ1Y3RvcikgZm9yICd3aWRnZXROYW1lJyBpbiBuYW1lc3BhY2UgJ25zJyAKKwkJICogd2lkZ2V0TmFtZXMgYXJlIGNhc2UgSU5TRU5TSVRJVkUKKwkJICogCisJCSAqIDEuIFJldHVybiB2YWx1ZSBmcm9tIGltcGxlbWVudGF0aW9uIGNhY2hlLCBpZiBhdmFpbGFibGUsIGZvciBxdWljayB0dXJuYXJvdW5kLgorCQkgKiAyLiBMb2NhdGUgYSBuYW1lc3BhY2UgcmVnaXN0cmF0aW9uIGZvciAnbnMnCisJCSAqIDMuIElmIG5vIG5hbWVzcGFjZSBmb3VuZCwgcmVnaXN0ZXIgdGhlIGNvbnZlbnRpb25hbCBvbmUgKG5zLndpZGdldCkKKwkJICogNC4gQWxsb3cgdGhlIG5hbWVzcGFjZSByZXNvbHZlciAoaWYgYW55KSB0byBsb2FkIGEgbW9kdWxlIGZvciB0aGlzIHdpZGdldC4KKwkJICogNS4gUGVybXV0ZSB0aGUgd2lkZ2V0IG5hbWUgYW5kIGNhcGFibGUgcmVuZGVyaW5nIHByZWZpeGVzIHRvIGxvY2F0ZSwgY2FjaGUsIGFuZCByZXR1cm4gCisJCSAqICAgIGFuIGFwcHJvcHJpYXRlIHdpZGdldCBpbXBsZW1lbnRhdGlvbi4KKwkJICogNi4gSWYgbm8gaW1wbGVtZW50YXRpb24gaXMgZm91bmQsIGF0dGVtcHQgdG8gbG9hZCB0aGUgbmFtZXNwYWNlIG1hbmlmZXN0LAorCQkgKiAgICBhbmQgdGhlbiBsb29rIGFnYWluIGZvciBhbiBpbXBsZW1lbnRhdGlvbiB0byBjYWNoZSBhbmQgcmV0dXJuLgorCQkgKiA3LiBVc2UgdGhlIGRlcHJlY2F0ZWQgd2lkZ2V0UGFja2FnZXMgcmVnaXN0cmF0aW9uIHN5c3RlbSB0byBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgd2lkZ2V0CisJCSAqIDguIEZhaWwKKwkJICovCisJCXZhciBsb3dlckNhc2VXaWRnZXROYW1lID0gd2lkZ2V0TmFtZS50b0xvd2VyQ2FzZSgpOworCisJCS8vIGRlZmF1bHQgdG8gZG9qbyBuYW1lc3BhY2UKKwkJbnM9bnN8fCJkb2pvIjsKKwkJLy8gdXNlIGNhY2hlIGlmIGF2YWlsYWJsZQorCQl2YXIgaW1wcyA9IGtub3duV2lkZ2V0SW1wbGVtZW50YXRpb25zW25zXSB8fCAoa25vd25XaWRnZXRJbXBsZW1lbnRhdGlvbnNbbnNdPXt9KTsKKwkJLy9pZigha25vd25XaWRnZXRJbXBsZW1lbnRhdGlvbnNbbnNdKXtrbm93bldpZGdldEltcGxlbWVudGF0aW9uc1tuc109e307fQorCQl2YXIgaW1wbCA9IGltcHNbbG93ZXJDYXNlV2lkZ2V0TmFtZV07CisJCWlmKGltcGwpeworCQkJcmV0dXJuIGltcGw7CisJCX0KKwkJCisJCS8vIChvbmUgdGltZSkgc3RvcmUgYSBsaXN0IG9mIHRoZSByZW5kZXIgcHJlZml4ZXMgd2UgYXJlIGNhcGFibGUgb2YgcmVuZGVyaW5nCisJCWlmKCFyZW5kZXJQcmVmaXhDYWNoZS5sZW5ndGgpeworCQkJYnVpbGRQcmVmaXhDYWNoZSgpOworCQl9CisKKwkJLy8gbG9va3VwIG5hbWVzcGFjZQorCQl2YXIgbnNPYmogPSBkb2pvLm5zLmdldChucyk7CisJCWlmKCFuc09iail7CisJCQkvLyBkZWZhdWx0IHRvIDxucz4ud2lkZ2V0IGJ5IGNvbnZlbnRpb24KKwkJCWRvam8ubnMucmVnaXN0ZXIobnMsIG5zICsgJy53aWRnZXQnKTsKKwkJCW5zT2JqID0gZG9qby5ucy5nZXQobnMpOworCQl9CisJCQorCQkvLyBhbGxvdyB0aGUgbmFtZXNwYWNlIHRvIHJlc29sdmUgdGhlIHdpZGdldCBtb2R1bGUKKwkJaWYobnNPYmope25zT2JqLnJlc29sdmUod2lkZ2V0TmFtZSk7fQorCisJCS8vIGxvY2F0ZSBhIHdpZGdldCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgcmVnaXN0ZXJlZCBtb2R1bGUgZm9yIG91ciBjdXJyZW50IHJlbmRlcmluZyBlbnZpcm9ubWVudAorCQlpbXBsID0gZmluZEltcGxlbWVudGF0aW9uKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG5zT2JqLm1vZHVsZSk7CisJCWlmKGltcGwpe3JldHVybihpbXBzW2xvd2VyQ2FzZVdpZGdldE5hbWVdID0gaW1wbCl9OworCisJCS8vIHRyeSB0byBsb2FkIGEgbWFuaWZlc3QgdG8gcmVzb2x2ZSB0aGlzIGltcGxlbWVuYXRpb24KKwkJbnNPYmogPSBkb2pvLm5zLnJlcXVpcmUobnMpOworCQlpZigobnNPYmopJiYobnNPYmoucmVzb2x2ZXIpKXsKKwkJCW5zT2JqLnJlc29sdmUod2lkZ2V0TmFtZSk7CisJCQlpbXBsID0gZmluZEltcGxlbWVudGF0aW9uKGxvd2VyQ2FzZVdpZGdldE5hbWUsIG5zT2JqLm1vZHVsZSk7CisJCQlpZihpbXBsKXtyZXR1cm4oaW1wc1tsb3dlckNhc2VXaWRnZXROYW1lXSA9IGltcGwpfTsKKwkJfQorCQorCQkvLyB0aGlzIGlzIGFuIGVycm9yIGNvbmRpdGlvbiB1bmRlciBuZXcgcnVsZXMKKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLndpZGdldC5NYW5hZ2VyLmdldEltcGxlbWVudGF0aW9uTmFtZScsIAorCQkJJ0NvdWxkIG5vdCBsb2NhdGUgd2lkZ2V0IGltcGxlbWVudGF0aW9uIGZvciAiJyArIHdpZGdldE5hbWUgKyAnIiBpbiAiJyArIG5zT2JqLm1vZHVsZSArICciIHJlZ2lzdGVyZWQgdG8gbmFtZXNwYWNlICInICsgbnNPYmoubmFtZSArICciLiAnCQkJCQkJCQkJCQorCQkJKyAiRGV2ZWxvcGVycyBtdXN0IHNwZWNpZnkgY29ycmVjdCBuYW1lc3BhY2VzIGZvciBhbGwgbm9uLURvam8gd2lkZ2V0cyIsICIwLjUiKTsKKworCQkvLyBiYWNrd2FyZCBjb21wYXQ6IGlmIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGFueSBuYW1lc3BhY2UgYW5kIHRoZWlyIHdpZGdldCBpcyBub3QgaW4gZG9qby53aWRnZXQuKgorCQkvLyBzZWFyY2ggcmVnaXN0ZXJlZCB3aWRnZXQgcGFja2FnZXMgW3NpY10KKwkJLy8gbm90ZTogcmVnaXN0ZXJXaWRnZXRQYWNrYWdlIGl0c2VsZiBpcyBub3cgZGVwcmVjYXRlZCAKKwkJZm9yKHZhciBpPTA7IGk8d2lkZ2V0UGFja2FnZXMubGVuZ3RoOyBpKyspeworCQkJaW1wbCA9IGZpbmRJbXBsZW1lbnRhdGlvbihsb3dlckNhc2VXaWRnZXROYW1lLCB3aWRnZXRQYWNrYWdlc1tpXSk7CisJCQlpZihpbXBsKXtyZXR1cm4oaW1wc1tsb3dlckNhc2VXaWRnZXROYW1lXSA9IGltcGwpfTsKKwkJfQorCQkKKwkJdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9jYXRlIHdpZGdldCBpbXBsZW1lbnRhdGlvbiBmb3IgIicgKyB3aWRnZXROYW1lICsgJyIgaW4gIicgKyBuc09iai5tb2R1bGUgKyAnIiByZWdpc3RlcmVkIHRvIG5hbWVzcGFjZSAiJyArIG5zT2JqLm5hbWUgKyAnIicpOworCX0KKworCS8vIEZJWE1FOiBkb2VzIGl0IGV2ZW4gYmVsb25nIGluIHRoaXMgbW9kdWxlPworCS8vIE5PVEU6IHRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGJ5IERvbVdpZGdldC5qcyBzaW5jZSBub3QgYWxsCisJLy8gaG9zdGVudidzIHdvdWxkIGhhdmUgYW4gaW1wbGVtZW50YXRpb24uCisJLyp0aGlzLmdldFdpZGdldEZyb21QcmltaXRpdmUgPSBmdW5jdGlvbihiYXNlUmVuZGVyVHlwZSl7CisJCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQubWFuYWdlci5nZXRXaWRnZXRGcm9tUHJpbWl0aXZlIik7CisJfQorCisJdGhpcy5nZXRXaWRnZXRGcm9tRXZlbnQgPSBmdW5jdGlvbihuYXRpdmVFdnQpeworCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0Lm1hbmFnZXIuZ2V0V2lkZ2V0RnJvbUV2ZW50Iik7CisJfSovCisKKwkvLyBDYXRjaCB3aW5kb3cgcmVzaXplIGV2ZW50cyBhbmQgbm90aWZ5IHRvcCBsZXZlbCB3aWRnZXRzCisJdGhpcy5yZXNpemluZz1mYWxzZTsKKwl0aGlzLm9uV2luZG93UmVzaXplZCA9IGZ1bmN0aW9uKCl7CisJCWlmKHRoaXMucmVzaXppbmcpeworCQkJcmV0dXJuOwkvLyBkdXBsaWNhdGUgZXZlbnQKKwkJfQorCQl0cnl7CisJCQl0aGlzLnJlc2l6aW5nPXRydWU7CisJCQlmb3IodmFyIGlkIGluIHRoaXMudG9wV2lkZ2V0cyl7CisJCQkJdmFyIGNoaWxkID0gdGhpcy50b3BXaWRnZXRzW2lkXTsKKwkJCQlpZihjaGlsZC5jaGVja1NpemUgKXsKKwkJCQkJY2hpbGQuY2hlY2tTaXplKCk7CisJCQkJfQorCQkJfQorCQl9Y2F0Y2goZSl7CisJCX1maW5hbGx5eworCQkJdGhpcy5yZXNpemluZz1mYWxzZTsKKwkJfQorCX0KKwlpZih0eXBlb2Ygd2luZG93ICE9ICJ1bmRlZmluZWQiKSB7CisJCWRvam8uYWRkT25Mb2FkKHRoaXMsICdvbldpbmRvd1Jlc2l6ZWQnKTsJCQkJCQkJLy8gaW5pdGlhbCBzaXppbmcKKwkJZG9qby5ldmVudC5jb25uZWN0KHdpbmRvdywgJ29ucmVzaXplJywgdGhpcywgJ29uV2luZG93UmVzaXplZCcpOwkvLyB3aW5kb3cgcmVzaXplCisJfQorCisJLy8gRklYTUU6IHdoYXQgZWxzZT8KK307CisKKyhmdW5jdGlvbigpeworCXZhciBkdyA9IGRvam8ud2lkZ2V0OworCXZhciBkd20gPSBkdy5tYW5hZ2VyOworCXZhciBoID0gZG9qby5sYW5nLmN1cnJ5KGRvam8ubGFuZywgImhpdGNoIiwgZHdtKTsKKwl2YXIgZyA9IGZ1bmN0aW9uKG9sZE5hbWUsIG5ld05hbWUpeworCQlkd1sobmV3TmFtZXx8b2xkTmFtZSldID0gaChvbGROYW1lKTsKKwl9CisJLy8gY29weSB0aGUgbWV0aG9kcyBmcm9tIHRoZSBkZWZhdWx0IG1hbmFnZXIgKHRoaXMpIHRvIHRoZSB3aWRnZXQgbmFtZXNwYWNlCisJZygiYWRkIiwgImFkZFdpZGdldCIpOworCWcoImRlc3Ryb3lBbGwiLCAiZGVzdHJveUFsbFdpZGdldHMiKTsKKwlnKCJyZW1vdmUiLCAicmVtb3ZlV2lkZ2V0Iik7CisJZygicmVtb3ZlQnlJZCIsICJyZW1vdmVXaWRnZXRCeUlkIik7CisJZygiZ2V0V2lkZ2V0QnlJZCIpOworCWcoImdldFdpZGdldEJ5SWQiLCAiYnlJZCIpOworCWcoImdldFdpZGdldHNCeVR5cGUiKTsKKwlnKCJnZXRXaWRnZXRzQnlGaWx0ZXIiKTsKKwlnKCJnZXRXaWRnZXRzQnlUeXBlIiwgImJ5VHlwZSIpOworCWcoImdldFdpZGdldHNCeUZpbHRlciIsICJieUZpbHRlciIpOworCWcoImdldFdpZGdldEJ5Tm9kZSIsICJieU5vZGUiKTsKKwlkdy5hbGwgPSBmdW5jdGlvbihuKXsKKwkJdmFyIHdpZGdldHMgPSBkd20uZ2V0QWxsV2lkZ2V0cy5hcHBseShkd20sIGFyZ3VtZW50cyk7CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisJCQlyZXR1cm4gd2lkZ2V0c1tuXTsKKwkJfQorCQlyZXR1cm4gd2lkZ2V0czsKKwl9CisJZygicmVnaXN0ZXJXaWRnZXRQYWNrYWdlIik7CisJZygiZ2V0SW1wbGVtZW50YXRpb24iLCAiZ2V0V2lkZ2V0SW1wbGVtZW50YXRpb24iKTsKKwlnKCJnZXRJbXBsZW1lbnRhdGlvbk5hbWUiLCAiZ2V0V2lkZ2V0SW1wbGVtZW50YXRpb25OYW1lIik7CisKKwlkdy53aWRnZXRzID0gZHdtLndpZGdldHM7CisJZHcud2lkZ2V0SWRzID0gZHdtLndpZGdldElkczsKKwlkdy5yb290ID0gZHdtLnJvb3Q7Cit9KSgpOworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwljb21tb246IFtbImRvam8udXJpLlVyaSIsIGZhbHNlLCBmYWxzZV1dCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby51cmkuKiIpOworCitkb2pvLnByb3ZpZGUoImRvam8uYTExeSIpOworCisKKworCitkb2pvLmExMXkgPSB7CisJLy8gaW1nUGF0aDogU3RyaW5nIHBhdGggdG8gdGhlIHRlc3QgaW1hZ2UgZm9yIGRldGVybWluaW5nIGlmIGltYWdlcyBhcmUgZGlzcGxheWVkIG9yIG5vdAorCS8vIGRvQWNjZXNzaWJsZUNoZWNrOiBCb29sZWFuIGlmIHRydWUgd2lsbCBwZXJmb3JtIGNoZWNrIGZvciBuZWVkIHRvIGNyZWF0ZSBhY2Nlc3NpYmxlIHdpZGdldHMKKwkvLyBhY2Nlc3NpYmxlOiBCb29sZWFuIHVuaW5pdGlhbGl6ZWQgd2hlbiBudWxsIChhY2Nlc3NpYmxlIGNoZWNrIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQpCisJLy8gICBpZiB0cnVlIGdlbmVyYXRlIGFjY2Vzc2libGUgd2lkZ2V0cworCWltZ1BhdGg6ZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzIiksCisJZG9BY2Nlc3NpYmxlQ2hlY2s6IHRydWUsCisJYWNjZXNzaWJsZTogbnVsbCwJCQorCisJY2hlY2tBY2Nlc3NpYmxlOiBmdW5jdGlvbigpeyAKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJcGVyZm9ybSBjaGVjayBmb3IgYWNjZXNzaWJpbGl0eSBpZiBhY2Nlc3NpYmlsaXR5IGNoZWNraW5nIGlzIHR1cm5lZAorCS8vCQlvbiBhbmQgdGhlIGFjY2Vzc2liaWxpdHkgdGVzdCBoYXMgbm90IGJlZW4gcGVyZm9ybWVkIHlldAorCQlpZih0aGlzLmFjY2Vzc2libGUgPT09IG51bGwpeyAKKwkJCXRoaXMuYWNjZXNzaWJsZSA9IGZhbHNlOyAvL2RlZmF1bHQKKwkJCWlmKHRoaXMuZG9BY2Nlc3NpYmxlQ2hlY2sgPT0gdHJ1ZSl7IAorCQkJCXRoaXMuYWNjZXNzaWJsZSA9IHRoaXMudGVzdEFjY2Vzc2libGUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5hY2Nlc3NpYmxlOyAvKiBCb29sZWFuICovCisJfSwKKwkKKwl0ZXN0QWNjZXNzaWJsZTogZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5OiAKKwkvLwkJQWx3YXlzIHBlcmZvcm0gdGhlIGFjY2Vzc2liaWxpdHkgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIGhpZ2ggCisJLy8JCWNvbnRyYXN0IG1vZGUgaXMgb24gb3IgZGlzcGxheSBvZiBpbWFnZXMgYXJlIHR1cm5lZCBvZmYuIEN1cnJlbnRseSBvbmx5IGNoZWNrcyAKKwkvLwkJaW4gSUUgYW5kIE1vemlsbGEuIAorCQl0aGlzLmFjY2Vzc2libGUgPSBmYWxzZTsgLy9kZWZhdWx0CisJCWlmIChkb2pvLnJlbmRlci5odG1sLmllIHx8IGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSl7CisJCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkvL2Rpdi5zdHlsZS5jb2xvcj0icmdiKDE1MywyMDQsMjA0KSI7CisJCQlkaXYuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybChcIiIgKyB0aGlzLmltZ1BhdGggKyAiL3RhYl9jbG9zZS5naWZcIikiOworCQkJLy8gbXVzdCBhZGQgdG8gaGllcmFyY2h5IGJlZm9yZSBjYW4gdmlldyBjdXJyZW50U3R5bGUgYmVsb3cKKwkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKGRpdik7CisJCQkvLyBpbiBGRiBhbmQgSUUgdGhlIHZhbHVlIGZvciB0aGUgY3VycmVudCBiYWNrZ3JvdW5kIHN0eWxlIG9mIHRoZSBhZGRlZCBkaXYKKwkJCS8vIHdpbGwgYmUgIm5vbmUiIGluIGhpZ2ggY29udHJhc3QgbW9kZQorCQkJLy8gaW4gRkYgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVybChpbnZhbGlkLXVybDopIHdoZW4gcnVubmluZyBvdmVyIGh0dHAgCisJCQl2YXIgYmtJbWcgPSBudWxsOworCQkJaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICApIHsKKwkJCQl2YXIgY1N0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYsICIiKTsgCisJCQkJYmtJbWcgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiYmFja2dyb3VuZC1pbWFnZSIpOworCQkJfWVsc2V7CisJCQkJYmtJbWcgPSBkaXYuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZTsKKwkJCX0KKwkJCXZhciBiVXNlSW1nRWxlbSA9IGZhbHNlOworCQkJaWYgKGJrSW1nICE9IG51bGwgJiYgKGJrSW1nID09ICJub25lIiB8fCBia0ltZyA9PSAidXJsKGludmFsaWQtdXJsOikiICkpIHsKKwkJCQl0aGlzLmFjY2Vzc2libGUgPSB0cnVlOworCQkJfQorCQkJLyoKKwkJCWlmKHRoaXMuYWNjZXNzaWJsZSA9PSBmYWxzZSAmJiBkb2N1bWVudC5pbWFnZXMpeworCQkJCS8vIHRlc3QgaWYgaW1hZ2VzIGFyZSBvZmYgaW4gSUUKKwkJCQl2YXIgdGVzdEltZyA9IG5ldyBJbWFnZSgpOworCQkJCWlmKHRlc3RJbWcuZmlsZVNpemUpIHsKKwkJCQkJdGVzdEltZy5zcmMgPSB0aGlzLmltZ1BhdGggKyAiL3RhYl9jbG9zZS5naWYiOworCQkJCQlpZih0ZXN0SW1nLmZpbGVTaXplIDwgMCl7IAorCQkJCQkJdGhpcy5hY2Nlc3NpYmxlID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0JCisJCQl9Ki8KKwkJCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKGRpdik7CisJCX0KKwkJcmV0dXJuIHRoaXMuYWNjZXNzaWJsZTsgLyogQm9vbGVhbiAqLworCX0sCisJCisJc2V0Q2hlY2tBY2Nlc3NpYmxlOiBmdW5jdGlvbigvKiBCb29sZWFuICovIGJUZXN0KXsgCisJLy8gc3VtbWFyeTogCisJLy8JCVNldCB3aGV0aGVyIG9yIG5vdCB0byBjaGVjayBmb3IgYWNjZXNzaWJpbGl0eSBtb2RlLiAgRGVmYXVsdCB2YWx1ZQorCS8vCQlvZiBtb2R1bGUgaXMgdHJ1ZSAtIHBlcmZvcm0gY2hlY2sgZm9yIGFjY2Vzc2liaWxpdHkgbW9kZXMuIAorCS8vCQliVGVzdDogQm9vbGVhbiAtIHRydWUgdG8gY2hlY2s7IGZhbHNlIHRvIHR1cm4gb2ZmIGNoZWNraW5nCisJCXRoaXMuZG9BY2Nlc3NpYmxlQ2hlY2sgPSBiVGVzdDsKKwl9LAorCisJc2V0QWNjZXNzaWJsZU1vZGU6IGZ1bmN0aW9uKCl7CisJLy8gc3VtbWFyeToKKwkvLwkJcGVyZm9ybSB0aGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgc2V0cyB0aGUgY29ycmVjdCBtb2RlIHRvIGxvYWQgCisJLy8JCWExMXkgd2lkZ2V0cy4gT25seSBydW5zIGlmIHRlc3QgZm9yIGFjY2Vzc2lpYmxpdHkgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCB5ZXQuIAorCS8vCQlDYWxsIHRlc3RBY2Nlc3NpYmxlKCkgdG8gZm9yY2UgdGhlIHRlc3QuCisJCWlmICh0aGlzLmFjY2Vzc2libGUgPT09IG51bGwpeworCQkJaWYgKHRoaXMuY2hlY2tBY2Nlc3NpYmxlKCkpeworCQkJCWRvam8ucmVuZGVyLmh0bWwucHJlZml4ZXMudW5zaGlmdCgiYTExeSIpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmFjY2Vzc2libGU7IC8qIEJvb2xlYW4gKi8KKwl9Cit9OworCisvL2Rvam8uaG9zdGVudi5tb2R1bGVzTG9hZGVkTGlzdGVuZXJzLnVuc2hpZnQoZnVuY3Rpb24oKSB7IGRvam8uYTExeS5zZXRBY2Nlc3NpYmxlTW9kZSgpOyB9KTsKKy8vZG9qby5ldmVudC5jb25uZWN0KCJiZWZvcmUiLCBkb2pvLmhvc3RlbnYsICJtYWtlV2lkZ2V0cyIsIGRvam8uYTExeSwgInNldEFjY2Vzc2libGVNb2RlIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuV2lkZ2V0Iik7CisKKworCisKKworCisKKworCisKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuV2lkZ2V0IiwgbnVsbCwKKwlmdW5jdGlvbigpeworCQkvLyB0aGVzZSBwcm9wZXJ0aWVzIGFyZW4ndCBwcmltaXRpdmVzIGFuZCBuZWVkIHRvIGJlIGNyZWF0ZWQgb24gYSBwZXItaXRlbQorCQkvLyBiYXNpcy4KKworCQkvLyBjaGlsZHJlbjogQXJyYXkKKwkJLy8JCWEgbGlzdCBvZiBhbGwgb2YgdGhlIHdpZGdldHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYXMgY2hpbGRyZW4gb2YKKwkJLy8JCXRoaXMgY29tcG9uZW50LiBTaG91bGQgb25seSBoYXZlIHZhbHVlcyBpZiBpc0NvbnRhaW5lciBpcyB0cnVlLgorCQl0aGlzLmNoaWxkcmVuID0gW107CisKKwkJLy8gZXh0cmFBcmdzOiBPYmplY3QKKwkJLy8JCWEgbWFwIG9mIHByb3BlcnRpZXMgd2hpY2ggdGhlIHdpZGdldCBzeXN0ZW0gdHJpZWQgdG8gYXNzaWduIGZyb20KKwkJLy8JCXVzZXIgaW5wdXQgYnV0IGRpZCBub3QgY29ycmVzcG9uZCB0byBhbnkgb2YgdGhlIHByb3BlcnRpZXMgc2V0IG9uCisJCS8vCQl0aGUgY2xhc3MgcHJvdG90eXBlLiBUaGVzZSBuYW1lcyB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGluIGFsbAorCQkvLwkJbG93ZXItY2FzZSBmb3JtIGluIHRoaXMgbWFwCisJCXRoaXMuZXh0cmFBcmdzID0ge307CisJfSwKK3sKKwkvLyBwYXJlbnQ6IFdpZGdldAorCS8vCQl0aGUgcGFyZW50IG9mIHRoaXMgd2lkZ2V0CisJcGFyZW50OiBudWxsLCAKKworCS8vIGlzVG9wTGV2ZWw6IEJvb2xlYW4KKwkvLwkJc2hvdWxkIHRoaXMgd2lkZ2V0IGVhdCBhbGwgZXZlbnRzIHRoYXQgYnViYmxlIHVwIHRvIGl0PworCS8vCQlvYnZpb3VzbHksIHRvcC1sZXZlbCBhbmQgbW9kYWwgd2lkZ2V0cyBzaG91bGQgc2V0IHRoZXNlIGFwcHJvcHJpYXRlbHkKKwlpc1RvcExldmVsOiAgZmFsc2UsIAorCisJLy8gZGlzYWJsZWQ6IEJvb2xlYW4KKwkvLwkJc2hvdWxkIHRoaXMgd2lkZ2V0IHJlc3BvbmQgdG8gdXNlciBpbnB1dD8KKwkvLwkJaW4gbWFya3VwLCB0aGlzIGlzIHNwZWNpZmllZCBhcyAiZGlzYWJsZWQ9J2Rpc2FibGVkJyIsIG9yIGp1c3QgImRpc2FibGVkIgorCWRpc2FibGVkOiBmYWxzZSwKKworCS8vIGlzQ29udGFpbmVyOiBCb29sZWFuCisJLy8JCWNhbiB0aGlzIHdpZGdldCBjb250YWluIG90aGVyIHdpZGdldHM/CisJaXNDb250YWluZXI6IGZhbHNlLCAKKworCS8vIHdpZGdldElkOiBTdHJpbmcKKwkvLwkJYSB1bmlxdWUsIG9wYXF1ZSBJRCBzdHJpbmcgdGhhdCBjYW4gYmUgYXNzaWduZWQgYnkgdXNlcnMgb3IgYnkgdGhlCisJLy8JCXN5c3RlbS4gSWYgdGhlIGRldmVsb3BlciBwYXNzZXMgYW4gSUQgd2hpY2ggaXMga25vd24gbm90IHRvIGJlCisJLy8JCXVuaXF1ZSwgdGhlIHNwZWNpZmllZCBJRCBpcyBpZ25vcmVkIGFuZCB0aGUgc3lzdGVtLWdlbmVyYXRlZCBJRCBpcworCS8vCQl1c2VkIGluc3RlYWQuCisJd2lkZ2V0SWQ6ICIiLAorCisJLy8gd2lkZ2V0VHlwZTogU3RyaW5nCisJLy8JCXVzZWQgZm9yIGJ1aWxkaW5nIGdlbmVyaWMgd2lkZ2V0cworCXdpZGdldFR5cGU6ICJXaWRnZXQiLAorCisJLy8gbnM6IFN0cmluZworCS8vCQlkZWZhdWx0cyB0byAnZG9qbycuICAibmFtZXNwYWNlIiBpcyBhIHJlc2VydmVkIHdvcmQgaW4gSmF2YVNjcmlwdCwgc28gd2UgYWJicmV2aWF0ZQorCW5zOiAiZG9qbyIsCisKKwlnZXROYW1lc3BhY2VkVHlwZTogZnVuY3Rpb24oKXsgCisJCS8vIHN1bW1hcnk6CisJCS8vCQlnZXQgdGhlICJmdWxsIiBuYW1lIG9mIHRoZSB3aWRnZXQuIElmIHRoZSB3aWRnZXQgY29tZXMgZnJvbSB0aGUKKwkJLy8JCSJkb2pvIiBuYW1lc3BhY2UgYW5kIGlzIGEgQnV0dG9uLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwKKwkJLy8JCXJldHVybiAiZG9qbzpidXR0b24iLCBhbGwgbG93ZXItY2FzZQorCQlyZXR1cm4gKHRoaXMubnMgPyB0aGlzLm5zICsgIjoiICsgdGhpcy53aWRnZXRUeXBlIDogdGhpcy53aWRnZXRUeXBlKS50b0xvd2VyQ2FzZSgpOyAvLyBTdHJpbmcKKwl9LAorCQorCXRvU3RyaW5nOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJcmV0dXJucyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHdpZGdldC4gV2hlbiBhIHdpZGdldCBpcworCQkvLwkJY2FzdCB0byBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZQorCQkvLwkJb3V0cHV0LiBDdXJyZW50bHksIGl0IGRvZXMgbm90IGltcGxlbWVudCBhbnkgc29ydCBvZiByZXZlcnNhYmxlCisJCS8vCQlzZXJpYWxpemF0aW9uLgorCQlyZXR1cm4gJ1tXaWRnZXQgJyArIHRoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKSArICcsICcgKyAodGhpcy53aWRnZXRJZCB8fCAnTk8gSUQnKSArICddJzsgLy8gU3RyaW5nCisJfSwKKworCXJlcHI6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IHJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LgorCQlyZXR1cm4gdGhpcy50b1N0cmluZygpOyAvLyBTdHJpbmcKKwl9LAorCisJZW5hYmxlOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJZW5hYmxlcyB0aGUgd2lkZ2V0LCB1c3VhbGx5IGludm9sdmluZyB1bm1hc2tpbmcgaW5wdXRzIGFuZAorCQkvLwkJdHVybmluZyBvbiBldmVudCBoYW5kbGVycy4gTm90IGltcGxlbWVudGVkIGhlcmUuCisJCXRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKKwl9LAorCisJZGlzYWJsZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRpc2FibGVzIHRoZSB3aWRnZXQsIHVzdWFsbHkgaW52b2x2ZXMgbWFza2luZyBpbnB1dHMgYW5kCisJCS8vCQl1bnNldHRpbmcgZXZlbnQgaGFuZGxlcnMuIE5vdCBpbXBsZW1lbnRlZCBoZXJlLgorCQl0aGlzLmRpc2FibGVkID0gdHJ1ZTsKKwl9LAorCisJLy8gVE9ETzoKKwkvLwkxKSB0aGlzIHdvdWxkIGJlIGJldHRlciBpbiBIdG1sV2lkZ2V0IHJhdGhlciB0aGFuIGhlcmU/CisJLy8JMikgc2luY2UgbWFueSB3aWRnZXRzIGRvbid0IGNhcmUgaWYgdGhleSd2ZSBiZWVuIHJlc2l6ZWQsIG1heWJlIHRoaXMgc2hvdWxkIGJlIGEgbWl4aW4/CisJb25SZXNpemVkOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJQSBzaWduYWwgdGhhdCB3aWRnZXRzIHdpbGwgY2FsbCB3aGVuIHRoZXkgaGF2ZSBiZWVuIHJlc2l6ZWQuCisJCS8vCQlDYW4gYmUgY29ubmVjdGVkIHRvIGZvciBkZXRlcm1pbmluZyBpZiBhIGxheW91dCBuZWVkcyB0byBiZQorCQkvLwkJcmVmbG93ZWQuIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gZG8gc3BlY2lhbAorCQkvLwkJcHJvY2Vzc2luZywgdGhlbiBjYWxsIHRoaXMubm90aWZ5Q2hpbGRyZW5PZlJlc2l6ZSgpIHRvIG5vdGlmeQorCQkvLwkJY2hpbGRyZW4gb2YgcmVzaXplLgorCQl0aGlzLm5vdGlmeUNoaWxkcmVuT2ZSZXNpemUoKTsKKwl9LAorCQorCW5vdGlmeUNoaWxkcmVuT2ZSZXNpemU6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGRpc3BhdGNoZXMgcmVzaXplZCBldmVudHMgdG8gYWxsIGNoaWxkcmVuIG9mIHRoaXMgd2lkZ2V0CisJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspeworCQkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJCS8vZG9qby5kZWJ1Zyh0aGlzLndpZGdldElkICsgIiByZXNpemluZyBjaGlsZCAiICsgY2hpbGQud2lkZ2V0SWQpOworCQkJaWYoIGNoaWxkLm9uUmVzaXplZCApeworCQkJCWNoaWxkLm9uUmVzaXplZCgpOworCQkJfQorCQl9CisJfSwKKworCWNyZWF0ZTogZnVuY3Rpb24oYXJncywgZnJhZ21lbnQsIHBhcmVudCwgbnMpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJJ2NyZWF0ZScgbWFuYWdlcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFydCBvZiB0aGUgd2lkZ2V0CisJCS8vCQlsaWZlY3ljbGUuIEl0J3MgY2FsbGVkIGltcGxpY2l0bHkgd2hlbiBhbnkgd2lkZ2V0IGlzIGNyZWF0ZWQuCisJCS8vCQlBbGwgb3RoZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGZvciB3aWRnZXRzLCBleGNlcHQgZm9yIHRoZQorCQkvLwkJY29uc3RydWN0b3IsIGFyZSBjYWxsZWQgYXMgYSByZXN1bHQgb2YgJ2NyZWF0ZScgYmVpbmcgZmlyZWQuCisJCS8vIGFyZ3M6IE9iamVjdAorCQkvLwkJYSBub3JtYWxpemVkIHZpZXcgb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCB0aGUgd2lkZ2V0IHNob3VsZCB0YWtlCisJCS8vIGZyYWdtZW50OiBPYmplY3QKKwkJLy8JCWlmIHRoZSB3aWRnZXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkIGZyb20gbWFya3VwLCB0aGlzIG9iamVjdCAKKwkJLy8gcGFyZW50OiBXaWRnZXQ/CisJCS8vCQl0aGUgd2lkZ2V0LCBpZiBhbnksIHRoYXQgdGhpcyB3aWRnZXQgd2lsbCBiZSB0aGUgY2hpbGQgb2YuICBJZgorCQkvLwkJbm9uZSBpcyBwYXNzZWQsIHRoZSBnbG9iYWwgZGVmYXVsdCB3aWRnZXQgaXMgdXNlZC4KKwkJLy8gbnM6IFN0cmluZz8KKwkJLy8JCXdoYXQgbmFtZXNwYWNlIHRoZSB3aWRnZXQgYmVsb25ncyB0bworCQkvLyBkZXNjcmlwdGlvbjoKKwkJLy8JCXRvIHVuZGVyc3RhbmQgdGhlIHByb2Nlc3MgYnkgd2hpY2ggd2lkZ2V0cyBhcmUgaW5zdGFudGlhdGVkLCBpdAorCQkvLwkJaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIG1ldGhvZHMgJ2NyZWF0ZScgY2FsbHMgYW5kCisJCS8vCQl3aGljaCBvZiB0aGVtIHlvdSdsbCB3YW50IHRvIG92ZXItcmlkZS4gT2YgY291cnNlLCBhZHZlbnR1cm91cworCQkvLwkJZGV2ZWxvcGVycyBjb3VsZCBvdmVyLXJpZGUgJ2NyZWF0ZScgZW50aXJlbHksIGJ1dCB0aGlzIHNob3VsZAorCQkvLwkJb25seSBiZSBkb25lIGFzIGEgbGFzdCByZXNvcnQuCisJCS8vCisJCS8vCQlCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkLCBpbiB0aGUgb3JkZXIKKwkJLy8JCXRoZXkgYXJlIGZpcmVkLCBhbG9uZyB3aXRoIG5vdGVzIGFib3V0IHdoYXQgdGhleSBkbyBhbmQgaWYvd2hlbgorCQkvLwkJeW91IHNob3VsZCBvdmVyLXJpZGUgdGhlbSBpbiB5b3VyIHdpZGdldDoKKwkJLy8JCQkKKwkJLy8JCQltaXhJblByb3BlcnRpZXM6CisJCS8vCQkJCXRha2VzIHRoZSBhcmdzIGFuZCBkb2VzIGxpZ2h0d2VpZ2h0IHR5cGUgaW50cm9zcGVjdGlvbgorCQkvLwkJCQlvbiBwcmUtZXhpc3Rpbmcgb2JqZWN0IHByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSB3aWRnZXQKKwkJLy8JCQkJdmFsdWVzIGJ5IGNhc3RpbmcgdGhlIHZhbHVlcyB0aGF0IGFyZSBwYXNzZWQgaW4gYXJncworCQkvLwkJCXBvc3RNaXhJblByb3BlcnRpZXM6CisJCS8vCQkJCWEgc3R1YiBmdW5jdGlvbiB0aGF0IHlvdSBjYW4gb3Zlci1yaWRlIHRvIG1vZGlmeQorCQkvLwkJCQl2YXJpYWJsZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIG5haXZlbHkgYXNzaWduZWQgYnkKKwkJLy8JCQkJbWl4SW5Qcm9wZXJ0aWVzCisJCS8vCQkJIyB3aWRnZXQgaXMgYWRkZWQgdG8gbWFuYWdlciBvYmplY3QgaGVyZQorCQkvLwkJCWJ1aWxkUmVuZGVyaW5nCisJCS8vCQkJCXN1YmNsYXNzZXMgdXNlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBhbGwgVUkgaW5pdGlhbGl6YXRpb24KKwkJLy8JCQlpbml0aWFsaXplOgorCQkvLwkJCQlhIHN0dWIgZnVuY3Rpb24gdGhhdCB5b3UgY2FuIG92ZXItcmlkZS4KKwkJLy8JCQlwb3N0SW5pdGlhbGl6ZToKKwkJLy8JCQkJYSBzdHViIGZ1bmN0aW9uIHRoYXQgeW91IGNhbiBvdmVyLXJpZGUuCisJCS8vCQkJcG9zdENyZWF0ZQorCQkvLwkJCQlhIHN0dWIgZnVuY3Rpb24gdGhhdCB5b3UgY2FuIG92ZXItcmlkZSB0byBtb2RpZnkgdGFrZQorCQkvLwkJCQlhY3Rpb25zIG9uY2UgdGhlIHdpZGdldCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIFVJCisJCS8vCisJCS8vCQlhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGFyZQorCQkvLwkJcGFzc2VkIHRvICdjcmVhdGUnCisKKwkJLy9kb2pvLnByb2ZpbGUuc3RhcnQodGhpcy53aWRnZXRUeXBlICsgIiBjcmVhdGUiKTsKKwkJaWYobnMpeworCQkJdGhpcy5ucyA9IG5zOworCQl9CisJCS8vIGRvam8uZGVidWcodGhpcy53aWRnZXRUeXBlLCAiY3JlYXRlIik7CisJCS8vZG9qby5wcm9maWxlLnN0YXJ0KHRoaXMud2lkZ2V0VHlwZSArICIgc2F0aXNmeVByb3BlcnR5U2V0cyIpOworCQl0aGlzLnNhdGlzZnlQcm9wZXJ0eVNldHMoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJCS8vZG9qby5wcm9maWxlLmVuZCh0aGlzLndpZGdldFR5cGUgKyAiIHNhdGlzZnlQcm9wZXJ0eVNldHMiKTsKKwkJLy8gZG9qby5kZWJ1Zyh0aGlzLndpZGdldFR5cGUsICItPiBtaXhJblByb3BlcnRpZXMiKTsKKwkJLy9kb2pvLnByb2ZpbGUuc3RhcnQodGhpcy53aWRnZXRUeXBlICsgIiBtaXhJblByb3BlcnRpZXMiKTsKKwkJdGhpcy5taXhJblByb3BlcnRpZXMoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJCS8vZG9qby5wcm9maWxlLmVuZCh0aGlzLndpZGdldFR5cGUgKyAiIG1peEluUHJvcGVydGllcyIpOworCQkvLyBkb2pvLmRlYnVnKHRoaXMud2lkZ2V0VHlwZSwgIi0+IHBvc3RNaXhJblByb3BlcnRpZXMiKTsKKwkJLy9kb2pvLnByb2ZpbGUuc3RhcnQodGhpcy53aWRnZXRUeXBlICsgIiBwb3N0TWl4SW5Qcm9wZXJ0aWVzIik7CisJCXRoaXMucG9zdE1peEluUHJvcGVydGllcyhhcmdzLCBmcmFnbWVudCwgcGFyZW50KTsKKwkJLy9kb2pvLnByb2ZpbGUuZW5kKHRoaXMud2lkZ2V0VHlwZSArICIgcG9zdE1peEluUHJvcGVydGllcyIpOworCQkvLyBkb2pvLmRlYnVnKHRoaXMud2lkZ2V0VHlwZSwgIi0+IGRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkIik7CisJCWRvam8ud2lkZ2V0Lm1hbmFnZXIuYWRkKHRoaXMpOworCQkvLyBkb2pvLmRlYnVnKHRoaXMud2lkZ2V0VHlwZSwgIi0+IGJ1aWxkUmVuZGVyaW5nIik7CisJCS8vZG9qby5wcm9maWxlLnN0YXJ0KHRoaXMud2lkZ2V0VHlwZSArICIgYnVpbGRSZW5kZXJpbmciKTsKKwkJdGhpcy5idWlsZFJlbmRlcmluZyhhcmdzLCBmcmFnbWVudCwgcGFyZW50KTsKKwkJLy9kb2pvLnByb2ZpbGUuZW5kKHRoaXMud2lkZ2V0VHlwZSArICIgYnVpbGRSZW5kZXJpbmciKTsKKwkJLy8gZG9qby5kZWJ1Zyh0aGlzLndpZGdldFR5cGUsICItPiBpbml0aWFsaXplIik7CisJCS8vZG9qby5wcm9maWxlLnN0YXJ0KHRoaXMud2lkZ2V0VHlwZSArICIgaW5pdGlhbGl6ZSIpOworCQl0aGlzLmluaXRpYWxpemUoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJCS8vZG9qby5wcm9maWxlLmVuZCh0aGlzLndpZGdldFR5cGUgKyAiIGluaXRpYWxpemUiKTsKKwkJLy8gZG9qby5kZWJ1Zyh0aGlzLndpZGdldFR5cGUsICItPiBwb3N0SW5pdGlhbGl6ZSIpOworCQkvLyBwb3N0aW5pdGlhbGl6ZSBpbmNsdWRlcyBzdWJjb21wb25lbnQgY3JlYXRpb24KKwkJLy8gcHJvZmlsZSBpcyBwdXQgZGlyZWN0bHkgdG8gZnVuY3Rpb24KKwkJdGhpcy5wb3N0SW5pdGlhbGl6ZShhcmdzLCBmcmFnbWVudCwgcGFyZW50KTsKKwkJLy8gZG9qby5kZWJ1Zyh0aGlzLndpZGdldFR5cGUsICItPiBwb3N0Q3JlYXRlIik7CisJCS8vZG9qby5wcm9maWxlLnN0YXJ0KHRoaXMud2lkZ2V0VHlwZSArICIgcG9zdENyZWF0ZSIpOworCQl0aGlzLnBvc3RDcmVhdGUoYXJncywgZnJhZ21lbnQsIHBhcmVudCk7CisJCS8vZG9qby5wcm9maWxlLmVuZCh0aGlzLndpZGdldFR5cGUgKyAiIHBvc3RDcmVhdGUiKTsKKwkJLy8gZG9qby5kZWJ1Zyh0aGlzLndpZGdldFR5cGUsICJkb25lISIpOworCQkKKwkJLy9kb2pvLnByb2ZpbGUuZW5kKHRoaXMud2lkZ2V0VHlwZSArICIgY3JlYXRlIik7CisJCQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZGVzdHJveTogZnVuY3Rpb24oZmluYWxpemUpeworCQkvLyBzdW1tYXJ5OgorCQkvLyAJCURlc3Ryb3kgdGhpcyB3aWRnZXQgYW5kIGl0J3MgZGVzY2VuZGFudHMuIFRoaXMgaXMgdGhlIGdlbmVyaWMKKwkJLy8gCQkiZGVzdHJ1Y3RvciIgZnVuY3Rpb24gdGhhdCBhbGwgd2lkZ2V0IHVzZXJzIHNob3VsZCBjYWxsIHRvCisJCS8vIAkJY2xlYWx5IGRpc2NhcmQgd2l0aCBhIHdpZGdldC4gT25jZSBhIHdpZGdldCBpcyBkZXN0cm95ZWQsIGl0J3MKKwkJLy8gCQlyZW1vdmVkIGZyb20gdGhlIG1hbmFnZXIgb2JqZWN0LgorCQkvLyBmaW5hbGl6ZTogQm9vbGVhbgorCQkvLwkJaXMgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgcGFydCBvZiBnbG9iYWwgZW52aXJvbm1lbnQKKwkJLy8JCXRlYXItZG93bj8KKworCQkvLyBGSVhNRTogdGhpcyBpcyB3b2VmdWxseSBpbmNvbXBsZXRlCisJCWlmKHRoaXMucGFyZW50KXsKKwkJCXRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOworCQl9CisJCXRoaXMuZGVzdHJveUNoaWxkcmVuKCk7CisJCXRoaXMudW5pbml0aWFsaXplKCk7CisJCXRoaXMuZGVzdHJveVJlbmRlcmluZyhmaW5hbGl6ZSk7CisJCWRvam8ud2lkZ2V0Lm1hbmFnZXIucmVtb3ZlQnlJZCh0aGlzLndpZGdldElkKTsKKwl9LAorCisJZGVzdHJveUNoaWxkcmVuOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJUmVjdXJzaXZlbHkgZGVzdHJveSB0aGUgY2hpbGRyZW4gb2YgdGhpcyB3aWRnZXQgYW5kIHRoZWlyCisJCS8vCQlkZXNjZW5kZW50cy4KKwkJdmFyIHdpZGdldDsKKwkJdmFyIGk9MDsKKwkJd2hpbGUodGhpcy5jaGlsZHJlbi5sZW5ndGggPiBpKXsKKwkJCXdpZGdldCA9IHRoaXMuY2hpbGRyZW5baV07CisJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgZG9qby53aWRnZXQuV2lkZ2V0KSB7IC8vIGZpbmQgZmlyc3Qgd2lkZ2V0CisJCQkJdGhpcy5yZW1vdmVDaGlsZCh3aWRnZXQpOworCQkJCXdpZGdldC5kZXN0cm95KCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWkrKzsgLy8gc2tpcCBkYXRhIG9iamVjdAorCQl9CisJCQkJCisJfSwKKworCWdldENoaWxkcmVuT2ZUeXBlOiBmdW5jdGlvbigvKlN0cmluZyovdHlwZSwgcmVjdXJzZSl7CisJCS8vIHN1bW1hcnk6IAorCQkvLwkJcmV0dXJuIGFuIGFycmF5IG9mIGRlc2NlbmRhbnQgd2lkZ2V0cyB3aG8gbWF0Y2ggdGhlIHBhc3NlZCB0eXBlCisJCS8vIHJlY3Vyc2U6IEJvb2xlYW4KKwkJLy8JCXNob3VsZCB3ZSB0cnkgdG8gZ2V0IGFsbCBkZXNjZW5kYW50cyB0aGF0IG1hdGNoPyBEZWZhdWx0cyB0bworCQkvLwkJZmFsc2UuCisJCXZhciByZXQgPSBbXTsKKwkJdmFyIGlzRnVuYyA9IGRvam8ubGFuZy5pc0Z1bmN0aW9uKHR5cGUpOworCQlpZighaXNGdW5jKXsKKwkJCXR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7CisJCX0KKwkJZm9yKHZhciB4PTA7IHg8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IHgrKyl7CisJCQlpZihpc0Z1bmMpeworCQkJCWlmKHRoaXMuY2hpbGRyZW5beF0gaW5zdGFuY2VvZiB0eXBlKXsKKwkJCQkJcmV0LnB1c2godGhpcy5jaGlsZHJlblt4XSk7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJaWYodGhpcy5jaGlsZHJlblt4XS53aWRnZXRUeXBlLnRvTG93ZXJDYXNlKCkgPT0gdHlwZSl7CisJCQkJCXJldC5wdXNoKHRoaXMuY2hpbGRyZW5beF0pOworCQkJCX0KKwkJCX0KKwkJCWlmKHJlY3Vyc2UpeworCQkJCXJldCA9IHJldC5jb25jYXQodGhpcy5jaGlsZHJlblt4XS5nZXRDaGlsZHJlbk9mVHlwZSh0eXBlLCByZWN1cnNlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldDsgLy8gQXJyYXkKKwl9LAorCisJZ2V0RGVzY2VuZGFudHM6IGZ1bmN0aW9uKCl7CisJCS8vIHJldHVybnM6IGEgZmxhdHRlbmVkIGFycmF5IG9mIGFsbCBkaXJlY3QgZGVzY2VuZGFudHMgaW5jbHVkaW5nIHNlbGYKKwkJdmFyIHJlc3VsdCA9IFtdOworCQl2YXIgc3RhY2sgPSBbdGhpc107CisJCXZhciBlbGVtOworCQl3aGlsZSAoKGVsZW0gPSBzdGFjay5wb3AoKSkpeworCQkJcmVzdWx0LnB1c2goZWxlbSk7CisJCQkvLyBhIGNoaWxkIG1heSBiZSBkYXRhIG9iamVjdCB3aXRob3V0IGNoaWxkcmVuIGZpZWxkIHNldCAobm90IHdpZGdldCkKKwkJCWlmIChlbGVtLmNoaWxkcmVuKSB7CisJCQkJZG9qby5sYW5nLmZvckVhY2goZWxlbS5jaGlsZHJlbiwgZnVuY3Rpb24oZWxlbSkgeyBzdGFjay5wdXNoKGVsZW0pOyB9KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OyAvLyBBcnJheQorCX0sCisKKworCWlzRmlyc3RDaGlsZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMgPT09IHRoaXMucGFyZW50LmNoaWxkcmVuWzBdOyAvLyBCb29sZWFuCisJfSwKKworCWlzTGFzdENoaWxkOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMgPT09IHRoaXMucGFyZW50LmNoaWxkcmVuW3RoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aC0xXTsgLy8gQm9vbGVhbgorCX0sCisKKwlzYXRpc2Z5UHJvcGVydHlTZXRzOiBmdW5jdGlvbihhcmdzKXsKKwkJLy8gc3VtbWFyeTogbm90IGltcGxlbWVudGVkIQorCisJCS8vIGRvam8ucHJvZmlsZS5zdGFydCgic2F0aXNmeVByb3BlcnR5U2V0cyIpOworCQkvLyBnZXQgdGhlIGRlZmF1bHQgcHJvcHNldHMgZm9yIG91ciBjb21wb25lbnQgdHlwZQorCQkvKgorCQl2YXIgdHlwZVByb3BTZXRzID0gW107IC8vIEZJWE1FOiBuZWVkIHRvIHB1bGwgdGhlc2UgZnJvbSBzb21ld2hlcmUhCisJCXZhciBsb2NhbFByb3BTZXRzID0gW107IC8vIHB1bGwgb3V0IHByb3BzZXRzIGZyb20gdGhlIHBhcnNlcidzIHJldHVybiBzdHJ1Y3R1cmUKKworCQkvLyBmb3IodmFyIHg9MDsgeDxhcmdzLmxlbmd0aDsgeCsrKXsKKwkJLy8gfQorCisJCWZvcih2YXIgeD0wOyB4PHR5cGVQcm9wU2V0cy5sZW5ndGg7IHgrKyl7CisJCX0KKworCQlmb3IodmFyIHg9MDsgeDxsb2NhbFByb3BTZXRzLmxlbmd0aDsgeCsrKXsKKwkJfQorCQkqLworCQkvLyBkb2pvLnByb2ZpbGUuZW5kKCJzYXRpc2Z5UHJvcGVydHlTZXRzIik7CisJCQorCQlyZXR1cm4gYXJnczsKKwl9LAorCisJbWl4SW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbihhcmdzLCAvKk9iamVjdCovZnJhZyl7CisJCS8vIHN1bW1hcnk6CisJCS8vIAkJdGFrZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBsaXN0ZWQgaW4gYXJncyBhbmQgc2V0cyB2YWx1ZXMgb2YKKwkJLy8gCQl0aGUgY3VycmVudCBvYmplY3QgYmFzZWQgb24gZXhpc3RlbmNlIG9mIHByb3BlcnRpZXMgd2l0aCB0aGUKKwkJLy8gCQlzYW1lIG5hbWUgKGNhc2UgaW5zZW5zaXRpdmUpIGFuZCB0aGUgdHlwZSBvZiB0aGUgcHJlLWV4aXN0aW5nCisJCS8vIAkJcHJvcGVydHkuIFRoaXMgaXMgYSBsaWdodHdlaWdodCBjb252ZXJzaW9uIGFuZCBpcyBub3QgaW50ZW5kZWQKKwkJLy8gCQl0byBjYXB0dXJlIGN1c3RvbSB0eXBlIHNlbWFudGljcy4KKwkJLy8gYXJnczogT2JqZWN0CisJCS8vCQlBIG1hcCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgdG8gc2V0IG9uIHRoZSBjdXJyZW50IG9iamVjdC4gQnkKKwkJLy8JCWRlZmF1bHQgaXQgaXMgYXNzdW1lZCB0aGF0IHByb3BlcnRpZXMgaW4gYXJncyBhcmUgaW4gc3RyaW5nCisJCS8vCQlmb3JtIGFuZCBuZWVkIHRvIGJlIGNvbnZlcnRlZC4gSG93ZXZlciwgaWYgdGhlcmUgaXMgYQorCQkvLwkJJ2Zhc3RNaXhJbicgcHJvcGVydHkgd2l0aCB0aGUgdmFsdWUgJ3RydWUnIGluIHRoZSBhcmdzIHBhcmFtLAorCQkvLwkJdGhpcyBhc3N1bXB0aW9uIGlzIGlnbm9yZWQgYW5kIGFsbCB2YWx1ZXMgaW4gYXJncyBhcmUgY29waWVkCisJCS8vCQlkaXJlY3RseSB0byB0aGUgY3VycmVudCBvYmplY3Qgd2l0aG91dCBhbnkgZm9ybSBvZiB0eXBlCisJCS8vCQljYXN0aW5nLgorCQkvLyBkZXNjcmlwdGlvbjoKKwkJLy8JCVRoZSBtaXgtaW4gY29kZSBhdHRlbXB0cyB0byBkbyBzb21lIHR5cGUtYXNzaWdubWVudCBiYXNlZCBvbgorCQkvLwkJUFJFLUVYSVNUSU5HIHByb3BlcnRpZXMgb2YgdGhlICJ0aGlzIiBvYmplY3QuIFdoZW4gYSBuYW1lZAorCQkvLwkJcHJvcGVydHkgb2YgYXJncyBpcyBsb2NhdGVkLCBpdCBpcyBmaXJzdCB0ZXN0ZWQgdG8gbWFrZQorCQkvLwkJc3VyZSB0aGF0IHRoZSBjdXJyZW50IG9iamVjdCBhbHJlYWR5ICJoYXMgb25lIi4gUHJvcGVydGllcworCQkvLwkJd2hpY2ggYXJlIHVuZGVmaW5lZCBpbiB0aGUgYmFzZSB3aWRnZXQgYXJlIE5PVCBzZXR0YWJsZSBoZXJlLgorCQkvLwkJVGhlIG5leHQgc3RlcCBpcyB0byB0cnkgdG8gZGV0ZXJtaW5lIHR5cGUgb2YgdGhlIHByZS1leGlzdGluZworCQkvLwkJcHJvcGVydHkuIElmIGl0J3MgYSBzdHJpbmcsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzaW1wbHkKKwkJLy8JCWFzc2lnbmVkLiBJZiBhIGZ1bmN0aW9uLCBpdCBpcyBmaXJzdCBjYXN0IHVzaW5nICJuZXcKKwkJLy8JCUZ1bmN0aW9uKCkiIGFuZCB0aGUgZXhlY3V0aW9uIHNjb3BlIG1vZGlmaWVkIHN1Y2ggdGhhdCBpdAorCQkvLwkJYWx3YXlzIGV2YWx1YXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBvYmplY3QuIFRoaXMKKwkJLy8JCWxpc3RlbmVyIGlzIHRoZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHZpYQorCQkvLwkJZG9qby5ldmVudC5jb25uZWN0KCkuIElmIGFuIEFycmF5LCB0aGUgc3lzdGVtIGF0dGVtcHRzIHRvIHNwbGl0CisJCS8vCQl0aGUgc3RyaW5nIHZhbHVlIG9uICI7IiBjaGFycywgYW5kIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBpcworCQkvLwkJYXR0ZW1wdGVkIChjb252ZXJzaW9uIG9mIGFycmF5IGVsZW1lbnRzIHRvIGEgaW50ZWdlcnMsIGZvcgorCQkvLwkJaW5zdGFuY2UpLiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gT2JqZWN0CisJCS8vCQkodGVzdE9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSwgdGhlIHByb3BlcnR5IGlzIHNwbGl0IGZpcnN0CisJCS8vCQlvbiAiOyIgY2hhcnMsIHNlY29uZGx5IG9uICI6IiBjaGFycywgYW5kIHRoZSByZXN1bHRpbmcKKwkJLy8JCWtleS92YWx1ZSBwYWlycyBhcmUgYXNzaWduZWQgdG8gYW4gb2JqZWN0IGluIGEgbWFwIHN0eWxlLiBUaGUKKwkJLy8JCW9udXMgaXMgb24gdGhlIHByb3BlcnR5IHVzZXIgdG8gZW5zdXJlIHRoYXQgYWxsIHByb3BlcnR5IHZhbHVlcworCQkvLwkJYXJlIGNvbnZlcnRlZCB0byB0aGUgZXhwZWN0ZWQgdHlwZSBiZWZvcmUgdXNhZ2UuIFByb3BlcnRpZXMKKwkJLy8JCXdoaWNoIGRvIG5vdCBvY2N1ciBpbiB0aGUgInRoaXMiIG9iamVjdCBhcmUgYXNzaWduZWQgdG8gdGhlCisJCS8vCQl0aGlzLmV4dHJhQXJncyBtYXAgdXNpbmcgYm90aCB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgdGhlCisJCS8vCQlsb3dlci1jYXNlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIGFsbG93cyBmb3IgY29uc2lzdGVudAorCQkvLwkJYWNjZXNzIHNlbWFudGljcyByZWdhcmRsZXNzIG9mIHRoZSBjYXNlIHByZXNlcnZhdGlvbiBvZiB0aGUKKwkJLy8JCXNvdXJjZSBvZiB0aGUgcHJvcGVydHkgbmFtZXMuCisJCQorCQlpZigoYXJnc1siZmFzdE1peEluIl0pfHwoZnJhZ1siZmFzdE1peEluIl0pKXsKKwkJCS8vIGRvam8ucHJvZmlsZS5zdGFydCgibWl4SW5Qcm9wZXJ0aWVzX2Zhc3RNaXhJbiIpOworCQkJLy8gZmFzdCBtaXggaW4gYXNzdW1lcyBjYXNlIHNlbnNpdGl2aXR5LCBubyB0eXBlIGNhc3RpbmcsIGV0Yy4uLgorCQkJLy8gZG9qby5sYW5nLm1peGluKHRoaXMsIGFyZ3MpOworCQkJZm9yKHZhciB4IGluIGFyZ3MpeworCQkJCXRoaXNbeF0gPSBhcmdzW3hdOworCQkJfQorCQkJLy8gZG9qby5wcm9maWxlLmVuZCgibWl4SW5Qcm9wZXJ0aWVzX2Zhc3RNaXhJbiIpOworCQkJcmV0dXJuOworCQl9CisJCS8vIGRvam8ucHJvZmlsZS5zdGFydCgibWl4SW5Qcm9wZXJ0aWVzIik7CisKKwkJdmFyIHVuZGVmOworCisJCS8vIE5PVEU6IHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGUgcGFzc2VkIHByb3BlcnRpZXMgYXJlIGNhc2UtY29ycmVjdAorCQkvLyAoZXNwIGR1ZSB0byBzb21lIGJyb3dzZXIgYnVncykuIFRoZXJlZm9yZSwgd2UgYXR0ZW1wdCB0byBsb2NhdGUKKwkJLy8gcHJvcGVydGllcyBmb3IgYXNzaWdubWVudCByZWdhcmRsZXNzIG9mIGNhc2UuIFRoaXMgbWF5IGNhdXNlCisJCS8vIHByb2JsZW1hdGljIGFzc2lnbm1lbnRzIGFuZCBidWdzIGluIHRoZSBmdXR1cmUgYW5kIHdpbGwgbmVlZCB0byBiZQorCQkvLyBkb2N1bWVudGVkIHdpdGggYmlnIGJyaWdodCBuZW9uIGxpZ2h0cy4KKworCQkvLyBGSVhNRTogZmFpbHMgbWlzZXJhYmx5IGlmIGEgbWl4aW4gcHJvcGVydHkgaGFzIGEgZGVmYXVsdCB2YWx1ZSBvZiBudWxsIGluIAorCQkvLyBhIHdpZGdldAorCisJCS8vIE5PVEU6IGNhY2hpbmcgbG93ZXItY2FzZWQgYXJncyBpbiB0aGUgcHJvdG90eXBlIGlzIG9ubHkgCisJCS8vIGFjY2VwdGFibGUgaWYgdGhlIHByb3BlcnRpZXMgYXJlIGludmFyaWFudC4KKwkJLy8gaWYgd2UgaGF2ZSBhIG5hbWUtY2FjaGUsIGdldCBpdAorCQl2YXIgbGNBcmdzID0gZG9qby53aWRnZXQubGNBcmdzQ2FjaGVbdGhpcy53aWRnZXRUeXBlXTsKKwkJaWYgKCBsY0FyZ3MgPT0gbnVsbCApeworCQkJLy8gYnVpbGQgYSBsb3dlci1jYXNlIHByb3BlcnR5IG5hbWUgY2FjaGUgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUKKwkJCWxjQXJncyA9IHt9OworCQkJZm9yKHZhciB5IGluIHRoaXMpeworCQkJCWxjQXJnc1soKG5ldyBTdHJpbmcoeSkpLnRvTG93ZXJDYXNlKCkpXSA9IHk7CisJCQl9CisJCQlkb2pvLndpZGdldC5sY0FyZ3NDYWNoZVt0aGlzLndpZGdldFR5cGVdID0gbGNBcmdzOworCQl9CisJCXZhciB2aXNpdGVkID0ge307CisJCWZvcih2YXIgeCBpbiBhcmdzKXsKKwkJCWlmKCF0aGlzW3hdKXsgLy8gY2hlY2sgdGhlIGNhY2hlIGZvciBwcm9wZXJ0aWVzCisJCQkJdmFyIHkgPSBsY0FyZ3NbKG5ldyBTdHJpbmcoeCkpLnRvTG93ZXJDYXNlKCldOworCQkJCWlmKHkpeworCQkJCQlhcmdzW3ldID0gYXJnc1t4XTsKKwkJCQkJeCA9IHk7IAorCQkJCX0KKwkJCX0KKwkJCWlmKHZpc2l0ZWRbeF0peyBjb250aW51ZTsgfQorCQkJdmlzaXRlZFt4XSA9IHRydWU7CisJCQlpZigodHlwZW9mIHRoaXNbeF0pICE9ICh0eXBlb2YgdW5kZWYpKXsKKwkJCQlpZih0eXBlb2YgYXJnc1t4XSAhPSAic3RyaW5nIil7CisJCQkJCXRoaXNbeF0gPSBhcmdzW3hdOworCQkJCX1lbHNleworCQkJCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcodGhpc1t4XSkpeworCQkJCQkJdGhpc1t4XSA9IGFyZ3NbeF07CisJCQkJCX1lbHNlIGlmKGRvam8ubGFuZy5pc051bWJlcih0aGlzW3hdKSl7CisJCQkJCQl0aGlzW3hdID0gbmV3IE51bWJlcihhcmdzW3hdKTsgLy8gRklYTUU6IHdoYXQgaWYgTmFOIGlzIHRoZSByZXN1bHQ/CisJCQkJCX1lbHNlIGlmKGRvam8ubGFuZy5pc0Jvb2xlYW4odGhpc1t4XSkpeworCQkJCQkJdGhpc1t4XSA9IChhcmdzW3hdLnRvTG93ZXJDYXNlKCk9PSJmYWxzZSIpID8gZmFsc2UgOiB0cnVlOworCQkJCQl9ZWxzZSBpZihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzW3hdKSl7CisKKwkJCQkJCS8vIEZJWE1FOiBuZWVkIHRvIGRldGVybWluZSBpZiBhbHdheXMgb3Zlci13cml0aW5nIGluc3RlYWQKKwkJCQkJCS8vIG9mIGF0dGFjaGluZyBoZXJlIGlzIGFwcHJvcHJpYXRlLiBJIHN1c3BlY3QgdGhhdCB3ZQorCQkJCQkJLy8gbWlnaHQgd2FudCB0byBvbmx5IGFsbG93IGF0dGFjaGluZyB3LyBhY3Rpb24gaXRlbXMuCisJCQkJCQkKKwkJCQkJCS8vIFJBUiwgMS8xOS8wNTogSSdtIGdvaW5nIHRvIGF0dGFjaCBpbnN0ZWFkIG9mCisJCQkJCQkvLyBvdmVyLXdyaXRlIGhlcmUuIFBlcmhhcHMgZnVuY3Rpb24gb2JqZWN0cyBjb3VsZCBoYXZlCisJCQkJCQkvLyBzb21lIHNvcnQgb2YgZmxhZyBzZXQgb24gdGhlbT8gT3IgbWl4ZWQtaW50byBvYmplY3RzCisJCQkJCQkvLyBjb3VsZCBoYXZlIHNvbWUgbGlzdCBvZiBub24tbXV0YWJsZSBwcm9wZXJ0aWVzCisJCQkJCQkvLyAoYWx0aG91Z2ggSSdtIG5vdCBzdXJlIGhvdyB0aGF0IHdvdWxkIGFsbGV2aWF0ZSB0aGlzCisJCQkJCQkvLyBwYXJ0aWN1bGFyIHByb2JsZW0pPyAKKworCQkJCQkJLy8gdGhpc1t4XSA9IG5ldyBGdW5jdGlvbihhcmdzW3hdKTsKKworCQkJCQkJLy8gYWZ0ZXIgYW4gSVJDIGRpc2N1c3Npb24gbGFzdCB3ZWVrLCBpdCB3YXMgZGVjaWRlZAorCQkJCQkJLy8gdGhhdCB0aGVzZSBldmVudCBoYW5kbGVycyBzaG91bGQgZXhlY3V0ZSBpbiB0aGUKKwkJCQkJCS8vIGNvbnRleHQgb2YgdGhlIHdpZGdldCwgc28gdGhhdCB0aGUgInRoaXMiIHBvaW50ZXIKKwkJCQkJCS8vIHRha2VzIGNvcnJlY3RseS4KKwkJCQkJCQorCQkJCQkJLy8gYXJndW1lbnQgdGhhdCBjb250YWlucyBubyBwdW5jdHVhdGlvbiBvdGhlciB0aGFuIC4gaXMgCisJCQkJCQkvLyBjb25zaWRlcmVkIGEgZnVuY3Rpb24gc3BlYywgbm90IGNvZGUKKwkJCQkJCWlmKGFyZ3NbeF0uc2VhcmNoKC9bXlx3XC5dKy9pKSA9PSAtMSl7CisJCQkJCQkJdGhpc1t4XSA9IGRvam8uZXZhbE9ialBhdGgoYXJnc1t4XSwgZmFsc2UpOworCQkJCQkJfWVsc2V7CisJCQkJCQkJdmFyIHRuID0gZG9qby5sYW5nLm5hbWVBbm9uRnVuYyhuZXcgRnVuY3Rpb24oYXJnc1t4XSksIHRoaXMpOworCQkJCQkJCWRvam8uZXZlbnQua3dDb25uZWN0KHsKKwkJCQkJCQkJc3JjT2JqOiB0aGlzLCAKKwkJCQkJCQkJc3JjRnVuYzogeCwgCisJCQkJCQkJCWFkdmljZU9iajogdGhpcywgCisJCQkJCQkJCWFkdmljZUZ1bmM6IHRuCisJCQkJCQkJfSk7CisJCQkJCQl9CisJCQkJCX1lbHNlIGlmKGRvam8ubGFuZy5pc0FycmF5KHRoaXNbeF0pKXsgLy8gdHlwZW9mIFtdID09ICJvYmplY3QiCisJCQkJCQl0aGlzW3hdID0gYXJnc1t4XS5zcGxpdCgiOyIpOworCQkJCQl9IGVsc2UgaWYgKHRoaXNbeF0gaW5zdGFuY2VvZiBEYXRlKSB7CisJCQkJCQl0aGlzW3hdID0gbmV3IERhdGUoTnVtYmVyKGFyZ3NbeF0pKTsgLy8gYXNzdW1lIHRpbWVzdGFtcAorCQkJCQl9ZWxzZSBpZih0eXBlb2YgdGhpc1t4XSA9PSAib2JqZWN0Iil7IAorCQkJCQkJLy8gRklYTUU6IHNob3VsZCB3ZSBiZSBhbGxvd2luZyBleHRlbnNpb24gaGVyZSB0byBoYW5kbGUKKwkJCQkJCS8vIG90aGVyIG9iamVjdCB0eXBlcyBpbnRlbGxpZ2VudGx5PworCisJCQkJCQkvLyBpZiBhIHBsYWluIHN0cmluZyBpcyBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBvZiB0eXBlIGRvam8udXJpLlVyaSwKKwkJCQkJCS8vIHdlIGFzc3VtZSBpdCBpcyByZWxhdGl2ZSB0byByb290IG9mIGRvam8KKwkJCQkJCWlmICh0aGlzW3hdIGluc3RhbmNlb2YgZG9qby51cmkuVXJpKXsKKwkJCQkJCQl0aGlzW3hdID0gZG9qby51cmkuZG9qb1VyaShhcmdzW3hdKTsKKwkJCQkJCX1lbHNleworCQkJCQkJCS8vIEZJWE1FOiB1bmxpa2UgYWxsIG90aGVyIHR5cGVzLCB3ZSBkbyBub3QgcmVwbGFjZSB0aGUKKwkJCQkJCQkvLyBvYmplY3Qgd2l0aCBhIG5ldyBvbmUgaGVyZS4gU2hvdWxkIHdlIGNoYW5nZSB0aGF0PworCQkJCQkJCXZhciBwYWlycyA9IGFyZ3NbeF0uc3BsaXQoIjsiKTsKKwkJCQkJCQlmb3IodmFyIHk9MDsgeTxwYWlycy5sZW5ndGg7IHkrKyl7CisJCQkJCQkJCXZhciBzaSA9IHBhaXJzW3ldLmluZGV4T2YoIjoiKTsKKwkJCQkJCQkJaWYoKHNpICE9IC0xKSYmKHBhaXJzW3ldLmxlbmd0aD5zaSkpeworCQkJCQkJCQkJdGhpc1t4XVtwYWlyc1t5XS5zdWJzdHIoMCwgc2kpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIildID0gcGFpcnNbeV0uc3Vic3RyKHNpKzEpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9ZWxzZXsKKwkJCQkJCS8vIHRoZSBkZWZhdWx0IGlzIHN0cmFpZ2h0LXVwIHN0cmluZyBhc3NpZ25tZW50LiBXaGVuIHdvdWxkCisJCQkJCQkvLyB3ZSBldmVyIGhpdCB0aGlzPworCQkJCQkJdGhpc1t4XSA9IGFyZ3NbeF07CisJCQkJCX0KKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQkvLyBjb2xsZWN0IGFueSBleHRyYSAnbm9uIG1peGVkIGluJyBhcmdzCisJCQkJdGhpcy5leHRyYUFyZ3NbeC50b0xvd2VyQ2FzZSgpXSA9IGFyZ3NbeF07CisJCQl9CisJCX0KKwkJLy8gZG9qby5wcm9maWxlLmVuZCgibWl4SW5Qcm9wZXJ0aWVzIik7CisJfSwKKwkKKwlwb3N0TWl4SW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbigvKk9iamVjdCovYXJncywgLypPYmplY3QqL2ZyYWcsIC8qV2lkZ2V0Ki9wYXJlbnQpeworCQkvLyBzdW1tYXJ5CisJCS8vCUNhbGxlZCBhZnRlciB0aGUgcGFyYW1ldGVycyB0byB0aGUgd2lkZ2V0IGhhdmUgYmVlbiByZWFkLWluLAorCQkvLwlidXQgYmVmb3JlIHRoZSB3aWRnZXQgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkLgorCQkvLwlFc3BlY2lhbGx5IHVzZWZ1bCB0byBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSB3aWRnZXQgdGVtcGxhdGUuCisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9hcmdzLCAvKk9iamVjdCovZnJhZywgLypXaWRnZXQqL3BhcmVudCl7CisJCS8vIHN1bW1hcnk6IHN0dWIgZnVuY3Rpb24uCisJCXJldHVybiBmYWxzZTsKKwkJLy8gZG9qby51bmltcGxlbWVudGVkKCJkb2pvLndpZGdldC5XaWRnZXQuaW5pdGlhbGl6ZSIpOworCX0sCisKKwlwb3N0SW5pdGlhbGl6ZTogZnVuY3Rpb24oLypPYmplY3QqL2FyZ3MsIC8qT2JqZWN0Ki9mcmFnLCAvKldpZGdldCovcGFyZW50KXsKKwkJLy8gc3VtbWFyeTogc3R1YiBmdW5jdGlvbi4KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlwb3N0Q3JlYXRlOiBmdW5jdGlvbigvKk9iamVjdCovYXJncywgLypPYmplY3QqL2ZyYWcsIC8qV2lkZ2V0Ki9wYXJlbnQpeworCQkvLyBzdW1tYXJ5OiBzdHViIGZ1bmN0aW9uLgorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCXVuaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlzdHViIGZ1bmN0aW9uLiBPdmVyLXJpZGUgdG8gaW1wbGVtZW50IGN1c3RvbSB3aWRnZXQgdGVhci1kb3duCisJCS8vCQliZWhhdmlvci4KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlidWlsZFJlbmRlcmluZzogZnVuY3Rpb24oLypPYmplY3QqL2FyZ3MsIC8qT2JqZWN0Ki9mcmFnLCAvKldpZGdldCovcGFyZW50KXsKKwkJLy8gc3VtbWFyeTogc3R1YiBmdW5jdGlvbi4gU1VCQ0xBU1NFUyBNVVNUIElNUExFTUVOVAorCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LldpZGdldC5idWlsZFJlbmRlcmluZywgb24gIit0aGlzLnRvU3RyaW5nKCkrIiwgIik7CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJZGVzdHJveVJlbmRlcmluZzogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogc3R1YiBmdW5jdGlvbi4gU1VCQ0xBU1NFUyBNVVNUIElNUExFTUVOVAorCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LldpZGdldC5kZXN0cm95UmVuZGVyaW5nIik7CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJYWRkZWRUbzogZnVuY3Rpb24ocGFyZW50KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXN0dWIgZnVuY3Rpb24gdGhpcyBpcyBqdXN0IGEgc2lnbmFsIHRoYXQgY2FuIGJlIGNhdWdodAorCQkvLyBwYXJlbnQ6IFdpZGdldAorCQkvLwkJaW5zdGFuY2Ugb2YgZG9qby53aWRnZXQuV2lkZ2V0IHRoYXQgd2Ugd2VyZSBhZGRlZCB0bworCX0sCisKKwlhZGRDaGlsZDogZnVuY3Rpb24oY2hpbGQpeworCQkvLyBzdW1tYXJ5OiBzdHViIGZ1bmN0aW9uLiBTVUJDTEFTU0VTIE1VU1QgSU1QTEVNRU5UCisJCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuV2lkZ2V0LmFkZENoaWxkIik7CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0YWNoIHRoZSBnaXZlbiBjaGlsZCB3aWRnZXQgZnJvbSBtZSwgYnV0IGRvbid0IGRlc3Ryb3kgaXQKKwlyZW1vdmVDaGlsZDogZnVuY3Rpb24oLypXaWRnZXQqL3dpZGdldCl7CisJCS8vIHN1bW1hcnk6IAorCQkvLwkJcmVtb3ZlcyB0aGUgcGFzc2VkIHdpZGdldCBpbnN0YW5jZSBmcm9tIHRoaXMgd2lkZ2V0IGJ1dCBkb2VzCisJCS8vCQlub3QgZGVzdHJveSBpdAorCQlmb3IodmFyIHg9MDsgeDx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgeCsrKXsKKwkJCWlmKHRoaXMuY2hpbGRyZW5beF0gPT09IHdpZGdldCl7CisJCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoeCwgMSk7CisJCQkJd2lkZ2V0LnBhcmVudD1udWxsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiB3aWRnZXQ7IC8vIFdpZGdldAorCX0sCisKKwlnZXRQcmV2aW91c1NpYmxpbmc6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIG51bGwgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIHBhcmVudCwKKwkJLy8JCW90aGVyd2lzZSByZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgdG8gdGhlICJsZWZ0Ii4KKwkJdmFyIGlkeCA9IHRoaXMuZ2V0UGFyZW50SW5kZXgoKTsKKyAKKwkJIC8vIGZpcnN0IG5vZGUgaXMgaWR4PTAgbm90IGZvdW5kIGlzIGlkeDwwCisJCWlmIChpZHg8PTApIHJldHVybiBudWxsOworIAorCQlyZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baWR4LTFdOyAvLyBXaWRnZXQKKwl9LAorIAorCWdldFNpYmxpbmdzOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBnZXRzIGFuIGFycmF5IG9mIGFsbCBjaGlsZHJlbiBvZiBvdXIgcGFyZW50LCBpbmNsdWRpbmcgInRoaXMiCisJCXJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbjsgLy8gQXJyYXkKKwl9LAorIAorCWdldFBhcmVudEluZGV4OiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiB3aGF0IGluZGV4IGFyZSB3ZSBhdCBpbiB0aGUgcGFyZW50J3MgY2hpbGRyZW4gYXJyYXk/CisJCXJldHVybiBkb2pvLmxhbmcuaW5kZXhPZih0aGlzLnBhcmVudC5jaGlsZHJlbiwgdGhpcywgdHJ1ZSk7IC8vIGludAorCX0sCisgCisJZ2V0TmV4dFNpYmxpbmc6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlyZXR1cm5zIG51bGwgaWYgdGhpcyBpcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgcGFyZW50LAorCQkvLwkJb3RoZXJ3aXNlIHJldHVybnMgdGhlIG5leHQgc2libGluZyB0byB0aGUgInJpZ2h0Ii4KKyAKKwkJdmFyIGlkeCA9IHRoaXMuZ2V0UGFyZW50SW5kZXgoKTsKKyAKKwkJaWYgKGlkeCA9PSB0aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGgtMSl7cmV0dXJuIG51bGw7fSAvLyBsYXN0IG5vZGUKKwkJaWYgKGlkeCA8IDApe3JldHVybiBudWxsO30gLy8gbm90IGZvdW5kCisgCisJCXJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltpZHgrMV07IC8vIFdpZGdldAorCX0KK30pOworCisvLyBMb3dlciBjYXNlIG5hbWUgY2FjaGU6IGxpc3Rpbmcgb2YgdGhlIGxvd2VyIGNhc2UgZWxlbWVudHMgaW4gZWFjaCB3aWRnZXQuCisvLyBXZSBjYW4ndCBzdG9yZSB0aGUgbGNBcmdzIGluIHRoZSB3aWRnZXQgaXRzZWxmIGJlY2F1c2UgaWYgQiBzdWJjbGFzc2VzIEEsCisvLyB0aGVuIEIucHJvdG90eXBlLmxjQXJncyBtaWdodCByZXR1cm4gQS5wcm90b3R5cGUubGNBcmdzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZQorLy8gd2FudAorZG9qby53aWRnZXQubGNBcmdzQ2FjaGUgPSB7fTsKKworLy8gVE9ETzogc2hvdWxkIGhhdmUgYSBtb3JlIGdlbmVyYWwgd2F5IHRvIGFkZCB0YWdzIG9yIHRhZyBsaWJyYXJpZXM/CisvLyBUT0RPOiBuZWVkIGEgZGVmYXVsdCB0YWdzIGNsYXNzIHRvIGluaGVyaXQgZnJvbSBmb3IgdGhpbmdzIGxpa2UgZ2V0dGluZyBwcm9wZXJ0eVNldHMKKy8vIFRPRE86IHBhcnNlIHByb3BlcnRpZXMvcHJvcGVydHlTZXRzIGludG8gY29tcG9uZW50IGF0dHJpYnV0ZXMKKy8vIFRPRE86IHBhcnNlIHN1YmNvbXBvbmVudHMKKy8vIFRPRE86IGNvcHkvY2xvbmUgcmF3IG1hcmt1cCBmcmFnbWVudHMvbm9kZXMgYXMgYXBwcm9wcmlhdGUKK2Rvam8ud2lkZ2V0LnRhZ3MgPSB7fTsKK2Rvam8ud2lkZ2V0LnRhZ3MuYWRkUGFyc2VUcmVlSGFuZGxlciA9IGZ1bmN0aW9uKC8qU3RyaW5nKi90eXBlKXsKKwkvLyBzdW1tYXJ5OiBkZXByZWNhdGVkIQorCWRvam8uZGVwcmVjYXRlZCgiYWRkUGFyc2VUcmVlSGFuZGxlciIsICIuIFBhcnNlVHJlZUhhbmRsZXJzIGFyZSBub3cgcmVzZXJ2ZWQgZm9yIGNvbXBvbmVudHMuIEFueSB1bmZpbHRlcmVkIERvam9NTCB0YWcgd2l0aG91dCBhIFBhcnNlVHJlZUhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhIHdpZGdldCIsICIwLjUiKTsKKwkvKgorCXZhciBsdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTsKKwl0aGlzW2x0eXBlXSA9IGZ1bmN0aW9uKGZyYWdtZW50LCB3aWRnZXRQYXJzZXIsIHBhcmVudENvbXAsIGluc2VydGlvbkluZGV4LCBsb2NhbFByb3BzKXsKKwkJdmFyIF9sdHlwZSA9IGx0eXBlOworCQlkb2pvLnByb2ZpbGUuc3RhcnQoX2x0eXBlKTsKKwkJdmFyIG4gPSBkb2pvLndpZGdldC5idWlsZFdpZGdldEZyb21QYXJzZVRyZWUobHR5cGUsIGZyYWdtZW50LCB3aWRnZXRQYXJzZXIsIHBhcmVudENvbXAsIGluc2VydGlvbkluZGV4LCBsb2NhbFByb3BzKTsKKwkJZG9qby5wcm9maWxlLmVuZChfbHR5cGUpOworCQlyZXR1cm4gbjsKKwl9CisJKi8KK30KKworLy9kb2pvLndpZGdldC50YWdzLmFkZFBhcnNlVHJlZUhhbmRsZXIoImRvam86d2lkZ2V0Iik7CisKK2Rvam8ud2lkZ2V0LnRhZ3NbImRvam86cHJvcGVydHlzZXQiXSA9IGZ1bmN0aW9uKGZyYWdtZW50LCB3aWRnZXRQYXJzZXIsIHBhcmVudENvbXApeworCS8vIEZJWE1FOiBJcyB0aGlzIG5lZWRlZD8KKwkvLyBGSVhNRTogTm90IHN1cmUgdGhhdCB0aGlzIHBhcnNlcyBpbnRvIHRoZSBzdHJ1Y3R1cmUgdGhhdCBJIHdhbnQgaXQgdG8gcGFyc2UgaW50by4uLgorCS8vIEZJWE1FOiBhZGQgc3VwcG9ydCBmb3IgbmVzdGVkIHByb3BlcnR5U2V0cworCXZhciBwcm9wZXJ0aWVzID0gd2lkZ2V0UGFyc2VyLnBhcnNlUHJvcGVydGllcyhmcmFnbWVudFsiZG9qbzpwcm9wZXJ0eXNldCJdKTsKK30KKworLy8gRklYTUU6IG5lZWQgdG8gYWRkIHRoZSA8ZG9qbzpjb25uZWN0IC8+Citkb2pvLndpZGdldC50YWdzWyJkb2pvOmNvbm5lY3QiXSA9IGZ1bmN0aW9uKGZyYWdtZW50LCB3aWRnZXRQYXJzZXIsIHBhcmVudENvbXApeworCXZhciBwcm9wZXJ0aWVzID0gd2lkZ2V0UGFyc2VyLnBhcnNlUHJvcGVydGllcyhmcmFnbWVudFsiZG9qbzpjb25uZWN0Il0pOworfQorCisvLyBGSVhNRTogaWYgd2Uga25vdyB0aGUgaW5zZXJ0aW9uIHBvaW50ICh0byBhIHJlYXNvbmFibGUgbG9jYXRpb24pLCB3aHkgdGhlbiBkbyB3ZToKKy8vCS0gY3JlYXRlIGEgdGVtcGxhdGUgbm9kZQorLy8JLSBjbG9uZSB0aGUgdGVtcGxhdGUgbm9kZQorLy8JLSByZW5kZXIgdGhlIGNsb25lIGFuZCBzZXQgcHJvcGVydGllcworLy8JLSByZW1vdmUgdGhlIGNsb25lIGZyb20gdGhlIHJlbmRlciB0cmVlCisvLwktIHBsYWNlIHRoZSBjbG9uZQorLy8gdGhpcyBpcyBxdWl0ZSBkdW1iCitkb2pvLndpZGdldC5idWlsZFdpZGdldEZyb21QYXJzZVRyZWUgPSBmdW5jdGlvbigvKlN0cmluZyovCQkJCXR5cGUsCisJCQkJCQkJCQkJCQkvKk9iamVjdCovCQkJCWZyYWcsIAorCQkJCQkJCQkJCQkJLypkb2pvLndpZGdldC5QYXJzZSovCXBhcnNlciwKKwkJCQkJCQkJCQkJCS8qV2lkZ2V0LCBvcHRpb25hbCovCXBhcmVudENvbXAsIAorCQkJCQkJCQkJCQkJLyppbnQsIG9wdGlvbmFsKi8JCWluc2VydGlvbkluZGV4LAorCQkJCQkJCQkJCQkJLypPYmplY3QqLwkJCQlsb2NhbFByb3BzKXsKKworCS8vIHN1bW1hcnk6IGNyZWF0ZXMgYSB0cmVlIG9mIHdpZGdldHMgZnJvbSB0aGUgZGF0YSBzdHJ1Y3R1cmUgcHJvZHVjZWQgYnkgdGhlIGZpcnN0LXBhc3MgcGFyc2VyIChmcmFnKQorCQorCS8vIHRlc3QgZm9yIGFjY2Vzc2liaWxpdHkgbW9kZSAKKwlkb2pvLmExMXkuc2V0QWNjZXNzaWJsZU1vZGUoKTsKKwkvL2Rvam8ucHJvZmlsZS5zdGFydCgiYnVpbGRXaWRnZXRGcm9tUGFyc2VUcmVlIik7CisJLy8gRklYTUU6IGZvciBjb2RlcGF0aCBmcm9tIGNyZWF0ZUNvbXBvbmVudEZyb21TY3JpcHQsIHdlIGFyZSBub3cgc3BsaXR0aW5nIGEgcGF0aCAKKwkvLyB0aGF0IHdlIGFscmVhZHkgc3BsaXQgYW5kIHRoZW4gam9pbmVkCisJdmFyIHN0eXBlID0gdHlwZS5zcGxpdCgiOiIpOworCXN0eXBlID0gKHN0eXBlLmxlbmd0aCA9PSAyKSA/IHN0eXBlWzFdIDogdHlwZTsKKwkKKwkvLyBGSVhNRTogd2UgZG9uJ3Qgc2VlbSB0byBiZSBkb2luZyBhbnl0aGluZyB3aXRoIHRoaXMhCisJLy8gdmFyIHByb3BlcnR5U2V0cyA9IHBhcnNlci5nZXRQcm9wZXJ0eVNldHMoZnJhZyk7CisJdmFyIGxvY2FsUHJvcGVydGllcyA9IGxvY2FsUHJvcHMgfHwgcGFyc2VyLnBhcnNlUHJvcGVydGllcyhmcmFnW2ZyYWdbIm5zIl0rIjoiK3N0eXBlXSk7CisJdmFyIHR3aWRnZXQgPSBkb2pvLndpZGdldC5tYW5hZ2VyLmdldEltcGxlbWVudGF0aW9uKHN0eXBlLG51bGwsbnVsbCxmcmFnWyJucyJdKTsKKwlpZighdHdpZGdldCl7CisJCXRocm93IG5ldyBFcnJvcignY2Fubm90IGZpbmQgIicgKyB0eXBlICsgJyIgd2lkZ2V0Jyk7CisJfWVsc2UgaWYgKCF0d2lkZ2V0LmNyZWF0ZSl7CisJCXRocm93IG5ldyBFcnJvcignIicgKyB0eXBlICsgJyIgd2lkZ2V0IG9iamVjdCBoYXMgbm8gImNyZWF0ZSIgbWV0aG9kIGFuZCBkb2VzIG5vdCBhcHBlYXIgdG8gaW1wbGVtZW50ICpXaWRnZXQnKTsKKwl9CisJbG9jYWxQcm9wZXJ0aWVzWyJkb2pvaW5zZXJ0aW9uaW5kZXgiXSA9IGluc2VydGlvbkluZGV4OworCS8vIEZJWE1FOiB3ZSBsb3NlIG5vIGxlc3MgdGhhbiA1bXMgaW4gY29uc3RydWN0aW9uIQorCXZhciByZXQgPSB0d2lkZ2V0LmNyZWF0ZShsb2NhbFByb3BlcnRpZXMsIGZyYWcsIHBhcmVudENvbXAsIGZyYWdbIm5zIl0pOworCS8vIGRvam8ucHJvZmlsZS5lbmQoImJ1aWxkV2lkZ2V0RnJvbVBhcnNlVHJlZSIpOworCXJldHVybiByZXQ7Cit9CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCA9IGZ1bmN0aW9uKHdpZGdldENsYXNzLCByZW5kZXJlciwgc3VwZXJjbGFzc2VzLCBpbml0LCBwcm9wcyl7CisJLy8gc3VtbWFyeTogQ3JlYXRlIGEgd2lkZ2V0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIChha2Egd2lkZ2V0Q2xhc3MpCisJLy8gd2lkZ2V0Q2xhc3M6IFN0cmluZworCS8vCQl0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBoaWVyYXJjaHkgdG8gcGxhY2UgdGhlIG5ldyB3aWRnZXQgY2xhc3MgY29uc3RydWN0b3IKKwkvLyByZW5kZXJlcjogU3RyaW5nCisJLy8JCXVzdWFsbHkgImh0bWwiLCBkZXRlcm1pbmVzIHdoZW4gdGhpcyBkZWxjYXJhdGlvbiB3aWxsIGJlIHVzZWQKKwkvLyBzdXBlcmNsYXNzZXM6IEZ1bmN0aW9ufHxGdW5jdGlvbltdCisJLy8JCWNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGJlCisJLy8JCW1peGVkIGluIGFzIHN1cGVyY2xhc3Nlcy4gSWYgYW4gYXJyYXksIG9ubHkgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZAorCS8vCQl0byBzZXQgcHJvdG90eXBlIGluaGVyaXRhbmNlLgorCS8vIGluaXQ6IEZ1bmN0aW9uCisJLy8JCWFuIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLiBXaWxsIGJlIGNhbGxlZCBhZnRlciBzdXBlcmNsYXNzZXMgYXJlIG1peGVkIGluLgorCS8vIHByb3BzOiBPYmplY3QKKwkvLwkJYSBtYXAgb2YgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25zIHRvIGV4dGVuZCB0aGUgY2xhc3MgcHJvdG90eXBlIHdpdGgKKworCS8vIFRoaXMgbWV0YS1mdW5jdGlvbiBkb2VzIHBhcmFtZXRlciBqdWdnbGluZyBmb3IgYmFja3dhcmQgY29tcGF0IGFuZCBvdmVybG9hZGluZworCS8vIGlmIDR0aCBhcmd1bWVudCBpcyBhIHN0cmluZywgd2UgYXJlIHVzaW5nIHRoZSBvbGQgc3ludGF4CisJLy8gb2xkIHNpZzogd2lkZ2V0Q2xhc3MsIHN1cGVyY2xhc3NlcywgcHJvcHMgKG9iamVjdCksIHJlbmRlcmVyIChzdHJpbmcpLCBpbml0IChmdW5jdGlvbikKKwlpZihkb2pvLmxhbmcuaXNTdHJpbmcoYXJndW1lbnRzWzNdKSl7CisJCWRvam8ud2lkZ2V0Ll9kZWZpbmVXaWRnZXQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbM10sIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzRdLCBhcmd1bWVudHNbMl0pOworCX1lbHNleworCQkvLyB3aWRnZXRDbGFzcworCQl2YXIgYXJncyA9IFsgYXJndW1lbnRzWzBdIF0sIHAgPSAzOworCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcoYXJndW1lbnRzWzFdKSl7CisJCQkvLyByZW5kZXJlciwgc3VwZXJjbGFzcworCQkJYXJncy5wdXNoKGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTsKKwkJfWVsc2V7CisJCQkvLyBzdXBlcmNsYXNzCisJCQlhcmdzLnB1c2goJycsIGFyZ3VtZW50c1sxXSk7CisJCQlwID0gMjsKKwkJfQorCQlpZihkb2pvLmxhbmcuaXNGdW5jdGlvbihhcmd1bWVudHNbcF0pKXsKKwkJCS8vIGluaXQgKGZ1bmN0aW9uKSwgcHJvcHMgKG9iamVjdCkgCisJCQlhcmdzLnB1c2goYXJndW1lbnRzW3BdLCBhcmd1bWVudHNbcCsxXSk7CisJCX1lbHNleworCQkJLy8gcHJvcHMgKG9iamVjdCkgCisJCQlhcmdzLnB1c2gobnVsbCwgYXJndW1lbnRzW3BdKTsKKwkJfQorCQlkb2pvLndpZGdldC5fZGVmaW5lV2lkZ2V0LmFwcGx5KHRoaXMsIGFyZ3MpOworCX0KK30KKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0LnJlbmRlcmVycyA9ICJodG1sfHN2Z3x2bWwiOworCitkb2pvLndpZGdldC5fZGVmaW5lV2lkZ2V0ID0gZnVuY3Rpb24od2lkZ2V0Q2xhc3MgLypzdHJpbmcqLywgcmVuZGVyZXIgLypzdHJpbmcqLywgc3VwZXJjbGFzc2VzIC8qZnVuY3Rpb258fGFycmF5Ki8sIGluaXQgLypmdW5jdGlvbiovLCBwcm9wcyAvKm9iamVjdCovKXsKKwkvLyBGSVhNRTogdW5jb21tZW50IG5leHQgbGluZSB0byB0ZXN0IHBhcmFtZXRlciBqdWdnbGluZyAuLi4gcmVtb3ZlIHdoZW4gY29uZmlkZW5jZSBpbXByb3ZlcworCS8vIGRvam8uZGVidWcoJyhjOiknICsgd2lkZ2V0Q2xhc3MgKyAnXG5cbihyOiknICsgcmVuZGVyZXIgKyAnXG5cbihpOiknICsgaW5pdCArICdcblxuKHA6KScgKyBwcm9wcyk7CisJLy8gd2lkZ2V0Q2xhc3MgdGFrZXMgdGhlIGZvcm0gZm9vLmJhci5iYXo8LnJlbmRlcmVyPi5XaWRnZXROYW1lIChlLmcuIGZvby5iYXIuYmF6LldpZGdldE5hbWUgb3IgZm9vLmJhci5iYXouaHRtbC5XaWRnZXROYW1lKQorCXZhciBtb2R1bGUgPSB3aWRnZXRDbGFzcy5zcGxpdCgiLiIpOworCXZhciB0eXBlID0gbW9kdWxlLnBvcCgpOyAvLyB0eXBlIDw9IFdpZGdldE5hbWUsIG1vZHVsZSA8PSBmb28uYmFyLmJhejwucmVuZGVyZXI+CisJdmFyIHJlZ3ggPSAiXFwuKCIgKyAocmVuZGVyZXIgPyByZW5kZXJlciArICd8JyA6ICcnKSArIGRvam8ud2lkZ2V0LmRlZmluZVdpZGdldC5yZW5kZXJlcnMgKyAiKVxcLiI7CisJdmFyIHIgPSB3aWRnZXRDbGFzcy5zZWFyY2gobmV3IFJlZ0V4cChyZWd4KSk7CisJbW9kdWxlID0gKHIgPCAwID8gbW9kdWxlLmpvaW4oIi4iKSA6IHdpZGdldENsYXNzLnN1YnN0cigwLCByKSk7CisKKwkvLyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIG5hbWVzcGFjZSBzeXN0ZW0sIHJlbW92ZSBmb3IgMC41CisJZG9qby53aWRnZXQubWFuYWdlci5yZWdpc3RlcldpZGdldFBhY2thZ2UobW9kdWxlKTsKKwkKKwl2YXIgcG9zID0gbW9kdWxlLmluZGV4T2YoIi4iKTsKKwl2YXIgbnNOYW1lID0gKHBvcyA+IC0xKSA/IG1vZHVsZS5zdWJzdHJpbmcoMCxwb3MpIDogbW9kdWxlOworCisJLy8gRklYTUU6IGhybSwgdGhpcyBtaWdodCBtYWtlIHRoaW5ncyBzaW1wbGVyCisJLy9kb2pvLndpZGdldC50YWdzLmFkZFBhcnNlVHJlZUhhbmRsZXIobnNOYW1lKyI6Iit0eXBlLnRvTG93ZXJDYXNlKCkpOworCQorCXByb3BzPShwcm9wcyl8fHt9OworCXByb3BzLndpZGdldFR5cGUgPSB0eXBlOworCWlmKCghaW5pdCkmJihwcm9wc1siY2xhc3NDb25zdHJ1Y3RvciJdKSl7CisJCWluaXQgPSBwcm9wcy5jbGFzc0NvbnN0cnVjdG9yOworCQlkZWxldGUgcHJvcHMuY2xhc3NDb25zdHJ1Y3RvcjsKKwl9CisJZG9qby5kZWNsYXJlKHdpZGdldENsYXNzLCBzdXBlcmNsYXNzZXMsIGluaXQsIHByb3BzKTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5QYXJzZSIpOworCisKKworLy8KKy8vIGRvam9NTCBwYXJzZXIgc2hvdWxkIGJlIG1vdmVkIG91dCBvZiAnd2lkZ2V0JywgY29kaWZ5aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAnY29tcG9uZW50JworLy8gYW5kIGEgJ3dpZGdldCcuIEEgJ2NvbXBvbmVudCcgYmVpbmcgYW55dGhpbmcgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gYSB0YWcuCisvLworLy8gYSBwYXJ0aWN1bGFyIGRvam9NTCB0YWcgd291bGQgYmUgaGFuZGxlZCBieSBhIHJlZ2lzdGVyZWQgdGFnSGFuZGxlciB3aXRoIGEgaG9vayBmb3IgYSBkZWZhdWx0IGhhbmRsZXIKKy8vIGlmIHRoZSB3aWRnZXQgc3lzdGVtIGlzIGxvYWRlZCwgYSB3aWRnZXQgYnVpbGRlciB3b3VsZCBiZSBhdHRhY2ggaXRzZWxmIGFzIHRoZSBkZWZhdWx0IGhhbmRsZXIKKy8vIAorLy8gd2lkZ2V0IHRhZ3MgYXJlIG5vIGxvbmdlciByZWdpc3RlcmVkIHRoZW1zZWx2ZXM6CisvLyB0aGV5IGFyZSBub3cgYXJiaXRyYXJpbHkgbmFtZXNwYWNlZCwgc28gd2UgY2Fubm90IHJlZ2lzdGVyIHRoZW0gYWxsLCBhbmQgdGhlIG5vbi1wcmVmaXhlZCBwb3J0aW9ucyAKKy8vIGFyZSBubyBsb25nZXIgZ3VhcmFudGVlZCB1bmlxdWUgCisvLyAKKy8vIHRoZXJlZm9yZSBkb2pvLndpZGdldC50YWdzIHNob3VsZCBnbyB3aXRoIHRoaXMgcGFyc2VyIGNvZGUgb3V0IG9mIHRoZSB3aWRnZXQgbW9kdWxlCisvLworCitkb2pvLndpZGdldC5QYXJzZSA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9mcmFnbWVudCl7CisJdGhpcy5wcm9wZXJ0eVNldHNMaXN0ID0gW107CisJdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OworCisJdGhpcy5jcmVhdGVDb21wb25lbnRzID0gZnVuY3Rpb24oLypPYmplY3QqL2ZyYWcsIC8qT2JqZWN0Ki9wYXJlbnRDb21wKXsKKwkJdmFyIGNvbXBzID0gW107CisJCXZhciBidWlsdCA9IGZhbHNlOworCQkvLyBpZiB3ZSBoYXZlIGl0ZW1zIHRvIHBhcnNlL2NyZWF0ZSBhdCB0aGlzIGxldmVsLCBkbyBpdCEKKwkJdHJ5eworCQkJaWYoZnJhZyAmJiBmcmFnLnRhZ05hbWUgJiYgKGZyYWcgIT0gZnJhZy5ub2RlUmVmKSl7CisJCQkJCisJCQkJLy8gdGhlc2UgYXJlIGluIGZhY3QsIG5vdCBldmVyIGZvciB3aWRnZXRzIHBlci1zZSBhbnltb3JlLCAKKwkJCQkvLyBidXQgZm9yIG90aGVyIG1hcmt1cCBlbGVtZW50cyAoYWthIGNvbXBvbmVudHMpCisJCQkJdmFyIGRqVGFncyA9IGRvam8ud2lkZ2V0LnRhZ3M7CisJCQkJCisJCQkJLy8gd2Ugc3BsaXQgc28gdGhhdCB5b3UgY2FuIGRlY2xhcmUgbXVsdGlwbGUgCisJCQkJLy8gbm9uLWRlc3RydWN0aXZlIGNvbXBvbmVudHMgZnJvbSB0aGUgc2FtZSBjdG9yIG5vZGUKKwkJCQl2YXIgdG5hID0gU3RyaW5nKGZyYWcudGFnTmFtZSkuc3BsaXQoIjsiKTsKKwkJCQlmb3IodmFyIHg9MDsgeDx0bmEubGVuZ3RoOyB4KyspeworCQkJCQl2YXIgbHRuID0gdG5hW3hdLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIikudG9Mb3dlckNhc2UoKTsKKwkJCQkJLy8gRklYTUU6IHVuc3VyZSB3aGF0IHRoaXMgZG9lcworCQkJCQlmcmFnLnRhZ05hbWUgPSBsdG47CisJCQkJCXZhciByZXQ7CisJCQkJCWlmKGRqVGFnc1tsdG5dKXsKKwkJCQkJCWJ1aWx0ID0gdHJ1ZTsKKwkJCQkJCXJldCA9IGRqVGFnc1tsdG5dKGZyYWcsIHRoaXMsIHBhcmVudENvbXAsIGZyYWcuaW5kZXgpOworCQkJCQkJY29tcHMucHVzaChyZXQpOworCQkJCQl9ZWxzZXsKKwkJCQkJCS8vIHdlIHJlcXVpcmUgYSBuYW1lc3BhY2UgcHJlZml4LCBkZWZhdWx0IHRvIGRvam86CisJCQkJCQlpZihsdG4uaW5kZXhPZigiOiIpID09IC0xKXsKKwkJCQkJCQlsdG4gPSAiZG9qbzoiK2x0bjsKKwkJCQkJCX0KKwkJCQkJCS8vIEZJWE1FOiBoYW5kbGluZyBmYWlsdXJlIGNvbmRpdGlvbiBjb3JyZWN0bHk/CisJCQkJCQkvLyByZXQgPSBkalRhZ3NbbHRuXShmcmFnLCB0aGlzLCBwYXJlbnRDb21wLCBmcmFnLmluZGV4KTsKKwkJCQkJCXJldCA9IGRvam8ud2lkZ2V0LmJ1aWxkV2lkZ2V0RnJvbVBhcnNlVHJlZShsdG4sIGZyYWcsIHRoaXMsIHBhcmVudENvbXAsIGZyYWcuaW5kZXgpOworCQkJCQkJaWYocmV0KXsKKwkJCQkJCQlidWlsdCA9IHRydWU7CisJCQkJCQkJY29tcHMucHVzaChyZXQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9Y2F0Y2goZSl7CisJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5QYXJzZTogZXJyb3I6IiwgZSk7CisJCQkvLyBub3RlLCBjb21tZW50aW5nIG91dCB0aGUgbmV4dCBsaW5lIGlzIGJyZWFraW5nIHNldmVyYWwgd2lkZ2V0cyBmb3IgbWUKKwkJCS8vIHRocm93IGU7CisJCQkvLyBJRSBpcyBzdWNoIGEgcGFpbiBzb21ldGltZXMKKwkJfQorCQkvLyBpZiB0aGVyZSdzIGEgc3ViLWZyYWcsIGJ1aWxkIHdpZGdldHMgZnJvbSB0aGF0IHRvbworCQlpZighYnVpbHQpeworCQkJY29tcHMgPSBjb21wcy5jb25jYXQodGhpcy5jcmVhdGVTdWJDb21wb25lbnRzKGZyYWcsIHBhcmVudENvbXApKTsKKwkJfQorCQlyZXR1cm4gY29tcHM7IC8vIEFycmF5CisJfQorCisJdGhpcy5jcmVhdGVTdWJDb21wb25lbnRzID0gZnVuY3Rpb24oLypPYmplY3QqL2ZyYWdtZW50LCAvKk9iamVjdCovcGFyZW50Q29tcCl7CisJCS8vIHN1bW1hcnk6IHJlY3Vyc2VzIG92ZXIgYSByYXcgSmF2YVNjcmlwdCBvYmplY3Qgc3RydWN0dXJlLAorCQkvLyBhbmQgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlciBmb3IgaXRzIG5vcm1hbGl6ZWQgdGFnTmFtZSBpZiBpdCBleGlzdHMKKworCQl2YXIgZnJhZywgY29tcHMgPSBbXTsKKwkJZm9yKHZhciBpdGVtIGluIGZyYWdtZW50KXsKKwkJCWZyYWcgPSBmcmFnbWVudFtpdGVtXTsKKwkJCWlmKGZyYWcgJiYgdHlwZW9mIGZyYWcgPT0gIm9iamVjdCIKKwkJCQkmJihmcmFnIT1mcmFnbWVudC5ub2RlUmVmKQorCQkJCSYmKGZyYWchPWZyYWdtZW50LnRhZ05hbWUpCisJCQkJJiYoIWRvam8uZG9tLmlzTm9kZShmcmFnKSkpey8vIG5lZWRlZCBpbiBJRSB3aGVuIHdlIGhhdmUgZXZlbnQuY29ubmVjdGVkIHRvIHRoZSBkb21Ob2RlCisJCQkJY29tcHMgPSBjb21wcy5jb25jYXQodGhpcy5jcmVhdGVDb21wb25lbnRzKGZyYWcsIHBhcmVudENvbXApKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tcHM7IC8vIEFycmF5CisJfQorCisJdGhpcy5wYXJzZVByb3BlcnR5U2V0cyA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9mcmFnbWVudCl7CisJCS8vIHN1bW1hcnk6IGNoZWNrcyB0aGUgdG9wIGxldmVsIG9mIGEgcmF3IEphdmFTY3JpcHQgb2JqZWN0CisJCS8vCXN0cnVjdHVyZSBmb3IgYW55IHByb3BlcnR5U2V0cy4gIEl0IHN0b3JlcyBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHRvIAorCQkvLwlwcm9wZXJ0eVNldHMgdGhhdCBpdCBmaW5kcy4KKwkJcmV0dXJuIFtdOworCQkvKgorCQl2YXIgcHJvcGVydHlTZXRzID0gW107CisJCWZvcih2YXIgaXRlbSBpbiBmcmFnbWVudCl7CisJCQlpZigoZnJhZ21lbnRbaXRlbV1bInRhZ05hbWUiXSA9PSAiZG9qbzpwcm9wZXJ0eXNldCIpKXsKKwkJCQlwcm9wZXJ0eVNldHMucHVzaChmcmFnbWVudFtpdGVtXSk7CisJCQl9CisJCX0KKwkJLy8gRklYTUU6IHNob3VsZCB3ZSBzdG9yZSB0aGVzZSBwcm9wZXJ0eVNldHMgc29tZXdoZXJlIGZvciBsYXRlciByZXRyaWV2YWwKKwkJdGhpcy5wcm9wZXJ0eVNldHNMaXN0LnB1c2gocHJvcGVydHlTZXRzKTsKKwkJcmV0dXJuIHByb3BlcnR5U2V0czsKKwkJKi8KKwl9CisKKwl0aGlzLnBhcnNlUHJvcGVydGllcyA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9mcmFnbWVudCl7CisJCS8vIHN1bW1hcnk6IHBhcnNlUHJvcGVydGllcyBjaGVja3MgYSByYXcgSmF2YVNjcmlwdCBvYmplY3Qgc3RydWN0dXJlIGZvcgorCQkvLwlwcm9wZXJ0aWVzLCBhbmQgcmV0dXJucyBhIGhhc2ggb2YgcHJvcGVydGllcyB0aGF0IGl0IGZpbmRzLgorCQl2YXIgcHJvcGVydGllcyA9IHt9OworCQlmb3IodmFyIGl0ZW0gaW4gZnJhZ21lbnQpeworCQkJLy8gRklYTUU6IG5lZWQgdG8gY2hlY2sgZm9yIHVuZGVmaW5lZD8KKwkJCS8vIGNhc2U6IGl0cyBhIHRhZ05hbWUgb3Igbm9kZVJlZgorCQkJaWYoKGZyYWdtZW50W2l0ZW1dID09IGZyYWdtZW50LnRhZ05hbWUpfHwoZnJhZ21lbnRbaXRlbV0gPT0gZnJhZ21lbnQubm9kZVJlZikpeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX1lbHNleworCQkJCXZhciBmcmFnID0gZnJhZ21lbnRbaXRlbV07CisJCQkJaWYoZnJhZy50YWdOYW1lICYmIGRvam8ud2lkZ2V0LnRhZ3NbZnJhZy50YWdOYW1lLnRvTG93ZXJDYXNlKCldKXsKKwkJCQkJLy8gVE9ETzogaXQgaXNuJ3QgYSBwcm9wZXJ0eSBvciBwcm9wZXJ0eSBzZXQsIGl0J3MgYSBmcmFnbWVudCwgCisJCQkJCS8vIHNvIGRvIHNvbWV0aGluZyBlbHNlCisJCQkJCS8vIEZJWE1FOiBuZWVkcyB0byBiZSBhIGJldHRlci9zdHJpY3RlciBjaGVjaworCQkJCQkvLyBUT0RPOiBoYW5kbGUgeGxpbms6aHJlZiBmb3IgZXh0ZXJuYWwgcHJvcGVydHkgc2V0cworCQkJCX1lbHNlIGlmKGZyYWdbMF0gJiYgZnJhZ1swXS52YWx1ZSE9IiIgJiYgZnJhZ1swXS52YWx1ZSE9bnVsbCl7CisJCQkJCXRyeXsKKwkJCQkJCS8vIEZJWE1FOiBuZWVkIHRvIGFsbG93IG1vcmUgdGhhbiBvbmUgcHJvdmlkZXIKKwkJCQkJCWlmKGl0ZW0udG9Mb3dlckNhc2UoKSA9PSAiZGF0YXByb3ZpZGVyIil7CisJCQkJCQkJdmFyIF90aGlzID0gdGhpczsKKwkJCQkJCQl0aGlzLmdldERhdGFQcm92aWRlcihfdGhpcywgZnJhZ1swXS52YWx1ZSk7CisJCQkJCQkJcHJvcGVydGllcy5kYXRhUHJvdmlkZXIgPSB0aGlzLmRhdGFQcm92aWRlcjsKKwkJCQkJCX0KKwkJCQkJCXByb3BlcnRpZXNbaXRlbV0gPSBmcmFnWzBdLnZhbHVlOworCQkJCQkJdmFyIG5lc3RlZFByb3BlcnRpZXMgPSB0aGlzLnBhcnNlUHJvcGVydGllcyhmcmFnKTsKKwkJCQkJCS8vIEZJWE1FOiB0aGlzIGtpbmQgb2YgY29weWluZyBpcyBleHBlbnNpdmUgYW5kIGluZWZmaWNpZW50IQorCQkJCQkJZm9yKHZhciBwcm9wZXJ0eSBpbiBuZXN0ZWRQcm9wZXJ0aWVzKXsKKwkJCQkJCQlwcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IG5lc3RlZFByb3BlcnRpZXNbcHJvcGVydHldOworCQkJCQkJfQorCQkJCQl9Y2F0Y2goZSl7IGRvam8uZGVidWcoZSk7IH0KKwkJCQl9CisJCQkJc3dpdGNoKGl0ZW0udG9Mb3dlckNhc2UoKSl7CisJCQkJY2FzZSAiY2hlY2tlZCI6CisJCQkJY2FzZSAiZGlzYWJsZWQiOgorCQkJCQlpZiAodHlwZW9mIHByb3BlcnRpZXNbaXRlbV0gIT0gImJvb2xlYW4iKXsgCisJCQkJCQlwcm9wZXJ0aWVzW2l0ZW1dID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IAorCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOyAvLyBPYmplY3QKKwl9CisKKwl0aGlzLmdldERhdGFQcm92aWRlciA9IGZ1bmN0aW9uKC8qT2JqZWN0Ki9vYmpSZWYsIC8qU3RyaW5nKi9kYXRhVXJsKXsKKwkJLy8gRklYTUU6IHRoaXMgaXMgY3VycmVudGx5IHN5bmMuICBUbyBtYWtlIHRoaXMgYXN5bmMsIHdlIG1hZGUgbmVlZCB0byBtb3ZlIAorCQkvL3RoaXMgc3RlcCBpbnRvIHRoZSB3aWRnZXQgY3Rvciwgc28gdGhhdCBpdCBpcyBsb2FkZWQgd2hlbiBpdCBpcyBuZWVkZWQgCisJCS8vIHRvIHBvcHVsYXRlIHRoZSB3aWRnZXQKKwkJZG9qby5pby5iaW5kKHsKKwkJCXVybDogZGF0YVVybCwKKwkJCWxvYWQ6IGZ1bmN0aW9uKHR5cGUsIGV2YWxkT2JqKXsKKwkJCQlpZih0eXBlPT0ibG9hZCIpeworCQkJCQlvYmpSZWYuZGF0YVByb3ZpZGVyID0gZXZhbGRPYmo7CisJCQkJfQorCQkJfSwKKwkJCW1pbWV0eXBlOiAidGV4dC9qYXZhc2NyaXB0IiwKKwkJCXN5bmM6IHRydWUKKwkJfSk7CisJfQorCisJdGhpcy5nZXRQcm9wZXJ0eVNldEJ5SWQgPSBmdW5jdGlvbihwcm9wZXJ0eVNldElkKXsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyB0aGUgcHJvcGVydHlTZXQgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZAorCQlmb3IodmFyIHggPSAwOyB4IDwgdGhpcy5wcm9wZXJ0eVNldHNMaXN0Lmxlbmd0aDsgeCsrKXsKKwkJCWlmKHByb3BlcnR5U2V0SWQgPT0gdGhpcy5wcm9wZXJ0eVNldHNMaXN0W3hdWyJpZCJdWzBdLnZhbHVlKXsKKwkJCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eVNldHNMaXN0W3hdOworCQkJfQorCQl9CisJCXJldHVybiAiIjsgLy8gU3RyaW5nCisJfQorCQorCS8vRklYTUU6IGRvZXNuJ3QgdXNlIHRoZSBjb21wb25lbnRUeXBlIHBhcmFtPworCXRoaXMuZ2V0UHJvcGVydHlTZXRzQnlUeXBlID0gZnVuY3Rpb24oY29tcG9uZW50VHlwZSl7CisJCS8vIHN1bW1hcnk6IHJldHVybnMgdGhlIHByb3BlcnR5U2V0KHMpIHRoYXQgbWF0Y2goZXMpIHRoZQorCSAJLy8gcHJvdmlkZWQgY29tcG9uZW50Q2xhc3MKKworCQl2YXIgcHJvcGVydHlTZXRzID0gW107CisJCWZvcih2YXIgeD0wOyB4IDwgdGhpcy5wcm9wZXJ0eVNldHNMaXN0Lmxlbmd0aDsgeCsrKXsKKwkJCXZhciBjcGwgPSB0aGlzLnByb3BlcnR5U2V0c0xpc3RbeF07CisJCQl2YXIgY3BjYyA9IGNwbC5jb21wb25lbnRDbGFzcyB8fCBjcGwuY29tcG9uZW50VHlwZSB8fCBudWxsOyAvL0ZJWE1FOiBpcyBjb21wb25lbnRUeXBlIHN1cHBvc2VkIHRvIGJlIGFuIGluZGlyZWN0IHJlZmVyZW5jZT8KKwkJCXZhciBwcm9wZXJ0eVNldElkID0gdGhpcy5wcm9wZXJ0eVNldHNMaXN0W3hdWyJpZCJdWzBdLnZhbHVlOworCQkJaWYoY3BjYyAmJiAocHJvcGVydHlTZXRJZCA9PSBjcGNjWzBdLnZhbHVlKSl7CisJCQkJcHJvcGVydHlTZXRzLnB1c2goY3BsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvcGVydHlTZXRzOyAvLyBBcnJheQorCX0KKworCXRoaXMuZ2V0UHJvcGVydHlTZXRzID0gZnVuY3Rpb24oLypPYmplY3QqL2ZyYWdtZW50KXsKKwkJLy8gc3VtbWFyeTogcmV0dXJucyB0aGUgcHJvcGVydHlTZXQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGZyYWdtZW50CisKKwkJdmFyIHBwbCA9ICJkb2pvOnByb3BlcnR5cHJvdmlkZXJsaXN0IjsKKwkJdmFyIHByb3BlcnR5U2V0cyA9IFtdOworCQl2YXIgdGFnbmFtZSA9IGZyYWdtZW50LnRhZ05hbWU7CisJCWlmKGZyYWdtZW50W3BwbF0peyAKKwkJCXZhciBwcm9wZXJ0eVByb3ZpZGVySWRzID0gZnJhZ21lbnRbcHBsXS52YWx1ZS5zcGxpdCgiICIpOworCQkJLy8gRklYTUU6IHNob3VsZCB0aGUgcHJvcGVydHlQcm92aWRlckxpc3QgYXR0cmlidXRlIGNvbnRhaW4gIworCQkJLy8gCQkgIHN5bnRheCBmb3IgcmVmZXJlbmNlIHRvIGlkcyBvciBub3Q/CisJCQkvLyBGSVhNRTogbmVlZCBhIGJldHRlciB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGxvY2FsIG9yIGV4dGVybmFsCisJCQkvLyBGSVhNRTogZG9lc24ndCBoYW5kbGUgbmVzdGVkIHByb3BlcnR5U2V0cywgb3IgcHJvcGVydHlTZXRzIHRoYXQKKwkJCS8vIAkJICBqdXN0IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3NzIGRvY3VtZW50cywgZXRjLgorCQkJZm9yKHZhciBwcm9wZXJ0eVNldElkIGluIHByb3BlcnR5UHJvdmlkZXJJZHMpeworCQkJCWlmKChwcm9wZXJ0eVNldElkLmluZGV4T2YoIi4uIik9PS0xKSYmKHByb3BlcnR5U2V0SWQuaW5kZXhPZigiOi8vIik9PS0xKSl7CisJCQkJCS8vIGdldCBhIHJlZmVyZW5jZSB0byBhIHByb3BlcnR5U2V0IHdpdGhpbiB0aGUgY3VycmVudCBwYXJzZWQgc3RydWN0dXJlCisJCQkJCXZhciBwcm9wZXJ0eVNldCA9IHRoaXMuZ2V0UHJvcGVydHlTZXRCeUlkKHByb3BlcnR5U2V0SWQpOworCQkJCQlpZihwcm9wZXJ0eVNldCAhPSAiIil7CisJCQkJCQlwcm9wZXJ0eVNldHMucHVzaChwcm9wZXJ0eVNldCk7CisJCQkJCX0KKwkJCQl9ZWxzZXsKKwkJCQkJLy8gRklYTUU6IGFkZCBjb2RlIHRvIHBhcnNlIGFuZCByZXR1cm4gYSBwcm9wZXJ0eVNldCBmcm9tCisJCQkJCS8vIGFub3RoZXIgZG9jdW1lbnQKKwkJCQkJLy8gYWxleDogaXMgdGhpcyBldmVuIG5lY2Vzc2FyYXk/IERvIHdlIGNhcmU/IElmIHNvLCB3aHk/CisJCQkJfQorCQkJfQorCQl9CisJCS8vIHdlIHB1dCB0aGUgdHlwZWQgb25lcyBmaXJzdCBzbyB0aGF0IHRoZSBwYXJzZWQgb25lcyBvdmVycmlkZSB3aGVuCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zLgorCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVNldHNCeVR5cGUodGFnbmFtZSkuY29uY2F0KHByb3BlcnR5U2V0cyk7IC8vIEFycmF5CisJfQorCisJdGhpcy5jcmVhdGVDb21wb25lbnRGcm9tU2NyaXB0ID0gZnVuY3Rpb24oLypOb2RlKi9ub2RlUmVmLCAvKlN0cmluZyovY29tcG9uZW50TmFtZSwgLypPYmplY3QqL3Byb3BlcnRpZXMsIC8qU3RyaW5nPyovbnMpeworCQkvLyBzdW1tYXJ5OgorCQkvLyBub2RlUmVmOiB0aGUgbm9kZSB0byBiZSByZXBsYWNlZC4uLiBpbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCB3YW50IHRvIGFkZCAKKwkJLy8gYW4gYWx0ZXJuYXRpdmUgd2F5IHRvIHNwZWNpZnkgYW4gaW5zZXJ0aW9uIHBvaW50CisJCS8vIGNvbXBvbmVudE5hbWU6IHRoZSBleHBlY3RlZCBkb2pvIHdpZGdldCBuYW1lLCBpLmUuIEJ1dHRvbiBvZiBDb250ZXh0TWVudQorCQkvLyBwcm9wZXJ0aWVzOiBhbiBvYmplY3Qgb2YgbmFtZSB2YWx1ZSBwYWlycworCQkvLyBuczogdGhlIG5hbWVzcGFjZSBvZiB0aGUgd2lkZ2V0LiAgRGVmYXVsdHMgdG8gImRvam8iCisKKwkJcHJvcGVydGllcy5mYXN0TWl4SW4gPSB0cnVlOwkJCQorCQkvLyBGSVhNRTogd2UgcHVsbGVkIGl0IGFwYXJ0IGFuZCBub3cgd2UgcHV0IGl0IGJhY2sgdG9nZXRoZXIgLi4uIAorCQl2YXIgbHRuID0gKG5zIHx8ICJkb2pvIikgKyAiOiIgKyBjb21wb25lbnROYW1lLnRvTG93ZXJDYXNlKCk7CisJCWlmKGRvam8ud2lkZ2V0LnRhZ3NbbHRuXSl7CisJCQlyZXR1cm4gW2Rvam8ud2lkZ2V0LnRhZ3NbbHRuXShwcm9wZXJ0aWVzLCB0aGlzLCBudWxsLCBudWxsLCBwcm9wZXJ0aWVzKV07IC8vIEFycmF5CisJCX0KKwkJcmV0dXJuIFtkb2pvLndpZGdldC5idWlsZFdpZGdldEZyb21QYXJzZVRyZWUobHRuLCBwcm9wZXJ0aWVzLCB0aGlzLCBudWxsLCBudWxsLCBwcm9wZXJ0aWVzKV07IC8vIEFycmF5CisJfQorfQorCitkb2pvLndpZGdldC5fcGFyc2VyX2NvbGxlY3Rpb24gPSB7ImRvam8iOiBuZXcgZG9qby53aWRnZXQuUGFyc2UoKSB9OworCitkb2pvLndpZGdldC5nZXRQYXJzZXIgPSBmdW5jdGlvbigvKlN0cmluZz8qL25hbWUpeworCWlmKCFuYW1lKXsgbmFtZSA9ICJkb2pvIjsgfQorCWlmKCF0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXSl7CisJCXRoaXMuX3BhcnNlcl9jb2xsZWN0aW9uW25hbWVdID0gbmV3IGRvam8ud2lkZ2V0LlBhcnNlKCk7CisJfQorCXJldHVybiB0aGlzLl9wYXJzZXJfY29sbGVjdGlvbltuYW1lXTsKK30KKworZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0ID0gZnVuY3Rpb24oLypTdHJpbmcqL25hbWUsIC8qU3RyaW5nKi9wcm9wcywgLypOb2RlKi9yZWZOb2RlLCAvKlN0cmluZyovcG9zaXRpb24peworCS8vIHN1bW1hcnk6IENyZWF0ZXMgd2lkZ2V0CisJLy8gbmFtZTogVGhlIG5hbWUgb2YgdGhlIHdpZGdldCB0byBjcmVhdGUgd2l0aCBvcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4LAorCS8vCWUuZy4ibnM6d2lkZ2V0IiwgbmFtZXNwYWNlIGRlZmF1bHRzIHRvICJkb2pvIi4KKwkvLyBwcm9wczogS2V5LVZhbHVlIHBhaXJzIG9mIHByb3BlcnRpZXMgb2YgdGhlIHdpZGdldAorCS8vIHJlZk5vZGU6IElmIHRoZSBwb3NpdGlvbiBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoaXMgbm9kZSBpcyB1c2VkIGFzCisJLy8JYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyB0aGlzIG5vZGUgaW50byBhIERPTSB0cmVlOyBlbHNlCisJLy8JdGhlIHdpZGdldCBiZWNvbWVzIHRoZSBkb21Ob2RlCisJLy8gcG9zaXRpb246IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhpcyB3aWRnZXQncyBub2RlIHJlbGF0aXZlIHRvIHRoZQorCS8vCXJlZk5vZGUgYXJndW1lbnQKKworCXZhciBpc05vZGUgPSBmYWxzZTsKKwl2YXIgaXNOYW1lU3RyID0gKHR5cGVvZiBuYW1lID09ICJzdHJpbmciKTsKKwlpZihpc05hbWVTdHIpeworCQl2YXIgcG9zID0gbmFtZS5pbmRleE9mKCI6Iik7CisJCXZhciBucyA9IChwb3MgPiAtMSkgPyBuYW1lLnN1YnN0cmluZygwLHBvcykgOiAiZG9qbyI7CisJCWlmKHBvcyA+IC0xKXsgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHBvcysxKTsgfQorCQl2YXIgbG93ZXJDYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJdmFyIG5hbWVzcGFjZWROYW1lID0gbnMgKyAiOiIgKyBsb3dlckNhc2VOYW1lOworCQlpc05vZGUgPSAoZG9qby5ieUlkKG5hbWUpICYmICFkb2pvLndpZGdldC50YWdzW25hbWVzcGFjZWROYW1lXSk7IAorCX0KKworCWlmKChhcmd1bWVudHMubGVuZ3RoID09IDEpICYmIChpc05vZGUgfHwgIWlzTmFtZVN0cikpeworCQkvLyB3ZSBnb3QgYSBET00gbm9kZSAKKwkJdmFyIHhwID0gbmV3IGRvam8ueG1sLlBhcnNlKCk7IAorCQkvLyBGSVhNRTogd2Ugc2hvdWxkIHRyeSB0byBmaW5kIHRoZSBwYXJlbnQhIAorCQl2YXIgdG4gPSBpc05vZGUgPyBkb2pvLmJ5SWQobmFtZSkgOiBuYW1lOyAKKwkJcmV0dXJuIGRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZUNvbXBvbmVudHMoeHAucGFyc2VFbGVtZW50KHRuLCBudWxsLCB0cnVlKSlbMF07IAorCX0KKworCWZ1bmN0aW9uIGZyb21TY3JpcHQocGxhY2VLZWVwZXJOb2RlLCBuYW1lLCBwcm9wcywgbnMpeworCQlwcm9wc1tuYW1lc3BhY2VkTmFtZV0gPSB7IAorCQkJZG9qb3R5cGU6IFt7dmFsdWU6IGxvd2VyQ2FzZU5hbWV9XSwKKwkJCW5vZGVSZWY6IHBsYWNlS2VlcGVyTm9kZSwKKwkJCWZhc3RNaXhJbjogdHJ1ZQorCQl9OworCQlwcm9wcy5ucyA9IG5zOworCQlyZXR1cm4gZG9qby53aWRnZXQuZ2V0UGFyc2VyKCkuY3JlYXRlQ29tcG9uZW50RnJvbVNjcmlwdChwbGFjZUtlZXBlck5vZGUsIG5hbWUsIHByb3BzLCBucyk7CisJfQorCisJcHJvcHMgPSBwcm9wc3x8e307CisJdmFyIG5vdFJlZiA9IGZhbHNlOworCXZhciB0biA9IG51bGw7CisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sLmNhcGFibGU7CisJaWYoaCl7CisJCXRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCX0KKwlpZighcmVmTm9kZSl7CisJCW5vdFJlZiA9IHRydWU7CisJCXJlZk5vZGUgPSB0bjsKKwkJaWYoaCl7CisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZChyZWZOb2RlKTsKKwkJfQorCX1lbHNlIGlmKHBvc2l0aW9uKXsKKwkJZG9qby5kb20uaW5zZXJ0QXRQb3NpdGlvbih0biwgcmVmTm9kZSwgcG9zaXRpb24pOworCX1lbHNleyAvLyBvdGhlcndpc2UgZG9uJ3QgcmVwbGFjZSwgYnV0IGJ1aWxkIGluLXBsYWNlCisJCXRuID0gcmVmTm9kZTsKKwl9CisJdmFyIHdpZGdldEFycmF5ID0gZnJvbVNjcmlwdCh0biwgbmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgbnMpOworCWlmKAkoIXdpZGdldEFycmF5KXx8KCF3aWRnZXRBcnJheVswXSl8fAorCQkodHlwZW9mIHdpZGdldEFycmF5WzBdLndpZGdldFR5cGUgPT0gInVuZGVmaW5lZCIpICl7CisJCXRocm93IG5ldyBFcnJvcigiY3JlYXRlV2lkZ2V0OiBDcmVhdGlvbiBvZiBcIiIgKyBuYW1lICsgIlwiIHdpZGdldCBmYWlsZWQuIik7CisJfQorCXRyeXsKKwkJaWYobm90UmVmICYmIHdpZGdldEFycmF5WzBdLmRvbU5vZGUucGFyZW50Tm9kZSl7CisJCQl3aWRnZXRBcnJheVswXS5kb21Ob2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQod2lkZ2V0QXJyYXlbMF0uZG9tTm9kZSk7CisJCX0KKwl9Y2F0Y2goZSl7CisJCS8qIHNxdWVsY2ggZm9yIFNhZmFyaSAqLworCQlkb2pvLmRlYnVnKGUpOworCX0KKwlyZXR1cm4gd2lkZ2V0QXJyYXlbMF07IC8vIFdpZGdldAorfQorCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRvbVdpZGdldCIpOworCisKKworCisKKworCisKKworCitkb2pvLndpZGdldC5fY3NzRmlsZXMgPSB7fTsKK2Rvam8ud2lkZ2V0Ll9jc3NTdHJpbmdzID0ge307Citkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZSA9IHt9OworCitkb2pvLndpZGdldC5kZWZhdWx0U3RyaW5ncyA9IHsKKwkvLyBzdW1tYXJ5OiBhIG1hcHBpbmcgb2Ygc3RyaW5ncyB0aGF0IGFyZSB1c2VkIGluIHRlbXBsYXRlIHZhcmlhYmxlIHJlcGxhY2VtZW50CisJZG9qb1Jvb3Q6IGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCksCisJZG9qb1dpZGdldE1vZHVsZVVyaTogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIpLAorCWJhc2VTY3JpcHRVcmk6IGRvam8uaG9zdGVudi5nZXRCYXNlU2NyaXB0VXJpKCkKK307CisKK2Rvam8ud2lkZ2V0LmZpbGxGcm9tVGVtcGxhdGVDYWNoZSA9IGZ1bmN0aW9uKG9iaiwgdGVtcGxhdGVQYXRoLCB0ZW1wbGF0ZVN0cmluZywgYXZvaWRDYWNoZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJc3RhdGljIG1ldGhvZCB0byBidWlsZCBmcm9tIGEgdGVtcGxhdGUgdy8gb3Igdy9vIGEgcmVhbCB3aWRnZXQgaW4KKwkvLwkJcGxhY2UKKwkvLyBvYmo6IERvbVdpZGdldAorCS8vCQlhbiBpbnN0YW5jZSBvZiBkb2pvLndpZGdldC5Eb21XaWRnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgdGVtcGxhdGUgZm9yCisJLy8gdGVtcGxhdGVQYXRoOiBTdHJpbmcKKwkvLwkJdGhlIFVSTCB0byBnZXQgdGhlIHRlbXBsYXRlIGZyb20uIGRvam8udXJpLlVyaSBpcyBvZnRlbiBwYXNzZWQgYXMgd2VsbC4KKwkvLyB0ZW1wbGF0ZVN0cmluZzogU3RyaW5nPworCS8vCQlhIHN0cmluZyB0byB1c2UgaW4gbGlldSBvZiBmZXRjaGluZyB0aGUgdGVtcGxhdGUgZnJvbSBhIFVSTAorCS8vIGF2b2lkQ2FjaGU6IEJvb2xlYW4/CisJLy8JCXNob3VsZCB0aGUgdGVtcGxhdGUgc3lzdGVtIG5vdCB1c2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIGNhY2hlIGFuZAorCS8vCQlhbHdheXMgdXNlIHRoZSBwYXNzZWQgdGVtcGxhdGVQYXRoIG9yIHRlbXBsYXRlU3RyaW5nPworCisJLy8gZG9qby5kZWJ1ZygiYXZvaWRDYWNoZToiLCBhdm9pZENhY2hlKTsKKwl2YXIgdHBhdGggPSB0ZW1wbGF0ZVBhdGggfHwgb2JqLnRlbXBsYXRlUGF0aDsKKworCXZhciB0bXBsdHMgPSBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZTsKKwlpZighdHBhdGggJiYgIW9ialsid2lkZ2V0VHlwZSJdKSB7IC8vIGRvbid0IGhhdmUgYSByZWFsIHRlbXBsYXRlIGhlcmUKKwkJZG8geworCQkJdmFyIGR1bW15TmFtZSA9ICJfX2R1bW15VGVtcGxhdGVfXyIgKyBkb2pvLndpZGdldC5fdGVtcGxhdGVDYWNoZS5kdW1teUNvdW50Kys7CisJCX0gd2hpbGUodG1wbHRzW2R1bW15TmFtZV0pOworCQlvYmoud2lkZ2V0VHlwZSA9IGR1bW15TmFtZTsKKwl9CisJdmFyIHd0ID0gdHBhdGg/dHBhdGgudG9TdHJpbmcoKTpvYmoud2lkZ2V0VHlwZTsKKworCXZhciB0cyA9IHRtcGx0c1t3dF07CisJaWYoIXRzKXsKKwkJdG1wbHRzW3d0XSA9IHsic3RyaW5nIjogbnVsbCwgIm5vZGUiOiBudWxsfTsKKwkJaWYoYXZvaWRDYWNoZSl7CisJCQl0cyA9IHt9OworCQl9ZWxzZXsKKwkJCXRzID0gdG1wbHRzW3d0XTsKKwkJfQorCX0KKworCWlmKCghb2JqLnRlbXBsYXRlU3RyaW5nKSYmKCFhdm9pZENhY2hlKSl7CisJCW9iai50ZW1wbGF0ZVN0cmluZyA9IHRlbXBsYXRlU3RyaW5nIHx8IHRzWyJzdHJpbmciXTsKKwl9CisJaWYob2JqLnRlbXBsYXRlU3RyaW5nKXsKKwkJb2JqLnRlbXBsYXRlU3RyaW5nID0gdGhpcy5fc2FuaXRpemVUZW1wbGF0ZVN0cmluZyhvYmoudGVtcGxhdGVTdHJpbmcpOworCX0KKworCWlmKCghb2JqLnRlbXBsYXRlTm9kZSkmJighYXZvaWRDYWNoZSkpeworCQlvYmoudGVtcGxhdGVOb2RlID0gdHNbIm5vZGUiXTsKKwl9CisJaWYoKCFvYmoudGVtcGxhdGVOb2RlKSYmKCFvYmoudGVtcGxhdGVTdHJpbmcpJiYodHBhdGgpKXsKKwkJLy8gZmV0Y2ggYSB0ZXh0IGZyYWdtZW50IGFuZCBhc3NpZ24gaXQgdG8gdGVtcGxhdGVTdHJpbmcKKwkJLy8gTk9URTogd2UgcmVseSBvbiBibG9ja2luZyBJTyBoZXJlIQorCQl2YXIgdHN0cmluZyA9IHRoaXMuX3Nhbml0aXplVGVtcGxhdGVTdHJpbmcoZG9qby5ob3N0ZW52LmdldFRleHQodHBhdGgpKTsKKworCQlvYmoudGVtcGxhdGVTdHJpbmcgPSB0c3RyaW5nOworCQlpZighYXZvaWRDYWNoZSl7CisJCQl0bXBsdHNbd3RdWyJzdHJpbmciXSA9IHRzdHJpbmc7CisJCX0KKwl9CisJaWYoKCF0c1sic3RyaW5nIl0pJiYoIWF2b2lkQ2FjaGUpKXsKKwkJdHMuc3RyaW5nID0gb2JqLnRlbXBsYXRlU3RyaW5nOworCX0KK30KKworZG9qby53aWRnZXQuX3Nhbml0aXplVGVtcGxhdGVTdHJpbmcgPSBmdW5jdGlvbigvKlN0cmluZyovdFN0cmluZyl7CisJLy9zdW1tYXJ5OiBTdHJpcHMgPD94bWwgLi4uPz4gZGVjbGFyYXRpb25zIHNvIHRoYXQgZXh0ZXJuYWwgU1ZHIGFuZCBYTUwKKwkvL2RvY3VtZW50cyBjYW4gYmUgYWRkZWQgdG8gYSBkb2N1bWVudCB3aXRob3V0IHdvcnJ5LiBBbHNvLCBpZiB0aGUgc3RyaW5nCisJLy9pcyBhbiBIVE1MIGRvY3VtZW50LCBvbmx5IHRoZSBwYXJ0IGluc2lkZSB0aGUgYm9keSB0YWcgaXMgcmV0dXJuZWQuCisJaWYodFN0cmluZyl7CisJCXRTdHJpbmcgPSB0U3RyaW5nLnJlcGxhY2UoL15ccyo8XD94bWwoXHMpK3ZlcnNpb249W1wnXCJdKFxkKSouKFxkKSpbXCdcIl0oXHMpKlw/Pi9pbSwgIiIpOworCQl2YXIgbWF0Y2hlcyA9IHRTdHJpbmcubWF0Y2goLzxib2R5W14+XSo+XHMqKFtcc1xTXSspXHMqPFwvYm9keT4vaW0pOworCQlpZihtYXRjaGVzKXsKKwkJCXRTdHJpbmcgPSBtYXRjaGVzWzFdOworCQl9CisJfWVsc2V7CisJCXRTdHJpbmcgPSAiIjsKKwl9CisJcmV0dXJuIHRTdHJpbmc7IC8vU3RyaW5nCit9CisKK2Rvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlLmR1bW15Q291bnQgPSAwOworCisvLyBBcnJheTogbGlzdCBvZiBwcm9wZXJ0aWVzIHRvIHNlYXJjaCBmb3Igbm9kZS10by1wcm9wZXJ0eSBtYXBwaW5ncworZG9qby53aWRnZXQuYXR0YWNoUHJvcGVydGllcyA9IFsiZG9qb0F0dGFjaFBvaW50IiwgImlkIl07CisKKy8vIFN0cmluZzogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXNlIGZvciBtYXBwaW5nIERPTSBldmVudHMgdG8gd2lkZ2V0IGZ1bmN0aW9ucworZG9qby53aWRnZXQuZXZlbnRBdHRhY2hQcm9wZXJ0eSA9ICJkb2pvQXR0YWNoRXZlbnQiOworCisvLyBTdHJpbmc6IHByb3BlcnR5IG5hbWUgb2YgY29kZSB0byBldmFsdWF0ZSB3aGVuIHRoZSB3aWRnZXQgaXMgY29uc3RydWN0ZWQKK2Rvam8ud2lkZ2V0Lm9uQnVpbGRQcm9wZXJ0eSA9ICJkb2pvT25CdWlsZCI7CisKKy8vIEFycmF5OiAgcG9zc2libGUgYWNjZXNzaWJpbGl0eSB2YWx1ZXMgdG8gc2V0IG9uIHdpZGdldCBlbGVtZW50cyAtIHJvbGUgb3Igc3RhdGUKK2Rvam8ud2lkZ2V0LndhaU5hbWVzICA9IFsid2FpUm9sZSIsICJ3YWlTdGF0ZSJdOworCitkb2pvLndpZGdldC53YWkgPSB7CisJLy8gc3VtbWFyeTogQ29udGFpbnMgZnVuY3Rpb25zIHRvIHNldCBhY2Nlc3NpYmlsaXR5IHJvbGVzIGFuZCBzdGF0ZXMKKwkvLwkJb250byB3aWRnZXQgZWxlbWVudHMKKwl3YWlSb2xlOiB7IAkKKwkJCQkvLyBuYW1lOiBTdHJpbmc6CisJCQkJLy8JCWluZm9ybWF0aW9uIGZvciBtYXBwaW5nIGFjY2Vzc2liaWxpdHkgcm9sZQorCQkJCW5hbWU6ICJ3YWlSb2xlIiwgCisJCQkJLy8gbmFtZXNwYWNlOiBTdHJpbmc6CisJCQkJLy8JCVVSSSBvZiB0aGUgbmFtZXNwYWNlIGZvciB0aGUgc2V0IG9mIHJvbGVzCisJCQkJIm5hbWVzcGFjZSI6ICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDIiLCAKKwkJCQkvLyBhbGlhczogU3RyaW5nOgorCQkJCS8vCQlUaGUgYWxpYXMgdG8gYXNzaWduIHRoZSBuYW1lc3BhY2UKKwkJCQlhbGlhczogIngyIiwKKwkJCQkvLyBwcmVmaXg6IFN0cmluZzoKKwkJCQkvLwkJVGhlIHByZWZpeCB0byBhc3NpZ24gdG8gdGhlIHJvbGUgdmFsdWUKKwkJCQlwcmVmaXg6ICJ3YWlyb2xlOiIKKwl9LAorCXdhaVN0YXRlOiB7IAorCQkJCS8vIG5hbWU6IFN0cmluZzoKKwkJCQkvLwkJaW5mb3JtYXRpb24gZm9yIG1hcHBpbmcgYWNjZXNzaWJpbGl0eSBzdGF0ZQorCQkJCW5hbWU6ICJ3YWlTdGF0ZSIsIAorCQkJCS8vIG5hbWVzcGFjZTogU3RyaW5nOgorCQkJCS8vCQlVUkkgb2YgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHNldCBvZiBzdGF0ZXMKKwkJCQkibmFtZXNwYWNlIjogImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDcvYWFhIiwgCisJCQkJLy8gYWxpYXM6IFN0cmluZzoKKwkJCQkvLwkJVGhlIGFsaWFzIHRvIGFzc2lnbiB0aGUgbmFtZXNwYWNlCisJCQkJYWxpYXM6ICJhYWEiLAorCQkJCS8vIHByZWZpeDogU3RyaW5nOgorCQkJCS8vCQllbXB0eSBzdHJpbmcgLSBzdGF0ZSB2YWx1ZSBkb2VzIG5vdCByZXF1aXJlIHByZWZpeAorCQkJCXByZWZpeDogIiIKKwl9LAorCXNldEF0dHI6IGZ1bmN0aW9uKC8qRG9tTm9kZSovbm9kZSwgLypTdHJpbmcqLyBucywgLypTdHJpbmcqLyBhdHRyLCAvKlN0cmluZ3xCb29sZWFuKi92YWx1ZSl7CisJCS8vIHN1bW1hcnk6IFVzZSBhcHByb3ByaWF0ZSBBUEkgdG8gc2V0IHRoZSByb2xlIG9yIHN0YXRlIGF0dHJpYnV0ZSBvbnRvIHRoZSBlbGVtZW50LgorCQkvLyBkZXNjcmlwdGlvbjogSW4gSUUgdXNlIHRoZSBnZW5lcmljIHNldEF0dHJpYnV0ZSgpIGFwaS4gIEFwcGVuZCBhIG5hbWVzcGFjZQorCQkvLyAgIGFsaWFzIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgYXBwcm9wcmlhdGUgcHJlZml4IHRvIHRoZSB2YWx1ZS4gCisJCS8vICAgT3RoZXJ3aXNlLCB1c2UgdGhlIHNldEF0dHJpYnVlTlMgYXBpIHRvIHNldCB0aGUgbmFtZXNwYWNlZCBhdHRyaWJ1dGUuIEFsc28KKwkJLy8gICBhZGQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCB0byB0aGUgYXR0cmlidXRlIHZhbHVlLgorCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCW5vZGUuc2V0QXR0cmlidXRlKHRoaXNbbnNdLmFsaWFzKyI6IisgYXR0ciwgdGhpc1tuc10ucHJlZml4K3ZhbHVlKTsKKwkJfWVsc2V7CisJCQlub2RlLnNldEF0dHJpYnV0ZU5TKHRoaXNbbnNdWyJuYW1lc3BhY2UiXSwgYXR0ciwgdGhpc1tuc10ucHJlZml4K3ZhbHVlKTsKKwkJfQorCX0sCisKKwlnZXRBdHRyOiBmdW5jdGlvbigvKkRvbU5vZGUqLyBub2RlLCAvKlN0cmluZyovIG5zLCAvKlN0cmluZ3xCb29sZW5hKi8gYXR0cil7CisJCS8vIFN1bW1hcnk6ICBVc2UgdGhlIGFwcHJvcHJpYXRlIEFQSSB0byByZXRyaWV2ZSB0aGUgcm9sZSBvciBzdGF0ZSB2YWx1ZQorCQkvLyBEZXNjcmlwdGlvbjogSW4gSUUgdXNlIHRoZSBnZW5lcmljIGdldEF0dHJpYnV0ZSgpIGFwaS4gIEFuIGFsaWFzIHZhbHVlIAorCQkvLyAJd2FzIGFkZGVkIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzaW11bGF0ZSBhIG5hbWVzcGFjZSB3aGVuIHRoZSBhdHRyaWJ1dGUKKwkJLy8gIHdhcyBzZXQuICBPdGhlcndpc2UgdXNlIHRoZSBnZXRBdHRyaWJ1dGVOUygpIGFwaSB0byByZXRyaWV2ZSB0aGUgc3RhdGUgdmFsdWUKKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQlyZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUodGhpc1tuc10uYWxpYXMrIjoiK2F0dHIpOworCQl9ZWxzZXsKKwkJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZU5TKHRoaXNbbnNdWyJuYW1lc3BhY2UiXSwgYXR0cik7CisJCX0KKwl9LAorCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKC8qRG9tTm9kZSovIG5vZGUsIC8qU3RyaW5nKi8gbnMsIC8qU3RyaW5nfEJvb2xlbmEqLyBhdHRyKXsKKwkJLy8gc3VtbWFyeTogIFVzZSB0aGUgYXBwcm9wcmlhdGUgQVBJIHRvIHJlbW92ZSB0aGUgcm9sZSBvciBzdGF0ZSB2YWx1ZQorCQkvLyBkZXNjcmlwdGlvbjogSW4gSUUgdXNlIHRoZSBnZW5lcmljIHJlbW92ZUF0dHJpYnV0ZSgpIGFwaS4gIEFuIGFsaWFzIHZhbHVlIAorCQkvLyAJd2FzIGFkZGVkIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzaW11bGF0ZSBhIG5hbWVzcGFjZSB3aGVuIHRoZSBhdHRyaWJ1dGUKKwkJLy8gIHdhcyBzZXQuICBPdGhlcndpc2UgdXNlIHRoZSByZW1vdmVBdHRyaWJ1dGVOUygpIGFwaSB0byByZW1vdmUgdGhlIHN0YXRlIHZhbHVlCisJCXZhciBzdWNjZXNzID0gdHJ1ZTsgLy9vbmx5IElFIHJldHVybnMgYSB2YWx1ZQorCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCSBzdWNjZXNzID0gbm9kZS5yZW1vdmVBdHRyaWJ1dGUodGhpc1tuc10uYWxpYXMrIjoiK2F0dHIpOworCQl9ZWxzZXsKKwkJCW5vZGUucmVtb3ZlQXR0cmlidXRlTlModGhpc1tuc11bIm5hbWVzcGFjZSJdLCBhdHRyKTsKKwkJfQorCQlyZXR1cm4gc3VjY2VzczsKKwl9Cit9OworCitkb2pvLndpZGdldC5hdHRhY2hUZW1wbGF0ZU5vZGVzID0gZnVuY3Rpb24ocm9vdE5vZGUsIC8qV2lkZ2V0Ki8gdGFyZ2V0T2JqLCBldmVudHMgKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQltYXAgd2lkZ2V0IHByb3BlcnRpZXMgYW5kIGZ1bmN0aW9ucyB0byB0aGUgaGFuZGxlcnMgc3BlY2lmaWVkIGluCisJLy8JCXRoZSBkb20gbm9kZSBhbmQgaXQncyBkZXNjZW5kYW50cy4gVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIGFsbAorCS8vCQlub2RlcyBhbmQgbG9va3MgZm9yIHRoZXNlIHByb3BlcnRpZXM6CisJLy8JCQkqIGRvam9BdHRhY2hQb2ludAorCS8vCQkJKiBkb2pvQXR0YWNoRXZlbnQJCisJLy8JCQkqIHdhaVJvbGUKKwkvLwkJCSogd2FpU3RhdGUKKwkvLwkJCSogYW55ICJkb2pvT24qIiBwcm9wcnRpZXMgcGFzc2VkIGluIHRoZSBldmVudHMgYXJyYXkKKwkvLyByb290Tm9kZTogRG9tTm9kZQorCS8vCQl0aGUgbm9kZSB0byBzZWFyY2ggZm9yIHByb3BlcnRpZXMuIEFsbCBjaGlsZHJlbiB3aWxsIGJlIHNlYXJjaGVkLgorCS8vIGV2ZW50czogQXJyYXkKKwkvLwkJYSBsaXN0IG9mIHByb3BlcnRpZXMgZ2VuZXJhdGVkIGZyb20gZ2V0RG9qb0V2ZW50c0Zyb21TdHIuCisKKwkvLyBGSVhNRTogdGhpcyBtZXRob2QgaXMgc3RpbGwgdGFraW5nIFdBQUFZIHRvbyBsb25nLiBXZSBuZWVkIHdheXMgb2Ygb3B0aW1pemluZzoKKwkvLwlhLikgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3Igb24gZWFjaCBub2RlCisJLy8JYi4pIHRoZSBub2RlcyB0aGF0IGFyZSBzdWJqZWN0IHRvIGludGVycm9nYXRpb24gKHVzZSB4cGF0aCBpbnN0ZWFkPykKKwkvLwljLikgaG93IGV4cGVuc2l2ZSBldmVudCBhc3NpZ25tZW50IGlzIChsZXNzIGV2YWwoKSwgbW9yZSBjb25uZWN0KCkpCisJLy8gdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKKwl2YXIgZWxlbWVudE5vZGVUeXBlID0gZG9qby5kb20uRUxFTUVOVF9OT0RFOworCisJZnVuY3Rpb24gdHJpbShzdHIpeworCQlyZXR1cm4gc3RyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7CisJfQorCisJaWYoIXJvb3ROb2RlKXsgCisJCXJvb3ROb2RlID0gdGFyZ2V0T2JqLmRvbU5vZGU7CisJfQorCisJaWYocm9vdE5vZGUubm9kZVR5cGUgIT0gZWxlbWVudE5vZGVUeXBlKXsKKwkJcmV0dXJuOworCX0KKwkvLyBhbGVydChldmVudHMubGVuZ3RoKTsKKworCXZhciBub2RlcyA9IHJvb3ROb2RlLmFsbCB8fCByb290Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCXZhciBfdGhpcyA9IHRhcmdldE9iajsKKwlmb3IodmFyIHg9LTE7IHg8bm9kZXMubGVuZ3RoOyB4KyspeworCQl2YXIgYmFzZU5vZGUgPSAoeCA9PSAtMSkgPyByb290Tm9kZSA6IG5vZGVzW3hdOworCQkvLyBGSVhNRTogaXMgdGhpcyBnb2luZyB0byBoYXZlIGNhcGl0YWxpemF0aW9uIHByb2JsZW1zPyAgQ291bGQgdXNlIGdldEF0dHJpYnV0ZShuYW1lLCAwKTsgdG8gZ2V0IGF0dHJpYnV0ZXMgY2FzZS1pbnNlbnNpdHZlCisJCXZhciBhdHRhY2hQb2ludCA9IFtdOworCQlpZighdGFyZ2V0T2JqLndpZGdldHNJblRlbXBsYXRlIHx8ICFiYXNlTm9kZS5nZXRBdHRyaWJ1dGUoJ2Rvam9UeXBlJykpeworCQkJZm9yKHZhciB5PTA7IHk8dGhpcy5hdHRhY2hQcm9wZXJ0aWVzLmxlbmd0aDsgeSsrKXsKKwkJCQl2YXIgdG1wQXR0YWNoUG9pbnQgPSBiYXNlTm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5hdHRhY2hQcm9wZXJ0aWVzW3ldKTsKKwkJCQlpZih0bXBBdHRhY2hQb2ludCl7CisJCQkJCWF0dGFjaFBvaW50ID0gdG1wQXR0YWNoUG9pbnQuc3BsaXQoIjsiKTsKKwkJCQkJZm9yKHZhciB6PTA7IHo8YXR0YWNoUG9pbnQubGVuZ3RoOyB6KyspeworCQkJCQkJaWYoZG9qby5sYW5nLmlzQXJyYXkodGFyZ2V0T2JqW2F0dGFjaFBvaW50W3pdXSkpeworCQkJCQkJCXRhcmdldE9ialthdHRhY2hQb2ludFt6XV0ucHVzaChiYXNlTm9kZSk7CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQl0YXJnZXRPYmpbYXR0YWNoUG9pbnRbel1dPWJhc2VOb2RlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdmFyIGF0dGFjaEV2ZW50ID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlKHRoaXMuZXZlbnRBdHRhY2hQcm9wZXJ0eSk7CisJCQlpZihhdHRhY2hFdmVudCl7CisJCQkJLy8gTk9URTogd2Ugd2FudCB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgdGhhdCBoYXZlIHRoZSBmb3JtCisJCQkJLy8gImRvbUV2ZW50OiBuYXRpdmVFdmVudDsgLi4uIgorCQkJCXZhciBldnRzID0gYXR0YWNoRXZlbnQuc3BsaXQoIjsiKTsKKwkJCQlmb3IodmFyIHk9MDsgeTxldnRzLmxlbmd0aDsgeSsrKXsKKwkJCQkJaWYoKCFldnRzW3ldKXx8KCFldnRzW3ldLmxlbmd0aCkpeyBjb250aW51ZTsgfQorCQkJCQl2YXIgdGhpc0Z1bmMgPSBudWxsOworCQkJCQl2YXIgdGV2dCA9IHRyaW0oZXZ0c1t5XSk7CisJCQkJCWlmKGV2dHNbeV0uaW5kZXhPZigiOiIpID49IDApeworCQkJCQkJLy8gb2gsIGlmIG9ubHkgSlMgaGFkIHR1cGxlIGFzc2lnbm1lbnQKKwkJCQkJCXZhciBmdW5jTmFtZUFyciA9IHRldnQuc3BsaXQoIjoiKTsKKwkJCQkJCXRldnQgPSB0cmltKGZ1bmNOYW1lQXJyWzBdKTsKKwkJCQkJCXRoaXNGdW5jID0gdHJpbShmdW5jTmFtZUFyclsxXSk7CisJCQkJCX0KKwkJCQkJaWYoIXRoaXNGdW5jKXsKKwkJCQkJCXRoaXNGdW5jID0gdGV2dDsKKwkJCQkJfQorCQorCQkJCQl2YXIgdGYgPSBmdW5jdGlvbigpeyAKKwkJCQkJCXZhciBudGYgPSBuZXcgU3RyaW5nKHRoaXNGdW5jKTsKKwkJCQkJCXJldHVybiBmdW5jdGlvbihldnQpeworCQkJCQkJCWlmKF90aGlzW250Zl0peworCQkJCQkJCQlfdGhpc1tudGZdKGRvam8uZXZlbnQuYnJvd3Nlci5maXhFdmVudChldnQsIHRoaXMpKTsKKwkJCQkJCQl9CisJCQkJCQl9OworCQkJCQl9KCk7CisJCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5hZGRMaXN0ZW5lcihiYXNlTm9kZSwgdGV2dCwgdGYsIGZhbHNlLCB0cnVlKTsKKwkJCQkJLy8gZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKGJhc2VOb2RlLCB0ZXZ0LCBkb2pvLmxhbmcuaGl0Y2goX3RoaXMsIHRoaXNGdW5jKSk7CisJCQkJfQorCQkJfQorCQorCQkJZm9yKHZhciB5PTA7IHk8ZXZlbnRzLmxlbmd0aDsgeSsrKXsKKwkJCQkvL2FsZXJ0KGV2ZW50c1t4XSk7CisJCQkJdmFyIGV2dFZhbCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZShldmVudHNbeV0pOworCQkJCWlmKChldnRWYWwpJiYoZXZ0VmFsLmxlbmd0aCkpeworCQkJCQl2YXIgdGhpc0Z1bmMgPSBudWxsOworCQkJCQl2YXIgZG9tRXZ0ID0gZXZlbnRzW3ldLnN1YnN0cig0KTsgLy8gY2xvYmVyIHRoZSAiZG9qbyIgcHJlZml4CisJCQkJCXRoaXNGdW5jID0gdHJpbShldnRWYWwpOworCQkJCQl2YXIgZnVuY3MgPSBbdGhpc0Z1bmNdOworCQkJCQlpZih0aGlzRnVuYy5pbmRleE9mKCI7Iik+PTApeworCQkJCQkJZnVuY3MgPSBkb2pvLmxhbmcubWFwKHRoaXNGdW5jLnNwbGl0KCI7IiksIHRyaW0pOworCQkJCQl9CisJCQkJCWZvcih2YXIgej0wOyB6PGZ1bmNzLmxlbmd0aDsgeisrKXsKKwkJCQkJCWlmKCFmdW5jc1t6XS5sZW5ndGgpeyBjb250aW51ZTsgfQorCQkJCQkJdmFyIHRmID0gZnVuY3Rpb24oKXsgCisJCQkJCQkJdmFyIG50ZiA9IG5ldyBTdHJpbmcoZnVuY3Nbel0pOworCQkJCQkJCXJldHVybiBmdW5jdGlvbihldnQpeworCQkJCQkJCQlpZihfdGhpc1tudGZdKXsKKwkJCQkJCQkJCV90aGlzW250Zl0oZG9qby5ldmVudC5icm93c2VyLmZpeEV2ZW50KGV2dCwgdGhpcykpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSgpOworCQkJCQkJZG9qby5ldmVudC5icm93c2VyLmFkZExpc3RlbmVyKGJhc2VOb2RlLCBkb21FdnQsIHRmLCBmYWxzZSwgdHJ1ZSk7CisJCQkJCQkvLyBkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoYmFzZU5vZGUsIGRvbUV2dCwgZG9qby5sYW5nLmhpdGNoKF90aGlzLCBmdW5jc1t6XSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIGNvbnRpbnVlOworCisJCS8vIEZJWE1FOiB3ZSBuZWVkIHRvIHB1dCB0aGlzIGludG8gc29tZSBraW5kIG9mIGxvb2t1cCBzdHJ1Y3R1cmUKKwkJLy8gaW5zdGVhZCBvZiBkaXJlY3QgYXNzaWdubWVudAorCQl2YXIgdG1wbHRQb2ludCA9IGJhc2VOb2RlLmdldEF0dHJpYnV0ZSh0aGlzLnRlbXBsYXRlUHJvcGVydHkpOworCQlpZih0bXBsdFBvaW50KXsKKwkJCXRhcmdldE9ialt0bXBsdFBvaW50XT1iYXNlTm9kZTsKKwkJfQorCisJCWRvam8ubGFuZy5mb3JFYWNoKGRvam8ud2lkZ2V0LndhaU5hbWVzLCBmdW5jdGlvbihuYW1lKXsKKwkJCXZhciB3YWkgPSBkb2pvLndpZGdldC53YWlbbmFtZV07CisJCQl2YXIgdmFsID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlKHdhaS5uYW1lKTsKKwkJCWlmKHZhbCl7CisJCQkJaWYodmFsLmluZGV4T2YoJy0nKSA9PSAtMSl7IAorCQkJCQlkb2pvLndpZGdldC53YWkuc2V0QXR0cihiYXNlTm9kZSwgd2FpLm5hbWUsICJyb2xlIiwgdmFsKTsKKwkJCQl9ZWxzZXsKKwkJCQkJLy8gdGhpcyBpcyBhIHN0YXRlLXZhbHVlIHBhaXIKKwkJCQkJdmFyIHN0YXRlUGFpciA9IHZhbC5zcGxpdCgnLScpOworCQkJCQlkb2pvLndpZGdldC53YWkuc2V0QXR0cihiYXNlTm9kZSwgd2FpLm5hbWUsIHN0YXRlUGFpclswXSwgc3RhdGVQYWlyWzFdKTsKKwkJCQl9CisJCQl9CisJCX0sIHRoaXMpOworCisJCXZhciBvbkJ1aWxkID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlKHRoaXMub25CdWlsZFByb3BlcnR5KTsKKwkJaWYob25CdWlsZCl7CisJCQlldmFsKCJ2YXIgbm9kZSA9IGJhc2VOb2RlOyB2YXIgd2lkZ2V0ID0gdGFyZ2V0T2JqOyAiK29uQnVpbGQpOworCQl9CisJfQorCit9CisKK2Rvam8ud2lkZ2V0LmdldERvam9FdmVudHNGcm9tU3RyID0gZnVuY3Rpb24oc3RyKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlnZW5lcmF0ZXMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBuYW1lcyB0aGF0IG1hdGNoIHRoZSBmb3JtCisJLy8JCWRvam9PbioKKwkvLyBzdHI6IFN0cmluZworCS8vCQl0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHNlYXJjaAorCQorCS8vIHZhciBsc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7CisJdmFyIHJlID0gLyhkb2pvT24oW2Etel0rKShccz8pKT0vZ2k7CisJdmFyIGV2dHMgPSBzdHIgPyBzdHIubWF0Y2gocmUpfHxbXSA6IFtdOworCXZhciByZXQgPSBbXTsKKwl2YXIgbGVtID0ge307CisJZm9yKHZhciB4PTA7IHg8ZXZ0cy5sZW5ndGg7IHgrKyl7CisJCWlmKGV2dHNbeF0ubGVuZ3RoIDwgMSl7IGNvbnRpbnVlOyB9CisJCXZhciBjbSA9IGV2dHNbeF0ucmVwbGFjZSgvXHMvLCAiIik7CisJCWNtID0gKGNtLnNsaWNlKDAsIGNtLmxlbmd0aC0xKSk7CisJCWlmKCFsZW1bY21dKXsKKwkJCWxlbVtjbV0gPSB0cnVlOworCQkJcmV0LnB1c2goY20pOworCQl9CisJfQorCXJldHVybiByZXQ7IC8vIEFycmF5Cit9CisKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRG9tV2lkZ2V0IiwgCisJZG9qby53aWRnZXQuV2lkZ2V0LAorCWZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlkb2pvLndpZGdldC5Eb21XaWRnZXQgaXMgdGhlIHN1cGVyY2xhc3MgdGhhdCBwcm92aWRlcyBiZWhhdmlvciBmb3IgYWxsCisJCS8vCQlET00tYmFzZWQgcmVuZGVyZXJzLCBpbmNsdWRpbmcgSHRtbFdpZGdldCBhbmQgU3ZnV2lkZ2V0LiBEb21XaWRnZXQKKwkJLy8JCWltcGxlbWVudHMgdGhlIHRlbXBsYXRpbmcgc3lzdGVtIHRoYXQgbW9zdCB3aWRnZXQgYXV0aG9ycyB1c2UgdG8gZGVmaW5lCisJCS8vCQl0aGUgVUkgZm9yIHRoZWlyIHdpZGdldHMuCisJCWlmKChhcmd1bWVudHMubGVuZ3RoPjApJiYodHlwZW9mIGFyZ3VtZW50c1swXSA9PSAib2JqZWN0IikpeworCQkJdGhpcy5jcmVhdGUoYXJndW1lbnRzWzBdKTsKKwkJfQorCX0sCisJewkJCQkJCQkgCisJCS8vIHRlbXBsYXRlTm9kZTogRG9tTm9kZQorCQkvLwkJYSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgd2lkZ2V0IHRlbXBsYXRlLiBQcmUtZW1wdHMgYm90aCB0ZW1wbGF0ZVN0cmluZyBhbmQgdGVtcGxhdGVQYXRoLgorCQl0ZW1wbGF0ZU5vZGU6IG51bGwsCisKKwkJLy8gdGVtcGxhdGVTdHJpbmcgU3RyaW5nOgorCQkvLwkJYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB3aWRnZXQgdGVtcGxhdGUuIFByZS1lbXB0cyB0aGUKKwkJLy8JCXRlbXBsYXRlUGF0aC4gSW4gYnVpbGRzIHRoYXQgaGF2ZSB0aGVpciBzdHJpbmdzICJpbnRlcm5lZCIsIHRoZQorCQkvLwkJdGVtcGxhdGVQYXRoIGlzIGNvbnZlcnRlZCB0byBhbiBpbmxpbmUgdGVtcGxhdGVTdHJpbmcsIHRoZXJlYnkKKwkJLy8JCXByZXZlbnRpbmcgYSBzeW5jaHJvbm91cyBuZXR3b3JrIGNhbGwuCisJCXRlbXBsYXRlU3RyaW5nOiBudWxsLAorCisJCS8vIHRlbXBsYXRlQ3NzU3RyaW5nIFN0cmluZzoKKwkJLy8JCWEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgQ1NTIGZvciB0aGUgd2lkZ2V0dGVtcGxhdGUuCisJCS8vCQlQcmUtZW1wdHMgdGhlIHRlbXBsYXRlQ3NzUGF0aC4gSW4gYnVpbGRzIHRoYXQgaGF2ZSB0aGVpcgorCQkvLwkJc3RyaW5ncyAiaW50ZXJuZWQiLCB0aGUgdGVtcGxhdGVDc3NQYXRoIGlzIGNvbnZlcnRlZCB0byBhbgorCQkvLwkJaW5saW5lIHRlbXBsYXRlQ3NzU3RyaW5nLCB0aGVyZWJ5IHByZXZlbnRpbmcgYSBzeW5jaHJvbm91cworCQkvLwkJbmV0d29yayBjYWxsLgorCQl0ZW1wbGF0ZUNzc1N0cmluZzogbnVsbCwKKworCQkvLyBwcmV2ZW50Q2xvYmJlciBCb29sZWFuOgorCQkvLwkJc2hvdWxkIHRoZSB3aWRnZXQgbm90IHJlcGxhY2UgdGhlIG5vZGUgZnJvbSB3aGljaCBpdCB3YXMKKwkJLy8JCWNvbnN0cnVjdGVkPyBXaWRnZXRzIHRoYXQgYXBwbHkgYmVoYXZpb3JzIHRvIHByZS1leGlzdGluZyBwYXJ0cworCQkvLwkJb2YgYSBwYWdlIGNhbiBiZSBpbXBsZW1lbnRlZCBlYXNpbHkgYnkgc2V0dGluZyB0aGlzIHRvICJ0cnVlIi4KKwkJLy8JCUluIHRoZXNlIGNhc2VzLCB0aGUgZG9tTm9kZSBwcm9wZXJ0eSB3aWxsIHBvaW50IHRvIHRoZSBub2RlCisJCS8vCQl3aGljaCB0aGUgd2lkZ2V0IHdhcyBjcmVhdGVkIGZyb20uCisJCXByZXZlbnRDbG9iYmVyOiBmYWxzZSwKKworCQkvLyBkb21Ob2RlIERvbU5vZGU6CisJCS8vCQl0aGlzIGlzIG91ciB2aXNpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWRnZXQhIE90aGVyIERPTQorCQkvLwkJTm9kZXMgbWF5IGJ5IGFzc2lnbmVkIHRvIG90aGVyIHByb3BlcnRpZXMsIHVzdWFsbHkgdGhyb3VnaCB0aGUKKwkJLy8JCXRlbXBsYXRlIHN5c3RlbSdzIGRvam9BdHRhY2hQb25pdCBzeW50YXgsIGJ1dCB0aGUgZG9tTm9kZQorCQkvLwkJcHJvcGVydHkgaXMgdGhlIGNhbm9uaWNhbCAidG9wIGxldmVsIiBub2RlIGluIHdpZGdldCBVSS4KKwkJZG9tTm9kZTogbnVsbCwgCisKKwkJLy8gY29udGFpbmVyTm9kZSBEb21Ob2RlOgorCQkvLwkJaG9sZHMgY2hpbGQgZWxlbWVudHMuICJjb250YWluZXJOb2RlIiBpcyBnZW5lcmFsbHkgc2V0IHZpYSBhCisJCS8vCQlkb2pvQXR0YWNoUG9pbnQgYXNzaWdubWVudCBhbmQgaXQgZGVzaWduYXRlcyB3aGVyZSB3aWRnZXRzIHRoYXQKKwkJLy8JCWFyZSBkZWZpbmVkIGFzICJjaGlsZHJlbiIgb2YgdGhlIHBhcmVudCB3aWxsIGJlIHBsYWNlZAorCQkvLwkJdmlzdWFsbHkuCisJCWNvbnRhaW5lck5vZGU6IG51bGwsCisKKwkJLy8gd2lkZ2V0c0luVGVtcGxhdGUgQm9vbGVhbjoKKwkJLy8JCXNob3VsZCB3ZSBwYXJzZSB0aGUgdGVtcGxhdGUgdG8gZmluZCB3aWRnZXRzIHRoYXQgbWlnaHQgYmUKKwkJLy8JCWRlY2xhcmVkIGluIG1hcmt1cCBpbnNpZGUgaXQ/IGZhbHNlIGJ5IGRlZmF1bHQuCisJCXdpZGdldHNJblRlbXBsYXRlOiBmYWxzZSwKKworCQlhZGRDaGlsZDogZnVuY3Rpb24oLypXaWRnZXQqLwl3aWRnZXQsIG92ZXJyaWRlQ29udGFpbmVyTm9kZSwgcG9zLCByZWYsIGluc2VydEluZGV4KXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJUHJvY2VzcyB0aGUgZ2l2ZW4gY2hpbGQgd2lkZ2V0LCBpbnNlcnRpbmcgaXQncyBkb20gbm9kZSBhcworCQkJLy8JCWEgY2hpbGQgb2Ygb3VyIGRvbSBub2RlCisJCQkvLyBvdmVycmlkZUNvbnRhaW5lck5vZGU6IERvbU5vZGU/CisJCQkvLwkJYSBub24tZGVmYXVsdCBjb250YWluZXIgbm9kZSBmb3IgdGhlIHdpZGdldAorCQkJLy8gcG9zOiBTdHJpbmc/CisJCQkvLwkJY2FuIGJlIG9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImZpcnN0Iiwgb3IgImxhc3QiLiBUaGlzCisJCQkvLwkJaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZG9qby5kb20uaW5zZXJ0QXRQb3NpdGlvbigpCisJCQkvLyByZWY6IERvbU5vZGU/CisJCQkvLwkJYSBub2RlIHRvIHBsYWNlIHRoZSB3aWRnZXQgcmVsYXRpdmUgdG8KKwkJCS8vIGluc2VydEluZGV4OiBpbnQ/CisJCQkvLwkJRE9NIGluZGV4LCBzYW1lIG1lYW5pbmcgYXMgaW4gZG9qby5kb20uaW5zZXJ0QXRJbmRleCgpCisJCQkvLyByZXR1cm5zOiB0aGUgd2lkZ2V0IHRoYXQgd2FzIGluc2VydGVkCisKKwkJCS8vIEZJWE1FOiBzaG91bGQgd2Ugc3VwcG9ydCBhZGRpdGlvbiBhdCBhbiBpbmRleCBpbiB0aGUgY2hpbGRyZW4gYXJyIGFuZAorCQkJLy8gb3JkZXIgdGhlIGRpc3BsYXkgYWNjb3JkaW5nbHk/IFJpZ2h0IG5vdyB3ZSBhbHdheXMgYXBwZW5kLgorCQkJaWYoIXRoaXMuaXNDb250YWluZXIpeyAvLyB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBjb250YWluIG90aGVyIHdpZGdldHMsIGl0IHNlZW1zCisJCQkJZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuRG9tV2lkZ2V0LmFkZENoaWxkKCkgYXR0ZW1wdGVkIG9uIG5vbi1jb250YWluZXIgd2lkZ2V0Iik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9ZWxzZXsKKwkJCQlpZihpbnNlcnRJbmRleCA9PSB1bmRlZmluZWQpeworCQkJCQlpbnNlcnRJbmRleCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOworCQkJCX0KKwkJCQl0aGlzLmFkZFdpZGdldEFzRGlyZWN0Q2hpbGQod2lkZ2V0LCBvdmVycmlkZUNvbnRhaW5lck5vZGUsIHBvcywgcmVmLCBpbnNlcnRJbmRleCk7CisJCQkJdGhpcy5yZWdpc3RlckNoaWxkKHdpZGdldCwgaW5zZXJ0SW5kZXgpOworCQkJfQorCQkJcmV0dXJuIHdpZGdldDsgLy8gV2lkZ2V0CisJCX0sCisJCQorCQlhZGRXaWRnZXRBc0RpcmVjdENoaWxkOiBmdW5jdGlvbigvKldpZGdldCovCXdpZGdldCwgb3ZlcnJpZGVDb250YWluZXJOb2RlLCBwb3MsIHJlZiwgaW5zZXJ0SW5kZXgpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlQcm9jZXNzIHRoZSBnaXZlbiBjaGlsZCB3aWRnZXQsIGluc2VydGluZyBpdCdzIGRvbSBub2RlIGFzCisJCQkvLwkJYSBjaGlsZCBvZiBvdXIgZG9tIG5vZGUKKwkJCS8vIG92ZXJyaWRlQ29udGFpbmVyTm9kZTogRG9tTm9kZQorCQkJLy8JCWEgbm9uLWRlZmF1bHQgY29udGFpbmVyIG5vZGUgZm9yIHRoZSB3aWRnZXQKKwkJCS8vIHBvczogU3RyaW5nPworCQkJLy8JCWNhbiBiZSBvbmUgb2YgImJlZm9yZSIsICJhZnRlciIsICJmaXJzdCIsIG9yICJsYXN0Ii4gVGhpcworCQkJLy8JCWhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRvam8uZG9tLmluc2VydEF0UG9zaXRpb24oKQorCQkJLy8gcmVmOiBEb21Ob2RlPworCQkJLy8JCWEgbm9kZSB0byBwbGFjZSB0aGUgd2lkZ2V0IHJlbGF0aXZlIHRvCisJCQkvLyBpbnNlcnRJbmRleDogaW50PworCQkJLy8JCURPTSBpbmRleCwgc2FtZSBtZWFuaW5nIGFzIGluIGRvam8uZG9tLmluc2VydEF0SW5kZXgoKQorCQkJaWYoKCF0aGlzLmNvbnRhaW5lck5vZGUpJiYoIW92ZXJyaWRlQ29udGFpbmVyTm9kZSkpeworCQkJCXRoaXMuY29udGFpbmVyTm9kZSA9IHRoaXMuZG9tTm9kZTsKKwkJCX0KKwkJCXZhciBjbiA9IChvdmVycmlkZUNvbnRhaW5lck5vZGUpID8gb3ZlcnJpZGVDb250YWluZXJOb2RlIDogdGhpcy5jb250YWluZXJOb2RlOworCQkJaWYoIXBvcyl7IHBvcyA9ICJhZnRlciI7IH0KKwkJCWlmKCFyZWYpeyAKKwkJCQlpZighY24peyBjbiA9IGRvam8uYm9keSgpOyB9CisJCQkJcmVmID0gY24ubGFzdENoaWxkOyAKKwkJCX0KKwkJCWlmKCFpbnNlcnRJbmRleCkgeyBpbnNlcnRJbmRleCA9IDA7IH0KKwkJCXdpZGdldC5kb21Ob2RlLnNldEF0dHJpYnV0ZSgiZG9qb2luc2VydGlvbmluZGV4IiwgaW5zZXJ0SW5kZXgpOworCisJCQkvLyBpbnNlcnQgdGhlIGNoaWxkIHdpZGdldCBkb21Ob2RlIGRpcmVjdGx5IHVuZGVybmVhdGggbXkgZG9tTm9kZSwgaW4gdGhlCisJCQkvLyBzcGVjaWZpZWQgcG9zaXRpb24gKGJ5IGRlZmF1bHQsIGFwcGVuZCB0byBlbmQpCisJCQlpZighcmVmKXsKKwkJCQljbi5hcHBlbmRDaGlsZCh3aWRnZXQuZG9tTm9kZSk7CisJCQl9ZWxzZXsKKwkJCQkvLyBGSVhNRTogd2FzIHRoaXMgbWVhbnQgdG8gYmUgdGhlICh1Z2x5IGhhY2spIHdheSB0byBzdXBwb3J0IGluc2VydCBAIGluZGV4PworCQkJCS8vZG9qby5kb21bcG9zXSh3aWRnZXQuZG9tTm9kZSwgcmVmLCBpbnNlcnRJbmRleCk7CisKKwkJCQkvLyBDQUw6IHRoaXMgYXBwZWFycyB0byBiZSB0aGUgaW50ZW5kZWQgd2F5IHRvIGluc2VydCBhIG5vZGUgYXQgYSBnaXZlbiBwb3NpdGlvbi4uLgorCQkJCWlmIChwb3MgPT0gJ2luc2VydEF0SW5kZXgnKXsKKwkJCQkJLy8gZG9qby5kZWJ1ZygiaWR4OiIsIGluc2VydEluZGV4LCAiaXNMYXN0OiIsIHJlZiA9PT0gY24ubGFzdENoaWxkKTsKKwkJCQkJZG9qby5kb20uaW5zZXJ0QXRJbmRleCh3aWRnZXQuZG9tTm9kZSwgcmVmLnBhcmVudE5vZGUsIGluc2VydEluZGV4KTsKKwkJCQl9ZWxzZXsKKwkJCQkJLy8gZG9qby5kZWJ1ZygicG9zOiIsIHBvcywgImlzTGFzdDoiLCByZWYgPT09IGNuLmxhc3RDaGlsZCk7CisJCQkJCWlmKChwb3MgPT0gImFmdGVyIikmJihyZWYgPT09IGNuLmxhc3RDaGlsZCkpeworCQkJCQkJY24uYXBwZW5kQ2hpbGQod2lkZ2V0LmRvbU5vZGUpOworCQkJCQl9ZWxzZXsKKwkJCQkJCWRvam8uZG9tLmluc2VydEF0UG9zaXRpb24od2lkZ2V0LmRvbU5vZGUsIGNuLCBwb3MpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9LAorCisJCXJlZ2lzdGVyQ2hpbGQ6IGZ1bmN0aW9uKHdpZGdldCwgaW5zZXJ0aW9uSW5kZXgpeworCQkJLy8gc3VtbWFyeTogcmVjb3JkIHRoYXQgZ2l2ZW4gd2lkZ2V0IGRlc2NlbmRzIGZyb20gbWUKKwkJCS8vIHdpZGdldDogV2lkZ2V0CisJCQkvLwkJdGhlIHdpZGdldCB0aGF0IGlzIG5vdyBhIGNoaWxkCisJCQkvLyBpbnNlcnRpb25JbmRleDogaW50CisJCQkvLwkJd2hlcmUgaW4gdGhlIGNoaWxkcmVuW10gYXJyYXkgdG8gcGxhY2UgaXQKKworCQkJLy8gd2UgbmVlZCB0byBpbnNlcnQgdGhlIGNoaWxkIGF0IHRoZSByaWdodCBwb2ludCBpbiB0aGUgcGFyZW50J3MgCisJCQkvLyAnY2hpbGRyZW4nIGFycmF5LCBiYXNlZCBvbiB0aGUgaW5zZXJ0aW9uSW5kZXgKKworCQkJd2lkZ2V0LmRvam9JbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4OworCisJCQl2YXIgaWR4ID0gLTE7CisJCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKworCQkJCS8vVGhpcyBhcHBlYXJzIHRvIGZpeCBhbiBvdXQgb2Ygb3JkZXIgaXNzdWUgaW4gdGhlIGNhc2Ugb2YgbWl4ZWQKKwkJCQkvL21hcmt1cCBhbmQgcHJvZ3JhbW1hdGljYWxseSBhZGRlZCBjaGlsZHJlbi4gIFByZXZpb3VzbHksIGlmIGEgY2hpbGQKKwkJCQkvL2V4aXN0ZWQgZnJvbSBtYXJrdXAsIGFuZCBhbm90aGVyIGNoaWxkIHdhcyBhZGRDaGlsZCgpZCB3aXRob3V0IHNwZWNpZnlpbmcKKwkJCQkvL2FueSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMsIGl0IHdvdWxkIGVuZCB1cCBmaXJzdCBpbiB0aGUgbGlzdCwgd2hlbiBpbiBmYWN0CisJCQkJLy9pdCBzaG91bGQgYmUgYWZ0ZXIuICBJIGNhbid0IHNlZSBjYXNlcyB3aGVyZSB0aGlzIHdvdWxkIGJyZWFrIHRoaW5ncywgYnV0CisJCQkJLy9JIGNvdWxkIHNlZSBubyBvdGhlciBvYnZpb3VzIHNvbHV0aW9uLiAtZHVzdGluCisKKwkJCQlpZiAodGhpcy5jaGlsZHJlbltpXS5kb2pvSW5zZXJ0aW9uSW5kZXggPD0gaW5zZXJ0aW9uSW5kZXgpeworCQkJCQlpZHggPSBpOworCQkJCX0KKwkJCX0KKworCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaWR4KzEsIDAsIHdpZGdldCk7CisKKwkJCXdpZGdldC5wYXJlbnQgPSB0aGlzOworCQkJd2lkZ2V0LmFkZGVkVG8odGhpcywgaWR4KzEpOworCQkJCisJCQkvLyBJZiB0aGlzIHdpZGdldCB3YXMgY3JlYXRlZCBwcm9ncmFtYXRpY2FsbHksIHRoZW4gaXQgd2FzIGVycm9uZW91c2x5IGFkZGVkCisJCQkvLyB0byBkb2pvLndpZGdldC5tYW5hZ2VyLnRvcFdpZGdldHMuICBGaXggdGhhdCBoZXJlLgorCQkJZGVsZXRlIGRvam8ud2lkZ2V0Lm1hbmFnZXIudG9wV2lkZ2V0c1t3aWRnZXQud2lkZ2V0SWRdOworCQl9LAorCisJCXJlbW92ZUNoaWxkOiBmdW5jdGlvbigvKldpZGdldCovIHdpZGdldCl7CisJCQkvLyBzdW1tYXJ5OiBkZXRhY2ggY2hpbGQgZG9tTm9kZSBmcm9tIHBhcmVudCBkb21Ob2RlCisJCQlkb2pvLmRvbS5yZW1vdmVOb2RlKHdpZGdldC5kb21Ob2RlKTsKKworCQkJLy8gcmVtb3ZlIGNoaWxkIHdpZGdldCBmcm9tIHBhcmVudCB3aWRnZXQgCisJCQlyZXR1cm4gZG9qby53aWRnZXQuRG9tV2lkZ2V0LnN1cGVyY2xhc3MucmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLCB3aWRnZXQpOyAvLyBXaWRnZXQKKwkJfSwKKworCQlnZXRGcmFnTm9kZVJlZjogZnVuY3Rpb24oZnJhZyl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCXJldHVybnMgdGhlIHNvdXJjZSBub2RlLCBpZiBhbnksIHRoYXQgdGhlIHdpZGdldCB3YXMKKwkJCS8vCQlkZWNsYXJlZCBmcm9tCisJCQkvLyBmcmFnOiBPYmplY3QKKwkJCS8vCQlhbiBvcGFxdWUgZGF0YSBzdHJ1Y3R1cmUgZ2VuZXJhdGVkIGJ5IHRoZSBmaXJzdC1wYXNzIHBhcnNlcgorCQkJaWYoIWZyYWcpe3JldHVybiBudWxsO30gLy8gbnVsbAorCQkJaWYoIWZyYWdbdGhpcy5nZXROYW1lc3BhY2VkVHlwZSgpXSl7CisJCQkJZG9qby5yYWlzZSgiRXJyb3I6IG5vIGZyYWcgZm9yIHdpZGdldCB0eXBlICIgKyB0aGlzLmdldE5hbWVzcGFjZWRUeXBlKCkgCisJCQkJCSsgIiwgaWQgIiArIHRoaXMud2lkZ2V0SWQKKwkJCQkJKyAiIChtYXliZSBhIHdpZGdldCBoYXMgc2V0IGl0J3MgdHlwZSBpbmNvcnJlY3RseSkiKTsKKwkJCX0KKwkJCXJldHVybiBmcmFnW3RoaXMuZ2V0TmFtZXNwYWNlZFR5cGUoKV1bIm5vZGVSZWYiXTsgLy8gRG9tTm9kZQorCQl9LAorCQkKKwkJcG9zdEluaXRpYWxpemU6IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gYXJncywgLypPYmplY3QqLyBmcmFnLCAvKldpZGdldCovIHBhcmVudENvbXApeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlSZXBsYWNlIHRoZSBzb3VyY2UgZG9tTm9kZSB3aXRoIHRoZSBnZW5lcmF0ZWQgZG9tCisJCQkvLwkJc3RydWN0dXJlLCBhbmQgcmVnaXN0ZXIgdGhlIHdpZGdldCB3aXRoIGl0cyBwYXJlbnQuCisJCQkvLwkJVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3R1YiBmdW5jdGlvbiBkZWZpbmVkIGluCisJCQkvLwkJZG9qby53aWRnZXQuV2lkZ2V0LgorCQkJCisJCQkvL2Rvam8ucHJvZmlsZS5zdGFydCh0aGlzLndpZGdldFR5cGUgKyAiIHBvc3RJbml0aWFsaXplIik7CisJCQkKKwkJCXZhciBzb3VyY2VOb2RlUmVmID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwkJCS8vIFN0aWNrIG15IGdlbmVyYXRlZCBkb20gaW50byB0aGUgb3V0cHV0IHRyZWUKKwkJCS8vYWxlcnQodGhpcy53aWRnZXRJZCArICI6IHJlcGxhY2luZyAiICsgc291cmNlTm9kZVJlZiArICIgd2l0aCAiICsgdGhpcy5kb21Ob2RlLmlubmVySFRNTCk7CisJCQlpZiAocGFyZW50Q29tcCAmJiAocGFyZW50Q29tcC5zbmFyZkNoaWxkRG9tT3V0cHV0IHx8ICFzb3VyY2VOb2RlUmVmKSl7CisJCQkJLy8gQWRkIG15IGdlbmVyYXRlZCBkb20gYXMgYSBkaXJlY3QgY2hpbGQgb2YgbXkgcGFyZW50IHdpZGdldAorCQkJCS8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBnZW5lcmF0ZWQgd2lkZ2V0cywgYW5kIGFsc28gY2FzZXMgd2hlcmUgSSBhbSBnZW5lcmF0aW5nIGFuCisJCQkJLy8gPGxpPiBub2RlIHRoYXQgY2FuJ3QgYmUgaW5zZXJ0ZWQgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCBET00gdHJlZQorCQkJCXBhcmVudENvbXAuYWRkV2lkZ2V0QXNEaXJlY3RDaGlsZCh0aGlzLCAiIiwgImluc2VydEF0SW5kZXgiLCAiIiwgIGFyZ3NbImRvam9pbnNlcnRpb25pbmRleCJdLCBzb3VyY2VOb2RlUmVmKTsKKwkJCX0gZWxzZSBpZiAoc291cmNlTm9kZVJlZil7CisJCQkJLy8gRG8gaW4tcGxhY2UgcmVwbGFjZW1lbnQgb2YgdGhlIG15IHNvdXJjZSBub2RlIHdpdGggbXkgZ2VuZXJhdGVkIGRvbQorCQkJCWlmKHRoaXMuZG9tTm9kZSAmJiAodGhpcy5kb21Ob2RlICE9PSBzb3VyY2VOb2RlUmVmKSl7CisJCQkJCXRoaXMuX3NvdXJjZU5vZGVSZWYgPSBkb2pvLmRvbS5yZXBsYWNlTm9kZShzb3VyY2VOb2RlUmVmLCB0aGlzLmRvbU5vZGUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gUmVnaXN0ZXIgbXlzZWxmIHdpdGggbXkgcGFyZW50LCBvciB3aXRoIHRoZSB3aWRnZXQgbWFuYWdlciBpZgorCQkJLy8gSSBoYXZlIG5vIHBhcmVudAorCQkJLy8gVE9ETzogdGhlIGNvZGUgYmVsb3cgZXJyb25lb3VzbHkgYWRkcyBhbGwgcHJvZ3JhbWF0aWNhbGx5IGdlbmVyYXRlZCB3aWRnZXRzCisJCQkvLyB0byB0b3BXaWRnZXRzIChzaW5jZSB3ZSBkb24ndCBrbm93IHdobyB0aGUgcGFyZW50IGlzIHVudGlsIGFmdGVyIGNyZWF0aW9uIGZpbmlzaGVzKQorCQkJaWYgKCBwYXJlbnRDb21wICkgeworCQkJCXBhcmVudENvbXAucmVnaXN0ZXJDaGlsZCh0aGlzLCBhcmdzLmRvam9pbnNlcnRpb25pbmRleCk7CisJCQl9IGVsc2UgeworCQkJCWRvam8ud2lkZ2V0Lm1hbmFnZXIudG9wV2lkZ2V0c1t0aGlzLndpZGdldElkXT10aGlzOworCQkJfQorCisJCQlpZih0aGlzLndpZGdldHNJblRlbXBsYXRlKXsKKwkJCQl2YXIgcGFyc2VyID0gbmV3IGRvam8ueG1sLlBhcnNlKCk7CisKKwkJCQl2YXIgc3ViQ29udGFpbmVyTm9kZTsKKwkJCQkvL1RPRE86IHVzZSB4cGF0aCBoZXJlPworCQkJCXZhciBzdWJub2RlcyA9IHRoaXMuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCQkJCWZvcih2YXIgaT0wO2k8c3Vibm9kZXMubGVuZ3RoO2krKyl7CisJCQkJCWlmKHN1Ym5vZGVzW2ldLmdldEF0dHJpYnV0ZSgnZG9qb0F0dGFjaFBvaW50JykgPT0gJ3N1YkNvbnRhaW5lcldpZGdldCcpeworCQkJCQkJc3ViQ29udGFpbmVyTm9kZSA9IHN1Ym5vZGVzW2ldOworLy8JCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZihzdWJub2Rlc1tpXS5nZXRBdHRyaWJ1dGUoJ2Rvam9UeXBlJykpeworCQkJCQkJc3Vibm9kZXNbaV0uc2V0QXR0cmlidXRlKCdpc1N1YldpZGdldCcsIHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh0aGlzLmlzQ29udGFpbmVyICYmICF0aGlzLmNvbnRhaW5lck5vZGUpeworCQkJCQkvL25vIGNvbnRhaW5lck5vZGUgaXMgYXZhaWxhYmxlLCB3aGljaCBtZWFucyBhIHdpZGdldCBpcyB1c2VkIGFzIGEgY29udGFpbmVyLiBmaW5kIGl0IGhlcmUgYW5kIG1vdmUKKwkJCQkJLy9hbGwgZG9tIG5vZGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaHRtbCBwYWdlIGFzIGNoaWxkcmVuIG9mIHRoaXMuZG9tTm9kZSBpbnRvIHRoZSBhY3R1YWwgY29udGFpbmVyCisJCQkJCS8vd2lkZ2V0J3Mgbm9kZSAoYXQgdGhpcyBwb2ludCwgdGhlIHN1YndpZGdldHMgZGVmaW5lZCBpbiB0aGUgdGVtcGxhdGUgZmlsZSBpcyBub3QgcGFyc2VkIHlldCkKKwkJCQkJaWYoc3ViQ29udGFpbmVyTm9kZSl7CisJCQkJCQl2YXIgc3JjID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwkJCQkJCWlmIChzcmMpeworCQkJCQkJCWRvam8uZG9tLm1vdmVDaGlsZHJlbihzcmMsIHN1YkNvbnRhaW5lck5vZGUpOworCQkJCQkJCS8vZG8gbm90IG5lZWQgdG8gZm9sbG93IGNoaWxkcmVuIG5vZGVzIGluIHRoZSBtYWluIGh0bWwgcGFnZSwgYXMgdGhleQorCQkJCQkJCS8vd2lsbCBiZSBkZWFsdCB3aXRoIGluIHRoZSBzdWJDb250YWluZXJXaWRnZXQKKwkJCQkJCQlmcmFnWydkb2pvRG9udEZvbGxvdyddID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfWVsc2V7CisJCQkJCQlkb2pvLmRlYnVnKCJObyBzdWJDb250YWluZXJXaWRnZXQgbm9kZSBjYW4gYmUgZm91bmQgaW4gdGVtcGxhdGUgZmlsZSBmb3Igd2lkZ2V0ICIrdGhpcyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl2YXIgdGVtcGxhdGVmcmFnID0gcGFyc2VyLnBhcnNlRWxlbWVudCh0aGlzLmRvbU5vZGUsIG51bGwsIHRydWUpOworCQkJCS8vIGNyZWF0ZVN1YkNvbXBvbmVudHMgbm90IGNyZWF0ZUNvbXBvbmVudHMgYmVjYXVzZSBmcmFnIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAorCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZVN1YkNvbXBvbmVudHModGVtcGxhdGVmcmFnLCB0aGlzKTsKKwkKKwkJCQkvL2ZpbmQgYWxsIHRoZSBzdWIgd2lkZ2V0cyBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZSBmaWxlIG9mIHRoaXMgd2lkZ2V0CisJCQkJdmFyIHN1YndpZGdldHMgPSBbXTsKKwkJCQl2YXIgc3RhY2sgPSBbdGhpc107CisJCQkJdmFyIHc7CisJCQkJd2hpbGUoKHcgPSBzdGFjay5wb3AoKSkpeworCQkJCQlmb3IodmFyIGkgPSAwOyBpIDwgdy5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7CisJCQkJCQl2YXIgY3dpZGdldCA9IHcuY2hpbGRyZW5baV07CisJCQkJCQlpZihjd2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzIHx8ICFjd2lkZ2V0LmV4dHJhQXJnc1snaXNzdWJ3aWRnZXQnXSl7IGNvbnRpbnVlOyB9CisJCQkJCQlzdWJ3aWRnZXRzLnB1c2goY3dpZGdldCk7CisJCQkJCQlpZihjd2lkZ2V0LmlzQ29udGFpbmVyKXsKKwkJCQkJCQlzdGFjay5wdXNoKGN3aWRnZXQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQorCQkJCS8vY29ubmVjdCBldmVudCB0byB0aGlzIHdpZGdldC9hdHRhY2ggZG9tIG5vZGUKKwkJCQlmb3IodmFyIGkgPSAwOyBpIDwgc3Vid2lkZ2V0cy5sZW5ndGg7IGkrKyl7CisJCQkJCXZhciB3aWRnZXQgPSBzdWJ3aWRnZXRzW2ldOworCQkJCQlpZih3aWRnZXQuX3Byb2Nlc3NlZFN1YldpZGdldHMpeworCQkJCQkJZG9qby5kZWJ1ZygiVGhpcyBzaG91bGQgbm90IGhhcHBlbjogd2lkZ2V0Ll9wcm9jZXNzZWRTdWJXaWRnZXRzIGlzIGFscmVhZHkgdHJ1ZSEiKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQl3aWRnZXQuX3Byb2Nlc3NlZFN1YldpZGdldHMgPSB0cnVlOworCQkJCQlpZih3aWRnZXQuZXh0cmFBcmdzWydkb2pvYXR0YWNoZXZlbnQnXSl7CisJCQkJCQl2YXIgZXZ0cyA9IHdpZGdldC5leHRyYUFyZ3NbJ2Rvam9hdHRhY2hldmVudCddLnNwbGl0KCI7Iik7CisJCQkJCQlmb3IodmFyIGo9MDsgajxldnRzLmxlbmd0aDsgaisrKXsKKwkJCQkJCQl2YXIgdGhpc0Z1bmMgPSBudWxsOworCQkJCQkJCXZhciB0ZXZ0ID0gZG9qby5zdHJpbmcudHJpbShldnRzW2pdKTsKKwkJCQkJCQlpZih0ZXZ0LmluZGV4T2YoIjoiKSA+PSAwKXsKKwkJCQkJCQkJLy8gb2gsIGlmIG9ubHkgSlMgaGFkIHR1cGxlIGFzc2lnbm1lbnQKKwkJCQkJCQkJdmFyIGZ1bmNOYW1lQXJyID0gdGV2dC5zcGxpdCgiOiIpOworCQkJCQkJCQl0ZXZ0ID0gZG9qby5zdHJpbmcudHJpbShmdW5jTmFtZUFyclswXSk7CisJCQkJCQkJCXRoaXNGdW5jID0gZG9qby5zdHJpbmcudHJpbShmdW5jTmFtZUFyclsxXSk7CisJCQkJCQkJfQorCQkJCQkJCWlmKCF0aGlzRnVuYyl7CisJCQkJCQkJCXRoaXNGdW5jID0gdGV2dDsKKwkJCQkJCQl9CisJCQkJCQkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24od2lkZ2V0W3RldnRdKSl7CisJCQkJCQkJCWRvam8uZXZlbnQua3dDb25uZWN0KHsKKwkJCQkJCQkJCXNyY09iajogd2lkZ2V0LCAKKwkJCQkJCQkJCXNyY0Z1bmM6IHRldnQsIAorCQkJCQkJCQkJdGFyZ2V0T2JqOiB0aGlzLCAKKwkJCQkJCQkJCXRhcmdldEZ1bmM6IHRoaXNGdW5jCisJCQkJCQkJCX0pOworCQkJCQkJCX1lbHNleworCQkJCQkJCQlhbGVydCh0ZXZ0KyIgaXMgbm90IGEgZnVuY3Rpb24gaW4gd2lkZ2V0ICIrd2lkZ2V0KTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkKKwkJCQkJaWYod2lkZ2V0LmV4dHJhQXJnc1snZG9qb2F0dGFjaHBvaW50J10peworCQkJCQkJLy9kb24ndCBhdHRhY2ggd2lkZ2V0LmRvbU5vZGUgaGVyZSwgYXMgd2UgZG8gbm90IGtub3cgd2hpY2gKKwkJCQkJCS8vZG9tIG5vZGUgd2Ugc2hvdWxkIGNvbm5lY3QgdG8gKGluIGNoZWNrYm94IHdpZGdldCBjYXNlLCAKKwkJCQkJCS8vaXQgaXMgaW5wdXROb2RlKS4gU28gd2UgbWFrZSB0aGUgd2lkZ2V0IGl0c2VsZiBhdmFpbGFibGUKKwkJCQkJCXRoaXNbd2lkZ2V0LmV4dHJhQXJnc1snZG9qb2F0dGFjaHBvaW50J11dID0gd2lkZ2V0OworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvL2Rvam8ucHJvZmlsZS5lbmQodGhpcy53aWRnZXRUeXBlICsgIiBwb3N0SW5pdGlhbGl6ZSIpOworCisJCQkvLyBFeHBhbmQgbXkgY2hpbGRyZW4gd2lkZ2V0cworCQkJLyogZG9qb0RvbnRGb2xsb3cgaXMgaW1wb3J0YW50IGZvciBhIHZlcnkgc3BlY2lhbCBjYXNlCisJCQkgKiBiYXNpY2FsbHkgaWYgeW91IGhhdmUgYSB3aWRnZXQgdGhhdCB5b3UgaW5zdGFudGlhdGUgZnJvbSBzY3JpcHQKKwkJCSAqIGFuZCB0aGF0IHdpZGdldCBpcyBhIGNvbnRhaW5lciwgYW5kIGl0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgcGFyZW50CisJCQkgKiBpbnN0YW5jZSwgdGhlIHBhcnNlciB3aWxsIHN0YXJ0IHJlY3Vyc2l2ZWx5IHBhcnNpbmcgdW50aWwgdGhlIGJyb3dzZXIKKwkJCSAqIGNvbXBsYWlucy4gIFNvIHRoZSBzb2x1dGlvbiBpcyB0byBzZXQgYW4gaW5pdGlhbGl6YXRpb24gcHJvcGVydHkgb2YgCisJCQkgKiBkb2pvRG9udEZvbGxvdzogdHJ1ZSBhbmQgdGhlbiBpdCB3b24ndCByZWN1cnNlIHdoZXJlIGl0IHNob3VsZG4ndAorCQkJICovCisJCQlpZih0aGlzLmlzQ29udGFpbmVyICYmICFmcmFnWyJkb2pvRG9udEZvbGxvdyJdKXsKKwkJCQkvL2FsZXJ0KCJyZWN1cnNlIGZyb20gIiArIHRoaXMud2lkZ2V0SWQpOworCQkJCS8vIGJ1aWxkIGFueSBzdWItY29tcG9uZW50cyB3aXRoIHVzIGFzIHRoZSBwYXJlbnQKKwkJCQlkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKGZyYWcsIHRoaXMpOworCQkJfQorCQl9LAorCisJCS8vIG1ldGhvZCBvdmVyLXJpZGUKKwkJYnVpbGRSZW5kZXJpbmc6IGZ1bmN0aW9uKC8qT2JqZWN0Ki8gYXJncywgLypPYmplY3QqLyBmcmFnKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJQ29uc3RydWN0IHRoZSBVSSBmb3IgdGhpcyB3aWRnZXQsIGdlbmVyYWxseSBmcm9tIGEKKwkJCS8vCQl0ZW1wbGF0ZS4gVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gZm9yIGN1c3RvbSBVSSBjcmVhdGlvbiB0bworCQkJLy8JCXRvIHNpZGUtc3RlcCB0aGUgdGVtcGxhdGUgc3lzdGVtLiAgVGhpcyBpcyBhbgorCQkJLy8JCWltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHViIGZ1bmN0aW9uIGRlZmluZWQgaW4KKwkJCS8vCQlkb2pvLndpZGdldC5XaWRnZXQuCisKKwkJCS8vIERPTSB3aWRnZXRzIGNvbnN0cnVjdCB0aGVtc2VsdmVzIGZyb20gYSB0ZW1wbGF0ZQorCQkJdmFyIHRzID0gZG9qby53aWRnZXQuX3RlbXBsYXRlQ2FjaGVbdGhpcy53aWRnZXRUeXBlXTsKKwkJCQorCQkJLy8gSGFuZGxlIHN0eWxlIGZvciB0aGlzIHdpZGdldCBoZXJlLCBhcyBldmVuIGlmIHRlbXBsYXRlUGF0aAorCQkJLy8gaXMgbm90IHNldCwgc3R5bGUgc3BlY2lmaWVkIGJ5IHRlbXBsYXRlQ3NzU3RyaW5nIG9yIHRlbXBsYXRlQ3NzUGF0aAorCQkJLy8gc2hvdWxkIGJlIGFwcGxpZWQuIHRlbXBsYXRlQ3NzU3RyaW5nIGhhcyBoaWdoZXIgcHJpb3JpdHkKKwkJCS8vIHRoYW4gdGVtcGxhdGVDc3NQYXRoCisJCQlpZihhcmdzWyJ0ZW1wbGF0ZWNzc3BhdGgiXSl7CisJCQkJYXJnc1sidGVtcGxhdGVDc3NQYXRoIl0gPSBhcmdzWyJ0ZW1wbGF0ZWNzc3BhdGgiXTsKKwkJCX0KKwkJCXZhciBjcGF0aCA9IGFyZ3NbInRlbXBsYXRlQ3NzUGF0aCJdIHx8IHRoaXMudGVtcGxhdGVDc3NQYXRoOworCQkJaWYoY3BhdGggJiYgIWRvam8ud2lkZ2V0Ll9jc3NGaWxlc1tjcGF0aC50b1N0cmluZygpXSl7CisJCQkJaWYoKCF0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nKSYmKGNwYXRoKSl7CisJCQkJCXRoaXMudGVtcGxhdGVDc3NTdHJpbmcgPSBkb2pvLmhvc3RlbnYuZ2V0VGV4dChjcGF0aCk7CisJCQkJCXRoaXMudGVtcGxhdGVDc3NQYXRoID0gbnVsbDsKKwkJCQl9CisJCQkJZG9qby53aWRnZXQuX2Nzc0ZpbGVzW2NwYXRoLnRvU3RyaW5nKCldID0gdHJ1ZTsKKwkJCX0KKwkJCisJCQlpZigodGhpc1sidGVtcGxhdGVDc3NTdHJpbmciXSkmJighZG9qby53aWRnZXQuX2Nzc1N0cmluZ3NbdGhpcy50ZW1wbGF0ZUNzc1N0cmluZ10pKXsKKwkJCQlkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCh0aGlzLnRlbXBsYXRlQ3NzU3RyaW5nLCBudWxsLCBjcGF0aCk7CisJCQkJZG9qby53aWRnZXQuX2Nzc1N0cmluZ3NbdGhpcy50ZW1wbGF0ZUNzc1N0cmluZ10gPSB0cnVlOworCQkJfQorCQkJaWYoCQorCQkJCSghdGhpcy5wcmV2ZW50Q2xvYmJlcikmJigKKwkJCQkJKHRoaXMudGVtcGxhdGVQYXRoKXx8CisJCQkJCSh0aGlzLnRlbXBsYXRlTm9kZSl8fAorCQkJCQkoCisJCQkJCQkodGhpc1sidGVtcGxhdGVTdHJpbmciXSkmJih0aGlzLnRlbXBsYXRlU3RyaW5nLmxlbmd0aCkgCisJCQkJCSl8fAorCQkJCQkoCisJCQkJCQkodHlwZW9mIHRzICE9ICJ1bmRlZmluZWQiKSYmKCAodHNbInN0cmluZyJdKXx8KHRzWyJub2RlIl0pICkKKwkJCQkJKQorCQkJCSkKKwkJCSl7CisJCQkJLy8gaWYgaXQgbG9va3MgbGlrZSB3ZSBjYW4gYnVpbGQgdGhlIHRoaW5nIGZyb20gYSB0ZW1wbGF0ZSwgZG8gaXQhCisJCQkJdGhpcy5idWlsZEZyb21UZW1wbGF0ZShhcmdzLCBmcmFnKTsKKwkJCX1lbHNleworCQkJCS8vIG90aGVyd2lzZSwgYXNzaWduIHRoZSBET00gbm9kZSB0aGF0IHdhcyB0aGUgc291cmNlIG9mIHRoZSB3aWRnZXQKKwkJCQkvLyBwYXJzaW5nIHRvIGJlIHRoZSByb290IG5vZGUKKwkJCQl0aGlzLmRvbU5vZGUgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCQkJfQorCQkJdGhpcy5maWxsSW5UZW1wbGF0ZShhcmdzLCBmcmFnKTsgCS8vIHRoaXMgaXMgd2hlcmUgaW5kaXZpZHVhbCB3aWRnZXRzCisJCQkJCQkJCQkJCQkvLyB3aWxsIGhhbmRsZSBwb3B1bGF0aW9uIG9mIGRhdGEKKwkJCQkJCQkJCQkJCS8vIGZyb20gcHJvcGVydGllcywgcmVtb3RlIGRhdGEKKwkJCQkJCQkJCQkJCS8vIHNldHMsIGV0Yy4KKwkJfSwKKworCQlidWlsZEZyb21UZW1wbGF0ZTogZnVuY3Rpb24oLypPYmplY3QqLyBhcmdzLCAvKk9iamVjdCovIGZyYWcpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlDYWxsZWQgYnkgYnVpbGRSZW5kZXJpbmcsIGNyZWF0ZXMgdGhlIGFjdHVhbCBVSSBpbiBhIERvbVdpZGdldC4KKworCQkJLy8gdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKKwkJCS8vIGNvcHkgdGVtcGxhdGUgcHJvcGVydGllcyBpZiB0aGV5J3JlIGFscmVhZHkgc2V0IGluIHRoZSB0ZW1wbGF0ZXMgb2JqZWN0CisJCQkvLyBkb2pvLmRlYnVnKCJidWlsZEZyb21UZW1wbGF0ZToiLCB0aGlzKTsKKwkJCXZhciBhdm9pZENhY2hlID0gZmFsc2U7CisJCQlpZihhcmdzWyJ0ZW1wbGF0ZXBhdGgiXSl7CisvLwkJCQlhdm9pZENhY2hlID0gdHJ1ZTsKKwkJCQlhcmdzWyJ0ZW1wbGF0ZVBhdGgiXSA9IGFyZ3NbInRlbXBsYXRlcGF0aCJdOworCQkJfQorCQkJZG9qby53aWRnZXQuZmlsbEZyb21UZW1wbGF0ZUNhY2hlKAl0aGlzLCAKKwkJCQkJCQkJCQkJCWFyZ3NbInRlbXBsYXRlUGF0aCJdLCAKKwkJCQkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQkJCQlhdm9pZENhY2hlKTsKKwkJCXZhciB0cyA9IGRvam8ud2lkZ2V0Ll90ZW1wbGF0ZUNhY2hlW3RoaXMudGVtcGxhdGVQYXRoP3RoaXMudGVtcGxhdGVQYXRoLnRvU3RyaW5nKCk6dGhpcy53aWRnZXRUeXBlXTsKKwkJCWlmKCh0cykmJighYXZvaWRDYWNoZSkpeworCQkJCWlmKCF0aGlzLnRlbXBsYXRlU3RyaW5nLmxlbmd0aCl7CisJCQkJCXRoaXMudGVtcGxhdGVTdHJpbmcgPSB0c1sic3RyaW5nIl07CisJCQkJfQorCQkJCWlmKCF0aGlzLnRlbXBsYXRlTm9kZSl7CisJCQkJCXRoaXMudGVtcGxhdGVOb2RlID0gdHNbIm5vZGUiXTsKKwkJCQl9CisJCQl9CisJCQl2YXIgbWF0Y2hlcyA9IGZhbHNlOworCQkJdmFyIG5vZGUgPSBudWxsOworCQkJLy8gdmFyIHRzdHIgPSBuZXcgU3RyaW5nKHRoaXMudGVtcGxhdGVTdHJpbmcpOyAKKwkJCXZhciB0c3RyID0gdGhpcy50ZW1wbGF0ZVN0cmluZzsgCisJCQkvLyBhdHRlbXB0IHRvIGNsb25lIGEgdGVtcGxhdGUgbm9kZSwgaWYgdGhlcmUgaXMgb25lCisJCQlpZigoIXRoaXMudGVtcGxhdGVOb2RlKSYmKHRoaXMudGVtcGxhdGVTdHJpbmcpKXsKKwkJCQltYXRjaGVzID0gdGhpcy50ZW1wbGF0ZVN0cmluZy5tYXRjaCgvXCRceyhbXlx9XSspXH0vZyk7CisJCQkJaWYobWF0Y2hlcykgeworCQkJCQkvLyBpZiB3ZSBkbyBwcm9wZXJ0eSByZXBsYWNlbWVudCwgZG9uJ3QgY3JlYXRlIGEgdGVtcGxhdGVOb2RlCisJCQkJCS8vIHRvIGNsb25lIGZyb20uCisJCQkJCXZhciBoYXNoID0gdGhpcy5zdHJpbmdzIHx8IHt9OworCQkJCQkvLyBGSVhNRTogc2hvdWxkIHRoaXMgaGFzaCBvZiBkZWZhdWx0IHJlcGxhY2VtZW50cyBiZSBjYWNoZWQgaW4KKwkJCQkJLy8gdGVtcGxhdGVTdHJpbmc/CisJCQkJCWZvcih2YXIga2V5IGluIGRvam8ud2lkZ2V0LmRlZmF1bHRTdHJpbmdzKSB7CisJCQkJCQlpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoaGFzaFtrZXldKSkgeworCQkJCQkJCWhhc2hba2V5XSA9IGRvam8ud2lkZ2V0LmRlZmF1bHRTdHJpbmdzW2tleV07CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gRklYTUU6IHRoaXMgaXMgYSBsb3Qgb2Ygc3RyaW5nIG11bmdpbmcuIENhbiB3ZSBtYWtlIGl0IGZhc3Rlcj8KKwkJCQkJZm9yKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCXZhciBrZXkgPSBtYXRjaGVzW2ldOworCQkJCQkJa2V5ID0ga2V5LnN1YnN0cmluZygyLCBrZXkubGVuZ3RoLTEpOworCQkJCQkJdmFyIGt2YWwgPSAoa2V5LnN1YnN0cmluZygwLCA1KSA9PSAidGhpcy4iKSA/IGRvam8ubGFuZy5nZXRPYmpQYXRoVmFsdWUoa2V5LnN1YnN0cmluZyg1KSwgdGhpcykgOiBoYXNoW2tleV07CisJCQkJCQl2YXIgdmFsdWU7CisJCQkJCQlpZigoa3ZhbCl8fChkb2pvLmxhbmcuaXNTdHJpbmcoa3ZhbCkpKXsKKwkJCQkJCQl2YWx1ZSA9IG5ldyBTdHJpbmcoKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGt2YWwpKSA/IGt2YWwuY2FsbCh0aGlzLCBrZXksIHRoaXMudGVtcGxhdGVTdHJpbmcpIDoga3ZhbCk7CisJCQkJCQkJLy8gU2FmZXIgc3Vic3RpdHV0aW9uLCBzZWUgaGVhZGluZyAiQXR0cmlidXRlIHZhbHVlcyIgaW4gIAorCQkJCQkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvYXBwZW5kaXgvbm90ZXMuaHRtbCNoLUIuMy4yCisJCQkJCQkJd2hpbGUgKHZhbHVlLmluZGV4T2YoIlwiIikgPiAtMSkgeworCQkJCQkJCQl2YWx1ZT12YWx1ZS5yZXBsYWNlKCJcIiIsIiZxdW90OyIpOworCQkJCQkJCX0KKwkJCQkJCQl0c3RyID0gdHN0ci5yZXBsYWNlKG1hdGNoZXNbaV0sIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQkvLyBvdGhlcndpc2UsIHdlIGFyZSByZXF1aXJlZCB0byBpbnN0YW50aWF0ZSBhIGNvcHkgb2YgdGhlIHRlbXBsYXRlCisJCQkJCS8vIHN0cmluZyBpZiBvbmUgaXMgcHJvdmlkZWQuCisJCQkJCQorCQkJCQkvLyBGSVhNRTogbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGhlcmUgd2hhdCBzaG91bGQgYmUgZG9uZQorCQkJCQkvLyBvciBwcm92aWRlIGEgZ2VuZXJpYyBpbnRlcmZhY2UgYWNyb3NzIGFsbCBET00gaW1wbGVtZW50YXRpb25zCisJCQkJCS8vIEZJTVhFOiB0aGlzIGJyZWFrcyBpZiB0aGUgdGVtcGxhdGUgaGFzIHdoaXRlc3BhY2UgYXMgaXRzIGZpcnN0IAorCQkJCQkvLyBjaGFyYWN0ZXJzCisJCQkJCS8vIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGVzRnJvbVRleHQodGhpcy50ZW1wbGF0ZVN0cmluZywgdHJ1ZSk7CisJCQkJCS8vIHRoaXMudGVtcGxhdGVOb2RlID0gbm9kZVswXS5jbG9uZU5vZGUodHJ1ZSk7IC8vIHdlJ3JlIG9wdGltaXN0aWMgaGVyZQorCQkJCQl0aGlzLnRlbXBsYXRlTm9kZSA9IHRoaXMuY3JlYXRlTm9kZXNGcm9tVGV4dCh0aGlzLnRlbXBsYXRlU3RyaW5nLCB0cnVlKVswXTsKKwkJCQkJaWYoIWF2b2lkQ2FjaGUpeworCQkJCQkJdHMubm9kZSA9IHRoaXMudGVtcGxhdGVOb2RlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYoKCF0aGlzLnRlbXBsYXRlTm9kZSkmJighbWF0Y2hlcykpeyAKKwkJCQlkb2pvLmRlYnVnKCJEb21XaWRnZXQuYnVpbGRGcm9tVGVtcGxhdGU6IGNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUiKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9ZWxzZSBpZighbWF0Y2hlcyl7CisJCQkJbm9kZSA9IHRoaXMudGVtcGxhdGVOb2RlLmNsb25lTm9kZSh0cnVlKTsKKwkJCQlpZighbm9kZSl7IHJldHVybiBmYWxzZTsgfQorCQkJfWVsc2V7CisJCQkJbm9kZSA9IHRoaXMuY3JlYXRlTm9kZXNGcm9tVGV4dCh0c3RyLCB0cnVlKVswXTsKKwkJCX0KKworCQkJLy8gcmVjdXJzZSB0aHJvdWdoIHRoZSBub2RlLCBsb29raW5nIGZvciwgYW5kIGF0dGFjaGluZyB0bywgb3VyCisJCQkvLyBhdHRhY2htZW50IHBvaW50cyB3aGljaCBzaG91bGQgYmUgZGVmaW5lZCBvbiB0aGUgdGVtcGxhdGUgbm9kZS4KKworCQkJdGhpcy5kb21Ob2RlID0gbm9kZTsKKwkJCS8vIGRvam8ucHJvZmlsZS5zdGFydCgiYXR0YWNoVGVtcGxhdGVOb2RlcyIpOworCQkJdGhpcy5hdHRhY2hUZW1wbGF0ZU5vZGVzKCk7CisJCQkvLyBkb2pvLnByb2ZpbGUuZW5kKCJhdHRhY2hUZW1wbGF0ZU5vZGVzIik7CisJCQorCQkJLy8gcmVsb2NhdGUgc291cmNlIGNvbnRlbnRzIHRvIHRlbXBsYXRlZCBjb250YWluZXIgbm9kZQorCQkJLy8gdGhpcy5jb250YWluZXJOb2RlIG11c3QgYmUgYWJsZSB0byByZWNlaXZlIGNoaWxkcmVuLCBvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duCisJCQlpZiAodGhpcy5pc0NvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lck5vZGUpeworCQkJCXZhciBzcmMgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCQkJCWlmIChzcmMpeworCQkJCQlkb2pvLmRvbS5tb3ZlQ2hpbGRyZW4oc3JjLCB0aGlzLmNvbnRhaW5lck5vZGUpOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQlhdHRhY2hUZW1wbGF0ZU5vZGVzOiBmdW5jdGlvbihiYXNlTm9kZSwgdGFyZ2V0T2JqKXsKKwkJCS8vIHN1bW1hcnk6IAorCQkJLy8JCWhvb2tzIHVwIGV2ZW50IGhhbmRsZXJzIGFuZCBwcm9wZXJ0eS9ub2RlIGxpbmthZ2VzLiBDYWxscworCQkJLy8JCWRvam8ud2lkZ2V0LmF0dGFjaFRlbXBsYXRlTm9kZXMgdG8gZG8gYWxsIHRoZSBoYXJkIHdvcmsuCisJCQkvLyBiYXNlTm9kZTogRG9tTm9kZQorCQkJLy8JCWRlZmF1bHRzIHRvICJ0aGlzLmRvbU5vZGUiCisJCQkvLyB0YXJnZXRPYmo6IFdpZGdldAorCQkJLy8JCWRlZmF1bHRzIHRvICJ0aGlzIgorCQkJaWYoIWJhc2VOb2RlKXsgYmFzZU5vZGUgPSB0aGlzLmRvbU5vZGU7IH0KKwkJCWlmKCF0YXJnZXRPYmopeyB0YXJnZXRPYmogPSB0aGlzOyB9CisJCQlyZXR1cm4gZG9qby53aWRnZXQuYXR0YWNoVGVtcGxhdGVOb2RlcyhiYXNlTm9kZSwgdGFyZ2V0T2JqLCAKKwkJCQkJCWRvam8ud2lkZ2V0LmdldERvam9FdmVudHNGcm9tU3RyKHRoaXMudGVtcGxhdGVTdHJpbmcpKTsKKwkJfSwKKworCQlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJc3R1YiBmdW5jdGlvbiEgc3ViLWNsYXNzZXMgbWF5IHVzZSBhcyBhIGRlZmF1bHQgVUkKKwkJCS8vCQlpbml0aWFsaXplciBmdW5jdGlvbi4gVGhlIFVJIHJlbmRlcmluZyB3aWxsIGJlIGF2YWlsYWJsZSBieQorCQkJLy8JCXRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkIGZyb20gYnVpbGRSZW5kZXJpbmcuIElmCisJCQkvLwkJYnVpbGRSZW5kZXJpbmcgaXMgb3Zlci1yaWRkZW4sIHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZQorCQkJLy8JCWZpcmVkIQorCisJCQkvLyBkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LkRvbVdpZGdldC5maWxsSW5UZW1wbGF0ZSIpOworCQl9LAorCQkKKwkJLy8gbWV0aG9kIG92ZXItcmlkZQorCQlkZXN0cm95UmVuZGVyaW5nOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogVUkgZGVzdHJ1Y3Rvci4gIERlc3Ryb3kgdGhlIGRvbSBub2RlcyBhc3NvY2lhdGVkIHcvdGhpcyB3aWRnZXQuCisJCQl0cnl7CisJCQkJZG9qby5kb20uZGVzdHJveU5vZGUodGhpcy5kb21Ob2RlKTsKKwkJCQlkZWxldGUgdGhpcy5kb21Ob2RlOworCQkJfWNhdGNoKGUpeyAvKiBzcXVlbGNoISAqLyB9CisJCQlpZih0aGlzLl9zb3VyY2VOb2RlUmVmKXsKKwkJCQl0cnl7CisJCQkJCWRvam8uZG9tLmRlc3Ryb3lOb2RlKHRoaXMuX3NvdXJjZU5vZGVSZWYpOworCQkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCEgKi8gfQorCQkJfQorCQl9LAorCisJCWNyZWF0ZU5vZGVzRnJvbVRleHQ6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5CisJCQkvLwlBdHRlbXB0cyB0byBjcmVhdGUgYSBzZXQgb2Ygbm9kZXMgYmFzZWQgb24gdGhlIHN0cnVjdHVyZSBvZiB0aGUgcGFzc2VkIHRleHQuCisJCQkvLwlJbXBsZW1lbnRlZCBpbiBIdG1sV2lkZ2V0IGFuZCBTdmdXaWRnZXQuCisJCQlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8ud2lkZ2V0LkRvbVdpZGdldC5jcmVhdGVOb2Rlc0Zyb21UZXh0Iik7CisJCX0KKwl9CispOworCitkb2pvLnByb3ZpZGUoImRvam8uaHRtbC51dGlsIik7CisKKworZG9qby5odG1sLmdldEVsZW1lbnRXaW5kb3cgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL2VsZW1lbnQpeworCS8vCXN1bW1hcnkKKwkvLyAJR2V0IHRoZSB3aW5kb3cgb2JqZWN0IHdoZXJlIHRoZSBlbGVtZW50IGlzIHBsYWNlZCBpbi4KKwlyZXR1cm4gZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KCBlbGVtZW50Lm93bmVyRG9jdW1lbnQgKTsJLy8JV2luZG93Cit9CisKK2Rvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyA9IGZ1bmN0aW9uKGRvYyl7CisJLy8Jc3VtbWFyeQorCS8vIAlHZXQgd2luZG93IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggZG9jdW1lbnQgZG9jCisKKwkvLyBXaXRoIFNhZmFyaSwgdGhlcmUgaXMgbm90IHdhIHRvIHJldHJpZXZlIHRoZSB3aW5kb3cgZnJvbSB0aGUgZG9jdW1lbnQsIHNvIHdlIG11c3QgZml4IGl0LgorCWlmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpICYmICFkb2MuX3BhcmVudFdpbmRvdyl7CisJCS8qCisJCQlUaGlzIGlzIGEgU2FmYXJpIHNwZWNpZmljIGZ1bmN0aW9uIHRoYXQgZml4IHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudAorCQkJd2luZG93IGZyb20gdGhlIGRvY3VtZW50IG9iamVjdC4KKwkJKi8KKworCQl2YXIgZml4PWZ1bmN0aW9uKHdpbil7CisJCQl3aW4uZG9jdW1lbnQuX3BhcmVudFdpbmRvdz13aW47CisJCQlmb3IodmFyIGk9MDsgaTx3aW4uZnJhbWVzLmxlbmd0aDsgaSsrKXsKKwkJCQlmaXgod2luLmZyYW1lc1tpXSk7CisJCQl9CisJCX0KKwkJZml4KHdpbmRvdy50b3ApOworCX0KKworCS8vSW4gc29tZSBJRSB2ZXJzaW9ucyAoYXQgbGVhc3QgNi4wKSwgZG9jdW1lbnQucGFyZW50V2luZG93IGRvZXMgbm90IHJldHVybiBhCisJLy9yZWZlcmVuY2UgdG8gdGhlIHJlYWwgd2luZG93IG9iamVjdCAobWF5YmUgYSBjb3B5KSwgc28gd2UgbXVzdCBmaXggaXQgYXMgd2VsbAorCS8vV2UgdXNlIElFIHNwZWNpZmljIGV4ZWNTY3JpcHQgdG8gYXR0YWNoIHRoZSByZWFsIHdpbmRvdyByZWZlcmVuY2UgdG8KKwkvL2RvY3VtZW50Ll9wYXJlbnRXaW5kb3cgZm9yIGxhdGVyIHVzZQorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgd2luZG93ICE9PSBkb2N1bWVudC5wYXJlbnRXaW5kb3cgJiYgIWRvYy5fcGFyZW50V2luZG93KXsKKwkJLyoKKwkJSW4gSUUgNiwgb25seSB0aGUgdmFyaWFibGUgIndpbmRvdyIgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCBldmVudHMgKG90aGVycworCQltYXkgYmUgb25seSBjb3BpZXMpLgorCQkqLworCQlkb2MucGFyZW50V2luZG93LmV4ZWNTY3JpcHQoImRvY3VtZW50Ll9wYXJlbnRXaW5kb3cgPSB3aW5kb3c7IiwgIkphdmFzY3JpcHQiKTsKKwkJLy90byBwcmV2ZW50IG1lbW9yeSBsZWFrLCB1bnNldCBpdCBhZnRlciB1c2UKKwkJLy9hbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIGFkZCBhbiBvblVubG9hZCBoYW5kbGVyIHdoaWNoIHNlZW1zIG92ZXJraWxsIHRvIG1lIChsaXVjb3VnYXIpCisJCXZhciB3aW4gPSBkb2MuX3BhcmVudFdpbmRvdzsKKwkJZG9jLl9wYXJlbnRXaW5kb3cgPSBudWxsOworCQlyZXR1cm4gd2luOwkvLwlXaW5kb3cKKwl9CisKKwlyZXR1cm4gZG9jLl9wYXJlbnRXaW5kb3cgfHwgZG9jLnBhcmVudFdpbmRvdyB8fCBkb2MuZGVmYXVsdFZpZXc7CS8vCVdpbmRvdworfQorCitkb2pvLmh0bWwuZ3Jhdml0eSA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSwgLyogRE9NRXZlbnQgKi9lKXsKKwkvLwlzdW1tYXJ5CisJLy8JQ2FsY3VsYXRlcyB0aGUgbW91c2UncyBkaXJlY3Rpb24gb2YgZ3Jhdml0eSByZWxhdGl2ZSB0byB0aGUgY2VudHJlCisJLy8Jb2YgdGhlIGdpdmVuIG5vZGUuCisJLy8JPHA+CisJLy8JSWYgeW91IHdhbnRlZCB0byBpbnNlcnQgYSBub2RlIGludG8gYSBET00gdHJlZSBiYXNlZCBvbiB0aGUgbW91c2UKKwkvLwlwb3NpdGlvbiB5b3UgbWlnaHQgdXNlIHRoZSBmb2xsb3dpbmcgY29kZToKKwkvLwk8cHJlPgorCS8vCWlmIChncmF2aXR5KG5vZGUsIGUpICYgZ3Jhdml0eS5OT1JUSCkgeyBbaW5zZXJ0IGJlZm9yZV07IH0KKwkvLwllbHNlIHsgW2luc2VydCBhZnRlcl07IH0KKwkvLwk8L3ByZT4KKwkvLworCS8vCUBwYXJhbSBub2RlIFRoZSBub2RlCisJLy8JQHBhcmFtIGUJCVRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb3VzZSBjb29yZGluYXRlcworCS8vCUByZXR1cm4JCSBUaGUgZGlyZWN0aW9ucywgTk9SVEggb3IgU09VVEggYW5kIEVBU1Qgb3IgV0VTVC4gVGhlc2UKKwkvLwkJCQkJCSBhcmUgcHJvcGVydGllcyBvZiB0aGUgZnVuY3Rpb24uCisJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwl2YXIgbW91c2UgPSBkb2pvLmh0bWwuZ2V0Q3Vyc29yUG9zaXRpb24oZSk7CisKKwl3aXRoIChkb2pvLmh0bWwpIHsKKwkJdmFyIGFic29sdXRlID0gZ2V0QWJzb2x1dGVQb3NpdGlvbihub2RlLCB0cnVlKTsKKwkJdmFyIGJiID0gZ2V0Qm9yZGVyQm94KG5vZGUpOworCQl2YXIgbm9kZWNlbnRlcnggPSBhYnNvbHV0ZS54ICsgKGJiLndpZHRoIC8gMik7CisJCXZhciBub2RlY2VudGVyeSA9IGFic29sdXRlLnkgKyAoYmIuaGVpZ2h0IC8gMik7CisJfQorCisJd2l0aCAoZG9qby5odG1sLmdyYXZpdHkpIHsKKwkJcmV0dXJuICgobW91c2UueCA8IG5vZGVjZW50ZXJ4ID8gV0VTVCA6IEVBU1QpIHwgKG1vdXNlLnkgPCBub2RlY2VudGVyeSA/IE5PUlRIIDogU09VVEgpKTsJLy8JaW50ZWdlcgorCX0KK30KKworZG9qby5odG1sLmdyYXZpdHkuTk9SVEggPSAxOworZG9qby5odG1sLmdyYXZpdHkuU09VVEggPSAxIDw8IDE7Citkb2pvLmh0bWwuZ3Jhdml0eS5FQVNUID0gMSA8PCAyOworZG9qby5odG1sLmdyYXZpdHkuV0VTVCA9IDEgPDwgMzsKKworZG9qby5odG1sLm92ZXJFbGVtZW50ID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9lbGVtZW50LCAvKiBET01FdmVudCAqL2UpeworCS8vCXN1bW1hcnkKKwkvLwlSZXR1cm5zIHdoZXRoZXIgdGhlIG1vdXNlIGlzIG92ZXIgdGhlIHBhc3NlZCBlbGVtZW50LgorCS8vCUVsZW1lbnQgbXVzdCBiZSBkaXNwbGF5OmJsb2NrIChpZSwgbm90IGEgPHNwYW4+KQorCWVsZW1lbnQgPSBkb2pvLmJ5SWQoZWxlbWVudCk7CisJdmFyIG1vdXNlID0gZG9qby5odG1sLmdldEN1cnNvclBvc2l0aW9uKGUpOworCXZhciBiYiA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3goZWxlbWVudCk7CisJdmFyIGFic29sdXRlID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24oZWxlbWVudCwgdHJ1ZSwgZG9qby5odG1sLmJveFNpemluZy5CT1JERVJfQk9YKTsKKwl2YXIgdG9wID0gYWJzb2x1dGUueTsKKwl2YXIgYm90dG9tID0gdG9wICsgYmIuaGVpZ2h0OworCXZhciBsZWZ0ID0gYWJzb2x1dGUueDsKKwl2YXIgcmlnaHQgPSBsZWZ0ICsgYmIud2lkdGg7CisKKwlyZXR1cm4gKG1vdXNlLnggPj0gbGVmdAorCQkmJiBtb3VzZS54IDw9IHJpZ2h0CisJCSYmIG1vdXNlLnkgPj0gdG9wCisJCSYmIG1vdXNlLnkgPD0gYm90dG9tCisJKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLmh0bWwucmVuZGVyZWRUZXh0Q29udGVudCA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCUF0dGVtcHRzIHRvIHJldHVybiB0aGUgdGV4dCBhcyBpdCB3b3VsZCBiZSByZW5kZXJlZCwgd2l0aCB0aGUgbGluZSBicmVha3MKKwkvLwlzb3J0ZWQgb3V0IG5pY2VseS4gVW5maW5pc2hlZC4KKwlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCXZhciByZXN1bHQgPSAiIjsKKwlpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiByZXN1bHQ7IH0KKwlmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgeworCQlzd2l0Y2ggKG5vZGUuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSkgeworCQkJY2FzZSAxOiAvLyBFTEVNRU5UX05PREUKKwkJCWNhc2UgNTogLy8gRU5USVRZX1JFRkVSRU5DRV9OT0RFCisJCQkJdmFyIGRpc3BsYXkgPSAidW5rbm93biI7CisJCQkJdHJ5IHsKKwkJCQkJZGlzcGxheSA9IGRvam8uaHRtbC5nZXRTdHlsZShub2RlLmNoaWxkTm9kZXNbaV0sICJkaXNwbGF5Iik7CisJCQkJfSBjYXRjaChFKSB7fQorCQkJCXN3aXRjaCAoZGlzcGxheSkgeworCQkJCQljYXNlICJibG9jayI6IGNhc2UgImxpc3QtaXRlbSI6IGNhc2UgInJ1bi1pbiI6CisJCQkJCWNhc2UgInRhYmxlIjogY2FzZSAidGFibGUtcm93LWdyb3VwIjogY2FzZSAidGFibGUtaGVhZGVyLWdyb3VwIjoKKwkJCQkJY2FzZSAidGFibGUtZm9vdGVyLWdyb3VwIjogY2FzZSAidGFibGUtcm93IjogY2FzZSAidGFibGUtY29sdW1uLWdyb3VwIjoKKwkJCQkJY2FzZSAidGFibGUtY29sdW1uIjogY2FzZSAidGFibGUtY2VsbCI6IGNhc2UgInRhYmxlLWNhcHRpb24iOgorCQkJCQkJLy8gVE9ETzogdGhpcyBzaG91bGRuJ3QgaW5zZXJ0IGRvdWJsZSBzcGFjZXMgb24gYWxpZ25pbmcgYmxvY2tzCisJCQkJCQlyZXN1bHQgKz0gIlxuIjsKKwkJCQkJCXJlc3VsdCArPSBkb2pvLmh0bWwucmVuZGVyZWRUZXh0Q29udGVudChub2RlLmNoaWxkTm9kZXNbaV0pOworCQkJCQkJcmVzdWx0ICs9ICJcbiI7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICJub25lIjogYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmKG5vZGUuY2hpbGROb2Rlc1tpXS50YWdOYW1lICYmIG5vZGUuY2hpbGROb2Rlc1tpXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gImJyIikgeworCQkJCQkJCXJlc3VsdCArPSAiXG4iOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXN1bHQgKz0gZG9qby5odG1sLnJlbmRlcmVkVGV4dENvbnRlbnQobm9kZS5jaGlsZE5vZGVzW2ldKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzogLy8gVEVYVF9OT0RFCisJCQljYXNlIDI6IC8vIEFUVFJJQlVURV9OT0RFCisJCQljYXNlIDQ6IC8vIENEQVRBX1NFQ1RJT05fTk9ERQorCQkJCXZhciB0ZXh0ID0gbm9kZS5jaGlsZE5vZGVzW2ldLm5vZGVWYWx1ZTsKKwkJCQl2YXIgdGV4dFRyYW5zZm9ybSA9ICJ1bmtub3duIjsKKwkJCQl0cnkgeworCQkJCQl0ZXh0VHJhbnNmb3JtID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJ0ZXh0LXRyYW5zZm9ybSIpOworCQkJCX0gY2F0Y2goRSkge30KKwkJCQlzd2l0Y2ggKHRleHRUcmFuc2Zvcm0peworCQkJCQljYXNlICJjYXBpdGFsaXplIjoKKwkJCQkJCXZhciB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTsKKwkJCQkJCWZvcih2YXIgaT0wOyBpPHdvcmRzLmxlbmd0aDsgaSsrKXsKKwkJCQkJCQl3b3Jkc1tpXSA9IHdvcmRzW2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZHNbaV0uc3Vic3RyaW5nKDEpOworCQkJCQkJfQorCQkJCQkJdGV4dCA9IHdvcmRzLmpvaW4oIiAiKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICJ1cHBlcmNhc2UiOiB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpOyBicmVhazsKKwkJCQkJY2FzZSAibG93ZXJjYXNlIjogdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsgYnJlYWs7CisJCQkJCWRlZmF1bHQ6IGJyZWFrOyAvLyBsZWF2ZSBhcyBpcworCQkJCX0KKwkJCQkvLyBUT0RPOiBpbXBsZW1lbnQKKwkJCQlzd2l0Y2ggKHRleHRUcmFuc2Zvcm0peworCQkJCQljYXNlICJub3dyYXAiOiBicmVhazsKKwkJCQkJY2FzZSAicHJlLXdyYXAiOiBicmVhazsKKwkJCQkJY2FzZSAicHJlLWxpbmUiOiBicmVhazsKKwkJCQkJY2FzZSAicHJlIjogYnJlYWs7IC8vIGxlYXZlIGFzIGlzCisJCQkJCWRlZmF1bHQ6CisJCQkJCQkvLyByZW1vdmUgd2hpdGVzcGFjZSBhbmQgY29sbGFwc2UgZmlyc3Qgc3BhY2UKKwkJCQkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoL1xzKy8sICIgIik7CisJCQkJCQlpZiAoL1xzJC8udGVzdChyZXN1bHQpKSB7IHRleHQucmVwbGFjZSgvXlxzLywgIiIpOyB9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVzdWx0ICs9IHRleHQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXN1bHQ7CS8vCXN0cmluZworfQorCitkb2pvLmh0bWwuY3JlYXRlTm9kZXNGcm9tVGV4dCA9IGZ1bmN0aW9uKC8qIHN0cmluZyAqL3R4dCwgLyogYm9vbGVhbj8gKi90cmltKXsKKwkvLwlzdW1tYXJ5CisJLy8JQXR0ZW1wdHMgdG8gY3JlYXRlIGEgc2V0IG9mIG5vZGVzIGJhc2VkIG9uIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhc3NlZCB0ZXh0LgorCWlmKHRyaW0pIHsgdHh0ID0gdHh0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIik7IH0KKworCXZhciB0biA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJLy8gdG4uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwl0bi5zdHlsZS52aXNpYmlsaXR5PSAiaGlkZGVuIjsKKwlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0bik7CisJdmFyIHRhYmxlVHlwZSA9ICJub25lIjsKKwlpZigoL148dFtkaF1bXHNcclxuPl0vaSkudGVzdCh0eHQucmVwbGFjZSgvXlxzKy8pKSkgeworCQl0eHQgPSAiPHRhYmxlPjx0Ym9keT48dHI+IiArIHR4dCArICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iOworCQl0YWJsZVR5cGUgPSAiY2VsbCI7CisJfSBlbHNlIGlmKCgvXjx0cltcc1xyXG4+XS9pKS50ZXN0KHR4dC5yZXBsYWNlKC9eXHMrLykpKSB7CisJCXR4dCA9ICI8dGFibGU+PHRib2R5PiIgKyB0eHQgKyAiPC90Ym9keT48L3RhYmxlPiI7CisJCXRhYmxlVHlwZSA9ICJyb3ciOworCX0gZWxzZSBpZigoL148KHRoZWFkfHRib2R5fHRmb290KVtcc1xyXG4+XS9pKS50ZXN0KHR4dC5yZXBsYWNlKC9eXHMrLykpKSB7CisJCXR4dCA9ICI8dGFibGU+IiArIHR4dCArICI8L3RhYmxlPiI7CisJCXRhYmxlVHlwZSA9ICJzZWN0aW9uIjsKKwl9CisJdG4uaW5uZXJIVE1MID0gdHh0OworCWlmKHRuWyJub3JtYWxpemUiXSl7CisJCXRuLm5vcm1hbGl6ZSgpOworCX0KKworCXZhciBwYXJlbnQgPSBudWxsOworCXN3aXRjaCh0YWJsZVR5cGUpIHsKKwkJY2FzZSAiY2VsbCI6CisJCQlwYXJlbnQgPSB0bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKVswXTsKKwkJCWJyZWFrOworCQljYXNlICJyb3ciOgorCQkJcGFyZW50ID0gdG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF07CisJCQlicmVhazsKKwkJY2FzZSAic2VjdGlvbiI6CisJCQlwYXJlbnQgPSB0bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKVswXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFyZW50ID0gdG47CisJCQlicmVhazsKKwl9CisKKwkvKiB0aGlzIGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLCBJJ20gYXNzdW1pbmcgaXQganVzdCBtZWFudCB0cmltKCkgc28gd3JhcCB3YXMgcmVwbGFjZWQgd2l0aCB0cmltCisJaWYod3JhcCl7CisJCXZhciByZXQgPSBbXTsKKwkJLy8gc3RhcnQgaGFjaworCQl2YXIgZmMgPSB0bi5maXJzdENoaWxkOworCQlyZXRbMF0gPSAoKGZjLm5vZGVWYWx1ZSA9PSAiICIpfHwoZmMubm9kZVZhbHVlID09ICJcdCIpKSA/IGZjLm5leHRTaWJsaW5nIDogZmM7CisJCS8vIGVuZCBoYWNrCisJCS8vIHRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKHRuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJKi8KKwl2YXIgbm9kZXMgPSBbXTsKKwlmb3IodmFyIHg9MDsgeDxwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IHgrKyl7CisJCW5vZGVzLnB1c2gocGFyZW50LmNoaWxkTm9kZXNbeF0uY2xvbmVOb2RlKHRydWUpKTsKKwl9CisJdG4uc3R5bGUuZGlzcGxheSA9ICJub25lIjsgLy8gRklYTUU6IHdoeSBkbyB3ZSBkbyB0aGlzPworCWRvam8uaHRtbC5kZXN0cm95Tm9kZSh0bik7CisJcmV0dXJuIG5vZGVzOwkvLwlhcnJheQorfQorCitkb2pvLmh0bWwucGxhY2VPblNjcmVlbiA9IGZ1bmN0aW9uKAorCS8qIEhUTUxFbGVtZW50ICovbm9kZSwKKwkvKiBpbnRlZ2VyICovZGVzaXJlZFgsCisJLyogaW50ZWdlciAqL2Rlc2lyZWRZLAorCS8qIGludGVnZXIgKi9wYWRkaW5nLAorCS8qIGJvb2xlYW4/ICovaGFzU2Nyb2xsLAorCS8qIHN0cmluZz8gKi9jb3JuZXJzLAorCS8qIGJvb2xlYW4/ICovdHJ5T25seQorKXsKKwkvLwlzdW1tYXJ5CisJLy8JS2VlcHMgJ25vZGUnIGluIHRoZSB2aXNpYmxlIGFyZWEgb2YgdGhlIHNjcmVlbiB3aGlsZSB0cnlpbmcgdG8KKwkvLwlwbGFjZSBjbG9zZXN0IHRvIGRlc2lyZWRYLCBkZXNpcmVkWS4gVGhlIGlucHV0IGNvb3JkaW5hdGVzIGFyZQorCS8vCWV4cGVjdGVkIHRvIGJlIHRoZSBkZXNpcmVkIHNjcmVlbiBwb3NpdGlvbiwgbm90IGFjY291bnRpbmcgZm9yCisJLy8Jc2Nyb2xsaW5nLiBJZiB5b3UgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIHNjcm9sbGluZywgc2V0ICdoYXNTY3JvbGwnCisJLy8JdG8gdHJ1ZS4gU2V0IHBhZGRpbmcgdG8gZWl0aGVyIGEgbnVtYmVyIG9yIGFycmF5IGZvciBbcGFkZGluZ1gsIHBhZGRpbmdZXQorCS8vCXRvIHB1dCBzb21lIGJ1ZmZlciBhcm91bmQgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcG9zaXRpb24uCisJLy8JU2V0IHdoaWNoIGNvcm5lcihzKSB5b3Ugd2FudCB0byBiaW5kIHRvLCBzdWNoIGFzCisJLy8KKwkvLwlwbGFjZU9uU2NyZWVuKG5vZGUsIGRlc2lyZWRYLCBkZXNpcmVkWSwgcGFkZGluZywgaGFzU2Nyb2xsLCAiVFIiKQorCS8vCXBsYWNlT25TY3JlZW4obm9kZSwgW2Rlc2lyZWRYLCBkZXNpcmVkWV0sIHBhZGRpbmcsIGhhc1Njcm9sbCwgWyJUUiIsICJCTCJdKQorCS8vCisJLy8JVGhlIGRlc2lyZWRYL2Rlc2lyZWRZIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgdG9wbGVmdChUTCkvdG9wcmlnaHQoVFIpIG9yCisJLy8JQm90dG9tTGVmdChCTCkvQm90dG9tUmlnaHQoQlIpIGNvcm5lciBvZiB0aGUgbm9kZS4gRWFjaCBjb3JuZXIgaXMgdGVzdGVkCisJLy8JYW5kIGlmIGEgcGVyZmVjdCBtYXRjaCBpcyBmb3VuZCwgaXQgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIGl0IGdvZXMgdGhyb3VnaAorCS8vCWFsbCBvZiB0aGUgc3BlY2lmaWVkIGNvcm5lcnMsIGFuZCBjaG9vc2UgdGhlIG1vc3QgYXBwcm9wcmlhdGUgb25lLgorCS8vCUJ5IGRlZmF1bHQsIGNvcm5lciA9IFsnVEwnXS4KKwkvLwlJZiB0cnlPbmx5IGlzIHNldCB0byB0cnVlLCB0aGUgbm9kZSB3aWxsIG5vdCBiZSBtb3ZlZCB0byB0aGUgcGxhY2UuCisJLy8KKwkvLwlOT1RFOiBub2RlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGVseSBvciByZWxhdGl2ZWx5IHBvc2l0aW9uZWQuCisJLy8KKwkvLwlBbHRlcm5hdGUgY2FsbCBzaWc6CisJLy8JIHBsYWNlT25TY3JlZW4obm9kZSwgW3gsIHldLCBwYWRkaW5nLCBoYXNTY3JvbGwpCisJLy8KKwkvLwlFeGFtcGxlczoKKwkvLwkgcGxhY2VPblNjcmVlbihub2RlLCAxMDAsIDIwMCkKKwkvLwkgcGxhY2VPblNjcmVlbigibXlJZCIsIFs4MDAsIDYyM10sIDUpCisJLy8JIHBsYWNlT25TY3JlZW4obm9kZSwgMjM0LCAzMjg0LCBbMiwgNV0sIHRydWUpCisKKwkvLyBUT0RPOiBtYWtlIHRoaXMgZnVuY3Rpb24gaGF2ZSB2YXJpYWJsZSBjYWxsIHNpZ3MKKwkvLwlrZXMobm9kZSwgcHRBcnJheSwgY29ybmVyQXJyYXksIHBhZGRpbmcsIGhhc1Njcm9sbCkKKwkvLwlrZXMobm9kZSwgcHRYLCBwdFksIGNvcm5lckEsIGNvcm5lckIsIGNvcm5lckMsIHBhZGRpbmdBcnJheSwgaGFzU2Nyb2xsKQorCWlmKGRlc2lyZWRYIGluc3RhbmNlb2YgQXJyYXkgfHwgdHlwZW9mIGRlc2lyZWRYID09ICJhcnJheSIpIHsKKwkJdHJ5T25seSA9IGNvcm5lcnM7CisJCWNvcm5lcnMgPSBoYXNTY3JvbGw7CisJCWhhc1Njcm9sbCA9IHBhZGRpbmc7CisJCXBhZGRpbmcgPSBkZXNpcmVkWTsKKwkJZGVzaXJlZFkgPSBkZXNpcmVkWFsxXTsKKwkJZGVzaXJlZFggPSBkZXNpcmVkWFswXTsKKwl9CisKKwlpZihjb3JuZXJzIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBjb3JuZXJzID09ICJzdHJpbmciKXsKKwkJY29ybmVycyA9IGNvcm5lcnMuc3BsaXQoIiwiKTsKKwl9CisKKwlpZighaXNOYU4ocGFkZGluZykpIHsKKwkJcGFkZGluZyA9IFtOdW1iZXIocGFkZGluZyksIE51bWJlcihwYWRkaW5nKV07CisJfSBlbHNlIGlmKCEocGFkZGluZyBpbnN0YW5jZW9mIEFycmF5IHx8IHR5cGVvZiBwYWRkaW5nID09ICJhcnJheSIpKSB7CisJCXBhZGRpbmcgPSBbMCwgMF07CisJfQorCisJdmFyIHNjcm9sbCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisJdmFyIHZpZXcgPSBkb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKKworCW5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJdmFyIG9sZERpc3BsYXkgPSBub2RlLnN0eWxlLmRpc3BsYXk7CisJbm9kZS5zdHlsZS5kaXNwbGF5PSIiOworCXZhciBiYiA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3gobm9kZSk7CisJdmFyIHcgPSBiYi53aWR0aDsKKwl2YXIgaCA9IGJiLmhlaWdodDsKKwlub2RlLnN0eWxlLmRpc3BsYXk9b2xkRGlzcGxheTsKKworCWlmKCEoY29ybmVycyBpbnN0YW5jZW9mIEFycmF5IHx8IHR5cGVvZiBjb3JuZXJzID09ICJhcnJheSIpKXsKKwkJY29ybmVycyA9IFsnVEwnXTsKKwl9CisKKwl2YXIgYmVzdHgsIGJlc3R5LCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eSwgYmVzdENvcm5lcjsKKworCWZvcih2YXIgY2lkZXg9MDsgY2lkZXg8Y29ybmVycy5sZW5ndGg7ICsrY2lkZXgpeworCQl2YXIgY29ybmVyID0gY29ybmVyc1tjaWRleF07CisJCXZhciBtYXRjaCA9IHRydWU7CisJCXZhciB0cnlYID0gZGVzaXJlZFggLSAoY29ybmVyLmNoYXJBdCgxKT09J0wnID8gMCA6IHcpICsgcGFkZGluZ1swXSooY29ybmVyLmNoYXJBdCgxKT09J0wnID8gMSA6IC0xKTsKKwkJdmFyIHRyeVkgPSBkZXNpcmVkWSAtIChjb3JuZXIuY2hhckF0KDApPT0nVCcgPyAwIDogaCkgKyBwYWRkaW5nWzFdKihjb3JuZXIuY2hhckF0KDApPT0nVCcgPyAxIDogLTEpOworCQlpZihoYXNTY3JvbGwpIHsKKwkJCXRyeVggLT0gc2Nyb2xsLng7CisJCQl0cnlZIC09IHNjcm9sbC55OworCQl9CisKKwkJaWYodHJ5WCA8IDApeworCQkJdHJ5WCA9IDA7CisJCQltYXRjaCA9IGZhbHNlOworCQl9CisKKwkJaWYodHJ5WSA8IDApeworCQkJdHJ5WSA9IDA7CisJCQltYXRjaCA9IGZhbHNlOworCQl9CisKKwkJdmFyIHggPSB0cnlYICsgdzsKKwkJaWYoeCA+IHZpZXcud2lkdGgpIHsKKwkJCXggPSB2aWV3LndpZHRoIC0gdzsKKwkJCW1hdGNoID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl4ID0gdHJ5WDsKKwkJfQorCQl4ID0gTWF0aC5tYXgocGFkZGluZ1swXSwgeCkgKyBzY3JvbGwueDsKKworCQl2YXIgeSA9IHRyeVkgKyBoOworCQlpZih5ID4gdmlldy5oZWlnaHQpIHsKKwkJCXkgPSB2aWV3LmhlaWdodCAtIGg7CisJCQltYXRjaCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJeSA9IHRyeVk7CisJCX0KKwkJeSA9IE1hdGgubWF4KHBhZGRpbmdbMV0sIHkpICsgc2Nyb2xsLnk7CisKKwkJaWYobWF0Y2gpeyAvL3BlcmZlY3QgbWF0Y2gsIHJldHVybiBub3cKKwkJCWJlc3R4ID0geDsKKwkJCWJlc3R5ID0geTsKKwkJCWJlc3REaXN0YW5jZSA9IDA7CisJCQliZXN0Q29ybmVyID0gY29ybmVyOworCQkJYnJlYWs7CisJCX1lbHNleworCQkJLy9ub3QgcGVyZmVjdCwgZmluZCBvdXQgd2hldGhlciBpdCBpcyBiZXR0ZXIgdGhhbiB0aGUgc2F2ZWQgb25lCisJCQl2YXIgZGlzdCA9IE1hdGgucG93KHgtdHJ5WC1zY3JvbGwueCwyKStNYXRoLnBvdyh5LXRyeVktc2Nyb2xsLnksMik7CisJCQlpZihiZXN0RGlzdGFuY2UgPiBkaXN0KXsKKwkJCQliZXN0RGlzdGFuY2UgPSBkaXN0OworCQkJCWJlc3R4ID0geDsKKwkJCQliZXN0eSA9IHk7CisJCQkJYmVzdENvcm5lciA9IGNvcm5lcjsKKwkJCX0KKwkJfQorCX0KKworCWlmKCF0cnlPbmx5KXsKKwkJbm9kZS5zdHlsZS5sZWZ0ID0gYmVzdHggKyAicHgiOworCQlub2RlLnN0eWxlLnRvcCA9IGJlc3R5ICsgInB4IjsKKwl9CisKKwlyZXR1cm4geyBsZWZ0OiBiZXN0eCwgdG9wOiBiZXN0eSwgeDogYmVzdHgsIHk6IGJlc3R5LCBkaXN0OiBiZXN0RGlzdGFuY2UsIGNvcm5lcjogIGJlc3RDb3JuZXJ9OwkvLwlvYmplY3QKK30KKworZG9qby5odG1sLnBsYWNlT25TY3JlZW5Qb2ludCA9IGZ1bmN0aW9uKG5vZGUsIGRlc2lyZWRYLCBkZXNpcmVkWSwgcGFkZGluZywgaGFzU2Nyb2xsKSB7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwucGxhY2VPblNjcmVlblBvaW50IiwgInVzZSBkb2pvLmh0bWwucGxhY2VPblNjcmVlbigpIGluc3RlYWQiLCAiMC41Iik7CisJcmV0dXJuIGRvam8uaHRtbC5wbGFjZU9uU2NyZWVuKG5vZGUsIGRlc2lyZWRYLCBkZXNpcmVkWSwgcGFkZGluZywgaGFzU2Nyb2xsLCBbJ1RMJywgJ1RSJywgJ0JMJywgJ0JSJ10pOworfQorCitkb2pvLmh0bWwucGxhY2VPblNjcmVlbkFyb3VuZEVsZW1lbnQgPSBmdW5jdGlvbigKKwkvKiBIVE1MRWxlbWVudCAqL25vZGUsCisJLyogSFRNTEVsZW1lbnQgKi9hcm91bmROb2RlLAorCS8qIGludGVnZXIgKi9wYWRkaW5nLAorCS8qIHN0cmluZz8gKi9hcm91bmRUeXBlLAorCS8qIHN0cmluZz8gKi9hcm91bmRDb3JuZXJzLAorCS8qIGJvb2xlYW4/ICovdHJ5T25seQorKXsKKwkvLwlzdW1tYXJ5CisJLy8JTGlrZSBwbGFjZU9uU2NyZWVuLCBleGNlcHQgaXQgYWNjZXB0cyBhcm91bmROb2RlIGluc3RlYWQgb2YgeCx5CisJLy8JYW5kIGF0dGVtcHRzIHRvIHBsYWNlIG5vZGUgYXJvdW5kIGl0LiBhcm91bmRUeXBlIChzZWUKKwkvLwlkb2pvLmh0bWwuYm94U2l6aW5nIGluIGh0bWwvbGF5b3V0LmpzKSBkZXRlcm1pbmVzIHdoaWNoIGJveCBvZiB0aGUKKwkvLwlhcm91bmROb2RlIHNob3VsZCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb3V0ZXIgYm94LgorCS8vCWFyb3VuZENvcm5lcnMgc3BlY2lmeSBXaGljaCBjb3JuZXIgb2YgYXJvdW5kTm9kZSBzaG91bGQgYmUKKwkvLwl1c2VkIHRvIHBsYWNlIHRoZSBub2RlID0+IHdoaWNoIGNvcm5lcihzKSBvZiBub2RlIHRvIHVzZSAoc2VlIHRoZQorCS8vCWNvcm5lcnMgcGFyYW1ldGVyIGluIGRvam8uaHRtbC5wbGFjZU9uU2NyZWVuKQorCS8vCWFyb3VuZENvcm5lcnM6IHsnVEwnOiAnQkwnLCAnQkwnOiAnVEwnfQorCisJdmFyIGJlc3QsIGJlc3REaXN0YW5jZT1JbmZpbml0eTsKKwlhcm91bmROb2RlID0gZG9qby5ieUlkKGFyb3VuZE5vZGUpOworCXZhciBvbGREaXNwbGF5ID0gYXJvdW5kTm9kZS5zdHlsZS5kaXNwbGF5OworCWFyb3VuZE5vZGUuc3R5bGUuZGlzcGxheT0iIjsKKwl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0RWxlbWVudEJveChhcm91bmROb2RlLCBhcm91bmRUeXBlKTsKKwl2YXIgYXJvdW5kTm9kZVcgPSBtYi53aWR0aDsKKwl2YXIgYXJvdW5kTm9kZUggPSBtYi5oZWlnaHQ7CisJdmFyIGFyb3VuZE5vZGVQb3MgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihhcm91bmROb2RlLCB0cnVlLCBhcm91bmRUeXBlKTsKKwlhcm91bmROb2RlLnN0eWxlLmRpc3BsYXk9b2xkRGlzcGxheTsKKworCWZvcih2YXIgbm9kZUNvcm5lciBpbiBhcm91bmRDb3JuZXJzKXsKKwkJdmFyIHBvcywgZGVzaXJlZFgsIGRlc2lyZWRZOworCQl2YXIgY29ybmVycyA9IGFyb3VuZENvcm5lcnNbbm9kZUNvcm5lcl07CisKKwkJZGVzaXJlZFggPSBhcm91bmROb2RlUG9zLnggKyAobm9kZUNvcm5lci5jaGFyQXQoMSk9PSdMJyA/IDAgOiBhcm91bmROb2RlVyk7CisJCWRlc2lyZWRZID0gYXJvdW5kTm9kZVBvcy55ICsgKG5vZGVDb3JuZXIuY2hhckF0KDApPT0nVCcgPyAwIDogYXJvdW5kTm9kZUgpOworCisJCXBvcyA9IGRvam8uaHRtbC5wbGFjZU9uU2NyZWVuKG5vZGUsIGRlc2lyZWRYLCBkZXNpcmVkWSwgcGFkZGluZywgdHJ1ZSwgY29ybmVycywgdHJ1ZSk7CisJCWlmKHBvcy5kaXN0ID09IDApeworCQkJYmVzdCA9IHBvczsKKwkJCWJyZWFrOworCQl9ZWxzZXsKKwkJCS8vbm90IHBlcmZlY3QsIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgYmV0dGVyIHRoYW4gdGhlIHNhdmVkIG9uZQorCQkJaWYoYmVzdERpc3RhbmNlID4gcG9zLmRpc3QpeworCQkJCWJlc3REaXN0YW5jZSA9IHBvcy5kaXN0OworCQkJCWJlc3QgPSBwb3M7CisJCQl9CisJCX0KKwl9CisKKwlpZighdHJ5T25seSl7CisJCW5vZGUuc3R5bGUubGVmdCA9IGJlc3QubGVmdCArICJweCI7CisJCW5vZGUuc3R5bGUudG9wID0gYmVzdC50b3AgKyAicHgiOworCX0KKwlyZXR1cm4gYmVzdDsJLy8Jb2JqZWN0Cit9CisKK2Rvam8uaHRtbC5zY3JvbGxJbnRvVmlldyA9IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJLy8Jc3VtbWFyeQorCS8vCVNjcm9sbCB0aGUgcGFzc2VkIG5vZGUgaW50byB2aWV3LCBpZiBpdCBpcyBub3QuCisJaWYoIW5vZGUpeyByZXR1cm47IH0KKworCS8vIGRvbid0IHJlbHkgb24gdGhhdCBub2RlLnNjcm9sbEludG9WaWV3IHdvcmtzIGp1c3QgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgdGhlcmUKKwkvLyBpdCBkb2VzbnQgd29yayBpbiBLb25xdWVyb3Igb3IgT3BlcmEgZXZlbiB0aG91Z2ggdGhlIGZ1bmN0aW9uIGlzIHRoZXJlIGFuZCBwcm9iYWJseQorCS8vIG5vdCBzYWZhcmkgZWl0aGVyCisJLy8gZG9udCBsaWtlIGJyb3dzZXIgc25pZmZzIGltcGxlbWVudGF0aW9ucyBidXQgc29tZXRpbWVzIHlvdSBoYXZlIHRvIHVzZSBpdAorCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkvL29ubHkgY2FsbCBzY3JvbGxJbnRvVmlldyBpZiB0aGVyZSBpcyBhIHNjcm9sbGJhciBmb3IgdGhpcyBtZW51LAorCQkvL290aGVyd2lzZSwgc2Nyb2xsSW50b1ZpZXcgd2lsbCBzY3JvbGwgdGhlIHdpbmRvdyBzY3JvbGxiYXIKKwkJaWYoZG9qby5odG1sLmdldEJvcmRlckJveChub2RlLnBhcmVudE5vZGUpLmhlaWdodCA8PSBub2RlLnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KXsKKwkJCW5vZGUuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpOworCQl9CisJfWVsc2UgaWYoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKXsKKwkJLy8gSUUsIG1vemlsbGEKKwkJbm9kZS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7CisJfWVsc2V7CisJCXZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7CisJCXZhciBwYXJlbnRCb3R0b20gPSBwYXJlbnQuc2Nyb2xsVG9wICsgZG9qby5odG1sLmdldEJvcmRlckJveChwYXJlbnQpLmhlaWdodDsKKwkJdmFyIG5vZGVCb3R0b20gPSBub2RlLm9mZnNldFRvcCArIGRvam8uaHRtbC5nZXRNYXJnaW5Cb3gobm9kZSkuaGVpZ2h0OworCQlpZihwYXJlbnRCb3R0b20gPCBub2RlQm90dG9tKXsKKwkJCXBhcmVudC5zY3JvbGxUb3AgKz0gKG5vZGVCb3R0b20gLSBwYXJlbnRCb3R0b20pOworCQl9ZWxzZSBpZihwYXJlbnQuc2Nyb2xsVG9wID4gbm9kZS5vZmZzZXRUb3ApeworCQkJcGFyZW50LnNjcm9sbFRvcCAtPSAocGFyZW50LnNjcm9sbFRvcCAtIG5vZGUub2Zmc2V0VG9wKTsKKwkJfQorCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLmxmeC50b2dnbGUiKTsKKworCitkb2pvLmxmeC50b2dnbGUucGxhaW4gPSB7CisJc2hvdzogZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2speworCQlkb2pvLmh0bWwuc2hvdyhub2RlKTsKKwkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24oY2FsbGJhY2spKXsgY2FsbGJhY2soKTsgfQorCX0sCisJCisJaGlkZTogZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2speworCQlkb2pvLmh0bWwuaGlkZShub2RlKTsKKwkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24oY2FsbGJhY2spKXsgY2FsbGJhY2soKTsgfQorCX0KK30KKworZG9qby5sZngudG9nZ2xlLmZhZGUgPSB7CisJc2hvdzogZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2speworCQlkb2pvLmxmeC5mYWRlU2hvdyhub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykucGxheSgpOworCX0sCisKKwloaWRlOiBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayl7CisJCWRvam8ubGZ4LmZhZGVIaWRlKG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKS5wbGF5KCk7CisJfQorfQorCitkb2pvLmxmeC50b2dnbGUud2lwZSA9IHsKKwlzaG93OiBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayl7CisJCWRvam8ubGZ4LndpcGVJbihub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykucGxheSgpOworCX0sCisKKwloaWRlOiBmdW5jdGlvbihub2RlLCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayl7CisJCWRvam8ubGZ4LndpcGVPdXQobm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spLnBsYXkoKTsKKwl9Cit9CisKK2Rvam8ubGZ4LnRvZ2dsZS5leHBsb2RlID0geworCXNob3c6IGZ1bmN0aW9uKG5vZGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrLCBleHBsb2RlU3JjKXsKKwkJZG9qby5sZnguZXhwbG9kZShleHBsb2RlU3JjfHx7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSwgbm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spLnBsYXkoKTsKKwl9LAorCisJaGlkZTogZnVuY3Rpb24obm9kZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2ssIGV4cGxvZGVTcmMpeworCQlkb2pvLmxmeC5pbXBsb2RlKG5vZGUsIGV4cGxvZGVTcmN8fHt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LCBkdXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjaykucGxheSgpOworCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0Iik7CisKKworCisKKworCisKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5IdG1sV2lkZ2V0IiwgZG9qby53aWRnZXQuRG9tV2lkZ2V0LCB7CQkJCQkJCQkgCisJLy8gc3VtbWFyeQorCS8vCUJhc2UgY2xhc3MgZm9yIGFsbCBicm93c2VyIGJhc2VkIHdpZGdldHMsIG9yIGF0IGxlYXN0ICJodG1sIiB3aWRnZXRzLgorCS8vCVRoZSBtZWFuaW5nIG9mICJodG1sIiBoYXMgYmVjb21lIHVuY2xlYXI7IGluIHByYWN0aWNlLCBhbGwgd2lkZ2V0cyBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLgorCQorCS8vIHRlbXBsYXRlQ3NzUGF0aDogU3RyaW5nCisJLy8JUGF0aCB0byBDU1MgZmlsZSBmb3IgdGhpcyB3aWRnZXQKKwl0ZW1wbGF0ZUNzc1BhdGg6IG51bGwsCisJCisJLy8gdGVtcGxhdGVQYXRoOiBTdHJpbmcKKwkvLwlQYXRoIHRvIHRlbXBsYXRlIChIVE1MIGZpbGUpIGZvciB0aGlzIHdpZGdldAorCXRlbXBsYXRlUGF0aDogbnVsbCwKKworCS8vIGxhbmc6IFN0cmluZworCS8vCUxhbmd1YWdlIHRvIGRpc3BsYXkgdGhpcyB3aWRnZXQgaW4gKGxpa2UgZW4tdXMpLgorCS8vCURlZmF1bHRzIHRvIGJyb3dlcidzIHNwZWNpZmllZCBwcmVmZXJyZWQgbGFuZ3VhZ2UgKHR5cGljYWxseSB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIE9TKQorCWxhbmc6ICIiLAorCisJLy8gdG9nZ2xlOiBTdHJpbmcKKwkvLwlDb250cm9scyBhbmltYXRpb24gZWZmZWN0IGZvciB3aGVuIHNob3coKSBhbmQgaGlkZSgpIChvciB0b2dnbGUoKSkgYXJlIGNhbGxlZC4KKwkvLwlQb3NzaWJsZSB2YWx1ZXM6ICJwbGFpbiIsICJ3aXBlIiwgImZhZGUiLCAiZXhwbG9kZSIKKwl0b2dnbGU6ICJwbGFpbiIsCisKKwkvLyB0b2dnbGVEdXJhdGlvbjogSW50ZWdlcgorCS8vCU51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIHRvZ2dsZSBhbmltYXRpb24gZWZmZWN0IHRvIGNvbXBsZXRlCisJdG9nZ2xlRHVyYXRpb246IDE1MCwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpeworCQkvLyBzdW1tYXJ5OiBjYWxsZWQgYWZ0ZXIgdGhlIHdpZGdldCBpcyByZW5kZXJlZDsgbW9zdCBzdWJjbGFzc2VzIHdvbid0IG92ZXJyaWRlIG9yIGNhbGwgdGhpcyBmdW5jdGlvbgorCX0sCisKKwlwb3N0TWl4SW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbihhcmdzLCBmcmFnKXsKKwkJaWYodGhpcy5sYW5nID09PSAiIil7dGhpcy5sYW5nID0gbnVsbDt9CisJCS8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHNldHRpbmcgZm9yIHRvZ2dsZSwgZ2V0IHRvZ2dsZSBvYmplY3QKKwkJLy8gKGRlZmF1bHQgdG8gcGxhaW4gdG9nZ2xlciBpZiB1c2VyIHNwZWNpZmllZCB0b2dnbGVyIG5vdCBwcmVzZW50KQorCQl0aGlzLnRvZ2dsZU9iaiA9CisJCQlkb2pvLmxmeC50b2dnbGVbdGhpcy50b2dnbGUudG9Mb3dlckNhc2UoKV0gfHwgZG9qby5sZngudG9nZ2xlLnBsYWluOworCX0sCisKKwljcmVhdGVOb2Rlc0Zyb21UZXh0OiBmdW5jdGlvbih0eHQsIHdyYXApeworCQlyZXR1cm4gZG9qby5odG1sLmNyZWF0ZU5vZGVzRnJvbVRleHQodHh0LCB3cmFwKTsKKwl9LAorCisJZGVzdHJveVJlbmRlcmluZzogZnVuY3Rpb24oZmluYWxpemUpeworCQl0cnl7CisJCQlpZih0aGlzLmJnSWZyYW1lKXsKKwkJCQl0aGlzLmJnSWZyYW1lLnJlbW92ZSgpOworCQkJCWRlbGV0ZSB0aGlzLmJnSWZyYW1lOworCQkJfQorCQkJaWYoIWZpbmFsaXplICYmIHRoaXMuZG9tTm9kZSl7CisJCQkJZG9qby5ldmVudC5icm93c2VyLmNsZWFuKHRoaXMuZG9tTm9kZSk7CisJCQl9CisJCQlkb2pvLndpZGdldC5IdG1sV2lkZ2V0LnN1cGVyY2xhc3MuZGVzdHJveVJlbmRlcmluZy5jYWxsKHRoaXMpOworCQl9Y2F0Y2goZSl7IC8qIHNxdWVsY2ghICovIH0KKwl9LAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRGlzcGxheWluZy9oaWRpbmcgdGhlIHdpZGdldAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWlzU2hvd2luZzogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeQorCQkvLwlUZXN0cyB3aGV0aGVyIHdpZGdldCBpcyBzZXQgdG8gc2hvdy1tb2RlIG9yIGhpZGUtbW9kZSAoc2VlIHNob3coKSBhbmQgCisJCS8vCWhpZGUoKSBtZXRob2RzKQorCQkvLworCQkvLwlUaGlzIGZ1bmN0aW9uIGlzIHBvb3JseSBuYW1lZC4gIEV2ZW4gaWYgd2lkZ2V0IGlzIGluIHNob3ctbW9kZSwKKwkJLy8JaWYgaXQncyBpbnNpZGUgYSBjb250YWluZXIgdGhhdCdzIGhpZGRlbgorCQkvLwkoZWl0aGVyIGEgY29udGFpbmVyIHdpZGdldCwgb3IganVzdCBhIGRvbW5vZGUgd2l0aCBkaXNwbGF5Om5vbmUpLAorCQkvLwl0aGVuIGl0IHdvbid0IGJlIGRpc3BsYXllZAorCQlyZXR1cm4gZG9qby5odG1sLmlzU2hvd2luZyh0aGlzLmRvbU5vZGUpOwkvLyBCb29sZWFuCisJfSwKKworCXRvZ2dsZVNob3dpbmc6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IHNob3cgb3IgaGlkZSB0aGUgd2lkZ2V0LCB0byBzd2l0Y2ggaXQncyBzdGF0ZQorCQlpZih0aGlzLmlzU2hvd2luZygpKXsKKwkJCXRoaXMuaGlkZSgpOworCQl9ZWxzZXsKKwkJCXRoaXMuc2hvdygpOworCQl9CisJfSwKKworCXNob3c6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IHNob3cgdGhlIHdpZGdldAorCQlpZih0aGlzLmlzU2hvd2luZygpKXsgcmV0dXJuOyB9CisJCXRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcz10cnVlOworCQl0aGlzLnRvZ2dsZU9iai5zaG93KHRoaXMuZG9tTm9kZSwgdGhpcy50b2dnbGVEdXJhdGlvbiwgbnVsbCwKKwkJCWRvam8ubGFuZy5oaXRjaCh0aGlzLCB0aGlzLm9uU2hvdyksIHRoaXMuZXhwbG9kZVNyYyk7CisJfSwKKworCW9uU2hvdzogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogY2FsbGVkIGFmdGVyIHRoZSBzaG93KCkgYW5pbWF0aW9uIGhhcyBjb21wbGV0ZWQKKwkJdGhpcy5hbmltYXRpb25JblByb2dyZXNzPWZhbHNlOworCQl0aGlzLmNoZWNrU2l6ZSgpOworCX0sCisKKwloaWRlOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBoaWRlIHRoZSB3aWRnZXQgKGVuZGluZyB1cCB3aXRoIGRpc3BsYXk6bm9uZSkKKwkJaWYoIXRoaXMuaXNTaG93aW5nKCkpeyByZXR1cm47IH0KKwkJdGhpcy5hbmltYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKKwkJdGhpcy50b2dnbGVPYmouaGlkZSh0aGlzLmRvbU5vZGUsIHRoaXMudG9nZ2xlRHVyYXRpb24sIG51bGwsCisJCQlkb2pvLmxhbmcuaGl0Y2godGhpcywgdGhpcy5vbkhpZGUpLCB0aGlzLmV4cGxvZGVTcmMpOworCX0sCisKKwlvbkhpZGU6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGNhbGxlZCBhZnRlciB0aGUgaGlkZSgpIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkCisJCXRoaXMuYW5pbWF0aW9uSW5Qcm9ncmVzcz1mYWxzZTsKKwl9LAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU2l6aW5nIHJlbGF0ZWQgbWV0aG9kcworCS8vICBJZiB0aGUgcGFyZW50IGNoYW5nZXMgc2l6ZSB0aGVuIGZvciBlYWNoIGNoaWxkIGl0IHNob3VsZCBjYWxsIGVpdGhlcgorCS8vICAgLSByZXNpemVUbygpOiBzaXplIHRoZSBjaGlsZCBleHBsaWNpdGx5CisJLy8gICAtIG9yIGNoZWNrU2l6ZSgpOiBub3RpZnkgdGhlIGNoaWxkIHRoZSB0aGUgcGFyZW50IGhhcyBjaGFuZ2VkIHNpemUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCV9pc1Jlc2l6ZWQ6IGZ1bmN0aW9uKHcsIGgpeworCQkvLyBzdW1tYXJ5CisJCS8vCVRlc3QgaWYgbXkgc2l6ZSBoYXMgY2hhbmdlZC4KKwkJLy8JSWYgd2lkdGggJiBoZWlnaHQgYXJlIHNwZWNpZmllZCB0aGVuIHRoYXQncyBteSBuZXcgc2l6ZTsgb3RoZXJ3aXNlLAorCQkvLwlxdWVyeSBvdXRlcldpZHRoL291dGVySGVpZ2h0IG9mIG15IGRvbU5vZGUKKworCQkvLyBJZiBJJ20gbm90IGJlaW5nIGRpc3BsYXllZCB0aGVuIGRpc3JlZ2FyZCAoc2hvdygpIG11c3QKKwkJLy8gY2hlY2sgaWYgdGhlIHNpemUgaGFzIGNoYW5nZWQpCisJCWlmKCF0aGlzLmlzU2hvd2luZygpKXsgcmV0dXJuIGZhbHNlOyB9CisKKwkJLy8gSWYgbXkgcGFyZW50IGhhcyBiZWVuIHJlc2l6ZWQgYW5kIEkgaGF2ZSBzdHlsZT0iaGVpZ2h0OiAxMDAlIgorCQkvLyBvciBzb21ldGhpbmcgc2ltaWxhciB0aGVuIG15IHNpemUgaGFzIGNoYW5nZWQgdG9vLgorCQl2YXIgd2ggPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJCXZhciB3aWR0aD13fHx3aC53aWR0aDsKKwkJdmFyIGhlaWdodD1ofHx3aC5oZWlnaHQ7CisJCWlmKHRoaXMud2lkdGggPT0gd2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gaGVpZ2h0KXsgcmV0dXJuIGZhbHNlOyB9CisKKwkJdGhpcy53aWR0aD13aWR0aDsKKwkJdGhpcy5oZWlnaHQ9aGVpZ2h0OworCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJY2hlY2tTaXplOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5CisJCS8vCUNhbGxlZCB3aGVuIG15IHBhcmVudCBoYXMgY2hhbmdlZCBzaXplLCBidXQgbXkgcGFyZW50IHdvbid0IGNhbGwgcmVzaXplVG8oKS4KKwkJLy8JVGhpcyBpcyB1c2VmdWwgaWYgbXkgc2l6ZSBpcyBoZWlnaHQ6MTAwJSBvciBzb21ldGhpbmcgc2ltaWxhci4KKwkJLy8JQWxzbyBjYWxsZWQgd2hlbmV2ZXIgSSBhbSBzaG93biwgYmVjYXVzZSB0aGUgZmlyc3QgdGltZSBJIGFtIHNob3duIEkgbWF5IG5lZWQKKwkJLy8JdG8gZG8gc2l6ZSBjYWxjdWxhdGlvbnMuCisJCWlmKCF0aGlzLl9pc1Jlc2l6ZWQoKSl7IHJldHVybjsgfQorCQl0aGlzLm9uUmVzaXplZCgpOworCX0sCisKKwlyZXNpemVUbzogZnVuY3Rpb24odywgaCl7CisJCS8vIHN1bW1hcnk6IGV4cGxpY2l0bHkgc2V0IHRoaXMgd2lkZ2V0J3Mgc2l6ZSAoaW4gcGl4ZWxzKS4KKwkJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUsIHsgd2lkdGg6IHcsIGhlaWdodDogaCB9KTsKKwkJCisJCS8vIGNhbid0IGRvIHNpemluZyBpZiB3aWRnZXQgaXMgaGlkZGVuIGJlY2F1c2UgcmVmZXJlbmNpbmcgbm9kZS5vZmZzZXRXaWR0aC9ub2RlLm9mZnNldEhlaWdodCByZXR1cm5zIDAuCisJCS8vIGRvIHNpemluZyBvbiBzaG93KCkgaW5zdGVhZC4KKwkJaWYodGhpcy5pc1Nob3dpbmcoKSl7CisJCQl0aGlzLm9uUmVzaXplZCgpOworCQl9CisJfSwKKworCXJlc2l6ZVNvb246IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnkKKwkJLy8Jc2NoZWR1bGUgb25SZXNpemVkKCkgdG8gYmUgY2FsbGVkIHNvb24sIGFmdGVyIGJyb3dzZXIgaGFzIGhhZAorCQkvLwlhIGxpdHRsZSBtb3JlIHRpbWUgdG8gY2FsY3VsYXRlIHRoZSBzaXplcworCQlpZih0aGlzLmlzU2hvd2luZygpKXsKKwkJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsIHRoaXMub25SZXNpemVkLCAwKTsKKwkJfQorCX0sCisKKwlvblJlc2l6ZWQ6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnkKKwkJLy8JQ2FsbGVkIHdoZW4gbXkgc2l6ZSBoYXMgY2hhbmdlZC4KKwkJLy8JTXVzdCBub3RpZnkgY2hpbGRyZW4gaWYgdGhlaXIgc2l6ZSBoYXMgKHBvc3NpYmx5KSBjaGFuZ2VkLgorCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCl7IGlmKGNoaWxkLmNoZWNrU2l6ZSl7Y2hpbGQuY2hlY2tTaXplKCk7fSB9KTsKKwl9Cit9KTsKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbImRvam8ueG1sLlBhcnNlIiwgCisJCQkgImRvam8ud2lkZ2V0LldpZGdldCIsIAorCQkJICJkb2pvLndpZGdldC5QYXJzZSIsIAorCQkJICJkb2pvLndpZGdldC5NYW5hZ2VyIl0sCisJYnJvd3NlcjogWyJkb2pvLndpZGdldC5Eb21XaWRnZXQiLAorCQkJICAiZG9qby53aWRnZXQuSHRtbFdpZGdldCJdLAorCWRhc2hib2FyZDogWyJkb2pvLndpZGdldC5Eb21XaWRnZXQiLAorCQkJICAiZG9qby53aWRnZXQuSHRtbFdpZGdldCJdLAorCXN2ZzogCSBbImRvam8ud2lkZ2V0LlN2Z1dpZGdldCJdLAorCXJoaW5vOiAJIFsiZG9qby53aWRnZXQuU3d0V2lkZ2V0Il0KK30pOworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC4qIik7CisKK2Rvam8ua3dDb21wb3VuZFJlcXVpcmUoeworCWNvbW1vbjogWyAiZG9qby5odG1sLmNvbW1vbiIsCisJCQkgICJkb2pvLmh0bWwuc3R5bGUiIF0KK30pOworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuKiIpOworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5odG1sLnNlbGVjdGlvbiIpOworCisKKworCisvKioKKyAqIHR5cGUgb2Ygc2VsZWN0aW9uCisqKi8KK2Rvam8uaHRtbC5zZWxlY3Rpb25UeXBlID0geworCU5PTkUgOiAwLCAvL3NlbGVjdGlvbiBpcyBlbXB0eQorCVRFWFQgOiAxLCAvL3NlbGVjdGlvbiBjb250YWlucyB0ZXh0IChtYXkgYWxzbyBjb250YWlucyBDT05UUk9MIG9iamVjdHMpCisJQ09OVFJPTCA6IDIgLy9vbmx5IG9uZSBlbGVtZW50IGlzIHNlbGVjdGVkIChzdWNoIGFzIGltZywgdGFibGUgZXRjKQorfTsKKworZG9qby5odG1sLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5OiBkZXNlbGVjdCB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gbWFrZSBpdCBlbXB0eQorCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwl0cnl7CisJCWlmKF93aW5kb3dbImdldFNlbGVjdGlvbiJdKXsgCisJCQlpZihkb2pvLnJlbmRlci5odG1sLnNhZmFyaSl7CisJCQkJLy8gcHVsbGVkIGZyb20gV2ViQ29yZS9lY21hL2tqc193aW5kb3cuY3BwLCBsaW5lIDI1MzYKKwkJCQlfd2luZG93LmdldFNlbGVjdGlvbigpLmNvbGxhcHNlKCk7CisJCQl9ZWxzZXsKKwkJCQlfd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOworCQkJfQorCQl9ZWxzZSBpZihfZG9jdW1lbnQuc2VsZWN0aW9uKXsKKwkJCWlmKF9kb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkpeworCQkJCV9kb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKKwkJCX1lbHNlIGlmKF9kb2N1bWVudC5zZWxlY3Rpb24uY2xlYXIpeworCQkJCV9kb2N1bWVudC5zZWxlY3Rpb24uY2xlYXIoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Y2F0Y2goZSl7CisJCWRvam8uZGVidWcoZSk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Rvam8uaHRtbC5kaXNhYmxlU2VsZWN0aW9uID0gZnVuY3Rpb24oLypEb21Ob2RlKi9lbGVtZW50KXsKKwkvLyBzdW1tYXJ5OiBkaXNhYmxlIHNlbGVjdGlvbiBvbiBhIG5vZGUKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpfHxkb2pvLmJvZHkoKTsKKwl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisJCisJaWYoaC5tb3ppbGxhKXsKKwkJZWxlbWVudC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gIm5vbmUiOworCX1lbHNlIGlmKGguc2FmYXJpKXsKKwkJZWxlbWVudC5zdHlsZS5LaHRtbFVzZXJTZWxlY3QgPSAibm9uZSI7IAorCX1lbHNlIGlmKGguaWUpeworCQllbGVtZW50LnVuc2VsZWN0YWJsZSA9ICJvbiI7CisJfWVsc2V7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK2Rvam8uaHRtbC5lbmFibGVTZWxlY3Rpb24gPSBmdW5jdGlvbigvKkRvbU5vZGUqL2VsZW1lbnQpeworCS8vIHN1bW1hcnk6IGVuYWJsZSBzZWxlY3Rpb24gb24gYSBub2RlCisJZWxlbWVudCA9IGRvam8uYnlJZChlbGVtZW50KXx8ZG9qby5ib2R5KCk7CisJCisJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCWlmKGgubW96aWxsYSl7IAorCQllbGVtZW50LnN0eWxlLk1velVzZXJTZWxlY3QgPSAiIjsgCisJfWVsc2UgaWYoaC5zYWZhcmkpeworCQllbGVtZW50LnN0eWxlLktodG1sVXNlclNlbGVjdCA9ICIiOworCX1lbHNlIGlmKGguaWUpeworCQllbGVtZW50LnVuc2VsZWN0YWJsZSA9ICJvZmYiOworCX1lbHNleworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitkb2pvLmh0bWwuc2VsZWN0RWxlbWVudCA9IGZ1bmN0aW9uKC8qRG9tTm9kZSovZWxlbWVudCl7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwuc2VsZWN0RWxlbWVudCIsICJyZXBsYWNlZCBieSBkb2pvLmh0bWwuc2VsZWN0aW9uLnNlbGVjdEVsZW1lbnRDaGlsZHJlbiIsIDAuNSk7Cit9CisKK2Rvam8uaHRtbC5zZWxlY3RJbnB1dFRleHQgPSBmdW5jdGlvbigvKkRvbU5vZGUqL2VsZW1lbnQpeworCS8vIHN1bW1hcnk6IHNlbGVjdCBhbGwgdGhlIHRleHQgaW4gYW4gaW5wdXQgZWxlbWVudAorCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpOworCWlmKF9kb2N1bWVudFsic2VsZWN0aW9uIl0gJiYgZG9qby5ib2R5KClbImNyZWF0ZVRleHRSYW5nZSJdKXsgLy8gSUUKKwkJdmFyIHJhbmdlID0gZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJcmFuZ2UubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLCAwKTsKKwkJcmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVyIiwgZWxlbWVudC52YWx1ZS5sZW5ndGgpOworCQlyYW5nZS5zZWxlY3QoKTsKKwl9ZWxzZSBpZihfd2luZG93WyJnZXRTZWxlY3Rpb24iXSl7CisJCXZhciBzZWxlY3Rpb24gPSBfd2luZG93LmdldFNlbGVjdGlvbigpOworCQkvLyBGSVhNRTogZG9lcyB0aGlzIHdvcmsgb24gU2FmYXJpPworCQllbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIGVsZW1lbnQudmFsdWUubGVuZ3RoKTsKKwl9CisJZWxlbWVudC5mb2N1cygpOworfQorCisKK2Rvam8uaHRtbC5pc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGZ1bmN0aW9uKCl7CisJZG9qby5kZXByZWNhdGVkKCJkb2pvLmh0bWwuaXNTZWxlY3Rpb25Db2xsYXBzZWQiLCAicmVwbGFjZWQgYnkgZG9qby5odG1sLnNlbGVjdGlvbi5pc0NvbGxhcHNlZCIsIDAuNSk7CisJcmV0dXJuIGRvam8uaHRtbC5zZWxlY3Rpb24uaXNDb2xsYXBzZWQoKTsKK30KKworZG9qby5sYW5nLm1peGluKGRvam8uaHRtbC5zZWxlY3Rpb24sIHsKKwlnZXRUeXBlOiBmdW5jdGlvbigpIHsKKwkJLy8gc3VtbWFyeTogR2V0IHRoZSBzZWxlY3Rpb24gdHlwZSAobGlrZSBkb2N1bWVudC5zZWxlY3QudHlwZSBpbiBJRSkuCisJCWlmKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKXsgLy9JRQorCQkJcmV0dXJuIGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlW2Rvam8uZG9jKCkuc2VsZWN0aW9uLnR5cGUudG9VcHBlckNhc2UoKV07CisJCX1lbHNleworCQkJdmFyIHN0eXBlID0gZG9qby5odG1sLnNlbGVjdGlvblR5cGUuVEVYVDsKKwkKKwkJCS8vIENoZWNrIGlmIHRoZSBhY3R1YWwgc2VsZWN0aW9uIGlzIGEgQ09OVFJPTCAoSU1HLCBUQUJMRSwgSFIsIGV0Yy4uLikuCisJCQl2YXIgb1NlbDsKKwkJCXRyeSB7b1NlbCA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7fQorCQkJY2F0Y2ggKGUpIHt9CisJCQkKKwkJCWlmKG9TZWwgJiYgb1NlbC5yYW5nZUNvdW50PT0xKXsKKwkJCQl2YXIgb1JhbmdlID0gb1NlbC5nZXRSYW5nZUF0KDApOworCQkJCWlmIChvUmFuZ2Uuc3RhcnRDb250YWluZXIgPT0gb1JhbmdlLmVuZENvbnRhaW5lciAmJiAob1JhbmdlLmVuZE9mZnNldCAtIG9SYW5nZS5zdGFydE9mZnNldCkgPT0gMQorCQkJCQkmJiBvUmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGUgIT0gZG9qby5kb20uVEVYVF9OT0RFKSB7CisJCQkJCXN0eXBlID0gZG9qby5odG1sLnNlbGVjdGlvblR5cGUuQ09OVFJPTDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gc3R5cGU7CisJCX0KKwl9LAorCWlzQ29sbGFwc2VkOiBmdW5jdGlvbigpIHsKKwkJLy8gc3VtbWFyeTogcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGVtcHR5CisJCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwkJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJCWlmKF9kb2N1bWVudFsic2VsZWN0aW9uIl0peyAvLyBJRQorCQkJcmV0dXJuIF9kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0ID09ICIiOworCQl9ZWxzZSBpZihfd2luZG93WyJnZXRTZWxlY3Rpb24iXSl7CisJCQl2YXIgc2VsZWN0aW9uID0gX3dpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKwkJCWlmKGRvam8ubGFuZy5pc1N0cmluZyhzZWxlY3Rpb24pKXsgLy8gU2FmYXJpCisJCQkJcmV0dXJuIHNlbGVjdGlvbiA9PSAiIjsKKwkJCX1lbHNleyAvLyBNb3ppbGxhL1czCisJCQkJcmV0dXJuIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKSA9PSAiIjsKKwkJCX0KKwkJfQorCX0sCisJZ2V0U2VsZWN0ZWRFbGVtZW50OiBmdW5jdGlvbigpIHsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQgKGlmIGFueSksIGp1c3QgaW4gdGhlIGNhc2UgdGhhdCBhIHNpbmdsZQorCQkvLwkJZWxlbWVudCAob2JqZWN0IGxpa2UgYW5kIGltYWdlIG9yIGEgdGFibGUpIGlzIHNlbGVjdGVkLgorCQlpZiAoIGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wgKXsKKwkJCWlmKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKXsgLy9JRQorCQkJCXZhciByYW5nZSA9IGRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQorCQkJCWlmICggcmFuZ2UgJiYgcmFuZ2UuaXRlbSApeworCQkJCQlyZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5pdGVtKDApOworCQkJCX0KKwkJCX1lbHNleworCQkJCXZhciBzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworCQkJCXJldHVybiBzZWxlY3Rpb24uYW5jaG9yTm9kZS5jaGlsZE5vZGVzWyBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IF07CisJCQl9CisJCX0KKwl9LAorCWdldFBhcmVudEVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCUdldCB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCisJCWlmKGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpeworCQkJdmFyIHAgPSBkb2pvLmh0bWwuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpOworCQkJaWYocCl7IHJldHVybiBwLnBhcmVudE5vZGU7IH0KKwkJfWVsc2V7CisJCQlpZihkb2pvLmRvYygpWyJzZWxlY3Rpb24iXSl7IC8vSUUKKwkJCQlyZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5wYXJlbnRFbGVtZW50KCk7CisJCQl9ZWxzZXsKKwkJCQl2YXIgc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKwkJCQlpZihzZWxlY3Rpb24peworCQkJCQl2YXIgbm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlOworCQkKKwkJCQkJd2hpbGUgKCBub2RlICYmIG5vZGUubm9kZVR5cGUgIT0gZG9qby5kb20uRUxFTUVOVF9OT0RFICl7CisJCQkJCQlub2RlID0gbm9kZS5wYXJlbnROb2RlOworCQkJCQl9CisJCQorCQkJCQlyZXR1cm4gbm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCWdldFNlbGVjdGVkVGV4dDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVJldHVybiB0aGUgdGV4dCAobm8gaHRtbCB0YWdzKSBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gb3IgbnVsbCBpZiBubyB0ZXh0IGlzIHNlbGVjdGVkCisJCWlmKGRvam8uZG9jKClbInNlbGVjdGlvbiJdKXsgLy9JRQorCQkJaWYoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRUeXBlKCkgPT0gZG9qby5odG1sLnNlbGVjdGlvblR5cGUuQ09OVFJPTCl7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gZG9qby5kb2MoKS5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0OworCQl9ZWxzZXsKKwkJCXZhciBzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpOworCQkJaWYoc2VsZWN0aW9uKXsKKwkJCQlyZXR1cm4gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CisJCQl9CisJCX0KKwl9LAorCWdldFNlbGVjdGVkSHRtbDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVJldHVybiB0aGUgaHRtbCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gb3IgbnVsbCBpZiB1bmF2YWlsYWJsZQorCQlpZihkb2pvLmRvYygpWyJzZWxlY3Rpb24iXSl7IC8vSUUKKwkJCWlmKGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0VHlwZSgpID09IGRvam8uaHRtbC5zZWxlY3Rpb25UeXBlLkNPTlRST0wpeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIGRvam8uZG9jKCkuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuaHRtbFRleHQ7CisJCX1lbHNleworCQkJdmFyIHNlbGVjdGlvbiA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CisJCQlpZihzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQpeworCQkJCXZhciBmcmFnID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVDb250ZW50cygpOworCQkJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQlkaXYuYXBwZW5kQ2hpbGQoZnJhZyk7CisJCQkJcmV0dXJuIGRpdi5pbm5lckhUTUw7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0sCisJaGFzQW5jZXN0b3JFbGVtZW50OiBmdW5jdGlvbigvKlN0cmluZyovdGFnTmFtZSAvKiAuLi4gKi8peworCQkvLyBzdW1tYXJ5OiAKKwkJLy8gCQlDaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBhICBwYXJlbnQgZWxlbWVudCB3aGljaCBpcyBvZiB0eXBlIHRhZ05hbWUgKG9yIG9uZSBvZiB0aGUgb3RoZXIgc3BlY2lmaWVkIHRhZ05hbWUpCisJCXJldHVybiAoZG9qby5odG1sLnNlbGVjdGlvbi5nZXRBbmNlc3RvckVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSAhPSBudWxsKTsKKwl9LAorCWdldEFuY2VzdG9yRWxlbWVudDogZnVuY3Rpb24oLypTdHJpbmcqL3RhZ05hbWUgLyogLi4uICovKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVJldHVybiB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdoaWNoIGlzIG9mIHR5cGUgdGFnTmFtZSAob3Igb25lIG9mIHRoZSBvdGhlciBzcGVjaWZpZWQgdGFnTmFtZSkKKwkJdmFyIG5vZGUgPSBkb2pvLmh0bWwuc2VsZWN0aW9uLmdldFNlbGVjdGVkRWxlbWVudCgpIHx8IGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0UGFyZW50RWxlbWVudCgpOworCQl3aGlsZShub2RlIC8qJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2JvZHknKi8peworCQkJaWYoZG9qby5odG1sLnNlbGVjdGlvbi5pc1RhZyhub2RlLCBhcmd1bWVudHMpLmxlbmd0aD4wKXsKKwkJCQlyZXR1cm4gbm9kZTsKKwkJCX0KKwkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfSwKKwkvL21vZGlmaWVkIGZyb20gZG9qby5odG1sLmlzVGFnIHRvIHRha2UgYW4gYXJyYXkgYXMgc2Vjb25kIHBhcmFtZXRlcgorCWlzVGFnOiBmdW5jdGlvbigvKkRvbU5vZGUqL25vZGUsIC8qQXJyYXkqL3RhZ3MpIHsKKwkJaWYobm9kZSAmJiBub2RlLnRhZ05hbWUpIHsKKwkJCWZvciAodmFyIGk9MDsgaTx0YWdzLmxlbmd0aDsgaSsrKXsKKwkJCQlpZiAobm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PVN0cmluZyh0YWdzW2ldKS50b0xvd2VyQ2FzZSgpKXsKKwkJCQkJcmV0dXJuIFN0cmluZyh0YWdzW2ldKS50b0xvd2VyQ2FzZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gIiI7CisJfSwKKwlzZWxlY3RFbGVtZW50OiBmdW5jdGlvbigvKkRvbU5vZGUqL2VsZW1lbnQpIHsKKwkJLy8gc3VtbWFyeTogY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uIGFuZCBzZWxlY3QgZWxlbWVudCAoaW5jbHVkaW5nIGFsbCBpdHMgY2hpbGRyZW4pCisJCXZhciBfd2luZG93ID0gZG9qby5nbG9iYWwoKTsKKwkJdmFyIF9kb2N1bWVudCA9IGRvam8uZG9jKCk7CisJCWVsZW1lbnQgPSBkb2pvLmJ5SWQoZWxlbWVudCk7CisJCWlmKF9kb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9qby5ib2R5KCkuY3JlYXRlVGV4dFJhbmdlKXsgLy8gSUUKKwkJCXRyeXsKKwkJCQl2YXIgcmFuZ2UgPSBkb2pvLmJvZHkoKS5jcmVhdGVDb250cm9sUmFuZ2UoKTsKKwkJCQlyYW5nZS5hZGRFbGVtZW50KGVsZW1lbnQpOworCQkJCXJhbmdlLnNlbGVjdCgpOworCQkJfWNhdGNoKGUpeworCQkJCWRvam8uaHRtbC5zZWxlY3Rpb24uc2VsZWN0RWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOworCQkJfQorCQl9ZWxzZSBpZihfd2luZG93WyJnZXRTZWxlY3Rpb24iXSl7CisJCQl2YXIgc2VsZWN0aW9uID0gX3dpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKwkJCS8vIEZJWE1FOiBkb2VzIHRoaXMgd29yayBvbiBTYWZhcmk/CisJCQlpZihzZWxlY3Rpb25bInJlbW92ZUFsbFJhbmdlcyJdKXsgLy8gTW96aWxsYQorCQkJCXZhciByYW5nZSA9IF9kb2N1bWVudC5jcmVhdGVSYW5nZSgpIDsKKwkJCQlyYW5nZS5zZWxlY3ROb2RlKGVsZW1lbnQpIDsKKwkJCQlzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCkgOworCQkJCXNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSkgOworCQkJfQorCQl9CisJfSwKKwlzZWxlY3RFbGVtZW50Q2hpbGRyZW46IGZ1bmN0aW9uKC8qRG9tTm9kZSovZWxlbWVudCl7CisJCS8vIHN1bW1hcnk6IGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBhbmQgc2VsZWN0IHRoZSBjb250ZW50IG9mIHRoZSBub2RlIChleGNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmKQorCQl2YXIgX3dpbmRvdyA9IGRvam8uZ2xvYmFsKCk7CisJCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCQllbGVtZW50ID0gZG9qby5ieUlkKGVsZW1lbnQpOworCQlpZihfZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvam8uYm9keSgpLmNyZWF0ZVRleHRSYW5nZSl7IC8vIElFCisJCQl2YXIgcmFuZ2UgPSBkb2pvLmJvZHkoKS5jcmVhdGVUZXh0UmFuZ2UoKTsKKwkJCXJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGVsZW1lbnQpOworCQkJcmFuZ2Uuc2VsZWN0KCk7CisJCX1lbHNlIGlmKF93aW5kb3dbImdldFNlbGVjdGlvbiJdKXsKKwkJCXZhciBzZWxlY3Rpb24gPSBfd2luZG93LmdldFNlbGVjdGlvbigpOworCQkJaWYoc2VsZWN0aW9uWyJzZXRCYXNlQW5kRXh0ZW50Il0peyAvLyBTYWZhcmkKKwkJCQlzZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChlbGVtZW50LCAwLCBlbGVtZW50LCBlbGVtZW50LmlubmVyVGV4dC5sZW5ndGggLSAxKTsKKwkJCX0gZWxzZSBpZihzZWxlY3Rpb25bInNlbGVjdEFsbENoaWxkcmVuIl0peyAvLyBNb3ppbGxhCisJCQkJc2VsZWN0aW9uLnNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnQpOworCQkJfQorCQl9CisJfSwKKwlnZXRCb29rbWFyazogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogUmV0cmlldmVzIGEgYm9va21hcmsgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG1vdmVUb0Jvb2ttYXJrIHRvIHJldHVybiB0byB0aGUgc2FtZSByYW5nZQorCQl2YXIgYm9va21hcms7CisJCXZhciBfZG9jdW1lbnQgPSBkb2pvLmRvYygpOworCQlpZihfZG9jdW1lbnRbInNlbGVjdGlvbiJdKXsgLy8gSUUKKwkJCXZhciByYW5nZSA9IF9kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKKwkJCWJvb2ttYXJrID0gcmFuZ2UuZ2V0Qm9va21hcmsoKTsKKwkJfWVsc2V7CisJCQl2YXIgc2VsZWN0aW9uOworCQkJdHJ5IHtzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpO30KKwkJCWNhdGNoIChlKSB7fQorCQkJaWYoc2VsZWN0aW9uKXsKKwkJCQl2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKKwkJCQlib29rbWFyayA9IHJhbmdlLmNsb25lUmFuZ2UoKTsKKwkJCX1lbHNleworCQkJCWRvam8uZGVidWcoIk5vIGlkZWEgaG93IHRvIHN0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBmb3IgdGhpcyBicm93c2VyISIpOworCQkJfQorCQl9CisJCXJldHVybiBib29rbWFyazsKKwl9LAorCW1vdmVUb0Jvb2ttYXJrOiBmdW5jdGlvbigvKk9iamVjdCovYm9va21hcmspeworCQkvLyBzdW1tYXJ5OiBNb3ZlcyBjdXJyZW50IHNlbGVjdGlvbiB0byBhIGJvb2ttYXJrCisJCS8vIGJvb2ttYXJrOiB0aGlzIHNob3VsZCBiZSBhIHJldHVybmVkIG9iamVjdCBmcm9tIGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKQorCQl2YXIgX2RvY3VtZW50ID0gZG9qby5kb2MoKTsKKwkJaWYoX2RvY3VtZW50WyJzZWxlY3Rpb24iXSl7IC8vIElFCisJCQl2YXIgcmFuZ2UgPSBfZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQkgcmFuZ2UubW92ZVRvQm9va21hcmsoYm9va21hcmspOworCQkJIHJhbmdlLnNlbGVjdCgpOworCQl9ZWxzZXsgLy9Nb3ovVzNDCisJCQl2YXIgc2VsZWN0aW9uOworCQkJdHJ5IHtzZWxlY3Rpb24gPSBkb2pvLmdsb2JhbCgpLmdldFNlbGVjdGlvbigpO30KKwkJCWNhdGNoIChlKSB7fQorCQkJaWYoc2VsZWN0aW9uICYmIHNlbGVjdGlvblsncmVtb3ZlQWxsUmFuZ2VzJ10peworCQkJCXNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKSA7CisJCQkJc2VsZWN0aW9uLmFkZFJhbmdlKGJvb2ttYXJrKSA7CisJCQl9ZWxzZXsKKwkJCQlkb2pvLmRlYnVnKCJObyBpZGVhIGhvdyB0byByZXN0b3JlIHNlbGVjdGlvbiBmb3IgdGhpcyBicm93c2VyISIpOworCQkJfQorCQl9CisJfSwKKwljb2xsYXBzZTogZnVuY3Rpb24oLypCb29sZWFuKi9iZWdpbm5pbmcpIHsKKwkJLy8gc3VtbWFyeTogY2xlYXIgY3VycmVudCBzZWxlY3Rpb24KKwkJaWYoZG9qby5nbG9iYWwoKVsnZ2V0U2VsZWN0aW9uJ10peworCQkJdmFyIHNlbGVjdGlvbiA9IGRvam8uZ2xvYmFsKCkuZ2V0U2VsZWN0aW9uKCk7CisJCQlpZihzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKXsgLy8gTW96aWxsYQorCQkJCWlmKGJlZ2lubmluZyl7CisJCQkJCXNlbGVjdGlvbi5jb2xsYXBzZVRvU3RhcnQoKTsKKwkJCQl9ZWxzZXsKKwkJCQkJc2VsZWN0aW9uLmNvbGxhcHNlVG9FbmQoKTsKKwkJCQl9CisJCQl9ZWxzZXsgLy8gU2FmYXJpCisJCQkJLy8gcHVsbGVkIGZyb20gV2ViQ29yZS9lY21hL2tqc193aW5kb3cuY3BwLCBsaW5lIDI1MzYKKwkJCQkgZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKS5jb2xsYXBzZShiZWdpbm5pbmcpOworCQkJfQorCQl9ZWxzZSBpZihkb2pvLmRvYygpLnNlbGVjdGlvbil7IC8vIElFCisJCQl2YXIgcmFuZ2UgPSBkb2pvLmRvYygpLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworCQkJcmFuZ2UuY29sbGFwc2UoYmVnaW5uaW5nKTsKKwkJCXJhbmdlLnNlbGVjdCgpOworCQl9CisJfSwKKwlyZW1vdmU6IGZ1bmN0aW9uKCkgeworCQkvLyBzdW1tYXJ5OiBkZWxldGUgY3VycmVudCBzZWxlY3Rpb24KKwkJaWYoZG9qby5kb2MoKS5zZWxlY3Rpb24pIHsgLy9JRQorCQkJdmFyIHNlbGVjdGlvbiA9IGRvam8uZG9jKCkuc2VsZWN0aW9uOworCisJCQlpZiAoIHNlbGVjdGlvbi50eXBlLnRvVXBwZXJDYXNlKCkgIT0gIk5PTkUiICl7CisJCQkJc2VsZWN0aW9uLmNsZWFyKCk7CisJCQl9CisJCQorCQkJcmV0dXJuIHNlbGVjdGlvbjsKKwkJfWVsc2V7CisJCQl2YXIgc2VsZWN0aW9uID0gZG9qby5nbG9iYWwoKS5nZXRTZWxlY3Rpb24oKTsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkrKyApeworCQkJCXNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpLmRlbGV0ZUNvbnRlbnRzKCk7CisJCQl9CisJCQorCQkJcmV0dXJuIHNlbGVjdGlvbjsKKwkJfQorCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8uRGVmZXJyZWQiKTsKKworCitkb2pvLkRlZmVycmVkID0gZnVuY3Rpb24oLypGdW5jdGlvbj8qLyBjYW5jZWxsZXIpeworCS8qCisJTk9URTogdGhpcyBuYW1lc3BhY2UgYW5kIGRvY3VtZW50YXRpb24gYXJlIGltcG9ydGVkIHdob2xlc2FsZSAKKwkJZnJvbSBNb2NoaUtpdAorCisJRW5jYXBzdWxhdGVzIGEgc2VxdWVuY2Ugb2YgY2FsbGJhY2tzIGluIHJlc3BvbnNlIHRvIGEgdmFsdWUgdGhhdAorCW1heSBub3QgeWV0IGJlIGF2YWlsYWJsZS4gIFRoaXMgaXMgbW9kZWxlZCBhZnRlciB0aGUgRGVmZXJyZWQgY2xhc3MKKwlmcm9tIFR3aXN0ZWQgPGh0dHA6Ly90d2lzdGVkbWF0cml4LmNvbT4uCisKKwlXaHkgZG8gd2Ugd2FudCB0aGlzPyAgSmF2YVNjcmlwdCBoYXMgbm8gdGhyZWFkcywgYW5kIGV2ZW4gaWYgaXQgZGlkLAorCXRocmVhZHMgYXJlIGhhcmQuICBEZWZlcnJlZHMgYXJlIGEgd2F5IG9mIGFic3RyYWN0aW5nIG5vbi1ibG9ja2luZworCWV2ZW50cywgc3VjaCBhcyB0aGUgZmluYWwgcmVzcG9uc2UgdG8gYW4gWE1MSHR0cFJlcXVlc3QuCisKKwlUaGUgc2VxdWVuY2Ugb2YgY2FsbGJhY2tzIGlzIGludGVybmFsbHkgcmVwcmVzZW50ZWQgYXMgYSBsaXN0CisJb2YgMi10dXBsZXMgY29udGFpbmluZyB0aGUgY2FsbGJhY2svZXJyYmFjayBwYWlyLiAgRm9yIGV4YW1wbGUsCisJdGhlIGZvbGxvd2luZyBjYWxsIHNlcXVlbmNlOjoKKworCQl2YXIgZCA9IG5ldyBEZWZlcnJlZCgpOworCQlkLmFkZENhbGxiYWNrKG15Q2FsbGJhY2spOworCQlkLmFkZEVycmJhY2sobXlFcnJiYWNrKTsKKwkJZC5hZGRCb3RoKG15Qm90aCk7CisJCWQuYWRkQ2FsbGJhY2tzKG15Q2FsbGJhY2ssIG15RXJyYmFjayk7CisKKwlpcyB0cmFuc2xhdGVkIGludG8gYSBEZWZlcnJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWwKKwlyZXByZXNlbnRhdGlvbjo6CisKKwkJWworCQkJW215Q2FsbGJhY2ssIG51bGxdLAorCQkJW251bGwsIG15RXJyYmFja10sCisJCQlbbXlCb3RoLCBteUJvdGhdLAorCQkJW215Q2FsbGJhY2ssIG15RXJyYmFja10KKwkJXQorCisJVGhlIERlZmVycmVkIGFsc28ga2VlcHMgdHJhY2sgb2YgaXRzIGN1cnJlbnQgc3RhdHVzIChmaXJlZCkuCisJSXRzIHN0YXR1cyBtYXkgYmUgb25lIG9mIHRocmVlIHRoaW5nczoKKworCQktMTogbm8gdmFsdWUgeWV0IChpbml0aWFsIGNvbmRpdGlvbikKKwkJMDogc3VjY2VzcworCQkxOiBlcnJvcgorCisJQSBEZWZlcnJlZCB3aWxsIGJlIGluIHRoZSBlcnJvciBzdGF0ZSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZworCXRocmVlIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworCQkxLiBUaGUgcmVzdWx0IGdpdmVuIHRvIGNhbGxiYWNrIG9yIGVycmJhY2sgaXMgImluc3RhbmNlb2YiIEVycm9yCisJCTIuIFRoZSBwcmV2aW91cyBjYWxsYmFjayBvciBlcnJiYWNrIHJhaXNlZCBhbiBleGNlcHRpb24gd2hpbGUKKwkJICAgZXhlY3V0aW5nCisJCTMuIFRoZSBwcmV2aW91cyBjYWxsYmFjayBvciBlcnJiYWNrIHJldHVybmVkIGEgdmFsdWUgImluc3RhbmNlb2YiCisJCQlFcnJvcgorCisJT3RoZXJ3aXNlLCB0aGUgRGVmZXJyZWQgd2lsbCBiZSBpbiB0aGUgc3VjY2VzcyBzdGF0ZS4gIFRoZSBzdGF0ZSBvZgorCXRoZSBEZWZlcnJlZCBkZXRlcm1pbmVzIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGNhbGxiYWNrIHNlcXVlbmNlIHRvCisJcnVuLgorCisJV2hlbiBhIGNhbGxiYWNrIG9yIGVycmJhY2sgb2NjdXJzIHdpdGggdGhlIGV4YW1wbGUgZGVmZXJyZWQgY2hhaW4sCisJc29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyB3aWxsIGhhcHBlbiAoaW1hZ2luZSB0aGF0CisJZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXR1cm5lZCk6OgorCisJCS8vIGQuY2FsbGJhY2socmVzdWx0KSBvciBkLmVycmJhY2socmVzdWx0KQorCQlpZighKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSl7CisJCQlyZXN1bHQgPSBteUNhbGxiYWNrKHJlc3VsdCk7CisJCX0KKwkJaWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpeworCQkJcmVzdWx0ID0gbXlFcnJiYWNrKHJlc3VsdCk7CisJCX0KKwkJcmVzdWx0ID0gbXlCb3RoKHJlc3VsdCk7CisJCWlmKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKXsKKwkJCXJlc3VsdCA9IG15RXJyYmFjayhyZXN1bHQpOworCQl9ZWxzZXsKKwkJCXJlc3VsdCA9IG15Q2FsbGJhY2socmVzdWx0KTsKKwkJfQorCisJVGhlIHJlc3VsdCBpcyB0aGVuIHN0b3JlZCBhd2F5IGluIGNhc2UgYW5vdGhlciBzdGVwIGlzIGFkZGVkIHRvIHRoZQorCWNhbGxiYWNrIHNlcXVlbmNlLglTaW5jZSB0aGUgRGVmZXJyZWQgYWxyZWFkeSBoYXMgYSB2YWx1ZSBhdmFpbGFibGUsCisJYW55IG5ldyBjYWxsYmFja3MgYWRkZWQgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuCisKKwlUaGVyZSBhcmUgdHdvIG90aGVyICJhZHZhbmNlZCIgZGV0YWlscyBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uIHRoYXQKKwlhcmUgdXNlZnVsOgorCisJQ2FsbGJhY2tzIGFyZSBhbGxvd2VkIHRvIHJldHVybiBEZWZlcnJlZCBpbnN0YW5jZXMgdGhlbXNlbHZlcywgc28geW91CisJY2FuIGJ1aWxkIGNvbXBsaWNhdGVkIHNlcXVlbmNlcyBvZiBldmVudHMgd2l0aCBlYXNlLgorCisJVGhlIGNyZWF0b3Igb2YgdGhlIERlZmVycmVkIG1heSBzcGVjaWZ5IGEgY2FuY2VsbGVyLiAgVGhlIGNhbmNlbGxlcgorCWlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBpZiBEZWZlcnJlZC5jYW5jZWwgaXMgY2FsbGVkIGJlZm9yZQorCXRoZSBEZWZlcnJlZCBmaXJlcy4JIFlvdSBjYW4gdXNlIHRoaXMgdG8gaW1wbGVtZW50IGNsZWFuIGFib3J0aW5nIG9mCisJYW4gWE1MSHR0cFJlcXVlc3QsIGV0Yy4JIE5vdGUgdGhhdCBjYW5jZWwgd2lsbCBmaXJlIHRoZSBkZWZlcnJlZCB3aXRoCisJYSBDYW5jZWxsZWRFcnJvciAodW5sZXNzIHlvdXIgY2FuY2VsbGVyIHJldHVybnMgYW5vdGhlciBraW5kIG9mCisJZXJyb3IpLCBzbyB0aGUgZXJyYmFja3Mgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGF0IGVycm9yIGZvcgorCWNhbmNlbGxhYmxlIERlZmVycmVkcy4KKworCSovCisJCisJdGhpcy5jaGFpbiA9IFtdOworCXRoaXMuaWQgPSB0aGlzLl9uZXh0SWQoKTsKKwl0aGlzLmZpcmVkID0gLTE7CisJdGhpcy5wYXVzZWQgPSAwOworCXRoaXMucmVzdWx0cyA9IFtudWxsLCBudWxsXTsKKwl0aGlzLmNhbmNlbGxlciA9IGNhbmNlbGxlcjsKKwl0aGlzLnNpbGVudGx5Q2FuY2VsbGVkID0gZmFsc2U7Cit9OworCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uRGVmZXJyZWQsIHsKKwlnZXRGdW5jdGlvbkZyb21BcmdzOiBmdW5jdGlvbigpeworCQl2YXIgYSA9IGFyZ3VtZW50czsKKwkJaWYoKGFbMF0pJiYoIWFbMV0pKXsKKwkJCWlmKGRvam8ubGFuZy5pc0Z1bmN0aW9uKGFbMF0pKXsKKwkJCQlyZXR1cm4gYVswXTsKKwkJCX1lbHNlIGlmKGRvam8ubGFuZy5pc1N0cmluZyhhWzBdKSl7CisJCQkJcmV0dXJuIGRqX2dsb2JhbFthWzBdXTsKKwkJCX0KKwkJfWVsc2UgaWYoKGFbMF0pJiYoYVsxXSkpeworCQkJcmV0dXJuIGRvam8ubGFuZy5oaXRjaChhWzBdLCBhWzFdKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJbWFrZUNhbGxlZDogZnVuY3Rpb24oKSB7CisJCXZhciBkZWZlcnJlZCA9IG5ldyBkb2pvLkRlZmVycmVkKCk7CisJCWRlZmVycmVkLmNhbGxiYWNrKCk7CisJCXJldHVybiBkZWZlcnJlZDsKKwl9LAorCisJcmVwcjogZnVuY3Rpb24oKXsKKwkJdmFyIHN0YXRlOworCQlpZih0aGlzLmZpcmVkID09IC0xKXsKKwkJCXN0YXRlID0gJ3VuZmlyZWQnOworCQl9ZWxzZSBpZih0aGlzLmZpcmVkID09IDApeworCQkJc3RhdGUgPSAnc3VjY2Vzcyc7CisJCX0gZWxzZSB7CisJCQlzdGF0ZSA9ICdlcnJvcic7CisJCX0KKwkJcmV0dXJuICdEZWZlcnJlZCgnICsgdGhpcy5pZCArICcsICcgKyBzdGF0ZSArICcpJzsKKwl9LAorCisJdG9TdHJpbmc6IGRvam8ubGFuZy5mb3J3YXJkKCJyZXByIiksCisKKwlfbmV4dElkOiAoZnVuY3Rpb24oKXsKKwkJdmFyIG4gPSAxOworCQlyZXR1cm4gZnVuY3Rpb24oKXsgcmV0dXJuIG4rKzsgfTsKKwl9KSgpLAorCisJY2FuY2VsOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OglDYW5jZWxzIGEgRGVmZXJyZWQgdGhhdCBoYXMgbm90IHlldCByZWNlaXZlZCBhIHZhbHVlLCBvciBpcworCQkvLwkJd2FpdGluZyBvbiBhbm90aGVyIERlZmVycmVkIGFzIGl0cyB2YWx1ZS4KKwkJLy8gZGVzY3JpcHRpb246CisJCS8vCQlJZiBhIGNhbmNlbGxlciBpcyBkZWZpbmVkLCB0aGUgY2FuY2VsbGVyIGlzIGNhbGxlZC4gSWYgdGhlCisJCS8vCQljYW5jZWxsZXIgZGlkIG5vdCByZXR1cm4gYW4gZXJyb3IsIG9yIHRoZXJlIHdhcyBubyBjYW5jZWxsZXIsCisJCS8vCQl0aGVuIHRoZSBlcnJiYWNrIGNoYWluIGlzIHN0YXJ0ZWQgd2l0aCBDYW5jZWxsZWRFcnJvci4KKwkJaWYodGhpcy5maXJlZCA9PSAtMSl7CisJCQlpZiAodGhpcy5jYW5jZWxsZXIpeworCQkJCXRoaXMuY2FuY2VsbGVyKHRoaXMpOworCQkJfWVsc2V7CisJCQkJdGhpcy5zaWxlbnRseUNhbmNlbGxlZCA9IHRydWU7CisJCQl9CisJCQlpZih0aGlzLmZpcmVkID09IC0xKXsKKwkJCQl0aGlzLmVycmJhY2sobmV3IEVycm9yKHRoaXMucmVwcigpKSk7CisJCQl9CisJCX1lbHNlIGlmKAkodGhpcy5maXJlZCA9PSAwKSYmCisJCQkJCSh0aGlzLnJlc3VsdHNbMF0gaW5zdGFuY2VvZiBkb2pvLkRlZmVycmVkKSl7CisJCQl0aGlzLnJlc3VsdHNbMF0uY2FuY2VsKCk7CisJCX0KKwl9LAorCQkJCisKKwlfcGF1c2U6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFVzZWQgaW50ZXJuYWxseSB0byBzaWduYWwgdGhhdCBpdCdzIHdhaXRpbmcgb24gYW5vdGhlciBEZWZlcnJlZAorCQl0aGlzLnBhdXNlZCsrOworCX0sCisKKwlfdW5wYXVzZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogVXNlZCBpbnRlcm5hbGx5IHRvIHNpZ25hbCB0aGF0IGl0J3Mgbm8gbG9uZ2VyIHdhaXRpbmcgb24KKwkJLy8gYW5vdGhlciBEZWZlcnJlZC4KKwkJdGhpcy5wYXVzZWQtLTsKKwkJaWYgKCh0aGlzLnBhdXNlZCA9PSAwKSAmJiAodGhpcy5maXJlZCA+PSAwKSkgeworCQkJdGhpcy5fZmlyZSgpOworCQl9CisJfSwKKworCV9jb250aW51ZTogZnVuY3Rpb24ocmVzKXsKKwkJLy8gc3VtbWFyeTogVXNlZCBpbnRlcm5hbGx5IHdoZW4gYSBkZXBlbmRlbnQgZGVmZXJyZWQgZmlyZXMuCisJCXRoaXMuX3Jlc2JhY2socmVzKTsKKwkJdGhpcy5fdW5wYXVzZSgpOworCX0sCisKKwlfcmVzYmFjazogZnVuY3Rpb24ocmVzKXsKKwkJLy8gVGhlIHByaW1pdGl2ZSB0aGF0IG1lYW5zIGVpdGhlciBjYWxsYmFjayBvciBlcnJiYWNrCisJCXRoaXMuZmlyZWQgPSAoKHJlcyBpbnN0YW5jZW9mIEVycm9yKSA/IDEgOiAwKTsKKwkJdGhpcy5yZXN1bHRzW3RoaXMuZmlyZWRdID0gcmVzOworCQl0aGlzLl9maXJlKCk7CisJfSwKKworCV9jaGVjazogZnVuY3Rpb24oKXsKKwkJaWYodGhpcy5maXJlZCAhPSAtMSl7CisJCQlpZighdGhpcy5zaWxlbnRseUNhbmNlbGxlZCl7CisJCQkJZG9qby5yYWlzZSgiYWxyZWFkeSBjYWxsZWQhIik7CisJCQl9CisJCQl0aGlzLnNpbGVudGx5Q2FuY2VsbGVkID0gZmFsc2U7CisJCQlyZXR1cm47CisJCX0KKwl9LAorCisJY2FsbGJhY2s6IGZ1bmN0aW9uKHJlcyl7CisJCS8vIHN1bW1hcnk6CUJlZ2luIHRoZSBjYWxsYmFjayBzZXF1ZW5jZSB3aXRoIGEgbm9uLWVycm9yIHZhbHVlLgorCQkKKwkJLyoKKwkJY2FsbGJhY2sgb3IgZXJyYmFjayBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBvbiBhIGdpdmVuCisJCURlZmVycmVkLgorCQkqLworCQl0aGlzLl9jaGVjaygpOworCQl0aGlzLl9yZXNiYWNrKHJlcyk7CisJfSwKKworCWVycmJhY2s6IGZ1bmN0aW9uKHJlcyl7CisJCS8vIHN1bW1hcnk6IEJlZ2luIHRoZSBjYWxsYmFjayBzZXF1ZW5jZSB3aXRoIGFuIGVycm9yIHJlc3VsdC4KKwkJdGhpcy5fY2hlY2soKTsKKwkJaWYoIShyZXMgaW5zdGFuY2VvZiBFcnJvcikpeworCQkJcmVzID0gbmV3IEVycm9yKHJlcyk7CisJCX0KKwkJdGhpcy5fcmVzYmFjayhyZXMpOworCX0sCisKKwlhZGRCb3RoOiBmdW5jdGlvbihjYiwgY2Jmbil7CisJCS8qIHN1bW1hcnkKKwkJQWRkIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGJvdGggYSBjYWxsYmFjayBhbmQgYW4gZXJyYmFjayBhcyB0aGUKKwkJbmV4dCBlbGVtZW50IG9uIHRoZSBjYWxsYmFjayBzZXF1ZW5jZS4JVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUKKwkJdGhhdCB5b3Ugd2FudCB0byBndWFyYW50ZWUgdG8gcnVuLCBlLmcuIGEgZmluYWxpemVyLgorCQkqLworCQl2YXIgZW5jbG9zZWQgPSB0aGlzLmdldEZ1bmN0aW9uRnJvbUFyZ3MoY2IsIGNiZm4pOworCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMil7CisJCQllbmNsb3NlZCA9IGRvam8ubGFuZy5jdXJyeUFyZ3VtZW50cyhudWxsLCBlbmNsb3NlZCwgYXJndW1lbnRzLCAyKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoZW5jbG9zZWQsIGVuY2xvc2VkKTsKKwl9LAorCisJYWRkQ2FsbGJhY2s6IGZ1bmN0aW9uKGNiLCBjYmZuKXsKKwkJLy8gc3VtbWFyeTogQWRkIGEgc2luZ2xlIGNhbGxiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGNhbGxiYWNrIHNlcXVlbmNlLgorCQl2YXIgZW5jbG9zZWQgPSB0aGlzLmdldEZ1bmN0aW9uRnJvbUFyZ3MoY2IsIGNiZm4pOworCQlpZihhcmd1bWVudHMubGVuZ3RoID4gMil7CisJCQllbmNsb3NlZCA9IGRvam8ubGFuZy5jdXJyeUFyZ3VtZW50cyhudWxsLCBlbmNsb3NlZCwgYXJndW1lbnRzLCAyKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoZW5jbG9zZWQsIG51bGwpOworCX0sCisKKwlhZGRFcnJiYWNrOiBmdW5jdGlvbihjYiwgY2Jmbil7CisJCS8vIHN1bW1hcnk6IEFkZCBhIHNpbmdsZSBjYWxsYmFjayB0byB0aGUgZW5kIG9mIHRoZSBjYWxsYmFjayBzZXF1ZW5jZS4KKwkJdmFyIGVuY2xvc2VkID0gdGhpcy5nZXRGdW5jdGlvbkZyb21BcmdzKGNiLCBjYmZuKTsKKwkJaWYoYXJndW1lbnRzLmxlbmd0aCA+IDIpeworCQkJZW5jbG9zZWQgPSBkb2pvLmxhbmcuY3VycnlBcmd1bWVudHMobnVsbCwgZW5jbG9zZWQsIGFyZ3VtZW50cywgMik7CisJCX0KKwkJcmV0dXJuIHRoaXMuYWRkQ2FsbGJhY2tzKG51bGwsIGVuY2xvc2VkKTsKKwkJcmV0dXJuIHRoaXMuYWRkQ2FsbGJhY2tzKG51bGwsIGNiZm4pOworCX0sCisKKwlhZGRDYWxsYmFja3M6IGZ1bmN0aW9uIChjYiwgZWIpIHsKKwkJLy8gc3VtbWFyeTogQWRkIHNlcGFyYXRlIGNhbGxiYWNrIGFuZCBlcnJiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGNhbGxiYWNrCisJCS8vIHNlcXVlbmNlLgorCQl0aGlzLmNoYWluLnB1c2goW2NiLCBlYl0pCisJCWlmICh0aGlzLmZpcmVkID49IDApIHsKKwkJCXRoaXMuX2ZpcmUoKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJX2ZpcmU6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFVzZWQgaW50ZXJuYWxseSB0byBleGhhdXN0IHRoZSBjYWxsYmFjayBzZXF1ZW5jZSB3aGVuIGEgcmVzdWx0CisJCS8vIGlzIGF2YWlsYWJsZS4KKwkJdmFyIGNoYWluID0gdGhpcy5jaGFpbjsKKwkJdmFyIGZpcmVkID0gdGhpcy5maXJlZDsKKwkJdmFyIHJlcyA9IHRoaXMucmVzdWx0c1tmaXJlZF07CisJCXZhciBzZWxmID0gdGhpczsKKwkJdmFyIGNiID0gbnVsbDsKKwkJd2hpbGUgKGNoYWluLmxlbmd0aCA+IDAgJiYgdGhpcy5wYXVzZWQgPT0gMCkgeworCQkJLy8gQXJyYXkKKwkJCXZhciBwYWlyID0gY2hhaW4uc2hpZnQoKTsKKwkJCXZhciBmID0gcGFpcltmaXJlZF07CisJCQlpZiAoZiA9PSBudWxsKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl0cnkgeworCQkJCXJlcyA9IGYocmVzKTsKKwkJCQlmaXJlZCA9ICgocmVzIGluc3RhbmNlb2YgRXJyb3IpID8gMSA6IDApOworCQkJCWlmKHJlcyBpbnN0YW5jZW9mIGRvam8uRGVmZXJyZWQpIHsKKwkJCQkJY2IgPSBmdW5jdGlvbihyZXMpeworCQkJCQkJc2VsZi5fY29udGludWUocmVzKTsKKwkJCQkJfQorCQkJCQl0aGlzLl9wYXVzZSgpOworCQkJCX0KKwkJCX1jYXRjaChlcnIpeworCQkJCWZpcmVkID0gMTsKKwkJCQlyZXMgPSBlcnI7CisJCQl9CisJCX0KKwkJdGhpcy5maXJlZCA9IGZpcmVkOworCQl0aGlzLnJlc3VsdHNbZmlyZWRdID0gcmVzOworCQlpZigoY2IpJiYodGhpcy5wYXVzZWQpKXsKKwkJCS8vIHRoaXMgaXMgZm9yICJ0YWlsIHJlY3Vyc2lvbiIgaW4gY2FzZSB0aGUgZGVwZW5kZW50CisJCQkvLyBkZWZlcnJlZCBpcyBhbHJlYWR5IGZpcmVkCisJCQlyZXMuYWRkQm90aChjYik7CisJCX0KKwl9Cit9KTsKKworIC8qIC0qLSB0YWItd2lkdGg6IDQgLSotICovCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlJpY2hUZXh0Iik7CisKKworCisKKworCisKKworCisKKy8vIHVzZWQgdG8gc2F2ZSBjb250ZW50CisvLyBidXQgZG8gbm90IHRyeSBkb2luZyBkb2N1bWVudC53cml0ZSBpZiB3ZSBhcmUgdXNpbmcgeGQgbG9hZGluZy4KKy8vIGRvY3VtZW50LndyaXRlIHdpbGwgb25seSB3b3JrIGlmIFJpY2hUZXh0LmpzIGlzIGluY2x1ZGVkIGluIHRoZSBkb2pvLmpzCisvLyBmaWxlLiBJZiBpdCBpcyBpbmNsdWRlZCBpbiBkb2pvLmpzIGFuZCB5b3Ugd2FudCB0byBhbGxvdyByaWNoIHRleHQgc2F2aW5nCisvLyBmb3IgYmFjay9mb3J3YXJkIGFjdGlvbnMsIHRoZW4gc2V0IGRqQ29uZmlnLmFsbG93WGRSaWNoVGV4dFNhdmUgPSB0cnVlLgoraWYoIWRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gfHwgZGpDb25maWdbImFsbG93WGRSaWNoVGV4dFNhdmUiXSl7CisJaWYoZG9qby5ob3N0ZW52LnBvc3RfbG9hZF8peworCQkoZnVuY3Rpb24oKXsKKwkJCXZhciBzYXZldGV4dGFyZWEgPSBkb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CisJCQlzYXZldGV4dGFyZWEuaWQgPSAiZG9qby53aWRnZXQuUmljaFRleHQuc2F2ZWRDb250ZW50IjsKKwkJCXNhdmV0ZXh0YXJlYS5zdHlsZSA9ICJkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBweDtsZWZ0Oi0xMDBweDtoZWlnaHQ6M3B4O3dpZHRoOjNweDtvdmVyZmxvdzpoaWRkZW47IjsKKwkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHNhdmV0ZXh0YXJlYSk7CisJCX0pKCk7CisJfWVsc2V7CisJCS8vZG9qby5ib2R5KCkgaXMgbm90IGF2YWlsYWJsZSBiZWZvcmUgb25Mb2FkIGlzIGZpcmVkCisJCXRyeSB7CisJCQlkb2pvLmRvYygpLndyaXRlKCc8dGV4dGFyZWEgaWQ9ImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCIgJyArCisJCQkJJ3N0eWxlPSJkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0xMDBweDtsZWZ0Oi0xMDBweDtoZWlnaHQ6M3B4O3dpZHRoOjNweDtvdmVyZmxvdzpoaWRkZW47Ij48L3RleHRhcmVhPicpOworCQl9Y2F0Y2goZSl7IH0KKwl9Cit9CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuUmljaFRleHQiLAorCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsCisJZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRvam8ud2lkZ2V0LlJpY2hUZXh0IGlzIHRoZSBjb3JlIG9mIHRoZSBXWVNJV1lHIGVkaXRvciBpbiBkb2pvLCB3aGljaAorCQkvLwkJcHJvdmlkZXMgdGhlIGJhc2ljIGVkaXRpbmcgZmVhdHVyZXMuIEl0IGFsc28gZW5jYXBzdWxhdGVzIHRoZSBkaWZmZXJlbmNlcworCQkvLwkJb2YgZGlmZmVyZW50IGpzIGVuZ2luZXMgZm9yIHZhcmlvdXMgYnJvd3NlcnMKKworCQkvLyBjb250ZW50UHJlRmlsdGVyczogQXJyYXkKKwkJLy8JCXByZSBjb250ZW50IGZpbHRlciBmdW5jdGlvbiByZWdpc3RlciBhcnJheQorCQl0aGlzLmNvbnRlbnRQcmVGaWx0ZXJzID0gW107CisKKwkJLy8gY29udGVudFBvc3RGaWx0ZXJzOiBBcnJheQorCQkvLwkJcG9zdCBjb250ZW50IGZpbHRlciBmdW5jdGlvbiByZWdpc3RlciBhcnJheQorCQl0aGlzLmNvbnRlbnRQb3N0RmlsdGVycyA9IFtdOworCisJCS8vIGNvbnRlbnREb21QcmVGaWx0ZXJzOiBBcnJheQorCQkvLwkJcHJlIGNvbnRlbnQgZG9tIGZpbHRlciBmdW5jdGlvbiByZWdpc3RlciBhcnJheQorCQl0aGlzLmNvbnRlbnREb21QcmVGaWx0ZXJzID0gW107CisKKwkJLy8gY29udGVudERvbVBvc3RGaWx0ZXJzOiBBcnJheQorCQkvLwkJcG9zdCBjb250ZW50IGRvbSBmaWx0ZXIgZnVuY3Rpb24gcmVnaXN0ZXIgYXJyYXkKKwkJdGhpcy5jb250ZW50RG9tUG9zdEZpbHRlcnMgPSBbXTsKKworCQkvLyBlZGl0aW5nQXJlYVN0eWxlU2hlZXRzOiBBcnJheQorCQkvLwkJYXJyYXkgdG8gc3RvcmUgYWxsIHRoZSBzdHlsZXNoZWV0cyBhcHBsaWVkIHRvIHRoZSBlZGl0aW5nIGFyZWEKKwkJdGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzPVtdOworCisJCWlmKGRvam8ucmVuZGVyLmh0bWwubW96KXsKKwkJCXRoaXMuY29udGVudFByZUZpbHRlcnMucHVzaCh0aGlzLl9maXhDb250ZW50Rm9yTW96KTsKKwkJfQorCisJCXRoaXMuX2tleUhhbmRsZXJzID0ge307CisKKwkJaWYoZG9qby5EZWZlcnJlZCl7CisJCQl0aGlzLm9uTG9hZERlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwkJfQorCX0sCisJeworCQkvLyBpbmhlcml0V2lkdGg6IEJvb2xlYW4KKwkJLy8JCXdoZXRoZXIgdG8gaW5oZXJpdCB0aGUgcGFyZW50J3Mgd2lkdGggb3Igc2ltcGx5IHVzZSAxMDAlCisJCWluaGVyaXRXaWR0aDogZmFsc2UsCisKKwkJLy8gZm9jdXNPbkxvYWQ6IEJvb2xlYW4KKwkJLy8JCXdoZXRoZXIgZm9jdXNpbmcgaW50byB0aGlzIGluc3RhbmNlIG9mIHJpY2h0ZXh0IHdoZW4gcGFnZSBvbmxvYWQKKwkJZm9jdXNPbkxvYWQ6IGZhbHNlLAorCisJCS8vIHNhdmVOYW1lOiBTdHJpbmcKKwkJLy8JCUlmIGEgc2F2ZSBuYW1lIGlzIHNwZWNpZmllZCB0aGUgY29udGVudCBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiB0aGUgdXNlcgorCQkvLwkJbGVhdmUgdGhpcyBwYWdlIGNhbiBjb21lIGJhY2ssIG9yIGlmIHRoZSBlZGl0b3IgaXMgbm90IHByb3Blcmx5IGNsb3NlZCBhZnRlcgorCQkvLwkJZWRpdGluZyBoYXMgc3RhcnRlZC4KKwkJc2F2ZU5hbWU6ICIiLAorCisJCS8vIHN0eWxlU2hlZXRzOiBTdHJpbmcKKwkJLy8JCXNlbWljb2xvbiAoIjsiKSBzZXBhcmF0ZWQgbGlzdCBvZiBjc3MgZmlsZXMgZm9yIHRoZSBlZGl0aW5nIGFyZWEKKwkJc3R5bGVTaGVldHM6ICIiLAorCisJCS8vIF9jb250ZW50OiBTdHJpbmcKKwkJLy8JCXRlbXBvcmFyeSBjb250ZW50IHN0b3JhZ2UKKwkJX2NvbnRlbnQ6ICIiLAorCisJCS8vIGhlaWdodDogU3RyaW5nCisJCS8vCQlzZXQgaGVpZ2h0IHRvIGZpeCB0aGUgZWRpdG9yIGF0IGEgc3BlY2lmaWMgaGVpZ2h0LCB3aXRoIHNjcm9sbGluZworCQloZWlnaHQ6ICIiLAorCisJCS8vIG1pbkhlaWdodDogU3RyaW5nCisJCS8vCQlUaGUgbWluaW11bSBoZWlnaHQgdGhhdCB0aGUgZWRpdG9yIHNob3VsZCBoYXZlCisJCW1pbkhlaWdodDogIjFlbSIsCisKKwkJLy8gaXNDbG9zZWQ6IEJvb2xlYW4KKwkJaXNDbG9zZWQ6IHRydWUsCisKKwkJLy8gaXNMb2FkZWQ6IEJvb2xlYW4KKwkJaXNMb2FkZWQ6IGZhbHNlLAorCisJCS8vIHVzZUFjdGl2ZVg6IEJvb2xlYW4KKwkJLy8JCXdoZXRoZXIgdG8gdXNlIHRoZSBhY3RpdmUteCBvYmplY3QgaW4gSUUKKwkJdXNlQWN0aXZlWDogZmFsc2UsCisKKwkJLy8gcmVsYXRpdmVJbWFnZVVybHM6IEJvb2xlYW4KKwkJLy8JCXdoZXRoZXIgdG8gdXNlIHJlbGF0aXZlIFVSTHMgZm9yIGltYWdlcyAtIGlmIHRoaXMgaXMgZW5hYmxlZAorCQkvLwkJaW1hZ2VzIHdpbGwgYmUgZ2l2ZW4gYWJzb2x1dGUgVVJMcyB3aGVuIGluc2lkZSB0aGUgZWRpdG9yIGJ1dAorCQkvLwkJd2lsbCBiZSBjaGFuZ2VkIHRvIHVzZSByZWxhdGl2ZSBVUkxzICh0byB0aGUgY3VycmVudCBwYWdlKSBvbiBzYXZlCisJCXJlbGF0aXZlSW1hZ2VVcmxzOiBmYWxzZSwKKworCQkvLyBfU0VQQVJBVE9SOiBTdHJpbmcKKwkJLy8JCXVzZWQgdG8gY29uY2F0IGNvbnRlbnRzIGZyb20gbXVsdGlwbGUgdGV4dGFyZWFzIGludG8gYSBzaW5nbGUgc3RyaW5nCisJCV9TRVBBUkFUT1I6ICJAQCoqJSVfX1JJQ0hURVhUQk9VTkRSWV9fJSUqKkBAIiwKKworCQkvLyBvbkxvYWREZWZlcnJlZDogZG9qby5EZWZlcnJlZAorCQkvLwkJZGVmZXJyZWQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBvbkxvYWQgZnVuY3Rpb24uIFRoaXMKKwkJLy8JCXdpbGwgb25seSBiZSBzZXQgaWYgZG9qby5EZWZlcnJlZCBpcyByZXF1aXJlZAorCQlvbkxvYWREZWZlcnJlZDogbnVsbCwKKworCS8qIEluaXQKKwkgKioqKioqKi8KKworCQlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IHNlZSBkb2pvLndpZGdldC5Eb21XaWRnZXQKKwkJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCgiZG9qby53aWRnZXQuUmljaFRleHQ6OmluaXQiLCB0aGlzKTsKKwkJCXRoaXMub3BlbigpOworCisKKwkJCS8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBuZWVkcyB0byBiZSByZW1vdmVkCisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywgIm9uS2V5UHJlc3NlZCIsIHRoaXMsICJhZnRlcktleVByZXNzIik7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywgIm9uS2V5UHJlc3MiLCB0aGlzLCAia2V5UHJlc3MiKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAib25LZXlEb3duIiwgdGhpcywgImtleURvd24iKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAib25LZXlVcCIsIHRoaXMsICJrZXlVcCIpOworCisJCQl0aGlzLnNldHVwRGVmYXVsdFNob3J0Y3V0cygpOworCQl9LAorCisJCXNldHVwRGVmYXVsdFNob3J0Y3V0czogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGFkZCBzb21lIGRlZmF1bHQga2V5IGhhbmRsZXJzCisJCQkvLyBkZXNjcmlwdGlvbjogCisJCQkvLyAJCU92ZXJ3cml0ZSB0aGlzIHRvIHNldHVwIHlvdXIgb3duIGhhbmRsZXJzLiBUaGUgZGVmYXVsdAorCQkJLy8gCQlpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCB1c2UgRWRpdG9yMiBjb21tYW5kcywgYnV0IGRpcmVjdGx5CisJCQkvLwkJZXhlY3V0ZXMgdGhlIGJ1aWx0aW4gY29tbWFuZHMgd2l0aGluIHRoZSB1bmRlcmx5aW5nIGJyb3dzZXIKKwkJCS8vCQlzdXBwb3J0LgorCQkJdmFyIGN0cmwgPSB0aGlzLktFWV9DVFJMOworCQkJdmFyIGV4ZWMgPSBmdW5jdGlvbiAoY21kLCBhcmcpIHsKKwkJCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gZnVuY3Rpb24gKCkgeyB0aGlzLmV4ZWNDb21tYW5kKGNtZCk7IH0gOgorCQkJCQlmdW5jdGlvbiAoKSB7IHRoaXMuZXhlY0NvbW1hbmQoY21kLCBhcmcpOyB9CisJCQl9CisJCQl0aGlzLmFkZEtleUhhbmRsZXIoImIiLCBjdHJsLCBleGVjKCJib2xkIikpOworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJpIiwgY3RybCwgZXhlYygiaXRhbGljIikpOworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJ1IiwgY3RybCwgZXhlYygidW5kZXJsaW5lIikpOworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJhIiwgY3RybCwgZXhlYygic2VsZWN0YWxsIikpOworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJzIiwgY3RybCwgZnVuY3Rpb24gKCkgeyB0aGlzLnNhdmUodHJ1ZSk7IH0pOworCisJCQl0aGlzLmFkZEtleUhhbmRsZXIoIjEiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoMSIpKTsKKwkJCXRoaXMuYWRkS2V5SGFuZGxlcigiMiIsIGN0cmwsIGV4ZWMoImZvcm1hdGJsb2NrIiwgImgyIikpOworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCIzIiwgY3RybCwgZXhlYygiZm9ybWF0YmxvY2siLCAiaDMiKSk7CisJCQl0aGlzLmFkZEtleUhhbmRsZXIoIjQiLCBjdHJsLCBleGVjKCJmb3JtYXRibG9jayIsICJoNCIpKTsKKworCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJcXCIsIGN0cmwsIGV4ZWMoImluc2VydHVub3JkZXJlZGxpc3QiKSk7CisJCQlpZighZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJaIiwgY3RybCwgZXhlYygicmVkbyIpKTsKKwkJCX0KKwkJfSwKKworCQkvLyBldmVudHM6IEFycmF5CisJCS8vCQkgZXZlbnRzIHdoaWNoIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gdGhlIHVuZGVybHlpbmcgZWRpdGluZyBhcmVhCisJCWV2ZW50czogWyJvbkJsdXIiLCAib25Gb2N1cyIsICJvbktleVByZXNzIiwgIm9uS2V5RG93biIsICJvbktleVVwIiwgIm9uQ2xpY2siXSwKKworCQkvKioKKwkJICogVHJhbnNmb3JtcyB0aGUgbm9kZSByZWZlcmVuY2VkIGluIHRoaXMuZG9tTm9kZSBpbnRvIGEgcmljaCB0ZXh0IGVkaXRpbmcKKwkJICogbm9kZS4gVGhpcyBjYW4gcmVzdWx0IGluIHRoZSBjcmVhdGlvbiBhbmQgcmVwbGFjZW1lbnQgd2l0aCBhbiA8aWZyYW1lPiBpZgorCQkgKiBkZXNpZ25Nb2RlIGlzIHVzZWQsIGFuIDxvYmplY3Q+IGFuZCBhY3RpdmUteCBjb21wb25lbnQgaWYgaW5zaWRlIG9mIElFIG9yCisJCSAqIGEgcmVndWxlciBlbGVtZW50IGlmIGNvbnRlbnRFZGl0YWJsZSBpcyBhdmFpbGFibGUuCisJCSAqLworCQlvcGVuOiBmdW5jdGlvbiAoLypEb21Ob2RlLCBvcHRpb25hbCovZWxlbWVudCkgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlUcmFuc2Zvcm1zIHRoZSBub2RlIHJlZmVyZW5jZWQgaW4gdGhpcy5kb21Ob2RlIGludG8gYSByaWNoIHRleHQgZWRpdGluZworCQkJLy8JCW5vZGUuIFRoaXMgY2FuIHJlc3VsdCBpbiB0aGUgY3JlYXRpb24gYW5kIHJlcGxhY2VtZW50IHdpdGggYW4gPGlmcmFtZT4gaWYKKwkJCS8vCQlkZXNpZ25Nb2RlIGlzIHVzZWQsIGFuIDxvYmplY3Q+IGFuZCBhY3RpdmUteCBjb21wb25lbnQgaWYgaW5zaWRlIG9mIElFIG9yCisJCQkvLwkJYSByZWd1bGVyIGVsZW1lbnQgaWYgY29udGVudEVkaXRhYmxlIGlzIGF2YWlsYWJsZS4KKworCQkJaWYodGhpcy5vbkxvYWREZWZlcnJlZC5maXJlZCA+PSAwKXsKKwkJCQl0aGlzLm9uTG9hZERlZmVycmVkID0gbmV3IGRvam8uRGVmZXJyZWQoKTsKKwkJCX0KKworCQkJdmFyIGggPSBkb2pvLnJlbmRlci5odG1sOworCQkJaWYgKCF0aGlzLmlzQ2xvc2VkKSB7IHRoaXMuY2xvc2UoKTsgfQorCQkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCJkb2pvLndpZGdldC5SaWNoVGV4dDo6b3BlbiIsIHRoaXMpOworCisJCQl0aGlzLl9jb250ZW50ID0gIiI7CisJCQlpZigoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSYmKGVsZW1lbnRbIm5vZGVOYW1lIl0pKXsgdGhpcy5kb21Ob2RlID0gZWxlbWVudDsgfSAvLyBlbHNlIHVuY2hhbmdlZAorCisJCQlpZigJKHRoaXMuZG9tTm9kZVsibm9kZU5hbWUiXSkmJgorCQkJCSh0aGlzLmRvbU5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAidGV4dGFyZWEiKSl7CisJCQkJdGhpcy50ZXh0YXJlYSA9IHRoaXMuZG9tTm9kZTsKKwkJCQl2YXIgaHRtbCA9IHRoaXMuX3ByZUZpbHRlckNvbnRlbnQodGhpcy50ZXh0YXJlYS52YWx1ZSk7CisJCQkJdGhpcy5kb21Ob2RlID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgdGhpcy50ZXh0YXJlYSk7CisJCQkJdmFyIHRtcEZ1bmMgPSBkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24oKXsKKwkJCQkJLy9zb21lIGJyb3dzZXJzIHJlZnVzZSB0byBzdWJtaXQgZGlzcGxheT1ub25lIHRleHRhcmVhLCBzbworCQkJCQkvL21vdmUgdGhlIHRleHRhcmVhIG91dCBvZiBzY3JlZW4gaW5zdGVhZAorCQkJCQl3aXRoKHRoaXMudGV4dGFyZWEuc3R5bGUpeworCQkJCQkJZGlzcGxheSA9ICJibG9jayI7CisJCQkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJCQlsZWZ0ID0gdG9wID0gIi0xMDAwcHgiOworCisJCQkJCQlpZihoLmllKXsgLy9uYXN0eSBJRSBidWc6IGFibm9ybWFsIGZvcm1hdHRpbmcgaWYgb3ZlcmZsb3cgaXMgbm90IGhpZGRlbgorCQkJCQkJCXRoaXMuX19vdmVyZmxvdyA9IG92ZXJmbG93OworCQkJCQkJCW92ZXJmbG93ID0gImhpZGRlbiI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJCQlpZihoLmllKXsKKwkJCQkJc2V0VGltZW91dCh0bXBGdW5jLCAxMCk7CisJCQkJfWVsc2V7CisJCQkJCXRtcEZ1bmMoKTsKKwkJCQl9CisJCQkJaWYoIWguc2FmYXJpKXsKKwkJCQkJLy8gRklYTUU6IFZFUlkgU1RSQU5HRSBzYWZhcmkgMi4wLjQgYmVoYXZpb3IgaGVyZSBjYXVzZWQgYnkKKwkJCQkJLy8gbW92aW5nIHRoZSB0ZXh0YXJlYS4gT2Z0ZW4gY3Jhc2hlZCB0aGUgYnJvd3NlciEhISBTZWVtcworCQkJCQkvLyBmaXhlZCBvbiB3ZWJraXQgbmlnaHRsaWVzLgorCQkJCQlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tTm9kZSwgdGhpcy50ZXh0YXJlYSk7CisJCQkJfQorCQkJCS8vIHRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSBodG1sOworCisJCQkJaWYodGhpcy50ZXh0YXJlYS5mb3JtKXsKKwkJCQkJZG9qby5ldmVudC5jb25uZWN0KCdiZWZvcmUnLCB0aGlzLnRleHRhcmVhLmZvcm0sICJvbnN1Ym1pdCIsCisJCQkJCQkvLyBGSVhNRTogc2hvdWxkIHdlIGJlIGNhbGxpbmcgY2xvc2UoKSBoZXJlIGluc3RlYWQ/CisJCQkJCQlkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24oKXsKKwkJCQkJCQl0aGlzLnRleHRhcmVhLnZhbHVlID0gdGhpcy5nZXRFZGl0b3JDb250ZW50KCk7CisJCQkJCQl9KQorCQkJCQkpOworCQkJCX0KKworCQkJCS8vIGRvam8gcGx1Y2tzIG91ciBvcmlnaW5hbCBkb21Ob2RlIGZyb20gdGhlIGRvY3VtZW50IHNvIHdlIG5lZWQKKwkJCQkvLyB0byBnbyBiYWNrIGFuZCBwdXQgb3Vyc2VsdmVzIGJhY2sgaW4KKwkJCQl2YXIgZWRpdG9yID0gdGhpczsKKwkJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcywgInBvc3RDcmVhdGUiLCBmdW5jdGlvbiAoKXsKKwkJCQkJZG9qby5odG1sLmluc2VydEFmdGVyKGVkaXRvci50ZXh0YXJlYSwgZWRpdG9yLmRvbU5vZGUpOworCQkJCX0pOworCQkJfWVsc2V7CisJCQkJdmFyIGh0bWwgPSB0aGlzLl9wcmVGaWx0ZXJDb250ZW50KGRvam8uc3RyaW5nLnRyaW0odGhpcy5kb21Ob2RlLmlubmVySFRNTCkpOworCQkJfQorCQkJaWYoaHRtbCA9PSAiIil7IGh0bWwgPSAiJm5ic3A7IjsgfQorCQkJdmFyIGNvbnRlbnQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmRvbU5vZGUpOworCQkJdGhpcy5fb2xkSGVpZ2h0ID0gY29udGVudC5oZWlnaHQ7CisJCQl0aGlzLl9vbGRXaWR0aCA9IGNvbnRlbnQud2lkdGg7CisKKwkJCXRoaXMuX2ZpcnN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4gPSB0aGlzLl9nZXRDb250cmlidXRpbmdNYXJnaW4odGhpcy5kb21Ob2RlLCAidG9wIik7CisJCQl0aGlzLl9sYXN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4gPSB0aGlzLl9nZXRDb250cmlidXRpbmdNYXJnaW4odGhpcy5kb21Ob2RlLCAiYm90dG9tIik7CisKKwkJCXRoaXMuc2F2ZWRDb250ZW50ID0gaHRtbDsKKwkJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSAnJzsKKworCQkJdGhpcy5lZGl0aW5nQXJlYSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5lZGl0aW5nQXJlYSk7CisKKwkJCS8vIElmIHdlJ3JlIGEgbGlzdCBpdGVtIHdlIGhhdmUgdG8gcHV0IGluIGEgYmxhbmsgbGluZSB0byBmb3JjZSB0aGUKKwkJCS8vIGJ1bGxldCB0byBuaWNlbHkgYWxpZ24gYXQgdGhlIHRvcCBvZiB0ZXh0CisJCQlpZigJKHRoaXMuZG9tTm9kZVsibm9kZU5hbWUiXSkmJgorCQkJCSh0aGlzLmRvbU5vZGUubm9kZU5hbWUgPT0gIkxJIikpeworCQkJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSAiIDxicj4iOworCQkJfQorCisJCQlpZih0aGlzLnNhdmVOYW1lICE9ICIiICYmICghZGpDb25maWdbInVzZVhEb21haW4iXSB8fCBkakNvbmZpZ1siYWxsb3dYZFJpY2hUZXh0U2F2ZSJdKSl7CisJCQkJdmFyIHNhdmVUZXh0YXJlYSA9IGRvam8uZG9jKCkuZ2V0RWxlbWVudEJ5SWQoImRvam8ud2lkZ2V0LlJpY2hUZXh0LnNhdmVkQ29udGVudCIpOworCQkJCWlmIChzYXZlVGV4dGFyZWEudmFsdWUgIT0gIiIpIHsKKwkJCQkJdmFyIGRhdGFzID0gc2F2ZVRleHRhcmVhLnZhbHVlLnNwbGl0KHRoaXMuX1NFUEFSQVRPUik7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCXZhciBkYXRhID0gZGF0YXNbaV0uc3BsaXQoIjoiKTsKKwkJCQkJCWlmIChkYXRhWzBdID09IHRoaXMuc2F2ZU5hbWUpIHsKKwkJCQkJCQlodG1sID0gZGF0YVsxXTsKKwkJCQkJCQlkYXRhcy5zcGxpY2UoaSwgMSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZG9qby5ldmVudC5jb25uZWN0KCJiZWZvcmUiLCB3aW5kb3csICJvbnVubG9hZCIsIHRoaXMsICJfc2F2ZUNvbnRlbnQiKTsKKwkJCQkvLyBkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib251bmxvYWQiLCB0aGlzLCAiX3NhdmVDb250ZW50Iik7CisJCQl9CisKKwkJCWlmKGguaWU3MCAmJiB0aGlzLnVzZUFjdGl2ZVgpeworCQkJCWRvam8uZGVidWcoImFjdGl2ZVggaW4gaWU3MCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgdXNlQWN0aXZlWCBpcyBpZ25vcmVkIGZvciBub3cuIik7CisJCQkJdGhpcy51c2VBY3RpdmVYID0gZmFsc2U7CisJCQl9CisJCQkvLyBTYWZhcmkncyBzZWxlY3Rpb25zIGdvIGFsbCBvdXQgb2Ygd2hhY2sgaWYgd2UgZG8gaXQgaW5saW5lLAorCQkJLy8gc28gZm9yIG5vdyBJRSBpcyBvdXIgb25seSBoZXJvCisJCQkvL2lmICh0eXBlb2YgZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgIT0gInVuZGVmaW5lZCIpIHsKKwkJCWlmKHRoaXMudXNlQWN0aXZlWCAmJiBoLmllKXsgLy8gYWN0aXZlLXgKKwkJCQl2YXIgc2VsZiA9IHRoaXM7CisJCQkJLy9pZiBjYWxsIF9kcmF3T2JqZWN0IGRpcmVjdGx5IGhlcmUsIHRleHRhcmVhIHJlcGxhY2VtZW50CisJCQkJLy93b24ndCB3b3JrOiBubyBjb250ZW50IGlzIHNob3duLiBIb3dldmVyLCBhZGQgYSBkZWxheQorCQkJCS8vY2FuIHdvcmthcm91bmQgdGhpcy4gTm8gY2x1ZSB3aHkuCisJCQkJc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuX2RyYXdPYmplY3QoaHRtbCk7fSwgMCk7CisJCQl9ZWxzZSBpZihoLmllIHx8IHRoaXMuX3NhZmFyaUlzTGVvcGFyZCgpIHx8IGgub3BlcmEpeyAvLyBjb250ZW50RWRpdGFibGUsIGVhc3kKKwkJCQl0aGlzLmlmcmFtZSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCggJ2lmcmFtZScgKSA7CisJCQkJdGhpcy5pZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6dm9pZCgwKSc7CisJCQkJdGhpcy5lZGl0b3JPYmplY3QgPSB0aGlzLmlmcmFtZTsKKwkJCQl3aXRoKHRoaXMuaWZyYW1lLnN0eWxlKXsKKwkJCQkJYm9yZGVyID0gJzAnOworCQkJCQl3aWR0aCA9ICIxMDAlIjsKKwkJCQl9CisJCQkJdGhpcy5pZnJhbWUuZnJhbWVCb3JkZXIgPSAwOworCQkJCXRoaXMuZWRpdGluZ0FyZWEuYXBwZW5kQ2hpbGQodGhpcy5pZnJhbWUpCisJCQkJdGhpcy53aW5kb3cgPSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93OworCQkJCXRoaXMuZG9jdW1lbnQgPSB0aGlzLndpbmRvdy5kb2N1bWVudDsKKwkJCQl0aGlzLmRvY3VtZW50Lm9wZW4oKTsKKwkJCQl0aGlzLmRvY3VtZW50LndyaXRlKCI8aHRtbD48aGVhZD48c3R5bGU+Ym9keXttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyOjA7b3ZlcmZsb3c6aGlkZGVuO308L3N0eWxlPjwvaGVhZD48Ym9keT48ZGl2PjwvZGl2PjwvYm9keT48L2h0bWw+Iik7CisJCQkJdGhpcy5kb2N1bWVudC5jbG9zZSgpOworCQkJCXRoaXMuZWRpdE5vZGUgPSB0aGlzLmRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZDsvL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCXRoaXMuZWRpdE5vZGUuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKKwkJCQl3aXRoICh0aGlzLmlmcmFtZS5zdHlsZSkgeworCQkJCQlpZihoLmllNzApeworCQkJCQkJaWYodGhpcy5oZWlnaHQpeworCQkJCQkJCWhlaWdodCA9IHRoaXMuaGVpZ2h0OworCQkJCQkJfQorCQkJCQkJaWYodGhpcy5taW5IZWlnaHQpeworCQkJCQkJCW1pbkhlaWdodCA9IHRoaXMubWluSGVpZ2h0OworCQkJCQkJfQorCQkJCQl9ZWxzZXsKKwkJCQkJCWhlaWdodCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQgOiB0aGlzLm1pbkhlaWdodDsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIEZJWE1FOiBzZXR0aW5nIGNvbnRlbnRFZGl0YWJsZSBvbiBzd2l0Y2hlcyB0aGlzIGVsZW1lbnQgdG8KKwkJCQkvLyBJRSdzIGhhc0xheW91dCBtb2RlLCB0cmlnZ2VyaW5nIHdlaXJkIG1hcmdpbiBjb2xsYXBzaW5nCisJCQkJLy8gYmVoYXZpb3IuIEl0J3MgcGFydGljdWxhcmx5IGJhZCBpZiB0aGUgZWxlbWVudCB5b3UncmUgZWRpdGluZworCQkJCS8vIGNvbnRhaW5zIGNoaWxkbm9kZXMgdGhhdCBkb24ndCBoYXZlIG1hcmdpbjogZGVmaW5lZCBpbiBsb2NhbAorCQkJCS8vIGNzcyBydWxlcy4gSXQgd291bGQgYmUgbmljZSBpZiBpdCB3YXMgcG9zc2libGUgdG8gaGFjayBhcm91bmQKKwkJCQkvLyB0aGlzLiBTYWRseSBfZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbiBhbmQKKwkJCQkvLyBfbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luIGRvbid0IHdvcmsgb24gSUUgdW5sZXNzIGFsbAorCQkJCS8vIGVsZW1lbnRzIGhhdmUgbWFyZ2lucyBzZXQgaW4gQ1NTIDotKAorCisJCQkJLy9pZiB0aGUgbm9ybWFsIHdheSBmYWlscywgd2UgdHJ5IHRoZSBoYXJkIHdheSB0byBnZXQgdGhlIGxpc3QKKwkJCQkvL2RvIG5vdCB1c2UgX2NhY2hlTG9jYWxCbG9ja0Zvcm1hdE5hbWVzIGhlcmUsIGFzIGl0IHdpbGwgdHJpZ2dlciBzZWN1cml0eSB3YXJuaW5nIGluIElFNworCQkJCS8vaW4gdGhlIGFycmF5IGJlbG93LCB1bCBjYW4gbm90IGNvbWUgZGlyZWN0bHkgYWZ0ZXIgb2wsIG90aGVyd2lzZSB0aGUgcXVlcnlDb21tYW5kVmFsdWUgcmV0dXJucyBOb3JtYWwgZm9yIGl0CisJCQkJdmFyIGZvcm1hdHMgPSBbJ3AnLCAncHJlJywgJ2FkZHJlc3MnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnb2wnLCAnZGl2JywgJ3VsJ107CisJCQkJdmFyIGxvY2FsaHRtbCA9ICIiOworCQkJCWZvcih2YXIgaSBpbiBmb3JtYXRzKXsKKwkJCQkJaWYoZm9ybWF0c1tpXS5jaGFyQXQoMSkgIT0gJ2wnKXsKKwkJCQkJCWxvY2FsaHRtbCArPSAiPCIrZm9ybWF0c1tpXSsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC8iK2Zvcm1hdHNbaV0rIj4iOworCQkJCQl9ZWxzZXsKKwkJCQkJCWxvY2FsaHRtbCArPSAiPCIrZm9ybWF0c1tpXSsiPjxsaT5jb250ZW50PC9saT48LyIrZm9ybWF0c1tpXSsiPiI7CisJCQkJCX0KKwkJCQl9CisJCQkJLy9xdWVyeUNvbW1hbmRWYWx1ZSByZXR1cm5zIGVtcHR5IGlmIHdlIGhpZGUgZWRpdE5vZGUsIHNvIG1vdmUgaXQgb3V0IG9mIHNjcmVlbiB0ZW1wb3JhcnkKKwkJCQl3aXRoKHRoaXMuZWRpdE5vZGUuc3R5bGUpeworCQkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJCWxlZnQgPSAiLTIwMDBweCI7CisJCQkJCXRvcCA9ICItMjAwMHB4IjsKKwkJCQl9CisJCQkJdGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwgPSBsb2NhbGh0bWw7CisJCQkJdmFyIG5vZGUgPSB0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQ7CisJCQkJd2hpbGUobm9kZSl7CisJCQkJCWRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywgInNlbGVjdEVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbbm9kZS5maXJzdENoaWxkXSk7CisJCQkJCXZhciBuYXRpdmVuYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJCQkJCXRoaXMuX2xvY2FsMk5hdGl2ZUZvcm1hdE5hbWVzW25hdGl2ZW5hbWVdID0gdGhpcy5xdWVyeUNvbW1hbmRWYWx1ZSgiZm9ybWF0YmxvY2siKTsKKy8vCQkJCQkJZG9qby5kZWJ1ZyhbbmF0aXZlbmFtZSx0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tuYXRpdmVuYW1lXV0pOworCQkJCQl0aGlzLl9uYXRpdmUyTG9jYWxGb3JtYXROYW1lc1t0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tuYXRpdmVuYW1lXV0gPSBuYXRpdmVuYW1lOworCQkJCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwkJCQl9CisJCQkJd2l0aCh0aGlzLmVkaXROb2RlLnN0eWxlKXsKKwkJCQkJcG9zaXRpb24gPSAiIjsKKwkJCQkJbGVmdCA9ICIiOworCQkJCQl0b3AgPSAiIjsKKwkJCQl9CisKKwkJCQl0aGlzLmVkaXROb2RlLmlubmVySFRNTCA9IGh0bWw7CisJCQkJaWYodGhpcy5oZWlnaHQpeyB0aGlzLmRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dZPSJzY3JvbGwiOyB9CisKKwkJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24oZSl7CisJCQkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmVkaXROb2RlLCBlLnRvTG93ZXJDYXNlKCksIHRoaXMsIGUpOworCQkJCX0sIHRoaXMpOworCisJCQkJdGhpcy5vbkxvYWQoKTsKKwkJCX0gZWxzZSB7IC8vIGRlc2lnbk1vZGUgaW4gaWZyYW1lCisJCQkJdGhpcy5fZHJhd0lmcmFtZShodG1sKTsKKwkJCQl0aGlzLmVkaXRvck9iamVjdCA9IHRoaXMuaWZyYW1lOworCQkJfQorCisJCQkvLyBUT0RPOiB0aGlzIGlzIGEgZ3Vlc3MgYXQgdGhlIGRlZmF1bHQgbGluZS1oZWlnaHQsIGtpbmRhIHdvcmtzCisJCQlpZiAodGhpcy5kb21Ob2RlLm5vZGVOYW1lID09ICJMSSIpIHsgdGhpcy5kb21Ob2RlLmxhc3RDaGlsZC5zdHlsZS5tYXJnaW5Ub3AgPSAiLTEuMmVtIjsgfQorCQkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgIlJpY2hUZXh0RWRpdGFibGUiKTsKKworCQkJdGhpcy5pc0Nsb3NlZCA9IGZhbHNlOworCQl9LAorCisJCV9oYXNDb2xsYXBzZWFibGVNYXJnaW46IGZ1bmN0aW9uKC8qRG9tTm9kZSovZWxlbWVudCwgLypTdHJpbmcqL3NpZGUpIHsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJY2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgcGFkZGluZyBvciBib3JkZXJzIG9uIHRoZSBnaXZlbiBzaWRlCisJCQkvLwkJd2hpY2ggd291bGQgcHJldmVudCBpdCBmcm9tIGNvbGxhcHNpbmcgbWFyZ2lucworCQkJaWYgKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKGVsZW1lbnQsCisJCQkJCQkJCQkJICdib3JkZXItJytzaWRlKyctd2lkdGgnLAorCQkJCQkJCQkJCSBmYWxzZSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKGVsZW1lbnQsCisJCQkJCQkJCQkJCQkncGFkZGluZy0nK3NpZGUsCisJCQkJCQkJCQkJCQlmYWxzZSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9LAorCisJCV9nZXRDb250cmlidXRpbmdNYXJnaW46CWZ1bmN0aW9uKC8qRG9tTm9kZSovZWxlbWVudCwgLypTdHJpbmcqL3RvcE9yQm90dG9tKSB7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWNhbGN1bGF0ZSBob3cgbXVjaCBtYXJnaW4gdGhpcyBlbGVtZW50IGFuZCBpdHMgZmlyc3Qgb3IgbGFzdAorCQkJLy8JCWNoaWxkIGFyZSBjb250cmlidXRpbmcgdG8gdGhlIHRvdGFsIG1hcmdpbiBiZXR3ZWVuIHRoaXMgZWxlbWVudAorCQkJLy8JCWFuZCB0aGUgYWRqYWNlbnQgbm9kZS4gQ1NTIGJvcmRlciBjb2xsYXBzaW5nIG1ha2VzIHRoaXMKKwkJCS8vCQluZWNlc3NhcnkuCisKKwkJCWlmICh0b3BPckJvdHRvbSA9PSAidG9wIikgeworCQkJCXZhciBzaWJsaW5nQXR0ciA9ICJwcmV2aW91c1NpYmxpbmciOworCQkJCXZhciBjaGlsZFNpYmxpbmdBdHRyID0gIm5leHRTaWJsaW5nIjsKKwkJCQl2YXIgY2hpbGRBdHRyID0gImZpcnN0Q2hpbGQiOworCQkJCXZhciBtYXJnaW5Qcm9wID0gIm1hcmdpbi10b3AiOworCQkJCXZhciBzaWJsaW5nTWFyZ2luUHJvcCA9ICJtYXJnaW4tYm90dG9tIjsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIHNpYmxpbmdBdHRyID0gIm5leHRTaWJsaW5nIjsKKwkJCQl2YXIgY2hpbGRTaWJsaW5nQXR0ciA9ICJwcmV2aW91c1NpYmxpbmciOworCQkJCXZhciBjaGlsZEF0dHIgPSAibGFzdENoaWxkIjsKKwkJCQl2YXIgbWFyZ2luUHJvcCA9ICJtYXJnaW4tYm90dG9tIjsKKwkJCQl2YXIgc2libGluZ01hcmdpblByb3AgPSAibWFyZ2luLXRvcCI7CisJCQl9CisKKwkJCXZhciBlbGVtZW50TWFyZ2luID0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUoZWxlbWVudCwgbWFyZ2luUHJvcCwgZmFsc2UpOworCisJCQlmdW5jdGlvbiBpc1NpZ25pZmljYW50Tm9kZShlbGVtZW50KSB7CisJCQkJLy8gc2VlIGlmIGFuIG5vZGUgaXMgc2lnbmlmaWNhbnQgaW4gdGhlIGN1cnJlbnQgY29udGV4dAorCQkJCS8vIGZvciBjYWx1bGF0aW5nIG1hcmdpbnMKKwkJCQlyZXR1cm4gIShlbGVtZW50Lm5vZGVUeXBlPT0zICYmIGRvam8uc3RyaW5nLmlzQmxhbmsoZWxlbWVudC5kYXRhKSkKKwkJCQkJJiYgZG9qby5odG1sLmdldFN0eWxlKGVsZW1lbnQsICJkaXNwbGF5IikgIT0gIm5vbmUiCisJCQkJCSYmICFkb2pvLmh0bWwuaXNQb3NpdGlvbkFic29sdXRlKGVsZW1lbnQpOworCQkJfQorCisJCQkvLyB3YWxrIHRocm91aCBmaXJzdC9sYXN0IGNoaWxkcmVuIHRvIGZpbmQgdG90YWwgY29sbGFwc2VkIG1hcmdpbiBzaXplCisJCQl2YXIgY2hpbGRNYXJnaW4gPSAwOworCQkJdmFyIGNoaWxkID0gZWxlbWVudFtjaGlsZEF0dHJdOworCQkJd2hpbGUgKGNoaWxkKSB7CisJCQkJLy8gc2tpcCBvdmVyIGluc2lnbmlmaWNhbnQgZWxlbWVudHMgKHdoaXRlc3BhY2UsIGV0YykKKwkJCQl3aGlsZSAoKCFpc1NpZ25pZmljYW50Tm9kZShjaGlsZCkpICYmIGNoaWxkW2NoaWxkU2libGluZ0F0dHJdKSB7CisJCQkJCWNoaWxkID0gY2hpbGRbY2hpbGRTaWJsaW5nQXR0cl07CisJCQkJfQorCisJCQkJY2hpbGRNYXJnaW4gPSBNYXRoLm1heChjaGlsZE1hcmdpbiwgZG9qby5odG1sLmdldFBpeGVsVmFsdWUoY2hpbGQsIG1hcmdpblByb3AsIGZhbHNlKSk7CisJCQkJLy8gc3RvcCBpZiB3ZSBoaXQgYSBib3JkZXJlZC9wYWRkZWQgZWxlbWVudAorCQkJCWlmICghdGhpcy5faGFzQ29sbGFwc2VhYmxlTWFyZ2luKGNoaWxkLCB0b3BPckJvdHRvbSkpIGJyZWFrOworCQkJCWNoaWxkID0gY2hpbGRbY2hpbGRBdHRyXTsKKwkJCX0KKworCQkJLy8gaWYgdGhpcyBlbGVtZW50IGhhcyBhIGJvcmRlciwgcmV0dXJuIGZ1bGwgY2hpbGQgbWFyZ2luIGltbWVkaWF0ZWx5CisJCQkvLyBhcyB0aGVyZSB3b24ndCBiZSBhbnkgbWFyZ2luIGNvbGxhcHNpbmcKKwkJCWlmICghdGhpcy5faGFzQ29sbGFwc2VhYmxlTWFyZ2luKGVsZW1lbnQsIHRvcE9yQm90dG9tKSl7IHJldHVybiBwYXJzZUludChjaGlsZE1hcmdpbik7IH0KKworCQkJLy8gZmluZCBtYXJnaW4gc3VwcGxpZWQgYnkgbmVhcmVzdCBzaWJsaW5nCisJCQl2YXIgY29udGV4dE1hcmdpbiA9IDA7CisJCQl2YXIgc2libGluZyA9IGVsZW1lbnRbc2libGluZ0F0dHJdOworCQkJd2hpbGUgKHNpYmxpbmcpIHsKKwkJCQlpZiAoaXNTaWduaWZpY2FudE5vZGUoc2libGluZykpIHsKKwkJCQkJY29udGV4dE1hcmdpbiA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHNpYmxpbmcsCisJCQkJCQkJCQkJCQkJCQkgc2libGluZ01hcmdpblByb3AsCisJCQkJCQkJCQkJCQkJCQkgZmFsc2UpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc2libGluZyA9IHNpYmxpbmdbc2libGluZ0F0dHJdOworCQkJfQorCQkJaWYgKCFzaWJsaW5nKSB7IC8vIG5vIHNpYmxpbmcsIGxvb2sgYXQgcGFyZW50J3MgbWFyZ2luIGluc3RlYWQKKwkJCQljb250ZXh0TWFyZ2luID0gZG9qby5odG1sLmdldFBpeGVsVmFsdWUoZWxlbWVudC5wYXJlbnROb2RlLAorCQkJCQkJCQkJCQkJbWFyZ2luUHJvcCwgZmFsc2UpOworCQkJfQorCisJCQlpZiAoY2hpbGRNYXJnaW4gPiBlbGVtZW50TWFyZ2luKSB7CisJCQkJcmV0dXJuIHBhcnNlSW50KE1hdGgubWF4KChjaGlsZE1hcmdpbi1lbGVtZW50TWFyZ2luKS1jb250ZXh0TWFyZ2luLCAwKSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAwOworCQkJfQorCisJCX0sCisKKwkJX2RyYXdJZnJhbWU6IGZ1bmN0aW9uICgvKlN0cmluZyovaHRtbCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCURyYXdzIGFuIGlGcmFtZSB1c2luZyB0aGUgZXhpc3Rpbmcgb25lIGlmIG9uZSBleGlzdHMuCisJCQkvLwkJVXNlZCBieSBNb3ppbGxhLCBTYWZhcmksIGFuZCBPcGVyYQorCisJCQkvLyBkZXRlY3QgZmlyZWZveCA8IDEuNSwgd2hpY2ggaGFzIHNvbWUgaWZyYW1lIGxvYWRpbmcgaXNzdWVzCisJCQl2YXIgb2xkTW96ID0gQm9vbGVhbihkb2pvLnJlbmRlci5odG1sLm1veiAmJiAoCisJCQkJCQkJCQl0eXBlb2Ygd2luZG93LlhNTCA9PSAndW5kZWZpbmVkJykpCisKKwkJCWlmKCF0aGlzLmlmcmFtZSl7CisJCQkJdmFyIGN1cnJlbnREb21haW4gPSAobmV3IGRvam8udXJpLlVyaShkb2pvLmRvYygpLmxvY2F0aW9uKSkuaG9zdDsKKwkJCQl0aGlzLmlmcmFtZSA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CisJCQkJLy8gZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5pZnJhbWUpOworCQkJCXdpdGgodGhpcy5pZnJhbWUpeworCQkJCQlzdHlsZS5ib3JkZXIgPSAibm9uZSI7CisJCQkJCXN0eWxlLmxpbmVIZWlnaHQgPSAiMCI7IC8vIHNxdWFzaCBsaW5lIGhlaWdodAorCQkJCQlzdHlsZS52ZXJ0aWNhbEFsaWduID0gImJvdHRvbSI7CisJCQkJCXNjcm9sbGluZyA9IHRoaXMuaGVpZ2h0ID8gImF1dG8iIDogIm5vIjsKKwkJCQl9CisJCQl9CisJCQkvLyBvcGVyYSBsaWtlcyB0aGlzIHRvIGJlIG91dHNpZGUgdGhlIHdpdGggYmxvY2sKKwkJCWlmKGRqQ29uZmlnWyJ1c2VYRG9tYWluIl0gJiYgIWRqQ29uZmlnWyJkb2pvUmljaFRleHRGcmFtZVVybCJdKXsKKwkJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5SaWNoVGV4dDogV2hlbiB1c2luZyBjcm9zcy1kb21haW4gRG9qbyBidWlsZHMsIgorCQkJCQkrICIgcGxlYXNlIHNhdmUgc3JjL3dpZGdldC90ZW1wbGF0ZXMvcmljaHRleHRmcmFtZS5odG1sIHRvIHlvdXIgZG9tYWluIGFuZCBzZXQgZGpDb25maWcuZG9qb1JpY2hUZXh0RnJhbWVVcmwiCisJCQkJCSsgIiB0byB0aGUgcGF0aCBvbiB5b3VyIGRvbWFpbiB0byByaWNodGV4dGZyYW1lLmh0bWwiKTsKKwkJCX0KKwkJCXRoaXMuaWZyYW1lLnNyYyA9IChkakNvbmZpZ1siZG9qb1JpY2hUZXh0RnJhbWVVcmwiXSB8fCBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9yaWNodGV4dGZyYW1lLmh0bWwiKSkgCisJCQkJKyAoKGRvam8uZG9jKCkuZG9tYWluICE9IGN1cnJlbnREb21haW4pID8gKCIjIitkb2pvLmRvYygpLmRvbWFpbikgOiAiIik7CisJCQl0aGlzLmlmcmFtZS53aWR0aCA9IHRoaXMuaW5oZXJpdFdpZHRoID8gdGhpcy5fb2xkV2lkdGggOiAiMTAwJSI7CisJCQlpZih0aGlzLmhlaWdodCl7CisJCQkJdGhpcy5pZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisJCQl9ZWxzZXsKKwkJCQl2YXIgaGVpZ2h0ID0gdGhpcy5fb2xkSGVpZ2h0OworCQkJCWlmKHRoaXMuX2hhc0NvbGxhcHNlYWJsZU1hcmdpbih0aGlzLmRvbU5vZGUsICd0b3AnKSl7CisJCQkJCWhlaWdodCArPSB0aGlzLl9maXJzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luOworCQkJCX0KKwkJCQlpZih0aGlzLl9oYXNDb2xsYXBzZWFibGVNYXJnaW4odGhpcy5kb21Ob2RlLCAnYm90dG9tJykpeworCQkJCQloZWlnaHQgKz0gdGhpcy5fbGFzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luOworCQkJCX0KKwkJCQl0aGlzLmlmcmFtZS5oZWlnaHQgPSBoZWlnaHQ7CisJCQl9CisKKwkJCXZhciB0bXBDb250ZW50ID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCXRtcENvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDsKKwkJCS8vYXBwZW5kIHRtcENvbnRlbnQgdG8gdW5kZXIgdGhlIGN1cnJlbnQgZG9tTm9kZSBzbyB0aGF0IHRoZSBtYXJnaW4KKwkJCS8vY2FsY3VsYXRpb24gYmVsb3cgaXMgY29ycmVjdAorCQkJdGhpcy5lZGl0aW5nQXJlYS5hcHBlbmRDaGlsZCh0bXBDb250ZW50KTsKKworCQkJLy8gbWFrZSByZWxhdGl2ZSBpbWFnZSB1cmxzIGFic29sdXRlCisJCQlpZih0aGlzLnJlbGF0aXZlSW1hZ2VVcmxzKXsKKwkJCQl2YXIgaW1ncyA9IHRtcENvbnRlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOworCQkJCWZvcih2YXIgaT0wOyBpPGltZ3MubGVuZ3RoOyBpKyspeworCQkJCQlpbWdzW2ldLnNyYyA9IChuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24sIGltZ3NbaV0uc3JjKSkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQkJaHRtbCA9IHRtcENvbnRlbnQuaW5uZXJIVE1MOworCQkJfQorCisJCQkvLyBmaXggbWFyZ2lucyBvbiB0bXBDb250ZW50CisJCQl2YXIgZmlyc3RDaGlsZCA9IGRvam8uaHRtbC5maXJzdEVsZW1lbnQodG1wQ29udGVudCk7CisJCQl2YXIgbGFzdENoaWxkID0gZG9qby5odG1sLmxhc3RFbGVtZW50KHRtcENvbnRlbnQpOworCQkJaWYoZmlyc3RDaGlsZCl7CisJCQkJZmlyc3RDaGlsZC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLl9maXJzdENoaWxkQ29udHJpYnV0aW5nTWFyZ2luKyJweCI7CisJCQl9CisJCQlpZihsYXN0Q2hpbGQpeworCQkJCWxhc3RDaGlsZC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLl9sYXN0Q2hpbGRDb250cmlidXRpbmdNYXJnaW4rInB4IjsKKwkJCX0KKwkJCS8vZG8gd2Ugd2FudCB0byBzaG93IHRoZSBjb250ZW50IGJlZm9yZSB0aGUgZWRpdGluZyBhcmVhIGZpbmlzaCBsb2FkaW5nIGhlcmU/CisJCQkvL2lmIGV4dGVybmFsIHN0eWxlIHNoZWV0cyBhcmUgdXNlZCBmb3IgdGhlIGVkaXRpbmcgYXJlYSwgdGhlIGFwcGVhcmFuY2Ugbm93CisJCQkvL2FuZCBhZnRlciBsb2FkaW5nIG9mIHRoZSBlZGl0aW5nIGFyZWEgd29uJ3QgYmUgdGhlIHNhbWUgKGFuZCBwYWRkaW5nL21hcmdpbgorCQkJLy9jYWxjdWxhdGlvbiBhYm92ZSBtYXkgbm90IGJlIGFjY3VyYXRlKQorLy8JCQl0bXBDb250ZW50LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKXsKKwkJCQl0aGlzLmlmcmFtZS5zcmMgPSB0aGlzLmlmcmFtZS5zcmM7CisJCQl9CisKKwkJCXZhciBfaWZyYW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCQkJLy8gbm93IHdlIHdhaXQgZm9yIG9ubG9hZC4gSmFua3kgaGFjayEKKwkJCXZhciBpZnJGdW5jID0gZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKCl7CisJCQkJaWYoIV9pZnJhbWVJbml0aWFsaXplZCl7CisJCQkJCV9pZnJhbWVJbml0aWFsaXplZCA9IHRydWU7CisJCQkJfWVsc2V7IHJldHVybjsgfQorCQkJCWlmKCF0aGlzLmVkaXROb2RlKXsKKwkJCQkJaWYodGhpcy5pZnJhbWUuY29udGVudFdpbmRvdyl7CisJCQkJCQl0aGlzLndpbmRvdyA9IHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3c7CisJCQkJCQl0aGlzLmRvY3VtZW50ID0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudAorCQkJCQl9ZWxzZSBpZih0aGlzLmlmcmFtZS5jb250ZW50RG9jdW1lbnQpeworCQkJCQkJLy8gZm9yIG9wZXJhCisJCQkJCQl0aGlzLndpbmRvdyA9IHRoaXMuaWZyYW1lLmNvbnRlbnREb2N1bWVudC53aW5kb3c7CisJCQkJCQl0aGlzLmRvY3VtZW50ID0gdGhpcy5pZnJhbWUuY29udGVudERvY3VtZW50OworCQkJCQl9CisKKwkJCQkJLy8gY3VycnkgdGhlIGdldFN0eWxlIGZ1bmN0aW9uCisJCQkJCXZhciBnZXRTdHlsZSA9IChmdW5jdGlvbiAoZG9tTm9kZSkgeyByZXR1cm4gZnVuY3Rpb24gKHN0eWxlKSB7CisJCQkJCQlyZXR1cm4gZG9qby5odG1sLmdldFN0eWxlKGRvbU5vZGUsIHN0eWxlKTsKKwkJCQkJfTsgfSkodGhpcy5kb21Ob2RlKTsKKworCQkJCQl2YXIgZm9udCA9CisJCQkJCQlnZXRTdHlsZSgnZm9udC13ZWlnaHQnKSArICIgIiArCisJCQkJCQlnZXRTdHlsZSgnZm9udC1zaXplJykgKyAiICIgKworCQkJCQkJZ2V0U3R5bGUoJ2ZvbnQtZmFtaWx5Jyk7CisKKwkJCQkJLy8gbGluZSBoZWlnaHQgaXMgdHJpY2t5IC0gYXBwbHlpbmcgYSB1bml0cyB2YWx1ZSB3aWxsIG1lc3MgdGhpbmdzIHVwLgorCQkJCQkvLyBpZiB3ZSBjYW4ndCBnZXQgYSBub24tdW5pdHMgdmFsdWUsIGJhaWwgb3V0LgorCQkJCQl2YXIgbGluZUhlaWdodCA9ICIxLjAiOworCQkJCQl2YXIgbGluZUhlaWdodFN0eWxlID0gZG9qby5odG1sLmdldFVuaXRWYWx1ZSh0aGlzLmRvbU5vZGUsICdsaW5lLWhlaWdodCcpOworCQkJCQlpZiAobGluZUhlaWdodFN0eWxlLnZhbHVlICYmIGxpbmVIZWlnaHRTdHlsZS51bml0cz09IiIpIHsKKwkJCQkJCWxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0U3R5bGUudmFsdWU7CisJCQkJCX0KKworCQkJCQlkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCgKKwkJCQkJCSdib2R5LGh0bWx7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtwYWRkaW5nOjA7bWFyZ2luOjA7fScgKworCQkJCQkJLy8gVE9ETzogbGVmdCBwb3NpdGlvbmluZyB3aWxsIGNhc2UgY29udGVudHMgdG8gZGlzYXBwZWFyIG91dCBvZiB2aWV3CisJCQkJCQkvLyAgICAgICBpZiBpdCBnZXRzIHRvbyB3aWRlIGZvciB0aGUgdmlzaWJsZSBhcmVhCisJCQkJCQknYm9keXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDsnICsKKwkJCQkJCSgoKHRoaXMuaGVpZ2h0KXx8KGRvam8ucmVuZGVyLmh0bWwub3BlcmEpKSA/ICcnIDogJ3Bvc2l0aW9uOmZpeGVkOycpICsKKwkJCQkJCSdmb250OicgKyBmb250ICsgJzsnICsKKwkJCQkJCSdtaW4taGVpZ2h0OicgKyB0aGlzLm1pbkhlaWdodCArICc7JyArCisJCQkJCQknbGluZS1oZWlnaHQ6JyArIGxpbmVIZWlnaHQgKyAnfScgKworCQkJCQkJJ3B7bWFyZ2luOiAxZW0gMCAhaW1wb3J0YW50O30nICsKKwkJCQkJCSdib2R5ID4gKjpmaXJzdC1jaGlsZHtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7bWFyZ2luLXRvcDonICsgdGhpcy5fZmlyc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbiArICdweCAhaW1wb3J0YW50O30nICsgLy8gRklYTUU6IHRlc3QgZmlyc3RDaGlsZCBub2RlVHlwZQorCQkJCQkJJ2JvZHkgPiAqOmxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MCAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206JyArIHRoaXMuX2xhc3RDaGlsZENvbnRyaWJ1dGluZ01hcmdpbiArICdweCAhaW1wb3J0YW50O30nICsKKwkJCQkJCSdsaSA+IHVsOi1tb3otZmlyc3Qtbm9kZSwgbGkgPiBvbDotbW96LWZpcnN0LW5vZGV7cGFkZGluZy10b3A6MS4yZW07fVxuJyArCisJCQkJCQknbGl7bWluLWhlaWdodDoxLjJlbTt9JyArCisJCQkJCQkvLycgICAgcCx1bCxsaSB7IHBhZGRpbmctdG9wOiAwOyBwYWRkaW5nLWJvdHRvbTogMDsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOiAwOyB9XG4nICsKKwkJCQkJCScnLCB0aGlzLmRvY3VtZW50KTsKKworCQkJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZSh0bXBDb250ZW50KTsKKwkJCQkJdGhpcy5kb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGh0bWw7CisJCQkJCWlmKG9sZE1venx8ZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpeworCQkJCQkJdGhpcy5kb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9uIjsKKwkJCQkJfQorCQkJCQl0aGlzLm9uTG9hZCgpOworCQkJCX1lbHNleworCQkJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZSh0bXBDb250ZW50KTsKKwkJCQkJdGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwgPSBodG1sOworCQkJCQl0aGlzLm9uRGlzcGxheUNoYW5nZWQoKTsKKwkJCQl9CisJCQl9KTsKKworCQkJaWYodGhpcy5lZGl0Tm9kZSl7CisJCQkJaWZyRnVuYygpOyAvLyBpZnJhbWUgYWxyZWFkeSBleGlzdHMsIGp1c3Qgc2V0IGNvbnRlbnQKKwkJCX1lbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwubW96KXsKKwkJCQkvLyBGSVhNRTogaWYgd2UgcHV0IHRoaXMgb24gYSBkZWxheSwgd2UgZ2V0IGEgaGVpZ2h0IG9mIDIwcHguCisJCQkJLy8gT3RoZXJ3aXNlIHdlIGdldCB0aGUgY29ycmVjdGx5IHNwZWNpZmllZCBtaW5IZWlnaHQgdmFsdWUuCisJCQkJdGhpcy5pZnJhbWUub25sb2FkID0gZnVuY3Rpb24oKXsKKwkJCQkJc2V0VGltZW91dChpZnJGdW5jLCAyNTApOworCQkJCX0KKwkJCX1lbHNleyAvLyBuZXcgbW96aWxsYXMsIG9wZXJhLCBzYWZhcmkKKwkJCQl0aGlzLmlmcmFtZS5vbmxvYWQgPSBpZnJGdW5jOworCQkJfQorCQl9LAorCisJCV9hcHBseUVkaXRpbmdBcmVhU3R5bGVTaGVldHM6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWFwcGx5IHRoZSBzcGVjaWZpZWQgY3NzIGZpbGVzIGluIHN0eWxlU2hlZXRzCisJCQl2YXIgZmlsZXMgPSBbXTsKKwkJCWlmKHRoaXMuc3R5bGVTaGVldHMpeworCQkJCWZpbGVzID0gdGhpcy5zdHlsZVNoZWV0cy5zcGxpdCgnOycpOworCQkJCXRoaXMuc3R5bGVTaGVldHMgPSAnJzsKKwkJCX0KKworCQkJLy9lbXB0eSB0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHMgaGVyZSwgYXMgaXQgd2lsbCBiZSBmaWxsZWQgaW4gYWRkU3R5bGVTaGVldAorCQkJZmlsZXMgPSBmaWxlcy5jb25jYXQodGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzKTsKKwkJCXRoaXMuZWRpdGluZ0FyZWFTdHlsZVNoZWV0cyA9IFtdOworCisJCQlpZihmaWxlcy5sZW5ndGg+MCl7CisJCQkJZm9yKHZhciBpPTA7aTxmaWxlcy5sZW5ndGg7aSsrKXsKKwkJCQkJdmFyIHVybCA9IGZpbGVzW2ldOworCQkJCQlpZih1cmwpeworCQkJCQkJLy9Vc2UgZG9qb1VyaSwgc2luY2Ugd2Ugd2FudCBwYXRocyByZWxhdGl2ZSB0byBiYXNlU2NyaXB0VXJpLgorCQkJCQkJdGhpcy5hZGRTdHlsZVNoZWV0KGRvam8udXJpLmRvam9VcmkodXJsKSk7CisJIAkJCQl9CisJIAkJCX0KKwkJCX0KKwkJfSwKKworCQlhZGRTdHlsZVNoZWV0OiBmdW5jdGlvbigvKmRvam8udXJpLlVyaSovdXJpKSB7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWFkZCBhbiBleHRlcm5hbCBzdHlsZXNoZWV0IGZvciB0aGUgZWRpdGluZyBhcmVhCisJCQkvLyB1cmk6CWEgZG9qby51cmkuVXJpIHBvaW50aW5nIHRvIHRoZSB1cmwgb2YgdGhlIGV4dGVybmFsIGNzcyBmaWxlCisJCQl2YXIgdXJsPXVyaS50b1N0cmluZygpOworCQkJaWYoZG9qby5sYW5nLmZpbmQodGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzLCB1cmwpID4gLTEpeworCQkJCWRvam8uZGVidWcoImRvam8ud2lkZ2V0LlJpY2hUZXh0LmFkZFN0eWxlU2hlZXQ6IFN0eWxlIHNoZWV0ICIrdXJsKyIgaXMgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBlZGl0aW5nIGFyZWEhIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL2lmIHVyaSBpcyByZWxhdGl2ZSwgdGhlbiBjb252ZXJ0IGl0IHRvIGFic29sdXRlIHNvIHRoYXQgaXQgY2FuIGJlIHJlc29sdmVkIGNvcnJlY3RseSBpbiBpZnJhbWUKKwkJCWlmKHVybC5jaGFyQXQoMCkgPT0gJy4nIHx8ICh1cmwuY2hhckF0KDApICE9ICcvJyAmJiAhdXJpLmhvc3QpKXsKKwkJCQl1cmwgPSAobmV3IGRvam8udXJpLlVyaShkb2pvLmdsb2JhbCgpLmxvY2F0aW9uLCB1cmwpKS50b1N0cmluZygpOworCQkJfQorCisJCQl0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHMucHVzaCh1cmwpOworCQkJaWYodGhpcy5kb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KXsgLy9JRQorCQkJCXRoaXMuZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCh1cmwpOworCQkJfWVsc2V7IC8vb3RoZXIgYnJvd3NlcgorCQkJCXZhciBoZWFkID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCQkJCXZhciBzdHlsZXNoZWV0ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7CisJCQkJd2l0aChzdHlsZXNoZWV0KXsKKwkJCQkJcmVsPSJzdHlsZXNoZWV0IjsKKwkJCQkJdHlwZT0idGV4dC9jc3MiOworCQkJCQlocmVmPXVybDsKKwkJCQl9CisJCQkJaGVhZC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTsKKwkJCX0KKwkJfSwKKworCQlyZW1vdmVTdHlsZVNoZWV0OiBmdW5jdGlvbiAoLypkb2pvLnVyaS5VcmkqL3VyaSkgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlyZW1vdmUgYW4gZXh0ZXJuYWwgc3R5bGVzaGVldCBmb3IgdGhlIGVkaXRpbmcgYXJlYQorCQkJdmFyIHVybD11cmkudG9TdHJpbmcoKTsKKwkJCS8vaWYgdXJpIGlzIHJlbGF0aXZlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYWJzb2x1dGUgc28gdGhhdCBpdCBjYW4gYmUgcmVzb2x2ZWQgY29ycmVjdGx5IGluIGlmcmFtZQorCQkJaWYodXJsLmNoYXJBdCgwKSA9PSAnLicgfHwgKHVybC5jaGFyQXQoMCkgIT0gJy8nICYmICF1cmkuaG9zdCkpeworCQkJCXVybCA9IChuZXcgZG9qby51cmkuVXJpKGRvam8uZ2xvYmFsKCkubG9jYXRpb24sIHVybCkpLnRvU3RyaW5nKCk7CisJCQl9CisJCQl2YXIgaW5kZXggPSBkb2pvLmxhbmcuZmluZCh0aGlzLmVkaXRpbmdBcmVhU3R5bGVTaGVldHMsIHVybCk7CisJCQlpZihpbmRleCA9PSAtMSl7CisJCQkJZG9qby5kZWJ1ZygiZG9qby53aWRnZXQuUmljaFRleHQucmVtb3ZlU3R5bGVTaGVldDogU3R5bGUgc2hlZXQgIit1cmwrIiBpcyBub3QgYXBwbGllZCB0byB0aGUgZWRpdGluZyBhcmVhIHNvIGl0IGNhbiBub3QgYmUgcmVtb3ZlZCEiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkZWxldGUgdGhpcy5lZGl0aW5nQXJlYVN0eWxlU2hlZXRzW2luZGV4XTsKKworCQkJdmFyIGxpbmtzID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpOworCQkJZm9yKHZhciBpPTA7aTxsaW5rcy5sZW5ndGg7aSsrKXsKKwkJCQlpZihsaW5rc1tpXS5ocmVmID09IHVybCl7CisJCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpey8vd2UgbmVlZCB0byBlbXB0eSB0aGUgaHJlZiBmaXJzdCwgdG8gZ2V0IElFIHRvIHJlbW92ZSB0aGUgcmVuZGVyZWQgc3R5bGVzCisJCQkJCQlsaW5rc1tpXS5ocmVmPSIiOworCQkJCQl9CisJCQkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKGxpbmtzW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9LAorCisJCV9kcmF3T2JqZWN0OiBmdW5jdGlvbiAoLypTdHJpbmcqL2h0bWwpIHsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJRHJhd3MgYW4gYWN0aXZlIHggb2JqZWN0LCB1c2VkIGJ5IElFCisJCQl0aGlzLm9iamVjdCA9IGRvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQoZG9qby5kb2MoKSwgIm9iamVjdCIpOworCisJCQl3aXRoICh0aGlzLm9iamVjdCkgeworCQkJCWNsYXNzaWQgPSAiY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMUQxLThEMDMtMDBBMEM5NTlCQzBBIjsKKwkJCQl3aWR0aCA9IHRoaXMuaW5oZXJpdFdpZHRoID8gdGhpcy5fb2xkV2lkdGggOiAiMTAwJSI7CisJCQkJc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodCA6ICh0aGlzLl9vbGRIZWlnaHQrInB4Iik7CisJCQkJU2Nyb2xsYmFycyA9IHRoaXMuaGVpZ2h0ID8gdHJ1ZSA6IGZhbHNlOworCQkJCUFwcGVhcmFuY2UgPSB0aGlzLl9hY3RpdmVYLmFwcGVhcmFuY2UuZmxhdDsKKwkJCX0KKwkJCXRoaXMuZWRpdG9yT2JqZWN0ID0gdGhpcy5vYmplY3Q7CisJCQl0aGlzLmVkaXRpbmdBcmVhLmFwcGVuZENoaWxkKHRoaXMub2JqZWN0KTsKKworCQkJdGhpcy5vYmplY3QuYXR0YWNoRXZlbnQoIkRvY3VtZW50Q29tcGxldGUiLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9uTG9hZCIpKTsKKwkJCS8vRGlzcGxheUNoYW5nZWQgaXMgZmlyZWQgdG9vIG9mdGVuIGV2ZW4gbm8gY2hhbmdlIGlzIG1hZGUsIHNvIHdlIGlnbm9yZSBpdAorCQkJLy9hbmQgY2FsbCBvbkRpc3BsYXlDaGFuZ2VkIG1hbnVhbGx5IGluIGV4ZWNDb21tYW5kIGluc3RlYWQKKy8vCQkJdGhpcy5vYmplY3QuYXR0YWNoRXZlbnQoIkRpc3BsYXlDaGFuZ2VkIiwgZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvbkRpc3BsYXlDaGFuZ2VkIikpOworCisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24oZSl7CisJCQkJdGhpcy5vYmplY3QuYXR0YWNoRXZlbnQoZS50b0xvd2VyQ2FzZSgpLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgZSkpOworCQkJfSwgdGhpcyk7CisKKwkJCXRoaXMub2JqZWN0LkRvY3VtZW50SFRNTCA9ICc8IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4nICsKKwkJCQknPGh0bWw+PHRpdGxlPjwvdGl0bGU+JyArCisJCQkJJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+JyArCisJCQkJJyAgICBib2R5LGh0bWwgeyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IH0nICsgLy9mb250OiAnICsgZm9udCArICc7IH0nICsKKwkJCQkodGhpcy5oZWlnaHQgPyAnJyA6ICcgICAgYm9keSwgIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfScpICsKKwkJCQknPC9zdHlsZT4nICsKKwkJCQkvLyc8YmFzZSBocmVmPSInICsgZG9qby5nbG9iYWwoKS5sb2NhdGlvbiArICciPicgKworCQkJCSc8Ym9keT48ZGl2PicgKyBodG1sICsgJzxkaXY+PC9ib2R5PjwvaHRtbD4nOworCisJCQl0aGlzLl9jYWNoZUxvY2FsQmxvY2tGb3JtYXROYW1lcygpOworCQl9LAorCisJCS8vc3RhdGljIGNhY2hlIHZhcmlhYmxlcyBzaGFyZWQgYW1vbmcgYWxsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKKwkJX2xvY2FsMk5hdGl2ZUZvcm1hdE5hbWVzOiB7fSwKKwkJX25hdGl2ZTJMb2NhbEZvcm1hdE5hbWVzOiB7fSwKKwkJLy9pbiBJRSwgbmFtZXMgZm9yIGJsb2NrZm9ybWF0IGlzIGxvY2FsZSBkZXBlbmRlbnQsIHNvIHdlIGNhY2hlIHRoZSB2YWx1ZXMgaGVyZQorCQkvL3dlIHVzZSBhY3RpdmVYIHRvIG9idGFpbiB0aGUgbGlzdCwgaWYgc3VjY2VzcyBvciB0aGUgbmFtZXMgYXJlIGFscmVhZHkgY2FjaGVkLAorCQkvL3JldHVybiB0cnVlCisJCV9jYWNoZUxvY2FsQmxvY2tGb3JtYXROYW1lczogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJaW4gSUUsIG5hbWVzIGZvciBibG9ja2Zvcm1hdCBpcyBsb2NhbGUgZGVwZW5kZW50LCBzbyB3ZSBjYWNoZSB0aGUgdmFsdWVzIGhlcmUKKwkJCS8vCQl3ZSB1c2UgYWN0aXZlWCB0byBvYnRhaW4gdGhlIGxpc3QsIGlmIHN1Y2Nlc3Mgb3IgdGhlIG5hbWVzIGFyZSBhbHJlYWR5IGNhY2hlZCwKKwkJCS8vCQlyZXR1cm4gdHJ1ZQorCQkJaWYoIXRoaXMuX25hdGl2ZTJMb2NhbEZvcm1hdE5hbWVzWydwJ10peworCQkJCXZhciBvYmogPSB0aGlzLm9iamVjdDsKKwkJCQl2YXIgZXJyb3IgPSBmYWxzZTsKKwkJCQlpZighb2JqKXsKKwkJCQkJLy9jcmVhdGUgb2JqIHRlbXBvcmFyaWx5CisJCQkJCXRyeXsKKwkJCQkJCW9iaiA9IGRvam8uaHRtbC5jcmVhdGVFeHRlcm5hbEVsZW1lbnQoZG9qby5kb2MoKSwgIm9iamVjdCIpOworCQkJCQkJb2JqLmNsYXNzaWQgPSAiY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMUQxLThEMDMtMDBBMEM5NTlCQzBBIjsKKwkJCQkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKG9iaik7CisJCQkJCQlvYmouRG9jdW1lbnRIVE1MID0gIjxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48L2JvZHk+PC9odG1sPiI7CisJCQkJCX1jYXRjaChlKXsgZXJyb3IgPSB0cnVlOyB9CisJCQkJfQorCQkJCXRyeXsKKwkJCQkJdmFyIG9OYW1lc1Bhcm0gPSBuZXcgQWN0aXZlWE9iamVjdCgiREVHZXRCbG9ja0ZtdE5hbWVzUGFyYW0uREVHZXRCbG9ja0ZtdE5hbWVzUGFyYW0iKTsKKwkJCQkJb2JqLkV4ZWNDb21tYW5kKHRoaXMuX2FjdGl2ZVguY29tbWFuZFsnZ2V0YmxvY2tmb3JtYXRuYW1lcyddLCAwLCBvTmFtZXNQYXJtKTsKKwkJCQkJdmFyIHZiTmFtZXNBcnJheSA9IG5ldyBWQkFycmF5KG9OYW1lc1Bhcm0uTmFtZXMpOworCQkJCQl2YXIgbG9jYWxGb3JtYXRzID0gdmJOYW1lc0FycmF5LnRvQXJyYXkoKTsKKwkJCQkJdmFyIG5hdGl2ZUZvcm1hdHMgPSBbJ3AnLCAncHJlJywgJ2FkZHJlc3MnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnb2wnLCAndWwnLCAnJywgJycsICcnLCcnLCdkaXYnXTsKKwkJCQkJZm9yKHZhciBpPTA7aTxuYXRpdmVGb3JtYXRzLmxlbmd0aDsrK2kpeworCQkJCQkJaWYobmF0aXZlRm9ybWF0c1tpXS5sZW5ndGg+MCl7CisJCQkJCQkJdGhpcy5fbG9jYWwyTmF0aXZlRm9ybWF0TmFtZXNbbG9jYWxGb3JtYXRzW2ldXSA9IG5hdGl2ZUZvcm1hdHNbaV07CisJCQkJCQkJdGhpcy5fbmF0aXZlMkxvY2FsRm9ybWF0TmFtZXNbbmF0aXZlRm9ybWF0c1tpXV0gPSBsb2NhbEZvcm1hdHNbaV07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9Y2F0Y2goZSl7IGVycm9yID0gdHJ1ZTsgfQorCQkJCWlmKG9iaiAmJiAhdGhpcy5vYmplY3QpeworCQkJCQkvL2RlbGV0ZSB0aGUgdGVtcG9yYXJ5IG9iagorCQkJCQlkb2pvLmJvZHkoKS5yZW1vdmVDaGlsZChvYmopOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAhZXJyb3I7CisJCX0sCisJLyogRXZlbnQgaGFuZGxlcnMKKwkgKioqKioqKioqKioqKioqKiovCisKKwkJX2lzUmVzaXplZDogZnVuY3Rpb24oKXsgcmV0dXJuIGZhbHNlOyB9LAorCisJCW9uTG9hZDogZnVuY3Rpb24oZSl7CisJCQkvLyBzdW1tYXJ5OiBoYW5kbGVyIGFmdGVyIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nCisJCQl0aGlzLmlzTG9hZGVkID0gdHJ1ZTsKKwkJCWlmICh0aGlzLm9iamVjdCl7CisJCQkJdGhpcy5kb2N1bWVudCA9IHRoaXMub2JqZWN0LkRPTTsKKwkJCQl0aGlzLndpbmRvdyA9IHRoaXMuZG9jdW1lbnQucGFyZW50V2luZG93OworCQkJCXRoaXMuZWRpdE5vZGUgPSB0aGlzLmRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZDsKKwkJCQl0aGlzLmVkaXRpbmdBcmVhLnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQgOiB0aGlzLm1pbkhlaWdodDsKKwkJCQlpZighdGhpcy5oZWlnaHQpeworCQkJCQl0aGlzLmNvbm5lY3QodGhpcywgIm9uRGlzcGxheUNoYW5nZWQiLCAiX3VwZGF0ZUhlaWdodCIpOworCQkJCX0KKwkJCQkvL3ByZXRlbmQgdGhlIG9iamVjdCBhcyBhbiBpZnJhbWUsIHNvIHRoYXQgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlCisJCQkJLy9lZGl0b3IgY2FuIGJlIHBsYWNlZCBjb3JyZWN0bHkgd2hlbiBzaG93bgorCQkJCXRoaXMud2luZG93Ll9mcmFtZUVsZW1lbnQgPSB0aGlzLm9iamVjdDsKKwkJCX1lbHNlIGlmICh0aGlzLmlmcmFtZSAmJiAhZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJdGhpcy5lZGl0Tm9kZSA9IHRoaXMuZG9jdW1lbnQuYm9keTsKKwkJCQlpZighdGhpcy5oZWlnaHQpeworCQkJCQl0aGlzLmNvbm5lY3QodGhpcywgIm9uRGlzcGxheUNoYW5nZWQiLCAiX3VwZGF0ZUhlaWdodCIpOworCQkJCX0KKworCQkJCXRyeSB7IC8vIHNhbml0eSBjaGVjayBmb3IgTW96aWxsYQorCQkJCQl0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKCJ1c2VDU1MiLCBmYWxzZSwgdHJ1ZSk7IC8vIG9sZCBtb3ogY2FsbAorCQkJCQl0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKCJzdHlsZVdpdGhDU1MiLCBmYWxzZSwgZmFsc2UpOyAvLyBuZXcgbW96IGNhbGwKKwkJCQkJLy90aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKCJpbnNlcnRCck9uUmV0dXJuIiwgZmFsc2UsIGZhbHNlKTsgLy8gbmV3IG1veiBjYWxsCisJCQkJfWNhdGNoKGUyKXsgfQorCisJCQkJaWYgKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKSB7CisJCQkJCS8qCisJCQkJCXRoaXMuaWZyYW1lLnN0eWxlLnZpc2libGl0eSA9ICJ2aXNpYmxlIjsKKwkJCQkJdGhpcy5pZnJhbWUuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayI7CisJCQkJCXRoaXMuZWRpdE5vZGUuc3R5bGUudmlzaWJsaXR5ID0gInZpc2libGUiOworCQkJCQl0aGlzLmVkaXROb2RlLnN0eWxlLmJvcmRlciA9ICIxcHggc29saWQgYmxhY2siOworCQkJCQkqLworCQkJCQkvLyB0aGlzLm9uRGlzcGxheUNoYW5nZWQoKTsKKwkJCQkJdGhpcy5jb25uZWN0KHRoaXMuZWRpdE5vZGUsICJvbmJsdXIiLCAib25CbHVyIik7CisJCQkJCXRoaXMuY29ubmVjdCh0aGlzLmVkaXROb2RlLCAib25mb2N1cyIsICJvbkZvY3VzIik7CisJCQkJCXRoaXMuY29ubmVjdCh0aGlzLmVkaXROb2RlLCAib25jbGljayIsICJvbkZvY3VzIik7CisKKwkJCQkJdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25EaXNwbGF5Q2hhbmdlZCIpLCA3NTApOworCQkJCQkvLyBkb2pvLnJhaXNlKCJvbmxvYWQiKTsKKwkJCQkJLy8gZG9qby5kZWJ1Zyh0aGlzLmVkaXROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKTsKKwkJCQl9IGVsc2UgaWYgKGRvam8ucmVuZGVyLmh0bWwubW96aWxsYSB8fCBkb2pvLnJlbmRlci5odG1sLm9wZXJhKSB7CisJCQkJCXZhciBkb2MgPSB0aGlzLmRvY3VtZW50OworCQkJCQl2YXIgYWRkTGlzdGVuZXIgPSBkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXI7CisJCQkJCXZhciBzZWxmID0gdGhpczsKKwkJCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5ldmVudHMsIGZ1bmN0aW9uKGUpeworCQkJCQkJdmFyIGwgPSBhZGRMaXN0ZW5lcihzZWxmLmRvY3VtZW50LCBlLnN1YnN0cigyKS50b0xvd2VyQ2FzZSgpLCBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgZSkpOworCQkJCQkJaWYoZT09Im9uQmx1ciIpeworCQkJCQkJCS8vIFdlIG5lZWQgdG8gdW5ob29rIHRoZSBibHVyIGV2ZW50IGxpc3RlbmVyIG9uIGNsb3NlIGFzIHdlCisJCQkJCQkJLy8gY2FuIGVuY291bnRlciBhIGdhcnVudGVlZCBjcmFzaCBpbiBGRiBpZiBhbm90aGVyIGV2ZW50IGlzCisJCQkJCQkJLy8gYWxzbyBmaXJlZAorCQkJCQkJCXZhciB1bkJsdXIgPSB7IHVuQmx1cjogZnVuY3Rpb24oZSl7CisJCQkJCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIucmVtb3ZlTGlzdGVuZXIoZG9jLCAiYmx1ciIsIGwpOworCQkJCQkJCX0gfTsKKwkJCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3QoImJlZm9yZSIsIHNlbGYsICJjbG9zZSIsIHVuQmx1ciwgInVuQmx1ciIpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQkJLy8gRklYTUU6IHdoZW4gc2Nyb2xsYmFycyBhcHBlYXIvZGlzYXBwZWFyIHRoaXMgbmVlZHMgdG8gYmUgZmlyZWQKKwkJCX1lbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCS8vIElFIGNvbnRlbnRFZGl0YWJsZQorCQkJCWlmKCF0aGlzLmhlaWdodCl7CisJCQkJCXRoaXMuY29ubmVjdCh0aGlzLCAib25EaXNwbGF5Q2hhbmdlZCIsICJfdXBkYXRlSGVpZ2h0Iik7CisJCQkJfQorCQkJCXRoaXMuZWRpdE5vZGUuc3R5bGUuem9vbSA9IDEuMDsKKwkJCX0KKworCQkJdGhpcy5fYXBwbHlFZGl0aW5nQXJlYVN0eWxlU2hlZXRzKCk7CisKKwkJCWlmKHRoaXMuZm9jdXNPbkxvYWQpeworCQkJCXRoaXMuZm9jdXMoKTsKKwkJCX0KKwkJCXRoaXMub25EaXNwbGF5Q2hhbmdlZChlKTsKKwkJCWlmKHRoaXMub25Mb2FkRGVmZXJyZWQpeworCQkJCXRoaXMub25Mb2FkRGVmZXJyZWQuY2FsbGJhY2sodHJ1ZSk7CisJCQl9CisJCX0sCisKKwkJb25LZXlEb3duOiBmdW5jdGlvbihlKXsKKwkJCS8vIHN1bW1hcnk6IEZpcmVkIG9uIGtleWRvd24KKwkJCWlmKCghZSkmJih0aGlzLm9iamVjdCkpeworCQkJCWUgPSBkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQodGhpcy53aW5kb3cuZXZlbnQpOworCQkJfQorCQkJLy8gZG9qby5kZWJ1Zygib25rZXlkb3duOiIsIGUua2V5Q29kZSk7CisJCQkvLyB3ZSBuZWVkIHRoaXMgZXZlbnQgYXQgdGhlIG1vbWVudCB0byBnZXQgdGhlIGV2ZW50cyBmcm9tIGNvbnRyb2wga2V5cworCQkJLy8gc3VjaCBhcyB0aGUgYmFja3NwYWNlLiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBhZGQgdGhpcyB0byBEb2pvLCBzbyB0aGF0CisJCQkvLyBrZXlQcmVzcyBldmVudHMgY2FuIGJlIGVtdWxhdGVkIGJ5IHRoZSBrZXlEb3duIGFuZCBrZXlVcCBkZXRlY3Rpb24uCisJCQlpZigoZG9qby5yZW5kZXIuaHRtbC5pZSkmJihlLmtleUNvZGUgPT0gZS5LRVlfVEFCKSl7CisJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJLy8gRklYTUU6IHRoaXMgaXMgYSBwb29yLW1hbidzIGluZGVudC9vdXRkZW50LiBJdCB3b3VsZCBiZQorCQkJCS8vIGJldHRlciBpZiBpdCBhZGRlZCA0ICImbmJzcDsiIGNoYXJzIGluIGFuIHVuZG9hYmxlIHdheS4KKwkJCQkvLyBVbmZvcnR1YW50bHkgcGFzdGVIVE1MIGRvZXMgbm90IHByb3ZlIHRvIGJlIHVuZG9hYmxlCisJCQkJdGhpcy5leGVjQ29tbWFuZCgoZS5zaGlmdEtleSA/ICJvdXRkZW50IiA6ICJpbmRlbnQiKSk7CisJCQl9ZWxzZSBpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQlpZigoNjUgPD0gZS5rZXlDb2RlKSYmKGUua2V5Q29kZSA8PSA5MCkpeworCQkJCQllLmNoYXJDb2RlID0gZS5rZXlDb2RlOworCQkJCQl0aGlzLm9uS2V5UHJlc3MoZSk7CisJCQkJfQorCQkJCS8vIGRvam8uZGVidWcoZS5jdHJsS2V5KTsKKwkJCQkvLyBkb2pvLmRlYnVnKGUua2V5Q29kZSk7CisJCQkJLy8gZG9qby5kZWJ1ZyhlLmNoYXJDb2RlKTsKKwkJCQkvLyB0aGlzLm9uS2V5UHJlc3MoZSk7CisJCQl9CisJCX0sCisKKwkJb25LZXlVcDogZnVuY3Rpb24oZSl7CisJCQkvLyBzdW1tYXJ5OiBGaXJlZCBvbiBrZXl1cAorCQkJcmV0dXJuOworCQl9LAorCisJCUtFWV9DVFJMOiAxLAorCisJCW9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpeworCQkJLy8gc3VtbWFyeTogRmlyZWQgb24ga2V5cHJlc3MKKwkJCWlmKCghZSkmJih0aGlzLm9iamVjdCkpeworCQkJCWUgPSBkb2pvLmV2ZW50LmJyb3dzZXIuZml4RXZlbnQodGhpcy53aW5kb3cuZXZlbnQpOworCQkJfQorCQkJLy8gaGFuZGxlIHRoZSB2YXJpb3VzIGtleSBldmVudHMKKworCQkJdmFyIG1vZGlmaWVycyA9IGUuY3RybEtleSA/IHRoaXMuS0VZX0NUUkwgOiAwOworCisJCQlpZiAodGhpcy5fa2V5SGFuZGxlcnNbZS5rZXldKSB7CisJCQkJLy8gZG9qby5kZWJ1ZygiY2hhcjoiLCBlLmtleSk7CisJCQkJdmFyIGhhbmRsZXJzID0gdGhpcy5fa2V5SGFuZGxlcnNbZS5rZXldLCBpID0gMCwgaGFuZGxlcjsKKwkJCQl3aGlsZSAoaGFuZGxlciA9IGhhbmRsZXJzW2krK10pIHsKKwkJCQkJaWYgKG1vZGlmaWVycyA9PSBoYW5kbGVyLm1vZGlmaWVycykgeworCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJaGFuZGxlci5oYW5kbGVyLmNhbGwodGhpcyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gZnVuY3Rpb24gY2FsbCBhZnRlciB0aGUgY2hhcmFjdGVyIGhhcyBiZWVuIGluc2VydGVkCisJCQlkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCB0aGlzLm9uS2V5UHJlc3NlZCwgMSwgZSk7CisJCX0sCisKKwkJYWRkS2V5SGFuZGxlcjogZnVuY3Rpb24gKC8qU3RyaW5nKi9rZXksIC8qSW50Ki9tb2RpZmllcnMsIC8qRnVuY3Rpb24qL2hhbmRsZXIpIHsKKwkJCS8vIHN1bW1hcnk6IGFkZCBhIGhhbmRsZXIgZm9yIGEga2V5Ym9hcmQgc2hvcnRjdXQKKwkJCWlmICghKHRoaXMuX2tleUhhbmRsZXJzW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHsgdGhpcy5fa2V5SGFuZGxlcnNba2V5XSA9IFtdOyB9CisJCQl0aGlzLl9rZXlIYW5kbGVyc1trZXldLnB1c2goeworCQkJCW1vZGlmaWVyczogbW9kaWZpZXJzIHx8IDAsCisJCQkJaGFuZGxlcjogaGFuZGxlcgorCQkJfSk7CisJCX0sCisKKwkJb25LZXlQcmVzc2VkOiBmdW5jdGlvbiAoZSkgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlGaXJlZCBhZnRlciBhIGtleXByZXNzIGV2ZW50IGhhcyBvY2N1cmVkIGFuZCBpdCdzIGFjdGlvbiB0YWtlbi4gVGhpcworCQkgCS8vCQlpcyB1c2VmdWwgaWYgYWN0aW9uIG5lZWRzIHRvIGJlIHRha2VuIGFmdGVyIHRleHQgb3BlcmF0aW9ucyBoYXZlIGZpbmlzaGVkCisKKwkJCS8vIE1vemlsbGEgYWRkcyBhIHNpbmdsZSA8cD4gd2l0aCBhbiBlbWJlZGRlZCA8YnI+IHdoZW4geW91IGhpdCBlbnRlciBvbmNlOgorCQkJLy8gICA8cD48YnI+XG48L3A+CisJCQkvLyB3aGVuIHlvdSBoaXQgZW50ZXIgYWdhaW4gaXQgYWRkcyBhbm90aGVyIDxicj4gaW5zaWRlIHlvdXIgZW50ZXIKKwkJCS8vICAgPHA+PGJyPlxuPGJyPlxuPC9wPgorCQkJLy8gYW5kIGlmIHlvdSBoaXQgZW50ZXIgYWdhaW4gaXQgc3BsaXRzIHRoZSA8YnI+cyBvdmVyIDIgPHA+cworCQkJLy8gICA8cD48YnI+XG48L3A+XG48cD48YnI+XG48L3A+CisJCQkvLyBub3cgdGhpcyBhc3N1bWVzIHRoYXQgPHA+cyBoYXZlIGRvdWJsZSB0aGUgbGluZS1oZWlnaHQgb2YgPGJyPnMgdG8gd29yaworCQkJLy8gYW5kIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSA8cD5zIHRvIGVuc3VyZSB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvcgorCQkJLy8gY2hhbmdlcyBmcm9tIHRoZSB1c2VycyBwZXJzcGVjdGl2ZSB3aGVuIHRoZXkgaGl0IGVudGVyLCBhcyB0aGUgc2Vjb25kIHR3bworCQkJLy8gaHRtbCBzbmlwcGV0cyByZW5kZXIgdGhlIHNhbWUgd2hlbiBtYXJnaW5zIGFyZSBzZXQgdG8gMC4KKworCQkJLy8gVE9ETzogZG9lc24ndCByZWFsbHkgd29yazsgaXMgdGhpcyByZWFsbHkgbmVlZGVkPworCQkJLy9pZiAoZG9qby5yZW5kZXIuaHRtbC5tb3opIHsKKwkJCS8vCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicCIpLmxlbmd0aDsgaSsrKSB7CisJCQkvLwkJdmFyIHAgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwIilbaV07CisJCQkvLwkJaWYgKHAuaW5uZXJIVE1MLm1hdGNoKC9ePGJyPlxzJC9tKSkgeworCQkJLy8JCQl3aGlsZSAocC5oYXNDaGlsZE5vZGVzKCkpIHsgcC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwLmZpcnN0Q2hpbGQsIHApOyB9CisJCQkvLwkJCXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKTsKKwkJCS8vCQl9CisJCQkvLwl9CisJCQkvL30KKwkJCXRoaXMub25EaXNwbGF5Q2hhbmdlZCgvKmUqLyk7IC8vIGNhbid0IHBhc3MgaW4gZQorCQl9LAorCisJCW9uQ2xpY2s6IGZ1bmN0aW9uKGUpeyB0aGlzLm9uRGlzcGxheUNoYW5nZWQoZSk7IH0sCisJCW9uQmx1cjogZnVuY3Rpb24oZSl7IH0sCisJCV9pbml0aWFsRm9jdXM6IHRydWUsCisJCW9uRm9jdXM6IGZ1bmN0aW9uKGUpeworCQkJLy8gc3VtbWFyeTogRmlyZWQgb24gZm9jdXMKKwkJCWlmKCAoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKSYmKHRoaXMuX2luaXRpYWxGb2N1cykgKXsKKwkJCQl0aGlzLl9pbml0aWFsRm9jdXMgPSBmYWxzZTsKKwkJCQlpZihkb2pvLnN0cmluZy50cmltKHRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MKSA9PSAiJm5ic3A7Iil7CisJCQkJCXRoaXMucGxhY2VDdXJzb3JBdFN0YXJ0KCk7CisvLwkJCQkJdGhpcy5leGVjQ29tbWFuZCgic2VsZWN0YWxsIik7CisvLwkJCQkJdGhpcy53aW5kb3cuZ2V0U2VsZWN0aW9uKCkuY29sbGFwc2VUb1N0YXJ0KCk7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCS8vIEZJWE1FOiBhdHRlbXB0ZWQgKGJ1dCB1bHRpbWF0ZWx5IHVud29ya2FibGUpIHNvbHV0aW9uIGZvciAjMjA2NgorCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkpeworCQkJCXZhciBzZWwgPSB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKwkJCQlkb2pvLmRlYnVnKGRvam8uZG9tLmlzRGVzY2VuZGFudE9mKHNlbC5mb2N1c05vZGUsIHRoaXMuZG9jdW1lbnQuYm9keSkpOworCisJCQkJdmFyIGlzTGFzdE5vZGUgPSAoc2VsLmZvY3VzTm9kZSA9PSB0aGlzLmRvY3VtZW50LmJvZHkubGFzdENoaWxkKTsKKwkJCQlpZighaXNMYXN0Tm9kZSl7IHJldHVybjsgfQorCQkJCXZhciBpc1RleHQgPSAoc2VsLmZvY3VzTm9kZS5ub2RlVHlwZSA9PSAzKTsgCisJCQkJaWYoIWlzVGV4dCl7IHJldHVybjsgfQorCQkJCXZhciBpc0xhc3RDaGFyID0gKHNlbC5mb2N1c09mZnNldCA9PSBzZWwuZm9jdXNOb2RlLm5vZGVWYWx1ZS5sZW5ndGgpOworCQkJCWlmKCFpc0xhc3RDaGFyKXsgcmV0dXJuOyB9CisJCQkJZG9qby5kZWJ1ZyhzZWwuZm9jdXNPZmZzZXQsIHNlbC5mb2N1c05vZGUubm9kZVZhbHVlLmxlbmd0aCk7CisJCQkJaWYoaXNMYXN0Tm9kZSAmJiBpc1RleHQgJiYgaXNMYXN0Q2hhcil7CisJCQkJCXRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgIikpOworCQkJCQl0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTsKKwkJCQkJdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpKTsKKwkJCQkJdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpKTsKKwkJCQkJc2VsLmNvbGxhcHNlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldC0xKTsKKwkJCQkJc2VsLmNvbGxhcHNlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCsxKTsKKwkJCQl9CisJCQl9CisJCQkqLworCQl9LAorCisJCWJsdXI6IGZ1bmN0aW9uICgpIHsKKwkJCS8vIHN1bW1hcnk6IHJlbW92ZSBmb2N1cyBmcm9tIHRoaXMgaW5zdGFuY2UKKwkJCWlmKHRoaXMuaWZyYW1lKSB7IHRoaXMud2luZG93LmJsdXIoKTsgfQorCQkJZWxzZSBpZih0aGlzLm9iamVjdCkgeyB0aGlzLmRvY3VtZW50LmJvZHkuYmx1cigpOyB9CisJCQllbHNlIGlmKHRoaXMuZWRpdE5vZGUpIHsgdGhpcy5lZGl0Tm9kZS5ibHVyKCk7IH0KKwkJfSwKKworCQlmb2N1czogZnVuY3Rpb24gKCkgeworCQkJLy8gc3VtbWFyeTogbW92ZSBmb2N1cyB0byB0aGlzIGluc3RhbmNlCisJCQlpZih0aGlzLmlmcmFtZSAmJiAhZG9qby5yZW5kZXIuaHRtbC5pZSkgeyB0aGlzLndpbmRvdy5mb2N1cygpOyB9CisJCQllbHNlIGlmKHRoaXMub2JqZWN0KSB7IHRoaXMuZG9jdW1lbnQuZm9jdXMoKTsgfQorCQkJLy8gZWRpdE5vZGUgbWF5IGJlIGhpZGRlbiBpbiBkaXNwbGF5Om5vbmUgZGl2LCBsZXRzIGp1c3QgcHVudCBpbiB0aGlzIGNhc2UKKwkJCWVsc2UgaWYodGhpcy5lZGl0Tm9kZSAmJiB0aGlzLmVkaXROb2RlLmZvY3VzKSB7IHRoaXMuZWRpdE5vZGUuZm9jdXMoKTsgfQorCQkJZWxzZXsKKwkJCQlkb2pvLmRlYnVnKCJIYXZlIG5vIGlkZWEgaG93IHRvIGZvY3VzIGludG8gdGhlIGVkaXRvciEiKTsKKwkJCX0KKwkJfSwKKworCQkvKiogdGhpcyBldmVudCB3aWxsIGJlIGZpcmVkIGV2ZXJ5dGltZSB0aGUgZGlzcGxheSBjb250ZXh0IGNoYW5nZXMgYW5kIHRoZQorCQkgcmVzdWx0IG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgVUkgKi8KKwkJb25EaXNwbGF5Q2hhbmdlZDogZnVuY3Rpb24gKGUpeyB9LAorCisKKwkvKiBGb3JtYXR0aW5nIGNvbW1hbmRzCisJICoqKioqKioqKioqKioqKioqKioqKiovCisKKwkJLy8gT2JqZWN0OiBJRSdzIEFjdGl2ZSBYIGNvZGVzOiBzZWUgaHR0cDovL3d3dy5jb21wdXRlcmJ5dGVzbWFuLmNvbS9qcy9hY3RpdmV4L2RodG1sZWRpdC5odG0KKwkJX2FjdGl2ZVg6IHsKKwkJCWNvbW1hbmQ6IHsKKwkJCQlib2xkOiA1MDAwLAorCQkJCWl0YWxpYzogNTAyMywKKwkJCQl1bmRlcmxpbmU6IDUwNDgsCisKKwkJCQlqdXN0aWZ5Y2VudGVyOiA1MDI0LAorCQkJCWp1c3RpZnlsZWZ0OiA1MDI1LAorCQkJCWp1c3RpZnlyaWdodDogNTAyNiwKKworCQkJCWN1dDogNTAwMywKKwkJCQljb3B5OiA1MDAyLAorCQkJCXBhc3RlOiA1MDMyLAorCQkJCSJkZWxldGUiOiA1MDA0LAorCisJCQkJdW5kbzogNTA0OSwKKwkJCQlyZWRvOiA1MDMzLAorCisJCQkJcmVtb3ZlZm9ybWF0OiA1MDM0LAorCQkJCXNlbGVjdGFsbDogNTAzNSwKKwkJCQl1bmxpbms6IDUwNTAsCisKKwkJCQlpbmRlbnQ6IDUwMTgsCisJCQkJb3V0ZGVudDogNTAzMSwKKworCQkJCWluc2VydG9yZGVyZWRsaXN0OiA1MDMwLAorCQkJCWluc2VydHVub3JkZXJlZGxpc3Q6IDUwNTEsCisKKwkJCQkvLyB0YWJsZSBjb21tYW5kcworCQkJCWluc2VydHRhYmxlOiA1MDIyLAorCQkJCWluc2VydGNlbGw6IDUwMTksCisJCQkJaW5zZXJ0Y29sOiA1MDIwLAorCQkJCWluc2VydHJvdzogNTAyMSwKKwkJCQlkZWxldGVjZWxsczogNTAwNSwKKwkJCQlkZWxldGVjb2xzOiA1MDA2LAorCQkJCWRlbGV0ZXJvd3M6IDUwMDcsCisJCQkJbWVyZ2VjZWxsczogNTAyOSwKKwkJCQlzcGxpdGNlbGw6IDUwNDcsCisKKwkJCQkvLyB0aGUgY29tbWFuZCBuZWVkIG1hcHBpbmcsIHRoZXkgZG9uJ3QgdHJhbnNsYXRlIGRpcmVjdGx5CisJCQkJLy8gdG8gdGhlIGNvbnRlbnRFZGl0YWJsZSBjb21tYW5kcworCQkJCXNldGJsb2NrZm9ybWF0OiA1MDQzLAorCQkJCWdldGJsb2NrZm9ybWF0OiA1MDExLAorCQkJCWdldGJsb2NrZm9ybWF0bmFtZXM6IDUwMTIsCisJCQkJc2V0Zm9udG5hbWU6IDUwNDQsCisJCQkJZ2V0Zm9udG5hbWU6IDUwMTMsCisJCQkJc2V0Zm9udHNpemU6IDUwNDUsCisJCQkJZ2V0Zm9udHNpemU6IDUwMTQsCisJCQkJc2V0YmFja2NvbG9yOiA1MDQyLAorCQkJCWdldGJhY2tjb2xvcjogNTAxMCwKKwkJCQlzZXRmb3JlY29sb3I6IDUwNDYsCisJCQkJZ2V0Zm9yZWNvbG9yOiA1MDE1LAorCisJCQkJZmluZHRleHQ6IDUwMDgsCisJCQkJZm9udDogNTAwOSwKKwkJCQloeXBlcmxpbms6IDUwMTYsCisJCQkJaW1hZ2U6IDUwMTcsCisKKwkJCQlsb2NrZWxlbWVudDogNTAyNywKKwkJCQltYWtlYWJzb2x1dGU6IDUwMjgsCisJCQkJc2VuZGJhY2t3YXJkOiA1MDM2LAorCQkJCWJyaW5nZm9yd2FyZDogNTAzNywKKwkJCQlzZW5kYmVsb3d0ZXh0OiA1MDM4LAorCQkJCWJyaW5nYWJvdmV0ZXh0OiA1MDM5LAorCQkJCXNlbmR0b2JhY2s6IDUwNDAsCisJCQkJYnJpbmd0b2Zyb250OiA1MDQxLAorCisJCQkJcHJvcGVydGllczogNTA1MgorCQkJfSwKKworCQkJdWk6IHsKKwkJCQkiZGVmYXVsdCI6IDAsCisJCQkJcHJvbXB0OiAxLAorCQkJCW5vcHJvbXB0OiAyCisJCQl9LAorCisJCQlzdGF0dXM6IHsKKwkJCQlub3RzdXBwb3J0ZWQ6IDAsCisJCQkJZGlzYWJsZWQ6IDEsCisJCQkJZW5hYmxlZDogMywKKwkJCQlsYXRjaGVkOiA3LAorCQkJCW5pbmNoZWQ6IDExCisJCQl9LAorCisJCQlhcHBlYXJhbmNlOiB7CisJCQkJZmxhdDogMCwKKwkJCQlpbnNldDogMQorCQkJfSwKKworCQkJc3RhdGU6IHsKKwkJCQl1bmNoZWNrZWQ6IDAsCisJCQkJY2hlY2tlZDogMSwKKwkJCQlncmF5OiAyCisJCQl9CisJCX0sCisKKwkJX25vcm1hbGl6ZUNvbW1hbmQ6IGZ1bmN0aW9uICgvKlN0cmluZyovY21kKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJVXNlZCBhcyB0aGUgYWR2aWNlIGZ1bmN0aW9uIGJ5IGRvam8uZXZlbnQuY29ubmVjdCB0byBtYXAgb3VyCisJCSAJLy8JCW5vcm1hbGl6ZWQgc2V0IG9mIGNvbW1hbmRzIHRvIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0CisJCSAJLy8JCWJyb3dzZXIKKwkJCXZhciBkcmggPSBkb2pvLnJlbmRlci5odG1sOworCisJCQl2YXIgY29tbWFuZCA9IGNtZC50b0xvd2VyQ2FzZSgpOworCQkJaWYoY29tbWFuZCA9PSAiZm9ybWF0YmxvY2siKXsKKwkJCQlpZihkcmguc2FmYXJpKXsgY29tbWFuZCA9ICJoZWFkaW5nIjsgfQorCQkJfWVsc2UgaWYodGhpcy5vYmplY3QpeworCQkJCXN3aXRjaChjb21tYW5kKXsKKwkJCQkJY2FzZSAiY3JlYXRlbGluayI6CisJCQkJCQljb21tYW5kID0gImh5cGVybGluayI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAiaW5zZXJ0aW1hZ2UiOgorCQkJCQkJY29tbWFuZCA9ICJpbWFnZSI7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9ZWxzZSBpZihjb21tYW5kID09ICJoaWxpdGVjb2xvciIgJiYgIWRyaC5tb3ppbGxhKXsKKwkJCQljb21tYW5kID0gImJhY2tjb2xvciI7CisJCQl9CisKKwkJCXJldHVybiBjb21tYW5kOworCQl9LAorCisJCV9zYWZhcmlJc0xlb3BhcmQ6IGZ1bmN0aW9uKCl7CisJCQl2YXIgZ3Q0MjAgPSBmYWxzZTsKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuc2FmYXJpKXsKKwkJCQl2YXIgdG1wID0gZG9qby5yZW5kZXIuaHRtbC5VQS5zcGxpdCgiQXBwbGVXZWJLaXQvIilbMV07CisJCQkJdmFyIHZlciA9IHBhcnNlRmxvYXQodG1wLnNwbGl0KCIgIilbMF0pOworCQkJCWlmKHZlciA+PSA0MjApeyBndDQyMCA9IHRydWU7IH0KKwkJCX0KKwkJCXJldHVybiBndDQyMDsKKwkJfSwKKworCQlxdWVyeUNvbW1hbmRBdmFpbGFibGU6IGZ1bmN0aW9uICgvKlN0cmluZyovY29tbWFuZCkgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlUZXN0cyB3aGV0aGVyIGEgY29tbWFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QuIENsaWVudHMgU0hPVUxEIGNoZWNrCisJCQkvLwkJd2hldGhlciBhIGNvbW1hbmQgaXMgc3VwcG9ydGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVzZSBpdCwgYmVoYXZpb3VyCisJCQkvLwkJZm9yIHVuc3VwcG9ydGVkIGNvbW1hbmRzIGlzIHVuZGVmaW5lZC4KKwkJCS8vIGNvbW1hbmQ6IFRoZSBjb21tYW5kIHRvIHRlc3QgZm9yCisJCQl2YXIgaWUgPSAxOworCQkJdmFyIG1vemlsbGEgPSAxIDw8IDE7CisJCQl2YXIgc2FmYXJpID0gMSA8PCAyOworCQkJdmFyIG9wZXJhID0gMSA8PCAzOworCQkJdmFyIHNhZmFyaTQyMCA9IDEgPDwgNDsKKworCQkJdmFyIGd0NDIwID0gdGhpcy5fc2FmYXJpSXNMZW9wYXJkKCk7CisKKwkJCWZ1bmN0aW9uIGlzU3VwcG9ydGVkQnkgKGJyb3dzZXJzKSB7CisJCQkJcmV0dXJuIHsKKwkJCQkJaWU6IEJvb2xlYW4oYnJvd3NlcnMgJiBpZSksCisJCQkJCW1vemlsbGE6IEJvb2xlYW4oYnJvd3NlcnMgJiBtb3ppbGxhKSwKKwkJCQkJc2FmYXJpOiBCb29sZWFuKGJyb3dzZXJzICYgc2FmYXJpKSwKKwkJCQkJc2FmYXJpNDIwOiBCb29sZWFuKGJyb3dzZXJzICYgc2FmYXJpNDIwKSwKKwkJCQkJb3BlcmE6IEJvb2xlYW4oYnJvd3NlcnMgJiBvcGVyYSkKKwkJCQl9CisJCQl9CisKKwkJCXZhciBzdXBwb3J0ZWRCeSA9IG51bGw7CisKKwkJCXN3aXRjaCAoY29tbWFuZC50b0xvd2VyQ2FzZSgpKSB7CisJCQkJY2FzZSAiYm9sZCI6IGNhc2UgIml0YWxpYyI6IGNhc2UgInVuZGVybGluZSI6CisJCQkJY2FzZSAic3Vic2NyaXB0IjogY2FzZSAic3VwZXJzY3JpcHQiOgorCQkJCWNhc2UgImZvbnRuYW1lIjogY2FzZSAiZm9udHNpemUiOgorCQkJCWNhc2UgImZvcmVjb2xvciI6IGNhc2UgImhpbGl0ZWNvbG9yIjoKKwkJCQljYXNlICJqdXN0aWZ5Y2VudGVyIjogY2FzZSAianVzdGlmeWZ1bGwiOiBjYXNlICJqdXN0aWZ5bGVmdCI6CisJCQkJY2FzZSAianVzdGlmeXJpZ2h0IjogY2FzZSAiZGVsZXRlIjogY2FzZSAic2VsZWN0YWxsIjoKKwkJCQkJc3VwcG9ydGVkQnkgPSBpc1N1cHBvcnRlZEJ5KG1vemlsbGEgfCBpZSB8IHNhZmFyaSB8IG9wZXJhKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICJjcmVhdGVsaW5rIjogY2FzZSAidW5saW5rIjogY2FzZSAicmVtb3ZlZm9ybWF0IjoKKwkJCQljYXNlICJpbnNlcnRob3Jpem9udGFscnVsZSI6IGNhc2UgImluc2VydGltYWdlIjoKKwkJCQljYXNlICJpbnNlcnRvcmRlcmVkbGlzdCI6IGNhc2UgImluc2VydHVub3JkZXJlZGxpc3QiOgorCQkJCWNhc2UgImluZGVudCI6IGNhc2UgIm91dGRlbnQiOiBjYXNlICJmb3JtYXRibG9jayI6CisJCQkJY2FzZSAiaW5zZXJ0aHRtbCI6IGNhc2UgInVuZG8iOiBjYXNlICJyZWRvIjogY2FzZSAic3RyaWtldGhyb3VnaCI6CisJCQkJCXN1cHBvcnRlZEJ5ID0gaXNTdXBwb3J0ZWRCeShtb3ppbGxhIHwgaWUgfCBvcGVyYSB8IHNhZmFyaTQyMCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAiYmxvY2tkaXJsdHIiOiBjYXNlICJibG9ja2RpcnJ0bCI6CisJCQkJY2FzZSAiZGlybHRyIjogY2FzZSAiZGlycnRsIjoKKwkJCQljYXNlICJpbmxpbmVkaXJsdHIiOiBjYXNlICJpbmxpbmVkaXJydGwiOgorCQkJCQlzdXBwb3J0ZWRCeSA9IGlzU3VwcG9ydGVkQnkoaWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlICJjdXQiOiBjYXNlICJjb3B5IjogY2FzZSAicGFzdGUiOgorCQkJCQlzdXBwb3J0ZWRCeSA9IGlzU3VwcG9ydGVkQnkoIGllIHwgbW96aWxsYSB8IHNhZmFyaTQyMCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAiaW5zZXJ0dGFibGUiOgorCQkJCQlzdXBwb3J0ZWRCeSA9IGlzU3VwcG9ydGVkQnkobW96aWxsYSB8ICh0aGlzLm9iamVjdCA/IGllIDogMCkpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgImluc2VydGNlbGwiOiBjYXNlICJpbnNlcnRjb2wiOiBjYXNlICJpbnNlcnRyb3ciOgorCQkJCWNhc2UgImRlbGV0ZWNlbGxzIjogY2FzZSAiZGVsZXRlY29scyI6IGNhc2UgImRlbGV0ZXJvd3MiOgorCQkJCWNhc2UgIm1lcmdlY2VsbHMiOiBjYXNlICJzcGxpdGNlbGwiOgorCQkJCQlzdXBwb3J0ZWRCeSA9IGlzU3VwcG9ydGVkQnkodGhpcy5vYmplY3QgPyBpZSA6IDApOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuIChkb2pvLnJlbmRlci5odG1sLmllICYmIHN1cHBvcnRlZEJ5LmllKSB8fAorCQkJCShkb2pvLnJlbmRlci5odG1sLm1vemlsbGEgJiYgc3VwcG9ydGVkQnkubW96aWxsYSkgfHwKKwkJCQkoZG9qby5yZW5kZXIuaHRtbC5zYWZhcmkgJiYgc3VwcG9ydGVkQnkuc2FmYXJpKSB8fAorCQkJCShndDQyMCAmJiBzdXBwb3J0ZWRCeS5zYWZhcmk0MjApIHx8CisJCQkJKGRvam8ucmVuZGVyLmh0bWwub3BlcmEgJiYgc3VwcG9ydGVkQnkub3BlcmEpOyAgLy8gQm9vbGVhbiByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZQorCQl9LAorCisJCWV4ZWNDb21tYW5kOiBmdW5jdGlvbiAoLypTdHJpbmcqL2NvbW1hbmQsIGFyZ3VtZW50KXsKKwkJCS8vIHN1bW1hcnk6IEV4ZWN1dGVzIGEgY29tbWFuZCBpbiB0aGUgUmljaCBUZXh0IGFyZWEKKwkJCS8vIGNvbW1hbmQ6IFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKKwkJCS8vIGFyZ3VtZW50OiBBbiBvcHRpb25hbCBhcmd1bWVudCB0byB0aGUgY29tbWFuZAorCQkJdmFyIHJldHVyblZhbHVlOworCisJCQkvL2ZvY3VzKCkgaXMgcmVxdWlyZWQgZm9yIElFIChub25lLWFjdGl2ZVggbW9kZSkgdG8gd29yaworCQkJLy9JbiBhZGRpdGlvbiwgZm9jdXMoKSBtYWtlcyBzdXJlIGFmdGVyIHRoZSBleGVjdXRpb24gb2YKKwkJCS8vdGhlIGNvbW1hbmQsIHRoZSBlZGl0b3IgcmVjZWl2ZXMgdGhlIGZvY3VzIGFzIGV4cGVjdGVkCisJCQl0aGlzLmZvY3VzKCk7CisKKwkJCWNvbW1hbmQgPSB0aGlzLl9ub3JtYWxpemVDb21tYW5kKGNvbW1hbmQpOworCQkJaWYgKGFyZ3VtZW50ICE9IHVuZGVmaW5lZCkgeworCQkJCWlmKGNvbW1hbmQgPT0gImhlYWRpbmciKSB7IHRocm93IG5ldyBFcnJvcigidW5pbXBsZW1lbnRlZCIpOyB9CisJCQkJZWxzZSBpZihjb21tYW5kID09ICJmb3JtYXRibG9jayIpeworCQkJCQlpZih0aGlzLm9iamVjdCl7IC8vSUUgYWN0aXZlWCBtb2RlCisJCQkJCQlhcmd1bWVudCA9IHRoaXMuX25hdGl2ZTJMb2NhbEZvcm1hdE5hbWVzW2FyZ3VtZW50XTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeyBhcmd1bWVudCA9ICc8Jythcmd1bWVudCsnPic7IH0KKwkJCQl9CisJCQl9CisJCQlpZih0aGlzLm9iamVjdCl7CisJCQkJc3dpdGNoIChjb21tYW5kKSB7CisJCQkJCWNhc2UgImhpbGl0ZWNvbG9yIjoKKwkJCQkJCWNvbW1hbmQgPSAic2V0YmFja2NvbG9yIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICJmb3JlY29sb3IiOgorCQkJCQljYXNlICJiYWNrY29sb3IiOgorCQkJCQljYXNlICJmb250c2l6ZSI6CisJCQkJCWNhc2UgImZvbnRuYW1lIjoKKwkJCQkJCWNvbW1hbmQgPSAic2V0IiArIGNvbW1hbmQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAiZm9ybWF0YmxvY2siOgorCQkJCQkJY29tbWFuZCA9ICJzZXRibG9ja2Zvcm1hdCI7CisJCQkJfQorCisJCQkJaWYoY29tbWFuZCA9PSAic3RyaWtldGhyb3VnaCIpeworCQkJCQljb21tYW5kID0gImluc2VydGh0bWwiOworCQkJCQl2YXIgcmFuZ2UgPSB0aGlzLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworCQkJCQlpZighcmFuZ2UuaHRtbFRleHQpeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWFyZ3VtZW50PXJhbmdlLmh0bWxUZXh0LnN0cmlrZSgpOworCQkJCX1lbHNlIGlmKGNvbW1hbmQgPT0gImluc2VydGhvcml6b250YWxydWxlIil7CisJCQkJCWNvbW1hbmQgPSAiaW5zZXJ0aHRtbCI7CisJCQkJCWFyZ3VtZW50PSI8aHI+IjsKKwkJCQl9CisKKwkJCQlpZihjb21tYW5kID09ICJpbnNlcnRodG1sIil7CisJCQkJCXZhciByYW5nZSA9IHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQkJCWlmKHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLnR5cGUudG9VcHBlckNhc2UoKSA9PSAiQ09OVFJPTCIpeworCQkJCQkJLy9pZiBzZWxlY3Rpb24gaXMgY29udHJvbHJhbmdlLCBubyBwYXN0ZUhUTUwgaXMgYXZhaWxhYmxlLAorCQkJCQkJLy93ZSByZXBsYWNlIHRoZSBvdXRlckhUTUwgZGlyZWN0bHkKKwkJCQkJCWZvcih2YXIgaT0wO2k8cmFuZ2UubGVuZ3RoO2krKyl7CisJCQkJCQkJcmFuZ2UuaXRlbShpKS5vdXRlckhUTUwgPSBhcmd1bWVudDsKKwkJCQkJCX0KKwkJCQkJfWVsc2V7CisJCQkJCQkvLyBvbiBJRSwgd2UgY2FuIHVzZSB0aGUgcGFzdGVIVE1MIG1ldGhvZCBvZiB0aGUgdGV4dFJhbmdlIG9iamVjdAorCQkJCQkJLy8gdG8gZ2V0IGFuIHVuZG8tYWJsZSBpbm5lckhUTUwgbW9kaWZpY2F0aW9uCisJCQkJCQlyYW5nZS5wYXN0ZUhUTUwoYXJndW1lbnQpOworCQkJCQkJcmFuZ2Uuc2VsZWN0KCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuVmFsdWUgPSB0cnVlOworCQkJCX1lbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSl7CisJCQkJCXJldHVyblZhbHVlID0gdGhpcy5vYmplY3QuRXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdLAorCQkJCQkJdGhpcy5fYWN0aXZlWC51aS5ub3Byb21wdCk7CisJCQkJfWVsc2V7CisJCQkJCXJldHVyblZhbHVlID0gdGhpcy5vYmplY3QuRXhlY0NvbW1hbmQodGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdLAorCQkJCQkJdGhpcy5fYWN0aXZlWC51aS5ub3Byb21wdCwgYXJndW1lbnQpOworCQkJCX0KKwkJCX1lbHNlIGlmKGNvbW1hbmQgPT0gImluc2VydGh0bWwiKXsKKwkJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQkJLy9kb2pvLmRlYnVnKCJpbnNlcnRodG1sIGJyZWFrcyB0aGUgdW5kbyBzdGFjayB3aGVuIG5vdCB1c2luZyB0aGUgQWN0aXZlWCB2ZXJzaW9uIG9mIHRoZSBjb250cm9sISIpOworCQkJCQl2YXIgaW5zZXJ0UmFuZ2UgPSB0aGlzLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOworCQkJCQlpbnNlcnRSYW5nZS5wYXN0ZUhUTUwoYXJndW1lbnQpOworCQkJCQlpbnNlcnRSYW5nZS5zZWxlY3QoKTsKKwkJCQkJLy9pbnNlcnRSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfWVsc2V7CisJCQkJCXJldHVybiB0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBhcmd1bWVudCk7CisJCQkJfQorCQkJLyogKi8KKwkJCS8vIGZpeCB1cCB1bmxpbmsgaW4gTW96aWxsYSB0byB1bmxpbmsgdGhlIGxpbmsgYW5kIG5vdCBqdXN0IHRoZSBzZWxlY3Rpb24KKwkJCX1lbHNlIGlmKChjb21tYW5kID09ICJ1bmxpbmsiKSYmCisJCQkJKHRoaXMucXVlcnlDb21tYW5kRW5hYmxlZCgidW5saW5rIikpJiYKKwkJCQkoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKSl7CisJCQkJLy8gZ3JhYiBzZWxlY3Rpb24KKwkJCQkvLyBNb3ppbGxhIGdldHMgdXBzZXQgaWYgd2UganVzdCBzdG9yZSB0aGUgcmFuZ2Ugc28gd2UgaGF2ZSB0bworCQkJCS8vIGdldCB0aGUgYmFzaWMgcHJvcGVydGllcyBhbmQgcmVjcmVhdGUgdG8gc2F2ZSB0aGUgc2VsZWN0aW9uCisJCQkJdmFyIHNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpOworCQkJCXZhciBzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOworCQkJCXZhciBzZWxlY3Rpb25TdGFydENvbnRhaW5lciA9IHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyOworCQkJCXZhciBzZWxlY3Rpb25TdGFydE9mZnNldCA9IHNlbGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0OworCQkJCXZhciBzZWxlY3Rpb25FbmRDb250YWluZXIgPSBzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXI7CisJCQkJdmFyIHNlbGVjdGlvbkVuZE9mZnNldCA9IHNlbGVjdGlvblJhbmdlLmVuZE9mZnNldDsKKworCQkJCS8vIHNlbGVjdCBvdXIgbGluayBhbmQgdW5saW5rCisJCQkJdmFyIGEgPSBkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJnZXRBbmNlc3RvckVsZW1lbnQiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbJ2EnXSk7CisJCQkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAic2VsZWN0RWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFthXSk7CisKKwkJCQlyZXR1cm5WYWx1ZSA9IHRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInVubGluayIsIGZhbHNlLCBudWxsKTsKKworCQkJCS8vIHJlc3RvcmUgb3JpZ2luYWwgc2VsZWN0aW9uCisJCQkJdmFyIHNlbGVjdGlvblJhbmdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOworCQkJCXNlbGVjdGlvblJhbmdlLnNldFN0YXJ0KHNlbGVjdGlvblN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25TdGFydE9mZnNldCk7CisJCQkJc2VsZWN0aW9uUmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbkVuZENvbnRhaW5lciwgc2VsZWN0aW9uRW5kT2Zmc2V0KTsKKwkJCQlzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CisJCQkJc2VsZWN0aW9uLmFkZFJhbmdlKHNlbGVjdGlvblJhbmdlKTsKKworCQkJCXJldHVybiByZXR1cm5WYWx1ZTsKKwkJCX1lbHNlIGlmKChjb21tYW5kID09ICJoaWxpdGVjb2xvciIpJiYoZG9qby5yZW5kZXIuaHRtbC5tb3ppbGxhKSl7CisJCQkJLy8gbW96aWxsYSBkb2Vzbid0IHN1cHBvcnQgaGlsaXRlY29sb3IgcHJvcGVybHkgd2hlbiB1c2VDU1MgaXMKKwkJCQkvLyBzZXQgdG8gZmFsc2UgKGJ1Z3ppbGxhICMyNzkzMzApCisKKwkJCQl0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKCJ1c2VDU1MiLCBmYWxzZSwgZmFsc2UpOworCQkJCXJldHVyblZhbHVlID0gdGhpcy5kb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgYXJndW1lbnQpOworCQkJCXRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoInVzZUNTUyIsIGZhbHNlLCB0cnVlKTsKKworCQkJfWVsc2UgaWYoKGRvam8ucmVuZGVyLmh0bWwuaWUpJiYoIChjb21tYW5kID09ICJiYWNrY29sb3IiKXx8KGNvbW1hbmQgPT0gImZvcmVjb2xvciIpICkpeworCQkJCS8vIFRlc3RlZCB1bmRlciBJRSA2IFhQMiwgbm8gcHJvYmxlbSBoZXJlLCBjb21tZW50IG91dAorCQkJCS8vIElFIHdlaXJkbHkgY29sbGFwc2VzIHJhbmdlcyB3aGVuIHdlIGV4ZWMgdGhlc2UgY29tbWFuZHMsIHNvIHByZXZlbnQgaXQKKy8vCQkJCXZhciB0ciA9IHRoaXMuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQkJYXJndW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50IDogbnVsbDsKKwkJCQlyZXR1cm5WYWx1ZSA9IHRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIGFyZ3VtZW50KTsKKworCQkJCS8vIHRpbWVvdXQgaXMgd29ya2Fyb3VuZCBmb3Igd2VpcmQgSUUgYmVoYXZpb3Igd2VyZSB0aGUgdGV4dAorCQkJCS8vIHNlbGVjdGlvbiBnZXRzIGNvcnJlY3RseSByZS1jcmVhdGVkLCBidXQgc3Vic2VxdWVudCBpbnB1dAorCQkJCS8vIGFwcGFyZW50bHkgaXNuJ3QgYm91bmQgdG8gaXQKKy8vCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0ci5zZWxlY3QoKTt9LCAxKTsKKwkJCX1lbHNleworCQkJCS8vIGRvam8uZGVidWcoImNvbW1hbmQ6IiwgY29tbWFuZCwgImFyZzoiLCBhcmd1bWVudCk7CisKKwkJCQlhcmd1bWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnQgOiBudWxsOworLy8JCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5tb3opeworLy8JCQkJCXRoaXMuZG9jdW1lbnQgPSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50CisvLwkJCQl9CisKKwkJCQlpZihhcmd1bWVudCB8fCBjb21tYW5kIT0iY3JlYXRlbGluayIpIHsKKwkJCQkJcmV0dXJuVmFsdWUgPSB0aGlzLmRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBhcmd1bWVudCk7CisJCQkJfQorCQkJfQorCisJCQl0aGlzLm9uRGlzcGxheUNoYW5nZWQoKTsKKwkJCXJldHVybiByZXR1cm5WYWx1ZTsKKwkJfSwKKworCQlxdWVyeUNvbW1hbmRFbmFibGVkOiBmdW5jdGlvbigvKlN0cmluZyovY29tbWFuZCl7CisJCQkvLyBzdW1tYXJ5OiBjaGVjayB3aGV0aGVyIGEgY29tbWFuZCBpcyBlbmFibGVkIG9yIG5vdAorCQkJY29tbWFuZCA9IHRoaXMuX25vcm1hbGl6ZUNvbW1hbmQoY29tbWFuZCk7CisJCQlpZih0aGlzLm9iamVjdCl7CisJCQkJc3dpdGNoIChjb21tYW5kKSB7CisJCQkJCWNhc2UgImhpbGl0ZWNvbG9yIjoKKwkJCQkJCWNvbW1hbmQgPSAic2V0YmFja2NvbG9yIjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICJmb3JlY29sb3IiOgorCQkJCQljYXNlICJiYWNrY29sb3IiOgorCQkJCQljYXNlICJmb250c2l6ZSI6CisJCQkJCWNhc2UgImZvbnRuYW1lIjoKKwkJCQkJCWNvbW1hbmQgPSAic2V0IiArIGNvbW1hbmQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAiZm9ybWF0YmxvY2siOgorCQkJCQkJY29tbWFuZCA9ICJzZXRibG9ja2Zvcm1hdCI7CisJCQkJCQlicmVhazsKKwkJCQkJLy9iZWxvdyBhcmUgbm90IG5hdGl2ZWx5IHN1cHBvcnRlZCBjb21tYW5kcywgd2UgZmFrZSB0aGVtCisJCQkJCWNhc2UgInN0cmlrZXRocm91Z2giOgorCQkJCQkJY29tbWFuZCA9ICJib2xkIjsgLy93aGVuZXZlciBib2xkIGlzIGVuYWJsZWQsIHN0cmlrZXRocm91Z2ggc2hvdWxkIGJlIHNvIGFzIHdlbGwKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICJpbnNlcnRob3Jpem9udGFscnVsZSI6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisKKwkJCQlpZih0eXBlb2YgdGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdID09ICJ1bmRlZmluZWQiKXsgcmV0dXJuIGZhbHNlOyB9CisJCQkJdmFyIHN0YXR1cyA9IHRoaXMub2JqZWN0LlF1ZXJ5U3RhdHVzKHRoaXMuX2FjdGl2ZVguY29tbWFuZFtjb21tYW5kXSk7CisJCQkJcmV0dXJuICgoc3RhdHVzICE9IHRoaXMuX2FjdGl2ZVguc3RhdHVzLm5vdHN1cHBvcnRlZCkmJgorCQkJCQkoc3RhdHVzICE9IHRoaXMuX2FjdGl2ZVguc3RhdHVzLmRpc2FibGVkKSk7CisJCQl9ZWxzZXsKKwkJCQlpZihkb2pvLnJlbmRlci5odG1sLm1vemlsbGEpeworCQkJCQlpZihjb21tYW5kID09ICJ1bmxpbmsiKXsgLy8gbW96aWxsYSByZXR1cm5zIHRydWUgYWx3YXlzCisJCQkJCQlyZXR1cm4gZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiaGFzQW5jZXN0b3JFbGVtZW50IiwgZG9qby5odG1sLnNlbGVjdGlvbiwgWydhJ10pOworCQkJCQl9IGVsc2UgaWYgKGNvbW1hbmQgPT0gImluc2VydHRhYmxlIikgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyByZXR1cm4gdGhpcy5kb2N1bWVudC5xdWVyeUNvbW1hbmRFbmFibGVkKGNvbW1hbmQpOworCQkJCXZhciBlbGVtID0gKGRvam8ucmVuZGVyLmh0bWwuaWUpID8gdGhpcy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSA6IHRoaXMuZG9jdW1lbnQ7CisJCQkJcmV0dXJuIGVsZW0ucXVlcnlDb21tYW5kRW5hYmxlZChjb21tYW5kKTsKKwkJCX0KKwkJfSwKKworCQlxdWVyeUNvbW1hbmRTdGF0ZTogZnVuY3Rpb24oY29tbWFuZCl7CisJCQkvLyBzdW1tYXJ5OiBjaGVjayB0aGUgc3RhdGUgb2YgYSBnaXZlbiBjb21tYW5kCisJCQljb21tYW5kID0gdGhpcy5fbm9ybWFsaXplQ29tbWFuZChjb21tYW5kKTsKKwkJCWlmKHRoaXMub2JqZWN0KXsKKwkJCQlpZihjb21tYW5kID09ICJmb3JlY29sb3IiKXsKKwkJCQkJY29tbWFuZCA9ICJzZXRmb3JlY29sb3IiOworCQkJCX1lbHNlIGlmKGNvbW1hbmQgPT0gImJhY2tjb2xvciIpeworCQkJCQljb21tYW5kID0gInNldGJhY2tjb2xvciI7CisJCQkJfWVsc2UgaWYoY29tbWFuZCA9PSAic3RyaWtldGhyb3VnaCIpeworCQkJCQkvL2NoZWNrIHdoZXRoZXIgd2UgYXJlIHVuZGVyIGEgPHN0cmlrZT4KKwkJCQkJcmV0dXJuIGRvam8ud2l0aEdsb2JhbCh0aGlzLndpbmRvdywgImhhc0FuY2VzdG9yRWxlbWVudCIsIGRvam8uaHRtbC5zZWxlY3Rpb24sIFsnc3RyaWtlJ10pOworCQkJCX1lbHNlIGlmKGNvbW1hbmQgPT0gImluc2VydGhvcml6b250YWxydWxlIil7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlpZih0eXBlb2YgdGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdID09ICJ1bmRlZmluZWQiKXsgcmV0dXJuIG51bGw7IH0KKwkJCQl2YXIgc3RhdHVzID0gdGhpcy5vYmplY3QuUXVlcnlTdGF0dXModGhpcy5fYWN0aXZlWC5jb21tYW5kW2NvbW1hbmRdKTsKKwkJCQlyZXR1cm4gKChzdGF0dXMgPT0gdGhpcy5fYWN0aXZlWC5zdGF0dXMubGF0Y2hlZCl8fAorCQkJCQkoc3RhdHVzID09IHRoaXMuX2FjdGl2ZVguc3RhdHVzLm5pbmNoZWQpKTsKKwkJCX1lbHNleworCQkJCXJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQpOworCQkJfQorCQl9LAorCisJCXF1ZXJ5Q29tbWFuZFZhbHVlOiBmdW5jdGlvbiAoY29tbWFuZCkgeworCQkJLy8gc3VtbWFyeTogY2hlY2sgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gY29tbWFuZAorCQkJY29tbWFuZCA9IHRoaXMuX25vcm1hbGl6ZUNvbW1hbmQoY29tbWFuZCk7CisJCQlpZiAodGhpcy5vYmplY3QpIHsKKwkJCQlzd2l0Y2ggKGNvbW1hbmQpIHsKKwkJCQkJY2FzZSAiZm9yZWNvbG9yIjoKKwkJCQkJY2FzZSAiYmFja2NvbG9yIjoKKwkJCQkJY2FzZSAiZm9udHNpemUiOgorCQkJCQljYXNlICJmb250bmFtZSI6CisJCQkJCQljb21tYW5kID0gImdldCIgKyBjb21tYW5kOworCQkJCQkJcmV0dXJuIHRoaXMub2JqZWN0LmV4ZWNDb21tYW5kKAorCQkJCQkJCXRoaXMuX2FjdGl2ZVguY29tbWFuZFtjb21tYW5kXSwKKwkJCQkJCQl0aGlzLl9hY3RpdmVYLnVpLm5vcHJvbXB0KTsKKwkJCQkJY2FzZSAiZm9ybWF0YmxvY2siOgorCQkJCQkJdmFyIHJldHZhbHVlID0gdGhpcy5vYmplY3QuZXhlY0NvbW1hbmQoCisJCQkJCQkJdGhpcy5fYWN0aXZlWC5jb21tYW5kWyJnZXRibG9ja2Zvcm1hdCJdLAorCQkJCQkJCXRoaXMuX2FjdGl2ZVgudWkubm9wcm9tcHQpOworCQkJCQkJaWYocmV0dmFsdWUpeworCQkJCQkJCXJldHVybiB0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1tyZXR2YWx1ZV07CisJCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZihkb2pvLnJlbmRlci5odG1sLmllICYmIGNvbW1hbmQgPT0gImZvcm1hdGJsb2NrIil7CisJCQkJCXJldHVybiB0aGlzLl9sb2NhbDJOYXRpdmVGb3JtYXROYW1lc1t0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpXSB8fCB0aGlzLmRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbW1hbmQpOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5kb2N1bWVudC5xdWVyeUNvbW1hbmRWYWx1ZShjb21tYW5kKTsKKwkJCX0KKwkJfSwKKworCisJLyogTWlzYy4KKwkgKioqKioqKiovCisKKwkJcGxhY2VDdXJzb3JBdFN0YXJ0OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlwbGFjZSB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZWRpdGluZyBhcmVhCisJCQl0aGlzLmZvY3VzKCk7CisJCQkvL3NlZSBjb21tZW50cyBpbiBwbGFjZUN1cnNvckF0RW5kCisJCQlpZihkb2pvLnJlbmRlci5odG1sLm1veiAmJiB0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQgJiYKKwkJCQl0aGlzLmVkaXROb2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgIT0gZG9qby5kb20uVEVYVF9OT0RFKXsKKwkJCQlkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJzZWxlY3RFbGVtZW50Q2hpbGRyZW4iLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5lZGl0Tm9kZS5maXJzdENoaWxkXSk7CisJCQl9ZWxzZXsKKwkJCQlkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJzZWxlY3RFbGVtZW50Q2hpbGRyZW4iLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5lZGl0Tm9kZV0pOworCQkJfQorCQkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiY29sbGFwc2UiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdHJ1ZV0pOworCQl9LAorCisJCXBsYWNlQ3Vyc29yQXRFbmQ6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCXBsYWNlIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgZWRpdGluZyBhcmVhCisJCQl0aGlzLmZvY3VzKCk7CisJCQkvL0luIG1vemlsbGEsIGlmIGxhc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlLCB3ZSBoYXZlIHRvIHVzZSBzZWxlY3RFbGVtZW50Q2hpbGRyZW4gb24gdGhpcy5lZGl0Tm9kZS5sYXN0Q2hpbGQKKwkJCS8vb3RoZXJ3aXNlIHRoZSBjdXJzb3Igd291bGQgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGNsb3NpbmcgdGFnIG9mIHRoaXMuZWRpdE5vZGUubGFzdENoaWxkCisJCQlpZihkb2pvLnJlbmRlci5odG1sLm1veiAmJiB0aGlzLmVkaXROb2RlLmxhc3RDaGlsZCAmJgorCQkJCXRoaXMuZWRpdE5vZGUubGFzdENoaWxkLm5vZGVUeXBlICE9IGRvam8uZG9tLlRFWFRfTk9ERSl7CisJCQkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAic2VsZWN0RWxlbWVudENoaWxkcmVuIiwgZG9qby5odG1sLnNlbGVjdGlvbiwgW3RoaXMuZWRpdE5vZGUubGFzdENoaWxkXSk7CisJCQl9ZWxzZXsKKwkJCQlkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csICJzZWxlY3RFbGVtZW50Q2hpbGRyZW4iLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5lZGl0Tm9kZV0pOworCQkJfQorCQkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAiY29sbGFwc2UiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbZmFsc2VdKTsKKwkJfSwKKworCQlyZXBsYWNlRWRpdG9yQ29udGVudDogZnVuY3Rpb24oLypTdHJpbmcqL2h0bWwpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQl0aGlzIGZ1bmN0aW9uIHNldCB0aGUgY29udGVudCB3aGlsZSB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHVuZG8gc3RhY2sKKwkJCWh0bWwgPSB0aGlzLl9wcmVGaWx0ZXJDb250ZW50KGh0bWwpOworCQkJaWYodGhpcy5pc0Nsb3NlZCl7CisJCQkJdGhpcy5kb21Ob2RlLmlubmVySFRNTCA9IGh0bWw7CisJCQl9ZWxzZSBpZih0aGlzLndpbmRvdyAmJiB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24gJiYgIWRvam8ucmVuZGVyLmh0bWwubW96KXsgLy8gU2FmYXJpCisJCQkJLy8gbG9vayBtYSEgaXQncyBhIHRvdGFsbHkgZidkIGJyb3dzZXIhCisJCQkJdGhpcy5lZGl0Tm9kZS5pbm5lckhUTUwgPSBodG1sOworCQkJfWVsc2UgaWYoKHRoaXMud2luZG93ICYmIHRoaXMud2luZG93LmdldFNlbGVjdGlvbikgfHwgKHRoaXMuZG9jdW1lbnQgJiYgdGhpcy5kb2N1bWVudC5zZWxlY3Rpb24pKXsgLy8gTW96L0lFCisJCQkJdGhpcy5leGVjQ29tbWFuZCgic2VsZWN0YWxsIik7CisJCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5tb3ogJiYgIWh0bWwpeyBodG1sID0gIiZuYnNwOyIgfQorCQkJCXRoaXMuZXhlY0NvbW1hbmQoImluc2VydGh0bWwiLCBodG1sKTsKKwkJCX0KKwkJfSwKKworCQlfcHJlRmlsdGVyQ29udGVudDogZnVuY3Rpb24oLypTdHJpbmcqL2h0bWwpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlmaWx0ZXIgdGhlIGlucHV0IGJlZm9yZSBzZXR0aW5nIHRoZSBjb250ZW50IG9mIHRoZSBlZGl0aW5nIGFyZWEKKwkJCXZhciBlYyA9IGh0bWw7CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnRQcmVGaWx0ZXJzLCBmdW5jdGlvbihlZil7CisJCQkJZWMgPSBlZihlYyk7CisJCQl9KTsKKwkJCWlmKHRoaXMuY29udGVudERvbVByZUZpbHRlcnMubGVuZ3RoPjApeworCQkJCXZhciBkb20gPSBkb2pvLmRvYygpLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQkJCWRvbS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKGRvbSk7CisJCQkJZG9tLmlubmVySFRNTCA9IGVjOworCQkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuY29udGVudERvbVByZUZpbHRlcnMsIGZ1bmN0aW9uKGVmKXsKKwkJCQkJZG9tID0gZWYoZG9tKTsKKwkJCQl9KTsKKwkJCQllYyA9IGRvbS5pbm5lckhUTUw7CisJCQkJZG9qby5ib2R5KCkucmVtb3ZlQ2hpbGQoZG9tKTsKKwkJCX0KKwkJCXJldHVybiBlYzsKKwkJfSwKKwkJX3Bvc3RGaWx0ZXJDb250ZW50OiBmdW5jdGlvbigvKlN0cmluZyovaHRtbCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWZpbHRlciB0aGUgb3V0cHV0IGFmdGVyIGdldHRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRpbmcgYXJlYQorCQkJdmFyIGVjID0gaHRtbDsKKwkJCWlmKHRoaXMuY29udGVudERvbVBvc3RGaWx0ZXJzLmxlbmd0aD4wKXsKKwkJCQl2YXIgZG9tID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCQlkb20uaW5uZXJIVE1MID0gZWM7CisJCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5jb250ZW50RG9tUG9zdEZpbHRlcnMsIGZ1bmN0aW9uKGVmKXsKKwkJCQkJZG9tID0gZWYoZG9tKTsKKwkJCQl9KTsKKwkJCQllYyA9IGRvbS5pbm5lckhUTUw7CisJCQl9CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmNvbnRlbnRQb3N0RmlsdGVycywgZnVuY3Rpb24oZWYpeworCQkJCWVjID0gZWYoZWMpOworCQkJfSk7CisJCQlyZXR1cm4gZWM7CisJCX0sCisKKwkJLy9JbnQ6IHN0b3JlZCBsYXN0IHRpbWUgaGVpZ2h0CisJCV9sYXN0SGVpZ2h0OiAwLAorCisJCV91cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCVVwZGF0ZXMgdGhlIGhlaWdodCBvZiB0aGUgZWRpdG9yIGFyZWEgdG8gZml0IHRoZSBjb250ZW50cy4KKwkJCWlmKCF0aGlzLmlzTG9hZGVkKXsgcmV0dXJuOyB9CisJCQlpZih0aGlzLmhlaWdodCl7IHJldHVybjsgfQorCisJCQl2YXIgaGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmVkaXROb2RlKS5oZWlnaHQ7CisJCQkvL2hlaWdodCBtYXliZSB6ZXJvIGluIHNvbWUgY2FzZXMgZXZlbiB0aG91Z2ggdGhlIGNvbnRlbnQgaXMgbm90IGVtcHR5LAorCQkJLy93ZSB0cnkgdGhlIGhlaWdodCBvZiBib2R5IGluc3RlYWQKKwkJCWlmKCFoZWlnaHQpeworCQkJCWhlaWdodCA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3godGhpcy5kb2N1bWVudC5ib2R5KS5oZWlnaHQ7CisJCQl9CisJCQlpZihoZWlnaHQgPT0gMCl7CisJCQkJZG9qby5kZWJ1ZygiQ2FuIG5vdCBmaWd1cmUgb3V0IHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRpbmcgYXJlYSEiKTsKKwkJCQlyZXR1cm47IC8vcHJldmVudCBzZXR0aW5nIGhlaWdodCB0byAwCisJCQl9CisJCQl0aGlzLl9sYXN0SGVpZ2h0ID0gaGVpZ2h0OworCQkJdGhpcy5lZGl0b3JPYmplY3Quc3R5bGUuaGVpZ2h0ID0gdGhpcy5fbGFzdEhlaWdodCArICJweCI7CisJCQl0aGlzLndpbmRvdy5zY3JvbGxUbygwLCAwKTsKKwkJfSwKKworCQlfc2F2ZUNvbnRlbnQ6IGZ1bmN0aW9uKGUpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlTYXZlcyB0aGUgY29udGVudCBpbiBhbiBvbnVubG9hZCBldmVudCBpZiB0aGUgZWRpdG9yIGhhcyBub3QgYmVlbiBjbG9zZWQKKwkJCXZhciBzYXZlVGV4dGFyZWEgPSBkb2pvLmRvYygpLmdldEVsZW1lbnRCeUlkKCJkb2pvLndpZGdldC5SaWNoVGV4dC5zYXZlZENvbnRlbnQiKTsKKwkJCXNhdmVUZXh0YXJlYS52YWx1ZSArPSB0aGlzLl9TRVBBUkFUT1IgKyB0aGlzLnNhdmVOYW1lICsgIjoiICsgdGhpcy5nZXRFZGl0b3JDb250ZW50KCk7CisJCX0sCisKKwkJZ2V0RWRpdG9yQ29udGVudDogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGVkaXRpbmcgYXJlYSAocG9zdCBmaWx0ZXJzIGFyZSBhcHBsaWVkKQorCQkJdmFyIGVjID0gIiI7CisJCQl0cnl7CisJCQkJZWMgPSAodGhpcy5fY29udGVudC5sZW5ndGggPiAwKSA/IHRoaXMuX2NvbnRlbnQgOiB0aGlzLmVkaXROb2RlLmlubmVySFRNTDsKKwkJCQlpZihkb2pvLnN0cmluZy50cmltKGVjKSA9PSAiJm5ic3A7Iil7IGVjID0gIiI7IH0KKwkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCAqLyB9CisKKwkJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUgJiYgIXRoaXMub2JqZWN0KXsKKwkJCQkvL3JlbW92aW5nIGFwcGVuZGVkIDxQPiZuYnNwOzwvUD4gZm9yIElFIGluIG5vbmUtYWN0aXZlWCBtb2RlCisJCQkJdmFyIHJlID0gbmV3IFJlZ0V4cCgiKD86PHA+Jm5ic3A7PC9wPltcblxyXSopKyQiLCAiaSIpOworCQkJCWVjID0gZWMucmVwbGFjZShyZSwiIik7CisJCQl9CisKKwkJCWVjID0gdGhpcy5fcG9zdEZpbHRlckNvbnRlbnQoZWMpOworCisJCQlpZiAodGhpcy5yZWxhdGl2ZUltYWdlVXJscykgeworCQkJCS8vIHdoeSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBkb20/IGJlY2F1c2UgSUUgaXMgc3R1cGlkCisJCQkJLy8gYW5kIHdvbid0IGxldCB1cyBzZXQgaW1nLnNyYyB0byBhIHJlbGF0aXZlIFVSTAorCQkJCS8vIHRoaXMgY29tZXMgYWZ0ZXIgY29udGVudFBvc3RGaWx0ZXJzIGJlY2F1c2Ugb25jZSBjb250ZW50CisJCQkJLy8gZ2V0cyBpbm5lckhUTUwnZCBpbWcgdXJscyB3aWxsIGJlIGZ1bGx5IHF1YWxpZmllZAorCQkJCXZhciBzaXRlQmFzZSA9IGRvam8uZ2xvYmFsKCkubG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgZG9qby5nbG9iYWwoKS5sb2NhdGlvbi5ob3N0OworCQkJCXZhciBwYXRoQmFzZSA9IGRvam8uZ2xvYmFsKCkubG9jYXRpb24ucGF0aG5hbWU7CisJCQkJaWYgKHBhdGhCYXNlLm1hdGNoKC9cLyQvKSkgeworCQkJCQkvLyBlbmRzIHdpdGggc2xhc2gsIG1hdGNoIGZ1bGwgcGF0aAorCQkJCX0gZWxzZSB7CisJCQkJCS8vIG1hdGNoIHBhcmVudCBwYXRoIHRvIGZpbmQgc2libGluZ3MKKwkJCQkJdmFyIHBhdGhQYXJ0cyA9IHBhdGhCYXNlLnNwbGl0KCIvIik7CisJCQkJCWlmIChwYXRoUGFydHMubGVuZ3RoKSB7CisJCQkJCQlwYXRoUGFydHMucG9wKCk7CisJCQkJCX0KKwkJCQkJcGF0aEJhc2UgPSBwYXRoUGFydHMuam9pbigiLyIpICsgIi8iOworCisJCQkJfQorCisJCQkJdmFyIHNhbWVTaXRlID0gbmV3IFJlZ0V4cCgiKDxpbWdbXj5dKlwgc3JjPVtcIiddKSgiK3NpdGVCYXNlKyIoIitwYXRoQmFzZSsiKT8pIiwgImlnIik7CisJCQkJZWMgPSBlYy5yZXBsYWNlKHNhbWVTaXRlLCAiJDEiKTsKKwkJCX0KKwkJCXJldHVybiBlYzsKKwkJfSwKKworCQljbG9zZTogZnVuY3Rpb24oLypCb29sZWFuKi9zYXZlLCAvKkJvb2xlYW4qL2ZvcmNlKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJS2lsbHMgdGhlIGVkaXRvciBhbmQgb3B0aW9uYWxseSB3cml0ZXMgYmFjayB0aGUgbW9kaWZpZWQgY29udGVudHMgdG8gdGhlCisJCQkvLwkJZWxlbWVudCBmcm9tIHdoaWNoIGl0IG9yaWdpbmF0ZWQuCisJCQkvLyBzYXZlOgorCQkJLy8JCVdoZXRoZXIgb3Igbm90IHRvIHNhdmUgdGhlIGNoYW5nZXMuIElmIGZhbHNlLCB0aGUgY2hhbmdlcyBhcmUgZGlzY2FyZGVkLgorCQkJLy8gZm9yY2U6CisJCQlpZih0aGlzLmlzQ2xvc2VkKXtyZXR1cm4gZmFsc2U7IH0KKworCQkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgeyBzYXZlID0gdHJ1ZTsgfQorCQkJdGhpcy5fY29udGVudCA9IHRoaXMuX3Bvc3RGaWx0ZXJDb250ZW50KHRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MKTsKKwkJCXZhciBjaGFuZ2VkID0gKHRoaXMuc2F2ZWRDb250ZW50ICE9IHRoaXMuX2NvbnRlbnQpOworCisJCQkvLyBsaW5lIGhlaWdodCBpcyBzcXVhc2hlZCBmb3IgaWZyYW1lcworCQkJLy8gRklYTUU6IHdoeSB3YXMgdGhpcyBoZXJlPyBpZiAodGhpcy5pZnJhbWUpeyB0aGlzLmRvbU5vZGUuc3R5bGUubGluZUhlaWdodCA9IG51bGw7IH0KKworCQkJaWYodGhpcy5pbnRlcnZhbCl7IGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7IH0KKworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSAmJiAhdGhpcy5vYmplY3QpeworCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5jbGVhbih0aGlzLmVkaXROb2RlKTsKKwkJCX0KKworCQkJaWYgKHRoaXMuaWZyYW1lKSB7CisJCQkJLy8gRklYTUU6IHNob3VsZCBrZWVwIGlmcmFtZSBhcm91bmQgZm9yIGxhdGVyIHJlLXVzZQorCQkJCWRlbGV0ZSB0aGlzLmlmcmFtZTsKKwkJCX0KKworCQkJaWYodGhpcy50ZXh0YXJlYSl7CisJCQkJd2l0aCh0aGlzLnRleHRhcmVhLnN0eWxlKXsKKwkJCQkJcG9zaXRpb24gPSAiIjsKKwkJCQkJbGVmdCA9IHRvcCA9ICIiOworCQkJCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCQkJCW92ZXJmbG93ID0gdGhpcy5fX292ZXJmbG93OworCQkJCQkJdGhpcy5fX292ZXJmbG93ID0gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZihzYXZlKXsKKwkJCQkJdGhpcy50ZXh0YXJlYS52YWx1ZSA9IHRoaXMuX2NvbnRlbnQ7CisJCQkJfWVsc2V7CisJCQkJCXRoaXMudGV4dGFyZWEudmFsdWUgPSB0aGlzLnNhdmVkQ29udGVudDsKKwkJCQl9CisJCQkJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kb21Ob2RlKTsKKwkJCQl0aGlzLmRvbU5vZGUgPSB0aGlzLnRleHRhcmVhOworCQkJfWVsc2V7CisJCQkJaWYoc2F2ZSl7CisJCQkJCWlmKGRvam8ucmVuZGVyLmh0bWwubW96KXsKKwkJCQkJCXZhciBuYyA9IGRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgic3BhbiIpOworCQkJCQkJdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKG5jKTsKKwkJCQkJCW5jLmlubmVySFRNTCA9IHRoaXMuZWRpdE5vZGUuaW5uZXJIVE1MOworCQkJCQl9ZWxzZXsKKwkJCQkJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSB0aGlzLl9jb250ZW50OworCQkJCQl9CisJCQkJfWVsc2V7CisJCQkJCXRoaXMuZG9tTm9kZS5pbm5lckhUTUwgPSB0aGlzLnNhdmVkQ29udGVudDsKKwkJCQl9CisJCQl9CisKKwkJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmRvbU5vZGUsICJSaWNoVGV4dEVkaXRhYmxlIik7CisJCQl0aGlzLmlzQ2xvc2VkID0gdHJ1ZTsKKwkJCXRoaXMuaXNMb2FkZWQgPSBmYWxzZTsKKwkJCS8vIEZJWE1FOiBpcyB0aGlzIGFsd2F5cyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8/CisJCQlkZWxldGUgdGhpcy5lZGl0Tm9kZTsKKworCQkJaWYodGhpcy53aW5kb3cuX2ZyYW1lRWxlbWVudCl7CisJCQkJdGhpcy53aW5kb3cuX2ZyYW1lRWxlbWVudCA9IG51bGw7CisJCQl9CisKKwkJCXRoaXMud2luZG93ID0gbnVsbDsKKwkJCXRoaXMuZG9jdW1lbnQgPSBudWxsOworCQkJdGhpcy5vYmplY3QgPSBudWxsOworCQkJdGhpcy5lZGl0aW5nQXJlYSA9IG51bGw7CisJCQl0aGlzLmVkaXRvck9iamVjdCA9IG51bGw7CisKKwkJCXJldHVybiBjaGFuZ2VkOyAvLyBCb29sZWFuOiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCisJCX0sCisKKwkJZGVzdHJveVJlbmRlcmluZzogZnVuY3Rpb24oKXt9LCAvLyBzdHViIQorCisJCWRlc3Ryb3k6IGZ1bmN0aW9uICgpeworCQkJdGhpcy5kZXN0cm95UmVuZGVyaW5nKCk7CisJCQlpZighdGhpcy5pc0Nsb3NlZCl7IHRoaXMuY2xvc2UoZmFsc2UpOyB9CisKKwkJCWRvam8ud2lkZ2V0LlJpY2hUZXh0LnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworCQl9LAorCisJCWNvbm5lY3Q6IGZ1bmN0aW9uICh0YXJnZXRPYmosIHRhcmdldEZ1bmMsIHRoaXNGdW5jKSB7CisJCQkvLyBzdW1tYXJ5OiBjb252ZW5pZW50IG1ldGhvZCBmb3IgZG9qby5ldmVudC5jb25uZWN0CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGFyZ2V0T2JqLCB0YXJnZXRGdW5jLCB0aGlzLCB0aGlzRnVuYyk7CisJCX0sCisKKwkJZGlzY29ubmVjdDogZnVuY3Rpb24gKHRhcmdldE9iaiwgdGFyZ2V0RnVuYywgdGhpc0Z1bmMpIHsKKwkJCS8vIHN1bW1hcnk6IGNvbnZlbmllbnQgbWV0aG9kIGZvciBkb2pvLmV2ZW50LmRpc2Nvbm5lY3QKKwkJCWRvam8uZXZlbnQuZGlzY29ubmVjdCh0YXJnZXRPYmosIHRhcmdldEZ1bmMsIHRoaXMsIHRoaXNGdW5jKTsKKwkJfSwKKworCQlkaXNjb25uZWN0QWxsV2l0aFJvb3Q6IGZ1bmN0aW9uICh0YXJnZXRPYmopIHsKKwkJCWRvam8uZGVwcmVjYXRlZCgiZGlzY29ubmVjdEFsbFdpdGhSb290IiwgImlzIGRlcHJlY2F0ZWQuIE5vIG5lZWQgdG8gZGlzY29ubmVjdCBtYW51YWxseSIsICIwLjUiKTsKKwkJfSwKKworCQlfZml4Q29udGVudEZvck1vejogZnVuY3Rpb24oaHRtbCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCU1veiBjYW4gbm90IGhhbmRsZSBzdHJvbmcvZW0gdGFncyBjb3JyZWN0bHksIGNvcnJlY3QgdGhlbSBoZXJlCisJCQlodG1sID0gaHRtbC5yZXBsYWNlKC88c3Ryb25nKFsgXD5dKS9naSwgJzxiJDEnICk7CisJCQlodG1sID0gaHRtbC5yZXBsYWNlKC88XC9zdHJvbmc+L2dpLCAnPFwvYj4nICk7CisJCQlodG1sID0gaHRtbC5yZXBsYWNlKC88ZW0oWyBcPl0pL2dpLCAnPGkkMScgKTsKKwkJCWh0bWwgPSBodG1sLnJlcGxhY2UoLzxcL2VtPi9naSwgJzxcL2k+JyApOworCQkJcmV0dXJuIGh0bWw7CisJCX0KKwl9CispOworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy50eXBlIik7CisKKworZG9qby5sYW5nLndoYXRBbUkgPSBmdW5jdGlvbih2YWx1ZSkgeworCWRvam8uZGVwcmVjYXRlZCgiZG9qby5sYW5nLndoYXRBbUkiLCAidXNlIGRvam8ubGFuZy5nZXRUeXBlIGluc3RlYWQiLCAiMC41Iik7CisJcmV0dXJuIGRvam8ubGFuZy5nZXRUeXBlKHZhbHVlKTsKK30KK2Rvam8ubGFuZy53aGF0QW1JLmN1c3RvbSA9IHt9OworCitkb2pvLmxhbmcuZ2V0VHlwZSA9IGZ1bmN0aW9uKC8qIGFueXRoaW5nICovIHZhbHVlKXsKKwkvLyBzdW1tYXJ5OiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIHZhbHVlIGlzLgorCS8vIHZhbHVlOiBBbnkgbGl0ZXJhbCB2YWx1ZSBvciBvYmplY3QgaW5zdGFuY2UuCisJdHJ5eworCQlpZihkb2pvLmxhbmcuaXNBcnJheSh2YWx1ZSkpeyAKKwkJCXJldHVybiAiYXJyYXkiOwkvLwlzdHJpbmcgCisJCX0KKwkJaWYoZG9qby5sYW5nLmlzRnVuY3Rpb24odmFsdWUpKXsgCisJCQlyZXR1cm4gImZ1bmN0aW9uIjsJLy8Jc3RyaW5nIAorCQl9CisJCWlmKGRvam8ubGFuZy5pc1N0cmluZyh2YWx1ZSkpeyAKKwkJCXJldHVybiAic3RyaW5nIjsJLy8Jc3RyaW5nIAorCQl9CisJCWlmKGRvam8ubGFuZy5pc051bWJlcih2YWx1ZSkpeyAKKwkJCXJldHVybiAibnVtYmVyIjsJLy8Jc3RyaW5nIAorCQl9CisJCWlmKGRvam8ubGFuZy5pc0Jvb2xlYW4odmFsdWUpKXsgCisJCQlyZXR1cm4gImJvb2xlYW4iOwkvLwlzdHJpbmcgCisJCX0KKwkJaWYoZG9qby5sYW5nLmlzQWxpZW4odmFsdWUpKXsgCisJCQlyZXR1cm4gImFsaWVuIjsJLy8Jc3RyaW5nIAorCQl9CisJCWlmKGRvam8ubGFuZy5pc1VuZGVmaW5lZCh2YWx1ZSkpeyAKKwkJCXJldHVybiAidW5kZWZpbmVkIjsJLy8Jc3RyaW5nIAorCQl9CisJCS8vIEZJWE1FOiBzaG91bGQgdGhpcyBnbyBmaXJzdD8KKwkJZm9yKHZhciBuYW1lIGluIGRvam8ubGFuZy53aGF0QW1JLmN1c3RvbSl7CisJCQlpZihkb2pvLmxhbmcud2hhdEFtSS5jdXN0b21bbmFtZV0odmFsdWUpKXsKKwkJCQlyZXR1cm4gbmFtZTsJLy8Jc3RyaW5nCisJCQl9CisJCX0KKwkJaWYoZG9qby5sYW5nLmlzT2JqZWN0KHZhbHVlKSl7IAorCQkJcmV0dXJuICJvYmplY3QiOwkvLwlzdHJpbmcgCisJCX0KKwl9Y2F0Y2goZSl7fQorCXJldHVybiAidW5rbm93biI7CS8vCXN0cmluZworfQorCitkb2pvLmxhbmcuaXNOdW1lcmljID0gZnVuY3Rpb24oLyogYW55dGhpbmcgKi8gdmFsdWUpeworCS8vIHN1bW1hcnk6CisJLy8JCVJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBudW1iZXIKKwkvLyB2YWx1ZTogQW55IGxpdGVyYWwgdmFsdWUgb3Igb2JqZWN0IGluc3RhbmNlLgorCS8vIGV4YW1wbGVzOiAKKwkvLwkJZG9qby5sYW5nLmlzTnVtZXJpYygzKTsgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCS8vCQlkb2pvLmxhbmcuaXNOdW1lcmljKCIzIik7ICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0cnVlCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWMobmV3IE51bWJlcigzKSk7ICAgICAvLyByZXR1cm5zIHRydWUKKwkvLwkJZG9qby5sYW5nLmlzTnVtZXJpYyhuZXcgU3RyaW5nKCIzIikpOyAgIC8vIHJldHVybnMgdHJ1ZQorCS8vCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWMoMy8wKTsgICAgICAgICAgICAgICAvLyByZXR1cm5zIGZhbHNlCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWMoImZvbyIpOyAgICAgICAgICAgICAvLyByZXR1cm5zIGZhbHNlCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWMobmV3IE51bWJlcigiZm9vIikpOyAvLyByZXR1cm5zIGZhbHNlCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWMoZmFsc2UpOyAgICAgICAgICAgICAvLyByZXR1cm5zIGZhbHNlCisJLy8JCWRvam8ubGFuZy5pc051bWVyaWModHJ1ZSk7ICAgICAgICAgICAgICAvLyByZXR1cm5zIGZhbHNlCisJcmV0dXJuICghaXNOYU4odmFsdWUpIAorCQkmJiBpc0Zpbml0ZSh2YWx1ZSkgCisJCSYmICh2YWx1ZSAhPSBudWxsKSAKKwkJJiYgIWRvam8ubGFuZy5pc0Jvb2xlYW4odmFsdWUpIAorCQkmJiAhZG9qby5sYW5nLmlzQXJyYXkodmFsdWUpIAorCQkmJiAhL15ccyokLy50ZXN0KHZhbHVlKQorCSk7CS8vCWJvb2xlYW4KK30KKworZG9qby5sYW5nLmlzQnVpbHRJbiA9IGZ1bmN0aW9uKC8qIGFueXRoaW5nICovIHZhbHVlKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgb2YgYSB0eXBlIHByb3ZpZGVkIGJ5IGNvcmUgSmF2YVNjcmlwdAorCS8vIGRlc2NyaXB0aW9uOiAKKwkvLwkJUmV0dXJucyB0cnVlIGZvciBhbnkgbGl0ZXJhbCwgYW5kIGZvciBhbnkgb2JqZWN0IHRoYXQgaXMgYW4KKwkvLwkJaW5zdGFuY2Ugb2YgYSBidWlsdC1pbiB0eXBlIGxpa2UgU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4sIEFycmF5LAorCS8vCQlGdW5jdGlvbiwgb3IgRXJyb3IuICAKKwkvLyB2YWx1ZTogQW55IGxpdGVyYWwgdmFsdWUgb3Igb2JqZWN0IGluc3RhbmNlLgorCQorCXJldHVybiAoZG9qby5sYW5nLmlzQXJyYXkodmFsdWUpCisJCXx8IGRvam8ubGFuZy5pc0Z1bmN0aW9uKHZhbHVlKQkKKwkJfHwgZG9qby5sYW5nLmlzU3RyaW5nKHZhbHVlKQorCQl8fCBkb2pvLmxhbmcuaXNOdW1iZXIodmFsdWUpCisJCXx8IGRvam8ubGFuZy5pc0Jvb2xlYW4odmFsdWUpCisJCXx8ICh2YWx1ZSA9PSBudWxsKQorCQl8fCAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikKKwkJfHwgKHR5cGVvZiB2YWx1ZSA9PSAiZXJyb3IiKSAKKwkpOwkvLwlib29sZWFuCit9CisKK2Rvam8ubGFuZy5pc1B1cmVPYmplY3QgPSBmdW5jdGlvbigvKiBhbnl0aGluZyAqLyB2YWx1ZSl7CisJLy8gc3VtbWFyeToKKwkvLwkJUmV0dXJucyB0cnVlIGZvciBhbnkgdmFsdWUgd2hlcmUgdGhlIHZhbHVlIG9mIHZhbHVlLmNvbnN0cnVjdG9yID09CisJLy8JCU9iamVjdAorCS8vIGRlc2NyaXB0aW9uOiAKKwkvLwkJUmV0dXJucyB0cnVlIGZvciBhbnkgbGl0ZXJhbCwgYW5kIGZvciBhbnkgb2JqZWN0IHRoYXQgaXMgYW4KKwkvLwkJaW5zdGFuY2Ugb2YgYSBidWlsdC1pbiB0eXBlIGxpa2UgU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4sIEFycmF5LAorCS8vCQlGdW5jdGlvbiwgb3IgRXJyb3IuCisJLy8gdmFsdWU6CisJLy8JCUFueSBsaXRlcmFsIHZhbHVlIG9yIG9iamVjdCBpbnN0YW5jZS4KKwkvLyBleGFtcGxlczogCisJLy8JCWRvam8ubGFuZy5pc1B1cmVPYmplY3QobmV3IE9iamVjdCgpKTsgLy8gcmV0dXJucyB0cnVlCisJLy8JCWRvam8ubGFuZy5pc1B1cmVPYmplY3Qoe2E6IDEsIGI6IDJ9KTsgLy8gcmV0dXJucyB0cnVlCisJLy8KKwkvLwkJZG9qby5sYW5nLmlzUHVyZU9iamVjdChuZXcgRGF0ZSgpKTsgICAvLyByZXR1cm5zIGZhbHNlCisJLy8JCWRvam8ubGFuZy5pc1B1cmVPYmplY3QoWzExLCAyLCAzXSk7ICAgLy8gcmV0dXJucyBmYWxzZQorCXJldHVybiAoKHZhbHVlICE9IG51bGwpIAorCQkmJiBkb2pvLmxhbmcuaXNPYmplY3QodmFsdWUpIAorCQkmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBPYmplY3QKKwkpOwkvLwlib29sZWFuCit9CisKK2Rvam8ubGFuZy5pc09mVHlwZSA9IGZ1bmN0aW9uKC8qIGFueXRoaW5nICovIHZhbHVlLCAvKiBmdW5jdGlvbiAqLyB0eXBlLCAvKiBvYmplY3Q/ICovIGtleXdvcmRQYXJhbWV0ZXJzKSB7CisJLyogc3VtbWFyeToKKwkgKgkgUmV0dXJucyB0cnVlIGlmICd2YWx1ZScgaXMgb2YgdHlwZSAndHlwZScKKwkgKiBkZXNjcmlwdGlvbjogCisJICoJIEdpdmVuIGEgdmFsdWUgYW5kIGEgZGF0YXR5cGUsIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUKKwkgKgkgdHlwZSBvZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgZGF0YXR5cGUuIFRoZSBkYXRhdHlwZSBwYXJhbWV0ZXIKKwkgKgkgY2FuIGJlIGFuIGFycmF5IG9mIGRhdGF0eXBlcywgaW4gd2hpY2ggY2FzZSB0aGUgbWV0aG9kIHJldHVybnMKKwkgKgkgdHJ1ZSBpZiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgbWF0Y2hlcyBhbnkgb2YgdGhlIGRhdGF0eXBlcy4KKwkgKiB2YWx1ZTogQW55IGxpdGVyYWwgdmFsdWUgb3Igb2JqZWN0IGluc3RhbmNlLgorCSAqIHR5cGU6IEEgY2xhc3Mgb2Ygb2JqZWN0LCBvciBhIGxpdGVyYWwgdHlwZSwgb3IgdGhlIHN0cmluZyBuYW1lIG9mIGEgdHlwZSwgb3IgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgdHlwZXMuCisJICoga2V5d29yZFBhcmFtZXRlcnM6IHtvcHRpb25hbDogYm9vbGVhbn0KKwkgKi8KKwkgCisJLyogZXhhbXBsZXM6IAorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKCJmb28iLCBTdHJpbmcpOyAgICAgICAgICAgICAgICAvLyByZXR1cm5zIHRydWUKKwkgKiAgIGRvam8ubGFuZy5pc09mVHlwZSgxMjM0NSwgTnVtYmVyKTsgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0cnVlCisJICogICBkb2pvLmxhbmcuaXNPZlR5cGUoZmFsc2UsIEJvb2xlYW4pOyAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKFs2LCA4XSwgQXJyYXkpOyAgICAgICAgICAgICAgICAvLyByZXR1cm5zIHRydWUKKwkgKiAgIGRvam8ubGFuZy5pc09mVHlwZShkb2pvLmxhbmcuaXNPZlR5cGUsIEZ1bmN0aW9uKTsgLy8gcmV0dXJucyB0cnVlCisJICogICBkb2pvLmxhbmcuaXNPZlR5cGUoe2ZvbzogImJhciJ9LCBPYmplY3QpOyAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKG5ldyBEYXRlKCksIERhdGUpOyAgICAgICAgICAgICAvLyByZXR1cm5zIHRydWUKKwkgKgorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKCJmb28iLCAic3RyaW5nIik7ICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKDEyMzQ1LCAibnVtYmVyIik7ICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKGZhbHNlLCAiYm9vbGVhbiIpOyAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKFs2LCA4XSwgImFycmF5Iik7ICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKGRvam8ubGFuZy5pc09mVHlwZSwgImZ1bmN0aW9uIik7IC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKHtmb286ICJiYXIifSwgIm9iamVjdCIpOyAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKHh4eHh4LCAidW5kZWZpbmVkIik7ICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKG51bGwsICJudWxsIik7ICAgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQorCSAqCisJICogICBkb2pvLmxhbmcuaXNPZlR5cGUoImZvbyIsIFtOdW1iZXIsIFN0cmluZywgQm9vbGVhbl0pOyAvLyByZXR1cm5zIHRydWUKKwkgKiAgIGRvam8ubGFuZy5pc09mVHlwZSgxMjM0NSwgW051bWJlciwgU3RyaW5nLCBCb29sZWFuXSk7IC8vIHJldHVybnMgdHJ1ZQorCSAqICAgZG9qby5sYW5nLmlzT2ZUeXBlKGZhbHNlLCBbTnVtYmVyLCBTdHJpbmcsIEJvb2xlYW5dKTsgLy8gcmV0dXJucyB0cnVlCisJICoKKwkgKiAgIGRvam8ubGFuZy5pc09mVHlwZShudWxsLCBEYXRlLCB7b3B0aW9uYWw6IHRydWV9ICk7ICAgIC8vIHJldHVybnMgdHJ1ZQkvLyBkZXNjcmlwdGlvbjogCisJICovCisJdmFyIG9wdGlvbmFsID0gZmFsc2U7CisJaWYoa2V5d29yZFBhcmFtZXRlcnMpeworCQlvcHRpb25hbCA9IGtleXdvcmRQYXJhbWV0ZXJzWyJvcHRpb25hbCJdOworCX0KKwlpZihvcHRpb25hbCAmJiAoKHZhbHVlID09PSBudWxsKSB8fCBkb2pvLmxhbmcuaXNVbmRlZmluZWQodmFsdWUpKSl7CisJCXJldHVybiB0cnVlOwkvLwlib29sZWFuCisJfQorCWlmKGRvam8ubGFuZy5pc0FycmF5KHR5cGUpKXsKKwkJdmFyIGFycmF5T2ZUeXBlcyA9IHR5cGU7CisJCWZvcih2YXIgaSBpbiBhcnJheU9mVHlwZXMpeworCQkJdmFyIGFUeXBlID0gYXJyYXlPZlR5cGVzW2ldOworCQkJaWYoZG9qby5sYW5nLmlzT2ZUeXBlKHZhbHVlLCBhVHlwZSkpeworCQkJCXJldHVybiB0cnVlOyAJLy8JYm9vbGVhbgorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsJLy8JYm9vbGVhbgorCX1lbHNleworCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcodHlwZSkpeworCQkJdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTsKKwkJfQorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgQXJyYXk6CisJCQljYXNlICJhcnJheSI6CisJCQkJcmV0dXJuIGRvam8ubGFuZy5pc0FycmF5KHZhbHVlKTsJLy8JYm9vbGVhbgorCQkJY2FzZSBGdW5jdGlvbjoKKwkJCWNhc2UgImZ1bmN0aW9uIjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzRnVuY3Rpb24odmFsdWUpOwkvLwlib29sZWFuCisJCQljYXNlIFN0cmluZzoKKwkJCWNhc2UgInN0cmluZyI6CisJCQkJcmV0dXJuIGRvam8ubGFuZy5pc1N0cmluZyh2YWx1ZSk7CS8vCWJvb2xlYW4KKwkJCWNhc2UgTnVtYmVyOgorCQkJY2FzZSAibnVtYmVyIjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzTnVtYmVyKHZhbHVlKTsJLy8JYm9vbGVhbgorCQkJY2FzZSAibnVtZXJpYyI6CisJCQkJcmV0dXJuIGRvam8ubGFuZy5pc051bWVyaWModmFsdWUpOwkvLwlib29sZWFuCisJCQljYXNlIEJvb2xlYW46CisJCQljYXNlICJib29sZWFuIjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzQm9vbGVhbih2YWx1ZSk7CS8vCWJvb2xlYW4KKwkJCWNhc2UgT2JqZWN0OgorCQkJY2FzZSAib2JqZWN0IjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzT2JqZWN0KHZhbHVlKTsJLy8JYm9vbGVhbgorCQkJY2FzZSAicHVyZW9iamVjdCI6CisJCQkJcmV0dXJuIGRvam8ubGFuZy5pc1B1cmVPYmplY3QodmFsdWUpOwkvLwlib29sZWFuCisJCQljYXNlICJidWlsdGluIjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzQnVpbHRJbih2YWx1ZSk7CS8vCWJvb2xlYW4KKwkJCWNhc2UgImFsaWVuIjoKKwkJCQlyZXR1cm4gZG9qby5sYW5nLmlzQWxpZW4odmFsdWUpOwkvLwlib29sZWFuCisJCQljYXNlICJ1bmRlZmluZWQiOgorCQkJCXJldHVybiBkb2pvLmxhbmcuaXNVbmRlZmluZWQodmFsdWUpOwkvLwlib29sZWFuCisJCQljYXNlIG51bGw6CisJCQljYXNlICJudWxsIjoKKwkJCQlyZXR1cm4gKHZhbHVlID09PSBudWxsKTsJLy8JYm9vbGVhbgorCQkJY2FzZSAib3B0aW9uYWwiOgorCQkJCWRvam8uZGVwcmVjYXRlZCgnZG9qby5sYW5nLmlzT2ZUeXBlKHZhbHVlLCBbdHlwZSwgIm9wdGlvbmFsIl0pJywgJ3VzZSBkb2pvLmxhbmcuaXNPZlR5cGUodmFsdWUsIHR5cGUsIHtvcHRpb25hbDogdHJ1ZX0gKSBpbnN0ZWFkJywgIjAuNSIpOworCQkJCXJldHVybiAoKHZhbHVlID09PSBudWxsKSB8fCBkb2pvLmxhbmcuaXNVbmRlZmluZWQodmFsdWUpKTsJLy8JYm9vbGVhbgorCQkJZGVmYXVsdDoKKwkJCQlpZihkb2pvLmxhbmcuaXNGdW5jdGlvbih0eXBlKSl7CisJCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiB0eXBlKTsJLy8JYm9vbGVhbgorCQkJCX1lbHNleworCQkJCQlkb2pvLnJhaXNlKCJkb2pvLmxhbmcuaXNPZlR5cGUoKSB3YXMgcGFzc2VkIGFuIGludmFsaWQgdHlwZSIpOworCQkJCX0KKwkJfQorCX0KKwlkb2pvLnJhaXNlKCJJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgYSBidWcgd2FzIGludHJvZHVjZWQgYWJvdmUuIik7Cit9CisKK2Rvam8ubGFuZy5nZXRPYmplY3Q9ZnVuY3Rpb24oLyogU3RyaW5nICovIHN0cil7CisJLy8gc3VtbWFyeToKKwkvLyAgIFdpbGwgcmV0dXJuIGFuIG9iamVjdCwgaWYgaXQgZXhpc3RzLCBiYXNlZCBvbiB0aGUgbmFtZSBpbiB0aGUgcGFzc2VkIHN0cmluZy4KKwl2YXIgcGFydHM9c3RyLnNwbGl0KCIuIiksIGk9MCwgb2JqPWRqX2dsb2JhbDsgCisJZG97IAorCQlvYmo9b2JqW3BhcnRzW2krK11dOyAKKwl9d2hpbGUoaTxwYXJ0cy5sZW5ndGgmJm9iaik7IAorCXJldHVybiAob2JqIT1kal9nbG9iYWwpP29iajpudWxsOwkvLwlPYmplY3QKK30KKworZG9qby5sYW5nLmRvZXNPYmplY3RFeGlzdD1mdW5jdGlvbigvKiBTdHJpbmcgKi8gc3RyKXsKKwkvLyBzdW1tYXJ5OgorCS8vICAgQ2hlY2sgdG8gc2VlIGlmIG9iamVjdCBbc3RyXSBleGlzdHMsIGJhc2VkIG9uIHRoZSBwYXNzZWQgc3RyaW5nLgorCXZhciBwYXJ0cz1zdHIuc3BsaXQoIi4iKSwgaT0wLCBvYmo9ZGpfZ2xvYmFsOyAKKwlkb3sgCisJCW9iaj1vYmpbcGFydHNbaSsrXV07IAorCX13aGlsZShpPHBhcnRzLmxlbmd0aCYmb2JqKTsgCisJcmV0dXJuIChvYmomJm9iaiE9ZGpfZ2xvYmFsKTsJLy8JYm9vbGVhbgorfQorCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5hc3NlcnQiKTsKKworCisKKworCitkb2pvLmxhbmcuYXNzZXJ0ID0gZnVuY3Rpb24oLyogYm9vbGVhbiAqLyBib29sZWFuVmFsdWUsIC8qIHN0cmluZz8gKi8gbWVzc2FnZSl7CisJLyogc3VtbWFyeTogCisJICogICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NlcnRpb24gZmFpbHMuCisJICogZGVzY3JpcHRpb246IAorCSAqICAgSWYgdGhlIGFzc2VydGVkIGNvbmRpdGlvbiBpcyB0cnVlLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIHRoZQorCSAqICAgY29uZGl0aW9uIGlzIGZhbHNlLCB3ZSB0aHJvdyBhbiBlcnJvciB3aXRoIGEgZXJyb3IgbWVzc2FnZS4gCisJICogYm9vbGVhblZhbHVlOiBNdXN0IGJlIHRydWUgZm9yIHRoZSBhc3NlcnRpb24gdG8gc3VjY2VlZC4KKwkgKiBtZXNzYWdlOiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhc3NlcnRpb24uCisJICovCisKKwkgLy8gdGhyb3dzOiBUaHJvd3MgYW4gRXJyb3IgaWYgJ2Jvb2xlYW5WYWx1ZScgaXMgZmFsc2UuCisJIGlmKCFib29sZWFuVmFsdWUpeworCQl2YXIgZXJyb3JNZXNzYWdlID0gIkFuIGFzc2VydCBzdGF0ZW1lbnQgZmFpbGVkLlxuIiArCisJCQkiVGhlIG1ldGhvZCBkb2pvLmxhbmcuYXNzZXJ0KCkgd2FzIGNhbGxlZCB3aXRoIGEgJ2ZhbHNlJyB2YWx1ZS5cbiI7CisJCWlmKG1lc3NhZ2UpeworCQkJZXJyb3JNZXNzYWdlICs9ICJIZXJlJ3MgdGhlIGFzc2VydCBtZXNzYWdlOlxuIiArIG1lc3NhZ2UgKyAiXG4iOworCQl9CisJCS8vIFVzZSB0aHJvdyBpbnN0ZWFkIG9mIGRvam8ucmFpc2UsIHVudGlsIGJ1ZyAjMjY0IGlzIGZpeGVkOgorCQkvLyBkb2pvLnJhaXNlKGVycm9yTWVzc2FnZSk7CisJCXRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpOworCX0KK30KKworZG9qby5sYW5nLmFzc2VydFR5cGUgPSBmdW5jdGlvbigvKiBhbnl0aGluZyAqLyB2YWx1ZSwgLyogbWlzYy4gKi8gdHlwZSwgLyogb2JqZWN0PyAqLyBrZXl3b3JkUGFyYW1ldGVycyl7CisJLyogc3VtbWFyeTogCisJICogICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmICd2YWx1ZScgaXMgbm90IG9mIHR5cGUgJ3R5cGUnCisJICogZGVzY3JpcHRpb246IAorCSAqICAgR2l2ZW4gYSB2YWx1ZSBhbmQgYSBkYXRhIHR5cGUsIHRoaXMgbWV0aG9kIGNoZWNrcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKwkgKiAgIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBkYXRhIHR5cGUsIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXJlCisJICogICBpcyBhIG1pc21hdGNoLgorCSAqIHZhbHVlOiBBbnkgbGl0ZXJhbCB2YWx1ZSBvciBvYmplY3QgaW5zdGFuY2UuCisJICogdHlwZTogQSBjbGFzcyBvZiBvYmplY3QsIG9yIGEgbGl0ZXJhbCB0eXBlLCBvciB0aGUgc3RyaW5nIG5hbWUgb2YgYSB0eXBlLCBvciBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiB0eXBlcy4KKwkgKiBrZXl3b3JkUGFyYW1ldGVyczoge29wdGlvbmFsOiBib29sZWFufQorCSAqLworCSAKKwkvKiBleGFtcGxlczogCisJICogICBkb2pvLmxhbmcuYXNzZXJ0VHlwZSgiZm9vIiwgU3RyaW5nKTsKKwkgKiAgIGRvam8ubGFuZy5hc3NlcnRUeXBlKDEyMzQ1LCBOdW1iZXIpOworCSAqICAgZG9qby5sYW5nLmFzc2VydFR5cGUoZmFsc2UsIEJvb2xlYW4pOworCSAqICAgZG9qby5sYW5nLmFzc2VydFR5cGUoWzYsIDhdLCBBcnJheSk7CisJICogICBkb2pvLmxhbmcuYXNzZXJ0VHlwZShkb2pvLmxhbmcuYXNzZXJ0VHlwZSwgRnVuY3Rpb24pOworCSAqICAgZG9qby5sYW5nLmFzc2VydFR5cGUoe2ZvbzogImJhciJ9LCBPYmplY3QpOworCSAqICAgZG9qby5sYW5nLmFzc2VydFR5cGUobmV3IERhdGUoKSwgRGF0ZSk7CisJICogICBkb2pvLmxhbmcuYXNzZXJ0VHlwZShudWxsLCBBcnJheSwge29wdGlvbmFsOiB0cnVlfSk7CisJICogdGhyb3dzOiBUaHJvd3MgYW4gRXJyb3IgaWYgJ3ZhbHVlJyBpcyBub3Qgb2YgdHlwZSAndHlwZScuCisJICovCisJaWYgKGRvam8ubGFuZy5pc1N0cmluZyhrZXl3b3JkUGFyYW1ldGVycykpIHsKKwkJZG9qby5kZXByZWNhdGVkKCdkb2pvLmxhbmcuYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSwgIm1lc3NhZ2UiKScsICd1c2UgZG9qby5sYW5nLmFzc2VydFR5cGUodmFsdWUsIHR5cGUpIGluc3RlYWQnLCAiMC41Iik7CisJfQorCWlmKCFkb2pvLmxhbmcuaXNPZlR5cGUodmFsdWUsIHR5cGUsIGtleXdvcmRQYXJhbWV0ZXJzKSl7CisJCWlmKCFkb2pvLmxhbmcuYXNzZXJ0VHlwZS5fZXJyb3JNZXNzYWdlKXsKKwkJCWRvam8ubGFuZy5hc3NlcnRUeXBlLl9lcnJvck1lc3NhZ2UgPSAiVHlwZSBtaXNtYXRjaDogZG9qby5sYW5nLmFzc2VydFR5cGUoKSBmYWlsZWQuIjsKKwkJfQorCQlkb2pvLmxhbmcuYXNzZXJ0KGZhbHNlLCBkb2pvLmxhbmcuYXNzZXJ0VHlwZS5fZXJyb3JNZXNzYWdlKTsKKwl9Cit9CisKK2Rvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzID0gZnVuY3Rpb24oLyogb2JqZWN0ICovIG9iamVjdCwgLyogYXJyYXkgKi8gZXhwZWN0ZWRQcm9wZXJ0aWVzLCAvKiBzdHJpbmc/ICovIG1lc3NhZ2UpeworCS8qIHN1bW1hcnk6IAorCSAqICAgVGhyb3dzIGFuIGV4Y2VwdGlvbiAnb2JqZWN0JyBoYXMgYW55IHByb3BlcnRpZXMgb3RoZXIgdGhhbiB0aGUgJ2V4cGVjdGVkUHJvcGVydGllcycuCisJICogZGVzY3JpcHRpb246IAorCSAqICAgR2l2ZW4gYW4gYW5vbnltb3VzIG9iamVjdCBhbmQgYSBsaXN0IG9mIGV4cGVjdGVkIHByb3BlcnR5IG5hbWVzLCB0aGlzCisJICogICBtZXRob2QgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgcHJvcGVydGllcworCSAqICAgdGhhdCBhcmVuJ3Qgb24gdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgcHJvcGVydGllcywgYW5kIHRocm93cyBhbiBFcnJvcgorCSAqICAgaWYgdGhlcmUgYXJlIHVuZXhwZWN0ZWQgcHJvcGVydGllcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGRvaW5nIGVycm9yCisJICogICBjaGVja2luZyBvbiBrZXl3b3JkIGFyZ3VtZW50cywgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW4ndCB0eXBvcy4KKwkgKiBvYmplY3Q6IEFuIGFub255bW91cyBvYmplY3QuCisJICogZXhwZWN0ZWRQcm9wZXJ0aWVzOiBBbiBhcnJheSBvZiBzdHJpbmdzIChvciBhbiBvYmplY3Qgd2l0aCBhbGwgdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMpLgorCSAqIG1lc3NhZ2U6IEEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBhc3NlcnRpb24uCisJICovCisJIAorCS8qIGV4YW1wbGVzOiAKKwkgKiAgIGRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzKHthOiAxLCBiOiAyfSwgWyJhIiwgImIiXSk7CisJICogICBkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcyh7YTogMSwgYjogMn0sIFsiYSIsICJiIiwgImMiXSk7CisJICogICBkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcyh7Zm9vOiAiaWdneSJ9LCBbImZvbyJdKTsKKwkgKiAgIGRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzKHtmb286ICJpZ2d5In0sIFsiZm9vIiwgImJhciJdKTsKKwkgKiAgIGRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzKHtmb286ICJpZ2d5In0sIHtmb286IG51bGwsIGJhcjogbnVsbH0pOworCSAqIHRocm93czogVGhyb3dzIGFuIEVycm9yIGlmICdvYmplY3QnIGhhcyB1bmV4cGVjdGVkIHByb3BlcnRpZXMuCisJICovCisJdmFyIGtleTsKKwlpZighbWVzc2FnZSl7CisJCWlmKCFkb2pvLmxhbmcuYXNzZXJ0VmFsaWRLZXl3b3Jkcy5fZXJyb3JNZXNzYWdlKXsKKwkJCWRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzLl9lcnJvck1lc3NhZ2UgPSAiSW4gZG9qby5sYW5nLmFzc2VydFZhbGlkS2V5d29yZHMoKSwgZm91bmQgaW52YWxpZCBrZXl3b3JkOiI7CisJCX0KKwkJbWVzc2FnZSA9IGRvam8ubGFuZy5hc3NlcnRWYWxpZEtleXdvcmRzLl9lcnJvck1lc3NhZ2U7CisJfQorCWlmKGRvam8ubGFuZy5pc0FycmF5KGV4cGVjdGVkUHJvcGVydGllcykpeworCQlmb3Ioa2V5IGluIG9iamVjdCl7CisJCQlpZighZG9qby5sYW5nLmluQXJyYXkoZXhwZWN0ZWRQcm9wZXJ0aWVzLCBrZXkpKXsKKwkJCQlkb2pvLmxhbmcuYXNzZXJ0KGZhbHNlLCBtZXNzYWdlICsgIiAiICsga2V5KTsKKwkJCX0KKwkJfQorCX1lbHNleworCQlmb3Ioa2V5IGluIG9iamVjdCl7CisJCQlpZighKGtleSBpbiBleHBlY3RlZFByb3BlcnRpZXMpKXsKKwkJCQlkb2pvLmxhbmcuYXNzZXJ0KGZhbHNlLCBtZXNzYWdlICsgIiAiICsga2V5KTsKKwkJCX0KKwkJfQorCX0KK30KKworZG9qby5wcm92aWRlKCJkb2pvLkFkYXB0ZXJSZWdpc3RyeSIpOworCisKK2Rvam8uQWRhcHRlclJlZ2lzdHJ5ID0gZnVuY3Rpb24oLypCb29sZWFuPyovIHJldHVybldyYXBwZXJzKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQlBIHJlZ2lzdHJ5IHRvIG1ha2UgY29udGV4dHVhbCBjYWxsaW5nL3NlYXJjaGluZyBlYXNpZXIuCisJLy8gZGVzY3JpcHRpb246CisJLy8JCU9iamVjdHMgb2YgdGhpcyBjbGFzcyBrZWVwIGxpc3Qgb2YgYXJyYXlzIGluIHRoZSBmb3JtIFtuYW1lLCBjaGVjaywKKwkvLwkJd3JhcCwgZGlyZWN0UmV0dXJuXSB0aGF0IGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IHRoZSBjb250ZXh0dWFsCisJLy8JCXJlc3VsdCBvZiBhIHNldCBvZiBjaGVja2VkIGFyZ3VtZW50cyBpcy4gQWxsIGNoZWNrL3dyYXAgZnVuY3Rpb25zCisJLy8JCWluIHRoaXMgcmVnaXN0cnkgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGFyaXR5LgorCXRoaXMucGFpcnMgPSBbXTsKKwl0aGlzLnJldHVybldyYXBwZXJzID0gcmV0dXJuV3JhcHBlcnMgfHwgZmFsc2U7Cit9CisKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5BZGFwdGVyUmVnaXN0cnksIHsKKwlyZWdpc3RlcjogZnVuY3Rpb24obmFtZSwgY2hlY2ssIC8qRnVuY3Rpb24qLyB3cmFwLCBkaXJlY3RSZXR1cm4sIG92ZXJyaWRlKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlyZWdpc3RlciBhIGNoZWNrIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgd3JhcCBmdW5jdGlvbiBvcgorCQkvLwkJb2JqZWN0IGdldHMgc2VsZWN0ZWQKKwkJLy8gbmFtZTogU3RyaW5nCisJCS8vCQlhIHdheSB0byBpZGVudGlmeSB0aGlzIG1hdGNoZXIuCisJCS8vIGNoZWNrOiBGdW5jdGlvbgorCQkvLwkJYSBmdW5jdGlvbiB0aGF0IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIGZyb20gdGhlIGFkYXB0ZXIncworCQkvLwkJbWF0Y2goKSBmdW5jdGlvbi4gIFRoZSBjaGVjayBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlCisJCS8vCQlnaXZlbiBhcmd1bWVudHMgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgd3JhcCBmdW5jdGlvbi4KKwkJLy8gZGlyZWN0UmV0dXJuOiBCb29sZWFuPworCQkvLwkJSWYgZGlyZWN0UmV0dXJuIGlzIHRydWUsIHRoZSB2YWx1ZSBwYXNzZWQgaW4gZm9yIHdyYXAgd2lsbCBiZQorCQkvLwkJcmV0dXJuZWQgaW5zdGVhZCBvZiBiZWluZyBjYWxsZWQuIEFsdGVybmF0ZWx5LCB0aGUKKwkJLy8JCUFkYXB0ZXJSZWdpc3RyeSBjYW4gYmUgc2V0IGdsb2JhbGx5IHRvICJyZXR1cm4gbm90IGNhbGwiIHVzaW5nCisJCS8vCQl0aGUgcmV0dXJuV3JhcHBlcnMgcHJvcGVydHkuIEVpdGhlciB3YXksIHRoaXMgYmVoYXZpb3IgYWxsb3dzCisJCS8vCQl0aGUgcmVnaXN0cnkgdG8gYWN0IGFzIGEgInNlYXJjaCIgZnVuY3Rpb24gaW5zdGVhZCBvZiBhCisJCS8vCQlmdW5jdGlvbiBpbnRlcmNlcHRpb24gbGlicmFyeS4KKwkJLy8gb3ZlcnJpZGU6IEJvb2xlYW4/CisJCS8vCQlJZiBvdmVycmlkZSBpcyBnaXZlbiBhbmQgdHJ1ZSwgdGhlIGNoZWNrIGZ1bmN0aW9uIHdpbGwgYmUgZ2l2ZW4KKwkJLy8JCWhpZ2hlc3QgcHJpb3JpdHkuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSB0aGUgbG93ZXN0IHByaW9yaXR5CisJCS8vCQlhZGFwdGVyLgorCisJCXZhciB0eXBlID0gKG92ZXJyaWRlKSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIjsKKwkJdGhpcy5wYWlyc1t0eXBlXShbbmFtZSwgY2hlY2ssIHdyYXAsIGRpcmVjdFJldHVybl0pOworCX0sCisKKwltYXRjaDogZnVuY3Rpb24oLyogLi4uICovKXsKKyAgICAvLyBzdW1tYXJ5OgorCQkvLwkJRmluZCBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiBubyBzdWl0YWJsZSBhZGFwdGVyCisJCS8vCQlpcyBmb3VuZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gbWF0Y2goKSBhY2NlcHRzIGFueSBudW1iZXIgb2YKKwkJLy8JCWFyZ3VtZW50cywgYWxsIG9mIHdoaWNoIGFyZSBwYXNzZWQgdG8gYWxsIG1hdGNoaW5nIGZ1bmN0aW9ucworCQkvLwkJZnJvbSB0aGUgcmVnaXN0ZXJlZCBwYWlycy4KKwkJZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFpcnMubGVuZ3RoOyBpKyspeworCQkJdmFyIHBhaXIgPSB0aGlzLnBhaXJzW2ldOworCQkJaWYocGFpclsxXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKXsKKwkJCQlpZigocGFpclszXSl8fCh0aGlzLnJldHVybldyYXBwZXJzKSl7CisJCQkJCXJldHVybiBwYWlyWzJdOworCQkJCX1lbHNleworCQkJCQlyZXR1cm4gcGFpclsyXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJCX0KKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgRXJyb3IoIk5vIG1hdGNoIGZvdW5kIik7CisJCS8vIGRvam8ucmFpc2UoIk5vIG1hdGNoIGZvdW5kIik7CisJfSwKKworCXVucmVnaXN0ZXI6IGZ1bmN0aW9uKG5hbWUpeworCQkvLyBzdW1tYXJ5OiBSZW1vdmUgYSBuYW1lZCBhZGFwdGVyIGZyb20gdGhlIHJlZ2lzdHJ5CisKKwkJLy8gRklYTUU6IHRoaXMgaXMga2luZCBvZiBhIGR1bWIgd2F5IHRvIGhhbmRsZSB0aGlzLiBPbiBhIGxhcmdlCisJCS8vIHJlZ2lzdHJ5IHRoaXMgd2lsbCBiZSBzbG93LWlzaCBhbmQgd2UgY2FuIHVzZSB0aGUgbmFtZSBhcyBhIGxvb2t1cAorCQkvLyBzaG91bGQgd2UgY2hvb3NlIHRvIHRyYWRlIG1lbW9yeSBmb3Igc3BlZWQuCisJCWZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhaXJzLmxlbmd0aDsgaSsrKXsKKwkJCXZhciBwYWlyID0gdGhpcy5wYWlyc1tpXTsKKwkJCWlmKHBhaXJbMF0gPT0gbmFtZSl7CisJCQkJdGhpcy5wYWlycy5zcGxpY2UoaSwgMSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ubGFuZy5yZXByIik7CisKKworCisKKworZG9qby5sYW5nLnJlcHJSZWdpc3RyeSA9IG5ldyBkb2pvLkFkYXB0ZXJSZWdpc3RyeSgpOworZG9qby5sYW5nLnJlZ2lzdGVyUmVwciA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lLCAvKkZ1bmN0aW9uKi9jaGVjaywgLypGdW5jdGlvbiovd3JhcCwgLypCb29sZWFuPyovb3ZlcnJpZGUpeworCS8vIHN1bW1hcnk6CisJLy8JUmVnaXN0ZXIgYSByZXByIGZ1bmN0aW9uLiAgcmVwciBmdW5jdGlvbnMgc2hvdWxkIHRha2UKKwkvLwlvbmUgYXJndW1lbnQgYW5kIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpdAorCS8vCXN1aXRhYmxlIGZvciBkZXZlbG9wZXJzLCBwcmltYXJpbHkgdXNlZCB3aGVuIGRlYnVnZ2luZy4KKwkvLworCS8vCUlmIG92ZXJyaWRlIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5CisJLy8JcmVwciwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgbG93ZXN0LgorCisJZG9qby5sYW5nLnJlcHJSZWdpc3RyeS5yZWdpc3RlcihuYW1lLCBjaGVjaywgd3JhcCwgb3ZlcnJpZGUpOworfTsKKworZG9qby5sYW5nLnJlcHIgPSBmdW5jdGlvbigvKk9iamVjdCovb2JqKXsKKwkvLyBzdW1tYXJ5OiBSZXR1cm4gYSAicHJvZ3JhbW1lciByZXByZXNlbnRhdGlvbiIgZm9yIGFuIG9iamVjdAorCS8vIGRlc2NyaXB0aW9uOiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBzdWl0YWJsZSBmb3IgZGV2ZWxvcGVycywgcHJpbWFyaWx5IHVzZWQgd2hlbiBkZWJ1Z2dpbmcKKworCWlmKHR5cGVvZihvYmopID09ICJ1bmRlZmluZWQiKXsKKwkJLy8gb2JqOiB1bmRlZmluZWQKKwkJcmV0dXJuICJ1bmRlZmluZWQiOyAvLyBTdHJpbmcKKwl9ZWxzZSBpZihvYmogPT09IG51bGwpeworCQkvLyBvYmo6IG51bGwKKwkJcmV0dXJuICJudWxsIjsgLy8gU3RyaW5nCisJfQorCisJdHJ5eworCQlpZih0eXBlb2Yob2JqWyJfX3JlcHJfXyJdKSA9PSAnZnVuY3Rpb24nKXsKKwkJCXJldHVybiBvYmpbIl9fcmVwcl9fIl0oKTsKKwkJfWVsc2UgaWYoKHR5cGVvZihvYmpbInJlcHIiXSkgPT0gJ2Z1bmN0aW9uJykmJihvYmoucmVwciAhPSBhcmd1bWVudHMuY2FsbGVlKSl7CisJCQlyZXR1cm4gb2JqWyJyZXByIl0oKTsKKwkJfQorCQlyZXR1cm4gZG9qby5sYW5nLnJlcHJSZWdpc3RyeS5tYXRjaChvYmopOworCX1jYXRjaChlKXsKKwkJaWYodHlwZW9mKG9iai5OQU1FKSA9PSAnc3RyaW5nJyAmJiAoCisJCQkJb2JqLnRvU3RyaW5nID09IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB8fAorCQkJCW9iai50b1N0cmluZyA9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nCisJCQkpKXsKKwkJCXJldHVybiBvYmouTkFNRTsgLy8gU3RyaW5nCisJCX0KKwl9CisKKwlpZih0eXBlb2Yob2JqKSA9PSAiZnVuY3Rpb24iKXsKKwkJLy8gb2JqOiBGdW5jdGlvbgorCQlvYmogPSAob2JqICsgIiIpLnJlcGxhY2UoL15ccysvLCAiIik7CisJCXZhciBpZHggPSBvYmouaW5kZXhPZigieyIpOworCQlpZihpZHggIT0gLTEpeworCQkJb2JqID0gb2JqLnN1YnN0cigwLCBpZHgpICsgInsuLi59IjsKKwkJfQorCX0KKwlyZXR1cm4gb2JqICsgIiI7IC8vIFN0cmluZworfQorCitkb2pvLmxhbmcucmVwckFycmF5TGlrZSA9IGZ1bmN0aW9uKC8qQXJyYXkqL2Fycil7CisJLy8gc3VtbWFyeTogTWFwcyBlYWNoIGVsZW1lbnQgb2YgYXJyIHRvIGRvam8ubGFuZy5yZXByIGFuZCBwcm92aWRlcyBvdXRwdXQgaW4gYW4gYXJyYXktbGlrZSBmb3JtYXQKKwkvLyBkZXNjcmlwdGlvbjogcmV0dXJucyBhbiBhcnJheS1saWtlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgc3VpdGFibGUgZm9yIGRldmVsb3BlcnMsIHByaW1hcmlseSB1c2VkIHdoZW4gZGVidWdnaW5nCisJdHJ5eworCQl2YXIgbmEgPSBkb2pvLmxhbmcubWFwKGFyciwgZG9qby5sYW5nLnJlcHIpOworCQlyZXR1cm4gIlsiICsgbmEuam9pbigiLCAiKSArICJdIjsgLy8gU3RyaW5nCisJfWNhdGNoKGUpeyB9Cit9OworCisoZnVuY3Rpb24oKXsKKwl2YXIgbSA9IGRvam8ubGFuZzsKKwltLnJlZ2lzdGVyUmVwcigiYXJyYXlMaWtlIiwgbS5pc0FycmF5TGlrZSwgbS5yZXByQXJyYXlMaWtlKTsKKwltLnJlZ2lzdGVyUmVwcigic3RyaW5nIiwgbS5pc1N0cmluZywgbS5yZXByU3RyaW5nKTsKKwltLnJlZ2lzdGVyUmVwcigibnVtYmVycyIsIG0uaXNOdW1iZXIsIG0ucmVwck51bWJlcik7CisJbS5yZWdpc3RlclJlcHIoImJvb2xlYW4iLCBtLmlzQm9vbGVhbiwgbS5yZXByTnVtYmVyKTsKKwkvLyBtLnJlZ2lzdGVyUmVwcigibnVtYmVycyIsIG0udHlwZU1hdGNoZXIoIm51bWJlciIsICJib29sZWFuIiksIG0ucmVwck51bWJlcik7Cit9KSgpOworCitkb2pvLmt3Q29tcG91bmRSZXF1aXJlKHsKKwljb21tb246IFsKKwkJImRvam8ubGFuZy5jb21tb24iLAorCQkiZG9qby5sYW5nLmFzc2VydCIsCisJCSJkb2pvLmxhbmcuYXJyYXkiLAorCQkiZG9qby5sYW5nLnR5cGUiLAorCQkiZG9qby5sYW5nLmZ1bmMiLAorCQkiZG9qby5sYW5nLmV4dHJhcyIsCisJCSJkb2pvLmxhbmcucmVwciIsCisJCSJkb2pvLmxhbmcuZGVjbGFyZSIKKwldCit9KTsKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLioiKTsKKworZG9qby5wcm92aWRlKCJkb2pvLmh0bWwuaWZyYW1lIik7CisKKworLy8gdGhhbmtzIGJ1cnN0bGliIQorZG9qby5odG1sLmlmcmFtZUNvbnRlbnRXaW5kb3cgPSBmdW5jdGlvbigvKiBIVE1MSUZyYW1lRWxlbWVudCAqL2lmcmFtZV9lbCkgeworCS8vCXN1bW1hcnkKKwkvLwlyZXR1cm5zIHRoZSB3aW5kb3cgcmVmZXJlbmNlIG9mIHRoZSBwYXNzZWQgaWZyYW1lCisJdmFyIHdpbiA9IGRvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyhkb2pvLmh0bWwuaWZyYW1lQ29udGVudERvY3VtZW50KGlmcmFtZV9lbCkpIHx8CisJCS8vIE1vei4gVE9ETzogaXMgdGhpcyBhdmFpbGFibGUgd2hlbiBkZWZhdWx0VmlldyBpc24ndD8KKwkJZG9qby5odG1sLmlmcmFtZUNvbnRlbnREb2N1bWVudChpZnJhbWVfZWwpLl9fcGFyZW50X18gfHwKKwkJKGlmcmFtZV9lbC5uYW1lICYmIGRvY3VtZW50LmZyYW1lc1tpZnJhbWVfZWwubmFtZV0pIHx8IG51bGw7CisJcmV0dXJuIHdpbjsJLy8JV2luZG93Cit9CisKK2Rvam8uaHRtbC5pZnJhbWVDb250ZW50RG9jdW1lbnQgPSBmdW5jdGlvbigvKiBIVE1MSUZyYW1lRWxlbWVudCAqL2lmcmFtZV9lbCl7CisJLy8Jc3VtbWFyeQorCS8vCXJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IG9iamVjdCBpbnNpZGUgaWZyYW1lX2VsCisJdmFyIGRvYyA9IGlmcmFtZV9lbC5jb250ZW50RG9jdW1lbnQgLy8gVzMKKwkJfHwgKChpZnJhbWVfZWwuY29udGVudFdpbmRvdykmJihpZnJhbWVfZWwuY29udGVudFdpbmRvdy5kb2N1bWVudCkpCS8vIElFCisJCXx8ICgoaWZyYW1lX2VsLm5hbWUpJiYoZG9jdW1lbnQuZnJhbWVzW2lmcmFtZV9lbC5uYW1lXSkmJihkb2N1bWVudC5mcmFtZXNbaWZyYW1lX2VsLm5hbWVdLmRvY3VtZW50KSkgCisJCXx8IG51bGw7CisJcmV0dXJuIGRvYzsJLy8JSFRNTERvY3VtZW50Cit9CisKK2Rvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lID0gZnVuY3Rpb24oLyogSFRNTEVsZW1lbnQgKi9ub2RlKSB7CisJLy8Jc3VtbWFyeQorCS8vCUZvciBJRSB6LWluZGV4IHNjaGVuYW5pZ2FucworCS8vCVR3byBwb3NzaWJsZSB1c2VzOgorCS8vCTEuIG5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZShub2RlKQorCS8vCQlNYWtlcyBhIGJhY2tncm91bmQgaWZyYW1lIGFzIGEgY2hpbGQgb2Ygbm9kZSwgdGhhdCBmaWxscyBhcmVhIChhbmQgcG9zaXRpb24pIG9mIG5vZGUKKwkvLwkyLiBuZXcgZG9qby5odG1sLkJhY2tncm91bmRJZnJhbWUoKQorCS8vCQlBdHRhY2hlcyBmcmFtZSB0byBkb2pvLmJvZHkoKS4gIFVzZXIgbXVzdCBjYWxsIHNpemUoKSB0byBzZXQgc2l6ZS4KKwlpZihkb2pvLnJlbmRlci5odG1sLmllNTUgfHwgZG9qby5yZW5kZXIuaHRtbC5pZTYwKSB7CisJCXZhciBodG1sPSI8aWZyYW1lIHNyYz0namF2YXNjcmlwdDpmYWxzZSciCisJCQkrICIgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMHB4OyB0b3A6IDBweDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsiCisJCQkrICJ6LWluZGV4OiAtMTsgZmlsdGVyOkFscGhhKE9wYWNpdHk9XCIwXCIpOycgIgorCQkJKyAiPiI7CisJCXRoaXMuaWZyYW1lID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KGh0bWwpOworCQl0aGlzLmlmcmFtZS50YWJJbmRleCA9IC0xOyAvLyBNYWdpYyB0byBwcmV2ZW50IGlmcmFtZSBmcm9tIGdldHRpbmcgZm9jdXMgb24gdGFiIGtleXByZXNzIC0gYXMgc3R5bGUgZGlkbnQgd29yay4KKwkJaWYobm9kZSl7CisJCQlub2RlLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwkJCXRoaXMuZG9tTm9kZT1ub2RlOworCQl9ZWxzZXsKKwkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lKTsKKwkJCXRoaXMuaWZyYW1lLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworCQl9CisJfQorfQorZG9qby5sYW5nLmV4dGVuZChkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSwgeworCWlmcmFtZTogbnVsbCwKKwlvblJlc2l6ZWQ6IGZ1bmN0aW9uKCl7CisJCS8vCXN1bW1hcnkKKwkJLy8JUmVzaXplIGV2ZW50IGhhbmRsZXIuCisJCS8vIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBidXQgc2V0dGluZyB3aWR0aD1oZWlnaHQ9MTAwJSBkb2Vzbid0IHdvcmshCisJCWlmKHRoaXMuaWZyYW1lICYmIHRoaXMuZG9tTm9kZSAmJiB0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSl7IC8vIE5vIHBhcmVudEVsZW1lbnQgaWYgb25SZXNpemVkKCkgdGltZW91dCBldmVudCBvY2N1cnMgb24gYSByZW1vdmVkIGRvbW5vZGUKKwkJCXZhciBvdXRlciA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKKwkJCWlmIChvdXRlci53aWR0aCAgPT0gMCB8fCBvdXRlci5oZWlnaHQgPT0gMCApeworCQkJCWRvam8ubGFuZy5zZXRUaW1lb3V0KHRoaXMsIHRoaXMub25SZXNpemVkLCAxMDApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXMuaWZyYW1lLnN0eWxlLndpZHRoID0gb3V0ZXIud2lkdGggKyAicHgiOworCQkJdGhpcy5pZnJhbWUuc3R5bGUuaGVpZ2h0ID0gb3V0ZXIuaGVpZ2h0ICsgInB4IjsKKwkJfQorCX0sCisKKwlzaXplOiBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpIHsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgaWZyYW1lIGlzIGNvbm5lY3RlZCB0byBkb2pvLmJvZHkoKQorCQkvLwkJcmF0aGVyIHRoYW4gdGhlIG5vZGUgYmVpbmcgc2hhZG93ZWQgCisKKwkJLy8JKFRPRE86IGVyYXNlKQorCQlpZighdGhpcy5pZnJhbWUpeyByZXR1cm47IH0KKwkJdmFyIGNvb3JkcyA9IGRvam8uaHRtbC50b0Nvb3JkaW5hdGVPYmplY3Qobm9kZSwgdHJ1ZSwgZG9qby5odG1sLmJveFNpemluZy5CT1JERVJfQk9YKTsKKwkJd2l0aCh0aGlzLmlmcmFtZS5zdHlsZSl7CisJCQl3aWR0aCA9IGNvb3Jkcy53aWR0aCArICJweCI7CisJCQloZWlnaHQgPSBjb29yZHMuaGVpZ2h0ICsgInB4IjsKKwkJCWxlZnQgPSBjb29yZHMubGVmdCArICJweCI7CisJCQl0b3AgPSBjb29yZHMudG9wICsgInB4IjsKKwkJfQorCX0sCisKKwlzZXRaSW5kZXg6IGZ1bmN0aW9uKC8qIEhUTUxFbGVtZW50ICovbm9kZSl7CisJCS8vCXN1bW1hcnkKKwkJLy8JU2V0cyB0aGUgei1pbmRleCBvZiB0aGUgYmFja2dyb3VuZCBpZnJhbWUuCisJCWlmKCF0aGlzLmlmcmFtZSl7IHJldHVybjsgfQorCQlpZihkb2pvLmRvbS5pc05vZGUobm9kZSkpeworCQkJdGhpcy5pZnJhbWUuc3R5bGUuekluZGV4ID0gZG9qby5odG1sLmdldFN0eWxlKG5vZGUsICJ6LWluZGV4IikgLSAxOworCQl9ZWxzZSBpZighaXNOYU4obm9kZSkpeworCQkJdGhpcy5pZnJhbWUuc3R5bGUuekluZGV4ID0gbm9kZTsKKwkJfQorCX0sCisKKwlzaG93OiBmdW5jdGlvbigpeworCQkvLwlzdW1tYXJ5OgorCQkvLwkJc2hvdyB0aGUgaWZyYW1lCisJCWlmKHRoaXMuaWZyYW1lKXsgCisJCQl0aGlzLmlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwkJfQorCX0sCisKKwloaWRlOiBmdW5jdGlvbigpeworCQkvLwlzdW1tYXJ5OgorCQkvLwkJaGlkZSB0aGUgaWZyYW1lCisJCWlmKHRoaXMuaWZyYW1lKXsgCisJCQl0aGlzLmlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQl9CisJfSwKKworCXJlbW92ZTogZnVuY3Rpb24oKXsKKwkJLy8Jc3VtbWFyeToKKwkJLy8JCXJlbW92ZSB0aGUgaWZyYW1lCisJCWlmKHRoaXMuaWZyYW1lKXsKKwkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuaWZyYW1lLCB0cnVlKTsKKwkJCWRlbGV0ZSB0aGlzLmlmcmFtZTsKKwkJCXRoaXMuaWZyYW1lPW51bGw7CisJCX0KKwl9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lciIpOworCisKKworCisKKworCisKKworZG9qby5kZWNsYXJlKAorCSJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lckJhc2UiLAorCW51bGwsCisJZnVuY3Rpb24oKXsKKwkJdGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoID0gW107CisJfSwKK3sKKwkvLyBzdW1tYXJ5OgorCS8vCQlQb3B1cENvbnRhaW5lckJhc2UgaXMgdGhlIG1peGluIGNsYXNzIHdoaWNoIHByb3ZpZGUgcG9wdXAgYmVoYXZpb3JzOgorCS8vCQlpdCBjYW4gb3BlbiBpbiBhIGdpdmVuIHBvc2l0aW9uIHgseSBvciBhcm91bmQgYSBnaXZlbiBub2RlLgorCS8vCQlJbiBhZGRpdGlvbiwgaXQgaGFuZGxlcyBhbmltYXRpb24gYW5kIElFIGJsZWVkIHRocm91Z2ggd29ya2Fyb3VuZC4KKwkvLyBkZXNjcmlwdGlvbjoKKwkvLwkJVGhpcyBjbGFzcyBjYW4gbm90IGJlIHVzZWQgc3RhbmRhbG9uZTogaXQgc2hvdWxkIGJlIG1peGVkLWluIHRvIGEKKwkvLwkJZG9qby53aWRnZXQuSHRtbFdpZGdldC4gVXNlIFBvcHVwQ29udGFpbmVyIGluc3RlYWQgaWYgeW91IHdhbnQgYQorCS8vCQlhIHN0YW5kYWxvbmUgcG9wdXAgd2lkZ2V0CisKKwkvLyBpc1Nob3dpbmdOb3c6IEJvb2xlYW46IHdoZXRoZXIgdGhpcyBwb3B1cCBpcyBzaG93bgorCWlzU2hvd2luZ05vdzogZmFsc2UsCisKKwkvLyBjdXJyZW50U3VicG9wdXA6IFdpZGdldDogdGhlIHNob3duIHN1YiBwb3B1cCBpZiBhbnkKKwljdXJyZW50U3VicG9wdXA6IG51bGwsCisKKwkvLyBiZWdpblpJbmRleDogSW50ZWdlcjogdGhlIG1pbmltYWwgcG9wdXAgekluZGV4CisJYmVnaW5aSW5kZXg6IDEwMDAsCisKKwkvLyBwYXJlbnRQb3B1cDogV2lkZ2V0OiBwYXJlbnQgcG9wdXAgd2lkZ2V0CisJcGFyZW50UG9wdXA6IG51bGwsCisKKwkvLyBwYXJlbnQ6IFdpZGdldDogdGhlIHdpZGdldCB0aGF0IGNhdXNlZCBtZSB0byBiZSBkaXNwbGF5ZWQ7IHRoZSBsb2dpY2FsIHBhcmVudC4KKwlwYXJlbnQ6IG51bGwsCisKKwkvLyBwb3B1cEluZGV4OiBJbnRlZ2VyOiBsZXZlbCBvZiBzdWIgcG9wdXAKKwlwb3B1cEluZGV4OiAwLAorCisJLy8gYXJvdW5kQm94OiBkb2pvLmh0bWwuYm94U2l6aW5nOiB3aGljaCBib3VuZGluZyBib3ggdG8gdXNlIGZvciBvcGVuIGFyb3VuZE5vZGUuIEJ5IGRlZmF1bHQgdXNlIEJPUkRFUiBib3ggb2YgdGhlIGFyb3VuZE5vZGUKKwlhcm91bmRCb3g6IGRvam8uaHRtbC5ib3hTaXppbmcuQk9SREVSX0JPWCwKKworCS8vIG9wZW5lZEZvcldpbmRvdzogT2JqZWN0OiBpbiB3aGljaCB3aW5kb3cgdGhlIG9wZW4oKSBpcyB0cmlnZ2VyZWQKKwlvcGVuZWRGb3JXaW5kb3c6IG51bGwsCisKKwlwcm9jZXNzS2V5OiBmdW5jdGlvbigvKkV2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OiBrZXkgZXZlbnQgaGFuZGxlcgorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWFwcGx5UG9wdXBCYXNpY1N0eWxlOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBhcHBseSBuZWNlc3NhcnkgY3NzIHJ1bGVzIHRvIHRoZSB0b3AgZG9tTm9kZQorCQkvLyBkZXNjcmlwdGlvbjoKKwkJLy8JCXRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBpbiBzdWIgY2xhc3Mgd2hlcmUgYSBjdXN0b20KKwkJLy8JCXRlbXBsYXRlU3RyaW5nL3RlbXBsYXRlU3RyaW5nUGF0aCBpcyB1c2VkIChzZWUgVG9vbHRpcCB3aWRnZXQpCisJCXdpdGgodGhpcy5kb21Ob2RlLnN0eWxlKXsKKwkJCWRpc3BsYXkgPSAnbm9uZSc7CisJCQlwb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCX0KKwl9LAorCisJYWJvdXRUb1Nob3c6IGZ1bmN0aW9uKCkgeworCQkvLyBzdW1tYXJ5OiBjb25uZWN0IHRvIHRoaXMgc3R1YiB0byBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcHVwCisJfSwKKworCW9wZW46IGZ1bmN0aW9uKC8qSW50ZWdlcioveCwgLypJbnRlZ2VyKi95LCAvKkRvbU5vZGUqL3BhcmVudCwgLypPYmplY3QqL2V4cGxvZGVTcmMsIC8qU3RyaW5nPyovb3JpZW50LCAvKkFycmF5PyovcGFkZGluZyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlPcGVuIHRoZSBwb3B1cCBhdCBwb3NpdGlvbiAoeCx5KSwgcmVsYXRpdmUgdG8gZG9qby5ib2R5KCkKKwkgCS8vCQlPciBvcGVuKG5vZGUsIHBhcmVudCwgZXhwbG9kZVNyYywgYXJvdW5kT3JpZW50KSB0byBvcGVuCisJIAkvLwkJYXJvdW5kIG5vZGUKKwkJaWYgKHRoaXMuaXNTaG93aW5nTm93KXsgcmV0dXJuOyB9CisKKwkJLy8gaWYgSSBjbGljayByaWdodCBidXR0b24gYW5kIG1lbnUgaXMgb3BlbmVkLCB0aGVuIGl0IGdldHMgMiBjb21tYW5kczogY2xvc2UgLT4gb3BlbgorCQkvLyBzbyBjbG9zZSBlbmFibGVzIGFuaW1hdGlvbiBhbmQgbmV4dCAib3BlbiIgaXMgcHV0IHRvIHF1ZXVlIHRvIG9jY3VyIGF0IG5ldyBsb2NhdGlvbgorCQlpZih0aGlzLmFuaW1hdGlvbkluUHJvZ3Jlc3MpeworCQkJdGhpcy5xdWV1ZU9uQW5pbWF0aW9uRmluaXNoLnB1c2godGhpcy5vcGVuLCBhcmd1bWVudHMpOworCQkJcmV0dXJuOworCQl9CisKKwkJdGhpcy5hYm91dFRvU2hvdygpOworCisJCXZhciBhcm91bmQgPSBmYWxzZSwgbm9kZSwgYXJvdW5kT3JpZW50OworCQlpZih0eXBlb2YgeCA9PSAnb2JqZWN0Jyl7CisJCQlub2RlID0geDsKKwkJCWFyb3VuZE9yaWVudCA9IGV4cGxvZGVTcmM7CisJCQlleHBsb2RlU3JjID0gcGFyZW50OworCQkJcGFyZW50ID0geTsKKwkJCWFyb3VuZCA9IHRydWU7CisJCX0KKworCQkvLyBzYXZlIHRoaXMgc28gdGhhdCB0aGUgZm9jdXMgY2FuIGJlIHJldHVybmVkCisJCXRoaXMucGFyZW50ID0gcGFyZW50OworCisJCS8vIGZvciB1bmtub3duIHJlYXNvbnMgZXZlbiBpZiB0aGUgZG9tTm9kZSBpcyBhdHRhY2hlZCB0byB0aGUgYm9keSBpbiBwb3N0Q3JlYXRlKCksCisJCS8vIGl0J3Mgbm90IGF0dGFjaGVkIGhlcmUsIHNvIGhhdmUgdG8gYXR0YWNoIGl0IGhlcmUuCisJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRoaXMuZG9tTm9kZSk7CisKKwkJLy8gaWYgZXhwbG9kZVNyYyBpc24ndCBzcGVjaWZpZWQgdGhlbiBleHBsb2RlIGZyb20gbXkgcGFyZW50IHdpZGdldAorCQlleHBsb2RlU3JjID0gZXhwbG9kZVNyYyB8fCBwYXJlbnRbImRvbU5vZGUiXSB8fCBbXTsKKworCQkvL2tlZXAgdHJhY2sgb2YgcGFyZW50IHBvcHVwIHRvIGRlY2lkZWQgd2hldGhlciB0aGlzIGlzIGEgdG9wIGxldmVsIHBvcHVwCisJCXZhciBwYXJlbnRQb3B1cCA9IG51bGw7CisJCXRoaXMuaXNUb3BMZXZlbCA9IHRydWU7CisJCXdoaWxlKHBhcmVudCl7CisJCQlpZihwYXJlbnQgIT09IHRoaXMgJiYgKHBhcmVudC5zZXRPcGVuZWRTdWJwb3B1cCAhPSB1bmRlZmluZWQgJiYgcGFyZW50LmFwcGx5UG9wdXBCYXNpY1N0eWxlICE9IHVuZGVmaW5lZCkpeworCQkJCXBhcmVudFBvcHVwID0gcGFyZW50OworCQkJCXRoaXMuaXNUb3BMZXZlbCA9IGZhbHNlOworCQkJCXBhcmVudFBvcHVwLnNldE9wZW5lZFN1YnBvcHVwKHRoaXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudDsKKwkJfQorCisJCXRoaXMucGFyZW50UG9wdXAgPSBwYXJlbnRQb3B1cDsKKwkJdGhpcy5wb3B1cEluZGV4ID0gcGFyZW50UG9wdXAgPyBwYXJlbnRQb3B1cC5wb3B1cEluZGV4ICsgMSA6IDE7CisKKwkJaWYodGhpcy5pc1RvcExldmVsKXsKKwkJCXZhciBidXR0b24gPSBkb2pvLmh0bWwuaXNOb2RlKGV4cGxvZGVTcmMpID8gZXhwbG9kZVNyYyA6IG51bGw7CisJCQlkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIub3BlbmVkKHRoaXMsIGJ1dHRvbik7CisJCX0KKworCQkvL1N0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgcmVzdG9yZSBpdCBiZWZvcmUgdGhlIGFjdGlvbiBmb3IgYSBtZW51IGl0ZW0KKwkJLy9pcyBleGVjdXRlZC4gVGhpcyBpcyByZXF1aXJlZCBhcyBjbGlja2luZyBvbiBhbiBtZW51IGl0ZW0gZGVzZWxlY3RzIGN1cnJlbnQgc2VsZWN0aW9uCisJCWlmKHRoaXMuaXNUb3BMZXZlbCAmJiAhZG9qby53aXRoR2xvYmFsKHRoaXMub3BlbmVkRm9yV2luZG93fHxkb2pvLmdsb2JhbCgpLCBkb2pvLmh0bWwuc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSl7CisJCQl0aGlzLl9ib29rbWFyayA9IGRvam8ud2l0aEdsb2JhbCh0aGlzLm9wZW5lZEZvcldpbmRvd3x8ZG9qby5nbG9iYWwoKSwgZG9qby5odG1sLnNlbGVjdGlvbi5nZXRCb29rbWFyayk7CisJCX1lbHNleworCQkJdGhpcy5fYm9va21hcmsgPSBudWxsOworCQl9CisKKwkJLy9jb252ZXJ0IGV4cGxvZGVTcmMgZnJvbSBmb3JtYXQgW3gsIHldIHRvCisJCS8ve2xlZnQ6IHgsIHRvcDogeSwgd2lkdGg6IDAsIGhlaWdodDogMH0gd2hpY2ggaXMgdGhlIG5ldworCQkvL2Zvcm1hdCByZXF1aXJlZCBieSBkb2pvLmh0bWwudG9Db29yZGluYXRlT2JqZWN0CisJCWlmKGV4cGxvZGVTcmMgaW5zdGFuY2VvZiBBcnJheSl7CisJCQlleHBsb2RlU3JjID0ge2xlZnQ6IGV4cGxvZGVTcmNbMF0sIHRvcDogZXhwbG9kZVNyY1sxXSwgd2lkdGg6IDAsIGhlaWdodDogMH07CisJCX0KKworCQkvLyBkaXNwbGF5IHRlbXBvcmFyaWx5LCBhbmQgbW92ZSBpbnRvIHBvc2l0aW9uLCB0aGVuIGhpZGUgYWdhaW4KKwkJd2l0aCh0aGlzLmRvbU5vZGUuc3R5bGUpeworCQkJZGlzcGxheT0iIjsKKwkJCXpJbmRleCA9IHRoaXMuYmVnaW5aSW5kZXggKyB0aGlzLnBvcHVwSW5kZXg7CisJCX0KKworCQlpZihhcm91bmQpeworCQkJdGhpcy5tb3ZlKG5vZGUsIHBhZGRpbmcsIGFyb3VuZE9yaWVudCk7CisJCX1lbHNleworCQkJdGhpcy5tb3ZlKHgsIHksIHBhZGRpbmcsIG9yaWVudCk7CisJCX0KKwkJdGhpcy5kb21Ob2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworCisJCXRoaXMuZXhwbG9kZVNyYyA9IGV4cGxvZGVTcmM7CisKKwkJLy8gdGhlbiB1c2UgdGhlIHVzZXIgZGVmaW5lZCBtZXRob2QgdG8gZGlzcGxheSBpdAorCQl0aGlzLnNob3coKTsKKworCQl0aGlzLmlzU2hvd2luZ05vdyA9IHRydWU7CisJfSwKKworCS8vIFRPRE9DOiBtb3ZlKG5vZGUsIHBhZGRpbmcsIGFyb3VuZE9yaWVudCkgaG93IHRvIGRvIHRoaXM/CisJbW92ZTogZnVuY3Rpb24oLypJbnQqL3gsIC8qSW50Ki95LCAvKkludGVnZXI/Ki9wYWRkaW5nLCAvKlN0cmluZz8qL29yaWVudCl7CisJCS8vIHN1bW1hcnk6IGNhbGN1bGF0ZSB3aGVyZSB0byBwbGFjZSB0aGUgcG9wdXAKKworCQl2YXIgYXJvdW5kID0gKHR5cGVvZiB4ID09ICJvYmplY3QiKTsKKwkJaWYoYXJvdW5kKXsKKwkJCXZhciBhcm91bmRPcmllbnQ9cGFkZGluZzsKKwkJCXZhciBub2RlPXg7CisJCQlwYWRkaW5nPXk7CisJCQlpZighYXJvdW5kT3JpZW50KXsgLy9CeSBkZWZhdWx0LCBhdHRlbXB0IHRvIG9wZW4gYWJvdmUgdGhlIGFyb3VuZE5vZGUsIG9yIGJlbG93CisJCQkJYXJvdW5kT3JpZW50ID0geydCTCc6ICdUTCcsICdUTCc6ICdCTCd9OworCQkJfQorCQkJZG9qby5odG1sLnBsYWNlT25TY3JlZW5Bcm91bmRFbGVtZW50KHRoaXMuZG9tTm9kZSwgbm9kZSwgcGFkZGluZywgdGhpcy5hcm91bmRCb3gsIGFyb3VuZE9yaWVudCk7CisJCX1lbHNleworCQkJaWYoIW9yaWVudCl7IG9yaWVudCA9ICdUTCxUUixCTCxCUic7fQorCQkJZG9qby5odG1sLnBsYWNlT25TY3JlZW4odGhpcy5kb21Ob2RlLCB4LCB5LCBwYWRkaW5nLCB0cnVlLCBvcmllbnQpOworCQl9CisJfSwKKworCWNsb3NlOiBmdW5jdGlvbigvKkJvb2xlYW4/Ki9mb3JjZSl7CisJCS8vIHN1bW1hcnk6IGhpZGUgdGhlIHBvcHVwCisJCWlmKGZvcmNlKXsKKwkJCXRoaXMuZG9tTm9kZS5zdHlsZS5kaXNwbGF5PSJub25lIjsKKwkJfQorCisJCS8vIElmIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBvcGVuaW5nIHRoZSBtZW51IGFuZCB3ZSBhcmUgYXNrZWQgdG8gY2xvc2UgaXQKKwkJaWYodGhpcy5hbmltYXRpb25JblByb2dyZXNzKXsKKwkJCXRoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaC5wdXNoKHRoaXMuY2xvc2UsIFtdKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRoaXMuY2xvc2VTdWJwb3B1cChmb3JjZSk7CisJCXRoaXMuaGlkZSgpOworCQlpZih0aGlzLmJnSWZyYW1lKXsKKwkJCXRoaXMuYmdJZnJhbWUuaGlkZSgpOworCQkJdGhpcy5iZ0lmcmFtZS5zaXplKHtsZWZ0OiAwLCB0b3A6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDB9KTsKKwkJfQorCQlpZih0aGlzLmlzVG9wTGV2ZWwpeworCQkJZG9qby53aWRnZXQuUG9wdXBNYW5hZ2VyLmNsb3NlZCh0aGlzKTsKKwkJfQorCQl0aGlzLmlzU2hvd2luZ05vdyA9IGZhbHNlOworCQkvLyByZXR1cm4gZm9jdXMgdG8gdGhlIHdpZGdldCB0aGF0IG9wZW5lZCB0aGUgbWVudQorCisJCWlmKHRoaXMucGFyZW50KXsKKwkJCXNldFRpbWVvdXQoCisJCQkJZG9qby5sYW5nLmhpdGNoKHRoaXMsIAorCQkJCQlmdW5jdGlvbigpeworCQkJCQkJdHJ5eworCQkJCQkJCWlmKHRoaXMucGFyZW50Wydmb2N1cyddKXsKKwkJCQkJCQkJdGhpcy5wYXJlbnQuZm9jdXMoKTsKKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJdGhpcy5wYXJlbnQuZG9tTm9kZS5mb2N1cygpOyAKKwkJCQkJCQl9CisJCQkJCQl9Y2F0Y2goZSl7ZG9qby5kZWJ1ZygiTm8gaWRlYSBob3cgdG8gZm9jdXMgdG8gcGFyZW50IiwgZSk7fQorCQkJCQl9CisJCQkJKSwKKwkJCQkxMAorCQkJKTsKKwkJfQorCisKKwkJLy9kbyBub3QgbmVlZCB0byByZXN0b3JlIGlmIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG5vdCBlbXB0eQorCQkvLyh1c2Uga2V5Ym9hcmQgdG8gc2VsZWN0IGEgbWVudSBpdGVtKQorCQlpZih0aGlzLl9ib29rbWFyayAmJiBkb2pvLndpdGhHbG9iYWwodGhpcy5vcGVuZWRGb3JXaW5kb3d8fGRvam8uZ2xvYmFsKCksIGRvam8uaHRtbC5zZWxlY3Rpb24uaXNDb2xsYXBzZWQpKXsKKwkJCWlmKHRoaXMub3BlbmVkRm9yV2luZG93KXsKKwkJCQl0aGlzLm9wZW5lZEZvcldpbmRvdy5mb2N1cygpCisJCQl9CisJCQl0cnl7CisJCQkJZG9qby53aXRoR2xvYmFsKHRoaXMub3BlbmVkRm9yV2luZG93fHxkb2pvLmdsb2JhbCgpLCAibW92ZVRvQm9va21hcmsiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5fYm9va21hcmtdKTsKKwkJCX1jYXRjaChlKXsKKwkJCQkvKnNxdWVsY2ggSUUgaW50ZXJuYWwgZXJyb3IsIHNlZSBodHRwOi8vdHJhYy5kb2pvdG9vbGtpdC5vcmcvdGlja2V0LzE5ODQgKi8KKwkJCX0KKwkJfQorCQl0aGlzLl9ib29rbWFyayA9IG51bGw7CisJfSwKKworCWNsb3NlQWxsOiBmdW5jdGlvbigvKkJvb2xlYW4/Ki9mb3JjZSl7CisJCS8vIHN1bW1hcnk6IGhpZGUgYWxsIHBvcHVwcyBpbmNsdWRpbmcgc3ViIG9uZXMKKwkJaWYgKHRoaXMucGFyZW50UG9wdXApeworCQkJdGhpcy5wYXJlbnRQb3B1cC5jbG9zZUFsbChmb3JjZSk7CisJCX1lbHNleworCQkJdGhpcy5jbG9zZShmb3JjZSk7CisJCX0KKwl9LAorCisJc2V0T3BlbmVkU3VicG9wdXA6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki9wb3B1cCkgeworCQkvLyBzdW1tYXJ5OiB1c2VkIGJ5IHN1YiBwb3B1cCB0byBzZXQgY3VycmVudFN1YnBvcHVwIGluIHRoZSBwYXJlbnQgcG9wdXAKKwkJdGhpcy5jdXJyZW50U3VicG9wdXAgPSBwb3B1cDsKKwl9LAorCisJY2xvc2VTdWJwb3B1cDogZnVuY3Rpb24oLypCb29sZWFuPyovZm9yY2UpIHsKKwkJLy8gc3VtbWFyeTogY2xvc2Ugb3BlbmVkIHN1YiBwb3B1cAorCQlpZih0aGlzLmN1cnJlbnRTdWJwb3B1cCA9PSBudWxsKXsgcmV0dXJuOyB9CisKKwkJdGhpcy5jdXJyZW50U3VicG9wdXAuY2xvc2UoZm9yY2UpOworCQl0aGlzLmN1cnJlbnRTdWJwb3B1cCA9IG51bGw7CisJfSwKKworCW9uU2hvdzogZnVuY3Rpb24oKSB7CisJCWRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyLnN1cGVyY2xhc3Mub25TaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCS8vIFdpdGggc29tZSBhbmltYXRpb24gKHdpcGUpLCBhZnRlciBjbG9zZSwgdGhlIHNpemUgb2YgdGhlIGRvbW5vZGUgaXMgMAorCQkvLyBhbmQgbmV4dCB0aW1lIHdoZW4gc2hvd24sIHRoZSBvcGVuKCkgZnVuY3Rpb24gY2FuIG5vdCBkZXRlcm1pbmUKKwkJLy8gdGhlIGNvcnJlY3QgcGxhY2UgdG8gcG9wdXAsIHNvIHdlIHN0b3JlIHRoZSBvcGVuZWQgc2l6ZSBoZXJlIGFuZAorCQkvLyBzZXQgaXQgYWZ0ZXIgY2xvc2UgKGluIGZ1bmN0aW9uIG9uSGlkZSgpKQorCQl0aGlzLm9wZW5lZFNpemU9e3c6IHRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCwgaDogdGhpcy5kb21Ob2RlLnN0eWxlLmhlaWdodH07CisJCS8vIHByZXZlbnQgSUUgYmxlZWQgdGhyb3VnaAorCQlpZihkb2pvLnJlbmRlci5odG1sLmllKXsKKwkJCWlmKCF0aGlzLmJnSWZyYW1lKXsKKwkJCQl0aGlzLmJnSWZyYW1lID0gbmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKCk7CisJCQkJdGhpcy5iZ0lmcmFtZS5zZXRaSW5kZXgodGhpcy5kb21Ob2RlKTsKKwkJCX0KKworCQkJdGhpcy5iZ0lmcmFtZS5zaXplKHRoaXMuZG9tTm9kZSk7CisJCQl0aGlzLmJnSWZyYW1lLnNob3coKTsKKwkJfQorCQl0aGlzLnByb2Nlc3NRdWV1ZSgpOworCX0sCisKKwlwcm9jZXNzUXVldWU6IGZ1bmN0aW9uKCkgeworCQkvLyBzdW1tYXJ5OiBkbyBldmVudHMgZnJvbSBxdWV1ZQorCQlpZiAoIXRoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaC5sZW5ndGgpIHJldHVybjsKKworCQl2YXIgZnVuYyA9IHRoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaC5zaGlmdCgpOworCQl2YXIgYXJncyA9IHRoaXMucXVldWVPbkFuaW1hdGlvbkZpbmlzaC5zaGlmdCgpOworCisJCWZ1bmMuYXBwbHkodGhpcywgYXJncyk7CisJfSwKKworCW9uSGlkZTogZnVuY3Rpb24oKSB7CisJCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQucHJvdG90eXBlLm9uSGlkZS5jYWxsKHRoaXMpOworCisJCS8vcmVzdG9yZSBzaXplIG9mIHRoZSBkb21ub2RlLCBzZWUgY29tbWVudCBpbgorCQkvL2Z1bmN0aW9uIG9uU2hvdygpCisJCWlmKHRoaXMub3BlbmVkU2l6ZSl7CisJCQl3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7CisJCQkJd2lkdGg9dGhpcy5vcGVuZWRTaXplLnc7CisJCQkJaGVpZ2h0PXRoaXMub3BlbmVkU2l6ZS5oOworCQkJfQorCQl9CisKKwkJdGhpcy5wcm9jZXNzUXVldWUoKTsKKwl9Cit9KTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorCSJkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lciIsCisJW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyQmFzZV0sIHsKKwkJLy8gc3VtbWFyeTogZG9qby53aWRnZXQuUG9wdXBDb250YWluZXIgaXMgdGhlIHdpZGdldCB2ZXJzaW9uIG9mIGRvam8ud2lkZ2V0LlBvcHVwQ29udGFpbmVyQmFzZQorCQlpc0NvbnRhaW5lcjogdHJ1ZSwKKwkJZmlsbEluVGVtcGxhdGU6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLmFwcGx5UG9wdXBCYXNpY1N0eWxlKCk7CisJCQlkb2pvLndpZGdldC5Qb3B1cENvbnRhaW5lci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwl9KTsKKworCitkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIgPSBuZXcgZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5OgorCS8vCQl0aGUgcG9wdXAgbWFuYWdlciBtYWtlcyBzdXJlIHdlIGRvbid0IGhhdmUgc2V2ZXJhbCBwb3B1cHMKKwkvLwkJb3BlbiBhdCBvbmNlLiB0aGUgcm9vdCBwb3B1cCBpbiBhbiBvcGVuaW5nIHNlcXVlbmNlIGNhbGxzCisJLy8JCW9wZW5lZCgpLiB3aGVuIGEgcm9vdCBtZW51IGNsb3NlcyBpdCBjYWxscyBjbG9zZWQoKS4gdGhlbgorCS8vCQlldmVyeXRoaW5nIHdvcmtzLiBsb3ZlbHkuCisKKwl0aGlzLmN1cnJlbnRNZW51ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRCdXR0b24gPSBudWxsOwkJLy8gYnV0dG9uIHRoYXQgb3BlbmVkIGN1cnJlbnQgbWVudSAoaWYgYW55KQorCXRoaXMuY3VycmVudEZvY3VzTWVudSA9IG51bGw7CS8vIHRoZSAoc3ViKW1lbnUgd2hpY2ggcmVjZWl2ZXMga2V5IGV2ZW50cworCXRoaXMuZm9jdXNOb2RlID0gbnVsbDsKKwl0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzID0gW107CisKKwl0aGlzLnJlZ2lzdGVyV2luID0gZnVuY3Rpb24oLypXaW5kb3cqL3dpbil7CisJCS8vIHN1bW1hcnk6IHJlZ2lzdGVyIGEgd2luZG93IHNvIHRoYXQgd2hlbiBjbGlja3Mvc2Nyb2xsIGluIGl0LCB0aGUgcG9wdXAgY2FuIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5CisJCWlmKCF3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkKQorCQl7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3Qod2luLmRvY3VtZW50LCAnb25tb3VzZWRvd24nLCB0aGlzLCAnb25DbGljaycpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHdpbiwgIm9uc2Nyb2xsIiwgdGhpcywgIm9uQ2xpY2siKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh3aW4uZG9jdW1lbnQsICJvbmtleSIsIHRoaXMsICdvbktleScpOworCQkJd2luLl9fUG9wdXBNYW5hZ2VyUmVnaXN0ZXJlZCA9IHRydWU7CisJCQl0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzLnB1c2god2luKTsKKwkJfQorCX07CisKKwkvKgorCisJKi8KKwl0aGlzLnJlZ2lzdGVyQWxsV2luZG93cyA9IGZ1bmN0aW9uKC8qV2luZG93Ki90YXJnZXRXaW5kb3cpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJVGhpcyBmdW5jdGlvbiByZWdpc3RlciBhbGwgdGhlIGlmcmFtZXMgYW5kIHRoZSB0b3Agd2luZG93LAorCQkvLwkJc28gdGhhdCB3aGVyZWV2ZXIgdGhlIHVzZXIgY2xpY2tzIGluIHRoZSBwYWdlLCB0aGUgcG9wdXAKKwkJLy8JCW1lbnUgd2lsbCBiZSBjbG9zZWQKKwkJLy8JCUluIGNhc2UgeW91IGFkZCBhbiBpZnJhbWUgYWZ0ZXIgb25sb2FkIGV2ZW50LCBwbGVhc2UgY2FsbAorCQkvLwkJZG9qby53aWRnZXQuUG9wdXBNYW5hZ2VyLnJlZ2lzdGVyV2luIG1hbnVhbGx5CisKKwkJLy9zdGFydGluZyBmcm9tIHdpbmRvdy50b3AsIGNsaWNraW5nIGV2ZXJ5d2hlcmUgaW4gdGhpcyBwYWdlCisJCS8vc2hvdWxkIGNsb3NlIHBvcHVwIG1lbnVzCisJCWlmKCF0YXJnZXRXaW5kb3cpIHsgLy9zZWUgY29tbWVudCBiZWxvdworCQkJdGFyZ2V0V2luZG93ID0gZG9qby5odG1sLmdldERvY3VtZW50V2luZG93KHdpbmRvdy50b3AgJiYgd2luZG93LnRvcC5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQpOworCQl9CisKKwkJdGhpcy5yZWdpc3Rlcldpbih0YXJnZXRXaW5kb3cpOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGFyZ2V0V2luZG93LmZyYW1lcy5sZW5ndGg7IGkrKyl7CisJCQl0cnl7CisJCQkJLy9kbyBub3QgcmVtb3ZlICBkb2pvLmh0bWwuZ2V0RG9jdW1lbnRXaW5kb3csIHNlZSBjb21tZW50IGluIGl0CisJCQkJdmFyIHdpbiA9IGRvam8uaHRtbC5nZXREb2N1bWVudFdpbmRvdyh0YXJnZXRXaW5kb3cuZnJhbWVzW2ldLmRvY3VtZW50KTsKKwkJCQlpZih3aW4peworCQkJCQl0aGlzLnJlZ2lzdGVyQWxsV2luZG93cyh3aW4pOworCQkJCX0KKwkJCX1jYXRjaChlKXsgLyogc3F1ZWxjaCBlcnJvciBmb3IgY3Jvc3MgZG9tYWluIGlmcmFtZXMgKi8gfQorCQl9CisJfTsKKworCXRoaXMudW5SZWdpc3RlcldpbiA9IGZ1bmN0aW9uKC8qV2luZG93Ki93aW4peworCQkvLyBzdW1tYXJ5OiByZW1vdmUgbGlzdGVuZXJzIG9uIHRoZSByZWdpc3RlcmVkIHdpbmRvdworCQlpZih3aW4uX19Qb3B1cE1hbmFnZXJSZWdpc3RlcmVkKQorCQl7CisJCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3Qod2luLmRvY3VtZW50LCAnb25tb3VzZWRvd24nLCB0aGlzLCAnb25DbGljaycpOworCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbiwgIm9uc2Nyb2xsIiwgdGhpcywgIm9uQ2xpY2siKTsKKwkJCWRvam8uZXZlbnQuZGlzY29ubmVjdCh3aW4uZG9jdW1lbnQsICJvbmtleSIsIHRoaXMsICdvbktleScpOworCQkJd2luLl9fUG9wdXBNYW5hZ2VyUmVnaXN0ZXJlZCA9IGZhbHNlOworCQl9CisJfTsKKworCXRoaXMudW5SZWdpc3RlckFsbFdpbmRvd3MgPSBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiByZW1vdmUgbGlzdGVuZXJzIG9uIGFsbCB0aGUgcmVnaXN0ZXJlZCB3aW5kb3dzCisJCWZvcih2YXIgaT0wO2k8dGhpcy5yZWdpc3RlcmVkV2luZG93cy5sZW5ndGg7KytpKXsKKwkJCXRoaXMudW5SZWdpc3Rlcldpbih0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzW2ldKTsKKwkJfQorCQl0aGlzLnJlZ2lzdGVyZWRXaW5kb3dzID0gW107CisJfTsKKworCWRvam8uYWRkT25Mb2FkKHRoaXMsICJyZWdpc3RlckFsbFdpbmRvd3MiKTsKKwlkb2pvLmFkZE9uVW5sb2FkKHRoaXMsICJ1blJlZ2lzdGVyQWxsV2luZG93cyIpOworCisJdGhpcy5jbG9zZWQgPSBmdW5jdGlvbigvKldpZGdldCovbWVudSl7CisJCS8vIHN1bW1hcnk6IG5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IG1lbnUgaXMgY2xvc2VkCisJCWlmICh0aGlzLmN1cnJlbnRNZW51ID09IG1lbnUpeworCQkJdGhpcy5jdXJyZW50TWVudSA9IG51bGw7CisJCQl0aGlzLmN1cnJlbnRCdXR0b24gPSBudWxsOworCQkJdGhpcy5jdXJyZW50Rm9jdXNNZW51ID0gbnVsbDsKKwkJfQorCX07CisKKwl0aGlzLm9wZW5lZCA9IGZ1bmN0aW9uKC8qV2lkZ2V0Ki9tZW51LCAvKkRvbU5vZGUqL2J1dHRvbil7CisJCS8vIHN1bW1hcnk6IHNldHMgdGhlIGN1cnJlbnQgb3BlbmVkIHBvcHVwCisJCWlmIChtZW51ID09IHRoaXMuY3VycmVudE1lbnUpeyByZXR1cm47IH0KKworCQlpZiAodGhpcy5jdXJyZW50TWVudSl7CisJCQl0aGlzLmN1cnJlbnRNZW51LmNsb3NlKCk7CisJCX0KKworCQl0aGlzLmN1cnJlbnRNZW51ID0gbWVudTsKKwkJdGhpcy5jdXJyZW50Rm9jdXNNZW51ID0gbWVudTsKKwkJdGhpcy5jdXJyZW50QnV0dG9uID0gYnV0dG9uOworCX07CisKKwl0aGlzLnNldEZvY3VzZWRNZW51ID0gZnVuY3Rpb24oLypXaWRnZXQqL21lbnUpeworCQkvLyBzdW1tYXJ5OgorCQkvLyAJCVNldCB0aGUgY3VycmVudCBmb2N1c2VkIHBvcHVwLCBUaGlzIGlzIHVzZWQgYnkgcG9wdXBzIHdoaWNoIHN1cHBvcnRzIGtleWJvYXJkIG5hdmlnYXRpb24KKwkJdGhpcy5jdXJyZW50Rm9jdXNNZW51ID0gbWVudTsKKwl9OworCisJdGhpcy5vbktleSA9IGZ1bmN0aW9uKC8qRXZlbnQqL2UpeworCQlpZiAoIWUua2V5KSB7IHJldHVybjsgfQorCQlpZighdGhpcy5jdXJyZW50TWVudSB8fCAhdGhpcy5jdXJyZW50TWVudS5pc1Nob3dpbmdOb3cpeyByZXR1cm47IH0KKworCQkvLyBsb29wIGZyb20gY2hpbGQgbWVudSB1cCBhbmNlc3RvciBjaGFpbiwgZW5kaW5nIGF0IGJ1dHRvbiB0aGF0IHNwYXduZWQgdGhlIG1lbnUKKwkJdmFyIG0gPSB0aGlzLmN1cnJlbnRGb2N1c01lbnU7CisJCXdoaWxlIChtKXsKKwkJCWlmKG0ucHJvY2Vzc0tleShlKSl7CisJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQltID0gbS5wYXJlbnRQb3B1cCB8fCBtLnBhcmVudE1lbnU7CisJCX0JCQorCX0sCisKKwl0aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbigvKkV2ZW50Ki9lKXsKKwkJaWYgKCF0aGlzLmN1cnJlbnRNZW51KXsgcmV0dXJuOyB9CisKKwkJdmFyIHNjcm9sbG9mZnNldCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisKKwkJLy8gc3RhcnRpbmcgZnJvbSB0aGUgYmFzZSBtZW51LCBwZXJmb3JtIGEgaGl0IHRlc3QKKwkJLy8gYW5kIGV4aXQgd2hlbiBvbmUgc3VjY2VlZHMKKworCQl2YXIgbSA9IHRoaXMuY3VycmVudE1lbnU7CisKKwkJd2hpbGUgKG0peworCQkJaWYoZG9qby5odG1sLm92ZXJFbGVtZW50KG0uZG9tTm9kZSwgZSkgfHwgZG9qby5odG1sLmlzRGVzY2VuZGFudE9mKGUudGFyZ2V0LCBtLmRvbU5vZGUpKXsKKwkJCQlyZXR1cm47CisJCQl9CisJCQltID0gbS5jdXJyZW50U3VicG9wdXA7CisJCX0KKworCQkvLyBBbHNvLCBpZiB1c2VyIGNsaWNrZWQgdGhlIGJ1dHRvbiB0aGF0IG9wZW5lZCB0aGlzIG1lbnUsIHRoZW4KKwkJLy8gdGhhdCBidXR0b24gd2lsbCBzZW5kIHRoZSBtZW51IGEgY2xvc2UoKSBjb21tYW5kLCBzbyB0aGlzIGNvZGUKKwkJLy8gc2hvdWxkbid0IHRyeSB0byBjbG9zZSB0aGUgbWVudS4gIENsb3NpbmcgdHdpY2UgbWVzc2VzIHVwIGFuaW1hdGlvbi4KKwkJaWYgKHRoaXMuY3VycmVudEJ1dHRvbiAmJiBkb2pvLmh0bWwub3ZlckVsZW1lbnQodGhpcy5jdXJyZW50QnV0dG9uLCBlKSl7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyB0aGUgY2xpY2sgZGlkbid0IGZhbGwgd2l0aGluIHRoZSBvcGVuIG1lbnUgdHJlZQorCQkvLyBzbyBjbG9zZSBpdAorCisJCXRoaXMuY3VycmVudE1lbnUuY2xvc2VBbGwodHJ1ZSk7CisJfTsKK30KKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5Db2xvclBhbGV0dGUiKTsKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LkNvbG9yUGFsZXR0ZSIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKK3sKKwkvLyBzdW1tYXJ5CisJLy8JCUdyaWQgc2hvd2luZyB2YXJpb3VzIGNvbG9ycywgc28gdGhlIHVzZXIgcGljayBhIGNlcnRhaW4gY29sb3IKKwkKKwkvLyBwYWxldHRlOiBTdHJpbmcKKwkvLwkJU2l6ZSBvZiBncmlkLCBlaXRoZXIgIjd4MTAiIG9yICIzeDQiLgorCXBhbGV0dGU6ICI3eDEwIiwKKworCV9wYWxldHRlczogeworCQkiN3gxMCI6IFtbImZmZiIsICJmY2MiLCAiZmM5IiwgImZmOSIsICJmZmMiLCAiOWY5IiwgIjlmZiIsICJjZmYiLCAiY2NmIiwgImZjZiJdLAorCQkJWyJjY2MiLCAiZjY2IiwgImY5NiIsICJmZjYiLCAiZmYzIiwgIjZmOSIsICIzZmYiLCAiNmZmIiwgIjk5ZiIsICJmOWYiXSwKKwkJCVsiYzBjMGMwIiwgImYwMCIsICJmOTAiLCAiZmM2IiwgImZmMCIsICIzZjMiLCAiNmNjIiwgIjNjZiIsICI2NmMiLCAiYzZjIl0sCisJCQlbIjk5OSIsICJjMDAiLCAiZjYwIiwgImZjMyIsICJmYzAiLCAiM2MwIiwgIjBjYyIsICIzNmYiLCAiNjNmIiwgImMzYyJdLAorCQkJWyI2NjYiLCAiOTAwIiwgImM2MCIsICJjOTMiLCAiOTkwIiwgIjA5MCIsICIzOTkiLCAiMzNmIiwgIjYwYyIsICI5MzkiXSwKKwkJCVsiMzMzIiwgIjYwMCIsICI5MzAiLCAiOTYzIiwgIjY2MCIsICIwNjAiLCAiMzY2IiwgIjAwOSIsICIzMzkiLCAiNjM2Il0sCisJCQlbIjAwMCIsICIzMDAiLCAiNjMwIiwgIjYzMyIsICIzMzAiLCAiMDMwIiwgIjAzMyIsICIwMDYiLCAiMzA5IiwgIjMwMyJdXSwKKworCQkiM3g0IjogW1siZmZmZmZmIi8qd2hpdGUqLywgIjAwZmYwMCIvKmxpbWUqLywgIjAwODAwMCIvKmdyZWVuKi8sICIwMDAwZmYiLypibHVlKi9dLAorCQkJWyJjMGMwYzAiLypzaWx2ZXIqLywgImZmZmYwMCIvKnllbGxvdyovLCAiZmYwMGZmIi8qZnVjaHNpYSovLCAiMDAwMDgwIi8qbmF2eSovXSwKKwkJCVsiODA4MDgwIi8qZ3JheSovLCAiZmYwMDAwIi8qcmVkKi8sICI4MDAwODAiLypwdXJwbGUqLywgIjAwMDAwMCIvKmJsYWNrKi9dXQorCQkJLy9bIjAwZmZmZiIvKmFxdWEqLywgIjgwODAwMCIvKm9saXZlKi8sICI4MDAwMDAiLyptYXJvb24qLywgIjAwODA4MCIvKnRlYWwqL11dOworCX0sCisKKwlidWlsZFJlbmRlcmluZzogZnVuY3Rpb24gKCkgeworCQl0aGlzLmRvbU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOworCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLmRvbU5vZGUpOworCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5kb21Ob2RlLCAib25tb3VzZWRvd24iLCBmdW5jdGlvbiAoZSkgeworCQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQl9KTsKKwkJd2l0aCAodGhpcy5kb21Ob2RlKSB7IC8vIHNldCB0aGUgdGFibGUncyBwcm9wZXJ0aWVzCisJCQljZWxsUGFkZGluZyA9ICIwIjsgY2VsbFNwYWNpbmcgPSAiMSI7IGJvcmRlciA9ICIxIjsKKwkJCXN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJ3aGl0ZSI7CisJCX0KKwkJdmFyIGNvbG9ycyA9IHRoaXMuX3BhbGV0dGVzW3RoaXMucGFsZXR0ZV07CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7CisJCQl2YXIgdHIgPSB0aGlzLmRvbU5vZGUuaW5zZXJ0Um93KC0xKTsKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgY29sb3JzW2ldLmxlbmd0aDsgaisrKSB7CisJCQkJaWYgKGNvbG9yc1tpXVtqXS5sZW5ndGggPT0gMykgeworCQkJCQljb2xvcnNbaV1bal0gPSBjb2xvcnNbaV1bal0ucmVwbGFjZSgvKC4pKC4pKC4pLywgIiQxJDEkMiQyJDMkMyIpOworCQkJCX0KKworCQkJCXZhciB0ZCA9IHRyLmluc2VydENlbGwoLTEpOworCQkJCXdpdGggKHRkLnN0eWxlKSB7CisJCQkJCWJhY2tncm91bmRDb2xvciA9ICIjIiArIGNvbG9yc1tpXVtqXTsKKwkJCQkJYm9yZGVyID0gIjFweCBzb2xpZCBncmF5IjsKKwkJCQkJd2lkdGggPSBoZWlnaHQgPSAiMTVweCI7CisJCQkJCWZvbnRTaXplID0gIjFweCI7CisJCQkJfQorCisJCQkJdGQuY29sb3IgPSAiIyIgKyBjb2xvcnNbaV1bal07CisKKwkJCQl0ZC5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuc3R5bGUuYm9yZGVyQ29sb3IgPSAid2hpdGUiOyB9CisJCQkJdGQub25tb3VzZW91dCA9IGZ1bmN0aW9uIChlKSB7IHRoaXMuc3R5bGUuYm9yZGVyQ29sb3IgPSAiZ3JheSI7IH0KKwkJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGQsICJvbm1vdXNlZG93biIsIHRoaXMsICJvbkNsaWNrIik7CisKKwkJCQl0ZC5pbm5lckhUTUwgPSAiJm5ic3A7IjsKKwkJCX0KKwkJfQorCX0sCisKKwlvbkNsaWNrOiBmdW5jdGlvbigvKkV2ZW50Ki8gZSkgeworCQl0aGlzLm9uQ29sb3JTZWxlY3QoZS5jdXJyZW50VGFyZ2V0LmNvbG9yKTsKKwkJZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gImdyYXkiOworCX0sCisKKwlvbkNvbG9yU2VsZWN0OiBmdW5jdGlvbihjb2xvcil7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlDYWxsYmFjayB3aGVuIGEgY29sb3IgaXMgc2VsZWN0ZWQuCisJCS8vIGNvbG9yOiBTdHJpbmcKKwkJLy8JCUhleCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGNvbG9yLgorCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIik7CisKKworCisKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lIiwKKwlkb2pvLndpZGdldC5IdG1sV2lkZ2V0LAorCWZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlBIHdpZGdldCB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhbmRhbG9uZSB3aWRnZXQgCisJCS8vCQlvciBhcyBhIGJhc2VjbGFzcyBmb3Igb3RoZXIgd2lkZ2V0cworCQkvLwkJSGFuZGxlcyByZXBsYWNlbWVudCBvZiBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBlaXRoZXIgZXh0ZXJuYWwgdXJpIG9yIGphdmFzY3JpcHQvamF2YSAKKwkJLy8JCWdlbmVyYXRlZCBtYXJrdXAgb3IgRG9tTm9kZSBjb250ZW50LCBpbnN0YW5jaWF0aW5nIHdpZGdldHMgd2l0aGluIGNvbnRlbnQgYW5kIHJ1bnMgc2NyaXB0cy4KKwkJLy8JCURvbnQgY29uZnVzZSBpdCB3aXRoIGFuIGlmcmFtZSwgaXQgb25seSBuZWVkcyBkb2N1bWVudCBmcmFnbWVudHMuCisJCS8vCQlJdCdzIHVzZWZ1bCBhcyBhIGNoaWxkIG9mIExheW91dENvbnRhaW5lciwgU3BsaXRDb250YWluZXIsIG9yIFRhYkNvbnRhaW5lci4KKwkJLy8JCUJ1dCBub3RlIHRoYXQgdGhvc2UgY2xhc3NlcyBjYW4gY29udGFpbiBhbnkgd2lkZ2V0IGFzIGEgY2hpbGQuCisJCS8vIHNjcmlwdFNjb3BlOiBGdW5jdGlvbgorCQkvLwkJcmVmZXJlbmNlIGhvbGRlciB0byB0aGUgaW5saW5lIHNjcmlwdHMgY29udGFpbmVyLCBpZiBzY3JpcHRTZXBhcmF0aW9uIGlzIHRydWUKKwkJLy8gYmluZEFyZ3M6IFN0cmluZ1tdCisJCS8vCQlTZW5kIGluIGV4dHJhIGFyZ3MgdG8gdGhlIGRvam8uaW8uYmluZCBjYWxsCisJCQorCQkvLyBwZXIgd2lkZ2V0SW1wbCB2YXJpYWJsZXMKKwkJdGhpcy5fc3R5bGVOb2RlcyA9ICBbXTsKKwkJdGhpcy5fb25Mb2FkU3RhY2sgPSBbXTsKKwkJdGhpcy5fb25VbmxvYWRTdGFjayA9IFtdOworCQl0aGlzLl9jYWxsT25VbmxvYWQgPSBmYWxzZTsKKwkJdGhpcy5faW9CaW5kT2JqOworCQkvLwlOb3RlOgorCQkvLwkJZG9udCBjaGFuZ2UgdGhpcyB2YWx1ZSBleHRlcm5hbGx5CisJCXRoaXMuc2NyaXB0U2NvcGU7IC8vIHVuZGVmaW5lZCBmb3Igbm93CisKKwkJLy8gbG9hZGluZyBvcHRpb24KKwkJLy8JZXhhbXBsZToKKwkJLy8JCWJpbmRBcmdzPSJwcmV2ZW50Q2FjaGU6ZmFsc2U7IiBvdmVycmlkZXMgY2FjaGVDb250ZW50CisJCXRoaXMuYmluZEFyZ3MgPSB7fTsKKworCQorCX0sIHsKKwkJaXNDb250YWluZXI6IHRydWUsCisKKwkJLy8gbG9hZGluZyBvcHRpb25zCisJCS8vIGFkanVzdFBhdGhzOiBCb29sZWFuCisJCS8vCQlhZGp1c3QgcmVsYXRpdmUgcGF0aHMgaW4gbWFya3VwIHRvIGZpdCB0aGlzIHBhZ2UKKwkJYWRqdXN0UGF0aHM6IHRydWUsCisKKwkJLy8gaHJlZjogU3RyaW5nCisJCS8vCQlUaGUgaHJlZiBvZiB0aGUgY29udGVudCB0aGF0IGRpc3BsYXlzIG5vdworCQkvLwkJU2V0IHRoaXMgYXQgY29uc3RydWN0aW9uIGlmIHlvdSB3YW50IHRvIGxvYWQgZXh0ZXJuYWxseSwKKwkJLy8JCWNoYW5naW5nIGhyZWYgYWZ0ZXIgY3JlYXRpb24gZG9lc250IGhhdmUgYW55IGVmZmVjdCwgc2VlIHNldFVybAorCQlocmVmOiAiIiwKKworCQkvLyBleHRyYWN0Q29udGVudCBCb29sZWFuOiBFeHRyYWN0IHZpc2libGUgY29udGVudCBmcm9tIGluc2lkZSBvZiA8Ym9keT4gLi4uLiA8L2JvZHk+CisJCWV4dHJhY3RDb250ZW50OiB0cnVlLAorCisJCS8vIHBhcnNlQ29udGVudCBCb29sZWFuOiBDb25zdHJ1Y3QgYWxsIHdpZGdldHMgdGhhdCBpcyBpbiBjb250ZW50CisJCXBhcnNlQ29udGVudDoJdHJ1ZSwKKworCQkvLyBjYWNoZUNvbnRlbnQgQm9vbGVhbjogQ2FjaGUgY29udGVudCByZXRyZWl2ZWQgZXh0ZXJuYWxseQorCQljYWNoZUNvbnRlbnQ6CXRydWUsCisKKwkJLy8gcHJlbG9hZDogQm9vbGVhbgorCQkvLwkJRm9yY2UgbG9hZCBvZiBkYXRhIGV2ZW4gaWYgcGFuZSBpcyBoaWRkZW4uCisJCS8vIE5vdGU6CisJCS8vCQlJbiBvcmRlciB0byBkZWxheSBkb3dubG9hZCB5b3UgbmVlZCB0byBpbml0aWFsbHkgaGlkZSB0aGUgbm9kZSBpdCBjb25zdHJ1Y3RzIGZyb20KKwkJcHJlbG9hZDogZmFsc2UsCisKKwkJLy8gcmVmcmVzaE9uU2hvdzogQm9vbGVhbgorCQkvLwkJUmVmcmVzaCAocmUtZG93bmxvYWQpIGNvbnRlbnQgd2hlbiBwYW5lIGdvZXMgZnJvbSBoaWRkZW4gdG8gc2hvd24KKwkJcmVmcmVzaE9uU2hvdzogZmFsc2UsCisKKwkJLy8gaGFuZGxlcjogU3RyaW5nfHxGdW5jdGlvbgorCQkvLwkJR2VuZXJhdGUgcGFuZSBjb250ZW50IGZyb20gYSBqYXZhIGZ1bmN0aW9uCisJCS8vCQlUaGUgbmFtZSBvZiB0aGUgamF2YSBwcm94eSBmdW5jdGlvbgorCQloYW5kbGVyOiAiIiwKKworCQkvLyBleGVjdXRlU2NyaXB0czogQm9vbGVhbgorCQkvLwkJUnVuIHNjcmlwdHMgd2l0aGluIGNvbnRlbnQsIGV4dHJhY3RDb250ZW50IGhhcyBOTyBlZmZlY3Qgb24gdGhpcy4KKwkJLy8gTm90ZToKKwkJLy8JCWlmIHRydWUgc2NyaXB0cyBpbiBjb250ZW50IHdpbGwgYmUgZXZhbGVkIGFmdGVyIGNvbnRlbnQgaXMgaW5uZXJIVE1MJ2VkCisJCWV4ZWN1dGVTY3JpcHRzOiBmYWxzZSwKKworCQkvLyBzY3JpcHRTZXBhcmF0aW9uOiBCb29sZWFuCisJCS8vCQlSdW4gc2NyaXB0cyBpbiBhIHNlcGFyYXRlIHNjb3BlLCB1bmlxdWUgZm9yIGVhY2ggQ29udGVudFBhbmUKKwkJc2NyaXB0U2VwYXJhdGlvbjogdHJ1ZSwKKworCQkvLyBsb2FkaW5nTWVzc2FnZTogU3RyaW5nCisJCS8vCQlNZXNzYWdlIHRoYXQgc2hvd3Mgd2hpbGUgZG93bmxvYWRpbmcKKwkJbG9hZGluZ01lc3NhZ2U6ICJMb2FkaW5nLi4uIiwKKworCQkvLyBpc0xvYWRlZDogQm9vbGVhbgorCQkvLwkJVGVsbHMgbG9hZGluZyBzdGF0dXMKKwkJaXNMb2FkZWQ6IGZhbHNlLAorCisJCXBvc3RDcmVhdGU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcsIHBhcmVudENvbXApeworCQkJaWYgKHRoaXMuaGFuZGxlciE9PSIiKXsKKwkJCQl0aGlzLnNldEhhbmRsZXIodGhpcy5oYW5kbGVyKTsKKwkJCX0KKwkJCWlmKHRoaXMuaXNTaG93aW5nKCkgfHwgdGhpcy5wcmVsb2FkKXsKKwkJCQl0aGlzLmxvYWRDb250ZW50cygpOyAKKwkJCX0KKwkJfSwKKwkKKwkJc2hvdzogZnVuY3Rpb24oKXsKKwkJCS8vIGlmIHJlZnJlc2hPblNob3cgaXMgdHJ1ZSwgcmVsb2FkIHRoZSBjb250ZW50cyBldmVyeSB0aW1lOyBvdGhlcndpc2UsIGxvYWQgb25seSB0aGUgZmlyc3QgdGltZQorCQkJaWYodGhpcy5yZWZyZXNoT25TaG93KXsKKwkJCQl0aGlzLnJlZnJlc2goKTsKKwkJCX1lbHNleworCQkJCXRoaXMubG9hZENvbnRlbnRzKCk7CisJCQl9CisJCQlkb2pvLndpZGdldC5Db250ZW50UGFuZS5zdXBlcmNsYXNzLnNob3cuY2FsbCh0aGlzKTsKKwkJfSwKKwkKKwkJcmVmcmVzaDogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJRm9yY2UgYSByZWZyZXNoIChyZS1kb3dubG9hZCkgb2YgY29udGVudCwgYmUgc3VyZSB0byB0dXJuIG9mIGNhY2hlCisJCQl0aGlzLmlzTG9hZGVkPWZhbHNlOworCQkJdGhpcy5sb2FkQ29udGVudHMoKTsKKwkJfSwKKwkKKwkJbG9hZENvbnRlbnRzOiBmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJRG93bmxvYWQgaWYgaXNMb2FkZWQgaXMgZmFsc2UsIGVsc2UgaWdub3JlCisJCQlpZiAoIHRoaXMuaXNMb2FkZWQgKXsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIGRvam8ubGFuZy5pc0Z1bmN0aW9uKHRoaXMuaGFuZGxlcikpIHsKKwkJCQl0aGlzLl9ydW5IYW5kbGVyKCk7CisJCQl9IGVsc2UgaWYgKCB0aGlzLmhyZWYgIT0gIiIgKSB7CisJCQkJdGhpcy5fZG93bmxvYWRFeHRlcm5hbENvbnRlbnQodGhpcy5ocmVmLCB0aGlzLmNhY2hlQ29udGVudCAmJiAhdGhpcy5yZWZyZXNoT25TaG93KTsKKwkJCX0KKwkJfSwKKwkJCisJCXNldFVybDogZnVuY3Rpb24oLypTdHJpbmd8fGRvam8udXJpLlVyaSovIHVybCkgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlSZXNldCB0aGUgKGV4dGVybmFsIGRlZmluZWQpIGNvbnRlbnQgb2YgdGhpcyBwYW5lIGFuZCByZXBsYWNlIHdpdGggbmV3IHVybAorCisJCQkvLwlOb3RlOgorCQkJLy8JCUl0IGRlbGF5cyB0aGUgZG93bmxvYWQgdW50aWwgd2lkZ2V0IGlzIHNob3duIGlmIHByZWxvYWQgaXMgZmFsc2UKKwkJCXRoaXMuaHJlZiA9IHVybDsKKwkJCXRoaXMuaXNMb2FkZWQgPSBmYWxzZTsKKwkJCWlmICggdGhpcy5wcmVsb2FkIHx8IHRoaXMuaXNTaG93aW5nKCkgKXsKKwkJCQl0aGlzLmxvYWRDb250ZW50cygpOworCQkJfQorCQl9LAorCisJCWFib3J0OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeQorCQkJLy8JCUFib3J0cyBhIGluZmxpZ2h0IGRvd25sb2FkIG9mIGNvbnRlbnQKKwkJCXZhciBiaW5kID0gdGhpcy5faW9CaW5kT2JqOworCQkJaWYoIWJpbmQgfHwgIWJpbmQuYWJvcnQpeyByZXR1cm47IH0KKwkJCWJpbmQuYWJvcnQoKTsKKwkJCWRlbGV0ZSB0aGlzLl9pb0JpbmRPYmo7CisJCX0sCisJCisJCV9kb3dubG9hZEV4dGVybmFsQ29udGVudDogZnVuY3Rpb24odXJsLCB1c2VDYWNoZSkgeworCQkJdGhpcy5hYm9ydCgpOworCQkJdGhpcy5faGFuZGxlRGVmYXVsdHModGhpcy5sb2FkaW5nTWVzc2FnZSwgIm9uRG93bmxvYWRTdGFydCIpOworCQkJdmFyIHNlbGYgPSB0aGlzOworCQkJdGhpcy5faW9CaW5kT2JqID0gZG9qby5pby5iaW5kKAorCQkJCXRoaXMuX2NhY2hlU2V0dGluZyh7CisJCQkJCXVybDogdXJsLAorCQkJCQltaW1ldHlwZTogInRleHQvaHRtbCIsCisJCQkJCWhhbmRsZXI6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIHhocil7CisJCQkJCQlkZWxldGUgc2VsZi5faW9CaW5kT2JqOyAvLyBtYWtlcyBzdXJlIGFib3J0IGRvZXNudCBjbGVhciBjYWNoZQorCQkJCQkJaWYodHlwZT09ImxvYWQiKXsKKwkJCQkJCQlzZWxmLm9uRG93bmxvYWRFbmQuY2FsbChzZWxmLCB1cmwsIGRhdGEpOworCQkJCQkJfWVsc2V7CisJCQkJCQkJLy8gWEhSIGlzbnQgYSBub3JtYWwgSlMgb2JqZWN0LCBJRSBkb2VzbnQgaGF2ZSBwcm90b3R5cGUgb24gWEhSIHNvIHdlIGNhbnQgZXh0ZW5kIGl0IG9yIHNoYWxsb3dDb3B5IGl0CisJCQkJCQkJdmFyIGUgPSB7CisJCQkJCQkJCXJlc3BvbnNlVGV4dDogeGhyLnJlc3BvbnNlVGV4dCwKKwkJCQkJCQkJc3RhdHVzOiB4aHIuc3RhdHVzLAorCQkJCQkJCQlzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCwKKwkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzOiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksCisJCQkJCQkJCXRleHQ6ICJFcnJvciBsb2FkaW5nICciICsgdXJsICsgIicgKCIgKyB4aHIuc3RhdHVzICsgIiAiKyAgeGhyLnN0YXR1c1RleHQgKyAiKSIKKwkJCQkJCQl9OworCQkJCQkJCXNlbGYuX2hhbmRsZURlZmF1bHRzLmNhbGwoc2VsZiwgZSwgIm9uRG93bmxvYWRFcnJvciIpOworCQkJCQkJCXNlbGYub25Mb2FkKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9LCB1c2VDYWNoZSkKKwkJCSk7CisJCX0sCisJCisJCV9jYWNoZVNldHRpbmc6IGZ1bmN0aW9uKGJpbmRPYmosIHVzZUNhY2hlKXsKKwkJCWZvcih2YXIgeCBpbiB0aGlzLmJpbmRBcmdzKXsKKwkJCQlpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9ialt4XSkpeworCQkJCQliaW5kT2JqW3hdID0gdGhpcy5iaW5kQXJnc1t4XTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKGRvam8ubGFuZy5pc1VuZGVmaW5lZChiaW5kT2JqLnVzZUNhY2hlKSl7IGJpbmRPYmoudXNlQ2FjaGUgPSB1c2VDYWNoZTsgfQorCQkJaWYoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGJpbmRPYmoucHJldmVudENhY2hlKSl7IGJpbmRPYmoucHJldmVudENhY2hlID0gIXVzZUNhY2hlOyB9CisJCQlpZihkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9iai5taW1ldHlwZSkpeyBiaW5kT2JqLm1pbWV0eXBlID0gInRleHQvaHRtbCI7IH0KKwkJCXJldHVybiBiaW5kT2JqOworCQl9LAorCisJCW9uTG9hZDogZnVuY3Rpb24oZSl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCUV2ZW50IGhvb2ssIGlzIGNhbGxlZCBhZnRlciBldmVyeXRoaW5nIGlzIGxvYWRlZCBhbmQgd2lkZ2V0aWZpZWQgCisJCQl0aGlzLl9ydW5TdGFjaygiX29uTG9hZFN0YWNrIik7CisJCQl0aGlzLmlzTG9hZGVkPXRydWU7CisJCX0sCisJCisJCW9uVW5Mb2FkOiBmdW5jdGlvbihlKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJRGVwcmVjYXRlZCwgdXNlIG9uVW5sb2FkIChsb3dlcmNhc2VkIGxvYWQpCisJCQlkb2pvLmRlcHJlY2F0ZWQodGhpcy53aWRnZXRUeXBlKyIub25VbkxvYWQsIHVzZSAub25VbmxvYWQgKGxvd2VyY2FzZWQgbG9hZCkiLCAwLjUpOworCQl9LAorCisJCW9uVW5sb2FkOiBmdW5jdGlvbihlKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJRXZlbnQgaG9vaywgaXMgY2FsbGVkIGJlZm9yZSBvbGQgY29udGVudCBpcyBjbGVhcmVkCisJCQl0aGlzLl9ydW5TdGFjaygiX29uVW5sb2FkU3RhY2siKTsKKwkJCWRlbGV0ZSB0aGlzLnNjcmlwdFNjb3BlOworCQkJLy8gRklYTUU6IHJlbW92ZSBmb3IgMC41IGFsb25nIHdpdGggb25VbkxvYWQKKwkJCWlmKHRoaXMub25VbkxvYWQgIT09IGRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLnByb3RvdHlwZS5vblVuTG9hZCl7CisJCQkJdGhpcy5vblVuTG9hZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJfQorCQl9LAorCQorCQlfcnVuU3RhY2s6IGZ1bmN0aW9uKHN0TmFtZSl7CisJCQl2YXIgc3QgPSB0aGlzW3N0TmFtZV07IHZhciBlcnIgPSAiIjsKKwkJCXZhciBzY29wZSA9IHRoaXMuc2NyaXB0U2NvcGUgfHwgd2luZG93OworCQkJZm9yKHZhciBpID0gMDtpIDwgc3QubGVuZ3RoOyBpKyspeworCQkJCXRyeXsKKwkJCQkJc3RbaV0uY2FsbChzY29wZSk7CisJCQkJfWNhdGNoKGUpeyAKKwkJCQkJZXJyICs9ICJcbiIrc3RbaV0rIiBmYWlsZWQ6ICIrZS5kZXNjcmlwdGlvbjsKKwkJCQl9CisJCQl9CisJCQl0aGlzW3N0TmFtZV0gPSBbXTsKKwkKKwkJCWlmKGVyci5sZW5ndGgpeworCQkJCXZhciBuYW1lID0gKHN0TmFtZT09ICJfb25Mb2FkU3RhY2siKSA/ICJhZGRPbkxvYWQiIDogImFkZE9uVW5Mb2FkIjsKKwkJCQl0aGlzLl9oYW5kbGVEZWZhdWx0cyhuYW1lKyIgZmFpbHVyZVxuICIrZXJyLCAib25FeGVjRXJyb3IiLCAiZGVidWciKTsKKwkJCX0KKwkJfSwKKwkKKwkJYWRkT25Mb2FkOiBmdW5jdGlvbihvYmosIGZ1bmMpeworCQkJLy8gc3VtbWFyeQorCQkJLy8JCVN0b3JlcyBmdW5jdGlvbiByZWZzIGFuZCBjYWxscyB0aGVtIG9uZSBieSBvbmUgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbgorCQkJLy8JCXdoZW4gbG9hZCBldmVudCBvY2N1cnMuCisJCQkvLwlvYmo6IEZ1bmN0aW9ufHxPYmplY3Q/CisJCQkvLwkJaG9sZGVyIG9iamVjdAorCQkJLy8JZnVuYzogRnVuY3Rpb24KKwkJCS8vCQlmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIAorCQkJdGhpcy5fcHVzaE9uU3RhY2sodGhpcy5fb25Mb2FkU3RhY2ssIG9iaiwgZnVuYyk7CisJCX0sCisJCisJCWFkZE9uVW5sb2FkOiBmdW5jdGlvbihvYmosIGZ1bmMpeworCQkJLy8gc3VtbWFyeQorCQkJLy8JCVN0b3JlcyBmdW5jdGlvbiByZWZzIGFuZCBjYWxscyB0aGVtIG9uZSBieSBvbmUgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbgorCQkJLy8JCXdoZW4gdW5sb2FkIGV2ZW50IG9jY3Vycy4KKwkJCS8vCW9iajogRnVuY3Rpb258fE9iamVjdAorCQkJLy8JCWhvbGRlciBvYmplY3QKKwkJCS8vCWZ1bmM6IEZ1bmN0aW9uCisJCQkvLwkJZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCAKKwkJCXRoaXMuX3B1c2hPblN0YWNrKHRoaXMuX29uVW5sb2FkU3RhY2ssIG9iaiwgZnVuYyk7CisJCX0sCisKKwkJYWRkT25VbkxvYWQ6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCURlcHJlY2F0ZWQgdXNlIGFkZE9uVW5sb2FkIChsb3dlciBjYXNlZCBsb2FkKQorCQkJZG9qby5kZXByZWNhdGVkKHRoaXMud2lkZ2V0VHlwZSArICIuYWRkT25VbkxvYWQsIHVzZSBhZGRPblVubG9hZCBpbnN0ZWFkLiAobG93ZXJjYXNlZCBMb2FkKSIsIDAuNSk7CisJCQl0aGlzLmFkZE9uVW5sb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0sCisJCisJCV9wdXNoT25TdGFjazogZnVuY3Rpb24oc3RhY2ssIG9iaiwgZnVuYyl7CisJCQlpZih0eXBlb2YgZnVuYyA9PSAndW5kZWZpbmVkJykgeworCQkJCXN0YWNrLnB1c2gob2JqKTsKKwkJCX1lbHNleworCQkJCXN0YWNrLnB1c2goZnVuY3Rpb24oKXsgb2JqW2Z1bmNdKCk7IH0pOworCQkJfQorCQl9LAorCQorCQlkZXN0cm95OiBmdW5jdGlvbigpeworCQkJLy8gbWFrZSBzdXJlIHdlIGNhbGwgb25VbmxvYWQKKwkJCXRoaXMub25VbmxvYWQoKTsKKwkJCWRvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOworCQl9LAorIAorCQlvbkV4ZWNFcnJvcjogZnVuY3Rpb24oLypPYmplY3QqL2UpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQljYWxsZWQgd2hlbiBjb250ZW50IHNjcmlwdCBldmFsIGVycm9yIG9yIEphdmEgZXJyb3Igb2NjdXJzLCBwcmV2ZW50RGVmYXVsdC1hYmxlCisJCQkvLwkJZGVmYXVsdCBpcyB0byBkZWJ1ZyBub3QgYWxlcnQgYXMgaW4gMC4zLjEKKwkJfSwKKwkKKwkJb25Db250ZW50RXJyb3I6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9lKXsKKwkJCS8vIHN1bW1hcnk6IAorCQkJLy8JCWNhbGxlZCBvbiBET00gZmF1bHRzLCByZXF1aXJlIGZhdWx0IGV0YyBpbiBjb250ZW50LCBwcmV2ZW50RGVmYXVsdC1hYmxlCisJCQkvLwkJZGVmYXVsdCBpcyB0byBkaXNwbGF5IGVycm9ybWVzc2FnZSBpbnNpZGUgcGFuZQorCQl9LAorCQorCQlvbkRvd25sb2FkRXJyb3I6IGZ1bmN0aW9uKC8qT2JqZWN0Ki9lKXsKKwkJCS8vIHN1bW1hcnk6IAorCQkJLy8JCWNhbGxlZCB3aGVuIGRvd25sb2FkIGVycm9yIG9jY3VycywgcHJldmVudERlZmF1bHQtYWJsZQorCQkJLy8JCWRlZmF1bHQgaXMgdG8gZGlzcGxheSBlcnJvcm1lc3NhZ2UgaW5zaWRlIHBhbmUKKwkJfSwKKwkKKwkJb25Eb3dubG9hZFN0YXJ0OiBmdW5jdGlvbigvKk9iamVjdCovZSl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWNhbGxlZCBiZWZvcmUgZG93bmxvYWQgc3RhcnRzLCBwcmV2ZW50RGVmYXVsdC1hYmxlCisJCQkvLwkJZGVmYXVsdCBpcyB0byBkaXNwbGF5IGxvYWRpbmdNZXNzYWdlIGluc2lkZSBwYW5lCisJCQkvLwkJYnkgY2hhbmdpbmcgZS50ZXh0IGluIHlvdXIgZXZlbnQgaGFuZGxlciB5b3UgY2FuIGNoYW5nZSBsb2FkaW5nIG1lc3NhZ2UKKwkJfSwKKwkKKwkJLy8gCisJCW9uRG93bmxvYWRFbmQ6IGZ1bmN0aW9uKHVybCwgZGF0YSl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCWNhbGxlZCB3aGVuIGRvd25sb2FkIGlzIGZpbmlzaGVkCisJCQkvLworCQkJLy8JdXJsIFN0cmluZzogdXJsIHRoYXQgZG93bmxvYWRlZCBkYXRhCisJCQkvLwlkYXRhIFN0cmluZzogdGhlIG1hcmt1cCB0aGF0IHdhcyBkb3dubG9hZGVkCisJCQlkYXRhID0gdGhpcy5zcGxpdEFuZEZpeFBhdGhzKGRhdGEsIHVybCk7CisJCQl0aGlzLnNldENvbnRlbnQoZGF0YSk7CisJCX0sCisJCisJCS8vIHVzZWZ1bCBpZiB1c2VyIHdhbnRzIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvdXIgaWU6IF9zZXRDb250ZW50KCJFcnJvci4uLiIpCisJCV9oYW5kbGVEZWZhdWx0czogZnVuY3Rpb24oZSwgaGFuZGxlciwgbWVzc1R5cGUpeworCQkJaWYoIWhhbmRsZXIpeyBoYW5kbGVyID0gIm9uQ29udGVudEVycm9yIjsgfQorCisJCQlpZihkb2pvLmxhbmcuaXNTdHJpbmcoZSkpeyBlID0ge3RleHQ6IGV9OyB9CisKKwkJCWlmKCFlLnRleHQpeyBlLnRleHQgPSBlLnRvU3RyaW5nKCk7IH0KKworCQkJZS50b1N0cmluZyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLnRleHQ7IH07CisKKwkJCWlmKHR5cGVvZiBlLnJldHVyblZhbHVlICE9ICJib29sZWFuIil7CisJCQkJZS5yZXR1cm5WYWx1ZSA9IHRydWU7IAorCQkJfQorCQkJaWYodHlwZW9mIGUucHJldmVudERlZmF1bHQgIT0gImZ1bmN0aW9uIil7CisJCQkJZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCl7IHRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsgfTsKKwkJCX0KKwkJCS8vIGNhbGwgb3VyIGhhbmRsZXIKKwkJCXRoaXNbaGFuZGxlcl0oZSk7CisJCQlpZihlLnJldHVyblZhbHVlKXsKKwkJCQlzd2l0Y2gobWVzc1R5cGUpeworCQkJCQljYXNlIHRydWU6IC8vIGZhbGx0aHJvdWdoLCBvbGQgY29tcGF0CisJCQkJCWNhc2UgImFsZXJ0IjoKKwkJCQkJCWFsZXJ0KGUudG9TdHJpbmcoKSk7IGJyZWFrOworCQkJCQljYXNlICJkZWJ1ZyI6CisJCQkJCQlkb2pvLmRlYnVnKGUudG9TdHJpbmcoKSk7IGJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkvLyBtYWtlcyBzdXJlIHNjcmlwdHMgY2FuIGNsZWFuIHVwIGFmdGVyIHRoZW1zZWx2ZXMsIGJlZm9yZSB3ZSBzZXRDb250ZW50CisJCQkJCWlmKHRoaXMuX2NhbGxPblVubG9hZCl7IHRoaXMub25VbmxvYWQoKTsgfSAKKwkJCQkJLy8gbWFrZXMgc3VyZSB3ZSBkb250IHRyeSB0byBjYWxsIG9uVW5Mb2FkIGFnYWluIG9uIHRoaXMgZXZlbnQsCisJCQkJCS8vIGllIG9uVW5Mb2FkIGJlZm9yZSAnTG9hZGluZy4uLicgYnV0IG5vdCBiZWZvcmUgY2xlYXJpbmcgJ0xvYWRpbmcuLi4nCisJCQkJCXRoaXMuX2NhbGxPblVubG9hZCA9IGZhbHNlOworCisJCQkJCS8vIHdlIG1pZ2h0IGVuZCB1cCBpbiBhIGVuZGxlc3MgcmVjdXJzaW9uIGhlcmUgaWYgZG9tTm9kZSBjYW50IGFwcGVuZCBjb250ZW50CisJCQkJCWlmKGFyZ3VtZW50cy5jYWxsZWUuX2xvb3BTdG9wKXsKKwkJCQkJCWRvam8uZGVidWcoZS50b1N0cmluZygpKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlhcmd1bWVudHMuY2FsbGVlLl9sb29wU3RvcCA9IHRydWU7CisJCQkJCQl0aGlzLl9zZXRDb250ZW50KGUudG9TdHJpbmcoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlhcmd1bWVudHMuY2FsbGVlLl9sb29wU3RvcCA9IGZhbHNlOworCQl9LAorCQorCQkvLyBwYXRoZml4ZXMsIHJlcXVpcmUgY2FsbHMsIGNzcyBzdHVmZiBhbmQgbmVjY2VzYXJ5IGNvbnRlbnQgY2xlYW4KKwkJc3BsaXRBbmRGaXhQYXRoczogZnVuY3Rpb24ocywgdXJsKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLyAJCWFkanVzdHMgYWxsIHJlbGF0aXZlIHBhdGhzIGluIChob3BlZnVsbHkpIGFsbCBjYXNlcywgaW1hZ2VzLCByZW1vdGUgc2NyaXB0cywgbGlua3MgZXRjLgorCQkJLy8gCQlzcGxpdHMgdXAgY29udGVudCBpbiBkaWZmZXJlbnQgcGllY2VzLCBzY3JpcHRzLCB0aXRsZSwgc3R5bGUsIGxpbmsgYW5kIHdoYXRzIGxlZnQgYmVjb21lcyAueG1sCisJCQkvLwlzIFN0cmluZzoJVGhlIG1hcmt1cCBpbiBzdHJpbmcKKwkJCS8vCXVybCAoU3RyaW5nfHxkb2pvLnVyaS5Vcmk/KSB1cmwgdGhhdCBwdWxsZWQgaW4gbWFya3VwCisKKwkJCXZhciB0aXRsZXMgPSBbXSwgc2NyaXB0cyA9IFtdLHRtcCA9IFtdOy8vIGluaXQgdmFycworCQkJdmFyIG1hdGNoID0gW10sIHJlcXVpcmVzID0gW10sIGF0dHIgPSBbXSwgc3R5bGVzID0gW107CisJCQl2YXIgc3RyID0gJycsIHBhdGggPSAnJywgZml4ID0gJycsIHRhZ0ZpeCA9ICcnLCB0YWcgPSAnJywgb3JpZ1BhdGggPSAnJzsKKwkKKwkJCWlmKCF1cmwpIHsgdXJsID0gIi4vIjsgfSAvLyBwb2ludCB0byB0aGlzIHBhZ2UgaWYgbm90IHNldAorCisJCQlpZihzKXsgLy8gbWFrZSBzdXJlIHdlIGRvbnQgcnVuIHJlZ2V4ZXMgb24gZW1wdHkgY29udGVudAorCisJCQkJLyoqKioqKioqKioqKioqIDx0aXRsZT4gKioqKioqKioqKiovCisJCQkJLy8ga2h0bWwgaXMgcGlja3kgYWJvdXQgZG9tIGZhdWx0cywgeW91IGNhbid0IGF0dGFjaCBhIDxzdHlsZT4gb3IgPHRpdGxlPiBub2RlIGFzIGNoaWxkIG9mIGJvZHkKKwkJCQkvLyBtdXN0IGdvIGludG8gaGVhZCwgc28gd2UgbmVlZCB0byBjdXQgb3V0IHRob3NlIHRhZ3MKKwkJCQl2YXIgcmVnZXggPSAvPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOworCQkJCXdoaWxlKG1hdGNoID0gcmVnZXguZXhlYyhzKSl7CisJCQkJCXRpdGxlcy5wdXNoKG1hdGNoWzFdKTsKKwkJCQkJcyA9IHMuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSArIHMuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKKwkJCQl9OworCQkKKwkJCQkvKioqKioqKioqKioqKiogYWRqdXN0IHBhdGhzICoqKioqKioqKioqKioqKioqLworCQkJCWlmKHRoaXMuYWRqdXN0UGF0aHMpeworCQkJCQkvLyBhdHRyaWJ1dGVwYXRocyBvbmUgdGFnIGNhbiBoYXZlIG11bHRpcGxlIHBhdGhzIGV4YW1wbGU6CisJCQkJCS8vIDxpbnB1dCBzcmM9Ii4uLiIgc3R5bGU9InVybCguLikiLz4gb3IgPGEgc3R5bGU9InVybCguLikiIGhyZWY9Ii4uIj4KKwkJCQkJLy8gc3RyaXAgb3V0IHRoZSB0YWcgYW5kIHJ1biBmaXggb24gdGhhdC4KKwkJCQkJLy8gdGhpcyBndWFyYW50ZWVzIHRoYXQgd2Ugd29uJ3QgcnVuIHJlcGxhY2Ugb24gYW5vdGhlciB0YWcncyBhdHRyaWJ1dGUgKyBpdCB3YXMgZWFzaWVyIGRvCisJCQkJCXZhciByZWdleEZpbmRUYWcgPSAvPFthLXpdW2EtejAtOV0qW14+XSpccyg/Oig/OnNyY3xocmVmfHN0eWxlKT1bXj5dKStbXj5dKj4vaTsKKwkJCQkJdmFyIHJlZ2V4RmluZEF0dHIgPSAvXHMoc3JjfGhyZWZ8c3R5bGUpPShbJyJdPykoW1x3KClcW1xdXC8uLFxcJyItOjsjPSY/XHNAXSs/KVwyL2k7CisJCQkJCS8vIHRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIHByb3RvY29scywgYWxsIG90aGVyIGlzIGNvbnNpZGVyZWQgcmVsYXRpdmUKKwkJCQkJdmFyIHJlZ2V4UHJvdG9jb2xzID0gL14oPzpbI118KD86KD86aHR0cHM/fGZ0cHM/fGZpbGV8amF2YXNjcmlwdHxtYWlsdG98bmV3cyk6KSkvOworCQkKKwkJCQkJd2hpbGUodGFnID0gcmVnZXhGaW5kVGFnLmV4ZWMocykpeworCQkJCQkJc3RyICs9IHMuc3Vic3RyaW5nKDAsIHRhZy5pbmRleCk7CisJCQkJCQlzID0gcy5zdWJzdHJpbmcoKHRhZy5pbmRleCArIHRhZ1swXS5sZW5ndGgpLCBzLmxlbmd0aCk7CisJCQkJCQl0YWcgPSB0YWdbMF07CisJCQkKKwkJCQkJCS8vIGxvb3AgdGhyb3VnaCBhdHRyaWJ1dGVzCisJCQkJCQl0YWdGaXggPSAnJzsKKwkJCQkJCXdoaWxlKGF0dHIgPSByZWdleEZpbmRBdHRyLmV4ZWModGFnKSl7CisJCQkJCQkJcGF0aCA9ICIiOyBvcmlnUGF0aCA9IGF0dHJbM107CisJCQkJCQkJc3dpdGNoKGF0dHJbMV0udG9Mb3dlckNhc2UoKSl7CisJCQkJCQkJCWNhc2UgInNyYyI6Ly8gZmFsbHRyb3VnaAorCQkJCQkJCQljYXNlICJocmVmIjoKKwkJCQkJCQkJCWlmKHJlZ2V4UHJvdG9jb2xzLmV4ZWMob3JpZ1BhdGgpKXsKKwkJCQkJCQkJCQlwYXRoID0gb3JpZ1BhdGg7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCXBhdGggPSAobmV3IGRvam8udXJpLlVyaSh1cmwsIG9yaWdQYXRoKS50b1N0cmluZygpKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlICJzdHlsZSI6Ly8gc3R5bGUKKwkJCQkJCQkJCXBhdGggPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQob3JpZ1BhdGgsIHVybCk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXBhdGggPSBvcmlnUGF0aDsKKwkJCQkJCQl9CisJCQkJCQkJZml4ID0gIiAiICsgYXR0clsxXSArICI9IiArIGF0dHJbMl0gKyBwYXRoICsgYXR0clsyXTsKKwkJCQkJCQkvLyBzbGljZXMgdXAgdGFnIGJlZm9yZSBuZXh0IGF0dHJpYnV0ZSBjaGVjaworCQkJCQkJCXRhZ0ZpeCArPSB0YWcuc3Vic3RyaW5nKDAsIGF0dHIuaW5kZXgpICsgZml4OworCQkJCQkJCXRhZyA9IHRhZy5zdWJzdHJpbmcoKGF0dHIuaW5kZXggKyBhdHRyWzBdLmxlbmd0aCksIHRhZy5sZW5ndGgpOworCQkJCQkJfQorCQkJCQkJc3RyICs9IHRhZ0ZpeCArIHRhZzsgLy9kb2pvLmRlYnVnKHRhZ0ZpeCArIHRhZyk7CisJCQkJCX0KKwkJCQkJcyA9IHN0citzOworCQkJCX0KKworCQkJCS8qKioqKioqKioqKioqKioqICBjdXQgb3V0IGFsbCA8c3R5bGU+IGFuZCA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uIj4gKioqKioqKioqKioqKiovCisJCQkJcmVnZXggPSAvKD86PChzdHlsZSlbXj5dKj4oW1xzXFNdKj8pPFwvc3R5bGU+fDxsaW5rIChbXj5dKnJlbD1bJyJdP3N0eWxlc2hlZXRbJyJdP1tePl0qKT4pL2k7CisJCQkJd2hpbGUobWF0Y2ggPSByZWdleC5leGVjKHMpKXsKKwkJCQkJaWYobWF0Y2hbMV0gJiYgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSA9PSAic3R5bGUiKXsKKwkJCQkJCXN0eWxlcy5wdXNoKGRvam8uaHRtbC5maXhQYXRoc0luQ3NzVGV4dChtYXRjaFsyXSx1cmwpKTsKKwkJCQkJfWVsc2UgaWYoYXR0ciA9IG1hdGNoWzNdLm1hdGNoKC9ocmVmPShbJyJdPykoW14nIj5dKilcMS9pKSl7CisJCQkJCQlzdHlsZXMucHVzaCh7cGF0aDogYXR0clsyXX0pOworCQkJCQl9CisJCQkJCXMgPSBzLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisJCQkJfTsKKworCQkJCS8qKioqKioqKioqKioqKioqKiBjdXQgb3V0IGFsbCA8c2NyaXB0PiB0YWdzLCBwdXNoIHRoZW0gaW50byBzY3JpcHRzIGFycmF5ICoqKioqKioqKioqKioqKi8KKwkJCQl2YXIgcmVnZXggPSAvPHNjcmlwdChbXj5dKik+KFtcc1xTXSo/KTxcL3NjcmlwdD4vaTsKKwkJCQl2YXIgcmVnZXhTcmMgPSAvc3JjPShbJyJdPykoW14iJ10qKVwxL2k7CisJCQkJdmFyIHJlZ2V4RG9qb0pzID0gLy4qKFxiZG9qb1xiXC5qcyg/OlwudW5jb21wcmVzc2VkXC5qcyk/KSQvOworCQkJCXZhciByZWdleEludmFsaWQgPSAvKD86dmFyICk/XGJkakNvbmZpZ1xiKD86W1xzXSo9W1xzXSpce1tefV0rXH18XC5bXHddKltcc10qPVtcc10qW147XG5dKik/Oz98ZG9qb1wuaG9zdGVudlwud3JpdGVJbmNsdWRlc1woXHMqXCk7Py9nOworCQkJCXZhciByZWdleFJlcXVpcmVzID0gL2Rvam9cLig/Oig/OnJlcXVpcmUoPzpBZnRlcik/KD86SWYpPyl8KD86d2lkZ2V0XC4oPzptYW5hZ2VyXC4pP3JlZ2lzdGVyV2lkZ2V0UGFja2FnZSl8KD86KD86aG9zdGVudlwuKT9zZXRNb2R1bGVQcmVmaXh8cmVnaXN0ZXJNb2R1bGVQYXRoKXxkZWZpbmVOYW1lc3BhY2UpXCgoWyciXSkuKj9cMVwpXHMqOz8vOworCisJCQkJd2hpbGUobWF0Y2ggPSByZWdleC5leGVjKHMpKXsKKwkJCQkJaWYodGhpcy5leGVjdXRlU2NyaXB0cyAmJiBtYXRjaFsxXSl7CisJCQkJCQlpZihhdHRyID0gcmVnZXhTcmMuZXhlYyhtYXRjaFsxXSkpeworCQkJCQkJCS8vIHJlbW92ZSBhIGRvam8uanMgb3IgZG9qby5qcy51bmNvbXByZXNzZWQuanMgZnJvbSByZW1vdGVTY3JpcHRzCisJCQkJCQkJLy8gd2UgZGVjbGFyZSBhbGwgZmlsZXMgbmFtZWQgZG9qby5qcyBhcyBiYWQsIHJlZ2FyZGxlc3Mgb2YgcGF0aAorCQkJCQkJCWlmKHJlZ2V4RG9qb0pzLmV4ZWMoYXR0clsyXSkpeworCQkJCQkJCQlkb2pvLmRlYnVnKCJTZWN1cml0eSBub3RlISBpbmhpYml0OiIrYXR0clsyXSsiIGZyb20gIGJlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJc2NyaXB0cy5wdXNoKHtwYXRoOiBhdHRyWzJdfSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmKG1hdGNoWzJdKXsKKwkJCQkJCS8vIHJlbW92ZSBhbGwgaW52YWxpZCB2YXJpYWJsZXMgZXRjIGxpa2UgZGpDb25maWcgYW5kIGRvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzKCkKKwkJCQkJCXZhciBzYyA9IG1hdGNoWzJdLnJlcGxhY2UocmVnZXhJbnZhbGlkLCAiIik7CisJCQkJCQlpZighc2MpeyBjb250aW51ZTsgfQorCQkKKwkJCQkJCS8vIGN1dCBvdXQgYWxsIGRvam8ucmVxdWlyZSAoLi4uKSBjYWxscywgaWYgd2UgaGF2ZSBleGVjdXRlIAorCQkJCQkJLy8gc2NyaXB0cyBmYWxzZSB3aWRnZXRzIGRvbnQgZ2V0IHRoZXJlIHJlcXVpcmUgY2FsbHMKKwkJCQkJCS8vIHRha2VzIG91dCBwb3NzaWJsZSB3aWRnZXRwYWNrYWdlIHJlZ2lzdHJhdGlvbiBhcyB3ZWxsCisJCQkJCQl3aGlsZSh0bXAgPSByZWdleFJlcXVpcmVzLmV4ZWMoc2MpKXsKKwkJCQkJCQlyZXF1aXJlcy5wdXNoKHRtcFswXSk7CisJCQkJCQkJc2MgPSBzYy5zdWJzdHJpbmcoMCwgdG1wLmluZGV4KSArIHNjLnN1YnN0cih0bXAuaW5kZXggKyB0bXBbMF0ubGVuZ3RoKTsKKwkJCQkJCX0KKwkJCQkJCWlmKHRoaXMuZXhlY3V0ZVNjcmlwdHMpeworCQkJCQkJCXNjcmlwdHMucHVzaChzYyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcyA9IHMuc3Vic3RyKDAsIG1hdGNoLmluZGV4KSArIHMuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTsKKwkJCQl9CisKKwkJCQkvKioqKioqKioqIGV4dHJhY3QgY29udGVudCAqKioqKioqKiovCisJCQkJaWYodGhpcy5leHRyYWN0Q29udGVudCl7CisJCQkJCW1hdGNoID0gcy5tYXRjaCgvPGJvZHlbXj5dKj5ccyooW1xzXFNdKylccyo8XC9ib2R5Pi9pbSk7CisJCQkJCWlmKG1hdGNoKSB7IHMgPSBtYXRjaFsxXTsgfQorCQkJCX0KKwkKKwkJCQkvKioqIHJlcGxhY2Ugc2NyaXB0U2NvcGUgcHJlZml4IGluIGh0bWwgRXZlbnQgaGFuZGxlcgorCQkJCSogd29ya2luZyBvcmRlcjogZmluZCB0YWdzIHdpdGggc2NyaXB0U2NvcGUgaW4gYSB0YWcgYXR0cmlidXRlCisJCQkJKiB0aGVuIHJlcGxhY2UgYWxsIHN0YW5kYWxvbmUgc2NyaXB0U2NvcGUgb2NjdXJlbmNpZXMgd2l0aCByZWZlcmVuY2UgdG8gdG8gdGhpcyB3aWRnZXQKKwkJCQkqIHZhbGlkIG9uQ2xpY2s9InNjcmlwdFNjb3BlLmZ1bmMoKSIgb3Igb25DbGljaz0ic2NyaXB0U2NvcGVbJ2Z1bmMnXSgpO3NjcmlwdFNjb3BlLmkrKyIKKwkJCQkqIG5vdCB2YWxpZCBvbkNsaWNrPSJ2YXIuc2NyaXB0U2NvcGUucmVmIiBub3Igb25DbGljaz0idmFyWydzY3JpcHRTY29wZSddLnJlZiIgKi8KKwkJCQlpZih0aGlzLmV4ZWN1dGVTY3JpcHRzICYmIHRoaXMuc2NyaXB0U2VwYXJhdGlvbil7CisJCQkJCXZhciByZWdleCA9IC8oPFthLXpBLVpdW2EtekEtWjAtOV0qXHNbXj5dKj9cUz0pKChbJyJdKVtePl0qc2NyaXB0U2NvcGVbXj5dKj4pLzsKKwkJCQkJdmFyIHJlZ2V4QXR0ciA9IC8oW1xzJyI7OlwoXSlzY3JpcHRTY29wZSguKikvOyAvLyB3ZSByZWx5IG9uIHRoYXQgYXR0cmlidXRlIGJlZ2lucyAnIG9yICIKKwkJCQkJc3RyID0gIiI7IAorCQkJCQl3aGlsZSh0YWcgPSByZWdleC5leGVjKHMpKXsKKwkJCQkJCXRtcCA9ICgodGFnWzNdPT0iJyIpID8gJyInOiAiJyIpO2ZpeD0gIiI7CisJCQkJCQlzdHIgKz0gcy5zdWJzdHJpbmcoMCwgdGFnLmluZGV4KSArIHRhZ1sxXTsKKwkJCQkJCXdoaWxlKGF0dHIgPSByZWdleEF0dHIuZXhlYyh0YWdbMl0pKXsKKwkJCQkJCQl0YWdbMl0gPSB0YWdbMl0uc3Vic3RyaW5nKDAsIGF0dHIuaW5kZXgpICsgYXR0clsxXSArICJkb2pvLndpZGdldC5ieUlkKCIrIHRtcCArIHRoaXMud2lkZ2V0SWQgKyB0bXAgKyAiKS5zY3JpcHRTY29wZSIgKyBhdHRyWzJdOworCQkJCQkJfQorCQkJCQkJc3RyICs9IHRhZ1syXTsKKwkJCQkJCXMgPSBzLnN1YnN0cih0YWcuaW5kZXggKyB0YWdbMF0ubGVuZ3RoKTsKKwkJCQkJfQorCQkJCQlzID0gc3RyICsgczsKKwkJCQl9CisJIAkJfQorCisJCQlyZXR1cm4geyJ4bWwiOiAJCXMsIC8vIE9iamVjdAorCQkJCSJzdHlsZXMiOgkJc3R5bGVzLAorCQkJCSJ0aXRsZXMiOiAJCXRpdGxlcywKKwkJCQkicmVxdWlyZXMiOiAJcmVxdWlyZXMsCisJCQkJInNjcmlwdHMiOiAJCXNjcmlwdHMsCisJCQkJInVybCI6IAkJCXVybH07CisJCX0sCisJCisJCQorCQlfc2V0Q29udGVudDogZnVuY3Rpb24oY29udCl7CisJCQl0aGlzLmRlc3Ryb3lDaGlsZHJlbigpOworCQorCQkJLy8gcmVtb3ZlIG9sZCBzdHlsZW5vZGVzIGZyb20gSEVBRAorCQkJZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX3N0eWxlTm9kZXMubGVuZ3RoOyBpKyspeworCQkJCWlmKHRoaXMuX3N0eWxlTm9kZXNbaV0gJiYgdGhpcy5fc3R5bGVOb2Rlc1tpXS5wYXJlbnROb2RlKXsKKwkJCQkJdGhpcy5fc3R5bGVOb2Rlc1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX3N0eWxlTm9kZXNbaV0pOworCQkJCX0KKwkJCX0KKwkJCXRoaXMuX3N0eWxlTm9kZXMgPSBbXTsKKworCQkJdHJ5eworCQkJCXZhciBub2RlID0gdGhpcy5jb250YWluZXJOb2RlIHx8IHRoaXMuZG9tTm9kZTsKKwkJCQl3aGlsZShub2RlLmZpcnN0Q2hpbGQpeworCQkJCQlkb2pvLmh0bWwuZGVzdHJveU5vZGUobm9kZS5maXJzdENoaWxkKTsKKwkJCQl9CisJCQkJaWYodHlwZW9mIGNvbnQgIT0gInN0cmluZyIpeworCQkJCQlub2RlLmFwcGVuZENoaWxkKGNvbnQpOworCQkJCX1lbHNleworCQkJCQlub2RlLmlubmVySFRNTCA9IGNvbnQ7CisJCQkJfQorCQkJfWNhdGNoKGUpeworCQkJCWUudGV4dCA9ICJDb3VsZG4ndCBsb2FkIGNvbnRlbnQ6IitlLmRlc2NyaXB0aW9uOworCQkJCXRoaXMuX2hhbmRsZURlZmF1bHRzKGUsICJvbkNvbnRlbnRFcnJvciIpOworCQkJfQorCQl9LAorCQorCQlzZXRDb250ZW50OiBmdW5jdGlvbihkYXRhKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJUmVwbGFjZXMgb2xkIGNvbnRlbnQgd2l0aCBkYXRhIGNvbnRlbnQsIGluY2x1ZGUgc3R5bGUgY2xhc3NlcyBmcm9tIG9sZCBjb250ZW50CisJCQkvLwlkYXRhIFN0cmluZ3x8RG9tTm9kZToJbmV3IGNvbnRlbnQsIGJlIGl0IERvY3VtZW50IGZyYWdtZW50IG9yIGEgRG9tTm9kZSBjaGFpbgorCQkJLy8JCQlJZiBkYXRhIGNvbnRhaW5zIHN0eWxlIHRhZ3MsIGxpbmsgcmVsPXN0eWxlc2hlZXQgaXQgaW5zZXJ0cyB0aG9zZSBzdHlsZXMgaW50byBET00KKwkJCXRoaXMuYWJvcnQoKTsKKwkJCWlmKHRoaXMuX2NhbGxPblVubG9hZCl7IHRoaXMub25VbmxvYWQoKTsgfS8vIHRoaXMgdGVsbHMgYSByZW1vdGUgc2NyaXB0IGNsZWFuIHVwIGFmdGVyIGl0c2VsZgorCQkJdGhpcy5fY2FsbE9uVW5sb2FkID0gdHJ1ZTsKKwkKKwkJCWlmKCFkYXRhIHx8IGRvam8uaHRtbC5pc05vZGUoZGF0YSkpeworCQkJCS8vIGlmIHdlIGRvIGEgY2xlYW4gdXNpbmcgc2V0Q29udGVudCgiIik7IG9yIHNldENvbnRlbnQoI25vZGUpIGJ5cGFzcyBhbGwgcGFyc2luZywgZXh0cmFjdENvbnRlbnQgZXRjCisJCQkJdGhpcy5fc2V0Q29udGVudChkYXRhKTsKKwkJCQl0aGlzLm9uUmVzaXplZCgpOworCQkJCXRoaXMub25Mb2FkKCk7CisJCQl9ZWxzZXsKKwkJCQkvLyBuZWVkIHRvIHJ1biBzcGxpdEFuZEZpeFBhdGhzPyBpZS4gbWFudWFsbHkgc2V0dGluZyBjb250ZW50CisJCQkJLy8gYWRqdXN0UGF0aHMgaXMgdGFrZW4gY2FyZSBvZiBpbnNpZGUgc3BsaXRBbmRGaXhQYXRocworCQkJCWlmKHR5cGVvZiBkYXRhLnhtbCAhPSAic3RyaW5nIil7IAorCQkJCQl0aGlzLmhyZWYgPSAiIjsgLy8gc28gd2UgY2FuIHJlZnJlc2ggc2FmZWx5CisJCQkJCWRhdGEgPSB0aGlzLnNwbGl0QW5kRml4UGF0aHMoZGF0YSk7IAorCQkJCX0KKworCQkJCXRoaXMuX3NldENvbnRlbnQoZGF0YS54bWwpOworCisJCQkJLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIGNvbnRlbnQgKGluIHNhbWUgb3JkZXIgdGhleSBjYW1lIGluKQorCQkJCWZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLnN0eWxlcy5sZW5ndGg7IGkrKyl7CisJCQkJCWlmKGRhdGEuc3R5bGVzW2ldLnBhdGgpeworCQkJCQkJdGhpcy5fc3R5bGVOb2Rlcy5wdXNoKGRvam8uaHRtbC5pbnNlcnRDc3NGaWxlKGRhdGEuc3R5bGVzW2ldLnBhdGgsIGRvam8uZG9jKCksIGZhbHNlLCB0cnVlKSk7CisJCQkJCX1lbHNleworCQkJCQkJdGhpcy5fc3R5bGVOb2Rlcy5wdXNoKGRvam8uaHRtbC5pbnNlcnRDc3NUZXh0KGRhdGEuc3R5bGVzW2ldKSk7CisJCQkJCX0KKwkJCQl9CisJCisJCQkJaWYodGhpcy5wYXJzZUNvbnRlbnQpeworCQkJCQlmb3IodmFyIGkgPSAwOyBpIDwgZGF0YS5yZXF1aXJlcy5sZW5ndGg7IGkrKyl7CisJCQkJCQl0cnl7CisJCQkJCQkJZXZhbChkYXRhLnJlcXVpcmVzW2ldKTsKKwkJCQkJCX0gY2F0Y2goZSl7CisJCQkJCQkJZS50ZXh0ID0gIkNvbnRlbnRQYW5lOiBlcnJvciBpbiBwYWNrYWdlIGxvYWRpbmcgY2FsbHMsICIgKyAoZS5kZXNjcmlwdGlvbnx8ZSk7CisJCQkJCQkJdGhpcy5faGFuZGxlRGVmYXVsdHMoZSwgIm9uQ29udGVudEVycm9yIiwgImRlYnVnIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gbmVlZCB0byBhbGxvdyBhc3luYyBsb2FkLCBYZG9tYWluIHVzZXMgaXQKKwkJCQkvLyBpcyBpbmxpbmUgZnVuY3Rpb24gYmVjYXVzZSB3ZSBjYW50IHNlbmQgYXJncyB0byBkb2pvLmFkZE9uTG9hZAorCQkJCXZhciBfc2VsZiA9IHRoaXM7CisJCQkJZnVuY3Rpb24gYXN5bmNQYXJzZSgpeworCQkJCQlpZihfc2VsZi5leGVjdXRlU2NyaXB0cyl7CisJCQkJCQlfc2VsZi5fZXhlY3V0ZVNjcmlwdHMoZGF0YS5zY3JpcHRzKTsKKwkJCQkJfQorCQorCQkJCQlpZihfc2VsZi5wYXJzZUNvbnRlbnQpeworCQkJCQkJdmFyIG5vZGUgPSBfc2VsZi5jb250YWluZXJOb2RlIHx8IF9zZWxmLmRvbU5vZGU7CisJCQkJCQl2YXIgcGFyc2VyID0gbmV3IGRvam8ueG1sLlBhcnNlKCk7CisJCQkJCQl2YXIgZnJhZyA9IHBhcnNlci5wYXJzZUVsZW1lbnQobm9kZSwgbnVsbCwgdHJ1ZSk7CisJCQkJCQkvLyBjcmVhdGVTdWJDb21wb25lbnRzIG5vdCBjcmVhdGVDb21wb25lbnRzIGJlY2F1c2UgZnJhZyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKKwkJCQkJCWRvam8ud2lkZ2V0LmdldFBhcnNlcigpLmNyZWF0ZVN1YkNvbXBvbmVudHMoZnJhZywgX3NlbGYpOworCQkJCQl9CisJCisJCQkJCV9zZWxmLm9uUmVzaXplZCgpOworCQkJCQlfc2VsZi5vbkxvYWQoKTsKKwkJCQl9CisJCQkJLy8gdHJ5IGFzIGxvbmcgYXMgcG9zc2libGUgdG8gbWFrZSBzZXRDb250ZW50IHN5bmMgY2FsbAorCQkJCWlmKGRvam8uaG9zdGVudi5pc1hEb21haW4gJiYgZGF0YS5yZXF1aXJlcy5sZW5ndGgpeworCQkJCQlkb2pvLmFkZE9uTG9hZChhc3luY1BhcnNlKTsKKwkJCQl9ZWxzZXsKKwkJCQkJYXN5bmNQYXJzZSgpOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQlzZXRIYW5kbGVyOiBmdW5jdGlvbigvKkZ1bmN0aW9uKi8gaGFuZGxlcikgeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlHZW5lcmF0ZSBwYW5lIGNvbnRlbnQgZnJvbSBnaXZlbiBqYXZhIGZ1bmN0aW9uCisJCQl2YXIgZmNuID0gZG9qby5sYW5nLmlzRnVuY3Rpb24oaGFuZGxlcikgPyBoYW5kbGVyIDogd2luZG93W2hhbmRsZXJdOworCQkJaWYoIWRvam8ubGFuZy5pc0Z1bmN0aW9uKGZjbikpIHsKKwkJCQkvLyBGSVhNRTogbmVlZHMgdGVzdGluZyEgc29tZWJvZHkgd2l0aCBqYXZhIGtub3dsZWRnZSBuZWVkcyB0byB0cnkgdGhpcworCQkJCXRoaXMuX2hhbmRsZURlZmF1bHRzKCJVbmFibGUgdG8gc2V0IGhhbmRsZXIsICciICsgaGFuZGxlciArICInIG5vdCBhIGZ1bmN0aW9uLiIsICJvbkV4ZWNFcnJvciIsIHRydWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKCkgeworCQkJCXJldHVybiBmY24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0KKwkJfSwKKwkKKwkJX3J1bkhhbmRsZXI6IGZ1bmN0aW9uKCkgeworCQkJdmFyIHJldCA9IHRydWU7CisJCQlpZihkb2pvLmxhbmcuaXNGdW5jdGlvbih0aGlzLmhhbmRsZXIpKSB7CisJCQkJdGhpcy5oYW5kbGVyKHRoaXMsIHRoaXMuZG9tTm9kZSk7CisJCQkJcmV0ID0gZmFsc2U7CisJCQl9CisJCQl0aGlzLm9uTG9hZCgpOworCQkJcmV0dXJuIHJldDsKKwkJfSwKKwkKKwkJX2V4ZWN1dGVTY3JpcHRzOiBmdW5jdGlvbihzY3JpcHRzKSB7CisJCQkvLyBsb29wIHRocm91Z2ggdGhlIHNjcmlwdHMgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbgorCQkJdmFyIHNlbGYgPSB0aGlzOworCQkJdmFyIHRtcCA9ICIiLCBjb2RlID0gIiI7CisJCQlmb3IodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKyl7CisJCQkJaWYoc2NyaXB0c1tpXS5wYXRoKXsgLy8gcmVtb3Rlc2NyaXB0CisJCQkJCWRvam8uaW8uYmluZCh0aGlzLl9jYWNoZVNldHRpbmcoeworCQkJCQkJInVybCI6IAkJc2NyaXB0c1tpXS5wYXRoLAorCQkJCQkJImxvYWQiOiAgICAgZnVuY3Rpb24odHlwZSwgc2NyaXB0U3RyKXsKKwkJCQkJCQkJZG9qby5sYW5nLmhpdGNoKHNlbGYsIHRtcCA9ICI7IitzY3JpcHRTdHIpOworCQkJCQkJfSwKKwkJCQkJCSJlcnJvciI6ICAgIGZ1bmN0aW9uKHR5cGUsIGVycm9yKXsKKwkJCQkJCQkJZXJyb3IudGV4dCA9IHR5cGUgKyAiIGRvd25sb2FkaW5nIHJlbW90ZSBzY3JpcHQiOworCQkJCQkJCQlzZWxmLl9oYW5kbGVEZWZhdWx0cy5jYWxsKHNlbGYsIGVycm9yLCAib25FeGVjRXJyb3IiLCAiZGVidWciKTsKKwkJCQkJCX0sCisJCQkJCQkibWltZXR5cGUiOiAidGV4dC9wbGFpbiIsCisJCQkJCQkic3luYyI6ICAgICB0cnVlCisJCQkJCX0sIHRoaXMuY2FjaGVDb250ZW50KSk7CisJCQkJCWNvZGUgKz0gdG1wOworCQkJCX1lbHNleworCQkJCQljb2RlICs9IHNjcmlwdHNbaV07CisJCQkJfQorCQkJfQorCisKKwkJCXRyeXsKKwkJCQlpZih0aGlzLnNjcmlwdFNlcGFyYXRpb24peworCQkJCQkvLyBpbml0aWFsaXplIGEgbmV3IGFub255bW91cyBjb250YWluZXIgZm9yIG91ciBzY3JpcHQsIGRvbnQgbWFrZSBpdCBwYXJ0IG9mIHRoaXMgd2lkZ2V0cyBzY29wZSBjaGFpbgorCQkJCQkvLyBpbnN0ZWFkIHNlbmQgaW4gYSB2YXJpYWJsZSB0aGF0IHBvaW50cyB0byB0aGlzIHdpZGdldCwgdXNlZnVsIHRvIGNvbm5lY3QgZXZlbnRzIHRvIG9uTG9hZCwgb25VbmxvYWQgZXRjLi4KKwkJCQkJZGVsZXRlIHRoaXMuc2NyaXB0U2NvcGU7CisJCQkJCXRoaXMuc2NyaXB0U2NvcGUgPSBuZXcgKG5ldyBGdW5jdGlvbignX2NvbnRhaW5lcl8nLCBjb2RlKyc7IHJldHVybiB0aGlzOycpKShzZWxmKTsKKwkJCQl9ZWxzZXsKKwkJCQkJLy8gZXhlYyBpbiBnbG9iYWwsIGxvc2UgdGhlIF9jb250YWluZXJfIGZlYXR1cmUKKwkJCQkJdmFyIGRqZyA9IGRvam8uZ2xvYmFsKCk7CisJCQkJCWlmKGRqZy5leGVjU2NyaXB0KXsKKwkJCQkJCWRqZy5leGVjU2NyaXB0KGNvZGUpOworCQkJCQl9ZWxzZXsKKwkJCQkJCXZhciBkamQgPSBkb2pvLmRvYygpOworCQkJCQkJdmFyIHNjID0gZGpkLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJCQkJc2MuYXBwZW5kQ2hpbGQoZGpkLmNyZWF0ZVRleHROb2RlKGNvZGUpKTsKKwkJCQkJCSh0aGlzLmNvbnRhaW5lck5vZGV8fHRoaXMuZG9tTm9kZSkuYXBwZW5kQ2hpbGQoc2MpOworCQkJCQl9CisJCQkJfQorCQkJfWNhdGNoKGUpeworCQkJCWUudGV4dCA9ICJFcnJvciBydW5uaW5nIHNjcmlwdHMgZnJvbSBjb250ZW50OlxuIitlLmRlc2NyaXB0aW9uOworCQkJCXRoaXMuX2hhbmRsZURlZmF1bHRzKGUsICJvbkV4ZWNFcnJvciIsICJkZWJ1ZyIpOworCQkJfQorCQl9CisJfQorKTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhciIpOworCisKKworCisKKworCisKKworCitkb2pvLmxhbmcuZGVjbGFyZSgiZG9qby53aWRnZXQuSGFuZGxlck1hbmFnZXIiLCBudWxsLAorCWZ1bmN0aW9uKCl7CisJCXRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVycz1bXTsKKwl9LAoreworCS8vIHN1bW1hcnk6IGludGVybmFsIGJhc2UgY2xhc3MgZm9yIGhhbmRsZXIgZnVuY3Rpb24gbWFuYWdlbWVudAorCXJlZ2lzdGVySGFuZGxlcjogZnVuY3Rpb24oLypPYmplY3QqL29iaiwgLypTdHJpbmcqL2Z1bmMpeworCQkvLyBzdW1tYXJ5OiByZWdpc3RlciBhIGhhbmRsZXIKKwkJLy8gb2JqOiBvYmplY3Qgd2hpY2ggaGFzIHRoZSBmdW5jdGlvbiB0byBjYWxsCisJCS8vIGZ1bmM6IHRoZSBmdW5jdGlvbiBpbiB0aGUgb2JqZWN0CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMil7CisJCQl0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMucHVzaChmdW5jdGlvbigpe3JldHVybiBvYmpbZnVuY10uYXBwbHkob2JqLCBhcmd1bWVudHMpO30pOworCQl9ZWxzZXsKKwkJCS8qIG9iajogRnVuY3Rpb24KKwkJCSAgICBmdW5jOiBudWxsCisJCQkgICAgcElkOiBmICovCisJCQl0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMucHVzaChvYmopOworCQl9CisJfSwKKwlyZW1vdmVIYW5kbGVyOiBmdW5jdGlvbihmdW5jKXsKKwkJLy8gc3VtbWFyeTogcmVtb3ZlIGEgcmVnaXN0ZXJlZCBoYW5kbGVyCisJCWZvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworCQkJaWYoZnVuYyA9PT0gdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldKXsKKwkJCQlkZWxldGUgdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlkb2pvLmRlYnVnKCJIYW5kbGVyTWFuYWdlciBoYW5kbGVyICIrZnVuYysiIGlzIG5vdCByZWdpc3RlcmVkLCBjYW4gbm90IHJlbW92ZS4iKTsKKwl9LAorCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCWZvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworCQkJZGVsZXRlIHRoaXMuX3JlZ2lzdGVyZWRIYW5kbGVyc1tpXTsKKwkJfQorCX0KK30pOworCitkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyID0gbmV3IGRvam8ud2lkZ2V0LkhhbmRsZXJNYW5hZ2VyOworZG9qby5sYW5nLm1peGluKGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFySXRlbU1hbmFnZXIsCit7CisJZ2V0VG9vbGJhckl0ZW06IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkJLy8gc3VtbWFyeTogcmV0dXJuIGEgdG9vYmFyIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gbmFtZQorCQl2YXIgaXRlbTsKKwkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJZm9yKHZhciBpPTA7aTx0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnMubGVuZ3RoO2krKyl7CisJCQlpdGVtID0gdGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzW2ldKG5hbWUpOworCQkJaWYoaXRlbSl7CisJCQkJcmV0dXJuIGl0ZW07CisJCQl9CisJCX0KKworCQlzd2l0Y2gobmFtZSl7CisJCQkvL2J1dHRvbiBmb3IgYnVpbHRpbiBmdW5jdGlvbnMKKwkJCWNhc2UgJ2JvbGQnOgorCQkJY2FzZSAnY29weSc6CisJCQljYXNlICdjdXQnOgorCQkJY2FzZSAnZGVsZXRlJzoKKwkJCWNhc2UgJ2luZGVudCc6CisJCQljYXNlICdpbnNlcnRob3Jpem9udGFscnVsZSc6CisJCQljYXNlICdpbnNlcnRvcmRlcmVkbGlzdCc6CisJCQljYXNlICdpbnNlcnR1bm9yZGVyZWRsaXN0JzoKKwkJCWNhc2UgJ2l0YWxpYyc6CisJCQljYXNlICdqdXN0aWZ5Y2VudGVyJzoKKwkJCWNhc2UgJ2p1c3RpZnlmdWxsJzoKKwkJCWNhc2UgJ2p1c3RpZnlsZWZ0JzoKKwkJCWNhc2UgJ2p1c3RpZnlyaWdodCc6CisJCQljYXNlICdvdXRkZW50JzoKKwkJCWNhc2UgJ3Bhc3RlJzoKKwkJCWNhc2UgJ3JlZG8nOgorCQkJY2FzZSAncmVtb3ZlZm9ybWF0JzoKKwkJCWNhc2UgJ3NlbGVjdGFsbCc6CisJCQljYXNlICdzdHJpa2V0aHJvdWdoJzoKKwkJCWNhc2UgJ3N1YnNjcmlwdCc6CisJCQljYXNlICdzdXBlcnNjcmlwdCc6CisJCQljYXNlICd1bmRlcmxpbmUnOgorCQkJY2FzZSAndW5kbyc6CisJCQljYXNlICd1bmxpbmsnOgorCQkJY2FzZSAnY3JlYXRlbGluayc6CisJCQljYXNlICdpbnNlcnRpbWFnZSc6CisJCQkvL2V4dHJhIHNpbXBsZSBidXR0b25zCisJCQljYXNlICdodG1sdG9nZ2xlJzoKKwkJCQlpdGVtID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQnV0dG9uKG5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZm9yZWNvbG9yJzoKKwkJCWNhc2UgJ2hpbGl0ZWNvbG9yJzoKKwkJCQlpdGVtID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29sb3JQYWxldHRlQnV0dG9uKG5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAncGxhaW5mb3JtYXRibG9jayc6CisJCQkJaXRlbSA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3QoImZvcm1hdGJsb2NrIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdmb3JtYXRibG9jayc6CisJCQkJaXRlbSA9IG5ldyBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0KCJmb3JtYXRibG9jayIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZm9udHNpemUnOgorCQkJCWl0ZW0gPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb250U2l6ZVNlbGVjdCgiZm9udHNpemUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2ZvbnRuYW1lJzoKKwkJCQlpdGVtID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udE5hbWVTZWxlY3QoImZvbnRuYW1lIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdpbnNlcnR0YWJsZSc6CisJCQljYXNlICdpbnNlcnRjZWxsJzoKKwkJCWNhc2UgJ2luc2VydGNvbCc6CisJCQljYXNlICdpbnNlcnRyb3cnOgorCQkJY2FzZSAnZGVsZXRlY2VsbHMnOgorCQkJY2FzZSAnZGVsZXRlY29scyc6CisJCQljYXNlICdkZWxldGVyb3dzJzoKKwkJCWNhc2UgJ21lcmdlY2VsbHMnOgorCQkJY2FzZSAnc3BsaXRjZWxsJzoKKwkJCQlkb2pvLmRlYnVnKG5hbWUgKyAiIGlzIGltcGxlbWVudGVkIGluIGRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uVGFibGVPcGVyYXRpb24sIHBsZWFzZSByZXF1aXJlIGl0IGZpcnN0LiIpOworCQkJCWJyZWFrOworCQkJLy9UT0RPOgorCQkJY2FzZSAnaW5zZXJ0aHRtbCc6CisJCQljYXNlICdibG9ja2Rpcmx0cic6CisJCQljYXNlICdibG9ja2RpcnJ0bCc6CisJCQljYXNlICdkaXJsdHInOgorCQkJY2FzZSAnZGlycnRsJzoKKwkJCWNhc2UgJ2lubGluZWRpcmx0cic6CisJCQljYXNlICdpbmxpbmVkaXJydGwnOgorCQkJCWRvam8uZGVidWcoIk5vdCB5ZXQgaW1wbGVtZW50ZWQgdG9vbGJhciBpdGVtOiAiK25hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLmdldFRvb2xiYXJJdGVtOiBVbmtub3duIHRvb2xiYXIgaXRlbTogIituYW1lKTsKKwkJfQorCQlyZXR1cm4gaXRlbTsKKwl9Cit9KTsKKworZG9qby5hZGRPblVubG9hZChkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckl0ZW1NYW5hZ2VyLCAiZGVzdHJveSIpOworCitkb2pvLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQnV0dG9uIiwgbnVsbCwKKwlmdW5jdGlvbihuYW1lKXsKKwkJdGhpcy5fbmFtZSA9IG5hbWU7CisvLwkJdGhpcy5fY29tbWFuZCA9IGVkaXRvci5nZXRDb21tYW5kKG5hbWUpOworCX0sCit7CisJLy8gc3VtbWFyeToKKwkvLwkJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24gaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0b29sYmFyIGl0ZW0gaW4gRWRpdG9yMlRvb2xiYXIKKwljcmVhdGU6IGZ1bmN0aW9uKC8qRG9tTm9kZSovbm9kZSwgLypkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhciovdG9vbGJhciwgLypCb29sZWFuKi9ub2hvdmVyKXsKKwkJLy8gc3VtbWFyeTogY3JlYXRlIHRoZSBpdGVtCisJCS8vIG5vZGU6IHRoZSBkb20gbm9kZSB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGlzIHRvb2xiYXIgaXRlbQorCQkvLyB0b29sYmFyOiB0aGUgRWRpdG9yMlRvb2xiYXIgd2lkZ2V0IHRoaXMgdG9vbGJhciBpdGVtIGJlbG9uZ2luZyB0bworCQkvLyBub2hvdmVyOiB3aGV0aGVyIHRoaXMgaXRlbSBpbiBjaGFyZ2Ugb2YgaGlnaGxpZ2h0IHRoaXMgaXRlbQorCQl0aGlzLl9kb21Ob2RlID0gbm9kZTsKKwkJdmFyIGNtZCA9IHRvb2xiYXIucGFyZW50LmdldENvbW1hbmQodGhpcy5fbmFtZSk7IC8vRklYTUU6IG1heWJlIGFuIGlzc3VlIGlmIGRpZmZlcmVudCBpbnN0YW5jZSBoYXMgZGlmZmVyZW50IGxhbmd1YWdlCisJCWlmKGNtZCl7CisJCQl0aGlzLl9kb21Ob2RlLnRpdGxlID0gY21kLmdldFRleHQoKTsKKwkJfQorCQkvL21ha2UgdGhpcyB1bnNlbGVjdGFibGU6IGRpZmZlcmVudCBicm93c2VycworCQkvL3VzZSBkaWZmZXJlbnQgcHJvcGVydGllcyBmb3IgdGhpcywgc28gdXNlCisJCS8vanMgZG8gaXQgYXV0b21hdGljYWxseQorCQl0aGlzLmRpc2FibGVTZWxlY3Rpb24odGhpcy5fZG9tTm9kZSk7CisKKwkJdGhpcy5fcGFyZW50VG9vbGJhciA9IHRvb2xiYXI7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCAnb25jbGljaycsIHRoaXMsICdvbkNsaWNrJyk7CisJCWlmKCFub2hvdmVyKXsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCAnb25tb3VzZW92ZXInLCB0aGlzLCAnb25Nb3VzZU92ZXInKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kb21Ob2RlLCAnb25tb3VzZW91dCcsIHRoaXMsICdvbk1vdXNlT3V0Jyk7CisJCX0KKwl9LAorCWRpc2FibGVTZWxlY3Rpb246IGZ1bmN0aW9uKC8qRG9tTm9kZSovcm9vdG5vZGUpeworCQkvLyBzdW1tYXJ5OiBkaXNhYmxlIHNlbGVjdGlvbiBvbiB0aGUgcGFzc2VkIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4KKwkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24ocm9vdG5vZGUpOworCQl2YXIgbm9kZXMgPSByb290bm9kZS5hbGwgfHwgcm9vdG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJZm9yKHZhciB4PTA7IHg8bm9kZXMubGVuZ3RoOyB4KyspeworCQkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24obm9kZXNbeF0pOworCQl9CisJfSwKKwlvbk1vdXNlT3ZlcjogZnVuY3Rpb24oKXsKKwkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJaWYoY3VySW5zdCl7CisJCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CisJCQlpZihfY29tbWFuZCAmJiBfY29tbWFuZC5nZXRTdGF0ZSgpICE9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCl7CisJCQkJdGhpcy5oaWdobGlnaHRUb29sYmFySXRlbSgpOworCQkJfQorCQl9CisJfSwKKwlvbk1vdXNlT3V0OiBmdW5jdGlvbigpeworCQl0aGlzLnVuaGlnaGxpZ2h0VG9vbGJhckl0ZW0oKTsKKwl9LAorCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGRlc3RydWN0b3IKKwkJdGhpcy5fZG9tTm9kZSA9IG51bGw7CisvLwkJZGVsZXRlIHRoaXMuX2NvbW1hbmQ7CisJCXRoaXMuX3BhcmVudFRvb2xiYXIgPSBudWxsOworCX0sCisJb25DbGljazogZnVuY3Rpb24oZSl7CisJCWlmKHRoaXMuX2RvbU5vZGUgJiYgIXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQgJiYgdGhpcy5fcGFyZW50VG9vbGJhci5jaGVja0F2YWlsYWJpbGl0eSgpKXsKKwkJCWUucHJldmVudERlZmF1bHQoKTsKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQkJaWYoY3VySW5zdCl7CisJCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJCWlmKF9jb21tYW5kKXsKKwkJCQkJX2NvbW1hbmQuZXhlY3V0ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJcmVmcmVzaFN0YXRlOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiB1cGRhdGUgdGhlIHN0YXRlIG9mIHRoZSB0b29sYmFyIGl0ZW0KKwkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJdmFyIGVtID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXI7CisJCWlmKGN1ckluc3QpeworCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJaWYoX2NvbW1hbmQpeworCQkJCXZhciBzdGF0ZSA9IF9jb21tYW5kLmdldFN0YXRlKCk7CisJCQkJaWYoc3RhdGUgIT0gdGhpcy5fbGFzdFN0YXRlKXsKKwkJCQkJc3dpdGNoKHN0YXRlKXsKKwkJCQkJCWNhc2UgZW0uY29tbWFuZFN0YXRlLkxhdGNoZWQ6CisJCQkJCQkJdGhpcy5sYXRjaFRvb2xiYXJJdGVtKCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIGVtLmNvbW1hbmRTdGF0ZS5FbmFibGVkOgorCQkJCQkJCXRoaXMuZW5hYmxlVG9vbGJhckl0ZW0oKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgZW0uY29tbWFuZFN0YXRlLkRpc2FibGVkOgorCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQl0aGlzLmRpc2FibGVUb29sYmFySXRlbSgpOworCQkJCQl9CisJCQkJCXRoaXMuX2xhc3RTdGF0ZSA9IHN0YXRlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZW0uY29tbWFuZFN0YXRlLkVuYWJsZWQ7CisJfSwKKworCWxhdGNoVG9vbGJhckl0ZW06IGZ1bmN0aW9uKCl7CisJCXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQgPSBmYWxzZTsKKwkJdGhpcy5yZW1vdmVUb29sYmFySXRlbVN0eWxlKHRoaXMuX2RvbU5vZGUpOworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFyTGF0Y2hlZEl0ZW1TdHlsZSk7CisJfSwKKworCWVuYWJsZVRvb2xiYXJJdGVtOiBmdW5jdGlvbigpeworCQl0aGlzLl9kb21Ob2RlLmRpc2FibGVkID0gZmFsc2U7CisJCXRoaXMucmVtb3ZlVG9vbGJhckl0ZW1TdHlsZSh0aGlzLl9kb21Ob2RlKTsKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuX2RvbU5vZGUsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckVuYWJsZWRJdGVtU3R5bGUpOworCX0sCisKKwlkaXNhYmxlVG9vbGJhckl0ZW06IGZ1bmN0aW9uKCl7CisJCXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQgPSB0cnVlOworCQl0aGlzLnJlbW92ZVRvb2xiYXJJdGVtU3R5bGUodGhpcy5fZG9tTm9kZSk7CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJEaXNhYmxlZEl0ZW1TdHlsZSk7CisJfSwKKworCWhpZ2hsaWdodFRvb2xiYXJJdGVtOiBmdW5jdGlvbigpeworCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5fZG9tTm9kZSwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRJdGVtU3R5bGUpOworCX0sCisKKwl1bmhpZ2hsaWdodFRvb2xiYXJJdGVtOiBmdW5jdGlvbigpeworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5fZG9tTm9kZSwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRJdGVtU3R5bGUpOworCX0sCisKKwlyZW1vdmVUb29sYmFySXRlbVN0eWxlOiBmdW5jdGlvbigpeworCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5fZG9tTm9kZSwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFyRW5hYmxlZEl0ZW1TdHlsZSk7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLl9kb21Ob2RlLCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJMYXRjaGVkSXRlbVN0eWxlKTsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuX2RvbU5vZGUsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckRpc2FibGVkSXRlbVN0eWxlKTsKKwkJdGhpcy51bmhpZ2hsaWdodFRvb2xiYXJJdGVtKCk7CisJfQorfSk7CisKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJEcm9wRG93bkJ1dHRvbiIsIGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQnV0dG9uLCB7CisJLy8gc3VtbWFyeTogZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJEcm9wRG93bkJ1dHRvbiBleHRlbmRzIHRoZSBiYXNpYyBidXR0b24gd2l0aCBhIGRyb3Bkb3duIGxpc3QKKworCW9uQ2xpY2s6IGZ1bmN0aW9uKCl7CisJCWlmKHRoaXMuX2RvbU5vZGUgJiYgIXRoaXMuX2RvbU5vZGUuZGlzYWJsZWQgJiYgdGhpcy5fcGFyZW50VG9vbGJhci5jaGVja0F2YWlsYWJpbGl0eSgpKXsKKwkJCWlmKCF0aGlzLl9kcm9wZG93bil7CisJCQkJdGhpcy5fZHJvcGRvd24gPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlBvcHVwQ29udGFpbmVyIiwge30pOworCQkJCXRoaXMuX2RvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcGRvd24uZG9tTm9kZSk7CisJCQl9CisJCQlpZih0aGlzLl9kcm9wZG93bi5pc1Nob3dpbmdOb3cpeworCQkJCXRoaXMuX2Ryb3Bkb3duLmNsb3NlKCk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLm9uRHJvcERvd25TaG93bigpOworCQkJCXRoaXMuX2Ryb3Bkb3duLm9wZW4odGhpcy5fZG9tTm9kZSwgbnVsbCwgdGhpcy5fZG9tTm9kZSk7CisJCQl9CisJCX0KKwl9LAorCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCXRoaXMub25Ecm9wRG93bkRlc3Ryb3koKTsKKwkJaWYodGhpcy5fZHJvcGRvd24peworCQkJdGhpcy5fZHJvcGRvd24uZGVzdHJveSgpOworCQl9CisJCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24uc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7CisJfSwKKwlvbkRyb3BEb3duU2hvd246IGZ1bmN0aW9uKCl7fSwKKwlvbkRyb3BEb3duRGVzdHJveTogZnVuY3Rpb24oKXt9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckNvbG9yUGFsZXR0ZUJ1dHRvbiIsIGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24sIHsKKwkvLyBzdW1tYXJ5OiBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckNvbG9yUGFsZXR0ZUJ1dHRvbiBwcm92aWRlcyBhIGRyb3Bkb3duIGNvbG9yIHBhbGV0dGUgcGlja2VyCisKKwlvbkRyb3BEb3duU2hvd246IGZ1bmN0aW9uKCl7CisJCWlmKCF0aGlzLl9jb2xvcnBhbGV0dGUpeworCQkJdGhpcy5fY29sb3JwYWxldHRlID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJDb2xvclBhbGV0dGUiLCB7fSk7CisJCQl0aGlzLl9kcm9wZG93bi5hZGRDaGlsZCh0aGlzLl9jb2xvcnBhbGV0dGUpOworCisJCQl0aGlzLmRpc2FibGVTZWxlY3Rpb24odGhpcy5fZHJvcGRvd24uZG9tTm9kZSk7CisJCQl0aGlzLmRpc2FibGVTZWxlY3Rpb24odGhpcy5fY29sb3JwYWxldHRlLmRvbU5vZGUpOworCQkJLy9kbyB3ZSBuZWVkIGEgZGVzdG9yeSB0byBkZWxldGUgdGhpcy5fY29sb3JwYWxldHRlIG1hbnVhbGx5PworCQkJLy9JIGFzc3VtZSBhcyBpdCBpcyBhZGRlZCB0byB0aGlzLl9kcm9wZG93biB2aWEgYWRkQ2hpbGQsIGl0CisJCQkvL3Nob3VsZCBiZSBkZWxldGVkIHdoZW4gdGhpcy5fZHJvcGRvd24gaXMgZGVzdHJveWVkCisKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9jb2xvcnBhbGV0dGUsICJvbkNvbG9yU2VsZWN0IiwgdGhpcywgJ3NldENvbG9yJyk7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5fZHJvcGRvd24sICJvcGVuIiwgdGhpcywgJ2xhdGNoVG9vbGJhckl0ZW0nKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9kcm9wZG93biwgImNsb3NlIiwgdGhpcywgJ2VuYWJsZVRvb2xiYXJJdGVtJyk7CisJCX0KKwl9LAorCXNldENvbG9yOiBmdW5jdGlvbihjb2xvcil7CisJCXRoaXMuX2Ryb3Bkb3duLmNsb3NlKCk7CisJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCWlmKGN1ckluc3QpeworCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJaWYoX2NvbW1hbmQpeworCQkJCV9jb21tYW5kLmV4ZWN1dGUoY29sb3IpOworCQkJfQorCQl9CisJfQorfSk7CisKK2Rvam8uZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1BsYWluU2VsZWN0IiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJCdXR0b24sIHsKKwkvLyBzdW1tYXJ5OiBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3QgcHJvdmlkZXMgYSBzaW1wbGUgc2VsZWN0IGZvciBzZXR0aW5nIGJsb2NrIGZvcm1hdAorCisJY3JlYXRlOiBmdW5jdGlvbihub2RlLCB0b29sYmFyKXsKKy8vCQlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3Quc3VwZXJjbGFzcy5jcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJdGhpcy5fZG9tTm9kZSA9IG5vZGU7CisJCXRoaXMuX3BhcmVudFRvb2xiYXIgPSB0b29sYmFyOworCQkvL1RPRE86IGNoZWNrIG5vZGUgaXMgYSBzZWxlY3QKKwkJdGhpcy5fZG9tTm9kZSA9IG5vZGU7CisJCXRoaXMuZGlzYWJsZVNlbGVjdGlvbih0aGlzLl9kb21Ob2RlKTsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2RvbU5vZGUsICdvbmNoYW5nZScsIHRoaXMsICdvbkNoYW5nZScpOworCX0sCisKKwlkZXN0cm95OiBmdW5jdGlvbigpeworCQl0aGlzLl9kb21Ob2RlID0gbnVsbDsKKwl9LAorCisJb25DaGFuZ2U6IGZ1bmN0aW9uKCl7CisJCWlmKHRoaXMuX3BhcmVudFRvb2xiYXIuY2hlY2tBdmFpbGFiaWxpdHkoKSl7CisJCQl2YXIgc3YgPSB0aGlzLl9kb21Ob2RlLnZhbHVlLnRvTG93ZXJDYXNlKCk7CisJCQl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQkJaWYoY3VySW5zdCl7CisJCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJCWlmKF9jb21tYW5kKXsKKwkJCQkJX2NvbW1hbmQuZXhlY3V0ZShzdik7CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCXJlZnJlc2hTdGF0ZTogZnVuY3Rpb24oKXsKKwkJaWYodGhpcy5fZG9tTm9kZSl7CisJCQlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrUGxhaW5TZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKKwkJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCQlpZihjdXJJbnN0KXsKKwkJCQl2YXIgX2NvbW1hbmQgPSBjdXJJbnN0LmdldENvbW1hbmQodGhpcy5fbmFtZSk7CisJCQkJaWYoX2NvbW1hbmQpeworCQkJCQl2YXIgZm9ybWF0ID0gX2NvbW1hbmQuZ2V0VmFsdWUoKTsKKwkJCQkJaWYoIWZvcm1hdCl7IGZvcm1hdCA9ICIiOyB9CisJCQkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuX2RvbU5vZGUub3B0aW9ucywgZnVuY3Rpb24oaXRlbSl7CisJCQkJCQlpZihpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gZm9ybWF0LnRvTG93ZXJDYXNlKCkpeworCQkJCQkJCWl0ZW0uc2VsZWN0ZWQgPSB0cnVlOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckNvbWJvSXRlbSIsIGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRHJvcERvd25CdXR0b24seworCS8vIHN1bW1hcnk6IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtIHByb3ZpZGVzIGFuIGV4dGVybmFsIGxvYWRlZCBkcm9wZG93biBsaXN0CisKKwlocmVmOiBudWxsLAorCWNyZWF0ZTogZnVuY3Rpb24obm9kZSwgdG9vbGJhcil7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyQ29tYm9JdGVtLnN1cGVyY2xhc3MuY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCS8vZG8gbm90IHVzZSBsYXp5IGluaXRpbGl6YXRpb24sIGFzIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWVzIGluIHJlZnJlc2hTdGF0ZSgpCisJCWlmKCF0aGlzLl9jb250ZW50UGFuZSl7CisJCQkKKwkJCXRoaXMuX2NvbnRlbnRQYW5lID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJDb250ZW50UGFuZSIsIHtwcmVsb2FkOiAndHJ1ZSd9KTsKKwkJCXRoaXMuX2NvbnRlbnRQYW5lLmFkZE9uTG9hZCh0aGlzLCAic2V0dXAiKTsKKwkJCXRoaXMuX2NvbnRlbnRQYW5lLnNldFVybCh0aGlzLmhyZWYpOworCQl9CisJfSwKKworCW9uTW91c2VPdmVyOiBmdW5jdGlvbihlKXsKKwkJaWYodGhpcy5fbGFzdFN0YXRlICE9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCl7CisJCQlkb2pvLmh0bWwuYWRkQ2xhc3MoZS5jdXJyZW50VGFyZ2V0LCB0aGlzLl9wYXJlbnRUb29sYmFyLlRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlKTsKKwkJfQorCX0sCisJb25Nb3VzZU91dDpmdW5jdGlvbihlKXsKKwkJZG9qby5odG1sLnJlbW92ZUNsYXNzKGUuY3VycmVudFRhcmdldCwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRTZWxlY3RTdHlsZSk7CisJfSwKKworCW9uRHJvcERvd25TaG93bjogZnVuY3Rpb24oKXsKKwkJaWYoIXRoaXMuX2Ryb3Bkb3duLl9fYWRkZWRDb250ZW50UGFnZSl7CisJCQl0aGlzLl9kcm9wZG93bi5hZGRDaGlsZCh0aGlzLl9jb250ZW50UGFuZSk7CisJCQl0aGlzLl9kcm9wZG93bi5fX2FkZGVkQ29udGVudFBhZ2UgPSB0cnVlOworCQl9CisJfSwKKworCXNldHVwOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBvdmVybG9hZCB0aGlzIHRvIGNvbm5lY3QgZXZlbnQKKwl9LAorCisJb25DaGFuZ2U6IGZ1bmN0aW9uKGUpeworCQlpZih0aGlzLl9wYXJlbnRUb29sYmFyLmNoZWNrQXZhaWxhYmlsaXR5KCkpeworCQkJdmFyIG5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIik7CisJCQl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQkJaWYoY3VySW5zdCl7CisJCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJCWlmKF9jb21tYW5kKXsKKwkJCQkJX2NvbW1hbmQuZXhlY3V0ZShuYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5fZHJvcGRvd24uY2xvc2UoKTsKKwl9LAorCisJb25Nb3VzZU92ZXJJdGVtOiBmdW5jdGlvbihlKXsKKwkJZG9qby5odG1sLmFkZENsYXNzKGUuY3VycmVudFRhcmdldCwgdGhpcy5fcGFyZW50VG9vbGJhci5Ub29sYmFySGlnaGxpZ2h0ZWRTZWxlY3RJdGVtU3R5bGUpOworCX0sCisKKwlvbk1vdXNlT3V0SXRlbTogZnVuY3Rpb24oZSl7CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyhlLmN1cnJlbnRUYXJnZXQsIHRoaXMuX3BhcmVudFRvb2xiYXIuVG9vbGJhckhpZ2hsaWdodGVkU2VsZWN0SXRlbVN0eWxlKTsKKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0IiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0sIHsKKwkvLyBzdW1tYXJ5OiBkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0IGlzIGFuIGltcHJvdmVkIGZvcm1hdCBibG9jayBzZXR0aW5nIGl0ZW0KKworCWhyZWY6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvcjIvRWRpdG9yVG9vbGJhcl9Gb3JtYXRCbG9jay5odG1sIiksCisKKwlzZXR1cDogZnVuY3Rpb24oKXsKKwkJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb3JtYXRCbG9ja1NlbGVjdC5zdXBlcmNsYXNzLnNldHVwLmNhbGwodGhpcyk7CisKKwkJdmFyIG5vZGVzID0gdGhpcy5fY29udGVudFBhbmUuZG9tTm9kZS5hbGwgfHwgdGhpcy5fY29udGVudFBhbmUuZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworCQl0aGlzLl9ibG9ja05hbWVzID0ge307CisJCXRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzID0ge307CisJCWZvcih2YXIgeD0wOyB4PG5vZGVzLmxlbmd0aDsgeCsrKXsKKwkJCXZhciBub2RlID0gbm9kZXNbeF07CisJCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihub2RlKTsKKwkJCXZhciBuYW1lPW5vZGUuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIikKKwkJCWlmKG5hbWUpeworCQkJCXRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0gPSBub2RlOworCQkJCXZhciBjaGlsZHJlbm5vZGVzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKKwkJCQl0aGlzLl9ibG9ja0Rpc3BsYXlOYW1lc1tuYW1lXSA9IGNoaWxkcmVubm9kZXNbY2hpbGRyZW5ub2Rlcy5sZW5ndGgtMV0uaW5uZXJIVE1MOworCQkJfQorCQl9CisJCWZvcih2YXIgbmFtZSBpbiB0aGlzLl9ibG9ja05hbWVzKXsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9ibG9ja05hbWVzW25hbWVdLCAib25jbGljayIsIHRoaXMsICJvbkNoYW5nZSIpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2Jsb2NrTmFtZXNbbmFtZV0sICJvbm1vdXNlb3ZlciIsIHRoaXMsICJvbk1vdXNlT3Zlckl0ZW0iKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9ibG9ja05hbWVzW25hbWVdLCAib25tb3VzZW91dCIsIHRoaXMsICJvbk1vdXNlT3V0SXRlbSIpOworCQl9CisJfSwKKworCW9uRHJvcERvd25EZXN0cm95OiBmdW5jdGlvbigpeworCQlpZih0aGlzLl9ibG9ja05hbWVzKXsKKwkJCWZvcih2YXIgbmFtZSBpbiB0aGlzLl9ibG9ja05hbWVzKXsKKwkJCQlkZWxldGUgdGhpcy5fYmxvY2tOYW1lc1tuYW1lXTsKKwkJCQlkZWxldGUgdGhpcy5fYmxvY2tEaXNwbGF5TmFtZXNbbmFtZV07CisJCQl9CisJCX0KKwl9LAorCisJcmVmcmVzaFN0YXRlOiBmdW5jdGlvbigpeworCQlkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvcm1hdEJsb2NrU2VsZWN0LnN1cGVyY2xhc3MucmVmcmVzaFN0YXRlLmNhbGwodGhpcyk7CisJCWlmKHRoaXMuX2xhc3RTdGF0ZSAhPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRGlzYWJsZWQpeworCQkJdmFyIGN1ckluc3QgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKTsKKwkJCWlmKGN1ckluc3QpeworCQkJCXZhciBfY29tbWFuZCA9IGN1ckluc3QuZ2V0Q29tbWFuZCh0aGlzLl9uYW1lKTsKKwkJCQlpZihfY29tbWFuZCl7CisJCQkJCXZhciBmb3JtYXQgPSBfY29tbWFuZC5nZXRWYWx1ZSgpOworCQkJCQlpZihmb3JtYXQgPT0gdGhpcy5fbGFzdFNlbGVjdGVkRm9ybWF0ICYmIHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzKXsKKwkJCQkJCXJldHVybiB0aGlzLl9sYXN0U3RhdGU7CisJCQkJCX0KKwkJCQkJdGhpcy5fbGFzdFNlbGVjdGVkRm9ybWF0ID0gZm9ybWF0OworCQkJCQl2YXIgbGFiZWwgPSB0aGlzLl9kb21Ob2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsYWJlbCIpWzBdOworCQkJCQl2YXIgaXNTZXQgPSBmYWxzZTsKKwkJCQkJaWYodGhpcy5fYmxvY2tEaXNwbGF5TmFtZXMpeworCQkJCQkJZm9yKHZhciBuYW1lIGluIHRoaXMuX2Jsb2NrRGlzcGxheU5hbWVzKXsKKwkJCQkJCQlpZihuYW1lID09IGZvcm1hdCl7CisJCQkJCQkJCWxhYmVsLmlubmVySFRNTCA9IAl0aGlzLl9ibG9ja0Rpc3BsYXlOYW1lc1tuYW1lXTsKKwkJCQkJCQkJaXNTZXQgPSB0cnVlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZighaXNTZXQpeworCQkJCQkJCWxhYmVsLmlubmVySFRNTCA9ICImbmJzcDsiOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnRTaXplU2VsZWN0IiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJDb21ib0l0ZW0seworCS8vIHN1bW1hcnk6IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udFNpemVTZWxlY3QgcHJvdmlkZXMgYSBkcm9wZG93biBsaXN0IGZvciBzZXR0aW5nIGZvbnRzaXplCisKKwlocmVmOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3IyL0VkaXRvclRvb2xiYXJfRm9udFNpemUuaHRtbCIpLAorCisJc2V0dXA6IGZ1bmN0aW9uKCl7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3Quc3VwZXJjbGFzcy5zZXR1cC5jYWxsKHRoaXMpOworCisJCXZhciBub2RlcyA9IHRoaXMuX2NvbnRlbnRQYW5lLmRvbU5vZGUuYWxsIHx8IHRoaXMuX2NvbnRlbnRQYW5lLmRvbU5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKwkJdGhpcy5fZm9udHNpemVzID0ge307CisJCXRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzID0ge307CisJCWZvcih2YXIgeD0wOyB4PG5vZGVzLmxlbmd0aDsgeCsrKXsKKwkJCXZhciBub2RlID0gbm9kZXNbeF07CisJCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbihub2RlKTsKKwkJCXZhciBuYW1lPW5vZGUuZ2V0QXR0cmlidXRlKCJkcm9wRG93bkl0ZW1OYW1lIikKKwkJCWlmKG5hbWUpeworCQkJCXRoaXMuX2ZvbnRzaXplc1tuYW1lXSA9IG5vZGU7CisJCQkJdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXNbbmFtZV0gPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb250JylbMF0uaW5uZXJIVE1MOworCQkJfQorCQl9CisJCWZvcih2YXIgbmFtZSBpbiB0aGlzLl9mb250c2l6ZXMpeworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuX2ZvbnRzaXplc1tuYW1lXSwgIm9uY2xpY2siLCB0aGlzLCAib25DaGFuZ2UiKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sICJvbm1vdXNlb3ZlciIsIHRoaXMsICJvbk1vdXNlT3Zlckl0ZW0iKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLl9mb250c2l6ZXNbbmFtZV0sICJvbm1vdXNlb3V0IiwgdGhpcywgIm9uTW91c2VPdXRJdGVtIik7CisJCX0KKwl9LAorCisJb25Ecm9wRG93bkRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCWlmKHRoaXMuX2ZvbnRzaXplcyl7CisJCQlmb3IodmFyIG5hbWUgaW4gdGhpcy5fZm9udHNpemVzKXsKKwkJCQlkZWxldGUgdGhpcy5fZm9udHNpemVzW25hbWVdOworCQkJCWRlbGV0ZSB0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lc1tuYW1lXTsKKwkJCX0KKwkJfQorCX0sCisKKwlyZWZyZXNoU3RhdGU6IGZ1bmN0aW9uKCl7CisJCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9ybWF0QmxvY2tTZWxlY3Quc3VwZXJjbGFzcy5yZWZyZXNoU3RhdGUuY2FsbCh0aGlzKTsKKwkJaWYodGhpcy5fbGFzdFN0YXRlICE9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5EaXNhYmxlZCl7CisJCQl2YXIgY3VySW5zdCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQkJaWYoY3VySW5zdCl7CisJCQkJdmFyIF9jb21tYW5kID0gY3VySW5zdC5nZXRDb21tYW5kKHRoaXMuX25hbWUpOworCQkJCWlmKF9jb21tYW5kKXsKKwkJCQkJdmFyIHNpemUgPSBfY29tbWFuZC5nZXRWYWx1ZSgpOworCQkJCQlpZihzaXplID09IHRoaXMuX2xhc3RTZWxlY3RlZFNpemUgJiYgdGhpcy5fZm9udFNpemVEaXNwbGF5TmFtZXMpeworCQkJCQkJcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKKwkJCQkJfQorCQkJCQl0aGlzLl9sYXN0U2VsZWN0ZWRTaXplID0gc2l6ZTsKKwkJCQkJdmFyIGxhYmVsID0gdGhpcy5fZG9tTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGFiZWwiKVswXTsKKwkJCQkJdmFyIGlzU2V0ID0gZmFsc2U7CisJCQkJCWlmKHRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzKXsKKwkJCQkJCWZvcih2YXIgbmFtZSBpbiB0aGlzLl9mb250U2l6ZURpc3BsYXlOYW1lcyl7CisJCQkJCQkJaWYobmFtZSA9PSBzaXplKXsKKwkJCQkJCQkJbGFiZWwuaW5uZXJIVE1MID0gCXRoaXMuX2ZvbnRTaXplRGlzcGxheU5hbWVzW25hbWVdOworCQkJCQkJCQlpc1NldCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmKCFpc1NldCl7CisJCQkJCQkJbGFiZWwuaW5uZXJIVE1MID0gIiZuYnNwOyI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMuX2xhc3RTdGF0ZTsKKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckZvbnROYW1lU2VsZWN0IiwgZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJGb250U2l6ZVNlbGVjdCwgeworCS8vIHN1bW1hcnk6IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyRm9udE5hbWVTZWxlY3QgcHJvdmlkZXMgYSBkcm9wZG93biBsaXN0IGZvciBzZXR0aW5nIGZvbnRuYW1lCisJaHJlZjogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvRWRpdG9yMi9FZGl0b3JUb29sYmFyX0ZvbnROYW1lLmh0bWwiKQorfSk7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXIiLAorCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsCisJZnVuY3Rpb24oKXsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJmaWxsSW5UZW1wbGF0ZSIsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbigpeworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJdGhpcy5kb21Ob2RlLnN0eWxlLnpvb20gPSAxLjA7CisJCQl9CisJCX0pKTsKKwl9LAorCXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyIGlzIHRoZSBtYWluIHdpZGdldCBmb3IgdGhlIHRvb2xiYXIgYXNzb2NpYXRlZCB3aXRoIGFuIEVkaXRvcjIKKworCQl0ZW1wbGF0ZVN0cmluZzoiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJkb21Ob2RlXCIgY2xhc3M9XCJFZGl0b3JUb29sYmFyRG9tTm9kZVwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+XHJcblx0PHRhYmxlIGNlbGxwYWRkaW5nPVwiM1wiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cclxuXHRcdDwhLS1cclxuXHRcdFx0b3VyIHRvb2xiYXIgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2U6XHJcblxyXG5cdFx0XHQrPT09PT09PSs9PT09PT09Kz09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xyXG5cdFx0XHR8IHcgICB3IHwgc3R5bGUgfCBjb3B5ICB8IGJvIHwgaXQgfCB1biB8IGxlIHwgY2UgfCByaSB8XHJcblx0XHRcdHwgdyB3IHcgfCBzdHlsZSB8PT09PT09PXw9PT09PT09PT09PT09PXw9PT09PT09PT09PT09PXxcclxuXHRcdFx0fCAgdyB3ICB8IHN0eWxlIHwgcGFzdGUgfCAgdW5kbyB8IHJlZG8gfCBjaGFuZ2Ugc3R5bGUgfFxyXG5cdFx0XHQrPT09PT09PSs9PT09PT09Kz09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xyXG5cdFx0LS0+XHJcblx0XHQ8dGJvZHk+XHJcblx0XHRcdDx0ciB2YWxpZ249XCJ0b3BcIj5cclxuXHRcdFx0XHQ8dGQgcm93c3Bhbj1cIjJcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiaWdJY29uXCIgZG9qb0F0dGFjaFBvaW50PVwid2lraVdvcmRCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cIndpa2lXb3JkQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMzBweDsgbWFyZ2luLWxlZnQ6IDVweDtcIj5cclxuXHRcdFx0XHRcdFx0XHRXXHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIHJvd3NwYW49XCIyXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmlnSWNvblwiIGRvam9BdHRhY2hQb2ludD1cInN0eWxlRHJvcGRvd25CdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInN0eWxlRHJvcGRvd25DbGljazsgYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cImZvbnQtc2l6ZTogMzBweDsgbWFyZ2luLWxlZnQ6IDVweDtcIj5cclxuXHRcdFx0XHRcdFx0XHRTXHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIlN0eWxlRHJvcGRvd25Db250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcclxuXHRcdFx0XHRcdFx0ZG9qb0F0dGFjaFBvaW50PVwic3R5bGVEcm9wZG93bkNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8dGFibGUgY2VsbHBhZGRpbmc9XCIwXCIgY2VsbHNwYWNpbmc9XCIwXCIgYm9yZGVyPVwiMFwiXHJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0PVwiMTAwJVwiIHdpZHRoPVwiMTAwJVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciB2YWxpZ249XCJ0b3BcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZCByb3dzcGFuPVwiMlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAyNDVweDsgb3ZlcmZsb3c6IGF1dG87XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJub3JtYWxUZXh0Q2xpY2tcIj5ub3JtYWw8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aDEgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiaDFUZXh0Q2xpY2tcIj5IZWFkaW5nIDE8L2gxPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxoMiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJoMlRleHRDbGlja1wiPkhlYWRpbmcgMjwvaDI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGgzIGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImgzVGV4dENsaWNrXCI+SGVhZGluZyAzPC9oMz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aDQgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiaDRUZXh0Q2xpY2tcIj5IZWFkaW5nIDQ8L2g0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiYmxhaFRleHRDbGlja1wiPmJsYWg8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGluZ0NvbnRhaW5lclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImJsYWhUZXh0Q2xpY2tcIj5ibGFoPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRpbmdDb250YWluZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJibGFoVGV4dENsaWNrXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkaW5nQ29udGFpbmVyXCI+YmxhaDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tXHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9PbkNsaWNrPVwiYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGp1c3RpZnlsZWZ0XCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5Y2VudGVyXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvT25DbGljaz1cImJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5cmlnaHRcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9PbkNsaWNrPVwiYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGp1c3RpZnlmdWxsXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZT1cImZsb2F0OiBsZWZ0O1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdC0tPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdFx0PHRyIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHVkXHJcblx0XHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDwhLS0gY29weSAtLT5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImNvcHlCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwiY29weUNsaWNrOyBidXR0b25DbGljaztcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIGNvcHlcIiBcclxuXHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiXHJcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJmbG9hdDogbGVmdDtcIj4mbmJzcDs8L3NwYW4+IGNvcHlcclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDwhLS0gXCJkcm9wcGFibGVcIiBvcHRpb25zIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiYm9sZEJ1dHRvblwiXHJcblx0XHRcdFx0XHRcdHVuc2VsZWN0YWJsZT1cIm9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJib2xkQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24gYm9sZFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiaXRhbGljQnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJpdGFsaWNDbGljazsgYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBpdGFsaWNcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInVuZGVybGluZUJ1dHRvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwidW5kZXJsaW5lQ2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24gdW5kZXJsaW5lXCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJsZWZ0QnV0dG9uXCJcclxuXHRcdFx0XHRcdFx0ZG9qb09uQ2xpY2s9XCJsZWZ0Q2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeWxlZnRcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImZ1bGxCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cImZ1bGxDbGljazsgYnV0dG9uQ2xpY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbiBqdXN0aWZ5ZnVsbFwiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwicmlnaHRCdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInJpZ2h0Q2xpY2s7IGJ1dHRvbkNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24ganVzdGlmeXJpZ2h0XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDwhLS0gcGFzdGUgLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIiBkb2pvQXR0YWNoUG9pbnQ9XCJwYXN0ZUJ1dHRvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwicGFzdGVDbGljazsgYnV0dG9uQ2xpY2s7XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIHBhc3RlXCIgc3R5bGU9XCJmbG9hdDogbGVmdDtcIiB1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj4gcGFzdGVcclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDwhLS0gXCJkcm9wcGFibGVcIiBvcHRpb25zIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwidW5kb0J1dHRvblwiXHJcblx0XHRcdFx0XHRcdGRvam9PbkNsaWNrPVwidW5kb0NsaWNrOyBidXR0b25DbGljaztcIiB1bnNlbGVjdGFibGU9XCJvblwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb24gdW5kb1wiIHN0eWxlPVwiZmxvYXQ6IGxlZnQ7XCIgdW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+IHVuZG9cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInJlZG9CdXR0b25cIlxyXG5cdFx0XHRcdFx0XHRkb2pvT25DbGljaz1cInJlZG9DbGljazsgYnV0dG9uQ2xpY2s7XCIgdW5zZWxlY3RhYmxlPVwib25cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uIHJlZG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0O1wiIHVuc2VsZWN0YWJsZT1cIm9uXCI+Jm5ic3A7PC9zcGFuPiByZWRvXHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cdFxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Ym9keT5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIiwKKwkJdGVtcGxhdGVDc3NTdHJpbmc6Ii5TdHlsZURyb3Bkb3duQ29udGFpbmVyIHtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDtcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcblx0d2lkdGg6IDI1MHB4O1xyXG5cdGhlaWdodDogMjUwcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcbn1cclxuXHJcbi5Db2xvckRyb3Bkb3duQ29udGFpbmVyIHtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDtcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcblx0d2lkdGg6IDI1MHB4O1xyXG5cdGhlaWdodDogMTUwcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyRG9tTm9kZSB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGJ1dHRvbnMvYmctZmFkZS5wbmcpO1xyXG5cdGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcclxuXHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggLTUwcHg7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyU21hbGxCZyB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy90b29sYmFyLWJnLmdpZik7XHJcblx0YmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xyXG5cdGJhY2tncm91bmQtcG9zaXRpb246IDBweCAwcHg7XHJcbn1cclxuXHJcbi8qXHJcbmJvZHkge1xyXG5cdGJhY2tncm91bmQ6dXJsKGltYWdlcy9ibGFuay5naWYpIGZpeGVkO1xyXG59Ki9cclxuXHJcbi5JRUZpeGVkVG9vbGJhciB7XHJcblx0cG9zaXRpb246YWJzb2x1dGU7XHJcblx0LyogdG9wOjA7ICovXHJcblx0dG9wOiBleHByZXNzaW9uKGV2YWwoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKSk7XHJcbn1cclxuXHJcbmRpdi5iaWdJY29uIHtcclxuXHR3aWR0aDogNDBweDtcclxuXHRoZWlnaHQ6IDQwcHg7IFxyXG5cdC8qIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAqL1xyXG5cdC8qIGJvcmRlcjogMXB4IHNvbGlkICNhNmE3YTM7ICovXHJcblx0Zm9udC1mYW1pbHk6IFZlcmRhbmEsIFRyZWJ1Y2hldCwgVGFob21hLCBBcmlhbDtcclxufVxyXG5cclxuLmljb25Db250YWluZXIge1xyXG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBUcmVidWNoZXQsIFRhaG9tYSwgQXJpYWw7XHJcblx0Zm9udC1zaXplOiAxM3B4O1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cdGhlaWdodDogMThweDtcclxuXHRkaXNwbGF5OiBibG9jaztcclxuXHQvKiBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgKi9cclxuXHRjdXJzb3I6IHBvaW50ZXI7XHJcblx0cGFkZGluZzogMXB4IDRweCAxcHggMXB4OyAvKiBhbG1vc3QgdGhlIHNhbWUgYXMgYSB0cmFuc3BhcmVudCBib3JkZXIgKi9cclxuXHRib3JkZXI6IDBweDtcclxufVxyXG5cclxuLmRvam9FMlRCSWNvbiB7XHJcblx0ZGlzcGxheTogYmxvY2s7XHJcblx0dGV4dC1hbGlnbjogY2VudGVyO1xyXG5cdG1pbi13aWR0aDogMThweDtcclxuXHR3aWR0aDogMThweDtcclxuXHRoZWlnaHQ6IDE4cHg7XHJcblx0LyogYmFja2dyb3VuZC1jb2xvcjogI2E2YTdhMzsgKi9cclxuXHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChidXR0b25zL2FnZ3JlZ2F0ZS5naWYpO1xyXG59XHJcblxyXG5cclxuLmRvam9FMlRCSWNvbltjbGFzc349ZG9qb0UyVEJJY29uXSB7XHJcbn1cclxuXHJcbi5Ub29sYmFyQnV0dG9uTGF0Y2hlZCB7XHJcbiAgICBib3JkZXI6ICMzMTZhYzUgMXB4IHNvbGlkOyAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2MxZDJlZTtcclxufVxyXG5cclxuLlRvb2xiYXJCdXR0b25IaWdobGlnaHRlZCB7XHJcbiAgICBib3JkZXI6ICMzMTZhYzUgMXB4IHNvbGlkOyAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZzogMHB4IDNweCAwcHggMHB4OyAhaW1wb3J0YW50OyAvKiBtYWtlIHJvb20gZm9yIGJvcmRlciAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjFmZjtcclxufVxyXG5cclxuLlRvb2xiYXJCdXR0b25EaXNhYmxlZHtcclxuICAgIGZpbHRlcjogZ3JheSgpIGFscGhhKG9wYWNpdHk9MzApOyAvKiBJRSAqL1xyXG4gICAgb3BhY2l0eTogMC4zMDsgLyogU2FmYXJpLCBPcGVyYSBhbmQgTW96aWxsYSAqL1xyXG59XHJcblxyXG4uaGVhZGluZ0NvbnRhaW5lciB7XHJcblx0d2lkdGg6IDE1MHB4O1xyXG5cdGhlaWdodDogMzBweDtcclxuXHRtYXJnaW46IDBweDtcclxuXHQvKiBwYWRkaW5nLWxlZnQ6IDVweDsgKi9cclxuXHRvdmVyZmxvdzogaGlkZGVuO1xyXG5cdGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG5cdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcclxuXHRib3JkZXItdG9wOiAxcHggc29saWQgd2hpdGU7XHJcbn1cclxuXHJcbi5FZGl0b3JUb29sYmFyRG9tTm9kZSBzZWxlY3Qge1xyXG5cdGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG4gXHJcbi5kb2pvRTJUQkljb25fU2VwIHsgd2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7IG1heC13aWR0aDogNXB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0JhY2tjb2xvciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9Cb2xkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0NhbmNlbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9Db3B5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0xpbmsgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQ3V0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwOHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9EZWxldGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1RleHRDb2xvciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQmFja2dyb3VuZENvbG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTgwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0hvcml6b250YWxMaW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5OHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTZweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fTnVtYmVyZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIzNHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9UYWJsZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNTJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fQnVsbGV0ZWRMaXN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9JdGFsaWMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg4cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0NlbnRlckp1c3RpZnkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzA2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX0Jsb2NrSnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMjRweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fTGVmdEp1c3RpZnkgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzQycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1JpZ2h0SnVzdGlmeSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNjBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fbGVmdF90b19yaWdodCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fbGlzdF9idWxsZXRfaW5kZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM5NnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9saXN0X2J1bGxldF9vdXRkZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQxNHB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9saXN0X251bV9pbmRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDMycHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX2xpc3RfbnVtX291dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDUwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX091dGRlbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDY4cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1Bhc3RlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4NnB4IDBweH1cclxuLmRvam9FMlRCSWNvbl9SZWRvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwNHB4IDBweH1cclxuZG9qb0UyVEJJY29uX1JlbW92ZUZvcm1hdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MjJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fcmlnaHRfdG9fbGVmdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NDBweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU2F2ZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NThweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU3BhY2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTc2cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1N0cmlrZVRocm91Z2ggeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk0cHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1N1YnNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MTJweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fU3VwZXJzY3JpcHQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjMwcHggMHB4fVxyXG4uZG9qb0UyVEJJY29uX1VuZGVybGluZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NDhweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fVW5kbyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NjZweCAwcHh9XHJcbi5kb2pvRTJUQkljb25fV2lraVdvcmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjg0cHggMHB4fVxyXG5cclxuIix0ZW1wbGF0ZUNzc1BhdGg6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL0VkaXRvclRvb2xiYXIuY3NzIiksCisKKwkJLy8gVG9vbGJhckxhdGNoZWRJdGVtU3R5bGU6IFN0cmluZzogY2xhc3MgbmFtZSBmb3IgbGF0Y2hlZCB0b29sYmFyIGJ1dHRvbiBpdGVtcworCQlUb29sYmFyTGF0Y2hlZEl0ZW1TdHlsZTogIlRvb2xiYXJCdXR0b25MYXRjaGVkIiwKKworCQkvLyBUb29sYmFyRW5hYmxlZEl0ZW1TdHlsZTogU3RyaW5nOiBjbGFzcyBuYW1lIGZvciBlbmFibGVkIHRvb2xiYXIgYnV0dG9uIGl0ZW1zCisJCVRvb2xiYXJFbmFibGVkSXRlbVN0eWxlOiAiVG9vbGJhckJ1dHRvbkVuYWJsZWQiLAorCisJCS8vIFRvb2xiYXJEaXNhYmxlZEl0ZW1TdHlsZTogU3RyaW5nOiBjbGFzcyBuYW1lIGZvciBkaXNhYmxlZCB0b29sYmFyIGJ1dHRvbiBpdGVtcworCQlUb29sYmFyRGlzYWJsZWRJdGVtU3R5bGU6ICJUb29sYmFyQnV0dG9uRGlzYWJsZWQiLAorCisJCS8vIFRvb2xiYXJIaWdobGlnaHRlZEl0ZW1TdHlsZTogU3RyaW5nOiBjbGFzcyBuYW1lIGZvciBoaWdobGlnaHRlZCB0b29sYmFyIGJ1dHRvbiBpdGVtcworCQlUb29sYmFySGlnaGxpZ2h0ZWRJdGVtU3R5bGU6ICJUb29sYmFyQnV0dG9uSGlnaGxpZ2h0ZWQiLAorCisJCS8vIFRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlOiBTdHJpbmc6IGNsYXNzIG5hbWUgZm9yIGhpZ2hsaWdodGVkIHRvb2xiYXIgc2VsZWN0IGl0ZW1zCisJCVRvb2xiYXJIaWdobGlnaHRlZFNlbGVjdFN0eWxlOiAiVG9vbGJhclNlbGVjdEhpZ2hsaWdodGVkIiwKKworCQkvLyBUb29sYmFySGlnaGxpZ2h0ZWRTZWxlY3RJdGVtU3R5bGU6IFN0cmluZzogY2xhc3MgbmFtZSBmb3IgaGlnaGxpZ2h0ZWQgdG9vbGJhciBzZWxlY3QgZHJvcGRvd24gaXRlbXMKKwkJVG9vbGJhckhpZ2hsaWdodGVkU2VsZWN0SXRlbVN0eWxlOiAiVG9vbGJhclNlbGVjdEhpZ2hsaWdodGVkSXRlbSIsCisKKy8vCQlpdGVtTm9kZVR5cGU6ICdzcGFuJywgLy9hbGwgdGhlIGl0ZW1zICh3aXRoIGF0dHJpYnV0ZSBkb2pvRVRJdGVtTmFtZSBzZXQpIGRlZmluZWQgaW4gdGhlIHRvb2xiYXIgc2hvdWxkIGJlIGEgb2YgdGhpcyB0eXBlCisKKwkJcG9zdENyZWF0ZTogZnVuY3Rpb24oKXsKKwkJCXZhciBub2RlcyA9IGRvam8uaHRtbC5nZXRFbGVtZW50c0J5Q2xhc3MoImRvam9FZGl0b3JUb29sYmFySXRlbSIsIHRoaXMuZG9tTm9kZS8qLCB0aGlzLml0ZW1Ob2RlVHlwZSovKTsKKworCQkJdGhpcy5pdGVtcyA9IHt9OworCQkJZm9yKHZhciB4PTA7IHg8bm9kZXMubGVuZ3RoOyB4KyspeworCQkJCXZhciBub2RlID0gbm9kZXNbeF07CisJCQkJdmFyIGl0ZW1uYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoImRvam9FVEl0ZW1OYW1lIik7CisJCQkJaWYoaXRlbW5hbWUpeworCQkJCQl2YXIgaXRlbSA9IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFySXRlbU1hbmFnZXIuZ2V0VG9vbGJhckl0ZW0oaXRlbW5hbWUpOworCQkJCQlpZihpdGVtKXsKKwkJCQkJCWl0ZW0uY3JlYXRlKG5vZGUsIHRoaXMpOworCQkJCQkJdGhpcy5pdGVtc1tpdGVtbmFtZS50b0xvd2VyQ2FzZSgpXSA9IGl0ZW07CisJCQkJCX1lbHNleworCQkJCQkJLy9oaWRlIHVuc3VwcG9ydGVkIHRvb2xiYXIgaXRlbXMKKwkJCQkJCW5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSwKKworCQl1cGRhdGU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiB1cGRhdGUgYWxsIHRoZSB0b29sYmFyIGl0ZW1zCisJCQlmb3IodmFyIGNtZCBpbiB0aGlzLml0ZW1zKXsKKwkJCQl0aGlzLml0ZW1zW2NtZF0ucmVmcmVzaFN0YXRlKCk7CisJCQl9CisJCX0sCisKKwkJc2hhcmVHcm91cDogJycsCisJCWNoZWNrQXZhaWxhYmlsaXR5OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogcmV0dXJucyB3aGV0aGVyIGl0ZW1zIGluIHRoaXMgdG9vbGJhciBjYW4gYmUgZXhlY3V0ZWQKKwkJCS8vIGRlc2NyaXB0aW9uOiAKKwkJCS8vCQlGb3IgdW5zaGFyZWQgdG9vbGJhciwgd2hlbiBjbGlja2luZyBvbiBhIHRvb2xiYXIsIHRoZSBjb3JyZXNwb25kaW5nCisJCQkvLwkJZWRpdG9yIHdpbGwgYmUgZm9jdXNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybiB0cnVlLiBGb3Igc2hhcmVkCisJCQkvLwkJdG9vbGJhciwgaWYgdGhlIGN1cnJlbnQgZm9jdWVkIGVkaXRvciBpcyBub3Qgb25lIG9mIHRoZSBpbnN0YW5jZXMgc2hhcmluZworCQkJLy8JCXRoaXMgdG9vbGJhciwgdGhpcyBmdW5jdGlvbiByZXR1cm4gZmFsc2UsIG90aGVyd2lzZSB0cnVlLgorCQkJaWYoIXRoaXMuc2hhcmVHcm91cCl7CisJCQkJdGhpcy5wYXJlbnQuZm9jdXMoKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCQlpZih0aGlzLnNoYXJlR3JvdXAgPT0gY3VySW5zdC50b29sYmFyR3JvdXApeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9LAorCQlkZXN0cm95OiBmdW5jdGlvbigpeworCQkJZm9yKHZhciBpdCBpbiB0aGlzLml0ZW1zKXsKKwkJCQl0aGlzLml0ZW1zW2l0XS5kZXN0cm95KCk7CisJCQkJZGVsZXRlIHRoaXMuaXRlbXNbaXRdOworCQkJfQorCQkJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXIuc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7CisJCX0KKwl9CispOworCitkb2pvLnByb3ZpZGUoImRvam8udXJpLmNhY2hlIik7CisKK2Rvam8udXJpLmNhY2hlID0geworCV9jYWNoZToge30sCisJc2V0OiBmdW5jdGlvbigvKmRvam8udXJpLlVyaSovdXJpLCAvKlN0cmluZyovY29udGVudCl7CisJCS8vc3VtbWFyeTogU2V0cyB0aGUgY2FjaGUgdmFsdWUgZm9yIGEgVVJJLgorCQl0aGlzLl9jYWNoZVt1cmkudG9TdHJpbmcoKV0gPSBjb250ZW50OworCQlyZXR1cm4gdXJpOyAvL2Rvam8udXJpLlVyaQorCX0sCisKKwlyZW1vdmU6IGZ1bmN0aW9uKC8qZG9qby51cmkuVXJpKi91cmkpeworCQkvL3N1bW1hcnk6IFJlbW92ZXMgYSBjYWNoZSB2YWx1ZSBmb3IgYSBVUkkuCisJCWRlbGV0ZSB0aGlzLl9jYWNoZVt1cmkudG9TdHJpbmcoKV07CisJfSwKKworCWdldDogZnVuY3Rpb24oLypkb2pvLnVyaS5VcmkqL3VyaSl7CisJCS8vc3VtbWFyeTogUmVtb3ZlcyBhIGNhY2hlIHZhbHVlIGZvciBhIFVSSS4KKwkJdmFyIGtleSA9ICB1cmkudG9TdHJpbmcoKTsKKwkJdmFyIHZhbHVlID0gdGhpcy5fY2FjaGVba2V5XTsKKwkJaWYoIXZhbHVlKXsKKwkJCXZhbHVlID0gZG9qby5ob3N0ZW52LmdldFRleHQoa2V5KTsKKwkJCWlmKHZhbHVlKXsKKwkJCQl0aGlzLl9jYWNoZVtrZXldID0gdmFsdWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlOyAvL1N0cmluZworCX0sCisKKwlhbGxvdzogZnVuY3Rpb24oLypkb2pvLnVyaS5VcmkqL3VyaSl7CisJCS8vc3VtbWFyeTogQSBtYXJrZXIgdGhhdCBpbmRpY2F0ZXMgYSBVUkkgY2FuIGJlIGludGVybmVkIGJ5IHRoZQorCQkvL2ludGVybi1zdHJpbmdzIGJ1aWxkIHN0ZXAuCisJCXJldHVybiB1cmk7CisJfQorfQorCitkb2pvLnByb3ZpZGUoImRvam8ubGZ4LnNoYWRvdyIpOworCisKKworCitkb2pvLmxmeC5zaGFkb3cgPSBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpIHsKKwkvLwlzdW1tYXJ5CisJLy8JY3JlYXRlcyBhIHNoYWRvdyB1bmRlcm5lYXRoIG5vZGUuCisJdGhpcy5zaGFkb3dQbmcgPSBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8uaHRtbCIsICJpbWFnZXMvc2hhZG93Iik7CisJdGhpcy5zaGFkb3dUaGlja25lc3MgPSA4OworCXRoaXMuc2hhZG93T2Zmc2V0ID0gMTU7CisJdGhpcy5pbml0KG5vZGUpOworfQorCitkb2pvLmV4dGVuZChkb2pvLmxmeC5zaGFkb3csIHsKKwlpbml0OiBmdW5jdGlvbigvKiBIVE1MRWxlbWVudCAqL25vZGUpeworCQkvLwlzdW1tYXJ5CisJCS8vCUluaXRpYWxpemVzIHRoZSBzaGFkb3cuCisJCXRoaXMubm9kZT1ub2RlOworCisJCS8vIG1ha2UgYWxsIHRoZSBwaWVjZXMgb2YgdGhlIHNoYWRvdywgYW5kIHBvc2l0aW9uL3NpemUgdGhlbSBhcyBtdWNoCisJCS8vIGFzIHBvc3NpYmxlIChidXQgYSBsb3Qgb2YgdGhlIGNvb3JkaW5hdGVzIGFyZSBzZXQgaW4gc2l6ZVNoYWRvdworCQl0aGlzLnBpZWNlcz17fTsKKwkJdmFyIHgxID0gLTEgKiB0aGlzLnNoYWRvd1RoaWNrbmVzczsKKwkJdmFyIHkwID0gdGhpcy5zaGFkb3dPZmZzZXQ7CisJCXZhciB5MSA9IHRoaXMuc2hhZG93T2Zmc2V0ICsgdGhpcy5zaGFkb3dUaGlja25lc3M7CisJCXRoaXMuX21ha2VQaWVjZSgidGwiLCAidG9wIiwgeTAsICJsZWZ0IiwgeDEpOworCQl0aGlzLl9tYWtlUGllY2UoImwiLCAidG9wIiwgeTEsICJsZWZ0IiwgeDEsICJzY2FsZSIpOworCQl0aGlzLl9tYWtlUGllY2UoInRyIiwgInRvcCIsIHkwLCAibGVmdCIsIDApOworCQl0aGlzLl9tYWtlUGllY2UoInIiLCAidG9wIiwgeTEsICJsZWZ0IiwgMCwgInNjYWxlIik7CisJCXRoaXMuX21ha2VQaWVjZSgiYmwiLCAidG9wIiwgMCwgImxlZnQiLCB4MSk7CisJCXRoaXMuX21ha2VQaWVjZSgiYiIsICJ0b3AiLCAwLCAibGVmdCIsIDAsICJjcm9wIik7CisJCXRoaXMuX21ha2VQaWVjZSgiYnIiLCAidG9wIiwgMCwgImxlZnQiLCAwKTsKKwl9LAorCisJX21ha2VQaWVjZTogZnVuY3Rpb24obmFtZSwgdmVydEF0dGFjaCwgdmVydENvb3JkLCBob3J6QXR0YWNoLCBob3J6Q29vcmQsIHNpemluZyl7CisJCXZhciBpbWc7CisJCXZhciB1cmwgPSB0aGlzLnNoYWRvd1BuZyArIG5hbWUudG9VcHBlckNhc2UoKSArICIucG5nIjsKKwkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZTU1IHx8IGRvam8ucmVuZGVyLmh0bWwuaWU2MCl7CisJCQlpbWc9ZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCWltZy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIit1cmwrIiciKworCQkJKHNpemluZz8iLCBzaXppbmdNZXRob2Q9JyIrc2l6aW5nKyInIjoiIikgKyAiKSI7CisJCX1lbHNleworCQkJaW1nPWRvam8uZG9jKCkuY3JlYXRlRWxlbWVudCgiaW1nIik7CisJCQlpbWcuc3JjPXVybDsKKwkJfQorCQlpbWcuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjsKKwkJaW1nLnN0eWxlW3ZlcnRBdHRhY2hdPXZlcnRDb29yZCsicHgiOworCQlpbWcuc3R5bGVbaG9yekF0dGFjaF09aG9yekNvb3JkKyJweCI7CisJCWltZy5zdHlsZS53aWR0aD10aGlzLnNoYWRvd1RoaWNrbmVzcysicHgiOworCQlpbWcuc3R5bGUuaGVpZ2h0PXRoaXMuc2hhZG93VGhpY2tuZXNzKyJweCI7CisJCXRoaXMucGllY2VzW25hbWVdPWltZzsKKwkJdGhpcy5ub2RlLmFwcGVuZENoaWxkKGltZyk7CisJfSwKKworCXNpemU6IGZ1bmN0aW9uKC8qIGludCAqL3dpZHRoLCAvKiBpbnQgKi9oZWlnaHQpeworCQkvLwlzdW1tYXJ5CisJCS8vCVJlc2l6ZXMgdGhlIHNoYWRvdyBiYXNlZCBvbiB3aWR0aCBhbmQgaGVpZ2h0LgorCQl2YXIgc2lkZUhlaWdodCA9IGhlaWdodCAtICh0aGlzLnNoYWRvd09mZnNldCt0aGlzLnNoYWRvd1RoaWNrbmVzcysxKTsKKwkJaWYgKHNpZGVIZWlnaHQgPCAwKSB7IHNpZGVIZWlnaHQgPSAwOyB9CisJCWlmIChoZWlnaHQgPCAxKSB7IGhlaWdodCA9IDE7IH0KKwkJaWYgKHdpZHRoIDwgMSkgeyB3aWR0aCA9IDE7IH0KKwkJd2l0aCh0aGlzLnBpZWNlcyl7CisJCQlsLnN0eWxlLmhlaWdodCA9IHNpZGVIZWlnaHQrInB4IjsKKwkJCXIuc3R5bGUuaGVpZ2h0ID0gc2lkZUhlaWdodCsicHgiOworCQkJYi5zdHlsZS53aWR0aCA9ICh3aWR0aC0xKSsicHgiOworCQkJYmwuc3R5bGUudG9wID0gKGhlaWdodC0xKSsicHgiOworCQkJYi5zdHlsZS50b3AgPSAoaGVpZ2h0LTEpKyJweCI7CisJCQlici5zdHlsZS50b3AgPSAoaGVpZ2h0LTEpKyJweCI7CisJCQl0ci5zdHlsZS5sZWZ0ID0gKHdpZHRoLTEpKyJweCI7CisJCQlyLnN0eWxlLmxlZnQgPSAod2lkdGgtMSkrInB4IjsKKwkJCWJyLnN0eWxlLmxlZnQgPSAod2lkdGgtMSkrInB4IjsKKwkJfQorCX0KK30pOworCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuaHRtbC5sYXlvdXQiKTsKKworCisKKworCisKK2Rvam8ud2lkZ2V0Lmh0bWwubGF5b3V0ID0gZnVuY3Rpb24oLypEb21Ob2RlKi8gY29udGFpbmVyLCAvKk9iamVjdFtdKi8gY2hpbGRyZW4sIC8qU3RyaW5nKi8gbGF5b3V0UHJpb3JpdHkpIHsKKwkvKioKKwkgKiBzdW1tYXJ5CisJICoJCUxheW91dCBhIGJ1bmNoIG9mIGNoaWxkIGRvbSBub2RlcyB3aXRoaW4gYSBwYXJlbnQgZG9tIG5vZGUKKwkgKiBjb250YWluZXI6CisJICoJCXBhcmVudCBub2RlCisJICogbGF5b3V0UHJpb3JpdHk6CisJICoJCSJ0b3AtYm90dG9tIiBvciAibGVmdC1yaWdodCIKKwkgKiBjaGlsZHJlbjoKKwkgKgkJYW4gYXJyYXkgbGlrZSBbIHtkb21Ob2RlOiBmb28sIGxheW91dEFsaWduOiAiYm90dG9tIiB9LCB7ZG9tTm9kZTogYmFyLCBsYXlvdXRBbGlnbjogImNsaWVudCJ9IF0KKwkgKi8KKworCWRvam8uaHRtbC5hZGRDbGFzcyhjb250YWluZXIsICJkb2pvTGF5b3V0Q29udGFpbmVyIik7CisKKwkvLyBDb3B5IGNoaWxkcmVuIGFycmF5IGFuZCByZW1vdmUgZWxlbWVudHMgdy9vdXQgbGF5b3V0LgorCS8vIEFsc28gcmVjb3JkIGVhY2ggY2hpbGQncyBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgYXJyYXksIGZvciBzb3J0aW5nIHB1cnBvc2VzLgorCWNoaWxkcmVuID0gZG9qby5sYW5nLmZpbHRlcihjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQsIGlkeCl7CisJCWNoaWxkLmlkeCA9IGlkeDsKKwkJcmV0dXJuIGRvam8ubGFuZy5pbkFycmF5KFsidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiY2xpZW50IiwiZmxvb2QiXSwgY2hpbGQubGF5b3V0QWxpZ24pCisJfSk7CisKKwkvLyBPcmRlciB0aGUgY2hpbGRyZW4gYWNjb3JkaW5nIHRvIGxheW91dFByaW9yaXR5LgorCS8vIE11bHRpcGxlIGNoaWxkcmVuIHcvdGhlIHNhbWUgbGF5b3V0UHJpb3JpdHkgd2lsbCBiZSBzb3J0ZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4gdGhlIGlucHV0IGFycmF5LgorCWlmKGxheW91dFByaW9yaXR5ICYmIGxheW91dFByaW9yaXR5IT0ibm9uZSIpeworCQl2YXIgcmFuayA9IGZ1bmN0aW9uKGNoaWxkKXsKKwkJCXN3aXRjaChjaGlsZC5sYXlvdXRBbGlnbil7CisJCQkJY2FzZSAiZmxvb2QiOgorCQkJCQlyZXR1cm4gMTsKKwkJCQljYXNlICJsZWZ0IjoKKwkJCQljYXNlICJyaWdodCI6CisJCQkJCXJldHVybiAobGF5b3V0UHJpb3JpdHk9PSJsZWZ0LXJpZ2h0IikgPyAyIDogMzsKKwkJCQljYXNlICJ0b3AiOgorCQkJCWNhc2UgImJvdHRvbSI6CisJCQkJCXJldHVybiAobGF5b3V0UHJpb3JpdHk9PSJsZWZ0LXJpZ2h0IikgPyAzIDogMjsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gNDsKKwkJCX0KKwkJfTsKKwkJY2hpbGRyZW4uc29ydChmdW5jdGlvbihhLGIpeworCQkJcmV0dXJuIChyYW5rKGEpLXJhbmsoYikpIHx8IChhLmlkeCAtIGIuaWR4KTsKKwkJfSk7CisJfQorCisJLy8gcmVtYWluaW5nIHNwYWNlIChibGFuayBhcmVhIHdoZXJlIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbikKKwl2YXIgZj17CisJCXRvcDogZG9qby5odG1sLmdldFBpeGVsVmFsdWUoY29udGFpbmVyLCAicGFkZGluZy10b3AiLCB0cnVlKSwKKwkJbGVmdDogZG9qby5odG1sLmdldFBpeGVsVmFsdWUoY29udGFpbmVyLCAicGFkZGluZy1sZWZ0IiwgdHJ1ZSkKKwl9OworCWRvam8ubGFuZy5taXhpbihmLCBkb2pvLmh0bWwuZ2V0Q29udGVudEJveChjb250YWluZXIpKTsKKworCS8vIHNldCBwb3NpdGlvbnMvc2l6ZXMKKwlkb2pvLmxhbmcuZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpeworCQl2YXIgZWxtPWNoaWxkLmRvbU5vZGU7CisJCXZhciBwb3M9Y2hpbGQubGF5b3V0QWxpZ247CisJCS8vIHNldCBlbGVtIHRvIHVwcGVyIGxlZnQgY29ybmVyIG9mIHVudXNlZCBzcGFjZTsgbWF5IG1vdmUgaXQgbGF0ZXIKKwkJd2l0aChlbG0uc3R5bGUpeworCQkJbGVmdCA9IGYubGVmdCsicHgiOworCQkJdG9wID0gZi50b3ArInB4IjsKKwkJCWJvdHRvbSA9ICJhdXRvIjsKKwkJCXJpZ2h0ID0gImF1dG8iOworCQl9CisJCWRvam8uaHRtbC5hZGRDbGFzcyhlbG0sICJkb2pvQWxpZ24iICsgZG9qby5zdHJpbmcuY2FwaXRhbGl6ZShwb3MpKTsKKworCQkvLyBzZXQgc2l6ZSAmJiBhZGp1c3QgcmVjb3JkIG9mIHJlbWFpbmluZyBzcGFjZS4KKwkJLy8gbm90ZSB0aGF0IHNldHRpbmcgdGhlIHdpZHRoIG9mIGEgPGRpdj4gbWF5IGFmZmVjdCBpdCdzIGhlaWdodC4KKwkJLy8gVE9ETzogc2FtZSBpcyB0cnVlIGZvciB3aWRnZXRzIGJ1dCBuZWVkIHRvIGltcGxlbWVudCBBUEkgdG8gc3VwcG9ydCB0aGF0CisJCWlmICggKHBvcz09InRvcCIpfHwocG9zPT0iYm90dG9tIikgKSB7CisJCQlkb2pvLmh0bWwuc2V0TWFyZ2luQm94KGVsbSwgeyB3aWR0aDogZi53aWR0aCB9KTsKKwkJCXZhciBoID0gZG9qby5odG1sLmdldE1hcmdpbkJveChlbG0pLmhlaWdodDsKKwkJCWYuaGVpZ2h0IC09IGg7CisJCQlpZihwb3M9PSJ0b3AiKXsKKwkJCQlmLnRvcCArPSBoOworCQkJfWVsc2V7CisJCQkJZWxtLnN0eWxlLnRvcCA9IGYudG9wICsgZi5oZWlnaHQgKyAicHgiOworCQkJfQorCQkJLy8gVE9ETzogZm9yIHdpZGdldHMgSSB3YW50IHRvIGNhbGwgcmVzaXplVG8oKSwgYnV0IEkgY2FuJ3QgYmVjYXVzZQorCQkJLy8gSSBvbmx5IHdhbnQgdG8gc2V0IHRoZSB3aWR0aCwgYW5kIGhhdmUgdGhlIGhlaWdodCBkZXRlcm1pbmVkCisJCQkvLyBkeW5hbWljYWxseS4gIChUaGUgdGhpbm5lciB5b3UgbWFrZSBhIGRpdiwgdGhlIG1vcmUgaGVpZ2h0IGl0IGNvbnN1bWVzLikKKwkJCWlmKGNoaWxkLm9uUmVzaXplZCl7CisJCQkJY2hpbGQub25SZXNpemVkKCk7CisJCQl9CisJCX1lbHNlIGlmKHBvcz09ImxlZnQiIHx8IHBvcz09InJpZ2h0Iil7CisJCQl2YXIgdyA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3goZWxtKS53aWR0aDsKKworCQkJLy8gVE9ETzogSSBvbmx5IHdhbnQgdG8gc2V0IHRoZSBoZWlnaHQsIG5vdCB0aGUgd2lkdGgsIGJ1dCBzZWUgYnVnIzk0MSAoRkYpLAorCQkJLy8gYW5kIGFsc28gdGhlIHJlc2l6ZVRvKCkgZnVuY3Rpb24gZGVtYW5kcyBib3RoIGhlaWdodCBhbmQgd2lkdGggYXJndW1lbnRzCisJCQlpZihjaGlsZC5yZXNpemVUbyl7CisJCQkJY2hpbGQucmVzaXplVG8odywgZi5oZWlnaHQpOworCQkJfWVsc2V7CisJCQkJZG9qby5odG1sLnNldE1hcmdpbkJveChlbG0sIHsgd2lkdGg6IHcsIGhlaWdodDogZi5oZWlnaHQgfSk7CisJCQl9CQorCisJCQlmLndpZHRoIC09IHc7CisJCQlpZihwb3M9PSJsZWZ0Iil7CisJCQkJZi5sZWZ0ICs9IHc7CisJCQl9ZWxzZXsKKwkJCQllbG0uc3R5bGUubGVmdCA9IGYubGVmdCArIGYud2lkdGggKyAicHgiOworCQkJfQorCQl9IGVsc2UgaWYocG9zPT0iZmxvb2QiIHx8IHBvcz09ImNsaWVudCIpeworCQkJaWYoY2hpbGQucmVzaXplVG8peworCQkJCWNoaWxkLnJlc2l6ZVRvKGYud2lkdGgsIGYuaGVpZ2h0KTsKKwkJCX1lbHNleworCQkJCWRvam8uaHRtbC5zZXRNYXJnaW5Cb3goZWxtLCB7IHdpZHRoOiBmLndpZHRoLCBoZWlnaHQ6IGYuaGVpZ2h0IH0pOworCQkJfQorCQl9CisJfSk7Cit9OworCisvLyBUaGlzIGlzIGVzc2VudGlhbCBDU1MgdG8gbWFrZSBsYXlvdXQgd29yayAoaXQgaXNuJ3QgInN0eWxpbmciIENTUykKKy8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBwb3NpdGlvbjphYnNvbHV0ZSBpbiBkb2pvQWxpZ24qIG92ZXJyaWRlcyBvdGhlciBjbGFzc2VzCitkb2pvLmh0bWwuaW5zZXJ0Q3NzVGV4dCgKKwkiLmRvam9MYXlvdXRDb250YWluZXJ7IHBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IH1cbiIgKworCSJib2R5IC5kb2pvQWxpZ25Ub3AsIGJvZHkgLmRvam9BbGlnbkJvdHRvbSwgYm9keSAuZG9qb0FsaWduTGVmdCwgYm9keSAuZG9qb0FsaWduUmlnaHQgeyBwb3NpdGlvbjogYWJzb2x1dGU7IG92ZXJmbG93OiBoaWRkZW47IH1cbiIgKworCSJib2R5IC5kb2pvQWxpZ25DbGllbnQgeyBwb3NpdGlvbjogYWJzb2x1dGUgfVxuIiArCisJIi5kb2pvQWxpZ25DbGllbnQgeyBvdmVyZmxvdzogYXV0bzsgfVxuIgorKTsKKworCisKKworZG9qby5wcm92aWRlKCJkb2pvLmRuZC5EcmFnQW5kRHJvcCIpOworCisvLyBzdW1tYXJ5OgorLy8JCUNvcmUgImludGVyZmFjZXMiIGZvciB0aGUgcGFydGljaXBhbnRzIGluIGFsbCBEbkQgb3BlcmF0aW9ucy4KKy8vCQlTdWJjbGFzc2VzIGltcGxlbWVudCBhbGwgb2YgdGhlIGFjdGlvbnMgb3V0bGluZWQgYnkgdGhlc2UgQVBJcywgd2l0aAorLy8JCW1vc3Qgb2YgdGhlIG9uZXMgeW91IHByb2JhYmx5IGNhcmUgYWJvdXQgYmVpbmcgZGVmaW5lZCBpbgorLy8JCUh0bWxEcmFnQW5kRHJvcC5qcywgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHNob3VsZCB5b3UKKy8vCQkuCisvLworLy8JCUluIGFkZGl0aW9uIHRvIHRoZSB2YXJpb3VzIGFjdG9yIGNsYXNzZXMsIGEgZ2xvYmFsIG1hbmFnZXIgd2lsbCBiZQorLy8JCWNyZWF0ZWQvaW5zdGFsbGVkIGF0IGRvam8uZG5kLmRyYWdNYW5hZ2VyLiBUaGlzIG1hbmFnZXIgb2JqZWN0IGlzIG9mCisvLwkJdHlwZSBkb2pvLmRuZC5EcmFnTWFuYWdlciBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBlbnZpcm9ubWVudC1zcGVjaWZpYworLy8JCW1hbmFnZXJzLgorLy8KKy8vIAkJVGhlIDMgb2JqZWN0IHR5cGVzIGludm9sdmVkIGluIGFueSBEcmFnIGFuZCBEcm9wIG9wZXJhdGlvbiBhcmU6CisvLwkJCSogRHJhZ1NvdXJjZQorLy8JCQkJVGhpcyBpcyB0aGUgaXRlbSB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmb3IgZHJhZ2dpbmcuIERyYWcKKy8vCQkJCXNvdXJjZXMgY2FuIGhhdmUgInR5cGVzIiB0byBoZWxwIG1lZGlhdGUgd2hldGhlciBvciBub3QgdmFyaW91cworLy8JCQkJRHJvcFRhcmdldHMgd2lsbCBhY2NlcHQgKG9yIHJlamVjdCB0aGVtKS4gTW9zdCBkcmFnZ2luZyBhY3Rpb25zCisvLwkJCQlhcmUgaGFuZGxlZCBieSB0aGUgRHJhZ09iamVjdCB3aGljaCB0aGUgRHJhZ1NvdXJjZSBnZW5lcmF0ZXMKKy8vCQkJCWZyb20gaXRzIG9uRHJhZ1N0YXJ0IG1ldGhvZC4KKy8vCQkJKiBEcmFnT2JqZWN0CisvLwkJCQlUaGlzLCBhbG9uZyB3aXRoIHRoZSBtYW5nZXIsIGRvZXMgbW9zdCBvZiB0aGUgaGFyZCB3b3JrIG9mIERuRC4KKy8vCQkJCUltcGxlbWVudGF0aW9ucyBtYXkgcmVseSBvbiBEcmFnT2JqZWN0IGluc3RhbmNlcyB0byBpbXBsZW1lbnQKKy8vCQkJCSJzaGFkb3dpbmciLCAibW92ZW1lbnQiLCBvciBvdGhlciBraW5kcyBvZiBEbkQgdmFyaWF0aW9ucyB0aGF0CisvLwkJCQlhZmZlY3QgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHJhZyBvcGVyYXRpb24uCisvLwkJCSogRHJvcFRhcmdldAorLy8JCQkJUmVwcmVzZW50cyBzb21lIHNlY3Rpb24gb2YgdGhlIHNjcmVlbiB0aGF0IGNhbiBhY2NlcHQgZHJhZworLy8JCQkJYW5kIGRyb3AgZXZlbnRzLiBEcm9wVGFyZ2V0cyBrZWVwIGEgbGlzdCBvZiBhY2NlcHRlZCB0eXBlcworLy8JCQkJd2hpY2ggaXMgY2hlY2tlZCBhZ2FpbnMgdGhlIHR5cGVzIG9mIHRoZSByZXNwZWN0aXZlIERyYWdTb3VyY2UKKy8vCQkJCW9iamVjdHMgdGhhdCBwYXNzIG92ZXIgaXQuIERyb3BUYXJnZXRzIG1heSBpbXBsZW1lbnQgYmVoYXZpb3JzCisvLwkJCQl0aGF0IHJlc3BvbmQgdG8gZHJvcCBldmVudHMgdG8gdGFrZSBhcHBsaWNhdGlvbi1sZXZlbCBhY3Rpb25zLgorCitkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdTb3VyY2UiLCBudWxsLCB7CisJLy8gU3RyaW5nOiAKKwkvLwkJd2hhdCBraW5kIG9mIGRyYWcgc291cmNlIGFyZSB3ZT8gVXNlZCB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGJlCisJLy8JCWRyb3BwZWQgb24gYSBnaXZlbiBEcm9wVGFyZ2V0CisJdHlwZTogIiIsCisKKwlvbkRyYWdFbmQ6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3R1YiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgZmluaXNoZXMuCisJfSwKKworCW9uRHJhZ1N0YXJ0OiBmdW5jdGlvbigvKmRvam8uZG5kLkRyYWdFdmVudCovZXZ0KXsgLy8gZG9qby5kbmQuRHJhZ09iamVjdAorCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3R1YiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLiBTdWJjbGFzc2VzCisJCS8vCQlzaG91bGQgZW5zdXJlIHRoYXQgb25EcmFnU3RhcnQgKmFsd2F5cyogcmV0dXJucyBhCisJCS8vCQlkb2pvLmRuZC5EcmFnT2JqZWN0IGluc3RhbmNlLgorCX0sCisKKwlvblNlbGVjdGVkOiBmdW5jdGlvbigvKmRvam8uZG5kLkRyYWdFdmVudCovZXZ0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgRE9NIGVsZW1lbnQgd2FzIHNlbGVjdGVkIGZvcgorCQkvLwkJZHJhZ2dpbmcgYnkgdGhlIEh0bWxEcmFnQW5kRHJvcE1hbmFnZXIuCisJfSwKKworCXVucmVnaXN0ZXI6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IHJlbW92ZSB0aGlzIGRyYWcgc291cmNlIGZyb20gdGhlIG1hbmFnZXIKKwkJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7CisJfSwKKworCXJlcmVnaXN0ZXI6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGFkZCB0aGlzIGRyYWcgc291cmNlIHRvIHRoZSBtYW5hZ2VyCisJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnJlZ2lzdGVyRHJhZ1NvdXJjZSh0aGlzKTsKKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5EcmFnT2JqZWN0IiwgbnVsbCwgeworCS8vIFN0cmluZzogCisJLy8JCXdoYXQga2luZCBvZiBkcmFnIG9iamVjdCBhcmUgd2U/IFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBiZQorCS8vCQlkcm9wcGVkIG9uIGEgZ2l2ZW4gRHJvcFRhcmdldAorCXR5cGU6ICIiLAorCQorCXJlZ2lzdGVyOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiByZWdpc3RlciB0aGlzIERyYWdPYmplY3Qgd2l0aCB0aGUgbWFuYWdlcgorCQl2YXIgZG0gPSBkb2pvLmRuZC5kcmFnTWFuYWdlcjsKKwkJaWYoZG1bInJlZ2lzdGVyRHJhZ09iamVjdCJdKXsgLy8gc2lkZS1lZmZlY3QgcHJldmVudGlvbgorCQkJZG0ucmVnaXN0ZXJEcmFnT2JqZWN0KHRoaXMpOworCQl9CisJfSwKKworCW9uRHJhZ1N0YXJ0OiBmdW5jdGlvbigvKmRvam8uZG5kLkRyYWdFdmVudCovZXZ0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8gCQlvdmVyLXJpZGRlbiBieSBzdWJjbGFzc2VzLiBHZXRzIGNhbGxlZCBkaXJlY3RseSBhZnRlciBiZWluZworCQkvLyAJCWNyZWF0ZWQgYnkgdGhlIERyYWdTb3VyY2UgZGVmYXVsdCBhY3Rpb24gaXMgdG8gY2xvbmUgc2VsZiBhcworCQkvLyAJCWljb24KKwl9LAorCisJb25EcmFnTW92ZTogZnVuY3Rpb24oLypkb2pvLmRuZC5EcmFnRXZlbnQqL2V2dCl7CisJCS8vIHN1bW1hcnk6IAorCQkvLwkJSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4gU2hvdWxkIGNoYW5nZSB0aGUgVUkgZm9yIHRoZSBkcmFnCisJCS8vCQlpY29uIGkuZS4sICJpdCBtb3ZlcyBpdHNlbGYiCisJfSwKKworCW9uRHJhZ092ZXI6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3R1YiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIERyYWdPYmplY3QgaW5zdGFuY2UgaXMKKwkJLy8JCSJvdmVyIiBhIERyb3BUYXJnZXQuCisJfSwKKworCW9uRHJhZ091dDogZnVuY3Rpb24oLypkb2pvLmRuZC5EcmFnRXZlbnQqL2V2dCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlzdHViIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgRHJhZ09iamVjdCBpbnN0YW5jZSBsZWF2ZXMKKwkJLy8JCWEgRHJvcFRhcmdldC4KKwl9LAorCisJb25EcmFnRW5kOiBmdW5jdGlvbigvKmRvam8uZG5kLkRyYWdFdmVudCovZXZ0KXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXN0dWIgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGVuZHMsIGVpdGhlciB0aHJvdWdoCisJCS8vCQlkcm9wcGluZyBvciBjYW5jZWxhdGlvbi4KKwl9LAorCisJLy8gbm9ybWFsIGFsaWFzZXMKKwlvbkRyYWdMZWF2ZTogZG9qby5sYW5nLmZvcndhcmQoIm9uRHJhZ091dCIpLAorCW9uRHJhZ0VudGVyOiBkb2pvLmxhbmcuZm9yd2FyZCgib25EcmFnT3ZlciIpLAorCisJLy8gbm9uLWNhbWVsIGFsaWFzZXMKKwlvbmRyYWdvdXQ6IGRvam8ubGFuZy5mb3J3YXJkKCJvbkRyYWdPdXQiKSwKKwlvbmRyYWdvdmVyOiBkb2pvLmxhbmcuZm9yd2FyZCgib25EcmFnT3ZlciIpCit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5Ecm9wVGFyZ2V0IiwgbnVsbCwgeworCisJYWNjZXB0c1R5cGU6IGZ1bmN0aW9uKC8qU3RyaW5nKi90eXBlKXsKKwkJLy8gc3VtbWFyeTogCisJCS8vCQlkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgRHJvcFRhcmdldCB3aWxsIGFjY2VwdCB0aGUgZ2l2ZW4KKwkJLy8JCXR5cGUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNvbnN1bHQgdGhpcy5hY2NlcHRlZFR5cGVzIGFuZAorCQkvLwkJaWYgIioiIGlzIGEgbWVtYmVyLCB0byBhbHdheXMgYWNjZXB0IHRoZSB0eXBlLgorCQlpZighZG9qby5sYW5nLmluQXJyYXkodGhpcy5hY2NlcHRlZFR5cGVzLCAiKiIpKXsgLy8gd2lsZGNhcmQKKwkJCWlmKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLmFjY2VwdGVkVHlwZXMsIHR5cGUpKSB7IHJldHVybiBmYWxzZTsgfSAvLyBCb29sZWFuCisJCX0KKwkJcmV0dXJuIHRydWU7IC8vIEJvb2xlYW4KKwl9LAorCisJYWNjZXB0czogZnVuY3Rpb24oLypBcnJheSovZHJhZ09iamVjdHMpeworCQkvLyBzdW1tYXJ5OiAKKwkJLy8JCWRldGVybWluZXMgaWYgd2UnbGwgYWNjZXB0IGFsbCBtZW1iZXJzIG9mIHRoZSBwYXNzZWQgYXJyYXkgb2YKKwkJLy8JCWRvam8uZG5kLkRyYWdPYmplY3QgaW5zdGFuY2VzCisJCWlmKCFkb2pvLmxhbmcuaW5BcnJheSh0aGlzLmFjY2VwdGVkVHlwZXMsICIqIikpeyAvLyB3aWxkY2FyZAorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJCWlmICghZG9qby5sYW5nLmluQXJyYXkodGhpcy5hY2NlcHRlZFR5cGVzLAorCQkJCQlkcmFnT2JqZWN0c1tpXS50eXBlKSkgeyByZXR1cm4gZmFsc2U7IH0gLy8gQm9vbGVhbgorCQkJfQorCQl9CisJCXJldHVybiB0cnVlOyAvLyBCb29sZWFuCisJfSwKKworCXVucmVnaXN0ZXI6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IHJlbW92ZSBmcm9tIHRoZSBkcmFnIG1hbmFnZXIKKwkJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyb3BUYXJnZXQodGhpcyk7CisJfSwKKworCW9uRHJhZ092ZXI6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3R1YiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gRHJhZ09iamVjdCBpbnN0YW5jZXMgYXJlCisJCS8vCQkib3ZlciIgdGhpcyBEcm9wVGFyZ2V0LgorCX0sCisKKwlvbkRyYWdPdXQ6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJc3R1YiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gRHJhZ09iamVjdCBpbnN0YW5jZXMgYXJlCisJCS8vCQkibGVhdmUiIHRoaXMgRHJvcFRhcmdldC4KKwl9LAorCisJb25EcmFnTW92ZTogZnVuY3Rpb24oLypkb2pvLmRuZC5EcmFnRXZlbnQqL2V2dCl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlzdHViIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBEcmFnT2JqZWN0IGluc3RhbmNlcyBhcmUKKwkJLy8JCW1vdmVkIGFjcm9zcyB0aGlzIERyb3BUYXJnZXQuIE1heSBmaXJlIG1hbnkgdGltZXMgaW4gdGhlIGNvdXJzZQorCQkvLwkJb2YgdGhlIGRyYWcgb3BlcmF0aW9uIGJ1dCB3aWxsIGVuZCBhZnRlciBvbkRyYWdPdXQKKwl9LAorCisJb25Ecm9wU3RhcnQ6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeyAvLyBCb29sZWFuCisJCS8vIHN1bW1hcnk6CisJCS8vCQlzdHViIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBEcmFnT2JqZWN0IGluc3RhbmNlcyBhcmUKKwkJLy8JCWRyb3BwZWQgb24gdGhpcyB0YXJnZXQuIElmIHRydWUgaXMgcmV0dXJuZWQgZnJvbSBvbkRyb3BTdGFydCwKKwkJLy8JCWRyb3BwaW5nIHByb2NlZWRzLCBvdGhlcndpc2UgaXQncyBjYW5jbGVkLgorCX0sCisKKwlvbkRyb3A6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJhZ0V2ZW50Ki9ldnQpeworCQkvLyBzdW1tYXJ5OiB3ZSdyZSBnZXR0aW5nIGRyb3BwZWQgb24hCisJfSwKKworCW9uRHJvcEVuZDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogZHJvcHBpbmcgaXMgb3ZlcgorCX0KK30sIGZ1bmN0aW9uKCl7CisJdGhpcy5hY2NlcHRlZFR5cGVzID0gW107Cit9KTsKKworLy8gTk9URTogdGhpcyBpbnRlcmZhY2UgaXMgZGVmaW5lZCBoZXJlIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIERyYWdNYW5hZ2VyCisvLyBpbXBsZW1lbnRvci4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgc2F0aXNmaWVkIGJ5CisvLyBleHRlbmRpbmcgYSBuYXRpdmUgZXZlbnQgKERPTSBldmVudCBpbiBIVE1MIGFuZCBTVkcpLgorZG9qby5kbmQuRHJhZ0V2ZW50ID0gZnVuY3Rpb24oKXsKKwl0aGlzLmRyYWdTb3VyY2UgPSBudWxsOworCXRoaXMuZHJhZ09iamVjdCA9IG51bGw7CisJdGhpcy50YXJnZXQgPSBudWxsOworCXRoaXMuZXZlbnRTdGF0dXMgPSAic3VjY2VzcyI7CisJLy8KKwkvLyBjYW4gYmUgb25lIG9mOgorCS8vCVsJImRyb3BTdWNjZXNzIiwgImRyb3BGYWlsdXJlIiwgImRyYWdNb3ZlIiwKKwkvLwkJImRyYWdTdGFydCIsICJkcmFnRW50ZXIiLCAiZHJhZ0xlYXZlIl0KKwkvLworfQorLyoKKyAqCVRoZSBEcmFnTWFuYWdlciBoYW5kbGVzIGxpc3RlbmluZyBmb3IgbG93LWxldmVsIGV2ZW50cyBhbmQgZGlzcGF0Y2hpbmcKKyAqCXRoZW0gdG8gaGlnaGVyLWxldmVsIHByaW1pdGl2ZXMgbGlrZSBkcmFnIHNvdXJjZXMgYW5kIGRyb3AgdGFyZ2V0cy4gSW4KKyAqCW9yZGVyIHRvIGRvIHRoaXMsIGl0IG11c3Qga2VlcCBhIGxpc3Qgb2YgdGhlIGl0ZW1zLgorICovCitkb2pvLmRlY2xhcmUoImRvam8uZG5kLkRyYWdNYW5hZ2VyIiwgbnVsbCwgeworCS8vIEFycmF5OiBhbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgRHJhZ1NvdXJjZSBvYmplY3RzCisJc2VsZWN0ZWRTb3VyY2VzOiBbXSwKKwkvLyBBcnJheTogYWxsIERyYWdPYmplY3RzIHdlIGtub3cgYWJvdXQKKwlkcmFnT2JqZWN0czogW10sCisJLy8gQXJyYXk6IGFsbCBEcmFnU291cmNlcyB3ZSBrbm93IGFib3V0CisJZHJhZ1NvdXJjZXM6IFtdLAorCXJlZ2lzdGVyRHJhZ1NvdXJjZTogZnVuY3Rpb24oLypkb2pvLmRuZC5EcmFnU291cmNlKi8gc291cmNlKXsKKwkJLy8gc3VtbWFyeTogY2FsbGVkIGJ5IERyYWdTb3VyY2UgY2xhc3MgY29uc3RydWN0b3IKKwl9LAorCS8vIEFycmF5OiBhbGwgRHJvcFRhcmdldHMgd2Uga25vdyBhYm91dAorCWRyb3BUYXJnZXRzOiBbXSwKKwlyZWdpc3RlckRyb3BUYXJnZXQ6IGZ1bmN0aW9uKC8qZG9qby5kbmQuRHJvcFRhcmdldCovIHRhcmdldCl7CisJCS8vIHN1bW1hcnk6IGNhbGxlZCBieSBEcm9wVGFyZ2V0IGNsYXNzIGNvbnN0cnVjdG9yCisJfSwKKwkvLyBkb2pvLmRuZC5Ecm9wVGFyZ2V0OgorCS8vCQl3aGF0IHdhcyB0aGUgbGFzdCBEcm9wVGFyZ2V0IGluc3RhbmNlIHdlIGxlZnQgaW4gdGhlIGRyYWcgcGhhc2U/CisJbGFzdERyYWdUYXJnZXQ6IG51bGwsCisJLy8gZG9qby5kbmQuRHJvcFRhcmdldDoKKwkvLwkJdGhlIERyb3BUYXJnZXQgdGhlIG1vdXNlIGlzIGN1cnJlbnRseSBvdmVyCisJY3VycmVudERyYWdUYXJnZXQ6IG51bGwsCisJb25LZXlEb3duOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBnZW5lcmljIGhhbmRsZXIgY2FsbGVkIGJ5IGxvdy1sZXZlbCBldmVudHMKKwl9LAorCW9uTW91c2VPdXQ6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGdlbmVyaWMgaGFuZGxlciBjYWxsZWQgYnkgbG93LWxldmVsIGV2ZW50cworCX0sCisJb25Nb3VzZU1vdmU6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IGdlbmVyaWMgaGFuZGxlciBjYWxsZWQgYnkgbG93LWxldmVsIGV2ZW50cworCX0sCisJb25Nb3VzZVVwOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBnZW5lcmljIGhhbmRsZXIgY2FsbGVkIGJ5IGxvdy1sZXZlbCBldmVudHMKKwl9Cit9KTsKKworLy8gTk9URTogZGVzcGl0ZSB0aGUgZXhpc3RhbmNlIG9mIHRoZSBEcmFnTWFuYWdlciBjbGFzcywgdGhlcmUgd2lsbCBiZSBhCisvLyBzaW5nbGV0b24gZHJhZyBtYW5hZ2VyIHByb3ZpZGVkIGJ5IHRoZSByZW5kZXJlci1zcGVjaWZpYyBEJkQgc3VwcG9ydCBjb2RlLgorLy8gSXQgaXMgdGhlcmVmb3JlIHNhbmUgZm9yIHVzIHRvIGFzc2lnbiBpbnN0YW5jZSB2YXJpYWJsZXMgdG8gdGhlIERyYWdNYW5hZ2VyCisvLyBwcm90b3R5cGUKKworLy8gVGhlIHJlbmRlcmVyLXNwZWNpZmljIGZpbGUgd2lsbCBkZWZpbmUgdGhlIGZvbGxvd2luZyBvYmplY3Q6CisvLyBkb2pvLmRuZC5kcmFnTWFuYWdlciA9IG51bGw7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuSHRtbERyYWdNYW5hZ2VyIik7CisKKworCisKKworCisvLyBOT1RFOiB0aGVyZSB3aWxsIG9ubHkgZXZlciBiZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBIVE1MRHJhZ01hbmFnZXIsIHNvIGl0J3MKKy8vIHNhZmUgdG8gdXNlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBib29rLWtlZXBpbmcuCitkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcmFnTWFuYWdlciIsIGRvam8uZG5kLkRyYWdNYW5hZ2VyLCB7CisJLyoqCisJICogVGhlcmUgYXJlIHNldmVyYWwgc2V0cyBvZiBhY3Rpb25zIHRoYXQgdGhlIERuRCBjb2RlIGNhcmVzIGFib3V0IGluIHRoZQorCSAqIEhUTUwgY29udGV4dDoKKwkgKgkxLikgbW91c2UtZG93biAtPgorCSAqCQkJKGRyYWdnYWJsZSBzZWxlY3Rpb24pCisJICoJCQkoZHJhZ09iamVjdCBnZW5lcmF0aW9uKQorCSAqCQltb3VzZS1tb3ZlIC0+CisJICoJCQkoZHJhZ2dhYmxlIG1vdmVtZW50KQorCSAqCQkJKGRyb3BwYWJsZSBkZXRlY3Rpb24pCisJICoJCQkoaW5mb3JtIGRyb3BwYWJsZSkKKwkgKgkJCShpbmZvcm0gZHJhZ09iamVjdCkKKwkgKgkJbW91c2UtdXAKKwkgKgkJCShpbmZvcm0vZGVzdHJveSBkcmFnT2JqZWN0KQorCSAqCQkJKGluZm9ybSBkcmFnZ2FibGUpCisJICoJCQkoaW5mb3JtIGRyb3BwYWJsZSkKKwkgKgkyLikgbW91c2UtZG93biAtPiBtb3VzZS1kb3duCisJICoJCQkoY2xpY2staG9sZCBjb250ZXh0IG1lbnUpCisJICoJMy4pIG1vdXNlLWNsaWNrIC0+CisJICoJCQkoZHJhZ2dhYmxlIHNlbGVjdGlvbikKKwkgKgkJc2hpZnQtbW91c2UtY2xpY2sgLT4KKwkgKgkJCShhdWdtZW50IGRyYWdnYWJsZSBzZWxlY3Rpb24pCisJICoJCW1vdXNlLWRvd24gLT4KKwkgKgkJCShkcmFnT2JqZWN0IGdlbmVyYXRpb24pCisJICoJCW1vdXNlLW1vdmUgLT4KKwkgKgkJCShkcmFnZ2FibGUgbW92ZW1lbnQpCisJICoJCQkoZHJvcHBhYmxlIGRldGVjdGlvbikKKwkgKgkJCShpbmZvcm0gZHJvcHBhYmxlKQorCSAqCQkJKGluZm9ybSBkcmFnT2JqZWN0KQorCSAqCQltb3VzZS11cAorCSAqCQkJKGluZm9ybSBkcmFnZ2FibGUpCisJICoJCQkoaW5mb3JtIGRyb3BwYWJsZSkKKwkgKgk0LikgbW91c2UtdXAKKwkgKgkJCShjbG9iYmVyIGRyYWdnYWJsZSBzZWxlY3Rpb24pCisJICovCisJZGlzYWJsZWQ6IGZhbHNlLCAvLyB0byBraWxsIGFsbCBkcmFnZ2luZyEKKwluZXN0ZWRUYXJnZXRzOiBmYWxzZSwKKwltb3VzZURvd25UaW1lcjogbnVsbCwgLy8gdXNlZCBmb3IgY2xpY2staG9sZCBvcGVyYXRpb25zCisJZHNDb3VudGVyOiAwLAorCWRzUHJlZml4OiAiZG9qb0RyYWdTb3VyY2UiLAorCisJLy8gZGltZW5zaW9uIGNhbGN1bGF0aW9uIGNhY2hlIGZvciB1c2UgZHVycmluZyBkcmFnCisJZHJvcFRhcmdldERpbWVuc2lvbnM6IFtdLAorCisJY3VycmVudERyb3BUYXJnZXQ6IG51bGwsCisJLy8gY3VycmVudERyb3BUYXJnZXRQb2ludHM6IG51bGwsCisJcHJldmlvdXNEcm9wVGFyZ2V0OiBudWxsLAorCV9kcmFnVHJpZ2dlcmVkOiBmYWxzZSwKKworCXNlbGVjdGVkU291cmNlczogW10sCisJZHJhZ09iamVjdHM6IFtdLAorCWRyYWdTb3VyY2VzOiBbXSwKKwlkcm9wVGFyZ2V0czogW10sCisKKwkvLyBtb3VzZSBwb3NpdGlvbiBwcm9wZXJ0aWVzCisJY3VycmVudFg6IG51bGwsCisJY3VycmVudFk6IG51bGwsCisJbGFzdFg6IG51bGwsCisJbGFzdFk6IG51bGwsCisJbW91c2VEb3duWDogbnVsbCwKKwltb3VzZURvd25ZOiBudWxsLAorCXRocmVzaG9sZDogNywKKworCWRyb3BBY2NlcHRhYmxlOiBmYWxzZSwKKworCWNhbmNlbEV2ZW50OiBmdW5jdGlvbihlKXsgZS5zdG9wUHJvcGFnYXRpb24oKTsgZS5wcmV2ZW50RGVmYXVsdCgpO30sCisKKwkvLyBtZXRob2Qgb3Zlci1yaWRlcworCXJlZ2lzdGVyRHJhZ1NvdXJjZTogZnVuY3Rpb24oZHMpeworCQkvL2Rvam8ucHJvZmlsZS5zdGFydCgicmVnaXN0ZXIgRHJhZ1NvdXJjZSIpOworCisJCWlmKGRzWyJkb21Ob2RlIl0peworCQkJLy8gRklYTUU6IGRyYWdTb3VyY2Ugb2JqZWN0cyBTSE9VTEQgaGF2ZSBzb21lIHNvcnQgb2YgcHJvcGVydHkgdGhhdAorCQkJLy8gcmVmZXJlbmNlcyB0aGVpciBET00gbm9kZSwgd2Ugc2hvdWxkbid0IGp1c3QgYmUgcGFzc2luZyBub2RlcyBhbmQKKwkJCS8vIGV4cGVjdGluZyBpdCB0byB3b3JrLgorCQkJLy9kb2pvLnByb2ZpbGUuc3RhcnQoInJlZ2lzdGVyIERyYWdTb3VyY2UgMSIpOworCQkJdmFyIGRwID0gdGhpcy5kc1ByZWZpeDsKKwkJCXZhciBkcElkeCA9IGRwKyJJZHhfIisodGhpcy5kc0NvdW50ZXIrKyk7CisJCQlkcy5kcmFnU291cmNlSWQgPSBkcElkeDsKKwkJCXRoaXMuZHJhZ1NvdXJjZXNbZHBJZHhdID0gZHM7CisJCQlkcy5kb21Ob2RlLnNldEF0dHJpYnV0ZShkcCwgZHBJZHgpOworCQkJLy9kb2pvLnByb2ZpbGUuZW5kKCJyZWdpc3RlciBEcmFnU291cmNlIDEiKTsKKworCQkJLy9kb2pvLnByb2ZpbGUuc3RhcnQoInJlZ2lzdGVyIERyYWdTb3VyY2UgMiIpOworCisJCQkvLyBzbyB3ZSBjYW4gZHJhZyBsaW5rcworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJLy9kb2pvLnByb2ZpbGUuc3RhcnQoInJlZ2lzdGVyIERyYWdTb3VyY2UgSUUiKTsKKwkJCQkKKwkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuYWRkTGlzdGVuZXIoZHMuZG9tTm9kZSwgIm9uZHJhZ3N0YXJ0IiwgdGhpcy5jYW5jZWxFdmVudCk7CisJCQkJLy8gdGVycmlibHkgc2xvdworCQkJCS8vZG9qby5ldmVudC5jb25uZWN0KGRzLmRvbU5vZGUsICJvbmRyYWdzdGFydCIsIHRoaXMuY2FuY2VsRXZlbnQpOworCQkJCS8vZG9qby5wcm9maWxlLmVuZCgicmVnaXN0ZXIgRHJhZ1NvdXJjZSBJRSIpOworCisJCQl9CisJCQkvL2Rvam8ucHJvZmlsZS5lbmQoInJlZ2lzdGVyIERyYWdTb3VyY2UgMiIpOworCisJCX0KKwkJLy9kb2pvLnByb2ZpbGUuZW5kKCJyZWdpc3RlciBEcmFnU291cmNlIik7CisJfSwKKworCXVucmVnaXN0ZXJEcmFnU291cmNlOiBmdW5jdGlvbihkcyl7CisJCWlmIChkc1siZG9tTm9kZSJdKXsKKwkJCXZhciBkcCA9IHRoaXMuZHNQcmVmaXg7CisJCQl2YXIgZHBJZHggPSBkcy5kcmFnU291cmNlSWQ7CisJCQlkZWxldGUgZHMuZHJhZ1NvdXJjZUlkOworCQkJZGVsZXRlIHRoaXMuZHJhZ1NvdXJjZXNbZHBJZHhdOworCQkJZHMuZG9tTm9kZS5zZXRBdHRyaWJ1dGUoZHAsIG51bGwpOworCQkJaWYoZG9qby5yZW5kZXIuaHRtbC5pZSl7CisJCQkJZG9qby5ldmVudC5icm93c2VyLnJlbW92ZUxpc3RlbmVyKGRzLmRvbU5vZGUsICJvbmRyYWdzdGFydCIsIHRoaXMuY2FuY2VsRXZlbnQpOwkJCQorCQkJfQorCQl9CisJfSwKKworCXJlZ2lzdGVyRHJvcFRhcmdldDogZnVuY3Rpb24oZHQpeworCQl0aGlzLmRyb3BUYXJnZXRzLnB1c2goZHQpOworCX0sCisKKwl1bnJlZ2lzdGVyRHJvcFRhcmdldDogZnVuY3Rpb24oZHQpeworCQl2YXIgaW5kZXggPSBkb2pvLmxhbmcuZmluZCh0aGlzLmRyb3BUYXJnZXRzLCBkdCwgdHJ1ZSk7CisJCWlmIChpbmRleD49MCkgeworCQkJdGhpcy5kcm9wVGFyZ2V0cy5zcGxpY2UoaW5kZXgsIDEpOworCQl9CisJfSwKKworCS8qKgorCSogR2V0IHRoZSBET00gZWxlbWVudCB0aGF0IGlzIG1lYW50IHRvIGRyYWcuCisJKiBMb29wIHRocm91Z2ggdGhlIHBhcmVudCBub2RlcyBvZiB0aGUgZXZlbnQgdGFyZ2V0IHVudGlsCisJKiB0aGUgZWxlbWVudCBpcyBmb3VuZCB0aGF0IHdhcyBjcmVhdGVkIGFzIGEgRHJhZ1NvdXJjZSBhbmQgCisJKiByZXR1cm4gaXQuCisJKgorCSogQHBhcmFtIGV2ZW50IG9iamVjdCBUaGUgZXZlbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZHJhZyBzb3VyY2UuCisJKi8KKwlnZXREcmFnU291cmNlOiBmdW5jdGlvbihlKXsKKwkJdmFyIHRuID0gZS50YXJnZXQ7CisJCWlmKHRuID09PSBkb2pvLmJvZHkoKSl7IHJldHVybjsgfQorCQl2YXIgdGEgPSBkb2pvLmh0bWwuZ2V0QXR0cmlidXRlKHRuLCB0aGlzLmRzUHJlZml4KTsKKwkJd2hpbGUoKCF0YSkmJih0bikpeworCQkJdG4gPSB0bi5wYXJlbnROb2RlOworCQkJaWYoKCF0bil8fCh0biA9PT0gZG9qby5ib2R5KCkpKXsgcmV0dXJuOyB9CisJCQl0YSA9IGRvam8uaHRtbC5nZXRBdHRyaWJ1dGUodG4sIHRoaXMuZHNQcmVmaXgpOworCQl9CisJCXJldHVybiB0aGlzLmRyYWdTb3VyY2VzW3RhXTsKKwl9LAorCisJb25LZXlEb3duOiBmdW5jdGlvbihlKXsKKwl9LAorCisJb25Nb3VzZURvd246IGZ1bmN0aW9uKGUpeworCQlpZih0aGlzLmRpc2FibGVkKSB7IHJldHVybjsgfQorCisJCS8vIG9ubHkgYmVnaW4gb24gbGVmdCBjbGljaworCQlpZihkb2pvLnJlbmRlci5odG1sLmllKSB7CisJCQlpZihlLmJ1dHRvbiAhPSAxKSB7IHJldHVybjsgfQorCQl9IGVsc2UgaWYoZS53aGljaCAhPSAxKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl2YXIgdGFyZ2V0ID0gZS50YXJnZXQubm9kZVR5cGUgPT0gZG9qby5odG1sLlRFWFRfTk9ERSA/CisJCQllLnRhcmdldC5wYXJlbnROb2RlIDogZS50YXJnZXQ7CisKKwkJLy8gZG8gbm90IHN0YXJ0IGRyYWcgaW52b2x2ZW1lbnQgaWYgdGhlIHVzZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aAorCQkvLyBhIGZvcm0gZWxlbWVudC4KKwkJaWYoZG9qby5odG1sLmlzVGFnKHRhcmdldCwgImJ1dHRvbiIsICJ0ZXh0YXJlYSIsICJpbnB1dCIsICJzZWxlY3QiLCAib3B0aW9uIikpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGZpbmQgYSBzZWxlY3Rpb24gb2JqZWN0LCBpZiBvbmUgaXMgYSBwYXJlbnQgb2YgdGhlIHNvdXJjZSBub2RlCisJCXZhciBkcyA9IHRoaXMuZ2V0RHJhZ1NvdXJjZShlKTsKKwkJCisJCS8vIHRoaXMgbGluZSBpcyBpbXBvcnRhbnQuICBpZiB3ZSBhcmVuJ3Qgc2VsZWN0aW5nIGFueXRoaW5nIHRoZW4KKwkJLy8gd2UgbmVlZCB0byByZXR1cm4gbm93LCBzbyBwcmV2ZW50RGVmYXVsdCgpIGlzbid0IGNhbGxlZCwgYW5kIHRodXMKKwkJLy8gdGhlIGV2ZW50IGlzIHByb3BvZ2F0ZWQgdG8gb3RoZXIgaGFuZGxpbmcgY29kZQorCQlpZighZHMpeyByZXR1cm47IH0KKworCQlpZighZG9qby5sYW5nLmluQXJyYXkodGhpcy5zZWxlY3RlZFNvdXJjZXMsIGRzKSl7CisJCQl0aGlzLnNlbGVjdGVkU291cmNlcy5wdXNoKGRzKTsKKwkJCWRzLm9uU2VsZWN0ZWQoKTsKKwkJfQorCisgCQl0aGlzLm1vdXNlRG93blggPSBlLnBhZ2VYOworIAkJdGhpcy5tb3VzZURvd25ZID0gZS5wYWdlWTsKKworCQkvLyBNdXN0IHN0b3AgdGhlIG1vdXNlIGRvd24gZnJvbSBiZWluZyBwcm9wb2dhdGVkLCBvciBvdGhlcndpc2UgY2FuJ3QKKwkJLy8gZHJhZyBsaW5rcyBpbiBmaXJlZm94LgorCQkvLyBXQVJOSU5HOiBwcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGFjdGlvbiBvbiBhbGwgbW91c2Vkb3duIGV2ZW50cworCQkvLyBwcmV2ZW50cyB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIGNvbnRlbnRzLgorCQllLnByZXZlbnREZWZhdWx0KCk7CisKKwkJZG9qby5ldmVudC5jb25uZWN0KGRvY3VtZW50LCAib25tb3VzZW1vdmUiLCB0aGlzLCAib25Nb3VzZU1vdmUiKTsKKwl9LAorCisJb25Nb3VzZVVwOiBmdW5jdGlvbihlLCBjYW5jZWwpeworCQkvLyBpZiB3ZSBhcmVuJ3QgZHJhZ2dpbmcgdGhlbiBpZ25vcmUgdGhlIG1vdXNlLXVwCisJCS8vIChpbiBwYXJ0aWN1bGFyLCBkb24ndCBjYWxsIHByZXZlbnREZWZhdWx0KCksIGJlY2F1c2Ugb3RoZXIKKwkJLy8gY29kZSBtYXkgbmVlZCB0byBwcm9jZXNzIHRoaXMgZXZlbnQpCisJCWlmKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aD09MCl7CisJCQlyZXR1cm47CisJCX0KKworCQl0aGlzLm1vdXNlRG93blggPSBudWxsOworCQl0aGlzLm1vdXNlRG93blkgPSBudWxsOworCQl0aGlzLl9kcmFnVHJpZ2dlcmVkID0gZmFsc2U7CisgCQkvLyBlLnByZXZlbnREZWZhdWx0KCk7CisJCWUuZHJhZ1NvdXJjZSA9IHRoaXMuZHJhZ1NvdXJjZTsKKwkJLy8gbGV0IGN0cmwgYmUgdXNlZCBmb3IgbXVsdGlzZWxlY3Qgb3IgYW5vdGhlciBhY3Rpb24KKwkJLy8gaWYgSSB1c2Ugc2FtZSBrZXkgdG8gdHJpZ2dlciB0cmVlVjMgbm9kZSBzZWxlY3Rpb24gYW5kIGhlcmUsCisJCS8vIEkgaGF2ZSBidWdzIHdpdGggZHJhZyduJ2Ryb3AuIHdoeSA/PyBubyBpZGVhLi4KKwkJaWYoKCFlLnNoaWZ0S2V5KSYmKCFlLmN0cmxLZXkpKXsgCisJCS8vaWYoIWUuc2hpZnRLZXkpeworCQkJaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgeworCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25Ecm9wU3RhcnQoKTsKKwkJCX0KKwkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuZHJhZ09iamVjdHMsIGZ1bmN0aW9uKHRlbXBEcmFnT2JqKXsKKwkJCQl2YXIgcmV0ID0gbnVsbDsKKwkJCQlpZighdGVtcERyYWdPYmopeyByZXR1cm47IH0KKwkJCQlpZih0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7CisJCQkJCWUuZHJhZ09iamVjdCA9IHRlbXBEcmFnT2JqOworCisJCQkJCS8vIE5PVEU6IHdlIGNhbid0IGdldCBhbnl0aGluZyBidXQgdGhlIGN1cnJlbnQgZHJvcCB0YXJnZXQKKwkJCQkJLy8gaGVyZSBzaW5jZSB0aGUgZHJhZyBzaGFkb3cgYmxvY2tzIG1vdXNlLW92ZXIgZXZlbnRzLgorCQkJCQkvLyBUaGlzIGlzIHByb2JlbGVtYXRpYyBmb3IgZHJvcHBpbmcgImluIiBzb21ldGhpbmcKKwkJCQkJdmFyIGNlID0gdGhpcy5jdXJyZW50RHJvcFRhcmdldC5kb21Ob2RlLmNoaWxkTm9kZXM7CisJCQkJCWlmKGNlLmxlbmd0aCA+IDApeworCQkJCQkJZS5kcm9wVGFyZ2V0ID0gY2VbMF07CisJCQkJCQl3aGlsZShlLmRyb3BUYXJnZXQgPT0gdGVtcERyYWdPYmouZG9tTm9kZSl7CisJCQkJCQkJZS5kcm9wVGFyZ2V0ID0gZS5kcm9wVGFyZ2V0Lm5leHRTaWJsaW5nOworCQkJCQkJfQorCQkJCQl9ZWxzZXsKKwkJCQkJCWUuZHJvcFRhcmdldCA9IHRoaXMuY3VycmVudERyb3BUYXJnZXQuZG9tTm9kZTsKKwkJCQkJfQorCQkJCQlpZih0aGlzLmRyb3BBY2NlcHRhYmxlKXsKKwkJCQkJCXJldCA9IHRoaXMuY3VycmVudERyb3BUYXJnZXQub25Ecm9wKGUpOworCQkJCQl9ZWxzZXsKKwkJCQkJCSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ091dChlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWUuZHJhZ1N0YXR1cyA9IHRoaXMuZHJvcEFjY2VwdGFibGUgJiYgcmV0ID8gImRyb3BTdWNjZXNzIiA6ICJkcm9wRmFpbHVyZSI7CisJCQkJLy8gZGVjb3VwbGUgdGhlIGNhbGxzIGZvciBvbkRyYWdFbmQsIHNvIHRoZXkgZG9uJ3QgYmxvY2sgdGhlIGV4ZWN1dGlvbiBoZXJlCisJCQkJLy8gaWUuIGlmIHRoZSBvbkRyYWdFbmQgd291bGQgY2FsbCBhbiBhbGVydCwgdGhlIGV4ZWN1dGlvbiBoZXJlIGlzIGJsb2NrZWQgdW50aWwgdGhlCisJCQkJLy8gdXNlciBoYXMgY29uZmlybWVkIHRoZSBhbGVydCBib3ggYW5kIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIGRuZCBjb2RlIGlzIGV4ZWN1dGVkCisJCQkJLy8gd2hpbGUgdGhlIG1vdXNlIGRvZXNudCAiaG9sZCIgdGhlIGRyYWdnZWQgb2JqZWN0IGFueW1vcmUgLi4uIGFuZCBzbyBvbgorCQkJCWRvam8ubGFuZy5kZWxheVRoZXNlKFsKKwkJCQkJZnVuY3Rpb24oKSB7CisJCQkJCQkvLyBpbiBGRjEuNSB0aGlzIHRocm93cyBhbiBleGNlcHRpb24sIHNlZSAKKwkJCQkJCS8vIGh0dHA6Ly9kb2pvdG9vbGtpdC5vcmcvcGlwZXJtYWlsL2Rvam8taW50ZXJlc3QvMjAwNi1BcHJpbC8wMDY3NTEuaHRtbAorCQkJCQkJdHJ5eworCQkJCQkJCXRlbXBEcmFnT2JqLmRyYWdTb3VyY2Uub25EcmFnRW5kKGUpCisJCQkJCQl9IGNhdGNoKGVycikgeworCQkJCQkJCS8vIHNpbmNlIHRoZSBwcm9ibGVtIHNlZW1zIHBhc3NpbmcgZSwgd2UganVzdCBjb3B5IGFsbCAKKwkJCQkJCQkvLyBwcm9wZXJ0aWVzIGFuZCB0cnkgdGhlIGNvcHkgLi4uCisJCQkJCQkJdmFyIGVjb3B5ID0ge307CisJCQkJCQkJZm9yICh2YXIgaSBpbiBlKSB7CisJCQkJCQkJCWlmIChpPT0idHlwZSIpIHsgLy8gdGhlIHR5cGUgcHJvcGVydHkgY29udGFpbnMgdGhlIGV4Y2VwdGlvbiwgbm8gaWRlYSB3aHkuLi4KKwkJCQkJCQkJCWVjb3B5LnR5cGUgPSAibW91c2V1cCI7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQllY29weVtpXSA9IGVbaV07CisJCQkJCQkJfQorCQkJCQkJCXRlbXBEcmFnT2JqLmRyYWdTb3VyY2Uub25EcmFnRW5kKGVjb3B5KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQksIGZ1bmN0aW9uKCkge3RlbXBEcmFnT2JqLm9uRHJhZ0VuZChlKX1dKTsKKwkJCX0sIHRoaXMpOworCisJCQl0aGlzLnNlbGVjdGVkU291cmNlcyA9IFtdOworCQkJdGhpcy5kcmFnT2JqZWN0cyA9IFtdOworCQkJdGhpcy5kcmFnU291cmNlID0gbnVsbDsKKwkJCWlmKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHsKKwkJCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJvcEVuZCgpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy9kb2pvLmRlYnVnKCJzcGVjaWFsIGNsaWNrIik7CisJCX0KKworCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9jdW1lbnQsICJvbm1vdXNlbW92ZSIsIHRoaXMsICJvbk1vdXNlTW92ZSIpOworCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsKKwl9LAorCisJb25TY3JvbGw6IGZ1bmN0aW9uKCl7CisJCS8vZG9qby5wcm9maWxlLnN0YXJ0KCJETkRNYW5hZ2VyIHVwZGF0ZW9mZnNldCIpOworCQlmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJaWYodGhpcy5kcmFnT2JqZWN0c1tpXS51cGRhdGVEcmFnT2Zmc2V0KSB7CisJCQkJdGhpcy5kcmFnT2JqZWN0c1tpXS51cGRhdGVEcmFnT2Zmc2V0KCk7CisJCQl9CisJCX0KKwkJLy9kb2pvLnByb2ZpbGUuZW5kKCJETkRNYW5hZ2VyIHVwZGF0ZW9mZnNldCIpOworCisJCS8vIFRPRE86IGRvIG5vdCByZWNhbGN1bGF0ZSwgb25seSBhZGp1c3QgY29vcmRpbmF0ZXMKKwkJaWYgKHRoaXMuZHJhZ09iamVjdHMubGVuZ3RoKSB7CisJCQl0aGlzLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7CisJCX0KKwl9LAorCisJX2RyYWdTdGFydERpc3RhbmNlOiBmdW5jdGlvbih4LCB5KXsKKwkJaWYoKCF0aGlzLm1vdXNlRG93blgpfHwoIXRoaXMubW91c2VEb3duWCkpeworCQkJcmV0dXJuOworCQl9CisJCXZhciBkeCA9IE1hdGguYWJzKHgtdGhpcy5tb3VzZURvd25YKTsKKwkJdmFyIGR4MiA9IGR4KmR4OworCQl2YXIgZHkgPSBNYXRoLmFicyh5LXRoaXMubW91c2VEb3duWSk7CisJCXZhciBkeTIgPSBkeSpkeTsKKwkJcmV0dXJuIHBhcnNlSW50KE1hdGguc3FydChkeDIrZHkyKSwgMTApOworCX0sCisKKwljYWNoZVRhcmdldExvY2F0aW9uczogZnVuY3Rpb24oKXsKKwkJZG9qby5wcm9maWxlLnN0YXJ0KCJjYWNoZVRhcmdldExvY2F0aW9ucyIpOworCisJCXRoaXMuZHJvcFRhcmdldERpbWVuc2lvbnMgPSBbXTsKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy5kcm9wVGFyZ2V0cywgZnVuY3Rpb24odGVtcFRhcmdldCl7CisJCQl2YXIgdG4gPSB0ZW1wVGFyZ2V0LmRvbU5vZGU7CisJCQkvL29ubHkgY2FjaGUgZHJvcFRhcmdldCB3aGljaCBjYW4gYWNjZXB0IGN1cnJlbnQgZHJhZ1NvdXJjZQorCQkJaWYoIXRuIHx8ICF0ZW1wVGFyZ2V0LmFjY2VwdHMoW3RoaXMuZHJhZ1NvdXJjZV0pKXsgcmV0dXJuOyB9CisJCQl2YXIgYWJzID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odG4sIHRydWUpOworCQkJdmFyIGJiID0gZG9qby5odG1sLmdldEJvcmRlckJveCh0bik7CisJCQl0aGlzLmRyb3BUYXJnZXREaW1lbnNpb25zLnB1c2goWworCQkJCVthYnMueCwgYWJzLnldLAkvLyB1cHBlci1sZWZ0CisJCQkJLy8gbG93ZXItcmlnaHQKKwkJCQlbIGFicy54K2JiLndpZHRoLCBhYnMueStiYi5oZWlnaHQgXSwKKwkJCQl0ZW1wVGFyZ2V0CisJCQldKTsKKwkJCS8vZG9qby5kZWJ1ZygiQ2FjaGVkIGZvciAiK3RlbXBUYXJnZXQpCisJCX0sIHRoaXMpOworCisJCWRvam8ucHJvZmlsZS5lbmQoImNhY2hlVGFyZ2V0TG9jYXRpb25zIik7CisKKwkJLy9kb2pvLmRlYnVnKCJDYWNoZSBsb2NhdGlvbnMiKQorCX0sCisKKwlvbk1vdXNlTW92ZTogZnVuY3Rpb24oZSl7CisJCWlmKChkb2pvLnJlbmRlci5odG1sLmllKSYmKGUuYnV0dG9uICE9IDEpKXsKKwkJCS8vIE9vb29wcyAtIG1vdXNlIHVwIG9jY3VycmVkIC0gZS5nLiB3aGVuIG1vdXNlIHdhcyBub3Qgb3ZlciB0aGUKKwkJCS8vIHdpbmRvdy4gSSBkb24ndCB0aGluayB3ZSBjYW4gZGV0ZWN0IHRoaXMgZm9yIEZGIC0gYnV0IGF0IGxlYXN0CisJCQkvLyB3ZSBjYW4gYmUgbmljZSBpbiBJRS4KKwkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsOworCQkJdGhpcy5vbk1vdXNlVXAoZSwgdHJ1ZSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBpZiB3ZSd2ZSBnb3Qgc29tZSBzb3VyY2VzLCBidXQgbm8gZHJhZyBvYmplY3RzLCB3ZSBuZWVkIHRvIHNlbmQKKwkJLy8gb25EcmFnU3RhcnQgdG8gYWxsIHRoZSByaWdodCBwYXJ0aWVzIGFuZCBnZXQgdGhpbmdzIGxpbmVkIHVwIGZvcgorCQkvLyBkcm9wIHRhcmdldCBkZXRlY3Rpb24KKworCQlpZigJKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aCkmJgorCQkJKCF0aGlzLmRyYWdPYmplY3RzLmxlbmd0aCkgKXsKKwkJCXZhciBkeDsKKwkJCXZhciBkeTsKKwkJCWlmKCF0aGlzLl9kcmFnVHJpZ2dlcmVkKXsKKwkJCQl0aGlzLl9kcmFnVHJpZ2dlcmVkID0gKHRoaXMuX2RyYWdTdGFydERpc3RhbmNlKGUucGFnZVgsIGUucGFnZVkpID4gdGhpcy50aHJlc2hvbGQpOworCQkJCWlmKCF0aGlzLl9kcmFnVHJpZ2dlcmVkKXsgcmV0dXJuOyB9CisJCQkJZHggPSBlLnBhZ2VYIC0gdGhpcy5tb3VzZURvd25YOworCQkJCWR5ID0gZS5wYWdlWSAtIHRoaXMubW91c2VEb3duWTsKKwkJCX0KKworCQkJLy8gdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIG91ciBkcmFnU291cmNlLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKwkJCS8vIHNlbGVjdGVkU291cmNlcyAoZWxlbWVudHMgdGhhdCBtb3ZlIGFsb25nKSB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgdGhlIG1hc3RlcgorCQkJLy8gYW5kIGZvciBpdCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgZXRjLgorCQkJdGhpcy5kcmFnU291cmNlID0gdGhpcy5zZWxlY3RlZFNvdXJjZXNbMF07CisJCQkKKwkJCWRvam8ubGFuZy5mb3JFYWNoKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLCBmdW5jdGlvbih0ZW1wU291cmNlKXsKKwkJCQlpZighdGVtcFNvdXJjZSl7IHJldHVybjsgfQorCQkJCXZhciB0ZG8gPSB0ZW1wU291cmNlLm9uRHJhZ1N0YXJ0KGUpOworCQkJCWlmKHRkbyl7CisJCQkJCXRkby5vbkRyYWdTdGFydChlKTsKKworCQkJCQkvLyAiYnVtcCIgdGhlIGRyYWcgb2JqZWN0IHRvIGFjY291bnQgZm9yIHRoZSBkcmFnIHRocmVzaG9sZAorCQkJCQl0ZG8uZHJhZ09mZnNldC55ICs9IGR5OworCQkJCQl0ZG8uZHJhZ09mZnNldC54ICs9IGR4OworCQkJCQl0ZG8uZHJhZ1NvdXJjZSA9IHRlbXBTb3VyY2U7CisKKwkJCQkJdGhpcy5kcmFnT2JqZWN0cy5wdXNoKHRkbyk7CisJCQkJfQorCQkJfSwgdGhpcyk7CisKKwkJCS8qIGNsZWFuIHByZXZpb3VzIGRyb3AgdGFyZ2V0IGluIGRyYWdTdGFydCAqLworCQkJdGhpcy5wcmV2aW91c0Ryb3BUYXJnZXQgPSBudWxsOworCisJCQl0aGlzLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7CisJCX0KKworCQkvLyBGSVhNRTogd2UgbmVlZCB0byBhZGQgZHJhZ1NvdXJjZXMgYW5kIGRyYWdPYmplY3RzIHRvIGUKKwkJZG9qby5sYW5nLmZvckVhY2godGhpcy5kcmFnT2JqZWN0cywgZnVuY3Rpb24oZHJhZ09iail7CisJCQlpZihkcmFnT2JqKXsgZHJhZ09iai5vbkRyYWdNb3ZlKGUpOyB9CisJCX0pOworCisJCS8vIGlmIHdlIGhhdmUgYSBjdXJyZW50IGRyb3AgdGFyZ2V0LCBjaGVjayB0byBzZWUgaWYgd2UncmUgb3V0c2lkZSBvZgorCQkvLyBpdC4gSWYgc28sIGRvIGFsbCB0aGUgYWN0aW9ucyB0aGF0IG5lZWQgZG9pbmcuCisJCWlmKHRoaXMuY3VycmVudERyb3BUYXJnZXQpeworCQkJLy9kb2pvLmRlYnVnKGRvam8uaHRtbC5oYXNQYXJlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldC5kb21Ob2RlKSkKKwkJCXZhciBjID0gZG9qby5odG1sLnRvQ29vcmRpbmF0ZU9iamVjdCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LmRvbU5vZGUsIHRydWUpOworCQkJLy8JCXZhciBkdHAgPSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0UG9pbnRzOworCQkJdmFyIGR0cCA9IFsKKwkJCQlbYy54LGMueV0sIFtjLngrYy53aWR0aCwgYy55K2MuaGVpZ2h0XQorCQkJXTsKKwkJfQorCisJCWlmKCghdGhpcy5uZXN0ZWRUYXJnZXRzKSYmKGR0cCkmJih0aGlzLmlzSW5zaWRlQm94KGUsIGR0cCkpKXsKKwkJCWlmKHRoaXMuZHJvcEFjY2VwdGFibGUpeworCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnTW92ZShlLCB0aGlzLmRyYWdPYmplY3RzKTsKKwkJCX0KKwkJfWVsc2V7CisJCQkvLyBGSVhNRTogbmVlZCB0byBmaXggdGhlIGV2ZW50IG9iamVjdCEKKwkJCS8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIGJldHRlciBkcm9wIHRhcmdldAorCQkJdmFyIGJlc3RCb3ggPSB0aGlzLmZpbmRCZXN0VGFyZ2V0KGUpOworCisJCQlpZihiZXN0Qm94LnRhcmdldCA9PT0gbnVsbCl7CisJCQkJaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCl7CisJCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnT3V0KGUpOworCQkJCQl0aGlzLnByZXZpb3VzRHJvcFRhcmdldCA9IHRoaXMuY3VycmVudERyb3BUYXJnZXQ7CisJCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsOworCQkJCQkvLyB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0UG9pbnRzID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5kcm9wQWNjZXB0YWJsZSA9IGZhbHNlOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYodGhpcy5jdXJyZW50RHJvcFRhcmdldCAhPT0gYmVzdEJveC50YXJnZXQpeworCQkJCWlmKHRoaXMuY3VycmVudERyb3BUYXJnZXQpeworCQkJCQl0aGlzLnByZXZpb3VzRHJvcFRhcmdldCA9IHRoaXMuY3VycmVudERyb3BUYXJnZXQ7CisJCQkJCXRoaXMuY3VycmVudERyb3BUYXJnZXQub25EcmFnT3V0KGUpOworCQkJCX0KKwkJCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gYmVzdEJveC50YXJnZXQ7CisJCQkJLy8gdGhpcy5jdXJyZW50RHJvcFRhcmdldFBvaW50cyA9IGJlc3RCb3gucG9pbnRzOworCQkJCWUuZHJhZ09iamVjdHMgPSB0aGlzLmRyYWdPYmplY3RzOworCQkJCXRoaXMuZHJvcEFjY2VwdGFibGUgPSB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ092ZXIoZSk7CisKKwkJCX1lbHNleworCQkJCWlmKHRoaXMuZHJvcEFjY2VwdGFibGUpeworCQkJCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0Lm9uRHJhZ01vdmUoZSwgdGhpcy5kcmFnT2JqZWN0cyk7CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCWZpbmRCZXN0VGFyZ2V0OiBmdW5jdGlvbihlKSB7CisJCXZhciBfdGhpcyA9IHRoaXM7CisJCXZhciBiZXN0Qm94ID0gbmV3IE9iamVjdCgpOworCQliZXN0Qm94LnRhcmdldCA9IG51bGw7CisJCWJlc3RCb3gucG9pbnRzID0gbnVsbDsKKwkJZG9qby5sYW5nLmV2ZXJ5KHRoaXMuZHJvcFRhcmdldERpbWVuc2lvbnMsIGZ1bmN0aW9uKHRtcERBKSB7CisJCQlpZighX3RoaXMuaXNJbnNpZGVCb3goZSwgdG1wREEpKXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJYmVzdEJveC50YXJnZXQgPSB0bXBEQVsyXTsKKwkJCWJlc3RCb3gucG9pbnRzID0gdG1wREE7CisJCQkvLyBjb250aW51ZSBpdGVyYXRpbmcgb25seSBpZiBfdGhpcy5uZXN0ZWRUYXJnZXRzID09IHRydWUKKwkJCXJldHVybiBCb29sZWFuKF90aGlzLm5lc3RlZFRhcmdldHMpOworCQl9KTsKKworCQlyZXR1cm4gYmVzdEJveDsKKwl9LAorCisJaXNJbnNpZGVCb3g6IGZ1bmN0aW9uKGUsIGNvb3Jkcyl7CisJCWlmKAkoZS5wYWdlWCA+IGNvb3Jkc1swXVswXSkmJgorCQkJKGUucGFnZVggPCBjb29yZHNbMV1bMF0pJiYKKwkJCShlLnBhZ2VZID4gY29vcmRzWzBdWzFdKSYmCisJCQkoZS5wYWdlWSA8IGNvb3Jkc1sxXVsxXSkgKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGUpeworCX0sCisKKwlvbk1vdXNlT3V0OiBmdW5jdGlvbihlKXsKKwl9Cit9KTsKKworZG9qby5kbmQuZHJhZ01hbmFnZXIgPSBuZXcgZG9qby5kbmQuSHRtbERyYWdNYW5hZ2VyKCk7CisKKy8vIGdsb2JhbCBuYW1lc3BhY2UgcHJvdGVjdGlvbiBjbG9zdXJlCisoZnVuY3Rpb24oKXsKKwl2YXIgZCA9IGRvY3VtZW50OworCXZhciBkbSA9IGRvam8uZG5kLmRyYWdNYW5hZ2VyOworCS8vVE9ETzogd2hlbiBmb2N1cyBtYW5hZ2VyIGlzIHJlYWR5LCBkcmFnTWFuYWdlciBzaG91bGQgYmUgcmV3cml0dGVuIHRvIHVzZSBpdAorCS8vIHNldCB1cCBldmVudCBoYW5kbGVycyBvbiB0aGUgZG9jdW1lbnQgKG9yIG5vPykKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ua2V5ZG93biIsIGRtLCAib25LZXlEb3duIik7CisJZG9qby5ldmVudC5jb25uZWN0KGQsICJvbm1vdXNlb3ZlciIsIGRtLCAib25Nb3VzZU92ZXIiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ubW91c2VvdXQiLCBkbSwgIm9uTW91c2VPdXQiKTsKKwlkb2pvLmV2ZW50LmNvbm5lY3QoZCwgIm9ubW91c2Vkb3duIiwgZG0sICJvbk1vdXNlRG93biIpOworCWRvam8uZXZlbnQuY29ubmVjdChkLCAib25tb3VzZXVwIiwgZG0sICJvbk1vdXNlVXAiKTsKKwkvLyBUT0RPOiBwcm9jZXNzIHNjcm9sbGluZyBvZiBlbGVtZW50cywgbm90IG9ubHkgd2luZG93IChmb2N1cyBtYW5hZ2VyIHdvdWxkIAorCS8vIHByb2JhYmx5IGNvbWUgdG8gcmVzY3VlIGhlcmUgYXMgd2VsbCkKKwlkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib25zY3JvbGwiLCBkbSwgIm9uU2Nyb2xsIik7Cit9KSgpOworCitkb2pvLnByb3ZpZGUoImRvam8uZG5kLkh0bWxEcmFnQW5kRHJvcCIpOworCisKKworCisKKworCisKKworCisKKworCitkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcmFnU291cmNlIiwgZG9qby5kbmQuRHJhZ1NvdXJjZSwgeworCQlkcmFnQ2xhc3M6ICIiLCAvLyBDU1MgY2xhc3NuYW1lKHMpIGFwcGxpZWQgdG8gbm9kZSB3aGVuIGl0IGlzIGJlaW5nIGRyYWdnZWQKKworCQlvbkRyYWdTdGFydDogZnVuY3Rpb24oKXsKKwkJCXZhciBkcmFnT2JqID0gbmV3IGRvam8uZG5kLkh0bWxEcmFnT2JqZWN0KHRoaXMuZHJhZ09iamVjdCwgdGhpcy50eXBlKTsKKwkJCWlmKHRoaXMuZHJhZ0NsYXNzKXsKKwkJCQlkcmFnT2JqLmRyYWdDbGFzcyA9IHRoaXMuZHJhZ0NsYXNzOworCQkJfQorCisJCQlpZih0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKXsKKwkJCQlkcmFnT2JqLmNvbnN0cmFpblRvKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyIHx8IHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlKTsKKwkJCX0KKworCQkJcmV0dXJuIGRyYWdPYmo7CisJCX0sCisKKwkJc2V0RHJhZ0hhbmRsZTogZnVuY3Rpb24obm9kZSl7CisJCQlub2RlID0gZG9qby5ieUlkKG5vZGUpOworCQkJZG9qby5kbmQuZHJhZ01hbmFnZXIudW5yZWdpc3RlckRyYWdTb3VyY2UodGhpcyk7CisJCQl0aGlzLmRvbU5vZGUgPSBub2RlOworCQkJZG9qby5kbmQuZHJhZ01hbmFnZXIucmVnaXN0ZXJEcmFnU291cmNlKHRoaXMpOworCQl9LAorCisJCXNldERyYWdUYXJnZXQ6IGZ1bmN0aW9uKG5vZGUpeworCQkJdGhpcy5kcmFnT2JqZWN0ID0gbm9kZTsKKwkJfSwKKworCQljb25zdHJhaW5UbzogZnVuY3Rpb24oY29udGFpbmVyKXsKKwkJCXRoaXMuY29uc3RyYWluVG9Db250YWluZXIgPSB0cnVlOworCQkJaWYoY29udGFpbmVyKXsKKwkJCQl0aGlzLmNvbnN0cmFpbmluZ0NvbnRhaW5lciA9IGNvbnRhaW5lcjsKKwkJCX0KKwkJfSwKKwkJCisJCS8qCisJCSoKKwkJKiBzZWUgZG9qby5kbmQuRHJhZ1NvdXJjZS5vblNlbGVjdGVkCisJCSovCisJCW9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7CisJCQlmb3IodmFyIGk9MDsgaTx0aGlzLmRyYWdPYmplY3RzLmxlbmd0aDsgaSsrKXsKKwkJCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5zZWxlY3RlZFNvdXJjZXMucHVzaChuZXcgZG9qby5kbmQuSHRtbERyYWdTb3VyY2UodGhpcy5kcmFnT2JqZWN0c1tpXSkpOworCQkJfQorCQl9LAorCisJCS8qKgorCQkqIFJlZ2lzdGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGRyYWdnZWQgYWxvbmcgd2l0aAorCQkqIHRoZSBhY3R1YWwgRHJhZ1NvdXJjZS4KKwkJKgorCQkqIEV4YW1wbGUgdXNhZ2U6CisJCSogCXZhciBkcmFnU291cmNlID0gbmV3IGRvam8uZG5kLkh0bWxEcmFnU291cmNlKC4uLik7CisJCSoJLy8gYWRkIGEgc2luZ2xlIGVsZW1lbnQKKwkJKglkcmFnU291cmNlLmFkZERyYWdPYmplY3RzKGRvam8uYnlJZCgnaWQxJykpOworCQkqCS8vIGFkZCBtdWx0aXBsZSBlbGVtZW50cyB0byBkcmFnIGFsb25nCisJCSoJZHJhZ1NvdXJjZS5hZGREcmFnT2JqZWN0cygnaWQyJywgZG9qby5ieUlkKCdpZDMnKSk7CisJCSoKKwkJKiBlbCBBIGRvbSBub2RlIHRvIGFkZCB0byB0aGUgZHJhZyBsaXN0LgorCQkqLworCQlhZGREcmFnT2JqZWN0czogZnVuY3Rpb24oLypET01Ob2RlKi8gZWwpeworCQkJZm9yKHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKXsKKwkJCQl0aGlzLmRyYWdPYmplY3RzLnB1c2goZG9qby5ieUlkKGFyZ3VtZW50c1tpXSkpOworCQkJfQorCQl9CisJfSwgCisKKwlmdW5jdGlvbihub2RlLCB0eXBlKXsKKwkJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwkJdGhpcy5kcmFnT2JqZWN0cyA9IFtdOworCQl0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyID0gZmFsc2U7CisJCWlmKG5vZGUpeworCQkJdGhpcy5kb21Ob2RlID0gbm9kZTsKKwkJCXRoaXMuZHJhZ09iamVjdCA9IG5vZGU7CisJCQkvLyBzZXQgcHJvcGVydGllcyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBjbG9iYmVyZWQgYnkgdGhlIG1peGluCisJCQl0aGlzLnR5cGUgPSAodHlwZSl8fCh0aGlzLmRvbU5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7CisJCQlkb2pvLmRuZC5EcmFnU291cmNlLnByb3RvdHlwZS5yZXJlZ2lzdGVyLmNhbGwodGhpcyk7CisJCX0KKwl9CispOworCitkb2pvLmRlY2xhcmUoImRvam8uZG5kLkh0bWxEcmFnT2JqZWN0IiwgCisJZG9qby5kbmQuRHJhZ09iamVjdCwgCisJeworCQlkcmFnQ2xhc3M6ICIiLAorCQlvcGFjaXR5OiAwLjUsCisJCWNyZWF0ZUlmcmFtZTogdHJ1ZSwJCS8vIHdvcmthcm91bmQgSUU2IGJ1ZworCisJCS8vIGlmIHRydWUsIG5vZGUgd2lsbCBub3QgbW92ZSBpbiBYIGFuZC9vciBZIGRpcmVjdGlvbgorCQlkaXNhYmxlWDogZmFsc2UsCisJCWRpc2FibGVZOiBmYWxzZSwKKworCQljcmVhdGVEcmFnTm9kZTogZnVuY3Rpb24oKSB7CisJCQl2YXIgbm9kZSA9IHRoaXMuZG9tTm9kZS5jbG9uZU5vZGUodHJ1ZSk7CisJCQlpZih0aGlzLmRyYWdDbGFzcykgeyBkb2pvLmh0bWwuYWRkQ2xhc3Mobm9kZSwgdGhpcy5kcmFnQ2xhc3MpOyB9CisJCQlpZih0aGlzLm9wYWNpdHkgPCAxKSB7IGRvam8uaHRtbC5zZXRPcGFjaXR5KG5vZGUsIHRoaXMub3BhY2l0eSk7IH0KKwkJCXZhciBsdG4gPSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKwkJCXZhciBpc1RyID0gKGx0biA9PSAidHIiKTsKKwkJCWlmKChpc1RyKXx8KGx0biA9PSAidGJvZHkiKSl7CisJCQkJLy8gZG9qby5kZWJ1ZygiRHJhZ2dpbmcgdGFibGUgcm93IikKKwkJCQkvLyBDcmVhdGUgYSB0YWJsZSBmb3IgdGhlIGNsb25lZCByb3cKKwkJCQl2YXIgZG9jID0gdGhpcy5kb21Ob2RlLm93bmVyRG9jdW1lbnQ7CisJCQkJdmFyIHRhYmxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CisJCQkJaWYoaXNUcil7CisJCQkJCXZhciB0Ym9keSA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOworCQkJCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7CisJCQkJCXRib2R5LmFwcGVuZENoaWxkKG5vZGUpOworCQkJCX1lbHNleworCQkJCQl0YWJsZS5hcHBlbmRDaGlsZChub2RlKTsKKwkJCQl9CisKKwkJCQkvLyBTZXQgYSBmaXhlZCB3aWR0aCB0byB0aGUgY2xvbmVkIFREcworCQkJCXZhciB0bXBTcmNUciA9ICgoaXNUcikgPyB0aGlzLmRvbU5vZGUgOiB0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7CisJCQkJdmFyIHRtcERzdFRyID0gKChpc1RyKSA/IG5vZGUgOiBub2RlLmZpcnN0Q2hpbGQpOworCQkJCXZhciBkb21UZHMgPSB0bXBTcmNUci5jaGlsZE5vZGVzOworCQkJCXZhciBjbG9uZVRkcyA9IHRtcERzdFRyLmNoaWxkTm9kZXM7CisJCQkJZm9yKHZhciBpID0gMDsgaSA8IGRvbVRkcy5sZW5ndGg7IGkrKyl7CisJCQkJCWlmKChjbG9uZVRkc1tpXSkmJihjbG9uZVRkc1tpXS5zdHlsZSkpeworCQkJCQkJY2xvbmVUZHNbaV0uc3R5bGUud2lkdGggPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveChkb21UZHNbaV0pLndpZHRoICsgInB4IjsKKwkJCQkJfQorCQkJCX0KKwkJCQlub2RlID0gdGFibGU7CisJCQl9CisKKwkJCWlmKChkb2pvLnJlbmRlci5odG1sLmllNTV8fGRvam8ucmVuZGVyLmh0bWwuaWU2MCkgJiYgdGhpcy5jcmVhdGVJZnJhbWUpeworCQkJCXdpdGgobm9kZS5zdHlsZSkgeworCQkJCQl0b3A9IjBweCI7CisJCQkJCWxlZnQ9IjBweCI7CisJCQkJfQorCQkJCXZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCW91dGVyLmFwcGVuZENoaWxkKG5vZGUpOworCQkJCXRoaXMuYmdJZnJhbWUgPSBuZXcgZG9qby5odG1sLkJhY2tncm91bmRJZnJhbWUob3V0ZXIpOworCQkJCW91dGVyLmFwcGVuZENoaWxkKHRoaXMuYmdJZnJhbWUuaWZyYW1lKTsKKwkJCQlub2RlID0gb3V0ZXI7CisJCQl9CisJCQlub2RlLnN0eWxlLnpJbmRleCA9IDk5OTsKKworCQkJcmV0dXJuIG5vZGU7CisJCX0sCisKKwkJb25EcmFnU3RhcnQ6IGZ1bmN0aW9uKGUpeworCQkJZG9qby5odG1sLmNsZWFyU2VsZWN0aW9uKCk7CisKKwkJCXRoaXMuc2Nyb2xsT2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwkJCXRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRvbU5vZGUsIHRydWUpOworCisJCQl0aGlzLmRyYWdPZmZzZXQgPSB7eTogdGhpcy5kcmFnU3RhcnRQb3NpdGlvbi55IC0gZS5wYWdlWSwKKwkJCQl4OiB0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnggLSBlLnBhZ2VYfTsKKworCQkJdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmNyZWF0ZURyYWdOb2RlKCk7CisKKwkJCXRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24gPSB0aGlzLmRvbU5vZGUub2Zmc2V0UGFyZW50ID8gCisJCQkJZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLm9mZnNldFBhcmVudCwgdHJ1ZSkgOiB7eDowLCB5OjB9OworCisJCQlpZih0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKXsKKwkJCQl0aGlzLmNvbnN0cmFpbnRzID0gdGhpcy5nZXRDb25zdHJhaW50cygpOworCQkJfQorCisJCQkvLyBzZXQgdXAgZm9yIGRyYWdnaW5nCisJCQl3aXRoKHRoaXMuZHJhZ0Nsb25lLnN0eWxlKXsKKwkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJdG9wID0gdGhpcy5kcmFnT2Zmc2V0LnkgKyBlLnBhZ2VZICsgInB4IjsKKwkJCQlsZWZ0ID0gdGhpcy5kcmFnT2Zmc2V0LnggKyBlLnBhZ2VYICsgInB4IjsKKwkJCX0KKworCQkJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpOworCisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goJ2RyYWdTdGFydCcsIHsgc291cmNlOiB0aGlzIH0gKTsKKwkJfSwKKworCQkvKiogUmV0dXJuIG1pbi9tYXggeC95IChyZWxhdGl2ZSB0byBkb2N1bWVudC5ib2R5KSBmb3IgdGhpcyBvYmplY3QpICoqLworCQlnZXRDb25zdHJhaW50czogZnVuY3Rpb24oKXsKKwkJCWlmKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2JvZHknKXsKKwkJCQl2YXIgdmlld3BvcnQgPSBkb2pvLmh0bWwuZ2V0Vmlld3BvcnQoKTsKKwkJCQl2YXIgd2lkdGggPSB2aWV3cG9ydC53aWR0aDsKKwkJCQl2YXIgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0OworCQkJCXZhciBzY3JvbGwgPSBkb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OworCQkJCXZhciB4ID0gc2Nyb2xsLng7CisJCQkJdmFyIHkgPSBzY3JvbGwueTsKKwkJCX1lbHNleworCQkJCXZhciBjb250ZW50ID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIpOworCQkJCXdpZHRoID0gY29udGVudC53aWR0aDsKKwkJCQloZWlnaHQgPSBjb250ZW50LmhlaWdodDsKKwkJCQl4ID0KKwkJCQkJdGhpcy5jb250YWluaW5nQmxvY2tQb3NpdGlvbi54ICsKKwkJCQkJZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIsICJwYWRkaW5nLWxlZnQiLCB0cnVlKSArCisJCQkJCWRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIsICJsZWZ0Iik7CisJCQkJeSA9CisJCQkJCXRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24ueSArCisJCQkJCWRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyLCAicGFkZGluZy10b3AiLCB0cnVlKSArCisJCQkJCWRvam8uaHRtbC5nZXRCb3JkZXJFeHRlbnQodGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIsICJ0b3AiKTsKKwkJCX0KKworCQkJLy8gVE9ETzogc2hvdWxkIGhhbmRsZSBsZWZ0L3RvcC9yaWdodC9ib3R0b20gbWFyZ2luIHNlcGFyYXRlbHk7IGxlZnQvdG9wIHNob3VsZCBhZmZlY3QgbWluWC9taW5ZCisJCQl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJCQlyZXR1cm4geworCQkJCW1pblg6IHgsCisJCQkJbWluWTogeSwKKwkJCQltYXhYOiB4ICsgd2lkdGggLSBtYi53aWR0aCwKKwkJCQltYXhZOiB5ICsgaGVpZ2h0IC0gbWIuaGVpZ2h0CisJCQl9CisJCX0sCisKKwkJdXBkYXRlRHJhZ09mZnNldDogZnVuY3Rpb24oKXsKKwkJCXZhciBzY3JvbGwgPSBkb2pvLmh0bWwuZ2V0U2Nyb2xsKCkub2Zmc2V0OworCQkJaWYoc2Nyb2xsLnkgIT0gdGhpcy5zY3JvbGxPZmZzZXQueSl7CisJCQkJdmFyIGRpZmYgPSBzY3JvbGwueSAtIHRoaXMuc2Nyb2xsT2Zmc2V0Lnk7CisJCQkJdGhpcy5kcmFnT2Zmc2V0LnkgKz0gZGlmZjsKKwkJCQl0aGlzLnNjcm9sbE9mZnNldC55ID0gc2Nyb2xsLnk7CisJCQl9CisJCQlpZihzY3JvbGwueCAhPSB0aGlzLnNjcm9sbE9mZnNldC54KXsKKwkJCQl2YXIgZGlmZiA9IHNjcm9sbC54IC0gdGhpcy5zY3JvbGxPZmZzZXQueDsKKwkJCQl0aGlzLmRyYWdPZmZzZXQueCArPSBkaWZmOworCQkJCXRoaXMuc2Nyb2xsT2Zmc2V0LnggPSBzY3JvbGwueDsKKwkJCX0KKwkJfSwKKworCQkvKiogTW92ZXMgdGhlIG5vZGUgdG8gZm9sbG93IHRoZSBtb3VzZSAqLworCQlvbkRyYWdNb3ZlOiBmdW5jdGlvbihlKXsKKwkJCXRoaXMudXBkYXRlRHJhZ09mZnNldCgpOworCQkJdmFyIHggPSB0aGlzLmRyYWdPZmZzZXQueCArIGUucGFnZVg7CisJCQl2YXIgeSA9IHRoaXMuZHJhZ09mZnNldC55ICsgZS5wYWdlWTsKKworCQkJaWYgKHRoaXMuY29uc3RyYWluVG9Db250YWluZXIpIHsKKwkJCQlpZiAoeCA8IHRoaXMuY29uc3RyYWludHMubWluWCkgeyB4ID0gdGhpcy5jb25zdHJhaW50cy5taW5YOyB9CisJCQkJaWYgKHkgPCB0aGlzLmNvbnN0cmFpbnRzLm1pblkpIHsgeSA9IHRoaXMuY29uc3RyYWludHMubWluWTsgfQorCQkJCWlmICh4ID4gdGhpcy5jb25zdHJhaW50cy5tYXhYKSB7IHggPSB0aGlzLmNvbnN0cmFpbnRzLm1heFg7IH0KKwkJCQlpZiAoeSA+IHRoaXMuY29uc3RyYWludHMubWF4WSkgeyB5ID0gdGhpcy5jb25zdHJhaW50cy5tYXhZOyB9CisJCQl9CisKKwkJCXRoaXMuc2V0QWJzb2x1dGVQb3NpdGlvbih4LCB5KTsKKworCQkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCdkcmFnTW92ZScsIHsgc291cmNlOiB0aGlzIH0gKTsKKwkJfSwKKworCQkvKioKKwkJICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhZyBjbG9uZS4gICh4LHkpIGlzIHJlbGF0aXZlIHRvIDxib2R5Pi4KKwkJICovCisJCXNldEFic29sdXRlUG9zaXRpb246IGZ1bmN0aW9uKHgsIHkpeworCQkJLy8gVGhlIGRyYWcgY2xvbmUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQuYm9keSBzbyB0aGlzIGlzIHRyaXZpYWwKKwkJCWlmKCF0aGlzLmRpc2FibGVZKSB7IHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IHkgKyAicHgiOyB9CisJCQlpZighdGhpcy5kaXNhYmxlWCkgeyB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0geCArICJweCI7IH0KKwkJfSwKKworCisJCS8qKgorCQkgKiBJZiB0aGUgZHJhZyBvcGVyYXRpb24gcmV0dXJuZWQgYSBzdWNjZXNzIHdlIHJlbW92ZSB0aGUgY2xvbmUgb2YKKwkJICogb3Vyc2VsZiBmcm9tIHRoZSBvcmlnaW5hbCBwb3NpdGlvbi4gSWYgdGhlIGRyYWcgb3BlcmF0aW9uIHJldHVybmVkCisJCSAqIGZhaWx1cmUgd2Ugc2xpZGUgYmFjayBvdmVyIHRvIHdoZXJlIHdlIGNhbWUgZnJvbSBhbmQgZW5kIHRoZSBvcGVyYXRpb24KKwkJICogd2l0aCBhIGxpdHRsZSBncmFjZS4KKwkJICovCisJCW9uRHJhZ0VuZDogZnVuY3Rpb24oZSl7CisJCQlzd2l0Y2goZS5kcmFnU3RhdHVzKXsKKworCQkJCWNhc2UgImRyb3BTdWNjZXNzIjoKKwkJCQkJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy5kcmFnQ2xvbmUpOworCQkJCQl0aGlzLmRyYWdDbG9uZSA9IG51bGw7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAiZHJvcEZhaWx1cmUiOiAvLyBzbGlkZSBiYWNrIHRvIHRoZSBzdGFydAorCQkJCQl2YXIgc3RhcnRDb29yZHMgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRyYWdDbG9uZSwgdHJ1ZSk7CisJCQkJCS8vIG9mZnNldCB0aGUgZW5kIHNvIHRoZSBlZmZlY3QgY2FuIGJlIHNlZW4KKwkJCQkJdmFyIGVuZENvb3JkcyA9IHsgbGVmdDogdGhpcy5kcmFnU3RhcnRQb3NpdGlvbi54ICsgMSwKKwkJCQkJCXRvcDogdGhpcy5kcmFnU3RhcnRQb3NpdGlvbi55ICsgMX07CisKKwkJCQkJLy8gYW5pbWF0ZQorCQkJCQl2YXIgYW5pbSA9IGRvam8ubGZ4LnNsaWRlVG8odGhpcy5kcmFnQ2xvbmUsIGVuZENvb3JkcywgMzAwKTsKKwkJCQkJdmFyIGRyYWdPYmplY3QgPSB0aGlzOworCQkJCQlkb2pvLmV2ZW50LmNvbm5lY3QoYW5pbSwgIm9uRW5kIiwgZnVuY3Rpb24oZSl7CisJCQkJCQkvLyBwYXVzZSBmb3IgYSBzZWNvbmQgKG5vdCBsaXRlcmFsbHkpIGFuZCBkaXNhcHBlYXIKKwkJCQkJCS8vIGRvam8ubGFuZy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJCQkJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZShkcmFnT2JqZWN0LmRyYWdDbG9uZSk7CisJCQkJCQkJCS8vIEFsbG93IGRyYWcgY2xvbmUgdG8gYmUgZ2MnZWQKKwkJCQkJCQkJZHJhZ09iamVjdC5kcmFnQ2xvbmUgPSBudWxsOworCQkJCQkJLy8gCX0sCisJCQkJCQkvLyAJNTApOworCQkJCQl9KTsKKwkJCQkJYW5pbS5wbGF5KCk7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goJ2RyYWdFbmQnLCB7IHNvdXJjZTogdGhpcyB9ICk7CisJCX0sCisKKwkJY29uc3RyYWluVG86IGZ1bmN0aW9uKGNvbnRhaW5lcil7CisJCQl0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyPXRydWU7CisJCQlpZihjb250YWluZXIpeworCQkJCXRoaXMuY29uc3RyYWluaW5nQ29udGFpbmVyID0gY29udGFpbmVyOworCQkJfWVsc2V7CisJCQkJdGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIgPSB0aGlzLmRvbU5vZGUucGFyZW50Tm9kZTsKKwkJCX0KKwkJfQorCX0sIAorCWZ1bmN0aW9uKG5vZGUsIHR5cGUpeworCQl0aGlzLmRvbU5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuY29uc3RyYWluVG9Db250YWluZXIgPSBmYWxzZTsKKwkJdGhpcy5kcmFnU291cmNlID0gbnVsbDsKKwkJLy8gdGhpcy5yZWdpc3RlcigpOworCQlkb2pvLmRuZC5EcmFnT2JqZWN0LnByb3RvdHlwZS5yZWdpc3Rlci5jYWxsKHRoaXMpOworCX0KKyk7CisKK2Rvam8uZGVjbGFyZSgiZG9qby5kbmQuSHRtbERyb3BUYXJnZXQiLCAKKwlkb2pvLmRuZC5Ecm9wVGFyZ2V0LCAKKwl7CisJCXZlcnRpY2FsOiBmYWxzZSwKKwkJb25EcmFnT3ZlcjogZnVuY3Rpb24oZSl7CisJCQlpZighdGhpcy5hY2NlcHRzKGUuZHJhZ09iamVjdHMpKXsgcmV0dXJuIGZhbHNlOyB9CisKKwkJCS8vIGNhY2hlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIGNoaWxkIG5vZGVzCisJCQl0aGlzLmNoaWxkQm94ZXMgPSBbXTsKKwkJCWZvcih2YXIgaSA9IDAsIGNoaWxkOyBpIDwgdGhpcy5kb21Ob2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspeworCQkJCWNoaWxkID0gdGhpcy5kb21Ob2RlLmNoaWxkTm9kZXNbaV07CisJCQkJaWYoY2hpbGQubm9kZVR5cGUgIT0gZG9qby5odG1sLkVMRU1FTlRfTk9ERSl7IGNvbnRpbnVlOyB9CisJCQkJdmFyIHBvcyA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKGNoaWxkLCB0cnVlKTsKKwkJCQl2YXIgaW5uZXIgPSBkb2pvLmh0bWwuZ2V0Qm9yZGVyQm94KGNoaWxkKTsKKwkJCQl0aGlzLmNoaWxkQm94ZXMucHVzaCh7dG9wOiBwb3MueSwgYm90dG9tOiBwb3MueStpbm5lci5oZWlnaHQsCisJCQkJCWxlZnQ6IHBvcy54LCByaWdodDogcG9zLngraW5uZXIud2lkdGgsIGhlaWdodDogaW5uZXIuaGVpZ2h0LCAKKwkJCQkJd2lkdGg6IGlubmVyLndpZHRoLCBub2RlOiBjaGlsZH0pOworCQkJfQorCisJCQkvLyBUT0RPOiB1c2UgZHVtbXkgbm9kZQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSwKKworCQlfZ2V0Tm9kZVVuZGVyTW91c2U6IGZ1bmN0aW9uKGUpeworCQkJLy8gZmluZCB0aGUgY2hpbGQKKwkJCWZvcih2YXIgaSA9IDAsIGNoaWxkOyBpIDwgdGhpcy5jaGlsZEJveGVzLmxlbmd0aDsgaSsrKXsKKwkJCQl3aXRoKHRoaXMuY2hpbGRCb3hlc1tpXSl7CisJCQkJCWlmIChlLnBhZ2VYID49IGxlZnQgJiYgZS5wYWdlWCA8PSByaWdodCAmJgorCQkJCQkJZS5wYWdlWSA+PSB0b3AgJiYgZS5wYWdlWSA8PSBib3R0b20peyByZXR1cm4gaTsgfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIC0xOworCQl9LAorCisJCWNyZWF0ZURyb3BJbmRpY2F0b3I6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLmRyb3BJbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCXdpdGgodGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlKXsKKwkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJekluZGV4ID0gOTk5OworCQkJCWlmKHRoaXMudmVydGljYWwpeworCQkJCQlib3JkZXJMZWZ0V2lkdGggPSAiMXB4IjsKKwkJCQkJYm9yZGVyTGVmdENvbG9yID0gImJsYWNrIjsKKwkJCQkJYm9yZGVyTGVmdFN0eWxlID0gInNvbGlkIjsKKwkJCQkJaGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmRvbU5vZGUpLmhlaWdodCArICJweCI7CisJCQkJCXRvcCA9IGRvam8uaHRtbC5nZXRBYnNvbHV0ZVBvc2l0aW9uKHRoaXMuZG9tTm9kZSwgdHJ1ZSkueSArICJweCI7CisJCQkJfWVsc2V7CisJCQkJCWJvcmRlclRvcFdpZHRoID0gIjFweCI7CisJCQkJCWJvcmRlclRvcENvbG9yID0gImJsYWNrIjsKKwkJCQkJYm9yZGVyVG9wU3R5bGUgPSAic29saWQiOworCQkJCQl3aWR0aCA9IGRvam8uaHRtbC5nZXRCb3JkZXJCb3godGhpcy5kb21Ob2RlKS53aWR0aCArICJweCI7CisJCQkJCWxlZnQgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbih0aGlzLmRvbU5vZGUsIHRydWUpLnggKyAicHgiOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQlvbkRyYWdNb3ZlOiBmdW5jdGlvbihlLCBkcmFnT2JqZWN0cyl7CisJCQl2YXIgaSA9IHRoaXMuX2dldE5vZGVVbmRlck1vdXNlKGUpOworCisJCQlpZighdGhpcy5kcm9wSW5kaWNhdG9yKXsKKwkJCQl0aGlzLmNyZWF0ZURyb3BJbmRpY2F0b3IoKTsKKwkJCX0KKworCQkJdmFyIGdyYXZpdHkgPSB0aGlzLnZlcnRpY2FsID8gZG9qby5odG1sLmdyYXZpdHkuV0VTVCA6IGRvam8uaHRtbC5ncmF2aXR5Lk5PUlRIOworCQkJdmFyIGhpZGUgPSBmYWxzZTsKKwkJCWlmKGkgPCAwKXsKKwkJCQlpZih0aGlzLmNoaWxkQm94ZXMubGVuZ3RoKXsKKwkJCQkJdmFyIGJlZm9yZSA9IChkb2pvLmh0bWwuZ3Jhdml0eSh0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwgZSkgJiBncmF2aXR5KTsKKwkJCQkJaWYoYmVmb3JlKXsgaGlkZSA9IHRydWU7IH0KKwkJCQl9ZWxzZXsKKwkJCQkJdmFyIGJlZm9yZSA9IHRydWU7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZEJveGVzW2ldOworCQkJCXZhciBiZWZvcmUgPSAoZG9qby5odG1sLmdyYXZpdHkoY2hpbGQubm9kZSwgZSkgJiBncmF2aXR5KTsKKwkJCQlpZihjaGlsZC5ub2RlID09PSBkcmFnT2JqZWN0c1swXS5kcmFnU291cmNlLmRvbU5vZGUpeworCQkJCQloaWRlID0gdHJ1ZTsKKwkJCQl9ZWxzZXsKKwkJCQkJdmFyIGN1cnJlbnRQb3NDaGlsZCA9IGJlZm9yZSA/IAorCQkJCQkJCShpPjA/dGhpcy5jaGlsZEJveGVzW2ktMV06Y2hpbGQpIDogCisJCQkJCQkJKGk8dGhpcy5jaGlsZEJveGVzLmxlbmd0aC0xP3RoaXMuY2hpbGRCb3hlc1tpKzFdOmNoaWxkKTsKKwkJCQkJaWYoY3VycmVudFBvc0NoaWxkLm5vZGUgPT09IGRyYWdPYmplY3RzWzBdLmRyYWdTb3VyY2UuZG9tTm9kZSl7CisJCQkJCQloaWRlID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoaGlkZSl7CisJCQkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCXRoaXMuZHJvcEluZGljYXRvci5zdHlsZS5kaXNwbGF5PSIiOworCQkJfQorCisJCQl0aGlzLnBsYWNlSW5kaWNhdG9yKGUsIGRyYWdPYmplY3RzLCBpLCBiZWZvcmUpOworCisJCQlpZighZG9qby5odG1sLmhhc1BhcmVudCh0aGlzLmRyb3BJbmRpY2F0b3IpKSB7CisJCQkJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kcm9wSW5kaWNhdG9yKTsKKwkJCX0KKwkJfSwKKworCQkvKioKKwkJICogUG9zaXRpb24gdGhlIGhvcml6b250YWwgbGluZSB0aGF0IGluZGljYXRlcyAiaW5zZXJ0IGJldHdlZW4gdGhlc2UgdHdvIGl0ZW1zIgorCQkgKi8KKwkJcGxhY2VJbmRpY2F0b3I6IGZ1bmN0aW9uKGUsIGRyYWdPYmplY3RzLCBib3hJbmRleCwgYmVmb3JlKSB7CisJCQl2YXIgdGFyZ2V0UHJvcGVydHkgPSB0aGlzLnZlcnRpY2FsID8gImxlZnQiIDogInRvcCI7CisJCQl2YXIgY2hpbGQ7CisJCQlpZihib3hJbmRleCA8IDApeworCQkJCWlmKHRoaXMuY2hpbGRCb3hlcy5sZW5ndGgpeworCQkJCQljaGlsZCA9IGJlZm9yZSA/IHRoaXMuY2hpbGRCb3hlc1swXQorCQkJCQkJOiB0aGlzLmNoaWxkQm94ZXNbdGhpcy5jaGlsZEJveGVzLmxlbmd0aCAtIDFdOworCQkJCX1lbHNleworCQkJCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGVbdGFyZ2V0UHJvcGVydHldID0gZG9qby5odG1sLmdldEFic29sdXRlUG9zaXRpb24odGhpcy5kb21Ob2RlLCB0cnVlKVt0aGlzLnZlcnRpY2FsPyJ4IjoieSJdICsgInB4IjsKKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQljaGlsZCA9IHRoaXMuY2hpbGRCb3hlc1tib3hJbmRleF07CisJCQl9CisJCQlpZihjaGlsZCl7CisJCQkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlW3RhcmdldFByb3BlcnR5XSA9IChiZWZvcmUgPyBjaGlsZFt0YXJnZXRQcm9wZXJ0eV0gOiBjaGlsZFt0aGlzLnZlcnRpY2FsPyJyaWdodCI6ImJvdHRvbSJdKSArICJweCI7CisJCQkJaWYodGhpcy52ZXJ0aWNhbCl7CisJCQkJCXRoaXMuZHJvcEluZGljYXRvci5zdHlsZS5oZWlnaHQgPSBjaGlsZC5oZWlnaHQgKyAicHgiOworCQkJCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUudG9wID0gY2hpbGQudG9wICsgInB4IjsKKwkJCQl9ZWxzZXsKKwkJCQkJdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLndpZHRoID0gY2hpbGQud2lkdGggKyAicHgiOworCQkJCQl0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUubGVmdCA9IGNoaWxkLmxlZnQgKyAicHgiOworCQkJCX0KKwkJCX0KKwkJfSwKKworCQlvbkRyYWdPdXQ6IGZ1bmN0aW9uKGUpIHsKKwkJCWlmKHRoaXMuZHJvcEluZGljYXRvcikgeworCQkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuZHJvcEluZGljYXRvcik7CisJCQkJZGVsZXRlIHRoaXMuZHJvcEluZGljYXRvcjsKKwkJCX0KKwkJfSwKKworCQkvKioKKwkJICogSW5zZXJ0cyB0aGUgRHJhZ09iamVjdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZSByZWxhdGl2ZSB0byB0aGUKKwkJICogcG9zaXRpb24gb2YgdGhlIG1vdXNlLgorCQkgKgorCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERyYWdPYmplY3Qgd2FzIGluc2VydGVkLCBmYWxzZSBvdGhlcndpc2UKKwkJICovCisJCW9uRHJvcDogZnVuY3Rpb24oZSl7CisJCQl0aGlzLm9uRHJhZ091dChlKTsKKworCQkJdmFyIGkgPSB0aGlzLl9nZXROb2RlVW5kZXJNb3VzZShlKTsKKworCQkJdmFyIGdyYXZpdHkgPSB0aGlzLnZlcnRpY2FsID8gZG9qby5odG1sLmdyYXZpdHkuV0VTVCA6IGRvam8uaHRtbC5ncmF2aXR5Lk5PUlRIOworCQkJaWYoaSA8IDApeworCQkJCWlmKHRoaXMuY2hpbGRCb3hlcy5sZW5ndGgpeworCQkJCQlpZihkb2pvLmh0bWwuZ3Jhdml0eSh0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwgZSkgJiBncmF2aXR5KXsKKwkJCQkJCXJldHVybiB0aGlzLmluc2VydChlLCB0aGlzLmNoaWxkQm94ZXNbMF0ubm9kZSwgImJlZm9yZSIpOworCQkJCQl9ZWxzZXsKKwkJCQkJCXJldHVybiB0aGlzLmluc2VydChlLCB0aGlzLmNoaWxkQm94ZXNbdGhpcy5jaGlsZEJveGVzLmxlbmd0aC0xXS5ub2RlLCAiYWZ0ZXIiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5pbnNlcnQoZSwgdGhpcy5kb21Ob2RlLCAiYXBwZW5kIik7CisJCQl9CisKKwkJCXZhciBjaGlsZCA9IHRoaXMuY2hpbGRCb3hlc1tpXTsKKwkJCWlmKGRvam8uaHRtbC5ncmF2aXR5KGNoaWxkLm5vZGUsIGUpICYgZ3Jhdml0eSl7CisJCQkJcmV0dXJuIHRoaXMuaW5zZXJ0KGUsIGNoaWxkLm5vZGUsICJiZWZvcmUiKTsKKwkJCX1lbHNleworCQkJCXJldHVybiB0aGlzLmluc2VydChlLCBjaGlsZC5ub2RlLCAiYWZ0ZXIiKTsKKwkJCX0KKwkJfSwKKworCQlpbnNlcnQ6IGZ1bmN0aW9uKGUsIHJlZk5vZGUsIHBvc2l0aW9uKXsKKwkJCXZhciBub2RlID0gZS5kcmFnT2JqZWN0LmRvbU5vZGU7CisKKwkJCWlmKHBvc2l0aW9uID09ICJiZWZvcmUiKXsKKwkJCQlyZXR1cm4gZG9qby5odG1sLmluc2VydEJlZm9yZShub2RlLCByZWZOb2RlKTsKKwkJCX1lbHNlIGlmKHBvc2l0aW9uID09ICJhZnRlciIpeworCQkJCXJldHVybiBkb2pvLmh0bWwuaW5zZXJ0QWZ0ZXIobm9kZSwgcmVmTm9kZSk7CisJCQl9ZWxzZSBpZihwb3NpdGlvbiA9PSAiYXBwZW5kIil7CisJCQkJcmVmTm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSwgCisKKwlmdW5jdGlvbihub2RlLCB0eXBlcyl7CisJCWlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMCl7IHJldHVybjsgfQorCQl0aGlzLmRvbU5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCWRvam8uZG5kLkRyb3BUYXJnZXQuY2FsbCh0aGlzKTsKKwkJaWYodHlwZXMgJiYgZG9qby5sYW5nLmlzU3RyaW5nKHR5cGVzKSkgeworCQkJdHlwZXMgPSBbdHlwZXNdOworCQl9CisJCXRoaXMuYWNjZXB0ZWRUeXBlcyA9IHR5cGVzIHx8IFtdOworCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5yZWdpc3RlckRyb3BUYXJnZXQodGhpcyk7CisJfQorKTsKKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbImRvam8uZG5kLkRyYWdBbmREcm9wIl0sCisJYnJvd3NlcjogWyJkb2pvLmRuZC5IdG1sRHJhZ0FuZERyb3AiXSwKKwlkYXNoYm9hcmQ6IFsiZG9qby5kbmQuSHRtbERyYWdBbmREcm9wIl0KK30pOworZG9qby5wcm92aWRlKCJkb2pvLmRuZC4qIik7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuSHRtbERyYWdNb3ZlIik7CisKKworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmVTb3VyY2UiLCBkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSwgeworCW9uRHJhZ1N0YXJ0OiBmdW5jdGlvbigpeworCQl2YXIgZHJhZ09iaiA9ICBuZXcgZG9qby5kbmQuSHRtbERyYWdNb3ZlT2JqZWN0KHRoaXMuZHJhZ09iamVjdCwgdGhpcy50eXBlKTsKKwkJaWYgKHRoaXMuY29uc3RyYWluVG9Db250YWluZXIpIHsKKwkJCWRyYWdPYmouY29uc3RyYWluVG8odGhpcy5jb25zdHJhaW5pbmdDb250YWluZXIpOworCQl9CisJCXJldHVybiBkcmFnT2JqOworCX0sCisJLyoKKwkgKiBzZWUgZG9qby5kbmQuSHRtbERyYWdTb3VyY2Uub25TZWxlY3RlZAorCSAqLworCW9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeworCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5kcmFnT2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJZG9qby5kbmQuZHJhZ01hbmFnZXIuc2VsZWN0ZWRTb3VyY2VzLnB1c2gobmV3IGRvam8uZG5kLkh0bWxEcmFnTW92ZVNvdXJjZSh0aGlzLmRyYWdPYmplY3RzW2ldKSk7CisJCX0KKwl9Cit9KTsKKworZG9qby5kZWNsYXJlKCJkb2pvLmRuZC5IdG1sRHJhZ01vdmVPYmplY3QiLCBkb2pvLmRuZC5IdG1sRHJhZ09iamVjdCwgeworCW9uRHJhZ1N0YXJ0OiBmdW5jdGlvbihlKXsKKwkJZG9qby5odG1sLmNsZWFyU2VsZWN0aW9uKCk7CisKKwkJdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRvbU5vZGU7CisKKwkJLy8gUmVjb3JkIGRyYWcgc3RhcnQgcG9zaXRpb24sIHdoZXJlICJwb3NpdGlvbiIgaXMgc2ltcGx5IHRoZSB0b3AvbGVmdCBzdHlsZSB2YWx1ZXMgZm9yCisJCS8vIHRoZSBub2RlICh0aGUgbWVhbmluZyBvZiB0b3AvbGVmdCBpcyBkZXBlbmRlbnQgb24gd2hldGhlciBub2RlIGlzIHBvc2l0aW9uOmFic29sdXRlIG9yCisJCS8vIHBvc2l0aW9uOnJlbGF0aXZlLCBhbmQgYWxzbyBvbiB0aGUgY29udGFpbmVyKS4KKwkJLy8gTm90IHN1cmUgaWYgd2Ugc2hvdWxkIHN1cHBvcnQgbW92aW5nIG5vZGVzIHRoYXQgYXJlbid0IHBvc2l0aW9uOmFic29sdXRlLAorCQkvLyBidXQgc3VwcG9ydGluZyBpdCBmb3Igbm93CisJCWlmKGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9tTm9kZSwgJ3Bvc2l0aW9uJykgIT0gJ2Fic29sdXRlJyl7CisJCQl0aGlzLmRvbU5vZGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOworCQl9CisJCXZhciBsZWZ0ID0gcGFyc2VJbnQoZG9qby5odG1sLmdldENvbXB1dGVkU3R5bGUodGhpcy5kb21Ob2RlLCAnbGVmdCcpKTsKKwkJdmFyIHRvcCA9IHBhcnNlSW50KGRvam8uaHRtbC5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9tTm9kZSwgJ3RvcCcpKTsKKwkJdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IHsKKwkJCXg6IGlzTmFOKGxlZnQpID8gMCA6IGxlZnQsCisJCQl5OiBpc05hTih0b3ApID8gMCA6IHRvcAorCQl9OworCisJCXRoaXMuc2Nyb2xsT2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKworCQkvLyB1c2VkIHRvIGNvbnZlcnQgbW91c2UgcG9zaXRpb24gaW50byB0b3AvbGVmdCB2YWx1ZSBmb3Igbm9kZQorCQl0aGlzLmRyYWdPZmZzZXQgPSB7eTogdGhpcy5kcmFnU3RhcnRQb3NpdGlvbi55IC0gZS5wYWdlWSwKKwkJCXg6IHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24ueCAtIGUucGFnZVh9OworCisJCS8vIHNpbmNlIHRoZSBEcmFnT2JqZWN0J3MgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2ssIGZvciBvdXIgcHVycG9zZXMKKwkJLy8gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBwb3NpdGlvbiBpcyBqdXN0ICgwLDApCisJCXRoaXMuY29udGFpbmluZ0Jsb2NrUG9zaXRpb24gPSB7eDowLCB5OjB9OworCisJCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCQl0aGlzLmNvbnN0cmFpbnRzID0gdGhpcy5nZXRDb25zdHJhaW50cygpOworCQl9CisKKwkJLy8gc2hvcnRseSB0aGUgYnJvd3NlciB3aWxsIGZpcmUgYW4gb25DbGljaygpIGV2ZW50LAorCQkvLyBidXQgc2luY2UgdGhpcyB3YXMgcmVhbGx5IGEgZHJhZywganVzdCBzcXVlbGNoIGl0CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbU5vZGUsICJvbmNsaWNrIiwgdGhpcywgIl9zcXVlbGNoT25DbGljayIpOworCX0sCisKKwlvbkRyYWdFbmQ6IGZ1bmN0aW9uKGUpeworCX0sCisKKwlzZXRBYnNvbHV0ZVBvc2l0aW9uOiBmdW5jdGlvbih4LCB5KXsKKwkJLy8gc3VtbWFyeTogU2V0IHRoZSB0b3AgJiBsZWZ0IHN0eWxlIGF0dHJpYnV0ZXMgb2YgdGhlIGRyYWcgbm9kZSAoVE9ETzogZnVuY3Rpb24gaXMgcG9vcmx5IG5hbWVkKQorCQlpZighdGhpcy5kaXNhYmxlWSkgeyB0aGlzLmRvbU5vZGUuc3R5bGUudG9wID0geSArICJweCI7IH0KKwkJaWYoIXRoaXMuZGlzYWJsZVgpIHsgdGhpcy5kb21Ob2RlLnN0eWxlLmxlZnQgPSB4ICsgInB4IjsgfQorCX0sCisKKwlfc3F1ZWxjaE9uQ2xpY2s6IGZ1bmN0aW9uKGUpeworCQkvLyBzdW1tYXJ5CisJCS8vCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNxdWVsY2ggdGhpcyBvbkNsaWNrKCkgZXZlbnQgYmVjYXVzZQorCQkvLwlpdCdzIHRoZSByZXN1bHQgb2YgYSBkcmFnIChpZSwgaXQncyBub3QgYSByZWFsIGNsaWNrKQorCisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCWRvam8uZXZlbnQuZGlzY29ubmVjdCh0aGlzLmRvbU5vZGUsICJvbmNsaWNrIiwgdGhpcywgIl9zcXVlbGNoT25DbGljayIpOworCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRpYWxvZyIpOworCisKKworCisKKworCisKKworZG9qby5kZWNsYXJlKAorCSJkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2UiLCAKKwludWxsLAorCXsKKwkJLy8gc3VtbWFyeQorCQkvLwlNaXhpbiBmb3Igd2lkZ2V0cyBpbXBsZW1lbnRpbmcgYSBtb2RhbCBkaWFsb2cKKworCQlpc0NvbnRhaW5lcjogdHJ1ZSwKKworCQkvLyBmb2N1c0VsZW1lbnQ6IFN0cmluZworCQkvLwlwcm92aWRlIGEgZm9jdXNhYmxlIGVsZW1lbnQgb3IgZWxlbWVudCBpZCBpZiB5b3UgbmVlZCB0bworCQkvLwl3b3JrIGFyb3VuZCBGRidzIHRlbmRlbmN5IHRvIHNlbmQgZm9jdXMgaW50byBvdXRlciBzcGFjZSBvbiBoaWRlCisJCWZvY3VzRWxlbWVudDogIiIsCisKKwkJLy8gYmdDb2xvcjogU3RyaW5nCisJCS8vCWNvbG9yIG9mIHZpZXdwb3J0IHdoZW4gZGlzcGxheWluZyBhIGRpYWxvZworCQliZ0NvbG9yOiAiYmxhY2siLAorCQkKKwkJLy8gYmdPcGFjaXR5OiBOdW1iZXIKKwkJLy8Jb3BhY2l0eSAoMH4xKSBvZiB2aWV3cG9ydCBjb2xvciAoc2VlIGJnQ29sb3IgYXR0cmlidXRlKQorCQliZ09wYWNpdHk6IDAuNCwKKworCQkvLyBmb2xsb3dTY3JvbGw6IEJvb2xlYW4KKwkJLy8JaWYgdHJ1ZSwgcmVhZGp1c3RzIHRoZSBkaWFsb2cgKGFuZCBkaWFsb2cgYmFja2dyb3VuZCkgd2hlbiB0aGUgdXNlciBtb3ZlcyB0aGUgc2Nyb2xsYmFyCisJCWZvbGxvd1Njcm9sbDogdHJ1ZSwKKworCQkvLyBjbG9zZU9uQmFja2dyb3VuZENsaWNrOiBCb29sZWFuCisJCS8vCWNsaWNraW5nIGFueXdoZXJlIG9uIHRoZSBiYWNrZ3JvdW5kIHdpbGwgY2xvc2UgdGhlIGRpYWxvZworCQljbG9zZU9uQmFja2dyb3VuZENsaWNrOiBmYWxzZSwKKworCQl0cmFwVGFiczogZnVuY3Rpb24oLypFdmVudCovIGUpeworCQkJLy8gc3VtbWFyeQorCQkJLy8JY2FsbGJhY2sgb24gZm9jdXMKKwkJCWlmKGUudGFyZ2V0ID09IHRoaXMudGFiU3RhcnRPdXRlcikgeworCQkJCWlmKHRoaXMuX2Zyb21UcmFwKSB7CisJCQkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJCQkJdGhpcy5fZnJvbVRyYXAgPSBmYWxzZTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7CisJCQkJCXRoaXMudGFiRW5kLmZvY3VzKCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlLnRhcmdldCA9PSB0aGlzLnRhYlN0YXJ0KSB7CisJCQkJaWYodGhpcy5fZnJvbVRyYXApIHsKKwkJCQkJdGhpcy5fZnJvbVRyYXAgPSBmYWxzZTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7CisJCQkJCXRoaXMudGFiRW5kLmZvY3VzKCk7CisJCQkJfQorCQkJfSBlbHNlIGlmKGUudGFyZ2V0ID09IHRoaXMudGFiRW5kT3V0ZXIpIHsKKwkJCQlpZih0aGlzLl9mcm9tVHJhcCkgeworCQkJCQl0aGlzLnRhYkVuZC5mb2N1cygpOworCQkJCQl0aGlzLl9mcm9tVHJhcCA9IGZhbHNlOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuX2Zyb21UcmFwID0gdHJ1ZTsKKwkJCQkJdGhpcy50YWJTdGFydC5mb2N1cygpOworCQkJCX0KKwkJCX0gZWxzZSBpZihlLnRhcmdldCA9PSB0aGlzLnRhYkVuZCkgeworCQkJCWlmKHRoaXMuX2Zyb21UcmFwKSB7CisJCQkJCXRoaXMuX2Zyb21UcmFwID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5fZnJvbVRyYXAgPSB0cnVlOworCQkJCQl0aGlzLnRhYlN0YXJ0LmZvY3VzKCk7CisJCQkJfQorCQkJfQorCQl9LAorCisJCWNsZWFyVHJhcDogZnVuY3Rpb24oLypFdmVudCovIGUpIHsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vCWNhbGxiYWNrIG9uIGJsdXIKKwkJCXZhciBfdGhpcyA9IHRoaXM7CisJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJCV90aGlzLl9mcm9tVHJhcCA9IGZhbHNlOworCQkJfSwgMTAwKTsKKwkJfSwKKworCQlwb3N0Q3JlYXRlOiBmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vCWlmIHRoZSB0YXJnZXQgbWl4aW4gY2xhc3MgYWxyZWFkeSBkZWZpbmVkIHBvc3RDcmVhdGUsCisJCQkvLwlkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2UucHJvdG90eXBlLnBvc3RDcmVhdGUuY2FsbCh0aGlzKQorCQkJLy8Jc2hvdWxkIGJlIGNhbGxlZCBpbiBpdHMgcG9zdENyZWF0ZSgpCisJCQl3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSl7CisJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCXpJbmRleCA9IDk5OTsKKwkJCQlkaXNwbGF5ID0gIm5vbmUiOworCQkJCW92ZXJmbG93ID0gInZpc2libGUiOworCQkJfQorCQkJdmFyIGIgPSBkb2pvLmJvZHkoKTsKKwkJCWIuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTsKKworCQkJLy8gbWFrZSBiYWNrZ3JvdW5kICh3aGljaCBzaXRzIGJlaGluZCB0aGUgZGlhbG9nIGJ1dCBhYm92ZSB0aGUgbm9ybWFsIHRleHQpCisJCQl0aGlzLmJnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQl0aGlzLmJnLmNsYXNzTmFtZSA9ICJkaWFsb2dVbmRlcmxheSI7CisJCQl3aXRoKHRoaXMuYmcuc3R5bGUpeworCQkJCXBvc2l0aW9uID0gImFic29sdXRlIjsKKwkJCQlsZWZ0ID0gdG9wID0gIjBweCI7CisJCQkJekluZGV4ID0gOTk4OworCQkJCWRpc3BsYXkgPSAibm9uZSI7CisJCQl9CisJCQliLmFwcGVuZENoaWxkKHRoaXMuYmcpOworCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IodGhpcy5iZ0NvbG9yKTsKKworCQkJdGhpcy5iZ0lmcmFtZSA9IG5ldyBkb2pvLmh0bWwuQmFja2dyb3VuZElmcmFtZSgpOworICAgICAgICAgICAgaWYodGhpcy5iZ0lmcmFtZS5pZnJhbWUpeworCQkJCXdpdGgodGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUpeworCQkJCQlwb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CisJCQkJCWxlZnQgPSB0b3AgPSAiMHB4IjsKKwkJCQkJekluZGV4ID0gOTA7CisJCQkJCWRpc3BsYXkgPSAibm9uZSI7CisJCQkJfQorCQkJfQorCisJCQlpZih0aGlzLmNsb3NlT25CYWNrZ3JvdW5kQ2xpY2speworCQkJCWRvam8uZXZlbnQua3dDb25uZWN0KHtzcmNPYmo6IHRoaXMuYmcsIHNyY0Z1bmM6ICJvbmNsaWNrIiwKKwkJCQkJYWR2aWNlT2JqOiB0aGlzLCBhZHZpY2VGdW5jOiAib25CYWNrZ3JvdW5kQ2xpY2siLCBvbmNlOiB0cnVlfSk7CisJCQl9CisJCX0sCisKKwkJdW5pbml0aWFsaXplOiBmdW5jdGlvbigpeworCQkJdGhpcy5iZ0lmcmFtZS5yZW1vdmUoKTsKKwkJCWRvam8uaHRtbC5yZW1vdmVOb2RlKHRoaXMuYmcsIHRydWUpOworCQl9LAorCisJCXNldEJhY2tncm91bmRDb2xvcjogZnVuY3Rpb24oLypTdHJpbmcqLyBjb2xvcikgeworCQkJLy8gc3VtbWFyeQorCQkJLy8JY2hhbmdlcyBiYWNrZ3JvdW5kIGNvbG9yIHNwZWNpZmllZCBieSAiYmdDb2xvciIgcGFyYW1ldGVyCisJCQkvLwl1c2FnZToKKwkJCS8vCQlzZXRCYWNrZ3JvdW5kQ29sb3IoImJsYWNrIik7CisJCQkvLwkJc2V0QmFja2dyb3VuZENvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQkJaWYoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSB7CisJCQkJY29sb3IgPSBuZXcgZG9qby5nZnguY29sb3IuQ29sb3IoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7CisJCQl9IGVsc2UgeworCQkJCWNvbG9yID0gbmV3IGRvam8uZ2Z4LmNvbG9yLkNvbG9yKGNvbG9yKTsKKwkJCX0KKwkJCXRoaXMuYmcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3IudG9TdHJpbmcoKTsKKwkJCXJldHVybiB0aGlzLmJnQ29sb3IgPSBjb2xvcjsJLy8gU3RyaW5nOiB0aGUgY29sb3IKKwkJfSwKKworCQlzZXRCYWNrZ3JvdW5kT3BhY2l0eTogZnVuY3Rpb24oLypOdW1iZXIqLyBvcCkgeworCQkJLy8gc3VtbWFyeQorCQkJLy8JY2hhbmdlcyBiYWNrZ3JvdW5kIG9wYWNpdHkgc2V0IGJ5ICJiZ09wYWNpdHkiIHBhcmFtZXRlcgorCQkJaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7IG9wID0gdGhpcy5iZ09wYWNpdHk7IH0KKwkJCWRvam8uaHRtbC5zZXRPcGFjaXR5KHRoaXMuYmcsIG9wKTsKKwkJCXRyeSB7CisJCQkJdGhpcy5iZ09wYWNpdHkgPSBkb2pvLmh0bWwuZ2V0T3BhY2l0eSh0aGlzLmJnKTsKKwkJCX0gY2F0Y2ggKGUpIHsKKwkJCQl0aGlzLmJnT3BhY2l0eSA9IG9wOworCQkJfQorCQkJcmV0dXJuIHRoaXMuYmdPcGFjaXR5OwkvLyBOdW1iZXI6IHRoZSBvcGFjaXR5CisJCX0sCisKKwkJX3NpemVCYWNrZ3JvdW5kOiBmdW5jdGlvbigpIHsKKwkJCWlmKHRoaXMuYmdPcGFjaXR5ID4gMCkgeworCQkJCQorCQkJCXZhciB2aWV3cG9ydCA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQkJCXZhciBoID0gdmlld3BvcnQuaGVpZ2h0OworCQkJCXZhciB3ID0gdmlld3BvcnQud2lkdGg7CisJCQkJd2l0aCh0aGlzLmJnLnN0eWxlKXsKKwkJCQkJd2lkdGggPSB3ICsgInB4IjsKKwkJCQkJaGVpZ2h0ID0gaCArICJweCI7CisJCQkJfQorCQkJCXZhciBzY3JvbGxfb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwkJCQl0aGlzLmJnLnN0eWxlLnRvcCA9IHNjcm9sbF9vZmZzZXQueSArICJweCI7CisJCQkJdGhpcy5iZy5zdHlsZS5sZWZ0ID0gc2Nyb2xsX29mZnNldC54ICsgInB4IjsKKwkJCQkvLyBwcm9jZXNzIHR3aWNlIHNpbmNlIHRoZSBzY3JvbGwgYmFyIG1heSBoYXZlIGJlZW4gcmVtb3ZlZAorCQkJCS8vIGJ5IHRoZSBwcmV2aW91cyByZXNpemluZworCQkJCXZhciB2aWV3cG9ydCA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQkJCWlmICh2aWV3cG9ydC53aWR0aCAhPSB3KSB7IHRoaXMuYmcuc3R5bGUud2lkdGggPSB2aWV3cG9ydC53aWR0aCArICJweCI7IH0KKwkJCQlpZiAodmlld3BvcnQuaGVpZ2h0ICE9IGgpIHsgdGhpcy5iZy5zdHlsZS5oZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQgKyAicHgiOyB9CisJCQl9CisJCQl0aGlzLmJnSWZyYW1lLnNpemUodGhpcy5iZyk7CisJCX0sCisKKwkJX3Nob3dCYWNrZ3JvdW5kOiBmdW5jdGlvbigpIHsKKwkJCWlmKHRoaXMuYmdPcGFjaXR5ID4gMCkgeworCQkJCXRoaXMuYmcuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJCQl9CisJCQlpZih0aGlzLmJnSWZyYW1lLmlmcmFtZSl7CisJCQkJdGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJCQl9CisJCX0sCisKKwkJcGxhY2VNb2RhbERpYWxvZzogZnVuY3Rpb24oKSB7CisJCQkvLyBzdW1tYXJ5OiBwb3NpdGlvbiBtb2RhbCBkaWFsb2cgaW4gY2VudGVyIG9mIHNjcmVlbgorCisJCQl2YXIgc2Nyb2xsX29mZnNldCA9IGRvam8uaHRtbC5nZXRTY3JvbGwoKS5vZmZzZXQ7CisJCQl2YXIgdmlld3BvcnRfc2l6ZSA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQkJCisJCQkvLyBmaW5kIHRoZSBzaXplIG9mIHRoZSBkaWFsb2cgKGRpYWxvZyBuZWVkcyB0byBiZSBzaG93aW5nIHRvIGdldCB0aGUgc2l6ZSkKKwkJCXZhciBtYjsKKwkJCWlmKHRoaXMuaXNTaG93aW5nKCkpeworCQkJCW1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCQkJfWVsc2V7CisJCQkJZG9qby5odG1sLnNldFZpc2liaWxpdHkodGhpcy5kb21Ob2RlLCBmYWxzZSk7CisJCQkJZG9qby5odG1sLnNob3codGhpcy5kb21Ob2RlKTsKKwkJCQltYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKTsKKwkJCQlkb2pvLmh0bWwuaGlkZSh0aGlzLmRvbU5vZGUpOworCQkJCWRvam8uaHRtbC5zZXRWaXNpYmlsaXR5KHRoaXMuZG9tTm9kZSwgdHJ1ZSk7CisJCQl9CisJCQkKKwkJCXZhciB4ID0gc2Nyb2xsX29mZnNldC54ICsgKHZpZXdwb3J0X3NpemUud2lkdGggLSBtYi53aWR0aCkvMjsKKwkJCXZhciB5ID0gc2Nyb2xsX29mZnNldC55ICsgKHZpZXdwb3J0X3NpemUuaGVpZ2h0IC0gbWIuaGVpZ2h0KS8yOworCQkJd2l0aCh0aGlzLmRvbU5vZGUuc3R5bGUpeworCQkJCWxlZnQgPSB4ICsgInB4IjsKKwkJCQl0b3AgPSB5ICsgInB4IjsKKwkJCX0KKwkJfSwKKworCQlfb25LZXk6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJaWYgKGV2dC5rZXkpeworCQkJCS8vIHNlZSBpZiB0aGUga2V5IGlzIGZvciB0aGUgZGlhbG9nCisJCQkJdmFyIG5vZGUgPSBldnQudGFyZ2V0OworCQkJCXdoaWxlIChub2RlICE9IG51bGwpeworCQkJCQlpZiAobm9kZSA9PSB0aGlzLmRvbU5vZGUpeworCQkJCQkJcmV0dXJuOyAvLyB5ZXMsIHNvIGp1c3QgbGV0IGl0IGdvCisJCQkJCX0KKwkJCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwkJCQl9CisJCQkJLy8gdGhpcyBrZXkgaXMgZm9yIHRoZSBkaXNhYmxlZCBkb2N1bWVudCB3aW5kb3cKKwkJCQlpZiAoZXZ0LmtleSAhPSBldnQuS0VZX1RBQil7IC8vIGFsbG93IHRhYmJpbmcgaW50byB0aGUgZGlhbG9nIGZvciBhMTF5CisJCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCQkvLyBvcGVyYSB3b24ndCB0YWIgdG8gYSBkaXYKKwkJCQl9ZWxzZSBpZiAoIWRvam8ucmVuZGVyLmh0bWwub3BlcmEpeworCQkJCQl0cnkgeworCQkJCQkJdGhpcy50YWJTdGFydC5mb2N1cygpOyAKKwkJCQkJfSBjYXRjaChlKXt9CisJCQkJfQorCQkJfQorCQl9LAorCisJCXNob3dNb2RhbERpYWxvZzogZnVuY3Rpb24oKSB7CisJCQkvLyBzdW1tYXJ5CisJCQkvLwljYWxsIHRoaXMgZnVuY3Rpb24gaW4gc2hvdygpIG9mIHN1YmNsYXNzIGJlZm9yZSBjYWxsaW5nIHN1cGVyY2xhc3Muc2hvdygpCisJCQlpZiAodGhpcy5mb2xsb3dTY3JvbGwgJiYgIXRoaXMuX3Njcm9sbENvbm5lY3RlZCl7CisJCQkJdGhpcy5fc2Nyb2xsQ29ubmVjdGVkID0gdHJ1ZTsKKwkJCQlkb2pvLmV2ZW50LmNvbm5lY3Qod2luZG93LCAib25zY3JvbGwiLCB0aGlzLCAiX29uU2Nyb2xsIik7CisJCQl9CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAib25rZXkiLCB0aGlzLCAiX29uS2V5Iik7CisKKwkJCXRoaXMucGxhY2VNb2RhbERpYWxvZygpOworCQkJdGhpcy5zZXRCYWNrZ3JvdW5kT3BhY2l0eSgpOworCQkJdGhpcy5fc2l6ZUJhY2tncm91bmQoKTsKKwkJCXRoaXMuX3Nob3dCYWNrZ3JvdW5kKCk7CisJCQl0aGlzLl9mcm9tVHJhcCA9IHRydWU7IAorCisJCQkvLyBzZXQgdGltZW91dCB0byBhbGxvdyB0aGUgYnJvd3NlciB0byByZW5kZXIgZGlhbG9nIAorCQkJc2V0VGltZW91dChkb2pvLmxhbmcuaGl0Y2godGhpcywgZnVuY3Rpb24oKXsKKwkJCQl0cnl7CisJCQkJCXRoaXMudGFiU3RhcnQuZm9jdXMoKTsKKwkJCQl9Y2F0Y2goZSl7fQorCQkJfSksIDUwKTsKKworCQl9LAorCisJCWhpZGVNb2RhbERpYWxvZzogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vCWNhbGwgdGhpcyBmdW5jdGlvbiBpbiBoaWRlKCkgb2Ygc3ViY2xhc3MKKworCQkJLy8gd29ya2Fyb3VuZCBmb3IgRkYgZm9jdXMgZ29pbmcgaW50byBvdXRlciBzcGFjZQorCQkJaWYgKHRoaXMuZm9jdXNFbGVtZW50KSB7CisJCQkJZG9qby5ieUlkKHRoaXMuZm9jdXNFbGVtZW50KS5mb2N1cygpOyAKKwkJCQlkb2pvLmJ5SWQodGhpcy5mb2N1c0VsZW1lbnQpLmJsdXIoKTsKKwkJCX0KKworCQkJdGhpcy5iZy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJdGhpcy5iZy5zdHlsZS53aWR0aCA9IHRoaXMuYmcuc3R5bGUuaGVpZ2h0ID0gIjFweCI7CisgICAgICAgICAgICBpZih0aGlzLmJnSWZyYW1lLmlmcmFtZSl7CisJCQkJdGhpcy5iZ0lmcmFtZS5pZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJCX0KKworCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgIm9ua2V5IiwgdGhpcywgIl9vbktleSIpOworCQkJaWYgKHRoaXMuX3Njcm9sbENvbm5lY3RlZCl7CisJCQkJdGhpcy5fc2Nyb2xsQ29ubmVjdGVkID0gZmFsc2U7CisJCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KHdpbmRvdywgIm9uc2Nyb2xsIiwgdGhpcywgIl9vblNjcm9sbCIpOworCQkJfQorCQl9LAorCisJCV9vblNjcm9sbDogZnVuY3Rpb24oKXsKKwkJCXZhciBzY3JvbGxfb2Zmc2V0ID0gZG9qby5odG1sLmdldFNjcm9sbCgpLm9mZnNldDsKKwkJCXRoaXMuYmcuc3R5bGUudG9wID0gc2Nyb2xsX29mZnNldC55ICsgInB4IjsKKwkJCXRoaXMuYmcuc3R5bGUubGVmdCA9IHNjcm9sbF9vZmZzZXQueCArICJweCI7CisJCQl0aGlzLnBsYWNlTW9kYWxEaWFsb2coKTsKKwkJfSwKKworCQljaGVja1NpemU6IGZ1bmN0aW9uKCkgeworCQkJaWYodGhpcy5pc1Nob3dpbmcoKSl7CisJCQkJdGhpcy5fc2l6ZUJhY2tncm91bmQoKTsKKwkJCQl0aGlzLnBsYWNlTW9kYWxEaWFsb2coKTsKKwkJCQl0aGlzLm9uUmVzaXplZCgpOworCQkJfQorCQl9LAorCQkKKwkJb25CYWNrZ3JvdW5kQ2xpY2s6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5CisJCQkvLwkJQ2FsbGJhY2sgb24gYmFja2dyb3VuZCBjbGljay4KKwkJCS8vCQlDbGlja2luZyBhbnl3aGVyZSBvbiB0aGUgYmFja2dyb3VuZCB3aWxsIGNsb3NlIHRoZSBkaWFsb2csIGJ1dCBvbmx5CisJCQkvLwkJaWYgdGhlIGRpYWxvZyBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQgY2xvc2UgYnV0dG9uLCBhbmQgb25seSBpZgorCQkJLy8JCXRoZSBkaWFsb2cgZG9lc24ndCBoYXZlIGEgYmxvY2tEdXJhdGlvbi4KKwkJCWlmKHRoaXMubGlmZXRpbWUgLSB0aGlzLnRpbWVSZW1haW5pbmcgPj0gdGhpcy5ibG9ja0R1cmF0aW9uKXsgcmV0dXJuOyB9CisJCQl0aGlzLmhpZGUoKTsKKwkJfQorCX0pOworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LkRpYWxvZyIsCisJW2Rvam8ud2lkZ2V0LkNvbnRlbnRQYW5lLCBkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2VdLAorCXsKKwkJLy8gc3VtbWFyeQorCQkvLwlQb3BzIHVwIGEgbW9kYWwgZGlhbG9nIHdpbmRvdywgYmxvY2tpbmcgYWNjZXNzIHRvIHRoZSBzY3JlZW4gYW5kIGFsc28gZ3JheWluZyBvdXQgdGhlIHNjcmVlbgorCQkvLwlEaWFsb2cgaXMgZXh0ZW5kZWQgZnJvbSBDb250ZW50UGFuZSBzbyBpdCBzdXBwb3J0cyBhbGwgdGhlIHNhbWUgcGFyYW1ldGVycyAoaHJlZiwgZXRjLikKKworCQl0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBjbGFzcz1cImRvam9EaWFsb2dcIiBkb2pvYXR0YWNocG9pbnQ9XCJ3cmFwcGVyXCI+XHJcblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiU3RhcnRPdXRlclwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCJcdHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cclxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJTdGFydFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxkaXYgZG9qb2F0dGFjaHBvaW50PVwiY29udGFpbmVyTm9kZVwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAyO1wiPjwvZGl2PlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZE91dGVyXCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcbjwvZGl2PlxyXG4iLAorCisJCS8vIGJsb2NrRHVyYXRpb246IEludGVnZXIKKwkJLy8JbnVtYmVyIG9mIHNlY29uZHMgZm9yIHdoaWNoIHRoZSB1c2VyIGNhbm5vdCBkaXNtaXNzIHRoZSBkaWFsb2cKKwkJYmxvY2tEdXJhdGlvbjogMCwKKwkJCisJCS8vIGxpZmV0aW1lOiBJbnRlZ2VyCisJCS8vCWlmIHNldCwgdGhpcyBjb250cm9scyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhlIGRpYWxvZyB3aWxsIGJlIGRpc3BsYXllZCBiZWZvcmUgYXV0b21hdGljYWxseSBkaXNhcHBlYXJpbmcKKwkJbGlmZXRpbWU6IDAsCisKKwkJLy8gY2xvc2VOb2RlOiBTdHJpbmcKKwkJLy8JSWQgb2YgYnV0dG9uIG9yIG90aGVyIGRvbSBub2RlIHRvIGNsaWNrIHRvIGNsb3NlIHRoaXMgZGlhbG9nCisJCWNsb3NlTm9kZTogIiIsCisKKwkJcG9zdE1peEluUHJvcGVydGllczogZnVuY3Rpb24oKXsKKwkJCWRvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCWlmKHRoaXMuY2xvc2VOb2RlKXsKKwkJCQl0aGlzLnNldENsb3NlQ29udHJvbCh0aGlzLmNsb3NlTm9kZSk7CisJCQl9CisJCX0sCisKKwkJcG9zdENyZWF0ZTogZnVuY3Rpb24oKXsKKwkJCWRvam8ud2lkZ2V0LkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCWRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9LAorCisJCXNob3c6IGZ1bmN0aW9uKCkgeworCQkJaWYodGhpcy5saWZldGltZSl7CisJCQkJdGhpcy50aW1lUmVtYWluaW5nID0gdGhpcy5saWZldGltZTsKKwkJCQlpZih0aGlzLnRpbWVyTm9kZSl7CisJCQkJCXRoaXMudGltZXJOb2RlLmlubmVySFRNTCA9IE1hdGguY2VpbCh0aGlzLnRpbWVSZW1haW5pbmcvMTAwMCk7CisJCQkJfQorCQkJCWlmKHRoaXMuYmxvY2tEdXJhdGlvbiAmJiB0aGlzLmNsb3NlTm9kZSl7CisJCQkJCWlmKHRoaXMubGlmZXRpbWUgPiB0aGlzLmJsb2NrRHVyYXRpb24peworCQkJCQkJdGhpcy5jbG9zZU5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOworCQkJCQl9ZWxzZXsKKwkJCQkJCXRoaXMuY2xvc2VOb2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHRoaXMudGltZXIpIHsKKwkJCQkJY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKKwkJCQl9CisJCQkJdGhpcy50aW1lciA9IHNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX29uVGljayIpLCAxMDApOworCQkJfQorCisJCQl0aGlzLnNob3dNb2RhbERpYWxvZygpOworCQkJZG9qby53aWRnZXQuRGlhbG9nLnN1cGVyY2xhc3Muc2hvdy5jYWxsKHRoaXMpOworCQl9LAorCisJCW9uTG9hZDogZnVuY3Rpb24oKXsKKwkJCS8vIHdoZW4gaHJlZiBpcyBzcGVjaWZpZWQgd2UgbmVlZCB0byByZXBvc2l0aW9uCisJCQkvLyB0aGUgZGlhbG9nIGFmdGVyIHRoZSBkYXRhIGlzIGxvYWRlZAorCQkJdGhpcy5wbGFjZU1vZGFsRGlhbG9nKCk7CisJCQlkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5vbkxvYWQuY2FsbCh0aGlzKTsKKwkJfSwKKwkJCisJCWZpbGxJblRlbXBsYXRlOiBmdW5jdGlvbigpeworCQkJLy8gZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZG9tTm9kZSwgIm9uY2xpY2siLCB0aGlzLCAia2lsbEV2ZW50Iik7CisJCX0sCisKKwkJaGlkZTogZnVuY3Rpb24oKXsKKwkJCXRoaXMuaGlkZU1vZGFsRGlhbG9nKCk7CisJCQlkb2pvLndpZGdldC5EaWFsb2cuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7CisKKwkJCWlmKHRoaXMudGltZXIpeworCQkJCWNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7CisJCQl9CisJCX0sCisJCQorCQlzZXRUaW1lck5vZGU6IGZ1bmN0aW9uKG5vZGUpeworCQkJLy8gc3VtbWFyeQorCQkJLy8Jc3BlY2lmeSBpbnRvIHdoaWNoIG5vZGUgdG8gd3JpdGUgdGhlIHJlbWFpbmluZyAjIG9mIHNlY29uZHMKKwkJCS8vIFRPRE86IG1ha2UgdGhpcyBhIHBhcmFtZXRlciB0b28KKwkJCXRoaXMudGltZXJOb2RlID0gbm9kZTsKKwkJfSwKKworCQlzZXRDbG9zZUNvbnRyb2w6IGZ1bmN0aW9uKC8qU3RyaW5nfERvbU5vZGUqLyBub2RlKSB7CisJCQkvLyBzdW1tYXJ5CisJCQkvLwlTcGVjaWZ5IHdoaWNoIG5vZGUgaXMgdGhlIGNsb3NlIGJ1dHRvbiBmb3IgdGhpcyBkaWFsb2cuCisJCQkvLwlJZiBubyBjbG9zZSBub2RlIGlzIHNwZWNpZmllZCB0aGVuIGNsaWNraW5nIGFueXdoZXJlIG9uIHRoZSBzY3JlZW4gd2lsbCBjbG9zZSB0aGUgZGlhbG9nLgorCQkJdGhpcy5jbG9zZU5vZGUgPSBkb2pvLmJ5SWQobm9kZSk7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5jbG9zZU5vZGUsICJvbmNsaWNrIiwgdGhpcywgImhpZGUiKTsKKwkJfSwKKworCQlzZXRTaG93Q29udHJvbDogZnVuY3Rpb24oLypTdHJpbmd8RG9tTm9kZSovIG5vZGUpIHsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vCXdoZW4gc3BlY2lmaWVkIG5vZGUgaXMgY2xpY2tlZCwgc2hvdyB0aGlzIGRpYWxvZworCQkJLy8gVE9ETzogbWFrZSB0aGlzIGEgcGFyYW1ldGVyIHRvbworCQkJbm9kZSA9IGRvam8uYnlJZChub2RlKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChub2RlLCAib25jbGljayIsIHRoaXMsICJzaG93Iik7CisJCX0sCisKKwkJX29uVGljazogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vCWNhbGxiYWNrIGV2ZXJ5IHNlY29uZCB0aGF0IHRoZSB0aW1lciBjbGlja3MKKwkJCWlmKHRoaXMudGltZXIpeworCQkJCXRoaXMudGltZVJlbWFpbmluZyAtPSAxMDA7CisJCQkJaWYodGhpcy5saWZldGltZSAtIHRoaXMudGltZVJlbWFpbmluZyA+PSB0aGlzLmJsb2NrRHVyYXRpb24peworCQkJCQkvLyBUT0RPOiB0aGlzIGJsb2NrIG9mIGNvZGUgaXMgZXhlY3V0aW5nIG92ZXIgYW5kIG92ZXIgYWdhaW4sIHJhdGhlciB0aGFuIGp1c3Qgb25jZQorCQkJCQlpZih0aGlzLmNsb3NlTm9kZSl7CisJCQkJCQl0aGlzLmNsb3NlTm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOworCQkJCQl9CisJCQkJfQorCQkJCWlmKCF0aGlzLnRpbWVSZW1haW5pbmcpeworCQkJCQljbGVhckludGVydmFsKHRoaXMudGltZXIpOworCQkJCQl0aGlzLmhpZGUoKTsKKwkJCQl9ZWxzZSBpZih0aGlzLnRpbWVyTm9kZSl7CisJCQkJCXRoaXMudGltZXJOb2RlLmlubmVySFRNTCA9IE1hdGguY2VpbCh0aGlzLnRpbWVSZW1haW5pbmcvMTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorKTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5SZXNpemVIYW5kbGUiKTsKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LlJlc2l6ZUhhbmRsZSIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKK3sKKwkvLyBzdW1tYXJ5CisJLy8JVGhlIGhhbmRsZSBvbiB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBGbG9hdGluZ1BhbmUgb3Igb3RoZXIgd2lkZ2V0cyB0aGF0IGFsbG93cworCS8vCXRoZSB3aWRnZXQgdG8gYmUgcmVzaXplZC4KKwkvLwlUeXBpY2FsbHkgbm90IHVzZWQgZGlyZWN0bHkuCisKKwkvLyB0YXJnZXRFbG1JZDogU3RyaW5nCisJLy8JaWQgb2YgdGhlIFdpZGdldCBPUiBEb21Ob2RlIHRoYXQgSSB3aWxsIHNpemUKKwl0YXJnZXRFbG1JZDogJycsCisKKwl0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9IdG1sUmVzaXplSGFuZGxlIHtcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cG9zaXRpb246IGFic29sdXRlO1xyXG5cdHJpZ2h0OiAycHg7XHJcblx0Ym90dG9tOiAycHg7XHJcblx0d2lkdGg6IDEzcHg7XHJcblx0aGVpZ2h0OiAxM3B4O1xyXG5cdHotaW5kZXg6IDIwO1xyXG5cdGN1cnNvcjogbnctcmVzaXplO1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChncmFiQ29ybmVyLmdpZik7XHJcblx0bGluZS1oZWlnaHQ6IDBweDtcclxufVxyXG4iLHRlbXBsYXRlQ3NzUGF0aDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvUmVzaXplSGFuZGxlLmNzcyIpLAorCXRlbXBsYXRlU3RyaW5nOiAnPGRpdiBjbGFzcz0iZG9qb0h0bWxSZXNpemVIYW5kbGUiPjxkaXY+PC9kaXY+PC9kaXY+JywKKworCXBvc3RDcmVhdGU6IGZ1bmN0aW9uKCl7CisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRvbU5vZGUsICJvbm1vdXNlZG93biIsIHRoaXMsICJfYmVnaW5TaXppbmciKTsKKwl9LAorCisJX2JlZ2luU2l6aW5nOiBmdW5jdGlvbigvKkV2ZW50Ki8gZSl7CisJCWlmICh0aGlzLl9pc1NpemluZyl7IHJldHVybiBmYWxzZTsgfQorCisJCS8vIGdldCB0aGUgdGFyZ2V0IGRvbSBub2RlIHRvIGFkanVzdC4gIHRhcmdldEVsbUlkIGNhbiByZWZlciB0byBlaXRoZXIgYSB3aWRnZXQgb3IgYSBzaW1wbGUgbm9kZQorCQl0aGlzLnRhcmdldFdpZGdldCA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy50YXJnZXRFbG1JZCk7CisJCXRoaXMudGFyZ2V0RG9tTm9kZSA9IHRoaXMudGFyZ2V0V2lkZ2V0ID8gdGhpcy50YXJnZXRXaWRnZXQuZG9tTm9kZSA6IGRvam8uYnlJZCh0aGlzLnRhcmdldEVsbUlkKTsKKwkJaWYgKCF0aGlzLnRhcmdldERvbU5vZGUpeyByZXR1cm47IH0KKworCQl0aGlzLl9pc1NpemluZyA9IHRydWU7CisJCXRoaXMuc3RhcnRQb2ludCAgPSB7J3gnOmUuY2xpZW50WCwgJ3knOmUuY2xpZW50WX07CisJCXZhciBtYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy50YXJnZXREb21Ob2RlKTsKKwkJdGhpcy5zdGFydFNpemUgID0geyd3JzptYi53aWR0aCwgJ2gnOm1iLmhlaWdodH07CisKKwkJZG9qby5ldmVudC5rd0Nvbm5lY3QoeworCQkJc3JjT2JqOiBkb2pvLmJvZHkoKSwgCisJCQlzcmNGdW5jOiAib25tb3VzZW1vdmUiLAorCQkJdGFyZ2V0T2JqOiB0aGlzLAorCQkJdGFyZ2V0RnVuYzogIl9jaGFuZ2VTaXppbmciLAorCQkJcmF0ZTogMjUKKwkJfSk7CisJCWRvam8uZXZlbnQuY29ubmVjdChkb2pvLmJvZHkoKSwgIm9ubW91c2V1cCIsIHRoaXMsICJfZW5kU2l6aW5nIik7CisKKwkJZS5wcmV2ZW50RGVmYXVsdCgpOworCX0sCisKKwlfY2hhbmdlU2l6aW5nOiBmdW5jdGlvbigvKkV2ZW50Ki8gZSl7CisJCS8vIE9uIElFLCBpZiB5b3UgbW92ZSB0aGUgbW91c2UgYWJvdmUvdG8gdGhlIGxlZnQgb2YgdGhlIG9iamVjdCBiZWluZyByZXNpemVkLAorCQkvLyBzb21ldGltZXMgY2xpZW50WC9ZIGFyZW4ndCBzZXQsIGFwcGFyZW50bHkuICBKdXN0IGlnbm9yZSB0aGUgZXZlbnQuCisJCXRyeXsKKwkJCWlmKCFlLmNsaWVudFggIHx8ICFlLmNsaWVudFkpeyByZXR1cm47IH0KKwkJfWNhdGNoKGUpeworCQkJLy8gc29tZXRpbWVzIHlvdSBnZXQgYW4gZXhjZXB0aW9uIGFjY2Vzc2luZyBhYm92ZSBmaWVsZHMuLi4KKwkJCXJldHVybjsKKwkJfQorCQl2YXIgZHggPSB0aGlzLnN0YXJ0UG9pbnQueCAtIGUuY2xpZW50WDsKKwkJdmFyIGR5ID0gdGhpcy5zdGFydFBvaW50LnkgLSBlLmNsaWVudFk7CisJCQorCQl2YXIgbmV3VyA9IHRoaXMuc3RhcnRTaXplLncgLSBkeDsKKwkJdmFyIG5ld0ggPSB0aGlzLnN0YXJ0U2l6ZS5oIC0gZHk7CisKKwkJLy8gbWluaW11bSBzaXplIGNoZWNrCisJCWlmICh0aGlzLm1pblNpemUpIHsKKwkJCXZhciBtYiA9IGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy50YXJnZXREb21Ob2RlKTsKKwkJCWlmIChuZXdXIDwgdGhpcy5taW5TaXplLncpIHsKKwkJCQluZXdXID0gbWIud2lkdGg7CisJCQl9CisJCQlpZiAobmV3SCA8IHRoaXMubWluU2l6ZS5oKSB7CisJCQkJbmV3SCA9IG1iLmhlaWdodDsKKwkJCX0KKwkJfQorCQkKKwkJaWYodGhpcy50YXJnZXRXaWRnZXQpeworCQkJdGhpcy50YXJnZXRXaWRnZXQucmVzaXplVG8obmV3VywgbmV3SCk7CisJCX1lbHNleworCQkJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLnRhcmdldERvbU5vZGUsIHsgd2lkdGg6IG5ld1csIGhlaWdodDogbmV3SH0pOworCQl9CisJCQorCQllLnByZXZlbnREZWZhdWx0KCk7CisJfSwKKworCV9lbmRTaXppbmc6IGZ1bmN0aW9uKC8qRXZlbnQqLyBlKXsKKwkJZG9qby5ldmVudC5kaXNjb25uZWN0KGRvam8uYm9keSgpLCAib25tb3VzZW1vdmUiLCB0aGlzLCAiX2NoYW5nZVNpemluZyIpOworCQlkb2pvLmV2ZW50LmRpc2Nvbm5lY3QoZG9qby5ib2R5KCksICJvbm1vdXNldXAiLCB0aGlzLCAiX2VuZFNpemluZyIpOworCisJCXRoaXMuX2lzU2l6aW5nID0gZmFsc2U7CisJfQorCisKK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZSIpOworCisKKworCisKKworCisKKworCisKKwkJLy8gZm9yIE1vZGFsRmxvYXRpbmdQYW5lCisKKworZG9qby5kZWNsYXJlKAorCSJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlIiwKKwludWxsLAorCXsKKwkJLy8gc3VtbWFyeQorCQkvLwlCYXNlIGNsYXNzIGZvciBGbG9hdGluZ1BhbmUsIE1vZGFsRmxvYXRpbmdQYW5lCisKKwkJLy8gdGl0bGU6IFN0cmluZworCQkvLwl0ZXh0IHRvIGRpc3BsYXkgaW4gZmxvYXRpbmcgcGFuZSdzIHRpdGxlIGJhciAoZXg6ICJNeSBXaW5kb3ciKQorCQl0aXRsZTogJycsCisKKwkJLy8gaWNvblNyYzogU3RyaW5nCisJCS8vCXBhdGggb2YgaWNvbiB0byBkaXNwbGF5IGluIGZsb2F0aW5nIHBhbmUncyB0aXRsZSBiYXIKKwkJaWNvblNyYzogJycsCisKKwkJLy8gaGFzU2hhZG93OiBCb29sZWFuCisJCS8vCWlmIHRydWUsIGRpc3BsYXkgYSBzaGFkb3cgYmVoaW5kIHRoZSBmbG9hdGluZyBwYW5lCisJCWhhc1NoYWRvdzogZmFsc2UsCisKKwkJLy8gY29uc3RyYWluVG9Db250YWluZXI6IEJvb2xlYW4KKwkJLy8JaWYgdHJ1ZSwgYW5kIHRoZSBmbG9hdGluZyBwYW5lIGlzIGluc2lkZSBhbm90aGVyIGNvbnRhaW5lciAoQ29udGVudFBhbmUsIGFub3RoZXIgRmxvYXRpbmdQYW5lLCBldGMuKSwKKwkJLy8JdGhlbiBkb24ndCBhbGxvdyB0aGUgZmxvYXRpbmcgcGFuZSB0byBiZSBkcmFnZ2VkIG91dHNpZGUgb2YgaXQncyBjb250YWluZXIKKwkJY29uc3RyYWluVG9Db250YWluZXI6IGZhbHNlLAorCisJCS8vIHRhc2tCYXJJZDogU3RyaW5nCisJCS8vCXdpZGdldCBpZCBvZiBUYXNrQmFyIHdpZGdldDsKKwkJLy8JaWYgc3BlY2lmaWVkLCB0aGVuIGFuIGljb24gZm9yIHRoaXMgRmxvYXRpbmdQYW5lIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBUYXNrQmFyCisJCXRhc2tCYXJJZDogIiIsCisKKwkJLy8gcmVzaXphYmxlOiBCb29sZWFuCisJCS8vCWlmIHRydWUsIGFsbG93IHVzZXIgdG8gcmVzaXplIGZsb2F0aW5nIHBhbmUKKwkJcmVzaXphYmxlOiB0cnVlLAorCisJCS8vIHRpdGxlQmFyRGlzcGxheTogQm9vbGVhbgorCQkvLwlpZiB0cnVlLCBkaXNwbGF5IHRpdGxlIGJhciBmb3IgdGhpcyBmbG9hdGluZyBwYW5lCisJCXRpdGxlQmFyRGlzcGxheTogdHJ1ZSwKKworCQkvLyB3aW5kb3dTdGF0ZTogU3RyaW5nCisJCS8vCWNvbnRyb2xzIHdoZXRoZXIgd2luZG93IGlzIGluaXRpYWxseSBub3QgZGlzcGxheWVkICgibWluaW1pemVkIiksIGRpc3BsYXllZCBmdWxsIHNjcmVlbiAoIm1heGltaXplZCIpLAorCQkvLwlvciBqdXN0IGRpc3BsYXllZCBub3JtYWxseSAoIm5vcm1hbCIpLgorCQkvLyBWYWx1ZXMKKwkJLy8JIm5vcm1hbCIsICJtYXhpbWl6ZWQiLCAibWluaW1pemVkIgorCQl3aW5kb3dTdGF0ZTogIm5vcm1hbCIsCisKKwkJLy8gZGlzcGxheUNsb3NlQWN0aW9uOiBCb29sZWFuCisJCS8vCWRpc3BsYXkgYnV0dG9uIHRvIGNsb3NlIHdpbmRvdworCQlkaXNwbGF5Q2xvc2VBY3Rpb246IGZhbHNlLAorCisJCS8vIGRpc3BsYXlNaW5pbWl6ZUFjdGlvbjogQm9vbGVhbgorCQkvLwlkaXNwbGF5IGJ1dHRvbiB0byBtaW5pbWl6ZSB3aW5kb3cgKGllLCB3aW5kb3cgZGlzYXBwZWFycyBzbyBvbmx5IHRoZSB0YXNrYmFyIGl0ZW0gcmVtYWlucykKKwkJZGlzcGxheU1pbmltaXplQWN0aW9uOiBmYWxzZSwKKworCQkvLyBkaXNwbGF5TWF4aW1pemVBY3Rpb246IEJvb2xlYW4KKwkJLy8JZGlzcGxheSBidXR0b24gdG8gbWF4aW1pemUgd2luZG93IChpZSwgdG8gdGFrZSB1cCB0aGUgZnVsbCBzY3JlZW4pCisJCWRpc3BsYXlNYXhpbWl6ZUFjdGlvbjogZmFsc2UsCisKKwkJLy8gUmVsYXRlZCB0byBjb25uZWN0aW5nIHRvIHRhc2tiYXIKKwkJLy8gVE9ETzogdXNlIHRvcGljcyByYXRoZXIgdGhhbiByZXBlYXRlZCBjb25uZWN0IGF0dGVtcHRzPworCQlfbWF4X3Rhc2tCYXJDb25uZWN0QXR0ZW1wdHM6IDUsCisJCV90YXNrQmFyQ29ubmVjdEF0dGVtcHRzOiAwLAorCisJCXRlbXBsYXRlU3RyaW5nOiI8ZGl2IGlkPVwiJHt0aGlzLndpZGdldElkfVwiIGRvam9BdHRhY2hFdmVudD1cIm9uTW91c2VEb3duXCIgY2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lXCI+XHJcblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJ0aXRsZUJhclwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFyXCIgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XHJcblx0ICBcdDxpbWcgZG9qb0F0dGFjaFBvaW50PVwidGl0bGVCYXJJY29uXCIgIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFySWNvblwiPlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJjbG9zZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6Y2xvc2VXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsb3NlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXN0b3JlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpyZXN0b3JlV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtYXhpbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWF4aW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtaW5pbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWluaW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvblwiPjwvZGl2PlxyXG5cdCAgXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyVGV4dFwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dFwiPiR7dGhpcy50aXRsZX08L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsaWVudFwiPjwvZGl2PlxyXG5cclxuXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInJlc2l6ZUJhclwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVJlc2l6ZWJhclwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9kaXY+XHJcbjwvZGl2PlxyXG4iLAorCQl0ZW1wbGF0ZUNzc1N0cmluZzoiXHJcbi8qKioqKioqKioqIE91dGVyIFdpbmRvdyAqKioqKioqKioqKioqKiovXHJcblxyXG4uZG9qb0Zsb2F0aW5nUGFuZSB7XHJcblx0LyogZXNzZW50aWFsIGNzcyAqL1xyXG5cdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRvdmVyZmxvdzogdmlzaWJsZTtcdFx0Lyogc28gZHJvcCBzaGFkb3cgaXMgZGlzcGxheWVkICovXHJcblx0ei1pbmRleDogMTA7XHJcblxyXG5cdC8qIHN0eWxpbmcgY3NzICovXHJcblx0Ym9yZGVyOiAxcHggc29saWQ7XHJcblx0Ym9yZGVyLWNvbG9yOiBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQ7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcclxufVxyXG5cclxuXHJcbi8qKioqKioqKioqIFRpdGxlIEJhciAqKioqKioqKioqKioqKioqL1xyXG5cclxuLmRvam9GbG9hdGluZ1BhbmVUaXRsZUJhciB7XHJcblx0dmVydGljYWwtYWxpZ246IHRvcDtcclxuXHRtYXJnaW46IDJweCAycHggMnB4IDJweDtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjNzU5NmM2O1xyXG5cdGN1cnNvcjogZGVmYXVsdDtcclxuXHRvdmVyZmxvdzogaGlkZGVuO1xyXG5cdGJvcmRlci1jb2xvcjogVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdyBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0O1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbn1cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lVGl0bGVUZXh0IHtcclxuXHRmbG9hdDogbGVmdDtcclxuXHRwYWRkaW5nOiAycHggNHB4IDJweCAycHg7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuXHRjb2xvcjogQ2FwdGlvblRleHQ7XHJcblx0Zm9udDogc21hbGwtY2FwdGlvbjtcclxufVxyXG5cclxuLmRvam9UaXRsZUJhckljb24ge1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cdGhlaWdodDogMjJweDtcclxuXHR3aWR0aDogMjJweDtcclxuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG5cdG1hcmdpbi1yaWdodDogNXB4O1xyXG5cdG1hcmdpbi1sZWZ0OiA1cHg7XHJcbn1cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lQWN0aW9uc3tcclxuXHRmbG9hdDogcmlnaHQ7XHJcblx0cG9zaXRpb246IGFic29sdXRlO1xyXG5cdHJpZ2h0OiAycHg7XHJcblx0dG9wOiAycHg7XHJcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxufVxyXG5cclxuXHJcbi5kb2pvRmxvYXRpbmdQYW5lQWN0aW9uSXRlbSB7XHJcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRtYXJnaW4tcmlnaHQ6IDFweDtcclxuXHRoZWlnaHQ6IDIycHg7XHJcblx0d2lkdGg6IDIycHg7XHJcbn1cclxuXHJcblxyXG4uZG9qb0Zsb2F0aW5nUGFuZVRpdGxlQmFySWNvbiB7XHJcblx0LyogZXNzZW50aWFsIGNzcyAqL1xyXG5cdGZsb2F0OiBsZWZ0O1xyXG5cclxuXHQvKiBzdHlsaW5nIGNzcyAqL1xyXG5cdG1hcmdpbi1sZWZ0OiAycHg7XHJcblx0bWFyZ2luLXJpZ2h0OiA0cHg7XHJcblx0aGVpZ2h0OiAyMnB4O1xyXG59XHJcblxyXG4vKiBtaW5pbWl6ZS9tYXhpbWl6ZSBpY29ucyBhcmUgc3BlY2lmaWVkIGJ5IENTUyBvbmx5ICovXHJcbi5kb2pvRmxvYXRpbmdQYW5lTWluaW1pemVJY29uLFxyXG4uZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvbixcclxuLmRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbixcclxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0aGVpZ2h0OiAyMnB4O1xyXG5cdHdpZHRoOiAyMnB4O1xyXG5cdGZsb2F0OiByaWdodDtcclxufVxyXG4uZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvbiB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mbG9hdGluZ1BhbmVNaW5pbWl6ZS5naWYpO1xyXG59XHJcbi5kb2pvRmxvYXRpbmdQYW5lTWF4aW1pemVJY29uIHtcclxuXHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Zsb2F0aW5nUGFuZU1heGltaXplLmdpZik7XHJcbn1cclxuLmRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvbiB7XHJcblx0YmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mbG9hdGluZ1BhbmVSZXN0b3JlLmdpZik7XHJcbn1cclxuLmRvam9GbG9hdGluZ1BhbmVDbG9zZUljb24ge1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZmxvYXRpbmdQYW5lQ2xvc2UuZ2lmKTtcclxufVxyXG5cclxuLyogYmFyIGF0IGJvdHRvbSBvZiB3aW5kb3cgdGhhdCBob2xkcyByZXNpemUgaGFuZGxlICovXHJcbi5kb2pvRmxvYXRpbmdQYW5lUmVzaXplYmFyIHtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRoZWlnaHQ6IDEzcHg7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogVGhyZWVERmFjZTtcclxufVxyXG5cclxuLyoqKioqKioqKioqKiogQ2xpZW50IEFyZWEgKioqKioqKioqKioqKioqL1xyXG5cclxuLmRvam9GbG9hdGluZ1BhbmVDbGllbnQge1xyXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHR6LWluZGV4OiAxMDtcclxuXHRib3JkZXI6IDFweCBzb2xpZDtcclxuXHRib3JkZXItY29sb3I6IFRocmVlRFNoYWRvdyBUaHJlZURIaWdobGlnaHQgVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdztcclxuXHRtYXJnaW46IDJweDtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiBUaHJlZURGYWNlO1xyXG5cdHBhZGRpbmc6IDhweDtcclxuXHRmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBHYXJhbW9uZCwgc2Fucy1zZXJpZjtcclxuXHRmb250LXNpemU6IDEycHg7XHJcblx0b3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbiIsdGVtcGxhdGVDc3NQYXRoOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9GbG9hdGluZ1BhbmUuY3NzIiksCisKKwkJZmlsbEluRmxvYXRpbmdQYW5lVGVtcGxhdGU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpeworCQkJLy8gc3VtbWFyeTogdGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IGZpbGxJblRlbXBsYXRlKCkgb2YgdGhlIHdpZGdldCB0aGF0IEknbSBtaXhlZCBpbnRvCisKKwkJCS8vIENvcHkgc3R5bGUgaW5mbyBmcm9tIGlucHV0IG5vZGUgdG8gb3V0cHV0IG5vZGUKKwkJCXZhciBzb3VyY2UgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCQkJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisKKwkJCS8vIG5lY2Vzc2FyeSBmb3Igc2FmYXJpLCBraHRtbCAoZm9yIGNvbXB1dGluZyB3aWR0aC9oZWlnaHQpCisJCQlkb2pvLmJvZHkoKS5hcHBlbmRDaGlsZCh0aGlzLmRvbU5vZGUpOworCisJCQkvLyBpZiBkaXNwbGF5Om5vbmUgdGhlbiBzdGF0ZT1taW5pbWl6ZWQsIG90aGVyd2lzZSBzdGF0ZT1ub3JtYWwKKwkJCWlmKCF0aGlzLmlzU2hvd2luZygpKXsKKwkJCQl0aGlzLndpbmRvd1N0YXRlPSJtaW5pbWl6ZWQiOworCQkJfQorCisJCQkvLyA8aW1nIHNyYz0iIj4gY2FuIGhhbmcgSUUhICBiZXR0ZXIgZ2V0IHJpZCBvZiBpdAorCQkJaWYodGhpcy5pY29uU3JjPT0iIil7CisJCQkJZG9qby5odG1sLnJlbW92ZU5vZGUodGhpcy50aXRsZUJhckljb24pOworCQkJfWVsc2V7CisJCQkJdGhpcy50aXRsZUJhckljb24uc3JjID0gdGhpcy5pY29uU3JjLnRvU3RyaW5nKCk7Ly8gZG9qby51cmkuVXJpIG9iaiByZXEuIHRvU3RyaW5nKCkKKwkJCX0KKworCQkJaWYodGhpcy50aXRsZUJhckRpc3BsYXkpeworCQkJCXRoaXMudGl0bGVCYXIuc3R5bGUuZGlzcGxheT0iIjsKKwkJCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnRpdGxlQmFyKTsKKworCQkJCXRoaXMudGl0bGVCYXJJY29uLnN0eWxlLmRpc3BsYXkgPSAodGhpcy5pY29uU3JjPT0iIiA/ICJub25lIiA6ICIiKTsKKworCQkJCXRoaXMubWluaW1pemVBY3Rpb24uc3R5bGUuZGlzcGxheSA9ICh0aGlzLmRpc3BsYXlNaW5pbWl6ZUFjdGlvbiA/ICIiIDogIm5vbmUiKTsKKwkJCQl0aGlzLm1heGltaXplQWN0aW9uLnN0eWxlLmRpc3BsYXk9CisJCQkJCSh0aGlzLmRpc3BsYXlNYXhpbWl6ZUFjdGlvbiAmJiB0aGlzLndpbmRvd1N0YXRlIT0ibWF4aW1pemVkIiA/ICIiIDogIm5vbmUiKTsKKwkJCQl0aGlzLnJlc3RvcmVBY3Rpb24uc3R5bGUuZGlzcGxheT0KKwkJCQkJKHRoaXMuZGlzcGxheU1heGltaXplQWN0aW9uICYmIHRoaXMud2luZG93U3RhdGU9PSJtYXhpbWl6ZWQiID8gIiIgOiAibm9uZSIpOworCQkJCXRoaXMuY2xvc2VBY3Rpb24uc3R5bGUuZGlzcGxheT0gKHRoaXMuZGlzcGxheUNsb3NlQWN0aW9uID8gIiIgOiAibm9uZSIpOworCisJCQkJdGhpcy5kcmFnID0gbmV3IGRvam8uZG5kLkh0bWxEcmFnTW92ZVNvdXJjZSh0aGlzLmRvbU5vZGUpOworCQkJCWlmICh0aGlzLmNvbnN0cmFpblRvQ29udGFpbmVyKSB7CisJCQkJCXRoaXMuZHJhZy5jb25zdHJhaW5UbygpOworCQkJCX0KKwkJCQl0aGlzLmRyYWcuc2V0RHJhZ0hhbmRsZSh0aGlzLnRpdGxlQmFyKTsKKworCQkJCXZhciBzZWxmID0gdGhpczsKKworCQkJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKCJkcmFnTW92ZSIsCisJCQkJCWZ1bmN0aW9uIChpbmZvKXsKKwkJCQkJCWlmIChpbmZvLnNvdXJjZS5kb21Ob2RlID09IHNlbGYuZG9tTm9kZSl7CisJCQkJCQkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKCdmbG9hdGluZ1BhbmVNb3ZlJywgeyBzb3VyY2U6IHNlbGYgfSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJKTsKKwkJCX0KKworCQkJaWYodGhpcy5yZXNpemFibGUpeworCQkJCXRoaXMucmVzaXplQmFyLnN0eWxlLmRpc3BsYXk9IiI7CisJCQkJdGhpcy5yZXNpemVIYW5kbGUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlJlc2l6ZUhhbmRsZSIsIHt0YXJnZXRFbG1JZDogdGhpcy53aWRnZXRJZCwgaWQ6dGhpcy53aWRnZXRJZCsiX3Jlc2l6ZSJ9KTsKKwkJCQl0aGlzLnJlc2l6ZUJhci5hcHBlbmRDaGlsZCh0aGlzLnJlc2l6ZUhhbmRsZS5kb21Ob2RlKTsKKwkJCX0KKworCQkJLy8gYWRkIGEgZHJvcCBzaGFkb3cKKwkJCWlmKHRoaXMuaGFzU2hhZG93KXsKKwkJCQl0aGlzLnNoYWRvdz1uZXcgZG9qby5sZnguc2hhZG93KHRoaXMuZG9tTm9kZSk7CisJCQl9CisKKwkJCS8vIFByZXZlbnQgSUUgYmxlZWQtdGhyb3VnaCBwcm9ibGVtCisJCQl0aGlzLmJnSWZyYW1lID0gbmV3IGRvam8uaHRtbC5CYWNrZ3JvdW5kSWZyYW1lKHRoaXMuZG9tTm9kZSk7CisKKwkJCWlmKCB0aGlzLnRhc2tCYXJJZCApeworCQkJCXRoaXMuX3Rhc2tCYXJTZXR1cCgpOworCQkJfQorCisJCQkvLyBjb3VudGVyYWN0IGJvZHkuYXBwZW5kQ2hpbGQgYWJvdmUKKwkJCWRvam8uYm9keSgpLnJlbW92ZUNoaWxkKHRoaXMuZG9tTm9kZSk7CisJCX0sCisKKwkJcG9zdENyZWF0ZTogZnVuY3Rpb24oKXsKKwkJCWlmIChkb2pvLmhvc3RlbnYucG9zdF9sb2FkXykgeworCQkJCXRoaXMuX3NldEluaXRpYWxXaW5kb3dTdGF0ZSgpOworCQkJfSBlbHNlIHsKKwkJCQlkb2pvLmFkZE9uTG9hZCh0aGlzLCAiX3NldEluaXRpYWxXaW5kb3dTdGF0ZSIpOworCQkJfQorCQl9LAorCisJCW1heGltaXplV2luZG93OiBmdW5jdGlvbigvKkV2ZW50Ki8gZXZ0KSB7CisJCQkvLyBzdW1tYXJ5OiBtYXhpbWl6ZSB0aGUgd2luZG93CisJCQl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJCQl0aGlzLnByZXZpb3VzPXsKKwkJCQl3aWR0aDogbWIud2lkdGggfHwgdGhpcy53aWR0aCwKKwkJCQloZWlnaHQ6IG1iLmhlaWdodCB8fCB0aGlzLmhlaWdodCwKKwkJCQlsZWZ0OiB0aGlzLmRvbU5vZGUuc3R5bGUubGVmdCwKKwkJCQl0b3A6IHRoaXMuZG9tTm9kZS5zdHlsZS50b3AsCisJCQkJYm90dG9tOiB0aGlzLmRvbU5vZGUuc3R5bGUuYm90dG9tLAorCQkJCXJpZ2h0OiB0aGlzLmRvbU5vZGUuc3R5bGUucmlnaHQKKwkJCX07CisJCQlpZih0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdy50b0xvd2VyQ2FzZSgpICE9ICdoaWRkZW4nKXsKKwkJCQl0aGlzLnBhcmVudFByZXZpb3VzPXsKKwkJCQkJb3ZlcmZsb3c6IHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93CisJCQkJfTsKKwkJCQlkb2pvLmRlYnVnKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlLm92ZXJmbG93KTsKKwkJCQl0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkJfQorCisJCQl0aGlzLmRvbU5vZGUuc3R5bGUubGVmdCA9CisJCQkJZG9qby5odG1sLmdldFBpeGVsVmFsdWUodGhpcy5kb21Ob2RlLnBhcmVudE5vZGUsICJwYWRkaW5nLWxlZnQiLCB0cnVlKSArICJweCI7CisJCQl0aGlzLmRvbU5vZGUuc3R5bGUudG9wID0KKwkJCQlkb2pvLmh0bWwuZ2V0UGl4ZWxWYWx1ZSh0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSwgInBhZGRpbmctdG9wIiwgdHJ1ZSkgKyAicHgiOworCisJCQlpZiAoKHRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2JvZHknKSkgeworCQkJCXZhciB2aWV3cG9ydCA9IGRvam8uaHRtbC5nZXRWaWV3cG9ydCgpOworCQkJCXZhciBwYWRkaW5nID0gZG9qby5odG1sLmdldFBhZGRpbmcoZG9qby5ib2R5KCkpOworCQkJCXRoaXMucmVzaXplVG8odmlld3BvcnQud2lkdGgtcGFkZGluZy53aWR0aCwgdmlld3BvcnQuaGVpZ2h0LXBhZGRpbmcuaGVpZ2h0KTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIGNvbnRlbnQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmRvbU5vZGUucGFyZW50Tm9kZSk7CisJCQkJdGhpcy5yZXNpemVUbyhjb250ZW50LndpZHRoLCBjb250ZW50LmhlaWdodCk7CisJCQl9CisJCQl0aGlzLm1heGltaXplQWN0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworCQkJdGhpcy5yZXN0b3JlQWN0aW9uLnN0eWxlLmRpc3BsYXk9IiI7CisKKwkJCS8vZGlzYWJsZSByZXNpemUgYW5kIGRyYWcKKwkJCWlmKHRoaXMucmVzaXplSGFuZGxlKXsKKwkJCQl0aGlzLnJlc2l6ZUhhbmRsZS5kb21Ob2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiOworCQkJfQorCQkJdGhpcy5kcmFnLnNldERyYWdIYW5kbGUobnVsbCk7CisKKwkJCXRoaXMud2luZG93U3RhdGU9Im1heGltaXplZCI7CisJCX0sCisKKwkJbWluaW1pemVXaW5kb3c6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpIHsKKwkJCS8vIHN1bW1hcnk6IGhpZGUgdGhlIHdpbmRvdyBzbyB0aGF0IG9ubHkgdGhlIGljb24gaW4gdGhlIHRhc2tiYXIgaXMgc2hvd24KKwkJCXRoaXMuaGlkZSgpOworCQkJZm9yKHZhciBhdHRyIGluIHRoaXMucGFyZW50UHJldmlvdXMpeworCQkJCXRoaXMuZG9tTm9kZS5wYXJlbnROb2RlLnN0eWxlW2F0dHJdID0gdGhpcy5wYXJlbnRQcmV2aW91c1thdHRyXTsKKwkJCX0KKwkJCXRoaXMubGFzdFdpbmRvd1N0YXRlID0gdGhpcy53aW5kb3dTdGF0ZTsKKwkJCXRoaXMud2luZG93U3RhdGUgPSAibWluaW1pemVkIjsKKwkJfSwKKworCQlyZXN0b3JlV2luZG93OiBmdW5jdGlvbigvKkV2ZW50Ki8gZXZ0KSB7CisJCQkvLyBzdW1tYXJ5OiBzZXQgdGhlIHdpbm93IHRvIG5vcm1hbCBzaXplIChuZWl0aGVyIG1heGltaXplZCBub3IgbWluaW1pemVkKQorCQkJaWYgKHRoaXMud2luZG93U3RhdGU9PSJtaW5pbWl6ZWQiKSB7CisJCQkJdGhpcy5zaG93KCk7CisJCQkJaWYodGhpcy5sYXN0V2luZG93U3RhdGUgPT0gIm1heGltaXplZCIpeworCQkJCQl0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkJCQl0aGlzLndpbmRvd1N0YXRlPSJtYXhpbWl6ZWQiOworCQkJCX1lbHNleyAvL25vcm1hbAorCQkJCQl0aGlzLndpbmRvd1N0YXRlPSJub3JtYWwiOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodGhpcy53aW5kb3dTdGF0ZT09Im1heGltaXplZCIpeworCQkJCWZvcih2YXIgYXR0ciBpbiB0aGlzLnByZXZpb3VzKXsKKwkJCQkJdGhpcy5kb21Ob2RlLnN0eWxlW2F0dHJdID0gdGhpcy5wcmV2aW91c1thdHRyXTsKKwkJCQl9CisJCQkJZm9yKHZhciBhdHRyIGluIHRoaXMucGFyZW50UHJldmlvdXMpeworCQkJCQl0aGlzLmRvbU5vZGUucGFyZW50Tm9kZS5zdHlsZVthdHRyXSA9IHRoaXMucGFyZW50UHJldmlvdXNbYXR0cl07CisJCQkJfQorCQkJCXRoaXMucmVzaXplVG8odGhpcy5wcmV2aW91cy53aWR0aCwgdGhpcy5wcmV2aW91cy5oZWlnaHQpOworCQkJCXRoaXMucHJldmlvdXM9bnVsbDsKKwkJCQl0aGlzLnBhcmVudFByZXZpb3VzPW51bGw7CisKKwkJCQl0aGlzLnJlc3RvcmVBY3Rpb24uc3R5bGUuZGlzcGxheT0ibm9uZSI7CisJCQkJdGhpcy5tYXhpbWl6ZUFjdGlvbi5zdHlsZS5kaXNwbGF5PXRoaXMuZGlzcGxheU1heGltaXplQWN0aW9uID8gIiIgOiAibm9uZSI7CisKKwkJCQlpZih0aGlzLnJlc2l6ZUhhbmRsZSl7CisJCQkJCXRoaXMucmVzaXplSGFuZGxlLmRvbU5vZGUuc3R5bGUuZGlzcGxheT0iIjsKKwkJCQl9CisJCQkJdGhpcy5kcmFnLnNldERyYWdIYW5kbGUodGhpcy50aXRsZUJhcik7CisJCQkJdGhpcy53aW5kb3dTdGF0ZT0ibm9ybWFsIjsKKwkJCX0gZWxzZSB7IC8vbm9ybWFsCisJCQkJLy8gZG8gbm90aGluZworCQkJfQorCQl9LAorCisJCXRvZ2dsZURpc3BsYXk6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBzd2l0Y2ggYmV0d2VlbiBoaWRkZW4gbW9kZSBhbmQgZGlzcGxheWVkIG1vZGUgKGVpdGhlciBtYXhpbWl6ZWQgb3Igbm9ybWFsLCBkZXBlbmRpbmcgb24gc3RhdGUgYmVmb3JlIHdpbmRvdyB3YXMgbWluaW1pemVkKQorCQkJaWYodGhpcy53aW5kb3dTdGF0ZT09Im1pbmltaXplZCIpeworCQkJCXRoaXMucmVzdG9yZVdpbmRvdygpOworCQkJfWVsc2V7CisJCQkJdGhpcy5taW5pbWl6ZVdpbmRvdygpOworCQkJfQorCQl9LAorCisJCWNsb3NlV2luZG93OiBmdW5jdGlvbigvKkV2ZW50Ki8gZXZ0KSB7CisJCQkvLyBzdW1tYXJ5OiBkZXN0cm95IHRoaXMgd2luZG93CisJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZSh0aGlzLmRvbU5vZGUpOworCQkJdGhpcy5kZXN0cm95KCk7CisJCX0sCisKKwkJb25Nb3VzZURvd246IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpIHsKKwkJCS8vIHN1bW1hcnk6IGNhbGxiYWNrIHdoZW4gdXNlciBjbGlja3MgYW55d2hlcmUgb24gdGhlIGZsb2F0aW5nIHBhbmUKKwkJCXRoaXMuYnJpbmdUb1RvcCgpOworCQl9LAorCisJCWJyaW5nVG9Ub3A6IGZ1bmN0aW9uKCkgeworCQkJLy8gc3VtbWFyeQorCQkJLy8JYWxsIHRoZSBmbG9hdGluZyBwYW5lcyBhcmUgc3RhY2tlZCBpbiB6LWluZGV4IG9yZGVyOyBicmluZyB0aGlzIGZsb2F0aW5nIHBhbmUgdG8gdGhlIHRvcCBvZiB0aGF0IHN0YWNrLAorCQkJLy8Jc28gdGhhdCBpdCdzIGRpc3BsYXllZCBpbiBmcm9udCBvZiBhbGwgdGhlIG90aGVyIGZsb2F0aW5nIHBhbmVzCisJCQl2YXIgZmxvYXRpbmdQYW5lcz0gZG9qby53aWRnZXQubWFuYWdlci5nZXRXaWRnZXRzQnlUeXBlKHRoaXMud2lkZ2V0VHlwZSk7CisJCQl2YXIgd2luZG93cyA9IFtdOworCQkJZm9yICh2YXIgeD0wOyB4PGZsb2F0aW5nUGFuZXMubGVuZ3RoOyB4KyspIHsKKwkJCQlpZiAodGhpcy53aWRnZXRJZCAhPSBmbG9hdGluZ1BhbmVzW3hdLndpZGdldElkKSB7CisJCQkJCQl3aW5kb3dzLnB1c2goZmxvYXRpbmdQYW5lc1t4XSk7CisJCQkJfQorCQkJfQorCisJCQl3aW5kb3dzLnNvcnQoZnVuY3Rpb24oYSxiKSB7CisJCQkJcmV0dXJuIGEuZG9tTm9kZS5zdHlsZS56SW5kZXggLSBiLmRvbU5vZGUuc3R5bGUuekluZGV4OworCQkJfSk7CisKKwkJCXdpbmRvd3MucHVzaCh0aGlzKTsKKworCQkJdmFyIGZsb2F0aW5nUGFuZVN0YXJ0aW5nWiA9IDEwMDsKKwkJCWZvciAoeD0wOyB4PHdpbmRvd3MubGVuZ3RoO3grKykgeworCQkJCXdpbmRvd3NbeF0uZG9tTm9kZS5zdHlsZS56SW5kZXggPSBmbG9hdGluZ1BhbmVTdGFydGluZ1ogKyB4KjI7CisJCQl9CisJCX0sCisKKwkJX3NldEluaXRpYWxXaW5kb3dTdGF0ZTogZnVuY3Rpb24oKSB7CisJCQlpZih0aGlzLmlzU2hvd2luZygpKXsKKwkJCQl0aGlzLndpZHRoPS0xOwkvLyBmb3JjZSByZXNpemUKKwkJCQl2YXIgbWIgPSBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSk7CisJCQkJdGhpcy5yZXNpemVUbyhtYi53aWR0aCwgbWIuaGVpZ2h0KTsKKwkJCX0KKwkJCWlmICh0aGlzLndpbmRvd1N0YXRlID09ICJtYXhpbWl6ZWQiKSB7CisJCQkJdGhpcy5tYXhpbWl6ZVdpbmRvdygpOworCQkJCXRoaXMuc2hvdygpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKHRoaXMud2luZG93U3RhdGU9PSJub3JtYWwiKSB7CisJCQkJdGhpcy5zaG93KCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAodGhpcy53aW5kb3dTdGF0ZT09Im1pbmltaXplZCIpIHsKKwkJCQl0aGlzLmhpZGUoKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXRoaXMud2luZG93U3RhdGU9Im1pbmltaXplZCI7CisJCX0sCisKKwkJX3Rhc2tCYXJTZXR1cDogZnVuY3Rpb24oKSB7CisJCQkvLyBzdW1tYXJ5OiBhZGQgaWNvbiB0byB0YXNrIGJhciwgY29ubmVjdGVkIHRvIG1lCisJCQl2YXIgdGFza2JhciA9IGRvam8ud2lkZ2V0LmdldFdpZGdldEJ5SWQodGhpcy50YXNrQmFySWQpOworCQkJaWYgKCF0YXNrYmFyKXsKKwkJCQlpZiAodGhpcy5fdGFza0JhckNvbm5lY3RBdHRlbXB0cyA8ICB0aGlzLl9tYXhfdGFza0JhckNvbm5lY3RBdHRlbXB0cykgeworCQkJCQlkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCB0aGlzLl90YXNrQmFyU2V0dXAsIDUwKTsKKwkJCQkJdGhpcy5fdGFza0JhckNvbm5lY3RBdHRlbXB0cysrOworCQkJCX0gZWxzZSB7CisJCQkJCWRvam8uZGVidWcoIlVuYWJsZSB0byBjb25uZWN0IHRvIHRoZSB0YXNrQmFyIik7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCXRhc2tiYXIuYWRkQ2hpbGQodGhpcyk7CisJCX0sCisKKwkJc2hvd0Zsb2F0aW5nUGFuZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwlicmluZyB0aGlzIGZsb2F0aW5nIHBhbmUgdG8gdGhlIHRvcAorCQkJdGhpcy5icmluZ1RvVG9wKCk7CisJCX0sCisKKwkJb25GbG9hdGluZ1BhbmVTaG93OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogY2FsbGJhY2sgZm9yIHdoZW4gc29tZW9uZSBjYWxscyBGbG9hdGluZ1BhbmUuc2hvdworCQkJdmFyIG1iID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUpOworCQkJdGhpcy5yZXNpemVUbyhtYi53aWR0aCwgbWIuaGVpZ2h0KTsKKwkJfSwKKworCQkvLyBzdW1tYXJ5OiBzZXQgdGhlIGZsb2F0aW5nIHBhbmUgdG8gdGhlIGdpdmVuIHNpemUKKwkJcmVzaXplVG86IGZ1bmN0aW9uKC8qSW50ZWdlciovIHdpZHRoLCAvKkludGVnZXIqLyBoZWlnaHQpeworCQkJZG9qby5odG1sLnNldE1hcmdpbkJveCh0aGlzLmRvbU5vZGUsIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9KTsKKworCQkJZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5kb21Ob2RlLAorCQkJCVsKKwkJCQkgIHtkb21Ob2RlOiB0aGlzLnRpdGxlQmFyLCBsYXlvdXRBbGlnbjogInRvcCJ9LAorCQkJCSAge2RvbU5vZGU6IHRoaXMucmVzaXplQmFyLCBsYXlvdXRBbGlnbjogImJvdHRvbSJ9LAorCQkJCSAge2RvbU5vZGU6IHRoaXMuY29udGFpbmVyTm9kZSwgbGF5b3V0QWxpZ246ICJjbGllbnQifQorCQkJCV0gKTsKKworCQkJLy8gSWYgYW55IG9mIHRoZSBjaGlsZHJlbiBoYXZlIGxheW91dEFsaWduIHNwZWNpZmllZCwgb2JleSBpdAorCQkJZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5jb250YWluZXJOb2RlLCB0aGlzLmNoaWxkcmVuLCAidG9wLWJvdHRvbSIpOworCisJCQl0aGlzLmJnSWZyYW1lLm9uUmVzaXplZCgpOworCQkJaWYodGhpcy5zaGFkb3cpeyB0aGlzLnNoYWRvdy5zaXplKHdpZHRoLCBoZWlnaHQpOyB9CisJCQl0aGlzLm9uUmVzaXplZCgpOworCQl9LAorCisJCWNoZWNrU2l6ZTogZnVuY3Rpb24oKSB7CisJCQkvLyBzdW1tYXJ5CisJCQkvLwljaGVja1NpemUoKSBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgcmVzaXplZCB0aGUgYnJvd3NlciB3aW5kb3csCisJCQkvLyAJYnV0IHRoYXQgZG9lc24ndCBhZmZlY3QgdGhpcyB3aWRnZXQgKG9yIHRoaXMgd2lkZ2V0J3MgY2hpbGRyZW4pCisJCQkvLyAJc28gaXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLi4uCisJCQkvLyBUT0RPOiB1bmxlc3Mgd2UgYXJlIG1heGltaXplZC4gIHRoZW4gd2Ugc2hvdWxkIHJlc2l6ZSBvdXJzZWxmLgorCQl9LAorCQlkZXN0cm95RmxvYXRpbmdQYW5lOiBmdW5jdGlvbigpIHsKKwkJCWlmKHRoaXMucmVzaXplSGFuZGxlKXsKKwkJCQl0aGlzLnJlc2l6ZUhhbmRsZS5kZXN0cm95KCk7CisJCQkJdGhpcy5yZXNpemVIYW5kbGUgPSBudWxsOworCQkJfQorCQl9CisJfQorKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorCSJkb2pvLndpZGdldC5GbG9hdGluZ1BhbmUiLAorCVtkb2pvLndpZGdldC5Db250ZW50UGFuZSwgZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lQmFzZV0sCit7CisJLy8gc3VtbWFyeQorCS8vCUEgbm9uLW1vZGFsIGZsb2F0aW5nIHdpbmRvdy4KKwkvLwlBdHRhY2hlcyB0byBhIFRhc2tiYXIgd2hpY2ggaGFzIGFuIGljb24gZm9yIGVhY2ggd2luZG93LgorCS8vCU11c3Qgc3BlY2lmeSBzaXplIChsaWtlIHN0eWxlPSJ3aWR0aDogNTAwcHg7IGhlaWdodDogNTAwcHg7IiksCisKKwlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oYXJncywgZnJhZyl7CisJCXRoaXMuZmlsbEluRmxvYXRpbmdQYW5lVGVtcGxhdGUoYXJncywgZnJhZyk7CisJCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJfSwKKwlwb3N0Q3JlYXRlOiBmdW5jdGlvbigpeworCQlkb2pvLndpZGdldC5GbG9hdGluZ1BhbmVCYXNlLnByb3RvdHlwZS5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LAorCXNob3c6IGZ1bmN0aW9uKCl7CisJCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLnNob3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJdGhpcy5zaG93RmxvYXRpbmdQYW5lKCk7CisJfSwKKwlvblNob3c6IGZ1bmN0aW9uKCl7CisJCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLm9uU2hvdy5jYWxsKHRoaXMpOworCQl0aGlzLm9uRmxvYXRpbmdQYW5lU2hvdygpOworCX0sCisJZGVzdHJveTogZnVuY3Rpb24oKXsKKwkJdGhpcy5kZXN0cm95RmxvYXRpbmdQYW5lKCk7CisJCWRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9Cit9KTsKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0Lk1vZGFsRmxvYXRpbmdQYW5lIiwKKwlbZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lLCBkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2VdLAorCXsKKwkJLy8gc3VtbWFyeQorCQkvLwlBIG1vZGFsIGZsb2F0aW5nIHdpbmRvdy4KKwkJLy8JVGhpcyB3aWRnZXQgaXMgc2ltaWxhciB0byB0aGUgRGlhbG9nIHdpZGdldCwgYnV0IHRoZSB3aW5kb3csIHVubGlrZSB0aGUgRGlhbG9nLCBjYW4gYmUgbW92ZWQuCisJCS8vCU11c3Qgc3BlY2lmeSBzaXplIChsaWtlIHN0eWxlPSJ3aWR0aDogNTAwcHg7IGhlaWdodDogNTAwcHg7IiksCisKKwkJd2luZG93U3RhdGU6ICJtaW5pbWl6ZWQiLAorCQlkaXNwbGF5Q2xvc2VBY3Rpb246IHRydWUsCisJCXBvc3RDcmVhdGU6IGZ1bmN0aW9uKCl7CisJCQlkb2pvLndpZGdldC5Nb2RhbERpYWxvZ0Jhc2UucHJvdG90eXBlLnBvc3RDcmVhdGUuY2FsbCh0aGlzKTsKKwkJCWRvam8ud2lkZ2V0Lk1vZGFsRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5jYWxsKHRoaXMpOworCQl9LAorCQlzaG93OiBmdW5jdGlvbigpeworCQkJdGhpcy5zaG93TW9kYWxEaWFsb2coKTsKKwkJCWRvam8ud2lkZ2V0Lk1vZGFsRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3Muc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJLy9wbGFjZSB0aGUgYmFja2dyb3VuZCBkaXYgdW5kZXIgdGhpcyBtb2RhbCBwYW5lCisJCQl0aGlzLmJnLnN0eWxlLnpJbmRleCA9IHRoaXMuZG9tTm9kZS5zdHlsZS56SW5kZXgtMTsKKwkJfSwKKwkJaGlkZTogZnVuY3Rpb24oKXsKKwkJCXRoaXMuaGlkZU1vZGFsRGlhbG9nKCk7CisJCQlkb2pvLndpZGdldC5Nb2RhbEZsb2F0aW5nUGFuZS5zdXBlcmNsYXNzLmhpZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfSwKKwkJY2xvc2VXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLmhpZGUoKTsKKwkJCWRvam8ud2lkZ2V0Lk1vZGFsRmxvYXRpbmdQYW5lLnN1cGVyY2xhc3MuY2xvc2VXaW5kb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0KKyk7CisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5BbHdheXNTaG93VG9vbGJhciIpOworCisvL2Rvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLnJlZ2lzdGVyUGVySW5zdGFuY2VQbHVnaW4oImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uQWx3YXlzU2hvd1Rvb2xiYXIiKTsKKworZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUoImRvam8ud2lkZ2V0LkVkaXRvcjI6Om9uTG9hZCIsIGZ1bmN0aW9uKGVkaXRvcil7CisJaWYoZWRpdG9yLnRvb2xiYXJBbHdheXNWaXNpYmxlKXsKKwkJdmFyIHAgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5BbHdheXNTaG93VG9vbGJhcihlZGl0b3IpOworCX0KK30pOworZG9qby5kZWNsYXJlKCJkb2pvLndpZGdldC5FZGl0b3IyUGx1Z2luLkFsd2F5c1Nob3dUb29sYmFyIiwgbnVsbCwKKwlmdW5jdGlvbihlZGl0b3IpeworCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKKwkJdGhpcy5lZGl0b3IucmVnaXN0ZXJMb2FkZWRQbHVnaW4odGhpcyk7CisJCXRoaXMuc2V0dXAoKTsKKwl9LAorCXsKKwlfc2Nyb2xsU2V0VXA6IGZhbHNlLAorCV9maXhFbmFibGVkOiBmYWxzZSwKKwlfc2Nyb2xsVGhyZXNob2xkOiBmYWxzZSwKKwlfaGFuZGxlU2Nyb2xsOiB0cnVlLAorCisJc2V0dXA6IGZ1bmN0aW9uKCl7CisJCXZhciB0ZG4gPSB0aGlzLmVkaXRvci50b29sYmFyV2lkZ2V0OworCQlpZighdGRuLnRiQmdJZnJhbWUpeworCQkJdGRuLnRiQmdJZnJhbWUgPSBuZXcgZG9qby5odG1sLkJhY2tncm91bmRJZnJhbWUodGRuLmRvbU5vZGUpOworCQkJdGRuLnRiQmdJZnJhbWUub25SZXNpemVkKCk7CisJCX0KKwkJdGhpcy5zY3JvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiZ2xvYmFsT25TY3JvbGxIYW5kbGVyIiksIDEwMCk7CisKKwkJZG9qby5ldmVudC5jb25uZWN0KCJiZWZvcmUiLCB0aGlzLmVkaXRvci50b29sYmFyV2lkZ2V0LCAiZGVzdHJveSIsIHRoaXMsICJkZXN0cm95Iik7CisJfSwKKworCWdsb2JhbE9uU2Nyb2xsSGFuZGxlcjogZnVuY3Rpb24oKXsKKwkJdmFyIGlzSUUgPSBkb2pvLnJlbmRlci5odG1sLmllOworCQlpZighdGhpcy5faGFuZGxlU2Nyb2xsKXsgcmV0dXJuOyB9CisJCXZhciBkaCA9IGRvam8uaHRtbDsKKwkJdmFyIHRkbiA9IHRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQuZG9tTm9kZTsKKwkJdmFyIGRiID0gZG9qby5ib2R5KCk7CisKKwkJaWYoIXRoaXMuX3Njcm9sbFNldFVwKXsKKwkJCXRoaXMuX3Njcm9sbFNldFVwID0gdHJ1ZTsKKwkJCXZhciBlZGl0b3JXaWR0aCA9ICBkaC5nZXRNYXJnaW5Cb3godGhpcy5lZGl0b3IuZG9tTm9kZSkud2lkdGg7IAorCQkJdGhpcy5fc2Nyb2xsVGhyZXNob2xkID0gZGguYWJzKHRkbiwgdHJ1ZSkueTsKKwkJCS8vIGRvam8uZGVidWcoInRocmVzaG9sZDoiLCB0aGlzLl9zY3JvbGxUaHJlc2hvbGQpOworCQkJaWYoKGlzSUUpJiYoZGIpJiYoZGguZ2V0U3R5bGUoZGIsICJiYWNrZ3JvdW5kLWltYWdlIik9PSJub25lIikpeworCQkJCXdpdGgoZGIuc3R5bGUpeworCQkJCQliYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKCIgKyBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvYmxhbmsuZ2lmIikgKyAiKSI7CisJCQkJCWJhY2tncm91bmRBdHRhY2htZW50ID0gImZpeGVkIjsKKwkJCQl9CisJCQl9CisJCX0KKworCQl2YXIgc2Nyb2xsUG9zID0gKHdpbmRvd1sicGFnZVlPZmZzZXQiXSkgPyB3aW5kb3dbInBhZ2VZT2Zmc2V0Il0gOiAoZG9jdW1lbnRbImRvY3VtZW50RWxlbWVudCJdfHxkb2N1bWVudFsiYm9keSJdKS5zY3JvbGxUb3A7CisKKwkJLy8gRklYTUU6IG5lZWQgdG8gaGF2ZSB0b3AgYW5kIGJvdHRvbSB0aHJlc2hvbGRzIHNvIHRvb2xiYXIgZG9lc24ndCBrZWVwIHNjcm9sbGluZyBwYXN0IHRoZSBib3R0b20KKwkJaWYoc2Nyb2xsUG9zID4gdGhpcy5fc2Nyb2xsVGhyZXNob2xkKXsKKwkJCS8vIGRvam8uZGVidWcoc2Nyb2xsUG9zKTsKKwkJCWlmKCF0aGlzLl9maXhFbmFibGVkKXsKKwkJCQl2YXIgdGRuYm94ID0gZG9qby5odG1sLmdldE1hcmdpbkJveCh0ZG4pOworCQkJCXRoaXMuZWRpdG9yLmVkaXRvck9iamVjdC5zdHlsZS5tYXJnaW5Ub3AgPSB0ZG5ib3guaGVpZ2h0KyJweCI7CisKKwkJCQlpZihpc0lFKXsKKwkJCQkJLy8gRklYTUU6IHNob3VsZCB3ZSBqdXN0IHVzZSBzZXRCZWh2aW9yKCkgaGVyZSBpbnN0ZWFkPworCQkJCQl0ZG4uc3R5bGUubGVmdCA9IGRvam8uaHRtbC5hYnModGRuLCBkb2pvLmh0bWwuYm94U2l6aW5nLk1BUkdJTl9CT1gpLng7CisJCQkJCWlmKHRkbi5wcmV2aW91c1NpYmxpbmcpeworCQkJCQkJdGhpcy5fSUVPcmlnaW5hbFBvcyA9IFsnYWZ0ZXInLHRkbi5wcmV2aW91c1NpYmxpbmddOworCQkJCQl9ZWxzZSBpZih0ZG4ubmV4dFNpYmxpbmcpeworCQkJCQkJdGhpcy5fSUVPcmlnaW5hbFBvcyA9IFsnYmVmb3JlJyx0ZG4ubmV4dFNpYmxpbmddOworCQkJCQl9ZWxzZXsKKwkJCQkJCXRoaXMuX0lFT3JpZ2luYWxQb3MgPSBbJycsdGRuLnBhcmVudE5vZGVdOworCQkJCQl9CisJCQkJCWRvam8uYm9keSgpLmFwcGVuZENoaWxkKHRkbik7CisKKwkJCQkJZG9qby5odG1sLmFkZENsYXNzKHRkbiwgIklFRml4ZWRUb29sYmFyIik7CisJCQkJfWVsc2V7CisJCQkJCXdpdGgodGRuLnN0eWxlKXsKKwkJCQkJCXBvc2l0aW9uID0gImZpeGVkIjsKKwkJCQkJCXRvcCA9ICIwcHgiOworCQkJCQl9CisJCQkJfQorCisJCQkJdGRuLnN0eWxlLndpZHRoID0gdGRuYm94LndpZHRoICsgInB4IjsKKwkJCQl0ZG4uc3R5bGUuekluZGV4ID0gMTAwMDsKKwkJCQl0aGlzLl9maXhFbmFibGVkID0gdHJ1ZTsKKwkJCX0KKwkJCS8vIGlmIHdlJ3JlIHNob3dpbmcgdGhlIGZsb2F0aW5nIHRvb2xiYXIsIG1ha2Ugc3VyZSB0aGF0IGlmCisJCQkvLyB3ZSd2ZSBzY3JvbGxlZCBwYXN0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvciB0aGF0IHdlIGhpZGUKKwkJCS8vIHRoZSB0b29sYmFyIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSBlZGl0b3IuCisKKwkJCS8vIFRPRE86IHdoZW4gd2UgZ2V0IG11bHRpcGxlIGVkaXRvciB0b29sYmFyIHN1cHBvcnQgd29ya2luZworCQkJLy8gY29ycmVjdGx5LCBlbnN1cmUgdGhhdCB3ZSBjaGVjayB0aGlzIGFnYWluc3QgdGhlIHNjcm9sbAorCQkJLy8gcG9zaXRpb24gb2YgdGhlIGJvdHRvbS1tb3N0IGVkaXRvciBpbnN0YW5jZS4KKwkJCWlmKCFkb2pvLnJlbmRlci5odG1sLnNhZmFyaSl7CisJCQkJLy8gc2FmYXJpIHJlcG9ydHMgYSBidW5jaCBvZiB0aGluZ3MgaW5jb3JyZWN0bHkgaGVyZQorCQkJCXZhciBlSGVpZ2h0ID0gKHRoaXMuaGVpZ2h0KSA/IHBhcnNlSW50KHRoaXMuZWRpdG9yLmhlaWdodCkgOiB0aGlzLmVkaXRvci5fbGFzdEhlaWdodDsKKwkJCQlpZihzY3JvbGxQb3MgPiAodGhpcy5fc2Nyb2xsVGhyZXNob2xkK2VIZWlnaHQpKXsKKwkJCQkJdGRuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQkJfWVsc2V7CisJCQkJCXRkbi5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQkJfQorCQkJfQorCQl9ZWxzZSBpZih0aGlzLl9maXhFbmFibGVkKXsKKwkJCSh0aGlzLmVkaXRvci5vYmplY3QgfHwgdGhpcy5lZGl0b3IuaWZyYW1lKS5zdHlsZS5tYXJnaW5Ub3AgPSBudWxsOworCQkJd2l0aCh0ZG4uc3R5bGUpeworCQkJCXBvc2l0aW9uID0gIiI7CisJCQkJdG9wID0gIiI7CisJCQkJekluZGV4ID0gIiI7CisJCQkJZGlzcGxheSA9ICIiOworCQkJfQorCQkJaWYoaXNJRSl7CisJCQkJdGRuLnN0eWxlLmxlZnQgPSAiIjsKKwkJCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGRuLCAiSUVGaXhlZFRvb2xiYXIiKTsKKwkJCQlpZih0aGlzLl9JRU9yaWdpbmFsUG9zKXsKKwkJCQkJZG9qby5odG1sLmluc2VydEF0UG9zaXRpb24odGRuLCB0aGlzLl9JRU9yaWdpbmFsUG9zWzFdLCB0aGlzLl9JRU9yaWdpbmFsUG9zWzBdKTsKKwkJCQkJdGhpcy5fSUVPcmlnaW5hbFBvcyA9IG51bGw7CisJCQkJfWVsc2V7CisJCQkJCWRvam8uaHRtbC5pbnNlcnRCZWZvcmUodGRuLCB0aGlzLmVkaXRvci5vYmplY3R8fHRoaXMuZWRpdG9yLmlmcmFtZSk7CisJCQkJfQorCQkJfQorCQkJdGRuLnN0eWxlLndpZHRoID0gIiI7CisJCQl0aGlzLl9maXhFbmFibGVkID0gZmFsc2U7CisJCX0KKwl9LAorCisJZGVzdHJveTogZnVuY3Rpb24oKXsKKwkJdGhpcy5fSUVPcmlnaW5hbFBvcyA9IG51bGw7CisJCXRoaXMuX2hhbmRsZVNjcm9sbCA9IGZhbHNlOworCQljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWwpOworCQl0aGlzLmVkaXRvci51bnJlZ2lzdGVyTG9hZGVkUGx1Z2luKHRoaXMpOworCisJCWlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuZWRpdG9yLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSwgIklFRml4ZWRUb29sYmFyIik7CisJCX0KKwl9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5FZGl0b3IyIik7CisKKworCisKKworCitkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlciA9IG5ldyBkb2pvLndpZGdldC5IYW5kbGVyTWFuYWdlcjsKK2Rvam8ubGFuZy5taXhpbihkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlciwKK3sKKwkvLyBzdW1tYXJ5OiBNYW5hZ2VyIG9mIGN1cnJlbnQgZm9jdXNlZCBFZGl0b3IyIEluc3RhbmNlIGFuZCBhdmFpbGFibGUgZWRpdG9yMiBjb21tYW5kcworCisJX2N1cnJlbnRJbnN0YW5jZTogbnVsbCwKKworCS8vIGNvbW1hbmRTdGF0ZTogT2JqZWN0OiBzdGF0ZSBhIGNvbW1hbmQgbWF5IGJlIGluCisJY29tbWFuZFN0YXRlOiB7RGlzYWJsZWQ6IDAsIExhdGNoZWQ6IDEsIEVuYWJsZWQ6IDJ9LAorCisJZ2V0Q3VycmVudEluc3RhbmNlOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBSZXR1cm4gdGhlIGN1cnJlbnQgZm9jdXNlZCBFZGl0b3IyIGluc3RhbmNlCisJCXJldHVybiB0aGlzLl9jdXJyZW50SW5zdGFuY2U7CisJfSwKKwlzZXRDdXJyZW50SW5zdGFuY2U6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki9pbnN0KXsKKwkJLy8gc3VtbWFyeTogU2V0IGN1cnJlbnQgZm9jdXNlZCBFZGl0b3IyIGluc3RhbmNlCisJCXRoaXMuX2N1cnJlbnRJbnN0YW5jZSA9IGluc3Q7CisJfSwKKwlnZXRDb21tYW5kOiBmdW5jdGlvbigvKmRvam8ud2lkZ2V0LkVkaXRvcjIqL2VkaXRvciwvKlN0cmluZyovbmFtZSl7CisJCS8vIHN1bW1hcnk6IFJldHVybiBFZGl0b3IyIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorCQkvLyBuYW1lOiBuYW1lIG9mIHRoZSBjb21tYW5kIChjYXNlIGluc2Vuc2l0aXZlKQorCQl2YXIgb0NvbW1hbmQ7CisJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCWZvcih2YXIgaT0wO2k8dGhpcy5fcmVnaXN0ZXJlZEhhbmRsZXJzLmxlbmd0aDtpKyspeworCQkJb0NvbW1hbmQgPSB0aGlzLl9yZWdpc3RlcmVkSGFuZGxlcnNbaV0oZWRpdG9yLCBuYW1lKTsKKwkJCWlmKG9Db21tYW5kKXsKKwkJCQlyZXR1cm4gb0NvbW1hbmQ7CisJCQl9CisJCX0KKwkJc3dpdGNoKG5hbWUpeworCQkJY2FzZSAnaHRtbHRvZ2dsZSc6CisJCQkJLy9FZGl0b3IyIG5hdGl2ZWx5IHByb3ZpZGUgdGhlIGh0bWx0b2dnbGUgZnVuY3Rpb25hbGl0aXR5CisJCQkJLy9hbmQgaXQgaXMgdHJlYXRlZCBhcyBhIGJ1aWx0aW4gY29tbWFuZAorCQkJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZChlZGl0b3IsIG5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZm9ybWF0YmxvY2snOgorCQkJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJGb3JtYXRCbG9ja0NvbW1hbmQoZWRpdG9yLCBuYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2FuY2hvcic6CisJCQkJb0NvbW1hbmQgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQoZWRpdG9yLCBuYW1lKTsKKwkJCQlicmVhazsKKworCQkJLy9kaWFsb2cgY29tbWFuZAorCQkJY2FzZSAnY3JlYXRlbGluayc6CisJCQkJb0NvbW1hbmQgPSBuZXcgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQoZWRpdG9yLCBuYW1lLAorCQkJCQkJe2NvbnRlbnRGaWxlOiAiZG9qby53aWRnZXQuRWRpdG9yMlBsdWdpbi5DcmVhdGVMaW5rRGlhbG9nIiwKKwkJCQkJCQljb250ZW50Q2xhc3M6ICJFZGl0b3IyQ3JlYXRlTGlua0RpYWxvZyIsCisJCQkJCQkJdGl0bGU6ICJJbnNlcnQvRWRpdCBMaW5rIiwgd2lkdGg6ICIzMDBweCIsIGhlaWdodDogIjIwMHB4In0pOworCQkJCWJyZWFrOworCQkJY2FzZSAnaW5zZXJ0aW1hZ2UnOgorCQkJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kKGVkaXRvciwgbmFtZSwKKwkJCQkJCXtjb250ZW50RmlsZTogImRvam8ud2lkZ2V0LkVkaXRvcjJQbHVnaW4uSW5zZXJ0SW1hZ2VEaWFsb2ciLAorCQkJCQkJCWNvbnRlbnRDbGFzczogIkVkaXRvcjJJbnNlcnRJbWFnZURpYWxvZyIsCisJCQkJCQkJdGl0bGU6ICJJbnNlcnQvRWRpdCBJbWFnZSIsIHdpZHRoOiAiNDAwcHgiLCBoZWlnaHQ6ICIyNzBweCJ9KTsKKwkJCQlicmVhazsKKwkJCS8vIEJ5IGRlZmF1bHQgd2UgYXNzdW1lIHRoYXQgaXQgaXMgYSBidWlsdGluIHNpbXBsZSBjb21tYW5kLgorCQkJZGVmYXVsdDoKKwkJCQl2YXIgY3VydEluc3QgPSB0aGlzLmdldEN1cnJlbnRJbnN0YW5jZSgpOworCQkJCWlmKChjdXJ0SW5zdCAmJiBjdXJ0SW5zdC5xdWVyeUNvbW1hbmRBdmFpbGFibGUobmFtZSkpIHx8CisJCQkJCSghY3VydEluc3QgJiYgZG9qby53aWRnZXQuRWRpdG9yMi5wcm90b3R5cGUucXVlcnlDb21tYW5kQXZhaWxhYmxlKG5hbWUpKSl7CisJCQkJCW9Db21tYW5kID0gbmV3IGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZChlZGl0b3IsIG5hbWUpOworCQkJCX1lbHNleworCQkJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDb21tYW5kOiBVbmtub3duIGNvbW1hbmQgIituYW1lKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJfQorCQlyZXR1cm4gb0NvbW1hbmQ7CisJfSwKKwlkZXN0cm95OiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5OiBDbGVhbmluZyB1cC4gVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBvbiBwYWdlIHVubG9hZC4KKwkJdGhpcy5fY3VycmVudEluc3RhbmNlID0gbnVsbDsKKwkJZG9qby53aWRnZXQuSGFuZGxlck1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKKwl9Cit9KTsKKworZG9qby5hZGRPblVubG9hZChkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlciwgImRlc3Ryb3kiKTsKKworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kIixudWxsLAorCWZ1bmN0aW9uKGVkaXRvcixuYW1lKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCWRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgY29tbWFuZHMgaW4gRWRpdG9yMgorCisJCXRoaXMuX2VkaXRvciA9IGVkaXRvcjsKKwkJdGhpcy5fdXBkYXRlVGltZSA9IDA7CisJCXRoaXMuX25hbWUgPSBuYW1lOworCX0sCit7CisJCV90ZXh0OiAnVW5rbm93bicsCisJCWV4ZWN1dGU6IGZ1bmN0aW9uKHBhcmEpeworCQkJLy8gc3VtbWFyeTogRXhlY3V0ZSB0aGUgY29tbWFuZC4gc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzCisJCQkvLyBkZXNjcmlwdGlvbjogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MKKwkJCWRvam8udW5pbXBsZW1lbnRlZCgiZG9qby53aWRnZXQuRWRpdG9yMkNvbW1hbmQuZXhlY3V0ZSIpOworCQl9LAorCQlnZXRUZXh0OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogcmV0dXJuIHRoZSB0ZXh0IG5hbWUgb2YgdGhpcyBjb21tYW5kCisJCQlyZXR1cm4gdGhpcy5fdGV4dDsKKwkJfSwKKwkJZ2V0U3RhdGU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCVJldHVybiB0aGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCisJCQkvLwkJdG8gYWx3YXlzIHJldHVybiBFbmFibGVkCisJCQlyZXR1cm4gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkVuYWJsZWQ7CisJCX0sCisJCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBEZXN0cnVjdG9yCisJCX0KKwl9CispOworCitkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmROYW1lcz17CisJCQknYm9sZCc6ICdCb2xkJywKKwkJCSdjb3B5JzogJ0NvcHknLAorCQkJJ2N1dCc6ICdDdXQnLAorCQkJJ0RlbGV0ZSc6ICdEZWxldGUnLAorCQkJJ2luZGVudCc6ICdJbmRlbnQnLAorCQkJJ2luc2VydGhvcml6b250YWxydWxlJzogJ0hvcml6ZW50YWwgUnVsZScsCisJCQknaW5zZXJ0b3JkZXJlZGxpc3QnOiAnTnVtYmVyZWQgTGlzdCcsCisJCQknaW5zZXJ0dW5vcmRlcmVkbGlzdCc6ICdCdWxsZXQgTGlzdCcsCisJCQknaXRhbGljJzogJ0l0YWxpYycsCisJCQknanVzdGlmeWNlbnRlcic6ICdBbGlnbiBDZW50ZXInLAorCQkJJ2p1c3RpZnlmdWxsJzogJ0p1c3RpZnknLAorCQkJJ2p1c3RpZnlsZWZ0JzogJ0FsaWduIExlZnQnLAorCQkJJ2p1c3RpZnlyaWdodCc6ICdBbGlnbiBSaWdodCcsCisJCQknb3V0ZGVudCc6ICdPdXRkZW50JywKKwkJCSdwYXN0ZSc6ICdQYXN0ZScsCisJCQkncmVkbyc6ICdSZWRvJywKKwkJCSdyZW1vdmVmb3JtYXQnOiAnUmVtb3ZlIEZvcm1hdCcsCisJCQknc2VsZWN0YWxsJzogJ1NlbGVjdCBBbGwnLAorCQkJJ3N0cmlrZXRocm91Z2gnOiAnU3RyaWtldGhyb3VnaCcsCisJCQknc3Vic2NyaXB0JzogJ1N1YnNjcmlwdCcsCisJCQknc3VwZXJzY3JpcHQnOiAnU3VwZXJzY3JpcHQnLAorCQkJJ3VuZGVybGluZSc6ICdVbmRlcmxpbmUnLAorCQkJJ3VuZG8nOiAnVW5kbycsCisJCQkndW5saW5rJzogJ1JlbW92ZSBMaW5rJywKKwkJCSdjcmVhdGVsaW5rJzogJ0NyZWF0ZSBMaW5rJywKKwkJCSdpbnNlcnRpbWFnZSc6ICdJbnNlcnQgSW1hZ2UnLAorCQkJJ2h0bWx0b2dnbGUnOiAnSFRNTCBTb3VyY2UnLAorCQkJJ2ZvcmVjb2xvcic6ICdGb3JlZ3JvdW5kIENvbG9yJywKKwkJCSdoaWxpdGVjb2xvcic6ICdCYWNrZ3JvdW5kIENvbG9yJywKKwkJCSdwbGFpbmZvcm1hdGJsb2NrJzogJ1BhcmFncmFwaCBTdHlsZScsCisJCQknZm9ybWF0YmxvY2snOiAnUGFyYWdyYXBoIFN0eWxlJywKKwkJCSdmb250c2l6ZSc6ICdGb250IFNpemUnLAorCQkJJ2ZvbnRuYW1lJzogJ0ZvbnQgTmFtZScvLywKKy8vCQkJJ2luc2VydHRhYmxlJzogJ0luc2VydCBUYWJsZScsCisvLwkJCSdpbnNlcnRjZWxsJzoKKy8vCQkJJ2luc2VydGNvbCc6CisvLwkJCSdpbnNlcnRyb3cnOgorLy8JCQknZGVsZXRlY2VsbHMnOgorLy8JCQknZGVsZXRlY29scyc6CisvLwkJCSdkZWxldGVyb3dzJzoKKy8vCQkJJ21lcmdlY2VsbHMnOgorLy8JCQknc3BsaXRjZWxsJzoKKy8vCQkJJ2luc2VydGh0bWwnOgorLy8JCQknYmxvY2tkaXJsdHInOgorLy8JCQknYmxvY2tkaXJydGwnOgorLy8JCQknZGlybHRyJzoKKy8vCQkJJ2RpcnJ0bCc6CisvLwkJCSdpbmxpbmVkaXJsdHInOgorLy8JCQknaW5saW5lZGlycnRsJzoKK30KKworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZCIsIGRvam8ud2lkZ2V0LkVkaXRvcjJDb21tYW5kLCAKKwlmdW5jdGlvbihlZGl0b3IsbmFtZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgYnJvd3NlciBidWlsdAorCQkvLwkJaW4gY29tbWFuZHMKKworCQl2YXIgdGV4dCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJCcm93c2VyQ29tbWFuZE5hbWVzW25hbWUudG9Mb3dlckNhc2UoKV07CisJCWlmKHRleHQpeworCQkJdGhpcy5fdGV4dCA9IHRleHQ7CisJCX0KKwl9LAoreworCQlleGVjdXRlOiBmdW5jdGlvbihwYXJhKXsKKwkJCXRoaXMuX2VkaXRvci5leGVjQ29tbWFuZCh0aGlzLl9uYW1lLCBwYXJhKTsKKwkJfSwKKwkJZ2V0U3RhdGU6IGZ1bmN0aW9uKCl7CisJCQlpZih0aGlzLl9lZGl0b3IuX2xhc3RTdGF0ZVRpbWVzdGFtcCA+IHRoaXMuX3VwZGF0ZVRpbWUgfHwgdGhpcy5fc3RhdGUgPT0gdW5kZWZpbmVkKXsKKwkJCQl0aGlzLl91cGRhdGVUaW1lID0gdGhpcy5fZWRpdG9yLl9sYXN0U3RhdGVUaW1lc3RhbXA7CisJCQkJdHJ5eworCQkJCQlpZih0aGlzLl9lZGl0b3IucXVlcnlDb21tYW5kRW5hYmxlZCh0aGlzLl9uYW1lKSl7CisJCQkJCQlpZih0aGlzLl9lZGl0b3IucXVlcnlDb21tYW5kU3RhdGUodGhpcy5fbmFtZSkpeworCQkJCQkJCXRoaXMuX3N0YXRlID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkxhdGNoZWQ7CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQl0aGlzLl9zdGF0ZSA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmNvbW1hbmRTdGF0ZS5FbmFibGVkOworCQkJCQkJfQorCQkJCQl9ZWxzZXsKKwkJCQkJCXRoaXMuX3N0YXRlID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuY29tbWFuZFN0YXRlLkRpc2FibGVkOworCQkJCQl9CisJCQkJfWNhdGNoIChlKSB7CisJCQkJCS8vZG9qby5kZWJ1ZygiZXhjZXB0aW9uIHdoZW4gZ2V0dGluZyBzdGF0ZSBmb3IgY29tbWFuZCAiK3RoaXMuX25hbWUrIjogIitlKTsKKwkJCQkJdGhpcy5fc3RhdGUgPSBkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5jb21tYW5kU3RhdGUuRW5hYmxlZDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdGhpcy5fc3RhdGU7CisJCX0sCisJCWdldFZhbHVlOiBmdW5jdGlvbigpeworCQkJdHJ5eworCQkJCXJldHVybiB0aGlzLl9lZGl0b3IucXVlcnlDb21tYW5kVmFsdWUodGhpcy5fbmFtZSk7CisJCQl9Y2F0Y2goZSl7fQorCQl9CisJfQorKTsKKworZG9qby5sYW5nLmRlY2xhcmUoImRvam8ud2lkZ2V0LkVkaXRvcjJGb3JtYXRCbG9ja0NvbW1hbmQiLCBkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQsIHsKKwkJLyogSW4gbm9uZS1BY3RpdmVYIG1vZGUgdW5kZXIgSUUsIDxwPiBhbmQgbm8gPHA+IHRleHQgY2FuIG5vdCBiZSBkaXN0aW5ndWlzaGVkCisJCWdldEN1cnJlbnRWYWx1ZTogZnVuY3Rpb24oKXsKKwkJCXZhciBjdXJJbnN0ID0gZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCk7CisJCQlpZighY3VySW5zdCl7IHJldHVybiAnJzsgfQorCisJCQl2YXIgaCA9IGRvam8ucmVuZGVyLmh0bWw7CisKKwkJCS8vIHNhZmFyaSBmJ3MgdXMgZm9yIHNlbGVjdGlvbiBwcmltaXRpdmVzCisJCQlpZihoLnNhZmFyaSl7IHJldHVybiAnJzsgfQorCisJCQl2YXIgc2VsZWN0ZWROb2RlID0gKGguaWUpID8gY3VySW5zdC5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5wYXJlbnRFbGVtZW50KCkgOiBjdXJJbnN0LndpbmRvdy5nZXRTZWxlY3Rpb24oKS5hbmNob3JOb2RlOworCQkJLy8gbWFrZSBzdXJlIHdlIGFjdHVhbGwgaGF2ZSBhbiBlbGVtZW50CisJCQl3aGlsZSgoc2VsZWN0ZWROb2RlKSYmKHNlbGVjdGVkTm9kZS5ub2RlVHlwZSAhPSAxKSl7CisJCQkJc2VsZWN0ZWROb2RlID0gc2VsZWN0ZWROb2RlLnBhcmVudE5vZGU7CisJCQl9CisJCQlpZighc2VsZWN0ZWROb2RlKXsgcmV0dXJuICcnOyB9CisKKwkJCXZhciBmb3JtYXRzID0gWyJwIiwgInByZSIsICJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiIsICJhZGRyZXNzIl07CisJCQkvLyBnb3R0YSBydW4gc29tZSBzcGVjaWFsaXplZCB1cGRhdGVzIGZvciB0aGUgdmFyaW91cworCQkJLy8gZm9ybWF0dGluZyBvcHRpb25zCisJCQl2YXIgdHlwZSA9IGZvcm1hdHNbZG9qby5sYW5nLmZpbmQoZm9ybWF0cywgc2VsZWN0ZWROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpXTsKKwkJCXdoaWxlKChzZWxlY3RlZE5vZGUhPWN1ckluc3QuZWRpdE5vZGUpJiYoIXR5cGUpKXsKKwkJCQlzZWxlY3RlZE5vZGUgPSBzZWxlY3RlZE5vZGUucGFyZW50Tm9kZTsKKwkJCQlpZighc2VsZWN0ZWROb2RlKXsgYnJlYWs7IH0KKwkJCQl0eXBlID0gZm9ybWF0c1tkb2pvLmxhbmcuZmluZChmb3JtYXRzLCBzZWxlY3RlZE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSldOworCQkJfQorCQkJaWYoIXR5cGUpeworCQkJCXR5cGUgPSAiIjsKKwkJCX0KKwkJCXJldHVybiB0eXBlOworCQl9Ki8KKwl9CispOworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZyIsCisJW2Rvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGRvam8ud2lkZ2V0LkZsb2F0aW5nUGFuZUJhc2UsIGRvam8ud2lkZ2V0Lk1vZGFsRGlhbG9nQmFzZV0sCisJeworCQkvLyBzdW1tYXJ5OgorCQkvLwkJUHJvdmlkZXMgYSBEaWFsb2cgd2hpY2ggY2FuIGJlIG1vZGFsIG9yIG5vcm1hbCBmb3IgdGhlIEVkaXRvcjIuCisKKwkJdGVtcGxhdGVTdHJpbmc6IjxkaXYgaWQ9XCIke3RoaXMud2lkZ2V0SWR9XCIgY2xhc3M9XCJkb2pvRmxvYXRpbmdQYW5lXCI+XHJcblx0PHNwYW4gZG9qb2F0dGFjaHBvaW50PVwidGFiU3RhcnRPdXRlclwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCJcdHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cclxuXHQ8c3BhbiBkb2pvYXR0YWNocG9pbnQ9XCJ0YWJTdGFydFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwidGl0bGVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhclwiICBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG5cdCAgXHQ8aW1nIGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFySWNvblwiICBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVUaXRsZUJhckljb25cIj5cclxuXHRcdDxkaXYgZG9qb0F0dGFjaFBvaW50PVwiY2xvc2VBY3Rpb25cIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOmhpZGVcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsb3NlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXN0b3JlQWN0aW9uXCIgZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazpyZXN0b3JlV2luZG93XCJcclxuICAgXHQgIFx0XHRjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXN0b3JlSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtYXhpbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWF4aW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1heGltaXplSWNvblwiPjwvZGl2PlxyXG5cdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJtaW5pbWl6ZUFjdGlvblwiIGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6bWluaW1pemVXaW5kb3dcIlxyXG4gICBcdCAgXHRcdGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZU1pbmltaXplSWNvblwiPjwvZGl2PlxyXG5cdCAgXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRpdGxlQmFyVGV4dFwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZVRpdGxlVGV4dFwiPiR7dGhpcy50aXRsZX08L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1fY29udGFpbmVyXCIgZG9qb0F0dGFjaFBvaW50PVwiY29udGFpbmVyTm9kZVwiIGNsYXNzPVwiZG9qb0Zsb2F0aW5nUGFuZUNsaWVudFwiPjwvZGl2PlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZFwiIGRvam9vbmZvY3VzPVwidHJhcFRhYnNcIiBkb2pvb25ibHVyPVwiY2xlYXJUcmFwXCIgdGFiaW5kZXg9XCIwXCI+PC9zcGFuPlxyXG5cdDxzcGFuIGRvam9hdHRhY2hwb2ludD1cInRhYkVuZE91dGVyXCIgZG9qb29uZm9jdXM9XCJ0cmFwVGFic1wiIGRvam9vbmJsdXI9XCJjbGVhclRyYXBcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcblx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJyZXNpemVCYXJcIiBjbGFzcz1cImRvam9GbG9hdGluZ1BhbmVSZXNpemViYXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuIiwKKworCQkvLyBtb2RhbDogQm9vbGVhbjogV2hldGhlciB0aGlzIGlzIGEgbW9kYWwgZGlhbG9nLiBUcnVlIGJ5IGRlZmF1bHQuCisJCW1vZGFsOiB0cnVlLAorCisvLwkJcmVmcmVzaE9uU2hvdzogdHJ1ZSwgLy9mb3IgZGVidWcgZm9yIG5vdworCisJCS8vIHdpZHRoOiBTdHJpbmc6IFdpZHRoIG9mIHRoZSBkaWFsb2cuIE5vbmUgYnkgZGVmYXVsdC4KKwkJd2lkdGg6ICIiLAorCisJCS8vIGhlaWdodDogU3RyaW5nOiBIZWlnaHQgb2YgdGhlIGRpYWxvZy4gTm9uZSBieSBkZWZhdWx0LgorCQloZWlnaHQ6ICIiLAorCisJCS8vIHdpbmRvd1N0YXRlOiBTdHJpbmc6IHN0YXJ0dXAgc3RhdGUgb2YgdGhlIGRpYWxvZworCQl3aW5kb3dTdGF0ZTogIm1pbmltaXplZCIsCisKKwkJZGlzcGxheUNsb3NlQWN0aW9uOiB0cnVlLAorCisJCS8vIGNvbnRlbnRGaWxlOiBTdHJpbmcKKwkJLy8JVE9ETworCQljb250ZW50RmlsZTogIiIsCisJCQorCQkvLyBjb250ZW50Q2xhc3M6IFN0cmluZworCQkvLwlUT0RPCisJCWNvbnRlbnRDbGFzczogIiIsCisKKwkJZmlsbEluVGVtcGxhdGU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpeworCQkJdGhpcy5maWxsSW5GbG9hdGluZ1BhbmVUZW1wbGF0ZShhcmdzLCBmcmFnKTsKKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5jYWxsKHRoaXMsIGFyZ3MsIGZyYWcpOworCQl9LAorCQlwb3N0Q3JlYXRlOiBmdW5jdGlvbigpeworCQkJaWYodGhpcy5jb250ZW50RmlsZSl7CisJCQkJZG9qby5yZXF1aXJlKHRoaXMuY29udGVudEZpbGUpOworCQkJfQorCQkJaWYodGhpcy5tb2RhbCl7CisJCQkJZG9qby53aWRnZXQuTW9kYWxEaWFsb2dCYXNlLnByb3RvdHlwZS5wb3N0Q3JlYXRlLmNhbGwodGhpcyk7CisJCQl9ZWxzZXsKKwkJCQl3aXRoKHRoaXMuZG9tTm9kZS5zdHlsZSkgeworCQkJCQl6SW5kZXggPSA5OTk7CisJCQkJCWRpc3BsYXkgPSAibm9uZSI7CisJCQkJfQorCQkJfQorCQkJZG9qby53aWRnZXQuRmxvYXRpbmdQYW5lQmFzZS5wcm90b3R5cGUucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZy5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuY2FsbCh0aGlzKTsKKwkJCWlmKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpeworCQkJCXdpdGgodGhpcy5kb21Ob2RlLnN0eWxlKXsKKwkJCQkJd2lkdGggPSB0aGlzLndpZHRoOworCQkJCQloZWlnaHQgPSB0aGlzLmhlaWdodDsKKwkJCQl9CisJCQl9CisJCX0sCisJCWNyZWF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKCl7CisJCQlpZighdGhpcy5jb250ZW50V2lkZ2V0ICYmIHRoaXMuY29udGVudENsYXNzKXsKKwkJCQl0aGlzLmNvbnRlbnRXaWRnZXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQodGhpcy5jb250ZW50Q2xhc3MpOworCQkJCXRoaXMuYWRkQ2hpbGQodGhpcy5jb250ZW50V2lkZ2V0KTsKKwkJCX0KKwkJfSwKKwkJc2hvdzogZnVuY3Rpb24oKXsKKwkJCWlmKCF0aGlzLmNvbnRlbnRXaWRnZXQpeworCQkJCS8vYnVnZ3kgSUU6IGlmIHRoZSBkaWFsb2cgaXMgaGlkZGVuLCB0aGUgYnV0dG9uIHdpZGdldHMKKwkJCQkvL2luIHRoZSBkaWFsb2cgY2FuIG5vdCBiZSBzaG93biwgc28gc2hvdyBpdCB0ZW1wb3JhcnkgKGFzIHRoZQorCQkJCS8vZGlhbG9nIG1heSBkZWNpZGUgbm90IHRvIHNob3cgaXQgaW4gbG9hZENvbnRlbnQoKSBsYXRlcikKKwkJCQlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3Muc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJCXRoaXMuY3JlYXRlQ29udGVudCgpOworCQkJCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7CisJCQl9CisKKwkJCWlmKCF0aGlzLmNvbnRlbnRXaWRnZXQgfHwgIXRoaXMuY29udGVudFdpZGdldC5sb2FkQ29udGVudCgpKXsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzLnNob3dGbG9hdGluZ1BhbmUoKTsKKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5zaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQlpZih0aGlzLm1vZGFsKXsKKwkJCQl0aGlzLnNob3dNb2RhbERpYWxvZygpOworCQkJfQorCQkJaWYodGhpcy5tb2RhbCl7CisJCQkJLy9wbGFjZSB0aGUgYmFja2dyb3VuZCBkaXYgdW5kZXIgdGhpcyBtb2RhbCBwYW5lCisJCQkJdGhpcy5iZy5zdHlsZS56SW5kZXggPSB0aGlzLmRvbU5vZGUuc3R5bGUuekluZGV4LTE7CisJCQl9CisJCX0sCisJCW9uU2hvdzogZnVuY3Rpb24oKXsKKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2cuc3VwZXJjbGFzcy5vblNob3cuY2FsbCh0aGlzKTsKKwkJCXRoaXMub25GbG9hdGluZ1BhbmVTaG93KCk7CisJCX0sCisJCWNsb3NlV2luZG93OiBmdW5jdGlvbigpeworCQkJdGhpcy5oaWRlKCk7CisJCQlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MuY2xvc2VXaW5kb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfSwKKwkJaGlkZTogZnVuY3Rpb24oKXsKKwkJCWlmKHRoaXMubW9kYWwpeworCQkJCXRoaXMuaGlkZU1vZGFsRGlhbG9nKCk7CisJCQl9CisJCQlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nLnN1cGVyY2xhc3MuaGlkZS5jYWxsKHRoaXMpOworCQl9LAorCQkvL21vZGlmaWVkIGZyb20gTW9kYWxEaWFsb2dCYXNlLmNoZWNrU2l6ZSB0byBjYWxsIF9zaXplQmFja2dyb3VuZCBjb25kaXRpb25hbGx5CisJCWNoZWNrU2l6ZTogZnVuY3Rpb24oKXsKKwkJCWlmKHRoaXMuaXNTaG93aW5nKCkpeworCQkJCWlmKHRoaXMubW9kYWwpeworCQkJCQl0aGlzLl9zaXplQmFja2dyb3VuZCgpOworCQkJCX0KKwkJCQl0aGlzLnBsYWNlTW9kYWxEaWFsb2coKTsKKwkJCQl0aGlzLm9uUmVzaXplZCgpOworCQkJfQorCQl9CisJfQorKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorCSJkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKK3sKKwkvLyBzdW1tYXJ5OgorCS8vCQlkb2pvLndpZGdldC5FZGl0b3IyRGlhbG9nQ29udGVudCBpcyB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgYSBFZGl0b3IyRGlhbG9nLgorCS8vCQlUaGlzIGNsYXNzIHNob3VsZCBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnQuCisKKwl3aWRnZXRzSW5UZW1wbGF0ZTogdHJ1ZSwKKworCWxvYWRDb250ZW50OmZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IExvYWQgdGhlIGNvbnRlbnQuIENhbGxlZCBieSBFZGl0b3IyRGlhbG9nIHdoZW4gZmlyc3Qgc2hvd24KKwkJcmV0dXJuIHRydWU7CisJfSwKKwljYW5jZWw6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IERlZmF1bHQgaGFuZGxlciB3aGVuIGNhbmNlbCBidXR0b24gaXMgY2xpY2tlZC4KKwkJdGhpcy5wYXJlbnQuaGlkZSgpOworCX0KK30pOworCitkb2pvLmxhbmcuZGVjbGFyZSgiZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQiLCBkb2pvLndpZGdldC5FZGl0b3IyQnJvd3NlckNvbW1hbmQsCisJZnVuY3Rpb24oZWRpdG9yLCBuYW1lLCBkaWFsb2dQYXJhcyl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlQcm92aWRlcyBhbiBlYXN5IHdheSB0byBwb3B1cCBhIGRpYWxvZyB3aGVuCisJCS8vCQl0aGUgY29tbWFuZCBpcyBleGVjdXRlZC4KKwkJdGhpcy5kaWFsb2dQYXJhcyA9IGRpYWxvZ1BhcmFzOworCX0sCit7CisJZXhlY3V0ZTogZnVuY3Rpb24oKXsKKwkJaWYoIXRoaXMuZGlhbG9nKXsKKwkJCWlmKCF0aGlzLmRpYWxvZ1BhcmFzLmNvbnRlbnRGaWxlIHx8ICF0aGlzLmRpYWxvZ1BhcmFzLmNvbnRlbnRDbGFzcyl7CisJCQkJYWxlcnQoImNvbnRlbnRGaWxlIGFuZCBjb250ZW50Q2xhc3Mgc2hvdWxkIGJlIHNldCBmb3IgZG9qby53aWRnZXQuRWRpdG9yMkRpYWxvZ0NvbW1hbmQuZGlhbG9nUGFyYXMhIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdGhpcy5kaWFsb2cgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJEaWFsb2ciLCB0aGlzLmRpYWxvZ1BhcmFzKTsKKworCQkJZG9qby5ib2R5KCkuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2cuZG9tTm9kZSk7CisKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAiZGVzdHJveSIsIHRoaXMuZGlhbG9nLCAiZGVzdHJveSIpOworCQl9CisJCXRoaXMuZGlhbG9nLnNob3coKTsKKwl9LAorCWdldFRleHQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmRpYWxvZ1BhcmFzLnRpdGxlIHx8IGRvam8ud2lkZ2V0LkVkaXRvcjJEaWFsb2dDb21tYW5kLnN1cGVyY2xhc3MuZ2V0VGV4dC5jYWxsKHRoaXMpOworCX0KK30pOworCitkb2pvLndpZGdldC5FZGl0b3IyVG9vbGJhckdyb3VwcyA9IHsKKwkvLyBzdW1tYXJ5OiBrZWVwaW5nIHRyYWNrIG9mIGFsbCBhdmFpbGFibGUgc2hhcmUgdG9vbGJhciBncm91cHMKK307CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRWRpdG9yMiIsCisJZG9qby53aWRnZXQuUmljaFRleHQsCisJZnVuY3Rpb24oKXsKKwkJdGhpcy5fbG9hZGVkQ29tbWFuZHM9e307CisJfSwKKwl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlkb2pvLndpZGdldC5FZGl0b3IyIGlzIHRoZSBXWVNJV1lHIGVkaXRvciBpbiBkb2pvIHdpdGggdG9vbGJhci4gSXQgc3VwcG9ydHMgYSBwbHVnaW4KKwkJLy8JCWZyYW1ld29yayB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgZWRpdG9yLCBzdWNoIGFzCisJCS8vCQlhZGRpbmcgYSBjb250ZXh0IG1lbnUsIHRhYmxlIG9wZXJhdGlvbiBldGMuCisJCS8vIGRlc2NyaXB0aW9uOgorCQkvLwkJUGx1Z2lucyBhcmUgYXZhaWxhYmxlIHVzaW5nIGRvam8ncyByZXF1aXJlIHN5bnRheC4gUGxlYXNlIGZpbmQgYXZhaWxhYmxlIGJ1aWx0LWluIHBsdWdpbnMKKwkJLy8JCXVuZGVyIHNyYy93aWRnZXQvRWRpdG9yMlBsdWdpbi4KKworLy8JCS8vIHNhdmVVcmw6IFN0cmluZzogdXJsIHRvIHdoaWNoIHNhdmUgYWN0aW9uIHNob3VsZCBzZW5kIGNvbnRlbnQgdG8KKy8vCQlzYXZlVXJsOiAiIiwKKy8vCQkvLyBzYXZlTWV0aG9kOiBTdHJpbmc6IEhUVFAgbWV0aG9kIGZvciBzYXZlIChwb3N0IG9yIGdldCkKKy8vCQlzYXZlTWV0aG9kOiAicG9zdCIsCisvLwkJc2F2ZUFyZ05hbWU6ICJlZGl0b3JDb250ZW50IiwKKy8vCQljbG9zZU9uU2F2ZTogZmFsc2UsCisKKwkJLy8gdG9vbGJhckFsd2F5c1Zpc2libGU6IEJvb2xlYW46IFdoZXRoZXIgdGhlIHRvb2xiYXIgc2hvdWxkIHNjcm9sbCB0byBrZWVwIGl0IGluIHRoZSB2aWV3CisJCXRvb2xiYXJBbHdheXNWaXNpYmxlOiBmYWxzZSwKKworLy8JCWh0bWxFZGl0aW5nOiBmYWxzZSwKKworCQl0b29sYmFyV2lkZ2V0OiBudWxsLAorCQlzY3JvbGxJbnRlcnZhbDogbnVsbCwKKworCQkvLyB0b29sYmFyVGVtcGxhdGVQYXRoOiBkb2pvLnVyaS5VcmkKKwkJLy8JCXRvIHNwZWNpZnkgdGhlIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSB0b29sYmFyCisJCXRvb2xiYXJUZW1wbGF0ZVBhdGg6IGRvam8udXJpLmNhY2hlLnNldChkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9FZGl0b3JUb29sYmFyT25lbGluZS5odG1sIiksICI8ZGl2IGNsYXNzPVwiRWRpdG9yVG9vbGJhckRvbU5vZGUgRWRpdG9yVG9vbGJhclNtYWxsQmdcIj5cclxuXHQ8dGFibGUgY2VsbHBhZGRpbmc9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgYm9yZGVyPVwiMFwiPlxyXG5cdFx0PHRib2R5PlxyXG5cdFx0XHQ8dHIgdmFsaWduPVwidG9wXCIgYWxpZ249XCJsZWZ0XCI+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaHRtbHRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvblwiIFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IHdpZHRoOiAzMHB4O1wiID4mbHQ7aCZndDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJjb3B5XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9Db3B5XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwicGFzdGVcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1Bhc3RlXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwidW5kb1wiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tIEZJWE1FOiBzaG91bGQgd2UgaGF2ZSB0aGUgdGV4dCBcInVuZG9cIiBoZXJlPyAtLT5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1VuZG9cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJyZWRvXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9SZWRvXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIGlzU3BhY2VyPVwidHJ1ZVwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIlx0c3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJjcmVhdGVsaW5rXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9MaW5rXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0aW1hZ2VcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0ltYWdlXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiaW5zZXJ0aG9yaXpvbnRhbHJ1bGVcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0hvcml6b250YWxMaW5lIFwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImJvbGRcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0JvbGRcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpdGFsaWNcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX0l0YWxpY1wiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInVuZGVybGluZVwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fVW5kZXJsaW5lXCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwic3RyaWtldGhyb3VnaFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBcclxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU3RyaWtlVGhyb3VnaFwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwXCIgXHJcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpbnNlcnR1bm9yZGVyZWRsaXN0XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIFxyXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CdWxsZXRlZExpc3RcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJpbnNlcnRvcmRlcmVkbGlzdFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBcclxuXHRcdFx0XHRcdFx0XHRjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fTnVtYmVyZWRMaXN0XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIGlzU3BhY2VyPVwidHJ1ZVwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9TZXBcIiBzdHlsZT1cIndpZHRoOiA1cHg7IG1pbi13aWR0aDogNXB4O1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImluZGVudFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fSW5kZW50XCIgXHJcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJvdXRkZW50XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9PdXRkZW50XCIgXHJcblx0XHRcdFx0XHRcdFx0dW5zZWxlY3RhYmxlPVwib25cIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgaXNTcGFjZXI9XCJ0cnVlXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NlcFwiIHN0eWxlPVwid2lkdGg6IDVweDsgbWluLXdpZHRoOiA1cHg7XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwiZm9yZWNvbG9yXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9UZXh0Q29sb3JcIiBcclxuXHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZD5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cImhpbGl0ZWNvbG9yXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9CYWNrZ3JvdW5kQ29sb3JcIiBcclxuXHRcdFx0XHRcdFx0XHR1bnNlbGVjdGFibGU9XCJvblwiPiZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCBpc1NwYWNlcj1cInRydWVcIj5cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fU2VwXCIgc3R5bGU9XCJ3aWR0aDogNXB4OyBtaW4td2lkdGg6IDVweDtcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJqdXN0aWZ5bGVmdFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fTGVmdEp1c3RpZnlcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJqdXN0aWZ5Y2VudGVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9DZW50ZXJKdXN0aWZ5XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpY29uQ29udGFpbmVyIGRvam9FZGl0b3JUb29sYmFySXRlbVwiIGRvam9FVEl0ZW1OYW1lPVwianVzdGlmeXJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZG9qb0UyVEJJY29uIGRvam9FMlRCSWNvbl9SaWdodEp1c3RpZnlcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImljb25Db250YWluZXIgZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJqdXN0aWZ5ZnVsbFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRvam9FMlRCSWNvbiBkb2pvRTJUQkljb25fQmxvY2tKdXN0aWZ5XCI+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvdGQ+XHRcclxuXHRcdFx0XHQ8dGQ+XHJcblx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwiZG9qb0VkaXRvclRvb2xiYXJJdGVtXCIgZG9qb0VUSXRlbU5hbWU9XCJwbGFpbmZvcm1hdGJsb2NrXCI+XHJcblx0XHRcdFx0XHRcdDwhLS0gRklYTUU6IHVzaW5nIFwicFwiIGhlcmUgaW5zZXJ0cyBhIHBhcmFncmFwaCBpbiBtb3N0IGNhc2VzISAtLT5cclxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIlwiPi0tIGZvcm1hdCAtLTwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicFwiPk5vcm1hbDwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwicHJlXCI+Rml4ZWQgRm9udDwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiaDFcIj5NYWluIEhlYWRpbmc8L29wdGlvbj5cclxuXHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImgyXCI+U2VjdGlvbiBIZWFkaW5nPC9vcHRpb24+XHJcblx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJoM1wiPlN1Yi1IZWFkaW5nPC9vcHRpb24+XHJcblx0XHRcdFx0XHRcdDwhLS0gPG9wdGlvbiB2YWx1ZT1cImJsb2NrcXVvdGVcIj5CbG9jayBRdW90ZTwvb3B0aW9uPiAtLT5cclxuXHRcdFx0XHRcdDwvc2VsZWN0PlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkPjwhLS0gdW5jb21tZW50IHRvIGVuYWJsZSBzYXZlIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdDwhLS0gc2F2ZSAtLT5cclxuXHRcdFx0XHRcdDwhLS1zcGFuIGNsYXNzPVwiaWNvbkNvbnRhaW5lciBkb2pvRWRpdG9yVG9vbGJhckl0ZW1cIiBkb2pvRVRJdGVtTmFtZT1cInNhdmVcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkb2pvRTJUQkljb24gZG9qb0UyVEJJY29uX1NhdmVcIj4mbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3NwYW4tLT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdDx0ZCB3aWR0aD1cIipcIj4mbmJzcDs8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Ym9keT5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIiksCisKKwkJLy8gdG9vbGJhclRlbXBsYXRlQ3NzUGF0aDogZG9qby51cmkuVXJpCisJCS8vCQl0byBzcGVjaWZ5IHRoZSBjc3MgZmlsZSBmb3IgdGhlIHRvb2xiYXIKKwkJdG9vbGJhclRlbXBsYXRlQ3NzUGF0aDogbnVsbCwKKworCQkvLyB0b29sYmFyUGxhY2VIb2xkZXI6IFN0cmluZworCQkvLwkJZWxlbWVudCBpZCB0byBzcGVjaWZ5IHdoZXJlIHRvIGF0dGFjaCB0aGUgdG9vbGJhcgorCQl0b29sYmFyUGxhY2VIb2xkZXI6ICcnLAorCisJCV9pblNvdXJjZU1vZGU6IGZhbHNlLAorCQlfaHRtbEVkaXROb2RlOiBudWxsLAorCisJCS8vIHRvb2xiYXJHcm91cDogU3RyaW5nOiAKKwkJLy8JCVRoaXMgaW5zdGFuY2Ugb2YgZWRpdG9yIHdpbGwgc2hhcmUgdGhlIHNhbWUgdG9vbGJhciB3aXRoIG90aGVyIGVkaXRvciB3aXRoIHRoZSBzYW1lIHRvb2xiYXJHcm91cC4gCisJCS8vCQlCeSBkZWZhdWx0LCB0b29sYmFyR3JvdXAgaXMgZW1wdHkgYW5kIHN0YW5kYWxvbmUgdG9vbGJhciBpcyB1c2VkIGZvciB0aGlzIGluc3RhbmNlLgorCQl0b29sYmFyR3JvdXA6ICcnLAorCisJCS8vIHNoYXJlVG9vbGJhcjogQm9vbGVhbjogV2hldGhlciB0byBzaGFyZSB0b29sYmFyIHdpdGggb3RoZXIgaW5zdGFuY2VzIG9mIEVkaXRvcjIuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdG9vbGJhckdyb3VwCisJCXNoYXJlVG9vbGJhcjogZmFsc2UsCisKKwkJLy8gY29udGV4dE1lbnVHcm91cFNldDogU3RyaW5nOiBzcGVjaWZ5IHdoaWNoIGNvbnRleHQgbWVudSBzZXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgaW5zdGFuY2UuIEluY2x1ZGUgQ29udGV4dE1lbnUgcGx1Z2luIHRvIHVzZSB0aGlzCisJCWNvbnRleHRNZW51R3JvdXBTZXQ6ICcnLAorCisJCWVkaXRvck9uTG9hZDogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJQ3JlYXRlIHRvb2xiYXIgYW5kIG90aGVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLiBUaGlzIGlzIGNhbGxlZCBhZnRlcgorCQkJLy8JCXRoZSBmaW5pc2ggb2YgdGhlIGxvYWRpbmcgb2YgZG9jdW1lbnQgaW4gdGhlIGVkaXRpbmcgZWxlbWVudAorLy8JCQlkb2pvLnByb2ZpbGUuc3RhcnQoImRvam8ud2lkZ2V0LkVkaXRvcjI6OmVkaXRvck9uTG9hZCIpOworCisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LkVkaXRvcjI6OnByZUxvYWRpbmdUb29sYmFyIiwgdGhpcyk7CisJCQlpZih0aGlzLnRvb2xiYXJBbHdheXNWaXNpYmxlKXsKKwkJCQkKKwkJCX0KKworCQkJaWYodGhpcy50b29sYmFyV2lkZ2V0KXsKKwkJCQl0aGlzLnRvb2xiYXJXaWRnZXQuc2hvdygpOworCQkJCS8vcmUtYWRkIHRoZSB0b29sYmFyIHRvIHRoZSBuZXcgZG9tTm9kZSAoY2F1c2VkIGJ5IG9wZW4oKSBvbiBhbm90aGVyIGVsZW1lbnQpCisJCQkJZG9qby5odG1sLmluc2VydEJlZm9yZSh0aGlzLnRvb2xiYXJXaWRnZXQuZG9tTm9kZSwgdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQpOworCQkJfWVsc2V7CisJCQkJaWYodGhpcy5zaGFyZVRvb2xiYXIpeworCQkJCQlkb2pvLmRlcHJlY2F0ZWQoIkVkaXRvcjI6c2hhcmVUb29sYmFyIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdG9vbGJhckdyb3VwIiwgIjAuNSIpOworCQkJCQl0aGlzLnRvb2xiYXJHcm91cCA9ICdkZWZhdWx0RG9qb1Rvb2xiYXJHcm91cCc7CisJCQkJfQorCQkJCWlmKHRoaXMudG9vbGJhckdyb3VwKXsKKwkJCQkJaWYoZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHNbdGhpcy50b29sYmFyR3JvdXBdKXsKKwkJCQkJCXRoaXMudG9vbGJhcldpZGdldCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJUb29sYmFyR3JvdXBzW3RoaXMudG9vbGJhckdyb3VwXTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZighdGhpcy50b29sYmFyV2lkZ2V0KXsKKwkJCQkJCXZhciB0Yk9wdHMgPSB7c2hhcmVHcm91cDogdGhpcy50b29sYmFyR3JvdXAsIHBhcmVudDogdGhpc307CisJCQkJCQl0Yk9wdHMudGVtcGxhdGVTdHJpbmcgPSBkb2pvLnVyaS5jYWNoZS5nZXQodGhpcy50b29sYmFyVGVtcGxhdGVQYXRoKTsKKwkJCQkJCWlmKHRoaXMudG9vbGJhclRlbXBsYXRlQ3NzUGF0aCl7CisJCQkJCQkJdGJPcHRzLnRlbXBsYXRlQ3NzUGF0aCA9IHRoaXMudG9vbGJhclRlbXBsYXRlQ3NzUGF0aDsKKwkJCQkJCQl0Yk9wdHMudGVtcGxhdGVDc3NTdHJpbmcgPSBkb2pvLnVyaS5jYWNoZS5nZXQodGhpcy50b29sYmFyVGVtcGxhdGVDc3NQYXRoKTsKKwkJCQkJCX0KKwkJCQkJCWlmKHRoaXMudG9vbGJhclBsYWNlSG9sZGVyKXsKKwkJCQkJCQl0aGlzLnRvb2xiYXJXaWRnZXQgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIkVkaXRvcjJUb29sYmFyIiwgdGJPcHRzLCBkb2pvLmJ5SWQodGhpcy50b29sYmFyUGxhY2VIb2xkZXIpLCAiYWZ0ZXIiKTsKKwkJCQkJCX1lbHNleworCQkJCQkJCXRoaXMudG9vbGJhcldpZGdldCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRWRpdG9yMlRvb2xiYXIiLCB0Yk9wdHMsIHRoaXMuZG9tTm9kZS5maXJzdENoaWxkLCAiYmVmb3JlIik7CisJCQkJCQl9CisJCQkJCQlpZih0aGlzLnRvb2xiYXJHcm91cCl7CisJCQkJCQkJZG9qby53aWRnZXQuRWRpdG9yMlRvb2xiYXJHcm91cHNbdGhpcy50b29sYmFyR3JvdXBdID0gdGhpcy50b29sYmFyV2lkZ2V0OworCQkJCQkJfQorCQkJCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMsICJjbG9zZSIsIHRoaXMudG9vbGJhcldpZGdldCwgImhpZGUiKTsKKwkKKwkJCQkJCXRoaXMudG9vbGJhckxvYWRlZCgpOworCQkJCX0KKwkJCX0KKworCQkJZG9qby5ldmVudC50b3BpYy5yZWdpc3RlclB1Ymxpc2hlcigiRWRpdG9yMi5jbG9iYmVyRm9jdXMiLCB0aGlzLCAiY2xvYmJlckZvY3VzIik7CisJCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSgiRWRpdG9yMi5jbG9iYmVyRm9jdXMiLCB0aGlzLCAic2V0Qmx1ciIpOworCisJCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2goImRvam8ud2lkZ2V0LkVkaXRvcjI6Om9uTG9hZCIsIHRoaXMpOworLy8JCQlkb2pvLnByb2ZpbGUuZW5kKCJkb2pvLndpZGdldC5FZGl0b3IyOjplZGl0b3JPbkxvYWQiKTsKKwkJfSwKKworCQkvL2V2ZW50IGZvciBwbHVnaW5zIHRvIHVzZQorCQl0b29sYmFyTG9hZGVkOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlGaXJlZCB3aGVuIHRoZSB0b29sYmFyIGZvciB0aGlzIGVkaXRvciBpcyBjcmVhdGVkLgorCQkJLy8JCVRoaXMgZXZlbnQgaXMgZm9yIHBsdWdpbnMgdG8gdXNlCisJCX0sCisKKwkJLy9UT0RPOiBwcm92aWRlIGEgcXVlcnkgbWVjaGFuaXNtIGFib3V0IGxvYWRlZCBwbHVnaW5zPworCQlyZWdpc3RlckxvYWRlZFBsdWdpbjogZnVuY3Rpb24oLypPYmplY3QqL29iail7CisJCQkvLyBzdW1tYXJ5OiBSZWdpc3RlciBhIHBsdWdpbiB3aGljaCBpcyBsb2FkZWQgZm9yIHRoaXMgaW5zdGFuY2UKKwkJCWlmKCF0aGlzLmxvYWRlZFBsdWdpbnMpeworCQkJCXRoaXMubG9hZGVkUGx1Z2lucyA9IFtdOworCQkJfQorCQkJdGhpcy5sb2FkZWRQbHVnaW5zLnB1c2gob2JqKTsKKwkJfSwKKwkJdW5yZWdpc3RlckxvYWRlZFBsdWdpbjogZnVuY3Rpb24oLypPYmplY3QqL29iail7CisJCQkvLyBzdW1tYXJ5OiBEZWxldGUgYSBsb2FkZWQgcGx1Z2luIGZvciB0aGlzIGluc3RhbmNlCisJCQlmb3IodmFyIGkgaW4gdGhpcy5sb2FkZWRQbHVnaW5zKXsKKwkJCQlpZih0aGlzLmxvYWRlZFBsdWdpbnNbaV0gPT09IG9iail7CisJCQkJCWRlbGV0ZSB0aGlzLmxvYWRlZFBsdWdpbnNbaV07CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlkb2pvLmRlYnVnKCJkb2pvLndpZGdldC5FZGl0b3IyLnVucmVnaXN0ZXJMb2FkZWRQbHVnaW46IHVua25vdyBwbHVnaW4gb2JqZWN0OiAiK29iaik7CisJCX0sCisKKwkJLy9vdmVybG9hZCB0aGUgb3JpZ2luYWwgb25lcyB0byBwcm92aWRlIGV4dHJhIGNvbW1hbmRzCisJCWV4ZWNDb21tYW5kOiBmdW5jdGlvbigvKlN0cmluZyovY29tbWFuZCwgYXJndW1lbnQpeworCQkJc3dpdGNoKGNvbW1hbmQudG9Mb3dlckNhc2UoKSl7CisJCQkJY2FzZSAnaHRtbHRvZ2dsZSc6CisJCQkJCXRoaXMudG9nZ2xlSHRtbEVkaXRpbmcoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLmV4ZWNDb21tYW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl9CisJCX0sCisJCXF1ZXJ5Q29tbWFuZEVuYWJsZWQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi9jb21tYW5kLCBhcmd1bWVudCl7CisJCQlzd2l0Y2goY29tbWFuZC50b0xvd2VyQ2FzZSgpKXsKKwkJCQljYXNlICdodG1sdG9nZ2xlJzoKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZGVmYXVsdDoKKwkJCQkJaWYodGhpcy5faW5Tb3VyY2VNb2RlKXsgcmV0dXJuIGZhbHNlO30KKwkJCQkJcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5xdWVyeUNvbW1hbmRFbmFibGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl9CisJCX0sCisJCXF1ZXJ5Q29tbWFuZFN0YXRlOiBmdW5jdGlvbigvKlN0cmluZyovY29tbWFuZCwgYXJndW1lbnQpeworCQkJc3dpdGNoKGNvbW1hbmQudG9Mb3dlckNhc2UoKSl7CisJCQkJY2FzZSAnaHRtbHRvZ2dsZSc6CisJCQkJCXJldHVybiB0aGlzLl9pblNvdXJjZU1vZGU7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5xdWVyeUNvbW1hbmRTdGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJfQorCQl9LAorCisJCW9uQ2xpY2s6IGZ1bmN0aW9uKC8qRXZlbnQqL2UpeworCQkJZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLm9uQ2xpY2suY2FsbCh0aGlzLCBlKTsKKwkJCS8vaWYgUG9wdXAgaXMgdXNlZCwgY2FsbCBkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIub25DbGljaworCQkJLy9tYW51YWxseSB3aGVuIGNsaWNrIGluIHRoZSBlZGl0aW5nIGFyZWEgdG8gY2xvc2UgYWxsCisJCQkvL29wZW4gcG9wdXBzIChkcm9wZG93bnMpCisJCQlpZihkb2pvLndpZGdldC5Qb3B1cE1hbmFnZXIpeworCQkJCWlmKCFlKXsgLy9JRQorCQkJCQllID0gdGhpcy53aW5kb3cuZXZlbnQ7CisJCQkJfQorCQkJCWRvam8ud2lkZ2V0LlBvcHVwTWFuYWdlci5vbkNsaWNrKGUpOworCQkJfQorCQl9LAorCisJCWNsb2JiZXJGb2N1czogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IHN0dWIgdG8gc2lnbmFsIG90aGVyIGluc3RhbmNlcyB0byBjbG9iYmVyIGZvY3VzCisJCX0sCisJCXRvZ2dsZUh0bWxFZGl0aW5nOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogdG9nZ2xlIGJldHdlZW4gV1lTSVdZRyBtb2RlIGFuZCBIVE1MIHNvdXJjZSBtb2RlCisJCQlpZih0aGlzPT09ZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCkpeworCQkJCWlmKCF0aGlzLl9pblNvdXJjZU1vZGUpeworCQkJCQl2YXIgaHRtbCA9IHRoaXMuZ2V0RWRpdG9yQ29udGVudCgpOworCQkJCQl0aGlzLl9pblNvdXJjZU1vZGUgPSB0cnVlOworCisJCQkJCWlmKCF0aGlzLl9odG1sRWRpdE5vZGUpeworCQkJCQkJdGhpcy5faHRtbEVkaXROb2RlID0gZG9qby5kb2MoKS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOworCQkJCQkJZG9qby5odG1sLmluc2VydEFmdGVyKHRoaXMuX2h0bWxFZGl0Tm9kZSwgdGhpcy5lZGl0b3JPYmplY3QpOworCQkJCQl9CisKKwkJCQkJdGhpcy5faHRtbEVkaXROb2RlLnN0eWxlLmRpc3BsYXkgPSAiIjsKKwkJCQkJdGhpcy5faHRtbEVkaXROb2RlLnN0eWxlLndpZHRoID0gIjEwMCUiOworCQkJCQl0aGlzLl9odG1sRWRpdE5vZGUuc3R5bGUuaGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveCh0aGlzLmVkaXROb2RlKS5oZWlnaHQrInB4IjsKKwkJCQkJdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlID0gaHRtbDsKKworCQkJCQkvL2FjdGl2ZVggb2JqZWN0IChJRSkgZG9lc24ndCBsaWtlIHRvIGJlIGhpZGRlbiwgc28gbW92ZSBpdCBvdXRzaWRlIG9mIHNjcmVlbiBpbnN0ZWFkCisJCQkJCXdpdGgodGhpcy5lZGl0b3JPYmplY3Quc3R5bGUpeworCQkJCQkJcG9zaXRpb24gPSAiYWJzb2x1dGUiOworCQkJCQkJbGVmdCA9ICItMjAwMHB4IjsKKwkJCQkJCXRvcCA9ICItMjAwMHB4IjsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQl0aGlzLl9pblNvdXJjZU1vZGUgPSBmYWxzZTsKKworCQkJCQkvL0luIElFIGFjdGl2ZVggbW9kZSwgaWYgX2h0bWxFZGl0Tm9kZSBpcyBmb2N1c2VkLAorCQkJCQkvL3doZW4gdG9nZ2xpbmcsIGFuIGVycm9yIHdvdWxkIG9jY3VyLCBzbyB1bmZvY3VzIGl0CisJCQkJCXRoaXMuX2h0bWxFZGl0Tm9kZS5ibHVyKCk7CisKKwkJCQkJd2l0aCh0aGlzLmVkaXRvck9iamVjdC5zdHlsZSl7CisJCQkJCQlwb3NpdGlvbiA9ICIiOworCQkJCQkJbGVmdCA9ICIiOworCQkJCQkJdG9wID0gIiI7CisJCQkJCX0KKwkJCQkJdmFyIGh0bWwgPSB0aGlzLl9odG1sRWRpdE5vZGUudmFsdWU7CisKKwkJCQkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgInJlcGxhY2VFZGl0b3JDb250ZW50IiwgMSwgaHRtbCk7CisJCQkJCXRoaXMuX2h0bWxFZGl0Tm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJCQl0aGlzLmZvY3VzKCk7CisJCQkJfQorCQkJCXRoaXMub25EaXNwbGF5Q2hhbmdlZChudWxsLCB0cnVlKTsKKwkJCX0KKwkJfSwKKworCQlzZXRGb2N1czogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGZvY3VzIGlzIHNldCBvbiB0aGlzIGluc3RhbmNlCisvLwkJCWRvam8uZGVidWcoInNldEZvY3VzOiBzdGFydCAiK3RoaXMud2lkZ2V0SWQpOworCQkJaWYoZG9qby53aWRnZXQuRWRpdG9yMk1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCkgPT09IHRoaXMpeyByZXR1cm47IH0KKworCQkJdGhpcy5jbG9iYmVyRm9jdXMoKTsKKy8vCQkJZG9qby5kZWJ1Zygic2V0Rm9jdXM6IiwgdGhpcyk7CisJCQlkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5zZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7CisJCX0sCisKKwkJc2V0Qmx1cjogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGZvY3VzIG9uIHRoaXMgaW5zdGFuY2UgaXMgbG9zdAorLy8JCQkgZG9qby5kZWJ1Zygic2V0Qmx1cjoiLCB0aGlzKTsKKwkJCS8vZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMudG9vbGJhcldpZGdldCwgImV4ZWMiLCB0aGlzLCAiZXhlY0NvbW1hbmQiKTsKKwkJfSwKKworCQlzYXZlU2VsZWN0aW9uOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogc2F2ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIHJlc3RvcmluZyBpdAorCQkJdGhpcy5fYm9va21hcmsgPSBudWxsOworCQkJdGhpcy5fYm9va21hcmsgPSBkb2pvLndpdGhHbG9iYWwodGhpcy53aW5kb3csIGRvam8uaHRtbC5zZWxlY3Rpb24uZ2V0Qm9va21hcmspOworCQl9LAorCQlyZXN0b3JlU2VsZWN0aW9uOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCBzZWxlY3Rpb24KKwkJCWlmKHRoaXMuX2Jvb2ttYXJrKXsKKwkJCQl0aGlzLmZvY3VzKCk7IC8vcmVxdWlyZSBmb3Igbm9uZS1hY3RpdmVYIElFCisJCQkJZG9qby53aXRoR2xvYmFsKHRoaXMud2luZG93LCAibW92ZVRvQm9va21hcmsiLCBkb2pvLmh0bWwuc2VsZWN0aW9uLCBbdGhpcy5fYm9va21hcmtdKTsKKwkJCQl0aGlzLl9ib29rbWFyayA9IG51bGw7CisJCQl9ZWxzZXsKKwkJCQlkb2pvLmRlYnVnKCJyZXN0b3JlU2VsZWN0aW9uOiBubyBzYXZlZCBzZWxlY3Rpb24gaXMgZm91bmQhIik7CisJCQl9CisJCX0sCisKKwkJX3VwZGF0ZVRvb2xiYXJMYXN0UmFuOiBudWxsLAorCQlfdXBkYXRlVG9vbGJhclRpbWVyOiBudWxsLAorCQlfdXBkYXRlVG9vbGJhckZyZXF1ZW5jeTogNTAwLAorCisJCXVwZGF0ZVRvb2xiYXI6IGZ1bmN0aW9uKC8qQm9vbGVhbiovZm9yY2UpeworCQkJLy8gc3VtbWFyeTogdXBkYXRlIHRoZSBhc3NvY2lhdGVkIHRvb2xiYXIgb2YgdGhpcyBFZGl0b3IyCisJCQlpZigoIXRoaXMuaXNMb2FkZWQpfHwoIXRoaXMudG9vbGJhcldpZGdldCkpeyByZXR1cm47IH0KKworCQkJLy8ga2VlcHMgdGhlIHRvb2xiYXIgZnJvbSB1cGRhdGluZyB0b28gZnJlcXVlbnRseQorCQkJLy8gVE9ETzogZ2VuZXJhbGl6ZSB0aGlzIGZ1bmN0aW9uYWxpdHk/CisJCQl2YXIgZGlmZiA9IG5ldyBEYXRlKCkgLSB0aGlzLl91cGRhdGVUb29sYmFyTGFzdFJhbjsKKwkJCWlmKCAoIWZvcmNlKSYmKHRoaXMuX3VwZGF0ZVRvb2xiYXJMYXN0UmFuKSYmCisJCQkJKChkaWZmIDwgdGhpcy5fdXBkYXRlVG9vbGJhckZyZXF1ZW5jeSkpICl7CisKKwkJCQljbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVG9vbGJhclRpbWVyKTsKKwkJCQl2YXIgX3RoaXMgPSB0aGlzOworCQkJCXRoaXMuX3VwZGF0ZVRvb2xiYXJUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQkJCV90aGlzLnVwZGF0ZVRvb2xiYXIoKTsKKwkJCQl9LCB0aGlzLl91cGRhdGVUb29sYmFyRnJlcXVlbmN5LzIpOworCQkJCXJldHVybjsKKworCQkJfWVsc2V7CisJCQkJdGhpcy5fdXBkYXRlVG9vbGJhckxhc3RSYW4gPSBuZXcgRGF0ZSgpOworCQkJfQorCQkJLy8gZW5kIGZyZXF1ZW5jeSBjaGVja2VyCisKKwkJCS8vSUUgaGFzIHRoZSBoYWJpdCBvZiBnZW5lcmF0aW5nIGV2ZW50cyBldmVuIHdoZW4gdGhpcyBlZGl0b3IgaXMgYmx1cnJlZCwgcHJldmVudCB0aGlzCisJCQlpZihkb2pvLndpZGdldC5FZGl0b3IyTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPT0gdGhpcyl7IHJldHVybjsgfQorCisJCQl0aGlzLnRvb2xiYXJXaWRnZXQudXBkYXRlKCk7CisJCX0sCisKKwkJZGVzdHJveTogZnVuY3Rpb24oLypCb29sZWFuKi9maW5hbGl6ZSl7CisJCQl0aGlzLl9odG1sRWRpdE5vZGUgPSBudWxsOworCQkJZG9qby5ldmVudC5kaXNjb25uZWN0KHRoaXMsICJjbG9zZSIsIHRoaXMudG9vbGJhcldpZGdldCwgImhpZGUiKTsKKwkJCWlmKCFmaW5hbGl6ZSl7CisJCQkJdGhpcy50b29sYmFyV2lkZ2V0LmRlc3Ryb3koKTsKKwkJCX0KKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7CisJCX0sCisKKwkJX2xhc3RTdGF0ZVRpbWVzdGFtcDogMCwKKwkJb25EaXNwbGF5Q2hhbmdlZDogZnVuY3Rpb24oLypPYmplY3QqL2UsIC8qQm9vbGVhbiovZm9yY2VVcGRhdGUpeworCQkJdGhpcy5fbGFzdFN0YXRlVGltZXN0YW1wID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkRpc3BsYXlDaGFuZ2VkLmNhbGwodGhpcyxlKTsKKwkJCXRoaXMudXBkYXRlVG9vbGJhcihmb3JjZVVwZGF0ZSk7CisJCX0sCisKKwkJb25Mb2FkOiBmdW5jdGlvbigpeworCQkJdHJ5eworCQkJCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5vbkxvYWQuY2FsbCh0aGlzKTsKKwkJCX1jYXRjaChlKXsgLy8gRklYTUU6IGRlYnVnIHdoeSB0aGlzIGlzIHRocm93aW5nIGVycm9ycyBpbiBJRSEKKwkJCQlkb2pvLmRlYnVnKGUpOworCQkJfQorCQkJdGhpcy5lZGl0b3JPbkxvYWQoKTsKKwkJfSwKKworCQlvbkZvY3VzOiBmdW5jdGlvbigpeworCQkJZG9qby53aWRnZXQuRWRpdG9yMi5zdXBlcmNsYXNzLm9uRm9jdXMuY2FsbCh0aGlzKTsKKwkJCXRoaXMuc2V0Rm9jdXMoKTsKKwkJfSwKKworCQkvL292ZXJsb2FkIHRvIHN1cHBvcnQgc291cmNlIGVkaXRpbmcgbW9kZQorCQlnZXRFZGl0b3JDb250ZW50OiBmdW5jdGlvbigpeworCQkJaWYodGhpcy5faW5Tb3VyY2VNb2RlKXsKKwkJCQlyZXR1cm4gdGhpcy5faHRtbEVkaXROb2RlLnZhbHVlOworCQkJfQorCQkJcmV0dXJuIGRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5nZXRFZGl0b3JDb250ZW50LmNhbGwodGhpcyk7CisJCX0sCisKKwkJcmVwbGFjZUVkaXRvckNvbnRlbnQ6IGZ1bmN0aW9uKGh0bWwpeworCQkJaWYodGhpcy5faW5Tb3VyY2VNb2RlKXsKKwkJCQl0aGlzLl9odG1sRWRpdE5vZGUudmFsdWUgPSBodG1sOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRvam8ud2lkZ2V0LkVkaXRvcjIuc3VwZXJjbGFzcy5yZXBsYWNlRWRpdG9yQ29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CisJCX0sCisJCWdldENvbW1hbmQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi9uYW1lKXsKKwkJCS8vIHN1bW1hcnk6IHJldHVybiBhIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2Ugb2YgZWRpdG9yCisJCQlpZih0aGlzLl9sb2FkZWRDb21tYW5kc1tuYW1lXSl7CisJCQkJcmV0dXJuIHRoaXMuX2xvYWRlZENvbW1hbmRzW25hbWVdOworCQkJfQorCQkJdmFyIGNtZCA9IGRvam8ud2lkZ2V0LkVkaXRvcjJNYW5hZ2VyLmdldENvbW1hbmQodGhpcywgbmFtZSk7CisJCQl0aGlzLl9sb2FkZWRDb21tYW5kc1tuYW1lXSA9IGNtZDsKKwkJCXJldHVybiBjbWQ7CisJCX0sCisJCS8vIEFycmF5OiBDb21tYW5kcyBzaG9ydGN1dHMuIEVhY2ggZWxlbWVudCBjYW4gaGFzIHVwIHRvIDMgZmllbGRzOgorCQkvLwkJMS4gU3RyaW5nOiB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZAorCQkvLwkJMi4gU3RyaW5nIE9wdGlvbmFsOiB0aGUgY2hhciBmb3Igc2hvcnRjdXQga2V5LCBieSBkZWZhdWx0IHRoZSBmaXJzdCBjaGFyIGZyb20gdGhlIGNvbW1hbmQgbmFtZSBpcyB1c2VkCisJCS8vCQkzLiBJbnQgT3B0aW9uYWw6IHNwZWNpZnkgdGhlIG1vZGlmaWVyIG9mIHRoZSBzaG9ydGN1dCwgYnkgZGVmYXVsdCBjdHJsIGlzIHVzZWQKKwkJc2hvcnRjdXRzOiBbWydib2xkJ10sWydpdGFsaWMnXSxbJ3VuZGVybGluZSddLFsnc2VsZWN0YWxsJywnYSddLFsnaW5zZXJ0dW5vcmRlcmVkbGlzdCcsJ1xcJ11dLAorCQlzZXR1cERlZmF1bHRTaG9ydGN1dHM6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBzZXR1cCBkZWZhdWx0IHNob3J0Y3V0cyB1c2luZyBFZGl0b3IyIGNvbW1hbmRzCisJCQl2YXIgZXhlYyA9IGZ1bmN0aW9uKGNtZCl7IHJldHVybiBmdW5jdGlvbigpeyBjbWQuZXhlY3V0ZSgpOyB9IH07CisvLwkJCWlmKCFkb2pvLnJlbmRlci5odG1sLmllKXsKKy8vCQkJCXRoaXMuc2hvcnRjdXRzLnB1c2goWydyZWRvJywnWiddKTsKKy8vCQkJfQorCQkJdmFyIHNlbGYgPSB0aGlzOworCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5zaG9ydGN1dHMsIGZ1bmN0aW9uKGl0ZW0peworCQkJCXZhciBjbWQgPSBzZWxmLmdldENvbW1hbmQoaXRlbVswXSk7CisJCQkJaWYoY21kKXsKKwkJCQkJc2VsZi5hZGRLZXlIYW5kbGVyKGl0ZW1bMV0/aXRlbVsxXTppdGVtWzBdLmNoYXJBdCgwKSwgaXRlbVsyXT09dW5kZWZpbmVkP3NlbGYuS0VZX0NUUkw6aXRlbVsyXSwgZXhlYyhjbWQpKTsKKwkJCQl9CisJCQl9KTsKKy8vCQkJdGhpcy5hZGRLZXlIYW5kbGVyKCJzIiwgY3RybCwgZnVuY3Rpb24gKCkgeyB0aGlzLnNhdmUodHJ1ZSk7IH0pOworCQl9CisJCS8qLAorCQkvLyBGSVhNRTogcHJvYmFibHkgbm90IG5lZWRlZCBhbnkgbW9yZSB3aXRoIG5ldyBkZXNpZ24sIGJ1dCBuZWVkIHRvIHZlcmlmeQorCQlfc2F2ZTogZnVuY3Rpb24oZSl7CisJCQkvLyBGSVhNRTogaG93IHNob3VsZCB0aGlzIGJlaGF2ZSB3aGVuIHRoZXJlJ3MgYSBsYXJnZXIgZm9ybSBpbiBwbGF5PworCQkJaWYoIXRoaXMuaXNDbG9zZWQpeworCQkJCWRvam8uZGVidWcoInNhdmUgYXR0ZW1wdCIpOworCQkJCWlmKHRoaXMuc2F2ZVVybC5sZW5ndGgpeworCQkJCQl2YXIgY29udGVudCA9IHt9OworCQkJCQljb250ZW50W3RoaXMuc2F2ZUFyZ05hbWVdID0gdGhpcy5nZXRFZGl0b3JDb250ZW50KCk7CisJCQkJCWRvam8uaW8uYmluZCh7CisJCQkJCQltZXRob2Q6IHRoaXMuc2F2ZU1ldGhvZCwKKwkJCQkJCXVybDogdGhpcy5zYXZlVXJsLAorCQkJCQkJY29udGVudDogY29udGVudAorCQkJCQl9KTsKKwkJCQl9ZWxzZXsKKwkJCQkJZG9qby5kZWJ1ZygicGxlYXNlIHNldCBhIHNhdmVVcmwgZm9yIHRoZSBlZGl0b3IiKTsKKwkJCQl9CisJCQkJaWYodGhpcy5jbG9zZU9uU2F2ZSl7CisJCQkJCXRoaXMuY2xvc2UoZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSA9PSAic2F2ZSIpOworCQkJCX0KKwkJCX0KKwkJfSovCisJfQorKTsKKworLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkJpbmQiKTsKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisgICJzdHJ1dHMud2lkZ2V0LkJpbmQiLAorICBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7CisgIHdpZGdldFR5cGUgOiAiQmluZCIsCisgIGV4ZWN1dGVTY3JpcHRzIDogZmFsc2UsCisgIHNjcmlwdFNlcGFyYXRpb24gOiBmYWxzZSwKKyAgdGFyZ2V0cyA6ICIiLAorICB0YXJnZXRzQXJyYXkgOiBudWxsLAorICBocmVmIDogIiIsCisgIGhhbmRsZXIgOiAiIiwKKworICAvL21lc3NhZ2VzCisgIGxvYWRpbmdUZXh0IDogIkxvYWRpbmcuLi4iLAorICBlcnJvclRleHQgOiAiIiwKKyAgc2hvd0Vycm9yIDogdHJ1ZSwKKyAgc2hvd0xvYWRpbmcgOiBmYWxzZSwKKworICAvL3B1Yi9zdWIgZXZlbnRzCisgIGxpc3RlblRvcGljcyA6ICIiLAorICBub3RpZnlUb3BpY3MgOiAiIiwKKyAgbm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBiZWZvcmVOb3RpZnlUb3BpY3MgOiAiIiwKKyAgYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICBhZnRlck5vdGlmeVRvcGljcyA6ICIiLAorICBhZnRlck5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgZXJyb3JOb3RpZnlUb3BpY3MgOiAiIiwKKyAgZXJyb3JOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisKKyAgZm9ybUlkIDogIiIsCisgIGZvcm1GaWx0ZXIgOiAiIiwKKyAgZm9ybU5vZGUgOiBudWxsLAorCisgIGV2ZW50cyA6ICIiLAorICBpbmRpY2F0b3IgOiAiIiwKKworICBwYXJzZUNvbnRlbnQgOiB0cnVlLAorICAKKyAgaGlnaGxpZ2h0Q29sb3IgOiAiIiwKKyAgaGlnaGxpZ2h0RHVyYXRpb24gOiAyMDAwLAorICAKKyAgdmFsaWRhdGUgOiBmYWxzZSwKKyAgYWpheEFmdGVyVmFsaWRhdGlvbiA6IGZhbHNlLAorICAKKyAgLy91c2VkIGZvciBzY3JpcHRzIGRvd25sb2FkaW5nICYgY2FjaGluZworICBjYWNoZUNvbnRlbnQgOiB0cnVlLAorICAvL3J1biBzY3JpcHQgb24gaXRzIG93biBzY29wZQorICBzY3JpcHRTZXBhcmF0aW9uIDogdHJ1ZSwKKyAgLy9zY29wZSBmb3IgdGhlIGNyaXB0IHNlcGFyYXRpb24KKyAgc2NyaXB0U2NvcGUgOiBudWxsLAorICB0cmFuc3BvcnQgOiAiIiwKKyAgIAorICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworCisgICAgLy9hdHRhY2ggbGlzdGVuZXJzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5saXN0ZW5Ub3BpY3MpKSB7CisgICAgICB0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIgKyB0aGlzLmxpc3RlblRvcGljcyArICIgdG8gcmVmcmVzaCIpOworICAgICAgdmFyIHRvcGljcyA9IHRoaXMubGlzdGVuVG9waWNzLnNwbGl0KCIsIik7CisgICAgICBpZih0b3BpY3MpIHsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2godG9waWNzLCBmdW5jdGlvbih0b3BpYyl7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWMsIHNlbGYsICJyZWxvYWRDb250ZW50cyIpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL3RvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5ub3RpZnlUb3BpY3NBcnJheSA9IHRoaXMubm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorICAgIAorICAgIC8vYmVmb3JlIHRvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorICAgIAorICAgIC8vYWZ0ZXIgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5hZnRlck5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgLy9lcnJvciB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5lcnJvck5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudGFyZ2V0cykpIHsKKyAgICAgIC8vc3BsaXQgdGFyZ2V0cworICAgICAgdGhpcy50YXJnZXRzQXJyYXkgPSB0aGlzLnRhcmdldHMuc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmV2ZW50cykpIHsKKyAgICAgIHZhciBldmVudHNBcnJheSA9IHRoaXMuZXZlbnRzLnNwbGl0KCIsIik7CisgICAgICBpZihldmVudHNBcnJheSAmJiB0aGlzLmRvbU5vZGUpIHsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2goZXZlbnRzQXJyYXksIGZ1bmN0aW9uKGV2ZW50KXsKKyAgICAgICAgICAgZG9qby5ldmVudC5jb25uZWN0KHNlbGYuZG9tTm9kZSwgZXZlbnQsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgICAgICBzZWxmLnJlbG9hZENvbnRlbnRzKCk7CisgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZm9ybUlkKSkgeworICAgICAgLy9ubyBmb3JtSWQsIHNlZSBpZiB3ZSBhcmUgaW5zaWRlIGEgZm9ybQorICAgICAgdGhpcy5mb3JtTm9kZSA9IGRvam8uZG9tLmdldEZpcnN0QW5jZXN0b3JCeVRhZyh0aGlzLmRvbU5vZGUsICJmb3JtIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZm9ybU5vZGUgPSBkb2pvLmJ5SWQodGhpcy5mb3JtSWQpOworICAgIH0KKworICAgIGlmKHRoaXMuZm9ybU5vZGUgJiYgZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmhyZWYpKSB7CisgICAgICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1Ob2RlLmFjdGlvbjsKKyAgICB9CisgIH0sCisKKyAgaGlnaGxpZ2h0IDogZnVuY3Rpb24oKSB7CisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5oaWdobGlnaHRDb2xvcikpIHsKKyAgICAgIHZhciBub2RlcyA9IFtdOworICAgICAgLy9hZGQgbm9kZXMgdG8gYXJyYXkKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRoaXMudGFyZ2V0c0FycmF5LCBmdW5jdGlvbih0YXJnZXQpIHsKKyAgICAgICAgdmFyIG5vZGUgPSBkb2pvLmJ5SWQodGFyZ2V0KTsKKyAgICAgICAgaWYobm9kZSkgeworICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgdmFyIGVmZmVjdCA9IGRvam8ubGZ4Lmh0bWwuaGlnaGxpZ2h0KG5vZGVzLCB0aGlzLmhpZ2hsaWdodENvbG9yLCB0aGlzLmhpZ2hsaWdodER1cmF0aW9uKTsKKyAgICAgIGVmZmVjdC5wbGF5KCk7ICAgIAorICAgIH0KKyAgfSwKKyAgCisgIGxvZyA6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICBkb2pvLmRlYnVnKCJbIiArICh0aGlzLndpZGdldElkID8gdGhpcy53aWRnZXRJZCA6ICJ1bmtub3duIikgICsgIl0gIiArIHRleHQpOworICB9LAorCisgIHNldENvbnRlbnQgOiBmdW5jdGlvbih0ZXh0KSB7CisgICAgaWYodGhpcy50YXJnZXRzQXJyYXkpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKwkgIHZhciB4bWxQYXJzZXIgPSBuZXcgZG9qby54bWwuUGFyc2UoKTsKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRoaXMudGFyZ2V0c0FycmF5LCBmdW5jdGlvbih0YXJnZXQpIHsKKyAgICAgICAgdmFyIG5vZGUgPSBkb2pvLmJ5SWQodGFyZ2V0KTsKKyAgICAgICAgaWYobm9kZSkgeworICAgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gdGV4dDsKKyAgCisgICAgICAgICAgaWYoc2VsZi5wYXJzZUNvbnRlbnQgJiYgdGV4dCAhPSBzZWxmLmxvYWRpbmdUZXh0KXsKKyAgICAgICAgICAgIHZhciBmcmFnICA9IHhtbFBhcnNlci5wYXJzZUVsZW1lbnQobm9kZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBkb2pvLndpZGdldC5nZXRQYXJzZXIoKS5jcmVhdGVTdWJDb21wb25lbnRzKGZyYWcsIGRvam8ud2lkZ2V0LmJ5SWQodGFyZ2V0KSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYubG9nKCJVbmFibGUgdG8gZmluZCB0YXJnZXQ6ICIgKyBub2RlKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9LAorICAKKyAgYmluZEhhbmRsZXIgOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgLy9oaWRlIGluZGljYXRvcgorICAgIGRvam8uaHRtbC5oaWRlKHRoaXMuaW5kaWNhdG9yKTsKKyAgICAKKyAgICAvL3B1Ymxpc2ggdG9waWNzCisgICAgdGhpcy5ub3RpZnkoZGF0YSwgdHlwZSwgZSk7CisgICAgCisgICAgaWYodHlwZSA9PSAibG9hZCIpIHsKKyAgICAgIGlmKHRoaXMudmFsaWRhdGUpIHsKKyAgICAgICAgU3RydXRzVXRpbHMuY2xlYXJWYWxpZGF0aW9uRXJyb3JzKHRoaXMuZm9ybU5vZGUpOworICAgICAgICAvL3ZhbGlkYXRpb24gaXMgYWN0aXZlIGZvciB0aGlzIGFjdGlvbgorICAgICAgICB2YXIgZXJyb3JzID0gU3RydXRzVXRpbHMuZ2V0VmFsaWRhdGlvbkVycm9ycyhkYXRhKTsKKyAgICAgICAgaWYoZXJyb3JzICYmIGVycm9ycy5maWVsZEVycm9ycykgeworICAgICAgICAgIC8vdmFsaWRhdGlvbiBmYWlsZWQKKyAgICAgICAgICBTdHJ1dHNVdGlscy5zaG93VmFsaWRhdGlvbkVycm9ycyh0aGlzLmZvcm1Ob2RlLCBlcnJvcnMpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvL3ZhbGlkYXRpb24gcGFzc2VkCisgICAgICAgICAgaWYoIXRoaXMuYWpheEFmdGVyVmFsaWRhdGlvbiAmJiB0aGlzLmZvcm1Ob2RlKSB7CisgICAgICAgICAgICAvL3JlZ3VsYXIgc3VibWl0CisgICAgICAgICAgICB0aGlzLmZvcm1Ob2RlLnN1Ym1pdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAKKyAgICAgIAorICAgICAgLy8gbm8gdmFsaWRhdGlvbiBvciB2YWxpZGF0aW9uIHBhc3NlZAorICAgICAgaWYodGhpcy5leGVjdXRlU2NyaXB0cykgeworICAgICAgICAvL3BhcnNlIHRleHQgdG8gZXh0cmFjdCBjb250ZW50IGFuZCBqYXZhc2NyaXB0CisgICAgICAgIHZhciBwYXJzZWQgPSB0aGlzLnBhcnNlKGRhdGEpOworICAgICAgICAgCisgICAgICAgIC8vdXBkYXRlIHRhcmdldHMgY29udGVudAorICAgICAgICB0aGlzLnNldENvbnRlbnQocGFyc2VkLnRleHQpOworICAgICAgICAKKyAgICAgICAgLy9leGVjdXRlIHNjcmlwdHMKKyAgICAgICAgdGhpcy5fZXhlY3V0ZVNjcmlwdHMocGFyc2VkLnNjcmlwdHMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRoaXMuc2V0Q29udGVudChkYXRhKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuaGlnaGxpZ2h0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmKHRoaXMuc2hvd0Vycm9yKSB7CisgICAgICAgIHZhciBtZXNzYWdlID0gZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yVGV4dCkgPyBlLm1lc3NhZ2UgOiB0aGlzLmVycm9yVGV4dDsKKyAgICAgICAgdGhpcy5zZXRDb250ZW50KG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBub3RpZnkgOiBmdW5jdGlvbihkYXRhLCB0eXBlLCBlKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIC8vZ2VuZXJhbCB0b3BpY3MKKyAgICBpZih0aGlzLm5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLm5vdGlmeVRvcGljc0FycmF5LCBmdW5jdGlvbih0b3BpYykgeworICAgICAgICB0cnkgeworICAgICAgICAgIGRvam8uZXZlbnQudG9waWMucHVibGlzaCh0b3BpYywgZGF0YSwgdHlwZSwgZSwgc2VsZik7CisgICAgICAgIH0gY2F0Y2goZXgpeworCQkgIHNlbGYubG9nKGV4KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICAgIAorICAgIC8vYmVmb3JlLCBhZnRlciBhbmQgZXJyb3IgdG9waWNzCisgICAgdmFyIHRvcGljc0FycmF5ID0gbnVsbDsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgY2FzZSAiYmVmb3JlIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLmJlZm9yZU5vdGlmeVRvcGljc0FycmF5LCBudWxsLCBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJsb2FkIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXksIGRhdGEsIGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImVycm9yIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXksIGRhdGEsIGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0sCisgIAorICBub3RpZnlUbyA6IGZ1bmN0aW9uKHRvcGljc0FycmF5LCBkYXRhLCBlKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIGlmKHRvcGljc0FycmF5KSB7CisgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0b3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgIGRvam8uZXZlbnQudG9waWMucHVibGlzaCh0b3BpYywgZGF0YSwgZSwgc2VsZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBlLCBzZWxmKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaChleCl7CisgICAgICAgIHNlbGYubG9nKGV4KTsKKyAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBvbkRvd25sb2FkU3RhcnQgOiBmdW5jdGlvbihldmVudCkgeworICAgIGlmKHRoaXMuc2hvd0xvYWRpbmcgJiYgIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5sb2FkaW5nVGV4dCkpIHsKKyAgICAgIGV2ZW50LnRleHQgPSB0aGlzLmxvYWRpbmdUZXh0OworICAgIH0KKyAgfSwKKworICByZWxvYWRDb250ZW50cyA6IGZ1bmN0aW9uKGV2dCkgeworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaGFuZGxlcikpIHsKKyAgICAgIC8vdXNlIGN1c3RvbSBoYW5kbGVyCisgICAgICB0aGlzLmxvZygiSW52b2tpbmcgaGFuZGxlcjogIiArIHRoaXMuaGFuZGxlcik7CisgICAgICB3aW5kb3dbdGhpcy5oYW5kbGVyXSh0aGlzLCB0aGlzLmRvbU5vZGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgICAgIHZhciByZXF1ZXN0ID0ge2NhbmNlbDogZmFsc2V9OworICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMud2lkZ2V0SWQsICJiZWZvcmUiLCByZXF1ZXN0KTsKKyAgICAgICAgICBpZihyZXF1ZXN0LmNhbmNlbCkgeworICAgICAgICAgICAgdGhpcy5sb2coIlJlcXVlc3QgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvL2lmIHRoZSBocmVmIGlzIG51bGwsIHdlIHN0aWxsIHB1Ymxpc2ggdGhlIG5vdGlmeSB0b3BpY3MKKyAgICAgICAgICBpZihkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaHJlZikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgcGFyZW50IGZvcm0sIGFuZCBpdCBoYXMgYSAib25zdWJtaXQiCisgICAgICAgICAgLy9leGVjdXRlIGl0LCB2YWxpZGF0aW9uIGlzIHVzdWFsbHkgdGhlcmUsIGV4Y2VwdCBpcyB2YWxpZGF0aW9uID09IHRydWUKKyAgICAgICAgICAvL29uIHdoaWNoIGNhc2UgaXQgaXMgYWpheCB2YWxpZGF0aW9uLCBpbnN0ZWFkIG9mIGNsaWVudCBzaWRlCisgICAgICAgICAgaWYoIXRoaXMudmFsaWRhdGUgJiYgdGhpcy5mb3JtTm9kZSAmJiB0aGlzLmZvcm1Ob2RlLm9uc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhciBtYWtlUmVxdWVzdCA9IHRoaXMuZm9ybU5vZGUub25zdWJtaXQuY2FsbChldnQpOworICAgICAgICAgICAgaWYobWFrZVJlcXVlc3QgIT0gbnVsbCAmJiAhbWFrZVJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgdGhpcy5sb2coIlJlcXVlc3QgY2FuY2VsZWQgYnkgJ29uc3VibWl0JyBvZiB0aGUgZm9ybSIpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy9zaG93IGluZGljYXRvcgorICAgICAgICAgIGRvam8uaHRtbC5zaG93KHRoaXMuaW5kaWNhdG9yKTsKKwkJICBpZih0aGlzLnNob3dMb2FkaW5nKSB7CisgICAgICAgICAgICB0aGlzLnNldENvbnRlbnQodGhpcy5sb2FkaW5nVGV4dCk7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHZhciB0bXBIcmVmID0gdGhpcy5ocmVmOworICAgICAgICAgIHRtcEhyZWYgPSB0bXBIcmVmICsgKHRtcEhyZWYuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpICsgInN0cnV0cy5lbmFibGVKU09OVmFsaWRhdGlvbj10cnVlIjsKKyAgICAgICAgICBpZighdGhpcy5hamF4QWZ0ZXJWYWxpZGF0aW9uICYmIHRoaXMudmFsaWRhdGUpIHsKKyAgICAgICAgICAgIHRtcEhyZWYgPSB0bXBIcmVmICsgKHRtcEhyZWYuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpICsgInN0cnV0cy52YWxpZGF0ZU9ubHk9dHJ1ZSI7CisgICAgICAgICAgfSAgCisgICAgICAgICAgCisgICAgICAgICAgaWYoZG9qby5kb20uaXNUYWcodGhpcy5kb21Ob2RlLCAiSU5QVVQiLCAiaW5wdXQiKSAKKyAgICAgICAgICAgICAmJiB0aGlzLmV2ZW50cyA9PSAib25jbGljayIgCisgICAgICAgICAgICAgJiYgdGhpcy5kb21Ob2RlLnR5cGUgPT0gInN1Ym1pdCIKKyAgICAgICAgICAgICAmJiAhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmRvbU5vZGUubmFtZSkKKyAgICAgICAgICAgICAmJiAhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmRvbU5vZGUudmFsdWUpKSB7CisgICAgICAgICAgICAgdmFyIGVuYyA9IC91dGYvaS50ZXN0KCIiKSA/IGVuY29kZVVSSUNvbXBvbmVudCA6IGRvam8uc3RyaW5nLmVuY29kZUFzY2lpCisgICAgICAgICAgICAgdG1wSHJlZiA9IHRtcEhyZWYgKyAodG1wSHJlZi5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyBlbmModGhpcy5kb21Ob2RlLm5hbWUpICsgIj0iICsgZW5jKHRoaXMuZG9tTm9kZS52YWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZG9qby5pby5iaW5kKHsKKyAgICAgICAgICAgIHVybDogdG1wSHJlZiwKKyAgICAgICAgICAgIHVzZUNhY2hlOiBmYWxzZSwKKyAgICAgICAgICAgIHByZXZlbnRDYWNoZTogdHJ1ZSwKKyAgICAgICAgICAgIGZvcm1Ob2RlOiBzZWxmLmZvcm1Ob2RlLAorICAgICAgICAgICAgZm9ybUZpbHRlcjogd2luZG93W3NlbGYuZm9ybUZpbHRlcl0sCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHNlbGYudHJhbnNwb3J0LAorICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24odHlwZSwgZGF0YSwgZSkgeworICAgICAgICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgImJpbmRIYW5kbGVyIikodHlwZSwgZGF0YSwgZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbWltZXR5cGU6ICJ0ZXh0L2h0bWwiCisgICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKGV4KSB7CisgICAgICAgIGlmKHRoaXMuc2hvd0Vycm9yKSB7CisgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JUZXh0KSA/IGV4IDogdGhpcy5lcnJvclRleHQ7CisgICAgICAgICAgdGhpcy5zZXRDb250ZW50KG1lc3NhZ2UpOworICAgICAgICB9ICAKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgLy9mcm9tIERvam8ncyBDb250ZW50UGFuZQorICBwYXJzZSA6IGZ1bmN0aW9uKHMpIHsKKyAgICB0aGlzLmxvZygiUGFyc2luZzogIiArIHMpOworICAgIHZhciBtYXRjaCA9IFtdOworICAgIHZhciB0bXAgPSBbXTsKKyAgICB2YXIgc2NyaXB0cyA9IFtdOworICAgIHdoaWxlKG1hdGNoKXsKKyAgICAgIG1hdGNoID0gcy5tYXRjaCgvPHNjcmlwdChbXj5dKik+KFtcc1xTXSo/KTxcL3NjcmlwdD4vaSk7CisgICAgICBpZighbWF0Y2gpeyBicmVhazsgfQorICAgICAgaWYobWF0Y2hbMV0peworICAgICAgICBhdHRyID0gbWF0Y2hbMV0ubWF0Y2goL3NyYz0oWyciXT8pKFteIiddKilcMS9pKTsKKyAgICAgICAgaWYoYXR0cil7CisgICAgICAgICAgLy8gcmVtb3ZlIGEgZG9qby5qcyBvciBkb2pvLmpzLnVuY29tcHJlc3NlZC5qcyBmcm9tIHJlbW90ZVNjcmlwdHMKKyAgICAgICAgICAvLyB3ZSBkZWNsYXJlIGFsbCBmaWxlcyB3aXRoIGRvam8uanMgYXMgYmFkLCByZWdhcmRsZXNzIG9mIGZvbGRlcgorICAgICAgICAgIHZhciB0bXAyID0gYXR0clsyXS5zZWFyY2goLy4qKFxiZG9qb1xiKD86XC51bmNvbXByZXNzZWQpP1wuanMpJC8pOworICAgICAgICAgIGlmKHRtcDIgPiAtMSl7CisgICAgICAgICAgICB0aGlzLmxvZygiU2VjdXJpdHkgbm90ZSEgaW5oaWJpdDoiK2F0dHJbMl0rIiBmcm9tICBiZWVpbmcgbG9hZGVkIGFnYWluLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYobWF0Y2hbMl0peworICAgICAgICAvLyBzdHJpcCBvdXQgYWxsIGRqQ29uZmlnIHZhcmlhYmxlcyBmcm9tIHNjcmlwdCB0YWdzIG5vZGVWYWx1ZQorICAgICAgICAvLyB0aGlzIGlzIEFCU09MVVRMWSBuZWVkZWQgYXMgcmVpbml0aWFsaXplIGRqQ29uZmlnIGFmdGVyIGRvam8gaXMgaW5pdGlhbGlzZWQKKyAgICAgICAgLy8gbWFrZXMgYSBkaXNzYXN0ZXIgZ3JlYXRlciB0aGFuIFRpdGFuaWMsIHVwZGF0ZSByZW1vdmUgd3JpdGVJbmNsdWRlcygpIHRvCisgICAgICAgIHZhciBzYyA9IG1hdGNoWzJdLnJlcGxhY2UoLyg/OnZhciApP1xiZGpDb25maWdcYig/Oltcc10qPVtcc10qXHtbXn1dK1x9fFwuW1x3XSpbXHNdKj1bXHNdKlteO1xuXSopPzs/fGRvam9cLmhvc3RlbnZcLndyaXRlSW5jbHVkZXNcKFxzKlwpOz8vZywgIiIpOworICAgICAgICBpZighc2MpeyBjb250aW51ZTsgfQorCisgICAgICAgIC8vIGN1dCBvdXQgYWxsIGRvam8ucmVxdWlyZSAoLi4uKSBjYWxscywgaWYgd2UgaGF2ZSBleGVjdXRlCisgICAgICAgIC8vIHNjcmlwdHMgZmFsc2Ugd2lkZ2V0cyBkb250IGdldCB0aGVyZSByZXF1aXJlIGNhbGxzCisgICAgICAgIC8vIGRvZXMgc3VjayBvdXQgcG9zc2libGUgd2lkZ2V0cGFja2FnZSByZWdpc3RyYXRpb24gYXMgd2VsbAorICAgICAgICB0bXAgPSBbXTsKKyAgICAgICAgd2hpbGUodG1wKXsKKyAgICAgICAgICB0bXAgPSBzYy5tYXRjaCgvZG9qb1wuKD86KD86cmVxdWlyZSg/OkFmdGVyKT8oPzpJZik/KXwoPzp3aWRnZXRcLig/Om1hbmFnZXJcLik/cmVnaXN0ZXJXaWRnZXRQYWNrYWdlKXwoPzooPzpob3N0ZW52XC4pP3NldE1vZHVsZVByZWZpeCkpXCgoWyciXSkuKj9cMVwpXHMqOz8vKTsKKyAgICAgICAgICBpZighdG1wKXsgYnJlYWs7fQorICAgICAgICAgIHNjID0gc2MucmVwbGFjZSh0bXBbMF0sICIiKTsKKyAgICAgICAgfQorICAgICAgICBzY3JpcHRzLnB1c2goc2MpOworICAgICAgfQorICAgICAgcyA9IHMucmVwbGFjZSgvPHNjcmlwdFtePl0qPltcc1xTXSo/PFwvc2NyaXB0Pi9pLCAiIik7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgIHRleHQ6IHMsCisgICAgICBzY3JpcHRzOiBzY3JpcHRzCisgICAgfTsKKyAgfSwgCisgIAorICAvL2Zyb20gRG9qbyBjb250ZW50IHBhbmUKKyAgX2V4ZWN1dGVTY3JpcHRzIDogZnVuY3Rpb24gKHNjcmlwdHMpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIHRtcCA9ICIiLCBjb2RlID0gIiI7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChzY3JpcHRzW2ldLnBhdGgpIHsKKyAgICAgICAgICAgIGRvam8uaW8uYmluZCh0aGlzLl9jYWNoZVNldHRpbmcoeyJ1cmwiOnNjcmlwdHNbaV0ucGF0aCwgImxvYWQiOmZ1bmN0aW9uICh0eXBlLCBzY3JpcHRTdHIpIHsKKyAgICAgICAgICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgdG1wID0gIjsiICsgc2NyaXB0U3RyKTsKKyAgICAgICAgICAgIH0sICJlcnJvciI6ZnVuY3Rpb24gKHR5cGUsIGVycm9yKSB7CisgICAgICAgICAgICAgICAgZXJyb3IudGV4dCA9IHR5cGUgKyAiIGRvd25sb2FkaW5nIHJlbW90ZSBzY3JpcHQiOworICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZURlZmF1bHRzLmNhbGwoc2VsZiwgZXJyb3IsICJvbkV4ZWNFcnJvciIsICJkZWJ1ZyIpOworICAgICAgICAgICAgfSwgIm1pbWV0eXBlIjoidGV4dC9wbGFpbiIsICJzeW5jIjp0cnVlfSwgdGhpcy5jYWNoZUNvbnRlbnQpKTsKKyAgICAgICAgICAgIGNvZGUgKz0gdG1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZSArPSBzY3JpcHRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHRyeSB7CisgICAgICAgIGlmICh0aGlzLnNjcmlwdFNlcGFyYXRpb24pIHsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjcmlwdFNjb3BlOworICAgICAgICAgICAgdGhpcy5zY3JpcHRTY29wZSA9IG5ldyAobmV3IEZ1bmN0aW9uKCJfY29udGFpbmVyXyIsIGNvZGUgKyAiOyByZXR1cm4gdGhpczsiKSkoc2VsZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgZGpnID0gZG9qby5nbG9iYWwoKTsKKyAgICAgICAgICAgIGlmIChkamcuZXhlY1NjcmlwdCkgeworICAgICAgICAgICAgICAgIGRqZy5leGVjU2NyaXB0KGNvZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YXIgZGpkID0gZG9qby5kb2MoKTsKKyAgICAgICAgICAgICAgICB2YXIgc2MgPSBkamQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisgICAgICAgICAgICAgICAgc2MuYXBwZW5kQ2hpbGQoZGpkLmNyZWF0ZVRleHROb2RlKGNvZGUpKTsKKyAgICAgICAgICAgICAgICAodGhpcy5jb250YWluZXJOb2RlIHx8IHRoaXMuZG9tTm9kZSkuYXBwZW5kQ2hpbGQoc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICAgIGUudGV4dCA9ICJFcnJvciBydW5uaW5nIHNjcmlwdHMgZnJvbSBjb250ZW50OlxuIiArIGUuZGVzY3JpcHRpb247CisgICAgICAgIHRoaXMubG9nKGUpOworICAgIH0KKyB9LAorIAorIF9jYWNoZVNldHRpbmcgOiBmdW5jdGlvbiAoYmluZE9iaiwgdXNlQ2FjaGUpIHsKKyAgICBmb3IgKHZhciB4IGluIHRoaXMuYmluZEFyZ3MpIHsKKyAgICAgICAgaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChiaW5kT2JqW3hdKSkgeworICAgICAgICAgICAgYmluZE9ialt4XSA9IHRoaXMuYmluZEFyZ3NbeF07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZChiaW5kT2JqLnVzZUNhY2hlKSkgeworICAgICAgICBiaW5kT2JqLnVzZUNhY2hlID0gdXNlQ2FjaGU7CisgICAgfQorICAgIGlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoYmluZE9iai5wcmV2ZW50Q2FjaGUpKSB7CisgICAgICAgIGJpbmRPYmoucHJldmVudENhY2hlID0gIXVzZUNhY2hlOworICAgIH0KKyAgICBpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGJpbmRPYmoubWltZXR5cGUpKSB7CisgICAgICAgIGJpbmRPYmoubWltZXR5cGUgPSAidGV4dC9odG1sIjsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRPYmo7CisgfQorIAorfSk7CisKKworCisKK2Rvam8ucHJvdmlkZSgiZG9qby5sYW5nLnRpbWluZy5UaW1lciIpOworCisKK2Rvam8ubGFuZy50aW1pbmcuVGltZXIgPSBmdW5jdGlvbigvKmludCovIGludGVydmFsKXsKKwkvLyBzdW1tYXJ5OiBUaW1lciBvYmplY3QgZXhlY3V0ZXMgYW4gIm9uVGljaygpIiBtZXRob2QgcmVwZWF0ZWRseSBhdCBhIHNwZWNpZmllZCBpbnRlcnZhbC4gCisJLy8JCQlyZXBlYXRlZGx5IGF0IGEgZ2l2ZW4gaW50ZXJ2YWwuCisJLy8gaW50ZXJ2YWw6IEludGVydmFsIGJldHdlZW4gZnVuY3Rpb24gY2FsbHMsIGluIG1pbGxpc2Vjb25kcy4KKwl0aGlzLnRpbWVyID0gbnVsbDsKKwl0aGlzLmlzUnVubmluZyA9IGZhbHNlOworCXRoaXMuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCXRoaXMub25TdGFydCA9IG51bGw7CisJdGhpcy5vblN0b3AgPSBudWxsOworfTsKKworZG9qby5leHRlbmQoZG9qby5sYW5nLnRpbWluZy5UaW1lciwgeworCW9uVGljayA6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IE1ldGhvZCBjYWxsZWQgZXZlcnkgdGltZSB0aGUgaW50ZXJ2YWwgcGFzc2VzLiAgT3ZlcnJpZGUgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bC4KKwl9LAorCQkKKwlzZXRJbnRlcnZhbCA6IGZ1bmN0aW9uKGludGVydmFsKXsKKwkJLy8gc3VtbWFyeTogUmVzZXQgdGhlIGludGVydmFsIG9mIGEgdGltZXIsIHdoZXRoZXIgcnVubmluZyBvciBub3QuCisJCS8vIGludGVydmFsOiBOZXcgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4KKwkJaWYgKHRoaXMuaXNSdW5uaW5nKXsKKwkJCWRqX2dsb2JhbC5jbGVhckludGVydmFsKHRoaXMudGltZXIpOworCQl9CisJCXRoaXMuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKwkJaWYgKHRoaXMuaXNSdW5uaW5nKXsKKwkJCXRoaXMudGltZXIgPSBkal9nbG9iYWwuc2V0SW50ZXJ2YWwoZG9qby5sYW5nLmhpdGNoKHRoaXMsICJvblRpY2siKSwgdGhpcy5pbnRlcnZhbCk7CisJCX0KKwl9LAorCQorCXN0YXJ0IDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogU3RhcnQgdGhlIHRpbWVyIHRpY2tpbmcuCisJCS8vIGRlc2NyaXB0aW9uOiBDYWxscyB0aGUgIm9uU3RhcnQoKSIgaGFuZGxlciwgaWYgZGVmaW5lZC4KKwkJLy8gCQkJCU5vdGUgdGhhdCB0aGUgb25UaWNrKCkgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCByaWdodCBhd2F5LCAKKwkJLy8JCQkJb25seSBhZnRlciBmaXJzdCBpbnRlcnZhbCBwYXNzZXMuCisJCWlmICh0eXBlb2YgdGhpcy5vblN0YXJ0ID09ICJmdW5jdGlvbiIpeworCQkJdGhpcy5vblN0YXJ0KCk7CisJCX0KKwkJdGhpcy5pc1J1bm5pbmcgPSB0cnVlOworCQl0aGlzLnRpbWVyID0gZGpfZ2xvYmFsLnNldEludGVydmFsKGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25UaWNrIiksIHRoaXMuaW50ZXJ2YWwpOworCX0sCisJCisJc3RvcCA6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnk6IFN0b3AgdGhlIHRpbWVyLgorCQkvLyBkZXNjcmlwdGlvbjogQ2FsbHMgdGhlICJvblN0b3AoKSIgaGFuZGxlciwgaWYgZGVmaW5lZC4KKwkJaWYgKHR5cGVvZiB0aGlzLm9uU3RvcCA9PSAiZnVuY3Rpb24iKXsKKwkJCXRoaXMub25TdG9wKCk7CisJCX0KKwkJdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTsKKwkJZGpfZ2xvYmFsLmNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7CisJfQorfSk7CisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRGl2Iik7CisKKworCisKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAic3RydXRzLndpZGdldC5CaW5kRGl2IiwKKyAgZG9qby53aWRnZXQuQ29udGVudFBhbmUsIHsKKyAgICB3aWRnZXRUeXBlIDogIkJpbmREaXYiLAorCisgICAgLy9mcm9tIENvbnRlbnRQYW5lCisgICAgaHJlZiA6ICIiLAorICAgIGV4dHJhY3RDb250ZW50IDogZmFsc2UsCisgICAgcGFyc2VDb250ZW50IDogZmFsc2UsCisgICAgY2FjaGVDb250ZW50IDogZmFsc2UsCisgICAgcmVmcmVzaE9uU2hvdyA6IGZhbHNlLAorICAgIGV4ZWN1dGVTY3JpcHRzIDogZmFsc2UsCisgICAgcHJlbG9hZCA6IHRydWUsCisgICAgCisgICAgLy91cGRhdGUgdGltZXMKKyAgICB1cGRhdGVGcmVxIDogMCwKKyAgICBkZWxheSA6IDAsCisgICAgYXV0b1N0YXJ0IDogdHJ1ZSwKKyAgICB0aW1lciA6IG51bGwsCisKKyAgICAvL21lc3NhZ2VzCisgICAgbG9hZGluZ1RleHQgOiAiTG9hZGluZy4uLiIsCisgICAgc2hvd0xvYWRpbmcgOiBmYWxzZSwKKyAgICBlcnJvclRleHQgOiAiIiwKKyAgICBzaG93RXJyb3IgOiB0cnVlLAorCisgICAgLy9wdWIvc3ViIGV2ZW50cworICAgIGxpc3RlblRvcGljcyA6ICIiLAorICAgIG5vdGlmeVRvcGljcyA6ICIiLAorICAgIG5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgICBzdG9wVGltZXJMaXN0ZW5Ub3BpY3MgOiAiIiwKKyAgICBzdGFydFRpbWVyTGlzdGVuVG9waWNzIDogIiIsCisgICAgYmVmb3JlTm90aWZ5VG9waWNzIDogIiIsCisgICAgYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICAgIGFmdGVyTm90aWZ5VG9waWNzIDogIiIsCisgICAgYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgICAgZXJyb3JOb3RpZnlUb3BpY3MgOiAiIiwKKyAgICBlcnJvck5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgICAKKworICAgIC8vY2FsbGJhY2tzCisgICAgYmVmb3JlTG9hZGluZyA6ICIiLAorICAgIGFmdGVyTG9hZGluZyA6ICIiLAorCisgICAgZm9ybUlkIDogIiIsCisgICAgZm9ybUZpbHRlciA6ICIiLAorCisgICAgaW5kaWNhdG9yOiAiIiwKKworCS8vbWFrZSBkb2pvIHByb2Nlc3MgdGhlIGNvbnRlbnQKKwlwYXJzZUNvbnRlbnQgOiB0cnVlLAorCisgICAgaGlnaGxpZ2h0Q29sb3IgOiAiIiwKKyAgICBoaWdobGlnaHREdXJhdGlvbiA6IDIwMDAsCisgICAgCisgICAgLy9vbmx5IHVzZWQgd2hlbiBpbnNpZGUgYSB0YWJiZWRwYW5lbAorICAgIGRpc2FibGVkIDogZmFsc2UsCisgICAgCisgICAgdHJhbnNwb3J0IDogIiIsCisgICAgCisgICAgb25Eb3dubG9hZFN0YXJ0IDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmKCF0aGlzLnNob3dMb2FkaW5nKSB7CisgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKHRoaXMuc2hvd0xvYWRpbmcgJiYgIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5sb2FkaW5nVGV4dCkpIHsKKyAgICAgICAgZXZlbnQudGV4dCA9IHRoaXMubG9hZGluZ1RleHQ7CisgICAgICB9CisgICAgfSwKKyAgICAKKyAgICBoaWdobGlnaHQgOiBmdW5jdGlvbigpIHsKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuaGlnaGxpZ2h0Q29sb3IpKSB7CisgICAgICAgIHZhciBlZmZlY3QgPSBkb2pvLmxmeC5odG1sLmhpZ2hsaWdodChbdGhpcy5kb21Ob2RlXSwgdGhpcy5oaWdobGlnaHRDb2xvciwgdGhpcy5oaWdobGlnaHREdXJhdGlvbik7CisgICAgICAgIGVmZmVjdC5wbGF5KCk7ICAgIAorICAgICAgfSAgICAgICAgCisgICAgfSwKKworICAgIG9uRG93bmxvYWRFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkNvbnRlbnRFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkV4ZWNFcnJvciA6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB0aGlzLm9uRXJyb3IoZXZlbnQpOworICAgIH0sCisKKyAgICBvbkVycm9yIDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmKHRoaXMuc2hvd0Vycm9yKSB7CisgICAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JUZXh0KSkgeworICAgICAgICAgIGV2ZW50LnRleHQgPSB0aGlzLmVycm9yVGV4dDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnQudGV4dCA9ICIiOworICAgICAgfQorICAgIH0sCisKKyAgICBub3RpZnkgOiBmdW5jdGlvbihkYXRhLCB0eXBlLCBlKSB7CisgICAgICBpZih0aGlzLm5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5ub3RpZnlUb3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCB0eXBlLCBlLCBzZWxmKTsKKyAgICAgICAgICB9IGNhdGNoKGV4KSB7CisgICAgICAgICAgICBzZWxmLmxvZyhleCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy9iZWZvcmUsIGFmdGVyIGFuZCBlcnJvciB0b3BpY3MKKyAgICAgIHZhciB0b3BpY3NBcnJheSA9IG51bGw7CisgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlICJiZWZvcmUiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSwgbnVsbCwgZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImxvYWQiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5hZnRlck5vdGlmeVRvcGljc0FycmF5LCBkYXRhLCBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZXJyb3IiOgorICAgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5lcnJvck5vdGlmeVRvcGljc0FycmF5LCBkYXRhLCBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9LAorICAgIAorICAgIG5vdGlmeVRvIDogZnVuY3Rpb24odG9waWNzQXJyYXksIGRhdGEsIGUpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIGlmKHRvcGljc0FycmF5KSB7CisgICAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRvcGljc0FycmF5LCBmdW5jdGlvbih0b3BpYykgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlmKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCBlLCBzZWxmKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBlLCBzZWxmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goZXgpeworICAgICAgICAgIHNlbGYubG9nKGV4KTsKKyAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcG9zdENyZWF0ZSA6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpIHsKKyAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT09ICIiKSB7CisgICAgICAgICAgdGhpcy5zZXRIYW5kbGVyKHRoaXMuaGFuZGxlcik7CisgICAgICB9CisKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHZhciBoaXRjaGVkUmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgInJlZnJlc2giKSgpOworICAgICAgfTsKKyAgICAgIHZhciBoaXRjaGVkU3RhcnRUaW1lciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkb2pvLmxhbmcuaGl0Y2goc2VsZiwgInN0YXJ0VGltZXIiKSgpOworICAgICAgfTsKKworICAgICAgaWYodGhpcy51cGRhdGVGcmVxID4gMCkgeworICAgICAgICAvL3RoZXJlIGlzIGEgdGltZXIKKyAgICAgICAgdGhpcy50aW1lciA9IG5ldyBkb2pvLmxhbmcudGltaW5nLlRpbWVyKHRoaXMudXBkYXRlRnJlcSk7CisgICAgICAgIHRoaXMudGltZXIub25UaWNrID0gaGl0Y2hlZFJlZnJlc2g7CisKKyAgICAgICAgaWYodGhpcy5hdXRvU3RhcnQpIHsKKyAgICAgICAgICAvL3N0YXJ0IHRoZSB0aW1lcgorICAgICAgICAgIGlmKHRoaXMuZGVsYXkgPiAwKSB7CisgICAgICAgICAgICAvL3N0YXJ0IHRpbWUgYWZ0ZXIgZGVsYXkKKyAgICAgICAgICAgIGRvam8ubGFuZy5zZXRUaW1lb3V0KGhpdGNoZWRTdGFydFRpbWVyLCB0aGlzLmRlbGF5KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9zdGFydCB0aW1lciBub3cKKyAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy9ubyB0aW1lcgorICAgICAgICBpZih0aGlzLmRlbGF5ID4gMCkgeworICAgICAgICAgIC8vbG9hZCBhZnRlciBkZWxheQorICAgICAgICAgIGRvam8ubGFuZy5zZXRUaW1lb3V0KGhpdGNoZWRSZWZyZXNoLCB0aGlzLmRlbGF5KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvL2F0dGFjaCBsaXN0ZW5lcnMKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubGlzdGVuVG9waWNzKSkgeworICAgICAgICB0aGlzLmxvZygiTGlzdGVuaW5nIHRvICIgKyB0aGlzLmxpc3RlblRvcGljcyArICIgdG8gcmVmcmVzaCIpOworICAgICAgICB2YXIgdG9waWNzID0gdGhpcy5saXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgICAgaWYodG9waWNzKSB7CisgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2godG9waWNzLCBmdW5jdGlvbih0b3BpYyl7CisgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0b3BpYywgc2VsZiwgInJlZnJlc2giKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnN0b3BUaW1lckxpc3RlblRvcGljcykpIHsKKyAgICAgICAgdGhpcy5sb2coIkxpc3RlbmluZyB0byAiICsgdGhpcy5zdG9wVGltZXJMaXN0ZW5Ub3BpY3MgKyAiIHRvIHN0b3AgdGltZXIiKTsKKyAgICAgICAgdmFyIHN0b3BUb3BpY3MgPSB0aGlzLnN0b3BUaW1lckxpc3RlblRvcGljcy5zcGxpdCgiLCIpOworICAgICAgICBpZihzdG9wVG9waWNzKSB7CisgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goc3RvcFRvcGljcywgZnVuY3Rpb24odG9waWMpeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWMsIHNlbGYsICJzdG9wVGltZXIiKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3MpKSB7CisgICAgICAgIHRoaXMubG9nKCJMaXN0ZW5pbmcgdG8gIiArIHRoaXMuc3RvcFRpbWVyTGlzdGVuVG9waWNzICsgIiB0byBzdGFydCB0aW1lciIpOworICAgICAgICB2YXIgc3RhcnRUb3BpY3MgPSB0aGlzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgICAgaWYoc3RhcnRUb3BpY3MpIHsKKyAgICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaChzdGFydFRvcGljcywgZnVuY3Rpb24odG9waWMpeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWMsIHNlbGYsICJzdGFydFRpbWVyIik7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgCisgICAgICAvL25vdGlmeSB0b3BpY3MKKyAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMubm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLm5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy9iZWZvcmUgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmJlZm9yZU5vdGlmeVRvcGljcykpIHsKKyAgICAgICAgdGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vYWZ0ZXIgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyTm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmFmdGVyTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vZXJyb3IgdG9waWNzCisgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmVycm9yTm90aWZ5VG9waWNzKSkgeworICAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmKHRoaXMuaXNTaG93aW5nKCkgJiYgdGhpcy5wcmVsb2FkICYmIHRoaXMudXBkYXRlRnJlcSA8PSAwICYmIHRoaXMuZGVsYXkgPD0gMCkgeworICAgICAgICB0aGlzLnJlZnJlc2goKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2Rvd25sb2FkRXh0ZXJuYWxDb250ZW50OiBmdW5jdGlvbih1cmwsIHVzZUNhY2hlKSB7CisgICAgICAKKyAgICAgIHZhciByZXF1ZXN0ID0ge2NhbmNlbDogZmFsc2V9OworICAgICAgdGhpcy5ub3RpZnkodGhpcy53aWRnZXRJZCwgImJlZm9yZSIsIHJlcXVlc3QpOworICAgICAgaWYocmVxdWVzdC5jYW5jZWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvL3Nob3cgaW5kaWNhdG9yCisgICAgICBkb2pvLmh0bWwuc2hvdyh0aGlzLmluZGljYXRvcik7CisKKyAgICAgIHRoaXMuX2hhbmRsZURlZmF1bHRzKCJMb2FkaW5nLi4uIiwgIm9uRG93bmxvYWRTdGFydCIpOworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgZG9qby5pby5iaW5kKHsKKyAgICAgICAgdXJsOiB1cmwsCisgICAgICAgIHVzZUNhY2hlOiB1c2VDYWNoZSwKKyAgICAgICAgcHJldmVudENhY2hlOiAhdXNlQ2FjaGUsCisgICAgICAgIG1pbWV0eXBlOiAidGV4dC9odG1sIiwKKyAgICAgICAgZm9ybU5vZGU6IGRvam8uYnlJZChzZWxmLmZvcm1JZCksCisgICAgICAgIGZvcm1GaWx0ZXI6IHdpbmRvd1tzZWxmLmZvcm1GaWx0ZXJdLAorICAgICAgICB0cmFuc3BvcnQ6IHNlbGYudHJhbnNwb3J0LAorICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgLy9oaWRlIGluZGljYXRvcgorICAgICAgICAgIGRvam8uaHRtbC5oaWRlKHNlbGYuaW5kaWNhdG9yKTsKKworICAgICAgICAgIHNlbGYubm90aWZ5KGRhdGEsIHR5cGUsIGUpOworCisgICAgICAgICAgaWYodHlwZSA9PSAibG9hZCIpIHsKKyAgICAgICAgICAgIHNlbGYub25Eb3dubG9hZEVuZC5jYWxsKHNlbGYsIHVybCwgZGF0YSk7CisgICAgICAgICAgICBzZWxmLmhpZ2hsaWdodCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3b3JrcyBiZXN0IHdoZW4gZnJvbSBhIGxpdmUgc2VydmVyIGluc3RlYWQgb2YgZnJvbSBmaWxlIHN5c3RlbQorICAgICAgICAgICAgc2VsZi5faGFuZGxlRGVmYXVsdHMuY2FsbChzZWxmLCAiRXJyb3IgbG9hZGluZyAnIiArIHVybCArICInICgiICsgZS5zdGF0dXMgKyAiICIrICBlLnN0YXR1c1RleHQgKyAiKSIsICJvbkRvd25sb2FkRXJyb3IiKTsKKyAgICAgICAgICAgIHNlbGYub25Mb2FkKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgfSwKKworICAgIGxvZyA6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICAgIGRvam8uZGVidWcoIlsiICsgdGhpcy53aWRnZXRJZCArICJdICIgKyB0ZXh0KTsKKyAgICB9LAorCisgICAgc3RvcFRpbWVyIDogZnVuY3Rpb24oKSB7CisgICAgICBpZih0aGlzLnRpbWVyICYmIHRoaXMudGltZXIuaXNSdW5uaW5nKSB7CisgICAgICAgIHRoaXMubG9nKCJzdG9wcGluZyB0aW1lciIpOworICAgICAgICB0aGlzLnRpbWVyLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc3RhcnRUaW1lciA6IGZ1bmN0aW9uKCkgeworICAgICAgaWYodGhpcy50aW1lciAmJiAhdGhpcy50aW1lci5pc1J1bm5pbmcpIHsKKyAgICAgICAgdGhpcy5sb2coInN0YXJ0aW5nIHRpbWVyIHdpdGggdXBkYXRlIGludGVydmFsICIgKyB0aGlzLnVwZGF0ZUZyZXEpOworICAgICAgICB0aGlzLnRpbWVyLnN0YXJ0KCk7CisgICAgICB9CisgICAgfSwKKyAgICAKKyAgICAvL2Zyb20gRG9qbydzIENvbnRlbnRQYW5lCisgICAgLy9UT0RPOiByZW1vdmUgd2hlbiBmaXhlZCBvbiBEb2pvIChXVy0xODY5KQorICAgIHNwbGl0QW5kRml4UGF0aHM6ZnVuY3Rpb24gKHMsIHVybCkgeworICAgICAgdmFyIHRpdGxlcyA9IFtdLCBzY3JpcHRzID0gW10sIHRtcCA9IFtdOworICAgICAgdmFyIG1hdGNoID0gW10sIHJlcXVpcmVzID0gW10sIGF0dHIgPSBbXSwgc3R5bGVzID0gW107CisgICAgICB2YXIgc3RyID0gIiIsIHBhdGggPSAiIiwgZml4ID0gIiIsIHRhZ0ZpeCA9ICIiLCB0YWcgPSAiIiwgb3JpZ1BhdGggPSAiIjsKKyAgICAgIGlmICghdXJsKSB7CisgICAgICAgIHVybCA9ICIuLyI7CisgICAgICB9CisgICAgICBpZiAocykgeworICAgICAgICB2YXIgcmVnZXggPSAvPHRpdGxlW14+XSo+KFtcc1xTXSo/KTxcL3RpdGxlPi9pOworICAgICAgICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHMpKSB7CisgICAgICAgICAgdGl0bGVzLnB1c2gobWF0Y2hbMV0pOworICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWRqdXN0UGF0aHMpIHsKKyAgICAgICAgICB2YXIgcmVnZXhGaW5kVGFnID0gLzxbYS16XVthLXowLTldKltePl0qXHMoPzooPzpzcmN8aHJlZnxzdHlsZSk9W14+XSkrW14+XSo+L2k7CisgICAgICAgICAgdmFyIHJlZ2V4RmluZEF0dHIgPSAvXHMoc3JjfGhyZWZ8c3R5bGUpPShbJyJdPykoW1x3KClcW1xdXC8uLFxcJyItOjsjPSY/XHNAIV0rPylcMi9pOworICAgICAgICAgIHZhciByZWdleFByb3RvY29scyA9IC9eKD86WyNdfCg/Oig/Omh0dHBzP3xmdHBzP3xmaWxlfGphdmFzY3JpcHR8bWFpbHRvfG5ld3MpOikpLzsKKyAgICAgICAgICB3aGlsZSAodGFnID0gcmVnZXhGaW5kVGFnLmV4ZWMocykpIHsKKyAgICAgICAgICAgIHN0ciArPSBzLnN1YnN0cmluZygwLCB0YWcuaW5kZXgpOworICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKCh0YWcuaW5kZXggKyB0YWdbMF0ubGVuZ3RoKSwgcy5sZW5ndGgpOworICAgICAgICAgICAgdGFnID0gdGFnWzBdOworICAgICAgICAgICAgdGFnRml4ID0gIiI7CisgICAgICAgICAgICB3aGlsZSAoYXR0ciA9IHJlZ2V4RmluZEF0dHIuZXhlYyh0YWcpKSB7CisgICAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgICAgICAgb3JpZ1BhdGggPSBhdHRyWzNdOworICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJbMV0udG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgInNyYyI6CisgICAgICAgICAgICAgICAgY2FzZSAiaHJlZiI6CisgICAgICAgICAgICAgICAgaWYgKHJlZ2V4UHJvdG9jb2xzLmV4ZWMob3JpZ1BhdGgpKSB7CisgICAgICAgICAgICAgICAgICBwYXRoID0gb3JpZ1BhdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHBhdGggPSAobmV3IGRvam8udXJpLlVyaSh1cmwsIG9yaWdQYXRoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAic3R5bGUiOgorICAgICAgICAgICAgICAgIHBhdGggPSBkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQob3JpZ1BhdGgsIHVybCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYXRoID0gb3JpZ1BhdGg7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZml4ID0gIiAiICsgYXR0clsxXSArICI9IiArIGF0dHJbMl0gKyBwYXRoICsgYXR0clsyXTsKKyAgICAgICAgICAgICAgdGFnRml4ICs9IHRhZy5zdWJzdHJpbmcoMCwgYXR0ci5pbmRleCkgKyBmaXg7CisgICAgICAgICAgICAgIHRhZyA9IHRhZy5zdWJzdHJpbmcoKGF0dHIuaW5kZXggKyBhdHRyWzBdLmxlbmd0aCksIHRhZy5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyICs9IHRhZ0ZpeCArIHRhZzsKKyAgICAgICAgICB9CisgICAgICAgICAgcyA9IHN0ciArIHM7CisgICAgICAgIH0KKyAgICAgICAgcmVnZXggPSAvKD86PChzdHlsZSlbXj5dKj4oW1xzXFNdKj8pPFwvc3R5bGU+fDxsaW5rIChbXj5dKnJlbD1bJyJdP3N0eWxlc2hlZXRbJyJdP1tePl0qKT4pL2k7CisgICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpIHsKKyAgICAgICAgICBpZiAobWF0Y2hbMV0gJiYgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSA9PSAic3R5bGUiKSB7CisgICAgICAgICAgICBzdHlsZXMucHVzaChkb2pvLmh0bWwuZml4UGF0aHNJbkNzc1RleHQobWF0Y2hbMl0sIHVybCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXR0ciA9IG1hdGNoWzNdLm1hdGNoKC9ocmVmPShbJyJdPykoW14nIj5dKilcMS9pKSkgeworICAgICAgICAgICAgICBzdHlsZXMucHVzaCh7cGF0aDphdHRyWzJdfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyBzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHJlZ2V4ID0gLzxzY3JpcHQoW14+XSopPihbXHNcU10qPyk8XC9zY3JpcHQ+L2k7CisgICAgICAgIHZhciByZWdleFNyYyA9IC9zcmM9KFsnIl0/KShbXiInXSopXDEvaTsKKyAgICAgICAgdmFyIHJlZ2V4RG9qb0pzID0gLy4qKFxiZG9qb1xiXC5qcyg/OlwudW5jb21wcmVzc2VkXC5qcyk/KSQvOworICAgICAgICB2YXIgcmVnZXhJbnZhbGlkID0gLyg/OnZhciApP1xiZGpDb25maWdcYig/Oltcc10qPVtcc10qXHtbXn1dK1x9fFwuW1x3XSpbXHNdKj1bXHNdKlteO1xuXSopPzs/fGRvam9cLmhvc3RlbnZcLndyaXRlSW5jbHVkZXNcKFxzKlwpOz8vZzsKKyAgICAgICAgdmFyIHJlZ2V4UmVxdWlyZXMgPSAvZG9qb1wuKD86KD86cmVxdWlyZSg/OkFmdGVyKT8oPzpJZik/KXwoPzp3aWRnZXRcLig/Om1hbmFnZXJcLik/cmVnaXN0ZXJXaWRnZXRQYWNrYWdlKXwoPzooPzpob3N0ZW52XC4pP3NldE1vZHVsZVByZWZpeHxyZWdpc3Rlck1vZHVsZVBhdGgpfGRlZmluZU5hbWVzcGFjZSlcKChbJyJdKS4qP1wxXClccyo7Py87CisgICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpIHsKKyAgICAgICAgICBpZiAodGhpcy5leGVjdXRlU2NyaXB0cyAmJiBtYXRjaFsxXSkgeworICAgICAgICAgICAgaWYgKGF0dHIgPSByZWdleFNyYy5leGVjKG1hdGNoWzFdKSkgeworICAgICAgICAgICAgICBpZiAocmVnZXhEb2pvSnMuZXhlYyhhdHRyWzJdKSkgeworICAgICAgICAgICAgICAgIGRvam8uZGVidWcoIlNlY3VyaXR5IG5vdGUhIGluaGliaXQ6IiArIGF0dHJbMl0gKyAiIGZyb20gIGJlaW5nIGxvYWRlZCBhZ2Fpbi4iKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRzLnB1c2goe3BhdGg6YXR0clsyXX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtYXRjaFsyXSkgeworICAgICAgICAgICAgdmFyIHNjID0gbWF0Y2hbMl0ucmVwbGFjZShyZWdleEludmFsaWQsICIiKTsKKyAgICAgICAgICAgIGlmICghc2MpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAodG1wID0gcmVnZXhSZXF1aXJlcy5leGVjKHNjKSkgeworICAgICAgICAgICAgICByZXF1aXJlcy5wdXNoKHRtcFswXSk7CisgICAgICAgICAgICAgIHNjID0gc2Muc3Vic3RyaW5nKDAsIHRtcC5pbmRleCkgKyBzYy5zdWJzdHIodG1wLmluZGV4ICsgdG1wWzBdLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5leGVjdXRlU2NyaXB0cykgeworICAgICAgICAgICAgICBzY3JpcHRzLnB1c2goc2MpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBzID0gcy5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpICsgcy5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmV4dHJhY3RDb250ZW50KSB7CisgICAgICAgICAgbWF0Y2ggPSBzLm1hdGNoKC88Ym9keVtePl0qPlxzKihbXHNcU10rKVxzKjxcL2JvZHk+L2ltKTsKKyAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgIHMgPSBtYXRjaFsxXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVNjcmlwdHMgJiYgdGhpcy5zY3JpcHRTZXBhcmF0aW9uKSB7CisgICAgICAgICAgdmFyIHJlZ2V4ID0gLyg8W2EtekEtWl1bYS16QS1aMC05XSpcc1tePl0qP1xTPSkoKFsnIl0pW14+XSpzY3JpcHRTY29wZVtePl0qPikvOworICAgICAgICAgIHZhciByZWdleEF0dHIgPSAvKFtccyciOzpcKF0pc2NyaXB0U2NvcGUoLiopLzsKKyAgICAgICAgICBzdHIgPSAiIjsKKyAgICAgICAgICB3aGlsZSAodGFnID0gcmVnZXguZXhlYyhzKSkgeworICAgICAgICAgICAgdG1wID0gKCh0YWdbM10gPT0gIiciKSA/ICJcIiIgOiAiJyIpOworICAgICAgICAgICAgZml4ID0gIiI7CisgICAgICAgICAgICBzdHIgKz0gcy5zdWJzdHJpbmcoMCwgdGFnLmluZGV4KSArIHRhZ1sxXTsKKyAgICAgICAgICAgIHdoaWxlIChhdHRyID0gcmVnZXhBdHRyLmV4ZWModGFnWzJdKSkgeworICAgICAgICAgICAgICB0YWdbMl0gPSB0YWdbMl0uc3Vic3RyaW5nKDAsIGF0dHIuaW5kZXgpICsgYXR0clsxXSArICJkb2pvLndpZGdldC5ieUlkKCIgKyB0bXAgKyB0aGlzLndpZGdldElkICsgdG1wICsgIikuc2NyaXB0U2NvcGUiICsgYXR0clsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ciArPSB0YWdbMl07CisgICAgICAgICAgICBzID0gcy5zdWJzdHIodGFnLmluZGV4ICsgdGFnWzBdLmxlbmd0aCk7CisgICAgICAgICAgfQorICAgICAgICAgIHMgPSBzdHIgKyBzOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4geyJ4bWwiOnMsICJzdHlsZXMiOnN0eWxlcywgInRpdGxlcyI6dGl0bGVzLCAicmVxdWlyZXMiOnJlcXVpcmVzLCAic2NyaXB0cyI6c2NyaXB0cywgInVybCI6dXJsfTsKKyAgICB9Cit9KTsKKworLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkJpbmRBbmNob3IiKTsKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisgICJzdHJ1dHMud2lkZ2V0LkJpbmRBbmNob3IiLAorICBzdHJ1dHMud2lkZ2V0LkJpbmQsIHsKKyAgd2lkZ2V0VHlwZSA6ICJCaW5kQW5jaG9yIiwKKworICBldmVudHM6ICJvbmNsaWNrIiwKKworICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgIHN0cnV0cy53aWRnZXQuQmluZEFuY2hvci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgIHRoaXMuZG9tTm9kZS5ocmVmID0gIiMiOworICB9Cit9KTsKKworCisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5odG1sLnN0YWJpbGUiKTsKKworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlID0geworCS8vIHN1bW1hcnk6IE1haW50YWluIHN0YXRlIG9mIHdpZGdldHMgd2hlbiB1c2VyIGhpdHMgYmFjay9mb3J3YXJkIGJ1dHRvbgorCisJLy8gQ2hhcmFjdGVycyB0byBxdW90ZSBpbiBzaW5nbGUtcXVvdGVkIHJlZ2V4cHJzCisJX3NxUXVvdGFibGVzOiBuZXcgUmVnRXhwKCIoW1xcXFwnXSkiLCAiZyIpLAorCisJLy8gQ3VycmVudCBkZXB0aC4KKwlfZGVwdGg6IDAsCisKKwkvLyBTZXQgdG8gdHJ1ZSB3aGVuIGNhbGxpbmcgdi50b1N0cmluZywgdG8gc25pZmYgZm9yIGluZmluaXRlCisJLy8gcmVjdXJzaW9uLgorCV9yZWN1cjogZmFsc2UsCisKKwkvLyBMZXZlbHMgb2YgbmVzdGluZyBvZiBBcnJheSBhbmQgb2JqZWN0IGRpc3BsYXlzLgorCS8vIElmIHdoZW4gPj0gZGVwdGgsIG5vIGRpc3BsYXkgb3IgYXJyYXkgb3Igb2JqZWN0IGludGVybmFscy4KKwlkZXB0aExpbWl0OiAyCit9OworCisvLy8vIFBVQkxJQyBNRVRIT0RTCisKK2Rvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uKGlkKXsKKwkvLyBzdW1tYXJ5CisJLy8JR2V0IHRoZSBzdGF0ZSBzdG9yZWQgZm9yIHRoZSB3aWRnZXQgd2l0aCB0aGUgZ2l2ZW4gSUQsIG9yIHVuZGVmaW5lZAorCS8vCWlmIG5vbmUuCisKKwlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuc2V0dXAoKTsKKwlyZXR1cm4gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlW2lkXTsKK30KKworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLnNldFN0YXRlID0gZnVuY3Rpb24oaWQsIHN0YXRlLCBpc0NvbW1pdCl7CisJLy8gc3VtbWFyeQorCS8vCQlTZXQgdGhlIHN0YXRlIHN0b3JlZCBmb3IgdGhlIHdpZGdldCB3aXRoIHRoZSBnaXZlbiBJRC4gIElmIGlzQ29tbWl0CisJLy8JCWlzIHRydWUsIGNvbW1pdHMgYWxsIHdpZGdldCBzdGF0ZSB0byBtb3JlIHN0YWJsZSBzdG9yYWdlLgorCisJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLnNldHVwKCk7CisJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlW2lkXSA9IHN0YXRlOworCWlmKGlzQ29tbWl0KXsKKwkJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmNvbW1pdChkb2pvLndpZGdldC5odG1sLnN0YWJpbGUud2lkZ2V0U3RhdGUpOworCX0KK30KKworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLnNldHVwID0gZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5CisJLy8JCVNldHMgdXAgd2lkZ2V0U3RhdGU6IGEgaGFzaCBrZXllZCBieSB3aWRnZXRJZCwgbWFwcyB0byBhbiBvYmplY3QKKwkvLwkJb3IgYXJyYXkgd3JpdGFibGUgd2l0aCAiZGVzY3JpYmUiLiAgSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUgd2lkZ2V0CisJLy8JCXN0b3JhZ2UgYXJlYSwgdXNlIGl0LCBvdGhlcndpc2UgaW5pdGlhbGl6ZSBhbiBlbXB0eSBvYmplY3QuCisKKwlpZighZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlKXsKKwkJdmFyIHRleHQgPSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2dldFN0b3JhZ2UoKS52YWx1ZTsKKwkJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLndpZGdldFN0YXRlID0gdGV4dCA/IGRqX2V2YWwoIigiK3RleHQrIikiKSA6IHt9OworCX0KK30KKworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmNvbW1pdCA9IGZ1bmN0aW9uKHN0YXRlKXsKKwkvLyBzdW1tYXJ5CisJLy8JCUNvbW1pdHMgYWxsIHdpZGdldCBzdGF0ZSB0byBtb3JlIHN0YWJsZSBzdG9yYWdlLCBzbyBpZiB0aGUgdXNlcgorCS8vCQluYXZpZ2F0ZXMgYXdheSBhbmQgcmV0dXJucywgaXQgY2FuIGJlIHJlc3RvcmVkLgorCisJZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9nZXRTdG9yYWdlKCkudmFsdWUgPSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVzY3JpcHRpb24oc3RhdGUpOworfQorCitkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbih2LCBzaG93QWxsKXsKKwkvLyBzdW1tYXJ5CisJLy8JCVJldHVybiBhIEpTT04gImRlc2NyaXB0aW9uIHN0cmluZyIgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKwkvLwkJU3VwcG9ydHMgb25seSBjb3JlIEphdmFTY3JpcHQgdHlwZXMgd2l0aCBsaXRlcmFscywgcGx1cyBEYXRlLAorCS8vCQlhbmQgY3ljbGljIHN0cnVjdHVyZXMgYXJlIHVuc3VwcG9ydGVkLgorCS8vCQlzaG93QWxsIGRlZmF1bHRzIHRvIGZhbHNlIC0tIGlmIHRydWUsIHRoaXMgYmVjb21lcyBhIHNpbXBsZSBzeW1ib2xpYworCS8vCQlvYmplY3QgZHVtcGVyLCBidXQgeW91IGNhbm5vdCAiZXZhbCIgdGhlIG91dHB1dC4KKworCS8vIFNhdmUgYW5kIGxhdGVyIHJlc3RvcmUgZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9kZXB0aDsKKwl2YXIgZGVwdGggPSBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2RlcHRoOworCisJdmFyIGRlc2NyaWJlVGhpcyA9IGZ1bmN0aW9uKCkgeworCQkgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24odGhpcywgdHJ1ZSk7CisJfSAKKwkKKwl0cnkgeworCisJCWlmKHY9PT12b2lkKDApKXsKKwkJCXJldHVybiAidW5kZWZpbmVkIjsKKwkJfQorCQlpZih2PT09bnVsbCl7CisJCQlyZXR1cm4gIm51bGwiOworCQl9CisJCWlmKHR5cGVvZih2KT09ImJvb2xlYW4iIHx8IHR5cGVvZih2KT09Im51bWJlciIKKwkJICAgIHx8IHYgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHYgaW5zdGFuY2VvZiBOdW1iZXIpeworCQkJcmV0dXJuIHYudG9TdHJpbmcoKTsKKwkJfQorCisJCWlmKHR5cGVvZih2KT09InN0cmluZyIgfHwgdiBpbnN0YW5jZW9mIFN0cmluZyl7CisJCQkvLyBRdW90ZSBzdHJpbmdzIGFuZCB0aGVpciBjb250ZW50cyBhcyByZXF1aXJlZC4KKwkJCS8vIFJlcGxhY2luZyBieSAkJiBmYWlscyBpbiBJRSA1LjAKKwkJCXZhciB2MSA9IHYucmVwbGFjZShkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX3NxUXVvdGFibGVzLCAiXFwkMSIpOyAKKwkJCXYxID0gdjEucmVwbGFjZSgvXG4vZywgIlxcbiIpOworCQkJdjEgPSB2MS5yZXBsYWNlKC9cci9nLCAiXFxyIik7CisJCQkvLyBBbnkgb3RoZXIgaW1wb3J0YW50IHNwZWNpYWwgY2FzZXM/CisJCQlyZXR1cm4gIiciK3YxKyInIjsKKwkJfQorCisJCWlmKHYgaW5zdGFuY2VvZiBEYXRlKXsKKwkJCS8vIENyZWF0ZSBhIGRhdGEgY29uc3RydWN0b3IuCisJCQlyZXR1cm4gIm5ldyBEYXRlKCIrZC5nZXRGdWxsWWVhcisiLCIrZC5nZXRNb250aCgpKyIsIitkLmdldERhdGUoKSsiKSI7CisJCX0KKworCQl2YXIgZDsKKwkJaWYodiBpbnN0YW5jZW9mIEFycmF5IHx8IHYucHVzaCl7CisJCQkvLyAicHVzaCIgdGVzdCBuZWVkZWQgZm9yIEtIVE1ML1NhZmFyaSwgZG9uJ3Qga25vdyB3aHkgLWNwCisKKwkJCWlmKGRlcHRoPj1kb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGVwdGhMaW1pdCkKKwkJCSAgcmV0dXJuICJbIC4uLiBdIjsKKworCQkJZCA9ICJbIjsKKwkJCXZhciBmaXJzdCA9IHRydWU7CisJCQlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2RlcHRoKys7CisJCQlmb3IodmFyIGk9MDsgaTx2Lmxlbmd0aDsgaSsrKXsKKwkJCQkvLyBTa2lwIGZ1bmN0aW9ucyBhbmQgdW5kZWZpbmVkIHZhbHVlcworCQkJCS8vIGlmKHZbaV09PXVuZGVmIHx8IHR5cGVvZih2W2ldKT09ImZ1bmN0aW9uIikKKwkJCQkvLyAgIGNvbnRpbnVlOworCQkJCWlmKGZpcnN0KXsKKwkJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCQl9ZWxzZXsKKwkJCQkJZCArPSAiLCI7CisJCQkJfQorCQkJCWQrPWFyZ3VtZW50cy5jYWxsZWUodltpXSwgc2hvd0FsbCk7CisJCQl9CisJCQlyZXR1cm4gZCsiXSI7CisJCX0KKworCQlpZih2LmNvbnN0cnVjdG9yPT1PYmplY3QKKwkJICAgIHx8IHYudG9TdHJpbmc9PWRlc2NyaWJlVGhpcyl7CisJCQlpZihkZXB0aD49ZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRlcHRoTGltaXQpCisJCQkgIHJldHVybiAieyAuLi4gfSI7CisKKwkJCS8vIEluc3RhbmNlb2YgSGFzaCBpcyBnb29kLCBvciBpZiB3ZSBqdXN0IHVzZSBPYmplY3RzLAorCQkJLy8gd2UgY2FuIHNheSB2LmNvbnN0cnVjdG9yPT1PYmplY3QuCisJCQkvLyBJRSAoNT8pIGxhY2tzIGhhc093blByb3BlcnR5LCBidXQgcGVyaGFwcyBvYmplY3RzIGRvIG5vdCBhbHdheXMKKwkJCS8vIGhhdmUgcHJvdG90eXBlcz8/CisJCQlpZih0eXBlb2Yodi5oYXNPd25Qcm9wZXJ0eSkhPSJmdW5jdGlvbiIgJiYgdi5wcm90b3R5cGUpeworCQkJCXRocm93IG5ldyBFcnJvcigiZGVzY3JpcHRpb246ICIrdisiIG5vdCBzdXBwb3J0ZWQgYnkgc2NyaXB0IGVuZ2luZSIpOworCQkJfQorCQkJdmFyIGZpcnN0ID0gdHJ1ZTsKKwkJCWQgPSAieyI7CisJCQlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX2RlcHRoKys7CisJCQlmb3IodmFyIGtleSBpbiB2KXsKKwkJCQkvLyBTa2lwIHZhbHVlcyB0aGF0IGFyZSBmdW5jdGlvbnMgb3IgdW5kZWZpbmVkLgorCQkJCWlmKHZba2V5XT09dm9pZCgwKSB8fCB0eXBlb2YodltrZXldKT09ImZ1bmN0aW9uIikKKwkJCQkJY29udGludWU7CisJCQkJaWYoZmlyc3QpeworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCX1lbHNleworCQkJCQlkICs9ICIsICI7CisJCQkJfQorCQkJCXZhciBrZCA9IGtleTsKKwkJCQkvLyBJZiB0aGUga2V5IGlzIG5vdCBhIGxlZ2FsIGlkZW50aWZpZXIsIHVzZSBpdHMgZGVzY3JpcHRpb24uCisJCQkJLy8gRm9yIHN0cmluZ3MgdGhpcyB3aWxsIHF1b3RlIHRoZSBzdGlybmcuCisJCQkJaWYoIWtkLm1hdGNoKC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvKSl7CisJCQkJCWtkID0gYXJndW1lbnRzLmNhbGxlZShrZXksIHNob3dBbGwpOworCQkJCX0KKwkJCQlkICs9IGtkKyI6ICIrYXJndW1lbnRzLmNhbGxlZSh2W2tleV0sIHNob3dBbGwpOworCQkJfQorCQkJcmV0dXJuIGQrIn0iOworCQl9CisKKwkJaWYoc2hvd0FsbCl7CisJCQlpZihkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX3JlY3VyKXsKKwkJCQkvLyBTYXZlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9ucyBvZiB0b1N0cmluZzsKKwkJCQl2YXIgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCQkJCXJldHVybiBvYmplY3RUb1N0cmluZy5hcHBseSh2LCBbXSk7CisJCQl9ZWxzZXsKKwkJCQlkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuX3JlY3VyID0gdHJ1ZTsKKwkJCQlyZXR1cm4gdi50b1N0cmluZygpOworCQkJfQorCQl9ZWxzZXsKKwkJCS8vIGxvZygiRGVzY3JpcHRpb24/ICIrdi50b1N0cmluZygpKyIsICIrdHlwZW9mKHYpKTsKKwkJCXRocm93IG5ldyBFcnJvcigiVW5rbm93biB0eXBlOiAiK3YpOworCQkJcmV0dXJuICIndW5rbm93biciOworCQl9CisKKwl9IGZpbmFsbHkgeworCQkvLyBBbHdheXMgcmVzdG9yZSB0aGUgZ2xvYmFsIGN1cnJlbnQgZGVwdGguCisJCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5fZGVwdGggPSBkZXB0aDsKKwl9CisKK30KKworCisKKy8vLy8gUFJJVkFURSBUTyBNT0RVTEUKKworZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLl9nZXRTdG9yYWdlID0gZnVuY3Rpb24oKXsKKwkvLyBzdW1tYXJ5CisJLy8JR2V0cyBhbiBvYmplY3QgKGZvcm0gZmllbGQpIHdpdGggYSByZWFkL3dyaXRlICJ2YWx1ZSIgcHJvcGVydHkuCisKKwlpZiAoZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRhdGFGaWVsZCkgeworCQlyZXR1cm4gZG9qby53aWRnZXQuaHRtbC5zdGFiaWxlLmRhdGFGaWVsZDsKKwl9CisJdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtcy5fZG9qb19mb3JtOworCXJldHVybiBkb2pvLndpZGdldC5odG1sLnN0YWJpbGUuZGF0YUZpZWxkID0gZm9ybSA/IGZvcm0uc3RhYmlsZSA6IHt2YWx1ZTogIiJ9OworfQorCisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuQ29tYm9Cb3giKTsKKworCisKKworCisKKworCisKK2Rvam8uZGVjbGFyZSgKKwkiZG9qby53aWRnZXQuaW5jcmVtZW50YWxDb21ib0JveERhdGFQcm92aWRlciIsCisJbnVsbCwKKwlmdW5jdGlvbihvcHRpb25zKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAvIGludGVyZmFjZSBmb3IgQ29tYm9ib3ggaW5jcmVtZW50YWwgZGF0YSBwcm92aWRlci4KKwkJLy8JCVRoaXMgY2xhc3MgdGFrZXMgYSBzZWFyY2ggc3RyaW5nIGFuZCByZXR1cm5zIHZhbHVlcyB0aGF0IG1hdGNoCisJCS8vCQl0aGF0IHNlYXJjaCBzdHJpbmcuICBUaGUgZmlsdGVyaW5nIG9mIHZhbHVlcyAodG8gZmluZCB2YWx1ZXMgbWF0Y2hpbmcgZ2l2ZW4KKwkJLy8JCXNlYXJjaCBzdHJpbmcpIGlzIGRvbmUgb24gdGhlIHNlcnZlci4KKwkJLy8KKwkJLy8gb3B0aW9uczoKKwkJLy8JCVN0cnVjdHVyZSBjb250YWluaW5nIHtkYXRhVXJsOiAiZm9vLmpzP3NlYXJjaD17c2VhcmNoU3RyaW5nfSJ9IG9yIHNpbWlsYXIgZGF0YS4KKwkJLy8JCWRhdGFVcmwgaXMgYSBVUkwgdGhhdCBpcyBwYXNzZWQgdGhlIHNlYXJjaCBzdHJpbmcgYSByZXR1cm5zIGEgSlNPTiBzdHJ1Y3R1cmUKKwkJLy8JCXNob3dpbmcgdGhlIG1hdGNoaW5nIHZhbHVlcywgbGlrZSBbIFsiQWxhYmFtYSIsIkFMIl0sIFsiQWxhc2thIiwiQUsiXSwgWyJBbWVyaWNhbiBTYW1vYSIsIkFTIl0gXQorCisJCXRoaXMuc2VhcmNoVXJsID0gb3B0aW9ucy5kYXRhVXJsOworCisJCS8vIFRPRE86IGNhY2hlIGRvZXNuJ3Qgd29yaworCQl0aGlzLl9jYWNoZSA9IHt9OworCisJCXRoaXMuX2luRmxpZ2h0ID0gZmFsc2U7CisJCXRoaXMuX2xhc3RSZXF1ZXN0ID0gbnVsbDsKKworCQkvLyBhbGxvd0NhY2hlOiBCb29sZWFuCisJCS8vCVNldHRpbmcgdG8gdXNlL25vdCB1c2UgY2FjaGUgZm9yIHByZXZpb3VzbHkgc2VlbiB2YWx1ZXMKKwkJLy8JVE9ETzogY2FjaGluZyBkb2Vzbid0IHdvcmsuCisJCS8vCVRPRE86IHJlYWQgdGhlIHNldHRpbmcgZm9yIHRoaXMgdmFsdWUgZnJvbSB0aGUgd2lkZ2V0IHBhcmFtZXRlcnMKKwkJdGhpcy5hbGxvd0NhY2hlID0gZmFsc2U7CisJfSwKKwl7CisJCV9hZGRUb0NhY2hlOiBmdW5jdGlvbigvKlN0cmluZyovIGtleXdvcmQsIC8qQXJyYXkqLyBkYXRhKXsKKwkJCWlmKHRoaXMuYWxsb3dDYWNoZSl7CisJCQkJdGhpcy5fY2FjaGVba2V5d29yZF0gPSBkYXRhOworCQkJfQorCQl9LAorCisJCXN0YXJ0U2VhcmNoOiBmdW5jdGlvbigvKlN0cmluZyovIHNlYXJjaFN0ciwgLypGdW5jdGlvbiovIGNhbGxiYWNrKXsKKwkJCS8vIHN1bW1hcnk6CisJCQkvLwkJU3RhcnQgdGhlIHNlYXJjaCBmb3IgcGF0dGVybnMgdGhhdCBtYXRjaCBzZWFyY2hTdHIsIGFuZCBjYWxsCisJCQkvLwkJc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aXRoIHRoZSByZXN1bHRzCisJCQkvLyBzZWFyY2hTdHI6CisJCQkvLwkJVGhlIGNoYXJhY3RlcnMgdGhlIHVzZXIgaGFzIHR5cGVkIGludG8gdGhlIDxpbnB1dD4uCisJCQkvLyBjYWxsYmFjazoKKwkJCS8vCQlUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCwgYXMgYW4KKwkJCS8vCQlhcnJheSBvZiBsYWJlbC92YWx1ZSBwYWlycyAodGhlIHZhbHVlIGlzIHVzZWQgZm9yIHRoZSBTZWxlY3Qgd2lkZ2V0KS4gIEV4YW1wbGU6CisJCQkvLwkJWyBbIkFsYWJhbWEiLCJBTCJdLCBbIkFsYXNrYSIsIkFLIl0sIFsiQW1lcmljYW4gU2Ftb2EiLCJBUyJdIF0KKworCQkJaWYodGhpcy5faW5GbGlnaHQpeworCQkJCS8vIEZJWE1FOiBpbXBsZW1lbnQgYmFja29mZiEKKwkJCX0KKwkJCXZhciB0c3MgPSBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyKTsKKwkJCXZhciByZWFsVXJsID0gZG9qby5zdHJpbmcuc3Vic3RpdHV0ZVBhcmFtcyh0aGlzLnNlYXJjaFVybCwgeyJzZWFyY2hTdHJpbmciOiB0c3N9KTsKKwkJCXZhciBfdGhpcyA9IHRoaXM7CisJCQl2YXIgcmVxdWVzdCA9IHRoaXMuX2xhc3RSZXF1ZXN0ID0gZG9qby5pby5iaW5kKHsKKwkJCQl1cmw6IHJlYWxVcmwsCisJCQkJbWV0aG9kOiAiZ2V0IiwKKwkJCQltaW1ldHlwZTogInRleHQvanNvbiIsCisJCQkJbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgZXZ0KXsKKwkJCQkJX3RoaXMuX2luRmxpZ2h0ID0gZmFsc2U7CisJCQkJCWlmKCFkb2pvLmxhbmcuaXNBcnJheShkYXRhKSl7CisJCQkJCQl2YXIgYXJyRGF0YSA9IFtdOworCQkJCQkJZm9yKHZhciBrZXkgaW4gZGF0YSl7CisJCQkJCQkJYXJyRGF0YS5wdXNoKFtkYXRhW2tleV0sIGtleV0pOworCQkJCQkJfQorCQkJCQkJZGF0YSA9IGFyckRhdGE7CisJCQkJCX0KKwkJCQkJX3RoaXMuX2FkZFRvQ2FjaGUoc2VhcmNoU3RyLCBkYXRhKTsKKwkJCQkJaWYgKHJlcXVlc3QgPT0gX3RoaXMuX2xhc3RSZXF1ZXN0KXsKKwkJCQkJCWNhbGxiYWNrKGRhdGEpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCQl0aGlzLl9pbkZsaWdodCA9IHRydWU7CisJCX0KKwl9CispOworCitkb2pvLmRlY2xhcmUoCisJImRvam8ud2lkZ2V0LmJhc2ljQ29tYm9Cb3hEYXRhUHJvdmlkZXIiLAorCW51bGwsCisJZnVuY3Rpb24oLypPYmplY3QqLyBvcHRpb25zLCAvKkRvbU5vZGUqLyBub2RlKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCVJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAvIGludGVyZmFjZSBmb3IgQ29tYm9ib3ggZGF0YSBwcm92aWRlci4KKwkJLy8JCVRoaXMgY2xhc3MgdGFrZXMgYSBzZWFyY2ggc3RyaW5nIGFuZCByZXR1cm5zIHZhbHVlcyB0aGF0IG1hdGNoCisJCS8vCQl0aGF0IHNlYXJjaCBzdHJpbmcuICAgIEFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBjb21ib2JveCBhcmUgZG93bmxvYWRlZAorCQkvLwkJb24gaW5pdGlhbGl6YXRpb24sIGFuZCB0aGVuIHN0YXJ0U2VhcmNoKCkgcnVucyBsb2NhbGx5LAorCQkvLwkJbWVyZWx5IGZpbHRpbmcgdGhhdCBkb3dubG9hZGVkIGxpc3QsIHRvIGZpbmQgdmFsdWVzIG1hdGNoaW5nIHNlYXJjaCBzdHJpbmcKKwkJLy8KKwkJLy8JCU5PVEU6IHRoaXMgZGF0YSBwcm92aWRlciBpcyBkZXNpZ25lZCBhcyBhIG5haXZlIHJlZmVyZW5jZQorCQkvLwkJaW1wbGVtZW50YXRpb24sIGFuZCBhcyBzdWNoIGl0IGlzIHdyaXR0ZW4gbW9yZSBmb3IgcmVhZGFiaWxpdHkgdGhhbgorCQkvLwkJc3BlZWQuIEEgZGVwbG95YWJsZSBkYXRhIHByb3ZpZGVyIHdvdWxkIGltcGxlbWVudCBsb29rdXBzLCBzZWFyY2gKKwkJLy8JCWNhY2hpbmcgKGFuZCBpbnZhbGlkYXRpb24pLCBhbmQgYSBzaWduaWZpY2FudGx5IGxlc3MgbmFpdmUgZGF0YQorCQkvLwkJc3RydWN0dXJlIGZvciBzdG9yYWdlIG9mIGl0ZW1zLgorCQkvLworCQkvLwlvcHRpb25zOiBPYmplY3QKKwkJLy8JCU9wdGlvbnMgb2JqZWN0LiAgRXhhbXBsZToKKwkJLy8JCXsKKwkJLy8JCQlkYXRhVXJsOiBTdHJpbmcgKFVSTCB0byBxdWVyeSB0byBnZXQgbGlzdCBvZiBwb3NzaWJsZSBkcm9wIGRvd24gdmFsdWVzKSwKKwkJLy8JCQlzZXRBbGxWYWx1ZXM6IEZ1bmN0aW9uIChjYWxsYmFjayBmb3Igc2V0dGluZyBpbml0aWFsbHkgc2VsZWN0ZWQgdmFsdWUpCisJCS8vCQl9CisJCS8vCQlUaGUgcmV0dXJuIGZvcm1hdCBmb3IgZGF0YVVSTCBpcyAoZm9yIGV4YW1wbGUpCisJCS8vCQkJWyBbIkFsYWJhbWEiLCJBTCJdLCBbIkFsYXNrYSIsIkFLIl0sIFsiQW1lcmljYW4gU2Ftb2EiLCJBUyJdIC4uLiBdCisJCS8vCisJCS8vIG5vZGU6CisJCS8vCQlQb2ludGVyIHRvIHRoZSBkb21Ob2RlIGluIHRoZSBvcmlnaW5hbCBtYXJrdXAuCisJCS8vCQlUaGlzIGlzIG5lZWRlZCBpbiB0aGUgY2FzZSB3aGVuIHRoZSBsaXN0IG9mIHZhbHVlcyBpcyBlbWJlZGRlZAorCQkvLwkJaW4gdGhlIGh0bWwgbGlrZSA8c2VsZWN0PiA8b3B0aW9uPkFsYWJhbWE8L29wdGlvbj4gPG9wdGlvbj5BcmthbnNhczwvb3B0aW9uPiAuLi4KKwkJLy8JCXJhdGhlciB0aGFuIHNwZWNpZmllZCBhcyBhIFVSTC4KKworCQkvLyBfZGF0YTogQXJyYXkKKwkJLy8JCUxpc3Qgb2YgZXZlcnkgcG9zc2libGUgdmFsdWUgZm9yIHRoZSBkcm9wIGRvd24gbGlzdAorCQkvLwkJc3RhcnRTZWFyY2goKSBzaW1wbHkgc2VhcmNoZXMgdGhpcyBhcnJheSBhbmQgcmV0dXJucyBtYXRjaGluZyB2YWx1ZXMuCisJCXRoaXMuX2RhdGEgPSBbXTsKKworCQkvLyBzZWFyY2hMaW1pdDogSW50ZWdlcgorCQkvLwkJTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uCisJCS8vCQlUT0RPOiBuZWVkIHRvIHJlYWQgdGhpcyB2YWx1ZSBmcm9tIHRoZSB3aWRnZXQgcGFyYW1ldGVycworCQl0aGlzLnNlYXJjaExpbWl0ID0gMzA7CisKKwkJLy8gc2VhcmNoVHlwZTogU3RyaW5nCisJCS8vCQlEZWZpbmVzIHdoYXQgdmFsdWVzIG1hdGNoIHRoZSBzZWFyY2ggc3RyaW5nOyBzZWUgc2VhcmNoVHlwZSBwYXJhbWV0ZXIKKwkJLy8JCW9mIENvbWJvQm94IGZvciBkZXRhaWxzCisJCS8vCQlUT0RPOiBuZWVkIHRvIHJlYWQgdGhpcyB2YWx1ZSBmcm9tIHRoZSB3aWRnZXQgcGFyYW1ldGVyczsgdGhlIHNldHRpbmcgaW4gQ29tYm9Cb3ggaXMgYmVpbmcgaWdub3JlZC4KKwkJdGhpcy5zZWFyY2hUeXBlID0gIlNUQVJUU1RSSU5HIjsKKworCQkvLyBjYXNlU2Vuc2l0aXZlOiBCb29sZWFuCisJCS8vCQlTaG91bGQgc2VhcmNoIGJlIGNhc2Ugc2Vuc2l0aXZlPworCQkvLwkJVE9ETzogdGhpcyBzaG91bGQgYmUgYSBwYXJhbWV0ZXIgdG8gY29tYm9ib3g/CisJCXRoaXMuY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOworCisJCWlmKCFkal91bmRlZigiZGF0YVVybCIsIG9wdGlvbnMpICYmICFkb2pvLnN0cmluZy5pc0JsYW5rKG9wdGlvbnMuZGF0YVVybCkpeworCQkJdGhpcy5fZ2V0RGF0YShvcHRpb25zLmRhdGFVcmwpOworCQl9ZWxzZXsKKwkJCS8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gcG9wdWxhdGUgdGhlIGxpc3QgZnJvbSA8b3B0aW9uPiBlbGVtZW50cworCQkJaWYoKG5vZGUpJiYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICJzZWxlY3QiKSl7CisJCQkJLy8gTk9URTogd2UncmUgbm90IGhhbmRsaW5nIDxvcHRncm91cD4gaGVyZSB5ZXQKKwkJCQl2YXIgb3B0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9wdGlvbiIpOworCQkJCXZhciBvbCA9IG9wdHMubGVuZ3RoOworCQkJCXZhciBkYXRhID0gW107CisJCQkJZm9yKHZhciB4PTA7IHg8b2w7IHgrKyl7CisJCQkJCXZhciB0ZXh0ID0gb3B0c1t4XS50ZXh0Q29udGVudCB8fCBvcHRzW3hdLmlubmVyVGV4dCB8fCBvcHRzW3hdLmlubmVySFRNTDsKKwkJCQkJdmFyIGtleVZhbEFyciA9IFtTdHJpbmcodGV4dCksIFN0cmluZyhvcHRzW3hdLnZhbHVlKV07CisJCQkJCWRhdGEucHVzaChrZXlWYWxBcnIpOworCQkJCQlpZihvcHRzW3hdLnNlbGVjdGVkKXsKKwkJCQkJCW9wdGlvbnMuc2V0QWxsVmFsdWVzKGtleVZhbEFyclswXSwga2V5VmFsQXJyWzFdKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLnNldERhdGEoZGF0YSk7CisJCQl9CisJCX0KKwl9LAorCXsKKwkJX2dldERhdGE6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdXJsKXsKKwkJCWRvam8uaW8uYmluZCh7CisJCQkJdXJsOiB1cmwsCisJCQkJbG9hZDogZG9qby5sYW5nLmhpdGNoKHRoaXMsIGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGV2dCl7CisJCQkJCWlmKCFkb2pvLmxhbmcuaXNBcnJheShkYXRhKSl7CisJCQkJCQl2YXIgYXJyRGF0YSA9IFtdOworCQkJCQkJZm9yKHZhciBrZXkgaW4gZGF0YSl7CisJCQkJCQkJYXJyRGF0YS5wdXNoKFtkYXRhW2tleV0sIGtleV0pOworCQkJCQkJfQorCQkJCQkJZGF0YSA9IGFyckRhdGE7CisJCQkJCX0KKwkJCQkJdGhpcy5zZXREYXRhKGRhdGEpOworCQkJCX0pLAorCQkJCW1pbWV0eXBlOiAidGV4dC9qc29uIgorCQkJfSk7CisJCX0sCisKKwkJc3RhcnRTZWFyY2g6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gc2VhcmNoU3RyLCAvKkZ1bmN0aW9uKi8gY2FsbGJhY2speworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlTdGFydCB0aGUgc2VhcmNoIGZvciBwYXR0ZXJucyB0aGF0IG1hdGNoIHNlYXJjaFN0ci4KKwkJCS8vIHNlYXJjaFN0cjoKKwkJCS8vCQlUaGUgY2hhcmFjdGVycyB0aGUgdXNlciBoYXMgdHlwZWQgaW50byB0aGUgPGlucHV0Pi4KKwkJCS8vIGNhbGxiYWNrOgorCQkJLy8JCVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0LCBhcyBhbgorCQkJLy8JCWFycmF5IG9mIGxhYmVsL3ZhbHVlIHBhaXJzICh0aGUgdmFsdWUgaXMgdXNlZCBmb3IgdGhlIFNlbGVjdCB3aWRnZXQpLiAgRXhhbXBsZToKKwkJCS8vCQlbIFsiQWxhYmFtYSIsIkFMIl0sIFsiQWxhc2thIiwiQUsiXSwgWyJBbWVyaWNhbiBTYW1vYSIsIkFTIl0gXQorCisJCQkvLyBGSVhNRTogbmVlZCB0byBhZGQgdGltZW91dCBoYW5kbGluZyBoZXJlISEKKwkJCXRoaXMuX3BlcmZvcm1TZWFyY2goc2VhcmNoU3RyLCBjYWxsYmFjayk7CisJCX0sCisKKwkJX3BlcmZvcm1TZWFyY2g6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gc2VhcmNoU3RyLCAvKkZ1bmN0aW9uKi8gY2FsbGJhY2speworCQkJLy8KKwkJCS8vCU5PVEU6IHRoaXMgc2VhcmNoIGlzIExJTkVBUiwgd2hpY2ggbWVhbnMgdGhhdCBpdCBleGhpYml0cyBwZXJoYXBzCisJCQkvLwl0aGUgd29yc3QgcG9zc2libGUgc3BlZWQgY2hhcmFjdGVyaXN0aWNzIG9mIGFueSBzZWFyY2ggdHlwZS4gSXQncworCQkJLy8Jd3JpdHRlbiB0aGlzIHdheSB0byBvdXRsaW5lIHRoZSByZXNwb25zaWJpbGl0aWVzIGFuZCBpbnRlcmZhY2VzIGZvcgorCQkJLy8JYSBzZWFyY2guCisJCQkvLworCQkJdmFyIHN0ID0gdGhpcy5zZWFyY2hUeXBlOworCQkJLy8gRklYTUU6IHRoaXMgaXMganVzdCBhbiBleGFtcGxlIHNlYXJjaCwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBpbXBsZW1lbnQKKwkJCS8vIG9ubHkgYSBsaW5lYXIgc2VhcmNoIHdpdGhvdXQgYW55IG9mIHRoZSBhdHRlbmRhbnQgKHVzZWZ1bCEpIG9wdGltaXphdGlvbnMKKwkJCXZhciByZXQgPSBbXTsKKwkJCWlmKCF0aGlzLmNhc2VTZW5zaXRpdmUpeworCQkJCXNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpOworCQkJfQorCQkJZm9yKHZhciB4PTA7IHg8dGhpcy5fZGF0YS5sZW5ndGg7IHgrKyl7CisJCQkJaWYoKHRoaXMuc2VhcmNoTGltaXQgPiAwKSYmKHJldC5sZW5ndGggPj0gdGhpcy5zZWFyY2hMaW1pdCkpeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gRklYTUU6IHdlIHNob3VsZCBhdm9pZCBjb3BpZXMgaWYgcG9zc2libGUhCisJCQkJdmFyIGRhdGFMYWJlbCA9IG5ldyBTdHJpbmcoKCF0aGlzLmNhc2VTZW5zaXRpdmUpID8gdGhpcy5fZGF0YVt4XVswXS50b0xvd2VyQ2FzZSgpIDogdGhpcy5fZGF0YVt4XVswXSk7CisJCQkJaWYoZGF0YUxhYmVsLmxlbmd0aCA8IHNlYXJjaFN0ci5sZW5ndGgpeworCQkJCQkvLyB0aGlzIHdvbid0IGV2ZXIgYmUgYSBnb29kIHNlYXJjaCwgd2lsbCBpdD8gV2hhdCBpZiB3ZSBzdGFydAorCQkJCQkvLyB0byBzdXBwb3J0IHJlZ2V4IHNlYXJjaD8KKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYoc3QgPT0gIlNUQVJUU1RSSU5HIil7CisJCQkJCWlmKHNlYXJjaFN0ciA9PSBkYXRhTGFiZWwuc3Vic3RyKDAsIHNlYXJjaFN0ci5sZW5ndGgpKXsKKwkJCQkJCXJldC5wdXNoKHRoaXMuX2RhdGFbeF0pOworCQkJCQl9CisJCQkJfWVsc2UgaWYoc3QgPT0gIlNVQlNUUklORyIpeworCQkJCQkvLyB0aGlzIG9uZSBpcyBhIGdpbW1pZQorCQkJCQlpZihkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIpID49IDApeworCQkJCQkJcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7CisJCQkJCX0KKwkJCQl9ZWxzZSBpZihzdCA9PSAiU1RBUlRXT1JEIil7CisJCQkJCS8vIGRvIGEgc3Vic3RyaW5nIHNlYXJjaCBhbmQgdGhlbiBhdHRlbXB0IHRvIGRldGVybWluZSBpZiB0aGUKKwkJCQkJLy8gcHJlY2VlZGluZyBjaGFyIHdhcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgb3IgYQorCQkJCQkvLyB3aGl0ZXNwYWNlIGNoYXIuCisJCQkJCXZhciBpZHggPSBkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIpOworCQkJCQlpZihpZHggPT0gMCl7CisJCQkJCQkvLyBpbXBsaWNpdCBtYXRjaAorCQkJCQkJcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7CisJCQkJCX0KKwkJCQkJaWYoaWR4IDw9IDApeworCQkJCQkJLy8gaWYgd2UgZGlkbid0IG1hdGNoIG9yIGltcGxpY2lseSBtYXRjaGVkLCBtYXJjaCBvbndhcmQKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCS8vIG90aGVyd2lzZSwgd2UgaGF2ZSB0byBnbyBmaWd1cmUgb3V0IGlmIHRoZSBtYXRjaCB3YXMgYXQgdGhlCisJCQkJCS8vIHN0YXJ0IG9mIGEgd29yZC4uLgorCQkJCQkvLyB0aGlzIGNvZGUgaXMgdGFrZW4gYWxtb3N0IGRpcmVjdHkgZnJvbSBuV2lkZ2V0cworCQkJCQl2YXIgbWF0Y2hlcyA9IGZhbHNlOworCQkJCQl3aGlsZShpZHghPS0xKXsKKwkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgbWF0Y2ggZWl0aGVyIHN0YXJ0cyB3aG9sZSBzdHJpbmcsIG9yCisJCQkJCQkvLyBmb2xsb3dzIGEgc3BhY2UsIG9yIGZvbGxvd3Mgc29tZSBwdW5jdHVhdGlvbgorCQkJCQkJaWYoIiAsLygiLmluZGV4T2YoZGF0YUxhYmVsLmNoYXJBdChpZHgtMSkpICE9IC0xKXsKKwkJCQkJCQkvLyBGSVhNRTogd2hhdCBhYm91dCB0YWIgY2hhcnM/CisJCQkJCQkJbWF0Y2hlcyA9IHRydWU7IGJyZWFrOworCQkJCQkJfQorCQkJCQkJaWR4ID0gZGF0YUxhYmVsLmluZGV4T2Yoc2VhcmNoU3RyLCBpZHgrMSk7CisJCQkJCX0KKwkJCQkJaWYoIW1hdGNoZXMpeworCQkJCQkJY29udGludWU7CisJCQkJCX1lbHNleworCQkJCQkJcmV0LnB1c2godGhpcy5fZGF0YVt4XSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljYWxsYmFjayhyZXQpOworCQl9LAorCisJCXNldERhdGE6IGZ1bmN0aW9uKC8qQXJyYXkqLyBwZGF0YSl7CisJCQkvLyBzdW1tYXJ5OiBzZXQgKG9yIHJlc2V0KSB0aGUgZGF0YSBhbmQgaW5pdGlhbGl6ZSBsb29rdXAgc3RydWN0dXJlcworCQkJdGhpcy5fZGF0YSA9IHBkYXRhOworCQl9CisJfQorKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorCSJkb2pvLndpZGdldC5Db21ib0JveCIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKKwl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlBdXRvLWNvbXBsZXRpbmcgdGV4dCBib3gsIGFuZCBiYXNlIGNsYXNzIGZvciBTZWxlY3Qgd2lkZ2V0LgorCQkvLworCQkvLwkJVGhlIGRyb3AgZG93biBib3gncyB2YWx1ZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGFuIGNsYXNzIGNhbGxlZAorCQkvLwkJYSBkYXRhIHByb3ZpZGVyLCB3aGljaCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgYmFzZWQgb24gdGhlIGNoYXJhY3RlcnMKKwkJLy8JCXRoYXQgdGhlIHVzZXIgaGFzIHR5cGVkIGludG8gdGhlIGlucHV0IGJveC4KKwkJLy8KKwkJLy8JCVNvbWUgb2YgdGhlIG9wdGlvbnMgdG8gdGhlIENvbWJvQm94IGFyZSBhY3R1YWxseSBhcmd1bWVudHMgdG8gdGhlIGRhdGEKKwkJLy8JCXByb3ZpZGVyLgorCisJCS8vIGZvcmNlVmFsaWRPcHRpb246IEJvb2xlYW4KKwkJLy8JCUlmIHRydWUsIG9ubHkgYWxsb3cgc2VsZWN0aW9uIG9mIHN0cmluZ3MgaW4gZHJvcCBkb3duIGxpc3QuCisJCS8vCQlJZiBmYWxzZSwgdXNlciBjYW4gc2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgZHJvcCBkb3duLCBvciBqdXN0IHR5cGUgaW4KKwkJLy8JCWFueSByYW5kb20gdmFsdWUuCisJCWZvcmNlVmFsaWRPcHRpb246IGZhbHNlLAorCisJCS8vIHNlYXJjaFR5cGU6IFN0cmluZworCQkvLwkJQXJndW1lbnQgdG8gZGF0YSBwcm92aWRlci4KKwkJLy8JCVNwZWNpZmllcyBydWxlIGZvciBtYXRjaGluZyB0eXBlZCBpbiBzdHJpbmcgdy9saXN0IG9mIGF2YWlsYWJsZSBhdXRvLWNvbXBsZXRpb25zLgorCQkvLwkJCXN0YXJ0U3RyaW5nIC0gbG9vayBmb3IgYXV0by1jb21wbGV0aW9ucyB0aGF0IHN0YXJ0IHcvdGhlIHNwZWNpZmllZCBzdHJpbmcuCisJCS8vCQkJc3ViU3RyaW5nIC0gbG9vayBmb3IgYXV0by1jb21wbGV0aW9ucyBjb250YWluaW5nIHRoZSB0eXBlZCBpbiBzdHJpbmcuCisJCS8vCQkJc3RhcnRXb3JkIC0gbG9vayBmb3IgYXV0by1jb21wbGV0aW9ucyB3aGVyZSBhbnkgd29yZCBzdGFydHMgdy90aGUgdHlwZWQgaW4gc3RyaW5nLgorCQlzZWFyY2hUeXBlOiAic3RyaW5nc3RhcnQiLAorCisJCS8vIGRhdGFQcm92aWRlcjogT2JqZWN0CisJCS8vCQkoUmVhZCBvbmx5KSByZWZlcmVuY2UgdG8gZGF0YSBwcm92aWRlciBvYmplY3QgY3JlYXRlZCBmb3IgdGhpcyBjb21ib2JveAorCQkvLwkJYWNjb3JkaW5nIHRvICJkYXRhUHJvdmlkZXJDbGFzcyIgYXJndW1lbnQuCisJCWRhdGFQcm92aWRlcjogbnVsbCwKKworCQkvLyBhdXRvQ29tcGxldGU6IEJvb2xlYW4KKwkJLy8JCUlmIHlvdSB0eXBlIGluIGEgcGFydGlhbCBzdHJpbmcsIGFuZCB0aGVuIHRhYiBvdXQgb2YgdGhlIDxpbnB1dD4gYm94LAorCQkvLwkJYXV0b21hdGljYWxseSBjb3B5IHRoZSBmaXJzdCBlbnRyeSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AgZG93biBsaXN0IHRvCisJCS8vCQl0aGUgPGlucHV0PiBmaWVsZAorCQlhdXRvQ29tcGxldGU6IHRydWUsCisKKwkJLy8gc2VhcmNoRGVsYXk6IEludGVnZXIKKwkJLy8JCURlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHdoZW4gdXNlciB0eXBlcyBzb21ldGhpbmcgYW5kIHdlIHN0YXJ0CisJCS8vCQlzZWFyY2hpbmcgYmFzZWQgb24gdGhhdCB2YWx1ZQorCQlzZWFyY2hEZWxheTogMTAwLAorCisJCS8vIGRhdGFVcmw6IFN0cmluZworCQkvLwkJVVJMIGFyZ3VtZW50IHBhc3NlZCB0byBkYXRhIHByb3ZpZGVyIG9iamVjdCAoY2xhc3MgbmFtZSBzcGVjaWZpZWQgaW4gImRhdGFQcm92aWRlckNsYXNzIikKKwkJLy8JCUFuIGV4YW1wbGUgb2YgdGhlIFVSTCBmb3JtYXQgZm9yIHRoZSBkZWZhdWx0IGRhdGEgcHJvdmlkZXIgaXMKKwkJLy8JCSJyZW1vdGVDb21ib0JveERhdGEuanM/c2VhcmNoPSV7c2VhcmNoU3RyaW5nfSIKKwkJZGF0YVVybDogIiIsCisKKwkJLy8gZmFkZVRpbWU6IEludGVnZXIKKwkJLy8JCU1pbGxpc2Vjb25kcyBkdXJhdGlvbiBvZiBmYWRlb3V0IGZvciBkcm9wIGRvd24gYm94CisJCWZhZGVUaW1lOiAyMDAsCisKKwkJLy8gbWF4TGlzdExlbmd0aDogSW50ZWdlcgorCQkvLwkJIExpbWl0cyBsaXN0IHRvIFggdmlzaWJsZSByb3dzLCBzY3JvbGwgb24gcmVzdAorCQltYXhMaXN0TGVuZ3RoOiA4LAorCisJCS8vIG1vZGU6IFN0cmluZworCQkvLwkJTW9kZSBtdXN0IGJlIHNwZWNpZmllZCB1bmxlc3MgZGF0YVByb3ZpZGVyQ2xhc3MgaXMgc3BlY2lmaWVkLgorCQkvLwkJImxvY2FsIiB0byBpbmxpbmUgc2VhcmNoIHN0cmluZywgInJlbW90ZSIgZm9yIEpTT04tcmV0dXJuaW5nIGxpdmUgc2VhcmNoCisJCS8vCQlvciAiaHRtbCIgZm9yIGR1bWJlciBsaXZlIHNlYXJjaC4KKwkJbW9kZTogImxvY2FsIiwKKworCQkvLyBzZWxlY3RlZFJlc3VsdDogQXJyYXkKKwkJLy8JCShSZWFkIG9ubHkpIGFycmF5IHNwZWNpZnlpbmcgdGhlIHZhbHVlL2xhYmVsIHRoYXQgdGhlIHVzZXIgc2VsZWN0ZWQKKwkJc2VsZWN0ZWRSZXN1bHQ6IG51bGwsCisKKwkJLy8gZGF0YVByb3ZpZGVyQ2xhc3M6IFN0cmluZworCQkvLwkJTmFtZSBvZiBkYXRhIHByb3ZpZGVyIGNsYXNzIChjb2RlIHRoYXQgbWFwcyBhIHNlYXJjaCBzdHJpbmcgdG8gYSBsaXN0IG9mIHZhbHVlcykKKwkJLy8JCVRoZSBjbGFzcyBtdXN0IG1hdGNoIHRoZSBpbnRlcmZhY2UgZGVtb25zdHJhdGVkIGJ5IGRvam8ud2lkZ2V0LmluY3JlbWVudGFsQ29tYm9Cb3hEYXRhUHJvdmlkZXIKKwkJZGF0YVByb3ZpZGVyQ2xhc3M6ICIiLAorCisJCS8vIGJ1dHRvblNyYzogVVJJCisJCS8vCQlVUkkgZm9yIHRoZSBkb3duIGFycm93IGljb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBib3guCisJCWJ1dHRvblNyYzogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2NvbWJvX2JveF9hcnJvdy5wbmciKSwKKworCQkvLyBkcm9wZG93blRvZ2dsZTogU3RyaW5nCisJCS8vCQlBbmltYXRpb24gZWZmZWN0IGZvciBzaG93aW5nL2Rpc3BsYXlpbmcgZHJvcCBkb3duIGJveAorCQlkcm9wZG93blRvZ2dsZTogImZhZGUiLAorCisJCXRlbXBsYXRlU3RyaW5nOiI8c3BhbiBfPVwid2hpdGVzcGFjZSBhbmQgQ1IncyBiZXR3ZWVuIHRhZ3MgYWRkcyAmbmJzcDsgaW4gRkZcIlxyXG5cdGNsYXNzPVwiZG9qb0NvbWJvQm94T3V0ZXJcIlxyXG5cdD48aW5wdXQgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIiAgdGFiaW5kZXg9XCItMVwiIG5hbWU9XCJcIiB2YWx1ZT1cIlwiIFxyXG5cdFx0ZG9qb0F0dGFjaFBvaW50PVwiY29tYm9Cb3hWYWx1ZVwiXHJcblx0PjxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZVwiICB0YWJpbmRleD1cIi0xXCIgbmFtZT1cIlwiIHZhbHVlPVwiXCIgXHJcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJjb21ib0JveFNlbGVjdGlvblZhbHVlXCJcclxuXHQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJkb2pvQ29tYm9Cb3hcIlxyXG5cdFx0ZG9qb0F0dGFjaEV2ZW50PVwia2V5Ol9oYW5kbGVLZXlFdmVudHM7IGtleVVwOiBvbktleVVwOyBjb21wb3NpdGlvbkVuZDsgb25SZXNpemU7XCJcclxuXHRcdGRvam9BdHRhY2hQb2ludD1cInRleHRJbnB1dE5vZGVcIlxyXG5cdD48aW1nIGhzcGFjZT1cIjBcIlxyXG5cdFx0dnNwYWNlPVwiMFwiXHJcblx0XHRjbGFzcz1cImRvam9Db21ib0JveFwiXHJcblx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkb3duQXJyb3dOb2RlXCJcclxuXHRcdGRvam9BdHRhY2hFdmVudD1cIm9uTW91c2VVcDogaGFuZGxlQXJyb3dDbGljazsgb25SZXNpemU7XCJcclxuXHRcdHNyYz1cIiR7dGhpcy5idXR0b25TcmN9XCJcclxuPjwvc3Bhbj5cclxuIiwKKwkJdGVtcGxhdGVDc3NTdHJpbmc6Ii5kb2pvQ29tYm9Cb3hPdXRlciB7XHJcblx0Ym9yZGVyOiAwcHggIWltcG9ydGFudDtcclxuXHRtYXJnaW46IDBweCAhaW1wb3J0YW50O1xyXG5cdHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXI6IDFweCBpbnNldCAjYWZhZmFmO1xyXG5cdG1hcmdpbjogMHB4O1xyXG5cdHBhZGRpbmc6IDBweDtcclxuXHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlICFpbXBvcnRhbnQ7XHJcblx0ZmxvYXQ6IG5vbmUgIWltcG9ydGFudDtcclxuXHRwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcblx0ZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIHRoZSBpbnB1dCBib3ggKi9cclxuaW5wdXQuZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXItcmlnaHQtd2lkdGg6IDBweCAhaW1wb3J0YW50OyBcclxuXHRtYXJnaW4tcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xyXG5cdHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiB0aGUgZG93biBhcnJvdyAqL1xyXG5pbWcuZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXItbGVmdC13aWR0aDogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcclxuXHRtYXJnaW4tbGVmdDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIElFIHZlcnRpY2FsLWFsaWdubWVudCBjYWxjdWxhdGlvbnMgY2FuIGJlIG9mZiBieSArLTEgYnV0IHRoZXNlIG1hcmdpbnMgYXJlIGNvbGxhcHNlZCBhd2F5ICovXHJcbi5kal9pZSBpbWcuZG9qb0NvbWJvQm94IHtcclxuXHRtYXJnaW4tdG9wOiAxcHg7IFxyXG5cdG1hcmdpbi1ib3R0b206IDFweDsgXHJcbn1cclxuXHJcbi8qIHRoZSBkcm9wIGRvd24gKi9cclxuLmRvam9Db21ib0JveE9wdGlvbnMge1xyXG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIEdhcmFtb25kLCBzYW5zLXNlcmlmO1xyXG5cdC8qIGZvbnQtc2l6ZTogMC43ZW07ICovXHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgI2FmYWZhZjtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDsgXHJcblx0b3ZlcmZsb3c6IGF1dG87XHJcblx0Y3Vyc29yOiBkZWZhdWx0O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbSB7XHJcblx0cGFkZGluZy1sZWZ0OiAycHg7XHJcblx0cGFkZGluZy10b3A6IDJweDtcclxuXHRtYXJnaW46IDBweDtcclxufVxyXG5cclxuLmRvam9Db21ib0JveEl0ZW1FdmVuIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbU9kZCB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0IHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjNjM3MDlBO1xyXG5cdGNvbG9yOiB3aGl0ZTtcclxufVxyXG4iLHRlbXBsYXRlQ3NzUGF0aDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvQ29tYm9Cb3guY3NzIiksCisKKwkJc2V0VmFsdWU6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdmFsdWUpeworCQkJLy8gc3VtbWFyeTogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbWJvYm94CisJCQl0aGlzLmNvbWJvQm94VmFsdWUudmFsdWUgPSB2YWx1ZTsKKwkJCWlmICh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgIT0gdmFsdWUpeyAvLyBwcmV2ZW50IG11Y2tpbmcgdXAgb2Ygc2VsZWN0aW9uCisJCQkJdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlID0gdmFsdWU7CisJCQkJLy8gb25seSBjaGFuZ2Ugc3RhdGUgYW5kIHZhbHVlIGlmIGEgbmV3IHZhbHVlIGlzIHNldAorCQkJCWRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5zZXRTdGF0ZSh0aGlzLndpZGdldElkLCB0aGlzLmdldFN0YXRlKCksIHRydWUpOworCQkJCXRoaXMub25WYWx1ZUNoYW5nZWQodmFsdWUpOworCQkJfQorCQl9LAorCisJCW9uVmFsdWVDaGFuZ2VkOiBmdW5jdGlvbigvKlN0cmluZyovIHZhbHVlKXsKKwkJCS8vIHN1bW1hcnk6IGNhbGxiYWNrIHdoZW4gdmFsdWUgY2hhbmdlcywgZm9yIHVzZXIgdG8gYXR0YWNoIHRvCisJCX0sCisKKwkJZ2V0VmFsdWU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBSZXJ0dXJucyBjb21ibyBib3ggdmFsdWUKKwkJCXJldHVybiB0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU7CisJCX0sCisKKwkJZ2V0U3RhdGU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JVXNlZCBmb3Igc2F2aW5nIHN0YXRlIG9mIENvbWJvQm94IHdoZW4gbmF2aWdhdGVzIHRvIGEgbmV3CisJCQkvLwlwYWdlLCBpbiBjYXNlIHRoZXkgdGhlbiBoaXQgdGhlIGJyb3dzZXIncyAiQmFjayIgYnV0dG9uLgorCQkJcmV0dXJuIHt2YWx1ZTogdGhpcy5nZXRWYWx1ZSgpfTsKKwkJfSwKKworCQlzZXRTdGF0ZTogZnVuY3Rpb24oLypPYmplY3QqLyBzdGF0ZSl7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JVXNlZCBmb3IgcmVzdG9yaW5nIHN0YXRlIG9mIENvbWJvQm94IHdoZW4gaGFzIG5hdmlnYXRlZCB0byBhIG5ldworCQkJLy8JcGFnZSBidXQgdGhlbiBoaXRzIGJyb3dzZXIncyAiQmFjayIgYnV0dG9uLgorCQkJdGhpcy5zZXRWYWx1ZShzdGF0ZS52YWx1ZSk7CisJCX0sCisKKwkJZW5hYmxlOmZ1bmN0aW9uKCl7CisJCQl0aGlzLmRpc2FibGVkPWZhbHNlOworCQkJdGhpcy50ZXh0SW5wdXROb2RlLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKKwkJfSwKKworCQlkaXNhYmxlOiBmdW5jdGlvbigpeworCQkJdGhpcy5kaXNhYmxlZCA9IHRydWU7CisJCQl0aGlzLnRleHRJbnB1dE5vZGUuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsdHJ1ZSk7CisJCX0sCisKKwkJX2dldENhcmV0UG9zOiBmdW5jdGlvbigvKkRvbU5vZGUqLyBlbGVtZW50KXsKKwkJCS8vIGtodG1sIDMuNS4yIGhhcyBzZWxlY3Rpb24qIG1ldGhvZHMgYXMgZG9lcyB3ZWJraXQgbmlnaHRsaWVzIGZyb20gMjAwNS0wNi0yMgorCQkJaWYoZG9qby5sYW5nLmlzTnVtYmVyKGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpKXsKKwkJCQkvLyBGSVhNRTogdGhpcyBpcyB0b3RhbGx5IGJvcmtlZCBvbiBNb3ogPCAxLjMuIEFueSByZWNvdXJzZT8KKwkJCQlyZXR1cm4gZWxlbWVudC5zZWxlY3Rpb25TdGFydDsKKwkJCX1lbHNlIGlmKGRvam8ucmVuZGVyLmh0bWwuaWUpeworCQkJCS8vIGluIHRoZSBjYXNlIG9mIGEgbW91c2UgY2xpY2sgaW4gYSBwb3B1cCBiZWluZyBoYW5kbGVkLAorCQkJCS8vIHRoZW4gdGhlIGRvY3VtZW50LnNlbGVjdGlvbiBpcyBub3QgdGhlIHRleHRhcmVhLCBidXQgdGhlIHBvcHVwCisJCQkJLy8gdmFyIHIgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsKKwkJCQkvLyBoYWNrIHRvIGdldCBJRSA2IHRvIHBsYXkgbmljZS4gV2hhdCBhIFBPUyBicm93c2VyLgorCQkJCXZhciB0ciA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpOworCQkJCXZhciBudHIgPSBlbGVtZW50LmNyZWF0ZVRleHRSYW5nZSgpOworCQkJCXRyLm1vdmUoImNoYXJhY3RlciIsMCk7CisJCQkJbnRyLm1vdmUoImNoYXJhY3RlciIsMCk7CisJCQkJdHJ5IHsKKwkJCQkJLy8gSWYgY29udHJvbCBkb2VzbnQgaGF2ZSBmb2N1cywgeW91IGdldCBhbiBleGNlcHRpb24uCisJCQkJCS8vIFNlZW1zIHRvIGhhcHBlbiBvbiByZXZlcnNlLXRhYiwgYnV0IGNhbiBhbHNvIGhhcHBlbiBvbiB0YWIgKHNlZW1zIHRvIGJlIGEgcmFjZSBjb25kaXRpb24gLSBvbmx5IGhhcHBlbnMgc29tZXRpbWVzKS4KKwkJCQkJLy8gVGhlcmUgYXBwZWFycyB0byBiZSBubyB3b3JrYXJvdW5kIGZvciB0aGlzIC0gZ29vZ2xlZCBmb3IgcXVpdGUgYSB3aGlsZS4KKwkJCQkJbnRyLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsIHRyKTsKKwkJCQkJcmV0dXJuIFN0cmluZyhudHIudGV4dCkucmVwbGFjZSgvXHIvZywiIikubGVuZ3RoOworCQkJCX0gY2F0Y2ggKGUpeworCQkJCQlyZXR1cm4gMDsgLy8gSWYgZm9jdXMgaGFzIHNoaWZ0ZWQsIDAgaXMgZmluZSBmb3IgY2FyZXQgcG9zLgorCQkJCX0KKworCQkJfQorCQl9LAorCisJCV9zZXRDYXJldFBvczogZnVuY3Rpb24oLypEb21Ob2RlKi8gZWxlbWVudCwgLypOdW1iZXIqLyBsb2NhdGlvbil7CisJCQlsb2NhdGlvbiA9IHBhcnNlSW50KGxvY2F0aW9uKTsKKwkJCXRoaXMuX3NldFNlbGVjdGVkUmFuZ2UoZWxlbWVudCwgbG9jYXRpb24sIGxvY2F0aW9uKTsKKwkJfSwKKworCQlfc2V0U2VsZWN0ZWRSYW5nZTogZnVuY3Rpb24oLypEb21Ob2RlKi8gZWxlbWVudCwgLypOdW1iZXIqLyBzdGFydCwgLypOdW1iZXIqLyBlbmQpeworCQkJaWYoIWVuZCl7IGVuZCA9IGVsZW1lbnQudmFsdWUubGVuZ3RoOyB9ICAvLyBOT1RFOiBTdHJhbmdlIC0gc2hvdWxkIGJlIGFibGUgdG8gcHV0IGNhcmV0IGF0IHN0YXJ0IG9mIHRleHQ/CisJCQkvLyBNb3ppbGxhCisJCQkvLyBwYXJ0cyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly93d3cuZmFxdHMuY29tL2tub3dsZWRnZV9iYXNlL3ZpZXcucGh0bWwvYWlkLzEzNTYyL2ZpZC8xMzAKKwkJCWlmKGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UpeworCQkJCWVsZW1lbnQuZm9jdXMoKTsKKwkJCQllbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOworCQkJfWVsc2UgaWYoZWxlbWVudC5jcmVhdGVUZXh0UmFuZ2UpeyAvLyBJRQorCQkJCXZhciByYW5nZSA9IGVsZW1lbnQuY3JlYXRlVGV4dFJhbmdlKCk7CisJCQkJd2l0aChyYW5nZSl7CisJCQkJCWNvbGxhcHNlKHRydWUpOworCQkJCQltb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQpOworCQkJCQltb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTsKKwkJCQkJc2VsZWN0KCk7CisJCQkJfQorCQkJfWVsc2V7IC8vb3RoZXJ3aXNlIHRyeSB0aGUgZXZlbnQtY3JlYXRpb24gaGFjayAob3VyIG93biBpbnZlbnRpb24pCisJCQkJLy8gZG8gd2UgbmVlZCB0aGVzZT8KKwkJCQllbGVtZW50LnZhbHVlID0gZWxlbWVudC52YWx1ZTsKKwkJCQllbGVtZW50LmJsdXIoKTsKKwkJCQllbGVtZW50LmZvY3VzKCk7CisJCQkJLy8gZmlndXJlIG91dCBob3cgZmFyIGJhY2sgdG8gZ28KKwkJCQl2YXIgZGlzdCA9IHBhcnNlSW50KGVsZW1lbnQudmFsdWUubGVuZ3RoKS1lbmQ7CisJCQkJdmFyIHRjaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzNyk7CisJCQkJdmFyIHRjYyA9IHRjaGFyLmNoYXJDb2RlQXQoMCk7CisJCQkJZm9yKHZhciB4ID0gMDsgeCA8IGRpc3Q7IHgrKyl7CisJCQkJCXZhciB0ZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJLZXlFdmVudHMiKTsKKwkJCQkJdGUuaW5pdEtleUV2ZW50KCJrZXlwcmVzcyIsIHRydWUsIHRydWUsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0Y2MsIHRjYyk7CisJCQkJCWVsZW1lbnQuZGlzcGF0Y2hFdmVudCh0ZSk7CisJCQkJfQorCQkJfQorCQl9LAorCisJCV9oYW5kbGVLZXlFdmVudHM6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJLy8gc3VtbWFyeTogaGFuZGxlcyBrZXlib2FyZCBldmVudHMKKwkJCWlmKGV2dC5jdHJsS2V5IHx8IGV2dC5hbHRLZXkgfHwgIWV2dC5rZXkpeyByZXR1cm47IH0KKworCQkJLy8gcmVzZXQgdGhlc2UKKwkJCXRoaXMuX3ByZXZfa2V5X2JhY2tzcGFjZSA9IGZhbHNlOworCQkJdGhpcy5fcHJldl9rZXlfZXNjID0gZmFsc2U7CisKKwkJCXZhciBrID0gZG9qby5ldmVudC5icm93c2VyLmtleXM7CisJCQl2YXIgZG9TZWFyY2ggPSB0cnVlOworCisJCQlzd2l0Y2goZXZ0LmtleSl7CisJIAkJCWNhc2Ugay5LRVlfRE9XTl9BUlJPVzoKKwkJCQkJaWYoIXRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KXsKKwkJCQkJCXRoaXMuX3N0YXJ0U2VhcmNoRnJvbUlucHV0KCk7CisJCQkJCX0KKwkJCQkJdGhpcy5faGlnaGxpZ2h0TmV4dE9wdGlvbigpOworCQkJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQkJCXJldHVybjsKKwkJCQljYXNlIGsuS0VZX1VQX0FSUk9XOgorCQkJCQl0aGlzLl9oaWdobGlnaHRQcmV2T3B0aW9uKCk7CisJCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCQkJcmV0dXJuOworCQkJCWNhc2Ugay5LRVlfVEFCOgorCQkJCQkvLyB1c2luZyBsaW51eCBhbGlrZSB0YWIgZm9yIGF1dG9jb21wbGV0ZQorCQkJCQlpZighdGhpcy5hdXRvQ29tcGxldGUgJiYgdGhpcy5wb3B1cFdpZGdldC5pc1Nob3dpbmdOb3cgJiYgdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKXsKKwkJCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCQkJCXRoaXMuX3NlbGVjdE9wdGlvbih7ICd0YXJnZXQnOiB0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24sICdub0hpZGUnOiBmYWxzZX0pOworCisJCQkJCQkvLyBwdXQgY2FyZXQgbGFzdAorCQkJCQkJdGhpcy5fc2V0U2VsZWN0ZWRSYW5nZSh0aGlzLnRleHRJbnB1dE5vZGUsIHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgsIG51bGwpOworCQkJCQl9ZWxzZXsKKwkJCQkJCXRoaXMuX3NlbGVjdE9wdGlvbigpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2Ugay5LRVlfRU5URVI6CisJCQkJCS8vIHByZXZlbnQgc3VibWl0dGluZyBmb3JtIGlmIHdlIHByZXNzIGVudGVyIHdpdGggbGlzdCBvcGVuCisJCQkJCWlmKHRoaXMucG9wdXBXaWRnZXQuaXNTaG93aW5nTm93KXsKKwkJCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCQkJfQorCQkJCQlpZih0aGlzLmF1dG9Db21wbGV0ZSl7CisJCQkJCQl0aGlzLl9zZWxlY3RPcHRpb24oKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvLyBmYWxsdGhyb3VnaAorCQkJCWNhc2UgIiAiOgorCQkJCQlpZih0aGlzLnBvcHVwV2lkZ2V0LmlzU2hvd2luZ05vdyAmJiB0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24peworCQkJCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJCQkJdGhpcy5fc2VsZWN0T3B0aW9uKCk7CisJCQkJCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2Ugay5LRVlfRVNDQVBFOgorCQkJCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQkJCQl0aGlzLl9wcmV2X2tleV9lc2MgPSB0cnVlOworCQkJCQlyZXR1cm47CisJCQkJY2FzZSBrLktFWV9CQUNLU1BBQ0U6CisJCQkJCXRoaXMuX3ByZXZfa2V5X2JhY2tzcGFjZSA9IHRydWU7CisJCQkJCWlmKCF0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKKwkJCQkJCXRoaXMuc2V0QWxsVmFsdWVzKCIiLCAiIik7CisJCQkJCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQkJCQkJZG9TZWFyY2ggPSBmYWxzZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGsuS0VZX1JJR0hUX0FSUk9XOiAvLyBmYWxsIHRocm91Z2gKKwkJCQljYXNlIGsuS0VZX0xFRlRfQVJST1c6IC8vIGZhbGwgdGhyb3VnaAorCQkJCQlkb1NlYXJjaCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0Oi8vIG5vbiBjaGFyIGtleXMgKEYxLUYxMiBldGMuLikgIHNob3VsZG4ndCBvcGVuIGxpc3QKKwkJCQkJaWYoZXZ0LmNoYXJDb2RlPT0wKXsKKwkJCQkJCWRvU2VhcmNoID0gZmFsc2U7CisJCQkJCX0KKwkJCX0KKworCQkJaWYodGhpcy5zZWFyY2hUaW1lcil7CisJCQkJY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZXIpOworCQkJfQorCQkJaWYoZG9TZWFyY2gpeworCQkJCS8vIGlmIHdlIGhhdmUgZ290dGVuIHRoaXMgZmFyIHdlIGRvbnQgd2FudCB0byBrZWVwIG91ciBoaWdobGlnaHQKKwkJCQl0aGlzLl9ibHVyT3B0aW9uTm9kZSgpOworCisJCQkJLy8gbmVlZCB0byB3YWl0IGEgdGFkIGJlZm9yZSBzdGFydCBzZWFyY2ggc28gdGhhdCB0aGUgZXZlbnQgYnViYmxlcyB0aHJvdWdoIERPTSBhbmQgd2UgaGF2ZSB2YWx1ZSB2aXNpYmxlCisJCQkJdGhpcy5zZWFyY2hUaW1lciA9IHNldFRpbWVvdXQoZG9qby5sYW5nLmhpdGNoKHRoaXMsIHRoaXMuX3N0YXJ0U2VhcmNoRnJvbUlucHV0KSwgdGhpcy5zZWFyY2hEZWxheSk7CisJCQl9CisJCX0sCisKKwkJY29tcG9zaXRpb25FbmQ6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJLy8gc3VtbWFyeTogV2hlbiBpbnB1dHRpbmcgY2hhcmFjdGVycyB1c2luZyBhbiBpbnB1dCBtZXRob2QsIHN1Y2ggYXMgQXNpYW4KKwkJCS8vIGxhbmd1YWdlcywgaXQgd2lsbCBnZW5lcmF0ZSB0aGlzIGV2ZW50IGluc3RlYWQgb2Ygb25LZXlEb3duIGV2ZW50CisJCQlldnQua2V5ID0gZXZ0LmtleUNvZGU7CisJCQl0aGlzLl9oYW5kbGVLZXlFdmVudHMoZXZ0KTsKKwkJfSwKKworCQlvbktleVVwOiBmdW5jdGlvbigvKkV2ZW50Ki8gZXZ0KXsKKwkJCS8vIHN1bW1hcnk6IGNhbGxiYWNrIG9uIGtleSB1cCBldmVudAorCQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUpOworCQl9LAorCisJCXNldFNlbGVjdGVkVmFsdWU6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdmFsdWUpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vCQlUaGlzIHNldHMgYSBoaWRkZW4gdmFsdWUgYXNzb2NpYXRlZCB3L3RoZSBkaXNwbGF5ZWQgdmFsdWUuCisJCQkvLwkJVGhlIGhpZGRlbiB2YWx1ZSAoYW5kIHRoaXMgZnVuY3Rpb24pIHNob3VsZG4ndCBiZSB1c2VkOyBpZgorCQkJLy8JCXlvdSBuZWVkIGEgaGlkZGVuIHZhbHVlIHRoZW4gdXNlIFNlbGVjdCB3aWRnZXQgaW5zdGVhZCBvZiBDb21ib0JveC4KKwkJCS8vIFRPRE86IHJlbW92ZT8KKwkJCS8vIEZJWE1FLCBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUhCisJCQl0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWUgPSB2YWx1ZTsKKwkJfSwKKworCQlzZXRBbGxWYWx1ZXM6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdmFsdWUxLCAvKlN0cmluZyovIHZhbHVlMil7CisJCQkvLyBzdW1tYXJ5OgorCQkJLy8JCVRoaXMgc2V0cyB0aGUgZGlzcGxheWVkIHZhbHVlIGFuZCBoaWRkZW4gdmFsdWUuCisJCQkvLwkJVGhlIGhpZGRlbiB2YWx1ZSAoYW5kIHRoaXMgZnVuY3Rpb24pIHNob3VsZG4ndCBiZSB1c2VkOyBpZgorCQkJLy8JCXlvdSBuZWVkIGEgaGlkZGVuIHZhbHVlIHRoZW4gdXNlIFNlbGVjdCB3aWRnZXQgaW5zdGVhZCBvZiBDb21ib0JveC4KKwkJCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZSh2YWx1ZTIpOworCQkJdGhpcy5zZXRWYWx1ZSh2YWx1ZTEpOworCQl9LAorCisJCV9mb2N1c09wdGlvbk5vZGU6IGZ1bmN0aW9uKC8qRG9tTm9kZSovIG5vZGUpeworCQkJLy8gc3VtbWFyeTogZG9lcyB0aGUgYWN0dWFsIGhpZ2hsaWdodAorCQkJaWYodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uICE9IG5vZGUpeworCQkJCXRoaXMuX2JsdXJPcHRpb25Ob2RlKCk7CisJCQkJdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uID0gbm9kZTsKKwkJCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLCAiZG9qb0NvbWJvQm94SXRlbUhpZ2hsaWdodCIpOworCQkJfQorCQl9LAorCisJCV9ibHVyT3B0aW9uTm9kZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bWFyeTogcmVtb3ZlcyBoaWdobGlnaHQgb24gaGlnaGxpZ2h0ZWQKKwkJCWlmKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbil7CisJCQkJZG9qby5odG1sLnJlbW92ZUNsYXNzKHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiwgImRvam9Db21ib0JveEl0ZW1IaWdobGlnaHQiKTsKKwkJCQl0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24gPSBudWxsOworCQkJfQorCQl9LAorCisJCV9oaWdobGlnaHROZXh0T3B0aW9uOiBmdW5jdGlvbigpeworCQkJaWYoKCF0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pIHx8ICF0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24ucGFyZW50Tm9kZSl7CisJCQkJdGhpcy5fZm9jdXNPcHRpb25Ob2RlKHRoaXMub3B0aW9uc0xpc3ROb2RlLmZpcnN0Q2hpbGQpOworCQkJfWVsc2UgaWYodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm5leHRTaWJsaW5nKXsKKwkJCQl0aGlzLl9mb2N1c09wdGlvbk5vZGUodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uLm5leHRTaWJsaW5nKTsKKwkJCX0KKwkJCWRvam8uaHRtbC5zY3JvbGxJbnRvVmlldyh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24pOworCQl9LAorCisJCV9oaWdobGlnaHRQcmV2T3B0aW9uOiBmdW5jdGlvbigpeworCQkJaWYodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uICYmIHRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbi5wcmV2aW91c1NpYmxpbmcpeworCQkJCXRoaXMuX2ZvY3VzT3B0aW9uTm9kZSh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24ucHJldmlvdXNTaWJsaW5nKTsKKwkJCX1lbHNleworCQkJCXRoaXMuX2hpZ2hsaWdodGVkX29wdGlvbiA9IG51bGw7CisJCQkJdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkb2pvLmh0bWwuc2Nyb2xsSW50b1ZpZXcodGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uKTsKKwkJfSwKKworCQlfaXRlbU1vdXNlT3ZlcjogZnVuY3Rpb24oLypFdmVudCovIGV2dCl7CisJCQlpZiAoZXZ0LnRhcmdldCA9PT0gdGhpcy5vcHRpb25zTGlzdE5vZGUpeyByZXR1cm47IH0KKwkJCXRoaXMuX2ZvY3VzT3B0aW9uTm9kZShldnQudGFyZ2V0KTsKKwkJCWRvam8uaHRtbC5hZGRDbGFzcyh0aGlzLl9oaWdobGlnaHRlZF9vcHRpb24sICJkb2pvQ29tYm9Cb3hJdGVtSGlnaGxpZ2h0Iik7CisJCX0sCisKKwkJX2l0ZW1Nb3VzZU91dDogZnVuY3Rpb24oLypFdmVudCovIGV2dCl7CisJCQlpZiAoZXZ0LnRhcmdldCA9PT0gdGhpcy5vcHRpb25zTGlzdE5vZGUpeyByZXR1cm47IH0KKwkJCXRoaXMuX2JsdXJPcHRpb25Ob2RlKCk7CisJCX0sCisKKwkJb25SZXNpemU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCBhcmVhIGhhcyBjaGFuZ2VkIHNpemUKKwkJCXZhciBpbnB1dFNpemUgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLnRleHRJbnB1dE5vZGUpOworCQkJaWYoIGlucHV0U2l6ZS5oZWlnaHQgPD0gMCApeworCQkJCS8vIG5lZWQgbW9yZSB0aW1lIHRvIGNhbGN1bGF0ZSBzaXplCisJCQkJZG9qby5sYW5nLnNldFRpbWVvdXQodGhpcywgIm9uUmVzaXplIiwgMTAwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2YXIgYnV0dG9uU2l6ZSA9IHsgd2lkdGg6IGlucHV0U2l6ZS5oZWlnaHQsIGhlaWdodDogaW5wdXRTaXplLmhlaWdodH07CisJCQlkb2pvLmh0bWwuc2V0Q29udGVudEJveCh0aGlzLmRvd25BcnJvd05vZGUsIGJ1dHRvblNpemUpOworCQl9LAorCisJCWZpbGxJblRlbXBsYXRlOiBmdW5jdGlvbigvKk9iamVjdCovIGFyZ3MsIC8qT2JqZWN0Ki8gZnJhZyl7CisJCQkvLyB0aGVyZSdzIHNvbWUgYnJvd3NlciBzcGVjaWZpYyBDU1MgaW4gQ29tYm9Cb3guY3NzCisJCQlkb2pvLmh0bWwuYXBwbHlCcm93c2VyQ2xhc3ModGhpcy5kb21Ob2RlKTsKKworCQkJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJCQlpZiAoISB0aGlzLm5hbWUgJiYgc291cmNlLm5hbWUpeyB0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsgfQorCQkJdGhpcy5jb21ib0JveFZhbHVlLm5hbWUgPSB0aGlzLm5hbWU7CisJCQl0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUubmFtZSA9IHRoaXMubmFtZSsiX3NlbGVjdGVkIjsKKworCQkJLyogZGlmZmVyZW50IG5vZGVzIGdldCBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHN0eWxlICovCisJCQlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgc291cmNlKTsKKwkJCWRvam8uaHRtbC5jb3B5U3R5bGUodGhpcy50ZXh0SW5wdXROb2RlLCBzb3VyY2UpOworCQkJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvd25BcnJvd05vZGUsIHNvdXJjZSk7CisJCQl3aXRoICh0aGlzLmRvd25BcnJvd05vZGUuc3R5bGUpeyAvLyBjYWxjdWxhdGUgdGhlc2UgbGF0ZXIKKwkJCQl3aWR0aCA9ICIwcHgiOworCQkJCWhlaWdodCA9ICIwcHgiOworCQkJfQorCisJCQkvLyBVc2Ugc3BlY2lmaWVkIGRhdGEgcHJvdmlkZXIgY2xhc3M7IGlmIG5vIGNsYXNzIGlzIHNwZWNpZmllZAorCQkJLy8gdGhlbiB1c2UgY29tYm9ib3hEYXRhUHJvdmlkZXIgb3IgaW5jcm1lbnRhbENvbWJvQm94RGF0YVByb3ZpZGVyCisJCQkvLyBkZXBlbmRpbmcgb24gc2V0dGluZyBvZiBtb2RlCisJCQl2YXIgZHBDbGFzczsKKwkJCWlmKHRoaXMuZGF0YVByb3ZpZGVyQ2xhc3MpeworCQkJCWlmKHR5cGVvZiB0aGlzLmRhdGFQcm92aWRlckNsYXNzID09ICJzdHJpbmciKXsKKwkJCQkJZHBDbGFzcyA9IGRvam8uZXZhbE9ialBhdGgodGhpcy5kYXRhUHJvdmlkZXJDbGFzcykKKwkJCQl9ZWxzZXsKKwkJCQkJZHBDbGFzcyA9IHRoaXMuZGF0YVByb3ZpZGVyQ2xhc3M7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJaWYodGhpcy5tb2RlID09ICJyZW1vdGUiKXsKKwkJCQkJZHBDbGFzcyA9IGRvam8ud2lkZ2V0LmluY3JlbWVudGFsQ29tYm9Cb3hEYXRhUHJvdmlkZXI7CisJCQkJfWVsc2V7CisJCQkJCWRwQ2xhc3MgPSBkb2pvLndpZGdldC5iYXNpY0NvbWJvQm94RGF0YVByb3ZpZGVyOworCQkJCX0KKwkJCX0KKwkJCXRoaXMuZGF0YVByb3ZpZGVyID0gbmV3IGRwQ2xhc3ModGhpcywgdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKSk7CisKKwkJCXRoaXMucG9wdXBXaWRnZXQgPSBuZXcgZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJQb3B1cENvbnRhaW5lciIsCisJCQkJe3RvZ2dsZTogdGhpcy5kcm9wZG93blRvZ2dsZSwgdG9nZ2xlRHVyYXRpb246IHRoaXMudG9nZ2xlRHVyYXRpb259KTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLCAnZGVzdHJveScsIHRoaXMucG9wdXBXaWRnZXQsICdkZXN0cm95Jyk7CisJCQl0aGlzLm9wdGlvbnNMaXN0Tm9kZSA9IHRoaXMucG9wdXBXaWRnZXQuZG9tTm9kZTsKKwkJCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSk7CisJCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zTGlzdE5vZGUsICdkb2pvQ29tYm9Cb3hPcHRpb25zJyk7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5vcHRpb25zTGlzdE5vZGUsICdvbmNsaWNrJywgdGhpcywgJ19zZWxlY3RPcHRpb24nKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSwgJ29ubW91c2VvdmVyJywgdGhpcywgJ19vbk1vdXNlT3ZlcicpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMub3B0aW9uc0xpc3ROb2RlLCAnb25tb3VzZW91dCcsIHRoaXMsICdfb25Nb3VzZU91dCcpOworCisJCQkvLyBUT0RPOiB3aHkgZG9lcyBvbm1vdXNlb3ZlciBhbmQgb25tb3VzZW91dCBjb25uZWN0IHRvIHR3byBzZXBhcmF0ZSBoYW5kbGVycz8/PworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMub3B0aW9uc0xpc3ROb2RlLCAib25tb3VzZW92ZXIiLCB0aGlzLCAiX2l0ZW1Nb3VzZU92ZXIiKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSwgIm9ubW91c2VvdXQiLCB0aGlzLCAiX2l0ZW1Nb3VzZU91dCIpOworCQl9LAorCisJCV9vcGVuUmVzdWx0TGlzdDogZnVuY3Rpb24oLypBcnJheSovIHJlc3VsdHMpeworCQkJaWYgKHRoaXMuZGlzYWJsZWQpeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXMuX2NsZWFyUmVzdWx0TGlzdCgpOworCQkJaWYoIXJlc3VsdHMubGVuZ3RoKXsKKwkJCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQkJfQorCisJCQlpZigJKHRoaXMuYXV0b0NvbXBsZXRlKSYmCisJCQkJKHJlc3VsdHMubGVuZ3RoKSYmCisJCQkJKCF0aGlzLl9wcmV2X2tleV9iYWNrc3BhY2UpJiYKKwkJCQkodGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCA+IDApKXsKKwkJCQl2YXIgY3BvcyA9IHRoaXMuX2dldENhcmV0UG9zKHRoaXMudGV4dElucHV0Tm9kZSk7CisJCQkJLy8gb25seSB0cnkgdG8gZXh0ZW5kIGlmIHdlIGFkZGVkIHRoZSBsYXN0IGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dAorCQkJCWlmKChjcG9zKzEpID4gdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCl7CisJCQkJCS8vIG9ubHkgYWRkIHRvIGlucHV0IG5vZGUgYXMgd2Ugd291bGQgb3ZlcndyaXRlIENhcGl0YWxpc2F0aW9uIG9mIGNoYXJzCisJCQkJCXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSArPSByZXN1bHRzWzBdWzBdLnN1YnN0cihjcG9zKTsKKwkJCQkJLy8gYnVpbGQgYSBuZXcgcmFuZ2UgdGhhdCBoYXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGVhcmxpZXIKKwkJCQkJLy8gY2FyZXQgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHNlbGVjdGVkCisJCQkJCXRoaXMuX3NldFNlbGVjdGVkUmFuZ2UodGhpcy50ZXh0SW5wdXROb2RlLCBjcG9zLCB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKTsKKwkJCQl9CisJCQl9CisKKwkJCXZhciBldmVuID0gdHJ1ZTsKKwkJCXdoaWxlKHJlc3VsdHMubGVuZ3RoKXsKKwkJCQl2YXIgdHIgPSByZXN1bHRzLnNoaWZ0KCk7CisJCQkJaWYodHIpeworCQkJCQl2YXIgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQkJdGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHJbMF0pKTsKKwkJCQkJdGQuc2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiwgdHJbMF0pOworCQkJCQl0ZC5zZXRBdHRyaWJ1dGUoInJlc3VsdFZhbHVlIiwgdHJbMV0pOworCQkJCQl0ZC5jbGFzc05hbWUgPSAiZG9qb0NvbWJvQm94SXRlbSAiKygoZXZlbikgPyAiZG9qb0NvbWJvQm94SXRlbUV2ZW4iIDogImRvam9Db21ib0JveEl0ZW1PZGQiKTsKKwkJCQkJZXZlbiA9ICghZXZlbik7CisJCQkJCXRoaXMub3B0aW9uc0xpc3ROb2RlLmFwcGVuZENoaWxkKHRkKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHNob3cgb3VyIGxpc3QgKG9ubHkgaWYgd2UgaGF2ZSBjb250ZW50LCBlbHNlIG5vdGhpbmcpCisJCQl0aGlzLl9zaG93UmVzdWx0TGlzdCgpOworCQl9LAorCisJCV9vbkZvY3VzSW5wdXQ6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLl9oYXNGb2N1cyA9IHRydWU7CisJCX0sCisKKwkJX29uQmx1cklucHV0OiBmdW5jdGlvbigpeworCQkJdGhpcy5faGFzRm9jdXMgPSBmYWxzZTsKKwkJCXRoaXMuX2hhbmRsZUJsdXJUaW1lcih0cnVlLCA1MDApOworCQl9LAorCisJCV9oYW5kbGVCbHVyVGltZXI6IGZ1bmN0aW9uKC8qQm9vbGVhbiovY2xlYXIsIC8qTnVtYmVyKi8gbWlsbGlzZWMpeworCQkJLy8gc3VtbWFyeTogY29sbGVjdCBhbGwgYmx1ciB0aW1lcnMgaXNzdWVzIGhlcmUKKwkJCWlmKHRoaXMuYmx1clRpbWVyICYmIChjbGVhciB8fCBtaWxsaXNlYykpeworCQkJCWNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lcik7CisJCQl9CisJCQlpZihtaWxsaXNlYyl7IC8vIHdlIGlnbm9yZSB0aGF0IHplcm8gaXMgZmFsc2UgYW5kIG5ldmVyIHNldHMgYXMgdGhhdCBuZXZlciBoYXBwZW5zIGluIHRoaXMgd2lkZ2V0CisJCQkJdGhpcy5ibHVyVGltZXIgPSBkb2pvLmxhbmcuc2V0VGltZW91dCh0aGlzLCAiX2NoZWNrQmx1cnJlZCIsIG1pbGxpc2VjKTsKKwkJCX0KKwkJfSwKKworCQlfb25Nb3VzZU92ZXI6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJLy8gc3VtbWFyeTogbmVlZGVkIGluIElFIGFuZCBTYWZhcmkgYXMgaW5wdXRUZXh0Tm9kZSBsb3NlcyBmb2N1cyB3aGVuIHNjcm9sbGluZyBvcHRpb25zbGlzdAorCQkJaWYoIXRoaXMuX21vdXNlb3Zlcl9saXN0KXsKKwkJCQl0aGlzLl9oYW5kbGVCbHVyVGltZXIodHJ1ZSwgMCk7CisJCQkJdGhpcy5fbW91c2VvdmVyX2xpc3QgPSB0cnVlOworCQkJfQorCQl9LAorCisJCV9vbk1vdXNlT3V0OmZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJLy8gc3VtbWFyeTogbmVlZGVkIGluIElFIGFuZCBTYWZhcmkgYXMgaW5wdXRUZXh0Tm9kZSBsb3NlcyBmb2N1cyB3aGVuIHNjcm9sbGluZyBvcHRpb25zbGlzdAorCQkJdmFyIHJlbFRhcmdldCA9IGV2dC5yZWxhdGVkVGFyZ2V0OworCQkJdHJ5IHsgLy8gZml4ZXMgIzE4MDcKKwkJCQlpZighcmVsVGFyZ2V0IHx8IHJlbFRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMub3B0aW9uc0xpc3ROb2RlKXsKKwkJCQkJdGhpcy5fbW91c2VvdmVyX2xpc3QgPSBmYWxzZTsKKwkJCQkJdGhpcy5faGFuZGxlQmx1clRpbWVyKHRydWUsIDEwMCk7CisJCQkJCXRoaXMuX3RyeUZvY3VzKCk7CisJCQkJfQorCQkJfWNhdGNoKGUpe30KKwkJfSwKKworCQlfaXNJbnB1dEVxdWFsVG9SZXN1bHQ6IGZ1bmN0aW9uKC8qU3RyaW5nKi8gcmVzdWx0KXsKKwkJCXZhciBpbnB1dCA9IHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZTsKKwkJCWlmKCF0aGlzLmRhdGFQcm92aWRlci5jYXNlU2Vuc2l0aXZlKXsKKwkJCQlpbnB1dCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7CisJCQkJcmVzdWx0ID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7CisJCQl9CisJCQlyZXR1cm4gKGlucHV0ID09IHJlc3VsdCk7CisJCX0sCisKKwkJX2lzVmFsaWRPcHRpb246IGZ1bmN0aW9uKCl7CisJCQl2YXIgdGd0ID0gZG9qby5odG1sLmZpcnN0RWxlbWVudCh0aGlzLm9wdGlvbnNMaXN0Tm9kZSk7CisJCQl2YXIgaXNWYWxpZE9wdGlvbiA9IGZhbHNlOworCQkJd2hpbGUoIWlzVmFsaWRPcHRpb24gJiYgdGd0KXsKKwkJCQlpZih0aGlzLl9pc0lucHV0RXF1YWxUb1Jlc3VsdCh0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIikpKXsKKwkJCQkJaXNWYWxpZE9wdGlvbiA9IHRydWU7CisJCQkJfWVsc2V7CisJCQkJCXRndCA9IGRvam8uaHRtbC5uZXh0RWxlbWVudCh0Z3QpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBpc1ZhbGlkT3B0aW9uOworCQl9LAorCisJCV9jaGVja0JsdXJyZWQ6IGZ1bmN0aW9uKCl7CisJCQlpZighdGhpcy5faGFzRm9jdXMgJiYgIXRoaXMuX21vdXNlb3Zlcl9saXN0KXsKKwkJCQl0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworCQkJCS8vIGNsZWFyIHRoZSBsaXN0IGlmIHRoZSB1c2VyIGVtcHRpZXMgZmllbGQgYW5kIG1vdmVzIGF3YXkuCisJCQkJaWYoIXRoaXMudGV4dElucHV0Tm9kZS52YWx1ZS5sZW5ndGgpeworCQkJCQl0aGlzLnNldEFsbFZhbHVlcygiIiwgIiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJdmFyIGlzVmFsaWRPcHRpb24gPSB0aGlzLl9pc1ZhbGlkT3B0aW9uKCk7CisJCQkJLy8gZW5mb3JjZSBzZWxlY3Rpb24gZnJvbSBvcHRpb24gbGlzdAorCQkJCWlmKHRoaXMuZm9yY2VWYWxpZE9wdGlvbiAmJiAhaXNWYWxpZE9wdGlvbil7CisJCQkJCXRoaXMuc2V0QWxsVmFsdWVzKCIiLCAiIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYoIWlzVmFsaWRPcHRpb24pey8vIGNsZWFyCisJCQkJCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZSgiIik7CisJCQkJfQorCQkJfQorCQl9LAorCisJCV9zZWxlY3RPcHRpb246IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJdmFyIHRndCA9IG51bGw7CisJCQlpZighZXZ0KXsKKwkJCQlldnQgPSB7IHRhcmdldDogdGhpcy5faGlnaGxpZ2h0ZWRfb3B0aW9uIH07CisJCQl9CisKKwkJCWlmKCFkb2pvLmh0bWwuaXNEZXNjZW5kYW50T2YoZXZ0LnRhcmdldCwgdGhpcy5vcHRpb25zTGlzdE5vZGUpKXsKKwkJCQkvLyBoYW5kbGUgYXV0b2NvbXBsZXRpb24gd2hlcmUgdGhlIHRoZSB1c2VyIGhhcyBoaXQgRU5URVIgb3IgVEFCCisKKwkJCQkvLyBpZiB0aGUgaW5wdXQgaXMgZW1wdHkgZG8gbm90aGluZworCQkJCWlmKCF0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQl0Z3QgPSBkb2pvLmh0bWwuZmlyc3RFbGVtZW50KHRoaXMub3B0aW9uc0xpc3ROb2RlKTsKKworCQkJCS8vIHVzZXIgaGFzIGlucHV0IHZhbHVlIG5vdCBpbiBvcHRpb24gbGlzdAorCQkJCWlmKCF0Z3QgfHwgIXRoaXMuX2lzSW5wdXRFcXVhbFRvUmVzdWx0KHRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSkpeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCS8vIG90aGVyd2lzZSB0aGUgdXNlciBoYXMgYWNjZXB0ZWQgdGhlIGF1dG9jb21wbGV0ZWQgdmFsdWUKKwkJCX1lbHNleworCQkJCXRndCA9IGV2dC50YXJnZXQ7CisJCQl9CisKKwkJCXdoaWxlKCh0Z3Qubm9kZVR5cGUhPTEpfHwoIXRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSkpeworCQkJCXRndCA9IHRndC5wYXJlbnROb2RlOworCQkJCWlmKHRndCA9PT0gZG9qby5ib2R5KCkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCQl0aGlzLnNlbGVjdGVkUmVzdWx0ID0gW3RndC5nZXRBdHRyaWJ1dGUoInJlc3VsdE5hbWUiKSwgdGd0LmdldEF0dHJpYnV0ZSgicmVzdWx0VmFsdWUiKV07CisJCQl0aGlzLnNldEFsbFZhbHVlcyh0Z3QuZ2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiksIHRndC5nZXRBdHRyaWJ1dGUoInJlc3VsdFZhbHVlIikpOworCQkJaWYoIWV2dC5ub0hpZGUpeworCQkJCXRoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CisJCQkJdGhpcy5fc2V0U2VsZWN0ZWRSYW5nZSh0aGlzLnRleHRJbnB1dE5vZGUsIDAsIG51bGwpOworCQkJfQorCQkJdGhpcy5fdHJ5Rm9jdXMoKTsKKwkJfSwKKworCQlfY2xlYXJSZXN1bHRMaXN0OiBmdW5jdGlvbigpeworCQkJaWYodGhpcy5vcHRpb25zTGlzdE5vZGUuaW5uZXJIVE1MKXsKKwkJCQl0aGlzLm9wdGlvbnNMaXN0Tm9kZS5pbm5lckhUTUwgPSAiIjsgIC8vIGJyb3dzZXIgbmF0aXZlbHkga25vd3MgaG93IHRvIGNvbGxlY3QgdGhpcyBtZW1vcnkKKwkJCX0KKwkJfSwKKworCQlfaGlkZVJlc3VsdExpc3Q6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLnBvcHVwV2lkZ2V0LmNsb3NlKCk7CisJCX0sCisKKwkJX3Nob3dSZXN1bHRMaXN0OiBmdW5jdGlvbigpeworCQkJLy8gT3VyIGRlYXIgZnJpZW5kIElFIGRvZXNudCB0YWtlIG1heC1oZWlnaHQgc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhhdCBvbiBvdXIgb3duIGV2ZXJ5IHRpbWUKKwkJCXZhciBjaGlsZHMgPSB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5jaGlsZE5vZGVzOworCQkJaWYoY2hpbGRzLmxlbmd0aCl7CisJCQkJdmFyIHZpc2libGVDb3VudCA9IE1hdGgubWluKGNoaWxkcy5sZW5ndGgsdGhpcy5tYXhMaXN0TGVuZ3RoKTsKKworCQkJCXdpdGgodGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUpCisJCQkJeworCQkJCQlkaXNwbGF5ID0gIiI7CisJCQkJCWlmKHZpc2libGVDb3VudCA9PSBjaGlsZHMubGVuZ3RoKXsKKwkJCQkJCS8vbm8gc2Nyb2xsYmFyIGlzIHJlcXVpcmVkLCBzbyB1bnNldCBoZWlnaHQgdG8gbGV0IGJyb3dzZXIgY2FsY3VhdGUgaXQsCisJCQkJCQkvL2FzIGluIGNzcywgb3ZlcmZsb3cgaXMgYWxyZWFkeSBzZXQgdG8gYXV0bworCQkJCQkJaGVpZ2h0ID0gIiI7CisJCQkJCX1lbHNleworCQkJCQkJLy9zaG93IGl0IGZpcnN0IHRvIGdldCB0aGUgY29ycmVjdCBkb2pvLnN0eWxlLmdldE91dGVySGVpZ2h0KGNoaWxkc1swXSkKKwkJCQkJCS8vRklYTUU6IHNoYWxsIHdlIGNhY2hlIHRoZSBoZWlnaHQgb2YgdGhlIGl0ZW0/CisJCQkJCQloZWlnaHQgPSB2aXNpYmxlQ291bnQgKiBkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KGNoaWxkc1swXSkuaGVpZ2h0ICsicHgiOworCQkJCQl9CisJCQkJCXdpZHRoID0gKGRvam8uaHRtbC5nZXRNYXJnaW5Cb3godGhpcy5kb21Ob2RlKS53aWR0aC0yKSsicHgiOworCQkJCX0KKwkJCQl0aGlzLnBvcHVwV2lkZ2V0Lm9wZW4odGhpcy5kb21Ob2RlLCB0aGlzLCB0aGlzLmRvd25BcnJvd05vZGUpOworCQkJfWVsc2V7CisJCQkJdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKwkJCX0KKwkJfSwKKworCQloYW5kbGVBcnJvd0NsaWNrOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogY2FsbGJhY2sgd2hlbiBhcnJvdyBpcyBjbGlja2VkCisJCQl0aGlzLl9oYW5kbGVCbHVyVGltZXIodHJ1ZSwgMCk7CisJCQl0aGlzLl90cnlGb2N1cygpOworCQkJaWYodGhpcy5wb3B1cFdpZGdldC5pc1Nob3dpbmdOb3cpeworCQkJCXRoaXMuX2hpZGVSZXN1bHRMaXN0KCk7CisJCQl9ZWxzZXsKKwkJCQkvLyBmb3JjZXMgZnVsbCBwb3B1bGF0aW9uIG9mIHJlc3VsdHMsIGlmIHRoZXkgY2xpY2sKKwkJCQkvLyBvbiB0aGUgYXJyb3cgaXQgbWVhbnMgdGhleSB3YW50IHRvIHNlZSBtb3JlIG9wdGlvbnMKKwkJCQl0aGlzLl9zdGFydFNlYXJjaCgiIik7CisJCQl9CisJCX0sCisKKwkJX3RyeUZvY3VzOiBmdW5jdGlvbigpeworCQkJdHJ5IHsKKwkJCQl0aGlzLnRleHRJbnB1dE5vZGUuZm9jdXMoKTsKKwkJCX0gY2F0Y2ggKGUpeworCQkJCS8vIGVsZW1lbnQgaXNuJ3QgZm9jdXNhYmxlIGlmIGRpc2FibGVkLCBvciBub3QgdmlzaWJsZSBldGMgLSBub3QgZWFzeSB0byB0ZXN0IGZvci4KKwkgCQl9OworCQl9LAorCisJCV9zdGFydFNlYXJjaEZyb21JbnB1dDogZnVuY3Rpb24oKXsKKwkJCXRoaXMuX3N0YXJ0U2VhcmNoKHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSk7CisJCX0sCisKKwkJX3N0YXJ0U2VhcmNoOiBmdW5jdGlvbigvKlN0cmluZyovIGtleSl7CisJCQl0aGlzLmRhdGFQcm92aWRlci5zdGFydFNlYXJjaChrZXksIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAiX29wZW5SZXN1bHRMaXN0IikpOworCQl9LAorCisJCXBvc3RDcmVhdGU6IGZ1bmN0aW9uKCl7CisJCQl0aGlzLm9uUmVzaXplKCk7CisKKwkJCS8vIFRPRE86IGFkZCB0aGVzZSBhdHRhY2ggZXZlbnRzIHRvIHRlbXBsYXRlCisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy50ZXh0SW5wdXROb2RlLCAib25ibHVyIiwgdGhpcywgIl9vbkJsdXJJbnB1dCIpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMudGV4dElucHV0Tm9kZSwgIm9uZm9jdXMiLCB0aGlzLCAiX29uRm9jdXNJbnB1dCIpOworCisJCQlpZiAodGhpcy5kaXNhYmxlZCl7CisJCQkJdGhpcy5kaXNhYmxlKCk7CisJCQl9CisJCQl2YXIgcyA9IGRvam8ud2lkZ2V0Lmh0bWwuc3RhYmlsZS5nZXRTdGF0ZSh0aGlzLndpZGdldElkKTsKKwkJCWlmIChzKXsKKwkJCQl0aGlzLnNldFN0YXRlKHMpOworCQkJfQorCQl9CisJfQorKTsKKworLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LkNvbWJvQm94Iik7CisKKworCisKK3N0cnV0cy53aWRnZXQuQ29tYm9Cb3hEYXRhUHJvdmlkZXIgPSBmdW5jdGlvbihjb21ib2JveCwgbm9kZSl7CisgIHRoaXMuZGF0YSA9IFtdOworICB0aGlzLnNlYXJjaExpbWl0ID0gY29tYm9ib3guc2VhcmNoTGltaXQ7CisgIHRoaXMuc2VhcmNoVHlwZSA9ICJTVEFSVFNUUklORyI7IC8vIG1heSBhbHNvIGJlICJTVEFSVFdPUkQiIG9yICJTVUJTVFJJTkciCisgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOworICAvLyBmb3IgY2FjaGluZyBvcHRpbWl6YXRpb25zCisgIHRoaXMuX2xhc3RTZWFyY2ggPSAiIjsKKyAgdGhpcy5fbGFzdFNlYXJjaFJlc3VsdHMgPSBudWxsOworCisgIHRoaXMuZmlyc3RSZXF1ZXN0ID0gdHJ1ZTsKKworICB0aGlzLmNib3ggPSBjb21ib2JveDsKKyAgdGhpcy5mb3JtSWQgPSB0aGlzLmNib3guZm9ybUlkOworICB0aGlzLmZvcm1GaWx0ZXIgPSB0aGlzLmNib3guZm9ybUZpbHRlcjsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLmNib3gudHJhbnNwb3J0OworCisgIHRoaXMuZ2V0RGF0YSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gdXJsKXsKKyAgICAvL3Nob3cgaW5kaWNhdG9yCisgICAgZG9qby5odG1sLnNob3codGhpcy5jYm94LmluZGljYXRvcik7CisKKyAgICBkb2pvLmlvLmJpbmQoeworICAgICAgdXJsOiB1cmwsCisgICAgICBmb3JtTm9kZTogZG9qby5ieUlkKHRoaXMuZm9ybUlkKSwKKyAgICAgIGZvcm1GaWx0ZXI6IHdpbmRvd1t0aGlzLmZvcm1GaWx0ZXJdLAorICAgICAgdHJhbnNwb3J0OiB0aGlzLnRyYW5zcG9ydCwKKyAgICAgIGhhbmRsZXI6IGRvam8ubGFuZy5oaXRjaCh0aGlzLCBmdW5jdGlvbih0eXBlLCBkYXRhLCBldnQpIHsKKyAgICAgICAgLy9oaWRlIGluZGljYXRvcgorICAgICAgICBkb2pvLmh0bWwuaGlkZSh0aGlzLmNib3guaW5kaWNhdG9yKTsKKworICAgICAgICAvL2lmIG5vdGlmeVRvcGljcyBpcyBwdWJsaXNoZWQgb24gdGhlIGZpcnN0IHJlcXVlc3QgKG9ubG9hZCkKKyAgICAgICAgLy90aGUgdmFsdWUgb2YgbGlzdGVuZXJzIHdpbGwgYmUgcmVzZXQKKyAgICAgICAgaWYoIXRoaXMuZmlyc3RSZXF1ZXN0IHx8IHR5cGUgPT0gImVycm9yIikgeworICAgICAgICAgIHRoaXMuY2JveC5ub3RpZnkuYXBwbHkodGhpcy5jYm94LCBbZGF0YSwgdHlwZSwgZXZ0XSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IGZhbHNlOworICAgICAgICB2YXIgYXJyRGF0YSA9IG51bGw7CisgICAgICAgIHZhciBkYXRhQnlOYW1lID0gZGF0YVtkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuY2JveC5kYXRhRmllbGROYW1lKSA/IHRoaXMuY2JveC5uYW1lIDogdGhpcy5jYm94LmRhdGFGaWVsZE5hbWVdOworICAgICAgICBpZighZG9qby5sYW5nLmlzQXJyYXkoZGF0YSkpIHsKKyAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIGRhdGFGaWVsZE5hbWUsIHRha2UgaXQKKyAgICAgICAgICAgaWYoZGF0YUJ5TmFtZSkgeworICAgICAgICAgICAgIGlmKGRvam8ubGFuZy5pc0FycmF5KGRhdGFCeU5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy9vaywgaXQgaXMgYW4gYXJyYXkKKyAgICAgICAgICAgICAgICBhcnJEYXRhID0gZGF0YUJ5TmFtZTsKKyAgICAgICAgICAgICB9IGVsc2UgaWYoZG9qby5sYW5nLmlzT2JqZWN0KGRhdGFCeU5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy9pdCBpcyBhbiBvYmplY3QsIHRyZWF0IGl0IGxpa2UgYSBtYXAKKyAgICAgICAgICAgICAgICBhcnJEYXRhID0gW107CisgICAgICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gZGF0YUJ5TmFtZSl7CisgICAgICAgICAgICAgICAgICAgIGFyckRhdGEucHVzaChba2V5LCBkYXRhQnlOYW1lW2tleV1dKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIC8vdHJ5IHRvIGZpbmQgYSBtYXRjaAorICAgICAgICAgICAgIHZhciB0bXBBcnJEYXRhID0gW107CisgICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gZGF0YSl7CisgICAgICAgICAgICAgICAvL2RvZXMgaXQgc3RhcnQgd2l0aCB0aGUgZmllbGQgbmFtZT8gdGFrZSBpdAorICAgICAgICAgICAgICAgaWYoZG9qby5zdHJpbmcuc3RhcnRzV2l0aChrZXksIHRoaXMuY2JveC5uYW1lKSkgeworICAgICAgICAgICAgICAgICBhcnJEYXRhID0gZGF0YVtrZXldOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIC8vaWYgbmF0aGluZyBlbHNlIGlzIGZvdW5kLCB3ZSB3aWxsIHVzZSB2YWx1ZXMgaW4gdGhpcworICAgICAgICAgICAgICAgICAvL29iamVjdCBhcyB0aGUgZGF0YQorICAgICAgICAgICAgICAgICB0bXBBcnJEYXRhLnB1c2goW2tleSwgZGF0YVtrZXldXSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAvL2dyYWIgdGhlIGZpcnN0IGFycmF5IGZvdW5kLCB3ZSB3aWxsIHVzZSBpdCBpZiBub3RoaW5nIGVsc2UKKyAgICAgICAgICAgICAgIC8vaXMgZm91bmQKKyAgICAgICAgICAgICAgIGlmKCFhcnJEYXRhICYmIGRvam8ubGFuZy5pc0FycmF5KGRhdGFba2V5XSkgJiYgIWRvam8ubGFuZy5pc1N0cmluZyhkYXRhW2tleV0pKSB7CisgICAgICAgICAgICAgICAgIGFyckRhdGEgPSBkYXRhW2tleV07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmKCFhcnJEYXRhKSB7CisgICAgICAgICAgICAgICBhcnJEYXRhID0gdG1wQXJyRGF0YTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgICAgICBkYXRhID0gYXJyRGF0YTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNldERhdGEoZGF0YSk7CisgICAgICB9KSwKKyAgICAgIG1pbWV0eXBlOiAidGV4dC9qc29uIgorICAgIH0pOworICB9OworCisgIHRoaXMuc3RhcnRTZWFyY2ggPSBmdW5jdGlvbiAoc2VhcmNoU3RyLCBjYWxsYmFjaykgeworICAgIC8vIEZJWE1FOiBuZWVkIHRvIGFkZCB0aW1lb3V0IGhhbmRsaW5nIGhlcmUhIQorICAgIHRoaXMuX3ByZWZvcm1TZWFyY2goc2VhcmNoU3RyLCBjYWxsYmFjayk7CisgIH07CisKKyAgdGhpcy5fcHJlZm9ybVNlYXJjaCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi8gc2VhcmNoU3RyLCBjYWxsYmFjayl7CisgICAgLy8KKyAgICAvLyAgTk9URTogdGhpcyBzZWFyY2ggaXMgTElORUFSLCB3aGljaCBtZWFucyB0aGF0IGl0IGV4aGliaXRzIHBlcmhhcHMKKyAgICAvLyAgdGhlIHdvcnN0IHBvc3NpYmxlIHNwZWVkIGNoYXJhY3RlcmlzdGljcyBvZiBhbnkgc2VhcmNoIHR5cGUuIEl0J3MKKyAgICAvLyAgd3JpdHRlbiB0aGlzIHdheSB0byBvdXRsaW5lIHRoZSByZXNwb25zaWJpbGl0aWVzIGFuZCBpbnRlcmZhY2VzIGZvcgorICAgIC8vICBhIHNlYXJjaC4KKyAgICAvLworICAgIHZhciBzdCA9IHRoaXMuc2VhcmNoVHlwZTsKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgc2VhcmNoLCB3aGljaCBtZWFucyB0aGF0IHdlIGltcGxlbWVudAorICAgIC8vIG9ubHkgYSBsaW5lYXIgc2VhcmNoIHdpdGhvdXQgYW55IG9mIHRoZSBhdHRlbmRhbnQgKHVzZWZ1bCEpIG9wdGltaXphdGlvbnMKKyAgICB2YXIgcmV0ID0gW107CisgICAgaWYoIXRoaXMuY2FzZVNlbnNpdGl2ZSl7CisgICAgICBzZWFyY2hTdHIgPSBzZWFyY2hTdHIudG9Mb3dlckNhc2UoKTsKKyAgICB9CisgICAgZm9yKHZhciB4PTA7IHg8dGhpcy5kYXRhLmxlbmd0aDsgeCsrKXsKKyAgICAgIGlmKCF0aGlzLmRhdGFbeF0gfHwgIXRoaXMuZGF0YVt4XVswXSkgeworICAgICAgICAvL25lZWRlZCBmb3IgSUUKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZigodGhpcy5zZWFyY2hMaW1pdCA+IDApICYmIChyZXQubGVuZ3RoID49IHRoaXMuc2VhcmNoTGltaXQpKSB7CisJCQlicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgYXZvaWQgY29waWVzIGlmIHBvc3NpYmxlIQorICAgICAgdmFyIGRhdGFMYWJlbCA9IG5ldyBTdHJpbmcoKCF0aGlzLmNhc2VTZW5zaXRpdmUpID8gdGhpcy5kYXRhW3hdWzBdLnRvTG93ZXJDYXNlKCkgOiB0aGlzLmRhdGFbeF1bMF0pOworICAgICAgaWYoZGF0YUxhYmVsLmxlbmd0aCA8IHNlYXJjaFN0ci5sZW5ndGgpeworICAgICAgICAvLyB0aGlzIHdvbid0IGV2ZXIgYmUgYSBnb29kIHNlYXJjaCwgd2lsbCBpdD8gV2hhdCBpZiB3ZSBzdGFydAorICAgICAgICAvLyB0byBzdXBwb3J0IHJlZ2V4IHNlYXJjaD8KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKHN0ID09ICJTVEFSVFNUUklORyIpeworICAgICAgICBpZihzZWFyY2hTdHIgPT0gZGF0YUxhYmVsLnN1YnN0cigwLCBzZWFyY2hTdHIubGVuZ3RoKSl7CisgICAgICAgICAgcmV0LnB1c2godGhpcy5kYXRhW3hdKTsKKyAgICAgICAgfQorICAgICAgfWVsc2UgaWYoc3QgPT0gIlNVQlNUUklORyIpeworICAgICAgICAvLyB0aGlzIG9uZSBpcyBhIGdpbW1pZQorICAgICAgICBpZihkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIpID49IDApeworICAgICAgICAgIHJldC5wdXNoKHRoaXMuZGF0YVt4XSk7CisgICAgICAgIH0KKyAgICAgIH1lbHNlIGlmKHN0ID09ICJTVEFSVFdPUkQiKXsKKyAgICAgICAgLy8gZG8gYSBzdWJzdHJpbmcgc2VhcmNoIGFuZCB0aGVuIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoZQorICAgICAgICAvLyBwcmVjZWVkaW5nIGNoYXIgd2FzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBvciBhCisgICAgICAgIC8vIHdoaXRlc3BhY2UgY2hhci4KKyAgICAgICAgdmFyIGlkeCA9IGRhdGFMYWJlbC5pbmRleE9mKHNlYXJjaFN0cik7CisgICAgICAgIGlmKGlkeCA9PSAwKXsKKyAgICAgICAgICAvLyBpbXBsaWNpdCBtYXRjaAorICAgICAgICAgIHJldC5wdXNoKHRoaXMuZGF0YVt4XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoaWR4IDw9IDApeworICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBtYXRjaCBvciBpbXBsaWNpbHkgbWF0Y2hlZCwgbWFyY2ggb253YXJkCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGdvIGZpZ3VyZSBvdXQgaWYgdGhlIG1hdGNoIHdhcyBhdCB0aGUKKyAgICAgICAgLy8gc3RhcnQgb2YgYSB3b3JkLi4uCisgICAgICAgIC8vIHRoaXMgY29kZSBpcyB0YWtlbiBhbG1vc3QgZGlyZWN0eSBmcm9tIG5XaWRnZXRzCisgICAgICAgIHZhciBtYXRjaGVzID0gZmFsc2U7CisgICAgICAgIHdoaWxlKGlkeCE9LTEpeworICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbWF0Y2ggZWl0aGVyIHN0YXJ0cyB3aG9sZSBzdHJpbmcsIG9yCisgICAgICAgICAgLy8gZm9sbG93cyBhIHNwYWNlLCBvciBmb2xsb3dzIHNvbWUgcHVuY3R1YXRpb24KKyAgICAgICAgICBpZigiICwvKCIuaW5kZXhPZihkYXRhTGFiZWwuY2hhckF0KGlkeC0xKSkgIT0gLTEpeworICAgICAgICAgICAgLy8gRklYTUU6IHdoYXQgYWJvdXQgdGFiIGNoYXJzPworICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWU7IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZHggPSBkYXRhTGFiZWwuaW5kZXhPZihzZWFyY2hTdHIsIGlkeCsxKTsKKyAgICAgICAgfQorICAgICAgICBpZighbWF0Y2hlcyl7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHJldC5wdXNoKHRoaXMuZGF0YVt4XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY2FsbGJhY2socmV0KTsKKyAgfTsKKworICB0aGlzLmFkZERhdGEgPSBmdW5jdGlvbigvKkFycmF5Ki8gcGFpcnMpeworICAgIC8vIEZJWE1FOiBpbmNyZWRpYmx5IG5haXZlIGFuZCBzbG93IQorICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQocGFpcnMpOworICB9OworCisgIHRoaXMuc2V0RGF0YSA9IGZ1bmN0aW9uKC8qQXJyYXkqLyBwZGF0YSl7CisgICAgLy8gcG9wdWxhdGUgdGhpcy5kYXRhIGFuZCBpbml0aWFsaXplIGxvb2t1cCBzdHJ1Y3R1cmVzCisgICAgdGhpcy5kYXRhID0gcGRhdGE7CisgICAgLy9hbGwgZWxsZW1lbnRzIG11c3QgYmUgYSBrZXkgYW5kIHZhbHVlIHBhaXIKKyAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZGF0YVtpXTsKKyAgICAgIGlmKCFkb2pvLmxhbmcuaXNBcnJheShlbGVtZW50KSkgeworICAgICAgICB0aGlzLmRhdGFbaV0gPSBbZWxlbWVudCwgZWxlbWVudF07CisgICAgICB9CisgICAgfQorICB9OworCisKKyAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5jYm94LmRhdGFVcmwpICYmIHRoaXMuY2JveC5wcmVsb2FkKXsKKyAgICB0aGlzLmdldERhdGEodGhpcy5jYm94LmRhdGFVcmwpOworICB9IGVsc2UgeworICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gcG9wdWxhdGUgdGhlIGxpc3QgZnJvbSA8b3B0aW9uPiBlbGVtZW50cworICAgIGlmKChub2RlKSYmKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAic2VsZWN0IikpeworICAgICAgLy8gTk9URTogd2UncmUgbm90IGhhbmRsaW5nIDxvcHRncm91cD4gaGVyZSB5ZXQKKyAgICAgIHZhciBvcHRzID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3B0aW9uIik7CisgICAgICB2YXIgb2wgPSBvcHRzLmxlbmd0aDsKKyAgICAgIHZhciBkYXRhID0gW107CisgICAgICBmb3IodmFyIHg9MDsgeDxvbDsgeCsrKXsKKyAgICAgICAgdmFyIHRleHQgPSBvcHRzW3hdLnRleHRDb250ZW50IHx8IG9wdHNbeF0uaW5uZXJUZXh0IHx8IG9wdHNbeF0uaW5uZXJIVE1MOworICAgICAgICB2YXIga2V5VmFsQXJyID0gW1N0cmluZyh0ZXh0KSwgU3RyaW5nKG9wdHNbeF0udmFsdWUpXTsKKyAgICAgICAgZGF0YS5wdXNoKGtleVZhbEFycik7CisgICAgICAgIGlmKG9wdHNbeF0uc2VsZWN0ZWQpeworICAgICAgICAgIHRoaXMuY2JveC5zZXRBbGxWYWx1ZXMoa2V5VmFsQXJyWzBdLCBrZXlWYWxBcnJbMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLnNldERhdGEoZGF0YSk7CisgICAgfQorICB9Cit9OworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisgICJzdHJ1dHMud2lkZ2V0LkNvbWJvQm94IiwKKyAgZG9qby53aWRnZXQuQ29tYm9Cb3gsIHsKKyAgd2lkZ2V0VHlwZSA6ICJDb21ib0JveCIsCisKKyAgZHJvcGRvd25IZWlnaHQ6IDEyMCwKKyAgZHJvcGRvd25XaWR0aDogMCwKKyAgaXRlbUhlaWdodDogMCwKKworICBsaXN0ZW5Ub3BpY3MgOiAiIiwKKyAgbm90aWZ5VG9waWNzIDogIiIsCisgIG5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgYmVmb3JlTm90aWZ5VG9waWNzIDogIiIsCisgIGJlZm9yZU5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgYWZ0ZXJOb3RpZnlUb3BpY3MgOiAiIiwKKyAgYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIGVycm9yTm90aWZ5VG9waWNzIDogIiIsCisgIGVycm9yTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICB2YWx1ZU5vdGlmeVRvcGljcyA6ICIiLAorICB2YWx1ZU5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgaW5kaWNhdG9yIDogIiIsCisKKyAgZm9ybUlkIDogIiIsCisgIGZvcm1GaWx0ZXIgOiAiIiwKKyAgZGF0YVByb3ZpZGVyQ2xhc3M6ICJzdHJ1dHMud2lkZ2V0LkNvbWJvQm94RGF0YVByb3ZpZGVyIiwKKworICBsb2FkT25UeXBlIDogZmFsc2UsCisgIGxvYWRNaW5pbXVtIDogMywKKworICBpbml0aWFsVmFsdWUgOiAiIiwKKyAgaW5pdGlhbEtleSA6ICIiLAorCisgIHZpc2libGVEb3duQXJyb3cgOiB0cnVlLAorICBmYWRlVGltZSA6IDEwMCwKKworICAvL2Rvam8gaGFzICJzdHJpbmdzdGFydCIgd2hpY2ggaXMgaW52YWxpZAorICBzZWFyY2hUeXBlOiAiU1RBUlRTVFJJTkciLAorCisgIGRhdGFGaWVsZE5hbWUgOiAiIiwKKyAga2V5TmFtZTogIiIsCisgIC8vZW1iZWRkZWQgdGhlIHN0eWxlIGluIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgaW4gMC40LjIgcmVsZWFzZSwgbm90IGdvb2QKKyAgdGVtcGxhdGVDc3NTdHJpbmc6IG51bGwsCisgIHRlbXBsYXRlQ3NzU3RyaW5nOiIvKlxyXG4gKiAkSWQkXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcclxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXHJcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXHJcbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcclxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxyXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcclxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcclxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cclxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXHJcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcclxuICogdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLmRvam9Db21ib0JveE91dGVyIHtcclxuXHRib3JkZXI6IDBweCAhaW1wb3J0YW50O1xyXG5cdG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcclxuXHR3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3gge1xyXG5cdGJvcmRlcjogMXB4IGluc2V0ICNhZmFmYWY7XHJcblx0bWFyZ2luOiAwcHg7XHJcblx0cGFkZGluZzogMHB4O1xyXG5cdHZlcnRpY2FsLWFsaWduOiBtaWRkbGUgIWltcG9ydGFudDtcclxuXHRmbG9hdDogbm9uZSAhaW1wb3J0YW50O1xyXG5cdHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuXHRkaXNwbGF5OiBpbmxpbmU7XHJcbn1cclxuXHJcbi8qIHRoZSBpbnB1dCBib3ggKi9cclxuaW5wdXQuZG9qb0NvbWJvQm94IHtcclxuXHRib3JkZXItcmlnaHQtd2lkdGg6IDFweCAhaW1wb3J0YW50O1xyXG5cdG1hcmdpbi1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIHRoZSBkb3duIGFycm93ICovXHJcbmltZy5kb2pvQ29tYm9Cb3gge1xyXG5cdGJvcmRlci1sZWZ0LXdpZHRoOiAwcHggIWltcG9ydGFudDtcclxuXHRwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50O1xyXG5cdG1hcmdpbi1sZWZ0OiAwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogSUUgdmVydGljYWwtYWxpZ25tZW50IGNhbGN1bGF0aW9ucyBjYW4gYmUgb2ZmIGJ5ICstMSBidXQgdGhlc2UgbWFyZ2lucyBhcmUgY29sbGFwc2VkIGF3YXkgKi9cclxuLmRqX2llIGltZy5kb2pvQ29tYm9Cb3gge1xyXG5cdG1hcmdpbi10b3A6IDFweDtcclxuXHRtYXJnaW4tYm90dG9tOiAxcHg7XHJcbn1cclxuXHJcbi8qIHRoZSBkcm9wIGRvd24gKi9cclxuLmRvam9Db21ib0JveE9wdGlvbnMge1xyXG5cdGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIEdhcmFtb25kLCBzYW5zLXNlcmlmO1xyXG5cdC8qIGZvbnQtc2l6ZTogMC43ZW07ICovXHJcblx0YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgI2FmYWZhZjtcclxuXHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0ei1pbmRleDogMTAwMDtcclxuXHRvdmVyZmxvdzogYXV0bztcclxuXHRjdXJzb3I6IGRlZmF1bHQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtIHtcclxuXHRwYWRkaW5nLWxlZnQ6IDJweDtcclxuXHRwYWRkaW5nLXRvcDogMnB4O1xyXG5cdG1hcmdpbjogMHB4O1xyXG59XHJcblxyXG4uZG9qb0NvbWJvQm94SXRlbUV2ZW4ge1xyXG5cdGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XHJcbn1cclxuXHJcbi5kb2pvQ29tYm9Cb3hJdGVtT2RkIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmRvam9Db21ib0JveEl0ZW1IaWdobGlnaHQge1xyXG5cdGJhY2tncm91bmQtY29sb3I6ICM2MzcwOUE7XHJcblx0Y29sb3I6IHdoaXRlO1xyXG59XHJcbiIsdGVtcGxhdGVDc3NQYXRoOiBkb2pvLnVyaS5kb2pvVXJpKCJzdHJ1dHMvQ29tYm9Cb3guY3NzIiksCisKKyAgLy9ob3cgbWFueSByZXN1bHRzIGFyZSBzaG93bgorICBzZWFyY2hMaW1pdCA6IDMwLAorCisgIHRyYW5zcG9ydCA6ICIiLAorCisgIC8vbG9hZCBvcHRpb25zIHdoZW4gcGFnZSBsb2FkcworICBwcmVsb2FkIDogdHJ1ZSwKKworICB0YWJJbmRleDogIiIsCisKKyAgLy9mcm9tIERvam8ncyAgQ29tYm9Cb3gKKyAgc2hvd1Jlc3VsdExpc3Q6IGZ1bmN0aW9uKCkgeworICAvLyBPdXIgZGVhciBmcmllbmQgSUUgZG9lc250IHRha2UgbWF4LWhlaWdodCBzbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGF0IG9uIG91ciBvd24gZXZlcnkgdGltZQorICAgIHZhciBjaGlsZHMgPSB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5jaGlsZE5vZGVzOworICAgIGlmKGNoaWxkcy5sZW5ndGgpeworCisgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5zdHlsZS53aWR0aCA9IHRoaXMuZHJvcGRvd25XaWR0aCA9PT0gMCA/IChkb2pvLmh0bWwuZ2V0TWFyZ2luQm94KHRoaXMuZG9tTm9kZSkud2lkdGgtMikrInB4IiA6IHRoaXMuZHJvcGRvd25XaWR0aCArICJweCI7CisKKyAgICAgIGlmKHRoaXMuaXRlbUhlaWdodCA9PT0gMCB8fCBkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZSkpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcm9wZG93bkhlaWdodCArICJweCI7CisgICAgICAgIHRoaXMub3B0aW9uc0xpc3ROb2RlLnN0eWxlLmRpc3BsYXkgPSAiIjsKKyAgICAgICAgdGhpcy5pdGVtSGVpZ2h0ID0gZG9qby5odG1sLmdldE1hcmdpbkJveChjaGlsZHNbMF0pLmhlaWdodDsKKyAgICAgIH0KKworICAgICAgLy9pZiB0aGVyZSBpcyBleHRyYSBzcGFjZSwgYWRqdXN0IGhlaWdodAorICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gdGhpcy5pdGVtSGVpZ2h0ICogY2hpbGRzLmxlbmd0aDsKKyAgICAgIGlmKHRvdGFsSGVpZ2h0IDwgdGhpcy5kcm9wZG93bkhlaWdodCkgeworICAgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSB0b3RhbEhlaWdodCArIDIgKyAicHgiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5vcHRpb25zTGlzdE5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcm9wZG93bkhlaWdodCArICJweCI7CisgICAgICB9CisKKyAgICAgIHRoaXMucG9wdXBXaWRnZXQub3Blbih0aGlzLmRvbU5vZGUsIHRoaXMsIHRoaXMuZG93bkFycm93Tm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5faGlkZVJlc3VsdExpc3QoKTsKKyAgICB9CisgIH0sCisKKyAgX29wZW5SZXN1bHRMaXN0OiBmdW5jdGlvbigvKkFycmF5Ki8gcmVzdWx0cyl7CisgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKKwkJcmV0dXJuOworCX0KKyAgICB0aGlzLl9jbGVhclJlc3VsdExpc3QoKTsKKyAgICBpZighcmVzdWx0cy5sZW5ndGgpeworICAgICAgICB0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworICAgIH0KKworICAgIGlmKCAodGhpcy5hdXRvQ29tcGxldGUpJiYKKyAgICAgICAgKHJlc3VsdHMubGVuZ3RoKSYmCisgICAgICAgICghdGhpcy5fcHJldl9rZXlfYmFja3NwYWNlKSYmCisgICAgICAgICh0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoID4gMCkpeworICAgICAgICB2YXIgY3BvcyA9IHRoaXMuX2dldENhcmV0UG9zKHRoaXMudGV4dElucHV0Tm9kZSk7CisgICAgICAgIC8vIG9ubHkgdHJ5IHRvIGV4dGVuZCBpZiB3ZSBhZGRlZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgICAgICAgaWYoKGNwb3MrMSkgPiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUubGVuZ3RoKXsKKyAgICAgICAgICAgIC8vIG9ubHkgYWRkIHRvIGlucHV0IG5vZGUgYXMgd2Ugd291bGQgb3ZlcndyaXRlIENhcGl0YWxpc2F0aW9uIG9mIGNoYXJzCisgICAgICAgICAgICB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgKz0gcmVzdWx0c1swXVswXS5zdWJzdHIoY3Bvcyk7CisgICAgICAgICAgICAvLyBidWlsZCBhIG5ldyByYW5nZSB0aGF0IGhhcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZWFybGllcgorICAgICAgICAgICAgLy8gY2FyZXQgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHNlbGVjdGVkCisgICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZFJhbmdlKHRoaXMudGV4dElucHV0Tm9kZSwgY3BvcywgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFyIHR5cGVkVGV4dCA9IHRoaXMudGV4dElucHV0Tm9kZS52YWx1ZTsKKyAgICB2YXIgZXZlbiA9IHRydWU7CisgICAgd2hpbGUocmVzdWx0cy5sZW5ndGgpeworICAgICAgICB2YXIgdHIgPSByZXN1bHRzLnNoaWZ0KCk7CisgICAgICAgIGlmKHRyKXsKKyAgICAgICAgICAgIHZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgICAgICAgICAgdmFyIHRleHQgPSB0clswXTsKKyAgICAgICAgICAgIHZhciBpID0gdGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YodHlwZWRUZXh0LnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgaWYoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdmFyIHByZSA9IHRleHQuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICAgICAgICAgIHZhciBtYXRjaGVkID0gdGV4dC5zdWJzdHJpbmcoaSwgaSArIHR5cGVkVGV4dC5sZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciBwb3N0ID0gdGV4dC5zdWJzdHJpbmcoaSArIHR5cGVkVGV4dC5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsocHJlKSkgeworICAgICAgICAgICAgICAgICAgdGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocHJlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBib2xkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImIiKTsKKyAgICAgICAgICAgICAgICB0ZC5hcHBlbmRDaGlsZChib2xkTm9kZSk7CisgICAgICAgICAgICAgICAgYm9sZE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWF0Y2hlZCkpOworICAgICAgICAgICAgICAgIHRkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBvc3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHJbMF0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGQuc2V0QXR0cmlidXRlKCJyZXN1bHROYW1lIiwgdHJbMF0pOworICAgICAgICAgICAgdGQuc2V0QXR0cmlidXRlKCJyZXN1bHRWYWx1ZSIsIHRyWzFdKTsKKyAgICAgICAgICAgIHRkLmNsYXNzTmFtZSA9ICJkb2pvQ29tYm9Cb3hJdGVtICIrKChldmVuKSA/ICJkb2pvQ29tYm9Cb3hJdGVtRXZlbiIgOiAiZG9qb0NvbWJvQm94SXRlbU9kZCIpOworICAgICAgICAgICAgZXZlbiA9ICghZXZlbik7CisgICAgICAgICAgICB0aGlzLm9wdGlvbnNMaXN0Tm9kZS5hcHBlbmRDaGlsZCh0ZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaG93IG91ciBsaXN0IChvbmx5IGlmIHdlIGhhdmUgY29udGVudCwgZWxzZSBub3RoaW5nKQorICAgIHRoaXMuc2hvd1Jlc3VsdExpc3QoKTsKKyAgfSwKKworICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5Db21ib0JveC5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIC8vZXZlbnRzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5saXN0ZW5Ub3BpY3MpKSB7CisgICAgICB2YXIgdG9waWNzID0gdGhpcy5saXN0ZW5Ub3BpY3Muc3BsaXQoIiwiKTsKKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0b3BpY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodG9waWNzW2ldLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgcmVxdWVzdCA9IHtjYW5jZWw6IGZhbHNlfTsKKwkgICAgICBzZWxmLm5vdGlmeSh0aGlzLndpZGdldElkLCAiYmVmb3JlIiwgcmVxdWVzdCk7CisJICAgICAgaWYocmVxdWVzdC5jYW5jZWwpIHsKKwkgICAgICAgIHJldHVybjsKKwkgICAgICB9CisgICAgICAgICAgc2VsZi5jbGVhclZhbHVlcygpOworICAgICAgICAgIHNlbGYuZGF0YVByb3ZpZGVyLmdldERhdGEoc2VsZi5kYXRhVXJsKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgLy9ub3RpZnkgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ub3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLm5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5ub3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL2JlZm9yZSB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmJlZm9yZU5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuYmVmb3JlTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmJlZm9yZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIC8vYWZ0ZXIgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5hZnRlck5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuYWZ0ZXJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL2Vycm9yIHRvcGljcworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgfQorCisgICAgLy92YWx1ZSB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnZhbHVlTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy52YWx1ZU5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIC8vYmV0dGVyIG5hbWUKKyAgICB0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUubmFtZSA9IGRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5rZXlOYW1lKSA/IHRoaXMubmFtZSArICJLZXkiIDogdGhpcy5rZXlOYW1lOworCisgICAgLy9pbml0IHZhbHVlcworICAgIHRoaXMuY29tYm9Cb3hWYWx1ZS52YWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlOworICAgIHRoaXMuY29tYm9Cb3hTZWxlY3Rpb25WYWx1ZS52YWx1ZSA9IHRoaXMuaW5pdGlhbEtleTsKKyAgICB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZTsKKworICAgIC8vdGFiaW5kZXgKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnRhYkluZGV4KSkgeworICAgICAgdGhpcy50ZXh0SW5wdXROb2RlLnRhYkluZGV4ID0gdGhpcy50YWJJbmRleDsKKyAgICB9CisKKyAgICAvL2hpZGUgYXJyb3c/CisgICAgaWYoIXRoaXMudmlzaWJsZURvd25BcnJvdykgeworICAgICAgZG9qby5odG1sLmhpZGUodGhpcy5kb3duQXJyb3dOb2RlKTsKKyAgICB9CisKKyAgICAvL3NlYXJjaCB0eXBlCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zZWFyY2hUeXBlKSkgeworICAgICAgdGhpcy5kYXRhUHJvdmlkZXIuc2VhcmNoVHlwZSA9IHRoaXMuc2VhcmNoVHlwZS50b1VwcGVyQ2FzZSgpOworICAgIH0KKyAgfSwKKworICBjbGVhclZhbHVlcyA6IGZ1bmN0aW9uKCkgeworICAJdGhpcy5jb21ib0JveFZhbHVlLnZhbHVlID0gIiI7CisgICAgdGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLnZhbHVlID0gIiI7CisgICAgdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlID0gIiI7CisgIH0sCisKKyAgb25WYWx1ZUNoYW5nZWQgOiBmdW5jdGlvbihkYXRhKSB7CisgICAgdGhpcy5ub3RpZnkoZGF0YSwgInZhbHVlY2hhbmdlZCIsIG51bGwpOworICB9LAorCisgIG5vdGlmeSA6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIGUpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgLy9nZW5lcmFsIHRvcGljcworICAgIGlmKHRoaXMubm90aWZ5VG9waWNzQXJyYXkpIHsKKyAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHRoaXMubm90aWZ5VG9waWNzQXJyYXksIGZ1bmN0aW9uKHRvcGljKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCB0eXBlLCBlLCBzZWxmKTsKKyAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgc2VsZi5sb2coZXgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICAvL2JlZm9yZSwgYWZ0ZXIgYW5kIGVycm9yIHRvcGljcworICAgIHZhciB0b3BpY3NBcnJheSA9IG51bGw7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgIGNhc2UgImJlZm9yZSI6CisgICAgICAgIHRoaXMubm90aWZ5VG8odGhpcy5iZWZvcmVOb3RpZnlUb3BpY3NBcnJheSwgW2UsIHRoaXNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJsb2FkIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLmFmdGVyTm90aWZ5VG9waWNzQXJyYXksIFtkYXRhLCBlLCB0aGlzXSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiZXJyb3IiOgorICAgICAgICB0aGlzLm5vdGlmeVRvKHRoaXMuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSwgW2RhdGEsIGUsIHRoaXNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAidmFsdWVjaGFuZ2VkIjoKKyAgICAgICAgdGhpcy5ub3RpZnlUbyh0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXksIFt0aGlzLmdldFNlbGVjdGVkVmFsdWUoKSwgdGhpcy5nZXRTZWxlY3RlZEtleSgpLCB0aGlzLmdldFRleHQoKSwgdGhpc10pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0sCisKKyAgbm90aWZ5VG8gOiBmdW5jdGlvbih0b3BpY3NBcnJheSwgcGFyYW1zKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIGlmKHRvcGljc0FycmF5KSB7CisgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0b3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2hBcHBseSh0b3BpYywgcGFyYW1zKTsKKyAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgc2VsZi5sb2coZXgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0sCisKKyAgbG9nIDogZnVuY3Rpb24odGV4dCkgeworICAgIGRvam8uZGVidWcoIlsiICsgKHRoaXMud2lkZ2V0SWQgPyB0aGlzLndpZGdldElkIDogInVua25vd24iKSAgKyAiXSAiICsgdGV4dCk7CisgIH0sCisKKyAgX3N0YXJ0U2VhcmNoRnJvbUlucHV0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VhcmNoU3RyID0gdGhpcy50ZXh0SW5wdXROb2RlLnZhbHVlOworICAgIGlmKHRoaXMubG9hZE9uVHlwZSkgeworICAgICAgaWYoc2VhcmNoU3RyLmxlbmd0aCA+PSB0aGlzLmxvYWRNaW5pbXVtKSB7CisgICAgICAgICAgdmFyIG51SHJlZiA9IHRoaXMuZGF0YVVybCArICh0aGlzLmRhdGFVcmwuaW5kZXhPZigiPyIpID4gLTEgPyAiJiIgOiAiPyIpOworICAgICAgbnVIcmVmICs9IHRoaXMubmFtZSArICc9JyArICBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyKTsKKyAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmdldERhdGEobnVIcmVmKTsKKyAgICAgIHRoaXMuX3N0YXJ0U2VhcmNoKHNlYXJjaFN0cik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9oaWRlUmVzdWx0TGlzdCgpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKwkgIHRoaXMuX3N0YXJ0U2VhcmNoKHNlYXJjaFN0cik7CisJfQorICB9LAorCisgIHNldFNlbGVjdGVkS2V5IDogZnVuY3Rpb24oa2V5KSB7CisgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGFQcm92aWRlci5kYXRhOworICAgIGZvcihlbGVtZW50IGluIGRhdGEpIHsKKyAgICAgICB2YXIgb2JqID0gZGF0YVtlbGVtZW50XTsKKyAgICAgICBpZihvYmpbMV0udG9TdHJpbmcoKSA9PSBrZXkpIHsKKyAgICAgICAgIHRoaXMuc2V0VmFsdWUob2JqWzBdLnRvU3RyaW5nKCkpOworICAgICAgICAgdGhpcy5jb21ib0JveFNlbGVjdGlvblZhbHVlLnZhbHVlID0gb2JqWzFdLnRvU3RyaW5nKCk7CisgICAgICAgfQorICAgIH0KKyAgfSwKKworICBnZXRTZWxlY3RlZEtleSA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvbWJvQm94U2VsZWN0aW9uVmFsdWUudmFsdWU7CisgIH0sCisKKyAgZ2V0U2VsZWN0ZWRWYWx1ZSA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvbWJvQm94VmFsdWUudmFsdWU7CisgIH0sCisKKyAgZ2V0VGV4dCA6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRleHRJbnB1dE5vZGUudmFsdWU7CisgIH0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyIik7CisKKworCisKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyIiwKKwlkb2pvLndpZGdldC5IdG1sV2lkZ2V0LAorCXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCXByb3ZpZGVzIGFuIGlucHV0IGJveCBhbmQgYSBidXR0b24gZm9yIGEgZHJvcGRvd24uCisJCS8vCQlJbiBzdWJjbGFzcywgdGhlIGRyb3Bkb3duIGNhbiBiZSBzcGVjaWZpZWQuCisKKwkJLy8gaW5wdXRXaWR0aDogU3RyaW5nOiB3aWR0aCBvZiB0aGUgaW5wdXQgYm94CisJCWlucHV0V2lkdGg6ICI3ZW0iLAorCisJCS8vIGlkOiBTdHJpbmc6IGlkIG9mIHRoaXMgd2lkZ2V0CisJCWlkOiAiIiwKKworCQkvLyBpbnB1dElkOiBTdHJpbmc6IGlkIG9mIHRoZSBpbnB1dCBib3gKKwkJaW5wdXRJZDogIiIsCisKKwkJLy8gaW5wdXROYW1lOiBTdHJpbmc6IG5hbWUgb2YgdGhlIGlucHV0IGJveAorCQlpbnB1dE5hbWU6ICIiLAorCisJCS8vIGljb25VUkw6IGRvam8udXJpLlVyaTogaWNvbiBmb3IgdGhlIGRyb3Bkb3duIGJ1dHRvbgorCQlpY29uVVJMOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvY29tYm9fYm94X2Fycm93LnBuZyIpLAorCisJCS8vIGNvcHlDbGFzczoKKwkJLy8JCXNob3VsZCB3ZSB1c2UgdGhlIGNsYXNzIHByb3BlcnRpZXMgb24gdGhlIHNvdXJjZSBub2RlIGluc3RlYWQKKwkJLy8JCW9mIG91ciBvd24gc3R5bGVzPworCQljb3B5Q2xhc3NlczogZmFsc2UsCisKKwkJLy8gaWNvbkFsdDogZG9qby51cmkuVXJpOiBhbHQgdGV4dCBmb3IgdGhlIGRyb3Bkb3duIGJ1dHRvbiBpY29uCisJCWljb25BbHQ6ICIiLAorCisJCS8vIGNvbnRhaW5lclRvZ2dsZTogU3RyaW5nOiB0b2dnbGUgcHJvcGVydHkgb2YgdGhlIGRyb3Bkb3duCisJCWNvbnRhaW5lclRvZ2dsZTogInBsYWluIiwKKworCQkvLyBjb250YWluZXJUb2dnbGVEdXJhdGlvbjogSW50ZWdlcjogdG9nZ2xlIGR1cmF0aW9uIHByb3BlcnR5IG9mIHRoZSBkcm9wZG93bgorCQljb250YWluZXJUb2dnbGVEdXJhdGlvbjogMTUwLAorCisJCXRlbXBsYXRlU3RyaW5nOiAnPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiB2YWx1ZT0iIiBkb2pvQXR0YWNoUG9pbnQ9InZhbHVlTm9kZSIgLz48aW5wdXQgbmFtZT0iIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlOyIgZG9qb0F0dGFjaFBvaW50PSJpbnB1dE5vZGUiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPiA8aW1nIHNyYz0iJHt0aGlzLmljb25VUkx9IiBhbHQ9IiR7dGhpcy5pY29uQWx0fSIgZG9qb0F0dGFjaEV2ZW50PSJvbmNsaWNrOm9uSWNvbkNsaWNrIiBkb2pvQXR0YWNoUG9pbnQ9ImJ1dHRvbk5vZGUiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IGN1cnNvcjpwb2ludGVyOyBjdXJzb3I6aGFuZCIgLz48L3NwYW4+JywKKwkJdGVtcGxhdGVDc3NQYXRoOiAiIiwKKwkJaXNDb250YWluZXI6IHRydWUsCisKKwkJYXR0YWNoVGVtcGxhdGVOb2RlczogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IHVzZSBhdHRhY2hUZW1wbGF0ZU5vZGVzIHRvIHNwZWNpZnkgY29udGFpbmVyTm9kZSwgYXMgZmlsbEluVGVtcGxhdGUgaXMgdG9vIGxhdGUgZm9yIHRoaXMKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyLnN1cGVyY2xhc3MuYXR0YWNoVGVtcGxhdGVOb2Rlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJdGhpcy5wb3B1cCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiUG9wdXBDb250YWluZXIiLCB7dG9nZ2xlOiB0aGlzLmNvbnRhaW5lclRvZ2dsZSwgdG9nZ2xlRHVyYXRpb246IHRoaXMuY29udGFpbmVyVG9nZ2xlRHVyYXRpb259KTsKKwkJCXRoaXMuY29udGFpbmVyTm9kZSA9IHRoaXMucG9wdXAuZG9tTm9kZTsKKwkJfSwKKworCQlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oYXJncywgZnJhZyl7CisJCQl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cC5kb21Ob2RlKTsKKwkJCWlmKHRoaXMuaWQpIHsgdGhpcy5kb21Ob2RlLmlkID0gdGhpcy5pZDsgfQorCQkJaWYodGhpcy5pbnB1dElkKXsgdGhpcy5pbnB1dE5vZGUuaWQgPSB0aGlzLmlucHV0SWQ7IH0KKwkJCWlmKHRoaXMuaW5wdXROYW1lKXsgdGhpcy5pbnB1dE5vZGUubmFtZSA9IHRoaXMuaW5wdXROYW1lOyB9CisJCQl0aGlzLmlucHV0Tm9kZS5zdHlsZS53aWR0aCA9IHRoaXMuaW5wdXRXaWR0aDsKKwkJCXRoaXMuaW5wdXROb2RlLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDsKKworCQkJaWYodGhpcy5jb3B5Q2xhc3Nlcyl7CisJCQkJdGhpcy5pbnB1dE5vZGUuc3R5bGUgPSAiIjsKKwkJCQl0aGlzLmlucHV0Tm9kZS5jbGFzc05hbWUgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpLmNsYXNzTmFtZTsKKwkJCX0KKworCisJCQlkb2pvLmV2ZW50LmNvbm5lY3QodGhpcy5pbnB1dE5vZGUsICJvbmNoYW5nZSIsIHRoaXMsICJvbklucHV0Q2hhbmdlIik7CisJCX0sCisKKwkJb25JY29uQ2xpY2s6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJaWYodGhpcy5kaXNhYmxlZCkgcmV0dXJuOworCQkJaWYoIXRoaXMucG9wdXAuaXNTaG93aW5nTm93KXsKKwkJCQl0aGlzLnBvcHVwLm9wZW4odGhpcy5pbnB1dE5vZGUsIHRoaXMsIHRoaXMuYnV0dG9uTm9kZSk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLnBvcHVwLmNsb3NlKCk7CisJCQl9CisJCX0sCisKKwkJaGlkZUNvbnRhaW5lcjogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGhpZGUgdGhlIGRyb3Bkb3duCisJCQlpZih0aGlzLnBvcHVwLmlzU2hvd2luZ05vdyl7CisJCQkJdGhpcy5wb3B1cC5jbG9zZSgpOworCQkJfQorCQl9LAorCisJCW9uSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBzaWduYWwgZm9yIGNoYW5nZXMgaW4gdGhlIGlucHV0IGJveAorCQl9LAorCQkKKwkJZW5hYmxlOiBmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6IGVuYWJsZSB0aGlzIHdpZGdldCB0byBhY2NlcHQgdXNlciBpbnB1dAorCQkJdGhpcy5pbnB1dE5vZGUuZGlzYWJsZWQgPSBmYWxzZTsKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duQ29udGFpbmVyLnN1cGVyY2xhc3MuZW5hYmxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0sCisJCQorCQlkaXNhYmxlOiBmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6IGxvY2sgdGhpcyB3aWRnZXQgc28gdGhhdCB0aGUgdXNlciBjYW4ndCBjaGFuZ2UgdGhlIHZhbHVlCisJCQl0aGlzLmlucHV0Tm9kZS5kaXNhYmxlZCA9IHRydWU7CisJCQlkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lci5zdXBlcmNsYXNzLmRpc2FibGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0KKyk7CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRlLnNlcmlhbGl6ZSIpOworCisKKworLyogSVNPIDg2MDEgRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqLworCitkb2pvLmRhdGUuc2V0SXNvODYwMSA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCwgLypTdHJpbmcqL2Zvcm1hdHRlZFN0cmluZyl7CisJLy8gc3VtbWFyeTogc2V0cyBhIERhdGUgb2JqZWN0IGJhc2VkIG9uIGFuIElTTyA4NjAxIGZvcm1hdHRlZCBzdHJpbmcgKHVzZXMgZGF0ZSBhbmQgdGltZSkKKwl2YXIgY29tcHMgPSAoZm9ybWF0dGVkU3RyaW5nLmluZGV4T2YoIlQiKSA9PSAtMSkgPyBmb3JtYXR0ZWRTdHJpbmcuc3BsaXQoIiAiKSA6IGZvcm1hdHRlZFN0cmluZy5zcGxpdCgiVCIpOworCWRhdGVPYmplY3QgPSBkb2pvLmRhdGUuc2V0SXNvODYwMURhdGUoZGF0ZU9iamVjdCwgY29tcHNbMF0pOworCWlmKGNvbXBzLmxlbmd0aCA9PSAyKXsgZGF0ZU9iamVjdCA9IGRvam8uZGF0ZS5zZXRJc284NjAxVGltZShkYXRlT2JqZWN0LCBjb21wc1sxXSk7IH0KKwlyZXR1cm4gZGF0ZU9iamVjdDsgLyogRGF0ZSBvciBudWxsICovCit9OworCitkb2pvLmRhdGUuZnJvbUlzbzg2MDEgPSBmdW5jdGlvbigvKlN0cmluZyovZm9ybWF0dGVkU3RyaW5nKXsKKwkvLyBzdW1tYXJ5OiByZXR1cm5zIGEgRGF0ZSBvYmplY3QgYmFzZWQgb24gYW4gSVNPIDg2MDEgZm9ybWF0dGVkIHN0cmluZyAodXNlcyBkYXRlIGFuZCB0aW1lKQorCXJldHVybiBkb2pvLmRhdGUuc2V0SXNvODYwMShuZXcgRGF0ZSgwLCAwKSwgZm9ybWF0dGVkU3RyaW5nKTsKK307CisKK2Rvam8uZGF0ZS5zZXRJc284NjAxRGF0ZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9kYXRlT2JqZWN0LCAvKlN0cmluZyovZm9ybWF0dGVkU3RyaW5nKXsKKwkvLyBzdW1tYXJ5OiBzZXRzIGEgRGF0ZSBvYmplY3QgYmFzZWQgb24gYW4gSVNPIDg2MDEgZm9ybWF0dGVkIHN0cmluZyAoZGF0ZSBvbmx5KQorCXZhciByZWdleHAgPSAiXihbMC05XXs0fSkoKC0/KFswLTldezJ9KSgtPyhbMC05XXsyfSkpPyl8IiArCisJCQkiKC0/KFswLTldezN9KSl8KC0/VyhbMC05XXsyfSkoLT8oWzEtN10pKT8pKT8kIjsKKwl2YXIgZCA9IGZvcm1hdHRlZFN0cmluZy5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4cCkpOworCWlmKCFkKXsKKwkJZG9qby5kZWJ1ZygiaW52YWxpZCBkYXRlIHN0cmluZzogIiArIGZvcm1hdHRlZFN0cmluZyk7CisJCXJldHVybiBudWxsOyAvLyBudWxsCisJfQorCXZhciB5ZWFyID0gZFsxXTsKKwl2YXIgbW9udGggPSBkWzRdOworCXZhciBkYXRlID0gZFs2XTsKKwl2YXIgZGF5b2Z5ZWFyID0gZFs4XTsKKwl2YXIgd2VlayA9IGRbMTBdOworCXZhciBkYXlvZndlZWsgPSBkWzEyXSA/IGRbMTJdIDogMTsKKworCWRhdGVPYmplY3Quc2V0RnVsbFllYXIoeWVhcik7CisKKwlpZihkYXlvZnllYXIpeworCQlkYXRlT2JqZWN0LnNldE1vbnRoKDApOworCQlkYXRlT2JqZWN0LnNldERhdGUoTnVtYmVyKGRheW9meWVhcikpOworCX0KKwllbHNlIGlmKHdlZWspeworCQlkYXRlT2JqZWN0LnNldE1vbnRoKDApOworCQlkYXRlT2JqZWN0LnNldERhdGUoMSk7CisJCXZhciBnZCA9IGRhdGVPYmplY3QuZ2V0RGF5KCk7CisJCXZhciBkYXkgPSAgZ2QgPyBnZCA6IDc7CisJCXZhciBvZmZzZXQgPSBOdW1iZXIoZGF5b2Z3ZWVrKSArICg3ICogTnVtYmVyKHdlZWspKTsKKwkJCisJCWlmKGRheSA8PSA0KXsgZGF0ZU9iamVjdC5zZXREYXRlKG9mZnNldCArIDEgLSBkYXkpOyB9CisJCWVsc2V7IGRhdGVPYmplY3Quc2V0RGF0ZShvZmZzZXQgKyA4IC0gZGF5KTsgfQorCX0gZWxzZXsKKwkJaWYobW9udGgpeworCQkJZGF0ZU9iamVjdC5zZXREYXRlKDEpOworCQkJZGF0ZU9iamVjdC5zZXRNb250aChtb250aCAtIDEpOyAKKwkJfQorCQlpZihkYXRlKXsgZGF0ZU9iamVjdC5zZXREYXRlKGRhdGUpOyB9CisJfQorCQorCXJldHVybiBkYXRlT2JqZWN0OyAvLyBEYXRlCit9OworCitkb2pvLmRhdGUuZnJvbUlzbzg2MDFEYXRlID0gZnVuY3Rpb24oLypTdHJpbmcqL2Zvcm1hdHRlZFN0cmluZyl7CisJLy8gc3VtbWFyeTogcmV0dXJucyBhIERhdGUgb2JqZWN0IGJhc2VkIG9uIGFuIElTTyA4NjAxIGZvcm1hdHRlZCBzdHJpbmcgKGRhdGUgb25seSkKKwlyZXR1cm4gZG9qby5kYXRlLnNldElzbzg2MDFEYXRlKG5ldyBEYXRlKDAsIDApLCBmb3JtYXR0ZWRTdHJpbmcpOworfTsKKworZG9qby5kYXRlLnNldElzbzg2MDFUaW1lID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKlN0cmluZyovZm9ybWF0dGVkU3RyaW5nKXsKKwkvLyBzdW1tYXJ5OiBzZXRzIGEgRGF0ZSBvYmplY3QgYmFzZWQgb24gYW4gSVNPIDg2MDEgZm9ybWF0dGVkIHN0cmluZyAodGltZSBvbmx5KQorCisJLy8gZmlyc3Qgc3RyaXAgdGltZXpvbmUgaW5mbyBmcm9tIHRoZSBlbmQKKwl2YXIgdGltZXpvbmUgPSAiWnwoKFstK10pKFswLTldezJ9KSg6PyhbMC05XXsyfSkpPykkIjsKKwl2YXIgZCA9IGZvcm1hdHRlZFN0cmluZy5tYXRjaChuZXcgUmVnRXhwKHRpbWV6b25lKSk7CisKKwl2YXIgb2Zmc2V0ID0gMDsgLy8gbG9jYWwgdGltZSBpZiBubyB0eiBpbmZvCisJaWYoZCl7CisJCWlmKGRbMF0gIT0gJ1onKXsKKwkJCW9mZnNldCA9IChOdW1iZXIoZFszXSkgKiA2MCkgKyBOdW1iZXIoZFs1XSk7CisJCQlvZmZzZXQgKj0gKChkWzJdID09ICctJykgPyAxIDogLTEpOworCQl9CisJCW9mZnNldCAtPSBkYXRlT2JqZWN0LmdldFRpbWV6b25lT2Zmc2V0KCk7CisJCWZvcm1hdHRlZFN0cmluZyA9IGZvcm1hdHRlZFN0cmluZy5zdWJzdHIoMCwgZm9ybWF0dGVkU3RyaW5nLmxlbmd0aCAtIGRbMF0ubGVuZ3RoKTsKKwl9CisKKwkvLyB0aGVuIHdvcmsgb3V0IHRoZSB0aW1lCisJdmFyIHJlZ2V4cCA9ICJeKFswLTldezJ9KSg6PyhbMC05XXsyfSkoOj8oWzAtOV17Mn0pKFwuKFswLTldKykpPyk/KT8kIjsKKwlkID0gZm9ybWF0dGVkU3RyaW5nLm1hdGNoKG5ldyBSZWdFeHAocmVnZXhwKSk7CisJaWYoIWQpeworCQlkb2pvLmRlYnVnKCJpbnZhbGlkIHRpbWUgc3RyaW5nOiAiICsgZm9ybWF0dGVkU3RyaW5nKTsKKwkJcmV0dXJuIG51bGw7IC8vIG51bGwKKwl9CisJdmFyIGhvdXJzID0gZFsxXTsKKwl2YXIgbWlucyA9IE51bWJlcigoZFszXSkgPyBkWzNdIDogMCk7CisJdmFyIHNlY3MgPSAoZFs1XSkgPyBkWzVdIDogMDsKKwl2YXIgbXMgPSBkWzddID8gKE51bWJlcigiMC4iICsgZFs3XSkgKiAxMDAwKSA6IDA7CisKKwlkYXRlT2JqZWN0LnNldEhvdXJzKGhvdXJzKTsKKwlkYXRlT2JqZWN0LnNldE1pbnV0ZXMobWlucyk7CisJZGF0ZU9iamVjdC5zZXRTZWNvbmRzKHNlY3MpOworCWRhdGVPYmplY3Quc2V0TWlsbGlzZWNvbmRzKG1zKTsKKworCWlmKG9mZnNldCAhPT0gMCl7CisJCWRhdGVPYmplY3Quc2V0VGltZShkYXRlT2JqZWN0LmdldFRpbWUoKSArIG9mZnNldCAqIDYwMDAwKTsKKwl9CQorCXJldHVybiBkYXRlT2JqZWN0OyAvLyBEYXRlCit9OworCitkb2pvLmRhdGUuZnJvbUlzbzg2MDFUaW1lID0gZnVuY3Rpb24oLypTdHJpbmcqL2Zvcm1hdHRlZFN0cmluZyl7CisJLy8gc3VtbWFyeTogcmV0dXJucyBhIERhdGUgb2JqZWN0IGJhc2VkIG9uIGFuIElTTyA4NjAxIGZvcm1hdHRlZCBzdHJpbmcgKGRhdGUgb25seSkKKwlyZXR1cm4gZG9qby5kYXRlLnNldElzbzg2MDFUaW1lKG5ldyBEYXRlKDAsIDApLCBmb3JtYXR0ZWRTdHJpbmcpOworfTsKKworCisvKiBSRkMtMzMzOSBEYXRlIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Rvam8uZGF0ZS50b1JmYzMzMzkgPSBmdW5jdGlvbigvKkRhdGU/Ki9kYXRlT2JqZWN0LCAvKlN0cmluZz8qL3NlbGVjdG9yKXsKKy8vCXN1bW1hcnk6CisvLwkJRm9ybWF0IGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdCBhcyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDIDMzMzkKKy8vCisvLwlkYXRlT2JqZWN0OgorLy8JCUEgSmF2YVNjcmlwdCBkYXRlLCBvciB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLCBieSBkZWZhdWx0CisvLworLy8Jc2VsZWN0b3I6CisvLwkJImRhdGVPbmx5IiBvciAidGltZU9ubHkiIHRvIGZvcm1hdCBzZWxlY3RlZCBwb3J0aW9ucyBvZiB0aGUgRGF0ZSBvYmplY3QuCisvLwkJRGF0ZSBhbmQgdGltZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBkZWZhdWx0LgorCisvL0ZJWE1FOiB0b2xlcmF0ZSBOdW1iZXIsIHN0cmluZyBpbnB1dD8KKwlpZighZGF0ZU9iamVjdCl7CisJCWRhdGVPYmplY3QgPSBuZXcgRGF0ZSgpOworCX0KKworCXZhciBfID0gZG9qby5zdHJpbmcucGFkOworCXZhciBmb3JtYXR0ZWREYXRlID0gW107CisJaWYoc2VsZWN0b3IgIT0gInRpbWVPbmx5Iil7CisJCXZhciBkYXRlID0gW18oZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpLDQpLCBfKGRhdGVPYmplY3QuZ2V0TW9udGgoKSsxLDIpLCBfKGRhdGVPYmplY3QuZ2V0RGF0ZSgpLDIpXS5qb2luKCctJyk7CisJCWZvcm1hdHRlZERhdGUucHVzaChkYXRlKTsKKwl9CisJaWYoc2VsZWN0b3IgIT0gImRhdGVPbmx5Iil7CisJCXZhciB0aW1lID0gW18oZGF0ZU9iamVjdC5nZXRIb3VycygpLDIpLCBfKGRhdGVPYmplY3QuZ2V0TWludXRlcygpLDIpLCBfKGRhdGVPYmplY3QuZ2V0U2Vjb25kcygpLDIpXS5qb2luKCc6Jyk7CisJCXZhciB0aW1lem9uZU9mZnNldCA9IGRhdGVPYmplY3QuZ2V0VGltZXpvbmVPZmZzZXQoKTsKKwkJdGltZSArPSAodGltZXpvbmVPZmZzZXQgPiAwID8gIi0iIDogIisiKSArIAorCQkJCQlfKE1hdGguZmxvb3IoTWF0aC5hYnModGltZXpvbmVPZmZzZXQpLzYwKSwyKSArICI6IiArCisJCQkJCV8oTWF0aC5hYnModGltZXpvbmVPZmZzZXQpJTYwLDIpOworCQlmb3JtYXR0ZWREYXRlLnB1c2godGltZSk7CisJfQorCXJldHVybiBmb3JtYXR0ZWREYXRlLmpvaW4oJ1QnKTsgLy8gU3RyaW5nCit9OworCitkb2pvLmRhdGUuZnJvbVJmYzMzMzkgPSBmdW5jdGlvbigvKlN0cmluZyovcmZjRGF0ZSl7CisvLwlzdW1tYXJ5OgorLy8JCUNyZWF0ZSBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3QgZnJvbSBhIHN0cmluZyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIFJGQyAzMzM5CisvLworLy8JcmZjRGF0ZToKKy8vCQlBIHN0cmluZyBzdWNoIGFzIDIwMDUtMDYtMzBUMDg6MDU6MDAtMDc6MDAKKy8vCQkiYW55IiBpcyBhbHNvIHN1cHBvcnRlZCBpbiBwbGFjZSBvZiBhIHRpbWUuCisKKwkvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBzdXBwb3J0IGZvciB1c2Ugb2YgImFueSIgaW5zdGVhZCBvZiBqdXN0IG5vdCAKKwkvLyBpbmNsdWRpbmcgdGhlIHRpbWUKKwlpZihyZmNEYXRlLmluZGV4T2YoIlRhbnkiKSE9LTEpeworCQlyZmNEYXRlID0gcmZjRGF0ZS5yZXBsYWNlKCJUYW55IiwiIik7CisJfQorCXZhciBkYXRlT2JqZWN0ID0gbmV3IERhdGUoKTsKKwlyZXR1cm4gZG9qby5kYXRlLnNldElzbzg2MDEoZGF0ZU9iamVjdCwgcmZjRGF0ZSk7IC8vIERhdGUgb3IgbnVsbAorfTsKKworZG9qby5wcm92aWRlKCJkb2pvLmRhdGUuY29tbW9uIik7CisKKworLyogU3VwcGxlbWVudGFyeSBEYXRlIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Rvam8uZGF0ZS5zZXREYXlPZlllYXIgPSBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmplY3QsIC8qTnVtYmVyKi9kYXlPZlllYXIpeworCS8vIHN1bW1hcnk6IHNldHMgZGF0ZU9iamVjdCBhY2NvcmRpbmcgdG8gZGF5IG9mIHRoZSB5ZWFyICgxLi4zNjYpCisJZGF0ZU9iamVjdC5zZXRNb250aCgwKTsKKwlkYXRlT2JqZWN0LnNldERhdGUoZGF5T2ZZZWFyKTsKKwlyZXR1cm4gZGF0ZU9iamVjdDsgLy8gRGF0ZQorfQorCitkb2pvLmRhdGUuZ2V0RGF5T2ZZZWFyID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0KXsKKwkvLyBzdW1tYXJ5OiBnZXRzIHRoZSBkYXkgb2YgdGhlIHllYXIgYXMgcmVwcmVzZW50ZWQgYnkgZGF0ZU9iamVjdAorCXZhciBmdWxsWWVhciA9IGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKTsKKwl2YXIgbGFzdERheU9mUHJldlllYXIgPSBuZXcgRGF0ZShmdWxsWWVhci0xLCAxMSwgMzEpOworCXJldHVybiBNYXRoLmZsb29yKChkYXRlT2JqZWN0LmdldFRpbWUoKSAtCisJCWxhc3REYXlPZlByZXZZZWFyLmdldFRpbWUoKSkgLyA4NjQwMDAwMCk7IC8vIE51bWJlcgorfQorCisKK2Rvam8uZGF0ZS5zZXRXZWVrT2ZZZWFyID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKk51bWJlciovd2VlaywgLypOdW1iZXIqL2ZpcnN0RGF5KXsKKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDEpeyBmaXJzdERheSA9IDA7IH0gLy8gU3VuZGF5CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUuc2V0V2Vla09mWWVhciIpOworfQorCitkb2pvLmRhdGUuZ2V0V2Vla09mWWVhciA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCwgLypOdW1iZXIqL2ZpcnN0RGF5KXsKKwlpZihhcmd1bWVudHMubGVuZ3RoID09IDEpeyBmaXJzdERheSA9IDA7IH0gLy8gU3VuZGF5CisKKwkvLyB3b3JrIG91dCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlZWsKKwl2YXIgZmlyc3REYXlPZlllYXIgPSBuZXcgRGF0ZShkYXRlT2JqZWN0LmdldEZ1bGxZZWFyKCksIDAsIDEpOworCXZhciBkYXkgPSBmaXJzdERheU9mWWVhci5nZXREYXkoKTsKKwlmaXJzdERheU9mWWVhci5zZXREYXRlKGZpcnN0RGF5T2ZZZWFyLmdldERhdGUoKSAtCisJCQlkYXkgKyBmaXJzdERheSAtIChkYXkgPiBmaXJzdERheSA/IDcgOiAwKSk7CisKKwlyZXR1cm4gTWF0aC5mbG9vcigoZGF0ZU9iamVjdC5nZXRUaW1lKCkgLQorCQlmaXJzdERheU9mWWVhci5nZXRUaW1lKCkpIC8gNjA0ODAwMDAwKTsKK30KKworZG9qby5kYXRlLnNldElzb1dlZWtPZlllYXIgPSBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmplY3QsIC8qTnVtYmVyKi93ZWVrLCAvKk51bWJlciovZmlyc3REYXkpeworCS8vIHN1bW1hcnk6IHVuaW1wbGVtZW50ZWQKKwlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7IGZpcnN0RGF5ID0gMTsgfSAvLyBNb25kYXkKKwlkb2pvLnVuaW1wbGVtZW50ZWQoImRvam8uZGF0ZS5zZXRJc29XZWVrT2ZZZWFyIik7Cit9CisKK2Rvam8uZGF0ZS5nZXRJc29XZWVrT2ZZZWFyID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKk51bWJlciovZmlyc3REYXkpIHsKKwkvLyBzdW1tYXJ5OiB1bmltcGxlbWVudGVkCisJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeyBmaXJzdERheSA9IDE7IH0gLy8gTW9uZGF5CisJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUuZ2V0SXNvV2Vla09mWWVhciIpOworfQorCisKKy8qIEluZm9ybWF0aW9uYWwgRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vREVQUkVDQVRFRDogVGhlc2UgdGltZXpvbmUgYXJyYXlzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiAwLjUKK2Rvam8uZGF0ZS5zaG9ydFRpbWV6b25lcyA9IFsiSURMVyIsICJCRVQiLCAiSFNUIiwgIk1BUlQiLCAiQUtTVCIsICJQU1QiLCAiTVNUIiwKKwkiQ1NUIiwgIkVTVCIsICJBU1QiLCAiTkZUIiwgIkJTVCIsICJGU1QiLCAiQVQiLCAiR01UIiwgIkNFVCIsICJFRVQiLCAiTVNLIiwKKwkiSVJUIiwgIkdTVCIsICJBRlQiLCAiQUdUVCIsICJJU1QiLCAiTlBUIiwgIkFMTVQiLCAiTU1UIiwgIkpUIiwgIkFXU1QiLAorCSJKU1QiLCAiQUNTVCIsICJBRVNUIiwgIkxIU1QiLCAiVlVUIiwgIk5GVCIsICJOWlQiLCAiQ0hBU1QiLCAiUEhPVCIsCisJIkxJTlQiXTsKK2Rvam8uZGF0ZS50aW1lem9uZU9mZnNldHMgPSBbLTcyMCwgLTY2MCwgLTYwMCwgLTU3MCwgLTU0MCwgLTQ4MCwgLTQyMCwgLTM2MCwKKwktMzAwLCAtMjQwLCAtMjEwLCAtMTgwLCAtMTIwLCAtNjAsIDAsIDYwLCAxMjAsIDE4MCwgMjEwLCAyNDAsIDI3MCwgMzAwLAorCTMzMCwgMzQ1LCAzNjAsIDM5MCwgNDIwLCA0ODAsIDU0MCwgNTcwLCA2MDAsIDYzMCwgNjYwLCA2OTAsIDcyMCwgNzY1LCA3ODAsCisJODQwXTsKKy8qCitkb2pvLmRhdGUudGltZXpvbmVzID0gWyJJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBXZXN0IiwgIkJlcmluZyBTdGFuZGFyZCBUaW1lIiwKKwkiSGF3YWlpYW4gU3RhbmRhcmQgVGltZSIsICJNYXJxdWVzYXMgVGltZSIsICJBbGFza2EgU3RhbmRhcmQgVGltZSIsCisJIlBhY2lmaWMgU3RhbmRhcmQgVGltZSAoVVNBKSIsICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwKKwkiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIChVU0EpIiwgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoVVNBKSIsCisJIkF0bGFudGljIFN0YW5kYXJkIFRpbWUiLCAiTmV3Zm91bmRsYW5kIFRpbWUiLCAiQnJhemlsIFN0YW5kYXJkIFRpbWUiLAorCSJGZXJuYW5kbyBkZSBOb3JvbmhhIFN0YW5kYXJkIFRpbWUgKEJyYXppbCkiLCAiQXpvcmVzIFRpbWUiLAorCSJHcmVlbndpY2ggTWVhbiBUaW1lIiwgIkNlbnRyYWwgRXVyb3BlIFRpbWUiLCAiRWFzdGVybiBFdXJvcGUgVGltZSIsCisJIk1vc2NvdyBUaW1lIiwgIklyYW4gU3RhbmRhcmQgVGltZSIsICJHdWxmIFN0YW5kYXJkIFRpbWUiLAorCSJBZmdoYW5pc3RhbiBUaW1lIiwgIkFxdG9iZSBUaW1lIiwgIkluZGlhbiBTdGFuZGFyZCBUaW1lIiwgIk5lcGFsIFRpbWUiLAorCSJBbG1hdHkgVGltZSIsICJNeWFubWFyIFRpbWUiLCAiSmF2YSBUaW1lIiwKKwkiQXVzdHJhbGlhbiBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAiSmFwYW4gU3RhbmRhcmQgVGltZSIsCisJIkF1c3RyYWxpYW4gQ2VudHJhbCBTdGFuZGFyZCBUaW1lIiwgIkxvcmQgSG92ZSBTdGFuZGFyZCBUaW1lIChBdXN0cmFsaWEpIiwKKwkiVmFudWF0YSBUaW1lIiwgIk5vcmZvbGsgVGltZSAoQXVzdHJhbGlhKSIsICJOZXcgWmVhbGFuZCBTdGFuZGFyZCBUaW1lIiwKKwkiQ2hhdGhhbSBTdGFuZGFyZCBUaW1lIChOZXcgWmVhbGFuZCkiLCAiUGhvZW5peCBJc2xhbmRzIFRpbWUgKEtyaWJhdGkpIiwKKwkiTGluZSBJc2xhbmRzIFRpbWUgKEtyaWJhdGkpIl07CisqLworCitkb2pvLmRhdGUuZ2V0RGF5c0luTW9udGggPSBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmplY3QpeworCS8vIHN1bW1hcnk6IHJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCB1c2VkIGJ5IGRhdGVPYmplY3QKKwl2YXIgbW9udGggPSBkYXRlT2JqZWN0LmdldE1vbnRoKCk7CisJdmFyIGRheXMgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CisJaWYgKG1vbnRoID09IDEgJiYgZG9qby5kYXRlLmlzTGVhcFllYXIoZGF0ZU9iamVjdCkpIHsgcmV0dXJuIDI5OyB9IC8vIE51bWJlcgorCWVsc2UgeyByZXR1cm4gZGF5c1ttb250aF07IH0gLy8gTnVtYmVyCit9CisKK2Rvam8uZGF0ZS5pc0xlYXBZZWFyID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0KXsKKy8vIHN1bW1hcnk6CisvLwlEZXRlcm1pbmVzIGlmIHRoZSB5ZWFyIG9mIHRoZSBkYXRlT2JqZWN0IGlzIGEgbGVhcCB5ZWFyCisvLworLy8gZGVzY3JpcHRpb246CisvLwlMZWFwIHllYXJzIGFyZSB5ZWFycyB3aXRoIGFuIGFkZGl0aW9uYWwgZGF5IFlZWVktMDItMjksIHdoZXJlIHRoZSB5ZWFyCisvLwludW1iZXIgaXMgYSBtdWx0aXBsZSBvZiBmb3VyIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246IElmIGEgeWVhcgorLy8JaXMgYSBtdWx0aXBsZSBvZiAxMDAsIHRoZW4gaXQgaXMgb25seSBhIGxlYXAgeWVhciBpZiBpdCBpcyBhbHNvIGEKKy8vCW11bHRpcGxlIG9mIDQwMC4gRm9yIGV4YW1wbGUsIDE5MDAgd2FzIG5vdCBhIGxlYXAgeWVhciwgYnV0IDIwMDAgaXMgb25lLgorCisJdmFyIHllYXIgPSBkYXRlT2JqZWN0LmdldEZ1bGxZZWFyKCk7CisJcmV0dXJuICh5ZWFyJTQwMCA9PSAwKSA/IHRydWUgOiAoeWVhciUxMDAgPT0gMCkgPyBmYWxzZSA6ICh5ZWFyJTQgPT0gMCkgPyB0cnVlIDogZmFsc2U7IC8vIEJvb2xlYW4KK30KKworLy8gRklYTUU6IFRoaXMgaXMgbm90IGxvY2FsaXplZAorZG9qby5kYXRlLmdldFRpbWV6b25lTmFtZSA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCl7CisvLyBzdW1tYXJ5OgorLy8JR2V0IHRoZSB1c2VyJ3MgdGltZSB6b25lIGFzIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyCisvLworLy8gZGF0ZU9iamVjdDogbmVlZGVkIGJlY2F1c2UgdGhlIHRpbWV6b25lIG1heSB2YXJ5IHdpdGggdGltZSAoZGF5bGlnaHQgc2F2aW5ncykKKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCVRyeSB0byBnZXQgdGltZSB6b25lIGluZm8gZnJvbSB0b1N0cmluZyBvciB0b0xvY2FsZVN0cmluZworLy8JbWV0aG9kIG9mIHRoZSBEYXRlIG9iamVjdCAtLSBVVEMgb2Zmc2V0IGlzIG5vdCBhIHRpbWUgem9uZS4KKy8vCVNlZSBodHRwOi8vd3d3LnR3aW5zdW4uY29tL3R6L3R6LWxpbmsuaHRtCisvLwlOb3RlOiByZXN1bHRzIG1heSBiZSBpbmNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzLgorCisJdmFyIHN0ciA9IGRhdGVPYmplY3QudG9TdHJpbmcoKTsgLy8gU3RhcnQgbG9va2luZyBpbiB0b1N0cmluZworCXZhciB0eiA9ICcnOyAvLyBUaGUgcmVzdWx0IC0tIHJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyBmb3VuZAorCXZhciBtYXRjaDsKKworCS8vIEZpcnN0IGxvb2sgZm9yIHNvbWV0aGluZyBpbiBwYXJlbnRoZXNlcyAtLSBmYXN0IGxvb2t1cCwgbm8gcmVnZXgKKwl2YXIgcG9zID0gc3RyLmluZGV4T2YoJygnKTsKKwlpZiAocG9zID4gLTEpIHsKKwkJcG9zKys7CisJCXR6ID0gc3RyLnN1YnN0cmluZyhwb3MsIHN0ci5pbmRleE9mKCcpJykpOworCX0KKwkvLyBJZiBhdCBmaXJzdCB5b3UgZG9uJ3Qgc3VjY2VlZCAuLi4KKwllbHNleworCQkvLyBJZiBJRSBrbm93cyBhYm91dCB0aGUgVFosIGl0IGFwcGVhcnMgYmVmb3JlIHRoZSB5ZWFyCisJCS8vIENhcGl0YWwgbGV0dGVycyBvciBzbGFzaCBiZWZvcmUgYSA0LWRpZ2l0IHllYXIgCisJCS8vIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCisJCXZhciBwYXQgPSAvKFtBLVpcL10rKSBcZHs0fSQvOworCQlpZigobWF0Y2ggPSBzdHIubWF0Y2gocGF0KSkpIHsKKwkJCXR6ID0gbWF0Y2hbMV07CisJCX0KKwkJLy8gU29tZSBicm93c2VycyAoZS5nLiBTYWZhcmkpIGdsdWUgdGhlIFRaIG9uIHRoZSBlbmQKKwkJLy8gb2YgdG9Mb2NhbGVTdHJpbmcgaW5zdGVhZCBvZiBwdXR0aW5nIGl0IGluIHRvU3RyaW5nCisJCWVsc2V7CisJCQlzdHIgPSBkYXRlT2JqZWN0LnRvTG9jYWxlU3RyaW5nKCk7CisJCQkvLyBDYXBpdGFsIGxldHRlcnMgb3Igc2xhc2ggLS0gZW5kIG9mIHN0cmluZywgCisJCQkvLyBhZnRlciBzcGFjZQorCQkJcGF0ID0gLyAoW0EtWlwvXSspJC87CisJCQlpZigobWF0Y2ggPSBzdHIubWF0Y2gocGF0KSkpIHsKKwkJCQl0eiA9IG1hdGNoWzFdOworCQkJfQorCQl9CisJfQorCisJLy8gTWFrZSBzdXJlIGl0IGRvZXNuJ3Qgc29tZWhvdyBlbmQgdXAgcmV0dXJuIEFNIG9yIFBNCisJcmV0dXJuIHR6ID09ICdBTScgfHwgdHogPT0gJ1BNJyA/ICcnIDogdHo7IC8vU3RyaW5nCit9CisKKworLy9GSVhNRTogbm90IGxvY2FsaXplZAorZG9qby5kYXRlLmdldE9yZGluYWwgPSBmdW5jdGlvbihkYXRlT2JqZWN0KXsKKwkvLyBzdW1tYXJ5OiByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdWZmaXggKEVuZ2xpc2ggb25seSkgZm9yIHRoZSBkYXkgb2YgdGhlIG1vbnRoLCBlLmcuICdzdCcgZm9yIDEsICduZCcgZm9yIDIsIGV0Yy4pCisJdmFyIGRhdGUgPSBkYXRlT2JqZWN0LmdldERhdGUoKTsKKworCWlmKGRhdGUlMTAwICE9IDExICYmIGRhdGUlMTAgPT0gMSl7IHJldHVybiAic3QiOyB9IC8vIFN0cmluZworCWVsc2UgaWYoZGF0ZSUxMDAgIT0gMTIgJiYgZGF0ZSUxMCA9PSAyKXsgcmV0dXJuICJuZCI7IH0gLy8gU3RyaW5nCisJZWxzZSBpZihkYXRlJTEwMCAhPSAxMyAmJiBkYXRlJTEwID09IDMpeyByZXR1cm4gInJkIjsgfSAvLyBTdHJpbmcKKwllbHNleyByZXR1cm4gInRoIjsgfSAvLyBTdHJpbmcKK30KKworCisvKiBjb21wYXJlIGFuZCBhZGQKKyAqKioqKioqKioqKioqKioqKiovCitkb2pvLmRhdGUuY29tcGFyZVR5cGVzPXsKKwkvLyAJc3VtbWFyeQorCS8vCWJpdG1hc2sgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucy4KKwlEQVRFOjEsIFRJTUU6MiAKK307Citkb2pvLmRhdGUuY29tcGFyZT1mdW5jdGlvbigvKiBEYXRlICovIGRhdGVBLCAvKiBEYXRlICovIGRhdGVCLCAvKiBkb2pvLmRhdGUuY29tcGFyZVR5cGVzICovIG9wdGlvbnMpeworCS8vCXN1bW1hcnkKKwkvLwlDb21wYXJlIHR3byBkYXRlIG9iamVjdHMgYnkgZGF0ZSwgdGltZSwgb3IgYm90aC4gIFJldHVybnMgMCBpZiBlcXVhbCwgcG9zaXRpdmUgaWYgYSA+IGIsIGVsc2UgbmVnYXRpdmUuCisJdmFyIGRBPWRhdGVBOworCXZhciBkQj1kYXRlQnx8bmV3IERhdGUoKTsKKwl2YXIgbm93PW5ldyBEYXRlKCk7CisJLy9GSVhNRTogc2hvcnRlbiB0aGlzIGNvZGUKKwl3aXRoKGRvam8uZGF0ZS5jb21wYXJlVHlwZXMpeworCQl2YXIgb3B0PW9wdGlvbnN8fChEQVRFfFRJTUUpOworCQl2YXIgZDE9bmV3IERhdGUoCisJCQkob3B0JkRBVEUpP2RBLmdldEZ1bGxZZWFyKCk6bm93LmdldEZ1bGxZZWFyKCksIAorCQkJKG9wdCZEQVRFKT9kQS5nZXRNb250aCgpOm5vdy5nZXRNb250aCgpLAorCQkJKG9wdCZEQVRFKT9kQS5nZXREYXRlKCk6bm93LmdldERhdGUoKSwKKwkJCShvcHQmVElNRSk/ZEEuZ2V0SG91cnMoKTowLAorCQkJKG9wdCZUSU1FKT9kQS5nZXRNaW51dGVzKCk6MCwKKwkJCShvcHQmVElNRSk/ZEEuZ2V0U2Vjb25kcygpOjAKKwkJKTsKKwkJdmFyIGQyPW5ldyBEYXRlKAorCQkJKG9wdCZEQVRFKT9kQi5nZXRGdWxsWWVhcigpOm5vdy5nZXRGdWxsWWVhcigpLAorCQkJKG9wdCZEQVRFKT9kQi5nZXRNb250aCgpOm5vdy5nZXRNb250aCgpLAorCQkJKG9wdCZEQVRFKT9kQi5nZXREYXRlKCk6bm93LmdldERhdGUoKSwKKwkJCShvcHQmVElNRSk/ZEIuZ2V0SG91cnMoKTowLAorCQkJKG9wdCZUSU1FKT9kQi5nZXRNaW51dGVzKCk6MCwKKwkJCShvcHQmVElNRSk/ZEIuZ2V0U2Vjb25kcygpOjAKKwkJKTsKKwl9CisJaWYoZDEudmFsdWVPZigpPmQyLnZhbHVlT2YoKSl7CisJCXJldHVybiAxOwkvLwlpbnQKKwl9CisJaWYoZDEudmFsdWVPZigpPGQyLnZhbHVlT2YoKSl7CisJCXJldHVybiAtMTsJLy8JaW50CisJfQorCXJldHVybiAwOwkvLwlpbnQKK30KKworZG9qby5kYXRlLmRhdGVQYXJ0cz17IAorCS8vCXN1bW1hcnkKKwkvLwljb25zdGFudHMgZm9yIHVzZSBpbiBkb2pvLmRhdGUuYWRkCisJWUVBUjowLCBNT05USDoxLCBEQVk6MiwgSE9VUjozLCBNSU5VVEU6NCwgU0VDT05EOjUsIE1JTExJU0VDT05EOjYsIFFVQVJURVI6NywgV0VFSzo4LCBXRUVLREFZOjkKK307CisKK2Rvam8uZGF0ZS5hZGQgPSBmdW5jdGlvbigvKiBEYXRlICovIGR0LCAvKiBkb2pvLmRhdGUuZGF0ZVBhcnRzICovIGludGVydiwgLyogaW50ICovIGluY3IpeworLy8Jc3VtbWFyeToKKy8vCQlBZGQgdG8gYSBEYXRlIGluIGludGVydmFscyBvZiBkaWZmZXJlbnQgc2l6ZSwgZnJvbSBtaWxsaXNlY29uZHMgdG8geWVhcnMKKy8vCisvLwlkdDoKKy8vCQlBIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QgdG8gc3RhcnQgd2l0aAorLy8KKy8vCWludGVydjoKKy8vCQlBIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgaW50ZXJ2YWwsIGUuZy4gWUVBUiwgTU9OVEgsIERBWS4gIFNlZSBkb2pvLmRhdGUuZGF0ZVBhcnRzLgorLy8KKy8vCWluY3I6CisvLwkJSG93IG11Y2ggdG8gYWRkIHRvIHRoZSBkYXRlCisKKwlpZih0eXBlb2YgZHQgPT0gJ251bWJlcicpe2R0ID0gbmV3IERhdGUoZHQpO30gLy8gQWxsb3cgdGltZXN0YW1wcworLy9GSVhNRTogd2hhdCdzIHRoZSByZWFzb24gYmVoaW5kIHRoaXM/CWluY3IgPSBpbmNyIHx8IDE7CisKKwlmdW5jdGlvbiBmaXhPdmVyc2hvb3QoKXsKKwkJaWYgKHN1bS5nZXREYXRlKCkgPCBkdC5nZXREYXRlKCkpeworCQkJc3VtLnNldERhdGUoMCk7CisJCX0KKwl9CisJCisJdmFyIHN1bSA9IG5ldyBEYXRlKGR0KTsKKworCXdpdGgoZG9qby5kYXRlLmRhdGVQYXJ0cyl7CisJCXN3aXRjaChpbnRlcnYpeworCQkJY2FzZSBZRUFSOgorCQkJCXN1bS5zZXRGdWxsWWVhcihkdC5nZXRGdWxsWWVhcigpK2luY3IpOworCQkJCS8vIEtlZXAgaW5jcmVtZW50L2RlY3JlbWVudCBmcm9tIDIvMjkgb3V0IG9mIE1hcmNoCisJCQkJZml4T3ZlcnNob290KCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFFVQVJURVI6CisJCQkJLy8gTmFpdmUgcXVhcnRlciBpcyBqdXN0IHRocmVlIG1vbnRocworCQkJCWluY3IqPTM7CisJCQkJLy8gZmFsbHRocm91Z2guLi4KKwkJCWNhc2UgTU9OVEg6CisJCQkJc3VtLnNldE1vbnRoKGR0LmdldE1vbnRoKCkraW5jcik7CisJCQkJLy8gUmVzZXQgdG8gbGFzdCBkYXkgb2YgbW9udGggaWYgeW91IG92ZXJzaG9vdAorCQkJCWZpeE92ZXJzaG9vdCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBXRUVLOgorCQkJCWluY3IqPTc7CisJCQkJLy8gZmFsbHRocm91Z2guLi4KKwkJCWNhc2UgREFZOgorCQkJCXN1bS5zZXREYXRlKGR0LmdldERhdGUoKSArIGluY3IpOworCQkJCWJyZWFrOworCQkJY2FzZSBXRUVLREFZOgorCQkJCS8vRklYTUU6IGFzc3VtZXMgU2F0dXJkYXkvU3VuZGF5IHdlZWtlbmQsIGJ1dCBldmVuIHRoaXMgaXMgbm90IGZpeGVkLiAgVGhlcmUgYXJlIENMRFIgZW50cmllcyB0byBsb2NhbGl6ZSB0aGlzLgorCQkJCXZhciBkYXQgPSBkdC5nZXREYXRlKCk7CisJCQkJdmFyIHdlZWtzID0gMDsKKwkJCQl2YXIgZGF5cyA9IDA7CisJCQkJdmFyIHN0cnQgPSAwOworCQkJCXZhciB0cmd0ID0gMDsKKwkJCQl2YXIgYWRqID0gMDsKKwkJCQkvLyBEaXZpZGUgdGhlIGluY3JlbWVudCB0aW1lIHNwYW4gaW50byB3ZWVrc3BhbnMgcGx1cyBsZWZ0b3ZlciBkYXlzCisJCQkJLy8gZS5nLiwgOCBkYXlzIGlzIG9uZSA1LWRheSB3ZWVrc3BhbiAvIGFuZCB0d28gbGVmdG92ZXIgZGF5cworCQkJCS8vIENhbid0IGhhdmUgemVybyBsZWZ0b3ZlciBkYXlzLCBzbyBudW1iZXJzIGRpdmlzaWJsZSBieSA1IGdldAorCQkJCS8vIGEgZGF5cyB2YWx1ZSBvZiA1LCBhbmQgdGhlIHJlbWFpbmluZyBkYXlzIG1ha2UgdXAgdGhlIG51bWJlciBvZiB3ZWVrcworCQkJCXZhciBtb2QgPSBpbmNyICUgNTsKKwkJCQlpZiAobW9kID09IDApIHsKKwkJCQkJZGF5cyA9IChpbmNyID4gMCkgPyA1IDogLTU7CisJCQkJCXdlZWtzID0gKGluY3IgPiAwKSA/ICgoaW5jci01KS81KSA6ICgoaW5jcis1KS81KTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWRheXMgPSBtb2Q7CisJCQkJCXdlZWtzID0gcGFyc2VJbnQoaW5jci81KTsKKwkJCQl9CisJCQkJLy8gR2V0IHdlZWtkYXkgdmFsdWUgZm9yIG9yaWcgZGF0ZSBwYXJhbQorCQkJCXN0cnQgPSBkdC5nZXREYXkoKTsKKwkJCQkvLyBPcmlnIGRhdGUgaXMgU2F0IC8gcG9zaXRpdmUgaW5jcmVtZW50ZXIKKwkJCQkvLyBKdW1wIG92ZXIgU3VuCisJCQkJaWYgKHN0cnQgPT0gNiAmJiBpbmNyID4gMCkgeworCQkJCQlhZGogPSAxOworCQkJCX0KKwkJCQkvLyBPcmlnIGRhdGUgaXMgU3VuIC8gbmVnYXRpdmUgaW5jcmVtZW50ZXIKKwkJCQkvLyBKdW1wIGJhY2sgb3ZlciBTYXQKKwkJCQllbHNlIGlmIChzdHJ0ID09IDAgJiYgaW5jciA8IDApIHsKKwkJCQkJYWRqID0gLTE7CisJCQkJfQorCQkJCS8vIEdldCB3ZWVrZGF5IHZhbCBmb3IgdGhlIG5ldyBkYXRlCisJCQkJdHJndCA9IChzdHJ0ICsgZGF5cyk7CisJCQkJLy8gTmV3IGRhdGUgaXMgb24gU2F0IG9yIFN1bgorCQkJCWlmICh0cmd0ID09IDAgfHwgdHJndCA9PSA2KSB7CisJCQkJCWFkaiA9IChpbmNyID4gMCkgPyAyIDogLTI7CisJCQkJfQorCQkJCS8vIEluY3JlbWVudCBieSBudW1iZXIgb2Ygd2Vla3MgcGx1cyBsZWZ0b3ZlciBkYXlzIHBsdXMKKwkJCQkvLyB3ZWVrZW5kIGFkanVzdG1lbnRzCisJCQkJc3VtLnNldERhdGUoZGF0ICsgKDcqd2Vla3MpICsgZGF5cyArIGFkaik7CisJCQkJYnJlYWs7CisJCQljYXNlIEhPVVI6CisJCQkJc3VtLnNldEhvdXJzKHN1bS5nZXRIb3VycygpK2luY3IpOworCQkJCWJyZWFrOworCQkJY2FzZSBNSU5VVEU6CisJCQkJc3VtLnNldE1pbnV0ZXMoc3VtLmdldE1pbnV0ZXMoKStpbmNyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0VDT05EOgorCQkJCXN1bS5zZXRTZWNvbmRzKHN1bS5nZXRTZWNvbmRzKCkraW5jcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1JTExJU0VDT05EOgorCQkJCXN1bS5zZXRNaWxsaXNlY29uZHMoc3VtLmdldE1pbGxpc2Vjb25kcygpK2luY3IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBEbyBub3RoaW5nCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gc3VtOyAvLyBEYXRlCit9OworCitkb2pvLmRhdGUuZGlmZiA9IGZ1bmN0aW9uKC8qIERhdGUgKi8gZHRBLCAvKiBEYXRlICovIGR0QiwgLyogZG9qby5kYXRlLmRhdGVQYXJ0cyAqLyBpbnRlcnYpeworLy8Jc3VtbWFyeToKKy8vCQlHZXQgdGhlIGRpZmZlcmVuY2UgaW4gYSBzcGVjaWZpYyB1bml0IG9mIHRpbWUgKGUuZy4sIG51bWJlciBvZiBtb250aHMsIHdlZWtzLAorLy8JCWRheXMsIGV0Yy4pIGJldHdlZW4gdHdvIGRhdGVzLgorLy8KKy8vCWR0QToKKy8vCQlBIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QKKy8vCisvLwlkdEI6CisvLwkJQSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0CisvLworLy8JaW50ZXJ2OgorLy8JCUEgY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSBpbnRlcnZhbCwgZS5nLiBZRUFSLCBNT05USCwgREFZLiAgU2VlIGRvam8uZGF0ZS5kYXRlUGFydHMuCisKKwkvLyBBY2NlcHQgdGltZXN0YW1wIGlucHV0CisJaWYodHlwZW9mIGR0QSA9PSAnbnVtYmVyJyl7ZHRBID0gbmV3IERhdGUoZHRBKTt9CisJaWYodHlwZW9mIGR0QiA9PSAnbnVtYmVyJyl7ZHRCID0gbmV3IERhdGUoZHRCKTt9CisJdmFyIHllYURpZmYgPSBkdEIuZ2V0RnVsbFllYXIoKSAtIGR0QS5nZXRGdWxsWWVhcigpOworCXZhciBtb25EaWZmID0gKGR0Qi5nZXRNb250aCgpIC0gZHRBLmdldE1vbnRoKCkpICsgKHllYURpZmYgKiAxMik7CisJdmFyIG1zRGlmZiA9IGR0Qi5nZXRUaW1lKCkgLSBkdEEuZ2V0VGltZSgpOyAvLyBNaWxsaXNlY3MKKwl2YXIgc2VjRGlmZiA9IG1zRGlmZi8xMDAwOworCXZhciBtaW5EaWZmID0gc2VjRGlmZi82MDsKKwl2YXIgaG91RGlmZiA9IG1pbkRpZmYvNjA7CisJdmFyIGRheURpZmYgPSBob3VEaWZmLzI0OworCXZhciB3ZWVEaWZmID0gZGF5RGlmZi83OworCXZhciBkZWx0YSA9IDA7IC8vIEludGVnZXIgcmV0dXJuIHZhbHVlCisKKwl3aXRoKGRvam8uZGF0ZS5kYXRlUGFydHMpeworCQlzd2l0Y2goaW50ZXJ2KXsKKwkJCWNhc2UgWUVBUjoKKwkJCQlkZWx0YSA9IHllYURpZmY7CisJCQkJYnJlYWs7CisJCQljYXNlIFFVQVJURVI6CisJCQkJdmFyIG1BID0gZHRBLmdldE1vbnRoKCk7CisJCQkJdmFyIG1CID0gZHRCLmdldE1vbnRoKCk7CisJCQkJLy8gRmlndXJlIG91dCB3aGljaCBxdWFydGVyIHRoZSBtb250aHMgYXJlIGluCisJCQkJdmFyIHFBID0gTWF0aC5mbG9vcihtQS8zKSArIDE7CisJCQkJdmFyIHFCID0gTWF0aC5mbG9vcihtQi8zKSArIDE7CisJCQkJLy8gQWRkIHF1YXJ0ZXJzIGZvciBhbnkgeWVhciBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRhdGVzCisJCQkJcUIgKz0gKHllYURpZmYgKiA0KTsKKwkJCQlkZWx0YSA9IHFCIC0gcUE7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PTlRIOgorCQkJCWRlbHRhID0gbW9uRGlmZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0VFSzoKKwkJCQkvLyBUcnVuY2F0ZSBpbnN0ZWFkIG9mIHJvdW5kaW5nCisJCQkJLy8gRG9uJ3QgdXNlIE1hdGguZmxvb3IgLS0gdmFsdWUgbWF5IGJlIG5lZ2F0aXZlCisJCQkJZGVsdGEgPSBwYXJzZUludCh3ZWVEaWZmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgREFZOgorCQkJCWRlbHRhID0gZGF5RGlmZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0VFS0RBWToKKwkJCQl2YXIgZGF5cyA9IE1hdGgucm91bmQoZGF5RGlmZik7CisJCQkJdmFyIHdlZWtzID0gcGFyc2VJbnQoZGF5cy83KTsKKwkJCQl2YXIgbW9kID0gZGF5cyAlIDc7CisKKwkJCQkvLyBFdmVuIG51bWJlciBvZiB3ZWVrcworCQkJCWlmIChtb2QgPT0gMCkgeworCQkJCQlkYXlzID0gd2Vla3MqNTsKKwkJCQl9CisJCQkJLy8gV2Vla3MgcGx1cyBzcGFyZSBjaGFuZ2UgKDwgNyBkYXlzKQorCQkJCWVsc2UgeworCQkJCQl2YXIgYWRqID0gMDsKKwkJCQkJdmFyIGFEYXkgPSBkdEEuZ2V0RGF5KCk7CisJCQkJCXZhciBiRGF5ID0gZHRCLmdldERheSgpOworCQorCQkJCQl3ZWVrcyA9IHBhcnNlSW50KGRheXMvNyk7CisJCQkJCW1vZCA9IGRheXMgJSA3OworCQkJCQkvLyBNYXJrIHRoZSBkYXRlIGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YKKwkJCQkJLy8gcm91bmQgd2Vla3MgKG1heSBiZSB6ZXJvKQorCQkJCQl2YXIgZHRNYXJrID0gbmV3IERhdGUoZHRBKTsKKwkJCQkJZHRNYXJrLnNldERhdGUoZHRNYXJrLmdldERhdGUoKSsod2Vla3MqNykpOworCQkJCQl2YXIgZGF5TWFyayA9IGR0TWFyay5nZXREYXkoKTsKKwkJCQkJLy8gU3BhcmUgY2hhbmdlIGRheXMgLS0gNiBvciBsZXNzCisJCQkJCS8vIC0tLS0tLS0tLS0KKwkJCQkJLy8gUG9zaXRpdmUgZGlmZgorCQkJCQlpZiAoZGF5RGlmZiA+IDApIHsKKwkJCQkJCXN3aXRjaCAodHJ1ZSkgeworCQkJCQkJCS8vIFJhbmdlIHN0YXJ0cyBvbiBTYXQKKwkJCQkJCQljYXNlIGFEYXkgPT0gNjoKKwkJCQkJCQkJYWRqID0gLTE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCS8vIFJhbmdlIHN0YXJ0cyBvbiBTdW4KKwkJCQkJCQljYXNlIGFEYXkgPT0gMDoKKwkJCQkJCQkJYWRqID0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJLy8gUmFuZ2UgZW5kcyBvbiBTYXQKKwkJCQkJCQljYXNlIGJEYXkgPT0gNjoKKwkJCQkJCQkJYWRqID0gLTE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCS8vIFJhbmdlIGVuZHMgb24gU3VuCisJCQkJCQkJY2FzZSBiRGF5ID09IDA6CisJCQkJCQkJCWFkaiA9IC0yOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQkvLyBSYW5nZSBjb250YWlucyB3ZWVrZW5kCisJCQkJCQkJY2FzZSAoZGF5TWFyayArIG1vZCkgPiA1OgorCQkJCQkJCQlhZGogPSAtMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJLy8gRG8gbm90aGluZworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBOZWdhdGl2ZSBkaWZmCisJCQkJCWVsc2UgaWYgKGRheURpZmYgPCAwKSB7CisJCQkJCQlzd2l0Y2ggKHRydWUpIHsKKwkJCQkJCQkvLyBSYW5nZSBzdGFydHMgb24gU2F0CisJCQkJCQkJY2FzZSBhRGF5ID09IDY6CisJCQkJCQkJCWFkaiA9IDA7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCS8vIFJhbmdlIHN0YXJ0cyBvbiBTdW4KKwkJCQkJCQljYXNlIGFEYXkgPT0gMDoKKwkJCQkJCQkJYWRqID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJLy8gUmFuZ2UgZW5kcyBvbiBTYXQKKwkJCQkJCQljYXNlIGJEYXkgPT0gNjoKKwkJCQkJCQkJYWRqID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJLy8gUmFuZ2UgZW5kcyBvbiBTdW4KKwkJCQkJCQljYXNlIGJEYXkgPT0gMDoKKwkJCQkJCQkJYWRqID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJLy8gUmFuZ2UgY29udGFpbnMgd2Vla2VuZAorCQkJCQkJCWNhc2UgKGRheU1hcmsgKyBtb2QpIDwgMDoKKwkJCQkJCQkJYWRqID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJLy8gRG8gbm90aGluZworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlkYXlzICs9IGFkajsKKwkJCQkJZGF5cyAtPSAod2Vla3MqMik7CisJCQkJfQorCQkJCWRlbHRhID0gZGF5czsKKworCQkJCWJyZWFrOworCQkJY2FzZSBIT1VSOgorCQkJCWRlbHRhID0gaG91RGlmZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUlOVVRFOgorCQkJCWRlbHRhID0gbWluRGlmZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0VDT05EOgorCQkJCWRlbHRhID0gc2VjRGlmZjsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUlMTElTRUNPTkQ6CisJCQkJZGVsdGEgPSBtc0RpZmY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8vIERvIG5vdGhpbmcKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8vIFJvdW5kIGZvciBmcmFjdGlvbmFsIHZhbHVlcyBhbmQgRFNUIGxlYXBzCisJcmV0dXJuIE1hdGgucm91bmQoZGVsdGEpOyAvLyBOdW1iZXIgKGludGVnZXIpCit9OworCitkb2pvLnByb3ZpZGUoImRvam8uZGF0ZS5zdXBwbGVtZW50YWwiKTsKKworZG9qby5kYXRlLmdldEZpcnN0RGF5T2ZXZWVrID0gZnVuY3Rpb24oLypTdHJpbmc/Ki9sb2NhbGUpeworLy8gc3VtbWFyeTogUmV0dXJucyBhIHplcm8tYmFzZWQgaW5kZXggZm9yIGZpcnN0IGRheSBvZiB0aGUgd2VlaworLy8gZGVzY3JpcHRpb246CisvLwkJUmV0dXJucyBhIHplcm8tYmFzZWQgaW5kZXggZm9yIGZpcnN0IGRheSBvZiB0aGUgd2VlaywgYXMgdXNlZCBieSB0aGUgbG9jYWwgKEdyZWdvcmlhbikgY2FsZW5kYXIuCisvLwkJZS5nLiBTdW5kYXkgKHJldHVybnMgMCksIG9yIE1vbmRheSAocmV0dXJucyAxKQorCisJLy8gZnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NsZHIvZGF0YS9jb21tb24vc3VwcGxlbWVudGFsL3N1cHBsZW1lbnRhbERhdGEueG1sOnN1cHBsZW1lbnRhbERhdGEvd2Vla0RhdGEvZmlyc3REYXkKKwl2YXIgZmlyc3REYXkgPSB7LypkZWZhdWx0IGlzIDE9TW9uZGF5Ki8KKwkJbXY6NSwKKwkJYWU6NixhZjo2LGJoOjYsZGo6Nixkejo2LGVnOjYsZXI6NixldDo2LGlxOjYsaXI6Nixqbzo2LGtlOjYsa3c6NixsYjo2LGx5OjYsbWE6NixvbTo2LHFhOjYsc2E6NiwKKwkJc2Q6Nixzbzo2LHRuOjYseWU6NiwKKwkJYXM6MCxhdTowLGF6OjAsYnc6MCxjYTowLGNuOjAsZm86MCxnZTowLGdsOjAsZ3U6MCxoazowLGllOjAsaWw6MCxpczowLGptOjAsanA6MCxrZzowLGtyOjAsbGE6MCwKKwkJbWg6MCxtbzowLG1wOjAsbXQ6MCxuejowLHBoOjAscGs6MCxzZzowLHRoOjAsdHQ6MCx0dzowLHVtOjAsdXM6MCx1ejowLHZpOjAsemE6MCx6dzowLAorCQlldDowLG13OjAsbmc6MCx0ajowLAorCQlnYjowLAorCQlzeTo0CisJfTsKKworCWxvY2FsZSA9IGRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUobG9jYWxlKTsKKwl2YXIgY291bnRyeSA9IGxvY2FsZS5zcGxpdCgiLSIpWzFdOworCXZhciBkb3cgPSBmaXJzdERheVtjb3VudHJ5XTsKKwlyZXR1cm4gKHR5cGVvZiBkb3cgPT0gJ3VuZGVmaW5lZCcpID8gMSA6IGRvdzsgLypOdW1iZXIqLworfTsKKworZG9qby5kYXRlLmdldFdlZWtlbmQgPSBmdW5jdGlvbigvKlN0cmluZz8qL2xvY2FsZSl7CisvLyBzdW1tYXJ5OiBSZXR1cm5zIGEgaGFzaCBjb250YWluaW5nIHRoZSBzdGFydCBhbmQgZW5kIGRheXMgb2YgdGhlIHdlZWtlbmQKKy8vIGRlc2NyaXB0aW9uOgorLy8JCVJldHVybnMgYSBoYXNoIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IGFuZCBlbmQgZGF5cyBvZiB0aGUgd2Vla2VuZCBhY2NvcmRpbmcgdG8gbG9jYWwgY3VzdG9tIHVzaW5nIGxvY2FsZSwKKy8vCQlvciBieSBkZWZhdWx0IGluIHRoZSB1c2VyJ3MgbG9jYWxlLgorLy8JCWUuZy4ge3N0YXJ0OjYsIGVuZDowfQorCisJLy8gZnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NsZHIvZGF0YS9jb21tb24vc3VwcGxlbWVudGFsL3N1cHBsZW1lbnRhbERhdGEueG1sOnN1cHBsZW1lbnRhbERhdGEvd2Vla0RhdGEvd2Vla2VuZHtTdGFydCxFbmR9CisJdmFyIHdlZWtlbmRTdGFydCA9IHsvKmRlZmF1bHQgaXMgNj1TYXR1cmRheSovCisJCWVnOjUsaWw6NSxzeTo1LAorCQknaW4nOjAsCisJCWFlOjQsYmg6NCxkejo0LGlxOjQsam86NCxrdzo0LGxiOjQsbHk6NCxtYTo0LG9tOjQscWE6NCxzYTo0LHNkOjQsdG46NCx5ZTo0CQkKKwl9OworCisJdmFyIHdlZWtlbmRFbmQgPSB7LypkZWZhdWx0IGlzIDA9U3VuZGF5Ki8KKwkJYWU6NSxiaDo1LGR6OjUsaXE6NSxqbzo1LGt3OjUsbGI6NSxseTo1LG1hOjUsb206NSxxYTo1LHNhOjUsc2Q6NSx0bjo1LHllOjUsYWY6NSxpcjo1LAorCQllZzo2LGlsOjYsc3k6NgorCX07CisKKwlsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CisJdmFyIGNvdW50cnkgPSBsb2NhbGUuc3BsaXQoIi0iKVsxXTsKKwl2YXIgc3RhcnQgPSB3ZWVrZW5kU3RhcnRbY291bnRyeV07CisJdmFyIGVuZCA9IHdlZWtlbmRFbmRbY291bnRyeV07CisJaWYodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKXtzdGFydD02O30KKwlpZih0eXBlb2YgZW5kID09ICd1bmRlZmluZWQnKXtlbmQ9MDt9CisJcmV0dXJuIHtzdGFydDpzdGFydCwgZW5kOmVuZH07IC8qT2JqZWN0IHtzdGFydCxlbmR9Ki8KK307CisKK2Rvam8uZGF0ZS5pc1dlZWtlbmQgPSBmdW5jdGlvbigvKkRhdGU/Ki9kYXRlT2JqLCAvKlN0cmluZz8qL2xvY2FsZSl7CisvLyBzdW1tYXJ5OgorLy8JRGV0ZXJtaW5lcyBpZiB0aGUgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQsIGFjY29yZGluZyB0byBsb2NhbCBjdXN0b20uCisKKwl2YXIgd2Vla2VuZCA9IGRvam8uZGF0ZS5nZXRXZWVrZW5kKGxvY2FsZSk7CisJdmFyIGRheSA9IChkYXRlT2JqIHx8IG5ldyBEYXRlKCkpLmdldERheSgpOworCWlmKHdlZWtlbmQuZW5kPHdlZWtlbmQuc3RhcnQpeworCQl3ZWVrZW5kLmVuZCs9NzsKKwkJaWYoZGF5PHdlZWtlbmQuc3RhcnQpeyBkYXkrPTc7IH0KKwl9CisJcmV0dXJuIGRheSA+PSB3ZWVrZW5kLnN0YXJ0ICYmIGRheSA8PSB3ZWVrZW5kLmVuZDsgLy8gQm9vbGVhbgorfTsKKworZG9qby5wcm92aWRlKCJkb2pvLmkxOG4uY29tbW9uIik7CisKK2Rvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24gPSBmdW5jdGlvbigvKlN0cmluZyovcGFja2FnZU5hbWUsIC8qU3RyaW5nKi9idW5kbGVOYW1lLCAvKlN0cmluZz8qL2xvY2FsZSl7CisvLwlzdW1tYXJ5OgorLy8JCVJldHVybnMgYW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXphdGlvbiBmb3IgYSBnaXZlbiByZXNvdXJjZSBidW5kbGUKKy8vCQlpbiBhIHBhY2thZ2UsIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorLy8KKy8vCWRlc2NyaXB0aW9uOgorLy8JCVJldHVybnMgYSBoYXNoIGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpbiBpdHMgcHJvdG90eXBlc3VjaCB0aGF0IHZhbHVlcyBjYW4gYmUgZWFzaWx5IG92ZXJyaWRkZW4uCisvLwkJVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYnVuZGxlIGlzIG5vdCBmb3VuZC4KKy8vCQlCdW5kbGUgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYnkgZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uKCkgb3IgYnkgYSBidWlsZCBvcHRpbWl6YXRpb24gc3RlcC4KKy8vCisvLwlwYWNrYWdlTmFtZTogcGFja2FnZSB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNvdXJjZQorLy8JYnVuZGxlTmFtZTogdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSAod2l0aG91dCB0aGUgIi5qcyIgc3VmZml4KQorLy8JbG9jYWxlOiB0aGUgdmFyaWFudCB0byBsb2FkIChvcHRpb25hbCkuICBCeSBkZWZhdWx0LCB0aGUgbG9jYWxlIGRlZmluZWQgYnkgdGhlCisvLwkJaG9zdCBlbnZpcm9ubWVudDogZG9qby5sb2NhbGUKKworCWRvam8uaG9zdGVudi5wcmVsb2FkTG9jYWxpemF0aW9ucygpOworCWxvY2FsZSA9IGRvam8uaG9zdGVudi5ub3JtYWxpemVMb2NhbGUobG9jYWxlKTsKKworCS8vIGxvb2sgZm9yIG5lYXJlc3QgbG9jYWxlIG1hdGNoCisJdmFyIGVsZW1lbnRzID0gbG9jYWxlLnNwbGl0KCctJyk7CisJdmFyIG1vZHVsZSA9IFtwYWNrYWdlTmFtZSwibmxzIixidW5kbGVOYW1lXS5qb2luKCcuJyk7CisJdmFyIGJ1bmRsZSA9IGRvam8uaG9zdGVudi5maW5kTW9kdWxlKG1vZHVsZSwgdHJ1ZSk7CisKKwl2YXIgbG9jYWxpemF0aW9uOworCWZvcih2YXIgaSA9IGVsZW1lbnRzLmxlbmd0aDsgaSA+IDA7IGktLSl7CisJCXZhciBsb2MgPSBlbGVtZW50cy5zbGljZSgwLCBpKS5qb2luKCdfJyk7CisJCWlmKGJ1bmRsZVtsb2NdKXsKKwkJCWxvY2FsaXphdGlvbiA9IGJ1bmRsZVtsb2NdOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYoIWxvY2FsaXphdGlvbil7CisJCWxvY2FsaXphdGlvbiA9IGJ1bmRsZS5ST09UOworCX0KKworCS8vIG1ha2UgYSBzaW5nbGV0b24gcHJvdG90eXBlIHNvIHRoYXQgdGhlIGNhbGxlciB3b24ndCBhY2NpZGVudGFsbHkgY2hhbmdlIHRoZSB2YWx1ZXMgZ2xvYmFsbHkKKwlpZihsb2NhbGl6YXRpb24peworCQl2YXIgY2xhenogPSBmdW5jdGlvbigpe307CisJCWNsYXp6LnByb3RvdHlwZSA9IGxvY2FsaXphdGlvbjsKKwkJcmV0dXJuIG5ldyBjbGF6eigpOyAvLyBPYmplY3QKKwl9CisKKwlkb2pvLnJhaXNlKCJCdW5kbGUgbm90IGZvdW5kOiAiICsgYnVuZGxlTmFtZSArICIgaW4gIiArIHBhY2thZ2VOYW1lKyIgLCBsb2NhbGU9IiArIGxvY2FsZSk7Cit9OworCitkb2pvLmkxOG4uaXNMVFIgPSBmdW5jdGlvbigvKlN0cmluZz8qL2xvY2FsZSl7CisvLwlzdW1tYXJ5OgorLy8JCUlzIHRoZSBsYW5ndWFnZSByZWFkIGxlZnQtdG8tcmlnaHQ/ICBNb3N0IGV4Y2VwdGlvbnMgYXJlIGZvciBtaWRkbGUgZWFzdGVybiBsYW5ndWFnZXMuCisvLworLy8JbG9jYWxlOiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGxvY2FsZS4gIEJ5IGRlZmF1bHQsIHRoZSBsb2NhbGUgZGVmaW5lZCBieSB0aGUKKy8vCQlob3N0IGVudmlyb25tZW50OiBkb2pvLmxvY2FsZQorCisJdmFyIGxhbmcgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKGxvY2FsZSkuc3BsaXQoJy0nKVswXTsKKwl2YXIgUlRMID0ge2FyOnRydWUsZmE6dHJ1ZSxoZTp0cnVlLHVyOnRydWUseWk6dHJ1ZX07CisJcmV0dXJuICFSVExbbGFuZ107IC8vIEJvb2xlYW4KK307CisKK2Rvam8ucHJvdmlkZSgiZG9qby5kYXRlLmZvcm1hdCIpOworCisKKworCisKKworCisKKworLy8gTG9hZCB0aGUgYnVuZGxlcyBjb250YWluaW5nIGxvY2FsaXphdGlvbiBpbmZvcm1hdGlvbiBmb3IKKy8vIG5hbWVzIGFuZCBmb3JtYXRzCisKKworCisvL05PVEU6IEV2ZXJ5dGhpbmcgaW4gdGhpcyBtb2R1bGUgYXNzdW1lcyBHcmVnb3JpYW4gY2FsZW5kYXJzLgorLy8gT3RoZXIgY2FsZW5kYXJzIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gc2VwYXJhdGUgbW9kdWxlcy4KKworKGZ1bmN0aW9uKCl7Citkb2pvLmRhdGUuZm9ybWF0ID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKk9iamVjdD8qL29wdGlvbnMpeworLy8KKy8vIHN1bW1hcnk6CisvLwkJRm9ybWF0IGEgRGF0ZSBvYmplY3QgYXMgYSBTdHJpbmcsIHVzaW5nIGxvY2FsZS1zcGVjaWZpYyBzZXR0aW5ncy4KKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCQlDcmVhdGUgYSBzdHJpbmcgZnJvbSBhIERhdGUgb2JqZWN0IHVzaW5nIGEga25vd24gbG9jYWxpemVkIHBhdHRlcm4uCisvLwkJQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgZm9ybWF0cyBib3RoIGRhdGUgYW5kIHRpbWUgZnJvbSBkYXRlT2JqZWN0LgorLy8JCUZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGNob3NlbiBhcHByb3ByaWF0ZSB0byB0aGUgbG9jYWxlLiAgRGlmZmVyZW50CisvLwkJZm9ybWF0dGluZyBsZW5ndGhzIG1heSBiZSBjaG9zZW4sIHdpdGggImZ1bGwiIHVzZWQgYnkgZGVmYXVsdC4KKy8vCQlDdXN0b20gcGF0dGVybnMgbWF5IGJlIHVzZWQgb3IgcmVnaXN0ZXJlZCB3aXRoIHRyYW5zbGF0aW9ucyB1c2luZworLy8JCXRoZSBhZGRDdXN0b21CdW5kbGUgbWV0aG9kLgorLy8JCUZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzeW50YXggZGVzY3JpYmVkIGF0CisvLwkJaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS00Lmh0bWwjRGF0ZV9Gb3JtYXRfUGF0dGVybnMKKy8vCisvLyBkYXRlT2JqZWN0OgorLy8JCXRoZSBkYXRlIGFuZC9vciB0aW1lIHRvIGJlIGZvcm1hdHRlZC4gIElmIGEgdGltZSBvbmx5IGlzIGZvcm1hdHRlZCwKKy8vCQl0aGUgdmFsdWVzIGluIHRoZSB5ZWFyLCBtb250aCwgYW5kIGRheSBmaWVsZHMgYXJlIGlycmVsZXZhbnQuICBUaGUKKy8vCQlvcHBvc2l0ZSBpcyB0cnVlIHdoZW4gZm9ybWF0dGluZyBvbmx5IGRhdGVzLgorLy8KKy8vIG9wdGlvbnM6IG9iamVjdCB7c2VsZWN0b3I6IHN0cmluZywgZm9ybWF0TGVuZ3RoOiBzdHJpbmcsIGRhdGVQYXR0ZXJuOiBzdHJpbmcsIHRpbWVQYXR0ZXJuOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nfQorLy8JCXNlbGVjdG9yLSBjaG9pY2Ugb2YgdGltZU9ubHksZGF0ZU9ubHkgKGRlZmF1bHQ6IGRhdGUgYW5kIHRpbWUpCisvLwkJZm9ybWF0TGVuZ3RoLSBjaG9pY2Ugb2YgbG9uZywgc2hvcnQsIG1lZGl1bSBvciBmdWxsIChwbHVzIGFueSBjdXN0b20gYWRkaXRpb25zKS4gIERlZmF1bHRzIHRvICdmdWxsJworLy8JCWRhdGVQYXR0ZXJuLHRpbWVQYXR0ZXJuLSBvdmVycmlkZSBwYXR0ZXJuIHdpdGggdGhpcyBzdHJpbmcKKy8vCQlhbSxwbS0gb3ZlcnJpZGUgc3RyaW5ncyBmb3IgYW0vcG0gaW4gdGltZXMKKy8vCQlsb2NhbGUtIG92ZXJyaWRlIHRoZSBsb2NhbGUgdXNlZCB0byBkZXRlcm1pbmUgZm9ybWF0dGluZyBydWxlcworLy8KKworCWlmKHR5cGVvZiBvcHRpb25zID09ICJzdHJpbmciKXsKKwkJZG9qby5kZXByZWNhdGVkKCJkb2pvLmRhdGUuZm9ybWF0IiwgIlRvIGZvcm1hdCBkYXRlcyB3aXRoIFBPU0lYLXN0eWxlIHN0cmluZ3MsIHBsZWFzZSB1c2UgZG9qby5kYXRlLnN0cmZ0aW1lIGluc3RlYWQiLCAiMC41Iik7CisJCXJldHVybiBkb2pvLmRhdGUuc3RyZnRpbWUoZGF0ZU9iamVjdCwgb3B0aW9ucyk7CisJfQorCisJLy8gRm9ybWF0IGEgcGF0dGVybiB3aXRob3V0IGxpdGVyYWxzCisJZnVuY3Rpb24gZm9ybWF0UGF0dGVybihkYXRlT2JqZWN0LCBwYXR0ZXJuKXsKKwkJcmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvKFthLXpdKVwxKi9pZywgZnVuY3Rpb24obWF0Y2gpeworCQkJdmFyIHM7CisJCQl2YXIgYyA9IG1hdGNoLmNoYXJBdCgwKTsKKwkJCXZhciBsID0gbWF0Y2gubGVuZ3RoOworCQkJdmFyIHBhZDsKKwkJCXZhciB3aWR0aExpc3QgPSBbImFiYnIiLCAid2lkZSIsICJuYXJyb3ciXTsKKwkJCXN3aXRjaChjKXsKKwkJCQljYXNlICdHJzoKKwkJCQkJaWYobD4zKXtkb2pvLnVuaW1wbGVtZW50ZWQoIkVyYSBmb3JtYXQgbm90IGltcGxlbWVudGVkIik7fQorCQkJCQlzID0gaW5mby5lcmFzW2RhdGVPYmplY3QuZ2V0RnVsbFllYXIoKSA8IDAgPyAxIDogMF07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3knOgorCQkJCQlzID0gZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpOworCQkJCQlzd2l0Y2gobCl7CisJCQkJCQljYXNlIDE6CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJcyA9IFN0cmluZyhzKS5zdWJzdHIoLTIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlwYWQgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1EnOgorCQkJCWNhc2UgJ3EnOgorCQkJCQlzID0gTWF0aC5jZWlsKChkYXRlT2JqZWN0LmdldE1vbnRoKCkrMSkvMyk7CisJCQkJCXN3aXRjaChsKXsKKwkJCQkJCWNhc2UgMTogY2FzZSAyOgorCQkJCQkJCXBhZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDM6CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJZG9qby51bmltcGxlbWVudGVkKCJRdWFydGVyIGZvcm1hdCBub3QgaW1wbGVtZW50ZWQiKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICdNJzoKKwkJCQljYXNlICdMJzoKKwkJCQkJdmFyIG0gPSBkYXRlT2JqZWN0LmdldE1vbnRoKCk7CisJCQkJCXZhciB3aWR0aDsKKwkJCQkJc3dpdGNoKGwpeworCQkJCQkJY2FzZSAxOiBjYXNlIDI6CisJCQkJCQkJcyA9IG0rMTsgcGFkID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMzogY2FzZSA0OiBjYXNlIDU6CisJCQkJCQkJd2lkdGggPSB3aWR0aExpc3RbbC0zXTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZih3aWR0aCl7CisJCQkJCQl2YXIgdHlwZSA9IChjID09ICJMIikgPyAic3RhbmRhbG9uZSIgOiAiZm9ybWF0IjsKKwkJCQkJCXZhciBwcm9wID0gWyJtb250aHMiLHR5cGUsd2lkdGhdLmpvaW4oIi0iKTsKKwkJCQkJCXMgPSBpbmZvW3Byb3BdW21dOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3cnOgorCQkJCQl2YXIgZmlyc3REYXkgPSAwOworCQkJCQlzID0gZG9qby5kYXRlLmdldFdlZWtPZlllYXIoZGF0ZU9iamVjdCwgZmlyc3REYXkpOyBwYWQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdkJzoKKwkJCQkJcyA9IGRhdGVPYmplY3QuZ2V0RGF0ZSgpOyBwYWQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICdEJzoKKwkJCQkJcyA9IGRvam8uZGF0ZS5nZXREYXlPZlllYXIoZGF0ZU9iamVjdCk7IHBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0UnOgorCQkJCWNhc2UgJ2UnOgorCQkJCWNhc2UgJ2MnOiAvLyBSRVZJRVc6IGRvbid0IHNlZSB0aGlzIGluIHRoZSBzcGVjPworCQkJCQl2YXIgZCA9IGRhdGVPYmplY3QuZ2V0RGF5KCk7CisJCQkJCXZhciB3aWR0aDsKKwkJCQkJc3dpdGNoKGwpeworCQkJCQkJY2FzZSAxOiBjYXNlIDI6CisJCQkJCQkJaWYoYyA9PSAnZScpeworCQkJCQkJCQl2YXIgZmlyc3QgPSBkb2pvLmRhdGUuZ2V0Rmlyc3REYXlPZldlZWsob3B0aW9ucy5sb2NhbGUpOworCQkJCQkJCQlkID0gKGQtZmlyc3QrNyklNzsKKwkJCQkJCQl9CisJCQkJCQkJaWYoYyAhPSAnYycpeworCQkJCQkJCQlzID0gZCsxOyBwYWQgPSB0cnVlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJLy8gZWxzZSBmYWxsdGhyb3VnaC4uLgorCQkJCQkJY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNToKKwkJCQkJCQl3aWR0aCA9IHdpZHRoTGlzdFtsLTNdOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmKHdpZHRoKXsKKwkJCQkJCXZhciB0eXBlID0gKGMgPT0gImMiKSA/ICJzdGFuZGFsb25lIiA6ICJmb3JtYXQiOworCQkJCQkJdmFyIHByb3AgPSBbImRheXMiLHR5cGUsd2lkdGhdLmpvaW4oIi0iKTsKKwkJCQkJCXMgPSBpbmZvW3Byb3BdW2RdOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2EnOgorCQkJCQl2YXIgdGltZVBlcmlvZCA9IChkYXRlT2JqZWN0LmdldEhvdXJzKCkgPCAxMikgPyAnYW0nIDogJ3BtJzsKKwkJCQkJcyA9IGluZm9bdGltZVBlcmlvZF07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2gnOgorCQkJCWNhc2UgJ0gnOgorCQkJCWNhc2UgJ0snOgorCQkJCWNhc2UgJ2snOgorCQkJCQl2YXIgaCA9IGRhdGVPYmplY3QuZ2V0SG91cnMoKTsKKwkJCQkJLy8gc3RyYW5nZSBjaG9pY2VzIGluIHRoZSBkYXRlIGZvcm1hdCBtYWtlIGl0IGltcG9zc2libGUgdG8gd3JpdGUgdGhpcyBzdWNjaW5jdGx5CisJCQkJCXN3aXRjaCAoYykgeworCQkJCQkJY2FzZSAnaCc6IC8vIDEtMTIKKwkJCQkJCQlzID0gKGggJSAxMikgfHwgMTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdIJzogLy8gMC0yMworCQkJCQkJCXMgPSBoOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnSyc6IC8vIDAtMTEKKwkJCQkJCQlzID0gKGggJSAxMik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdrJzogLy8gMS0yNAorCQkJCQkJCXMgPSBoIHx8IDI0OworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ20nOgorCQkJCQlzID0gZGF0ZU9iamVjdC5nZXRNaW51dGVzKCk7IHBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3MnOgorCQkJCQlzID0gZGF0ZU9iamVjdC5nZXRTZWNvbmRzKCk7IHBhZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1MnOgorCQkJCQlzID0gTWF0aC5yb3VuZChkYXRlT2JqZWN0LmdldE1pbGxpc2Vjb25kcygpICogTWF0aC5wb3coMTAsIGwtMykpOworCQkJCQlicmVhazsKKwkJCQljYXNlICd2JzogLy8gRklYTUU6IGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLiBzZWVtcyB0byBiZSBzYW1lIGFzIHo/CisJCQkJY2FzZSAneic6CisJCQkJCS8vIFdlIG9ubHkgaGF2ZSBvbmUgdGltZXpvbmUgdG8gb2ZmZXI7IHRoZSBvbmUgZnJvbSB0aGUgYnJvd3NlcgorCQkJCQlzID0gZG9qby5kYXRlLmdldFRpbWV6b25lTmFtZShkYXRlT2JqZWN0KTsKKwkJCQkJaWYocyl7YnJlYWs7fQorCQkJCQlsPTQ7CisJCQkJCS8vIGZhbGx0aHJvdWdoLi4uIHVzZSBHTVQgaWYgdHogbm90IGF2YWlsYWJsZQorCQkJCWNhc2UgJ1onOgorCQkJCQl2YXIgb2Zmc2V0ID0gZGF0ZU9iamVjdC5nZXRUaW1lem9uZU9mZnNldCgpOworCQkJCQl2YXIgdHogPSBbCisJCQkJCQkob2Zmc2V0PD0wID8gIisiIDogIi0iKSwKKwkJCQkJCWRvam8uc3RyaW5nLnBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkvNjApLCAyKSwKKwkJCQkJCWRvam8uc3RyaW5nLnBhZChNYXRoLmFicyhvZmZzZXQpJSA2MCwgMikKKwkJCQkJXTsKKwkJCQkJaWYobD09NCl7CisJCQkJCQl0ei5zcGxpY2UoMCwgMCwgIkdNVCIpOworCQkJCQkJdHouc3BsaWNlKDMsIDAsICI6Iik7CisJCQkJCX0KKwkJCQkJcyA9IHR6LmpvaW4oIiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdZJzoKKwkJCQljYXNlICd1JzoKKwkJCQljYXNlICdXJzoKKwkJCQljYXNlICdGJzoKKwkJCQljYXNlICdnJzoKKwkJCQljYXNlICdBJzoKKwkJCQkJZG9qby5kZWJ1ZyhtYXRjaCsiIG1vZGlmaWVyIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKwkJCQkJcyA9ICI/IjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZG9qby5yYWlzZSgiZG9qby5kYXRlLmZvcm1hdDogaW52YWxpZCBwYXR0ZXJuIGNoYXI6ICIrcGF0dGVybik7CisJCQl9CisJCQlpZihwYWQpeyBzID0gZG9qby5zdHJpbmcucGFkKHMsIGwpOyB9CisJCQlyZXR1cm4gczsKKwkJfSk7CisJfQorCisJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKwl2YXIgbG9jYWxlID0gZG9qby5ob3N0ZW52Lm5vcm1hbGl6ZUxvY2FsZShvcHRpb25zLmxvY2FsZSk7CisJdmFyIGZvcm1hdExlbmd0aCA9IG9wdGlvbnMuZm9ybWF0TGVuZ3RoIHx8ICdmdWxsJzsKKwl2YXIgaW5mbyA9IGRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKGxvY2FsZSk7CisJdmFyIHN0ciA9IFtdOworCXZhciBzYXVjZSA9IGRvam8ubGFuZy5jdXJyeSh0aGlzLCBmb3JtYXRQYXR0ZXJuLCBkYXRlT2JqZWN0KTsKKwlpZihvcHRpb25zLnNlbGVjdG9yICE9ICJ0aW1lT25seSIpeworCQl2YXIgZGF0ZVBhdHRlcm4gPSBvcHRpb25zLmRhdGVQYXR0ZXJuIHx8IGluZm9bImRhdGVGb3JtYXQtIitmb3JtYXRMZW5ndGhdOworCQlpZihkYXRlUGF0dGVybil7c3RyLnB1c2goX3Byb2Nlc3NQYXR0ZXJuKGRhdGVQYXR0ZXJuLCBzYXVjZSkpO30KKwl9CisJaWYob3B0aW9ucy5zZWxlY3RvciAhPSAiZGF0ZU9ubHkiKXsKKwkJdmFyIHRpbWVQYXR0ZXJuID0gb3B0aW9ucy50aW1lUGF0dGVybiB8fCBpbmZvWyJ0aW1lRm9ybWF0LSIrZm9ybWF0TGVuZ3RoXTsKKwkJaWYodGltZVBhdHRlcm4pe3N0ci5wdXNoKF9wcm9jZXNzUGF0dGVybih0aW1lUGF0dGVybiwgc2F1Y2UpKTt9CisJfQorCXZhciByZXN1bHQgPSBzdHIuam9pbigiICIpOyAvL1RPRE86IHVzZSBsb2NhbGUtc3BlY2lmaWMgcGF0dGVybiB0byBhc3NlbWJsZSBkYXRlICsgdGltZQorCXJldHVybiByZXN1bHQ7IC8qU3RyaW5nKi8KK307CisKK2Rvam8uZGF0ZS5wYXJzZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi92YWx1ZSwgLypPYmplY3Q/Ki9vcHRpb25zKXsKKy8vCisvLyBzdW1tYXJ5OgorLy8JCUNvbnZlcnQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgcHJpbWl0aXZlIERhdGUgb2JqZWN0LAorLy8JCXVzaW5nIGxvY2FsZS1zcGVjaWZpYyBzZXR0aW5ncy4KKy8vCisvLyBkZXNjcmlwdGlvbjoKKy8vCQlDcmVhdGUgYSBEYXRlIG9iamVjdCBmcm9tIGEgc3RyaW5nIHVzaW5nIGEga25vd24gbG9jYWxpemVkIHBhdHRlcm4uCisvLwkJQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgcGFyc2VzIGxvb2tpbmcgZm9yIGJvdGggZGF0ZSBhbmQgdGltZSBpbiB0aGUgc3RyaW5nLgorLy8JCUZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGNob3NlbiBhcHByb3ByaWF0ZSB0byB0aGUgbG9jYWxlLiAgRGlmZmVyZW50CisvLwkJZm9ybWF0dGluZyBsZW5ndGhzIG1heSBiZSBjaG9zZW4sIHdpdGggImZ1bGwiIHVzZWQgYnkgZGVmYXVsdC4KKy8vCQlDdXN0b20gcGF0dGVybnMgbWF5IGJlIHVzZWQgb3IgcmVnaXN0ZXJlZCB3aXRoIHRyYW5zbGF0aW9ucyB1c2luZworLy8JCXRoZSBhZGRDdXN0b21CdW5kbGUgbWV0aG9kLgorLy8JCUZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzeW50YXggZGVzY3JpYmVkIGF0CisvLwkJaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvI0RhdGVfRm9ybWF0X1BhdHRlcm5zCisvLworLy8gdmFsdWU6CisvLwkJQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRlCisvLworLy8gb3B0aW9uczogb2JqZWN0IHtzZWxlY3Rvcjogc3RyaW5nLCBmb3JtYXRMZW5ndGg6IHN0cmluZywgZGF0ZVBhdHRlcm46IHN0cmluZywgdGltZVBhdHRlcm46IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIHN0cmljdDogYm9vbGVhbn0KKy8vCQlzZWxlY3Rvci0gY2hvaWNlIG9mIHRpbWVPbmx5LCBkYXRlT25seSwgZGF0ZVRpbWUgKGRlZmF1bHQ6IGRhdGVPbmx5KQorLy8JCWZvcm1hdExlbmd0aC0gY2hvaWNlIG9mIGxvbmcsIHNob3J0LCBtZWRpdW0gb3IgZnVsbCAocGx1cyBhbnkgY3VzdG9tIGFkZGl0aW9ucykuICBEZWZhdWx0cyB0byAnZnVsbCcKKy8vCQlkYXRlUGF0dGVybix0aW1lUGF0dGVybi0gb3ZlcnJpZGUgcGF0dGVybiB3aXRoIHRoaXMgc3RyaW5nCisvLwkJYW0scG0tIG92ZXJyaWRlIHN0cmluZ3MgZm9yIGFtL3BtIGluIHRpbWVzCisvLwkJbG9jYWxlLSBvdmVycmlkZSB0aGUgbG9jYWxlIHVzZWQgdG8gZGV0ZXJtaW5lIGZvcm1hdHRpbmcgcnVsZXMKKy8vCQlzdHJpY3QtIHN0cmljdCBwYXJzaW5nLCBvZmYgYnkgZGVmYXVsdAorLy8KKworCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCXZhciBsb2NhbGUgPSBkb2pvLmhvc3RlbnYubm9ybWFsaXplTG9jYWxlKG9wdGlvbnMubG9jYWxlKTsKKwl2YXIgaW5mbyA9IGRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKGxvY2FsZSk7CisJdmFyIGZvcm1hdExlbmd0aCA9IG9wdGlvbnMuZm9ybWF0TGVuZ3RoIHx8ICdmdWxsJzsKKwlpZighb3B0aW9ucy5zZWxlY3Rvcil7IG9wdGlvbnMuc2VsZWN0b3IgPSAnZGF0ZU9ubHknOyB9CisJdmFyIGRhdGVQYXR0ZXJuID0gb3B0aW9ucy5kYXRlUGF0dGVybiB8fCBpbmZvWyJkYXRlRm9ybWF0LSIgKyBmb3JtYXRMZW5ndGhdOworCXZhciB0aW1lUGF0dGVybiA9IG9wdGlvbnMudGltZVBhdHRlcm4gfHwgaW5mb1sidGltZUZvcm1hdC0iICsgZm9ybWF0TGVuZ3RoXTsKKworCXZhciBwYXR0ZXJuOworCWlmKG9wdGlvbnMuc2VsZWN0b3IgPT0gJ2RhdGVPbmx5Jyl7CisJCXBhdHRlcm4gPSBkYXRlUGF0dGVybjsKKwl9CisJZWxzZSBpZihvcHRpb25zLnNlbGVjdG9yID09ICd0aW1lT25seScpeworCQlwYXR0ZXJuID0gdGltZVBhdHRlcm47CisJfWVsc2UgaWYob3B0aW9ucy5zZWxlY3RvciA9PSAnZGF0ZVRpbWUnKXsKKwkJcGF0dGVybiA9IGRhdGVQYXR0ZXJuICsgJyAnICsgdGltZVBhdHRlcm47IC8vVE9ETzogdXNlIGxvY2FsZS1zcGVjaWZpYyBwYXR0ZXJuIHRvIGFzc2VtYmxlIGRhdGUgKyB0aW1lCisJfWVsc2V7CisJCXZhciBtc2cgPSAiZG9qby5kYXRlLnBhcnNlOiBVbmtub3duIHNlbGVjdG9yIHBhcmFtIHBhc3NlZDogJyIgKyBvcHRpb25zLnNlbGVjdG9yICsgIicuIjsKKwkJbXNnICs9ICIgRGVmYXVsdGluZyB0byBkYXRlIHBhdHRlcm4uIjsKKwkJZG9qby5kZWJ1Zyhtc2cpOworCQlwYXR0ZXJuID0gZGF0ZVBhdHRlcm47CisJfQorCisJdmFyIGdyb3VwcyA9IFtdOworCXZhciBkYXRlUkVTdHJpbmcgPSBfcHJvY2Vzc1BhdHRlcm4ocGF0dGVybiwgZG9qby5sYW5nLmN1cnJ5KHRoaXMsIF9idWlsZERhdGVUaW1lUkUsIGdyb3VwcywgaW5mbywgb3B0aW9ucykpOworCXZhciBkYXRlUkUgPSBuZXcgUmVnRXhwKCJeIiArIGRhdGVSRVN0cmluZyArICIkIik7CisKKwl2YXIgbWF0Y2ggPSBkYXRlUkUuZXhlYyh2YWx1ZSk7CisJaWYoIW1hdGNoKXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJdmFyIHdpZHRoTGlzdCA9IFsnYWJicicsICd3aWRlJywgJ25hcnJvdyddOworCS8vMTk3MiBpcyBhIGxlYXAgeWVhci4gIFdlIHdhbnQgdG8gYXZvaWQgRmViIDI5IHJvbGxpbmcgb3ZlciBpbnRvIE1hciAxLAorCS8vaW4gdGhlIGNhc2VzIHdoZXJlIHRoZSB5ZWFyIGlzIHBhcnNlZCBhZnRlciB0aGUgbW9udGggYW5kIGRheS4KKwl2YXIgcmVzdWx0ID0gbmV3IERhdGUoMTk3MiwgMCk7CisJdmFyIGV4cGVjdGVkID0ge307CisJZm9yKHZhciBpPTE7IGk8bWF0Y2gubGVuZ3RoOyBpKyspeworCQl2YXIgZ3JwPWdyb3Vwc1tpLTFdOworCQl2YXIgbD1ncnAubGVuZ3RoOworCQl2YXIgdj1tYXRjaFtpXTsKKwkJc3dpdGNoKGdycC5jaGFyQXQoMCkpeworCQkJY2FzZSAneSc6CisJCQkJaWYobCAhPSAyKXsKKwkJCQkJLy9pbnRlcnByZXQgeWVhciBsaXRlcmFsbHksIHNvICc1JyB3b3VsZCBiZSA1IEEuRC4KKwkJCQkJcmVzdWx0LnNldEZ1bGxZZWFyKHYpOworCQkJCQlleHBlY3RlZC55ZWFyID0gdjsKKwkJCQl9ZWxzZXsKKwkJCQkJaWYodjwxMDApeworCQkJCQkJdiA9IE51bWJlcih2KTsKKwkJCQkJCS8vY2hvb3NlIGNlbnR1cnkgdG8gYXBwbHksIGFjY29yZGluZyB0byBhIHNsaWRpbmcgd2luZG93CisJCQkJCQkvL29mIDgwIHllYXJzIGJlZm9yZSBhbmQgMjAgeWVhcnMgYWZ0ZXIgcHJlc2VudCB5ZWFyCisJCQkJCQl2YXIgeWVhciA9ICcnICsgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOworCQkJCQkJdmFyIGNlbnR1cnkgPSB5ZWFyLnN1YnN0cmluZygwLCAyKSAqIDEwMDsKKwkJCQkJCXZhciB5ZWFyUGFydCA9IE51bWJlcih5ZWFyLnN1YnN0cmluZygyLCA0KSk7CisJCQkJCQl2YXIgY3V0b2ZmID0gTWF0aC5taW4oeWVhclBhcnQgKyAyMCwgOTkpOworCQkJCQkJdmFyIG51bSA9ICh2IDwgY3V0b2ZmKSA/IGNlbnR1cnkgKyB2IDogY2VudHVyeSAtIDEwMCArIHY7CisJCQkJCQlyZXN1bHQuc2V0RnVsbFllYXIobnVtKTsKKwkJCQkJCWV4cGVjdGVkLnllYXIgPSBudW07CisJCQkJCX1lbHNleworCQkJCQkJLy93ZSBleHBlY3RlZCAyIGRpZ2l0cyBhbmQgZ290IG1vcmUuLi4KKwkJCQkJCWlmKG9wdGlvbnMuc3RyaWN0KXsKKwkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCS8vaW50ZXJwcmV0IGxpdGVyYWxseSwgc28gJzE1MCcgd291bGQgYmUgMTUwIEEuRC4KKwkJCQkJCS8vYWxzbyB0b2xlcmF0ZSAnMTk1MCcsIGlmICd5eXl5JyBpbnB1dCBwYXNzZWQgdG8gJ3l5JyBmb3JtYXQKKwkJCQkJCXJlc3VsdC5zZXRGdWxsWWVhcih2KTsKKwkJCQkJCWV4cGVjdGVkLnllYXIgPSB2OworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnTSc6CisJCQkJaWYgKGw+MikgeworCQkJCQlpZighb3B0aW9ucy5zdHJpY3QpeworCQkJCQkJLy9Ub2xlcmF0ZSBhYmJyZXZpYXRpbmcgcGVyaW9kIGluIG1vbnRoIHBhcnQKKwkJCQkJCXYgPSB2LnJlcGxhY2UoL1wuL2csJycpOworCQkJCQkJLy9DYXNlLWluc2Vuc2l0aXZlCisJCQkJCQl2ID0gdi50b0xvd2VyQ2FzZSgpOworCQkJCQl9CisJCQkJCXZhciBtb250aHMgPSBpbmZvWydtb250aHMtZm9ybWF0LScgKyB3aWR0aExpc3RbbC0zXV0uY29uY2F0KCk7CisJCQkJCWZvciAodmFyIGo9MDsgajxtb250aHMubGVuZ3RoOyBqKyspeworCQkJCQkJaWYoIW9wdGlvbnMuc3RyaWN0KXsKKwkJCQkJCQkvL0Nhc2UtaW5zZW5zaXRpdmUKKwkJCQkJCQltb250aHNbal0gPSBtb250aHNbal0udG9Mb3dlckNhc2UoKTsKKwkJCQkJCX0KKwkJCQkJCWlmKHYgPT0gbW9udGhzW2pdKXsKKwkJCQkJCQlyZXN1bHQuc2V0TW9udGgoaik7CisJCQkJCQkJZXhwZWN0ZWQubW9udGggPSBqOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmKGo9PW1vbnRocy5sZW5ndGgpeworCQkJCQkJZG9qby5kZWJ1ZygiZG9qby5kYXRlLnBhcnNlOiBDb3VsZCBub3QgcGFyc2UgbW9udGggbmFtZTogJyIgKyB2ICsgIicuIik7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX1lbHNleworCQkJCQlyZXN1bHQuc2V0TW9udGgodi0xKTsKKwkJCQkJZXhwZWN0ZWQubW9udGggPSB2LTE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnRSc6CisJCQljYXNlICdlJzoKKwkJCQlpZighb3B0aW9ucy5zdHJpY3QpeworCQkJCQkvL0Nhc2UtaW5zZW5zaXRpdmUKKwkJCQkJdiA9IHYudG9Mb3dlckNhc2UoKTsKKwkJCQl9CisJCQkJdmFyIGRheXMgPSBpbmZvWydkYXlzLWZvcm1hdC0nICsgd2lkdGhMaXN0W2wtM11dLmNvbmNhdCgpOworCQkJCWZvciAodmFyIGo9MDsgajxkYXlzLmxlbmd0aDsgaisrKXsKKwkJCQkJaWYoIW9wdGlvbnMuc3RyaWN0KXsKKwkJCQkJCS8vQ2FzZS1pbnNlbnNpdGl2ZQorCQkJCQkJZGF5c1tqXSA9IGRheXNbal0udG9Mb3dlckNhc2UoKTsKKwkJCQkJfQorCQkJCQlpZih2ID09IGRheXNbal0peworCQkJCQkJLy9UT0RPOiBub3Qgc3VyZSB3aGF0IHRvIGFjdHVhbGx5IGRvIHdpdGggdGhpcyBpbnB1dCwKKwkJCQkJCS8vaW4gdGVybXMgb2Ygc2V0dGluZyBzb21ldGhpbmcgb24gdGhlIERhdGUgb2JqLi4uPworCQkJCQkJLy93aXRob3V0IG1vcmUgY29udGV4dCwgY2FuJ3QgYWZmZWN0IHRoZSBhY3R1YWwgZGF0ZQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaj09ZGF5cy5sZW5ndGgpeworCQkJCQlkb2pvLmRlYnVnKCJkb2pvLmRhdGUucGFyc2U6IENvdWxkIG5vdCBwYXJzZSB3ZWVrZGF5IG5hbWU6ICciICsgdiArICInLiIpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJYnJlYWs7CQorCQkJY2FzZSAnZCc6CisJCQkJcmVzdWx0LnNldERhdGUodik7CisJCQkJZXhwZWN0ZWQuZGF0ZSA9IHY7CisJCQkJYnJlYWs7CisJCQljYXNlICdhJzogLy9hbS9wbQorCQkJCXZhciBhbSA9IG9wdGlvbnMuYW0gfHwgaW5mby5hbTsKKwkJCQl2YXIgcG0gPSBvcHRpb25zLnBtIHx8IGluZm8ucG07CisJCQkJaWYoIW9wdGlvbnMuc3RyaWN0KXsKKwkJCQkJdiA9IHYucmVwbGFjZSgvXC4vZywnJykudG9Mb3dlckNhc2UoKTsKKwkJCQkJYW0gPSBhbS5yZXBsYWNlKC9cLi9nLCcnKS50b0xvd2VyQ2FzZSgpOworCQkJCQlwbSA9IHBtLnJlcGxhY2UoL1wuL2csJycpLnRvTG93ZXJDYXNlKCk7CisJCQkJfQorCQkJCWlmKG9wdGlvbnMuc3RyaWN0ICYmIHYgIT0gYW0gJiYgdiAhPSBwbSl7CisJCQkJCWRvam8uZGVidWcoImRvam8uZGF0ZS5wYXJzZTogQ291bGQgbm90IHBhcnNlIGFtL3BtIHBhcnQuIik7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQl2YXIgaG91cnMgPSByZXN1bHQuZ2V0SG91cnMoKTsKKwkJCQlpZih2ID09IHBtICYmIGhvdXJzIDwgMTIpeworCQkJCQlyZXN1bHQuc2V0SG91cnMoaG91cnMgKyAxMik7IC8vZS5nLiwgM3BtIC0+IDE1CisJCQkJfSBlbHNlIGlmKHYgPT0gYW0gJiYgaG91cnMgPT0gMTIpeworCQkJCQlyZXN1bHQuc2V0SG91cnMoMCk7IC8vMTJhbSAtPiAwCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnSyc6IC8vaG91ciAoMS0yNCkKKwkJCQlpZih2PT0yNCl7dj0wO30KKwkJCQkvLyBmYWxsdGhyb3VnaC4uLgorCQkJY2FzZSAnaCc6IC8vaG91ciAoMS0xMikKKwkJCWNhc2UgJ0gnOiAvL2hvdXIgKDAtMjMpCisJCQljYXNlICdrJzogLy9ob3VyICgwLTExKQorCQkJCS8vVE9ETzogc3RyaWN0IGJvdW5kcyBjaGVja2luZywgcGFkZGluZworCQkJCWlmKHY+MjMpeworCQkJCQlkb2pvLmRlYnVnKCJkb2pvLmRhdGUucGFyc2U6IElsbGVnYWwgaG91cnMgdmFsdWUiKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJLy9pbiB0aGUgMTItaG91ciBjYXNlLCBhZGp1c3RpbmcgZm9yIGFtL3BtIHJlcXVpcmVzIHRoZSAnYScgcGFydAorCQkJCS8vd2hpY2ggZm9yIG5vdyB3ZSB3aWxsIGFzc3VtZSBhbHdheXMgY29tZXMgYWZ0ZXIgdGhlICdoJyBwYXJ0CisJCQkJcmVzdWx0LnNldEhvdXJzKHYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnbSc6IC8vbWludXRlcworCQkJCXJlc3VsdC5zZXRNaW51dGVzKHYpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6IC8vc2Vjb25kcworCQkJCXJlc3VsdC5zZXRTZWNvbmRzKHYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUyc6IC8vbWlsbGlzZWNvbmRzCisJCQkJcmVzdWx0LnNldE1pbGxpc2Vjb25kcyh2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZG9qby51bmltcGxlbWVudGVkKCJkb2pvLmRhdGUucGFyc2U6IHVuc3VwcG9ydGVkIHBhdHRlcm4gY2hhcj0iICsgZ3JwLmNoYXJBdCgwKSk7CisJCX0KKwl9CisKKwkvL3ZhbGlkYXRlIHBhcnNlIGRhdGUgZmllbGRzIHZlcnN1cyBpbnB1dCBkYXRlIGZpZWxkcworCWlmKGV4cGVjdGVkLnllYXIgJiYgcmVzdWx0LmdldEZ1bGxZZWFyKCkgIT0gZXhwZWN0ZWQueWVhcil7CisJCWRvam8uZGVidWcoIlBhcnNlZCB5ZWFyOiAnIiArIHJlc3VsdC5nZXRGdWxsWWVhcigpICsgIicgZGlkIG5vdCBtYXRjaCBpbnB1dCB5ZWFyOiAnIiArIGV4cGVjdGVkLnllYXIgKyAiJy4iKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmKGV4cGVjdGVkLm1vbnRoICYmIHJlc3VsdC5nZXRNb250aCgpICE9IGV4cGVjdGVkLm1vbnRoKXsKKwkJZG9qby5kZWJ1ZygiUGFyc2VkIG1vbnRoOiAnIiArIHJlc3VsdC5nZXRNb250aCgpICsgIicgZGlkIG5vdCBtYXRjaCBpbnB1dCBtb250aDogJyIgKyBleHBlY3RlZC5tb250aCArICInLiIpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYoZXhwZWN0ZWQuZGF0ZSAmJiByZXN1bHQuZ2V0RGF0ZSgpICE9IGV4cGVjdGVkLmRhdGUpeworCQlkb2pvLmRlYnVnKCJQYXJzZWQgZGF5IG9mIG1vbnRoOiAnIiArIHJlc3VsdC5nZXREYXRlKCkgKyAiJyBkaWQgbm90IG1hdGNoIGlucHV0IGRheSBvZiBtb250aDogJyIgKyBleHBlY3RlZC5kYXRlICsgIicuIik7CisJCXJldHVybiBudWxsOworCX0KKworCS8vVE9ETzogaW1wbGVtZW50IGEgZ2V0V2Vla2RheSgpIG1ldGhvZCBpbiBvcmRlciB0byB0ZXN0IAorCS8vdmFsaWRpdHkgb2YgaW5wdXQgc3RyaW5ncyBjb250YWluaW5nICdFRUUnIG9yICdFRUVFJy4uLgorCisJcmV0dXJuIHJlc3VsdDsgLypEYXRlKi8KK307CisKK2Z1bmN0aW9uIF9wcm9jZXNzUGF0dGVybihwYXR0ZXJuLCBhcHBseVBhdHRlcm4sIGFwcGx5TGl0ZXJhbCwgYXBwbHlBbGwpeworCS8vIFByb2Nlc3MgYSBwYXR0ZXJuIHdpdGggbGl0ZXJhbHMgaW4gaXQKKwkvLyBCcmVhayB1cCBvbiBzaW5nbGUgcXVvdGVzLCB0cmVhdCBldmVyeSBvdGhlciBvbmUgYXMgYSBsaXRlcmFsLCBleGNlcHQgJycgd2hpY2ggYmVjb21lcyAnCisJdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCl7cmV0dXJuIHg7fTsKKwlhcHBseVBhdHRlcm4gPSBhcHBseVBhdHRlcm4gfHwgaWRlbnRpdHk7CisJYXBwbHlMaXRlcmFsID0gYXBwbHlMaXRlcmFsIHx8IGlkZW50aXR5OworCWFwcGx5QWxsID0gYXBwbHlBbGwgfHwgaWRlbnRpdHk7CisKKwkvL3NwbGl0IG9uIHNpbmdsZSBxdW90ZXMgKHdoaWNoIGVzY2FwZSBsaXRlcmFscyBpbiBkYXRlIGZvcm1hdCBzdHJpbmdzKSAKKwkvL2J1dCBwcmVzZXJ2ZSBlc2NhcGVkIHNpbmdsZSBxdW90ZXMgKGUuZy4sIG8nJ2Nsb2NrKQorCXZhciBjaHVua3MgPSBwYXR0ZXJuLm1hdGNoKC8oJyd8W14nXSkrL2cpOyAKKwl2YXIgbGl0ZXJhbCA9IGZhbHNlOworCisJZm9yKHZhciBpPTA7IGk8Y2h1bmtzLmxlbmd0aDsgaSsrKXsKKwkJaWYoIWNodW5rc1tpXSl7CisJCQljaHVua3NbaV09Jyc7CisJCX0gZWxzZSB7CisJCQljaHVua3NbaV09KGxpdGVyYWwgPyBhcHBseUxpdGVyYWwgOiBhcHBseVBhdHRlcm4pKGNodW5rc1tpXSk7CisJCQlsaXRlcmFsID0gIWxpdGVyYWw7CisJCX0KKwl9CisJcmV0dXJuIGFwcGx5QWxsKGNodW5rcy5qb2luKCcnKSk7Cit9CisKK2Z1bmN0aW9uIF9idWlsZERhdGVUaW1lUkUoZ3JvdXBzLCBpbmZvLCBvcHRpb25zLCBwYXR0ZXJuKXsKKwlyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC8oW2Etel0pXDEqL2lnLCBmdW5jdGlvbihtYXRjaCl7CisJCS8vIEJ1aWxkIGEgc2ltcGxlIHJlZ2V4cCB3aXRob3V0IHBhcmVudGhlc2lzLCB3aGljaCB3b3VsZCBydWluIHRoZSBtYXRjaCBsaXN0CisJCXZhciBzOworCQl2YXIgYyA9IG1hdGNoLmNoYXJBdCgwKTsKKwkJdmFyIGwgPSBtYXRjaC5sZW5ndGg7CisJCXN3aXRjaChjKXsKKwkJCWNhc2UgJ3knOgorCQkJCXMgPSAnXFxkJyArICgobD09MikgPyAnezIsNH0nIDogJysnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgorCQkJCXMgPSAobD4yKSA/ICdcXFMrJyA6ICdcXGR7MSwyfSc7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQlzID0gJ1xcZHsxLDJ9JzsKKwkJCQlicmVhazsKKwkJICAgIGNhc2UgJ0UnOgorCQkJCXMgPSAnXFxTKyc7CisJCQkJYnJlYWs7CisJCQljYXNlICdoJzogCisJCQljYXNlICdIJzogCisJCQljYXNlICdLJzogCisJCQljYXNlICdrJzoKKwkJCQlzID0gJ1xcZHsxLDJ9JzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJY2FzZSAncyc6CisJCQkJcyA9ICdbMC01XVxcZCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdTJzoKKwkJCQlzID0gJ1xcZHsxLDN9JzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2EnOgorCQkJCXZhciBhbSA9IG9wdGlvbnMuYW0gfHwgaW5mby5hbSB8fCAnQU0nOworCQkJCXZhciBwbSA9IG9wdGlvbnMucG0gfHwgaW5mby5wbSB8fCAnUE0nOworCQkJCWlmKG9wdGlvbnMuc3RyaWN0KXsKKwkJCQkJcyA9IGFtICsgJ3wnICsgcG07CisJCQkJfWVsc2V7CisJCQkJCXMgPSBhbTsKKwkJCQkJcyArPSAoYW0gIT0gYW0udG9Mb3dlckNhc2UoKSkgPyAnfCcgKyBhbS50b0xvd2VyQ2FzZSgpIDogJyc7CisJCQkJCXMgKz0gJ3wnOworCQkJCQlzICs9IChwbSAhPSBwbS50b0xvd2VyQ2FzZSgpKSA/IHBtICsgJ3wnICsgcG0udG9Mb3dlckNhc2UoKSA6IHBtOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZG9qby51bmltcGxlbWVudGVkKCJwYXJzZSBvZiBkYXRlIGZvcm1hdCwgcGF0dGVybj0iICsgcGF0dGVybik7CisJCX0KKworCQlpZihncm91cHMpeyBncm91cHMucHVzaChtYXRjaCk7IH0KKworLy9GSVhNRTogcmVwbGFjZSB3aGl0ZXNwYWNlIHdpdGhpbiBmaW5hbCByZWdleHAgd2l0aCBtb3JlIGZsZXhpYmxlIHdoaXRlc3BhY2UgbWF0Y2ggaW5zdGVhZD8KKwkJLy90b2xlcmF0ZSB3aGl0ZXNwYWNlCisJCXJldHVybiAnXFxzKignICsgcyArICcpXFxzKic7CisJfSk7Cit9Cit9KSgpOworCisvL1RPRE86IHRyeSB0byBjb21tb24gc3RyZnRpbWUgYW5kIGZvcm1hdCBjb2RlIHNvbWVob3c/CisKK2Rvam8uZGF0ZS5zdHJmdGltZSA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCwgLypTdHJpbmcqL2Zvcm1hdCwgLypTdHJpbmc/Ki9sb2NhbGUpeworLy8KKy8vIHN1bW1hcnk6CisvLwkJRm9ybWF0cyB0aGUgZGF0ZSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmljYXRpb25zIG9mIHRoZSBQT1NJWCBzdHJmdGltZSBmdW5jdGlvbgorLy8KKy8vIGRlc2NyaXB0aW9uOgorLy8JCXNlZSA8aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA4Nzk5L3hzaC9zdHJmdGltZS5odG1sPgorCisJLy8gemVybyBwYWQKKwl2YXIgcGFkQ2hhciA9IG51bGw7CisJZnVuY3Rpb24gXyhzLCBuKXsKKwkJcmV0dXJuIGRvam8uc3RyaW5nLnBhZChzLCBuIHx8IDIsIHBhZENoYXIgfHwgIjAiKTsKKwl9CisKKwl2YXIgaW5mbyA9IGRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKGxvY2FsZSk7CisKKwlmdW5jdGlvbiAkKHByb3BlcnR5KXsKKwkJc3dpdGNoIChwcm9wZXJ0eSl7CisJCQljYXNlICJhIjogLy8gYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUKKwkJCQlyZXR1cm4gZG9qby5kYXRlLmdldERheVNob3J0TmFtZShkYXRlT2JqZWN0LCBsb2NhbGUpOworCisJCQljYXNlICJBIjogLy8gZnVsbCB3ZWVrZGF5IG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZQorCQkJCXJldHVybiBkb2pvLmRhdGUuZ2V0RGF5TmFtZShkYXRlT2JqZWN0LCBsb2NhbGUpOworCisJCQljYXNlICJiIjoKKwkJCWNhc2UgImgiOiAvLyBhYmJyZXZpYXRlZCBtb250aCBuYW1lIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUKKwkJCQlyZXR1cm4gZG9qby5kYXRlLmdldE1vbnRoU2hvcnROYW1lKGRhdGVPYmplY3QsIGxvY2FsZSk7CisJCQkJCisJCQljYXNlICJCIjogLy8gZnVsbCBtb250aCBuYW1lIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUKKwkJCQlyZXR1cm4gZG9qby5kYXRlLmdldE1vbnRoTmFtZShkYXRlT2JqZWN0LCBsb2NhbGUpOworCQkJCQorCQkJY2FzZSAiYyI6IC8vIHByZWZlcnJlZCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudAorCQkJCSAgICAgIC8vIGxvY2FsZQorCQkJCXJldHVybiBkb2pvLmRhdGUuZm9ybWF0KGRhdGVPYmplY3QsIHtsb2NhbGU6IGxvY2FsZX0pOworCisJCQljYXNlICJDIjogLy8gY2VudHVyeSBudW1iZXIgKHRoZSB5ZWFyIGRpdmlkZWQgYnkgMTAwIGFuZCB0cnVuY2F0ZWQKKwkJCQkgICAgICAvLyB0byBhbiBpbnRlZ2VyLCByYW5nZSAwMCB0byA5OSkKKwkJCQlyZXR1cm4gXyhNYXRoLmZsb29yKGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKS8xMDApKTsKKwkJCQkKKwkJCWNhc2UgImQiOiAvLyBkYXkgb2YgdGhlIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDAxIHRvIDMxKQorCQkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0RGF0ZSgpKTsKKwkJCQkKKwkJCWNhc2UgIkQiOiAvLyBzYW1lIGFzICVtLyVkLyV5CisJCQkJcmV0dXJuICQoIm0iKSArICIvIiArICQoImQiKSArICIvIiArICQoInkiKTsKKwkJCQkJCisJCQljYXNlICJlIjogLy8gZGF5IG9mIHRoZSBtb250aCBhcyBhIGRlY2ltYWwgbnVtYmVyLCBhIHNpbmdsZSBkaWdpdCBpcworCQkJCSAgICAgIC8vIHByZWNlZGVkIGJ5IGEgc3BhY2UgKHJhbmdlICcgMScgdG8gJzMxJykKKwkJCQlpZihwYWRDaGFyID09IG51bGwpeyBwYWRDaGFyID0gIiAiOyB9CisJCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXREYXRlKCkpOworCQkJCisJCQljYXNlICJmIjogLy8gbW9udGggYXMgYSBkZWNpbWFsIG51bWJlciwgYSBzaW5nbGUgZGlnaXQgaXMKKwkJCQkJCQkvLyBwcmVjZWRlZCBieSBhIHNwYWNlIChyYW5nZSAnIDEnIHRvICcxMicpCisJCQkJaWYocGFkQ2hhciA9PSBudWxsKXsgcGFkQ2hhciA9ICIgIjsgfQorCQkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0TW9udGgoKSsxKTsJCQkJCisJCQkKKwkJCWNhc2UgImciOiAvLyBsaWtlICVHLCBidXQgd2l0aG91dCB0aGUgY2VudHVyeS4KKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSAiRyI6IC8vIFRoZSA0LWRpZ2l0IHllYXIgY29ycmVzcG9uZGluZyB0byB0aGUgSVNPIHdlZWsgbnVtYmVyCisJCQkJICAgICAgLy8gKHNlZSAlVikuICBUaGlzIGhhcyB0aGUgc2FtZSBmb3JtYXQgYW5kIHZhbHVlIGFzICVZLAorCQkJCSAgICAgIC8vIGV4Y2VwdCB0aGF0IGlmIHRoZSBJU08gd2VlayBudW1iZXIgYmVsb25ncyB0byB0aGUKKwkJCQkgICAgICAvLyBwcmV2aW91cyBvciBuZXh0IHllYXIsIHRoYXQgeWVhciBpcyB1c2VkIGluc3RlYWQuCisJCQkJZG9qby51bmltcGxlbWVudGVkKCJ1bmltcGxlbWVudGVkIG1vZGlmaWVyICdHJyIpOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlICJGIjogLy8gc2FtZSBhcyAlWS0lbS0lZAorCQkJCXJldHVybiAkKCJZIikgKyAiLSIgKyAkKCJtIikgKyAiLSIgKyAkKCJkIik7CisJCQkJCisJCQljYXNlICJIIjogLy8gaG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyIHVzaW5nIGEgMjQtaG91ciBjbG9jayAocmFuZ2UKKwkJCQkgICAgICAvLyAwMCB0byAyMykKKwkJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldEhvdXJzKCkpOworCQkJCQorCQkJY2FzZSAiSSI6IC8vIGhvdXIgYXMgYSBkZWNpbWFsIG51bWJlciB1c2luZyBhIDEyLWhvdXIgY2xvY2sgKHJhbmdlCisJCQkJICAgICAgLy8gMDEgdG8gMTIpCisJCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXRIb3VycygpICUgMTIgfHwgMTIpOworCQkJCQorCQkJY2FzZSAiaiI6IC8vIGRheSBvZiB0aGUgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyIChyYW5nZSAwMDEgdG8gMzY2KQorCQkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXREYXlPZlllYXIoZGF0ZU9iamVjdCksIDMpOworCQkJCQorCQkJY2FzZSAiayI6IC8vIEhvdXIgYXMgYSBkZWNpbWFsIG51bWJlciB1c2luZyBhIDI0LWhvdXIgY2xvY2sgKHJhbmdlCisJCQkJCSAgLy8gMCB0byAyMyAoc3BhY2UtcGFkZGVkKSkKKwkJCQlpZiAocGFkQ2hhciA9PSBudWxsKSB7IHBhZENoYXIgPSAiICI7IH0KKwkJCQlyZXR1cm4gXyhkYXRlT2JqZWN0LmdldEhvdXJzKCkpOworCisJCQljYXNlICJsIjogLy8gSG91ciBhcyBhIGRlY2ltYWwgbnVtYmVyIHVzaW5nIGEgMTItaG91ciBjbG9jayAocmFuZ2UKKwkJCQkJICAvLyAxIHRvIDEyIChzcGFjZS1wYWRkZWQpKQorCQkJCWlmIChwYWRDaGFyID09IG51bGwpIHsgcGFkQ2hhciA9ICIgIjsgfQorCQkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKTsKKwkJCQorCQkJY2FzZSAibSI6IC8vIG1vbnRoIGFzIGEgZGVjaW1hbCBudW1iZXIgKHJhbmdlIDAxIHRvIDEyKQorCQkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0TW9udGgoKSArIDEpOworCQkJCQorCQkJY2FzZSAiTSI6IC8vIG1pbnV0ZSBhcyBhIGRlY2ltYWwgbnVtYmVyCisJCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXRNaW51dGVzKCkpOworCQkJCisJCQljYXNlICJuIjoKKwkJCQlyZXR1cm4gIlxuIjsKKworCQkJY2FzZSAicCI6IC8vIGVpdGhlciBgYW0nIG9yIGBwbScgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0aW1lIHZhbHVlLAorCQkJCSAgICAgIC8vIG9yIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxvY2FsZQorCQkJCXJldHVybiBpbmZvW2RhdGVPYmplY3QuZ2V0SG91cnMoKSA8IDEyID8gImFtIiA6ICJwbSJdOworCQkJCQorCQkJY2FzZSAiciI6IC8vIHRpbWUgaW4gYS5tLiBhbmQgcC5tLiBub3RhdGlvbgorCQkJCXJldHVybiAkKCJJIikgKyAiOiIgKyAkKCJNIikgKyAiOiIgKyAkKCJTIikgKyAiICIgKyAkKCJwIik7CisJCQkJCisJCQljYXNlICJSIjogLy8gdGltZSBpbiAyNCBob3VyIG5vdGF0aW9uCisJCQkJcmV0dXJuICQoIkgiKSArICI6IiArICQoIk0iKTsKKwkJCQkKKwkJCWNhc2UgIlMiOiAvLyBzZWNvbmQgYXMgYSBkZWNpbWFsIG51bWJlcgorCQkJCXJldHVybiBfKGRhdGVPYmplY3QuZ2V0U2Vjb25kcygpKTsKKworCQkJY2FzZSAidCI6CisJCQkJcmV0dXJuICJcdCI7CisKKwkJCWNhc2UgIlQiOiAvLyBjdXJyZW50IHRpbWUsIGVxdWFsIHRvICVIOiVNOiVTCisJCQkJcmV0dXJuICQoIkgiKSArICI6IiArICQoIk0iKSArICI6IiArICQoIlMiKTsKKwkJCQkKKwkJCWNhc2UgInUiOiAvLyB3ZWVrZGF5IGFzIGEgZGVjaW1hbCBudW1iZXIgWzEsN10sIHdpdGggMSByZXByZXNlbnRpbmcKKwkJCQkgICAgICAvLyBNb25kYXkKKwkJCQlyZXR1cm4gU3RyaW5nKGRhdGVPYmplY3QuZ2V0RGF5KCkgfHwgNyk7CisJCQkJCisJCQljYXNlICJVIjogLy8gd2VlayBudW1iZXIgb2YgdGhlIGN1cnJlbnQgeWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyLAorCQkJCSAgICAgIC8vIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IFN1bmRheSBhcyB0aGUgZmlyc3QgZGF5IG9mIHRoZQorCQkJCSAgICAgIC8vIGZpcnN0IHdlZWsKKwkJCQlyZXR1cm4gXyhkb2pvLmRhdGUuZ2V0V2Vla09mWWVhcihkYXRlT2JqZWN0KSk7CisKKwkJCWNhc2UgIlYiOiAvLyB3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAoTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgdGhlCisJCQkJICAgICAgLy8gd2VlaykgYXMgYSBkZWNpbWFsIG51bWJlciBbMDEsNTNdLiBJZiB0aGUgd2VlayBjb250YWluaW5nCisJCQkJICAgICAgLy8gMSBKYW51YXJ5IGhhcyBmb3VyIG9yIG1vcmUgZGF5cyBpbiB0aGUgbmV3IHllYXIsIHRoZW4gaXQgCisJCQkJICAgICAgLy8gaXMgY29uc2lkZXJlZCB3ZWVrIDEuIE90aGVyd2lzZSwgaXQgaXMgdGhlIGxhc3Qgd2VlayBvZiAKKwkJCQkgICAgICAvLyB0aGUgcHJldmlvdXMgeWVhciwgYW5kIHRoZSBuZXh0IHdlZWsgaXMgd2VlayAxLgorCQkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXRJc29XZWVrT2ZZZWFyKGRhdGVPYmplY3QpKTsKKwkJCQkKKwkJCWNhc2UgIlciOiAvLyB3ZWVrIG51bWJlciBvZiB0aGUgY3VycmVudCB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIsCisJCQkJICAgICAgLy8gc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgTW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgdGhlCisJCQkJICAgICAgLy8gZmlyc3Qgd2VlaworCQkJCXJldHVybiBfKGRvam8uZGF0ZS5nZXRXZWVrT2ZZZWFyKGRhdGVPYmplY3QsIDEpKTsKKwkJCQkKKwkJCWNhc2UgInciOiAvLyBkYXkgb2YgdGhlIHdlZWsgYXMgYSBkZWNpbWFsLCBTdW5kYXkgYmVpbmcgMAorCQkJCXJldHVybiBTdHJpbmcoZGF0ZU9iamVjdC5nZXREYXkoKSk7CisKKwkJCWNhc2UgIngiOiAvLyBwcmVmZXJyZWQgZGF0ZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlCisJCQkJICAgICAgLy8gd2l0aG91dCB0aGUgdGltZQorCQkJCXJldHVybiBkb2pvLmRhdGUuZm9ybWF0KGRhdGVPYmplY3QsIHtzZWxlY3RvcjonZGF0ZU9ubHknLCBsb2NhbGU6bG9jYWxlfSk7CisKKwkJCWNhc2UgIlgiOiAvLyBwcmVmZXJyZWQgdGltZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlCisJCQkJICAgICAgLy8gd2l0aG91dCB0aGUgZGF0ZQorCQkJCXJldHVybiBkb2pvLmRhdGUuZm9ybWF0KGRhdGVPYmplY3QsIHtzZWxlY3RvcjondGltZU9ubHknLCBsb2NhbGU6bG9jYWxlfSk7CisKKwkJCWNhc2UgInkiOiAvLyB5ZWFyIGFzIGEgZGVjaW1hbCBudW1iZXIgd2l0aG91dCBhIGNlbnR1cnkgKHJhbmdlIDAwIHRvCisJCQkJICAgICAgLy8gOTkpCisJCQkJcmV0dXJuIF8oZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpJTEwMCk7CisJCQkJCisJCQljYXNlICJZIjogLy8geWVhciBhcyBhIGRlY2ltYWwgbnVtYmVyIGluY2x1ZGluZyB0aGUgY2VudHVyeQorCQkJCXJldHVybiBTdHJpbmcoZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpKTsKKwkJCQorCQkJY2FzZSAieiI6IC8vIHRpbWUgem9uZSBvciBuYW1lIG9yIGFiYnJldmlhdGlvbgorCQkJCXZhciB0aW1lem9uZU9mZnNldCA9IGRhdGVPYmplY3QuZ2V0VGltZXpvbmVPZmZzZXQoKTsKKwkJCQlyZXR1cm4gKHRpbWV6b25lT2Zmc2V0ID4gMCA/ICItIiA6ICIrIikgKyAKKwkJCQkJXyhNYXRoLmZsb29yKE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0KS82MCkpICsgIjoiICsKKwkJCQkJXyhNYXRoLmFicyh0aW1lem9uZU9mZnNldCklNjApOworCisJCQljYXNlICJaIjogLy8gdGltZSB6b25lIG9yIG5hbWUgb3IgYWJicmV2aWF0aW9uCisJCQkJcmV0dXJuIGRvam8uZGF0ZS5nZXRUaW1lem9uZU5hbWUoZGF0ZU9iamVjdCk7CisJCQkKKwkJCWNhc2UgIiUiOgorCQkJCXJldHVybiAiJSI7CisJCX0KKwl9CisKKwkvLyBwYXJzZSB0aGUgZm9ybWF0dGluZyBzdHJpbmcgYW5kIGNvbnN0cnVjdCB0aGUgcmVzdWx0aW5nIHN0cmluZworCXZhciBzdHJpbmcgPSAiIjsKKwl2YXIgaSA9IDA7CisJdmFyIGluZGV4ID0gMDsKKwl2YXIgc3dpdGNoQ2FzZSA9IG51bGw7CisJd2hpbGUgKChpbmRleCA9IGZvcm1hdC5pbmRleE9mKCIlIiwgaSkpICE9IC0xKXsKKwkJc3RyaW5nICs9IGZvcm1hdC5zdWJzdHJpbmcoaSwgaW5kZXgrKyk7CisJCQorCQkvLyBpbnNwZWN0IG1vZGlmaWVyIGZsYWcKKwkJc3dpdGNoIChmb3JtYXQuY2hhckF0KGluZGV4KyspKSB7CisJCQljYXNlICJfIjogLy8gUGFkIGEgbnVtZXJpYyByZXN1bHQgc3RyaW5nIHdpdGggc3BhY2VzLgorCQkJCXBhZENoYXIgPSAiICI7IGJyZWFrOworCQkJY2FzZSAiLSI6IC8vIERvIG5vdCBwYWQgYSBudW1lcmljIHJlc3VsdCBzdHJpbmcuCisJCQkJcGFkQ2hhciA9ICIiOyBicmVhazsKKwkJCWNhc2UgIjAiOiAvLyBQYWQgYSBudW1lcmljIHJlc3VsdCBzdHJpbmcgd2l0aCB6ZXJvcy4KKwkJCQlwYWRDaGFyID0gIjAiOyBicmVhazsKKwkJCWNhc2UgIl4iOiAvLyBDb252ZXJ0IGNoYXJhY3RlcnMgaW4gcmVzdWx0IHN0cmluZyB0byB1cHBlcmNhc2UuCisJCQkJc3dpdGNoQ2FzZSA9ICJ1cHBlciI7IGJyZWFrOworCQkJY2FzZSAiKiI6IC8vIENvbnZlcnQgY2hhcmFjdGVycyBpbiByZXN1bHQgc3RyaW5nIHRvIGxvd2VyY2FzZQorCQkJCXN3aXRjaENhc2UgPSAibG93ZXIiOyBicmVhazsKKwkJCWNhc2UgIiMiOiAvLyBTd2FwIHRoZSBjYXNlIG9mIHRoZSByZXN1bHQgc3RyaW5nLgorCQkJCXN3aXRjaENhc2UgPSAic3dhcCI7IGJyZWFrOworCQkJZGVmYXVsdDogLy8gbm8gbW9kaWZpZXIgZmxhZyBzbyBkZWNyZW1lbnQgdGhlIGluZGV4CisJCQkJcGFkQ2hhciA9IG51bGw7IGluZGV4LS07IGJyZWFrOworCQl9CisKKwkJLy8gdG9nZ2xlIGNhc2UgaWYgYSBmbGFnIGlzIHNldAorCQl2YXIgcHJvcGVydHkgPSAkKGZvcm1hdC5jaGFyQXQoaW5kZXgrKykpOworCQlzd2l0Y2ggKHN3aXRjaENhc2UpeworCQkJY2FzZSAidXBwZXIiOgorCQkJCXByb3BlcnR5ID0gcHJvcGVydHkudG9VcHBlckNhc2UoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImxvd2VyIjoKKwkJCQlwcm9wZXJ0eSA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCk7CisJCQkJYnJlYWs7CisJCQljYXNlICJzd2FwIjogLy8gVXBwZXIgdG8gbG93ZXIsIGFuZCB2ZXJzZXktdmljZWEKKwkJCQl2YXIgY29tcGFyZVN0cmluZyA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCk7CisJCQkJdmFyIHN3YXBTdHJpbmcgPSAnJzsKKwkJCQl2YXIgaiA9IDA7CisJCQkJdmFyIGNoID0gJyc7CisJCQkJd2hpbGUgKGogPCBwcm9wZXJ0eS5sZW5ndGgpeworCQkJCQljaCA9IHByb3BlcnR5LmNoYXJBdChqKTsKKwkJCQkJc3dhcFN0cmluZyArPSAoY2ggPT0gY29tcGFyZVN0cmluZy5jaGFyQXQoaikpID8KKwkJCQkJCWNoLnRvVXBwZXJDYXNlKCkgOiBjaC50b0xvd2VyQ2FzZSgpOworCQkJCQlqKys7CisJCQkJfQorCQkJCXByb3BlcnR5ID0gc3dhcFN0cmluZzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoQ2FzZSA9IG51bGw7CisJCQorCQlzdHJpbmcgKz0gcHJvcGVydHk7CisJCWkgPSBpbmRleDsKKwl9CisJc3RyaW5nICs9IGZvcm1hdC5zdWJzdHJpbmcoaSk7CisJCisJcmV0dXJuIHN0cmluZzsgLy8gU3RyaW5nCit9OworCisoZnVuY3Rpb24oKXsKK3ZhciBfY3VzdG9tRm9ybWF0cyA9IFtdOworZG9qby5kYXRlLmFkZEN1c3RvbUZvcm1hdHMgPSBmdW5jdGlvbigvKlN0cmluZyovcGFja2FnZU5hbWUsIC8qU3RyaW5nKi9idW5kbGVOYW1lKXsKKy8vCisvLyBzdW1tYXJ5OgorLy8JCUFkZCBhIHJlZmVyZW5jZSB0byBhIGJ1bmRsZSBjb250YWluaW5nIGxvY2FsaXplZCBjdXN0b20gZm9ybWF0cyB0byBiZQorLy8JCXVzZWQgYnkgZGF0ZS90aW1lIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgcm91dGluZXMuCisvLworLy8gZGVzY3JpcHRpb246CisvLwkJVGhlIHVzZXIgbWF5IGFkZCBjdXN0b20gbG9jYWxpemVkIGZvcm1hdHMgd2hlcmUgdGhlIGJ1bmRsZSBoYXMgcHJvcGVydGllcyBmb2xsb3dpbmcgdGhlCisvLwkJc2FtZSBuYW1pbmcgY29udmVudGlvbiB1c2VkIGJ5IGRvam8gZm9yIHRoZSBDTERSIGRhdGE6IGRhdGVGb3JtYXQteHh4eCAvIHRpbWVGb3JtYXQteHh4eAorLy8JCVRoZSBwYXR0ZXJuIHN0cmluZyBzaG91bGQgbWF0Y2ggdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBDTERSLgorLy8JCVNlZSBkb2pvLmRhdGUuZm9ybWF0IGZvciBkZXRhaWxzLgorLy8JCVRoZSByZXNvdXJjZXMgbXVzdCBiZSBsb2FkZWQgYnkgZG9qby5yZXF1aXJlTG9jYWxpemF0aW9uKCkgcHJpb3IgdG8gdXNlCisKKwlfY3VzdG9tRm9ybWF0cy5wdXNoKHtwa2c6cGFja2FnZU5hbWUsbmFtZTpidW5kbGVOYW1lfSk7Cit9OworCitkb2pvLmRhdGUuX2dldEdyZWdvcmlhbkJ1bmRsZSA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9sb2NhbGUpeworCXZhciBncmVnb3JpYW4gPSB7fTsKKwlkb2pvLmxhbmcuZm9yRWFjaChfY3VzdG9tRm9ybWF0cywgZnVuY3Rpb24oZGVzYyl7CisJCXZhciBidW5kbGUgPSBkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKGRlc2MucGtnLCBkZXNjLm5hbWUsIGxvY2FsZSk7CisJCWdyZWdvcmlhbiA9IGRvam8ubGFuZy5taXhpbihncmVnb3JpYW4sIGJ1bmRsZSk7CisJfSwgdGhpcyk7CisJcmV0dXJuIGdyZWdvcmlhbjsgLypPYmplY3QqLworfTsKK30pKCk7CisKK2Rvam8uZGF0ZS5hZGRDdXN0b21Gb3JtYXRzKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCJncmVnb3JpYW4iKTsKK2Rvam8uZGF0ZS5hZGRDdXN0b21Gb3JtYXRzKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCJncmVnb3JpYW5FeHRyYXMiKTsKKworZG9qby5kYXRlLmdldE5hbWVzID0gZnVuY3Rpb24oLypTdHJpbmcqL2l0ZW0sIC8qU3RyaW5nKi90eXBlLCAvKlN0cmluZz8qL3VzZSwgLypTdHJpbmc/Ki9sb2NhbGUpeworLy8KKy8vIHN1bW1hcnk6CisvLwkJVXNlZCB0byBnZXQgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGRheSBvciBtb250aCBuYW1lcy4KKy8vCisvLyBpdGVtOiAnbW9udGhzJyB8fCAnZGF5cycKKy8vIHR5cGU6ICd3aWRlJyB8fCAnbmFycm93JyB8fCAnYWJicicgKGUuZy4gIk1vbmRheSIsICJNb24iLCBvciAiTSIgcmVzcGVjdGl2ZWx5LCBpbiBFbmdsaXNoKQorLy8gdXNlOiAnc3RhbmRBbG9uZScgfHwgJ2Zvcm1hdCcgKGRlZmF1bHQpCisvLyBsb2NhbGU6IG92ZXJyaWRlIGxvY2FsZSB1c2VkIHRvIGZpbmQgdGhlIG5hbWVzCisKKwl2YXIgbGFiZWw7CisJdmFyIGxvb2t1cCA9IGRvam8uZGF0ZS5fZ2V0R3JlZ29yaWFuQnVuZGxlKGxvY2FsZSk7CisJdmFyIHByb3BzID0gW2l0ZW0sIHVzZSwgdHlwZV07CisJaWYodXNlID09ICdzdGFuZEFsb25lJyl7CisJCWxhYmVsID0gbG9va3VwW3Byb3BzLmpvaW4oJy0nKV07CisJfQorCXByb3BzWzFdID0gJ2Zvcm1hdCc7CisKKwkvLyByZXR1cm4gYnkgY29weSBzbyBjaGFuZ2VzIHdvbid0IGJlIG1hZGUgYWNjaWRlbnRhbGx5IHRvIHRoZSBpbi1tZW1vcnkgbW9kZWwKKwlyZXR1cm4gKGxhYmVsIHx8IGxvb2t1cFtwcm9wcy5qb2luKCctJyldKS5jb25jYXQoKTsgLypBcnJheSovCit9OworCisvLyBDb252ZW5pZW5jZSBtZXRob2RzCisKK2Rvam8uZGF0ZS5nZXREYXlOYW1lID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKlN0cmluZz8qL2xvY2FsZSl7CisvLyBzdW1tYXJ5OiBnZXRzIHRoZSBmdWxsIGxvY2FsaXplZCBkYXkgb2YgdGhlIHdlZWsgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0ZSBvYmplY3QKKwlyZXR1cm4gZG9qby5kYXRlLmdldE5hbWVzKCdkYXlzJywgJ3dpZGUnLCAnZm9ybWF0JywgbG9jYWxlKVtkYXRlT2JqZWN0LmdldERheSgpXTsgLypTdHJpbmcqLworfTsKKworZG9qby5kYXRlLmdldERheVNob3J0TmFtZSA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCwgLypTdHJpbmc/Ki9sb2NhbGUpeworLy8gc3VtbWFyeTogZ2V0cyB0aGUgYWJicmV2aWF0ZWQgbG9jYWxpemVkIGRheSBvZiB0aGUgd2VlayBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRlIG9iamVjdAorCXJldHVybiBkb2pvLmRhdGUuZ2V0TmFtZXMoJ2RheXMnLCAnYWJicicsICdmb3JtYXQnLCBsb2NhbGUpW2RhdGVPYmplY3QuZ2V0RGF5KCldOyAvKlN0cmluZyovCit9OworCitkb2pvLmRhdGUuZ2V0TW9udGhOYW1lID0gZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqZWN0LCAvKlN0cmluZz8qL2xvY2FsZSl7CisvLyBzdW1tYXJ5OiBnZXRzIHRoZSBmdWxsIGxvY2FsaXplZCBtb250aCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGUgb2JqZWN0CisJcmV0dXJuIGRvam8uZGF0ZS5nZXROYW1lcygnbW9udGhzJywgJ3dpZGUnLCAnZm9ybWF0JywgbG9jYWxlKVtkYXRlT2JqZWN0LmdldE1vbnRoKCldOyAvKlN0cmluZyovCit9OworCitkb2pvLmRhdGUuZ2V0TW9udGhTaG9ydE5hbWUgPSBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmplY3QsIC8qU3RyaW5nPyovbG9jYWxlKXsKKy8vIHN1bW1hcnk6IGdldHMgdGhlIGFiYnJldmlhdGVkIGxvY2FsaXplZCBtb250aCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGUgb2JqZWN0CisJcmV0dXJuIGRvam8uZGF0ZS5nZXROYW1lcygnbW9udGhzJywgJ2FiYnInLCAnZm9ybWF0JywgbG9jYWxlKVtkYXRlT2JqZWN0LmdldE1vbnRoKCldOyAvKlN0cmluZyovCit9OworCisvL0ZJWE1FOiBub3QgbG9jYWxpemVkCitkb2pvLmRhdGUudG9SZWxhdGl2ZVN0cmluZyA9IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iamVjdCl7CisvLyBzdW1tYXJ5OgorLy8JUmV0dXJucyBhbiBkZXNjcmlwdGlvbiBpbiBFbmdsaXNoIG9mIHRoZSBkYXRlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRhdGUuICBOb3RlOiB0aGlzIGlzIG5vdCBsb2NhbGl6ZWQgeWV0LiAgRW5nbGlzaCBvbmx5LgorLy8KKy8vIGRlc2NyaXB0aW9uOiBFeGFtcGxlIHJldHVybnM6CisvLwkgLSAiMSBtaW51dGUgYWdvIgorLy8JIC0gIjQgbWludXRlcyBhZ28iCisvLwkgLSAiWWVzdGVyZGF5IgorLy8JIC0gIjIgZGF5cyBhZ28iCisKKwl2YXIgbm93ID0gbmV3IERhdGUoKTsKKwl2YXIgZGlmZiA9IChub3cgLSBkYXRlT2JqZWN0KSAvIDEwMDA7CisJdmFyIGVuZCA9ICIgYWdvIjsKKwl2YXIgZnV0dXJlID0gZmFsc2U7CisJaWYoZGlmZiA8IDApeworCQlmdXR1cmUgPSB0cnVlOworCQllbmQgPSAiIGZyb20gbm93IjsKKwkJZGlmZiA9IC1kaWZmOworCX0KKworCWlmKGRpZmYgPCA2MCl7CisJCWRpZmYgPSBNYXRoLnJvdW5kKGRpZmYpOworCQlyZXR1cm4gZGlmZiArICIgc2Vjb25kIiArIChkaWZmID09IDEgPyAiIiA6ICJzIikgKyBlbmQ7CisJfQorCWlmKGRpZmYgPCA2MCo2MCl7CisJCWRpZmYgPSBNYXRoLnJvdW5kKGRpZmYvNjApOworCQlyZXR1cm4gZGlmZiArICIgbWludXRlIiArIChkaWZmID09IDEgPyAiIiA6ICJzIikgKyBlbmQ7CisJfQorCWlmKGRpZmYgPCA2MCo2MCoyNCl7CisJCWRpZmYgPSBNYXRoLnJvdW5kKGRpZmYvMzYwMCk7CisJCXJldHVybiBkaWZmICsgIiBob3VyIiArIChkaWZmID09IDEgPyAiIiA6ICJzIikgKyBlbmQ7CisJfQorCWlmKGRpZmYgPCA2MCo2MCoyNCo3KXsKKwkJZGlmZiA9IE1hdGgucm91bmQoZGlmZi8oMzYwMCoyNCkpOworCQlpZihkaWZmID09IDEpeworCQkJcmV0dXJuIGZ1dHVyZSA/ICJUb21vcnJvdyIgOiAiWWVzdGVyZGF5IjsKKwkJfWVsc2V7CisJCQlyZXR1cm4gZGlmZiArICIgZGF5cyIgKyBlbmQ7CisJCX0KKwl9CisJcmV0dXJuIGRvam8uZGF0ZS5mb3JtYXQoZGF0ZU9iamVjdCk7IC8vIFN0cmluZworfTsKKworLy9GSVhNRTogU1FMIG1ldGhvZHMgY2FuIHByb2JhYmx5IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IG1vZHVsZSB3aXRob3V0IGkxOG4gZGVwcworCitkb2pvLmRhdGUudG9TcWwgPSBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmplY3QsIC8qQm9vbGVhbj8qL25vVGltZSl7CisvLyBzdW1tYXJ5OgorLy8JQ29udmVydCBhIERhdGUgdG8gYSBTUUwgc3RyaW5nCisvLyBub1RpbWU6IHdoZXRoZXIgdG8gaWdub3JlIHRoZSB0aW1lIHBvcnRpb24gb2YgdGhlIERhdGUuICBEZWZhdWx0cyB0byBmYWxzZS4KKworCXJldHVybiBkb2pvLmRhdGUuc3RyZnRpbWUoZGF0ZU9iamVjdCwgIiVGIiArICFub1RpbWUgPyAiICVUIiA6ICIiKTsgLy8gU3RyaW5nCit9OworCitkb2pvLmRhdGUuZnJvbVNxbCA9IGZ1bmN0aW9uKC8qU3RyaW5nKi9zcWxEYXRlKXsKKy8vIHN1bW1hcnk6CisvLwlDb252ZXJ0IGEgU1FMIGRhdGUgc3RyaW5nIHRvIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdAorCisJdmFyIHBhcnRzID0gc3FsRGF0ZS5zcGxpdCgvW1wtIDpdL2cpOworCXdoaWxlKHBhcnRzLmxlbmd0aCA8IDYpeworCQlwYXJ0cy5wdXNoKDApOworCX0KKwlyZXR1cm4gbmV3IERhdGUocGFydHNbMF0sIChwYXJzZUludChwYXJ0c1sxXSwxMCktMSksIHBhcnRzWzJdLCBwYXJ0c1szXSwgcGFydHNbNF0sIHBhcnRzWzVdKTsgLy8gRGF0ZQorfTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UaW1lUGlja2VyIik7CisKKworCisKKworCisKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LlRpbWVQaWNrZXIiLAorCWRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsCisJZnVuY3Rpb24oKXsKKworCQkvKgorCQlzdW1tYXJ5OiAKKwkJCUJhc2UgY2xhc3MgZm9yIGEgc3RhbmQtYWxvbmUgVGltZVBpY2tlciB3aWRnZXQgCisJCQl3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHNlbGVjdCBhIHRpbWUuIAorCQlkZXNjcmlwdGlvbjogCisJCQlBIHN0YW5kLWFsb25lIFRpbWVQaWNrZXIgd2lkZ2V0IHRoYXQgbWFrZXMgaXQgZWFzeSB0byBzZWxlY3QgYSB0aW1lLiAKKwkJCUl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgb24gaXRzIG93biwgb3IgaW5zaWRlIG9mIG90aGVyIHdpZGdldHMKKwkJCShzZWUgZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyKSBvciBvdGhlciBzaW1pbGFyIGNvbWJpbmF0aW9uIHdpZGdldHMuIAorCQkgCSAgICAgICAgICAgICAgCisJCQlUaW1lcyBhdHRyaWJ1dGVzIHBhc3NlZCBpbiB0aGUgYFJGQyAzMzM5YCBmb3JtYXQ6CisJCQlodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMzMzOS5odG1sICgyMDA1LTA2LTMwVDA4OjA1OjAwLTA3OjAwKQorCQkJc28gdGhhdCB0aGV5IGFyZSBzZXJpYWxpemFibGUgYW5kIGxvY2FsZS1pbmRlcGVuZGVudC4KKwkJCisJCXVzYWdlOiAKKwkJCXZhciB0aW1lUGlja2VyID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJUaW1lUGlja2VyIiwge30sICAgCisJCQlkb2pvLmJ5SWQoInRpbWVQaWNrZXJOb2RlIikpOyAKKwkJIAkgCisJCQk8ZGl2IGRvam9UeXBlPSJUaW1lUGlja2VyIj48L2Rpdj4gCisJCSovCisJCisJCS8vIHRpbWU6IERhdGUKKwkJLy8Jc2VsZWN0ZWQgdGltZQorCQl0aGlzLnRpbWUgPSAiIjsKKwkJCisJCS8vIHVzZURlZmF1bHRUaW1lOiBCb29sZWFuCisJCS8vCXNldCBmb2xsb3dpbmcgZmxhZyB0byB0cnVlIGlmIGEgZGVmYXVsdCB0aW1lIHNob3VsZCBiZSBzZXQKKwkJdGhpcy51c2VEZWZhdWx0VGltZSA9IGZhbHNlOworCQkKKwkJLy8gdXNlRGVmYXVsdE1pbnV0ZXM6IEJvb2xlYW4KKwkJLy8Jc2V0IHRoZSBmb2xsb3dpbmcgdG8gdHJ1ZSB0byBzZXQgZGVmYXVsdCBtaW51dGVzIHRvIGN1cnJlbnQgdGltZSwgZmFsc2UgdG8gLy8gdXNlIHplcm8KKwkJdGhpcy51c2VEZWZhdWx0TWludXRlcyA9IGZhbHNlOworCQkKKwkJLy8gc3RvcmVkVGltZTogU3RyaW5nCisJCS8vCXJmYyAzMzM5IHRpbWUKKwkJdGhpcy5zdG9yZWRUaW1lID0gIiI7CisJCQorCQkvLyBjdXJyZW50VGltZTogT2JqZWN0CisJCS8vCXRpbWUgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBVSSwgc3RvcmVkIGluIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGluIHRoZSBmb3JtYXQgdGhhdCB3aWxsIGJlIGFjdHVhbGx5IGRpc3BsYXllZAorCQl0aGlzLmN1cnJlbnRUaW1lID0ge307CisJCQorCQl0aGlzLmNsYXNzTmFtZXMgPSB7CisJCS8vIHN1bW1hcnk6CisJCS8vCXN0b3JlcyBhIGxpc3Qgb2YgY2xhc3MgbmFtZXMgdGhhdCBtYXkgYmUgb3ZlcnJpZGVuCisJCQlzZWxlY3RlZFRpbWU6ICJzZWxlY3RlZEl0ZW0iCisJCX07CisJCQorCQl0aGlzLmFueSA9ICJhbnkiOyAvL0ZJWE1FOiBuZXZlciB1c2VkPworCQkKKwkJLy8gZG9tIG5vZGUgaW5kZWNpZXMgZm9yIHNlbGVjdGVkIGhvdXIsIG1pbnV0ZSwgYW1QbSwgYW5kICJhbnkgdGltZSBvcHRpb24iCisJCXRoaXMuc2VsZWN0ZWRUaW1lID0geworCQkJaG91cjogIiIsCisJCQltaW51dGU6ICIiLAorCQkJYW1QbTogIiIsCisJCQlhbnlUaW1lOiBmYWxzZQorCQl9OworCisJCS8vIG1pbnV0ZXMgYXJlIG9yZGVyZWQgYXMgZm9sbG93czogWyIxMiIsICI2IiwgIjEiLCAiNyIsICIyIiwgIjgiLCAiMyIsICI5IiwgIjQiLCAiMTAiLCAiNSIsICIxMSJdCisJCXRoaXMuaG91ckluZGV4TWFwID0gWyIiLCAyLCA0LCA2LCA4LCAxMCwgMSwgMywgNSwgNywgOSwgMTEsIDBdOworCQkKKwkJLy8gbWludXRlcyBhcmUgb3JkZXJlZCBhcyBmb2xsb3dzOiBbIjAwIiwgIjMwIiwgIjA1IiwgIjM1IiwgIjEwIiwgIjQwIiwgIjE1IiwgIjQ1IiwgIjIwIiwgIjUwIiwgIjI1IiwgIjU1Il0KKwkJdGhpcy5taW51dGVJbmRleE1hcCA9IFswLCAyLCA0LCA2LCA4LCAxMCwgMSwgMywgNSwgNywgOSwgMTFdOworCX0sCit7CisJaXNDb250YWluZXI6IGZhbHNlLAorCXRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwidGltZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cInRpbWVQaWNrZXJDb250YWluZXJOb2RlXCI+XHJcblx0PHRhYmxlIGNsYXNzPVwidGltZUNvbnRhaW5lclwiIGNlbGxzcGFjaW5nPVwiMFwiID5cclxuXHRcdDx0aGVhZD5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cInRpbWVDb3JuZXIgY29ybmVyVG9wTGVmdFwiIHZhbGlnbj1cInRvcFwiPiZuYnNwOzwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZUxhYmVsQ29udGFpbmVyIGhvdXJTZWxlY3RvclwiPiR7dGhpcy5jYWxlbmRhci5maWVsZC1ob3VyfTwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwidGltZUxhYmVsQ29udGFpbmVyIG1pbnV0ZXNIZWFkaW5nXCI+JHt0aGlzLmNhbGVuZGFyLmZpZWxkLW1pbnV0ZX08L3RkPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cInRpbWVDb3JuZXIgY29ybmVyVG9wUmlnaHRcIiB2YWxpZ249XCJ0b3BcIj4mbmJzcDs8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90aGVhZD5cclxuXHRcdDx0Ym9keT5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCB2YWxpZ249XCJ0b3BcIiBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiaG91cnNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBhbGlnbj1cImNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHQ8dGJvZHkgZG9qb0F0dGFjaFBvaW50PVwiaG91ckNvbnRhaW5lck5vZGVcIiAgXHJcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZEhvdXI7XCI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjEyPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD42PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD43PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4yPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD44PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4zPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD45PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD40PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xMDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+NTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTE8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdDwvdGJvZHk+XHJcblx0XHRcdFx0XHQ8L3RhYmxlPlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiIGNsYXNzPVwibWludXRlc1wiIGNvbHNwYW49XCIyXCI+XHJcblx0XHRcdFx0XHQ8dGFibGUgYWxpZ249XCJjZW50ZXJcIj5cclxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cIm1pbnV0ZUNvbnRhaW5lck5vZGVcIiBcclxuXHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkTWludXRlO1wiPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4wMDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MzA8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjA1PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4zNTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MTA8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjQwPC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD4xNTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+NDU8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjIwPC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD41MDwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+MjU8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjU1PC90ZD5cclxuXHRcdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0XHQ8L3Rib2R5PlxyXG5cdFx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8dHI+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwiY29ybmVyQm90dG9tTGVmdFwiPiZuYnNwOzwvdGQ+XHJcblx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiIGNsYXNzPVwidGltZU9wdGlvbnNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBjbGFzcz1cImFtUG1Db250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0PHRib2R5IGRvam9BdHRhY2hQb2ludD1cImFtUG1Db250YWluZXJOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25TZXRTZWxlY3RlZEFtUG07XCI+XHJcblx0XHRcdFx0XHRcdFx0PHRyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkIGlkPVwiYW1cIj4ke3RoaXMuY2FsZW5kYXIuYW19PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZCBpZD1cInBtXCI+JHt0aGlzLmNhbGVuZGFyLnBtfTwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJ0aW1lT3B0aW9uc1wiPlxyXG5cdFx0XHRcdFx0PGRpdiBkb2pvQXR0YWNoUG9pbnQ9XCJhbnlUaW1lQ29udGFpbmVyTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvblNldFNlbGVjdGVkQW55VGltZTtcIiBcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJhbnlUaW1lQ29udGFpbmVyXCI+JHt0aGlzLndpZGdldFN0cmluZ3MuYW55fTwvZGl2PlxyXG5cdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PHRkIGNsYXNzPVwiY29ybmVyQm90dG9tUmlnaHRcIj4mbmJzcDs8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Ym9keT5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIiwKKwl0ZW1wbGF0ZUNzc1N0cmluZzoiLypUaW1lIFBpY2tlciAqL1xyXG4udGltZVBpY2tlckNvbnRhaW5lciB7XHJcblx0d2lkdGg6MTIycHg7XHJcblx0Zm9udC1mYW1pbHk6VGFob21hLCBNeXJpYWQsIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XHJcblx0Zm9udC1zaXplOjE2cHg7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHtcclxuXHRib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XHJcblx0Ym9yZGVyLXNwYWNpbmc6MDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQge1xyXG5cdGNvbG9yOiMyOTNhNGI7XHJcblx0Zm9udC1zaXplOjAuOWVtO1xyXG5cdGZvbnQtd2VpZ2h0OjcwMDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQgdGQge1xyXG5cdHBhZGRpbmc6MC4yNWVtO1xyXG5cdGZvbnQtc2l6ZTowLjgwZW07XHJcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzY3ODJBODtcclxufVxyXG5cclxuLnRpbWVDb3JuZXIge1xyXG5cdHdpZHRoOjEwcHg7XHJcbn1cclxuXHJcbi5jb3JuZXJUb3BMZWZ0IHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBDdXJ2ZVRMLnBuZ1wiKSB0b3AgbGVmdCBuby1yZXBlYXQ7XHJcbn1cclxuXHJcbi5jb3JuZXJUb3BSaWdodCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUUi5wbmdcIikgdG9wIHJpZ2h0IG5vLXJlcGVhdDtcclxufVxyXG5cclxuLnRpbWVMYWJlbENvbnRhaW5lciB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwTW9udGhCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcbn1cclxuXHJcbi5ob3VycywgLm1pbnV0ZXMsIC50aW1lQm9yZGVyIHtcclxuXHRiYWNrZ3JvdW5kOiAjNzU5MWJjIHVybChcImltYWdlcy9kcEJnLmdpZlwiKSB0b3AgbGVmdCByZXBlYXQteDtcclxuXHJcbn1cclxuXHJcbi5ob3VycyB0ZCwgLm1pbnV0ZXMgdGQge1xyXG5cdHBhZGRpbmc6MC4yZW07XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC1zaXplOjAuN2VtO1xyXG5cdGZvbnQtd2VpZ2h0OmJvbGQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7XHJcblx0Y3Vyc29yOmhhbmQ7XHJcblx0Y29sb3I6I2ZmZjtcclxufVxyXG5cclxuLm1pbnV0ZXMge1xyXG5cdGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZjVkMWRiO1xyXG59XHJcblxyXG4uaG91cnMge1xyXG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgIzY3ODJBODtcclxufVxyXG5cclxuLmhvdXJTZWxlY3RvciB7XHJcblx0Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNjc4MkE4O1xyXG5cdHBhZGRpbmc6NXB4O1xyXG5cdHBhZGRpbmctcmlnaHQ6MTBweDtcclxufVxyXG5cclxuLm1pbnV0ZXNTZWxlY3RvciB7XHJcblx0cGFkZGluZzo1cHg7XHJcblx0Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNmNWM3ZDQ7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcbn1cclxuXHJcbi5taW51dGVzSGVhZGluZyB7XHJcblx0cGFkZGluZy1sZWZ0OjlweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udGltZU9wdGlvbnMge1xyXG5cdGJhY2tncm91bmQtY29sb3I6I0Y5QzlENztcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgLmNvcm5lckJvdHRvbUxlZnQsIC50aW1lQ29udGFpbmVyIC5jb3JuZXJCb3R0b21SaWdodCwgLnRpbWVDb250YWluZXIgLnRpbWVPcHRpb25zIHtcclxuXHRib3JkZXItdG9wOjFweCBzb2xpZCAjNjc4MkE4O1xyXG59XHJcblxyXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tTGVmdCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCTC5wbmdcIikgYm90dG9tIGxlZnQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7XHJcblx0d2lkdGg6OXB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzowO1xyXG5cdG1hcmdpbjowO1xyXG59XHJcblxyXG4udGltZUNvbnRhaW5lciAuY29ybmVyQm90dG9tUmlnaHQge1xyXG5cdGJhY2tncm91bmQ6IHVybChcImltYWdlcy9kcEN1cnZlQlIucG5nXCIpIGJvdHRvbSByaWdodCBuby1yZXBlYXQgIWltcG9ydGFudDtcclxuXHR3aWR0aDo5cHggIWltcG9ydGFudDtcclxuXHRwYWRkaW5nOjA7XHJcblx0bWFyZ2luOjA7XHJcbn1cclxuXHJcbi50aW1lT3B0aW9ucyB7XHJcblx0Y29sb3I6I2ZmZjtcclxuXHRiYWNrZ3JvdW5kOnVybChcImltYWdlcy9kcFllYXJCZy5wbmdcIikgdG9wIGxlZnQgcmVwZWF0LXg7XHJcblxyXG59XHJcblxyXG4uc2VsZWN0ZWRJdGVtIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7XHJcblx0Y29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4udGltZU9wdGlvbnMgLnNlbGVjdGVkSXRlbSB7XHJcblx0Y29sb3I6I2ZmZiAhaW1wb3J0YW50O1xyXG5cdGJhY2tncm91bmQtY29sb3I6IzllYzNmYiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYW55VGltZUNvbnRhaW5lciB7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC13ZWlnaHQ6Ym9sZDtcclxuXHRmb250LXNpemU6MC43ZW07XHJcblx0cGFkZGluZzowLjFlbTtcclxuXHRjdXJzb3I6cG9pbnRlcjtcclxuXHRjdXJzb3I6aGFuZDtcclxuXHRjb2xvcjojZmZmICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5hbVBtQ29udGFpbmVyIHtcclxuXHR3aWR0aDoxMDAlO1xyXG59XHJcblxyXG4uYW1QbUNvbnRhaW5lciB0ZCB7XHJcblx0dGV4dC1hbGlnbjpjZW50ZXI7XHJcblx0Zm9udC1zaXplOjAuN2VtO1xyXG5cdGZvbnQtd2VpZ2h0OmJvbGQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7XHJcblx0Y3Vyc29yOmhhbmQ7XHJcblx0Y29sb3I6I2ZmZjtcclxufVxyXG5cclxuXHJcblxyXG4vKi50aW1lUGlja2VyQ29udGFpbmVyIHtcclxuXHRtYXJnaW46MS43NWVtIDAgMC41ZW0gMDtcclxuXHR3aWR0aDoxMGVtO1xyXG5cdGZsb2F0OmxlZnQ7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHtcclxuXHRib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7XHJcblx0Ym9yZGVyLXNwYWNpbmc6MDtcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgdGhlYWQgdGR7XHJcblx0Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZTZlNjtcclxuXHRwYWRkaW5nOjAgMC40ZW0gMC4yZW0gMC40ZW07XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHRkIHtcclxuXHRmb250LXNpemU6MC45ZW07XHJcblx0cGFkZGluZzowIDAuMjVlbSAwIDAuMjVlbTtcclxuXHR0ZXh0LWFsaWduOmxlZnQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7XHJcbn1cclxuXHJcbi50aW1lQ29udGFpbmVyIHRkLm1pbnV0ZXNIZWFkaW5nIHtcclxuXHRib3JkZXItbGVmdDoxcHggc29saWQgI2U2ZTZlNjtcclxuXHRib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNlNmU2ZTY7XHRcclxufVxyXG5cclxuLnRpbWVDb250YWluZXIgLm1pbnV0ZXMge1xyXG5cdGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTZlNmU2O1xyXG5cdGJvcmRlci1yaWdodDoxcHggc29saWQgI2U2ZTZlNjtcclxufVxyXG5cclxuLnNlbGVjdGVkSXRlbSB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojM2EzYTNhO1xyXG5cdGNvbG9yOiNmZmZmZmY7XHJcbn0qL1xyXG4iLHRlbXBsYXRlQ3NzUGF0aDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvVGltZVBpY2tlci5jc3MiKSwKKworCXBvc3RNaXhJblByb3BlcnRpZXM6IGZ1bmN0aW9uKGxvY2FsUHJvcGVydGllcywgZnJhZykgeworCQkvLyBzdW1tYXJ5OiBzZWUgZG9qby53aWRnZXQuRG9tV2lkZ2V0CisJCWRvam8ud2lkZ2V0LlRpbWVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCXRoaXMuY2FsZW5kYXIgPSBkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKCJkb2pvLmkxOG4uY2FsZW5kYXIiLCAiZ3JlZ29yaWFuIiwgdGhpcy5sYW5nKTsgLy8gImFtIiwicG0iCisJCXRoaXMud2lkZ2V0U3RyaW5ncyA9IGRvam8uaTE4bi5nZXRMb2NhbGl6YXRpb24oImRvam8ud2lkZ2V0IiwgIlRpbWVQaWNrZXIiLCB0aGlzLmxhbmcpOyAvLyAiYW55IgorCX0sCisKKwlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oYXJncywgZnJhZyl7CisJCS8vIHN1bW1hcnk6IHNlZSBkb2pvLndpZGdldC5Eb21XaWRnZXQKKworCQkvLyBDb3B5IHN0eWxlIGluZm8gZnJvbSBpbnB1dCBub2RlIHRvIG91dHB1dCBub2RlCisJCXZhciBzb3VyY2UgPSB0aGlzLmdldEZyYWdOb2RlUmVmKGZyYWcpOworCQlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgc291cmNlKTsKKworCQlpZihhcmdzLnZhbHVlKXsKKwkJCWlmKGFyZ3MudmFsdWUgaW5zdGFuY2VvZiBEYXRlKXsKKwkJCQl0aGlzLnN0b3JlZFRpbWUgPSBkb2pvLmRhdGUudG9SZmMzMzM5KGFyZ3MudmFsdWUpOworCQkJfWVsc2V7CisJCQkJdGhpcy5zdG9yZWRUaW1lID0gYXJncy52YWx1ZTsKKwkJCX0KKwkJfQkJCisJCQorCQl0aGlzLmluaXREYXRhKCk7CisJCXRoaXMuaW5pdFVJKCk7CisJfSwKKworCWluaXREYXRhOiBmdW5jdGlvbigpIHsKKwkJLy8gRklYTUU6IGRvZXNuJ3QgY3VycmVudGx5IHZhbGlkYXRlIHRoZSB0aW1lIGJlZm9yZSB0cnlpbmcgdG8gc2V0IGl0CisJCS8vIERldGVybWluZSB0aGUgZGF0ZS90aW1lIGZyb20gc3RvcmVkIGluZm8sIG9yIGJ5IGRlZmF1bHQgZG9uJ3QgCisJCS8vICBoYXZlIGEgc2V0IHRpbWUKKwkJLy8gRklYTUU6IHNob3VsZCBub3JtYWxpemUgYWdhaW5zdCB3aGl0ZXNwYWNlIG9uIHN0b3JlZFRpbWUuLi4gZm9yIG5vdyAKKwkJLy8ganVzdCBhIGxhbWUgaGFjaworCQlpZih0aGlzLnN0b3JlZFRpbWUuaW5kZXhPZigiVCIpIT0tMSAmJiB0aGlzLnN0b3JlZFRpbWUuc3BsaXQoIlQiKVsxXSAmJiB0aGlzLnN0b3JlZFRpbWUhPSIgIiAmJiB0aGlzLnN0b3JlZFRpbWUuc3BsaXQoIlQiKVsxXSE9ImFueSIpeworCQkJdGhpcy50aW1lID0gZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsLmZyb21SZmNEYXRlVGltZSh0aGlzLnN0b3JlZFRpbWUsIHRoaXMudXNlRGVmYXVsdE1pbnV0ZXMsIHRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUpOworCQl9ZWxzZSBpZih0aGlzLnVzZURlZmF1bHRUaW1lKXsKKwkJCXRoaXMudGltZSA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC5mcm9tUmZjRGF0ZVRpbWUoIiIsIHRoaXMudXNlRGVmYXVsdE1pbnV0ZXMsIHRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUpOworCQl9ZWxzZXsKKwkJCXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgPSB0cnVlOworCQkJdGhpcy50aW1lID0gZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsLmZyb21SZmNEYXRlVGltZSgiIiwgMCwgMSk7CisJCX0KKwl9LAorCisJaW5pdFVJOiBmdW5jdGlvbigpIHsKKwkJLy8gc2V0IFVJIHRvIG1hdGNoIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGltZQorCQlpZighdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSAmJiB0aGlzLnRpbWUpIHsKKwkJCXZhciBhbVBtSG91ciA9IGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIudXRpbC50b0FtUG1Ib3VyKHRoaXMudGltZS5nZXRIb3VycygpKTsKKwkJCXZhciBob3VyID0gYW1QbUhvdXJbMF07CisJCQl2YXIgaXNBbSA9IGFtUG1Ib3VyWzFdOworCQkJdmFyIG1pbnV0ZSA9IHRoaXMudGltZS5nZXRNaW51dGVzKCk7CisJCQl2YXIgbWludXRlSW5kZXggPSBwYXJzZUludChtaW51dGUvNSk7CisJCQl0aGlzLm9uU2V0U2VsZWN0ZWRIb3VyKHRoaXMuaG91ckluZGV4TWFwW2hvdXJdKTsKKwkJCXRoaXMub25TZXRTZWxlY3RlZE1pbnV0ZSh0aGlzLm1pbnV0ZUluZGV4TWFwW21pbnV0ZUluZGV4XSk7CisJCQl0aGlzLm9uU2V0U2VsZWN0ZWRBbVBtKGlzQW0pOworCQl9IGVsc2UgeworCQkJdGhpcy5vblNldFNlbGVjdGVkQW55VGltZSgpOworCQl9CisJfSwKKwkKKwlzZXRUaW1lOiBmdW5jdGlvbihkYXRlKSB7CisJCS8vc3VtbWFyeTogc2V0IHRoZSBjdXJyZW50IGRhdGUgYW5kIHVwZGF0ZSB0aGUgVUkKKwkJaWYoZGF0ZSkgeworCQkJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IGZhbHNlOworCQkJdGhpcy5zZXREYXRlVGltZShkb2pvLmRhdGUudG9SZmMzMzM5KGRhdGUpKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2VsZWN0ZWRUaW1lLmFueVRpbWUgPSB0cnVlOworCQl9CisJCXRoaXMuaW5pdERhdGEoKTsKKwkJdGhpcy5pbml0VUkoKTsKKwl9LAorCisJc2V0RGF0ZVRpbWU6IGZ1bmN0aW9uKHJmY0RhdGUpIHsKKwkJdGhpcy5zdG9yZWRUaW1lID0gcmZjRGF0ZTsKKwl9LAorCQorCW9uQ2xlYXJTZWxlY3RlZEhvdXI6IGZ1bmN0aW9uKGV2dCkgeworCQl0aGlzLmNsZWFyU2VsZWN0ZWRIb3VyKCk7CisJfSwKKworCW9uQ2xlYXJTZWxlY3RlZE1pbnV0ZTogZnVuY3Rpb24oZXZ0KSB7CisJCXRoaXMuY2xlYXJTZWxlY3RlZE1pbnV0ZSgpOworCX0sCisKKwlvbkNsZWFyU2VsZWN0ZWRBbVBtOiBmdW5jdGlvbihldnQpIHsKKwkJdGhpcy5jbGVhclNlbGVjdGVkQW1QbSgpOworCX0sCisKKwlvbkNsZWFyU2VsZWN0ZWRBbnlUaW1lOiBmdW5jdGlvbihldnQpIHsKKwkJdGhpcy5jbGVhclNlbGVjdGVkQW55VGltZSgpOworCQlpZih0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lKSB7CisJCQl0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lID0gZmFsc2U7CisJCQl0aGlzLnRpbWUgPSBkb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwuZnJvbVJmY0RhdGVUaW1lKCIiLCB0aGlzLnVzZURlZmF1bHRNaW51dGVzKTsKKwkJCXRoaXMuaW5pdFVJKCk7CisJCX0KKwl9LAorCisJY2xlYXJTZWxlY3RlZEhvdXI6IGZ1bmN0aW9uKCkgeworCQl2YXIgaG91ck5vZGVzID0gdGhpcy5ob3VyQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKwkJZm9yICh2YXIgaT0wOyBpPGhvdXJOb2Rlcy5sZW5ndGg7IGkrKykgeworCQkJZG9qby5odG1sLnNldENsYXNzKGhvdXJOb2Rlcy5pdGVtKGkpLCAiIik7CisJCX0KKwl9LAorCisJY2xlYXJTZWxlY3RlZE1pbnV0ZTogZnVuY3Rpb24oKSB7CisJCXZhciBtaW51dGVOb2RlcyA9IHRoaXMubWludXRlQ29udGFpbmVyTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKwkJZm9yICh2YXIgaT0wOyBpPG1pbnV0ZU5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCQlkb2pvLmh0bWwuc2V0Q2xhc3MobWludXRlTm9kZXMuaXRlbShpKSwgIiIpOworCQl9CisJfSwKKworCWNsZWFyU2VsZWN0ZWRBbVBtOiBmdW5jdGlvbigpIHsKKwkJdmFyIGFtUG1Ob2RlcyA9IHRoaXMuYW1QbUNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCWZvciAodmFyIGk9MDsgaTxhbVBtTm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCWRvam8uaHRtbC5zZXRDbGFzcyhhbVBtTm9kZXMuaXRlbShpKSwgIiIpOworCQl9CisJfSwKKworCWNsZWFyU2VsZWN0ZWRBbnlUaW1lOiBmdW5jdGlvbigpIHsKKwkJZG9qby5odG1sLnNldENsYXNzKHRoaXMuYW55VGltZUNvbnRhaW5lck5vZGUsICJhbnlUaW1lQ29udGFpbmVyIik7CisJfSwKKworCW9uU2V0U2VsZWN0ZWRIb3VyOiBmdW5jdGlvbihldnQpIHsKKwkJdGhpcy5vbkNsZWFyU2VsZWN0ZWRBbnlUaW1lKCk7CisJCXRoaXMub25DbGVhclNlbGVjdGVkSG91cigpOworCQl0aGlzLnNldFNlbGVjdGVkSG91cihldnQpOworCQl0aGlzLm9uU2V0VGltZSgpOworCX0sCisKKwlzZXRTZWxlY3RlZEhvdXI6IGZ1bmN0aW9uKGV2dCkgeworCQlpZihldnQgJiYgZXZ0LnRhcmdldCkgeworCQkJaWYoZXZ0LnRhcmdldC5ub2RlVHlwZSA9PSBkb2pvLmRvbS5FTEVNRU5UX05PREUpIHsKKwkJCQl2YXIgZXZlbnRUYXJnZXQgPSBldnQudGFyZ2V0OworCQkJfSBlbHNlIHsKKwkJCQl2YXIgZXZlbnRUYXJnZXQgPSBldnQudGFyZ2V0LnBhcmVudE5vZGU7CisJCQl9CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCQlkb2pvLmh0bWwuc2V0Q2xhc3MoZXZlbnRUYXJnZXQsIHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZFRpbWUpOworCQkJdGhpcy5zZWxlY3RlZFRpbWVbImhvdXIiXSA9IGV2ZW50VGFyZ2V0LmlubmVySFRNTDsKKwkJfSBlbHNlIGlmICghaXNOYU4oZXZ0KSkgeworCQkJdmFyIGhvdXJOb2RlcyA9IHRoaXMuaG91ckNvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CisJCQlpZihob3VyTm9kZXMuaXRlbShldnQpKSB7CisJCQkJZG9qby5odG1sLnNldENsYXNzKGhvdXJOb2Rlcy5pdGVtKGV2dCksIHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZFRpbWUpOworCQkJCXRoaXMuc2VsZWN0ZWRUaW1lWyJob3VyIl0gPSBob3VyTm9kZXMuaXRlbShldnQpLmlubmVySFRNTDsKKwkJCX0KKwkJfQorCQl0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lID0gZmFsc2U7CisJfSwKKworCW9uU2V0U2VsZWN0ZWRNaW51dGU6IGZ1bmN0aW9uKGV2dCkgeworCQl0aGlzLm9uQ2xlYXJTZWxlY3RlZEFueVRpbWUoKTsKKwkJdGhpcy5vbkNsZWFyU2VsZWN0ZWRNaW51dGUoKTsKKwkJdGhpcy5zZXRTZWxlY3RlZE1pbnV0ZShldnQpOworCQl0aGlzLnNlbGVjdGVkVGltZS5hbnlUaW1lID0gZmFsc2U7CisJCXRoaXMub25TZXRUaW1lKCk7CisJfSwKKworCXNldFNlbGVjdGVkTWludXRlOiBmdW5jdGlvbihldnQpIHsKKwkJaWYoZXZ0ICYmIGV2dC50YXJnZXQpIHsKKwkJCWlmKGV2dC50YXJnZXQubm9kZVR5cGUgPT0gZG9qby5kb20uRUxFTUVOVF9OT0RFKSB7CisJCQkJdmFyIGV2ZW50VGFyZ2V0ID0gZXZ0LnRhcmdldDsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIGV2ZW50VGFyZ2V0ID0gZXZ0LnRhcmdldC5wYXJlbnROb2RlOworCQkJfQorCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJZG9qby5odG1sLnNldENsYXNzKGV2ZW50VGFyZ2V0LCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKKwkJCXRoaXMuc2VsZWN0ZWRUaW1lWyJtaW51dGUiXSA9IGV2ZW50VGFyZ2V0LmlubmVySFRNTDsKKwkJfSBlbHNlIGlmICghaXNOYU4oZXZ0KSkgeworCQkJdmFyIG1pbnV0ZU5vZGVzID0gdGhpcy5taW51dGVDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJaWYobWludXRlTm9kZXMuaXRlbShldnQpKSB7CisJCQkJZG9qby5odG1sLnNldENsYXNzKG1pbnV0ZU5vZGVzLml0ZW0oZXZ0KSwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7CisJCQkJdGhpcy5zZWxlY3RlZFRpbWVbIm1pbnV0ZSJdID0gbWludXRlTm9kZXMuaXRlbShldnQpLmlubmVySFRNTDsKKwkJCX0KKwkJfQorCX0sCisKKwlvblNldFNlbGVjdGVkQW1QbTogZnVuY3Rpb24oZXZ0KSB7CisJCXRoaXMub25DbGVhclNlbGVjdGVkQW55VGltZSgpOworCQl0aGlzLm9uQ2xlYXJTZWxlY3RlZEFtUG0oKTsKKwkJdGhpcy5zZXRTZWxlY3RlZEFtUG0oZXZ0KTsKKwkJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IGZhbHNlOworCQl0aGlzLm9uU2V0VGltZSgpOworCX0sCisKKwlzZXRTZWxlY3RlZEFtUG06IGZ1bmN0aW9uKGV2dCkgeworCQl2YXIgZXZlbnRUYXJnZXQgPSBldnQudGFyZ2V0OworCQlpZihldnQgJiYgZXZlbnRUYXJnZXQpIHsKKwkJCWlmKGV2ZW50VGFyZ2V0Lm5vZGVUeXBlICE9IGRvam8uZG9tLkVMRU1FTlRfTk9ERSkgeworCQkJCWV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXQucGFyZW50Tm9kZTsKKwkJCX0KKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCXRoaXMuc2VsZWN0ZWRUaW1lLmFtUG0gPSBldmVudFRhcmdldC5pZDsKKwkJCWRvam8uaHRtbC5zZXRDbGFzcyhldmVudFRhcmdldCwgdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkVGltZSk7CisJCX0gZWxzZSB7CisJCQlldnQgPSBldnQgPyAwIDogMTsKKwkJCXZhciBhbVBtTm9kZXMgPSB0aGlzLmFtUG1Db250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJaWYoYW1QbU5vZGVzLml0ZW0oZXZ0KSkgeworCQkJCXRoaXMuc2VsZWN0ZWRUaW1lLmFtUG0gPSBhbVBtTm9kZXMuaXRlbShldnQpLmlkOworCQkJCWRvam8uaHRtbC5zZXRDbGFzcyhhbVBtTm9kZXMuaXRlbShldnQpLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lKTsKKwkJCX0KKwkJfQorCX0sCisKKwlvblNldFNlbGVjdGVkQW55VGltZTogZnVuY3Rpb24oZXZ0KSB7CisJCXRoaXMub25DbGVhclNlbGVjdGVkSG91cigpOworCQl0aGlzLm9uQ2xlYXJTZWxlY3RlZE1pbnV0ZSgpOworCQl0aGlzLm9uQ2xlYXJTZWxlY3RlZEFtUG0oKTsKKwkJdGhpcy5zZXRTZWxlY3RlZEFueVRpbWUoKTsKKwkJdGhpcy5vblNldFRpbWUoKTsKKwl9LAorCisJc2V0U2VsZWN0ZWRBbnlUaW1lOiBmdW5jdGlvbihldnQpIHsKKwkJdGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSA9IHRydWU7CisJCWRvam8uaHRtbC5zZXRDbGFzcyh0aGlzLmFueVRpbWVDb250YWluZXJOb2RlLCB0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWRUaW1lICsgIiAiICsgImFueVRpbWVDb250YWluZXIiKTsKKwl9LAorCisJb25DbGljazogZnVuY3Rpb24oZXZ0KSB7CisJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwl9LAorCisJb25TZXRUaW1lOiBmdW5jdGlvbigpIHsKKwkJaWYodGhpcy5zZWxlY3RlZFRpbWUuYW55VGltZSkgeworCQkJdGhpcy50aW1lID0gbmV3IERhdGUoKTsKKwkJCXZhciB0ZW1wRGF0ZVRpbWUgPSBkb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwudG9SZmNEYXRlVGltZSh0aGlzLnRpbWUpOworCQkJdGhpcy5zZXREYXRlVGltZSh0ZW1wRGF0ZVRpbWUuc3BsaXQoIlQiKVswXSk7CisJCX0gZWxzZSB7CisJCQl2YXIgaG91ciA9IDEyOworCQkJdmFyIG1pbnV0ZSA9IDA7CisJCQl2YXIgaXNBbSA9IGZhbHNlOworCQkJaWYodGhpcy5zZWxlY3RlZFRpbWVbImhvdXIiXSkgeworCQkJCWhvdXIgPSBwYXJzZUludCh0aGlzLnNlbGVjdGVkVGltZVsiaG91ciJdLCAxMCk7CisJCQl9CisJCQlpZih0aGlzLnNlbGVjdGVkVGltZVsibWludXRlIl0pIHsKKwkJCQltaW51dGUgPSBwYXJzZUludCh0aGlzLnNlbGVjdGVkVGltZVsibWludXRlIl0sIDEwKTsKKwkJCX0KKwkJCWlmKHRoaXMuc2VsZWN0ZWRUaW1lWyJhbVBtIl0pIHsKKwkJCQlpc0FtID0gKHRoaXMuc2VsZWN0ZWRUaW1lWyJhbVBtIl0udG9Mb3dlckNhc2UoKSA9PSAiYW0iKTsKKwkJCX0KKwkJCXRoaXMudGltZSA9IG5ldyBEYXRlKCk7CisJCQl0aGlzLnRpbWUuc2V0SG91cnMoZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsLmZyb21BbVBtSG91cihob3VyLCBpc0FtKSk7CisJCQl0aGlzLnRpbWUuc2V0TWludXRlcyhtaW51dGUpOworCQkJdGhpcy5zZXREYXRlVGltZShkb2pvLndpZGdldC5UaW1lUGlja2VyLnV0aWwudG9SZmNEYXRlVGltZSh0aGlzLnRpbWUpKTsKKwkJfQorCQl0aGlzLm9uVmFsdWVDaGFuZ2VkKHRoaXMudGltZSk7CisJfSwKKwkKKwlvblZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oLypEYXRlKi9kYXRlKSB7CisJCS8vc3VtbWFyeTogdGhlIHNldCBkYXRlIGV2ZW50IGhhbmRsZXIKKwl9Cit9KTsKKworZG9qby53aWRnZXQuVGltZVBpY2tlci51dGlsID0gbmV3IGZ1bmN0aW9uKCkgeworCS8vc3VtbWFyeTogdXRpbGl0eSBmdW5jdGlvbnMKKwkKKwl0aGlzLnRvUmZjRGF0ZVRpbWUgPSBmdW5jdGlvbihqc0RhdGUpIHsKKwkJLy9zdW1tYXJ5OiBmb3JtYXRzIGEgRGF0ZSBvYmplY3QgdG8gUkZDIDMzMzkgc3RyaW5nCisJCWlmKCFqc0RhdGUpIHsKKwkJCWpzRGF0ZSA9IG5ldyBEYXRlKCk7CisJCX0KKwkJanNEYXRlLnNldFNlY29uZHMoMCk7CisJCXJldHVybiBkb2pvLmRhdGUuc3RyZnRpbWUoanNEYXRlLCAiJVktJW0tJWRUJUg6JU06MDAleiIpOyAvL0ZJWE1FOiB1c2UgZG9qby5kYXRlLnRvUmZjMzMzOSBpbnN0ZWFkCisJfQorCisJdGhpcy5mcm9tUmZjRGF0ZVRpbWUgPSBmdW5jdGlvbihyZmNEYXRlLCB1c2VEZWZhdWx0TWludXRlcywgaXNBbnlUaW1lKSB7CisJCS8vc3VtbWFyeTogY29uc3RydWN0cyBhIERhdGUgb2JqZWN0IGZyb20gUkZDIDMzMzkgc3RyaW5nCisJCXZhciB0ZW1wRGF0ZSA9IG5ldyBEYXRlKCk7CisJCWlmKCFyZmNEYXRlIHx8IHJmY0RhdGUuaW5kZXhPZigiVCIpPT0tMSkgeworCQkJaWYodXNlRGVmYXVsdE1pbnV0ZXMpIHsKKwkJCQl0ZW1wRGF0ZS5zZXRNaW51dGVzKE1hdGguZmxvb3IodGVtcERhdGUuZ2V0TWludXRlcygpLzUpKjUpOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wRGF0ZS5zZXRNaW51dGVzKDApOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyIHRlbXBUaW1lID0gcmZjRGF0ZS5zcGxpdCgiVCIpWzFdLnNwbGl0KCI6Iik7CisJCQkvLyBmdWxsWWVhciwgbW9udGgsIGRhdGUKKwkJCXZhciB0ZW1wRGF0ZSA9IG5ldyBEYXRlKCk7CisJCQl0ZW1wRGF0ZS5zZXRIb3Vycyh0ZW1wVGltZVswXSk7CisJCQl0ZW1wRGF0ZS5zZXRNaW51dGVzKHRlbXBUaW1lWzFdKTsKKwkJfQorCQlyZXR1cm4gdGVtcERhdGU7CisJfQorCisJdGhpcy50b0FtUG1Ib3VyID0gZnVuY3Rpb24oaG91cikgeworCQkvL3N1bW1hcnk6IGNvbnZlcnRzIGEgMjQtaG91ci1iYXNlZCBob3VyIHZhbHVlIHRvIGEgMTItaG91ci1iYXNlZCBob3VyIHZhbHVlLCBhbmQgYW4gQU0vUE0gZmxhZworCQl2YXIgYW1QbUhvdXIgPSBob3VyOworCQl2YXIgaXNBbSA9IHRydWU7CisJCWlmIChhbVBtSG91ciA9PSAwKSB7CisJCQlhbVBtSG91ciA9IDEyOworCQl9IGVsc2UgaWYgKGFtUG1Ib3VyPjEyKSB7CisJCQlhbVBtSG91ciA9IGFtUG1Ib3VyIC0gMTI7CisJCQlpc0FtID0gZmFsc2U7CisJCX0gZWxzZSBpZiAoYW1QbUhvdXIgPT0gMTIpIHsKKwkJCWlzQW0gPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gW2FtUG1Ib3VyLCBpc0FtXTsKKwl9CisKKwl0aGlzLmZyb21BbVBtSG91ciA9IGZ1bmN0aW9uKGFtUG1Ib3VyLCBpc0FtKSB7CisJCS8vc3VtbWFyeTogY29udmVydHMgYSAxMi1ob3VyLWJhc2VkIGhvdXIgdmFsdWUgYW5kIGFuIEFNL1BNIGZsYWcgdG8gYSAyNC1ob3VyLWJhc2VkIGhvdXIgdmFsdWUKKwkJdmFyIGhvdXIgPSBwYXJzZUludChhbVBtSG91ciwgMTApOworCQlpZihpc0FtICYmIGhvdXIgPT0gMTIpIHsKKwkJCWhvdXIgPSAwOworCQl9IGVsc2UgaWYgKCFpc0FtICYmIGhvdXI8MTIpIHsKKwkJCWhvdXIgPSBob3VyICsgMTI7CisJCX0KKwkJcmV0dXJuIGhvdXI7CisJfQorfQorCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIpOworCisKKworCisKKworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIiwKKwlkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lciwKKwl7CisJCS8qCisJCXN1bW1hcnk6IAorCQkJQSBmb3JtIGlucHV0IGZvciBlbnRlcmluZyB0aW1lcyB3aXRoIGEgcG9wLXVwIGRvam8ud2lkZ2V0LlRpbWVQaWNrZXIgdG8gYWlkIGluIHNlbGVjdGlvbgorCQkKKwkJCWRlc2NyaXB0aW9uOiAKKwkJCQlUaGlzIGlzIFRpbWVQaWNrZXIgaW4gYSBEcm9wZG93bkNvbnRhaW5lciwgaXQgc3VwcG9ydHMgYWxsIGZlYXR1cmVzIG9mIFRpbWVlUGlja2VyLgorCQkKKwkJCQlJdCBpcyBwb3NzaWJsZSB0byBjdXN0b21pemUgdGhlIHVzZXItdmlzaWJsZSBmb3JtYXR0aW5nIHdpdGggZWl0aGVyIHRoZSBmb3JtYXRMZW5ndGggb3IgCisJCQkJZGlzcGxheUZvcm1hdCBhdHRyaWJ1dGVzLiAgVGhlIHZhbHVlIHNlbnQgdG8gdGhlIHNlcnZlciBpcyB0eXBpY2FsbHkgYSBsb2NhbGUtaW5kZXBlbmRlbnQgCisJCQkJdmFsdWUgaW4gYSBoaWRkZW4gZmllbGQgYXMgZGVmaW5lZCBieSB0aGUgbmFtZSBhdHRyaWJ1dGUuIFJGQzMzMzkgcmVwcmVzZW50YXRpb24gaXMgdXNlZCAKKwkJCQlieSBkZWZhdWx0LCBidXQgb3RoZXIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGggc2F2ZUZvcm1hdC4KKwkJCisJCQl1c2FnZTogCisJCQkJdmFyIGR0cCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRHJvcGRvd25UaW1lUGlja2VyIiwge30sICAgCisJCQkJZG9qby5ieUlkKCJEcm9wZG93blRpbWVQaWNrZXJOb2RlIikpOyAKKwkJIAkgCisJCQkJPGlucHV0IGRvam9UeXBlPSJEcm9wZG93blRpbWVQaWNrZXIiPgorCQkqLworCisJCS8vIGljb25VUkw6IFVSTAorCQkvLwlwYXRoIG9mIGljb24gZm9yIGJ1dHRvbiB0byBkaXNwbGF5IHRpbWUgcGlja2VyIHdpZGdldAorCQlpY29uVVJMOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvdGltZUljb24uZ2lmIiksCisJCQorCQkvLyBmb3JtYXRMZW5ndGg6IFN0cmluZworCQkvLwlUeXBlIG9mIGZvcm1hdHRpbmcgdXNlZCBmb3IgdmlzdWFsIGRpc3BsYXksIGFwcHJvcHJpYXRlIHRvIGxvY2FsZSAoY2hvaWNlIG9mIGxvbmcsIHNob3J0LCBtZWRpdW0gb3IgZnVsbCkKKwkJLy8JU2VlIGRvam8uZGF0ZS5mb3JtYXQgZm9yIGRldGFpbHMuCisJCWZvcm1hdExlbmd0aDogInNob3J0IiwKKworCQkvLyBkaXNwbGF5Rm9ybWF0OiBTdHJpbmcKKwkJLy8JQSBwYXR0ZXJuIHVzZWQgZm9yIHRoZSB2aXN1YWwgZGlzcGxheSBvZiB0aGUgZm9ybWF0dGVkIGRhdGUuCisJCS8vCVNldHRpbmcgdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYWxlLXNwZWNpZmljIHNldHRpbmdzIGFzIHdlbGwgYXMgdGhlIGZvcm1hdExlbmd0aAorCQkvLwlhdHRyaWJ1dGUuICBTZWUgZG9qby5kYXRlLmZvcm1hdCBmb3IgYSByZWZlcmVuY2Ugd2hpY2ggZGVmaW5lcyB0aGUgZm9ybWF0dGluZyBwYXR0ZXJucy4KKwkJZGlzcGxheUZvcm1hdDogIiIsCisKKwkJdGltZUZvcm1hdDogIiIsIC8vIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBmb3IgMC41CisKKy8vRklYTUU6IG5lZWQgc2F2ZUZvcm1hdCBhdHRyaWJ1dGUgc3VwcG9ydAorCQkvLyBzYXZlRm9ybWF0OiBTdHJpbmcKKwkJLy8JRm9ybWF0dGluZyBzY2hlbWUgdXNlZCB3aGVuIHN1Ym1pdHRpbmcgdGhlIGZvcm0gZWxlbWVudC4gIFRoaXMgZm9ybWF0dGluZyBpcyB1c2VkIGluIGEgaGlkZGVuCisJCS8vICBmaWVsZCAobmFtZSkgaW50ZW5kZWQgZm9yIHNlcnZlciB1c2UsIGFuZCBpcyB0aGVyZWZvcmUgdHlwaWNhbGx5IGxvY2FsZS1pbmRlcGVuZGVudC4KKwkJLy8gIEJ5IGRlZmF1bHQsIHVzZXMgcmZjMzMzOSBzdHlsZSBkYXRlIGZvcm1hdHRpbmcgKHJmYykKKwkJLy8JVXNlIGEgcGF0dGVybiBzdHJpbmcgbGlrZSBkaXNwbGF5Rm9ybWF0IG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCQkvLwlyZmN8aXNvfHBvc2l4fHVuaXgKKwkJc2F2ZUZvcm1hdDogIiIsCisKKwkJLy8gdmFsdWU6IFN0cmluZ3xEYXRlCisJCS8vCWZvcm0gdmFsdWUgcHJvcGVydHkgaW4gcmZjMzMzOSBmb3JtYXQuIGV4OiAxMjowMAorCQl2YWx1ZTogIiIsCisKKwkJLy8gbmFtZTogU3RyaW5nCisJCS8vIAluYW1lIG9mIHRoZSBmb3JtIGVsZW1lbnQsIHVzZWQgdG8gY3JlYXRlIGEgaGlkZGVuIGZpZWxkIGJ5IHRoaXMgbmFtZSBmb3IgZm9ybSBlbGVtZW50IHN1Ym1pc3Npb24uCisJCW5hbWU6ICIiLAorCisJCXBvc3RNaXhJblByb3BlcnRpZXM6IGZ1bmN0aW9uKCkgeworCQkJLy8gc3VtbWFyeTogc2VlIGRvam8ud2lkZ2V0LkRvbVdpZGdldAorCQkJZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyLnN1cGVyY2xhc3MucG9zdE1peEluUHJvcGVydGllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJdmFyIG1lc3NhZ2VzID0gZG9qby5pMThuLmdldExvY2FsaXphdGlvbigiZG9qby53aWRnZXQiLCAiRHJvcGRvd25UaW1lUGlja2VyIiwgdGhpcy5sYW5nKTsKKwkJCXRoaXMuaWNvbkFsdCA9IG1lc3NhZ2VzLnNlbGVjdFRpbWU7CisKKwkJCS8vRklYTUU6IHNob3VsZCB0aGlzIGJlIGlmL2Vsc2UvZWxzZT8KKwkJCWlmKHR5cGVvZih0aGlzLnZhbHVlKT09J3N0cmluZycmJnRoaXMudmFsdWUudG9Mb3dlckNhc2UoKT09J3RvZGF5Jyl7CisJCQkJdGhpcy52YWx1ZSA9IG5ldyBEYXRlKCk7CisJCQl9CisJCQlpZih0aGlzLnZhbHVlICYmIGlzTmFOKHRoaXMudmFsdWUpKXsKKwkJCQl2YXIgb3JpZyA9IHRoaXMudmFsdWU7CisJCQkJdGhpcy52YWx1ZSA9IGRvam8uZGF0ZS5mcm9tUmZjMzMzOSh0aGlzLnZhbHVlKTsKKwkJCQlpZighdGhpcy52YWx1ZSl7CisJCQkJCXZhciBkID0gZG9qby5kYXRlLmZvcm1hdChuZXcgRGF0ZSgpLCB7IHNlbGVjdG9yOiAiZGF0ZU9ubHkiLCBkYXRlUGF0dGVybjogInl5eXktTU0tZGQiIH0pOworCQkJCQl2YXIgYyA9IG9yaWcuc3BsaXQoIjoiKTsKKwkJCQkJZm9yKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyArK2kpeworCQkJCQkJaWYoY1tpXS5sZW5ndGggPT0gMSkgY1tpXSA9ICIwIiArIGNbaV07CisJCQkJCX0KKwkJCQkJb3JpZyA9IGMuam9pbigiOiIpOworCQkJCQl0aGlzLnZhbHVlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KGQgKyAiVCIgKyBvcmlnKTsKKwkJCQkJZG9qby5kZXByZWNhdGVkKCJkb2pvLndpZGdldC5Ecm9wZG93blRpbWVQaWNrZXIiLCAidGltZSBhdHRyaWJ1dGVzIG11c3QgYmUgcGFzc2VkIGluIFJmYzMzMzkgZm9ybWF0IiwgIjAuNSIpOworCQkJCX0KKwkJCX0KKwkJCWlmKHRoaXMudmFsdWUgJiYgIWlzTmFOKHRoaXMudmFsdWUpKXsKKwkJCQl0aGlzLnZhbHVlID0gbmV3IERhdGUodGhpcy52YWx1ZSk7CisJCQl9CisJCX0sCisKKwkJZmlsbEluVGVtcGxhdGU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBzZWUgZG9qby53aWRnZXQuRG9tV2lkZ2V0CisKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJCXZhciB2YWx1ZSA9ICIiOworCQkJaWYodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKwkJCQl2YWx1ZSA9IHRoaXMudmFsdWU7CisJCQl9IGVsc2UgaWYodGhpcy52YWx1ZSkgeworCQkJCXZhciBvcmlnID0gdGhpcy52YWx1ZTsKKwkJCQl2YXIgZCA9IGRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoKSwgeyBzZWxlY3RvcjogImRhdGVPbmx5IiwgZGF0ZVBhdHRlcm46ICJ5eXl5LU1NLWRkIiB9KTsKKwkJCQl2YXIgYyA9IG9yaWcuc3BsaXQoIjoiKTsKKwkJCQlmb3IodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7ICsraSl7CisJCQkJCWlmKGNbaV0ubGVuZ3RoID09IDEpIGNbaV0gPSAiMCIgKyBjW2ldOworCQkJCX0KKwkJCQlvcmlnID0gYy5qb2luKCI6Iik7CisJCQkJdmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkoZCArICJUIiArIG9yaWcpOworCQkJfQorCQkJCisJCQl2YXIgdHBBcmdzID0geyB3aWRnZXRDb250YWluZXJJZDogdGhpcy53aWRnZXRJZCwgbGFuZzogdGhpcy5sYW5nLCB2YWx1ZTogdmFsdWUgfTsKKwkJCXRoaXMudGltZVBpY2tlciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVGltZVBpY2tlciIsIHRwQXJncywgdGhpcy5jb250YWluZXJOb2RlLCAiY2hpbGQiKTsKKwkJCQorCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMudGltZVBpY2tlciwgIm9uVmFsdWVDaGFuZ2VkIiwgdGhpcywgIl91cGRhdGVUZXh0Iik7CisJCQkKKwkJCWlmKHRoaXMudmFsdWUpeworCQkJCXRoaXMuX3VwZGF0ZVRleHQoKTsKKwkJCX0KKwkJCXRoaXMuY29udGFpbmVyTm9kZS5zdHlsZS56SW5kZXggPSB0aGlzLnpJbmRleDsKKwkJCXRoaXMuY29udGFpbmVyTm9kZS5leHBsb2RlQ2xhc3NOYW1lID0gInRpbWVDb250YWluZXIiOworCQkJdGhpcy52YWx1ZU5vZGUubmFtZSA9IHRoaXMubmFtZTsKKwkJfSwKKwkJCisJCWdldFZhbHVlOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogcmV0dXJuIGN1cnJlbnQgdGltZSBpbiB0aW1lLW9ubHkgcG9ydGlvbiBvZiBSRkMgMzMzOSBmb3JtYXQKKwkJCXJldHVybiB0aGlzLnZhbHVlTm9kZS52YWx1ZTsgLypTdHJpbmcqLworCQl9LAorCisJCWdldFRpbWU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiByZXR1cm4gY3VycmVudCB0aW1lIGFzIGEgRGF0ZSBvYmplY3QKKwkJCXJldHVybiB0aGlzLnRpbWVQaWNrZXIuc3RvcmVkVGltZTsgLypEYXRlKi8KKwkJfSwKKworCQlzZXRWYWx1ZTogZnVuY3Rpb24oLypEYXRlfFN0cmluZyovcmZjRGF0ZSl7CisJCQkvL3N1bW1hcnk6IHNldCB0aGUgY3VycmVudCB0aW1lIGZyb20gUkZDIDMzMzkgZm9ybWF0dGVkIHN0cmluZyBvciBhIGRhdGUgb2JqZWN0LCBzeW5vbnltb3VzIHdpdGggc2V0VGltZQorCQkJdGhpcy5zZXRUaW1lKHJmY0RhdGUpOworCQl9LAorCisJCXNldFRpbWU6IGZ1bmN0aW9uKC8qRGF0ZXxTdHJpbmcqL2RhdGVPYmopeworCQkJLy8gc3VtbWFyeTogc2V0IHRoZSBjdXJyZW50IHRpbWUgYW5kIHVwZGF0ZSB0aGUgVUkKKwkJCXZhciB2YWx1ZSA9ICIiOworCQkJaWYoZGF0ZU9iaiBpbnN0YW5jZW9mIERhdGUpIHsKKwkJCQl2YWx1ZSA9IGRhdGVPYmo7CisJCQl9IGVsc2UgaWYodGhpcy52YWx1ZSkgeworCQkJCXZhciBvcmlnID0gdGhpcy52YWx1ZTsKKwkJCQl2YXIgZCA9IGRvam8uZGF0ZS5mb3JtYXQobmV3IERhdGUoKSwgeyBzZWxlY3RvcjogImRhdGVPbmx5IiwgZGF0ZVBhdHRlcm46ICJ5eXl5LU1NLWRkIiB9KTsKKwkJCQl2YXIgYyA9IG9yaWcuc3BsaXQoIjoiKTsKKwkJCQlmb3IodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7ICsraSl7CisJCQkJCWlmKGNbaV0ubGVuZ3RoID09IDEpIGNbaV0gPSAiMCIgKyBjW2ldOworCQkJCX0KKwkJCQlvcmlnID0gYy5qb2luKCI6Iik7CisJCQkJdmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkoZCArICJUIiArIG9yaWcpOworCQkJfQorCisJCQl0aGlzLnRpbWVQaWNrZXIuc2V0VGltZSh2YWx1ZSk7CisJCQl0aGlzLl9zeW5jVmFsdWVOb2RlKCk7CisJCX0sCisJCisJCV91cGRhdGVUZXh0OiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogdXBkYXRlcyB0aGUgPGlucHV0PiBmaWVsZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgKGllLCBkaXNwbGF5cyB0aGUgZm9ybWF0dGVkIGRhdGUpCisJCQlpZih0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRUaW1lLmFueVRpbWUpeworCQkJCXRoaXMuaW5wdXROb2RlLnZhbHVlID0gIiI7CisJCQl9ZWxzZSBpZih0aGlzLnRpbWVGb3JtYXQpeworCQkJCWRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRHJvcGRvd25UaW1lUGlja2VyIiwKKwkJCQkiTXVzdCB1c2UgZGlzcGxheUZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiB0aW1lRm9ybWF0LiAgU2VlIGRvam8uZGF0ZS5mb3JtYXQgZm9yIHNwZWNpZmljYXRpb24uIiwgIjAuNSIpOworCQkJCXRoaXMuaW5wdXROb2RlLnZhbHVlID0gZG9qby5kYXRlLnN0cmZ0aW1lKHRoaXMudGltZVBpY2tlci50aW1lLCB0aGlzLnRpbWVGb3JtYXQsIHRoaXMubGFuZyk7CisJCQl9ZWxzZXsKKwkJCQl0aGlzLmlucHV0Tm9kZS52YWx1ZSA9IGRvam8uZGF0ZS5mb3JtYXQodGhpcy50aW1lUGlja2VyLnRpbWUsCisJCQkJCXtmb3JtYXRMZW5ndGg6dGhpcy5mb3JtYXRMZW5ndGgsIHRpbWVQYXR0ZXJuOnRoaXMuZGlzcGxheUZvcm1hdCwgc2VsZWN0b3I6J3RpbWVPbmx5JywgbG9jYWxlOnRoaXMubGFuZ30pOworCQkJfQorCQkJdGhpcy5fc3luY1ZhbHVlTm9kZSgpOworCQkJdGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLmdldFRpbWUoKSk7CisJCQl0aGlzLmhpZGVDb250YWluZXIoKTsKKwkJfSwKKworCQlvblZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oLypEYXRlKi9kYXRlT2JqKXsKKwkJCS8vIHN1bW1hcnk6IHRyaWdnZXJlZCB3aGVuIHRoaXMudmFsdWUgaXMgY2hhbmdlZAorCQl9LAorCQkKKwkJb25JbnB1dENoYW5nZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGNhbGxiYWNrIHdoZW4gdXNlciBtYW51YWxseSB0eXBlcyBhIHRpbWUgaW50byB0aGUgPGlucHV0PiBmaWVsZAorCQkJaWYodGhpcy5kYXRlRm9ybWF0KXsKKwkJCQlkb2pvLmRlcHJlY2F0ZWQoImRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciIsCisJCQkJIkNhbm5vdCBwYXJzZSB1c2VyIGlucHV0LiAgTXVzdCB1c2UgZGlzcGxheUZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiBkYXRlRm9ybWF0LiAgU2VlIGRvam8uZGF0ZS5mb3JtYXQgZm9yIHNwZWNpZmljYXRpb24uIiwgIjAuNSIpOworCQkJfWVsc2V7CisJCQkJdmFyIGlucHV0ID0gZG9qby5zdHJpbmcudHJpbSh0aGlzLmlucHV0Tm9kZS52YWx1ZSk7CisJCQkJaWYoaW5wdXQpeworCQkJCQl2YXIgaW5wdXRUaW1lID0gZG9qby5kYXRlLnBhcnNlKGlucHV0LAorCQkJCQkJCXtmb3JtYXRMZW5ndGg6dGhpcy5mb3JtYXRMZW5ndGgsIHRpbWVQYXR0ZXJuOnRoaXMuZGlzcGxheUZvcm1hdCwgc2VsZWN0b3I6J3RpbWVPbmx5JywgbG9jYWxlOnRoaXMubGFuZ30pOwkJCQorCQkJCQlpZihpbnB1dFRpbWUpeworCQkJCQkJdGhpcy5zZXRUaW1lKGlucHV0VGltZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnZhbHVlTm9kZS52YWx1ZSA9IGlucHV0OworCQkJCX0KKwkJCX0KKwkJCS8vIElmIHRoZSB0aW1lIGVudGVyZWQgZGlkbid0IHBhcnNlLCByZXNldCB0byB0aGUgb2xkIHRpbWUuICBLSVNTLCBmb3Igbm93LgorCQkJLy9UT0RPOiB1c2FiaWxpdHk/ICBzaG91bGQgd2UgcHJvdmlkZSBtb3JlIGZlZWRiYWNrIHNvbWVob3c/IGFuIGVycm9yIG5vdGljZT8KKwkJCS8vIHNlZW1zIHJlZHVuZGFudCB0byBkbyB0aGlzIGlmIHRoZSBwYXJzZSBmYWlsZWQsIGJ1dCBhdCBsZWFzdCB1bnRpbCB3ZSBoYXZlIHZhbGlkYXRpb24sCisJCQkvLyB0aGlzIHdpbGwgZml4IHVwIHRoZSBkaXNwbGF5IG9mIGVudHJpZXMgbGlrZSAwMS8zMi8yMDA2CisJCQlpZihpbnB1dCl7IHRoaXMuX3VwZGF0ZVRleHQoKTsgfQorCQl9LAorCisJCV9zeW5jVmFsdWVOb2RlOiBmdW5jdGlvbigpeworCQkJdmFyIHRpbWUgPSB0aGlzLnRpbWVQaWNrZXIudGltZTsKKwkJCXZhciB2YWx1ZTsKKwkJCXN3aXRjaCh0aGlzLnNhdmVGb3JtYXQudG9Mb3dlckNhc2UoKSl7CisJCQkJY2FzZSAicmZjIjogY2FzZSAiaXNvIjogY2FzZSAiIjoKKwkJCQkJdmFsdWUgPSBkb2pvLmRhdGUudG9SZmMzMzM5KHRpbWUsICd0aW1lT25seScpOworCQkJCQlicmVhazsKKwkJCQljYXNlICJwb3NpeCI6IGNhc2UgInVuaXgiOgorCQkJCQl2YWx1ZSA9IE51bWJlcih0aW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdmFsdWUgPSBkb2pvLmRhdGUuZm9ybWF0KHRpbWUsIHtkYXRlUGF0dGVybjp0aGlzLnNhdmVGb3JtYXQsIHNlbGVjdG9yOid0aW1lT25seScsIGxvY2FsZTp0aGlzLmxhbmd9KTsKKwkJCX0KKwkJCXRoaXMudmFsdWVOb2RlLnZhbHVlID0gdmFsdWU7CisJCX0sCisJCQorCQlkZXN0cm95OiBmdW5jdGlvbigvKkJvb2xlYW4qL2ZpbmFsaXplKXsKKwkJCXRoaXMudGltZVBpY2tlci5kZXN0cm95KGZpbmFsaXplKTsKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0KKyk7CisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vSWYgd2UgdXNlICJUaW1lUGlja2VyIiBmb3IgdGhlIG5hbWUsIERvam8gZ2V0J3MgY29uZnVzZWQgYW5kIGJyZWFrcworLy9UT0RPIHJlbW92ZSB0aGlzIGZpbGUgb24gbmV4dCBEb2pvIHJlbGVhc2UKKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVGltZVBpY2tlciIsCisgIGRvam8ud2lkZ2V0LkRyb3Bkb3duVGltZVBpY2tlciwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RpbWVQaWNrZXIiLAorCisgIGlucHV0TmFtZTogIiIsCisgIG5hbWU6ICIiLAorCisgIHZhbHVlTm90aWZ5VG9waWNzIDogIiIsCisgIHZhbHVlTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorCisgIHRhYkluZGV4IDogIiIsCisKKyAgcG9zdENyZWF0ZTogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNUaW1lUGlja2VyLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgLy9zZXQgY3NzQ2xhc3MKKyAgICBpZih0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSkgeworICAgICAgZG9qby5odG1sLnNldENsYXNzKHRoaXMuaW5wdXROb2RlLCB0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSk7CisgICAgfQorCisgICAgLy9zZXQgY3NzU3R5bGUKKyAgICBpZih0aGlzLmV4dHJhQXJncy5zdHlsZSkgeworICAgICAgZG9qby5odG1sLnNldFN0eWxlVGV4dCh0aGlzLmlucHV0Tm9kZSwgdGhpcy5leHRyYUFyZ3Muc3R5bGUpOworICAgIH0KKworICAgIC8vdmFsdWUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy52YWx1ZU5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMudmFsdWVOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL3RhYmluZGV4CisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YWJJbmRleCkpIHsKKyAgICAgIHRoaXMuaW5wdXROb2RlLnRhYkluZGV4ID0gdGhpcy50YWJJbmRleDsKKyAgICB9CisgIH0sCisKKyAgX3N5bmNWYWx1ZU5vZGU6ZnVuY3Rpb24gKCkgeworICAgIHZhciB0aW1lID0gdGhpcy50aW1lUGlja2VyLnRpbWU7CisgICAgdmFyIHZhbHVlOworICAgIHN3aXRjaCAodGhpcy5zYXZlRm9ybWF0LnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNhc2UgInJmYyI6CisgICAgICBjYXNlICJpc28iOgorICAgICAgY2FzZSAiIjoKKyAgICAgIC8vb3JpZ2luYWxseSwgRG9qbyBvbmx5IHNhdmVzIHRoZSB0aW1lIHBhcnQKKyAgICAgIHZhbHVlID0gZG9qby5kYXRlLnRvUmZjMzMzOSh0aW1lKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAicG9zaXgiOgorICAgICAgY2FzZSAidW5peCI6CisgICAgICB2YWx1ZSA9IE51bWJlcih0aW1lKTsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHZhbHVlID0gZG9qby5kYXRlLmZvcm1hdCh0aW1lLCB7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LCBzZWxlY3RvcjoidGltZU9ubHkiLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisgICAgfQorICAgIHRoaXMudmFsdWVOb2RlLnZhbHVlID0gdmFsdWU7CisgIH0sCisKKyAgX3VwZGF0ZVRleHQgOiBmdW5jdGlvbigpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIuc3VwZXJjbGFzcy5fdXBkYXRlVGV4dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIGlmKHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSAhPSBudWxsKSB7CisgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy52YWx1ZU5vdGlmeVRvcGljc0FycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB0b3BpYyA9IHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheVtpXTsKKyAgICAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodG9waWMpKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvam8uZXZlbnQudG9waWMucHVibGlzaCh0b3BpYywgdGhpcy5pbnB1dE5vZGUudmFsdWUsIHRoaXMuZ2V0VmFsdWUoKSwgdGhpcyk7CisgICAgICAgICAgfSBjYXRjaChleCkgeworICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5EYXRlUGlja2VyIik7CisKKworCisKKworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRGF0ZVBpY2tlciIsCisJZG9qby53aWRnZXQuSHRtbFdpZGdldCwKKwl7CQorCisJCS8qCisJCXN1bW1hcnk6IAorCQkJQmFzZSBjbGFzcyBmb3IgYSBzdGFuZC1hbG9uZSBEYXRlUGlja2VyIHdpZGdldCAKKwkJCXdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gc2VsZWN0IGEgZGF0ZSwgb3Igc3dpdGNoIGJ5IG1vbnRoIGFuZC9vciB5ZWFyLiAKKwkJZGVzY3JpcHRpb246IAorCQkJQSBzdGFuZC1hbG9uZSBEYXRlUGlja2VyIHdpZGdldCB0aGF0IG1ha2VzIGl0ICAKKwkJCWVhc3kgdG8gc2VsZWN0IGEgZGF0ZSwgb3IgaW5jcmVtZW50IGJ5IHdlZWssIG1vbnRoLCBhbmQvb3IgeWVhci4gCisJCQlJdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIG9uIGl0cyBvd24sIG9yIGluc2lkZSBvZiBvdGhlciB3aWRnZXRzIHRvICAKKwkJCShzZWUgZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyKSBvciBvdGhlciBzaW1pbGFyIGNvbWJpbmF0aW9uIHdpZGdldHMuIAorCQkgCSAgICAgICAgICAgICAgCisJCQlEYXRlcyBhdHRyaWJ1dGVzIHBhc3NlZCBpbiB0aGUgYFJGQyAzMzM5YCBmb3JtYXQ6CisJCQlodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMzMzOS5odG1sICgyMDA1LTA2LTMwVDA4OjA1OjAwLTA3OjAwKQorCQkJc28gdGhhdCB0aGV5IGFyZSBzZXJpYWxpemFibGUgYW5kIGxvY2FsZS1pbmRlcGVuZGVudC4KKwkJCisJCXVzYWdlOiAKKwkJCXZhciBkYXRlUGlja2VyID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJEYXRlUGlja2VyIiwge30sICAgCisJCQlkb2pvLmJ5SWQoImRhdGVQaWNrZXJOb2RlIikpOyAKKwkJIAkgCisJCQk8ZGl2IGRvam9UeXBlPSJEYXRlUGlja2VyIj48L2Rpdj4gCisJCSovCisKKwkJLy9zdGFydCBhdHRyaWJ1dGVzCisJCQorCQkvLyB2YWx1ZTogU3RyaW5nfERhdGUKKwkJLy8JZm9ybSB2YWx1ZSBwcm9wZXJ0eSBpZiA9PSd0b2RheScgd2lsbCBiZSB0b2RheSdzIGRhdGUKKwkJdmFsdWU6ICIiLCAKKworCQkvLyBuYW1lOiBTdHJpbmcKKwkJLy8gCW5hbWUgb2YgdGhlIGZvcm0gZWxlbWVudAorCQluYW1lOiAiIiwKKworCQkvLyBkaXNwbGF5V2Vla3M6IEludGVnZXIKKwkJLy8JdG90YWwgd2Vla3MgdG8gZGlzcGxheSBkZWZhdWx0IAorCQlkaXNwbGF5V2Vla3M6IDYsIAorCisJCS8vIGFkanVzdFdlZWtzOiBCb29sZWFuCisJCS8vCWlmIHRydWUsIHdlZWtseSBzaXplIG9mIGNhbGVuZGFyIGNoYW5nZXMgdG8gYWNvbW9kYXRlIHRoZSBtb250aCBpZiBmYWxzZSwgNDIgZGF5IGZvcm1hdCBpcyB1c2VkCisJCWFkanVzdFdlZWtzOiBmYWxzZSwKKworCQkvLyBzdGFydERhdGU6IFN0cmluZ3xEYXRlCisJCS8vCWZpcnN0IGF2YWlsYWJsZSBkYXRlIGluIHRoZSBjYWxlbmRhciBzZXQKKwkJc3RhcnREYXRlOiAiMTQ5Mi0xMC0xMiIsCisKKwkJLy8gZW5kRGF0ZTogU3RyaW5nfERhdGUKKwkJLy8JbGFzdCBhdmFpbGFibGUgZGF0ZSBpbiB0aGUgY2FsZW5kYXIgc2V0CisJCWVuZERhdGU6ICIyOTQxLTEwLTEyIiwKKworCQkvLyB3ZWVrU3RhcnRzT246IEludGVnZXIKKwkJLy8JYWRqdXN0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIDA9PVN1bmRheS4uNj09U2F0dXJkYXkKKwkJd2Vla1N0YXJ0c09uOiAiIiwKKworCQkvLyBzdGF0aWNEaXNwbGF5OiBCb29sZWFuCisJCS8vCWRpc2FibGUgYWxsIGluY3JlbWVudGFsIGNvbnRyb2xzLCBtdXN0IHBpY2sgYSBkYXRlIGluIHRoZSBjdXJyZW50IGRpc3BsYXkKKwkJc3RhdGljRGlzcGxheTogZmFsc2UsCisJCQorCQkvLyBkYXlXaWR0aDogU3RyaW5nCisJCS8vCWhvdyB0byByZW5kZXIgdGhlIG5hbWVzIG9mIHRoZSBkYXlzIGluIHRoZSBoZWFkZXIuIHNlZSBkb2pvLmRhdGUuZ2V0RGF5TmFtZXMKKwkJZGF5V2lkdGg6ICduYXJyb3cnLAorCisJCWNsYXNzTmFtZXM6IHsKKwkJLy8gc3VtbWFyeToKKwkJLy8Jc3RvcmVzIGEgbGlzdCBvZiBjbGFzcyBuYW1lcyB0aGF0IG1heSBiZSBvdmVycmlkZW4KKwkJLy8JVE9ETzogdGhpcyBpcyBub3QgZ29vZDsgY2FuJ3QgYmUgYWRqdXN0ZWQgdmlhIG1hcmt1cCwgZXRjLiBzaW5jZSBpdCdzIGFuIGFycmF5CisJCQlwcmV2aW91czogInByZXZpb3VzTW9udGgiLAorCQkJZGlzYWJsZWRQcmV2aW91czogInByZXZpb3VzTW9udGhEaXNhYmxlZCIsCisJCQljdXJyZW50OiAiY3VycmVudE1vbnRoIiwKKwkJCWRpc2FibGVkQ3VycmVudDogImN1cnJlbnRNb250aERpc2FibGVkIiwKKwkJCW5leHQ6ICJuZXh0TW9udGgiLAorCQkJZGlzYWJsZWROZXh0OiAibmV4dE1vbnRoRGlzYWJsZWQiLAorCQkJY3VycmVudERhdGU6ICJjdXJyZW50RGF0ZSIsCisJCQlzZWxlY3RlZERhdGU6ICJzZWxlY3RlZERhdGUiCisJCX0sCisJCXRlbXBsYXRlU3RyaW5nOiI8ZGl2IGNsYXNzPVwiZGF0ZVBpY2tlckNvbnRhaW5lclwiIGRvam9BdHRhY2hQb2ludD1cImRhdGVQaWNrZXJDb250YWluZXJOb2RlXCI+XHJcblx0PHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNsYXNzPVwiY2FsZW5kYXJDb250YWluZXJcIj5cclxuXHRcdDx0aGVhZD5cclxuXHRcdFx0PHRyPlxyXG5cdFx0XHRcdDx0ZCBjbGFzcz1cIm1vbnRoV3JhcHBlclwiIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0PHRhYmxlIGNsYXNzPVwibW9udGhDb250YWluZXJcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiBib3JkZXI9XCIwXCI+XHJcblx0XHRcdFx0XHRcdDx0cj5cclxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJtb250aEN1cnZlIG1vbnRoQ3VydmVUTFwiIHZhbGlnbj1cInRvcFwiPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwibW9udGhMYWJlbENvbnRhaW5lclwiIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVhc2VXZWVrTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoRXZlbnQ9XCJvbkNsaWNrOiBvbkluY3JlbWVudFdlZWs7XCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiaW5jcmVtZW50Q29udHJvbCBpbmNyZWFzZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7ZG9qb1dpZGdldE1vZHVsZVVyaX10ZW1wbGF0ZXMvaW1hZ2VzL2luY3JlbWVudE1vbnRoLnBuZ1wiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRhbHQ9XCImZGFycjtcIiBzdHlsZT1cIndpZHRoOjdweDtoZWlnaHQ6NXB4O1wiIC8+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVhc2VNb250aE5vZGVcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRNb250aDtcIiBjbGFzcz1cImluY3JlbWVudENvbnRyb2wgaW5jcmVhc2VcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCIke2Rvam9XaWRnZXRNb2R1bGVVcml9dGVtcGxhdGVzL2ltYWdlcy9pbmNyZW1lbnRNb250aC5wbmdcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbHQ9XCImZGFycjtcIiAgZG9qb0F0dGFjaFBvaW50PVwiaW5jcmVtZW50TW9udGhJbWFnZU5vZGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRkb2pvQXR0YWNoUG9pbnQ9XCJkZWNyZWFzZVdlZWtOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50V2VlaztcIiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nXCIgYWx0PVwiJnVhcnI7XCIgc3R5bGU9XCJ3aWR0aDo3cHg7aGVpZ2h0OjVweDtcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hQb2ludD1cImRlY3JlYXNlTW9udGhOb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50TW9udGg7XCIgY2xhc3M9XCJpbmNyZW1lbnRDb250cm9sIGRlY3JlYXNlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtkb2pvV2lkZ2V0TW9kdWxlVXJpfXRlbXBsYXRlcy9pbWFnZXMvZGVjcmVtZW50TW9udGgucG5nXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWx0PVwiJnVhcnI7XCIgZG9qb0F0dGFjaFBvaW50PVwiZGVjcmVtZW50TW9udGhJbWFnZU5vZGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cIm1vbnRoTGFiZWxOb2RlXCIgY2xhc3M9XCJtb250aFwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIm1vbnRoQ3VydmUgbW9udGhDdXJ2ZVRSXCIgdmFsaWduPVwidG9wXCI+PC90ZD5cclxuXHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGhlYWQ+XHJcblx0XHQ8dGJvZHk+XHJcblx0XHRcdDx0cj5cclxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjNcIj5cclxuXHRcdFx0XHRcdDx0YWJsZSBjbGFzcz1cImNhbGVuZGFyQm9keUNvbnRhaW5lclwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGJvcmRlcj1cIjBcIj5cclxuXHRcdFx0XHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJkYXlMYWJlbHNSb3dcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0XHRcdDwvdGhlYWQ+XHJcblx0XHRcdFx0XHRcdDx0Ym9keSBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhckRhdGVzQ29udGFpbmVyTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IF9oYW5kbGVVaUNsaWNrO1wiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ciBkb2pvQXR0YWNoUG9pbnQ9XCJjYWxlbmRhcldlZWtUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGQ+PC90ZD5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZD48L3RkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRkPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHRcdDwvdGFibGU+XHJcblx0XHRcdFx0PC90ZD5cclxuXHRcdFx0PC90cj5cclxuXHRcdDwvdGJvZHk+XHJcblx0XHQ8dGZvb3Q+XHJcblx0XHRcdDx0cj5cclxuXHRcdFx0XHQ8dGQgY29sc3Bhbj1cIjNcIiBjbGFzcz1cInllYXJXcmFwcGVyXCI+XHJcblx0XHRcdFx0XHQ8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCIgYm9yZGVyPVwiMFwiIGNsYXNzPVwieWVhckNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8dHI+XHJcblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiY3VydmVCTFwiIHZhbGlnbj1cInRvcFwiPjwvdGQ+XHJcblx0XHRcdFx0XHRcdFx0PHRkIHZhbGlnbj1cInRvcFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGgzIGNsYXNzPVwieWVhckxhYmVsXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGRvam9BdHRhY2hQb2ludD1cInByZXZpb3VzWWVhckxhYmVsTm9kZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9qb0F0dGFjaEV2ZW50PVwib25DbGljazogb25JbmNyZW1lbnRZZWFyO1wiIGNsYXNzPVwicHJldmlvdXNZZWFyXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInNlbGVjdGVkWWVhclwiIGRvam9BdHRhY2hQb2ludD1cImN1cnJlbnRZZWFyTGFiZWxOb2RlXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9XCJuZXh0WWVhckxhYmVsTm9kZVwiIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRvam9BdHRhY2hFdmVudD1cIm9uQ2xpY2s6IG9uSW5jcmVtZW50WWVhcjtcIiBjbGFzcz1cIm5leHRZZWFyXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9oMz5cclxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cImN1cnZlQlJcIiB2YWxpZ249XCJ0b3BcIj48L3RkPlxyXG5cdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L3RyPlxyXG5cdFx0PC90Zm9vdD5cclxuXHQ8L3RhYmxlPlxyXG48L2Rpdj5cclxuIiwKKwkJdGVtcGxhdGVDc3NTdHJpbmc6Ii5kYXRlUGlja2VyQ29udGFpbmVyIHtcclxuXHR3aWR0aDoxNjRweDsgLyogbmVlZGVkIGZvciBwcm9wZXIgdXNlciBzdHlsaW5nICovXHJcbn1cclxuXHJcbi5jYWxlbmRhckNvbnRhaW5lciB7XHJcbi8qXHRib3JkZXI6MXB4IHNvbGlkICM1NjZmOGY7Ki9cclxufVxyXG5cclxuLmNhbGVuZGFyQm9keUNvbnRhaW5lciB7XHJcblx0d2lkdGg6MTAwJTsgLyogbmVlZGVkIGZvciB0aGUgZXhwbG9kZSBlZmZlY3QgKGV4cGxhaW4/KSAqL1xyXG5cdGJhY2tncm91bmQ6ICM3NTkxYmMgdXJsKFwiaW1hZ2VzL2RwQmcuZ2lmXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xyXG59XHJcblxyXG4uY2FsZW5kYXJCb2R5Q29udGFpbmVyIHRoZWFkIHRyIHRkIHtcclxuXHRjb2xvcjojMjkzYTRiO1xyXG5cdGZvbnQ6Ym9sZCAwLjc1ZW0gSGVsdmV0aWNhLCBBcmlhbCwgVmVyZGFuYSwgc2Fucy1zZXJpZjtcclxuXHR0ZXh0LWFsaWduOmNlbnRlcjtcclxuXHRwYWRkaW5nOjAuMjVlbTtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBIb3JpekxpbmUuZ2lmXCIpIGJvdHRvbSBsZWZ0IHJlcGVhdC14O1xyXG59XHJcblxyXG4uY2FsZW5kYXJCb2R5Q29udGFpbmVyIHRib2R5IHRyIHRkIHtcclxuXHRjb2xvcjojZmZmO1xyXG5cdGZvbnQ6Ym9sZCAwLjdlbSBIZWx2ZXRpY2EsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xyXG5cdHRleHQtYWxpZ246Y2VudGVyO1xyXG5cdHBhZGRpbmc6MC40ZW07XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwVmVydExpbmUuZ2lmXCIpIHRvcCByaWdodCByZXBlYXQteTtcclxuXHRjdXJzb3I6cG9pbnRlcjtcclxuXHRjdXJzb3I6aGFuZDtcclxufVxyXG5cclxuXHJcbi5tb250aFdyYXBwZXIge1xyXG5cdHBhZGRpbmctYm90dG9tOjJweDtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBIb3JpekxpbmUuZ2lmXCIpIGJvdHRvbSBsZWZ0IHJlcGVhdC14O1xyXG59XHJcblxyXG4ubW9udGhDb250YWluZXIge1xyXG5cdHdpZHRoOjEwMCU7XHJcbn1cclxuXHJcbi5tb250aExhYmVsQ29udGFpbmVyIHtcclxuXHR0ZXh0LWFsaWduOmNlbnRlcjtcclxuXHRmb250OmJvbGQgMC43NWVtIEhlbHZldGljYSwgQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwTW9udGhCZy5wbmdcIikgcmVwZWF0LXggdG9wIGxlZnQgIWltcG9ydGFudDtcclxuXHRjb2xvcjojMjkzYTRiO1xyXG5cdHBhZGRpbmc6MC4yNWVtO1xyXG59XHJcblxyXG4ubW9udGhDdXJ2ZSB7XHJcblx0d2lkdGg6MTJweDtcclxufVxyXG5cclxuLm1vbnRoQ3VydmVUTCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUTC5wbmdcIikgbm8tcmVwZWF0IHRvcCBsZWZ0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5tb250aEN1cnZlVFIge1xyXG5cdFx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVUUi5wbmdcIikgbm8tcmVwZWF0IHRvcCByaWdodCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5cclxuLnllYXJXcmFwcGVyIHtcclxuXHRiYWNrZ3JvdW5kOiB1cmwoXCJpbWFnZXMvZHBIb3JpekxpbmVGb290LmdpZlwiKSB0b3AgbGVmdCByZXBlYXQteDtcclxuXHRwYWRkaW5nLXRvcDoycHg7XHJcbn1cclxuXHJcbi55ZWFyQ29udGFpbmVyIHtcclxuXHR3aWR0aDoxMDAlO1xyXG59XHJcblxyXG4ueWVhckNvbnRhaW5lciB0ZCB7XHJcblx0YmFja2dyb3VuZDp1cmwoXCJpbWFnZXMvZHBZZWFyQmcucG5nXCIpIHRvcCBsZWZ0IHJlcGVhdC14O1xyXG59XHJcblxyXG4ueWVhckNvbnRhaW5lciAueWVhckxhYmVsIHtcclxuXHRtYXJnaW46MDtcclxuXHRwYWRkaW5nOjAuNDVlbSAwIDAuNDVlbSAwO1xyXG5cdGNvbG9yOiNmZmY7XHJcblx0Zm9udDpib2xkIDAuNzVlbSBIZWx2ZXRpY2EsIEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xyXG5cdHRleHQtYWxpZ246Y2VudGVyO1xyXG59XHJcblxyXG4uY3VydmVCTCB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCTC5wbmdcIikgYm90dG9tIGxlZnQgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7XHJcblx0d2lkdGg6OXB4ICFpbXBvcnRhbnQ7XHJcblx0cGFkZGluZzowO1xyXG5cdG1hcmdpbjowO1xyXG59XHJcblxyXG4uY3VydmVCUiB7XHJcblx0YmFja2dyb3VuZDogdXJsKFwiaW1hZ2VzL2RwQ3VydmVCUi5wbmdcIikgYm90dG9tIHJpZ2h0IG5vLXJlcGVhdCAhaW1wb3J0YW50O1xyXG5cdHdpZHRoOjlweCAhaW1wb3J0YW50O1xyXG5cdHBhZGRpbmc6MDtcclxuXHRtYXJnaW46MDtcclxufVxyXG5cclxuXHJcbi5wcmV2aW91c01vbnRoIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiM2NzgyYTggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnByZXZpb3VzTW9udGhEaXNhYmxlZCB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojYTRhNWE2ICFpbXBvcnRhbnQ7XHJcblx0Y3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudFxyXG59XHJcbi5jdXJyZW50TW9udGgge1xyXG59XHJcblxyXG4uY3VycmVudE1vbnRoRGlzYWJsZWQge1xyXG5cdGJhY2tncm91bmQtY29sb3I6I2JiYmJiYyAhaW1wb3J0YW50O1xyXG5cdGN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnRcclxufVxyXG4ubmV4dE1vbnRoIHtcclxuXHRiYWNrZ3JvdW5kLWNvbG9yOiM2NzgyYTggIWltcG9ydGFudDtcclxufVxyXG4ubmV4dE1vbnRoRGlzYWJsZWQge1xyXG5cdGJhY2tncm91bmQtY29sb3I6I2E0YTVhNiAhaW1wb3J0YW50O1xyXG5cdGN1cnNvcjpkZWZhdWx0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5jdXJyZW50RGF0ZSB7XHJcblx0dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtcclxuXHRmb250LXN0eWxlOml0YWxpYztcclxufVxyXG5cclxuLnNlbGVjdGVkRGF0ZSB7XHJcblx0YmFja2dyb3VuZC1jb2xvcjojZmZmICFpbXBvcnRhbnQ7XHJcblx0Y29sb3I6IzY3ODJhOCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ueWVhckxhYmVsIC5zZWxlY3RlZFllYXIge1xyXG5cdHBhZGRpbmc6MC4yZW07XHJcblx0YmFja2dyb3VuZC1jb2xvcjojOWVjM2ZiICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5uZXh0WWVhciwgLnByZXZpb3VzWWVhciB7XHJcblx0Y3Vyc29yOnBvaW50ZXI7Y3Vyc29yOmhhbmQ7XHJcblx0cGFkZGluZzowO1xyXG59XHJcblxyXG4ubmV4dFllYXIge1xyXG5cdG1hcmdpbjowIDAgMCAwLjU1ZW07XHJcbn1cclxuXHJcbi5wcmV2aW91c1llYXIge1xyXG5cdG1hcmdpbjowIDAuNTVlbSAwIDA7XHJcbn1cclxuXHJcbi5pbmNyZW1lbnRDb250cm9sIHtcclxuXHRjdXJzb3I6cG9pbnRlcjtjdXJzb3I6aGFuZDtcclxuXHR3aWR0aDoxZW07XHJcbn1cclxuXHJcbi5pbmNyZWFzZSB7XHJcblx0ZmxvYXQ6cmlnaHQ7XHJcbn1cclxuXHJcbi5kZWNyZWFzZSB7XHJcblx0ZmxvYXQ6bGVmdDtcclxufVxyXG5cclxuLmxhc3RDb2x1bW4ge1xyXG5cdGJhY2tncm91bmQtaW1hZ2U6bm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5cclxuIix0ZW1wbGF0ZUNzc1BhdGg6ICBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9EYXRlUGlja2VyLmNzcyIpLAorCisJCXBvc3RNaXhJblByb3BlcnRpZXM6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiBzZWUgZG9qby53aWRnZXQuRG9tV2lkZ2V0CisKKwkJCWRvam8ud2lkZ2V0LkRhdGVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQlpZighdGhpcy53ZWVrU3RhcnRzT24peworCQkJCXRoaXMud2Vla1N0YXJ0c09uPWRvam8uZGF0ZS5nZXRGaXJzdERheU9mV2Vlayh0aGlzLmxhbmcpOworCQkJfQorCQkJdGhpcy50b2RheSA9IG5ldyBEYXRlKCk7CisJCQl0aGlzLnRvZGF5LnNldEhvdXJzKDAsMCwwLDApOworCQkJaWYodHlwZW9mKHRoaXMudmFsdWUpPT0nc3RyaW5nJyYmdGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpPT0ndG9kYXknKXsKKwkJCQl0aGlzLnZhbHVlID0gbmV3IERhdGUoKTsKKwkJCX1lbHNlIGlmKHRoaXMudmFsdWUgJiYgKHR5cGVvZiB0aGlzLnZhbHVlPT0ic3RyaW5nIikgJiYgKHRoaXMudmFsdWUuc3BsaXQoIi0iKS5sZW5ndGggPiAyKSkgeworCQkJCXRoaXMudmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy52YWx1ZSk7CisJCQkJdGhpcy52YWx1ZS5zZXRIb3VycygwLDAsMCwwKTsKKwkJCX0KKwkJfSwKKworCQlmaWxsSW5UZW1wbGF0ZTogZnVuY3Rpb24oYXJncywgZnJhZykgeworCQkJLy8gc3VtbWFyeTogc2VlIGRvam8ud2lkZ2V0LkRvbVdpZGdldAorCisJCQlkb2pvLndpZGdldC5EYXRlUGlja2VyLnN1cGVyY2xhc3MuZmlsbEluVGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCQkJLy8gQ29weSBzdHlsZSBpbmZvIGZyb20gaW5wdXQgbm9kZSB0byBvdXRwdXQgbm9kZQorCQkJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0RnJhZ05vZGVSZWYoZnJhZyk7CisJCQlkb2pvLmh0bWwuY29weVN0eWxlKHRoaXMuZG9tTm9kZSwgc291cmNlKTsKKworCQkJdGhpcy53ZWVrVGVtcGxhdGUgPSBkb2pvLmRvbS5yZW1vdmVOb2RlKHRoaXMuY2FsZW5kYXJXZWVrVGVtcGxhdGUpOworCQkJdGhpcy5fcHJlSW5pdFVJKHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy50b2RheSwgZmFsc2UsIHRydWUpOyAvL2luaXQgVUkgd2l0aCBkYXRlIHNlbGVjdGVkIE9OTFkgaWYgdXNlciBzdXBwbGllcyBvbmUKKworCQkJLy8gSW5zZXJ0IGxvY2FsaXplZCBkYXkgbmFtZXMgaW4gdGhlIHRlbXBsYXRlCisJCQl2YXIgZGF5TGFiZWxzID0gZG9qby5sYW5nLnVubmVzdChkb2pvLmRhdGUuZ2V0TmFtZXMoJ2RheXMnLCB0aGlzLmRheVdpZHRoLCAnc3RhbmRBbG9uZScsIHRoaXMubGFuZykpOyAvL2lmIHdlIGRvbnQgdXNlIHVubmVzdCwgd2UgcmlzayBtb2RpZnlpbmcgdGhlIGRheUxhYmVscyBhcnJheSBpbnNpZGUgb2YgZG9qby5kYXRlIGFuZCBzY3Jld2luZyB1cCBvdGhlciBjYWxlbmRhcnMgb24gdGhlIHBhZ2UKKwkJCWlmKHRoaXMud2Vla1N0YXJ0c09uPjApeworCQkJCS8vYWRqdXN0IGRheUxhYmVscyBmb3IgZGlmZmVyZW50IGZpcnN0IGRheSBvZiB3ZWVrLiBpZTogTW9uZGF5IG9yIFRodXJzZGF5IGluc3RlYWQgb2YgU3VuZGF5CisJCQkJZm9yKHZhciBpPTA7aTx0aGlzLndlZWtTdGFydHNPbjtpKyspeworCQkJCQlkYXlMYWJlbHMucHVzaChkYXlMYWJlbHMuc2hpZnQoKSk7CisJCQkJfQorCQkJfQorCQkJdmFyIGRheUxhYmVsTm9kZXMgPSB0aGlzLmRheUxhYmVsc1Jvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKKyAJCQlmb3IoaT0wOyBpPDc7IGkrKykgeworCQkJCWRheUxhYmVsTm9kZXMuaXRlbShpKS5pbm5lckhUTUwgPSBkYXlMYWJlbHNbaV07CisJCQl9CisKKwkJCWlmKHRoaXMudmFsdWUpeworCQkJCXRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSk7CisJCQl9CisKKwkJfSwKKwkJCisJCWdldFZhbHVlOiBmdW5jdGlvbigpIHsKKwkJCS8vIHN1bW1hcnk6IHJldHVybiBjdXJyZW50IGRhdGUgaW4gUkZDIDMzMzkgZm9ybWF0CisJCQlyZXR1cm4gZG9qby5kYXRlLnRvUmZjMzMzOShuZXcgRGF0ZSh0aGlzLnZhbHVlKSwnZGF0ZU9ubHknKTsgLypTdHJpbmcqLworCQl9LAorCisJCWdldERhdGU6IGZ1bmN0aW9uKCkgeworCQkJLy8gc3VtbWFyeTogcmV0dXJuIGN1cnJlbnQgZGF0ZSBhcyBhIERhdGUgb2JqZWN0CisJCQlyZXR1cm4gdGhpcy52YWx1ZTsgLypEYXRlKi8KKwkJfSwKKworCQlzZXRWYWx1ZTogZnVuY3Rpb24oLypEYXRlfFN0cmluZyovcmZjRGF0ZSkgeworCQkJLy9zdW1tYXJ5OiBzZXQgdGhlIGN1cnJlbnQgZGF0ZSBmcm9tIFJGQyAzMzM5IGZvcm1hdHRlZCBzdHJpbmcgb3IgYSBkYXRlIG9iamVjdCwgc3lub255bW91cyB3aXRoIHNldERhdGUKKwkJCXRoaXMuc2V0RGF0ZShyZmNEYXRlKTsKKwkJfSwJCQkKKworCQlzZXREYXRlOiBmdW5jdGlvbigvKkRhdGV8U3RyaW5nKi9kYXRlT2JqKSB7CisJCQkvL3N1bW1hcnk6IHNldCB0aGUgY3VycmVudCBkYXRlIGFuZCB1cGRhdGUgdGhlIFVJCisJCQlpZihkYXRlT2JqID09ICIiKXsKKwkJCQl0aGlzLnZhbHVlID0gIiI7CisJCQkJdGhpcy5fcHJlSW5pdFVJKHRoaXMuY3VyTW9udGgsZmFsc2UsdHJ1ZSk7CisJCQl9ZWxzZSBpZih0eXBlb2YgZGF0ZU9iaj09InN0cmluZyIpeworCQkJCXRoaXMudmFsdWUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkoZGF0ZU9iaik7CisJCQkJdGhpcy52YWx1ZS5zZXRIb3VycygwLDAsMCwwKTsKKwkJCX1lbHNleworCQkJCXRoaXMudmFsdWUgPSBuZXcgRGF0ZShkYXRlT2JqKTsKKwkJCQl0aGlzLnZhbHVlLnNldEhvdXJzKDAsMCwwLDApOworCQkJfQorCQkJaWYodGhpcy5zZWxlY3RlZE5vZGUhPW51bGwpeworCQkJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLnNlbGVjdGVkTm9kZSx0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWREYXRlKTsKKwkJCX0KKwkJCWlmKHRoaXMuY2xpY2tlZE5vZGUhPW51bGwpeworCQkJCWRvam8uZGVidWcoJ2FkZGluZyBzZWxlY3RlZERhdGUnKTsKKwkJCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5jbGlja2VkTm9kZSx0aGlzLmNsYXNzTmFtZXMuc2VsZWN0ZWREYXRlKTsKKwkJCQl0aGlzLnNlbGVjdGVkTm9kZSA9IHRoaXMuY2xpY2tlZE5vZGU7CisJCQl9ZWxzZXsKKwkJCQkvL29ubHkgY2FsbCB0aGlzIGlmIHNldERhdGUgd2FzIGNhbGxlZCBieSBtZWFucyBvdGhlciB0aGFuIGNsaWNraW5nIGEgZGF0ZQorCQkJCXRoaXMuX3ByZUluaXRVSSh0aGlzLnZhbHVlLGZhbHNlLHRydWUpOworCQkJfQorCQkJdGhpcy5jbGlja2VkTm9kZT1udWxsOworCQkJdGhpcy5vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTsKKwkJfSwKKworCQlfcHJlSW5pdFVJOiBmdW5jdGlvbihkYXRlT2JqLGluaXRGaXJzdCxpbml0VUkpIHsKKwkJCS8qCisJIAkgICAgICAgICAgICAgIFRvIGdldCBhIHNlbnNlIG9mIHdoYXQgbW9udGggdG8gaGlnaGxpZ2h0LCB3ZSBpbml0aWFsaXplIG9uIAorCSAJICAgICAgICAgICAgICB0aGUgZmlyc3QgU2F0dXJkYXkgb2YgZWFjaCBtb250aCwgc2luY2UgdGhhdCB3aWxsIGJlIGVpdGhlciB0aGUgZmlyc3QgIAorCSAJICAgICAgICAgICAgICBvZiB0d28gb3IgdGhlIHNlY29uZCBvZiB0aHJlZSBtb250aHMgYmVpbmcgcGFydGlhbGx5IGRpc3BsYXllZCwgYW5kICAKKwkgCSAgICAgICAgICAgICAgdGhlbiB3b3JrIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMgZnJvbSB0aGF0IHBvaW50LgorCQkJKi8KKworCQkJLy9pbml0Rmlyc3QgaXMgdG8gdGVsbCBfaW5pdEZpcnN0RGF5IGlmIHlvdSB3YW50IGZpcnN0IGRheSBvZiB0aGUgZGlzcGxheWVkIGNhbGVuZGFyLCBvciBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgZm9yIGRhdGVPYmoKKwkJCS8vaW5pdFVJIHRlbGxzIHByZUluaXRVSSB0byBnbyBhaGVhZCBhbmQgcnVuIGluaXRVSSBpZiBzZXQgdG8gdHJ1ZQorCQkJaWYodHlwZW9mKHRoaXMuc3RhcnREYXRlKSA9PSAic3RyaW5nIil7CisJCQkJdGhpcy5zdGFydERhdGUgPSBkb2pvLmRhdGUuZnJvbVJmYzMzMzkodGhpcy5zdGFydERhdGUpOworCQkJfQorCQkJaWYodHlwZW9mKHRoaXMuZW5kRGF0ZSkgPT0gInN0cmluZyIpeworCQkJCXRoaXMuZW5kRGF0ZSA9IGRvam8uZGF0ZS5mcm9tUmZjMzMzOSh0aGlzLmVuZERhdGUpOworCQkJfQorCQkJdGhpcy5zdGFydERhdGUuc2V0SG91cnMoMCwwLDAsMCk7IC8vYWRqdXN0IHN0YXJ0RGF0ZSB0byBiZSBleGFjdGx5IG1pZG5pZ2h0CisJCQl0aGlzLmVuZERhdGUuc2V0SG91cnMoMjQsMCwwLC0xKTsgLy9hZGp1c3RpbmcgZW5kRGF0ZSB0byBiZSBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kIGJlZm9yZSAgbWlkbmlnaHQKKworCQkJaWYoZGF0ZU9iajx0aGlzLnN0YXJ0RGF0ZXx8ZGF0ZU9iaj50aGlzLmVuZERhdGUpeworCQkJCWRhdGVPYmogPSBuZXcgRGF0ZSgoZGF0ZU9iajx0aGlzLnN0YXJ0RGF0ZSk/dGhpcy5zdGFydERhdGU6dGhpcy5lbmREYXRlKTsKKwkJCX0KKwkJCXRoaXMuZmlyc3REYXkgPSB0aGlzLl9pbml0Rmlyc3REYXkoZGF0ZU9iaixpbml0Rmlyc3QpOworCQkJdGhpcy5zZWxlY3RlZElzVXNlZCA9IGZhbHNlOworCQkJdGhpcy5jdXJyZW50SXNVc2VkID0gZmFsc2U7CisJCQl2YXIgbmV4dERhdGUgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwkJCXZhciB0bXBNb250aCA9IG5leHREYXRlLmdldE1vbnRoKCk7CisJCQl0aGlzLmN1ck1vbnRoID0gbmV3IERhdGUobmV4dERhdGUpOworCQkJdGhpcy5jdXJNb250aC5zZXREYXRlKG5leHREYXRlLmdldERhdGUoKSs2KTsgLy9maXJzdCBzYXR1cmRheSBnaXZlcyB1cyB0aGUgY3VycmVudCBNb250aAorCQkJdGhpcy5jdXJNb250aC5zZXREYXRlKDEpOworCQkJaWYodGhpcy5kaXNwbGF5V2Vla3M9PSIiIHx8IHRoaXMuYWRqdXN0V2Vla3MpeworCQkJCXRoaXMuYWRqdXN0V2Vla3MgPSB0cnVlOworCQkJCXRoaXMuZGlzcGxheVdlZWtzID0gTWF0aC5jZWlsKChkb2pvLmRhdGUuZ2V0RGF5c0luTW9udGgodGhpcy5jdXJNb250aCkgKyB0aGlzLl9nZXRBZGp1c3RlZERheSh0aGlzLmN1ck1vbnRoKSkvNyk7CisJCQl9CisJCQl2YXIgZGF5cyA9IHRoaXMuZGlzcGxheVdlZWtzKjc7IC8vaW5pdCB0b3RhbCBkYXlzIHRvIGRpc3BsYXkKKwkJCWlmKGRvam8uZGF0ZS5kaWZmKHRoaXMuc3RhcnREYXRlLHRoaXMuZW5kRGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVkpIDwgZGF5cyl7CisJCQkJdGhpcy5zdGF0aWNEaXNwbGF5ID0gdHJ1ZTsKKwkJCQlpZihkb2pvLmRhdGUuZGlmZihuZXh0RGF0ZSx0aGlzLmVuZERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuREFZKSA+IGRheXMpeworCQkJCQl0aGlzLl9wcmVJbml0VUkodGhpcy5zdGFydERhdGUsdHJ1ZSxmYWxzZSk7CisJCQkJCW5leHREYXRlID0gbmV3IERhdGUodGhpcy5maXJzdERheSk7CisJCQkJfQorCQkJCXRoaXMuY3VyTW9udGggPSBuZXcgRGF0ZShuZXh0RGF0ZSk7CisJCQkJdGhpcy5jdXJNb250aC5zZXREYXRlKG5leHREYXRlLmdldERhdGUoKSs2KTsKKwkJCQl0aGlzLmN1ck1vbnRoLnNldERhdGUoMSk7CisJCQkJdmFyIGN1ckNsYXNzID0gKG5leHREYXRlLmdldE1vbnRoKCkgPT0gdGhpcy5jdXJNb250aC5nZXRNb250aCgpKT8nY3VycmVudCc6J3ByZXZpb3VzJzsKKwkJCX0KKwkJCWlmKGluaXRVSSl7CisJCQkJdGhpcy5faW5pdFVJKGRheXMpOworCQkJfQorCQl9LAorCQlfaW5pdFVJOiBmdW5jdGlvbihkYXlzKSB7CisJCQlkb2pvLmRvbS5yZW1vdmVDaGlsZHJlbih0aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlKTsKKwkJCWZvcih2YXIgaT0wO2k8dGhpcy5kaXNwbGF5V2Vla3M7aSsrKXsKKwkJCQl0aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlLmFwcGVuZENoaWxkKHRoaXMud2Vla1RlbXBsYXRlLmNsb25lTm9kZSh0cnVlKSk7CisJCQl9CisKKwkJCXZhciBuZXh0RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZmlyc3REYXkpOworCQkJdGhpcy5fc2V0TW9udGhMYWJlbCh0aGlzLmN1ck1vbnRoLmdldE1vbnRoKCkpOworCQkJdGhpcy5fc2V0WWVhckxhYmVscyh0aGlzLmN1ck1vbnRoLmdldEZ1bGxZZWFyKCkpOworCQkJdmFyIGNhbGVuZGFyTm9kZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXNDb250YWluZXJOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOworCQkJdmFyIGNhbGVuZGFyUm93cyA9IHRoaXMuY2FsZW5kYXJEYXRlc0NvbnRhaW5lck5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7CisJCQl2YXIgY3VycmVudENhbGVuZGFyTm9kZTsKKwkJCWZvcihpPTA7aTxkYXlzO2krKyl7CisJCQkJLy90aGlzIGlzIG91ciBuZXcgVUkgbG9vcC4uLiBvbmUgbG9vcCB0byBydWxlIHRoZW0gYWxsLCBhbmQgaW4gdGhlIGRhdGVwaWNrZXIgYmluZCB0aGVtCisJCQkJY3VycmVudENhbGVuZGFyTm9kZSA9IGNhbGVuZGFyTm9kZXMuaXRlbShpKTsKKwkJCQljdXJyZW50Q2FsZW5kYXJOb2RlLmlubmVySFRNTCA9IG5leHREYXRlLmdldERhdGUoKTsKKwkJCQljdXJyZW50Q2FsZW5kYXJOb2RlLnNldEF0dHJpYnV0ZSgiZGpEYXRlVmFsdWUiLG5leHREYXRlLnZhbHVlT2YoKSk7CisJCQkJdmFyIGN1ckNsYXNzID0gKG5leHREYXRlLmdldE1vbnRoKCkgIT0gdGhpcy5jdXJNb250aC5nZXRNb250aCgpICYmIE51bWJlcihuZXh0RGF0ZSkgPCBOdW1iZXIodGhpcy5jdXJNb250aCkpPydwcmV2aW91cyc6KG5leHREYXRlLmdldE1vbnRoKCk9PXRoaXMuY3VyTW9udGguZ2V0TW9udGgoKSk/J2N1cnJlbnQnOiduZXh0JzsKKwkJCQl2YXIgbWFwcGVkQ2xhc3MgPSBjdXJDbGFzczsKKwkJCQlpZih0aGlzLl9pc0Rpc2FibGVkRGF0ZShuZXh0RGF0ZSkpeworCQkJCQl2YXIgY2xhc3NNYXA9e3ByZXZpb3VzOiJkaXNhYmxlZFByZXZpb3VzIixjdXJyZW50OiJkaXNhYmxlZEN1cnJlbnQiLG5leHQ6ImRpc2FibGVkTmV4dCJ9OworCQkJCQltYXBwZWRDbGFzcz1jbGFzc01hcFtjdXJDbGFzc107CisJCQkJfQorCQkJCWRvam8uaHRtbC5zZXRDbGFzcyhjdXJyZW50Q2FsZW5kYXJOb2RlLCB0aGlzLl9nZXREYXRlQ2xhc3NOYW1lKG5leHREYXRlLCBtYXBwZWRDbGFzcykpOworCQkJCWlmKGRvam8uaHRtbC5oYXNDbGFzcyhjdXJyZW50Q2FsZW5kYXJOb2RlLHRoaXMuY2xhc3NOYW1lcy5zZWxlY3RlZERhdGUpKXsKKwkJCQkJdGhpcy5zZWxlY3RlZE5vZGUgPSBjdXJyZW50Q2FsZW5kYXJOb2RlOworCQkJCX0KKwkJCQluZXh0RGF0ZSA9IGRvam8uZGF0ZS5hZGQobmV4dERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuREFZLCAxKTsKKwkJCX0KKwkJCXRoaXMubGFzdERheSA9IGRvam8uZGF0ZS5hZGQobmV4dERhdGUsZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVksLTEpOworCQkJdGhpcy5faW5pdENvbnRyb2xzKCk7CisJCX0sCisJCV9pbml0Q29udHJvbHM6IGZ1bmN0aW9uKCl7CisJCQl2YXIgZCA9IHRoaXMuZmlyc3REYXk7CisJCQl2YXIgZDIgPSB0aGlzLmxhc3REYXk7CisJCQl2YXIgZGVjV2VlaywgaW5jV2VlaywgZGVjTW9udGgsIGluY01vbnRoLCBkZWNZZWFyLCBpbmNZZWFyOworCQkJZGVjV2VlayA9IGluY1dlZWsgPSBkZWNNb250aCA9IGluY01vbnRoID0gZGVjWWVhciA9IGluY1llYXIgPSAhdGhpcy5zdGF0aWNEaXNwbGF5OworCQkJd2l0aChkb2pvLmRhdGUuZGF0ZVBhcnRzKXsKKwkJCQl2YXIgYWRkID0gZG9qby5kYXRlLmFkZDsKKwkJCQlpZihkZWNXZWVrICYmIGFkZChkLERBWSwoLTEqKHRoaXMuX2dldEFkanVzdGVkRGF5KGQpKzEpKSk8dGhpcy5zdGFydERhdGUpeworCQkJCQlkZWNXZWVrID0gZGVjTW9udGggPSBkZWNZZWFyID0gZmFsc2U7CisJCQkJfQorCQkJCWlmKGluY1dlZWsgJiYgZDI+dGhpcy5lbmREYXRlKXsKKwkJCQkJaW5jV2VlayA9IGluY01vbnRoID0gaW5jWWVhciA9IGZhbHNlOworCQkJCX0KKwkJCQlpZihkZWNNb250aCAmJiBhZGQoZCxEQVksLTEpPHRoaXMuc3RhcnREYXRlKXsKKwkJCQkJZGVjTW9udGggPSBkZWNZZWFyID0gZmFsc2U7CisJCQkJfQorCQkJCWlmKGluY01vbnRoICYmIGFkZChkMixEQVksMSk+dGhpcy5lbmREYXRlKXsKKwkJCQkJaW5jTW9udGggPSBpbmNZZWFyID0gZmFsc2U7CisJCQkJfQorCQkJCWlmKGRlY1llYXIgJiYgYWRkKGQyLFlFQVIsLTEpPHRoaXMuc3RhcnREYXRlKXsKKwkJCQkJZGVjWWVhciA9IGZhbHNlOworCQkJCX0KKwkJCQlpZihpbmNZZWFyICYmIGFkZChkLFlFQVIsMSk+dGhpcy5lbmREYXRlKXsKKwkJCQkJaW5jWWVhciA9IGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJZnVuY3Rpb24gZW5hYmxlQ29udHJvbChub2RlLCBlbmFibGVkKXsKKwkJCQlkb2pvLmh0bWwuc2V0VmlzaWJpbGl0eShub2RlLCBlbmFibGVkID8gJycgOiAnaGlkZGVuJyk7CisJCQl9CisJCQllbmFibGVDb250cm9sKHRoaXMuZGVjcmVhc2VXZWVrTm9kZSxkZWNXZWVrKTsKKwkJCWVuYWJsZUNvbnRyb2wodGhpcy5pbmNyZWFzZVdlZWtOb2RlLGluY1dlZWspOworCQkJZW5hYmxlQ29udHJvbCh0aGlzLmRlY3JlYXNlTW9udGhOb2RlLGRlY01vbnRoKTsKKwkJCWVuYWJsZUNvbnRyb2wodGhpcy5pbmNyZWFzZU1vbnRoTm9kZSxpbmNNb250aCk7CisJCQllbmFibGVDb250cm9sKHRoaXMucHJldmlvdXNZZWFyTGFiZWxOb2RlLGRlY1llYXIpOworCQkJZW5hYmxlQ29udHJvbCh0aGlzLm5leHRZZWFyTGFiZWxOb2RlLGluY1llYXIpOworCQl9LAorCQkKKwkJX2luY3JlbWVudFdlZWs6IGZ1bmN0aW9uKGV2dCkgeworCQkJdmFyIGQgPSBuZXcgRGF0ZSh0aGlzLmZpcnN0RGF5KTsKKwkJCXN3aXRjaChldnQudGFyZ2V0KSB7CisJCQkJY2FzZSB0aGlzLmluY3JlYXNlV2Vla05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpLml0ZW0oMCk6IAorCQkJCWNhc2UgdGhpcy5pbmNyZWFzZVdlZWtOb2RlOgorCQkJCQl2YXIgdG1wRGF0ZSA9IGRvam8uZGF0ZS5hZGQoZCwgZG9qby5kYXRlLmRhdGVQYXJ0cy5XRUVLLCAxKTsKKwkJCQkJaWYodG1wRGF0ZSA8IHRoaXMuZW5kRGF0ZSl7CisJCQkJCQlkID0gZG9qby5kYXRlLmFkZChkLCBkb2pvLmRhdGUuZGF0ZVBhcnRzLldFRUssIDEpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgdGhpcy5kZWNyZWFzZVdlZWtOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorCQkJCWNhc2UgdGhpcy5kZWNyZWFzZVdlZWtOb2RlOgorCQkJCQlpZihkID49IHRoaXMuc3RhcnREYXRlKXsKKwkJCQkJCWQgPSBkb2pvLmRhdGUuYWRkKGQsIGRvam8uZGF0ZS5kYXRlUGFydHMuV0VFSywgLTEpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQkJdGhpcy5fcHJlSW5pdFVJKGQsdHJ1ZSx0cnVlKTsKKwkJfSwKKwkKKwkJX2luY3JlbWVudE1vbnRoOiBmdW5jdGlvbihldnQpIHsKKwkJCXZhciBkID0gbmV3IERhdGUodGhpcy5jdXJNb250aCk7CisJCQl2YXIgdG1wRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZmlyc3REYXkpOworCQkJc3dpdGNoKGV2dC5jdXJyZW50VGFyZ2V0KSB7CisJCQkJY2FzZSB0aGlzLmluY3JlYXNlTW9udGhOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbWciKS5pdGVtKDApOgorCQkJCWNhc2UgdGhpcy5pbmNyZWFzZU1vbnRoTm9kZToKKwkJCQkJdG1wRGF0ZSA9IGRvam8uZGF0ZS5hZGQodG1wRGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5EQVksIHRoaXMuZGlzcGxheVdlZWtzKjcpOworCQkJCQlpZih0bXBEYXRlIDwgdGhpcy5lbmREYXRlKXsKKwkJCQkJCWQgPSBkb2pvLmRhdGUuYWRkKGQsIGRvam8uZGF0ZS5kYXRlUGFydHMuTU9OVEgsIDEpOworCQkJCQl9ZWxzZXsKKwkJCQkJCXZhciByZXZlcnRUb0VuZERhdGUgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgdGhpcy5kZWNyZWFzZU1vbnRoTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIikuaXRlbSgwKToKKwkJCQljYXNlIHRoaXMuZGVjcmVhc2VNb250aE5vZGU6CisJCQkJCWlmKHRtcERhdGUgPiB0aGlzLnN0YXJ0RGF0ZSl7CisJCQkJCQlkID0gZG9qby5kYXRlLmFkZChkLCBkb2pvLmRhdGUuZGF0ZVBhcnRzLk1PTlRILCAtMSk7CisJCQkJCX1lbHNleworCQkJCQkJdmFyIHJldmVydFRvU3RhcnREYXRlID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmKHJldmVydFRvU3RhcnREYXRlKXsKKwkJCQlkID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUpOworCQkJfWVsc2UgaWYocmV2ZXJ0VG9FbmREYXRlKXsKKwkJCQlkID0gbmV3IERhdGUodGhpcy5lbmREYXRlKTsKKwkJCX0KKwkJCXRoaXMuX3ByZUluaXRVSShkLGZhbHNlLHRydWUpOworCQl9LAorCQorCQlfaW5jcmVtZW50WWVhcjogZnVuY3Rpb24oZXZ0KSB7CisJCQl2YXIgeWVhciA9IHRoaXMuY3VyTW9udGguZ2V0RnVsbFllYXIoKTsKKwkJCXZhciB0bXBEYXRlID0gbmV3IERhdGUodGhpcy5maXJzdERheSk7CisJCQlzd2l0Y2goZXZ0LnRhcmdldCkgeworCQkJCWNhc2UgdGhpcy5uZXh0WWVhckxhYmVsTm9kZToKKwkJCQkJdG1wRGF0ZSA9IGRvam8uZGF0ZS5hZGQodG1wRGF0ZSwgZG9qby5kYXRlLmRhdGVQYXJ0cy5ZRUFSLCAxKTsKKwkJCQkJaWYodG1wRGF0ZTx0aGlzLmVuZERhdGUpeworCQkJCQkJeWVhcisrOworCQkJCQl9ZWxzZXsKKwkJCQkJCXZhciByZXZlcnRUb0VuZERhdGUgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgdGhpcy5wcmV2aW91c1llYXJMYWJlbE5vZGU6CisJCQkJCXRtcERhdGUgPSBkb2pvLmRhdGUuYWRkKHRtcERhdGUsIGRvam8uZGF0ZS5kYXRlUGFydHMuWUVBUiwgLTEpOworCQkJCQlpZih0bXBEYXRlPnRoaXMuc3RhcnREYXRlKXsKKwkJCQkJCXllYXItLTsKKwkJCQkJfWVsc2V7CisJCQkJCQl2YXIgcmV2ZXJ0VG9TdGFydERhdGUgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQkJdmFyIGQ7CisJCQlpZihyZXZlcnRUb1N0YXJ0RGF0ZSl7CisJCQkJZCA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKTsKKwkJCX1lbHNlIGlmKHJldmVydFRvRW5kRGF0ZSl7CisJCQkJZCA9IG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSk7CisJCQl9ZWxzZXsKKwkJCQlkID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJNb250aC5nZXRNb250aCgpLCAxKTsKKwkJCX0KKwkJCXRoaXMuX3ByZUluaXRVSShkLGZhbHNlLHRydWUpOworCQl9LAorCQorCQlvbkluY3JlbWVudFdlZWs6IGZ1bmN0aW9uKC8qRXZlbnQqL2V2dCkgeworCQkJLy8gc3VtbWFyeTogaGFuZGxlciBmb3IgaW5jcmVtZW50IHdlZWsgZXZlbnQKKwkJCWV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWlmKCF0aGlzLnN0YXRpY0Rpc3BsYXkpeworCQkJCXRoaXMuX2luY3JlbWVudFdlZWsoZXZ0KTsKKwkJCX0KKwkJfSwKKwkKKwkJb25JbmNyZW1lbnRNb250aDogZnVuY3Rpb24oLypFdmVudCovZXZ0KSB7CisJCQkvLyBzdW1tYXJ5OiBoYW5kbGVyIGZvciBpbmNyZW1lbnQgbW9udGggZXZlbnQKKwkJCWV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWlmKCF0aGlzLnN0YXRpY0Rpc3BsYXkpeworCQkJCXRoaXMuX2luY3JlbWVudE1vbnRoKGV2dCk7CisJCQl9CisJCX0sCisJCQorCQlvbkluY3JlbWVudFllYXI6IGZ1bmN0aW9uKC8qRXZlbnQqL2V2dCkgeworCQkJLy8gc3VtbWFyeTogaGFuZGxlciBmb3IgaW5jcmVtZW50IHllYXIgZXZlbnQKKwkJCWV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWlmKCF0aGlzLnN0YXRpY0Rpc3BsYXkpeworCQkJCXRoaXMuX2luY3JlbWVudFllYXIoZXZ0KTsKKwkJCX0KKwkJfSwKKwkKKwkJX3NldE1vbnRoTGFiZWw6IGZ1bmN0aW9uKG1vbnRoSW5kZXgpIHsKKwkJCXRoaXMubW9udGhMYWJlbE5vZGUuaW5uZXJIVE1MID0gZG9qby5kYXRlLmdldE5hbWVzKCdtb250aHMnLCAnd2lkZScsICdzdGFuZEFsb25lJywgdGhpcy5sYW5nKVttb250aEluZGV4XTsKKwkJfSwKKwkJCisJCV9zZXRZZWFyTGFiZWxzOiBmdW5jdGlvbih5ZWFyKSB7CisJCQl2YXIgeSA9IHllYXIgLSAxOworCQkJdmFyIHRoYXQgPSB0aGlzOworCQkJZnVuY3Rpb24gZihuKXsKKwkJCQl0aGF0W24rIlllYXJMYWJlbE5vZGUiXS5pbm5lckhUTUwgPQorCQkJCQlkb2pvLmRhdGUuZm9ybWF0KG5ldyBEYXRlKHkrKywgMCksIHtmb3JtYXRMZW5ndGg6J3llYXJPbmx5JywgbG9jYWxlOnRoYXQubGFuZ30pOworCQkJfQorCQkJZigicHJldmlvdXMiKTsKKwkJCWYoImN1cnJlbnQiKTsKKwkJCWYoIm5leHQiKTsKKwkJfSwKKwkJCisJCV9nZXREYXRlQ2xhc3NOYW1lOiBmdW5jdGlvbihkYXRlLCBtb250aFN0YXRlKSB7CisJCQl2YXIgY3VycmVudENsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lc1ttb250aFN0YXRlXTsKKwkJCS8vd2UgdXNlIE51bWJlciBjb21wYXJpc29ucyBiZWNhdXNlIDIgZGF0ZU9iamVjdHMgbmV2ZXIgc2VlbSB0byBlcXVhbCBlYWNoIG90aGVyIG90aGVyd2lzZQorCQkJaWYgKCghdGhpcy5zZWxlY3RlZElzVXNlZCAmJiB0aGlzLnZhbHVlKSAmJiAoTnVtYmVyKGRhdGUpID09IE51bWJlcih0aGlzLnZhbHVlKSkpIHsKKwkJCQljdXJyZW50Q2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWVzLnNlbGVjdGVkRGF0ZSArICIgIiArIGN1cnJlbnRDbGFzc05hbWU7CisJCQkJdGhpcy5zZWxlY3RlZElzVXNlZCA9IHRydWU7CisJCQl9CisJCQlpZigoIXRoaXMuY3VycmVudElzVXNlZCkgJiYgKE51bWJlcihkYXRlKSA9PSBOdW1iZXIodGhpcy50b2RheSkpKSB7CisJCQkJY3VycmVudENsYXNzTmFtZSA9IGN1cnJlbnRDbGFzc05hbWUgKyAiICIgICsgdGhpcy5jbGFzc05hbWVzLmN1cnJlbnREYXRlOworCQkJCXRoaXMuY3VycmVudElzVXNlZCA9IHRydWU7CisJCQl9CisJCQlyZXR1cm4gY3VycmVudENsYXNzTmFtZTsKKwkJfSwKKwkKKwkJb25DbGljazogZnVuY3Rpb24oLypFdmVudCovZXZ0KSB7CisJCQkvL3N1bW1hcnk6IHRoZSBjbGljayBldmVudCBoYW5kbGVyCisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGV2dCk7CisJCX0sCisKKwkJX2hhbmRsZVVpQ2xpY2s6IGZ1bmN0aW9uKC8qRXZlbnQqL2V2dCkgeworCQkJdmFyIGV2ZW50VGFyZ2V0ID0gZXZ0LnRhcmdldDsKKwkJCWlmKGV2ZW50VGFyZ2V0Lm5vZGVUeXBlICE9IGRvam8uZG9tLkVMRU1FTlRfTk9ERSl7ZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldC5wYXJlbnROb2RlO30KKwkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZXZ0KTsKKwkJCXRoaXMuc2VsZWN0ZWRJc1VzZWQgPSB0aGlzLnRvZGF5SXNVc2VkID0gZmFsc2U7CisJCQlpZihkb2pvLmh0bWwuaGFzQ2xhc3MoZXZlbnRUYXJnZXQsIHRoaXMuY2xhc3NOYW1lc1siZGlzYWJsZWRQcmV2aW91cyJdKXx8ZG9qby5odG1sLmhhc0NsYXNzKGV2ZW50VGFyZ2V0LCB0aGlzLmNsYXNzTmFtZXNbImRpc2FibGVkQ3VycmVudCJdKXx8ZG9qby5odG1sLmhhc0NsYXNzKGV2ZW50VGFyZ2V0LCB0aGlzLmNsYXNzTmFtZXNbImRpc2FibGVkTmV4dCJdKSl7CisJCQkJcmV0dXJuOyAvL3RoaXMgZGF0ZSBpcyBkaXNhYmxlZC4uLiBpZ25vcmUgaXQKKwkJCX0KKwkJCXRoaXMuY2xpY2tlZE5vZGUgPSBldmVudFRhcmdldDsKKwkJCXRoaXMuc2V0RGF0ZShuZXcgRGF0ZShOdW1iZXIoZG9qby5odG1sLmdldEF0dHJpYnV0ZShldmVudFRhcmdldCwnZGpEYXRlVmFsdWUnKSkpKTsKKwkJfSwKKwkJCisJCW9uVmFsdWVDaGFuZ2VkOiBmdW5jdGlvbigvKkRhdGUqL2RhdGUpIHsKKwkJCS8vc3VtbWFyeTogdGhlIHNldCBkYXRlIGV2ZW50IGhhbmRsZXIKKwkJfSwKKwkJCisJCV9pc0Rpc2FibGVkRGF0ZTogZnVuY3Rpb24oZGF0ZU9iail7CisJCQlpZihkYXRlT2JqPHRoaXMuc3RhcnREYXRlfHxkYXRlT2JqPnRoaXMuZW5kRGF0ZSl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCXJldHVybiB0aGlzLmlzRGlzYWJsZWREYXRlKGRhdGVPYmosIHRoaXMubGFuZyk7CisJCX0sCisKKwkJaXNEaXNhYmxlZERhdGU6IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iaiwgLypTdHJpbmc/Ki9sb2NhbGUpeworCQkvLyBzdW1tYXJ5OgorCQkvLwlNYXkgYmUgb3ZlcnJpZGRlbiB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGUuZy4gaXNEaXNhYmxlZERhdGU9ZG9qby5kYXRlLmlzV2Vla2VuZAorCisJCQlyZXR1cm4gZmFsc2U7IC8vIEJvb2xlYW4KKwkJfSwKKworCQlfaW5pdEZpcnN0RGF5OiBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmosIC8qQm9vbGVhbiovYWRqKXsKKwkJCS8vYWRqOiBmYWxzZSBmb3IgZmlyc3QgZGF5IG9mIG1vbnRoLCB0cnVlIGZvciBmaXJzdCBkYXkgb2Ygd2VlayBhZGp1c3RlZCBieSBzdGFydE9mV2VlaworCQkJdmFyIGQgPSBuZXcgRGF0ZShkYXRlT2JqKTsKKwkJCWlmKCFhZGope2Quc2V0RGF0ZSgxKTt9CisJCQlkLnNldERhdGUoZC5nZXREYXRlKCktdGhpcy5fZ2V0QWRqdXN0ZWREYXkoZCx0aGlzLndlZWtTdGFydHNPbikpOworCQkJZC5zZXRIb3VycygwLDAsMCwwKTsKKwkJCXJldHVybiBkOyAvLyBEYXRlCisJCX0sCisKKwkJX2dldEFkanVzdGVkRGF5OiBmdW5jdGlvbigvKkRhdGUqL2RhdGVPYmopeworCQkJLy9zdW1tYXJ5OiB1c2VkIHRvIGFkanVzdCBkYXRlLmdldERheSgpIHZhbHVlcyB0byB0aGUgbmV3IHZhbHVlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgdmFsdWUKKwkJCXZhciBkYXlzID0gWzAsMSwyLDMsNCw1LDZdOworCQkJaWYodGhpcy53ZWVrU3RhcnRzT24+MCl7CisJCQkJZm9yKHZhciBpPTA7aTx0aGlzLndlZWtTdGFydHNPbjtpKyspeworCQkJCQlkYXlzLnVuc2hpZnQoZGF5cy5wb3AoKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGRheXNbZGF0ZU9iai5nZXREYXkoKV07IC8vIE51bWJlcjogMC4uNiB3aGVyZSAwPVN1bmRheQorCQl9LAorCisJCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCQlkb2pvLndpZGdldC5EYXRlUGlja2VyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJZG9qby5odG1sLmRlc3Ryb3lOb2RlKHRoaXMud2Vla1RlbXBsYXRlKTsKKwkJfQorCX0KKyk7CisKK2Rvam8ucHJvdmlkZSgiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIik7CisKKworCisKKworCisKKworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKwkiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIiwKKwlkb2pvLndpZGdldC5Ecm9wZG93bkNvbnRhaW5lciwKKwl7CisJCS8qCisJCXN1bW1hcnk6IAorCQkJQSBmb3JtIGlucHV0IGZvciBlbnRlcmluZyBkYXRlcyB3aXRoIGEgcG9wLXVwIGRvam8ud2lkZ2V0LkRhdGVQaWNrZXIgdG8gYWlkIGluIHNlbGVjdGlvbgorCQkKKwkJCWRlc2NyaXB0aW9uOiAKKwkJCQlUaGlzIGlzIERhdGVQaWNrZXIgaW4gYSBEcm9wZG93bkNvbnRhaW5lciwgaXQgc3VwcG9ydHMgYWxsIGZlYXR1cmVzIG9mIERhdGVQaWNrZXIuCisJCQorCQkJCVRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW4gdGhlIHdpZGdldCBpcyBsb2NhbGl6ZWQgYWNjb3JkaW5nIHRvIHRoZSBkZWZhdWx0IGFsZ29yaXRobSBwcm92aWRlZAorCQkJCWluIGRvam8uZGF0ZS5mb3JtYXQgYW5kIGRvam8uZGF0ZS5wYXJzZS4gIEl0IGlzIHBvc3NpYmxlIHRvIGN1c3RvbWl6ZSB0aGUgdXNlci12aXNpYmxlIGZvcm1hdHRpbmcKKwkJCQl3aXRoIGVpdGhlciB0aGUgZm9ybWF0TGVuZ3RoIG9yIGRpc3BsYXlGb3JtYXQgYXR0cmlidXRlcy4gIFRoZSB2YWx1ZSBzZW50IHRvIHRoZSBzZXJ2ZXIgaXMKKwkJCQl0eXBpY2FsbHkgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsdWUgaW4gYSBoaWRkZW4gZmllbGQgYXMgZGVmaW5lZCBieSB0aGUgbmFtZSBhdHRyaWJ1dGUuCisJCQkJUkZDMzMzOSByZXByZXNlbnRhdGlvbiBpcyB1c2VkIGJ5IGRlZmF1bHQsIGJ1dCBvdGhlciBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2l0aCBzYXZlRm9ybWF0LgorCQkKKwkJCXVzYWdlOiAKKwkJCQl2YXIgZGRwID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJEcm9wZG93bkRhdGVQaWNrZXIiLCB7fSwgICAKKwkJCQlkb2pvLmJ5SWQoIkRyb3Bkb3duRGF0ZVBpY2tlck5vZGUiKSk7IAorCQkgCSAKKwkJCQk8aW5wdXQgZG9qb1R5cGU9IkRyb3Bkb3duRGF0ZVBpY2tlciI+CisJCSovCisKKwkJaWNvblVSTDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL2RhdGVJY29uLmdpZiIpLAorCisJCS8vIGZvcm1hdExlbmd0aDogU3RyaW5nCisJCS8vIAlUeXBlIG9mIGZvcm1hdHRpbmcgdXNlZCBmb3IgdmlzdWFsIGRpc3BsYXksIGFwcHJvcHJpYXRlIHRvIGxvY2FsZSAoY2hvaWNlIG9mIGxvbmcsIHNob3J0LCBtZWRpdW0gb3IgZnVsbCkKKwkJLy8gIFNlZSBkb2pvLmRhdGUuZm9ybWF0IGZvciBkZXRhaWxzLgorCQlmb3JtYXRMZW5ndGg6ICJzaG9ydCIsCisKKwkJLy8gZGlzcGxheUZvcm1hdDogU3RyaW5nCisJCS8vCUEgcGF0dGVybiB1c2VkIGZvciB0aGUgdmlzdWFsIGRpc3BsYXkgb2YgdGhlIGZvcm1hdHRlZCBkYXRlLCBlLmcuIGRkL01NL3l5eXkuCisJCS8vCVNldHRpbmcgdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYWxlLXNwZWNpZmljIHNldHRpbmdzIGFzIHdlbGwgYXMgdGhlIGZvcm1hdExlbmd0aAorCQkvLwlhdHRyaWJ1dGUuICBTZWUgZG9qby5kYXRlLmZvcm1hdCBmb3IgYSByZWZlcmVuY2Ugd2hpY2ggZGVmaW5lcyB0aGUgZm9ybWF0dGluZyBwYXR0ZXJucy4KKwkJZGlzcGxheUZvcm1hdDogIiIsCisKKwkJLy8gc2F2ZUZvcm1hdDogU3RyaW5nCisJCS8vCUZvcm1hdHRpbmcgc2NoZW1lIHVzZWQgd2hlbiBzdWJtaXR0aW5nIHRoZSBmb3JtIGVsZW1lbnQuICBUaGlzIGZvcm1hdHRpbmcgaXMgdXNlZCBpbiBhIGhpZGRlbgorCQkvLyAgZmllbGQgKG5hbWUpIGludGVuZGVkIGZvciBzZXJ2ZXIgdXNlLCBhbmQgaXMgdGhlcmVmb3JlIHR5cGljYWxseSBsb2NhbGUtaW5kZXBlbmRlbnQuCisJCS8vICBCeSBkZWZhdWx0LCB1c2VzIHJmYzMzMzkgc3R5bGUgZGF0ZSBmb3JtYXR0aW5nIChyZmMpCisJCS8vCVVzZSBhIHBhdHRlcm4gc3RyaW5nIGxpa2UgZGlzcGxheUZvcm1hdCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkJLy8JcmZjfGlzb3xwb3NpeHx1bml4CisJCXNhdmVGb3JtYXQ6ICIiLAorCisJCS8vIHZhbHVlOiBTdHJpbmd8RGF0ZQorCQkvLwlmb3JtIHZhbHVlIHByb3BlcnR5IGluIHJmYzMzMzkgZm9ybWF0LiBJZiA9PSd0b2RheScsIHdpbGwgdXNlIHRvZGF5J3MgZGF0ZQorCQl2YWx1ZTogIiIsCisKKwkJLy8gbmFtZTogU3RyaW5nCisJCS8vIAluYW1lIG9mIHRoZSBmb3JtIGVsZW1lbnQsIHVzZWQgdG8gY3JlYXRlIGEgaGlkZGVuIGZpZWxkIGJ5IHRoaXMgbmFtZSBmb3IgZm9ybSBlbGVtZW50IHN1Ym1pc3Npb24uCisJCW5hbWU6ICIiLAorCisJCS8vIEltcGxlbWVudCB2YXJpb3VzIGF0dHJpYnV0ZXMgZnJvbSBEYXRlUGlja2VyCisKKwkJLy8gZGlzcGxheVdlZWtzOiBJbnRlZ2VyCisJCS8vCW51bWJlciBvZiB3ZWVrcyB0byBkaXNwbGF5IAorCQlkaXNwbGF5V2Vla3M6IDYsCisKKwkJLy8gYWRqdXN0V2Vla3M6IEJvb2xlYW4KKwkJLy8JaWYgdHJ1ZSwgd2Vla2x5IHNpemUgb2YgY2FsZW5kYXIgY2hhbmdlcyB0byBhY2NvbW9kYXRlIHRoZSBtb250aCBpZiBmYWxzZSwgNDIgZGF5IGZvcm1hdCBpcyB1c2VkCisJCWFkanVzdFdlZWtzOiBmYWxzZSwKKworCQkvLyBzdGFydERhdGU6IFN0cmluZ3xEYXRlCisJCS8vCWZpcnN0IGF2YWlsYWJsZSBkYXRlIGluIHRoZSBjYWxlbmRhciBzZXQKKwkJc3RhcnREYXRlOiAiMTQ5Mi0xMC0xMiIsCisKKwkJLy8gZW5kRGF0ZTogU3RyaW5nfERhdGUKKwkJLy8JbGFzdCBhdmFpbGFibGUgZGF0ZSBpbiB0aGUgY2FsZW5kYXIgc2V0CisJCWVuZERhdGU6ICIyOTQxLTEwLTEyIiwKKworCQkvLyB3ZWVrU3RhcnRzT246IEludGVnZXIKKwkJLy8JYWRqdXN0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIDA9PVN1bmRheS4uNj09U2F0dXJkYXkKKwkJd2Vla1N0YXJ0c09uOiAiIiwKKworCQkvLyBzdGF0aWNEaXNwbGF5OiBCb29sZWFuCisJCS8vCWRpc2FibGUgYWxsIGluY3JlbWVudGFsIGNvbnRyb2xzLCBtdXN0IHBpY2sgYSBkYXRlIGluIHRoZSBjdXJyZW50IGRpc3BsYXkKKwkJc3RhdGljRGlzcGxheTogZmFsc2UsCisJCQorCQlwb3N0TWl4SW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbihsb2NhbFByb3BlcnRpZXMsIGZyYWcpeworCQkJLy8gc3VtbWFyeTogc2VlIGRvam8ud2lkZ2V0LkRvbVdpZGdldAorCisJCQlkb2pvLndpZGdldC5Ecm9wZG93bkRhdGVQaWNrZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl2YXIgbWVzc2FnZXMgPSBkb2pvLmkxOG4uZ2V0TG9jYWxpemF0aW9uKCJkb2pvLndpZGdldCIsICJEcm9wZG93bkRhdGVQaWNrZXIiLCB0aGlzLmxhbmcpOworCQkJdGhpcy5pY29uQWx0ID0gbWVzc2FnZXMuc2VsZWN0RGF0ZTsKKworCQkJLy9GSVhNRTogc2hvdWxkIHRoaXMgYmUgaWYvZWxzZS9lbHNlPworCQkJaWYodHlwZW9mKHRoaXMudmFsdWUpPT0nc3RyaW5nJyYmdGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpPT0ndG9kYXknKXsKKwkJCQl0aGlzLnZhbHVlID0gbmV3IERhdGUoKTsKKwkJCX0KKwkJCWlmKHRoaXMudmFsdWUgJiYgaXNOYU4odGhpcy52YWx1ZSkpeworCQkJCXZhciBvcmlnID0gdGhpcy52YWx1ZTsKKwkJCQl0aGlzLnZhbHVlID0gZG9qby5kYXRlLmZyb21SZmMzMzM5KHRoaXMudmFsdWUpOworCQkJCWlmKCF0aGlzLnZhbHVlKXt0aGlzLnZhbHVlID0gbmV3IERhdGUob3JpZyk7IGRvam8uZGVwcmVjYXRlZCgiZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyIiwgImRhdGUgYXR0cmlidXRlcyBtdXN0IGJlIHBhc3NlZCBpbiBSZmMzMzM5IGZvcm1hdCIsICIwLjUiKTt9CisJCQl9CisJCQlpZih0aGlzLnZhbHVlICYmICFpc05hTih0aGlzLnZhbHVlKSl7CisJCQkJdGhpcy52YWx1ZSA9IG5ldyBEYXRlKHRoaXMudmFsdWUpOworCQkJfQorCQl9LAorCisJCWZpbGxJblRlbXBsYXRlOiBmdW5jdGlvbihhcmdzLCBmcmFnKXsKKwkJCS8vIHN1bW1hcnk6IHNlZSBkb2pvLndpZGdldC5Eb21XaWRnZXQKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmNhbGwodGhpcywgYXJncywgZnJhZyk7CisJCQkvL2F0dHJpYnV0ZXMgdG8gYmUgcGFzc2VkIG9uIHRvIERhdGVQaWNrZXIKKwkJCXZhciBkcEFyZ3MgPSB7d2lkZ2V0Q29udGFpbmVySWQ6IHRoaXMud2lkZ2V0SWQsIGxhbmc6IHRoaXMubGFuZywgdmFsdWU6IHRoaXMudmFsdWUsCisJCQkJc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5lbmREYXRlLCBkaXNwbGF5V2Vla3M6IHRoaXMuZGlzcGxheVdlZWtzLAorCQkJCXdlZWtTdGFydHNPbjogdGhpcy53ZWVrU3RhcnRzT24sIGFkanVzdFdlZWtzOiB0aGlzLmFkanVzdFdlZWtzLCBzdGF0aWNEaXNwbGF5OiB0aGlzLnN0YXRpY0Rpc3BsYXl9OworCisJCQkvL2J1aWxkIHRoZSBhcmdzIGZvciBEYXRlUGlja2VyIGJhc2VkIG9uIHRoZSBwdWJsaWMgYXR0cmlidXRlcyBvZiBEcm9wZG93bkRhdGVQaWNrZXIKKwkJCXRoaXMuZGF0ZVBpY2tlciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiRGF0ZVBpY2tlciIsIGRwQXJncywgdGhpcy5jb250YWluZXJOb2RlLCAiY2hpbGQiKTsKKwkJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmRhdGVQaWNrZXIsICJvblZhbHVlQ2hhbmdlZCIsIHRoaXMsICJfdXBkYXRlVGV4dCIpOworCQkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuaW5wdXROb2RlLCAib25DaGFuZ2UiLCB0aGlzLCAiX3VwZGF0ZVRleHQiKTsKKworCQkJaWYodGhpcy52YWx1ZSl7CisJCQkJdGhpcy5fdXBkYXRlVGV4dCgpOworCQkJfQorCQkJdGhpcy5jb250YWluZXJOb2RlLmV4cGxvZGVDbGFzc05hbWUgPSAiY2FsZW5kYXJCb2R5Q29udGFpbmVyIjsKKwkJCXRoaXMudmFsdWVOb2RlLm5hbWU9dGhpcy5uYW1lOworCQl9LAorCisJCWdldFZhbHVlOiBmdW5jdGlvbigpeworCQkJLy8gc3VtbWFyeTogcmV0dXJuIGN1cnJlbnQgZGF0ZSBpbiBSRkMgMzMzOSBmb3JtYXQKKwkJCXJldHVybiB0aGlzLnZhbHVlTm9kZS52YWx1ZTsgLypTdHJpbmcqLworCQl9LAorCisJCWdldERhdGU6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiByZXR1cm4gY3VycmVudCBkYXRlIGFzIGEgRGF0ZSBvYmplY3QKKwkJCXJldHVybiB0aGlzLmRhdGVQaWNrZXIudmFsdWU7IC8qRGF0ZSovCisJCX0sCisKKwkJc2V0VmFsdWU6IGZ1bmN0aW9uKC8qRGF0ZXxTdHJpbmcqL3JmY0RhdGUpeworCQkJLy9zdW1tYXJ5OiBzZXQgdGhlIGN1cnJlbnQgZGF0ZSBmcm9tIFJGQyAzMzM5IGZvcm1hdHRlZCBzdHJpbmcgb3IgYSBkYXRlIG9iamVjdCwgc3lub255bW91cyB3aXRoIHNldERhdGUKKwkJCXRoaXMuc2V0RGF0ZShyZmNEYXRlKTsKKwkJfSwKKworCQlzZXREYXRlOiBmdW5jdGlvbigvKkRhdGV8U3RyaW5nKi9kYXRlT2JqKXsKKwkJCS8vIHN1bW1hcnk6IHNldCB0aGUgY3VycmVudCBkYXRlIGFuZCB1cGRhdGUgdGhlIFVJCisJCQl0aGlzLmRhdGVQaWNrZXIuc2V0RGF0ZShkYXRlT2JqKTsKKwkJCXRoaXMuX3N5bmNWYWx1ZU5vZGUoKTsKKwkJfSwKKwkKKwkJX3VwZGF0ZVRleHQ6IGZ1bmN0aW9uKCl7CisJCQkvLyBzdW1tYXJ5OiB1cGRhdGVzIHRoZSA8aW5wdXQ+IGZpZWxkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSAoaWUsIGRpc3BsYXlzIHRoZSBmb3JtYXR0ZWQgZGF0ZSkKKwkJCXRoaXMuaW5wdXROb2RlLnZhbHVlID0gdGhpcy5kYXRlUGlja2VyLnZhbHVlID8KKwkJCQlkb2pvLmRhdGUuZm9ybWF0KHRoaXMuZGF0ZVBpY2tlci52YWx1ZSwKKwkJCQkJe2Zvcm1hdExlbmd0aDp0aGlzLmZvcm1hdExlbmd0aCwgZGF0ZVBhdHRlcm46dGhpcy5kaXNwbGF5Rm9ybWF0LCBzZWxlY3RvcjonZGF0ZU9ubHknLCBsb2NhbGU6dGhpcy5sYW5nfSkgOgorCQkJCSIiOworCisJCQlpZih0aGlzLnZhbHVlIDwgdGhpcy5kYXRlUGlja2VyLnN0YXJ0RGF0ZXx8dGhpcy52YWx1ZT50aGlzLmRhdGVQaWNrZXIuZW5kRGF0ZSl7CisJCQkJdGhpcy5pbnB1dE5vZGUudmFsdWUgPSAiIjsKKwkJCX0KKwkJCXRoaXMuX3N5bmNWYWx1ZU5vZGUoKTsKKwkJCXRoaXMub25WYWx1ZUNoYW5nZWQodGhpcy5nZXREYXRlKCkpOworCQkJdGhpcy5oaWRlQ29udGFpbmVyKCk7CisJCX0sCisKKwkJb25WYWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uKC8qRGF0ZSovZGF0ZU9iail7CisJCQkvL3N1bW1hcnk6IHRyaWdnZXJlZCB3aGVuIHRoaXMudmFsdWUgaXMgY2hhbmdlZAorCQl9LAorCQkKKwkJb25JbnB1dENoYW5nZTogZnVuY3Rpb24oKXsKKwkJCS8vIHN1bW1hcnk6IGNhbGxiYWNrIHdoZW4gdXNlciBtYW51YWxseSB0eXBlcyBhIGRhdGUgaW50byB0aGUgPGlucHV0PiBmaWVsZAorCQkJdmFyIGlucHV0ID0gZG9qby5zdHJpbmcudHJpbSh0aGlzLmlucHV0Tm9kZS52YWx1ZSk7CisJCQlpZihpbnB1dCl7CisJCQkJdmFyIGlucHV0RGF0ZSA9IGRvam8uZGF0ZS5wYXJzZShpbnB1dCwKKwkJCQkJCXtmb3JtYXRMZW5ndGg6dGhpcy5mb3JtYXRMZW5ndGgsIGRhdGVQYXR0ZXJuOnRoaXMuZGlzcGxheUZvcm1hdCwgc2VsZWN0b3I6J2RhdGVPbmx5JywgbG9jYWxlOnRoaXMubGFuZ30pOwkJCQorCQkJCS8vIGlmIGlucHV0RGF0ZSBpcyBpbiBhIHZhbGlkIHJhbmdlLCB3ZSBjYWxsIHNldERhdGUKKwkJCQlpZighdGhpcy5kYXRlUGlja2VyLl9pc0Rpc2FibGVkRGF0ZShpbnB1dERhdGUpKXsKKwkJCQkJdGhpcy5zZXREYXRlKGlucHV0RGF0ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZihpbnB1dD09IiIpIHsgdGhpcy5kYXRlUGlja2VyLnNldERhdGUoIiIpOyB9CisJCQkJdGhpcy52YWx1ZU5vZGUudmFsdWUgPSBpbnB1dDsKKwkJCX0KKworCQkJLy8gSWYgdGhlIGRhdGUgZW50ZXJlZCBkaWRuJ3QgcGFyc2UsIHJlc2V0IHRvIHRoZSBvbGQgZGF0ZS4gIEtJU1MsIGZvciBub3cuCisJCQkvL1RPRE86IHVzYWJpbGl0eT8gIHNob3VsZCB3ZSBwcm92aWRlIG1vcmUgZmVlZGJhY2sgc29tZWhvdz8gYW4gZXJyb3Igbm90aWNlPworCQkJLy8gc2VlbXMgcmVkdW5kYW50IHRvIGRvIHRoaXMgaWYgdGhlIHBhcnNlIGZhaWxlZCwgYnV0IGF0IGxlYXN0IHVudGlsIHdlIGhhdmUgdmFsaWRhdGlvbiwKKwkJCS8vIHRoaXMgd2lsbCBmaXggdXAgdGhlIGRpc3BsYXkgb2YgZW50cmllcyBsaWtlIDAxLzMyLzIwMDYKKwkJCWlmKGlucHV0KXsgdGhpcy5fdXBkYXRlVGV4dCgpOyB9CisJCX0sCisKKwkJX3N5bmNWYWx1ZU5vZGU6IGZ1bmN0aW9uKCl7CisJCQl2YXIgZGF0ZSA9IHRoaXMuZGF0ZVBpY2tlci52YWx1ZTsKKwkJCXZhciB2YWx1ZSA9ICIiOworCQkJc3dpdGNoKHRoaXMuc2F2ZUZvcm1hdC50b0xvd2VyQ2FzZSgpKXsKKwkJCQljYXNlICJyZmMiOiBjYXNlICJpc28iOiBjYXNlICIiOgorCQkJCQl2YWx1ZSA9IGRvam8uZGF0ZS50b1JmYzMzMzkoZGF0ZSwgJ2RhdGVPbmx5Jyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgInBvc2l4IjogY2FzZSAidW5peCI6CisJCQkJCXZhbHVlID0gTnVtYmVyKGRhdGUpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpZihkYXRlKXsKKwkJCQkJCXZhbHVlID0gZG9qby5kYXRlLmZvcm1hdChkYXRlLCB7ZGF0ZVBhdHRlcm46dGhpcy5zYXZlRm9ybWF0LCBzZWxlY3RvcjonZGF0ZU9ubHknLCBsb2NhbGU6dGhpcy5sYW5nfSk7CisJCQkJCX0KKwkJCX0KKwkJCXRoaXMudmFsdWVOb2RlLnZhbHVlID0gdmFsdWU7CisJCX0sCisJCQorCQlkZXN0cm95OiBmdW5jdGlvbigvKkJvb2xlYW4qL2ZpbmFsaXplKXsKKwkJCXRoaXMuZGF0ZVBpY2tlci5kZXN0cm95KGZpbmFsaXplKTsKKwkJCWRvam8ud2lkZ2V0LkRyb3Bkb3duRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0KKyk7CisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyIik7CisKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAic3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyIiwKKyAgZG9qby53aWRnZXQuRHJvcGRvd25EYXRlUGlja2VyLCB7CisgIHdpZGdldFR5cGUgOiAiU3RydXRzRGF0ZVBpY2tlciIsCisKKyAgdmFsdWVOb3RpZnlUb3BpY3MgOiAiIiwKKyAgdmFsdWVOb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIHRhYkluZGV4IDogIiIsCisKKyAgcG9zdENyZWF0ZTogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyLnN1cGVyY2xhc3MucG9zdENyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgLy9zZXQgY3NzQ2xhc3MKKyAgICBpZih0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSkgeworICAgICAgZG9qby5odG1sLnNldENsYXNzKHRoaXMuaW5wdXROb2RlLCB0aGlzLmV4dHJhQXJnc1siY2xhc3MiXSk7CisgICAgfQorCisgICAgLy9zZXQgY3NzU3R5bGUKKyAgICBpZih0aGlzLmV4dHJhQXJncy5zdHlsZSkgeworICAgICAgZG9qby5odG1sLnNldFN0eWxlVGV4dCh0aGlzLmlucHV0Tm9kZSwgdGhpcy5leHRyYUFyZ3Muc3R5bGUpOworICAgIH0KKworICAgIC8vdmFsdWUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy52YWx1ZU5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMudmFsdWVOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisKKyAgICAvL3RhYmluZGV4CisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy50YWJJbmRleCkpIHsKKyAgICAgIHRoaXMuaW5wdXROb2RlLnRhYkluZGV4ID0gdGhpcy50YWJJbmRleDsKKyAgICB9CisgIH0sCisKKyAgX3N5bmNWYWx1ZU5vZGU6ZnVuY3Rpb24gKCkgeworICAgIHZhciBkYXRlID0gdGhpcy5kYXRlUGlja2VyLnZhbHVlOworICAgIHZhciB2YWx1ZSA9ICIiOworICAgIHN3aXRjaCAodGhpcy5zYXZlRm9ybWF0LnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNhc2UgInJmYyI6CisgICAgICBjYXNlICJpc28iOgorICAgICAgY2FzZSAiIjoKKyAgICAgICAgdmFsdWUgPSBkb2pvLmRhdGUudG9SZmMzMzM5KGRhdGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgInBvc2l4IjoKKyAgICAgIGNhc2UgInVuaXgiOgorICAgICAgICB2YWx1ZSA9IE51bWJlcihkYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoZGF0ZSkgeworICAgICAgICAgICAgdmFsdWUgPSBkb2pvLmRhdGUuZm9ybWF0KGRhdGUsIHtkYXRlUGF0dGVybjp0aGlzLnNhdmVGb3JtYXQsIHNlbGVjdG9yOiJkYXRlT25seSIsIGxvY2FsZTp0aGlzLmxhbmd9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aGlzLnZhbHVlTm9kZS52YWx1ZSA9IHZhbHVlOworICB9LAorCisgIF91cGRhdGVUZXh0IDogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNEYXRlUGlja2VyLnN1cGVyY2xhc3MuX3VwZGF0ZVRleHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICBpZih0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXkgIT0gbnVsbCkgeworICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudmFsdWVOb3RpZnlUb3BpY3NBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgdG9waWMgPSB0aGlzLnZhbHVlTm90aWZ5VG9waWNzQXJyYXlbaV07CisgICAgICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRvcGljKSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godG9waWMsIHRoaXMuaW5wdXROb2RlLnZhbHVlLCB0aGlzLmdldFZhbHVlKCksIHRoaXMpOworICAgICAgICAgIH0gY2F0Y2goZXgpIHsKKyAgICAgICAgICAgIGRvam8uZGVidWcoZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfSk7CisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5CaW5kRXZlbnQiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuQmluZEV2ZW50IiwKKyAgc3RydXRzLndpZGdldC5CaW5kLCB7CisgIHdpZGdldFR5cGUgOiAiQmluZEV2ZW50IiwKKworICBzb3VyY2VzOiAiIiwKKworICBwb3N0Q3JlYXRlIDogZnVuY3Rpb24oKSB7CisgICAgc3RydXRzLndpZGdldC5CaW5kRXZlbnQuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMpOworICAgIHZhciBzZWxmID0gdGhpczsKKworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuZXZlbnRzKSAmJiAhZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnNvdXJjZXMpKSB7CisgICAgICB2YXIgZXZlbnRzQXJyYXkgPSB0aGlzLmV2ZW50cy5zcGxpdCgiLCIpOworICAgICAgdmFyIHNvdXJjZXNBcnJheSA9IHRoaXMuc291cmNlcy5zcGxpdCgiLCIpOworCisgICAgICBpZihldmVudHNBcnJheSAmJiB0aGlzLmRvbU5vZGUpIHsKKyAgICAgICAgLy9ldmVudHMKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2goZXZlbnRzQXJyYXksIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgLy9zb3VyY2VzCisgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goc291cmNlc0FycmF5LCBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICAgICAgICAgIHZhciBzb3VyY2VPYmplY3QgPSBkb2pvLmJ5SWQoc291cmNlKTsKKyAgICAgICAgICAgIGlmKHNvdXJjZU9iamVjdCkgeworICAgICAgICAgICAgICBkb2pvLmV2ZW50LmNvbm5lY3Qoc291cmNlT2JqZWN0LCBldmVudCwgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkQ29udGVudHMoKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlU2VsZWN0b3IiKTsKKworCisKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5UcmVlU2VsZWN0b3IiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbigpIHsKKwl0aGlzLmV2ZW50TmFtZXMgPSB7fTsKKworCXRoaXMubGlzdGVuZWRUcmVlcyA9IFtdOworCit9LAoreworCXdpZGdldFR5cGU6ICJUcmVlU2VsZWN0b3IiLAorCXNlbGVjdGVkTm9kZTogbnVsbCwKKworCWRpZVdpdGhUcmVlOiBmYWxzZSwKKworCWV2ZW50TmFtZXNEZWZhdWx0OiB7CisJCXNlbGVjdCA6ICJzZWxlY3QiLAorCQlkZXN0cm95IDogImRlc3Ryb3kiLAorCQlkZXNlbGVjdCA6ICJkZXNlbGVjdCIsCisJCWRibHNlbGVjdDogImRibHNlbGVjdCIgLy8gc2VsZWN0IGFscmVhZHkgc2VsZWN0ZWQgbm9kZS4uIEVkaXQgb3Igd2hhdGV2ZXIKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CisKKwkJZm9yKHZhciBuYW1lIGluIHRoaXMuZXZlbnROYW1lc0RlZmF1bHQpIHsKKwkJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQodGhpcy5ldmVudE5hbWVzW25hbWVdKSkgeworCQkJCXRoaXMuZXZlbnROYW1lc1tuYW1lXSA9IHRoaXMud2lkZ2V0SWQrIi8iK3RoaXMuZXZlbnROYW1lc0RlZmF1bHRbbmFtZV07CisJCQl9CisJCX0KKworCX0sCisKKworCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmRlc3Ryb3ksIHsgc291cmNlOiB0aGlzIH0gKTsKKworCQlyZXR1cm4gZG9qby53aWRnZXQuSHRtbFdpZGdldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0sCisKKworCWxpc3RlblRyZWU6IGZ1bmN0aW9uKHRyZWUpIHsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRpdGxlQ2xpY2ssIHRoaXMsICJzZWxlY3QiKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmljb25DbGljaywgdGhpcywgInNlbGVjdCIpOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY29sbGFwc2UsIHRoaXMsICJvbkNvbGxhcHNlIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgdGhpcywgIm9uTW92ZUZyb20iKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnJlbW92ZU5vZGUsIHRoaXMsICJvblJlbW92ZU5vZGUiKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LCB0aGlzLCAib25UcmVlRGVzdHJveSIpOworCisJCS8qIHJlbWVtYmVyIGFsbCBteSB0cmVlcyB0byBkZXNlbGVjdCB3aGVuIGVsZW1lbnQgaXMgbW92ZWRGcm9tIHRoZW0gKi8KKwkJdGhpcy5saXN0ZW5lZFRyZWVzLnB1c2godHJlZSk7CisJfSwKKworCisJdW5saXN0ZW5UcmVlOiBmdW5jdGlvbih0cmVlKSB7CisKKwkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMudGl0bGVDbGljaywgdGhpcywgInNlbGVjdCIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5pY29uQ2xpY2ssIHRoaXMsICJzZWxlY3QiKTsKKwkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY29sbGFwc2UsIHRoaXMsICJvbkNvbGxhcHNlIik7CisJCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLm1vdmVGcm9tLCB0aGlzLCAib25Nb3ZlRnJvbSIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLCB0aGlzLCAib25SZW1vdmVOb2RlIik7CisJCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LCB0aGlzLCAib25UcmVlRGVzdHJveSIpOworCisKKwkJZm9yKHZhciBpPTA7IGk8dGhpcy5saXN0ZW5lZFRyZWVzLmxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgaWYodGhpcy5saXN0ZW5lZFRyZWVzW2ldID09PSB0cmVlKXsKKyAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVkVHJlZXMuc3BsaWNlKGksIDEpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisJCX0KKwl9LAorCisKKwlvblRyZWVEZXN0cm95OiBmdW5jdGlvbihtZXNzYWdlKSB7CisKKwkJdGhpcy51bmxpc3RlblRyZWUobWVzc2FnZS5zb3VyY2UpOworCisJCWlmICh0aGlzLmRpZVdpdGhUcmVlKSB7CisJCQkvL2Rvam8uZGVidWcoIktpbGxpbmcgbXlzZWxmICIrdGhpcy53aWRnZXRJZCk7CisJCQl0aGlzLmRlc3Ryb3koKTsKKwkJCS8vZG9qby5kZWJ1ZygiZG9uZSIpOworCQl9CisJfSwKKworCisJLy8gZGVzZWxlY3Qgbm9kZSBpZiBwYXJlbnQgaXMgY29sbGFwc2VkCisJb25Db2xsYXBzZTogZnVuY3Rpb24obWVzc2FnZSkgeworCQlpZiAoIXRoaXMuc2VsZWN0ZWROb2RlKSByZXR1cm47CisKKwkJdmFyIG5vZGUgPSBtZXNzYWdlLnNvdXJjZTsKKwkJdmFyIHBhcmVudCA9IHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudDsKKwkJd2hpbGUgKHBhcmVudCAhPT0gbm9kZSAmJiBwYXJlbnQuaXNUcmVlTm9kZSkgeworCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudDsKKwkJfQorCQlpZiAocGFyZW50LmlzVHJlZU5vZGUpIHsKKwkJCXRoaXMuZGVzZWxlY3QoKTsKKwkJfQorCX0sCisKKworCisJc2VsZWN0OiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisJCXZhciBlID0gbWVzc2FnZS5ldmVudDsKKworCQlpZiAodGhpcy5zZWxlY3RlZE5vZGUgPT09IG5vZGUpIHsKKwkJCWlmKGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSl7CisJCQkJLy8gSWYgdGhlIG5vZGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLCBhbmQgdGhleSBzZWxlY3QgaXQgYWdhaW4gd2hpbGUgaG9sZGluZworCQkJCS8vIGRvd24gYSBtZXRhIGtleSwgaXQgZGVzZWxlY3RzIGl0CisJCQkJdGhpcy5kZXNlbGVjdCgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLmV2ZW50TmFtZXMuZGJsc2VsZWN0LCB7IG5vZGU6IG5vZGUgfSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHsKKwkJCXRoaXMuZGVzZWxlY3QoKTsKKwkJfQorCisJCXRoaXMuZG9TZWxlY3Qobm9kZSk7CisKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy5zZWxlY3QsIHtub2RlOiBub2RlfSApOworCX0sCisKKwkvKioKKwkgKiBEZXNlbGVjdCBub2RlIGlmIHRhcmdldCB0cmVlIGlzIG91dCBvZiBvdXIgY29uY2VybgorCSAqLworCW9uTW92ZUZyb206IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKwkJaWYgKG1lc3NhZ2UuY2hpbGQgIT09IHRoaXMuc2VsZWN0ZWROb2RlKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIWRvam8ubGFuZy5pbkFycmF5KHRoaXMubGlzdGVuZWRUcmVlcywgbWVzc2FnZS5uZXdUcmVlKSkgeworCQkJdGhpcy5kZXNlbGVjdCgpOworCQl9CisJfSwKKworCW9uUmVtb3ZlTm9kZTogZnVuY3Rpb24obWVzc2FnZSkgeworCQlpZiAobWVzc2FnZS5jaGlsZCAhPT0gdGhpcy5zZWxlY3RlZE5vZGUpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXRoaXMuZGVzZWxlY3QoKTsKKwl9LAorCisJZG9TZWxlY3Q6IGZ1bmN0aW9uKG5vZGUpeworCisJCW5vZGUubWFya1NlbGVjdGVkKCk7CisKKwkJdGhpcy5zZWxlY3RlZE5vZGUgPSBub2RlOworCX0sCisKKwlkZXNlbGVjdDogZnVuY3Rpb24oKXsKKworCQl2YXIgbm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlOworCisJCXRoaXMuc2VsZWN0ZWROb2RlID0gbnVsbDsKKwkJbm9kZS51bk1hcmtTZWxlY3RlZCgpOworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmRlc2VsZWN0LCB7bm9kZTogbm9kZX0gKTsKKworCX0KKworfSk7CisKKworCisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3IiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yIiwKKyAgZG9qby53aWRnZXQuVHJlZVNlbGVjdG9yLCB7CisgIHdpZGdldFR5cGUgOiAiU3RydXRzVHJlZVNlbGVjdG9yIiwKKyAgCisgIHNlbGVjdGVkTm90aWZ5VG9waWNzIDogIiIsCisgIGNvbGxhcHNlZE5vdGlmeVRvcGljcyA6ICIiLAorICBleHBhbmRlZE5vdGlmeVRvcGljcyA6ICIiLAorICAKKyAgc2VsZWN0ZWROb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIGNvbGxhcHNlZE5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgZXhwYW5kZWROb3RpZnlUb3BpY3NBcnJheSA6IG51bGwsCisgIAorICBldmVudE5hbWVzRGVmYXVsdDogeworICAgIHNlbGVjdCA6ICJzZWxlY3QiLAorICAgIGRlc3Ryb3kgOiAiZGVzdHJveSIsCisgICAgZGVzZWxlY3QgOiAiZGVzZWxlY3QiLAorICAgIGRibHNlbGVjdDogImRibHNlbGVjdCIsIC8vIHNlbGVjdCBhbHJlYWR5IHNlbGVjdGVkIG5vZGUuLiBFZGl0IG9yIHdoYXRldmVyCisgICAgZXhwYW5kOiAiZXhwYW5kIiwKKyAgICBjb2xsYXBzZTogImNvbGxhcHNlIgorICB9LAorICAKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkgeworICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yLnN1cGVyY2xhc3MuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTsKKyAgICAKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLnNlbGVjdGVkTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKworICAgIGlmKCFkb2pvLnN0cmluZy5pc0JsYW5rKHRoaXMuc2VsZWN0ZWROb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmNvbGxhcHNlZE5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5jb2xsYXBzZWROb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljcykpIHsKKyAgICAgIHRoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3NBcnJheSA9IHRoaXMuZXhwYW5kZWROb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgIH0sCisgIAorICBsaXN0ZW5UcmVlOiBmdW5jdGlvbih0cmVlKSB7CisgICAgZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLCB0aGlzLCAiY29sbGFwc2UiKTsKKyAgICBkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuZXhwYW5kLCB0aGlzLCAiZXhwYW5kIik7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3Iuc3VwZXJjbGFzcy5saXN0ZW5UcmVlLmFwcGx5KHRoaXMsIFt0cmVlXSk7CisgIH0sCisgIAorICB1bmxpc3RlblRyZWU6IGZ1bmN0aW9uKHRyZWUpIHsKKyAgICBkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jb2xsYXBzZSwgdGhpcywgImNvbGxhcHNlIik7CisgICAgZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuZXhwYW5kLCB0aGlzLCAiZXhwYW5kIik7CisgICAgc3RydXRzLndpZGdldC5TdHJ1dHNUcmVlU2VsZWN0b3Iuc3VwZXJjbGFzcy51bmxpc3RlblRyZWUuYXBwbHkodGhpcywgW3RyZWVdKTsKKyAgfSwKKworICBwdWJsaXNoVG9waWNzIDogZnVuY3Rpb24odG9waWNzLCBub2RlKSB7CisgICAgaWYodG9waWNzICE9IG51bGwpIHsKKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0b3BpY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHRvcGljID0gdG9waWNzW2ldOworICAgICAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0b3BpYykpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBub2RlKTsKKyAgICAgICAgICB9IGNhdGNoKGV4KSB7CisgICAgICAgICAgICBkb2pvLmRlYnVnKGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisgIAorICBzZWxlY3Q6ZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKyAgICB2YXIgbm9kZSA9IG1lc3NhZ2Uuc291cmNlOworICAgIHZhciBlID0gbWVzc2FnZS5ldmVudDsKKyAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUgPT09IG5vZGUpIHsKKyAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHsKKyAgICAgICAgdGhpcy5kZXNlbGVjdCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy5ldmVudE5hbWVzLmRibHNlbGVjdCwge25vZGU6bm9kZX0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHsKKyAgICAgIHRoaXMuZGVzZWxlY3QoKTsKKyAgICB9CisgICAgdGhpcy5kb1NlbGVjdChub2RlKTsKKyAgICAKKyAgICB0aGlzLnB1Ymxpc2hUb3BpY3ModGhpcy5zZWxlY3RlZE5vdGlmeVRvcGljc0FycmF5LCB7bm9kZTogbm9kZX0pOworICB9LAorICAKKyAgZXhwYW5kOiBmdW5jdGlvbihtZXNzYWdlKSB7CisgICAgdmFyIG5vZGUgPSBtZXNzYWdlLnNvdXJjZTsKKyAgICB0aGlzLnB1Ymxpc2hUb3BpY3ModGhpcy5leHBhbmRlZE5vdGlmeVRvcGljc0FycmF5LCB7bm9kZTogbm9kZX0pOworICB9LAorICAKKyAgY29sbGFwc2U6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICB2YXIgbm9kZSA9IG1lc3NhZ2Uuc291cmNlOworICAgIHRoaXMucHVibGlzaFRvcGljcyh0aGlzLmNvbGxhcHNlZE5vdGlmeVRvcGljc0FycmF5LCB7bm9kZTogbm9kZX0pOworICB9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5QYWdlQ29udGFpbmVyIik7CisKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7CisJLy8gc3VtbWFyeQorCS8vCUEgY29udGFpbmVyIHRoYXQgaGFzIG11bHRpcGxlIGNoaWxkcmVuLCBidXQgc2hvd3Mgb25seQorCS8vCW9uZSBjaGlsZCBhdCBhIHRpbWUgKGxpa2UgbG9va2luZyBhdCB0aGUgcGFnZXMgaW4gYSBib29rIG9uZSBieSBvbmUpLgorCS8vCisJLy8JUHVibGlzaGVzIHRvcGljcyA8d2lkZ2V0SWQ+LWFkZENoaWxkLCA8d2lkZ2V0SWQ+LXJlbW92ZUNoaWxkLCBhbmQgPHdpZGdldElkPi1zZWxlY3RDaGlsZAorCS8vCisJLy8JQ2FuIGJlIGJhc2UgY2xhc3MgZm9yIGNvbnRhaW5lciwgV2l6YXJkLCBTaG93LCBldGMuCisKKwlpc0NvbnRhaW5lcjogdHJ1ZSwKKworCS8vIGRvTGF5b3V0OiBCb29sZWFuCisJLy8gIGlmIHRydWUsIGNoYW5nZSB0aGUgc2l6ZSBvZiBteSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHRvIG1hdGNoIG15IHNpemUKKwlkb0xheW91dDogdHJ1ZSwKKworCXRlbXBsYXRlU3RyaW5nOiAiPGRpdiBkb2pvQXR0YWNoUG9pbnQ9J2NvbnRhaW5lck5vZGUnPjwvZGl2PiIsCisKKwkvLyBzZWxlY3RlZENoaWxkOiBTdHJpbmcKKwkvLyAgIGlkIG9mIHRoZSBjdXJyZW50bHkgc2hvd24gcGFnZQorCXNlbGVjdGVkQ2hpbGQ6ICIiLAorCisJZmlsbEluVGVtcGxhdGU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpIHsKKwkJLy8gQ29weSBzdHlsZSBpbmZvIGZyb20gaW5wdXQgbm9kZSB0byBvdXRwdXQgbm9kZQorCQl2YXIgc291cmNlID0gdGhpcy5nZXRGcmFnTm9kZVJlZihmcmFnKTsKKwkJZG9qby5odG1sLmNvcHlTdHlsZSh0aGlzLmRvbU5vZGUsIHNvdXJjZSk7CisJCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0sCisKKwlwb3N0Q3JlYXRlOiBmdW5jdGlvbihhcmdzLCBmcmFnKSB7CisJCWlmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKXsKKwkJCS8vIFNldHVwIGVhY2ggcGFnZSBwYW5lbAorCQkJZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbiwgdGhpcy5fc2V0dXBDaGlsZCwgdGhpcyk7CisKKwkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggY2hpbGQgdG8gaW5pdGlhbGx5IGRpc3BsYXkKKwkJCXZhciBpbml0aWFsQ2hpbGQ7CisJCQlpZih0aGlzLnNlbGVjdGVkQ2hpbGQpeworCQkJCXRoaXMuc2VsZWN0Q2hpbGQodGhpcy5zZWxlY3RlZENoaWxkKTsKKwkJCX1lbHNleworCQkJCWZvcih2YXIgaT0wOyBpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspeworCQkJCQlpZih0aGlzLmNoaWxkcmVuW2ldLnNlbGVjdGVkKXsKKwkJCQkJCXRoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlbltpXSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZighdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KXsKKwkJCQkJdGhpcy5zZWxlY3RDaGlsZCh0aGlzLmNoaWxkcmVuWzBdKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJYWRkQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKXsKKwkJZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lci5zdXBlcmNsYXNzLmFkZENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCXRoaXMuX3NldHVwQ2hpbGQoY2hpbGQpOworCisJCS8vIGluIGNhc2UgdGhlIHRhYiBsYWJlbHMgaGF2ZSBvdmVyZmxvd2VkIGZyb20gb25lIGxpbmUgdG8gdHdvIGxpbmVzCisJCXRoaXMub25SZXNpemVkKCk7CisKKwkJLy8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hpbGQsIHRoZW4gc2VsZWN0IGl0CisJCWlmKCF0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpeworCQkJdGhpcy5zZWxlY3RDaGlsZChjaGlsZCk7CisJCX0KKwl9LAorCisJX3NldHVwQ2hpbGQ6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki8gcGFnZSl7CisJCS8vIFN1bW1hcnk6IEFkZCB0aGUgZ2l2ZW4gY2hpbGQgdG8gdGhpcyBwYWdlIGNvbnRhaW5lcgorCisJCXBhZ2UuaGlkZSgpOworCQkKKwkJLy8gc2luY2Ugd2UgYXJlIHNldHRpbmcgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgY2hpbGQgZWxlbWVudHMsIHRoZXkgbmVlZAorCQkvLyB0byBiZSBwb3NpdGlvbjpyZWxhdGl2ZSwgb3IgSUUgaGFzIHByb2JsZW1zIChTZWUgYnVnICMyMDMzKQorCQlwYWdlLmRvbU5vZGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjsKKworCQkvLyBwdWJsaXNoIHRoZSBhZGRDaGlsZCBldmVudCBmb3IgcGFuZXMgYWRkZWQgdmlhIGFkZENoaWxkKCksIGFuZCB0aGUgb3JpZ2luYWwgcGFuZXMgdG9vCisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLndpZGdldElkKyItYWRkQ2hpbGQiLCBwYWdlKTsKKwl9LAorCisJcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki8gcGFnZSl7CisJCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5yZW1vdmVDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisJCS8vIElmIHdlIGFyZSBiZWluZyBkZXN0cm95ZWQgdGhhbiBkb24ndCBydW4gdGhlIGNvZGUgYmVsb3cgKHRvIHNlbGVjdCBhbm90aGVyIHBhZ2UpLCBiZWNhdXNlIHdlIGFyZSBkZWxldGluZworCQkvLyBldmVyeSBwYWdlIG9uZSBieSBvbmUKKwkJaWYodGhpcy5fYmVpbmdEZXN0cm95ZWQpeyByZXR1cm47IH0KKworCQkvLyB0aGlzIHdpbGwgbm90aWZ5IGFueSB0YWJsaXN0cyB0byByZW1vdmUgYSBidXR0b247IGRvIHRoaXMgZmlyc3QgYmVjYXVzZSBpdCBtYXkgYWZmZWN0IHNpemluZworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy53aWRnZXRJZCsiLXJlbW92ZUNoaWxkIiwgcGFnZSk7CisKKwkJLy8gaW4gY2FzZSB0aGUgdGFiIGxhYmVscyBub3cgdGFrZSB1cCBvbmUgbGluZSBpbnN0ZWFkIG9mIHR3byBsaW5lcworCQl0aGlzLm9uUmVzaXplZCgpOworCisJCWlmICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQgPT09IHBhZ2UpIHsKKwkJCXRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCA9IHVuZGVmaW5lZDsKKwkJCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKKwkJCQl0aGlzLnNlbGVjdENoaWxkKHRoaXMuY2hpbGRyZW5bMF0sIHRydWUpOworCQkJfQorCQl9CisJfSwKKworCXNlbGVjdENoaWxkOiBmdW5jdGlvbigvKldpZGdldCovIHBhZ2UsIC8qV2lkZ2V0Ki8gY2FsbGluZ1dpZGdldCl7CisJCS8vIHN1bW1hcnkKKwkJLy8JU2hvdyB0aGUgZ2l2ZW4gd2lkZ2V0ICh3aGljaCBtdXN0IGJlIG9uZSBvZiBteSBjaGlsZHJlbikKKwkJcGFnZSA9IGRvam8ud2lkZ2V0LmJ5SWQocGFnZSk7CisJCXRoaXMuY29ycmVzcG9uZGluZ1BhZ2VCdXR0b24gPSBjYWxsaW5nV2lkZ2V0OworCisJCS8vIERlc2VsZWN0IG9sZCBwYWdlIGFuZCBzZWxlY3QgbmV3IG9uZQorCQlpZih0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpeworCQkJdGhpcy5faGlkZUNoaWxkKHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCk7CisJCX0KKwkJdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0ID0gcGFnZTsKKwkJdGhpcy5zZWxlY3RlZENoaWxkID0gcGFnZS53aWRnZXRJZDsKKwkJdGhpcy5fc2hvd0NoaWxkKHBhZ2UpOworCQlwYWdlLmlzRmlyc3RDaGlsZCA9IChwYWdlID09IHRoaXMuY2hpbGRyZW5bMF0pOworCQlwYWdlLmlzTGFzdENoaWxkID0gKHBhZ2UgPT0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aC0xXSk7CisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLndpZGdldElkKyItc2VsZWN0Q2hpbGQiLCBwYWdlKTsKKwl9LAorCisJZm9yd2FyZDogZnVuY3Rpb24oKXsKKwkJLy8gU3VtbWFyeTogYWR2YW5jZSB0byBuZXh0IHBhZ2UKKwkJdmFyIGluZGV4ID0gZG9qby5sYW5nLmZpbmQodGhpcy5jaGlsZHJlbiwgdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KTsKKwkJdGhpcy5zZWxlY3RDaGlsZCh0aGlzLmNoaWxkcmVuW2luZGV4KzFdKTsKKwl9LAorCisJYmFjazogZnVuY3Rpb24oKXsKKwkJLy8gU3VtbWFyeTogZ28gYmFjayB0byBwcmV2aW91cyBwYWdlCisJCXZhciBpbmRleCA9IGRvam8ubGFuZy5maW5kKHRoaXMuY2hpbGRyZW4sIHRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldCk7CisJCXRoaXMuc2VsZWN0Q2hpbGQodGhpcy5jaGlsZHJlbltpbmRleC0xXSk7CisJfSwKKworCW9uUmVzaXplZDogZnVuY3Rpb24oKXsKKwkJLy8gU3VtbWFyeTogY2FsbGVkIHdoZW4gYW55IHBhZ2UgaXMgc2hvd24sIHRvIG1ha2UgaXQgZml0IHRoZSBjb250YWluZXIgY29ycmVjdGx5CisJCWlmKHRoaXMuZG9MYXlvdXQgJiYgdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KXsKKwkJCXdpdGgodGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0LmRvbU5vZGUuc3R5bGUpeworCQkJCXRvcCA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuY29udGFpbmVyTm9kZSwgInBhZGRpbmctdG9wIiwgdHJ1ZSk7CisJCQkJbGVmdCA9IGRvam8uaHRtbC5nZXRQaXhlbFZhbHVlKHRoaXMuY29udGFpbmVyTm9kZSwgInBhZGRpbmctbGVmdCIsIHRydWUpOworCQkJfQorCQkJdmFyIGNvbnRlbnQgPSBkb2pvLmh0bWwuZ2V0Q29udGVudEJveCh0aGlzLmNvbnRhaW5lck5vZGUpOworCQkJdGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0LnJlc2l6ZVRvKGNvbnRlbnQud2lkdGgsIGNvbnRlbnQuaGVpZ2h0KTsKKwkJfQorCX0sCisKKwlfc2hvd0NoaWxkOiBmdW5jdGlvbigvKldpZGdldCovIHBhZ2UpIHsKKwkJLy8gc2l6ZSB0aGUgY3VycmVudCBwYWdlIChpbiBjYXNlIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgaXQncyBiZWluZyBzaG93biwgb3IgSSBoYXZlIGJlZW4gcmVzaXplZCkKKwkJaWYodGhpcy5kb0xheW91dCl7CisJCQl2YXIgY29udGVudCA9IGRvam8uaHRtbC5nZXRDb250ZW50Qm94KHRoaXMuY29udGFpbmVyTm9kZSk7CisJCQlwYWdlLnJlc2l6ZVRvKGNvbnRlbnQud2lkdGgsIGNvbnRlbnQuaGVpZ2h0KTsKKwkJfQorCisJCXBhZ2Uuc2VsZWN0ZWQ9dHJ1ZTsKKwkJcGFnZS5zaG93KCk7CisJfSwKKworCV9oaWRlQ2hpbGQ6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki8gcGFnZSkgeworCQlwYWdlLnNlbGVjdGVkPWZhbHNlOworCQlwYWdlLmhpZGUoKTsKKwl9LAorCisJY2xvc2VDaGlsZDogZnVuY3Rpb24oLypXaWRnZXQqLyBwYWdlKSB7CisJCS8vIHN1bW1hcnkKKwkJLy8JY2FsbGJhY2sgd2hlbiB1c2VyIGNsaWNrcyB0aGUgW1hdIHRvIHJlbW92ZSBhIHBhZ2UKKwkJLy8JaWYgb25DbG9zZSgpIHJldHVybnMgdHJ1ZSB0aGVuIHJlbW92ZSBhbmQgZGVzdHJveSB0aGUgY2hpbGRkCisJCXZhciByZW1vdmUgPSBwYWdlLm9uQ2xvc2UodGhpcywgcGFnZSk7CisJCWlmKHJlbW92ZSkgeworCQkJdGhpcy5yZW1vdmVDaGlsZChwYWdlKTsKKwkJCS8vIG1ha2VzIHN1cmUgd2UgY2FuIGNsZWFuIHVwIGV4ZWN1dGVTY3JpcHRzIGluIENvbnRlbnRQYW5lIG9uVW5Mb2FkCisJCQlwYWdlLmRlc3Ryb3koKTsKKwkJfQorCX0sCisKKwlkZXN0cm95OiBmdW5jdGlvbigpeworCQl0aGlzLl9iZWluZ0Rlc3Ryb3llZCA9IHRydWU7CisJCWRvam8uZXZlbnQudG9waWMuZGVzdHJveSh0aGlzLndpZGdldElkKyItYWRkQ2hpbGQiKTsKKwkJZG9qby5ldmVudC50b3BpYy5kZXN0cm95KHRoaXMud2lkZ2V0SWQrIi1yZW1vdmVDaGlsZCIpOworCQlkb2pvLmV2ZW50LnRvcGljLmRlc3Ryb3kodGhpcy53aWRnZXRJZCsiLXNlbGVjdENoaWxkIik7CisJCWRvam8ud2lkZ2V0LlBhZ2VDb250YWluZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorfSk7CisKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KAorICAgICJkb2pvLndpZGdldC5QYWdlQ29udHJvbGxlciIsCisgICAgZG9qby53aWRnZXQuSHRtbFdpZGdldCwKKwl7CisJCS8vIHN1bW1hcnkKKwkJLy8JU2V0IG9mIGJ1dHRvbnMgdG8gc2VsZWN0IGEgcGFnZSBpbiBhIHBhZ2UgbGlzdC4KKwkJLy8JTW9uaXRvcnMgdGhlIHNwZWNpZmllZCBQYWdlQ29udGFpbmUsIGFuZCB3aGVuZXZlciBhIHBhZ2UgaXMKKwkJLy8JYWRkZWQsIGRlbGV0ZWQsIG9yIHNlbGVjdGVkLCB1cGRhdGVzIGl0c2VsZiBhY2NvcmRpbmdseS4KKworCQl0ZW1wbGF0ZVN0cmluZzogIjxzcGFuIHdhaXJvbGU9J3RhYmxpc3QnIGRvam9BdHRhY2hFdmVudD0nb25LZXknPjwvc3Bhbj4iLAorCQlpc0NvbnRhaW5lcjogdHJ1ZSwKKworCQkvLyBjb250YWluZXJJZDogU3RyaW5nCisJCS8vCXRoZSBpZCBvZiB0aGUgcGFnZSBjb250YWluZXIgdGhhdCBJIHBvaW50IHRvCisJCWNvbnRhaW5lcklkOiAiIiwKKworCQkvLyBidXR0b25XaWRnZXQ6IFN0cmluZworCQkvLwl0aGUgbmFtZSBvZiB0aGUgYnV0dG9uIHdpZGdldCB0byBjcmVhdGUgdG8gY29ycmVzcG9uZCB0byBlYWNoIHBhZ2UKKwkJYnV0dG9uV2lkZ2V0OiAiUGFnZUJ1dHRvbiIsCisKKwkJLy8gY2xhc3M6IFN0cmluZworCQkvLwlDbGFzcyBuYW1lIHRvIGFwcGx5IHRvIHRoZSB0b3AgZG9tIG5vZGUKKwkJImNsYXNzIjogImRvam9QYWdlQ29udHJvbGxlciIsCisKKwkJZmlsbEluVGVtcGxhdGU6IGZ1bmN0aW9uKCkgeworCQkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgdGhpc1siY2xhc3MiXSk7ICAvLyAiY2xhc3MiIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBKUworCQkJZG9qby53aWRnZXQud2FpLnNldEF0dHIodGhpcy5kb21Ob2RlLCAid2FpUm9sZSIsICJyb2xlIiwgInRhYmxpc3QiKTsKKwkJfSwKKworCQlwb3N0Q3JlYXRlOiBmdW5jdGlvbigpeworCQkJdGhpcy5wYW5lMmJ1dHRvbiA9IHt9OwkJLy8gbWFwcGluZyBmcm9tIHBhbmVzIHRvIGJ1dHRvbnMKKworCQkJLy8gSWYgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHBhZ2UgY29udGFpbmVyIHRoZW4gY3JlYXRlIGJ1dHRvbnMgZm9yIHRoZW0KKwkJCXZhciBjb250YWluZXIgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuY29udGFpbmVySWQpOworCQkJaWYoY29udGFpbmVyKXsKKwkJCQlkb2pvLmxhbmcuZm9yRWFjaChjb250YWluZXIuY2hpbGRyZW4sIHRoaXMub25BZGRDaGlsZCwgdGhpcyk7CisJCQl9CisKKwkJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRoaXMuY29udGFpbmVySWQrIi1hZGRDaGlsZCIsIHRoaXMsICJvbkFkZENoaWxkIik7CisJCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItcmVtb3ZlQ2hpbGQiLCB0aGlzLCAib25SZW1vdmVDaGlsZCIpOworCQkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodGhpcy5jb250YWluZXJJZCsiLXNlbGVjdENoaWxkIiwgdGhpcywgIm9uU2VsZWN0Q2hpbGQiKTsKKwkJfSwKKworCQlkZXN0cm95OiBmdW5jdGlvbigpeworCQkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItYWRkQ2hpbGQiLCB0aGlzLCAib25BZGRDaGlsZCIpOworCQkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItcmVtb3ZlQ2hpbGQiLCB0aGlzLCAib25SZW1vdmVDaGlsZCIpOworCQkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0aGlzLmNvbnRhaW5lcklkKyItc2VsZWN0Q2hpbGQiLCB0aGlzLCAib25TZWxlY3RDaGlsZCIpOworCQkJZG9qby53aWRnZXQuUGFnZUNvbnRyb2xsZXIuc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0sCisKKwkJb25BZGRDaGlsZDogZnVuY3Rpb24oLypXaWRnZXQqLyBwYWdlKXsKKwkJCS8vIHN1bW1hcnkKKwkJCS8vICAgQ2FsbGVkIHdoZW5ldmVyIGEgcGFnZSBpcyBhZGRlZCB0byB0aGUgY29udGFpbmVyLgorCQkJLy8gICBDcmVhdGUgYnV0dG9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhZ2UuCisJCQl2YXIgYnV0dG9uID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KHRoaXMuYnV0dG9uV2lkZ2V0LAorCQkJCXsKKwkJCQkJbGFiZWw6IHBhZ2UubGFiZWwsCisJCQkJCWNsb3NlQnV0dG9uOiBwYWdlLmNsb3NhYmxlCisJCQkJfSk7CisJCQl0aGlzLmFkZENoaWxkKGJ1dHRvbik7CisJCQl0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uLmRvbU5vZGUpOworCQkJdGhpcy5wYW5lMmJ1dHRvbltwYWdlXT1idXR0b247CisJCQlwYWdlLmNvbnRyb2xCdXR0b24gPSBidXR0b247CS8vIHRoaXMgdmFsdWUgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gaWYgdHdvIHRhYnMgcG9pbnQgdG8gc2FtZSBjb250YWluZXIKKworCQkJdmFyIF90aGlzID0gdGhpczsKKwkJCWRvam8uZXZlbnQuY29ubmVjdChidXR0b24sICJvbkNsaWNrIiwgZnVuY3Rpb24oKXsgX3RoaXMub25CdXR0b25DbGljayhwYWdlKTsgfSk7CisJCQlkb2pvLmV2ZW50LmNvbm5lY3QoYnV0dG9uLCAib25DbG9zZUJ1dHRvbkNsaWNrIiwgZnVuY3Rpb24oKXsgX3RoaXMub25DbG9zZUJ1dHRvbkNsaWNrKHBhZ2UpOyB9KTsKKwkJfSwKKworCQlvblJlbW92ZUNoaWxkOiBmdW5jdGlvbigvKldpZGdldCovIHBhZ2UpeworCQkJLy8gc3VtbWFyeQorCQkJLy8gICBDYWxsZWQgd2hlbmV2ZXIgYSBwYWdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY29udGFpbmVyLgorCQkJLy8gICBSZW1vdmUgdGhlIGJ1dHRvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWdlLgorCQkJaWYodGhpcy5fY3VycmVudENoaWxkID09IHBhZ2UpeyB0aGlzLl9jdXJyZW50Q2hpbGQgPSBudWxsOyB9CisJCQl2YXIgYnV0dG9uID0gdGhpcy5wYW5lMmJ1dHRvbltwYWdlXTsKKwkJCWlmKGJ1dHRvbil7CisJCQkJYnV0dG9uLmRlc3Ryb3koKTsKKwkJCX0KKwkJCXRoaXMucGFuZTJidXR0b25bcGFnZV0gPSBudWxsOworCQl9LAorCisJCW9uU2VsZWN0Q2hpbGQ6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki8gcGFnZSl7CisJCQkvLyBTdW1tYXJ5CisJCQkvLwlDYWxsZWQgd2hlbiBhIHBhZ2UgaGFzIGJlZW4gc2VsZWN0ZWQgaW4gdGhlIFBhZ2VDb250YWluZXIsIGVpdGhlciBieSBtZSBvciBieSBhbm90aGVyIFBhZ2VDb250cm9sbGVyCisJCQlpZih0aGlzLl9jdXJyZW50Q2hpbGQpeworCQkJCXZhciBvbGRCdXR0b249dGhpcy5wYW5lMmJ1dHRvblt0aGlzLl9jdXJyZW50Q2hpbGRdOworCQkJCW9sZEJ1dHRvbi5jbGVhclNlbGVjdGVkKCk7CisJCQl9CisJCQl2YXIgbmV3QnV0dG9uPXRoaXMucGFuZTJidXR0b25bcGFnZV07CisJCQluZXdCdXR0b24uc2V0U2VsZWN0ZWQoKTsKKwkJCXRoaXMuX2N1cnJlbnRDaGlsZD1wYWdlOworCQl9LAorCisJCW9uQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKC8qV2lkZ2V0Ki8gcGFnZSl7CisJCQkvLyBzdW1tYXJ5CisJCQkvLyAgIENhbGxlZCB3aGVuZXZlciBvbmUgb2YgbXkgY2hpbGQgYnV0dG9ucyBpcyBwcmVzc2VkIGluIGFuIGF0dGVtcHQgdG8gc2VsZWN0IGEgcGFnZQorCQkJdmFyIGNvbnRhaW5lciA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5jb250YWluZXJJZCk7CS8vIFRPRE86IGRvIHRoaXMgdmlhIHRvcGljcz8KKwkJCWNvbnRhaW5lci5zZWxlY3RDaGlsZChwYWdlLCBmYWxzZSwgdGhpcyk7CisJCX0sCisKKwkJb25DbG9zZUJ1dHRvbkNsaWNrOiBmdW5jdGlvbigvKldpZGdldCovIHBhZ2UpeworCQkJLy8gc3VtbWFyeQorCQkJLy8gICBDYWxsZWQgd2hlbmV2ZXIgb25lIG9mIG15IGNoaWxkIGJ1dHRvbnMgW1hdIGlzIHByZXNzZWQgaW4gYW4gYXR0ZW1wdCB0byBjbG9zZSBhIHBhZ2UKKwkJCXZhciBjb250YWluZXIgPSBkb2pvLndpZGdldC5ieUlkKHRoaXMuY29udGFpbmVySWQpOworCQkJY29udGFpbmVyLmNsb3NlQ2hpbGQocGFnZSk7CisJCX0sCisKKwkJb25LZXk6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkJLy8gc3VtbWFyeToKKwkJCS8vICAgSGFuZGxlIGtleXN0cm9rZXMgb24gdGhlIHBhZ2UgbGlzdCwgZm9yIGFkdmFuY2luZyB0byBuZXh0L3ByZXZpb3VzIGJ1dHRvbgorCisJCQlpZiggKGV2dC5rZXlDb2RlID09IGV2dC5LRVlfUklHSFRfQVJST1cpfHwKKwkJCQkoZXZ0LmtleUNvZGUgPT0gZXZ0LktFWV9MRUZUX0FSUk9XKSApeworCQkJCXZhciBjdXJyZW50ID0gMDsKKwkJCQl2YXIgbmV4dCA9IG51bGw7CS8vIHRoZSBuZXh0IGJ1dHRvbiB0byBmb2N1cyBvbgorCQkJCQorCQkJCS8vIGZpbmQgY3VycmVudGx5IGZvY3VzZWQgYnV0dG9uIGluIGNoaWxkcmVuIGFycmF5CisJCQkJdmFyIGN1cnJlbnQgPSBkb2pvLmxhbmcuZmluZCh0aGlzLmNoaWxkcmVuLCB0aGlzLnBhbmUyYnV0dG9uW3RoaXMuX2N1cnJlbnRDaGlsZF0pOworCQkJCQorCQkJCS8vIHBpY2sgbmV4dCBidXR0b24gdG8gZm9jdXMgb24KKwkJCQlpZihldnQua2V5Q29kZSA9PSBldnQuS0VZX1JJR0hUX0FSUk9XKXsKKwkJCQkJbmV4dCA9IHRoaXMuY2hpbGRyZW5bIChjdXJyZW50KzEpICUgdGhpcy5jaGlsZHJlbi5sZW5ndGggXTsgCisJCQkJfWVsc2V7IC8vIGlzIExFRlRfQVJST1cKKwkJCQkJbmV4dCA9IHRoaXMuY2hpbGRyZW5bIChjdXJyZW50KyAodGhpcy5jaGlsZHJlbi5sZW5ndGgtMSkpICUgdGhpcy5jaGlsZHJlbi5sZW5ndGggXTsKKwkJCQl9CisJCQkJCisJCQkJZG9qby5ldmVudC5icm93c2VyLnN0b3BFdmVudChldnQpOworCQkJCW5leHQub25DbGljaygpOworCQkJfQorCQl9CisJfQorKTsKKworZG9qby53aWRnZXQuZGVmaW5lV2lkZ2V0KCJkb2pvLndpZGdldC5QYWdlQnV0dG9uIiwgZG9qby53aWRnZXQuSHRtbFdpZGdldCwKK3sKKwkvLyBzdW1tYXJ5CisJLy8JSW50ZXJuYWwgd2lkZ2V0IHVzZWQgYnkgUGFnZUxpc3QuCisJLy8JVGhlIGJ1dHRvbi1saWtlIG9yIHRhYi1saWtlIG9iamVjdCB5b3UgY2xpY2sgdG8gc2VsZWN0IG9yIGRlbGV0ZSBhIHBhZ2UKKworCXRlbXBsYXRlU3RyaW5nOiAiPHNwYW4gY2xhc3M9J2l0ZW0nPiIgKworCQkJCQkJIjxzcGFuIGRvam9BdHRhY2hFdmVudD0nb25DbGljaycgZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIGNsYXNzPSdzZWxlY3RCdXR0b24nPiR7dGhpcy5sYWJlbH08L3NwYW4+IiArCisJCQkJCQkiPHNwYW4gZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrOm9uQ2xvc2VCdXR0b25DbGljaycgY2xhc3M9J2Nsb3NlQnV0dG9uJz5bWF08L3NwYW4+IiArCisJCQkJCSI8L3NwYW4+IiwKKworCS8vIGxhYmVsOiBTdHJpbmcKKwkvLyAgTmFtZSB0byBwcmludCBvbiB0aGUgYnV0dG9uCisJbGFiZWw6ICJmb28iLAorCQorCS8vIGNsb3NlQnV0dG9uOiBCb29sZWFuCisJLy8JdHJ1ZSBpZmYgd2Ugc2hvdWxkIGFsc28gcHJpbnQgYSBjbG9zZSBpY29uIHRvIGRlc3Ryb3kgY29ycmVzcG9uZGluZyBwYWdlCisJY2xvc2VCdXR0b246IGZhbHNlLAorCisJb25DbGljazogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeQorCQkvLyAgQmFzaWNhbGx5IHRoaXMgaXMgdGhlIGF0dGFjaCBwb2ludCBQYWdlQ29udHJvbGxlciBsaXN0ZW5zIHRvLCB0byBzZWxlY3QgdGhlIHBhZ2UKKwkJdGhpcy5mb2N1cygpOworCX0sCisKKwlvbkNsb3NlQnV0dG9uTW91c2VPdmVyOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5CisJCS8vCVRoZSBjbG9zZSBidXR0b24gY2hhbmdlcyBjb2xvciBhIGJpdCB3aGVuIHlvdSBtb3VzZSBvdmVyCQorCQlkb2pvLmh0bWwuYWRkQ2xhc3ModGhpcy5jbG9zZUJ1dHRvbk5vZGUsICJjbG9zZUhvdmVyIik7CisJfSwKKworCW9uQ2xvc2VCdXR0b25Nb3VzZU91dDogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeQorCQkvLyAJUmV2ZXJ0IGNsb3NlIGJ1dHRvbiB0byBub3JtYWwgY29sb3Igb24gbW91c2Ugb3V0CisJCWRvam8uaHRtbC5yZW1vdmVDbGFzcyh0aGlzLmNsb3NlQnV0dG9uTm9kZSwgImNsb3NlSG92ZXIiKTsKKwl9LAorCisJb25DbG9zZUJ1dHRvbkNsaWNrOiBmdW5jdGlvbigvKkV2ZW50Ki8gZXZ0KXsKKwkJLy8gc3VtbWFyeQorCQkvLwlIYW5kbGUgY2xpY2tpbmcgdGhlIGNsb3NlIGJ1dHRvbiBmb3IgdGhpcyB0YWIKKwl9LAorCQorCXNldFNlbGVjdGVkOiBmdW5jdGlvbigpeworCQkvLyBzdW1tYXJ5CisJCS8vCVRoaXMgaXMgcnVuIHdoZW5ldmVyIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBidXR0b24gaGFzIGJlZW4gc2VsZWN0ZWQKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMuZG9tTm9kZSwgImN1cnJlbnQiKTsKKwkJdGhpcy50aXRsZU5vZGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIjAiKTsKKwl9LAorCQorCWNsZWFyU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnkKKwkJLy8JVGhpcyBmdW5jdGlvbiBpcyBydW4gd2hlbmV2ZXIgdGhlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGlzIGJ1dHRvbiBoYXMgYmVlbiBkZXNlbGVjdGVkIChhbmQgYW5vdGhlciBwYWdlIGhhcyBiZWVuIHNob3duKQorCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy5kb21Ob2RlLCAiY3VycmVudCIpOworCQl0aGlzLnRpdGxlTm9kZS5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwiLTEiKTsKKwl9LAorCisJZm9jdXM6IGZ1bmN0aW9uKCl7CisJCS8vIHN1bW1hcnkKKwkJLy8JVGhpcyB3aWxsIGZvY3VzIG9uIHRoZSB0aGlzIGJ1dHRvbiAoZm9yIGFjY2Vzc2liaWxpdHkgeW91IG5lZWQgdG8gZG8gdGhpcyB3aGVuIHRoZSBidXR0b24gaXMgc2VsZWN0ZWQpCisJCWlmKHRoaXMudGl0bGVOb2RlLmZvY3VzKXsJLy8gbW96aWxsYSAxLjcgZG9lc24ndCBoYXZlIGZvY3VzKCkgZnVuYworCQkJdGhpcy50aXRsZU5vZGUuZm9jdXMoKTsKKwkJfQorCX0KK30pOworCisvLyBUaGVzZSBhcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGNoaWxkcmVuIG9mIGEgUGFnZUNvbnRhaW5lci4KKy8vIFNpbmNlIGFueSB3aWRnZXQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIFBhZ2VDb250YWluZXIgY2hpbGQsIG1peCB0aGVtCisvLyBpbnRvIHRoZSBiYXNlIHdpZGdldCBjbGFzcy4gIChUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgZWZmZWN0aXZlLikKK2Rvam8ubGFuZy5leHRlbmQoZG9qby53aWRnZXQuV2lkZ2V0LCB7CisJLy8gbGFiZWw6IFN0cmluZworCS8vCQlMYWJlbCBvciB0aXRsZSBvZiB0aGlzIHdpZGdldC4gIFVzZWQgYnkgVGFiQ29udGFpbmVyIHRvIHRoZSBuYW1lIHRoZSB0YWIsIGV0Yy4KKwlsYWJlbDogIiIsCisJCisJLy8gc2VsZWN0ZWQ6IEJvb2xlYW4KKwkvLwkJSXMgdGhpcyBjaGlsZCBjdXJyZW50bHkgc2VsZWN0ZWQ/CisJc2VsZWN0ZWQ6IGZhbHNlLAorCQorCS8vIGNsb3NhYmxlOiBCb29sZWFuCisJLy8JCVRydWUgaWYgdXNlciBjYW4gY2xvc2UgKGRlc3Ryb3kpIHRoaXMgY2hpbGQsIHN1Y2ggYXMgKGZvciBleGFtcGxlKSBjbGlja2luZyB0aGUgWCBvbiB0aGUgdGFiLgorCWNsb3NhYmxlOiBmYWxzZSwJLy8gdHJ1ZSBpZiB1c2VyIGNhbiBjbG9zZSB0aGlzIHRhYiBwYW5lCisJCisJb25DbG9zZTogZnVuY3Rpb24oKXsKKwkJLy8gc3VtbWFyeTogQ2FsbGJhY2sgaWYgc29tZW9uZSB0cmllcyB0byBjbG9zZSB0aGUgY2hpbGQsIGNoaWxkIHdpbGwgYmUgY2xvc2VkIGlmIGZ1bmMgcmV0dXJucyB0cnVlCisJCXJldHVybiB0cnVlOworCX0KK30pOworCitkb2pvLnByb3ZpZGUoImRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lciIpOworCisKKworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVGFiQ29udGFpbmVyIiwgZG9qby53aWRnZXQuUGFnZUNvbnRhaW5lciwgeworCisJLy8gc3VtbWFyeQorCS8vCUEgVGFiQ29udGFpbmVyIGlzIGEgY29udGFpbmVyIHRoYXQgaGFzIG11bHRpcGxlIHBhbmVzLCBidXQgc2hvd3Mgb25seQorCS8vCW9uZSBwYW5lIGF0IGEgdGltZS4gIFRoZXJlIGFyZSBhIHNldCBvZiB0YWJzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBwYW5lLAorCS8vCXdoZXJlIGVhY2ggdGFiIGhhcyB0aGUgdGl0bGUgKGFrYSBsYWJlbCkgb2YgdGhlIHBhbmUsIGFuZCBvcHRpb25hbGx5IGEgY2xvc2UgYnV0dG9uLgorCS8vCisJLy8JUHVibGlzaGVzIHRvcGljcyA8d2lkZ2V0SWQ+LWFkZENoaWxkLCA8d2lkZ2V0SWQ+LXJlbW92ZUNoaWxkLCBhbmQgPHdpZGdldElkPi1zZWxlY3RDaGlsZAorCS8vCSh3aGVyZSA8d2lkZ2V0SWQ+IGlzIHRoZSBpZCBvZiB0aGUgVGFiQ29udGFpbmVyIGl0c2VsZi4KKworCS8vIGxhYmVsUG9zaXRpb246IFN0cmluZworCS8vICAgRGVmaW5lcyB3aGVyZSB0YWIgbGFiZWxzIGdvIHJlbGF0aXZlIHRvIHRhYiBjb250ZW50LgorCS8vICAgInRvcCIsICJib3R0b20iLCAibGVmdC1oIiwgInJpZ2h0LWgiCisJbGFiZWxQb3NpdGlvbjogInRvcCIsCisJCisJLy8gY2xvc2VCdXR0b246IFN0cmluZworCS8vICAgSWYgY2xvc2VidXR0b249PSJ0YWIiLCB0aGVuIGV2ZXJ5IHRhYiBnZXRzIGEgY2xvc2UgYnV0dG9uLgorCS8vICAgREVQUkVDQVRFRDogIFNob3VsZCBqdXN0IHNheSBjbG9zYWJsZT10cnVlIG9uIGVhY2gKKwkvLyAgIHBhbmUgeW91IHdhbnQgdG8gYmUgY2xvc2FibGUuCisJY2xvc2VCdXR0b246ICJub25lIiwKKworCXRlbXBsYXRlU3RyaW5nOiBudWxsLAkvLyBvdmVycmlkZSBzZXR0aW5nIGluIFBhZ2VDb250YWluZXIKKwl0ZW1wbGF0ZVN0cmluZzoiPGRpdiBpZD1cIiR7dGhpcy53aWRnZXRJZH1cIiBjbGFzcz1cImRvam9UYWJDb250YWluZXJcIj5cclxuXHQ8ZGl2IGRvam9BdHRhY2hQb2ludD1cInRhYmxpc3ROb2RlXCI+PC9kaXY+XHJcblx0PGRpdiBjbGFzcz1cImRvam9UYWJQYW5lV3JhcHBlclwiIGRvam9BdHRhY2hQb2ludD1cImNvbnRhaW5lck5vZGVcIiBkb2pvQXR0YWNoRXZlbnQ9XCJvbktleVwiIHdhaVJvbGU9XCJ0YWJwYW5lbFwiPjwvZGl2PlxyXG48L2Rpdj5cclxuIiwKKwl0ZW1wbGF0ZUNzc1N0cmluZzoiLmRvam9UYWJDb250YWluZXIge1xyXG5cdHBvc2l0aW9uIDogcmVsYXRpdmU7XHJcbn1cclxuXHJcbi5kb2pvVGFiUGFuZVdyYXBwZXIge1xyXG5cdGJvcmRlciA6IDFweCBzb2xpZCAjNjI5MGQyO1xyXG5cdF96b29tOiAxOyAvKiBmb3JjZSBJRTYgbGF5b3V0IG1vZGUgc28gdG9wIGJvcmRlciBkb2VzbnQgZGlzYXBwZWFyICovXHJcblx0ZGlzcGxheTogYmxvY2s7XHJcblx0Y2xlYXI6IGJvdGg7XHJcblx0b3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtdG9wIHtcclxuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xyXG5cdHRvcCA6IDBweDtcclxuXHRsZWZ0IDogMHB4O1xyXG5cdG92ZXJmbG93IDogdmlzaWJsZTtcclxuXHRtYXJnaW4tYm90dG9tIDogLTFweDtcclxuXHR3aWR0aCA6IDEwMCU7XHJcblx0ei1pbmRleDogMjtcdC8qIHNvIHRoZSBib3R0b20gb2YgdGhlIHRhYiBsYWJlbCB3aWxsIGNvdmVyIHVwIHRoZSBib3JkZXIgb2YgZG9qb1RhYlBhbmVXcmFwcGVyICovXHJcbn1cclxuXHJcbi5kb2pvVGFiTm9MYXlvdXQuZG9qb1RhYkxhYmVscy10b3AgLmRvam9UYWIge1xyXG5cdG1hcmdpbi1ib3R0b206IC0xcHg7XHJcblx0X21hcmdpbi1ib3R0b206IDBweDsgLyogSUUgZmlsdGVyIHNvIHRvcCBib3JkZXIgbGluZXMgdXAgY29ycmVjdGx5ICovXHJcbn1cclxuXHJcbi5kb2pvVGFiIHtcclxuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xyXG5cdGZsb2F0IDogbGVmdDtcclxuXHRwYWRkaW5nLWxlZnQgOiA5cHg7XHJcblx0Ym9yZGVyLWJvdHRvbSA6IDFweCBzb2xpZCAjNjI5MGQyO1xyXG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9sZWZ0LmdpZikgbm8tcmVwZWF0IGxlZnQgdG9wO1xyXG5cdGN1cnNvcjogcG9pbnRlcjtcclxuXHR3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG5cdHotaW5kZXg6IDM7XHJcbn1cclxuXHJcbi5kb2pvVGFiIGRpdiB7XHJcblx0ZGlzcGxheSA6IGJsb2NrO1xyXG5cdHBhZGRpbmcgOiA0cHggMTVweCA0cHggNnB4O1xyXG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl90b3BfcmlnaHQuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wO1xyXG5cdGNvbG9yIDogIzMzMztcclxuXHRmb250LXNpemUgOiA5MCU7XHJcbn1cclxuXHJcbi5kb2pvVGFiIC5jbG9zZSB7XHJcblx0ZGlzcGxheSA6IGlubGluZS1ibG9jaztcclxuXHRoZWlnaHQgOiAxMnB4O1xyXG5cdHdpZHRoIDogMTJweDtcclxuXHRwYWRkaW5nIDogMCAxMnB4IDAgMDtcclxuXHRtYXJnaW4gOiAwIC0xMHB4IDAgMTBweDtcclxuXHRjdXJzb3IgOiBkZWZhdWx0O1xyXG5cdGZvbnQtc2l6ZTogc21hbGw7XHJcbn1cclxuXHJcbi5kb2pvVGFiIC5jbG9zZUltYWdlIHtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfY2xvc2UuZ2lmKSBuby1yZXBlYXQgcmlnaHQgdG9wO1xyXG59XHJcblxyXG4uZG9qb1RhYiAuY2xvc2VIb3ZlciB7XHJcblx0YmFja2dyb3VuZC1pbWFnZSA6IHVybChpbWFnZXMvdGFiX2Nsb3NlX2guZ2lmKTtcclxufVxyXG5cclxuLmRvam9UYWIuY3VycmVudCB7XHJcblx0cGFkZGluZy1ib3R0b20gOiAxcHg7XHJcblx0Ym9yZGVyLWJvdHRvbSA6IDA7XHJcblx0YmFja2dyb3VuZC1wb3NpdGlvbiA6IDAgLTE1MHB4O1xyXG59XHJcblxyXG4uZG9qb1RhYi5jdXJyZW50IGRpdiB7XHJcblx0cGFkZGluZy1ib3R0b20gOiA1cHg7XHJcblx0bWFyZ2luLWJvdHRvbSA6IC0xcHg7XHJcblx0YmFja2dyb3VuZC1wb3NpdGlvbiA6IDEwMCUgLTE1MHB4O1xyXG59XHJcblxyXG4vKiBib3R0b20gdGFicyAqL1xyXG5cclxuLmRvam9UYWJMYWJlbHMtYm90dG9tIHtcclxuXHRwb3NpdGlvbiA6IHJlbGF0aXZlO1xyXG5cdGJvdHRvbSA6IDBweDtcclxuXHRsZWZ0IDogMHB4O1xyXG5cdG92ZXJmbG93IDogdmlzaWJsZTtcclxuXHRtYXJnaW4tdG9wIDogLTFweDtcclxuXHR3aWR0aCA6IDEwMCU7XHJcblx0ei1pbmRleDogMjtcclxufVxyXG5cclxuLmRvam9UYWJOb0xheW91dC5kb2pvVGFiTGFiZWxzLWJvdHRvbSB7XHJcblx0cG9zaXRpb24gOiByZWxhdGl2ZTtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiIHtcclxuXHRib3JkZXItdG9wIDogIDFweCBzb2xpZCAjNjI5MGQyO1xyXG5cdGJvcmRlci1ib3R0b20gOiAwO1xyXG5cdGJhY2tncm91bmQgOiB1cmwoaW1hZ2VzL3RhYl9ib3RfbGVmdC5naWYpIG5vLXJlcGVhdCBsZWZ0IGJvdHRvbTtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiIGRpdiB7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX2JvdF9yaWdodC5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWJvdHRvbSAuZG9qb1RhYi5jdXJyZW50IHtcclxuXHRib3JkZXItdG9wIDogMDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X2xlZnRfY3Vyci5naWYpIG5vLXJlcGVhdCBsZWZ0IGJvdHRvbTtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtYm90dG9tIC5kb2pvVGFiLmN1cnJlbnQgZGl2IHtcclxuXHRwYWRkaW5nLXRvcCA6IDRweDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X3JpZ2h0X2N1cnIuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tO1xyXG59XHJcblxyXG4vKiByaWdodC1oIHRhYnMgKi9cclxuXHJcbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWgge1xyXG5cdG92ZXJmbG93IDogdmlzaWJsZTtcclxuXHRtYXJnaW4tbGVmdCA6IC0xcHg7XHJcblx0ei1pbmRleDogMjtcclxufVxyXG5cclxuLmRvam9UYWJMYWJlbHMtcmlnaHQtaCAuZG9qb1RhYiB7XHJcblx0cGFkZGluZy1sZWZ0IDogMDtcclxuXHRib3JkZXItbGVmdCA6ICAxcHggc29saWQgIzYyOTBkMjtcclxuXHRib3JkZXItYm90dG9tIDogMDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfYm90X3JpZ2h0LmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTtcclxuXHRmbG9hdCA6IG5vbmU7XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWggLmRvam9UYWIgZGl2IHtcclxuXHRwYWRkaW5nIDogNHB4IDE1cHggNHB4IDE1cHg7XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLXJpZ2h0LWggLmRvam9UYWIuY3VycmVudCB7XHJcblx0Ym9yZGVyLWxlZnQgOiAgMDtcclxuXHRib3JkZXItYm90dG9tIDogIDFweCBzb2xpZCAjNjI5MGQyO1xyXG59XHJcblxyXG4vKiBsZWZ0LWggdGFicyAqL1xyXG5cclxuLmRvam9UYWJMYWJlbHMtbGVmdC1oIHtcclxuXHRvdmVyZmxvdyA6IHZpc2libGU7XHJcblx0bWFyZ2luLXJpZ2h0IDogLTFweDtcclxuXHR6LWluZGV4OiAyO1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1sZWZ0LWggLmRvam9UYWIge1xyXG5cdGJvcmRlci1yaWdodCA6ICAxcHggc29saWQgIzYyOTBkMjtcclxuXHRib3JkZXItYm90dG9tIDogMDtcclxuXHRmbG9hdCA6IG5vbmU7XHJcblx0YmFja2dyb3VuZCA6IHVybChpbWFnZXMvdGFiX3RvcF9sZWZ0LmdpZikgbm8tcmVwZWF0IGxlZnQgdG9wO1xyXG59XHJcblxyXG4uZG9qb1RhYkxhYmVscy1sZWZ0LWggLmRvam9UYWIuY3VycmVudCB7XHJcblx0Ym9yZGVyLXJpZ2h0IDogMDtcclxuXHRib3JkZXItYm90dG9tIDogIDFweCBzb2xpZCAjNjI5MGQyO1xyXG5cdHBhZGRpbmctYm90dG9tIDogMDtcclxuXHRiYWNrZ3JvdW5kIDogdXJsKGltYWdlcy90YWJfdG9wX2xlZnQuZ2lmKSBuby1yZXBlYXQgMCAtMTUwcHg7XHJcbn1cclxuXHJcbi5kb2pvVGFiTGFiZWxzLWxlZnQtaCAuZG9qb1RhYiBkaXYge1xyXG5cdGJhY2tncm91bmQgOiAwO1xyXG5cdGJvcmRlci1ib3R0b20gOiAgMXB4IHNvbGlkICM2MjkwZDI7XHJcbn1cclxuIix0ZW1wbGF0ZUNzc1BhdGg6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL1RhYkNvbnRhaW5lci5jc3MiKSwKKworCS8vIHNlbGVjdGVkVGFiOiBTdHJpbmcKKwkvLwlpbml0aWFsbHkgc2VsZWN0ZWQgdGFiICh3aWRnZXRJZCkKKwkvLwlERVBSRUNBVEVEOiB1c2Ugc2VsZWN0ZWRDaGlsZCBpbnN0ZWFkLgorCXNlbGVjdGVkVGFiOiAiIiwKKworCXBvc3RNaXhJblByb3BlcnRpZXM6IGZ1bmN0aW9uKCkgeworCQlpZih0aGlzLnNlbGVjdGVkVGFiKXsKKwkJCWRvam8uZGVwcmVjYXRlZCgic2VsZWN0ZWRUYWIgZGVwcmVjYXRlZCwgdXNlIHNlbGVjdGVkQ2hpbGQgaW5zdGVhZCwgd2lsbCBiZSByZW1vdmVkIGluIiwgIjAuNSIpOworCQkJdGhpcy5zZWxlY3RlZENoaWxkPXRoaXMuc2VsZWN0ZWRUYWI7CisJCX0KKwkJaWYodGhpcy5jbG9zZUJ1dHRvbiE9Im5vbmUiKXsKKwkJCWRvam8uZGVwcmVjYXRlZCgiY2xvc2VCdXR0b24gZGVwcmVjYXRlZCwgdXNlIGNsb3NhYmxlPSd0cnVlJyBvbiBlYWNoIGNoaWxkIGluc3RlYWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiIsICIwLjUiKTsKKwkJfQorCQlkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKworCWZpbGxJblRlbXBsYXRlOiBmdW5jdGlvbigpIHsKKwkJLy8gY3JlYXRlIHRoZSB0YWIgbGlzdCB0aGF0IHdpbGwgaGF2ZSBhIHRhYiAoYS5rLmEuIHRhYiBidXR0b24pIGZvciBlYWNoIHRhYiBwYW5lbAorCQl0aGlzLnRhYmxpc3QgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRhYkNvbnRyb2xsZXIiLAorCQkJeworCQkJCWlkOiB0aGlzLndpZGdldElkICsgIl90YWJsaXN0IiwKKwkJCQlsYWJlbFBvc2l0aW9uOiB0aGlzLmxhYmVsUG9zaXRpb24sCisJCQkJZG9MYXlvdXQ6IHRoaXMuZG9MYXlvdXQsCisJCQkJY29udGFpbmVySWQ6IHRoaXMud2lkZ2V0SWQKKwkJCX0sIHRoaXMudGFibGlzdE5vZGUpOworCQlkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5maWxsSW5UZW1wbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0sCisKKwlwb3N0Q3JlYXRlOiBmdW5jdGlvbihhcmdzLCBmcmFnKSB7CQorCQlkb2pvLndpZGdldC5UYWJDb250YWluZXIuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJLy8gc2l6ZSB0aGUgY29udGFpbmVyIHBhbmUgdG8gdGFrZSB1cCB0aGUgc3BhY2Ugbm90IHVzZWQgYnkgdGhlIHRhYnMgdGhlbXNlbHZlcworCQl0aGlzLm9uUmVzaXplZCgpOworCX0sCisKKwlfc2V0dXBDaGlsZDogZnVuY3Rpb24odGFiKXsKKwkJaWYodGhpcy5jbG9zZUJ1dHRvbj09InRhYiIgfHwgdGhpcy5jbG9zZUJ1dHRvbj09InBhbmUiKXsKKwkJCS8vIFRPRE86IHJlbW92ZSBpbiAwLjUKKwkJCXRhYi5jbG9zYWJsZT10cnVlOworCQl9CisJCWRvam8uaHRtbC5hZGRDbGFzcyh0YWIuZG9tTm9kZSwgImRvam9UYWJQYW5lIik7CisJCWRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lci5zdXBlcmNsYXNzLl9zZXR1cENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKworCW9uUmVzaXplZDogZnVuY3Rpb24oKXsKKwkJLy8gU3VtbWFyeTogQ29uZmlndXJlIHRoZSBjb250ZW50IHBhbmUgdG8gdGFrZSB1cCBhbGwgdGhlIHNwYWNlIGV4Y2VwdCBmb3Igd2hlcmUgdGhlIHRhYnMgYXJlCisJCWlmKCF0aGlzLmRvTGF5b3V0KXsgcmV0dXJuOyB9CisKKwkJLy8gcG9zaXRpb24gdGhlIGxhYmVscyBhbmQgdGhlIGNvbnRhaW5lciBub2RlCisJCXZhciBsYWJlbEFsaWduPXRoaXMubGFiZWxQb3NpdGlvbi5yZXBsYWNlKC8taC8sIiIpOworCQl2YXIgY2hpbGRyZW4gPSBbCisJCQl7ZG9tTm9kZTogdGhpcy50YWJsaXN0LmRvbU5vZGUsIGxheW91dEFsaWduOiBsYWJlbEFsaWdufSwKKwkJCXtkb21Ob2RlOiB0aGlzLmNvbnRhaW5lck5vZGUsIGxheW91dEFsaWduOiAiY2xpZW50In0KKwkJXTsKKwkJZG9qby53aWRnZXQuaHRtbC5sYXlvdXQodGhpcy5kb21Ob2RlLCBjaGlsZHJlbik7CisKKwkJaWYodGhpcy5zZWxlY3RlZENoaWxkV2lkZ2V0KXsKKwkJCXZhciBjb250YWluZXJTaXplID0gZG9qby5odG1sLmdldENvbnRlbnRCb3godGhpcy5jb250YWluZXJOb2RlKTsKKwkJCXRoaXMuc2VsZWN0ZWRDaGlsZFdpZGdldC5yZXNpemVUbyhjb250YWluZXJTaXplLndpZHRoLCBjb250YWluZXJTaXplLmhlaWdodCk7CisJCX0KKwl9LAorCisJc2VsZWN0VGFiOiBmdW5jdGlvbih0YWIsIGNhbGxpbmdXaWRnZXQpeworCQlkb2pvLmRlcHJlY2F0ZWQoInVzZSBzZWxlY3RDaGlsZCgpIHJhdGhlciB0aGFuIHNlbGVjdFRhYigpLCBzZWxlY3RUYWIoKSB3aWxsIGJlIHJlbW92ZWQgaW4iLCAiMC41Iik7CisJCXRoaXMuc2VsZWN0Q2hpbGQodGFiLCBjYWxsaW5nV2lkZ2V0KTsKKwl9LAorCisJb25LZXk6IGZ1bmN0aW9uKGUpeworCQkvLyBzdW1tYXJ5CisJCS8vCUtleXN0cm9rZSBoYW5kbGluZyBmb3Iga2V5c3Ryb2tlcyBvbiB0aGUgdGFiIHBhbmVsIGl0c2VsZiAodGhhdCB3ZXJlIGJ1YmJsZWQgdXAgdG8gbWUpCisJCS8vCUN0cmwtdXA6IGZvY3VzIGlzIHJldHVybmVkIGZyb20gdGhlIHBhbmUgdG8gdGhlIHRhYiBidXR0b24KKwkJLy8JQWx0LWRlbDogY2xvc2UgdGFiCisJCWlmKGUua2V5Q29kZSA9PSBlLktFWV9VUF9BUlJPVyAmJiBlLmN0cmxLZXkpeworCQkJLy8gc2V0IGZvY3VzIHRvIGN1cnJlbnQgdGFiCisJCQl2YXIgYnV0dG9uID0gdGhpcy5jb3JyZXNwb25kaW5nVGFiQnV0dG9uIHx8IHRoaXMuc2VsZWN0ZWRUYWJXaWRnZXQudGFiQnV0dG9uOworCQkJYnV0dG9uLmZvY3VzKCk7CisJCQlkb2pvLmV2ZW50LmJyb3dzZXIuc3RvcEV2ZW50KGUpOworCQl9ZWxzZSBpZihlLmtleUNvZGUgPT0gZS5LRVlfREVMRVRFICYmIGUuYWx0S2V5KXsKKwkJCWlmICh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQuY2xvc2FibGUpeworCQkJCXRoaXMuY2xvc2VDaGlsZCh0aGlzLnNlbGVjdGVkQ2hpbGRXaWRnZXQpOworCQkJCWRvam8uZXZlbnQuYnJvd3Nlci5zdG9wRXZlbnQoZSk7CisJCQl9CisJCX0KKwl9LAorCisJZGVzdHJveTogZnVuY3Rpb24oKXsKKwkJdGhpcy50YWJsaXN0LmRlc3Ryb3koKTsKKwkJZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KK30pOworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisgICAgImRvam8ud2lkZ2V0LlRhYkNvbnRyb2xsZXIiLAorICAgIGRvam8ud2lkZ2V0LlBhZ2VDb250cm9sbGVyLAorCXsKKwkJLy8gc3VtbWFyeQorCQkvLyAJU2V0IG9mIHRhYnMgKHRoZSB0aGluZ3Mgd2l0aCBsYWJlbHMgYW5kIGEgY2xvc2UgYnV0dG9uLCB0aGF0IHlvdSBjbGljayB0byBzaG93IGEgdGFiIHBhbmVsKS4KKwkJLy8JTGV0cyB0aGUgdXNlciBzZWxlY3QgdGhlIGN1cnJlbnRseSBzaG93biBwYW5lIGluIGEgVGFiQ29udGFpbmVyIG9yIFBhZ2VDb250YWluZXIuCisJCS8vCVRhYkNvbnRyb2xsZXIgYWxzbyBtb25pdG9ycyB0aGUgVGFiQ29udGFpbmVyLCBhbmQgd2hlbmV2ZXIgYSBwYW5lIGlzCisJCS8vCWFkZGVkIG9yIGRlbGV0ZWQgdXBkYXRlcyBpdHNlbGYgYWNjb3JkaW5nbHkuCisKKwkJdGVtcGxhdGVTdHJpbmc6ICI8ZGl2IHdhaXJvbGU9J3RhYmxpc3QnIGRvam9BdHRhY2hFdmVudD0nb25LZXknPjwvZGl2PiIsCisKKwkJLy8gbGFiZWxQb3NpdGlvbjogU3RyaW5nCisJCS8vICAgRGVmaW5lcyB3aGVyZSB0YWIgbGFiZWxzIGdvIHJlbGF0aXZlIHRvIHRhYiBjb250ZW50LgorCQkvLyAgICJ0b3AiLCAiYm90dG9tIiwgImxlZnQtaCIsICJyaWdodC1oIgorCQlsYWJlbFBvc2l0aW9uOiAidG9wIiwKKworCQlkb0xheW91dDogdHJ1ZSwKKworCQkvLyBjbGFzczogU3RyaW5nCisJCS8vCUNsYXNzIG5hbWUgdG8gYXBwbHkgdG8gdGhlIHRvcCBkb20gbm9kZQorCQkiY2xhc3MiOiAiIiwKKworCQkvLyBidXR0b25XaWRnZXQ6IFN0cmluZworCQkvLwl0aGUgbmFtZSBvZiB0aGUgdGFiIHdpZGdldCB0byBjcmVhdGUgdG8gY29ycmVzcG9uZCB0byBlYWNoIHBhZ2UKKwkJYnV0dG9uV2lkZ2V0OiAiVGFiQnV0dG9uIiwKKworCQlwb3N0TWl4SW5Qcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHsKKwkJCWlmKCF0aGlzWyJjbGFzcyJdKXsKKwkJCQl0aGlzWyJjbGFzcyJdID0gImRvam9UYWJMYWJlbHMtIiArIHRoaXMubGFiZWxQb3NpdGlvbiArICh0aGlzLmRvTGF5b3V0ID8gIiIgOiAiIGRvam9UYWJOb0xheW91dCIpOworCQkJfQorCQkJZG9qby53aWRnZXQuVGFiQ29udHJvbGxlci5zdXBlcmNsYXNzLnBvc3RNaXhJblByb3BlcnRpZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0KKyk7CisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVGFiQnV0dG9uIiwgZG9qby53aWRnZXQuUGFnZUJ1dHRvbiwKK3sKKwkvLyBzdW1tYXJ5CisJLy8JQSB0YWIgKHRoZSB0aGluZyB5b3UgY2xpY2sgdG8gc2VsZWN0IGEgcGFuZSkuCisJLy8JQ29udGFpbnMgdGhlIHRpdGxlIChha2EgbGFiZWwpIG9mIHRoZSBwYW5lLCBhbmQgb3B0aW9uYWxseSBhIGNsb3NlLWJ1dHRvbiB0byBkZXN0cm95IHRoZSBwYW5lLgorCS8vCVRoaXMgaXMgYW4gaW50ZXJuYWwgd2lkZ2V0IGFuZCBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KKworCXRlbXBsYXRlU3RyaW5nOiAiPGRpdiBjbGFzcz0nZG9qb1RhYicgZG9qb0F0dGFjaEV2ZW50PSdvbkNsaWNrJz4iCisJCQkJCQkrIjxkaXYgZG9qb0F0dGFjaFBvaW50PSdpbm5lckRpdic+IgorCQkJCQkJCSsiPHNwYW4gZG9qb0F0dGFjaFBvaW50PSd0aXRsZU5vZGUnIHRhYkluZGV4PSctMScgd2FpUm9sZT0ndGFiJz4ke3RoaXMubGFiZWx9PC9zcGFuPiIKKwkJCQkJCQkrIjxzcGFuIGRvam9BdHRhY2hQb2ludD0nY2xvc2VCdXR0b25Ob2RlJyBjbGFzcz0nY2xvc2UgY2xvc2VJbWFnZScgc3R5bGU9JyR7dGhpcy5jbG9zZUJ1dHRvblN0eWxlfSciCisJCQkJCQkJKyIgICAgZG9qb0F0dGFjaEV2ZW50PSdvbk1vdXNlT3ZlcjpvbkNsb3NlQnV0dG9uTW91c2VPdmVyOyBvbk1vdXNlT3V0Om9uQ2xvc2VCdXR0b25Nb3VzZU91dDsgb25DbGljazpvbkNsb3NlQnV0dG9uQ2xpY2snPjwvc3Bhbj4iCisJCQkJCQkrIjwvZGl2PiIKKwkJCQkJKyI8L2Rpdj4iLAorCisJcG9zdE1peEluUHJvcGVydGllczogZnVuY3Rpb24oKXsKKwkJdGhpcy5jbG9zZUJ1dHRvblN0eWxlID0gdGhpcy5jbG9zZUJ1dHRvbiA/ICIiIDogImRpc3BsYXk6IG5vbmUiOworCQlkb2pvLndpZGdldC5UYWJCdXR0b24uc3VwZXJjbGFzcy5wb3N0TWl4SW5Qcm9wZXJ0aWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKworCWZpbGxJblRlbXBsYXRlOiBmdW5jdGlvbigpeworCQlkb2pvLmh0bWwuZGlzYWJsZVNlbGVjdGlvbih0aGlzLnRpdGxlTm9kZSk7CisJCWRvam8ud2lkZ2V0LlRhYkJ1dHRvbi5zdXBlcmNsYXNzLmZpbGxJblRlbXBsYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKwkKKwlvbkNsb3NlQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKC8qRXZlbnQqLyBldnQpeworCQkvLyBzaW5jZSB0aGUgY2xvc2UgYnV0dG9uIGlzIGxvY2F0ZWQgaW5zaWRlIHRoZSBzZWxlY3QgYnV0dG9uLCBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0CisJCS8vIGJ1dHRvbiBkb2Vzbid0IGluYWR2ZXJ0ZW50bHkgZ2V0IGFuIG9uQ2xpY2sgZXZlbnQKKwkJZXZ0LnN0b3BQcm9wYWdhdGlvbigpOworCQlkb2pvLndpZGdldC5UYWJCdXR0b24uc3VwZXJjbGFzcy5vbkNsb3NlQnV0dG9uQ2xpY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9Cit9KTsKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoCisJImRvam8ud2lkZ2V0LmExMXkuVGFiQnV0dG9uIiwKKwlkb2pvLndpZGdldC5UYWJCdXR0b24sCisJeworCQkvLyBzdW1tYXJ5CisJCS8vCVRhYiBmb3IgZGlzcGxheSBpbiBoaWdoLWNvbnRyYXN0IG1vZGUgKHdoZXJlIGJhY2tncm91bmQgaW1hZ2VzIGRvbid0IHNob3cgdXApLgorCQkvLwlUaGlzIGlzIGFuIGludGVybmFsIHdpZGdldCBhbmQgc2hvdWxkbid0IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KKworCQlpbWdQYXRoOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvdGFiX2Nsb3NlLmdpZiIpLAorCQkKKwkJdGVtcGxhdGVTdHJpbmc6ICI8ZGl2IGNsYXNzPSdkb2pvVGFiJyBkb2pvQXR0YWNoRXZlbnQ9J29uQ2xpY2s7b25LZXknPiIKKwkJCQkJCQkrIjxkaXYgZG9qb0F0dGFjaFBvaW50PSdpbm5lckRpdic+IgorCQkJCQkJCQkrIjxzcGFuIGRvam9BdHRhY2hQb2ludD0ndGl0bGVOb2RlJyB0YWJJbmRleD0nLTEnIHdhaVJvbGU9J3RhYic+JHt0aGlzLmxhYmVsfTwvc3Bhbj4iCisJCQkJCQkJCSsiPGltZyBjbGFzcz0nY2xvc2UnIHNyYz0nJHt0aGlzLmltZ1BhdGh9JyBhbHQ9J1t4XScgc3R5bGU9JyR7dGhpcy5jbG9zZUJ1dHRvblN0eWxlfSciCisJCQkJCQkJCSsiICAgIGRvam9BdHRhY2hFdmVudD0nb25DbGljazpvbkNsb3NlQnV0dG9uQ2xpY2snPiIKKwkJCQkJCQkrIjwvZGl2PiIKKwkJCQkJCSsiPC9kaXY+IgorCX0KKyk7CisKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucHJvdmlkZSgic3RydXRzLndpZGdldC5TdHJ1dHNUYWJDb250YWluZXIiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVGFiQ29udGFpbmVyIiwKKyAgZG9qby53aWRnZXQuVGFiQ29udGFpbmVyLCB7CisgIHdpZGdldFR5cGUgOiAiU3RydXRzVGFiQ29udGFpbmVyIiwKKworICBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcyA6ICIiLAorICBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKyAgYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzIDogIiIsCisgIGJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5IDogbnVsbCwKKworICBkaXNhYmxlZFRhYkNzc0NsYXNzIDogInN0cnV0c0Rpc2FibGVkVGFiIiwKKyAgCisgIHBvc3RDcmVhdGUgOiBmdW5jdGlvbigpIHsKKyAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnBvc3RDcmVhdGUuYXBwbHkodGhpcyk7CisgICAgCisgICAgLy9iZWZvcmUgdG9waWNzCisgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3MpKSB7CisgICAgICB0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3Muc3BsaXQoIiwiKTsKKyAgICB9CisgICAgCisgICAgLy9hZnRlciB0b3BpY3MKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayh0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzKSkgeworICAgICAgdGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5ID0gdGhpcy5hZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcy5zcGxpdCgiLCIpOworICAgIH0KKyAgICAKKyAgICAvLyBhZGQgZGlzYWJsZWQgY2xhc3MgdG8gZGlzYWJsZWQgdGFicworICAgIGlmKHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcykgeworICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5jaGlsZHJlbiwgZnVuY3Rpb24oZGl2KXsKKyAgICAgICAgaWYoZGl2LmRpc2FibGVkKSB7CisgICAgICAgICAgdGhpcy5kaXNhYmxlVGFiKGRpdik7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSwKKyAgIAorICBzZWxlY3RDaGlsZDogZnVuY3Rpb24gKHRhYiwgY2FsbGluZ1dpZGdldCkgIHsKKyAgICBpZighdGFiLmRpc2FibGVkKSB7CisgICAgICB2YXIgY2FuY2VsID0geyJjYW5jZWwiIDogZmFsc2V9OworICAgICAgCisgICAgICBpZih0aGlzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgZG9qby5sYW5nLmZvckVhY2godGhpcy5iZWZvcmVTZWxlY3RUYWJOb3RpZnlUb3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBjYW5jZWwsIHRhYiwgc2VsZik7CisgICAgICAgICAgfSBjYXRjaChleCl7CisgICAgICAgICAgICBkb2pvLmRlYnVnKGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOyAgIAorICAgICAgfQorICAgICAgCisgICAgICBpZighY2FuY2VsLmNhbmNlbCkgeworICAgICAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RhYkNvbnRhaW5lci5zdXBlcmNsYXNzLnNlbGVjdENoaWxkLmFwcGx5KHRoaXMsIFt0YWIsIGNhbGxpbmdXaWRnZXRdKTsKKyAgICAgICAgCisgICAgICAgIGlmKHRoaXMuYWZ0ZXJTZWxlY3RUYWJOb3RpZnlUb3BpY3NBcnJheSkgeworICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgICBkb2pvLmxhbmcuZm9yRWFjaCh0aGlzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzQXJyYXksIGZ1bmN0aW9uKHRvcGljKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godG9waWMsIHRhYiwgc2VsZik7CisgICAgICAgICAgICB9IGNhdGNoKGV4KXsKKyAgICAgICAgICAgICAgZG9qby5kZWJ1ZyhleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7ICAgCisgICAgICAgIH0KKyAgICAgIH0gCisgICAgfSAKKyAgfSwKKyAgCisgIGRpc2FibGVUYWIgOiBmdW5jdGlvbih0KSB7CisgICAgdmFyIHRhYldpZGdldCA9IHRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworICAgIHRhYldpZGdldC5kaXNhYmxlZCA9IHRydWU7CisgICAgZG9qby5odG1sLmFkZENsYXNzKHRhYldpZGdldC5jb250cm9sQnV0dG9uLmRvbU5vZGUsIHRoaXMuZGlzYWJsZWRUYWJDc3NDbGFzcyk7CisgIH0sCisgIAorICBlbmFibGVUYWIgOiBmdW5jdGlvbih0KSB7CisgICAgdmFyIHRhYldpZGdldCA9IHRoaXMuZ2V0VGFiV2lkZ2V0KHQpOworICAgIHRhYldpZGdldC5kaXNhYmxlZCA9IGZhbHNlOworICAgIGRvam8uaHRtbC5yZW1vdmVDbGFzcyh0YWJXaWRnZXQuY29udHJvbEJ1dHRvbi5kb21Ob2RlLCB0aGlzLmRpc2FibGVkVGFiQ3NzQ2xhc3MpOworICB9LAorICAKKyAgZ2V0VGFiV2lkZ2V0IDogZnVuY3Rpb24odCkgeworICAgIGlmKGRvam8ubGFuZy5pc051bWJlcih0KSkgeworICAgICAgLy90YWIgaW5kZXgKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW3RdOworICAgIH0gZWxzZSBpZihkb2pvLmxhbmcuaXNTdHJpbmcodCkpIHsKKyAgICAgIC8vdGFiIGlkCisgICAgICByZXR1cm4gZG9qby53aWRnZXQuYnlJZCh0KTsKKyAgICB9IGVsc2UgeworICAgICAgLy90YWIgd2lkZ2V0PworICAgICAgcmV0dXJuIHQ7CisgICAgfQorICB9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlTm9kZSIpOworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZU5vZGUiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCBmdW5jdGlvbigpIHsKKwl0aGlzLmFjdGlvbnNEaXNhYmxlZCA9IFtdOworfSwKK3sKKwl3aWRnZXRUeXBlOiAiVHJlZU5vZGUiLAorCisJbG9hZFN0YXRlczogeworCQlVTkNIRUNLRUQ6ICJVTkNIRUNLRUQiLAorICAgIAlMT0FESU5HOiAiTE9BRElORyIsCisgICAgCUxPQURFRDogIkxPQURFRCIKKwl9LAorCisKKwlhY3Rpb25zOiB7CisJCU1PVkU6ICJNT1ZFIiwKKyAgICAJUkVNT1ZFOiAiUkVNT1ZFIiwKKyAgICAJRURJVDogIkVESVQiLAorICAgIAlBRERDSElMRDogIkFERENISUxEIgorCX0sCisKKwlpc0NvbnRhaW5lcjogdHJ1ZSwKKworCWxvY2tMZXZlbDogMCwgLy8gbG9jayArKyB1bmxvY2sgLS0sIHNvIG5lc3RlZCBsb2NraW5nIHdvcmtzIGZpbmUKKworCisJdGVtcGxhdGVTdHJpbmc6ICgnPGRpdiBjbGFzcz0iZG9qb1RyZWVOb2RlIj4gJworCQkrICc8c3BhbiB0cmVlTm9kZT0iJHt0aGlzLndpZGdldElkfSIgY2xhc3M9ImRvam9UcmVlTm9kZUxhYmVsIiBkb2pvQXR0YWNoUG9pbnQ9ImxhYmVsTm9kZSI+ICcKKwkJKyAnCQk8c3BhbiBkb2pvQXR0YWNoUG9pbnQ9InRpdGxlTm9kZSIgZG9qb0F0dGFjaEV2ZW50PSJvbkNsaWNrOiBvblRpdGxlQ2xpY2siIGNsYXNzPSJkb2pvVHJlZU5vZGVMYWJlbFRpdGxlIj4ke3RoaXMudGl0bGV9PC9zcGFuPiAnCisJCSsgJzwvc3Bhbj4gJworCQkrICc8c3BhbiBjbGFzcz0iZG9qb1RyZWVOb2RlQWZ0ZXJMYWJlbCIgZG9qb0F0dGFjaFBvaW50PSJhZnRlckxhYmVsTm9kZSI+JHt0aGlzLmFmdGVyTGFiZWx9PC9zcGFuPiAnCisJCSsgJzxkaXYgZG9qb0F0dGFjaFBvaW50PSJjb250YWluZXJOb2RlIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4gJworCQkrICc8L2Rpdj4nKS5yZXBsYWNlKC8oPnw8KVxzKy9nLCAnJDEnKSwgLy8gc3RyaXAgd2hpdGVzcGFjZXMgYmV0d2VlbiBub2RlcworCisKKwljaGlsZEljb25TcmM6ICIiLAorCWNoaWxkSWNvbkZvbGRlclNyYzogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvY2xvc2VkLmdpZiIpLCAvLyBmb3IgdW5kZXIgcm9vdCBwYXJlbnQgaXRlbSBjaGlsZCBpY29uLAorCWNoaWxkSWNvbkRvY3VtZW50U3JjOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS9kb2N1bWVudC5naWYiKSwgLy8gZm9yIHVuZGVyIHJvb3QgcGFyZW50IGl0ZW0gY2hpbGQgaWNvbiwKKworCWNoaWxkSWNvbjogbnVsbCwKKwlpc1RyZWVOb2RlOiB0cnVlLAorCisJb2JqZWN0SWQ6ICIiLCAvLyB0aGUgd2lkZ2V0IHJlcHJlc2VudHMgYW4gb2JqZWN0CisKKwlhZnRlckxhYmVsOiAiIiwKKwlhZnRlckxhYmVsTm9kZTogbnVsbCwgLy8gbm9kZSB0byB0aGUgbGVmdCBvZiBsYWJlbE5vZGUKKworCS8vIGFuIGljb24gbGVmdCBmcm9tIGNoaWxkSWNvbjogaW1nc1stMl0uCisJLy8gaWYgKy8tIGZvciBmb2xkZXJzLCBibGFuayBmb3IgbGVhdmVzCisJZXhwYW5kSWNvbjogbnVsbCwKKworCXRpdGxlOiAiIiwKKwlvYmplY3Q6ICIiLCAvLyBub2RlIG1heSBoYXZlIG9iamVjdCBhdHRhY2hlZCwgc2V0dGFibGUgZnJvbSBIVE1MCisJaXNGb2xkZXI6IGZhbHNlLAorCisJbGFiZWxOb2RlOiBudWxsLCAvLyB0aGUgaXRlbSBsYWJlbAorCXRpdGxlTm9kZTogbnVsbCwgLy8gdGhlIGl0ZW0gdGl0bGUKKwlpbWdzOiBudWxsLCAvLyBhbiBhcnJheSBvZiBpY29ucyBpbWdzCisKKwlleHBhbmRMZXZlbDogIiIsIC8vIGV4cGFuZCB0byBsZXZlbAorCisJdHJlZTogbnVsbCwKKworCWRlcHRoOiAwLAorCisJaXNFeHBhbmRlZDogZmFsc2UsCisKKwlzdGF0ZTogbnVsbCwgIC8vIGFmdGVyIGNyZWF0aW9uIHdpbGwgY2hhbmdlIHRvIGxvYWRTdGF0ZXM6ICJsb2FkZWQvbG9hZGluZy91bmNoZWNrZWQiCisJZG9tTm9kZUluaXRpYWxpemVkOiBmYWxzZSwgIC8vIGRvbW5vZGUgaXMgaW5pdGlhbGl6ZWQgd2l0aCBpY29ucyBldGMKKworCisJaXNGaXJzdENoaWxkOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50SW5kZXgoKSA9PSAwID8gdHJ1ZTogZmFsc2U7CisJfSwKKworCWlzTGFzdENoaWxkOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50SW5kZXgoKSA9PSB0aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGgtMSA/IHRydWUgOiBmYWxzZTsKKwl9LAorCisJbG9jazogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMudHJlZS5sb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSwKKwl1bmxvY2s6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLnRyZWUudW5sb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSwKKwlpc0xvY2tlZDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMudHJlZS5pc0xvY2tlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0sCisJY2xlYW5Mb2NrOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy50cmVlLmNsZWFuTG9jay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0sCisKKwlhY3Rpb25Jc0Rpc2FibGVkOiBmdW5jdGlvbihhY3Rpb24pIHsKKwkJdmFyIF90aGlzID0gdGhpczsKKworCQl2YXIgZGlzYWJsZWQgPSBmYWxzZTsKKworCQlpZiAodGhpcy50cmVlLnN0cmljdEZvbGRlcnMgJiYgYWN0aW9uID09IHRoaXMuYWN0aW9ucy5BRERDSElMRCAmJiAhdGhpcy5pc0ZvbGRlcikgeworCQkJZGlzYWJsZWQgPSB0cnVlOworCQl9CisKKwkJaWYgKGRvam8ubGFuZy5pbkFycmF5KF90aGlzLmFjdGlvbnNEaXNhYmxlZCwgYWN0aW9uKSkgeworCQkJZGlzYWJsZWQgPSB0cnVlOworCQl9CisKKwkJaWYgKHRoaXMuaXNMb2NrZWQoKSkgeworCQkJZGlzYWJsZWQgPSB0cnVlOworCQl9CisKKwkJcmV0dXJuIGRpc2FibGVkOworCX0sCisKKwlnZXRJbmZvOiBmdW5jdGlvbigpIHsKKwkJLy8gTm8gdGl0bGUgaGVyZSAodGl0bGUgbWF5IGJlIHdpZGdldCkKKwkJdmFyIGluZm8gPSB7CisJCQl3aWRnZXRJZDogdGhpcy53aWRnZXRJZCwKKwkJCW9iamVjdElkOiB0aGlzLm9iamVjdElkLAorCQkJaW5kZXg6IHRoaXMuZ2V0UGFyZW50SW5kZXgoKSwKKwkJCWlzRm9sZGVyOiB0aGlzLmlzRm9sZGVyCisJCX0KKworCQlyZXR1cm4gaW5mbzsKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXJncywgZnJhZyl7CisKKwkJLy9kb2pvLmRlYnVnKHRoaXMudGl0bGUpCisKKwkJdGhpcy5zdGF0ZSA9IHRoaXMubG9hZFN0YXRlcy5VTkNIRUNLRUQ7CisKKwkJZm9yKHZhciBpPTA7IGk8dGhpcy5hY3Rpb25zRGlzYWJsZWQubGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMuYWN0aW9uc0Rpc2FibGVkW2ldID0gdGhpcy5hY3Rpb25zRGlzYWJsZWRbaV0udG9VcHBlckNhc2UoKTsKKwkJfQorCisJCXRoaXMuZXhwYW5kTGV2ZWwgPSBwYXJzZUludCh0aGlzLmV4cGFuZExldmVsKTsKKworCX0sCisKKworCS8qKgorCSAqIENoYW5nZSB2aXNpYmxlIG5vZGUgZGVwdGggYnkgYXBwZW5kaW5nL3ByZXBlbmRpbmcgd2l0aCBibGFua0ltZ3MKKwkgKiBAcGFyYW0gZGVwdGhEaWZmIEludGVnZXIgcG9zaXRpdmUgPT4gbW92ZSByaWdodCwgbmVnYXRpdmUgPT4gbW92ZSBsZWZ0CisJKi8KKwlhZGp1c3REZXB0aDogZnVuY3Rpb24oZGVwdGhEaWZmKSB7CisKKwkJZm9yKHZhciBpPTA7IGk8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJdGhpcy5jaGlsZHJlbltpXS5hZGp1c3REZXB0aChkZXB0aERpZmYpOworCQl9CisKKwkJdGhpcy5kZXB0aCArPSBkZXB0aERpZmY7CisKKwkJaWYgKGRlcHRoRGlmZj4wKSB7CisJCQlmb3IodmFyIGk9MDsgaTxkZXB0aERpZmY7IGkrKykgeworCQkJCXZhciBpbWcgPSB0aGlzLnRyZWUubWFrZUJsYW5rSW1nKCk7CisJCQkJdGhpcy5pbWdzLnVuc2hpZnQoaW1nKTsKKwkJCQkvL2Rvam8uZGVidWdTaGFsbG93KHRoaXMuZG9tTm9kZSk7CisJCQkJZG9qby5odG1sLmluc2VydEJlZm9yZSh0aGlzLmltZ3NbMF0sIHRoaXMuZG9tTm9kZS5maXJzdENoaWxkKTsKKworCQkJfQorCQl9CisJCWlmIChkZXB0aERpZmY8MCkgeworCQkJZm9yKHZhciBpPTA7IGk8LWRlcHRoRGlmZjtpKyspIHsKKwkJCQl0aGlzLmltZ3Muc2hpZnQoKTsKKwkJCQlkb2pvLmh0bWwucmVtb3ZlTm9kZSh0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7CisJCQl9CisJCX0KKworCX0sCisKKworCW1hcmtMb2FkaW5nOiBmdW5jdGlvbigpIHsKKwkJdGhpcy5fbWFya0xvYWRpbmdTYXZlZEljb24gPSB0aGlzLmV4cGFuZEljb24uc3JjOworCQl0aGlzLmV4cGFuZEljb24uc3JjID0gdGhpcy50cmVlLmV4cGFuZEljb25TcmNMb2FkaW5nOworCX0sCisKKwkvLyBpZiBpY29uIGlzICJMb2FkaW5nIiB0aGVuCisJdW5NYXJrTG9hZGluZzogZnVuY3Rpb24oKSB7CisJCWlmICghdGhpcy5fbWFya0xvYWRpbmdTYXZlZEljb24pIHJldHVybjsKKworCQl2YXIgaW0gPSBuZXcgSW1hZ2UoKTsKKwkJaW0uc3JjID0gdGhpcy50cmVlLmV4cGFuZEljb25TcmNMb2FkaW5nOworCisJCS8vZG9qby5kZWJ1ZygiVW5tYXJrICIrdGhpcy5leHBhbmRJY29uLnNyYysiIDogIitpbS5zcmMpOworCQlpZiAodGhpcy5leHBhbmRJY29uLnNyYyA9PSBpbS5zcmMpIHsKKwkJCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLl9tYXJrTG9hZGluZ1NhdmVkSWNvbjsKKwkJfQorCQl0aGlzLl9tYXJrTG9hZGluZ1NhdmVkSWNvbiA9IG51bGw7CisJfSwKKworCisJc2V0Rm9sZGVyOiBmdW5jdGlvbigpIHsKKwkJZG9qby5ldmVudC5jb25uZWN0KHRoaXMuZXhwYW5kSWNvbiwgJ29uY2xpY2snLCB0aGlzLCAnb25UcmVlQ2xpY2snKTsKKwkJdGhpcy5leHBhbmRJY29uLnNyYyA9IHRoaXMuaXNFeHBhbmRlZCA/IHRoaXMudHJlZS5leHBhbmRJY29uU3JjTWludXMgOiB0aGlzLnRyZWUuZXhwYW5kSWNvblNyY1BsdXM7CisJCXRoaXMuaXNGb2xkZXIgPSB0cnVlOworCX0sCisKKworCWNyZWF0ZURPTU5vZGU6IGZ1bmN0aW9uKHRyZWUsIGRlcHRoKXsKKworCQl0aGlzLnRyZWUgPSB0cmVlOworCQl0aGlzLmRlcHRoID0gZGVwdGg7CisKKworCQkvLworCQkvLyBhZGQgdGhlIHRyZWUgaWNvbnMKKwkJLy8KKworCQl0aGlzLmltZ3MgPSBbXTsKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmRlcHRoKzE7IGkrKyl7CisKKwkJCXZhciBpbWcgPSB0aGlzLnRyZWUubWFrZUJsYW5rSW1nKCk7CisKKwkJCXRoaXMuZG9tTm9kZS5pbnNlcnRCZWZvcmUoaW1nLCB0aGlzLmxhYmVsTm9kZSk7CisKKwkJCXRoaXMuaW1ncy5wdXNoKGltZyk7CisJCX0KKworCisJCXRoaXMuZXhwYW5kSWNvbiA9IHRoaXMuaW1nc1t0aGlzLmltZ3MubGVuZ3RoLTFdOworCisKKwkJdGhpcy5jaGlsZEljb24gPSB0aGlzLnRyZWUubWFrZUJsYW5rSW1nKCk7CisKKwkJLy8gYWRkIHRvIGltYWdlcyBiZWZvcmUgdGhlIHRpdGxlCisJCXRoaXMuaW1ncy5wdXNoKHRoaXMuY2hpbGRJY29uKTsKKworCQlkb2pvLmh0bWwuaW5zZXJ0QmVmb3JlKHRoaXMuY2hpbGRJY29uLCB0aGlzLnRpdGxlTm9kZSk7CisKKwkJLy8gbm9kZSB3aXRoIGNoaWxkcmVuKGZyb20gc291cmNlIGh0bWwpIGJlY29tZXMgZm9sZGVyIG9uIGJ1aWxkIHN0YWdlLgorCQlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggfHwgdGhpcy5pc0ZvbGRlcikgeworCQkJdGhpcy5zZXRGb2xkZXIoKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGxlYXZlcyBhcmUgYWx3YXlzIGxvYWRlZAorCQkJLy9kb2pvLmRlYnVnKCJTZXQgIit0aGlzKyIgc3RhdGUgdG8gbG9hZGVkIik7CisJCQl0aGlzLnN0YXRlID0gdGhpcy5sb2FkU3RhdGVzLkxPQURFRDsKKwkJfQorCisJCWRvam8uZXZlbnQuY29ubmVjdCh0aGlzLmNoaWxkSWNvbiwgJ29uY2xpY2snLCB0aGlzLCAnb25JY29uQ2xpY2snKTsKKworCisJCS8vCisJCS8vIGNyZWF0ZSB0aGUgY2hpbGQgcm93cworCQkvLworCisKKwkJZm9yKHZhciBpPTA7IGk8dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7CisJCQl0aGlzLmNoaWxkcmVuW2ldLnBhcmVudCA9IHRoaXM7CisKKwkJCXZhciBub2RlID0gdGhpcy5jaGlsZHJlbltpXS5jcmVhdGVET01Ob2RlKHRoaXMudHJlZSwgdGhpcy5kZXB0aCsxKTsKKworCQkJdGhpcy5jb250YWluZXJOb2RlLmFwcGVuZENoaWxkKG5vZGUpOworCQl9CisKKworCQlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsKKwkJCXRoaXMuc3RhdGUgPSB0aGlzLmxvYWRTdGF0ZXMuTE9BREVEOworCQl9CisKKwkJdGhpcy51cGRhdGVJY29ucygpOworCisJCXRoaXMuZG9tTm9kZUluaXRpYWxpemVkID0gdHJ1ZTsKKworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSwgeyBzb3VyY2U6IHRoaXMgfSApOworCisJCXJldHVybiB0aGlzLmRvbU5vZGU7CisJfSwKKworCW9uVHJlZUNsaWNrOiBmdW5jdGlvbihlKXsKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnRyZWVDbGljaywgeyBzb3VyY2U6IHRoaXMsIGV2ZW50OiBlIH0pOworCX0sCisKKwlvbkljb25DbGljazogZnVuY3Rpb24oZSl7CisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5pY29uQ2xpY2ssIHsgc291cmNlOiB0aGlzLCBldmVudDogZSB9KTsKKwl9LAorCisJb25UaXRsZUNsaWNrOiBmdW5jdGlvbihlKXsKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnRpdGxlQ2xpY2ssIHsgc291cmNlOiB0aGlzLCBldmVudDogZSB9KTsKKwl9LAorCisJbWFya1NlbGVjdGVkOiBmdW5jdGlvbigpIHsKKwkJZG9qby5odG1sLmFkZENsYXNzKHRoaXMudGl0bGVOb2RlLCAnZG9qb1RyZWVOb2RlTGFiZWxTZWxlY3RlZCcpOworCX0sCisKKworCXVuTWFya1NlbGVjdGVkOiBmdW5jdGlvbigpIHsKKwkJLy9kb2pvLmRlYnVnKCd1bm1hcmsnKQorCQlkb2pvLmh0bWwucmVtb3ZlQ2xhc3ModGhpcy50aXRsZU5vZGUsICdkb2pvVHJlZU5vZGVMYWJlbFNlbGVjdGVkJyk7CisJfSwKKworCXVwZGF0ZUV4cGFuZEljb246IGZ1bmN0aW9uKCkgeworCQlpZiAodGhpcy5pc0ZvbGRlcil7CisJCQl0aGlzLmV4cGFuZEljb24uc3JjID0gdGhpcy5pc0V4cGFuZGVkID8gdGhpcy50cmVlLmV4cGFuZEljb25TcmNNaW51cyA6IHRoaXMudHJlZS5leHBhbmRJY29uU3JjUGx1czsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuZXhwYW5kSWNvbi5zcmMgPSB0aGlzLnRyZWUuYmxhbmtJY29uU3JjOworCQl9CisJfSwKKworCS8qIHNldCB0aGUgZ3JpZCB1bmRlciB0aGUgZXhwYW5kIGljb24gKi8KKwl1cGRhdGVFeHBhbmRHcmlkOiBmdW5jdGlvbigpIHsKKworCQlpZiAodGhpcy50cmVlLnNob3dHcmlkKXsKKwkJCWlmICh0aGlzLmRlcHRoKXsKKwkJCQl0aGlzLnNldEdyaWRJbWFnZSgtMiwgdGhpcy5pc0xhc3RDaGlsZCgpID8gdGhpcy50cmVlLmdyaWRJY29uU3JjTCA6IHRoaXMudHJlZS5ncmlkSWNvblNyY1QpOworCQkJfWVsc2V7CisJCQkJaWYgKHRoaXMuaXNGaXJzdENoaWxkKCkpeworCQkJCQl0aGlzLnNldEdyaWRJbWFnZSgtMiwgdGhpcy5pc0xhc3RDaGlsZCgpID8gdGhpcy50cmVlLmdyaWRJY29uU3JjWCA6IHRoaXMudHJlZS5ncmlkSWNvblNyY1kpOworCQkJCX1lbHNleworCQkJCQl0aGlzLnNldEdyaWRJbWFnZSgtMiwgdGhpcy5pc0xhc3RDaGlsZCgpID8gdGhpcy50cmVlLmdyaWRJY29uU3JjTCA6IHRoaXMudHJlZS5ncmlkSWNvblNyY1QpOworCQkJCX0KKwkJCX0KKwkJfWVsc2V7CisJCQl0aGlzLnNldEdyaWRJbWFnZSgtMiwgdGhpcy50cmVlLmJsYW5rSWNvblNyYyk7CisJCX0KKworCX0sCisKKwkvKiBzZXQgdGhlIGdyaWQgdW5kZXIgdGhlIGNoaWxkIGljb24gKi8KKwl1cGRhdGVDaGlsZEdyaWQ6IGZ1bmN0aW9uKCkgeworCisJCWlmICgodGhpcy5kZXB0aCB8fCB0aGlzLnRyZWUuc2hvd1Jvb3RHcmlkKSAmJiB0aGlzLnRyZWUuc2hvd0dyaWQpeworCQkJdGhpcy5zZXRHcmlkSW1hZ2UoLTEsICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiB0aGlzLmlzRXhwYW5kZWQpID8gdGhpcy50cmVlLmdyaWRJY29uU3JjUCA6IHRoaXMudHJlZS5ncmlkSWNvblNyY0MpOworCQl9ZWxzZXsKKwkJCWlmICh0aGlzLnRyZWUuc2hvd0dyaWQgJiYgIXRoaXMudHJlZS5zaG93Um9vdEdyaWQpeworCQkJCXRoaXMuc2V0R3JpZEltYWdlKC0xLCAodGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgdGhpcy5pc0V4cGFuZGVkKSA/IHRoaXMudHJlZS5ncmlkSWNvblNyY1ogOiB0aGlzLnRyZWUuYmxhbmtJY29uU3JjKTsKKwkJCX1lbHNleworCQkJCXRoaXMuc2V0R3JpZEltYWdlKC0xLCB0aGlzLnRyZWUuYmxhbmtJY29uU3JjKTsKKwkJCX0KKwkJfQorCisKKwl9LAorCisJdXBkYXRlUGFyZW50R3JpZDogZnVuY3Rpb24oKSB7CisJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKKworCQkvL2Rvam8uZGVidWcoInVwZGF0ZVBhcmVudEdyaWQgIit0aGlzKTsKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmRlcHRoOyBpKyspeworCisJCQkvL2Rvam8uZGVidWcoIlBhcmVudCAiK3BhcmVudCk7CisKKwkJCXZhciBpZHggPSB0aGlzLmltZ3MubGVuZ3RoLSgzK2kpOworCQkJdmFyIGltZyA9ICh0aGlzLnRyZWUuc2hvd0dyaWQgJiYgIXBhcmVudC5pc0xhc3RDaGlsZCgpKSA/IHRoaXMudHJlZS5ncmlkSWNvblNyY1YgOiB0aGlzLnRyZWUuYmxhbmtJY29uU3JjOworCisJCQkvL2Rvam8uZGVidWcoIkltYWdlICIraW1nKyIgZm9yICIraWR4KTsKKworCQkJdGhpcy5zZXRHcmlkSW1hZ2UoaWR4LCBpbWcpOworCisJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50OworCQl9CisJfSwKKworCXVwZGF0ZUV4cGFuZEdyaWRDb2x1bW46IGZ1bmN0aW9uKCkgeworCQlpZiAoIXRoaXMudHJlZS5zaG93R3JpZCkgcmV0dXJuOworCisJCXZhciBfdGhpcyA9IHRoaXM7CisKKwkJdmFyIGljb24gPSB0aGlzLmlzTGFzdENoaWxkKCkgPyB0aGlzLnRyZWUuYmxhbmtJY29uU3JjIDogdGhpcy50cmVlLmdyaWRJY29uU3JjVjsKKworCQlkb2pvLmxhbmcuZm9yRWFjaChfdGhpcy5nZXREZXNjZW5kYW50cygpLAorCQkJZnVuY3Rpb24obm9kZSkgeyBub2RlLnNldEdyaWRJbWFnZShfdGhpcy5kZXB0aCwgaWNvbik7IH0KKwkJKTsKKworCQl0aGlzLnVwZGF0ZUV4cGFuZEdyaWQoKTsKKwl9LAorCisJdXBkYXRlSWNvbnM6IGZ1bmN0aW9uKCl7CisKKworCQkvL2Rvam8ucHJvZmlsZS5zdGFydCgidXBkYXRlSWNvbnMiKQorCisJCS8vZG9qby5kZWJ1ZygiVXBkYXRlIGljb25zIGZvciAiK3RoaXMpCisJCS8vZG9qby5kZWJ1Zyh0aGlzLmlzRm9sZGVyKQorCisJCXRoaXMuaW1nc1swXS5zdHlsZS5kaXNwbGF5ID0gdGhpcy50cmVlLnNob3dSb290R3JpZCA/ICdpbmxpbmUnIDogJ25vbmUnOworCisKKwkJLy8KKwkJLy8gc2V0IHRoZSBleHBhbmQgaWNvbgorCQkvLworCisKKwkJLy8KKwkJLy8gc2V0IHRoZSBjaGlsZCBpY29uCisJCS8vCisJCXRoaXMuYnVpbGRDaGlsZEljb24oKTsKKworCQl0aGlzLnVwZGF0ZUV4cGFuZEdyaWQoKTsKKwkJdGhpcy51cGRhdGVDaGlsZEdyaWQoKTsKKwkJdGhpcy51cGRhdGVQYXJlbnRHcmlkKCk7CisKKworCisJCWRvam8ucHJvZmlsZS5zdG9wKCJ1cGRhdGVJY29ucyIpCisKKwl9LAorCisJYnVpbGRDaGlsZEljb246IGZ1bmN0aW9uKCkgeworCQkvLyBJRSAob3RoZXJzPykgdHJpZXMgdG8gZG93bmxvYWQgd2hhdGV2ZXIgaXMgb24gc3JjIGF0dHJpYnV0ZSBzbyBzZXR0aW5nICJ1cmwoKSIgbGlrZSBiZWZvcmUgaXNudCBhIGdvb2QgaWRlYQorCQkvLyBPbmx5IHJlc3VsdHMgaW4gYSA0MDQKKwkJaWYodGhpcy5jaGlsZEljb25TcmMpeworCQkJdGhpcy5jaGlsZEljb24uc3JjID0gdGhpcy5jaGlsZEljb25TcmM7CisJCX0KKwkJdGhpcy5jaGlsZEljb24uc3R5bGUuZGlzcGxheSA9IHRoaXMuY2hpbGRJY29uU3JjID8gJ2lubGluZScgOiAnbm9uZSc7CisJfSwKKworCXNldEdyaWRJbWFnZTogZnVuY3Rpb24oaWR4LCBzcmMpeworCisJCWlmIChpZHggPCAwKXsKKwkJCWlkeCA9IHRoaXMuaW1ncy5sZW5ndGggKyBpZHg7CisJCX0KKworCQkvL2lmIChpZHggPj0gdGhpcy5pbWdzLmxlbmd0aC0yKSByZXR1cm47CisJCXRoaXMuaW1nc1tpZHhdLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJyArIHNyYyArICcpJzsKKwl9LAorCisKKwl1cGRhdGVJY29uVHJlZTogZnVuY3Rpb24oKXsKKwkJdGhpcy50cmVlLnVwZGF0ZUljb25UcmVlLmNhbGwodGhpcyk7CisJfSwKKworCisKKworCWV4cGFuZDogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuaXNFeHBhbmRlZCkgcmV0dXJuOworCisJCWlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkgeworCQkJdGhpcy5zaG93Q2hpbGRyZW4oKTsKKwkJfQorCisJCXRoaXMuaXNFeHBhbmRlZCA9IHRydWU7CisKKwkJdGhpcy51cGRhdGVFeHBhbmRJY29uKCk7CisKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmV4cGFuZCwge3NvdXJjZTogdGhpc30gKTsKKwl9LAorCisJY29sbGFwc2U6IGZ1bmN0aW9uKCl7CisJCWlmICghdGhpcy5pc0V4cGFuZGVkKSByZXR1cm47CisKKwkJdGhpcy5oaWRlQ2hpbGRyZW4oKTsKKwkJdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7CisKKwkJdGhpcy51cGRhdGVFeHBhbmRJY29uKCk7CisKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLmNvbGxhcHNlLCB7c291cmNlOiB0aGlzfSApOworCX0sCisKKwloaWRlQ2hpbGRyZW46IGZ1bmN0aW9uKCl7CisJCXRoaXMudHJlZS50b2dnbGVPYmouaGlkZSgKKwkJCXRoaXMuY29udGFpbmVyTm9kZSwgdGhpcy50b2dnbGVEdXJhdGlvbiwgdGhpcy5leHBsb2RlU3JjLCBkb2pvLmxhbmcuaGl0Y2godGhpcywgIm9uSGlkZSIpCisJCSk7CisKKwkJLyogaWYgZG5kIGlzIGluIGFjdGlvbiwgcmVjYWxjdWxhdGUgY2hhbmdlZCBjb29yZGluYXRlcyAqLworCQlpZihkb2pvLmV4aXN0cyhkb2pvLCAnZG5kLmRyYWdNYW5hZ2VyLmRyYWdPYmplY3RzJykgJiYgZG9qby5kbmQuZHJhZ01hbmFnZXIuZHJhZ09iamVjdHMubGVuZ3RoKSB7CisJCQlkb2pvLmRuZC5kcmFnTWFuYWdlci5jYWNoZVRhcmdldExvY2F0aW9ucygpOworCQl9CisJfSwKKworCXNob3dDaGlsZHJlbjogZnVuY3Rpb24oKXsKKwkJdGhpcy50cmVlLnRvZ2dsZU9iai5zaG93KAorCQkJdGhpcy5jb250YWluZXJOb2RlLCB0aGlzLnRvZ2dsZUR1cmF0aW9uLCB0aGlzLmV4cGxvZGVTcmMsIGRvam8ubGFuZy5oaXRjaCh0aGlzLCAib25TaG93IikKKwkJKTsKKworCQkvKiBpZiBkbmQgaXMgaW4gYWN0aW9uLCByZWNhbGN1bGF0ZSBjaGFuZ2VkIGNvb3JkaW5hdGVzICovCisJCWlmKGRvam8uZXhpc3RzKGRvam8sICdkbmQuZHJhZ01hbmFnZXIuZHJhZ09iamVjdHMnKSAmJiBkb2pvLmRuZC5kcmFnTWFuYWdlci5kcmFnT2JqZWN0cy5sZW5ndGgpIHsKKwkJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLmNhY2hlVGFyZ2V0TG9jYXRpb25zKCk7CisJCX0KKwl9LAorCisJYWRkQ2hpbGQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnRyZWUuYWRkQ2hpbGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LAorCisJZG9BZGRDaGlsZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMudHJlZS5kb0FkZENoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKworCisKKwkvKiBFZGl0IGN1cnJlbnQgbm9kZSA6IGNoYW5nZSBwcm9wZXJ0aWVzIGFuZCB1cGRhdGUgY29udGVudHMgKi8KKwllZGl0OiBmdW5jdGlvbihwcm9wcykgeworCQlkb2pvLmxhbmcubWl4aW4odGhpcywgcHJvcHMpOworCQlpZiAocHJvcHMudGl0bGUpIHsKKwkJCXRoaXMudGl0bGVOb2RlLmlubmVySFRNTCA9IHRoaXMudGl0bGU7CisJCX0KKworCQlpZiAocHJvcHMuYWZ0ZXJMYWJlbCkgeworCQkJdGhpcy5hZnRlckxhYmVsTm9kZS5pbm5lckhUTUwgPSB0aGlzLmFmdGVyTGFiZWw7CisJCX0KKworCQlpZiAocHJvcHMuY2hpbGRJY29uU3JjKSB7CisJCQl0aGlzLmJ1aWxkQ2hpbGRJY29uKCk7CisJCX0KKworCisJfSwKKworCisJcmVtb3ZlTm9kZTogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMudHJlZS5yZW1vdmVOb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSwKKwlkb1JlbW92ZU5vZGU6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLnRyZWUuZG9SZW1vdmVOb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfSwKKworCisJdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gIlsiK3RoaXMud2lkZ2V0VHlwZSsiIFRyZWU6Iit0aGlzLnRyZWUrIiBJRDoiK3RoaXMud2lkZ2V0SWQrIiBUaXRsZToiK3RoaXMudGl0bGUrIl0iOworCisJfQorCit9KTsKKworCisKKworCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitkb2pvLnByb3ZpZGUoInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUiLAorICBkb2pvLndpZGdldC5UcmVlTm9kZSwgeworICB3aWRnZXRUeXBlIDogIlN0cnV0c1RyZWVOb2RlIiwKKyAgCisgIGxvYWRlZCA6IGZhbHNlLAorICAKKyAgZXhwYW5kIDogZnVuY3Rpb24oKSB7CisgICAgaWYoIXRoaXMubG9hZGVkKSB7CisgICAgICB0aGlzLnJlbG9hZCgpOworICAgIH0gIAorICAgIHN0cnV0cy53aWRnZXQuU3RydXRzVHJlZU5vZGUuc3VwZXJjbGFzcy5leHBhbmQuYXBwbHkodGhpcyk7CisgIH0sCisgIAorICByZW1vdmVDaGlsZHJlbiA6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICB2YXIgY2hpbGRyZW5Db3B5ID0gZG9qby5sYW5nLnRvQXJyYXkodGhpcy5jaGlsZHJlbik7CisgICAgZG9qby5sYW5nLmZvckVhY2goY2hpbGRyZW5Db3B5LCBmdW5jdGlvbihub2RlKSB7CisgICAgICBzZWxmLnJlbW92ZU5vZGUobm9kZSk7CisgICAgfSk7CisgIH0sCisgIAorICByZWxvYWQgOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaHJlZiA9IHRoaXMudHJlZS5ocmVmOworICAgIHRoaXMubG9hZGVkID0gdHJ1ZTsKKyAgICAKKyAgICBpZighZG9qby5zdHJpbmcuaXNCbGFuayhocmVmKSkgeworICAgICAgLy9jbGVhciBjaGlsZHJlbiBsaXN0CisgICAgICB0aGlzLnJlbW92ZUNoaWxkcmVuKCk7CisgICAgICAvL3Bhc3Mgd2lkZ2V0SWQgYXMgcGFyYW1ldGVyCisgICAgICB2YXIgdG1wSHJlZiA9IGhyZWYgKyAoaHJlZi5pbmRleE9mKCI/IikgPiAtMSA/ICImIiA6ICI/IikgKyAibm9kZUlkPSIgKyB0aGlzLndpZGdldElkOworCisgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICB0aGlzLm1hcmtMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgCisgICAgICBkb2pvLmlvLmJpbmQoeworICAgICAgICB1cmw6IHRtcEhyZWYsCisgICAgICAgIHVzZUNhY2hlOiBmYWxzZSwKKyAgICAgICAgcHJldmVudENhY2hlOiB0cnVlLAorICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBlKSB7CisgICAgICAgICAgaWYodHlwZSA9PSAnbG9hZCcpIHsKKyAgICAgICAgICAgIC8vZGF0YSBzaG91bGQgYmUgYW4gYXJyYXkKKyAgICAgICAgICAgIGlmKGRhdGEpIHsKKyAgICAgICAgICAgICAgZG9qby5sYW5nLmZvckVhY2goZGF0YSwgZnVuY3Rpb24oZGVzY3IpIHsKKyAgICAgICAgICAgICAgICAvL2NyZWF0ZSBub2RlIGZvciBlYWNoZCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoInN0cnV0czpTdHJ1dHNUcmVlTm9kZSIseworICAgICAgICAgICAgICAgICAgdGl0bGUgICA6IGRlc2NyLmxhYmVsLAorICAgICAgICAgICAgICAgICAgaXNGb2xkZXI6IGRlc2NyLmhhc0NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQ6IGRlc2NyLmlkICAgCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc2VsZi5hZGRDaGlsZChuZXdOb2RlKTsKKyAgICAgICAgICAgICAgfSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBzZWxmLnVuTWFya0xvYWRpbmcoKTsgICAgCisgICAgICAgIH0sCisgICAgICAgIG1pbWV0eXBlOiAidGV4dC9qc29uIgorICAgICAgfSk7CisgICAgfQorICB9Cit9KTsKKworZG9qby5wcm92aWRlKCJkb2pvLmpzb24iKTsKKworCisKKworZG9qby5qc29uID0geworCS8vIGpzb25SZWdpc3RyeTogQWRhcHRlclJlZ2lzdHJ5IGEgcmVnaXN0cnkgb2YgdHlwZS1iYXNlZCBzZXJpYWxpemVycworCWpzb25SZWdpc3RyeTogbmV3IGRvam8uQWRhcHRlclJlZ2lzdHJ5KCksCisKKwlyZWdpc3RlcjogZnVuY3Rpb24oCS8qU3RyaW5nKi8JCW5hbWUsIAorCQkJCQkJLypmdW5jdGlvbiovCWNoZWNrLCAKKwkJCQkJCS8qZnVuY3Rpb24qLwl3cmFwLCAKKwkJCQkJCS8qb3B0aW9uYWwsIGJvb2xlYW4qLyBvdmVycmlkZSl7CisJCS8vIHN1bW1hcnk6CisJCS8vCQlSZWdpc3RlciBhIEpTT04gc2VyaWFsaXphdGlvbiBmdW5jdGlvbi4gSlNPTiBzZXJpYWxpemF0aW9uCisJCS8vCQlmdW5jdGlvbnMgc2hvdWxkIHRha2Ugb25lIGFyZ3VtZW50IGFuZCByZXR1cm4gYW4gb2JqZWN0CisJCS8vCQlzdWl0YWJsZSBmb3IgSlNPTiBzZXJpYWxpemF0aW9uOgorCQkvLwkJCS0gc3RyaW5nCisJCS8vCQkJLSBudW1iZXIKKwkJLy8JCQktIGJvb2xlYW4KKwkJLy8JCQktIHVuZGVmaW5lZAorCQkvLwkJCS0gb2JqZWN0CisJCS8vCQkJCS0gbnVsbAorCQkvLwkJCQktIEFycmF5LWxpa2UgKGxlbmd0aCBwcm9wZXJ0eSB0aGF0IGlzIGEgbnVtYmVyKQorCQkvLwkJCQktIE9iamVjdHMgd2l0aCBhICJqc29uIiBtZXRob2Qgd2lsbCBoYXZlIHRoaXMgbWV0aG9kIGNhbGxlZAorCQkvLwkJCQktIEFueSBvdGhlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFzIHtrZXk6dmFsdWUsIC4uLn0gcGFpcnMKKwkJLy8JCQkKKwkJLy8JCUlmIG92ZXJyaWRlIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5IEpTT04KKwkJLy8JCXNlcmlhbGl6YXRpb24sIG90aGVyd2lzZSBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGxvd2VzdC4KKwkJLy8gbmFtZToKKwkJLy8JCWEgZGVzY3JpcHRpdmUgdHlwZSBmb3IgdGhpcyBzZXJpYWxpemVyCisJCS8vIGNoZWNrOgorCQkvLwkJYSB1bmFyeSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIGFuIG9iamVjdCB0byBkZXRlcm1pbmUKKwkJLy8JCXdoZXRoZXIgb3Igbm90IHdyYXAgd2lsbCBiZSB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUgb2JqZWN0CisJCS8vIHdyYXA6CisJCS8vCQl0aGUgc2VyaWFsaXphdGlvbiBmdW5jdGlvbgorCQkvLyBvdmVycmlkZToKKwkJLy8JCW9wdGlvbmFsLCBkZXRlcm1pbmVzIGlmIHRoZSB0aGlzIHNlcmlhbGl6YXRpb24gZnVuY3Rpb24gd2lsbCBiZQorCQkvLwkJZ2l2ZW4gcHJpb3JpdHkgaW4gdGhlIHRlc3Qgb3JkZXIKKworCQlkb2pvLmpzb24uanNvblJlZ2lzdHJ5LnJlZ2lzdGVyKG5hbWUsIGNoZWNrLCB3cmFwLCBvdmVycmlkZSk7CisJfSwKKworCWV2YWxKc29uOiBmdW5jdGlvbigvKlN0cmluZyovIGpzb24peworCQkvLyBzdW1tYXJ5OgorCQkvLyAJCWV2YWx1YXRlcyB0aGUgcGFzc2VkIHN0cmluZy1mb3JtIG9mIGEgSlNPTiBvYmplY3QKKwkJLy8ganNvbjogCisJCS8vCQlhIHN0cmluZyBsaXRlcmFsIG9mIGEgSlNPTiBpdGVtLCBmb3IgaW5zdGFuY2U6CisJCS8vCQkJJ3sgImZvbyI6IFsgImJhciIsIDEsIHsgImJheiI6ICJ0aHVkIiB9IF0gfScKKwkJLy8gcmV0dXJuOgorCQkvLwkJdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbgorCisJCS8vIEZJWE1FOiBzaG91bGQgdGhpcyBhY2NlcHQgbW96aWxsYSdzIG9wdGlvbmFsIHNlY29uZCBhcmc/CisJCXRyeSB7CisJCQlyZXR1cm4gZXZhbCgiKCIgKyBqc29uICsgIikiKTsKKwkJfWNhdGNoKGUpeworCQkJZG9qby5kZWJ1ZyhlKTsKKwkJCXJldHVybiBqc29uOworCQl9CisJfSwKKworCXNlcmlhbGl6ZTogZnVuY3Rpb24oLypPYmplY3QqLyBvKXsKKwkJLy8gc3VtbWFyeToKKwkJLy8JCUNyZWF0ZSBhIEpTT04gc2VyaWFsaXphdGlvbiBvZiBhbiBvYmplY3QsIG5vdGUgdGhhdCB0aGlzCisJCS8vCQlkb2Vzbid0IGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpb24sIHNvIGRvbid0IGRvIHRoYXQhCisJCS8vIG86CisJCS8vCQlhbiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZC4gT2JqZWN0cyBtYXkgZGVmaW5lIHRoZWlyIG93bgorCQkvLwkJc2VyaWFsaXphdGlvbiB2aWEgYSBzcGVjaWFsICJfX2pzb25fXyIgb3IgImpzb24iIGZ1bmN0aW9uCisJCS8vCQlwcm9wZXJ0eS4gSWYgYSBzcGVjaWFsaXplZCBzZXJpYWxpemVyIGhhcyBiZWVuIGRlZmluZWQsIGl0IHdpbGwKKwkJLy8JCWJlIHVzZWQgYXMgYSBmYWxsYmFjay4KKwkJLy8gcmV0dXJuOgorCQkvLwkJYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZAorCQkvLwkJb2JqZWN0CisKKwkJdmFyIG9ianR5cGUgPSB0eXBlb2Yobyk7CisJCWlmKG9ianR5cGUgPT0gInVuZGVmaW5lZCIpeworCQkJcmV0dXJuICJ1bmRlZmluZWQiOworCQl9ZWxzZSBpZigob2JqdHlwZSA9PSAibnVtYmVyIil8fChvYmp0eXBlID09ICJib29sZWFuIikpeworCQkJcmV0dXJuIG8gKyAiIjsKKwkJfWVsc2UgaWYobyA9PT0gbnVsbCl7CisJCQlyZXR1cm4gIm51bGwiOworCQl9CisJCWlmIChvYmp0eXBlID09ICJzdHJpbmciKSB7IHJldHVybiBkb2pvLnN0cmluZy5lc2NhcGVTdHJpbmcobyk7IH0KKwkJLy8gcmVjdXJzZQorCQl2YXIgbWUgPSBhcmd1bWVudHMuY2FsbGVlOworCQkvLyBzaG9ydC1jaXJjdWl0IGZvciBvYmplY3RzIHRoYXQgc3VwcG9ydCAianNvbiIgc2VyaWFsaXphdGlvbgorCQkvLyBpZiB0aGV5IHJldHVybiAic2VsZiIgdGhlbiBqdXN0IHBhc3MtdGhyb3VnaC4uLgorCQl2YXIgbmV3T2JqOworCQlpZih0eXBlb2Yoby5fX2pzb25fXykgPT0gImZ1bmN0aW9uIil7CisJCQluZXdPYmogPSBvLl9fanNvbl9fKCk7CisJCQlpZihvICE9PSBuZXdPYmopeworCQkJCXJldHVybiBtZShuZXdPYmopOworCQkJfQorCQl9CisJCWlmKHR5cGVvZihvLmpzb24pID09ICJmdW5jdGlvbiIpeworCQkJbmV3T2JqID0gby5qc29uKCk7CisJCQlpZiAobyAhPT0gbmV3T2JqKSB7CisJCQkJcmV0dXJuIG1lKG5ld09iaik7CisJCQl9CisJCX0KKwkJLy8gYXJyYXkKKwkJaWYob2JqdHlwZSAhPSAiZnVuY3Rpb24iICYmIHR5cGVvZihvLmxlbmd0aCkgPT0gIm51bWJlciIpeworCQkJdmFyIHJlcyA9IFtdOworCQkJZm9yKHZhciBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspeworCQkJCXZhciB2YWwgPSBtZShvW2ldKTsKKwkJCQlpZih0eXBlb2YodmFsKSAhPSAic3RyaW5nIil7CisJCQkJCXZhbCA9ICJ1bmRlZmluZWQiOworCQkJCX0KKwkJCQlyZXMucHVzaCh2YWwpOworCQkJfQorCQkJcmV0dXJuICJbIiArIHJlcy5qb2luKCIsIikgKyAiXSI7CisJCX0KKwkJLy8gbG9vayBpbiB0aGUgcmVnaXN0cnkKKwkJdHJ5IHsKKwkJCXdpbmRvdy5vID0gbzsKKwkJCW5ld09iaiA9IGRvam8uanNvbi5qc29uUmVnaXN0cnkubWF0Y2gobyk7CisJCQlyZXR1cm4gbWUobmV3T2JqKTsKKwkJfWNhdGNoKGUpeworCQkJLy8gZG9qby5kZWJ1ZyhlKTsKKwkJfQorCQkvLyBpdCdzIGEgZnVuY3Rpb24gd2l0aCBubyBhZGFwdGVyLCBiYWQKKwkJaWYob2JqdHlwZSA9PSAiZnVuY3Rpb24iKXsKKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGdlbmVyaWMgb2JqZWN0IGNvZGUgcGF0aAorCQlyZXMgPSBbXTsKKwkJZm9yICh2YXIgayBpbiBvKXsKKwkJCXZhciB1c2VLZXk7CisJCQlpZiAodHlwZW9mKGspID09ICJudW1iZXIiKXsKKwkJCQl1c2VLZXkgPSAnIicgKyBrICsgJyInOworCQkJfWVsc2UgaWYgKHR5cGVvZihrKSA9PSAic3RyaW5nIil7CisJCQkJdXNlS2V5ID0gZG9qby5zdHJpbmcuZXNjYXBlU3RyaW5nKGspOworCQkJfWVsc2V7CisJCQkJLy8gc2tpcCBub24tc3RyaW5nIG9yIG51bWJlciBrZXlzCisJCQkJY29udGludWU7CisJCQl9CisJCQl2YWwgPSBtZShvW2tdKTsKKwkJCWlmKHR5cGVvZih2YWwpICE9ICJzdHJpbmciKXsKKwkJCQkvLyBza2lwIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzCisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXMucHVzaCh1c2VLZXkgKyAiOiIgKyB2YWwpOworCQl9CisJCXJldHVybiAieyIgKyByZXMuam9pbigiLCIpICsgIn0iOworCX0KK307CisKKy8qKgorICogVHJlZURyYWcqIHNwZWNpYWxpemVkIG9uIG1hbmFnaW5nIHN1YnRyZWUgZHJhZ3MKKyAqIEl0IHNlbGVjdHMgbm9kZXMgYW5kIHZpc3VhbGlzZXMgd2hhdCdzIGdvaW5nIG9uLAorICogYnV0IGRlbGVnYXRlcyByZWFsIGFjdGlvbnMgdXBvbiB0cmVlIHRvIHRoZSBjb250cm9sbGVyCisgKgorICogVGhpcyBjb2RlIGlzIGNvbnNpZGVyZWQgYSBwYXJ0IG9mIGNvbnRyb2xsZXIKKyovCisKK2Rvam8ucHJvdmlkZSgiZG9qby5kbmQuVHJlZURyYWdBbmREcm9wIik7CisKKworCisKKworCisKK2Rvam8uZG5kLlRyZWVEcmFnU291cmNlID0gZnVuY3Rpb24obm9kZSwgc3luY0NvbnRyb2xsZXIsIHR5cGUsIHRyZWVOb2RlKXsKKwl0aGlzLmNvbnRyb2xsZXIgPSBzeW5jQ29udHJvbGxlcjsKKwl0aGlzLnRyZWVOb2RlID0gdHJlZU5vZGU7CisKKwlkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZS5jYWxsKHRoaXMsIG5vZGUsIHR5cGUpOworfQorCitkb2pvLmluaGVyaXRzKGRvam8uZG5kLlRyZWVEcmFnU291cmNlLCBkb2pvLmRuZC5IdG1sRHJhZ1NvdXJjZSk7CisKK2Rvam8ubGFuZy5leHRlbmQoZG9qby5kbmQuVHJlZURyYWdTb3VyY2UsIHsKKwlvbkRyYWdTdGFydDogZnVuY3Rpb24oKXsKKwkJLyogZXh0ZW5kIGFkZHMgZnVuY3Rpb25zIHRvIHByb3RvdHlwZSAqLworCQl2YXIgZHJhZ09iamVjdCA9IGRvam8uZG5kLkh0bWxEcmFnU291cmNlLnByb3RvdHlwZS5vbkRyYWdTdGFydC5jYWxsKHRoaXMpOworCQkvL2Rvam8uZGVidWdTaGFsbG93KGRyYWdPYmplY3QpCisKKwkJZHJhZ09iamVjdC50cmVlTm9kZSA9IHRoaXMudHJlZU5vZGU7CisKKwkJZHJhZ09iamVjdC5vbkRyYWdTdGFydCA9IGRvam8ubGFuZy5oaXRjaChkcmFnT2JqZWN0LCBmdW5jdGlvbihlKSB7CisKKwkJCS8qIHNhdmUgc2VsZWN0aW9uICovCisJCQl0aGlzLnNhdmVkU2VsZWN0ZWROb2RlID0gdGhpcy50cmVlTm9kZS50cmVlLnNlbGVjdG9yLnNlbGVjdGVkTm9kZTsKKwkJCWlmICh0aGlzLnNhdmVkU2VsZWN0ZWROb2RlKSB7CisJCQkJdGhpcy5zYXZlZFNlbGVjdGVkTm9kZS51bk1hcmtTZWxlY3RlZCgpOworCQkJfQorCisJCQl2YXIgcmVzdWx0ID0gZG9qby5kbmQuSHRtbERyYWdPYmplY3QucHJvdG90eXBlLm9uRHJhZ1N0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKworCQkJLyogcmVtb3ZlIGJhY2tncm91bmQgZ3JpZCBmcm9tIGNsb25lZCBvYmplY3QgKi8KKwkJCXZhciBjbG9uZUdyaWQgPSB0aGlzLmRyYWdDbG9uZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7CisJCQlmb3IodmFyIGk9MDsgaTxjbG9uZUdyaWQubGVuZ3RoOyBpKyspIHsKKwkJCQljbG9uZUdyaWQuaXRlbShpKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9J3VybCgpJzsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCisJCX0pOworCisJCWRyYWdPYmplY3Qub25EcmFnRW5kID0gZnVuY3Rpb24oZSkgeworCisJCQkvKiByZXN0b3JlIHNlbGVjdGlvbiAqLworCQkJaWYgKHRoaXMuc2F2ZWRTZWxlY3RlZE5vZGUpIHsKKwkJCQl0aGlzLnNhdmVkU2VsZWN0ZWROb2RlLm1hcmtTZWxlY3RlZCgpOworCQkJfQorCQkJLy9kb2pvLmRlYnVnKGUuZHJhZ1N0YXR1cyk7CisKKwkJCXJldHVybiBkb2pvLmRuZC5IdG1sRHJhZ09iamVjdC5wcm90b3R5cGUub25EcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwkJLy9kb2pvLmRlYnVnKGRyYWdPYmplY3QuZG9tTm9kZS5vdXRlckhUTUwpCisKKworCQlyZXR1cm4gZHJhZ09iamVjdDsKKwl9LAorCisJb25EcmFnRW5kOiBmdW5jdGlvbihlKXsKKworCisJCSB2YXIgcmVzID0gZG9qby5kbmQuSHRtbERyYWdTb3VyY2UucHJvdG90eXBlLm9uRHJhZ0VuZC5jYWxsKHRoaXMsIGUpOworCisKKwkJIHJldHVybiByZXM7CisJfQorfSk7CisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitkb2pvLmRuZC5UcmVlRHJvcFRhcmdldCA9IGZ1bmN0aW9uKGRvbU5vZGUsIGNvbnRyb2xsZXIsIHR5cGUsIHRyZWVOb2RlKXsKKworCXRoaXMudHJlZU5vZGUgPSB0cmVlTm9kZTsKKwl0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOyAvLyBJIHdpbGwgc3luYy1seSBwcm9jZXNzIGRyb3BzCisJCisJZG9qby5kbmQuSHRtbERyb3BUYXJnZXQuYXBwbHkodGhpcywgW2RvbU5vZGUsIHR5cGVdKTsKK30KKworZG9qby5pbmhlcml0cyhkb2pvLmRuZC5UcmVlRHJvcFRhcmdldCwgZG9qby5kbmQuSHRtbERyb3BUYXJnZXQpOworCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZG5kLlRyZWVEcm9wVGFyZ2V0LCB7CisKKwlhdXRvRXhwYW5kRGVsYXk6IDE1MDAsCisJYXV0b0V4cGFuZFRpbWVyOiBudWxsLAorCisKKwlwb3NpdGlvbjogbnVsbCwKKworCWluZGljYXRvclN0eWxlOiAiMnB4IGJsYWNrIHNvbGlkIiwKKworCXNob3dJbmRpY2F0b3I6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CisKKwkJLy8gZG8gbm90IGNoYW5nZSBzdHlsZSB0b28gb2Z0ZW4sIGNhdXNlIG9mIGJsaW5raW5nIHBvc3NpYmxlCisJCWlmICh0aGlzLnBvc2l0aW9uID09IHBvc2l0aW9uKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvL2Rvam8uZGVidWcocG9zaXRpb24pCisKKwkJdGhpcy5oaWRlSW5kaWNhdG9yKCk7CisKKwkJdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworCisJCWlmIChwb3NpdGlvbiA9PSAiYmVmb3JlIikgeworCQkJdGhpcy50cmVlTm9kZS5sYWJlbE5vZGUuc3R5bGUuYm9yZGVyVG9wID0gdGhpcy5pbmRpY2F0b3JTdHlsZTsKKwkJfSBlbHNlIGlmIChwb3NpdGlvbiA9PSAiYWZ0ZXIiKSB7CisJCQl0aGlzLnRyZWVOb2RlLmxhYmVsTm9kZS5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLmluZGljYXRvclN0eWxlOworCQl9IGVsc2UgaWYgKHBvc2l0aW9uID09ICJvbnRvIikgeworCQkJdGhpcy50cmVlTm9kZS5tYXJrU2VsZWN0ZWQoKTsKKwkJfQorCisKKwl9LAorCisJaGlkZUluZGljYXRvcjogZnVuY3Rpb24oKSB7CisJCXRoaXMudHJlZU5vZGUubGFiZWxOb2RlLnN0eWxlLmJvcmRlckJvdHRvbT0iIjsKKwkJdGhpcy50cmVlTm9kZS5sYWJlbE5vZGUuc3R5bGUuYm9yZGVyVG9wPSIiOworCQl0aGlzLnRyZWVOb2RlLnVuTWFya1NlbGVjdGVkKCk7CisJCXRoaXMucG9zaXRpb24gPSBudWxsOworCX0sCisKKworCisJLy8gaXMgdGhlIHRhcmdldCBwb3NzaWJseSBvayA/CisJLy8gVGhpcyBmdW5jdGlvbiBpcyBydW4gb24gZHJhZ092ZXIsIGJ1dCBkcm9wIHBvc3NpYmlsaXR5IGlzIGFsc28gZGV0ZXJtaW5lZCBieSBwb3NpdGlvbiBvdmVyIG5vZGUKKwkvLyB0aGF0J3Mgd2h5IGFjY2VwdHNXaXRoUG9zaXRpb24gaXMgY2FsbGVkCisJLy8gZG9lc250IHRha2UgaW5kZXggaW50byBhY2NvdW50ICggY2FuIGNoYW5nZSB3aGlsZSBtb3ZpbmcgbW91c2Ugdy9vIGNoYW5naW5nIHRhcmdldCApCisKKworCS8qKgorCSAqIENvYXJzZSAodHJlZS1sZXZlbCkgYWNjZXNzIGNoZWNrLgorCSAqIFdlIGNhbid0IGRldGVybWluZSByZWFsIGFjY2VwdHMgc3RhdHVzIHcvbyBwb3NpdGlvbgorCSovCisJb25EcmFnT3ZlcjogZnVuY3Rpb24oZSl7CisvL2Rvam8uZGVidWcoIm9uRHJhZ092ZXIgZm9yICIrZSk7CisKKworCQl2YXIgYWNjZXB0cyA9IGRvam8uZG5kLkh0bWxEcm9wVGFyZ2V0LnByb3RvdHlwZS5vbkRyYWdPdmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJLy9kb2pvLmRlYnVnKCJUcmVlRHJvcFRhcmdldC5vbkRyYWdPdmVyIGFjY2VwdHM6IithY2NlcHRzKQorCisJCWlmIChhY2NlcHRzICYmIHRoaXMudHJlZU5vZGUuaXNGb2xkZXIgJiYgIXRoaXMudHJlZU5vZGUuaXNFeHBhbmRlZCkgeworCQkJdGhpcy5zZXRBdXRvRXhwYW5kVGltZXIoKTsKKwkJfQorCisJCXJldHVybiBhY2NlcHRzOworCX0sCisKKwkvKiBQYXJlbnQub25EcmFnT3ZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGdldCBhY2NlcHRzIHN0YXR1cyAqLworCWFjY2VwdHM6IGZ1bmN0aW9uKGRyYWdPYmplY3RzKSB7CisKKwkJdmFyIGFjY2VwdHMgPSBkb2pvLmRuZC5IdG1sRHJvcFRhcmdldC5wcm90b3R5cGUuYWNjZXB0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisJCWlmICghYWNjZXB0cykgcmV0dXJuIGZhbHNlOworCisJCXZhciBzb3VyY2VUcmVlTm9kZSA9IGRyYWdPYmplY3RzWzBdLnRyZWVOb2RlOworCisJCWlmIChkb2pvLmxhbmcuaXNVbmRlZmluZWQoc291cmNlVHJlZU5vZGUpIHx8ICFzb3VyY2VUcmVlTm9kZSB8fCAhc291cmNlVHJlZU5vZGUuaXNUcmVlTm9kZSkgeworCQkJZG9qby5yYWlzZSgiU291cmNlIGlzIG5vdCBUcmVlTm9kZSBvciBub3QgZm91bmQiKTsKKwkJfQorCisJCWlmIChzb3VyY2VUcmVlTm9kZSA9PT0gdGhpcy50cmVlTm9kZSkgcmV0dXJuIGZhbHNlOworCisJCXJldHVybiB0cnVlOworCX0sCisKKworCisJc2V0QXV0b0V4cGFuZFRpbWVyOiBmdW5jdGlvbigpIHsKKwkJLy8gc2V0IHVwIGF1dG9leHBhbmQgdGltZXIKKwkJdmFyIF90aGlzID0gdGhpczsKKworCQl2YXIgYXV0b0V4cGFuZCA9IGZ1bmN0aW9uICgpIHsKKwkJCWlmIChkb2pvLmRuZC5kcmFnTWFuYWdlci5jdXJyZW50RHJvcFRhcmdldCA9PT0gX3RoaXMpIHsKKwkJCQlfdGhpcy5jb250cm9sbGVyLmV4cGFuZChfdGhpcy50cmVlTm9kZSk7CisJCQl9CisJCX0KKworCQl0aGlzLmF1dG9FeHBhbmRUaW1lciA9IGRvam8ubGFuZy5zZXRUaW1lb3V0KGF1dG9FeHBhbmQsIF90aGlzLmF1dG9FeHBhbmREZWxheSk7CisJfSwKKworCisJZ2V0RE5ETW9kZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnRyZWVOb2RlLnRyZWUuRE5ETW9kZTsKKwl9LAorCQkKKworCWdldEFjY2VwdFBvc2l0aW9uOiBmdW5jdGlvbihlLCBzb3VyY2VUcmVlTm9kZSkgeworCisJCXZhciBETkRNb2RlID0gdGhpcy5nZXRETkRNb2RlKCk7CisKKwkJaWYgKERORE1vZGUgJiBkb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5PTlRPICYmCisJCQkvLyBjaGVjayBpZiBPTlRPIGlzIGFsbG93ZWQgbG9jYWx5CisJCQkhKAorCQkJICAhdGhpcy50cmVlTm9kZS5hY3Rpb25Jc0Rpc2FibGVkKGRvam8ud2lkZ2V0LlRyZWVOb2RlLnByb3RvdHlwZS5hY3Rpb25zLkFERENISUxEKSAvLyBjaGVjayBkeW5hbWljYWxseSBjYXVzZSBtYXkgY2hhbmdlIHcvbyByZWdlbmVyYXRpb24gb2YgZHJvcFRhcmdldAorCQkJICAmJiBzb3VyY2VUcmVlTm9kZS5wYXJlbnQgIT09IHRoaXMudHJlZU5vZGUKKwkJCSAgJiYgdGhpcy5jb250cm9sbGVyLmNhbk1vdmUoc291cmNlVHJlZU5vZGUsIHRoaXMudHJlZU5vZGUpCisJCQkgKQorCQkpIHsKKwkJCS8vIGRpc2FibGUgT05UTyBpZiBjYW4ndCBtb3ZlCisJCQlETkRNb2RlICY9IH5kb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5PTlRPOworCQl9CisKKworCQl2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKGUsIERORE1vZGUpOworCisJCS8vZG9qby5kZWJ1ZyhETkRNb2RlICYgKyIgOiAiK3Bvc2l0aW9uKTsKKworCisJCS8vIGlmIG9udG8gaXMgaGVyZSA9PiBpdCB3YXMgYWxsb3dlZCBiZWZvcmUsIG5vIGFjY2VwdCBjaGVjayBpcyBuZWVkZWQKKwkJaWYgKHBvc2l0aW9uPT0ib250byIgfHwKKwkJCSghdGhpcy5pc0FkamFjZW50Tm9kZShzb3VyY2VUcmVlTm9kZSwgcG9zaXRpb24pCisJCQkgJiYgdGhpcy5jb250cm9sbGVyLmNhbk1vdmUoc291cmNlVHJlZU5vZGUsIHRoaXMudHJlZU5vZGUucGFyZW50KQorCQkJKQorCQkpIHsKKwkJCXJldHVybiBwb3NpdGlvbjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJfSwKKworCW9uRHJhZ091dDogZnVuY3Rpb24oZSkgeworCQl0aGlzLmNsZWFyQXV0b0V4cGFuZFRpbWVyKCk7CisKKwkJdGhpcy5oaWRlSW5kaWNhdG9yKCk7CisJfSwKKworCisJY2xlYXJBdXRvRXhwYW5kVGltZXI6IGZ1bmN0aW9uKCkgeworCQlpZiAodGhpcy5hdXRvRXhwYW5kVGltZXIpIHsKKwkJCWNsZWFyVGltZW91dCh0aGlzLmF1dG9FeHBhbmRUaW1lcik7CisJCQl0aGlzLmF1dG9FeHBhbmRUaW1lciA9IG51bGw7CisJCX0KKwl9LAorCisKKworCW9uRHJhZ01vdmU6IGZ1bmN0aW9uKGUsIGRyYWdPYmplY3RzKXsKKworCQl2YXIgc291cmNlVHJlZU5vZGUgPSBkcmFnT2JqZWN0c1swXS50cmVlTm9kZTsKKworCQl2YXIgcG9zaXRpb24gPSB0aGlzLmdldEFjY2VwdFBvc2l0aW9uKGUsIHNvdXJjZVRyZWVOb2RlKTsKKworCQlpZiAocG9zaXRpb24pIHsKKwkJCXRoaXMuc2hvd0luZGljYXRvcihwb3NpdGlvbik7CisJCX0KKworCX0sCisKKwlpc0FkamFjZW50Tm9kZTogZnVuY3Rpb24oc291cmNlTm9kZSwgcG9zaXRpb24pIHsKKworCQlpZiAoc291cmNlTm9kZSA9PT0gdGhpcy50cmVlTm9kZSkgcmV0dXJuIHRydWU7CisJCWlmIChzb3VyY2VOb2RlLmdldE5leHRTaWJsaW5nKCkgPT09IHRoaXMudHJlZU5vZGUgJiYgcG9zaXRpb249PSJiZWZvcmUiKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKHNvdXJjZU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT09IHRoaXMudHJlZU5vZGUgJiYgcG9zaXRpb249PSJhZnRlciIpIHJldHVybiB0cnVlOworCisJCXJldHVybiBmYWxzZTsKKwl9LAorCisKKwkvKiBnZXQgRE5ETW9kZSBhbmQgc2VlIHdoaWNoIHBvc2l0aW9uIGUgZml0cyAqLworCWdldFBvc2l0aW9uOiBmdW5jdGlvbihlLCBETkRNb2RlKSB7CisJCXZhciBub2RlID0gZG9qby5ieUlkKHRoaXMudHJlZU5vZGUubGFiZWxOb2RlKTsKKwkJdmFyIG1vdXNleSA9IGUucGFnZVkgfHwgZS5jbGllbnRZICsgZG9qby5ib2R5KCkuc2Nyb2xsVG9wOworCQl2YXIgbm9kZXkgPSBkb2pvLmh0bWwuZ2V0QWJzb2x1dGVQb3NpdGlvbihub2RlKS55OworCQl2YXIgaGVpZ2h0ID0gZG9qby5odG1sLmdldEJvcmRlckJveChub2RlKS5oZWlnaHQ7CisKKwkJdmFyIHJlbFkgPSBtb3VzZXkgLSBub2RleTsKKwkJdmFyIHAgPSByZWxZIC8gaGVpZ2h0OworCisJCXZhciBwb3NpdGlvbiA9ICIiOyAvLyAiIiA8PT4gZm9yYmlkZGVuCisJCWlmIChETkRNb2RlICYgZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuT05UTworCQkgICYmIERORE1vZGUgJiBkb2pvLndpZGdldC5UcmVlLnByb3RvdHlwZS5ETkRNb2Rlcy5CRVRXRUVOKSB7CisJCQlpZiAocDw9MC4zKSB7CisJCQkJcG9zaXRpb24gPSAiYmVmb3JlIjsKKwkJCX0gZWxzZSBpZiAocDw9MC43KSB7CisJCQkJcG9zaXRpb24gPSAib250byI7CisJCQl9IGVsc2UgeworCQkJCXBvc2l0aW9uID0gImFmdGVyIjsKKwkJCX0KKwkJfSBlbHNlIGlmIChETkRNb2RlICYgZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuQkVUV0VFTikgeworCQkJaWYgKHA8PTAuNSkgeworCQkJCXBvc2l0aW9uID0gImJlZm9yZSI7CisJCQl9IGVsc2UgeworCQkJCXBvc2l0aW9uID0gImFmdGVyIjsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChETkRNb2RlICYgZG9qby53aWRnZXQuVHJlZS5wcm90b3R5cGUuRE5ETW9kZXMuT05UTykgeworCQkJcG9zaXRpb24gPSAib250byI7CisJCX0KKworCisJCXJldHVybiBwb3NpdGlvbjsKKwl9LAorCisKKworCWdldFRhcmdldFBhcmVudEluZGV4OiBmdW5jdGlvbihzb3VyY2VUcmVlTm9kZSwgcG9zaXRpb24pIHsKKworCQl2YXIgaW5kZXggPSBwb3NpdGlvbiA9PSAiYmVmb3JlIiA/IHRoaXMudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSA6IHRoaXMudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSsxOworCQlpZiAodGhpcy50cmVlTm9kZS5wYXJlbnQgPT09IHNvdXJjZVRyZWVOb2RlLnBhcmVudAorCQkgICYmIHRoaXMudHJlZU5vZGUuZ2V0UGFyZW50SW5kZXgoKSA+IHNvdXJjZVRyZWVOb2RlLmdldFBhcmVudEluZGV4KCkpIHsKKwkJICAJaW5kZXgtLTsgIC8vIGRyYWdnaW5nIGEgbm9kZSBpcyBkaWZmZXJlbnQgZm9yIHNpbXBsZSBtb3ZlIGJhY2F1c2Ugb2YgYmVmb3JlLWFmdGVyIGlzc3VlcworCQl9CisKKwkJcmV0dXJuIGluZGV4OworCX0sCisKKworCW9uRHJvcDogZnVuY3Rpb24oZSl7CisJCS8vIG9uRHJhZ091dCB3aWxsIGNsZWFuIHBvc2l0aW9uCisKKworCQl2YXIgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uOworCisvL2Rvam8uZGVidWcocG9zaXRpb24pOworCisJCXRoaXMub25EcmFnT3V0KGUpOworCisJCXZhciBzb3VyY2VUcmVlTm9kZSA9IGUuZHJhZ09iamVjdC50cmVlTm9kZTsKKworCQlpZiAoIWRvam8ubGFuZy5pc09iamVjdChzb3VyY2VUcmVlTm9kZSkpIHsKKwkJCWRvam8ucmFpc2UoIlRyZWVOb2RlIG5vdCBmb3VuZCBpbiBkcmFnT2JqZWN0IikKKwkJfQorCisJCWlmIChwb3NpdGlvbiA9PSAib250byIpIHsKKwkJCXJldHVybiB0aGlzLmNvbnRyb2xsZXIubW92ZShzb3VyY2VUcmVlTm9kZSwgdGhpcy50cmVlTm9kZSwgMCk7CisJCX0gZWxzZSB7CisJCQl2YXIgaW5kZXggPSB0aGlzLmdldFRhcmdldFBhcmVudEluZGV4KHNvdXJjZVRyZWVOb2RlLCBwb3NpdGlvbik7CisJCQlyZXR1cm4gdGhpcy5jb250cm9sbGVyLm1vdmUoc291cmNlVHJlZU5vZGUsIHRoaXMudHJlZU5vZGUucGFyZW50LCBpbmRleCk7CisJCX0KKworCQkvL2Rvam8uZGVidWcoJ2Ryb3AyJyk7CisKKworCisJfQorCisKK30pOworCisKKworZG9qby5kbmQuVHJlZURORENvbnRyb2xsZXIgPSBmdW5jdGlvbih0cmVlQ29udHJvbGxlcikgeworCisJLy8gSSB1c2UgdGhpcyBjb250cm9sbGVyIHRvIHBlcmZvcm0gYWN0aW9ucworCXRoaXMudHJlZUNvbnRyb2xsZXIgPSB0cmVlQ29udHJvbGxlcjsKKworCXRoaXMuZHJhZ1NvdXJjZXMgPSB7fTsKKworCXRoaXMuZHJvcFRhcmdldHMgPSB7fTsKKworfQorCitkb2pvLmxhbmcuZXh0ZW5kKGRvam8uZG5kLlRyZWVETkRDb250cm9sbGVyLCB7CisKKworCWxpc3RlblRyZWU6IGZ1bmN0aW9uKHRyZWUpIHsKKwkJLy9kb2pvLmRlYnVnKCJMaXN0ZW4gdHJlZSAiK3RyZWUpOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSwgdGhpcywgIm9uQ3JlYXRlRE9NTm9kZSIpOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMubW92ZUZyb20sIHRoaXMsICJvbk1vdmVGcm9tIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCQlkb2pvLmV2ZW50LnRvcGljLnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuYWRkQ2hpbGQsIHRoaXMsICJvbkFkZENoaWxkIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLCB0aGlzLCAib25SZW1vdmVOb2RlIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwl9LAorCisKKwl1bmxpc3RlblRyZWU6IGZ1bmN0aW9uKHRyZWUpIHsKKwkJLy9kb2pvLmRlYnVnKCJMaXN0ZW4gdHJlZSAiK3RyZWUpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5jcmVhdGVET01Ob2RlLCB0aGlzLCAib25DcmVhdGVET01Ob2RlIik7CisJCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLm1vdmVGcm9tLCB0aGlzLCAib25Nb3ZlRnJvbSIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5tb3ZlVG8sIHRoaXMsICJvbk1vdmVUbyIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy5hZGRDaGlsZCwgdGhpcywgIm9uQWRkQ2hpbGQiKTsKKwkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMucmVtb3ZlTm9kZSwgdGhpcywgIm9uUmVtb3ZlTm9kZSIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKwl9LAorCisJb25UcmVlRGVzdHJveTogZnVuY3Rpb24obWVzc2FnZSkgeworCQl0aGlzLnVubGlzdGVuVHJlZShtZXNzYWdlLnNvdXJjZSk7CisJCS8vIEknbSBub3Qgd2lkZ2V0IHNvIGRvbid0IHVzZSBkZXN0cm95KCkgY2FsbCBhbmQgZGllV2l0aFRyZWUKKwl9LAorCisJb25DcmVhdGVET01Ob2RlOiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCXRoaXMucmVnaXN0ZXJETkROb2RlKG1lc3NhZ2Uuc291cmNlKTsKKwl9LAorCisJb25BZGRDaGlsZDogZnVuY3Rpb24obWVzc2FnZSkgeworCQl0aGlzLnJlZ2lzdGVyRE5ETm9kZShtZXNzYWdlLmNoaWxkKTsKKwl9LAorCisJb25Nb3ZlRnJvbTogZnVuY3Rpb24obWVzc2FnZSkgeworCQl2YXIgX3RoaXMgPSB0aGlzOworCQlkb2pvLmxhbmcuZm9yRWFjaCgKKwkJCW1lc3NhZ2UuY2hpbGQuZ2V0RGVzY2VuZGFudHMoKSwKKwkJCWZ1bmN0aW9uKG5vZGUpIHsgX3RoaXMudW5yZWdpc3RlckRORE5vZGUobm9kZSk7IH0KKwkJKTsKKwl9LAorCisJb25Nb3ZlVG86IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKwkJdmFyIF90aGlzID0gdGhpczsKKwkJZG9qby5sYW5nLmZvckVhY2goCisJCQltZXNzYWdlLmNoaWxkLmdldERlc2NlbmRhbnRzKCksCisJCQlmdW5jdGlvbihub2RlKSB7IF90aGlzLnJlZ2lzdGVyRE5ETm9kZShub2RlKTsgfQorCQkpOworCX0sCisKKwkvKioKKwkgKiBDb250cm9sbGVyKG5vZGUgbW9kZWwpIGNyZWF0ZXMgRE5ETm9kZXMgYmVjYXVzZSBpdCBwYXNzZXMgaXRzZWxmIHRvIG5vZGUgZm9yIHN5bmNocm9uZW91cyBkcm9wcyBwcm9jZXNzaW5nCisJICogSSBjYW4ndCBwcm9jZXNzIERuRCB3aXRoIGV2ZW50cyBjYXVzZSBhbiBldmVudCBjYW4ndCByZXR1cm4gcmVzdWx0IHN1Y2Nlc3MvZmFsc2UKKwkqLworCXJlZ2lzdGVyRE5ETm9kZTogZnVuY3Rpb24obm9kZSkgeworCQlpZiAoIW5vZGUudHJlZS5ETkRNb2RlKSByZXR1cm47CisKKy8vZG9qby5kZWJ1ZygicmVnaXN0ZXJETkROb2RlICIrbm9kZSk7CisKKwkJLyogSSBkcmFnIGxhYmVsLCBub3QgZG9tTm9kZSwgYmVjYXVzZSBsYXJnZSBkb21Ob2RlcyBhcmUgdmVyeSBzbG93IHRvIGNvcHkgYW5kIGxhcmdlIHRvIGRyYWcgKi8KKworCQl2YXIgc291cmNlID0gbnVsbDsKKwkJdmFyIHRhcmdldCA9IG51bGw7CisKKwkJaWYgKCFub2RlLmFjdGlvbklzRGlzYWJsZWQobm9kZS5hY3Rpb25zLk1PVkUpKSB7CisJCQkvL2Rvam8uZGVidWcoInJlZyBzb3VyY2UiKQorCQkJdmFyIHNvdXJjZSA9IG5ldyBkb2pvLmRuZC5UcmVlRHJhZ1NvdXJjZShub2RlLmxhYmVsTm9kZSwgdGhpcywgbm9kZS50cmVlLndpZGdldElkLCBub2RlKTsKKwkJCXRoaXMuZHJhZ1NvdXJjZXNbbm9kZS53aWRnZXRJZF0gPSBzb3VyY2U7CisJCX0KKworCQl2YXIgdGFyZ2V0ID0gbmV3IGRvam8uZG5kLlRyZWVEcm9wVGFyZ2V0KG5vZGUubGFiZWxOb2RlLCB0aGlzLnRyZWVDb250cm9sbGVyLCBub2RlLnRyZWUuRE5EQWNjZXB0VHlwZXMsIG5vZGUpOworCisJCXRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0gPSB0YXJnZXQ7CisKKwl9LAorCisKKwl1bnJlZ2lzdGVyRE5ETm9kZTogZnVuY3Rpb24obm9kZSkgeworCisJCWlmICh0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdKSB7CisJCQlkb2pvLmRuZC5kcmFnTWFuYWdlci51bnJlZ2lzdGVyRHJhZ1NvdXJjZSh0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdKTsKKwkJCWRlbGV0ZSB0aGlzLmRyYWdTb3VyY2VzW25vZGUud2lkZ2V0SWRdOworCQl9CisKKwkJaWYgKHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0pIHsKKwkJCWRvam8uZG5kLmRyYWdNYW5hZ2VyLnVucmVnaXN0ZXJEcm9wVGFyZ2V0KHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF0pOworCQkJZGVsZXRlIHRoaXMuZHJvcFRhcmdldHNbbm9kZS53aWRnZXRJZF07CisJCX0KKwl9CisKKworCisKKworfSk7CisKKworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlQmFzaWNDb250cm9sbGVyIik7CisKKworCisKKworCitkb2pvLndpZGdldC5kZWZpbmVXaWRnZXQoImRvam8ud2lkZ2V0LlRyZWVCYXNpY0NvbnRyb2xsZXIiLCBkb2pvLndpZGdldC5IdG1sV2lkZ2V0LCB7CisJd2lkZ2V0VHlwZTogIlRyZWVCYXNpY0NvbnRyb2xsZXIiLAorCisJRE5EQ29udHJvbGxlcjogIiIsCisKKwlkaWVXaXRoVHJlZTogZmFsc2UsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihhcmdzLCBmcmFnKXsKKworCQkvKiBubyBETkQgYnkgZGVmYXVsdCBmb3IgY29tcGF0aWJpbGl0eSAqLworCQlpZiAodGhpcy5ETkRDb250cm9sbGVyID09ICJjcmVhdGUiKSB7CisJCQkKKwkJCXRoaXMuRE5EQ29udHJvbGxlciA9IG5ldyBkb2pvLmRuZC5UcmVlRE5EQ29udHJvbGxlcih0aGlzKTsKKwkJfQorCisKKworCX0sCisKKworCS8qKgorCSAqIEJpbmRzIGNvbnRyb2xsZXIgdG8gYWxsIHRyZWUgZXZlbnRzCisJKi8KKwlsaXN0ZW5UcmVlOiBmdW5jdGlvbih0cmVlKSB7CisJCS8vZG9qby5kZWJ1ZygiRXZlbnQgIit0cmVlLmV2ZW50TmFtZXMudHJlZUNsaWNrKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLmNyZWF0ZURPTU5vZGUsIHRoaXMsICJvbkNyZWF0ZURPTU5vZGUiKTsKKwkJZG9qby5ldmVudC50b3BpYy5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVDbGljaywgdGhpcywgIm9uVHJlZUNsaWNrIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ3JlYXRlLCB0aGlzLCAib25UcmVlQ3JlYXRlIik7CisJCWRvam8uZXZlbnQudG9waWMuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlRGVzdHJveSwgdGhpcywgIm9uVHJlZURlc3Ryb3kiKTsKKworCQlpZiAodGhpcy5ETkRDb250cm9sbGVyKSB7CisJCQl0aGlzLkRORENvbnRyb2xsZXIubGlzdGVuVHJlZSh0cmVlKTsKKwkJfQorCX0sCisKKwl1bmxpc3RlblRyZWU6IGZ1bmN0aW9uKHRyZWUpIHsKKwkJZG9qby5ldmVudC50b3BpYy51bnN1YnNjcmliZSh0cmVlLmV2ZW50TmFtZXMuY3JlYXRlRE9NTm9kZSwgdGhpcywgIm9uQ3JlYXRlRE9NTm9kZSIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ2xpY2ssIHRoaXMsICJvblRyZWVDbGljayIpOworCQlkb2pvLmV2ZW50LnRvcGljLnVuc3Vic2NyaWJlKHRyZWUuZXZlbnROYW1lcy50cmVlQ3JlYXRlLCB0aGlzLCAib25UcmVlQ3JlYXRlIik7CisJCWRvam8uZXZlbnQudG9waWMudW5zdWJzY3JpYmUodHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LCB0aGlzLCAib25UcmVlRGVzdHJveSIpOworCX0sCisKKwlvblRyZWVEZXN0cm95OiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCXZhciB0cmVlID0gbWVzc2FnZS5zb3VyY2U7CisKKwkJdGhpcy51bmxpc3RlblRyZWUodHJlZSk7CisKKwkJaWYgKHRoaXMuZGllV2l0aFRyZWUpIHsKKwkJCS8vYWxlcnQoIktpbGxpbmcgbXlzZWxmICIrdGhpcy53aWRnZXRJZCk7CisJCQl0aGlzLmRlc3Ryb3koKTsKKwkJCS8vZG9qby5kZWJ1ZygiZG9uZSIpOworCQl9CisJfSwKKworCW9uQ3JlYXRlRE9NTm9kZTogZnVuY3Rpb24obWVzc2FnZSkgeworCisJCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisKKworCQlpZiAobm9kZS5leHBhbmRMZXZlbCA+IDApIHsKKwkJCXRoaXMuZXhwYW5kVG9MZXZlbChub2RlLCBub2RlLmV4cGFuZExldmVsKTsKKwkJfQorCX0sCisKKwkvLyBwZXJmb3JtIGFjdGlvbnMtaW5pdGlhbGl6ZXJzIGZvciB0cmVlCisJb25UcmVlQ3JlYXRlOiBmdW5jdGlvbihtZXNzYWdlKSB7CisJCXZhciB0cmVlID0gbWVzc2FnZS5zb3VyY2U7CisJCXZhciBfdGhpcyA9IHRoaXM7CisJCWlmICh0cmVlLmV4cGFuZExldmVsKSB7CisJCQlkb2pvLmxhbmcuZm9yRWFjaCh0cmVlLmNoaWxkcmVuLAorCQkJCWZ1bmN0aW9uKGNoaWxkKSB7CisJCQkJCV90aGlzLmV4cGFuZFRvTGV2ZWwoY2hpbGQsIHRyZWUuZXhwYW5kTGV2ZWwtMSkKKwkJCQl9CisJCQkpOworCQl9CisJfSwKKworCWV4cGFuZFRvTGV2ZWw6IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSAwKSByZXR1cm47CisKKwkJdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKKwkJdmFyIF90aGlzID0gdGhpczsKKworCQl2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKG5vZGUsIGV4cGFuZExldmVsKSB7CisJCQl0aGlzLm5vZGUgPSBub2RlOworCQkJdGhpcy5leHBhbmRMZXZlbCA9IGV4cGFuZExldmVsOworCQkJLy8gcmVjdXJzaXZlbHkgZXhwYW5kIG9wZW5lZCBub2RlCisJCQl0aGlzLnByb2Nlc3MgPSBmdW5jdGlvbigpIHsKKwkJCQkvL2Rvam8uZGVidWcoIlByb2Nlc3MgIitub2RlKyIgbGV2ZWwgIitsZXZlbCk7CisJCQkJZm9yKHZhciBpPTA7IGk8dGhpcy5ub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJCXZhciBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07CisKKwkJCQkJX3RoaXMuZXhwYW5kVG9MZXZlbChjaGlsZCwgdGhpcy5leHBhbmRMZXZlbCk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXZhciBoID0gbmV3IGhhbmRsZXIobm9kZSwgbGV2ZWwtMSk7CisKKworCQl0aGlzLmV4cGFuZChub2RlLCBmYWxzZSwgaCwgaC5wcm9jZXNzKTsKKworCX0sCisKKworCisKKwlvblRyZWVDbGljazogZnVuY3Rpb24obWVzc2FnZSl7CisJCXZhciBub2RlID0gbWVzc2FnZS5zb3VyY2U7CisKKwkJaWYobm9kZS5pc0xvY2tlZCgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobm9kZS5pc0V4cGFuZGVkKXsKKwkJCXRoaXMuY29sbGFwc2Uobm9kZSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmV4cGFuZChub2RlKTsKKwkJfQorCX0sCisKKwlleHBhbmQ6IGZ1bmN0aW9uKG5vZGUsIHN5bmMsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisJCW5vZGUuZXhwYW5kKCk7CisJCWlmIChjYWxsRnVuYykgY2FsbEZ1bmMuYXBwbHkoY2FsbE9iaiwgW25vZGVdKTsKKwl9LAorCisJY29sbGFwc2U6IGZ1bmN0aW9uKG5vZGUpIHsKKworCQlub2RlLmNvbGxhcHNlKCk7CisJfSwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBtb3ZlID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGl0IGlzIG9rIHRvIGNoYW5nZSBwYXJlbnQgb2YgY2hpbGQgdG8gbmV3UGFyZW50CisJICogTWF5IGluY3VyIHR5cGUgY2hlY2tzIGV0YworCSAqCisJICogSXQgc2hvdWxkIGNoZWNrIG9ubHkgaGllcmFyY2hpY2FsIHBvc3NpYmlsaXR5IHcvbyBpbmRleCwgZXRjCisJICogYmVjYXVzZSBpbiBvbkRyYWdPdmVyIGV2ZW50IGZvciBCZXR3ZWVuIERORCBtb2RlIHdlIGNhbid0IGNhbGN1bGF0ZSBpbmRleCBhdCBvbmNlIG9uIG9uRHJhZ09WZXIuCisJICogaW5kZXggY2hhbmdlcyBhcyBjbGllbnQgbW92ZXMgbW91c2UgdXAtZG93biBvdmVyIHRoZSBub2RlCisJICovCisJY2FuTW92ZTogZnVuY3Rpb24oY2hpbGQsIG5ld1BhcmVudCl7CisKKwkJaWYgKGNoaWxkLmFjdGlvbklzRGlzYWJsZWQoY2hpbGQuYWN0aW9ucy5NT1ZFKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gaWYgd2UgbW92ZSB1bmRlciBzYW1lIHBhcmVudCB0aGVuIG5vIG1hdHRlciBpZiBBRERDSElMRCBkaXNhYmxlZCBmb3IgaGltCisJCS8vIGJ1dCBpZiB3ZSBtb3ZlIHRvIE5FVyBwYXJlbnQgdGhlbiBjaGVjayBpZiBhY3Rpb24gaXMgZGlzYWJsZWQgZm9yIGhpbQorCQkvLyBhbHNvIGNvdmVycyBjYXNlIGZvciBuZXdQYXJlbnQgYmVpbmcgYSBub24tZm9sZGVyIGluIHN0cmljdCBtb2RlIGV0YworCQlpZiAoY2hpbGQucGFyZW50ICE9PSBuZXdQYXJlbnQgJiYgbmV3UGFyZW50LmFjdGlvbklzRGlzYWJsZWQobmV3UGFyZW50LmFjdGlvbnMuQUREQ0hJTEQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBDYW4ndCBtb3ZlIHBhcmVudCB1bmRlciBjaGlsZC4gY2hlY2sgd2hldGhlciBuZXcgcGFyZW50IGlzIGNoaWxkIG9mICJjaGlsZCIuCisJCXZhciBub2RlID0gbmV3UGFyZW50OworCQl3aGlsZShub2RlLmlzVHJlZU5vZGUpIHsKKwkJCS8vZG9qby5kZWJ1Z1NoYWxsb3cobm9kZS50aXRsZSkKKwkJCWlmIChub2RlID09PSBjaGlsZCkgeworCQkJCS8vIHBhcmVudCBvZiBuZXdQYXJlbnQgaXMgY2hpbGQKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlub2RlID0gbm9kZS5wYXJlbnQ7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisKKwltb3ZlOiBmdW5jdGlvbihjaGlsZCwgbmV3UGFyZW50LCBpbmRleCkgeworCisJCS8qIG1vdmUgc291cmNlVHJlZU5vZGUgdG8gbmV3IHBhcmVudCAqLworCQlpZiAoIXRoaXMuY2FuTW92ZShjaGlsZCwgbmV3UGFyZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJdmFyIHJlc3VsdCA9IHRoaXMuZG9Nb3ZlKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KTsKKworCQlpZiAoIXJlc3VsdCkgcmV0dXJuIHJlc3VsdDsKKworCQlpZiAobmV3UGFyZW50LmlzVHJlZU5vZGUpIHsKKwkJCXRoaXMuZXhwYW5kKG5ld1BhcmVudCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0sCisKKwlkb01vdmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisJCWNoaWxkLnRyZWUubW92ZShjaGlsZCwgbmV3UGFyZW50LCBpbmRleCk7CisKKwkJcmV0dXJuIHRydWU7CisJfSwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSByZW1vdmVOb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisJY2FuUmVtb3ZlTm9kZTogZnVuY3Rpb24oY2hpbGQpIHsKKwkJaWYgKGNoaWxkLmFjdGlvbklzRGlzYWJsZWQoY2hpbGQuYWN0aW9ucy5SRU1PVkUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisKKwlyZW1vdmVOb2RlOiBmdW5jdGlvbihub2RlLCBjYWxsT2JqLCBjYWxsRnVuYykgeworCQlpZiAoIXRoaXMuY2FuUmVtb3ZlTm9kZShub2RlKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZG9SZW1vdmVOb2RlKG5vZGUsIGNhbGxPYmosIGNhbGxGdW5jKTsKKwl9LAorCisKKwlkb1JlbW92ZU5vZGU6IGZ1bmN0aW9uKG5vZGUsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisJCW5vZGUudHJlZS5yZW1vdmVOb2RlKG5vZGUpOworCisJCWlmIChjYWxsRnVuYykgeworCQkJY2FsbEZ1bmMuYXBwbHkoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGNhbGxPYmopID8gdGhpcyA6IGNhbGxPYmosIFtub2RlXSk7CisJCX0KKwl9LAorCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgbm9kZSBzdHVmZgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCWNhbkNyZWF0ZUNoaWxkOiBmdW5jdGlvbihwYXJlbnQsIGluZGV4LCBkYXRhKSB7CisJCWlmIChwYXJlbnQuYWN0aW9uSXNEaXNhYmxlZChwYXJlbnQuYWN0aW9ucy5BRERDSElMRCkpIHJldHVybiBmYWxzZTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisKKwkvKiBzZW5kIGRhdGEgdG8gc2VydmVyIGFuZCBhZGQgY2hpbGQgZnJvbSBzZXJ2ZXIgKi8KKwkvKiBkYXRhIG1heSBjb250YWluIGFuIGFsbW9zdCByZWFkeSBjaGlsZCwgb3IgYW55dGhpbmcgZWxzZSwgc3VnZ2VzdGVkIHRvIHNlcnZlciAqLworCS8qaW4gUlBDIGNvbnRyb2xsZXJzIHNlcnZlciByZXNwb25kcyB3aXRoIGNoaWxkIGRhdGEgdG8gYmUgaW5zZXJ0ZWQgKi8KKwljcmVhdGVDaGlsZDogZnVuY3Rpb24ocGFyZW50LCBpbmRleCwgZGF0YSwgY2FsbE9iaiwgY2FsbEZ1bmMpIHsKKwkJaWYgKCF0aGlzLmNhbkNyZWF0ZUNoaWxkKHBhcmVudCwgaW5kZXgsIGRhdGEpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdGhpcy5kb0NyZWF0ZUNoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfSwKKworCWRvQ3JlYXRlQ2hpbGQ6IGZ1bmN0aW9uKHBhcmVudCwgaW5kZXgsIGRhdGEsIGNhbGxPYmosIGNhbGxGdW5jKSB7CisKKwkJdmFyIHdpZGdldFR5cGUgPSBkYXRhLndpZGdldFR5cGUgPyBkYXRhLndpZGdldFR5cGUgOiAiVHJlZU5vZGUiOworCisJCXZhciBuZXdDaGlsZCA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCh3aWRnZXRUeXBlLCBkYXRhKTsKKworCQlwYXJlbnQuYWRkQ2hpbGQobmV3Q2hpbGQsIGluZGV4KTsKKworCQl0aGlzLmV4cGFuZChwYXJlbnQpOworCisJCWlmIChjYWxsRnVuYykgeworCQkJY2FsbEZ1bmMuYXBwbHkoY2FsbE9iaiwgW25ld0NoaWxkXSk7CisJCX0KKworCQlyZXR1cm4gbmV3Q2hpbGQ7CisJfQorCisKKworfSk7CisKKy8qKgorICogVHJlZSBtb2RlbCBkb2VzIGFsbCB0aGUgZHJhd2luZywgdmlzdWFsIG5vZGUgbWFuYWdlbWVudCBldGMuCisgKiBUaHJvd3MgZXZlbnRzIGFib3V0IGNsaWNrcyBvbiBpdCwgc28gc29tZW9uZSBtYXkgY2F0Y2ggdGhlbSBhbmQgcHJvY2VzcworICogVHJlZSBrbm93cyBub3RoaW5nIGFib3V0IERuRCBzdHVmZiwgY292ZXJlZCBpbiBUcmVlRHJhZ0FuZERyb3AgYW5kIChpZiBlbmFibGVkKSBhdHRhY2hlZCBieSBjb250cm9sbGVyCisqLworCisvKioKKyAqIFRPRE86IHVzZSBkb21Ob2RlLmNsb25lTm9kZSBpbnN0ZWFkIG9mIGNyZWF0ZUVsZW1lbnQgZm9yIGdyaWQKKyAqIFNob3VsZCBiZSBmYXN0ZXIgKGx5eHN1cykKKyAqLworZG9qby5wcm92aWRlKCJkb2pvLndpZGdldC5UcmVlIik7CisKKworCisKKworCisKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgiZG9qby53aWRnZXQuVHJlZSIsIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQsIGZ1bmN0aW9uKCkgeworCXRoaXMuZXZlbnROYW1lcyA9IHt9OworCisJdGhpcy50cmVlID0gdGhpczsKKwl0aGlzLkROREFjY2VwdFR5cGVzID0gW107CisJdGhpcy5hY3Rpb25zRGlzYWJsZWQgPSBbXTsKKworfSwKK3sKKwl3aWRnZXRUeXBlOiAiVHJlZSIsCisKKwlldmVudE5hbWVzRGVmYXVsdDogeworCQkvLyBuZXcgY2hpbGQgZG9lcyBub3QgZ2V0IGRvbU5vZGUgZmlsbGVkIGluIChvbmx5IHRlbXBsYXRlIGRyYWZ0KQorCQkvLyB1bnRpbCBhZGRDaGlsZC0+Y3JlYXRlRE9NTm9kZSBpcyBjYWxsZWQocHJvZ3JhbSB3YXkpIE9SIGNyZWF0ZURPTU5vZGUgKGh0bWwtd2F5KQorCQkvLyBob29rIGV2ZW50cyB0byBvcGVyYXRlIG9uIG5ldyBET01Ob2RlLCBjcmVhdGUgZHJvcFRhcmdldHMgZXRjCisJCWNyZWF0ZURPTU5vZGU6ICJjcmVhdGVET01Ob2RlIiwKKwkJLy8gdHJlZSBjcmVhdGVkLi4gUGVyZm9ybSB0cmVlLXdpZGUgYWN0aW9ucyBpZiBuZWVkZWQKKwkJdHJlZUNyZWF0ZTogInRyZWVDcmVhdGUiLAorCQl0cmVlRGVzdHJveTogInRyZWVEZXN0cm95IiwKKwkJLy8gZXhwYW5kIGljb24gY2xpY2tlZAorCQl0cmVlQ2xpY2s6ICJ0cmVlQ2xpY2siLAorCQkvLyBub2RlIGljb24gY2xpY2tlZAorCQlpY29uQ2xpY2s6ICJpY29uQ2xpY2siLAorCQkvLyBub2RlIHRpdGxlIGNsaWNrZWQKKwkJdGl0bGVDbGljazogInRpdGxlQ2xpY2siLAorCisJCW1vdmVGcm9tOiAibW92ZUZyb20iLAorCQltb3ZlVG86ICJtb3ZlVG8iLAorCQlhZGRDaGlsZDogImFkZENoaWxkIiwKKwkJcmVtb3ZlTm9kZTogInJlbW92ZU5vZGUiLAorCQlleHBhbmQ6ICJleHBhbmQiLAorCQljb2xsYXBzZTogImNvbGxhcHNlIgorCX0sCisKKwlpc0NvbnRhaW5lcjogdHJ1ZSwKKworCURORE1vZGU6ICJvZmYiLAorCisJbG9ja0xldmVsOiAwLCAvLyBsb2NrICsrIHVubG9jayAtLSwgc28gbmVzdGVkIGxvY2tpbmcgd29ya3MgZmluZQorCisJc3RyaWN0Rm9sZGVyczogdHJ1ZSwKKworCURORE1vZGVzOiB7CisJCUJFVFdFRU46IDEsCisJCU9OVE86IDIKKwl9LAorCisJRE5EQWNjZXB0VHlwZXM6ICIiLAorCisJdGVtcGxhdGVDc3NTdHJpbmc6IlxyXG4uZG9qb1RyZWUge1xyXG5cdGZvbnQ6IGNhcHRpb247XHJcblx0Zm9udC1zaXplOiAxMXB4O1xyXG5cdGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcblx0b3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcblxyXG4uZG9qb1RyZWVOb2RlTGFiZWxUaXRsZSB7XHJcblx0cGFkZGluZy1sZWZ0OiAycHg7XHJcblx0Y29sb3I6IFdpbmRvd1RleHQ7XHJcbn1cclxuXHJcbi5kb2pvVHJlZU5vZGVMYWJlbCB7XHJcblx0Y3Vyc29yOmhhbmQ7XHJcblx0Y3Vyc29yOnBvaW50ZXI7XHJcbn1cclxuXHJcbi5kb2pvVHJlZU5vZGVMYWJlbFRpdGxlOmhvdmVyIHtcclxuXHR0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcclxufVxyXG5cclxuLmRvam9UcmVlTm9kZUxhYmVsU2VsZWN0ZWQge1xyXG5cdGJhY2tncm91bmQtY29sb3I6IEhpZ2hsaWdodDtcclxuXHRjb2xvcjogSGlnaGxpZ2h0VGV4dDtcclxufVxyXG5cclxuLmRvam9UcmVlIGRpdiB7XHJcblx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcclxufVxyXG5cclxuLmRvam9UcmVlIGltZywgLmRvam9UcmVlTm9kZUxhYmVsIGltZyB7XHJcblx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxufVxyXG5cclxuIix0ZW1wbGF0ZUNzc1BhdGg6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL1RyZWUuY3NzIiksCisKKwl0ZW1wbGF0ZVN0cmluZzogJzxkaXYgY2xhc3M9ImRvam9UcmVlIj48L2Rpdj4nLAorCisJaXNFeHBhbmRlZDogdHJ1ZSwgLy8gY29uc2lkZXIgdGhpcyAicm9vdCBub2RlIiB0byBiZSBhbHdheXMgZXhwYW5kZWQKKworCWlzVHJlZTogdHJ1ZSwKKworCW9iamVjdElkOiAiIiwKKworCS8vIGF1dG9DcmVhdGUgaWYgbm90ICJvZmYiCisJLy8gdXNlZCB0byBnZXQgdGhlIGF1dG9jcmVhdGVkIGNvbnRyb2xsZXIgT05MWS4KKwkvLyBnZW5lcmFsbHksIHRyZWUgRE9FUyBOT1QgS05PVyBhYm91dCBpdHMgQ09OVFJPTExFUiwgaXQganVzdCBkb2Vzbid0IGNhcmUKKwkvLyBjb250cm9sbGVyIGdldHMgbWVzc2FnZXMgdmlhIGRvam8uZXZlbnQKKwljb250cm9sbGVyOiAiIiwKKworCS8vIGF1dG9DcmVhdGUgaWYgbm90ICJvZmYiCisJLy8gdXNlZCB0byBnZXQgdGhlIGF1dG9jcmVhdGVkIHNlbGVjdG9yIE9OTFkuCisJLy8gZ2VuZXJhbGx5LCB0cmVlIERPRVMgTk9UIEtOT1cgaXRzIFNFTEVDVE9SCisJLy8gYmluZGluZyBpcyBtYWRlIHdpdGggZG9qby5ldmVudAorCXNlbGVjdG9yOiAiIiwKKworCS8vIHVzZWQgT05MWSBhdCBpbml0aWFsaXphdGlvbiB0aW1lCisJbWVudTogIiIsIC8vIGF1dG9iaW5kIG1lbnUgaWYgbWVudSdzIHdpZGdldElkIGlzIHNldCBoZXJlCisKKwlleHBhbmRMZXZlbDogIiIsIC8vIGV4cGFuZCB0byBsZXZlbCBhdXRvbWF0aWNhbGx5CisKKwkvLworCS8vIHRoZXNlIGljb25zIGNvbnRyb2wgdGhlIGdyaWQgYW5kIGV4cGFuZG8gYnV0dG9ucyBmb3IgdGhlIHdob2xlIHRyZWUKKwkvLworCisJYmxhbmtJY29uU3JjOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ibGFuay5naWYiKSwKKworCWdyaWRJY29uU3JjVDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF90LmdpZiIpLCAvLyBmb3Igbm9uLWxhc3QgY2hpbGQgZ3JpZAorCWdyaWRJY29uU3JjTDogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfZ3JpZF9sLmdpZiIpLCAvLyBmb3IgbGFzdCBjaGlsZCBncmlkCisJZ3JpZEljb25TcmNWOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3YuZ2lmIiksIC8vIHZlcnRpY2FsIGxpbmUKKwlncmlkSWNvblNyY1A6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2dyaWRfcC5naWYiKSwgLy8gZm9yIHVuZGVyIHBhcmVudCBpdGVtIGNoaWxkIGljb25zCisJZ3JpZEljb25TcmNDOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX2MuZ2lmIiksIC8vIGZvciB1bmRlciBjaGlsZCBpdGVtIGNoaWxkIGljb25zCisJZ3JpZEljb25TcmNYOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3guZ2lmIiksIC8vIGdyaWQgZm9yIHNvbGUgcm9vdCBpdGVtCisJZ3JpZEljb25TcmNZOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3kuZ2lmIiksIC8vIGdyaWQgZm9yIGxhc3QgcnJvdCBpdGVtCisJZ3JpZEljb25TcmNaOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9ncmlkX3ouZ2lmIiksIC8vIGZvciB1bmRlciByb290IHBhcmVudCBpdGVtIGNoaWxkIGljb24KKworCWV4cGFuZEljb25TcmNQbHVzOiBkb2pvLnVyaS5tb2R1bGVVcmkoImRvam8ud2lkZ2V0IiwgInRlbXBsYXRlcy9pbWFnZXMvVHJlZS90cmVlbm9kZV9leHBhbmRfcGx1cy5naWYiKSwKKwlleHBhbmRJY29uU3JjTWludXM6IGRvam8udXJpLm1vZHVsZVVyaSgiZG9qby53aWRnZXQiLCAidGVtcGxhdGVzL2ltYWdlcy9UcmVlL3RyZWVub2RlX2V4cGFuZF9taW51cy5naWYiKSwKKwlleHBhbmRJY29uU3JjTG9hZGluZzogZG9qby51cmkubW9kdWxlVXJpKCJkb2pvLndpZGdldCIsICJ0ZW1wbGF0ZXMvaW1hZ2VzL1RyZWUvdHJlZW5vZGVfbG9hZGluZy5naWYiKSwKKworCisJaWNvbldpZHRoOiAxOCwKKwlpY29uSGVpZ2h0OiAxOCwKKworCisJLy8KKwkvLyB0cmVlIG9wdGlvbnMKKwkvLworCisJc2hvd0dyaWQ6IHRydWUsCisJc2hvd1Jvb3RHcmlkOiB0cnVlLAorCisJYWN0aW9uSXNEaXNhYmxlZDogZnVuY3Rpb24oYWN0aW9uKSB7CisJCXZhciBfdGhpcyA9IHRoaXM7CisJCXJldHVybiBkb2pvLmxhbmcuaW5BcnJheShfdGhpcy5hY3Rpb25zRGlzYWJsZWQsIGFjdGlvbikKKwl9LAorCisKKwlhY3Rpb25zOiB7CisgICAgCUFERENISUxEOiAiQUREQ0hJTEQiCisJfSwKKworCisJZ2V0SW5mbzogZnVuY3Rpb24oKSB7CisJCXZhciBpbmZvID0geworCQkJd2lkZ2V0SWQ6IHRoaXMud2lkZ2V0SWQsCisJCQlvYmplY3RJZDogdGhpcy5vYmplY3RJZAorCQl9CisKKwkJcmV0dXJuIGluZm87CisJfSwKKworCWluaXRpYWxpemVDb250cm9sbGVyOiBmdW5jdGlvbigpIHsKKwkJaWYgKHRoaXMuY29udHJvbGxlciAhPSAib2ZmIikgeworCQkJaWYgKHRoaXMuY29udHJvbGxlcikgeworCQkJCXRoaXMuY29udHJvbGxlciA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5jb250cm9sbGVyKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRyb2xsZXIgaGVyZQorCQkJCQorCQkJCXRoaXMuY29udHJvbGxlciA9IGRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgiVHJlZUJhc2ljQ29udHJvbGxlciIsCisJCQkJCXsgRE5EQ29udHJvbGxlcjogKHRoaXMuRE5ETW9kZSA/ICJjcmVhdGUiIDogIiIpLCBkaWVXaXRoVHJlZTogdHJ1ZSB9CisJCQkJICk7CisKKwkJCX0KKwkJCXRoaXMuY29udHJvbGxlci5saXN0ZW5UcmVlKHRoaXMpOyAvLyBjb250cm9sbGVyIGxpc3RlbnMgdG8gbXkgZXZlbnRzCisKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY29udHJvbGxlciA9IG51bGw7CisJCX0KKwl9LAorCisJaW5pdGlhbGl6ZVNlbGVjdG9yOiBmdW5jdGlvbigpIHsKKworCQlpZiAodGhpcy5zZWxlY3RvciAhPSAib2ZmIikgeworCQkJaWYgKHRoaXMuc2VsZWN0b3IpIHsKKwkJCQl0aGlzLnNlbGVjdG9yID0gZG9qby53aWRnZXQuYnlJZCh0aGlzLnNlbGVjdG9yKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRyb2xsZXIgaGVyZQorCQkJCQorCQkJCXRoaXMuc2VsZWN0b3IgPSBkb2pvLndpZGdldC5jcmVhdGVXaWRnZXQoIlRyZWVTZWxlY3RvciIsIHtkaWVXaXRoVHJlZTogdHJ1ZX0pOworCQkJfQorCisJCQl0aGlzLnNlbGVjdG9yLmxpc3RlblRyZWUodGhpcyk7CisKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2VsZWN0b3IgPSBudWxsOworCQl9CisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGFyZ3MsIGZyYWcpeworCisJCXZhciBfdGhpcyA9IHRoaXM7CisKKwkJZm9yKG5hbWUgaW4gdGhpcy5ldmVudE5hbWVzRGVmYXVsdCkgeworCQkJaWYgKGRvam8ubGFuZy5pc1VuZGVmaW5lZCh0aGlzLmV2ZW50TmFtZXNbbmFtZV0pKSB7CisJCQkJdGhpcy5ldmVudE5hbWVzW25hbWVdID0gdGhpcy53aWRnZXRJZCsiLyIrdGhpcy5ldmVudE5hbWVzRGVmYXVsdFtuYW1lXTsKKwkJCX0KKwkJfQorCisJCWZvcih2YXIgaT0wOyBpPHRoaXMuYWN0aW9uc0Rpc2FibGVkLmxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLmFjdGlvbnNEaXNhYmxlZFtpXSA9IHRoaXMuYWN0aW9uc0Rpc2FibGVkW2ldLnRvVXBwZXJDYXNlKCk7CisJCX0KKworCQlpZiAodGhpcy5ETkRNb2RlID09ICJvZmYiKSB7CisJCQl0aGlzLkRORE1vZGUgPSAwOworCQl9IGVsc2UgaWYgKHRoaXMuRE5ETW9kZSA9PSAiYmV0d2VlbiIpIHsKKwkJCXRoaXMuRE5ETW9kZSA9IHRoaXMuRE5ETW9kZXMuT05UTyB8IHRoaXMuRE5ETW9kZXMuQkVUV0VFTjsKKwkJfSBlbHNlIGlmICh0aGlzLkRORE1vZGUgPT0gIm9udG8iKSB7CisJCQl0aGlzLkRORE1vZGUgPSB0aGlzLkRORE1vZGVzLk9OVE87CisJCX0KKworCQl0aGlzLmV4cGFuZExldmVsID0gcGFyc2VJbnQodGhpcy5leHBhbmRMZXZlbCk7CisKKwkJdGhpcy5pbml0aWFsaXplU2VsZWN0b3IoKTsKKwkJdGhpcy5pbml0aWFsaXplQ29udHJvbGxlcigpOworCisJCWlmICh0aGlzLm1lbnUpIHsKKwkJCXRoaXMubWVudSA9IGRvam8ud2lkZ2V0LmJ5SWQodGhpcy5tZW51KTsKKwkJCXRoaXMubWVudS5saXN0ZW5UcmVlKHRoaXMpOworCQl9CisKKworCQl0aGlzLmNvbnRhaW5lck5vZGUgPSB0aGlzLmRvbU5vZGU7CisKKwl9LAorCisKKwlwb3N0Q3JlYXRlOiBmdW5jdGlvbigpIHsKKwkJdGhpcy5jcmVhdGVET01Ob2RlKCk7CisJfSwKKworCisJY3JlYXRlRE9NTm9kZTogZnVuY3Rpb24oKSB7CisKKwkJZG9qby5odG1sLmRpc2FibGVTZWxlY3Rpb24odGhpcy5kb21Ob2RlKTsKKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKwkJCXRoaXMuY2hpbGRyZW5baV0ucGFyZW50ID0gdGhpczsgLy8gcm9vdCBub2RlcyBoYXZlIHRyZWUgYXMgcGFyZW50CisKKwkJCXZhciBub2RlID0gdGhpcy5jaGlsZHJlbltpXS5jcmVhdGVET01Ob2RlKHRoaXMsIDApOworCisKKwkJCXRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwkJfQorCisKKwkJaWYgKCF0aGlzLnNob3dSb290R3JpZCl7CisJCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKwkJCQl0aGlzLmNoaWxkcmVuW2ldLmV4cGFuZCgpOworCQkJfQorCQl9CisKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMuZXZlbnROYW1lcy50cmVlQ3JlYXRlLCB7IHNvdXJjZTogdGhpcyB9ICk7CisKKwl9LAorCisKKwlkZXN0cm95OiBmdW5jdGlvbigpIHsKKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRoaXMudHJlZS5ldmVudE5hbWVzLnRyZWVEZXN0cm95LCB7IHNvdXJjZTogdGhpcyB9ICk7CisKKwkJcmV0dXJuIGRvam8ud2lkZ2V0Lkh0bWxXaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LAorCisKKwlhZGRDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KSB7CisKKy8vCQlkb2pvLmRlYnVnKCJkb0FkZENoaWxkICIraW5kZXgrIiBjYWxsZWQgZm9yICIrY2hpbGQpOworCisJCXZhciBtZXNzYWdlID0geworCQkJY2hpbGQ6IGNoaWxkLAorCQkJaW5kZXg6IGluZGV4LAorCQkJcGFyZW50OiB0aGlzLAorCQkJLy8gcmVtZW1iZXIgaWYgZG9tIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkCisJCQkvLyBpbml0aWFsaXplZCA9PiBubyBjcmVhdGVET01Ob2RlID0+IG5vIGNyZWF0ZURPTU5vZGUgZXZlbnQKKwkJCWRvbU5vZGVJbml0aWFsaXplZDogY2hpbGQuZG9tTm9kZUluaXRpYWxpemVkCisJCX0KKworCQl0aGlzLmRvQWRkQ2hpbGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCQlkb2pvLmV2ZW50LnRvcGljLnB1Ymxpc2godGhpcy50cmVlLmV2ZW50TmFtZXMuYWRkQ2hpbGQsIG1lc3NhZ2UpOworCX0sCisKKworCS8vIG5vdCBjYWxsZWQgZm9yIGluaXRpYWwgdHJlZSBidWlsZGluZy4gU2VlIGNyZWF0ZURPTU5vZGUgaW5zdGVhZC4KKwkvLyBidWlsZHMgY2hpbGQgaHRtbCBub2RlIGlmIG5lZWRlZAorCS8vIGluZGV4IGlzICJsYXN0IG5vZGUiIGJ5IGRlZmF1bHQKKwkvKioKKwkgKiBGSVhNRTogSXMgaXQgcG9zc2libGUgdGhhdCByZW1vdmVOb2RlIGZyb20gdGhlIHRyZWUgd2lsbCBjYXVzZSBsZWFrcyBjYXVzZSBvZiBhdHRhY2hlZCBldmVudHMgPworCSAqIGlmIHllcywgdGhlbiBvbmx5IGF0dGFjaCBldmVudHMgaW4gYWRkQ2hpbGQgYW5kIGRldGFjaCBpbiByZW1vdmUuLiBTZWVtcyBhbGwgb2sgeWV0LgorCSovCisJZG9BZGRDaGlsZDogZnVuY3Rpb24oY2hpbGQsIGluZGV4KXsKKworCQlpZiAoZG9qby5sYW5nLmlzVW5kZWZpbmVkKGluZGV4KSkgeworCQkJaW5kZXggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKKwkJfQorCisJCWlmICghY2hpbGQuaXNUcmVlTm9kZSl7CisJCQlkb2pvLnJhaXNlKCJZb3UgY2FuIG9ubHkgYWRkIFRyZWVOb2RlIHdpZGdldHMgdG8gYSAiK3RoaXMud2lkZ2V0VHlwZSsiIHdpZGdldCEiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIHVzdWFsbHkgaXQgaXMgaW1wb3NzaWJsZSB0byBjaGFuZ2UgImlzRm9sZGVyIiBzdGF0ZSwgYnV0IGlmIGFueW9uZSB3YW50cyB0byBhZGQgYSBjaGlsZCB0byBsZWFmLAorCQkvLyBpdCBpcyBwb3NzaWJsZSBwcm9ncmFtLXdheS4KKwkJaWYgKHRoaXMuaXNUcmVlTm9kZSl7CisJCQlpZiAoIXRoaXMuaXNGb2xkZXIpIHsgLy8ganVzdCBiZWNhbWUgYSBmb2xkZXIuCisJCQkJLy9kb2pvLmRlYnVnKCJiZWNvbWluZyBmb2xkZXIgIit0aGlzKTsKKwkJCQl0aGlzLnNldEZvbGRlcigpOworCQkJfQorCQl9CisKKwkJLy8gYWRqdXN0IHRyZWUKKwkJdmFyIF90aGlzID0gdGhpczsKKwkJZG9qby5sYW5nLmZvckVhY2goY2hpbGQuZ2V0RGVzY2VuZGFudHMoKSwgZnVuY3Rpb24oZWxlbSkgeyBlbGVtLnRyZWUgPSBfdGhpcy50cmVlOyB9KTsKKworCQkvLyBmaXggcGFyZW50CisJCWNoaWxkLnBhcmVudCA9IHRoaXM7CisKKworCQkvLyBubyBkeW5hbWljIGxvYWRpbmcgZm9yIHRob3NlIHdobyBiZWNvbWUgcGFyZW50cworCQlpZiAodGhpcy5pc1RyZWVOb2RlKSB7CisJCQl0aGlzLnN0YXRlID0gdGhpcy5sb2FkU3RhdGVzLkxPQURFRDsKKwkJfQorCisJCS8vIGFkZCBuZXcgY2hpbGQgaW50byBET00gYWZ0ZXIgaXQgd2FzIGFkZGVkIGludG8gY2hpbGRyZW4KKwkJaWYgKGluZGV4IDwgdGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsgLy8gY2hpbGRyZW5bXSBhbHJlYWR5IGhhcyBjaGlsZAorCQkJLy9kb2pvLmRlYnVnKCJJbnNlcnRpbmcgYmVmb3JlICIrdGhpcy5jaGlsZHJlbltpbmRleF0udGl0bGUpOworCQkJZG9qby5odG1sLmluc2VydEJlZm9yZShjaGlsZC5kb21Ob2RlLCB0aGlzLmNoaWxkcmVuW2luZGV4XS5kb21Ob2RlKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZC5kb21Ob2RlKTsKKwkJCWlmICh0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5pc1RyZWVOb2RlKSB7CisJCQkJLyogV2hlbiBJIGFkZCBjaGlsZHJlbiB0byBoaWRkZW4gY29udGFpbmVyTm9kZSA9PiBzaG93IGNvbnRhaW5lciB3LyB0aGVtICovCisJCQkJdGhpcy5zaG93Q2hpbGRyZW4oKTsKKwkJCX0KKwkJfQorCisKKwkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKKworCQkvL2Rvam8uZGVidWdTaGFsbG93KHRoaXMuY2hpbGRyZW4pOworCisKKwkJLy8gaWYgbm9kZSBleGlzdHMgLSBhZGp1c3QgaXRzIGRlcHRoLCBvdGhlcndpc2UgYnVpbGQgaXQKKwkJaWYgKGNoaWxkLmRvbU5vZGVJbml0aWFsaXplZCkgeworCQkJdmFyIGQgPSB0aGlzLmlzVHJlZU5vZGUgPyB0aGlzLmRlcHRoIDogLTE7CisJCQljaGlsZC5hZGp1c3REZXB0aCggZCAtIGNoaWxkLmRlcHRoICsgMSApOworCisKKwkJCS8vIHVwZGF0ZSBpY29ucyB0byBsaW5rIGdlbmVyYXRlZCBkb20gd2l0aCBUcmVlID0+IHVwZGF0ZVBhcmVudEdyaWQKKwkJCS8vIGlmIEkgbW92ZWQgY2hpbGQgZnJvbSBMYXN0Tm9kZSBpbnNpZGUgdGhlIHRyZWUgPT4gbmVlZCB0byBsaW5rIGl0IHVwJ24nZG93biA9PgorCQkJLy8gdXBkYXRlRXhwYW5kR3JpZENvbHVtbgorCQkJLy8gaWYgSSBjaGFuZ2UgZGVwdGggPT4gbmVlZCB0byB1cGRhdGUgYWxsIGdyaWQuLgorCQkJY2hpbGQudXBkYXRlSWNvblRyZWUoKTsKKwkJfSBlbHNlIHsKKwkJCS8vZG9qby5kZWJ1ZygiQ3JlYXRlIGRvbW5vZGUgIik7CisJCQljaGlsZC5kZXB0aCA9IHRoaXMuaXNUcmVlTm9kZSA/IHRoaXMuZGVwdGgrMSA6IDA7CisJCQljaGlsZC5jcmVhdGVET01Ob2RlKGNoaWxkLnRyZWUsIGNoaWxkLmRlcHRoKTsKKwkJfQorCisKKworCQkvLyBVc2UtY2FzZToKKwkJLy8gV2hlbiBwcmV2aW91cyBzaWJsaW5nIHdhcyBjcmVhdGVkID0+IGl0IHdhcyBsYXN0LCBubyBjaGlsZHJlbiBhZnRlciBpdAorCQkvLyBzbyBpdCBkaWQgbm90IGNyZWF0ZSBsaW5rIGRvd24gPT4gbGV0J3MgYWRkIGl0IGZvciBhbGwgZGVzY2VuZGFudHMKKwkJLy8gVXNlLWNhc2U6CisJCS8vIGEgY2hpbGQgd2FzIG1vdmVkIGRvd24gdW5kZXIgdGhlIGxhc3Qgbm9kZSBzbyBsYXN0IG5vZGUgc2hvdWxkIGJlIHVwZGF0ZWQKKwkJdmFyIHByZXZTaWJsaW5nID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisJCWlmIChjaGlsZC5pc0xhc3RDaGlsZCgpICYmIHByZXZTaWJsaW5nKSB7CisJCQlwcmV2U2libGluZy51cGRhdGVFeHBhbmRHcmlkQ29sdW1uKCk7CisJCX0KKworCisJCS8vZG9qby5kZWJ1ZygiQWRkZWQgY2hpbGQgIitjaGlsZCk7CisKKworCisJfSwKKworCisKKworCW1ha2VCbGFua0ltZzogZnVuY3Rpb24oKSB7CisJCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKKworCQlpbWcuc3R5bGUud2lkdGggPSB0aGlzLmljb25XaWR0aCArICdweCc7CisJCWltZy5zdHlsZS5oZWlnaHQgPSB0aGlzLmljb25IZWlnaHQgKyAncHgnOworCQlpbWcuc3JjID0gdGhpcy5ibGFua0ljb25TcmM7CisJCWltZy5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ21pZGRsZSc7CisKKwkJcmV0dXJuIGltZzsKKwl9LAorCisKKwl1cGRhdGVJY29uVHJlZTogZnVuY3Rpb24oKXsKKworCQkvL2Rvam8uZGVidWcoIlVwZGF0ZSBpY29ucyBmb3IgIit0aGlzKQorCQlpZiAoIXRoaXMuaXNUcmVlKSB7CisJCQl0aGlzLnVwZGF0ZUljb25zKCk7CisJCX0KKworCQlmb3IodmFyIGk9MDsgaTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKKwkJCXRoaXMuY2hpbGRyZW5baV0udXBkYXRlSWNvblRyZWUoKTsKKwkJfQorCisJfSwKKworCXRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuICJbIit0aGlzLndpZGdldFR5cGUrIiBJRDoiK3RoaXMud2lkZ2V0SWQrIl0iCisJfSwKKworCisKKworCS8qKgorCSAqIE1vdmUgY2hpbGQgdG8gbmV3UGFyZW50IGFzIGxhc3QgY2hpbGQKKwkgKiByZWRyYXcgdHJlZSBhbmQgdXBkYXRlIGljb25zLgorCSAqCisJICogQ2FsbGVkIGJ5IHRhcmdldCwgc2F2ZXMgc291cmNlIGluIGV2ZW50LgorCSAqIGV2ZW50cyBhcmUgcHVibGlzaGVkIGZvciBCT1RIIHRyZWVzIEFGVEVSIHVwZGF0ZS4KKwkqLworCW1vdmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXdQYXJlbnQsIGluZGV4KSB7CisKKwkJLy9kb2pvLmRlYnVnKGNoaWxkKyIgIituZXdQYXJlbnQrIiBhdCAiK2luZGV4KTsKKworCQl2YXIgb2xkUGFyZW50ID0gY2hpbGQucGFyZW50OworCQl2YXIgb2xkVHJlZSA9IGNoaWxkLnRyZWU7CisKKwkJdGhpcy5kb01vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCQl2YXIgbmV3UGFyZW50ID0gY2hpbGQucGFyZW50OworCQl2YXIgbmV3VHJlZSA9IGNoaWxkLnRyZWU7CisKKwkJdmFyIG1lc3NhZ2UgPSB7CisJCQkJb2xkUGFyZW50OiBvbGRQYXJlbnQsIG9sZFRyZWU6IG9sZFRyZWUsCisJCQkJbmV3UGFyZW50OiBuZXdQYXJlbnQsIG5ld1RyZWU6IG5ld1RyZWUsCisJCQkJY2hpbGQ6IGNoaWxkCisJCX07CisKKwkJLyogcHVibGlzaCBldmVudHMgaGVyZSBhYm91dCBzdHJ1Y3R1cmFsIGNoYW5nZXMgZm9yIGJvdGggc291cmNlIGFuZCB0YXJnZXQgdHJlZXMgKi8KKwkJZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKG9sZFRyZWUuZXZlbnROYW1lcy5tb3ZlRnJvbSwgbWVzc2FnZSk7CisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaChuZXdUcmVlLmV2ZW50TmFtZXMubW92ZVRvLCBtZXNzYWdlKTsKKworCX0sCisKKworCS8qIGRvIGFjdHVhbCBwYXJlbnQgY2hhbmdlIGhlcmUuIFdyaXRlIHJlbW92ZSBjaGlsZCBmaXJzdCAqLworCWRvTW92ZTogZnVuY3Rpb24oY2hpbGQsIG5ld1BhcmVudCwgaW5kZXgpIHsKKwkJLy92YXIgcGFyZW50ID0gY2hpbGQucGFyZW50OworCQljaGlsZC5wYXJlbnQuZG9SZW1vdmVOb2RlKGNoaWxkKTsKKworCQluZXdQYXJlbnQuZG9BZGRDaGlsZChjaGlsZCwgaW5kZXgpOworCX0sCisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSByZW1vdmVOb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlyZW1vdmVOb2RlOiBmdW5jdGlvbihjaGlsZCkgeworCQlpZiAoIWNoaWxkLnBhcmVudCkgcmV0dXJuOworCisJCXZhciBvbGRUcmVlID0gY2hpbGQudHJlZTsKKwkJdmFyIG9sZFBhcmVudCA9IGNoaWxkLnBhcmVudDsKKworCQl2YXIgcmVtb3ZlZENoaWxkID0gdGhpcy5kb1JlbW92ZU5vZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCisJCWRvam8uZXZlbnQudG9waWMucHVibGlzaCh0aGlzLnRyZWUuZXZlbnROYW1lcy5yZW1vdmVOb2RlLAorCQkJeyBjaGlsZDogcmVtb3ZlZENoaWxkLCB0cmVlOiBvbGRUcmVlLCBwYXJlbnQ6IG9sZFBhcmVudCB9CisJCSk7CisKKwkJcmV0dXJuIHJlbW92ZWRDaGlsZDsKKwl9LAorCisKKwlkb1JlbW92ZU5vZGU6IGZ1bmN0aW9uKGNoaWxkKSB7CisJCWlmICghY2hpbGQucGFyZW50KSByZXR1cm47CisKKwkJdmFyIHBhcmVudCA9IGNoaWxkLnBhcmVudDsKKworCQl2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW47CisKKworCQl2YXIgaW5kZXggPSBjaGlsZC5nZXRQYXJlbnRJbmRleCgpOworCQlpZiAoaW5kZXggPCAwKSB7CisJCQlkb2pvLnJhaXNlKCJDb3VsZG4ndCBmaW5kIG5vZGUgIitjaGlsZCsiIGZvciByZW1vdmFsIik7CisJCX0KKworCisJCWNoaWxkcmVuLnNwbGljZShpbmRleCwxKTsKKwkJZG9qby5odG1sLnJlbW92ZU5vZGUoY2hpbGQuZG9tTm9kZSk7CisKKwkJaWYgKHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT0gMCAmJiAhcGFyZW50LmlzVHJlZSkgeworCQkJcGFyZW50LmNvbnRhaW5lck5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwkJfQorCisJCS8vIGlmIFdBUyBsYXN0IG5vZGUgKGNoaWxkcmVuLmxlbmd0aCBkZWNyZWFzZWQgYWxyZWFkeSkgYW5kIGhhcyBwcmV2U2libGluZworCQlpZiAoaW5kZXggPT0gY2hpbGRyZW4ubGVuZ3RoICYmIGluZGV4PjApIHsKKwkJCWNoaWxkcmVuW2luZGV4LTFdLnVwZGF0ZUV4cGFuZEdyaWRDb2x1bW4oKTsKKwkJfQorCQkvLyBpZiBpdCBXQVMgZmlyc3Qgbm9kZSBpbiBXSE9MRSBUUkVFIC0KKwkJLy8gdXBkYXRlIGxpbmsgdXAgb2YgaXRzIGZvcm1lciBsb3dlciBuZWlnaGJvdXIoaWYgZXhpc3RzIHN0aWxsKQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgZG9qby53aWRnZXQuVHJlZSAmJiBpbmRleCA9PSAwICYmIGNoaWxkcmVuLmxlbmd0aD4wKSB7CisJCQljaGlsZHJlblswXS51cGRhdGVFeHBhbmRHcmlkKCk7CisJCX0KKworCQkvL3BhcmVudC51cGRhdGVJY29uVHJlZSgpOworCisKKwkJY2hpbGQucGFyZW50ID0gY2hpbGQudHJlZSA9IG51bGw7CisKKwkJcmV0dXJuIGNoaWxkOworCX0sCisKKwltYXJrTG9hZGluZzogZnVuY3Rpb24oKSB7CisJCS8vIG5vIHdheSB0byBtYXJrIHRyZWUgbG9hZGluZworCX0sCisKKwl1bk1hcmtMb2FkaW5nOiBmdW5jdGlvbigpIHsKKwkJLy8gbm8gd2F5IHRvIHNob3cgdGhhdCB0cmVlIGZpbmlzaGVkIGxvYWRpbmcKKwl9LAorCisKKwlsb2NrOiBmdW5jdGlvbigpIHsKKwkJIXRoaXMubG9ja0xldmVsICYmIHRoaXMubWFya0xvYWRpbmcoKTsKKwkJdGhpcy5sb2NrTGV2ZWwrKzsKKwl9LAorCXVubG9jazogZnVuY3Rpb24oKSB7CisJCWlmICghdGhpcy5sb2NrTGV2ZWwpIHsKKwkJCWRvam8ucmFpc2UoInVubG9jazogbm90IGxvY2tlZCIpOworCQl9CisJCXRoaXMubG9ja0xldmVsLS07CisJCSF0aGlzLmxvY2tMZXZlbCAmJiB0aGlzLnVuTWFya0xvYWRpbmcoKTsKKwl9LAorCisJaXNMb2NrZWQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgbm9kZSA9IHRoaXM7CisJCXdoaWxlICh0cnVlKSB7CisJCQlpZiAobm9kZS5sb2NrTGV2ZWwpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWlmIChub2RlIGluc3RhbmNlb2YgZG9qby53aWRnZXQuVHJlZSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJbm9kZSA9IG5vZGUucGFyZW50OworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlmbHVzaExvY2s6IGZ1bmN0aW9uKCkgeworCQl0aGlzLmxvY2tMZXZlbCA9IDA7CisJCXRoaXMudW5NYXJrTG9hZGluZygpOworCX0KK30pOworCisKKworLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWUiKTsKKworCisKK2Rvam8ud2lkZ2V0LmRlZmluZVdpZGdldCgKKyAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZSIsCisgIGRvam8ud2lkZ2V0LlRyZWUsIHsKKyAgd2lkZ2V0VHlwZSA6ICJTdHJ1dHNUcmVlIiwKKworICBocmVmIDogIiIsCisgIGVycm9yTm90aWZ5VG9waWNzIDogIiIsCisgIGVycm9yTm90aWZ5VG9waWNzQXJyYXkgOiBudWxsLAorICAKKyAgcG9zdENyZWF0ZSA6IGZ1bmN0aW9uKCkgeworICAgICBzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWUuc3VwZXJjbGFzcy5wb3N0Q3JlYXRlLmFwcGx5KHRoaXMpOworICAgICAKKyAgICAgLy9lcnJvciB0b3BpY3MKKyAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5lcnJvck5vdGlmeVRvcGljcykpIHsKKyAgICAgICB0aGlzLmVycm9yTm90aWZ5VG9waWNzQXJyYXkgPSB0aGlzLmVycm9yTm90aWZ5VG9waWNzLnNwbGl0KCIsIik7CisgICAgIH0KKyAgICAgCisgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgaWYoIWRvam8uc3RyaW5nLmlzQmxhbmsodGhpcy5ocmVmKSkgeworICAgICAgIGRvam8uaW8uYmluZCh7CisgICAgICAgIHVybDogdGhpcy5ocmVmLAorICAgICAgICB1c2VDYWNoZTogZmFsc2UsCisgICAgICAgIHByZXZlbnRDYWNoZTogdHJ1ZSwKKyAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24odHlwZSwgZGF0YSwgZSkgeworICAgICAgICAgIGlmKHR5cGUgPT0gJ2xvYWQnKSB7CisgICAgICAgICAgICAvL2RhdGEgc2hvdWxkIGJlIGFuIGFycmF5CisgICAgICAgICAgICBpZihkYXRhKSB7CisgICAgICAgICAgICAgIGRvam8ubGFuZy5mb3JFYWNoKGRhdGEsIGZ1bmN0aW9uKGRlc2NyKSB7CisgICAgICAgICAgICAgICAgLy9jcmVhdGUgbm9kZSBmb3IgZWFjaGQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0gZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiLHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlICAgOiBkZXNjci5sYWJlbCwKKyAgICAgICAgICAgICAgICAgIGlzRm9sZGVyOiBkZXNjci5oYXNDaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgIHdpZGdldElkOiBkZXNjci5pZCAgIAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHNlbGYuYWRkQ2hpbGQobmV3Tm9kZSk7CisgICAgICAgICAgICAgIH0pOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9wdWJsaXNoIGVycm9yIHRvcGljcworICAgICAgICAgICAgaWYoc2VsZi5lcnJvck5vdGlmeVRvcGljc0FycmF5KSB7CisgICAgICAgICAgICAgIGRvam8ubGFuZy5mb3JFYWNoKHNlbGYuZXJyb3JOb3RpZnlUb3BpY3NBcnJheSwgZnVuY3Rpb24odG9waWMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgZG9qby5ldmVudC50b3BpYy5wdWJsaXNoKHRvcGljLCBkYXRhLCBlLCBzZWxmKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKGV4KXsKKyAgICAgICAgICAgICAgICAgIGRvam8uZGVidWcoZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBtaW1ldHlwZTogInRleHQvanNvbiIKKyAgICAgICB9KTsKKyAgICAgfSAgIAorICB9Cit9KTsKKworLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZG9qby5rd0NvbXBvdW5kUmVxdWlyZSh7CisJY29tbW9uOiBbInN0cnV0cy53aWRnZXQuQmluZCIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQmluZERpdiIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQmluZEFuY2hvciIsCisJICAgICAgICAgInN0cnV0cy53aWRnZXQuQ29tYm9Cb3giLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RpbWVQaWNrZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c0RhdGVQaWNrZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LkJpbmRFdmVudCIsCisgICAgICAgICAgICAgInN0cnV0cy53aWRnZXQuU3RydXRzVHJlZVNlbGVjdG9yIiwKKyAgICAgICAgICAgICAic3RydXRzLndpZGdldC5TdHJ1dHNUYWJDb250YWluZXIiLAorICAgICAgICAgICAgICJzdHJ1dHMud2lkZ2V0LlN0cnV0c1RyZWVOb2RlIiwKKyAgICAgICAgICAgICAic3RydXRzLndpZGdldC5TdHJ1dHNUcmVlIl0KK30pOworZG9qby5wcm92aWRlKCJzdHJ1dHMud2lkZ2V0LioiKTsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL3RyZWUuY3NzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL3RyZWUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMmRiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvdHJlZS5jc3MKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLmRvam9UcmVlIHsKKwlmb250OiBjYXB0aW9uOworCWZvbnQtc2l6ZTogMTFweDsKKwlmb250LXdlaWdodDogbm9ybWFsOworCW92ZXJmbG93OiBhdXRvOworfQorCisuZG9qb1RyZWVOb2RlTGFiZWwgeworCXBhZGRpbmc6IDFweCAycHg7CisJY29sb3I6IFdpbmRvd1RleHQ7CisJY3Vyc29yOiBkZWZhdWx0OworfQorCisuZG9qb1RyZWVOb2RlTGFiZWw6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisuZG9qb1RyZWVOb2RlTGFiZWxTZWxlY3RlZCB7CisJYmFja2dyb3VuZC1jb2xvcjogSGlnaGxpZ2h0OworCWNvbG9yOiBIaWdobGlnaHRUZXh0OworfQorCisuZG9qb1RyZWUgZGl2IHsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisuZG9qb1RyZWUgaW1nIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9zdHJ1dHMtcGx1Z2luLnhtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvc3RydXRzLXBsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1YTJjOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvc3RydXRzLXBsdWdpbi54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8IURPQ1RZUEUgc3RydXRzIFBVQkxJQworCSItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vRFREIFN0cnV0cyBDb25maWd1cmF0aW9uIDIuMy8vRU4iCisJImh0dHA6Ly9zdHJ1dHMuYXBhY2hlLm9yZy9kdGRzL3N0cnV0cy0yLjMuZHRkIj4KKyAgICAKKzxzdHJ1dHM+CisgICAgPGJlYW4gdHlwZT0ib3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLlRhZ0xpYnJhcnlEaXJlY3RpdmVQcm92aWRlciIgbmFtZT0ic3giIGNsYXNzPSJvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5Eb2pvVGFnTGlicmFyeSIgLz4KKyAgICA8YmVhbiB0eXBlPSJvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuVGFnTGlicmFyeU1vZGVsUHJvdmlkZXIiIG5hbWU9InN4IiBjbGFzcz0ib3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuRG9qb1RhZ0xpYnJhcnkiIC8+Cis8L3N0cnV0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYS1jbG9zZS5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYS1jbG9zZS5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmYzQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9hLWNsb3NlLmZ0bApAQCAtMCwwICsxLDI2IEBACis8Iy0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8L2E+Cis8I2lmIHBhcmFtZXRlcnMucHVzaElkPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiJHtwYXJhbWV0ZXJzLmlkP2h0bWx9Iik7PC9zY3JpcHQ+Cis8LyNpZj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9hLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9hLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZiZDQzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2EuZnRsCkBAIC0wLDAgKzEsMzcgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxhIGRvam9UeXBlPSJzdHJ1dHM6QmluZEFuY2hvciIKKyAgPCNpZiBwYXJhbWV0ZXJzLnZhbGlkYXRlP2V4aXN0cz4KKyAgICB2YWxpZGF0ZT0iJHtwYXJhbWV0ZXJzLnZhbGlkYXRlP3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPCNlbHNlPgorICAgIHZhbGlkYXRlPSJmYWxzZSI8I3J0Lz4gIAorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmFqYXhBZnRlclZhbGlkYXRpb24/ZXhpc3RzPgorICAgIGFqYXhBZnRlclZhbGlkYXRpb249IiR7cGFyYW1ldGVycy5hamF4QWZ0ZXJWYWxpZGF0aW9uP3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPCNlbHNlPgorICAgIGFqYXhBZnRlclZhbGlkYXRpb249ImZhbHNlIiAgCisgIDwvI2lmPgorICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L2FqYXgvYWpheC1jb21tb24uZnRsIiAvPgorICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3NpbXBsZS9zY3JpcHRpbmctZXZlbnRzLmZ0bCIgLz4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvY29tbW9uLWF0dHJpYnV0ZXMuZnRsIiAvPgorPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2FqYXgtY29tbW9uLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9hamF4LWNvbW1vbi5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNzA2YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9hamF4LWNvbW1vbi5mdGwKQEAgLTAsMCArMSwxMDYgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKyAgPCNpZiBwYXJhbWV0ZXJzLmlkP2lmX2V4aXN0cyAhPSAiIj4KKyAgCWlkPSIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZm9ybUlkP2lmX2V4aXN0cyAhPSAiIj4KKyAgCWZvcm1JZD0iJHtwYXJhbWV0ZXJzLmZvcm1JZD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5mb3JtRmlsdGVyP2lmX2V4aXN0cyAhPSAiIj4KKyAgCWZvcm1GaWx0ZXI9IiR7cGFyYW1ldGVycy5mb3JtRmlsdGVyP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnRhYmluZGV4P2lmX2V4aXN0cyAhPSAiIj4KKyAgICB0YWJpbmRleD0iJHtwYXJhbWV0ZXJzLnRhYmluZGV4P2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmNzc0NsYXNzP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBjbGFzcz0iJHtwYXJhbWV0ZXJzLmNzc0NsYXNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmNzc1N0eWxlP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBzdHlsZT0iJHtwYXJhbWV0ZXJzLmNzc1N0eWxlP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmxhYmVsP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBsYWJlbD0iJHtwYXJhbWV0ZXJzLmxhYmVsP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnRpdGxlP2lmX2V4aXN0cyAhPSAiIj4KKyAgICB0aXRsZT0iJHtwYXJhbWV0ZXJzLnRpdGxlP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLm5hbWU/aWZfZXhpc3RzICE9ICIiPgorICAJbmFtZT0iJHtwYXJhbWV0ZXJzLm5hbWU/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuaHJlZj9pZl9leGlzdHMgIT0gIiI+CisgIAlocmVmPSIke3BhcmFtZXRlcnMuaHJlZn0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMubG9hZGluZ1RleHQ/aWZfZXhpc3RzICE9ICIiPgorICAgIGxvYWRpbmdUZXh0PSIke3BhcmFtZXRlcnMubG9hZGluZ1RleHQ/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZXJyb3JUZXh0P2lmX2V4aXN0cyAhPSAiIj4KKyAgICBlcnJvclRleHQ9IiR7cGFyYW1ldGVycy5lcnJvclRleHQ/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZXhlY3V0ZVNjcmlwdHM/ZXhpc3RzPgorICAgIGV4ZWN1dGVTY3JpcHRzPSIke3BhcmFtZXRlcnMuZXhlY3V0ZVNjcmlwdHM/c3RyaW5nP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmxpc3RlblRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisgICAgbGlzdGVuVG9waWNzPSIke3BhcmFtZXRlcnMubGlzdGVuVG9waWNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgIDwjaWYgcGFyYW1ldGVycy5ub3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICAgIG5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLm5vdGlmeVRvcGljcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5iZWZvcmVOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICAgIGJlZm9yZU5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLmJlZm9yZU5vdGlmeVRvcGljcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5hZnRlck5vdGlmeVRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisgICAgYWZ0ZXJOb3RpZnlUb3BpY3M9IiR7cGFyYW1ldGVycy5hZnRlck5vdGlmeVRvcGljcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5lcnJvck5vdGlmeVRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisgICAgZXJyb3JOb3RpZnlUb3BpY3M9IiR7cGFyYW1ldGVycy5lcnJvck5vdGlmeVRvcGljcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy50YXJnZXRzP2lmX2V4aXN0cyAhPSAiIj4KKyAgICB0YXJnZXRzPSIke3BhcmFtZXRlcnMudGFyZ2V0cz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5oYW5kbGVyP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBoYW5kbGVyPSIke3BhcmFtZXRlcnMuaGFuZGxlcj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5pbmRpY2F0b3I/aWZfZXhpc3RzICE9ICIiPgorICAgIGluZGljYXRvcj0iJHtwYXJhbWV0ZXJzLmluZGljYXRvcj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5zaG93RXJyb3JUcmFuc3BvcnRUZXh0P2V4aXN0cz4KKyAgICBzaG93RXJyb3I9IiR7cGFyYW1ldGVycy5zaG93RXJyb3JUcmFuc3BvcnRUZXh0P3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5zaG93TG9hZGluZ1RleHQ/ZXhpc3RzPgorICAgIHNob3dMb2FkaW5nPSIke3BhcmFtZXRlcnMuc2hvd0xvYWRpbmdUZXh0P3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5oaWdobGlnaHRDb2xvcj9pZl9leGlzdHMgIT0gIiI+CisgICAgaGlnaGxpZ2h0Q29sb3I9IiR7cGFyYW1ldGVycy5oaWdobGlnaHRDb2xvcj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5oaWdobGlnaHREdXJhdGlvbj9pZl9leGlzdHMgIT0gIiI+CisgICAgaGlnaGxpZ2h0RHVyYXRpb249IiR7cGFyYW1ldGVycy5oaWdobGlnaHREdXJhdGlvbj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5zZXBhcmF0ZVNjcmlwdHM/ZXhpc3RzPgorICAgIHNjcmlwdFNlcGFyYXRpb249IiR7cGFyYW1ldGVycy5zZXBhcmF0ZVNjcmlwdHM/c3RyaW5nP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnRyYW5zcG9ydD9pZl9leGlzdHMgIT0gIiI+CisgICAgdHJhbnNwb3J0PSIke3BhcmFtZXRlcnMudHJhbnNwb3J0P2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnBhcnNlQ29udGVudD9leGlzdHM+CisgICAgcGFyc2VDb250ZW50PSIke3BhcmFtZXRlcnMucGFyc2VDb250ZW50P3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2F1dG9jb21wbGV0ZXIuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2F1dG9jb21wbGV0ZXIuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDMxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYXV0b2NvbXBsZXRlci5mdGwKQEAgLTAsMCArMSwxODAgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwjaW5jbHVkZSAiLyR7cGFyYW1ldGVycy50ZW1wbGF0ZURpcn0vYWpheC9jb250cm9saGVhZGVyLmZ0bCIgLz4KKzwjaWYgcGFyYW1ldGVycy5ocmVmP2V4aXN0cz4KKyAgPGlucHV0IGRvam9UeXBlPSJzdHJ1dHM6Q29tYm9Cb3giPCNydC8+CisgIGRhdGFVcmw9IiR7cGFyYW1ldGVycy5ocmVmfSI8I3J0Lz4KKzwjZWxzZT4KKyAgPHNlbGVjdCBkb2pvVHlwZT0ic3RydXRzOkNvbWJvQm94IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuaWQ/aWZfZXhpc3RzICE9ICIiPgorIGlkPSIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5jc3NDbGFzcz9pZl9leGlzdHMgIT0gIiI+CisgY2xhc3M9IiR7cGFyYW1ldGVycy5jc3NDbGFzcz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmNzc1N0eWxlP2lmX2V4aXN0cyAhPSAiIj4KKyBzdHlsZT0iJHtwYXJhbWV0ZXJzLmNzc1N0eWxlP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuZm9yY2VWYWxpZE9wdGlvbj9leGlzdHM+CisgZm9yY2VWYWxpZE9wdGlvbj0iJHtwYXJhbWV0ZXJzLmZvcmNlVmFsaWRPcHRpb24/c3RyaW5nP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuc2VhcmNoVHlwZT9pZl9leGlzdHMgIT0gIiI+Cisgc2VhcmNoVHlwZT0iJHtwYXJhbWV0ZXJzLnNlYXJjaFR5cGU/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5hdXRvQ29tcGxldGU/ZXhpc3RzPgorIGF1dG9Db21wbGV0ZT0iJHtwYXJhbWV0ZXJzLmF1dG9Db21wbGV0ZT9zdHJpbmc/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5kZWxheT9leGlzdHM+Cisgc2VhcmNoRGVsYXk9IiR7cGFyYW1ldGVycy5kZWxheT9jfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmRpc2FibGVkP2RlZmF1bHQoZmFsc2UpPgorIGRpc2FibGVkPSJkaXNhYmxlZCI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmRyb3Bkb3duV2lkdGg/ZXhpc3RzPgorIGRyb3Bkb3duV2lkdGg9IiR7cGFyYW1ldGVycy5kcm9wZG93bldpZHRoP2N9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuZHJvcGRvd25IZWlnaHQ/ZXhpc3RzPgorIGRyb3Bkb3duSGVpZ2h0PSIke3BhcmFtZXRlcnMuZHJvcGRvd25IZWlnaHQ/Y30iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5uYW1lP2lmX2V4aXN0cyAhPSAiIj4KKyBuYW1lPSIke3BhcmFtZXRlcnMubmFtZT9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmdldCgic2l6ZSIpP2V4aXN0cz4KKyBzaXplPSIke3BhcmFtZXRlcnMuZ2V0KCJzaXplIik/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5rZXlOYW1lP2lmX2V4aXN0cyAhPSAiIj4KKyBrZXlOYW1lPSIke3BhcmFtZXRlcnMua2V5TmFtZT9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLm1heGxlbmd0aD9leGlzdHM+CisgbWF4bGVuZ3RoPSIke3BhcmFtZXRlcnMubWF4bGVuZ3RoP3N0cmluZz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLm5hbWVWYWx1ZT9pZl9leGlzdHMgIT0gIiI+CisgaW5pdGlhbFZhbHVlPSIke3BhcmFtZXRlcnMubmFtZVZhbHVlfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLm5hbWVLZXlWYWx1ZT9pZl9leGlzdHMgIT0gIiI+CisgaW5pdGlhbEtleT0iJHtwYXJhbWV0ZXJzLm5hbWVLZXlWYWx1ZX0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5yZWFkb25seT9kZWZhdWx0KGZhbHNlKT4KKyByZWFkb25seT0icmVhZG9ubHkiPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy50YWJpbmRleD9leGlzdHM+CisgdGFiaW5kZXg9IiR7cGFyYW1ldGVycy50YWJpbmRleD9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmZvcm1JZD9pZl9leGlzdHMgIT0gIiI+CisgZm9ybUlkPSIke3BhcmFtZXRlcnMuZm9ybUlkP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuZm9ybUZpbHRlcj9pZl9leGlzdHMgIT0gIiI+CisgZm9ybUZpbHRlcj0iJHtwYXJhbWV0ZXJzLmZvcm1GaWx0ZXI/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5saXN0ZW5Ub3BpY3M/aWZfZXhpc3RzICE9ICIiPgorIGxpc3RlblRvcGljcz0iJHtwYXJhbWV0ZXJzLmxpc3RlblRvcGljcz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLm5vdGlmeVRvcGljcz9pZl9leGlzdHMgIT0gIiI+Cisgbm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMubm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuYmVmb3JlTm90aWZ5VG9waWNzP2lmX2V4aXN0cyAhPSAiIj4KKyAgYmVmb3JlTm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMuYmVmb3JlTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuYWZ0ZXJOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICBhZnRlck5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLmFmdGVyTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuZXJyb3JOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICBlcnJvck5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLmVycm9yTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMudmFsdWVOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICB2YWx1ZU5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLnZhbHVlTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuaW5kaWNhdG9yP2lmX2V4aXN0cyAhPSAiIj4KKyBpbmRpY2F0b3I9IiR7cGFyYW1ldGVycy5pbmRpY2F0b3I/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5sb2FkT25UZXh0Q2hhbmdlP2RlZmF1bHQoZmFsc2UpPgorIGxvYWRPblR5cGU9IiR7cGFyYW1ldGVycy5sb2FkT25UZXh0Q2hhbmdlP3N0cmluZz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmxvYWRNaW5pbXVtQ291bnQ/ZXhpc3RzPgorIGxvYWRNaW5pbXVtPSIke3BhcmFtZXRlcnMubG9hZE1pbmltdW1Db3VudD9jfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnNob3dEb3duQXJyb3c/ZXhpc3RzPgorIHZpc2libGVEb3duQXJyb3c9IiR7cGFyYW1ldGVycy5zaG93RG93bkFycm93P3N0cmluZz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmljb25QYXRoP2lmX2V4aXN0cyAhPSAiIj4KKyBidXR0b25TcmM9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy5pY29uUGF0aH0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy50ZW1wbGF0ZUNzc1BhdGg/aWZfZXhpc3RzICE9ICIiPgorIHRlbXBsYXRlQ3NzUGF0aD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLnRlbXBsYXRlQ3NzUGF0aH0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5kYXRhRmllbGROYW1lP2lmX2V4aXN0cyAhPSAiIj4KKyBkYXRhRmllbGROYW1lPSIke3BhcmFtZXRlcnMuZGF0YUZpZWxkTmFtZT9odG1sfSIKKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnNlYXJjaExpbWl0P2lmX2V4aXN0cyAhPSAiIj4KKyBzZWFyY2hMaW1pdD0iJHtwYXJhbWV0ZXJzLnNlYXJjaExpbWl0P2h0bWx9IgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMudHJhbnNwb3J0P2lmX2V4aXN0cyAhPSAiIj4KKyAgdHJhbnNwb3J0PSIke3BhcmFtZXRlcnMudHJhbnNwb3J0P2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMucHJlbG9hZD9leGlzdHM+CisgIHByZWxvYWQ9IiR7cGFyYW1ldGVycy5wcmVsb2FkP3N0cmluZz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvc2NyaXB0aW5nLWV2ZW50cy5mdGwiIC8+Cis8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3NpbXBsZS9jb21tb24tYXR0cmlidXRlcy5mdGwiIC8+Cis8I2lmIHBhcmFtZXRlcnMuaHJlZj9leGlzdHM+CisgLz4KKzwjZWxzZT4KKyA+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5saXN0P2V4aXN0cz4KKwk8I2lmIChwYXJhbWV0ZXJzLmhlYWRlcktleT9leGlzdHMgJiYgcGFyYW1ldGVycy5oZWFkZXJWYWx1ZT9leGlzdHMpPgorCQk8b3B0aW9uIHZhbHVlPSIke3BhcmFtZXRlcnMuaGVhZGVyS2V5P2h0bWx9Ij4ke3BhcmFtZXRlcnMuaGVhZGVyVmFsdWU/aHRtbH08L29wdGlvbj4KKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMuZW1wdHlPcHRpb24/ZGVmYXVsdChmYWxzZSk+CisJICAgIDxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+CisJPC8jaWY+CisgICAgPEBzLml0ZXJhdG9yIHZhbHVlPSJwYXJhbWV0ZXJzLmxpc3QiPgorICAgIDwjaWYgcGFyYW1ldGVycy5saXN0S2V5P2V4aXN0cz4KKyAgICAJPCNhc3NpZ24gdG1wTGlzdEtleSA9IHN0YWNrLmZpbmRTdHJpbmcocGFyYW1ldGVycy5saXN0S2V5KSAvPgorICAgIDwjZWxzZT4KKyAgICAJPCNhc3NpZ24gdG1wTGlzdEtleSA9IHN0YWNrLmZpbmRTdHJpbmcoJ3RvcCcpIC8+CisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLmxpc3RWYWx1ZT9leGlzdHM+CisgICAgCTwjYXNzaWduIHRtcExpc3RWYWx1ZSA9IHN0YWNrLmZpbmRTdHJpbmcocGFyYW1ldGVycy5saXN0VmFsdWUpIC8+CisgICAgPCNlbHNlPgorICAgIAk8I2Fzc2lnbiB0bXBMaXN0VmFsdWUgPSBzdGFjay5maW5kU3RyaW5nKCd0b3AnKSAvPgorICAgIDwvI2lmPgorICAgIDxvcHRpb24gdmFsdWU9IiR7dG1wTGlzdEtleT9odG1sfSI8I3J0Lz4KKyAgICAgICAgPCNpZiAocGFyYW1ldGVycy5uYW1lVmFsdWU/ZXhpc3RzICYmIHBhcmFtZXRlcnMubmFtZVZhbHVlID09IHRtcExpc3RLZXkpPgorIHNlbGVjdGVkPSJzZWxlY3RlZCI8I3J0Lz4KKyAgICAgICAgPC8jaWY+CisgICAgPjwjdC8+CisgICAgICAgICAgICAke3RtcExpc3RWYWx1ZT9odG1sfTwjdC8+CisgICAgPC9vcHRpb24+PCNsdC8+CisgICAgPC9Acy5pdGVyYXRvcj4KKyAgPC9zZWxlY3Q+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5sYWJlbD9pZl9leGlzdHMgIT0gIiI+CisJPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS94aHRtbC9jb250cm9sZm9vdGVyLmZ0bCIgLz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnB1c2hJZD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZGpDb25maWcuc2VhcmNoSWRzLnB1c2goIiR7cGFyYW1ldGVycy5pZD9odG1sfSIpOzwvc2NyaXB0PgorPC8jaWY+CisKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2JpbmQtY2xvc2UuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2JpbmQtY2xvc2UuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZWFjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYmluZC1jbG9zZS5mdGwKQEAgLTAsMCArMSwyNSBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPCNpZiBwYXJhbWV0ZXJzLnB1c2hJZD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZGpDb25maWcuc2VhcmNoSWRzLnB1c2goIiR7cGFyYW1ldGVycy5pZD9odG1sfSIpOzwvc2NyaXB0PgorPC8jaWY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYmluZC5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvYmluZC5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzN2E1YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9iaW5kLmZ0bApAQCAtMCwwICsxLDE2NiBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPCNhc3NpZ24gZmlyc3RGaWVsZD10cnVlID4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisJZG9qby5hZGRPbkxvYWQoZnVuY3Rpb24oKSB7CisJCWRvam8ud2lkZ2V0LmNyZWF0ZVdpZGdldCgic3RydXRzOkJpbmRFdmVudCIsIHsKKwkJICAgIDwjaWYgcGFyYW1ldGVycy5zb3VyY2VzP2lmX2V4aXN0cyAhPSAiIj4KKwkJICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorICAgICAgICAgICAgICAgICJzb3VyY2VzIjogIiR7cGFyYW1ldGVycy5zb3VyY2VzP2h0bWx9IjwjdC8+CisgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgIDwjaWYgcGFyYW1ldGVycy5ldmVudHM/aWZfZXhpc3RzICE9ICIiPgorICAgICAgICAgICAgICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKyAgICAgICAgICAgICAgICAiZXZlbnRzIjogIiR7cGFyYW1ldGVycy5ldmVudHM/aHRtbH0iPCN0Lz4KKyAgICAgICAgICAgIDwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLmlkP2lmX2V4aXN0cyAhPSAiIj4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgIAkiaWQiOiAiJHtwYXJhbWV0ZXJzLmlkP2h0bWx9IjwjdC8+CisJCSAgICA8LyNpZj4KKwkJICAgIDwjaWYgcGFyYW1ldGVycy5mb3JtSWQ/aWZfZXhpc3RzICE9ICIiPgorCQkgICAgICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgCSJmb3JtSWQiOiAiJHtwYXJhbWV0ZXJzLmZvcm1JZD9odG1sfSI8I3QvPgorCQkgICAgPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuZm9ybUZpbHRlcj9pZl9leGlzdHMgIT0gIiI+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAJImZvcm1GaWx0ZXIiOiAiJHtwYXJhbWV0ZXJzLmZvcm1GaWx0ZXI/aHRtbH0iPCN0Lz4KKwkJCTwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLmhyZWY/aWZfZXhpc3RzICE9ICIiPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgCSJocmVmIjogIiR7cGFyYW1ldGVycy5ocmVmfSI8I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMubG9hZGluZ1RleHQ/aWZfZXhpc3RzICE9ICIiPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgICAibG9hZGluZ1RleHQiIDogIiR7cGFyYW1ldGVycy5sb2FkaW5nVGV4dD9odG1sfSI8I3QvPgorCQkgICAgPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuZXJyb3JUZXh0P2lmX2V4aXN0cyAhPSAiIj4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgICAgImVycm9yVGV4dCIgOiAiJHtwYXJhbWV0ZXJzLmVycm9yVGV4dD9odG1sfSI8I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuZXhlY3V0ZVNjcmlwdHM/ZXhpc3RzPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgICAiZXhlY3V0ZVNjcmlwdHMiOiAke3BhcmFtZXRlcnMuZXhlY3V0ZVNjcmlwdHM/c3RyaW5nP2h0bWx9PCN0Lz4KKwkJCTwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLmxpc3RlblRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJsaXN0ZW5Ub3BpY3MiOiAiJHtwYXJhbWV0ZXJzLmxpc3RlblRvcGljcz9odG1sfSI8I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMubm90aWZ5VG9waWNzP2lmX2V4aXN0cyAhPSAiIj4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgICAgIm5vdGlmeVRvcGljcyI6ICIke3BhcmFtZXRlcnMubm90aWZ5VG9waWNzP2h0bWx9IjwjdC8+CisJCQk8LyNpZj4KKwkJCTwjaWYgcGFyYW1ldGVycy5iZWZvcmVOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgICAiYmVmb3JlTm90aWZ5VG9waWNzIjogIiR7cGFyYW1ldGVycy5iZWZvcmVOb3RpZnlUb3BpY3M/aHRtbH0iPCN0Lz4KKwkJICAgIDwvI2lmPgorCQkgICAgPCNpZiBwYXJhbWV0ZXJzLmFmdGVyTm90aWZ5VG9waWNzP2lmX2V4aXN0cyAhPSAiIj4KKwkJICAgICAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCSAgICAgICAgImFmdGVyTm90aWZ5VG9waWNzIjogIiR7cGFyYW1ldGVycy5hZnRlck5vdGlmeVRvcGljcz9odG1sfSI8I3QvPgorICAgIAkJPC8jaWY+CisgICAgIAkJPCNpZiBwYXJhbWV0ZXJzLmVycm9yTm90aWZ5VG9waWNzP2lmX2V4aXN0cyAhPSAiIj4KKyAgICAgCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkgICAgICAgICJlcnJvck5vdGlmeVRvcGljcyI6ICIke3BhcmFtZXRlcnMuZXJyb3JOb3RpZnlUb3BpY3M/aHRtbH0iPCN0Lz4KKyAgICAgCQk8LyNpZj4KKwkJCTwjaWYgcGFyYW1ldGVycy50YXJnZXRzP2lmX2V4aXN0cyAhPSAiIj4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgICAgInRhcmdldHMiOiAiJHtwYXJhbWV0ZXJzLnRhcmdldHM/aHRtbH0iPCN0Lz4KKwkJCTwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLmluZGljYXRvcj9pZl9leGlzdHMgIT0gIiI+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJpbmRpY2F0b3IiOiAiJHtwYXJhbWV0ZXJzLmluZGljYXRvcj9odG1sfSI8I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuc2hvd0Vycm9yVHJhbnNwb3J0VGV4dD9leGlzdHM+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJzaG93RXJyb3IiOiAke3BhcmFtZXRlcnMuc2hvd0Vycm9yVHJhbnNwb3J0VGV4dD9zdHJpbmc/aHRtbH08I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuc2hvd0xvYWRpbmdUZXh0P2V4aXN0cz4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgICAgInNob3dMb2FkaW5nIjogJHtwYXJhbWV0ZXJzLnNob3dMb2FkaW5nVGV4dD9zdHJpbmc/aHRtbH08I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMuaGFuZGxlcj9pZl9leGlzdHMgIT0gIiI+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJoYW5kbGVyIjogIiR7cGFyYW1ldGVycy5oYW5kbGVyP2h0bWx9IjwjdC8+CisJCSAgICA8LyNpZj4KKwkJICAgIDwjaWYgcGFyYW1ldGVycy5oaWdobGlnaHRDb2xvcj9pZl9leGlzdHMgIT0gIiI+CisJCSAgICAgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJoaWdobGlnaHRDb2xvciIgOiAiJHtwYXJhbWV0ZXJzLmhpZ2hsaWdodENvbG9yP2h0bWx9IjwjdC8+CisJCQk8LyNpZj4KKwkJCTwjaWYgcGFyYW1ldGVycy5oaWdobGlnaHREdXJhdGlvbj9pZl9leGlzdHMgIT0gIiI+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJoaWdobGlnaHREdXJhdGlvbiIgOiAke3BhcmFtZXRlcnMuaGlnaGxpZ2h0RHVyYXRpb24/aHRtbH08I3QvPgorCQkJPC8jaWY+CisJCQk8I2lmIHBhcmFtZXRlcnMudmFsaWRhdGU/ZXhpc3RzPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgICAidmFsaWRhdGUiOiAke3BhcmFtZXRlcnMudmFsaWRhdGU/c3RyaW5nP2h0bWx9PCN0Lz4KKwkJCTwjZWxzZT4KKwkJCSAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisJCQkgICAgInZhbGlkYXRlIjogZmFsc2UKKwkJCTwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLmFqYXhBZnRlclZhbGlkYXRpb24/ZXhpc3RzPgorCQkJICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKwkJCSAgICAiYWpheEFmdGVyVmFsaWRhdGlvbiI6ICR7cGFyYW1ldGVycy5hamF4QWZ0ZXJWYWxpZGF0aW9uP3N0cmluZz9odG1sfTwjdC8+CisJCQk8I2Vsc2U+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorCQkJICAgICJhamF4QWZ0ZXJWYWxpZGF0aW9uIjogZmFsc2UKKwkJCTwvI2lmPgorCQkJPCNpZiBwYXJhbWV0ZXJzLnNlcGFyYXRlU2NyaXB0cz9leGlzdHM+CisJCQkgICAgPCNpZiAhZmlyc3RGaWVsZD4sPC8jaWY+PCN0Lz4KKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZpZWxkPWZhbHNlID48I3QvPgorICAgICAgICAgICAgICAgICJzY3JpcHRTZXBhcmF0aW9uIjogJHtwYXJhbWV0ZXJzLnNlcGFyYXRlU2NyaXB0cz9zdHJpbmc/aHRtbH08I3QvPgorICAgICAgICAgICAgPC8jaWY+CisgICAgICAgICAgICA8I2lmIHBhcmFtZXRlcnMudHJhbnNwb3J0P2lmX2V4aXN0cyAhPSAiIj4KKyAgICAgICAgICAgICAgICA8I2lmICFmaXJzdEZpZWxkPiw8LyNpZj48I3QvPgorICAgICAgICAgICAgICAgIDwjYXNzaWduIGZpcnN0RmllbGQ9ZmFsc2UgPjwjdC8+CisgICAgICAgICAgICAgICAgInRyYW5zcG9ydCI6ICIke3BhcmFtZXRlcnMudHJhbnNwb3J0P2h0bWx9IjwjdC8+CisgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgIDwjaWYgcGFyYW1ldGVycy5wYXJzZUNvbnRlbnQ/ZXhpc3RzPgorICAgICAgICAgICAgICAgIDwjaWYgIWZpcnN0RmllbGQ+LDwvI2lmPjwjdC8+CisgICAgICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGaWVsZD1mYWxzZSA+PCN0Lz4KKyAgICAgICAgICAgICAgICAicGFyc2VDb250ZW50IjogJHtwYXJhbWV0ZXJzLnBhcnNlQ29udGVudD9zdHJpbmc/aHRtbH08I3QvPgorICAgICAgICAgICAgPC8jaWY+CisJCX0pOworCX0pOworPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2NvbnRyb2xoZWFkZXIuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2NvbnRyb2xoZWFkZXIuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNmUzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvY29udHJvbGhlYWRlci5mdGwKQEAgLTAsMCArMSwzNCBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPCNpZiBwYXJhbWV0ZXJzLmxhYmVsP2lmX2V4aXN0cyAhPSAiIj4KKwk8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3hodG1sL2NvbnRyb2xoZWFkZXIuZnRsIiAvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuZm9ybT9leGlzdHMgJiYgcGFyYW1ldGVycy5mb3JtLnZhbGlkYXRlP2RlZmF1bHQoZmFsc2UpID09IHRydWU+CisJPCMtLSBjYW4ndCBtdXRhdGUgdGhlIGRhdGEgbW9kZWwgaW4gZnJlZW1hcmtlciAtLT4KKyAgICA8I2lmIHBhcmFtZXRlcnMub25ibHVyP2V4aXN0cz4KKyAgICAgICAgJHt0YWcuYWRkUGFyYW1ldGVyKCdvbmJsdXInLCAidmFsaWRhdGUodGhpcyk7JHtwYXJhbWV0ZXJzLm9uYmx1cn0iKX0KKyAgICA8I2Vsc2U+CisgICAgICAgICR7dGFnLmFkZFBhcmFtZXRlcignb25ibHVyJywgInZhbGlkYXRlKHRoaXMpOyIpfQorICAgIDwvI2lmPgorPC8jaWY+CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2RhdGV0aW1lcGlja2VyLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9kYXRldGltZXBpY2tlci5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiMzNhYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9kYXRldGltZXBpY2tlci5mdGwKQEAgLTAsMCArMSwxMDUgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwjaW5jbHVkZSAiLyR7cGFyYW1ldGVycy50ZW1wbGF0ZURpcn0vYWpheC9jb250cm9saGVhZGVyLmZ0bCIgLz4KKzxkaXYKKyAgIDwjaWYgcGFyYW1ldGVycy50eXBlP2lmX2V4aXN0cyA9PSAiZGF0ZSI+CisgICAgIGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzRGF0ZVBpY2tlciI8I3J0Lz4KKyAgIDwjZWxzZT4KKyAgICAgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUaW1lUGlja2VyIjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmlkP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBpZD0iJHtwYXJhbWV0ZXJzLmlkP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLm5hbWVWYWx1ZT9pZl9leGlzdHMgIT0gIiI+CisgICAgdmFsdWU9IiR7cGFyYW1ldGVycy5uYW1lVmFsdWU/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMubGFuZ3VhZ2U/aWZfZXhpc3RzICE9ICIiPgorICAgIGxhbmc9IiR7cGFyYW1ldGVycy5sYW5ndWFnZT9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5uYW1lP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBuYW1lPSIke3BhcmFtZXRlcnMubmFtZT9odG1sfSI8I3J0Lz4KKyAgICBpbnB1dE5hbWU9ImRvam8uJHtwYXJhbWV0ZXJzLm5hbWU/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZGlzcGxheVdlZWtzP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBkaXNwbGF5V2Vla3M9IiR7cGFyYW1ldGVycy5kaXNwbGF5V2Vla3M/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuYWRqdXN0V2Vla3M/ZXhpc3RzPgorICAgIGFkanVzdFdlZWtzPSIke3BhcmFtZXRlcnMuYWRqdXN0V2Vla3M/c3RyaW5nP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnN0YXJ0RGF0ZT9pZl9leGlzdHMgIT0gIiI+CisgICAgc3RhcnREYXRlPSIke3BhcmFtZXRlcnMuc3RhcnREYXRlP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmVuZERhdGU/aWZfZXhpc3RzICE9ICIiPgorICAgIGVuZERhdGU9IiR7cGFyYW1ldGVycy5lbmREYXRlP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLndlZWtTdGFydHNPbj9pZl9leGlzdHMgIT0gIiI+CisgICAgd2Vla1N0YXJ0c09uPSIke3BhcmFtZXRlcnMud2Vla1N0YXJ0c09uP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnN0YXRpY0Rpc3BsYXk/ZXhpc3RzPgorICAgIHN0YXRpY0Rpc3BsYXk9IiR7cGFyYW1ldGVycy5zdGF0aWNEaXNwbGF5P3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5kYXlXaWR0aD9pZl9leGlzdHMgIT0gIiI+CisgICAgZGF5V2lkdGg9IiR7cGFyYW1ldGVycy5kYXlXaWR0aD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy50YWJpbmRleD9pZl9leGlzdHMgIT0gIiI+CisgICAgdGFiaW5kZXg9IiR7cGFyYW1ldGVycy50YWJpbmRleD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jc3NDbGFzcz9pZl9leGlzdHMgIT0gIiI+CisgICAgY2xhc3M9IiR7cGFyYW1ldGVycy5jc3NDbGFzcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jc3NTdHlsZT9pZl9leGlzdHMgIT0gIiI+CisgICAgc3R5bGU9IiR7cGFyYW1ldGVycy5jc3NTdHlsZT9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5pY29uUGF0aD9pZl9leGlzdHMgIT0gIiI+CisgICAgaWNvblVSTD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmljb25QYXRofScgZW5jb2RlPSJmYWxzZSIgaW5jbHVkZVBhcmFtcz0nbm9uZScvPiI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5mb3JtYXRMZW5ndGg/aWZfZXhpc3RzICE9ICIiPgorICAgIGZvcm1hdExlbmd0aD0iJHtwYXJhbWV0ZXJzLmZvcm1hdExlbmd0aD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5kaXNwbGF5Rm9ybWF0P2lmX2V4aXN0cyAhPSAiIj4KKyAgICBkaXNwbGF5Rm9ybWF0PSIke3BhcmFtZXRlcnMuZGlzcGxheUZvcm1hdD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy50b2dnbGVUeXBlP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBjb250YWluZXJUb2dnbGU9IiR7cGFyYW1ldGVycy50b2dnbGVUeXBlP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnRvZ2dsZUR1cmF0aW9uP2V4aXN0cz4KKyAgICBjb250YWluZXJUb2dnbGVEdXJhdGlvbj0iJHtwYXJhbWV0ZXJzLnRvZ2dsZUR1cmF0aW9uP3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy50ZW1wbGF0ZUNzc1BhdGg/aWZfZXhpc3RzICE9ICIiPgorCXRlbXBsYXRlQ3NzUGF0aD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLnRlbXBsYXRlQ3NzUGF0aH0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMudmFsdWVOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorCXZhbHVlTm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMudmFsdWVOb3RpZnlUb3BpY3M/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZGlzYWJsZWQ/ZGVmYXVsdChmYWxzZSk+CisgICAgZGlzYWJsZWQ9ImRpc2FibGVkIjwjcnQvPgorICA8LyNpZj4KKyAgc2F2ZUZvcm1hdD0icmZjIjwjcnQvPgorICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3NpbXBsZS9zY3JpcHRpbmctZXZlbnRzLmZ0bCIgLz4KKz48L2Rpdj4KKzwjaWYgcGFyYW1ldGVycy5sYWJlbD9pZl9leGlzdHMgIT0gIiI+CisJPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS94aHRtbC9jb250cm9sZm9vdGVyLmZ0bCIgLz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnB1c2hJZD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZGpDb25maWcuc2VhcmNoSWRzLnB1c2goIiR7cGFyYW1ldGVycy5pZD9odG1sfSIpOzwvc2NyaXB0PgorPC8jaWY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvZGl2LWNsb3NlLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9kaXYtY2xvc2UuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzY1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvZGl2LWNsb3NlLmZ0bApAQCAtMCwwICsxLDI2IEBACis8Iy0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8L2Rpdj4KKzwjaWYgcGFyYW1ldGVycy5wdXNoSWQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iKTs8L3NjcmlwdD4KKzwvI2lmPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2Rpdi5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvZGl2LmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJiN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2Rpdi5mdGwKQEAgLTAsMCArMSw1NCBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOkJpbmREaXYiCisgIDwjaWYgcGFyYW1ldGVycy5kZWxheT9leGlzdHM+CisgICAgZGVsYXk9IiR7cGFyYW1ldGVycy5kZWxheT9jfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy51cGRhdGVGcmVxP2V4aXN0cz4KKyAgICB1cGRhdGVGcmVxPSIke3BhcmFtZXRlcnMudXBkYXRlRnJlcT9jfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5hdXRvU3RhcnQ/ZXhpc3RzPgorICAgIGF1dG9TdGFydD0iJHtwYXJhbWV0ZXJzLmF1dG9TdGFydD9zdHJpbmc/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuY2xvc2FibGU/ZXhpc3RzPgorICAgIGNsb3NhYmxlPSIke3BhcmFtZXRlcnMuY2xvc2FibGU/c3RyaW5nP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICAgIHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3M9IiR7cGFyYW1ldGVycy5zdGFydFRpbWVyTGlzdGVuVG9waWNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnN0b3BUaW1lckxpc3RlblRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisgICAgc3RvcFRpbWVyTGlzdGVuVG9waWNzPSIke3BhcmFtZXRlcnMuc3RvcFRpbWVyTGlzdGVuVG9waWNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLnJlZnJlc2hPblNob3c/ZXhpc3RzPgorICAgIHJlZnJlc2hPblNob3c9IiR7cGFyYW1ldGVycy5yZWZyZXNoT25TaG93P3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5wcmVsb2FkP2V4aXN0cz4KKyAgICBwcmVsb2FkPSIke3BhcmFtZXRlcnMucHJlbG9hZD9zdHJpbmc/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZGlzYWJsZWQ/ZGVmYXVsdChmYWxzZSk+CisgICAgZGlzYWJsZWQ9ImRpc2FibGVkIjwjcnQvPgorICA8LyNpZj4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9hamF4L2FqYXgtY29tbW9uLmZ0bCIgLz4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvc2NyaXB0aW5nLWV2ZW50cy5mdGwiIC8+CisgIDwjaW5jbHVkZSAiLyR7cGFyYW1ldGVycy50ZW1wbGF0ZURpcn0vc2ltcGxlL2NvbW1vbi1hdHRyaWJ1dGVzLmZ0bCIgLz4KKz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9kb2pvUmVxdWlyZS5qcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9kb2pvUmVxdWlyZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI0MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2Rvam9SZXF1aXJlLmpzCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Rvam8ucmVxdWlyZSgiZG9qby5pby5Ccm93c2VySU8iKTsKK2Rvam8ucmVxdWlyZSgiZG9qby5ldmVudC50b3BpYyIpOworCitkb2pvLmhvc3RlbnYuc2V0TW9kdWxlUHJlZml4KCdzdHJ1dHMnLCAnc3RydXRzJyk7Citkb2pvLnJlcXVpcmUoJ2Rvam8ud2lkZ2V0LionKTsKK2Rvam8ud2lkZ2V0Lm1hbmFnZXIucmVnaXN0ZXJXaWRnZXRQYWNrYWdlKCdzdHJ1dHMud2lkZ2V0Jyk7CisKK2Rvam8ucmVxdWlyZSgic3RydXRzLndpZGdldC4qIik7Citkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkVkaXRvcjIiKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9oZWFkLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9oZWFkLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJlMjllCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L2hlYWQuZnRsCkBAIC0wLDAgKzEsODEgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgLy8gRG9qbyBjb25maWd1cmF0aW9uCisgICAgZGpDb25maWcgPSB7CisgICAgICAgIGlzRGVidWc6ICR7cGFyYW1ldGVycy5kZWJ1Zz9kZWZhdWx0KGZhbHNlKT9zdHJpbmd9LAorICAgICAgICBiaW5kRW5jb2Rpbmc6ICIke3BhcmFtZXRlcnMuZW5jb2Rpbmd9IgorICAgICAgICA8I2lmIHBhcmFtZXRlcnMuYmFzZVJlbGF0aXZlUGF0aD9pZl9leGlzdHMgIT0gIiI+CisgICAgICAgICAgLGJhc2VSZWxhdGl2ZVBhdGg6ICI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuYmFzZVJlbGF0aXZlUGF0aH0nIGluY2x1ZGVQYXJhbXM9J25vbmUnIGVuY29kZT0nZmFsc2UnIC8+IgorICAgICAgICAgICxiYXNlU2NyaXB0VXJpOiAiPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmJhc2VSZWxhdGl2ZVBhdGh9JyBpbmNsdWRlUGFyYW1zPSdub25lJyBlbmNvZGU9J2ZhbHNlJyAvPiIKKyAgICAgICAgPCNlbHNlPgorICAgICAgICAgICxiYXNlUmVsYXRpdmVQYXRoOiAiJHtiYXNlfS9zdHJ1dHMvZG9qby8iCisgICAgICAgICAgLGJhc2VTY3JpcHRVcmk6ICIke2Jhc2V9L3N0cnV0cy9kb2pvLyIKKyAgICAgICAgPC8jaWY+ICAKKyAgICAgICAgPCNpZiBwYXJhbWV0ZXJzLmxvY2FsZT9pZl9leGlzdHMgIT0gIiI+CisgICAgICAgICAgLGxvY2FsZTogIiR7cGFyYW1ldGVycy5sb2NhbGV9IgorICAgICAgICA8LyNpZj4KKyAgICAgICAgPCNpZiBwYXJhbWV0ZXJzLmV4dHJhTG9jYWxlcz9leGlzdHM+CisgICAgICAgICAgLGV4dHJhTG9jYWxlOiBbCisgICAgICAgIAk8I2xpc3QgcGFyYW1ldGVycy5leHRyYUxvY2FsZXMgYXMgbG9jYWxlPgorICAgICAgICAJCSIke2xvY2FsZX0iPCNpZiBsb2NhbGVfaGFzX25leHQ+LDwvI2lmPgorICAgICAgICAJPC8jbGlzdD4KKyAgICAgICAgICBdCisgICAgICAgIDwvI2lmPgorICAgICAgICAgLHBhcnNlV2lkZ2V0cyA6ICR7cGFyYW1ldGVycy5wYXJzZUNvbnRlbnQ/c3RyaW5nfQorICAgICAgICAKKyAgICB9OworPC9zY3JpcHQ+CisKKzwjaWYgcGFyYW1ldGVycy5jb21wcmVzc2VkP2RlZmF1bHQodHJ1ZSk+CisgIDwjYXNzaWduIGRvam9GaWxlPSJkb2pvLmpzIj4KKzwjZWxzZT4KKyAgPCNhc3NpZ24gZG9qb0ZpbGU9ImRvam8uanMudW5jb21wcmVzc2VkLmpzIj4KKzwvI2lmPgorCis8I2lmIHBhcmFtZXRlcnMuY2FjaGU/ZGVmYXVsdCh0cnVlKT4KKyAgPCNhc3NpZ24gcHJvZmlsZT0ic3RydXRzXyI+Cis8I2Vsc2U+CisgIDwjYXNzaWduIHByb2ZpbGU9IiI+Cis8LyNpZj4gICAgICAgICAgIAorCis8I2lmIHBhcmFtZXRlcnMuYmFzZVJlbGF0aXZlUGF0aD9pZl9leGlzdHMgIT0gIiI+CisgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIKKyAgICAgICAgc3JjPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuYmFzZVJlbGF0aXZlUGF0aH0vJHtwcm9maWxlfSR7ZG9qb0ZpbGV9JyBpbmNsdWRlUGFyYW1zPSdub25lJyBlbmNvZGU9J2ZhbHNlJyAgLz4iPjwvc2NyaXB0PgorPCNlbHNlPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiCisgICAgICAgIHNyYz0iJHtiYXNlfS9zdHJ1dHMvZG9qby8ke3Byb2ZpbGV9JHtkb2pvRmlsZX0iPjwvc2NyaXB0PgorPC8jaWY+ICAKKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgorICAgICAgICBzcmM9IiR7YmFzZX0vc3RydXRzL2FqYXgvZG9qb1JlcXVpcmUuanMiPjwvc2NyaXB0PgorPCNpZiBwYXJhbWV0ZXJzLmRlYnVnP2RlZmF1bHQoZmFsc2UpPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBkb2pvLmhvc3RlbnYud3JpdGVJbmNsdWRlcyh0cnVlKTsKKzwvc2NyaXB0PiAgICAgCis8LyNpZj4gICAgICAgIAorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIke2Jhc2V9L3N0cnV0cy94aHRtbC9zdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IiR7YmFzZX0vc3RydXRzL3V0aWxzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIke2Jhc2V9L3N0cnV0cy94aHRtbC92YWxpZGF0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIke2Jhc2V9L3N0cnV0cy9jc3NfeGh0bWwvdmFsaWRhdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvc3VibWl0LWNsb3NlLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC9zdWJtaXQtY2xvc2UuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODRlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvc3VibWl0LWNsb3NlLmZ0bApAQCAtMCwwICsxLDIyIEBACis8Iy0tDQorLyoNCisgKiAkSWQkDQorICoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3N1Ym1pdC5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvc3VibWl0LmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRiM2VhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3N1Ym1pdC5mdGwKQEAgLTAsMCArMSwxMDUgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwjaWYgcGFyYW1ldGVycy5wYXJlbnRUaGVtZT9kZWZhdWx0KCcnKSA9PSAneGh0bWwnPgorICA8dHI+CisgICAgICA8dGQgY29sc3Bhbj0iMiI+PGRpdiA8I3J0Lz4KKyAgPCNpZiBwYXJhbWV0ZXJzLmFsaWduP2V4aXN0cz4KKyAgICAgIGFsaWduPSIke3BhcmFtZXRlcnMuYWxpZ24/aHRtbH0iPCN0Lz4KKyAgPC8jaWY+CisgID48I3QvPgorPCNlbHNlaWYgcGFyYW1ldGVycy5wYXJlbnRUaGVtZT9kZWZhdWx0KCcnKSA9PSAnY3NzX3hodG1sJz4KKyAgPCNpZiBwYXJhbWV0ZXJzLmxhYmVscG9zaXRpb24/ZGVmYXVsdCgidG9wIikgPT0gJ3RvcCc+CisgICAgPGRpdiA8I3J0Lz4KKyAgPCNlbHNlPgorICAgIDxzcGFuIDwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmFsaWduP2V4aXN0cz4KKyAgICBhbGlnbj0iJHtwYXJhbWV0ZXJzLmFsaWduP2h0bWx9IjwjdC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuaWQ/ZXhpc3RzPgorICAgIGlkPSJ3d2N0cmxfJHtwYXJhbWV0ZXJzLmlkfSI8I3J0Lz4KKyAgPC8jaWY+CisgID48I3QvPgorPC8jaWY+CisKKzwjaWYgcGFyYW1ldGVycy50eXBlP2V4aXN0cyAmJiBwYXJhbWV0ZXJzLnR5cGU9PSJidXR0b24iPgorICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBkb2pvVHlwZT0ic3RydXRzOkJpbmQiIGV2ZW50cz0ib25jbGljayI8I3J0Lz4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9hamF4L2FqYXgtY29tbW9uLmZ0bCIvPgorICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3NpbXBsZS9zY3JpcHRpbmctZXZlbnRzLmZ0bCIvPgorICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L3NpbXBsZS9jb21tb24tYXR0cmlidXRlcy5mdGwiIC8+CisgIDwjaWYgcGFyYW1ldGVycy5sYWJlbD9pZl9leGlzdHMgIT0gIiI+CisgICAgIHZhbHVlPSIke3BhcmFtZXRlcnMubGFiZWw/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuZGlzYWJsZWQ/ZGVmYXVsdChmYWxzZSk+CisgICAgZGlzYWJsZWQ9ImRpc2FibGVkIjwjcnQvPgorICA8LyNpZj4KKyAvPgorPCNlbHNlPgorICA8I2lmIHBhcmFtZXRlcnMudHlwZT9leGlzdHMgJiYgcGFyYW1ldGVycy50eXBlPT0iaW1hZ2UiPgorICAgIDxpbnB1dCB0eXBlPSJpbWFnZSIgZG9qb1R5cGU9InN0cnV0czpCaW5kIiBldmVudHM9Im9uY2xpY2siPCNydC8+CisgICAgPCNpZiBwYXJhbWV0ZXJzLmxhYmVsP2lmX2V4aXN0cyAhPSAiIj4KKyAgICAgYWx0PSIke3BhcmFtZXRlcnMubGFiZWw/aHRtbH0iPCNydC8+CisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLnNyYz9pZl9leGlzdHMgIT0gIiI+CisgICAgIHNyYz0iJHtwYXJhbWV0ZXJzLnNyYz9odG1sfSI8I3J0Lz4KKyAgICA8LyNpZj4KKyAgPCNlbHNlPgorICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGRvam9UeXBlPSJzdHJ1dHM6QmluZCIgZXZlbnRzPSJvbmNsaWNrIjwjcnQvPgorICA8LyNpZj4KKyAgICA8I2lmIHBhcmFtZXRlcnMubmFtZVZhbHVlP2lmX2V4aXN0cyAhPSAiIj4KKyAgICAgdmFsdWU9IiR7cGFyYW1ldGVycy5uYW1lVmFsdWU/aHRtbH0iPCNydC8+CisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLmRpc2FibGVkP2RlZmF1bHQoZmFsc2UpPgorICAgICBkaXNhYmxlZD0iZGlzYWJsZWQiPCNydC8+CisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLnZhbHVlP2lmX2V4aXN0cyAhPSAiIj4KKyAgICAgdmFsdWU9IiR7cGFyYW1ldGVycy52YWx1ZT9odG1sfSI8I3J0Lz4KKyAgICA8LyNpZj4KKyAgICA8I2lmIHBhcmFtZXRlcnMudmFsaWRhdGU/ZXhpc3RzPgorICAgICB2YWxpZGF0ZT0iJHtwYXJhbWV0ZXJzLnZhbGlkYXRlP3N0cmluZz9odG1sfSI8I3J0Lz4KKyAgICA8I2Vsc2U+CisgICAgIHZhbGlkYXRlPSJmYWxzZSI8I3J0Lz4gIAorICAgIDwvI2lmPgorICAgIDwjaWYgcGFyYW1ldGVycy5hamF4QWZ0ZXJWYWxpZGF0aW9uP2V4aXN0cz4KKyAgICAgYWpheEFmdGVyVmFsaWRhdGlvbj0iJHtwYXJhbWV0ZXJzLmFqYXhBZnRlclZhbGlkYXRpb24/c3RyaW5nP2h0bWx9IjwjcnQvPgorICAgIDwjZWxzZT4KKyAgICAgYWpheEFmdGVyVmFsaWRhdGlvbj0iZmFsc2UiICAKKyAgICA8LyNpZj4KKyAgICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L2FqYXgvYWpheC1jb21tb24uZnRsIi8+CisgICAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvc2NyaXB0aW5nLWV2ZW50cy5mdGwiIC8+CisgICAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvY29tbW9uLWF0dHJpYnV0ZXMuZnRsIiAvPgorICAvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMucGFyZW50VGhlbWU/ZGVmYXVsdCgnJykgPT0gJ3hodG1sJz4KKyAgPC9kaXY+PCN0Lz4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS94aHRtbC9jb250cm9sZm9vdGVyLmZ0bCIgLz4KKzwjZWxzZWlmIHBhcmFtZXRlcnMucGFyZW50VGhlbWU/ZGVmYXVsdCgnJykgPT0gJ2Nzc194aHRtbCc+CisgIDwjaWYgcGFyYW1ldGVycy5sYWJlbHBvc2l0aW9uP2RlZmF1bHQoInRvcCIpID09ICd0b3AnPgorICAgIDwvZGl2PiA8I3QvPgorICA8I2Vsc2U+CisgICAgPC9zcGFuPiA8I3QvPgorICA8LyNpZj4gIAorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMucHVzaElkPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiJHtwYXJhbWV0ZXJzLmlkP2h0bWx9Iik7PC9zY3JpcHQ+Cis8LyNpZj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90YWItY2xvc2UuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RhYi1jbG9zZS5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NjVlNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90YWItY2xvc2UuZnRsCkBAIC0wLDAgKzEsMjYgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwvZGl2PgorPCNpZiBwYXJhbWV0ZXJzLnB1c2hJZD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZGpDb25maWcuc2VhcmNoSWRzLnB1c2goIiR7cGFyYW1ldGVycy5pZD9odG1sfSIpOzwvc2NyaXB0PgorPC8jaWY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdGFiLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90YWIuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWU0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdGFiLmZ0bApAQCAtMCwwICsxLDQ1IEBACis8Iy0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8ZGl2IGlkPSIke3BhcmFtZXRlcnMuaWR9IiBjYWNoZUNvbnRlbnQ9ImZhbHNlIgorICA8I2lmIHBhcmFtZXRlcnMudGl0bGU/aWZfZXhpc3RzICE9ICIiPgorICAgIGxhYmVsPSIke3BhcmFtZXRlcnMudGl0bGU/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMuaHJlZj9pZl9leGlzdHMgIT0gIiI+CisgICAgZG9qb1R5cGU9IkxpbmtQYW5lIiA8I3J0Lz4KKyAgICBocmVmPSIke3BhcmFtZXRlcnMuaHJlZn0iPCNydC8+CisgICAgPCNlbHNlPgorICAgIGRvam9UeXBlPSJDb250ZW50UGFuZSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jc3NTdHlsZT9pZl9leGlzdHMgIT0gIiI+CisgICAgc3R5bGU9IiR7cGFyYW1ldGVycy5jc3NTdHlsZT9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jc3NDbGFzcz9pZl9leGlzdHMgIT0gIiI+CisgICAgY2xhc3M9IiR7cGFyYW1ldGVycy5jc3NDbGFzcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jbG9zZUJ1dHRvbj9pZl9leGlzdHMgIT0gIiI+CisgICAgY2xvc2VCdXR0b249IiR7cGFyYW1ldGVycy5jbG9zZUJ1dHRvbj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5yZWZyZXNoT25TaG93P2lmX2V4aXN0cyAhPSAiIj4KKyAgICByZWZyZXNoT25TaG93PSIke3BhcmFtZXRlcnMucmVmcmVzaE9uU2hvdz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+Cis+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdGFiYmVkcGFuZWwtY2xvc2UuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RhYmJlZHBhbmVsLWNsb3NlLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjc2NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RhYmJlZHBhbmVsLWNsb3NlLmZ0bApAQCAtMCwwICsxLDI2IEBACis8Iy0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8L2Rpdj4KKzwjaWYgcGFyYW1ldGVycy5wdXNoSWQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iKTs8L3NjcmlwdD4KKzwvI2lmPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RhYmJlZHBhbmVsLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90YWJiZWRwYW5lbC5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1MGI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90YWJiZWRwYW5lbC5mdGwKQEAgLTAsMCArMSw4NyBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIke2Jhc2V9L3N0cnV0cy9UYWJiZWRQYW5lbC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Cis8I2lmIHBhcmFtZXRlcnMudXNlU2VsZWN0ZWRUYWJDb29raWU/ZXhpc3RzICYmIHBhcmFtZXRlcnMudXNlU2VsZWN0ZWRUYWJDb29raWU9PSJ0cnVlIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgZG9qby5yZXF1aXJlKCJkb2pvLmlvLmNvb2tpZSIpOworICBkb2pvLmFkZE9uTG9hZCAoCisgICAgICAgIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIHRhYkNvbnRhaW5lciA9IGRvam8ud2lkZ2V0LmJ5SWQoIiR7cGFyYW1ldGVycy5lc2NhcGVkSWQ/aHRtbH0iKTsKKworICAgICAgICAgICAgPCNpZiAhKHBhcmFtZXRlcnMuc2VsZWN0ZWRUYWI/aWZfZXhpc3RzICE9ICIiKT4KKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFRhYiA9IGRvam8uaW8uY29va2llLmdldENvb2tpZSgiU3RydXRzMlRhYmJlZFBhbmVsX3NlbGVjdGVkVGFiXyR7cGFyYW1ldGVycy5lc2NhcGVkSWQ/aHRtbH0iKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhYikgeworICAgICAgICAgICAgICAgIHRhYkNvbnRhaW5lci5zZWxlY3RDaGlsZChzZWxlY3RlZFRhYiwgdGFiQ29udGFpbmVyLmNvcnJlc3BvbmRpbmdQYWdlQnV0dG9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgPC8jaWY+CisgICAgICAgICAgICBkb2pvLmV2ZW50LmNvbm5lY3QodGFiQ29udGFpbmVyLCAic2VsZWN0Q2hpbGQiLAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2pvLmlvLmNvb2tpZS5zZXRDb29raWUoIlN0cnV0czJUYWJiZWRQYW5lbF9zZWxlY3RlZFRhYl8ke3BhcmFtZXRlcnMuZXNjYXBlZElkP2h0bWx9IiwgZXZ0LndpZGdldElkLCAxLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKzwvc2NyaXB0PgorPC8jaWY+CisKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUYWJDb250YWluZXIiCisgIDwjaWYgcGFyYW1ldGVycy5jc3NTdHlsZT9pZl9leGlzdHMgIT0gIiI+CisgICAgc3R5bGU9IiR7cGFyYW1ldGVycy5jc3NTdHlsZT9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5pZD9pZl9leGlzdHMgIT0gIiI+CisgICAgaWQ9IiR7cGFyYW1ldGVycy5pZD9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jc3NDbGFzcz9pZl9leGlzdHMgIT0gIiI+CisgICAgY2xhc3M9IiR7cGFyYW1ldGVycy5jc3NDbGFzcz9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5zZWxlY3RlZFRhYj9pZl9leGlzdHMgIT0gIiI+CisgICAgc2VsZWN0ZWRUYWI9IiR7cGFyYW1ldGVycy5zZWxlY3RlZFRhYj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5sYWJlbFBvc2l0aW9uP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBsYWJlbFBvc2l0aW9uPSIke3BhcmFtZXRlcnMubGFiZWxQb3NpdGlvbj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5jbG9zZUJ1dHRvbj9pZl9leGlzdHMgIT0gIiI+CisgICAgY2xvc2VCdXR0b249IiR7cGFyYW1ldGVycy5jbG9zZUJ1dHRvbj9odG1sfSI8I3J0Lz4KKyAgPC8jaWY+CisgIDwjaWYgcGFyYW1ldGVycy5kb0xheW91dD9leGlzdHM+CisgICAgZG9MYXlvdXQ9IiR7cGFyYW1ldGVycy5kb0xheW91dD9zdHJpbmc/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMubGFiZWw/aWZfZXhpc3RzICE9ICIiPgorICAgIGxhYmVsPSIke3BhcmFtZXRlcnMubGFiZWw/aHRtbH0iPCNydC8+CisgIDwvI2lmPgorICA8I2lmIHBhcmFtZXRlcnMudGVtcGxhdGVDc3NQYXRoP2V4aXN0cz4KKwl0ZW1wbGF0ZUNzc1BhdGg9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy50ZW1wbGF0ZUNzc1BhdGh9JyBlbmNvZGU9ImZhbHNlIiBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmJlZm9yZVNlbGVjdFRhYk5vdGlmeVRvcGljcz9pZl9leGlzdHMgIT0gIiI+CisgICAgYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMuYmVmb3JlU2VsZWN0VGFiTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzP2lmX2V4aXN0cyAhPSAiIj4KKyAgICBhZnRlclNlbGVjdFRhYk5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLmFmdGVyU2VsZWN0VGFiTm90aWZ5VG9waWNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpZiBwYXJhbWV0ZXJzLmRpc2FibGVkVGFiQ3NzQ2xhc3M/aWZfZXhpc3RzICE9ICIiPgorICAgIGRpc2FibGVkVGFiQ3NzQ2xhc3M9IiR7cGFyYW1ldGVycy5kaXNhYmxlZFRhYkNzc0NsYXNzP2h0bWx9IjwjcnQvPgorICA8LyNpZj4KKyAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9zaW1wbGUvc2NyaXB0aW5nLWV2ZW50cy5mdGwiIC8+CisgIDwjaW5jbHVkZSAiLyR7cGFyYW1ldGVycy50ZW1wbGF0ZURpcn0vc2ltcGxlL2NvbW1vbi1hdHRyaWJ1dGVzLmZ0bCIgLz4KKz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90ZXh0YXJlYS5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdGV4dGFyZWEuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOGJhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdGV4dGFyZWEuZnRsCkBAIC0wLDAgKzEsNjUgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzx0ZXh0YXJlYTwjcnQvPgorIGRvam9UeXBlPSJFZGl0b3IyIgorPCNpZiBwYXJhbWV0ZXJzLmVkaXRvckNvbnRyb2xzP2V4aXN0cz4KKyBpdGVtcz0iJHtwYXJhbWV0ZXJzLmVkaXRvckNvbnRyb2xzP2h0bWx9IjwjcnQvPgorPCNlbHNlPgorIGl0ZW1zPSJsaW5rR3JvdXA7fDt0ZXh0R3JvdXA7fDtqdXN0aWZ5R3JvdXA7fDtsaXN0R3JvdXA7fDtpbmRlbnRHcm91cDt8O2NvbG9yR3JvdXAiCis8LyNpZj4KKyBuYW1lPSIke3BhcmFtZXRlcnMubmFtZT9kZWZhdWx0KCIiKT9odG1sfSI8I3J0Lz4KKyBjb2xzPSIke3BhcmFtZXRlcnMuY29scz9kZWZhdWx0KCIiKT9odG1sfSI8I3J0Lz4KKyByb3dzPSIke3BhcmFtZXRlcnMucm93cz9kZWZhdWx0KCIiKT9odG1sfSI8I3J0Lz4KKzwjaWYgcGFyYW1ldGVycy53cmFwP2V4aXN0cz4KKyB3cmFwPSIke3BhcmFtZXRlcnMud3JhcD9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmRpc2FibGVkP2RlZmF1bHQoZmFsc2UpPgorIGRpc2FibGVkPSJkaXNhYmxlZCI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnJlYWRvbmx5P2RlZmF1bHQoZmFsc2UpPgorIHJlYWRvbmx5PSJyZWFkb25seSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLnRhYmluZGV4P2V4aXN0cz4KKyB0YWJpbmRleD0iJHtwYXJhbWV0ZXJzLnRhYmluZGV4P2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMuaWQ/ZXhpc3RzPgorIGlkPSIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaWYgcGFyYW1ldGVycy5jc3NDbGFzcz9leGlzdHM+CisgY2xhc3M9IiR7cGFyYW1ldGVycy5jc3NDbGFzcz9odG1sfSI8I3J0Lz4KKzwvI2lmPgorPCNpZiBwYXJhbWV0ZXJzLmNzc1N0eWxlP2V4aXN0cz4KKyBzdHlsZT0iJHtwYXJhbWV0ZXJzLmNzc1N0eWxlP2h0bWx9IjwjcnQvPgorPC8jaWY+Cis8I2lmIHBhcmFtZXRlcnMudGl0bGU/ZXhpc3RzPgorIHRpdGxlPSIke3BhcmFtZXRlcnMudGl0bGU/aHRtbH0iPCNydC8+Cis8LyNpZj4KKzwjaW5jbHVkZSAiLyR7cGFyYW1ldGVycy50ZW1wbGF0ZURpcn0vc2ltcGxlL3NjcmlwdGluZy1ldmVudHMuZnRsIiAvPgorPjwjcnQvPgorPCNpZiBwYXJhbWV0ZXJzLm5hbWVWYWx1ZT9leGlzdHM+Cis8QHMucHJvcGVydHkgdmFsdWU9InBhcmFtZXRlcnMubmFtZVZhbHVlIi8+PCN0Lz4KKzwvI2lmPgorPC90ZXh0YXJlYT4KKzwjaWYgcGFyYW1ldGVycy5wdXNoSWQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iKTs8L3NjcmlwdD4KKzwvI2lmPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90aGVtZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RoZW1lLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2MmZlNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90aGVtZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgJElkJAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitwYXJlbnQgPSB4aHRtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlLWNsb3NlLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlLWNsb3NlLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdiZGZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RyZWUtY2xvc2UuZnRsCkBAIC0wLDAgKzEsMzYgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzwjaWYgcGFyYW1ldGVycy5sYWJlbD9leGlzdHM+PC9kaXY+PC8jaWY+PC9kaXY+Cis8I2lmIHBhcmFtZXRlcnMucHVzaElkPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBkakNvbmZpZy5zZWFyY2hJZHMucHVzaCgidHJlZVNlbGVjdG9yXyR7cGFyYW1ldGVycy5pZD9kZWZhdWx0KCIiKT9odG1sfSIpOworICAgIGRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iKTsKKyAgICA8I2lmIHBhcmFtZXRlcnMuY2hpbGRyZW5JZHM/ZXhpc3RzPgorICAgICAgICBkakNvbmZpZy5zZWFyY2hJZHMucHVzaCg8I3J0PgorICAgICAgICA8I2xpc3QgcGFyYW1ldGVycy5jaGlsZHJlbklkcyBhcyBjaGlsZElkPgorICAgICAgICAgICAgIiR7Y2hpbGRJZD9odG1sfSI8I2lmIGNoaWxkSWRfaGFzX25leHQ+LDwvI2lmPjwjdD4KKyAgICAgICAgPC8jbGlzdD4KKyAgICAgICAgKTs8I3Q+CisgICAgPC8jaWY+ICAKKzwvc2NyaXB0PgorPC8jaWY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdHJlZS5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdHJlZS5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiOTA0OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlLmZ0bApAQCAtMCwwICsxLDEyNiBAQAorPCMtLQorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPCEtLQorICAgICAgICBkb2pvLnJlcXVpcmUoImRvam8ubGFuZy4qIik7CisgICAgICAgIGRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuKiIpOworICAgICAgICBkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRyZWUiKTsKKyAgICAgICAgLy8gZG9qby5ob3N0ZW52LndyaXRlSW5jbHVkZXMoKTsKKyAgICAgICAgLS0+CisgPC9zY3JpcHQ+CisgPCNpZiBwYXJhbWV0ZXJzLnNlbGVjdGVkTm90aWZ5VG9waWNzP2V4aXN0cyB8fCBwYXJhbWV0ZXJzLmV4cGFuZGVkTm90aWZ5VG9waWNzP2V4aXN0cworICAgICAgfHwgcGFyYW1ldGVycy5jb2xsYXBzZWROb3RpZnlUb3BpY3M/ZXhpc3RzPiAgCisgPHN0cnV0czpTdHJ1dHNUcmVlU2VsZWN0b3IgCisgICBpZD0idHJlZVNlbGVjdG9yXyR7cGFyYW1ldGVycy5pZD9kZWZhdWx0KCIiKX0iCisgICB3aWRnZXRJZD0idHJlZVNlbGVjdG9yXyR7cGFyYW1ldGVycy5pZD9kZWZhdWx0KCIiKX0iCisgIDwjaWYgcGFyYW1ldGVycy5zZWxlY3RlZE5vdGlmeVRvcGljcz9leGlzdHM+CisgIAlzZWxlY3RlZE5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLnNlbGVjdGVkTm90aWZ5VG9waWNzP2h0bWx9IgorICA8LyNpZj4gCisgIDwjaWYgcGFyYW1ldGVycy5leHBhbmRlZE5vdGlmeVRvcGljcz9leGlzdHM+CisgIAlleHBhbmRlZE5vdGlmeVRvcGljcz0iJHtwYXJhbWV0ZXJzLmV4cGFuZGVkTm90aWZ5VG9waWNzP2h0bWx9IgorICA8LyNpZj4gCisgIDwjaWYgcGFyYW1ldGVycy5jb2xsYXBzZWROb3RpZnlUb3BpY3M/ZXhpc3RzPgorICAJY29sbGFwc2VkTm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMuY29sbGFwc2VkTm90aWZ5VG9waWNzP2h0bWx9IgorICA8LyNpZj4gCisgID4KKyA8L3N0cnV0czpTdHJ1dHNUcmVlU2VsZWN0b3I+IAorIDwvI2lmPgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWUiICAgCisgICAgPCNpZiBwYXJhbWV0ZXJzLmhyZWY/aWZfZXhpc3RzICE9ICIiPgorICAgIGhyZWY9IiR7cGFyYW1ldGVycy5ocmVmfSIKKyAgICA8LyNpZj4KKyAgICA8I2lmIHBhcmFtZXRlcnMuZXJyb3JOb3RpZnlUb3BpY3M/aWZfZXhpc3RzICE9ICIiPgorICAgIGVycm9yTm90aWZ5VG9waWNzPSIke3BhcmFtZXRlcnMuZXJyb3JOb3RpZnlUb3BpY3M/aHRtbH0iPCNydC8+CisgICAgPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLmJsYW5rSWNvblNyYz9leGlzdHM+CisJZ3JpZEljb25TcmNUPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuYmxhbmtJY29uU3JjfScgZW5jb2RlPSJmYWxzZSIgaW5jbHVkZVBhcmFtcz0nbm9uZScvPiIKKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMuZ3JpZEljb25TcmNMP2V4aXN0cz4KKwlncmlkSWNvblNyY0w9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy5ncmlkSWNvblNyY0x9JyBlbmNvZGU9ImZhbHNlIiBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorCTwvI2lmPgorCTwjaWYgcGFyYW1ldGVycy5ncmlkSWNvblNyY1Y/ZXhpc3RzPgorCWdyaWRJY29uU3JjVj0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmdyaWRJY29uU3JjVn0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCisJPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLmdyaWRJY29uU3JjUD9leGlzdHM+CisJZ3JpZEljb25TcmNQPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuZ3JpZEljb25TcmNQfScgZW5jb2RlPSJmYWxzZSIgaW5jbHVkZVBhcmFtcz0nbm9uZScvPiIKKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMuZ3JpZEljb25TcmNDP2V4aXN0cz4KKwlncmlkSWNvblNyY0M9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy5ncmlkSWNvblNyY0N9JyBlbmNvZGU9ImZhbHNlIiBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorCTwvI2lmPgorCTwjaWYgcGFyYW1ldGVycy5ncmlkSWNvblNyY1g/ZXhpc3RzPgorCWdyaWRJY29uU3JjWD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmdyaWRJY29uU3JjWH0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCisJPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLmdyaWRJY29uU3JjWT9leGlzdHM+CisJZ3JpZEljb25TcmNZPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuZ3JpZEljb25TcmNZfScgZW5jb2RlPSJmYWxzZSIgaW5jbHVkZVBhcmFtcz0nbm9uZScvPiIKKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMuZ3JpZEljb25TcmNaP2V4aXN0cz4KKwlncmlkSWNvblNyY1o9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy5ncmlkSWNvblNyY1p9JyBlbmNvZGU9ImZhbHNlIiBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorCTwvI2lmPgorCTwjaWYgcGFyYW1ldGVycy5leHBhbmRJY29uU3JjUGx1cz9leGlzdHM+CisJZXhwYW5kSWNvblNyY1BsdXM9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy5leHBhbmRJY29uU3JjUGx1c30nIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCisJPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLmV4cGFuZEljb25TcmNNaW51cz9leGlzdHM+CisJZXhwYW5kSWNvblNyY01pbnVzPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuZXhwYW5kSWNvblNyY01pbnVzP2h0bWx9JyBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorCTwvI2lmPgorCTwjaWYgcGFyYW1ldGVycy5pY29uV2lkdGg/ZXhpc3RzPgorCWljb25XaWR0aD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmljb25XaWR0aD9odG1sfScgZW5jb2RlPSJmYWxzZSIgaW5jbHVkZVBhcmFtcz0nbm9uZScvPiIKKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMuaWNvbkhlaWdodD9leGlzdHM+CisJaWNvbkhlaWdodD0iPEBzLnVybCB2YWx1ZT0nJHtwYXJhbWV0ZXJzLmljb25IZWlnaHQ/aHRtbH0nIGVuY29kZT0iZmFsc2UiIGluY2x1ZGVQYXJhbXM9J25vbmUnLz4iCisJPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLnRvZ2dsZUR1cmF0aW9uP2V4aXN0cz4KKwl0b2dnbGVEdXJhdGlvbj0ke3BhcmFtZXRlcnMudG9nZ2xlRHVyYXRpb24/Y30KKwk8LyNpZj4KKwk8I2lmIHBhcmFtZXRlcnMudGVtcGxhdGVDc3NQYXRoP2V4aXN0cz4KKwl0ZW1wbGF0ZUNzc1BhdGg9IjxAcy51cmwgdmFsdWU9JyR7cGFyYW1ldGVycy50ZW1wbGF0ZUNzc1BhdGh9JyBlbmNvZGU9ImZhbHNlIiBpbmNsdWRlUGFyYW1zPSdub25lJy8+IgorCTwvI2lmPgorCTwjaWYgcGFyYW1ldGVycy5zaG93R3JpZD9leGlzdHM+CisJc2hvd0dyaWQ9IiR7cGFyYW1ldGVycy5zaG93R3JpZD9kZWZhdWx0KHRydWUpP3N0cmluZ30iCisJPC8jaWY+CisJPCNpZiBwYXJhbWV0ZXJzLnNob3dSb290R3JpZD9leGlzdHM+CisJc2hvd1Jvb3RHcmlkPSIke3BhcmFtZXRlcnMuc2hvd1Jvb3RHcmlkP2RlZmF1bHQodHJ1ZSk/c3RyaW5nfSIKKwk8LyNpZj4KKyAgICA8I2lmIHBhcmFtZXRlcnMuaWQ/ZXhpc3RzPgorICAgIGlkPSIke3BhcmFtZXRlcnMuaWQ/aHRtbH0iCisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLnNlbGVjdGVkTm90aWZ5VG9waWNzP2V4aXN0cyB8fCBwYXJhbWV0ZXJzLmV4cGFuZGVkTm90aWZ5VG9waWNzP2V4aXN0cworICAgICAgfHwgcGFyYW1ldGVycy5jb2xsYXBzZWROb3RpZnlUb3BpY3M/ZXhpc3RzPiAKKyAgICBzZWxlY3Rvcj0idHJlZVNlbGVjdG9yXyR7cGFyYW1ldGVycy5pZD9kZWZhdWx0KCIiKX0iCisgICAgPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLnRvZ2dsZT9leGlzdHM+CisgICAgdG9nZ2xlPSIke3BhcmFtZXRlcnMudG9nZ2xlP2h0bWx9IgorICAgIDwvI2lmPgorICAgID4KKyAgICA8I2lmIHBhcmFtZXRlcnMubGFiZWw/ZXhpc3RzPgorICAgIDxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IiR7cGFyYW1ldGVycy5sYWJlbD9odG1sfSIKKyAgICA8I2lmIHBhcmFtZXRlcnMubm9kZUlkUHJvcGVydHk/ZXhpc3RzPgorICAgIGlkPSIke3N0YWNrLmZpbmRWYWx1ZShwYXJhbWV0ZXJzLm5vZGVJZFByb3BlcnR5KX0iCisgICAgPCNlbHNlPgorICAgIGlkPSIke3BhcmFtZXRlcnMuaWR9X3Jvb3QiCisgICAgPC8jaWY+CisgICAgPgorICAgIDwjZWxzZWlmIHBhcmFtZXRlcnMucm9vdE5vZGU/ZXhpc3RzPgorICAgICR7c3RhY2sucHVzaChwYXJhbWV0ZXJzLnJvb3ROb2RlKX0KKyAgICA8I2luY2x1ZGUgIi8ke3BhcmFtZXRlcnMudGVtcGxhdGVEaXJ9L2FqYXgvdHJlZW5vZGUtaW5jbHVkZS5mdGwiIC8+CisgICAgPCNhc3NpZ24gb2xkTm9kZSA9IHN0YWNrLnBvcCgpLz4gPCMtLSBwb3AgdGhlIG5vZGUgb2ZmIG9mIHRoZSBzdGFjaywgYnV0IGRvbid0IHNob3cgaXQgLS0+CisgICAgPC8jaWY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdHJlZW5vZGUtY2xvc2UuZnRsIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RyZWVub2RlLWNsb3NlLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGU2ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RyZWVub2RlLWNsb3NlLmZ0bApAQCAtMCwwICsxLDIzIEBACis8Iy0tCisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlbm9kZS1pbmNsdWRlLmZ0bCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlbm9kZS1pbmNsdWRlLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWVlMmUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy90ZW1wbGF0ZS9hamF4L3RyZWVub2RlLWluY2x1ZGUuZnRsCkBAIC0wLDAgKzEsMjkgQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IiR7c3RhY2suZmluZFZhbHVlKHBhcmFtZXRlcnMubm9kZVRpdGxlUHJvcGVydHkpfSIgaWQ9IiR7c3RhY2suZmluZFZhbHVlKHBhcmFtZXRlcnMubm9kZUlkUHJvcGVydHkpfSI+Cis8I2xpc3Qgc3RhY2suZmluZFZhbHVlKHBhcmFtZXRlcnMuY2hpbGRDb2xsZWN0aW9uUHJvcGVydHkudG9TdHJpbmcoKSkhIGFzIGNoaWxkPgorICAgICR7c3RhY2sucHVzaChjaGlsZCl9CisgICAgPCNpbmNsdWRlICIvJHtwYXJhbWV0ZXJzLnRlbXBsYXRlRGlyfS9hamF4L3RyZWVub2RlLWluY2x1ZGUuZnRsIiAvPgorICAgIDwjYXNzaWduIG9sZE5vZGUgPSBzdGFjay5wb3AoKSAvPiA8Iy0tIHBvcCB0aGUgbm9kZSBvZmYgb2YgdGhlIHN0YWNrLCBidXQgZG9uJ3Qgc2hvdyBpdCAtLT4KKzwvI2xpc3Q+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVtcGxhdGUvYWpheC90cmVlbm9kZS5mdGwgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdHJlZW5vZGUuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzllY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3RlbXBsYXRlL2FqYXgvdHJlZW5vZGUuZnRsCkBAIC0wLDAgKzEsMjggQEAKKzwjLS0KKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgCisJPCNpZiBwYXJhbWV0ZXJzLmNoaWxkSWNvblNyYz9leGlzdHM+CisJY2hpbGRJY29uU3JjPSI8QHMudXJsIHZhbHVlPScke3BhcmFtZXRlcnMuY2hpbGRJY29uU3JjfScgaW5jbHVkZVBhcmFtcz0nbm9uZScgZW5jb2RlPSdmYWxzZScgLz4iCisJPC8jaWY+CisgICAgPCNpZiBwYXJhbWV0ZXJzLmlkP2V4aXN0cz5pZD0iJHtwYXJhbWV0ZXJzLmlkP2h0bWx9IjwvI2lmPgorICAgIHRpdGxlPSIke3BhcmFtZXRlcnMubGFiZWx9Ij4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvcHJvZmlsZS9SRUFETUUgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Byb2ZpbGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDQyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Byb2ZpbGUvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RvIGJ1aWxkIHRoZSBTdHJ1dHMgRG9qbyBwcm9maWxlOgorCisxLiBDaGVja291dCBEb2pvIGZyb20gc3ZuICgke2Rvam99IHJlZmVycyB0byBkb2pvJ3Mgcm9vdCBkaXIpIChtYWtlIHN1cmUgdGhhdCAke2Rvam99IGlzIG9uIHRoZSBzYW1lIGZvbGRlciBhcyAke3N0cnV0c30pCisKKzIuIENvcHkgc3RydXRzLnByb2ZpbGUuanMgdG8gJHtkb2pvfS9idWlsZHNjcmlwdHMvcHJvZmlsZXMKKworMy4gQ29weSAvcGx1Z2lucy9kb2pvL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzL0NvbWJvQm94LmNzcyB0bworICAgJHtkb2pvfS9zdHJ1dHMgKERvam8gYnVpbGQgc3lzdGVtIGRvZXNuJ3QgcmVzb2x2ZSB0aGUgcmVsYXRpdmUgcGF0aHMgdGhhdCB3ZWxsIGluIDAuNC4yKQorICAgCis0LiBJbnNpZGUgJHtkb2pvfS9idWlsZHNjcmlwdHMgcnVuOgorICAgJCBhbnQgLUR2ZXJzaW9uPTAuNC4yIC1EcHJvZmlsZT1zdHJ1dHMgY2xlYW4gcmVsZWFzZSBpbnRlcm4tc3RyaW5ncworICAgJCBjcCAuLi9yZWxlYXNlL2Rvam8vZG9qby5qcyAke3N0cnV0c30vcGx1Z2lucy9kb2pvL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzX2Rvam8uanMKKyAgICQgY3AgLi4vcmVsZWFzZS9kb2pvL2Rvam8uanMudW5jb21wcmVzc2VkLmpzICAke3N0cnV0c30vcGx1Z2lucy9kb2pvL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvc3RhdGljL2Rvam8vc3RydXRzX2Rvam8uanMudW5jb21wcmVzc2VkLmpzCisgICAkIGNwIC4uL3JlbGVhc2UvZG9qby9ubHMgJHtzdHJ1dHN9L3BsdWdpbnMvZG9qby9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL3N0YXRpYy9kb2pvLyAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9wcm9maWxlL3N0cnV0cy5wcm9maWxlLmpzIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9wcm9maWxlL3N0cnV0cy5wcm9maWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODc2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Byb2ZpbGUvc3RydXRzLnByb2ZpbGUuanMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIGRlcGVuZGVuY2llcyA9IFsKKwkiZG9qby5pby4qIiwKKwkiZG9qby5pby5Ccm93c2VySU8iLAorCSJkb2pvLmV2ZW50LioiLAorICAgICJkb2pvLmxmeC4qIiwKKyAgICAiZG9qby5uYW1lc3BhY2VzLioiLAorICAgICJkb2pvLndpZGdldC5FZGl0b3IyIiwKKyAgICAic3RydXRzLndpZGdldC4qIiwKK107CisKK2RlcGVuZGVuY2llcy5wcmVmaXhlcyA9IFsKKyAgIFsic3RydXRzIiwgIi4uL3N0cnV0cy9wbHVnaW5zL2Rvam8vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9zdGF0aWMvZG9qby9zdHJ1dHMiXQorXTsKKworbG9hZCgiZ2V0RGVwZW5kZW5jeUxpc3QuanMiKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E2NjdlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPHByb2plY3QgbmFtZT0iU3RydXRzIDIiPgorICAgIDxza2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNraW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mbHVpZG8tc2tpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjE8L3ZlcnNpb24+CisgICAgPC9za2luPgorICAgIDxiYW5uZXJMZWZ0PgorICAgICAgICA8bmFtZT5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICAgICAgPHNyYz5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaW1hZ2VzL2FzZi1sb2dvLmdpZjwvc3JjPgorICAgICAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgorICAgIDwvYmFubmVyTGVmdD4KKyAgICA8YmFubmVyUmlnaHQ+CisgICAgICAgIDxuYW1lPkFwYWNoZSBTdHJ1dHM8L25hbWU+CisgICAgICAgIDxzcmM+aHR0cDovL3N0cnV0cy5hcGFjaGUub3JnL2ltZy9zdHJ1dHMtbG9nby5zdmc8L3NyYz4KKyAgICAgICAgPGhyZWY+aHR0cDovL3N0cnV0cy5hcGFjaGUub3JnLzwvaHJlZj4KKyAgICA8L2Jhbm5lclJpZ2h0PgorICAgIDxwdWJsaXNoRGF0ZSBwb3NpdGlvbj0ibm9uZSIvPgorICAgIDx2ZXJzaW9uIHBvc2l0aW9uPSJub25lIi8+CisgICAgPGJvZHk+CisgICAgICAgIDxsaW5rcz4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgorICAgICAgICAgICAgPGl0ZW0gbmFtZT0iU3RydXRzIiBocmVmPSJodHRwOi8vc3RydXRzLmFwYWNoZS5vcmcvIi8+CisgICAgICAgIDwvbGlua3M+CisKKyAgICAgICAgPG1lbnUgcmVmPSJwYXJlbnQiLz4KKyAgICAgICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+CisKKyAgICAgICAgPGZvb3Rlcj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBzcGFuMTIiPgorICAgICAgICAgICAgICAgIEFwYWNoZSBTdHJ1dHMsIFN0cnV0cywgQXBhY2hlLCB0aGUgQXBhY2hlIGZlYXRoZXIgbG9nbywgYW5kIHRoZSBBcGFjaGUgU3RydXRzCisgICAgICAgICAgICAgICAgcHJvamVjdCBsb2dvcyBhcmUgdHJhZGVtYXJrcyBvZiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9mb290ZXI+CisKKyAgICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9UZXN0QWN0aW9uLmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby9UZXN0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyMjMyMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL1Rlc3RBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qbzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLkFjdGlvbjsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi5BY3Rpb25TdXBwb3J0OworCisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgVGVzdEFjdGlvbiBleHRlbmRzIEFjdGlvblN1cHBvcnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg4OTEzNjU1NjE5MTQ0NTE0OTRMOworCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3Rpb247CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3Rpb24yOworICAgIHByaXZhdGUgTWFwIG1hcDsKKyAgICBwcml2YXRlIFN0cmluZyBmb287CisgICAgcHJpdmF0ZSBJbnRlZ2VyIGZvb0ludDsKKyAgICBwcml2YXRlIFN0cmluZyByZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBhcnJheTsKKyAgICBwcml2YXRlIFN0cmluZ1tdW10gbGlzdDsKKyAgICBwcml2YXRlIExpc3QgbGlzdDI7CisgICAgcHJpdmF0ZSBMaXN0IGxpc3QzOworCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwIGdldE1hcCgpIHsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXAoTWFwIG1hcCkgeworICAgICAgICB0aGlzLm1hcCA9IG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsKKyAgICAgICAgcmV0dXJuIGZvbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb28oU3RyaW5nIGZvbykgeworICAgICAgICB0aGlzLmZvbyA9IGZvbzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoU3RyaW5nIHJlc3VsdCkgeworICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShTdHJpbmdbXSBhcnJheSkgeworICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdW10gZ2V0TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlzdChTdHJpbmdbXVtdIGxpc3QpIHsKKyAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRMaXN0MigpIHsKKyAgICAgICAgcmV0dXJuIGxpc3QyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpc3QyKExpc3QgbGlzdDIpIHsKKyAgICAgICAgdGhpcy5saXN0MiA9IGxpc3QyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpc3QzKExpc3QgbGlzdCkgeworICAgICAgICB0aGlzLmxpc3QzID0gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRMaXN0MygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGlzdDM7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbjIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb24yKENvbGxlY3Rpb24gY29sbGVjdGlvbikgeworICAgICAgICB0aGlzLmNvbGxlY3Rpb24yID0gY29sbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRGb29JbnQoKSB7CisgICAgICAgIHJldHVybiBmb29JbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9vSW50KEludGVnZXIgZm9vSW50KSB7CisgICAgICAgIHRoaXMuZm9vSW50ID0gZm9vSW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFjdGlvbi5TVUNDRVNTOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGRvSW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIElOUFVUOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0VGFnVGVzdC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0VGFnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYmY0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQWJzdHJhY3RUYWdUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuU2VydmxldEFjdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLlN0cnV0c1Rlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kaXNwYXRjaGVyLkFwcGxpY2F0aW9uTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kaXNwYXRjaGVyLkRpc3BhdGNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRpc3BhdGNoZXIuUmVxdWVzdE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZGlzcGF0Y2hlci5TZXNzaW9uTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLlRlc3RBY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uY29tcG9uZW50cy5IZWFkOworCitpbXBvcnQgY29tLm1vY2tvYmplY3RzLmR5bmFtaWMuTW9jazsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi5BY3Rpb247CitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIuQWN0aW9uQ29udGV4dDsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi5pbmplY3QuQ29udGFpbmVyOworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwuVmFsdWVTdGFjazsKKworCisvKioKKyAqIEJhc2UgY2xhc3MgdG8gZXh0ZW5kIGZvciB1bml0IHRlc3RpbmcgVUkgVGFncy4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhZ1Rlc3QgZXh0ZW5kcyBTdHJ1dHNUZXN0Q2FzZSB7CisgICAgcHJvdGVjdGVkIEFjdGlvbiBhY3Rpb247CisgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udGV4dDsKKyAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBzZXNzaW9uOworICAgIHByb3RlY3RlZCBWYWx1ZVN0YWNrIHN0YWNrOworCisgICAgLyoqCisgICAgICogY29udGFpbnMgdGhlIGJ1ZmZlciB0aGF0IG91ciB1bml0IHRlc3Qgd2lsbCB3cml0ZSB0by4gIHdlIGNhbiBsYXRlciB2ZXJpZnkgdGhpcyBidWZmZXIgZm9yIGNvcnJlY3RuZXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdXcml0ZXIgd3JpdGVyOworICAgIHByb3RlY3RlZCBTdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgcHJvdGVjdGVkIFN0cnV0c01vY2tQYWdlQ29udGV4dCBwYWdlQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKyAgICBwcm90ZWN0ZWQgU3RydXRzTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OworICAgIAorICAgIHByb3RlY3RlZCBNb2NrIG1vY2tDb250YWluZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBhY3Rpb24gdGhhdCB3ZSdyZSBnb2luZyB0byB0ZXN0IGFnYWluc3QuICBGb3IgbW9zdCBVSSB0ZXN0cywgdGhpcyBkZWZhdWx0IGFjdGlvbiBzaG91bGQgYmUgZW5vdWdoLgorICAgICAqIEhvd2V2ZXIsIHNpbXBseSBvdmVycmlkZSBnZXRBY3Rpb24gdG8gcmV0dXJuIGEgY3VzdG9tIEFjdGlvbiBpZiB5b3UgbmVlZCBzb21ldGhpbmcgbW9yZSBzb3BoaXN0aWNhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgQWN0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBWYWx1ZVN0YWNrIGFzIHBhcnQgb2YgdGhlIHVuaXQgdGVzdAorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb24gZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBY3Rpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBjcmVhdGUgb3VyIHN0YW5kYXJkIG1vY2sgb2JqZWN0cworICAgICAgICAgKi8KKyAgICAgICAgYWN0aW9uID0gdGhpcy5nZXRBY3Rpb24oKTsKKyAgICAgICAgc3RhY2sgPSBBY3Rpb25Db250ZXh0LmdldENvbnRleHQoKS5nZXRWYWx1ZVN0YWNrKCk7CisgICAgICAgIGNvbnRleHQgPSBzdGFjay5nZXRDb250ZXh0KCk7CisgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uKTsKKyAgICAgICAgY29udGV4dC5wdXQoSGVhZC5QQVJTRV9DT05URU5ULCBmYWxzZSk7CisKKyAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKFNlcnZsZXRBY3Rpb25Db250ZXh0LlNUUlVUU19WQUxVRVNUQUNLX0tFWSwgc3RhY2spOworICAgICAgICByZXNwb25zZSA9IG5ldyBTdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOworICAgICAgICByZXF1ZXN0LnNldFNlc3Npb24obmV3IFN0cnV0c01vY2tIdHRwU2Vzc2lvbigpKTsKKyAgICAgICAgcmVxdWVzdC5zZXR1cEdldFNlcnZsZXRQYXRoKCIvIik7CisKKyAgICAgICAgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgICAgIEpzcFdyaXRlciBqc3BXcml0ZXIgPSBuZXcgU3RydXRzTW9ja0pzcFdyaXRlcih3cml0ZXIpOworCisgICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbmV3IFN0cnV0c01vY2tTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRSZWFsUGF0aChuZXcgRmlsZSgibm9zdWNoZmlsZS5wcm9wZXJ0aWVzIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRTZXJ2bGV0SW5mbygiUmVzaW4iKTsKKworICAgICAgICBwYWdlQ29udGV4dCA9IG5ldyBTdHJ1dHNNb2NrUGFnZUNvbnRleHQoKTsKKyAgICAgICAgcGFnZUNvbnRleHQuc2V0UmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgcGFnZUNvbnRleHQuc2V0UmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBwYWdlQ29udGV4dC5zZXRKc3BXcml0ZXIoanNwV3JpdGVyKTsKKyAgICAgICAgcGFnZUNvbnRleHQuc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOworCisgICAgICAgIG1vY2tDb250YWluZXIgPSBuZXcgTW9jayhDb250YWluZXIuY2xhc3MpOworICAgICAgICBEaXNwYXRjaGVyIGR1ID0gbmV3IERpc3BhdGNoZXIocGFnZUNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworICAgICAgICBkdS5pbml0KCk7CisgICAgICAgIERpc3BhdGNoZXIuc2V0SW5zdGFuY2UoZHUpOworICAgICAgICBkdS5zZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uTWFuYWdlcik7CisgICAgICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbk1hcDxTdHJpbmcsIE9iamVjdD4ocmVxdWVzdCk7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZXh0cmFDb250ZXh0ID0gZHUuY3JlYXRlQ29udGV4dE1hcChuZXcgUmVxdWVzdE1hcChyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpLAorICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uTWFwKHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpLAorICAgICAgICAgICAgICAgIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UpOworICAgICAgICAvLyBsZXQncyBub3Qgc2V0IHRoZSBsb2NhbGUgLS0gdGhlcmUgaXMgYSB0ZXN0IHRoYXQgY2hlY2tzIGlmIERpc3BhdGNoZXIgYWN0dWFsbHkgcGlja3MgdGhpcyB1cC4uLgorICAgICAgICAvLyAuLi4gYnV0IGdlbmVyYWxseSB3ZSB3YW50IHRvIGp1c3QgdXNlIG5vIGxvY2FsZSAobGV0IGl0IHN0YXkgc3lzdGVtIGRlZmF1bHQpCisgICAgICAgIGV4dHJhQ29udGV4dC5yZW1vdmUoQWN0aW9uQ29udGV4dC5MT0NBTEUpOworICAgICAgICBzdGFjay5nZXRDb250ZXh0KCkucHV0QWxsKGV4dHJhQ29udGV4dCk7CisKKyAgICAgICAgY29udGV4dC5wdXQoU2VydmxldEFjdGlvbkNvbnRleHQuSFRUUF9SRVFVRVNULCByZXF1ZXN0KTsKKyAgICAgICAgY29udGV4dC5wdXQoU2VydmxldEFjdGlvbkNvbnRleHQuSFRUUF9SRVNQT05TRSwgcmVzcG9uc2UpOworICAgICAgICBjb250ZXh0LnB1dChTZXJ2bGV0QWN0aW9uQ29udGV4dC5TRVJWTEVUX0NPTlRFWFQsIHNlcnZsZXRDb250ZXh0KTsKKworICAgICAgICBBY3Rpb25Db250ZXh0LnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoY29udGV4dCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhZ2VDb250ZXh0LnZlcmlmeSgpOworICAgICAgICByZXF1ZXN0LnZlcmlmeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BYnN0cmFjdFVJVGFnVGVzdC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0Fic3RyYWN0VUlUYWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1NTEzYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BYnN0cmFjdFVJVGFnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuU2VydmxldEFjdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLnZpZXdzLmpzcC51aS5BYnN0cmFjdFVJVGFnOworCitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIuQWN0aW9uQ29udGV4dDsKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGNvbS5vcGVuc3ltcGhvbnkueHdvcmsyLnV0aWwubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VUlUYWdUZXN0IGV4dGVuZHMgQWJzdHJhY3RUYWdUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdFVJVGFnVGVzdC5jbGFzcyk7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVNQVJLRVJfRVJST1JfRVhQRUNUQVRJT04gPSAiSmF2YSBiYWNrdHJhY2UgZm9yIHByb2dyYW1tZXJzOiI7CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgaGVscGVyIGNsYXNzIGZvciBnZW5lcmljIHRhZyBwcm9wZXJ0eSB0ZXN0aW5nIG1lY2hhbmlzbS4gQmFzaWNhbGx5IGl0IGhvbGRzIGEgcHJvcGVydHkgbmFtZSwgYSBwcm9wZXJ0eQorICAgICAqIHZhbHVlIGFuZCBhbiBvdXRwdXQgdG8gYmUgZXhwZWN0ZWQgaW4gdGFnIG91dHB1dCB3aGVuIHByb3BlcnR5IHdhcyBhY2NvcmRpbmdseSBzZXQuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpnaWVsZW5AaXQtbmVlcmluZy5uZXQiPlJlbmUgR2llbGVuPC9hPgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUhvbGRlciB7CisgICAgICAgIFN0cmluZyBuYW1lLCB2YWx1ZSwgZXhwZWN0YXRpb247CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Qgc2ltcGxlIGhvbGRlciB3aXRoIGRlZmF1bHQgZXhwZWN0YXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lICBUaGUgcHJvcGVydHkgbmFtZSB0byB1c2UuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkgdmFsdWUgdG8gc2V0LgorICAgICAgICAgKiBAc2VlICNQcm9wZXJ0eUhvbGRlcihTdHJpbmcsIFN0cmluZywgU3RyaW5nKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb3BlcnR5SG9sZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMobmFtZSwgdmFsdWUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBwcm9wZXJ0eSBob2xkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgcHJvcGVydHkgbmFtZSB0byB1c2UuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgICBUaGUgcHJvcGVydHkgdmFsdWUgdG8gc2V0LgorICAgICAgICAgKiBAcGFyYW0gZXhwZWN0YXRpb24gVGhlIGV4cGVjdGVkIFN0cmluZyB0byBvY2N1ciBpbiB0YWcgb3V0cHV0IGNhdXNlZCBieSBzZXR0aW5nIGdpdmVuIHRhZyBwcm9wZXJ0eS4gSWYKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgIDx0dD5udWxsPC90dD4sIHdpbGwgYmUgc2V0IHRvIDxwcmU+bmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCI8L3ByZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUHJvcGVydHlIb2xkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIGV4cGVjdGF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgaWYgKGV4cGVjdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdGF0aW9uID0gZXhwZWN0YXRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0YXRpb24gPSBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBlYXNpbHkgYWRkaW5nIGFub255bW91cyBjb25zdHJ1Y3RlZCBpbnN0YW5jZSB0byBhIGdpdmVuIG1hcCwgd2l0aCB7QGxpbmsgI2dldE5hbWUoKX0KKyAgICAgICAgICogYXMga2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWFwIFRoZSBtYXAgdG8gcGxhY2UgdGhpcyBpbnN0YW5jZSBpbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRvTWFwKE1hcCBtYXApIHsKKyAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1hcC5wdXQodGhpcy5uYW1lLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBIZWxwZXIgZm9yIHNldHRpbmcgYmVhbiBwcm9wZXJ0aWVzLiBBbHRob3VnaCBCZWFuVXRpbHMgZnJvbSBvc2NvcmUgc2hvdWxkIHByb3ZpZGUgYmVhbiBwcm9wZXJ0eSBzZXR0aW5nCisgICAgICogZnVuY3Rpb25hbGl0eSwgaXQgZG9lcyBub3Qgd29yayAoYXQgbGVhc3Qgd2l0aCBteSBKREsgMS41LjBfMDUpLCBmYWlsaW5nIGluIGpkaydzIFByb3BlcnR5RGVzY3JpcHRvciBjb25zdHJ1Y3Rvci4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIHNhZmVseSBpbiBhbnkgY2FzZSwgYW5kIGRvZXMgbm90IGFkZCBkZXBlbmRlbmN5IG9uIGNvbW1vbnMtYmVhbnV0aWxzIGZvciBidWlsZGluZy4KKyAgICAgKiBUT0RPOiBDaGVjayBob3cgd2UgY2FuIHJlbW92ZSB0aGlzIGNyYXAgYWdhaW4uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpnaWVsZW5AaXQtbmVlcmluZy5uZXQiPlJlbmUgR2llbGVuPC9hPgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBCZWFuSGVscGVyIHsKKyAgICAgICAgTWFwIHByb3BEZXNjcmlwdG9yczsKKyAgICAgICAgT2JqZWN0IGJlYW47CisKKyAgICAgICAgcHVibGljIEJlYW5IZWxwZXIoT2JqZWN0IGJlYW4pIHsKKyAgICAgICAgICAgIHRoaXMuYmVhbiA9IGJlYW47CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzOworICAgICAgICAgICAgICAgIHBkcyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuLmdldENsYXNzKCkpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgICAgICAgICBwcm9wRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcChwZHMubGVuZ3RoICsgMSwgMWYpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBwcm9wRGVzY3JpcHRvcnMucHV0KHBkc1tpXS5nZXROYW1lKCksIHBkc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoUHJvcGVydHlEZXNjcmlwdG9yKSBwcm9wRGVzY3JpcHRvcnMuZ2V0KG5hbWUpOworCisgICAgICAgICAgICBpZiAocGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBkLmdldFdyaXRlTWV0aG9kKCkuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXXt2YWx1ZX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGEgbWFwIG9mIHtAbGluayBQcm9wZXJ0eUhvbGRlcn0gZm9yIGdlbmVyaWMgdGFnIHByb3BlcnR5IHRlc3RpbmcuIFdpbGwgYmUgdXNlZCB3aGVuIGNhbGxpbmcge0BsaW5rCisgICAgICogI3ZlcmlmeUdlbmVyaWNQcm9wZXJ0aWVzKG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy5qc3AudWkuQWJzdHJhY3RVSVRhZywgU3RyaW5nLCBTdHJpbmdbXSl9IGFzIHByb3BlcnRpZXMgdG8KKyAgICAgKiB2ZXJpZnkuPHAvPiBUaGlzIGltcGxlbWVudGF0aW9uIGRlZmluZXMgdGVzdGRhdGEgZm9yIGFsbCBjb21tb24gQWJzdHJhY3RVSVRhZyBwcm9wZXJ0aWVzIGFuZCBtYXkgYmUgb3ZlcnJpZGRlbiBpbgorICAgICAqIHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBpbml0aWFsaXplZEdlbmVyaWNUYWdUZXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigibmFtZSIsICJzb21lTmFtZSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigiaWQiLCAic29tZUlkIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgbmV3IFByb3BlcnR5SG9sZGVyKCJjc3NDbGFzcyIsICJjc3NDbGFzczEiLCAiY2xhc3M9XCJjc3NDbGFzczFcIiIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigiY3NzU3R5bGUiLCAiY3NzU3R5bGUxIiwgInN0eWxlPVwiY3NzU3R5bGUxXCIiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICBuZXcgUHJvcGVydHlIb2xkZXIoInRpdGxlIiwgInNvbWVUaXRsZSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigiZGlzYWJsZWQiLCAidHJ1ZSIsICJkaXNhYmxlZD1cImRpc2FibGVkXCIiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICAvL25ldyBQcm9wZXJ0eUhvbGRlcigibGFiZWwiLCAibGFiZWwiLCAibGFiZWw9XCJsYWJlbFwiIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgLy9uZXcgUHJvcGVydHlIb2xkZXIoInJlcXVpcmVkIiwgInNvbWVUaXRsZSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigidGFiaW5kZXgiLCAiOTkiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICBuZXcgUHJvcGVydHlIb2xkZXIoInZhbHVlIiwgInNvbWVWYWx1ZSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25jbGljayIsICJvbmNsaWNrMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25kYmxjbGljayIsICJvbmRibGNsaWNrMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25tb3VzZWRvd24iLCAib25tb3VzZWRvd24xIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgbmV3IFByb3BlcnR5SG9sZGVyKCJvbm1vdXNldXAiLCAib25tb3VzZXVwMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25tb3VzZW92ZXIiLCAib25tb3VzZW92ZXIxIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgbmV3IFByb3BlcnR5SG9sZGVyKCJvbm1vdXNlbW92ZSIsICJvbm1vdXNlbW92ZTEiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICBuZXcgUHJvcGVydHlIb2xkZXIoIm9ubW91c2VvdXQiLCAib25tb3VzZW91dDEiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICBuZXcgUHJvcGVydHlIb2xkZXIoIm9uZm9jdXMiLCAib25mb2N1czEiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICBuZXcgUHJvcGVydHlIb2xkZXIoIm9uYmx1ciIsICJvbmJsdXIxIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgbmV3IFByb3BlcnR5SG9sZGVyKCJvbmtleXByZXNzIiwgIm9ua2V5cHJlc3MxIikuYWRkVG9NYXAocmVzdWx0KTsKKyAgICAgICAgbmV3IFByb3BlcnR5SG9sZGVyKCJvbmtleWRvd24iLCAib25rZXlkb3duMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25rZXl1cCIsICJvbmtleXVwMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25jbGljayIsICJvbmNsaWNrMSIpLmFkZFRvTWFwKHJlc3VsdCk7CisgICAgICAgIG5ldyBQcm9wZXJ0eUhvbGRlcigib25zZWxlY3QiLCAib25jaGFuZ2UiKS5hZGRUb01hcChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGEgZ2VuZXJpYyB2ZXJpZmljYXRpb24gdGhhdCBzZXR0aW5nIGNlcnRhaW4gcHJvcGVydGllcyBvbiBhIHRhZyBjYXVzZXMgZXhwZWN0ZWQgb3V0cHV0IHJlZ2FyZGluZyB0aGlzCisgICAgICogcHJvcGVydHkuIEluIG1vc3QgY2FzZXMgeW91IHdvdWxkIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgdXNlIHtAbGluaworICAgICAqICN2ZXJpZnlHZW5lcmljUHJvcGVydGllcyhvcmcuYXBhY2hlLnN0cnV0czIudmlld3MuanNwLnVpLkFic3RyYWN0VUlUYWcsIFN0cmluZywgU3RyaW5nW10pfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgICAgICAgICAgICAgIFRoZSBmcmVzaCBjcmVhdGVkIHRhZyBpbnN0YW5jZSB0byB0ZXN0LgorICAgICAqIEBwYXJhbSB0aGVtZSAgICAgICAgICAgIFRoZSB0aGVtZSB0byB1c2UuIElmIDx0dD5udWxsPC90dD4sIHVzZSBjb25maWd1cmVkIGRlZmF1bHQgdGhlbWUuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNUb1Rlc3QgTWFwIG9mIHtAbGluayBQcm9wZXJ0eUhvbGRlcn1zLCBkZWZpbmluZyBwcm9wZXJ0aWVzIHRvIHRlc3QuCisgICAgICogQHBhcmFtIGV4Y2x1ZGUgICAgICAgICAgTmFtZXMgb2YgcHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gcGFydGljdWxhciB0ZXN0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5R2VuZXJpY1Byb3BlcnRpZXMoQWJzdHJhY3RVSVRhZyB0YWcsIFN0cmluZyB0aGVtZSwgTWFwIHByb3BlcnRpZXNUb1Rlc3QsIFN0cmluZ1tdIGV4Y2x1ZGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodGFnICE9IG51bGwgJiYgcHJvcGVydGllc1RvVGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0IGV4Y2x1ZGVMaXN0OworICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4Y2x1ZGVMaXN0ID0gQXJyYXlzLmFzTGlzdChleGNsdWRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhjbHVkZUxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAgICAgaWYgKHRoZW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0YWcuc2V0VGhlbWUodGhlbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCZWFuSGVscGVyIGJlYW5IZWxwZXIgPSBuZXcgQmVhbkhlbHBlcih0YWcpOworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBwcm9wZXJ0aWVzVG9UZXN0LnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlIb2xkZXIgcHJvcGVydHlIb2xkZXIgPSAoUHJvcGVydHlIb2xkZXIpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoISBleGNsdWRlTGlzdC5jb250YWlucyhwcm9wZXJ0eUhvbGRlci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlYW5IZWxwZXIuc2V0KHByb3BlcnR5SG9sZGVyLmdldE5hbWUoKSwgcHJvcGVydHlIb2xkZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgICAgIHRhZy5kb0VuZFRhZygpOworICAgICAgICAgICAgU3RyaW5nIHdyaXRlclN0cmluZyA9IG5vcm1hbGl6ZSh3cml0ZXIudG9TdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoTE9HLmlzSW5mb0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIExPRy5pbmZvKCJBYnN0cmFjdFVJVGFnVGVzdCAtIFt2ZXJpZnlHZW5lcmljUHJvcGVydGllc106IFRhZyBvdXRwdXQgaXMgIiArIHdyaXRlclN0cmluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZyZWVtYXJrZXIgZXJyb3IgZGV0ZWN0ZWQgaW4gdGFnIG91dHB1dDogIiArIHdyaXRlclN0cmluZywgd3JpdGVyU3RyaW5nLmluZGV4T2YoRlJFRU1BUktFUl9FUlJPUl9FWFBFQ1RBVElPTikgPT0gLTEpOworCisgICAgICAgICAgICBpdCA9IHByb3BlcnRpZXNUb1Rlc3QudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUhvbGRlciBwcm9wZXJ0eUhvbGRlciA9IChQcm9wZXJ0eUhvbGRlcikgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGlmICghIGV4Y2x1ZGVMaXN0LmNvbnRhaW5zKHByb3BlcnR5SG9sZGVyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdG8gZmluZDogIiArIHByb3BlcnR5SG9sZGVyLmdldEV4cGVjdGF0aW9uKCkgKyAiIGluIHJlc3VsdGluZyBTdHJpbmc6ICIgKyB3cml0ZXJTdHJpbmcsIHdyaXRlclN0cmluZy5pbmRleE9mKHByb3BlcnR5SG9sZGVyLmdldEV4cGVjdGF0aW9uKCkpID4gLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGEgZ2VuZXJpYyB2ZXJpZmljYXRpb24gdGhhdCBzZXR0aW5nIGNlcnRhaW4gcHJvcGVydGllcyBvbiBhIHRhZyBjYXVzZXMgZXhwZWN0ZWQgb3V0cHV0IHJlZ2FyZGluZyB0aGlzCisgICAgICogcHJvcGVydHkuIFdoaWNoIHByb3BlcnRpZXMgdG8gdGVzdCB3aXRoIHdoaWNoIGV4cGVjdGF0aW9ucyB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIE1hcCByZXRyaWV2ZWQgYnkge0BsaW5rICNpbml0aWFsaXplZEdlbmVyaWNUYWdUZXN0UHJvcGVydGllcygpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgICAgICAgICAgICAgIFRoZSBmcmVzaCBjcmVhdGVkIHRhZyBpbnN0YW5jZSB0byB0ZXN0LgorICAgICAqIEBwYXJhbSB0aGVtZSAgICAgICAgICAgIFRoZSB0aGVtZSB0byB1c2UuIElmIDx0dD5udWxsPC90dD4sIHVzZSBjb25maWd1cmVkIGRlZmF1bHQgdGhlbWUuCisgICAgICogQHBhcmFtIGV4Y2x1ZGUgICAgICAgICAgTmFtZXMgb2YgcHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gcGFydGljdWxhciB0ZXN0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5R2VuZXJpY1Byb3BlcnRpZXMoQWJzdHJhY3RVSVRhZyB0YWcsIFN0cmluZyB0aGVtZSwgU3RyaW5nW10gZXhjbHVkZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHZlcmlmeUdlbmVyaWNQcm9wZXJ0aWVzKHRhZywgdGhlbWUsIGluaXRpYWxpemVkR2VuZXJpY1RhZ1Rlc3RQcm9wZXJ0aWVzKCksIGV4Y2x1ZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzLndyaXRlciBhZ2FpbnN0IHRoZSBjb250ZW50cyBvZiB0aGUgVVJMIHNwZWNpZmllZC4gIHZlcmlmeSgpIHBlcmZvcm1zIGEKKyAgICAgKiB0cmltIG9uIGJvdGggZW5kcworICAgICAqCisgICAgICogQHBhcmFtIHVybCB0aGUgSFRNTCBzbmlwcGV0IHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSBhZ2FpbnN0CisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHZhbGlkYXRpb24gZmFpbGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5KFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoInVuYWJsZSB0byB2ZXJpZnkgYSBudWxsIFVSTCIpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMud3JpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoIkFic3RyYWN0SnNwV3JpdGVyLndyaXRlciBub3QgaW5pdGlhbGl6ZWQuICBVbmFibGUgdG8gdmVyaWZ5Iik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgaW50IG5ieXRlczsKKworICAgICAgICB3aGlsZSAoKG5ieXRlcyA9IGluLnJlYWQoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcoYnVmLCAwLCBuYnl0ZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNvbXBhcmUgdGhlIHRyaW1tZWQgdmFsdWVzIG9mIGVhY2ggYnVmZmVyIGFuZCBtYWtlIHN1cmUgdGhleSdyZSBlcXVpdmFsZW50LiAgaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIHRvCisgICAgICAgICAqIG5vcm1hbGl6ZSB0aGUgc3RyaW5ncyBmaXJzdCB0byBhY2NvdW50IGZvciBsaW5lIHRlcm1pbmF0aW9uIGRpZmZlcmVuY2VzIGJldHdlZW4gcGxhdGZvcm1zLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHdyaXRlclN0cmluZyA9IG5vcm1hbGl6ZSh3cml0ZXIudG9TdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFN0cmluZyBidWZmZXJTdHJpbmcgPSBub3JtYWxpemUoYnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhidWZmZXJTdHJpbmcsIHdyaXRlclN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byB2ZXJpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMud3JpdGVyIGFnYWluc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBVUkwgc3BlY2lmaWVkLiAgdmVyaWZ5KCkgcGVyZm9ybXMgYQorICAgICAqIHRyaW0gb24gYm90aCBlbmRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIHRoZSBIVE1MIHNuaXBwZXQgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlIGFnYWluc3QKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgdmFsaWRhdGlvbiBmYWlsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoVVJMIHVybCwgU3RyaW5nW10gZXhjbHVkZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoInVuYWJsZSB0byB2ZXJpZnkgYSBudWxsIFVSTCIpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMud3JpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhaWwoIkFic3RyYWN0SnNwV3JpdGVyLndyaXRlciBub3QgaW5pdGlhbGl6ZWQuICBVbmFibGUgdG8gdmVyaWZ5Iik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgaW50IG5ieXRlczsKKworICAgICAgICB3aGlsZSAoKG5ieXRlcyA9IGluLnJlYWQoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcoYnVmLCAwLCBuYnl0ZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNvbXBhcmUgdGhlIHRyaW1tZWQgdmFsdWVzIG9mIGVhY2ggYnVmZmVyIGFuZCBtYWtlIHN1cmUgdGhleSdyZSBlcXVpdmFsZW50LiAgaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIHRvCisgICAgICAgICAqIG5vcm1hbGl6ZSB0aGUgc3RyaW5ncyBmaXJzdCB0byBhY2NvdW50IGZvciBsaW5lIHRlcm1pbmF0aW9uIGRpZmZlcmVuY2VzIGJldHdlZW4gcGxhdGZvcm1zLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHdyaXRlclN0cmluZyA9IG5vcm1hbGl6ZSh3cml0ZXIudG9TdHJpbmcoKSwgdHJ1ZSk7CisgICAgICAgIFN0cmluZyBidWZmZXJTdHJpbmcgPSBub3JtYWxpemUoYnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhidWZmZXJTdHJpbmcsIHdyaXRlclN0cmluZyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBTZXJ2bGV0QWN0aW9uQ29udGV4dC5zZXRTZXJ2bGV0Q29udGV4dChwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBBY3Rpb25Db250ZXh0LnNldENvbnRleHQobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbm9ybWFsaXplcyBhIHN0cmluZyBzbyB0aGF0IHN0cmluZ3MgZ2VuZXJhdGVkIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgY2FuIGJlIGNvbXBhcmVkLiAgYW55IGdyb3VwIG9mIG9uZSBvciBtb3JlCisgICAgICogc3BhY2UsIHRhYiwgXHIsIGFuZCBcbiBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUgc3BhY2UgY2hhcmFjdGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgbm9ybWFsaXplZC4gIG5vcm1hbGl6ZSB3aWxsIHBlcmZvcm0gaXRzIG9wZXJhdGlvbiBvbiBvYmoudG9TdHJpbmcoKS50cmltKCkgOworICAgICAqIEBwYXJhbSBhcHBlbmRTcGFjZQorICAgICAqIEByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKE9iamVjdCBvYmosIGJvb2xlYW4gYXBwZW5kU3BhY2UpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihvYmoudG9TdHJpbmcoKS50cmltKCksICIgXHRcclxuIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7CisKKyAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdC5uZXh0VG9rZW4oKSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBpZiAoYXBwZW5kU3BhY2UgJiYgc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BbmNob3JUZXN0LmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQW5jaG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWVhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQW5jaG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8uVGVzdEFjdGlvbjsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBBbmNob3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RVSVRhZ1Rlc3QgeworCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0QWN0aW9uIHRlc3RBY3Rpb24gPSAoVGVzdEFjdGlvbikgYWN0aW9uOworICAgICAgICB0ZXN0QWN0aW9uLnNldEZvbygiYmFyIik7CisKKyAgICAgICAgQW5jaG9yVGFnIHRhZyA9IG5ldyBBbmNob3JUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKworICAgICAgICB0YWcuc2V0SWQoIm15bGluayIpOworICAgICAgICB0YWcuc2V0SHJlZigiYSIpOworICAgICAgICB0YWcuc2V0RXJyb3JUZXh0KCJjIik7CisgICAgICAgIHRhZy5zZXRMb2FkaW5nVGV4dCgiZCIpOworICAgICAgICB0YWcuc2V0QmVmb3JlTm90aWZ5VG9waWNzKCJlIik7CisgICAgICAgIHRhZy5zZXRBZnRlck5vdGlmeVRvcGljcygiZiIpOworICAgICAgICB0YWcuc2V0TGlzdGVuVG9waWNzKCJnIik7CisgICAgICAgIHRhZy5zZXRUYXJnZXRzKCJoIik7CisgICAgICAgIHRhZy5zZXRIYW5kbGVyKCJpIik7CisgICAgICAgIHRhZy5zZXROb3RpZnlUb3BpY3MoImoiKTsKKyAgICAgICAgdGFnLnNldEluZGljYXRvcigiayIpOworICAgICAgICB0YWcuc2V0U2hvd0Vycm9yVHJhbnNwb3J0VGV4dCgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0U2hvd0xvYWRpbmdUZXh0KCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRFcnJvck5vdGlmeVRvcGljcygibCIpOworICAgICAgICB0YWcuc2V0SGlnaGxpZ2h0Q29sb3IoIm0iKTsKKyAgICAgICAgdGFnLnNldEhpZ2hsaWdodER1cmF0aW9uKCJuIik7CisgICAgICAgIHRhZy5zZXRWYWxpZGF0ZSgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0QWpheEFmdGVyVmFsaWRhdGlvbigidHJ1ZSIpOworICAgICAgICB0YWcuc2V0U2VwYXJhdGVTY3JpcHRzKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRUcmFuc3BvcnQoIm8iKTsKKyAgICAgICAgdGFnLnNldFBhcnNlQ29udGVudCgiZmFsc2UiKTsKKyAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgdGFnLmRvRW5kVGFnKCk7CisKKyAgICAgICAgdmVyaWZ5KEFuY2hvclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoImhyZWYtMS50eHQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQXV0b2NvbXBsZXRlclRlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BdXRvY29tcGxldGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDUwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQXV0b2NvbXBsZXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworLyoqCisgKiBAc2VlIG9yZy5hcGFjaGUuc3RydXRzMi5jb21wb25lbnRzLkF1dG9jb21wbGV0ZXIKKyAqLworcHVibGljIGNsYXNzIEF1dG9jb21wbGV0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RVSVRhZ1Rlc3QgeworCisgICAgcHVibGljIHZvaWQgdGVzdEFqYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXV0b2NvbXBsZXRlclRhZyB0YWcgPSBuZXcgQXV0b2NvbXBsZXRlclRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICB0YWcuc2V0QXV0b0NvbXBsZXRlKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXREaXNhYmxlZCgiZmFsc2UiKTsKKyAgICAgICAgdGFnLnNldEZvcmNlVmFsaWRPcHRpb24oImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRIcmVmKCJhIik7CisgICAgICAgIHRhZy5zZXREcm9wZG93bldpZHRoKCIxMCIpOworICAgICAgICB0YWcuc2V0RHJvcGRvd25IZWlnaHQoIjEwIik7CisgICAgICAgIHRhZy5zZXREZWxheSgiMTAwIik7CisgICAgICAgIHRhZy5zZXRTZWFyY2hUeXBlKCJiIik7CisgICAgICAgIHRhZy5zZXREaXNhYmxlZCgiYyIpOworICAgICAgICB0YWcuc2V0TmFtZSgiZiIpOworICAgICAgICB0YWcuc2V0SWQoImYiKTsKKyAgICAgICAgdGFnLnNldFZhbHVlKCJnIik7CisgICAgICAgIHRhZy5zZXRJbmRpY2F0b3IoImgiKTsKKyAgICAgICAgdGFnLnNldEtleU5hbWUoImkiKTsKKyAgICAgICAgdGFnLnNldExvYWRPblRleHRDaGFuZ2UoInRydWUiKTsKKyAgICAgICAgdGFnLnNldExvYWRNaW5pbXVtQ291bnQoIjMiKTsKKyAgICAgICAgdGFnLnNldFNob3dEb3duQXJyb3coImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRJY29uUGF0aCgiaSIpOworICAgICAgICB0YWcuc2V0VGVtcGxhdGVDc3NQYXRoKCJqIik7CisgICAgICAgIHRhZy5zZXREYXRhRmllbGROYW1lKCJrIik7CisgICAgICAgIHRhZy5zZXRWYWx1ZU5vdGlmeVRvcGljcygibCIpOworICAgICAgICB0YWcuc2V0UmVzdWx0c0xpbWl0KCIyIik7CisgICAgICAgIHRhZy5zZXRUcmFuc3BvcnQoIm0iKTsKKyAgICAgICAgdGFnLnNldFByZWxvYWQoInRydWUiKTsKKyAgICAgICAgdGFnLnNldEtleVZhbHVlKCJrZXkiKTsKKyAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgdGFnLmRvRW5kVGFnKCk7CisKKyAgICAgICAgdmVyaWZ5KEF1dG9jb21wbGV0ZXJUZXN0LmNsYXNzLmdldFJlc291cmNlKCJBdXRvY29tcGxldGVyLTEudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXV0b2NvbXBsZXRlclRhZyB0YWcgPSBuZXcgQXV0b2NvbXBsZXRlclRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICB0YWcuc2V0QXV0b0NvbXBsZXRlKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXREaXNhYmxlZCgiZmFsc2UiKTsKKyAgICAgICAgdGFnLnNldEZvcmNlVmFsaWRPcHRpb24oImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRMaXN0KCJ7J2QnLCdlJ30iKTsKKyAgICAgICAgdGFnLnNldERyb3Bkb3duV2lkdGgoIjEwIik7CisgICAgICAgIHRhZy5zZXREcm9wZG93bkhlaWdodCgiMTAiKTsKKyAgICAgICAgdGFnLnNldERlbGF5KCIxMDAiKTsKKyAgICAgICAgdGFnLnNldFNlYXJjaFR5cGUoImIiKTsKKyAgICAgICAgdGFnLnNldERpc2FibGVkKCJjIik7CisgICAgICAgIHRhZy5zZXROYW1lKCJmIik7CisgICAgICAgIHRhZy5zZXRJZCgiZiIpOworICAgICAgICB0YWcuc2V0SWNvblBhdGgoImkiKTsKKyAgICAgICAgdGFnLnNldFRlbXBsYXRlQ3NzUGF0aCgiaiIpOworICAgICAgICB0YWcuc2V0VmFsdWVOb3RpZnlUb3BpY3MoImsiKTsKKyAgICAgICAgdGFnLnNldFJlc3VsdHNMaW1pdCgiMiIpOworICAgICAgICB0YWcuZG9TdGFydFRhZygpOworICAgICAgICB0YWcuZG9FbmRUYWcoKTsKKworICAgICAgICB2ZXJpZnkoQXV0b2NvbXBsZXRlclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoIkF1dG9jb21wbGV0ZXItMi50eHQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZFRlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9CaW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzU4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZFRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLlRlc3RBY3Rpb247CisKK3B1YmxpYyBjbGFzcyBCaW5kVGVzdCBleHRlbmRzIEFic3RyYWN0VUlUYWdUZXN0IHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RBY3Rpb24gdGVzdEFjdGlvbiA9IChUZXN0QWN0aW9uKSBhY3Rpb247CisgICAgICAgIHRlc3RBY3Rpb24uc2V0Rm9vKCJiYXIiKTsKKworICAgICAgICBCaW5kVGFnIHRhZyA9IG5ldyBCaW5kVGFnKCk7CisgICAgICAgIHRhZy5zZXRQYWdlQ29udGV4dChwYWdlQ29udGV4dCk7CisKKyAgICAgICAgdGFnLnNldElkKCJhIik7CisgICAgICAgIHRhZy5zZXRIcmVmKCJiIik7CisgICAgICAgIHRhZy5zZXRMb2FkaW5nVGV4dCgiYyIpOworICAgICAgICB0YWcuc2V0RXJyb3JUZXh0KCJkIik7CisgICAgICAgIHRhZy5zZXRMaXN0ZW5Ub3BpY3MoImUiKTsKKyAgICAgICAgdGFnLnNldEJlZm9yZU5vdGlmeVRvcGljcygiZiIpOworICAgICAgICB0YWcuc2V0QWZ0ZXJOb3RpZnlUb3BpY3MoImciKTsKKyAgICAgICAgdGFnLnNldEhhbmRsZXIoImgiKTsKKyAgICAgICAgdGFnLnNldE5vdGlmeVRvcGljcygiayIpOworICAgICAgICB0YWcuc2V0SW5kaWNhdG9yKCJsIik7CisgICAgICAgIHRhZy5zZXRTaG93TG9hZGluZ1RleHQoInRydWUiKTsKKyAgICAgICAgdGFnLnNldEVycm9yTm90aWZ5VG9waWNzKCJtIik7CisgICAgICAgIHRhZy5zZXRTb3VyY2VzKCJuIik7CisgICAgICAgIHRhZy5zZXRFdmVudHMoIm8iKTsKKyAgICAgICAgdGFnLnNldEhpZ2hsaWdodENvbG9yKCJwIik7CisgICAgICAgIHRhZy5zZXRIaWdobGlnaHREdXJhdGlvbigicSIpOworICAgICAgICB0YWcuc2V0VmFsaWRhdGUoInRydWUiKTsKKyAgICAgICAgdGFnLnNldFNlcGFyYXRlU2NyaXB0cygidHJ1ZSIpOworICAgICAgICB0YWcuc2V0VHJhbnNwb3J0KCJxIik7CisgICAgICAgIHRhZy5zZXRQYXJzZUNvbnRlbnQoImZhbHNlIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShCaW5kVGVzdC5jbGFzcy5nZXRSZXNvdXJjZSgiQmluZC0xLnR4dCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQ2F0ZWdvcnkuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9DYXRlZ29yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTViMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQ2F0ZWdvcnkuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVXNlZCBieSBUcmVlIENvbXBvbmVudCBUZXN0LiBDb3BpZWQgZnJvbSBzaG93Y2FzZS4KKyAqLworcHVibGljIGNsYXNzIENhdGVnb3J5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8TG9uZywgQ2F0ZWdvcnk+IGNhdE1hcCA9IG5ldyBIYXNoTWFwPExvbmcsIENhdGVnb3J5PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgbmV3IENhdGVnb3J5KDEsICJSb290IiwKKyAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoMiwgIkphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhdGVnb3J5KDMsICJXZWIgRnJhbWV3b3JrcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYXRlZ29yeSg0LCAiU3RydXRzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYXRlZ29yeSg3LCAiU3RyaXBlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoOCwgIlJpZmUiKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoOSwgIlBlcnNpc3RlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhdGVnb3J5KDEwLCAiaUJhdGlzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYXRlZ29yeSgxMSwgIkhpYmVybmF0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoMTIsICJKRE8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhdGVnb3J5KDEzLCAiSkRCQyIpKSksCisgICAgICAgICAgICAgICAgbmV3IENhdGVnb3J5KDE0LCAiSmF2YVNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoMTUsICJEb2pvIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoMTYsICJQcm90b3R5cGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYXRlZ29yeSgxNywgIlNjcmlwdGFjdWxvdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYXRlZ29yeSgxOCwgIk9wZW5SaWNvIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2F0ZWdvcnkoMTksICJEV1IiKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2F0ZWdvcnkgZ2V0QnlJZChsb25nIGlkKSB7CisgICAgICAgIHJldHVybiBjYXRNYXAuZ2V0KGlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIExpc3Q8Q2F0ZWdvcnk+IGNoaWxkcmVuOworICAgIHByaXZhdGUgYm9vbGVhbiB0b2dnbGU7CisKKyAgICBwdWJsaWMgQ2F0ZWdvcnkobG9uZyBpZCwgU3RyaW5nIG5hbWUsIENhdGVnb3J5Li4uIGNoaWxkcmVuKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnk+KCk7CisgICAgICAgIGZvciAoQ2F0ZWdvcnkgY2hpbGQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgY2F0TWFwLnB1dChpZCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDYXRlZ29yeT4gZ2V0Q2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0PENhdGVnb3J5PiBjaGlsZHJlbikgeworICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG9nZ2xlKCkgeworICAgICAgICB0b2dnbGUgPSAhdG9nZ2xlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVG9nZ2xlKCkgeworICAgICAgICByZXR1cm4gdG9nZ2xlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZ1Rlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRkNzJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0RhdGVUaW1lUGlja2VyVGFnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuRGF0ZVRpbWVQaWNrZXI7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgRGF0ZVRpbWVQaWNrZXJUYWdUZXN0IGV4dGVuZHMgQWJzdHJhY3RVSVRhZ1Rlc3QgeworICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgUkZDMzMzOV9GT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKKyAgICAgICAgInl5eXktTU0tZGQnVCdISDptbTpzcyIpOworCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEYXRlVGltZVBpY2tlclRhZyB0YWcgPSBuZXcgRGF0ZVRpbWVQaWNrZXJUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKworICAgICAgICB0YWcuc2V0SWQoImlkIik7CisKKyAgICAgICAgdGFnLnNldEFkanVzdFdlZWtzKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXREYXlXaWR0aCgiYiIpOworICAgICAgICB0YWcuc2V0RGlzcGxheVdlZWtzKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRFbmREYXRlKCIleycyMDA4LTAxLTAxJ30iKTsKKyAgICAgICAgdGFnLnNldFN0YXJ0RGF0ZSgiJXsnMjAwOC0wMi0wMid9Iik7CisgICAgICAgIHRhZy5zZXRTdGF0aWNEaXNwbGF5KCJmYWxzZSIpOworICAgICAgICB0YWcuc2V0V2Vla1N0YXJ0c09uKCJnIik7CisgICAgICAgIHRhZy5zZXROYW1lKCJoIik7CisgICAgICAgIHRhZy5zZXRMYW5ndWFnZSgiaSIpOworICAgICAgICB0YWcuc2V0VGVtcGxhdGVDc3NQYXRoKCJqIik7CisgICAgICAgIHRhZy5zZXRWYWx1ZU5vdGlmeVRvcGljcygiayIpOworICAgICAgICB0YWcuc2V0VmFsdWUoIiV7JzIwMDgtMDMtMDMnfSIpOworICAgICAgICB0YWcuZG9TdGFydFRhZygpOworICAgICAgICB0YWcuZG9FbmRUYWcoKTsKKworICAgICAgICB2ZXJpZnkoRGF0ZVRpbWVQaWNrZXJUYWdUZXN0LmNsYXNzCisgICAgICAgICAgICAuZ2V0UmVzb3VyY2UoIkRhdGVUaW1lUGlja2VyVGFnVGVzdC0xLnR4dCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0ZVRpbWVQaWNrZXJUYWcgdGFnID0gbmV3IERhdGVUaW1lUGlja2VyVGFnKCk7CisgICAgICAgIHRhZy5zZXRQYWdlQ29udGV4dChwYWdlQ29udGV4dCk7CisKKyAgICAgICAgdGFnLnNldElkKCJpZCIpOworCisgICAgICAgIHRhZy5zZXRBZGp1c3RXZWVrcygidHJ1ZSIpOworICAgICAgICB0YWcuc2V0RGF5V2lkdGgoImIiKTsKKyAgICAgICAgdGFnLnNldERpc3BsYXlXZWVrcygidHJ1ZSIpOworICAgICAgICB0YWcuc2V0RW5kRGF0ZSgiJXsnMjAwOC0wMS0wMSd9Iik7CisgICAgICAgIHRhZy5zZXRTdGFydERhdGUoIiV7JzIwMDgtMDItMDInfSIpOworICAgICAgICB0YWcuc2V0U3RhdGljRGlzcGxheSgiZmFsc2UiKTsKKyAgICAgICAgdGFnLnNldFdlZWtTdGFydHNPbigiZyIpOworICAgICAgICB0YWcuc2V0TmFtZSgiaCIpOworICAgICAgICB0YWcuc2V0TGFuZ3VhZ2UoImkiKTsKKyAgICAgICAgdGFnLnNldFRlbXBsYXRlQ3NzUGF0aCgiaiIpOworICAgICAgICB0YWcuc2V0VmFsdWVOb3RpZnlUb3BpY3MoImsiKTsKKyAgICAgICAgdGFnLnNldFZhbHVlKCIleycyMDA4LTAzLTAzJ30iKTsKKyAgICAgICAgdGFnLnNldERpc2FibGVkKCJ0cnVlIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShEYXRlVGltZVBpY2tlclRhZ1Rlc3QuY2xhc3MKKyAgICAgICAgICAgIC5nZXRSZXNvdXJjZSgiRGF0ZVRpbWVQaWNrZXJUYWdUZXN0LTIudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUb2RheVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERhdGVUaW1lUGlja2VyVGFnIHRhZyA9IG5ldyBEYXRlVGltZVBpY2tlclRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAKKyAgICAgICAgdGFnLnNldFZhbHVlKCIleyd0b2RheSd9Iik7CisgICAgICAgIGFzc2VydERhdGVWYWx1ZSgibmFtZVZhbHVlIiwgdGFnLCBuZXcgRGF0ZSgpLCB0cnVlLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEYXRlVGltZVBpY2tlclRhZyB0YWcgPSBuZXcgRGF0ZVRpbWVQaWNrZXJUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKworICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5ZRUFSLCAyMDA3KTsKKyAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5KQU5VQVJZKTsKKyAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgMSk7CisgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgMTApOworICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAzMCk7CisgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5TRUNPTkQsIDEwKTsKKyAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAyMCk7CisgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5BTV9QTSwgQ2FsZW5kYXIuQU0pOworICAgICAgICBEYXRlIGRhdGUgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisKKyAgICAgICAgLy90ZXN0ICduYW1lVmFsdWUnCisgICAgICAgIHN0YWNrLnNldCgiZGF0ZSIsICIwMS0wMS0yMDA3Iik7CisgICAgICAgIHRhZy5zZXRWYWx1ZSgiJXtkYXRlfSIpOworICAgICAgICB0YWcuc2V0RGlzcGxheUZvcm1hdCgiTU0tZGQteXl5eSIpOworICAgICAgICBhc3NlcnREYXRlVmFsdWUoIm5hbWVWYWx1ZSIsIHRhZywgZGF0ZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBhc3NlcnREYXRlUHJvcGVydHkoIm5hbWVWYWx1ZSIsIHRhZywgZGF0ZSk7CisgICAgICAgIAorICAgICAgICB0YWcuc2V0RGlzcGxheUZvcm1hdChudWxsKTsKKworICAgICAgICAvL3Rlc3QgJ3N0YXJ0RGF0ZScKKyAgICAgICAgdGFnLnNldFN0YXJ0RGF0ZSgiJXtkYXRlfSIpOworICAgICAgICBhc3NlcnREYXRlUHJvcGVydHkoInN0YXJ0RGF0ZSIsIHRhZywgZGF0ZSk7CisgICAgICAgIAorICAgICAgICAvL3Rlc3QgJ2VuZERhdGUnCisgICAgICAgIHRhZy5zZXRFbmREYXRlKCIle2RhdGV9Iik7CisgICAgICAgIGFzc2VydERhdGVQcm9wZXJ0eSgiZW5kRGF0ZSIsIHRhZywgZGF0ZSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgRGF0ZVRpbWVQaWNrZXJUYWcgdGFnLCBmaW5hbCBEYXRlIGRhdGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBEYXRlRm9ybWF0IHNob3J0VGltZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0VGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQpOworICAgICAgICBmaW5hbCBEYXRlRm9ybWF0IHNob3J0Rm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCk7CisgICAgICAgIGZpbmFsIERhdGVGb3JtYXQgbWVkaXVtRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5NRURJVU0pOworICAgICAgICBmaW5hbCBEYXRlRm9ybWF0IGxvbmdGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkxPTkcpOworICAgICAgICBmaW5hbCBEYXRlRm9ybWF0IGZ1bGxGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpOworICAgICAgICAvL3RyeSBhIERhdGUgdmFsdWUKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgZGF0ZSk7CisgICAgICAgIGFzc2VydERhdGVWYWx1ZShwcm9wZXJ0eSwgdGFnLCBkYXRlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIAorICAgICAgICAvL3RyeSBhIENhbGVuZGFyIHZhbHVlCisgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsZW5kYXIuc2V0VGltZShkYXRlKTsKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgY2FsZW5kYXIpOworICAgICAgICBhc3NlcnREYXRlVmFsdWUocHJvcGVydHksIHRhZywgZGF0ZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAKKyAgICAgICAgLy90cnkgYW4gb2JqZWN0IHdob3NlIHRvIHN0cmluZyByZXR1cm5zIGEgcGFyc2VhYmxlIGRhdGUKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgbmV3IE9iamVjdCgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmdWxsRm9ybWF0LmZvcm1hdChkYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RGF0ZVZhbHVlKHByb3BlcnR5LCB0YWcsIGRhdGUsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIC8vIHRyeSBzaG9ydCBmb3JtYXQgCisgICAgICAgIHN0YWNrLnNldCgiZGF0ZSIsIHNob3J0Rm9ybWF0LmZvcm1hdChkYXRlKSk7CisgICAgICAgIGFzc2VydERhdGVWYWx1ZShwcm9wZXJ0eSwgdGFnLCBkYXRlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy90cnkgbWVkaXVtIGZvcm1hdCAKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgbWVkaXVtRm9ybWF0LmZvcm1hdChkYXRlKSk7CisgICAgICAgIGFzc2VydERhdGVWYWx1ZShwcm9wZXJ0eSwgdGFnLCBkYXRlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy90cnkgbG9uZyBmb3JtYXQgCisgICAgICAgIHN0YWNrLnNldCgiZGF0ZSIsIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgYXNzZXJ0RGF0ZVZhbHVlKHByb3BlcnR5LCB0YWcsIGRhdGUsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvL3RyeSBmdWxsIGZvcm1hdCAKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgZnVsbEZvcm1hdC5mb3JtYXQoZGF0ZSkpOworICAgICAgICBhc3NlcnREYXRlVmFsdWUocHJvcGVydHksIHRhZywgZGF0ZSwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vdHJ5IFJGQyAzMzM5IGZvcm1hdCAKKyAgICAgICAgc3RhY2suc2V0KCJkYXRlIiwgUkZDMzMzOV9GT1JNQVQuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgYXNzZXJ0RGF0ZVZhbHVlKHByb3BlcnR5LCB0YWcsIGRhdGUsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIC8vdHJ5IHNob3J0IHRpbWUgZm9ybWF0IAorICAgICAgICBzdGFjay5zZXQoImRhdGUiLCBzaG9ydFRpbWVGb3JtYXQuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgYXNzZXJ0RGF0ZVZhbHVlKHByb3BlcnR5LCB0YWcsIGRhdGUsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGVWYWx1ZShTdHJpbmcgcHJvcGVydHksIERhdGVUaW1lUGlja2VyVGFnIHRhZywgRGF0ZSB0b0NvbXBhcmVEYXRlLAorICAgICAgICBib29sZWFuIGNvbXBhcmVEYXRlLCBib29sZWFuIGNvbXBhcmVUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgRGF0ZVRpbWVQaWNrZXIgcGlja2VyID0gKERhdGVUaW1lUGlja2VyKSB0YWcuZ2V0Q29tcG9uZW50KCk7CisgICAgICAgIHBpY2tlci5ldmFsdWF0ZVBhcmFtcygpOworCisgICAgICAgIFN0cmluZyBkYXRlU3RyID0gKFN0cmluZykgdGFnLmdldENvbXBvbmVudCgpLmdldFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgLmdldChwcm9wZXJ0eSk7CisgICAgICAgIERhdGUgZGF0ZSA9IFJGQzMzMzlfRk9STUFULnBhcnNlKGRhdGVTdHIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRhdGUpOworICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNhbGVuZGFyLnNldFRpbWUoZGF0ZSk7CisKKyAgICAgICAgQ2FsZW5kYXIgdG9Db21wYXJlQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICB0b0NvbXBhcmVDYWxlbmRhci5zZXRUaW1lKHRvQ29tcGFyZURhdGUpOworCisgICAgICAgIGlmIChjb21wYXJlRGF0ZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRvQ29tcGFyZUNhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKSwgY2FsZW5kYXIKKyAgICAgICAgICAgICAgICAuZ2V0KENhbGVuZGFyLllFQVIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b0NvbXBhcmVDYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpLCBjYWxlbmRhcgorICAgICAgICAgICAgICAgIC5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b0NvbXBhcmVDYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSwgY2FsZW5kYXIKKyAgICAgICAgICAgICAgICAuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21wYXJlVGltZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRvQ29tcGFyZUNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSksIGNhbGVuZGFyCisgICAgICAgICAgICAgICAgLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRvQ29tcGFyZUNhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpLCBjYWxlbmRhcgorICAgICAgICAgICAgICAgIC5nZXQoQ2FsZW5kYXIuTUlOVVRFKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModG9Db21wYXJlQ2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKSwgY2FsZW5kYXIKKyAgICAgICAgICAgICAgICAuZ2V0KENhbGVuZGFyLkFNX1BNKSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0RpdlRlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EaXZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhOTIzMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EaXZUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5UZXN0QWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLmNvbXBvbmVudHMuSGVhZDsKKworCisvKioKKyAqLworcHVibGljIGNsYXNzIERpdlRlc3QgZXh0ZW5kcyBBYnN0cmFjdFVJVGFnVGVzdCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RBY3Rpb24gdGVzdEFjdGlvbiA9IChUZXN0QWN0aW9uKSBhY3Rpb247CisgICAgICAgIHRlc3RBY3Rpb24uc2V0Rm9vKCJiYXIiKTsKKworICAgICAgICBEaXZUYWcgdGFnID0gbmV3IERpdlRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworCisgICAgICAgIHRhZy5zZXRJZCgibXlsYWJlbCIpOworICAgICAgICB0YWcuc2V0SHJlZigiYSIpOworICAgICAgICB0YWcuc2V0TG9hZGluZ1RleHQoImIiKTsKKyAgICAgICAgdGFnLnNldEVycm9yVGV4dCgiYyIpOworICAgICAgICB0YWcuc2V0QXV0b1N0YXJ0KCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXREZWxheSgiNDAwMCIpOworICAgICAgICB0YWcuc2V0VXBkYXRlRnJlcSgiMTAwMCIpOworICAgICAgICB0YWcuc2V0TGlzdGVuVG9waWNzKCJnIik7CisgICAgICAgIHRhZy5zZXRTdGFydFRpbWVyTGlzdGVuVG9waWNzKCJoIik7CisgICAgICAgIHRhZy5zZXRTdG9wVGltZXJMaXN0ZW5Ub3BpY3MoImkiKTsKKyAgICAgICAgdGFnLnNldEJlZm9yZU5vdGlmeVRvcGljcygiaiIpOworICAgICAgICB0YWcuc2V0QWZ0ZXJOb3RpZnlUb3BpY3MoImsiKTsKKyAgICAgICAgdGFnLnNldFJlZnJlc2hPblNob3coInRydWUiKTsKKyAgICAgICAgdGFnLnNldEhhbmRsZXIoImwiKTsKKyAgICAgICAgdGFnLnNldEluZGljYXRvcigibSIpOworICAgICAgICB0YWcuc2V0U2hvd0xvYWRpbmdUZXh0KCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRTZXBhcmF0ZVNjcmlwdHMoImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRFcnJvck5vdGlmeVRvcGljcygibiIpOworICAgICAgICB0YWcuc2V0Q2xvc2FibGUoInRydWUiKTsKKyAgICAgICAgdGFnLnNldEhpZ2hsaWdodENvbG9yKCJvIik7CisgICAgICAgIHRhZy5zZXRIaWdobGlnaHREdXJhdGlvbigicCIpOworICAgICAgICB0YWcuc2V0VHJhbnNwb3J0KCJxIik7CisgICAgICAgIHRhZy5zZXRQYXJzZUNvbnRlbnQoImZhbHNlIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShEaXZUZXN0LmNsYXNzLmdldFJlc291cmNlKCJkaXYtMS50eHQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvSGVhZFRhZ1Rlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9IZWFkVGFnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTljNDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvSGVhZFRhZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworCisvKioKKyAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIEhlYWRUYWd9LgorICogPHAvPgorICogTm90ZTogSWYgdW5pdCB0ZXN0IGZhaWxzIHdpdGggZW5jb2RpbmcgZGlmZmVyZW5jZSBjaGVjayB0aGUgc3JjL3Rlc3Qvc3RydXRzLnByb3BlcnRpZXMKKyAqIGFuZCBhZGp1c3QgdGhlIC50eHQgZmlsZXMgYWNjb3JkaW5nbHkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkVGFnVGVzdCBleHRlbmRzIEFic3RyYWN0VUlUYWdUZXN0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBIZWFkVGFnIHRhZyA9IG5ldyBIZWFkVGFnKCk7CisgICAgICAgIHRhZy5zZXRQYWdlQ29udGV4dChwYWdlQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICB0YWcuc2V0RGVidWcoInRydWUiKTsKKyAgICAgICAgdGFnLnNldENvbXByZXNzZWQoImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRFeHRyYUxvY2FsZXMoImEsYixjIik7CisgICAgICAgIHRhZy5zZXRCYXNlUmVsYXRpdmVQYXRoKCIvcGF0aCIpOworICAgICAgICB0YWcuc2V0TG9jYWxlKCJlcyIpOworICAgICAgICB0YWcuc2V0Q2FjaGUoInRydWUiKTsKKyAgICAgICAgdGFnLnNldFBhcnNlQ29udGVudCgidHJ1ZSIpOworICAgICAgICB0YWcuZG9TdGFydFRhZygpOworICAgICAgICB0YWcuZG9FbmRUYWcoKTsKKworICAgICAgICB2ZXJpZnkoSGVhZFRhZ1Rlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoIkhlYWRUYWdUZXN0LTEudHh0IikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSGVhZFRhZyB0YWcgPSBuZXcgSGVhZFRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAKKyAgICAgICAgdGFnLnNldERlYnVnKCJmYWxzZSIpOworICAgICAgICB0YWcuc2V0Q29tcHJlc3NlZCgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0RXh0cmFMb2NhbGVzKCJhLGIsYyIpOworICAgICAgICB0YWcuc2V0TG9jYWxlKCJlcyIpOworICAgICAgICB0YWcuc2V0Q2FjaGUoImZhbHNlIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShIZWFkVGFnVGVzdC5jbGFzcy5nZXRSZXNvdXJjZSgiSGVhZFRhZ1Rlc3QtMi50eHQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tIdHRwU2VydmxldFJlcXVlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyOWVlMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCitpbXBvcnQgY29tLm1vY2tvYmplY3RzLnNlcnZsZXQuTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFN0cnV0c01vY2tIdHRwU2VydmxldFJlcXVlc3QKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCB7CisKKyAgICBMb2NhbGUgbG9jYWxlID0gTG9jYWxlLlVTOworICAgIHByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhJbmZvID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlTdHJpbmc7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFVSSTsKKyAgICBwcml2YXRlIFN0cmluZyBzY2hlbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyTmFtZTsKKyAgICBwcml2YXRlIGludCBzZXJ2ZXJQb3J0OworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOworICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3REaXNwYXRoZXJTdHJpbmc7CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgcywgT2JqZWN0IG8pIHsKKyAgICAgICAgYXR0cmlidXRlcy5wdXQocywgbyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KHMpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHYuYWRkQWxsKGF0dHJpYnV0ZXMua2V5U2V0KCkpOworCisgICAgICAgIHJldHVybiB2LmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgcykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyTWFwKE1hcCBwYXJhbWV0ZXJNYXApIHsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJNYXAgPSBwYXJhbWV0ZXJNYXA7CisgICAgfQorCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJNYXA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gKFN0cmluZykgcGFyYW1ldGVyTWFwLmdldChzdHJpbmcpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHBhcmFtZXRlck1hcC5rZXlTZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHBhcmFtZXRlck1hcC5nZXQoc3RyaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICByZXR1cm4gcGF0aEluZm87CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7CisgICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcXVlcnlTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0RGlzcGF0aGVyU3RyaW5nID0gc3RyaW5nOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVxdWVzdERpc3BhdGNoZXIoc3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQncyB0aGUgc291cmNlIHN0cmluZyB0aGF0IHdhcyB1c2VkIGluIHRoZSBsYXN0IGdldFJlcXVlc3REaXNwYXRjaGVyIG1ldGhvZCBjYWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdERpc3BhdGhlclN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3REaXNwYXRoZXJTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgcmVxdWVzdFVSSSkgeworICAgICAgICB0aGlzLnJlcXVlc3RVUkkgPSByZXF1ZXN0VVJJOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RVUkk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBzY2hlbWUpIHsKKyAgICAgICAgdGhpcy5zY2hlbWUgPSBzY2hlbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBzY2hlbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgc2VydmVyTmFtZSkgeworICAgICAgICB0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlck5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyUG9ydChpbnQgc2VydmVyUG9ydCkgeworICAgICAgICB0aGlzLnNlcnZlclBvcnQgPSBzZXJ2ZXJQb3J0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlclBvcnQ7CisgICAgfQorCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXNzaW9uID0gc3VwZXIuZ2V0U2Vzc2lvbigpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2Vzc2lvbiA9IG5ldyBTdHJ1dHNNb2NrSHR0cFNlc3Npb24oKTsKKyAgICAgICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR1cEdldENvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR1cEdldFBhdGhJbmZvKFN0cmluZyBwYXRoSW5mbykgeworICAgICAgICB0aGlzLnBhdGhJbmZvID0gcGF0aEluZm87CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3RydXRzTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTgyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3RydXRzTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgY29tLm1vY2tvYmplY3RzLnNlcnZsZXQuTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBTdHJ1dHNNb2NrSHR0cFNlcnZsZXRSZXNwb25zZQorICoKKyAqLworcHVibGljIGNsYXNzIFN0cnV0c01vY2tIdHRwU2VydmxldFJlc3BvbnNlIGV4dGVuZHMgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgeworICAgIHByaXZhdGUgTG9jYWxlIGxvY2FsZTsKKyAgICBwcml2YXRlIFByaW50V3JpdGVyIHdyaXRlcjsKKyAgICBwcml2YXRlIGludCBzdGF0dXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVkaXJlY3RVUkw7CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgICAgfQorCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbnRXcml0ZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHdyaXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFByaW50V3JpdGVyIHdyaXRlcikgeworICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgaSkgeworICAgICAgICB0aGlzLnN0YXR1cyA9IGk7CisgICAgICAgIHN1cGVyLnNldFN0YXR1cyhpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVkaXJlY3RVUkwoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdFVSTDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIHJlZGlyZWN0VVJMKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLnJlZGlyZWN0VVJMID0gcmVkaXJlY3RVUkw7CisgICAgICAgIHN1cGVyLnNlbmRSZWRpcmVjdChyZWRpcmVjdFVSTCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tIdHRwU2Vzc2lvbi5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tIdHRwU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjg2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3RydXRzTW9ja0h0dHBTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGNvbS5tb2Nrb2JqZWN0cy5zZXJ2bGV0Lk1vY2tIdHRwU2Vzc2lvbjsKKworCisvKioKKyAqIFN0cnV0c01vY2tIdHRwU2Vzc2lvbgorICoKKyAqLworcHVibGljIGNsYXNzIFN0cnV0c01vY2tIdHRwU2Vzc2lvbiBleHRlbmRzIE1vY2tIdHRwU2Vzc2lvbiB7CisKKyAgICBIYXNodGFibGUgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBzLCBPYmplY3QgbykgeworICAgICAgICBhdHRyaWJ1dGVzLnB1dChzLCBvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQocyk7CisgICAgfQorCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRBdHRyaWJ1dGUoU3RyaW5nIHMsIE9iamVjdCBvKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkUmVtb3ZlQXR0cmlidXRlKFN0cmluZyBzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgcykgeworICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZShzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXR1cEdldEF0dHJpYnV0ZShTdHJpbmcgcywgT2JqZWN0IG8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dXBHZXRBdHRyaWJ1dGVOYW1lcyhFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3RydXRzTW9ja0pzcFdyaXRlci5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tKc3BXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ0MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tKc3BXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworCisKKy8qKgorICogVW5mb3J1bmF0ZWx5LCB0aGUgTW9ja0pzcFdyaXRlciB0aHJvd3MgYSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB3aGVuIGFueSBvZiB0aGUgV3JpdGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYW5kCisgKiBhcyB5b3UgbWlnaHQgZ3Vlc3MsIFZlbG9jaXR5IHVzZXMgdGhlIFdyaXRlciBtZXRob2RzLiAgSSd2ZWxvY2l0eUVuZ2luZSBzdWJjbGFzc2VkIHRoZSBNb2NrSnNwV3JpdGVyIGZvciB0aGUgdGltZSBiZWluZyBzbworICogdGhhdCB3ZSBjYW4gZG8gdGVzdGluZyBvbiB0aGUgcmVzdWx0cyB1bnRpbCBNb2NrSnNwV3JpdGVyIGdldHMgZnVsbHkgaW1wbGVtZW50ZWQuCisgKiA8cC8+CisgKiB0b2RvIHJlcGxhY2UgdGhpcyBvbmNlIE1vY2tKc3BXcml0ZXIgaW1wbGVtZW50cyBXcml0ZXIgY29ycmVjdGx5IChpLmUuIGRvZXNuJ3QgdGhyb3cgTm90SW1wbGVtZW50RXhjZXB0aW9uKQorICovCitwdWJsaWMgY2xhc3MgU3RydXRzTW9ja0pzcFdyaXRlciBleHRlbmRzIEpzcFdyaXRlciB7CisgICAgU3RyaW5nV3JpdGVyIHdyaXRlcjsKKworICAgIHB1YmxpYyBTdHJ1dHNNb2NrSnNwV3JpdGVyKFN0cmluZ1dyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgc3VwZXIoMTAyNCwgdHJ1ZSk7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5ld0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YoYikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGxvbmcgbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChmbG9hdCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YodikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGRvdWJsZSB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YodikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXJbXSBjaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKGNoYXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KE9iamVjdCBvKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoby50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKCJcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludChiKTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludChjKTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KGkpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KGwpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh2KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZG91YmxlIHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHYpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyW10gY2hhcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KGNoYXJzKTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQobyk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoY2J1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZShzdHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGNidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZShjYnVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUoc3RyLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrUGFnZUNvbnRleHQuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrUGFnZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNhM2YxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tQYWdlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQgY29tLm1vY2tvYmplY3RzLnNlcnZsZXQuTW9ja1BhZ2VDb250ZXh0OworCisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgU3RydXRzTW9ja1BhZ2VDb250ZXh0IGV4dGVuZHMgTW9ja1BhZ2VDb250ZXh0IHsKKworICAgIHByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIHMsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICgocyA9PSBudWxsKSB8fCAobyA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJQYWdlQ29udGV4dCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBhdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHV0KHMsIG8pOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGVzKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHN1cGVyLmdldFNlc3Npb24oKTsKKworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmluZEF0dHJpYnV0ZShTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnJlbW92ZShrZXkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrU2VydmxldENvbnRleHQuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdHJ1dHNNb2NrU2VydmxldENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODExNzlhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1N0cnV0c01vY2tTZXJ2bGV0Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogJElkJAorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuc3RydXRzMi5kb2pvLnZpZXdzLmpzcC51aTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCisKKy8qKgorICogU3RydXRzTW9ja1NlcnZsZXRDb250ZXh0CisgKgorICovCitwdWJsaWMgY2xhc3MgU3RydXRzTW9ja1NlcnZsZXRDb250ZXh0IGltcGxlbWVudHMgU2VydmxldENvbnRleHQgeworCisgICAgU3RyaW5nIHJlYWxQYXRoOworICAgIFN0cmluZyBzZXJ2bGV0SW5mbzsKKyAgICBNYXAgaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIElucHV0U3RyZWFtIHJlc291cmNlQXNTdHJlYW07CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaW5pdFBhcmFtcy5wdXQobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxQYXRoKFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZWFsUGF0aCA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gcmVhbFBhdGg7CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldENvbnRleHQoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0UmVzb3VyY2VQYXRocyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHJlc291cmNlQXNTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQXNTdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VBc1N0cmVhbShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICB0aGlzLnJlc291cmNlQXNTdHJlYW0gPSBpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldE5hbWVkRGlzcGF0Y2hlcihTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KFN0cmluZyBzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2bGV0cygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXROYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlLCBTdHJpbmcgcykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgcywgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gKFN0cmluZykgaW5pdFBhcmFtcy5nZXQocyk7CisgICAgfQorCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGluaXRQYXJhbXMua2V5U2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihhdHRyaWJ1dGVzLmtleVNldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIHMsIE9iamVjdCBvKSB7CisgICAgICAgIGF0dHJpYnV0ZXMucHV0KHMsIG8pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgcykgeworICAgICAgICBhdHRyaWJ1dGVzLnJlbW92ZShzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDb250ZXh0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldEluZm8oU3RyaW5nIHNlcnZsZXRJbmZvKSB7CisgICAgICAgIHRoaXMuc2VydmxldEluZm8gPSBzZXJ2bGV0SW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3VibWl0QWpheFRlc3QuamF2YSBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9TdWJtaXRBamF4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Nzc1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvU3VibWl0QWpheFRlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby5UZXN0QWN0aW9uOworCisvKioKKyAqIFRlc3QgU3VibWl0IGNvbXBvbmVudCBpbiAiYWpheCIgdGhlbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJtaXRBamF4VGVzdCBleHRlbmRzIEFic3RyYWN0VUlUYWdUZXN0IHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VibWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RBY3Rpb24gdGVzdEFjdGlvbiA9IChUZXN0QWN0aW9uKSBhY3Rpb247CisgICAgICAgIHRlc3RBY3Rpb24uc2V0Rm9vKCJiYXIiKTsKKworICAgICAgICBTdWJtaXRUYWcgdGFnID0gbmV3IFN1Ym1pdFRhZygpOworICAgICAgICB0YWcuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworCisgICAgICAgIHRhZy5zZXRJZCgiYSIpOworICAgICAgICB0YWcuc2V0SHJlZigiYiIpOworICAgICAgICB0YWcuc2V0RGlzYWJsZWQoInRydWUiKTsKKyAgICAgICAgdGFnLnNldExvYWRpbmdUZXh0KCJjIik7CisgICAgICAgIHRhZy5zZXRFcnJvclRleHQoImQiKTsKKyAgICAgICAgdGFnLnNldExpc3RlblRvcGljcygiZSIpOworICAgICAgICB0YWcuc2V0QmVmb3JlTm90aWZ5VG9waWNzKCJmIik7CisgICAgICAgIHRhZy5zZXRBZnRlck5vdGlmeVRvcGljcygiZyIpOworICAgICAgICB0YWcuc2V0SGFuZGxlcigiaCIpOworICAgICAgICB0YWcuc2V0VHlwZSgic3VibWl0Iik7CisgICAgICAgIHRhZy5zZXRMYWJlbCgiaSIpOworICAgICAgICB0YWcuc2V0Tm90aWZ5VG9waWNzKCJrIik7CisgICAgICAgIHRhZy5zZXRJbmRpY2F0b3IoImwiKTsKKyAgICAgICAgdGFnLnNldFNob3dMb2FkaW5nVGV4dCgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0RXJyb3JOb3RpZnlUb3BpY3MoIm0iKTsKKyAgICAgICAgdGFnLnNldEhpZ2hsaWdodENvbG9yKCJuIik7CisgICAgICAgIHRhZy5zZXRIaWdobGlnaHREdXJhdGlvbigibyIpOworICAgICAgICB0YWcuc2V0VmFsaWRhdGUoInRydWUiKTsKKyAgICAgICAgdGFnLnNldEFqYXhBZnRlclZhbGlkYXRpb24oInRydWUiKTsKKyAgICAgICAgdGFnLnNldFNlcGFyYXRlU2NyaXB0cygidHJ1ZSIpOworICAgICAgICB0YWcuc2V0VGFiaW5kZXgoIjEiKTsKKyAgICAgICAgdGFnLnNldFRyYW5zcG9ydCgicCIpOworICAgICAgICB0YWcuc2V0UGFyc2VDb250ZW50KCJmYWxzZSIpOworICAgICAgICB0YWcuZG9TdGFydFRhZygpOworICAgICAgICB0YWcuZG9FbmRUYWcoKTsKKworICAgICAgICB2ZXJpZnkoU3VibWl0QWpheFRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoInN1Ym1pdC1hamF4LTEudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdEFjdGlvbiB0ZXN0QWN0aW9uID0gKFRlc3RBY3Rpb24pIGFjdGlvbjsKKyAgICAgICAgdGVzdEFjdGlvbi5zZXRGb28oImJhciIpOworCisgICAgICAgIFN1Ym1pdFRhZyB0YWcgPSBuZXcgU3VibWl0VGFnKCk7CisgICAgICAgIHRhZy5zZXRQYWdlQ29udGV4dChwYWdlQ29udGV4dCk7CisKKyAgICAgICAgdGFnLnNldElkKCJhIik7CisgICAgICAgIHRhZy5zZXREaXNhYmxlZCgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0VGhlbWUoImFqYXgiKTsKKyAgICAgICAgdGFnLnNldEhyZWYoImIiKTsKKyAgICAgICAgdGFnLnNldExvYWRpbmdUZXh0KCJjIik7CisgICAgICAgIHRhZy5zZXRFcnJvclRleHQoImQiKTsKKyAgICAgICAgdGFnLnNldExpc3RlblRvcGljcygiZSIpOworICAgICAgICB0YWcuc2V0QmVmb3JlTm90aWZ5VG9waWNzKCJmIik7CisgICAgICAgIHRhZy5zZXRBZnRlck5vdGlmeVRvcGljcygiZyIpOworICAgICAgICB0YWcuc2V0SGFuZGxlcigiaCIpOworICAgICAgICB0YWcuc2V0VHlwZSgiYnV0dG9uIik7CisgICAgICAgIHRhZy5zZXRMYWJlbCgiaSIpOworICAgICAgICB0YWcuc2V0Tm90aWZ5VG9waWNzKCJrIik7CisgICAgICAgIHRhZy5zZXRJbmRpY2F0b3IoImwiKTsKKyAgICAgICAgdGFnLnNldEVycm9yTm90aWZ5VG9waWNzKCJtIik7CisgICAgICAgIHRhZy5zZXRWYWxpZGF0ZSgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0U2VwYXJhdGVTY3JpcHRzKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRUYWJpbmRleCgiMSIpOworICAgICAgICB0YWcuZG9TdGFydFRhZygpOworICAgICAgICB0YWcuZG9FbmRUYWcoKTsKKworICAgICAgICB2ZXJpZnkoU3VibWl0QWpheFRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoInN1Ym1pdC1hamF4LTIudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbWFnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0QWN0aW9uIHRlc3RBY3Rpb24gPSAoVGVzdEFjdGlvbikgYWN0aW9uOworICAgICAgICB0ZXN0QWN0aW9uLnNldEZvbygiYmFyIik7CisKKyAgICAgICAgU3VibWl0VGFnIHRhZyA9IG5ldyBTdWJtaXRUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKworICAgICAgICB0YWcuc2V0SWQoImEiKTsKKyAgICAgICAgdGFnLnNldERpc2FibGVkKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRUaGVtZSgiYWpheCIpOworICAgICAgICB0YWcuc2V0SHJlZigiYiIpOworICAgICAgICB0YWcuc2V0TG9hZGluZ1RleHQoImMiKTsKKyAgICAgICAgdGFnLnNldEVycm9yVGV4dCgiZCIpOworICAgICAgICB0YWcuc2V0TGlzdGVuVG9waWNzKCJlIik7CisgICAgICAgIHRhZy5zZXRCZWZvcmVOb3RpZnlUb3BpY3MoImYiKTsKKyAgICAgICAgdGFnLnNldEFmdGVyTm90aWZ5VG9waWNzKCJnIik7CisgICAgICAgIHRhZy5zZXRIYW5kbGVyKCJoIik7CisgICAgICAgIHRhZy5zZXRUeXBlKCJpbWFnZSIpOworICAgICAgICB0YWcuc2V0TGFiZWwoImkiKTsKKyAgICAgICAgdGFnLnNldFNyYygiaiIpOworICAgICAgICB0YWcuc2V0Tm90aWZ5VG9waWNzKCJrIik7CisgICAgICAgIHRhZy5zZXRJbmRpY2F0b3IoImwiKTsKKyAgICAgICAgdGFnLnNldEVycm9yTm90aWZ5VG9waWNzKCJtIik7CisgICAgICAgIHRhZy5zZXRWYWxpZGF0ZSgidHJ1ZSIpOworICAgICAgICB0YWcuc2V0U2VwYXJhdGVTY3JpcHRzKCJ0cnVlIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShTdWJtaXRBamF4VGVzdC5jbGFzcy5nZXRSZXNvdXJjZSgic3VibWl0LWFqYXgtMy50eHQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsVGFnVGVzdC5qYXZhIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsVGFnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWY1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVGFiYmVkUGFuZWxUYWdUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnN0cnV0czIuZG9qby52aWV3cy5qc3AudWk7CisKKy8qKgorICogVGFiYmVkUGFuZWxUYWdUZXN0LgorICovCitwdWJsaWMgY2xhc3MgVGFiYmVkUGFuZWxUYWdUZXN0IGV4dGVuZHMgQWJzdHJhY3RVSVRhZ1Rlc3QgeworCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUYWJiZWRQYW5lbFRhZyB0YWcgPSBuZXcgVGFiYmVkUGFuZWxUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgdGFnLnNldElkKCJhIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIHZlcmlmeShUYWJiZWRQYW5lbFRhZy5jbGFzcy5nZXRSZXNvdXJjZSgiVGFiYmVkUGFuZWwtMS50eHQiKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29va2llQ29kZUF2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUYWJiZWRQYW5lbFRhZyB0YWcgPSBuZXcgVGFiYmVkUGFuZWxUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgdGFnLnNldElkKCJmb28iKTsKKyAgICAgICAgdGFnLnNldFVzZVNlbGVjdGVkVGFiQ29va2llKCJ0cnVlIik7CisKKyAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgdGFnLmRvRW5kVGFnKCk7CisKKyAgICAgICAgdmVyaWZ5KFRhYmJlZFBhbmVsVGFnLmNsYXNzLmdldFJlc291cmNlKCJUYWJiZWRQYW5lbC0yLnR4dCIpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVDb2RlQXZhaWxhYmxlV2l0aE92ZXJyaWRkZW5TZWxlY3RlZFRhYigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUYWJiZWRQYW5lbFRhZyB0YWcgPSBuZXcgVGFiYmVkUGFuZWxUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgdGFnLnNldElkKCJmb28iKTsKKyAgICAgICAgdGFnLnNldFVzZVNlbGVjdGVkVGFiQ29va2llKCJ0cnVlIik7CisgICAgICAgIHRhZy5zZXRTZWxlY3RlZFRhYigiYmFyIik7CisKKyAgICAgICAgdGFnLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgdGFnLmRvRW5kVGFnKCk7CisKKyAgICAgICAgdmVyaWZ5KFRhYmJlZFBhbmVsVGFnLmNsYXNzLmdldFJlc291cmNlKCJUYWJiZWRQYW5lbC0zLnR4dCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RyZWVUZXN0LmphdmEgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVHJlZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMxOTZmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RyZWVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAkSWQkCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdHJ1dHMyLmRvam8udmlld3MuanNwLnVpOworCisKK2ltcG9ydCBjb20ub3BlbnN5bXBob255Lnh3b3JrMi5BY3Rpb247CitpbXBvcnQgY29tLm9wZW5zeW1waG9ueS54d29yazIuQWN0aW9uU3VwcG9ydDsKKworLyoqCisgKiBUZXN0IGNhc2UgZm9yIFRyZWUgY29tcG9uZW50LgorICovCitwdWJsaWMgY2xhc3MgVHJlZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFVJVGFnVGVzdHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJvb3QKKyAgICAgICAgVHJlZVRhZyB0YWcgPSBuZXcgVHJlZVRhZygpOworICAgICAgICB0YWcuc2V0U2hvd1Jvb3RHcmlkKCJmYWxzZSIpOworICAgICAgICB0YWcuc2V0U2hvd0dyaWQoImZhbHNlIik7CisgICAgICAgIHRhZy5zZXRUZW1wbGF0ZUNzc1BhdGgoIi9zdHJ1dHMvdHJlZS5jc3MiKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgdGFnLnNldElkKCJyb290SWQiKTsKKyAgICAgICAgdGFnLnNldExhYmVsKCJSb290Iik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisKKyAgICAgICAgICAgIC8vIENoaWxkIDEKKyAgICAgICAgICAgIFRyZWVOb2RlVGFnIG5vZGVUYWcxID0gbmV3IFRyZWVOb2RlVGFnKCk7CisgICAgICAgICAgICBub2RlVGFnMS5zZXRUaGVtZSgiYWpheCIpOworICAgICAgICAgICAgbm9kZVRhZzEuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAgICAgbm9kZVRhZzEuc2V0SWQoImNoaWxkMSIpOworICAgICAgICAgICAgbm9kZVRhZzEuc2V0TGFiZWwoIkNoaWxkIDEiKTsKKyAgICAgICAgICAgIG5vZGVUYWcxLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgICAgIG5vZGVUYWcxLmRvRW5kVGFnKCk7CisKKyAgICAgICAgICAgIC8vIENoaWxkIDIKKyAgICAgICAgICAgIFRyZWVOb2RlVGFnIG5vZGVUYWcyID0gbmV3IFRyZWVOb2RlVGFnKCk7CisgICAgICAgICAgICBub2RlVGFnMi5zZXRUaGVtZSgiYWpheCIpOworICAgICAgICAgICAgbm9kZVRhZzIuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAgICAgbm9kZVRhZzIuc2V0SWQoImNoaWxkMiIpOworICAgICAgICAgICAgbm9kZVRhZzIuc2V0TGFiZWwoIkNoaWxkIDIiKTsKKyAgICAgICAgICAgIG5vZGVUYWcyLmRvU3RhcnRUYWcoKTsKKworICAgICAgICAgICAgICAgIC8vIEdyYW5kIENoaWxkIDEKKyAgICAgICAgICAgICAgICBUcmVlTm9kZVRhZyBnTm9kZVRhZzEgPSBuZXcgVHJlZU5vZGVUYWcoKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzEuc2V0VGhlbWUoImFqYXgiKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzEuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAgICAgICAgIGdOb2RlVGFnMS5zZXRJZCgiZ0NoaWxkMSIpOworICAgICAgICAgICAgICAgIGdOb2RlVGFnMS5zZXRMYWJlbCgiR3JhbmQgQ2hpbGQgMSIpOworICAgICAgICAgICAgICAgIGdOb2RlVGFnMS5kb1N0YXJ0VGFnKCk7CisgICAgICAgICAgICAgICAgZ05vZGVUYWcxLmRvRW5kVGFnKCk7CisKKyAgICAgICAgICAgICAgICAvLyBHcmFuZCBDaGlsZCAyCisgICAgICAgICAgICAgICAgVHJlZU5vZGVUYWcgZ05vZGVUYWcyID0gbmV3IFRyZWVOb2RlVGFnKCk7CisgICAgICAgICAgICAgICAgZ05vZGVUYWcyLnNldFRoZW1lKCJhamF4Iik7CisgICAgICAgICAgICAgICAgZ05vZGVUYWcyLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzIuc2V0SWQoImdDaGlsZDIiKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzIuc2V0TGFiZWwoIkdyYW5kIENoaWxkIDIiKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzIuZG9TdGFydFRhZygpOworICAgICAgICAgICAgICAgIGdOb2RlVGFnMi5kb0VuZFRhZygpOworCisgICAgICAgICAgICAgICAgLy8gR3JhbmQgQ2hpbGQgMworICAgICAgICAgICAgICAgIFRyZWVOb2RlVGFnIGdOb2RlVGFnMz0gbmV3IFRyZWVOb2RlVGFnKCk7CisgICAgICAgICAgICAgICAgZ05vZGVUYWczLnNldFRoZW1lKCJhamF4Iik7CisgICAgICAgICAgICAgICAgZ05vZGVUYWczLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzMuc2V0SWQoImdDaGlsZDMiKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzMuc2V0TGFiZWwoIkdyYW5kIENoaWxkIDMiKTsKKyAgICAgICAgICAgICAgICBnTm9kZVRhZzMuZG9TdGFydFRhZygpOworICAgICAgICAgICAgICAgIGdOb2RlVGFnMy5kb0VuZFRhZygpOworCisgICAgICAgICAgICBub2RlVGFnMi5kb0VuZFRhZygpOworCisKKyAgICAgICAgICAgIC8vIENoaWxkIDMKKyAgICAgICAgICAgIFRyZWVOb2RlVGFnIG5vZGVUYWczID0gbmV3IFRyZWVOb2RlVGFnKCk7CisgICAgICAgICAgICBub2RlVGFnMy5zZXRUaGVtZSgiYWpheCIpOworICAgICAgICAgICAgbm9kZVRhZzMuc2V0UGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworICAgICAgICAgICAgbm9kZVRhZzMuc2V0SWQoImNoaWxkMyIpOworICAgICAgICAgICAgbm9kZVRhZzMuc2V0TGFiZWwoIkNoaWxkIDQiKTsKKyAgICAgICAgICAgIG5vZGVUYWczLmRvU3RhcnRUYWcoKTsKKyAgICAgICAgICAgIG5vZGVUYWczLmRvRW5kVGFnKCk7CisKKyAgICAgICAgdGFnLmRvRW5kVGFnKCk7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4od3JpdGVyLnRvU3RyaW5nKCkpOworICAgICAgICB2ZXJpZnkoVHJlZVRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoInRyZWUtMS50eHQiKSk7CisgICAgfQorCisKKworICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFRyZWVUYWcgdGFnID0gbmV3IFRyZWVUYWcoKTsKKyAgICAgICAgdGFnLnNldFBhZ2VDb250ZXh0KHBhZ2VDb250ZXh0KTsKKyAgICAgICAgdGFnLnNldFRoZW1lKCJhamF4Iik7CisgICAgICAgIHRhZy5zZXRJZCgibXlUcmVlIik7CisgICAgICAgIHRhZy5zZXRSb290Tm9kZSgiJXtteVRyZWVSb290fSIpOworICAgICAgICB0YWcuc2V0Tm9kZUlkUHJvcGVydHkoImlkIik7CisgICAgICAgIHRhZy5zZXROb2RlVGl0bGVQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICB0YWcuc2V0Q2hpbGRDb2xsZWN0aW9uUHJvcGVydHkoImNoaWxkcmVuIik7CisgICAgICAgIHRhZy5kb1N0YXJ0VGFnKCk7CisgICAgICAgIHRhZy5kb0VuZFRhZygpOworCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHdyaXRlci50b1N0cmluZygpKTsKKyAgICAgICAgdmVyaWZ5KFRyZWVUZXN0LmNsYXNzLmdldFJlc291cmNlKCJ0cmVlLTIudHh0IikpOworICAgIH0KKworCisgICAgcHVibGljIEFjdGlvbiBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxBY3Rpb25TdXBwb3J0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEFjdGlvblN1cHBvcnQgZXh0ZW5kcyBBY3Rpb25TdXBwb3J0IHsKKyAgICAgICAgcHVibGljIENhdGVnb3J5IGdldE15VHJlZVJvb3QoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2F0ZWdvcnkuZ2V0QnlJZCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0F1dG9jb21wbGV0ZXItMS50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BdXRvY29tcGxldGVyLTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDFmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9BdXRvY29tcGxldGVyLTEudHh0CkBAIC0wLDAgKzEsMjcgQEAKKzxpbnB1dAorIGRvam9UeXBlPSJzdHJ1dHM6Q29tYm9Cb3giCisgZGF0YVVybD0iYSIKKyBpZD0iZiIKKyBmb3JjZVZhbGlkT3B0aW9uPSJmYWxzZSIKKyBzZWFyY2hUeXBlPSJCIgorIGF1dG9Db21wbGV0ZT0idHJ1ZSIKKyBzZWFyY2hEZWxheT0iMTAwIgorIGRyb3Bkb3duV2lkdGg9IjEwIgorIGRyb3Bkb3duSGVpZ2h0PSIxMCIKKyBuYW1lPSJmIgorIGtleU5hbWU9ImkiCisgaW5pdGlhbFZhbHVlPSJnIgorIGluaXRpYWxLZXk9ImtleSIKKyB2YWx1ZU5vdGlmeVRvcGljcz0ibCIKKyBpbmRpY2F0b3I9ImgiCisgbG9hZE9uVHlwZT0idHJ1ZSIKKyBsb2FkTWluaW11bT0iMyIKKyB2aXNpYmxlRG93bkFycm93PSJmYWxzZSIKKyBidXR0b25TcmM9ImkiCisgdGVtcGxhdGVDc3NQYXRoPSJqIgorIGRhdGFGaWVsZE5hbWU9ImsiCisgc2VhcmNoTGltaXQ9IjIiCisgdHJhbnNwb3J0PSJtIgorIHByZWxvYWQ9InRydWUiCisvPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiZiIpOzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQXV0b2NvbXBsZXRlci0yLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0F1dG9jb21wbGV0ZXItMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNmU1MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0F1dG9jb21wbGV0ZXItMi50eHQKQEAgLTAsMCArMSwyMSBAQAorPHNlbGVjdAorIGRvam9UeXBlPSJzdHJ1dHM6Q29tYm9Cb3giCisgaWQ9ImYiCisgZm9yY2VWYWxpZE9wdGlvbj0iZmFsc2UiCisgc2VhcmNoVHlwZT0iQiIKKyBhdXRvQ29tcGxldGU9InRydWUiCisgc2VhcmNoRGVsYXk9IjEwMCIKKyBkcm9wZG93bldpZHRoPSIxMCIKKyBkcm9wZG93bkhlaWdodD0iMTAiCisgbmFtZT0iZiIKKyBrZXlOYW1lPSJmS2V5IgorIHZhbHVlTm90aWZ5VG9waWNzPSJrIgorIHZpc2libGVEb3duQXJyb3c9InRydWUiCisgYnV0dG9uU3JjPSJpIgorIHRlbXBsYXRlQ3NzUGF0aD0iaiIKKyBzZWFyY2hMaW1pdD0iMiIKKyA+CisgCTxvcHRpb24gdmFsdWU9ImQiPmQ8L29wdGlvbj4KKyAJPG9wdGlvbiB2YWx1ZT0iZSI+ZTwvb3B0aW9uPgorPC9zZWxlY3Q+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJmIik7PC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9CaW5kLTEudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZC0xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVlNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvQmluZC0xLnR4dApAQCAtMCwwICsxLDI5IEBACis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCWRvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCkgeyAKKwkJZG9qby53aWRnZXQuY3JlYXRlV2lkZ2V0KCJzdHJ1dHM6QmluZEV2ZW50IiwgeworCQkJInNvdXJjZXMiOiJuIiwKKwkJCSJldmVudHMiOiJvIiwKKwkJCSJpZCI6ImEiLAorCQkJImhyZWYiOiJiIiwKKwkJCSJsb2FkaW5nVGV4dCI6ImMiLAorCQkJImVycm9yVGV4dCI6ImQiLAorCQkJImxpc3RlblRvcGljcyI6ImUiLCAKKwkJCSJub3RpZnlUb3BpY3MiOiJrIiwKKwkJCSJiZWZvcmVOb3RpZnlUb3BpY3MiOiJmIiwKKwkJCSJhZnRlck5vdGlmeVRvcGljcyI6ImciLAorCQkJImVycm9yTm90aWZ5VG9waWNzIjoibSIsCisJCQkiaW5kaWNhdG9yIjoibCIsCisJCQkic2hvd0Vycm9yIjp0cnVlLAorCQkJInNob3dMb2FkaW5nIjp0cnVlLAorCQkJImhhbmRsZXIiOiJoIiwKKwkJCSJoaWdobGlnaHRDb2xvciI6InAiLAorCQkJImhpZ2hsaWdodER1cmF0aW9uIjpxLAorCQkJInZhbGlkYXRlIjogdHJ1ZSwKKwkJCSJhamF4QWZ0ZXJWYWxpZGF0aW9uIjpmYWxzZSwKKwkJCSJzY3JpcHRTZXBhcmF0aW9uIjogdHJ1ZSwKKwkJCSJ0cmFuc3BvcnQiOiAicSIsCisJCQkicGFyc2VDb250ZW50IiA6IGZhbHNlCisJCX0pOworCX0pOworPC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJhIik7PC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGF0ZVRpbWVQaWNrZXJUYWdUZXN0LTEudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvRGF0ZVRpbWVQaWNrZXJUYWdUZXN0LTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTM5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZ1Rlc3QtMS50eHQKQEAgLTAsMCArMSwxOCBAQAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c0RhdGVQaWNrZXIiIAorICAgICBpZD0iaWQiCisgICAgIHZhbHVlPSIyMDA4LTAzLTAzIgorICAgICBsYW5nPSJpIgorICAgICBuYW1lPSJoIgorICAgICBpbnB1dE5hbWU9ImRvam8uaCIKKyAgICAgZGlzcGxheVdlZWtzPSJ0cnVlIgorICAgICBhZGp1c3RXZWVrcz0idHJ1ZSIKKyAgICAgc3RhcnREYXRlPSIyMDA4LTAyLTAyIgorICAgICBlbmREYXRlPSIyMDA4LTAxLTAxIgorICAgICB3ZWVrU3RhcnRzT249ImciCisgICAgIHN0YXRpY0Rpc3BsYXk9ImZhbHNlIgorICAgICB0ZW1wbGF0ZUNzc1BhdGg9ImoiCisgICAgIHZhbHVlTm90aWZ5VG9waWNzPSJrIgorICAgICBzYXZlRm9ybWF0PSJyZmMiPgorPC9kaXY+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJpZCIpOzwvc2NyaXB0PgorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZ1Rlc3QtMi50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9EYXRlVGltZVBpY2tlclRhZ1Rlc3QtMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMWNkMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0RhdGVUaW1lUGlja2VyVGFnVGVzdC0yLnR4dApAQCAtMCwwICsxLDE5IEBACis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzRGF0ZVBpY2tlciIKKyAgICAgaWQ9ImlkIgorICAgICB2YWx1ZT0iMjAwOC0wMy0wMyIKKyAgICAgbGFuZz0iaSIKKyAgICAgbmFtZT0iaCIKKyAgICAgaW5wdXROYW1lPSJkb2pvLmgiCisgICAgIGRpc3BsYXlXZWVrcz0idHJ1ZSIKKyAgICAgYWRqdXN0V2Vla3M9InRydWUiCisgICAgIHN0YXJ0RGF0ZT0iMjAwOC0wMi0wMiIKKyAgICAgZW5kRGF0ZT0iMjAwOC0wMS0wMSIKKyAgICAgd2Vla1N0YXJ0c09uPSJnIgorICAgICBzdGF0aWNEaXNwbGF5PSJmYWxzZSIKKyAgICAgdGVtcGxhdGVDc3NQYXRoPSJqIgorICAgICB2YWx1ZU5vdGlmeVRvcGljcz0iayIKKyAgICAgZGlzYWJsZWQ9ImRpc2FibGVkIgorICAgICBzYXZlRm9ybWF0PSJyZmMiPgorPC9kaXY+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJpZCIpOzwvc2NyaXB0PgorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9IZWFkVGFnVGVzdC0xLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0hlYWRUYWdUZXN0LTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNThkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9IZWFkVGFnVGVzdC0xLnR4dApAQCAtMCwwICsxLDM3IEBACis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCS8vIERvam8gY29uZmlndXJhdGlvbgorCWRqQ29uZmlnPXsKKwkJaXNEZWJ1ZzogdHJ1ZSwKKwkJYmluZEVuY29kaW5nOiAiSVNPLTg4NTktMSIsCisJCWJhc2VSZWxhdGl2ZVBhdGg6ICIvcGF0aCIsCisJCWJhc2VTY3JpcHRVcmk6ICIvcGF0aCIsCisJCWxvY2FsZTogImVzIiwKKwkJZXh0cmFMb2NhbGU6IFsKKwkJCSJhIiwKKwkJCSJiIiwKKwkJCSJjIgorCQldLAorCQlwYXJzZVdpZGdldHM6IHRydWUKKwkJfTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3BhdGgvc3RydXRzX2Rvam8uanMudW5jb21wcmVzc2VkLmpzIj4KKzwvc2NyaXB0PgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3N0cnV0cy9hamF4L2Rvam9SZXF1aXJlLmpzIj4KKzwvc2NyaXB0PgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzKHRydWUpOworPC9zY3JpcHQ+CisKKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0cnV0cy94aHRtbC9zdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii9zdHJ1dHMvdXRpbHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIvc3RydXRzL3hodG1sL3ZhbGlkYXRpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCJzcmM9Ii9zdHJ1dHMvY3NzX3hodG1sL3ZhbGlkYXRpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9IZWFkVGFnVGVzdC0yLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL0hlYWRUYWdUZXN0LTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDhiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9IZWFkVGFnVGVzdC0yLnR4dApAQCAtMCwwICsxLDMzIEBACis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCS8vIERvam8gY29uZmlndXJhdGlvbgorCWRqQ29uZmlnPXsKKwkJaXNEZWJ1ZzogZmFsc2UsCisJCWJpbmRFbmNvZGluZzogIklTTy04ODU5LTEiLAorCQliYXNlUmVsYXRpdmVQYXRoOiAiL3N0cnV0cy9kb2pvLyIsCisJCWJhc2VTY3JpcHRVcmk6ICIvc3RydXRzL2Rvam8vIiwKKwkJbG9jYWxlOiAiZXMiLAorCQlleHRyYUxvY2FsZTogWworCQkJImEiLAorCQkJImIiLAorCQkJImMiCisJCV0sCisJCXBhcnNlV2lkZ2V0czogZmFsc2UKKwkJfTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3N0cnV0cy9kb2pvL2Rvam8uanMiPgorPC9zY3JpcHQ+CisKKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvc3RydXRzL2FqYXgvZG9qb1JlcXVpcmUuanMiPgorPC9zY3JpcHQ+CisKKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0cnV0cy94aHRtbC9zdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgorCis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii9zdHJ1dHMvdXRpbHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIvc3RydXRzL3hodG1sL3ZhbGlkYXRpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCJzcmM9Ii9zdHJ1dHMvY3NzX3hodG1sL3ZhbGlkYXRpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbC0xLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsLTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjM0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbC0xLnR4dApAQCAtMCwwICsxLDcgQEAKKzxsaW5rcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RydXRzL1RhYmJlZFBhbmVsLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KKzxkaXYKKyAgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUYWJDb250YWluZXIiCisgIGlkPSJhIgorICBkb0xheW91dD0iZmFsc2UiPgorPC9kaXY+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJhIik7PC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbC0yLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsLTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGQzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbC0yLnR4dApAQCAtMCwwICsxLDE4IEBACis8bGlua3JlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0cnV0cy9UYWJiZWRQYW5lbC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Citkb2pvLnJlcXVpcmUoImRvam8uaW8uY29va2llIik7Citkb2pvLmFkZE9uTG9hZChmdW5jdGlvbigpeworICAgIHZhciB0YWJDb250YWluZXI9ZG9qby53aWRnZXQuYnlJZCgiZm9vIik7CisgICAgdmFyIHNlbGVjdGVkVGFiPWRvam8uaW8uY29va2llLmdldENvb2tpZSgiU3RydXRzMlRhYmJlZFBhbmVsX3NlbGVjdGVkVGFiX2ZvbyIpOworICAgIGlmKCBzZWxlY3RlZFRhYiApeworICAgICAgICB0YWJDb250YWluZXIuc2VsZWN0Q2hpbGQoc2VsZWN0ZWRUYWIsdGFiQ29udGFpbmVyLmNvcnJlc3BvbmRpbmdQYWdlQnV0dG9uKTsKKyAgICB9CisgICAgZG9qby5ldmVudC5jb25uZWN0KHRhYkNvbnRhaW5lciwic2VsZWN0Q2hpbGQiLGZ1bmN0aW9uKGV2dCl7CisgICAgICAgIGRvam8uaW8uY29va2llLnNldENvb2tpZSgiU3RydXRzMlRhYmJlZFBhbmVsX3NlbGVjdGVkVGFiX2ZvbyIsZXZ0LndpZGdldElkLDEsbnVsbCxudWxsLG51bGwpOworICAgICAgICB9CisgICAgKQorfSk7Cis8L3NjcmlwdD4KKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUYWJDb250YWluZXIiIGlkPSJmb28iIGRvTGF5b3V0PSJmYWxzZSI+Cis8L2Rpdj4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZGpDb25maWcuc2VhcmNoSWRzLnB1c2goImZvbyIpOzwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsLTMudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVGFiYmVkUGFuZWwtMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiODE0MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL1RhYmJlZFBhbmVsLTMudHh0CkBAIC0wLDAgKzEsMTQgQEAKKzxsaW5rcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RydXRzL1RhYmJlZFBhbmVsLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK2Rvam8ucmVxdWlyZSgiZG9qby5pby5jb29raWUiKTsKK2Rvam8uYWRkT25Mb2FkKGZ1bmN0aW9uKCl7CisgICAgdmFyIHRhYkNvbnRhaW5lcj1kb2pvLndpZGdldC5ieUlkKCJmb28iKTsKKyAgICBkb2pvLmV2ZW50LmNvbm5lY3QodGFiQ29udGFpbmVyLCJzZWxlY3RDaGlsZCIsZnVuY3Rpb24oZXZ0KXsKKyAgICAgICAgZG9qby5pby5jb29raWUuc2V0Q29va2llKCJTdHJ1dHMyVGFiYmVkUGFuZWxfc2VsZWN0ZWRUYWJfZm9vIixldnQud2lkZ2V0SWQsMSxudWxsLG51bGwsbnVsbCk7CisgICAgICAgIH0KKyAgICApCit9KTsKKzwvc2NyaXB0PgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RhYkNvbnRhaW5lciIgaWQ9ImZvbyIgc2VsZWN0ZWRUYWI9ImJhciIgZG9MYXlvdXQ9ImZhbHNlIj4KKzwvZGl2PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiZm9vIik7PC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVGFiYmVkUGFuZWwtNC50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9UYWJiZWRQYW5lbC00LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIxY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvVGFiYmVkUGFuZWwtNC50eHQKQEAgLTAsMCArMSwxMCBAQAorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICBkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LlRhYkNvbnRhaW5lciIpOworICBkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LkxpbmtQYW5lIik7CisgIGRvam8ucmVxdWlyZSgiZG9qby53aWRnZXQuQ29udGVudFBhbmUiKTsKKzwvc2NyaXB0PgorPGRpdgorICAgIGRvam9UeXBlPSJUYWJDb250YWluZXIiCisgICAgbGFiZWxQb3NpdGlvbj0ibGVmdC1oIgorICAgIGRvTGF5b3V0PSJmYWxzZSI+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9kaXYtMS50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9kaXYtMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwY2I1MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL2Rpdi0xLnR4dApAQCAtMCwwICsxLDI4IEBACis8ZGl2CisgIGRvam9UeXBlPSJzdHJ1dHM6QmluZERpdiIKKyAgZGVsYXk9IjQwMDAiCisgIHVwZGF0ZUZyZXE9IjEwMDAiCisgIGF1dG9TdGFydD0idHJ1ZSIKKyAgY2xvc2FibGU9InRydWUiCisgIHN0YXJ0VGltZXJMaXN0ZW5Ub3BpY3M9ImgiCisgIHN0b3BUaW1lckxpc3RlblRvcGljcz0iaSIKKyAgcmVmcmVzaE9uU2hvdz0idHJ1ZSIKKyAgaWQ9Im15bGFiZWwiCisgIGhyZWY9ImEiCisgIGxvYWRpbmdUZXh0PSJiIgorICBlcnJvclRleHQ9ImMiCisgIGxpc3RlblRvcGljcz0iZyIKKyAgYmVmb3JlTm90aWZ5VG9waWNzPSJqIgorICBhZnRlck5vdGlmeVRvcGljcz0iayIKKyAgZXJyb3JOb3RpZnlUb3BpY3M9Im4iCisgIGhhbmRsZXI9ImwiCisgIGluZGljYXRvcj0ibSIKKyAgc2hvd0Vycm9yPSJ0cnVlIgorICBzaG93TG9hZGluZz0idHJ1ZSIKKyAgaGlnaGxpZ2h0Q29sb3I9Im8iCisgIGhpZ2hsaWdodER1cmF0aW9uPSJwIgorICBzY3JpcHRTZXBhcmF0aW9uPSJmYWxzZSIKKyAgdHJhbnNwb3J0PSJxIgorICBwYXJzZUNvbnRlbnQ9ImZhbHNlIj4KKzwvZGl2PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgibXlsYWJlbCIpOzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvaHJlZi0xLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL2hyZWYtMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZmVmMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL2hyZWYtMS50eHQKQEAgLTAsMCArMSwyNSBAQAorPGEKKyBkb2pvVHlwZT0ic3RydXRzOkJpbmRBbmNob3IiCisgdmFsaWRhdGU9InRydWUiCisgYWpheEFmdGVyVmFsaWRhdGlvbj0idHJ1ZSIKKyBpZD0ibXlsaW5rIgorIGhyZWY9ImEiCisgbG9hZGluZ1RleHQ9ImQiCisgZXJyb3JUZXh0PSJjIgorIGxpc3RlblRvcGljcz0iZyIKKyBub3RpZnlUb3BpY3M9ImoiCisgYmVmb3JlTm90aWZ5VG9waWNzPSJlIgorIGFmdGVyTm90aWZ5VG9waWNzPSJmIgorIGVycm9yTm90aWZ5VG9waWNzPSJsIgorIHRhcmdldHM9ImgiCisgaGFuZGxlcj0iaSIKKyBpbmRpY2F0b3I9ImsiCisgc2hvd0Vycm9yPSJ0cnVlIgorIHNob3dMb2FkaW5nPSJ0cnVlIgorIGhpZ2hsaWdodENvbG9yPSJtIgorIGhpZ2hsaWdodER1cmF0aW9uPSJuIgorIHNjcmlwdFNlcGFyYXRpb249InRydWUiCisgdHJhbnNwb3J0PSJvIgorIHBhcnNlQ29udGVudD0iZmFsc2UiPgorPC9hPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgibXlsaW5rIik7PC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9zdWJtaXQtYWpheC0xLnR4dCBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9zdHJ1dHMyL2Rvam8vdmlld3MvanNwL3VpL3N1Ym1pdC1hamF4LTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODYzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9zdWJtaXQtYWpheC0xLnR4dApAQCAtMCwwICsxLDI5IEBACis8aW5wdXQKKyAgdHlwZT0ic3VibWl0IgorICBkb2pvVHlwZT0ic3RydXRzOkJpbmQiCisgIGV2ZW50cz0ib25jbGljayIKKyAgdmFsdWU9IlN1Ym1pdCIKKyAgZGlzYWJsZWQ9ImRpc2FibGVkIgorICB2YWxpZGF0ZT0idHJ1ZSIKKyAgYWpheEFmdGVyVmFsaWRhdGlvbj0idHJ1ZSIKKyAgaWQ9ImEiCisgIHRhYmluZGV4PSIxIgorICBsYWJlbD0iaSIKKyAgaHJlZj0iYiIKKyAgbG9hZGluZ1RleHQ9ImMiCisgIGVycm9yVGV4dD0iZCIKKyAgbGlzdGVuVG9waWNzPSJlIgorICBub3RpZnlUb3BpY3M9ImsiCisgIGJlZm9yZU5vdGlmeVRvcGljcz0iZiIKKyAgYWZ0ZXJOb3RpZnlUb3BpY3M9ImciCisgIGVycm9yTm90aWZ5VG9waWNzPSJtIgorICBoYW5kbGVyPSJoIgorICBpbmRpY2F0b3I9ImwiCisgIHNob3dMb2FkaW5nPSJ0cnVlIgorICBoaWdobGlnaHRDb2xvcj0ibiIKKyAgaGlnaGxpZ2h0RHVyYXRpb249Im8iCisgIHNjcmlwdFNlcGFyYXRpb249InRydWUiCisgIHRyYW5zcG9ydD0icCIKKyAgcGFyc2VDb250ZW50PSJmYWxzZSIKKyAgLz4KKyAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5kakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiYSIpOzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvc3VibWl0LWFqYXgtMi50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9zdWJtaXQtYWpheC0yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzEyYTVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvc3VibWl0LWFqYXgtMi50eHQKQEAgLTAsMCArMSwyMiBAQAorPGlucHV0CisgIHR5cGU9ImJ1dHRvbiIKKyAgZG9qb1R5cGU9InN0cnV0czpCaW5kIgorICBldmVudHM9Im9uY2xpY2siCisgIGlkPSJhIgorICB0YWJpbmRleD0iMSIKKyAgbGFiZWw9ImkiCisgIGhyZWY9ImIiCisgIGxvYWRpbmdUZXh0PSJjIgorICBlcnJvclRleHQ9ImQiCisgIGxpc3RlblRvcGljcz0iZSIKKyAgbm90aWZ5VG9waWNzPSJrIgorICBiZWZvcmVOb3RpZnlUb3BpY3M9ImYiCisgIGFmdGVyTm90aWZ5VG9waWNzPSJnIgorICBlcnJvck5vdGlmeVRvcGljcz0ibSIKKyAgaGFuZGxlcj0iaCIKKyAgaW5kaWNhdG9yPSJsIgorICBzY3JpcHRTZXBhcmF0aW9uPSJ0cnVlIgorICB2YWx1ZT0iaSIKKyAgZGlzYWJsZWQ9ImRpc2FibGVkIgorICAvPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJhIik7PC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvc3VibWl0LWFqYXgtMy50eHQgYi9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS9zdWJtaXQtYWpheC0zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U5MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvc3VibWl0LWFqYXgtMy50eHQKQEAgLTAsMCArMSwyNSBAQAorPGlucHV0CisgIHR5cGU9ImltYWdlIgorICBkb2pvVHlwZT0ic3RydXRzOkJpbmQiCisgIGV2ZW50cz0ib25jbGljayIKKyAgYWx0PSJpIgorICBzcmM9ImoiCisgIHZhbHVlPSJTdWJtaXQiCisgIGRpc2FibGVkPSJkaXNhYmxlZCIKKyAgdmFsaWRhdGU9InRydWUiCisgIGFqYXhBZnRlclZhbGlkYXRpb249ImZhbHNlIgorICBpZD0iYSIKKyAgbGFiZWw9ImkiCisgIGhyZWY9ImIiCisgIGxvYWRpbmdUZXh0PSJjIgorICBlcnJvclRleHQ9ImQiCisgIGxpc3RlblRvcGljcz0iZSIKKyAgbm90aWZ5VG9waWNzPSJrIgorICBiZWZvcmVOb3RpZnlUb3BpY3M9ImYiCisgIGFmdGVyTm90aWZ5VG9waWNzPSJnIgorICBlcnJvck5vdGlmeVRvcGljcz0ibSIKKyAgaGFuZGxlcj0iaCIKKyAgaW5kaWNhdG9yPSJsIgorICBzY3JpcHRTZXBhcmF0aW9uPSJ0cnVlIgorICAvPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJhIik7PC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS90cmVlLTEudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvdHJlZS0xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg4MzBmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvdHJlZS0xLnR4dApAQCAtMCwwICsxLDQ3IEBACis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0KKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuKiIpOworICAgICAgICBkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlIik7CisgICAgICAgIC8vIGRvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzKCk7CisgICAgICAgIC0tPgorIDwvc2NyaXB0PgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWUiICAgCisJCXRlbXBsYXRlQ3NzUGF0aD0iL3N0cnV0cy90cmVlLmNzcyIKKwlzaG93R3JpZD0iZmFsc2UiCisJc2hvd1Jvb3RHcmlkPSJmYWxzZSIKKyAgICBpZD0icm9vdElkIgorICAgIHRvZ2dsZT0iZmFkZSIKKyAgICA+CisgICAgPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iUm9vdCIgaWQ9InJvb3RJZF9yb290IgorICAgID4KKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgCisJICAgIGlkPSJjaGlsZDEiCisgICAgdGl0bGU9IkNoaWxkIDEiPgorPC9kaXY+Cis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIAorCSAgICBpZD0iY2hpbGQyIgorICAgIHRpdGxlPSJDaGlsZCAyIj4KKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgCisJICAgIGlkPSJnQ2hpbGQxIgorICAgIHRpdGxlPSJHcmFuZCBDaGlsZCAxIj4KKzwvZGl2PgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiAKKwkgICAgaWQ9ImdDaGlsZDIiCisgICAgdGl0bGU9IkdyYW5kIENoaWxkIDIiPgorPC9kaXY+Cis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIAorCSAgICBpZD0iZ0NoaWxkMyIKKyAgICB0aXRsZT0iR3JhbmQgQ2hpbGQgMyI+Cis8L2Rpdj4KKzwvZGl2PgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiAKKwkgICAgaWQ9ImNoaWxkMyIKKyAgICB0aXRsZT0iQ2hpbGQgNCI+Cis8L2Rpdj4KKzwvZGl2PjwvZGl2PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgIGRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJ0cmVlU2VsZWN0b3Jfcm9vdElkIik7CisgICBkakNvbmZpZy5zZWFyY2hJZHMucHVzaCgicm9vdElkIik7CisgICBkakNvbmZpZy5zZWFyY2hJZHMucHVzaCgiY2hpbGQxIiwiY2hpbGQxIiwiY2hpbGQyIiwiZ0NoaWxkMSIsImdDaGlsZDEiLCJnQ2hpbGQyIiwiZ0NoaWxkMiIsImdDaGlsZDMiLCJnQ2hpbGQzIiwiY2hpbGQyIiwiY2hpbGQzIiwiY2hpbGQzIik7Cis8L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3N0cnV0czItZG9qby1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvc3RydXRzMi9kb2pvL3ZpZXdzL2pzcC91aS90cmVlLTIudHh0IGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvdHJlZS0yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVhZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL3N0cnV0czIvZG9qby92aWV3cy9qc3AvdWkvdHJlZS0yLnR4dApAQCAtMCwwICsxLDY4IEBACis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0KKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLmxhbmcuKiIpOworICAgICAgICBkb2pvLnJlcXVpcmUoImRvam8ud2lkZ2V0LioiKTsKKyAgICAgICAgZG9qby5yZXF1aXJlKCJkb2pvLndpZGdldC5UcmVlIik7CisgICAgICAgIC8vIGRvam8uaG9zdGVudi53cml0ZUluY2x1ZGVzKCk7CisgICAgICAgIC0tPgorIDwvc2NyaXB0PgorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWUiICAgCisJICAgIGlkPSJteVRyZWUiCisgICAgdG9nZ2xlPSJmYWRlIgorICAgID4KKyAgICAKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IlJvb3QiIGlkPSIxIj4KKyAgICAKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IkphdmEiIGlkPSIyIj4KKyAgICAKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IldlYiBGcmFtZXdvcmtzIiBpZD0iMyI+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJTdHJ1dHMiIGlkPSI0Ij4KKzwvZGl2PgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iU3RyaXBlcyIgaWQ9IjciPgorPC9kaXY+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJSaWZlIiBpZD0iOCI+Cis8L2Rpdj4KKzwvZGl2PgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iUGVyc2lzdGVuY2UiIGlkPSI5Ij4KKyAgICAKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9ImlCYXRpcyIgaWQ9IjEwIj4KKzwvZGl2PgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iSGliZXJuYXRlIiBpZD0iMTEiPgorPC9kaXY+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJKRE8iIGlkPSIxMiI+Cis8L2Rpdj4KKyAgICAKKzxkaXYgZG9qb1R5cGU9InN0cnV0czpTdHJ1dHNUcmVlTm9kZSIgdGl0bGU9IkpEQkMiIGlkPSIxMyI+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJKYXZhU2NyaXB0IiBpZD0iMTQiPgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iRG9qbyIgaWQ9IjE1Ij4KKzwvZGl2PgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iUHJvdG90eXBlIiBpZD0iMTYiPgorPC9kaXY+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJTY3JpcHRhY3Vsb3VzIiBpZD0iMTciPgorPC9kaXY+CisgICAgCis8ZGl2IGRvam9UeXBlPSJzdHJ1dHM6U3RydXRzVHJlZU5vZGUiIHRpdGxlPSJPcGVuUmljbyIgaWQ9IjE4Ij4KKzwvZGl2PgorICAgIAorPGRpdiBkb2pvVHlwZT0ic3RydXRzOlN0cnV0c1RyZWVOb2RlIiB0aXRsZT0iRFdSIiBpZD0iMTkiPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRqQ29uZmlnLnNlYXJjaElkcy5wdXNoKCJ0cmVlU2VsZWN0b3JfbXlUcmVlIik7CisgICAgZGpDb25maWcuc2VhcmNoSWRzLnB1c2goIm15VHJlZSIpOworPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zdHJ1dHMyLWRvam8tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9zdHJ1dHMucHJvcGVydGllcyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc3RydXRzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxOTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvc3RydXRzMi1kb2pvLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvc3RydXRzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzOCBAQAorIworIyAkSWQkCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK3N0cnV0cy5pMThuLmVuY29kaW5nPUlTTy04ODU5LTEKK3N0cnV0cy5sb2NhbGU9ZGVfREUKK3N0cnV0cy5tdWx0aXBhcnQuc2F2ZURpcj1cdGVtcAorc3RydXRzLm11bHRpcGFydC5tYXhTaXplPTEyMzQ1CisKKyMjIyBMb2FkIGN1c3RvbSBwcm9wZXJ0eSBmaWxlcyAoZG9lcyBub3Qgb3ZlcnJpZGUgc3RydXRzLnByb3BlcnRpZXMhKQorc3RydXRzLmN1c3RvbS5wcm9wZXJ0aWVzPXRlc3Qsb3JnL2FwYWNoZS9zdHJ1dHMyL290aGVydGVzdAorCisjIGFkZGVkIHRoZSBNb2NrVGFnIHRvIHRoZSBwYXRoIG9mIFRhZ3MgdGhhdCB0aGUgVGFnRGlyZWN0aXZlIHdpbGwgc2VhcmNoIHRocm91Z2gKK3N0cnV0cy52ZWxvY2l0eS50YWcucGF0aCA9IG9yZy5hcGFjaGUuc3RydXRzMi52aWV3cy52ZWxvY2l0eS51aSwgb3JnLmRpc3BsYXl0YWcudGFncworCitzdHJ1dHMudWkudGVtcGxhdGVEaXIgPSB0ZW1wbGF0ZQorCisjIyMgTG9hZCBjdXN0b20gZGVmYXVsdCByZXNvdXJjZSBidW5kbGVzCitzdHJ1dHMuY3VzdG9tLmkxOG4ucmVzb3VyY2VzPXRlc3RtZXNzYWdlcyx0ZXN0bWVzc2FnZXMyCisKKyMjIyBYU0xUIENhY2hlCitzdHJ1dHMueHNsdC5ub2NhY2hlID0gdHJ1ZQo=